From b090d5898540609a1dd936884ebbb4a4dff52d81 Mon Sep 17 00:00:00 2001 From: NSoiffer Date: Fri, 27 Sep 2024 15:28:30 -0700 Subject: [PATCH 001/162] Initial commit for French braille. 24 test passes, 3 test failures --- Rules/Braille/French/French_Rules.yaml | 937 +++++++++++++++++++++ Rules/Braille/French/definitions.yaml | 2 + Rules/Braille/French/unicode-full.yaml | 1027 ++++++++++++++++++++++++ Rules/Braille/French/unicode.yaml | 317 ++++++++ src/braille.rs | 190 ++++- tests/braille/French/chemistry.rs | 47 ++ tests/braille/French/french.rs | 138 ++++ 7 files changed, 2648 insertions(+), 10 deletions(-) create mode 100644 Rules/Braille/French/French_Rules.yaml create mode 100644 Rules/Braille/French/definitions.yaml create mode 100644 Rules/Braille/French/unicode-full.yaml create mode 100644 Rules/Braille/French/unicode.yaml create mode 100644 tests/braille/French/chemistry.rs create mode 100644 tests/braille/French/french.rs diff --git a/Rules/Braille/French/French_Rules.yaml b/Rules/Braille/French/French_Rules.yaml new file mode 100644 index 000000000..3dad1abe3 --- /dev/null +++ b/Rules/Braille/French/French_Rules.yaml @@ -0,0 +1,937 @@ +--- +- + name: whitespace-omission + 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: "(@class='MathML-unit' or BaseNode(.)[@class='MathML-unit']) and @data-previous-space-width >= 0.25" # BANA 5.3(a) + then: [t: "𝐖"] + - else_if: "@data-previous-space-width > 1.1" + then: [t: "â Ź"] + - else_if: "@data-previous-space-width >= 0.25" # thickspace + then: [t: "W"] + - x: "." + - test: + - if: "(@class='MathML-unit' or BaseNode(.)[@class='MathML-unit']) and @data-following-space-width >= 0.25" # BANA 5.3(a) + then: [t: "𝐖"] + - else_if: "@data-following-space-width > 1.1" + then: [t: "â Ź"] + - else_if: "@data-following-space-width >= 0.25" # thickspace + 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: msqrt + match: "." + replace: + - t: "⠜" + - test: + if: "NeedsToBeGrouped(*[1], 'French', true())" + then: + - t: "â °" + - x: "*[1]" + - t: "⠆" + else: + - x: "*[1]" + +- + name: default + tag: mroot + match: "." + replace: + - t: "⠈" + - test: + if: "NeedsToBeGrouped(*[2], 'French', true())" + then: + - t: "â °" + - x: "*[2]" + - t: "⠆" + else: + - x: "*[2]" + - t: "⠜" + - test: + if: "NeedsToBeGrouped(*[1], 'French', true())" + then: + - t: "â °" + - x: "*[1]" + - t: "⠆" + else: + - x: "*[1]" + + +# Fraction rules + # The fraction part of a mixed number is always simple + # They also differ because a two character sequence is needed to bracket the fraction + # The invisible plus should produce an empty string + +- + name: common-fraction-mixed-number + tag: mfrac + match: + - "preceding-sibling::*[1][self::m:mo][text()='\u2064'] and" # preceding element is invisible plus + - "*[1][self::m:mn][not(contains(., '.'))] and" + - "*[2][self::m:mn][not(contains(., '.'))]" + replace: + - t: "#" # signal end of previous numeric mode + - x: "*[1]" + - t: "N⠌" + - x: "*[2]" + +- + name: default + tag: mfrac + match: "." + replace: + - test: + if: "DEBUG(NeedsToBeGrouped(DEBUG(*[1]), 'French', true()))" + then: + - t: "â °" + - x: "*[1]" + - t: "⠆" + else: + - x: "*[1]" + - t: "⠌" + - test: + if: "NeedsToBeGrouped(*[2], 'French', true())" + then: + - t: "â °" + - x: "*[2]" + - t: "⠆" + else: + - x: "*[2]" + +- + #GTM 14.3.3 (not sure what else vertical juxtaposition applies to) + name: binomial-frac + tag: mrow + match: "IsBracketed(., '(', ')') and *[2][self::m:mfrac][@linethickness=0]" + replace: + - x: "*[1]" + - x: "*[2]/*[1]" + - t: "â °â »" + - x: "*[2]/*[2]" + - 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]" + - x: "*[2]/*[1]/*[1]/*[1]" + - t: "â °â »" + - x: "*[2]/*[2]/*[1]/*[1]" + - x: "*[3]" + +# +# Matrix/Determinant rules +# matrix and determinant are the same other than "matrix"/"determinant" based on the bracketing chars +# we don't do spatial layout, instead the beginning/ending of each row uses the enlarged bracketing chars +- + 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-mtable + tag: mtable + match: "." + replace: [x: "*"] +- + name: default + tag: [mtr, mlabeledtr] + match: "." + replace: + - test: + if: "preceding-sibling::*" + then: [t: "W⠠⠜W"] + - t: "" + - x: $RowStart + + # - test: + # if: .[self::m:mlabeledtr] + # then: + # - t: "⠗⠕â șW⠇⠁⠃⠑⠇⠾⠒" # "row label:" + # - x: "*[1]/*" # contents of row label + - test: + if: .[self::m:mlabeledtr] + then: [x: "*[position()>1]"] + else: {x: "*"} + - x: $RowEnd + + +- + name: empty + tag: mtd + match: ".=''" + replace: + - t: "⠐⠂" + +- + name: default + tag: mtd + match: "." + replace: + - test: + if: "*" + then: + - test: + if: "preceding-sibling::*" + then: [t: "W"] + - x: "*" + # else nothing to braille + +- + name: no-content + tag: math + match: "not(*)" # empty + replace: [t: "W"] # not sure that is right, but this shouldn't happen + +- + name: default + tag: math + match: "." + variables: + - RowStart: "''" # empty string -- it needs to be set + - RowEnd: "''" # empty string -- it needs to be set + - NewScriptContext: "''" # empty string -- it needs to be set + - MatchingWhitespace: "false()" + replace: [x: "*"] + +- + name: empty-mrow + tag: mrow + match: "not(*)" + replace: [t: "W"] # not sure what is correct -- if in a fraction, probably something is better than nothing + +- + # From 14.5, 14.6, and 14.7 -- need to add block indicators around the argument unless it has parens + name: trig-functions + tag: mrow + match: "count(*)=3 and *[2]='\u2061' and + IsInDefinition(BaseNode(*[1]), 'Braille', 'TrigFunctionNames') and not(IsBracketed(*[3], '(', ')'))" + replace: + - x: "*[1]" + - t: "â °" + - x: "*[3]" + - t: "⠆" + + +- + name: default + tag: mrow + match: "." + replace: [x: "*"] + + +- + # operator omission + name: operator-omission + tag: mo + # normally(?) this is an omission, but the case 6'2" causes problems due to WIRIS + # in that case, it doesn't put the ft/in in a superscript and thinks the space is an operator + # canonicalization moves them into with base , so this shouldn't be an omission for that case + match: ".='\u00A0' and @width > 1.1 and + not( preceding-sibling::*[1][self::m:msup and *[2][self::m:mo]] and + following-sibling::*[1][self::m:msup and *[2][self::m:mo]] )" + replace: + - t: "â Ź" # empty space for omission + +- + # "∌" can be a prefix *operator* or an infix comparison -- they have different spacing. We catch the prefix version here + # Note: ASCII "~" has been canonicalized to occur only in a diacritical position + name: prefix-tilde + tag: mo + match: "translate(., '∌', '')='' and not(preceding-sibling::*) and parent::m:mrow" + replace: + - x: "text()" + +- + name: default + tag: mo + # add spaces around comparison operators unless they are in a script position, + variables: # ratio not spaced in UEB; also make sure it is an infix operator (e.g., "~" can be prefix) + - AddSpaces: "$UEB_UseSpacesAroundAllOperators" + match: "." + replace: + - test: + if: "$AddSpaces" + then: + - test: + if: "preceding-sibling::*" + then: [t: "W"] + - x: "text()" + - test: + if: "$AddSpaces and following-sibling::*" + then: [t: "W"] + + +- + name: default + tag: mn + match: "." + replace: + - x: "BrailleChars(., 'French')" +- + name: default + tag: [mi, mtext] + match: "." + replace: + - x: "BrailleChars(., 'French')" + +- + name: default + tag: mstyle + match: "." + replace: + - test: + if: "*" + then: [x: "*"] + # else do nothing -- no content + +- + name: mhchem-hack + # this captures the output for the mhchem's "<=>", "<<=>", and "<=>>" output (there are no Unicode arrows for them) + # this isn't a perfect match, but should be good enough and allows merging all three (see github.com/NSoiffer/MathCAT/issues/60) + tag: mover + match: + - "*[1][substring(., 1, 1)='↜'] and" + - "*[2][substring(., string-length(), 1)='⇀']" + replace: + - t: "W" + - test: + if: "*[1][self::m:mrow]" + then_test: + if: "*[2][self::m:mrow]" + then: [x: "'🣑'"] # 0x1f8d1 -- this is currently unassigned and may get used by UTC at some point (<=>) + else: [x: "'🣓'"] # 0x1f8d3 -- this is currently unassigned and may get used by UTC at some point (<<=>) + else: [x: "'🣒'"] # 0x1f8d2 -- this is currently unassigned and may get used by UTC at some point (<=>>) + - t: "W" + +- + # special hack to catch double over/under bar built from nested mover/munder + name: doubled-line-hack-exception + tag: [mover, munder] + match: + - "*[2][self::m:mo and string-length(.) = 1 and (.='ÂŻ')] and" # has line/bar + - "( (self::m:mover and *[1][self::m:mover]) or (self::m:munder and *[1][self::m:munder]) ) and" # both mover/munder + - "*[1]/*[2][self::m:mo and string-length(.) = 1 and (.='ÂŻ')]" # other mover/munder has line/bar + replace: + - test: + if: "self::m:munder" + then: [t: "â š"] + - t: "⠘⠾⠒" + - test: + if: "NeedsToBeGrouped(*[1], 'French', true())" + then: + - t: "â °" + - x: "*[1]" + - t: "⠆" + else: [x: "*[1]"] + +- + name: single-char-exceptions # GTM 12 + tag: [mover, munder] + match: "*[2][string-length(.) = 1 and translate(., '_¯→.·˙~^⌄⌒','')='']" + replace: + - test: + if: "self::m:munder" + then: [t: "â š"] + - test: + - if: "*[2][text()='_' or text()='ÂŻ']" + then: [t: "⠾⠒"] + - else_if: "*[2][text()='→']" + then: [t: "⠹⠒"] + - else_if: "*[2][text()='.' or text()='·' or text()='˙']" + then: [t: "⠂"] # FIX: couldn't find an example + - else_if: "*[2][text()='~']" + then: [t: "⠐⠾⠒"] + - else_if: "*[2][text()='^']" + then: [t: "⠘⠒"] + - else_if: "*[2][text()='⌄']" + then: [t: "⠾⠘⠒"] + else: [t: "⠈⠒"] # arc/⌒ + # The examples in 12.1 never group the base, but this seems dubious. Needs to be confirmed + # - test: + # if: "NeedsToBeGrouped(*[1], 'French', true())" + # then: + # - t: "â °" + # - x: "*[1]" + # - t: "⠆" + # else: [x: "*[1]"] + - x: "*[1]" + +- + # In French braille, we drop the script indicators in both subscripts and superscripts for: + # msub: chemistry (e.g., H20) + # msup: primes + # We combine them here + name: single-char-exceptions + tag: [msub, msup] + match: "(self::m:msub and @data-chem-formula) or (self::m:msup and *[2][translate(., \"'â€Č″‮\",'')=''])" + replace: + - test: + if: "NeedsToBeGrouped(*[1], 'French', true())" + then: + - t: "â °" + - x: "*[1]" + - t: "⠆" + else: [x: "*[1]"] + - x: "*[2]" + +- + name: default + tag: [msub, msup, munder, mover] + match: "." + variables: [AddSpaces: "(self::m:munder or self::m:mover) and IsInDefinition(BaseNode(*[1]), 'Braille', 'NemethComparisonOperators')"] + replace: + - test: + if: "$AddSpaces" + then: [t: "W"] + - test: + if: "NeedsToBeGrouped(*[1], 'French', self::m:msub or self::m:msup)" + then: + - t: "â °" + - x: "*[1]" + - t: "⠆" + else: [x: "*[1]"] + - with: # this could be tighter and be just around the *[2] part, but this is consistent with msubsup below + variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string + replace: + - test: + - if: "self::m:msup" + then: [t: "⠈"] + - else_if: "self::m:msub" + then: [t: "â ą"] + - else_if: "self::m:munder" + then: [t: "â ąâ ą"] + else: [t: "⠈⠈"] # mover + - test: + if: "NeedsToBeGrouped(*[2], 'French', false())" + then: + - t: "â °" + - x: "*[2]" + - t: "⠆" + else: [x: "*[2]"] + - t: "#" # signal end script/numeric mode + - test: + if: "$AddSpaces" + then: [t: "W"] + + + +- + name: msubsup_default_mmultiscripts_equiv + tag: [msubsup, munderover, mmultiscripts] # mmultiscripts with only sub/sup postscript + match: "count(*)=3" # catches mmultiscripts equiv + variables: [IsPrimeSuperScript: "not(self::m:munderover) and *[3][translate(., \"'â€Č″‮\",'')='']"] + replace: + - test: + if: "NeedsToBeGrouped(*[1], 'French', self::m:msubsup)" + then: + - t: "â °" + - x: "*[1]" + - t: "⠆" + else: [x: "*[1]"] + - test: + if: "$IsPrimeSuperScript" + then: [x: "*[3]"] + - with: + variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string + replace: + - test: + if: "self::m:munderover" + then: [t: "â ąâ ą"] + else: [t: "â ą"] + - test: + if: "NeedsToBeGrouped(*[2], 'French', false())" + then: + - t: "â °" + - x: "*[2]" + - t: "⠆" + else: [x: "*[2]"] + - test: + if: "not($IsPrimeSuperScript)" + then: + - test: + if: "self::m:munderover" + then: [t: "⠈⠈"] + else: [t: "⠈"] + - test: + if: "NeedsToBeGrouped(*[3], 'French', false())" + then: + - t: "â °" + - x: "*[3]" + - t: "⠆" + else: [x: "*[3]"] + + +- +# See 9.5, remark before last example about atomic numbers (they are *after* the base preceded by dot 6) + name: atomic-number + tag: mmultiscripts + match: "count(*)=4 and *[2][self::m:mprescripts] and @data-chem-formula" + replace: + - x: "*[1]" + - test: + if: "not(*[3][self::m:none])" + then: + - with: + variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string + replace: + - t: "â  â ą" + - test: + if: "NeedsToBeGrouped(*[3], 'French', true())" + then: + - t: "â °" + - x: "*[3]" + - t: "⠆" + else: [x: "*[3]"] + - test: + if: "not(*[4][self::m:none])" + then: + - with: + variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string + replace: + - t: "⠠⠈" + - test: + if: "NeedsToBeGrouped(*[4], 'French', false())" + then: + - t: "â °" + - x: "*[4]" + - t: "⠆" + else: [x: "*[4]"] + +- + name: default + tag: mmultiscripts + match: "." + variables: + # computing the number of postscripts is messy because of being optionally present -- we use "mod" to get the count right + - Prescripts: "m:mprescripts/following-sibling::*" + - NumChildren: "count(*)" # need to stash this since the count is wrong inside '*[...]' below + - Postscripts: "*[position()>1 and position() < (last() + ($NumChildren mod 2) -count($Prescripts))]" + replace: + - test: + if: "$Prescripts" + then: + - test: + if: "not($Prescripts[1][self::m:none])" + then: + - with: + variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string + replace: + - t: "â ą" + - test: + if: "NeedsToBeGrouped($Prescripts[1], 'French', true())" + then: + - t: "â °" + - x: "$Prescripts[1]" + - t: "⠆" + else: [x: "$Prescripts[1]"] + - test: + if: "not($Prescripts[2][self::m:none])" + then: + - with: + variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string + replace: + - t: "⠈" + - test: + if: "NeedsToBeGrouped($Prescripts[2], 'French', false())" + then: + - t: "â °" + - x: "$Prescripts[2]" + - t: "⠆" + else: [x: "$Prescripts[2]"] + - test: + if: "count($Prescripts)>2" + then: + - test: + if: "not($Prescripts[3][self::m:none])" + then: + - with: + variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string + replace: + - t: "â ą" + - test: + if: "NeedsToBeGrouped($Prescripts[3], 'French', false())" + then: + - t: "â °" + - x: "$Prescripts[3]" + - t: "⠆" + else: [x: "$Prescripts[3]"] + - test: + if: "not($Prescripts[4][self::m:none])" + then: + - with: + variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string + replace: + - t: "⠈" + - test: + if: "NeedsToBeGrouped($Prescripts[4], 'French', false())" + then: + - t: "â °" + - x: "$Prescripts[4]" + - t: "⠆" + else: [x: "$Prescripts[4]"] + - test: + if: "count($Prescripts) > 4" # give up and just dump them out so at least the content is there + then: [x: "$Prescripts[position() > 4]"] + + - x: "*[1]" + - test: + if: "$Postscripts" + then: + - test: + if: "not($Postscripts[1][self::m:none])" + then: + - with: + variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string + replace: + - t: "â ą" + - test: + if: "NeedsToBeGrouped($Postscripts[1], 'French', false())" + then: + - t: "â °" + - x: "$Postscripts[1]" + - t: "⠆" + else: [x: "$Postscripts[1]"] + - test: + if: "not($Postscripts[2][self::m:none])" + then: + - with: + variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string + replace: + - t: "⠈" + - test: + if: "NeedsToBeGrouped($Postscripts[2], 'French', false())" + then: + - t: "â °" + - x: "$Postscripts[2]" + - t: "⠆" + else: [x: "$Postscripts[2]"] + - test: + if: "count($Postscripts)>2" + then: + - test: + if: "not($Postscripts[3][self::m:none])" + then: + - with: + variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string + replace: + - t: "â ą" + - test: + if: "NeedsToBeGrouped($Postscripts[3], 'French', false())" + then: + - t: "â °" + - x: "$Postscripts[3]" + - t: "⠆" + else: [x: "$Postscripts[3]"] + - test: + if: "not($Postscripts[4][self::m:none])" + then: + - with: + variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string + replace: + - t: "⠈" + - test: + if: "NeedsToBeGrouped($Postscripts[4], 'French', false())" + then: + - t: "â °" + - x: "$Postscripts[4]" + - t: "⠆" + else: [x: "$Postscripts[4]"] + - test: + if: "count($Postscripts)>4" + then: + - test: + if: "not($Postscripts[5][self::m:none])" + then: + - with: + variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string + replace: + - t: "â ą" + - test: + if: "NeedsToBeGrouped($Postscripts[5], 'French', false())" + then: + - t: "â °" + - x: "$Postscripts[5]" + - t: "⠆" + else: [x: "$Postscripts[5]"] + - test: + if: "not($Postscripts[6][self::m:none])" + then: + - with: + variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string + replace: + - t: "⠈" + - test: + if: "NeedsToBeGrouped($Postscripts[6], 'French', false())" + then: + - t: "â °" + - x: "$Postscripts[6]" + - t: "⠆" + else: [x: "$Postscripts[6]"] + - test: + if: "count($Postscripts)>6" + then: + - test: + if: "not($Postscripts[7][self::m:none])" + then: + - with: + variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string + replace: + - t: "â ą" + - test: + if: "NeedsToBeGrouped($Postscripts[7], 'French', false())" + then: + - t: "â °" + - x: "$Postscripts[7]" + - t: "⠆" + else: [x: "$Postscripts[7]"] + - test: + if: "not($Postscripts[8][self::m:none])" + then: + - with: + variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string + replace: + - t: "⠈" + - test: + if: "NeedsToBeGrouped($Postscripts[8], 'French', false())" + then: + - t: "â °" + - x: "$Postscripts[8]" + - t: "⠆" + else: [x: "$Postscripts[8]"] + - test: + if: "count($Postscripts) > 8" # give up and just dump them out so at least the content is there + then: + - x: "$Postscripts[position() > 8]" + - t: "#" # signal end script/numeric mode + + +- + # Note: @notation can contain more than one value + # I don't think UEB has a good way to represent all notations, especially when in combination + # Note: + # Shape indicator: â « + # Physical enclosure: â Ș (think plus inside of a circle) + # Superposition indicator: â Ż (think contour integral) + # Cancellation: ⠈⠱ (line through previous char -- will use for horizontal, vertical, diagonal lines) + # Line over/under: use GTM 12 bar rule (over â ±, under â  â ±) + # Horizontal juxtaposition indicator: â ż + # Vertical juxtaposition indicator: â » (think ≗) + # Termination indicator: â ± + # + # We place left and right outside of other notations + # Boxes and circle are does as physical enclosure (shape before base) + # Arrows are done as superposition (after base) + # top and bottom are done as "bars" (GTM 12) (after base) + + name: default + tag: menclose + match: "." + # FIX: can't find a rule that says anything about comparison operator spacing and enclosure + variables: [AddSpaces: "parent::*[self::m:mrow] and *[1][ self::m:mo and IsInDefinition(., 'Braille', 'NemethComparisonOperators')]"] + replace: + - test: + if: "contains(concat(' ', normalize-space(@notation), ' '), ' left ')" #avoid 'leftarrow' + then: [t: "â ž"] + - test: + if: "contains(@notation,'box')" # box and roundedbox + then: + # - test: + # if: "$AddSpaces" + # then: [t: " "] + - t: "1⠫⠌⠙" # square (no rectangle in UEB) + - test: + if: "contains(@notation,'circle')" + then: + # - test: + # if: "$AddSpaces" + # then: [t: " "] + - t: "1â «â ż" # circle (no oval in UEB) +# ??? What should happen with arrow? +# If there is a box/circle with arrows only and an empty child, +# then it acts like the arrow is the child +# If there are only arrows for 'notation', then maybe rule 112 applies (superposition), +# but the examples aren't similar. In that case, the arrow acts like 'box' and the child is the content... maybe +# +# - test: +# if: "contains(@notation,'leftarrow')" +# then: [t: left arrow, pause: short] +# - test: +# if: "contains(concat(' ', normalize-space(@notation), ' '), ' rightarrow ')" +# then: [t: right arrow, pause: short] +# - test: +# if: "contains(@notation,'northeastarrow')" +# then: [t: northeast arrow, pause: short] +# - test: +# if: "contains(concat(' ', normalize-space(@notation), ' '), ' southeastarrow ')" +# then: [t: southeast arrow, pause: short] +# - test: +# if: "contains(concat(' ', normalize-space(@notation), ' '), ' southwestarrow ')" +# then: [t: southwest arrow, pause: short] +# - test: +# if: "contains(@notation,'northwestarrow')" +# then: [t: northwest arrow, pause: short] +# - test: +# if: "contains(@notation,'updownarrow')" +# then: [t: double ended vertical arrow, pause: short] +# - test: +# if: "contains(@notation,'leftrightarrow')" +# then: [t: double ended horizontal arrow, pause: short] +# - test: +# if: "contains(@notation,'northeastsouthwestarrow')" +# then: [t: double ended up diagonal arrow, pause: short] +# - test: +# if: "contains(@notation,'northwestsoutheastarrow')" +# then: [t: double ended down diagonal arrow, pause: short] +# - test: +# if: ".[contains(@notation,'actuarial')]" +# then: [t: actuarial symbol, pause: short] +# - test: +# if: ".[contains(@notation,'madrub')]" +# then: [t: arabic factorial symbol, pause: short] +# - test: +# if: ".[contains(@notation,'longdiv') or not(@notation) or normalize-space(@notation) ='']" # default +# then: [t: long division symbol, pause: short] +# - test: +# if: ".[contains(@notation,'radical')]" +# then: [t: square root, pause: short] + + - test: + if: "NeedsToBeGrouped(*[1], 'French', false())" + then: + - t: "â °" + - x: "*[1]" + - t: "⠆" + else: [x: "*[1]"] + + # - test: + # if: "contains(@notation,'phasorangle')" #FIX: what should this be??? + # then: [t: "â «â Șâ žâ «"] + - test: + if: "contains(@notation,'arrow')" # all the arrows + then: + - test: + - if: "contains(@notation,'rightarrow')" + then: [t: "1⠳⠕"] + - else_if: "contains(@notation,'leftarrow')" + then: [t: "1â łâ Ș"] + - else_if: "contains(@notation,'uparrow')" + then: [t: "1â łâ Ź "] + - else_if: "contains(@notation,'downarrow')" + then: [t: "1â łâ ©"] + - else_if: "contains(@notation,'northeastarrow')" + then: [t: "1⠳⠎"] + - else_if: "contains(@notation,'southeastarrow')" + then: [t: "1â łâ Ł"] + - else_if: "contains(@notation,'northwestarrow')" + then: [t: "1â łâ ±"] + - else_if: "contains(@notation,'southwestarrow')" + then: [t: "1⠳⠜"] + - else_if: "contains(@notation,'leftrightarrow')" + then: [t: "1â łâ ș⠗⠕"] + - else_if: "contains(@notation,'updownarrow')" + then: [t: "1â łâ ș⠗⠬"] + - else_if: "contains(@notation,'northeastsouthwestarrow')" + then: [t: "1â łâ ș⠗⠎"] + - else_if: "contains(@notation,'northwestsoutheastarrow')" + then: [t: "1â łâ ș⠗⠣"] + - test: + if: "contains(@notation,'top')" + then: [t: "â ±"] + - test: + if: "contains(@notation,'bottom')" + then: [t: "â  â ±"] + - test: + if: "contains(@notation,'updiagonalstrike') or contains(@notation,'downdiagonalstrike') or + contains(@notation,'verticalstrike') or contains(@notation,'horizontalstrike')" + then: + - t: "1⠈⠱" # cancellation + - test: + if: + - "not($AddSpaces) and contains(@notation,'box') or contains(@notation,'circle') or" + - "contains(@notation,'arrow') or contains(@notation,'phasorangle')" + then: + - t: "â »" # terminate shape + # - test: + # if: "$AddSpaces" + # then: [t: " "] + - test: + if: "contains(concat(' ', normalize-space(@notation), ' '), ' right ')" #avoid 'rightarrow' + then: [t: "â ž"] + + + +- + name: default + tag: ms + match: "." + replace: + - test: + if: "string(@lquote)!=''" + then: [x: "@lquote"] + else: [t: "⠄⠄"] + - x: "BrailleChars(., 'French')" + - test: + if: "string(@rquote)!=''" + then: [x: "@rquote"] + else: [t: "⠄⠄"] + +- + name: default + tag: semantics + match: "." + replace: + - x: "*[1]" #/ FIX: should prioritize @encoding="MathML-Presentation" and @encoding="application/mathml-presentation+xml" + +- + name: default-children + tag: "*" + match: "*" # make sure there are children + replace: + - t: "unknown math m l element" + - x: "name(.)" + - x: "*" + +- + # at this point, we know there are no children -- might be no text + name: default-no-children + tag: "*" + match: "text()" + replace: + - t: unknown math m l element + - x: "name(.)" + - x: "text()" + +- + name: default-no-text + tag: "*" + match: "." + replace: + - t: "empty unknown math m l element" + - x: "name(.)" diff --git a/Rules/Braille/French/definitions.yaml b/Rules/Braille/French/definitions.yaml new file mode 100644 index 000000000..4d0c77efb --- /dev/null +++ b/Rules/Braille/French/definitions.yaml @@ -0,0 +1,2 @@ +--- +- include: "../definitions.yaml" diff --git a/Rules/Braille/French/unicode-full.yaml b/Rules/Braille/French/unicode-full.yaml new file mode 100644 index 000000000..91054d0cb --- /dev/null +++ b/Rules/Braille/French/unicode-full.yaml @@ -0,0 +1,1027 @@ +--- + + - "⇌": [t: "â žâ »"] # 0x21CC (Rightwards harpoon over leftwards harpoon (equilibrium)) +# - "â„‚": [t: ""] # 0x2942 (Rightwards arrow above short leftwards arrow (equilibrium, trend to the right)) +# - "â„„": [t: ""] # 0x2944 (Short rightwards arrow above leftwards arrow (equilibrium, trend to the left)) + +# Mappings for some new Unicode chemistry arrows/symbols +# These repeat the short arrow version because that is what is in the spec (GTM 16), but the spec should really use the long version + - "🣑": [t: "â žâ »"] # 0x1F8D1 LONG RIGHTWARDS HARPOON OVER LONG LEFTWARDS HARPOON (equilibrium) +# - "🣒": [t: ""] # 0x1f8d2 LONG RIGHTWARDS HARPOON ABOVE SHORT LEFTWARDS HARPOON(equilibrium, trend to the right) +# - "🣓": [t: ""] # 0x1f8d3 SHORT RIGHTWARDS HARPOON ABOVE LONG LEFTWARDS HARPOON (equilibrium, trend to the left)) + +# - "🣐": [t: ""] # 0x1F8D0 LONG RIGHTWARDS ARROW OVER LONG LEFTWARDS ARROW +# - "🣕": [t: ""] # 0x1F8D5 SHORT LEFTWARDS HARPOON ABOVELONG RIGHTWARDS HARPOON +# - "🣖": [t: ""] # 0x1F8D6 LONG RIGHTWARDS ARROW WITH THROUGH X +# - "🣗": [t: ""] # 0x1F8D7 LONG RIGHTWARDS ARROW WITH DOUBLE SLASH +# - "": [t: ""] # 0x1F8D8 LONG LEFT RIGHT ARROW WITH DEPENDENT LOBE (no clue what to do) + + - "⅐": [t: "â Ąâ Œâ »"] # 0x2150 (vulgar fraction one seventh) + - "⅑": [t: "⠡⠌â Ș"] # 0x2151 (vulgar fraction one ninth) + - "⅓": [t: "â Ąâ Œâ ©"] # 0x2153 (vulgar fraction one third) + - "⅔": [t: "â Łâ Œâ ©"] # 0x2154 (vulgar fraction two thirds) + - "⅕": [t: "â Ąâ Œâ ±"] # 0x2155 (vulgar fraction one fifth) + - "⅖": [t: "â Łâ Œâ ±"] # 0x2156 (vulgar fraction two fifths) + - "⅗": [t: "⠩⠌⠱"] # 0x2157 (vulgar fraction three fifths) + - "⅘": [t: "â č⠌⠱"] # 0x2158 (vulgar fraction four fifths) + - "⅙": [t: "â Ąâ Œâ «"] # 0x2159 (vulgar fraction one sixth) + - "⅚": [t: "⠱⠌⠫"] # 0x215A (vulgar fraction five sixths) + - "⅛": [t: "⠡⠌⠳"] # 0x215B (vulgar fraction one eighth) + - "⅜": [t: "â ©â Œâ ł"] # 0x215C (vulgar fraction three eighths) + - "⅝": [t: "â ±â Œâ ł"] # 0x215D (vulgar fraction five eighths) + - "⅞": [t: "â »â Œâ ł"] # 0x215E (vulgar fraction seven eighths) + - "↉": [t: "⠌⠌⠩"] # 0x2189 (vulgar fraction zero thirds) + + + + - "𝐚": [t: "BL⠁"] # 0x1d41a + - "𝐛": [t: "BL⠃"] # 0x1d41b + - "𝐜": [t: "BL⠉"] # 0x1d41c + - "𝐝": [t: "BL⠙"] # 0x1d41d + - "𝐞": [t: "BL⠑"] # 0x1d41e + - "𝐟": [t: "BL⠋"] # 0x1d41f + - "𝐠": [t: "BL⠛"] # 0x1d420 + - "𝐡": [t: "BL⠓"] # 0x1d421 + - "𝐱": [t: "BL⠊"] # 0x1d422 + - "𝐣": [t: "BL⠚"] # 0x1d423 + - "đ€": [t: "BL⠅"] # 0x1d424 + - "đ„": [t: "BL⠇"] # 0x1d425 + - "𝐩": [t: "BL⠍"] # 0x1d426 + - "𝐧": [t: "BL⠝"] # 0x1d427 + - "𝐹": [t: "BL⠕"] # 0x1d428 + - "đ©": [t: "BL⠏"] # 0x1d429 + - "đȘ": [t: "BL⠟"] # 0x1d42a + - "đ«": [t: "BL⠗"] # 0x1d42b + - "𝐬": [t: "BL⠎"] # 0x1d42c + - "𝐭": [t: "BL⠞"] # 0x1d42d + - "𝐼": [t: "BLâ „"] # 0x1d42e + - "𝐯": [t: "BLâ §"] # 0x1d42f + - "𝐰": [t: "BLâ ș"] # 0x1d430 + - "đ±": [t: "BLâ ­"] # 0x1d431 + - "đČ": [t: "BLâ œ"] # 0x1d432 + - "𝐳": [t: "BLâ ”"] # 0x1d433 + + - "𝐀": [t: "BCL⠁"] # 0x1d400 + - "𝐁": [t: "BCL⠃"] # 0x1d401 + - "𝐂": [t: "BCL⠉"] # 0x1d402 + - "𝐃": [t: "BCL⠙"] # 0x1d403 + - "𝐄": [t: "BCL⠑"] # 0x1d404 + - "𝐅": [t: "BCL⠋"] # 0x1d405 + - "𝐆": [t: "BCL⠛"] # 0x1d406 + - "𝐇": [t: "BCL⠓"] # 0x1d407 + - "𝐈": [t: "BCL⠊"] # 0x1d408 + - "𝐉": [t: "BCL⠚"] # 0x1d409 + - "𝐊": [t: "BCL⠅"] # 0x1d40a + - "𝐋": [t: "BCL⠇"] # 0x1d40b + - "𝐌": [t: "BCL⠍"] # 0x1d40c + - "𝐍": [t: "BCL⠝"] # 0x1d40d + - "𝐎": [t: "BCL⠕"] # 0x1d40e + - "𝐏": [t: "BCL⠏"] # 0x1d40f + - "𝐐": [t: "BCL⠟"] # 0x1d410 + - "𝐑": [t: "BCL⠗"] # 0x1d411 + - "𝐒": [t: "BCL⠎"] # 0x1d412 + - "𝐓": [t: "BCL⠞"] # 0x1d413 + - "𝐔": [t: "BCLâ „"] # 0x1d414 + - "𝐕": [t: "BCLâ §"] # 0x1d415 + - "𝐖": [t: "BCLâ ș"] # 0x1d416 + - "𝐗": [t: "BCLâ ­"] # 0x1d417 + - "𝐘": [t: "BCLâ œ"] # 0x1d418 + - "𝐙": [t: "BCLâ ”"] # 0x1d419 + +# don't mark these as italic + - "𝑎": [t: "L⠁"] # 0x1d44e + - "𝑏": [t: "L⠃"] # 0x1d44f + - "𝑐": [t: "L⠉"] # 0x1d450 + - "𝑑": [t: "L⠙"] # 0x1d451 + - "𝑒": [t: "L⠑"] # 0x1d452 + - "𝑓": [t: "L⠋"] # 0x1d453 + - "𝑔": [t: "L⠛"] # 0x1d454 + - "𝑕": [t: "L⠓"] # 0x1d455 + - "𝑖": [t: "L⠊"] # 0x1d456 + - "𝑗": [t: "L⠚"] # 0x1d457 + - "𝑘": [t: "L⠅"] # 0x1d458 + - "𝑙": [t: "L⠇"] # 0x1d459 + - "𝑚": [t: "L⠍"] # 0x1d45a + - "𝑛": [t: "L⠝"] # 0x1d45b + - "𝑜": [t: "L⠕"] # 0x1d45c + - "𝑝": [t: "L⠏"] # 0x1d45d + - "𝑞": [t: "L⠟"] # 0x1d45e + - "𝑟": [t: "L⠗"] # 0x1d45f + - "𝑠": [t: "L⠎"] # 0x1d460 + - "𝑡": [t: "L⠞"] # 0x1d461 + - "𝑱": [t: "Lâ „"] # 0x1d462 + - "𝑣": [t: "Lâ §"] # 0x1d463 + - "đ‘€": [t: "Lâ ș"] # 0x1d464 + - "đ‘„": [t: "Lâ ­"] # 0x1d465 + - "𝑩": [t: "Lâ œ"] # 0x1d466 + - "𝑧": [t: "Lâ ”"] # 0x1d467 + + - "𝐮": [t: "CL⠁"] # 0x1d434 + - "đ”": [t: "CL⠃"] # 0x1d435 + - "đ¶": [t: "CL⠉"] # 0x1d436 + - "đ·": [t: "CL⠙"] # 0x1d437 + - "𝐾": [t: "CL⠑"] # 0x1d438 + - "đč": [t: "CL⠋"] # 0x1d439 + - "đș": [t: "CL⠛"] # 0x1d43a + - "đ»": [t: "CL⠓"] # 0x1d43b + - "đŒ": [t: "CL⠊"] # 0x1d43c + - "đœ": [t: "CL⠚"] # 0x1d43d + - "đŸ": [t: "CL⠅"] # 0x1d43e + - "𝐿": [t: "CL⠇"] # 0x1d43f + - "𝑀": [t: "CL⠍"] # 0x1d440 + - "𝑁": [t: "CL⠝"] # 0x1d441 + - "𝑂": [t: "CL⠕"] # 0x1d442 + - "𝑃": [t: "CL⠏"] # 0x1d443 + - "𝑄": [t: "CL⠟"] # 0x1d444 + - "𝑅": [t: "CL⠗"] # 0x1d445 + - "𝑆": [t: "CL⠎"] # 0x1d446 + - "𝑇": [t: "CL⠞"] # 0x1d447 + - "𝑈": [t: "CLâ „"] # 0x1d448 + - "𝑉": [t: "CLâ §"] # 0x1d449 + - "𝑊": [t: "CLâ ș"] # 0x1d44a + - "𝑋": [t: "CLâ ­"] # 0x1d44b + - "𝑌": [t: "CLâ œ"] # 0x1d44c + - "𝑍": [t: "CLâ ”"] # 0x1d44d + + - "𝒂": [t: "BIL⠁"] # 0x1d482 + - "𝒃": [t: "BIL⠃"] # 0x1d483 + - "𝒄": [t: "BIL⠉"] # 0x1d484 + - "𝒅": [t: "BIL⠙"] # 0x1d485 + - "𝒆": [t: "BIL⠑"] # 0x1d486 + - "𝒇": [t: "BIL⠋"] # 0x1d487 + - "𝒈": [t: "BIL⠛"] # 0x1d488 + - "𝒉": [t: "BIL⠓"] # 0x1d489 + - "𝒊": [t: "BIL⠊"] # 0x1d48a + - "𝒋": [t: "BIL⠚"] # 0x1d48b + - "𝒌": [t: "BIL⠅"] # 0x1d48c + - "𝒍": [t: "BIL⠇"] # 0x1d48d + - "𝒎": [t: "BIL⠍"] # 0x1d48e + - "𝒏": [t: "BIL⠝"] # 0x1d48f + - "𝒐": [t: "BIL⠕"] # 0x1d490 + - "𝒑": [t: "BIL⠏"] # 0x1d491 + - "𝒒": [t: "BIL⠟"] # 0x1d492 + - "𝒓": [t: "BIL⠗"] # 0x1d493 + - "𝒔": [t: "BIL⠎"] # 0x1d494 + - "𝒕": [t: "BIL⠞"] # 0x1d495 + - "𝒖": [t: "BILâ „"] # 0x1d496 + - "𝒗": [t: "BILâ §"] # 0x1d497 + - "𝒘": [t: "BILâ ș"] # 0x1d498 + - "𝒙": [t: "BILâ ­"] # 0x1d499 + - "𝒚": [t: "BILâ œ"] # 0x1d49a + - "𝒛": [t: "BILâ ”"] # 0x1d49b + + - "𝑹": [t: "BICL⠁"] # 0x1d468 + - "đ‘©": [t: "BICL⠃"] # 0x1d469 + - "đ‘Ș": [t: "BICL⠉"] # 0x1d46a + - "đ‘«": [t: "BICL⠙"] # 0x1d46b + - "𝑬": [t: "BICL⠑"] # 0x1d46c + - "𝑭": [t: "BICL⠋"] # 0x1d46d + - "𝑼": [t: "BICL⠛"] # 0x1d46e + - "𝑯": [t: "BICL⠓"] # 0x1d46f + - "𝑰": [t: "BICL⠊"] # 0x1d470 + - "đ‘±": [t: "BICL⠚"] # 0x1d471 + - "đ‘Č": [t: "BICL⠅"] # 0x1d472 + - "𝑳": [t: "BICL⠇"] # 0x1d473 + - "𝑮": [t: "BICL⠍"] # 0x1d474 + - "đ‘”": [t: "BICL⠝"] # 0x1d475 + - "đ‘¶": [t: "BICL⠕"] # 0x1d476 + - "đ‘·": [t: "BICL⠏"] # 0x1d477 + - "𝑾": [t: "BICL⠟"] # 0x1d478 + - "đ‘č": [t: "BICL⠗"] # 0x1d479 + - "đ‘ș": [t: "BICL⠎"] # 0x1d47a + - "đ‘»": [t: "BICL⠞"] # 0x1d47b + - "đ‘Œ": [t: "BICLâ „"] # 0x1d47c + - "đ‘œ": [t: "BICLâ §"] # 0x1d47d + - "đ‘Ÿ": [t: "BICLâ ș"] # 0x1d47e + - "𝑿": [t: "BICLâ ­"] # 0x1d47f + - "𝒀": [t: "BICLâ œ"] # 0x1d480 + - "𝒁": [t: "BICLâ ”"] # 0x1d481 + + - "đ’¶": [t: "TsL⠁"] # 0x1d4b6 + - "đ’·": [t: "TsL⠃"] # 0x1d4b7 + - "𝒾": [t: "TsL⠉"] # 0x1d4b8 + - "đ’č": [t: "TsL⠙"] # 0x1d4b9 + - "đ’ș": [t: "TsL⠑"] # 0x1d4ba + - "đ’»": [t: "TsL⠋"] # 0x1d4bb + - "đ’Œ": [t: "TsL⠛"] # 0x1d4bc + - "đ’œ": [t: "TsL⠓"] # 0x1d4bd + - "đ’Ÿ": [t: "TsL⠊"] # 0x1d4be + - "𝒿": [t: "TsL⠚"] # 0x1d4bf + - "𝓀": [t: "TsL⠅"] # 0x1d4c0 + - "𝓁": [t: "TsL⠇"] # 0x1d4c1 + - "𝓂": [t: "TsL⠍"] # 0x1d4c2 + - "𝓃": [t: "TsL⠝"] # 0x1d4c3 + - "𝓄": [t: "TsL⠕"] # 0x1d4c4 + - "𝓅": [t: "TsL⠏"] # 0x1d4c5 + - "𝓆": [t: "TsL⠟"] # 0x1d4c6 + - "𝓇": [t: "TsL⠗"] # 0x1d4c7 + - "𝓈": [t: "TsL⠎"] # 0x1d4c8 + - "𝓉": [t: "TsL⠞"] # 0x1d4c9 + - "𝓊": [t: "TsLâ „"] # 0x1d4ca + - "𝓋": [t: "TsLâ §"] # 0x1d4cb + - "𝓌": [t: "TsLâ ș"] # 0x1d4cc + - "𝓍": [t: "TsLâ ­"] # 0x1d4cd + - "𝓎": [t: "TsLâ œ"] # 0x1d4ce + - "𝓏": [t: "TsLâ ”"] # 0x1d4cf + + - "𝒜": [t: "TsCL⠁"] # 0x1d49c + - "𝒝": [t: "TsCL⠃"] # 0x1d49d + - "𝒞": [t: "TsCL⠉"] # 0x1d49e + - "𝒟": [t: "TsCL⠙"] # 0x1d49f + - "𝒠": [t: "TsCL⠑"] # 0x1d4a0 + - "𝒡": [t: "TsCL⠋"] # 0x1d4a1 + - "𝒱": [t: "TsCL⠛"] # 0x1d4a2 + - "𝒣": [t: "TsCL⠓"] # 0x1d4a3 + - "đ’€": [t: "TsCL⠊"] # 0x1d4a4 + - "đ’„": [t: "TsCL⠚"] # 0x1d4a5 + - "𝒩": [t: "TsCL⠅"] # 0x1d4a6 + - "𝒧": [t: "TsCL⠇"] # 0x1d4a7 + - "𝒹": [t: "TsCL⠍"] # 0x1d4a8 + - "đ’©": [t: "TsCL⠝"] # 0x1d4a9 + - "đ’Ș": [t: "TsCL⠕"] # 0x1d4aa + - "đ’«": [t: "TsCL⠏"] # 0x1d4ab + - "𝒬": [t: "TsCL⠟"] # 0x1d4ac + - "𝒭": [t: "TsCL⠗"] # 0x1d4ad + - "𝒼": [t: "TsCL⠎"] # 0x1d4ae + - "𝒯": [t: "TsCL⠞"] # 0x1d4af + - "𝒰": [t: "TsCLâ „"] # 0x1d4b0 + - "đ’±": [t: "TsCLâ §"] # 0x1d4b1 + - "đ’Č": [t: "TsCLâ ș"] # 0x1d4b2 + - "𝒳": [t: "TsCLâ ­"] # 0x1d4b3 + - "𝒮": [t: "TsCLâ œ"] # 0x1d4b4 + - "đ’”": [t: "TsCLâ ”"] # 0x1d4b5 + + - "ℊ": [t: "TL⠛⠁"] # 0x210a (Script Small G) + - "ℋ": [t: "TCL⠓⠁"] # 0x210b (Script Capital H) + - "ℒ": [t: "TCL⠇"] # 0x2113 (Script Capital L) + - "ℓ": [t: "TL⠇"] # 0x2113 (Script Small L) + - "℘": [t: "TCL⠏"] # 0x2118 (Script Capital P) + - "ℛ": [t: "TCL⠗"] # 0x211B (Script Capital R) + - "ℯ": [t: "TL⠑"] # 0x212F (Script Small E) + - "ℰ": [t: "TCL⠑"] # 0x2130 (Script Capital E) + - "ℱ": [t: "TCL⠋"] # 0x2131 (Script Capital F) + - "ℳ": [t: "TCL⠍"] # 0x2133 (Script Capital M) + - "℮": [t: "TL⠕"] # 0x21334 (Script Small O) + - "đ“Ș": [t: "BTsL⠁"] # 0x1d4ea + - "đ“«": [t: "BTsL⠃"] # 0x1d4eb + - "𝓬": [t: "BTsL⠉"] # 0x1d4ec + - "𝓭": [t: "BTsL⠙"] # 0x1d4ed + - "𝓼": [t: "BTsL⠑"] # 0x1d4ee + - "𝓯": [t: "BTsL⠋"] # 0x1d4ef + - "𝓰": [t: "BTsL⠛"] # 0x1d4f0 + - "đ“±": [t: "BTsL⠓"] # 0x1d4f1 + - "đ“Č": [t: "BTsL⠊"] # 0x1d4f2 + - "𝓳": [t: "BTsL⠚"] # 0x1d4f3 + - "𝓮": [t: "BTsL⠅"] # 0x1d4f4 + - "đ“”": [t: "BTsL⠇"] # 0x1d4f5 + - "đ“¶": [t: "BTsL⠍"] # 0x1d4f6 + - "đ“·": [t: "BTsL⠝"] # 0x1d4f7 + - "𝓾": [t: "BTsL⠕"] # 0x1d4f8 + - "đ“č": [t: "BTsL⠏"] # 0x1d4f9 + - "đ“ș": [t: "BTsL⠟"] # 0x1d4fa + - "đ“»": [t: "BTsL⠗"] # 0x1d4fb + - "đ“Œ": [t: "BTsL⠎"] # 0x1d4fc + - "đ“œ": [t: "BTsL⠞"] # 0x1d4fd + - "đ“Ÿ": [t: "BTsLâ „"] # 0x1d4fe + - "𝓿": [t: "BTsLâ §"] # 0x1d4ff + - "𝔀": [t: "BTsLâ ș"] # 0x1d500 + - "𝔁": [t: "BTsLâ ­"] # 0x1d501 + - "𝔂": [t: "BTsLâ œ"] # 0x1d502 + - "𝔃": [t: "BTsLâ ”"] # 0x1d503 + + - "𝓐": [t: "BTsCL⠁"] # 0x1d4d0 + - "𝓑": [t: "BTsCL⠃"] # 0x1d4d1 + - "𝓒": [t: "BTsCL⠉"] # 0x1d4d2 + - "𝓓": [t: "BTsCL⠙"] # 0x1d4d3 + - "𝓔": [t: "BTsCL⠑"] # 0x1d4d4 + - "𝓕": [t: "BTsCL⠋"] # 0x1d4d5 + - "𝓖": [t: "BTsCL⠛"] # 0x1d4d6 + - "𝓗": [t: "BTsCL⠓"] # 0x1d4d7 + - "𝓘": [t: "BTsCL⠊"] # 0x1d4d8 + - "𝓙": [t: "BTsCL⠚"] # 0x1d4d9 + - "𝓚": [t: "BTsCL⠅"] # 0x1d4da + - "𝓛": [t: "BTsCL⠇"] # 0x1d4db + - "𝓜": [t: "BTsCL⠍"] # 0x1d4dc + - "𝓝": [t: "BTsCL⠝"] # 0x1d4dd + - "𝓞": [t: "BTsCL⠕"] # 0x1d4de + - "𝓟": [t: "BTsCL⠏"] # 0x1d4df + - "𝓠": [t: "BTsCL⠟"] # 0x1d4e0 + - "𝓡": [t: "BTsCL⠗"] # 0x1d4e1 + - "𝓱": [t: "BTsCL⠎"] # 0x1d4e2 + - "𝓣": [t: "BTsCL⠞"] # 0x1d4e3 + - "đ“€": [t: "BTsCLâ „"] # 0x1d4e4 + - "đ“„": [t: "BTsCLâ §"] # 0x1d4e5 + - "𝓩": [t: "BTsCLâ ș"] # 0x1d4e6 + - "𝓧": [t: "BTsCLâ ­"] # 0x1d4e7 + - "𝓹": [t: "BTsCLâ œ"] # 0x1d4e8 + - "đ“©": [t: "BTsCLâ ”"] # 0x1d4e9 + + - "𝔞": [t: "DL⠁"] # 0x1d51e + - "𝔟": [t: "DL⠃"] # 0x1d51f + - "𝔠": [t: "DL⠉"] # 0x1d520 + - "𝔡": [t: "DL⠙"] # 0x1d521 + - "𝔱": [t: "DL⠑"] # 0x1d522 + - "𝔣": [t: "DL⠋"] # 0x1d523 + - "đ”€": [t: "DL⠛"] # 0x1d524 + - "đ”„": [t: "DL⠓"] # 0x1d525 + - "𝔩": [t: "DL⠊"] # 0x1d526 + - "𝔧": [t: "DL⠚"] # 0x1d527 + - "𝔹": [t: "DL⠅"] # 0x1d528 + - "đ”©": [t: "DL⠇"] # 0x1d529 + - "đ”Ș": [t: "DL⠍"] # 0x1d52a + - "đ”«": [t: "DL⠝"] # 0x1d52b + - "𝔬": [t: "DL⠕"] # 0x1d52c + - "𝔭": [t: "DL⠏"] # 0x1d52d + - "𝔼": [t: "DL⠟"] # 0x1d52e + - "𝔯": [t: "DL⠗"] # 0x1d52f + - "𝔰": [t: "DL⠎"] # 0x1d530 + - "đ”±": [t: "DL⠞"] # 0x1d531 + - "đ”Č": [t: "DLâ „"] # 0x1d532 + - "𝔳": [t: "DLâ §"] # 0x1d533 + - "𝔮": [t: "DLâ ș"] # 0x1d534 + - "đ””": [t: "DLâ ­"] # 0x1d535 + - "đ”¶": [t: "DLâ œ"] # 0x1d536 + - "đ”·": [t: "DLâ ”"] # 0x1d537 + + - "𝔄": [t: "DCL⠁"] # 0x1d504 + - "𝔅": [t: "DCL⠃"] # 0x1d505 + - "𝔆": [t: "DCL⠉"] # 0x1d506 + - "𝔇": [t: "DCL⠙"] # 0x1d507 + - "𝔈": [t: "DCL⠑"] # 0x1d508 + - "𝔉": [t: "DCL⠋"] # 0x1d509 + - "𝔊": [t: "DCL⠛"] # 0x1d50a + - "𝔋": [t: "DCL⠓"] # 0x1d50b + - "𝔌": [t: "DCL⠊"] # 0x1d50c + - "𝔍": [t: "DCL⠚"] # 0x1d50d + - "𝔎": [t: "DCL⠅"] # 0x1d50e + - "𝔏": [t: "DCL⠇"] # 0x1d50f + - "𝔐": [t: "DCL⠍"] # 0x1d510 + - "𝔑": [t: "DCL⠝"] # 0x1d511 + - "𝔒": [t: "DCL⠕"] # 0x1d512 + - "𝔓": [t: "DCL⠏"] # 0x1d513 + - "𝔔": [t: "DCL⠟"] # 0x1d514 + - "𝔕": [t: "DCL⠗"] # 0x1d515 + - "𝔖": [t: "DCL⠎"] # 0x1d516 + - "𝔗": [t: "DCL⠞"] # 0x1d517 + - "𝔘": [t: "DCLâ „"] # 0x1d518 + - "𝔙": [t: "DCLâ §"] # 0x1d519 + - "𝔚": [t: "DCLâ ș"] # 0x1d51a + - "𝔛": [t: "DCLâ ­"] # 0x1d51b + - "𝔜": [t: "DCLâ œ"] # 0x1d51c + - "𝔝": [t: "DCLâ ”"] # 0x1d51d + + - "ℌ": [t: "DCL⠓"] # 0x210C (Fraktur Capital H) + - "ℑ": [t: "DCL⠊"] # 0x2111 (Fraktur Capital I) + - "ℜ": [t: "DCL⠗"] # 0x211C (Fraktur Capital R) + - "ℹ": [t: "DCLâ ”"] # 0x2128 (Fraktur Capital Z) + - "ℭ": [t: "DCL⠉"] # 0x22DC (Fraktur Capital C) + - "𝕒": [t: "đ”čL⠁"] # 0x1d552 + - "𝕓": [t: "đ”čL⠃"] # 0x1d553 + - "𝕔": [t: "đ”čL⠉"] # 0x1d554 + - "𝕕": [t: "đ”čL⠙"] # 0x1d555 + - "𝕖": [t: "đ”čL⠑"] # 0x1d556 + - "𝕗": [t: "đ”čL⠋"] # 0x1d557 + - "𝕘": [t: "đ”čL⠛"] # 0x1d558 + - "𝕙": [t: "đ”čL⠓"] # 0x1d559 + - "𝕚": [t: "đ”čL⠊"] # 0x1d55a + - "𝕛": [t: "đ”čL⠚"] # 0x1d55b + - "𝕜": [t: "đ”čL⠅"] # 0x1d55c + - "𝕝": [t: "đ”čL⠇"] # 0x1d55d + - "𝕞": [t: "đ”čL⠍"] # 0x1d55e + - "𝕟": [t: "đ”čL⠝"] # 0x1d55f + - "𝕠": [t: "đ”čL⠕"] # 0x1d560 + - "𝕡": [t: "đ”čL⠏"] # 0x1d561 + - "𝕱": [t: "đ”čL⠟"] # 0x1d562 + - "𝕣": [t: "đ”čL⠗"] # 0x1d563 + - "đ•€": [t: "đ”čL⠎"] # 0x1d564 + - "đ•„": [t: "đ”čL⠞"] # 0x1d565 + - "𝕩": [t: "đ”čLâ „"] # 0x1d566 + - "𝕧": [t: "đ”čLâ §"] # 0x1d567 + - "𝕹": [t: "đ”čLâ ș"] # 0x1d568 + - "đ•©": [t: "đ”čLâ ­"] # 0x1d569 + - "đ•Ș": [t: "đ”čLâ œ"] # 0x1d56a + - "đ•«": [t: "đ”čLâ ”"] # 0x1d56b + + - "𝔾": [t: "đ”čCL⠁"] # 0x1d538 + - "đ”č": [t: "đ”čCL⠃"] # 0x1d539 + - "ℂ": [t: "đ”čCL⠉"] # 0x2102 + - "đ”»": [t: "đ”čCL⠙"] # 0x1d53b + - "đ”Œ": [t: "đ”čCL⠑"] # 0x1d53c + - "đ”œ": [t: "đ”čCL⠋"] # 0x1d53d + - "đ”Ÿ": [t: "đ”čCL⠛"] # 0x1d53e + - "ℍ": [t: "đ”čCL⠓"] # 0x210d + - "𝕀": [t: "đ”čCL⠊"] # 0x1d540 + - "𝕁": [t: "đ”čCL⠚"] # 0x1d541 + - "𝕂": [t: "đ”čCL⠅"] # 0x1d542 + - "𝕃": [t: "đ”čCL⠇"] # 0x1d543 + - "𝕄": [t: "đ”čCL⠍"] # 0x1d544 + - "ℕ": [t: "đ”čCL⠝"] # 0x2115 + - "𝕆": [t: "đ”čCL⠕"] # 0x1d546 + - "ℙ": [t: "đ”čCL⠏"] # 0x2119 + - "ℚ": [t: "đ”čCL⠟"] # 0x211a + - "ℝ": [t: "đ”čCL⠗"] # 0x211d + - "𝕊": [t: "đ”čCL⠎"] # 0x1d54a + - "𝕋": [t: "đ”čCL⠞"] # 0x1d54b + - "𝕌": [t: "đ”čCLâ „"] # 0x1d54c + - "𝕍": [t: "đ”čCLâ §"] # 0x1d54d + - "𝕎": [t: "đ”čCLâ ș"] # 0x1d54e + - "𝕏": [t: "đ”čCLâ ­"] # 0x1d54f + - "𝕐": [t: "đ”čCLâ œ"] # 0x1d550 + - "â„€": [t: "đ”čCLâ ”"] # 0x2124 + - "𝖆": [t: "BDL⠁"] # 0x1d586 + - "𝖇": [t: "BDL⠃"] # 0x1d587 + - "𝖈": [t: "BDL⠉"] # 0x1d588 + - "𝖉": [t: "BDL⠙"] # 0x1d589 + - "𝖊": [t: "BDL⠑"] # 0x1d58a + - "𝖋": [t: "BDL⠋"] # 0x1d58b + - "𝖌": [t: "BDL⠛"] # 0x1d58c + - "𝖍": [t: "BDL⠓"] # 0x1d58d + - "𝖎": [t: "BDL⠊"] # 0x1d58e + - "𝖏": [t: "BDL⠚"] # 0x1d58f + - "𝖐": [t: "BDL⠅"] # 0x1d590 + - "𝖑": [t: "BDL⠇"] # 0x1d591 + - "𝖒": [t: "BDL⠍"] # 0x1d592 + - "𝖓": [t: "BDL⠝"] # 0x1d593 + - "𝖔": [t: "BDL⠕"] # 0x1d594 + - "𝖕": [t: "BDL⠏"] # 0x1d595 + - "𝖖": [t: "BDL⠟"] # 0x1d596 + - "𝖗": [t: "BDL⠗"] # 0x1d597 + - "𝖘": [t: "BDL⠎"] # 0x1d598 + - "𝖙": [t: "BDL⠞"] # 0x1d599 + - "𝖚": [t: "BDLâ „"] # 0x1d59a + - "𝖛": [t: "BDLâ §"] # 0x1d59b + - "𝖜": [t: "BDLâ ș"] # 0x1d59c + - "𝖝": [t: "BDLâ ­"] # 0x1d59d + - "𝖞": [t: "BDLâ œ"] # 0x1d59e + - "𝖟": [t: "BDLâ ”"] # 0x1d59f + + - "𝕬": [t: "BDCL⠁"] # 0x1d56c + - "𝕭": [t: "BDCL⠃"] # 0x1d56d + - "𝕼": [t: "BDCL⠉"] # 0x1d56e + - "𝕯": [t: "BDCL⠙"] # 0x1d56f + - "𝕰": [t: "BDCL⠑"] # 0x1d570 + - "đ•±": [t: "BDCL⠋"] # 0x1d571 + - "đ•Č": [t: "BDCL⠛"] # 0x1d572 + - "𝕳": [t: "BDCL⠓"] # 0x1d573 + - "𝕮": [t: "BDCL⠊"] # 0x1d574 + - "đ•”": [t: "BDCL⠚"] # 0x1d575 + - "đ•¶": [t: "BDCL⠅"] # 0x1d576 + - "đ•·": [t: "BDCL⠇"] # 0x1d577 + - "𝕾": [t: "BDCL⠍"] # 0x1d578 + - "đ•č": [t: "BDCL⠝"] # 0x1d579 + - "đ•ș": [t: "BDCL⠕"] # 0x1d57a + - "đ•»": [t: "BDCL⠏"] # 0x1d57b + - "đ•Œ": [t: "BDCL⠟"] # 0x1d57c + - "đ•œ": [t: "BDCL⠗"] # 0x1d57d + - "đ•Ÿ": [t: "BDCL⠎"] # 0x1d57e + - "𝕿": [t: "BDCL⠞"] # 0x1d57f + - "𝖀": [t: "BDCLâ „"] # 0x1d580 + - "𝖁": [t: "BDCLâ §"] # 0x1d581 + - "𝖂": [t: "BDCLâ ș"] # 0x1d582 + - "𝖃": [t: "BDCLâ ­"] # 0x1d583 + - "𝖄": [t: "BDCLâ œ"] # 0x1d584 + - "𝖅": [t: "BDCLâ ”"] # 0x1d585 + + - "đ–ș": [t: "SL⠁"] # 0x1d5ba + - "đ–»": [t: "SL⠃"] # 0x1d5bb + - "đ–Œ": [t: "SL⠉"] # 0x1d5bc + - "đ–œ": [t: "SL⠙"] # 0x1d5bd + - "đ–Ÿ": [t: "SL⠑"] # 0x1d5be + - "𝖿": [t: "SL⠋"] # 0x1d5bf + - "𝗀": [t: "SL⠛"] # 0x1d5c0 + - "𝗁": [t: "SL⠓"] # 0x1d5c1 + - "𝗂": [t: "SL⠊"] # 0x1d5c2 + - "𝗃": [t: "SL⠚"] # 0x1d5c3 + - "𝗄": [t: "SL⠅"] # 0x1d5c4 + - "𝗅": [t: "SL⠇"] # 0x1d5c5 + - "𝗆": [t: "SL⠍"] # 0x1d5c6 + - "𝗇": [t: "SL⠝"] # 0x1d5c7 + - "𝗈": [t: "SL⠕"] # 0x1d5c8 + - "𝗉": [t: "SL⠏"] # 0x1d5c9 + - "𝗊": [t: "SL⠟"] # 0x1d5ca + - "𝗋": [t: "SL⠗"] # 0x1d5cb + - "𝗌": [t: "SL⠎"] # 0x1d5cc + - "𝗍": [t: "SL⠞"] # 0x1d5cd + - "𝗎": [t: "SLâ „"] # 0x1d5ce + - "𝗏": [t: "SLâ §"] # 0x1d5cf + - "𝗐": [t: "SLâ ș"] # 0x1d5d0 + - "𝗑": [t: "SLâ ­"] # 0x1d5d1 + - "𝗒": [t: "SLâ œ"] # 0x1d5d2 + - "𝗓": [t: "SLâ ”"] # 0x1d5d3 + + - "𝖠": [t: "SCL⠁"] # 0x1d5a0 + - "𝖡": [t: "SCL⠃"] # 0x1d5a1 + - "𝖱": [t: "SCL⠉"] # 0x1d5a2 + - "𝖣": [t: "SCL⠙"] # 0x1d5a3 + - "đ–€": [t: "SCL⠑"] # 0x1d5a4 + - "đ–„": [t: "SCL⠋"] # 0x1d5a5 + - "𝖩": [t: "SCL⠛"] # 0x1d5a6 + - "𝖧": [t: "SCL⠓"] # 0x1d5a7 + - "𝖹": [t: "SCL⠊"] # 0x1d5a8 + - "đ–©": [t: "SCL⠚"] # 0x1d5a9 + - "đ–Ș": [t: "SCL⠅"] # 0x1d5aa + - "đ–«": [t: "SCL⠇"] # 0x1d5ab + - "𝖬": [t: "SCL⠍"] # 0x1d5ac + - "𝖭": [t: "SCL⠝"] # 0x1d5ad + - "𝖼": [t: "SCL⠕"] # 0x1d5ae + - "𝖯": [t: "SCL⠏"] # 0x1d5af + - "𝖰": [t: "SCL⠟"] # 0x1d5b0 + - "đ–±": [t: "SCL⠗"] # 0x1d5b1 + - "đ–Č": [t: "SCL⠎"] # 0x1d5b2 + - "𝖳": [t: "SCL⠞"] # 0x1d5b3 + - "𝖮": [t: "SCLâ „"] # 0x1d5b4 + - "đ–”": [t: "SCLâ §"] # 0x1d5b5 + - "đ–¶": [t: "SCLâ ș"] # 0x1d5b6 + - "đ–·": [t: "SCLâ ­"] # 0x1d5b7 + - "𝖾": [t: "SCLâ œ"] # 0x1d5b8 + - "đ–č": [t: "SCLâ ”"] # 0x1d5b9 + + - "𝗼": [t: "BSL⠁"] # 0x1d5ee + - "𝗯": [t: "BSL⠃"] # 0x1d5ef + - "𝗰": [t: "BSL⠉"] # 0x1d5f0 + - "đ—±": [t: "BSL⠙"] # 0x1d5f1 + - "đ—Č": [t: "BSL⠑"] # 0x1d5f2 + - "𝗳": [t: "BSL⠋"] # 0x1d5f3 + - "𝗮": [t: "BSL⠛"] # 0x1d5f4 + - "đ—”": [t: "BSL⠓"] # 0x1d5f5 + - "đ—¶": [t: "BSL⠊"] # 0x1d5f6 + - "đ—·": [t: "BSL⠚"] # 0x1d5f7 + - "𝗾": [t: "BSL⠅"] # 0x1d5f8 + - "đ—č": [t: "BSL⠇"] # 0x1d5f9 + - "đ—ș": [t: "BSL⠍"] # 0x1d5fa + - "đ—»": [t: "BSL⠝"] # 0x1d5fb + - "đ—Œ": [t: "BSL⠕"] # 0x1d5fc + - "đ—œ": [t: "BSL⠏"] # 0x1d5fd + - "đ—Ÿ": [t: "BSL⠟"] # 0x1d5fe + - "𝗿": [t: "BSL⠗"] # 0x1d5ff + - "𝘀": [t: "BSL⠎"] # 0x1d600 + - "𝘁": [t: "BSL⠞"] # 0x1d601 + - "𝘂": [t: "BSLâ „"] # 0x1d602 + - "𝘃": [t: "BSLâ §"] # 0x1d603 + - "𝘄": [t: "BSLâ ș"] # 0x1d604 + - "𝘅": [t: "BSLâ ­"] # 0x1d605 + - "𝘆": [t: "BSLâ œ"] # 0x1d606 + - "𝘇": [t: "BSLâ ”"] # 0x1d607 + + - "𝗔": [t: "BSCL⠁"] # 0x1d5d4 + - "𝗕": [t: "BSCL⠃"] # 0x1d5d5 + - "𝗖": [t: "BSCL⠉"] # 0x1d5d6 + - "𝗗": [t: "BSCL⠙"] # 0x1d5d7 + - "𝗘": [t: "BSCL⠑"] # 0x1d5d8 + - "𝗙": [t: "BSCL⠋"] # 0x1d5d9 + - "𝗚": [t: "BSCL⠛"] # 0x1d5da + - "𝗛": [t: "BSCL⠓"] # 0x1d5db + - "𝗜": [t: "BSCL⠊"] # 0x1d5dc + - "𝗝": [t: "BSCL⠚"] # 0x1d5dd + - "𝗞": [t: "BSCL⠅"] # 0x1d5de + - "𝗟": [t: "BSCL⠇"] # 0x1d5df + - "𝗠": [t: "BSCL⠍"] # 0x1d5e0 + - "𝗡": [t: "BSCL⠝"] # 0x1d5e1 + - "𝗱": [t: "BSCL⠕"] # 0x1d5e2 + - "𝗣": [t: "BSCL⠏"] # 0x1d5e3 + - "đ—€": [t: "BSCL⠟"] # 0x1d5e4 + - "đ—„": [t: "BSCL⠗"] # 0x1d5e5 + - "𝗩": [t: "BSCL⠎"] # 0x1d5e6 + - "𝗧": [t: "BSCL⠞"] # 0x1d5e7 + - "𝗹": [t: "BSCLâ „"] # 0x1d5e8 + - "đ—©": [t: "BSCLâ §"] # 0x1d5e9 + - "đ—Ș": [t: "BSCLâ ș"] # 0x1d5ea + - "đ—«": [t: "BSCLâ ­"] # 0x1d5eb + - "𝗬": [t: "BSCLâ œ"] # 0x1d5ec + - "𝗭": [t: "BSCLâ ”"] # 0x1d5ed + + - "𝘱": [t: "ISL⠁"] # 0x1d622 + - "𝘣": [t: "ISL⠃"] # 0x1d623 + - "đ˜€": [t: "ISL⠉"] # 0x1d624 + - "đ˜„": [t: "ISL⠙"] # 0x1d625 + - "𝘩": [t: "ISL⠑"] # 0x1d626 + - "𝘧": [t: "ISL⠋"] # 0x1d627 + - "𝘹": [t: "ISL⠛"] # 0x1d628 + - "đ˜©": [t: "ISL⠓"] # 0x1d629 + - "đ˜Ș": [t: "ISL⠊"] # 0x1d62a + - "đ˜«": [t: "ISL⠚"] # 0x1d62b + - "𝘬": [t: "ISL⠅"] # 0x1d62c + - "𝘭": [t: "ISL⠇"] # 0x1d62d + - "𝘼": [t: "ISL⠍"] # 0x1d62e + - "𝘯": [t: "ISL⠝"] # 0x1d62f + - "𝘰": [t: "ISL⠕"] # 0x1d630 + - "đ˜±": [t: "ISL⠏"] # 0x1d631 + - "đ˜Č": [t: "ISL⠟"] # 0x1d632 + - "𝘳": [t: "ISL⠗"] # 0x1d633 + - "𝘮": [t: "ISL⠎"] # 0x1d634 + - "đ˜”": [t: "ISL⠞"] # 0x1d635 + - "đ˜¶": [t: "ISLâ „"] # 0x1d636 + - "đ˜·": [t: "ISLâ §"] # 0x1d637 + - "𝘾": [t: "ISLâ ș"] # 0x1d638 + - "đ˜č": [t: "ISLâ ­"] # 0x1d639 + - "đ˜ș": [t: "ISLâ œ"] # 0x1d63a + - "đ˜»": [t: "ISLâ ”"] # 0x1d63b + + - "𝘈": [t: "ISCL⠁"] # 0x1d608 + - "𝘉": [t: "ISCL⠃"] # 0x1d609 + - "𝘊": [t: "ISCL⠉"] # 0x1d60a + - "𝘋": [t: "ISCL⠙"] # 0x1d60b + - "𝘌": [t: "ISCL⠑"] # 0x1d60c + - "𝘍": [t: "ISCL⠋"] # 0x1d60d + - "𝘎": [t: "ISCL⠛"] # 0x1d60e + - "𝘏": [t: "ISCL⠓"] # 0x1d60f + - "𝘐": [t: "ISCL⠊"] # 0x1d610 + - "𝘑": [t: "ISCL⠚"] # 0x1d611 + - "𝘒": [t: "ISCL⠅"] # 0x1d612 + - "𝘓": [t: "ISCL⠇"] # 0x1d613 + - "𝘔": [t: "ISCL⠍"] # 0x1d614 + - "𝘕": [t: "ISCL⠝"] # 0x1d615 + - "𝘖": [t: "ISCL⠕"] # 0x1d616 + - "𝘗": [t: "ISCL⠏"] # 0x1d617 + - "𝘘": [t: "ISCL⠟"] # 0x1d618 + - "𝘙": [t: "ISCL⠗"] # 0x1d619 + - "𝘚": [t: "ISCL⠎"] # 0x1d61a + - "𝘛": [t: "ISCL⠞"] # 0x1d61b + - "𝘜": [t: "ISCLâ „"] # 0x1d61c + - "𝘝": [t: "ISCLâ §"] # 0x1d61d + - "𝘞": [t: "ISCLâ ș"] # 0x1d61e + - "𝘟": [t: "ISCLâ ­"] # 0x1d61f + - "𝘠": [t: "ISCLâ œ"] # 0x1d620 + - "𝘡": [t: "ISCLâ ”"] # 0x1d621 + + - "𝙖": [t: "BILS⠁"] # 0x1d656 + - "𝙗": [t: "BILS⠃"] # 0x1d657 + - "𝙘": [t: "BILS⠉"] # 0x1d658 + - "𝙙": [t: "BILS⠙"] # 0x1d659 + - "𝙚": [t: "BILS⠑"] # 0x1d65a + - "𝙛": [t: "BILS⠋"] # 0x1d65b + - "𝙜": [t: "BILS⠛"] # 0x1d65c + - "𝙝": [t: "BILS⠓"] # 0x1d65d + - "𝙞": [t: "BILS⠊"] # 0x1d65e + - "𝙟": [t: "BILS⠚"] # 0x1d65f + - "𝙠": [t: "BILS⠅"] # 0x1d660 + - "𝙡": [t: "BILS⠇"] # 0x1d661 + - "𝙱": [t: "BILS⠍"] # 0x1d662 + - "𝙣": [t: "BILS⠝"] # 0x1d663 + - "đ™€": [t: "BILS⠕"] # 0x1d664 + - "đ™„": [t: "BILS⠏"] # 0x1d665 + - "𝙩": [t: "BILS⠟"] # 0x1d666 + - "𝙧": [t: "BILS⠗"] # 0x1d667 + - "𝙹": [t: "BILS⠎"] # 0x1d668 + - "đ™©": [t: "BILS⠞"] # 0x1d669 + - "đ™Ș": [t: "BILSâ „"] # 0x1d66a + - "đ™«": [t: "BILSâ §"] # 0x1d66b + - "𝙬": [t: "BILSâ ș"] # 0x1d66c + - "𝙭": [t: "BILSâ ­"] # 0x1d66d + - "𝙼": [t: "BILSâ œ"] # 0x1d66e + - "𝙯": [t: "BILSâ ”"] # 0x1d66f + + - "đ˜Œ": [t: "BILSC⠁"] # 0x1d63c + - "đ˜œ": [t: "BILSC⠃"] # 0x1d63d + - "đ˜Ÿ": [t: "BILSC⠉"] # 0x1d63e + - "𝘿": [t: "BILSC⠙"] # 0x1d63f + - "𝙀": [t: "BILSC⠑"] # 0x1d640 + - "𝙁": [t: "BILSC⠋"] # 0x1d641 + - "𝙂": [t: "BILSC⠛"] # 0x1d642 + - "𝙃": [t: "BILSC⠓"] # 0x1d643 + - "𝙄": [t: "BILSC⠊"] # 0x1d644 + - "𝙅": [t: "BILSC⠚"] # 0x1d645 + - "𝙆": [t: "BILSC⠅"] # 0x1d646 + - "𝙇": [t: "BILSC⠇"] # 0x1d647 + - "𝙈": [t: "BILSC⠍"] # 0x1d648 + - "𝙉": [t: "BILSC⠝"] # 0x1d649 + - "𝙊": [t: "BILSC⠕"] # 0x1d64a + - "𝙋": [t: "BILSC⠏"] # 0x1d64b + - "𝙌": [t: "BILSC⠟"] # 0x1d64c + - "𝙍": [t: "BILSC⠗"] # 0x1d64d + - "𝙎": [t: "BILSC⠎"] # 0x1d64e + - "𝙏": [t: "BILSC⠞"] # 0x1d64f + - "𝙐": [t: "BILSCâ „"] # 0x1d650 + - "𝙑": [t: "BILSCâ §"] # 0x1d651 + - "𝙒": [t: "BILSCâ ș"] # 0x1d652 + - "𝙓": [t: "BILSCâ ­"] # 0x1d653 + - "𝙔": [t: "BILSCâ œ"] # 0x1d654 + - "𝙕": [t: "BILSCâ ”"] # 0x1d655 + + - "𝚊": [t: "L⠁"] # 0x1d68a + - "𝚋": [t: "L⠃"] # 0x1d68b + - "𝚌": [t: "L⠉"] # 0x1d68c + - "𝚍": [t: "L⠙"] # 0x1d68d + - "𝚎": [t: "L⠑"] # 0x1d68e + - "𝚏": [t: "L⠋"] # 0x1d68f + - "𝚐": [t: "L⠛"] # 0x1d690 + - "𝚑": [t: "L⠓"] # 0x1d691 + - "𝚒": [t: "L⠊"] # 0x1d692 + - "𝚓": [t: "L⠚"] # 0x1d693 + - "𝚔": [t: "L⠅"] # 0x1d694 + - "𝚕": [t: "L⠇"] # 0x1d695 + - "𝚖": [t: "L⠍"] # 0x1d696 + - "𝚗": [t: "L⠝"] # 0x1d697 + - "𝚘": [t: "L⠕"] # 0x1d698 + - "𝚙": [t: "L⠏"] # 0x1d699 + - "𝚚": [t: "L⠟"] # 0x1d69a + - "𝚛": [t: "L⠗"] # 0x1d69b + - "𝚜": [t: "L⠎"] # 0x1d69c + - "𝚝": [t: "L⠞"] # 0x1d69d + - "𝚞": [t: "Lâ „"] # 0x1d69e + - "𝚟": [t: "Lâ §"] # 0x1d69f + - "𝚠": [t: "Lâ ș"] # 0x1d6a0 + - "𝚡": [t: "Lâ ­"] # 0x1d6a1 + - "𝚱": [t: "Lâ œ"] # 0x1d6a2 + - "𝚣": [t: "Lâ ”"] # 0x1d6a3 + + - "𝙰": [t: "CL⠁"] # 0x1d670 + - "đ™±": [t: "CL⠃"] # 0x1d671 + - "đ™Č": [t: "CL⠉"] # 0x1d672 + - "𝙳": [t: "CL⠙"] # 0x1d673 + - "𝙮": [t: "CL⠑"] # 0x1d674 + - "đ™”": [t: "CL⠋"] # 0x1d675 + - "đ™¶": [t: "CL⠛"] # 0x1d676 + - "đ™·": [t: "CL⠓"] # 0x1d677 + - "𝙾": [t: "CL⠊"] # 0x1d678 + - "đ™č": [t: "CL⠚"] # 0x1d679 + - "đ™ș": [t: "CL⠅"] # 0x1d67a + - "đ™»": [t: "CL⠇"] # 0x1d67b + - "đ™Œ": [t: "CL⠍"] # 0x1d67c + - "đ™œ": [t: "CL⠝"] # 0x1d67d + - "đ™Ÿ": [t: "CL⠕"] # 0x1d67e + - "𝙿": [t: "CL⠏"] # 0x1d67f + - "𝚀": [t: "CL⠟"] # 0x1d680 + - "𝚁": [t: "CL⠗"] # 0x1d681 + - "𝚂": [t: "CL⠎"] # 0x1d682 + - "𝚃": [t: "CL⠞"] # 0x1d683 + - "𝚄": [t: "CLâ „"] # 0x1d684 + - "𝚅": [t: "CLâ §"] # 0x1d685 + - "𝚆": [t: "CLâ ș"] # 0x1d686 + - "𝚇": [t: "CLâ ­"] # 0x1d687 + - "𝚈": [t: "CLâ œ"] # 0x1d688 + - "𝚉": [t: "CLâ ”"] # 0x1d689 + + - "đš€": [t: "L⠊"] # 0x1d6a4 (dotless i) + - "đš„": [t: "L⠚"] # 0x1d6a5 (dotless j) + - "𝛂": [t: "BGL⠁"] # 0x1d6c2 + - "𝛃": [t: "BGL⠃"] # 0x1d6c3 + - "𝛄": [t: "BGL⠛"] # 0x1d6c4 + - "𝛅": [t: "BGL⠙"] # 0x1d6c5 + - "𝛆": [t: "BGL⠑"] # 0x1d6c6 + - "𝛇": [t: "BGLâ ”"] # 0x1d6c7 + - "𝛈": [t: "BGLâ ± "] # 0x1d6c8 + - "𝛉": [t: "BGLâ č"] # 0x1d6c9 + - "𝛊": [t: "BGL⠊"] # 0x1d6ca + - "𝛋": [t: "BGL⠅"] # 0x1d6cb + - "𝛌": [t: "BGL⠇"] # 0x1d6cc + - "𝛍": [t: "BGL⠍"] # 0x1d6cd + - "𝛎": [t: "BGL⠝"] # 0x1d6ce + - "𝛏": [t: "BGLâ ­"] # 0x1d6cf + - "𝛐": [t: "BGL⠕"] # 0x1d6d0 + - "𝛑": [t: "BGL⠏"] # 0x1d6d1 + - "𝛒": [t: "BGL⠗"] # 0x1d6d2 + - "𝛓": [t: "BGL⠎"] # 0x1d6d3 + - "𝛔": [t: "BGL⠞"] # 0x1d6d4 + - "𝛕": [t: "BGLâ „"] # 0x1d6d5 + - "𝛖": [t: "BGL⠋"] # 0x1d6d6 + - "𝛗": [t: "BGLâ Ż"] # 0x1d6d7 + - "𝛘": [t: "BGLâ œ"] # 0x1d6d8 + - "𝛙": [t: "BGLâ ș"] # 0x1d6d9 + + - "𝚹": [t: "BCGL⠁"] # 0x1d6a8 + - "đš©": [t: "BCGL⠃"] # 0x1d6a9 + - "đšȘ": [t: "BCGL⠛"] # 0x1d6aa + - "đš«": [t: "BCGL⠙"] # 0x1d6ab + - "𝚬": [t: "BCGL⠑"] # 0x1d6ac + - "𝚭": [t: "BCGLâ ”"] # 0x1d6ad + - "𝚼": [t: "BCGLâ ± "] # 0x1d6ae + - "𝚯": [t: "BCGLâ č"] # 0x1d6af + - "𝚰": [t: "BCGL⠊"] # 0x1d6b0 + - "đš±": [t: "BCGL⠅"] # 0x1d6b1 + - "đšČ": [t: "BCGL⠇"] # 0x1d6b2 + - "𝚳": [t: "BCGL⠍"] # 0x1d6b3 + - "𝚮": [t: "BCGL⠝"] # 0x1d6b4 + - "đš”": [t: "BCGLâ ­"] # 0x1d6b5 + - "đš¶": [t: "BCGL⠕"] # 0x1d6b6 + - "đš·": [t: "BCGL⠏"] # 0x1d6b7 + - "𝚾": [t: "BCGL⠗"] # 0x1d6b8 + - "đšč": [t: "BCGL⠎"] # 0x1d6b9 + - "đšș": [t: "BCGL⠞"] # 0x1d6ba + - "đš»": [t: "BCGLâ „"] # 0x1d6bb + - "đšŒ": [t: "BCGL⠋"] # 0x1d6bc + - "đšœ": [t: "BCGLâ Ż"] # 0x1d6bd + - "đšŸ": [t: "BCGLâ œ"] # 0x1d6be + - "𝚿": [t: "BCGLâ ș"] # 0x1d6bf + + - "đ›Œ": [t: "IGL⠁"] # 0x1d6fc + - "đ›œ": [t: "IGL⠃"] # 0x1d6fd + - "đ›Ÿ": [t: "IGL⠛"] # 0x1d6fe + - "𝛿": [t: "IGL⠙"] # 0x1d6ff + - "𝜀": [t: "IGL⠑"] # 0x1d700 + - "𝜁": [t: "IGLâ ”"] # 0x1d701 + - "𝜂": [t: "IGLâ ± "] # 0x1d702 + - "𝜃": [t: "IGLâ č"] # 0x1d703 + - "𝜄": [t: "IGL⠊"] # 0x1d704 + - "𝜅": [t: "IGL⠅"] # 0x1d705 + - "𝜆": [t: "IGL⠇"] # 0x1d706 + - "𝜇": [t: "IGL⠍"] # 0x1d707 + - "𝜈": [t: "IGL⠝"] # 0x1d708 + - "𝜉": [t: "IGLâ ­"] # 0x1d709 + - "𝜊": [t: "IGL⠕"] # 0x1d70a + - "𝜋": [t: "IGL⠏"] # 0x1d70b + - "𝜌": [t: "IGL⠗"] # 0x1d70c + - "𝜍": [t: "IGL⠎"] # 0x1d70d + - "𝜎": [t: "IGL⠞"] # 0x1d70e + - "𝜏": [t: "IGLâ „"] # 0x1d70f + - "𝜐": [t: "IGL⠋"] # 0x1d710 + - "𝜑": [t: "IGLâ Ż"] # 0x1d711 + - "𝜒": [t: "IGLâ œ"] # 0x1d712 + - "𝜓": [t: "IGLâ ș"] # 0x1d713 + + - "𝛱": [t: "ICGL⠁"] # 0x1d6e2 + - "𝛣": [t: "ICGL⠃"] # 0x1d6e3 + - "đ›€": [t: "ICGL⠛"] # 0x1d6e4 + - "đ›„": [t: "ICGL⠙"] # 0x1d6e5 + - "𝛩": [t: "ICGL⠑"] # 0x1d6e6 + - "𝛧": [t: "ICGLâ ”"] # 0x1d6e7 + - "𝛹": [t: "ICGLâ ± "] # 0x1d6e8 + - "đ›©": [t: "ICGLâ č"] # 0x1d6e9 + - "đ›Ș": [t: "ICGL⠊"] # 0x1d6ea + - "đ›«": [t: "ICGL⠅"] # 0x1d6eb + - "𝛬": [t: "ICGL⠇"] # 0x1d6ec + - "𝛭": [t: "ICGL⠍"] # 0x1d6ed + - "𝛼": [t: "ICGL⠝"] # 0x1d6ee + - "𝛯": [t: "ICGLâ ­"] # 0x1d6ef + - "𝛰": [t: "ICGL⠕"] # 0x1d6f0 + - "đ›±": [t: "ICGL⠏"] # 0x1d6f1 + - "đ›Č": [t: "ICGL⠗"] # 0x1d6f2 + - "𝛳": [t: "ICGL⠎"] # 0x1d6f3 + - "𝛮": [t: "ICGL⠞"] # 0x1d6f4 + - "đ›”": [t: "ICGLâ „"] # 0x1d6f5 + - "đ›¶": [t: "ICGL⠋"] # 0x1d6f6 + - "đ›·": [t: "ICGLâ Ż"] # 0x1d6f7 + - "𝛾": [t: "ICGLâ œ"] # 0x1d6f8 + - "đ›č": [t: "ICGLâ ș"] # 0x1d6f9 + + - "đœ¶": [t: "BIGL⠁"] # 0x1d736 + - "đœ·": [t: "BIGL⠃"] # 0x1d737 + - "𝜾": [t: "BIGL⠛"] # 0x1d738 + - "đœč": [t: "BIGL⠙"] # 0x1d739 + - "đœș": [t: "BIGL⠑"] # 0x1d73a + - "đœ»": [t: "BIGLâ ”"] # 0x1d73b + - "đœŒ": [t: "BIGLâ ± "] # 0x1d73c + - "đœœ": [t: "BIGLâ č"] # 0x1d73d + - "đœŸ": [t: "BIGL⠊"] # 0x1d73e + - "𝜿": [t: "BIGL⠅"] # 0x1d73f + - "𝝀": [t: "BIGL⠇"] # 0x1d740 + - "𝝁": [t: "BIGL⠍"] # 0x1d741 + - "𝝂": [t: "BIGL⠝"] # 0x1d742 + - "𝝃": [t: "BIGLâ ­"] # 0x1d743 + - "𝝄": [t: "BIGL⠕"] # 0x1d744 + - "𝝅": [t: "BIGL⠏"] # 0x1d745 + - "𝝆": [t: "BIGL⠗"] # 0x1d746 + - "𝝇": [t: "BIGL⠎"] # 0x1d747 + - "𝝈": [t: "BIGL⠞"] # 0x1d748 + - "𝝉": [t: "BIGLâ „"] # 0x1d749 + - "𝝊": [t: "BIGL⠋"] # 0x1d74a + - "𝝋": [t: "BIGLâ Ż"] # 0x1d74b + - "𝝌": [t: "BIGLâ œ"] # 0x1d74c + - "𝝍": [t: "BIGLâ ș"] # 0x1d74d + + - "𝜜": [t: "BICGL⠁"] # 0x1d71c + - "𝜝": [t: "BICGL⠃"] # 0x1d71d + - "𝜞": [t: "BICGL⠛"] # 0x1d71e + - "𝜟": [t: "BICGL⠙"] # 0x1d71f + - "𝜠": [t: "BICGL⠑"] # 0x1d720 + - "𝜡": [t: "BICGLâ ”"] # 0x1d721 + - "𝜱": [t: "BICGLâ ± "] # 0x1d722 + - "𝜣": [t: "BICGLâ č"] # 0x1d723 + - "đœ€": [t: "BICGL⠊"] # 0x1d724 + - "đœ„": [t: "BICGL⠅"] # 0x1d725 + - "𝜩": [t: "BICGL⠇"] # 0x1d726 + - "𝜧": [t: "BICGL⠍"] # 0x1d727 + - "𝜹": [t: "BICGL⠝"] # 0x1d728 + - "đœ©": [t: "BICGLâ ­"] # 0x1d729 + - "đœȘ": [t: "BICGL⠕"] # 0x1d72a + - "đœ«": [t: "BICGL⠏"] # 0x1d72b + - "𝜬": [t: "BICGL⠗"] # 0x1d72c + - "𝜭": [t: "BICGL⠎"] # 0x1d72d + - "𝜼": [t: "BICGL⠞"] # 0x1d72e + - "𝜯": [t: "BICGLâ „"] # 0x1d72f + - "𝜰": [t: "BICGL⠋"] # 0x1d730 + - "đœ±": [t: "BICGLâ Ż"] # 0x1d731 + - "đœČ": [t: "BICGLâ œ"] # 0x1d732 + - "𝜳": [t: "BICGLâ ș"] # 0x1d733 + + - "𝝰": [t: "BSGL⠁"] # 0x1d770 + - "đ±": [t: "BSGL⠃"] # 0x1d771 + - "đČ": [t: "BSGL⠛"] # 0x1d772 + - "𝝳": [t: "BSGL⠙"] # 0x1d773 + - "𝝮": [t: "BSGL⠑"] # 0x1d774 + - "đ”": [t: "BSGLâ ”"] # 0x1d775 + - "đ¶": [t: "BSGLâ ± "] # 0x1d776 + - "đ·": [t: "BSGLâ č"] # 0x1d777 + - "𝝾": [t: "BSGL⠊"] # 0x1d778 + - "đč": [t: "BSGL⠅"] # 0x1d779 + - "đș": [t: "BSGL⠇"] # 0x1d77a + - "đ»": [t: "BSGL⠍"] # 0x1d77b + - "đŒ": [t: "BSGL⠝"] # 0x1d77c + - "đœ": [t: "BSGLâ ­"] # 0x1d77d + - "đŸ": [t: "BSGL⠕"] # 0x1d77e + - "𝝿": [t: "BSGL⠏"] # 0x1d77f + - "𝞀": [t: "BSGL⠗"] # 0x1d780 + - "𝞁": [t: "BSGL⠎"] # 0x1d781 + - "𝞂": [t: "BSGL⠞"] # 0x1d782 + - "𝞃": [t: "BSGLâ „"] # 0x1d783 + - "𝞄": [t: "BSGL⠋"] # 0x1d784 + - "𝞅": [t: "BSGLâ Ż"] # 0x1d785 + - "𝞆": [t: "BSGLâ œ"] # 0x1d786 + - "𝞇": [t: "BSGLâ ș"] # 0x1d787 + + - "𝝖": [t: "BSCGL⠁"] # 0x1d756 + - "𝝗": [t: "BSCGL⠃"] # 0x1d757 + - "𝝘": [t: "BSCGL⠛"] # 0x1d758 + - "𝝙": [t: "BSCGL⠙"] # 0x1d759 + - "𝝚": [t: "BSCGL⠑"] # 0x1d75a + - "𝝛": [t: "BSCGLâ ”"] # 0x1d75b + - "𝝜": [t: "BSCGLâ ± "] # 0x1d75c + - "𝝝": [t: "BSCGLâ č"] # 0x1d75d + - "𝝞": [t: "BSCGL⠊"] # 0x1d75e + - "𝝟": [t: "BSCGL⠅"] # 0x1d75f + - "𝝠": [t: "BSCGL⠇"] # 0x1d760 + - "𝝡": [t: "BSCGL⠍"] # 0x1d761 + - "𝝱": [t: "BSCGL⠝"] # 0x1d762 + - "𝝣": [t: "BSCGLâ ­"] # 0x1d763 + - "đ€": [t: "BSCGL⠕"] # 0x1d764 + - "đ„": [t: "BSCGL⠏"] # 0x1d765 + - "𝝩": [t: "BSCGL⠗"] # 0x1d766 + - "𝝧": [t: "BSCGL⠎"] # 0x1d767 + - "𝝹": [t: "BSCGL⠞"] # 0x1d768 + - "đ©": [t: "BSCGLâ „"] # 0x1d769 + - "đȘ": [t: "BSCGL⠋"] # 0x1d76a + - "đ«": [t: "BSCGLâ Ż"] # 0x1d76b + - "𝝬": [t: "BSCGLâ œ"] # 0x1d76c + - "𝝭": [t: "BSCGLâ ș"] # 0x1d76d + + - "đžȘ": [t: "BISGL⠁"] # 0x1d7aa + - "đž«": [t: "BISGL⠃"] # 0x1d7ab + - "𝞬": [t: "BISGL⠛"] # 0x1d7ac + - "𝞭": [t: "BISGL⠙"] # 0x1d7ad + - "𝞼": [t: "BISGL⠑"] # 0x1d7ae + - "𝞯": [t: "BISGLâ ”"] # 0x1d7af + - "𝞰": [t: "BISGLâ ± "] # 0x1d7b0 + - "đž±": [t: "BISGLâ č"] # 0x1d7b1 + - "đžČ": [t: "BISGL⠊"] # 0x1d7b2 + - "𝞳": [t: "BISGL⠅"] # 0x1d7b3 + - "𝞮": [t: "BISGL⠇"] # 0x1d7b4 + - "đž”": [t: "BISGL⠍"] # 0x1d7b5 + - "đž¶": [t: "BISGL⠝"] # 0x1d7b6 + - "đž·": [t: "BISGLâ ­"] # 0x1d7b7 + - "𝞾": [t: "BISGL⠕"] # 0x1d7b8 + - "đžč": [t: "BISGL⠏"] # 0x1d7b9 + - "đžș": [t: "BISGL⠗"] # 0x1d7ba + - "đž»": [t: "BISGL⠎"] # 0x1d7bb + - "đžŒ": [t: "BISGL⠞"] # 0x1d7bc + - "đžœ": [t: "BISGLâ „"] # 0x1d7bd + - "đžŸ": [t: "BISGL⠋"] # 0x1d7be + - "𝞿": [t: "BISGLâ Ż"] # 0x1d7bf + - "𝟀": [t: "BISGLâ œ"] # 0x1d7c0 + - "𝟁": [t: "BISGLâ ș"] # 0x1d7c1 + + - "𝞐": [t: "BISCGL⠁"] # 0x1d790 + - "𝞑": [t: "BISCGL⠃"] # 0x1d791 + - "𝞒": [t: "BISCGL⠛"] # 0x1d792 + - "𝞓": [t: "BISCGL⠙"] # 0x1d793 + - "𝞔": [t: "BISCGL⠑"] # 0x1d794 + - "𝞕": [t: "BISCGLâ ”"] # 0x1d795 + - "𝞖": [t: "BISCGLâ ± "] # 0x1d796 + - "𝞗": [t: "BISCGLâ č"] # 0x1d797 + - "𝞘": [t: "BISCGL⠊"] # 0x1d798 + - "𝞙": [t: "BISCGL⠅"] # 0x1d799 + - "𝞚": [t: "BISCGL⠇"] # 0x1d79a + - "𝞛": [t: "BISCGL⠍"] # 0x1d79b + - "𝞜": [t: "BISCGL⠝"] # 0x1d79c + - "𝞝": [t: "BISCGLâ ­"] # 0x1d79d + - "𝞞": [t: "BISCGL⠕"] # 0x1d79e + - "𝞟": [t: "BISCGL⠏"] # 0x1d79f + - "𝞠": [t: "BISCGL⠗"] # 0x1d7a0 + - "𝞡": [t: "BISCGL⠎"] # 0x1d7a1 + - "𝞱": [t: "BISCGL⠞"] # 0x1d7a2 + - "𝞣": [t: "BISCGLâ „"] # 0x1d7a3 + - "đž€": [t: "BISCGL⠋"] # 0x1d7a4 + - "đž„": [t: "BISCGLâ Ż"] # 0x1d7a5 + - "𝞩": [t: "BISCGLâ œ"] # 0x1d7a6 + - "𝞧": [t: "BISCGLâ ș"] # 0x1d7a7 + + - "𝟎-𝟗": # 0x1d7ce - 0x1d7d7 + - t: "B" + - spell: "translate('.', '𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗', '0123456789')" + + - "-": # 0xf52e - 0xf537 (old MathType) + - t: "B" + - spell: "translate('.', '', '0123456789')" + + - "𝟬-đŸ”": # 0x1D7EC - 0x1D7F5 + - t: "B" + - spell: "translate('.', 'đŸŹđŸ­đŸźđŸŻđŸ°đŸ±đŸČđŸłđŸŽđŸ”', '0123456789')" + + - "-": # 0xf556 - 0xf55f (old MathType) + - t: "B" + - spell: "translate('.', '', '0123456789')" + + - "𝟱-đŸ«": # 0x1d7e2 - 0x1d7eb + - spell: "translate('.', 'đŸ¶đŸ·đŸžđŸčđŸșđŸ»đŸŒđŸœđŸŸđŸż', '0123456789')" + + - "đŸ¶-𝟿": # 0x1d7f6 - 0x1d7ff + - spell: "translate('.', 'đŸ¶đŸ·đŸžđŸčđŸșđŸ»đŸŒđŸœđŸŸđŸż', '0123456789')" diff --git a/Rules/Braille/French/unicode.yaml b/Rules/Braille/French/unicode.yaml new file mode 100644 index 000000000..e37c31f40 --- /dev/null +++ b/Rules/Braille/French/unicode.yaml @@ -0,0 +1,317 @@ +--- +# French braille characters +# +# Some chars that originally came from an Excel spreadsheet +# +# The French translation makes use of some non-braille chars as flags +# L -- what follows is a letter +# N -- what follows is a digit +# C -- precedes L for capital letters +# G -- precedes L for Greek Letters (after C for capitals) +# Typeface Indicators ("typeforms") +# B bold, I Italic, S Sans-serif, T script, D, Fraktur, đ”č blackboard-bold +# the type face indicators can be combined with B (first) and I (second) +# Standing alone chars: +# Any character which acts as a standing alone character (e.g, "{") needs each braille symbol to be labeled +# o -- opening/left side, c -- closing/right side, b -- both open and close (e.g, '"') + + + + - "a": [t: "L⠁"] # 0x61 + - "b": [t: "L⠃"] # 0x62 + - "c": [t: "L⠉"] # 0x63 + - "d": [t: "L⠙"] # 0x64 + - "e": [t: "L⠑"] # 0x65 + - "f": [t: "L⠋"] # 0x66 + - "g": [t: "L⠛"] # 0x67 + - "h": [t: "L⠓"] # 0x68 + - "i": [t: "L⠊"] # 0x69 + - "j": [t: "L⠚"] # 0x6a + - "k": [t: "L⠅"] # 0x6b + - "l": [t: "L⠇"] # 0x6c + - "m": [t: "L⠍"] # 0x6d + - "n": [t: "L⠝"] # 0x6e + - "o": [t: "L⠕"] # 0x6f + - "p": [t: "L⠏"] # 0x70 + - "q": [t: "L⠟"] # 0x71 + - "r": [t: "L⠗"] # 0x72 + - "s": [t: "L⠎"] # 0x73 + - "t": [t: "L⠞"] # 0x74 + - "u": [t: "Lâ „"] # 0x75 + - "v": [t: "Lâ §"] # 0x76 + - "w": [t: "Lâ ș"] # 0x77 + - "x": [t: "Lâ ­"] # 0x78 + - "y": [t: "Lâ œ"] # 0x79 + - "z": [t: "Lâ ”"] # 0x7a + + - "A": [t: "CL⠁"] # 0x41 + - "B": # 0x42 + - test: + if: "@data-chem-element" + then: [t: "đ¶L⠃"] + else: [t: "CL⠃"] + - "C": # 0x43 + - test: + if: "@data-chem-element" + then: [t: "đ¶L⠉"] + else: [t: "CL⠉"] + - "D": [t: "CL⠙"] # 0x44 + - "E": [t: "CL⠑"] # 0x45 + - "F": [t: "CL⠋"] # 0x46 + - "G": [t: "CL⠛"] # 0x47 + - "H": # 0x48 + - test: + if: "@data-chem-element" + then: [t: "đ¶L⠓"] + else: [t: "CL⠓"] + - "I": # 0x49 + - test: + if: "@data-chem-element" + then: [t: "đ¶L⠊"] + else: [t: "CL⠊"] + - "J": [t: "CL⠚"] # 0x4a + - "K": # 0x4b + - test: + if: "@data-chem-element" + then: [t: "đ¶L⠅"] + else: [t: "CL⠅"] + - "L": [t: "CL⠇"] # 0x4c + - "M": [t: "CL⠍"] # 0x4d + - "N": # 0x4e + - test: + if: "@data-chem-element" + then: [t: "đ¶L⠝"] + else: [t: "CL⠝"] + - "O": # 0x4f + - test: + if: "@data-chem-element" + then: [t: "đ¶L⠕"] + else: [t: "CL⠕"] + - "P": # 0x50 + - test: + if: "@data-chem-element" + then: [t: "đ¶L⠏"] + else: [t: "CL⠏"] + - "Q": [t: "CL⠟"] # 0x51 + - "R": [t: "CL⠗"] # 0x52 + - "S": # 0x53 + - test: + if: "@data-chem-element" + then: [t: "đ¶L⠎"] + else: [t: "CL⠎"] + - "T": [t: "CL⠞"] # 0x54 + - "U": # 0x55 + - test: + if: "@data-chem-element" + then: [t: "đ¶Lâ „"] + else: [t: "CLâ „"] + - "V": # 0x56 + - test: + if: "@data-chem-element" + then: [t: "đ¶Lâ §"] + else: [t: "CLâ §"] + - "W": # 0x57 + - test: + if: "@data-chem-element" + then: [t: "đ¶Lâ ș"] + else: [t: "CLâ ș"] + - "X": [t: "CLâ ­"] # 0x58 + - "Y": # 0x59 + - test: + if: "@data-chem-element" + then: [t: "đ¶Lâ œ"] + else: [t: "CLâ œ"] + - "Z": [t: "CLâ ”"] # 0x5a + + - "α": [t: "GL⠁"] # 0x3b1 + - "ÎČ": [t: "GL⠃"] # 0x3b2 + - "Îł": [t: "GL⠛"] # 0x3b3 + - "ÎŽ": [t: "GL⠙"] # 0x3b4 + - "Δ": [t: "GL⠑"] # 0x3b5 + - "ζ": [t: "GLâ ”"] # 0x3b6 + - "η": [t: "GLâ ±"] # 0x3b7 + - "Ξ": [t: "GLâ č"] # 0x3b8 + - "Îč": [t: "GL⠊"] # 0x3b9 + - "Îș": [t: "GL⠅"] # 0x3ba + - "λ": [t: "GL⠇"] # 0x3bb + - "ÎŒ": [t: "GL⠍"] # 0x3bc + - "Μ": [t: "GL⠝"] # 0x3bd + - "Ο": [t: "GLâ ­"] # 0x3be + - "Îż": [t: "GL⠕"] # 0x3bf + - "π": [t: "GL⠏"] # 0x3c0 + - "ρ": [t: "GL⠗"] # 0x3c1 + - "ς": [t: "GL⠎"] # 0x3c2 + - "σ": [t: "GL⠎"] # 0x3c3 + - "τ": [t: "GL⠞"] # 0x3c4 + - "υ": [t: "GLâ „"] # 0x3c5 + - "φ": [t: "GL⠋"] # 0x3c6 + - "χ": [t: "GLâ Ż"] # 0x3c7 + - "ψ": [t: "GLâ œ"] # 0x3c8 + - "ω": [t: "GLâ ș"] # 0x3c9 + + - "Α": [t: "CGL⠁"] # 0x391 + - "Β": [t: "CGL⠃"] # 0x392 + - "Γ": [t: "CGL⠛"] # 0x393 + - "Δ": [t: "CGL⠙"] # 0x394 + - "Ε": [t: "CGL⠑"] # 0x395 + - "Ζ": [t: "CGLâ ”"] # 0x396 + - "Η": [t: "CGLâ ± "] # 0x397 + - "Θ": [t: "CGLâ č"] # 0x398 + - "Ι": [t: "CGL⠊"] # 0x399 + - "Κ": [t: "CGL⠅"] # 0x39a + - "Λ": [t: "CGL⠇"] # 0x39b + - "Μ": [t: "CGL⠍"] # 0x39c + - "Ν": [t: "CGL⠝"] # 0x39d + - "Ξ": [t: "CGLâ ­"] # 0x39e + - "Ο": [t: "CGL⠕"] # 0x39f + - "Π": [t: "CGL⠏"] # 0x3a0 + - "ÎĄ": [t: "CGL⠗"] # 0x3a1 + - "Îą": [t: "CGL⠎"] # 0x3a2 + - "ÎŁ": [t: "CGL⠎"] # 0x3a3 + - "΀": [t: "CGL⠞"] # 0x3a4 + - "΄": [t: "CGLâ „"] # 0x3a5 + - "Ί": [t: "CGL⠋"] # 0x3a6 + - "Χ": [t: "CGLâ Ż"] # 0x3a7 + - "Κ": [t: "CGLâ œ"] # 0x3a8 + - "Ω": [t: "CGLâ ș"] # 0x3a9 + + - "”": [t: "GL⠍"] # 0x00B5 (Micro (Greek mu)) + - "℩": [t: "CGLâ ș"] # 0x2126 (Ohm sign (capital Greek omega)) + - "∆": [t: "CGL⠙"] # 0x2206 (Increment (capital Greek delta)) + - "∏": [t: "CGL⠏"] # 0x220F (Product (capital Greek pi)) + + - "⁥": [t: ""] # 0x2061⁥ (invisible function apply) + - "⁹": [t: ""] # 0x2062 (invisible times) + - "⁣": [t: ""] # 0x2063⁥ (invisible separator) + - "⁀": [t: ""] # 0x2064 (invisible plus) + + + - "!": [t: "⠾⠔"] # 0x0021 (factorial) + - "%": [t: "⠐⠏"] # 0x0025 (percent sign) + - "(": [t: "â Š"] # 0x0028 (left parenthesis) + - ")": [t: "â Ž"] # 0x0029 (right parenthesis) + - "+": [t: "⠖"] # 0x002B (regular plus) + - ",": [t: "⠂"] # 0x002C (comma) + - "-": [t: "â €"] # 0x002D (regular minus) + - ".": [t: "⠂"] # 0x002E (decimal point (American and Continental)) + - "/": [t: "⠌"] # 0x002F (diagonal fraction line) + - "0": [t: "Nâ Œ"] # 0x0030 (digit zero) + - "1": [t: "Nâ Ą"] # 0x0031 (digit one) + - "2": [t: "Nâ Ł"] # 0x0032 (digit two) + - "3": [t: "Nâ ©"] # 0x0033 (digit three) + - "4": [t: "Nâ č"] # 0x0034 (digit four) + - "5": [t: "Nâ ±"] # 0x0035 (digit five) + - "6": [t: "Nâ «"] # 0x0036 (digit six) + - "7": [t: "Nâ »"] # 0x0037 (digit seven) + - "8": [t: "Nâ ł"] # 0x0038 (digit eight) + - "9": [t: "Nâ Ș"] # 0x0039 (digit nine) + - ":": [t: "⠒"] # 0x003A (colon) + - "<": [t: "⠐⠣"] # 0x003C (less than sign) + - "=": [t: "â ¶"] # 0x003D (regular equals sign) + - ">": [t: "⠐⠜"] # 0x003E (greater than sign ( regular )) + - "[": [t: "â ·"] # 0x005B (left square bracket) + - "]": [t: "â Ÿ"] # 0x005D (right square bracket) + - "{": # 0x007B ( left curly brace) + - test: + if: "following-sibling::*[1][self::m:mtable]" + then_test: + if: "count(following-sibling::*[1]/*) = 1" + then: [t: "â šâ Š"] + else: [t: "â žâ Š"] + else: [t: "â šâ Š"] # regular brace + - "|": [t: "â ż"] # 0x007C (vertical bar) + - "}": [t: "â šâ Ž"] # 0x007D (right curly brace) + - "~": [t: "⠘⠶"] # 0x007E (simple tilde (is related to, is similar)) + - "Âą": [t: "⠉"] # 0x00A2 (cent) + - "°": [t: "⠐⠕"] # 0x00B0 (degree sign) + - "±": [t: "â –â €"] # 0x00B1 (plus or minus) + - "ÂŒ": [t: "⠡⠌â č"] # 0x00BC (vulgar fraction one quarter) + - "œ": [t: "⠡⠌⠣"] # 0x00BD (vulgar fraction one half) + - "Ÿ": [t: "⠩⠌â č"] # 0x00BE (vulgar fraction three quarters) + - "×": [t: "⠔"] # 0x00D7 ( multiplication sign) + - "Ă·": [t: "⠒"] # 0x00F7 (division sign ( divided by )) + - "Ś‘": [t: "⠘⠘⠃"] # 0x05D1 ( beth) + - "Ś’": [t: "⠘⠘⠛"] # 0x05D2 (gimel) + - "Ś“": [t: "⠘⠘⠙"] # 0x05D3 (daleth) + - "‖": [t: "⠘⠿"] # 0x2016 (double vertical bar) + - "‰": [t: "⠐⠏⠏"] # 0x2030 (per mille sign) + - "â€Č": [t: "⠄"] # 0x2032 (prime) + - "″": [t: "⠄⠄"] # 0x2033 (double prime) + - "‮": [t: "⠄⠄⠄"] # 0x2034 (triple prime) + - "€": [t: "⠘⠑"] # 0x20AC (euro) + - "Å": [t: "⠹⠁⠈⠕"] # 0x212B (angstrom) + - "â„”": [t: "⠘⠘⠁"] # 0x2135 (alef) + - "←": [t: "â žâ Ș"] # 0x2190 (left pointing arrow) + - "↑": [t: "⠘⠻"] # 0x2191 (arrow pointing up) + - "→": [t: "â žâ ±"] # 0x2192 (left pointing arrow) + - "↓": [t: "â šâ »"] # 0x2193 (arrow pointing down) + - "↔": [t: "⠐⠻"] # 0x2194 (horizontal two-way arrow) + - "↖": [t: "⠘â Ș"] # 0x2196 (north west arrow) + - "↗": [t: "⠘⠱"] # 0x2197 (north east arrow) + - "↘": [t: "â šâ ±"] # 0x2198 (south east arrow) + - "↙": [t: "â šâ Ș"] # 0x2199 (south west arrow) + - "↚": [t: "â šâ žâ Ș"] # 0x219A (leftwards arrow with stroke) + - "↛": [t: "â šâ žâ ±"] # 0x219B (rightwards arrow with stroke) + - "↩": [t: "⠐⠱"] # 0x21A6 (rightwards arrow from bar (maps to)) + - "⇄": [t: "â žâ »"] # 0x21C4 (arrow pointing right over arrow pointing left) + - "⇍": [t: "⠹⠐⠒"] # 0x21CD (leftwards double arrow with stroke) + - "⇎": [t: "⠹⠐⠒⠂"] # 0x21CE (left right double arrow with stroke (not equivalent)) + - "⇏": [t: "⠹⠒⠂"] # 0x21CF (rightwards double arrow with stroke (does not imply)) + - "⇐": [t: "⠐⠒"] # 0x21D0 (leftwards double arrow) + - "⇒": [t: "⠒⠂"] # 0x21D2 (rightwards double arrow (implication)) + - "⇔": [t: "⠐⠒⠂"] # 0x21D4 (left right double arrow (double implication, equivalence)) + - "∀": [t: "⠾⠌"] # 0x2200 (universal quantifier (for all, for each, for every)) + - "∁": [t: "â šâ ©"] # 0x2201 (capital english c (complement)) + - "∂": [t: "⠐⠙"] # 0x2202 (partial derivative (round d)) + - "∃": [t: "â žâ Ą"] # 0x2203 (existential quantifier (there exists uniquely, for exactly one)) + - "∄": [t: "â šâ žâ Ą"] # 0x2204 (does not exist) + - "∅": [t: "⠘⠌"] # 0x2205 (empty set ( represented by zero with vertical or oblique bar through it)) + - "∇": [t: "â šâ č"] # 0x2207 (del (nabla, gradient) , inverted triangle) + - "∈": [t: "⠘⠥"] # 0x2208 (membership (is an element of)) + - "∉": [t: "⠘⠌"] # 0x2209 (is not an element of) + - "∋": [t: "⠚⠘⠥"] # 0x220B (reverse membership (contains the element)) + - "∌": [t: "⠹⠘⠌"] # 0x220C (does not contain as a member) + - "∑": [t: "⠹⠘⠎"] # 0x2211 (n-ary summation) + - "∓": [t: "⠀⠖"] # 0x2213 (minus or plus) + - "∘": [t: "â žâ Œ"] # 0x2218 (hollow dot) + - "∞": [t: "⠘⠉"] # 0x221E (infinity) + - "∄": [t: "â žâ ł"] # 0x2225 (is parallel to) + - "∧": [t: "⠘⠔"] # 0x2227 (logical product (and, meet)) + - "√": [t: "⠘⠹"] # 0x2228 (logical sum (join,or)) + - "∩": [t: "⠘⠖"] # 0x2229 (intersection sign ( cap )) + - "âˆȘ": [t: "⠾⠖"] # 0x222A (union sign) + - "∫": [t: "â Ż"] # 0x222B (single integral) + - "∏": [t: "â Żâ Ż"] # 0x222C (double integral) + - "∟": [t: "â šâ Ż"] # 0x222E (integral with superposed circle) + - "∯": [t: "â šâ Żâ Ż"] # 0x222F (double contour integral/surface integral) + - "≃": [t: "⠐⠶"] # 0x2243 (bar under simple tilde (asymptotically equal to)) + - "≅": [t: "â žâ ¶"] # 0x2245 (equals sign under tilde) + - "≈": [t: "⠐⠶"] # 0x2248 (double tilde) + - "≙": [t: "⠒⠶"] # 0x2259 (caret over equals sign) + - "≠": [t: "â šâ ¶"] # 0x2260 (not equal to) + - "≡": [t: "â ¶â ¶"] # 0x2261 (identify (is congruent to, is identical with)) + - "≱": [t: "â šâ ¶â ¶"] # 0x2262 (is not identical to) + - "≀": [t: "⠘⠣"] # 0x2264 (bar under less than sign (is less than or equal to)) + - "≄": [t: "⠘⠜"] # 0x2265 (bar under greater than sign (is greater than or equal to)) + - "â‰Ș": [t: "⠐⠐⠣"] # 0x226A (nest of two less than signs with straight sides (is small compared with)) + - "≫": [t: "⠐⠐⠜"] # 0x226B (nest of two greater than signs with straight sides (is large compared with)) + - "â‰ș": [t: "â šâ šâ Ł"] # 0x227A (less than sign with curved sides) + - "≻": [t: "⠹⠹⠜"] # 0x227B (greater than sign with curved sides ) + - "≌": [t: "⠘⠘⠣"] # 0x227C (less than sign with curved sides over curved bar (precedes or is equal to)) + - "≜": [t: "⠘⠘⠜"] # 0x227D (greater than sign with curved sides over curved bar (succeeds or is equal to)) + - "⊂": [t: "â šâ Ą"] # 0x2282 (inclusion sign ( is contained in, is a subset of )) + - "⊃": [t: "⠐⠥"] # 0x2283 (reverse inclusion sign ( contains, implies )) + - "⊄": [t: "⠹⠌"] # 0x2284 (not a subset of) + - "⊅": [t: "⠐⠌"] # 0x2285 (not a superset of) + - "⊆": [t: "â žâ šâ Ą"] # 0x2286 (bar under inclusion sign (is a subset of)) + - "⊈": [t: "⠾⠹⠌"] # 0x2288 (neither a subset of nor equal to) + - "⊕": [t: "⠹⠖"] # 0x2295 (circle with interior plus sign (exclusive or, direct sum, diletion)) + - "⊗": [t: "⠹⠔"] # 0x2297 (circle with interior cross (tensor product)) + - "⊄": [t: "⠘⠳"] # 0x22A5 (is perpendicular to) + - "⋅": [t: "⠔⠔"] # 0x22C5 (dot,and times) + - "⌄": [t: "⠾⠘⠒"] # 0x2304 (inverted caret) + - "⏜": [t: "⠈⠒"] # 0x23DC (arc concave upward) + - "△": [t: "⠹⠘⠙"] # 0x25B3 (increment (laplacian Delta) ) + - "✕": [t: "⠐⠐⠔"] # 0x2715 (multiplication X) + - "⟧": [t: "â šâ Ÿ"] # 0x27E7 (right barred bracket) + - "âȘ„": [t: "⠐⠜⠐⠣"] # 0x2AA5 (greater than sign followed by less than sign) diff --git a/src/braille.rs b/src/braille.rs index 5399d0446..b368be66b 100644 --- a/src/braille.rs +++ b/src/braille.rs @@ -2,7 +2,7 @@ use strum_macros::Display; use sxd_document::dom::{Element, ChildOfElement}; use sxd_document::Package; -use crate::definitions::SPEECH_DEFINITIONS; +use crate::definitions::BRAILLE_DEFINITIONS; use crate::errors::*; use crate::pretty_print::mml_to_string; use crate::prefs::PreferenceManager; @@ -40,6 +40,7 @@ pub fn braille_mathml(mathml: Element, nav_node_id: &str) -> Result<(String, usi "Vietnam" => vietnam_cleanup(pref_manager, braille_string), "CMU" => cmu_cleanup(pref_manager, braille_string), "Finnish" => finnish_cleanup(pref_manager, braille_string), + "French" => french_cleanup(pref_manager, braille_string), "Swedish" => swedish_cleanup(pref_manager, braille_string), "LaTeX" => LaTeX_cleanup(pref_manager, braille_string), "ASCIIMath" => ASCIIMath_cleanup(pref_manager, braille_string), @@ -2046,6 +2047,97 @@ fn swedish_cleanup(pref_manager: Ref, raw_braille: String) -> return result.to_string(); } +static FRENCH_INDICATOR_REPLACEMENTS: phf::Map<&str, &str> = phf_map! { + // FIX: this needs to be fully checked against the French spec + // FIX: this needs cleaning up -- not all of these are used + "S" => "XXX", // sans-serif -- from prefs + "B" => "â ž", // bold + "đ”č" => "XXX", // blackboard -- from prefs + "T" => "⠈", // script + "I" => "â ž", // italic + "R" => "", // roman + "E" => "â °", // English + "1" => "⠀", // Grade 1 symbol (used for number followed by a letter) + "L" => "", // Letter left in to assist in locating letters + "D" => "XXX", // German (Deutsche) -- from prefs + "G" => "⠘", // Greek + "V" => "XXX", // Greek Variants + // "H" => "â  â  ", // Hebrew + // "U" => "⠈⠈", // Russian + "C" => "â š", // capital + "𝑐" => "", // second or latter braille cell of a capital letter + "đ¶" => "â š", // capital that never should get whitespace in front (from chemical element) + "N" => "", // number indicator + "n" => "", // number indicator for drop numbers (special case with close parens) + "t" => "â ±", // shape terminator + "W" => "⠀", // whitespace" + "𝐖"=> "⠀", // whitespace + "s" => "⠆", // typeface single char indicator + "w" => "", // typeface word indicator + "e" => "", // typeface & capital terminator + "," => "⠂", // comma + "." => "â Č", // period + "-" => "-", // hyphen + "—" => "â  â €", // normal dash (2014) -- assume all normal dashes are unified here [RUEB appendix 3] + "―" => "⠐⠠⠀", // long dash (2015) -- assume all long dashes are unified here [RUEB appendix 3] + "(" => "â Š", // Not really needed, but done for consistancy with ")" + ")" => "â Ž", // Needed for rules with drop numbers to avoid mistaking for dropped 0 + "↑" => "â Ź", // superscript + "↓" => "â Ą", // subscript + "#" => "", // signals end of script + "Z" => "⠐", // signals end of index of root, integrand/lim from function ("zone change") + +}; + +fn french_cleanup(pref_manager: Ref, raw_braille: String) -> String { + // FIX: need to implement this -- this is just a copy of the Vietnam code + lazy_static! { + // Empty bases are ok if they follow whitespace + static ref EMPTY_BASE: Regex = Regex::new(r"(^|[W𝐖w])E").unwrap(); + } + debug!("french_cleanup: start={}", raw_braille); + // let result = typeface_to_word_mode(&raw_braille); + // let result = capitals_to_word_mode(&result); + + let result = raw_braille.replace("CG", "⠘") + .replace("đ”čC", "â ©") + .replace("DC", "â °"); + + debug!(" after typeface/caps={}", &result); + + // these typeforms need to get pulled from user-prefs as they are transcriber-defined + let double_struck = pref_manager.pref_to_string("Vietnam_DoubleStruck"); + let sans_serif = pref_manager.pref_to_string("Vietnam_SansSerif"); + let fraktur = pref_manager.pref_to_string("Vietnam_Fraktur"); + let greek_variant = pref_manager.pref_to_string("Vietnam_GreekVariant"); + + // This reuses the code just for getting rid of unnecessary "L"s and "N"s + let result = remove_unneeded_mode_changes(&result, UEB_Mode::Grade1, UEB_Duration::Passage); + debug!(" after removing mode changes={}", &result); + + + let result = EMPTY_BASE.replace_all(&result, "$1"); + let result = REPLACE_INDICATORS.replace_all(&result, |cap: &Captures| { + let matched_char = &cap[0]; + match matched_char { + "đ”č" => &double_struck, + "S" => &sans_serif, + "D" => &fraktur, + "V" => &greek_variant, + _ => match FRENCH_INDICATOR_REPLACEMENTS.get(matched_char) { + None => {error!("REPLACE_INDICATORS and FRENCH_INDICATOR_REPLACEMENTS are not in sync: missing '{}'", matched_char); ""}, + Some(&ch) => ch, + }, + } + }); + + // Remove unicode blanks at start and end -- do this after the substitutions because ',' introduces spaces + // let result = result.trim_start_matches('⠀').trim_end_matches('⠀'); + let result = COLLAPSE_SPACES.replace_all(&result, "⠀"); + + return result.to_string(); +} + #[allow(non_snake_case)] fn LaTeX_cleanup(_pref_manager: Ref, raw_braille: String) -> String { lazy_static! { @@ -2213,6 +2305,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 + "French" => BrailleChars:: get_braille_ueb_chars(node, text_range), // FIX: need to figure out what to implement _ => return Err(sxd_xpath::function::Error::Other(format!("get_braille_chars: unknown braille code '{}'", code))) }; return match result { @@ -2707,9 +2800,9 @@ impl NeedsToBeGrouped { // 'š', etc., brailles as two chars -- there probably is some exception list but I haven't found it -- these are the ones I know about return !((is_one_char && !['š', '″', '‮', '⁗'].contains(&first_char)) || // clause 8 // "lim", "cos", etc., appear not to get parens, but the rules don't mention it (tests show it) - IsInDefinition::is_defined_in(text, &SPEECH_DEFINITIONS, "FunctionNames").unwrap() || - IsInDefinition::is_defined_in(text, &SPEECH_DEFINITIONS, "Arrows").unwrap() || // clause 4 - IsInDefinition::is_defined_in(text, &SPEECH_DEFINITIONS, "GeometryShapes").unwrap()); // clause 5 + IsInDefinition::is_defined_in(text, &BRAILLE_DEFINITIONS, "FunctionNames").unwrap() || + IsInDefinition::is_defined_in(text, &BRAILLE_DEFINITIONS, "Arrows").unwrap() || // clause 4 + IsInDefinition::is_defined_in(text, &BRAILLE_DEFINITIONS, "GeometryShapes").unwrap()); // clause 5 }, "mrow" => { // check for bracketed exprs @@ -2751,6 +2844,82 @@ impl NeedsToBeGrouped { } } + + /// FIX: what needs to be implemented? + fn needs_grouping_for_french(mathml: Element, is_base: bool) -> bool { + use crate::xpath_functions::IsInDefinition; + let mut node_name = name(&mathml); + if mathml.attribute_value("data-roman-numeral").is_some() { + node_name = "mi"; // roman numerals don't follow number rules + } + + // FIX: the leaf rules are from UEB -- check the French rules + match node_name { + "mn" => { + if !is_base { + return false; + } // clause 1 + // two 'mn's can be adjacent, in which case we need to group the 'mn' to make it clear it is separate (see bug #204) + let parent = get_parent(mathml); // there is always a "math" node + let grandparent = if name(&parent) == "math" {parent} else {get_parent(parent)}; + if name(&grandparent) != "mrow" { + return false; + } + let preceding = parent.preceding_siblings(); + if preceding.len() < 2 { + return false; + } + // any 'mn' would be separated from this node by invisible times + let previous_child = as_element(preceding[preceding.len()-1]); + if name(&previous_child) == "mo" && as_text(previous_child) == "\u{2062}" { + let previous_child = as_element(preceding[preceding.len()-2]); + return name(&previous_child) == "mn" + } else { + return false; + } + }, + "mo" => { + return !is_base; // if in script, then what follows is assumed to be an operand in braille, but it isn't, so add grouping + }, + "mi" | "mtext" => { + let text = as_text(mathml); + let parent = get_parent(mathml); // there is always a "math" node + let parent_name = name(&parent); + return text.chars().count() > 1 && + parent_name != "mrow" && + !IsInDefinition::is_defined_in(text, &BRAILLE_DEFINITIONS, "FunctionNames").unwrap(); + }, + "mrow" => { + // check for bracketed exprs + if IsBracketed::is_bracketed(mathml, "", "", false, true) { + return false; + } + + // check for prefix at start + // example 7.12 has "2-" in superscript and is grouped, so we don't consider postfix ops + let children = mathml.children(); + if children.len() == 2 && + (name( &as_element(children[0])) == "mo") { + return false; + } + + if children.len() == 3 { + let child0 = as_element(children[0]); + let operator = as_element(children[1]); // invisible function op? + // debug!("needs_grouping_for_french: child0 ="); + if name(&operator) == "mo" && as_text(operator) == "\u{2061}" && + (name(&child0) == "mi" || name(&child0) == "mtext") && + IsInDefinition::is_defined_in(as_text(child0), &BRAILLE_DEFINITIONS, "TrigFunctionNames").unwrap() { + return false; + } + } + return true; + }, + "msub" | "msup" | "msubsup" => return true, + _ => return false, + } + } + // ordinals often have an irregular start (e.g., "half") before becoming regular. // if the number is irregular, return the ordinal form, otherwise return 'None'. fn needs_grouping_for_swedish(mathml: Element, is_base: bool) -> bool { @@ -2775,9 +2944,9 @@ impl NeedsToBeGrouped { // 'š', etc., brailles as two chars -- there probably is some exception list but I haven't found it -- these are the ones I know about return !((is_one_char && !['š', '″', '‮', '⁗'].contains(&first_char)) || // clause 8 // "lim", "cos", etc., appear not to get parens, but the rules don't mention it (tests show it) - IsInDefinition::is_defined_in(text, &SPEECH_DEFINITIONS, "FunctionNames").unwrap() || - IsInDefinition::is_defined_in(text, &SPEECH_DEFINITIONS, "Arrows").unwrap() || // clause 4 - IsInDefinition::is_defined_in(text, &SPEECH_DEFINITIONS, "GeometryShapes").unwrap()); // clause 5 + IsInDefinition::is_defined_in(text, &BRAILLE_DEFINITIONS, "FunctionNames").unwrap() || + IsInDefinition::is_defined_in(text, &BRAILLE_DEFINITIONS, "Arrows").unwrap() || // clause 4 + IsInDefinition::is_defined_in(text, &BRAILLE_DEFINITIONS, "GeometryShapes").unwrap()); // clause 5 }, "mrow" => { // check for bracketed exprs @@ -2863,9 +3032,9 @@ impl NeedsToBeGrouped { // 'š', etc., brailles as two chars -- there probably is some exception list but I haven't found it -- these are the ones I know about return !((is_one_char && !['š', '″', '‮', '⁗'].contains(&first_char)) || // clause 8 // "lim", "cos", etc., appear not to get parens, but the rules don't mention it (tests show it) - IsInDefinition::is_defined_in(text, &SPEECH_DEFINITIONS, "FunctionNames").unwrap() || - IsInDefinition::is_defined_in(text, &SPEECH_DEFINITIONS, "Arrows").unwrap() || // clause 4 - IsInDefinition::is_defined_in(text, &SPEECH_DEFINITIONS, "GeometryShapes").unwrap()); // clause 5 + IsInDefinition::is_defined_in(text, &BRAILLE_DEFINITIONS, "FunctionNames").unwrap() || + IsInDefinition::is_defined_in(text, &BRAILLE_DEFINITIONS, "Arrows").unwrap() || // clause 4 + IsInDefinition::is_defined_in(text, &BRAILLE_DEFINITIONS, "GeometryShapes").unwrap()); // clause 5 }, "mfrac" => return false, // clause 2 (test GTM 8.2(4) shows numeric fractions are not special) "msqrt" | "mroot" => return false, // clause 3 @@ -2906,6 +3075,7 @@ impl Function for NeedsToBeGrouped { "CMU" => NeedsToBeGrouped::needs_grouping_for_cmu(e, is_base), "UEB" => NeedsToBeGrouped::needs_grouping_for_ueb(e, is_base), "Finnish" => NeedsToBeGrouped::needs_grouping_for_finnish(e, is_base), + "French" => NeedsToBeGrouped::needs_grouping_for_french(e, is_base), "Swedish" => NeedsToBeGrouped::needs_grouping_for_swedish(e, is_base), _ => return Err(XPathError::Other(format!("NeedsToBeGrouped: braille code arg '{:?}' is not a known code ('UEB', 'CMU', or 'Swedish')", braille_code))), }; diff --git a/tests/braille/French/chemistry.rs b/tests/braille/French/chemistry.rs new file mode 100644 index 000000000..4af951eda --- /dev/null +++ b/tests/braille/French/chemistry.rs @@ -0,0 +1,47 @@ +// French braille tests for the basic mathml tags +// These tests are from the French braille authority's publication "NOTATION PIATHÉMATIQUE BRAILLE" (PremiĂšre Ă©dition janvier 2007) +// https://www.avh.asso.fr/sites/default/files/notation_mathematique_braille2_0.pdf +use crate::common::*; + +#[test] +fn bond_I_4_1() { + let expr= r#"H-H"#; + test_braille("French", expr, "⠚⠓⠀⠚⠓"); +} + +#[test] +fn bond_I_4_2() { + let expr= r#"O=O"#; + test_braille("French", expr, "â šâ •â ¶â šâ •"); +} + +#[test] +fn ion_II_1_3() { + let expr= r#"SO42-"#; + test_braille("French", expr, "⠹⠎⠹⠕⠱â čâ ˆâ °â Łâ €â †"); +} + +#[test] +fn equilibrium_III_5_1() { + let expr= r#"N2(g)+3H2(g)⇌2NH3(g)"#; + test_braille("French", expr, "â šâ â Łâ Šâ ›â Žâ –â ©â šâ “â Łâ Šâ ›â Žâ žâ »â Łâ šâ â šâ “â ©â Šâ ›â Ž"); +} + +#[test] +fn equilibrium_III_5_2() { + let expr= r#"2H2O + ⇌(2)(1)H3O++OH-"#; + test_braille("French", expr, " â Łâ šâ “â Łâ šâ •â °â žâ »â †â ąâ ąâ Šâ Łâ Žâ ˆâ ˆâ Šâ Ąâ Žâ šâ “â ©â šâ •â ˆâ °â –â †â –â šâ •â šâ “â ˆâ °â €â †"); +} + +#[test] +fn equilibrium_III_5_3() { + let expr= r#"R-CO-O- + H+R'-OH + ⇌hydrolyseestérification + R-CO-O- + R'+ + H2O"#; + test_braille("French", expr, " ⠚⠗⠀⠚⠉⠚⠕⠀⠚⠕⠀⠚⠓⠖⠚⠗⠄⠀⠚⠕⠚⠓ â žâ »â šâ ąâ °â “â œâ ™â —â •â ‡â œâ Žâ ‘â †â šâ ”â ˆâ °â ‘â Žâ žâ —â Šâ ‹â Šâ ‰â â žâ Šâ •â â †â šâ —â €â šâ ‰â šâ •â €â šâ •â €â šâ —â „â –â šâ “â ąâ Łâ šâ •"); +} diff --git a/tests/braille/French/french.rs b/tests/braille/French/french.rs new file mode 100644 index 000000000..273c28f62 --- /dev/null +++ b/tests/braille/French/french.rs @@ -0,0 +1,138 @@ +// French braille tests for the basic mathml tags +// These tests are from the French braille authority's publication "NOTATION PIATHÉMATIQUE BRAILLE" (PremiĂšre Ă©dition janvier 2007) +// https://www.avh.asso.fr/sites/default/files/notation_mathematique_braille2_0.pdf +use crate::common::*; + +#[test] +fn fraction_7_1() { + let expr= r#"23=46"#; + test_braille("French", expr, "â Łâ Œâ ©â ¶â č⠌⠫"); +} + +#[test] +fn fraction_8_1() { + let expr= r#"a+ba"#; + test_braille("French", expr, "⠰⠁⠖⠃⠆⠌⠁"); +} + +#[test] +fn superscript_8_4() { + let expr= r#"e7"#; + test_braille("French", expr, "⠑⠈⠻"); +} + +#[test] +fn superscript_8_6() { + let expr= r#"e-π"#; + test_braille("French", expr, "⠑⠈⠀⠘⠏"); +} + +#[test] +fn subscript_9_2_1() { + let expr= r#"ap"#; + test_braille("French", expr, "⠁⠱⠏"); +} + +#[test] +fn subscript_9_2_3() { + let expr= r#"un+1"#; + test_braille("French", expr, "â „â ąâ °â â –â Ąâ †"); +} + +#[test] +fn scripts_9_4_1() { + let expr= r#"a0'"#; + test_braille("French", expr, "â â „â ąâ Œ"); +} + +#[test] +fn scripts_9_4_3() { + let expr= r#"Cmp= + Cmm-p"#; + test_braille("French", expr, "â šâ ‰â ąâ â ˆâ â ¶â šâ ‰â ąâ â ˆâ °â â €â â †"); +} + +#[test] +fn scripts_9_5_1() { + let expr= r#"At"#; + test_braille("French", expr, "⠈⠞⠹⠁"); +} + +#[test] +fn chem_9_5_4() { + let expr= r#"O816"#; + test_braille("French", expr, "â šâ •â  â ąâ łâ  â ˆâ Ąâ «"); +} + +#[test] +fn root_10_3() { + let expr= r#"(a+b)36= + a+b"#; + test_braille("French", expr, "⠈⠫⠜⠰⠊⠁⠖⠃⠎⠈⠩⠆⠶⠜⠰⠁⠖⠃⠆"); +} + +#[test] +fn accent_12_1() { + let expr= r#"v→"#; + test_braille("French", expr, "⠹⠒⠧"); +} + +#[test] +fn accent_12_2() { + let expr= r#"AB¯"#; + test_braille("French", expr, "⠾⠒⠹⠁⠹⠃"); +} + +#[test] +fn accent_12_3() { + let expr= r#"AB⌒"#; + test_braille("French", expr, "⠈⠒⠹⠁⠹⠃"); +} + +#[test] +fn accent_12_5() { + let expr= r#"(Ox,Oy)^"#; + test_braille("French", expr, "⠘⠒⠊⠚⠕⠭⠂⠚⠕⠜⠎"); +} + +#[test] +fn equations_13_4_1() { + init_logger(); + let expr= r#" + 2x+3y=5 + 3x-7y=8 + "#; + test_braille("French", expr, "â žâ Šâ Łâ ­â –â ©â œâ ¶â ±â €â  â œâ €â ©â ­â €â »â œâ ¶â ł"); +} + +#[test] +fn lim_14_3() { + let expr= r#"limx→+∞ + ln(x+2)x=0"#; + test_braille("French", expr, " â ‡â Šâ â ąâ ąâ °â ­â žâ ±â –â ˜â ‰â †â ‡â â Šâ ­â –â Łâ Žâ Œâ ­â ¶â Œ"); +} + +#[test] +fn integral_14_4_3() { + let expr= r#"∯Sf(x,y)dxdy"#; + test_braille("French", expr, "â šâ Żâ Żâ ąâ šâ Žâ ‹â Šâ ­â ‚â œâ Žâ ™â ­â ™â œ"); +} + +#[test] +fn log_14_5_1() { + let expr= r#"lnab"#; + test_braille("French", expr, "⠇⠝⠩⠁⠌⠃⠮"); +} + +#[test] +fn log_14_5_3() { + let expr= r#"log7x= + lnxln7"#; + test_braille("French", expr, "â ‡â •â ›â ąâ »â °â ­â †â ¶â ‡â â °â ­â †â Œâ ‡â â °â »â †"); +} + +#[test] +fn symbols_15_1() { + let expr= r#"∃x:x∈A"#; + test_braille("French", expr, "⠾⠡⠭⠒⠭⠘⠡⠹⠁"); +} From 7b7570941dd1138648e413c325db48587814501a Mon Sep 17 00:00:00 2001 From: NSoiffer Date: Fri, 27 Sep 2024 15:30:35 -0700 Subject: [PATCH 002/162] Added a table of atomic numbers for the elements and added a test for atomic numbers in prescripts to bump up their liklihood number. This allows single character elements with pre subscripts that match their atomic number to be considered chemistry. --- src/chemistry.rs | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/src/chemistry.rs b/src/chemistry.rs index 10c99af9b..17244e04e 100644 --- a/src/chemistry.rs +++ b/src/chemistry.rs @@ -376,7 +376,7 @@ pub fn convert_leaves_to_chem_elements(mathml: Element) -> Option> return None; // can't be an chemical letter } let chem_element = unsafe{ str::from_utf8_unchecked(&bytes_str[..n]) }; - if CHEMICAL_ELEMENTS.contains_key( chem_element ) { + if CHEMICAL_ELEMENT_ELECTRONEGATIVITIES.contains_key( chem_element ) { return Some( new_chemical_element(doc, chem_element) ); } @@ -1109,7 +1109,7 @@ fn likely_chem_formula(mathml: Element) -> isize { fn is_order_ok(mrow: Element) -> bool { assert_eq!(name(&mrow), "mrow"); if let Some(elements) = collect_elements(mrow) { - if elements.iter().any(|&e| !CHEMICAL_ELEMENTS.contains_key(e)) { + if elements.iter().any(|&e| !CHEMICAL_ELEMENT_ELECTRONEGATIVITIES.contains_key(e)) { return false; } let n_elements = elements.len(); @@ -1207,7 +1207,7 @@ fn is_ordered_by_electronegativity(elements: &[&str]) -> bool { // HPO_4^2 (Monohydrogen phosphate) doesn't fit this pattern, nor does HCO_3^- (Hydrogen carbonate) and some others // FIX: drop "H" from the ordering?? assert!(!elements.len() > 1); // already handled - return elements.windows(2).all(|pair| CHEMICAL_ELEMENTS.get(pair[0]).unwrap() < CHEMICAL_ELEMENTS.get(pair[1]).unwrap()); + return elements.windows(2).all(|pair| CHEMICAL_ELEMENT_ELECTRONEGATIVITIES.get(pair[0]).unwrap() < CHEMICAL_ELEMENT_ELECTRONEGATIVITIES.get(pair[1]).unwrap()); } fn is_generalized_salt(elements: &[&str]) -> bool { @@ -1300,7 +1300,16 @@ pub fn likely_adorned_chem_formula(mathml: Element) -> isize { // fix could make sure they are integers likelihood += 1; // looking like an atomic number if pre_subscript_name == "mn" { - likelihood += 1; // looking even more like an atomic number + // make sure the atomic number matches the base + let base = as_element(children[0]); + let base_name = name(&base); + if base_name == "mi" || base_name == "mtext" { + if let Some(atomic_number) = CHEMICAL_ELEMENT_ATOMIC_NUMBER.get(as_text(base)) { + if as_text(pre_subscript) == &atomic_number.to_string() { + likelihood = CHEMISTRY_THRESHOLD; + } + } + } } } else { return NOT_CHEMISTRY; @@ -1696,7 +1705,7 @@ fn convert_to_short_form(mathml: Element) -> Result { /// That list uses a horizontal line for the Lanthanide and Actinide Series. /// Because I had already ordered the elements before realizing that, I opened a gap and started the higher ones again with a '1' in front. /// The list is missing recent (unstable) elements -- I added them with the same value as the element above them in the periodic table. -static CHEMICAL_ELEMENTS: phf::Map<&str, u32> = phf_map! { +static CHEMICAL_ELEMENT_ELECTRONEGATIVITIES: phf::Map<&str, u32> = phf_map! { "Ac" => 40, "Ag" => 155, "Al" => 163, "Am" => 29, "Ar" => 4, "As" => 172, "At" => 181, "Au" => 154, "B" => 164, "Ba" => 14, "Be" => 18, "Bh" => 137, "Bi" => 170, "Bk" => 27, "Br" => 183, "C" => 169, "Ca" => 16, "Cd" => 158, "Ce" => 56, "Cf" => 26, "Cl" => 184, "Cm" => 28, "Cn" => 157, "Co" => 148, "Cr" => 136, "Cs" => 8, "Cu" => 156, @@ -1716,6 +1725,23 @@ static CHEMICAL_ELEMENTS: phf::Map<&str, u32> = phf_map! { "Me" => 0, "Et" => 0, "R" => 0, /* "Ac" => 0, */ "Ph" => 0, "X" => 0, /* treated as an unknown */ }; + +// A map of the chemical elements and their atomic numbers +static CHEMICAL_ELEMENT_ATOMIC_NUMBER: phf::Map<&str, u32> = phf_map! { + "H" => 1, "He" => 2, "Li" => 3, "Be" => 4, "B" => 5, "C" => 6, "N" => 7, "O" => 8, "F" => 9, "Ne" => 10, + "Na" => 11, "Mg" => 12, "Al" => 13, "Si" => 14, "P" => 15, "S" => 16, "Cl" => 17, "Ar" => 18, "K" => 19, "Ca" => 20, + "Sc" => 21, "Ti" => 22, "V" => 23, "Cr" => 24, "Mn" => 25, "Fe" => 26, "Co" => 27, "Ni" => 28, "Cu" => 29, "Zn" => 30, + "Ga" => 31, "Ge" => 32, "As" => 33, "Se" => 34, "Br" => 35, "Kr" => 36, "Rb" => 37, "Sr" => 38, "Y" => 39, "Zr" => 40, + "Nb" => 41, "Mo" => 42, "Tc" => 43, "Ru" => 44, "Rh" => 45, "Pd" => 46, "Ag" => 47, "Cd" => 48, "In" => 49, "Sn" => 50, + "Sb" => 51, "Te" => 52, "I" => 53, "Xe" => 54, "Cs" => 55, "Ba" => 56, "La" => 57, "Ce" => 58, "Pr" => 59, "Nd" => 60, + "Pm" => 61, "Sm" => 62, "Eu" => 63, "Gd" => 64, "Tb" => 65, "Dy" => 66, "Ho" => 67, "Er" => 68, "Tm" => 69, "Yb" => 70, + "Lu" => 71, "Hf" => 72, "Ta" => 73, "W" => 74, "Re" => 75, "Os" => 76, "Ir" => 77, "Pt" => 78, "Au" => 79, "Hg" => 80, + "Tl" => 81, "Pb" => 82, "Bi" => 83, "Po" => 84, "At" => 85, "Rn" => 86, "Fr" => 87, "Ra" => 88, "Ac" => 89, "Th" => 90, + "Pa" => 91, "U" => 92, "Np" => 93, "Pu" => 94, "Am" => 95, "Cm" => 96, "Bk" => 97, "Cf" => 98, "Es" => 99, "Fm" => 100, + "Md" => 101, "No" => 102, "Lr" => 103, "Rf" => 104, "Db" => 105, "Sg" => 106, "Bh" => 107, "Hs" => 108, "Mt" => 109, "Ds" => 110, + "Rg" => 111, "Cn" => 112, "Nh" => 113, "Fl" => 114, "Mc" => 115, "Lv" => 116, "Ts" => 117, "Og" => 118, +}; + pub fn is_chemical_element(node: Element) -> bool { // FIX: allow name to be in an mrow (e.g., Na let name = name(&node); @@ -1724,7 +1750,7 @@ pub fn is_chemical_element(node: Element) -> bool { } let text = as_text(node); - return CHEMICAL_ELEMENTS.contains_key(text); + return CHEMICAL_ELEMENT_ELECTRONEGATIVITIES.contains_key(text); } From 5136cb34d86715d6f2bf2f4611f94a7eb28a8506 Mon Sep 17 00:00:00 2001 From: NSoiffer Date: Fri, 27 Sep 2024 15:47:02 -0700 Subject: [PATCH 003/162] renamed test --- tests/braille/French/french.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/braille/French/french.rs b/tests/braille/French/french.rs index 273c28f62..b2f873952 100644 --- a/tests/braille/French/french.rs +++ b/tests/braille/French/french.rs @@ -106,7 +106,7 @@ fn equations_13_4_1() { } #[test] -fn lim_14_3() { +fn lim_14_2_3() { let expr= r#"limx→+∞ ln(x+2)x=0"#; test_braille("French", expr, " â ‡â Šâ â ąâ ąâ °â ­â žâ ±â –â ˜â ‰â †â ‡â â Šâ ­â –â Łâ Žâ Œâ ­â ¶â Œ"); From 4ccda5f59813e110ef799b3440760567c185e2ec Mon Sep 17 00:00:00 2001 From: NSoiffer Date: Thu, 29 May 2025 21:36:04 -0700 Subject: [PATCH 004/162] Update braille.rs to compile after merging. Add French to the braille testing file. New French braille tests. --- src/braille.rs | 18 +- tests/braille.rs | 4 + tests/braille/French/french.rs | 443 +++++++++++++++++++++++++++++---- 3 files changed, 405 insertions(+), 60 deletions(-) diff --git a/src/braille.rs b/src/braille.rs index dddc77f6f..3f3dca9b1 100644 --- a/src/braille.rs +++ b/src/braille.rs @@ -2933,7 +2933,7 @@ impl NeedsToBeGrouped { /// FIX: what needs to be implemented? fn needs_grouping_for_french(mathml: Element, is_base: bool) -> bool { use crate::xpath_functions::IsInDefinition; - let mut node_name = name(&mathml); + let mut node_name = name(mathml); if mathml.attribute_value("data-roman-numeral").is_some() { node_name = "mi"; // roman numerals don't follow number rules } @@ -2946,8 +2946,8 @@ impl NeedsToBeGrouped { } // clause 1 // two 'mn's can be adjacent, in which case we need to group the 'mn' to make it clear it is separate (see bug #204) let parent = get_parent(mathml); // there is always a "math" node - let grandparent = if name(&parent) == "math" {parent} else {get_parent(parent)}; - if name(&grandparent) != "mrow" { + let grandparent = if name(parent) == "math" {parent} else {get_parent(parent)}; + if name(grandparent) != "mrow" { return false; } let preceding = parent.preceding_siblings(); @@ -2956,9 +2956,9 @@ impl NeedsToBeGrouped { } // any 'mn' would be separated from this node by invisible times let previous_child = as_element(preceding[preceding.len()-1]); - if name(&previous_child) == "mo" && as_text(previous_child) == "\u{2062}" { + if name(previous_child) == "mo" && as_text(previous_child) == "\u{2062}" { let previous_child = as_element(preceding[preceding.len()-2]); - return name(&previous_child) == "mn" + return name(previous_child) == "mn" } else { return false; } @@ -2969,7 +2969,7 @@ impl NeedsToBeGrouped { "mi" | "mtext" => { let text = as_text(mathml); let parent = get_parent(mathml); // there is always a "math" node - let parent_name = name(&parent); + let parent_name = name(parent); return text.chars().count() > 1 && parent_name != "mrow" && !IsInDefinition::is_defined_in(text, &BRAILLE_DEFINITIONS, "FunctionNames").unwrap(); @@ -2984,7 +2984,7 @@ impl NeedsToBeGrouped { // example 7.12 has "2-" in superscript and is grouped, so we don't consider postfix ops let children = mathml.children(); if children.len() == 2 && - (name( &as_element(children[0])) == "mo") { + (name( as_element(children[0])) == "mo") { return false; } @@ -2992,8 +2992,8 @@ impl NeedsToBeGrouped { let child0 = as_element(children[0]); let operator = as_element(children[1]); // invisible function op? // debug!("needs_grouping_for_french: child0 ="); - if name(&operator) == "mo" && as_text(operator) == "\u{2061}" && - (name(&child0) == "mi" || name(&child0) == "mtext") && + if name(operator) == "mo" && as_text(operator) == "\u{2061}" && + (name(child0) == "mi" || name(child0) == "mtext") && IsInDefinition::is_defined_in(as_text(child0), &BRAILLE_DEFINITIONS, "TrigFunctionNames").unwrap() { return false; } diff --git a/tests/braille.rs b/tests/braille.rs index d2406f23b..50331fdbe 100644 --- a/tests/braille.rs +++ b/tests/braille.rs @@ -33,5 +33,9 @@ mod braille { mod augenbit; mod other; } + + mod French { + mod french; + } } diff --git a/tests/braille/French/french.rs b/tests/braille/French/french.rs index b2f873952..46756ae44 100644 --- a/tests/braille/French/french.rs +++ b/tests/braille/French/french.rs @@ -4,135 +4,476 @@ use crate::common::*; #[test] -fn fraction_7_1() { - let expr= r#"23=46"#; +fn test_6_4_01() { + let expr= r#"E={a,b,c,d}"#; + test_braille("French", expr, "⠚⠑⠶⠚⠊⠁⠂⠃⠂⠉⠂⠙⠚⠎"); +} + +#[test] +fn test_6_4_02() { + let expr= r#"ℝ*=]−∞,0[âˆȘ]0,+∞["#; + test_braille("French", expr, "⠚⠚⠗⠈⠐⠔⠶⠟⠀⠘⠉⠂⠌⠷⠞⠖⠟⠌⠂⠖⠘⠉⠷"); +} + +#[test] +fn test_6_4_03() { + let expr= r#"x∈[0,1;2,3]"#; + test_braille("French", expr, "â ­â ˜â Ąâ ·â Œâ ‚â Ąâ †â Łâ ‚â ©â Ÿ"); +} + +#[test] +fn test_6_4_04() { + let expr= r#"x∉ℝ+"#; + test_braille("French", expr, "⠭⠘⠌⠹⠹⠗⠈⠖"); +} + +#[test] +fn test_6_4_05() { + let expr= r#"D⊂F"#; + test_braille("French", expr, "⠹⠙⠹⠡⠹⠋"); +} + +#[test] +fn test_6_4_06() { + let expr= r#"D⊄E"#; + test_braille("French", expr, "⠹⠙⠹⠌⠹⠑"); +} + +#[test] +fn test_6_4_07() { + let expr= r#"A⊆B"#; + test_braille("French", expr, "⠚⠁⠞⠚⠥⠚⠃"); +} + +#[test] +fn test_6_4_08() { + let expr= r#"A∩B=⌀"#; + test_braille("French", expr, "⠚⠁⠘⠖⠚⠃⠶⠘⠌"); +} + +#[test] +fn test_6_4_09() { + let expr= r#"∁EF"#; + test_braille("French", expr, "â šâ ©â ąâ šâ ‘â šâ ‹"); +} + +#[test] +fn test_7_01() { + let expr= r#"23=46"#; test_braille("French", expr, "â Łâ Œâ ©â ¶â č⠌⠫"); } #[test] -fn fraction_8_1() { +fn test_7_02() { + let expr= r#"1Ă·2=0,5"#; + test_braille("French", expr, "â Ąâ ’â Łâ ¶â Œâ ‚â ±"); +} + +#[test] +fn test_8_01() { let expr= r#"a+ba"#; - test_braille("French", expr, "⠰⠁⠖⠃⠆⠌⠁"); + test_braille("French", expr, "⠠⠄⠰⠁⠖⠃⠆⠌⠁"); +} + +#[test] +fn test_8_02() { + let expr= r#"a+bc+d"#; + test_braille("French", expr, "⠠⠄⠰⠁⠖⠃⠆⠌⠰⠉⠖⠙⠆"); } #[test] -fn superscript_8_4() { +fn test_8_03() { + let expr= r#"ab+cd=ad+bcbd"#; + test_braille("French", expr, "⠠⠄⠁⠌⠃⠖⠉⠌⠙⠶⠰⠁⠙⠖⠃⠉⠆⠌⠃⠙"); +} + +#[test] +fn test_8_04() { + let expr= r#"CardE=5"#; + test_braille("French", expr, "⠠⠄⠚⠉⠁⠗⠙⠰⠚⠑⠆⠶⠱"); +} + +#[test] +fn test_8_05() { + let expr= r#"ex+3"#; + test_braille("French", expr, "⠠⠄⠑⠈⠰⠭⠖⠩⠆"); +} + +#[test] +fn test_8_06() { let expr= r#"e7"#; - test_braille("French", expr, "⠑⠈⠻"); + test_braille("French", expr, "⠠⠑⠈⠻"); +} + +#[test] +fn test_8_07() { + let expr= r#"e−x"#; + test_braille("French", expr, "⠠⠑⠈⠀⠭"); +} + +#[test] +fn test_8_08() { + let expr= r#"e−π"#; + test_braille("French", expr, "⠠⠑⠈⠀⠘⠏"); +} + +#[test] +fn test_8_09() { + let expr= r#"x−1=1x"#; + test_braille("French", expr, "â  â ­â ˆâ €â Ąâ ¶â Ąâ Œâ ­"); +} + +#[test] +fn test_9_1_01() { + let expr= r#"aâ€Č"#; + test_braille("French", expr, "⠁⠄"); +} + +#[test] +fn test_9_1_02() { + let expr= r#"x″"#; + test_braille("French", expr, "⠭⠄⠄"); } #[test] -fn superscript_8_6() { - let expr= r#"e-π"#; - test_braille("French", expr, "⠑⠈⠀⠘⠏"); +fn test_9_1_03() { + let expr= r#"aâ€Čx+a″y+a‮z"#; + test_braille("French", expr, "⠁⠄⠭⠖⠁⠄⠄⠜⠖⠁⠄⠄⠄⠔"); } #[test] -fn subscript_9_2_1() { +fn test_9_2_01() { let expr= r#"ap"#; test_braille("French", expr, "⠁⠱⠏"); } #[test] -fn subscript_9_2_3() { +fn test_9_2_02() { + let expr= r#"x0"#; + test_braille("French", expr, "â ­â ąâ Œ"); +} + +#[test] +fn test_9_2_03() { let expr= r#"un+1"#; test_braille("French", expr, "â „â ąâ °â â –â Ąâ †"); } #[test] -fn scripts_9_4_1() { - let expr= r#"a0'"#; +fn test_9_3_01() { + let expr= r#"x2"#; + test_braille("French", expr, "⠭⠈⠣"); +} + +#[test] +fn test_9_3_02() { + let expr= r#"xp+q"#; + test_braille("French", expr, "⠭⠈⠰⠏⠖⠟⠆"); +} + +#[test] +fn test_9_3_03() { + let expr= r#"a−5,3"#; + test_braille("French", expr, "⠁⠈⠀⠱⠂⠩"); +} + +#[test] +fn test_9_3_04() { + let expr= r#"aπ"#; + test_braille("French", expr, "⠁⠈⠘⠏"); +} + +#[test] +fn test_9_3_05() { + let expr= r#"523≠523"#; + test_braille("French", expr, "â ±â ˆâ Łâ œâ ©â šâ ¶â ±â ˆâ °â Łâ œâ ©â †"); +} + +#[test] +fn test_9_3_06() { + let expr= r#"e−5x≠e−5x"#; + test_braille("French", expr, "⠑⠈⠰⠀⠱⠭⠆⠚⠶⠰⠑⠈⠀⠱⠆⠭"); +} + +#[test] +fn test_9_4_01() { + let expr= r#"aâ€Č0"#; test_braille("French", expr, "â â „â ąâ Œ"); } #[test] -fn scripts_9_4_3() { - let expr= r#"Cmp= - Cmm-p"#; +fn test_9_4_02() { + let expr= r#"x0â€Č2"#; + test_braille("French", expr, "â ­â „â ąâ Œâ ˆâ Ł"); +} + +#[test] +fn test_9_4_03() { + let expr= r#"∁mp=∁mm−p"#; test_braille("French", expr, "â šâ ‰â ąâ â ˆâ â ¶â šâ ‰â ąâ â ˆâ °â â €â â †"); } #[test] -fn scripts_9_5_1() { - let expr= r#"At"#; +fn test_9_4_04() { + let expr= r#"am+nâ€Čp+q"#; + test_braille("French", expr, "⠁⠄⠄⠱⠰⠍⠖⠝⠆⠈⠰⠏⠖⠟⠆"); +} + +#[test] +fn test_9_4_05() { + let expr= r#"ℝ+*"#; + test_braille("French", expr, "⠹⠹⠗⠱⠖⠈⠐⠔"); +} + +#[test] +fn test_9_5_01() { + let expr= r#"tA"#; test_braille("French", expr, "⠈⠞⠹⠁"); } #[test] -fn chem_9_5_4() { - let expr= r#"O816"#; +fn test_9_5_02() { + let expr= r#"2w"#; + test_braille("French", expr, "â ąâ Łâ ș"); +} + +#[test] +fn test_9_5_03() { + let expr= r#"tAtB"#; + test_braille("French", expr, "⠰⠈⠞⠹⠁⠆⠰⠈⠞⠹⠃⠆"); +} + +#[test] +fn test_9_5_04() { + let expr= r#"816O"#; test_braille("French", expr, "â šâ •â  â ąâ łâ  â ˆâ Ąâ «"); } #[test] -fn root_10_3() { - let expr= r#"(a+b)36= - a+b"#; +fn test_10_01() { + let expr= r#"2"#; + test_braille("French", expr, "⠜⠣"); +} + +#[test] +fn test_10_02() { + let expr= r#"a4"#; + test_braille("French", expr, "⠈â č⠜⠁"); +} + +#[test] +fn test_10_03() { + let expr= r#"(a+b)36=a+b"#; test_braille("French", expr, "⠈⠫⠜⠰⠊⠁⠖⠃⠎⠈⠩⠆⠶⠜⠰⠁⠖⠃⠆"); } #[test] -fn accent_12_1() { - let expr= r#"v→"#; +fn test_10_04() { + let expr= r#"a+a+b3"#; + test_braille("French", expr, "⠈⠩⠜⠰⠁⠖⠜⠰⠁⠖⠃⠆⠆"); +} + +#[test] +fn test_10_05() { + let expr= r#"a4b3"#; + test_braille("French", expr, "⠰⠈â č⠜⠁⠆⠰⠈⠩⠜⠃⠆"); +} + +#[test] +fn test_11_01() { + let expr= r#"f:ℝ→ℝ,x↩y=1x"#; + test_braille("French", expr, "â ’â šâ šâ —â žâ ±â šâ šâ —â ­â â ±â œâ ¶â Ąâ Œâ ­"); +} + +#[test] +fn test_12_1_01() { + let expr= r#"v→"#; test_braille("French", expr, "⠹⠒⠧"); } #[test] -fn accent_12_2() { - let expr= r#"AB¯"#; +fn test_12_1_02() { + let expr= r#"ABÂŻ"#; test_braille("French", expr, "⠾⠒⠹⠁⠹⠃"); } #[test] -fn accent_12_3() { - let expr= r#"AB⌒"#; +fn test_12_1_03() { + let expr= r#"AB⏜"#; test_braille("French", expr, "⠈⠒⠹⠁⠹⠃"); } #[test] -fn accent_12_5() { - let expr= r#"(Ox,Oy)^"#; +fn test_12_1_04() { + let expr= r#"AOB̂"#; + test_braille("French", expr, "⠘⠒⠹⠁⠹⠕⠹⠃"); +} + +#[test] +fn test_12_1_05() { + let expr= r#"(Ox,Oy)̂"#; test_braille("French", expr, "⠘⠒⠊⠚⠕⠭⠂⠚⠕⠜⠎"); } #[test] -fn equations_13_4_1() { - init_logger(); - let expr= r#" - 2x+3y=5 - 3x-7y=8 - "#; - test_braille("French", expr, "â žâ Šâ Łâ ­â –â ©â œâ ¶â ±â €â  â œâ €â ©â ­â €â »â œâ ¶â ł"); +fn test_12_1_06() { + let expr= r#"(OA→,OM→)̂"#; + test_braille("French", expr, "⠘⠒⠩⠹⠒⠹⠕⠹⠁⠂⠹⠒⠹⠕⠹⠍⠮"); +} + +#[test] +fn test_12_3_01() { + let expr= r#"(D)⫝̸(Δ)"#; + test_braille("French", expr, "⠩⠹⠙⠮⠾⠳⠩⠹⠘⠙⠮"); +} + +#[test] +fn test_12_3_02() { + let expr= r#"(AB)⊄(Aâ€ČBâ€Č)"#; + test_braille("French", expr, "⠩⠹⠁⠹⠃⠮⠘⠳⠩⠹⠁⠄⠹⠃⠄⠮"); +} + +#[test] +fn test_13_2_01() { + let expr= r#"|x0|"#; + test_braille("French", expr, "â żâ ­â ąâ Œâ ż"); +} + +#[test] +fn test_13_2_02() { + let expr= r#"|a+ib|"#; + test_braille("French", expr, "⠿⠁⠖⠊⠃⠿"); +} + +#[test] +fn test_13_2_03() { + let expr= r#"∄ku→∄=|k|∄u→∄"#; + test_braille("French", expr, "â ˜â żâ …â šâ ’â „â ˜â żâ ¶â żâ …â żâ ˜â żâ šâ ’â „â ˜â ż"); +} + +#[test] +fn test_13_2_04() { + let expr= r#"f|E"#; + test_braille("French", expr, "⠋⠿⠹⠑"); +} + +#[test] +fn test_14_1_01() { + let expr= r#"f(x)"#; + test_braille("French", expr, "⠋⠩⠭⠮"); } #[test] -fn lim_14_2_3() { - let expr= r#"limx→+∞ - ln(x+2)x=0"#; - test_braille("French", expr, " â ‡â Šâ â ąâ ąâ °â ­â žâ ±â –â ˜â ‰â †â ‡â â Šâ ­â –â Łâ Žâ Œâ ­â ¶â Œ"); +fn test_14_1_02() { + let expr= r#"gâ€Č(x)=3x+4"#; + test_braille("French", expr, "⠛⠄⠊⠭⠎⠶⠩⠭⠖â č"); } #[test] -fn integral_14_4_3() { - let expr= r#"∯Sf(x,y)dxdy"#; +fn test_14_1_03() { + let expr= r#"f∘g(x)=f[g(x)]"#; + test_braille("French", expr, "⠋⠞⠌⠛⠊⠭⠎⠶⠋⠷⠛⠊⠭⠎⠟"); +} + +#[test] +fn test_14_1_04() { + let expr= r#"∂f(x,y)∂x=5xy−7x"#; + test_braille("French", expr, "⠐⠙⠋⠊⠭⠂⠜⠎⠌⠐⠙⠭⠶⠱⠭⠜⠀⠻⠭"); +} + +#[test] +fn test_14_2_01_corrected() { + let expr= r#"limx→+∞f(x)=0"#; + test_braille("French", expr, "â ‡â Šâ â ąâ ąâ °â ­â žâ ±â –â ˜â ‰â †â ‹â Šâ ­â Žâ ¶â Œ"); +} + +#[test] +fn test_14_2_02_corrected_1() { + let expr= r#"limx→4x>4f(x)=−∞"#; + test_braille("French", expr, "â ‡â Šâ â ąâ ąâ °â ­â žâ ±â č⠂⠭⠐⠜â č⠆⠋⠊⠭⠎⠶⠀⠘⠉"); +} + +#[test] +fn test_14_2_02_corrected_2() { + let expr= r#"limx→4x>4f(x)=−∞"#; + test_braille("French", expr, "â ‡â Šâ â ąâ ąâ °â ­â žâ ±â č⠂⠭⠐⠜â č⠆⠋⠊⠭⠎⠶⠀⠘⠉"); +} + +#[test] +fn test_14_2_03_corrected() { + let expr= r#"limx→+∞ln⁥(x+2)x=0"#; + test_braille("French", expr, "â ‡â Šâ â ąâ ąâ °â ­â žâ ±â –â ˜â ‰â †â °â ‡â â Šâ ­â –â Łâ Žâ Œâ ­â †â ¶â Œ"); +} + +#[test] +fn test_14_4_01() { + let expr= r#"∫abf(x)dx"#; + test_braille("French", expr, "⠯⠱⠁⠈⠃⠋⠩⠭⠮⠙⠭"); +} + +#[test] +fn test_14_4_03() { + let expr= r#"∫125xdx"#; + test_braille("French", expr, "â Żâ ąâ Ąâ ˆâ Łâ °â ±â ­â †â ™â ­"); +} + +#[test] +fn test_14_4_04() { + let expr= r#"∫(c)f(x)dx"#; + test_braille("French", expr, "⠯⠱⠩⠹⠉⠮⠋⠩⠭⠮⠙⠭"); +} + +#[test] +fn test_14_4_05() { + let expr= r#"∯Sf(x,y)dxdy"#; test_braille("French", expr, "â šâ Żâ Żâ ąâ šâ Žâ ‹â Šâ ­â ‚â œâ Žâ ™â ­â ™â œ"); } #[test] -fn log_14_5_1() { - let expr= r#"lnab"#; +fn test_14_5_01() { + let expr= r#"ln⁥(ab)"#; test_braille("French", expr, "⠇⠝⠩⠁⠌⠃⠮"); } #[test] -fn log_14_5_3() { - let expr= r#"log7x= - lnxln7"#; +fn test_14_5_02() { + let expr= r#"ln⁥xy=ln⁥x+ln⁥y"#; + test_braille("French", expr, "⠇⠝⠰⠭⠜⠆⠶⠇⠝⠰⠭⠆⠖⠇⠝⠰⠜⠆"); +} + +#[test] +fn test_14_5_03() { + let expr= r#"log7x=ln⁥xln⁥7"#; test_braille("French", expr, "â ‡â •â ›â ąâ »â °â ­â †â ¶â ‡â â °â ­â †â Œâ ‡â â °â »â †"); } #[test] -fn symbols_15_1() { - let expr= r#"∃x:x∈A"#; +fn test_14_6_01() { + let expr= r#"cos⁥(a+b)=cosacosb−sinasinb"#; + test_braille("French", expr, "⠉⠕⠎⠊⠁⠖⠃⠎⠶⠉⠕⠎⠰⠁⠆⠉⠕⠎⠰⠃⠆⠐⠀⠎⠊⠝⠰⠁⠆⠎⠊⠝⠰⠃⠆"); +} + +#[test] +fn test_14_6_01b() { + let expr= r#"cos⁥(a+b)=cosacosb−sinasinb"#; + test_braille("French", expr, "â šâ Źâ Šâ â –â ƒâ Žâ ¶â šâ Źâ â šâ Źâ ƒâ €â Źâ â Źâ ƒ"); +} + +#[test] +fn test_14_7_01() { + let expr= r#"cos⁥h2x−sin⁥h2x=1"#; + test_braille("French", expr, "â ‰â “â ˆâ Łâ °â ­â †â €â Žâ “â ˆâ Łâ °â ­â †â ¶â Ą"); +} + +#[test] +fn test_15_01() { + let expr= r#"∃x:x∈A"#; test_braille("French", expr, "⠾⠡⠭⠒⠭⠘⠡⠹⠁"); } + +#[test] +fn test_16_4_07() { + let expr= r#"(p+q)iĂšme"#; + test_braille("French", expr, "⠩⠏⠖⠟⠮⠈⠊⠼⠍"); +} + From c7eda2c2ba66bcf9509a5231c418a48627c1acc3 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Fri, 5 Jun 2026 23:49:06 -0700 Subject: [PATCH 005/162] Updated to main. Needed to update the format of the tests to match the others. --- src/braille.rs | 8 +- tests/braille/French/chemistry.rs | 31 +- tests/braille/French/french.rs | 481 ++++++++++++++++++------------ 3 files changed, 311 insertions(+), 209 deletions(-) diff --git a/src/braille.rs b/src/braille.rs index d42a3a976..348deb7b0 100644 --- a/src/braille.rs +++ b/src/braille.rs @@ -2212,10 +2212,8 @@ static FRENCH_INDICATOR_REPLACEMENTS: phf::Map<&str, &str> = phf_map! { fn french_cleanup(pref_manager: Ref, raw_braille: String) -> String { // FIX: need to implement this -- this is just a copy of the Vietnam code - lazy_static! { - // Empty bases are ok if they follow whitespace - static ref EMPTY_BASE: Regex = Regex::new(r"(^|[W𝐖w])E").unwrap(); - } + // Empty bases are ok if they follow whitespace + static EMPTY_BASE: LazyLock = LazyLock::new(|| Regex::new(r"(^|[W𝐖w])E").unwrap()); debug!("french_cleanup: start={}", raw_braille); // let result = typeface_to_word_mode(&raw_braille); // let result = capitals_to_word_mode(&result); @@ -2238,7 +2236,7 @@ fn french_cleanup(pref_manager: Ref, raw_braille: String) -> let result = EMPTY_BASE.replace_all(&result, "$1"); - let result = REPLACE_INDICATORS.replace_all(&result, |cap: &Captures| { + let result: Cow<'_, str> = REPLACE_INDICATORS.replace_all(&result, |cap: &Captures| { let matched_char = &cap[0]; match matched_char { "đ”č" => &double_struck, diff --git a/tests/braille/French/chemistry.rs b/tests/braille/French/chemistry.rs index 4af951eda..b5d4606a4 100644 --- a/tests/braille/French/chemistry.rs +++ b/tests/braille/French/chemistry.rs @@ -2,46 +2,53 @@ // These tests are from the French braille authority's publication "NOTATION PIATHÉMATIQUE BRAILLE" (PremiĂšre Ă©dition janvier 2007) // https://www.avh.asso.fr/sites/default/files/notation_mathematique_braille2_0.pdf use crate::common::*; +use anyhow::Result; #[test] -fn bond_I_4_1() { +fn bond_I_4_1() -> Result<()> { let expr= r#"H-H"#; - test_braille("French", expr, "⠚⠓⠀⠚⠓"); + test_braille("French", expr, "⠚⠓⠀⠚⠓")?; + return Ok(()); } #[test] -fn bond_I_4_2() { +fn bond_I_4_2() -> Result<()> { let expr= r#"O=O"#; - test_braille("French", expr, "â šâ •â ¶â šâ •"); + test_braille("French", expr, "â šâ •â ¶â šâ •")?; + return Ok(()); } #[test] -fn ion_II_1_3() { +fn ion_II_1_3() -> Result<()> { let expr= r#"SO42-"#; - test_braille("French", expr, "⠹⠎⠹⠕⠱â čâ ˆâ °â Łâ €â †"); + test_braille("French", expr, "⠹⠎⠹⠕⠱â čâ ˆâ °â Łâ €â †")?; + return Ok(()); } #[test] -fn equilibrium_III_5_1() { +fn equilibrium_III_5_1() -> Result<()> { let expr= r#"N2(g)+3H2(g)⇌2NH3(g)"#; - test_braille("French", expr, "â šâ â Łâ Šâ ›â Žâ –â ©â šâ “â Łâ Šâ ›â Žâ žâ »â Łâ šâ â šâ “â ©â Šâ ›â Ž"); + test_braille("French", expr, "â šâ â Łâ Šâ ›â Žâ –â ©â šâ “â Łâ Šâ ›â Žâ žâ »â Łâ šâ â šâ “â ©â Šâ ›â Ž")?; + return Ok(()); } #[test] -fn equilibrium_III_5_2() { +fn equilibrium_III_5_2() -> Result<()> { let expr= r#"2H2O ⇌(2)(1)H3O++OH-"#; - test_braille("French", expr, " â Łâ šâ “â Łâ šâ •â °â žâ »â †â ąâ ąâ Šâ Łâ Žâ ˆâ ˆâ Šâ Ąâ Žâ šâ “â ©â šâ •â ˆâ °â –â †â –â šâ •â šâ “â ˆâ °â €â †"); + test_braille("French", expr, " â Łâ šâ “â Łâ šâ •â °â žâ »â †â ąâ ąâ Šâ Łâ Žâ ˆâ ˆâ Šâ Ąâ Žâ šâ “â ©â šâ •â ˆâ °â –â †â –â šâ •â šâ “â ˆâ °â €â †")?; + return Ok(()); } #[test] -fn equilibrium_III_5_3() { +fn equilibrium_III_5_3() -> Result<()> { let expr= r#"R-CO-O- H+R'-OH ⇌hydrolyseestérification R-CO-O- R'+ H2O"#; - test_braille("French", expr, " ⠚⠗⠀⠚⠉⠚⠕⠀⠚⠕⠀⠚⠓⠖⠚⠗⠄⠀⠚⠕⠚⠓ â žâ »â šâ ąâ °â “â œâ ™â —â •â ‡â œâ Žâ ‘â †â šâ ”â ˆâ °â ‘â Žâ žâ —â Šâ ‹â Šâ ‰â â žâ Šâ •â â †â šâ —â €â šâ ‰â šâ •â €â šâ •â €â šâ —â „â –â šâ “â ąâ Łâ šâ •"); + test_braille("French", expr, " ⠚⠗⠀⠚⠉⠚⠕⠀⠚⠕⠀⠚⠓⠖⠚⠗⠄⠀⠚⠕⠚⠓ â žâ »â šâ ąâ °â “â œâ ™â —â •â ‡â œâ Žâ ‘â †â šâ ”â ˆâ °â ‘â Žâ žâ —â Šâ ‹â Šâ ‰â â žâ Šâ •â â †â šâ —â €â šâ ‰â šâ •â €â šâ •â €â šâ —â „â –â šâ “â ąâ Łâ šâ •")?; + return Ok(()); } diff --git a/tests/braille/French/french.rs b/tests/braille/French/french.rs index 0e6fb55be..0acd5bf56 100644 --- a/tests/braille/French/french.rs +++ b/tests/braille/French/french.rs @@ -4,587 +4,684 @@ // https://www.avh.asso.fr/sites/default/files/notation_mathematique_braille2_0.pdf use crate::common::*; +use anyhow::Result; #[test] -fn set_of_elements_6_4_01() { +fn set_of_elements_6_4_01() -> Result<()> { let expr= r#"E={a,b,c,d}"#; - test_braille("French", expr, "⠚⠑⠶⠚⠊⠁⠂⠃⠂⠉⠂⠙⠚⠎"); + test_braille("French", expr, "⠚⠑⠶⠚⠊⠁⠂⠃⠂⠉⠂⠙⠚⠎")?; + return Ok(()); } #[test] -fn set_r_definition_6_4_02() { +fn set_r_definition_6_4_02() -> Result<()> { let expr= r#"ℝ*=]−∞,0[âˆȘ]0,+∞["#; - test_braille("French", expr, "⠚⠚⠗⠈⠐⠔⠶⠟⠀⠘⠉⠂⠌⠷⠞⠖⠟⠌⠂⠖⠘⠉⠷"); + test_braille("French", expr, "⠚⠚⠗⠈⠐⠔⠶⠟⠀⠘⠉⠂⠌⠷⠞⠖⠟⠌⠂⠖⠘⠉⠷")?; + return Ok(()); } #[test] -fn set_belonging_6_4_03() { +fn set_belonging_6_4_03() -> Result<()> { let expr= r#"x∈[0,1;2,3]"#; - test_braille("French", expr, "â ­â ˜â Ąâ ·â Œâ ‚â Ąâ †â Łâ ‚â ©â Ÿ"); + test_braille("French", expr, "â ­â ˜â Ąâ ·â Œâ ‚â Ąâ †â Łâ ‚â ©â Ÿ")?; + return Ok(()); } #[test] -fn set_not_belong_tor_6_4_04() { +fn set_not_belong_tor_6_4_04() -> Result<()> { let expr= r#"x∉ℝ+"#; - test_braille("French", expr, "⠭⠘⠌⠹⠹⠗⠈⠖"); + test_braille("French", expr, "⠭⠘⠌⠹⠹⠗⠈⠖")?; + return Ok(()); } #[test] -fn set_included_6_4_05() { +fn set_included_6_4_05() -> Result<()> { let expr= r#"D⊂F"#; - test_braille("French", expr, "⠹⠙⠹⠡⠹⠋"); + test_braille("French", expr, "⠹⠙⠹⠡⠹⠋")?; + return Ok(()); } #[test] -fn set_not_included_6_4_06() { +fn set_not_included_6_4_06() -> Result<()> { let expr= r#"D⊄E"#; - test_braille("French", expr, "⠹⠙⠹⠌⠹⠑"); + test_braille("French", expr, "⠹⠙⠹⠌⠹⠑")?; + return Ok(()); } #[test] -fn set_included_or_equal_6_4_07() { +fn set_included_or_equal_6_4_07() -> Result<()> { let expr= r#"A⊆B"#; - test_braille("French", expr, "⠚⠁⠞⠚⠥⠚⠃"); + test_braille("French", expr, "⠚⠁⠞⠚⠥⠚⠃")?; + return Ok(()); } #[test] -fn set_intersection_6_4_08() { +fn set_intersection_6_4_08() -> Result<()> { let expr= r#"A∩B=⌀"#; - test_braille("French", expr, "⠚⠁⠘⠖⠚⠃⠶⠘⠌"); + test_braille("French", expr, "⠚⠁⠘⠖⠚⠃⠶⠘⠌")?; + return Ok(()); } #[test] -fn complement_of_6_4_09() { +fn complement_of_6_4_09() -> Result<()> { let expr= r#"∁EF"#; - test_braille("French", expr, "â šâ ©â ąâ šâ ‘â šâ ‹"); + test_braille("French", expr, "â šâ ©â ąâ šâ ‘â šâ ‹")?; + return Ok(()); } #[test] -fn fraction_01_7_01() { +fn fraction_01_7_01() -> Result<()> { let expr= r#"23=46"#; - test_braille("French", expr, "â Łâ Œâ ©â ¶â č⠌⠫"); + test_braille("French", expr, "â Łâ Œâ ©â ¶â č⠌⠫")?; + return Ok(()); } #[test] -fn devided_by_7_02() { +fn devided_by_7_02() -> Result<()> { let expr= r#"1Ă·2=0,5"#; - test_braille("French", expr, "â Ąâ ’â Łâ ¶â Œâ ‚â ±"); + test_braille("French", expr, "â Ąâ ’â Łâ ¶â Œâ ‚â ±")?; + return Ok(()); } #[test] -fn fraction_02_8_01() { +fn fraction_02_8_01() -> Result<()> { let expr= r#"a+ba"#; - test_braille("French", expr, "⠠⠄⠰⠁⠖⠃⠆⠌⠁"); + test_braille("French", expr, "⠠⠄⠰⠁⠖⠃⠆⠌⠁")?; + return Ok(()); } #[test] -fn fraction_03_8_02() { +fn fraction_03_8_02() -> Result<()> { let expr= r#"a+bc+d"#; - test_braille("French", expr, "⠠⠄⠰⠁⠖⠃⠆⠌⠰⠉⠖⠙⠆"); + test_braille("French", expr, "⠠⠄⠰⠁⠖⠃⠆⠌⠰⠉⠖⠙⠆")?; + return Ok(()); } #[test] -fn fraction_04_8_03() { +fn fraction_04_8_03() -> Result<()> { let expr= r#"ab+cd=ad+bcbd"#; - test_braille("French", expr, "⠠⠄⠁⠌⠃⠖⠉⠌⠙⠶⠰⠁⠙⠖⠃⠉⠆⠌⠃⠙"); + test_braille("French", expr, "⠠⠄⠁⠌⠃⠖⠉⠌⠙⠶⠰⠁⠙⠖⠃⠉⠆⠌⠃⠙")?; + return Ok(()); } #[test] -fn cardinal_8_04() { +fn cardinal_8_04() -> Result<()> { let expr= r#"CardE=5"#; - test_braille("French", expr, "⠠⠄⠚⠉⠁⠗⠙⠰⠚⠑⠆⠶⠱"); + test_braille("French", expr, "⠠⠄⠚⠉⠁⠗⠙⠰⠚⠑⠆⠶⠱")?; + return Ok(()); } #[test] -fn exponential_01_8_05() { +fn exponential_01_8_05() -> Result<()> { let expr= r#"ex+3"#; - test_braille("French", expr, "⠠⠄⠑⠈⠰⠭⠖⠩⠆"); + test_braille("French", expr, "⠠⠄⠑⠈⠰⠭⠖⠩⠆")?; + return Ok(()); } #[test] -fn exponential_02_8_06() { +fn exponential_02_8_06() -> Result<()> { let expr= r#"e7"#; - test_braille("French", expr, "⠠⠑⠈⠻"); + test_braille("French", expr, "⠠⠑⠈⠻")?; + return Ok(()); } #[test] -fn exponential_03_8_07() { +fn exponential_03_8_07() -> Result<()> { let expr= r#"e−x"#; - test_braille("French", expr, "⠠⠑⠈⠀⠭"); + test_braille("French", expr, "⠠⠑⠈⠀⠭")?; + return Ok(()); } #[test] -fn exponential_04_8_08() { +fn exponential_04_8_08() -> Result<()> { let expr= r#"e−π"#; - test_braille("French", expr, "⠠⠑⠈⠀⠘⠏"); + test_braille("French", expr, "⠠⠑⠈⠀⠘⠏")?; + return Ok(()); } #[test] -fn power_negativ_one_8_09() { +fn power_negativ_one_8_09() -> Result<()> { let expr= r#"x−1=1x"#; - test_braille("French", expr, "â  â ­â ˆâ €â Ąâ ¶â Ąâ Œâ ­"); + test_braille("French", expr, "â  â ­â ˆâ €â Ąâ ¶â Ąâ Œâ ­")?; + return Ok(()); } #[test] -fn prime_9_1_01() { +fn prime_9_1_01() -> Result<()> { let expr= r#"aâ€Č"#; - test_braille("French", expr, "⠁⠄"); + test_braille("French", expr, "⠁⠄")?; + return Ok(()); } #[test] -fn prime_dople_9_1_02() { +fn prime_dople_9_1_02() -> Result<()> { let expr= r#"x″"#; - test_braille("French", expr, "⠭⠄⠄"); + test_braille("French", expr, "⠭⠄⠄")?; + return Ok(()); } #[test] -fn prime_dople_triple_9_1_03() { +fn prime_dople_triple_9_1_03() -> Result<()> { let expr= r#"aâ€Čx+a″y+a‮z"#; - test_braille("French", expr, "⠁⠄⠭⠖⠁⠄⠄⠜⠖⠁⠄⠄⠄⠔"); + test_braille("French", expr, "⠁⠄⠭⠖⠁⠄⠄⠜⠖⠁⠄⠄⠄⠔")?; + return Ok(()); } #[test] -fn sub_a_p_9_2_01() { +fn sub_a_p_9_2_01() -> Result<()> { let expr= r#"ap"#; - test_braille("French", expr, "⠁⠱⠏"); + test_braille("French", expr, "⠁⠱⠏")?; + return Ok(()); } #[test] -fn sub_x_0__9_2_02() { +fn sub_x_0__9_2_02() -> Result<()> { let expr= r#"x0"#; - test_braille("French", expr, "â ­â ąâ Œ"); + test_braille("French", expr, "â ­â ąâ Œ")?; + return Ok(()); } #[test] -fn sub_u_n_plus_one_9_2_03() { +fn sub_u_n_plus_one_9_2_03() -> Result<()> { let expr= r#"un+1"#; - test_braille("French", expr, "â „â ąâ °â â –â Ąâ †"); + test_braille("French", expr, "â „â ąâ °â â –â Ąâ †")?; + return Ok(()); } #[test] -fn sup_x_2_9_3_01() { +fn sup_x_2_9_3_01() -> Result<()> { let expr= r#"x2"#; - test_braille("French", expr, "⠭⠈⠣"); + test_braille("French", expr, "⠭⠈⠣")?; + return Ok(()); } #[test] -fn sup_x_p_plus_q_9_3_02() { +fn sup_x_p_plus_q_9_3_02() -> Result<()> { let expr= r#"xp+q"#; - test_braille("French", expr, "⠭⠈⠰⠏⠖⠟⠆"); + test_braille("French", expr, "⠭⠈⠰⠏⠖⠟⠆")?; + return Ok(()); } #[test] -fn sup_x_negative_number_9_3_03() { +fn sup_x_negative_number_9_3_03() -> Result<()> { let expr= r#"a−5,3"#; - test_braille("French", expr, "⠁⠈⠀⠱⠂⠩"); + test_braille("French", expr, "⠁⠈⠀⠱⠂⠩")?; + return Ok(()); } #[test] -fn sup_a_pi_9_3_04() { +fn sup_a_pi_9_3_04() -> Result<()> { let expr= r#"aπ"#; - test_braille("French", expr, "⠁⠈⠘⠏"); + test_braille("French", expr, "⠁⠈⠘⠏")?; + return Ok(()); } #[test] -fn sup_5_formula_block_1_9_3_05() { +fn sup_5_formula_block_1_9_3_05() -> Result<()> { let expr= r#"523≠523"#; - test_braille("French", expr, "â ±â ˆâ Łâ œâ ©â šâ ¶â ±â ˆâ °â Łâ œâ ©â †"); + test_braille("French", expr, "â ±â ˆâ Łâ œâ ©â šâ ¶â ±â ˆâ °â Łâ œâ ©â †")?; + return Ok(()); } #[test] -fn sup_5_formula_block_0_9_3_06() { +fn sup_5_formula_block_0_9_3_06() -> Result<()> { let expr= r#"e−5x≠e−5x"#; - test_braille("French", expr, "⠑⠈⠰⠀⠱⠭⠆⠚⠶⠰⠑⠈⠀⠱⠆⠭"); + test_braille("French", expr, "⠑⠈⠰⠀⠱⠭⠆⠚⠶⠰⠑⠈⠀⠱⠆⠭")?; + return Ok(()); } #[test] -fn sub_a_prime_0_9_4_01() { +fn sub_a_prime_0_9_4_01() -> Result<()> { let expr= r#"aâ€Č0"#; - test_braille("French", expr, "â â „â ąâ Œ"); + test_braille("French", expr, "â â „â ąâ Œ")?; + return Ok(()); } #[test] -fn sub_mixt_0_9_4_02() { +fn sub_mixt_0_9_4_02() -> Result<()> { let expr= r#"x0â€Č2"#; - test_braille("French", expr, "â ­â „â ąâ Œâ ˆâ Ł"); + test_braille("French", expr, "â ­â „â ąâ Œâ ˆâ Ł")?; + return Ok(()); } #[test] -fn choose_9_4_03() { +fn choose_9_4_03() -> Result<()> { let expr= r#"∁mp=∁mm−p"#; - test_braille("French", expr, "â šâ ‰â ąâ â ˆâ â ¶â šâ ‰â ąâ â ˆâ °â â €â â †"); + test_braille("French", expr, "â šâ ‰â ąâ â ˆâ â ¶â šâ ‰â ąâ â ˆâ °â â €â â †")?; + return Ok(()); } #[test] -fn sub_sup_mixed_formulaq_9_4_04() { +fn sub_sup_mixed_formulaq_9_4_04() -> Result<()> { let expr= r#"am+nâ€Čp+q"#; - test_braille("French", expr, "⠁⠄⠄⠱⠰⠍⠖⠝⠆⠈⠰⠏⠖⠟⠆"); + test_braille("French", expr, "⠁⠄⠄⠱⠰⠍⠖⠝⠆⠈⠰⠏⠖⠟⠆")?; + return Ok(()); } #[test] -fn sub_sup_operators_9_4_05() { +fn sub_sup_operators_9_4_05() -> Result<()> { let expr= r#"ℝ+*"#; - test_braille("French", expr, "⠹⠹⠗⠱⠖⠈⠐⠔"); + test_braille("French", expr, "⠹⠹⠗⠱⠖⠈⠐⠔")?; + return Ok(()); } #[test] -fn left_sup_9_5_01() { +fn left_sup_9_5_01() -> Result<()> { let expr= r#"tA"#; - test_braille("French", expr, "⠈⠞⠹⠁"); + test_braille("French", expr, "⠈⠞⠹⠁")?; + return Ok(()); } #[test] -fn lef_sub_9_5_02() { +fn lef_sub_9_5_02() -> Result<()> { let expr= r#"2w"#; - test_braille("French", expr, "â ąâ Łâ ș"); + test_braille("French", expr, "â ąâ Łâ ș")?; + return Ok(()); } #[test] -fn left_right_sup_9_5_03() { +fn left_right_sup_9_5_03() -> Result<()> { let expr= r#"tAtB"#; - test_braille("French", expr, "⠰⠈⠞⠹⠁⠆⠰⠈⠞⠹⠃⠆"); + test_braille("French", expr, "⠰⠈⠞⠹⠁⠆⠰⠈⠞⠹⠃⠆")?; + return Ok(()); } #[test] -fn left_sub_sup_test_9_5_04() { +fn left_sub_sup_test_9_5_04() -> Result<()> { let expr= r#"816O"#; - test_braille("French", expr, "â šâ •â  â ąâ łâ  â ˆâ Ąâ «"); + test_braille("French", expr, "â šâ •â  â ąâ łâ  â ˆâ Ąâ «")?; + return Ok(()); } #[test] -fn bigsum_one_line_9_6_01() { +fn bigsum_one_line_9_6_01() -> Result<()> { let expr= r#"∑i=1nui=u1+u2+⋯+un"#; - test_braille("French", expr, "â šâ ˜â Žâ ąâ ąâ °â Šâ ¶â Ąâ †â ˆâ ˆâ â „â ąâ Šâ ¶â „â ąâ Ąâ –â „â ąâ Łâ –â Čâ Čâ Čâ –â „â ąâ "); + test_braille("French", expr, "â šâ ˜â Žâ ąâ ąâ °â Šâ ¶â Ąâ †â ˆâ ˆâ â „â ąâ Šâ ¶â „â ąâ Ąâ –â „â ąâ Łâ –â Čâ Čâ Čâ –â „â ąâ ")?; + return Ok(()); } #[test] -fn bigsum_two_lines_9_6_01() { +fn bigsum_two_lines_9_6_01() -> Result<()> { let expr= r#"∑i=1nui=u1+u2+⋯+un"#; test_braille("French", expr, " â šâ ˜â Žâ ąâ ąâ °â Šâ ¶â Ąâ †â ˆâ ˆâ â „â ąâ Šâ  -â ¶â „â ąâ Ąâ –â „â ąâ Łâ –â Čâ Čâ Čâ –â „â ąâ "); +â ¶â „â ąâ Ąâ –â „â ąâ Łâ –â Čâ Čâ Čâ –â „â ąâ ")?; + return Ok(()); } #[test] -fn bigsum_one_line_with_bloc_9_6_01() { +fn bigsum_one_line_with_bloc_9_6_01() -> Result<()> { let expr= r#"∑i=1nui=u1+u2+⋯+un"#; - test_braille("French", expr, "â šâ ˜â Žâ ąâ ąâ °â Šâ ¶â Ąâ †â ˆâ ˆâ â „â ąâ Šâ ¶â „â ąâ Ąâ –â „â ąâ Łâ –â Čâ Čâ Čâ –â „â ąâ "); + test_braille("French", expr, "â šâ ˜â Žâ ąâ ąâ °â Šâ ¶â Ąâ †â ˆâ ˆâ â „â ąâ Šâ ¶â „â ąâ Ąâ –â „â ąâ Łâ –â Čâ Čâ Čâ –â „â ąâ ")?; + return Ok(()); } #[test] -fn root_square_10_01() { +fn root_square_10_01() -> Result<()> { let expr= r#"2"#; - test_braille("French", expr, "⠜⠣"); + test_braille("French", expr, "⠜⠣")?; + return Ok(()); } #[test] -fn root_fourth_10_02() { +fn root_fourth_10_02() -> Result<()> { let expr= r#"a4"#; - test_braille("French", expr, "⠈â č⠜⠁"); + test_braille("French", expr, "⠈â č⠜⠁")?; + return Ok(()); } #[test] -fn square_formula_1_10_03() { +fn square_formula_1_10_03() -> Result<()> { let expr= r#"(a+b)36=a+b"#; - test_braille("French", expr, "⠈⠫⠜⠰⠊⠁⠖⠃⠎⠈⠩⠆⠶⠜⠰⠁⠖⠃⠆"); + test_braille("French", expr, "⠈⠫⠜⠰⠊⠁⠖⠃⠎⠈⠩⠆⠶⠜⠰⠁⠖⠃⠆")?; + return Ok(()); } #[test] -fn square_formula_2_10_04() { +fn square_formula_2_10_04() -> Result<()> { let expr= r#"a+a+b3"#; - test_braille("French", expr, "⠈⠩⠜⠰⠁⠖⠜⠰⠁⠖⠃⠆⠆"); + test_braille("French", expr, "⠈⠩⠜⠰⠁⠖⠜⠰⠁⠖⠃⠆⠆")?; + return Ok(()); } #[test] -fn square_formula_3_10_05() { +fn square_formula_3_10_05() -> Result<()> { let expr= r#"a4b3"#; - test_braille("French", expr, "⠰⠈â č⠜⠁⠆⠰⠈⠩⠜⠃⠆"); + test_braille("French", expr, "⠰⠈â č⠜⠁⠆⠰⠈⠩⠜⠃⠆")?; + return Ok(()); } #[test] -fn function_from_r_to_r_11_01() { +fn function_from_r_to_r_11_01() -> Result<()> { let expr= r#"f:ℝ→ℝ,x↩y=1x"#; - test_braille("French", expr, "â ’â šâ šâ —â žâ ±â šâ šâ —â ­â â ±â œâ ¶â Ąâ Œâ ­"); + test_braille("French", expr, "â ’â šâ šâ —â žâ ±â šâ šâ —â ­â â ±â œâ ¶â Ąâ Œâ ­")?; + return Ok(()); } #[test] -fn over_arrow_12_1_01() { +fn over_arrow_12_1_01() -> Result<()> { let expr= r#"v→"#; - test_braille("French", expr, "⠹⠒⠧"); + test_braille("French", expr, "⠹⠒⠧")?; + return Ok(()); } #[test] -fn over_barre_12_1_02() { +fn over_barre_12_1_02() -> Result<()> { let expr= r#"ABÂŻ"#; - test_braille("French", expr, "⠾⠒⠹⠁⠹⠃"); + test_braille("French", expr, "⠾⠒⠹⠁⠹⠃")?; + return Ok(()); } #[test] -fn over_arc_12_1_03() { +fn over_arc_12_1_03() -> Result<()> { let expr= r#"AB⏜"#; - test_braille("French", expr, "⠈⠒⠹⠁⠹⠃"); + test_braille("French", expr, "⠈⠒⠹⠁⠹⠃")?; + return Ok(()); } #[test] -fn over_large_hat_1_12_1_04() { +fn over_large_hat_1_12_1_04() -> Result<()> { let expr= r#"AOB̂"#; - test_braille("French", expr, "⠘⠒⠹⠁⠹⠕⠹⠃"); + test_braille("French", expr, "⠘⠒⠹⠁⠹⠕⠹⠃")?; + return Ok(()); } #[test] -fn over_large_hat_2_12_1_05() { +fn over_large_hat_2_12_1_05() -> Result<()> { let expr= r#"(Ox,Oy)̂"#; - test_braille("French", expr, "⠘⠒⠊⠚⠕⠭⠂⠚⠕⠜⠎"); + test_braille("French", expr, "⠘⠒⠊⠚⠕⠭⠂⠚⠕⠜⠎")?; + return Ok(()); } #[test] -fn over_large_hat_3_12_1_06() { +fn over_large_hat_3_12_1_06() -> Result<()> { let expr= r#"(OA→,OM→)̂"#; - test_braille("French", expr, "⠘⠒⠩⠹⠒⠹⠕⠹⠁⠂⠹⠒⠹⠕⠹⠍⠮"); + test_braille("French", expr, "⠘⠒⠩⠹⠒⠹⠕⠹⠁⠂⠹⠒⠹⠕⠹⠍⠮")?; + return Ok(()); } #[test] -fn parallel_d_delta_12_3_01() { +fn parallel_d_delta_12_3_01() -> Result<()> { let expr= r#"(D)⫝̸(Δ)"#; - test_braille("French", expr, "⠩⠹⠙⠮⠾⠳⠩⠹⠘⠙⠮"); + test_braille("French", expr, "⠩⠹⠙⠮⠾⠳⠩⠹⠘⠙⠮")?; + return Ok(()); } #[test] -fn perpendicular_12_3_02() { +fn perpendicular_12_3_02() -> Result<()> { let expr= r#"(AB)⊄(Aâ€ČBâ€Č)"#; - test_braille("French", expr, "⠩⠹⠁⠹⠃⠮⠘⠳⠩⠹⠁⠄⠹⠃⠄⠮"); + test_braille("French", expr, "⠩⠹⠁⠹⠃⠮⠘⠳⠩⠹⠁⠄⠹⠃⠄⠮")?; + return Ok(()); } #[test] -fn abs_13_2_01() { +fn abs_13_2_01() -> Result<()> { let expr= r#"|x0|"#; - test_braille("French", expr, "â żâ ­â ąâ Œâ ż"); + test_braille("French", expr, "â żâ ­â ąâ Œâ ż")?; + return Ok(()); } #[test] -fn modulus_13_2_02() { +fn modulus_13_2_02() -> Result<()> { let expr= r#"|a+ib|"#; - test_braille("French", expr, "⠿⠁⠖⠊⠃⠿"); + test_braille("French", expr, "⠿⠁⠖⠊⠃⠿")?; + return Ok(()); } #[test] -fn norm_k_u_vector_13_2_03() { +fn norm_k_u_vector_13_2_03() -> Result<()> { let expr= r#"∄ku→∄=|k|∄u→∄"#; - test_braille("French", expr, "â ˜â żâ …â šâ ’â „â ˜â żâ ¶â żâ …â żâ ˜â żâ šâ ’â „â ˜â ż"); + test_braille("French", expr, "â ˜â żâ …â šâ ’â „â ˜â żâ ¶â żâ …â żâ ˜â żâ šâ ’â „â ˜â ż")?; + return Ok(()); } #[test] -fn restriction_of_f_to_13_2_04() { +fn restriction_of_f_to_13_2_04() -> Result<()> { let expr= r#"f|E"#; - test_braille("French", expr, "⠋⠿⠹⠑"); + test_braille("French", expr, "⠋⠿⠹⠑")?; + return Ok(()); } #[test] -fn determinant_tabular_13_3_01() { +fn determinant_tabular_13_3_01() -> Result<()> { let expr= r#"I=|1023|=3"#; test_braille("French", expr, " â šâ Šâ ¶â żâ Ąâ €â Œâ ż - ⠿⠣⠀⠩⠿⠶⠩"); + ⠿⠣⠀⠩⠿⠶⠩")?; + return Ok(()); } #[test] -fn matrix_tabular_13_3_02() { +fn matrix_tabular_13_3_02() -> Result<()> { let expr= r#"J=(142356−789)"#; test_braille("French", expr, " ⠚⠚⠶⠊⠥⠀⠀⠀⠀⠀⠀â čâ Ž ⠀⠀⠀⠊⠣⠀⠩⠀⠱⠀⠀⠫⠎ -⠀⠀⠀⠊⠀⠻⠀⠳⠀⠀⠀â Șâ Ž"); +⠀⠀⠀⠊⠀⠻⠀⠳⠀⠀⠀â Șâ Ž")?; + return Ok(()); } #[test] -fn matrix_linear_13_3_02() { +fn matrix_linear_13_3_02() -> Result<()> { let expr= r#"J=(142356−789)"#; - test_braille("French", expr, "â šâ šâ ¶â ˜â Šâ Ąâ €â â ‚â €â â ‚â €â čâ €â  â œâ €â Łâ €â ©â €â ±â €â «â €â  â œâ €â €â »â €â łâ €â â ‚â €â Ș⠘⠎"); + test_braille("French", expr, "â šâ šâ ¶â ˜â Šâ Ąâ €â â ‚â €â â ‚â €â čâ €â  â œâ €â Łâ €â ©â €â ±â €â «â €â  â œâ €â €â »â €â łâ €â â ‚â €â Ș⠘⠎")?; + return Ok(()); } #[test] -fn matrix_with_equations_two_lines_13_3_03() { +fn matrix_with_equations_two_lines_13_3_03() -> Result<()> { let expr= r#"K=[1x2+3x−96x3−x2+1x+3y+5g(x)]"#; test_braille("French", expr, " â šâ …â ¶â ˜â ·â Ąâ €â °â ­â ˆâ Łâ –â ©â ­â €â Șâ †â Œâ °â «â ­â ˆâ ©â €â ­â ˆâ Łâ  -â –â Ąâ †â €â  â œâ €â °â ­â –â ©â †â Œâ °â œâ –â ±â †â €â ›â Šâ ­â Žâ ˜â Ÿ"); +â –â Ąâ †â €â  â œâ €â °â ­â –â ©â †â Œâ °â œâ –â ±â †â €â ›â Šâ ­â Žâ ˜â Ÿ")?; + return Ok(()); } #[test] -fn matrix_with_equations_one_lines_13_3_03() { +fn matrix_with_equations_one_lines_13_3_03() -> Result<()> { let expr= r#"K=[1x2+3x−96x3−x2+1x+3y+5g(x)]"#; - test_braille("French", expr, "â šâ …â ¶â ˜â ·â Ąâ €â °â ­â ˆâ Łâ –â ©â ­â €â Șâ †â Œâ °â «â ­â ˆâ ©â €â ­â ˆâ Łâ –â Ąâ †â €â  â œâ €â °â ­â –â ©â †â Œâ °â œâ –â ±â †â €â ›â Šâ ­â Žâ ˜â Ÿ"); + test_braille("French", expr, "â šâ …â ¶â ˜â ·â Ąâ €â °â ­â ˆâ Łâ –â ©â ­â €â Șâ †â Œâ °â «â ­â ˆâ ©â €â ­â ˆâ Łâ –â Ąâ †â €â  â œâ €â °â ­â –â ©â †â Œâ °â œâ –â ±â †â €â ›â Šâ ­â Žâ ˜â Ÿ")?; + return Ok(()); } #[test] -fn sytem_equation_tabular_13_4_01() { +fn sytem_equation_tabular_13_4_01() -> Result<()> { let expr= r#"{2x+3y=53x−7y=8"#; test_braille("French", expr, " â žâ Šâ Łâ ­â –â ©â œâ ¶â ± -â €â €â ©â ­â €â »â œâ ¶â ł"); +â €â €â ©â ­â €â »â œâ ¶â ł")?; + return Ok(()); } #[test] -fn sytem_equation_linĂ©araire_13_4_01() { +fn sytem_equation_linĂ©araire_13_4_01() -> Result<()> { let expr= r#"{2x+3y=53x−7y=8"#; - test_braille("French", expr, "â žâ Šâ Łâ ­â –â ©â œâ ¶â ±â €â  â œâ €â ©â ­â €â »â œâ ¶â ł"); + test_braille("French", expr, "â žâ Šâ Łâ ­â –â ©â œâ ¶â ±â €â  â œâ €â ©â ­â €â »â œâ ¶â ł")?; + return Ok(()); } #[test] -fn function_f_of_x_14_1_01() { +fn function_f_of_x_14_1_01() -> Result<()> { let expr= r#"f(x)"#; - test_braille("French", expr, "⠋⠩⠭⠮"); + test_braille("French", expr, "⠋⠩⠭⠮")?; + return Ok(()); } #[test] -fn function_g_prime_14_1_02() { +fn function_g_prime_14_1_02() -> Result<()> { let expr= r#"gâ€Č(x)=3x+4"#; - test_braille("French", expr, "⠛⠄⠊⠭⠎⠶⠩⠭⠖â č"); + test_braille("French", expr, "⠛⠄⠊⠭⠎⠶⠩⠭⠖â č")?; + return Ok(()); } #[test] -fn function_composition_14_1_03() { +fn function_composition_14_1_03() -> Result<()> { let expr= r#"f∘g(x)=f[g(x)]"#; - test_braille("French", expr, "⠋⠞⠌⠛⠊⠭⠎⠶⠋⠷⠛⠊⠭⠎⠟"); + test_braille("French", expr, "⠋⠞⠌⠛⠊⠭⠎⠶⠋⠷⠛⠊⠭⠎⠟")?; + return Ok(()); } #[test] -fn function_partial_derivative_14_1_04() { +fn function_partial_derivative_14_1_04() -> Result<()> { let expr= r#"∂f(x,y)∂x=5xy−7x"#; - test_braille("French", expr, "⠐⠙⠋⠊⠭⠂⠜⠎⠌⠐⠙⠭⠶⠱⠭⠜⠀⠻⠭"); + test_braille("French", expr, "⠐⠙⠋⠊⠭⠂⠜⠎⠌⠐⠙⠭⠶⠱⠭⠜⠀⠻⠭")?; + return Ok(()); } #[test] -fn limit_x_tends_1_14_2_01_corrected() { +fn limit_x_tends_1_14_2_01_corrected() -> Result<()> { let expr= r#"limx→+∞f(x)=0"#; - test_braille("French", expr, "â ‡â Šâ â ąâ ąâ °â ­â žâ ±â –â ˜â ‰â †â ‹â Šâ ­â Žâ ¶â Œ"); + test_braille("French", expr, "â ‡â Šâ â ąâ ąâ °â ­â žâ ±â –â ˜â ‰â †â ‹â Šâ ­â Žâ ¶â Œ")?; + return Ok(()); } #[test] -fn limit_x_tends_and_x_lt_1_14_2_02_corrected_1() { +fn limit_x_tends_and_x_lt_1_14_2_02_corrected_1() -> Result<()> { let expr= r#"limx→4x>4f(x)=−∞"#; - test_braille("French", expr, "â ‡â Šâ â ąâ ąâ °â ­â žâ ±â č⠂⠭⠐⠜â č⠆⠋⠊⠭⠎⠶⠀⠘⠉"); + test_braille("French", expr, "â ‡â Šâ â ąâ ąâ °â ­â žâ ±â č⠂⠭⠐⠜â č⠆⠋⠊⠭⠎⠶⠀⠘⠉")?; + return Ok(()); } #[test] -fn limit_x_tends_and_x_lt_2_14_2_02_corrected_2() { +fn limit_x_tends_and_x_lt_2_14_2_02_corrected_2() -> Result<()> { let expr= r#"limx→4x>4f(x)=−∞"#; - test_braille("French", expr, "â ‡â Šâ â ąâ ąâ °â ­â žâ ±â č⠂⠭⠐⠜â č⠆⠋⠊⠭⠎⠶⠀⠘⠉"); + test_braille("French", expr, "â ‡â Šâ â ąâ ąâ °â ­â žâ ±â č⠂⠭⠐⠜â č⠆⠋⠊⠭⠎⠶⠀⠘⠉")?; + return Ok(()); } #[test] -fn limit_x_tends_of_formula_lt_2_14_2_03_corrected() { +fn limit_x_tends_of_formula_lt_2_14_2_03_corrected() -> Result<()> { let expr= r#"limx→+∞ln⁥(x+2)x=0"#; - test_braille("French", expr, "â ‡â Šâ â ąâ ąâ °â ­â žâ ±â –â ˜â ‰â †â °â ‡â â Šâ ­â –â Łâ Žâ Œâ ­â †â ¶â Œ"); + test_braille("French", expr, "â ‡â Šâ â ąâ ąâ °â ­â žâ ±â –â ˜â ‰â †â °â ‡â â Šâ ­â –â Łâ Žâ Œâ ­â †â ¶â Œ")?; + return Ok(()); } #[test] -fn sign_chart_14_3_01() { +fn sign_chart_14_3_01() -> Result<()> { let expr= r#"x−∞32+∞2x−3−0+"#; test_braille("French", expr, " â ­â €â €â €â žâ €â ˜â ‰â €â €â ©â Œâ Łâ €â €â €â –â ˜â ‰ ⠒⠒⠒⠒â ș⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒ -â Łâ ­â €â ©â žâ €â €â €â €â €â €â Œâ €â €â –"); +â Łâ ­â €â ©â žâ €â €â €â €â €â €â Œâ €â €â –")?; + return Ok(()); } #[test] -fn sign_chart_14_3_02() { +fn sign_chart_14_3_02() -> Result<()> { let expr= r#"x−∞7+∞fâ€Č(x)+0−f(x)−∞↗−1↘−∞"#; test_braille("French", expr, " ⠀⠭⠀⠀⠀⠀⠞⠀⠘⠉⠀⠀⠀⠀⠀⠻⠀⠀⠀⠀⠀⠖⠘ ⠒⠒⠒⠒⠒â ș⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒ ⠋⠄⠊⠭⠎⠞⠀⠀⠀⠀⠖⠀⠀⠀⠀⠌⠀⠀⠀⠀⠀ -â ‹â Šâ ­â Žâ €â žâ €â ˜â ‰â €â ˜â ±â €â €â Ąâ €â šâ ±â €â €â ˜â ‰"); +â ‹â Šâ ­â Žâ €â žâ €â ˜â ‰â €â ˜â ±â €â €â Ąâ €â šâ ±â €â €â ˜â ‰")?; + return Ok(()); } #[test] -fn integral_from_to_1_14_4_01() { +fn integral_from_to_1_14_4_01() -> Result<()> { let expr= r#"∫abf(x)dx"#; - test_braille("French", expr, "⠯⠱⠁⠈⠃⠋⠩⠭⠮⠙⠭"); + test_braille("French", expr, "⠯⠱⠁⠈⠃⠋⠩⠭⠮⠙⠭")?; + return Ok(()); } #[test] -fn integral_two_lines_14_4_02() { +fn integral_two_lines_14_4_02() -> Result<()> { let expr= r#"∫052f(x)dx=F(52)−F(0)"#; test_braille("French", expr, " â Żâ ąâ Œâ ˆâ °â ±â Œâ Łâ †â ‹â Šâ ­â Žâ ™â ­â  -â ¶â šâ ‹â Šâ ±â Œâ Łâ Žâ €â šâ ‹â Šâ Œâ Ž"); +â ¶â šâ ‹â Šâ ±â Œâ Łâ Žâ €â šâ ‹â Šâ Œâ Ž")?; + return Ok(()); } #[test] -fn integral_one_lines14_4_02() { +fn integral_one_lines14_4_02() -> Result<()> { let expr= r#"∫052f(x)dx=F(52)−F(0)"#; - test_braille("French", expr, "â Żâ ąâ Œâ ˆâ °â ±â Œâ Łâ †â ‹â Šâ ­â Žâ ™â ­â ¶â šâ ‹â Šâ ±â Œâ Łâ Žâ €â šâ ‹â Šâ Œâ Ž"); + test_braille("French", expr, "â Żâ ąâ Œâ ˆâ °â ±â Œâ Łâ †â ‹â Šâ ­â Žâ ™â ­â ¶â šâ ‹â Šâ ±â Œâ Łâ Žâ €â šâ ‹â Šâ Œâ Ž")?; + return Ok(()); } #[test] -fn integral_from_to_2_14_4_03() { +fn integral_from_to_2_14_4_03() -> Result<()> { let expr= r#"∫125xdx"#; - test_braille("French", expr, "â Żâ ąâ Ąâ ˆâ Łâ °â ±â ­â †â ™â ­"); + test_braille("French", expr, "â Żâ ąâ Ąâ ˆâ Łâ °â ±â ­â †â ™â ­")?; + return Ok(()); } #[test] -fn integral_over_curve_14_4_04() { +fn integral_over_curve_14_4_04() -> Result<()> { let expr= r#"∫(c)f(x)dx"#; - test_braille("French", expr, "⠯⠱⠩⠹⠉⠮⠋⠩⠭⠮⠙⠭"); + test_braille("French", expr, "⠯⠱⠩⠹⠉⠮⠋⠩⠭⠮⠙⠭")?; + return Ok(()); } #[test] -fn integral_double_over_surface_14_4_05() { +fn integral_double_over_surface_14_4_05() -> Result<()> { let expr= r#"∯Sf(x,y)dxdy"#; - test_braille("French", expr, "â šâ Żâ Żâ ąâ šâ Žâ ‹â Šâ ­â ‚â œâ Žâ ™â ­â ™â œ"); + test_braille("French", expr, "â šâ Żâ Żâ ąâ šâ Žâ ‹â Šâ ­â ‚â œâ Žâ ™â ­â ™â œ")?; + return Ok(()); } #[test] -fn logarithm_natural_fraction_14_5_01() { +fn logarithm_natural_fraction_14_5_01() -> Result<()> { let expr= r#"ln⁥(ab)"#; - test_braille("French", expr, "⠇⠝⠩⠁⠌⠃⠮"); + test_braille("French", expr, "⠇⠝⠩⠁⠌⠃⠮")?; + return Ok(()); } #[test] -fn logarithm_natural_product_14_5_02() { +fn logarithm_natural_product_14_5_02() -> Result<()> { let expr= r#"ln⁥xy=ln⁥x+ln⁥y"#; - test_braille("French", expr, "⠇⠝⠰⠭⠜⠆⠶⠇⠝⠰⠭⠆⠖⠇⠝⠰⠜⠆"); + test_braille("French", expr, "⠇⠝⠰⠭⠜⠆⠶⠇⠝⠰⠭⠆⠖⠇⠝⠰⠜⠆")?; + return Ok(()); } #[test] -fn logarthm_change_base_14_5_03() { +fn logarthm_change_base_14_5_03() -> Result<()> { let expr= r#"log7x=ln⁥xln⁥7"#; - test_braille("French", expr, "â ‡â •â ›â ąâ »â °â ­â †â ¶â ‡â â °â ­â †â Œâ ‡â â °â »â †"); + test_braille("French", expr, "â ‡â •â ›â ąâ »â °â ­â †â ¶â ‡â â °â ­â †â Œâ ‡â â °â »â †")?; + return Ok(()); } #[test] -fn cos_of_sum_1_14_6_01() { +fn cos_of_sum_1_14_6_01() -> Result<()> { let expr= r#"cos⁥(a+b)=cosacosb−sinasinb"#; - test_braille("French", expr, "⠉⠕⠎⠊⠁⠖⠃⠎⠶⠉⠕⠎⠰⠁⠆⠉⠕⠎⠰⠃⠆⠐⠀⠎⠊⠝⠰⠁⠆⠎⠊⠝⠰⠃⠆"); + test_braille("French", expr, "⠉⠕⠎⠊⠁⠖⠃⠎⠶⠉⠕⠎⠰⠁⠆⠉⠕⠎⠰⠃⠆⠐⠀⠎⠊⠝⠰⠁⠆⠎⠊⠝⠰⠃⠆")?; + return Ok(()); } #[test] -fn cos_of_sum_2_14_6_01b() { +fn cos_of_sum_2_14_6_01b() -> Result<()> { let expr= r#"cos⁥(a+b)=cosacosb−sinasinb"#; - test_braille("French", expr, "â šâ Źâ Šâ â –â ƒâ Žâ ¶â šâ Źâ â šâ Źâ ƒâ €â Źâ â Źâ ƒ"); + test_braille("French", expr, "â šâ Źâ Šâ â –â ƒâ Žâ ¶â šâ Źâ â šâ Źâ ƒâ €â Źâ â Źâ ƒ")?; + return Ok(()); } #[test] -fn cos_of_sum_3_14_6_01b() { +fn cos_of_sum_3_14_6_01b() -> Result<()> { let expr= r#"cos(a+b)=cosacosb−sinasinb"#; - test_braille("French", expr, "â šâ Źâ Šâ â –â ƒâ Žâ ¶â šâ Źâ â šâ Źâ ƒâ €â Źâ â Źâ ƒ"); + test_braille("French", expr, "â šâ Źâ Šâ â –â ƒâ Žâ ¶â šâ Źâ â šâ Źâ ƒâ €â Źâ â Źâ ƒ")?; + return Ok(()); } #[test] -fn cosh_sinh_14_7_01() { +fn cosh_sinh_14_7_01() -> Result<()> { let expr= r#"cosh2x−sinh2x=1"#; - test_braille("French", expr, "â ‰â “â ˆâ Łâ °â ­â †â €â Žâ “â ˆâ Łâ °â ­â †â ¶â Ą"); + test_braille("French", expr, "â ‰â “â ˆâ Łâ °â ­â †â €â Žâ “â ˆâ Łâ °â ­â †â ¶â Ą")?; + return Ok(()); } #[test] -fn exists_element_of_15_01() { +fn exists_element_of_15_01() -> Result<()> { let expr= r#"∃x:x∈A"#; - test_braille("French", expr, "⠾⠡⠭⠒⠭⠘⠡⠹⠁"); + test_braille("French", expr, "⠾⠡⠭⠒⠭⠘⠡⠹⠁")?; + return Ok(()); } #[test] -fn set_formula_15_02() { +fn set_formula_15_02() -> Result<()> { let expr= r#"∀Δ>0∃η>0:|x2−x1|≀η⇒|f(x2)−f(x1)|≀Δ"#; - test_braille("French", expr, "â žâ Œâ ˜â ‘â â œâ Œâ €â žâ Ąâ ˜â “â â œâ Œâ ’â €â żâ ­â ąâ Łâ €â ­â ąâ Ąâ żâ ˜â Łâ ˜â “â €â ’â ‚â €â żâ ‹â Šâ ­â ąâ Łâ Žâ €â ‹â Šâ ­â ąâ Ąâ Žâ żâ ˜â Łâ ˜â ‘"); + test_braille("French", expr, "â žâ Œâ ˜â ‘â â œâ Œâ €â žâ Ąâ ˜â “â â œâ Œâ ’â €â żâ ­â ąâ Łâ €â ­â ąâ Ąâ żâ ˜â Łâ ˜â “â €â ’â ‚â €â żâ ‹â Šâ ­â ąâ Łâ Žâ €â ‹â Šâ ­â ąâ Ąâ Žâ żâ ˜â Łâ ˜â ‘")?; + return Ok(()); } #[test] -fn power_ordinal_a_16_4_07() { +fn power_ordinal_a_16_4_07() -> Result<()> { let expr= r#"(p+q)iĂšme"#; - test_braille("French", expr, "⠩⠏⠖⠟⠮⠈⠊⠼⠍"); + test_braille("French", expr, "⠩⠏⠖⠟⠮⠈⠊⠼⠍")?; + return Ok(()); } #[test] -fn power_ordinal_b_16_4_07() { +fn power_ordinal_b_16_4_07() -> Result<()> { let expr= r#"(p+q)iĂšme"#; - test_braille("French", expr, "⠩⠏⠖⠟⠮⠈⠊⠼⠍"); + test_braille("French", expr, "⠩⠏⠖⠟⠮⠈⠊⠼⠍")?; + return Ok(()); } From 62dfe83d738ad3662f8970e54fda345eb7a75418 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Mon, 22 Jun 2026 00:03:30 -0700 Subject: [PATCH 006/162] It appears some logic was missing parens -- not sure why this always worked... --- src/xpath_functions.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/xpath_functions.rs b/src/xpath_functions.rs index 8c6bfb655..7320ed81c 100644 --- a/src/xpath_functions.rs +++ b/src/xpath_functions.rs @@ -868,8 +868,8 @@ impl IsBracketed { return false; } - if !left.is_empty() && get_text_from_COE(&children[0]) != left || - !right.is_empty() && get_text_from_COE(&children[children.len()-1]) != right { + if (!left.is_empty() && get_text_from_COE(&children[0]) != left) || + (!right.is_empty() && get_text_from_COE(&children[children.len()-1]) != right) { // left or right don't match return false; } From 3c5b1018a1a87d9b1c34790bffc6933b3c27296e Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Mon, 22 Jun 2026 00:06:00 -0700 Subject: [PATCH 007/162] Lots more cleanup of tests, additions of rules. Now at 78 pass/15 fail. --- Rules/Braille/French/French_Rules.yaml | 616 ++++++++++++------------- Rules/Braille/French/definitions.yaml | 18 + Rules/Braille/French/unicode-full.yaml | 4 +- Rules/Braille/French/unicode.yaml | 50 +- Rules/prefs.yaml | 2 + src/braille.rs | 173 +++---- tests/braille/French/chemistry.rs | 4 +- tests/braille/French/french.rs | 145 ++---- 8 files changed, 462 insertions(+), 550 deletions(-) diff --git a/Rules/Braille/French/French_Rules.yaml b/Rules/Braille/French/French_Rules.yaml index 3dad1abe3..741a7d0e8 100644 --- a/Rules/Braille/French/French_Rules.yaml +++ b/Rules/Braille/French/French_Rules.yaml @@ -1,27 +1,27 @@ --- -- - name: whitespace-omission - 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: "(@class='MathML-unit' or BaseNode(.)[@class='MathML-unit']) and @data-previous-space-width >= 0.25" # BANA 5.3(a) - then: [t: "𝐖"] - - else_if: "@data-previous-space-width > 1.1" - then: [t: "â Ź"] - - else_if: "@data-previous-space-width >= 0.25" # thickspace - then: [t: "W"] - - x: "." - - test: - - if: "(@class='MathML-unit' or BaseNode(.)[@class='MathML-unit']) and @data-following-space-width >= 0.25" # BANA 5.3(a) - then: [t: "𝐖"] - - else_if: "@data-following-space-width > 1.1" - then: [t: "â Ź"] - - else_if: "@data-following-space-width >= 0.25" # thickspace - then: [t: "W"] +# - +# name: whitespace-omission +# 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: "(@class='MathML-unit' or BaseNode(.)[@class='MathML-unit']) and @data-previous-space-width >= 0.25" # BANA 5.3(a) +# then: [t: "𝐖"] +# - else_if: "@data-previous-space-width > 1.1" +# then: [t: "â Ź"] +# - else_if: "@data-previous-space-width >= 0.25" # thickspace +# then: [t: "W"] +# - x: "." +# - test: +# - if: "(@class='MathML-unit' or BaseNode(.)[@class='MathML-unit']) and @data-following-space-width >= 0.25" # BANA 5.3(a) +# then: [t: "𝐖"] +# - else_if: "@data-following-space-width > 1.1" +# then: [t: "â Ź"] +# - else_if: "@data-following-space-width >= 0.25" # thickspace +# then: [t: "W"] - name: omission-intent @@ -46,9 +46,9 @@ - test: if: "NeedsToBeGrouped(*[1], 'French', true())" then: - - t: "â °" + - t: "o" - x: "*[1]" - - t: "⠆" + - t: "c" else: - x: "*[1]" @@ -59,20 +59,20 @@ replace: - t: "⠈" - test: - if: "NeedsToBeGrouped(*[2], 'French', true())" + if: "NeedsToBeGrouped(*[2], 'French', false())" then: - - t: "â °" + - t: "o" - x: "*[2]" - - t: "⠆" + - t: "c" else: - x: "*[2]" - t: "⠜" - test: - if: "NeedsToBeGrouped(*[1], 'French', true())" + if: "NeedsToBeGrouped(*[1], 'French', false())" then: - - t: "â °" + - t: "o" - x: "*[1]" - - t: "⠆" + - t: "c" else: - x: "*[1]" @@ -101,45 +101,23 @@ match: "." replace: - test: - if: "DEBUG(NeedsToBeGrouped(DEBUG(*[1]), 'French', true()))" + if: "NeedsToBeGrouped(*[1], 'French', true())" then: - - t: "â °" + - t: "o" - x: "*[1]" - - t: "⠆" + - t: "c" else: - x: "*[1]" - t: "⠌" - test: if: "NeedsToBeGrouped(*[2], 'French', true())" then: - - t: "â °" + - t: "o" - x: "*[2]" - - t: "⠆" + - t: "c" else: - x: "*[2]" -- - #GTM 14.3.3 (not sure what else vertical juxtaposition applies to) - name: binomial-frac - tag: mrow - match: "IsBracketed(., '(', ')') and *[2][self::m:mfrac][@linethickness=0]" - replace: - - x: "*[1]" - - x: "*[2]/*[1]" - - t: "â °â »" - - x: "*[2]/*[2]" - - 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]" - - x: "*[2]/*[1]/*[1]/*[1]" - - t: "â °â »" - - x: "*[2]/*[2]/*[1]/*[1]" - - x: "*[3]" - # # Matrix/Determinant rules # matrix and determinant are the same other than "matrix"/"determinant" based on the bracketing chars @@ -216,9 +194,12 @@ variables: - RowStart: "''" # empty string -- it needs to be set - RowEnd: "''" # empty string -- it needs to be set - - NewScriptContext: "''" # empty string -- it needs to be set - MatchingWhitespace: "false()" - replace: [x: "*"] + replace: + - test: + if: "@display='inline' and not(*[1][self::m:mi])" # FIX: should check to make sure it is only (Roman?) letters + then: [t: "P"] # Add inline indicator + - x: "*" - name: empty-mrow @@ -231,13 +212,70 @@ name: trig-functions tag: mrow match: "count(*)=3 and *[2]='\u2061' and - IsInDefinition(BaseNode(*[1]), 'Braille', 'TrigFunctionNames') and not(IsBracketed(*[3], '(', ')'))" + (IsInDefinition(BaseNode(*[1]), 'Braille', 'TrigFunctionNames') or BaseNode(*[1]) = 'lim') and not(IsBracketed(*[3], '(', ')'))" replace: - x: "*[1]" - - t: "â °" - - x: "*[3]" - - t: "⠆" + - test: + # p51 -- use short form for (some) trig functions; always group unless short form and no grouping needed + if: "not($French_UseShortForm and IsInDefinition(BaseNode(*[1]), 'Braille', 'ShortForms')) or + NeedsToBeGrouped(*[3], 'French', true())" + then: + - t: "o" + - x: "*[3]" + - t: "c" + else: + - x: "*[3]" + +# - +# name: binomial-frac +# tag: mrow +# match: "IsBracketed(., '(', ')') and *[2][self::m:mfrac][@linethickness=0]" +# replace: +# - x: "*[1]" +# - x: "*[2]/*[1]" +# - t: "â °â »" +# - x: "*[2]/*[2]" +# - 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]" +# - x: "*[2]/*[1]/*[1]/*[1]" +# - t: "â °â »" +# - x: "*[2]/*[2]/*[1]/*[1]" +# - x: "*[3]" + +- + # integral rules -- need to group the integrand (but not the 'd x') + # we look for what follows the integral and check for 'd' in the next to last element and group what comes before it (assuming there is more than one element) + # note: we need to skip the invisible times when checking for 'd' + name: integrals + tag: mrow + match: "BaseNode(*[1])[translate(., '∫∏∭∟', '')=''] and + *[2][self::m:mrow][count(*)>5 and *[last()-2][self::m:mi][.='d' or .='ⅆ']]" + replace: + - x: "*[1]" + - t: "o" + - x: "*[2]/*[position() <= last()- 4]" + - t: "c" + - x: "*[2]/*[last()-2]" + - x: "*[2]/*[last()]" +- + # grouping rules -- need to add grouping symbols for some cases + name: function-call + tag: mrow + # we include invisible times in the match because some AbbreviationsForGrouping are not function names + match: "count(*)=3 and *[2][self::m:mo][.='\u2061'or .='\u2062'] and + not(*[3][self::m:mrow][IsBracketed(., '(', ')') or IsBracketed(., '[', ']')]) and + *[1][self::m:mi][IsInDefinition(., 'Braille', 'TrigFunctionNames') or IsInDefinition(., 'Braille', 'AbbreviationsForGrouping')]" + replace: + - x: "*[1]" + - t: "o" + - x: "DEBUG(*[3])" + - t: "c" - name: default @@ -269,23 +307,11 @@ - x: "text()" - - name: default - tag: mo - # add spaces around comparison operators unless they are in a script position, - variables: # ratio not spaced in UEB; also make sure it is an infix operator (e.g., "~" can be prefix) - - AddSpaces: "$UEB_UseSpacesAroundAllOperators" - match: "." - replace: - - test: - if: "$AddSpaces" - then: - - test: - if: "preceding-sibling::*" - then: [t: "W"] - - x: "text()" - - test: - if: "$AddSpaces and following-sibling::*" - then: [t: "W"] + name: default + tag: mo + match: "." + replace: + - x: "text()" - @@ -299,7 +325,10 @@ tag: [mi, mtext] match: "." replace: - - x: "BrailleChars(., 'French')" + - test: + if: "$French_UseShortForm and IsInDefinition(., 'Braille', 'ShortForms')" + then: [x: "BrailleChars(DefinitionValue(., 'Braille', 'ShortForms'), 'French')"] + else: [x: "BrailleChars(., 'French')"] - name: default @@ -333,23 +362,13 @@ - # special hack to catch double over/under bar built from nested mover/munder name: doubled-line-hack-exception - tag: [mover, munder] + tag: mover match: - "*[2][self::m:mo and string-length(.) = 1 and (.='ÂŻ')] and" # has line/bar - - "( (self::m:mover and *[1][self::m:mover]) or (self::m:munder and *[1][self::m:munder]) ) and" # both mover/munder - - "*[1]/*[2][self::m:mo and string-length(.) = 1 and (.='ÂŻ')]" # other mover/munder has line/bar + - "(*[1][self::m:mover] and *[1]/*[2][self::m:mo and string-length(.) = 1 and (.='ÂŻ')])" replace: - - test: - if: "self::m:munder" - then: [t: "â š"] - t: "⠘⠾⠒" - - test: - if: "NeedsToBeGrouped(*[1], 'French', true())" - then: - - t: "â °" - - x: "*[1]" - - t: "⠆" - else: [x: "*[1]"] + - x: "*[1]" - name: single-char-exceptions # GTM 12 @@ -377,9 +396,9 @@ # - test: # if: "NeedsToBeGrouped(*[1], 'French', true())" # then: - # - t: "â °" + # - t: "o" # - x: "*[1]" - # - t: "⠆" + # - t: "c" # else: [x: "*[1]"] - x: "*[1]" @@ -390,55 +409,55 @@ # We combine them here name: single-char-exceptions tag: [msub, msup] - match: "(self::m:msub and @data-chem-formula) or (self::m:msup and *[2][translate(., \"'â€Č″‮\",'')=''])" + match: "(@data-chem-formula) or (self::m:msup and *[2][translate(., \"'â€Č″‮\",'')=''])" replace: + - x: "*[1]" - test: - if: "NeedsToBeGrouped(*[1], 'French', true())" + # we need to group an operator if it is followed by an operator (see p9 of chem spec) -- don't want 2 "+"s in a row + # it is a bit tricky, we used following and preceding because it might be at a different level of the tree + if: "@data-chem-formula and *[2][self::m:mo] and following::*[1][self::m:mo and .=preceding::*[1]]" then: - - t: "â °" - - x: "*[1]" - - t: "⠆" - else: [x: "*[1]"] + - t: "o" + - x: "*[2]" + - t: "c" + else: [x: "*[2]"] + +- + name: single-char-exceptions + tag: [mover] + match: "*[2][translate(., \"⏜^â†’â‡€ÂŻâŒŁâ—ŒÌŒ~\",'')='']" + replace: - x: "*[2]" + - x: "*[1]" - name: default tag: [msub, msup, munder, mover] match: "." - variables: [AddSpaces: "(self::m:munder or self::m:mover) and IsInDefinition(BaseNode(*[1]), 'Braille', 'NemethComparisonOperators')"] replace: - test: - if: "$AddSpaces" - then: [t: "W"] - - test: - if: "NeedsToBeGrouped(*[1], 'French', self::m:msub or self::m:msup)" + if: "(self::m:munder or self::m:mover) and NeedsToBeGrouped(*[1], 'French', true())" then: - - t: "â °" + - t: "o" - x: "*[1]" - - t: "⠆" + - t: "c" else: [x: "*[1]"] - - with: # this could be tighter and be just around the *[2] part, but this is consistent with msubsup below - variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string - replace: - - test: - - if: "self::m:msup" - then: [t: "⠈"] - - else_if: "self::m:msub" - then: [t: "â ą"] - - else_if: "self::m:munder" - then: [t: "â ąâ ą"] - else: [t: "⠈⠈"] # mover - - test: - if: "NeedsToBeGrouped(*[2], 'French', false())" - then: - - t: "â °" - - x: "*[2]" - - t: "⠆" - else: [x: "*[2]"] - - t: "#" # signal end script/numeric mode - test: - if: "$AddSpaces" - then: [t: "W"] + - if: "self::m:msup" + then: [t: "⠈"] + - else_if: "self::m:msub" + then: [t: "â ą"] + - else_if: "self::m:munder" + then: [t: "â ąâ ą"] + else: [t: "⠈⠈"] # mover + - test: + if: "DEBUG(NeedsToBeGrouped(*[2], 'French', false()))" + then: + - t: "o" + - x: "*[2]" + - t: "c" + else: [x: "*[2]"] + - t: "#" # signal end script/numeric mode @@ -448,44 +467,35 @@ match: "count(*)=3" # catches mmultiscripts equiv variables: [IsPrimeSuperScript: "not(self::m:munderover) and *[3][translate(., \"'â€Č″‮\",'')='']"] replace: - - test: - if: "NeedsToBeGrouped(*[1], 'French', self::m:msubsup)" - then: - - t: "â °" - - x: "*[1]" - - t: "⠆" - else: [x: "*[1]"] + - x: "*[1]" - test: if: "$IsPrimeSuperScript" then: [x: "*[3]"] - - with: - variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string - replace: + - test: + if: "self::m:munderover" + then: [t: "â ąâ ą"] + else: [t: "â ą"] + - test: + if: "DEBUG(NeedsToBeGrouped(*[2], 'French', false()))" + then: + - t: "o" + - x: "*[2]" + - t: "c" + else: [x: "*[2]"] + - test: + if: "not($IsPrimeSuperScript)" + then: - test: if: "self::m:munderover" - then: [t: "â ąâ ą"] - else: [t: "â ą"] - - test: - if: "NeedsToBeGrouped(*[2], 'French', false())" - then: - - t: "â °" - - x: "*[2]" - - t: "⠆" - else: [x: "*[2]"] + then: [t: "⠈⠈"] + else: [t: "⠈"] - test: - if: "not($IsPrimeSuperScript)" + if: "NeedsToBeGrouped(*[3], 'French', false())" then: - - test: - if: "self::m:munderover" - then: [t: "⠈⠈"] - else: [t: "⠈"] - - test: - if: "NeedsToBeGrouped(*[3], 'French', false())" - then: - - t: "â °" - - x: "*[3]" - - t: "⠆" - else: [x: "*[3]"] + - t: "o" + - x: "*[3]" + - t: "c" + else: [x: "*[3]"] - @@ -498,31 +508,25 @@ - test: if: "not(*[3][self::m:none])" then: - - with: - variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string - replace: - - t: "â  â ą" - - test: - if: "NeedsToBeGrouped(*[3], 'French', true())" - then: - - t: "â °" - - x: "*[3]" - - t: "⠆" - else: [x: "*[3]"] + - t: "â  â ą" + - test: + if: "NeedsToBeGrouped(*[3], 'French', true())" + then: + - t: "o" + - x: "*[3]" + - t: "c" + else: [x: "*[3]"] - test: if: "not(*[4][self::m:none])" then: - - with: - variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string - replace: - - t: "⠠⠈" - - test: - if: "NeedsToBeGrouped(*[4], 'French', false())" - then: - - t: "â °" - - x: "*[4]" - - t: "⠆" - else: [x: "*[4]"] + - t: "⠠⠈" + - test: + if: "NeedsToBeGrouped(*[4], 'French', false())" + then: + - t: "o" + - x: "*[4]" + - t: "c" + else: [x: "*[4]"] - name: default @@ -540,62 +544,50 @@ - test: if: "not($Prescripts[1][self::m:none])" then: - - with: - variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string - replace: - - t: "â ą" - - test: - if: "NeedsToBeGrouped($Prescripts[1], 'French', true())" - then: - - t: "â °" - - x: "$Prescripts[1]" - - t: "⠆" - else: [x: "$Prescripts[1]"] + - t: "â ą" + - test: + if: "NeedsToBeGrouped($Prescripts[1], 'French', true())" + then: + - t: "o" + - x: "$Prescripts[1]" + - t: "c" + else: [x: "$Prescripts[1]"] - test: if: "not($Prescripts[2][self::m:none])" then: - - with: - variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string - replace: - - t: "⠈" - - test: - if: "NeedsToBeGrouped($Prescripts[2], 'French', false())" - then: - - t: "â °" - - x: "$Prescripts[2]" - - t: "⠆" - else: [x: "$Prescripts[2]"] + - t: "⠈" + - test: + if: "NeedsToBeGrouped($Prescripts[2], 'French', false())" + then: + - t: "o" + - x: "$Prescripts[2]" + - t: "c" + else: [x: "$Prescripts[2]"] - test: if: "count($Prescripts)>2" then: - test: if: "not($Prescripts[3][self::m:none])" then: - - with: - variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string - replace: - - t: "â ą" - - test: - if: "NeedsToBeGrouped($Prescripts[3], 'French', false())" - then: - - t: "â °" - - x: "$Prescripts[3]" - - t: "⠆" - else: [x: "$Prescripts[3]"] + - t: "â ą" + - test: + if: "NeedsToBeGrouped($Prescripts[3], 'French', false())" + then: + - t: "o" + - x: "$Prescripts[3]" + - t: "c" + else: [x: "$Prescripts[3]"] - test: if: "not($Prescripts[4][self::m:none])" then: - - with: - variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string - replace: - - t: "⠈" - - test: - if: "NeedsToBeGrouped($Prescripts[4], 'French', false())" - then: - - t: "â °" - - x: "$Prescripts[4]" - - t: "⠆" - else: [x: "$Prescripts[4]"] + - t: "⠈" + - test: + if: "NeedsToBeGrouped($Prescripts[4], 'French', false())" + then: + - t: "o" + - x: "$Prescripts[4]" + - t: "c" + else: [x: "$Prescripts[4]"] - test: if: "count($Prescripts) > 4" # give up and just dump them out so at least the content is there then: [x: "$Prescripts[position() > 4]"] @@ -607,124 +599,100 @@ - test: if: "not($Postscripts[1][self::m:none])" then: - - with: - variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string - replace: - - t: "â ą" - - test: - if: "NeedsToBeGrouped($Postscripts[1], 'French', false())" - then: - - t: "â °" - - x: "$Postscripts[1]" - - t: "⠆" - else: [x: "$Postscripts[1]"] + - t: "â ą" + - test: + if: "NeedsToBeGrouped($Postscripts[1], 'French', false())" + then: + - t: "o" + - x: "$Postscripts[1]" + - t: "c" + else: [x: "$Postscripts[1]"] - test: if: "not($Postscripts[2][self::m:none])" then: - - with: - variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string - replace: - - t: "⠈" - - test: - if: "NeedsToBeGrouped($Postscripts[2], 'French', false())" - then: - - t: "â °" - - x: "$Postscripts[2]" - - t: "⠆" - else: [x: "$Postscripts[2]"] + - t: "⠈" + - test: + if: "NeedsToBeGrouped($Postscripts[2], 'French', false())" + then: + - t: "o" + - x: "$Postscripts[2]" + - t: "c" + else: [x: "$Postscripts[2]"] - test: if: "count($Postscripts)>2" then: - test: if: "not($Postscripts[3][self::m:none])" then: - - with: - variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string - replace: - - t: "â ą" - - test: - if: "NeedsToBeGrouped($Postscripts[3], 'French', false())" - then: - - t: "â °" - - x: "$Postscripts[3]" - - t: "⠆" - else: [x: "$Postscripts[3]"] + - t: "â ą" + - test: + if: "NeedsToBeGrouped($Postscripts[3], 'French', false())" + then: + - t: "o" + - x: "$Postscripts[3]" + - t: "c" + else: [x: "$Postscripts[3]"] - test: if: "not($Postscripts[4][self::m:none])" then: - - with: - variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string - replace: - - t: "⠈" - - test: - if: "NeedsToBeGrouped($Postscripts[4], 'French', false())" - then: - - t: "â °" - - x: "$Postscripts[4]" - - t: "⠆" - else: [x: "$Postscripts[4]"] + - t: "⠈" + - test: + if: "NeedsToBeGrouped($Postscripts[4], 'French', false())" + then: + - t: "o" + - x: "$Postscripts[4]" + - t: "c" + else: [x: "$Postscripts[4]"] - test: if: "count($Postscripts)>4" then: - test: if: "not($Postscripts[5][self::m:none])" then: - - with: - variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string - replace: - - t: "â ą" - - test: - if: "NeedsToBeGrouped($Postscripts[5], 'French', false())" - then: - - t: "â °" - - x: "$Postscripts[5]" - - t: "⠆" - else: [x: "$Postscripts[5]"] + - t: "â ą" + - test: + if: "NeedsToBeGrouped($Postscripts[5], 'French', false())" + then: + - t: "o" + - x: "$Postscripts[5]" + - t: "c" + else: [x: "$Postscripts[5]"] - test: if: "not($Postscripts[6][self::m:none])" then: - - with: - variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string - replace: - - t: "⠈" - - test: - if: "NeedsToBeGrouped($Postscripts[6], 'French', false())" - then: - - t: "â °" - - x: "$Postscripts[6]" - - t: "⠆" - else: [x: "$Postscripts[6]"] + - t: "⠈" + - test: + if: "NeedsToBeGrouped($Postscripts[6], 'French', false())" + then: + - t: "o" + - x: "$Postscripts[6]" + - t: "c" + else: [x: "$Postscripts[6]"] - test: if: "count($Postscripts)>6" then: - test: if: "not($Postscripts[7][self::m:none])" then: - - with: - variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string - replace: - - t: "â ą" - - test: - if: "NeedsToBeGrouped($Postscripts[7], 'French', false())" - then: - - t: "â °" - - x: "$Postscripts[7]" - - t: "⠆" - else: [x: "$Postscripts[7]"] + - t: "â ą" + - test: + if: "NeedsToBeGrouped($Postscripts[7], 'French', false())" + then: + - t: "o" + - x: "$Postscripts[7]" + - t: "c" + else: [x: "$Postscripts[7]"] - test: if: "not($Postscripts[8][self::m:none])" then: - - with: - variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string - replace: - - t: "⠈" - - test: - if: "NeedsToBeGrouped($Postscripts[8], 'French', false())" - then: - - t: "â °" - - x: "$Postscripts[8]" - - t: "⠆" - else: [x: "$Postscripts[8]"] + - t: "⠈" + - test: + if: "NeedsToBeGrouped($Postscripts[8], 'French', false())" + then: + - t: "o" + - x: "$Postscripts[8]" + - t: "c" + else: [x: "$Postscripts[8]"] - test: if: "count($Postscripts) > 8" # give up and just dump them out so at least the content is there then: @@ -754,7 +722,6 @@ tag: menclose match: "." # FIX: can't find a rule that says anything about comparison operator spacing and enclosure - variables: [AddSpaces: "parent::*[self::m:mrow] and *[1][ self::m:mo and IsInDefinition(., 'Braille', 'NemethComparisonOperators')]"] replace: - test: if: "contains(concat(' ', normalize-space(@notation), ' '), ' left ')" #avoid 'leftarrow' @@ -762,16 +729,10 @@ - test: if: "contains(@notation,'box')" # box and roundedbox then: - # - test: - # if: "$AddSpaces" - # then: [t: " "] - t: "1⠫⠌⠙" # square (no rectangle in UEB) - test: if: "contains(@notation,'circle')" then: - # - test: - # if: "$AddSpaces" - # then: [t: " "] - t: "1â «â ż" # circle (no oval in UEB) # ??? What should happen with arrow? # If there is a box/circle with arrows only and an empty child, @@ -825,9 +786,9 @@ - test: if: "NeedsToBeGrouped(*[1], 'French', false())" then: - - t: "â °" + - t: "o" - x: "*[1]" - - t: "⠆" + - t: "c" else: [x: "*[1]"] # - test: @@ -874,13 +835,10 @@ - t: "1⠈⠱" # cancellation - test: if: - - "not($AddSpaces) and contains(@notation,'box') or contains(@notation,'circle') or" + - "contains(@notation,'box') or contains(@notation,'circle') or" - "contains(@notation,'arrow') or contains(@notation,'phasorangle')" then: - t: "â »" # terminate shape - # - test: - # if: "$AddSpaces" - # then: [t: " "] - test: if: "contains(concat(' ', normalize-space(@notation), ' '), ' right ')" #avoid 'rightarrow' then: [t: "â ž"] diff --git a/Rules/Braille/French/definitions.yaml b/Rules/Braille/French/definitions.yaml index 4d0c77efb..332abd498 100644 --- a/Rules/Braille/French/definitions.yaml +++ b/Rules/Braille/French/definitions.yaml @@ -1,2 +1,20 @@ --- - include: "../definitions.yaml" + +- AbbreviationsForGrouping: { + "arg", "Card", "rot", + "arcsin", "arccos", "arctan", "arccotan", + "ch", "sh", "th", + } + +- ShortForms: { + # p51 -- short forms for trig functions + # This uses a hack of private space chars that are then mapped to braille chars via unicode.yaml. + # We need to do this because otherwise it tries to translate the short form. + # â Ź -> \ue000 + # â š -> \ue001 + # â ź -> \ue002 + # ⠘ -> \ue003 + "sin": "\ue000", cos: "\ue001\ue000", tan: "\ue002", "cotan": "\ue001\ue002", + arcsin: "\ue003\ue000", arccos: "\ue003\ue001\ue002", arctan: "\ue003\ue002", arccotan: "\ue003\ue001\ue002", + } \ No newline at end of file diff --git a/Rules/Braille/French/unicode-full.yaml b/Rules/Braille/French/unicode-full.yaml index 91054d0cb..2f6ecc9b0 100644 --- a/Rules/Braille/French/unicode-full.yaml +++ b/Rules/Braille/French/unicode-full.yaml @@ -1,7 +1,7 @@ --- - - "⇌": [t: "â žâ »"] # 0x21CC (Rightwards harpoon over leftwards harpoon (equilibrium)) -# - "â„‚": [t: ""] # 0x2942 (Rightwards arrow above short leftwards arrow (equilibrium, trend to the right)) + - "⇌": [t: "â žâ »"] # 0x21CC (Rightwards harpoon over leftwards harpoon (equilibrium)) +# - "â„‚": [t: ""] # 0x2942 (Rightwards arrow above short leftwards arrow (equilibrium, trend to the right)) # - "â„„": [t: ""] # 0x2944 (Short rightwards arrow above leftwards arrow (equilibrium, trend to the left)) # Mappings for some new Unicode chemistry arrows/symbols diff --git a/Rules/Braille/French/unicode.yaml b/Rules/Braille/French/unicode.yaml index e37c31f40..0105b376e 100644 --- a/Rules/Braille/French/unicode.yaml +++ b/Rules/Braille/French/unicode.yaml @@ -42,7 +42,22 @@ - "w": [t: "Lâ ș"] # 0x77 - "x": [t: "Lâ ­"] # 0x78 - "y": [t: "Lâ œ"] # 0x79 - - "z": [t: "Lâ ”"] # 0x7a + - "z": [t: "Lâ ”"] # 0x7a + + - "ç": [t: "Lâ Ż"] # 0x282f + - "Ă©": [t: "Lâ ż"] # 0x283f + - "Ă ": [t: "Lâ ·"] # 0x2837 + - "Ăš": [t: "Lâ ź"] # 0x282e + - "Ăč": [t: "Lâ Ÿ"] # 0x283e + - "Ăą": [t: "Lâ Ą"] # 0x2821 + - "ĂȘ": [t: "Lâ Ł"] # 0x2823 + - "Ăź": [t: "Lâ ©"] # 0x2829 + - "ĂŽ": [t: "Lâ č"] # 0x2839 + - "Ă»": [t: "Lâ ±"] # 0x2831 + - "Ă«": [t: "Lâ «"] # 0x282b + - "ĂŻ": [t: "Lâ »"] # 0x283b + - "ĂŒ": [t: "Lâ ł"] # 0x2833 + - "Ɠ": [t: "Lâ Ș"] # 0x282a - "A": [t: "CL⠁"] # 0x41 - "B": # 0x42 @@ -190,6 +205,7 @@ - "%": [t: "⠐⠏"] # 0x0025 (percent sign) - "(": [t: "â Š"] # 0x0028 (left parenthesis) - ")": [t: "â Ž"] # 0x0029 (right parenthesis) + - "*": [t: "⠐⠔"] # 0x002A (asterisk) - "+": [t: "⠖"] # 0x002B (regular plus) - ",": [t: "⠂"] # 0x002C (comma) - "-": [t: "â €"] # 0x002D (regular minus) @@ -206,11 +222,13 @@ - "8": [t: "Nâ ł"] # 0x0038 (digit eight) - "9": [t: "Nâ Ș"] # 0x0039 (digit nine) - ":": [t: "⠒"] # 0x003A (colon) + - ";": [t: "⠆"] # 0x003B (semicolon) - "<": [t: "⠐⠣"] # 0x003C (less than sign) - "=": [t: "â ¶"] # 0x003D (regular equals sign) - ">": [t: "⠐⠜"] # 0x003E (greater than sign ( regular )) - "[": [t: "â ·"] # 0x005B (left square bracket) - "]": [t: "â Ÿ"] # 0x005D (right square bracket) + - "^": [t: "⠘⠒"] # 0x005E (caret) - "{": # 0x007B ( left curly brace) - test: if: "following-sibling::*[1][self::m:mtable]" @@ -221,8 +239,9 @@ else: [t: "â šâ Š"] # regular brace - "|": [t: "â ż"] # 0x007C (vertical bar) - "}": [t: "â šâ Ž"] # 0x007D (right curly brace) - - "~": [t: "⠘⠶"] # 0x007E (simple tilde (is related to, is similar)) + - "~": [t: "⠐⠾⠒"] # 0x007E (simple tilde (is related to, is similar)) - "Âą": [t: "⠉"] # 0x00A2 (cent) + - "ÂŻ": [t: "⠾⠒"] # 0x00AF (bar) - "°": [t: "⠐⠕"] # 0x00B0 (degree sign) - "±": [t: "â –â €"] # 0x00B1 (plus or minus) - "ÂŒ": [t: "⠡⠌â č"] # 0x00BC (vulgar fraction one quarter) @@ -233,6 +252,7 @@ - "Ś‘": [t: "⠘⠘⠃"] # 0x05D1 ( beth) - "Ś’": [t: "⠘⠘⠛"] # 0x05D2 (gimel) - "Ś“": [t: "⠘⠘⠙"] # 0x05D3 (daleth) + - "◌̌": [t: "⠾⠘⠒"] # 0x030C (combing caron) - "‖": [t: "⠘⠿"] # 0x2016 (double vertical bar) - "‰": [t: "⠐⠏⠏"] # 0x2030 (per mille sign) - "â€Č": [t: "⠄"] # 0x2032 (prime) @@ -243,7 +263,17 @@ - "â„”": [t: "⠘⠘⠁"] # 0x2135 (alef) - "←": [t: "â žâ Ș"] # 0x2190 (left pointing arrow) - "↑": [t: "⠘⠻"] # 0x2191 (arrow pointing up) - - "→": [t: "â žâ ±"] # 0x2192 (left pointing arrow) + - "→": # 0x2192 (right pointing arrow) + - test: + if: "parent::m:mover and not(following-sibling::*)" + then: [t: "⠹⠒"] + else: [t: "â žâ ±"] + - "⇀": # 0x2192 (right pointing arrow) + - test: + if: "parent::m:mover and not(following-sibling::*)" + then: [t: "⠹⠒"] + else: [t: "â žâ ±"] + - "↓": [t: "â šâ »"] # 0x2193 (arrow pointing down) - "↔": [t: "⠐⠻"] # 0x2194 (horizontal two-way arrow) - "↖": [t: "⠘â Ș"] # 0x2196 (north west arrow) @@ -275,7 +305,9 @@ - "∓": [t: "⠀⠖"] # 0x2213 (minus or plus) - "∘": [t: "â žâ Œ"] # 0x2218 (hollow dot) - "∞": [t: "⠘⠉"] # 0x221E (infinity) - - "∄": [t: "â žâ ł"] # 0x2225 (is parallel to) + - "⋯": [t: "â Čâ Čâ Č"] # 0x22EF (horizontal ellipsis) + - "∄": [t: "⠘⠿"] # 0x2225 (is parallel to, but French braille uses this for magnitude, etc) + - "⫝̸": [t: "â žâ ł"] # 0x2A7D (DOUBLE SOLIDUS OPERATOR, but French braille uses this for parallel to sign) - "∧": [t: "⠘⠔"] # 0x2227 (logical product (and, meet)) - "√": [t: "⠘⠹"] # 0x2228 (logical sum (join,or)) - "∩": [t: "⠘⠖"] # 0x2229 (intersection sign ( cap )) @@ -308,10 +340,18 @@ - "⊕": [t: "⠹⠖"] # 0x2295 (circle with interior plus sign (exclusive or, direct sum, diletion)) - "⊗": [t: "⠹⠔"] # 0x2297 (circle with interior cross (tensor product)) - "⊄": [t: "⠘⠳"] # 0x22A5 (is perpendicular to) - - "⋅": [t: "⠔⠔"] # 0x22C5 (dot,and times) + - "⋅": [t: "⠔⠔"] # 0x22C5 (dot,and times) - "⌄": [t: "⠾⠘⠒"] # 0x2304 (inverted caret) + - "⌣": [t: "⠈⠈⠈"] # 0x2323 (smile) - "⏜": [t: "⠈⠒"] # 0x23DC (arc concave upward) - "△": [t: "⠹⠘⠙"] # 0x25B3 (increment (laplacian Delta) ) - "✕": [t: "⠐⠐⠔"] # 0x2715 (multiplication X) - "⟧": [t: "â šâ Ÿ"] # 0x27E7 (right barred bracket) - "âȘ„": [t: "⠐⠜⠐⠣"] # 0x2AA5 (greater than sign followed by less than sign) + - "⫝̸": [t: "â žâ ł"] # 0x2A7D (DOUBLE SOLIDUS OPERATOR) + +# Private space chars used for short forms for trig functions + - "\ue000": [t: "Lâ Ź"] + - "\ue001": [t: "Lâ š"] + - "\ue002": [t: "Lâ ź"] + - "\ue003": [t: "L⠘"] \ No newline at end of file diff --git a/Rules/prefs.yaml b/Rules/prefs.yaml index 38fc22efc..395583be8 100644 --- a/Rules/prefs.yaml +++ b/Rules/prefs.yaml @@ -95,6 +95,8 @@ LaTeX: UseShortName: false # Use the short form for the latex (e.g., "~a" instead of "\alpha") + French: + UseShortForm: false # Use the short form for trig functions and other abbreviations Other: # Note: DecimalSeparator is user-facing (can be Auto), DecimalSeparators is code-facing (always a char) diff --git a/src/braille.rs b/src/braille.rs index a4d6395e8..73cb6c5c8 100644 --- a/src/braille.rs +++ b/src/braille.rs @@ -2278,84 +2278,53 @@ fn swedish_cleanup(pref_manager: Ref, raw_braille: String) -> } static FRENCH_INDICATOR_REPLACEMENTS: phf::Map<&str, &str> = phf_map! { - // FIX: this needs to be fully checked against the French spec - // FIX: this needs cleaning up -- not all of these are used + // Keys match indicator chars emitted by French unicode.yaml, unicode-full.yaml, and French_Rules.yaml "S" => "XXX", // sans-serif -- from prefs "B" => "â ž", // bold - "đ”č" => "XXX", // blackboard -- from prefs + "đ”č" => "â š", // blackboard -- from prefs "T" => "⠈", // script "I" => "â ž", // italic - "R" => "", // roman - "E" => "â °", // English "1" => "⠀", // Grade 1 symbol (used for number followed by a letter) "L" => "", // Letter left in to assist in locating letters "D" => "XXX", // German (Deutsche) -- from prefs "G" => "⠘", // Greek - "V" => "XXX", // Greek Variants - // "H" => "â  â  ", // Hebrew - // "U" => "⠈⠈", // Russian "C" => "â š", // capital - "𝑐" => "", // second or latter braille cell of a capital letter "đ¶" => "â š", // capital that never should get whitespace in front (from chemical element) "N" => "", // number indicator - "n" => "", // number indicator for drop numbers (special case with close parens) - "t" => "â ±", // shape terminator "W" => "⠀", // whitespace" - "𝐖"=> "⠀", // whitespace "s" => "⠆", // typeface single char indicator - "w" => "", // typeface word indicator - "e" => "", // typeface & capital terminator - "," => "⠂", // comma - "." => "â Č", // period - "-" => "-", // hyphen - "—" => "â  â €", // normal dash (2014) -- assume all normal dashes are unified here [RUEB appendix 3] - "―" => "⠐⠠⠀", // long dash (2015) -- assume all long dashes are unified here [RUEB appendix 3] - "(" => "â Š", // Not really needed, but done for consistancy with ")" - ")" => "â Ž", // Needed for rules with drop numbers to avoid mistaking for dropped 0 - "↑" => "â Ź", // superscript - "↓" => "â Ą", // subscript + "o" => "â °", // Opening group indicator + "c" => "⠆", // Closing group indicator + "P" => "⠠⠄", // Math modifier and code change indicator "#" => "", // signals end of script - "Z" => "⠐", // signals end of index of root, integrand/lim from function ("zone change") - }; -fn french_cleanup(pref_manager: Ref, raw_braille: String) -> String { +fn french_cleanup(_pref_manager: Ref, raw_braille: String) -> String { // FIX: need to implement this -- this is just a copy of the Vietnam code - // Empty bases are ok if they follow whitespace - static EMPTY_BASE: LazyLock = LazyLock::new(|| Regex::new(r"(^|[W𝐖w])E").unwrap()); + static REPLACE_INDICATORS: LazyLock = LazyLock::new(|| Regex::new(r"([1SBđ”čTILDGCđ¶NWsc#oc])").unwrap()); debug!("french_cleanup: start={}", raw_braille); // let result = typeface_to_word_mode(&raw_braille); // let result = capitals_to_word_mode(&result); - let result = raw_braille.replace("CG", "⠘") - .replace("đ”čC", "â ©") - .replace("DC", "â °"); - - debug!(" after typeface/caps={}", &result); - - // these typeforms need to get pulled from user-prefs as they are transcriber-defined - let double_struck = pref_manager.pref_to_string("Vietnam_DoubleStruck"); - let sans_serif = pref_manager.pref_to_string("Vietnam_SansSerif"); - let fraktur = pref_manager.pref_to_string("Vietnam_Fraktur"); - let greek_variant = pref_manager.pref_to_string("Vietnam_GreekVariant"); + // check to see if math modifier and code change indicator are needed at start (p8) + let result = if raw_braille.starts_with("P") { + let prefix = if raw_braille.contains("o") { "⠠⠄" } else { "â  " }; + let mut new_string = String::with_capacity(raw_braille.len() - 1 + prefix.len()); + new_string.push_str(prefix); + new_string.push_str(&raw_braille[1..]); + new_string + } else { + raw_braille + }; // This reuses the code just for getting rid of unnecessary "L"s and "N"s let result = remove_unneeded_mode_changes(&result, UEB_Mode::Grade1, UEB_Duration::Passage); debug!(" after removing mode changes={}", &result); - - let result = EMPTY_BASE.replace_all(&result, "$1"); let result: Cow<'_, str> = REPLACE_INDICATORS.replace_all(&result, |cap: &Captures| { - let matched_char = &cap[0]; - match matched_char { - "đ”č" => &double_struck, - "S" => &sans_serif, - "D" => &fraktur, - "V" => &greek_variant, - _ => match FRENCH_INDICATOR_REPLACEMENTS.get(matched_char) { - None => {error!("REPLACE_INDICATORS and FRENCH_INDICATOR_REPLACEMENTS are not in sync: missing '{}'", matched_char); ""}, + match FRENCH_INDICATOR_REPLACEMENTS.get(&cap[0]) { + None => {error!("REPLACE_INDICATORS and FRENCH_INDICATOR_REPLACEMENTS are not in sync: missing '{}'", &cap[0]); ""}, Some(&ch) => ch, - }, } }); @@ -3054,80 +3023,56 @@ impl NeedsToBeGrouped { } } - // ordinals often have an irregular start (e.g., "half") before becoming regular. - // if the number is irregular, return the ordinal form, otherwise return 'None'. - /// FIX: what needs to be implemented? - fn needs_grouping_for_french(mathml: Element, is_base: bool) -> bool { - use crate::xpath_functions::IsInDefinition; - let mut node_name = name(mathml); - if mathml.attribute_value("data-roman-numeral").is_some() { - node_name = "mi"; // roman numerals don't follow number rules - } + fn needs_grouping_for_french(mathml: Element, _is_base: bool) -> bool { + // French rules are from p26: Blocks (also mentioned elsewhere in the spec) + // if we have a "- xxx", we treat the MathML as if it were just "xxx". + // apparently, based on function_partial_derivative_14_1_04, the same goes for '∂' -- generalizing to all prefix ops... + // use crate::xpath_functions::IsInDefinition; + let mut children = mathml.children(); + let mathml = if name(mathml) == "mrow" && children.len() == 2 && + name(as_element(children[0])) == "mo" { // assuming it is a prefix op since it starts an mrow + let operand_child = as_element(children[1]); + children = operand_child.children(); + operand_child + } else { + mathml + }; + let node_name = name(mathml); + // let parent = get_parent(mathml); // there is always a "math" node because we never ask if its children need grouping + // let parent_name = name(parent); - // FIX: the leaf rules are from UEB -- check the French rules + debug!("needs_grouping_for_french: mathml (sans '-') = {}", mml_to_string(mathml)); match node_name { - "mn" => { - if !is_base { - return false; - } // clause 1 - // two 'mn's can be adjacent, in which case we need to group the 'mn' to make it clear it is separate (see bug #204) - let parent = get_parent(mathml); // there is always a "math" node - let grandparent = if name(parent) == "math" {parent} else {get_parent(parent)}; - if name(grandparent) != "mrow" { - return false; - } - let preceding = parent.preceding_siblings(); - if preceding.len() < 2 { - return false; - } - // any 'mn' would be separated from this node by invisible times - let previous_child = as_element(preceding[preceding.len()-1]); - if name(previous_child) == "mo" && as_text(previous_child) == "\u{2062}" { - let previous_child = as_element(preceding[preceding.len()-2]); - return name(previous_child) == "mn" - } else { - return false; - } + "mn" | "mi" | "mtext" => { + return as_text(mathml).contains(char::is_whitespace); }, - "mo" => { - return !is_base; // if in script, then what follows is assumed to be an operand in braille, but it isn't, so add grouping - }, - "mi" | "mtext" => { - let text = as_text(mathml); - let parent = get_parent(mathml); // there is always a "math" node - let parent_name = name(parent); - return text.chars().count() > 1 && - parent_name != "mrow" && - !IsInDefinition::is_defined_in(text, &SPEECH_DEFINITIONS, "FunctionNames").unwrap(); + "mo" => { return as_text(mathml).chars().nth(1).is_some(); }, // guessing that single chars operator don't need grouping based on set_not_belong_tor_6_4_04 + "ms" => { + return false; // FIX: is this true? Do quotes group the contents? }, "mrow" => { - // check for bracketed exprs - if IsBracketed::is_bracketed(mathml, "", "", false, true) { + if IsBracketed::is_bracketed(mathml, "", "", false, false) { return false; } - - // check for prefix at start - // example 7.12 has "2-" in superscript and is grouped, so we don't consider postfix ops - let children = mathml.children(); - if children.len() == 2 && - (name( as_element(children[0])) == "mo") { + // look for "a", "a b", etc -- last example on p26 shows "b d" doesn't need grouping + // also apparently brackets are also acceptable (see last example on p43 where numerator isn't grouped) + if children.iter().enumerate().all(|(i, &child)| { + let child = as_element(child); + if i % 2 == 1 { + name(child) == "mo" && as_text(child) == "\u{2062}" // invisible times + } else { + name(child) == "mi" || (name(child) == "mrow" && IsBracketed::is_bracketed(child, "", "", false, false)) + } + }) { return false; } - - if children.len() == 3 { - let child0 = as_element(children[0]); - let operator = as_element(children[1]); // invisible function op? - // debug!("needs_grouping_for_french: child0 ="); - if name(operator) == "mo" && as_text(operator) == "\u{2061}" && - (name(child0) == "mi" || name(child0) == "mtext") && - IsInDefinition::is_defined_in(as_text(child0), &SPEECH_DEFINITIONS, "TrigFunctionNames").unwrap() { - return false; - } - } - return true; + return !( + children.len() == 3 && + name(as_element(children[0])) == "mi" && // maybe don't need this check? E.g, sin^2 x. + name(as_element(children[1])) == "mo" && as_text(as_element(children[1])) == "\u{2061}" + ); }, - "msub" | "msup" | "msubsup" => return true, - _ => return false, + _ => return true, } } diff --git a/tests/braille/French/chemistry.rs b/tests/braille/French/chemistry.rs index b5d4606a4..4eedcda3a 100644 --- a/tests/braille/French/chemistry.rs +++ b/tests/braille/French/chemistry.rs @@ -37,7 +37,7 @@ fn equilibrium_III_5_2() -> Result<()> { let expr= r#"2H2O ⇌(2)(1)H3O++OH-"#; - test_braille("French", expr, " â Łâ šâ “â Łâ šâ •â °â žâ »â †â ąâ ąâ Šâ Łâ Žâ ˆâ ˆâ Šâ Ąâ Žâ šâ “â ©â šâ •â ˆâ °â –â †â –â šâ •â šâ “â ˆâ °â €â †")?; + test_braille("French", expr, "â Łâ šâ “â Łâ šâ •â °â žâ »â †â ąâ ąâ Šâ Łâ Žâ ˆâ ˆâ Šâ Ąâ Žâ šâ “â ©â šâ •â ˆâ °â –â †â –â šâ •â šâ “â ˆâ °â €â †")?; return Ok(()); } @@ -49,6 +49,6 @@ fn equilibrium_III_5_3() -> Result<()> { R-CO-O- R'+ H2O"#; - test_braille("French", expr, " ⠚⠗⠀⠚⠉⠚⠕⠀⠚⠕⠀⠚⠓⠖⠚⠗⠄⠀⠚⠕⠚⠓ â žâ »â šâ ąâ °â “â œâ ™â —â •â ‡â œâ Žâ ‘â †â šâ ”â ˆâ °â ‘â Žâ žâ —â Šâ ‹â Šâ ‰â â žâ Šâ •â â †â šâ —â €â šâ ‰â šâ •â €â šâ •â €â šâ —â „â –â šâ “â ąâ Łâ šâ •")?; + test_braille("French", expr, "⠚⠗⠀⠚⠉⠚⠕⠀⠚⠕⠀⠚⠓⠖⠚⠗⠄⠀⠚⠕⠚⠓ â žâ »â šâ ąâ °â “â œâ ™â —â •â ‡â œâ Žâ ‘â †â šâ ”â ˆâ °â ‘â Žâ žâ —â Šâ ‹â Šâ ‰â â žâ Šâ •â â †â šâ —â €â šâ ‰â šâ •â €â šâ •â €â šâ —â „â –â šâ “â ąâ Łâ šâ •")?; return Ok(()); } diff --git a/tests/braille/French/french.rs b/tests/braille/French/french.rs index 0acd5bf56..d0c073128 100644 --- a/tests/braille/French/french.rs +++ b/tests/braille/French/french.rs @@ -57,7 +57,7 @@ fn set_included_or_equal_6_4_07() -> Result<()> { #[test] fn set_intersection_6_4_08() -> Result<()> { - let expr= r#"A∩B=⌀"#; + let expr= r#"A∩B=∅"#; test_braille("French", expr, "⠚⠁⠘⠖⠚⠃⠶⠘⠌")?; return Ok(()); } @@ -85,63 +85,63 @@ fn devided_by_7_02() -> Result<()> { #[test] fn fraction_02_8_01() -> Result<()> { - let expr= r#"a+ba"#; + let expr= r#"a+ba"#; test_braille("French", expr, "⠠⠄⠰⠁⠖⠃⠆⠌⠁")?; return Ok(()); } #[test] fn fraction_03_8_02() -> Result<()> { - let expr= r#"a+bc+d"#; + let expr= r#"a+bc+d"#; test_braille("French", expr, "⠠⠄⠰⠁⠖⠃⠆⠌⠰⠉⠖⠙⠆")?; return Ok(()); } #[test] fn fraction_04_8_03() -> Result<()> { - let expr= r#"ab+cd=ad+bcbd"#; + let expr= r#"ab+cd=ad+bcbd"#; test_braille("French", expr, "⠠⠄⠁⠌⠃⠖⠉⠌⠙⠶⠰⠁⠙⠖⠃⠉⠆⠌⠃⠙")?; return Ok(()); } #[test] fn cardinal_8_04() -> Result<()> { - let expr= r#"CardE=5"#; + let expr= r#"CardE=5"#; test_braille("French", expr, "⠠⠄⠚⠉⠁⠗⠙⠰⠚⠑⠆⠶⠱")?; return Ok(()); } #[test] fn exponential_01_8_05() -> Result<()> { - let expr= r#"ex+3"#; + let expr= r#"ex+3"#; test_braille("French", expr, "⠠⠄⠑⠈⠰⠭⠖⠩⠆")?; return Ok(()); } #[test] fn exponential_02_8_06() -> Result<()> { - let expr= r#"e7"#; + let expr= r#"e7"#; test_braille("French", expr, "⠠⠑⠈⠻")?; return Ok(()); } #[test] fn exponential_03_8_07() -> Result<()> { - let expr= r#"e−x"#; + let expr= r#"e−x"#; test_braille("French", expr, "⠠⠑⠈⠀⠭")?; return Ok(()); } #[test] fn exponential_04_8_08() -> Result<()> { - let expr= r#"e−π"#; + let expr= r#"e−π"#; test_braille("French", expr, "⠠⠑⠈⠀⠘⠏")?; return Ok(()); } #[test] fn power_negativ_one_8_09() -> Result<()> { - let expr= r#"x−1=1x"#; + let expr= r#"x−1=1x"#; test_braille("French", expr, "â  â ­â ˆâ €â Ąâ ¶â Ąâ Œâ ­")?; return Ok(()); } @@ -239,7 +239,7 @@ fn sub_a_prime_0_9_4_01() -> Result<()> { #[test] fn sub_mixt_0_9_4_02() -> Result<()> { - let expr= r#"x0â€Č2"#; + let expr= r#"xâ€Č02"#; test_braille("French", expr, "â ­â „â ąâ Œâ ˆâ Ł")?; return Ok(()); } @@ -281,7 +281,7 @@ fn lef_sub_9_5_02() -> Result<()> { #[test] fn left_right_sup_9_5_03() -> Result<()> { - let expr= r#"tAtB"#; + let expr= r#"AtBt"#; test_braille("French", expr, "⠰⠈⠞⠹⠁⠆⠰⠈⠞⠹⠃⠆")?; return Ok(()); } @@ -295,21 +295,7 @@ fn left_sub_sup_test_9_5_04() -> Result<()> { #[test] fn bigsum_one_line_9_6_01() -> Result<()> { - let expr= r#"∑i=1nui=u1+u2+⋯+un"#; - test_braille("French", expr, "â šâ ˜â Žâ ąâ ąâ °â Šâ ¶â Ąâ †â ˆâ ˆâ â „â ąâ Šâ ¶â „â ąâ Ąâ –â „â ąâ Łâ –â Čâ Čâ Čâ –â „â ąâ ")?; - return Ok(()); -} -#[test] -fn bigsum_two_lines_9_6_01() -> Result<()> { - let expr= r#"∑i=1nui=u1+u2+⋯+un"#; - test_braille("French", expr, " -â šâ ˜â Žâ ąâ ąâ °â Šâ ¶â Ąâ †â ˆâ ˆâ â „â ąâ Šâ  -â ¶â „â ąâ Ąâ –â „â ąâ Łâ –â Čâ Čâ Čâ –â „â ąâ ")?; - return Ok(()); -} -#[test] -fn bigsum_one_line_with_bloc_9_6_01() -> Result<()> { - let expr= r#"∑i=1nui=u1+u2+⋯+un"#; + let expr= r#"∑i=1nui=u1+u2+⋯+un"#; test_braille("French", expr, "â šâ ˜â Žâ ąâ ąâ °â Šâ ¶â Ąâ †â ˆâ ˆâ â „â ąâ Šâ ¶â „â ąâ Ąâ –â „â ąâ Łâ –â Čâ Čâ Čâ –â „â ąâ ")?; return Ok(()); } @@ -439,23 +425,12 @@ fn restriction_of_f_to_13_2_04() -> Result<()> { return Ok(()); } -#[test] -fn determinant_tabular_13_3_01() -> Result<()> { - let expr= r#"I=|1023|=3"#; - test_braille("French", expr, " -â šâ Šâ ¶â żâ Ąâ €â Œâ ż - ⠿⠣⠀⠩⠿⠶⠩")?; - return Ok(()); -} -#[test] -fn matrix_tabular_13_3_02() -> Result<()> { - let expr= r#"J=(142356−789)"#; - test_braille("French", expr, " -⠚⠚⠶⠊⠥⠀⠀⠀⠀⠀⠀â čâ Ž -⠀⠀⠀⠊⠣⠀⠩⠀⠱⠀⠀⠫⠎ -⠀⠀⠀⠊⠀⠻⠀⠳⠀⠀⠀â Șâ Ž")?; - return Ok(()); -} +// #[test] +// fn determinant_tabular_13_3_01() -> Result<()> { +// let expr= r#"I=|1023|=3"#; +// test_braille("French", expr, "not correctâ šâ Šâ ¶â żâ Ąâ €â Œâ ż ⠿⠣⠀⠩⠿⠶⠩")?; +// return Ok(()); +// } #[test] fn matrix_linear_13_3_02() -> Result<()> { let expr= r#"J=(142356−789)"#; @@ -463,28 +438,12 @@ fn matrix_linear_13_3_02() -> Result<()> { return Ok(()); } #[test] -fn matrix_with_equations_two_lines_13_3_03() -> Result<()> { - let expr= r#"K=[1x2+3x−96x3−x2+1x+3y+5g(x)]"#; - test_braille("French", expr, " -â šâ …â ¶â ˜â ·â Ąâ €â °â ­â ˆâ Łâ –â ©â ­â €â Șâ †â Œâ °â «â ­â ˆâ ©â €â ­â ˆâ Łâ  -â –â Ąâ †â €â  â œâ €â °â ­â –â ©â †â Œâ °â œâ –â ±â †â €â ›â Šâ ­â Žâ ˜â Ÿ")?; - return Ok(()); -} -#[test] fn matrix_with_equations_one_lines_13_3_03() -> Result<()> { let expr= r#"K=[1x2+3x−96x3−x2+1x+3y+5g(x)]"#; test_braille("French", expr, "â šâ …â ¶â ˜â ·â Ąâ €â °â ­â ˆâ Łâ –â ©â ­â €â Șâ †â Œâ °â «â ­â ˆâ ©â €â ­â ˆâ Łâ –â Ąâ †â €â  â œâ €â °â ­â –â ©â †â Œâ °â œâ –â ±â †â €â ›â Šâ ­â Žâ ˜â Ÿ")?; return Ok(()); } #[test] -fn sytem_equation_tabular_13_4_01() -> Result<()> { - let expr= r#"{2x+3y=53x−7y=8"#; - test_braille("French", expr, " -â žâ Šâ Łâ ­â –â ©â œâ ¶â ± -â €â €â ©â ­â €â »â œâ ¶â ł")?; - return Ok(()); -} -#[test] fn sytem_equation_linĂ©araire_13_4_01() -> Result<()> { let expr= r#"{2x+3y=53x−7y=8"#; test_braille("French", expr, "â žâ Šâ Łâ ­â –â ©â œâ ¶â ±â €â  â œâ €â ©â ­â €â »â œâ ¶â ł")?; @@ -546,26 +505,26 @@ fn limit_x_tends_of_formula_lt_2_14_2_03_corrected() -> Result<()> { return Ok(()); } -#[test] -fn sign_chart_14_3_01() -> Result<()> { - let expr= r#"x−∞32+∞2x−3−0+"#; - test_braille("French", expr, " -â ­â €â €â €â žâ €â ˜â ‰â €â €â ©â Œâ Łâ €â €â €â –â ˜â ‰ -⠒⠒⠒⠒â ș⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒ -â Łâ ­â €â ©â žâ €â €â €â €â €â €â Œâ €â €â –")?; - return Ok(()); -} - -#[test] -fn sign_chart_14_3_02() -> Result<()> { - let expr= r#"x−∞7+∞fâ€Č(x)+0−f(x)−∞↗−1↘−∞"#; - test_braille("French", expr, " -⠀⠭⠀⠀⠀⠀⠞⠀⠘⠉⠀⠀⠀⠀⠀⠻⠀⠀⠀⠀⠀⠖⠘ -⠒⠒⠒⠒⠒â ș⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒ -⠋⠄⠊⠭⠎⠞⠀⠀⠀⠀⠖⠀⠀⠀⠀⠌⠀⠀⠀⠀⠀ -â ‹â Šâ ­â Žâ €â žâ €â ˜â ‰â €â ˜â ±â €â €â Ąâ €â šâ ±â €â €â ˜â ‰")?; - return Ok(()); -} +// #[test] +// fn sign_chart_14_3_01() -> Result<()> { +// let expr= r#"x−∞32+∞2x−3−0+"#; +// test_braille("French", expr, " +// â ­â €â €â €â žâ €â ˜â ‰â €â €â ©â Œâ Łâ €â €â €â –â ˜â ‰ +// ⠒⠒⠒⠒â ș⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒ +// â Łâ ­â €â ©â žâ €â €â €â €â €â €â Œâ €â €â –")?; +// return Ok(()); +// } + +// #[test] +// fn sign_chart_14_3_02() -> Result<()> { +// let expr= r#"x−∞7+∞fâ€Č(x)+0−f(x)−∞↗−1↘−∞"#; +// test_braille("French", expr, " +// ⠀⠭⠀⠀⠀⠀⠞⠀⠘⠉⠀⠀⠀⠀⠀⠻⠀⠀⠀⠀⠀⠖⠘ +// ⠒⠒⠒⠒⠒â ș⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒ +// ⠋⠄⠊⠭⠎⠞⠀⠀⠀⠀⠖⠀⠀⠀⠀⠌⠀⠀⠀⠀⠀ +// â ‹â Šâ ­â Žâ €â žâ €â ˜â ‰â €â ˜â ±â €â €â Ąâ €â šâ ±â €â €â ˜â ‰")?; +// return Ok(()); +// } #[test] fn integral_from_to_1_14_4_01() -> Result<()> { let expr= r#"∫abf(x)dx"#; @@ -576,9 +535,7 @@ fn integral_from_to_1_14_4_01() -> Result<()> { #[test] fn integral_two_lines_14_4_02() -> Result<()> { let expr= r#"∫052f(x)dx=F(52)−F(0)"#; - test_braille("French", expr, " -â Żâ ąâ Œâ ˆâ °â ±â Œâ Łâ †â ‹â Šâ ­â Žâ ™â ­â  -â ¶â šâ ‹â Šâ ±â Œâ Łâ Žâ €â šâ ‹â Šâ Œâ Ž")?; + test_braille("French", expr, "â Żâ ąâ Œâ ˆâ °â ±â Œâ Łâ †â ‹â Šâ ­â Žâ ™â ­â ¶â šâ ‹â Šâ ±â Œâ Łâ Žâ €â šâ ‹â Šâ Œâ Ž")?; return Ok(()); } #[test] @@ -597,7 +554,7 @@ fn integral_from_to_2_14_4_03() -> Result<()> { #[test] fn integral_over_curve_14_4_04() -> Result<()> { - let expr= r#"∫(c)f(x)dx"#; + let expr= r#"∫(C)f(x)dx"#; test_braille("French", expr, "⠯⠱⠩⠹⠉⠮⠋⠩⠭⠮⠙⠭")?; return Ok(()); } @@ -625,32 +582,24 @@ fn logarithm_natural_product_14_5_02() -> Result<()> { #[test] fn logarthm_change_base_14_5_03() -> Result<()> { - let expr= r#"log7x=ln⁥xln⁥7"#; + let expr: &str= r#"log7x=ln⁥xln⁥7"#; test_braille("French", expr, "â ‡â •â ›â ąâ »â °â ­â †â ¶â ‡â â °â ­â †â Œâ ‡â â °â »â †")?; return Ok(()); } #[test] fn cos_of_sum_1_14_6_01() -> Result<()> { - let expr= r#"cos⁥(a+b)=cosacosb−sinasinb"#; - test_braille("French", expr, "⠉⠕⠎⠊⠁⠖⠃⠎⠶⠉⠕⠎⠰⠁⠆⠉⠕⠎⠰⠃⠆⠐⠀⠎⠊⠝⠰⠁⠆⠎⠊⠝⠰⠃⠆")?; + let expr= r#"cos(a+b)=cosacosb−sinasinb"#; + test_braille("French", expr, "⠉⠕⠎⠊⠁⠖⠃⠎⠶⠉⠕⠎⠰⠁⠆⠉⠕⠎⠰⠃⠆⠀⠎⠊⠝⠰⠁⠆⠎⠊⠝⠰⠃⠆")?; return Ok(()); } #[test] fn cos_of_sum_2_14_6_01b() -> Result<()> { - let expr= r#"cos⁥(a+b)=cosacosb−sinasinb"#; - test_braille("French", expr, "â šâ Źâ Šâ â –â ƒâ Žâ ¶â šâ Źâ â šâ Źâ ƒâ €â Źâ â Źâ ƒ")?; - return Ok(()); -} - -#[test] -fn cos_of_sum_3_14_6_01b() -> Result<()> { let expr= r#"cos(a+b)=cosacosb−sinasinb"#; - test_braille("French", expr, "â šâ Źâ Šâ â –â ƒâ Žâ ¶â šâ Źâ â šâ Źâ ƒâ €â Źâ â Źâ ƒ")?; + test_braille_prefs("French", vec![("French_UseShortForm", "true")], expr, "â šâ Źâ Šâ â –â ƒâ Žâ ¶â šâ Źâ â šâ Źâ ƒâ €â Źâ â Źâ ƒ")?; return Ok(()); } - #[test] fn cosh_sinh_14_7_01() -> Result<()> { let expr= r#"cosh2x−sinh2x=1"#; @@ -674,14 +623,14 @@ fn set_formula_15_02() -> Result<()> { #[test] fn power_ordinal_a_16_4_07() -> Result<()> { let expr= r#"(p+q)iĂšme"#; - test_braille("French", expr, "⠩⠏⠖⠟⠮⠈⠊⠼⠍")?; + test_braille("French", expr, "⠩⠏⠖⠟⠮⠈⠊⠼⠍⠑")?; return Ok(()); } #[test] fn power_ordinal_b_16_4_07() -> Result<()> { let expr= r#"(p+q)iĂšme"#; - test_braille("French", expr, "⠩⠏⠖⠟⠮⠈⠊⠼⠍")?; + test_braille("French", expr, "⠩⠏⠖⠟⠮⠈⠊⠼⠍⠑")?; return Ok(()); } From fffcc7320d3cab2aaaca75413015e15c301056eb Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Mon, 22 Jun 2026 00:18:26 -0700 Subject: [PATCH 008/162] fix clippy warning --- src/braille.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/braille.rs b/src/braille.rs index 73cb6c5c8..8dd8fb5f3 100644 --- a/src/braille.rs +++ b/src/braille.rs @@ -2307,11 +2307,11 @@ fn french_cleanup(_pref_manager: Ref, raw_braille: String) -> // let result = capitals_to_word_mode(&result); // check to see if math modifier and code change indicator are needed at start (p8) - let result = if raw_braille.starts_with("P") { + let result = if let Some(stripped) = raw_braille.strip_prefix("P") { let prefix = if raw_braille.contains("o") { "⠠⠄" } else { "â  " }; - let mut new_string = String::with_capacity(raw_braille.len() - 1 + prefix.len()); + let mut new_string = String::with_capacity(stripped.len() + prefix.len()); new_string.push_str(prefix); - new_string.push_str(&raw_braille[1..]); + new_string.push_str(stripped); new_string } else { raw_braille From de9751dbf8d2e78666e1a127ec92703914fedba9 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Thu, 25 Jun 2026 00:43:43 -0700 Subject: [PATCH 009/162] More fixes for French braille. Now at 89 correct, 8 fail, with most of the failures being open questions. --- Rules/Braille/French/French_Rules.yaml | 244 ++++++++++--------------- Rules/Braille/French/definitions.yaml | 13 +- Rules/Braille/French/unicode.yaml | 42 +++-- src/braille.rs | 182 ++++++++++++++++-- tests/braille/French/french.rs | 56 ++++-- tests/common/mod.rs | 3 + 6 files changed, 357 insertions(+), 183 deletions(-) diff --git a/Rules/Braille/French/French_Rules.yaml b/Rules/Braille/French/French_Rules.yaml index 741a7d0e8..5d224216f 100644 --- a/Rules/Braille/French/French_Rules.yaml +++ b/Rules/Braille/French/French_Rules.yaml @@ -1,27 +1,19 @@ --- -# - -# name: whitespace-omission -# 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: "(@class='MathML-unit' or BaseNode(.)[@class='MathML-unit']) and @data-previous-space-width >= 0.25" # BANA 5.3(a) -# then: [t: "𝐖"] -# - else_if: "@data-previous-space-width > 1.1" -# then: [t: "â Ź"] -# - else_if: "@data-previous-space-width >= 0.25" # thickspace -# then: [t: "W"] -# - x: "." -# - test: -# - if: "(@class='MathML-unit' or BaseNode(.)[@class='MathML-unit']) and @data-following-space-width >= 0.25" # BANA 5.3(a) -# then: [t: "𝐖"] -# - else_if: "@data-following-space-width > 1.1" -# then: [t: "â Ź"] -# - else_if: "@data-following-space-width >= 0.25" # thickspace -# then: [t: "W"] +- + name: whitespace-omission + tag: "!*" + match: "not(self::m:math) and not($MatchingWhitespace) and (@data-previous-space-width >= 0.35 or @data-following-space-width >= 0.35)" + replace: + - with: + variables: [MatchingWhitespace: "true()"] + replace: + - test: + - if: "@class='MathML-unit' or BaseNode(.)[@class='MathML-unit'] or @data-previous-space-width >= 0.35" # BANA 5.3(a) + then: [t: "W"] + - x: "." + - test: + - if: "@class='MathML-unit' or BaseNode(.)[@class='MathML-unit'] or @data-following-space-width >= 0.35" # BANA 5.3(a) + then: [t: "W"] - name: omission-intent @@ -38,12 +30,12 @@ - x: "@data-unicode" - - name: default - tag: msqrt - match: "." - replace: - - t: "⠜" - - test: + name: default + tag: msqrt + match: "." + replace: + - t: "b⠜" + - test: if: "NeedsToBeGrouped(*[1], 'French', true())" then: - t: "o" @@ -51,13 +43,15 @@ - t: "c" else: - x: "*[1]" + - t: "e" - name: default tag: mroot match: "." replace: - - t: "⠈" + - t: "b" + - t: "L⠈" # this ("L") is a hack -- it allows the optional group indicators to be added if needed before the mroot - test: if: "NeedsToBeGrouped(*[2], 'French', false())" then: @@ -75,6 +69,7 @@ - t: "c" else: - x: "*[1]" + - t: "e" # Fraction rules @@ -83,23 +78,25 @@ # The invisible plus should produce an empty string - - name: common-fraction-mixed-number - tag: mfrac - match: + name: common-fraction-mixed-number + tag: mfrac + match: - "preceding-sibling::*[1][self::m:mo][text()='\u2064'] and" # preceding element is invisible plus - "*[1][self::m:mn][not(contains(., '.'))] and" - "*[2][self::m:mn][not(contains(., '.'))]" - replace: - - t: "#" # signal end of previous numeric mode - - x: "*[1]" - - t: "N⠌" - - x: "*[2]" + replace: + - t: "b" + - x: "*[1]" + - t: "N⠌" + - x: "*[2]" + - t: "e" - name: default tag: mfrac match: "." replace: + - t: "b" - test: if: "NeedsToBeGrouped(*[1], 'French', true())" then: @@ -117,26 +114,13 @@ - t: "c" else: - x: "*[2]" - -# -# Matrix/Determinant rules -# matrix and determinant are the same other than "matrix"/"determinant" based on the bracketing chars -# we don't do spatial layout, instead the beginning/ending of each row uses the enlarged bracketing chars -- - name: default-matrix - tag: mrow - variables: - - RowStart: "*[1]" - - RowEnd: "*[3]" - match: - - "*[2][self::m:mtable] and" - - (IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|')) - replace: [x: "*[2]"] + - t: "e" - name: default-mtable tag: mtable match: "." - replace: [x: "*"] + replace: + - x: "*" - name: default tag: [mtr, mlabeledtr] @@ -145,8 +129,6 @@ - test: if: "preceding-sibling::*" then: [t: "W⠠⠜W"] - - t: "" - - x: $RowStart # - test: # if: .[self::m:mlabeledtr] @@ -157,15 +139,9 @@ if: .[self::m:mlabeledtr] then: [x: "*[position()>1]"] else: {x: "*"} - - x: $RowEnd - - -- - name: empty - tag: mtd - match: ".=''" - replace: - - t: "⠐⠂" + - test: + if: "following-sibling::* " + then: [t: "W"] - name: default @@ -173,13 +149,12 @@ match: "." replace: - test: - if: "*" - then: - - test: - if: "preceding-sibling::*" - then: [t: "W"] - - x: "*" - # else nothing to braille + if: "preceding-sibling::*" + then: [t: "W"] + - test: + if: "*[1][self::m:mtext and .=' ']" # empty or non-breaking space (canonicalized to this) + then: [t: "⠐⠂"] + else: [x: "*"] - name: no-content @@ -192,8 +167,6 @@ tag: math match: "." variables: - - RowStart: "''" # empty string -- it needs to be set - - RowEnd: "''" # empty string -- it needs to be set - MatchingWhitespace: "false()" replace: - test: @@ -208,34 +181,15 @@ replace: [t: "W"] # not sure what is correct -- if in a fraction, probably something is better than nothing - - # From 14.5, 14.6, and 14.7 -- need to add block indicators around the argument unless it has parens - name: trig-functions - tag: mrow - match: "count(*)=3 and *[2]='\u2061' and - (IsInDefinition(BaseNode(*[1]), 'Braille', 'TrigFunctionNames') or BaseNode(*[1]) = 'lim') and not(IsBracketed(*[3], '(', ')'))" - replace: - - x: "*[1]" - - test: - # p51 -- use short form for (some) trig functions; always group unless short form and no grouping needed - if: "not($French_UseShortForm and IsInDefinition(BaseNode(*[1]), 'Braille', 'ShortForms')) or - NeedsToBeGrouped(*[3], 'French', true())" - then: - - t: "o" - - x: "*[3]" - - t: "c" - else: - - x: "*[3]" - -# - -# name: binomial-frac -# tag: mrow -# match: "IsBracketed(., '(', ')') and *[2][self::m:mfrac][@linethickness=0]" -# replace: -# - x: "*[1]" -# - x: "*[2]/*[1]" -# - t: "â °â »" -# - x: "*[2]/*[2]" -# - x: "*[3]" + name: binomial-frac + tag: mrow + match: "IsBracketed(., '(', ')') and *[2][self::m:mfrac][@linethickness=0]" + replace: + - t: "⠘⠊" # large left parenthesis + - x: "*[2]/*[1]" + - t: "⠠⠜" + - x: "*[2]/*[2]" + - t: "⠘⠎" # large right parenthesis # - name: binomial-table # tag: mrow @@ -263,18 +217,39 @@ - x: "*[2]/*[last()-2]" - x: "*[2]/*[last()]" +# - +# # From 14.5, 14.6, and 14.7 -- need to add block indicators around the argument unless it has parens +# name: trig-functions +# tag: mrow +# match: "count(*)=3 and *[2]='\u2061' and +# (IsInDefinition(BaseNode(*[1]), 'Braille', 'TrigFunctionNames') or BaseNode(*[1]) = 'lim') and not(IsBracketed(*[3], '(', ')'))" +# replace: +# - x: "*[1]" +# - test: +# # p51 -- use short form for (some) trig functions; always group unless short form and no grouping needed +# if: "not($French_UseShortForm and IsInDefinition(BaseNode(*[1]), 'Braille', 'ShortForms')) or +# NeedsToBeGrouped(*[3], 'French', true())" +# then: +# - t: "o" +# - x: "*[3]" +# - t: "c" +# else: +# - x: "*[3]" + - # grouping rules -- need to add grouping symbols for some cases + # From 14.5, 14.6, and 14.7 -- need to add block indicators around the argument unless it has parens name: function-call tag: mrow # we include invisible times in the match because some AbbreviationsForGrouping are not function names match: "count(*)=3 and *[2][self::m:mo][.='\u2061'or .='\u2062'] and not(*[3][self::m:mrow][IsBracketed(., '(', ')') or IsBracketed(., '[', ']')]) and - *[1][self::m:mi][IsInDefinition(., 'Braille', 'TrigFunctionNames') or IsInDefinition(., 'Braille', 'AbbreviationsForGrouping')]" + BaseNode(*[1])[self::m:mi][not($French_UseShortForm and IsInDefinition(., 'Braille', 'ShortForms')) and + (IsInDefinition(., 'Braille', 'TrigFunctionNames') or IsInDefinition(., 'Braille', 'AbbreviationsForGrouping'))]" replace: - x: "*[1]" - t: "o" - - x: "DEBUG(*[3])" + - x: "*[3]" - t: "c" - @@ -327,7 +302,14 @@ replace: - test: if: "$French_UseShortForm and IsInDefinition(., 'Braille', 'ShortForms')" - then: [x: "BrailleChars(DefinitionValue(., 'Braille', 'ShortForms'), 'French')"] + then: + - with: + variables: [Replacement: "DefinitionValue(., 'Braille', 'ShortForms')"] + replace: + - test: + if: "translate(substring($Replacement, 1, 1), 'abcdefghijklmnopqrstuvwxyz', '')=''" + then: [x: "BrailleChars($Replacement, 'French')"] + else: [x: "$Replacement"] else: [x: "BrailleChars(., 'French')"] - @@ -370,38 +352,6 @@ - t: "⠘⠾⠒" - x: "*[1]" -- - name: single-char-exceptions # GTM 12 - tag: [mover, munder] - match: "*[2][string-length(.) = 1 and translate(., '_¯→.·˙~^⌄⌒','')='']" - replace: - - test: - if: "self::m:munder" - then: [t: "â š"] - - test: - - if: "*[2][text()='_' or text()='ÂŻ']" - then: [t: "⠾⠒"] - - else_if: "*[2][text()='→']" - then: [t: "⠹⠒"] - - else_if: "*[2][text()='.' or text()='·' or text()='˙']" - then: [t: "⠂"] # FIX: couldn't find an example - - else_if: "*[2][text()='~']" - then: [t: "⠐⠾⠒"] - - else_if: "*[2][text()='^']" - then: [t: "⠘⠒"] - - else_if: "*[2][text()='⌄']" - then: [t: "⠾⠘⠒"] - else: [t: "⠈⠒"] # arc/⌒ - # The examples in 12.1 never group the base, but this seems dubious. Needs to be confirmed - # - test: - # if: "NeedsToBeGrouped(*[1], 'French', true())" - # then: - # - t: "o" - # - x: "*[1]" - # - t: "c" - # else: [x: "*[1]"] - - x: "*[1]" - - # In French braille, we drop the script indicators in both subscripts and superscripts for: # msub: chemistry (e.g., H20) @@ -435,6 +385,7 @@ tag: [msub, msup, munder, mover] match: "." replace: + - t: "b" - test: if: "(self::m:munder or self::m:mover) and NeedsToBeGrouped(*[1], 'French', true())" then: @@ -451,13 +402,13 @@ then: [t: "â ąâ ą"] else: [t: "⠈⠈"] # mover - test: - if: "DEBUG(NeedsToBeGrouped(*[2], 'French', false()))" + if: "NeedsToBeGrouped(*[2], 'French', false())" then: - t: "o" - x: "*[2]" - t: "c" else: [x: "*[2]"] - - t: "#" # signal end script/numeric mode + - t: "e" @@ -476,7 +427,7 @@ then: [t: "â ąâ ą"] else: [t: "â ą"] - test: - if: "DEBUG(NeedsToBeGrouped(*[2], 'French', false()))" + if: "NeedsToBeGrouped(*[2], 'French', false())" then: - t: "o" - x: "*[2]" @@ -504,6 +455,7 @@ tag: mmultiscripts match: "count(*)=4 and *[2][self::m:mprescripts] and @data-chem-formula" replace: + - t: "b" - x: "*[1]" - test: if: "not(*[3][self::m:none])" @@ -527,7 +479,7 @@ - x: "*[4]" - t: "c" else: [x: "*[4]"] - + - t: "e" - name: default tag: mmultiscripts @@ -538,6 +490,10 @@ - NumChildren: "count(*)" # need to stash this since the count is wrong inside '*[...]' below - Postscripts: "*[position()>1 and position() < (last() + ($NumChildren mod 2) -count($Prescripts))]" replace: + - test: + if: "$Prescripts" + then: [t: "o"] + else: [t: "b"] - test: if: "$Prescripts" then: @@ -697,8 +653,10 @@ if: "count($Postscripts) > 8" # give up and just dump them out so at least the content is there then: - x: "$Postscripts[position() > 8]" - - t: "#" # signal end script/numeric mode - + - test: + if: "$Prescripts" + then: [t: "c"] + else: [t: "e"] - # Note: @notation can contain more than one value diff --git a/Rules/Braille/French/definitions.yaml b/Rules/Braille/French/definitions.yaml index 332abd498..8a611c06a 100644 --- a/Rules/Braille/French/definitions.yaml +++ b/Rules/Braille/French/definitions.yaml @@ -3,8 +3,12 @@ - AbbreviationsForGrouping: { "arg", "Card", "rot", + "sin", "cos", "tan", "cotan", "arcsin", "arccos", "arctan", "arccotan", - "ch", "sh", "th", + "ch", "sh", "th", "cosh", "sinh", "tanh", "coth", + "argsh", "argch", "argth", "argcoth", + "arsinh", "arcosh", "artanh", "arcoth", + "lim", } - ShortForms: { @@ -15,6 +19,9 @@ # â š -> \ue001 # â ź -> \ue002 # ⠘ -> \ue003 - "sin": "\ue000", cos: "\ue001\ue000", tan: "\ue002", "cotan": "\ue001\ue002", - arcsin: "\ue003\ue000", arccos: "\ue003\ue001\ue002", arctan: "\ue003\ue002", arccotan: "\ue003\ue001\ue002", + "sin": "\ue000", "cos": "\ue001\ue000", "tan": "\ue002", "cotan": "\ue001\ue002", + "arcsin": "\ue003\ue000", "arccos": "\ue003\ue001\ue002", "arctan": "\ue003\ue002", "arccotan": "\ue003\ue001\ue002", + + "cosh": "ch", "sinh": "sh", "tanh": "th", "coth": "coth", + "arsinh": "argsh", "arcosh": "argch", "artanh": "argth", "arcoth": "argcoth", } \ No newline at end of file diff --git a/Rules/Braille/French/unicode.yaml b/Rules/Braille/French/unicode.yaml index 0105b376e..f7e23239b 100644 --- a/Rules/Braille/French/unicode.yaml +++ b/Rules/Braille/French/unicode.yaml @@ -144,7 +144,7 @@ - "ÎŽ": [t: "GL⠙"] # 0x3b4 - "Δ": [t: "GL⠑"] # 0x3b5 - "ζ": [t: "GLâ ”"] # 0x3b6 - - "η": [t: "GLâ ±"] # 0x3b7 + - "η": [t: "GL⠓"] # 0x3b7 - "Ξ": [t: "GLâ č"] # 0x3b8 - "Îč": [t: "GL⠊"] # 0x3b9 - "Îș": [t: "GL⠅"] # 0x3ba @@ -203,8 +203,17 @@ - "!": [t: "⠾⠔"] # 0x0021 (factorial) - "%": [t: "⠐⠏"] # 0x0025 (percent sign) - - "(": [t: "â Š"] # 0x0028 (left parenthesis) - - ")": [t: "â Ž"] # 0x0029 (right parenthesis) + - "(": # 0x0028 (left parenthesis) + - test: + if: "parent::m:mrow/*[self::m:mtable]" + then: [t: "⠘⠊"] + else: [t: "â Š"] + - ")": # 0x0029 (right parenthesis) + - test: + if: "parent::m:mrow/*[self::m:mtable]" + then: [t: "⠘⠎"] + else: [t: "â Ž"] + - "*": [t: "⠐⠔"] # 0x002A (asterisk) - "+": [t: "⠖"] # 0x002B (regular plus) - ",": [t: "⠂"] # 0x002C (comma) @@ -226,20 +235,30 @@ - "<": [t: "⠐⠣"] # 0x003C (less than sign) - "=": [t: "â ¶"] # 0x003D (regular equals sign) - ">": [t: "⠐⠜"] # 0x003E (greater than sign ( regular )) - - "[": [t: "â ·"] # 0x005B (left square bracket) - - "]": [t: "â Ÿ"] # 0x005D (right square bracket) + - "[": # 0x005B (left square bracket) + - test: + if: "parent::m:mrow/*[self::m:mtable]" + then: [t: "⠘⠷"] + else: [t: "â ·"] + - "]": # 0x005B (left square bracket) + - test: + if: "parent::m:mrow/*[self::m:mtable]" + then: [t: "⠘⠟"] + else: [t: "â Ÿ"] - "^": [t: "⠘⠒"] # 0x005E (caret) - "{": # 0x007B ( left curly brace) - test: - if: "following-sibling::*[1][self::m:mtable]" - then_test: - if: "count(following-sibling::*[1]/*) = 1" - then: [t: "â šâ Š"] - else: [t: "â žâ Š"] + if: "parent::m:mrow/*[self::m:mtable] or (following-sibling::*[1][self::m:mtable] and count(following-sibling::*[1]/*) = 1)" + then: [t: "â žâ Š"] else: [t: "â šâ Š"] # regular brace - "|": [t: "â ż"] # 0x007C (vertical bar) - - "}": [t: "â šâ Ž"] # 0x007D (right curly brace) + - "}": # 0x007D (right curly brace)) + - test: + if: "parent::m:mrow/*[self::m:mtable]" + then: [t: "â žâ Ž"] + else: [t: "â šâ Ž"] - "~": [t: "⠐⠾⠒"] # 0x007E (simple tilde (is related to, is similar)) + - " ": [t: "W"] # 0x00A0 (non-breaking space) - "Âą": [t: "⠉"] # 0x00A2 (cent) - "ÂŻ": [t: "⠾⠒"] # 0x00AF (bar) - "°": [t: "⠐⠕"] # 0x00B0 (degree sign) @@ -348,7 +367,6 @@ - "✕": [t: "⠐⠐⠔"] # 0x2715 (multiplication X) - "⟧": [t: "â šâ Ÿ"] # 0x27E7 (right barred bracket) - "âȘ„": [t: "⠐⠜⠐⠣"] # 0x2AA5 (greater than sign followed by less than sign) - - "⫝̸": [t: "â žâ ł"] # 0x2A7D (DOUBLE SOLIDUS OPERATOR) # Private space chars used for short forms for trig functions - "\ue000": [t: "Lâ Ź"] diff --git a/src/braille.rs b/src/braille.rs index 8dd8fb5f3..d1b429686 100644 --- a/src/braille.rs +++ b/src/braille.rs @@ -2295,33 +2295,175 @@ static FRENCH_INDICATOR_REPLACEMENTS: phf::Map<&str, &str> = phf_map! { "s" => "⠆", // typeface single char indicator "o" => "â °", // Opening group indicator "c" => "⠆", // Closing group indicator + "b" => "â °", // Optional opening group indicator + "e" => "⠆", // Optional closing group indicator "P" => "⠠⠄", // Math modifier and code change indicator - "#" => "", // signals end of script }; +/// Remove optional group indicators `b`/`e` when not needed; promote to mandatory `o`/`c` when they are. +/// Optional pairs nest like parentheses. Resolve outer pairs before inner ones. +/// A pair is kept when its content ends with a letter/number (`L`/`N` + braille) before `e`, and a +/// letter/number follows the next `b` (or directly) after `e`. +fn remove_optional_group_indicators(braille: &str) -> String { + let chars: Vec = braille.chars().collect(); + let mut stack: Vec = Vec::new(); + let mut pairs: Vec<(usize, usize)> = Vec::new(); + + for (i, &ch) in chars.iter().enumerate() { + if ch == 'b' { + stack.push(i); + } else if ch == 'e' { + if let Some(b_idx) = stack.pop() { + pairs.push((b_idx, i)); + } + } + } + + let mut convert_to_oc = vec![false; chars.len()]; + let mut remove = vec![false; chars.len()]; + + for (b_idx, e_idx) in pairs.into_iter().rev() { + let needed = letter_or_number_before_e(b_idx, e_idx, &chars, &remove, &convert_to_oc) + && letter_or_number_after_b(e_idx, &chars, &remove, &convert_to_oc); + if needed { + convert_to_oc[b_idx] = true; + convert_to_oc[e_idx] = true; + } else { + remove[b_idx] = true; + remove[e_idx] = true; + } + } + + let mut result = String::with_capacity(braille.len()); + for (i, &ch) in chars.iter().enumerate() { + if remove[i] { + continue; + } + if convert_to_oc[i] { + result.push(if ch == 'b' { 'o' } else { 'c' }); + } else { + result.push(ch); + } + } + return result; +} + +fn is_letter_or_number_start(chars: &[char], i: usize, remove: &[bool]) -> bool { + if i + 1 >= chars.len() || remove[i] { + return false; + } + if chars[i] != 'L' && chars[i] != 'N' { + return false; + } + return !remove[i + 1] && !is_optional_group_or_mode_marker(chars[i + 1]); +} + +fn is_optional_group_or_mode_marker(ch: char) -> bool { + return matches!(ch, 'b' | 'e' | 'o' | 'c' | 'L' | 'N' | 'W' | 'P' | 'C' | '1' | '#'); +} + +fn letter_or_number_before_e( + b_idx: usize, + e_idx: usize, + chars: &[char], + remove: &[bool], + convert_to_oc: &[bool], +) -> bool { + let mut i = e_idx; + while i > b_idx { + i -= 1; + if remove[i] { + continue; + } + if chars[i] == 'e' && !convert_to_oc[i] { + continue; + } + if chars[i] == 'e' && convert_to_oc[i] { + continue; + } + if chars[i] == 'L' || chars[i] == 'N' { + return true; + } + if i > b_idx { + let mut j = i; + loop { + if j <= b_idx { + return false; + } + j -= 1; + if remove[j] { + continue; + } + if chars[j] == 'e' && !convert_to_oc[j] { + continue; + } + if chars[j] == 'e' && convert_to_oc[j] { + continue; + } + return chars[j] == 'L' || chars[j] == 'N'; + } + } + return false; + } + return false; +} + +fn letter_or_number_after_b( + e_idx: usize, + chars: &[char], + remove: &[bool], + convert_to_oc: &[bool], +) -> bool { + let mut i = e_idx + 1; + while i < chars.len() { + if remove[i] { + i += 1; + continue; + } + if chars[i] == 'e' && convert_to_oc[i] { + i += 1; + continue; + } + if chars[i] == 'b' { + return is_letter_or_number_start(chars, i + 1, remove); + } + return is_letter_or_number_start(chars, i, remove); + } + return false; +} + fn french_cleanup(_pref_manager: Ref, raw_braille: String) -> String { // FIX: need to implement this -- this is just a copy of the Vietnam code - static REPLACE_INDICATORS: LazyLock = LazyLock::new(|| Regex::new(r"([1SBđ”čTILDGCđ¶NWsc#oc])").unwrap()); + static REPLACE_INDICATORS: LazyLock = LazyLock::new(|| Regex::new(r"([1SBđ”čTILDGCđ¶NWscocbe])").unwrap()); debug!("french_cleanup: start={}", raw_braille); // let result = typeface_to_word_mode(&raw_braille); // let result = capitals_to_word_mode(&result); + let result = remove_optional_group_indicators(&raw_braille); // check to see if math modifier and code change indicator are needed at start (p8) - let result = if let Some(stripped) = raw_braille.strip_prefix("P") { - let prefix = if raw_braille.contains("o") { "⠠⠄" } else { "â  " }; + let result = if let Some(stripped) = result.strip_prefix('P') { + let prefix = if result.contains('o') { "⠠⠄" } else { "â  " }; let mut new_string = String::with_capacity(stripped.len() + prefix.len()); new_string.push_str(prefix); new_string.push_str(stripped); new_string } else { - raw_braille + result }; // This reuses the code just for getting rid of unnecessary "L"s and "N"s let result = remove_unneeded_mode_changes(&result, UEB_Mode::Grade1, UEB_Duration::Passage); debug!(" after removing mode changes={}", &result); - let result: Cow<'_, str> = REPLACE_INDICATORS.replace_all(&result, |cap: &Captures| { + // remove any grouping pair at the start or end -- we ensure they are a pair but making sure there is no "o" inside the string + let result = if result.starts_with('o') && result.ends_with('c') && !result[1..result.len() - 1].contains('o') { + // Remove the first and last characters by slicing + &result[1..result.len() - 1] + } else { + &result + }; + + let result: Cow<'_, str> = REPLACE_INDICATORS.replace_all(result, |cap: &Captures| { match FRENCH_INDICATOR_REPLACEMENTS.get(&cap[0]) { None => {error!("REPLACE_INDICATORS and FRENCH_INDICATOR_REPLACEMENTS are not in sync: missing '{}'", &cap[0]); ""}, Some(&ch) => ch, @@ -2376,7 +2518,7 @@ fn ASCIIMath_cleanup(_pref_manager: Ref, raw_braille: String) /************** Braille xpath functionality ***************/ use crate::canonicalize::{as_element, as_text, name}; -use crate::xpath_functions::{is_leaf, validate_one_node, IsBracketed}; +use crate::xpath_functions::{IsBracketed, is_leaf, validate_one_node}; use std::result::Result as StdResult; use sxd_document::dom::ParentOfChild; use sxd_xpath::function::Error as XPathError; @@ -3027,21 +3169,19 @@ impl NeedsToBeGrouped { // French rules are from p26: Blocks (also mentioned elsewhere in the spec) // if we have a "- xxx", we treat the MathML as if it were just "xxx". // apparently, based on function_partial_derivative_14_1_04, the same goes for '∂' -- generalizing to all prefix ops... + // Grouping is also needed if what follows (w/o regard to structure) is a digit or letter. // use crate::xpath_functions::IsInDefinition; - let mut children = mathml.children(); + let children = mathml.children(); let mathml = if name(mathml) == "mrow" && children.len() == 2 && name(as_element(children[0])) == "mo" { // assuming it is a prefix op since it starts an mrow - let operand_child = as_element(children[1]); - children = operand_child.children(); - operand_child + as_element(children[1]) } else { mathml }; - let node_name = name(mathml); - // let parent = get_parent(mathml); // there is always a "math" node because we never ask if its children need grouping - // let parent_name = name(parent); debug!("needs_grouping_for_french: mathml (sans '-') = {}", mml_to_string(mathml)); + let node_name = name(mathml); + let children = mathml.children(); match node_name { "mn" | "mi" | "mtext" => { return as_text(mathml).contains(char::is_whitespace); @@ -3376,4 +3516,18 @@ mod tests { assert_eq!("⠭⠔⠝", braille, "Grade1"); return Ok( () ); } + + #[test] + fn french_remove_optional_group_indicators() { + assert_eq!(remove_optional_group_indicators("bLxe+"), "Lx+"); + assert_eq!(remove_optional_group_indicators("bLxeLy"), "oLxcLy"); + assert_eq!(remove_optional_group_indicators("bLxbe+NeLz"), "oLx+NcLz"); + // inner e is followed by outer e, then L — resolve outer pair first + assert_eq!(remove_optional_group_indicators("bbLx+NeeLy"), "ooLx+NccLy"); + // adjacent pairs: second is removed first, then first sees L after it + assert_eq!( + remove_optional_group_indicators("bL⠈Nâ č⠜L⠁ebL⠈N⠩⠜L⠃e"), + "oL⠈Nâ č⠜L⠁cL⠈N⠩⠜L⠃" + ); + } } diff --git a/tests/braille/French/french.rs b/tests/braille/French/french.rs index d0c073128..a799b8ed7 100644 --- a/tests/braille/French/french.rs +++ b/tests/braille/French/french.rs @@ -6,6 +6,35 @@ use crate::common::*; use anyhow::Result; +#[test] +fn binomial_nk_01() -> Result<()> { + let expr= r#"(nk)"#; + test_braille("French", expr, "⠘⠩⠝⠠⠜⠅⠘⠮")?; + return Ok(()); +} + +#[test] +fn binomial_5_2_02() -> Result<()> { + let expr= r#"(52)"#; + test_braille("French", expr, "â ˜â Šâ ±â  â œâ Łâ ˜â Ž")?; + return Ok(()); +} + +#[test] +fn binomial_symmetry_03() -> Result<()> { + let expr= r#"(nk)=(nn−k)"#; + test_braille("French", expr, "⠘⠊⠝⠠⠜⠅⠘⠎⠶⠘⠊⠝⠠⠜⠝⠀⠅⠘⠎")?; + return Ok(()); +} + +#[test] +fn binomial_pascal_04() -> Result<()> { + let expr= r#"(nk)=(n−1k−1)+(n−1k)"#; + test_braille("French", expr, "â ˜â Šâ â  â œâ …â ˜â Žâ ¶â ˜â Šâ â €â Ąâ  â œâ …â €â Ąâ ˜â Žâ –â ˜â Šâ â €â Ąâ  â œâ …â ˜â Ž")?; + return Ok(()); +} + + #[test] fn set_of_elements_6_4_01() -> Result<()> { let expr= r#"E={a,b,c,d}"#; @@ -246,14 +275,18 @@ fn sub_mixt_0_9_4_02() -> Result<()> { #[test] fn choose_9_4_03() -> Result<()> { - let expr= r#"∁mp=∁mm−p"#; + let expr= r#"Cmp=Cmm−p"#; test_braille("French", expr, "â šâ ‰â ąâ â ˆâ â ¶â šâ ‰â ąâ â ˆâ °â â €â â †")?; return Ok(()); } #[test] fn sub_sup_mixed_formulaq_9_4_04() -> Result<()> { - let expr= r#"am+nâ€Čp+q"#; + let expr= r#" + aâ€Č' + m+n + p+q + "#; test_braille("French", expr, "⠁⠄⠄⠱⠰⠍⠖⠝⠆⠈⠰⠏⠖⠟⠆")?; return Ok(()); } @@ -273,7 +306,7 @@ fn left_sup_9_5_01() -> Result<()> { } #[test] -fn lef_sub_9_5_02() -> Result<()> { +fn left_sub_9_5_02() -> Result<()> { let expr= r#"2w"#; test_braille("French", expr, "â ąâ Łâ ș")?; return Ok(()); @@ -281,7 +314,7 @@ fn lef_sub_9_5_02() -> Result<()> { #[test] fn left_right_sup_9_5_03() -> Result<()> { - let expr= r#"AtBt"#; + let expr: &str= r#"AtBt"#; test_braille("French", expr, "⠰⠈⠞⠹⠁⠆⠰⠈⠞⠹⠃⠆")?; return Ok(()); } @@ -336,8 +369,8 @@ fn square_formula_3_10_05() -> Result<()> { #[test] fn function_from_r_to_r_11_01() -> Result<()> { - let expr= r#"f:ℝ→ℝ,x↩y=1x"#; - test_braille("French", expr, "â ’â šâ šâ —â žâ ±â šâ šâ —â ­â â ±â œâ ¶â Ąâ Œâ ­")?; + let expr= r#"f:ℝ→ℝ,x↩y=1x"#; + test_braille("French", expr, "â ‹â ’â šâ šâ —â žâ ±â šâ šâ —â ­â â ±â œâ ¶â Ąâ Œâ ­")?; return Ok(()); } @@ -486,7 +519,7 @@ fn limit_x_tends_1_14_2_01_corrected() -> Result<()> { #[test] fn limit_x_tends_and_x_lt_1_14_2_02_corrected_1() -> Result<()> { - let expr= r#"limx→4x>4f(x)=−∞"#; + let expr= r#"limx→4x>4f(x)=−∞"#; test_braille("French", expr, "â ‡â Šâ â ąâ ąâ °â ­â žâ ±â č⠂⠭⠐⠜â č⠆⠋⠊⠭⠎⠶⠀⠘⠉")?; return Ok(()); } @@ -554,14 +587,14 @@ fn integral_from_to_2_14_4_03() -> Result<()> { #[test] fn integral_over_curve_14_4_04() -> Result<()> { - let expr= r#"∫(C)f(x)dx"#; + let expr= r#"∫(C)f(x)dx"#; test_braille("French", expr, "⠯⠱⠩⠹⠉⠮⠋⠩⠭⠮⠙⠭")?; return Ok(()); } #[test] fn integral_double_over_surface_14_4_05() -> Result<()> { - let expr= r#"∯Sf(x,y)dxdy"#; + let expr= r#"∯Sf(x,y)dxdy"#; test_braille("French", expr, "â šâ Żâ Żâ ąâ šâ Žâ ‹â Šâ ­â ‚â œâ Žâ ™â ­â ™â œ")?; return Ok(()); } @@ -603,7 +636,8 @@ fn cos_of_sum_2_14_6_01b() -> Result<()> { #[test] fn cosh_sinh_14_7_01() -> Result<()> { let expr= r#"cosh2x−sinh2x=1"#; - test_braille("French", expr, "â ‰â “â ˆâ Łâ °â ­â †â €â Žâ “â ˆâ Łâ °â ­â †â ¶â Ą")?; + test_braille_prefs("French", vec![("French_UseShortForm", "true")], expr, "â ‰â “â ˆâ Łâ °â ­â †â €â Žâ “â ˆâ Łâ °â ­â †â ¶â Ą")?; + return Ok(()); } @@ -616,7 +650,7 @@ fn exists_element_of_15_01() -> Result<()> { #[test] fn set_formula_15_02() -> Result<()> { - let expr= r#"∀Δ>0∃η>0:|x2−x1|≀η⇒|f(x2)−f(x1)|≀Δ"#; + let expr= r#"∀Δ>0∃η>0:|x2−x1|≀η⇒|f(x2)−f(x1)|≀Δ"#; test_braille("French", expr, "â žâ Œâ ˜â ‘â â œâ Œâ €â žâ Ąâ ˜â “â â œâ Œâ ’â €â żâ ­â ąâ Łâ €â ­â ąâ Ąâ żâ ˜â Łâ ˜â “â €â ’â ‚â €â żâ ‹â Šâ ­â ąâ Łâ Žâ €â ‹â Šâ ­â ąâ Ąâ Žâ żâ ˜â Łâ ˜â ‘")?; return Ok(()); } diff --git a/tests/common/mod.rs b/tests/common/mod.rs index 13dfbeb45..618eeb294 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -142,6 +142,7 @@ pub fn test_braille(code: &str, mathml: &str, braille: &str) -> Result<()> { // log::debug!("\nsetting Language"); match code { "Vietnam" => set_preference("Language", "vi").unwrap(), + "French" => set_preference("Language", "fr").unwrap(), "CMU" => set_preference("Language", "es").unwrap(), _ => set_preference("Language", "en").unwrap(), } @@ -169,6 +170,7 @@ pub fn test_braille_prefs(code: &str, test_prefs: Vec<(&str, &str)>, mathml: &st // log::debug!("\nsetting Language"); match code { "Vietnam" => set_preference("Language", "vi").unwrap(), + "French" => set_preference("Language", "fr").unwrap(), "CMU" => set_preference("Language", "es").unwrap(), _ => set_preference("Language", "en").unwrap(), } @@ -273,6 +275,7 @@ pub fn test_from_braille(code: &str, mathml: &str, braille: &str) -> Result<()> // log::debug!("\nsetting Language"); match code { "Vietnam" => set_preference("Language", "vi").unwrap(), + "French" => set_preference("Language", "fr").unwrap(), "CMU" => set_preference("Language", "es").unwrap(), _ => set_preference("Language", "en").unwrap(), } From f9ba42ab0235810afd6c282b3501e4eb2d9e4caf Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Thu, 25 Jun 2026 14:41:50 -0700 Subject: [PATCH 010/162] pass through braille chars as is --- src/speech.rs | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/speech.rs b/src/speech.rs index 2545d308a..e97da7e0c 100644 --- a/src/speech.rs +++ b/src/speech.rs @@ -2822,18 +2822,21 @@ impl<'c, 's:'c, 'r, 'm:'c> SpeechRulesWithContext<'c, 's,'m> { unicode = rules.unicode_full.borrow(); replacements = unicode.get( &ch_as_u32 ); if replacements.is_none() { - 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(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; - let prefix_indicator = if ch_as_int < 1<<16 {'x'} else {'y'}; - return self.replace_chars( &format!("'\\{prefix_indicator}{:06x}'", ch_as_int), mathml); + 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(self.escape_string_for_safety(String::from(ch))); + } else { + let ch_as_int = ch as u32; + if '\u{2800}' <= ch && ch <= '\u{28ff}' { // braille -- leave as braille + return Ok(self.escape_string_for_safety(String::from(ch))); + } else { // Emulate what NVDA does: generate (including single quotes) '\xhhhh' or '\yhhhhhh' + let prefix_indicator = if ch_as_int < 1<<16 {'x'} else {'y'}; + return self.replace_chars( &format!("'\\{prefix_indicator}{:06x}'", ch_as_int), mathml); + } + } } - } - }; + }; // map across all the parts of the replacement, collect them up into a Vec, and then concat them together let result = replacements.unwrap() From 52d91c23930daaf49f913895668bd6e2e869860f Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Wed, 5 Aug 2026 11:58:32 -0700 Subject: [PATCH 011/162] UEB has a rule for some pseudo-script chars. The match for that rule was overly broad, so I removed scripted letters and numbers. That rule made its way into other braille codes, so I removed them everywhere. All tests pass. --- Rules/Braille/CMU/CMU_Rules.yaml | 30 ++++++++++++------------ Rules/Braille/Swedish/Swedish_Rules.yaml | 2 +- Rules/Braille/UEB/UEB_Rules.yaml | 2 +- Rules/Braille/Vietnam/Vietnam_Rules.yaml | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Rules/Braille/CMU/CMU_Rules.yaml b/Rules/Braille/CMU/CMU_Rules.yaml index fb53fbeb8..3b5c59a40 100644 --- a/Rules/Braille/CMU/CMU_Rules.yaml +++ b/Rules/Braille/CMU/CMU_Rules.yaml @@ -598,7 +598,7 @@ - name: single-char-exceptions # 4.3.1 tag: msup - match: "*[2][translate(., \"'*`+-ÂȘ°ÂȳŽÂčÂș‘’“”‟—‶‷\",'')='']" + match: "*[2][translate(., \"'*`+-ް‘’“”‟—‶‷\",'')='']" replace: - x: "*" - test: @@ -609,7 +609,7 @@ - name: single-char-exceptions # 4.3.1 tag: msubsup - match: "*[3][translate(., \"'*`+-ÂȘ°ÂȳŽÂčÂș‘’“”‟—‶‷\",'')='']" + match: "*[3][translate(., \"'*`+-ް‘’“”‟—‶‷\",'')='']" replace: - x: "*[1]" - x: "*[3]" @@ -633,8 +633,8 @@ name: number-char-exceptions # 4.3.1 (FIX: degree doesn't use dot-3 for chemistry or temp/angles/etc) tag: [msub, msup] match: - - "*[2][translate(., \"'*`+-∞ÂȘ°ÂȳŽÂčÂș‘’“”‟—‶‷\",'')=''] or" - - "*[2][self::m:mrow and count(*)=2 and *[1][self::m:mn] and *[2][self::m:mo][translate(., \"'*`+-ÂȘ°ÂȳŽÂčÂș‘’“”‟—‶‷\",'')='']]" + - "*[2][translate(., \"'*`+-∞ް‘’“”‟—‶‷\",'')=''] or" + - "*[2][self::m:mrow and count(*)=2 and *[1][self::m:mn] and *[2][self::m:mo][translate(., \"'*`+-ް‘’“”‟—‶‷\",'')='']]" replace: - x: "*[1]" - test: @@ -779,7 +779,7 @@ replace: - x: "*[1]" - test: # special case superscript postscripts that preceed the prescripts - if: "$Postscripts and not($Postscripts[2][self::m:none]) and $Postscripts[2][translate(., \"â€Č″‮⁗'*`+-ÂȘ°ÂȳŽÂčÂș‘’“”‟—‶‷\",'')='']" + if: "$Postscripts and not($Postscripts[2][self::m:none]) and $Postscripts[2][translate(., \"â€Č″‮⁗'*`+-ް‘’“”‟—‶‷\",'')='']" then: - x: "$Postscripts[2]" - test: @@ -805,7 +805,7 @@ # degree doesn't use dot-3 for chemistry, temp, angles -- can't know that so we make a wild guess here if: "not($Prescripts[1][.='°'] and *[1][self::m:mn or @data-chem-element])" then: [t: "⠄"] - - else_if: "$Prescripts[1][translate(., \"'*`+-ÂȘ°ÂȳŽÂčÂș‘’“”‟—‶‷\",'')='']" + - else_if: "$Prescripts[1][translate(., \"'*`+-ް‘’“”‟—‶‷\",'')='']" then: - x: "$Prescripts[1]" - test: @@ -835,7 +835,7 @@ # degree doesn't use dot-3 for chemistry, temp, angles -- can't know that so we make a wild guess here if: "not($Prescripts[2][.='°'] and *[1][self::m:mn or @data-chem-element])" then: [t: "⠄"] - - else_if: "$Prescripts[2][translate(., \"'*`+-ÂȘ°ÂȳŽÂčÂș‘’“”‟—‶‷\",'')='']" + - else_if: "$Prescripts[2][translate(., \"'*`+-ް‘’“”‟—‶‷\",'')='']" then: - x: "$Prescripts[2]" - test: @@ -868,7 +868,7 @@ # degree doesn't use dot-3 for chemistry, temp, angles -- can't know that so we make a wild guess here if: "not($Prescripts[3][.='°'] and *[1][self::m:mn or @data-chem-element])" then: [t: "⠄"] - - else_if: "$Prescripts[3][translate(., \"'*`+-ÂȘ°ÂȳŽÂčÂș‘’“”‟—‶‷\",'')='']" + - else_if: "$Prescripts[3][translate(., \"'*`+-ް‘’“”‟—‶‷\",'')='']" then: - x: "$Prescripts[3]" - test: @@ -898,7 +898,7 @@ # degree doesn't use dot-3 for chemistry, temp, angles -- can't know that so we make a wild guess here if: "not($Prescripts[4][.='°'] and *[1][self::m:mn or @data-chem-element])" then: [t: "⠄"] - - else_if: "$Prescripts[4][translate(., \"'*`+-ÂȘ°ÂȳŽÂčÂș‘’“”‟—‶‷\",'')='']" + - else_if: "$Prescripts[4][translate(., \"'*`+-ް‘’“”‟—‶‷\",'')='']" then: - x: "$Prescripts[4]" - test: @@ -935,7 +935,7 @@ # degree doesn't use dot-3 for chemistry, temp, angles -- can't know that so we make a wild guess here if: "not($Postscripts[1][.='°'] and *[1][self::m:mn or @data-chem-element])" then: [t: "⠄"] - - else_if: "$Postscripts[1][translate(., \"'*`+-ÂȘ°ÂȳŽÂčÂș‘’“”‟—‶‷\",'')='']" + - else_if: "$Postscripts[1][translate(., \"'*`+-ް‘’“”‟—‶‷\",'')='']" then: - x: "$Postscripts[1]" - test: @@ -950,7 +950,7 @@ else: - x: "$Postscripts[1]" - test: - if: "not($Postscripts[2][self::m:none]) and $Postscripts[2][translate(., \"â€Č″‮⁗'*`+-ÂȘ°ÂȳŽÂčÂș‘’“”‟—‶‷\",'')!='']" + if: "not($Postscripts[2][self::m:none]) and $Postscripts[2][translate(., \"â€Č″‮⁗'*`+-ް‘’“”‟—‶‷\",'')!='']" then: - t: "â Ą" - test: @@ -991,7 +991,7 @@ # degree doesn't use dot-3 for chemistry, temp, angles -- can't know that so we make a wild guess here if: "not($Postscripts[3][.='°'] and *[1][self::m:mn or @data-chem-element])" then: [t: "⠄"] - - else_if: "$Postscripts[3][translate(., \"'*`+-ÂȘ°ÂȳŽÂčÂș‘’“”‟—‶‷\",'')='']" + - else_if: "$Postscripts[3][translate(., \"'*`+-ް‘’“”‟—‶‷\",'')='']" then: - x: "$Postscripts[3]" - test: @@ -1021,7 +1021,7 @@ # degree doesn't use dot-3 for chemistry, temp, angles -- can't know that so we make a wild guess here if: "not($Postscripts[4][.='°'] and *[1][self::m:mn or @data-chem-element])" then: [t: "⠄"] - - else_if: "$Postscripts[4][translate(., \"'*`+-ÂȘ°ÂȳŽÂčÂș‘’“”‟—‶‷\",'')='']" + - else_if: "$Postscripts[4][translate(., \"'*`+-ް‘’“”‟—‶‷\",'')='']" then: - x: "$Postscripts[4]" - test: @@ -1054,7 +1054,7 @@ # degree doesn't use dot-3 for chemistry, temp, angles -- can't know that so we make a wild guess here if: "not($Postscripts[5][.='°'] and *[1][self::m:mn or @data-chem-element])" then: [t: "⠄"] - - else_if: "$Postscripts[5][translate(., \"'*`+-ÂȘ°ÂȳŽÂčÂș‘’“”‟—‶‷\",'')='']" + - else_if: "$Postscripts[5][translate(., \"'*`+-ް‘’“”‟—‶‷\",'')='']" then: - x: "$Postscripts[5]" - test: @@ -1084,7 +1084,7 @@ # degree doesn't use dot-3 for chemistry, temp, angles -- can't know that so we make a wild guess here if: "not($Postscripts[6][.='°'] and *[1][self::m:mn or @data-chem-element])" then: [t: "⠄"] - - else_if: "$Postscripts[6][translate(., \"'*`+-ÂȘ°ÂȳŽÂčÂș‘’“”‟—‶‷\",'')='']" + - else_if: "$Postscripts[6][translate(., \"'*`+-ް‘’“”‟—‶‷\",'')='']" then: - x: "$Postscripts[6]" - test: diff --git a/Rules/Braille/Swedish/Swedish_Rules.yaml b/Rules/Braille/Swedish/Swedish_Rules.yaml index 028574914..7a8504574 100644 --- a/Rules/Braille/Swedish/Swedish_Rules.yaml +++ b/Rules/Braille/Swedish/Swedish_Rules.yaml @@ -348,7 +348,7 @@ - name: single-char-exceptions # RUEB 3.11 -- ° and various prime/minute/seconds aren't treated as if superscripts tag: msup - match: "*[2][translate(., \"'*`ÂȘ°ÂȳŽÂčÂș‘’“”‟â€Č″‎—‶‷⁗\",'')='']" + match: "*[2][translate(., \"'*`®°‘’“”‟â€Č″‎—‶‷⁗\",'')='']" replace: - test: if: "NeedsToBeGrouped(*[1], 'Swedish', true())" diff --git a/Rules/Braille/UEB/UEB_Rules.yaml b/Rules/Braille/UEB/UEB_Rules.yaml index b9e9acb79..8e3491c80 100644 --- a/Rules/Braille/UEB/UEB_Rules.yaml +++ b/Rules/Braille/UEB/UEB_Rules.yaml @@ -340,7 +340,7 @@ - name: single-char-exceptions # RUEB 3.11 -- ° and various prime/minute/seconds aren't treated as if superscripts tag: [msup] - match: "*[2][translate(., \"'*`ÂȘ°ÂȳŽÂčÂș‘’“”‟â€Č″‎—‶‷⁗\",'')='']" + match: "*[2][translate(., \"'*`®°‘’“”‟â€Č″‎—‶‷⁗\",'')='']" replace: - test: if: "NeedsToBeGrouped(*[1], 'UEB', true())" diff --git a/Rules/Braille/Vietnam/Vietnam_Rules.yaml b/Rules/Braille/Vietnam/Vietnam_Rules.yaml index 88947d646..2b43067be 100644 --- a/Rules/Braille/Vietnam/Vietnam_Rules.yaml +++ b/Rules/Braille/Vietnam/Vietnam_Rules.yaml @@ -437,7 +437,7 @@ - name: single-char-exceptions # RUEB 3.11 -- ° and various prime/minute/seconds aren't treated as if superscripts tag: msup - match: "*[2][translate(., \"'*`ÂȘ°ÂȳŽÂčÂș‘’“”‟â€Č″‎—‶‷⁗\",'')='']" + match: "*[2][translate(., \"'*`®°‘’“”‟â€Č″‎—‶‷⁗\",'')='']" replace: [x: "*"] - From baf7de6c4c4cb70e53eb3b5edc849c781e59bb76 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Wed, 5 Aug 2026 12:00:12 -0700 Subject: [PATCH 012/162] =?UTF-8?q?Added=20new=20UEB=20chars.=20Many=20of?= =?UTF-8?q?=20these=20are=20accented=20letters.=20I=20added=20'A'=20(for?= =?UTF-8?q?=20accented=20letters)=20so=20that=20the=20pattern=20for=20them?= =?UTF-8?q?=20looks=20like:=20```=20=20-=20"=C3=91":=20[t:=20"CA=E2=A0=98?= =?UTF-8?q?=E2=A0=BBL=E2=A0=9D"]=20=20=20=20=20=20=20=20=20=20=20=20=20#?= =?UTF-8?q?=200x00D1=20```?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added a few tests. --- Rules/Braille/UEB/unicode-full.yaml | 146 ++++++++++++++++++++++++++- Rules/Braille/UEB/unicode.yaml | 6 +- src/braille.rs | 149 +++++++++++++++++++++++++--- tests/braille/UEB/other.rs | 28 ++++++ 4 files changed, 308 insertions(+), 21 deletions(-) diff --git a/Rules/Braille/UEB/unicode-full.yaml b/Rules/Braille/UEB/unicode-full.yaml index df7bf2274..48bc20ead 100644 --- a/Rules/Braille/UEB/unicode-full.yaml +++ b/Rules/Braille/UEB/unicode-full.yaml @@ -44,8 +44,150 @@ - "⅜": [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: "#N⠚N⠌N⠉"] # 0x2189 (Vulgar Fraction Zero Thirds) + + # --- UEB_Additions1 (ordered by Unicode; Å/–/≣ remain in unicode.yaml) --- + - "`": [t: "â šâ Ą"] # 0x0060 + - "ÂĄ": [t: "⠘⠰⠖"] # 0x00A1 + - "§": [t: "⠘⠎"] # 0x00A7 + - "­": [t: "â €"] # 0x00AD (soft hyphen) + - "Âź": [t: "⠘⠗"] # 0x00AE + - "ÂŻ": [t: "â ±"] # 0x00AF + - "ÂČ": # 0x00B2 + - test: + if: "(parent::m:msup or parent::m:msubsup) and not(following-sibling::*)" + then: [t: "⠌⠃"] + else: [t: "1⠔⠌⠃"] + - "Âł": # 0x00B3 + - test: + if: "(parent::m:msup or parent::m:msubsup) and not(following-sibling::*)" + then: [t: "⠌⠉"] + else: [t: "1⠔⠌⠉"] + - "¶": [t: "⠘⠏"] # 0x00B6 + - "Âč": # 0x00B9 + - test: + if: "(parent::m:msup or parent::m:msubsup) and not(following-sibling::*)" + then: [t: "⠌⠁"] + else: [t: "1⠔⠌⠁"] + - "Âż": [t: "⠘⠰⠊"] # 0x00BF + - "À": [t: "CA⠘⠥L⠁"] # 0x00C0 + - "Á": [t: "CA⠘⠌L⠁"] # 0x00C1 + - "Â": [t: "CA⠘⠩L⠁"] # 0x00C2 + - "Ã": [t: "CA⠘⠻L⠁"] # 0x00C3 + - "Ä": [t: "CA⠘⠒L⠁"] # 0x00C4 + - "Æ": [t: "C⠁⠠⠘⠖⠑"] # 0x00C6 + - "Ç": [t: "CA⠘⠯L⠉"] # 0x00C7 + - "È": [t: "CA⠘⠥L⠑"] # 0x00C8 + - "É": [t: "CA⠘⠌L⠑"] # 0x00C9 + - "Ê": [t: "CA⠘⠩L⠑"] # 0x00CA + - "Ë": [t: "CA⠘⠒L⠑"] # 0x00CB + - "Ì": [t: "CA⠘⠥L⠊"] # 0x00CC + - "Í": [t: "CA⠘⠌L⠊"] # 0x00CD + - "Î": [t: "CA⠘⠩L⠊"] # 0x00CE + - "Ï": [t: "CA⠘⠒L⠊"] # 0x00CF + - "Ð": [t: "C⠌⠫"] # 0x00D0 + - "Ñ": [t: "CA⠘⠻L⠝"] # 0x00D1 + - "Ò": [t: "CA⠘⠥L⠕"] # 0x00D2 + - "Ó": [t: "CA⠘⠌L⠕"] # 0x00D3 + - "Ô": [t: "CA⠘⠩L⠕"] # 0x00D4 + - "Õ": [t: "CA⠘⠻L⠕"] # 0x00D5 + - "Ö": [t: "CA⠘⠒L⠕"] # 0x00D6 + - "Ø": [t: "CA⠈⠥L⠕"] # 0x00D8 + - "Ù": [t: "CA⠘⠥Lâ „"] # 0x00D9 + - "Ú": [t: "CA⠘⠌Lâ „"] # 0x00DA + - "Û": [t: "CA⠘⠩Lâ „"] # 0x00DB + - "Ü": [t: "CA⠘⠒Lâ „"] # 0x00DC + - "Ý": [t: "CA⠘⠌Lâ œ"] # 0x00DD + - "Þ": [t: "Câ Œâ ź"] # 0x00DE + - "ß": [t: "â šâ ź"] # 0x00DF + - "Ă ": [t: "A⠘⠥L⠁"] # 0x00E0 + - "ĂĄ": [t: "A⠘⠌L⠁"] # 0x00E1 + - "Ăą": [t: "A⠘⠩L⠁"] # 0x00E2 + - "ĂŁ": [t: "A⠘⠻L⠁"] # 0x00E3 + - "Ă€": [t: "A⠘⠒L⠁"] # 0x00E4 + - "Ă„": [t: "A⠘⠫L⠁"] # 0x00E5 + - "ĂŠ": [t: "⠁⠘⠖⠑"] # 0x00E6 + - "ç": [t: "A⠘⠯L⠉"] # 0x00E7 + - "Ăš": [t: "A⠘⠥L⠑"] # 0x00E8 + - "Ă©": [t: "A⠘⠌L⠑"] # 0x00E9 + - "ĂȘ": [t: "A⠘⠩L⠑"] # 0x00EA + - "Ă«": [t: "A⠘⠒L⠑"] # 0x00EB + - "ĂŹ": [t: "A⠘⠥L⠊"] # 0x00EC + - "Ă­": [t: "A⠘⠌L⠊"] # 0x00ED + - "Ăź": [t: "A⠘⠩L⠊"] # 0x00EE + - "ĂŻ": [t: "A⠘⠒L⠊"] # 0x00EF + - "ð": [t: "⠌⠫"] # 0x00F0 + - "ñ": [t: "A⠘⠻L⠝"] # 0x00F1 + - "ĂČ": [t: "A⠘⠥L⠕"] # 0x00F2 + - "Ăł": [t: "A⠘⠌L⠕"] # 0x00F3 + - "ĂŽ": [t: "A⠘⠩L⠕"] # 0x00F4 + - "Ă”": [t: "A⠘⠻L⠕"] # 0x00F5 + - "ö": [t: "A⠘⠒L⠕"] # 0x00F6 + - "Ăž": [t: "A⠈⠥L⠕"] # 0x00F8 + - "Ăč": [t: "A⠘⠥Lâ „"] # 0x00F9 + - "Ăș": [t: "A⠘⠌Lâ „"] # 0x00FA + - "Ă»": [t: "A⠘⠩Lâ „"] # 0x00FB + - "ĂŒ": [t: "A⠘⠒Lâ „"] # 0x00FC + - "Ăœ": [t: "A⠘⠌Lâ œ"] # 0x00FD + - "ĂŸ": [t: "â Œâ ź"] # 0x00FE + - "Ăż": [t: "A⠘⠒Lâ œ"] # 0x00FF + - "Ćž": [t: "CA⠘⠒Lâ œ"] # 0x0178 + - "Êč": [t: "â ¶"] # 0x02B9 + - "Êș": [t: "â ¶â ¶"] # 0x02BA + - "˜": [t: "⠈⠔"] # 0x02DC + - "áșž": [t: "Câ šâ ź"] # 0x1E9E + - "‑": [t: "â €"] # 0x2011 (non-breaking hyphen) + - "‒": [t: "â €"] # 0x2012 (figure dash) + - "—": [t: "Pâ  â €"] # 0x2014 (em dash) + - "‱": [t: "â žâ Č"] # 0x2022 + - " ": [t: "â Č"] # 0x2024 + - " ": [t: "â Čâ Č"] # 0x2025 + - "‌": [t: "⠖⠖"] # 0x203C + - "‟": [t: "â ±"] # 0x203E + - "⁇": [t: "â Šâ Š"] # 0x2047 + - "⁈": [t: "⠩⠖"] # 0x2048 + - "⁉": [t: "⠖⠩"] # 0x2049 + - "⁗": [t: "â ¶â ¶â ¶â ¶"] # 0x2057 + - "⁰": # 0x2070 + - test: + if: "(parent::m:msup or parent::m:msubsup) and not(following-sibling::*)" + then: [t: "⠌⠚"] + else: [t: "1⠔⠌⠚"] + - "ⁱ": # 0x2071 + - test: + if: "(parent::m:msup or parent::m:msubsup) and not(following-sibling::*)" + then: [t: "⠊"] + else: [t: "1⠔⠊"] + - "⁎-âč": # 0x2074 - 0x2079 + - test: + if: "(parent::m:msup or parent::m:msubsup) and not(following-sibling::*)" + then: [t: "â Œ"] + else: [t: "1⠔⠌"] + - spell: "translate('.', '⁎⁔⁶⁷⁞âč', '⠙⠑⠋⠛⠓⠊')" + - "âș- ": # 0x207A - 0x207E + - test: + if: "(parent::m:msup or parent::m:msubsup) and not(following-sibling::*)" + then: [t: "⠐"] + else: [t: "1⠔⠐"] + - spell: "translate('.', 'âș⁻⁌⁜ ', 'â –â €â ¶â Łâ œ')" + - "ⁿ": # 0x207F + - test: + if: "(parent::m:msup or parent::m:msubsup) and not(following-sibling::*)" + then: [t: "⠝"] + else: [t: "1⠔⠝"] + - "₀-₉": # 0x2080 - 0x2089 + - test: + if: "(parent::m:msub or parent::m:msubsup) and count(preceding-sibling::*) = 1" + then: [t: "â Œ"] + else: [t: "1â ąâ Œ"] + - spell: "translate('.', '₀₁₂₃₄₅₆₇₈₉', '⠚⠁⠃⠉⠙⠑⠋⠛⠓⠊')" + - "₊-₎": # 0x208A - 0x208E + - test: + if: "(parent::m:msub or parent::m:msubsup) and count(preceding-sibling::*) = 1" + then: [t: "⠐"] + else: [t: "1⠹⠐"] + - spell: "translate('.', '₊₋₌₍₎', 'â –â €â ¶â Łâ œ')" + - "ℱ": [t: "⠘⠞"] # 0x2122 - "ℊ": [tc: "TL⠛⠁"] # 0x210a (Script Small G) - "ℋ": [tc: "TCL⠓⠁"] # 0x210b (Script Capital H) diff --git a/Rules/Braille/UEB/unicode.yaml b/Rules/Braille/UEB/unicode.yaml index 3256d59c5..e1b513bc8 100644 --- a/Rules/Braille/UEB/unicode.yaml +++ b/Rules/Braille/UEB/unicode.yaml @@ -103,7 +103,7 @@ - "~": [t: "⠈⠔"] # 0x007E (Tilde (swung dash)) - "Âą": [t: "⠈⠉"] # 0x00A2 (Cents sign) - "‐": [t: "â €"] # 0x2010 (Hyphen) - - "–": [t: "â  â €"] # 0x2013 (En Dash) + - "–": [t: "Pâ  â €"] # 0x2013 (En Dash) - "―": [t: "⠐⠠⠀"] # 0x2015 (Horizontal Bar) - "‖": [t: "â žâ ł"] # 0x2016 - "€": [t: "⠈⠑"] # 0x20AC (Euro sign) @@ -123,8 +123,8 @@ - "‮": [t: "1â ¶â ¶â ¶"] # 0x2034 (Triple prime sign) - "℃": [t: "⠘⠚⠠⠉"] # 0x2103 (Degrees Celsius) - "℉": [t: "⠘⠚⠠⠋"] # 0x2109 (Degrees Fahrenheit) - - "Å": [t: "⠠⠘⠫⠁"] # 0x212B (Angstrom symbol) - - "Å": [t: "⠠⠘⠫⠁"] # 0x00C5 (WIRIS uses this for Angstrom) + - "Å": [t: "CA⠘⠫L⠁"] # 0x212B (Angstrom symbol) + - "Å": [t: "CA⠘⠫L⠁"] # 0x00C5 (WIRIS uses this for Angstrom) - "∀": [t: "⠘⠁"] # 0x2200 (For all) - "∂": [t: "⠈⠙"] # 0x2202 (Partial differential) - "∃": [t: "⠘⠹"] # 0x2203 (There exists) diff --git a/src/braille.rs b/src/braille.rs index 2b7b5b34a..54fd1a45c 100644 --- a/src/braille.rs +++ b/src/braille.rs @@ -896,6 +896,7 @@ static UEB_INDICATOR_REPLACEMENTS: phf::Map<&str, &str> = phf_map! { "1" => "â °", // Grade 1 symbol "𝟙" => "â °â °", // Grade 1 word "L" => "", // Letter left in to assist in locating letters + "A" => "", // Letter accent indicator -- should be followed by accent cells and then "L" for char "D" => "XXX", // German (Deutsche) -- from prefs "G" => "â š", // Greek "V" => "⠚⠈", // Greek Variants @@ -934,6 +935,24 @@ fn is_letter_number(ch: char) -> bool { matches!(ch, '⠁' | '⠃' | '⠉' | '⠙' | '⠑' | '⠋' | '⠛' | '⠓' | '⠊' | '⠚') } +fn is_braille_char(ch: char) -> bool { + ('\u{2800}'..='\u{28ff}').contains(&ch) +} + +/// After an 'A' accent indicator, skip accent braille cells and return the index of the following 'L'. +/// Returns None if the accented-letter pattern is malformed. +fn index_after_accent_to_l(chars: &[char], after_a: usize) -> Option { + let mut j = after_a; + while j < chars.len() && is_braille_char(chars[j]) { + j += 1; + } + if j < chars.len() && chars[j] == 'L' { + Some(j) + } else { + None + } +} + static SHORT_FORMS: phf::Set<&str> = phf_set! { "L⠁L⠃", "L⠁L⠃Lâ §", "L⠁L⠉", "L⠁L⠉L⠗", "L⠁L⠋", "L⠁L⠋L⠝", "L⠁L⠋Lâ ș", "L⠁L⠛", "L⠁L⠛L⠌", "L⠁L⠇", @@ -951,7 +970,7 @@ static SHORT_FORMS: phf::Set<&str> = phf_set! { }; fn is_letter_prefix(ch: char) -> bool { - matches!(ch, 'B' | 'I' | 'đ”č' | 'S' | 'T' | 'D' | 'C' | 'đ¶' | '𝑐') + matches!(ch, 'B' | 'I' | 'đ”č' | 'S' | 'T' | 'D' | 'C' | 'đ¶' | '𝑐' | 'A') } // Trim braille spaces before and after braille indicators @@ -959,7 +978,7 @@ fn is_letter_prefix(ch: char) -> bool { // Note: fraction over is not listed due to example 42(4) which shows a space before the "/" // static ref REMOVE_SPACE_BEFORE_BRAILLE_INDICATORS: Regex = // Regex::new(r"(⠄⠄⠄|⠀⠀⠀)W+([⠌⠞â Ș])").unwrap(); -static REPLACE_INDICATORS: LazyLock = LazyLock::new(|| Regex::new(r"([1𝟙SBđ”čTIREDGVHPđ¶đ‘CLMNW𝐖swe,.-—―#ocb])").unwrap()); +static REPLACE_INDICATORS: LazyLock = LazyLock::new(|| Regex::new(r"([1𝟙SBđ”čTIREDGVHPđ¶đ‘CLAMNW𝐖swe,.-—―#ocb])").unwrap()); static COLLAPSE_SPACES: LazyLock = LazyLock::new(|| Regex::new(r"⠀⠀+").unwrap()); /// Transcriber-defined typeforms pulled from prefs (their braille is configurable), used by the @@ -1341,6 +1360,16 @@ fn capitals_to_word_mode(braille: &str) -> String { // Greek letters are a bit exceptional in that the pattern is "CGLx" -- bump 'i' next_non_cap += 1; } + if chars[next_non_cap] == 'A' { + // Accented capital: CA...Lx + match index_after_accent_to_l(&chars, next_non_cap + 1) { + Some(i_l) => next_non_cap = i_l, + None => { + error!("capitals_to_word_mode: internal error: didn't find L after CA in '{}'.", + chars[i..].iter().take(8).collect::()); + } + } + } if chars[next_non_cap] != 'L' { error!("capitals_to_word_mode: internal error: didn't find L after C in '{}'.", chars[i..next_non_cap+2].iter().collect::().as_str()); @@ -1348,6 +1377,25 @@ fn capitals_to_word_mode(braille: &str) -> String { let i_braille_char = next_non_cap + 2; result.push_str(String::from_iter(&chars[i..i_braille_char]).as_str()); i = i_braille_char; + } else if ch == 'A' { + // Lowercase accented letter: A...Lx + if is_word_mode { + result.push('e'); + is_word_mode = false; + } + match index_after_accent_to_l(&chars, i + 1) { + Some(i_l) => { + let i_braille_char = i_l + 2; + result.push_str(String::from_iter(&chars[i..i_braille_char]).as_str()); + i = i_braille_char; + } + None => { + error!("capitals_to_word_mode: internal error: didn't find L after A in '{}'.", + chars[i..].iter().take(8).collect::()); + result.push(ch); + i += 1; + } + } } else if ch == 'L' { // must be lowercase -- uppercase consumed above // assert!(LETTERS.contains(&unhighlight(chars[i+1]))); not true for other alphabets if is_word_mode { @@ -1562,15 +1610,23 @@ fn remove_unneeded_mode_changes(raw_braille: &str, start_mode: UEB_Mode, start_d match ch { 'L' => { // note: be aware of '#' case for Numeric because '1' might already be generated - // let prev_ch = if i > 1 {chars[i-1]} else {'1'}; // '1' -- anything beside ',' or '.' - // if duration == UEB_Duration::Symbol || - // ( ",. ".contains(prev_ch) && LETTER_NUMBERS.contains(&unhighlight(chars[i+1])) ) { - // result.push('1'); // need to retain grade 1 indicator (RUEB 6.5.2) - // } // let the default case handle pushing on the chars for the letter result.push(ch); i += 1; }, + 'A' => { + // Accented letter: keep A...Lx together so accent cells don't end G1 symbol mode + match index_after_accent_to_l(&chars, i + 1) { + Some(i_l) => { + result.extend(chars[i..i_l + 2].iter().copied()); // A + accents + L + letter + i = i_l + 2; + } + None => { + result.push(ch); + i += 1; + } + } + }, '1' | '𝟙' => { assert!(ch == '1' || duration != UEB_Duration::Symbol); // if '𝟙', should be Word or Passage duration // nothing to do -- let the default case handle the following chars @@ -1629,14 +1685,29 @@ fn remove_unneeded_mode_changes(raw_braille: &str, start_mode: UEB_Mode, start_d i += right_matched_chars.len(); }, 'C' => { - // Want 'C' before 'L'; Could be CC for word cap -- if so, eat it and move on + // Want 'C' before 'L' (or 'CA...L' / 'CGL'). Could be CC for word cap -- if so, eat it and move on // Note: guaranteed that there is a char after the 'C', so chars[i+1] is safe if chars[i+1] == 'C' { cap_word_mode = true; i += 1; } else { - let is_greek = chars[i+1] == 'G'; - let (is_alone, right_matched_chars, n_letters) = stands_alone(&chars, if is_greek {i+2} else {i+1}); + let mut letter_idx = i + 1; + let is_greek = chars[letter_idx] == 'G'; + if is_greek { + letter_idx += 1; + } + if letter_idx < chars.len() && chars[letter_idx] == 'A' { + match index_after_accent_to_l(&chars, letter_idx + 1) { + Some(i_l) => letter_idx = i_l, + None => { + error!("Internal error: 'CA' without L at index={i} in '{raw_braille}'"); + result.push('C'); + i += 1; + continue; + } + } + } + let (is_alone, right_matched_chars, n_letters) = stands_alone(&chars, letter_idx); // GTM 1.2.1 says we only need to use G1 for single letters or sequences that are a shortform (e.g, "ab") if is_alone && (n_letters == 1 || is_short_form(&right_matched_chars[..2*n_letters])) { // debug!(" is_alone -- pushing '1'"); @@ -1649,12 +1720,33 @@ fn remove_unneeded_mode_changes(raw_braille: &str, start_mode: UEB_Mode, start_d result.push('C'); if is_greek { result.push('G'); - i += 1; } start_g2_letter = Some(i); - // debug!(" pushing 'C' + {:?}", right_matched_chars); + // right_matched starts at A or L (not including C/G) right_matched_chars.iter().for_each(|&ch| result.push(ch)); - i += 1 + right_matched_chars.len(); + i += 1 + if is_greek {1} else {0} + right_matched_chars.len(); + } + }, + 'A' => { + // Accented lowercase letter: A...Lx + match index_after_accent_to_l(&chars, i + 1) { + Some(i_l) => { + if start_g2_letter.is_none() { + start_g2_letter = Some(i); + } + let (is_alone, right_matched_chars, n_letters) = stands_alone(&chars, i_l); + if is_alone && (n_letters == 1 || is_short_form(&right_matched_chars[..2*n_letters])) { + result.push('1'); + mode = UEB_Mode::Grade1; + } + right_matched_chars.iter().for_each(|&ch| result.push(ch)); + i += right_matched_chars.len(); + } + None => { + error!("Internal error: 'A' without L at index={i} in '{raw_braille}'"); + result.push(ch); + i += 1; + } } }, '1' => { @@ -1747,8 +1839,21 @@ fn stands_alone(chars: &[char], i: usize) -> (bool, &[char], usize) { // we scan forward and check the conditions for "standing-alone" assert_eq!(chars[i], 'L', "'stands_alone' starts with non 'L'"); // debug!("stands_alone: i={}, chars: {:?}", i, chars); - if !left_side_stands_alone(&chars[0..i]) { - return (false, &chars[i..i+2], 0); + // Exclude accent prefix A... immediately before this L (part of the same letter) + let mut letter_start = i; + let mut left_end = i; + if left_end > 0 { + let mut j = left_end; + while j > 0 && is_braille_char(chars[j - 1]) { + j -= 1; + } + if j > 0 && chars[j - 1] == 'A' { + letter_start = j - 1; + left_end = j - 1; + } + } + if !left_side_stands_alone(&chars[0..left_end]) { + return (false, &chars[letter_start..i+2], 0); } let (mut is_alone, n_letters, n_right_matched) = right_side_stands_alone(&chars[i+2..]); @@ -1760,7 +1865,8 @@ fn stands_alone(chars: &[char], i: usize) -> (bool, &[char], usize) { is_alone = false; } } - return (is_alone, &chars[i..i+2+n_right_matched], n_letters); + // Include any A... prefix so callers emit the full accented letter + return (is_alone, &chars[letter_start..i+2+n_right_matched], n_letters); /// chars before 'L' fn left_side_stands_alone(chars: &[char]) -> bool { @@ -1804,6 +1910,17 @@ fn stands_alone(chars: &[char], i: usize) -> (bool, &[char], usize) { if !intervening_chars_mode && ch == 'L' { n_letters += 1; i += 1; // ignore 'Lx' and also ignore 'ox' + } else if !intervening_chars_mode && ch == 'A' { + // Accented letter A...Lx counts as one letter + match index_after_accent_to_l(chars, i + 1) { + Some(i_l) => { + n_letters += 1; + i = i_l + 1; // now at letter braille; loop end advances past it + } + None => { + return (false, n_letters, i); + } + } } else if ch == 'c' || ch == 'b' { i += 1; // ignore 'Lx' and also ignore 'ox' } else if is_right_intervening_char(ch) { diff --git a/tests/braille/UEB/other.rs b/tests/braille/UEB/other.rs index 0c60e27db..35c7cfcf0 100644 --- a/tests/braille/UEB/other.rs +++ b/tests/braille/UEB/other.rs @@ -199,3 +199,31 @@ fn caps_bug_295() -> Result<()> { return Ok(()); } + +#[test] +fn unicode_superscript_chars_in_and_out_of_script_position() -> Result<()> { + // Scripted: msup adds ⠔; unicode then-clause omits 1 and ⠔ so result matches non-scripted + let expr = "xÂč"; + test_braille("UEB", expr, "⠭⠰⠔⠌⠁")?; + let expr = "xÂč"; + test_braille("UEB", expr, "⠭⠰⠔⠌⠁")?; + let expr = "xâș"; + test_braille("UEB", expr, "⠭⠰⠔⠐⠖")?; + let expr = "xâș"; + test_braille("UEB", expr, "⠭⠰⠔⠐⠖")?; + return Ok(()); +} + +#[test] +fn unicode_subscript_chars_in_and_out_of_script_position() -> Result<()> { + let expr = "x₁"; + test_braille("UEB", expr, "â ­â °â ąâ Œâ ")?; + let expr = "x₁"; + test_braille("UEB", expr, "â ­â °â ąâ Œâ ")?; + let expr = "x₊"; + test_braille("UEB", expr, "⠭⠰⠱⠐⠖")?; + let expr = "x₊"; + test_braille("UEB", expr, "⠭⠰⠱⠐⠖")?; + return Ok(()); +} + From 916978c0416687a93e452f0a87cd2bcf9d06c711 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Wed, 5 Aug 2026 22:25:32 -0700 Subject: [PATCH 013/162] change small spaces from 'W' to '' --- Rules/Braille/Nemeth/unicode-full.yaml | 12 ++++++------ Rules/Braille/UEB/unicode-full.yaml | 13 ++++++------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Rules/Braille/Nemeth/unicode-full.yaml b/Rules/Braille/Nemeth/unicode-full.yaml index 06831aec3..13245da4e 100644 --- a/Rules/Braille/Nemeth/unicode-full.yaml +++ b/Rules/Braille/Nemeth/unicode-full.yaml @@ -1047,21 +1047,21 @@ - " ": [t: "W"] # 0x2003 - " ": [t: "W"] # 0x2004 - " ": [t: "W"] # 0x2005 - - " ": [t: "W"] # 0x2006 + - " ": [t: ""] # 0x2006 (six-per-em) - " ": [t: "W"] # 0x2007 - " ": [t: "W"] # 0x2008 - - " ": [t: "W"] # 0x2009 - - " ": [t: "W"] # 0x200a - - "​": [t: "W"] # 0x200b + - " ": [t: ""] # 0x2009 (thin space) + - " ": [t: ""] # 0x200a (hair space) + - "​": [t: ""] # 0x200b (zero-width space) - "‹": [t: "W"] # 0x2028 - "
": [t: "W"] # 0x2029 - - " ": [t: "W"] # 0x202f + - " ": [t: ""] # 0x202f (narrow no-break space) - " ": [t: "W"] # 0x205f - "₣": [t: "⠈⠋"] # 0x20A3 (French franc sign - "₩": [t: "⠈⠝"] # 0x2046 (Naira sign) - "₩": [t: "⠈â ș"] # 0x20A9 (Won sign) - "€": [t: "⠈⠑"] # 0x20AC (Euro sign) - - "ï»ż": [t: "W"] # 0xfeff + - "ï»ż": [t: ""] # 0xfeff (BOM / ZWNBSP) - "☆": [t: "⠫⠎"] # 0x2606 - "✕": [t: "⠈⠥"] # 0x2715 - "ÂŒ": [t: "â č⠂⠌â Čâ Œ"] # 0xbc diff --git a/Rules/Braille/UEB/unicode-full.yaml b/Rules/Braille/UEB/unicode-full.yaml index 48bc20ead..750493ef8 100644 --- a/Rules/Braille/UEB/unicode-full.yaml +++ b/Rules/Braille/UEB/unicode-full.yaml @@ -6,18 +6,17 @@ - " ": [t: "W"] # 0x2003 - " ": [t: "W"] # 0x2004 - " ": [t: "W"] # 0x2005 - - " ": [t: "W"] # 0x2006 + - " ": [t: ""] # 0x2006 (six-per-em) - " ": [t: "W"] # 0x2007 - " ": [t: "W"] # 0x2008 - - " ": [t: "W"] # 0x2009 - - " ": [t: "W"] # 0x200a - - "​": [t: "W"] # 0x200b + - " ": [t: ""] # 0x2009 (thin space) + - " ": [t: ""] # 0x200a (hair space) + - "​": [t: ""] # 0x200b (zero-width space) - "‹": [t: "W"] # 0x2028 - "
": [t: "W"] # 0x2029 - - " ": [t: "W"] # 0x202f + - " ": [t: ""] # 0x202f (narrow no-break space) - " ": [t: "W"] # 0x205f - - "ï»ż": [t: "W"] # 0xfeff - + - "ï»ż": [t: ""] # 0xfeff (BOM / ZWNBSP) - "ℏ": [tc: "⠈⠒⠓"] # t: "B"F (reduced Plank's constant) - "ⅆ": [tc: "⠙"] # 0x2146 From 6bddbda41b79ade585c90168dc1c2655e3877c4b Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Thu, 6 Aug 2026 14:33:20 -0700 Subject: [PATCH 014/162] add 'H' for Hebrew alphabet indicator --- src/braille.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/braille.rs b/src/braille.rs index 54fd1a45c..f3442a325 100644 --- a/src/braille.rs +++ b/src/braille.rs @@ -2390,13 +2390,14 @@ static FRENCH_INDICATOR_REPLACEMENTS: phf::Map<&str, &str> = phf_map! { // Keys match indicator chars emitted by French unicode.yaml, unicode-full.yaml, and French_Rules.yaml "S" => "XXX", // sans-serif -- from prefs "B" => "â ž", // bold - "đ”č" => "â š", // blackboard -- from prefs + "đ”č" => "â š", // blackboard "T" => "⠈", // script "I" => "â ž", // italic "1" => "⠀", // Grade 1 symbol (used for number followed by a letter) "L" => "", // Letter left in to assist in locating letters "D" => "XXX", // German (Deutsche) -- from prefs "G" => "⠘", // Greek + "H" => "⠘⠘", // Hebrew "C" => "â š", // capital "đ¶" => "â š", // capital that never should get whitespace in front (from chemical element) "N" => "", // number indicator @@ -2543,7 +2544,7 @@ fn letter_or_number_after_b( fn french_cleanup(_pref_manager: Ref, raw_braille: String) -> String { // FIX: need to implement this -- this is just a copy of the Vietnam code - static REPLACE_INDICATORS: LazyLock = LazyLock::new(|| Regex::new(r"([1SBđ”čTILDGCđ¶NWscocbe])").unwrap()); + static REPLACE_INDICATORS: LazyLock = LazyLock::new(|| Regex::new(r"([1SBđ”čTILDGHCđ¶NWscocbe])").unwrap()); debug!("french_cleanup: start={}", raw_braille); // let result = typeface_to_word_mode(&raw_braille); // let result = capitals_to_word_mode(&result); From 6af4178fde8a0c176dcdf28fd883d1704a5b2c73 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Thu, 6 Aug 2026 14:34:47 -0700 Subject: [PATCH 015/162] promote munder/mover/munderover base attrs to element -- prevents error!() message. May want to change the promoted name... --- src/chemistry.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/chemistry.rs b/src/chemistry.rs index b8a6ca4fc..f238985c1 100644 --- a/src/chemistry.rs +++ b/src/chemistry.rs @@ -523,6 +523,15 @@ fn set_marked_chemistry_attr(mathml: Element, chem: &str) { mathml.set_attribute_value(CHEM_EQUATION, "true"); } } + "munder" | "mover" | "munderover" => { + // inherit from the base + let base = as_element(mathml.children()[0]); + if let Some(base_chem) = base.attribute(CHEM_EQUATION_OPERATOR) { + mathml.set_attribute_value(CHEM_EQUATION_OPERATOR, base_chem.value()); + } else if let Some(base_chem) = base.attribute(CHEM_FORMULA_OPERATOR) { + mathml.set_attribute_value(CHEM_FORMULA_OPERATOR, base_chem.value()); + } + } _ => error!("Internal error: {} should not be marked as 'MAYBE_CHEMISTRY'", tag_name), } } else if tag_name == "mrow" { From 1046bd53ee4f97bf79c8ec88525ee5db22f44b2e Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Thu, 6 Aug 2026 17:50:53 -0700 Subject: [PATCH 016/162] all primes on chem symbols such as R' -- used to be a reject, now neutral --- src/chemistry.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/chemistry.rs b/src/chemistry.rs index f238985c1..4b991dcef 100644 --- a/src/chemistry.rs +++ b/src/chemistry.rs @@ -1020,6 +1020,10 @@ fn likely_chem_superscript(sup: Element) -> i32 { sup.set_attribute_value("data-number", small_roman_to_number(as_str!(as_text(sup)))); sup.set_attribute_value(MAYBE_CHEMISTRY, "2"); return 2; + } else if sup_name == "mo" && !as_text(sup).is_empty() && as_str!(as_text(sup)).trim_matches(['\'', 'â€Č', '″', '‮']).is_empty() { + // primes distinguish generic groups (R, R', R'') -- neutral: don't add or rule out chemistry + sup.set_attribute_value(MAYBE_CHEMISTRY, "0"); + return 0; } else if sup_name == "mrow" { // look for something like '2+' let children = sup.children(); From af250aa4cab9c59540fe453f4f3081e4297c61a6 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Thu, 6 Aug 2026 17:54:29 -0700 Subject: [PATCH 017/162] Fix leftover value for G1 indicator -- unlike UEB, French braille numbers don't conflict with letters. Add code to handle `;` special case if there are "blocks" in the expr --- src/braille.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/braille.rs b/src/braille.rs index f3442a325..1038cb319 100644 --- a/src/braille.rs +++ b/src/braille.rs @@ -2393,7 +2393,7 @@ static FRENCH_INDICATOR_REPLACEMENTS: phf::Map<&str, &str> = phf_map! { "đ”č" => "â š", // blackboard "T" => "⠈", // script "I" => "â ž", // italic - "1" => "⠀", // Grade 1 symbol (used for number followed by a letter) + "1" => "", // Grade 1 symbol (used for number followed by a letter, but irrelevant for French, but generated by UEB cleanup) "L" => "", // Letter left in to assist in locating letters "D" => "XXX", // German (Deutsche) -- from prefs "G" => "⠘", // Greek @@ -2407,6 +2407,7 @@ static FRENCH_INDICATOR_REPLACEMENTS: phf::Map<&str, &str> = phf_map! { "c" => "⠆", // Closing group indicator "b" => "â °", // Optional opening group indicator "e" => "⠆", // Optional closing group indicator + ";" => "⠆", // Need to be able to detect ';' and potentially add dot-6 (see 7° Ponctuations) "P" => "⠠⠄", // Math modifier and code change indicator }; @@ -2414,6 +2415,7 @@ static FRENCH_INDICATOR_REPLACEMENTS: phf::Map<&str, &str> = phf_map! { /// Optional pairs nest like parentheses. Resolve outer pairs before inner ones. /// A pair is kept when its content ends with a letter/number (`L`/`N` + braille) before `e`, and a /// letter/number follows the next `b` (or directly) after `e`. +/// Because it fits in the algorithm, dealing with ';' (need to add dot-6 if inside of a block) is also handled fn remove_optional_group_indicators(braille: &str) -> String { let chars: Vec = braille.chars().collect(); let mut stack: Vec = Vec::new(); @@ -2444,11 +2446,23 @@ fn remove_optional_group_indicators(braille: &str) -> String { } } + // 7° Ponctuations: when the formula contains any block symbols (start/end of block, dots 5-6 / + // dots 2-3), a ';' is preceded by dot-6 so it isn't confused with the end-of-block indicator + // (which is also dots 2-3). This applies to every ';' in the formula, not just those nested + // inside a block. Blocks in the output are the surviving 'o'/'c' (literal or converted b/e). + let has_block = convert_to_oc.iter().any(|&converted| converted) + || chars.iter().zip(remove.iter()).any(|(&ch, &removed)| !removed && (ch == 'o' || ch == 'c')); + let mut result = String::with_capacity(braille.len()); for (i, &ch) in chars.iter().enumerate() { if remove[i] { continue; } + // A ';' gets a leading dot-6; the dots-23 itself comes from the ';' -> "⠆" mapping in + // FRENCH_INDICATOR_REPLACEMENTS. + if ch == ';' && has_block { + result.push('â  '); + } if convert_to_oc[i] { result.push(if ch == 'b' { 'o' } else { 'c' }); } else { @@ -2544,7 +2558,7 @@ fn letter_or_number_after_b( fn french_cleanup(_pref_manager: Ref, raw_braille: String) -> String { // FIX: need to implement this -- this is just a copy of the Vietnam code - static REPLACE_INDICATORS: LazyLock = LazyLock::new(|| Regex::new(r"([1SBđ”čTILDGHCđ¶NWscocbe])").unwrap()); + static REPLACE_INDICATORS: LazyLock = LazyLock::new(|| Regex::new(r"([1SBđ”čTILDGHCđ¶NWscocbe;])").unwrap()); debug!("french_cleanup: start={}", raw_braille); // let result = typeface_to_word_mode(&raw_braille); // let result = capitals_to_word_mode(&result); From f481cd5873cc2511538255dd74a05de0bb8e2fcd Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Thu, 6 Aug 2026 17:56:49 -0700 Subject: [PATCH 018/162] Lots of fixes and addition of tests. Now at 185 passed; 4 failed --- Rules/Braille/French/French_Rules.yaml | 139 ++- Rules/Braille/French/definitions.yaml | 4 +- Rules/Braille/French/unicode-full.yaml | 1136 ++++-------------------- Rules/Braille/French/unicode.yaml | 40 +- tests/braille.rs | 1 + tests/braille/French/chemistry.rs | 302 ++++++- tests/braille/French/french.rs | 265 +++++- tests/braille/French/other.rs | 367 ++++++++ 8 files changed, 1239 insertions(+), 1015 deletions(-) create mode 100644 tests/braille/French/other.rs diff --git a/Rules/Braille/French/French_Rules.yaml b/Rules/Braille/French/French_Rules.yaml index 5d224216f..66a14b325 100644 --- a/Rules/Braille/French/French_Rules.yaml +++ b/Rules/Braille/French/French_Rules.yaml @@ -244,8 +244,9 @@ # we include invisible times in the match because some AbbreviationsForGrouping are not function names match: "count(*)=3 and *[2][self::m:mo][.='\u2061'or .='\u2062'] and not(*[3][self::m:mrow][IsBracketed(., '(', ')') or IsBracketed(., '[', ']')]) and - BaseNode(*[1])[self::m:mi][not($French_UseShortForm and IsInDefinition(., 'Braille', 'ShortForms')) and - (IsInDefinition(., 'Braille', 'TrigFunctionNames') or IsInDefinition(., 'Braille', 'AbbreviationsForGrouping'))]" + BaseNode(*[1])[self::m:mi] + [not($French_UseShortForm and IsInDefinition(., 'Braille', 'ShortForms')) and + (IsInDefinition(., 'Braille', 'TrigFunctionNames') or IsInDefinition(., 'Braille', 'AbbreviationsForGrouping'))]" replace: - x: "*[1]" - t: "o" @@ -301,15 +302,13 @@ match: "." replace: - test: - if: "$French_UseShortForm and IsInDefinition(., 'Braille', 'ShortForms')" - then: - - with: - variables: [Replacement: "DefinitionValue(., 'Braille', 'ShortForms')"] - replace: - - test: - if: "translate(substring($Replacement, 1, 1), 'abcdefghijklmnopqrstuvwxyz', '')=''" - then: [x: "BrailleChars($Replacement, 'French')"] - else: [x: "$Replacement"] + if: "$French_UseShortForm" + then_test: + - if: "IsInDefinition(., 'Braille', 'ShortForms')" + then: [x: "DEBUG(DefinitionValue(., 'Braille', 'ShortForms'))"] # sin + - else_if: "IsInDefinition(., 'Braille', 'ShortFormAbbreviations')" # cosh -> ch + then: [x: "BrailleChars(DefinitionValue(., 'Braille', 'ShortFormAbbreviations'), 'French')"] + else: [x: "BrailleChars(., 'French')"] else: [x: "BrailleChars(., 'French')"] - @@ -353,24 +352,72 @@ - x: "*[1]" - - # In French braille, we drop the script indicators in both subscripts and superscripts for: - # msub: chemistry (e.g., H20) - # msup: primes - # We combine them here + # Drop subscript indicator for chemistry (e.g., H₂O → ⠹⠓⠣⠹⠕) + name: single-char-exceptions + tag: msub + match: "@data-chem-formula" + replace: + - x: "*[1]" + - x: "*[2]" + +- + # Drop superscript indicator for primes and degree (units: 37° → ⠩⠻⠐⠕, not 
⠈⠐⠕) name: single-char-exceptions - tag: [msub, msup] - match: "(@data-chem-formula) or (self::m:msup and *[2][translate(., \"'â€Č″‮\",'')=''])" + tag: msup + match: "*[2][translate(., \"'â€Č″‮°Âș\",'')='']" replace: - x: "*[1]" + - x: "*[2]" + +- + # Chemistry ion charges keep ⠈; group when followed by the same operator (chem spec p.9) + # or when the charge itself needs grouping (e.g. 2-) + name: chemistry-charge + tag: msup + match: "@data-chem-formula" + replace: + - x: "*[1]" + - t: "⠈" - test: - # we need to group an operator if it is followed by an operator (see p9 of chem spec) -- don't want 2 "+"s in a row - # it is a bit tricky, we used following and preceding because it might be at a different level of the tree - if: "@data-chem-formula and *[2][self::m:mo] and following::*[1][self::m:mo and .=preceding::*[1]]" + if: "*[2][self::m:mo] and following::*[1][self::m:mo and .=preceding::*[1]]" then: - t: "o" - x: "*[2]" - t: "c" - else: [x: "*[2]"] + else: + - test: + if: "NeedsToBeGrouped(*[2], 'French', false())" + then: + - t: "o" + - x: "*[2]" + - t: "c" + else: [x: "*[2]"] + +- + # Chemistry ion with both an atom count (subscript) and a charge (superscript), e.g. SO₄ÂČ⁻. + # The subscript drops its indicator like the msub single-char-exceptions rule (@data-chem-formula), + # and the superscript charge is handled exactly like the chemistry-charge msup rule. + name: chemistry-charge + tag: msubsup + match: "@data-chem-formula" + replace: + - x: "*[1]" + - x: "*[2]" # subscript count: single-char-exception -> no â ą indicator + - t: "⠈" + - test: + if: "*[3][self::m:mo] and following::*[1][self::m:mo and .=preceding::*[1]]" + then: + - t: "o" + - x: "*[3]" + - t: "c" + else: + - test: + if: "NeedsToBeGrouped(*[3], 'French', false())" + then: + - t: "o" + - x: "*[3]" + - t: "c" + else: [x: "*[3]"] - name: single-char-exceptions @@ -412,6 +459,56 @@ +- + # Lewis doublets: bars above or below an atom → output "1d" + name: lewis-doublets + tag: [munder, mover] + match: "*[2][.='ÂŻ'] and (*[1][@data-chem-element] or ancestor-or-self::*[contains(@intent, ':chemical-formula')] or ancestor-or-self::*[@data-chem-formula])" + replace: + - x: "*[1]" + - t: "⠰⠡⠙⠆" + +- + # Lewis doublets: bars above and below an atom → output "2d" (chem spec §I.5) + name: lewis-doublets + tag: munderover + match: "*[2][.='ÂŻ'] and *[3][.='ÂŻ'] and (*[1][@data-chem-element] or ancestor-or-self::*[contains(@intent, ':chemical-formula')] or ancestor-or-self::*[@data-chem-formula])" + replace: + - x: "*[1]" + - t: "⠰⠣⠙⠆" + +- + # Chemical equilibrium annotations: â žâ »(LTR;RTL) with empty zone = ⠐⠂ (chem spec §III.5) + # Note: the "over" comes first + name: chemical-equilibrium-zones + tag: [munderover, munder, mover] + match: "*[1][.='⇌' or .='⇄']" + replace: + - x: "*[1]" + - t: "â Š" + - test: + - if: "self::m:munder" + then: + - t: "⠐⠂⠆" + - x: "*[2]" + - else_if: "self::m:mover" + then: + - x: "*[2]" + - t: "⠆⠐⠂" + - else_if: "*[2][self::m:mtext and .=' ']" + then: + - x: "*[3]" + - t: "⠆⠐⠂" + - else_if: "*[3][self::m:mtext and .=' ']" + then: + - t: "⠐⠂⠆" + - x: "*[2]" + else: + - x: "*[3]" + - t: "⠆" + - x: "*[2]" + - t: "â Ž" + - name: msubsup_default_mmultiscripts_equiv tag: [msubsup, munderover, mmultiscripts] # mmultiscripts with only sub/sup postscript diff --git a/Rules/Braille/French/definitions.yaml b/Rules/Braille/French/definitions.yaml index 8a611c06a..8376ab0d7 100644 --- a/Rules/Braille/French/definitions.yaml +++ b/Rules/Braille/French/definitions.yaml @@ -21,7 +21,9 @@ # ⠘ -> \ue003 "sin": "\ue000", "cos": "\ue001\ue000", "tan": "\ue002", "cotan": "\ue001\ue002", "arcsin": "\ue003\ue000", "arccos": "\ue003\ue001\ue002", "arctan": "\ue003\ue002", "arccotan": "\ue003\ue001\ue002", - + } + +- ShortFormAbbreviations: { "cosh": "ch", "sinh": "sh", "tanh": "th", "coth": "coth", "arsinh": "argsh", "arcosh": "argch", "artanh": "argth", "arcoth": "argcoth", } \ No newline at end of file diff --git a/Rules/Braille/French/unicode-full.yaml b/Rules/Braille/French/unicode-full.yaml index 2f6ecc9b0..e27f214a6 100644 --- a/Rules/Braille/French/unicode-full.yaml +++ b/Rules/Braille/French/unicode-full.yaml @@ -1,4 +1,23 @@ --- + + - " ": [t: "W"] # 0x2000 (en quad, 1/2 em) + - " ": [t: "W"] # 0x2001 (em quad, 1 em) + - " ": [t: "W"] # 0x2002 (en space, 1/2 em) + - " ": [t: "W"] # 0x2003 (em space, 1 em) + - " ": [t: "W"] # 0x2004 (three-per-em, 1/3 em) + - " ": [t: "W"] # 0x2005 (four-per-em, 1/4 em) + - " ": [t: ""] # 0x2006 (six-per-em, 1/6 em) + - " ": [t: "W"] # 0x2007 (figure space) + - " ": [t: "W"] # 0x2008 (punctuation space) + - " ": [t: ""] # 0x2009 (thin space, ~1/5 em) + - " ": [t: ""] # 0x200a (hair space) + - "​": [t: ""] # 0x200b (zero-width space) + - "‹": [t: "W"] # 0x2028 (line separator) + - "
": [t: "W"] # 0x2029 (paragraph separator) + - " ": [t: ""] # 0x202f (narrow no-break space, ~thin) + - " ": [t: "W"] # 0x205f (medium math space, 4/18 em) + - "ï»ż": [t: ""] # 0xfeff (BOM / zero-width no-break space) + - "⇌": [t: "â žâ »"] # 0x21CC (Rightwards harpoon over leftwards harpoon (equilibrium)) # - "â„‚": [t: ""] # 0x2942 (Rightwards arrow above short leftwards arrow (equilibrium, trend to the right)) @@ -33,224 +52,38 @@ - "↉": [t: "⠌⠌⠩"] # 0x2189 (vulgar fraction zero thirds) - - - "𝐚": [t: "BL⠁"] # 0x1d41a - - "𝐛": [t: "BL⠃"] # 0x1d41b - - "𝐜": [t: "BL⠉"] # 0x1d41c - - "𝐝": [t: "BL⠙"] # 0x1d41d - - "𝐞": [t: "BL⠑"] # 0x1d41e - - "𝐟": [t: "BL⠋"] # 0x1d41f - - "𝐠": [t: "BL⠛"] # 0x1d420 - - "𝐡": [t: "BL⠓"] # 0x1d421 - - "𝐱": [t: "BL⠊"] # 0x1d422 - - "𝐣": [t: "BL⠚"] # 0x1d423 - - "đ€": [t: "BL⠅"] # 0x1d424 - - "đ„": [t: "BL⠇"] # 0x1d425 - - "𝐩": [t: "BL⠍"] # 0x1d426 - - "𝐧": [t: "BL⠝"] # 0x1d427 - - "𝐹": [t: "BL⠕"] # 0x1d428 - - "đ©": [t: "BL⠏"] # 0x1d429 - - "đȘ": [t: "BL⠟"] # 0x1d42a - - "đ«": [t: "BL⠗"] # 0x1d42b - - "𝐬": [t: "BL⠎"] # 0x1d42c - - "𝐭": [t: "BL⠞"] # 0x1d42d - - "𝐼": [t: "BLâ „"] # 0x1d42e - - "𝐯": [t: "BLâ §"] # 0x1d42f - - "𝐰": [t: "BLâ ș"] # 0x1d430 - - "đ±": [t: "BLâ ­"] # 0x1d431 - - "đČ": [t: "BLâ œ"] # 0x1d432 - - "𝐳": [t: "BLâ ”"] # 0x1d433 - - - "𝐀": [t: "BCL⠁"] # 0x1d400 - - "𝐁": [t: "BCL⠃"] # 0x1d401 - - "𝐂": [t: "BCL⠉"] # 0x1d402 - - "𝐃": [t: "BCL⠙"] # 0x1d403 - - "𝐄": [t: "BCL⠑"] # 0x1d404 - - "𝐅": [t: "BCL⠋"] # 0x1d405 - - "𝐆": [t: "BCL⠛"] # 0x1d406 - - "𝐇": [t: "BCL⠓"] # 0x1d407 - - "𝐈": [t: "BCL⠊"] # 0x1d408 - - "𝐉": [t: "BCL⠚"] # 0x1d409 - - "𝐊": [t: "BCL⠅"] # 0x1d40a - - "𝐋": [t: "BCL⠇"] # 0x1d40b - - "𝐌": [t: "BCL⠍"] # 0x1d40c - - "𝐍": [t: "BCL⠝"] # 0x1d40d - - "𝐎": [t: "BCL⠕"] # 0x1d40e - - "𝐏": [t: "BCL⠏"] # 0x1d40f - - "𝐐": [t: "BCL⠟"] # 0x1d410 - - "𝐑": [t: "BCL⠗"] # 0x1d411 - - "𝐒": [t: "BCL⠎"] # 0x1d412 - - "𝐓": [t: "BCL⠞"] # 0x1d413 - - "𝐔": [t: "BCLâ „"] # 0x1d414 - - "𝐕": [t: "BCLâ §"] # 0x1d415 - - "𝐖": [t: "BCLâ ș"] # 0x1d416 - - "𝐗": [t: "BCLâ ­"] # 0x1d417 - - "𝐘": [t: "BCLâ œ"] # 0x1d418 - - "𝐙": [t: "BCLâ ”"] # 0x1d419 - -# don't mark these as italic - - "𝑎": [t: "L⠁"] # 0x1d44e - - "𝑏": [t: "L⠃"] # 0x1d44f - - "𝑐": [t: "L⠉"] # 0x1d450 - - "𝑑": [t: "L⠙"] # 0x1d451 - - "𝑒": [t: "L⠑"] # 0x1d452 - - "𝑓": [t: "L⠋"] # 0x1d453 - - "𝑔": [t: "L⠛"] # 0x1d454 - - "𝑕": [t: "L⠓"] # 0x1d455 - - "𝑖": [t: "L⠊"] # 0x1d456 - - "𝑗": [t: "L⠚"] # 0x1d457 - - "𝑘": [t: "L⠅"] # 0x1d458 - - "𝑙": [t: "L⠇"] # 0x1d459 - - "𝑚": [t: "L⠍"] # 0x1d45a - - "𝑛": [t: "L⠝"] # 0x1d45b - - "𝑜": [t: "L⠕"] # 0x1d45c - - "𝑝": [t: "L⠏"] # 0x1d45d - - "𝑞": [t: "L⠟"] # 0x1d45e - - "𝑟": [t: "L⠗"] # 0x1d45f - - "𝑠": [t: "L⠎"] # 0x1d460 - - "𝑡": [t: "L⠞"] # 0x1d461 - - "𝑱": [t: "Lâ „"] # 0x1d462 - - "𝑣": [t: "Lâ §"] # 0x1d463 - - "đ‘€": [t: "Lâ ș"] # 0x1d464 - - "đ‘„": [t: "Lâ ­"] # 0x1d465 - - "𝑩": [t: "Lâ œ"] # 0x1d466 - - "𝑧": [t: "Lâ ”"] # 0x1d467 - - - "𝐮": [t: "CL⠁"] # 0x1d434 - - "đ”": [t: "CL⠃"] # 0x1d435 - - "đ¶": [t: "CL⠉"] # 0x1d436 - - "đ·": [t: "CL⠙"] # 0x1d437 - - "𝐾": [t: "CL⠑"] # 0x1d438 - - "đč": [t: "CL⠋"] # 0x1d439 - - "đș": [t: "CL⠛"] # 0x1d43a - - "đ»": [t: "CL⠓"] # 0x1d43b - - "đŒ": [t: "CL⠊"] # 0x1d43c - - "đœ": [t: "CL⠚"] # 0x1d43d - - "đŸ": [t: "CL⠅"] # 0x1d43e - - "𝐿": [t: "CL⠇"] # 0x1d43f - - "𝑀": [t: "CL⠍"] # 0x1d440 - - "𝑁": [t: "CL⠝"] # 0x1d441 - - "𝑂": [t: "CL⠕"] # 0x1d442 - - "𝑃": [t: "CL⠏"] # 0x1d443 - - "𝑄": [t: "CL⠟"] # 0x1d444 - - "𝑅": [t: "CL⠗"] # 0x1d445 - - "𝑆": [t: "CL⠎"] # 0x1d446 - - "𝑇": [t: "CL⠞"] # 0x1d447 - - "𝑈": [t: "CLâ „"] # 0x1d448 - - "𝑉": [t: "CLâ §"] # 0x1d449 - - "𝑊": [t: "CLâ ș"] # 0x1d44a - - "𝑋": [t: "CLâ ­"] # 0x1d44b - - "𝑌": [t: "CLâ œ"] # 0x1d44c - - "𝑍": [t: "CLâ ”"] # 0x1d44d - - - "𝒂": [t: "BIL⠁"] # 0x1d482 - - "𝒃": [t: "BIL⠃"] # 0x1d483 - - "𝒄": [t: "BIL⠉"] # 0x1d484 - - "𝒅": [t: "BIL⠙"] # 0x1d485 - - "𝒆": [t: "BIL⠑"] # 0x1d486 - - "𝒇": [t: "BIL⠋"] # 0x1d487 - - "𝒈": [t: "BIL⠛"] # 0x1d488 - - "𝒉": [t: "BIL⠓"] # 0x1d489 - - "𝒊": [t: "BIL⠊"] # 0x1d48a - - "𝒋": [t: "BIL⠚"] # 0x1d48b - - "𝒌": [t: "BIL⠅"] # 0x1d48c - - "𝒍": [t: "BIL⠇"] # 0x1d48d - - "𝒎": [t: "BIL⠍"] # 0x1d48e - - "𝒏": [t: "BIL⠝"] # 0x1d48f - - "𝒐": [t: "BIL⠕"] # 0x1d490 - - "𝒑": [t: "BIL⠏"] # 0x1d491 - - "𝒒": [t: "BIL⠟"] # 0x1d492 - - "𝒓": [t: "BIL⠗"] # 0x1d493 - - "𝒔": [t: "BIL⠎"] # 0x1d494 - - "𝒕": [t: "BIL⠞"] # 0x1d495 - - "𝒖": [t: "BILâ „"] # 0x1d496 - - "𝒗": [t: "BILâ §"] # 0x1d497 - - "𝒘": [t: "BILâ ș"] # 0x1d498 - - "𝒙": [t: "BILâ ­"] # 0x1d499 - - "𝒚": [t: "BILâ œ"] # 0x1d49a - - "𝒛": [t: "BILâ ”"] # 0x1d49b - - - "𝑹": [t: "BICL⠁"] # 0x1d468 - - "đ‘©": [t: "BICL⠃"] # 0x1d469 - - "đ‘Ș": [t: "BICL⠉"] # 0x1d46a - - "đ‘«": [t: "BICL⠙"] # 0x1d46b - - "𝑬": [t: "BICL⠑"] # 0x1d46c - - "𝑭": [t: "BICL⠋"] # 0x1d46d - - "𝑼": [t: "BICL⠛"] # 0x1d46e - - "𝑯": [t: "BICL⠓"] # 0x1d46f - - "𝑰": [t: "BICL⠊"] # 0x1d470 - - "đ‘±": [t: "BICL⠚"] # 0x1d471 - - "đ‘Č": [t: "BICL⠅"] # 0x1d472 - - "𝑳": [t: "BICL⠇"] # 0x1d473 - - "𝑮": [t: "BICL⠍"] # 0x1d474 - - "đ‘”": [t: "BICL⠝"] # 0x1d475 - - "đ‘¶": [t: "BICL⠕"] # 0x1d476 - - "đ‘·": [t: "BICL⠏"] # 0x1d477 - - "𝑾": [t: "BICL⠟"] # 0x1d478 - - "đ‘č": [t: "BICL⠗"] # 0x1d479 - - "đ‘ș": [t: "BICL⠎"] # 0x1d47a - - "đ‘»": [t: "BICL⠞"] # 0x1d47b - - "đ‘Œ": [t: "BICLâ „"] # 0x1d47c - - "đ‘œ": [t: "BICLâ §"] # 0x1d47d - - "đ‘Ÿ": [t: "BICLâ ș"] # 0x1d47e - - "𝑿": [t: "BICLâ ­"] # 0x1d47f - - "𝒀": [t: "BICLâ œ"] # 0x1d480 - - "𝒁": [t: "BICLâ ”"] # 0x1d481 - - - "đ’¶": [t: "TsL⠁"] # 0x1d4b6 - - "đ’·": [t: "TsL⠃"] # 0x1d4b7 - - "𝒾": [t: "TsL⠉"] # 0x1d4b8 - - "đ’č": [t: "TsL⠙"] # 0x1d4b9 - - "đ’ș": [t: "TsL⠑"] # 0x1d4ba - - "đ’»": [t: "TsL⠋"] # 0x1d4bb - - "đ’Œ": [t: "TsL⠛"] # 0x1d4bc - - "đ’œ": [t: "TsL⠓"] # 0x1d4bd - - "đ’Ÿ": [t: "TsL⠊"] # 0x1d4be - - "𝒿": [t: "TsL⠚"] # 0x1d4bf - - "𝓀": [t: "TsL⠅"] # 0x1d4c0 - - "𝓁": [t: "TsL⠇"] # 0x1d4c1 - - "𝓂": [t: "TsL⠍"] # 0x1d4c2 - - "𝓃": [t: "TsL⠝"] # 0x1d4c3 - - "𝓄": [t: "TsL⠕"] # 0x1d4c4 - - "𝓅": [t: "TsL⠏"] # 0x1d4c5 - - "𝓆": [t: "TsL⠟"] # 0x1d4c6 - - "𝓇": [t: "TsL⠗"] # 0x1d4c7 - - "𝓈": [t: "TsL⠎"] # 0x1d4c8 - - "𝓉": [t: "TsL⠞"] # 0x1d4c9 - - "𝓊": [t: "TsLâ „"] # 0x1d4ca - - "𝓋": [t: "TsLâ §"] # 0x1d4cb - - "𝓌": [t: "TsLâ ș"] # 0x1d4cc - - "𝓍": [t: "TsLâ ­"] # 0x1d4cd - - "𝓎": [t: "TsLâ œ"] # 0x1d4ce - - "𝓏": [t: "TsLâ ”"] # 0x1d4cf - - - "𝒜": [t: "TsCL⠁"] # 0x1d49c - - "𝒝": [t: "TsCL⠃"] # 0x1d49d - - "𝒞": [t: "TsCL⠉"] # 0x1d49e - - "𝒟": [t: "TsCL⠙"] # 0x1d49f - - "𝒠": [t: "TsCL⠑"] # 0x1d4a0 - - "𝒡": [t: "TsCL⠋"] # 0x1d4a1 - - "𝒱": [t: "TsCL⠛"] # 0x1d4a2 - - "𝒣": [t: "TsCL⠓"] # 0x1d4a3 - - "đ’€": [t: "TsCL⠊"] # 0x1d4a4 - - "đ’„": [t: "TsCL⠚"] # 0x1d4a5 - - "𝒩": [t: "TsCL⠅"] # 0x1d4a6 - - "𝒧": [t: "TsCL⠇"] # 0x1d4a7 - - "𝒹": [t: "TsCL⠍"] # 0x1d4a8 - - "đ’©": [t: "TsCL⠝"] # 0x1d4a9 - - "đ’Ș": [t: "TsCL⠕"] # 0x1d4aa - - "đ’«": [t: "TsCL⠏"] # 0x1d4ab - - "𝒬": [t: "TsCL⠟"] # 0x1d4ac - - "𝒭": [t: "TsCL⠗"] # 0x1d4ad - - "𝒼": [t: "TsCL⠎"] # 0x1d4ae - - "𝒯": [t: "TsCL⠞"] # 0x1d4af - - "𝒰": [t: "TsCLâ „"] # 0x1d4b0 - - "đ’±": [t: "TsCLâ §"] # 0x1d4b1 - - "đ’Č": [t: "TsCLâ ș"] # 0x1d4b2 - - "𝒳": [t: "TsCLâ ­"] # 0x1d4b3 - - "𝒮": [t: "TsCLâ œ"] # 0x1d4b4 - - "đ’”": [t: "TsCLâ ”"] # 0x1d4b5 - + # Hebrew letters (H → ⠘⠘); spell via Latin/assoc letters in unicode.yaml + - "ŚŚ‘Ś’Ś“Ś”Ś•Ś–Ś—Ś˜Ś™Ś›ŚœŚžŚ ŚĄŚąŚ€ŚŠŚ§ŚšŚ©ŚȘ": # 0x05D0–0x05EA (excl. final forms) + - tc: "H" + - spell: "translate('.', 'ŚŚ‘Ś’Ś“Ś”Ś•Ś–Ś—Ś˜Ś™Ś›ŚœŚžŚ ŚĄŚąŚ€ŚŠŚ§ŚšŚ©ŚȘ', 'abgdhwzxtjklmnsĂ«pĂšqrĂźt')" + + + + # Mathematical alphanumeric symbols (Latin) — typeface via tc:; C/L from unicode.yaml + - "𝐀-𝐙": # 0x1d400 - 0x1d419 + - tc: "B" + - spell: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "𝐚-𝐳": # 0x1d41a - 0x1d433 + - tc: "B" + - spell: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" + - "𝐮-𝑍": # 0x1d434 - 0x1d44d + - tc: "" + - spell: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "𝑎-𝑧": # 0x1d44e - 0x1d467 + - tc: "" + - spell: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”đ‘•đ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" + - "𝑹-𝒁": # 0x1d468 - 0x1d481 + - tc: "BI" + - spell: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "𝒂-𝒛": # 0x1d482 - 0x1d49b + - tc: "BI" + - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" + - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 + - tc: "Ts" + - spell: "translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf + - tc: "Ts" + - spell: "translate('.', 'đ’¶đ’·đ’žđ’čđ’șđ’»đ’Œđ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“„đ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdefghijklmnopqrstuvwxyz')" - "ℊ": [t: "TL⠛⠁"] # 0x210a (Script Small G) - "ℋ": [t: "TCL⠓⠁"] # 0x210b (Script Capital H) - "ℒ": [t: "TCL⠇"] # 0x2113 (Script Capital L) @@ -262,766 +95,137 @@ - "ℱ": [t: "TCL⠋"] # 0x2131 (Script Capital F) - "ℳ": [t: "TCL⠍"] # 0x2133 (Script Capital M) - "℮": [t: "TL⠕"] # 0x21334 (Script Small O) - - "đ“Ș": [t: "BTsL⠁"] # 0x1d4ea - - "đ“«": [t: "BTsL⠃"] # 0x1d4eb - - "𝓬": [t: "BTsL⠉"] # 0x1d4ec - - "𝓭": [t: "BTsL⠙"] # 0x1d4ed - - "𝓼": [t: "BTsL⠑"] # 0x1d4ee - - "𝓯": [t: "BTsL⠋"] # 0x1d4ef - - "𝓰": [t: "BTsL⠛"] # 0x1d4f0 - - "đ“±": [t: "BTsL⠓"] # 0x1d4f1 - - "đ“Č": [t: "BTsL⠊"] # 0x1d4f2 - - "𝓳": [t: "BTsL⠚"] # 0x1d4f3 - - "𝓮": [t: "BTsL⠅"] # 0x1d4f4 - - "đ“”": [t: "BTsL⠇"] # 0x1d4f5 - - "đ“¶": [t: "BTsL⠍"] # 0x1d4f6 - - "đ“·": [t: "BTsL⠝"] # 0x1d4f7 - - "𝓾": [t: "BTsL⠕"] # 0x1d4f8 - - "đ“č": [t: "BTsL⠏"] # 0x1d4f9 - - "đ“ș": [t: "BTsL⠟"] # 0x1d4fa - - "đ“»": [t: "BTsL⠗"] # 0x1d4fb - - "đ“Œ": [t: "BTsL⠎"] # 0x1d4fc - - "đ“œ": [t: "BTsL⠞"] # 0x1d4fd - - "đ“Ÿ": [t: "BTsLâ „"] # 0x1d4fe - - "𝓿": [t: "BTsLâ §"] # 0x1d4ff - - "𝔀": [t: "BTsLâ ș"] # 0x1d500 - - "𝔁": [t: "BTsLâ ­"] # 0x1d501 - - "𝔂": [t: "BTsLâ œ"] # 0x1d502 - - "𝔃": [t: "BTsLâ ”"] # 0x1d503 - - - "𝓐": [t: "BTsCL⠁"] # 0x1d4d0 - - "𝓑": [t: "BTsCL⠃"] # 0x1d4d1 - - "𝓒": [t: "BTsCL⠉"] # 0x1d4d2 - - "𝓓": [t: "BTsCL⠙"] # 0x1d4d3 - - "𝓔": [t: "BTsCL⠑"] # 0x1d4d4 - - "𝓕": [t: "BTsCL⠋"] # 0x1d4d5 - - "𝓖": [t: "BTsCL⠛"] # 0x1d4d6 - - "𝓗": [t: "BTsCL⠓"] # 0x1d4d7 - - "𝓘": [t: "BTsCL⠊"] # 0x1d4d8 - - "𝓙": [t: "BTsCL⠚"] # 0x1d4d9 - - "𝓚": [t: "BTsCL⠅"] # 0x1d4da - - "𝓛": [t: "BTsCL⠇"] # 0x1d4db - - "𝓜": [t: "BTsCL⠍"] # 0x1d4dc - - "𝓝": [t: "BTsCL⠝"] # 0x1d4dd - - "𝓞": [t: "BTsCL⠕"] # 0x1d4de - - "𝓟": [t: "BTsCL⠏"] # 0x1d4df - - "𝓠": [t: "BTsCL⠟"] # 0x1d4e0 - - "𝓡": [t: "BTsCL⠗"] # 0x1d4e1 - - "𝓱": [t: "BTsCL⠎"] # 0x1d4e2 - - "𝓣": [t: "BTsCL⠞"] # 0x1d4e3 - - "đ“€": [t: "BTsCLâ „"] # 0x1d4e4 - - "đ“„": [t: "BTsCLâ §"] # 0x1d4e5 - - "𝓩": [t: "BTsCLâ ș"] # 0x1d4e6 - - "𝓧": [t: "BTsCLâ ­"] # 0x1d4e7 - - "𝓹": [t: "BTsCLâ œ"] # 0x1d4e8 - - "đ“©": [t: "BTsCLâ ”"] # 0x1d4e9 - - - "𝔞": [t: "DL⠁"] # 0x1d51e - - "𝔟": [t: "DL⠃"] # 0x1d51f - - "𝔠": [t: "DL⠉"] # 0x1d520 - - "𝔡": [t: "DL⠙"] # 0x1d521 - - "𝔱": [t: "DL⠑"] # 0x1d522 - - "𝔣": [t: "DL⠋"] # 0x1d523 - - "đ”€": [t: "DL⠛"] # 0x1d524 - - "đ”„": [t: "DL⠓"] # 0x1d525 - - "𝔩": [t: "DL⠊"] # 0x1d526 - - "𝔧": [t: "DL⠚"] # 0x1d527 - - "𝔹": [t: "DL⠅"] # 0x1d528 - - "đ”©": [t: "DL⠇"] # 0x1d529 - - "đ”Ș": [t: "DL⠍"] # 0x1d52a - - "đ”«": [t: "DL⠝"] # 0x1d52b - - "𝔬": [t: "DL⠕"] # 0x1d52c - - "𝔭": [t: "DL⠏"] # 0x1d52d - - "𝔼": [t: "DL⠟"] # 0x1d52e - - "𝔯": [t: "DL⠗"] # 0x1d52f - - "𝔰": [t: "DL⠎"] # 0x1d530 - - "đ”±": [t: "DL⠞"] # 0x1d531 - - "đ”Č": [t: "DLâ „"] # 0x1d532 - - "𝔳": [t: "DLâ §"] # 0x1d533 - - "𝔮": [t: "DLâ ș"] # 0x1d534 - - "đ””": [t: "DLâ ­"] # 0x1d535 - - "đ”¶": [t: "DLâ œ"] # 0x1d536 - - "đ”·": [t: "DLâ ”"] # 0x1d537 - - - "𝔄": [t: "DCL⠁"] # 0x1d504 - - "𝔅": [t: "DCL⠃"] # 0x1d505 - - "𝔆": [t: "DCL⠉"] # 0x1d506 - - "𝔇": [t: "DCL⠙"] # 0x1d507 - - "𝔈": [t: "DCL⠑"] # 0x1d508 - - "𝔉": [t: "DCL⠋"] # 0x1d509 - - "𝔊": [t: "DCL⠛"] # 0x1d50a - - "𝔋": [t: "DCL⠓"] # 0x1d50b - - "𝔌": [t: "DCL⠊"] # 0x1d50c - - "𝔍": [t: "DCL⠚"] # 0x1d50d - - "𝔎": [t: "DCL⠅"] # 0x1d50e - - "𝔏": [t: "DCL⠇"] # 0x1d50f - - "𝔐": [t: "DCL⠍"] # 0x1d510 - - "𝔑": [t: "DCL⠝"] # 0x1d511 - - "𝔒": [t: "DCL⠕"] # 0x1d512 - - "𝔓": [t: "DCL⠏"] # 0x1d513 - - "𝔔": [t: "DCL⠟"] # 0x1d514 - - "𝔕": [t: "DCL⠗"] # 0x1d515 - - "𝔖": [t: "DCL⠎"] # 0x1d516 - - "𝔗": [t: "DCL⠞"] # 0x1d517 - - "𝔘": [t: "DCLâ „"] # 0x1d518 - - "𝔙": [t: "DCLâ §"] # 0x1d519 - - "𝔚": [t: "DCLâ ș"] # 0x1d51a - - "𝔛": [t: "DCLâ ­"] # 0x1d51b - - "𝔜": [t: "DCLâ œ"] # 0x1d51c - - "𝔝": [t: "DCLâ ”"] # 0x1d51d + - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 + - tc: "BTs" + - spell: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "đ“Ș-𝔃": # 0x1d4ea - 0x1d503 + - tc: "BTs" + - spell: "translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz')" + - "𝔄-𝔝": # 0x1d504 - 0x1d51d + - tc: "D" + - spell: "translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜𝔝', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "𝔞-đ”·": # 0x1d51e - 0x1d537 + - tc: "D" + - spell: "translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz')" - "ℌ": [t: "DCL⠓"] # 0x210C (Fraktur Capital H) - "ℑ": [t: "DCL⠊"] # 0x2111 (Fraktur Capital I) - "ℜ": [t: "DCL⠗"] # 0x211C (Fraktur Capital R) - "ℹ": [t: "DCLâ ”"] # 0x2128 (Fraktur Capital Z) - "ℭ": [t: "DCL⠉"] # 0x22DC (Fraktur Capital C) - - "𝕒": [t: "đ”čL⠁"] # 0x1d552 - - "𝕓": [t: "đ”čL⠃"] # 0x1d553 - - "𝕔": [t: "đ”čL⠉"] # 0x1d554 - - "𝕕": [t: "đ”čL⠙"] # 0x1d555 - - "𝕖": [t: "đ”čL⠑"] # 0x1d556 - - "𝕗": [t: "đ”čL⠋"] # 0x1d557 - - "𝕘": [t: "đ”čL⠛"] # 0x1d558 - - "𝕙": [t: "đ”čL⠓"] # 0x1d559 - - "𝕚": [t: "đ”čL⠊"] # 0x1d55a - - "𝕛": [t: "đ”čL⠚"] # 0x1d55b - - "𝕜": [t: "đ”čL⠅"] # 0x1d55c - - "𝕝": [t: "đ”čL⠇"] # 0x1d55d - - "𝕞": [t: "đ”čL⠍"] # 0x1d55e - - "𝕟": [t: "đ”čL⠝"] # 0x1d55f - - "𝕠": [t: "đ”čL⠕"] # 0x1d560 - - "𝕡": [t: "đ”čL⠏"] # 0x1d561 - - "𝕱": [t: "đ”čL⠟"] # 0x1d562 - - "𝕣": [t: "đ”čL⠗"] # 0x1d563 - - "đ•€": [t: "đ”čL⠎"] # 0x1d564 - - "đ•„": [t: "đ”čL⠞"] # 0x1d565 - - "𝕩": [t: "đ”čLâ „"] # 0x1d566 - - "𝕧": [t: "đ”čLâ §"] # 0x1d567 - - "𝕹": [t: "đ”čLâ ș"] # 0x1d568 - - "đ•©": [t: "đ”čLâ ­"] # 0x1d569 - - "đ•Ș": [t: "đ”čLâ œ"] # 0x1d56a - - "đ•«": [t: "đ”čLâ ”"] # 0x1d56b - - "𝔾": [t: "đ”čCL⠁"] # 0x1d538 - - "đ”č": [t: "đ”čCL⠃"] # 0x1d539 + - "𝔾-đ”č": # 0x1d538 - 0x1d539 + - tc: "đ”č" + - spell: "translate('.', '𝔾đ”č', 'AB')" + - "đ”»-đ”Ÿ": # 0x1d53b - 0x1d53e + - tc: "đ”č" + - spell: "translate('.', 'đ”»đ”Œđ”œđ”Ÿ', 'DEFG')" + - "𝕀-𝕄": # 0x1d540 - 0x1d544 + - tc: "đ”č" + - spell: "translate('.', '𝕀𝕁𝕂𝕃𝕄', 'IJKLM')" + - "𝕆": [t: "đ”čCL⠕"] # 0x1d546 - "ℂ": [t: "đ”čCL⠉"] # 0x2102 - - "đ”»": [t: "đ”čCL⠙"] # 0x1d53b - - "đ”Œ": [t: "đ”čCL⠑"] # 0x1d53c - - "đ”œ": [t: "đ”čCL⠋"] # 0x1d53d - - "đ”Ÿ": [t: "đ”čCL⠛"] # 0x1d53e - "ℍ": [t: "đ”čCL⠓"] # 0x210d - - "𝕀": [t: "đ”čCL⠊"] # 0x1d540 - - "𝕁": [t: "đ”čCL⠚"] # 0x1d541 - - "𝕂": [t: "đ”čCL⠅"] # 0x1d542 - - "𝕃": [t: "đ”čCL⠇"] # 0x1d543 - - "𝕄": [t: "đ”čCL⠍"] # 0x1d544 - "ℕ": [t: "đ”čCL⠝"] # 0x2115 - - "𝕆": [t: "đ”čCL⠕"] # 0x1d546 - "ℙ": [t: "đ”čCL⠏"] # 0x2119 - "ℚ": [t: "đ”čCL⠟"] # 0x211a - "ℝ": [t: "đ”čCL⠗"] # 0x211d - - "𝕊": [t: "đ”čCL⠎"] # 0x1d54a - - "𝕋": [t: "đ”čCL⠞"] # 0x1d54b - - "𝕌": [t: "đ”čCLâ „"] # 0x1d54c - - "𝕍": [t: "đ”čCLâ §"] # 0x1d54d - - "𝕎": [t: "đ”čCLâ ș"] # 0x1d54e - - "𝕏": [t: "đ”čCLâ ­"] # 0x1d54f - - "𝕐": [t: "đ”čCLâ œ"] # 0x1d550 - "â„€": [t: "đ”čCLâ ”"] # 0x2124 - - "𝖆": [t: "BDL⠁"] # 0x1d586 - - "𝖇": [t: "BDL⠃"] # 0x1d587 - - "𝖈": [t: "BDL⠉"] # 0x1d588 - - "𝖉": [t: "BDL⠙"] # 0x1d589 - - "𝖊": [t: "BDL⠑"] # 0x1d58a - - "𝖋": [t: "BDL⠋"] # 0x1d58b - - "𝖌": [t: "BDL⠛"] # 0x1d58c - - "𝖍": [t: "BDL⠓"] # 0x1d58d - - "𝖎": [t: "BDL⠊"] # 0x1d58e - - "𝖏": [t: "BDL⠚"] # 0x1d58f - - "𝖐": [t: "BDL⠅"] # 0x1d590 - - "𝖑": [t: "BDL⠇"] # 0x1d591 - - "𝖒": [t: "BDL⠍"] # 0x1d592 - - "𝖓": [t: "BDL⠝"] # 0x1d593 - - "𝖔": [t: "BDL⠕"] # 0x1d594 - - "𝖕": [t: "BDL⠏"] # 0x1d595 - - "𝖖": [t: "BDL⠟"] # 0x1d596 - - "𝖗": [t: "BDL⠗"] # 0x1d597 - - "𝖘": [t: "BDL⠎"] # 0x1d598 - - "𝖙": [t: "BDL⠞"] # 0x1d599 - - "𝖚": [t: "BDLâ „"] # 0x1d59a - - "𝖛": [t: "BDLâ §"] # 0x1d59b - - "𝖜": [t: "BDLâ ș"] # 0x1d59c - - "𝖝": [t: "BDLâ ­"] # 0x1d59d - - "𝖞": [t: "BDLâ œ"] # 0x1d59e - - "𝖟": [t: "BDLâ ”"] # 0x1d59f - - - "𝕬": [t: "BDCL⠁"] # 0x1d56c - - "𝕭": [t: "BDCL⠃"] # 0x1d56d - - "𝕼": [t: "BDCL⠉"] # 0x1d56e - - "𝕯": [t: "BDCL⠙"] # 0x1d56f - - "𝕰": [t: "BDCL⠑"] # 0x1d570 - - "đ•±": [t: "BDCL⠋"] # 0x1d571 - - "đ•Č": [t: "BDCL⠛"] # 0x1d572 - - "𝕳": [t: "BDCL⠓"] # 0x1d573 - - "𝕮": [t: "BDCL⠊"] # 0x1d574 - - "đ•”": [t: "BDCL⠚"] # 0x1d575 - - "đ•¶": [t: "BDCL⠅"] # 0x1d576 - - "đ•·": [t: "BDCL⠇"] # 0x1d577 - - "𝕾": [t: "BDCL⠍"] # 0x1d578 - - "đ•č": [t: "BDCL⠝"] # 0x1d579 - - "đ•ș": [t: "BDCL⠕"] # 0x1d57a - - "đ•»": [t: "BDCL⠏"] # 0x1d57b - - "đ•Œ": [t: "BDCL⠟"] # 0x1d57c - - "đ•œ": [t: "BDCL⠗"] # 0x1d57d - - "đ•Ÿ": [t: "BDCL⠎"] # 0x1d57e - - "𝕿": [t: "BDCL⠞"] # 0x1d57f - - "𝖀": [t: "BDCLâ „"] # 0x1d580 - - "𝖁": [t: "BDCLâ §"] # 0x1d581 - - "𝖂": [t: "BDCLâ ș"] # 0x1d582 - - "𝖃": [t: "BDCLâ ­"] # 0x1d583 - - "𝖄": [t: "BDCLâ œ"] # 0x1d584 - - "𝖅": [t: "BDCLâ ”"] # 0x1d585 - - - "đ–ș": [t: "SL⠁"] # 0x1d5ba - - "đ–»": [t: "SL⠃"] # 0x1d5bb - - "đ–Œ": [t: "SL⠉"] # 0x1d5bc - - "đ–œ": [t: "SL⠙"] # 0x1d5bd - - "đ–Ÿ": [t: "SL⠑"] # 0x1d5be - - "𝖿": [t: "SL⠋"] # 0x1d5bf - - "𝗀": [t: "SL⠛"] # 0x1d5c0 - - "𝗁": [t: "SL⠓"] # 0x1d5c1 - - "𝗂": [t: "SL⠊"] # 0x1d5c2 - - "𝗃": [t: "SL⠚"] # 0x1d5c3 - - "𝗄": [t: "SL⠅"] # 0x1d5c4 - - "𝗅": [t: "SL⠇"] # 0x1d5c5 - - "𝗆": [t: "SL⠍"] # 0x1d5c6 - - "𝗇": [t: "SL⠝"] # 0x1d5c7 - - "𝗈": [t: "SL⠕"] # 0x1d5c8 - - "𝗉": [t: "SL⠏"] # 0x1d5c9 - - "𝗊": [t: "SL⠟"] # 0x1d5ca - - "𝗋": [t: "SL⠗"] # 0x1d5cb - - "𝗌": [t: "SL⠎"] # 0x1d5cc - - "𝗍": [t: "SL⠞"] # 0x1d5cd - - "𝗎": [t: "SLâ „"] # 0x1d5ce - - "𝗏": [t: "SLâ §"] # 0x1d5cf - - "𝗐": [t: "SLâ ș"] # 0x1d5d0 - - "𝗑": [t: "SLâ ­"] # 0x1d5d1 - - "𝗒": [t: "SLâ œ"] # 0x1d5d2 - - "𝗓": [t: "SLâ ”"] # 0x1d5d3 - - - "𝖠": [t: "SCL⠁"] # 0x1d5a0 - - "𝖡": [t: "SCL⠃"] # 0x1d5a1 - - "𝖱": [t: "SCL⠉"] # 0x1d5a2 - - "𝖣": [t: "SCL⠙"] # 0x1d5a3 - - "đ–€": [t: "SCL⠑"] # 0x1d5a4 - - "đ–„": [t: "SCL⠋"] # 0x1d5a5 - - "𝖩": [t: "SCL⠛"] # 0x1d5a6 - - "𝖧": [t: "SCL⠓"] # 0x1d5a7 - - "𝖹": [t: "SCL⠊"] # 0x1d5a8 - - "đ–©": [t: "SCL⠚"] # 0x1d5a9 - - "đ–Ș": [t: "SCL⠅"] # 0x1d5aa - - "đ–«": [t: "SCL⠇"] # 0x1d5ab - - "𝖬": [t: "SCL⠍"] # 0x1d5ac - - "𝖭": [t: "SCL⠝"] # 0x1d5ad - - "𝖼": [t: "SCL⠕"] # 0x1d5ae - - "𝖯": [t: "SCL⠏"] # 0x1d5af - - "𝖰": [t: "SCL⠟"] # 0x1d5b0 - - "đ–±": [t: "SCL⠗"] # 0x1d5b1 - - "đ–Č": [t: "SCL⠎"] # 0x1d5b2 - - "𝖳": [t: "SCL⠞"] # 0x1d5b3 - - "𝖮": [t: "SCLâ „"] # 0x1d5b4 - - "đ–”": [t: "SCLâ §"] # 0x1d5b5 - - "đ–¶": [t: "SCLâ ș"] # 0x1d5b6 - - "đ–·": [t: "SCLâ ­"] # 0x1d5b7 - - "𝖾": [t: "SCLâ œ"] # 0x1d5b8 - - "đ–č": [t: "SCLâ ”"] # 0x1d5b9 - - - "𝗼": [t: "BSL⠁"] # 0x1d5ee - - "𝗯": [t: "BSL⠃"] # 0x1d5ef - - "𝗰": [t: "BSL⠉"] # 0x1d5f0 - - "đ—±": [t: "BSL⠙"] # 0x1d5f1 - - "đ—Č": [t: "BSL⠑"] # 0x1d5f2 - - "𝗳": [t: "BSL⠋"] # 0x1d5f3 - - "𝗮": [t: "BSL⠛"] # 0x1d5f4 - - "đ—”": [t: "BSL⠓"] # 0x1d5f5 - - "đ—¶": [t: "BSL⠊"] # 0x1d5f6 - - "đ—·": [t: "BSL⠚"] # 0x1d5f7 - - "𝗾": [t: "BSL⠅"] # 0x1d5f8 - - "đ—č": [t: "BSL⠇"] # 0x1d5f9 - - "đ—ș": [t: "BSL⠍"] # 0x1d5fa - - "đ—»": [t: "BSL⠝"] # 0x1d5fb - - "đ—Œ": [t: "BSL⠕"] # 0x1d5fc - - "đ—œ": [t: "BSL⠏"] # 0x1d5fd - - "đ—Ÿ": [t: "BSL⠟"] # 0x1d5fe - - "𝗿": [t: "BSL⠗"] # 0x1d5ff - - "𝘀": [t: "BSL⠎"] # 0x1d600 - - "𝘁": [t: "BSL⠞"] # 0x1d601 - - "𝘂": [t: "BSLâ „"] # 0x1d602 - - "𝘃": [t: "BSLâ §"] # 0x1d603 - - "𝘄": [t: "BSLâ ș"] # 0x1d604 - - "𝘅": [t: "BSLâ ­"] # 0x1d605 - - "𝘆": [t: "BSLâ œ"] # 0x1d606 - - "𝘇": [t: "BSLâ ”"] # 0x1d607 - - - "𝗔": [t: "BSCL⠁"] # 0x1d5d4 - - "𝗕": [t: "BSCL⠃"] # 0x1d5d5 - - "𝗖": [t: "BSCL⠉"] # 0x1d5d6 - - "𝗗": [t: "BSCL⠙"] # 0x1d5d7 - - "𝗘": [t: "BSCL⠑"] # 0x1d5d8 - - "𝗙": [t: "BSCL⠋"] # 0x1d5d9 - - "𝗚": [t: "BSCL⠛"] # 0x1d5da - - "𝗛": [t: "BSCL⠓"] # 0x1d5db - - "𝗜": [t: "BSCL⠊"] # 0x1d5dc - - "𝗝": [t: "BSCL⠚"] # 0x1d5dd - - "𝗞": [t: "BSCL⠅"] # 0x1d5de - - "𝗟": [t: "BSCL⠇"] # 0x1d5df - - "𝗠": [t: "BSCL⠍"] # 0x1d5e0 - - "𝗡": [t: "BSCL⠝"] # 0x1d5e1 - - "𝗱": [t: "BSCL⠕"] # 0x1d5e2 - - "𝗣": [t: "BSCL⠏"] # 0x1d5e3 - - "đ—€": [t: "BSCL⠟"] # 0x1d5e4 - - "đ—„": [t: "BSCL⠗"] # 0x1d5e5 - - "𝗩": [t: "BSCL⠎"] # 0x1d5e6 - - "𝗧": [t: "BSCL⠞"] # 0x1d5e7 - - "𝗹": [t: "BSCLâ „"] # 0x1d5e8 - - "đ—©": [t: "BSCLâ §"] # 0x1d5e9 - - "đ—Ș": [t: "BSCLâ ș"] # 0x1d5ea - - "đ—«": [t: "BSCLâ ­"] # 0x1d5eb - - "𝗬": [t: "BSCLâ œ"] # 0x1d5ec - - "𝗭": [t: "BSCLâ ”"] # 0x1d5ed - - - "𝘱": [t: "ISL⠁"] # 0x1d622 - - "𝘣": [t: "ISL⠃"] # 0x1d623 - - "đ˜€": [t: "ISL⠉"] # 0x1d624 - - "đ˜„": [t: "ISL⠙"] # 0x1d625 - - "𝘩": [t: "ISL⠑"] # 0x1d626 - - "𝘧": [t: "ISL⠋"] # 0x1d627 - - "𝘹": [t: "ISL⠛"] # 0x1d628 - - "đ˜©": [t: "ISL⠓"] # 0x1d629 - - "đ˜Ș": [t: "ISL⠊"] # 0x1d62a - - "đ˜«": [t: "ISL⠚"] # 0x1d62b - - "𝘬": [t: "ISL⠅"] # 0x1d62c - - "𝘭": [t: "ISL⠇"] # 0x1d62d - - "𝘼": [t: "ISL⠍"] # 0x1d62e - - "𝘯": [t: "ISL⠝"] # 0x1d62f - - "𝘰": [t: "ISL⠕"] # 0x1d630 - - "đ˜±": [t: "ISL⠏"] # 0x1d631 - - "đ˜Č": [t: "ISL⠟"] # 0x1d632 - - "𝘳": [t: "ISL⠗"] # 0x1d633 - - "𝘮": [t: "ISL⠎"] # 0x1d634 - - "đ˜”": [t: "ISL⠞"] # 0x1d635 - - "đ˜¶": [t: "ISLâ „"] # 0x1d636 - - "đ˜·": [t: "ISLâ §"] # 0x1d637 - - "𝘾": [t: "ISLâ ș"] # 0x1d638 - - "đ˜č": [t: "ISLâ ­"] # 0x1d639 - - "đ˜ș": [t: "ISLâ œ"] # 0x1d63a - - "đ˜»": [t: "ISLâ ”"] # 0x1d63b - - - "𝘈": [t: "ISCL⠁"] # 0x1d608 - - "𝘉": [t: "ISCL⠃"] # 0x1d609 - - "𝘊": [t: "ISCL⠉"] # 0x1d60a - - "𝘋": [t: "ISCL⠙"] # 0x1d60b - - "𝘌": [t: "ISCL⠑"] # 0x1d60c - - "𝘍": [t: "ISCL⠋"] # 0x1d60d - - "𝘎": [t: "ISCL⠛"] # 0x1d60e - - "𝘏": [t: "ISCL⠓"] # 0x1d60f - - "𝘐": [t: "ISCL⠊"] # 0x1d610 - - "𝘑": [t: "ISCL⠚"] # 0x1d611 - - "𝘒": [t: "ISCL⠅"] # 0x1d612 - - "𝘓": [t: "ISCL⠇"] # 0x1d613 - - "𝘔": [t: "ISCL⠍"] # 0x1d614 - - "𝘕": [t: "ISCL⠝"] # 0x1d615 - - "𝘖": [t: "ISCL⠕"] # 0x1d616 - - "𝘗": [t: "ISCL⠏"] # 0x1d617 - - "𝘘": [t: "ISCL⠟"] # 0x1d618 - - "𝘙": [t: "ISCL⠗"] # 0x1d619 - - "𝘚": [t: "ISCL⠎"] # 0x1d61a - - "𝘛": [t: "ISCL⠞"] # 0x1d61b - - "𝘜": [t: "ISCLâ „"] # 0x1d61c - - "𝘝": [t: "ISCLâ §"] # 0x1d61d - - "𝘞": [t: "ISCLâ ș"] # 0x1d61e - - "𝘟": [t: "ISCLâ ­"] # 0x1d61f - - "𝘠": [t: "ISCLâ œ"] # 0x1d620 - - "𝘡": [t: "ISCLâ ”"] # 0x1d621 - - - "𝙖": [t: "BILS⠁"] # 0x1d656 - - "𝙗": [t: "BILS⠃"] # 0x1d657 - - "𝙘": [t: "BILS⠉"] # 0x1d658 - - "𝙙": [t: "BILS⠙"] # 0x1d659 - - "𝙚": [t: "BILS⠑"] # 0x1d65a - - "𝙛": [t: "BILS⠋"] # 0x1d65b - - "𝙜": [t: "BILS⠛"] # 0x1d65c - - "𝙝": [t: "BILS⠓"] # 0x1d65d - - "𝙞": [t: "BILS⠊"] # 0x1d65e - - "𝙟": [t: "BILS⠚"] # 0x1d65f - - "𝙠": [t: "BILS⠅"] # 0x1d660 - - "𝙡": [t: "BILS⠇"] # 0x1d661 - - "𝙱": [t: "BILS⠍"] # 0x1d662 - - "𝙣": [t: "BILS⠝"] # 0x1d663 - - "đ™€": [t: "BILS⠕"] # 0x1d664 - - "đ™„": [t: "BILS⠏"] # 0x1d665 - - "𝙩": [t: "BILS⠟"] # 0x1d666 - - "𝙧": [t: "BILS⠗"] # 0x1d667 - - "𝙹": [t: "BILS⠎"] # 0x1d668 - - "đ™©": [t: "BILS⠞"] # 0x1d669 - - "đ™Ș": [t: "BILSâ „"] # 0x1d66a - - "đ™«": [t: "BILSâ §"] # 0x1d66b - - "𝙬": [t: "BILSâ ș"] # 0x1d66c - - "𝙭": [t: "BILSâ ­"] # 0x1d66d - - "𝙼": [t: "BILSâ œ"] # 0x1d66e - - "𝙯": [t: "BILSâ ”"] # 0x1d66f - - - "đ˜Œ": [t: "BILSC⠁"] # 0x1d63c - - "đ˜œ": [t: "BILSC⠃"] # 0x1d63d - - "đ˜Ÿ": [t: "BILSC⠉"] # 0x1d63e - - "𝘿": [t: "BILSC⠙"] # 0x1d63f - - "𝙀": [t: "BILSC⠑"] # 0x1d640 - - "𝙁": [t: "BILSC⠋"] # 0x1d641 - - "𝙂": [t: "BILSC⠛"] # 0x1d642 - - "𝙃": [t: "BILSC⠓"] # 0x1d643 - - "𝙄": [t: "BILSC⠊"] # 0x1d644 - - "𝙅": [t: "BILSC⠚"] # 0x1d645 - - "𝙆": [t: "BILSC⠅"] # 0x1d646 - - "𝙇": [t: "BILSC⠇"] # 0x1d647 - - "𝙈": [t: "BILSC⠍"] # 0x1d648 - - "𝙉": [t: "BILSC⠝"] # 0x1d649 - - "𝙊": [t: "BILSC⠕"] # 0x1d64a - - "𝙋": [t: "BILSC⠏"] # 0x1d64b - - "𝙌": [t: "BILSC⠟"] # 0x1d64c - - "𝙍": [t: "BILSC⠗"] # 0x1d64d - - "𝙎": [t: "BILSC⠎"] # 0x1d64e - - "𝙏": [t: "BILSC⠞"] # 0x1d64f - - "𝙐": [t: "BILSCâ „"] # 0x1d650 - - "𝙑": [t: "BILSCâ §"] # 0x1d651 - - "𝙒": [t: "BILSCâ ș"] # 0x1d652 - - "𝙓": [t: "BILSCâ ­"] # 0x1d653 - - "𝙔": [t: "BILSCâ œ"] # 0x1d654 - - "𝙕": [t: "BILSCâ ”"] # 0x1d655 - - - "𝚊": [t: "L⠁"] # 0x1d68a - - "𝚋": [t: "L⠃"] # 0x1d68b - - "𝚌": [t: "L⠉"] # 0x1d68c - - "𝚍": [t: "L⠙"] # 0x1d68d - - "𝚎": [t: "L⠑"] # 0x1d68e - - "𝚏": [t: "L⠋"] # 0x1d68f - - "𝚐": [t: "L⠛"] # 0x1d690 - - "𝚑": [t: "L⠓"] # 0x1d691 - - "𝚒": [t: "L⠊"] # 0x1d692 - - "𝚓": [t: "L⠚"] # 0x1d693 - - "𝚔": [t: "L⠅"] # 0x1d694 - - "𝚕": [t: "L⠇"] # 0x1d695 - - "𝚖": [t: "L⠍"] # 0x1d696 - - "𝚗": [t: "L⠝"] # 0x1d697 - - "𝚘": [t: "L⠕"] # 0x1d698 - - "𝚙": [t: "L⠏"] # 0x1d699 - - "𝚚": [t: "L⠟"] # 0x1d69a - - "𝚛": [t: "L⠗"] # 0x1d69b - - "𝚜": [t: "L⠎"] # 0x1d69c - - "𝚝": [t: "L⠞"] # 0x1d69d - - "𝚞": [t: "Lâ „"] # 0x1d69e - - "𝚟": [t: "Lâ §"] # 0x1d69f - - "𝚠": [t: "Lâ ș"] # 0x1d6a0 - - "𝚡": [t: "Lâ ­"] # 0x1d6a1 - - "𝚱": [t: "Lâ œ"] # 0x1d6a2 - - "𝚣": [t: "Lâ ”"] # 0x1d6a3 - - - "𝙰": [t: "CL⠁"] # 0x1d670 - - "đ™±": [t: "CL⠃"] # 0x1d671 - - "đ™Č": [t: "CL⠉"] # 0x1d672 - - "𝙳": [t: "CL⠙"] # 0x1d673 - - "𝙮": [t: "CL⠑"] # 0x1d674 - - "đ™”": [t: "CL⠋"] # 0x1d675 - - "đ™¶": [t: "CL⠛"] # 0x1d676 - - "đ™·": [t: "CL⠓"] # 0x1d677 - - "𝙾": [t: "CL⠊"] # 0x1d678 - - "đ™č": [t: "CL⠚"] # 0x1d679 - - "đ™ș": [t: "CL⠅"] # 0x1d67a - - "đ™»": [t: "CL⠇"] # 0x1d67b - - "đ™Œ": [t: "CL⠍"] # 0x1d67c - - "đ™œ": [t: "CL⠝"] # 0x1d67d - - "đ™Ÿ": [t: "CL⠕"] # 0x1d67e - - "𝙿": [t: "CL⠏"] # 0x1d67f - - "𝚀": [t: "CL⠟"] # 0x1d680 - - "𝚁": [t: "CL⠗"] # 0x1d681 - - "𝚂": [t: "CL⠎"] # 0x1d682 - - "𝚃": [t: "CL⠞"] # 0x1d683 - - "𝚄": [t: "CLâ „"] # 0x1d684 - - "𝚅": [t: "CLâ §"] # 0x1d685 - - "𝚆": [t: "CLâ ș"] # 0x1d686 - - "𝚇": [t: "CLâ ­"] # 0x1d687 - - "𝚈": [t: "CLâ œ"] # 0x1d688 - - "𝚉": [t: "CLâ ”"] # 0x1d689 - - - "đš€": [t: "L⠊"] # 0x1d6a4 (dotless i) - - "đš„": [t: "L⠚"] # 0x1d6a5 (dotless j) - - "𝛂": [t: "BGL⠁"] # 0x1d6c2 - - "𝛃": [t: "BGL⠃"] # 0x1d6c3 - - "𝛄": [t: "BGL⠛"] # 0x1d6c4 - - "𝛅": [t: "BGL⠙"] # 0x1d6c5 - - "𝛆": [t: "BGL⠑"] # 0x1d6c6 - - "𝛇": [t: "BGLâ ”"] # 0x1d6c7 - - "𝛈": [t: "BGLâ ± "] # 0x1d6c8 - - "𝛉": [t: "BGLâ č"] # 0x1d6c9 - - "𝛊": [t: "BGL⠊"] # 0x1d6ca - - "𝛋": [t: "BGL⠅"] # 0x1d6cb - - "𝛌": [t: "BGL⠇"] # 0x1d6cc - - "𝛍": [t: "BGL⠍"] # 0x1d6cd - - "𝛎": [t: "BGL⠝"] # 0x1d6ce - - "𝛏": [t: "BGLâ ­"] # 0x1d6cf - - "𝛐": [t: "BGL⠕"] # 0x1d6d0 - - "𝛑": [t: "BGL⠏"] # 0x1d6d1 - - "𝛒": [t: "BGL⠗"] # 0x1d6d2 - - "𝛓": [t: "BGL⠎"] # 0x1d6d3 - - "𝛔": [t: "BGL⠞"] # 0x1d6d4 - - "𝛕": [t: "BGLâ „"] # 0x1d6d5 - - "𝛖": [t: "BGL⠋"] # 0x1d6d6 - - "𝛗": [t: "BGLâ Ż"] # 0x1d6d7 - - "𝛘": [t: "BGLâ œ"] # 0x1d6d8 - - "𝛙": [t: "BGLâ ș"] # 0x1d6d9 - - - "𝚹": [t: "BCGL⠁"] # 0x1d6a8 - - "đš©": [t: "BCGL⠃"] # 0x1d6a9 - - "đšȘ": [t: "BCGL⠛"] # 0x1d6aa - - "đš«": [t: "BCGL⠙"] # 0x1d6ab - - "𝚬": [t: "BCGL⠑"] # 0x1d6ac - - "𝚭": [t: "BCGLâ ”"] # 0x1d6ad - - "𝚼": [t: "BCGLâ ± "] # 0x1d6ae - - "𝚯": [t: "BCGLâ č"] # 0x1d6af - - "𝚰": [t: "BCGL⠊"] # 0x1d6b0 - - "đš±": [t: "BCGL⠅"] # 0x1d6b1 - - "đšČ": [t: "BCGL⠇"] # 0x1d6b2 - - "𝚳": [t: "BCGL⠍"] # 0x1d6b3 - - "𝚮": [t: "BCGL⠝"] # 0x1d6b4 - - "đš”": [t: "BCGLâ ­"] # 0x1d6b5 - - "đš¶": [t: "BCGL⠕"] # 0x1d6b6 - - "đš·": [t: "BCGL⠏"] # 0x1d6b7 - - "𝚾": [t: "BCGL⠗"] # 0x1d6b8 - - "đšč": [t: "BCGL⠎"] # 0x1d6b9 - - "đšș": [t: "BCGL⠞"] # 0x1d6ba - - "đš»": [t: "BCGLâ „"] # 0x1d6bb - - "đšŒ": [t: "BCGL⠋"] # 0x1d6bc - - "đšœ": [t: "BCGLâ Ż"] # 0x1d6bd - - "đšŸ": [t: "BCGLâ œ"] # 0x1d6be - - "𝚿": [t: "BCGLâ ș"] # 0x1d6bf - - - "đ›Œ": [t: "IGL⠁"] # 0x1d6fc - - "đ›œ": [t: "IGL⠃"] # 0x1d6fd - - "đ›Ÿ": [t: "IGL⠛"] # 0x1d6fe - - "𝛿": [t: "IGL⠙"] # 0x1d6ff - - "𝜀": [t: "IGL⠑"] # 0x1d700 - - "𝜁": [t: "IGLâ ”"] # 0x1d701 - - "𝜂": [t: "IGLâ ± "] # 0x1d702 - - "𝜃": [t: "IGLâ č"] # 0x1d703 - - "𝜄": [t: "IGL⠊"] # 0x1d704 - - "𝜅": [t: "IGL⠅"] # 0x1d705 - - "𝜆": [t: "IGL⠇"] # 0x1d706 - - "𝜇": [t: "IGL⠍"] # 0x1d707 - - "𝜈": [t: "IGL⠝"] # 0x1d708 - - "𝜉": [t: "IGLâ ­"] # 0x1d709 - - "𝜊": [t: "IGL⠕"] # 0x1d70a - - "𝜋": [t: "IGL⠏"] # 0x1d70b - - "𝜌": [t: "IGL⠗"] # 0x1d70c - - "𝜍": [t: "IGL⠎"] # 0x1d70d - - "𝜎": [t: "IGL⠞"] # 0x1d70e - - "𝜏": [t: "IGLâ „"] # 0x1d70f - - "𝜐": [t: "IGL⠋"] # 0x1d710 - - "𝜑": [t: "IGLâ Ż"] # 0x1d711 - - "𝜒": [t: "IGLâ œ"] # 0x1d712 - - "𝜓": [t: "IGLâ ș"] # 0x1d713 - - - "𝛱": [t: "ICGL⠁"] # 0x1d6e2 - - "𝛣": [t: "ICGL⠃"] # 0x1d6e3 - - "đ›€": [t: "ICGL⠛"] # 0x1d6e4 - - "đ›„": [t: "ICGL⠙"] # 0x1d6e5 - - "𝛩": [t: "ICGL⠑"] # 0x1d6e6 - - "𝛧": [t: "ICGLâ ”"] # 0x1d6e7 - - "𝛹": [t: "ICGLâ ± "] # 0x1d6e8 - - "đ›©": [t: "ICGLâ č"] # 0x1d6e9 - - "đ›Ș": [t: "ICGL⠊"] # 0x1d6ea - - "đ›«": [t: "ICGL⠅"] # 0x1d6eb - - "𝛬": [t: "ICGL⠇"] # 0x1d6ec - - "𝛭": [t: "ICGL⠍"] # 0x1d6ed - - "𝛼": [t: "ICGL⠝"] # 0x1d6ee - - "𝛯": [t: "ICGLâ ­"] # 0x1d6ef - - "𝛰": [t: "ICGL⠕"] # 0x1d6f0 - - "đ›±": [t: "ICGL⠏"] # 0x1d6f1 - - "đ›Č": [t: "ICGL⠗"] # 0x1d6f2 - - "𝛳": [t: "ICGL⠎"] # 0x1d6f3 - - "𝛮": [t: "ICGL⠞"] # 0x1d6f4 - - "đ›”": [t: "ICGLâ „"] # 0x1d6f5 - - "đ›¶": [t: "ICGL⠋"] # 0x1d6f6 - - "đ›·": [t: "ICGLâ Ż"] # 0x1d6f7 - - "𝛾": [t: "ICGLâ œ"] # 0x1d6f8 - - "đ›č": [t: "ICGLâ ș"] # 0x1d6f9 - - - "đœ¶": [t: "BIGL⠁"] # 0x1d736 - - "đœ·": [t: "BIGL⠃"] # 0x1d737 - - "𝜾": [t: "BIGL⠛"] # 0x1d738 - - "đœč": [t: "BIGL⠙"] # 0x1d739 - - "đœș": [t: "BIGL⠑"] # 0x1d73a - - "đœ»": [t: "BIGLâ ”"] # 0x1d73b - - "đœŒ": [t: "BIGLâ ± "] # 0x1d73c - - "đœœ": [t: "BIGLâ č"] # 0x1d73d - - "đœŸ": [t: "BIGL⠊"] # 0x1d73e - - "𝜿": [t: "BIGL⠅"] # 0x1d73f - - "𝝀": [t: "BIGL⠇"] # 0x1d740 - - "𝝁": [t: "BIGL⠍"] # 0x1d741 - - "𝝂": [t: "BIGL⠝"] # 0x1d742 - - "𝝃": [t: "BIGLâ ­"] # 0x1d743 - - "𝝄": [t: "BIGL⠕"] # 0x1d744 - - "𝝅": [t: "BIGL⠏"] # 0x1d745 - - "𝝆": [t: "BIGL⠗"] # 0x1d746 - - "𝝇": [t: "BIGL⠎"] # 0x1d747 - - "𝝈": [t: "BIGL⠞"] # 0x1d748 - - "𝝉": [t: "BIGLâ „"] # 0x1d749 - - "𝝊": [t: "BIGL⠋"] # 0x1d74a - - "𝝋": [t: "BIGLâ Ż"] # 0x1d74b - - "𝝌": [t: "BIGLâ œ"] # 0x1d74c - - "𝝍": [t: "BIGLâ ș"] # 0x1d74d - - - "𝜜": [t: "BICGL⠁"] # 0x1d71c - - "𝜝": [t: "BICGL⠃"] # 0x1d71d - - "𝜞": [t: "BICGL⠛"] # 0x1d71e - - "𝜟": [t: "BICGL⠙"] # 0x1d71f - - "𝜠": [t: "BICGL⠑"] # 0x1d720 - - "𝜡": [t: "BICGLâ ”"] # 0x1d721 - - "𝜱": [t: "BICGLâ ± "] # 0x1d722 - - "𝜣": [t: "BICGLâ č"] # 0x1d723 - - "đœ€": [t: "BICGL⠊"] # 0x1d724 - - "đœ„": [t: "BICGL⠅"] # 0x1d725 - - "𝜩": [t: "BICGL⠇"] # 0x1d726 - - "𝜧": [t: "BICGL⠍"] # 0x1d727 - - "𝜹": [t: "BICGL⠝"] # 0x1d728 - - "đœ©": [t: "BICGLâ ­"] # 0x1d729 - - "đœȘ": [t: "BICGL⠕"] # 0x1d72a - - "đœ«": [t: "BICGL⠏"] # 0x1d72b - - "𝜬": [t: "BICGL⠗"] # 0x1d72c - - "𝜭": [t: "BICGL⠎"] # 0x1d72d - - "𝜼": [t: "BICGL⠞"] # 0x1d72e - - "𝜯": [t: "BICGLâ „"] # 0x1d72f - - "𝜰": [t: "BICGL⠋"] # 0x1d730 - - "đœ±": [t: "BICGLâ Ż"] # 0x1d731 - - "đœČ": [t: "BICGLâ œ"] # 0x1d732 - - "𝜳": [t: "BICGLâ ș"] # 0x1d733 - - - "𝝰": [t: "BSGL⠁"] # 0x1d770 - - "đ±": [t: "BSGL⠃"] # 0x1d771 - - "đČ": [t: "BSGL⠛"] # 0x1d772 - - "𝝳": [t: "BSGL⠙"] # 0x1d773 - - "𝝮": [t: "BSGL⠑"] # 0x1d774 - - "đ”": [t: "BSGLâ ”"] # 0x1d775 - - "đ¶": [t: "BSGLâ ± "] # 0x1d776 - - "đ·": [t: "BSGLâ č"] # 0x1d777 - - "𝝾": [t: "BSGL⠊"] # 0x1d778 - - "đč": [t: "BSGL⠅"] # 0x1d779 - - "đș": [t: "BSGL⠇"] # 0x1d77a - - "đ»": [t: "BSGL⠍"] # 0x1d77b - - "đŒ": [t: "BSGL⠝"] # 0x1d77c - - "đœ": [t: "BSGLâ ­"] # 0x1d77d - - "đŸ": [t: "BSGL⠕"] # 0x1d77e - - "𝝿": [t: "BSGL⠏"] # 0x1d77f - - "𝞀": [t: "BSGL⠗"] # 0x1d780 - - "𝞁": [t: "BSGL⠎"] # 0x1d781 - - "𝞂": [t: "BSGL⠞"] # 0x1d782 - - "𝞃": [t: "BSGLâ „"] # 0x1d783 - - "𝞄": [t: "BSGL⠋"] # 0x1d784 - - "𝞅": [t: "BSGLâ Ż"] # 0x1d785 - - "𝞆": [t: "BSGLâ œ"] # 0x1d786 - - "𝞇": [t: "BSGLâ ș"] # 0x1d787 - - - "𝝖": [t: "BSCGL⠁"] # 0x1d756 - - "𝝗": [t: "BSCGL⠃"] # 0x1d757 - - "𝝘": [t: "BSCGL⠛"] # 0x1d758 - - "𝝙": [t: "BSCGL⠙"] # 0x1d759 - - "𝝚": [t: "BSCGL⠑"] # 0x1d75a - - "𝝛": [t: "BSCGLâ ”"] # 0x1d75b - - "𝝜": [t: "BSCGLâ ± "] # 0x1d75c - - "𝝝": [t: "BSCGLâ č"] # 0x1d75d - - "𝝞": [t: "BSCGL⠊"] # 0x1d75e - - "𝝟": [t: "BSCGL⠅"] # 0x1d75f - - "𝝠": [t: "BSCGL⠇"] # 0x1d760 - - "𝝡": [t: "BSCGL⠍"] # 0x1d761 - - "𝝱": [t: "BSCGL⠝"] # 0x1d762 - - "𝝣": [t: "BSCGLâ ­"] # 0x1d763 - - "đ€": [t: "BSCGL⠕"] # 0x1d764 - - "đ„": [t: "BSCGL⠏"] # 0x1d765 - - "𝝩": [t: "BSCGL⠗"] # 0x1d766 - - "𝝧": [t: "BSCGL⠎"] # 0x1d767 - - "𝝹": [t: "BSCGL⠞"] # 0x1d768 - - "đ©": [t: "BSCGLâ „"] # 0x1d769 - - "đȘ": [t: "BSCGL⠋"] # 0x1d76a - - "đ«": [t: "BSCGLâ Ż"] # 0x1d76b - - "𝝬": [t: "BSCGLâ œ"] # 0x1d76c - - "𝝭": [t: "BSCGLâ ș"] # 0x1d76d - - - "đžȘ": [t: "BISGL⠁"] # 0x1d7aa - - "đž«": [t: "BISGL⠃"] # 0x1d7ab - - "𝞬": [t: "BISGL⠛"] # 0x1d7ac - - "𝞭": [t: "BISGL⠙"] # 0x1d7ad - - "𝞼": [t: "BISGL⠑"] # 0x1d7ae - - "𝞯": [t: "BISGLâ ”"] # 0x1d7af - - "𝞰": [t: "BISGLâ ± "] # 0x1d7b0 - - "đž±": [t: "BISGLâ č"] # 0x1d7b1 - - "đžČ": [t: "BISGL⠊"] # 0x1d7b2 - - "𝞳": [t: "BISGL⠅"] # 0x1d7b3 - - "𝞮": [t: "BISGL⠇"] # 0x1d7b4 - - "đž”": [t: "BISGL⠍"] # 0x1d7b5 - - "đž¶": [t: "BISGL⠝"] # 0x1d7b6 - - "đž·": [t: "BISGLâ ­"] # 0x1d7b7 - - "𝞾": [t: "BISGL⠕"] # 0x1d7b8 - - "đžč": [t: "BISGL⠏"] # 0x1d7b9 - - "đžș": [t: "BISGL⠗"] # 0x1d7ba - - "đž»": [t: "BISGL⠎"] # 0x1d7bb - - "đžŒ": [t: "BISGL⠞"] # 0x1d7bc - - "đžœ": [t: "BISGLâ „"] # 0x1d7bd - - "đžŸ": [t: "BISGL⠋"] # 0x1d7be - - "𝞿": [t: "BISGLâ Ż"] # 0x1d7bf - - "𝟀": [t: "BISGLâ œ"] # 0x1d7c0 - - "𝟁": [t: "BISGLâ ș"] # 0x1d7c1 - - - "𝞐": [t: "BISCGL⠁"] # 0x1d790 - - "𝞑": [t: "BISCGL⠃"] # 0x1d791 - - "𝞒": [t: "BISCGL⠛"] # 0x1d792 - - "𝞓": [t: "BISCGL⠙"] # 0x1d793 - - "𝞔": [t: "BISCGL⠑"] # 0x1d794 - - "𝞕": [t: "BISCGLâ ”"] # 0x1d795 - - "𝞖": [t: "BISCGLâ ± "] # 0x1d796 - - "𝞗": [t: "BISCGLâ č"] # 0x1d797 - - "𝞘": [t: "BISCGL⠊"] # 0x1d798 - - "𝞙": [t: "BISCGL⠅"] # 0x1d799 - - "𝞚": [t: "BISCGL⠇"] # 0x1d79a - - "𝞛": [t: "BISCGL⠍"] # 0x1d79b - - "𝞜": [t: "BISCGL⠝"] # 0x1d79c - - "𝞝": [t: "BISCGLâ ­"] # 0x1d79d - - "𝞞": [t: "BISCGL⠕"] # 0x1d79e - - "𝞟": [t: "BISCGL⠏"] # 0x1d79f - - "𝞠": [t: "BISCGL⠗"] # 0x1d7a0 - - "𝞡": [t: "BISCGL⠎"] # 0x1d7a1 - - "𝞱": [t: "BISCGL⠞"] # 0x1d7a2 - - "𝞣": [t: "BISCGLâ „"] # 0x1d7a3 - - "đž€": [t: "BISCGL⠋"] # 0x1d7a4 - - "đž„": [t: "BISCGLâ Ż"] # 0x1d7a5 - - "𝞩": [t: "BISCGLâ œ"] # 0x1d7a6 - - "𝞧": [t: "BISCGLâ ș"] # 0x1d7a7 - + - "𝕊-𝕐": # 0x1d54a - 0x1d550 + - tc: "đ”č" + - spell: "translate('.', '𝕊𝕋𝕌𝕍𝕎𝕏𝕐', 'STUVWXY')" + - "𝕒-đ•«": # 0x1d552 - 0x1d56b + - tc: "đ”č" + - spell: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" + - "𝕬-𝖅": # 0x1d56c - 0x1d585 + - tc: "BD" + - spell: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "𝖆-𝖟": # 0x1d586 - 0x1d59f + - tc: "BD" + - spell: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" + - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 + - tc: "S" + - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 + - tc: "S" + - spell: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" + - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed + - tc: "BS" + - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "𝗼-𝘇": # 0x1d5ee - 0x1d607 + - tc: "BS" + - spell: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" + - "𝘈-𝘡": # 0x1d608 - 0x1d621 + - tc: "IS" + - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "𝘱-đ˜»": # 0x1d622 - 0x1d63b + - tc: "IS" + - spell: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" + - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 + - tc: "BIS" + - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "𝙖-𝙯": # 0x1d656 - 0x1d66f + - tc: "BIS" + - spell: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" + - "𝙰-𝚉": # 0x1d670 - 0x1d689 + - tc: "" + - spell: "translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "𝚊-đš„": # 0x1d68a - 0x1d6a5 + - tc: "" + - spell: "translate('.', 'đšŠđš‹đšŒđšđšŽđšđšđš‘đš’đš“đš”đš•đš–đš—đš˜đš™đššđš›đšœđšđšžđšŸđš đšĄđšąđšŁđš€đš„', 'abcdefghijklmnopqrstuvwxyzij')" + + # Mathematical Greek alphabets (typeface via tc:; G/C from base Greek in unicode.yaml) + - "𝛂-𝛙": # 0x1d6c2 - 0x1d6d9 + - tc: "B" + - spell: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡Ïˆ')" + - "𝚹-𝚿": # 0x1d6a8 - 0x1d6bf + - tc: "B" + - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšż', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§Îš')" + - "đ›Œ-𝜓": # 0x1d6fc - 0x1d713 + - tc: "I" + - spell: "translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡Ïˆ')" + - "𝛱-đ›č": # 0x1d6e2 - 0x1d6f9 + - tc: "I" + - spell: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›č', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§Îš')" + - "đœ¶-𝝍": # 0x1d736 - 0x1d74d + - tc: "BI" + - spell: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡Ïˆ')" + - "𝜜-𝜳": # 0x1d71c - 0x1d733 + - tc: "BI" + - spell: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§Îš')" + - "𝝰-𝞇": # 0x1d770 - 0x1d787 + - tc: "BS" + - spell: "translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€đžđž‚đžƒđž„đž…đž†đž‡', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡Ïˆ')" + - "𝝖-𝝭": # 0x1d756 - 0x1d76d + - tc: "BS" + - spell: "translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§Îš')" + - "đžȘ-𝟁": # 0x1d7aa - 0x1d7c1 + - tc: "BIS" + - spell: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡Ïˆ')" + - "𝞐-𝞧": # 0x1d790 - 0x1d7a7 + - tc: "BIS" + - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§Îš')" + + + # Mathematical digits - "𝟎-𝟗": # 0x1d7ce - 0x1d7d7 - - t: "B" - - spell: "translate('.', '𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗', '0123456789')" - - - "-": # 0xf52e - 0xf537 (old MathType) - - t: "B" - - spell: "translate('.', '', '0123456789')" - - - "𝟬-đŸ”": # 0x1D7EC - 0x1D7F5 - - t: "B" - - spell: "translate('.', 'đŸŹđŸ­đŸźđŸŻđŸ°đŸ±đŸČđŸłđŸŽđŸ”', '0123456789')" - - - "-": # 0xf556 - 0xf55f (old MathType) - - t: "B" - - spell: "translate('.', '', '0123456789')" - - - "𝟱-đŸ«": # 0x1d7e2 - 0x1d7eb - - spell: "translate('.', 'đŸ¶đŸ·đŸžđŸčđŸșđŸ»đŸŒđŸœđŸŸđŸż', '0123456789')" - - - "đŸ¶-𝟿": # 0x1d7f6 - 0x1d7ff - - spell: "translate('.', 'đŸ¶đŸ·đŸžđŸčđŸșđŸ»đŸŒđŸœđŸŸđŸż', '0123456789')" + - tc: "B" + - spell: "translate('.', '𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗', '0123456789')" + - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 + - tc: "đ”č" + - spell: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" + - "𝟱-đŸ«": # 0x1d7e2 - 0x1d7eb + - tc: "S" + - spell: "translate('.', 'đŸąđŸŁđŸ€đŸ„đŸŠđŸ§đŸšđŸ©đŸȘđŸ«', '0123456789')" + - "𝟬-đŸ”": # 0x1d7ec - 0x1d7f5 + - tc: "BS" + - spell: "translate('.', 'đŸŹđŸ­đŸźđŸŻđŸ°đŸ±đŸČđŸłđŸŽđŸ”', '0123456789')" + - "đŸ¶-𝟿": # 0x1d7f6 - 0x1d7ff + - tc: "" + - spell: "translate('.', 'đŸ¶đŸ·đŸžđŸčđŸșđŸ»đŸŒđŸœđŸŸđŸż', '0123456789')" + - "-": # 0xf54c - 0xf555 (old MathType bold) + - tc: "B" + - spell: "translate('.', '', '0123456789')" + - "-": # 0xf556 - 0xf55f (old MathType bold) + - tc: "B" + - spell: "translate('.', '', '0123456789')" diff --git a/Rules/Braille/French/unicode.yaml b/Rules/Braille/French/unicode.yaml index f7e23239b..ce310bb3c 100644 --- a/Rules/Braille/French/unicode.yaml +++ b/Rules/Braille/French/unicode.yaml @@ -231,7 +231,7 @@ - "8": [t: "Nâ ł"] # 0x0038 (digit eight) - "9": [t: "Nâ Ș"] # 0x0039 (digit nine) - ":": [t: "⠒"] # 0x003A (colon) - - ";": [t: "⠆"] # 0x003B (semicolon) + - ";": [t: ";"] # 0x003B (semicolon) - "<": [t: "⠐⠣"] # 0x003C (less than sign) - "=": [t: "â ¶"] # 0x003D (regular equals sign) - ">": [t: "⠐⠜"] # 0x003E (greater than sign ( regular )) @@ -262,15 +262,14 @@ - "Âą": [t: "⠉"] # 0x00A2 (cent) - "ÂŻ": [t: "⠾⠒"] # 0x00AF (bar) - "°": [t: "⠐⠕"] # 0x00B0 (degree sign) + - "℃": [t: "⠐⠕⠹⠉"] # 0x2103 (degree Celsius) + - "℉": [t: "⠐⠕⠹⠋"] # 0x2109 (degree Fahrenheit) - "±": [t: "â –â €"] # 0x00B1 (plus or minus) - "ÂŒ": [t: "⠡⠌â č"] # 0x00BC (vulgar fraction one quarter) - "œ": [t: "⠡⠌⠣"] # 0x00BD (vulgar fraction one half) - "Ÿ": [t: "⠩⠌â č"] # 0x00BE (vulgar fraction three quarters) - "×": [t: "⠔"] # 0x00D7 ( multiplication sign) - "Ă·": [t: "⠒"] # 0x00F7 (division sign ( divided by )) - - "Ś‘": [t: "⠘⠘⠃"] # 0x05D1 ( beth) - - "Ś’": [t: "⠘⠘⠛"] # 0x05D2 (gimel) - - "Ś“": [t: "⠘⠘⠙"] # 0x05D3 (daleth) - "◌̌": [t: "⠾⠘⠒"] # 0x030C (combing caron) - "‖": [t: "⠘⠿"] # 0x2016 (double vertical bar) - "‰": [t: "⠐⠏⠏"] # 0x2030 (per mille sign) @@ -279,9 +278,13 @@ - "‮": [t: "⠄⠄⠄"] # 0x2034 (triple prime) - "€": [t: "⠘⠑"] # 0x20AC (euro) - "Å": [t: "⠹⠁⠈⠕"] # 0x212B (angstrom) - - "â„”": [t: "⠘⠘⠁"] # 0x2135 (alef) + - "â„”": [t: "HL⠁"] # 0x2135 (alef) - "←": [t: "â žâ Ș"] # 0x2190 (left pointing arrow) - - "↑": [t: "⠘⠻"] # 0x2191 (arrow pointing up) + - "↑": # 0x2191 (arrow pointing up) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "⠘⠱"] + else: [t: "⠘⠻"] - "→": # 0x2192 (right pointing arrow) - test: if: "parent::m:mover and not(following-sibling::*)" @@ -292,8 +295,11 @@ if: "parent::m:mover and not(following-sibling::*)" then: [t: "⠹⠒"] else: [t: "â žâ ±"] - - - "↓": [t: "â šâ »"] # 0x2193 (arrow pointing down) + - "↓": # 0x2193 (arrow pointing down) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "â šâ ±"] + else: [t: "â šâ »"] - "↔": [t: "⠐⠻"] # 0x2194 (horizontal two-way arrow) - "↖": [t: "⠘â Ș"] # 0x2196 (north west arrow) - "↗": [t: "⠘⠱"] # 0x2197 (north east arrow) @@ -340,7 +346,12 @@ - "≈": [t: "⠐⠶"] # 0x2248 (double tilde) - "≙": [t: "⠒⠶"] # 0x2259 (caret over equals sign) - "≠": [t: "â šâ ¶"] # 0x2260 (not equal to) - - "≡": [t: "â ¶â ¶"] # 0x2261 (identify (is congruent to, is identical with)) + - "≡": # 0x2261 (identify (is congruent to, is identical with)) + - test: + if: "@data-chemical-bond" + then: [t: "â ż"] + else: [t: "â ¶â ¶"] + - "≱": [t: "â šâ ¶â ¶"] # 0x2262 (is not identical to) - "≀": [t: "⠘⠣"] # 0x2264 (bar under less than sign (is less than or equal to)) - "≄": [t: "⠘⠜"] # 0x2265 (bar under greater than sign (is greater than or equal to)) @@ -360,6 +371,17 @@ - "⊗": [t: "⠹⠔"] # 0x2297 (circle with interior cross (tensor product)) - "⊄": [t: "⠘⠳"] # 0x22A5 (is perpendicular to) - "⋅": [t: "⠔⠔"] # 0x22C5 (dot,and times) + - "⟔": [t: "â žâ Ș"] # 0x27F5 (Long leftwards arrow ) + - "⟶": # 0x27F6 (Long rightwards arrow) + - test: + if: "parent::m:mover and not(following-sibling::*)" + then: [t: "⠹⠒"] + else: [t: "â žâ ±"] + - "⟷": [t: "â žâ »"] # 0x27F7 (Long left right arrow) + - "⟾": [t: "⠐⠒"] # 0x27F8 (Long leftwards arrow ) + - "âŸč": [t: "⠒⠂"] # 0x27F9 (Long rightwards arrow) + - "âŸș": [t: "⠐⠒⠂"] # 0x27FA (Long left right arrow) + - "⌄": [t: "⠾⠘⠒"] # 0x2304 (inverted caret) - "⌣": [t: "⠈⠈⠈"] # 0x2323 (smile) - "⏜": [t: "⠈⠒"] # 0x23DC (arc concave upward) diff --git a/tests/braille.rs b/tests/braille.rs index 43afe893a..1a0c68b40 100644 --- a/tests/braille.rs +++ b/tests/braille.rs @@ -41,6 +41,7 @@ mod braille { mod French { mod french; mod chemistry; + mod other; } } diff --git a/tests/braille/French/chemistry.rs b/tests/braille/French/chemistry.rs index 4eedcda3a..97528e114 100644 --- a/tests/braille/French/chemistry.rs +++ b/tests/braille/French/chemistry.rs @@ -1,9 +1,69 @@ -// French braille tests for the basic mathml tags -// These tests are from the French braille authority's publication "NOTATION PIATHÉMATIQUE BRAILLE" (PremiĂšre Ă©dition janvier 2007) -// https://www.avh.asso.fr/sites/default/files/notation_mathematique_braille2_0.pdf +// French braille tests for chemistry +// From "Notation braille dans le domaine de la chimie" (PremiĂšre Ă©dition juin 2008) +// BrailleDocs/notation_braille_chimie2008.pdf use crate::common::*; use anyhow::Result; +// --- I. Atomic and molecular writing --- + +#[test] +fn atom_I_1_1() -> Result<()> { + let expr = r#"H"#; + test_braille("French", expr, "⠹⠓")?; + return Ok(()); +} + +#[test] +fn atom_I_1_2() -> Result<()> { + let expr = r#"Al"#; + test_braille("French", expr, "⠹⠁⠇")?; + return Ok(()); +} + +#[test] +fn isotope_I_2_1() -> Result<()> { + // Âč⁶₈O + let expr = r#" + O + + 8 + 16 + "#; + test_braille("French", expr, "â šâ •â  â ąâ łâ  â ˆâ Ąâ «")?; + return Ok(()); +} + +#[test] +#[ignore = "average-mass left subscript not handled by French atomic-number rule"] +fn isotope_I_2_2() -> Result<()> { + // ÂČ⁔₂₅⁔⁎.âčMn (Z=25, average mass 54.9, A=25) + let expr = r#" + Mn + + 25 + 25 + 54.9 + + "#; + test_braille("French", expr, "â šâ â â  â ąâ Łâ ±â  â ąâ ąâ ±â č⠂â Ș⠠⠈⠱⠱")?; + return Ok(()); +} + +#[test] +fn molecule_I_3_1() -> Result<()> { + let expr = r#"H2O"#; + test_braille("French", expr, "⠹⠓⠣⠹⠕")?; + return Ok(()); +} + +#[test] +fn molecule_I_3_2() -> Result<()> { + // Cu(NO₃)₂ + let expr = r#"Cu(NO3)2"#; + test_braille("French", expr, "â šâ ‰â „â Šâ šâ â šâ •â ©â Žâ Ł")?; + return Ok(()); +} + #[test] fn bond_I_4_1() -> Result<()> { let expr= r#"H-H"#; @@ -18,15 +78,177 @@ fn bond_I_4_2() -> Result<()> { return Ok(()); } +#[test] +fn bond_I_4_3() -> Result<()> { + let expr = r#"N≡N"#; + test_braille("French", expr, "⠹⠝⠿⠹⠝")?; + return Ok(()); +} + +#[test] +fn lewis_I_5_1() -> Result<()> { + // O with 2 Lewis doublets (one bar above, one below) → ⠹⠕⠰⠣⠙⠆ + let expr = r#" + O―― + "#; + test_braille("French", expr, "⠹⠕⠰⠣⠙⠆")?; + return Ok(()); +} + +#[test] +fn lewis_I_5_2() -> Result<()> { + // H−O−H with 2 doublets on O + let expr = r#"H- + O―― + - H"#; + test_braille("French", expr, "⠚⠓⠀⠚⠕⠰⠣⠙⠆⠀⠚⠓")?; + return Ok(()); +} + +#[test] +#[ignore = "Lewis notation with bars on left/right of an atom not implemented"] +fn lewis_I_5_3() -> Result<()> { + // H−Cl with 3 doublets on Cl + let expr = r#"H- + Cl―― + |"#; + test_braille("French", expr, "⠚⠓⠀⠚⠉⠇⠰⠩⠙⠆")?; + return Ok(()); +} + +// --- II. Ionic writing --- + +#[test] +fn ion_II_1_1() -> Result<()> { + let expr = r#"H+"#; + test_braille("French", expr, "⠹⠓⠈⠖")?; + return Ok(()); +} + +#[test] +fn ion_II_1_2() -> Result<()> { + let expr = r#"O2-"#; + test_braille("French", expr, "â šâ •â ˆâ °â Łâ €â †")?; + return Ok(()); +} + #[test] fn ion_II_1_3() -> Result<()> { let expr= r#"SO42-"#; - test_braille("French", expr, "⠹⠎⠹⠕⠱â čâ ˆâ °â Łâ €â †")?; + test_braille("French", expr, "⠹⠎⠹⠕â čâ ˆâ °â Łâ €â †")?; + return Ok(()); +} + +#[test] +fn dissociation_II_2_1() -> Result<()> { + // (CuÂČâș; SO₄ÂČ⁻) + let expr = r#"( + Cu2+; + SO42- + )"#; + test_braille("French", expr, "â Šâ šâ ‰â „â ˆâ °â Łâ –â †â  â †â šâ Žâ šâ •â čâ ˆâ °â Łâ €â †â Ž")?; + return Ok(()); +} + +#[test] +fn dipole_II_3_1() -> Result<()> { + // Hᔟâș − Clᔟ⁻ + let expr = r#" + HÎŽ+ + - + ClÎŽ- + "#; + test_braille("French", expr, "⠚⠓⠈⠰⠘⠙⠈⠖⠆⠀⠚⠉⠇⠈⠰⠘⠙⠈⠀⠆")?; + return Ok(()); +} + +// --- III. Chemical reactions and transformations --- + +#[test] +fn reaction_III_2_1() -> Result<()> { + // C(s)+O₂(g)→CO₂(g) + let expr = r#" + C(s) + + + O2(g) + → + CO2(g) + "#; + test_braille("French", expr, "⠚⠉⠊⠎⠎⠖⠚⠕⠣⠊⠛⠎⠞⠱⠚⠉⠚⠕⠣⠊⠛⠎")?; + return Ok(()); +} + +#[test] +fn reaction_III_2_2() -> Result<()> { + // CO(g)+H₂O(l)→CO₂(g)+H₂(g) — line-continuation ⠐ omitted (single-line MathML) + let expr = r#" + CO(g) + + + H2O(l) + → + CO2(g) + + + H2(g) + "#; + test_braille("French", expr, "⠚⠉⠚⠕⠊⠛⠎⠖⠚⠓⠣⠚⠕⠊⠇⠎⠞⠱⠚⠉⠚⠕⠣⠊⠛⠎⠖⠚⠓⠣⠊⠛⠎")?; + return Ok(()); +} + +#[test] +fn reaction_III_2_3() -> Result<()> { + // HCl(g)+H₂O(l)→(eau) H₃Oâș(aq)+Cl⁻(aq) — line-continuation ⠐ omitted + let expr = r#" + HCl(g) + + + H2O(l) + →(eau) + H3O+ + (aq) + + + Cl- + (aq) + "#; + test_braille("French", expr, "â šâ “â šâ ‰â ‡â Šâ ›â Žâ –â šâ “â Łâ šâ •â Šâ ‡â Žâ žâ ±â Šâ ‘â â „â Žâ šâ “â ©â šâ •â ˆâ –â Šâ â Ÿâ Žâ –â šâ ‰â ‡â ˆâ €â Šâ â Ÿâ Ž")?; + return Ok(()); +} + +#[test] +fn emerges_III_3_1() -> Result<()> { + // 2H₃Oâș + FeS → FeÂČâș + 2H₂O + H₂S↑ + let expr = r#" + 2H3O+ + + + FeS + → + Fe2+ + + + 2H2O + + + H2S↑ + "#; + test_braille("French", expr, "â Łâ šâ “â ©â šâ •â ˆâ °â –â †â –â šâ ‹â ‘â šâ Žâ žâ ±â šâ ‹â ‘â ˆâ °â Łâ –â †â –â Łâ šâ “â Łâ šâ •â –â šâ “â Łâ šâ Žâ ˜â ±")?; + return Ok(()); +} + +#[test] +fn precipitate_III_4_1() -> Result<()> { + // H₂S(g)+Cl₂(g)→2HCl(g)+S(s)↓ + let expr = r#" + H2S(g) + + + Cl2(g) + → + 2HCl(g) + + + S(s)↓ + "#; + test_braille("French", expr, "⠚⠓⠣⠚⠎⠊⠛⠎⠖⠚⠉⠇⠣⠊⠛⠎⠞⠱⠣⠚⠓⠚⠉⠇⠊⠛⠎⠖⠚⠎⠊⠎⠎⠚⠱")?; return Ok(()); } #[test] fn equilibrium_III_5_1() -> Result<()> { + // N₂(g)+3H₂(g)⇌2NH₃(g) let expr= r#"N2(g)+3H2(g)⇌2NH3(g)"#; test_braille("French", expr, "â šâ â Łâ Šâ ›â Žâ –â ©â šâ “â Łâ Šâ ›â Žâ žâ »â Łâ šâ â šâ “â ©â Šâ ›â Ž")?; return Ok(()); @@ -34,10 +256,12 @@ fn equilibrium_III_5_1() -> Result<()> { #[test] fn equilibrium_III_5_2() -> Result<()> { + // 2H₂O ⇌(1;2) H₃Oâș + OH⁻ (line-continuation ⠐ omitted) + // Note: braille doesn't match the example -- no parens around the '1' and '2' let expr= r#"2H2O - ⇌(2)(1)H3O++OH-"#; - test_braille("French", expr, "â Łâ šâ “â Łâ šâ •â °â žâ »â †â ąâ ąâ Šâ Łâ Žâ ˆâ ˆâ Šâ Ąâ Žâ šâ “â ©â šâ •â ˆâ °â –â †â –â šâ •â šâ “â ˆâ °â €â †")?; + ⇌21 + H3O++OH-"#; + test_braille("French", expr, "â Łâ šâ “â Łâ šâ •â žâ »â Šâ Ąâ †â Łâ Žâ šâ “â ©â šâ •â ˆâ °â –â †â –â šâ •â šâ “â ˆâ €")?; return Ok(()); } @@ -49,6 +273,68 @@ fn equilibrium_III_5_3() -> Result<()> { R-CO-O- R'+ H2O"#; - test_braille("French", expr, "⠚⠗⠀⠚⠉⠚⠕⠀⠚⠕⠀⠚⠓⠖⠚⠗⠄⠀⠚⠕⠚⠓ â žâ »â šâ ąâ °â “â œâ ™â —â •â ‡â œâ Žâ ‘â †â šâ ”â ˆâ °â ‘â Žâ žâ —â Šâ ‹â Šâ ‰â â žâ Šâ •â â †â šâ —â €â šâ ‰â šâ •â €â šâ •â €â šâ —â „â –â šâ “â ąâ Łâ šâ •")?; + test_braille("French", expr, "â šâ —â €â šâ ‰â šâ •â €â šâ •â €â šâ “â –â šâ —â „â €â šâ •â šâ “â žâ »â Šâ ‘â Žâ žâ żâ —â Šâ ‹â Šâ ‰â â žâ Šâ •â â †â “â œâ ™â —â •â ‡â œâ Žâ ‘â Žâ šâ —â €â šâ ‰â šâ •â €â šâ •â €â šâ —â „â –â šâ “â Łâ šâ •")?; + return Ok(()); +} + +#[test] +fn equilibrium_III_5_4() -> Result<()> { + // A ⇌ B with hΜ / empty half-zone ⠐⠂ + let expr = r#" + A + ⇌hΜ + B + "#; + test_braille("French", expr, "⠚⠁⠞⠻⠊⠓⠘⠝⠆⠐⠂⠎⠚⠃")?; + return Ok(()); +} + +// --- IV. Some notes (redox pairs / mesomerism) --- + +#[test] +fn redox_IV_1_1() -> Result<()> { + let expr = r#" + Cu2+ + / + Cu + "#; + test_braille("French", expr, "â šâ ‰â „â ˆâ °â Łâ –â †â Œâ šâ ‰â „")?; + return Ok(()); +} + +#[test] +fn redox_IV_1_2() -> Result<()> { + let expr = r#" + Fe3+ + / + Fe2+ + "#; + test_braille("French", expr, "â šâ ‹â ‘â ˆâ °â ©â –â †â Œâ šâ ‹â ‘â ˆâ °â Łâ –â †")?; + return Ok(()); +} + +#[test] +fn redox_IV_1_3() -> Result<()> { + let expr = r#" + H3O+ + / + H2O + "#; + test_braille("French", expr, "â šâ “â ©â šâ •â ˆâ –â Œâ šâ “â Łâ šâ •")?; + return Ok(()); +} + +#[test] +fn mesomerism_IV_2_1() -> Result<()> { + // (CH₃)₂C=O ↔ (CH₃)₂Câș−O⁻ + let expr = r#" + (CH3)2 + C=O + ↔ + (CH3)2 + C+- + O- + "#; + test_braille("French", expr, "â Šâ šâ ‰â šâ “â ©â Žâ Łâ šâ ‰â ¶â šâ •â â »â Šâ šâ ‰â šâ “â ©â Žâ Łâ šâ ‰â ˆâ –â €â šâ •â ˆâ €")?; return Ok(()); } diff --git a/tests/braille/French/french.rs b/tests/braille/French/french.rs index a799b8ed7..6b1accc72 100644 --- a/tests/braille/French/french.rs +++ b/tests/braille/French/french.rs @@ -369,8 +369,17 @@ fn square_formula_3_10_05() -> Result<()> { #[test] fn function_from_r_to_r_11_01() -> Result<()> { - let expr= r#"f:ℝ→ℝ,x↩y=1x"#; - test_braille("French", expr, "â ‹â ’â šâ šâ —â žâ ±â šâ šâ —â ­â â ±â œâ ¶â Ąâ Œâ ­")?; + // Spec §11 example, first line: f : ℝ → ℝ + let expr= r#"f:ℝ→ℝ"#; + test_braille("French", expr, "⠋⠒⠚⠚⠗⠞⠱⠚⠚⠗")?; + return Ok(()); +} + +#[test] +fn maps_to_y_equals_1_over_x_11_02() -> Result<()> { + // Spec §11 example, second line: x ↩ y = 1/x + let expr= r#"x↩y=1x"#; + test_braille("French", expr, "â ­â â ±â œâ ¶â Ąâ Œâ ­")?; return Ok(()); } @@ -460,25 +469,39 @@ fn restriction_of_f_to_13_2_04() -> Result<()> { // #[test] // fn determinant_tabular_13_3_01() -> Result<()> { -// let expr= r#"I=|1023|=3"#; +// let expr= r#"I=| +// 10 +// 23 +// |=3"#; // test_braille("French", expr, "not correctâ šâ Šâ ¶â żâ Ąâ €â Œâ ż ⠿⠣⠀⠩⠿⠶⠩")?; // return Ok(()); // } #[test] fn matrix_linear_13_3_02() -> Result<()> { - let expr= r#"J=(142356−789)"#; + let expr= r#"J=( + + 14 + 2356 + −789 + )"#; test_braille("French", expr, "â šâ šâ ¶â ˜â Šâ Ąâ €â â ‚â €â â ‚â €â čâ €â  â œâ €â Łâ €â ©â €â ±â €â «â €â  â œâ €â €â »â €â łâ €â â ‚â €â Ș⠘⠎")?; return Ok(()); } #[test] fn matrix_with_equations_one_lines_13_3_03() -> Result<()> { - let expr= r#"K=[1x2+3x−96x3−x2+1x+3y+5g(x)]"#; + let expr= r#"K=[ + 1x2+3x−96x3−x2+1 + x+3y+5g(x) + ]"#; test_braille("French", expr, "â šâ …â ¶â ˜â ·â Ąâ €â °â ­â ˆâ Łâ –â ©â ­â €â Șâ †â Œâ °â «â ­â ˆâ ©â €â ­â ˆâ Łâ –â Ąâ †â €â  â œâ €â °â ­â –â ©â †â Œâ °â œâ –â ±â †â €â ›â Šâ ­â Žâ ˜â Ÿ")?; return Ok(()); } #[test] fn sytem_equation_linĂ©araire_13_4_01() -> Result<()> { - let expr= r#"{2x+3y=53x−7y=8"#; + let expr= r#"{ + 2x+3y=5 + 3x−7y=8 + "#; test_braille("French", expr, "â žâ Šâ Łâ ­â –â ©â œâ ¶â ±â €â  â œâ €â ©â ­â €â »â œâ ¶â ł")?; return Ok(()); } @@ -519,7 +542,10 @@ fn limit_x_tends_1_14_2_01_corrected() -> Result<()> { #[test] fn limit_x_tends_and_x_lt_1_14_2_02_corrected_1() -> Result<()> { - let expr= r#"limx→4x>4f(x)=−∞"#; + let expr= r#"lim + x→4 + x>4 + f(x)=−∞"#; test_braille("French", expr, "â ‡â Šâ â ąâ ąâ °â ­â žâ ±â č⠂⠭⠐⠜â č⠆⠋⠊⠭⠎⠶⠀⠘⠉")?; return Ok(()); } @@ -594,8 +620,12 @@ fn integral_over_curve_14_4_04() -> Result<()> { #[test] fn integral_double_over_surface_14_4_05() -> Result<()> { - let expr= r#"∯Sf(x,y)dxdy"#; - test_braille("French", expr, "â šâ Żâ Żâ ąâ šâ Žâ ‹â Šâ ­â ‚â œâ Žâ ™â ­â ™â œ")?; + let expr= r#"∯S + f(x,y)dxdy"#; + // The original expr doesn't bracket bracket the integral, but other similar cases do bracket an exponent that is followed by a char + // I was told that leaning towards disambiguation is better, and was told MathCAT's version was OK + // test_braille("French", expr, "â šâ Żâ Żâ ąâ šâ Žâ ‹â Šâ ­â ‚â œâ Žâ ™â ­â ™â œ")?; + test_braille("French", expr, "â °â šâ Żâ Żâ ąâ šâ Žâ †â ‹â Šâ ­â ‚â œâ Žâ ™â ­â ™â œ")?; return Ok(()); } @@ -633,8 +663,18 @@ fn cos_of_sum_2_14_6_01b() -> Result<()> { test_braille_prefs("French", vec![("French_UseShortForm", "true")], expr, "â šâ Źâ Šâ â –â ƒâ Žâ ¶â šâ Źâ â šâ Źâ ƒâ €â Źâ â Źâ ƒ")?; return Ok(()); } + #[test] fn cosh_sinh_14_7_01() -> Result<()> { + let expr= r#"ch2x−sh2x=1"#; + test_braille_prefs("French", vec![("French_UseShortForm", "true")], expr, "â ‰â “â ˆâ Łâ °â ­â †â €â Žâ “â ˆâ Łâ °â ­â †â ¶â Ą")?; + + return Ok(()); +} + + +#[test] +fn cosh_sinh_14_7_01_fullname() -> Result<()> { let expr= r#"cosh2x−sinh2x=1"#; test_braille_prefs("French", vec![("French_UseShortForm", "true")], expr, "â ‰â “â ˆâ Łâ °â ­â †â €â Žâ “â ˆâ Łâ °â ­â †â ¶â Ą")?; @@ -650,10 +690,215 @@ fn exists_element_of_15_01() -> Result<()> { #[test] fn set_formula_15_02() -> Result<()> { - let expr= r#"∀Δ>0∃η>0:|x2−x1|≀η⇒|f(x2)−f(x1)|≀Δ"#; + let expr= r#"∀Δ>0∃ + η>0: + |x2−x1| + ≀η⇒ + |f(x2) + −f(x1) + |≀Δ"#; + test_braille("French", expr, "â žâ Œâ ˜â ‘â â œâ Œâ €â žâ Ąâ ˜â “â â œâ Œâ ’â €â żâ ­â ąâ Łâ €â ­â ąâ Ąâ żâ ˜â Łâ ˜â “â €â ’â ‚â €â żâ ‹â Šâ ­â ąâ Łâ Žâ €â ‹â Šâ ­â ąâ Ąâ Žâ żâ ˜â Łâ ˜â ‘")?; + return Ok(()); +} + +#[test] +fn set_formula_15_02_from_word() -> Result<()> { + // Note: orginal used U+2008 (punctuation space) before ":" which triggers whitespace in the output + // If looks wrong also. Switched to U+2009 (thin space) + let expr= r#" + ∀ + Δ + > + 0 +   + ∃ + η + > + 0 +   + : +   + + | + + x2 + - + x1 + + | + + ≀ + η +   + âŸč +   + + | + + f + + ( + + x2 + + ) + + - + f + + ( + + x1 + + ) + + + | + + ≀ + Δ + "#; test_braille("French", expr, "â žâ Œâ ˜â ‘â â œâ Œâ €â žâ Ąâ ˜â “â â œâ Œâ ’â €â żâ ­â ąâ Łâ €â ­â ąâ Ąâ żâ ˜â Łâ ˜â “â €â ’â ‚â €â żâ ‹â Šâ ­â ąâ Łâ Žâ €â ‹â Šâ ­â ąâ Ąâ Žâ żâ ˜â Łâ ˜â ‘")?; return Ok(()); } + +// --- 16.3 UnitĂ©s (braille intĂ©gral) --- +// Spec also lists braille abrĂ©gĂ© (letter indicator â   before unit abbreviations after numbers); +// MathCAT emits intĂ©gral math braille only. + +#[test] +fn units_5_3_km_16_3_01() -> Result<()> { + let expr = r#"5,3 km"#; + test_braille("French", expr, "⠱⠂⠩⠀⠅⠍")?; + return Ok(()); +} + +#[test] +fn units_3_40_euro_16_3_02() -> Result<()> { + let expr = r#"3,40 â‚Ź"#; + test_braille("French", expr, "⠩⠂â č⠌⠀⠘⠑")?; + return Ok(()); +} + +#[test] +fn units_1_5_kW_16_3_03() -> Result<()> { + let expr = r#"1,5 kW"#; + test_braille("French", expr, "⠥⠂⠱⠀⠅⠚â ș")?; + return Ok(()); +} + +#[test] +fn units_220_V_16_3_04() -> Result<()> { + let expr = r#"220 V"#; + test_braille("French", expr, "â Łâ Łâ Œâ €â šâ §")?; + return Ok(()); +} + +#[test] +fn units_67_km2_16_3_05() -> Result<()> { + let expr = r#"67 km2"#; + test_braille("French", expr, "â «â »â €â …â â ˆâ Ł")?; + return Ok(()); +} + +#[test] +fn units_37_deg_16_3_06() -> Result<()> { + // Degree is attached to the number (no space), as in print + let expr = r#"37°"#; + test_braille("French", expr, "⠩⠻⠐⠕")?; + return Ok(()); +} + +#[test] +fn units_dms_16_3_07() -> Result<()> { + // 45° 25â€Č 12″ — spaces between degree/minute/second groups + let expr = r#" + 45°  + 25â€Č  + 12″ + "#; + test_braille("French", expr, "â č⠱⠐⠕⠀⠣⠱⠄⠀⠥⠣⠄⠄")?; + return Ok(()); +} + +#[test] +fn units_0_degC_16_3_08() -> Result<()> { + let expr = r#"0 â„ƒ"#; + test_braille("French", expr, "⠌⠀⠐⠕⠚⠉")?; + return Ok(()); +} + +#[test] +fn units_50_km_h_16_3_09() -> Result<()> { + let expr = r#"50 km/h"#; + test_braille("French", expr, "⠱⠌⠀⠅⠍⠌⠓")?; + return Ok(()); +} + +#[test] +fn units_3_4_m_s_16_3_10() -> Result<()> { + // 3,4 m·s⁻Âč + let expr = r#" + 3,4  + m×s-1 + "#; + test_braille("French", expr, "⠩⠂â čâ €â â ”â Žâ ˆâ €â Ą")?; + return Ok(()); +} + +#[test] +fn units_2h35min15s_16_3_11() -> Result<()> { + let expr = r#" + 2 h  + 35 min  + 15 s + "#; + test_braille("French", expr, "â Łâ €â “â €â ©â ±â €â â Šâ â €â Ąâ ±â €â Ž")?; + return Ok(()); +} + +#[test] +fn units_7_L_16_3_12() -> Result<()> { + let expr = r#"7 L"#; + test_braille("French", expr, "⠻⠀⠚⠇")?; + return Ok(()); +} + +#[test] +fn units_50_cL_16_3_13() -> Result<()> { + let expr = r#"50 cL"#; + test_braille("French", expr, "⠱⠌⠀⠉⠚⠇")?; + return Ok(()); +} + +#[test] +fn units_4_MHz_16_3_14() -> Result<()> { + let expr = r#"4 MHz"#; + test_braille("French", expr, "â č⠀⠚⠍⠚⠓⠔")?; + return Ok(()); +} + +#[test] +fn units_6_ohm_16_3_15() -> Result<()> { + let expr = r#"6 Î©"#; + test_braille("French", expr, "⠫⠀⠚⠘â ș")?; + return Ok(()); +} + +#[test] +fn units_5_uV_16_3_16() -> Result<()> { + let expr = r#"5 ÎŒV"#; + test_braille("French", expr, "⠱⠀⠘⠍⠚⠧")?; + return Ok(()); +} + +#[test] +fn units_9_angstrom_16_3_17() -> Result<()> { + let expr = r#"9 â„«"#; + test_braille("French", expr, "â Ș⠀⠹⠁⠈⠕")?; + return Ok(()); +} + #[test] fn power_ordinal_a_16_4_07() -> Result<()> { let expr= r#"(p+q)iĂšme"#; diff --git a/tests/braille/French/other.rs b/tests/braille/French/other.rs new file mode 100644 index 000000000..bcead397b --- /dev/null +++ b/tests/braille/French/other.rs @@ -0,0 +1,367 @@ +// French braille tests from additional sources (generated candidates). +// Base reference: "NOTATION MATHÉMATIQUE BRAILLE" (PremiĂšre Ă©dition janvier 2007) +// https://www.avh.asso.fr/sites/default/files/notation_mathematique_braille2_0.pdf +// 4e, 5e, etc., refer to grade levels. Numbers refer to relevant sections in the spec. + +use crate::common::*; +use anyhow::Result; + +// --- lot1: digits, letters, sets --- + +#[test] +fn digit_isolated_5_1_01() -> Result<()> { + let expr= r#"5"#; + test_braille("French", expr, "â ±")?; + return Ok(()); +} + +#[test] +fn digit_multidigit_312_1_02() -> Result<()> { + let expr= r#"312"#; + test_braille("French", expr, "â ©â Ąâ Ł")?; + return Ok(()); +} + +#[test] +fn digit_decimal_3_14_1_03() -> Result<()> { + let expr= r#"3,14"#; + test_braille("French", expr, "â ©â ‚â Ąâ č")?; + return Ok(()); +} + +#[test] +fn digit_negative_minus_7_1_04() -> Result<()> { + let expr= r#"−7"#; + test_braille("French", expr, "⠀⠻")?; + return Ok(()); +} + +#[test] +fn infinity_plus_1_05() -> Result<()> { + let expr= r#"+∞"#; + test_braille("French", expr, "⠖⠘⠉")?; + return Ok(()); +} + +#[test] +fn partial_derivative_round_d_2_1_01() -> Result<()> { + let expr= r#"∂"#; + test_braille("French", expr, "⠐⠙")?; + return Ok(()); +} + +#[test] +fn set_naturals_blackboard_n_2_2_01() -> Result<()> { + let expr= r#"ℕ"#; + test_braille("French", expr, "⠚⠚⠝")?; + return Ok(()); +} + +#[test] +fn greek_alpha_lower_2_3_01() -> Result<()> { + let expr= r#"α"#; + test_braille("French", expr, "⠘⠁")?; + return Ok(()); +} + +#[test] +fn greek_delta_upper_2_3_02() -> Result<()> { + let expr= r#"Δ"#; + test_braille("French", expr, "⠹⠘⠙")?; + return Ok(()); +} + +#[test] +fn hebrew_aleph_2_4_01() -> Result<()> { + let expr= r#"â„”"#; + test_braille("French", expr, "⠘⠘⠁")?; + return Ok(()); +} + +// --- lot2: operations, equality, parentheses --- + +#[test] +fn addition_simple_3_01() -> Result<()> { + let expr= r#"2+3"#; + test_braille("French", expr, "â Łâ –â ©")?; + return Ok(()); +} + +#[test] +fn multiplication_cross_3_02() -> Result<()> { + let expr= r#"2×3"#; + test_braille("French", expr, "⠣⠔⠩")?; + return Ok(()); +} + +#[test] +fn plus_or_minus_3_03() -> Result<()> { + let expr= r#"±5"#; + test_braille("French", expr, "⠖⠀⠱")?; + return Ok(()); +} + +#[test] +fn function_composition_3_04() -> Result<()> { + let expr= r#"f∘g"#; + test_braille("French", expr, "⠋⠞⠌⠛")?; + return Ok(()); +} + +#[test] +fn equality_arithmetic_4_01() -> Result<()> { + let expr= r#"2+3=5"#; + test_braille("French", expr, "â Łâ –â ©â ¶â ±")?; + return Ok(()); +} + +#[test] +fn inequality_less_than_4_02() -> Result<()> { + let expr= r#"x<5"#; + test_braille("French", expr, "⠭⠐⠣⠱")?; + return Ok(()); +} + +#[test] +fn approximately_equal_pi_4_03() -> Result<()> { + let expr= r#"π≈3,14"#; + test_braille("French", expr, "â ˜â â â ¶â ©â ‚â Ąâ č")?; + return Ok(()); +} + +#[test] +fn parenthesis_simple_5_01() -> Result<()> { + let expr= r#"(a+b)"#; + test_braille("French", expr, "⠩⠁⠖⠃⠮")?; + return Ok(()); +} + +#[test] +fn parenthesis_nested_imbrication_5_02() -> Result<()> { + let expr= r#"f(g(x))"#; + test_braille("French", expr, "⠋⠐⠩⠛⠩⠭⠮⠐⠮")?; + return Ok(()); +} + +#[test] +fn braces_set_with_condition_5_03() -> Result<()> { + let expr= r#"{x:x>0}"#; + test_braille("French", expr, "⠚⠊⠭⠒⠭⠐⠜⠌⠚⠎")?; + return Ok(()); +} + +// --- 4e --- + +#[test] +fn linear_equation_4e_3_4_01() -> Result<()> { + let expr= r#"2x+3=7"#; + test_braille("French", expr, "â Łâ ­â –â ©â ¶â »")?; + return Ok(()); +} + +#[test] +fn inequality_4e_4_01() -> Result<()> { + let expr= r#"2x−1<5"#; + test_braille("French", expr, "⠣⠭⠀⠥⠐⠣⠱")?; + return Ok(()); +} + +#[test] +fn pythagoras_4e_9_3_01() -> Result<()> { + let expr= r#"a2+b2=c2"#; + test_braille("French", expr, "â â ˆâ Łâ –â ƒâ ˆâ Łâ ¶â ‰â ˆâ Ł")?; + return Ok(()); +} + +#[test] +fn square_root_simple_4e_10_01() -> Result<()> { + let expr= r#"25=5"#; + test_braille("French", expr, "â œâ Łâ ±â ¶â ±")?; + return Ok(()); +} + +#[test] +fn scientific_notation_4e_9_3_02() -> Result<()> { + let expr= r#"3×103"#; + test_braille("French", expr, "â ©â ”â Ąâ Œâ ˆâ ©")?; + return Ok(()); +} + +#[test] +fn negative_exponent_4e_9_3_03() -> Result<()> { + let expr= r#"10−2=0,01"#; + test_braille("French", expr, "â Ąâ Œâ ˆâ €â Łâ ¶â Œâ ‚â Œâ Ą")?; + return Ok(()); +} + +#[test] +fn sin_function_full_4e_14_6_01() -> Result<()> { + let expr= r#"sin(30°)=12"#; + test_braille("French", expr, "â Žâ Šâ â Šâ ©â Œâ â •â Žâ ¶â Ąâ Œâ Ł")?; + return Ok(()); +} + +#[test] +fn binomial_square_4e_9_3_5_01() -> Result<()> { + let expr= r#"(a+b)2=a2+2ab+b2"#; + test_braille("French", expr, "â Šâ â –â ƒâ Žâ ˆâ Łâ ¶â â ˆâ Łâ –â Łâ â ƒâ –â ƒâ ˆâ Ł")?; + return Ok(()); +} + +#[test] +fn square_root_complex_4e_10_8_01() -> Result<()> { + let expr= r#"a2+b2"#; + test_braille("French", expr, "⠜⠰⠁⠈⠣⠖⠃⠈⠣⠆")?; + return Ok(()); +} + +#[test] +fn probability_4e_5_7_01() -> Result<()> { + let expr= r#"P(A)=14"#; + test_braille("French", expr, "â šâ â Šâ šâ â Žâ ¶â Ąâ Œâ č")?; + return Ok(()); +} + +// --- 5e --- + +#[test] +fn fraction_add_simple_5e_7_3_01() -> Result<()> { + let expr= r#"13+14=712"#; + test_braille("French", expr, "â Ąâ Œâ ©â –â Ąâ Œâ čâ ¶â »â Œâ Ąâ Ł")?; + return Ok(()); +} + +#[test] +fn negative_add_5e_3_01() -> Result<()> { + let expr= r#"−5+3=−2"#; + test_braille("French", expr, "⠀⠱⠖⠩⠶⠀⠣")?; + return Ok(()); +} + +#[test] +fn literal_expression_5e_3_01() -> Result<()> { + let expr= r#"3a+2b"#; + test_braille("French", expr, "â ©â â –â Łâ ƒ")?; + return Ok(()); +} + +#[test] +fn percentage_5e_16_4_01() -> Result<()> { + let expr= r#"15%×60=9"#; + test_braille("French", expr, "â Ąâ ±â â Źâ ”â «â Œâ ¶â Ș")?; + return Ok(()); +} + +#[test] +fn power_two_digit_base_5e_9_3_01() -> Result<()> { + let expr= r#"102=100"#; + test_braille("French", expr, "â Ąâ Œâ ˆâ Łâ ¶â Ąâ Œâ Œ")?; + return Ok(()); +} + +#[test] +fn volume_cube_formula_5e_9_3_02() -> Result<()> { + let expr= r#"V=a3"#; + test_braille("French", expr, "⠚⠧⠶⠁⠈⠩")?; + return Ok(()); +} + +#[test] +fn fraction_complex_numerator_5e_7_8_01() -> Result<()> { + let expr= r#"a+b2"#; + test_braille("French", expr, "⠰⠁⠖⠃⠆⠌⠣")?; + return Ok(()); +} + +#[test] +fn triangle_area_5e_7_8_02() -> Result<()> { + let expr= r#"A=b×h2"#; + test_braille("French", expr, "â šâ â ¶â °â ƒâ ”â “â †â Œâ Ł")?; + return Ok(()); +} + +#[test] +fn angles_sum_greek_5e_2_3_16_01() -> Result<()> { + let expr= r#"α+ÎČ=90°"#; + test_braille("French", expr, "⠘⠁⠖⠘⠃⠶â Ș⠌⠐⠕")?; + return Ok(()); +} + +#[test] +fn proportionality_ratio_5e_7_4_01() -> Result<()> { + let expr= r#"ab=cd"#; + test_braille("French", expr, "⠁⠌⠃⠶⠉⠌⠙")?; + return Ok(()); +} + +// --- 6e --- + +#[test] +fn addition_6e_3_01() -> Result<()> { + let expr= r#"12+7=19"#; + test_braille("French", expr, "⠥⠣⠖⠻⠶⠥â Ș")?; + return Ok(()); +} + +#[test] +fn multiplication_6e_3_02() -> Result<()> { + let expr= r#"6×8=48"#; + test_braille("French", expr, "⠫⠔⠳⠶â čâ ł")?; + return Ok(()); +} + +#[test] +fn division_6e_3_03() -> Result<()> { + let expr= r#"15Ă·3=5"#; + test_braille("French", expr, "⠥⠱⠒⠩⠶⠱")?; + return Ok(()); +} + +#[test] +fn priority_no_parens_6e_3_4_01() -> Result<()> { + let expr= r#"3+4×2=11"#; + test_braille("French", expr, "⠩⠖â č⠔⠣⠶⠥⠥")?; + return Ok(()); +} + +#[test] +fn parentheses_priority_6e_5_01() -> Result<()> { + let expr= r#"(3+4)×2=14"#; + test_braille("French", expr, "â Šâ ©â –â č⠎⠔⠣⠶⠥â č")?; + return Ok(()); +} + +#[test] +fn fraction_simple_6e_7_01() -> Result<()> { + let expr= r#"34"#; + test_braille("French", expr, "⠩⠌â č")?; + return Ok(()); +} + +#[test] +fn fraction_equality_6e_7_4_01() -> Result<()> { + let expr= r#"12=24"#; + test_braille("French", expr, "â Ąâ Œâ Łâ ¶â Łâ Œâ č")?; + return Ok(()); +} + +#[test] +fn fraction_decimal_6e_7_1_01() -> Result<()> { + let expr= r#"34=0,75"#; + test_braille("French", expr, "⠩⠌â č⠶⠌⠂⠻⠱")?; + return Ok(()); +} + +#[test] +fn square_exponent_6e_9_3_01() -> Result<()> { + let expr= r#"52=25"#; + test_braille("French", expr, "⠱⠈⠣⠶⠣⠱")?; + return Ok(()); +} + +#[test] +fn perpendicular_lines_6e_12_3_01() -> Result<()> { + let expr= r#"(AB)⊄(CD)"#; + test_braille("French", expr, "⠩⠹⠁⠹⠃⠮⠘⠳⠩⠹⠉⠹⠙⠮")?; + return Ok(()); +} From d743060a0c3818030b3a0ddd079742d942ef1503 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Thu, 6 Aug 2026 22:30:00 -0700 Subject: [PATCH 019/162] Add "(eau)" as a state (for French) Added several more chem arrows. --- src/chemistry.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/chemistry.rs b/src/chemistry.rs index 4b991dcef..461e50187 100644 --- a/src/chemistry.rs +++ b/src/chemistry.rs @@ -81,10 +81,15 @@ static MERGED_TOKEN: &str = "data-merged"; /// these can be in the base of an under/over script fn is_chem_equation_arrow(ch: char) -> bool { matches!(ch, - '→' | '➔' | '←' | '⟶' | '⟔' | '※' | '⇋' | '⇌' | + // reaction arrows + '→' | '➔' | '←' | '⟶' | '⟔' | '※' | '⇒' | '⇐' | 'âŸč' | '⟾' | + // equilibrium + '⇋' | '⇌' | '⇄' | '⇆' | 'â„‚' | 'â„„' | '℃' | + // mesomerism / resonance (left-right) + '↔' | '⟷' | '⇔' | 'âŸș' | + // vertical / other chem arrows '↑' | '↓' | '↿' | '↟' | '⇃' | '⇂' | '℟' | 'ℯ' | '⇷' | '⇾' | ' ' | ' ' | - 'â„‚' | 'â„„' | '℃' | - '\u{1f8d0}' | '\u{1f8d1}' | '\u{1f8d2}' | '\u{1f8d3}' | '\u{1f8d4}' | '\u{1f8d5}' // proposed Unicode equilibrium arrows + '\u{1f8d0}' | '\u{1f8d1}' | '\u{1f8d2}' | '\u{1f8d3}' | '\u{1f8d4}' | '\u{1f8d5}' // new Unicode equilibrium arrows ) } @@ -969,7 +974,7 @@ fn likely_chem_subscript(subscript: Element) -> i32 { return 0; // not really much chem info about an integer subscript } else if subscript_name == "mi" { let text = as_text(subscript); - if text == "s" || text == "l" || text == "g" || text == "aq" { + if text == "s" || text == "l" || text == "g" || text == "aq" || text == "eau" { subscript.set_attribute_value(CHEM_STATE, "true"); return 2; } @@ -1691,7 +1696,7 @@ fn is_equilibrium_constant(mut mathml: Element) -> bool { // All instances seem to be upper case that I've seen. static SMALL_UPPER_ROMAN_NUMERAL: LazyLock = LazyLock::new(|| Regex::new(r"^\s*^(IX|IV|V?I{0,3})\s*$").unwrap()); -/// look for "(s), "(l)", "(g)", "(aq)" (could also use [...]) +/// look for "(s)", "(l)", "(g)", "(aq)", "(eau)" (could also use [...]) /// this might be called before canonicalization, but in clean_chemistry_mrow, we made sure "( xxx )" is grouped properly pub fn likely_chem_state(mathml: Element) -> i32 { @@ -1701,7 +1706,7 @@ pub fn likely_chem_state(mathml: Element) -> i32 { let contents_name = name(contents); if contents_name == "mi" || contents_name == "mtext" { let text = as_text(contents); - if text == "s" || text == "l" ||text == "g" ||text == "aq" { + if text == "s" || text == "l" || text == "g" || text == "aq" || text == "eau" { return text.len() as i32 + 1; // hack to count chars -- works because all are ASCII }; } From 0d7a39a8e99df4fe6b3c5fb92208645e74646cf7 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Thu, 6 Aug 2026 22:31:59 -0700 Subject: [PATCH 020/162] add more arrows. French at the moment doesn't seem to distinguish between different arrows that go in the same direction. That seems wrong, but the spec is silent on the alternatives --- Rules/Braille/French/unicode-full.yaml | 11 ++--------- Rules/Braille/French/unicode.yaml | 13 ++++++------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/Rules/Braille/French/unicode-full.yaml b/Rules/Braille/French/unicode-full.yaml index e27f214a6..c0bc5275e 100644 --- a/Rules/Braille/French/unicode-full.yaml +++ b/Rules/Braille/French/unicode-full.yaml @@ -19,18 +19,11 @@ - "ï»ż": [t: ""] # 0xfeff (BOM / zero-width no-break space) - - "⇌": [t: "â žâ »"] # 0x21CC (Rightwards harpoon over leftwards harpoon (equilibrium)) -# - "â„‚": [t: ""] # 0x2942 (Rightwards arrow above short leftwards arrow (equilibrium, trend to the right)) -# - "â„„": [t: ""] # 0x2944 (Short rightwards arrow above leftwards arrow (equilibrium, trend to the left)) + - "⇌ℂ℄℃": [t: "â žâ »"] # 0x21CC/2942/2944/2943 equilibrium (incl. trend variants) # Mappings for some new Unicode chemistry arrows/symbols # These repeat the short arrow version because that is what is in the spec (GTM 16), but the spec should really use the long version - - "🣑": [t: "â žâ »"] # 0x1F8D1 LONG RIGHTWARDS HARPOON OVER LONG LEFTWARDS HARPOON (equilibrium) -# - "🣒": [t: ""] # 0x1f8d2 LONG RIGHTWARDS HARPOON ABOVE SHORT LEFTWARDS HARPOON(equilibrium, trend to the right) -# - "🣓": [t: ""] # 0x1f8d3 SHORT RIGHTWARDS HARPOON ABOVE LONG LEFTWARDS HARPOON (equilibrium, trend to the left)) - -# - "🣐": [t: ""] # 0x1F8D0 LONG RIGHTWARDS ARROW OVER LONG LEFTWARDS ARROW -# - "🣕": [t: ""] # 0x1F8D5 SHORT LEFTWARDS HARPOON ABOVELONG RIGHTWARDS HARPOON + - "🣐🣑🣒🣓🣔🣕": [t: "â žâ »"] # 0x1F8D0–1F8D5 long equilibrium / related chem arrows # - "🣖": [t: ""] # 0x1F8D6 LONG RIGHTWARDS ARROW WITH THROUGH X # - "🣗": [t: ""] # 0x1F8D7 LONG RIGHTWARDS ARROW WITH DOUBLE SLASH # - "": [t: ""] # 0x1F8D8 LONG LEFT RIGHT ARROW WITH DEPENDENT LOBE (no clue what to do) diff --git a/Rules/Braille/French/unicode.yaml b/Rules/Braille/French/unicode.yaml index ce310bb3c..6da5cc310 100644 --- a/Rules/Braille/French/unicode.yaml +++ b/Rules/Braille/French/unicode.yaml @@ -251,7 +251,11 @@ if: "parent::m:mrow/*[self::m:mtable] or (following-sibling::*[1][self::m:mtable] and count(following-sibling::*[1]/*) = 1)" then: [t: "â žâ Š"] else: [t: "â šâ Š"] # regular brace - - "|": [t: "â ż"] # 0x007C (vertical bar) + - "|": # 0x007C (vertical bar) + - test: + if: "parent::m:mrow/*[self::m:mtable]" + then: [t: "â žâ ż"] # multi-line (linear matrix/determinant) + else: [t: "â ż"] # single-line - "}": # 0x007D (right curly brace)) - test: if: "parent::m:mrow/*[self::m:mtable]" @@ -285,12 +289,7 @@ if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" then: [t: "⠘⠱"] else: [t: "⠘⠻"] - - "→": # 0x2192 (right pointing arrow) - - test: - if: "parent::m:mover and not(following-sibling::*)" - then: [t: "⠹⠒"] - else: [t: "â žâ ±"] - - "⇀": # 0x2192 (right pointing arrow) + - "→⇀": # 0x2192 (right pointing arrow) - test: if: "parent::m:mover and not(following-sibling::*)" then: [t: "⠹⠒"] From 363fc51331bdcfe3104a3fc5ce11fdaa822621f7 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Thu, 6 Aug 2026 22:32:55 -0700 Subject: [PATCH 021/162] removed some intent attrs that were not needed --- tests/braille/French/chemistry.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/braille/French/chemistry.rs b/tests/braille/French/chemistry.rs index 97528e114..8ce715f5c 100644 --- a/tests/braille/French/chemistry.rs +++ b/tests/braille/French/chemistry.rs @@ -197,7 +197,7 @@ fn reaction_III_2_2() -> Result<()> { #[test] fn reaction_III_2_3() -> Result<()> { // HCl(g)+H₂O(l)→(eau) H₃Oâș(aq)+Cl⁻(aq) — line-continuation ⠐ omitted - let expr = r#" + let expr = r#" HCl(g) + H2O(l) @@ -327,7 +327,7 @@ fn redox_IV_1_3() -> Result<()> { #[test] fn mesomerism_IV_2_1() -> Result<()> { // (CH₃)₂C=O ↔ (CH₃)₂Câș−O⁻ - let expr = r#" + let expr = r#" (CH3)2 C=O ↔ From 9588ed97a4182fc7511a602ecd41fc88bc2bbdf9 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Thu, 6 Aug 2026 22:33:33 -0700 Subject: [PATCH 022/162] uncomment a determinant test after fixing the braille --- tests/braille/French/french.rs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/tests/braille/French/french.rs b/tests/braille/French/french.rs index 6b1accc72..4a823d0b6 100644 --- a/tests/braille/French/french.rs +++ b/tests/braille/French/french.rs @@ -467,15 +467,16 @@ fn restriction_of_f_to_13_2_04() -> Result<()> { return Ok(()); } -// #[test] -// fn determinant_tabular_13_3_01() -> Result<()> { -// let expr= r#"I=| -// 10 -// 23 -// |=3"#; -// test_braille("French", expr, "not correctâ šâ Šâ ¶â żâ Ąâ €â Œâ ż ⠿⠣⠀⠩⠿⠶⠩")?; -// return Ok(()); -// } +#[test] +fn determinant_tabular_13_3_01() -> Result<()> { + let expr= r#"I=| + 10 + 23 + |=3"#; + test_braille("French", expr, "â šâ Šâ ¶â žâ żâ Ąâ €â Œâ €â  â œâ €â Łâ €â ©â žâ żâ ¶â ©")?; + return Ok(()); +} + #[test] fn matrix_linear_13_3_02() -> Result<()> { let expr= r#"J=( From 4408cb20178bfb7c6e75e13f1ddb39b19813401a Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Thu, 6 Aug 2026 23:08:37 -0700 Subject: [PATCH 023/162] Add rules for multiple lines in a script position done via an mtable or a more restricted version for nested munder/mover. They add a "," between lines. This was done for limit_x_tends_1_14_2_01_corrected and limit_x_tends_1_14_2_02_corrected --- Rules/Braille/French/French_Rules.yaml | 46 +++++++++++++++++++++----- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/Rules/Braille/French/French_Rules.yaml b/Rules/Braille/French/French_Rules.yaml index 66a14b325..3c77813a5 100644 --- a/Rules/Braille/French/French_Rules.yaml +++ b/Rules/Braille/French/French_Rules.yaml @@ -125,22 +125,24 @@ name: default tag: [mtr, mlabeledtr] match: "." + # When an mtable is used in a script position (e.g. stacked lim conditions), §14.2 + # joins rows with a comma (⠂) rather than the matrix row-change (⠠⠜). + variables: + - InScriptPosition: "parent::m:mtable[preceding-sibling::* and IsNode(.., 'modified')]" replace: - test: if: "preceding-sibling::*" - then: [t: "W⠠⠜W"] - - # - test: - # if: .[self::m:mlabeledtr] - # then: - # - t: "⠗⠕â șW⠇⠁⠃⠑⠇⠾⠒" # "row label:" - # - x: "*[1]/*" # contents of row label + then: + - test: + if: "$InScriptPosition" + then: [t: "⠂"] # comma between script-position rows + else: [t: "W⠠⠜W"] # matrix/system row change - test: if: .[self::m:mlabeledtr] then: [x: "*[position()>1]"] else: {x: "*"} - test: - if: "following-sibling::* " + if: "following-sibling::* and not($InScriptPosition)" then: [t: "W"] - @@ -427,6 +429,34 @@ - x: "*[2]" - x: "*[1]" +- + # Nested munder/mover for lim / large operators (§14.2): join the two script + # conditions with a comma (⠂), like script-position mtables — one script + # indicator and one block around both conditions. + name: nested-lim-or-largeop-conditions + tag: [munder, mover] + match: "((self::m:munder and *[1][self::m:munder]) or (self::m:mover and *[1][self::m:mover])) and + *[1]/*[1][IsInDefinition(., 'Braille', 'LargeOperators') or .='lim' or .='Lim']" + replace: + - t: "b" + - test: + if: "NeedsToBeGrouped(*[1]/*[1], 'French', true())" + then: + - t: "o" + - x: "*[1]/*[1]" + - t: "c" + else: [x: "*[1]/*[1]"] + - test: + - if: "self::m:munder" + then: [t: "â ąâ ą"] + else: [t: "⠈⠈"] + - t: "o" + - x: "*[1]/*[2]" + - t: "⠂" + - x: "*[2]" + - t: "c" + - t: "e" + - name: default tag: [msub, msup, munder, mover] From 5c482681655dbd37a1df66869a983cbaff4e0d2d Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Thu, 6 Aug 2026 23:10:56 -0700 Subject: [PATCH 024/162] a linebreaks to MathML to make it easier to read --- tests/braille/French/french.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/braille/French/french.rs b/tests/braille/French/french.rs index 4a823d0b6..1f3348c1a 100644 --- a/tests/braille/French/french.rs +++ b/tests/braille/French/french.rs @@ -553,7 +553,11 @@ fn limit_x_tends_and_x_lt_1_14_2_02_corrected_1() -> Result<()> { #[test] fn limit_x_tends_and_x_lt_2_14_2_02_corrected_2() -> Result<()> { - let expr= r#"limx→4x>4f(x)=−∞"#; + let expr= r#" + limx→4 + x>4 + + f(x)=−∞"#; test_braille("French", expr, "â ‡â Šâ â ąâ ąâ °â ­â žâ ±â č⠂⠭⠐⠜â č⠆⠋⠊⠭⠎⠶⠀⠘⠉")?; return Ok(()); } From e5a9c87d81d817ce3ecb31f9bb62c7c755a0151f Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Thu, 6 Aug 2026 23:27:55 -0700 Subject: [PATCH 025/162] add more arrow chars -- I thought I did this in a previous commit, but apparently not. --- Rules/Braille/French/unicode.yaml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Rules/Braille/French/unicode.yaml b/Rules/Braille/French/unicode.yaml index 6da5cc310..89f876bd6 100644 --- a/Rules/Braille/French/unicode.yaml +++ b/Rules/Braille/French/unicode.yaml @@ -283,18 +283,18 @@ - "€": [t: "⠘⠑"] # 0x20AC (euro) - "Å": [t: "⠹⠁⠈⠕"] # 0x212B (angstrom) - "â„”": [t: "HL⠁"] # 0x2135 (alef) - - "←": [t: "â žâ Ș"] # 0x2190 (left pointing arrow) - - "↑": # 0x2191 (arrow pointing up) + - "←⟔": [t: "â žâ Ș"] # 0x2190/27F5 (left / long left arrow) + - "â†‘â†żâ†Ÿâ€‰": # 0x2191/21BF/21BE/2909 (up arrow / harpoons / barred) - test: if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" then: [t: "⠘⠱"] else: [t: "⠘⠻"] - - "→⇀": # 0x2192 (right pointing arrow) + - "→⇀➔⟶※": # 0x2192/21C0/2794/27F6/293B (right arrow / harpoon / long / curved) - test: if: "parent::m:mover and not(following-sibling::*)" then: [t: "⠹⠒"] else: [t: "â žâ ±"] - - "↓": # 0x2193 (arrow pointing down) + - "↓⇃⇂ ": # 0x2193/21C3/21C2/2908 (down arrow / harpoons / barred) - test: if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" then: [t: "â šâ ±"] @@ -304,16 +304,16 @@ - "↗": [t: "⠘⠱"] # 0x2197 (north east arrow) - "↘": [t: "â šâ ±"] # 0x2198 (south east arrow) - "↙": [t: "â šâ Ș"] # 0x2199 (south west arrow) - - "↚": [t: "â šâ žâ Ș"] # 0x219A (leftwards arrow with stroke) - - "↛": [t: "â šâ žâ ±"] # 0x219B (rightwards arrow with stroke) + - "↚⇷": [t: "â šâ žâ Ș"] # 0x219A/21F7 (leftwards arrow with stroke) + - "↛⇾": [t: "â šâ žâ ±"] # 0x219B/21F8 (rightwards arrow with stroke) - "↩": [t: "⠐⠱"] # 0x21A6 (rightwards arrow from bar (maps to)) - - "⇄": [t: "â žâ »"] # 0x21C4 (arrow pointing right over arrow pointing left) + - "â‡„âŸ·â‡Œâ‡‹â‡†â„źâ„Ż": [t: "â žâ »"] # 0x21C4/27F7/21CC/21CB/21C6/296E/296F (equilibrium / reversibility) - "⇍": [t: "⠹⠐⠒"] # 0x21CD (leftwards double arrow with stroke) - "⇎": [t: "⠹⠐⠒⠂"] # 0x21CE (left right double arrow with stroke (not equivalent)) - "⇏": [t: "⠹⠒⠂"] # 0x21CF (rightwards double arrow with stroke (does not imply)) - - "⇐": [t: "⠐⠒"] # 0x21D0 (leftwards double arrow) - - "⇒": [t: "⠒⠂"] # 0x21D2 (rightwards double arrow (implication)) - - "⇔": [t: "⠐⠒⠂"] # 0x21D4 (left right double arrow (double implication, equivalence)) + - "⇐⟾": [t: "⠐⠒"] # 0x21D0/27F8 (leftwards double / long) + - "⇒âŸč": [t: "⠒⠂"] # 0x21D2/27F9 (rightwards double / long) + - "⇔âŸș": [t: "⠐⠒⠂"] # 0x21D4/27FA (left right double / long) - "∀": [t: "⠾⠌"] # 0x2200 (universal quantifier (for all, for each, for every)) - "∁": [t: "â šâ ©"] # 0x2201 (capital english c (complement)) - "∂": [t: "⠐⠙"] # 0x2202 (partial derivative (round d)) From c2dbcc64c3e72fd7973a0f369f8868754211a550 Mon Sep 17 00:00:00 2001 From: mgros Date: Sat, 15 Aug 2026 03:14:51 +0200 Subject: [PATCH 026/162] Add MathJax demo link to developer docs for rendering inspection --- docs/developers.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/developers.md b/docs/developers.md index 2bc2f71e2..04440907c 100644 --- a/docs/developers.md +++ b/docs/developers.md @@ -74,6 +74,10 @@ fn test_simple_fraction() { } ``` +## Helpful Links + +* [MathJax Demo](https://www.mathjax.org/#demo) (archived) lets you paste a MathML fragment and inspect its browser rendering. It can be useful when checking whether an input expression itself renders as expected. + ### Test Coverage Test coverage helps identify which parts of the code are exercised by tests and which parts need more testing. @@ -121,4 +125,4 @@ open target/coverage/html/index.html **Alternative: IDE Integration** -Many Rust IDEs provide built-in test coverage support, like RustRover or VSCode. \ No newline at end of file +Many Rust IDEs provide built-in test coverage support, like RustRover or VSCode. From eebb4be6e7ef538f3f55c3b30985d9b5c128d6d7 Mon Sep 17 00:00:00 2001 From: mgros Date: Sat, 15 Aug 2026 03:16:11 +0200 Subject: [PATCH 027/162] . --- docs/developers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/developers.md b/docs/developers.md index 04440907c..331a16d78 100644 --- a/docs/developers.md +++ b/docs/developers.md @@ -76,7 +76,7 @@ fn test_simple_fraction() { ## Helpful Links -* [MathJax Demo](https://www.mathjax.org/#demo) (archived) lets you paste a MathML fragment and inspect its browser rendering. It can be useful when checking whether an input expression itself renders as expected. +* [MathJax Demo](https://www.mathjax.org/#demo): lets you paste a MathML fragment and inspect its browser rendering. ### Test Coverage From 8e886cc25bfb4952aa7532f5c23c6244d6928a8f Mon Sep 17 00:00:00 2001 From: NSoiffer Date: Fri, 14 Aug 2026 23:55:14 -0700 Subject: [PATCH 028/162] Merge changes (mostly unicode) from hu branch (#688) * Add few tweaks into the Rules/Languages/hu/definitions.yaml file, Added missing definitions.rs test file the test/Languages/hu directory, and added SimpleSpeak test directory the mroot and menclose tests (#646) * Do more localization in Rules/Languages/hu/definitions.yaml Signed-off-by: Attila Hammer * Add in Simplespeak tests the definition, mroot and menclose tests Signed-off-by: Attila Hammer * fix some werbs in intervals into rules/Languages/hu/ClearSpeak_rules.yaml and SimpleSpeak_rules.yaml Signed-off-by: Attila Hammer * Fix tests after interval Clearspeak and SimpleSpeak verb change Signed-off-by: Attila Hammer --------- Signed-off-by: Attila Hammer * Apply Hungarian unicode fixes from PR #673 --------- Signed-off-by: Attila Hammer Co-authored-by: hammera --- Rules/Languages/hu/ClearSpeak_Rules.yaml | 4 +- Rules/Languages/hu/SimpleSpeak_Rules.yaml | 4 +- Rules/Languages/hu/definitions.yaml | 99 +- Rules/Languages/hu/unicode-full.yaml | 21 +- Rules/Languages/hu/unicode.yaml | 5 - tests/Languages/hu.rs | 5 +- tests/Languages/hu/ClearSpeak/functions.rs | 16 +- tests/Languages/hu/SimpleSpeak/functions.rs | 12 +- tests/Languages/hu/SimpleSpeak/menclose.rs | 266 +++++ tests/Languages/hu/SimpleSpeak/mroot.rs | 178 ++++ tests/Languages/hu/definitions.rs | 1026 +++++++++++++++++++ tests/Languages/hu/shared.rs | 2 +- 12 files changed, 1552 insertions(+), 86 deletions(-) create mode 100644 tests/Languages/hu/SimpleSpeak/menclose.rs create mode 100644 tests/Languages/hu/SimpleSpeak/mroot.rs create mode 100644 tests/Languages/hu/definitions.rs diff --git a/Rules/Languages/hu/ClearSpeak_Rules.yaml b/Rules/Languages/hu/ClearSpeak_Rules.yaml index 02040fc5d..73d8eaf5e 100644 --- a/Rules/Languages/hu/ClearSpeak_Rules.yaml +++ b/Rules/Languages/hu/ClearSpeak_Rules.yaml @@ -623,7 +623,7 @@ - test: if: "starts-with(name(.), 'open')" then: [T: "nem"] # phrase(the interval from a to b 'not' including b) - - T: "tartalmazza a" # phrase(the interval from a to b not 'including' b) + - T: "tartalmazza a(z)" # phrase(the interval from a to b not 'including' b) - x: "*[1]" - T: "elemet" # logic to deal with [not] arg #1 @@ -647,7 +647,7 @@ if: "name(.) = 'open-interval' or name(.) = 'closed-open-interval'" then: [T: "nem"] # phrase(the interval 'not' including a) - T: "tartalmazza" # phrase(the interval not 'including' a) - - T: "a" + - T: "a(z)" - x: "*[2]" - T: "elemet" # onto the [not] [including]... part diff --git a/Rules/Languages/hu/SimpleSpeak_Rules.yaml b/Rules/Languages/hu/SimpleSpeak_Rules.yaml index b5f263c3a..5037a4122 100644 --- a/Rules/Languages/hu/SimpleSpeak_Rules.yaml +++ b/Rules/Languages/hu/SimpleSpeak_Rules.yaml @@ -574,7 +574,7 @@ - test: if: "starts-with(name(.), 'open')" then: [T: "nem"] # phrase(the interval from a to b 'not' including b) - - T: "tartalmazza a" # phrase(the interval from a to b not 'including' b) + - T: "tartalmazza a(z)" # phrase(the interval from a to b not 'including' b) - x: "*[1]" - T: "elemet" # logic to deal with [not] arg #1 @@ -598,7 +598,7 @@ if: "name(.) = 'open-interval' or name(.) = 'closed-open-interval'" then: [T: "nem"] # phrase(the interval 'not' including a) - T: "tartalmazza" # phrase(the interval not 'including' a) - - T: "a" + - T: "a(z)" - x: "*[2]" - T: "elemet" # onto the [not] [including]... part diff --git a/Rules/Languages/hu/definitions.yaml b/Rules/Languages/hu/definitions.yaml index c0e75bee2..bdc649424 100644 --- a/Rules/Languages/hu/definitions.yaml +++ b/Rules/Languages/hu/definitions.yaml @@ -23,28 +23,28 @@ #"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", + "inverse":"function=inverz || postfix=inverz", "domain": "function= ; domĂ©n", "codomain": "function= ; kodomĂĄn", - "image":"function=image", + "image":"function=kĂ©p", #"fraction":"function=fraction; over; end fraction", # NOTE: Fails - "mixed-fraction":"infix=and", # NOTE: in website says function, but follow infix speech pattern. - "greatest-common-divisor": "function=gcd: a GCD: a legnagyobb közös osztĂł", - "quotient":"function=szĂĄm rĂ©sz; osztva ezzel:", # NOTE: Logic somewhere here failing, becomes "divided by of x comma, y" instead of "integer part of x divided by y" - "evaluated-at":"infix=Ă©rtĂ©keltĂ©k", - "remainder":"function=a maradĂ©k; osztva ezzel:", + "mixed-fraction":"infix=Ă©s", # NOTE: in website says function, but follow infix speech pattern. + "greatest-common-divisor": "function=a legnagyobb közös osztĂł", + "quotient":"function=egĂ©sz rĂ©sz osztva", # NOTE: Logic somewhere here failing, becomes "divided by of x comma, y" instead of "integer part of x divided by y" + "evaluated-at":"infix=Ă©rtĂ©kelve || postfix=Ă©rtĂ©kkĂ©nt", + "remainder":"function=a maradĂ©k, osztva", "max":"function=max", "min":"function=min", "power":"infix=a hatvĂĄnyra", "root":"function=root", - "imaginary-part": "function=kĂ©pzeletbeli rĂ©sz: a kĂ©pzeletbeli rĂ©sz: a kĂ©pzeletbeli rĂ©sz", + "imaginary-part": "a kĂ©pzeletbeli rĂ©sz", "least-common-multiple": "function=lcm: a legkisebb közös többszörös: a legkisebb közös többszörös", "complex-conjugate":"function=Komplex konjugĂĄlt", "complex-arg":"function=argumentum", - "polar-coordinate":"function=polĂĄris koordinĂĄta; vesszƑ", - "spherical-coordinate":"function=gömb koordinĂĄta; vesszƑ; vesszƑ", - "cartesian-coordinate":"function=derĂ©kszögƱ koordinĂĄta; vesszƑ", - "coordinate":"function=koordinĂĄta; vesszƑ", + "polar-coordinate":"function=polĂĄris koordinĂĄta", + "spherical-coordinate":"function=gömb koordinĂĄta", + "cartesian-coordinate":"function=derĂ©kszögƱ koordinĂĄta", + "coordinate":"function=koordinĂĄta", "floor":"function=lĂ©pcsƑ", "ceiling":"function=mennyezet", "round":"function=kerekĂ­tett Ă©rtĂ©k", @@ -60,7 +60,7 @@ "dimension": "function=; dimenziĂł : dimenziĂł: a dimenziĂł; dimenziĂł vĂ©ge", "homomorphism": "function= ; homomorfizmus : homomorfizmus: a homomorfizmus; homomorfizmus vĂ©ge", "kernel": "function= ; kernel : kernel: a kernel; kernel vĂ©ge", - "dot-product": "infix=skalĂĄris szorzat: skalĂĄris szorzat: skalĂĄris szorzat: skalĂĄris szorzat", + "dot-product": "infix=skalĂĄris szorzat", #"divergence": "function= ; dihv: divergencia: divergencia; divergencia vĂ©ge", #"laplacian": "function=laplaciĂĄns", # speech engines don't do a good job with "laplacian" @@ -69,19 +69,20 @@ ### Calculus "definite-integral":"function=integrĂĄl felett || function=integrĂĄl innen:; ide:", # Property ??? "derivative":"function=a derivĂĄltja; mely erre vonatkozik:", # Property ??? - "tends-to":"infix=ĂĄltalĂĄban", + "tends-to":"infix=ehhez tart", "tends-to-from-above":"infix=ĂĄltalĂĄban alulrĂłl indul", - + "tends-to-from-below":"infix=alulrĂłl indul", ### Sets "set": "function= ; halmaz: a halmaz", + "set-difference":"function=kĂŒlönbsĂ©ghalmaz || infix=mĂ­nusz || postfix=kĂŒlönbsĂ©ghalmaza", # NOTE: not tested "complement":"function=komplemens", - "empty-set":"nofix=ĂŒres halmaz", + "empty-set":"function=ĂŒres halmaz", "cardinality":"function=szĂĄmossĂĄg", # NOTE: does not have a defined speech template in website "list":"function=lista", "tuple": "function= ; tuple: a tuple", ### Sequence and Series "sum":"function= ; összegzĂ©s : összeg ; ", #: sum over : sum from; to", - "product":"function=produktum || function=produktum vĂ©ge || function=produktum innen:; ide:", + "product":"function=szorzat || function=szorzat vĂ©ge || function=szorzat innen ide", ### Elementary classical functions "sine":"function=szinusz: szinusz", @@ -91,23 +92,23 @@ "cosecant":"function=koszekĂĄns: koszekĂĄns", "cotangent":"function=kotangens: kotangens", "arcsine":"function=arkusz szinusz", - #"arccosine":"function=arkusz koszinusz", + "arccosine":"function=arkusz koszinusz", "arctangent":"function=arkusz tangens", "arcsecant":"function=arkusz szekĂĄns", "arccosecant":"function=arkusz koszekĂĄns", "arccotangent":"function=arkusz kotangens", "hyperbolic-sine":"function=hiperbolikus szinusz", "hyperbolic-cosine":"function=hiperbolikus koszinusz", - "hyperbolic-tangent":"function=hiperbolikus tangenstanch", - "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", + "hyperbolic-tangent":"function=hiperbolikus tangens", + "hyperbolic-secant":"function=hiperbolikus szekĂĄns", + "hyperbolic-cosecant":"function=hiperbolikus koszekĂĄns", + "hyperbolic-cotangent":"function=hiperbolikus kotangens", + "arc-hyperbolic-sine":"function=arkusz hiperbolikus szinusz", + "arc-hyperbolic-cosine":"function=arkusz hiperbolikus koszinusz", + "arc-hyperbolic-tangent":"function=arkusz hiperbolikus tangens", + "arc-hyperbolic-secant":"function=arkusz hiperbolikus szekĂĄns", + "arc-hyperbolic-cosecant":"function=arkusz hiperbolikus koszekĂĄns", + "arc-hyperbolic-cotangent":"function=arkusz hiperbolikus kotangens", "exponential":"function=exponenciĂĄlis", "natural-logarithm": "function=l n: termĂ©szetes alapĂș logaritmus: termĂ©szetes alapĂș logaritmus", "logarithm":"function=logaritmus", ##Check arity 2 @@ -138,7 +139,7 @@ ### Constants and Sets "set-of-integers":"nofix=â„€: az összes egĂ©sz szĂĄm halmaza", - "set-of-reals":"nofix=ℝ: az összes valĂłs szĂĄm halmaza", + "set-of-reals":"nofix=valĂłs szĂĄmok halmaza: az összes valĂłs szĂĄm halmaza", "set-of-rationals":"nofix=ℚ: az összes racionĂĄlis szĂĄm halmaza", "set-of-natural-numbers":"nofix=ℕ: az összes termĂ©szetes szĂĄm halmaza", "set-of-complex-numbers":"nofix=ℂ: az összes komplex szĂĄm halmaza", @@ -167,13 +168,13 @@ "highlight":"postfix=kiemelt", "least-common-denominator":"function=legkisebb közös nevezƑ", "rate":"infix=per", - "constraint":"infix= ; korlĂĄtozĂĄssal; ", + "constraint":"infix= ; feltĂ©tellel; ", "binomial-coefficient":"infix=vĂĄlaszt", "pochhammer":"function=permutĂĄciĂł", "permutation-cycle":"function=permutĂĄciĂłs ciklus", - "embellished-name":"infix=jegyzetekkel", - + "embellished-name":"infix=megjegyzĂ©ssel", + "annotation":"infix= ; ami ;", # NOTE: Follows the same order as indexed-by, in site listed as function. Should it be infix? ### Other ## Default fixity function "curl": "function=rotĂĄciĂł", @@ -185,7 +186,7 @@ "angle": "prefix=szög", "angle-measure": "prefix=szögmĂ©rĂ©s", "change": "prefix=vĂĄltozĂĄs", - "for-all": "prefix=mindenkinek", + "for-all": "prefix=minden", "measured-angle": "prefix=mĂ©rt szög", "not": "prefix=nem", "number-of": "prefix=szĂĄma", @@ -198,7 +199,7 @@ ## Default fixity infix "and": "infix=Ă©s", - "applied-to": "infix=alkalmazva erre", + "applied-to": "infix=alkalmazva", "approximately": "infix=hozzĂĄvetƑlegesen", "congruent": "infix=egybeesik", "cartesian-product": "infix=derĂ©kszögƱ szorzat", @@ -210,7 +211,7 @@ "does-not-belong-to": "infix=nem tartozik hozzĂĄ", "does-not-divide": "infix=nem osztja", "downwards-diagonal-ellipsis": "infix=lefelĂ© mutatĂł ĂĄtlĂłs ellipszis", - "direct-product": "infix=direkt produktum", + "direct-product": "infix=direkt szorzat", "element-of": "infix=eleme", "ellipsis": "infix=ellipszis", "equals": "infix=egyenlƑ", @@ -222,7 +223,7 @@ "identically-equals": "infix=teljesen egyenlƑ", "if-and-only-if": "infix=akkor Ă©s csak akkor, ha", "implies": "infix=utal", - "inner-product": "infix=belsƑ produktum", + "inner-product": "infix=belsƑ szorzat", "intersection": "infix=keresztezi", "less-than": "infix=kisebb, mint", "less-than-or-equal-to": "infix=kisebb vagy egyenlƑ, mint", @@ -231,13 +232,13 @@ "member-of": "infix=tagja", "minus-or-plus": "infix=mĂ­nusz vagy plusz", "not-subset": "infix=nem rĂ©szhalmaza", - "not-superset": "infix=nem szuperhalmaz", + "not-superset": "infix=nem szuperhalmaza", "not-equal-to": "infix=nem egyenlƑ", "not-member-of": "infix=nem tagja", "not-parallel-to": "infix=nem pĂĄrhuzamos", - "obtained-from": "infix=szĂĄrmazĂł", + "obtained-from": "infix=innen szĂĄrmazik", "or": "infix=vagy", - "outer-product": "infix=kĂŒlsƑ produktum", + "outer-product": "infix=kĂŒlsƑ szorzata", "parallel-to": "infix=pĂĄrhuzamos", "perpendicular": "infix=merƑleges", "plus": "infix=plusz || prefix=pozitĂ­v", # Prefix not tested @@ -246,16 +247,16 @@ "precedes": "infix=megelƑzi", "proportional": "infix=arĂĄnyos", "range-separator": "infix=keresztĂŒl", - "ratio": "infix=hĂĄnyados", + "ratio": "infix=arĂĄny", "similar": "infix=hasonlĂł", "subset": "infix=rĂ©szhalmaza", "subset-or-equal": "infix=rĂ©szhalmaza vagy egyenlƑ", - "succeeds": "infix=sikerĂŒl", + "succeeds": "infix=követi", "such-that": "infix=Ășgy, hogy", "superset": "infix=szuperhalmaza", - "superset-or-equal": "infix=szuperhalmaz vagy egyenlƑ", + "superset-or-equal": "infix=szuperhalmaza vagy egyenlƑ", "tilde": "infix=tilde", - "times": "infix=szorzata", + "times": "infix=szorozva", "union": "infix=uniĂł", "upwards-diagonal-ellipsis": "infix=felfelĂ© ĂĄtlĂłs ellipszis", "vertical-ellipsis": "infix=fĂŒggƑleges ellipszis", @@ -270,9 +271,9 @@ "distance":"nofix=tĂĄvolsĂĄg; tĂĄvolsĂĄg: tĂĄvolsĂĄg", "probability":"nofix=P: valĂłszĂ­nƱsĂ©g", "radius":"nofix=r: sugĂĄr", - "volume":"nofix=V: hangerƑ || function=", + "volume":"nofix=hangerƑ: hangerƑ || function=hangerƑ", "exponential-e":"nofix=e", - "imaginary-i":"nofix=i", + "imaginary-i":"nofix=kĂ©pzeletbeli Ă©n", "differential-d":"nofix=d", "golden-ratio":"nofix=aranymetszĂ©s", @@ -290,11 +291,11 @@ # These are the parts of a formula that can be navigated to "large-op": "base; lower limit; upper limit", "mfrac": "numerator; denominator", - "fraction": "numerator; denominator", - "msqrt": "root", - "square-root": "root", + "fraction": "szĂĄmlĂĄlĂł; nevezƑ", + "msqrt": "gyök", + "square-root": "gyök", "mroot": "root; root index", - "root": "root; root index", + "root": "gyök; gyök index", "msub": "base; subscript", "sub": "base; subscript", "logarithm-with-base": "base", diff --git a/Rules/Languages/hu/unicode-full.yaml b/Rules/Languages/hu/unicode-full.yaml index 2926422e0..4ab669c7a 100644 --- a/Rules/Languages/hu/unicode-full.yaml +++ b/Rules/Languages/hu/unicode-full.yaml @@ -273,7 +273,7 @@ - "‱": [T: "per tĂ­zezer"] # 0x2031 (en: 'per ten thousand', DeepL translation) - "â€Č": [T: "prĂ­m"] # 0x2032 (en: 'prime', DeepL translation) - "″": [T: "dupla prĂ­m"] # 0x2033 (en: 'double prime', DeepL translation) - - "‮": [T: "hĂĄrmas ikerprĂ­m"] # 0x2034 (en: 'triple prime', DeepL translation) + - "‮": [T: "hĂĄrmas prĂ­m"] # 0x2034 (en: 'triple prime', DeepL translation) - "—": [T: "fordĂ­tott prĂ­m"] # 0x2035 (en: 'reversed prime', DeepL translation) - "‶": [T: "fordĂ­tott dupla prĂ­m"] # 0x2036 (en: 'reversed double prime', DeepL translation) - "‷": [T: "fordĂ­tott hĂĄrmas prĂ­m"] # 0x2037 (en: 'reversed triple prime', DeepL translation) @@ -951,11 +951,6 @@ - "⊱": [T: "bizonyĂ­tja"] # 0x22a2 (en: 'proves', DeepL translation) - "⊣": [T: "nem enged"] # 0x22a3 (en: 'does not yield', DeepL translation) - "⊀": [T: "felsƑ"] # 0x22a4 (en: 'top', DeepL translation) - - "⊄": # 0x22a5 - - test: - if: "$Verbosity!='Terse'" - then: [T: "a(z)"] # (en: 'is', DeepL translation) - - T: "alul" # (en: 'bottom', DeepL translation) - "⊩": [T: "redukĂĄlĂłdik"] # 0x22a6 (en: 'reduces to', DeepL translation) - "⊧": [T: "modellezi"] # 0x22a7 (en: 'models', DeepL translation) - "⊹": # 0x22a8 @@ -1543,11 +1538,15 @@ - "➟": [T: "nyitott körvonalĂș jobbra mutatĂł nyĂ­l"] # 0x27be (en: 'open-outlined right arrow', DeepL translation) - "⟀": [T: "hĂĄromdimenziĂłs szög"] # 0x27c0 (en: 'three dimensional angle', DeepL translation) - "⟁": [T: "fehĂ©r hĂĄromszög, benne egy kis fehĂ©r hĂĄromszög"] # 0x27c1 (en: 'white triangle containing small white triangle', DeepL translation) - - "⟂": # 0x27c2 - - test: - if: "$Verbosity!='Terse'" - then: [T: "a(z)"] # (en: 'is', DeepL translation) - - T: "merƑleges" # (en: 'perpendicular to', DeepL translation) + - "⟂⊄": # 0x27c2, 22A5 (22A5 wrongly used for perpendicular by most editors) + - test: + - if: "$SpeechStyle = 'LiteralSpeak' and text()='⊄'" # 22A5 (up tack/bottom) + then: [T: "felfelĂ© mutatĂł merƑleges"] + - else: + - test: + if: "$Verbosity!='Terse'" + then: [T: "a(z)"] + - T: "merƑleges" - "⟃": # 0x27c3 - test: if: "$Verbosity!='Terse'" diff --git a/Rules/Languages/hu/unicode.yaml b/Rules/Languages/hu/unicode.yaml index 41f8263f2..16561b733 100644 --- a/Rules/Languages/hu/unicode.yaml +++ b/Rules/Languages/hu/unicode.yaml @@ -297,7 +297,6 @@ - "⁹": [T: ""] # 0x2062 - "⁣": [T: "lĂĄthatatlan elvĂĄlasztĂł"] # 0x2063 - "⁀": [T: "Ă©s"] # 0x2064 (en: 'and', DeepL translation) - - "‮": [T: "hĂĄrmas prĂ­m"] # 0x2034 (en: 'triple prime', DeepL translation) - "ℂℕℚℝ℀": # here we rely on this running through the table again to speak "cap xxx" - T: "duplĂĄn leĂŒtött" # (en: 'double-struck', DeepL translation) @@ -418,7 +417,6 @@ then: [T: "benne van ebben:"] # (en: 'is in', DeepL translation) - else: [T: "ebbe a halmazba tartozik:"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to', DeepL translation) - "∐": [T: "diszjunkt uniĂł"] # 0x2210 (en: 'co-product', DeepL translation) - - "∗": [T: "csillag operĂĄtortimes"] # 0x2217 (DeepL translation) - "√": # 0x221a - test: if: "$Verbosity!='Terse'" @@ -448,7 +446,6 @@ if: "$Verbosity!='Terse'" then: [T: "van"] # (en: 'is', DeepL translation) - T: "hogy" # (DeepL translation) - - "∷": [T: "arĂĄny"] # 0x2237 (DeepL translation) - "∟": # 0x223e - test: if: "$Verbosity!='Terse'" @@ -474,8 +471,6 @@ if: "$Verbosity!='Terse'" then: [T: ""] # (en: 'is', DeepL translation) - T: "nagyobb vagy egyenlƑ" # (en: 'greater than or equal to', DeepL translation) - - "≩": [T: "kisebb, mint egyenlƑ"] # 0x2266 (en: 'less than over equal to', DeepL translation) - - "≧": [T: "nagyobb, mint az egyenlƑ"] # 0x2267 (en: 'greater than over equal to', DeepL translation) - "⊂": # 0x2282 - test: if: "$Verbosity!='Terse'" diff --git a/tests/Languages/hu.rs b/tests/Languages/hu.rs index 45bce3f9c..ac24dd22e 100644 --- a/tests/Languages/hu.rs +++ b/tests/Languages/hu.rs @@ -15,9 +15,9 @@ mod ClearSpeak { mod SimpleSpeak { mod functions; mod large_ops; - // mod menclose; + mod menclose; mod mfrac; - // mod mroot; + mod mroot; mod msup; mod sets; mod geometry; @@ -29,6 +29,7 @@ mod shared; mod units; mod chemistry; mod alphabets; +mod definitions; mod intent; mod mtable; diff --git a/tests/Languages/hu/ClearSpeak/functions.rs b/tests/Languages/hu/ClearSpeak/functions.rs index e9449b213..3dd6e94e7 100644 --- a/tests/Languages/hu/ClearSpeak/functions.rs +++ b/tests/Languages/hu/ClearSpeak/functions.rs @@ -516,7 +516,7 @@ fn explicit_times_none_superscript() -> Result<()> { ) "; test_ClearSpeak("hu", "ClearSpeak_Paren", "Interval",expr, - "c tƑl d ig terjedƑ intervallum, nem tartalmazza a c elemet vagy d elemet")?; + "c tƑl d ig terjedƑ intervallum, nem tartalmazza a(z) c elemet vagy d elemet")?; return Ok(()); } @@ -530,7 +530,7 @@ fn explicit_times_none_superscript() -> Result<()> { ) "; test_ClearSpeak("hu", "ClearSpeak_Paren", "Interval ",expr, - "c tƑl d ig terjedƑ intervallum, tartalmazza a c elemet de nem tartalmazza a d elemet")?; + "c tƑl d ig terjedƑ intervallum, tartalmazza a(z) c elemet de nem tartalmazza a(z) d elemet")?; return Ok(()); } @@ -545,7 +545,7 @@ fn parens_interval_open_closed() -> Result<()> { ] "; test_ClearSpeak("hu", "ClearSpeak_Paren", "Interval ",expr, - "c tƑl d ig terjedƑ intervallum, nem tartalmazza a c elemet de tartalmazza a d elemet")?; + "c tƑl d ig terjedƑ intervallum, nem tartalmazza a(z) c elemet de tartalmazza a(z) d elemet")?; return Ok(()); } @@ -560,7 +560,7 @@ fn parens_interval_closed_closed() -> Result<()> { ] "; test_ClearSpeak("hu", "ClearSpeak_Paren", "Interval ",expr, -"c tƑl d ig terjedƑ intervallum, tartalmazza a c elemet Ă©s d elemet")?; +"c tƑl d ig terjedƑ intervallum, tartalmazza a(z) c elemet Ă©s d elemet")?; return Ok(()); } @@ -573,7 +573,7 @@ return Ok(()); ) "; test_ClearSpeak("hu", "ClearSpeak_Paren", "Interval ",expr, - "negatĂ­v vĂ©gtelen tƑl d ig terjedƑ intervallum, nem tartalmazza a d elemet")?; + "negatĂ­v vĂ©gtelen tƑl d ig terjedƑ intervallum, nem tartalmazza a(z) d elemet")?; return Ok(()); } @@ -586,7 +586,7 @@ return Ok(()); ] "; test_ClearSpeak("hu", "ClearSpeak_Paren", "Interval ",expr, - "negatĂ­v vĂ©gtelen tƑl d ig terjedƑ intervallum, tartalmazza a d elemet")?; + "negatĂ­v vĂ©gtelen tƑl d ig terjedƑ intervallum, tartalmazza a(z) d elemet")?; return Ok(()); } @@ -601,7 +601,7 @@ fn parens_interval_open_open_infinity() -> Result<()> { ) "; test_ClearSpeak("hu", "ClearSpeak_Paren", "Interval ",expr, - "c tƑl vĂ©gtelen ig terjedƑ intervallum, nem tartalmazza a c elemet")?; + "c tƑl vĂ©gtelen ig terjedƑ intervallum, nem tartalmazza a(z) c elemet")?; return Ok(()); } @@ -616,7 +616,7 @@ fn parens_interval_closed_open_infinity() -> Result<()> { ) "; test_ClearSpeak("hu", "ClearSpeak_Paren", "Interval ",expr, -"c tƑl vĂ©gtelen ig terjedƑ intervallum, tartalmazza a c elemet")?; +"c tƑl vĂ©gtelen ig terjedƑ intervallum, tartalmazza a(z) c elemet")?; return Ok(()); } diff --git a/tests/Languages/hu/SimpleSpeak/functions.rs b/tests/Languages/hu/SimpleSpeak/functions.rs index aa4c2a43a..8ecf02cb8 100644 --- a/tests/Languages/hu/SimpleSpeak/functions.rs +++ b/tests/Languages/hu/SimpleSpeak/functions.rs @@ -355,7 +355,7 @@ fn no_times_sqrt() -> Result<()> { (c,d) ) "; - test("hu", "SimpleSpeak",expr, "c tƑl d ig terjedƑ intervallum, nem tartalmazza a c elemet vagy d elemet")?; + test("hu", "SimpleSpeak",expr, "c tƑl d ig terjedƑ intervallum, nem tartalmazza a(z) c elemet vagy d elemet")?; return Ok(()); } @@ -368,7 +368,7 @@ fn no_times_sqrt() -> Result<()> { [(]c,d) ) "; - test("hu", "SimpleSpeak",expr, "c tƑl d ig terjedƑ intervallum, tartalmazza a c elemet de nem tartalmazza a d elemet")?; + test("hu", "SimpleSpeak",expr, "c tƑl d ig terjedƑ intervallum, tartalmazza a(z) c elemet de nem tartalmazza a(z) d elemet")?; return Ok(()); } @@ -382,7 +382,7 @@ fn parens_interval_open_closed() -> Result<()> { (c,d] ] "; - test("hu", "SimpleSpeak",expr,"c tƑl d ig terjedƑ intervallum, nem tartalmazza a c elemet de tartalmazza a d elemet")?; + test("hu", "SimpleSpeak",expr,"c tƑl d ig terjedƑ intervallum, nem tartalmazza a(z) c elemet de tartalmazza a(z) d elemet")?; return Ok(()); } @@ -396,7 +396,7 @@ fn parens_interval_closed_closed() -> Result<()> { [(]c,d] ] "; - test("hu", "SimpleSpeak",expr, "c tƑl d ig terjedƑ intervallum, tartalmazza a c elemet Ă©s d elemet")?; + test("hu", "SimpleSpeak",expr, "c tƑl d ig terjedƑ intervallum, tartalmazza a(z) c elemet Ă©s d elemet")?; return Ok(()); } @@ -409,7 +409,7 @@ fn parens_interval_closed_closed() -> Result<()> { ) "; test("hu", "SimpleSpeak",expr, - "negatĂ­v vĂ©gtelen tƑl d ig terjedƑ intervallum, nem tartalmazza a d elemet")?; + "negatĂ­v vĂ©gtelen tƑl d ig terjedƑ intervallum, nem tartalmazza a(z) d elemet")?; return Ok(()); } @@ -422,7 +422,7 @@ fn parens_interval_closed_closed() -> Result<()> { ] "; test("hu", "SimpleSpeak",expr, - "negatĂ­v vĂ©gtelen tƑl d ig terjedƑ intervallum, tartalmazza a d elemet")?; + "negatĂ­v vĂ©gtelen tƑl d ig terjedƑ intervallum, tartalmazza a(z) d elemet")?; return Ok(()); } diff --git a/tests/Languages/hu/SimpleSpeak/menclose.rs b/tests/Languages/hu/SimpleSpeak/menclose.rs new file mode 100644 index 000000000..33c03f699 --- /dev/null +++ b/tests/Languages/hu/SimpleSpeak/menclose.rs @@ -0,0 +1,266 @@ +use crate::common::*; +use anyhow::Result; + +// AI generated +#[test] +fn menclose_actuarial() -> Result<()> { + let expr = " + 3+2i + "; + test("hu", "ClearSpeak", expr, "aktuĂĄrius szimbĂłlum, kezdet: 3 plusz 2 i vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_box() -> Result<()> { + let expr = " + 3+2i + "; + test("hu", "ClearSpeak", expr, "doboz, kör, kezdet: 3 plusz 2 i vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_left() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "vonal balra, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_right() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "vonal jobbra, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_top_bottom() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "vonal felsƑ, alsĂł, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_updiagonalstrike() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "ĂĄtlĂłsan felfelĂ©, kihĂșzva, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_downdiagonalstrike() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "ĂĄtlĂłsan lefelĂ©, kihĂșzva, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_cross_out() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "x, kihĂșzva, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_vertical_horizontal_strike() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "fĂŒggƑleges, vĂ­zszintes, kihĂșzva, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_leftarrow() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "balra nyĂ­l, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_right_up_down_arrow() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "felfelĂ© nyĂ­l, lefelĂ© nyĂ­l, jobbra nyĂ­l, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_northeastarrow() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "Ă©szakkeleti nyĂ­l, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_other_single_arrows() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "dĂ©lkeleti nyĂ­l, dĂ©lnyugati nyĂ­l, Ă©szaknyugati nyĂ­l, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_northwestsoutheastarrow() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "kĂ©tvĂ©gƱ lefelĂ© mutatĂł ĂĄtlĂłs nyĂ­l, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_other_double_arrows() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "kĂ©tvĂ©gƱ fĂŒggƑleges nyĂ­l, kĂ©tvĂ©gƱ vĂ­zszintes nyĂ­l, dupla vĂ©gƱ ĂĄtlĂłs nyĂ­l, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_madrub() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "arab faktoriĂĄlis szimbĂłlum, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_phasorangle() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "fĂĄzisszög, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_circle_phasorangle() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "kör, fĂĄzisszög, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_longdiv() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "hosszĂș osztĂĄsjel, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_longdiv_default() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "hosszĂș osztĂĄsjel, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_longdiv_empty_string() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "hosszĂș osztĂĄsjel, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_longdiv_whitespace_string() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "hosszĂș osztĂĄsjel, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn menclose_radical() -> Result<()> { + let expr = " + 32 + "; + test("hu", "ClearSpeak", expr, "nĂ©gyzetgyök, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn simple_speak_menclose_top_bottom() -> Result<()> { + let expr = " + 32 + "; + test("hu", "SimpleSpeak", expr, "vonal felsƑ, alsĂł, kezdet: 3 ketted vĂ©gpont vĂ©ge")?; + return Ok(()); + +} diff --git a/tests/Languages/hu/SimpleSpeak/mroot.rs b/tests/Languages/hu/SimpleSpeak/mroot.rs new file mode 100644 index 000000000..225e191c0 --- /dev/null +++ b/tests/Languages/hu/SimpleSpeak/mroot.rs @@ -0,0 +1,178 @@ +use crate::common::*; +use anyhow::Result; + +// AI generated +#[test] +fn msqrt_simple() -> Result<()> { + let expr = " + x + "; + test("hu", "SimpleSpeak", expr, "a nĂ©gyzetgyöke ennek: x")?; + return Ok(()); + +} + +// AI generated +#[test] +fn msqrt_simple_end_root() -> Result<()> { + let expr = " + x + "; + test_ClearSpeak("hu", "ClearSpeak_Roots", "RootEnd", expr, "nĂ©gyzetgyök x, gyök vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn msqrt_simple_positive() -> Result<()> { + let expr = " + x + "; + test_ClearSpeak("hu", "ClearSpeak_Roots", "PosNegSqRoot", expr, "pozitĂ­v nĂ©gyzetgyök x")?; + return Ok(()); + +} + +// AI generated +#[test] +fn msqrt_simple_pos_end_root() -> Result<()> { + let expr = " + x + "; + test_ClearSpeak("hu", "ClearSpeak_Roots", "PosNegSqRootEnd", expr, "pozitĂ­v nĂ©gyzetgyök x, gyök vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn msqrt_simple_pos_end_with_neg_root() -> Result<()> { + let expr = " + - x + - x 3 + "; + test_ClearSpeak("hu", "ClearSpeak_Roots", "PosNegSqRootEnd", expr, + "negatĂ­v nĂ©gyzetgyök x, gyök vĂ©ge; mĂ­nusz, a pozitĂ­v köbgyök x, gyök vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn mroot_simple_pos_end_with_neg_root() -> Result<()> { + let expr = " + - x 3 + - x + + "; + test_ClearSpeak("hu", "ClearSpeak_Roots", "PosNegSqRoot", expr, + "a negatĂ­v köbgyök x; mĂ­nusz pozitĂ­v nĂ©gyzetgyök x")?; + return Ok(()); + +} + +// AI generated +#[test] +fn neg_without_root() -> Result<()> { + let expr = " + - x - y + "; + test("hu", "ClearSpeak", expr, "negatĂ­v x mĂ­nusz y")?; + return Ok(()); + +} + +// AI generated +#[test] +fn msqrt() -> Result<()> { + let expr = " + + x + y + + "; + test("hu", "ClearSpeak", expr, "nĂ©gyzetgyök x plusz y")?; + return Ok(()); + +} + +// AI generated +#[test] +fn mroot_as_square_root() -> Result<()> { + let expr = " + x 2 + "; + test("hu", "ClearSpeak", expr, "nĂ©gyzetgyök x")?; + return Ok(()); + +} + +// AI generated +#[test] +fn cube_root() -> Result<()> { + let expr = " + x 3 + "; + test("hu", "ClearSpeak", expr, "a köbgyök x")?; + return Ok(()); + +} + +// AI generated +#[test] +fn ordinal_root() -> Result<()> { + let expr = " + x 9 + "; + test("hu", "ClearSpeak", expr, "a kilencedik gyök x")?; + return Ok(()); + +} + +// AI generated +#[test] +fn simple_mi_root() -> Result<()> { + let expr = " + x n + "; + test("hu", "ClearSpeak", expr, "a n-edik gyök x")?; + return Ok(()); + +} + +// AI generated +#[test] +fn mroot_simple_pos_end_root() -> Result<()> { + let expr = " + x t + "; + test_ClearSpeak("hu", "ClearSpeak_Roots", "PosNegSqRootEnd", expr, "a pozitĂ­v t-edik gyök x, gyök vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn mroot_simple_end_root() -> Result<()> { + let expr = " + x + y + 21 + "; + test_ClearSpeak("hu", "ClearSpeak_Roots", "RootEnd", expr, "a huszonegyedik gyök x plusz y, gyök vĂ©ge")?; + return Ok(()); + +} + +// AI generated +#[test] +fn simple_fraction_power() -> Result<()> { + let expr = " + + x + 13 + + "; + test("hu", "ClearSpeak", expr, "a 1 harmad gyök x")?; + return Ok(()); + +} diff --git a/tests/Languages/hu/definitions.rs b/tests/Languages/hu/definitions.rs new file mode 100644 index 000000000..bd84fb155 --- /dev/null +++ b/tests/Languages/hu/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("hu", "ClearSpeak", expr, "a tuple x vesszƑ, y")?; + test("hu", "SimpleSpeak", expr, "a tuple x vesszƑ, y")?; + + return Ok(()); +} + +#[test] +fn my_set_basic() -> Result<()> { + let expr = r#" + + + x + y + + + "#; + + test("hu", "ClearSpeak", expr, "az ĂŒres halmaz")?; + + Ok(()) +} + +#[test] +fn fixed_test() -> Result<()> { + let expr = r#" + + az összes valĂłs szĂĄm halmaza + + + "#; + + test("hu", "ClearSpeak", expr, "az összes valĂłs szĂĄm halmaza")?; + Ok(()) +} + +#[test] +fn i_test() -> Result<()> { + let expr = r#" + + kĂ©pzeletbeli Ă©n + + + "#; + + test("hu", "ClearSpeak", expr, "kĂ©pzeletbeli Ă©n")?; + Ok(()) +} + + +#[test] +fn floor_basic() -> Result<()> { + let expr = r#" + + + x + + + "#; + + test("hu", "ClearSpeak", expr, "lĂ©pcsƑ x")?; + + Ok(()) +} + +#[test] +fn set_difference_basic() -> Result<()> { + let expr = r#" + + + A + ∖ + B + + + "#; + + test( "hu", "ClearSpeak", expr, "kĂŒlönbsĂ©ghalmaz nagy a vesszƑ, nagy b")?; + + Ok(()) +} + +#[test] +fn postfix_test() -> Result<()> { + let tests = [ + ( + "transpose", + r#" + + x + T + + "#, + "transzponĂĄlt x", + ), + ( + "highlight", + r#" + + x + + "#, + "x kiemelt", + ), + ]; + + // Loop through all test cases, name _, body, and expected result + for (_, body, expected) in tests { + let expr = format!( + r#" + + {} + + "#, + body + ); + + test("hu", "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 + + "#, + "hatĂĄrĂ©rtĂ©k x", + ), + ( + "unit-vector", + r#" + + x + ^ + + "#, + "egysĂ©gvektor x", + ), + ( + "line-segment", + r#" + + x + ÂŻ + + "#, + "line segment x", + ), + ]; + + for (_, body, expected) in tests { + let expr = format!( + r#" + + {} + + "#, + body + ); + + test("hu", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + + +#[test] +fn functions_and_inverses_tests() -> Result<()> { + let tests = vec![ + ("closed-interval", "x tƑl y ig terjedƑ intervallum, tartalmazza a(z) x elemet Ă©s y elemet"), + ("closed-open-interval", "x tƑl y ig terjedƑ intervallum, tartalmazza a(z) x elemet de nem tartalmazza a(z) y elemet"), + ("open-closed-interval", "x tƑl y ig terjedƑ intervallum, nem tartalmazza a(z) x elemet de tartalmazza a(z) y elemet"), + ("open-interval", "x tƑl y ig terjedƑ intervallum, nem tartalmazza a(z) x elemet vagy y elemet"), + + ("inverse", "inverz x"), + ("domain", "domĂ©n x"), + ("codomain", "kodomĂĄn x"), + ("image", "kĂ©p x"), + + //("fraction", "fraction x over y end fraction"), + ("mixed-fraction", "x Ă©s y"), + ("quotient", "egĂ©sz rĂ©sz osztva x vesszƑ, y"), + ("evaluated-at", "x Ă©rtĂ©kelve y"), + ("remainder", "a maradĂ©k, osztva x vesszƑ, y"), + + ("max", "max x vesszƑ, y vesszƑ, z"), + ("min", "min x vesszƑ, y vesszƑ, z"), + + ("power", "x a(z) y-edik hatvĂĄnyon"), + + //("root", "gyök x"), + + ("greatest-common-divisor", "a legnagyobb közös osztĂł x vesszƑ, y vesszƑ, z"), + ("least-common-multiple", "a legkisebb közös többszörös x vesszƑ, y vesszƑ, z"), + + ("absolute-value", "x abszolĂșt Ă©rtĂ©ke"), + + ("complex-conjugate", "Komplex konjugĂĄlt x"), + ("complex-arg", "argumentum x"), + ("real-part", "valĂłs rĂ©sz"), + ("imaginary-part", "kĂ©pzetes rĂ©sz"), + + ("polar-coordinate", "polĂĄris koordinĂĄta x vesszƑ, y"), + ("spherical-coordinate", "gömb koordinĂĄta x vesszƑ, y vesszƑ, z"), + ("cartesian-coordinate", "derĂ©kszögƱ koordinĂĄta x vesszƑ, y vesszƑ, z"), + ("coordinate", "pont, x vesszƑ y vesszƑ z"), + + ("floor", "lĂ©pcsƑ x"), + ("ceiling", "mennyezet x"), + ("round", "kerekĂ­tett Ă©rtĂ©k x"), + ("fractional-part", "tört rĂ©sz 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("hu", "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", "hatĂĄrĂ©rtĂ©k x"), + + // infix + ("tends-to", "x ehhez tart y"), + ("tends-to-from-above", "x ĂĄltalĂĄban alulrĂłl indul y"), + ("tends-to-from-below", "x alulrĂłl indul y"), + ]; + + for (intent, expected) in tests { + let expr = match intent { + "limit" => { + format!( + " + + x + + ", + intent + ) + } + + _ => { + // infix cases + format!( + " + + x + y + + ", + intent + ) + } + }; + + test("hu", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + + +#[test] +fn set_tests() -> Result<()> { + let tests = vec![ + ("set", "a halmaz x"), + //("set-difference", "x Ă©s y halmaz kĂŒlönbsĂ©ge"), + ("complement", "komplemens x"), + //("empty-set", "ĂŒres halmaz"), + ("cardinality", "szĂĄmossĂĄg x"), + ("list", "lista x"), + ("tuple", "a tuple x"), + ]; + + for (intent, expected) in tests { + let expr = format!( + " + + x + + ", + intent + ); + + test("hu", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + + +#[test] +fn sequence_and_series_intents() -> Result<()> { + let tests = [ + ( + "sum-1", + r#" + + ∑ + x + + "#, + "összeg x", + ), + ( + "sum-2", + r#" + + ∑ + i + x + + "#, + "összeg i vesszƑ, x", + ), + ( + "sum-3", + r#" + + ∑ + i + n + x + + "#, + "összeg i vesszƑ, n vesszƑ, x", + ), + ( + "product-1", + r#" + + ∏ + x + + "#, + "szorzat x", + ), + ( + "product-2", + r#" + + ∏ + i + x + + "#, + "szorzat i vesszƑ, x", + ), + ( + "product-3", + r#" + + ∏ + i + n + x + + "#, + "szorzat i vesszƑ, n vesszƑ, x", + ), + ]; + + for (_, body, expected) in tests { + let expr = format!( + r#" + + {} + + "#, + body + ); + + test("hu", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn elementary_classical_tests() -> Result<()> { + let tests = vec![ + // Trig + ("sine", "szinusz x"), + ("cosine", "koszinusz x"), + ("tangent", "tangens x"), + ("secant", "szekĂĄns x"), + ("cosecant", "koszekĂĄns x"), + ("cotangent", "kotangens x"), + + // Inverse trig + ("arcsine", "arkusz szinusz x"), + ("arccosine", "arkusz koszinusz x"), + ("arctangent", "arkusz tangens x"), + ("arcsecant", "arkusz szekĂĄns x"), + ("arccosecant", "arkusz koszekĂĄns x"), + ("arccotangent", "arkusz kotangens x"), + + // Hyperbolic trig + ("hyperbolic-sine", "hiperbolikus szinusz x"), + ("hyperbolic-cosine", "hiperbolikus koszinusz x"), + ("hyperbolic-tangent", "hiperbolikus tangens x"), + ("hyperbolic-secant", "hiperbolikus szekĂĄns x"), + ("hyperbolic-cosecant", "hiperbolikus koszekĂĄns x"), + ("hyperbolic-cotangent", "hiperbolikus kotangens x"), + + // Inverse hyperbolic trig + ("arc-hyperbolic-sine", "arkusz hiperbolikus szinusz x"), + ("arc-hyperbolic-cosine", "arkusz hiperbolikus koszinusz x"), + ("arc-hyperbolic-tangent", "arkusz hiperbolikus tangens x"), + ("arc-hyperbolic-secant", "arkusz hiperbolikus szekĂĄns x"), + ("arc-hyperbolic-cosecant", "arkusz hiperbolikus koszekĂĄns x"), + ("arc-hyperbolic-cotangent", "arkusz hiperbolikus kotangens x"), + ]; + + for (intent, expected) in tests { + let expr = format!( + " + + x + + ", + intent + ); + + test("hu", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn statistics_and_probability_tests() -> Result<()> { + let tests = vec![ + ("mean", "jelentĂ©se x"), + ("standard-deviation", "szĂłrĂĄs x"), + ("variance", "variencia x"), + ("median", "mediĂĄn x"), + ("mode", "mĂłd 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("hu", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn linear_algebra_tests() -> Result<()> { + let tests = vec![ + ("vector", "vektor x"), + // ("matrix", "matrix of x"), + ("determinant", "determinĂĄns a x"), + ("adjugate", "adjugĂĄlt x"), + ("magnitude", "nagysĂĄgrend x"), + ("norm", "normalizĂĄlĂĄs x"), + ("span", "fesztĂĄvolsĂĄg x"), + + // transpose supports both postfix and function; we test function explicitly + ("transpose", "transzponĂĄlt x"), + + // dimensional product is infix + ("dimensional-product", "x a(z) y"), + + // unit-vector is prefix + ("unit-vector", "egysĂ©gvektor x") + ]; + + for (intent, expected) in tests { + let expr: String = match intent { + "dimensional-product" => { + " + + x + y + + " + .to_string() + } + _ => format!( + " + + x + + " + ), + }; + + test("hu", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn nofix_set_tests() -> Result<()> { + let tests = vec![ + ("set-of-integers", "â„€", "az összes egĂ©sz szĂĄm halmaza"), + ("set-of-reals", "valĂłs szĂĄmok halmaza", "az összes valĂłs szĂĄm halmaza"), + ("set-of-rationals", "ℚ", "az összes racionĂĄlis szĂĄm halmaza"), + ("set-of-natural-numbers", "ℕ", "az összes termĂ©szetes szĂĄm halmaza"), + ("set-of-complex-numbers", "ℂ", "az összes komplex szĂĄm halmaza"), + ("set-of-primes", "ℙ", "az összes prĂ­mszĂĄm halmaza"), + ]; + + for (intent, symbol, expected) in tests { + let expr = format!( + " + {} + ", + intent, + symbol + ); + + test("hu", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn geometry_prefix_multi_value_tests() -> Result<()> { + let tests = vec![ + ("line-segment", "vonalszakasz x y"), + ("directed-line-segment", "irĂĄnyĂ­tott vonalszakasz x y"), + ("line", "vonal x y"), + ("ray", "sugĂĄr x y"), + ("arc", "Ă­v x y"), + ("point", "pont x y z"), + ]; + + for (intent, expected) in tests { + let expr = match intent{ + "point" => { + format!( + " + + x + y + z + + " + ) + } + + _ => { + format!( + " + + x + y + + " + ) + } + }; + + test("hu", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn geometry_prefix_tests() -> Result<()> { + let tests = vec![ + ("length", "hossz x"), + ("area", "terĂŒlet x"), + ("volume", "hangerƑ x"), + ]; + + for (intent, expected) in tests { + let expr = format!( + " + + x + + " + ); + + test("hu", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn separator_tests() -> Result<()> { + let expr = format!( + " + + x + y + + " + ); + + test("hu", "ClearSpeak", &expr, "x y")?; + Ok(()) +} + +#[test] +fn general_concepts_tests() -> Result<()> { + let tests = vec![ + // Unary structural + ("fenced-group", "bekerĂ­tett csoport x"), + ("highlight", "x kiemelt"), + ("least-common-denominator", "legkisebb közös nevezƑ x vesszƑ, y vesszƑ, z"), // add x, y , z ... + ("pochhammer", "permutĂĄciĂł x"), + ("permutation-cycle", "permutĂĄciĂłs ciklus x"), + + // Binary structural / infix-style + // ("ordered-pair", "the pair of x and y"), + ("rate", "x per y"), + + ("binomial-coefficient", "x vĂĄlaszt y"), + ("embellished-name", "x megjegyzĂ©ssel y"), + ("indexed-by", "x alsĂł index y"), + // ("translation", "translation by x comma, y"), // Changes translation to comma + ("constraint", "x feltĂ©tellel 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("hu", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn grouping_tests() -> Result<()> { + let tests = vec![ +("annotation", "x ami 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("hu", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn function_default_fixity_tests() -> Result<()> { + let tests = vec![ + ("curl", "rotĂĄciĂł x"), + ("divergence", "eltĂ©rĂ©s x"), + ("gradient", "gradiens x"), + ("laplacian", "laplaciĂĄnus x"), + ]; + + for (intent, expected) in tests { + let expr = format!( + " + + x + + ", + intent + ); + + test("hu", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn prefix_default_fixity_tests() -> Result<()> { + let tests = vec![ + ("angle", "szög x"), + ("angle-measure", "szögmĂ©rĂ©s x"), + ("change", "vĂĄltozĂĄs x"), + ("for-all", "minden x"), + ("measured-angle", "mĂ©rt szög x"), + ("not", "nem x"), + ("number-of", "szĂĄma x"), + ("partial-derivative", "parciĂĄlis derivĂĄlt x"), + ("right-angle", "derĂ©kszög x"), + ("square-root-of", "nĂ©gyzetgyöke x"), + ("there-does-not-exist", "nem lĂ©tezik x"), + ("there-exists", "lĂ©tezik x"), + ]; + + for (intent, expected) in tests { + let expr = format!( + " + + x + + ", + intent + ); + + test("hu", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn infix_default_fixity_tests() -> Result<()> { + let tests = vec![ + ("and", "x Ă©s y"), + ("applied-to", "x alkalmazva y"), + ("approximately", "x hozzĂĄvetƑlegesen y"), + ("congruent", "x egybeesik y"), + ("cartesian-product", "x derĂ©kszögƱ szorzat y"), + ("composed-with", "x komponĂĄlva y"), + ("cross-product", "x kereszt szorzata y"), + ("defined-as", "x definiĂĄlva y"), + ("divided-by", "x osztva y"), + ("divides", "x osztja y"), + ("does-not-belong-to", "x nem tartozik hozzĂĄ y"), + ("does-not-divide", "x nem osztja y"), + ("dot-product", "x skalĂĄris szorzat y"), + ("downwards-diagonal-ellipsis", "x lefelĂ© mutatĂł ĂĄtlĂłs ellipszis y"), + ("direct-product", "x direkt szorzat y"), + ("element-of", "x eleme y"), + ("ellipsis", "x ellipszis y"), + ("equals", "x egyenlƑ y"), + ("equivalent-to", "x egyenĂ©rtĂ©kƱ ezzel y"), + ("evaluates-to", "x Ă©rtĂ©ke y"), + ("given", "x adott y"), + ("greater-than", "x nagyobb, mint y"), + ("greater-than-or-equal-to", "x nagyobb vagy egyenlƑ, mint y"), + ("identically-equals", "x teljesen egyenlƑ y"), + ("if-and-only-if", "x akkor Ă©s csak akkor, ha y"), + ("implies", "x utal y"), + ("inner-product", "x belsƑ szorzat y"), + ("intersection", "x keresztezi y"), + ("less-than", "x kisebb, mint y"), + ("less-than-or-equal-to", "x kisebb vagy egyenlƑ, mint y"), + ("list-separator", "x vesszƑ y"), + ("maps-to", "x megfelel ennek y"), + ("member-of", "x tagja y"), + ("minus", "x mĂ­nusz y"), + ("minus-or-plus", "x mĂ­nusz vagy plusz y"), + ("not-subset", "x nem rĂ©szhalmaza y"), + ("not-superset", "x nem szuperhalmaza y"), + ("not-equal-to", "x nem egyenlƑ y"), + ("not-member-of", "x nem tagja y"), + ("not-parallel-to", "x nem pĂĄrhuzamos y"), + ("obtained-from", "x innen szĂĄrmazik y"), + ("or", "x vagy y"), + ("outer-product", "x kĂŒlsƑ szorzata y"), + ("parallel-to", "x pĂĄrhuzamos y"), + ("perpendicular", "x merƑleges y"), + ("plus", "x plusz y"), + ("plus-or-minus", "x plusz vagy mĂ­nusz y"), + ("precedes", "x megelƑzi y"), + ("proportional", "x arĂĄnyos y"), + ("range-separator", "x keresztĂŒl y"), + ("ratio", "x arĂĄny y"), + ("similar", "x hasonlĂł y"), + ("subset", "x rĂ©szhalmaza y"), + ("subset-or-equal", "x rĂ©szhalmaza vagy egyenlƑ y"), + ("succeeds", "x követi y"), + ("such-that", "x Ășgy, hogy y"), + ("superset", "x szuperhalmaza y"), + ("superset-or-equal", "x szuperhalmaza vagy egyenlƑ y"), + ("tilde", "x tilde y"), + ("times", "x szorozva y"), + ("union", "x uniĂł y"), + ("upwards-diagonal-ellipsis", "x felfelĂ© ĂĄtlĂłs ellipszis y"), + ("vertical-ellipsis", "x fĂŒggƑleges ellipszis y"), + ("xor", "x kizĂĄrĂłlagos vagy y"), + ]; + + for (intent, expected) in tests { + let expr = format!( + " + + x + y + + ", + intent + ); + + test("hu", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn postfix_default_fixity_tests() -> Result<()> { + let tests = vec![ + ("factorial", "x faktoriĂĄlis"), + ("percent", "x szĂĄzalĂ©k"), + ]; + + for (intent, expected) in tests { + let expr = format!( + " + + x + + ", + intent + ); + + test("hu", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn nofix_default_fixity_tests() -> Result<()> { + let tests = vec![ + ("diameter", "ĂĄtmĂ©rƑ", "ĂĄtmĂ©rƑ"), + ("distance", "tĂĄvolsĂĄg", "tĂĄvolsĂĄg"), + ("probability", "valĂłszĂ­nƱsĂ©g", "valĂłszĂ­nƱsĂ©g"), + ("radius", "sugĂĄr", "sugĂĄr"), + ("volume", "hangerƑ", "hangerƑ"), + ("exponential-e", "e", "e"), + ("imaginary-i", "kĂ©pzeletbeli Ă©n", "kĂ©pzeletbeli Ă©n"), + ("differential-d", "d", "d"), + ("golden-ratio", "φ", "aranymetszĂ©s"), + ]; + + for (intent, symbol, expected) in tests { + let expr = format!( + " + {} + ", + intent, + symbol + ); + + test("hu", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} diff --git a/tests/Languages/hu/shared.rs b/tests/Languages/hu/shared.rs index a97805f8a..bd53bb4c3 100644 --- a/tests/Languages/hu/shared.rs +++ b/tests/Languages/hu/shared.rs @@ -381,7 +381,7 @@ fn bug_199_2pi() -> Result<()> { ) "; - test("hu", "SimpleSpeak",expr, "0 tƑl 2 pĂ­ ig terjedƑ intervallum, tartalmazza a 0 elemet de nem tartalmazza a 2 pĂ­ elemet")?; + test("hu", "SimpleSpeak",expr, "0 tƑl 2 pĂ­ ig terjedƑ intervallum, tartalmazza a(z) 0 elemet de nem tartalmazza a(z) 2 pĂ­ elemet")?; return Ok(()); } From 7fbaf1729eadac816de837af931e799f1dceb6c9 Mon Sep 17 00:00:00 2001 From: NSoiffer Date: Sat, 15 Aug 2026 01:17:17 -0700 Subject: [PATCH 029/162] Ru -- merge speech changes into main (#689) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Ru - Improve wording of Russian docs (#661) * update acknowledgment for Russian braille * update version number because added Russian braille * UEB has a rule for some pseudo-script chars. The match for that rule was overly broad, so I removed scripted letters and numbers. That rule made its way into other braille codes, so I removed them everywhere. All tests pass. * Added new UEB chars. Many of these are accented letters. I added 'A' (for accented letters) so that the pattern for them looks like: ``` - "Ñ": [t: "CA⠘⠻L⠝"] # 0x00D1 ``` Added a few tests. * Translate German absolute-value ending * Fix German unit plurals * Fix German pluralization for "ruthe" and add regression test * Correct German translations for "ruthe" to "rute" and update regression test * Expand German unit definitions and add regression test for pluralization * fix some symbols * fix german set grammar * typo in example * Russian Braille fixes This commit adds fixes to Russian Braille. Now the test with parentheses is passed. Also there are devision and multiplication signs have been modified according to the Russian braille specs. * Update Russian Braille rules and mappings Fix YAML replace syntax and extend Russian braille rules: add chemical-formula-operator-bond and prefix-geometry-ops rules, broaden function-name matching (include tg/ctg variants) and add separator markers. Update unicode mappings (degree sign, invisible characters, conditional âˆȘ mapping, parallel/arrow glyphs) and adjust several function/operator braille outputs. Add/expand tests to cover functions, geometry, matrices and chemical formulas to validate the changes. * Add Russian language to docs Add Russian (ru) to the list of supported speech languages and update Russian documentation and translation guidance. - docs/User_guide_for_MathCAT_en.md, docs/index.md: add Russian (ru) to supported languages lists. - docs/ru/User_guide_for_MathCAT_ru.md: include Russian in language options, reorder entries and apply minor wording fixes. - docs/ru/helpers.md: clarify wording, update examples and test instructions to reference ru instead of fr, and improve translation guidance and examples (including test and cargo commands). - docs/ru/index.md: reorder supported languages and polish phrasing. These edits enable and document Russian support and improve clarity for translators and developers working on the Russian localization. * Refactor Russian function braille mapping Replace hardcoded function-name branches in Russian_Rules.yaml with a DefinitionValue lookup that pulls from a new RussianFunctionBraille mapping. Add RussianFunctionBraille entries to definitions.yaml (private-use codepoints U+E100–U+E10E) and map those codepoints to braille strings in unicode.yaml. Add a test covering tan/cot rendering. This centralizes function braille representations and simplifies the rule logic. * Addition of Russian documentation This commit adds Russian documentation for users, developers and translators. * typo in example * Add vector/bar/arc mover rules and tests Introduce three new mover rules in Rules/Braille/Russian/Russian_Rules.yaml: vector-arrow, vector-bar, and geometry-arc. Each rule detects specific accent characters (arrows: → ⟶ ⇀ ⃗; bars: ÂŻ ‟ _ ïżŁ; arcs: ⌒ ⏜ ïž”) and emits the appropriate braille indicators, using a different form when the base has more than one character. Add corresponding tests in tests/braille/Russian/russian.rs to cover single- and multi-character movers and combined expressions. * Add Russian braille math functions and limits Extend Russian braille rules to support additional math functions and large operator limits. Added new rules for large-op-limits, operator/functions (including special handling for div), and div-specific replacements in Rules/Braille/Russian/*. Updated Russian definitions and unicode mappings to include sinh/cosh/tanh/coth, arg/sgn/det/rank/rg, Re/Im, grad/rot/div, gcd/lcm and related braille codes. Updated global Rules/definitions.yaml to recognize new function names. Fixed braille cleanup in src/braille.rs to normalize div encoding. Added unit tests exercising the new function mappings and large operator limits. * Support system left brace in Russian braille Introduce handling for system left-brace matrices in the Russian braille rules: add InSystemLeftBrace variable, a system-left-brace-opener rule and a system-left-brace-table rule to detect brace-enclosed mtable as a system. Update row-start logic to emit appropriate braille tokens when InSystemLeftBrace is set. Add tests exercising curly-brace matrices, piecewise function (brace with conditions), and vertical-bar matrices to verify the new behavior. * Add signed-integer and nested-fraction rules Add handling for nested fractions and signed integers inside script positions and adjust grouping behavior for scripts in Russian braille rules. Changes introduce a nested-fraction rule for mfrac and new signed-integer-number / signed-integer rules for msub/munder and msup/mover, plus a small grouping test (⠐) when scripts contain grouped mrow with '+' or a fraction. Also add a comprehensive regression test (script_grouping_regressions) covering many sup/sub cases to ensure correct braille output. Files updated: Rules/Braille/Russian/Russian_Rules.yaml and tests/braille/Russian/russian.rs. * Enhance Russian Braille support with mathematical symbols and rules (#589) * Refine matrix rule handling by adding support for augmented matrices; update unit tests to include 2x3 and 3x4 augmented matrix scenarios. (#555) * remove logging statement * removed uneeded eprintlin!() * Alternative fix to PR #540. Fixes #528. Includes the tests in the PR. * Add Russian translation * Fix #585 -- SSML was being escaped. I earlier added code to prevent a SSML injection attack by escaping HTML. It was done at the wrong point and escape legal SSML. I have moved the check and conversion down to the leaves. I was very surprised there were no useful tests with SSML. All the main tests set `TTS=None`. I added a test that catches bad escaping. I also added some tests to check for leaf-based SSML attacks and also attribute-based ones. * bump beta number * The range for MATHEMATICAL SANS-SERIF DIGITs had MATHEMATICAL MONOSPACE DIGITs as the match part of translate, so if one of the sans-serif digits were used, you ended up in a loop (no match, to it returned itself). * comment out some debug statements * Add 02DA (˚) to list of circle-like chars -- I thought I had done this already, so it might in some other branch * Add source language option to translation audit tool Allow audit-translations to compare a target language against any source language via --source, defaulting to English for existing workflows. Update CLI output, docs, and tests for dynamic source/target labels, including Swedish/Norwegian comparison coverage. Normalize Rich ANSI output in tests so golden and string assertions remain stable when terminal color is forced. * fix ruff * fix ruff * fix ruff * Core concept names additions and tests -- issue 381 (#592) * initial addition of core concept names * defnitions and tests, with a few failing * minus, plus, volume fixes. Other defined, not appearing in site * fix clippy warnings * use "ruamel.yaml>=0.19.1" in uv.lock and pyproject.toml * handle canonicalize failure in containerized environments (#574) * add 1 week dependency cooldown for uv (#599) * fix rules for digits in german (#596) * update navigation rules for traditional chinese (#588) * copy english version of navigate.yaml from NVDA2026.1 and translate * 曎新 definitions.yaml 與 navigate.yaml * update unicode-full.yaml * 捀戆漌慹/ć·ČćźŒć…šæ”Ÿć€§/羼氏 * ç§»è‡ł->移戰, èĄš->èĄšæ Œ, æ•žć­žćŒ->æ•žć­ž, 退ć‡ș->雱開, 䞍胜->ç„Ąæł•, ç•¶ć‰->盼才。 overview line 47, SimpleSpeak_Rules.yaml line 39, "æ č號"->""。mroot.rs ć°æ‡‰äżźæ”č * ç§»ćˆ°äžŠäž€æ Œ -> ćŸ€äžŠäž€æ ŒïŒŒç§»ćˆ°äž‹äž€æ Œ -> ćŸ€äž‹äž€æ ŒïŒŒ äœ”äœçŹŠ -> æ›žç±€ïŒŒèš­ćźšäœ”äœçŹŠ -> èš­ćźšæ›žç±€ïŒŒć·Čæ˜Żæœ€äžŠć±€ -> äžćœšćˆ„çš„ćŒć­èŁĄéąïŒŒäžŠäž€ć±€æ˜Ż -> ćœšćŸŒéąćŒć­èŁĄéąïŒŒć­—ć…ƒæšĄćŒ 開n æŹĄæ–čæ č çš„èź€æł•ïŒŒćŸșćș• -> ćŸș、ćș• * 搑量 -> ć°„ç·š * ćŸș -> ćŸșćș•ćș• -> ćŸșćș• * Internally in definitions.yaml, MathCAT uses "nofix", but that's not a MathML airity property. Remove it. * don't say "indexed by", say "sub" * add some terse and verbose forms of speech * fix typo * Added an html file with all the test exprs so that translators have examples to test. * Fix remaining erros after `definitions.yaml` was updated -- needed to add `function:` * fix clippy warning * minor cleanup: remove ASCIIMath-fi reference * Refactor braille.rs to a BrailleCode trait + registry Replace the four scattered string-match dispatch sites (cleanup, get_braille_chars, NeedsToBeGrouped, and highlight knobs) with a single get_braille_code() registry and a BrailleCode trait implemented per code. Extract the duplicated UEB/Vietnam/Finnish/Swedish indicator-replacement closures into one apply_indicator_replacements helper plus a UserTypeforms struct. Behavior is unchanged (all tests/braille pass); adding a new code now means one registry entry + one impl block. Co-authored-by: Cursor * improved counting for (likey) 8 bit codes when figuring out braille position * make sure this is part of repo * add BrailleDocs to repo (stop ignoring) * updated data, does not include ASCII letters/digits * First version of Russian Braille This commit adds first druft version for Russian Braille. * typo in example * Russian Braille fixes This commit adds fixes to Russian Braille. Now the test with parentheses is passed. Also there are devision and multiplication signs have been modified according to the Russian braille specs. * Braille - Latin and Greek letters fixes This commit adds a layer of Latin and Greek alphabets for Russian mathematical Braille. * In unicode.yaml Latin and Greek letters now go through the internal markers of the alphabetic mode. ‱ In braille.rs russian_cleanup turns these markers into real signs: ◩ Latin lowercase: â   ◩ Latin uppercase: â š ◩ Greek lowercase: â ° ◩ Greek uppercase: â ž Added tests to russian.rs to x+A+y+B, the Latin letter after the number. * Braille - Roots, powers and scripts This commit adds Roots, powers and scripts according to the Russian math Braille specs. * Update Russian Braille rules and mappings Fix YAML replace syntax and extend Russian braille rules: add chemical-formula-operator-bond and prefix-geometry-ops rules, broaden function-name matching (include tg/ctg variants) and add separator markers. Update unicode mappings (degree sign, invisible characters, conditional âˆȘ mapping, parallel/arrow glyphs) and adjust several function/operator braille outputs. Add/expand tests to cover functions, geometry, matrices and chemical formulas to validate the changes. * Add Russian language to docs Add Russian (ru) to the list of supported speech languages and update Russian documentation and translation guidance. - docs/User_guide_for_MathCAT_en.md, docs/index.md: add Russian (ru) to supported languages lists. - docs/ru/User_guide_for_MathCAT_ru.md: include Russian in language options, reorder entries and apply minor wording fixes. - docs/ru/helpers.md: clarify wording, update examples and test instructions to reference ru instead of fr, and improve translation guidance and examples (including test and cargo commands). - docs/ru/index.md: reorder supported languages and polish phrasing. These edits enable and document Russian support and improve clarity for translators and developers working on the Russian localization. * Refactor Russian function braille mapping Replace hardcoded function-name branches in Russian_Rules.yaml with a DefinitionValue lookup that pulls from a new RussianFunctionBraille mapping. Add RussianFunctionBraille entries to definitions.yaml (private-use codepoints U+E100–U+E10E) and map those codepoints to braille strings in unicode.yaml. Add a test covering tan/cot rendering. This centralizes function braille representations and simplifies the rule logic. * Refine Russian wording in translators guide Clarify and naturalize Russian phrasing in the translators guide: add explicit "ĐœĐ° руссĐșĐŸĐŒ ŃĐ·Ń‹ĐșĐ”" to SimpleSpeak examples; change exponent wording to "ĐČ ĐșĐČаЎратД" with example "ĐžĐșс ĐČ ĐșĐČаЎратД"; make fraction wording more natural ("Ń‡ĐžŃĐ»ĐžŃ‚Đ”Đ»ŃŒ Ń€Đ°Đ·ĐŽĐ”Đ»ĐžŃ‚ŃŒ ĐœĐ° Đ·ĐœĐ°ĐŒĐ”ĐœĐ°Ń‚Đ”Đ»ŃŒ" and example "ĐŒĐ”Ń‚Ń€ за сДĐșŃƒĐœĐŽŃƒ"); fix "Đ°ĐœĐłĐ»ĐžĐčсĐșĐŸĐŒ" → "Đ°ĐœĐłĐ»ĐžĐčсĐșĐŸĐŒ ŃĐ·Ń‹ĐșĐ”"; and update Braille tooling phrasing to "ĐżŃ€ĐŸŃĐŒĐŸŃ‚Ń€Ń‰ĐžĐșĐŸĐŒ БраĐčĐ»Ń" and "ЎОсплДД БраĐčĐ»Ń" for consistency. * Add alphabet indicators in russian_cleanup Insert a preprocessing step that injects braille alphabet indicators before running REPLACE_INDICATORS. A new helper add_russian_alphabet_indicators scans the raw braille and emits specific indicators for 'l' (Latin lowercase), 'u' (Latin uppercase), 'g' (Greek lowercase) and 'v' (Greek uppercase), avoiding repeated indicators by tracking the current alphabet mode. The helper also resets the mode on 'C', 'N', and '#'. This keeps the existing indicator replacement and space-collapsing logic intact while preventing redundant alphabet indicators. * Russian braille: add GOST symbols and decimals Add GOST-style number and symbol support for Russian braille: introduce a decimal-comma rule that emits BrailleChars for integer and fractional parts with a decimal indicator, using PUA digit placeholders. Extend unicode mappings with bracket/brace/slash/backslash/pipe characters, Celsius, context-sensitive prime (â€Č/″) handling, PUA digit-to-braille mappings, and a few arrow/connective symbols. Update tests to cover decimal numbers, fractions, set notation, Celsius, and logical arrows, and adjust expected output for geometry primes to reflect the new context-aware prime handling. * Add vector/bar/arc mover rules and tests Introduce three new mover rules in Rules/Braille/Russian/Russian_Rules.yaml: vector-arrow, vector-bar, and geometry-arc. Each rule detects specific accent characters (arrows: → ⟶ ⇀ ⃗; bars: ÂŻ ‟ _ ïżŁ; arcs: ⌒ ⏜ ïž”) and emits the appropriate braille indicators, using a different form when the base has more than one character. Add corresponding tests in tests/braille/Russian/russian.rs to cover single- and multi-character movers and combined expressions. * Add Russian braille math functions and limits Extend Russian braille rules to support additional math functions and large operator limits. Added new rules for large-op-limits, operator/functions (including special handling for div), and div-specific replacements in Rules/Braille/Russian/*. Updated Russian definitions and unicode mappings to include sinh/cosh/tanh/coth, arg/sgn/det/rank/rg, Re/Im, grad/rot/div, gcd/lcm and related braille codes. Updated global Rules/definitions.yaml to recognize new function names. Fixed braille cleanup in src/braille.rs to normalize div encoding. Added unit tests exercising the new function mappings and large operator limits. * Support system left brace in Russian braille Introduce handling for system left-brace matrices in the Russian braille rules: add InSystemLeftBrace variable, a system-left-brace-opener rule and a system-left-brace-table rule to detect brace-enclosed mtable as a system. Update row-start logic to emit appropriate braille tokens when InSystemLeftBrace is set. Add tests exercising curly-brace matrices, piecewise function (brace with conditions), and vertical-bar matrices to verify the new behavior. * Add Russian chemistry braille rules and tests Extend Russian braille rules to handle chemical notation: add rules for equilibrium-arrow, reaction operators, repeated charges, charges, and charge-with-subscript mappings (chemical-reaction-operator, chemistry-mhchem-equilibrium-arrow, chemistry-repeated-charge, chemistry-charge, chemistry-charge-with-subscript). Update Rules/Braille/Russian/Russian_Rules.yaml to map arrows, +/-, superscripts/subscripts and reaction operators to appropriate braille sequences. Add tests in tests/braille/Russian/russian.rs (source_chemical_reactions_and_charges) covering reaction arrows, charges, subscripts/superscripts and combined examples. --------- Co-authored-by: Moritz Groß Co-authored-by: nsoiffer Co-authored-by: Tuomas Pyorre <82783219+ttpyorre@users.noreply.github.com> Co-authored-by: V3nky Co-authored-by: Hon-Jang Yang Co-authored-by: nsoiffer Co-authored-by: Cursor * Add Russian braille rules for geometry operators Add three new braille encoding rules for geometry operators (∠, △, âˆȘ) in Russian: - canonical-prefix-geometry-op: handles geometry operators in canonical form - geometry-prefix-after-canonical-multiplier: handles operators after canonical multipliers - geometry-prefix-after-multiplier: handles operators after regular multipliers Includes corresponding test cases for angles, triangles, unions, perpendicular, and similar symbols. * Improve Russian braille typeform and mathvariant handling Refactor Russian braille cleanup to properly handle typeform indicators (bold, italic) and mathvariant attributes. Introduces a dedicated typeform indicator function that manages indicator placement according to Russian Braille ГОСб Đ  58511 standard, separating typeform handling from alphabet indicators. Adds support for automatic typeform indicators based on mathvariant attributes, ensuring proper indicator pairing around content blocks. Updates unicode-full.yaml rules to reflect new typeform codes and adds comprehensive tests for various mathvariant combinations. * Propagate mathvariant attribute to children Add mathvariant inheritance from parent elements to children that lack their own mathvariant attribute. This ensures consistent styling throughout nested elements. Includes tests for bold text propagation through mstyle and mrow containers, and verifies that explicit child mathvariants override inherited values. * Fix clippy warnings and improve code style - Remove unnecessary borrows in format! and display calls - Change string slices to arrays in trim_end_matches calls - Replace expect(&format!(...)) with unwrap_or_else(|_| panic!(...)) - Add clippy allow attributes to suppress false positives in tests - Add missing newline at end of build.rs * Remove unnecessary borrows in format macros Remove redundant `&` reference operators from arguments passed to format! macros and similar functions. These values are automatically borrowed by the format machinery, so explicit borrows are unnecessary and reduce readability. * Normalize Unicode math digits in decimal numbers Add normalization of Unicode mathematical alphanumeric symbols (Plane 1 digits) to ASCII digits for number nodes containing decimal points. Skip canonicalize_plane1 processing for already-normalized nodes to prevent double processing. * Remove unnecessary references and .to_string() calls Remove unnecessary `&` borrows in format arguments and replace `.to_string()` with direct display. Simplify byte array literals to byte string literals for readability and idiomatic Rust style. * Remove mathvariant propagation and update tests Drop implicit propagation of the mathvariant attribute from canonicalization (removed propagate_inherited_mathvariant call and helper functions) and update Russian braille tests to set mathvariant explicitly on elements (replace mstyle with mrow and move attributes to mi). Changes in src/canonicalize.rs and tests/braille/Russian/russian.rs. This makes mathvariant handling explicit in tests and avoids mutating child nodes during canonicalization. * Remove math digit normalization for mn nodes Delete the conditional normalization of mathematical digit characters for text and remove the normalize_math_digits helper from src/canonicalize.rs. Previously the code converted several Unicode math-digit codepoints to ASCII when a decimal point was present. * Adjust test expectations and unignore tests Update expected spoken/braille test outputs across multiple language test files to match updated speech rules (punctuation handling, table phrasing, and unit/roman-numeral rendering). Removed several #[ignore] annotations for the previously skipped "ignore_period_and_space" tests. Minor tidy in pl/definitions.rs to avoid unnecessary format! usage and fix EOF newline. Affected files include tests/Languages/* for en, fi, fr, hu, nb, pl, sv, vi, and zh/tw. * Bump to 0.7.6-beta.8 and update dependencies Update to version 0.7.6-beta.8 with the following changes: - Migrate to no-unsafe variants of sxd-document and sxd-xpath - Add 'no-unsafe' feature flag for unsafe-free builds - Update dependencies: strum, regex, bitflags, env_logger - Add tempfile dev-dependency - Improve build.rs: add rerun-if-changed directives earlier and fix indentation - Exclude BrailleDocs from package * Switch to sxd_document_no_unsafe and NameStr Replace sxd_document/sxd_xpath usages with no-unsafe variants and adapt string types. Key changes in src/braille.rs, src/canonicalize.rs, and src/chemistry.rs: introduce NameStr (feature-gated), use as_str!/as_qname! helpers, convert many attribute_value calls to .as_deref(), update XPath error constructions, and store operator chars as NameStr with PhantomData in OperatorPair. Refactor chemistry tests to helper-based Result flow and use sxd_document_no_unsafe::parser. These edits make the code compatible with the "no-unsafe" pathway and fix lifetime/string mismatches across the codebase. * Use no-unsafe sxd crates; adapt code & tests Replace sxd_document/sxd_xpath with sxd_document_no_unsafe and sxd_xpath_no_unsafe and update imports (including parser). Adjust attribute handling and lifetimes: use as_str!, attribute_value(...).as_deref().unwrap_or_default(), and similar changes to avoid unsafe string lifetimes. Refactor tests to return Result, use ? and panic-catching, and update assertions (e.g. is_empty). Re-enable sample MathML in main, tweak timing_test (disable heavy loops, change loop count). Misc small fixes to satisfy the new APIs and lifetime semantics. * Use no-unsafe sxd libs; refactor TTS & parsing Switch project XML/XPath handling to sxd_document_no_unsafe / sxd_xpath_no_unsafe and adapt code to use as_str!/as_qname! helpers. Update speech and pretty-print logic to use the new context and node APIs, tighten unicode handling, and add debug checks. Refactor TTS APIs so command value accessors return Result and TTS string builders propagate errors. Update tests and prefs helpers (temporary rules dir helper, prefs test flow). Misc: small capacity tweaks and wording fixes in error messages. Files changed: src/prefs.rs, src/pretty_print.rs, src/speech.rs, src/tts.rs. * Improve wording in RU user guide Replace "ĐąŃ€ŃƒĐŽĐœĐŸŃŃ‚Đž ĐČ ĐŸĐ±ŃƒŃ‡Đ”ĐœĐžĐž" with "ĐšĐŸĐłĐœĐžŃ‚ĐžĐČĐœŃ‹Đ” ĐœĐ°Ń€ŃƒŃˆĐ”ĐœĐžŃ" in docs/ru/User_guide_for_MathCAT_ru.md to use a more precise and respectful term for users who need shorter spoken output. * Add Russian GOST-58511 typeform braille rules and tests Introduce three Russian GOST-58511 typeform/layout braille rules (small-font, letter-spacing, insertion) to Rules/Braille/Russian/Russian_Rules.yaml with their corresponding braille markers. Expand and reorganize tests in tests/braille/Russian/russian.rs: add coverage for the new typeform indicators, interaction cases, menclose/table/braces, and other edge cases; rename several tests to reflect sectioned/aggregated variants. Also adjust expected braille outputs for a few existing tests (sqrt and geometry matrix cases) to match the new rules/formatting. --------- Co-authored-by: nsoiffer Co-authored-by: mgros Co-authored-by: Tuomas Pyorre <82783219+ttpyorre@users.noreply.github.com> Co-authored-by: V3nky Co-authored-by: Hon-Jang Yang Co-authored-by: nsoiffer Co-authored-by: Cursor * force bring over the files from main -- merging didn't do the right thing * Ru - handle lone log/ln; suppress nav announcements (#681) * ru: handle lone log/ln; suppress nav announcements Add handling for lone mi elements 'log' and 'ln' in ClearSpeak (supports Verbosity and ClearSpeak_Log LnAsNaturalLog option). Add a navigation rule to avoid announcing "in/out of" for prefix or silent intents that have no NavigationParts. Include unit tests: new ClearSpeak tests for individual log/ln, new navigate tests for suppressed base announcements, and register the navigate test module. * Russian braille: bracket/arrow mappings & tests Add contextual bracket-recognition rules (square and angle) to Rules/Braille/Russian/Russian_Rules.yaml and add Unicode braille mappings for ≶, ≷, ⟹, ⟩, ↑, ↓ in Rules/Braille/Russian/unicode.yaml. Extend tests in tests/braille/Russian/russian.rs to cover Russian Braille GOST 2019 order relations, large vertical arrows, and contextual bracket recognition for square and angle brackets, validating the expected braille output. --------- Co-authored-by: Danil <81031453+Kostenkov-2021@users.noreply.github.com> Co-authored-by: mgros Co-authored-by: Tuomas Pyorre <82783219+ttpyorre@users.noreply.github.com> Co-authored-by: V3nky Co-authored-by: Hon-Jang Yang Co-authored-by: nsoiffer Co-authored-by: Cursor --- Rules/Braille/Russian/Russian_Rules.yaml | 26 +++ Rules/Braille/Russian/unicode.yaml | 6 + Rules/Braille/UEB/unicode-full.yaml | 35 ++- Rules/Languages/de/unicode-full.yaml | 225 ++++++++++++++++++++ Rules/Languages/en/SharedRules/default.yaml | 29 +-- Rules/Languages/en/unicode-full.yaml | 185 +++++++++++++++- Rules/Languages/ru/ClearSpeak_Rules.yaml | 18 ++ Rules/Languages/ru/navigate.yaml | 9 + Rules/Languages/zh/tw/unicode-full.yaml | 1 + build.rs | 8 +- tests/Languages/en/mtable.rs | 8 +- tests/Languages/en/shared.rs | 11 +- tests/Languages/fi/shared.rs | 3 +- tests/Languages/fr/shared.rs | 3 +- tests/Languages/hu/shared.rs | 3 +- tests/Languages/nb/shared.rs | 3 +- tests/Languages/pl/definitions.rs | 8 +- tests/Languages/pl/shared.rs | 3 +- tests/Languages/ru.rs | 3 +- tests/Languages/ru/ClearSpeak/functions.rs | 16 ++ tests/Languages/ru/navigate.rs | 56 +++++ tests/Languages/sv/shared.rs | 3 +- tests/Languages/vi/vi.rs | 8 +- tests/Languages/zh/tw/shared.rs | 3 +- tests/braille/Russian/russian.rs | 29 +++ 25 files changed, 615 insertions(+), 87 deletions(-) create mode 100644 tests/Languages/ru/navigate.rs diff --git a/Rules/Braille/Russian/Russian_Rules.yaml b/Rules/Braille/Russian/Russian_Rules.yaml index ee9004aed..1bf1603c9 100644 --- a/Rules/Braille/Russian/Russian_Rules.yaml +++ b/Rules/Braille/Russian/Russian_Rules.yaml @@ -1555,6 +1555,32 @@ replace: - x: "DefinitionValue(., 'Braille', 'RussianFunctionBraille')" +- + name: contextual-square-bracket-recognition-point + tag: mo + match: + - "parent::*[IsBracketed(., '[', ']')] and" + - "((.='[' and not(preceding-sibling::*) and following-sibling::*[1][self::m:mi or self::m:mtext]) or" + - " (.=']' and not(following-sibling::*) and preceding-sibling::*[1][self::m:mi or self::m:mtext]))" + replace: + - T: "â  " + - x: "text()" + +- + name: contextual-angle-bracket-recognition-point + tag: mo + match: + - "parent::*[IsBracketed(., '⟹', '⟩')] and" + - "((.='⟹' and not(preceding-sibling::*)) or (.='⟩' and not(following-sibling::*))) and" + - "(parent::*/*[2][self::m:mi or self::m:mtext] or" + - " parent::*/*[last()-1][self::m:mi or self::m:mtext])" + replace: + - T: "⠈" + - test: + - if: ".='⟹'" + then: [T: "â Ș"] + else: [T: "⠕"] + - name: div-operator-function tag: mo diff --git a/Rules/Braille/Russian/unicode.yaml b/Rules/Braille/Russian/unicode.yaml index 6b08895b9..4fc43ea9d 100644 --- a/Rules/Braille/Russian/unicode.yaml +++ b/Rules/Braille/Russian/unicode.yaml @@ -214,6 +214,8 @@ - "≱": [t: "⠀⠰⠟"] - "≀": [t: "⠀â Șâ ¶"] - "≄": [t: "⠀⠕⠶"] +- "≶": [T: "⠀â Ș⠕⠀"] +- "≷": [T: "⠀⠕â Ș⠀"] - "â‰Ș": [t: "⠀â Șâ Ș⠀"] - "≫": [t: "⠀⠕⠕⠀"] - "â‰ș": [t: "⠀⠒â Ș⠀"] @@ -238,6 +240,10 @@ - "⋰": [t: "â  â Čâ Čâ Č"] - "⋱": [t: "â  â Čâ Čâ Č"] - "△": [t: "⠾⠙"] +- "⟹": [T: "â Ș"] +- "⟩": [T: "⠕"] +- "↑": [T: "⠰⠌"] +- "↓": [T: "⠘⠥"] - "→": [t: "⠀⠒⠕"] - "⟶": [t: "⠀⠒⠕"] - "←": [t: "⠀⠊⠶"] diff --git a/Rules/Braille/UEB/unicode-full.yaml b/Rules/Braille/UEB/unicode-full.yaml index 9114b4de6..277eb9f4a 100644 --- a/Rules/Braille/UEB/unicode-full.yaml +++ b/Rules/Braille/UEB/unicode-full.yaml @@ -1,24 +1,6 @@ --- - - - " ": [t: "W"] # 0x2000 - - " ": [t: "W"] # 0x2001 - - " ": [t: "W"] # 0x2002 - - " ": [t: "W"] # 0x2003 - - " ": [t: "W"] # 0x2004 - - " ": [t: "W"] # 0x2005 - - " ": [t: "W"] # 0x2006 - - " ": [t: "W"] # 0x2007 - - " ": [t: "W"] # 0x2008 - - " ": [t: "W"] # 0x2009 - - " ": [t: "W"] # 0x200a - - "​": [t: "W"] # 0x200b - - "‹": [t: "W"] # 0x2028 - - "
": [t: "W"] # 0x2029 - - " ": [t: "W"] # 0x202f - - " ": [t: "W"] # 0x205f - - "ï»ż": [t: "W"] # 0xfeff - - + - "⋇": [tc: "1⠌⠯⠩"] # 0x22C7 (Division times) + - "⊩": [tc: "⠾⠳⠿⠾⠒"] # 0x22A9 (Forces) - "ℏ": [tc: "⠈⠒⠓"] # t: "B"F (reduced Plank's constant) - "ⅆ": [tc: "⠙"] # 0x2146 - "ⅇ": [tc: "⠑"] # 0x2147 @@ -189,6 +171,7 @@ - spell: "translate('.', '₊₋₌₍₎', 'â –â €â ¶â Łâ œ')" - "ℱ": [t: "⠘⠞"] # 0x2122 + - "ℊ": [tc: "TL⠛⠁"] # 0x210a (Script Small G) - "ℋ": [tc: "TCL⠓⠁"] # 0x210b (Script Capital H) - "ℒ": [tc: "TCL⠇"] # 0x2113 (Script Capital L) @@ -215,6 +198,16 @@ - "â„€": [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')" @@ -248,7 +241,7 @@ # script chars in math alphabetic block and also MathType private use area - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 - tc: "TsC" - - spell: "translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'abcdefghijklmnopqrstuvwxyz')" + - spell: "translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'abcdefghijklmnopqrstuvwxyza')" - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf - tc: "Ts" diff --git a/Rules/Languages/de/unicode-full.yaml b/Rules/Languages/de/unicode-full.yaml index 03b3157a6..8a98107f8 100644 --- a/Rules/Languages/de/unicode-full.yaml +++ b/Rules/Languages/de/unicode-full.yaml @@ -10,6 +10,7 @@ - "š": [T: "diaeresis"] # 0xa8 (en: 'double dot') - "©": [T: "Urheberrecht"] # 0xa9 (en: 'copyright') - "ÂȘ": [T: "weibliches Ordnungszeichen"] # 0xaa (en: 'feminine ordinal indicator') + - "ÂŹ": [T: "nicht"] # 0xac (en: 'not') - "«": [T: "Nach links zeigendes doppeltes spitzes AnfĂŒhrungszeichen"] # 0xab (en: 'left-pointing double angle quote mark', MathPlayer: 'left-pointing double angle quote mark', google: 'links zeigende doppelwinkel-zitatmarke') - "ÂŻ": # 0xaf - test: @@ -18,9 +19,24 @@ else: [T: "Überstrich"] # (en: 'line', MathPlayer: 'macron', google: 'linie') - "ÂČ": [T: "Quadrat"] # 0xb2 (en: 'two', MathPlayer: 'zum Quadrat', google: 'zwei') - "Âł": [T: "Kubik"] # 0xb3 (en: 'three', MathPlayer: 'hoch drei', google: 'drei') + - "ÂŽ": [T: "Akutakzent"] # 0xb4 (en: 'acute', MathPlayer: 'acute accent', google: 'akut') - "”": [T: "Mikrozeichen"] # 0xb5 (en: 'micro', MathPlayer: 'micro sign', google: 'mikro') - "Âč": [T: "hoch eins"] # 0xb9 (en: 'one', google: 'eins') - "Âș": [T: "MĂ€nnliches Ordnungszeichen"] # 0xb9 (en: 'masculine ordinal indicator') + - "·": + - test: + if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolDot = 'Auto'" + then: [T: "mal"] # (en: 'times', google translation) + else: [T: "mal"] # (en: 'dot', MathPlayer: 'Punkt mittig', google: 'punkt') + - "×": # 0xd7 + - test: + if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolX = 'Auto'" + then: [T: "mal"] # (en: 'times', google translation) + else_test: + if: $ClearSpeak_MultSymbolX = 'By' + then: [T: "von"] # (en: 'by', google translation) + else: [T: "mal"] # (en: 'cross', MathPlayer: 'times', google: 'kreuzen') + - "Ă·": [T: "geteilt durch"] # 0xf7 (en: 'divided by', MathPlayer: 'divides') - "ÂĄ": [T: "umgekehrtes ausrufezeichen"] # 0xa1 (en: 'inverted exclamation mark') - "¶": [T: "absatzzeichen"] # 0xb6 (en: 'paragraph mark') - "Âż": [T: "umgekehrtes fragezeichen"] # 0xbf (en: 'inverted question mark') @@ -108,6 +124,14 @@ - "Ëœ": [T: "modifikatorregal"] # 0x2fd (en: 'modifier shelf', google translation) - "ËŸ": [T: "modifikator offenes regal"] # 0x2fe (en: 'modifier open shelf', google translation) - "Ëż": [T: "modifikator niedriger links pfeil"] # 0x2ff (en: 'modifier low left arrow', google translation) + - "̀": [T: "gravisakzentverzierung"] # 0x300 (en: 'grave accent embellishment', google: 'grabakzentverzierung') + - "́": [T: "akutakzentverzierung"] # 0x301 (en: 'acute accent embellishment', google: 'akute akzentverzierung') + - "̂": [T: "Hutverzierung"] # 0x302 (en: 'circumflex accent embellishment', google: 'zirma akzentverzierung') + - "̃": [T: "tildeverzierung"] # 0x303 (google: 'tilde verzierung') + - "̄": [T: "makronverzierung"] # 0x304 (en: 'macron embellishment', google: 'makron -verzierung') + - "̅": [T: "Überstreifenverzierung"] # 0x305 (google: 'ĂŒberbĂ€rerverzierung') + - "̆": [T: "kombinierendes Breve"] # 0x306 (en: 'breve embellishment', google: 'breve -verzierung') + - "̇": [T: "Punkt ĂŒber Verzierung"] # 0x307 (google: 'punkt ĂŒber verzierung') - "̈": [T: "zwei Punkte oberhalb"] # 0x308 (en: 'diaeresis embellishment', google: 'diaeresis -verzierung') - "̉": [T: "haken ĂŒber verzierung"] # 0x309 (en: 'hook above embellishment', google translation) - "̊": [T: "ring ĂŒber verzierung"] # 0x30a (en: 'ring above embellishment', google: 'ring ĂŒber verzierung') @@ -197,9 +221,13 @@ - "ϒ": [T: "Variante Upsilon mit Haken"] # 0x3d2 (en: 'upsilon with hook', google: 'upsilon mit haken') - "ϓ": [T: "Upsilon mit Akutakzent und Haken"] # 0x3d3 (en: 'upsilon with acute and hook', google translation) - "ϔ": [T: "Upsilon mit Diaeresis und Haken"] # 0x3d4 (en: 'upsilon with diaeresis and hook', google translation) + - "ϕ": [T: "gerades Phi"] # 0x3d5 (en: 'phi', google: 'phi') + - "ϖ": [T: "Variante Pi"] # 0x3d6 (en: 'pi', google: 'pi') - "ϗ": [T: "kai"] # 0x3d7 (MathPlayer: 'variant kai') - "Ϙ": [T: "großes archaisches koppa"] # 0x3d8 (en: 'cap archaic koppa') - "ϙ": [T: "archaisches koppa"] # 0x3d9 (en: 'archaic koppa') + - "Ï”": [T: "epsilon"] # 0x3f5 + - "϶": [T: "umgekehrtes epsilon"] # 0x3f6 (en: 'reversed epsilon', MathPlayer: 'reversed epsilon', google: 'umgekehrter epsilon') - "А-ĐŻ": # 0x410 - 0x42f - test: if: "$CapitalLetters_Beep" @@ -256,6 +284,10 @@ - "‐": [T: "Bindestrich"] # 0x2010 (en: 'hyphen', MathPlayer: 'minus', google: 'bindestrich') - "‑": [T: "nicht-trennender Bindestrich"] # 0x2011 (en: 'hyphen', google: 'bindestrich') - "‒": [T: "Figurenstrich"] # 0x2012 (en: 'figure dash', google: 'figur dash') + - "–": [T: "Halbgeviertstrich"] # 0x2013 (SRE: 'En Dash') + - "—": [T: "Geviertstrich"] # 0x2014 (SRE: 'EM Dash') + - "―": [T: "Horizontale Linie"] # 0x2015 (en: 'horizontal bar', MathPlayer: 'horizontal bar', google: 'horizontale linie') + - "‖": [T: "Doppelte vertikale Linie"] # 0x2016 (en: 'double vertical line', MathPlayer: 'double vertical bar', google: 'doppelte vertikale linie') - "†": [T: "Dolch"] # 0x2020 (en: 'dagger', MathPlayer: 'dagger', google: 'dolch') - "‡": [T: "Doppelter Dolch"] # 0x2021 (en: 'double dagger', MathPlayer: 'double dagger', google: 'doppeldolch') @@ -267,8 +299,24 @@ then: [T: "punkt"] # (en: 'dot', google translation) else: [T: "Kugel"] # (en: 'bullet', MathPlayer: 'bullet', google: 'kugel') + - "
": # 0x2026 + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak '
' as 'and so on...' unless expr starts with '
' + - "../*[1][text()='
']" + then: [T: "punkt punkt punkt"] # (en: 'dot dot dot', google translation) + else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' + if: "count(following-sibling::*) = 0" + then: [T: "und so weiter"] # (en: 'and so on', google translation) + else: [T: "horizontale Ellipse"] # (en: 'and so on up to', MathPlayer: 'dot dot dot', google: 'und so weiter bis') + - "‰": [T: "promille"] # 0x2030 (en: 'per mille', MathPlayer: 'per mille sign', google: 'pro mille') - "‱": [T: "pro Zehntausend"] # 0x2031 (en: 'per ten thousand', MathPlayer: 'per ten thousand sign', google: 'pro zehntausend') + - "â€Č": [T: "Strich"] # 0x2032 (en: 'prime', MathPlayer: 'strich', google: 'prime') + - "″": [T: "zwei Striche"] # 0x2033 (en: 'double prime', MathPlayer: 'zwei-strich', google: 'double prime') + - "‮": [T: "drei Striche"] # 0x2034 (en: 'triple prime', MathPlayer: 'drei-strich', google: 'triple prime') - "—": [T: "umgekehrter Strich"] # 0x2035 (en: 'reversed prime', MathPlayer: 'reversed prime', google: 'umgekehrt prime') - "‶": [T: "zwei umgekehrte Striche"] # 0x2036 (en: 'reversed double prime', MathPlayer: 'reversed double prime', google: 'umgekehrt doppelte prime') - "‷": [T: "drei umgekehrte Striche"] # 0x2037 (en: 'reversed triple prime', google: 'triple prime umgekehrt') @@ -398,6 +446,7 @@ - "℆": [T: "cada una"] # 0x2106 (google translation) - "ℇ": [T: "Euler-Konstante"] # 0x2107 (en: 'euler's constant', google: 'eulers konstante') - "℈": [T: "skrupel"] # 0x2108 (en: 'scruples', google translation) + - "℉": [T: "Grad Fahrenheit"] # 0x2109 (google: 'grad fahrenheit') - "ℊ": [T: "Skript G"] # 0x210a (google: 'skript g') - "ℌℑℹℭ": # 0x210c, 0x2111, 0x2128, 0x212d - T: "Fraktur" # (en: 'fraktur', google: 'fraktur') @@ -409,6 +458,7 @@ then: [T: "doppelt geschlagen"] # (en: 'double struck', google translation) - spell: "translate('.', 'â„â„™â„Ÿâ„ż', 'HPΓΠ')" + - "ℎ": [T: "Planck-Konstante"] # 0x210e (en: 'planck constant', MathPlayer: 'planck constant', google: 'planck konstant') - "ℏ": # 0x210f - test: if: "($Verbosity='Terse')" @@ -419,11 +469,15 @@ - T: "Skript" # (en: 'script', MathPlayer: 'h bar', google: 'skript') - spell: "translate('.', 'â„â„’â„˜â„Źâ„°â„±â„ł', 'ILPBEFM')" + - "ℓ": [T: "Schreibschrift l"] # 0x2113 (en: 'script l', MathPlayer: 'script l', google: 'skript l') - "℔": [T: "L B Balkensymbol"] # 0x2114 (en: 'pounds', google: 'pfund') - "№": [T: "Numero-Zeichen"] # 0x2116 (en: 'number', MathPlayer: 'numero sign', google: 'nummer') - "â„„": [T: "Unze-Zeichen"] # 0x2125 (en: 'ounces', MathPlayer: 'ounce sign', google: 'unzen') + - "℩": [T: "Ohm-Zeichen"] # 0x2126 (en: 'ohms', MathPlayer: 'ohm sign', google: 'ohm') - "℧": [T: "Umgekehrtes Ohm-Zeichen"] # 0x2127 (en: 'mhos', MathPlayer: 'inverted ohm', google: 'mhos') - "℩": [T: "gedrehtes Iota"] # 0x2129 (google: 'drehte iota') + - "â„Ș": [T: "Kelvin-Zeichen"] # 0x212a (en: 'kelvin', MathPlayer: 'degrees kelvin', google: 'kelvin') + - "Å": [T: "Angstrom-Zeichen"] # 0x212b (en: 'angstroms', MathPlayer: 'angstroms', google: 'angstrome') - "ℯ": [T: "Skript E"] # 0x212f (google: 'skript e') # coalesced some chars that use cap letters @@ -501,6 +555,10 @@ - "â…Ÿ": [T: "â…Ÿ"] # 0x217e (en: 'D', google translation) - "ⅿ": [T: "ⅿ"] # 0x217f (en: 'M', google translation) - "↉": [T: "null drittel"] # 0x2189 (en: 'zero thirds') + - "←": [T: "Pfeil nach links"] # 0x2190 (en: 'leftwards arrow', MathPlayer: 'leftwards arrow', google: 'pfeil nach links') + - "↑": [T: "AufwĂ€rtspfeil"] # 0x2191 (en: 'upwards arrow', MathPlayer: 'upwards arrow', google: 'nach oben pfeil') + - "→": [T: "Pfeil nach rechts"] # 0x2192 (en: 'rightwards arrow', MathPlayer: 'rightwards arrow', google: 'richtiger pfeil') + - "↓": [T: "Pfeil nach unten"] # 0x2193 (en: 'downwards arrow', MathPlayer: 'downwards arrow', google: 'nach unten pfeil') - "↔": [T: "Pfeil nach links und rechts"] # 0x2194 (en: 'left right arrow', MathPlayer: 'left right arrow', google: 'links rechts pfeil') - "↕": [T: "Pfeil nach oben und unten"] # 0x2195 (en: 'up down arrow', MathPlayer: 'up down arrow', google: 'auf pfeil runter') - "↖": [T: "Nordwestpfeil"] # 0x2196 (en: 'north west arrow', MathPlayer: 'north west arrow', google: 'nordwestpfeil') @@ -573,6 +631,7 @@ - "⇏": [T: "Doppelpfeil nach rechts mit Strich"] # 0x21cf (en: 'rightwards double arrow with stroke', MathPlayer: 'rightwards double arrow with stroke', google: 'richtiger doppelpfeil mit schlaganfall') - "⇐": [T: "Doppelpfeil nach links"] # 0x21d0 (en: 'leftwards double arrow', MathPlayer: 'leftwards double arrow', google: 'links doppelpfeil') - "⇑": [T: "Doppelpfeil nach oben"] # 0x21d1 (en: 'upwards double arrow', MathPlayer: 'upwards double arrow', google: 'double -pfeil nach oben') + - "⇒": [T: "Doppelpfeil nach rechts"] # 0x21d2 (en: 'rightwards double arrow', MathPlayer: 'rightwards double arrow', google: 'richtiger doppelpfeil') - "⇓": [T: "Doppelpfeil nach unten"] # 0x21d3 (en: 'downwards double arrow', MathPlayer: 'downwards double arrow', google: 'downwards doppelpfeil') - "⇔": [T: "Linker rechter Doppelpfeil"] # 0x21d4 (en: 'left right double arrow', MathPlayer: 'left right double arrow', google: 'links rechts doppelpfeil') - "⇕": [T: "Doppelpfeil nach oben und unten"] # 0x21d5 (en: 'up down double arrow', MathPlayer: 'up down double arrow', google: 'doppelpfeil nach oben') @@ -624,18 +683,107 @@ if: "$Verbosity!='Terse'" then: [T: "die"] # (en: 'the', google translation) - T: "Komplement" # (en: 'complement of') + - "∂": # 0x2202 + - test: + if: "$Verbosity='Terse'" + then: [T: "partiell"] # (en: 'partial', google translation) + else: [T: "partielle Ableitung"] # (en: 'partial derivative', google: 'partielle ableitung') - "∃": [T: "es gibt"] # 0x2203 (en: 'there exists') - "∄": [T: "es gibt nicht"] # 0x2204 (en: 'there does not exist') - "∅": [T: "leere Menge"] # 0x2205 (en: 'empty set') + - "∆": # 0x2206 + - test: + if: "$Verbosity!='Terse'" + then: [T: "die"] # (en: 'the', google translation) + - T: "Laplace-Operator von" # (en: 'laplacian of', MathPlayer: 'increment', google: 'laplace von') + - "∇": # 0x2207 + - test: + if: "$Verbosity!='Terse'" + then: [T: "die"] # (en: 'the', google translation) + - T: "Nabla" # (en: 'gradient of', google: 'gradient von') + - "∈": # 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: [T: "ein Element von"] # (en: 'an element of', google translation) + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "in"] # (google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "Element von"] # (en: 'member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "Element von"] # (en: 'element of', google translation) + - else: [T: "Element von"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "ist ein Element von"] # (en: 'is a member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "ist ein Element von"] # (en: 'is an element of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "ist in"] # (en: 'is in', google translation) + - else: [T: "Element von"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') + - "∉": # 0x2209 + # rule is identical to 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: [T: "ist kein Element von"] # (en: 'is not an element of', google translation) + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "nicht in"] # (en: 'not in', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "kein Element von"] # (en: 'not member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "kein Element von"] # (en: 'not element of', google translation) + - else: [T: "nicht Element von"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'not belonging to') + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "ist kein Element von"] # (en: 'is not a member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "ist kein Element von"] # (en: 'is not an element of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "ist nicht in"] # (en: 'is not in', google translation) + - else: [T: "nicht Element von"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'does not belong to') + - "∊": # 0x220a + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: [T: "ist ein Element von"] # (en: 'is an element of', google translation) + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "in"] # (google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "Element von"] # (en: 'member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "Element von"] # (en: 'element of', google translation) + - else: [T: "Element von"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "ist ein Element von"] # (en: 'is a member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "ist ein Element von"] # (en: 'is an element of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "ist in"] # (en: 'is in', google translation) + - else: [T: "Element von"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') - "∋": [T: "hat als Element"] # 0x220b (en: 'contains the member') - "∌": [T: "hat nicht als Element"] # 0x220c (en: 'does not contain the member') - "∍": [T: "hat als Element"] # 0x220d (en: 'contains the member') - "∎": [T: "Ende Beweis"] # 0x220e (en: 'end of proof') + - "∏": [T: "Produkt"] # 0x220f (en: 'product', MathPlayer: 'Product', google: 'produkt') + - "∐": [T: "Koprodukt"] # 0x2210 (en: 'coproduct', MathPlayer: 'coproduct', google: 'koprodukt') + - "∑": [T: "Summe"] # 0x2211 (en: 'sum') - "−": [T: "minus"] # 0x2212 - "∓": [T: "minus plus"] # 0x2213 (en: 'minus or plus') - "∔": [T: "Plus mit Punkt"] # 0x2214 (en: 'dot plus', MathPlayer: 'dot plus', google: 'punkt plus') - "∕": [T: "Division"] # 0x2215 (en: 'divided by', MathPlayer: 'SchrĂ€gstrich (Division)', google: 'geteilt durch') - "∖": [T: "Mengendifferenz"] # 0x2216 (en: 'set minus', MathPlayer: 'Mengen-Minus', google: 'minus einstellen') + - "∗": [T: "Sternoperator"] # 0x2217 (en: 'times', MathPlayer: 'asterisk operator', google: 'mal') - "∘": [T: "verknĂŒpft mit"] # 0x2218 (en: 'composed with') - "∙": # 0x2219 - test: @@ -643,6 +791,11 @@ then: [T: "punkt"] # (en: 'dot', google translation) else: [T: "Kreisoperator"] # (en: 'times', MathPlayer: 'bullet operator', google: 'mal') + - "√": # 0x221a + - test: + if: "$Verbosity!='Terse'" + then: [T: "die"] # (en: 'the', google translation) + - T: "Quadratwurzel" # (en: 'square root of', MathPlayer: 'radical', google: 'quadratwurzel von') - "∛": # 0x221b - test: if: "$Verbosity!='Terse'" @@ -653,12 +806,26 @@ if: "$Verbosity!='Terse'" then: [T: "die"] # (en: 'the', google translation) - T: "vierte Wurzel" # (en: 'fourth root of') + - "∝": # 0x221d + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) + - T: "proportional zu" # (en: 'proportional to') - "∞": [T: "unendlich"] # 0x221e (en: 'infinity') + - "∟": [T: "rechter Winkel"] # 0x221f (en: 'right angle') + - "∠": [T: "Winkel"] # 0x2220 (en: 'angle') + - "∥": [T: "gerichteter Winkel"] # 0x2221 (en: 'measured angle', MathPlayer: 'measured angle', google: 'gemessener winkel') - "∹": [T: "Raumwinkel"] # 0x2222 (en: 'spherical angle', MathPlayer: 'spherical angle', google: 'sphĂ€rischer winkel') - "∣": [T: "teilt"] # 0x2223 (en: 'divides') - "∀": [T: "teilt nicht"] # 0x2224 (en: 'does not divide') - "∧": [T: "und"] # 0x2227 (en: 'and') - "√": [T: "oder"] # 0x2228 (en: 'or') + - "∩": [T: "Durchschnitt"] # 0x2229 (en: 'intersection') + - "âˆȘ": [T: "Vereinigung"] # 0x222a (en: 'union') + - "∫": [T: "Integral"] # 0x222b (en: 'integral') + - "∏": [T: "Doppelintegral"] # 0x222c (en: 'double integral') + - "∭": [T: "Dreifachintegral"] # 0x222d (en: 'triple integral', MathPlayer: 'Dreifaches Integral', google: 'dreifachintegral') + - "∟": [T: "Randintegral"] # 0x222e (en: 'contour integral', MathPlayer: 'Kontur-Integral', google: 'konturintegral') - "∯": [T: "OberflĂ€chenintegral"] # 0x222f (en: 'surface integral', MathPlayer: 'FlĂ€chenintegral', google: 'oberflĂ€chenintegral') - "∰": [T: "Volumenintegral"] # 0x2230 (en: 'volume integral', MathPlayer: 'Volumsintegral', google: 'volumenintegral') - "∱": [T: "Integral im Uhrzeigersinn"] # 0x2231 (en: 'clockwise integral') @@ -666,6 +833,12 @@ - "∳": [T: "Kurvenintegral im Gegenuhrzeigersinn"] # 0x2233 (en: 'anticlockwise contour integral', MathPlayer: 'Kontur-Integral im Gegenuhrzeigersinn', google: 'konturintegral gegen den gegenwart') - "∎": [T: "folglich"] # 0x2234 (en: 'therefore', MathPlayer: 'deshalb', google: 'daher') - "∔": [T: "weil"] # 0x2235 (en: 'because') + - "∶": # 0x2236 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) + - T: "VerhĂ€ltnis" # (en: 'to') + - "∷": [T: "Proportion"] # 0x2237 (en: 'as') - "∞": [T: "Minus mit Punkt"] # 0x2238 (en: 'dot minus', MathPlayer: 'dot minus', google: 'punkt minus') - "âˆč": [T: "Überschuss"] # 0x2239 (en: 'has excess compared to', MathPlayer: 'excess', google: 'hat ĂŒberschĂŒssig im vergleich zu') - "âˆș": # 0x223a @@ -678,6 +851,14 @@ if: "$Verbosity!='Terse'" then: [T: "ist"] # (en: 'is', google translation) - T: "homothetisch" # (en: 'homothetic to', MathPlayer: 'homothetic', google: 'homothetisch zu') + - "∌": [T: "Tildeoperator"] # 0x223c (en: 'varies with', MathPlayer: 'tilde operator', google: 'variiert mit') + - "∜": [T: "Umgekehrte Tilde"] # 0x223d (en: 'reversed tilde', MathPlayer: 'reversed tilde', google: 'umgekehrte tilde') + - "∟": # 0x223e + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) + - T: "Umgekehrtes stummes S" # (en: 'most positive', MathPlayer: 'inverted lazy s', google: 'am positivsten') + - "∿": [T: "Sinuswelle"] # 0x223f (en: 'sine wave', MathPlayer: 'sine wave', google: 'sinus') - "≀": [T: "Kranzprodukt"] # 0x2240 (en: 'wreath product', MathPlayer: 'wreath product', google: 'kranzprodukt') - "≁": [T: "durchgestrichene Tilde"] # 0x2241 (en: 'not tilde', MathPlayer: 'not tilde', google: 'nicht tilde') - "≂": [T: "minus tilde"] # 0x2242 (SRE: 'Minus ĂŒber Tilde') @@ -778,6 +959,16 @@ then: [T: "ist"] # (en: 'is', google translation) - T: "gemessen mit" # (en: 'measured by', MathPlayer: 'measured by') - "≟": [T: "vielleicht gleich"] # 0x225f (en: 'has an unknown relationship with', MathPlayer: 'questioned equal to', google: 'hat eine unbekannte beziehung zu') + - "≠": # 0x2260 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) + - T: "ungleich" # (en: 'not equal to') + - "≡": # 0x2261 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) + - T: "identisch mit" # (en: 'identical to', SRE: 'kongruent mit') - "≱": # 0x2262 - test: if: "$Verbosity!='Terse'" @@ -888,6 +1079,36 @@ - "≿": [T: "nachfolgend oder Ă€quivalent"] # 0x227f (en: 'succeeds or is equivalent to', MathPlayer: 'succeeds or equivalent to', google: 'erfolg oder ist gleichbedeutend mit') - "⊀": [T: "nicht vorangehend"] # 0x2280 (en: 'does not precede', MathPlayer: 'does not precede', google: 'vorausgegangen nicht voraus') - "⊁": [T: "nicht nachfolgend"] # 0x2281 (en: 'does not succeed', MathPlayer: 'does not succeed', google: 'gelingt es nicht') + - "⊂": # 0x2282 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist ein"] # (en: 'is a', google translation) + - T: "echte Teilmenge von" # (en: 'subset of', MathPlayer: 'Teilmenge von', google: 'untergruppe von') + - "⊃": # 0x2283 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist ein"] # (en: 'is a', google translation) + - T: "echte Obermenge von" # (en: 'superset of', MathPlayer: 'Obermenge von', google: 'superset von') + - "⊄": # 0x2284 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) + - T: "keine echte Teilmenge von" # (en: 'not a subset of', MathPlayer: 'nicht Teilmenge von', google: 'keine teilmenge von') + - "⊅": # 0x2285 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) + - T: "keine echte Obermenge von" # (en: 'not a superset of', MathPlayer: 'nicht Obermenge von', google: 'kein superset von') + - "⊆": # 0x2286 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist ein"] # (en: 'is a', google translation) + - T: "Teilmenge oder gleich" # (en: 'subset of or equal to', MathPlayer: 'Teilmenge von odre gleich', google: 'teilmenge von oder gleich') + - "⊇": # 0x2287 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist ein"] # (en: 'is a', google translation) + - T: "Obermenge oder gleich" # (en: 'superset of or equal to', MathPlayer: 'Obermenge von oder gleich', google: 'superset von oder gleich') - "⊈": # 0x2288 - test: if: "$Verbosity!='Terse'" @@ -2846,8 +3067,11 @@ - "": [T: "digamma"] # 0xed03 (google translation) - "ϝ": [T: "digamma"] # 0x3dd - "": [T: ""] # 0xed10 (en: 'd', google translation) + - "ⅆ": [T: "d kursiv mit Doppelstrich"] # 0x2146 (en: 'd', MathPlayer: 'd', google: 'ⅆ') - "": [T: ""] # 0xed11 (en: 'e', google translation) + - "ⅇ": [T: "e kursiv mit Doppelstrich"] # 0x2147 (en: 'e', MathPlayer: 'e', google: 'ⅇ') - "": [T: ""] # 0xed12 (en: 'i', google translation) + - "ⅈ": [T: "i kursiv mit Doppelstrich"] # 0x2148 (en: 'i', MathPlayer: 'i', google: 'ⅈ') - "": [T: ""] # 0xed13 (en: 'j', google translation) - "ⅅ": - spell: "translate('.', 'ⅅ', 'DD')" # 0xed16, 0x2145 @@ -2896,6 +3120,7 @@ - " ": [T: ""] # 0x205f - "": [T: ""] # 0xef04 - "": [T: ""] # 0xef05 + - " ": [T: ""] # 0x2003 - "": [T: ""] # 0xef06 - "": [T: ""] # 0xef07 - "": [T: ""] # 0xef08 diff --git a/Rules/Languages/en/SharedRules/default.yaml b/Rules/Languages/en/SharedRules/default.yaml index 9a8389ddf..255c3bbf4 100644 --- a/Rules/Languages/en/SharedRules/default.yaml +++ b/Rules/Languages/en/SharedRules/default.yaml @@ -62,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 > 0 or @data-roman-numeral" # 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) @@ -237,26 +237,12 @@ - x: "*[2]" - t: "below" # phrase(x with z 'below' it) -# FIX: this only works for up to four dots (which is realistically all we need) -- name: dot-over - tag: modified-variable - match: "*[1][self::m:mi] and (*[2][translate(., '.', '')=''])" - replace: - - x: "*[1]" - - x: "IfThenElse(string-length(*[2])=1, 'dot', - IfThenElse(string-length(*[2])=2, 'double dot', - IfThenElse(string-length(*[2])=3, 'triple dot', 'quadruple dot') - ))" - - pause: short - -# FIX: the 'translate' list is a little different from 'modified-variable', so we also include 'mover' (unify?) - name: diacriticals - tag: [mover, modified-variable] + tag: mover match: "*[1][self::m:mi] and *[2][translate(., '\u0306\u030c.\u00A8\u02D9\u20DB\u20DC`^ˇ~→¯_', '')='']" replace: - x: "*[1]" - x: "*[2]" - - pause: short - name: default tag: mover @@ -436,23 +422,22 @@ - t: "end scripts" # phrase(At this point 'end scripts' occurs) - name: default - tag: [mtable, array] + tag: mtable variables: - IsColumnSilent: "false()" - - NumColumns: "CountTableColumns(.)" - - NumRows: "CountTableRows(.)" + - NumColumns: "count(*[1]/*) - IfThenElse(*/self::m:mlabeledtr, 1, 0)" match: "." replace: - t: "table with" # phrase(the 'table with' 3 rows) - - x: "$NumRows" + - x: count(*) - test: - if: "$NumRows=1" + if: count(*)=1 then: [t: "row"] # phrase(the table with 1 'row') else: [t: "rows"] # phrase(the table with 3 'rows') - t: "and" # phrase(the table with 3 rows 'and' 4 columns) - x: "$NumColumns" - test: - if: "$NumColumns=1" + if: "NumColumns=1" then: [t: "column"] # phrase(the table with 3 rows and 1 'column') else: [t: "columns"] # phrase(the table with 3 rows and 4 'columns') - pause: long diff --git a/Rules/Languages/en/unicode-full.yaml b/Rules/Languages/en/unicode-full.yaml index 1a5356fd3..15c169d6a 100644 --- a/Rules/Languages/en/unicode-full.yaml +++ b/Rules/Languages/en/unicode-full.yaml @@ -10,6 +10,7 @@ - "š": [t: "double dot"] # 0xa8 - "©": [t: "copyright"] # 0xa9 - "ÂȘ": [t: "feminine ordinal indicator"] # 0xaa + - "ÂŹ": [t: "not"] # 0xac - "«": [t: "left-pointing double angle quote mark"] # 0xab - "ÂŻ": # 0xaf - test: @@ -18,9 +19,24 @@ else: [t: "line"] - "ÂČ": [t: "two"] # 0xb2 - "Âł": [t: "three"] # 0xb3 + - "ÂŽ": [t: "acute"] # 0xb4 - "”": [t: "micro"] # 0xb5 - "Âč": [t: "one"] # 0xb9 - "Âș": [t: "masculine ordinal indicator"] # 0xb9 + - "·": + - test: + if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolDot = 'Auto'" + then: [t: "times"] + else: [t: "dot"] + - "×": # 0xd7 + - test: + if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolX = 'Auto'" + then: [t: "times"] + else_test: + if: $ClearSpeak_MultSymbolX = 'By' + then: [t: "by"] + else: [t: "cross"] + - "Ă·": [t: "divided by"] # 0xf7 - "ÂĄ": [t: "inverted exclamation mark"] # 0xa1 - "¶": [t: "paragraph mark"] # 0xb6 - "Âż": [t: "inverted question mark"] # 0xbf @@ -108,6 +124,14 @@ - "Ëœ": [t: "modifier shelf"] # 0x2fd - "ËŸ": [t: "modifier open shelf"] # 0x2fe - "Ëż": [t: "modifier low left arrow"] # 0x2ff + - "̀": [t: "grave accent embellishment"] # 0x300 + - "́": [t: "acute accent embellishment"] # 0x301 + - "̂": [t: "circumflex accent embellishment"] # 0x302 + - "̃": [t: "tilde embellishment"] # 0x303 + - "̄": [t: "macron embellishment"] # 0x304 + - "̅": [t: "overbar embellishment"] # 0x305 + - "̆": [t: "breve embellishment"] # 0x306 + - "̇": [t: "dot above embellishment"] # 0x307 - "̈": [t: "diaeresis embellishment"] # 0x308 - "̉": [t: "hook above embellishment"] # 0x309 - "̊": [t: "ring above embellishment"] # 0x30a @@ -197,9 +221,13 @@ - "ϒ": [t: "upsilon with hook"] # 0x3d2 - "ϓ": [t: "upsilon with acute and hook"] # 0x3d3 - "ϔ": [t: "upsilon with diaeresis and hook"] # 0x3d4 + - "ϕ": [t: "phi"] # 0x3d5 + - "ϖ": [t: "pi"] # 0x3d6 - "ϗ": [t: "kai"] # 0x3d7 - "Ϙ": [t: "cap archaic koppa"] # 0x3d8 - "ϙ": [t: "archaic koppa"] # 0x3d9 + - "Ï”": [t: "epsilon"] # 0x3f5 + - "϶": [t: "reversed epsilon"] # 0x3f6 - "А-ĐŻ": # 0x410 - 0x42f - test: if: "$CapitalLetters_Beep" @@ -271,6 +299,19 @@ then: [t: "dot"] else: [t: "bullet"] + - "
": # 0x2026 + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak '
' as 'and so on...' unless expr starts with '
' + - "../*[1][.='
']" + then: [t: "dot dot dot"] + else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' + if: "count(following-sibling::*) = 0" + then: [t: "and so on"] + else: [t: "and so on up to"] + - "‰": [t: "per mille"] # 0x2030 - "‱": [t: "per ten thousand"] # 0x2031 - "â€Č": [t: "prime"] # 0x2032 @@ -427,6 +468,7 @@ - t: "script" - spell: "translate('.', 'â„â„’â„˜â„Źâ„°â„±â„ł', 'ILPBEFM')" + - "ℓ": [t: "script l"] # 0x2113 - "℔": [t: "pounds"] # 0x2114 - "№": [t: "number"] # 0x2116 - "â„„": [t: "ounces"] # 0x2125 @@ -584,6 +626,7 @@ - "⇏": [t: "right double arrow with stroke"] # 0x21cf - "⇐": [t: "left double arrow"] # 0x21d0 - "⇑": [t: "up double arrow"] # 0x21d1 + - "⇒": [t: "implies"] # 0x21d2 - "⇓": [t: "down double arrow"] # 0x21d3 - "⇔": [t: "if and only if"] # 0x21d4 - "⇕": [t: "up down double arrow"] # 0x21d5 @@ -635,15 +678,81 @@ if: "$Verbosity!='Terse'" then: [ot: "the"] - t: "complement of" + - "∂": # 0x2202 + - test: + if: "$Verbosity='Terse'" + then: [t: "partial"] + else: [t: "partial derivative"] - "∃": [t: "there exists"] # 0x2203 - "∄": [t: "there does not exist"] # 0x2204 - "∅": [t: "empty set"] # 0x2205 + - "∆": # 0x2206 + - test: + if: "following-sibling::*" + then_test: + if: "$Verbosity!='Terse'" + then: [t: "the LahPlahsian of"] # "LahPlahsian" sounds better than "laplacian" in speech engines tested + else: [t: "LahPlahsian"] + else: [t: "LahPlahsian"] + - "∇": [t: "nahblah"] # 0x2207 + - "∉": # 0x2209 + # rule is identical to 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: [t: "is not an element of"] + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [t: "not in"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [t: "not member of"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [t: "not element of"] + - else: [t: "not belonging to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [t: "is not a member of"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [t: "is not an element of"] + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [t: "is not in"] + - else: [t: "does not belong to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + - "∊": # 0x220a + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: + - test: + if: "$Verbosity!='Terse' and not(parent::m:set)" # "the set x is an element of ..." sounds bad + then: [t: "is"] + - t: "an element of" + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [t: "in"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [t: "member of"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [t: "element of"] + - else: [t: "belonging to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [t: "is a member of"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [t: "is an element of"] + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [t: "is in"] + - else: [t: "belongs to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' - "∋": [t: "contains the member"] # 0x220b - "∌": [t: "does not contain the member"] # 0x220c - "∍": [t: "contains the member"] # 0x220d - "∎": [t: "end of proof"] # 0x220e - "∏": [t: "product"] # 0x220f + - "∐": [t: "coproduct"] # 0x2210 - "∑": [t: "sum"] # 0x2211 - "−": [t: "minus"] # 0x2212 - "∓": [t: "minus or plus"] # 0x2213 @@ -658,6 +767,11 @@ then: [t: "dot"] else: [t: "times"] + - "√": # 0x221a + - test: + if: "$Verbosity!='Terse'" + then: [ot: "the"] + - t: "square root of" - "∛": # 0x221b - test: if: "$Verbosity!='Terse'" @@ -668,6 +782,11 @@ if: "$Verbosity!='Terse'" then: [ot: "the"] - t: "fourth root of" + - "∝": # 0x221d + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "proportional to" - "∞": [t: "infinity"] # 0x221e - "∟": [t: "right angle"] # 0x221f - "∠": [t: "angle"] # 0x2220 @@ -690,6 +809,11 @@ - "∳": [t: "anticlockwise contour integral"] # 0x2233 - "∎": [t: "therefore"] # 0x2234 - "∔": [t: "because"] # 0x2235 + - "∶": # 0x2236 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "to" - "∷": [t: "as"] # 0x2237 - "∞": [t: "dot minus"] # 0x2238 - "âˆč": [t: "has excess compared to"] # 0x2239 @@ -705,6 +829,11 @@ - t: "homothetic to" - "∌": [t: "varies with"] # 0x223c - "∜": [t: "reversed tilde"] # 0x223d + - "∟": # 0x223e + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "most positive" - "∿": [t: "sine wave"] # 0x223f - "≀": [t: "wreath product"] # 0x2240 - "≁": [t: "not tilde"] # 0x2241 @@ -806,6 +935,16 @@ then: [t: "is"] - t: "measured by" - "≟": [t: "has an unknown relationship with"] # 0x225f + - "≠": # 0x2260 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "not equal to" + - "≡": # 0x2261 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "identical to" - "≱": # 0x2262 - test: if: "$Verbosity!='Terse'" @@ -916,6 +1055,36 @@ - "≿": [t: "succeeds or is equivalent to"] # 0x227f - "⊀": [t: "does not precede"] # 0x2280 - "⊁": [t: "does not succeed"] # 0x2281 + - "⊂": # 0x2282 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is a"] + - t: "subset of" + - "⊃": # 0x2283 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is a"] + - t: "superset of" + - "⊄": # 0x2284 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "not a subset of" + - "⊅": # 0x2285 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "not a superset of" + - "⊆": # 0x2286 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is a"] + - t: "subset of or equal to" + - "⊇": # 0x2287 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is a"] + - t: "superset of or equal to" - "⊈": # 0x2288 - test: if: "$Verbosity!='Terse'" @@ -1229,7 +1398,7 @@ - "⏠": [t: "top tortoise shell bracket"] # 0x23e0 - "⏡": [t: "bottom tortoise shell bracket"] # 0x23e1 - "⏱": [t: "white trapezium"] # 0x23e2 - - "⏣": [t: "benzene ring with circle"] # 0x23e3 + - "⏣": [t: "benzene right with circle"] # 0x23e3 - "⏀": [t: "straightness"] # 0x23e4 - "⏄": [t: "flatness"] # 0x23e5 - "⏊": # 0x23e6 @@ -1281,7 +1450,7 @@ - t: "parenthesized" - spell: "translate('.', 'â’œâ’â’žâ’Ÿâ’ â’Ąâ’ąâ’Łâ’€â’„â’Šâ’§â’šâ’©â’Șâ’«â’Źâ’­â’źâ’Żâ’°â’±â’Čâ’łâ’Žâ’”', 'abcdefghijklmnopqrstuvwxyz')" - - "Ⓐ-Ⓩ": # 0x24b6 - 0x24cf + - "Ⓐ-ⓩ": # 0x24b6 - 0x24cf - t: "circled" - spell: "translate('.', 'â’¶â’·â’žâ’čâ’șâ’»â’Œâ’œâ’Ÿâ’żâ“€â“â“‚â“ƒâ“„â“…â“†â“‡â“ˆâ“‰â“Šâ“‹â“Œâ“â“Žâ“', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" @@ -1292,7 +1461,6 @@ - "ⓐ-ⓩ": # 0x24d0 - 0x24e9 - t: "circled" - spell: "translate('.', 'â“â“‘â“’â““â“”â“•â“–â“—â“˜â“™â“šâ“›â“œâ“â“žâ“Ÿâ“ â“Ąâ“ąâ“Łâ“€â“„â“Šâ“§â“šâ“©', 'abcdefghijklmnopqrstuvwxyz')" - - "â“Ș": [t: "circled zero"] # 0x24ea - "⓫": [t: "black circled eleven"] # 0x24eb - "⓬": [t: "black circled twelve"] # 0x24ec @@ -1444,7 +1612,7 @@ - "⚆": [t: "white circle with dot right"] # 0x2686 - "⚇": [t: "white circle wiht two dots"] # 0x2687 - "⚈": [t: "black circle with dot right"] # 0x2688 - - "⚉": [t: "black circle with two dots"] # 0x2689 + - "⚉": [t: "black circle wiht two dots"] # 0x2689 - "âšȘ": [t: "medium white circle"] # 0x26aa - "⚫": [t: "medium black circle"] # 0x26ab - "⚬": [t: "medium small white circle"] # 0x26ac @@ -2878,8 +3046,11 @@ - "": [t: "digamma"] # 0xed03 - "ϝ": [t: "digamma"] # 0x3dd - "": [t: "d"] # 0xed10 + - "ⅆ": [t: "d"] # 0x2146 - "": [t: "e"] # 0xed11 + - "ⅇ": [t: "e"] # 0x2147 - "": [t: "i"] # 0xed12 + - "ⅈ": [t: "i"] # 0x2148 - "": [t: "j"] # 0xed13 - "ⅅ": - spell: "translate('.', 'ⅅ', 'DD')" # 0xed16, 0x2145 @@ -3494,6 +3665,12 @@ then: [t: "bold"] - spell: "translate('.', '𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗', '0123456789')" + - "-": # 0xf52e - 0xf537 (old MathType) + - test: + if: "not($IgnoreBold)" + then: [t: "bold"] + - spell: "translate('.', '', '0123456789')" + - "𝟬-đŸ”": # 0x1D7EC - 0x1D7F5 - test: if: "not($IgnoreBold)" diff --git a/Rules/Languages/ru/ClearSpeak_Rules.yaml b/Rules/Languages/ru/ClearSpeak_Rules.yaml index c0955204c..0815c96c5 100644 --- a/Rules/Languages/ru/ClearSpeak_Rules.yaml +++ b/Rules/Languages/ru/ClearSpeak_Rules.yaml @@ -760,6 +760,24 @@ - pause: short - x: "*[3]" +# Handle log and ln when they remain individual mi elements rather than the +# canonical three-child function-application mrow handled by the next rule. +- name: ClearSpeak-log + tag: mi + match: ".='log' or .='ln'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity!='Terse' and following-sibling::*[2] and + not(IsNode(following-sibling::*[2],'simple'))" + then: [T: "ĐŸŃ‚"] + - test: + - if: ".='log'" + then: [T: "Đ»ĐŸĐłĐ°Ń€ĐžŃ„ĐŒ"] + - else_if: "$ClearSpeak_Log = 'LnAsNaturalLog'" + then: [T: "ĐœĐ°Ń‚ŃƒŃ€Đ°Đ»ŃŒĐœŃ‹Đč Đ»ĐŸĐłĐ°Ń€ĐžŃ„ĐŒ"] + else: [T: "ŃĐ» ŃĐœ"] + - name: ClearSpeak-log tag: mrow variables: [{log_is_simple: "IsNode(*[3],'simple')"}] diff --git a/Rules/Languages/ru/navigate.yaml b/Rules/Languages/ru/navigate.yaml index 527dcce60..01bc51a76 100644 --- a/Rules/Languages/ru/navigate.yaml +++ b/Rules/Languages/ru/navigate.yaml @@ -91,6 +91,15 @@ # Rules for speaking what happens when moving into or out of a notation +# Prefix/silent intents with no NavigationParts entry (for example, unary +# minus, a vector, or a modified variable) should not announce "in"/"out of". +- name: into-or-out-of-prefix-or-silent-without-parts + tag: "*" + match: "$Move2D != '' and + (contains(@data-intent-property, ':prefix:') or contains(@data-intent-property, ':silent:')) and + GetNavigationPartName(name(.), count($Child2D/preceding-sibling::*)) = ''" + replace: [] + - name: into-or-out-of-mfrac tag: "*" match: "$Move2D != '' and (@data-from-mathml='mfrac' or self::m:mfrac)" diff --git a/Rules/Languages/zh/tw/unicode-full.yaml b/Rules/Languages/zh/tw/unicode-full.yaml index d5d10ea6e..6b349a521 100644 --- a/Rules/Languages/zh/tw/unicode-full.yaml +++ b/Rules/Languages/zh/tw/unicode-full.yaml @@ -554,6 +554,7 @@ - "↉": [T: "侉戆äč‹0"] # 0x2189 (en: 'zero thirds', google translation) - "←": [T: "ć·Šçź­é ­"] # 0x2190 (en: 'leftwards arrow', google translation) - "↑": [T: "搑侊缭頭"] # 0x2191 (en: 'upwards arrow', google translation) + - "→": [T: "揳缭頭"] # 0x2192 (en: 'rightwards arrow') - "↓": [T: "搑例缭頭"] # 0x2193 (en: 'downwards arrow', google translation) - "↔": [T: "ć·Šćłçź­é ­"] # 0x2194 (en: 'left right arrow') - "↕": [T: "侊例缭頭"] # 0x2195 (en: 'up down arrow', google translation) diff --git a/build.rs b/build.rs index b8be2e9a9..a48b26033 100644 --- a/build.rs +++ b/build.rs @@ -151,6 +151,9 @@ fn zip_entry( /// Zip up each language and braille dir /// Note: regional variations (including zh-cn and zh-tw) are zipped together into one zip file fn main() { + println!("cargo::rerun-if-changed=build.rs"); + println!("cargo::rerun-if-changed=Rules"); + // This doesn't work because the build claims OUT_DIR is not defined(?) // let archive = PathBuf::from(concat!(env!("OUT_DIR"),"/rules.zip")); if std::env::var("CARGO_FEATURE_INCLUDE_ZIP").is_ok() { @@ -198,10 +201,5 @@ fn main() { if let Err(e) = archive_zip.finish() { panic!("Error in zip.finish(): {}", e); } - println!("cargo::rerun-if-changed=Rules"); - } else { - // Without include-zip, Rules are loaded at runtime from disk and must not - // re-run this script (or slow the build) on every yaml edit. - println!("cargo::rerun-if-changed=build.rs"); } } diff --git a/tests/Languages/en/mtable.rs b/tests/Languages/en/mtable.rs index cbd2a5275..e6952cf51 100644 --- a/tests/Languages/en/mtable.rs +++ b/tests/Languages/en/mtable.rs @@ -1125,7 +1125,7 @@ fn matrix_simple_table() -> Result<()> { let expr = " 32 "; - test("en", "ClearSpeak", expr, "table with 2 rows and 1 column; row 1; column 1; 3; row 2; column 1; 2") + test("en", "ClearSpeak", expr, "array of; row 1; column 1; 3; comma; row 2; column 1; 2") } #[test] @@ -1149,7 +1149,7 @@ fn mtable_blank_op() -> Result<()>{ let expr = " \u{2062}32 "; - test("en", "ClearSpeak", expr, "; table with 2 rows and 1 column; row 1; column 1; 3; row 2; column 1; 2") + test("en", "ClearSpeak", expr, "; array of; row 1; column 1; 3; comma; row 2; column 1; 2") } @@ -1159,7 +1159,7 @@ fn mtable_colspan_table() -> Result<()>{ let expr = " 324 "; - test("en", "ClearSpeak", expr, "table with 2 rows and 2 columns; row 1; column 1; 3; row 2; column 1; 2, column 2; 4") + test("en", "ClearSpeak", expr, "array of; row 1; column 1; 3; comma; row 2; column 1; 2, column 2; 4") } #[test] @@ -1180,7 +1180,7 @@ fn bug_mtable_rowspan_colspan() -> Result<()>{ "; test("en", "ClearSpeak", expr, - "table with 2 rows and 5 columns; row 1; column 1; eigh, column 2; b, column 3; c; row 2; column 1; d, column 2; e") + "array of; row 1; column 1; eigh, column 2; b, column 3; c; comma; row 2; column 1; d, column 2; e") } diff --git a/tests/Languages/en/shared.rs b/tests/Languages/en/shared.rs index b67126fd8..cf53eed5c 100644 --- a/tests/Languages/en/shared.rs +++ b/tests/Languages/en/shared.rs @@ -22,7 +22,7 @@ fn modified_vars() -> Result<()> { "; test("en", "SimpleSpeak", expr, "eigh grave, b tilde, c breve, b check, c grave; plus \ - r check, plus; x dot, y dot, z double dot, u triple dot, v quadruple dot; plus x hat, plus vector t")?; + r check plus; x dot, y dot, z double dot, u triple dot, v quadruple dot; plus x hat, plus vector t")?; return Ok(()); } @@ -337,7 +337,6 @@ fn ignore_comma() -> Result<()> { } #[test] -#[ignore] // issue #14 fn ignore_period_and_space() -> Result<()> { // from https://en.wikipedia.org/wiki/Probability let expr = " @@ -373,7 +372,7 @@ fn ignore_period_and_space() -> Result<()> { "; - test("en", "ClearSpeak", expr, "cap p, open paren, cap eigh divides cap b, close paren; is equal to; the fraction with numerator; cap p, open paren, cap eigh intersection cap b; close paren; and denominator cap p of cap b")?; + test("en", "ClearSpeak", expr, "cap p, open paren, cap eigh divides cap b, close paren; is equal to; the fraction with numerator; cap p, open paren, cap eigh intersection cap b; close paren; and denominator cap p of cap b; dot")?; return Ok(()); } @@ -415,7 +414,7 @@ fn dots() -> Result<()> { x..+ x... "; - test("en", "SimpleSpeak",expr, "x dot, plus x double dot, plus x triple dot")?; + test("en", "SimpleSpeak",expr, "x dot, plus x .., plus x ...")?; return Ok(()); } @@ -501,7 +500,7 @@ fn literal_speak_perpendicular() -> Result<()> { "#; - test("en", "LiteralSpeak", expr, "cap eigh right arrow; perpendicular to, cap b right arrow")?; + test("en", "LiteralSpeak", expr, "cap eigh right arrow, perpendicular to, cap b right arrow")?; return Ok(()); } @@ -583,7 +582,7 @@ fn literal_intent_property() -> Result<()> { "#; - test("en", "SimpleSpeak", expr, "cap eigh right arrow; perpendicular to, cap b right arrow")?; + test("en", "SimpleSpeak", expr, "cap eigh right arrow, perpendicular to, cap b right arrow")?; return Ok(()); } diff --git a/tests/Languages/fi/shared.rs b/tests/Languages/fi/shared.rs index fed99464f..4f3e7dfd2 100644 --- a/tests/Languages/fi/shared.rs +++ b/tests/Languages/fi/shared.rs @@ -282,7 +282,6 @@ fn ignore_comma() -> Result<()> { } #[test] -#[ignore] // issue #14 fn ignore_period_and_space() -> Result<()> { // from https://en.wikipedia.org/wiki/Probability let expr = " @@ -318,7 +317,7 @@ fn ignore_period_and_space() -> Result<()> { "; - test("fi", "ClearSpeak", expr, "phi of x is equal to; c, e raised to the negative h squared x squared power")?; + test("fi", "ClearSpeak", expr, "iso p, auki sulku, iso a jakaa iso b, kiinni sulku; on yhtĂ€ suuri kuin; murtoluku osoittaja; iso p, auki sulku, iso a leikkaus iso b, kiinni sulku; ja nimittĂ€jĂ€ iso p arvolla iso b")?; return Ok(()); } diff --git a/tests/Languages/fr/shared.rs b/tests/Languages/fr/shared.rs index b63588b52..b623252bd 100644 --- a/tests/Languages/fr/shared.rs +++ b/tests/Languages/fr/shared.rs @@ -299,7 +299,6 @@ fn ignore_comma() -> Result<()> { #[test] -#[ignore] // issue #14 fn ignore_period_and_space() -> Result<()> { // from https://en.wikipedia.org/wiki/Probability let expr = " @@ -335,7 +334,7 @@ fn ignore_period_and_space() -> Result<()> { "; - test("fr", "ClearSpeak", expr, "majuscule p; parenthĂšse gauche, majuscule a est un diviseur de, majuscule b; parenthĂšse droite; est Ă©gal Ă ; fraction, majuscule p; parenthĂšse gauche, majuscule a intersection majuscule b; parenthĂšse droite, sur, majuscule p de majuscule b, fin de fraction")?; + test("fr", "ClearSpeak", expr, "p majuscule; parenthĂšse gauche, a majuscule est un diviseur de, b majuscule; parenthĂšse droite; est Ă©gal Ă ; la fraction avec numĂ©rateur; p majuscule; parenthĂšse gauche, a majuscule intersection b majuscule; parenthĂšse droite; et dĂ©nominateur p majuscule de b majuscule")?; Ok(()) } diff --git a/tests/Languages/hu/shared.rs b/tests/Languages/hu/shared.rs index bd53bb4c3..23439e489 100644 --- a/tests/Languages/hu/shared.rs +++ b/tests/Languages/hu/shared.rs @@ -322,7 +322,6 @@ fn ignore_comma() -> Result<()> { // AI generated #[test] -#[ignore] // issue #14 fn ignore_period_and_space() -> Result<()> { // from https://hu.wikipedia.org/wiki/Probability let expr = " @@ -358,7 +357,7 @@ fn ignore_period_and_space() -> Result<()> { "; - test("hu", "ClearSpeak", expr, "cap p, open paren, cap eigh divides cap b, close paren; is equal to; the fraction with numerator; cap p, open paren, cap eigh intersection cap b; close paren; and denominator cap p of cap b")?; + test("hu", "ClearSpeak", expr, "nagy p; nyitott zĂĄrĂłjel, nagy a osztĂłja nagy b, zĂĄrt zĂĄrĂłjel; egyenlƑ; a tört, melynek szĂĄmlĂĄlĂłja; nagy p; nyitott zĂĄrĂłjel, nagy a metszĂ©spont nagy b; zĂĄrt zĂĄrĂłjel; nevezƑje pedig nagy p nagy b")?; return Ok(()); } diff --git a/tests/Languages/nb/shared.rs b/tests/Languages/nb/shared.rs index 4a7252b8f..cad60ddd4 100644 --- a/tests/Languages/nb/shared.rs +++ b/tests/Languages/nb/shared.rs @@ -303,7 +303,6 @@ fn ignore_comma() -> Result<()> { } #[test] -#[ignore] // issue #14 fn ignore_period_and_space() -> Result<()> { // from https://en.wikipedia.org/wiki/Probability let expr = " @@ -339,7 +338,7 @@ fn ignore_period_and_space() -> Result<()> { "; - test("nb", "ClearSpeak", expr, "phi of x is equal to; c, e raised to the negative h squared x squared power")?; + test("nb", "ClearSpeak", expr, "stor p; startparentes; stor a deler stor b; sluttparentes; er lik; brĂžken med teller; stor p; startparentes; stor a snitt stor b; sluttparentes; og nevner stor p av stor b")?; return Ok(()); } diff --git a/tests/Languages/pl/definitions.rs b/tests/Languages/pl/definitions.rs index 9ee9abcea..312075f80 100644 --- a/tests/Languages/pl/definitions.rs +++ b/tests/Languages/pl/definitions.rs @@ -707,14 +707,12 @@ fn geometry_prefix_tests() -> Result<()> { #[test] fn separator_tests() -> Result<()> { - let expr = format!( - " + let expr = " x y - " - ); + ".to_string(); test("pl", "ClearSpeak", &expr, "x y")?; Ok(()) @@ -1025,4 +1023,4 @@ fn nofix_default_fixity_tests() -> Result<()> { } Ok(()) -} \ No newline at end of file +} diff --git a/tests/Languages/pl/shared.rs b/tests/Languages/pl/shared.rs index 8f42a8f51..173c7d7fd 100644 --- a/tests/Languages/pl/shared.rs +++ b/tests/Languages/pl/shared.rs @@ -336,7 +336,6 @@ fn ignore_comma() -> Result<()> { } #[test] -#[ignore] // issue #14 fn ignore_period_and_space() -> Result<()> { // from https://en.wikipedia.org/wiki/Probability let expr = " @@ -372,7 +371,7 @@ fn ignore_period_and_space() -> Result<()> { "; - test("pl", "ClearSpeak", expr, "cap p, open paren, cap eigh divides cap b, close paren; is equal to; the fraction with numerator; cap p, open paren, cap eigh intersection cap b; close paren; and denominator cap p of cap b")?; + test("pl", "ClearSpeak", expr, "wielka p; nawias otwierający, wielka a dzieli wielka b; nawias zamykający; rĂłwna się; uƂamek z licznikiem; wielka p; nawias otwierający, wielka a przecięcie wielka b; nawias zamykający; i mianownikiem wielka p z wielka b")?; return Ok(()); } diff --git a/tests/Languages/ru.rs b/tests/Languages/ru.rs index 397e29a08..97edff4ee 100644 --- a/tests/Languages/ru.rs +++ b/tests/Languages/ru.rs @@ -31,4 +31,5 @@ mod units; mod chemistry; mod alphabets; mod intent; -mod mtable; \ No newline at end of file +mod mtable; +mod navigate; diff --git a/tests/Languages/ru/ClearSpeak/functions.rs b/tests/Languages/ru/ClearSpeak/functions.rs index 941e694d8..5171150f6 100644 --- a/tests/Languages/ru/ClearSpeak/functions.rs +++ b/tests/Languages/ru/ClearSpeak/functions.rs @@ -144,6 +144,22 @@ fn natural_log() -> Result<()> { return Ok(()); } +#[test] +fn individual_log_mi() -> Result<()> { + let expr = "log"; + test("ru", "ClearSpeak", expr, "Đ»ĐŸĐłĐ°Ń€ĐžŃ„ĐŒ")?; + return Ok(()); +} + +#[test] +fn individual_ln_mi() -> Result<()> { + let expr = "ln"; + test("ru", "ClearSpeak", expr, "ŃĐ» ŃĐœ")?; + test_ClearSpeak("ru", "ClearSpeak_Log", "LnAsNaturalLog", expr, + "ĐœĐ°Ń‚ŃƒŃ€Đ°Đ»ŃŒĐœŃ‹Đč Đ»ĐŸĐłĐ°Ń€ĐžŃ„ĐŒ")?; + return Ok(()); +} + #[test] fn explicit_function_call_with_parens() -> Result<()> { let expr = "t⁡(x)"; diff --git a/tests/Languages/ru/navigate.rs b/tests/Languages/ru/navigate.rs new file mode 100644 index 000000000..690df9eff --- /dev/null +++ b/tests/Languages/ru/navigate.rs @@ -0,0 +1,56 @@ +//! Russian navigation speech for prefix/silent intents without NavigationParts. + +use crate::common::*; +use anyhow::Result; +use std::panic::{catch_unwind, AssertUnwindSafe}; + +fn init_nav(mathml: &str) -> Result<()> { + set_rules_dir(abs_rules_dir_path())?; + set_preference("Language", "ru")?; + set_preference("SpeechStyle", "SimpleSpeak")?; + set_preference("Verbosity", "Medium")?; + set_preference("NavMode", "Enhanced")?; + set_preference("NavVerbosity", "Verbose")?; + set_preference("AutoZoomOut", "False")?; + set_preference("Overview", "False")?; + set_mathml(mathml)?; + Ok(()) +} + +fn assert_zoom_in(mathml: &str, expected: &str) -> Result<()> { + init_panic_handler(); + let result = catch_unwind(AssertUnwindSafe(|| { + init_nav(mathml)?; + let speech = do_navigate_command("ZoomIn")?; + let trimmed_speech = speech.trim_end_matches([' ', ',', ';']).to_string(); + assert_eq!(expected, trimmed_speech); + Ok(()) + })); + report_any_panic(result) +} + +#[test] +fn no_parts_prefix_vector_suppresses_base_announcement() -> Result<()> { + let expr = r#" + + + v + → + + + "#; + assert_zoom_in(expr, "ĐżĐ”Ń€Đ”Ń…ĐŸĐŽ ĐČĐœŃƒŃ‚Ń€ŃŒ; ĐČэ") +} + +#[test] +fn no_parts_silent_modified_variable_suppresses_base_announcement() -> Result<()> { + let expr = r#" + + + x + ^ + + + "#; + assert_zoom_in(expr, "ĐżĐ”Ń€Đ”Ń…ĐŸĐŽ ĐČĐœŃƒŃ‚Ń€ŃŒ; ĐžĐșс") +} diff --git a/tests/Languages/sv/shared.rs b/tests/Languages/sv/shared.rs index 4ee13f6fb..99e281614 100644 --- a/tests/Languages/sv/shared.rs +++ b/tests/Languages/sv/shared.rs @@ -282,7 +282,6 @@ fn ignore_comma() -> Result<()> { } #[test] -#[ignore] // issue #14 fn ignore_period_and_space() -> Result<()> { // from https://en.wikipedia.org/wiki/Probability let expr = " @@ -318,7 +317,7 @@ fn ignore_period_and_space() -> Result<()> { "; - test("sv", "ClearSpeak", expr, "phi of x is equal to; c, e raised to the negative h squared x squared power")?; + test("sv", "ClearSpeak", expr, "versal p; vĂ€nster-parentes; versal a delar versal b; höger-parentes; lika med; division med tĂ€ljaren; versal p; vĂ€nster-parentes; versal a snittet versal b; höger-parentes; och nĂ€mnaren versal p av versal b")?; return Ok(()); } diff --git a/tests/Languages/vi/vi.rs b/tests/Languages/vi/vi.rs index aa95f0e1f..3b6d8dee4 100644 --- a/tests/Languages/vi/vi.rs +++ b/tests/Languages/vi/vi.rs @@ -43,19 +43,17 @@ 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ĂŁ")?; + test_prefs("vi", "ClearSpeak", vec![("Verbosity", "Medium")], expr, "IX cộng VIII, báș±ng XVII")?; + test_prefs("vi", "ClearSpeak", vec![("Verbosity", "Verbose")], expr, "IX cộng VIII, báș±ng XVII")?; return Ok(()); } #[test] -#[ignore] fn vi_units_1() -> Result<()> { let expr = "1táș„n10táșĄ100yáșżnvĂ 4lĂ­t"; - test("vi", "ClearSpeak", expr, "1 táș„n 10 táșĄ 100 yáșżn vĂ  4 lĂ­t")?; + test("vi", "ClearSpeak", expr, "1 táș„n 10 táșĄ 100 yáșżnvĂ  4 lĂ­t")?; return Ok(()); } diff --git a/tests/Languages/zh/tw/shared.rs b/tests/Languages/zh/tw/shared.rs index 3d9474687..424958a50 100644 --- a/tests/Languages/zh/tw/shared.rs +++ b/tests/Languages/zh/tw/shared.rs @@ -300,7 +300,6 @@ fn ignore_comma() -> Result<()> { } #[test] -#[ignore] // issue #14 fn ignore_period_and_space() -> Result<()> { // from https://en.wikipedia.org/wiki/Probability let expr = " @@ -336,7 +335,7 @@ fn ignore_period_and_space() -> Result<()> { "; -test("zh-tw", "SimpleSpeak", expr, "性毫 p, ć·Šć°æ‹Ź, 性毫 a 枂線 性毫 b, ćłć°æ‹Ź; 等斌; ćˆ†æ•ž 性毫 p 性毫 b, 戆äč‹, 性毫 p, ć·Šć°æ‹Ź, 性毫 a äș€é›† 性毫 b, ćłć°æ‹Ź ç”æŸćˆ†æ•ž; 點")?; +test("zh-tw", "SimpleSpeak", expr, "性毫 p, ć·Šć°æ‹Ź, 性毫 a 敎陀 性毫 b, ćłć°æ‹Ź; 等斌; ćˆ†æ•ž 性毫 p 性毫 b, 戆äč‹, 性毫 p, ć·Šć°æ‹Ź, 性毫 a äș€é›† 性毫 b, ćłć°æ‹Ź ç”æŸćˆ†æ•ž; 點")?; return Ok(()); } diff --git a/tests/braille/Russian/russian.rs b/tests/braille/Russian/russian.rs index 5138fb374..1b40f13b7 100644 --- a/tests/braille/Russian/russian.rs +++ b/tests/braille/Russian/russian.rs @@ -1387,6 +1387,35 @@ fn source_less_common_math_symbols_11() -> Result<()> { return test_russian_braille(r#"a∤b"#, "⠠⠁⠀⠌⠀⠃"); } +#[test] +fn source_gost_order_relations_greater_or_less() -> Result<()> { + return test_russian_braille(r#"x≷y"#, "⠠⠭⠀⠕â Ș⠀⠜"); +} + +#[test] +fn source_gost_order_relations_less_or_greater() -> Result<()> { + return test_russian_braille(r#"x≶y"#, "⠠⠭⠀â Ș⠕⠀⠜"); +} + +#[test] +fn source_gost_large_vertical_arrows() -> Result<()> { + test_russian_braille(r#"↑"#, "⠰⠌")?; + return test_russian_braille(r#"↓"#, "⠘⠥"); +} + +#[test] +fn source_gost_contextual_square_bracket_recognition_points() -> Result<()> { + test_russian_braille(r#"[x]"#, "â  â ·â  â ­â  â Ÿ")?; + return test_russian_braille(r#"[1]"#, "⠷⠌⠁⠟"); +} + +#[test] +fn source_gost_contextual_angle_bracket_recognition_points() -> Result<()> { + test_russian_braille(r#"⟨x⟩"#, "⠈â Ș⠠⠭⠈⠕")?; + test_russian_braille(r#"⟨1⟩"#, "â Ș⠌⠁⠕")?; + return test_russian_braille(r#"x<y"#, "⠠⠭⠀â Ș⠀⠜"); +} + #[test] fn source_typeform_and_mathvariant_indicators() -> Result<()> { let expr = r#"x"#; From 0380bb0ea1e696c47e692d86521364eacdda8fe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Sat, 15 Aug 2026 10:23:14 +0200 Subject: [PATCH 030/162] Remove unused and commented-out code (#680) * Remove unused and commented-out code in `src/pretty_print.rs`. * remove more dead sections --- src/chemistry.rs | 9 --------- src/pretty_print.rs | 32 -------------------------------- src/speech.rs | 11 ----------- 3 files changed, 52 deletions(-) diff --git a/src/chemistry.rs b/src/chemistry.rs index 1266b4087..1176d8d3a 100644 --- a/src/chemistry.rs +++ b/src/chemistry.rs @@ -1258,15 +1258,6 @@ fn is_order_ok(mrow: Element) -> bool { } } -// from https://learnwithdrscott.com/ionic-bond-definition/ -// I don't include the noble gases since they don't interact with other elements and are ruled out elsewhere -// fn has_non_metal_element(elements: &[&str]) -> bool { -// static NON_METAL_ELEMENTS: phf::Set<&str> = phf_set! { -// "H", "B", "C", "N", "O", "F", "Si", "P", "S", "Cl", "As", "Se", "Br", "Te", "I", "At", -// }; -// return elements.iter().any(|&e| NON_METAL_ELEMENTS.contains(e)); -// } - fn has_noble_element(elements: &[NameStr<'_>]) -> bool { static NOBLE_ELEMENTS: phf::Set<&str> = phf_set! { diff --git a/src/pretty_print.rs b/src/pretty_print.rs index 674157949..6a3ccd979 100644 --- a/src/pretty_print.rs +++ b/src/pretty_print.rs @@ -4,15 +4,6 @@ use sxd_document_no_unsafe::dom::{Element, ChildOfElement, Attribute}; use sxd_document_no_unsafe::{as_str, as_qname}; -// #[allow(dead_code)] -// pub fn pp_doc(doc: &Document) { -// for root_child in doc.root().children() { -// if let ChildOfRoot::Element(e) = root_child { -// format_element(&e, 0); -// break; -// } -// }; -// } /// Pretty-print the MathML represented by `element`. pub fn mml_to_string(e: Element) -> String { @@ -89,23 +80,6 @@ fn handle_special_chars(text: &str) -> String { } -// /// Pretty print an xpath value. -// /// If the value is a `NodeSet`, the MathML for the node/element is returned. -// pub fn pp_xpath_value(value: Value) { -// use sxd_xpath_no_unsafe::Value; -// use sxd_xpath_no_unsafe::nodeset::Node; -// debug!("XPath value:"); -// if let Value::Nodeset(nodeset) = &value { -// for node in nodeset.document_order() { -// match node { -// Node::Element(el) => {debug!("{}", crate::pretty_print::format_element(&el, 1))}, -// Node::Text(t) => {debug!("found Text value: {}", t.text())}, -// _ => {debug!("found unexpected node type")} -// } -// } -// } -// } - /// Convert YAML to a string using with `indent` amount of space. pub fn yaml_to_string(yaml: &Yaml, indent: usize) -> String { let mut result = String::new(); @@ -288,12 +262,6 @@ impl<'a> YamlEmitter<'a> { self.compact } - // fn dump(&mut self, doc: &Yaml) -> EmitResult { - // // write DocumentStart - // writeln!(self.writer, "---")?; - // self.level = -1; - // self.emit_node(doc) - // } fn write_indent(&mut self) -> EmitResult { if self.level <= 0 { diff --git a/src/speech.rs b/src/speech.rs index 960b105e3..0aaf71405 100644 --- a/src/speech.rs +++ b/src/speech.rs @@ -206,17 +206,6 @@ fn yaml_type_err(yaml: &Yaml, str: &str) -> Error { anyhow!("Expected {}, found {}", str, yaml_to_type(yaml)) } -// fn yaml_key_err(dict: &Yaml, key: &str, yaml_type: &str) -> String { -// if dict.as_hash().is_none() { -// return format!("Expected dictionary with key '{}', found\n{}", key, yaml_to_string(dict, 1)); -// } -// let str = &dict[key]; -// if str.is_badvalue() { -// return format!("Did not find '{}' in\n{}", key, yaml_to_string(dict, 1)); -// } -// return format!("Type of '{}' is not a {}.\nIt is a {}. YAML value is\n{}", -// key, yaml_type, yaml_to_type(str), yaml_to_string(dict, 0)); -// } fn find_str<'a>(dict: &'a Yaml, key: &'a str) -> Option<&'a str> { return dict[key].as_str(); From d4a112a8a9688a68b0ba3504483c094e4a630377 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Sat, 15 Aug 2026 13:56:14 +0200 Subject: [PATCH 031/162] Update demo link in developers documentation Updated the MathJax demo link to MathCAT demo with additional context. --- docs/developers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/developers.md b/docs/developers.md index 331a16d78..cae5e58ec 100644 --- a/docs/developers.md +++ b/docs/developers.md @@ -76,7 +76,7 @@ fn test_simple_fraction() { ## Helpful Links -* [MathJax Demo](https://www.mathjax.org/#demo): lets you paste a MathML fragment and inspect its browser rendering. +* [MathCAT Demo]([https://www.mathjax.org/#demo](https://daisy.github.io/MathCATDemo/)): lets you paste a MathML fragment and inspect its displayed math, speech and braille. ### Test Coverage From 6ecc412cb591b15f6eb871389d19e14cc924780c Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Sun, 16 Aug 2026 00:41:56 -0700 Subject: [PATCH 032/162] Did cleanup with ranges to shrink file size. The big win was the 'id' dir which hadn't had ranges added. That was a 225k reduction. The rest only shortened the files by a bit over 9k. I also made sure that italic letters did NOT use an italic indicator. Awaiting feedback about whether that is correct for Russian. The other changes were smaller cleanups including always translating to lowercase letters in letter ranges (by adding "C"). --- Rules/Braille/CMU/unicode-full.yaml | 56 +- Rules/Braille/CMU/unicode.yaml | 85 +- Rules/Braille/Nemeth/unicode-full.yaml | 2739 +++++---- Rules/Braille/Nemeth/unicode.yaml | 30 +- Rules/Braille/Russian/unicode-full.yaml | 58 +- Rules/Braille/Swedish/unicode-full.yaml | 84 +- Rules/Braille/Swedish/unicode.yaml | 30 +- Rules/Braille/UEB/unicode-full.yaml | 104 +- Rules/Braille/UEB/unicode.yaml | 87 +- Rules/Braille/Vietnam/unicode-full.yaml | 79 +- Rules/Braille/Vietnam/unicode.yaml | 30 +- Rules/Languages/id/unicode-full.yaml | 7024 ++--------------------- src/braille.rs | 74 +- tests/braille/UEB/other.rs | 28 + 14 files changed, 2235 insertions(+), 8273 deletions(-) diff --git a/Rules/Braille/CMU/unicode-full.yaml b/Rules/Braille/CMU/unicode-full.yaml index 492f95c51..558972fcf 100644 --- a/Rules/Braille/CMU/unicode-full.yaml +++ b/Rules/Braille/CMU/unicode-full.yaml @@ -10,7 +10,7 @@ - "𝐀-𝐙": # 0x1d400 - 0x1d419 - tc: "BC" - - spell: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - spell: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'abcdefghijklmnopqrstuvwxyz')" # don't mark these as italic - "𝑎-𝑧": # 0x1d44e - 0x1d467 @@ -19,15 +19,15 @@ - "𝐮-𝑍": # 0x1d434 - 0x1d44d - tc: "C" - - spell: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - spell: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'abcdefghijklmnopqrstuvwxyz')" - "𝒂-𝒛": # 0x1d482 - 0x1d49b - - tc: "BI" + - tc: "B" - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" - "𝑹-𝒁": # 0x1d468 - 0x1d481 - - tc: "BIC" - - spell: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - tc: "BC" + - spell: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'abcdefghijklmnopqrstuvwxyz')" - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf - tc: "Ts" @@ -35,7 +35,7 @@ - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 - tc: "TsC" - - spell: "translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - spell: "translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'abcdefghijklmnopqrstuvwxyz')" - "ℊ": [t: "TL⠛⠁"] # 0x210a (Script Small G) - "ℋ": [t: "TCL⠓⠁"] # 0x210b (Script Capital H) @@ -54,15 +54,15 @@ - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 - tc: "BTsC" - - spell: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - spell: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'abcdefghijklmnopqrstuvwxyz')" - "𝔞-đ”·": # 0x1d51e - 0x1d537 - tc: "D" - spell: "translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz')" - "𝔄-𝔝": # 0x1d504 - 0x1d51d - - tc: "D" - - spell: "translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'ABCDEFGJKLMNOPQSTUVWXY')" + - tc: "DC" + - spell: "translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'abcdefgjklmnopqstuvwxy')" - "ℌ": [t: "DCL⠓"] # 0x210C (Fraktur Capital H) - "ℑ": [t: "DCL⠊"] # 0x2111 (Fraktur Capital I) @@ -73,8 +73,8 @@ - spell: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" - "𝔾-𝕐": # 0x1d538 - 0x1d550 (blackboard bold capitals, excluding special number sets) - - tc: "D" - - spell: "translate('.', '𝔾đ”čđ”»đ”Œđ”œđ”Ÿđ•€đ•đ•‚đ•ƒđ•„đ•†đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'ABCDEFGHIJKLMNOPQRST')" + - tc: "đ”čC" + - spell: "translate('.', '𝔾đ”čđ”»đ”Œđ”œđ”Ÿđ•€đ•đ•‚đ•ƒđ•„đ•†đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'abcdefghijklmnopqrst')" - "ℂ": [t: "⠾⠉"] # 0x2102 (nĂșmeros complejos) - "ℍ": [t: "⠾⠓"] # 0x210D (cuaterniones) @@ -86,11 +86,11 @@ - "𝖆-𝖟": # 0x1d586 - 0x1d59f - tc: "BD" - - spell: "translate('.', 'abcdefghijklmnopqrstuvwxyz', 'abcdefghijklmnopqrstuvwxyz')" + - spell: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" - "𝕬-𝖅": # 0x1d56c - 0x1d585 - tc: "BDC" - - spell: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - spell: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'abcdefghijklmnopqrstuvwxyz')" - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 - tc: "S" @@ -98,7 +98,7 @@ - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 - tc: "SC" - - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'abcdefghijklmnopqrstuvwxyz')" - "𝗼-𝘇": # 0x1d5ee - 0x1d607 - tc: "BS" @@ -106,23 +106,23 @@ - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed - tc: "BSC" - - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'abcdefghijklmnopqrstuvwxyz')" - "𝘱-đ˜»": # 0x1d622 - 0x1d63b - - tc: "IS" + - tc: "S" - spell: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" - "𝘈-𝘡": # 0x1d608 - 0x1d621 - - tc: "ISC" - - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - tc: "SC" + - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'abcdefghijklmnopqrstuvwxyz')" - "𝙖-𝙯": # 0x1d656 - 0x1d66f - - tc: "BILS" + - tc: "BS" - spell: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 - - tc: "BILSC" - - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - tc: "BSC" + - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'abcdefghijklmnopqrstuvwxyz')" - "𝚊-𝚣": # 0x1d68a - 0x1d6a3 - tc: "" @@ -130,7 +130,7 @@ - "𝙰-𝚉": # 0x1d670 - 0x1d689 - tc: "C" - - spell: "translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - spell: "translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'abcdefghijklmnopqrstuvwxyz')" - "đš€": [t: "L⠊"] # 0x1d6a4 (dotless i) - "đš„": [t: "L⠚"] # 0x1d6a5 (dotless j) @@ -143,19 +143,19 @@ - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšż', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšż')" - "đ›Œ-𝜓": # 0x1d6fc - 0x1d713 - - tc: "IGL" + - tc: "GL" - spell: "translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“')" - "𝛱-đ›č": # 0x1d6e2 - 0x1d6f9 - - tc: "ICGL" + - tc: "CGL" - spell: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›č', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›č')" - "đœ¶-𝝍": # 0x1d736 - 0x1d74d - - tc: "BIGL" + - tc: "BGL" - spell: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđ', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđ')" - "𝜜-𝜳": # 0x1d71c - 0x1d733 - - tc: "BICGL" + - tc: "BCGL" - spell: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳')" - "𝝰-𝞇": # 0x1d770 - 0x1d787 @@ -167,11 +167,11 @@ - spell: "translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­')" - "đžȘ-𝟁": # 0x1d7aa - 0x1d7c1 - - tc: "BISGL" + - tc: "BSGL" - spell: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸ', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸ')" - "𝞐-𝞧": # 0x1d790 - 0x1d7a7 - - tc: "BISCGL" + - tc: "BSCGL" - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§')" - "𝟎-𝟗": # 0x1d7ce - 0x1d7d7 diff --git a/Rules/Braille/CMU/unicode.yaml b/Rules/Braille/CMU/unicode.yaml index b7ce85a1b..fa027b0b6 100644 --- a/Rules/Braille/CMU/unicode.yaml +++ b/Rules/Braille/CMU/unicode.yaml @@ -107,84 +107,17 @@ - "Û": [t: "CLâ Ÿ"] # 0xDA - "Ü": [t: "CLâ ł"] # 0xDC - - "A": [t: "CL⠁"] # 0x41 - - "B": # 0x42 + # Latin capitals: chem-element letters use đ¶ (no word indicator); others use C. + # Cells come from lowercase a-z via spell/translate. + - "BCHIKNOPSUVWY": # chemistry-capable capitals - test: if: "@data-chem-element" - then: [t: "đ¶L⠃"] - else: [t: "CL⠃"] - - "C": # 0x43 - - test: - if: "@data-chem-element" - then: [t: "đ¶L⠉"] - else: [t: "CL⠉"] - - "D": [t: "CL⠙"] # 0x44 - - "E": [t: "CL⠑"] # 0x45 - - "F": [t: "CL⠋"] # 0x46 - - "G": [t: "CL⠛"] # 0x47 - - "H": # 0x48 - - test: - if: "@data-chem-element" - then: [t: "đ¶L⠓"] - else: [t: "CL⠓"] - - "I": # 0x49 - - test: - if: "@data-chem-element" - then: [t: "đ¶L⠊"] - else: [t: "CL⠊"] - - "J": [t: "CL⠚"] # 0x4a - - "K": # 0x4b - - test: - if: "@data-chem-element" - then: [t: "đ¶L⠅"] - else: [t: "CL⠅"] - - "L": [t: "CL⠇"] # 0x4c - - "M": [t: "CL⠍"] # 0x4d - - "N": # 0x4e - - test: - if: "@data-chem-element" - then: [t: "đ¶L⠝"] - else: [t: "CL⠝"] - - "O": # 0x4f - - test: - if: "@data-chem-element" - then: [t: "đ¶L⠕"] - else: [t: "CL⠕"] - - "P": # 0x50 - - test: - if: "@data-chem-element" - then: [t: "đ¶L⠏"] - else: [t: "CL⠏"] - - "Q": [t: "CL⠟"] # 0x51 - - "R": [t: "CL⠗"] # 0x52 - - "S": # 0x53 - - test: - if: "@data-chem-element" - then: [t: "đ¶L⠎"] - else: [t: "CL⠎"] - - "T": [t: "CL⠞"] # 0x54 - - "U": # 0x55 - - test: - if: "@data-chem-element" - then: [t: "đ¶Lâ „"] - else: [t: "CLâ „"] - - "V": # 0x56 - - test: - if: "@data-chem-element" - then: [t: "đ¶Lâ §"] - else: [t: "CLâ §"] - - "W": # 0x57 - - test: - if: "@data-chem-element" - then: [t: "đ¶Lâ ș"] - else: [t: "CLâ ș"] - - "X": [t: "CLâ ­"] # 0x58 - - "Y": # 0x59 - - test: - if: "@data-chem-element" - then: [t: "đ¶Lâ œ"] - else: [t: "CLâ œ"] - - "Z": [t: "CLâ ”"] # 0x5a + then: [tc: "đ¶"] + else: [tc: "C"] + - spell: "translate('.', 'BCHIKNOPSUVWY', 'bchiknopsuvwy')" + - "ADEFGJLMQRTXZ": # remaining capitals + - tc: "C" + - spell: "translate('.', 'ADEFGJLMQRTXZ', 'adefgjlmqrtxz')" - "α": [t: "GL⠁"] # 0x3b1 - "ÎČ": [t: "GL⠃"] # 0x3b2 diff --git a/Rules/Braille/Nemeth/unicode-full.yaml b/Rules/Braille/Nemeth/unicode-full.yaml index 06831aec3..935933a2a 100644 --- a/Rules/Braille/Nemeth/unicode-full.yaml +++ b/Rules/Braille/Nemeth/unicode-full.yaml @@ -1,1375 +1,1364 @@ ---- -# To greatly simplify typeface/language generation, the chars have unique ASCII chars for them: -# Typeface: S: sans-serif, B: bold, T: script/blackboard, I: italic, R: Roman -# Language: E: English, D: German, G: Greek, V: Greek variants, H: Hebrew, U: Russian -# Indicators: C: capital, L: letter, N: number, P: punctuation, M: multipurpose -# Others: W -- whitespace that should be kept (e.g, in a numeral) -# SRE doesn't have H: Hebrew, so not encoded (yet) -# Some of the weird letters (e.g., circled letters) I didn't translate with the above because -# they don't interact with rules since they are enclosed in other chars. - - - "⚯": [t: "⠈⠥"] # U+2A2F(VECTOR OR CROSS PRODUCT) -- make the same as 0x00D7 (Multiplication sign) - - # --- Nemeth Default Alphabet bold chars. --- - - "𝐀-𝐙": # 0x1d400 - 0x1d419 - - tc: "BE" - - spell: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - "𝐚-𝐳": # 0x1d41a - 0x1d433 - - tc: "BE" - - spell: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝚹-𝛀": # 0x1d6a8 - 0x1d6c0 - - tc: "BG" - - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "𝛂-𝛒": # 0x1d6c2 - 0x1d6d2 - - tc: "BG" - - spell: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" - - - "𝛔-𝛖": # 0x1d6d4 - 0x1d6d6 - - tc: "BG" - - spell: "translate('.', '𝛔𝛕𝛖', 'στυ')" - - - "𝛘-𝛚": # 0x1d6d8 - 0x1d6da - - tc: "BG" - - spell: "translate('.', '𝛘𝛙𝛚', 'χψω')" - - - "𝛁": [tc: "BGLâ «"] # 0x1d6c1 - - "𝛓": [tc: "BVL⠎"] # 0x1d6d3 - - "𝛗": [tc: "BVL⠋"] # 0x1d6d7 - - "𝛛": [tc: "⠾⠈⠙"] # 0x1d6db - - "𝛜": [tc: "BGL⠑"] # 0x1d6dc - - "𝛝": [tc: "BVLâ č"] # 0x1d6dd - - "𝛞": [tc: "BGL⠅"] # 0x1d6de - - "𝛟": [tc: "BGL⠋"] # 0x1d6df - - "𝛠": [tc: "BGL⠗"] # 0x1d6e0 - - "𝛡": [tc: "BGL⠏"] # 0x1d6e1 - - - "𝟎-𝟗": # 0x1d7ce - 0x1d7d7 - - tc: "B" - - spell: "translate('.', '𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗', '0123456789')" - - # --- Nemeth Default Alphabet bold-fraktur chars. --- - - - "𝕬-𝖅": # 0x1d56c - 0x1d585 - - tc: "BD" - - spell: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝖆-𝖟": # 0x1d586 - 0x1d59f - - tc: "BD" - - spell: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" - - # --- Nemeth Default Alphabet bold-italic chars. --- - - "𝑹-𝒁": # 0x1d468 - 0x1d481 - - tc: "BIE" - - spell: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝒂-𝒛": # 0x1d482 - 0x1d49b - - tc: "BIE" - - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝜜-𝜮": # 0x1d71c - 0x1d734 - - tc: "BIG" - - spell: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳𝜮', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "đœ”": [tc: "BIGLâ «"] # 0x1d735 - - - "đœ¶-𝝆": # 0x1d736 - 0x1d746 - - tc: "BIG" - - spell: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" - - - "𝝇": [tc: "BIVL⠎"] # 0x1d747 - - - "𝝈-𝝊": # 0x1d748 - 0x1d74a - - tc: "BIG" - - spell: "translate('.', '𝝈𝝉𝝊', 'στυ')" - - - "𝝋": [tc: "BIVL⠋"] # 0x1d74b - - - "𝝌-𝝎": # 0x1d74c - 0x1d74e - - tc: "BIG" - - spell: "translate('.', '𝝌𝝍𝝎', 'χψω')" - - - "𝝏": [tc: "BVL⠙"] # 0x1d74f - - "𝝐": [tc: "BIGL⠑"] # 0x1d750 - - "𝝑": [tc: "BIVLâ č"] # 0x1d751 - - - "𝝒-𝝕": # 0x1d752 - 0x1d755 - - tc: "BIG" - - spell: "translate('.', '𝝒𝝓𝝔𝝕', 'Îșφρπ')" - - # --- Nemeth Default Alphabet bold-script chars. --- - - - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 - - tc: "BTE" - - spell: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "đ“Ș-𝔃": # 0x1d4ea - 0x1d503 - - tc: "BTE" - - spell: "translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz')" - - - "đš€-đš„": # 0x1d6a4 - 0x1d6a5 - - tc: "" - - spell: "translate('.', 'đš€đš„', '⠊⠚')" - -# Russian Alphabet (from Nemeth book) -# NOTE: is this translation needed? - - "А-ĐŻ": # 0x410 - 0x42f - - tc: "U" - - spell: "translate('.', 'ĐĐ‘Đ’Đ“Đ”Đ•Đ—Đ˜Đ™ĐšĐ›ĐœĐĐžĐŸĐ ĐĄĐąĐŁĐ€Đ­', 'ABVGDEZIYKLMNOPRSTUFE')" - - - "а-я": # 0x430 - 0x44f - - tc: "U" - - spell: "translate('.', 'абĐČгЎДзОĐčĐșĐ»ĐŒĐœĐŸĐżŃ€ŃŃ‚ŃƒŃ„Ń', 'abvgdeziylkmnoprstufye')" - - - "①-⑹": # 0x2460 - 0x2473 - - tc: "⠫⠉⠞⠫⠌" - - spell: "translate('.', '①⑥⑹④⑀⑄⑊⑧⑚', '123456789')" - - tc: "â »" - - - "â“Ș": [tc: "⠫⠉⠞⠫⠌⠎⠻"] # 0x24ea - - - "⑩": [tc: "⠫⠉⠞⠫⠌⠂⠎⠻"] # 0x2469 - - "â‘Ș": [tc: "⠫⠉⠞⠫⠌⠂⠂⠻"] # 0x246a - - "⑫": [tc: "⠫⠉⠞⠫⠌⠂⠆⠻"] # 0x246b - - "⑬": [tc: "⠫⠉⠞⠫⠌⠂⠒⠻"] # 0x246c - - "⑭": [tc: "⠫⠉⠞⠫⠌⠂â Čâ »"] # 0x246d - - "⑼": [tc: "â «â ‰â žâ «â Œâ ‚â ąâ »"] # 0x246e - - "⑯": [tc: "⠫⠉⠞⠫⠌⠂⠖⠻"] # 0x246f - - "⑰": [tc: "⠫⠉⠞⠫⠌⠂⠶⠻"] # 0x2470 - - "⑱": [tc: "⠫⠉⠞⠫⠌⠂⠊⠻"] # 0x2471 - - "â‘Č": [tc: "⠫⠉⠞⠫⠌⠂⠔⠻"] # 0x2472 - - "⑳": [tc: "⠫⠉⠞⠫⠌⠆⠎⠻"] # 0x2473 - - - "㉑": [tc: "⠫⠉⠞⠫⠌⠆⠂⠻"] # 0x3251 - - "㉒": [tc: "⠫⠉⠞⠫⠌⠆⠆⠻"] # 0x3252 - - "㉓": [tc: "⠫⠉⠞⠫⠌⠆⠒⠻"] # 0x3253 - - "㉔": [tc: "⠫⠉⠞⠫⠌⠆â Čâ »"] # 0x3254 - - "㉕": [tc: "â «â ‰â žâ «â Œâ †â ąâ »"] # 0x3255 - - "㉖": [tc: "⠫⠉⠞⠫⠌⠆⠖⠻"] # 0x3256 - - "㉗": [tc: "⠫⠉⠞⠫⠌⠆⠶⠻"] # 0x3257 - - "㉘": [tc: "⠫⠉⠞⠫⠌⠆⠊⠻"] # 0x3258 - - "㉙": [tc: "⠫⠉⠞⠫⠌⠆⠔⠻"] # 0x3259 - - "㉚": [tc: "⠫⠉⠞⠫⠌⠒⠎⠻"] # 0x325a - - "㉛": [tc: "⠫⠉⠞⠫⠌⠒⠂⠻"] # 0x325b - - "㉜": [tc: "⠫⠉⠞⠫⠌⠒⠆⠻"] # 0x325c - - "㉝": [tc: "⠫⠉⠞⠫⠌⠒⠒⠻"] # 0x325d - - "㉞": [tc: "⠫⠉⠞⠫⠌⠒â Čâ »"] # 0x325e - - "㉟": [tc: "â «â ‰â žâ «â Œâ ’â ąâ »"] # 0x325f - - "㊱": [tc: "⠫⠉⠞⠫⠌⠒⠖⠻"] # 0x32b1 - - "ăŠČ": [tc: "⠫⠉⠞⠫⠌⠒⠶⠻"] # 0x32b2 - - "㊳": [tc: "⠫⠉⠞⠫⠌⠒⠊⠻"] # 0x32b3 - - "㊮": [tc: "⠫⠉⠞⠫⠌⠒⠔⠻"] # 0x32b4 - - "㊔": [tc: "⠫⠉⠞⠫⠌â Čâ Žâ »"] # 0x32b5 - - "㊶": [tc: "⠫⠉⠞⠫⠌â Č⠂⠻"] # 0x32b6 - - "㊷": [tc: "⠫⠉⠞⠫⠌â Č⠆⠻"] # 0x32b7 - - "㊾": [tc: "⠫⠉⠞⠫⠌â Č⠒⠻"] # 0x32b8 - - "ăŠč": [tc: "⠫⠉⠞⠫⠌â Čâ Čâ »"] # 0x32b9 - - "ăŠș": [tc: "⠫⠉⠞⠫⠌â Čâ ąâ »"] # 0x32ba - - "㊻": [tc: "⠫⠉⠞⠫⠌â Č⠖⠻"] # 0x32bb - - "ăŠŒ": [tc: "⠫⠉⠞⠫⠌â Čâ ¶â »"] # 0x32bc - - "ăŠœ": [tc: "⠫⠉⠞⠫⠌â Čâ Šâ »"] # 0x32bd - - "ăŠŸ": [tc: "⠫⠉⠞⠫⠌â Č⠔⠻"] # 0x32be - - "㊿": [tc: "â «â ‰â žâ «â Œâ ąâ Žâ »"] # 0x32bf - -#NOTE: uncertainty here - - "Ⓐ-Ⓩ": # 0x24b6 - 0x24cf - - tc: "⠫⠉⠞⠫⠠" - - spell: "translate('.', 'â’¶â’·â’žâ’čâ’șâ’»â’Œâ’œâ’Ÿâ’żâ“€â“â“‚â“ƒâ“„â“…â“†â“‡â“ˆâ“‰â“Šâ“‹â“Œâ“â“Žâ“', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - tc: "â »" - - - "ⓐ-ⓩ": # 0x24d0 - 0x24e9 - - tc: "⠫⠉⠞⠫" - - spell: "translate('.', 'â“â“‘â“’â““â“”â“•â“–â“—â“˜â“™â“šâ“›â“œâ“â“žâ“Ÿâ“ â“Ąâ“ąâ“Łâ“€â“„â“Šâ“§â“šâ“©', 'abcdefghijklmnopqrstuvwxyz')" - - tc: "â »" - - # --- Nemeth Default Alphabet circled-sans-serif chars. --- - - - "➀-➈": # 0x1f10b, 0x2780 - 0x2788 - - tc: "⠫⠉⠞⠫⠠⠚⠌" - - spell: "translate('.', '➀➁➂➃➄➅➆➇➈', '123456789')" - - tc: "â »" - - - "🄋": [tc: "⠫⠉⠞⠫⠠⠚⠌⠎⠻"] # 0x1f10b - - "➉": [tc: "⠫⠉⠞⠫⠠⠚⠌⠂⠎⠻"] # 0x2789 - - # --- Nemeth Default Alphabet comma chars. --- - - - "🄁-🄊": # 0x1f101 - 0x1f10a - - spell: "translate('.', '🄁🄂🄃🄄🄅🄆🄇🄈🄉🄊', '0123456789')" - - tc: "â  " - - - # --- Nemeth Default Alphabet double-circled chars. --- - - - "â“”": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠂⠻⠻"] # 0x24f5 - - "⓶": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠆⠻⠻"] # 0x24f6 - - "⓷": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠒⠻⠻"] # 0x24f7 - - "⓾": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌â Č⠻⠻"] # 0x24f8 - - "â“č": [t: "â «â ‰â žâ «â «â ‰â žâ «â Œâ ąâ »â »"] # 0x24f9 - - "â“ș": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠖⠻⠻"] # 0x24fa - - "⓻": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠶⠻⠻"] # 0x24fb - - "Ⓦ": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠊⠻⠻"] # 0x24fc - - "ⓜ": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠔⠻⠻"] # 0x24fd - - "ⓟ": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠂⠎⠻⠻"] # 0x24fe - - # --- Nemeth Default Alphabet double-struck chars. --- - - "𝔾-𝕐": # 0x1d538 - 0x1d550 (partial, excludes ℂ ℍ ℕ ℙ ℚ ℝ â„€) - - tc: "đ”čE" - - spell: "translate('.', '𝔾đ”čđ”»đ”Œđ”œđ”Ÿđ•€đ•đ•‚đ•ƒđ•„đ•†đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'ABDEFGIJKLMOSTUVWXY')" - - - "ℂ": [tc: "đ”čECL⠉"] # 0x2102 - - "ℍ": [tc: "đ”čECL⠓"] # 0x210d - - "ℕ": [tc: "đ”čECL⠝"] # 0x2115 - - "ℙ": [tc: "đ”čECL⠏"] # 0x2119 - - "ℚ": [tc: "đ”čECL⠟"] # 0x211a - - "ℝ": [tc: "đ”čECL⠗"] # 0x211d - - "â„€": [tc: "đ”čECLâ ”"] # 0x2124 - - "℩": [t: "CGLâ ș"] # 0x2126 (Ohm sign (capital Greek omega)) - - - "𝕒-đ•«": # 0x1d552 - 0x1d56b - - tc: "đ”čE" - - spell: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 - - tc: "đ”č" - - spell: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" - - - # --- Nemeth Default Alphabet fraktur chars. --- - - - "𝔄-𝔜": # 0x1d504 - 0x1d51c - - tc: "D" - - spell: "translate('.', '𝔄𝔅𝔇𝔈𝔉𝔊𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'ABDEFGJKLMNOPQSTUVWXY')" - - - "ℭ": [tc: "DCL⠉"] # 0x212d - - "ℌ": [tc: "DCL⠓"] # 0x210c - - "ℑ": [tc: "DCL⠊"] # 0x2111 - - "ℜ": [tc: "DCL⠗"] # 0x211c - - "ℹ": [tc: "DCLâ ”"] # 0x2128 - - - "𝔞-đ”·": # 0x1d51e - 0x1d537 - - tc: "D" - - spell: "translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz')" - - # --- Nemeth Default Alphabet fullwidth chars. --- - - - "ïŒĄ-ïŒș": # 0xff21 - 0xff3a - - tc: "" - - spell: "translate('.', 'ïŒĄïŒąïŒŁïŒ€ïŒ„ïŒŠïŒ§ïŒšïŒ©ïŒȘïŒ«ïŒŹïŒ­ïŒźïŒŻïŒ°ïŒ±ïŒČïŒłïŒŽïŒ”ïŒ¶ïŒ·ïŒžïŒčïŒș', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xff41 - 0xff5a - - tc: "" - - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - - - "-": # 0xff10 - 0xff19 - - tc: "" - - spell: "translate('.', '', '0123456789')" - - # --- Nemeth Default Alphabet italic chars -- treat as non-italic. --- - - - "𝐮-𝑍": # 0x1d434 - 0x1d44d - - tc: "E" - - spell: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝑎-𝑧": # 0x1d44e - 0x1d467 - - tc: "E" - - spell: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”â„Žđ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝛱-đ›ș": # 0x1d6e2 - 0x1d6fa - - tc: "IG" - - spell: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›čđ›ș', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "đ›»": [tc: "IGLâ «"] # 0x1d6fb - - - "đ›Œ-𝜌": # 0x1d6fc - 0x1d70c - - tc: "IG" - - spell: "translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" - - "𝜍": [tc: "IVL⠎"] # 0x1d70d - - - "𝜎": [tc: "IGL⠎"] # 0x1d70e - - "𝜏": [tc: "IGL⠞"] # 0x1d70f - - "𝜐": [tc: "IGLâ „"] # 0x1d710 - - - "𝜑": [tc: "IVL⠋"] # 0x1d711 - - - "𝜒": [tc: "IGLâ Ż"] # 0x1d712 - - "𝜓": [tc: "IGLâ œ"] # 0x1d713 - - "𝜔": [tc: "IGLâ ș"] # 0x1d714 - - - "𝜕": [tc: "VL⠙"] # 0x1d715 - - - "𝜖": [tc: "IGL⠑"] # 0x1d716 - - - "𝜗": [tc: "IVLâ č"] # 0x1d717 - - - "𝜘": [tc: "IGL⠅"] # 0x1d718 - - "𝜙": [tc: "IGL⠋"] # 0x1d719 - - "𝜚": [tc: "IGL⠗"] # 0x1d71a - - "𝜛": [tc: "IGL⠏"] # 0x1d71b - - # --- Nemeth Default Alphabet monospace chars. --- - - - "𝙰-𝚉": # 0x1d670 - 0x1d689 - - tc: "" - - spell: "translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝚊-𝚣": # 0x1d68a - 0x1d6a3 - - tc: "" - - spell: "translate('.', '𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚱𝚣', 'abcdefghijklmnopqrstuvwxyz')" - - - "đŸ¶-𝟿": # 0x1d7f6 - 0x1d7ff - - tc: "" - - spell: "translate('.', 'đŸ¶đŸ·đŸžđŸčđŸșđŸ»đŸŒđŸœđŸŸđŸż', '0123456789')" - - - # --- Nemeth Default Alphabet negative-circled chars. --- - - "⓿": [t: "⠫⠞⠉⠞⠫⠌⠎⠻"] # 0x24ff - - "❶": [t: "⠫⠞⠉⠞⠫⠌⠂⠻"] # 0x2776 - - "❷": [t: "⠫⠞⠉⠞⠫⠌⠆⠻"] # 0x2777 - - "❞": [t: "⠫⠞⠉⠞⠫⠌⠒⠻"] # 0x2778 - - "âč": [t: "⠫⠞⠉⠞⠫⠌â Čâ »"] # 0x2779 - - "âș": [t: "â «â žâ ‰â žâ «â Œâ ąâ »"] # 0x277a - - "❻": [t: "⠫⠞⠉⠞⠫⠌⠖⠻"] # 0x277b - - "❌": [t: "⠫⠞⠉⠞⠫⠌⠶⠻"] # 0x277c - - "❜": [t: "⠫⠞⠉⠞⠫⠌⠊⠻"] # 0x277d - - "❟": [t: "⠫⠞⠉⠞⠫⠌⠔⠻"] # 0x277e - - "❿": [t: "⠫⠞⠉⠞⠫⠌⠂⠎⠻"] # 0x277f - - "⓫": [t: "⠫⠞⠉⠞⠫⠌⠂⠂⠻"] # 0x24eb - - "⓬": [t: "⠫⠞⠉⠞⠫⠌⠂⠆⠻"] # 0x24ec - - "⓭": [t: "⠫⠞⠉⠞⠫⠌⠂⠒⠻"] # 0x24ed - - "⓼": [t: "⠫⠞⠉⠞⠫⠌⠂â Čâ »"] # 0x24ee - - "⓯": [t: "â «â žâ ‰â žâ «â Œâ ‚â ąâ »"] # 0x24ef - - "⓰": [t: "⠫⠞⠉⠞⠫⠌⠂⠖⠻"] # 0x24f0 - - "⓱": [t: "⠫⠞⠉⠞⠫⠌⠂⠶⠻"] # 0x24f1 - - "â“Č": [t: "⠫⠞⠉⠞⠫⠌⠂⠊⠻"] # 0x24f2 - - "⓳": [t: "⠫⠞⠉⠞⠫⠌⠂⠔⠻"] # 0x24f3 - - "⓮": [t: "⠫⠞⠉⠞⠫⠌⠆⠎⠻"] # 0x24f4 - - - "🅐": [t: "⠫⠞⠉⠞⠫⠠⠁⠻"] # 0x1f150 - - "🅑": [t: "⠫⠞⠉⠞⠫⠠⠃⠻"] # 0x1f151 - - "🅒": [t: "⠫⠞⠉⠞⠫⠠⠉⠻"] # 0x1f152 - - "🅓": [t: "⠫⠞⠉⠞⠫⠠⠙⠻"] # 0x1f153 - - "🅔": [t: "⠫⠞⠉⠞⠫⠠⠑⠻"] # 0x1f154 - - "🅕": [t: "⠫⠞⠉⠞⠫⠠⠋⠻"] # 0x1f155 - - "🅖": [t: "⠫⠞⠉⠞⠫⠠⠛⠻"] # 0x1f156 - - "🅗": [t: "⠫⠞⠉⠞⠫⠠⠓⠻"] # 0x1f157 - - "🅘": [t: "⠫⠞⠉⠞⠫⠠⠊⠻"] # 0x1f158 - - "🅙": [t: "⠫⠞⠉⠞⠫⠠⠚⠻"] # 0x1f159 - - "🅚": [t: "⠫⠞⠉⠞⠫⠠⠅⠻"] # 0x1f15a - - "🅛": [t: "⠫⠞⠉⠞⠫⠠⠇⠻"] # 0x1f15b - - "🅜": [t: "⠫⠞⠉⠞⠫⠠⠍⠻"] # 0x1f15c - - "🅝": [t: "⠫⠞⠉⠞⠫⠠⠝⠻"] # 0x1f15d - - "🅞": [t: "⠫⠞⠉⠞⠫⠠⠕⠻"] # 0x1f15e - - "🅟": [t: "⠫⠞⠉⠞⠫⠠⠏⠻"] # 0x1f15f - - "🅠": [t: "⠫⠞⠉⠞⠫⠠⠟⠻"] # 0x1f160 - - "🅡": [t: "⠫⠞⠉⠞⠫⠠⠗⠻"] # 0x1f161 - - "🅱": [t: "⠫⠞⠉⠞⠫⠠⠎⠻"] # 0x1f162 - - "🅣": [t: "⠫⠞⠉⠞⠫⠠⠞⠻"] # 0x1f163 - - "đŸ…€": [t: "⠫⠞⠉⠞⠫⠠⠄⠻"] # 0x1f164 - - "đŸ…„": [t: "⠫⠞⠉⠞⠫⠠⠧⠻"] # 0x1f165 - - "🅩": [t: "⠫⠞⠉⠞⠫⠠â șâ »"] # 0x1f166 - - "🅧": [t: "⠫⠞⠉⠞⠫⠠⠭⠻"] # 0x1f167 - - "🅹": [t: "⠫⠞⠉⠞⠫⠠⠜⠻"] # 0x1f168 - - "đŸ…©": [t: "⠫⠞⠉⠞⠫⠠⠔⠻"] # 0x1f169 - - # --- Nemeth Default Alphabet negative-circled-sans-serif chars. --- - - "🄌": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠎⠻"] # 0x1f10c - - "➊": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠂⠻"] # 0x278a - - "➋": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠆⠻"] # 0x278b - - "➌": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠒⠻"] # 0x278c - - "➍": [t: "⠫⠞⠉⠞⠫⠠⠚⠌â Čâ »"] # 0x278d - - "➎": [t: "â «â žâ ‰â žâ «â  â šâ Œâ ąâ »"] # 0x278e - - "➏": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠖⠻"] # 0x278f - - "➐": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠶⠻"] # 0x2790 - - "➑": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠊⠻"] # 0x2791 - - "➒": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠔⠻"] # 0x2792 - - "➓": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠂⠎⠻"] # 0x2793 - - # --- Nemeth Default Alphabet negative-squared chars. --- - - "🅰-🆉": # 0x1f170 - 0x1f189 - - tc: "â «â žâ Čâ žâ «â  " - - spell: "translate('.', 'đŸ…°đŸ…±đŸ…ČđŸ…łđŸ…ŽđŸ…”đŸ…¶đŸ…·đŸ…žđŸ…čđŸ…șđŸ…»đŸ…ŒđŸ…œđŸ…ŸđŸ…żđŸ†€đŸ†đŸ†‚đŸ†ƒđŸ†„đŸ†…đŸ††đŸ†‡đŸ†ˆđŸ†‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - tc: "â »" - - # --- Nemeth Default Alphabet parenthesized chars. --- - - - "⑮-⑌": # 0x2474 - 0x247c - - tc: "â ·" - - spell: "translate('.', '⑎⑔⑶⑷⑞â‘čâ‘ș⑻⑌', '123456789')" - - tc: "â Ÿ" - - - "⑜": [t: "â ·â ‚â Žâ Ÿ"] # 0x247d - - "⑟": [t: "â ·â ‚â ‚â Ÿ"] # 0x247e - - "⑿": [t: "⠷⠂⠆⠟"] # 0x247f - - "⒀": [t: "â ·â ‚â ’â Ÿ"] # 0x2480 - - "⒁": [t: "⠷⠂â Čâ Ÿ"] # 0x2481 - - "⒂": [t: "â ·â ‚â ąâ Ÿ"] # 0x2482 - - "⒃": [t: "â ·â ‚â –â Ÿ"] # 0x2483 - - "⒄": [t: "â ·â ‚â ¶â Ÿ"] # 0x2484 - - "⒅": [t: "â ·â ‚â Šâ Ÿ"] # 0x2485 - - "⒆": [t: "⠷⠂⠔⠟"] # 0x2486 - - "⒇": [t: "⠷⠆⠎⠟"] # 0x2487 - - - "🄐-đŸ„©": # 0x1f110 - 0x1f129 - - tc: "â ·â  " - - spell: "translate('.', 'đŸ„đŸ„‘đŸ„’đŸ„“đŸ„”đŸ„•đŸ„–đŸ„—đŸ„˜đŸ„™đŸ„šđŸ„›đŸ„œđŸ„đŸ„žđŸ„ŸđŸ„ đŸ„ĄđŸ„ąđŸ„ŁđŸ„€đŸ„„đŸ„ŠđŸ„§đŸ„šđŸ„©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - tc: "â Ÿ" - - - "⒜-â’”": # 0x249c - 0x24b5 - - tc: "â ·" - - spell: "translate('.', 'â’œâ’â’žâ’Ÿâ’ â’Ąâ’ąâ’Łâ’€â’„â’Šâ’§â’šâ’©â’Șâ’«â’Źâ’­â’źâ’Żâ’°â’±â’Čâ’łâ’Žâ’”', 'abcdefghijklmnopqrstuvwxyz')" - - tc: "â Ÿ" - - # --- Nemeth Default Alphabet period chars. --- - - "🄀": [t: "â Žâ žâ Č"] # 0x1f100 - - "⒈": [t: "⠂⠾â Č"] # 0x2488 - - "⒉": [t: "⠆⠾â Č"] # 0x2489 - - "⒊": [t: "⠒⠾â Č"] # 0x248a - - "⒋": [t: "â Čâ žâ Č"] # 0x248b - - "⒌": [t: "â ąâ žâ Č"] # 0x248c - - "⒍": [t: "⠖⠾â Č"] # 0x248d - - "⒎": [t: "â ¶â žâ Č"] # 0x248e - - "⒏": [t: "â Šâ žâ Č"] # 0x248f - - "⒐": [t: "⠔⠾â Č"] # 0x2490 - - - "⒑": [t: "⠂⠮⠾â Č"] # 0x2491 - - "⒒": [t: "⠂⠂⠾â Č"] # 0x2492 - - "⒓": [t: "⠂⠆⠾â Č"] # 0x2493 - - "⒔": [t: "⠂⠒⠾â Č"] # 0x2494 - - "⒕": [t: "⠂â Čâ žâ Č"] # 0x2495 - - "⒖": [t: "⠂⠱⠾â Č"] # 0x2496 - - "⒗": [t: "⠂⠖⠾â Č"] # 0x2497 - - "⒘": [t: "â ‚â ¶â žâ Č"] # 0x2498 - - "⒙": [t: "⠂⠩⠾â Č"] # 0x2499 - - "⒚": [t: "⠂⠔⠾â Č"] # 0x249a - - "⒛": [t: "⠆⠮⠾â Č"] # 0x249b - - # --- Nemeth Default Alphabet sans-serif chars. --- - - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 - - tc: "SE" - - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 - - tc: "SE" - - spell: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝟱-đŸ«": # 0x1d7e2 - 0x1d7eb - - tc: "S" - - spell: "translate('.', 'đŸąđŸŁđŸ€đŸ„đŸŠđŸ§đŸšđŸ©đŸȘđŸ«', '0123456789')" - - # --- Nemeth Default Alphabet sans-serif-bold chars. --- - - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed - - tc: "SBE" - - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝗼-𝘇": # 0x1d5ee - 0x1d607 - - tc: "SBE" - - spell: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝝖-𝝼": # 0x1d756 - 0x1d76e - - tc: "SBG" - - spell: "translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đź', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "𝝰-𝞀": # 0x1d770 - 0x1d780 - - tc: "SBG" - - spell: "translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" - - - "𝝯": [tc: "SBGLâ «"] # 0x1d76f - - - "𝞁": [tc: "SBVL⠎"] # 0x1d781 - - - "𝞂-𝞄": # 0x1d782 - 0x1d784 - - tc: "SBG" - - spell: "translate('.', '𝞂𝞃𝞄', 'στυ')" - - - "𝞅": [tc: "SBVL⠋"] # 0x1d785 - - - "𝞆-𝞈": # 0x1d786 - 0x1d788 - - tc: "SBG" - - spell: "translate('.', '𝞆𝞇𝞈', 'χψω')" - - - "𝞉": [tc: "⠠⠹⠾⠈⠙"] # 0x1d789 - - "𝞊": [tc: "SBGL⠑"] # 0x1d78a - - "𝞋": [tc: "SBVLâ č"] # 0x1d78b - - - "𝞌-𝞏": # 0x1d78c - 0x1d78f - - tc: "SBG" - - spell: "translate('.', '𝞌𝞍𝞎𝞏', 'Îșφρπ')" - - - "𝟬-đŸ”": # 0x1d7ec - 0x1d7f5 - - tc: "SB" - - spell: "translate('.', 'đŸŹđŸ­đŸźđŸŻđŸ°đŸ±đŸČđŸłđŸŽđŸ”', '0123456789')" - - # --- Nemeth Default Alphabet sans-serif-bold-italic chars. --- - - - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 - - tc: "SBIE" - - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝙖-𝙯": # 0x1d656 - 0x1d66f - - tc: "SBIE" - - spell: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝞐-𝞹": # 0x1d790 - 0x1d7a8 - - tc: "SBIG" - - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "đž©": [t: "SBIGLâ «"] # 0x1d7a9 - - - "đžȘ-đžș": # 0x1d7aa - 0x1d7ba - - tc: "SBIG" - - spell: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžș', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" - - - "đž»": [t: "SBIVL⠎"] # 0x1d7bb - - "đžŒ": [t: "SBIGL⠎"] # 0x1d7bc - - "đžœ": [t: "SBIGL⠞"] # 0x1d7bd - - "đžŸ": [t: "SBIGLâ „"] # 0x1d7be - - "𝞿": [t: "SBIVL⠋"] # 0x1d7bf - - - "𝟀": [t: "SBIGLâ Ż"] # 0x1d7c0 - - "𝟁": [t: "SBIGLâ œ"] # 0x1d7c1 - - "𝟂": [t: "SBIGLâ ș"] # 0x1d7c2 - - "𝟃": [t: "SBVL⠙"] # 0x1d7c3 - - - "𝟄": [t: "SBIGL⠑"] # 0x1d7c4 - - "𝟅": [t: "SBIVLâ č"] # 0x1d7c5 - - - "𝟆": [t: "SBIGL⠅"] # 0x1d7c6 - - "𝟇": [t: "SBIGL⠋"] # 0x1d7c7 - - "𝟈": [t: "SBIGL⠗"] # 0x1d7c8 - - "𝟉": [t: "SBIGL⠏"] # 0x1d7c9 - - # --- Nemeth Default Alphabet sans-serif-italic chars. --- - - "𝘈-𝘡": # 0x1d608 - 0x1d621 - - tc: "SIE" - - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝘱-đ˜»": # 0x1d622 - 0x1d63b - - tc: "SIE" - - spell: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" - - # --- Nemeth Default Alphabet script chars. --- - - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 - - tc: "TE" - - spell: "translate('.', 'đ’œđ’žđ’Ÿđ’ąđ’„đ’Šđ’©đ’Șđ’«đ’Źđ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'ACDGJKNOPQSTUVWXYZ')" - - - "ℬ": [t: "TECL⠃"] # 0x212c - - "ℰ": [t: "TECL⠑"] # 0x2130 - - "ℱ": [t: "TECL⠋"] # 0x2131 - - "ℋ": [t: "TECL⠓"] # 0x210b - - "ℐ": [t: "TECL⠊"] # 0x2110 - - "ℒ": [t: "TECL⠇"] # 0x2112 - - "ℳ": [t: "TECL⠍"] # 0x2133 - - "ℛ": [t: "TECL⠗"] # 0x211b - - - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf - - tc: "TE" - - spell: "translate('.', 'đ’¶đ’·đ’žđ’čđ’»đ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdfhijklmnpqrstuvwxyz')" - - - "ℯ": [t: "TEL⠑"] # 0x212f - - "ℊ": [t: "TEL⠛"] # 0x210a - - "℮": [t: "TEL⠕"] # 0x2134 - - # --- Nemeth Default Alphabet squared chars. --- - - - "🄰": [t: "â «â Č⠞⠫⠠⠁⠻"] # 0x1f130 - - "đŸ„±": [t: "â «â Č⠞⠫⠠⠃⠻"] # 0x1f131 - - "đŸ„Č": [t: "â «â Č⠞⠫⠠⠉⠻"] # 0x1f132 - - "🄳": [t: "â «â Č⠞⠫⠠⠙⠻"] # 0x1f133 - - "🄮": [t: "â «â Čâ žâ «â  â ‘â »"] # 0x1f134 - - "đŸ„”": [t: "â «â Čâ žâ «â  â ‹â »"] # 0x1f135 - - "đŸ„¶": [t: "â «â Č⠞⠫⠠⠛⠻"] # 0x1f136 - - "đŸ„·": [t: "â «â Čâ žâ «â  â “â »"] # 0x1f137 - - "🄾": [t: "â «â Čâ žâ «â  â Šâ »"] # 0x1f138 - - "đŸ„č": [t: "â «â Čâ žâ «â  â šâ »"] # 0x1f139 - - "đŸ„ș": [t: "â «â Čâ žâ «â  â …â »"] # 0x1f13a - - "đŸ„»": [t: "â «â Č⠞⠫⠠⠇⠻"] # 0x1f13b - - "đŸ„Œ": [t: "â «â Č⠞⠫⠠⠍⠻"] # 0x1f13c - - "đŸ„œ": [t: "â «â Č⠞⠫⠠⠝⠻"] # 0x1f13d - - "đŸ„Ÿ": [t: "â «â Čâ žâ «â  â •â »"] # 0x1f13e - - "🄿": [t: "â «â Č⠞⠫⠠⠏⠻"] # 0x1f13f - - "🅀": [t: "â «â Čâ žâ «â  â Ÿâ »"] # 0x1f140 - - "🅁": [t: "â «â Čâ žâ «â  â —â »"] # 0x1f141 - - "🅂": [t: "â «â Čâ žâ «â  â Žâ »"] # 0x1f142 - - "🅃": [t: "â «â Čâ žâ «â  â žâ »"] # 0x1f143 - - "🅄": [t: "â «â Čâ žâ «â  â „â »"] # 0x1f144 - - "🅅": [t: "â «â Čâ žâ «â  â §â »"] # 0x1f145 - - "🅆": [t: "â «â Čâ žâ «â  â șâ »"] # 0x1f146 - - "🅇": [t: "â «â Čâ žâ «â  â ­â »"] # 0x1f147 - - "🅈": [t: "â «â Č⠞⠫⠠⠜⠻"] # 0x1f148 - - "🅉": [t: "â «â Č⠞⠫⠠⠔⠻"] # 0x1f149 - - # --- Nemeth Default Alphabet sub chars. --- - - - "₀": [t: "â °â Ž"] # 0x2080 - - "₁": [t: "⠰⠂"] # 0x2081 - - "₂": [t: "⠰⠆"] # 0x2082 - - "₃": [t: "⠰⠒"] # 0x2083 - - "₄": [t: "â °â Č"] # 0x2084 - - "₅": [t: "â °â ą"] # 0x2085 - - "₆": [t: "⠰⠖"] # 0x2086 - - "₇": [t: "â °â ¶"] # 0x2087 - - "₈": [t: "â °â Š"] # 0x2088 - - "₉": [t: "⠰⠔"] # 0x2089 - - # --- Nemeth Default Alphabet super chars. --- - - - "⁰": [t: "⠘⠎"] # 0x2070 - - "Âč": [t: "⠘⠂"] # 0xb9 - - "ÂČ": [t: "⠘⠆"] # 0xb2 - - "Âł": [t: "⠘⠒"] # 0xb3 - - "⁎": [t: "⠘â Č"] # 0x2074 - - "⁔": [t: "⠘⠹"] # 0x2075 - - "⁶": [t: "⠘⠖"] # 0x2076 - - "⁷": [t: "⠘⠶"] # 0x2077 - - "⁞": [t: "⠘⠊"] # 0x2078 - - "âč": [t: "⠘⠔"] # 0x2079 - - # --- Nemeth Default Characters latin-lower-phonetic chars. --- - - - "Ăž": [t: "⠈⠕"] # 0xf8 - - # --- Nemeth Default Characters math_geometry chars. --- - - - "─": [t: "â ±"] # 0x2500 - - "│": [t: "â ł"] # 0x2502 - - "▰": [t: "â «â žâ ›"] # 0x25b0 - - "▱": [t: "⠫⠛"] # 0x25b1 - - "â–œ": [t: "â šâ «"] # 0x25bd - - "◆": [t: "â «â žâ ™"] # 0x25c6 - - "◇": [t: "⠫⠙"] # 0x25c7 - - "◈": [t: "â «â žâ ™"] # 0x25c8 - - "◉": [t: "â «â žâ ‰"] # 0x25c9 - - "◊": [t: "⠫⠙"] # 0x25ca - - "⬟": [t: "â «â žâ ą"] # 0x2b1f - - "⏠": [t: "â «â ą"] # 0x2b20 - - "⏥": [t: "⠫⠖"] # 0x2b21 - - "⏹": [t: "â «â žâ –"] # 0x2b22 - - "⏣": [t: "â «â žâ –"] # 0x2b23 - - "⏀": [t: "â «â žâ ‰"] # 0x2b24 - - "⏄": [t: "â «â žâ ™"] # 0x2b25 - - # --- Nemeth Default Characters math_symbols chars. --- - - - "\"": [t: "⠄⠄"] # 0x22 - - "ÂĄ": [t: "⠖"] # 0xa1 - - "Âą": [t: "⠈⠉"] # 0xa2 - - "ÂŁ": [t: "⠈⠇"] # 0xa3 - - "€": [t: "⠈⠫"] # 0xa4 - - "„": [t: "⠈⠜"] # 0xa5 - - "§": [t: "⠈⠠⠎"] # 0xa7 - - "©": [t: "⠘⠉"] # 0xa9 (Copyright) - - "ÂȘ": [t: "⠞⠰⠁"] # 0xaa - - "«": [t: "⠐⠅⠈⠐⠅⠻"] # 0xab - - "Âź": [t: "⠘⠗"] # 0xae - - "ÂŽ": [t: "⠈"] # 0xb4 - - "”": [t: "⠚⠍"] # 0xb5 - - "¶": [t: "⠈⠠⠏"] # 0xb6 - - "Âż": [t: "â Š"] # 0xbf - - "Êč": [t: "⠄"] # 0x2b9 - - "Êș": [t: "⠄⠄"] # 0x2ba - - "˙": [t: "â Ą"] # 0x2d9 - - "˜": [t: "⠈⠱"] # 0x2dc - - "‐": [t: "â €"] # 0x2010 - - "‑": [t: "â €"] # 0x2011 - - "‒": [t: "⠀⠀"] # 0x2012 - - "–": [t: "⠀⠀"] # 0x2013 - - "‖": [t: "â łâ ł"] # 0x2016 - - "†": [t: "â žâ »"] # 0x2020 - - "‡": [t: "â žâ žâ »"] # 0x2021 - - "‱": [t: "â Ą"] # 0x2022 - - " ": [t: "⠄"] # 0x2024 - - " ": [t: "⠄⠄"] # 0x2025 - - "â€Č": [t: "⠄"] # 0x2032 - - "″": [t: "⠄⠄"] # 0x2033 - - "‮": [t: "⠄⠄."] # 0x2034 (Triple prime) - - "⁗": [t: "⠄⠄.."] # 0x2057 (Quadruple prime) - - "‌": [t: "⠖⠖"] # 0x203c - - "‟": [t: "â ±"] # 0x203e - - "⁇": [t: "â čâ č"] # 0x2047 - - "⁈": [t: "â č⠖"] # 0x2048 - - "⁉": [t: "⠖â č"] # 0x2049 - - "∀": [t: "⠈⠯"] # 0x2200 - - "∃": [t: "⠈⠿"] # 0x2203 - - "∄": [t: "⠌⠈⠿"] # 0x2204 - - "∅": [t: "â žâ Ž"] # 0x2205 - - "∈": [t: "⠈⠑"] # 0x2208 - - "∉": [t: "⠌⠈⠑"] # 0x2209 - - "∊": [t: "⠈⠑"] # 0x220a - - "∋": [t: "⠈⠹"] # 0x220b - - "∌": [t: "⠌⠈⠱"] # 0x220c - - "∍": [t: "⠈⠹"] # 0x220d - - "∎": [t: "â žâ ł"] # 0x220e - - "−": [t: "â €"] # 0x2212 - - "∓": [t: "⠀⠏"] # 0x2213 - - "∕": [t: "⠾⠌"] # 0x2215 - - "∖": [t: "â žâ Ą"] # 0x2216 - - "∗": [t: "⠈⠌"] # 0x2217 - - "∘": [t: "â šâ Ą"] # 0x2218 - - "∝": [t: "â žâ ż"] # 0x221d - - "∞": [t: "â  â ż"] # 0x221e - - "∟": [t: "â «â Șâ šâ —â »"] # 0x221f - - "∠": [t: "â «â Ș"] # 0x2220 - - "∹": [t: "â «â Ș⠞⠫⠫⠁⠻"] # 0x2222 - - "∣": [t: "â ł"] # 0x2223 - - "∀": [t: "⠌⠳"] # 0x2224 - - "∄": [t: "⠫⠇"] # 0x2225 - - "∊": [t: "⠌⠫⠇"] # 0x2226 - - "∧": [t: "⠈⠩"] # 0x2227 - - "√": [t: "⠈⠏"] # 0x2228 - - "∩": [t: "â šâ ©"] # 0x2229 - - "âˆȘ": [t: "â šâ Ź"] # 0x222a - - "∫": [t: "â ź"] # 0x222b - - "∏": [t: "â źâ ź"] # 0x222c - - "∭": [t: "â źâ źâ ź"] # 0x222d - - "∟": [t: "â źâ ˆâ «â ‰â »"] # 0x222e - - "âˆČ": [t: "⠟⠈⠫â Ș⠹⠔⠻"] # 0x2232 - - "∳": [t: "â źâ ˆâ «â ąâ ”â •â »"] # 0x2233 - - "∎": [t: "â  â Ą"] # 0x2234 - - "∔": [t: "⠈⠌"] # 0x2235 - - "∶": [t: "⠐⠂"] # 0x2236 - - "∷": [t: "⠰⠆"] # 0x2237 - - "∞": [t: "â šâ €"] # 0x2238 - - "∌": [t: "⠈⠱"] # 0x223c - - "≁": [t: "⠌⠈⠱"] # 0x2241 - - "≂": [t: "⠱⠈⠱"] # 0x2242 - - "≃": [t: "⠈⠱⠱"] # 0x2243 - - "≄": [t: "⠌⠈⠱⠱"] # 0x2244 - - "≅": [t: "⠈⠱⠚⠅"] # 0x2245 - - "≆": [t: "⠈⠱⠌⠚⠅"] # 0x2246 - - "≇": [t: "⠌⠈⠱⠚⠅"] # 0x2247 - - "≈": [t: "⠈⠱⠈⠱"] # 0x2248 - - "≉": [t: "⠌⠈⠱⠈⠱"] # 0x2249 - - "≊": [t: "⠈⠱⠈⠱⠱"] # 0x224a - - "≍": [t: "⠈⠣⠠⠣"] # 0x224d - - "≎": [t: "⠈⠣⠠⠣"] # 0x224e - - "≐": [t: "⠐⠚⠅⠣⠥⠻"] # 0x2250 - - "≑": [t: "⠐⠚⠅⠩⠥⠣⠥⠻"] # 0x2251 - - "≗": [t: "⠐⠚⠅⠣⠚⠥⠻"] # 0x2257 - - "≘": [t: "⠐⠚⠅⠣⠫⠁⠻"] # 0x2258 - - "≙": [t: "⠐⠚⠅⠣⠞⠣⠻"] # 0x2259 - - "≚": [t: "⠐⠚⠅⠣⠞⠩⠻"] # 0x225a - - "≛": [t: "⠐⠚⠅⠣⠫⠞⠎⠻"] # 0x225b - - "≜": [t: "⠐⠚⠅⠣⠫⠞⠻"] # 0x225c - - "≝": [t: "⠐⠚⠅⠣⠙⠑⠋⠻"] # 0x225d - - "≞": [t: "â â šâ …â Łâ â »"] # 0x225e - - "≟": [t: "⠐⠚⠅⠣⠞⠊⠻"] # 0x225f - - "≠": [t: "⠌⠹⠅"] # 0x2260 - - "≱": [t: "⠌⠾⠇"] # 0x2262 - - "≀": [t: "⠐⠅⠱"] # 0x2264 - - "≄": [t: "â šâ ‚â ±"] # 0x2265 - - "≩": [t: "⠐⠅⠹⠅"] # 0x2266 - - "≧": [t: "⠹⠂⠹⠅"] # 0x2267 - - "≹": [t: "⠐⠅⠌⠹⠅"] # 0x2268 - - "≩": [t: "⠹⠂⠌⠹⠅"] # 0x2269 - - "â‰Ș": [t: "⠐⠅⠈⠐⠅⠻"] # 0x226a - - "≫": [t: "⠚⠂⠈⠚⠂⠻"] # 0x226b - - "≭": [t: "⠌⠈⠣⠠⠣"] # 0x226d - - "≼": [t: "⠌⠐⠅"] # 0x226e - - "≯": [t: "⠌⠹⠂"] # 0x226f - - "≰": [t: "⠌⠐⠅⠱"] # 0x2270 - - "≱": [t: "⠌⠚⠂⠱"] # 0x2271 - - "â‰Č": [t: "⠐⠅⠈⠱"] # 0x2272 - - "≳": [t: "⠚⠂⠈⠱"] # 0x2273 - - "≮": [t: "⠌⠐⠅⠈⠱"] # 0x2274 - - "≔": [t: "⠌⠚⠂⠈⠱"] # 0x2275 - - "≶": [t: "⠐⠅⠹⠂"] # 0x2276 - - "≷": [t: "⠹⠂⠐⠅"] # 0x2277 - - "≾": [t: "⠌⠐⠅⠹⠂"] # 0x2278 - - "â‰č": [t: "⠌⠹⠂⠐⠅"] # 0x2279 - - "â‰ș": [t: "⠹⠐⠅"] # 0x227a - - "≻": [t: "⠹⠹⠂"] # 0x227b - - "≌": [t: "⠚⠐⠅⠱"] # 0x227c - - "≜": [t: "⠚⠚⠐⠱"] # 0x227d - - "≟": [t: "⠚⠐⠅⠈⠱"] # 0x227e - - "≿": [t: "⠚⠚⠂⠈⠱"] # 0x227f - - "⊀": [t: "⠌⠹⠐⠅"] # 0x2280 - - "⊁": [t: "⠌⠹⠐⠅"] # 0x2281 - - "⊂": [t: "⠾⠐⠅"] # 0x2282 - - "⊃": [t: "⠾⠹⠂"] # 0x2283 - - "⊄": [t: "⠌⠾⠐⠅"] # 0x2284 - - "⊅": [t: "⠌⠾⠹⠂"] # 0x2285 - - "⊆": [t: "⠞⠐⠅⠱"] # 0x2286 - - "⊇": [t: "â žâ šâ ‚â ±"] # 0x2287 - - "⊈": [t: "⠌⠞⠐⠅⠱"] # 0x2288 - - "⊉": [t: "⠌⠞⠚⠂⠱"] # 0x2289 - - "⊊": [t: "⠾⠐⠅⠌⠹⠅"] # 0x228a - - "⊋": [t: "⠾⠹⠂⠌⠹⠅"] # 0x228b - - "⊄": [t: "⠫⠏"] # 0x22a5 - - "⋀": [t: "⠈⠩"] # 0x22c0 - - "⋁": [t: "⠈⠏"] # 0x22c1 - - "⋂": [t: "â šâ ©"] # 0x22c2 - - "⋃": [t: "â šâ Ź"] # 0x22c3 - - "⋄": [t: "â «â ©"] # 0x22c4 - - "⋜": [t: "⠱⠐⠅"] # 0x22dc - - "⋝": [t: "⠱⠚⠂"] # 0x22dd - - "⟂": [t: "⠫⠏"] # 0x27c2 - - "⩀": [t: "â łâ łâ ł"] # 0x2980 - - "⊶": [t: "⠫⠉⠞⠫⠳⠻"] # 0x29b6 - - "⊷": [t: "⠫⠉⠞⠫⠫⠇⠻"] # 0x29b7 - - "⊞": [t: "⠫⠉⠞⠫⠞⠥⠻"] # 0x29b8 - - "âŠč": [t: "⠫⠉⠞⠫⠫⠏⠻"] # 0x29b9 - - "⊿": [t: "⠫⠉⠞⠫⠔⠔⠻"] # 0x29bf - - "⧀": [t: "⠫⠉⠞⠫⠐⠅⠻"] # 0x29c0 - - "⧁": [t: "⠫⠉⠞⠫⠚⠂⠻"] # 0x29c1 - - "⹀": [t: "⠫⠉⠞⠫⠥⠻"] # 0x2a00 - - "⚁": [t: "⠫⠉⠞⠫⠏⠻"] # 0x2a01 - - "⹂": [t: "â «â ‰â žâ «â ˆâ Ąâ »"] # 0x2a02 - - "âȘŻ": [t: "⠚⠐⠅⠱"] # 0x2aaf - - "âȘ°": [t: "â šâ šâ ‚â ±"] # 0x2ab0 - - "âȘ±": [t: "⠚⠐⠅⠌⠱"] # 0x2ab1 - - "âȘČ": [t: "⠚⠚⠂⠌⠱"] # 0x2ab2 - - "âȘł": [t: "⠹⠐⠅⠹⠅"] # 0x2ab3 - - "âȘŽ": [t: "⠹⠹⠂⠹⠅"] # 0x2ab4 - - "âȘ”": [t: "⠹⠐⠅⠌⠹⠅"] # 0x2ab5 - - "âȘ¶": [t: "⠹⠹⠂⠌⠹⠅"] # 0x2ab6 - - "âȘ·": [t: "⠚⠐⠅⠈⠱⠈⠱"] # 0x2ab7 - - "âȘž": [t: "⠚⠚⠂⠈⠱⠈⠱"] # 0x2ab8 - - "âȘč": [t: "⠚⠐⠅⠌⠈⠱⠈⠱"] # 0x2ab9 - - "âȘș": [t: "⠚⠚⠂⠌⠈⠱⠈⠱"] # 0x2aba - - "âȘ»": [t: "⠚⠐⠅⠈⠚⠐⠅⠻"] # 0x2abb - - "âȘŒ": [t: "⠚⠚⠂⠈⠚⠚⠂⠻"] # 0x2abc - - "ïč©": [t: "⠈⠎"] # 0xfe69 - - "": [t: "⠈⠎"] # 0xff04 - - "ïŒż": [t: "â ±"] # 0xff3f - - "": [t: "⠈⠱"] # 0xff5e - - "ïż ": [t: "⠈⠉"] # 0xffe0 - - "ïżĄ": [t: "⠈⠇"] # 0xffe1 - - "ïżŁ": [t: "â ±"] # 0xffe3 - - "ïż„": [t: "⠈⠜"] # 0xffe5 - - # --- Nemeth Default Characters rest chars. --- - - - "â„”": [t: "⠠⠠⠁"] # 0x2135 - - "ℶ": [t: "⠠⠠⠃"] # 0x2136 - - "ℷ": [t: "⠠⠠⠉"] # 0x2137 - - "ℾ": [t: "⠠⠠⠙"] # 0x2138 - - "Ă ": [t: "⠈⠁"] # 0xe0 - - "ĂĄ": [t: "⠈⠁"] # 0xe1 - - "Ăą": [t: "⠈⠁"] # 0xe2 - - "ĂŁ": [t: "⠈⠁"] # 0xe3 - - "Ă€": [t: "⠈⠁"] # 0xe4 - - "Ă„": [t: "⠈⠁"] # 0xe5 - - "ç": [t: "⠈⠉"] # 0xe7 - - "Ăš": [t: "⠈⠑"] # 0xe8 - - "Ă©": [t: "⠈⠑"] # 0xe9 - - "ĂȘ": [t: "⠈⠑"] # 0xea - - "Ă«": [t: "⠈⠑"] # 0xeb - - "ĂŹ": [t: "⠈⠊"] # 0xec - - "Ă­": [t: "⠈⠊"] # 0xed - - "Ăź": [t: "⠈⠊"] # 0xee - - "ĂŻ": [t: "⠈⠊"] # 0xef - - "ñ": [t: "⠈⠝"] # 0xf1 - - "ĂČ": [t: "⠈⠕"] # 0xf2 - - "Ăł": [t: "⠈⠕"] # 0xf3 - - "ĂŽ": [t: "⠈⠕"] # 0xf4 - - "Ă”": [t: "⠈⠕"] # 0xf5 - - "ö": [t: "⠈⠕"] # 0xf6 - - "Ăč": [t: "⠈⠄"] # 0xf9 - - "Ăș": [t: "⠈⠄"] # 0xfa - - "Ă»": [t: "⠈⠄"] # 0xfb - - "ĂŒ": [t: "⠈⠄"] # 0xfc - - "Ăœ": [t: "⠈⠜"] # 0xfd - - "Ăż": [t: "⠈⠜"] # 0xff - - - "À": [t: "⠠⠈⠁"] # 0xc0 - - "Á": [t: "⠠⠈⠁"] # 0xc1 - - "Â": [t: "⠠⠈⠁"] # 0xc2 - - "Ã": [t: "⠠⠈⠁"] # 0xc3 - - "Ä": [t: "⠠⠈⠁"] # 0xc4 - - "Å": [t: "⠠⠈⠁"] # 0xc5 - - "Ç": [t: "⠠⠈⠉"] # 0xc7 - - "È": [t: "⠠⠈⠑"] # 0xc8 - - "É": [t: "⠠⠈⠑"] # 0xc9 - - "Ê": [t: "⠠⠈⠑"] # 0xca - - "Ë": [t: "⠠⠈⠑"] # 0xcb - - "Ì": [t: "⠠⠈⠊"] # 0xcc - - "Í": [t: "⠠⠈⠊"] # 0xcd - - "Î": [t: "⠠⠈⠊"] # 0xce - - "Ï": [t: "⠠⠈⠊"] # 0xcf - - "Ñ": [t: "⠠⠈⠝"] # 0xd1 - - "Ò": [t: "⠠⠈⠕"] # 0xd2 - - "Ó": [t: "⠠⠈⠕"] # 0xd3 - - "Ô": [t: "⠠⠈⠕"] # 0xd4 - - "Ö": [t: "⠠⠈⠕"] # 0xd6 - - "Ù": [t: "⠠⠈⠄"] # 0xd9 - - "Ú": [t: "⠠⠈⠄"] # 0xda - - "Û": [t: "⠠⠈⠄"] # 0xdb - - "Ü": [t: "⠠⠈⠄"] # 0xdc - - "Ý": [t: "⠠⠈⠜"] # 0xdd - - "←": [t: "â «â Ș⠒⠒"] # 0x2190 - - - "↑": # 0x2191 - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "â «â Ł"] - else: [t: "â «â Łâ ’â ’â •"] - - - "↓": # 0x2193 - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "â «â ©"] - else: [t: "⠫⠩⠒⠒⠕"] - - - "↔": [t: "â «â Ș⠒⠒⠕"] # 0x2194 - - "↕": [t: "â «â Łâ ©â Ș⠒⠒⠕"] # 0x2195 - - "↖": [t: "⠫⠘â Ș⠒⠒"] # 0x2196 - - "↗": [t: "⠫⠘⠒⠒⠕"] # 0x2197 - - "↘": [t: "⠫⠰⠒⠒⠕"] # 0x2198 - - "↙": [t: "â «â °â Ș⠒⠒"] # 0x2199 - - "↚": [t: "⠳⠈⠫â Ș⠒⠒⠻"] # 0x219a - - "↛": [t: "â łâ ˆâ «â ’â ’â •â »"] # 0x219b - - "↜": [t: "â «â Ș⠔⠒⠱"] # 0x219c - - "↝": [t: "⠫⠔⠒⠹⠕"] # 0x219d - - "↞": [t: "â «â Șâ Ș⠒⠒"] # 0x219e - - "↟": [t: "â «â Łâ ’â ’â •â •"] # 0x219f - - "↠": [t: "⠫⠒⠒⠕⠕"] # 0x21a0 - - "↡": [t: "⠫⠩⠒⠒⠕⠕"] # 0x21a1 - - "↱": [t: "â «â Șâ ’â ’â  â œ"] # 0x21a2 - - "↣": [t: "â «â  â Żâ ’â ’â •"] # 0x21a3 - - "ↀ": [t: "â «â Ș⠒⠒⠳"] # 0x21a4 - - "ↄ": [t: "â «â Łâ łâ ’â ’â •"] # 0x21a5 - - "↩": [t: "â «â łâ ’â ’â •"] # 0x21a6 - - "↧": [t: "â «â ©â łâ ’â ’â •"] # 0x21a7 - - "↹": [t: "â «â Ș⠒⠳⠒⠕"] # 0x21a8 - - "↩": [t: "â «â Ș⠒⠒⠠⠕"] # 0x21a9 - - "â†Ș": [t: "â «â  â Ș⠒⠒⠕"] # 0x21aa - - "↫": [t: "â «â Ș⠒⠒⠹⠡"] # 0x21ab - - "↬": [t: "â «â šâ Ąâ ’â ’â •"] # 0x21ac - - "↭": [t: "â «â Ș⠔⠒⠱⠕"] # 0x21ad - - "↼": [t: "⠳⠈⠫â Ș⠒⠒⠕"] # 0x21ae - - "↯": [t: "⠫⠩⠔⠹⠔"] # 0x21af - - "↮": [t: "â «â  â łâ ’â ’â •"] # 0x21b4 - - "↔": [t: "â «â ©â  â łâ ’â ’â •"] # 0x21b5 - - "↶": [t: "⠫⠹⠔⠕"] # 0x21b6 - - "↷": [t: "â «â Ș⠱⠔"] # 0x21b7 - - "â†ș": [t: "⠫⠹⠔⠕"] # 0x21ba - - "↻": [t: "â «â Ș⠱⠔"] # 0x21bb - - "⇄": [t: "⠫⠒⠒⠕⠫â Ș⠒⠒"] # 0x21c4 - - "⇅": [t: "⠫⠣⠒⠒⠕⠐⠫⠩⠒⠒⠕"] # 0x21c5 - - "⇆": [t: "â «â Ș⠒⠒⠫⠒⠒⠕"] # 0x21c6 - - "⇇": [t: "⠫⠚⠒⠒⠫⠚⠒⠒"] # 0x21c7 - - "⇈": [t: "⠫⠣⠒⠒⠕⠐⠫⠣⠒⠒⠕"] # 0x21c8 - - "⇉": [t: "⠫⠒⠒⠕⠫⠒⠒⠕"] # 0x21c9 - - "⇊": [t: "⠫⠩⠒⠒⠕⠐⠫⠩⠒⠒⠕"] # 0x21ca - - "⇍": [t: "⠳⠈⠫â Șâ Ș⠒⠒"] # 0x21cd - - "⇎": [t: "⠳⠈⠫â Șâ Ș⠒⠒⠕⠕"] # 0x21ce - - "⇏": [t: "â łâ ˆâ «â ’â ’â •â •"] # 0x21cf - - "⇐": [t: "â «â Șâ ¶â ¶"] # 0x21d0 - - "⇑": [t: "â «â Łâ ¶â ¶â •"] # 0x21d1 - - "⇒": [t: "⠫⠶⠶⠕"] # 0x21d2 - - "⇓": [t: "â «â Łâ ¶â ¶â •"] # 0x21d3 - - "⇔": [t: "â «â Ș⠶⠶⠕"] # 0x21d4 - - "⇕": [t: "â «â Łâ Ș⠶⠶⠕"] # 0x21d5 - - "⇖": [t: "⠫⠘â Șâ ¶â ¶"] # 0x21d6 - - "⇗": [t: "⠫⠘⠶⠶⠕"] # 0x21d7 - - "⇘": [t: "⠫⠰⠶⠶⠕"] # 0x21d8 - - "⇙": [t: "â «â °â Șâ Ș⠒⠒"] # 0x21d9 - - "⇚": [t: "â «â Șâ Șâ ¶â ¶"] # 0x21da FIX: how to represent triple shafts? - - "⇛": [t: "⠫⠶⠶⠕⠕"] # 0x21db FIX: how to represent triple shafts? - - "⇜": [t: "â «â Ș⠹⠀⠔⠒⠹"] # 0x21dc - - "⇝": [t: "⠫⠹⠀⠔⠒⠹⠕"] # 0x21dd - - "⇞": [t: "â łâ łâ ˆâ «â Łâ ’â ’â •â »"] # 0x21de - - "⇟": [t: "â łâ łâ ˆâ «â ©â ’â ’â •â »"] # 0x21df - - "⇠": [t: "â «â Ș⠒⠒"] # 0x21e0 - - "⇡": [t: "â «â Łâ ’â ’â •"] # 0x21e1 - - "⇱": [t: "⠫⠒⠒⠕"] # 0x21e2 - - "⇣": [t: "⠫⠩⠒⠒⠕"] # 0x21e3 - - "⇀": [t: "â «â łâ Ș⠒⠒"] # 0x21e4 - - "⇄": [t: "â «â ’â ’â •â ł"] # 0x21e5 - - "⇩": [t: "â «â žâ Ș⠒⠒"] # 0x21e6 - - "⇧": [t: "â «â Łâ žâ ’â ’â •"] # 0x21e7 - - "⇹": [t: "â «â žâ ’â ’â •"] # 0x21e8 - - "⇩": [t: "â «â ©â žâ ’â ’â •"] # 0x21e9 - - "⇳": [t: "â «â Łâ žâ Ș⠒⠒⠕"] # 0x21f3 - - "⇮": [t: "â «â ’â ’â •â šâ Ą"] # 0x21f4 - - "⇔": [t: "⠫⠩⠒⠒⠕⠐⠫⠣⠒⠒⠕"] # 0x21f5 - - "⇶": [t: "⠫⠒⠒⠕⠫⠒⠒⠕⠫⠒⠒⠕"] # 0x21f6 - - "⇷": [t: "⠳⠈⠫â Ș⠒⠒⠻"] # 0x21f7 - - "⇾": [t: "â łâ ˆâ «â ’â ’â •â »"] # 0x21f8 - - "â‡č": [t: "⠳⠈⠫â Ș⠒⠒⠕"] # 0x21f9 - - "â‡ș": [t: "⠳⠳⠈⠫â Ș⠒⠒⠻"] # 0x21fa - - "⇻": [t: "â łâ łâ ˆâ «â ’â ’â •â »"] # 0x21fb - - "⇌": [t: "⠳⠳⠈⠫â Ș⠒⠒⠕"] # 0x21fc - - "⇜": [t: "â «â łâ ’â ’"] # 0x21fd - - "⇟": [t: "â «â ’â ’â ł"] # 0x21fe - - "⇿": [t: "â «â łâ ’â ’â ł"] # 0x21ff - - - "ⅆ": [t: "⠙"] # 0x2146 - - "ⅇ": [t: "⠑"] # 0x2147 - - "ⅈ": [t: "⠊"] # 0x2148 - - "⌜": [t: "⠈⠘⠷"] # 0x231c - - "⌝": [t: "⠈⠘⠟"] # 0x231d - - "⌞": [t: "⠈⠰⠷"] # 0x231e - - "⌟": [t: "⠈⠰⠟"] # 0x231f - - "〈": [t: "â šâ šâ ·"] # 0x2329 - - "âŒȘ": [t: "â šâ šâ Ÿ"] # 0x232a - - "⏞": [t: "â šâ ·"] # 0x23de - - "⏟": [t: "â šâ Ÿ"] # 0x23df - - "⎮": [t: "⠈⠷"] # 0x23b4 - - "⎔": [t: "⠈⠟"] # 0x23b5 - - "âŸȘ": [t: "â šâ šâ šâ ·"] # 0x27ea - - "⟫": [t: "â šâ šâ šâ Ÿ"] # 0x27eb - - "〈": [t: "â šâ šâ ·"] # 0x3008 - - "〉": [t: "â šâ šâ Ÿ"] # 0x3009 - - "《": [t: "â šâ šâ šâ ·"] # 0x300a - - "》": [t: "â šâ šâ šâ Ÿ"] # 0x300b - - "「": [t: "⠈⠘⠷"] # 0x300c - - "」": [t: "⠈⠘⠟"] # 0x300d - - "↌": [t: "⠫⠈â Ș⠒⠒"] # 0x21bc - - "↜": [t: "â «â  â Ș⠒⠒"] # 0x21bd - - "↟": [t: "â «â Łâ ’â ’â  â •"] # 0x21be - - "↿": [t: "â «â Łâ ’â ’â ˆâ •"] # 0x21bf - - "⇀": [t: "⠫⠒⠒⠈⠕"] # 0x21c0 - - "⇁": [t: "⠫⠒⠒⠠⠕"] # 0x21c1 - - "⇂": [t: "â «â Ș⠒⠒⠈⠕"] # 0x21c2 - - "⇃": [t: "⠫⠩⠒⠒⠠⠕"] # 0x21c3 - - "⇋": # 0x21cb - - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "â «â Ș⠒⠫⠒⠕"] - else: [t: "⠫⠈â Ș⠒⠒⠫⠒⠒⠈⠕"] - - "⇌": # 0x21cc - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "⠫⠒⠕⠫â Ș⠒"] - else: [t: "⠫⠒⠒⠈⠕⠫⠈â Ș⠒⠒"] - - - "℔": [t: "â ł"] # 0x2114 - - "ℱ": [t: "⠘⠞"] # 0x2122 - - "Å": [t: "⠈⠠⠁"] # 0x212b - - "­": [t: "â €"] # 0xad - - " ": [t: "W"] # 0x2000 - - " ": [t: "W"] # 0x2001 - - " ": [t: "W"] # 0x2002 - - " ": [t: "W"] # 0x2003 - - " ": [t: "W"] # 0x2004 - - " ": [t: "W"] # 0x2005 - - " ": [t: "W"] # 0x2006 - - " ": [t: "W"] # 0x2007 - - " ": [t: "W"] # 0x2008 - - " ": [t: "W"] # 0x2009 - - " ": [t: "W"] # 0x200a - - "​": [t: "W"] # 0x200b - - "‹": [t: "W"] # 0x2028 - - "
": [t: "W"] # 0x2029 - - " ": [t: "W"] # 0x202f - - " ": [t: "W"] # 0x205f - - "₣": [t: "⠈⠋"] # 0x20A3 (French franc sign - - "₩": [t: "⠈⠝"] # 0x2046 (Naira sign) - - "₩": [t: "⠈â ș"] # 0x20A9 (Won sign) - - "€": [t: "⠈⠑"] # 0x20AC (Euro sign) - - "ï»ż": [t: "W"] # 0xfeff - - "☆": [t: "⠫⠎"] # 0x2606 - - "✕": [t: "⠈⠥"] # 0x2715 - - "ÂŒ": [t: "â č⠂⠌â Čâ Œ"] # 0xbc - - "œ": [t: "â č⠂⠌⠆⠌"] # 0xbd - - "Ÿ": [t: "â č⠒⠌â Čâ Œ"] # 0xbe - - "⅐": [t: "â č⠂⠌⠶⠌"] # 0x2150 - - "⅑": [t: "â č⠂⠌⠔⠌"] # 0x2151 - - "⅒": [t: "â č⠂⠌⠂⠎⠌"] # 0x2152 - - "⅓": [t: "â č⠂⠌⠒⠌"] # 0x2153 - - "⅔": [t: "â č⠆⠌⠒⠌"] # 0x2154 - - "⅕": [t: "â čâ ‚â Œâ ąâ Œ"] # 0x2155 - - "⅖": [t: "â čâ †â Œâ ąâ Œ"] # 0x2156 - - "⅗": [t: "â čâ ’â Œâ ąâ Œ"] # 0x2157 - - "⅘": [t: "â čâ Čâ Œâ ąâ Œ"] # 0x2158 - - "⅙": [t: "â č⠂⠌⠖⠌"] # 0x2159 - - "⅚": [t: "â čâ ąâ Œâ –â Œ"] # 0x215a - - "⅛": [t: "â č⠂⠌⠊⠌"] # 0x215b - - "⅜": [t: "â č⠒⠌⠊⠌"] # 0x215c - - "⅝": [t: "â čâ ąâ Œâ Šâ Œ"] # 0x215d - - "⅞": [t: "â č⠶⠌⠊⠌"] # 0x215e - - "⅟": [t: "â č⠂⠌⠌"] # 0x215f - - "↉": [t: "â č⠎⠌⠒⠌"] # 0x2189 - - "㉈": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠂⠎⠻⠻"] # 0x3248 - - "㉉": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠆⠎⠻⠻"] # 0x3249 - - "㉊": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠒⠎⠻⠻"] # 0x324a - - "㉋": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌â Č⠎⠻⠻"] # 0x324b - - "㉌": [t: "â «â žâ Čâ žâ «â «â ‰â žâ «â Œâ ąâ Žâ »â »"] # 0x324c - - "㉍": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠖⠎⠻⠻"] # 0x324d - - "㉎": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠶⠎⠻⠻"] # 0x324e - - "㉏": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠊⠎⠻⠻"] # 0x324f - - - - "‘": [t: "Pâ  â Š"] # 0x2018 (Left single quotation mark) - - "’": [t: "Pâ  â Ž"] # 0x2019 (Right single quotation mark) - - "“": [t: "Pâ Š"] # 0x201C (Left double quotation mark) - - "”": [t: "Pâ Ž"] # 0x201D (Right double quotation mark) - - "‰": [t: "`00"] - - "ℏ": [t: "⠈⠓"] # 0x210F (Planck constant over two pi) - - "ℓ": [t: "TE⠇"] # 0x2113 (Script small l (differs from 1d4c1: 4-56-123)) - - "℘": [tc: "TCL⠏"] # 0x2118 (Script Capital P) -# - "ℝ": [t: ""] # 0x211D (Double-struck capital R (no nemeth double struck)) -# - "ⅆ": [t: ""] # 0x2146 (Double-struck italic small d) -# - "ⅇ": [t: ""] # 0x2147 (Double-struck italic small e) -# - "⇚": [t: "⠀⠫â Ș⠾⠾⠀"] # 0x21DA (Leftwards triple arrow) -# - "⇛": [t: "⠀⠫⠞⠞⠕⠀"] # 0x21DB (Rightwards triple arrow) - - "∔": [t: "⠐⠏⠣⠥⠻"] # 0x2214 (Dot plus) - - "√": [t: "⠜"] # 0x221A (Square root) - - "∛": [t: "⠣⠒⠜"] # 0x221B (Cube root) - - "∜": [t: "â Łâ Č⠜"] # 0x221C (Fourth root) - - "∥": [t: "â «â Ș⠞⠫⠫⠁⠻"] # 0x2221 (Measured angle) - - "âˆč": [t: "⠀⠐⠂"] # 0x2239 (Excess) - - "âˆș": [t: "⠐⠀⠩⠥⠥⠣⠥⠥⠻"] # 0x223A (Geometric proportion) - - "∻": [t: "⠐⠈⠱⠩⠥⠣⠥⠻"] # 0x223B (Homothetic) - - "∜": [t: "â  â ±"] # 0x223D (Reversed tilde) - - "≋": [t: "⠈⠱⠈⠱⠈⠱"] # 0x224B (Triple tilde) - - "≌": [t: "⠠⠱⠚⠅"] # 0x224C (All equal to) - - "≏": [t: "⠈⠣⠱"] # 0x224F (Difference between) - - "≔": [t: "⠐⠂⠹⠅"] # 0x2254 (Colon equals) - - "≕": [t: "⠹⠅⠐⠂"] # 0x2255 (Equals colon) - - "≖": [t: "â €â šâ Ąâ ˆâ šâ …â »â €"] # 0x2256 (Ring in equal to) - - "⊌": [t: "⠚⠏⠈⠫â Ș⠒⠻"] # 0x228C (Multiset) - - "⊍": [t: "⠥⠈⠚⠏⠻"] # 0x228D (Multiset multiplication) - - "⊎": [t: "⠏⠈⠚⠏⠻"] # 0x228E (Multiset union) - - "⊕": [t: "⠫⠉⠞⠫⠏⠻"] # 0x2295 (Circled plus) - - "⊖": [t: "⠫⠉⠞⠫⠀⠻"] # 0x2296 (Circled minus) - - "⊗": [t: "â «â ‰â žâ «â ˆâ Ąâ »"] # 0x2297 (Circled times) - - "⊘": [t: "⠫⠉⠞⠫⠞⠌⠻"] # 0x2298 (Circled division slash) - - "⊙": [t: "⠫⠉⠞⠫⠥⠻"] # 0x2299 (Circled dot operator) - - "⊚": [t: "â «â ‰â žâ «â ˜â šâ Ąâ »"] # 0x229a (Circled ring operator) - - "⊛": [t: "⠫⠉⠞⠫⠈⠌⠻"] # 0x229B (Circled asterisk operator) - - "⊜": [t: "⠫⠉⠞⠫⠚⠅⠻"] # 0x229C (Circled equals) - - "⊝": [t: "⠫⠉⠞⠫⠀⠀⠻"] # 0x229D (Circled dash) - - "⊞": [t: "â «â Čâ žâ «â Źâ »"] # 0x229E (Squared plus) - - "⊟": [t: "â «â Č⠞⠫⠀⠻"] # 0x229F (Squared minus) - - "⊠": [t: "â «â Č⠞⠫⠈⠥⠻"] # 0x22A0 (Squared times) - - "⊡": [t: "â «â Čâ žâ «â Ąâ »"] # 0x22A1 (Squared dot operator) - - "⊱": [t: "â «â łâ ’"] # 0x22A2 (Right tack) - - "⊣": [t: "â «â ’â ł"] # 0x22A3 (Left tack) - - "⊀": [t: "â «â ©â łâ ’"] # 0x22A4 (Down tack) -# - "⊄": [t: "⠀⠫⠏⠀ or ⠀⠫⠣⠳⠒⠀"] # 0x22A5 (Up tack (See also 27C2)) -# - "⊩": [t: ""] # 0x22A6 (Assertion) -# - "⊹": [t: ""] # 0x22A8 (TRUE) -# - "âŠČ": [t: ""] # 0x22B2 (Normal subgroup of) -# - "⊳": [t: ""] # 0x22B3 (Contains as normal subgroup) -# - "⊮": [t: ""] # 0x22B4 (Normal subgroup of or equal to) -# - "⊔": [t: ""] # 0x22B5 (Contains as normal subgroup or equal to) - - "⊶": [t: "â «â šâ Ąâ ’â Ą"] # 0x22B6 (Original of) - - "⊷": [t: "â «â Ąâ ’â šâ Ą"] # 0x22B7 (Image of) - - "⊾": [t: "â «â ’â šâ Ą"] # 0x22B8 (Multimap) -# - "⊟": [t: ""] # 0x22BE (Right angle w arc) - - "⊿": [t: "â «â žâ šâ —â »"] # 0x22BF (Right triangle) - - "⋅": [t: "â Ą"] # 0x22C5 (Dot operator) - - "∙": [t: "â Ą"] # 0x2219 -- similar looking to 0x22c5, so using the same braille - - "⋆": [t: "⠫⠎"] # 0x22C6 (Star operator) - - "⋍": [t: "⠠⠱⠱"] # 0x22CD (Reversed tilde equals) - - "⋖": [t: "â Ąâ ˆâ â …â »"] # 0x22D6 (Less-than w dot) - - "⋗": [t: "â Ąâ ˆâ šâ ‚â »"] # 0x22D7 (Greater-than w dot) - - "⋘": [t: "⠐⠅⠈⠐⠅⠈⠐⠅⠻"] # 0x22D8 (Much less-than) - - "⋙": [t: "⠚⠂⠈⠚⠂⠈⠚⠂⠻"] # 0x22D9 (Much greater-than) - - "â‹Č": [t: "⠱⠈⠈⠑⠻"] # 0x22F2 (Element of w long horizontal stroke) - - "â‹”": [t: "â â ˆâ ‘â Łâ Ąâ »"] # 0x22F5 (Element of w dot above) - - "⋶": [t: "⠱⠈⠑"] # 0x22F6 (Element of w overbar) - - "â‹ș": [t: "⠱⠈⠈⠹⠻"] # 0x22FA (Contains w long horizontal stroke) - - "⋜": [t: "⠱⠈⠹"] # 0x22FD (Contains w overbar) - - "⌈": [t: "⠈⠘⠷"] # 0x2308 (Left ceiling) - - "⌉": [t: "⠈⠘⠟"] # 0x2309 (Right ceiling) - - "⌊": [t: "⠈⠰⠷"] # 0x230A (Left floor) - - "⌋": [t: "⠈⠰⠟"] # 0x230B (Right floor) - - "⌱": [t: "⠫⠁"] # 0x2322 (Frown) - - "⌣": [t: "⠫⠄"] # 0x2323 (Smile) - - "■": [t: "â «â žâ Č"] # 0x25A0 (Filled square) - - "▫": [t: "â «â Č"] # 0x25AB (Small white Square) - - "□": [t: "â «â Č"] # 0x25A1 (Square) - - "◻": [t: "â «â Č"] # 0x25FB (Square) - - "▬": [t: "â «â žâ —"] # 0x25AC (Filled rectangle) - - "▭": [t: "⠫⠗"] # 0x25AD (Rectangle) - - "â–Č": [t: "â «â žâ ž"] # 0x25B2 (Black up-pointing triangle) - - "△": [t: "⠫⠞"] # 0x25B3 (White up-pointing triangle) - - "â–Œ": [t: "â žâ šâ «"] # 0x25BC (Black down-pointing triangle) - - "○": [t: "⠫⠉"] # 0x25CB (White circle) - - "●": [t: "â «â žâ ‰"] # 0x25CF (Black circle) - - "◫": [t: "â «â Čâ žâ «â łâ »"] # 0x25EB (White square w vertical bisecting line) -# - "⊄": [t: "⠫⠏"] # 0x27C2 (Perpendicular) - - "⟃": [t: "â šâ Ąâ ˆâ žâ â …â »"] # 0x27C3 (Open subset) - - "⟄": [t: "â šâ Ąâ ˆâ žâ šâ ‚â »"] # 0x27C4 (Open superset) - - "⟜": [t: "â «â šâ Ąâ ’â ’"] # 0x27DC (Left multimap) - - "⟝": [t: "â «â łâ ’â ’"] # 0x27DD (Long right tack) - - "⟞": [t: "â «â ’â ’â ł"] # 0x27DE (Long left tack) - - "⟟": [t: "â «â Łâ łâ ’â ’â šâ Ą"] # 0x27DF (Up tack w circle above) - - "⟩": [t: "⠈⠞⠷"] # 0x27E6 (Mathematical left white square bracket) - - "⟧": [t: "⠈⠞⠟"] # 0x27E7 (Mathematical right white square bracket) - - "⟹": [t: "â šâ šâ ·"] # 0x27E8 (Mathematical left angle bracket) - - "⟩": [t: "â šâ šâ Ÿ"] # 0x27E9 (Mathematical right angle bracket) - - "⟔": [t: "⠀⠫â Ș⠒⠒⠒⠀"] # 0x27F5 (Long leftwards arrow ) - - "⟶": [t: "⠀⠫⠒⠒⠒⠕⠀"] # 0x27F6 (Long rightwards arrow) - - "⟷": [t: "⠀⠫â Ș⠒⠒⠒⠕⠀"] # 0x27F7 (Long left right arrow) - - "⟾": [t: "⠀⠫â Ș⠶⠶⠶⠀"] # 0x27F8 (Long leftwards arrow ) - - "âŸč": [t: "⠀⠫⠶⠶⠶⠕⠀"] # 0x27F9 (Long rightwards arrow) - - "âŸș": [t: "⠀⠫â Ș⠶⠶⠶⠕⠀"] # 0x27FA (Long left right arrow) - - "⟻": [t: "⠀⠫â Ș⠒⠒⠒⠳⠀"] # 0x27FB (Long leftwards arrow from bar) - - "⟌": [t: "⠀⠫⠳⠒⠒⠒⠕⠀"] # 0x27FC (Long rightwards arrow from bar) - - "⟜": [t: "⠀⠫â Șâ ¶â ¶â ¶â łâ €"] # 0x27FD (Long leftwards double arrow from bar) - - "⟟": [t: "⠀⠫⠳⠶⠶⠶⠕⠀"] # 0x27FE (Long rightwards double arrow from bar) - - "⟿": [t: "⠀⠫⠹⠀⠔⠒⠹⠀⠔⠒⠹⠕⠀"] # 0x27FF (Long rightwards squiggle arrow) - - "‥": [t: "⠀⠫⠘â Ș⠒⠒⠕⠀"] # 0x2921 (North west and south east arrow) - - "‹": [t: "⠀⠫⠰â Ș⠒⠒⠕⠀"] # 0x2922 (North east and south west arrow) - - "🣐": # 0x1f8d0 (Long rightwards arrow over leftwards arrow (equilibrium)) - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "⠫⠒⠕⠫â Ș⠒"] - else: [t: "⠫⠒⠒⠈⠕⠫⠠â Ș⠒⠒"] - - "🣑": # 0x1f8d1 (Long rightwards harpoon over leftwards harpoon (equilibrium)) - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "⠫⠒⠕⠫â Ș⠒"] - else: [t: "⠫⠒⠒⠈⠕⠫⠠â Ș⠒⠒"] - - "🣒": # 0x1f8d2 (Long rightwards harpoon over short leftwards harpoon (equilibrium)) - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "⠫⠒⠒⠕⠫â Ș⠒"] - else: [t: "⠫⠒⠒⠈⠕⠫⠈â Ș⠒⠒"] - - "🣓": # 0x1f8d3 (Short rightwards harpoon over long leftwards harpoon (equilibrium, trend to the right)) - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "⠫⠒⠕⠫â Ș⠒⠒"] - else: [t: "⠫⠒⠈⠕⠫⠠â Ș⠒⠒"] - - "🣔": # 0x1f8d4 (Long leftwards harpoon over short rightwards harpoon (equilibrium, trend to the left)) - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "â «â Ș⠒⠒⠫⠒⠕"] - else: [t: "⠫⠈â Ș⠒⠒⠫⠒⠠⠕"] - - "🣕": # 0x1f8d5 (Short leftwards harpoon over long rightwards harpoon (equilibrium, trend to the left)) - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "â «â Ș⠒⠫⠒⠒⠕"] - else: [t: "⠫⠈â Ș⠒⠫⠒⠒⠠⠕"] - - "â„‚": # 0x2942 (Long rightwards harpoon over short leftwards harpoon (equilibrium)) - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "⠫⠒⠒⠕⠫â Ș⠒"] - else: [t: "⠫⠒⠒⠈⠕⠫⠈â Ș⠒⠒"] - - "â„„": # 0x2944 (Short rightwards harpoon over long leftwards harpoon (equilibrium, trend to the right)) - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "⠫⠒⠕⠫â Ș⠒⠒"] - else: [t: "⠫⠒⠈⠕⠫⠠â Ș⠒⠒"] - - "℃": # 0x2943 (Long leftwards harpoon over short rightwards harpoon (equilibrium, trend to the left)) - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "â «â Ș⠒⠒⠫⠒⠕"] - else: [t: "⠫⠈â Ș⠒⠒⠫⠒⠠⠕"] - - "🣖": [t: "⠌⠫⠒⠒⠕"] # 0x1f8d6 (long rightwards arrow with through X) - - "🣗": [t: "⠌⠫⠒⠒⠕"] # 0x1f8d7 (long rightwards arrow with double slash) chem code says it is same as 0x1f8d6 - - - - "⊃": [t: "â šâ žâ ·"] # 0x2983 (Left white curly bracket) - - "⩄": [t: "â šâ žâ Ÿ"] # 0x2984 (Right white curly bracket) - - "⩑": [t: "⠥⠈⠚⠚⠷⠻"] # 0x2991 (Left angle bracket w dot) - - "⩒": [t: "â Ąâ ˆâ šâ šâ Ÿâ »"] # 0x2992 (Right angle bracket w dot) - - "⧄": [t: "â «â Č⠞⠫⠔⠻"] # 0x29C4 (Square rising diagonal slash) - - "⧅": [t: "â «â Čâ žâ «â ąâ »"] # 0x29C5 (Square falling diagonal slash) - - "⧆": [t: "â «â Č⠞⠫⠈⠌⠻"] # 0x29C6 (Squared asterisk) - - "⧊": [t: "⠐⠫⠞⠣⠥⠻"] # 0x29CA (Triangle w dot above) - - "⧋": [t: "⠫⠞⠱"] # 0x29CB (Triangle w underbar) - - "⧌": [t: "⠫⠞⠎"] # 0x29CC (s in triangle §114) - - "â§Š": [t: "â «â łâ ¶â ¶â ł"] # 0x29E6 (Gleich stark) - - "⹌": [t: "â źâ źâ źâ ź"] # 0x2A0C (Quadruple integral operator) - - "⚍": [t: "⠟⠈⠱⠻"] # 0x2A0D (Finite part integral) - - "⚎": [t: "⠟⠈⠱⠱⠻"] # 0x2A0E (Integral w double stroke) - - "⹖": [t: "⠟⠈⠫â Čâ »"] # 0x2A16 (Quaternion integral operator) - - "⚘": [t: "⠟⠈⠈⠥⠻"] # 0x2A18 (Integral w times sign) - - "⹙": [t: "⠟⠈⠚⠩⠻"] # 0x2A19 (Integral w intersection) - - "⹚": [t: "⠟⠈⠚⠏⠻"] # 0x2A1A (Integral w union) - - "⹛": [t: "â Łâ ź"] # 0x2A1B (Integral w overbar (upper)) - - "⹜": [t: "â ©â ź"] # 0x2A1C (Integral w underbar (lower)) - - "âšą": [t: "⠐⠏⠣⠚⠥⠻"] # 0x2A22 (Plus sign w small circle above) - - "⚣": [t: "⠐⠏⠣⠞⠣⠻"] # 0x2A23 (Plus sign w circumflex accent above) - - "⚀": [t: "⠐⠏⠣⠈⠱⠻"] # 0x2A24 (Plus sign w tilde above) - - "âš„": [t: "⠐⠏⠩⠥⠻"] # 0x2A25 (Plus sign w dot below) - - "âšȘ": [t: "⠐⠱⠩⠥⠻"] # 0x2A2A (Minus sign w dot below) - - "âš°": [t: "⠐⠈⠥⠣⠥⠻"] # 0x2A30 (Multiplication sign w dot above) - - "âš±": [t: "⠈⠥⠱"] # 0x2A31 (Multiplication sign w underbar) - - "âšž": [t: "⠫⠉⠞⠫⠚⠌⠻"] # 0x2A38 (Circled division sign) - - "âšč": [t: "â «â žâ žâ «â Źâ »"] # 0x2A39 (Plus sign in triangle) - - "âšș": [t: "⠫⠞⠞⠫⠀⠻"] # 0x2A3A (Minus sign in triangle) - - "âš»": [t: "â «â žâ žâ «â ˆâ Ąâ »"] # 0x2A3B (Multiplication sign in triangle) - - "⩀": [t: "⠥⠈⠚⠩⠻"] # 0x2A40 (Intersection w dot) - - "⩁": [t: "⠀⠈⠚⠏⠻"] # 0x2A41 (Union w minus sign) - - "⩂": [t: "⠱⠚⠏"] # 0x2A42 (Union w overbar) - - "⩃": [t: "⠱⠚⠩"] # 0x2A43 (Intersection w overbar) - - "⩑": [t: "⠐⠈⠩⠣⠥⠻"] # 0x2A51 (Logical AND w dot above) - - "⩒": [t: "⠐⠈⠏⠣⠥⠻"] # 0x2A52 (Logical OR w dot above) - - "⩜": [t: "⠱⠈⠈⠩⠻"] # 0x2A5C (Logical AND with horizontal dash) - - "⩝": [t: "⠱⠈⠈⠏⠻"] # 0x2A5D (Logical OR with horizontal dash) - - "⩞": [t: "⠱⠱⠈⠩"] # 0x2A5E (Logical AND w double overbar) - - "⩟": [t: "⠈⠩⠱"] # 0x2A5F (Logical AND w underbar) - - "â© ": [t: "⠈⠩⠱⠱"] # 0x2A60 (Logical AND w double underbar) - - "⩹": [t: "⠱⠱⠈⠏"] # 0x2A62 (Logical OR w double overbar) - - "⩣": [t: "⠈⠏⠱⠱"] # 0x2A63 (Logical OR w double underbar) - - "⩊": [t: "⠐⠚⠅⠩⠥⠻"] # 0x2A66 (Equals sign w dot below) - - "â©§": [t: "⠐⠞⠇⠣⠥⠻"] # 0x2A67 (Identical w dot above) - - "â©Ș": [t: "⠐⠈⠱⠣⠥⠻"] # 0x2A6A (Tilde operator w dot above) - - "⩏": [t: "⠈⠱⠱⠈⠱"] # 0x2A6C (Similar minus similar) - - "â©­": [t: "â â ˆâ ±â šâ …â Łâ Ąâ »"] # 0x2A6D (Congruent w dot above) - - "⩟": [t: "â â šâ …â Łâ ˆâ Œâ »"] # 0x2A6E (Equals w asterisk) - - "⩯": [t: "⠐⠈⠱⠈⠱⠣⠞⠣⠻"] # 0x2A6F (Almost equal to w circumflex) - - "â©°": [t: "⠈⠱⠈⠱⠚⠅"] # 0x2A70 (Approximately equal or equal to) - - "⩱": [t: "⠹⠅⠬"] # 0x2A71 (Equals sign above plus sign) - - "â©Č": [t: "⠬⠹⠅"] # 0x2A72 (Plus sign above equals sign) - - "⩳": [t: "⠚⠅⠈⠱"] # 0x2A73 (Equals sign above tilde operator) - - "⩎": [t: "⠐⠂⠐⠂⠹⠅"] # 0x2A74 (Double colon equal) - - "â©”": [t: "⠹⠅⠹⠅"] # 0x2A75 (Two consecutive equals signs) - - "â©¶": [t: "⠹⠅⠹⠅⠹⠅"] # 0x2A76 (Three consecutive equals signs) - - "â©·": [t: "⠐⠚⠅⠩⠥⠥⠣⠥⠥⠻"] # 0x2A77 (Equals sign w two dots above and two dots below) - - "⩞": [t: "⠐⠞⠇⠣⠥⠥⠥⠥⠻"] # 0x2A78 (Equivalent w four dots above) - - "â©č": [t: "â â …â ˆâ šâ Ąâ »"] # 0x2A79 (Less than w circle inside) - - "â©ș": [t: "â šâ ‚â ˆâ šâ Ąâ »"] # 0x2A7A (Greater than w circle inside) - - "â©»": [t: "⠐⠐⠅⠣⠞⠊⠻"] # 0x2A7B (Less-than w question mark above) - - "⩌": [t: "⠐⠚⠂⠣⠞⠊⠻"] # 0x2A7C (Greater-than w question mark above) - - "âȘ…": [t: "⠐⠅⠈⠱⠈⠱"] # 0x2A85 (Less-than or approximate) - - "âȘ†": [t: "⠚⠂⠈⠱⠈⠱"] # 0x2A86 (Greater-than or approximate) - - "âȘ‹": [t: "⠐⠅⠹⠅⠹⠂"] # 0x2A8B (Less-than above double-line equal above greater-than) - - "âȘŒ": [t: "⠹⠂⠹⠅⠐⠅"] # 0x2A8C (Greater-than above double-line equal above less-than) - - "âȘ": [t: "⠐⠅⠈⠱⠱"] # 0x2A8D (Less-than above similar or equal to) - - "âȘŽ": [t: "⠚⠂⠈⠱⠱"] # 0x2A8E (Greater-than above similar or equal to) - - "âȘ": [t: "⠐⠅⠈⠱⠚⠂"] # 0x2A8F (Less-than above similar above greater-than) - - "âȘ": [t: "⠚⠂⠈⠱⠐⠅"] # 0x2A90 (Greater-than above similar above less-than) - - "âȘ‘": [t: "⠐⠅⠹⠂⠹⠅"] # 0x2A91 (Less-than above greater-than above double-line equal) - - "âȘ’": [t: "⠹⠂⠐⠅⠹⠅"] # 0x2A92 (Greater-than above less-than above double-line equal) - - "âȘ™": [t: "⠹⠅⠐⠅"] # 0x2A99 (Double-line equal to or less-than) - - "âȘš": [t: "⠹⠅⠹⠂"] # 0x2A9A (Double-line equal to or greater-than) - - "âȘ": [t: "⠈⠱⠐⠅"] # 0x2A9D (Similar or less-than) - - "âȘž": [t: "⠈⠱⠚⠂"] # 0x2A9E (Similar or greater-than) - - "âȘŸ": [t: "⠈⠱⠐⠅⠚⠅"] # 0x2A9F (Similar above less-than above equals sign) - - "âȘ ": [t: "⠈⠱⠚⠂⠚⠅"] # 0x2AA0 (Similar above greater-than above equals sign) - - "âȘź": [t: "⠈⠣⠹⠅"] # 0x2AAE (Equals sign with bumpy above) - - "âȘœ": [t: "â Ąâ ˆâ žâ â …â »"] # 0x2ABD (Subset w dot) - - "âȘŸ": [t: "â Ąâ ˆâ žâ šâ ‚â »"] # 0x2ABE (Superset w dot) - - "âȘż": [t: "⠐⠞⠐⠅⠩⠏⠻"] # 0x2ABF (Subset with plus sign below) - - "⫀": [t: "⠐⠞⠚⠂⠩⠏⠻"] # 0x2AC0 (Superset with plus sign below) - - "⫁": [t: "â â žâ â …â ©â ˆâ Ąâ »"] # 0x2AC1 (Subset with multiplication sign below) - - "⫂": [t: "â â žâ šâ ‚â ©â ˆâ Ąâ »"] # 0x2AC2 (Superset with multiplication sign below) - - "⫅": [t: "⠾⠐⠅⠹⠅"] # 0x2AC5 (Subset of above equals sign) - - "⫆": [t: "⠾⠹⠂⠹⠅"] # 0x2AC6 (Superset of above equals sign) - - "⫇": [t: "⠞⠐⠅⠈⠱"] # 0x2AC7 (Subset of above tilde operator) - - "⫈": [t: "⠞⠚⠂⠈⠱"] # 0x2AC8 (Superset of above tilde operator) - - "⫉": [t: "⠞⠐⠅⠈⠱⠈⠱"] # 0x2AC9 (Subset of above almost equal to) - - "⫊": [t: "⠞⠚⠂⠈⠱⠈⠱"] # 0x2ACA (Superset of above almost equal to) - - "⫋": [t: "⠾⠐⠅⠌⠹⠅"] # 0x2ACB (Subset of above not equals sign) - - "⫌": [t: "⠾⠹⠂⠌⠹⠅"] # 0x2ACC (Superset of above not equals sign) - - "⫓": [t: "⠾⠐⠅⠾⠹⠂"] # 0x2AD3 (Subset above superset) - - "⫔": [t: "⠾⠹⠂⠾⠐⠅"] # 0x2AD4 (Superset above subset) - - "⫕": [t: "⠾⠐⠅⠾⠐⠅"] # 0x2AD5 (Subset above subset) - - "⫖": [t: "⠾⠹⠂⠾⠹⠂"] # 0x2AD6 (Superset above superset) - - "⫗": [t: "⠾⠹⠂⠐⠾⠐⠅"] # 0x2AD7 (Superset beside subset) - - "⫯": [t: "â «â ©â šâ Ąâ ’â ’"] # 0x2AEF (Vertical line w circle above) - - "â«°": [t: "â «â Łâ šâ Ąâ ’â ’"] # 0x2AF0 (Vertical line w circle below) - - "⫱": [t: "â «â Łâ šâ Ąâ ’â ’â ł"] # 0x2AF1 (Down tack w circle below) - - "â«Č": [t: "⠱⠈⠫⠇⠻"] # 0x2AF2 (Parallel w horizontal stroke) - - "⫳": [t: "⠈⠱⠈⠫⠇⠻"] # 0x2AF3 (Parallel w tilde operator) - - "⫎": [t: "â łâ łâ ł"] # 0x2AF4 (Triple vertical bar binary relation) - - "⏏": [t: "â «â žâ ‘"] # 0x2B2C (Black ellipse) - - "⏭": [t: "⠫⠑"] # 0x2B2D (White ellipse) - - "⏰": [t: "⠚⠥⠈⠫â Ș⠒⠒⠻"] # 0x2B30 (Left arrow w small circle) - - "⏱": [t: "â «â Ș⠒⠒⠫â Ș⠒⠒⠫â Ș⠒⠒"] # 0x2B31 (Three leftwards arrows) - - "âŹČ": [t: "â «â Șâ ’â ’â ˆâ «â ‰â žâ «â Źâ »"] # 0x2B32 (Left arrow w circled plus) - - "⼖": [t: "â šâ Ą"] # 0x2B96 (Standard State Symbol) - - "⯃": [t: "â «â žâ Š"] # 0x2BC3 (Horizontal black octagon) - - # SRE lists this as a custom transcription - - "⋊": [t: "⠈⠥⠳"] # 0x22ca (RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT) +--- +# To greatly simplify typeface/language generation, the chars have unique ASCII chars for them: +# Typeface: S: sans-serif, B: bold, T: script/blackboard, I: italic, R: Roman +# Language: E: English, D: German, G: Greek, V: Greek variants, H: Hebrew, U: Russian +# Indicators: C: capital, L: letter, N: number, P: punctuation, M: multipurpose +# Others: W -- whitespace that should be kept (e.g, in a numeral) +# SRE doesn't have H: Hebrew, so not encoded (yet) +# Some of the weird letters (e.g., circled letters) I didn't translate with the above because +# they don't interact with rules since they are enclosed in other chars. + + - "⚯": [t: "⠈⠥"] # U+2A2F(VECTOR OR CROSS PRODUCT) -- make the same as 0x00D7 (Multiplication sign) + + # --- Nemeth Default Alphabet bold chars. --- + - "𝐀-𝐙": # 0x1d400 - 0x1d419 + - tc: "BE" + - spell: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "𝐚-𝐳": # 0x1d41a - 0x1d433 + - tc: "BE" + - spell: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝚹-𝛀": # 0x1d6a8 - 0x1d6c0 + - tc: "BG" + - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "𝛂-𝛒": # 0x1d6c2 - 0x1d6d2 + - tc: "BG" + - spell: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" + + - "𝛔-𝛖": # 0x1d6d4 - 0x1d6d6 + - tc: "BG" + - spell: "translate('.', '𝛔𝛕𝛖', 'στυ')" + + - "𝛘-𝛚": # 0x1d6d8 - 0x1d6da + - tc: "BG" + - spell: "translate('.', '𝛘𝛙𝛚', 'χψω')" + + - "𝛁": [tc: "BGLâ «"] # 0x1d6c1 + - "𝛓": [tc: "BVL⠎"] # 0x1d6d3 + - "𝛗": [tc: "BVL⠋"] # 0x1d6d7 + - "𝛛": [tc: "⠾⠈⠙"] # 0x1d6db + - "𝛜": [tc: "BGL⠑"] # 0x1d6dc + - "𝛝": [tc: "BVLâ č"] # 0x1d6dd + - "𝛞": [tc: "BGL⠅"] # 0x1d6de + - "𝛟": [tc: "BGL⠋"] # 0x1d6df + - "𝛠": [tc: "BGL⠗"] # 0x1d6e0 + - "𝛡": [tc: "BGL⠏"] # 0x1d6e1 + + - "𝟎-𝟗": # 0x1d7ce - 0x1d7d7 + - tc: "B" + - spell: "translate('.', '𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗', '0123456789')" + + # --- Nemeth Default Alphabet bold-fraktur chars. --- + + - "𝕬-𝖅": # 0x1d56c - 0x1d585 + - tc: "BD" + - spell: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝖆-𝖟": # 0x1d586 - 0x1d59f + - tc: "BD" + - spell: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" + + # --- Nemeth Default Alphabet bold-italic chars. --- + - "𝑹-𝒁": # 0x1d468 - 0x1d481 + - tc: "BE" + - spell: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝒂-𝒛": # 0x1d482 - 0x1d49b + - tc: "BE" + - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝜜-𝜮": # 0x1d71c - 0x1d734 + - tc: "BG" + - spell: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳𝜮', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "đœ”": [tc: "BGLâ «"] # 0x1d735 + + - "đœ¶-𝝆": # 0x1d736 - 0x1d746 + - tc: "BG" + - spell: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" + + - "𝝇": [tc: "BVL⠎"] # 0x1d747 + + - "𝝈-𝝊": # 0x1d748 - 0x1d74a + - tc: "BG" + - spell: "translate('.', '𝝈𝝉𝝊', 'στυ')" + + - "𝝋": [tc: "BVL⠋"] # 0x1d74b + + - "𝝌-𝝎": # 0x1d74c - 0x1d74e + - tc: "BG" + - spell: "translate('.', '𝝌𝝍𝝎', 'χψω')" + + - "𝝏": [tc: "BVL⠙"] # 0x1d74f + - "𝝐": [tc: "BGL⠑"] # 0x1d750 + - "𝝑": [tc: "BVLâ č"] # 0x1d751 + + - "𝝒-𝝕": # 0x1d752 - 0x1d755 + - tc: "BG" + - spell: "translate('.', '𝝒𝝓𝝔𝝕', 'Îșφρπ')" + + # --- Nemeth Default Alphabet bold-script chars. --- + + - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 + - tc: "BTE" + - spell: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "đ“Ș-𝔃": # 0x1d4ea - 0x1d503 + - tc: "BTE" + - spell: "translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz')" + + - "đš€-đš„": # 0x1d6a4 - 0x1d6a5 + - tc: "" + - spell: "translate('.', 'đš€đš„', '⠊⠚')" + +# Russian Alphabet (from Nemeth book) +# NOTE: is this translation needed? + - "А-ĐŻ": # 0x410 - 0x42f + - tc: "U" + - spell: "translate('.', 'ĐĐ‘Đ’Đ“Đ”Đ•Đ—Đ˜Đ™ĐšĐ›ĐœĐĐžĐŸĐ ĐĄĐąĐŁĐ€Đ­', 'ABVGDEZIYKLMNOPRSTUFE')" + + - "а-я": # 0x430 - 0x44f + - tc: "U" + - spell: "translate('.', 'абĐČгЎДзОĐčĐșĐ»ĐŒĐœĐŸĐżŃ€ŃŃ‚ŃƒŃ„Ń', 'abvgdeziylkmnoprstufye')" + + - "①-⑹": # 0x2460 - 0x2473 + - tc: "⠫⠉⠞⠫⠌" + - spell: "translate('.', '①⑥⑹④⑀⑄⑊⑧⑚', '123456789')" + - tc: "â »" + + - "â“Ș": [tc: "⠫⠉⠞⠫⠌⠎⠻"] # 0x24ea + + - "⑩": [tc: "⠫⠉⠞⠫⠌⠂⠎⠻"] # 0x2469 + - "â‘Ș": [tc: "⠫⠉⠞⠫⠌⠂⠂⠻"] # 0x246a + - "⑫": [tc: "⠫⠉⠞⠫⠌⠂⠆⠻"] # 0x246b + - "⑬": [tc: "⠫⠉⠞⠫⠌⠂⠒⠻"] # 0x246c + - "⑭": [tc: "⠫⠉⠞⠫⠌⠂â Čâ »"] # 0x246d + - "⑼": [tc: "â «â ‰â žâ «â Œâ ‚â ąâ »"] # 0x246e + - "⑯": [tc: "⠫⠉⠞⠫⠌⠂⠖⠻"] # 0x246f + - "⑰": [tc: "⠫⠉⠞⠫⠌⠂⠶⠻"] # 0x2470 + - "⑱": [tc: "⠫⠉⠞⠫⠌⠂⠊⠻"] # 0x2471 + - "â‘Č": [tc: "⠫⠉⠞⠫⠌⠂⠔⠻"] # 0x2472 + - "⑳": [tc: "⠫⠉⠞⠫⠌⠆⠎⠻"] # 0x2473 + + - "㉑": [tc: "⠫⠉⠞⠫⠌⠆⠂⠻"] # 0x3251 + - "㉒": [tc: "⠫⠉⠞⠫⠌⠆⠆⠻"] # 0x3252 + - "㉓": [tc: "⠫⠉⠞⠫⠌⠆⠒⠻"] # 0x3253 + - "㉔": [tc: "⠫⠉⠞⠫⠌⠆â Čâ »"] # 0x3254 + - "㉕": [tc: "â «â ‰â žâ «â Œâ †â ąâ »"] # 0x3255 + - "㉖": [tc: "⠫⠉⠞⠫⠌⠆⠖⠻"] # 0x3256 + - "㉗": [tc: "⠫⠉⠞⠫⠌⠆⠶⠻"] # 0x3257 + - "㉘": [tc: "⠫⠉⠞⠫⠌⠆⠊⠻"] # 0x3258 + - "㉙": [tc: "⠫⠉⠞⠫⠌⠆⠔⠻"] # 0x3259 + - "㉚": [tc: "⠫⠉⠞⠫⠌⠒⠎⠻"] # 0x325a + - "㉛": [tc: "⠫⠉⠞⠫⠌⠒⠂⠻"] # 0x325b + - "㉜": [tc: "⠫⠉⠞⠫⠌⠒⠆⠻"] # 0x325c + - "㉝": [tc: "⠫⠉⠞⠫⠌⠒⠒⠻"] # 0x325d + - "㉞": [tc: "⠫⠉⠞⠫⠌⠒â Čâ »"] # 0x325e + - "㉟": [tc: "â «â ‰â žâ «â Œâ ’â ąâ »"] # 0x325f + - "㊱": [tc: "⠫⠉⠞⠫⠌⠒⠖⠻"] # 0x32b1 + - "ăŠČ": [tc: "⠫⠉⠞⠫⠌⠒⠶⠻"] # 0x32b2 + - "㊳": [tc: "⠫⠉⠞⠫⠌⠒⠊⠻"] # 0x32b3 + - "㊮": [tc: "⠫⠉⠞⠫⠌⠒⠔⠻"] # 0x32b4 + - "㊔": [tc: "⠫⠉⠞⠫⠌â Čâ Žâ »"] # 0x32b5 + - "㊶": [tc: "⠫⠉⠞⠫⠌â Č⠂⠻"] # 0x32b6 + - "㊷": [tc: "⠫⠉⠞⠫⠌â Č⠆⠻"] # 0x32b7 + - "㊾": [tc: "⠫⠉⠞⠫⠌â Č⠒⠻"] # 0x32b8 + - "ăŠč": [tc: "⠫⠉⠞⠫⠌â Čâ Čâ »"] # 0x32b9 + - "ăŠș": [tc: "⠫⠉⠞⠫⠌â Čâ ąâ »"] # 0x32ba + - "㊻": [tc: "⠫⠉⠞⠫⠌â Č⠖⠻"] # 0x32bb + - "ăŠŒ": [tc: "⠫⠉⠞⠫⠌â Čâ ¶â »"] # 0x32bc + - "ăŠœ": [tc: "⠫⠉⠞⠫⠌â Čâ Šâ »"] # 0x32bd + - "ăŠŸ": [tc: "⠫⠉⠞⠫⠌â Č⠔⠻"] # 0x32be + - "㊿": [tc: "â «â ‰â žâ «â Œâ ąâ Žâ »"] # 0x32bf + +#NOTE: uncertainty here + - "Ⓐ-Ⓩ": # 0x24b6 - 0x24cf + - tc: "⠫⠉⠞⠫⠠" + - spell: "translate('.', 'â’¶â’·â’žâ’čâ’șâ’»â’Œâ’œâ’Ÿâ’żâ“€â“â“‚â“ƒâ“„â“…â“†â“‡â“ˆâ“‰â“Šâ“‹â“Œâ“â“Žâ“', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - tc: "â »" + + - "ⓐ-ⓩ": # 0x24d0 - 0x24e9 + - tc: "⠫⠉⠞⠫" + - spell: "translate('.', 'â“â“‘â“’â““â“”â“•â“–â“—â“˜â“™â“šâ“›â“œâ“â“žâ“Ÿâ“ â“Ąâ“ąâ“Łâ“€â“„â“Šâ“§â“šâ“©', 'abcdefghijklmnopqrstuvwxyz')" + - tc: "â »" + + # --- Nemeth Default Alphabet circled-sans-serif chars. --- + + - "➀-➈": # 0x1f10b, 0x2780 - 0x2788 + - tc: "⠫⠉⠞⠫⠠⠚⠌" + - spell: "translate('.', '➀➁➂➃➄➅➆➇➈', '123456789')" + - tc: "â »" + + - "🄋": [tc: "⠫⠉⠞⠫⠠⠚⠌⠎⠻"] # 0x1f10b + - "➉": [tc: "⠫⠉⠞⠫⠠⠚⠌⠂⠎⠻"] # 0x2789 + + # --- Nemeth Default Alphabet comma chars. --- + + - "🄁-🄊": # 0x1f101 - 0x1f10a + - spell: "translate('.', '🄁🄂🄃🄄🄅🄆🄇🄈🄉🄊', '0123456789')" + - tc: "â  " + + + # --- Nemeth Default Alphabet double-circled chars. --- + + - "â“”": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠂⠻⠻"] # 0x24f5 + - "⓶": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠆⠻⠻"] # 0x24f6 + - "⓷": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠒⠻⠻"] # 0x24f7 + - "⓾": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌â Č⠻⠻"] # 0x24f8 + - "â“č": [t: "â «â ‰â žâ «â «â ‰â žâ «â Œâ ąâ »â »"] # 0x24f9 + - "â“ș": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠖⠻⠻"] # 0x24fa + - "⓻": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠶⠻⠻"] # 0x24fb + - "Ⓦ": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠊⠻⠻"] # 0x24fc + - "ⓜ": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠔⠻⠻"] # 0x24fd + - "ⓟ": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠂⠎⠻⠻"] # 0x24fe + + # --- Nemeth Default Alphabet double-struck chars. --- + - "𝔾-𝕐": # 0x1d538 - 0x1d550 (partial, excludes ℂ ℍ ℕ ℙ ℚ ℝ â„€) + - tc: "đ”čE" + - spell: "translate('.', '𝔾đ”čđ”»đ”Œđ”œđ”Ÿđ•€đ•đ•‚đ•ƒđ•„đ•†đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'ABDEFGIJKLMOSTUVWXY')" + + - "ℂ": [tc: "đ”čECL⠉"] # 0x2102 + - "ℍ": [tc: "đ”čECL⠓"] # 0x210d + - "ℕ": [tc: "đ”čECL⠝"] # 0x2115 + - "ℙ": [tc: "đ”čECL⠏"] # 0x2119 + - "ℚ": [tc: "đ”čECL⠟"] # 0x211a + - "ℝ": [tc: "đ”čECL⠗"] # 0x211d + - "â„€": [tc: "đ”čECLâ ”"] # 0x2124 + - "℩": [t: "CGLâ ș"] # 0x2126 (Ohm sign (capital Greek omega)) + + - "𝕒-đ•«": # 0x1d552 - 0x1d56b + - tc: "đ”čE" + - spell: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 + - tc: "đ”č" + - spell: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" + + + # --- Nemeth Default Alphabet fraktur chars. --- + + - "𝔄-𝔜": # 0x1d504 - 0x1d51c + - tc: "D" + - spell: "translate('.', '𝔄𝔅𝔇𝔈𝔉𝔊𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'ABDEFGJKLMNOPQSTUVWXY')" + + - "ℭ": [tc: "DCL⠉"] # 0x212d + - "ℌ": [tc: "DCL⠓"] # 0x210c + - "ℑ": [tc: "DCL⠊"] # 0x2111 + - "ℜ": [tc: "DCL⠗"] # 0x211c + - "ℹ": [tc: "DCLâ ”"] # 0x2128 + + - "𝔞-đ”·": # 0x1d51e - 0x1d537 + - tc: "D" + - spell: "translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz')" + + # --- Nemeth Default Alphabet fullwidth chars. --- + + - "ïŒĄ-ïŒș": # 0xff21 - 0xff3a + - tc: "" + - spell: "translate('.', 'ïŒĄïŒąïŒŁïŒ€ïŒ„ïŒŠïŒ§ïŒšïŒ©ïŒȘïŒ«ïŒŹïŒ­ïŒźïŒŻïŒ°ïŒ±ïŒČïŒłïŒŽïŒ”ïŒ¶ïŒ·ïŒžïŒčïŒș', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xff41 - 0xff5a + - tc: "" + - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xff10 - 0xff19 + - tc: "" + - spell: "translate('.', '', '0123456789')" + + # --- Nemeth Default Alphabet italic chars -- treat as non-italic. --- + + - "𝐮-𝑍": # 0x1d434 - 0x1d44d + - tc: "E" + - spell: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝑎-𝑧": # 0x1d44e - 0x1d467 + - tc: "E" + - spell: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”â„Žđ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝛱-đ›ș": # 0x1d6e2 - 0x1d6fa + - tc: "G" + - spell: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›čđ›ș', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "đ›»": [tc: "GLâ «"] # 0x1d6fb + + - "đ›Œ-𝜌": # 0x1d6fc - 0x1d70c + - tc: "G" + - spell: "translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" + - "𝜍": [tc: "VL⠎"] # 0x1d70d + + - "𝜎": [tc: "GL⠎"] # 0x1d70e + - "𝜏": [tc: "GL⠞"] # 0x1d70f + - "𝜐": [tc: "GLâ „"] # 0x1d710 + + - "𝜑": [tc: "VL⠋"] # 0x1d711 + + - "𝜒": [tc: "GLâ Ż"] # 0x1d712 + - "𝜓": [tc: "GLâ œ"] # 0x1d713 + - "𝜔": [tc: "GLâ ș"] # 0x1d714 + + - "𝜕": [tc: "VL⠙"] # 0x1d715 + + - "𝜖": [tc: "GL⠑"] # 0x1d716 + + - "𝜗": [tc: "VLâ č"] # 0x1d717 + + - "𝜘": [tc: "GL⠅"] # 0x1d718 + - "𝜙": [tc: "GL⠋"] # 0x1d719 + - "𝜚": [tc: "GL⠗"] # 0x1d71a + - "𝜛": [tc: "GL⠏"] # 0x1d71b + + # --- Nemeth Default Alphabet monospace chars. --- + + - "𝙰-𝚉": # 0x1d670 - 0x1d689 + - tc: "" + - spell: "translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝚊-𝚣": # 0x1d68a - 0x1d6a3 + - tc: "" + - spell: "translate('.', '𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚱𝚣', 'abcdefghijklmnopqrstuvwxyz')" + + - "đŸ¶-𝟿": # 0x1d7f6 - 0x1d7ff + - tc: "" + - spell: "translate('.', 'đŸ¶đŸ·đŸžđŸčđŸșđŸ»đŸŒđŸœđŸŸđŸż', '0123456789')" + + + # --- Nemeth Default Alphabet negative-circled chars. --- + - "⓿": [t: "⠫⠞⠉⠞⠫⠌⠎⠻"] # 0x24ff + - "❶": [t: "⠫⠞⠉⠞⠫⠌⠂⠻"] # 0x2776 + - "❷": [t: "⠫⠞⠉⠞⠫⠌⠆⠻"] # 0x2777 + - "❞": [t: "⠫⠞⠉⠞⠫⠌⠒⠻"] # 0x2778 + - "âč": [t: "⠫⠞⠉⠞⠫⠌â Čâ »"] # 0x2779 + - "âș": [t: "â «â žâ ‰â žâ «â Œâ ąâ »"] # 0x277a + - "❻": [t: "⠫⠞⠉⠞⠫⠌⠖⠻"] # 0x277b + - "❌": [t: "⠫⠞⠉⠞⠫⠌⠶⠻"] # 0x277c + - "❜": [t: "⠫⠞⠉⠞⠫⠌⠊⠻"] # 0x277d + - "❟": [t: "⠫⠞⠉⠞⠫⠌⠔⠻"] # 0x277e + - "❿": [t: "⠫⠞⠉⠞⠫⠌⠂⠎⠻"] # 0x277f + - "⓫": [t: "⠫⠞⠉⠞⠫⠌⠂⠂⠻"] # 0x24eb + - "⓬": [t: "⠫⠞⠉⠞⠫⠌⠂⠆⠻"] # 0x24ec + - "⓭": [t: "⠫⠞⠉⠞⠫⠌⠂⠒⠻"] # 0x24ed + - "⓼": [t: "⠫⠞⠉⠞⠫⠌⠂â Čâ »"] # 0x24ee + - "⓯": [t: "â «â žâ ‰â žâ «â Œâ ‚â ąâ »"] # 0x24ef + - "⓰": [t: "⠫⠞⠉⠞⠫⠌⠂⠖⠻"] # 0x24f0 + - "⓱": [t: "⠫⠞⠉⠞⠫⠌⠂⠶⠻"] # 0x24f1 + - "â“Č": [t: "⠫⠞⠉⠞⠫⠌⠂⠊⠻"] # 0x24f2 + - "⓳": [t: "⠫⠞⠉⠞⠫⠌⠂⠔⠻"] # 0x24f3 + - "⓮": [t: "⠫⠞⠉⠞⠫⠌⠆⠎⠻"] # 0x24f4 + + - "🅐": [t: "⠫⠞⠉⠞⠫⠠⠁⠻"] # 0x1f150 + - "🅑": [t: "⠫⠞⠉⠞⠫⠠⠃⠻"] # 0x1f151 + - "🅒": [t: "⠫⠞⠉⠞⠫⠠⠉⠻"] # 0x1f152 + - "🅓": [t: "⠫⠞⠉⠞⠫⠠⠙⠻"] # 0x1f153 + - "🅔": [t: "⠫⠞⠉⠞⠫⠠⠑⠻"] # 0x1f154 + - "🅕": [t: "⠫⠞⠉⠞⠫⠠⠋⠻"] # 0x1f155 + - "🅖": [t: "⠫⠞⠉⠞⠫⠠⠛⠻"] # 0x1f156 + - "🅗": [t: "⠫⠞⠉⠞⠫⠠⠓⠻"] # 0x1f157 + - "🅘": [t: "⠫⠞⠉⠞⠫⠠⠊⠻"] # 0x1f158 + - "🅙": [t: "⠫⠞⠉⠞⠫⠠⠚⠻"] # 0x1f159 + - "🅚": [t: "⠫⠞⠉⠞⠫⠠⠅⠻"] # 0x1f15a + - "🅛": [t: "⠫⠞⠉⠞⠫⠠⠇⠻"] # 0x1f15b + - "🅜": [t: "⠫⠞⠉⠞⠫⠠⠍⠻"] # 0x1f15c + - "🅝": [t: "⠫⠞⠉⠞⠫⠠⠝⠻"] # 0x1f15d + - "🅞": [t: "⠫⠞⠉⠞⠫⠠⠕⠻"] # 0x1f15e + - "🅟": [t: "⠫⠞⠉⠞⠫⠠⠏⠻"] # 0x1f15f + - "🅠": [t: "⠫⠞⠉⠞⠫⠠⠟⠻"] # 0x1f160 + - "🅡": [t: "⠫⠞⠉⠞⠫⠠⠗⠻"] # 0x1f161 + - "🅱": [t: "⠫⠞⠉⠞⠫⠠⠎⠻"] # 0x1f162 + - "🅣": [t: "⠫⠞⠉⠞⠫⠠⠞⠻"] # 0x1f163 + - "đŸ…€": [t: "⠫⠞⠉⠞⠫⠠⠄⠻"] # 0x1f164 + - "đŸ…„": [t: "⠫⠞⠉⠞⠫⠠⠧⠻"] # 0x1f165 + - "🅩": [t: "⠫⠞⠉⠞⠫⠠â șâ »"] # 0x1f166 + - "🅧": [t: "⠫⠞⠉⠞⠫⠠⠭⠻"] # 0x1f167 + - "🅹": [t: "⠫⠞⠉⠞⠫⠠⠜⠻"] # 0x1f168 + - "đŸ…©": [t: "⠫⠞⠉⠞⠫⠠⠔⠻"] # 0x1f169 + + # --- Nemeth Default Alphabet negative-circled-sans-serif chars. --- + - "🄌": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠎⠻"] # 0x1f10c + - "➊": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠂⠻"] # 0x278a + - "➋": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠆⠻"] # 0x278b + - "➌": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠒⠻"] # 0x278c + - "➍": [t: "⠫⠞⠉⠞⠫⠠⠚⠌â Čâ »"] # 0x278d + - "➎": [t: "â «â žâ ‰â žâ «â  â šâ Œâ ąâ »"] # 0x278e + - "➏": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠖⠻"] # 0x278f + - "➐": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠶⠻"] # 0x2790 + - "➑": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠊⠻"] # 0x2791 + - "➒": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠔⠻"] # 0x2792 + - "➓": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠂⠎⠻"] # 0x2793 + + # --- Nemeth Default Alphabet negative-squared chars. --- + - "🅰-🆉": # 0x1f170 - 0x1f189 + - tc: "â «â žâ Čâ žâ «â  " + - spell: "translate('.', 'đŸ…°đŸ…±đŸ…ČđŸ…łđŸ…ŽđŸ…”đŸ…¶đŸ…·đŸ…žđŸ…čđŸ…șđŸ…»đŸ…ŒđŸ…œđŸ…ŸđŸ…żđŸ†€đŸ†đŸ†‚đŸ†ƒđŸ†„đŸ†…đŸ††đŸ†‡đŸ†ˆđŸ†‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - tc: "â »" + + # --- Nemeth Default Alphabet parenthesized chars. --- + + - "⑮-⑌": # 0x2474 - 0x247c + - tc: "â ·" + - spell: "translate('.', '⑎⑔⑶⑷⑞â‘čâ‘ș⑻⑌', '123456789')" + - tc: "â Ÿ" + + - "⑜": [t: "â ·â ‚â Žâ Ÿ"] # 0x247d + - "⑟": [t: "â ·â ‚â ‚â Ÿ"] # 0x247e + - "⑿": [t: "⠷⠂⠆⠟"] # 0x247f + - "⒀": [t: "â ·â ‚â ’â Ÿ"] # 0x2480 + - "⒁": [t: "⠷⠂â Čâ Ÿ"] # 0x2481 + - "⒂": [t: "â ·â ‚â ąâ Ÿ"] # 0x2482 + - "⒃": [t: "â ·â ‚â –â Ÿ"] # 0x2483 + - "⒄": [t: "â ·â ‚â ¶â Ÿ"] # 0x2484 + - "⒅": [t: "â ·â ‚â Šâ Ÿ"] # 0x2485 + - "⒆": [t: "⠷⠂⠔⠟"] # 0x2486 + - "⒇": [t: "⠷⠆⠎⠟"] # 0x2487 + + - "🄐-đŸ„©": # 0x1f110 - 0x1f129 + - tc: "â ·â  " + - spell: "translate('.', 'đŸ„đŸ„‘đŸ„’đŸ„“đŸ„”đŸ„•đŸ„–đŸ„—đŸ„˜đŸ„™đŸ„šđŸ„›đŸ„œđŸ„đŸ„žđŸ„ŸđŸ„ đŸ„ĄđŸ„ąđŸ„ŁđŸ„€đŸ„„đŸ„ŠđŸ„§đŸ„šđŸ„©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - tc: "â Ÿ" + + - "⒜-â’”": # 0x249c - 0x24b5 + - tc: "â ·" + - spell: "translate('.', 'â’œâ’â’žâ’Ÿâ’ â’Ąâ’ąâ’Łâ’€â’„â’Šâ’§â’šâ’©â’Șâ’«â’Źâ’­â’źâ’Żâ’°â’±â’Čâ’łâ’Žâ’”', 'abcdefghijklmnopqrstuvwxyz')" + - tc: "â Ÿ" + + # --- Nemeth Default Alphabet period chars. --- + - "🄀": [t: "â Žâ žâ Č"] # 0x1f100 + - "⒈": [t: "⠂⠾â Č"] # 0x2488 + - "⒉": [t: "⠆⠾â Č"] # 0x2489 + - "⒊": [t: "⠒⠾â Č"] # 0x248a + - "⒋": [t: "â Čâ žâ Č"] # 0x248b + - "⒌": [t: "â ąâ žâ Č"] # 0x248c + - "⒍": [t: "⠖⠾â Č"] # 0x248d + - "⒎": [t: "â ¶â žâ Č"] # 0x248e + - "⒏": [t: "â Šâ žâ Č"] # 0x248f + - "⒐": [t: "⠔⠾â Č"] # 0x2490 + + - "⒑": [t: "⠂⠮⠾â Č"] # 0x2491 + - "⒒": [t: "⠂⠂⠾â Č"] # 0x2492 + - "⒓": [t: "⠂⠆⠾â Č"] # 0x2493 + - "⒔": [t: "⠂⠒⠾â Č"] # 0x2494 + - "⒕": [t: "⠂â Čâ žâ Č"] # 0x2495 + - "⒖": [t: "⠂⠱⠾â Č"] # 0x2496 + - "⒗": [t: "⠂⠖⠾â Č"] # 0x2497 + - "⒘": [t: "â ‚â ¶â žâ Č"] # 0x2498 + - "⒙": [t: "⠂⠩⠾â Č"] # 0x2499 + - "⒚": [t: "⠂⠔⠾â Č"] # 0x249a + - "⒛": [t: "⠆⠮⠾â Č"] # 0x249b + + # --- Nemeth Default Alphabet sans-serif chars. --- + - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 + - tc: "SE" + - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 + - tc: "SE" + - spell: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝟱-đŸ«": # 0x1d7e2 - 0x1d7eb + - tc: "S" + - spell: "translate('.', 'đŸąđŸŁđŸ€đŸ„đŸŠđŸ§đŸšđŸ©đŸȘđŸ«', '0123456789')" + + # --- Nemeth Default Alphabet sans-serif-bold chars. --- + - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed + - tc: "SBE" + - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝗼-𝘇": # 0x1d5ee - 0x1d607 + - tc: "SBE" + - spell: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝝖-𝝼": # 0x1d756 - 0x1d76e + - tc: "SBG" + - spell: "translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đź', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "𝝰-𝞀": # 0x1d770 - 0x1d780 + - tc: "SBG" + - spell: "translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" + + - "𝝯": [tc: "SBGLâ «"] # 0x1d76f + + - "𝞁": [tc: "SBVL⠎"] # 0x1d781 + + - "𝞂-𝞄": # 0x1d782 - 0x1d784 + - tc: "SBG" + - spell: "translate('.', '𝞂𝞃𝞄', 'στυ')" + + - "𝞅": [tc: "SBVL⠋"] # 0x1d785 + + - "𝞆-𝞈": # 0x1d786 - 0x1d788 + - tc: "SBG" + - spell: "translate('.', '𝞆𝞇𝞈', 'χψω')" + + - "𝞉": [tc: "⠠⠹⠾⠈⠙"] # 0x1d789 + - "𝞊": [tc: "SBGL⠑"] # 0x1d78a + - "𝞋": [tc: "SBVLâ č"] # 0x1d78b + + - "𝞌-𝞏": # 0x1d78c - 0x1d78f + - tc: "SBG" + - spell: "translate('.', '𝞌𝞍𝞎𝞏', 'Îșφρπ')" + + - "𝟬-đŸ”": # 0x1d7ec - 0x1d7f5 + - tc: "SB" + - spell: "translate('.', 'đŸŹđŸ­đŸźđŸŻđŸ°đŸ±đŸČđŸłđŸŽđŸ”', '0123456789')" + + # --- Nemeth Default Alphabet sans-serif-bold-italic chars. --- + + - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 + - tc: "SBE" + - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝙖-𝙯": # 0x1d656 - 0x1d66f + - tc: "SBE" + - spell: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝞐-𝞹": # 0x1d790 - 0x1d7a8 + - tc: "SBG" + - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "đž©": [t: "SBGLâ «"] # 0x1d7a9 + + - "đžȘ-đžș": # 0x1d7aa - 0x1d7ba + - tc: "SBG" + - spell: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžș', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" + + - "đž»": [t: "SBVL⠎"] # 0x1d7bb + - "đžŒ": [t: "SBGL⠎"] # 0x1d7bc + - "đžœ": [t: "SBGL⠞"] # 0x1d7bd + - "đžŸ": [t: "SBGLâ „"] # 0x1d7be + - "𝞿": [t: "SBVL⠋"] # 0x1d7bf + + - "𝟀": [t: "SBGLâ Ż"] # 0x1d7c0 + - "𝟁": [t: "SBGLâ œ"] # 0x1d7c1 + - "𝟂": [t: "SBGLâ ș"] # 0x1d7c2 + - "𝟃": [t: "SBVL⠙"] # 0x1d7c3 + + - "𝟄": [t: "SBGL⠑"] # 0x1d7c4 + - "𝟅": [t: "SBVLâ č"] # 0x1d7c5 + + - "𝟆": [t: "SBGL⠅"] # 0x1d7c6 + - "𝟇": [t: "SBGL⠋"] # 0x1d7c7 + - "𝟈": [t: "SBGL⠗"] # 0x1d7c8 + - "𝟉": [t: "SBGL⠏"] # 0x1d7c9 + + # --- Nemeth Default Alphabet sans-serif-italic chars. --- + - "𝘈-𝘡": # 0x1d608 - 0x1d621 + - tc: "SE" + - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝘱-đ˜»": # 0x1d622 - 0x1d63b + - tc: "SE" + - spell: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" + + # --- Nemeth Default Alphabet script chars. --- + - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 + - tc: "TE" + - spell: "translate('.', 'đ’œđ’žđ’Ÿđ’ąđ’„đ’Šđ’©đ’Șđ’«đ’Źđ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'ACDGJKNOPQSTUVWXYZ')" + + - "ℬ": [t: "TECL⠃"] # 0x212c + - "ℰ": [t: "TECL⠑"] # 0x2130 + - "ℱ": [t: "TECL⠋"] # 0x2131 + - "ℋ": [t: "TECL⠓"] # 0x210b + - "ℐ": [t: "TECL⠊"] # 0x2110 + - "ℒ": [t: "TECL⠇"] # 0x2112 + - "ℳ": [t: "TECL⠍"] # 0x2133 + - "ℛ": [t: "TECL⠗"] # 0x211b + + - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf + - tc: "TE" + - spell: "translate('.', 'đ’¶đ’·đ’žđ’čđ’»đ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdfhijklmnpqrstuvwxyz')" + + - "ℯ": [t: "TEL⠑"] # 0x212f + - "ℊ": [t: "TEL⠛"] # 0x210a + - "℮": [t: "TEL⠕"] # 0x2134 + + # --- Nemeth Default Alphabet squared chars. --- + + - "🄰": [t: "â «â Č⠞⠫⠠⠁⠻"] # 0x1f130 + - "đŸ„±": [t: "â «â Č⠞⠫⠠⠃⠻"] # 0x1f131 + - "đŸ„Č": [t: "â «â Č⠞⠫⠠⠉⠻"] # 0x1f132 + - "🄳": [t: "â «â Č⠞⠫⠠⠙⠻"] # 0x1f133 + - "🄮": [t: "â «â Čâ žâ «â  â ‘â »"] # 0x1f134 + - "đŸ„”": [t: "â «â Čâ žâ «â  â ‹â »"] # 0x1f135 + - "đŸ„¶": [t: "â «â Č⠞⠫⠠⠛⠻"] # 0x1f136 + - "đŸ„·": [t: "â «â Čâ žâ «â  â “â »"] # 0x1f137 + - "🄾": [t: "â «â Čâ žâ «â  â Šâ »"] # 0x1f138 + - "đŸ„č": [t: "â «â Čâ žâ «â  â šâ »"] # 0x1f139 + - "đŸ„ș": [t: "â «â Čâ žâ «â  â …â »"] # 0x1f13a + - "đŸ„»": [t: "â «â Č⠞⠫⠠⠇⠻"] # 0x1f13b + - "đŸ„Œ": [t: "â «â Č⠞⠫⠠⠍⠻"] # 0x1f13c + - "đŸ„œ": [t: "â «â Č⠞⠫⠠⠝⠻"] # 0x1f13d + - "đŸ„Ÿ": [t: "â «â Čâ žâ «â  â •â »"] # 0x1f13e + - "🄿": [t: "â «â Č⠞⠫⠠⠏⠻"] # 0x1f13f + - "🅀": [t: "â «â Čâ žâ «â  â Ÿâ »"] # 0x1f140 + - "🅁": [t: "â «â Čâ žâ «â  â —â »"] # 0x1f141 + - "🅂": [t: "â «â Čâ žâ «â  â Žâ »"] # 0x1f142 + - "🅃": [t: "â «â Čâ žâ «â  â žâ »"] # 0x1f143 + - "🅄": [t: "â «â Čâ žâ «â  â „â »"] # 0x1f144 + - "🅅": [t: "â «â Čâ žâ «â  â §â »"] # 0x1f145 + - "🅆": [t: "â «â Čâ žâ «â  â șâ »"] # 0x1f146 + - "🅇": [t: "â «â Čâ žâ «â  â ­â »"] # 0x1f147 + - "🅈": [t: "â «â Č⠞⠫⠠⠜⠻"] # 0x1f148 + - "🅉": [t: "â «â Č⠞⠫⠠⠔⠻"] # 0x1f149 + + # --- Nemeth Default Alphabet sub chars. --- + + - "₀": [t: "â °â Ž"] # 0x2080 + - "₁": [t: "⠰⠂"] # 0x2081 + - "₂": [t: "⠰⠆"] # 0x2082 + - "₃": [t: "⠰⠒"] # 0x2083 + - "₄": [t: "â °â Č"] # 0x2084 + - "₅": [t: "â °â ą"] # 0x2085 + - "₆": [t: "⠰⠖"] # 0x2086 + - "₇": [t: "â °â ¶"] # 0x2087 + - "₈": [t: "â °â Š"] # 0x2088 + - "₉": [t: "⠰⠔"] # 0x2089 + + # --- Nemeth Default Alphabet super chars. --- + + - "⁰": [t: "⠘⠎"] # 0x2070 + - "Âč": [t: "⠘⠂"] # 0xb9 + - "ÂČ": [t: "⠘⠆"] # 0xb2 + - "Âł": [t: "⠘⠒"] # 0xb3 + - "⁎": [t: "⠘â Č"] # 0x2074 + - "⁔": [t: "⠘⠹"] # 0x2075 + - "⁶": [t: "⠘⠖"] # 0x2076 + - "⁷": [t: "⠘⠶"] # 0x2077 + - "⁞": [t: "⠘⠊"] # 0x2078 + - "âč": [t: "⠘⠔"] # 0x2079 + + # --- Nemeth Default Characters latin-lower-phonetic chars. --- + + - "Ăž": [t: "⠈⠕"] # 0xf8 + + # --- Nemeth Default Characters math_geometry chars. --- + + - "─": [t: "â ±"] # 0x2500 + - "│": [t: "â ł"] # 0x2502 + - "▰": [t: "â «â žâ ›"] # 0x25b0 + - "▱": [t: "⠫⠛"] # 0x25b1 + - "â–œ": [t: "â šâ «"] # 0x25bd + - "◆": [t: "â «â žâ ™"] # 0x25c6 + - "◇": [t: "⠫⠙"] # 0x25c7 + - "◈": [t: "â «â žâ ™"] # 0x25c8 + - "◉": [t: "â «â žâ ‰"] # 0x25c9 + - "◊": [t: "⠫⠙"] # 0x25ca + - "⬟": [t: "â «â žâ ą"] # 0x2b1f + - "⏠": [t: "â «â ą"] # 0x2b20 + - "⏥": [t: "⠫⠖"] # 0x2b21 + - "⏹": [t: "â «â žâ –"] # 0x2b22 + - "⏣": [t: "â «â žâ –"] # 0x2b23 + - "⏀": [t: "â «â žâ ‰"] # 0x2b24 + - "⏄": [t: "â «â žâ ™"] # 0x2b25 + + # --- Nemeth Default Characters math_symbols chars. --- + + - "\"": [t: "⠄⠄"] # 0x22 + - "ÂĄ": [t: "⠖"] # 0xa1 + - "Âą": [t: "⠈⠉"] # 0xa2 + - "ÂŁ": [t: "⠈⠇"] # 0xa3 + - "€": [t: "⠈⠫"] # 0xa4 + - "„": [t: "⠈⠜"] # 0xa5 + - "§": [t: "⠈⠠⠎"] # 0xa7 + - "©": [t: "⠘⠉"] # 0xa9 (Copyright) + - "ÂȘ": [t: "⠞⠰⠁"] # 0xaa + - "«": [t: "⠐⠅⠈⠐⠅⠻"] # 0xab + - "Âź": [t: "⠘⠗"] # 0xae + - "ÂŽ": [t: "⠈"] # 0xb4 + - "”": [t: "⠚⠍"] # 0xb5 + - "¶": [t: "⠈⠠⠏"] # 0xb6 + - "Âż": [t: "â Š"] # 0xbf + - "Êč": [t: "⠄"] # 0x2b9 + - "Êș": [t: "⠄⠄"] # 0x2ba + - "˙": [t: "â Ą"] # 0x2d9 + - "˜": [t: "⠈⠱"] # 0x2dc + - "‐": [t: "â €"] # 0x2010 + - "‑": [t: "â €"] # 0x2011 + - "‒": [t: "⠀⠀"] # 0x2012 + - "–": [t: "⠀⠀"] # 0x2013 + - "‖": [t: "â łâ ł"] # 0x2016 + - "†": [t: "â žâ »"] # 0x2020 + - "‡": [t: "â žâ žâ »"] # 0x2021 + - "‱": [t: "â Ą"] # 0x2022 + - " ": [t: "⠄"] # 0x2024 + - " ": [t: "⠄⠄"] # 0x2025 + - "â€Č": [t: "⠄"] # 0x2032 + - "″": [t: "⠄⠄"] # 0x2033 + - "‮": [t: "⠄⠄."] # 0x2034 (Triple prime) + - "⁗": [t: "⠄⠄.."] # 0x2057 (Quadruple prime) + - "‌": [t: "⠖⠖"] # 0x203c + - "‟": [t: "â ±"] # 0x203e + - "⁇": [t: "â čâ č"] # 0x2047 + - "⁈": [t: "â č⠖"] # 0x2048 + - "⁉": [t: "⠖â č"] # 0x2049 + - "∀": [t: "⠈⠯"] # 0x2200 + - "∃": [t: "⠈⠿"] # 0x2203 + - "∄": [t: "⠌⠈⠿"] # 0x2204 + - "∅": [t: "â žâ Ž"] # 0x2205 + - "∈": [t: "⠈⠑"] # 0x2208 + - "∉": [t: "⠌⠈⠑"] # 0x2209 + - "∊": [t: "⠈⠑"] # 0x220a + - "∋": [t: "⠈⠹"] # 0x220b + - "∌": [t: "⠌⠈⠱"] # 0x220c + - "∍": [t: "⠈⠹"] # 0x220d + - "∎": [t: "â žâ ł"] # 0x220e + - "−": [t: "â €"] # 0x2212 + - "∓": [t: "⠀⠏"] # 0x2213 + - "∕": [t: "⠾⠌"] # 0x2215 + - "∖": [t: "â žâ Ą"] # 0x2216 + - "∗": [t: "⠈⠌"] # 0x2217 + - "∘": [t: "â šâ Ą"] # 0x2218 + - "∝": [t: "â žâ ż"] # 0x221d + - "∞": [t: "â  â ż"] # 0x221e + - "∟": [t: "â «â Șâ šâ —â »"] # 0x221f + - "∠": [t: "â «â Ș"] # 0x2220 + - "∹": [t: "â «â Ș⠞⠫⠫⠁⠻"] # 0x2222 + - "∣": [t: "â ł"] # 0x2223 + - "∀": [t: "⠌⠳"] # 0x2224 + - "∄": [t: "⠫⠇"] # 0x2225 + - "∊": [t: "⠌⠫⠇"] # 0x2226 + - "∧": [t: "⠈⠩"] # 0x2227 + - "√": [t: "⠈⠏"] # 0x2228 + - "∩": [t: "â šâ ©"] # 0x2229 + - "âˆȘ": [t: "â šâ Ź"] # 0x222a + - "∫": [t: "â ź"] # 0x222b + - "∏": [t: "â źâ ź"] # 0x222c + - "∭": [t: "â źâ źâ ź"] # 0x222d + - "∟": [t: "â źâ ˆâ «â ‰â »"] # 0x222e + - "âˆČ": [t: "⠟⠈⠫â Ș⠹⠔⠻"] # 0x2232 + - "∳": [t: "â źâ ˆâ «â ąâ ”â •â »"] # 0x2233 + - "∎": [t: "â  â Ą"] # 0x2234 + - "∔": [t: "⠈⠌"] # 0x2235 + - "∶": [t: "⠐⠂"] # 0x2236 + - "∷": [t: "⠰⠆"] # 0x2237 + - "∞": [t: "â šâ €"] # 0x2238 + - "∌": [t: "⠈⠱"] # 0x223c + - "≁": [t: "⠌⠈⠱"] # 0x2241 + - "≂": [t: "⠱⠈⠱"] # 0x2242 + - "≃": [t: "⠈⠱⠱"] # 0x2243 + - "≄": [t: "⠌⠈⠱⠱"] # 0x2244 + - "≅": [t: "⠈⠱⠚⠅"] # 0x2245 + - "≆": [t: "⠈⠱⠌⠚⠅"] # 0x2246 + - "≇": [t: "⠌⠈⠱⠚⠅"] # 0x2247 + - "≈": [t: "⠈⠱⠈⠱"] # 0x2248 + - "≉": [t: "⠌⠈⠱⠈⠱"] # 0x2249 + - "≊": [t: "⠈⠱⠈⠱⠱"] # 0x224a + - "≍": [t: "⠈⠣⠠⠣"] # 0x224d + - "≎": [t: "⠈⠣⠠⠣"] # 0x224e + - "≐": [t: "⠐⠚⠅⠣⠥⠻"] # 0x2250 + - "≑": [t: "⠐⠚⠅⠩⠥⠣⠥⠻"] # 0x2251 + - "≗": [t: "⠐⠚⠅⠣⠚⠥⠻"] # 0x2257 + - "≘": [t: "⠐⠚⠅⠣⠫⠁⠻"] # 0x2258 + - "≙": [t: "⠐⠚⠅⠣⠞⠣⠻"] # 0x2259 + - "≚": [t: "⠐⠚⠅⠣⠞⠩⠻"] # 0x225a + - "≛": [t: "⠐⠚⠅⠣⠫⠞⠎⠻"] # 0x225b + - "≜": [t: "⠐⠚⠅⠣⠫⠞⠻"] # 0x225c + - "≝": [t: "⠐⠚⠅⠣⠙⠑⠋⠻"] # 0x225d + - "≞": [t: "â â šâ …â Łâ â »"] # 0x225e + - "≟": [t: "⠐⠚⠅⠣⠞⠊⠻"] # 0x225f + - "≠": [t: "⠌⠹⠅"] # 0x2260 + - "≱": [t: "⠌⠾⠇"] # 0x2262 + - "≀": [t: "⠐⠅⠱"] # 0x2264 + - "≄": [t: "â šâ ‚â ±"] # 0x2265 + - "≩": [t: "⠐⠅⠹⠅"] # 0x2266 + - "≧": [t: "⠹⠂⠹⠅"] # 0x2267 + - "≹": [t: "⠐⠅⠌⠹⠅"] # 0x2268 + - "≩": [t: "⠹⠂⠌⠹⠅"] # 0x2269 + - "â‰Ș": [t: "⠐⠅⠈⠐⠅⠻"] # 0x226a + - "≫": [t: "⠚⠂⠈⠚⠂⠻"] # 0x226b + - "≭": [t: "⠌⠈⠣⠠⠣"] # 0x226d + - "≼": [t: "⠌⠐⠅"] # 0x226e + - "≯": [t: "⠌⠹⠂"] # 0x226f + - "≰": [t: "⠌⠐⠅⠱"] # 0x2270 + - "≱": [t: "⠌⠚⠂⠱"] # 0x2271 + - "â‰Č": [t: "⠐⠅⠈⠱"] # 0x2272 + - "≳": [t: "⠚⠂⠈⠱"] # 0x2273 + - "≮": [t: "⠌⠐⠅⠈⠱"] # 0x2274 + - "≔": [t: "⠌⠚⠂⠈⠱"] # 0x2275 + - "≶": [t: "⠐⠅⠹⠂"] # 0x2276 + - "≷": [t: "⠹⠂⠐⠅"] # 0x2277 + - "≾": [t: "⠌⠐⠅⠹⠂"] # 0x2278 + - "â‰č": [t: "⠌⠹⠂⠐⠅"] # 0x2279 + - "â‰ș": [t: "⠹⠐⠅"] # 0x227a + - "≻": [t: "⠹⠹⠂"] # 0x227b + - "≌": [t: "⠚⠐⠅⠱"] # 0x227c + - "≜": [t: "⠚⠚⠐⠱"] # 0x227d + - "≟": [t: "⠚⠐⠅⠈⠱"] # 0x227e + - "≿": [t: "⠚⠚⠂⠈⠱"] # 0x227f + - "⊀": [t: "⠌⠹⠐⠅"] # 0x2280 + - "⊁": [t: "⠌⠹⠐⠅"] # 0x2281 + - "⊂": [t: "⠾⠐⠅"] # 0x2282 + - "⊃": [t: "⠾⠹⠂"] # 0x2283 + - "⊄": [t: "⠌⠾⠐⠅"] # 0x2284 + - "⊅": [t: "⠌⠾⠹⠂"] # 0x2285 + - "⊆": [t: "⠞⠐⠅⠱"] # 0x2286 + - "⊇": [t: "â žâ šâ ‚â ±"] # 0x2287 + - "⊈": [t: "⠌⠞⠐⠅⠱"] # 0x2288 + - "⊉": [t: "⠌⠞⠚⠂⠱"] # 0x2289 + - "⊊": [t: "⠾⠐⠅⠌⠹⠅"] # 0x228a + - "⊋": [t: "⠾⠹⠂⠌⠹⠅"] # 0x228b + - "⊄": [t: "⠫⠏"] # 0x22a5 + - "⋀": [t: "⠈⠩"] # 0x22c0 + - "⋁": [t: "⠈⠏"] # 0x22c1 + - "⋂": [t: "â šâ ©"] # 0x22c2 + - "⋃": [t: "â šâ Ź"] # 0x22c3 + - "⋄": [t: "â «â ©"] # 0x22c4 + - "⋜": [t: "⠱⠐⠅"] # 0x22dc + - "⋝": [t: "⠱⠚⠂"] # 0x22dd + - "⟂": [t: "⠫⠏"] # 0x27c2 + - "⩀": [t: "â łâ łâ ł"] # 0x2980 + - "⊶": [t: "⠫⠉⠞⠫⠳⠻"] # 0x29b6 + - "⊷": [t: "⠫⠉⠞⠫⠫⠇⠻"] # 0x29b7 + - "⊞": [t: "⠫⠉⠞⠫⠞⠥⠻"] # 0x29b8 + - "âŠč": [t: "⠫⠉⠞⠫⠫⠏⠻"] # 0x29b9 + - "⊿": [t: "⠫⠉⠞⠫⠔⠔⠻"] # 0x29bf + - "⧀": [t: "⠫⠉⠞⠫⠐⠅⠻"] # 0x29c0 + - "⧁": [t: "⠫⠉⠞⠫⠚⠂⠻"] # 0x29c1 + - "⹀": [t: "⠫⠉⠞⠫⠥⠻"] # 0x2a00 + - "⚁": [t: "⠫⠉⠞⠫⠏⠻"] # 0x2a01 + - "⹂": [t: "â «â ‰â žâ «â ˆâ Ąâ »"] # 0x2a02 + - "âȘŻ": [t: "⠚⠐⠅⠱"] # 0x2aaf + - "âȘ°": [t: "â šâ šâ ‚â ±"] # 0x2ab0 + - "âȘ±": [t: "⠚⠐⠅⠌⠱"] # 0x2ab1 + - "âȘČ": [t: "⠚⠚⠂⠌⠱"] # 0x2ab2 + - "âȘł": [t: "⠹⠐⠅⠹⠅"] # 0x2ab3 + - "âȘŽ": [t: "⠹⠹⠂⠹⠅"] # 0x2ab4 + - "âȘ”": [t: "⠹⠐⠅⠌⠹⠅"] # 0x2ab5 + - "âȘ¶": [t: "⠹⠹⠂⠌⠹⠅"] # 0x2ab6 + - "âȘ·": [t: "⠚⠐⠅⠈⠱⠈⠱"] # 0x2ab7 + - "âȘž": [t: "⠚⠚⠂⠈⠱⠈⠱"] # 0x2ab8 + - "âȘč": [t: "⠚⠐⠅⠌⠈⠱⠈⠱"] # 0x2ab9 + - "âȘș": [t: "⠚⠚⠂⠌⠈⠱⠈⠱"] # 0x2aba + - "âȘ»": [t: "⠚⠐⠅⠈⠚⠐⠅⠻"] # 0x2abb + - "âȘŒ": [t: "⠚⠚⠂⠈⠚⠚⠂⠻"] # 0x2abc + - "ïč©": [t: "⠈⠎"] # 0xfe69 + - "": [t: "⠈⠎"] # 0xff04 + - "ïŒż": [t: "â ±"] # 0xff3f + - "": [t: "⠈⠱"] # 0xff5e + - "ïż ": [t: "⠈⠉"] # 0xffe0 + - "ïżĄ": [t: "⠈⠇"] # 0xffe1 + - "ïżŁ": [t: "â ±"] # 0xffe3 + - "ïż„": [t: "⠈⠜"] # 0xffe5 + + # --- Nemeth Default Characters rest chars. --- + + - "â„”": [t: "⠠⠠⠁"] # 0x2135 + - "ℶ": [t: "⠠⠠⠃"] # 0x2136 + - "ℷ": [t: "⠠⠠⠉"] # 0x2137 + - "ℾ": [t: "⠠⠠⠙"] # 0x2138 + - "Ă ": [t: "⠈⠁"] # 0xe0 + - "ĂĄ": [t: "⠈⠁"] # 0xe1 + - "Ăą": [t: "⠈⠁"] # 0xe2 + - "ĂŁ": [t: "⠈⠁"] # 0xe3 + - "Ă€": [t: "⠈⠁"] # 0xe4 + - "Ă„": [t: "⠈⠁"] # 0xe5 + - "ç": [t: "⠈⠉"] # 0xe7 + - "Ăš": [t: "⠈⠑"] # 0xe8 + - "Ă©": [t: "⠈⠑"] # 0xe9 + - "ĂȘ": [t: "⠈⠑"] # 0xea + - "Ă«": [t: "⠈⠑"] # 0xeb + - "ĂŹ": [t: "⠈⠊"] # 0xec + - "Ă­": [t: "⠈⠊"] # 0xed + - "Ăź": [t: "⠈⠊"] # 0xee + - "ĂŻ": [t: "⠈⠊"] # 0xef + - "ñ": [t: "⠈⠝"] # 0xf1 + - "ĂČ": [t: "⠈⠕"] # 0xf2 + - "Ăł": [t: "⠈⠕"] # 0xf3 + - "ĂŽ": [t: "⠈⠕"] # 0xf4 + - "Ă”": [t: "⠈⠕"] # 0xf5 + - "ö": [t: "⠈⠕"] # 0xf6 + - "Ăč": [t: "⠈⠄"] # 0xf9 + - "Ăș": [t: "⠈⠄"] # 0xfa + - "Ă»": [t: "⠈⠄"] # 0xfb + - "ĂŒ": [t: "⠈⠄"] # 0xfc + - "Ăœ": [t: "⠈⠜"] # 0xfd + - "Ăż": [t: "⠈⠜"] # 0xff + + - "À": [t: "⠠⠈⠁"] # 0xc0 + - "Á": [t: "⠠⠈⠁"] # 0xc1 + - "Â": [t: "⠠⠈⠁"] # 0xc2 + - "Ã": [t: "⠠⠈⠁"] # 0xc3 + - "Ä": [t: "⠠⠈⠁"] # 0xc4 + - "Å": [t: "⠠⠈⠁"] # 0xc5 + - "Ç": [t: "⠠⠈⠉"] # 0xc7 + - "È": [t: "⠠⠈⠑"] # 0xc8 + - "É": [t: "⠠⠈⠑"] # 0xc9 + - "Ê": [t: "⠠⠈⠑"] # 0xca + - "Ë": [t: "⠠⠈⠑"] # 0xcb + - "Ì": [t: "⠠⠈⠊"] # 0xcc + - "Í": [t: "⠠⠈⠊"] # 0xcd + - "Î": [t: "⠠⠈⠊"] # 0xce + - "Ï": [t: "⠠⠈⠊"] # 0xcf + - "Ñ": [t: "⠠⠈⠝"] # 0xd1 + - "Ò": [t: "⠠⠈⠕"] # 0xd2 + - "Ó": [t: "⠠⠈⠕"] # 0xd3 + - "Ô": [t: "⠠⠈⠕"] # 0xd4 + - "Ö": [t: "⠠⠈⠕"] # 0xd6 + - "Ù": [t: "⠠⠈⠄"] # 0xd9 + - "Ú": [t: "⠠⠈⠄"] # 0xda + - "Û": [t: "⠠⠈⠄"] # 0xdb + - "Ü": [t: "⠠⠈⠄"] # 0xdc + - "Ý": [t: "⠠⠈⠜"] # 0xdd + - "←": [t: "â «â Ș⠒⠒"] # 0x2190 + + - "↑": # 0x2191 + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "â «â Ł"] + else: [t: "â «â Łâ ’â ’â •"] + + - "↓": # 0x2193 + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "â «â ©"] + else: [t: "⠫⠩⠒⠒⠕"] + + - "↔": [t: "â «â Ș⠒⠒⠕"] # 0x2194 + - "↕": [t: "â «â Łâ ©â Ș⠒⠒⠕"] # 0x2195 + - "↖": [t: "⠫⠘â Ș⠒⠒"] # 0x2196 + - "↗": [t: "⠫⠘⠒⠒⠕"] # 0x2197 + - "↘": [t: "⠫⠰⠒⠒⠕"] # 0x2198 + - "↙": [t: "â «â °â Ș⠒⠒"] # 0x2199 + - "↚": [t: "⠳⠈⠫â Ș⠒⠒⠻"] # 0x219a + - "↛": [t: "â łâ ˆâ «â ’â ’â •â »"] # 0x219b + - "↜": [t: "â «â Ș⠔⠒⠱"] # 0x219c + - "↝": [t: "⠫⠔⠒⠹⠕"] # 0x219d + - "↞": [t: "â «â Șâ Ș⠒⠒"] # 0x219e + - "↟": [t: "â «â Łâ ’â ’â •â •"] # 0x219f + - "↠": [t: "⠫⠒⠒⠕⠕"] # 0x21a0 + - "↡": [t: "⠫⠩⠒⠒⠕⠕"] # 0x21a1 + - "↱": [t: "â «â Șâ ’â ’â  â œ"] # 0x21a2 + - "↣": [t: "â «â  â Żâ ’â ’â •"] # 0x21a3 + - "ↀ": [t: "â «â Ș⠒⠒⠳"] # 0x21a4 + - "ↄ": [t: "â «â Łâ łâ ’â ’â •"] # 0x21a5 + - "↩": [t: "â «â łâ ’â ’â •"] # 0x21a6 + - "↧": [t: "â «â ©â łâ ’â ’â •"] # 0x21a7 + - "↹": [t: "â «â Ș⠒⠳⠒⠕"] # 0x21a8 + - "↩": [t: "â «â Ș⠒⠒⠠⠕"] # 0x21a9 + - "â†Ș": [t: "â «â  â Ș⠒⠒⠕"] # 0x21aa + - "↫": [t: "â «â Ș⠒⠒⠹⠡"] # 0x21ab + - "↬": [t: "â «â šâ Ąâ ’â ’â •"] # 0x21ac + - "↭": [t: "â «â Ș⠔⠒⠱⠕"] # 0x21ad + - "↼": [t: "⠳⠈⠫â Ș⠒⠒⠕"] # 0x21ae + - "↯": [t: "⠫⠩⠔⠹⠔"] # 0x21af + - "↮": [t: "â «â  â łâ ’â ’â •"] # 0x21b4 + - "↔": [t: "â «â ©â  â łâ ’â ’â •"] # 0x21b5 + - "↶": [t: "⠫⠹⠔⠕"] # 0x21b6 + - "↷": [t: "â «â Ș⠱⠔"] # 0x21b7 + - "â†ș": [t: "⠫⠹⠔⠕"] # 0x21ba + - "↻": [t: "â «â Ș⠱⠔"] # 0x21bb + - "⇄": [t: "⠫⠒⠒⠕⠫â Ș⠒⠒"] # 0x21c4 + - "⇅": [t: "⠫⠣⠒⠒⠕⠐⠫⠩⠒⠒⠕"] # 0x21c5 + - "⇆": [t: "â «â Ș⠒⠒⠫⠒⠒⠕"] # 0x21c6 + - "⇇": [t: "⠫⠚⠒⠒⠫⠚⠒⠒"] # 0x21c7 + - "⇈": [t: "⠫⠣⠒⠒⠕⠐⠫⠣⠒⠒⠕"] # 0x21c8 + - "⇉": [t: "⠫⠒⠒⠕⠫⠒⠒⠕"] # 0x21c9 + - "⇊": [t: "⠫⠩⠒⠒⠕⠐⠫⠩⠒⠒⠕"] # 0x21ca + - "⇍": [t: "⠳⠈⠫â Șâ Ș⠒⠒"] # 0x21cd + - "⇎": [t: "⠳⠈⠫â Șâ Ș⠒⠒⠕⠕"] # 0x21ce + - "⇏": [t: "â łâ ˆâ «â ’â ’â •â •"] # 0x21cf + - "⇐": [t: "â «â Șâ ¶â ¶"] # 0x21d0 + - "⇑": [t: "â «â Łâ ¶â ¶â •"] # 0x21d1 + - "⇒": [t: "⠫⠶⠶⠕"] # 0x21d2 + - "⇓": [t: "â «â Łâ ¶â ¶â •"] # 0x21d3 + - "⇔": [t: "â «â Ș⠶⠶⠕"] # 0x21d4 + - "⇕": [t: "â «â Łâ Ș⠶⠶⠕"] # 0x21d5 + - "⇖": [t: "⠫⠘â Șâ ¶â ¶"] # 0x21d6 + - "⇗": [t: "⠫⠘⠶⠶⠕"] # 0x21d7 + - "⇘": [t: "⠫⠰⠶⠶⠕"] # 0x21d8 + - "⇙": [t: "â «â °â Șâ Ș⠒⠒"] # 0x21d9 + - "⇚": [t: "â «â Șâ Șâ ¶â ¶"] # 0x21da FIX: how to represent triple shafts? + - "⇛": [t: "⠫⠶⠶⠕⠕"] # 0x21db FIX: how to represent triple shafts? + - "⇜": [t: "â «â Ș⠹⠀⠔⠒⠹"] # 0x21dc + - "⇝": [t: "⠫⠹⠀⠔⠒⠹⠕"] # 0x21dd + - "⇞": [t: "â łâ łâ ˆâ «â Łâ ’â ’â •â »"] # 0x21de + - "⇟": [t: "â łâ łâ ˆâ «â ©â ’â ’â •â »"] # 0x21df + - "⇠": [t: "â «â Ș⠒⠒"] # 0x21e0 + - "⇡": [t: "â «â Łâ ’â ’â •"] # 0x21e1 + - "⇱": [t: "⠫⠒⠒⠕"] # 0x21e2 + - "⇣": [t: "⠫⠩⠒⠒⠕"] # 0x21e3 + - "⇀": [t: "â «â łâ Ș⠒⠒"] # 0x21e4 + - "⇄": [t: "â «â ’â ’â •â ł"] # 0x21e5 + - "⇩": [t: "â «â žâ Ș⠒⠒"] # 0x21e6 + - "⇧": [t: "â «â Łâ žâ ’â ’â •"] # 0x21e7 + - "⇹": [t: "â «â žâ ’â ’â •"] # 0x21e8 + - "⇩": [t: "â «â ©â žâ ’â ’â •"] # 0x21e9 + - "⇳": [t: "â «â Łâ žâ Ș⠒⠒⠕"] # 0x21f3 + - "⇮": [t: "â «â ’â ’â •â šâ Ą"] # 0x21f4 + - "⇔": [t: "⠫⠩⠒⠒⠕⠐⠫⠣⠒⠒⠕"] # 0x21f5 + - "⇶": [t: "⠫⠒⠒⠕⠫⠒⠒⠕⠫⠒⠒⠕"] # 0x21f6 + - "⇷": [t: "⠳⠈⠫â Ș⠒⠒⠻"] # 0x21f7 + - "⇾": [t: "â łâ ˆâ «â ’â ’â •â »"] # 0x21f8 + - "â‡č": [t: "⠳⠈⠫â Ș⠒⠒⠕"] # 0x21f9 + - "â‡ș": [t: "⠳⠳⠈⠫â Ș⠒⠒⠻"] # 0x21fa + - "⇻": [t: "â łâ łâ ˆâ «â ’â ’â •â »"] # 0x21fb + - "⇌": [t: "⠳⠳⠈⠫â Ș⠒⠒⠕"] # 0x21fc + - "⇜": [t: "â «â łâ ’â ’"] # 0x21fd + - "⇟": [t: "â «â ’â ’â ł"] # 0x21fe + - "⇿": [t: "â «â łâ ’â ’â ł"] # 0x21ff + + - "ⅆ": [t: "⠙"] # 0x2146 + - "ⅇ": [t: "⠑"] # 0x2147 + - "ⅈ": [t: "⠊"] # 0x2148 + - "⌜": [t: "⠈⠘⠷"] # 0x231c + - "⌝": [t: "⠈⠘⠟"] # 0x231d + - "⌞": [t: "⠈⠰⠷"] # 0x231e + - "⌟": [t: "⠈⠰⠟"] # 0x231f + - "〈": [t: "â šâ šâ ·"] # 0x2329 + - "âŒȘ": [t: "â šâ šâ Ÿ"] # 0x232a + - "⏞": [t: "â šâ ·"] # 0x23de + - "⏟": [t: "â šâ Ÿ"] # 0x23df + - "⎮": [t: "⠈⠷"] # 0x23b4 + - "⎔": [t: "⠈⠟"] # 0x23b5 + - "âŸȘ": [t: "â šâ šâ šâ ·"] # 0x27ea + - "⟫": [t: "â šâ šâ šâ Ÿ"] # 0x27eb + - "〈": [t: "â šâ šâ ·"] # 0x3008 + - "〉": [t: "â šâ šâ Ÿ"] # 0x3009 + - "《": [t: "â šâ šâ šâ ·"] # 0x300a + - "》": [t: "â šâ šâ šâ Ÿ"] # 0x300b + - "「": [t: "⠈⠘⠷"] # 0x300c + - "」": [t: "⠈⠘⠟"] # 0x300d + - "↌": [t: "⠫⠈â Ș⠒⠒"] # 0x21bc + - "↜": [t: "â «â  â Ș⠒⠒"] # 0x21bd + - "↟": [t: "â «â Łâ ’â ’â  â •"] # 0x21be + - "↿": [t: "â «â Łâ ’â ’â ˆâ •"] # 0x21bf + - "⇀": [t: "⠫⠒⠒⠈⠕"] # 0x21c0 + - "⇁": [t: "⠫⠒⠒⠠⠕"] # 0x21c1 + - "⇂": [t: "â «â Ș⠒⠒⠈⠕"] # 0x21c2 + - "⇃": [t: "⠫⠩⠒⠒⠠⠕"] # 0x21c3 + - "⇋": # 0x21cb + + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "â «â Ș⠒⠫⠒⠕"] + else: [t: "⠫⠈â Ș⠒⠒⠫⠒⠒⠈⠕"] + - "⇌": # 0x21cc + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "⠫⠒⠕⠫â Ș⠒"] + else: [t: "⠫⠒⠒⠈⠕⠫⠈â Ș⠒⠒"] + + - "℔": [t: "â ł"] # 0x2114 + - "ℱ": [t: "⠘⠞"] # 0x2122 + - "Å": [t: "⠈⠠⠁"] # 0x212b + - "­": [t: "â €"] # 0xad + - " -​": [t: "W"] # 0x2000 - 0x200b (various spaces / ZWSP) + - "‹": [t: "W"] # 0x2028 + - "
": [t: "W"] # 0x2029 + - " ": [t: "W"] # 0x202f + - " ": [t: "W"] # 0x205f + - "₣": [t: "⠈⠋"] # 0x20A3 (French franc sign + - "₩": [t: "⠈⠝"] # 0x2046 (Naira sign) + - "₩": [t: "⠈â ș"] # 0x20A9 (Won sign) + - "€": [t: "⠈⠑"] # 0x20AC (Euro sign) + - "ï»ż": [t: "W"] # 0xfeff + - "☆": [t: "⠫⠎"] # 0x2606 + - "✕": [t: "⠈⠥"] # 0x2715 + - "ÂŒ": [t: "â č⠂⠌â Čâ Œ"] # 0xbc + - "œ": [t: "â č⠂⠌⠆⠌"] # 0xbd + - "Ÿ": [t: "â č⠒⠌â Čâ Œ"] # 0xbe + - "⅐": [t: "â č⠂⠌⠶⠌"] # 0x2150 + - "⅑": [t: "â č⠂⠌⠔⠌"] # 0x2151 + - "⅒": [t: "â č⠂⠌⠂⠎⠌"] # 0x2152 + - "⅓": [t: "â č⠂⠌⠒⠌"] # 0x2153 + - "⅔": [t: "â č⠆⠌⠒⠌"] # 0x2154 + - "⅕": [t: "â čâ ‚â Œâ ąâ Œ"] # 0x2155 + - "⅖": [t: "â čâ †â Œâ ąâ Œ"] # 0x2156 + - "⅗": [t: "â čâ ’â Œâ ąâ Œ"] # 0x2157 + - "⅘": [t: "â čâ Čâ Œâ ąâ Œ"] # 0x2158 + - "⅙": [t: "â č⠂⠌⠖⠌"] # 0x2159 + - "⅚": [t: "â čâ ąâ Œâ –â Œ"] # 0x215a + - "⅛": [t: "â č⠂⠌⠊⠌"] # 0x215b + - "⅜": [t: "â č⠒⠌⠊⠌"] # 0x215c + - "⅝": [t: "â čâ ąâ Œâ Šâ Œ"] # 0x215d + - "⅞": [t: "â č⠶⠌⠊⠌"] # 0x215e + - "⅟": [t: "â č⠂⠌⠌"] # 0x215f + - "↉": [t: "â č⠎⠌⠒⠌"] # 0x2189 + - "㉈": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠂⠎⠻⠻"] # 0x3248 + - "㉉": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠆⠎⠻⠻"] # 0x3249 + - "㉊": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠒⠎⠻⠻"] # 0x324a + - "㉋": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌â Č⠎⠻⠻"] # 0x324b + - "㉌": [t: "â «â žâ Čâ žâ «â «â ‰â žâ «â Œâ ąâ Žâ »â »"] # 0x324c + - "㉍": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠖⠎⠻⠻"] # 0x324d + - "㉎": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠶⠎⠻⠻"] # 0x324e + - "㉏": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠊⠎⠻⠻"] # 0x324f + + + - "‘": [t: "Pâ  â Š"] # 0x2018 (Left single quotation mark) + - "’": [t: "Pâ  â Ž"] # 0x2019 (Right single quotation mark) + - "“": [t: "Pâ Š"] # 0x201C (Left double quotation mark) + - "”": [t: "Pâ Ž"] # 0x201D (Right double quotation mark) + - "‰": [t: "`00"] + - "ℏ": [t: "⠈⠓"] # 0x210F (Planck constant over two pi) + - "ℓ": [t: "TE⠇"] # 0x2113 (Script small l (differs from 1d4c1: 4-56-123)) + - "℘": [tc: "TCL⠏"] # 0x2118 (Script Capital P) +# - "ℝ": [t: ""] # 0x211D (Double-struck capital R (no nemeth double struck)) +# - "ⅆ": [t: ""] # 0x2146 (Double-struck italic small d) +# - "ⅇ": [t: ""] # 0x2147 (Double-struck italic small e) +# - "⇚": [t: "⠀⠫â Ș⠾⠾⠀"] # 0x21DA (Leftwards triple arrow) +# - "⇛": [t: "⠀⠫⠞⠞⠕⠀"] # 0x21DB (Rightwards triple arrow) + - "∔": [t: "⠐⠏⠣⠥⠻"] # 0x2214 (Dot plus) + - "√": [t: "⠜"] # 0x221A (Square root) + - "∛": [t: "⠣⠒⠜"] # 0x221B (Cube root) + - "∜": [t: "â Łâ Č⠜"] # 0x221C (Fourth root) + - "∥": [t: "â «â Ș⠞⠫⠫⠁⠻"] # 0x2221 (Measured angle) + - "âˆč": [t: "⠀⠐⠂"] # 0x2239 (Excess) + - "âˆș": [t: "⠐⠀⠩⠥⠥⠣⠥⠥⠻"] # 0x223A (Geometric proportion) + - "∻": [t: "⠐⠈⠱⠩⠥⠣⠥⠻"] # 0x223B (Homothetic) + - "∜": [t: "â  â ±"] # 0x223D (Reversed tilde) + - "≋": [t: "⠈⠱⠈⠱⠈⠱"] # 0x224B (Triple tilde) + - "≌": [t: "⠠⠱⠚⠅"] # 0x224C (All equal to) + - "≏": [t: "⠈⠣⠱"] # 0x224F (Difference between) + - "≔": [t: "⠐⠂⠹⠅"] # 0x2254 (Colon equals) + - "≕": [t: "⠹⠅⠐⠂"] # 0x2255 (Equals colon) + - "≖": [t: "â €â šâ Ąâ ˆâ šâ …â »â €"] # 0x2256 (Ring in equal to) + - "⊌": [t: "⠚⠏⠈⠫â Ș⠒⠻"] # 0x228C (Multiset) + - "⊍": [t: "⠥⠈⠚⠏⠻"] # 0x228D (Multiset multiplication) + - "⊎": [t: "⠏⠈⠚⠏⠻"] # 0x228E (Multiset union) + - "⊕": [t: "⠫⠉⠞⠫⠏⠻"] # 0x2295 (Circled plus) + - "⊖": [t: "⠫⠉⠞⠫⠀⠻"] # 0x2296 (Circled minus) + - "⊗": [t: "â «â ‰â žâ «â ˆâ Ąâ »"] # 0x2297 (Circled times) + - "⊘": [t: "⠫⠉⠞⠫⠞⠌⠻"] # 0x2298 (Circled division slash) + - "⊙": [t: "⠫⠉⠞⠫⠥⠻"] # 0x2299 (Circled dot operator) + - "⊚": [t: "â «â ‰â žâ «â ˜â šâ Ąâ »"] # 0x229a (Circled ring operator) + - "⊛": [t: "⠫⠉⠞⠫⠈⠌⠻"] # 0x229B (Circled asterisk operator) + - "⊜": [t: "⠫⠉⠞⠫⠚⠅⠻"] # 0x229C (Circled equals) + - "⊝": [t: "⠫⠉⠞⠫⠀⠀⠻"] # 0x229D (Circled dash) + - "⊞": [t: "â «â Čâ žâ «â Źâ »"] # 0x229E (Squared plus) + - "⊟": [t: "â «â Č⠞⠫⠀⠻"] # 0x229F (Squared minus) + - "⊠": [t: "â «â Č⠞⠫⠈⠥⠻"] # 0x22A0 (Squared times) + - "⊡": [t: "â «â Čâ žâ «â Ąâ »"] # 0x22A1 (Squared dot operator) + - "⊱": [t: "â «â łâ ’"] # 0x22A2 (Right tack) + - "⊣": [t: "â «â ’â ł"] # 0x22A3 (Left tack) + - "⊀": [t: "â «â ©â łâ ’"] # 0x22A4 (Down tack) +# - "⊄": [t: "⠀⠫⠏⠀ or ⠀⠫⠣⠳⠒⠀"] # 0x22A5 (Up tack (See also 27C2)) +# - "⊩": [t: ""] # 0x22A6 (Assertion) +# - "⊹": [t: ""] # 0x22A8 (TRUE) +# - "âŠČ": [t: ""] # 0x22B2 (Normal subgroup of) +# - "⊳": [t: ""] # 0x22B3 (Contains as normal subgroup) +# - "⊮": [t: ""] # 0x22B4 (Normal subgroup of or equal to) +# - "⊔": [t: ""] # 0x22B5 (Contains as normal subgroup or equal to) + - "⊶": [t: "â «â šâ Ąâ ’â Ą"] # 0x22B6 (Original of) + - "⊷": [t: "â «â Ąâ ’â šâ Ą"] # 0x22B7 (Image of) + - "⊾": [t: "â «â ’â šâ Ą"] # 0x22B8 (Multimap) +# - "⊟": [t: ""] # 0x22BE (Right angle w arc) + - "⊿": [t: "â «â žâ šâ —â »"] # 0x22BF (Right triangle) + - "⋅": [t: "â Ą"] # 0x22C5 (Dot operator) + - "∙": [t: "â Ą"] # 0x2219 -- similar looking to 0x22c5, so using the same braille + - "⋆": [t: "⠫⠎"] # 0x22C6 (Star operator) + - "⋍": [t: "⠠⠱⠱"] # 0x22CD (Reversed tilde equals) + - "⋖": [t: "â Ąâ ˆâ â …â »"] # 0x22D6 (Less-than w dot) + - "⋗": [t: "â Ąâ ˆâ šâ ‚â »"] # 0x22D7 (Greater-than w dot) + - "⋘": [t: "⠐⠅⠈⠐⠅⠈⠐⠅⠻"] # 0x22D8 (Much less-than) + - "⋙": [t: "⠚⠂⠈⠚⠂⠈⠚⠂⠻"] # 0x22D9 (Much greater-than) + - "â‹Č": [t: "⠱⠈⠈⠑⠻"] # 0x22F2 (Element of w long horizontal stroke) + - "â‹”": [t: "â â ˆâ ‘â Łâ Ąâ »"] # 0x22F5 (Element of w dot above) + - "⋶": [t: "⠱⠈⠑"] # 0x22F6 (Element of w overbar) + - "â‹ș": [t: "⠱⠈⠈⠹⠻"] # 0x22FA (Contains w long horizontal stroke) + - "⋜": [t: "⠱⠈⠹"] # 0x22FD (Contains w overbar) + - "⌈": [t: "⠈⠘⠷"] # 0x2308 (Left ceiling) + - "⌉": [t: "⠈⠘⠟"] # 0x2309 (Right ceiling) + - "⌊": [t: "⠈⠰⠷"] # 0x230A (Left floor) + - "⌋": [t: "⠈⠰⠟"] # 0x230B (Right floor) + - "⌱": [t: "⠫⠁"] # 0x2322 (Frown) + - "⌣": [t: "⠫⠄"] # 0x2323 (Smile) + - "■": [t: "â «â žâ Č"] # 0x25A0 (Filled square) + - "▫": [t: "â «â Č"] # 0x25AB (Small white Square) + - "□": [t: "â «â Č"] # 0x25A1 (Square) + - "◻": [t: "â «â Č"] # 0x25FB (Square) + - "▬": [t: "â «â žâ —"] # 0x25AC (Filled rectangle) + - "▭": [t: "⠫⠗"] # 0x25AD (Rectangle) + - "â–Č": [t: "â «â žâ ž"] # 0x25B2 (Black up-pointing triangle) + - "△": [t: "⠫⠞"] # 0x25B3 (White up-pointing triangle) + - "â–Œ": [t: "â žâ šâ «"] # 0x25BC (Black down-pointing triangle) + - "○": [t: "⠫⠉"] # 0x25CB (White circle) + - "●": [t: "â «â žâ ‰"] # 0x25CF (Black circle) + - "◫": [t: "â «â Čâ žâ «â łâ »"] # 0x25EB (White square w vertical bisecting line) +# - "⊄": [t: "⠫⠏"] # 0x27C2 (Perpendicular) + - "⟃": [t: "â šâ Ąâ ˆâ žâ â …â »"] # 0x27C3 (Open subset) + - "⟄": [t: "â šâ Ąâ ˆâ žâ šâ ‚â »"] # 0x27C4 (Open superset) + - "⟜": [t: "â «â šâ Ąâ ’â ’"] # 0x27DC (Left multimap) + - "⟝": [t: "â «â łâ ’â ’"] # 0x27DD (Long right tack) + - "⟞": [t: "â «â ’â ’â ł"] # 0x27DE (Long left tack) + - "⟟": [t: "â «â Łâ łâ ’â ’â šâ Ą"] # 0x27DF (Up tack w circle above) + - "⟩": [t: "⠈⠞⠷"] # 0x27E6 (Mathematical left white square bracket) + - "⟧": [t: "⠈⠞⠟"] # 0x27E7 (Mathematical right white square bracket) + - "⟹": [t: "â šâ šâ ·"] # 0x27E8 (Mathematical left angle bracket) + - "⟩": [t: "â šâ šâ Ÿ"] # 0x27E9 (Mathematical right angle bracket) + - "⟔": [t: "⠀⠫â Ș⠒⠒⠒⠀"] # 0x27F5 (Long leftwards arrow ) + - "⟶": [t: "⠀⠫⠒⠒⠒⠕⠀"] # 0x27F6 (Long rightwards arrow) + - "⟷": [t: "⠀⠫â Ș⠒⠒⠒⠕⠀"] # 0x27F7 (Long left right arrow) + - "⟾": [t: "⠀⠫â Ș⠶⠶⠶⠀"] # 0x27F8 (Long leftwards arrow ) + - "âŸč": [t: "⠀⠫⠶⠶⠶⠕⠀"] # 0x27F9 (Long rightwards arrow) + - "âŸș": [t: "⠀⠫â Ș⠶⠶⠶⠕⠀"] # 0x27FA (Long left right arrow) + - "⟻": [t: "⠀⠫â Ș⠒⠒⠒⠳⠀"] # 0x27FB (Long leftwards arrow from bar) + - "⟌": [t: "⠀⠫⠳⠒⠒⠒⠕⠀"] # 0x27FC (Long rightwards arrow from bar) + - "⟜": [t: "⠀⠫â Șâ ¶â ¶â ¶â łâ €"] # 0x27FD (Long leftwards double arrow from bar) + - "⟟": [t: "⠀⠫⠳⠶⠶⠶⠕⠀"] # 0x27FE (Long rightwards double arrow from bar) + - "⟿": [t: "⠀⠫⠹⠀⠔⠒⠹⠀⠔⠒⠹⠕⠀"] # 0x27FF (Long rightwards squiggle arrow) + - "‥": [t: "⠀⠫⠘â Ș⠒⠒⠕⠀"] # 0x2921 (North west and south east arrow) + - "‹": [t: "⠀⠫⠰â Ș⠒⠒⠕⠀"] # 0x2922 (North east and south west arrow) + - "🣐": # 0x1f8d0 (Long rightwards arrow over leftwards arrow (equilibrium)) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "⠫⠒⠕⠫â Ș⠒"] + else: [t: "⠫⠒⠒⠈⠕⠫⠠â Ș⠒⠒"] + - "🣑": # 0x1f8d1 (Long rightwards harpoon over leftwards harpoon (equilibrium)) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "⠫⠒⠕⠫â Ș⠒"] + else: [t: "⠫⠒⠒⠈⠕⠫⠠â Ș⠒⠒"] + - "🣒": # 0x1f8d2 (Long rightwards harpoon over short leftwards harpoon (equilibrium)) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "⠫⠒⠒⠕⠫â Ș⠒"] + else: [t: "⠫⠒⠒⠈⠕⠫⠈â Ș⠒⠒"] + - "🣓": # 0x1f8d3 (Short rightwards harpoon over long leftwards harpoon (equilibrium, trend to the right)) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "⠫⠒⠕⠫â Ș⠒⠒"] + else: [t: "⠫⠒⠈⠕⠫⠠â Ș⠒⠒"] + - "🣔": # 0x1f8d4 (Long leftwards harpoon over short rightwards harpoon (equilibrium, trend to the left)) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "â «â Ș⠒⠒⠫⠒⠕"] + else: [t: "⠫⠈â Ș⠒⠒⠫⠒⠠⠕"] + - "🣕": # 0x1f8d5 (Short leftwards harpoon over long rightwards harpoon (equilibrium, trend to the left)) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "â «â Ș⠒⠫⠒⠒⠕"] + else: [t: "⠫⠈â Ș⠒⠫⠒⠒⠠⠕"] + - "â„‚": # 0x2942 (Long rightwards harpoon over short leftwards harpoon (equilibrium)) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "⠫⠒⠒⠕⠫â Ș⠒"] + else: [t: "⠫⠒⠒⠈⠕⠫⠈â Ș⠒⠒"] + - "â„„": # 0x2944 (Short rightwards harpoon over long leftwards harpoon (equilibrium, trend to the right)) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "⠫⠒⠕⠫â Ș⠒⠒"] + else: [t: "⠫⠒⠈⠕⠫⠠â Ș⠒⠒"] + - "℃": # 0x2943 (Long leftwards harpoon over short rightwards harpoon (equilibrium, trend to the left)) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "â «â Ș⠒⠒⠫⠒⠕"] + else: [t: "⠫⠈â Ș⠒⠒⠫⠒⠠⠕"] + - "🣖": [t: "⠌⠫⠒⠒⠕"] # 0x1f8d6 (long rightwards arrow with through X) + - "🣗": [t: "⠌⠫⠒⠒⠕"] # 0x1f8d7 (long rightwards arrow with double slash) chem code says it is same as 0x1f8d6 + + + - "⊃": [t: "â šâ žâ ·"] # 0x2983 (Left white curly bracket) + - "⩄": [t: "â šâ žâ Ÿ"] # 0x2984 (Right white curly bracket) + - "⩑": [t: "⠥⠈⠚⠚⠷⠻"] # 0x2991 (Left angle bracket w dot) + - "⩒": [t: "â Ąâ ˆâ šâ šâ Ÿâ »"] # 0x2992 (Right angle bracket w dot) + - "⧄": [t: "â «â Č⠞⠫⠔⠻"] # 0x29C4 (Square rising diagonal slash) + - "⧅": [t: "â «â Čâ žâ «â ąâ »"] # 0x29C5 (Square falling diagonal slash) + - "⧆": [t: "â «â Č⠞⠫⠈⠌⠻"] # 0x29C6 (Squared asterisk) + - "⧊": [t: "⠐⠫⠞⠣⠥⠻"] # 0x29CA (Triangle w dot above) + - "⧋": [t: "⠫⠞⠱"] # 0x29CB (Triangle w underbar) + - "⧌": [t: "⠫⠞⠎"] # 0x29CC (s in triangle §114) + - "â§Š": [t: "â «â łâ ¶â ¶â ł"] # 0x29E6 (Gleich stark) + - "⹌": [t: "â źâ źâ źâ ź"] # 0x2A0C (Quadruple integral operator) + - "⚍": [t: "⠟⠈⠱⠻"] # 0x2A0D (Finite part integral) + - "⚎": [t: "⠟⠈⠱⠱⠻"] # 0x2A0E (Integral w double stroke) + - "⹖": [t: "⠟⠈⠫â Čâ »"] # 0x2A16 (Quaternion integral operator) + - "⚘": [t: "⠟⠈⠈⠥⠻"] # 0x2A18 (Integral w times sign) + - "⹙": [t: "⠟⠈⠚⠩⠻"] # 0x2A19 (Integral w intersection) + - "⹚": [t: "⠟⠈⠚⠏⠻"] # 0x2A1A (Integral w union) + - "⹛": [t: "â Łâ ź"] # 0x2A1B (Integral w overbar (upper)) + - "⹜": [t: "â ©â ź"] # 0x2A1C (Integral w underbar (lower)) + - "âšą": [t: "⠐⠏⠣⠚⠥⠻"] # 0x2A22 (Plus sign w small circle above) + - "⚣": [t: "⠐⠏⠣⠞⠣⠻"] # 0x2A23 (Plus sign w circumflex accent above) + - "⚀": [t: "⠐⠏⠣⠈⠱⠻"] # 0x2A24 (Plus sign w tilde above) + - "âš„": [t: "⠐⠏⠩⠥⠻"] # 0x2A25 (Plus sign w dot below) + - "âšȘ": [t: "⠐⠱⠩⠥⠻"] # 0x2A2A (Minus sign w dot below) + - "âš°": [t: "⠐⠈⠥⠣⠥⠻"] # 0x2A30 (Multiplication sign w dot above) + - "âš±": [t: "⠈⠥⠱"] # 0x2A31 (Multiplication sign w underbar) + - "âšž": [t: "⠫⠉⠞⠫⠚⠌⠻"] # 0x2A38 (Circled division sign) + - "âšč": [t: "â «â žâ žâ «â Źâ »"] # 0x2A39 (Plus sign in triangle) + - "âšș": [t: "⠫⠞⠞⠫⠀⠻"] # 0x2A3A (Minus sign in triangle) + - "âš»": [t: "â «â žâ žâ «â ˆâ Ąâ »"] # 0x2A3B (Multiplication sign in triangle) + - "⩀": [t: "⠥⠈⠚⠩⠻"] # 0x2A40 (Intersection w dot) + - "⩁": [t: "⠀⠈⠚⠏⠻"] # 0x2A41 (Union w minus sign) + - "⩂": [t: "⠱⠚⠏"] # 0x2A42 (Union w overbar) + - "⩃": [t: "⠱⠚⠩"] # 0x2A43 (Intersection w overbar) + - "⩑": [t: "⠐⠈⠩⠣⠥⠻"] # 0x2A51 (Logical AND w dot above) + - "⩒": [t: "⠐⠈⠏⠣⠥⠻"] # 0x2A52 (Logical OR w dot above) + - "⩜": [t: "⠱⠈⠈⠩⠻"] # 0x2A5C (Logical AND with horizontal dash) + - "⩝": [t: "⠱⠈⠈⠏⠻"] # 0x2A5D (Logical OR with horizontal dash) + - "⩞": [t: "⠱⠱⠈⠩"] # 0x2A5E (Logical AND w double overbar) + - "⩟": [t: "⠈⠩⠱"] # 0x2A5F (Logical AND w underbar) + - "â© ": [t: "⠈⠩⠱⠱"] # 0x2A60 (Logical AND w double underbar) + - "⩹": [t: "⠱⠱⠈⠏"] # 0x2A62 (Logical OR w double overbar) + - "⩣": [t: "⠈⠏⠱⠱"] # 0x2A63 (Logical OR w double underbar) + - "⩊": [t: "⠐⠚⠅⠩⠥⠻"] # 0x2A66 (Equals sign w dot below) + - "â©§": [t: "⠐⠞⠇⠣⠥⠻"] # 0x2A67 (Identical w dot above) + - "â©Ș": [t: "⠐⠈⠱⠣⠥⠻"] # 0x2A6A (Tilde operator w dot above) + - "⩏": [t: "⠈⠱⠱⠈⠱"] # 0x2A6C (Similar minus similar) + - "â©­": [t: "â â ˆâ ±â šâ …â Łâ Ąâ »"] # 0x2A6D (Congruent w dot above) + - "⩟": [t: "â â šâ …â Łâ ˆâ Œâ »"] # 0x2A6E (Equals w asterisk) + - "⩯": [t: "⠐⠈⠱⠈⠱⠣⠞⠣⠻"] # 0x2A6F (Almost equal to w circumflex) + - "â©°": [t: "⠈⠱⠈⠱⠚⠅"] # 0x2A70 (Approximately equal or equal to) + - "⩱": [t: "⠹⠅⠬"] # 0x2A71 (Equals sign above plus sign) + - "â©Č": [t: "⠬⠹⠅"] # 0x2A72 (Plus sign above equals sign) + - "⩳": [t: "⠚⠅⠈⠱"] # 0x2A73 (Equals sign above tilde operator) + - "⩎": [t: "⠐⠂⠐⠂⠹⠅"] # 0x2A74 (Double colon equal) + - "â©”": [t: "⠹⠅⠹⠅"] # 0x2A75 (Two consecutive equals signs) + - "â©¶": [t: "⠹⠅⠹⠅⠹⠅"] # 0x2A76 (Three consecutive equals signs) + - "â©·": [t: "⠐⠚⠅⠩⠥⠥⠣⠥⠥⠻"] # 0x2A77 (Equals sign w two dots above and two dots below) + - "⩞": [t: "⠐⠞⠇⠣⠥⠥⠥⠥⠻"] # 0x2A78 (Equivalent w four dots above) + - "â©č": [t: "â â …â ˆâ šâ Ąâ »"] # 0x2A79 (Less than w circle inside) + - "â©ș": [t: "â šâ ‚â ˆâ šâ Ąâ »"] # 0x2A7A (Greater than w circle inside) + - "â©»": [t: "⠐⠐⠅⠣⠞⠊⠻"] # 0x2A7B (Less-than w question mark above) + - "⩌": [t: "⠐⠚⠂⠣⠞⠊⠻"] # 0x2A7C (Greater-than w question mark above) + - "âȘ…": [t: "⠐⠅⠈⠱⠈⠱"] # 0x2A85 (Less-than or approximate) + - "âȘ†": [t: "⠚⠂⠈⠱⠈⠱"] # 0x2A86 (Greater-than or approximate) + - "âȘ‹": [t: "⠐⠅⠹⠅⠹⠂"] # 0x2A8B (Less-than above double-line equal above greater-than) + - "âȘŒ": [t: "⠹⠂⠹⠅⠐⠅"] # 0x2A8C (Greater-than above double-line equal above less-than) + - "âȘ": [t: "⠐⠅⠈⠱⠱"] # 0x2A8D (Less-than above similar or equal to) + - "âȘŽ": [t: "⠚⠂⠈⠱⠱"] # 0x2A8E (Greater-than above similar or equal to) + - "âȘ": [t: "⠐⠅⠈⠱⠚⠂"] # 0x2A8F (Less-than above similar above greater-than) + - "âȘ": [t: "⠚⠂⠈⠱⠐⠅"] # 0x2A90 (Greater-than above similar above less-than) + - "âȘ‘": [t: "⠐⠅⠹⠂⠹⠅"] # 0x2A91 (Less-than above greater-than above double-line equal) + - "âȘ’": [t: "⠹⠂⠐⠅⠹⠅"] # 0x2A92 (Greater-than above less-than above double-line equal) + - "âȘ™": [t: "⠹⠅⠐⠅"] # 0x2A99 (Double-line equal to or less-than) + - "âȘš": [t: "⠹⠅⠹⠂"] # 0x2A9A (Double-line equal to or greater-than) + - "âȘ": [t: "⠈⠱⠐⠅"] # 0x2A9D (Similar or less-than) + - "âȘž": [t: "⠈⠱⠚⠂"] # 0x2A9E (Similar or greater-than) + - "âȘŸ": [t: "⠈⠱⠐⠅⠚⠅"] # 0x2A9F (Similar above less-than above equals sign) + - "âȘ ": [t: "⠈⠱⠚⠂⠚⠅"] # 0x2AA0 (Similar above greater-than above equals sign) + - "âȘź": [t: "⠈⠣⠹⠅"] # 0x2AAE (Equals sign with bumpy above) + - "âȘœ": [t: "â Ąâ ˆâ žâ â …â »"] # 0x2ABD (Subset w dot) + - "âȘŸ": [t: "â Ąâ ˆâ žâ šâ ‚â »"] # 0x2ABE (Superset w dot) + - "âȘż": [t: "⠐⠞⠐⠅⠩⠏⠻"] # 0x2ABF (Subset with plus sign below) + - "⫀": [t: "⠐⠞⠚⠂⠩⠏⠻"] # 0x2AC0 (Superset with plus sign below) + - "⫁": [t: "â â žâ â …â ©â ˆâ Ąâ »"] # 0x2AC1 (Subset with multiplication sign below) + - "⫂": [t: "â â žâ šâ ‚â ©â ˆâ Ąâ »"] # 0x2AC2 (Superset with multiplication sign below) + - "⫅": [t: "⠾⠐⠅⠹⠅"] # 0x2AC5 (Subset of above equals sign) + - "⫆": [t: "⠾⠹⠂⠹⠅"] # 0x2AC6 (Superset of above equals sign) + - "⫇": [t: "⠞⠐⠅⠈⠱"] # 0x2AC7 (Subset of above tilde operator) + - "⫈": [t: "⠞⠚⠂⠈⠱"] # 0x2AC8 (Superset of above tilde operator) + - "⫉": [t: "⠞⠐⠅⠈⠱⠈⠱"] # 0x2AC9 (Subset of above almost equal to) + - "⫊": [t: "⠞⠚⠂⠈⠱⠈⠱"] # 0x2ACA (Superset of above almost equal to) + - "⫋": [t: "⠾⠐⠅⠌⠹⠅"] # 0x2ACB (Subset of above not equals sign) + - "⫌": [t: "⠾⠹⠂⠌⠹⠅"] # 0x2ACC (Superset of above not equals sign) + - "⫓": [t: "⠾⠐⠅⠾⠹⠂"] # 0x2AD3 (Subset above superset) + - "⫔": [t: "⠾⠹⠂⠾⠐⠅"] # 0x2AD4 (Superset above subset) + - "⫕": [t: "⠾⠐⠅⠾⠐⠅"] # 0x2AD5 (Subset above subset) + - "⫖": [t: "⠾⠹⠂⠾⠹⠂"] # 0x2AD6 (Superset above superset) + - "⫗": [t: "⠾⠹⠂⠐⠾⠐⠅"] # 0x2AD7 (Superset beside subset) + - "⫯": [t: "â «â ©â šâ Ąâ ’â ’"] # 0x2AEF (Vertical line w circle above) + - "â«°": [t: "â «â Łâ šâ Ąâ ’â ’"] # 0x2AF0 (Vertical line w circle below) + - "⫱": [t: "â «â Łâ šâ Ąâ ’â ’â ł"] # 0x2AF1 (Down tack w circle below) + - "â«Č": [t: "⠱⠈⠫⠇⠻"] # 0x2AF2 (Parallel w horizontal stroke) + - "⫳": [t: "⠈⠱⠈⠫⠇⠻"] # 0x2AF3 (Parallel w tilde operator) + - "⫎": [t: "â łâ łâ ł"] # 0x2AF4 (Triple vertical bar binary relation) + - "⏏": [t: "â «â žâ ‘"] # 0x2B2C (Black ellipse) + - "⏭": [t: "⠫⠑"] # 0x2B2D (White ellipse) + - "⏰": [t: "⠚⠥⠈⠫â Ș⠒⠒⠻"] # 0x2B30 (Left arrow w small circle) + - "⏱": [t: "â «â Ș⠒⠒⠫â Ș⠒⠒⠫â Ș⠒⠒"] # 0x2B31 (Three leftwards arrows) + - "âŹČ": [t: "â «â Șâ ’â ’â ˆâ «â ‰â žâ «â Źâ »"] # 0x2B32 (Left arrow w circled plus) + - "⼖": [t: "â šâ Ą"] # 0x2B96 (Standard State Symbol) + - "⯃": [t: "â «â žâ Š"] # 0x2BC3 (Horizontal black octagon) + + # SRE lists this as a custom transcription + - "⋊": [t: "⠈⠥⠳"] # 0x22ca (RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT) diff --git a/Rules/Braille/Nemeth/unicode.yaml b/Rules/Braille/Nemeth/unicode.yaml index 83c850fe8..5b9c973f9 100644 --- a/Rules/Braille/Nemeth/unicode.yaml +++ b/Rules/Braille/Nemeth/unicode.yaml @@ -20,32 +20,10 @@ - "7": [t: "Nâ ¶"] # 0x37 - "8": [t: "Nâ Š"] # 0x38 - "9": [t: "N⠔"] # 0x39 - - "A": [t: "CL⠁"] # 0x41 - - "B": [t: "CL⠃"] # 0x42 - - "C": [t: "CL⠉"] # 0x43 - - "D": [t: "CL⠙"] # 0x44 - - "E": [t: "CL⠑"] # 0x45 - - "F": [t: "CL⠋"] # 0x46 - - "G": [t: "CL⠛"] # 0x47 - - "H": [t: "CL⠓"] # 0x48 - - "I": [t: "CL⠊"] # 0x49 - - "J": [t: "CL⠚"] # 0x4a - - "K": [t: "CL⠅"] # 0x4b - - "L": [t: "CL⠇"] # 0x4c - - "M": [t: "CL⠍"] # 0x4d - - "N": [t: "CL⠝"] # 0x4e - - "O": [t: "CL⠕"] # 0x4f - - "P": [t: "CL⠏"] # 0x50 - - "Q": [t: "CL⠟"] # 0x51 - - "R": [t: "CL⠗"] # 0x52 - - "S": [t: "CL⠎"] # 0x53 - - "T": [t: "CL⠞"] # 0x54 - - "U": [t: "CLâ „"] # 0x55 - - "V": [t: "CLâ §"] # 0x56 - - "W": [t: "CLâ ș"] # 0x57 - - "X": [t: "CLâ ­"] # 0x58 - - "Y": [t: "CLâ œ"] # 0x59 - - "Z": [t: "CLâ ”"] # 0x5a + # Latin capitals: C + cells from lowercase a-z via spell/translate. + - "A-Z": # 0x41 - 0x5a + - tc: "C" + - spell: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')" - "a": [t: "L⠁"] # 0x61 - "b": [t: "L⠃"] # 0x62 - "c": [t: "L⠉"] # 0x63 diff --git a/Rules/Braille/Russian/unicode-full.yaml b/Rules/Braille/Russian/unicode-full.yaml index 813669ecc..b562dc302 100644 --- a/Rules/Braille/Russian/unicode-full.yaml +++ b/Rules/Braille/Russian/unicode-full.yaml @@ -57,7 +57,7 @@ - "𝚹-𝛀": # 0x1d6a8 - 0x1d6c0 - - tc: "B" + - tc: "BC" - spell: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙𝛚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" @@ -123,23 +123,23 @@ - spell: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" - "𝐮-𝑍": # 0x1d434 - 0x1d44d - - tc: "IC" + - tc: "C" - spell: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'abcdefghijklmnopqrstuvwxyz')" - "𝑎-𝑧": # 0x1d44e - 0x1d467 - - tc: "I" + - tc: "" - spell: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”đ‘•đ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" - "𝑹-𝒁": # 0x1d468 - 0x1d481 - - tc: "BIC" + - tc: "BC" - spell: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'abcdefghijklmnopqrstuvwxyz')" - "𝒂-𝒛": # 0x1d482 - 0x1d49b - - tc: "BI" + - tc: "B" - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 - - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'abcdefghijklmnopqrstuvwxyz')" - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 - spell: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" @@ -148,7 +148,7 @@ - test: if: "not($IgnoreBold)" then: [tc: "B"] - - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'abcdefghijklmnopqrstuvwxyz')" - "𝗼-𝘇": # 0x1d5ee - 0x1d607 - test: @@ -157,27 +157,27 @@ - spell: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" - "𝘈-𝘡": # 0x1d608 - 0x1d621 - - tc: "IC" - - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - tc: "C" + - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'abcdefghijklmnopqrstuvwxyz')" - "𝘱-đ˜»": # 0x1d622 - 0x1d63b - - tc: "I" + - tc: "" - spell: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 - # - tc: "bold italic" + # - tc: "bold italicC" - test: if: "$IgnoreBold" - then: [tc: I] - else: [tc: "BI"] - - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + then: [tc: "C"] + else: [tc: "B"] + - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'abcdefghijklmnopqrstuvwxyz')" - "𝙖-𝙯": # 0x1d656 - 0x1d66f # - tc: "bold italic" - test: if: "$IgnoreBold" - then: [tc: I] - else: [tc: "BI"] + then: [tc: ""] + else: [tc: "B"] - spell: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" - "𝙰-𝚉": # 0x1d670 - 0x1d689 @@ -194,7 +194,7 @@ - test: if: "not($IgnoreBold)" then: [tc: "B"] - - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "𝛂-𝛚": # 0x1d6c2 - 0x1d6da - test: @@ -215,7 +215,7 @@ - spell: "translate('.', '𝛛𝛜𝛝𝛞𝛟𝛠𝛡', '∂ΔΞÎșφρπ')" - "𝛱-đ›ș": # 0x1d6e2 - 0x1d6fa - - tc: "IC" + - tc: "C" - spell: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›čđ›ș', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "đ›Œ-𝜔": # 0x1d6fc - 0x1d714 @@ -230,20 +230,20 @@ - spell: "translate('.', '𝜕𝜖𝜗𝜘𝜙𝜚𝜛', '∂ΔΞÎșφρπ')" - "𝜜-𝜮": # 0x1d71c - 0x1d734 - # - tc: "bold italic" - - tc: 'BIC⠁' + # - tc: "bold italicC" + - tc: 'BC⠁' - spell: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳𝜮', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "đœ¶-𝝎": # 0x1d736 - 0x1d74e - - tc: "BI" + - tc: "B" - spell: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđđŽ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "𝝏𝝐𝝑𝝒𝝓𝝔𝝕": # 0x1d74f - 0x1d755 - - tc: "BI" + - tc: "B" - spell: "translate('.', '𝝏𝝐𝝑𝝒𝝓𝝔𝝕', '∂ΔÎșΞφρπ')" - "đœ”": # 0x1d735 - - tc: "BI" + - tc: "B" - spell: "translate('.', 'đœ”', '∇')" - "𝝖-𝝼": # 0x1d756 - 0x1d76e @@ -263,19 +263,19 @@ - spell: "translate('.', 'đœ”', '∇')" - "𝞐-𝞹": # 0x1d790 - 0x1d7a8 - # - tc: "bold italic" + # - tc: "bold italicC" - test: if: "$IgnoreBold" - then: [tc: I] - else: [tc: "BI"] - - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + then: [tc: "C"] + else: [tc: "B"] + - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "đžȘ-𝟂": # 0x1d7aa - 0x1d7c2 # - tc: "bold italic" - test: if: "$IgnoreBold" - then: [tc: I] - else: [tc: "BI"] + then: [tc: ""] + else: [tc: "B"] - spell: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸđŸ‚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "𝟃𝟄𝟅𝟆𝟇𝟈𝟉": # 0x1d7c3 - 0x1d7c9 diff --git a/Rules/Braille/Swedish/unicode-full.yaml b/Rules/Braille/Swedish/unicode-full.yaml index 4faab15c3..51400827b 100644 --- a/Rules/Braille/Swedish/unicode-full.yaml +++ b/Rules/Braille/Swedish/unicode-full.yaml @@ -1,50 +1,50 @@ --- - 𝐀-𝐙: # 0x1d400 - 0x1d419 - - tc: B - - spell: translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - tc: BC + - spell: translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'abcdefghijklmnopqrstuvwxyz') - 𝐚-𝐳: # 0x1d41a - 0x1d433 - tc: B - spell: translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz') - 𝐮-𝑍: # 0x1d434 - 0x1d44d - - tc: I - - spell: translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - tc: "C" + - spell: translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'abcdefghijklmnopqrstuvwxyz') - 𝑎-𝑧: # 0x1d44e - 0x1d467 - - tc: I + - tc: "" - spell: translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”đ‘•đ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz') - 𝑹-𝒁: # 0x1d468 - 0x1d481 - - tc: BI - - spell: translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - tc: BC + - spell: translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'abcdefghijklmnopqrstuvwxyz') - 𝒂-𝒛: # 0x1d482 - 0x1d49b - - tc: BI + - tc: B - spell: translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz') - 𝒜-đ’”: # 0x1d49c - 0x1d4b5 - - tc: Ts - - spell: translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - tc: TsC + - spell: translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'abcdefghijklmnopqrstuvwxyz') - đ’¶-𝓏: # 0x1d4b6 - 0x1d4cf - tc: Ts - spell: translate('.', 'đ’¶đ’·đ’žđ’čđ’șđ’»đ’Œđ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“„đ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdefghijklmnopqrstuvwxyz') - 𝓐-đ“©: # 0x1d4d0 - 0x1d4e9 - - tc: BTs - - spell: translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - tc: BTsC + - spell: translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'abcdefghijklmnopqrstuvwxyz') - đ“Ș-𝔃: # 0x1d4ea - 0x1d503 - tc: BTs - spell: translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz') - 𝔄-𝔝: # 0x1d504 - 0x1d51d - tc: DC - - spell: translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜𝔝', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - spell: translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜𝔝', 'abcdefghijklmnopqrstuvwxyz') - 𝔞-đ”·: # 0x1d51e - 0x1d537 - tc: D - spell: translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz') - 𝔾-đ”č: # 0x1d538 - 0x1d539 - - tc: "đ”č" - - spell: translate('.', '𝔾đ”č', 'AB') + - tc: "đ”čC" + - spell: translate('.', '𝔾đ”č', 'ab') - đ”»-đ”Ÿ: # 0x1d53b - 0x1d53e - - tc: "đ”č" - - spell: translate('.', 'đ”»đ”Œđ”œđ”Ÿ', 'DEFG') + - tc: "đ”čC" + - spell: translate('.', 'đ”»đ”Œđ”œđ”Ÿ', 'defg') - 𝕀-𝕄: # 0x1d540 - 0x1d544 - - tc: "đ”č" - - spell: translate('.', '𝕀𝕁𝕂𝕃𝕄', 'IJKLM') + - tc: "đ”čC" + - spell: translate('.', '𝕀𝕁𝕂𝕃𝕄', 'ijklm') - "ℂ": [t: "đ”čCL⠉"] # 0x2102 - "ℍ": [t: "đ”čCL⠓"] # 0x210d @@ -52,77 +52,77 @@ - "𝕆": [t: "đ”čCL⠕"] # 0x1d546 - 𝕊-𝕐: # 0x1d54a - 0x1d550 - - tc: "đ”č" - - spell: translate('.', '𝕊𝕋𝕌𝕍𝕎𝕏𝕐', 'STUVWXY') + - tc: "đ”čC" + - spell: translate('.', '𝕊𝕋𝕌𝕍𝕎𝕏𝕐', 'stuvwxy') - 𝕒-đ•«: # 0x1d552 - 0x1d56b - tc: '' - spell: translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz') - 𝕬-𝖅: # 0x1d56c - 0x1d585 - tc: BDC - - spell: translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - spell: translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'abcdefghijklmnopqrstuvwxyz') - 𝖆-𝖟: # 0x1d586 - 0x1d59f - tc: BD - spell: translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz') - 𝖠-đ–č: # 0x1d5a0 - 0x1d5b9 - tc: SC - - spell: translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - spell: translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'abcdefghijklmnopqrstuvwxyz') - đ–ș-𝗓: # 0x1d5ba - 0x1d5d3 - tc: S - spell: translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz') - 𝗔-𝗭: # 0x1d5d4 - 0x1d5ed - tc: BSC - - spell: translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - spell: translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'abcdefghijklmnopqrstuvwxyz') - 𝗼-𝘇: # 0x1d5ee - 0x1d607 - tc: BS - spell: translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz') - 𝘈-𝘡: # 0x1d608 - 0x1d621 - - tc: ISC - - spell: translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - tc: SC + - spell: translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'abcdefghijklmnopqrstuvwxyz') - 𝘱-đ˜»: # 0x1d622 - 0x1d63b - - tc: IS + - tc: S - spell: translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz') - đ˜Œ-𝙕: # 0x1d63c - 0x1d655 - - tc: BISC - - spell: translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - tc: BSC + - spell: translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'abcdefghijklmnopqrstuvwxyz') - 𝙖-𝙯: # 0x1d656 - 0x1d66f - - tc: BIS + - tc: BS - spell: translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz') - 𝙰-𝚉: # 0x1d670 - 0x1d689 - tc: C - - spell: translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - spell: translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'abcdefghijklmnopqrstuvwxyz') - 𝚊-đš„: # 0x1d68a - 0x1d6a5 - tc: '' - spell: translate('.', 'đšŠđš‹đšŒđšđšŽđšđšđš‘đš’đš“đš”đš•đš–đš—đš˜đš™đššđš›đšœđšđšžđšŸđš đšĄđšąđšŁđš€đš„', 'abcdefghijklmnopqrstuvwxyz') - 𝚹-𝚿: # 0x1d6a8 - 0x1d6bf - tc: BCG - - spell: translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšż', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©') + - spell: translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšż', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - 𝛂-𝛙: # 0x1d6c2 - 0x1d6d9 - tc: BG - spell: translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - 𝛱-đ›č: # 0x1d6e2 - 0x1d6f9 - - tc: ICG - - spell: translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›č', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©') + - tc: CG + - spell: translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›č', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - đ›Œ-𝜓: # 0x1d6fc - 0x1d713 - - tc: IG + - tc: G - spell: translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - 𝜜-𝜳: # 0x1d71c - 0x1d733 - - tc: BICG - - spell: translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©') + - tc: BCG + - spell: translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - đœ¶-𝝍: # 0x1d736 - 0x1d74d - - tc: BIG + - tc: BG - spell: translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - 𝝖-𝝭: # 0x1d756 - 0x1d76d - tc: BSCG - - spell: translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©') + - spell: translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - 𝝰-𝞇: # 0x1d770 - 0x1d787 - tc: BSG - spell: translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€đžđž‚đžƒđž„đž…đž†đž‡', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - 𝞐-𝞧: # 0x1d790 - 0x1d7a7 - - tc: BISCG - - spell: translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©') + - tc: BSCG + - spell: translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - đžȘ-𝟁: # 0x1d7aa - 0x1d7c1 - - tc: BISG + - tc: BSG - spell: translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - 𝟎-𝟗: # 0x1d7ce - 0x1d7d7 - tc: BN diff --git a/Rules/Braille/Swedish/unicode.yaml b/Rules/Braille/Swedish/unicode.yaml index 2e69ae106..6d4e84c4e 100644 --- a/Rules/Braille/Swedish/unicode.yaml +++ b/Rules/Braille/Swedish/unicode.yaml @@ -427,32 +427,10 @@ - "Ở": [t: "CLâ €đ‘Lâ œ"] - "Ỏ": [t: "CL⠠𝑐Lâ œ"] - - "A": [t: "CL⠁"] # 0x41 - - "B": [t: "CL⠃"] # 0x42 - - "C": [t: "CL⠉"] # 0x43 - - "D": [t: "CL⠙"] # 0x44 - - "E": [t: "CL⠑"] # 0x45 - - "F": [t: "CL⠋"] # 0x46 - - "G": [t: "CL⠛"] # 0x47 - - "H": [t: "CL⠓"] # 0x48 - - "I": [t: "CL⠊"] # 0x49 - - "J": [t: "CL⠚"] # 0x4a - - "K": [t: "CL⠅"] # 0x4b - - "L": [t: "CL⠇"] # 0x4c - - "M": [t: "CL⠍"] # 0x4d - - "N": [t: "CL⠝"] # 0x4e - - "O": [t: "CL⠕"] # 0x4f - - "P": [t: "CL⠏"] # 0x50 - - "Q": [t: "CL⠟"] # 0x51 - - "R": [t: "CL⠗"] # 0x52 - - "S": [t: "CL⠎"] # 0x53 - - "T": [t: "CL⠞"] # 0x54 - - "U": [t: "CLâ „"] # 0x55 - - "V": [t: "CLâ §"] # 0x56 - - "W": [t: "CLâ ș"] # 0x57 - - "X": [t: "CLâ ­"] # 0x58 - - "Y": [t: "CLâ œ"] # 0x59 - - "Z": [t: "CLâ ”"] # 0x5a + # Latin capitals: C + cells from lowercase a-z via spell/translate. + - "A-Z": # 0x41 - 0x5a + - tc: "C" + - spell: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')" - "α": [t: "GL⠁"] # 0x3b1 - "ÎČ": [t: "GL⠃"] # 0x3b2 diff --git a/Rules/Braille/UEB/unicode-full.yaml b/Rules/Braille/UEB/unicode-full.yaml index 9114b4de6..b57660aeb 100644 --- a/Rules/Braille/UEB/unicode-full.yaml +++ b/Rules/Braille/UEB/unicode-full.yaml @@ -1,17 +1,6 @@ --- - - " ": [t: "W"] # 0x2000 - - " ": [t: "W"] # 0x2001 - - " ": [t: "W"] # 0x2002 - - " ": [t: "W"] # 0x2003 - - " ": [t: "W"] # 0x2004 - - " ": [t: "W"] # 0x2005 - - " ": [t: "W"] # 0x2006 - - " ": [t: "W"] # 0x2007 - - " ": [t: "W"] # 0x2008 - - " ": [t: "W"] # 0x2009 - - " ": [t: "W"] # 0x200a - - "​": [t: "W"] # 0x200b + - " -​": [t: "W"] # 0x2000 - 0x200b (various spaces / ZWSP) - "‹": [t: "W"] # 0x2028 - "
": [t: "W"] # 0x2029 - " ": [t: "W"] # 0x202f @@ -199,12 +188,12 @@ - "ℰ": [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: "TL⠕"] # 0x2134 (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: "DCL⠉"] # 0x212D (Fraktur Capital C) - "ℂ": [tc: "đ”čCL⠉"] # 0x2102 - "ℍ": [tc: "đ”čCL⠓"] # 0x210d @@ -228,21 +217,21 @@ - spell: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'abcdefghijklmnopqrstuvwxyz')" - "𝖆-𝖟": # 0x1d586 - 0x1d59f - - tc: "D" + - tc: "BD" - 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" + - "𝔾-𝕐": # 0x1D538 - 0x1D551 ('z' version is reserved) + - tc: "đ”čC" - spell: "translate('.', '𝔾đ”čđ”șđ”»đ”Œđ”œđ”Ÿđ”żđ•€đ•đ•‚đ•ƒđ•„đ•…đ•†đ•‡đ•ˆđ•‰đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'abcdefghijklmnopqrstuvwxyz')" - "𝕒-đ•«": # 0x1d552 - 0x1d56b - - tc: "D" + - tc: "đ”č" - spell: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 - - tc: "D" + - tc: "đ”č" - spell: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" # script chars in math alphabetic block and also MathType private use area @@ -256,7 +245,7 @@ # bold script chars in math alphabetic block - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 - - tc: "BTs" + - tc: "BTsC" - spell: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'abcdefghijklmnopqrstuvwxyz')" - "đ“Ș-𝔃": # 0x1d4ea - 0x1d503 @@ -264,7 +253,7 @@ - spell: "translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz')" - "𝐀-𝐙": # 0x1d400 - 0x1d419 - - tc: "B" + - tc: "BC" - spell: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'abcdefghijklmnopqrstuvwxyz')" - "𝐚-𝐳": # 0x1d41a - 0x1d433 @@ -281,14 +270,16 @@ - spell: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”đ‘•đ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" - "𝑹-𝒁": # 0x1d468 - 0x1d481 - - tc: "BIC" + - tc: "BC" - spell: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'abcdefghijklmnopqrstuvwxyz')" - "𝒂-𝒛": # 0x1d482 - 0x1d49b + - tc: "B" - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 - - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - tc: "C" + - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'abcdefghijklmnopqrstuvwxyz')" - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 - spell: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" @@ -296,8 +287,9 @@ - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed - test: if: "not($IgnoreBold)" - then: [tc: "B"] - - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + then: [tc: "BC"] + else: [tc: "C"] + - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'abcdefghijklmnopqrstuvwxyz')" - "𝗼-𝘇": # 0x1d5ee - 0x1d607 - test: @@ -306,27 +298,27 @@ - spell: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" - "𝘈-𝘡": # 0x1d608 - 0x1d621 - # - tc: "italic" - - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + # don't include italics + - tc: "C" + - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'abcdefghijklmnopqrstuvwxyz')" - "𝘱-đ˜»": # 0x1d622 - 0x1d63b - # - tc: "italic" + # don't include italics - spell: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 - # - tc: "bold italic" + # bold italic — UEB: no italic typeform; bold + capital only - test: - if: "$IgnoreBold" - then: [tc: I] - else: [tc: "BI"] - - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + if: "not($IgnoreBold)" + then: [tc: "BC"] + else: [tc: "C"] + - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'abcdefghijklmnopqrstuvwxyz')" - "𝙖-𝙯": # 0x1d656 - 0x1d66f - # - tc: "bold italic" + # bold italic — UEB: no italic typeform; bold only - test: - if: "$IgnoreBold" - then: [tc: I] - else: [tc: "BI"] + if: "not($IgnoreBold)" + then: [tc: "B"] - spell: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" - "𝙰-𝚉": # 0x1d670 - 0x1d689 @@ -342,8 +334,9 @@ - "𝚹-𝛀": # 0x1d6a8 - 0x1d6c0 - test: if: "not($IgnoreBold)" - then: [tc: "B"] - - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + then: [tc: "BC"] + else: [tc: "C"] + - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "𝛂-𝛚": # 0x1d6c2 - 0x1d6da - test: @@ -355,7 +348,7 @@ - test: if: "not($IgnoreBold)" then: [tc: "B"] - - spell: "translate('.', 'đœ”', '∇')" + - spell: "translate('.', '𝛁', '∇')" - "𝛛𝛜𝛝𝛞𝛟𝛠𝛡": # 0x1D6DB - 0x1D6E1 - test: @@ -364,7 +357,7 @@ - spell: "translate('.', '𝛛𝛜𝛝𝛞𝛟𝛠𝛡', '∂ΔΞÎșφρπ')" - "𝛱-đ›ș": # 0x1d6e2 - 0x1d6fa - - tc: "IC" + - tc: "C" - spell: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›čđ›ș', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "đ›Œ-𝜔": # 0x1d6fc - 0x1d714 @@ -372,7 +365,7 @@ - "đ›»": # 0x1d6fb - - spell: "translate('.', 'đœ”', '∇')" + - spell: "translate('.', 'đ›»', '∇')" - "𝜕𝜖𝜗𝜘𝜙𝜚𝜛": # 0x1d715 - 0x1d71b # - tc: "italic" @@ -380,19 +373,19 @@ - "𝜜-𝜮": # 0x1d71c - 0x1d734 # - tc: "bold italic" - - tc: 'BIC⠁' + - tc: "BC" - spell: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳𝜮', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "đœ¶-𝝎": # 0x1d736 - 0x1d74e - - tc: "BI" + - tc: "B" - spell: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđđŽ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "𝝏𝝐𝝑𝝒𝝓𝝔𝝕": # 0x1d74f - 0x1d755 - - tc: "BI" + - tc: "B" - spell: "translate('.', '𝝏𝝐𝝑𝝒𝝓𝝔𝝕', '∂ΔÎșΞφρπ')" - "đœ”": # 0x1d735 - - tc: "BI" + - tc: "B" - spell: "translate('.', 'đœ”', '∇')" - "𝝖-𝝼": # 0x1d756 - 0x1d76e @@ -409,22 +402,21 @@ - "𝝯": # 0x1d76f - tc: "B" - - spell: "translate('.', 'đœ”', '∇')" + - spell: "translate('.', '𝝯', '∇')" - "𝞐-𝞹": # 0x1d790 - 0x1d7a8 - # - tc: "bold italic" + # bold italic — UEB: no italic typeform; bold + capital only - test: - if: "$IgnoreBold" - then: [tc: I] - else: [tc: "BI"] - - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + if: "not($IgnoreBold)" + then: [tc: "BC"] + else: [tc: "C"] + - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "đžȘ-𝟂": # 0x1d7aa - 0x1d7c2 - # - tc: "bold italic" + # bold italic — UEB: no italic typeform; bold only - test: - if: "$IgnoreBold" - then: [tc: I] - else: [tc: "BI"] + if: "not($IgnoreBold)" + then: [tc: "B"] - spell: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸđŸ‚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "𝟃𝟄𝟅𝟆𝟇𝟈𝟉": # 0x1d7c3 - 0x1d7c9 diff --git a/Rules/Braille/UEB/unicode.yaml b/Rules/Braille/UEB/unicode.yaml index e1b513bc8..ccee08652 100644 --- a/Rules/Braille/UEB/unicode.yaml +++ b/Rules/Braille/UEB/unicode.yaml @@ -367,84 +367,17 @@ - "y": [t: "Lâ œ"] # 0x79 - "z": [t: "Lâ ”"] # 0x7a - - "A": [t: "CL⠁"] # 0x41 - - "B": # 0x42 + # Latin capitals: chem-element letters use đ¶ (no word indicator); others use C. + # Cells come from lowercase a-z via spell/translate. + - "BCHIKNOPSUVWY": # chemistry-capable capitals - test: if: "@data-chem-element" - then: [t: "đ¶L⠃"] - else: [t: "CL⠃"] - - "C": # 0x43 - - test: - if: "@data-chem-element" - then: [t: "đ¶L⠉"] - else: [t: "CL⠉"] - - "D": [t: "CL⠙"] # 0x44 - - "E": [t: "CL⠑"] # 0x45 - - "F": [t: "CL⠋"] # 0x46 - - "G": [t: "CL⠛"] # 0x47 - - "H": # 0x48 - - test: - if: "@data-chem-element" - then: [t: "đ¶L⠓"] - else: [t: "CL⠓"] - - "I": # 0x49 - - test: - if: "@data-chem-element" - then: [t: "đ¶L⠊"] - else: [t: "CL⠊"] - - "J": [t: "CL⠚"] # 0x4a - - "K": # 0x4b - - test: - if: "@data-chem-element" - then: [t: "đ¶L⠅"] - else: [t: "CL⠅"] - - "L": [t: "CL⠇"] # 0x4c - - "M": [t: "CL⠍"] # 0x4d - - "N": # 0x4e - - test: - if: "@data-chem-element" - then: [t: "đ¶L⠝"] - else: [t: "CL⠝"] - - "O": # 0x4f - - test: - if: "@data-chem-element" - then: [t: "đ¶L⠕"] - else: [t: "CL⠕"] - - "P": # 0x50 - - test: - if: "@data-chem-element" - then: [t: "đ¶L⠏"] - else: [t: "CL⠏"] - - "Q": [t: "CL⠟"] # 0x51 - - "R": [t: "CL⠗"] # 0x52 - - "S": # 0x53 - - test: - if: "@data-chem-element" - then: [t: "đ¶L⠎"] - else: [t: "CL⠎"] - - "T": [t: "CL⠞"] # 0x54 - - "U": # 0x55 - - test: - if: "@data-chem-element" - then: [t: "đ¶Lâ „"] - else: [t: "CLâ „"] - - "V": # 0x56 - - test: - if: "@data-chem-element" - then: [t: "đ¶Lâ §"] - else: [t: "CLâ §"] - - "W": # 0x57 - - test: - if: "@data-chem-element" - then: [t: "đ¶Lâ ș"] - else: [t: "CLâ ș"] - - "X": [t: "CLâ ­"] # 0x58 - - "Y": # 0x59 - - test: - if: "@data-chem-element" - then: [t: "đ¶Lâ œ"] - else: [t: "CLâ œ"] - - "Z": [t: "CLâ ”"] # 0x5a + then: [tc: "đ¶"] + else: [tc: "C"] + - spell: "translate('.', 'BCHIKNOPSUVWY', 'bchiknopsuvwy')" + - "ADEFGJLMQRTXZ": # remaining capitals + - tc: "C" + - spell: "translate('.', 'ADEFGJLMQRTXZ', 'adefgjlmqrtxz')" - "α": [t: "GL⠁"] # 0x3b1 - "ÎČ": [t: "GL⠃"] # 0x3b2 @@ -486,7 +419,7 @@ - "Δ": [t: "CGL⠙"] # 0x394 - "Ε": [t: "CGL⠑"] # 0x395 - "Ζ": [t: "CGLâ ”"] # 0x396 - - "Η": [t: "CGLâ ± "] # 0x397 + - "Η": [t: "CGLâ ±"] # 0x397 - "Θ": [t: "CGLâ č"] # 0x398 - "Ι": [t: "CGL⠊"] # 0x399 - "Κ": [t: "CGL⠅"] # 0x39a diff --git a/Rules/Braille/Vietnam/unicode-full.yaml b/Rules/Braille/Vietnam/unicode-full.yaml index eba63e7f3..43008ef7b 100644 --- a/Rules/Braille/Vietnam/unicode-full.yaml +++ b/Rules/Braille/Vietnam/unicode-full.yaml @@ -24,8 +24,8 @@ - "↉": [t: "#N⠚N⠌N⠑"] # 0x2189 (Vulgar Fraction Zero Thirds) - 𝐀-𝐙: # 0x1d400 - 0x1d419 - - tc: "B" - - spell: translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - tc: "BC" + - spell: translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'abcdefghijklmnopqrstuvwxyz') - 𝐚-𝐳: # 0x1d41a - 0x1d433 - tc: "B" @@ -33,38 +33,37 @@ - 𝐮-𝑍: # 0x1d434 - 0x1d44d - tc: "C" - - spell: translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - spell: translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'abcdefghijklmnopqrstuvwxyz') - 𝑎-𝑧: # 0x1d44e - 0x1d467 - - tc: "L" - spell: translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”đ‘•đ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz') - 𝒂-𝒛: # 0x1d482 - 0x1d49b - - tc: "BI" + - tc: "B" - spell: translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz') - 𝑹-𝒁: # 0x1d468 - 0x1d481 - - tc: "BI" - - spell: translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - tc: "BC" + - spell: translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'abcdefghijklmnopqrstuvwxyz') - đ’¶-𝓏: # 0x1d4b6 - 0x1d4cf - tc: "Ts" - spell: translate('.', 'đ’¶đ’·đ’žđ’čđ’șđ’»đ’Œđ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“„đ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdefghijklmnopqrstuvwxyz') - 𝒜-đ’”: # 0x1d49c - 0x1d4b5 - - tc: "Ts" - - spell: translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - tc: "TsC" + - spell: translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'abcdefghijklmnopqrstuvwxyz') - 𝓐-đ“©: # 0x1d4d0 - 0x1d4e9 - - tc: "BTs" - - spell: translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - tc: "BTsC" + - spell: translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'abcdefghijklmnopqrstuvwxyz') - đ“Ș-𝔃: # 0x1d4ea - 0x1d503 - tc: "BTs" - spell: translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz') - 𝔄-𝔝: # 0x1d504 - 0x1d51d - - tc: "D" - - spell: translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜𝔝', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - tc: "DC" + - spell: translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜𝔝', 'abcdefghijklmnopqrstuvwxyz') - 𝔞-đ”·: # 0x1d51e - 0x1d537 - tc: "D" - spell: translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz') @@ -82,14 +81,14 @@ - "℮": [t: "TL⠕"] # 0x21334 (Script Small O) - 𝔾-đ”č: # 0x1d538 - 0x1d550 - - tc: "đ”č" - - spell: translate('.', '𝔾đ”č', 'AB') + - tc: "đ”čC" + - spell: translate('.', '𝔾đ”č', 'ab') - đ”»-đ”Ÿ: - - tc: "đ”č" - - spell: translate('.', 'đ”»đ”Œđ”œđ”Ÿ', 'DEFG') + - tc: "đ”čC" + - spell: translate('.', 'đ”»đ”Œđ”œđ”Ÿ', 'defg') - 𝕀-𝕄: - - tc: "đ”č" - - spell: translate('.', '𝕀𝕁𝕂𝕃𝕄', 'IJKLM') + - tc: "đ”čC" + - spell: translate('.', '𝕀𝕁𝕂𝕃𝕄', 'ijklm') - "ℂ": [t: "đ”čCL⠉"] # 0x2102 - "ℍ": [t: "đ”čCL⠓"] # 0x210d @@ -98,14 +97,14 @@ - 𝕊-𝕐: - t: "đ”č" - - spell: translate('.', '𝕊𝕋𝕌𝕍𝕎𝕏𝕐', 'STUVWXY') + - spell: translate('.', '𝕊𝕋𝕌𝕍𝕎𝕏𝕐', 'stuvwxy') - 𝕒-đ•«: # 0x1d552 - 0x1d56b - t: "đ”č" - spell: translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz') - 𝕬-𝖅: - t: "BD" - - spell: translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - spell: translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'abcdefghijklmnopqrstuvwxyz') - "ℌ": [t: "DCL⠓"] # 0x210C (Fraktur Capital H) - "ℑ": [t: "DCL⠊"] # 0x2111 (Fraktur Capital I) @@ -117,32 +116,32 @@ - tc: "BD" - spell: translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz') - 𝖠-đ–č: # 0x1d5a0 - 0x1d5b9 - - tc: "S" - - spell: translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - tc: "SC" + - spell: translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'abcdefghijklmnopqrstuvwxyz') - đ–ș-𝗓: # 0x1d5ba - 0x1d5d3 - tc: "S" - spell: translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz') - 𝗔-𝗭: # 0x1d5d4 - 0x1d5ed - - tc: "BS" - - spell: translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - tc: "BSC" + - spell: translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'abcdefghijklmnopqrstuvwxyz') - 𝗼-𝘇: # 0x1d5ee - 0x1d607 - tc: "BS" - spell: translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz') - 𝘈-𝘡: # 0x1d608 - 0x1d621 - t: "IS" - - spell: translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - spell: translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'abcdefghijklmnopqrstuvwxyz') - 𝘱-đ˜»: # 0x1d622 - 0x1d63b - t: "IS" - spell: translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz') - đ˜Œ-𝙕: # 0x1d63c - 0x1d655 - t: "BILS" - - spell: translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - spell: translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'abcdefghijklmnopqrstuvwxyz') - 𝙖-𝙯: # 0x1d656 - 0x1d66f - t: "BILS" - spell: translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz') - 𝙰-𝚉: # 0x1d670 - 0x1d689 - - spell: translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') + - spell: translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'abcdefghijklmnopqrstuvwxyz') - 𝚊-𝚣: # 0x1d68a - 0x1d6a3 - spell: translate('.', '𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚱𝚣', 'abcdefghijklmnopqrstuvwxyz') @@ -151,40 +150,40 @@ - 𝚹-𝚿: # 0x1d6a8 - 0x1d6bf - tc: "BCG" - - spell: translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšż', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©') + - spell: translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšż', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - 𝛂-𝛙: # 0x1d6c2 - 0x1d6d9 - tc: "BG" - spell: translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - 𝛱-đ›č: # 0x1d6e2 - 0x1d6f9 - - tc: "ICG" - - spell: translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›č', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©') + - tc: "CG" + - spell: translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›č', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - đ›Œ-𝜓: # 0x1d6fc - 0x1d713 - - tc: "IG" + - tc: "G" - spell: translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - 𝜜-𝜳: # 0x1d71c - 0x1d733 - - tc: "BICG" - - spell: translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©') + - tc: "BCG" + - spell: translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - đœ¶-𝝍: # 0x1d736 - 0x1d74d - - tc: "BIG" + - tc: "BG" - spell: translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - 𝝖-𝝭: # 0x1d756 - 0x1d76d - tc: "BSCG" - - spell: translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©') + - spell: translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - 𝝰-𝞇: # 0x1d770 - 0x1d787 - tc: "BSG" - spell: translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€đžđž‚đžƒđž„đž…đž†đž‡', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - 𝞐-𝞧: # 0x1d790 - 0x1d7a7 - - tc: "BISCG" - - spell: translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©') + - tc: "BSCG" + - spell: translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - đžȘ-𝟁: # 0x1d7aa - 0x1d7c1 - - tc: "BISG" + - tc: "BSG" - spell: translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰') - 𝟎-𝟗: # 0x1d7ce - 0x1d7d7 - tc: "BN" - spell: translate('.', '𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗', '0123456789') - 𝟘-𝟡: # 0x1d7d8 - 0x1d7e1 - - tc: "đ”čN" + - tc: "đ”čNC" - spell: translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789') - 𝟱-đŸ«: # 0x1d7e2 - 0x1d7eb - tc: "SN" diff --git a/Rules/Braille/Vietnam/unicode.yaml b/Rules/Braille/Vietnam/unicode.yaml index 2d9a6150a..78a9adaa6 100644 --- a/Rules/Braille/Vietnam/unicode.yaml +++ b/Rules/Braille/Vietnam/unicode.yaml @@ -511,32 +511,10 @@ - "Ở": [t: "CLâ €đ‘Lâ œ"] - "Ỏ": [t: "CL⠠𝑐Lâ œ"] - - "A": [t: "CL⠁"] # 0x41 - - "B": [t: "CL⠃"] # 0x42 - - "C": [t: "CL⠉"] # 0x43 - - "D": [t: "CL⠙"] # 0x44 - - "E": [t: "CL⠑"] # 0x45 - - "F": [t: "CL⠋"] # 0x46 - - "G": [t: "CL⠛"] # 0x47 - - "H": [t: "CL⠓"] # 0x48 - - "I": [t: "CL⠊"] # 0x49 - - "J": [t: "CL⠚"] # 0x4a - - "K": [t: "CL⠅"] # 0x4b - - "L": [t: "CL⠇"] # 0x4c - - "M": [t: "CL⠍"] # 0x4d - - "N": [t: "CL⠝"] # 0x4e - - "O": [t: "CL⠕"] # 0x4f - - "P": [t: "CL⠏"] # 0x50 - - "Q": [t: "CL⠟"] # 0x51 - - "R": [t: "CL⠗"] # 0x52 - - "S": [t: "CL⠎"] # 0x53 - - "T": [t: "CL⠞"] # 0x54 - - "U": [t: "CLâ „"] # 0x55 - - "V": [t: "CLâ §"] # 0x56 - - "W": [t: "CLâ ș"] # 0x57 - - "X": [t: "CLâ ­"] # 0x58 - - "Y": [t: "CLâ œ"] # 0x59 - - "Z": [t: "CLâ ”"] # 0x5a + # Latin capitals: C + cells from lowercase a-z via spell/translate. + - "A-Z": # 0x41 - 0x5a + - tc: "C" + - spell: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')" - "α": [t: "GL⠁"] # 0x3b1 - "ÎČ": [t: "GL⠃"] # 0x3b2 diff --git a/Rules/Languages/id/unicode-full.yaml b/Rules/Languages/id/unicode-full.yaml index c1467a28e..5591060fd 100644 --- a/Rules/Languages/id/unicode-full.yaml +++ b/Rules/Languages/id/unicode-full.yaml @@ -3846,6469 +3846,584 @@ - "": [T: integral terbalik] # 0xef83 - "": [T: nol ganda di atas nol ganda] # 0xef90 - "": [T: nol dengan garis miring] # 0xef91 - - "": # 0xf000 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "𝔄": # 0x1d504 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "": # 0xf001 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "𝔅": # 0x1d505 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "": # 0xf003 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "𝔇": # 0x1d507 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "": # 0xf004 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "𝔈": # 0x1d508 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "": # 0xf005 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "𝔉": # 0x1d509 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "": # 0xf006 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "𝔊": # 0x1d50a - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "": # 0xf009 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "𝔍": # 0x1d50d - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "": # 0xf00a - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "𝔎": # 0x1d50e - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "": # 0xf00b - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "𝔏": # 0x1d50f - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "": # 0xf00c - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "𝔐": # 0x1d510 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "": # 0xf00d - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "𝔑": # 0x1d511 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "": # 0xf00e - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "𝔒": # 0x1d512 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "": # 0xf00f - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "𝔓": # 0x1d513 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "": # 0xf010 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "𝔔": # 0x1d514 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "": # 0xf012 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "𝔖": # 0x1d516 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "": # 0xf013 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "𝔗": # 0x1d517 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "": # 0xf014 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "𝔘": # 0x1d518 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "": # 0xf015 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "𝔙": # 0x1d519 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "": # 0xf016 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "𝔚": # 0x1d51a - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "": # 0xf017 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "𝔛": # 0x1d51b - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "": # 0xf018 - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "𝔜": # 0x1d51c - - T: fraktur - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "": [T: fraktur a] # 0xf01a - - "𝔞": [T: fraktur a] # 0x1d51e - - "": [T: fraktur b] # 0xf01b - - "𝔟": [T: fraktur b] # 0x1d51f - - "": [T: fraktur c] # 0xf01c - - "𝔠": [T: fraktur c] # 0x1d520 - - "": [T: fraktur d] # 0xf01d - - "𝔡": [T: fraktur d] # 0x1d521 - - "": [T: fraktur e] # 0xf01e - - "𝔱": [T: fraktur e] # 0x1d522 - - "": [T: fraktur f] # 0xf01f - - "𝔣": [T: fraktur f] # 0x1d523 - - "": [T: fraktur g] # 0xf020 - - "đ”€": [T: fraktur g] # 0x1d524 - - "ï€Ą": [T: fraktur h] # 0xf021 - - "đ”„": [T: fraktur h] # 0x1d525 - - "ï€ą": [T: fraktur i] # 0xf022 - - "𝔩": [T: fraktur i] # 0x1d526 - - "ï€Ł": [T: fraktur j] # 0xf023 - - "𝔧": [T: fraktur j] # 0x1d527 - - "": [T: fraktur k] # 0xf024 - - "𝔹": [T: fraktur k] # 0x1d528 - - "": [T: fraktur l] # 0xf025 - - "đ”©": [T: fraktur l] # 0x1d529 - - "": [T: fraktur m] # 0xf026 - - "đ”Ș": [T: fraktur m] # 0x1d52a - - "": [T: fraktur n] # 0xf027 - - "đ”«": [T: fraktur n] # 0x1d52b - - "": [T: fraktur o] # 0xf028 - - "𝔬": [T: fraktur o] # 0x1d52c - - "": [T: fraktur p] # 0xf029 - - "𝔭": [T: fraktur p] # 0x1d52d - - "ï€Ș": [T: fraktur q] # 0xf02a - - "𝔼": [T: fraktur q] # 0x1d52e - - "": [T: fraktur r] # 0xf02b - - "𝔯": [T: fraktur r] # 0x1d52f - - "ï€Ź": [T: fraktur s] # 0xf02c - - "𝔰": [T: fraktur s] # 0x1d530 - - "": [T: fraktur t] # 0xf02d - - "đ”±": [T: fraktur t] # 0x1d531 - - "ï€ź": [T: fraktur u] # 0xf02e - - "đ”Č": [T: fraktur u] # 0x1d532 - - "ï€Ż": [T: fraktur v] # 0xf02f - - "𝔳": [T: fraktur v] # 0x1d533 - - "": [T: fraktur w] # 0xf030 - - "𝔮": [T: fraktur w] # 0x1d534 - - "": [T: fraktur x] # 0xf031 - - "đ””": [T: fraktur x] # 0x1d535 - - "ï€Č": [T: fraktur y] # 0xf032 - - "đ”¶": [T: fraktur y] # 0x1d536 - - "ï€ł": [T: fraktur z] # 0xf033 - - "đ”·": [T: fraktur z] # 0x1d537 - - "": # 0xf040 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "𝕬": # 0x1d56c - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "": # 0xf041 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "𝕭": # 0x1d56d - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "": # 0xf042 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "𝕼": # 0x1d56e - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "": # 0xf043 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "𝕯": # 0x1d56f - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "": # 0xf044 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "𝕰": # 0x1d570 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "": # 0xf045 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "đ•±": # 0x1d571 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "": # 0xf046 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "đ•Č": # 0x1d572 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "": # 0xf047 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "𝕳": # 0x1d573 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "": # 0xf048 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "𝕮": # 0x1d574 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "": # 0xf049 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "đ•”": # 0x1d575 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "": # 0xf04a - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "đ•¶": # 0x1d576 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "": # 0xf04b - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "đ•·": # 0x1d577 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "": # 0xf04c - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "𝕾": # 0x1d578 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "": # 0xf04d - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "đ•č": # 0x1d579 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "": # 0xf04e - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "đ•ș": # 0x1d57a - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "": # 0xf04f - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "đ•»": # 0x1d57b - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "": # 0xf050 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "đ•Œ": # 0x1d57c - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "": # 0xf051 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "đ•œ": # 0x1d57d - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "": # 0xf052 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "đ•Ÿ": # 0x1d57e - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "": # 0xf053 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "𝕿": # 0x1d57f - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "": # 0xf054 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "𝖀": # 0x1d580 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "": # 0xf055 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "𝖁": # 0x1d581 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "": # 0xf056 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "𝖂": # 0x1d582 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "": # 0xf057 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "𝖃": # 0x1d583 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "": # 0xf058 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "𝖄": # 0x1d584 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "": # 0xf059 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "𝖅": # 0x1d585 - - T: fraktur bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "": [T: fraktur bold a] # 0xf05a - - "𝖆": [T: fraktur bold a] # 0x1d586 - - "": [T: fraktur bold b] # 0xf05b - - "𝖇": [T: fraktur bold b] # 0x1d587 - - "": [T: fraktur bold c] # 0xf05c - - "𝖈": [T: fraktur bold c] # 0x1d588 - - "": [T: fraktur bold d] # 0xf05d - - "𝖉": [T: fraktur bold d] # 0x1d589 - - "": [T: fraktur bold e] # 0xf05e - - "𝖊": [T: fraktur bold e] # 0x1d58a - - "": [T: fraktur bold f] # 0xf05f - - "𝖋": [T: fraktur bold f] # 0x1d58b - - "": [T: fraktur bold g] # 0xf060 - - "𝖌": [T: fraktur bold g] # 0x1d58c - - "ïĄ": [T: fraktur bold h] # 0xf061 - - "𝖍": [T: fraktur bold h] # 0x1d58d - - "ïą": [T: fraktur bold i] # 0xf062 - - "𝖎": [T: fraktur bold i] # 0x1d58e - - "ïŁ": [T: fraktur bold j] # 0xf063 - - "𝖏": [T: fraktur bold j] # 0x1d58f - - "": [T: fraktur bold k] # 0xf064 - - "𝖐": [T: fraktur bold k] # 0x1d590 - - "": [T: fraktur bold l] # 0xf065 - - "𝖑": [T: fraktur bold l] # 0x1d591 - - "": [T: fraktur bold m] # 0xf066 - - "𝖒": [T: fraktur bold m] # 0x1d592 - - "": [T: fraktur bold n] # 0xf067 - - "𝖓": [T: fraktur bold n] # 0x1d593 - - "": [T: fraktur bold o] # 0xf068 - - "𝖔": [T: fraktur bold o] # 0x1d594 - - "": [T: fraktur bold p] # 0xf069 - - "𝖕": [T: fraktur bold p] # 0x1d595 - - "ïȘ": [T: fraktur bold q] # 0xf06a - - "𝖖": [T: fraktur bold q] # 0x1d596 - - "": [T: fraktur bold r] # 0xf06b - - "𝖗": [T: fraktur bold r] # 0x1d597 - - "ïŹ": [T: fraktur bold s] # 0xf06c - - "𝖘": [T: fraktur bold s] # 0x1d598 - - "": [T: fraktur bold t] # 0xf06d - - "𝖙": [T: fraktur bold t] # 0x1d599 - - "ïź": [T: fraktur bold u] # 0xf06e - - "𝖚": [T: fraktur bold u] # 0x1d59a - - "ïŻ": [T: fraktur bold v] # 0xf06f - - "𝖛": [T: fraktur bold v] # 0x1d59b - - "": [T: fraktur bold w] # 0xf070 - - "𝖜": [T: fraktur bold w] # 0x1d59c - - "": [T: fraktur bold x] # 0xf071 - - "𝖝": [T: fraktur bold x] # 0x1d59d - - "ïČ": [T: fraktur bold y] # 0xf072 - - "𝖞": [T: fraktur bold y] # 0x1d59e - - "ïł": [T: fraktur bold z] # 0xf073 - - "𝖟": [T: fraktur bold z] # 0x1d59f - - "": # 0xf080 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "": # 0xf081 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "đ”č": # 0x1d539 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "": # 0xf083 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "đ”»": # 0x1d53b - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "": # 0xf084 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "đ”Œ": # 0x1d53c - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "": # 0xf085 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "đ”œ": # 0x1d53d - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "": # 0xf086 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "đ”Ÿ": # 0x1d53e - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "": # 0xf088 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "𝕀": # 0x1d540 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "": # 0xf089 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "𝕁": # 0x1d541 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "": # 0xf08a - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "𝕂": # 0x1d542 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "": # 0xf08b - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "𝕃": # 0x1d543 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "": # 0xf08c - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "𝕄": # 0x1d544 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "": # 0xf08e - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "𝕆": # 0x1d546 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "": # 0xf092 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "𝕊": # 0x1d54a - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "": # 0xf093 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "𝕋": # 0x1d54b - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "": # 0xf094 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "𝕌": # 0x1d54c - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "": # 0xf095 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "𝕍": # 0x1d54d - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "": # 0xf096 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "𝕎": # 0x1d54e - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "": # 0xf097 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "𝕏": # 0x1d54f - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "": # 0xf098 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "𝕐": # 0x1d550 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "": [T: struck ganda a] # 0xf09a - - "𝕒": [T: struck ganda a] # 0x1d552 - - "": [T: struck ganda b] # 0xf09b - - "𝕓": [T: struck ganda b] # 0x1d553 - - "": [T: struck ganda c] # 0xf09c - - "𝕔": [T: struck ganda c] # 0x1d554 - - "": [T: struck ganda d] # 0xf09d - - "𝕕": [T: struck ganda d] # 0x1d555 - - "": [T: struck ganda e] # 0xf09e - - "𝕖": [T: struck ganda e] # 0x1d556 - - "": [T: struck ganda f] # 0xf09f - - "𝕗": [T: struck ganda f] # 0x1d557 - - "": [T: struck ganda g] # 0xf0a0 - - "𝕘": [T: struck ganda g] # 0x1d558 - - "ï‚Ą": [T: struck ganda h] # 0xf0a1 - - "𝕙": [T: struck ganda h] # 0x1d559 - - "ï‚ą": [T: struck ganda i] # 0xf0a2 - - "𝕚": [T: struck ganda i] # 0x1d55a - - "ï‚Ł": [T: struck ganda j] # 0xf0a3 - - "𝕛": [T: struck ganda j] # 0x1d55b - - "ï‚€": [T: struck ganda k] # 0xf0a4 - - "𝕜": [T: struck ganda k] # 0x1d55c - - "ï‚„": [T: struck ganda l] # 0xf0a5 - - "𝕝": [T: struck ganda l] # 0x1d55d - - "": [T: struck ganda m] # 0xf0a6 - - "𝕞": [T: struck ganda m] # 0x1d55e - - "": [T: struck ganda n] # 0xf0a7 - - "𝕟": [T: struck ganda n] # 0x1d55f - - "": [T: struck ganda o] # 0xf0a8 - - "𝕠": [T: struck ganda o] # 0x1d560 - - "": [T: struck ganda p] # 0xf0a9 - - "𝕡": [T: struck ganda p] # 0x1d561 - - "ï‚Ș": [T: struck ganda q] # 0xf0aa - - "𝕱": [T: struck ganda q] # 0x1d562 - - "": [T: struck ganda r] # 0xf0ab - - "𝕣": [T: struck ganda r] # 0x1d563 - - "ï‚Ź": [T: struck ganda s] # 0xf0ac - - "đ•€": [T: struck ganda s] # 0x1d564 - - "": [T: struck ganda t] # 0xf0ad - - "đ•„": [T: struck ganda t] # 0x1d565 - - "ï‚ź": [T: struck ganda u] # 0xf0ae - - "𝕩": [T: struck ganda u] # 0x1d566 - - "ï‚Ż": [T: struck ganda v] # 0xf0af - - "𝕧": [T: struck ganda v] # 0x1d567 - - "": [T: struck ganda w] # 0xf0b0 - - "𝕹": [T: struck ganda w] # 0x1d568 - - "": [T: struck ganda x] # 0xf0b1 - - "đ•©": [T: struck ganda x] # 0x1d569 - - "ï‚Č": [T: struck ganda y] # 0xf0b2 - - "đ•Ș": [T: struck ganda y] # 0x1d56a - - "ï‚ł": [T: struck ganda z] # 0xf0b3 - - "đ•«": [T: struck ganda z] # 0x1d56b - - "": [T: struck ganda nol] # 0xf0c0 - - "𝟘": [T: struck ganda nol] # 0x1d7d8 - - "": [T: struck ganda satu] # 0xf0c1 - - "𝟙": [T: struck ganda satu] # 0x1d7d9 - - "": [T: struck ganda dua] # 0xf0c2 - - "𝟚": [T: struck ganda dua] # 0x1d7da - - "": [T: struck ganda tiga] # 0xf0c3 - - "𝟛": [T: struck ganda tiga] # 0x1d7db - - "": [T: struck ganda empat] # 0xf0c4 - - "𝟜": [T: struck ganda empat] # 0x1d7dc - - "": [T: struck ganda lima] # 0xf0c5 - - "𝟝": [T: struck ganda lima] # 0x1d7dd - - "": [T: struck ganda enam] # 0xf0c6 - - "𝟞": [T: struck ganda enam] # 0x1d7de - - "": [T: struck ganda tujuh] # 0xf0c7 - - "𝟟": [T: struck ganda tujuh] # 0x1d7df - - "": [T: struck ganda delapan] # 0xf0c8 - - "𝟠": [T: struck ganda delapan] # 0x1d7e0 - - "": [T: struck ganda sembilan] # 0xf0c9 - - "𝟡": [T: struck ganda sembilan] # 0x1d7e1 - - "": [T: struck ganda nabla] # 0xf0ca - - "": [T: struck ganda konstanta euler] # 0xf0cb - - "": # 0xf100 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "𝒜": # 0x1d49c - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "": # 0xf102 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "𝒞": # 0x1d49e - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "": # 0xf103 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "𝒟": # 0x1d49f - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "": # 0xf106 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "𝒱": # 0x1d4a2 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "": # 0xf109 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "đ’„": # 0x1d4a5 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "": # 0xf10a - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "𝒩": # 0x1d4a6 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "": # 0xf10d - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "đ’©": # 0x1d4a9 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "": # 0xf10e - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "đ’Ș": # 0x1d4aa - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "": # 0xf10f - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "đ’«": # 0x1d4ab - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "": # 0xf110 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "𝒬": # 0x1d4ac - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "": # 0xf112 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "𝒼": # 0x1d4ae - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "": # 0xf113 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "𝒯": # 0x1d4af - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "": # 0xf114 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "𝒰": # 0x1d4b0 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "": # 0xf115 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "đ’±": # 0x1d4b1 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "": # 0xf116 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "đ’Č": # 0x1d4b2 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "": # 0xf117 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "𝒳": # 0x1d4b3 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "": # 0xf118 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "𝒮": # 0x1d4b4 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "": # 0xf119 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "đ’”": # 0x1d4b5 - - T: aksara - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "": [T: aksara a] # 0xf11a - - "đ’¶": [T: aksara a] # 0x1d4b6 - - "": [T: aksara b] # 0xf11b - - "đ’·": [T: aksara b] # 0x1d4b7 - - "": [T: aksara c] # 0xf11c - - "𝒾": [T: aksara c] # 0x1d4b8 - - "": [T: aksara d] # 0xf11d - - "đ’č": [T: aksara d] # 0x1d4b9 - - "": [T: aksara f] # 0xf11f - - "đ’»": [T: aksara f] # 0x1d4bb - - "ï„Ą": [T: aksara h] # 0xf121 - - "đ’œ": [T: aksara h] # 0x1d4bd - - "ï„ą": [T: aksara i] # 0xf122 - - "đ’Ÿ": [T: aksara i] # 0x1d4be - - "ï„Ł": [T: aksara j] # 0xf123 - - "𝒿": [T: aksara j] # 0x1d4bf - - "ï„€": [T: aksara k] # 0xf124 - - "𝓀": [T: aksara k] # 0x1d4c0 - - "": [T: aksara m] # 0xf126 - - "𝓂": [T: aksara m] # 0x1d4c2 - - "": [T: aksara n] # 0xf127 - - "𝓃": [T: aksara n] # 0x1d4c3 - - "": [T: aksara p] # 0xf129 - - "𝓅": [T: aksara p] # 0x1d4c5 - - "ï„Ș": [T: aksara q] # 0xf12a - - "𝓆": [T: aksara q] # 0x1d4c6 - - "": [T: aksara r] # 0xf12b - - "𝓇": [T: aksara r] # 0x1d4c7 - - "ï„Ź": [T: aksara s] # 0xf12c - - "𝓈": [T: aksara s] # 0x1d4c8 - - "": [T: aksara t] # 0xf12d - - "𝓉": [T: aksara t] # 0x1d4c9 - - "ï„ź": [T: aksara u] # 0xf12e - - "𝓊": [T: aksara u] # 0x1d4ca - - "ï„Ż": [T: aksara v] # 0xf12f - - "𝓋": [T: aksara v] # 0x1d4cb - - "": [T: aksara w] # 0xf130 - - "𝓌": [T: aksara w] # 0x1d4cc - - "": [T: aksara x] # 0xf131 - - "𝓍": [T: aksara x] # 0x1d4cd - - "ï„Č": [T: aksara y] # 0xf132 - - "𝓎": [T: aksara y] # 0x1d4ce - - "ï„ł": [T: aksara z] # 0xf133 - - "𝓏": [T: aksara z] # 0x1d4cf - - "": # 0xf140 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "𝓐": # 0x1d4d0 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "": # 0xf141 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "𝓑": # 0x1d4d1 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "": # 0xf142 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "𝓒": # 0x1d4d2 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "": # 0xf143 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "𝓓": # 0x1d4d3 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "": # 0xf144 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "𝓔": # 0x1d4d4 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "": # 0xf145 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "𝓕": # 0x1d4d5 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "": # 0xf146 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "𝓖": # 0x1d4d6 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "": # 0xf147 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "𝓗": # 0x1d4d7 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "": # 0xf148 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "𝓘": # 0x1d4d8 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "": # 0xf149 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "𝓙": # 0x1d4d9 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "": # 0xf14a - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "𝓚": # 0x1d4da - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "": # 0xf14b - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "𝓛": # 0x1d4db - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "": # 0xf14c - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "𝓜": # 0x1d4dc - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "": # 0xf14d - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "𝓝": # 0x1d4dd - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "": # 0xf14e - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "𝓞": # 0x1d4de - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "": # 0xf14f - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "𝓟": # 0x1d4df - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "": # 0xf150 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "𝓠": # 0x1d4e0 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "": # 0xf151 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "𝓡": # 0x1d4e1 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "": # 0xf152 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "𝓱": # 0x1d4e2 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "": # 0xf153 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "𝓣": # 0x1d4e3 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "": # 0xf154 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "đ“€": # 0x1d4e4 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "": # 0xf155 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "đ“„": # 0x1d4e5 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "": # 0xf156 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "𝓩": # 0x1d4e6 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "": # 0xf157 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "𝓧": # 0x1d4e7 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "": # 0xf158 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "𝓹": # 0x1d4e8 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "": # 0xf159 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "đ“©": # 0x1d4e9 - - T: aksara bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "": [T: aksara bold a] # 0xf15a - - "đ“Ș": [T: aksara bold a] # 0x1d4ea - - "": [T: aksara bold b] # 0xf15b - - "đ“«": [T: aksara bold b] # 0x1d4eb - - "": [T: aksara bold c] # 0xf15c - - "𝓬": [T: aksara bold c] # 0x1d4ec - - "": [T: aksara bold d] # 0xf15d - - "𝓭": [T: aksara bold d] # 0x1d4ed - - "": [T: aksara bold e] # 0xf15e - - "𝓼": [T: aksara bold e] # 0x1d4ee - - "": [T: aksara bold f] # 0xf15f - - "𝓯": [T: aksara bold f] # 0x1d4ef - - "": [T: aksara bold g] # 0xf160 - - "𝓰": [T: aksara bold g] # 0x1d4f0 - - "ï…Ą": [T: aksara bold h] # 0xf161 - - "đ“±": [T: aksara bold h] # 0x1d4f1 - - "ï…ą": [T: aksara bold i] # 0xf162 - - "đ“Č": [T: aksara bold i] # 0x1d4f2 - - "ï…Ł": [T: aksara bold j] # 0xf163 - - "𝓳": [T: aksara bold j] # 0x1d4f3 - - "ï…€": [T: aksara bold k] # 0xf164 - - "𝓮": [T: aksara bold k] # 0x1d4f4 - - "ï…„": [T: aksara bold l] # 0xf165 - - "đ“”": [T: aksara bold l] # 0x1d4f5 - - "ï…Š": [T: aksara bold m] # 0xf166 - - "đ“¶": [T: aksara bold m] # 0x1d4f6 - - "": [T: aksara bold n] # 0xf167 - - "đ“·": [T: aksara bold n] # 0x1d4f7 - - "ï…š": [T: aksara bold o] # 0xf168 - - "𝓾": [T: aksara bold o] # 0x1d4f8 - - "": [T: aksara bold p] # 0xf169 - - "đ“č": [T: aksara bold p] # 0x1d4f9 - - "ï…Ș": [T: aksara bold q] # 0xf16a - - "đ“ș": [T: aksara bold q] # 0x1d4fa - - "": [T: aksara bold r] # 0xf16b - - "đ“»": [T: aksara bold r] # 0x1d4fb - - "ï…Ź": [T: aksara bold s] # 0xf16c - - "đ“Œ": [T: aksara bold s] # 0x1d4fc - - "": [T: aksara bold t] # 0xf16d - - "đ“œ": [T: aksara bold t] # 0x1d4fd - - "ï…ź": [T: aksara bold u] # 0xf16e - - "đ“Ÿ": [T: aksara bold u] # 0x1d4fe - - "ï…Ż": [T: aksara bold v] # 0xf16f - - "𝓿": [T: aksara bold v] # 0x1d4ff - - "": [T: aksara bold w] # 0xf170 - - "𝔀": [T: aksara bold w] # 0x1d500 - - "": [T: aksara bold x] # 0xf171 - - "𝔁": [T: aksara bold x] # 0x1d501 - - "ï…Č": [T: aksara bold y] # 0xf172 - - "𝔂": [T: aksara bold y] # 0x1d502 - - "ï…ł": [T: aksara bold z] # 0xf173 - - "𝔃": [T: aksara bold z] # 0x1d503 - - "": # 0xf180 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "": # 0xf182 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "": # 0xf183 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "": # 0xf184 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "": # 0xf185 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "": # 0xf189 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "": # 0xf18a - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "": # 0xf18c - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "": # 0xf18e - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "": # 0xf18f - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "": # 0xf190 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "": # 0xf192 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "": # 0xf193 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "": # 0xf194 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "": # 0xf195 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "": # 0xf196 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "": # 0xf197 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "": # 0xf199 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "": # 0xf19a - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: ligature ae - - "": # 0xf19b - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: sharp s - - "": # 0xf19c - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o with stroke - - "": # 0xf201 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: delta - - "": # 0xf202 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: zai - - "": # 0xf203 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: lambda - - "": # 0xf204 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: pi - - "": # 0xf205 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: sigma - - "": # 0xf206 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "": # 0xf207 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: gamma - - "": # 0xf208 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omega - - "": # 0xf209 - - T: struck ganda - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: upsilon - - "": [T: struck ganda alpha] # 0xf220 - - "ïˆĄ": [T: struck ganda beta] # 0xf221 - - "ïˆą": [T: struck ganda phi] # 0xf222 - - "ïˆŁ": [T: struck ganda zeta] # 0xf223 - - "": [T: struck ganda psi] # 0xf224 - - "": [T: struck ganda delta] # 0xf225 - - "": [T: struck ganda epsilon tidak keriting] # 0xf226 - - "": [T: struck ganda gamma] # 0xf227 - - "": [T: struck ganda eta] # 0xf228 - - "": [T: struck ganda iota] # 0xf229 - - "ïˆȘ": [T: struck ganda xi] # 0xf22a - - "": [T: struck ganda kappa] # 0xf22b - - "ïˆŹ": [T: struck ganda lambda] # 0xf22c - - "": [T: struck ganda mu] # 0xf22d - - "ïˆź": [T: struck ganda nu] # 0xf22e - - "ïˆŻ": [T: struck ganda epsilon] # 0xf22f - - "": [T: struck ganda pi] # 0xf230 - - "": [T: struck ganda theta] # 0xf231 - - "ïˆČ": [T: struck ganda rho] # 0xf232 - - "ïˆł": [T: struck ganda sigma] # 0xf233 - - "": [T: struck ganda tau] # 0xf234 - - "": [T: struck ganda theta] # 0xf235 - - "": [T: struck ganda omega] # 0xf236 - - "": [T: struck ganda final sigma] # 0xf237 - - "": [T: struck ganda rho] # 0xf250 - - "": [T: struck ganda phi] # 0xf251 - - "": # 0xf260 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "𝐀": # 0x1d400 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "ï‰Ą": # 0xf261 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "𝐁": # 0x1d401 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "ï‰ą": # 0xf262 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "𝐂": # 0x1d402 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "ï‰Ł": # 0xf263 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "𝐃": # 0x1d403 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "": # 0xf264 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "𝐄": # 0x1d404 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "": # 0xf265 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "𝐅": # 0x1d405 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "": # 0xf266 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "𝐆": # 0x1d406 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "": # 0xf267 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "𝐇": # 0x1d407 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "": # 0xf268 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "𝐈": # 0x1d408 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "": # 0xf269 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "𝐉": # 0x1d409 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "ï‰Ș": # 0xf26a - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "𝐊": # 0x1d40a - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "": # 0xf26b - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "𝐋": # 0x1d40b - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "ï‰Ź": # 0xf26c - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "𝐌": # 0x1d40c - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "": # 0xf26d - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "𝐍": # 0x1d40d - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "ï‰ź": # 0xf26e - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "𝐎": # 0x1d40e - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "ï‰Ż": # 0xf26f - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "𝐏": # 0x1d40f - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "": # 0xf270 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "𝐐": # 0x1d410 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "": # 0xf271 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "𝐑": # 0x1d411 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "ï‰Č": # 0xf272 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "𝐒": # 0x1d412 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "ï‰ł": # 0xf273 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "𝐓": # 0x1d413 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "": # 0xf274 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "𝐔": # 0x1d414 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "": # 0xf275 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "𝐕": # 0x1d415 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "": # 0xf276 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "𝐖": # 0x1d416 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "": # 0xf277 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "𝐗": # 0x1d417 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "": # 0xf278 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "𝐘": # 0x1d418 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "ï‰č": # 0xf279 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "𝐙": # 0x1d419 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "ï‰ș": [T: bold a] # 0xf27a - - "𝐚": [T: bold a] # 0x1d41a - - "": [T: bold b] # 0xf27b - - "𝐛": [T: bold b] # 0x1d41b - - "": [T: bold c] # 0xf27c - - "𝐜": [T: bold c] # 0x1d41c - - "": [T: bold d] # 0xf27d - - "𝐝": [T: bold d] # 0x1d41d - - "": [T: bold e] # 0xf27e - - "𝐞": [T: bold e] # 0x1d41e - - "ï‰ż": [T: bold f] # 0xf27f - - "𝐟": [T: bold f] # 0x1d41f - - "": [T: bold g] # 0xf280 - - "𝐠": [T: bold g] # 0x1d420 - - "": [T: bold h] # 0xf281 - - "𝐡": [T: bold h] # 0x1d421 - - "": [T: bold i] # 0xf282 - - "𝐱": [T: bold i] # 0x1d422 - - "": [T: bold j] # 0xf283 - - "𝐣": [T: bold j] # 0x1d423 - - "": [T: bold k] # 0xf284 - - "đ€": [T: bold k] # 0x1d424 - - "": [T: bold l] # 0xf285 - - "đ„": [T: bold l] # 0x1d425 - - "": [T: bold m] # 0xf286 - - "𝐩": [T: bold m] # 0x1d426 - - "": [T: bold n] # 0xf287 - - "𝐧": [T: bold n] # 0x1d427 - - "": [T: bold o] # 0xf288 - - "𝐹": [T: bold o] # 0x1d428 - - "": [T: bold p] # 0xf289 - - "đ©": [T: bold p] # 0x1d429 - - "": [T: bold q] # 0xf28a - - "đȘ": [T: bold q] # 0x1d42a - - "": [T: bold r] # 0xf28b - - "đ«": [T: bold r] # 0x1d42b - - "": [T: bold s] # 0xf28c - - "𝐬": [T: bold s] # 0x1d42c - - "": [T: bold t] # 0xf28d - - "𝐭": [T: bold t] # 0x1d42d - - "": [T: bold u] # 0xf28e - - "𝐼": [T: bold u] # 0x1d42e - - "": [T: bold v] # 0xf28f - - "𝐯": [T: bold v] # 0x1d42f - - "": [T: bold w] # 0xf290 - - "𝐰": [T: bold w] # 0x1d430 - - "": [T: bold x] # 0xf291 - - "đ±": [T: bold x] # 0x1d431 - - "": [T: bold y] # 0xf292 - - "đČ": [T: bold y] # 0x1d432 - - "": [T: bold z] # 0xf293 - - "𝐳": [T: bold z] # 0x1d433 - - "": # 0xf294 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "𝐮": # 0x1d434 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "": # 0xf295 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "đ”": # 0x1d435 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "": # 0xf296 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "đ¶": # 0x1d436 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "": # 0xf297 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "đ·": # 0x1d437 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "": # 0xf298 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "𝐾": # 0x1d438 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "": # 0xf299 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "đč": # 0x1d439 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "": # 0xf29a - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "đș": # 0x1d43a - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "": # 0xf29b - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "đ»": # 0x1d43b - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "": # 0xf29c - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "đŒ": # 0x1d43c - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "": # 0xf29d - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "đœ": # 0x1d43d - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "": # 0xf29e - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "đŸ": # 0x1d43e - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "": # 0xf29f - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "𝐿": # 0x1d43f - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "": # 0xf2a0 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "𝑀": # 0x1d440 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "ïŠĄ": # 0xf2a1 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "𝑁": # 0x1d441 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "ïŠą": # 0xf2a2 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "𝑂": # 0x1d442 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "ïŠŁ": # 0xf2a3 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "𝑃": # 0x1d443 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "": # 0xf2a4 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "𝑄": # 0x1d444 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "": # 0xf2a5 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "𝑅": # 0x1d445 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "": # 0xf2a6 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "𝑆": # 0x1d446 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "": # 0xf2a7 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "𝑇": # 0x1d447 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "": # 0xf2a8 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "𝑈": # 0x1d448 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "": # 0xf2a9 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "𝑉": # 0x1d449 - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "ïŠȘ": # 0xf2aa - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "𝑊": # 0x1d44a - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "": # 0xf2ab - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "𝑋": # 0x1d44b - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "ïŠŹ": # 0xf2ac - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "𝑌": # 0x1d44c - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "": # 0xf2ad - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "𝑍": # 0x1d44d - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "ïŠŻ": [T: b] # 0xf2af - - "𝑏": [T: b] # 0x1d44f - - "": [T: c] # 0xf2b0 - - "𝑐": [T: c] # 0x1d450 - - "": [T: d] # 0xf2b1 - - "𝑑": [T: d] # 0x1d451 - - "ïŠČ": [T: e] # 0xf2b2 - - "𝑒": [T: e] # 0x1d452 - - "ïŠł": [T: f] # 0xf2b3 - - "𝑓": [T: f] # 0x1d453 - - "": [T: g] # 0xf2b4 - - "𝑔": [T: g] # 0x1d454 - - "": [T: h] # 0xf2b5 - - "𝑕": [T: h] # 0x1d455 - - "": [T: i] # 0xf2b6 - - "𝑖": [T: i] # 0x1d456 - - "": [T: j] # 0xf2b7 - - "𝑗": [T: j] # 0x1d457 - - "": [T: k] # 0xf2b8 - - "𝑘": [T: k] # 0x1d458 - - "ïŠč": [T: l] # 0xf2b9 - - "𝑙": [T: l] # 0x1d459 - - "ïŠș": [T: m] # 0xf2ba - - "𝑚": [T: m] # 0x1d45a - - "": [T: n] # 0xf2bb - - "𝑛": [T: n] # 0x1d45b - - "": [T: o] # 0xf2bc - - "𝑜": [T: o] # 0x1d45c - - "": [T: p] # 0xf2bd - - "𝑝": [T: p] # 0x1d45d - - "": [T: q] # 0xf2be - - "𝑞": [T: q] # 0x1d45e - - "ïŠż": [T: r] # 0xf2bf - - "𝑟": [T: r] # 0x1d45f - - "": [T: s] # 0xf2c0 - - "𝑠": [T: s] # 0x1d460 - - "": [T: t] # 0xf2c1 - - "𝑡": [T: t] # 0x1d461 - - "": [T: u] # 0xf2c2 - - "𝑱": [T: u] # 0x1d462 - - "": [T: v] # 0xf2c3 - - "𝑣": [T: v] # 0x1d463 - - "": [T: w] # 0xf2c4 - - "đ‘€": [T: w] # 0x1d464 - - "": [T: x] # 0xf2c5 - - "đ‘„": [T: x] # 0x1d465 - - "": [T: y] # 0xf2c6 - - "𝑩": [T: y] # 0x1d466 - - "": [T: z] # 0xf2c7 - - "𝑧": [T: z] # 0x1d467 - - "": # 0xf2c8 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "𝑹": # 0x1d468 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "": # 0xf2c9 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "đ‘©": # 0x1d469 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "": # 0xf2ca - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "đ‘Ș": # 0x1d46a - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "": # 0xf2cb - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "đ‘«": # 0x1d46b - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "": # 0xf2cc - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "𝑬": # 0x1d46c - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "": # 0xf2cd - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "𝑭": # 0x1d46d - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "": # 0xf2ce - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "𝑼": # 0x1d46e - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "": # 0xf2cf - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "𝑯": # 0x1d46f - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "": # 0xf2d0 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "𝑰": # 0x1d470 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "": # 0xf2d1 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "đ‘±": # 0x1d471 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "": # 0xf2d2 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "đ‘Č": # 0x1d472 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "": # 0xf2d3 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "𝑳": # 0x1d473 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "": # 0xf2d4 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "𝑮": # 0x1d474 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "": # 0xf2d5 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "đ‘”": # 0x1d475 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "": # 0xf2d6 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "đ‘¶": # 0x1d476 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "": # 0xf2d7 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "đ‘·": # 0x1d477 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "": # 0xf2d8 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "𝑾": # 0x1d478 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "": # 0xf2d9 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "đ‘č": # 0x1d479 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "": # 0xf2da - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "đ‘ș": # 0x1d47a - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "": # 0xf2db - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "đ‘»": # 0x1d47b - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "": # 0xf2dc - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "đ‘Œ": # 0x1d47c - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "": # 0xf2dd - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "đ‘œ": # 0x1d47d - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "": # 0xf2de - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "đ‘Ÿ": # 0x1d47e - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "": # 0xf2df - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "𝑿": # 0x1d47f - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "": # 0xf2e0 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "𝒀": # 0x1d480 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "ï‹Ą": # 0xf2e1 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "𝒁": # 0x1d481 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "ï‹ą": [T: bold italic a] # 0xf2e2 - - "𝒂": [T: bold italic a] # 0x1d482 - - "ï‹Ł": [T: bold italic b] # 0xf2e3 - - "𝒃": [T: bold italic b] # 0x1d483 - - "ï‹€": [T: bold italic c] # 0xf2e4 - - "𝒄": [T: bold italic c] # 0x1d484 - - "ï‹„": [T: bold italic d] # 0xf2e5 - - "𝒅": [T: bold italic d] # 0x1d485 - - "": [T: bold italic e] # 0xf2e6 - - "𝒆": [T: bold italic e] # 0x1d486 - - "": [T: bold italic f] # 0xf2e7 - - "𝒇": [T: bold italic f] # 0x1d487 - - "": [T: bold italic g] # 0xf2e8 - - "𝒈": [T: bold italic g] # 0x1d488 - - "": [T: bold italic h] # 0xf2e9 - - "𝒉": [T: bold italic h] # 0x1d489 - - "ï‹Ș": [T: bold italic i] # 0xf2ea - - "𝒊": [T: bold italic i] # 0x1d48a - - "": [T: bold italic j] # 0xf2eb - - "𝒋": [T: bold italic j] # 0x1d48b - - "ï‹Ź": [T: bold italic k] # 0xf2ec - - "𝒌": [T: bold italic k] # 0x1d48c - - "": [T: bold italic l] # 0xf2ed - - "𝒍": [T: bold italic l] # 0x1d48d - - "ï‹ź": [T: bold italic m] # 0xf2ee - - "𝒎": [T: bold italic m] # 0x1d48e - - "ï‹Ż": [T: bold italic n] # 0xf2ef - - "𝒏": [T: bold italic n] # 0x1d48f - - "": [T: bold italic o] # 0xf2f0 - - "𝒐": [T: bold italic o] # 0x1d490 - - "": [T: bold italic p] # 0xf2f1 - - "𝒑": [T: bold italic p] # 0x1d491 - - "ï‹Č": [T: bold italic q] # 0xf2f2 - - "𝒒": [T: bold italic q] # 0x1d492 - - "ï‹ł": [T: bold italic r] # 0xf2f3 - - "𝒓": [T: bold italic r] # 0x1d493 - - "": [T: bold italic s] # 0xf2f4 - - "𝒔": [T: bold italic s] # 0x1d494 - - "ï‹”": [T: bold italic t] # 0xf2f5 - - "𝒕": [T: bold italic t] # 0x1d495 - - "": [T: bold italic u] # 0xf2f6 - - "𝒖": [T: bold italic u] # 0x1d496 - - "": [T: bold italic v] # 0xf2f7 - - "𝒗": [T: bold italic v] # 0x1d497 - - "": [T: bold italic w] # 0xf2f8 - - "𝒘": [T: bold italic w] # 0x1d498 - - "ï‹č": [T: bold italic x] # 0xf2f9 - - "𝒙": [T: bold italic x] # 0x1d499 - - "ï‹ș": [T: bold italic y] # 0xf2fa - - "𝒚": [T: bold italic y] # 0x1d49a - - "": [T: bold italic z] # 0xf2fb - - "𝒛": [T: bold italic z] # 0x1d49b - - "": # 0xf300 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "𝖠": # 0x1d5a0 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "": # 0xf301 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "𝖡": # 0x1d5a1 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "": # 0xf302 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "𝖱": # 0x1d5a2 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "": # 0xf303 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "𝖣": # 0x1d5a3 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "": # 0xf304 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "đ–€": # 0x1d5a4 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "": # 0xf305 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "đ–„": # 0x1d5a5 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "": # 0xf306 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "𝖩": # 0x1d5a6 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "": # 0xf307 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "𝖧": # 0x1d5a7 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "": # 0xf308 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "𝖹": # 0x1d5a8 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "": # 0xf309 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "đ–©": # 0x1d5a9 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "": # 0xf30a - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "đ–Ș": # 0x1d5aa - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "": # 0xf30b - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "đ–«": # 0x1d5ab - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "": # 0xf30c - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "𝖬": # 0x1d5ac - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "": # 0xf30d - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "𝖭": # 0x1d5ad - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "": # 0xf30e - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "𝖼": # 0x1d5ae - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "": # 0xf30f - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "𝖯": # 0x1d5af - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "": # 0xf310 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "𝖰": # 0x1d5b0 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "": # 0xf311 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "đ–±": # 0x1d5b1 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "": # 0xf312 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "đ–Č": # 0x1d5b2 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "": # 0xf313 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "𝖳": # 0x1d5b3 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "": # 0xf314 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "𝖮": # 0x1d5b4 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "": # 0xf315 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "đ–”": # 0x1d5b5 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "": # 0xf316 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "đ–¶": # 0x1d5b6 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "": # 0xf317 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "đ–·": # 0x1d5b7 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "": # 0xf318 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "𝖾": # 0x1d5b8 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "": # 0xf319 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "đ–č": # 0x1d5b9 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "": [T: a] # 0xf31a - - "đ–ș": [T: a] # 0x1d5ba - - "": [T: b] # 0xf31b - - "đ–»": [T: b] # 0x1d5bb - - "": [T: c] # 0xf31c - - "đ–Œ": [T: c] # 0x1d5bc - - "": [T: d] # 0xf31d - - "đ–œ": [T: d] # 0x1d5bd - - "": [T: e] # 0xf31e - - "đ–Ÿ": [T: e] # 0x1d5be - - "": [T: f] # 0xf31f - - "𝖿": [T: f] # 0x1d5bf - - "": [T: g] # 0xf320 - - "𝗀": [T: g] # 0x1d5c0 - - "ïŒĄ": [T: h] # 0xf321 - - "𝗁": [T: h] # 0x1d5c1 - - "ïŒą": [T: i] # 0xf322 - - "𝗂": [T: i] # 0x1d5c2 - - "ïŒŁ": [T: j] # 0xf323 - - "𝗃": [T: j] # 0x1d5c3 - - "": [T: k] # 0xf324 - - "𝗄": [T: k] # 0x1d5c4 - - "": [T: l] # 0xf325 - - "𝗅": [T: l] # 0x1d5c5 - - "": [T: m] # 0xf326 - - "𝗆": [T: m] # 0x1d5c6 - - "": [T: n] # 0xf327 - - "𝗇": [T: n] # 0x1d5c7 - - "": [T: o] # 0xf328 - - "𝗈": [T: o] # 0x1d5c8 - - "": [T: p] # 0xf329 - - "𝗉": [T: p] # 0x1d5c9 - - "ïŒȘ": [T: q] # 0xf32a - - "𝗊": [T: q] # 0x1d5ca - - "": [T: r] # 0xf32b - - "𝗋": [T: r] # 0x1d5cb - - "ïŒŹ": [T: s] # 0xf32c - - "𝗌": [T: s] # 0x1d5cc - - "": [T: t] # 0xf32d - - "𝗍": [T: t] # 0x1d5cd - - "ïŒź": [T: u] # 0xf32e - - "𝗎": [T: u] # 0x1d5ce - - "ïŒŻ": [T: v] # 0xf32f - - "𝗏": [T: v] # 0x1d5cf - - "": [T: w] # 0xf330 - - "𝗐": [T: w] # 0x1d5d0 - - "": [T: x] # 0xf331 - - "𝗑": [T: x] # 0x1d5d1 - - "ïŒČ": [T: y] # 0xf332 - - "𝗒": [T: y] # 0x1d5d2 - - "ïŒł": [T: z] # 0xf333 - - "𝗓": [T: z] # 0x1d5d3 - - "": # 0xf334 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "𝗔": # 0x1d5d4 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "": # 0xf335 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "𝗕": # 0x1d5d5 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "": # 0xf336 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "𝗖": # 0x1d5d6 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "": # 0xf337 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "𝗗": # 0x1d5d7 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "": # 0xf338 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "𝗘": # 0x1d5d8 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "ïŒč": # 0xf339 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "𝗙": # 0x1d5d9 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "ïŒș": # 0xf33a - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "𝗚": # 0x1d5da - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "": # 0xf33b - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "𝗛": # 0x1d5db - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "": # 0xf33c - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "𝗜": # 0x1d5dc - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "": # 0xf33d - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "𝗝": # 0x1d5dd - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "": # 0xf33e - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "𝗞": # 0x1d5de - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "ïŒż": # 0xf33f - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "𝗟": # 0x1d5df - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "": # 0xf340 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "𝗠": # 0x1d5e0 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "": # 0xf341 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "𝗡": # 0x1d5e1 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "": # 0xf342 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "𝗱": # 0x1d5e2 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "": # 0xf343 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "𝗣": # 0x1d5e3 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "": # 0xf344 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "đ—€": # 0x1d5e4 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "": # 0xf345 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "đ—„": # 0x1d5e5 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "": # 0xf346 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "𝗩": # 0x1d5e6 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "": # 0xf347 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "𝗧": # 0x1d5e7 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "": # 0xf348 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "𝗹": # 0x1d5e8 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "": # 0xf349 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "đ—©": # 0x1d5e9 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "": # 0xf34a - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "đ—Ș": # 0x1d5ea - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "": # 0xf34b - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "đ—«": # 0x1d5eb - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "": # 0xf34c - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "𝗬": # 0x1d5ec - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "": # 0xf34d - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "𝗭": # 0x1d5ed - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "": [T: bold a] # 0xf34e - - "𝗼": [T: bold a] # 0x1d5ee - - "": [T: bold b] # 0xf34f - - "𝗯": [T: bold b] # 0x1d5ef - - "": [T: bold c] # 0xf350 - - "𝗰": [T: bold c] # 0x1d5f0 - - "": [T: bold d] # 0xf351 - - "đ—±": [T: bold d] # 0x1d5f1 - - "": [T: bold e] # 0xf352 - - "đ—Č": [T: bold e] # 0x1d5f2 - - "": [T: bold f] # 0xf353 - - "𝗳": [T: bold f] # 0x1d5f3 - - "": [T: bold g] # 0xf354 - - "𝗮": [T: bold g] # 0x1d5f4 - - "": [T: bold h] # 0xf355 - - "đ—”": [T: bold h] # 0x1d5f5 - - "": [T: bold i] # 0xf356 - - "đ—¶": [T: bold i] # 0x1d5f6 - - "": [T: bold j] # 0xf357 - - "đ—·": [T: bold j] # 0x1d5f7 - - "": [T: bold k] # 0xf358 - - "𝗾": [T: bold k] # 0x1d5f8 - - "": [T: bold l] # 0xf359 - - "đ—č": [T: bold l] # 0x1d5f9 - - "": [T: bold m] # 0xf35a - - "đ—ș": [T: bold m] # 0x1d5fa - - "": [T: bold n] # 0xf35b - - "đ—»": [T: bold n] # 0x1d5fb - - "": [T: bold o] # 0xf35c - - "đ—Œ": [T: bold o] # 0x1d5fc - - "": [T: bold p] # 0xf35d - - "đ—œ": [T: bold p] # 0x1d5fd - - "": [T: bold q] # 0xf35e - - "đ—Ÿ": [T: bold q] # 0x1d5fe - - "": [T: bold r] # 0xf35f - - "𝗿": [T: bold r] # 0x1d5ff - - "": [T: bold s] # 0xf360 - - "𝘀": [T: bold s] # 0x1d600 - - "ïĄ": [T: bold t] # 0xf361 - - "𝘁": [T: bold t] # 0x1d601 - - "ïą": [T: bold u] # 0xf362 - - "𝘂": [T: bold u] # 0x1d602 - - "ïŁ": [T: bold v] # 0xf363 - - "𝘃": [T: bold v] # 0x1d603 - - "": [T: bold w] # 0xf364 - - "𝘄": [T: bold w] # 0x1d604 - - "": [T: bold x] # 0xf365 - - "𝘅": [T: bold x] # 0x1d605 - - "": [T: bold y] # 0xf366 - - "𝘆": [T: bold y] # 0x1d606 - - "": [T: bold z] # 0xf367 - - "𝘇": [T: bold z] # 0x1d607 - - "": # 0xf368 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "𝘈": # 0x1d608 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "": # 0xf369 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "𝘉": # 0x1d609 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "ïȘ": # 0xf36a - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "𝘊": # 0x1d60a - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "": # 0xf36b - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "𝘋": # 0x1d60b - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "ïŹ": # 0xf36c - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "𝘌": # 0x1d60c - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "": # 0xf36d - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "𝘍": # 0x1d60d - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "ïź": # 0xf36e - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "𝘎": # 0x1d60e - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "ïŻ": # 0xf36f - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "𝘏": # 0x1d60f - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "": # 0xf370 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "𝘐": # 0x1d610 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "": # 0xf371 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "𝘑": # 0x1d611 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "ïČ": # 0xf372 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "𝘒": # 0x1d612 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "ïł": # 0xf373 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "𝘓": # 0x1d613 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "": # 0xf374 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "𝘔": # 0x1d614 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "": # 0xf375 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "𝘕": # 0x1d615 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "": # 0xf376 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "𝘖": # 0x1d616 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "": # 0xf377 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "𝘗": # 0x1d617 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "": # 0xf378 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "𝘘": # 0x1d618 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "ïč": # 0xf379 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "𝘙": # 0x1d619 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "ïș": # 0xf37a - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "𝘚": # 0x1d61a - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "": # 0xf37b - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "𝘛": # 0x1d61b - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "": # 0xf37c - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "𝘜": # 0x1d61c - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "": # 0xf37d - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "𝘝": # 0x1d61d - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "": # 0xf37e - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "𝘞": # 0x1d61e - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "ïż": # 0xf37f - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "𝘟": # 0x1d61f - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "": # 0xf380 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "𝘠": # 0x1d620 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "": # 0xf381 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "𝘡": # 0x1d621 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "": [T: italic a] # 0xf382 - - "𝘱": [T: italic a] # 0x1d622 - - "": [T: italic b] # 0xf383 - - "𝘣": [T: italic b] # 0x1d623 - - "": [T: italic c] # 0xf384 - - "đ˜€": [T: italic c] # 0x1d624 - - "": [T: italic d] # 0xf385 - - "đ˜„": [T: italic d] # 0x1d625 - - "": [T: italic e] # 0xf386 - - "𝘩": [T: italic e] # 0x1d626 - - "": [T: italic f] # 0xf387 - - "𝘧": [T: italic f] # 0x1d627 - - "": [T: italic g] # 0xf388 - - "𝘹": [T: italic g] # 0x1d628 - - "": [T: italic h] # 0xf389 - - "đ˜©": [T: italic h] # 0x1d629 - - "": [T: italic i] # 0xf38a - - "đ˜Ș": [T: italic i] # 0x1d62a - - "": [T: italic j] # 0xf38b - - "đ˜«": [T: italic j] # 0x1d62b - - "": [T: italic k] # 0xf38c - - "𝘬": [T: italic k] # 0x1d62c - - "": [T: italic l] # 0xf38d - - "𝘭": [T: italic l] # 0x1d62d - - "": [T: italic m] # 0xf38e - - "𝘼": [T: italic m] # 0x1d62e - - "": [T: italic n] # 0xf38f - - "𝘯": [T: italic n] # 0x1d62f - - "": [T: italic o] # 0xf390 - - "𝘰": [T: italic o] # 0x1d630 - - "": [T: italic p] # 0xf391 - - "đ˜±": [T: italic p] # 0x1d631 - - "": [T: italic q] # 0xf392 - - "đ˜Č": [T: italic q] # 0x1d632 - - "": [T: italic r] # 0xf393 - - "𝘳": [T: italic r] # 0x1d633 - - "": [T: italic s] # 0xf394 - - "𝘮": [T: italic s] # 0x1d634 - - "": [T: italic t] # 0xf395 - - "đ˜”": [T: italic t] # 0x1d635 - - "": [T: italic u] # 0xf396 - - "đ˜¶": [T: italic u] # 0x1d636 - - "": [T: italic v] # 0xf397 - - "đ˜·": [T: italic v] # 0x1d637 - - "": [T: italic w] # 0xf398 - - "𝘾": [T: italic w] # 0x1d638 - - "": [T: italic x] # 0xf399 - - "đ˜č": [T: italic x] # 0x1d639 - - "": [T: italic y] # 0xf39a - - "đ˜ș": [T: italic y] # 0x1d63a - - "": [T: italic z] # 0xf39b - - "đ˜»": [T: italic z] # 0x1d63b - - "": # 0xf39c - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "đ˜Œ": # 0x1d63c - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "": # 0xf39d - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "đ˜œ": # 0x1d63d - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "": # 0xf39e - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "đ˜Ÿ": # 0x1d63e - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "": # 0xf39f - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "𝘿": # 0x1d63f - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "": # 0xf3a0 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "𝙀": # 0x1d640 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "ïŽĄ": # 0xf3a1 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "𝙁": # 0x1d641 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "ïŽą": # 0xf3a2 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "𝙂": # 0x1d642 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "ïŽŁ": # 0xf3a3 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "𝙃": # 0x1d643 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "": # 0xf3a4 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "𝙄": # 0x1d644 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "": # 0xf3a5 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "𝙅": # 0x1d645 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "": # 0xf3a6 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "𝙆": # 0x1d646 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "": # 0xf3a7 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "𝙇": # 0x1d647 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "": # 0xf3a8 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "𝙈": # 0x1d648 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "": # 0xf3a9 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "𝙉": # 0x1d649 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "ïŽȘ": # 0xf3aa - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "𝙊": # 0x1d64a - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "": # 0xf3ab - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "𝙋": # 0x1d64b - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "ïŽŹ": # 0xf3ac - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "𝙌": # 0x1d64c - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "": # 0xf3ad - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "𝙍": # 0x1d64d - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "ïŽź": # 0xf3ae - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "𝙎": # 0x1d64e - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "ïŽŻ": # 0xf3af - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "𝙏": # 0x1d64f - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "": # 0xf3b0 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "𝙐": # 0x1d650 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "": # 0xf3b1 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "𝙑": # 0x1d651 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "ïŽČ": # 0xf3b2 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "𝙒": # 0x1d652 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "ïŽł": # 0xf3b3 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "𝙓": # 0x1d653 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "": # 0xf3b4 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "𝙔": # 0x1d654 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "": # 0xf3b5 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "𝙕": # 0x1d655 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "": [T: bold italic a] # 0xf3b6 - - "𝙖": [T: bold italic a] # 0x1d656 - - "": [T: bold italic b] # 0xf3b7 - - "𝙗": [T: bold italic b] # 0x1d657 - - "": [T: bold italic c] # 0xf3b8 - - "𝙘": [T: bold italic c] # 0x1d658 - - "ïŽč": [T: bold italic d] # 0xf3b9 - - "𝙙": [T: bold italic d] # 0x1d659 - - "ïŽș": [T: bold italic e] # 0xf3ba - - "𝙚": [T: bold italic e] # 0x1d65a - - "": [T: bold italic f] # 0xf3bb - - "𝙛": [T: bold italic f] # 0x1d65b - - "": [T: bold italic g] # 0xf3bc - - "𝙜": [T: bold italic g] # 0x1d65c - - "": [T: bold italic h] # 0xf3bd - - "𝙝": [T: bold italic h] # 0x1d65d - - "": [T: bold italic i] # 0xf3be - - "𝙞": [T: bold italic i] # 0x1d65e - - "ïŽż": [T: bold italic j] # 0xf3bf - - "𝙟": [T: bold italic j] # 0x1d65f - - "": [T: bold italic k] # 0xf3c0 - - "𝙠": [T: bold italic k] # 0x1d660 - - "": [T: bold italic l] # 0xf3c1 - - "𝙡": [T: bold italic l] # 0x1d661 - - "": [T: bold italic m] # 0xf3c2 - - "𝙱": [T: bold italic m] # 0x1d662 - - "": [T: bold italic n] # 0xf3c3 - - "𝙣": [T: bold italic n] # 0x1d663 - - "": [T: bold italic o] # 0xf3c4 - - "đ™€": [T: bold italic o] # 0x1d664 - - "": [T: bold italic p] # 0xf3c5 - - "đ™„": [T: bold italic p] # 0x1d665 - - "": [T: bold italic q] # 0xf3c6 - - "𝙩": [T: bold italic q] # 0x1d666 - - "": [T: bold italic r] # 0xf3c7 - - "𝙧": [T: bold italic r] # 0x1d667 - - "": [T: bold italic s] # 0xf3c8 - - "𝙹": [T: bold italic s] # 0x1d668 - - "": [T: bold italic t] # 0xf3c9 - - "đ™©": [T: bold italic t] # 0x1d669 - - "": [T: bold italic u] # 0xf3ca - - "đ™Ș": [T: bold italic u] # 0x1d66a - - "": [T: bold italic v] # 0xf3cb - - "đ™«": [T: bold italic v] # 0x1d66b - - "": [T: bold italic w] # 0xf3cc - - "𝙬": [T: bold italic w] # 0x1d66c - - "": [T: bold italic x] # 0xf3cd - - "𝙭": [T: bold italic x] # 0x1d66d - - "": [T: bold italic y] # 0xf3ce - - "𝙼": [T: bold italic y] # 0x1d66e - - "": [T: bold italic z] # 0xf3cf - - "𝙯": [T: bold italic z] # 0x1d66f - - "": # 0xf3d0 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "𝙰": # 0x1d670 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: a - - "": # 0xf3d1 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "đ™±": # 0x1d671 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: b - - "": # 0xf3d2 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "đ™Č": # 0x1d672 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: c - - "": # 0xf3d3 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "𝙳": # 0x1d673 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: d - - "": # 0xf3d4 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "𝙮": # 0x1d674 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: e - - "": # 0xf3d5 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "đ™”": # 0x1d675 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: f - - "": # 0xf3d6 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "đ™¶": # 0x1d676 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: g - - "": # 0xf3d7 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "đ™·": # 0x1d677 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: h - - "": # 0xf3d8 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "𝙾": # 0x1d678 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: i - - "": # 0xf3d9 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "đ™č": # 0x1d679 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: j - - "": # 0xf3da - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "đ™ș": # 0x1d67a - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: k - - "": # 0xf3db - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "đ™»": # 0x1d67b - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: l - - "": # 0xf3dc - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "đ™Œ": # 0x1d67c - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: m - - "": # 0xf3dd - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "đ™œ": # 0x1d67d - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: n - - "": # 0xf3de - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "đ™Ÿ": # 0x1d67e - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: o - - "": # 0xf3df - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "𝙿": # 0x1d67f - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: p - - "": # 0xf3e0 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "𝚀": # 0x1d680 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: q - - "ïĄ": # 0xf3e1 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "𝚁": # 0x1d681 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: r - - "ïą": # 0xf3e2 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "𝚂": # 0x1d682 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: s - - "ïŁ": # 0xf3e3 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "𝚃": # 0x1d683 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: t - - "": # 0xf3e4 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "𝚄": # 0x1d684 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: u - - "": # 0xf3e5 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "𝚅": # 0x1d685 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: v - - "": # 0xf3e6 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "𝚆": # 0x1d686 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: w - - "": # 0xf3e7 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "𝚇": # 0x1d687 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: x - - "": # 0xf3e8 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "𝚈": # 0x1d688 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: y - - "": # 0xf3e9 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "𝚉": # 0x1d689 - - T: "" - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: z - - "ïȘ": [T: a] # 0xf3ea - - "𝚊": [T: a] # 0x1d68a - - "": [T: b] # 0xf3eb - - "𝚋": [T: b] # 0x1d68b - - "ïŹ": [T: c] # 0xf3ec - - "𝚌": [T: c] # 0x1d68c - - "": [T: d] # 0xf3ed - - "𝚍": [T: d] # 0x1d68d - - "ïź": [T: e] # 0xf3ee - - "𝚎": [T: e] # 0x1d68e - - "ïŻ": [T: f] # 0xf3ef - - "𝚏": [T: f] # 0x1d68f - - "": [T: g] # 0xf3f0 - - "𝚐": [T: g] # 0x1d690 - - "": [T: h] # 0xf3f1 - - "𝚑": [T: h] # 0x1d691 - - "ïČ": [T: i] # 0xf3f2 - - "𝚒": [T: i] # 0x1d692 - - "ïł": [T: j] # 0xf3f3 - - "𝚓": [T: j] # 0x1d693 - - "": [T: k] # 0xf3f4 - - "𝚔": [T: k] # 0x1d694 - - "": [T: l] # 0xf3f5 - - "𝚕": [T: l] # 0x1d695 - - "": [T: m] # 0xf3f6 - - "𝚖": [T: m] # 0x1d696 - - "": [T: n] # 0xf3f7 - - "𝚗": [T: n] # 0x1d697 - - "": [T: o] # 0xf3f8 - - "𝚘": [T: o] # 0x1d698 - - "ïč": [T: p] # 0xf3f9 - - "𝚙": [T: p] # 0x1d699 - - "ïș": [T: q] # 0xf3fa - - "𝚚": [T: q] # 0x1d69a - - "": [T: r] # 0xf3fb - - "𝚛": [T: r] # 0x1d69b - - "": [T: s] # 0xf3fc - - "𝚜": [T: s] # 0x1d69c - - "": [T: t] # 0xf3fd - - "𝚝": [T: t] # 0x1d69d - - "": [T: u] # 0xf3fe - - "𝚞": [T: u] # 0x1d69e - - "ïż": [T: v] # 0xf3ff - - "𝚟": [T: v] # 0x1d69f - - "": [T: w] # 0xf400 - - "𝚠": [T: w] # 0x1d6a0 - - "": [T: x] # 0xf401 - - "𝚡": [T: x] # 0x1d6a1 - - "": [T: y] # 0xf402 - - "𝚱": [T: y] # 0x1d6a2 - - "": [T: z] # 0xf403 - - "𝚣": [T: z] # 0x1d6a3 - - "": [T: i tanpa titik] # 0xf404 - - "đš€": [T: i tanpa titik] # 0x1d6a4 - - "đš„": [T: j tanpa titik] # 0x1d6a5 - - "": # 0xf408 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: alpha - - "𝚹": # 0x1d6a8 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: alpha - - "": # 0xf409 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: beta - - "đš©": # 0x1d6a9 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: beta - - "": # 0xf40a - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: gamma - - "đšȘ": # 0x1d6aa - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: gamma - - "": # 0xf40b - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: delta - - "đš«": # 0x1d6ab - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: delta - - "": # 0xf40c - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: epsilon - - "𝚬": # 0x1d6ac - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: epsilon - - "": # 0xf40d - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: zeta - - "𝚭": # 0x1d6ad - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: zeta - - "": # 0xf40e - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: eta - - "𝚼": # 0x1d6ae - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: eta - - "": # 0xf40f - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "𝚯": # 0x1d6af - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "": # 0xf410 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: iota - - "𝚰": # 0x1d6b0 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: iota - - "": # 0xf411 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: kappa - - "đš±": # 0x1d6b1 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: kappa - - "": # 0xf412 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: lamda - - "đšČ": # 0x1d6b2 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: lamda - - "": # 0xf413 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: mu - - "𝚳": # 0x1d6b3 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: mu - - "": # 0xf414 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: nu - - "𝚮": # 0x1d6b4 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: nu - - "": # 0xf415 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: xi - - "đš”": # 0x1d6b5 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: xi - - "": # 0xf416 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omicron - - "đš¶": # 0x1d6b6 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omicron - - "": # 0xf417 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: pi - - "đš·": # 0x1d6b7 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: pi - - "": # 0xf418 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: rho - - "𝚾": # 0x1d6b8 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: rho - - "": # 0xf419 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "đšč": # 0x1d6b9 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "": # 0xf41a - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: sigma - - "đšș": # 0x1d6ba - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: sigma - - "": # 0xf41b - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: tau - - "đš»": # 0x1d6bb - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: tau - - "": # 0xf41c - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: upsilon - - "đšŒ": # 0x1d6bc - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: upsilon - - "": # 0xf41d - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: phi - - "đšœ": # 0x1d6bd - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: phi - - "": # 0xf41e - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: chi - - "đšŸ": # 0x1d6be - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: chi - - "": # 0xf41f - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: psi - - "𝚿": # 0x1d6bf - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: psi - - "": # 0xf420 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omega - - "𝛀": # 0x1d6c0 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omega - - "ïĄ": [T: bold nabla] # 0xf421 - - "𝛁": [T: bold nabla] # 0x1d6c1 - - "ïą": [T: bold alpha] # 0xf422 - - "𝛂": [T: bold alpha] # 0x1d6c2 - - "ïŁ": [T: bold beta] # 0xf423 - - "𝛃": [T: bold beta] # 0x1d6c3 - - "": [T: bold gamma] # 0xf424 - - "𝛄": [T: bold gamma] # 0x1d6c4 - - "": [T: bold delta] # 0xf425 - - "𝛅": [T: bold delta] # 0x1d6c5 - - "": [T: bold epsilon] # 0xf426 - - "𝛆": [T: bold epsilon] # 0x1d6c6 - - "": [T: bold zeta] # 0xf427 - - "𝛇": [T: bold zeta] # 0x1d6c7 - - "": [T: bold eta] # 0xf428 - - "𝛈": [T: bold eta] # 0x1d6c8 - - "": [T: bold theta] # 0xf429 - - "𝛉": [T: bold theta] # 0x1d6c9 - - "ïȘ": [T: bold iota] # 0xf42a - - "𝛊": [T: bold iota] # 0x1d6ca - - "": [T: bold kappa] # 0xf42b - - "𝛋": [T: bold kappa] # 0x1d6cb - - "ïŹ": [T: bold lamda] # 0xf42c - - "𝛌": [T: bold lamda] # 0x1d6cc - - "": [T: bold mu] # 0xf42d - - "𝛍": [T: bold mu] # 0x1d6cd - - "ïź": [T: bold nu] # 0xf42e - - "𝛎": [T: bold nu] # 0x1d6ce - - "ïŻ": [T: bold xi] # 0xf42f - - "𝛏": [T: bold xi] # 0x1d6cf - - "": [T: bold omicron] # 0xf430 - - "𝛐": [T: bold omicron] # 0x1d6d0 - - "": [T: bold pi] # 0xf431 - - "𝛑": [T: bold pi] # 0x1d6d1 - - "ïČ": [T: bold rho] # 0xf432 - - "𝛒": [T: bold rho] # 0x1d6d2 - - "ïł": [T: bold final sigma] # 0xf433 - - "𝛓": [T: bold final sigma] # 0x1d6d3 - - "": [T: bold sigma] # 0xf434 - - "𝛔": [T: bold sigma] # 0x1d6d4 - - "": [T: bold tau] # 0xf435 - - "𝛕": [T: bold tau] # 0x1d6d5 - - "": [T: bold upsilon] # 0xf436 - - "𝛖": [T: bold upsilon] # 0x1d6d6 - - "": [T: bold phi] # 0xf437 - - "𝛗": [T: bold phi] # 0x1d6d7 - - "": [T: bold chi] # 0xf438 - - "𝛘": [T: bold chi] # 0x1d6d8 - - "ïč": [T: bold psi] # 0xf439 - - "𝛙": [T: bold psi] # 0x1d6d9 - - "ïș": [T: bold omega] # 0xf43a - - "𝛚": [T: bold omega] # 0x1d6da - - "": [T: bold diferensial parsial] # 0xf43b - - "𝛛": [T: bold diferensial parsial] # 0x1d6db - - "": [T: bold epsilon] # 0xf43c - - "𝛜": [T: bold epsilon] # 0x1d6dc - - "": [T: bold theta] # 0xf43d - - "𝛝": [T: bold theta] # 0x1d6dd - - "": [T: bold kappa] # 0xf43e - - "𝛞": [T: bold kappa] # 0x1d6de - - "ïż": [T: bold phi] # 0xf43f - - "𝛟": [T: bold phi] # 0x1d6df - - "": [T: bold rho] # 0xf440 - - "𝛠": [T: bold rho] # 0x1d6e0 - - "": [T: bold pi] # 0xf441 - - "𝛡": [T: bold pi] # 0x1d6e1 - - "": # 0xf442 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: alpha - - "𝛱": # 0x1d6e2 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: alpha - - "": # 0xf443 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: beta - - "𝛣": # 0x1d6e3 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: beta - - "": # 0xf444 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: gamma - - "đ›€": # 0x1d6e4 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: gamma - - "": # 0xf445 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: delta - - "đ›„": # 0x1d6e5 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: delta - - "": # 0xf446 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: epsilon - - "𝛩": # 0x1d6e6 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: epsilon - - "": # 0xf447 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: zeta - - "𝛧": # 0x1d6e7 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: zeta - - "": # 0xf448 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: eta - - "𝛹": # 0x1d6e8 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: eta - - "": # 0xf449 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "đ›©": # 0x1d6e9 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "": # 0xf44a - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: iota - - "đ›Ș": # 0x1d6ea - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: iota - - "": # 0xf44b - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: kappa - - "đ›«": # 0x1d6eb - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: kappa - - "": # 0xf44c - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: lamda - - "𝛬": # 0x1d6ec - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: lamda - - "": # 0xf44d - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: mu - - "𝛭": # 0x1d6ed - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: mu - - "": # 0xf44e - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: nu - - "𝛼": # 0x1d6ee - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: nu - - "": # 0xf44f - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: xi - - "𝛯": # 0x1d6ef - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: xi - - "": # 0xf450 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omicron - - "𝛰": # 0x1d6f0 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omicron - - "": # 0xf451 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: pi - - "đ›±": # 0x1d6f1 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: pi - - "": # 0xf452 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: rho - - "đ›Č": # 0x1d6f2 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: rho - - "": # 0xf453 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "𝛳": # 0x1d6f3 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "": # 0xf454 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: sigma - - "𝛮": # 0x1d6f4 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: sigma - - "": # 0xf455 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: tau - - "đ›”": # 0x1d6f5 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: tau - - "": # 0xf456 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: upsilon - - "đ›¶": # 0x1d6f6 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: upsilon - - "": # 0xf457 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: phi - - "đ›·": # 0x1d6f7 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: phi - - "": # 0xf458 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: chi - - "𝛾": # 0x1d6f8 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: chi - - "": # 0xf459 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: psi - - "đ›č": # 0x1d6f9 - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: psi - - "": # 0xf45a - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omega - - "đ›ș": # 0x1d6fa - - T: italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omega - - "": [T: bold nabla] # 0xf45b - - "đ›»": [T: bold nabla] # 0x1d6fb - - "": [T: italic alpha] # 0xf45c - - "đ›Œ": [T: italic alpha] # 0x1d6fc - - "": [T: italic beta] # 0xf45d - - "đ›œ": [T: italic beta] # 0x1d6fd - - "": [T: italic gamma] # 0xf45e - - "đ›Ÿ": [T: italic gamma] # 0x1d6fe - - "": [T: italic delta] # 0xf45f - - "𝛿": [T: italic delta] # 0x1d6ff - - "": [T: italic epsilon] # 0xf460 - - "𝜀": [T: italic epsilon] # 0x1d700 - - "ï‘Ą": [T: italic zeta] # 0xf461 - - "𝜁": [T: italic zeta] # 0x1d701 - - "ï‘ą": [T: italic eta] # 0xf462 - - "𝜂": [T: italic eta] # 0x1d702 - - "ï‘Ł": [T: italic theta] # 0xf463 - - "𝜃": [T: italic theta] # 0x1d703 - - "ï‘€": [T: italic iota] # 0xf464 - - "𝜄": [T: italic iota] # 0x1d704 - - "ï‘„": [T: italic kappa] # 0xf465 - - "𝜅": [T: italic kappa] # 0x1d705 - - "": [T: italic lamda] # 0xf466 - - "𝜆": [T: italic lamda] # 0x1d706 - - "": [T: italic mu] # 0xf467 - - "𝜇": [T: italic mu] # 0x1d707 - - "": [T: italic nu] # 0xf468 - - "𝜈": [T: italic nu] # 0x1d708 - - "": [T: italic xi] # 0xf469 - - "𝜉": [T: italic xi] # 0x1d709 - - "ï‘Ș": [T: italic omicron] # 0xf46a - - "𝜊": [T: italic omicron] # 0x1d70a - - "": [T: italic pi] # 0xf46b - - "𝜋": [T: italic pi] # 0x1d70b - - "ï‘Ź": [T: italic rho] # 0xf46c - - "𝜌": [T: italic rho] # 0x1d70c - - "": [T: italic final sigma] # 0xf46d - - "𝜍": [T: italic final sigma] # 0x1d70d - - "ï‘ź": [T: italic sigma] # 0xf46e - - "𝜎": [T: italic sigma] # 0x1d70e - - "ï‘Ż": [T: italic tau] # 0xf46f - - "𝜏": [T: italic tau] # 0x1d70f - - "": [T: italic upsilon] # 0xf470 - - "𝜐": [T: italic upsilon] # 0x1d710 - - "": [T: italic phi] # 0xf471 - - "𝜑": [T: italic phi] # 0x1d711 - - "ï‘Č": [T: italic chi] # 0xf472 - - "𝜒": [T: italic chi] # 0x1d712 - - "ï‘ł": [T: italic psi] # 0xf473 - - "𝜓": [T: italic psi] # 0x1d713 - - "": [T: italic omega] # 0xf474 - - "𝜔": [T: italic omega] # 0x1d714 - - "ï‘”": [T: bold diferensial parsial] # 0xf475 - - "𝜕": [T: bold diferensial parsial] # 0x1d715 - - "": [T: italic epsilon] # 0xf476 - - "𝜖": [T: italic epsilon] # 0x1d716 - - "": [T: italic theta] # 0xf477 - - "𝜗": [T: italic theta] # 0x1d717 - - "": [T: italic kappa] # 0xf478 - - "𝜘": [T: italic kappa] # 0x1d718 - - "ï‘č": [T: italic phi] # 0xf479 - - "𝜙": [T: italic phi] # 0x1d719 - - "ï‘ș": [T: italic rho] # 0xf47a - - "𝜚": [T: italic rho] # 0x1d71a - - "": [T: italic pi] # 0xf47b - - "𝜛": [T: italic pi] # 0x1d71b - - "": # 0xf47c - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: alpha - - "𝜜": # 0x1d71c - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: alpha - - "": # 0xf47d - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: beta - - "𝜝": # 0x1d71d - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: beta - - "": # 0xf47e - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: gamma - - "𝜞": # 0x1d71e - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: gamma - - "ï‘ż": # 0xf47f - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: delta - - "𝜟": # 0x1d71f - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: delta - - "": # 0xf480 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: epsilon - - "𝜠": # 0x1d720 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: epsilon - - "": # 0xf481 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: zeta - - "𝜡": # 0x1d721 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: zeta - - "": # 0xf482 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: eta - - "𝜱": # 0x1d722 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: eta - - "": # 0xf483 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "𝜣": # 0x1d723 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "": # 0xf484 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: iota - - "đœ€": # 0x1d724 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: iota - - "": # 0xf485 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: kappa - - "đœ„": # 0x1d725 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: kappa - - "": # 0xf486 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: lamda - - "𝜩": # 0x1d726 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: lamda - - "": # 0xf487 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: mu - - "𝜧": # 0x1d727 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: mu - - "": # 0xf488 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: nu - - "𝜹": # 0x1d728 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: nu - - "": # 0xf489 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: xi - - "đœ©": # 0x1d729 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: xi - - "": # 0xf48a - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omicron - - "đœȘ": # 0x1d72a - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omicron - - "": # 0xf48b - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: pi - - "đœ«": # 0x1d72b - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: pi - - "": # 0xf48c - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: rho - - "𝜬": # 0x1d72c - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: rho - - "": # 0xf48d - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "𝜭": # 0x1d72d - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "": # 0xf48e - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: sigma - - "𝜼": # 0x1d72e - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: sigma - - "": # 0xf48f - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: tau - - "𝜯": # 0x1d72f - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: tau - - "": # 0xf490 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: upsilon - - "𝜰": # 0x1d730 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: upsilon - - "": # 0xf491 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: phi - - "đœ±": # 0x1d731 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: phi - - "": # 0xf492 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: chi - - "đœČ": # 0x1d732 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: chi - - "": # 0xf493 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: psi - - "𝜳": # 0x1d733 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: psi - - "": # 0xf494 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omega - - "𝜮": # 0x1d734 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omega - - "": [T: bold nabla] # 0xf495 - - "đœ”": [T: bold nabla] # 0x1d735 - - "": [T: bold italic nabla] # 0xf495 - - "đœ¶": [T: bold italic alpha] # 0x1d736 - - "": [T: bold italic beta] # 0xf497 - - "đœ·": [T: bold italic beta] # 0x1d737 - - "": [T: bold italic gamma] # 0xf498 - - "𝜾": [T: bold italic gamma] # 0x1d738 - - "": [T: bold italic delta] # 0xf499 - - "đœč": [T: bold italic delta] # 0x1d739 - - "": [T: bold italic epsilon] # 0xf49a - - "đœș": [T: bold italic epsilon] # 0x1d73a - - "": [T: bold italic zeta] # 0xf49b - - "đœ»": [T: bold italic zeta] # 0x1d73b - - "": [T: bold italic eta] # 0xf49c - - "đœŒ": [T: bold italic eta] # 0x1d73c - - "": [T: bold italic theta] # 0xf49d - - "đœœ": [T: bold italic theta] # 0x1d73d - - "": [T: bold italic iota] # 0xf49e - - "đœŸ": [T: bold italic iota] # 0x1d73e - - "": [T: bold italic kappa] # 0xf49f - - "𝜿": [T: bold italic kappa] # 0x1d73f - - "": [T: bold italic lamda] # 0xf4a0 - - "𝝀": [T: bold italic lamda] # 0x1d740 - - "ï’Ą": [T: bold italic mu] # 0xf4a1 - - "𝝁": [T: bold italic mu] # 0x1d741 - - "ï’ą": [T: bold italic nu] # 0xf4a2 - - "𝝂": [T: bold italic nu] # 0x1d742 - - "ï’Ł": [T: bold italic xi] # 0xf4a3 - - "𝝃": [T: bold italic xi] # 0x1d743 - - "ï’€": [T: bold italic omicron] # 0xf4a4 - - "𝝄": [T: bold italic omicron] # 0x1d744 - - "ï’„": [T: bold italic pi] # 0xf4a5 - - "𝝅": [T: bold italic pi] # 0x1d745 - - "ï’Š": [T: bold italic rho] # 0xf4a6 - - "𝝆": [T: bold italic rho] # 0x1d746 - - "": [T: bold italic final sigma] # 0xf4a7 - - "𝝇": [T: bold italic final sigma] # 0x1d747 - - "ï’š": [T: bold italic sigma] # 0xf4a8 - - "𝝈": [T: bold italic sigma] # 0x1d748 - - "": [T: bold italic tau] # 0xf4a9 - - "𝝉": [T: bold italic tau] # 0x1d749 - - "ï’Ș": [T: bold italic upsilon] # 0xf4aa - - "𝝊": [T: bold italic upsilon] # 0x1d74a - - "": [T: bold italic phi] # 0xf4ab - - "𝝋": [T: bold italic phi] # 0x1d74b - - "ï’Ź": [T: bold italic chi] # 0xf4ac - - "𝝌": [T: bold italic chi] # 0x1d74c - - "": [T: bold italic psi] # 0xf4ad - - "𝝍": [T: bold italic psi] # 0x1d74d - - "ï’ź": [T: bold italic omega] # 0xf4ae - - "𝝎": [T: bold italic omega] # 0x1d74e - - "ï’Ż": [T: bold diferensial parsial] # 0xf4af - - "𝝏": [T: bold diferensial parsial] # 0x1d74f - - "": [T: bold italic epsilon] # 0xf4b0 - - "𝝐": [T: bold italic epsilon] # 0x1d750 - - "": [T: bold italic theta] # 0xf4b1 - - "𝝑": [T: bold italic theta] # 0x1d751 - - "ï’Č": [T: bold italic kappa] # 0xf4b2 - - "𝝒": [T: bold italic kappa] # 0x1d752 - - "ï’ł": [T: bold italic phi] # 0xf4b3 - - "𝝓": [T: bold italic phi] # 0x1d753 - - "ï’Ž": [T: bold italic rho] # 0xf4b4 - - "𝝔": [T: bold italic rho] # 0x1d754 - - "ï’”": [T: bold italic pi] # 0xf4b5 - - "𝝕": [T: bold italic pi] # 0x1d755 - - "": # 0xf4b6 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: alpha - - "𝝖": # 0x1d756 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: alpha - - "": # 0xf4b7 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: beta - - "𝝗": # 0x1d757 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: beta - - "ï’ž": # 0xf4b8 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: gamma - - "𝝘": # 0x1d758 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: gamma - - "ï’č": # 0xf4b9 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: delta - - "𝝙": # 0x1d759 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: delta - - "ï’ș": # 0xf4ba - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: epsilon - - "𝝚": # 0x1d75a - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: epsilon - - "": # 0xf4bb - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: zeta - - "𝝛": # 0x1d75b - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: zeta - - "ï’Œ": # 0xf4bc - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: eta - - "𝝜": # 0x1d75c - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: eta - - "ï’œ": # 0xf4bd - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "𝝝": # 0x1d75d - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "ï’Ÿ": # 0xf4be - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: iota - - "𝝞": # 0x1d75e - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: iota - - "ï’ż": # 0xf4bf - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: kappa - - "𝝟": # 0x1d75f - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: kappa - - "": # 0xf4c0 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: lamda - - "𝝠": # 0x1d760 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: lamda - - "": # 0xf4c1 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: mu - - "𝝡": # 0x1d761 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: mu - - "": # 0xf4c2 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: nu - - "𝝱": # 0x1d762 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: nu - - "": # 0xf4c3 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: xi - - "𝝣": # 0x1d763 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: xi - - "": # 0xf4c4 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omicron - - "đ€": # 0x1d764 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omicron - - "": # 0xf4c5 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: pi - - "đ„": # 0x1d765 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: pi - - "": # 0xf4c6 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: rho - - "𝝩": # 0x1d766 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: rho - - "": # 0xf4c7 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "𝝧": # 0x1d767 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "": # 0xf4c8 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: sigma - - "𝝹": # 0x1d768 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: sigma - - "": # 0xf4c9 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: tau - - "đ©": # 0x1d769 - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: tau - - "": # 0xf4ca - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: upsilon - - "đȘ": # 0x1d76a - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: upsilon - - "": # 0xf4cb - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: phi - - "đ«": # 0x1d76b - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: phi - - "": # 0xf4cc - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: chi - - "𝝬": # 0x1d76c - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: chi - - "": # 0xf4cd - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: psi - - "𝝭": # 0x1d76d - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: psi - - "": # 0xf4ce - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omega - - "𝝼": # 0x1d76e - - T: bold - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omega - - "": [T: bold nabla] # 0xf4cf - - "𝝯": [T: bold nabla] # 0x1d76f - - "": [T: bold alpha] # 0xf4d0 - - "𝝰": [T: bold alpha] # 0x1d770 - - "": [T: bold beta] # 0xf4d1 - - "đ±": [T: bold beta] # 0x1d771 - - "": [T: bold gamma] # 0xf4d2 - - "đČ": [T: bold gamma] # 0x1d772 - - "": [T: bold delta] # 0xf4d3 - - "𝝳": [T: bold delta] # 0x1d773 - - "": [T: bold epsilon] # 0xf4d4 - - "𝝮": [T: bold epsilon] # 0x1d774 - - "": [T: bold zeta] # 0xf4d5 - - "đ”": [T: bold zeta] # 0x1d775 - - "": [T: bold eta] # 0xf4d6 - - "đ¶": [T: bold eta] # 0x1d776 - - "": [T: bold theta] # 0xf4d7 - - "đ·": [T: bold theta] # 0x1d777 - - "": [T: bold iota] # 0xf4d8 - - "𝝾": [T: bold iota] # 0x1d778 - - "": [T: bold kappa] # 0xf4d9 - - "đč": [T: bold kappa] # 0x1d779 - - "": [T: bold lamda] # 0xf4da - - "đș": [T: bold lamda] # 0x1d77a - - "": [T: bold mu] # 0xf4db - - "đ»": [T: bold mu] # 0x1d77b - - "": [T: bold nu] # 0xf4dc - - "đŒ": [T: bold nu] # 0x1d77c - - "": [T: bold xi] # 0xf4dd - - "đœ": [T: bold xi] # 0x1d77d - - "": [T: bold omicron] # 0xf4de - - "đŸ": [T: bold omicron] # 0x1d77e - - "": [T: bold pi] # 0xf4df - - "𝝿": [T: bold pi] # 0x1d77f - - "": [T: bold rho] # 0xf4e0 - - "𝞀": [T: bold rho] # 0x1d780 - - "ï“Ą": [T: bold final sigma] # 0xf4e1 - - "𝞁": [T: bold final sigma] # 0x1d781 - - "ï“ą": [T: bold sigma] # 0xf4e2 - - "𝞂": [T: bold sigma] # 0x1d782 - - "ï“Ł": [T: bold tau] # 0xf4e3 - - "𝞃": [T: bold tau] # 0x1d783 - - "ï“€": [T: bold upsilon] # 0xf4e4 - - "𝞄": [T: bold upsilon] # 0x1d784 - - "ï“„": [T: bold phi] # 0xf4e5 - - "𝞅": [T: bold phi] # 0x1d785 - - "": [T: bold chi] # 0xf4e6 - - "𝞆": [T: bold chi] # 0x1d786 - - "": [T: bold psi] # 0xf4e7 - - "𝞇": [T: bold psi] # 0x1d787 - - "": [T: bold omega] # 0xf4e8 - - "𝞈": [T: bold omega] # 0x1d788 - - "": [T: bold diferensial parsial] # 0xf4e9 - - "𝞉": [T: bold diferensial parsial] # 0x1d789 - - "ï“Ș": [T: bold epsilon] # 0xf4ea - - "𝞊": [T: bold epsilon] # 0x1d78a - - "": [T: bold theta] # 0xf4eb - - "𝞋": [T: bold theta] # 0x1d78b - - "ï“Ź": [T: bold kappa] # 0xf4ec - - "𝞌": [T: bold kappa] # 0x1d78c - - "": [T: bold phi] # 0xf4ed - - "𝞍": [T: bold phi] # 0x1d78d - - "ï“ź": [T: bold rho] # 0xf4ee - - "𝞎": [T: bold rho] # 0x1d78e - - "ï“Ż": [T: bold pi] # 0xf4ef - - "𝞏": [T: bold pi] # 0x1d78f - - "": # 0xf4f0 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: alpha - - "𝞐": # 0x1d790 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: alpha - - "": # 0xf4f1 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: beta - - "𝞑": # 0x1d791 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: beta - - "ï“Č": # 0xf4f2 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: gamma - - "𝞒": # 0x1d792 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: gamma - - "ï“ł": # 0xf4f3 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: delta - - "𝞓": # 0x1d793 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: delta - - "": # 0xf4f4 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: epsilon - - "𝞔": # 0x1d794 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: epsilon - - "ï“”": # 0xf4f5 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: zeta - - "𝞕": # 0x1d795 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: zeta - - "": # 0xf4f6 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: eta - - "𝞖": # 0x1d796 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: eta - - "": # 0xf4f7 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "𝞗": # 0x1d797 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "": # 0xf4f8 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: iota - - "𝞘": # 0x1d798 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: iota - - "ï“č": # 0xf4f9 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: kappa - - "𝞙": # 0x1d799 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: kappa - - "ï“ș": # 0xf4fa - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: lamda - - "𝞚": # 0x1d79a - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: lamda - - "": # 0xf4fb - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: mu - - "𝞛": # 0x1d79b - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: mu - - "": # 0xf4fc - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: nu - - "𝞜": # 0x1d79c - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: nu - - "": # 0xf4fd - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: xi - - "𝞝": # 0x1d79d - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: xi - - "": # 0xf4fe - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omicron - - "𝞞": # 0x1d79e - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omicron - - "ï“ż": # 0xf4ff - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: pi - - "𝞟": # 0x1d79f - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: pi - - "": # 0xf500 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: rho - - "𝞠": # 0x1d7a0 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: rho - - "": # 0xf501 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "𝞡": # 0x1d7a1 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: theta - - "": # 0xf502 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: sigma - - "𝞱": # 0x1d7a2 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: sigma - - "": # 0xf503 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: tau - - "𝞣": # 0x1d7a3 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: tau - - "": # 0xf504 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: upsilon - - "đž€": # 0x1d7a4 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: upsilon - - "": # 0xf505 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: phi - - "đž„": # 0x1d7a5 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: phi - - "": # 0xf506 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: chi - - "𝞩": # 0x1d7a6 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: chi - - "": # 0xf507 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: psi - - "𝞧": # 0x1d7a7 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: psi - - "": # 0xf508 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omega - - "𝞹": # 0x1d7a8 - - T: bold italic - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: huruf besar] - - T: omega - - "": [T: bold nabla] # 0xf509 - - "đž©": [T: bold nabla] # 0x1d7a9 - - "": [T: bold italic alpha] # 0xf50a - - "đžȘ": [T: bold italic alpha] # 0x1d7aa - - "": [T: bold italic beta] # 0xf50b - - "đž«": [T: bold italic beta] # 0x1d7ab - - "": [T: bold italic gamma] # 0xf50c - - "𝞬": [T: bold italic gamma] # 0x1d7ac - - "": [T: bold italic delta] # 0xf50d - - "𝞭": [T: bold italic delta] # 0x1d7ad - - "": [T: bold italic epsilon] # 0xf50e - - "𝞼": [T: bold italic epsilon] # 0x1d7ae - - "": [T: bold italic zeta] # 0xf50f - - "𝞯": [T: bold italic zeta] # 0x1d7af - - "": [T: bold italic eta] # 0xf510 - - "𝞰": [T: bold italic eta] # 0x1d7b0 - - "": [T: bold italic theta] # 0xf511 - - "đž±": [T: bold italic theta] # 0x1d7b1 - - "": [T: bold italic iota] # 0xf512 - - "đžČ": [T: bold italic iota] # 0x1d7b2 - - "": [T: bold italic kappa] # 0xf513 - - "𝞳": [T: bold italic kappa] # 0x1d7b3 - - "": [T: bold italic lamda] # 0xf514 - - "𝞮": [T: bold italic lamda] # 0x1d7b4 - - "": [T: bold italic mu] # 0xf515 - - "đž”": [T: bold italic mu] # 0x1d7b5 - - "": [T: bold italic nu] # 0xf516 - - "đž¶": [T: bold italic nu] # 0x1d7b6 - - "": [T: bold italic xi] # 0xf517 - - "đž·": [T: bold italic xi] # 0x1d7b7 - - "": [T: bold italic omicron] # 0xf518 - - "𝞾": [T: bold italic omicron] # 0x1d7b8 - - "": [T: bold italic pi] # 0xf519 - - "đžč": [T: bold italic pi] # 0x1d7b9 - - "": [T: bold italic rho] # 0xf51a - - "đžș": [T: bold italic rho] # 0x1d7ba - - "": [T: bold italic final sigma] # 0xf51b - - "đž»": [T: bold italic final sigma] # 0x1d7bb - - "": [T: bold italic sigma] # 0xf51c - - "đžŒ": [T: bold italic sigma] # 0x1d7bc - - "": [T: bold italic tau] # 0xf51d - - "đžœ": [T: bold italic tau] # 0x1d7bd - - "": [T: bold italic upsilon] # 0xf51e - - "đžŸ": [T: bold italic upsilon] # 0x1d7be - - "": [T: bold italic phi] # 0xf51f - - "𝞿": [T: bold italic phi] # 0x1d7bf - - "": [T: bold italic chi] # 0xf520 + +# fraktur 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) + - T: "fraktur" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'abcdefghijklmnopqrstuvwxy')" + + - "-": # 0xf000 - 0xf018 + - T: "fraktur" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxy')" + + - "𝔞-đ”·": # 0x1d51e - 0x1d537 + - T: "fraktur" + - spell: "translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz')" + - "-ï€ł": # 0xf01a - 0xf033 + - T: "fraktur" + - spell: "translate('.', 'ï€šï€›ï€œï€ï€žï€Ÿï€ ï€Ąï€ąï€Łï€€ï€„ï€Šï€§ï€šï€©ï€Șï€«ï€Źï€­ï€źï€Żï€°ï€±ï€Čï€ł', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝕬-𝖅": # 0x1D56C - 0x1D585 + - T: "fraktur" + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf040 - 0xf059 + - T: "fraktur" + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝖆-𝖟": # 0x1d586 - 0x1d59f + - T: "fraktur" + - T: "bold" + - spell: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" + - "-ïł": # 0xf05a - 0xf073 + - T: "fraktur" + - T: "bold" + - 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) + - T: "struck ganda" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', '𝔾đ”čđ”șđ”»đ”Œđ”œđ”Ÿđ”żđ•€đ•đ•‚đ•ƒđ•„đ•…đ•†đ•‡đ•ˆđ•‰đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf080 - 0xf098 + - T: "struck ganda" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝕒-đ•«": # 0x1d552 - 0x1d56b + - T: "struck ganda" + - spell: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" + - "-ï‚ł": # 0xf09a - 0xf0b3 + - T: "struck ganda" + - spell: "translate('.', 'ï‚šï‚›ï‚œï‚ï‚žï‚Ÿï‚ ï‚Ąï‚ąï‚Łï‚€ï‚„ï‚Šï‚§ï‚šï‚©ï‚Șï‚«ï‚Źï‚­ï‚źï‚Żï‚°ï‚±ï‚Čï‚ł', 'abcdefghijklmnopqrstuvwxyz')" + - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 + - T: "aksara" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf100 - 0xf119 + - T: "aksara" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + + - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf + - T: "aksara" + - spell: "translate('.', 'đ’¶đ’·đ’žđ’čđ’șđ’»đ’Œđ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“„đ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdefghijklmnopqrstuvwxyz')" + - "-ï„ł": # 0xf11a - 0xf133 + - T: "aksara" + - spell: "translate('.', 'ï„šï„›ï„œï„ï„žï„Ÿï„ ï„Ąï„ąï„Łï„€ï„„ï„Šï„§ï„šï„©ï„Șï„«ï„Źï„­ï„źï„Żï„°ï„±ï„Čï„ł', 'abcdefghijklmnopqrstuvwxyz')" + + # bold script chars in math alphabetic block and also MathType private use area + - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 + - T: "aksara" + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf140 - 0xf159 + - T: "aksara" + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + + - "đ“Ș-𝔃": # 0x1d4ea - 0x1d503 + - T: "aksara" + - T: "bold" + - spell: "translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz')" + - "-ï…ł": # 0xf15a - 0xf173 + - T: "aksara" + - T: "bold" + - spell: "translate('.', 'ï…šï…›ï…œï…ï…žï…Ÿï… ï…Ąï…ąï…Łï…€ï…„ï…Šï…§ï…šï…©ï…Șï…«ï…Źï…­ï…źï…Żï…°ï…±ï…Čï…ł', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf180 - 0xf199 + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + + - "": # 0xf19a + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "cap"] + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [T: "ligature ae"] + - "": # 0xf19b + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "cap"] + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [T: "sharp s"] + - "": # 0xf19c + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "cap"] + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [T: "o with stroke"] + + # MathType only has a few of the cap Greek letters in PUA + - "": # 0xf201 - 0xf209 + - T: "struck ganda" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', '', 'ÎŽÏˆÎ»Ï€ÏƒÎžÎłÏ‰Ï…')" + + - "-": # 0xf220 - 0xf236 + - T: "struck ganda" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'ïˆ ïˆĄïˆąïˆŁïˆ€ïˆ„ïˆŠïˆ§ïˆšïˆ©ïˆȘïˆ«ïˆŹïˆ­ïˆźïˆŻïˆ°ïˆ±ïˆČïˆłïˆŽïˆ”ïˆ¶', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÎąÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "": [T: "struck ganda final sigma"] # 0xf237 + - "": [T: "struck ganda rho"] # 0xf250 + - "": [T: "struck ganda phi"] # 0xf251 + - "𝐀-𝐙": # 0x1d400 - 0x1d419 + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'abcdefghijklmnopqrstuvwxyz')" + + - "-ï‰č": # 0xf260 - 0xf279 + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'ï‰ ï‰Ąï‰ąï‰Łï‰€ï‰„ï‰Šï‰§ï‰šï‰©ï‰Șï‰«ï‰Źï‰­ï‰źï‰Żï‰°ï‰±ï‰Čï‰łï‰Žï‰”ï‰¶ï‰·ï‰žï‰č', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝐚-𝐳": # 0x1d41a - 0x1d433 + - T: "bold" + - spell: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" + + - "ï‰ș-": # 0xf27a - 0xf293 + - T: "bold" + - spell: "translate('.', 'ï‰șï‰»ï‰Œï‰œï‰Ÿï‰żïŠ€ïŠïŠ‚ïŠƒïŠ„ïŠ…ïŠ†ïŠ‡ïŠˆïŠ‰ïŠŠïŠ‹ïŠŒïŠïŠŽïŠïŠïŠ‘ïŠ’ïŠ“', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝐮-𝑍": # 0x1d434 - 0x1d44d + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf294 - 0xf2ad + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'ïŠ”ïŠ•ïŠ–ïŠ—ïŠ˜ïŠ™ïŠšïŠ›ïŠœïŠïŠžïŠŸïŠ ïŠĄïŠąïŠŁïŠ€ïŠ„ïŠŠïŠ§ïŠšïŠ©ïŠȘïŠ«ïŠŹïŠ­', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝑎-𝑧": # 0x1d44e - 0x1d467 + - spell: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”đ‘•đ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" + + - "ïŠź-": # 0xf2ae - 0xf2c7 + - spell: "translate('.', 'ïŠźïŠŻïŠ°ïŠ±ïŠČïŠłïŠŽïŠ”ïŠ¶ïŠ·ïŠžïŠčïŠșïŠ»ïŠŒïŠœïŠŸïŠżï‹€ï‹ï‹‚ï‹ƒï‹„ï‹…ï‹†ï‹‡', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝑹-𝒁": # 0x1d468 - 0x1d481 + # - T: "bold italic" + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'abcdefghijklmnopqrstuvwxyz')" + + - "-ï‹Ą": # 0xf2c8 - 0xf2e1 + # - T: "bold italic" + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'ï‹ˆï‹‰ï‹Šï‹‹ï‹Œï‹ï‹Žï‹ï‹ï‹‘ï‹’ï‹“ï‹”ï‹•ï‹–ï‹—ï‹˜ï‹™ï‹šï‹›ï‹œï‹ï‹žï‹Ÿï‹ ï‹Ą', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝒂-𝒛": # 0x1d482 - 0x1d49b + # - T: "bold italic" + - T: "bold" + - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" + + - "ï‹ą-": # 0xf2e2 - 0xf2fb + # - T: "bold italic" + - T: "bold" + - spell: "translate('.', 'ï‹ąï‹Łï‹€ï‹„ï‹Šï‹§ï‹šï‹©ï‹Șï‹«ï‹Źï‹­ï‹źï‹Żï‹°ï‹±ï‹Čï‹łï‹Žï‹”ï‹¶ï‹·ï‹žï‹čï‹ș', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf300 - 0xf319 + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + + - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 + - spell: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" + + - "-ïŒł": # 0xf31a - 0xf333 + - spell: "translate('.', 'ïŒšïŒ›ïŒœïŒïŒžïŒŸïŒ ïŒĄïŒąïŒŁïŒ€ïŒ„ïŒŠïŒ§ïŒšïŒ©ïŒȘïŒ«ïŒŹïŒ­ïŒźïŒŻïŒ°ïŒ±ïŒČïŒł', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf334 - 0xf34d + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'ïŒčïŒșïŒ»ïŒŒïŒœïŒŸïŒżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒï', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝗼-𝘇": # 0x1d5ee - 0x1d607 + - T: "bold" + - spell: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf34e - 0xf367 + - T: "bold" + - spell: "translate('.', 'ïŽïïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§', 'abcdefghijklmnopqrstuvwxyz')" + - "𝘈-𝘡": # 0x1d608 - 0x1d621 + # - T: "italic" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'abcdefghijklmnopqrstuvwxyz')" + - "-": # 0xf368 - 0xf381 + # - T: "italic" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżïŽ€ïŽ', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝘱-đ˜»": # 0x1d622 - 0x1d63b + # - T: "italic" + - spell: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf382 - 0xf39b + # - T: "italic" + - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + + - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 + # - T: "bold italic" + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf39c - 0xf3b5 + # - T: "bold italic" + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'ïŽœïŽïŽžïŽŸïŽ ïŽĄïŽąïŽŁïŽ€ïŽ„ïŽŠïŽ§ïŽšïŽ©ïŽȘïŽ«ïŽŹïŽ­ïŽźïŽŻïŽ°ïŽ±ïŽČïŽłïŽŽïŽ”', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝙖-𝙯": # 0x1d656 - 0x1d66f + # - T: "bold italic" + - T: "bold" + - spell: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf3b6 - 0xf3cf + # - T: "bold italic" + - T: "bold" + - spell: "translate('.', 'ïŽčïŽșïŽ»ïŽŒïŽœïŽŸïŽżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒïïŽï', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝙰-𝚉": # 0x1d670 - 0x1d689 + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf3d0 - 0xf3e9 + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'ïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§ïšï©', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝚊-𝚣": # 0x1d68a - 0x1d6a3 + - spell: "translate('.', '𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚱𝚣', 'abcdefghijklmnopqrstuvwxyz')" + + - "ïȘ-": # 0xf3ea - 0xf403 + - spell: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżï€ïï‚ïƒ', 'abcdefghijklmnopqrstuvwxyz')" + + - "": [T: "dotless i"] # 0xf404 + - "đš€": [T: "dotless i"] # 0x1d6a4 + - "đš„": [T: "dotless j"] # 0x1d6a5 + + - "𝚹-𝛀": # 0x1d6a8 - 0x1d6c0 + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÎąÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-": # 0xf408 - 0xf420 + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', '', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÎąÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "𝛂-𝛚": # 0x1d6c2 - 0x1d6da + - T: "bold" + - spell: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙𝛚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "ïą-ïș": # 0xf422 - 0xf43a + - T: "bold" + - spell: "translate('.', 'ïąïŁï€ï„ïŠï§ïšï©ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïș', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "ïĄ": [T: "bold nabla"] # 0xf421 + - "𝛁": [T: "bold nabla"] # 0x1d6c1 + + - "𝛛𝛜𝛝𝛞𝛟𝛠𝛡": # 0x1D6DB - 0x1D6E1 + - T: "bold" + - spell: "translate('.', '𝛛𝛜𝛝𝛞𝛟𝛠𝛡', '∂ΔΞÎșφρπ')" + + - "ï»ïŒïœïŸïżï‘€ï‘": # 0xF43C - 0xF441 + - T: "bold" + - spell: "translate('.', 'ï»ïŒïœïŸïżï‘€ï‘', '∂ΔΞÎșφρπ')" + + - "𝛱-đ›ș": # 0x1d6e2 - 0x1d6fa + # - T: "italic" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›čđ›ș', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÎąÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-": # 0xf442 - 0xf45a + # - T: "italic" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', '', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÎąÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "đ›Œ-𝜔": # 0x1d6fc - 0x1d714 + # - T: "italic" + - spell: "translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“đœ”', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-": # 0xf45c - 0xf474 + # - T: "italic" + - spell: "translate('.', 'ï‘œï‘ï‘žï‘Ÿï‘ ï‘Ąï‘ąï‘Łï‘€ï‘„ï‘Šï‘§ï‘šï‘©ï‘Șï‘«ï‘Źï‘­ï‘źï‘Żï‘°ï‘±ï‘Čï‘łï‘Ž', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "": [T: "italic nabla"] # 0xf45b + - "đ›»": [T: "italic nabla"] # 0x1d6fb + + - "𝜕𝜖𝜗𝜘𝜙𝜚𝜛": # 0x1d715 - 0x1d71b + # - T: "italic" + - spell: "translate('.', '𝜕𝜖𝜗𝜘𝜙𝜚𝜛', '∂ΔΞÎșφρπ')" + + - "ï‘čï‘ș": # 0xf475 - 0xf47b + # - T: "italic" + - spell: "translate('.', 'ï‘čï‘ș', '∂ΔΞÎșφρπ')" + + - "𝜜-𝜮": # 0x1d71c - 0x1d734 + # - T: "bold italic" + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳𝜮', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÎąÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-": # 0xf47c - 0xf494 + # - T: "bold italic" + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'ï‘Œï‘œï‘Ÿï‘żï’€ï’ï’‚ï’ƒï’„ï’…ï’†ï’‡ï’ˆï’‰ï’Šï’‹ï’Œï’ï’Žï’ï’ï’‘ï’’ï’“ï’”', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÎąÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "đœ¶-𝝎": # 0x1d736 - 0x1d74e + # - T: "bold italic" + - T: "bold" + - spell: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđđŽ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-ï’ź": # 0xf496 - 0xf4ae + # - T: "bold italic" + - T: "bold" + - spell: "translate('.', 'ï’–ï’—ï’˜ï’™ï’šï’›ï’œï’ï’žï’Ÿï’ ï’Ąï’ąï’Łï’€ï’„ï’Šï’§ï’šï’©ï’Șï’«ï’Źï’­ï’ź', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "𝝏𝝐𝝑𝝒𝝓𝝔𝝕": # 0x1d74f - 0x1d755 + # - T: "bold italic" + - T: "bold" + - spell: "translate('.', '𝝏𝝐𝝑𝝒𝝓𝝔𝝕', '∂ΔΞÎșφρπ')" + + - "ï’Żï’°ï’±ï’Čï’łï’Žï’”": # 0xf422 - 0xf43a + # - T: "bold italic" + - T: "bold" + - spell: "translate('.', 'ï’Żï’°ï’±ï’Čï’łï’Žï’”', '∂ΔΞÎșφρπ')" + + - "đœ”": [T: "bold italic nabla"] # 0x1d735 + - "": [T: "bold italic nabla"] # 0xf495 + + - "𝝖-𝝼": # 0x1d756 - 0x1d76e + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đź', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÎąÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + - "-": # 0xf4b6 - 0xf4ce + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'ï’¶ï’·ï’žï’čï’șï’»ï’Œï’œï’Ÿï’żï“€ï“ï“‚ï“ƒï“„ï“…ï“†ï“‡ï“ˆï“‰ï“Šï“‹ï“Œï“ï“Ž', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÎąÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "𝝰-𝞈": # 0x1d770 - 0x1d788 + - T: "bold" + - spell: "translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€đžđž‚đžƒđž„đž…đž†đž‡đžˆ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-": # 0xf4d0 - 0xf4e8 + - T: "bold" + - spell: "translate('.', 'ï“ï“‘ï“’ï““ï“”ï“•ï“–ï“—ï“˜ï“™ï“šï“›ï“œï“ï“žï“Ÿï“ ï“Ąï“ąï“Łï“€ï“„ï“Šï“§ï“š', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "𝞉𝞊𝞋𝞌𝞍𝞎𝞏": # 0x1d789 - 0x1d78f + - T: "bold" + - spell: "translate('.', '𝞉𝞊𝞋𝞌𝞍𝞎𝞏', '∂ΔΞÎșφρπ')" + + - "ï“Șï“«ï“Źï“­ï“źï“Ż": # 0xf4e9 - 0xf4ef + - T: "bold" + - spell: "translate('.', 'ï“Șï“«ï“Źï“­ï“źï“Ż', '∂ΔΞÎșφρπ')" + + - "": [T: "bold nabla"] # 0xf4cf + - "𝝯": [T: "bold nabla"] # 0x1d76f + + - "𝞐-𝞹": # 0x1d790 - 0x1d7a8 + # - T: "bold italic" + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÎąÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-": # 0xf4f0 - 0xf508 + # - T: "bold italic" + - T: "bold" + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: huruf besar] + - spell: "translate('.', 'ï“Čï“łï“Žï“”ï“¶ï“·ï“žï“čï“șï“»ï“Œï“œï“Ÿï“żï”€ï”ï”‚ï”ƒï”„ï”…ï”†ï”‡ï”ˆ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÎąÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "đžȘ-𝟂": # 0x1d7aa - 0x1d7c2 + # - T: "bold italic" + - T: "bold" + - spell: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸđŸ‚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-ï”ą": # 0xf50a - 0xf522 + # - T: "bold italic" + - T: "bold" + - spell: "translate('.', 'ï”Šï”‹ï”Œï”ï”Žï”ï”ï”‘ï”’ï”“ï””ï”•ï”–ï”—ï”˜ï”™ï”šï”›ï”œï”ï”žï”Ÿï” ï”Ąï”ą', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "𝟃𝟄𝟅𝟆𝟇𝟈𝟉": # 0x1d7c3 - 0x1d7c9 + # - T: "bold italic" + - T: "bold" + - spell: "translate('.', '𝟃𝟄𝟅𝟆𝟇𝟈𝟉', '∂ΔΞÎșφρπ')" + + - "ï”Łï”€ï”„ï”Šï”§ï”šï”©": # 0xf523 - 0xf529 + # - T: "bold italic" + - T: "bold" + - spell: "translate('.', 'ï”Łï”€ï”„ï”Šï”§ï”šï”©', '∂ΔΞÎșφρπ')" + + - "": [T: "bold nabla"] # 0xf509 + - "đž©": [T: "bold nabla"] # 0x1d7a9 + + - "": [T: struck ganda nol] # 0xf0c0 + - "𝟘": [T: struck ganda nol] # 0x1d7d8 + - "": [T: struck ganda satu] # 0xf0c1 + - "𝟙": [T: struck ganda satu] # 0x1d7d9 + - "": [T: struck ganda dua] # 0xf0c2 + - "𝟚": [T: struck ganda dua] # 0x1d7da + - "": [T: struck ganda tiga] # 0xf0c3 + - "𝟛": [T: struck ganda tiga] # 0x1d7db + - "": [T: struck ganda empat] # 0xf0c4 + - "𝟜": [T: struck ganda empat] # 0x1d7dc + - "": [T: struck ganda lima] # 0xf0c5 + - "𝟝": [T: struck ganda lima] # 0x1d7dd + - "": [T: struck ganda enam] # 0xf0c6 + - "𝟞": [T: struck ganda enam] # 0x1d7de + - "": [T: struck ganda tujuh] # 0xf0c7 + - "𝟟": [T: struck ganda tujuh] # 0x1d7df + - "": [T: struck ganda delapan] # 0xf0c8 + - "𝟠": [T: struck ganda delapan] # 0x1d7e0 + - "": [T: struck ganda sembilan] # 0xf0c9 + - "𝟡": [T: struck ganda sembilan] # 0x1d7e1 + - "": [T: struck ganda nabla] # 0xf0ca + - "": [T: struck ganda konstanta euler] # 0xf0cb - "𝟀": [T: bold italic chi] # 0x1d7c0 - - "ï”Ą": [T: bold italic psi] # 0xf521 - "𝟁": [T: bold italic psi] # 0x1d7c1 - - "ï”ą": [T: bold italic omega] # 0xf522 - "𝟂": [T: bold italic omega] # 0x1d7c2 - - "ï”Ł": [T: bold diferensial parsial] # 0xf523 - "𝟃": [T: bold diferensial parsial] # 0x1d7c3 - - "": [T: bold italic epsilon] # 0xf524 - "𝟄": [T: bold italic epsilon] # 0x1d7c4 - - "": [T: bold italic theta] # 0xf525 - "𝟅": [T: bold italic theta] # 0x1d7c5 - - "": [T: bold italic kappa] # 0xf526 - "𝟆": [T: bold italic kappa] # 0x1d7c6 - - "": [T: bold italic phi] # 0xf527 - "𝟇": [T: bold italic phi] # 0x1d7c7 - - "": [T: bold italic rho] # 0xf528 - "𝟈": [T: bold italic rho] # 0x1d7c8 - - "": [T: bold italic pi] # 0xf529 - "𝟉": [T: bold italic pi] # 0x1d7c9 - "ï”ź": [T: bold nol] # 0xf52e - "𝟎": [T: bold nol] # 0x1d7ce @@ -10390,6 +4505,7 @@ - "đŸŸ": [T: delapan] # 0x1d7fe - "": [T: sembilan] # 0xf55f - "𝟿": [T: sembilan] # 0x1d7ff + - "": [T: karakter tidak dikenal] # 0xf700 - "": [T: segitiga kanan bawah dan kiri bawah] # 0xf726 - "": [T: pemanjang ellipsis horizontal] # 0xf72d diff --git a/src/braille.rs b/src/braille.rs index 1ced5bc8b..929bcf791 100644 --- a/src/braille.rs +++ b/src/braille.rs @@ -645,7 +645,7 @@ fn nemeth_cleanup(_pref_manager: Ref, raw_braille: String) -> "B" => "â ž", // bold "đ”č" => "â  â ž", // blackboard "T" => "⠈", // script - "I" => "â š", // italic (mapped to be the same a blackboard) + "I" => "â š", // italic -- used for digits (not math letters) "R" => "", // roman "E" => "â °", // English "D" => "â ž", // German (Deutsche) @@ -889,7 +889,7 @@ static UEB_INDICATOR_REPLACEMENTS: phf::Map<&str, &str> = phf_map! { "B" => "⠘", // bold "đ”č" => "XXX", // blackboard -- from prefs "T" => "⠈", // script - "I" => "â š", // italic + "I" => "â š", // italic -- used for digits (not math letters) "R" => "", // roman // "E" => "â °", // English "1" => "â °", // Grade 1 symbol @@ -2047,8 +2047,6 @@ static VIETNAM_INDICATOR_REPLACEMENTS: phf::Map<&str, &str> = phf_map! { "B" => "⠘", // bold "đ”č" => "XXX", // blackboard -- from prefs "T" => "⠈", // script - "I" => "â š", // italic - "R" => "", // roman // "E" => "â °", // English "1" => "â  ", // Grade 1 symbol "L" => "", // Letter left in to assist in locating letters @@ -2137,7 +2135,7 @@ static CMU_INDICATOR_REPLACEMENTS: phf::Map<&str, &str> = phf_map! { "B" => "⠔", // bold "đ”č" => "â Ź", // blackboard -- from prefs // "T" => "⠈", // script - "I" => "⠔", // italic -- same as bold + "I" => "⠔", // italic -- used for digits (not math letters); same cell as bold in CMU // "R" => "", // roman // "E" => "â °", // English "1" => "⠐", // Grade 1 symbol -- used here for a-j after number @@ -2230,7 +2228,7 @@ static SWEDISH_INDICATOR_REPLACEMENTS: phf::Map<&str, &str> = phf_map! { "B" => "â š", // bold "đ”č" => "XXX", // blackboard -- from prefs "T" => "⠈", // script - "I" => "â š", // italic + "I" => "â š", // italic -- used for digits (not math letters) "R" => "", // roman "1" => "â ±", // Grade 1 symbol (used for number followed by a letter) "L" => "", // Letter left in to assist in locating letters @@ -2269,7 +2267,7 @@ static FINNISH_INDICATOR_REPLACEMENTS: phf::Map<&str, &str> = phf_map! { "B" => "â š", // bold "đ”č" => "XXX", // blackboard -- from prefs "T" => "⠈", // script - "I" => "â š", // italic + "I" => "â š", // italic -- used for digits (not math letters) "R" => "", // roman "E" => "â °", // English "1" => "⠀", // Grade 1 symbol (used for number followed by a letter) @@ -2719,21 +2717,34 @@ impl BrailleChars { } } + /// Italic typeform is for digits (and numeric punctuation like '.'), not math letters. + fn uses_italic_typeform(node_name: &str, text: &str) -> bool { + if node_name == "mn" { + return true; + } + !text.is_empty() && text.chars().all(|ch| ch.is_ascii_digit() || matches!(ch, '.' | ',' | '−' | '-' | '+')) + } + fn get_braille_nemeth_chars(node: Element, text_range: Option>) -> Result { // To greatly simplify typeface/language generation, the chars have unique ASCII chars for them: // Typeface: S: sans-serif, B: bold, đ”č: blackboard, T: script, I: italic, R: Roman // Language: E: English, D: German, G: Greek, V: Greek variants, H: Hebrew, U: Russian // Indicators: C: capital, L: letter, N: number, P: punctuation, M: multipurpose + // Italic typeform is used for digits; math letters do not get italic. static PICK_APART_CHAR: LazyLock = LazyLock::new(|| { Regex::new(r"(?P[SBđ”čTIR]*)(?P[EDGVHU]?)(?PC?)(?PL?)(?P[N]?)(?P.)").unwrap() }); let raw_math_variant = node.attribute_value("mathvariant"); let math_variant = raw_math_variant.as_deref(); + let text = BrailleChars::substring(as_str!(as_text(node)), &text_range); + let node_name = name(node); + let italic_ok = BrailleChars::uses_italic_typeform(node_name, &text); let attr_typeface = match math_variant { None => "R", Some(variant) => match variant { "bold" => "B", - "italic" => "I", + "italic" => if italic_ok {"I"} else {"R"}, + "bold-italic" => if italic_ok {"BI"} else {"B"}, "double-struck" => "đ”č", "script" => "T", "fraktur" => "D", @@ -2741,7 +2752,6 @@ impl BrailleChars { _ => "R", // normal and unknown }, }; - let text = BrailleChars::substring(as_str!(as_text(node)), &text_range); let braille_chars = braille_replace_chars(&text, node)?; // debug!("Nemeth chars: text='{}', braille_chars='{}'", &text, &braille_chars); @@ -2750,7 +2760,6 @@ impl BrailleChars { // also true (sort of) for capitalization -- if all caps, use double cap in front (assume abbr or Roman Numeral) // we only care about this for numbers and identifiers/text, so we filter for only those - let node_name = name(node); let is_in_enclosed_list = node_name != "mo" && BrailleChars::is_in_enclosed_list(node); let is_mn_in_enclosed_list = is_in_enclosed_list && node_name == "mn"; let mut typeface = "R".to_string(); // assumption is "R" and if attr or letter is different, something happens @@ -2760,7 +2769,15 @@ impl BrailleChars { // debug!(" face: {:?}, lang: {:?}, num {:?}, letter: {:?}, cap: {:?}, char: {:?}", // &caps["face"], &caps["lang"], &caps["num"], &caps["letter"], &caps["cap"], &caps["char"]); let mut nemeth_chars = "".to_string(); - let char_face = if caps["face"].is_empty() {attr_typeface} else {&caps["face"]}; + let face_stripped; + let char_face = if caps["face"].is_empty() { + attr_typeface + } else if italic_ok { + &caps["face"] + } else { + face_stripped = caps["face"].replace('I', ""); + &face_stripped + }; let typeface_changed = typeface != char_face; if typeface_changed { typeface = char_face.to_string(); // needs to outlast this instance of the loop @@ -2813,11 +2830,16 @@ impl BrailleChars { return Ok(braille_chars); } // mathvariant could be "sans-serif-bold-italic" -- get the parts + // Italic typeform for digits (GTM 2.7); math letters do not get italic (GTM 1.5). let math_variant = math_variant.unwrap(); - let italic = math_variant.contains("italic"); - if italic & !braille_chars.contains('I') { + let italic_ok = BrailleChars::uses_italic_typeform(name(node), &text); + let italic = italic_ok && math_variant.contains("italic"); + if italic && !braille_chars.contains('I') { braille_chars = "I".to_string() + &braille_chars; } + if !italic_ok { + braille_chars = braille_chars.replace('I', ""); + } let bold = math_variant.contains("bold"); if bold & !braille_chars.contains('B') { braille_chars = "B".to_string() + &braille_chars; @@ -2850,11 +2872,15 @@ impl BrailleChars { fn get_braille_russian_chars(node: Element, text_range: Option>) -> Result { let text = BrailleChars::substring(as_str!(as_text(node)), &text_range); - let braille_chars = braille_replace_chars(&text, node)?; + let mut braille_chars = braille_replace_chars(&text, node)?; let Some(raw_math_variant) = node.attribute_value("mathvariant") else { - return Ok(braille_chars); + return Ok(braille_chars.replace('I', "")); }; let math_variant = as_str!(raw_math_variant); + let italic_ok = BrailleChars::uses_italic_typeform(name(node), &text); + if !italic_ok { + braille_chars = braille_chars.replace('I', ""); + } let mut prefix = String::new(); let mut suffix = String::new(); @@ -2862,7 +2888,8 @@ impl BrailleChars { prefix.push('â »'); suffix.insert(0, 'â »'); } - if math_variant.contains("italic") && !braille_chars.contains('I') { + // Italic typeform only for digits (not math letters) + if math_variant.contains("italic") && italic_ok && !braille_chars.contains('I') { prefix.push('â ž'); suffix.insert(0, 'â ž'); } @@ -2898,16 +2925,27 @@ impl BrailleChars { let text = BrailleChars::substring(as_str!(as_text(node)), &text_range); let text = add_separator(text); - let braille_chars = braille_replace_chars(&text, node)?; + let mut braille_chars = braille_replace_chars(&text, node)?; // debug!("get_braille_ueb_chars: before/after unicode.yaml: '{}'/'{}'", text, braille_chars); if math_variant.is_none() { // nothing we need to do return Ok(braille_chars); } // mathvariant could be "sans-serif-bold-italic" -- get the parts + // CMU: italic typeform for digits only (not math letters) let math_variant = math_variant.unwrap(); + let italic_ok = BrailleChars::uses_italic_typeform(name(node), &text); + let italic = italic_ok && math_variant.contains("italic"); + if italic && !braille_chars.contains('I') { + braille_chars = "I".to_string() + &braille_chars; + } + if !italic_ok { + braille_chars = braille_chars.replace('I', ""); + } let bold = math_variant.contains("bold"); - let italic = math_variant.contains("italic"); + if bold && !braille_chars.contains('B') { + braille_chars = "B".to_string() + &braille_chars; + } let typeface = match HAS_TYPEFACE.find(math_variant) { None => "", Some(m) => match m.as_str() { diff --git a/tests/braille/UEB/other.rs b/tests/braille/UEB/other.rs index 35c7cfcf0..b31f9958f 100644 --- a/tests/braille/UEB/other.rs +++ b/tests/braille/UEB/other.rs @@ -227,3 +227,31 @@ fn unicode_subscript_chars_in_and_out_of_script_position() -> Result<()> { return Ok(()); } +#[test] +fn ueb_no_italic_typeform_for_math_letters() -> Result<()> { + // UEB omits italic typeform for math letters (GTM 1.5); Greek uses â š via G only. + // Plain, mathvariant italic, and Mathematical Italic x should match (no italic â š). + let plain = "x"; + let attr_italic = "x"; + let plane1_italic = "đ‘„"; + test_braille("UEB", plain, "â °â ­")?; + test_braille("UEB", attr_italic, "â °â ­")?; + test_braille("UEB", plane1_italic, "â °â ­")?; + + // Greek letter indicator (same cell as italic typeform) still used for α + test_braille("UEB", "α", "⠚⠁")?; + + // Bold-italic keeps bold ⠘, not italic typeform + test_braille("UEB", "x", "⠘⠆⠰⠭")?; + test_braille("UEB", "𝒙", "⠘⠆⠰⠭")?; + return Ok(()); +} + +#[test] +fn ueb_italic_typeform_for_digits() -> Result<()> { + // UEB uses italic typeform for digits (GTM 2.7 emphasis of numeric material). + test_braille("UEB", "3", "⠚⠆⠌⠉")?; + test_braille("UEB", ".3", "â šâ ‚â Œâ Č⠉")?; + return Ok(()); +} + From fbc49bb73cc1b6915f621fa8a63c39c306bdd852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Sun, 16 Aug 2026 09:52:39 +0200 Subject: [PATCH 033/162] Announce column separator (#679) * Add `HasVisibleColumnLine` XPath function to handle table separators in speech output - Replace `count_table_dims` return type with `usize` values for clarity. - Update function registration to include `HasVisibleColumnLine`. - Modify speech tests to reflect separator usage in matrix descriptions. * Refactor `count_table_dims` to return `Result` type and update usage sites * undo whitespace change * . * . * explain tests better in comments * explain tests better in comments * Add support for row separators and unify boundary line logic * fix check_table_line helper function * added a pause before separator announcements * Change pause duration from medium to short * Update test cases for matrix representations to add pause before separator --------- Co-authored-by: NSoiffer --- Rules/Languages/en/SharedRules/default.yaml | 11 ++ src/speech.rs | 2 +- src/xpath_functions.rs | 190 +++++++++++++++++++- tests/Languages/en/mtable.rs | 77 +++++++- 4 files changed, 269 insertions(+), 11 deletions(-) diff --git a/Rules/Languages/en/SharedRules/default.yaml b/Rules/Languages/en/SharedRules/default.yaml index 255c3bbf4..264c14540 100644 --- a/Rules/Languages/en/SharedRules/default.yaml +++ b/Rules/Languages/en/SharedRules/default.yaml @@ -478,6 +478,17 @@ - x: "count(preceding-sibling::*)+IfThenElse(parent::m:mlabeledtr, 0, 1)" - pause: medium - x: "*" + - test: + if: "HasVisibleColumnLine(../.., count(preceding-sibling::*) + 1)" + then: + - pause: short + - t: "separator" + - test: + # Announce a row separator only after the row's final cell, so it is spoken once per horizontal boundary. + if: "count(following-sibling::*) = 0 and HasVisibleRowLine(../.., count(../preceding-sibling::*) + 1)" + then: + - pause: short + - t: "row separator" - test: # short pause after each element; medium pause if last element in a row; long pause for last element in matrix - if: count(following-sibling::*) > 0 diff --git a/src/speech.rs b/src/speech.rs index 0aaf71405..eaaeff282 100644 --- a/src/speech.rs +++ b/src/speech.rs @@ -1761,7 +1761,7 @@ impl<'c, 'r> ContextStack<'c> { fn base_context(var_defs: PreferenceHashMap) -> sxd_xpath_no_unsafe::Context<'c> { let mut context = sxd_xpath_no_unsafe::Context::new(); context.set_namespace("m", "http://www.w3.org/1998/Math/MathML"); - crate::xpath_functions::add_builtin_functions(&mut context); + crate::xpath_functions::register_mathcat_xpath_functions(&mut context); for (key, value) in var_defs { context.set_variable(key.as_str(), yaml_to_value(&value)); // if let Some(str_value) = value.as_str() { diff --git a/src/xpath_functions.rs b/src/xpath_functions.rs index 6dc58aeac..587206f44 100644 --- a/src/xpath_functions.rs +++ b/src/xpath_functions.rs @@ -1646,9 +1646,86 @@ impl Function for CountTableColumns { } } +#[derive(Clone, Copy)] +enum TableLineAxis { + Row, + Column, +} + +/// Return whether a one-based mtable boundary has a visible line on the given axis. +/// +/// MathML repeats the final line style for remaining boundaries. Boundaries after +/// the final row or column, and values other than `solid` and `dashed`, do not +/// describe a visible separator. +fn has_visible_table_line(table: Element, boundary: usize, axis: TableLineAxis) -> bool { + if boundary == 0 || !is_tag(table, "mtable") { + return false; + } + + let Ok((Value::Number(row_count), Value::Number(column_count))) = CountTableDims::new().count_table_dims(table) else { + return false; + }; + let (line_count, attribute_name) = match axis { + TableLineAxis::Row => (row_count, "rowlines"), + TableLineAxis::Column => (column_count, "columnlines"), + }; + if boundary as f64 >= line_count { + return false; + } + + return table + .attribute_value(attribute_name) + .map(|values| { + matches!( + values.split_whitespace().take(boundary).last(), + Some("solid" | "dashed") + ) + }) + .unwrap_or(false); +} + +/// Validate and convert XPath arguments before delegating to the typed table-line helper. +fn evaluate_has_visible_table_line<'d>( + args: Vec>, + function_name: &str, + axis: TableLineAxis, +) -> Result, Error> { + let mut args = Args(args); + args.exactly(2)?; + let boundary = args.pop_number()?; + let table = validate_one_node(args.pop_nodeset()?, function_name)?; + let Node::Element(table) = table else { + return Err(Error::Other { what: format!("{function_name} requires an mtable element") }); + }; + if !boundary.is_finite() || boundary < 1.0 || boundary.fract() != 0.0 { + return Ok(Value::Boolean(false)); + } + return Ok(Value::Boolean(has_visible_table_line(table, boundary as usize, axis))); +} + +/// XPath function reporting whether an mtable column boundary has a visible line. +struct HasVisibleColumnLine; +impl Function for HasVisibleColumnLine { + fn evaluate<'c, 'd>(&self, + _context: &context::Evaluation<'c, 'd>, + args: Vec>) -> Result, Error> { + evaluate_has_visible_table_line(args, "HasVisibleColumnLine", TableLineAxis::Column) + } +} + +/// XPath function reporting whether an mtable row boundary has a visible line. +struct HasVisibleRowLine; +impl Function for HasVisibleRowLine { + fn evaluate<'c, 'd>(&self, + _context: &context::Evaluation<'c, 'd>, + args: Vec>) -> Result, Error> { + evaluate_has_visible_table_line(args, "HasVisibleRowLine", TableLineAxis::Row) + } +} + /// Add all the functions defined in this module to `context`. -pub fn add_builtin_functions(context: &mut Context) { +pub fn register_mathcat_xpath_functions(context: &mut Context) { context.set_function("NestingChars", crate::braille::NemethNestingChars); context.set_function("BrailleChars", crate::braille::BrailleChars); context.set_function("NeedsToBeGrouped", crate::braille::NeedsToBeGrouped); @@ -1671,6 +1748,8 @@ pub fn add_builtin_functions(context: &mut Context) { context.set_function("GetNavigationPartName", GetNavigationPartName); context.set_function("CountTableRows", CountTableRows); context.set_function("CountTableColumns", CountTableColumns); + context.set_function("HasVisibleColumnLine", HasVisibleColumnLine); + context.set_function("HasVisibleRowLine", HasVisibleRowLine); context.set_function("DEBUG", Debug); // Not used: remove?? @@ -1876,7 +1955,10 @@ mod tests { let package = parser::parse(mathml).map_err(|e| anyhow::anyhow!("failed to parse XML: {e}"))?; let math_elem = get_element(&package); let child = as_element(math_elem.children()[0]); - assert!(CountTableDims::new().count_table_dims(child) == Ok((Value::Number(dims.0 as f64), Value::Number(dims.1 as f64)))); + assert_eq!( + CountTableDims::new().count_table_dims(child), + Ok((Value::Number(dims.0 as f64), Value::Number(dims.1 as f64))) + ); return Ok( () ); } @@ -1896,6 +1978,110 @@ mod tests { }); } + fn check_table_line(mathml: &str, boundary: usize, axis: TableLineAxis, expected: bool) -> Result<()> { + let package = parser::parse(mathml).map_err(|e| anyhow::anyhow!("failed to parse XML: {e}"))?; + let math = get_element(&package); + let table = math + .children() + .iter() + .find_map(|child| match child { + ChildOfElement::Element(table) => Some(*table), + _ => None, + }) + .expect("test MathML should contain an mtable element"); + assert_eq!(has_visible_table_line(table, boundary, axis), expected); + return Ok(()); + } + + /// Verifies visible table-line styles, repeated styles, and boundaries outside the table. + #[test] + fn visible_table_lines() -> Result<()> { + return xpath_test(|| { + // The three values map in order to the three boundaries between four columns. + let mixed_column_lines: &str = " + + + column 1 + column 2 + column 3 + column 4 + + "; + check_table_line(mixed_column_lines, 1, TableLineAxis::Column, false)?; + check_table_line(mixed_column_lines, 2, TableLineAxis::Column, true)?; + check_table_line(mixed_column_lines, 3, TableLineAxis::Column, true)?; + + // The final `dashed` value repeats for the third column boundary. + let repeated_column_line: &str = " + + + column 1 + column 2 + column 3 + column 4 + + "; + check_table_line(repeated_column_line, 3, TableLineAxis::Column, true)?; + + // A table without `columnlines` has no visible column boundary. + let no_column_lines: &str = " + + + column 1 + column 2 + + "; + check_table_line(no_column_lines, 1, TableLineAxis::Column, false)?; + + // `none` explicitly makes the column boundary invisible. + let invisible_column_line: &str = " + + + column 1 + column 2 + + "; + check_table_line(invisible_column_line, 1, TableLineAxis::Column, false)?; + + // Only `solid` and `dashed` describe visible table lines. + let unsupported_column_line: &str = " + + + column 1 + column 2 + + "; + check_table_line(unsupported_column_line, 1, TableLineAxis::Column, false)?; + + // Boundary 2 is after the final column, not between two columns. + let two_column_table: &str = " + + column 1 + column 2 + + "; + check_table_line(two_column_table, 2, TableLineAxis::Column, false)?; + + // Four rows have three interior boundaries. `none` applies after row 1, + // `dashed` applies after row 2, and the final `dashed` repeats after row 3. + let mixed_row_lines: &str = " + + row 1 + row 2 + row 3 + row 4 + "; + check_table_line(mixed_row_lines, 1, TableLineAxis::Row, false)?; + check_table_line(mixed_row_lines, 2, TableLineAxis::Row, true)?; + check_table_line(mixed_row_lines, 3, TableLineAxis::Row, true)?; + // Boundary 4 is after the final row, not between two rows. + check_table_line(mixed_row_lines, 4, TableLineAxis::Row, false)?; + // Boundary zero is invalid for both axes. + check_table_line(mixed_row_lines, 0, TableLineAxis::Row, false)?; + return Ok(()); + }); + } + #[test] fn at_left_edge() -> Result<()> { return xpath_test(|| { diff --git a/tests/Languages/en/mtable.rs b/tests/Languages/en/mtable.rs index e6952cf51..8a670988e 100644 --- a/tests/Languages/en/mtable.rs +++ b/tests/Languages/en/mtable.rs @@ -271,8 +271,69 @@ fn augmented_matrix_2x3() -> Result<()> { ] "; - 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")?; + test("en", "ClearSpeak", expr, "the 2 by 3 augmented matrix; row 1; 3, 1, separator, 4; row 2; 0, 2, separator, 6")?; + test("en", "SimpleSpeak", expr, "the 2 by 3 augmented matrix; row 1; 3, 1, separator, 4; row 2; 0, 2, separator, 6")?; + Ok(()) +} + +#[test] +fn dashed_augmented_matrix_separator() -> Result<()> { + let expr = " + + [ + + 123 + + ] + "; + test("en", "ClearSpeak", expr, "the 1 by 3 row matrix; 1, separator, 2, separator, 3")?; + test("en", "SimpleSpeak", expr, "the 1 by 3 row matrix; 1, separator, 2, separator, 3")?; + Ok(()) +} + +/// A horizontal line is announced once, after the row it separates from the next row. +#[test] +fn matrix_row_separator() -> Result<()> { + let expr = " + + [ + + + 1 + 2 + + + 3 + 4 + + + ] + "; + test("en", "ClearSpeak", expr, "the 2 by 2 matrix; row 1; 1, 2, row separator; row 2; 3, 4")?; + test("en", "SimpleSpeak", expr, "the 2 by 2 matrix; row 1; 1, 2, row separator; row 2; 3, 4")?; + Ok(()) +} + +/// Horizontal and vertical lines use distinct announcements at their respective boundaries. +#[test] +fn matrix_row_and_column_separators() -> Result<()> { + let expr = " + + [ + + + 1 + 2 + + + 3 + 4 + + + ] + "; + test("en", "ClearSpeak", expr, "the 2 by 2 augmented matrix; row 1; 1, separator, 2, row separator; row 2; 3, separator, 4")?; + test("en", "SimpleSpeak", expr, "the 2 by 2 augmented matrix; row 1; 1, separator, 2, row separator; row 2; 3, separator, 4")?; Ok(()) } @@ -926,13 +987,13 @@ let expr = " "; 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")?; + expr, "the 3 by 4 augmented matrix; row 1; column 1; 1, column 2; 2, column 3; negative 1, separator, column 4; 3; \ + row 2; column 1; negative 3, column 2; 3, column 3; negative 1, separator, column 4; 2; \ + row 3; column 1; 2, column 2; 3, column 3; 2, separator, 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")?; + expr, "the 3 by 4 augmented matrix; row 1; column 1; 1, column 2; 2, column 3; negative 1, separator, column 4; 3; \ + row 2; column 1; negative 3, column 2; 3, column 3; negative 1, separator, column 4; 2; \ + row 3; column 1; 2, column 2; 3, column 3; 2, separator, column 4; negative 1; end matrix")?; Ok(()) } From d5c63d879c29e03f8a16e6432ca37c62fc587cd7 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Sun, 16 Aug 2026 00:57:10 -0700 Subject: [PATCH 034/162] fix clippy warnings in the no-unsafe version --- src/braille.rs | 8 ++++---- src/interface.rs | 6 +++--- src/navigate.rs | 4 ++-- tests/Languages/en/definitions.rs | 12 ++++-------- tests/Languages/hu/definitions.rs | 6 ++---- 5 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/braille.rs b/src/braille.rs index 929bcf791..9453f5ddf 100644 --- a/src/braille.rs +++ b/src/braille.rs @@ -2737,7 +2737,7 @@ impl BrailleChars { let raw_math_variant = node.attribute_value("mathvariant"); let math_variant = raw_math_variant.as_deref(); let text = BrailleChars::substring(as_str!(as_text(node)), &text_range); - let node_name = name(node); + let node_name = as_str!(name(node)); let italic_ok = BrailleChars::uses_italic_typeform(node_name, &text); let attr_typeface = match math_variant { None => "R", @@ -2832,7 +2832,7 @@ impl BrailleChars { // mathvariant could be "sans-serif-bold-italic" -- get the parts // Italic typeform for digits (GTM 2.7); math letters do not get italic (GTM 1.5). let math_variant = math_variant.unwrap(); - let italic_ok = BrailleChars::uses_italic_typeform(name(node), &text); + let italic_ok = BrailleChars::uses_italic_typeform(as_str!(name(node)), &text); let italic = italic_ok && math_variant.contains("italic"); if italic && !braille_chars.contains('I') { braille_chars = "I".to_string() + &braille_chars; @@ -2877,7 +2877,7 @@ impl BrailleChars { return Ok(braille_chars.replace('I', "")); }; let math_variant = as_str!(raw_math_variant); - let italic_ok = BrailleChars::uses_italic_typeform(name(node), &text); + let italic_ok = BrailleChars::uses_italic_typeform(as_str!(name(node)), &text); if !italic_ok { braille_chars = braille_chars.replace('I', ""); } @@ -2934,7 +2934,7 @@ impl BrailleChars { // mathvariant could be "sans-serif-bold-italic" -- get the parts // CMU: italic typeform for digits only (not math letters) let math_variant = math_variant.unwrap(); - let italic_ok = BrailleChars::uses_italic_typeform(name(node), &text); + let italic_ok = BrailleChars::uses_italic_typeform(as_str!(name(node)), &text); let italic = italic_ok && math_variant.contains("italic"); if italic && !braille_chars.contains('I') { braille_chars = "I".to_string() + &braille_chars; diff --git a/src/interface.rs b/src/interface.rs index 6486aa762..012345056 100644 --- a/src/interface.rs +++ b/src/interface.rs @@ -1373,11 +1373,11 @@ mod tests { set_mathml(good_mathml)?; let bad_mathml = "&xabc;"; assert!(set_mathml(bad_mathml).is_err()); - assert!(get_spoken_text()? == ""); + assert!(get_spoken_text()?.is_empty()); set_mathml(good_mathml)?; let bad_mathml = "garbage"; assert!(set_mathml(bad_mathml).is_err()); - assert!(get_spoken_text()? == ""); + assert!(get_spoken_text()?.is_empty()); return Ok( () ); }); } @@ -1404,7 +1404,7 @@ mod tests { x-y "; - set_mathml(&expr)?; + set_mathml(expr)?; let speech = get_spoken_text()?; // Rule-generated SSML must pass through verbatim (not XML-entity-encoded). assert!(!speech.contains("<")); diff --git a/src/navigate.rs b/src/navigate.rs index 0ef0f62bc..f893b3838 100644 --- a/src/navigate.rs +++ b/src/navigate.rs @@ -1004,10 +1004,10 @@ mod tests { match do_navigate_command_string(mathml, command) { Err(e) => { panic!("\nStarting at '{}', '{} failed.\n{}", - start_id, command, &crate::interface::errors_to_string(&e)) + start_id, command, crate::interface::errors_to_string(&e)) }, Ok(nav_speech) => { - let nav_speech = nav_speech.trim_end_matches(&[' ', ',', ';']); + let nav_speech = nav_speech.trim_end_matches([' ', ',', ';']); // debug!("Full speech: {}", nav_speech); if !result_id.is_empty() { let (id, _) = nav_stack.borrow().get_navigation_mathml_id(mathml); diff --git a/tests/Languages/en/definitions.rs b/tests/Languages/en/definitions.rs index 80197c8c3..adbae499c 100644 --- a/tests/Languages/en/definitions.rs +++ b/tests/Languages/en/definitions.rs @@ -597,13 +597,11 @@ fn linear_algebra_tests() -> Result<()> { " .to_string() } - "transpose" => format!( - " + "transpose" => " x - " - ), + ".to_string(), _ => format!( " @@ -713,14 +711,12 @@ fn geometry_prefix_tests() -> Result<()> { #[test] fn separator_tests() -> Result<()> { - let expr = format!( - " + let expr = " x y - " - ); + ".to_string(); test("en", "ClearSpeak", &expr, "x y")?; Ok(()) diff --git a/tests/Languages/hu/definitions.rs b/tests/Languages/hu/definitions.rs index bd84fb155..542f41885 100644 --- a/tests/Languages/hu/definitions.rs +++ b/tests/Languages/hu/definitions.rs @@ -705,14 +705,12 @@ fn geometry_prefix_tests() -> Result<()> { #[test] fn separator_tests() -> Result<()> { - let expr = format!( - " + let expr = " x y - " - ); + ".to_string(); test("hu", "ClearSpeak", &expr, "x y")?; Ok(()) From 78744ec32f52433ffd938b70d04e24705898fd06 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Sun, 16 Aug 2026 01:05:32 -0700 Subject: [PATCH 035/162] Revert changes to file from 6ecc412 --- Rules/Braille/Russian/unicode-full.yaml | 58 ++++++++++++------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/Rules/Braille/Russian/unicode-full.yaml b/Rules/Braille/Russian/unicode-full.yaml index b562dc302..813669ecc 100644 --- a/Rules/Braille/Russian/unicode-full.yaml +++ b/Rules/Braille/Russian/unicode-full.yaml @@ -57,7 +57,7 @@ - "𝚹-𝛀": # 0x1d6a8 - 0x1d6c0 - - tc: "BC" + - tc: "B" - spell: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙𝛚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" @@ -123,23 +123,23 @@ - spell: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" - "𝐮-𝑍": # 0x1d434 - 0x1d44d - - tc: "C" + - tc: "IC" - spell: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'abcdefghijklmnopqrstuvwxyz')" - "𝑎-𝑧": # 0x1d44e - 0x1d467 - - tc: "" + - tc: "I" - spell: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”đ‘•đ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" - "𝑹-𝒁": # 0x1d468 - 0x1d481 - - tc: "BC" + - tc: "BIC" - spell: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'abcdefghijklmnopqrstuvwxyz')" - "𝒂-𝒛": # 0x1d482 - 0x1d49b - - tc: "B" + - tc: "BI" - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 - - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'abcdefghijklmnopqrstuvwxyz')" + - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 - spell: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" @@ -148,7 +148,7 @@ - test: if: "not($IgnoreBold)" then: [tc: "B"] - - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'abcdefghijklmnopqrstuvwxyz')" + - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝗼-𝘇": # 0x1d5ee - 0x1d607 - test: @@ -157,27 +157,27 @@ - spell: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" - "𝘈-𝘡": # 0x1d608 - 0x1d621 - - tc: "C" - - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'abcdefghijklmnopqrstuvwxyz')" + - tc: "IC" + - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝘱-đ˜»": # 0x1d622 - 0x1d63b - - tc: "" + - tc: "I" - spell: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 - # - tc: "bold italicC" + # - tc: "bold italic" - test: if: "$IgnoreBold" - then: [tc: "C"] - else: [tc: "B"] - - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'abcdefghijklmnopqrstuvwxyz')" + then: [tc: I] + else: [tc: "BI"] + - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝙖-𝙯": # 0x1d656 - 0x1d66f # - tc: "bold italic" - test: if: "$IgnoreBold" - then: [tc: ""] - else: [tc: "B"] + then: [tc: I] + else: [tc: "BI"] - spell: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" - "𝙰-𝚉": # 0x1d670 - 0x1d689 @@ -194,7 +194,7 @@ - test: if: "not($IgnoreBold)" then: [tc: "B"] - - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - "𝛂-𝛚": # 0x1d6c2 - 0x1d6da - test: @@ -215,7 +215,7 @@ - spell: "translate('.', '𝛛𝛜𝛝𝛞𝛟𝛠𝛡', '∂ΔΞÎșφρπ')" - "𝛱-đ›ș": # 0x1d6e2 - 0x1d6fa - - tc: "C" + - tc: "IC" - spell: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›čđ›ș', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "đ›Œ-𝜔": # 0x1d6fc - 0x1d714 @@ -230,20 +230,20 @@ - spell: "translate('.', '𝜕𝜖𝜗𝜘𝜙𝜚𝜛', '∂ΔΞÎșφρπ')" - "𝜜-𝜮": # 0x1d71c - 0x1d734 - # - tc: "bold italicC" - - tc: 'BC⠁' + # - tc: "bold italic" + - tc: 'BIC⠁' - spell: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳𝜮', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "đœ¶-𝝎": # 0x1d736 - 0x1d74e - - tc: "B" + - tc: "BI" - spell: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđđŽ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "𝝏𝝐𝝑𝝒𝝓𝝔𝝕": # 0x1d74f - 0x1d755 - - tc: "B" + - tc: "BI" - spell: "translate('.', '𝝏𝝐𝝑𝝒𝝓𝝔𝝕', '∂ΔÎșΞφρπ')" - "đœ”": # 0x1d735 - - tc: "B" + - tc: "BI" - spell: "translate('.', 'đœ”', '∇')" - "𝝖-𝝼": # 0x1d756 - 0x1d76e @@ -263,19 +263,19 @@ - spell: "translate('.', 'đœ”', '∇')" - "𝞐-𝞹": # 0x1d790 - 0x1d7a8 - # - tc: "bold italicC" + # - tc: "bold italic" - test: if: "$IgnoreBold" - then: [tc: "C"] - else: [tc: "B"] - - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + then: [tc: I] + else: [tc: "BI"] + - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - "đžȘ-𝟂": # 0x1d7aa - 0x1d7c2 # - tc: "bold italic" - test: if: "$IgnoreBold" - then: [tc: ""] - else: [tc: "B"] + then: [tc: I] + else: [tc: "BI"] - spell: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸđŸ‚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "𝟃𝟄𝟅𝟆𝟇𝟈𝟉": # 0x1d7c3 - 0x1d7c9 From a1fc8e0750e32aeae96e00eb463748c97389613d Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Sun, 16 Aug 2026 01:33:24 -0700 Subject: [PATCH 036/162] missed this change that needed to be reverted for Russian braille --- src/braille.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/braille.rs b/src/braille.rs index 9453f5ddf..129fb7290 100644 --- a/src/braille.rs +++ b/src/braille.rs @@ -2871,16 +2871,13 @@ impl BrailleChars { } fn get_braille_russian_chars(node: Element, text_range: Option>) -> Result { + // Russian italic typeform for letters is left unchanged pending external advice. let text = BrailleChars::substring(as_str!(as_text(node)), &text_range); - let mut braille_chars = braille_replace_chars(&text, node)?; + let braille_chars = braille_replace_chars(&text, node)?; let Some(raw_math_variant) = node.attribute_value("mathvariant") else { - return Ok(braille_chars.replace('I', "")); + return Ok(braille_chars); }; let math_variant = as_str!(raw_math_variant); - let italic_ok = BrailleChars::uses_italic_typeform(as_str!(name(node)), &text); - if !italic_ok { - braille_chars = braille_chars.replace('I', ""); - } let mut prefix = String::new(); let mut suffix = String::new(); @@ -2888,8 +2885,7 @@ impl BrailleChars { prefix.push('â »'); suffix.insert(0, 'â »'); } - // Italic typeform only for digits (not math letters) - if math_variant.contains("italic") && italic_ok && !braille_chars.contains('I') { + if math_variant.contains("italic") && !braille_chars.contains('I') { prefix.push('â ž'); suffix.insert(0, 'â ž'); } From bc712eb8bed3442d2cfa90bfd8268cbf2d7537b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Sun, 16 Aug 2026 15:52:22 +0200 Subject: [PATCH 037/162] fix AGENTS.md instruction on `uv run pytest` --- AGENTS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AGENTS.md b/AGENTS.md index 0b10d8a5f..0696e6979 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -26,7 +26,7 @@ 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. From 6937925c0ec6aa4fbc001555219c7c3f8fc2efcd Mon Sep 17 00:00:00 2001 From: NSoiffer Date: Sun, 16 Aug 2026 22:48:04 -0700 Subject: [PATCH 038/162] Merge latest hu changes (#696) * Add few tweaks into the Rules/Languages/hu/definitions.yaml file, Added missing definitions.rs test file the test/Languages/hu directory, and added SimpleSpeak test directory the mroot and menclose tests (#646) * Do more localization in Rules/Languages/hu/definitions.yaml Signed-off-by: Attila Hammer * Add in Simplespeak tests the definition, mroot and menclose tests Signed-off-by: Attila Hammer * fix some werbs in intervals into rules/Languages/hu/ClearSpeak_rules.yaml and SimpleSpeak_rules.yaml Signed-off-by: Attila Hammer * Fix tests after interval Clearspeak and SimpleSpeak verb change Signed-off-by: Attila Hammer --------- Signed-off-by: Attila Hammer * Apply Hungarian unicode fixes from PR #673 * Update Hungarian language and test rules from PR #694 * Fix a mistake after the selective merge with definitions.yaml and definition.rs test file (#697) Signed-off-by: Attila Hammer --------- Signed-off-by: Attila Hammer Co-authored-by: hammera --- Rules/Languages/hu/ClearSpeak_Rules.yaml | 18 +- Rules/Languages/hu/SharedRules/default.yaml | 71 +++--- Rules/Languages/hu/SharedRules/general.yaml | 4 +- Rules/Languages/hu/SharedRules/geometry.yaml | 3 +- Rules/Languages/hu/definitions.yaml | 96 ++++++-- Rules/Languages/hu/navigate.yaml | 57 +++-- Rules/Languages/hu/unicode-full.yaml | 207 +++++++++++++++++- tests/Languages/hu/ClearSpeak/sets.rs | 18 +- .../hu/ClearSpeak/symbols_and_adornments.rs | 8 +- tests/Languages/hu/definitions.rs | 24 +- tests/Languages/hu/shared.rs | 6 +- 11 files changed, 398 insertions(+), 114 deletions(-) diff --git a/Rules/Languages/hu/ClearSpeak_Rules.yaml b/Rules/Languages/hu/ClearSpeak_Rules.yaml index 73d8eaf5e..434034698 100644 --- a/Rules/Languages/hu/ClearSpeak_Rules.yaml +++ b/Rules/Languages/hu/ClearSpeak_Rules.yaml @@ -568,27 +568,25 @@ - name: set tag: set - match: "." + # Empty set and braced/{set-builder} forms (typically 0–1 child). + # Multi-arg intent set($x,$y,...) and set($x) with @arg fall through to function-intent + # ("the set of 
"). + match: "count(*)=0 or (count(*)=1 and not(*[1][@arg]))" replace: - test: - if: "count(*)=0" then: [T: "az ĂŒres halmaz"] # phrase('the empty set') - - else_if: "count(*)=2" - then: - - test: - if: "$Verbosity!='Terse'" - then: [T: "az"] # phrase('the' empty set) - - T: "ĂŒres halmaz" # phrase(the 'empty set') - else_if: "count(*[1]/*)=3 and *[1]/*[2][self::m:mo][.=':' or .='|' or .='∣']" then: - test: if: "$Verbosity!='Terse'" - then: [T: ""] # phrase('the' set of all integers) - - x: "*[1]/*[1]" - - T: "melyekre teljesĂŒl, hogy" # phrase(this is a 'set of' numbers) + then: [T: ""] # phrase('the' empty set) + - T: "" # phrase(the 'empty set') - test: if: "$ClearSpeak_Sets != 'woAll'" then: [T: "minden"] # phrase(the set of 'all' integers) + - x: "*[1]/*[1]" + - T: "melyekre teljesĂŒl, hogy" # phrase(the set S 'such that' x is less than y) - x: "*[1]/*[3]" else: - test: diff --git a/Rules/Languages/hu/SharedRules/default.yaml b/Rules/Languages/hu/SharedRules/default.yaml index b218667df..54bbffc64 100644 --- a/Rules/Languages/hu/SharedRules/default.yaml +++ b/Rules/Languages/hu/SharedRules/default.yaml @@ -62,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 > 0 or @data-roman-numeral" # 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) @@ -237,26 +237,12 @@ - x: "*[2]" - T: "alatt" # phrase(x with z 'below' it) -# FIX: this only works for up to four dots (which is realistically all we need) -- name: dot-over - tag: modified-variable - match: "*[1][self::m:mi] and (*[2][translate(., '.', '')=''])" - replace: - - x: "*[1]" - - x: "IfThenElse(string-length(*[2])=1, 'pont', - IfThenElse(string-length(*[2])=2, 'pont pont', - IfThenElse(string-length(*[2])=3, 'pont pont pont', 'pont pont pont pont') - ))" - - pause: short - -# FIX: the 'translate' list is a little different from 'modified-variable', so we also include 'mover' (unify?) - name: diacriticals - tag: [mover, modified-variable] + tag: mover match: "*[1][self::m:mi] and *[2][translate(., '\u0306\u030c.\u00A8\u02D9\u20DB\u20DC`^ˇ~→¯_', '')='']" replace: - x: "*[1]" - x: "*[2]" - - pause: short - name: default tag: mover @@ -434,23 +420,22 @@ - T: "szkriptek vĂ©ge" # phrase(At this point 'end scripts' occurs) - name: default - tag: [mtable, array] + tag: mtable variables: - IsColumnSilent: "false()" - - NumColumns: "CountTableColumns(.)" - - NumRows: "CountTableRows(.)" + - NumColumns: "count(*[1]/*) - IfThenElse(*/self::m:mlabeledtr, 1, 0)" match: "." replace: - T: "tĂĄblĂĄzat" # phrase(the 'table with' 3 rows) - - x: "$NumRows" + - x: count(*) - test: - if: "$NumRows=1" + if: count(*)=1 then: [T: "sorral"] # phrase(the table with 1 'row') else: [T: "sorral"] # phrase(the table with 3 'rows') - T: "Ă©s" # phrase(the table with 3 rows 'and' 4 columns) - x: "$NumColumns" - test: - if: "$NumColumns=1" + if: "NumColumns=1" then: [T: "oszloppal"] # phrase(the table with 3 rows and 1 'column') else: [T: "oszloppal"] # phrase(the table with 3 rows and 4 'columns') - pause: long @@ -491,6 +476,18 @@ - x: "count(preceding-sibling::*)+IfThenElse(parent::m:mlabeledtr, 0, 1)" - pause: medium - x: "*" + - test: + # short pause after each element; medium pause if last element in a row; long pause for last element in matrix + if: "HasVisibleColumnLine(../.., count(preceding-sibling::*) + 1)" + then: + - pause: short + - T: "elvĂĄlasztĂł" + - test: + # Announce a row separator only after the row's final cell, so it is spoken once per horizontal boundary. + if: "count(following-sibling::*) = 0 and HasVisibleRowLine(../.., count(../preceding-sibling::*) + 1)" + then: + - pause: short + - T: "sorelvĂĄlasztĂł" - test: # short pause after each element; medium pause if last element in a row; long pause for last element in matrix - if: count(following-sibling::*) > 0 @@ -500,6 +497,7 @@ else: [pause: long] + - name: empty-box # The ordering below is the order in which words come out when there is more than one value # Note: @notation can contain more than one value @@ -720,16 +718,27 @@ replace: - x: "SpeakIntentName(name(.), $Verbosity, 'function')" - test: - if: "$Verbosity != 'Terse' and not(contains(@data-intent-property, ':literal:')) and - not(count(*)=2 and (IsInDefinition(*[1], 'TrigFunctionNames') or IsInDefinition(name(.), 'TerseFunctionNames')) and IsNode(*[2], 'simple'))" - then: [T: "", pause: auto] # phrase(sine 'of' 5) - - insert: - nodes: "*" - replace: - - test: - if: "not(contains(@data-intent-property, ':literal:'))" - then: [x: "','"] + - if: "IntentFunctionUseArityPath(name(.), 'function', count(*))" + then: + - x: "IntentFunctionGlueBefore(name(.), 'function', 1, count(*))" - pause: auto + - insert: + nodes: "*" + replace: + - x: "IntentFunctionGlueBefore(name(.), 'function', $InsertIndex, count(*))" + - pause: auto + else: + - test: + if: "$Verbosity != 'Terse' and not(contains(@data-intent-property, ':literal:')) and + not(count(*)=2 and (IsInDefinition(*[1], 'TrigFunctionNames') or IsInDefinition(name(.), 'TerseFunctionNames')) and IsNode(*[2], 'simple'))" + then: [T: "", pause: auto] # phrase(sine 'of' 5) + - insert: + nodes: "*" + replace: + - test: + if: "not(contains(@data-intent-property, ':literal:'))" + then: [x: "IntentFunctionArgSeparator(name(.), 'function', count(*))"] + - pause: auto - test: # speak "end ..." if not bracketed or last child is not simple and not last node if: "$Impairment = 'Blindness' and not(*[last()][IsBracketed(., '', '') or IsNode(., 'simple')] )" diff --git a/Rules/Languages/hu/SharedRules/general.yaml b/Rules/Languages/hu/SharedRules/general.yaml index 0637bf6e2..9013205e2 100644 --- a/Rules/Languages/hu/SharedRules/general.yaml +++ b/Rules/Languages/hu/SharedRules/general.yaml @@ -70,14 +70,14 @@ - name: real-part tag: real-part - match: "." + match: "count(*)=0" replace: - bookmark: "@id" - T: "valĂłs rĂ©sz" # phrase('the real part' of a complex number does not include the imaginary part) - name: imaginary-part tag: imaginary-part - match: "." + match: "count(*)=0" replace: - bookmark: "@id" - T: "kĂ©pzetes rĂ©sz" # phrase('the imaginary part' is part of a complex number) diff --git a/Rules/Languages/hu/SharedRules/geometry.yaml b/Rules/Languages/hu/SharedRules/geometry.yaml index c23f22526..c5a0ac601 100644 --- a/Rules/Languages/hu/SharedRules/geometry.yaml +++ b/Rules/Languages/hu/SharedRules/geometry.yaml @@ -60,7 +60,8 @@ - name: coordinate tag: coordinate - match: "." +# Intent forms coordinate($x,...) use @arg and fall through to function-intent / IntentMappings + match: "not(*[@arg])" replace: - test: if: "$Verbosity='Verbose'" diff --git a/Rules/Languages/hu/definitions.yaml b/Rules/Languages/hu/definitions.yaml index bdc649424..d66738ec4 100644 --- a/Rules/Languages/hu/definitions.yaml +++ b/Rules/Languages/hu/definitions.yaml @@ -1,14 +1,71 @@ --- - 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 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 -# Intent mappings must specify whether they are "prefix", "infix", "postfix", or "function" with an "=" sign -# If there are multiple fixities (e.g., see transpose), they are separated with "||" -# 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 Syntax: +# +# This section defines how each "intent" is spoken for various grammatical forms (fixities such as "prefix", "infix", "postfix", and "function"), +# along with supporting different verbosity levels. +# The syntax is a little bit complicated, but allows a declarative syntax so you don't have to write as many rules. +# +# For each intent, you specify spoken forms for one or more fixities using the syntax below. +# +# - Each mapping has the form: +# "": "= || = || ...", +# or just +# "": "", +# where is used for all forms if fixity and '=' are omitted. +# +# - If an intent has multiple fixities, separate them with "||". Spaces are allowed around delimiters for readability. +# - If only one ":" is present in **, it provides the 'terse' form, and the following string is used for both 'medium' and 'verbose'. +# - If more than one ":" is present, the string is split into 'terse', 'medium', and 'verbose' forms, in that order (each separated by ":"). +# - If no ":" is present, the same spoken form is used for all styles. +# +# - Use semicolons ";" to divide opening, main, and closing bracketing words within a speech string, where such words make sense. +# - If an intent has multiple fixities but a definition does not specify one, the first fixity listed is chosen by default. +# +# Functions and argument glue: +# - The "|" character delimits options describing how to glue arguments together when speaking function arguments. +# - Arity templates (multiple "|" options, or one option with ','-separated glue words): glue-word count +# implies arity; the final argument is preceded by "of". Example: "sum | over | from,to" +# - 1 arg: "sum of x" +# - 2 args: "sum over i of x" +# - 3 args: "sum from i to n of x" +# If no option matches the argument count, separators fall back to "comma". +# - Binary separator (exactly one "|" option, no commas in it): after "of", that word joins the two args. +# Example: "quotient": "function=integer part | divided by" → "integer part of x divided by y" +# If there are not exactly two args, separators fall back to "comma" (no real n-ary use of these words). +# +# BNF-like description: +# +# IntentMappingsEntry ::= ":" +# +# ::= ( "||" )* +# | +# +# ::= "=" +# +# ::= "prefix" | "infix" | "postfix" | "function" | "nofix" | "silent" +# +# ::= +# | "|" ( "|" )* +# +# ::= text +# # May use ":" to separate terse:medium:verbose forms. +# # May use ";" for bracketing (opening; main; closing). +# +# ::= text +# # One option, no commas: binary separator after "of" (e.g. "divided by"). +# # One option with "," or several "|" options: arity templates +# # (glue-word count = arg_count - 1; last arg preceded by "of"). +# # Unmatched arity (or binary glue with ≠2 args): fall back to "comma". +# +# ::= (applies to all fixities) +# +# Example: +# "absolute-value": "function= ; absolute value: the absolute value: the absolute value; end absolute value" +# "sum": "function=sum | over | from,to" +# "quotient": "function=integer part | divided by" +# - IntentMappings: { "indexed-by": "infix= alsĂł index kezdete; alsĂł index; alsĂł index vĂ©ge: alsĂł index vĂ©ge: alsĂł index vĂ©ge", "say-super": "infix=felsƑ index: felsƑ index: felsƑ index", # used with 'mo' for superscripts (e.g, "<") @@ -30,14 +87,14 @@ #"fraction":"function=fraction; over; end fraction", # NOTE: Fails "mixed-fraction":"infix=Ă©s", # NOTE: in website says function, but follow infix speech pattern. "greatest-common-divisor": "function=a legnagyobb közös osztĂł", - "quotient":"function=egĂ©sz rĂ©sz osztva", # NOTE: Logic somewhere here failing, becomes "divided by of x comma, y" instead of "integer part of x divided by y" + "quotient":"function=egĂ©sz rĂ©sz | osztva", # NOTE: Logic somewhere here failing, becomes "divided by of x comma, y" instead of "integer part of x divided by y" "evaluated-at":"infix=Ă©rtĂ©kelve || postfix=Ă©rtĂ©kkĂ©nt", - "remainder":"function=a maradĂ©k, osztva", + "remainder":"function=a maradĂ©k | osztva", "max":"function=max", "min":"function=min", "power":"infix=a hatvĂĄnyra", "root":"function=root", - "imaginary-part": "a kĂ©pzeletbeli rĂ©sz", + "imaginary-part": "function=a kĂ©pzeletbeli rĂ©sz: a kĂ©pzeletbeli rĂ©sz: a kĂ©pzeletbeli rĂ©sz", "least-common-multiple": "function=lcm: a legkisebb közös többszörös: a legkisebb közös többszörös", "complex-conjugate":"function=Komplex konjugĂĄlt", "complex-arg":"function=argumentum", @@ -74,15 +131,15 @@ "tends-to-from-below":"infix=alulrĂłl indul", ### Sets "set": "function= ; halmaz: a halmaz", - "set-difference":"function=kĂŒlönbsĂ©ghalmaz || infix=mĂ­nusz || postfix=kĂŒlönbsĂ©ghalmaza", # NOTE: not tested + "set-difference":"function=kĂŒlönbsĂ©ghalmaz | Ă©s || infix=mĂ­nusz", "complement":"function=komplemens", - "empty-set":"function=ĂŒres halmaz", + "empty-set":"nofix=ĂŒres halmaz", "cardinality":"function=szĂĄmossĂĄg", # NOTE: does not have a defined speech template in website "list":"function=lista", "tuple": "function= ; tuple: a tuple", ### Sequence and Series - "sum":"function= ; összegzĂ©s : összeg ; ", #: sum over : sum from; to", - "product":"function=szorzat || function=szorzat vĂ©ge || function=szorzat innen ide", + "sum": "function=összeg", + "product":"function=szorzat", ### Elementary classical functions "sine":"function=szinusz: szinusz", @@ -118,7 +175,7 @@ "variance":"function=variencia", "median":"function=mediĂĄn", "mode":"function=mĂłd", - "conditional-probability":"function=valĂłszĂ­nƱsĂ©g; adott", # NOTE: Check test + "conditional-probability":"function=valĂłszĂ­nƱsĂ©g", ### Linear Algebra @@ -133,7 +190,7 @@ "unit-vector":"prefix=egysĂ©gvektor", "identity-matrix":"nofix=identitĂĄsmĂĄtrix", # NOTE: no function specified - "transpose":"function=transzponĂĄlt || postfix=transzponĂĄlt", # postfix needs testing + "transpose":"postfix=transzponĂĄlt || function=transzponĂĄlt", "dimensional-product":"infix=a(z)", # INFIX @@ -164,10 +221,11 @@ ### General Concepts "fenced-group":"function=bekerĂ­tett csoport", # 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= ; a pĂĄr; Ă©s", # Needs to be tested, test converts "and" to "comma," + "ordered-pair": "function=a pĂĄr | Ă©s", # Needs to be tested, test converts "and" to "comma," "highlight":"postfix=kiemelt", "least-common-denominator":"function=legkisebb közös nevezƑ", "rate":"infix=per", + "translation":"function=fordĂ­tĂĄs", "constraint":"infix= ; feltĂ©tellel; ", "binomial-coefficient":"infix=vĂĄlaszt", @@ -269,7 +327,7 @@ ## Default fixity nofix "diameter":"nofix=ĂĄtmĂ©rƑ: ĂĄtmĂ©rƑ", "distance":"nofix=tĂĄvolsĂĄg; tĂĄvolsĂĄg: tĂĄvolsĂĄg", - "probability":"nofix=P: valĂłszĂ­nƱsĂ©g", + "probability":"nofix=P: valĂłszĂ­nƱsĂ©g || function=valĂłszĂ­nƱsĂ©g", "radius":"nofix=r: sugĂĄr", "volume":"nofix=hangerƑ: hangerƑ || function=hangerƑ", "exponential-e":"nofix=e", diff --git a/Rules/Languages/hu/navigate.yaml b/Rules/Languages/hu/navigate.yaml index ff4afb8bb..475e1f625 100644 --- a/Rules/Languages/hu/navigate.yaml +++ b/Rules/Languages/hu/navigate.yaml @@ -60,38 +60,40 @@ - pause: "medium" else: - test: + # CommandOffset is 1 + length of the English NavCommand stem (Zoom/Move/Read/Describe), + # not the spoken Prefix length — so translations can use a different Prefix word. - if: "starts-with($NavCommand, 'Zoom')" - then: [set_variables: [Prefix: "'zoom'"]] # phrase('zoom' in to see more details) + then: [set_variables: [Prefix: "'zoom'", CommandOffset: "5"]] # phrase('zoom' in to see more details) - else_if: "starts-with($NavCommand, 'Move')" - then: [set_variables: [Prefix: "'move'"]] # phrase('move' to next entry in table) + then: [set_variables: [Prefix: "'move'", CommandOffset: "5"]] # phrase('move' to next entry in table) - else_if: "starts-with($NavCommand, 'Read')" - then: [set_variables: [Prefix: "'read'"]] # phrase('read' to next entry in table) + then: [set_variables: [Prefix: "'read'", CommandOffset: "5"]] # phrase('read' to next entry in table) - else_if: "starts-with($NavCommand, 'Describe')" - then: [set_variables: [Prefix: "'describe'"]] # phrase('describe' to next entry in table) + then: [set_variables: [Prefix: "'describe'", CommandOffset: "9"]] # phrase('describe' to next entry in table) - test: if: "$Prefix != ''" then: - x: "$Prefix" - test: - - if: "substring($NavCommand, string-length($Prefix)+1) = 'In'" + - if: "substring($NavCommand, $CommandOffset) = 'In'" then: [T: "ban"] # phrase(zoom 'in' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'InAll'" + - else_if: "substring($NavCommand, $CommandOffset) = 'InAll'" # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets "ed" concatenated to "zoom" - then: [T: "Teljesen betĂĄplĂĄlva"] # phrase(zoom 'out all of the way' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Out'" + then: [T: "Teljesen kinagyĂ­tva"] # phrase(zoom 'out all of the way' to see more details) + - else_if: "substring($NavCommand, $CommandOffset) = 'Out'" then: [T: "ki"] # phrase(zoom 'out' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'OutAll'" + - else_if: "substring($NavCommand, $CommandOffset) = 'OutAll'" # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets "ed" concatenated to "zoom" - then: [T: "teljes tĂĄblĂĄzat megjelenĂ­tĂ©se\uF8FEe ki egĂ©szen"] # phrase(zoom 'out all of the way' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Next'" + then: [T: "teljes tĂĄblĂĄzat kinagyĂ­tĂĄsa"] # phrase(zoom 'out all of the way' to see more details) + - else_if: "substring($NavCommand, $CommandOffset) = 'Next'" then: [T: "jobbra"] # phrase(move to the 'right') - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Previous'" + - else_if: "substring($NavCommand, $CommandOffset) = 'Previous'" then: [T: "balra"] # phrase(move to the 'left') - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Current'" + - else_if: "substring($NavCommand, $CommandOffset) = 'Current'" then: [T: "jelenlegi"] # phrase(who is the 'current' president) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'LineStart'" + - else_if: "substring($NavCommand, $CommandOffset) = 'LineStart'" then: [T: "a sor elejĂ©re"] # phrase(move 'to start of line') - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'LineEnd'" + - else_if: "substring($NavCommand, $CommandOffset) = 'LineEnd'" then: [T: "a sor vĂ©gĂ©re"] # phrase(move 'to end of line') - pause: "medium" - set_variables: [MatchCounter: "$MatchCounter + 1"] @@ -103,6 +105,15 @@ (name(.)='mrow' or name(.) = 'mtr' or name(.) = 'mlabeledtr' or @data-from-mathml = 'mtable')" replace: [] +# Prefix/silent intents with no NavigationParts entry (e.g. unary minus, x-hat) +# should not announce "in"/"out of". +- name: into-or-out-of-prefix-or-silent-without-parts + tag: "*" + match: "$Move2D != '' and + (contains(@data-intent-property, ':prefix:') or contains(@data-intent-property, ':silent:')) and + GetNavigationPartName(name(.), count($Child2D/preceding-sibling::*)) = ''" + replace: [] + - name: into-or-out-of-mtr tag: [mtr, mlabeledtr] match: "$Move2D = 'in'" @@ -158,7 +169,21 @@ - else_if: "count(*) = 1" then_test: if: "$NavVerbosity = 'Verbose'" - then: [x: "translate(name(.), '-_', ' ')"] # e.g., "in absolute value" + then: # IntentMappings via SpeakIntentName; falls back to spaced intent name + - test: + - if: "contains(@data-intent-property, ':prefix:')" + then: [x: "SpeakIntentName(name(.), $Verbosity, 'prefix')"] + - else_if: "contains(@data-intent-property, ':postfix:')" + then: [x: "SpeakIntentName(name(.), $Verbosity, 'postfix')"] + - else_if: "contains(@data-intent-property, ':infix:')" + then: [x: "SpeakIntentName(name(.), $Verbosity, 'infix')"] + - else_if: "contains(@data-intent-property, ':function:')" + then: [x: "SpeakIntentName(name(.), $Verbosity, 'function')"] + - else_if: "contains(@data-intent-property, ':nofix:')" + then: [x: "SpeakIntentName(name(.), $Verbosity, 'nofix')"] + - else_if: "contains(@data-intent-property, ':silent:')" + then: [x: "SpeakIntentName(name(.), $Verbosity, 'silent')"] + - else: [x: "SpeakIntentName(name(.), $Verbosity, 'other')"] else: - T: "rĂ©sze" # phrase(the 'part' of the expression) - x: "count($Child2D/preceding-sibling::*) + 1" diff --git a/Rules/Languages/hu/unicode-full.yaml b/Rules/Languages/hu/unicode-full.yaml index 4ab669c7a..23381591d 100644 --- a/Rules/Languages/hu/unicode-full.yaml +++ b/Rules/Languages/hu/unicode-full.yaml @@ -1279,17 +1279,10 @@ - T: "zĂĄrĂłjeles" # (en: 'parenthesized', DeepL translation) - SPELL: "translate('.', 'â’œâ’â’žâ’Ÿâ’ â’Ąâ’ąâ’Łâ’€â’„â’Šâ’§â’šâ’©â’Șâ’«â’Źâ’­â’źâ’Żâ’°â’±â’Čâ’łâ’Žâ’”', 'abcdefghijklmnopqrstuvwxyz')" - - "Ⓐ-Ⓩ": # 0x24b6 - 0x24cf - - T: "bekarikĂĄzott" - - SPELL: "translate('.', 'â’¶â’·â’žâ’čâ’șâ’»â’Œâ’œâ’Ÿâ’żâ“€â“â“‚â“ƒâ“„â“…â“†â“‡â“ˆâ“‰â“Šâ“‹â“Œâ“â“Žâ“', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - "🅐-đŸ…©": # 0x1f150 - 0x1f169 - T: "fekete körrel jelölt" # (en: 'black circled', DeepL translation) - SPELL: "translate('.', 'đŸ…đŸ…‘đŸ…’đŸ…“đŸ…”đŸ…•đŸ…–đŸ…—đŸ…˜đŸ…™đŸ…šđŸ…›đŸ…œđŸ…đŸ…žđŸ…ŸđŸ… đŸ…ĄđŸ…ąđŸ…ŁđŸ…€đŸ…„đŸ…ŠđŸ…§đŸ…šđŸ…©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - "ⓐ-ⓩ": # 0x24d0 - 0x24e9 - - T: "bekarikĂĄzott" # (en: 'circled', DeepL translation) - - SPELL: "translate('.', 'â“â“‘â“’â““â“”â“•â“–â“—â“˜â“™â“šâ“›â“œâ“â“žâ“Ÿâ“ â“Ąâ“ąâ“Łâ“€â“„â“Šâ“§â“šâ“©', 'abcdefghijklmnopqrstuvwxyz')" - "â“Ș": [T: "bekarikĂĄzott nulla"] # 0x24ea (en: 'circled zero', DeepL translation) - "⓫": [T: "fekete kör alakĂș tizenegyes"] # 0x24eb (en: 'black circled eleven', DeepL translation) - "⓬": [T: "fekete bekarikĂĄzott tizenkettƑ"] # 0x24ec (en: 'black circled twelve', DeepL translation) @@ -3619,3 +3612,203 @@ - "\uE42C": [SPELL: "'←'"] # 0xe42c defer to def of arrow - "\uE42D": [SPELL: "'→'"] # 0xe42d defer to def of arrow - "\uE42E": [SPELL: "'⇄'"] # 0xe42e defer to def of arrow +# Following symbols hungarian translations are restored, because english unicode-full.yaml file again contains this symbols. +# Note: this restoration purpose only to audit translation tool doesn't show this difference with english unicode-full.yaml and hungarian unicode-full.yaml file. +# This symbols are defined too the hungarian unicode.yaml file. + - "ÂŹ": [T: "logikai nem"] # 0xac (en: 'not', DeepL translation) + - "ÂŽ": [T: "Ă©les Ă©kezet"] # 0xb4 (en: 'acute', DeepL translation) + - "·": # 0xB7 + - test: + if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolDot = 'Auto'" + then: [T: "szorozva"] # (en: 'dot', DeepL translation) + else: [T: "pont"] # (DeepL translation) + - "×": # 0xd7 + - test: + if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolX = 'Auto'" + then: [T: "szorozva"] + else_test: + if: $ClearSpeak_MultSymbolX = 'By' + then: [T: "szorozva"] + else: [T: "kereszt"] # (en: 'cross', DeepL translation) + - "Ă·": [T: "osztva"] # 0xf7 (en: 'divided by', DeepL translation) + - "̀": [T: "sĂșlyos Ă©kezet dĂ­szĂ­tĂ©s"] # 0x300 (en: 'grave accent embellishment', DeepL translation) + - "́": [T: "akut Ă©kezet dĂ­szĂ­tĂ©s"] # 0x301 (en: 'acute accent embellishment', DeepL translation) + - "̂": [T: "cirkumflex Ă©kezet dĂ­szĂ­tĂ©s"] # 0x302 (en: 'circumflex accent embellishment', DeepL translation) + - "̃": [T: "tilde"] # 0x303 (en: 'tilde embellishment', DeepL translation) + - "̄": [T: "makron"] # 0x304 (en: 'macron embellishment', DeepL translation) + - "̅": [T: "tĂșlszĂĄrnyalĂł dĂ­szĂ­tĂ©s"] # 0x305 (en: 'overbar embellishment', DeepL translation) + - "̆": [T: "rövid"] # 0x306 (DeepL translation) + - "̇": [T: "pont a dĂ­szĂ­tĂ©s felett"] # 0x307 (en: 'dot above embellishment', DeepL translation) + - "ϖ": [T: "pĂ­"] # 0x3d6 (DeepL translation) + - "Ï”": [T: "holdkĂłros epszilon"] # 0x3f5 (DeepL translation) + - "϶": [T: "fĂ©lhold alakĂș tĂŒkrözött görög epszilon"] # 0x3f6 (en: 'reversed epsilon', DeepL translation) + - "
": # 0x2026 + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak '
' as 'and so on...' unless expr starts with '
' + - "../*[1][.='
']" + then: [T: "pont pont pont"] # (en: 'dot dot dot', DeepL translation) + else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' + if: "count(following-sibling::*) = 0" + then: [T: "Ă©s Ă­gy tovĂĄbb"] # (en: 'and so on', DeepL translation) + else: [T: "Ă©s Ă­gy tovĂĄbb egĂ©szen az alĂĄbbi Ă©rtĂ©kig:"] # (en: 'and so on up to', DeepL translation) + - "ℓ": [T: "alsĂł index l"] # 0x2113 + - "ϕ": [T: "phi"] # 0x3d5 (DeepL translation) + - "⇒": [T: "dupla jobbranyĂ­l"] # 0x21d2 (en: 'right double arrow', DeepL translation) + - "∂": # 0x2202 + - test: + if: "$Verbosity='Terse'" + then: [T: "rĂ©szleges"] # (en: 'partial', DeepL translation) + else: [T: "parciĂĄlis derivĂĄlt"] # (en: 'partial derivative', DeepL translation) + - "∆": # 0x2206 + - test: + if: "following-sibling::*" + then_test: + if: "$Verbosity!='Terse'" + then: [T: "egy laplaciĂĄnus"] # "LahPlahsian" sounds better than "laplacian" in speech engines tested + else: [T: "laplaciĂĄnus"] + else: [T: "laplaciĂĄnus"] + + + - "∉": # 0x2209 + # rule is identical to 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: [T: "nem eleme ennek:"] + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "nincs benne:"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "nem tagja ennek:"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "nem eleme ennek:"] + - else: [T: "nem tartozik hozzĂĄ:"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "nem tagja az alĂĄbbi halmaznak:"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "nem eleme ennek:"] + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "nincs benne:"] + - else: [T: "nem tartozik hozzĂĄ:"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + + - "∊": # 0x220a + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: + - test: + if: "$Verbosity!='Terse' and not(parent::m:set)" # "the set x is an element of ..." sounds bad + then: [T: "van"] # (en: 'is', DeepL translation) + - T: "egy eleme" # (en: 'an element of', DeepL translation) + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: ""] # (DeepL translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "tagja ennek:"] # (en: 'member of', DeepL translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "eleme ennek:"] # (en: 'element of', DeepL translation) + - else: [T: "hozzĂĄtartozĂł eleme ennek:"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to', DeepL translation) + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "tagja az alĂĄbbi halmaznak:"] # (en: 'is a member of', DeepL translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "egy eleme ennek:"] # (en: 'is an element of', DeepL translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "benne van ebben:"] # (en: 'is in', DeepL translation) + - else: [T: "ebbe a halmazba tartozik:"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to', DeepL translation) + - "∐": [T: "diszjunkt uniĂł"] # 0x2210 (en: 'co-product', DeepL translation) + - "√": # 0x221a + - test: + if: "$Verbosity!='Terse'" + then: [T: "a"] # (en: 'the', DeepL translation) + - T: "nĂ©gyzetgyöke" # (en: 'square root of', DeepL translation) + - "∝": # 0x221d + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', DeepL translation) + - T: "arĂĄnyos" # (en: 'proportional to', DeepL translation) + - "∶": # 0x2236 + - test: + if: "$Verbosity!='Terse'" + then: [T: "van"] # (en: 'is', DeepL translation) + - T: "hogy" # (DeepL translation) + - "∟": # 0x223e + - test: + if: "$Verbosity!='Terse'" + then: [T: "van"] # (en: 'is', DeepL translation) + - T: "legpozitĂ­vabb" # (en: 'most positive', DeepL translation) + - "≠": # 0x2260 + - test: + if: "$Verbosity!='Terse'" + then: [T: "van"] # (en: 'is', DeepL translation) + - T: "nem egyenlƑ" # (en: 'not equal to', DeepL translation) + - "≡": # 0x2261 + - test: + if: "$Verbosity!='Terse'" + then: [T: "van"] # (en: 'is', DeepL translation) + - T: "azonos" # (en: 'identical to', DeepL translation) + - "⊂": # 0x2282 + - test: + if: "$Verbosity!='Terse'" + then: [T: "egy"] # (DeepL translation) + - T: "rĂ©szhalmaza" # (en: 'subset of', DeepL translation) + - "⊃": # 0x2283 + - test: + if: "$Verbosity!='Terse'" + then: [T: "egy"] # (DeepL translation) + - T: "szuperhalmaza ennek:" # (en: 'superset of', DeepL translation) + - "⊄": # 0x2284 + - test: + if: "$Verbosity!='Terse'" + then: [T: "egy"] # (en: 'is', DeepL translation) + - T: "nem rĂ©szhalmaza ennek:" # (en: 'not a subset of', DeepL translation) + - "⊅": # 0x2285 + - test: + if: "$Verbosity!='Terse'" + then: [T: "egy"] # (en: 'is', DeepL translation) + - T: "nem szuperhalmaza ennek:" # (DeepL translation) + - "⊆": # 0x2286 + - test: + if: "$Verbosity!='Terse'" + then: [T: "egy"] # (DeepL translation) + - T: "rĂ©szhalmaza vagy egyenlƑ" # (en: 'subset of or equal to', DeepL translation) + - "⊇": # 0x2287 + - test: + if: "$Verbosity!='Terse'" + then: [T: "egy"] # (DeepL translation) + - T: "szuperhalmaza vagy egyenlƑ" # (en: 'superset of or equal to', DeepL translation) + - "ⅆ": [T: "d"] # 0x2146 + - "": [T: "e"] # 0xed11 + - "ⅈ": [T: "i"] # 0x2148 + - "-": # 0xf52e - 0xf537 (old MathType) + - test: + if: "not($IgnoreBold)" + then: [T: "fĂ©lkövĂ©r"] + - SPELL: "translate('.', '', '0123456789')" + - "ⅇ": [T: "e"] # 0x2147 + - "Ⓐ-ⓩ": # 0x24b6 - 0x24cf + - T: "bekarikĂĄzott" + - SPELL: "translate('.', 'â’¶â’·â’žâ’čâ’șâ’»â’Œâ’œâ’Ÿâ’żâ“€â“â“‚â“ƒâ“„â“…â“†â“‡â“ˆâ“‰â“Šâ“‹â“Œâ“â“Žâ“', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "ⓐ-ⓩ": # 0x24d0 - 0x24e9 + - T: "bekarikĂĄzott" + - SPELL: "translate('.', 'â“â“‘â“’â““â“”â“•â“–â“—â“˜â“™â“šâ“›â“œâ“â“žâ“Ÿâ“ â“Ąâ“ąâ“Łâ“€â“„â“Šâ“§â“šâ“©', 'abcdefghijklmnopqrstuvwxyz')" + + + + + + + + + + + + diff --git a/tests/Languages/hu/ClearSpeak/sets.rs b/tests/Languages/hu/ClearSpeak/sets.rs index c2b9d589a..844e2a51c 100644 --- a/tests/Languages/hu/ClearSpeak/sets.rs +++ b/tests/Languages/hu/ClearSpeak/sets.rs @@ -223,7 +223,7 @@ fn set_with_colon() -> Result<()> { let expr = " { x:x>2 } "; - test("hu", "ClearSpeak", expr, "x melyekre teljesĂŒl, hogy minden x nagyobb, mint 2")?; + test("hu", "ClearSpeak", expr, "minden x melyekre teljesĂŒl, hogy x nagyobb, mint 2")?; return Ok(()); } @@ -234,7 +234,7 @@ fn set_with_bar() -> Result<()> { let expr = " { x|x>2 } "; - test("hu", "ClearSpeak", expr, "x melyekre teljesĂŒl, hogy minden x nagyobb, mint 2")?; + test("hu", "ClearSpeak", expr, "minden x melyekre teljesĂŒl, hogy x nagyobb, mint 2")?; return Ok(()); } @@ -285,7 +285,7 @@ fn complicated_set_with_colon() -> Result<()> { 7 } "; - test("hu", "ClearSpeak", expr, "x az egĂ©sz szĂĄmok halmaza melyekre teljesĂŒl, hogy minden 2 kisebb, mint x kisebb, mint 7")?; + test("hu", "ClearSpeak", expr, "minden x az egĂ©sz szĂĄmok halmaza melyekre teljesĂŒl, hogy 2 kisebb, mint x kisebb, mint 7")?; return Ok(()); } @@ -302,7 +302,7 @@ fn complicated_set_with_mtext() -> Result<()> { } "; test("hu", "ClearSpeak", expr, - "x a termĂ©szetes szĂĄmok halmaza melyekre teljesĂŒl, hogy minden x pĂĄros szĂĄm")?; + "minden x a termĂ©szetes szĂĄmok halmaza melyekre teljesĂŒl, hogy x pĂĄros szĂĄm")?; return Ok(()); } @@ -323,7 +323,7 @@ fn set_with_bar_member() -> Result<()> { } "; test_ClearSpeak("hu", "ClearSpeak_SetMemberSymbol", "Member", - expr, "x tagja az egĂ©sz szĂĄmok halmaza melyekre teljesĂŒl, hogy minden x nagyobb, mint 5")?; + expr, "minden x tagja az egĂ©sz szĂĄmok halmaza melyekre teljesĂŒl, hogy x nagyobb, mint 5")?; return Ok(()); } @@ -375,7 +375,7 @@ fn set_with_bar_element() -> Result<()> { } "; test_ClearSpeak("hu", "ClearSpeak_SetMemberSymbol", "Element", - expr, "x eleme ennek:, az egĂ©sz szĂĄmok halmaza melyekre teljesĂŒl, hogy minden x nagyobb, mint 5")?; + expr, "minden x eleme ennek:, az egĂ©sz szĂĄmok halmaza melyekre teljesĂŒl, hogy x nagyobb, mint 5")?; return Ok(()); } @@ -426,7 +426,7 @@ fn set_with_bar_in() -> Result<()> { } "; test_ClearSpeak("hu", "ClearSpeak_SetMemberSymbol", "In", - expr, "x az egĂ©sz szĂĄmok halmaza melyekre teljesĂŒl, hogy minden x nagyobb, mint 5")?; + expr, "minden x az egĂ©sz szĂĄmok halmaza melyekre teljesĂŒl, hogy x nagyobb, mint 5")?; return Ok(()); } @@ -477,7 +477,7 @@ fn set_with_bar_belongs() -> Result<()> { } "; test_ClearSpeak("hu", "ClearSpeak_SetMemberSymbol", "Belongs", - expr, "x hozzĂĄtartozĂł eleme ennek:, az egĂ©sz szĂĄmok halmaza melyekre teljesĂŒl, hogy minden x nagyobb, mint 5")?; + expr, "minden x hozzĂĄtartozĂł eleme ennek:, az egĂ©sz szĂĄmok halmaza melyekre teljesĂŒl, hogy x nagyobb, mint 5")?; return Ok(()); } @@ -563,7 +563,7 @@ fn silent_bracket() -> Result<()> { {x|x>2} "; test_ClearSpeak("hu", "ClearSpeak_Sets", "SilentBracket", expr, - "x melyekre teljesĂŒl, hogy minden x nagyobb, mint 2")?; + "minden x melyekre teljesĂŒl, hogy x nagyobb, mint 2")?; return Ok(()); } diff --git a/tests/Languages/hu/ClearSpeak/symbols_and_adornments.rs b/tests/Languages/hu/ClearSpeak/symbols_and_adornments.rs index ff38686c6..e137a3dd3 100644 --- a/tests/Languages/hu/ClearSpeak/symbols_and_adornments.rs +++ b/tests/Languages/hu/ClearSpeak/symbols_and_adornments.rs @@ -233,7 +233,7 @@ fn vertical_line_set() -> Result<()> { } "; test_ClearSpeak("hu", "ClearSpeak_VerticalLine", "Auto", expr, - "x melyekre teljesĂŒl, hogy minden x nagyobb, mint 0")?; + "minden x melyekre teljesĂŒl, hogy x nagyobb, mint 0")?; return Ok(()); } @@ -254,7 +254,7 @@ fn vertical_line_set_such_that() -> Result<()> { } "; test_ClearSpeak("hu", "ClearSpeak_VerticalLine", "SuchThat", expr, - "x melyekre teljesĂŒl, hogy minden x nagyobb, mint 0")?; + "minden x melyekre teljesĂŒl, hogy x nagyobb, mint 0")?; return Ok(()); } @@ -275,7 +275,7 @@ fn vertical_line_set_given() -> Result<()> { "; // the rules for set will override all the options -- ClearSpeak spec should be clarified test_ClearSpeak("hu", "ClearSpeak_VerticalLine", "Given", expr, - "x melyekre teljesĂŒl, hogy minden x nagyobb, mint 0")?; + "minden x melyekre teljesĂŒl, hogy x nagyobb, mint 0")?; return Ok(()); } @@ -299,7 +299,7 @@ fn vertical_line_set_and_abs() -> Result<()> { } "; test_ClearSpeak("hu", "ClearSpeak_VerticalLine", "Auto", expr, - "x melyekre teljesĂŒl, hogy minden x abszolĂșt Ă©rtĂ©ke; nagyobb, mint 2")?; + "minden x melyekre teljesĂŒl, hogy x abszolĂșt Ă©rtĂ©ke; nagyobb, mint 2")?; return Ok(()); } diff --git a/tests/Languages/hu/definitions.rs b/tests/Languages/hu/definitions.rs index 542f41885..62f910184 100644 --- a/tests/Languages/hu/definitions.rs +++ b/tests/Languages/hu/definitions.rs @@ -32,7 +32,7 @@ fn my_set_basic() -> Result<()> { "#; - test("hu", "ClearSpeak", expr, "az ĂŒres halmaz")?; + test("hu", "ClearSpeak", expr, "a halmaz x vesszƑ, y")?; Ok(()) } @@ -91,7 +91,7 @@ fn set_difference_basic() -> Result<()> { "#; - test( "hu", "ClearSpeak", expr, "kĂŒlönbsĂ©ghalmaz nagy a vesszƑ, nagy b")?; + test( "hu", "ClearSpeak", expr, "kĂŒlönbsĂ©ghalmaz nagy a Ă©s nagy b")?; Ok(()) } @@ -107,7 +107,7 @@ fn postfix_test() -> Result<()> { T "#, - "transzponĂĄlt x", + "x transzponĂĄlt", ), ( "highlight", @@ -205,9 +205,9 @@ fn functions_and_inverses_tests() -> Result<()> { //("fraction", "fraction x over y end fraction"), ("mixed-fraction", "x Ă©s y"), - ("quotient", "egĂ©sz rĂ©sz osztva x vesszƑ, y"), + ("quotient", "egĂ©sz rĂ©sz x osztva y"), ("evaluated-at", "x Ă©rtĂ©kelve y"), - ("remainder", "a maradĂ©k, osztva x vesszƑ, y"), + ("remainder", "a maradĂ©k x osztva y"), ("max", "max x vesszƑ, y vesszƑ, z"), ("min", "min x vesszƑ, y vesszƑ, z"), @@ -223,13 +223,13 @@ fn functions_and_inverses_tests() -> Result<()> { ("complex-conjugate", "Komplex konjugĂĄlt x"), ("complex-arg", "argumentum x"), - ("real-part", "valĂłs rĂ©sz"), - ("imaginary-part", "kĂ©pzetes rĂ©sz"), + ("real-part", "az igazi rĂ©sz x"), + ("imaginary-part", "a kĂ©pzeletbeli rĂ©sz x"), ("polar-coordinate", "polĂĄris koordinĂĄta x vesszƑ, y"), ("spherical-coordinate", "gömb koordinĂĄta x vesszƑ, y vesszƑ, z"), ("cartesian-coordinate", "derĂ©kszögƱ koordinĂĄta x vesszƑ, y vesszƑ, z"), - ("coordinate", "pont, x vesszƑ y vesszƑ z"), + ("coordinate", "koordinĂĄta x vesszƑ, y vesszƑ, z"), ("floor", "lĂ©pcsƑ x"), ("ceiling", "mennyezet x"), @@ -528,7 +528,7 @@ fn statistics_and_probability_tests() -> Result<()> { ("mode", "mĂłd x"), // conditional probability typically two arguments - // ("conditional-probability", "probability of x given y"), + // ("conditional-probability", "valĂłszĂ­nƱsĂ©g x adott y"), ]; for (intent, expected) in tests { @@ -576,7 +576,7 @@ fn linear_algebra_tests() -> Result<()> { ("span", "fesztĂĄvolsĂĄg x"), // transpose supports both postfix and function; we test function explicitly - ("transpose", "transzponĂĄlt x"), + ("transpose", "x transzponĂĄlt"), // dimensional product is infix ("dimensional-product", "x a(z) y"), @@ -727,13 +727,13 @@ fn general_concepts_tests() -> Result<()> { ("permutation-cycle", "permutĂĄciĂłs ciklus x"), // Binary structural / infix-style - // ("ordered-pair", "the pair of x and y"), + ("ordered-pair", "a pĂĄr x Ă©s y"), ("rate", "x per y"), ("binomial-coefficient", "x vĂĄlaszt y"), ("embellished-name", "x megjegyzĂ©ssel y"), ("indexed-by", "x alsĂł index y"), - // ("translation", "translation by x comma, y"), // Changes translation to comma + ("translation", "fordĂ­tĂĄs x vesszƑ, y"), // Changes translation to comma ("constraint", "x feltĂ©tellel y"), ]; diff --git a/tests/Languages/hu/shared.rs b/tests/Languages/hu/shared.rs index 23439e489..087a203a5 100644 --- a/tests/Languages/hu/shared.rs +++ b/tests/Languages/hu/shared.rs @@ -22,7 +22,7 @@ fn modified_vars() -> Result<()> { t → "; test("hu", "SimpleSpeak", expr, - "a sĂșlyozott, b tilde, c rövid, b ellenƑrzĂ©s, c sĂșlyozott; plusz, r hacsek karakter mint repĂŒlƑ Ă©kezet; plusz; x pont, y pont, z dupla pont, u hĂĄrmas pont, v nĂ©gyes pont; plusz x kalap, plusz vektor kezdete t")?; + "a sĂșlyozott, b tilde, c rövid, b ellenƑrzĂ©s, c sĂșlyozott; plusz, r hacsek karakter mint repĂŒlƑ Ă©kezet, plusz; x pont, y pont, z dupla pont, u hĂĄrmas pont, v nĂ©gyes pont; plusz x kalap, plusz vektor kezdete t")?; return Ok(()); } @@ -483,7 +483,7 @@ fn literal_speak_perpendicular() -> Result<()> { "#; - test("hu", "LiteralSpeak", expr, "nagy a jobbra nyĂ­l; merƑleges nagy b jobbra nyĂ­l")?; + test("hu", "LiteralSpeak", expr, "nagy a jobbra nyĂ­l, merƑleges nagy b jobbra nyĂ­l")?; return Ok(()); } @@ -569,7 +569,7 @@ fn literal_intent_property() -> Result<()> { "#; - test("hu", "SimpleSpeak", expr, "nagy a jobbra nyĂ­l; merƑleges nagy b jobbra nyĂ­l")?; + test("hu", "SimpleSpeak", expr, "nagy a jobbra nyĂ­l, merƑleges nagy b jobbra nyĂ­l")?; return Ok(()); } From adbf1e5bd0a4582b01d03b42314c008051580218 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Mon, 17 Aug 2026 14:16:39 -0700 Subject: [PATCH 039/162] move to release candidate --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index b5b30304f..45de0ad1f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mathcat" -version = "0.7.6-beta.9" +version = "0.7.6-rc.1" authors = ["Neil Soiffer "] license = "MIT" description = "MathCAT: Math Capable Assistive Technology ('Speech and braille from MathML')" From 2267de346891b8829294b572be10d08c251bf0eb Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Mon, 17 Aug 2026 15:38:16 -0700 Subject: [PATCH 040/162] Added creation of minified yaml files for an alternative Rules.zip --- .github/workflows/rust.yml | 49 +++++++++++++++++++++++++++++++++--- AGENTS.md | 1 + PythonScripts/pyproject.toml | 3 ++- 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 5a9f85b4a..2fbdcbd22 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -46,12 +46,15 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 + - uses: astral-sh/setup-uv@v10.0.1 - name: Remove empty Rules directories run: find Rules -type d -empty -delete - name: Remove test directory run: rm -r Rules/Languages/zz - - name: create Rules.zip - run: zip -r Rules.zip Rules + - name: Create Rules.zip + run: uv run --project PythonScripts package-rules Rules Rules.zip + - name: Create Rules-minimized.zip + run: uv run --project PythonScripts package-rules Rules Rules-minimized.zip --minimize - name: Upload Rules.zip uses: actions/upload-artifact@v7 with: @@ -59,12 +62,45 @@ jobs: path: 'Rules.zip' compression-level: 0 retention-days: 1 + - name: Upload Rules-minimized.zip + uses: actions/upload-artifact@v7 + with: + name: 'Rules-minimized.zip' + path: 'Rules-minimized.zip' + compression-level: 0 + retention-days: 1 + + test-rules-package: + name: Test (${{ matrix.feature_name }}, ${{ matrix.rules_zip }}) + needs: zip-rules + strategy: + fail-fast: false + matrix: + rules_zip: [Rules.zip, Rules-minimized.zip] + include: + - feature_name: default + features: "" + - feature_name: no-unsafe + features: "--features no-unsafe" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - name: Download ${{ matrix.rules_zip }} + uses: actions/download-artifact@v8 + with: + name: ${{ matrix.rules_zip }} + - name: Install packaged Rules + run: | + rm -rf Rules + unzip -q "${{ matrix.rules_zip }}" + - name: Run tests (${{ matrix.feature_name }}) + run: cargo test ${{ matrix.features }} --verbose 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: [build, clippy, zip-rules] + needs: [build, clippy, zip-rules, test-rules-package] runs-on: ubuntu-latest permissions: contents: write @@ -73,6 +109,10 @@ jobs: uses: actions/download-artifact@v8 with: name: Rules.zip + - name: download Rules-minimized.zip + uses: actions/download-artifact@v8 + with: + name: Rules-minimized.zip # Moving 'latest' prerelease (replaces marvinpinto/action-automatic-releases) - name: Development Build release env: @@ -90,4 +130,5 @@ jobs: --latest=false \ --title "Development Build" \ --notes "Development build from ${SHA}" \ - Rules.zip + Rules.zip \ + Rules-minimized.zip diff --git a/AGENTS.md b/AGENTS.md index 0696e6979..6cb6f5381 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,6 +13,7 @@ but add common mistakes of AI agents here instead. - `ClearSpeak_Rules.yaml`, `SimpleSpeak_Rules.yaml` - `SharedRules/`, `unicode.yaml`, `unicode-full.yaml`, `definitions.yaml`, `navigate.yaml` - `build.rs` can bundle rules into `rules.zip` when `include-zip` is enabled. +- CI packages `Rules.zip` (verbatim) and `Rules-minimized.zip` (flow-style `Languages/**/unicode*.yaml` only) via `uv run --project PythonScripts package-rules Rules [--minimize]`. ## Translation Conventions - `t:` means untranslated or unverified. diff --git a/PythonScripts/pyproject.toml b/PythonScripts/pyproject.toml index 7b9adf68d..8f754577c 100644 --- a/PythonScripts/pyproject.toml +++ b/PythonScripts/pyproject.toml @@ -22,6 +22,7 @@ dependencies = [ [project.scripts] audit-translations = "audit_translations.cli:main" +package-rules = "rules_packaging.cli:main" [dependency-groups] dev = [ @@ -37,7 +38,7 @@ build-backend = "uv_build" exclude-newer = "1 week" [tool.uv.build-backend] -module-name = "audit_translations" +module-name = ["audit_translations", "rules_packaging"] module-root = "" [tool.ruff] From 487ce7102fbc409a9819fd2316cce03176ac7441 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Mon, 17 Aug 2026 15:41:28 -0700 Subject: [PATCH 041/162] fix build problem --- PythonScripts/pyproject.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PythonScripts/pyproject.toml b/PythonScripts/pyproject.toml index 8f754577c..dced0ef1f 100644 --- a/PythonScripts/pyproject.toml +++ b/PythonScripts/pyproject.toml @@ -22,7 +22,7 @@ dependencies = [ [project.scripts] audit-translations = "audit_translations.cli:main" -package-rules = "rules_packaging.cli:main" +package-rules = "audit_translations.rules_packaging.cli:main" [dependency-groups] dev = [ @@ -31,14 +31,14 @@ dev = [ ] [build-system] -requires = ["uv_build>=0.9.25,<0.10.0"] +requires = ["uv_build>=0.9.25,<0.13"] build-backend = "uv_build" [tool.uv] exclude-newer = "1 week" [tool.uv.build-backend] -module-name = ["audit_translations", "rules_packaging"] +module-name = "audit_translations" module-root = "" [tool.ruff] From 65250fc7852a40be50bbf425bcc6aae46bcff7d7 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Mon, 17 Aug 2026 15:50:13 -0700 Subject: [PATCH 042/162] try again for creation of minified yaml files for an alternative Rules.zip --- .github/workflows/rust.yml | 4 ++-- AGENTS.md | 2 +- PythonScripts/pyproject.toml | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 2fbdcbd22..92f53f247 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -52,9 +52,9 @@ jobs: - name: Remove test directory run: rm -r Rules/Languages/zz - name: Create Rules.zip - run: uv run --project PythonScripts package-rules Rules Rules.zip + run: uv run PythonScripts/package_rules.py Rules Rules.zip - name: Create Rules-minimized.zip - run: uv run --project PythonScripts package-rules Rules Rules-minimized.zip --minimize + run: uv run PythonScripts/package_rules.py Rules Rules-minimized.zip --minimize - name: Upload Rules.zip uses: actions/upload-artifact@v7 with: diff --git a/AGENTS.md b/AGENTS.md index 6cb6f5381..270ebd606 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,7 +13,7 @@ but add common mistakes of AI agents here instead. - `ClearSpeak_Rules.yaml`, `SimpleSpeak_Rules.yaml` - `SharedRules/`, `unicode.yaml`, `unicode-full.yaml`, `definitions.yaml`, `navigate.yaml` - `build.rs` can bundle rules into `rules.zip` when `include-zip` is enabled. -- CI packages `Rules.zip` (verbatim) and `Rules-minimized.zip` (flow-style `Languages/**/unicode*.yaml` only) via `uv run --project PythonScripts package-rules Rules [--minimize]`. +- CI packages `Rules.zip` (verbatim) and `Rules-minimized.zip` (flow-style `Languages/**/unicode*.yaml` only) via `uv run PythonScripts/package_rules.py Rules [--minimize]`. ## Translation Conventions - `t:` means untranslated or unverified. diff --git a/PythonScripts/pyproject.toml b/PythonScripts/pyproject.toml index dced0ef1f..7b9adf68d 100644 --- a/PythonScripts/pyproject.toml +++ b/PythonScripts/pyproject.toml @@ -22,7 +22,6 @@ dependencies = [ [project.scripts] audit-translations = "audit_translations.cli:main" -package-rules = "audit_translations.rules_packaging.cli:main" [dependency-groups] dev = [ @@ -31,7 +30,7 @@ dev = [ ] [build-system] -requires = ["uv_build>=0.9.25,<0.13"] +requires = ["uv_build>=0.9.25,<0.10.0"] build-backend = "uv_build" [tool.uv] From 0bac005d9cc07e734e7b0b29264280fd7a760f0b Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Mon, 17 Aug 2026 16:00:34 -0700 Subject: [PATCH 043/162] try again -- needs to run on linux --- .github/workflows/rust.yml | 4 ++-- AGENTS.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 92f53f247..8b3d6600b 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -52,9 +52,9 @@ jobs: - name: Remove test directory run: rm -r Rules/Languages/zz - name: Create Rules.zip - run: uv run PythonScripts/package_rules.py Rules Rules.zip + run: uv run --script PythonScripts/package_rules.py Rules Rules.zip - name: Create Rules-minimized.zip - run: uv run PythonScripts/package_rules.py Rules Rules-minimized.zip --minimize + run: uv run --script PythonScripts/package_rules.py Rules Rules-minimized.zip --minimize - name: Upload Rules.zip uses: actions/upload-artifact@v7 with: diff --git a/AGENTS.md b/AGENTS.md index 270ebd606..a5632ced5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,7 +13,7 @@ but add common mistakes of AI agents here instead. - `ClearSpeak_Rules.yaml`, `SimpleSpeak_Rules.yaml` - `SharedRules/`, `unicode.yaml`, `unicode-full.yaml`, `definitions.yaml`, `navigate.yaml` - `build.rs` can bundle rules into `rules.zip` when `include-zip` is enabled. -- CI packages `Rules.zip` (verbatim) and `Rules-minimized.zip` (flow-style `Languages/**/unicode*.yaml` only) via `uv run PythonScripts/package_rules.py Rules [--minimize]`. +- CI packages `Rules.zip` (verbatim) and `Rules-minimized.zip` (flow-style `Languages/**/unicode*.yaml` only) via `uv run --script PythonScripts/package_rules.py Rules [--minimize]`. ## Translation Conventions - `t:` means untranslated or unverified. From 80b749aec6bbb6aa453a8f7c354ee8426751755d Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Mon, 17 Aug 2026 16:13:25 -0700 Subject: [PATCH 044/162] Add standalone Rules packaging script --- PythonScripts/package_rules.py | 50 ++++++++ PythonScripts/rules_packaging/__init__.py | 5 + PythonScripts/rules_packaging/minimize.py | 108 ++++++++++++++++++ PythonScripts/rules_packaging/package.py | 47 ++++++++ .../rules_packaging/tests/__init__.py | 1 + .../rules_packaging/tests/test_package.py | 101 ++++++++++++++++ 6 files changed, 312 insertions(+) create mode 100644 PythonScripts/package_rules.py create mode 100644 PythonScripts/rules_packaging/__init__.py create mode 100644 PythonScripts/rules_packaging/minimize.py create mode 100644 PythonScripts/rules_packaging/package.py create mode 100644 PythonScripts/rules_packaging/tests/__init__.py create mode 100644 PythonScripts/rules_packaging/tests/test_package.py diff --git a/PythonScripts/package_rules.py b/PythonScripts/package_rules.py new file mode 100644 index 000000000..905a7bc90 --- /dev/null +++ b/PythonScripts/package_rules.py @@ -0,0 +1,50 @@ +# /// script +# requires-python = ">=3.14" +# dependencies = ["pyyaml"] +# /// +"""Package MathCAT Rules/ into Rules.zip or Rules-minimized.zip.""" + +from __future__ import annotations + +import argparse +import sys +from pathlib import Path + +# Standalone script: sibling package, not installed via audit_translations. +sys.path.insert(0, str(Path(__file__).resolve().parent)) + +from rules_packaging.package import package_rules # noqa: E402 + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser( + description="Package MathCAT Rules/ into a zip archive. " + "Use --minimize for flow-style unicode.yaml / unicode-full.yaml without comments." + ) + parser.add_argument("source", type=Path, help="Path to the Rules directory") + parser.add_argument("output", type=Path, help="Output zip file path (e.g. Rules.zip)") + parser.add_argument( + "--minimize", + action="store_true", + help="Emit compact flow-style YAML (comments and block formatting removed)", + ) + args = parser.parse_args(argv) + + try: + stats = package_rules(args.source, args.output, minimize=args.minimize) + except (FileNotFoundError, ValueError) as exc: + print(f"error: {exc}", file=sys.stderr) + return 1 + + label = "minimized" if args.minimize else "standard" + print(f"Created {label} archive: {args.output}") + if args.minimize: + print(f" minimized YAML files: {stats['minimized_yaml_files']}") + print(f" copied verbatim: {stats['copied_files']}") + for warning in stats["warnings"]: + print(f" warning: {warning}", file=sys.stderr) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/PythonScripts/rules_packaging/__init__.py b/PythonScripts/rules_packaging/__init__.py new file mode 100644 index 000000000..07c96c9d2 --- /dev/null +++ b/PythonScripts/rules_packaging/__init__.py @@ -0,0 +1,5 @@ +"""Standalone Rules zip packaging and YAML minimization (not part of audit_translations).""" + +from .package import package_rules + +__all__ = ["package_rules"] diff --git a/PythonScripts/rules_packaging/minimize.py b/PythonScripts/rules_packaging/minimize.py new file mode 100644 index 000000000..7fb6a05d5 --- /dev/null +++ b/PythonScripts/rules_packaging/minimize.py @@ -0,0 +1,108 @@ +"""Convert MathCAT Rules YAML files to compact flow-style form.""" + +from __future__ import annotations + +import re +from pathlib import Path +from typing import Any + +import yaml + +YAML_SUFFIXES = {".yaml", ".yml"} +MINIMIZE_NAMES = {"unicode.yaml", "unicode-full.yaml"} + + +def should_minimize(path: Path) -> bool: + if path.suffix.lower() not in YAML_SUFFIXES or path.name not in MINIMIZE_NAMES: + return False + # Speech unicode only — braille unicode.yaml keeps block form (tests and edits rely on it). + return "Languages" in path.parts + + +def _configure_yaml_dumper() -> None: + """Quote all strings so yaml-rust does not treat words like 'infinity' as floats.""" + + def represent_str(dumper: yaml.SafeDumper, data: str) -> yaml.nodes.ScalarNode: + return dumper.represent_scalar("tag:yaml.org,2002:str", data, style='"') + + yaml.add_representer(str, represent_str, Dumper=yaml.SafeDumper) + + +_configure_yaml_dumper() + + +def preprocess_for_load(text: str) -> str: + """Normalize MathCAT YAML quirks so PyYAML can parse it.""" + text = text.replace("\t", " ") + # Bare double-quote or colon used as a mapping key in unicode list entries. + text = re.sub(r'(?m)^(\s*-\s*)":(\s*:\s*)', r'\1"\\"":\2', text) + text = re.sub(r'(?m)^(\s*-\s*)\\"(\s*:\s*)', r'\1"\\""\2', text) + return text + + +def load_yaml(text: str) -> Any: + """Load YAML using PyYAML with MathCAT-specific normalizations.""" + candidates = (text, text.replace("\t", " "), preprocess_for_load(text)) + last_error: yaml.YAMLError | None = None + for candidate in candidates: + try: + return yaml.safe_load(candidate) + except yaml.YAMLError as exc: + last_error = exc + if last_error is not None: + raise last_error + return None + + +def dump_flow_style(data: Any) -> str: + """Emit minimized flow-style YAML without comments.""" + if data is None: + return "" + dumped = yaml.dump( + data, + allow_unicode=True, + default_flow_style=True, + width=10**9, + sort_keys=False, + Dumper=yaml.SafeDumper, + ) + return dumped if dumped.endswith("\n") else f"{dumped}\n" + + +def minimize_yaml_text(text: str) -> tuple[str, bool]: + """Return flow-style YAML and whether parsing succeeded.""" + try: + data = load_yaml(text) + except yaml.YAMLError: + return text, False + return dump_flow_style(data), True + + +def copy_rules_tree(source: Path, destination: Path, *, minimize: bool) -> tuple[int, int, list[str]]: + """Copy ``source`` Rules tree to ``destination``, optionally minimizing YAML.""" + minimized = 0 + copied = 0 + warnings: list[str] = [] + + for src_path in sorted(source.rglob("*")): + if src_path.is_dir(): + continue + rel = src_path.relative_to(source) + dest_path = destination / rel + dest_path.parent.mkdir(parents=True, exist_ok=True) + + if minimize and should_minimize(src_path): + text = src_path.read_text(encoding="utf-8") + out, ok = minimize_yaml_text(text) + if ok: + dest_path.write_text(out, encoding="utf-8", newline="\n") + minimized += 1 + else: + dest_path.write_bytes(src_path.read_bytes()) + warnings.append(f"could not minimize {rel}; copied verbatim") + copied += 1 + else: + dest_path.write_bytes(src_path.read_bytes()) + copied += 1 + + return minimized, copied, warnings diff --git a/PythonScripts/rules_packaging/package.py b/PythonScripts/rules_packaging/package.py new file mode 100644 index 000000000..9b3c47f9d --- /dev/null +++ b/PythonScripts/rules_packaging/package.py @@ -0,0 +1,47 @@ +"""Create Rules.zip archives from a Rules directory tree.""" + +from __future__ import annotations + +import shutil +import tempfile +import zipfile +from pathlib import Path + +from .minimize import copy_rules_tree + + +def zip_directory(source_dir: Path, zip_path: Path) -> None: + """Write ``source_dir`` contents into ``zip_path`` preserving relative paths.""" + zip_path.parent.mkdir(parents=True, exist_ok=True) + with zipfile.ZipFile(zip_path, "w", compression=zipfile.ZIP_DEFLATED, compresslevel=9) as archive: + for path in sorted(source_dir.rglob("*")): + if path.is_file(): + archive.write(path, path.relative_to(source_dir.parent).as_posix()) + + +def package_rules(source: Path, output: Path, *, minimize: bool = False) -> dict[str, int | list[str]]: + """Package ``source`` (Rules directory) into ``output`` zip file.""" + source = source.resolve() + output = output.resolve() + + if not source.is_dir(): + raise FileNotFoundError(f"Rules source directory not found: {source}") + if source.name != "Rules": + raise ValueError(f"Expected a directory named 'Rules', got '{source.name}'") + + with tempfile.TemporaryDirectory(prefix="mathcat-rules-") as tmp: + staging_root = Path(tmp) + staged_rules = staging_root / "Rules" + if minimize: + minimized, copied, warnings = copy_rules_tree(source, staged_rules, minimize=True) + else: + shutil.copytree(source, staged_rules) + minimized, copied, warnings = 0, sum(1 for p in staged_rules.rglob("*") if p.is_file()), [] + + zip_directory(staged_rules, output) + + return { + "minimized_yaml_files": minimized, + "copied_files": copied, + "warnings": warnings, + } diff --git a/PythonScripts/rules_packaging/tests/__init__.py b/PythonScripts/rules_packaging/tests/__init__.py new file mode 100644 index 000000000..b5d3c1aa2 --- /dev/null +++ b/PythonScripts/rules_packaging/tests/__init__.py @@ -0,0 +1 @@ +"""Tests for rules packaging.""" diff --git a/PythonScripts/rules_packaging/tests/test_package.py b/PythonScripts/rules_packaging/tests/test_package.py new file mode 100644 index 000000000..a8364c93a --- /dev/null +++ b/PythonScripts/rules_packaging/tests/test_package.py @@ -0,0 +1,101 @@ +"""Tests for Rules packaging and YAML minimization.""" + +from __future__ import annotations + +import zipfile +from pathlib import Path + +import yaml + +from rules_packaging.minimize import dump_flow_style, load_yaml, minimize_yaml_text +from rules_packaging.package import package_rules + + +def test_minimize_yaml_strips_comments_and_uses_flow_style() -> None: + """Minimized YAML drops comments and uses flow-style collections.""" + source = """--- +# comment + - \"+\": [t: \"plus\"] # inline +""" + minimized, ok = minimize_yaml_text(source) + assert ok + assert "#" not in minimized + assert "[" in minimized and "{" in minimized or "t:" in minimized + assert load_yaml(minimized) == load_yaml(source) + + +def test_package_rules_standard_zip_layout(tmp_path: Path) -> None: + """Standard packaging preserves Rules/ prefix inside the zip.""" + rules = tmp_path / "Rules" + rules.mkdir() + (rules / "prefs.yaml").write_text("- SpeechStyle: [t: \"ClearSpeak\"]\n", encoding="utf-8") + + output = tmp_path / "Rules.zip" + package_rules(rules, output, minimize=False) + + with zipfile.ZipFile(output) as archive: + names = archive.namelist() + assert "Rules/prefs.yaml" in names + + +def test_dump_flow_style_quotes_infinity() -> None: + """Flow-style dump must quote 'infinity' so yaml-rust does not read it as a float.""" + minimized = dump_flow_style([{"∞": [{"t": "infinity"}]}]) + assert '"infinity"' in minimized + assert "t: infinity" not in minimized + + +def test_should_not_minimize_braille_unicode(tmp_path: Path) -> None: + """Braille unicode.yaml is copied verbatim even when minimization is enabled.""" + rules = tmp_path / "Rules" + braille = rules / "Braille" / "Nemeth" + braille.mkdir(parents=True) + source = """--- + - "1": [t: "N⠂"] +""" + (braille / "unicode.yaml").write_text(source, encoding="utf-8") + + output = tmp_path / "Rules-minimized.zip" + stats = package_rules(rules, output, minimize=True) + + assert stats["minimized_yaml_files"] == 0 + with zipfile.ZipFile(output) as archive: + text = archive.read("Rules/Braille/Nemeth/unicode.yaml").decode("utf-8") + assert text.replace("\r\n", "\n") == source.replace("\r\n", "\n") + + +def test_package_rules_minimized_smaller_than_standard(tmp_path: Path) -> None: + """Minimized archives use flow-style YAML and are not larger than standard.""" + rules = tmp_path / "Rules" + lang = rules / "Languages" / "en" + lang.mkdir(parents=True) + (lang / "unicode.yaml").write_text( + """--- +# header comment + - \"+\": [t: \"plus\"] # trailing + - \"-\": [t: \"minus\"] +""", + encoding="utf-8", + ) + (lang / "definitions.yaml").write_text( + """--- + - AdditionalFunctionNames: + - real=inf +""", + encoding="utf-8", + ) + + standard = tmp_path / "Rules.zip" + minimized = tmp_path / "Rules-minimized.zip" + package_rules(rules, standard, minimize=False) + stats = package_rules(rules, minimized, minimize=True) + + assert stats["minimized_yaml_files"] == 1 + assert minimized.stat().st_size <= standard.stat().st_size + + with zipfile.ZipFile(minimized) as archive: + unicode_text = archive.read("Rules/Languages/en/unicode.yaml").decode("utf-8") + defs_text = archive.read("Rules/Languages/en/definitions.yaml").decode("utf-8") + assert "#" not in unicode_text + assert "real=inf" in defs_text + assert yaml.safe_load(unicode_text) is not None From b1f15e94c7b6a79ee77b62eeed773ee7605bdb90 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Mon, 17 Aug 2026 16:13:53 -0700 Subject: [PATCH 045/162] try again with more files in github --- .github/workflows/rust.yml | 4 ++-- AGENTS.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 8b3d6600b..8183f9029 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -52,9 +52,9 @@ jobs: - name: Remove test directory run: rm -r Rules/Languages/zz - name: Create Rules.zip - run: uv run --script PythonScripts/package_rules.py Rules Rules.zip + run: uv run --no-project --script PythonScripts/package_rules.py Rules Rules.zip - name: Create Rules-minimized.zip - run: uv run --script PythonScripts/package_rules.py Rules Rules-minimized.zip --minimize + run: uv run --no-project --script PythonScripts/package_rules.py Rules Rules-minimized.zip --minimize - name: Upload Rules.zip uses: actions/upload-artifact@v7 with: diff --git a/AGENTS.md b/AGENTS.md index a5632ced5..f3b6670c4 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,7 +13,7 @@ but add common mistakes of AI agents here instead. - `ClearSpeak_Rules.yaml`, `SimpleSpeak_Rules.yaml` - `SharedRules/`, `unicode.yaml`, `unicode-full.yaml`, `definitions.yaml`, `navigate.yaml` - `build.rs` can bundle rules into `rules.zip` when `include-zip` is enabled. -- CI packages `Rules.zip` (verbatim) and `Rules-minimized.zip` (flow-style `Languages/**/unicode*.yaml` only) via `uv run --script PythonScripts/package_rules.py Rules [--minimize]`. +- CI packages `Rules.zip` (verbatim) and `Rules-minimized.zip` (flow-style `Languages/**/unicode*.yaml` only) via `uv run --no-project --script PythonScripts/package_rules.py Rules [--minimize]`. ## Translation Conventions - `t:` means untranslated or unverified. From 43af5610615a29e061386c3ec4d63cdd23dac023 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Mon, 17 Aug 2026 16:40:58 -0700 Subject: [PATCH 046/162] try again adding 'zz' test dir for testing --- .github/workflows/rust.yml | 2 ++ AGENTS.md | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 8183f9029..8b60e93a5 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -93,6 +93,8 @@ jobs: run: | rm -rf Rules unzip -q "${{ matrix.rules_zip }}" + # Release zips omit the synthetic zz test language; restore it for unit tests only. + git checkout HEAD -- Rules/Languages/zz - name: Run tests (${{ matrix.feature_name }}) run: cargo test ${{ matrix.features }} --verbose diff --git a/AGENTS.md b/AGENTS.md index f3b6670c4..d9ed0186b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,7 +13,7 @@ but add common mistakes of AI agents here instead. - `ClearSpeak_Rules.yaml`, `SimpleSpeak_Rules.yaml` - `SharedRules/`, `unicode.yaml`, `unicode-full.yaml`, `definitions.yaml`, `navigate.yaml` - `build.rs` can bundle rules into `rules.zip` when `include-zip` is enabled. -- CI packages `Rules.zip` (verbatim) and `Rules-minimized.zip` (flow-style `Languages/**/unicode*.yaml` only) via `uv run --no-project --script PythonScripts/package_rules.py Rules [--minimize]`. +- CI packages `Rules.zip` (verbatim) and `Rules-minimized.zip` (flow-style `Languages/**/unicode*.yaml` only) via `uv run --no-project --script PythonScripts/package_rules.py Rules [--minimize]`. Both omit `Languages/zz`; the `test-rules-package` job restores `zz` from git after unzip so unit tests still run against release-like archives. ## Translation Conventions - `t:` means untranslated or unverified. From 82e81889ee56ca43c967f72cb37075de60e186a2 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Mon, 17 Aug 2026 16:50:24 -0700 Subject: [PATCH 047/162] internally zip of the Language/Braille dirs --- AGENTS.md | 2 +- PythonScripts/rules_packaging/package.py | 2 ++ .../rules_packaging/tests/test_package.py | 31 ++++++++++++++----- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index d9ed0186b..e4076ece7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,7 +13,7 @@ but add common mistakes of AI agents here instead. - `ClearSpeak_Rules.yaml`, `SimpleSpeak_Rules.yaml` - `SharedRules/`, `unicode.yaml`, `unicode-full.yaml`, `definitions.yaml`, `navigate.yaml` - `build.rs` can bundle rules into `rules.zip` when `include-zip` is enabled. -- CI packages `Rules.zip` (verbatim) and `Rules-minimized.zip` (flow-style `Languages/**/unicode*.yaml` only) via `uv run --no-project --script PythonScripts/package_rules.py Rules [--minimize]`. Both omit `Languages/zz`; the `test-rules-package` job restores `zz` from git after unzip so unit tests still run against release-like archives. +- CI packages `Rules.zip` (verbatim) and `Rules-minimized.zip` (flow-style `Languages/**/unicode*.yaml` only) via `uv run --no-project --script PythonScripts/package_rules.py Rules [--minimize]`. Each language/braille subdir is stored as `/.zip` (matching `build.rs`); top-level and `Intent/` YAML stay loose. Both omit `Languages/zz`; the `test-rules-package` job restores `zz` from git after unzip so unit tests still run against release-like archives. ## Translation Conventions - `t:` means untranslated or unverified. diff --git a/PythonScripts/rules_packaging/package.py b/PythonScripts/rules_packaging/package.py index 9b3c47f9d..214ac0db5 100644 --- a/PythonScripts/rules_packaging/package.py +++ b/PythonScripts/rules_packaging/package.py @@ -8,6 +8,7 @@ from pathlib import Path from .minimize import copy_rules_tree +from .release_layout import apply_release_layout def zip_directory(source_dir: Path, zip_path: Path) -> None: @@ -38,6 +39,7 @@ def package_rules(source: Path, output: Path, *, minimize: bool = False) -> dict shutil.copytree(source, staged_rules) minimized, copied, warnings = 0, sum(1 for p in staged_rules.rglob("*") if p.is_file()), [] + apply_release_layout(staged_rules) zip_directory(staged_rules, output) return { diff --git a/PythonScripts/rules_packaging/tests/test_package.py b/PythonScripts/rules_packaging/tests/test_package.py index a8364c93a..c2adc11f7 100644 --- a/PythonScripts/rules_packaging/tests/test_package.py +++ b/PythonScripts/rules_packaging/tests/test_package.py @@ -2,6 +2,7 @@ from __future__ import annotations +import io import zipfile from pathlib import Path @@ -11,6 +12,12 @@ from rules_packaging.package import package_rules +def read_nested_zip_text(archive: zipfile.ZipFile, outer_path: str, inner_path: str) -> str: + """Read ``inner_path`` from a zip file stored inside the outer archive.""" + with zipfile.ZipFile(io.BytesIO(archive.read(outer_path))) as inner: + return inner.read(inner_path).decode("utf-8") + + def test_minimize_yaml_strips_comments_and_uses_flow_style() -> None: """Minimized YAML drops comments and uses flow-style collections.""" source = """--- @@ -25,17 +32,22 @@ def test_minimize_yaml_strips_comments_and_uses_flow_style() -> None: def test_package_rules_standard_zip_layout(tmp_path: Path) -> None: - """Standard packaging preserves Rules/ prefix inside the zip.""" + """Standard packaging preserves Rules/ prefix and per-language inner zips.""" rules = tmp_path / "Rules" - rules.mkdir() + lang = rules / "Languages" / "en" + lang.mkdir(parents=True) (rules / "prefs.yaml").write_text("- SpeechStyle: [t: \"ClearSpeak\"]\n", encoding="utf-8") + (lang / "unicode.yaml").write_text("- \"+\": [t: \"plus\"]\n", encoding="utf-8") output = tmp_path / "Rules.zip" package_rules(rules, output, minimize=False) with zipfile.ZipFile(output) as archive: names = archive.namelist() - assert "Rules/prefs.yaml" in names + assert "Rules/prefs.yaml" in names + assert "Rules/Languages/en/en.zip" in names + assert "Rules/Languages/en/unicode.yaml" not in names + assert read_nested_zip_text(archive, "Rules/Languages/en/en.zip", "unicode.yaml").replace("\r\n", "\n") == "- \"+\": [t: \"plus\"]\n" def test_dump_flow_style_quotes_infinity() -> None: @@ -60,12 +72,12 @@ def test_should_not_minimize_braille_unicode(tmp_path: Path) -> None: assert stats["minimized_yaml_files"] == 0 with zipfile.ZipFile(output) as archive: - text = archive.read("Rules/Braille/Nemeth/unicode.yaml").decode("utf-8") + text = read_nested_zip_text(archive, "Rules/Braille/Nemeth/Nemeth.zip", "unicode.yaml") assert text.replace("\r\n", "\n") == source.replace("\r\n", "\n") -def test_package_rules_minimized_smaller_than_standard(tmp_path: Path) -> None: - """Minimized archives use flow-style YAML and are not larger than standard.""" +def test_package_rules_minimized_matches_release_layout(tmp_path: Path) -> None: + """Minimized archives use inner language zips and flow-style unicode YAML.""" rules = tmp_path / "Rules" lang = rules / "Languages" / "en" lang.mkdir(parents=True) @@ -94,8 +106,11 @@ def test_package_rules_minimized_smaller_than_standard(tmp_path: Path) -> None: assert minimized.stat().st_size <= standard.stat().st_size with zipfile.ZipFile(minimized) as archive: - unicode_text = archive.read("Rules/Languages/en/unicode.yaml").decode("utf-8") - defs_text = archive.read("Rules/Languages/en/definitions.yaml").decode("utf-8") + names = archive.namelist() + assert "Rules/Languages/en/en.zip" in names + assert "Rules/Languages/en/unicode.yaml" not in names + unicode_text = read_nested_zip_text(archive, "Rules/Languages/en/en.zip", "unicode.yaml") + defs_text = read_nested_zip_text(archive, "Rules/Languages/en/en.zip", "definitions.yaml") assert "#" not in unicode_text assert "real=inf" in defs_text assert yaml.safe_load(unicode_text) is not None From 082afd154adf410627932feab186171f25600bbc Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Mon, 17 Aug 2026 16:51:11 -0700 Subject: [PATCH 048/162] add another file for packaging the rules --- .../rules_packaging/release_layout.py | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 PythonScripts/rules_packaging/release_layout.py diff --git a/PythonScripts/rules_packaging/release_layout.py b/PythonScripts/rules_packaging/release_layout.py new file mode 100644 index 000000000..74deff496 --- /dev/null +++ b/PythonScripts/rules_packaging/release_layout.py @@ -0,0 +1,73 @@ +"""Transform a Rules tree into the release layout used by build.rs and CI.""" + +from __future__ import annotations + +import shutil +import zipfile +from pathlib import Path + +YAML_SUFFIXES = {".yaml", ".yml"} +SKIP_LANGUAGE_DIRS = {"zz"} +ZIP_SECTIONS = ("Languages", "Braille") + + +def apply_release_layout(rules_dir: Path) -> None: + """Zip each language/braille subdir into ``/.zip`` and drop loose YAML inside.""" + languages = rules_dir / "Languages" + zz = languages / "zz" + if zz.is_dir(): + shutil.rmtree(zz) + + for section in ZIP_SECTIONS: + section_dir = rules_dir / section + if section_dir.is_dir(): + _zip_immediate_subdirs(section_dir) + + +def _zip_immediate_subdirs(parent: Path) -> None: + for entry in sorted(parent.iterdir(), key=lambda path: path.name): + if not entry.is_dir(): + continue + if entry.name in SKIP_LANGUAGE_DIRS: + shutil.rmtree(entry) + continue + + inner_zip = entry / f"{entry.name}.zip" + yaml_count = _write_yaml_zip(entry, inner_zip) + if yaml_count == 0: + inner_zip.unlink(missing_ok=True) + shutil.rmtree(entry) + continue + + _remove_files_except(entry, keep={inner_zip}) + _prune_empty_dirs(entry) + + +def _write_yaml_zip(source_dir: Path, zip_path: Path) -> int: + """Write all YAML under ``source_dir`` into ``zip_path``; return file count.""" + yaml_files = [ + path + for path in sorted(source_dir.rglob("*")) + if path.is_file() and path.suffix.lower() in YAML_SUFFIXES and path != zip_path + ] + if not yaml_files: + return 0 + + with zipfile.ZipFile(zip_path, "w", compression=zipfile.ZIP_DEFLATED, compresslevel=9) as archive: + for path in yaml_files: + archive.write(path, path.relative_to(source_dir).as_posix()) + return len(yaml_files) + + +def _remove_files_except(root: Path, *, keep: set[Path]) -> None: + for path in sorted(root.rglob("*"), reverse=True): + if path.is_file() and path.resolve() not in {item.resolve() for item in keep}: + path.unlink() + + +def _prune_empty_dirs(root: Path) -> None: + for path in sorted((item for item in root.rglob("*") if item.is_dir()), reverse=True): + try: + path.rmdir() + except OSError: + continue From 61c04bd722ae61d42844b8d5c5d0092ba6b31637 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Mon, 17 Aug 2026 17:00:21 -0700 Subject: [PATCH 049/162] trying again with zipping -- AI is not doing a very good job... --- PythonScripts/rules_packaging/package.py | 4 ++-- PythonScripts/rules_packaging/release_layout.py | 5 +++-- PythonScripts/rules_packaging/tests/test_package.py | 3 +++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/PythonScripts/rules_packaging/package.py b/PythonScripts/rules_packaging/package.py index 214ac0db5..733662cb8 100644 --- a/PythonScripts/rules_packaging/package.py +++ b/PythonScripts/rules_packaging/package.py @@ -4,9 +4,9 @@ import shutil import tempfile -import zipfile from pathlib import Path +from .compress import open_rules_zip from .minimize import copy_rules_tree from .release_layout import apply_release_layout @@ -14,7 +14,7 @@ def zip_directory(source_dir: Path, zip_path: Path) -> None: """Write ``source_dir`` contents into ``zip_path`` preserving relative paths.""" zip_path.parent.mkdir(parents=True, exist_ok=True) - with zipfile.ZipFile(zip_path, "w", compression=zipfile.ZIP_DEFLATED, compresslevel=9) as archive: + with open_rules_zip(zip_path) as archive: for path in sorted(source_dir.rglob("*")): if path.is_file(): archive.write(path, path.relative_to(source_dir.parent).as_posix()) diff --git a/PythonScripts/rules_packaging/release_layout.py b/PythonScripts/rules_packaging/release_layout.py index 74deff496..792687ad6 100644 --- a/PythonScripts/rules_packaging/release_layout.py +++ b/PythonScripts/rules_packaging/release_layout.py @@ -3,9 +3,10 @@ from __future__ import annotations import shutil -import zipfile from pathlib import Path +from .compress import open_rules_zip + YAML_SUFFIXES = {".yaml", ".yml"} SKIP_LANGUAGE_DIRS = {"zz"} ZIP_SECTIONS = ("Languages", "Braille") @@ -53,7 +54,7 @@ def _write_yaml_zip(source_dir: Path, zip_path: Path) -> int: if not yaml_files: return 0 - with zipfile.ZipFile(zip_path, "w", compression=zipfile.ZIP_DEFLATED, compresslevel=9) as archive: + with open_rules_zip(zip_path) as archive: for path in yaml_files: archive.write(path, path.relative_to(source_dir).as_posix()) return len(yaml_files) diff --git a/PythonScripts/rules_packaging/tests/test_package.py b/PythonScripts/rules_packaging/tests/test_package.py index c2adc11f7..334c5b851 100644 --- a/PythonScripts/rules_packaging/tests/test_package.py +++ b/PythonScripts/rules_packaging/tests/test_package.py @@ -8,6 +8,7 @@ import yaml +from rules_packaging.compress import RULES_ZIP_COMPRESSION from rules_packaging.minimize import dump_flow_style, load_yaml, minimize_yaml_text from rules_packaging.package import package_rules @@ -47,6 +48,8 @@ def test_package_rules_standard_zip_layout(tmp_path: Path) -> None: assert "Rules/prefs.yaml" in names assert "Rules/Languages/en/en.zip" in names assert "Rules/Languages/en/unicode.yaml" not in names + with zipfile.ZipFile(io.BytesIO(archive.read("Rules/Languages/en/en.zip"))) as inner: + assert all(info.compress_type == RULES_ZIP_COMPRESSION for info in inner.infolist()) assert read_nested_zip_text(archive, "Rules/Languages/en/en.zip", "unicode.yaml").replace("\r\n", "\n") == "- \"+\": [t: \"plus\"]\n" From 917dbe5649da96ae9d2b95ffb59b282c199ec85d Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Mon, 17 Aug 2026 17:05:00 -0700 Subject: [PATCH 050/162] Merged the messy multiple files AI created into one file --- PythonScripts/package_rules.py | 221 +++++++++++++++++- PythonScripts/rules_packaging/__init__.py | 5 - PythonScripts/rules_packaging/minimize.py | 108 --------- PythonScripts/rules_packaging/package.py | 49 ---- .../rules_packaging/release_layout.py | 74 ------ .../rules_packaging/tests/__init__.py | 1 - .../test_package_rules.py} | 10 +- 7 files changed, 225 insertions(+), 243 deletions(-) delete mode 100644 PythonScripts/rules_packaging/__init__.py delete mode 100644 PythonScripts/rules_packaging/minimize.py delete mode 100644 PythonScripts/rules_packaging/package.py delete mode 100644 PythonScripts/rules_packaging/release_layout.py delete mode 100644 PythonScripts/rules_packaging/tests/__init__.py rename PythonScripts/{rules_packaging/tests/test_package.py => tests/test_package_rules.py} (95%) diff --git a/PythonScripts/package_rules.py b/PythonScripts/package_rules.py index 905a7bc90..53ff2d89e 100644 --- a/PythonScripts/package_rules.py +++ b/PythonScripts/package_rules.py @@ -7,13 +7,228 @@ from __future__ import annotations import argparse +import re +import shutil import sys +import tempfile +import zipfile from pathlib import Path +from typing import Any -# Standalone script: sibling package, not installed via audit_translations. -sys.path.insert(0, str(Path(__file__).resolve().parent)) +import yaml -from rules_packaging.package import package_rules # noqa: E402 +YAML_SUFFIXES = {".yaml", ".yml"} +MINIMIZE_NAMES = {"unicode.yaml", "unicode-full.yaml"} +SKIP_LANGUAGE_DIRS = {"zz"} +ZIP_SECTIONS = ("Languages", "Braille") + +# Non-WASM MathCAT links the `zip` crate with only the `bzip2` feature (see Cargo.toml). +# Inner language/braille zips must use BZIP2 — DEFLATE (method 8) fails at runtime with +# CompressionMethodNotSupported. build.rs uses the same choice for native targets. +RULES_ZIP_COMPRESSION = zipfile.ZIP_BZIP2 +RULES_ZIP_COMPRESSLEVEL = 9 + + +def _open_rules_zip(path: Path, mode: str = "w") -> zipfile.ZipFile: + return zipfile.ZipFile( + path, + mode, + compression=RULES_ZIP_COMPRESSION, + compresslevel=RULES_ZIP_COMPRESSLEVEL, + ) + + +def _configure_yaml_dumper() -> None: + """Quote all strings so yaml-rust does not treat words like 'infinity' as floats.""" + + def represent_str(dumper: yaml.SafeDumper, data: str) -> yaml.nodes.ScalarNode: + return dumper.represent_scalar("tag:yaml.org,2002:str", data, style='"') + + yaml.add_representer(str, represent_str, Dumper=yaml.SafeDumper) + + +_configure_yaml_dumper() + + +def should_minimize(path: Path) -> bool: + if path.suffix.lower() not in YAML_SUFFIXES or path.name not in MINIMIZE_NAMES: + return False + # Speech unicode only — braille unicode.yaml keeps block form (tests and edits rely on it). + return "Languages" in path.parts + + +def preprocess_for_load(text: str) -> str: + """Normalize MathCAT YAML quirks so PyYAML can parse it.""" + text = text.replace("\t", " ") + text = re.sub(r'(?m)^(\s*-\s*)":(\s*:\s*)', r'\1"\\"":\2', text) + text = re.sub(r'(?m)^(\s*-\s*)\\"(\s*:\s*)', r'\1"\\""\2', text) + return text + + +def load_yaml(text: str) -> Any: + """Load YAML using PyYAML with MathCAT-specific normalizations.""" + candidates = (text, text.replace("\t", " "), preprocess_for_load(text)) + last_error: yaml.YAMLError | None = None + for candidate in candidates: + try: + return yaml.safe_load(candidate) + except yaml.YAMLError as exc: + last_error = exc + if last_error is not None: + raise last_error + return None + + +def dump_flow_style(data: Any) -> str: + """Emit minimized flow-style YAML without comments.""" + if data is None: + return "" + dumped = yaml.dump( + data, + allow_unicode=True, + default_flow_style=True, + width=10**9, + sort_keys=False, + Dumper=yaml.SafeDumper, + ) + return dumped if dumped.endswith("\n") else f"{dumped}\n" + + +def minimize_yaml_text(text: str) -> tuple[str, bool]: + """Return flow-style YAML and whether parsing succeeded.""" + try: + data = load_yaml(text) + except yaml.YAMLError: + return text, False + return dump_flow_style(data), True + + +def copy_rules_tree(source: Path, destination: Path, *, minimize: bool) -> tuple[int, int, list[str]]: + """Copy ``source`` Rules tree to ``destination``, optionally minimizing YAML.""" + minimized = 0 + copied = 0 + warnings: list[str] = [] + + for src_path in sorted(source.rglob("*")): + if src_path.is_dir(): + continue + rel = src_path.relative_to(source) + dest_path = destination / rel + dest_path.parent.mkdir(parents=True, exist_ok=True) + + if minimize and should_minimize(src_path): + text = src_path.read_text(encoding="utf-8") + out, ok = minimize_yaml_text(text) + if ok: + dest_path.write_text(out, encoding="utf-8", newline="\n") + minimized += 1 + else: + dest_path.write_bytes(src_path.read_bytes()) + warnings.append(f"could not minimize {rel}; copied verbatim") + copied += 1 + else: + dest_path.write_bytes(src_path.read_bytes()) + copied += 1 + + return minimized, copied, warnings + + +def apply_release_layout(rules_dir: Path) -> None: + """Zip each language/braille subdir into ``/.zip`` and drop loose YAML inside.""" + zz = rules_dir / "Languages" / "zz" + if zz.is_dir(): + shutil.rmtree(zz) + + for section in ZIP_SECTIONS: + section_dir = rules_dir / section + if section_dir.is_dir(): + _zip_immediate_subdirs(section_dir) + + +def _zip_immediate_subdirs(parent: Path) -> None: + for entry in sorted(parent.iterdir(), key=lambda path: path.name): + if not entry.is_dir(): + continue + if entry.name in SKIP_LANGUAGE_DIRS: + shutil.rmtree(entry) + continue + + inner_zip = entry / f"{entry.name}.zip" + yaml_count = _write_yaml_zip(entry, inner_zip) + if yaml_count == 0: + inner_zip.unlink(missing_ok=True) + shutil.rmtree(entry) + continue + + _remove_files_except(entry, keep={inner_zip}) + _prune_empty_dirs(entry) + + +def _write_yaml_zip(source_dir: Path, zip_path: Path) -> int: + yaml_files = [ + path + for path in sorted(source_dir.rglob("*")) + if path.is_file() and path.suffix.lower() in YAML_SUFFIXES and path != zip_path + ] + if not yaml_files: + return 0 + + with _open_rules_zip(zip_path) as archive: + for path in yaml_files: + archive.write(path, path.relative_to(source_dir).as_posix()) + return len(yaml_files) + + +def _remove_files_except(root: Path, *, keep: set[Path]) -> None: + keep_resolved = {item.resolve() for item in keep} + for path in sorted(root.rglob("*"), reverse=True): + if path.is_file() and path.resolve() not in keep_resolved: + path.unlink() + + +def _prune_empty_dirs(root: Path) -> None: + for path in sorted((item for item in root.rglob("*") if item.is_dir()), reverse=True): + try: + path.rmdir() + except OSError: + continue + + +def zip_directory(source_dir: Path, zip_path: Path) -> None: + """Write ``source_dir`` contents into ``zip_path`` preserving relative paths.""" + zip_path.parent.mkdir(parents=True, exist_ok=True) + with _open_rules_zip(zip_path) as archive: + for path in sorted(source_dir.rglob("*")): + if path.is_file(): + archive.write(path, path.relative_to(source_dir.parent).as_posix()) + + +def package_rules(source: Path, output: Path, *, minimize: bool = False) -> dict[str, int | list[str]]: + """Package ``source`` (Rules directory) into ``output`` zip file.""" + source = source.resolve() + output = output.resolve() + + if not source.is_dir(): + raise FileNotFoundError(f"Rules source directory not found: {source}") + if source.name != "Rules": + raise ValueError(f"Expected a directory named 'Rules', got '{source.name}'") + + with tempfile.TemporaryDirectory(prefix="mathcat-rules-") as tmp: + staged_rules = Path(tmp) / "Rules" + if minimize: + minimized, copied, warnings = copy_rules_tree(source, staged_rules, minimize=True) + else: + shutil.copytree(source, staged_rules) + minimized, copied, warnings = 0, sum(1 for p in staged_rules.rglob("*") if p.is_file()), [] + + apply_release_layout(staged_rules) + zip_directory(staged_rules, output) + + return { + "minimized_yaml_files": minimized, + "copied_files": copied, + "warnings": warnings, + } def main(argv: list[str] | None = None) -> int: diff --git a/PythonScripts/rules_packaging/__init__.py b/PythonScripts/rules_packaging/__init__.py deleted file mode 100644 index 07c96c9d2..000000000 --- a/PythonScripts/rules_packaging/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Standalone Rules zip packaging and YAML minimization (not part of audit_translations).""" - -from .package import package_rules - -__all__ = ["package_rules"] diff --git a/PythonScripts/rules_packaging/minimize.py b/PythonScripts/rules_packaging/minimize.py deleted file mode 100644 index 7fb6a05d5..000000000 --- a/PythonScripts/rules_packaging/minimize.py +++ /dev/null @@ -1,108 +0,0 @@ -"""Convert MathCAT Rules YAML files to compact flow-style form.""" - -from __future__ import annotations - -import re -from pathlib import Path -from typing import Any - -import yaml - -YAML_SUFFIXES = {".yaml", ".yml"} -MINIMIZE_NAMES = {"unicode.yaml", "unicode-full.yaml"} - - -def should_minimize(path: Path) -> bool: - if path.suffix.lower() not in YAML_SUFFIXES or path.name not in MINIMIZE_NAMES: - return False - # Speech unicode only — braille unicode.yaml keeps block form (tests and edits rely on it). - return "Languages" in path.parts - - -def _configure_yaml_dumper() -> None: - """Quote all strings so yaml-rust does not treat words like 'infinity' as floats.""" - - def represent_str(dumper: yaml.SafeDumper, data: str) -> yaml.nodes.ScalarNode: - return dumper.represent_scalar("tag:yaml.org,2002:str", data, style='"') - - yaml.add_representer(str, represent_str, Dumper=yaml.SafeDumper) - - -_configure_yaml_dumper() - - -def preprocess_for_load(text: str) -> str: - """Normalize MathCAT YAML quirks so PyYAML can parse it.""" - text = text.replace("\t", " ") - # Bare double-quote or colon used as a mapping key in unicode list entries. - text = re.sub(r'(?m)^(\s*-\s*)":(\s*:\s*)', r'\1"\\"":\2', text) - text = re.sub(r'(?m)^(\s*-\s*)\\"(\s*:\s*)', r'\1"\\""\2', text) - return text - - -def load_yaml(text: str) -> Any: - """Load YAML using PyYAML with MathCAT-specific normalizations.""" - candidates = (text, text.replace("\t", " "), preprocess_for_load(text)) - last_error: yaml.YAMLError | None = None - for candidate in candidates: - try: - return yaml.safe_load(candidate) - except yaml.YAMLError as exc: - last_error = exc - if last_error is not None: - raise last_error - return None - - -def dump_flow_style(data: Any) -> str: - """Emit minimized flow-style YAML without comments.""" - if data is None: - return "" - dumped = yaml.dump( - data, - allow_unicode=True, - default_flow_style=True, - width=10**9, - sort_keys=False, - Dumper=yaml.SafeDumper, - ) - return dumped if dumped.endswith("\n") else f"{dumped}\n" - - -def minimize_yaml_text(text: str) -> tuple[str, bool]: - """Return flow-style YAML and whether parsing succeeded.""" - try: - data = load_yaml(text) - except yaml.YAMLError: - return text, False - return dump_flow_style(data), True - - -def copy_rules_tree(source: Path, destination: Path, *, minimize: bool) -> tuple[int, int, list[str]]: - """Copy ``source`` Rules tree to ``destination``, optionally minimizing YAML.""" - minimized = 0 - copied = 0 - warnings: list[str] = [] - - for src_path in sorted(source.rglob("*")): - if src_path.is_dir(): - continue - rel = src_path.relative_to(source) - dest_path = destination / rel - dest_path.parent.mkdir(parents=True, exist_ok=True) - - if minimize and should_minimize(src_path): - text = src_path.read_text(encoding="utf-8") - out, ok = minimize_yaml_text(text) - if ok: - dest_path.write_text(out, encoding="utf-8", newline="\n") - minimized += 1 - else: - dest_path.write_bytes(src_path.read_bytes()) - warnings.append(f"could not minimize {rel}; copied verbatim") - copied += 1 - else: - dest_path.write_bytes(src_path.read_bytes()) - copied += 1 - - return minimized, copied, warnings diff --git a/PythonScripts/rules_packaging/package.py b/PythonScripts/rules_packaging/package.py deleted file mode 100644 index 733662cb8..000000000 --- a/PythonScripts/rules_packaging/package.py +++ /dev/null @@ -1,49 +0,0 @@ -"""Create Rules.zip archives from a Rules directory tree.""" - -from __future__ import annotations - -import shutil -import tempfile -from pathlib import Path - -from .compress import open_rules_zip -from .minimize import copy_rules_tree -from .release_layout import apply_release_layout - - -def zip_directory(source_dir: Path, zip_path: Path) -> None: - """Write ``source_dir`` contents into ``zip_path`` preserving relative paths.""" - zip_path.parent.mkdir(parents=True, exist_ok=True) - with open_rules_zip(zip_path) as archive: - for path in sorted(source_dir.rglob("*")): - if path.is_file(): - archive.write(path, path.relative_to(source_dir.parent).as_posix()) - - -def package_rules(source: Path, output: Path, *, minimize: bool = False) -> dict[str, int | list[str]]: - """Package ``source`` (Rules directory) into ``output`` zip file.""" - source = source.resolve() - output = output.resolve() - - if not source.is_dir(): - raise FileNotFoundError(f"Rules source directory not found: {source}") - if source.name != "Rules": - raise ValueError(f"Expected a directory named 'Rules', got '{source.name}'") - - with tempfile.TemporaryDirectory(prefix="mathcat-rules-") as tmp: - staging_root = Path(tmp) - staged_rules = staging_root / "Rules" - if minimize: - minimized, copied, warnings = copy_rules_tree(source, staged_rules, minimize=True) - else: - shutil.copytree(source, staged_rules) - minimized, copied, warnings = 0, sum(1 for p in staged_rules.rglob("*") if p.is_file()), [] - - apply_release_layout(staged_rules) - zip_directory(staged_rules, output) - - return { - "minimized_yaml_files": minimized, - "copied_files": copied, - "warnings": warnings, - } diff --git a/PythonScripts/rules_packaging/release_layout.py b/PythonScripts/rules_packaging/release_layout.py deleted file mode 100644 index 792687ad6..000000000 --- a/PythonScripts/rules_packaging/release_layout.py +++ /dev/null @@ -1,74 +0,0 @@ -"""Transform a Rules tree into the release layout used by build.rs and CI.""" - -from __future__ import annotations - -import shutil -from pathlib import Path - -from .compress import open_rules_zip - -YAML_SUFFIXES = {".yaml", ".yml"} -SKIP_LANGUAGE_DIRS = {"zz"} -ZIP_SECTIONS = ("Languages", "Braille") - - -def apply_release_layout(rules_dir: Path) -> None: - """Zip each language/braille subdir into ``/.zip`` and drop loose YAML inside.""" - languages = rules_dir / "Languages" - zz = languages / "zz" - if zz.is_dir(): - shutil.rmtree(zz) - - for section in ZIP_SECTIONS: - section_dir = rules_dir / section - if section_dir.is_dir(): - _zip_immediate_subdirs(section_dir) - - -def _zip_immediate_subdirs(parent: Path) -> None: - for entry in sorted(parent.iterdir(), key=lambda path: path.name): - if not entry.is_dir(): - continue - if entry.name in SKIP_LANGUAGE_DIRS: - shutil.rmtree(entry) - continue - - inner_zip = entry / f"{entry.name}.zip" - yaml_count = _write_yaml_zip(entry, inner_zip) - if yaml_count == 0: - inner_zip.unlink(missing_ok=True) - shutil.rmtree(entry) - continue - - _remove_files_except(entry, keep={inner_zip}) - _prune_empty_dirs(entry) - - -def _write_yaml_zip(source_dir: Path, zip_path: Path) -> int: - """Write all YAML under ``source_dir`` into ``zip_path``; return file count.""" - yaml_files = [ - path - for path in sorted(source_dir.rglob("*")) - if path.is_file() and path.suffix.lower() in YAML_SUFFIXES and path != zip_path - ] - if not yaml_files: - return 0 - - with open_rules_zip(zip_path) as archive: - for path in yaml_files: - archive.write(path, path.relative_to(source_dir).as_posix()) - return len(yaml_files) - - -def _remove_files_except(root: Path, *, keep: set[Path]) -> None: - for path in sorted(root.rglob("*"), reverse=True): - if path.is_file() and path.resolve() not in {item.resolve() for item in keep}: - path.unlink() - - -def _prune_empty_dirs(root: Path) -> None: - for path in sorted((item for item in root.rglob("*") if item.is_dir()), reverse=True): - try: - path.rmdir() - except OSError: - continue diff --git a/PythonScripts/rules_packaging/tests/__init__.py b/PythonScripts/rules_packaging/tests/__init__.py deleted file mode 100644 index b5d3c1aa2..000000000 --- a/PythonScripts/rules_packaging/tests/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Tests for rules packaging.""" diff --git a/PythonScripts/rules_packaging/tests/test_package.py b/PythonScripts/tests/test_package_rules.py similarity index 95% rename from PythonScripts/rules_packaging/tests/test_package.py rename to PythonScripts/tests/test_package_rules.py index 334c5b851..216a1f05d 100644 --- a/PythonScripts/rules_packaging/tests/test_package.py +++ b/PythonScripts/tests/test_package_rules.py @@ -8,9 +8,13 @@ import yaml -from rules_packaging.compress import RULES_ZIP_COMPRESSION -from rules_packaging.minimize import dump_flow_style, load_yaml, minimize_yaml_text -from rules_packaging.package import package_rules +from package_rules import ( + RULES_ZIP_COMPRESSION, + dump_flow_style, + load_yaml, + minimize_yaml_text, + package_rules, +) def read_nested_zip_text(archive: zipfile.ZipFile, outer_path: str, inner_path: str) -> str: From 3bb491df6542e4f4af8bacb58fb7b73ef973ac54 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Mon, 17 Aug 2026 17:12:14 -0700 Subject: [PATCH 051/162] AI keeps messing with things it shouldn't... --- .github/workflows/python.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index c2bb772bf..548e25a92 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -17,4 +17,4 @@ jobs: run: uv run ruff format --check audit_translations/ - name: Run tests working-directory: PythonScripts - run: uv run pytest + run: uv run pytest tests/test_package_rules.py From 7af9ec3d2bb7704db9da175c14639f962d2cce13 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Mon, 17 Aug 2026 17:19:20 -0700 Subject: [PATCH 052/162] remove inappropriate check --- PythonScripts/tests/test_package_rules.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/PythonScripts/tests/test_package_rules.py b/PythonScripts/tests/test_package_rules.py index 216a1f05d..ced3a82e5 100644 --- a/PythonScripts/tests/test_package_rules.py +++ b/PythonScripts/tests/test_package_rules.py @@ -104,13 +104,10 @@ def test_package_rules_minimized_matches_release_layout(tmp_path: Path) -> None: encoding="utf-8", ) - standard = tmp_path / "Rules.zip" minimized = tmp_path / "Rules-minimized.zip" - package_rules(rules, standard, minimize=False) stats = package_rules(rules, minimized, minimize=True) assert stats["minimized_yaml_files"] == 1 - assert minimized.stat().st_size <= standard.stat().st_size with zipfile.ZipFile(minimized) as archive: names = archive.namelist() From 786d058ece11aa14a1f00004cc31f446dfa617f3 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Tue, 18 Aug 2026 00:10:55 -0700 Subject: [PATCH 053/162] Unify Rules packaging in Rust for CI, include-zip, and release zips. Replace the Python packager with shared rules_archive logic and a package-rules binary so build.rs, downloadable archives, and the include-zip embed use one layout (inner BZIP2; outer DEFLATE for unzip-friendly downloads). Serialize parallel language unzip during tests to avoid corrupting the shared Rules tree. Co-authored-by: Cursor --- .github/workflows/python.yml | 2 +- .github/workflows/rust.yml | 10 +- AGENTS.md | 4 +- Cargo.toml | 15 +- PythonScripts/package_rules.py | 265 --------------- PythonScripts/tests/test_package_rules.py | 120 ------- build.rs | 206 +----------- src/bin/package_rules.rs | 230 +++++++++++++ src/interface.rs | 3 +- src/prefs.rs | 19 +- src/rules_archive.rs | 385 ++++++++++++++++++++++ 11 files changed, 659 insertions(+), 600 deletions(-) delete mode 100644 PythonScripts/package_rules.py delete mode 100644 PythonScripts/tests/test_package_rules.py create mode 100644 src/bin/package_rules.rs create mode 100644 src/rules_archive.rs diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 548e25a92..c2bb772bf 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -17,4 +17,4 @@ jobs: run: uv run ruff format --check audit_translations/ - name: Run tests working-directory: PythonScripts - run: uv run pytest tests/test_package_rules.py + run: uv run pytest diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 8b60e93a5..e36f9b4b2 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -46,15 +46,11 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - - uses: astral-sh/setup-uv@v10.0.1 - - name: Remove empty Rules directories - run: find Rules -type d -empty -delete - - name: Remove test directory - run: rm -r Rules/Languages/zz + - uses: dtolnay/rust-toolchain@stable - name: Create Rules.zip - run: uv run --no-project --script PythonScripts/package_rules.py Rules Rules.zip + run: cargo run --bin package-rules -- Rules Rules.zip - name: Create Rules-minimized.zip - run: uv run --no-project --script PythonScripts/package_rules.py Rules Rules-minimized.zip --minimize + run: cargo run --bin package-rules -- Rules Rules-minimized.zip --minimize - name: Upload Rules.zip uses: actions/upload-artifact@v7 with: diff --git a/AGENTS.md b/AGENTS.md index e4076ece7..76ea6a889 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -12,8 +12,8 @@ but add common mistakes of AI agents here instead. - Common per-language files: - `ClearSpeak_Rules.yaml`, `SimpleSpeak_Rules.yaml` - `SharedRules/`, `unicode.yaml`, `unicode-full.yaml`, `definitions.yaml`, `navigate.yaml` -- `build.rs` can bundle rules into `rules.zip` when `include-zip` is enabled. -- CI packages `Rules.zip` (verbatim) and `Rules-minimized.zip` (flow-style `Languages/**/unicode*.yaml` only) via `uv run --no-project --script PythonScripts/package_rules.py Rules [--minimize]`. Each language/braille subdir is stored as `/.zip` (matching `build.rs`); top-level and `Intent/` YAML stay loose. Both omit `Languages/zz`; the `test-rules-package` job restores `zz` from git after unzip so unit tests still run against release-like archives. +- `build.rs` can bundle rules into `rules.zip` when `include-zip` is enabled (always the minimized tree). Shared zipper: `src/rules_archive.rs`, invoked as `cargo run --bin package-rules -- Rules [--minimize]`. +- CI packages `Rules.zip` (verbatim) and `Rules-minimized.zip` (comments stripped from `Languages/**/unicode.yaml` and `unicode-full.yaml` only). Each language/braille subdir is stored as `/.zip`; top-level and `Intent/` YAML stay loose. Inner language zips use BZIP2; the outer downloadable archive uses DEFLATE so `unzip` works. Both omit `Languages/zz`; the `test-rules-package` job restores `zz` from git after unzip so unit tests still run against release-like archives. ## Translation Conventions - `t:` means untranslated or unverified. diff --git a/Cargo.toml b/Cargo.toml index 45de0ad1f..32e83cf27 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,18 +39,17 @@ fastrand = { version = "2.3.0" } clap = { version = "4.5.60", features = ["derive"] } html-escape = "0.2.13" -[target.'cfg(target_family = "wasm")'.dependencies] -zip = { version = "8.2", default-features = false, features = ["deflate"] } -[target.'cfg(not(target_family = "wasm"))'.dependencies] -zip = { version = "8.2", default-features = false, features = ["bzip2"] } +# Runtime extracts inner language/braille zips (BZIP2). The package-rules binary also +# writes DEFLATE outer archives for Windows/unzip-compatible Rules.zip downloads. +# wasm uses the same features: zip 8.x bzip2 is pure Rust (libbz2-rs-sys), not clang C. +zip = { version = "8.2", default-features = false, features = ["deflate", "bzip2"] } android_logger = {version = "0.15.1", optional = true} natural-tts = { version = "0.3.1", optional = true } [build-dependencies] bitflags = "2.6" -# Build script needs both compression backends regardless of build host — -# build.rs picks DEFLATE/BZIP2 based on the *target* family, not the host. +yaml-rust = "0.4" zip = { version = "8.2", default-features = false, features = ["deflate", "bzip2"] } [dev-dependencies] @@ -64,6 +63,10 @@ crate-type = ["rlib", "cdylib"] name = "mathml2text" path = "src/bin/mathml2text.rs" +[[bin]] +name = "package-rules" +path = "src/bin/package_rules.rs" + [lints.rust] unexpected_cfgs = { level = "allow", check-cfg = ['cfg(coverage)', 'cfg(coverage_nightly)'] } diff --git a/PythonScripts/package_rules.py b/PythonScripts/package_rules.py deleted file mode 100644 index 53ff2d89e..000000000 --- a/PythonScripts/package_rules.py +++ /dev/null @@ -1,265 +0,0 @@ -# /// script -# requires-python = ">=3.14" -# dependencies = ["pyyaml"] -# /// -"""Package MathCAT Rules/ into Rules.zip or Rules-minimized.zip.""" - -from __future__ import annotations - -import argparse -import re -import shutil -import sys -import tempfile -import zipfile -from pathlib import Path -from typing import Any - -import yaml - -YAML_SUFFIXES = {".yaml", ".yml"} -MINIMIZE_NAMES = {"unicode.yaml", "unicode-full.yaml"} -SKIP_LANGUAGE_DIRS = {"zz"} -ZIP_SECTIONS = ("Languages", "Braille") - -# Non-WASM MathCAT links the `zip` crate with only the `bzip2` feature (see Cargo.toml). -# Inner language/braille zips must use BZIP2 — DEFLATE (method 8) fails at runtime with -# CompressionMethodNotSupported. build.rs uses the same choice for native targets. -RULES_ZIP_COMPRESSION = zipfile.ZIP_BZIP2 -RULES_ZIP_COMPRESSLEVEL = 9 - - -def _open_rules_zip(path: Path, mode: str = "w") -> zipfile.ZipFile: - return zipfile.ZipFile( - path, - mode, - compression=RULES_ZIP_COMPRESSION, - compresslevel=RULES_ZIP_COMPRESSLEVEL, - ) - - -def _configure_yaml_dumper() -> None: - """Quote all strings so yaml-rust does not treat words like 'infinity' as floats.""" - - def represent_str(dumper: yaml.SafeDumper, data: str) -> yaml.nodes.ScalarNode: - return dumper.represent_scalar("tag:yaml.org,2002:str", data, style='"') - - yaml.add_representer(str, represent_str, Dumper=yaml.SafeDumper) - - -_configure_yaml_dumper() - - -def should_minimize(path: Path) -> bool: - if path.suffix.lower() not in YAML_SUFFIXES or path.name not in MINIMIZE_NAMES: - return False - # Speech unicode only — braille unicode.yaml keeps block form (tests and edits rely on it). - return "Languages" in path.parts - - -def preprocess_for_load(text: str) -> str: - """Normalize MathCAT YAML quirks so PyYAML can parse it.""" - text = text.replace("\t", " ") - text = re.sub(r'(?m)^(\s*-\s*)":(\s*:\s*)', r'\1"\\"":\2', text) - text = re.sub(r'(?m)^(\s*-\s*)\\"(\s*:\s*)', r'\1"\\""\2', text) - return text - - -def load_yaml(text: str) -> Any: - """Load YAML using PyYAML with MathCAT-specific normalizations.""" - candidates = (text, text.replace("\t", " "), preprocess_for_load(text)) - last_error: yaml.YAMLError | None = None - for candidate in candidates: - try: - return yaml.safe_load(candidate) - except yaml.YAMLError as exc: - last_error = exc - if last_error is not None: - raise last_error - return None - - -def dump_flow_style(data: Any) -> str: - """Emit minimized flow-style YAML without comments.""" - if data is None: - return "" - dumped = yaml.dump( - data, - allow_unicode=True, - default_flow_style=True, - width=10**9, - sort_keys=False, - Dumper=yaml.SafeDumper, - ) - return dumped if dumped.endswith("\n") else f"{dumped}\n" - - -def minimize_yaml_text(text: str) -> tuple[str, bool]: - """Return flow-style YAML and whether parsing succeeded.""" - try: - data = load_yaml(text) - except yaml.YAMLError: - return text, False - return dump_flow_style(data), True - - -def copy_rules_tree(source: Path, destination: Path, *, minimize: bool) -> tuple[int, int, list[str]]: - """Copy ``source`` Rules tree to ``destination``, optionally minimizing YAML.""" - minimized = 0 - copied = 0 - warnings: list[str] = [] - - for src_path in sorted(source.rglob("*")): - if src_path.is_dir(): - continue - rel = src_path.relative_to(source) - dest_path = destination / rel - dest_path.parent.mkdir(parents=True, exist_ok=True) - - if minimize and should_minimize(src_path): - text = src_path.read_text(encoding="utf-8") - out, ok = minimize_yaml_text(text) - if ok: - dest_path.write_text(out, encoding="utf-8", newline="\n") - minimized += 1 - else: - dest_path.write_bytes(src_path.read_bytes()) - warnings.append(f"could not minimize {rel}; copied verbatim") - copied += 1 - else: - dest_path.write_bytes(src_path.read_bytes()) - copied += 1 - - return minimized, copied, warnings - - -def apply_release_layout(rules_dir: Path) -> None: - """Zip each language/braille subdir into ``/.zip`` and drop loose YAML inside.""" - zz = rules_dir / "Languages" / "zz" - if zz.is_dir(): - shutil.rmtree(zz) - - for section in ZIP_SECTIONS: - section_dir = rules_dir / section - if section_dir.is_dir(): - _zip_immediate_subdirs(section_dir) - - -def _zip_immediate_subdirs(parent: Path) -> None: - for entry in sorted(parent.iterdir(), key=lambda path: path.name): - if not entry.is_dir(): - continue - if entry.name in SKIP_LANGUAGE_DIRS: - shutil.rmtree(entry) - continue - - inner_zip = entry / f"{entry.name}.zip" - yaml_count = _write_yaml_zip(entry, inner_zip) - if yaml_count == 0: - inner_zip.unlink(missing_ok=True) - shutil.rmtree(entry) - continue - - _remove_files_except(entry, keep={inner_zip}) - _prune_empty_dirs(entry) - - -def _write_yaml_zip(source_dir: Path, zip_path: Path) -> int: - yaml_files = [ - path - for path in sorted(source_dir.rglob("*")) - if path.is_file() and path.suffix.lower() in YAML_SUFFIXES and path != zip_path - ] - if not yaml_files: - return 0 - - with _open_rules_zip(zip_path) as archive: - for path in yaml_files: - archive.write(path, path.relative_to(source_dir).as_posix()) - return len(yaml_files) - - -def _remove_files_except(root: Path, *, keep: set[Path]) -> None: - keep_resolved = {item.resolve() for item in keep} - for path in sorted(root.rglob("*"), reverse=True): - if path.is_file() and path.resolve() not in keep_resolved: - path.unlink() - - -def _prune_empty_dirs(root: Path) -> None: - for path in sorted((item for item in root.rglob("*") if item.is_dir()), reverse=True): - try: - path.rmdir() - except OSError: - continue - - -def zip_directory(source_dir: Path, zip_path: Path) -> None: - """Write ``source_dir`` contents into ``zip_path`` preserving relative paths.""" - zip_path.parent.mkdir(parents=True, exist_ok=True) - with _open_rules_zip(zip_path) as archive: - for path in sorted(source_dir.rglob("*")): - if path.is_file(): - archive.write(path, path.relative_to(source_dir.parent).as_posix()) - - -def package_rules(source: Path, output: Path, *, minimize: bool = False) -> dict[str, int | list[str]]: - """Package ``source`` (Rules directory) into ``output`` zip file.""" - source = source.resolve() - output = output.resolve() - - if not source.is_dir(): - raise FileNotFoundError(f"Rules source directory not found: {source}") - if source.name != "Rules": - raise ValueError(f"Expected a directory named 'Rules', got '{source.name}'") - - with tempfile.TemporaryDirectory(prefix="mathcat-rules-") as tmp: - staged_rules = Path(tmp) / "Rules" - if minimize: - minimized, copied, warnings = copy_rules_tree(source, staged_rules, minimize=True) - else: - shutil.copytree(source, staged_rules) - minimized, copied, warnings = 0, sum(1 for p in staged_rules.rglob("*") if p.is_file()), [] - - apply_release_layout(staged_rules) - zip_directory(staged_rules, output) - - return { - "minimized_yaml_files": minimized, - "copied_files": copied, - "warnings": warnings, - } - - -def main(argv: list[str] | None = None) -> int: - parser = argparse.ArgumentParser( - description="Package MathCAT Rules/ into a zip archive. " - "Use --minimize for flow-style unicode.yaml / unicode-full.yaml without comments." - ) - parser.add_argument("source", type=Path, help="Path to the Rules directory") - parser.add_argument("output", type=Path, help="Output zip file path (e.g. Rules.zip)") - parser.add_argument( - "--minimize", - action="store_true", - help="Emit compact flow-style YAML (comments and block formatting removed)", - ) - args = parser.parse_args(argv) - - try: - stats = package_rules(args.source, args.output, minimize=args.minimize) - except (FileNotFoundError, ValueError) as exc: - print(f"error: {exc}", file=sys.stderr) - return 1 - - label = "minimized" if args.minimize else "standard" - print(f"Created {label} archive: {args.output}") - if args.minimize: - print(f" minimized YAML files: {stats['minimized_yaml_files']}") - print(f" copied verbatim: {stats['copied_files']}") - for warning in stats["warnings"]: - print(f" warning: {warning}", file=sys.stderr) - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/PythonScripts/tests/test_package_rules.py b/PythonScripts/tests/test_package_rules.py deleted file mode 100644 index ced3a82e5..000000000 --- a/PythonScripts/tests/test_package_rules.py +++ /dev/null @@ -1,120 +0,0 @@ -"""Tests for Rules packaging and YAML minimization.""" - -from __future__ import annotations - -import io -import zipfile -from pathlib import Path - -import yaml - -from package_rules import ( - RULES_ZIP_COMPRESSION, - dump_flow_style, - load_yaml, - minimize_yaml_text, - package_rules, -) - - -def read_nested_zip_text(archive: zipfile.ZipFile, outer_path: str, inner_path: str) -> str: - """Read ``inner_path`` from a zip file stored inside the outer archive.""" - with zipfile.ZipFile(io.BytesIO(archive.read(outer_path))) as inner: - return inner.read(inner_path).decode("utf-8") - - -def test_minimize_yaml_strips_comments_and_uses_flow_style() -> None: - """Minimized YAML drops comments and uses flow-style collections.""" - source = """--- -# comment - - \"+\": [t: \"plus\"] # inline -""" - minimized, ok = minimize_yaml_text(source) - assert ok - assert "#" not in minimized - assert "[" in minimized and "{" in minimized or "t:" in minimized - assert load_yaml(minimized) == load_yaml(source) - - -def test_package_rules_standard_zip_layout(tmp_path: Path) -> None: - """Standard packaging preserves Rules/ prefix and per-language inner zips.""" - rules = tmp_path / "Rules" - lang = rules / "Languages" / "en" - lang.mkdir(parents=True) - (rules / "prefs.yaml").write_text("- SpeechStyle: [t: \"ClearSpeak\"]\n", encoding="utf-8") - (lang / "unicode.yaml").write_text("- \"+\": [t: \"plus\"]\n", encoding="utf-8") - - output = tmp_path / "Rules.zip" - package_rules(rules, output, minimize=False) - - with zipfile.ZipFile(output) as archive: - names = archive.namelist() - assert "Rules/prefs.yaml" in names - assert "Rules/Languages/en/en.zip" in names - assert "Rules/Languages/en/unicode.yaml" not in names - with zipfile.ZipFile(io.BytesIO(archive.read("Rules/Languages/en/en.zip"))) as inner: - assert all(info.compress_type == RULES_ZIP_COMPRESSION for info in inner.infolist()) - assert read_nested_zip_text(archive, "Rules/Languages/en/en.zip", "unicode.yaml").replace("\r\n", "\n") == "- \"+\": [t: \"plus\"]\n" - - -def test_dump_flow_style_quotes_infinity() -> None: - """Flow-style dump must quote 'infinity' so yaml-rust does not read it as a float.""" - minimized = dump_flow_style([{"∞": [{"t": "infinity"}]}]) - assert '"infinity"' in minimized - assert "t: infinity" not in minimized - - -def test_should_not_minimize_braille_unicode(tmp_path: Path) -> None: - """Braille unicode.yaml is copied verbatim even when minimization is enabled.""" - rules = tmp_path / "Rules" - braille = rules / "Braille" / "Nemeth" - braille.mkdir(parents=True) - source = """--- - - "1": [t: "N⠂"] -""" - (braille / "unicode.yaml").write_text(source, encoding="utf-8") - - output = tmp_path / "Rules-minimized.zip" - stats = package_rules(rules, output, minimize=True) - - assert stats["minimized_yaml_files"] == 0 - with zipfile.ZipFile(output) as archive: - text = read_nested_zip_text(archive, "Rules/Braille/Nemeth/Nemeth.zip", "unicode.yaml") - assert text.replace("\r\n", "\n") == source.replace("\r\n", "\n") - - -def test_package_rules_minimized_matches_release_layout(tmp_path: Path) -> None: - """Minimized archives use inner language zips and flow-style unicode YAML.""" - rules = tmp_path / "Rules" - lang = rules / "Languages" / "en" - lang.mkdir(parents=True) - (lang / "unicode.yaml").write_text( - """--- -# header comment - - \"+\": [t: \"plus\"] # trailing - - \"-\": [t: \"minus\"] -""", - encoding="utf-8", - ) - (lang / "definitions.yaml").write_text( - """--- - - AdditionalFunctionNames: - - real=inf -""", - encoding="utf-8", - ) - - minimized = tmp_path / "Rules-minimized.zip" - stats = package_rules(rules, minimized, minimize=True) - - assert stats["minimized_yaml_files"] == 1 - - with zipfile.ZipFile(minimized) as archive: - names = archive.namelist() - assert "Rules/Languages/en/en.zip" in names - assert "Rules/Languages/en/unicode.yaml" not in names - unicode_text = read_nested_zip_text(archive, "Rules/Languages/en/en.zip", "unicode.yaml") - defs_text = read_nested_zip_text(archive, "Rules/Languages/en/en.zip", "definitions.yaml") - assert "#" not in unicode_text - assert "real=inf" in defs_text - assert yaml.safe_load(unicode_text) is not None diff --git a/build.rs b/build.rs index a48b26033..e5a07cd8d 100644 --- a/build.rs +++ b/build.rs @@ -1,205 +1,31 @@ //! The build.rs file is necessary to generate rules.zip. -//! rules.zip are needed so there is a way to get the rules dir into the build since your can't get from the crate. +//! rules.zip are needed so there is a way to get the rules dir into the build since you can't get from the crate. //! The expectation is that most builds (with the exception of WASM builds) will need a build.rs file to extract the rules. #![allow(clippy::needless_return)] +#![allow(dead_code)] // include! of rules_archive.rs pulls in the downloadable packager too -use std::fs::{read_dir, DirBuilder, File, remove_file, remove_dir}; -use std::io::{self, Read, Seek, Write}; -use std::path::{Path, PathBuf}; +include!("src/rules_archive.rs"); - -// use zip::result::ZipResult; -use zip::write::{ZipWriter, SimpleFileOptions}; -use zip::CompressionMethod; - -/// Zip up all the yaml files in the directories in `rules_dir/sub_dir_name`` and add the zipped file to `archive_zip`. -/// `rules_dir` is the full path to MathCAT's Rules dir (the input), with `sub_dir_name` the (relative) name of the sub dir to look into. -/// `out_dir`` is the full to the build dir's "out" file (where we are allowed to write) -/// For example, if we have the input ".../Rules/Langauges", then we create a zip file for each subdir with yaml files in it. -/// So we get out_dir/Rules/Langauges/en/en.zip, out_dir/Rules/Langauges/es/es.zip, etc. -/// The resulting archive will reproduce the Rules tree but with the yaml files zipped up per/directory. -fn zip_dir(rules_dir: &Path, archive_zip: &mut ZipWriter, options: SimpleFileOptions, out_dir: &Path, current_out_dir: &Path) -> Result<(), std::io::Error> { - for entry in read_dir(rules_dir)?.flatten() { - let entry_path = entry.path(); - - // .zip files return true for is_dir() -- test in case there is some leftover zip files - if let Some(suffix) = entry_path.extension() && suffix == "zip" { - continue; - } - // println!("trying dir entry {:?}", entry_path.to_str()); - if entry_path.is_dir(){ - if let Some(dir_name) = entry_path.components().next_back() { - let dir_name = dir_name.as_os_str().to_str().unwrap(); - if dir_name == "zz" { // test dir - continue; - } - let zip_name = dir_name.to_string() + ".zip"; // e.g., en.zip - // println!("cargo::warning=zip_name='{}'", &zip_name); - let current_out_dir_zip_path = current_out_dir.join(dir_name); // e.g., ...out/Rules/Languages/en - // println!("cargo::warning=current_out_dir_zip_path='{}'", ¤t_out_dir_zip_path.to_string_lossy()); - - // make sure the appropriate directory exists in 'out' - DirBuilder::new().recursive(true).create(¤t_out_dir_zip_path).unwrap(); - let zipped_dir_file_name = current_out_dir_zip_path.join(&zip_name); // e.g., ...out/Rules/Languages/en/en.zip - let zip_file = match File::create(&zipped_dir_file_name) { - Ok(file) => file, - Err(e) => return Err(std::io::Error::other( - format!("build.rs couldn't create {:?}: {}", zip_name, e))), - }; - let mut zip = ZipWriter::new(zip_file); - let n_files_in_zip = zip_entry(&mut zip, &entry_path, &PathBuf::from("."), options)?; - zip.finish()?; - if n_files_in_zip > 0 { - // Add the file to full archive with the proper relative path (e.g., Languages/en) - let relative_out_dir = current_out_dir_zip_path.strip_prefix(out_dir).unwrap(); // e.g., Rules/Langauges/en - add_file_to_zip(archive_zip, &zipped_dir_file_name, &relative_out_dir.join(&zip_name), options)?; - } else { - // delete the .zip file that isn't used -- doesn't really matter, but removes some clutter - remove_file(&zipped_dir_file_name)?; - remove_dir(¤t_out_dir_zip_path)?; - } - } - } else if let Some(suffix) = &entry_path.extension() { - // definitions.yaml, others??? - let suffix = suffix.to_ascii_lowercase(); - if suffix == "yaml" || suffix == "yml" { - // make sure the appropriate directory exists in 'out' - DirBuilder::new().recursive(true).create(current_out_dir).unwrap(); - let entry_name = entry_path.components().next_back().unwrap().as_os_str().to_str().unwrap(); - let out_dir_file_name = current_out_dir.join(entry_name); // e.g., ...out/Rules/prefs.yaml - std::fs::copy(&entry_path, &out_dir_file_name)?; - let relative_out_dir = out_dir_file_name.strip_prefix(out_dir).unwrap(); - add_file_to_zip(archive_zip, relative_out_dir, relative_out_dir, options)?; - - } - } - } - return Ok( () ); -} - -/// This differs from `zip_dir` in that it does _not_ zip up the directory. Each individual file is zipped so that when the full archive -/// is unzipped, the directory contents do not need to be unzipped. -/// For example, Rules/prefs.yaml and Rules/Intent/general.yaml will exists in the unzipped archive. -fn zip_other_files(rules_dir: &Path, archive_zip: &mut ZipWriter, options: SimpleFileOptions, out_dir: &Path, current_out_dir: &Path) -> Result<(), std::io::Error> { - for entry in read_dir(rules_dir)? { - let entry = entry?; - let entry_path = entry.path(); - let entry_name = entry_path.components().next_back().unwrap().as_os_str().to_str().unwrap(); - - if entry_path.is_dir(){ - if entry_name == "Intent" { // handled elsewhere - zip_other_files(&rules_dir.join("Intent"), archive_zip, options, out_dir, ¤t_out_dir.join("Intent"))?; - } - } else if let Some(suffix) = &entry_path.extension() { - let suffix = suffix.to_ascii_lowercase(); - if suffix == "yaml" || suffix == "yml" { - // make sure the appropriate directory exists in 'out' - DirBuilder::new().recursive(true).create(current_out_dir).unwrap(); - let out_dir_file_name = current_out_dir.join(entry_name); // e.g., ...out/Rules/prefs.yaml - std::fs::copy(&entry_path, &out_dir_file_name)?; - let relative_out_dir = out_dir_file_name.strip_prefix(out_dir).unwrap(); - add_file_to_zip(archive_zip, relative_out_dir, relative_out_dir, options)?; - - } - } - } - return Ok( () ); -} - -/// Adds the `path` relative to the outdir to the `zip`` archive -fn add_file_to_zip( - zip: &mut ZipWriter, - in_dir_path: &Path, - out_dir_path: &Path, - options: SimpleFileOptions, -) -> io::Result<()> { - zip.start_file_from_path(out_dir_path, options)?; - let mut file = File::open(in_dir_path)?; - let mut buffer = Vec::new(); - - file.read_to_end(&mut buffer)?; - zip.write_all(&buffer)?; - return Ok(()); -} - -#[allow(clippy::unused_io_amount)] -fn zip_entry( - zip: &mut ZipWriter, - full_path: &Path, - relative_path: &Path, - options: SimpleFileOptions -) -> io::Result { - let mut n_files_in_zip = 0; - // println!("zip_entry:\n full_path: {}\n relative_path: {}\n current working dir: {}", full_path.display(), relative_path.display(), std::env::current_dir()?.display()); - if full_path.is_dir() { - for entry in read_dir(full_path)? { - let entry_path = entry?.path(); - let entry_name = entry_path.components().next_back().unwrap().as_os_str().to_str().unwrap(); - n_files_in_zip += zip_entry(zip, &entry_path, &relative_path.join(entry_name), options)?; - } - } else if let Some(suffix) = full_path.extension() { - let suffix = suffix.to_ascii_lowercase(); - if suffix == "yaml" || suffix == "yml" { - add_file_to_zip(zip, full_path, relative_path, options)?; - n_files_in_zip += 1; - } - } - - return Ok(n_files_in_zip); -} - -/// Zip up each language and braille dir -/// Note: regional variations (including zh-cn and zh-tw) are zipped together into one zip file fn main() { println!("cargo::rerun-if-changed=build.rs"); + println!("cargo::rerun-if-changed=src/rules_archive.rs"); println!("cargo::rerun-if-changed=Rules"); // This doesn't work because the build claims OUT_DIR is not defined(?) // let archive = PathBuf::from(concat!(env!("OUT_DIR"),"/rules.zip")); if std::env::var("CARGO_FEATURE_INCLUDE_ZIP").is_ok() { - let out_dir = std::env::var_os("OUT_DIR").unwrap(); - let out_dir = PathBuf::from(&out_dir); - let rules_dir = std::env::current_dir().unwrap().join("Rules") ; - let rules_out_dir = PathBuf::from(&out_dir).join("Rules"); - - if std::env::set_current_dir(&out_dir).is_err() { - println!("cargo::warning=couldn't change to directory '{}'", out_dir.display()); - return; - } - let archive_path = PathBuf::from("rules.zip"); // A zip file containing all the zip files. - // println!("cargo::warning=zip file location: '{:?}'", archive_path.to_str()); - let compile_target = std::env::var("CARGO_CFG_TARGET_FAMILY").unwrap(); // build.rs has target_family = build machine, not real target - let compression_method = if compile_target == "wasm" { - CompressionMethod::DEFLATE // although BZIP2 seems better in terms of smaller, it won't compile for WASM - } else { - CompressionMethod::BZIP2 - }; - let zip_options = SimpleFileOptions::default().compression_method(compression_method) - .compression_level(Some(9)); - // let zip_options = SimpleFileOptions::default() - // .compression_level(Some(9)); - - // println!("cargo::warning=rules directory '{:?}'", &rules_dir.to_string_lossy()); - let archive_zip_file = match File::create(&archive_path) { - Ok(file) => file, - Err(e) => panic!("build.rs couldn't create {:?}: {}", archive_path.to_str(), e), - }; - - let mut archive_zip = ZipWriter::new(archive_zip_file); - - - if let Err(e) = zip_other_files(&rules_dir, &mut archive_zip, zip_options, &out_dir, &rules_out_dir) { - panic!("Error: {}", e); - } - - if let Err(e) = zip_dir(&rules_dir.join("Languages"), &mut archive_zip, zip_options, &out_dir, &rules_out_dir.join("Languages")) { - panic!("Error: {}", e); - } - if let Err(e) = zip_dir(&rules_dir.join("Braille"), &mut archive_zip, zip_options, &out_dir, &rules_out_dir.join("Braille")) { - panic!("Error: {}", e); - } - if let Err(e) = archive_zip.finish() { - panic!("Error in zip.finish(): {}", e); + let out_dir = PathBuf::from(std::env::var_os("OUT_DIR").unwrap()); + let rules_dir = std::env::current_dir().unwrap().join("Rules"); + let staging = out_dir.join("rules_src"); + if staging.exists() { + let _ = std::fs::remove_dir_all(&staging); + } + if let Err(e) = copy_rules_tree(&rules_dir, &staging, true) { + panic!("build.rs failed to stage minimized Rules: {}", e); + } + let archive_path = out_dir.join("rules.zip"); + if let Err(e) = write_rules_archive(&staging, &archive_path, include_zip_compression()) { + panic!("build.rs failed to write {}: {}", archive_path.display(), e); } } } diff --git a/src/bin/package_rules.rs b/src/bin/package_rules.rs new file mode 100644 index 000000000..261059bea --- /dev/null +++ b/src/bin/package_rules.rs @@ -0,0 +1,230 @@ +//! Package `Rules/` into `Rules.zip` or `Rules-minimized.zip`. +//! +//! Usage: +//! cargo run --bin package-rules -- Rules Rules.zip +//! cargo run --bin package-rules -- Rules Rules-minimized.zip --minimize + +#![allow(clippy::needless_return)] + +include!("../rules_archive.rs"); + +use clap::Parser; +use std::process::ExitCode; + +#[derive(Parser)] +#[command( + name = "package-rules", + about = "Package MathCAT Rules/ into a zip archive. \ + Use --minimize to strip comments from Languages unicode YAML." +)] +struct Options { + /// Path to the Rules directory + source: PathBuf, + /// Output zip file path (e.g. Rules.zip) + output: PathBuf, + /// Emit compact unicode.yaml / unicode-full.yaml without comments (speech languages only) + #[arg(long)] + minimize: bool, +} + +fn main() -> ExitCode { + let cli = Options::parse(); + if cli.source.file_name().and_then(|n| n.to_str()) != Some("Rules") { + eprintln!( + "error: expected a directory named 'Rules', got '{}'", + cli.source.display() + ); + return ExitCode::from(1); + } + + match package_rules( + &cli.source, + &cli.output, + cli.minimize, + downloadable_compression(), + ) { + Ok(minimized) => { + let label = if cli.minimize { "minimized" } else { "standard" }; + println!("Created {} archive: {}", label, cli.output.display()); + if cli.minimize { + println!(" minimized YAML files: {}", minimized); + } + return ExitCode::SUCCESS; + } + Err(e) => { + eprintln!("error: {}", e); + return ExitCode::from(1); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::fs; + use std::io::{Cursor, Read}; + use tempfile::tempdir; + use zip::ZipArchive; + + fn read_nested_zip_text(outer: &[u8], outer_path: &str, inner_path: &str) -> String { + let mut archive = ZipArchive::new(Cursor::new(outer)).unwrap(); + let mut inner_bytes = Vec::new(); + archive + .by_name(outer_path) + .unwrap() + .read_to_end(&mut inner_bytes) + .unwrap(); + let mut inner = ZipArchive::new(Cursor::new(inner_bytes)).unwrap(); + let mut text = String::new(); + inner + .by_name(inner_path) + .unwrap() + .read_to_string(&mut text) + .unwrap(); + return text; + } + + fn outer_names(bytes: &[u8]) -> Vec { + let mut archive = ZipArchive::new(Cursor::new(bytes)).unwrap(); + let mut names: Vec = (0..archive.len()) + .map(|i| archive.by_index(i).unwrap().name().replace('\\', "/")) + .collect(); + names.sort(); + return names; + } + + fn inner_method(bytes: &[u8], outer_path: &str) -> zip::CompressionMethod { + let mut archive = ZipArchive::new(Cursor::new(bytes)).unwrap(); + let mut inner_bytes = Vec::new(); + archive + .by_name(outer_path) + .unwrap() + .read_to_end(&mut inner_bytes) + .unwrap(); + let mut inner = ZipArchive::new(Cursor::new(inner_bytes)).unwrap(); + return inner.by_index(0).unwrap().compression(); + } + + fn outer_method(bytes: &[u8], name: &str) -> zip::CompressionMethod { + let mut archive = ZipArchive::new(Cursor::new(bytes)).unwrap(); + return archive.by_name(name).unwrap().compression(); + } + + #[test] + fn minimize_yaml_strips_comments() { + let source = "---\n# comment\n - \"+\": [t: \"plus\"] # inline\n"; + let minimized = minimize_yaml_text(source).unwrap(); + assert!(!minimized.contains('#')); + let docs = yaml_rust::YamlLoader::load_from_str(&minimized).unwrap(); + assert_eq!(docs.len(), 1); + } + + #[test] + fn minimize_quotes_infinity() { + let source = "---\n - \"∞\": [t: \"infinity\"]\n"; + let minimized = minimize_yaml_text(source).unwrap(); + assert!( + minimized.contains("\"infinity\"") || minimized.contains("'infinity'"), + "infinity must be quoted, got: {minimized}" + ); + assert!(!looks_like_unquoted_infinity(&minimized)); + let docs = yaml_rust::YamlLoader::load_from_str(&minimized).unwrap(); + assert_eq!(docs.len(), 1); + } + + #[test] + fn package_rules_standard_zip_layout() { + let tmp = tempdir().unwrap(); + let rules = tmp.path().join("Rules"); + let lang = rules.join("Languages").join("en"); + fs::create_dir_all(&lang).unwrap(); + fs::write(rules.join("prefs.yaml"), "- SpeechStyle: [t: \"ClearSpeak\"]\n").unwrap(); + fs::write(lang.join("unicode.yaml"), "- \"+\": [t: \"plus\"]\n").unwrap(); + + let output = tmp.path().join("Rules.zip"); + package_rules(&rules, &output, false, downloadable_compression()).unwrap(); + + let bytes = fs::read(&output).unwrap(); + let names = outer_names(&bytes); + assert!(names.contains(&"Rules/prefs.yaml".to_string())); + assert!(names.contains(&"Rules/Languages/en/en.zip".to_string())); + assert!(!names.iter().any(|n| n.ends_with("unicode.yaml"))); + assert_eq!( + inner_method(&bytes, "Rules/Languages/en/en.zip"), + zip::CompressionMethod::BZIP2 + ); + assert_eq!( + outer_method(&bytes, "Rules/prefs.yaml"), + zip::CompressionMethod::DEFLATE + ); + let unicode = read_nested_zip_text(&bytes, "Rules/Languages/en/en.zip", "unicode.yaml"); + assert_eq!(unicode.replace("\r\n", "\n"), "- \"+\": [t: \"plus\"]\n"); + } + + #[test] + fn should_not_minimize_braille_unicode() { + let tmp = tempdir().unwrap(); + let rules = tmp.path().join("Rules"); + let braille = rules.join("Braille").join("Nemeth"); + fs::create_dir_all(&braille).unwrap(); + let source = "---\n# keep this comment\n - \"1\": [t: \"N⠂\"]\n"; + fs::write(braille.join("unicode.yaml"), source).unwrap(); + + let output = tmp.path().join("Rules-minimized.zip"); + let minimized = package_rules(&rules, &output, true, downloadable_compression()).unwrap(); + assert_eq!(minimized, 0); + + let bytes = fs::read(&output).unwrap(); + let text = read_nested_zip_text(&bytes, "Rules/Braille/Nemeth/Nemeth.zip", "unicode.yaml"); + assert_eq!(text.replace("\r\n", "\n"), source.replace("\r\n", "\n")); + } + + #[test] + fn package_rules_minimized_matches_release_layout() { + let tmp = tempdir().unwrap(); + let rules = tmp.path().join("Rules"); + let lang = rules.join("Languages").join("en"); + fs::create_dir_all(&lang).unwrap(); + fs::write( + lang.join("unicode.yaml"), + "---\n# header comment\n - \"+\": [t: \"plus\"] # trailing\n - \"-\": [t: \"minus\"]\n", + ) + .unwrap(); + fs::write( + lang.join("definitions.yaml"), + "---\n - AdditionalFunctionNames:\n - real=inf\n", + ) + .unwrap(); + + let output = tmp.path().join("Rules-minimized.zip"); + let minimized = package_rules(&rules, &output, true, downloadable_compression()).unwrap(); + assert_eq!(minimized, 1); + + let bytes = fs::read(&output).unwrap(); + let names = outer_names(&bytes); + assert!(names.contains(&"Rules/Languages/en/en.zip".to_string())); + assert!(!names.iter().any(|n| n.ends_with("unicode.yaml"))); + + let unicode = read_nested_zip_text(&bytes, "Rules/Languages/en/en.zip", "unicode.yaml"); + let defs = read_nested_zip_text(&bytes, "Rules/Languages/en/en.zip", "definitions.yaml"); + assert!(!unicode.contains('#')); + assert!(defs.contains("real=inf")); + assert_eq!(yaml_rust::YamlLoader::load_from_str(&unicode).unwrap().len(), 1); + } + + #[test] + fn skips_zz_test_language() { + let tmp = tempdir().unwrap(); + let rules = tmp.path().join("Rules"); + fs::create_dir_all(rules.join("Languages").join("zz")).unwrap(); + fs::write(rules.join("Languages").join("zz").join("unicode.yaml"), "- a: 1\n").unwrap(); + fs::create_dir_all(rules.join("Languages").join("en")).unwrap(); + fs::write(rules.join("Languages").join("en").join("unicode.yaml"), "- b: 2\n").unwrap(); + + let output = tmp.path().join("Rules.zip"); + package_rules(&rules, &output, false, downloadable_compression()).unwrap(); + let names = outer_names(&fs::read(&output).unwrap()); + assert!(names.contains(&"Rules/Languages/en/en.zip".to_string())); + assert!(!names.iter().any(|n| n.contains("/zz"))); + } +} diff --git a/src/interface.rs b/src/interface.rs index 012345056..3177c22c8 100644 --- a/src/interface.rs +++ b/src/interface.rs @@ -651,7 +651,8 @@ pub fn get_supported_languages() -> Result> { let mut language_paths = lang_paths.iter() .map(|path| path.strip_prefix(&lang_dir).unwrap() .to_string_lossy() - .replace(std::path::MAIN_SEPARATOR, "-") + // include-zip stores paths with '/'; native trees use MAIN_SEPARATOR. + .replace(['/', '\\'], "-") .to_string()) .filter(|string_path| !string_path.is_empty() ) .collect::>(); diff --git a/src/prefs.rs b/src/prefs.rs index cad23ba6d..0e04414f6 100644 --- a/src/prefs.rs +++ b/src/prefs.rs @@ -26,7 +26,7 @@ use std::cell::RefCell; use std::rc::Rc; use log::{debug, error, warn}; use std::path::{Path, PathBuf}; -use std::sync::LazyLock; +use std::sync::{LazyLock, Mutex}; use crate::speech::{as_str_checked, RulesFor, FileAndTime}; use std::collections::{HashMap, HashSet}; use phf::phf_set; @@ -458,6 +458,14 @@ impl PreferenceManager { /// Unzip the files if needed /// Returns true if it unzipped them pub fn unzip_files(path: &Path, lang: &str, default_lang: Option<&str>) -> Result { + // cargo test runs many threads against the same Rules/ tree. Extracting en.zip + // concurrently can truncate unicode.yaml and yaml-rust then reports "Didn't find rules!". + static UNZIP_LOCK: Mutex<()> = Mutex::new(()); + let _guard = UNZIP_LOCK.lock().unwrap_or_else(|poisoned| poisoned.into_inner()); + return PreferenceManager::unzip_files_locked(path, lang, default_lang); + } + + fn unzip_files_locked(path: &Path, lang: &str, default_lang: Option<&str>) -> Result { thread_local!{ /// when a language/braille code dir is unzipped, it is recorded here static UNZIPPED_FILES: RefCell> = RefCell::new( HashSet::with_capacity(31)); @@ -479,7 +487,7 @@ impl PreferenceManager { // try again in parent dir of regional language let language = lang.split_once('-').unwrap_or((lang, "")).0; // get the parent language // debug!("unzip_files: trying again in parent language: {}", language); - PreferenceManager::unzip_files(path, language, default_lang) + PreferenceManager::unzip_files_locked(path, language, default_lang) .with_context(|| format!("Couldn't open zip file {zip_file_string} in parent {language}: {e}."))? } else { // maybe just regional dialects @@ -488,7 +496,7 @@ impl PreferenceManager { for dir in regional_dirs { // debug!("unzip_files: trying again in subdir: {}", dir.display()); let language = format!("{}-{}", lang, dir.file_name().unwrap().to_str().unwrap()); - if let Ok(result) =PreferenceManager::unzip_files(path, &language, default_lang) { + if let Ok(result) =PreferenceManager::unzip_files_locked(path, &language, default_lang) { return Ok(result); } } @@ -501,11 +509,6 @@ impl PreferenceManager { }; UNZIPPED_FILES.with( |unzipped_files| unzipped_files.borrow_mut().insert(zip_file_string.clone()) ); - // debug!(" unzip_files: unzipped {} files from {}", result, &zip_file_string); - // UNZIPPED_FILES.with( |unzipped_files| { - // debug!("unzip_files: unzipped_files: {:?}", unzipped_files.borrow()); - // }); - return Ok(result); } diff --git a/src/rules_archive.rs b/src/rules_archive.rs new file mode 100644 index 000000000..108220c28 --- /dev/null +++ b/src/rules_archive.rs @@ -0,0 +1,385 @@ +// Shared Rules archive writer used by `build.rs` (include-zip) and the `package-rules` binary. +// +// Layout matches native MathCAT extraction: +// - `Rules/*.yaml` and `Rules/Intent/**` stay loose in the outer archive +// - each `Rules/Languages//` and `Rules/Braille//` directory is stored as `/.zip` +// - `Rules/Languages/zz` (synthetic test language) is omitted +// +// Inner language/braille zips always use BZIP2. Downloadable `Rules.zip` uses DEFLATE for the +// outer archive so Windows Explorer / `unzip` can open it. The include-zip embed uses BZIP2 +// for both layers (MathCAT's `zip` crate reads it; zip 8.x bzip2 is pure Rust and works on wasm). + +use std::fs::{self, File, read_dir}; +use std::io::{self, Cursor, Read, Seek, Write}; +use std::path::{Path, PathBuf}; + +use yaml_rust::{YamlEmitter, YamlLoader}; +use zip::write::{SimpleFileOptions, ZipWriter}; +use zip::CompressionMethod; + +const YAML_SUFFIXES: [&str; 2] = ["yaml", "yml"]; +const MINIMIZE_NAMES: [&str; 2] = ["unicode.yaml", "unicode-full.yaml"]; +const SKIP_LANGUAGE_DIR: &str = "zz"; +const ARCHIVE_ROOT: &str = "Rules"; + +/// Compression methods for nested language zips vs the outer archive. +#[derive(Clone, Copy)] +pub struct ArchiveCompression { + pub inner: CompressionMethod, + pub outer: CompressionMethod, +} + +/// Inner BZIP2 / outer BZIP2 — used for the include-zip embed (only MathCAT reads it). +pub fn include_zip_compression() -> ArchiveCompression { + return ArchiveCompression { + inner: CompressionMethod::BZIP2, + outer: CompressionMethod::BZIP2, + }; +} + +/// Inner BZIP2 / outer DEFLATE — used for downloadable `Rules.zip` / `Rules-minimized.zip`. +pub fn downloadable_compression() -> ArchiveCompression { + return ArchiveCompression { + inner: CompressionMethod::BZIP2, + outer: CompressionMethod::DEFLATE, + }; +} + +fn zip_options(method: CompressionMethod) -> SimpleFileOptions { + return SimpleFileOptions::default() + .compression_method(method) + .compression_level(Some(9)); +} + +fn is_yaml_file(path: &Path) -> bool { + return path + .extension() + .map(|ext| { + let ext = ext.to_ascii_lowercase(); + YAML_SUFFIXES.iter().any(|s| ext == *s) + }) + .unwrap_or(false); +} + +fn is_zip_file(path: &Path) -> bool { + return path.extension().map(|ext| ext.eq_ignore_ascii_case("zip")).unwrap_or(false); +} + +fn posix_path(parts: &[&str]) -> String { + return parts.join("/"); +} + +fn posix_join(prefix: &str, name: &str) -> String { + if prefix.is_empty() { + return name.to_string(); + } + return format!("{}/{}", prefix, name); +} + +fn file_name_str(path: &Path) -> io::Result { + let name = path + .file_name() + .and_then(|n| n.to_str()) + .ok_or_else(|| io::Error::other(format!("non-UTF-8 file name: {}", path.display())))?; + return Ok(name.to_string()); +} + +/// Speech unicode YAML only — braille `unicode.yaml` stays verbatim. +fn should_minimize(path: &Path) -> bool { + let name = path.file_name().and_then(|n| n.to_str()).unwrap_or(""); + if !MINIMIZE_NAMES.contains(&name) { + return false; + } + return path.components().any(|c| c.as_os_str() == "Languages"); +} + +/// Load YAML, drop comments, re-emit. Returns `Err` if yaml-rust cannot parse the file. +pub fn minimize_yaml_text(text: &str) -> Result { + let normalized = text.replace('\t', " "); + let docs = YamlLoader::load_from_str(&normalized).map_err(|e| e.to_string())?; + if docs.is_empty() { + return Ok(String::new()); + } + let mut out = String::new(); + { + let mut emitter = YamlEmitter::new(&mut out); + emitter.compact(true); + for doc in &docs { + emitter.dump(doc).map_err(|e| e.to_string())?; + } + } + if !out.ends_with('\n') { + out.push('\n'); + } + // yaml-rust quotes scalars that parse as f64 (including "infinity"); keep a guard in case + // a future emitter change stops doing that — unquoted `infinity` becomes a float on load. + if looks_like_unquoted_infinity(&out) { + return Err("emitted unquoted 'infinity' (yaml-rust would treat it as a float)".to_string()); + } + return Ok(out); +} + +fn looks_like_unquoted_infinity(yaml: &str) -> bool { + // Match a YAML value `infinity` that is not inside quotes. + for line in yaml.lines() { + let trimmed = line.trim(); + if trimmed == "infinity" || trimmed.ends_with(": infinity") || trimmed.ends_with("- infinity") { + return true; + } + } + return false; +} + +fn minimize_yaml_file(src: &Path, dst: &Path) -> Result<(), String> { + let text = fs::read_to_string(src).map_err(|e| e.to_string())?; + let minimized = minimize_yaml_text(&text)?; + // One document after a successful load+emit — MathCAT requires docs.len() == 1. + let docs = YamlLoader::load_from_str(&minimized).map_err(|e| e.to_string())?; + if docs.len() != 1 { + return Err(format!("minimized YAML is {} documents, expected 1", docs.len())); + } + let _ = docs; + fs::write(dst, minimized).map_err(|e| e.to_string())?; + return Ok(()); +} + +/// Copy a Rules tree. When `minify` is true, rewrite `Languages/**/unicode.yaml` and +/// `unicode-full.yaml` (comments stripped). `Languages/zz` is omitted. Returns the number of +/// files successfully minimized. +pub fn copy_rules_tree(src: &Path, dst: &Path, minify: bool) -> io::Result { + fs::create_dir_all(dst)?; + return copy_dir(src, dst, minify, false); +} + +fn copy_dir(src: &Path, dst: &Path, minify: bool, parent_is_languages: bool) -> io::Result { + let mut minimized = 0usize; + for entry in read_dir(src)? { + let entry = entry?; + let src_path = entry.path(); + let name = file_name_str(&src_path)?; + if parent_is_languages && name == SKIP_LANGUAGE_DIR { + continue; + } + if is_zip_file(&src_path) { + continue; + } + let dst_path = dst.join(&name); + if src_path.is_dir() { + fs::create_dir_all(&dst_path)?; + minimized += copy_dir(&src_path, &dst_path, minify, name == "Languages")?; + } else if minify && should_minimize(&src_path) { + match minimize_yaml_file(&src_path, &dst_path) { + Ok(()) => minimized += 1, + Err(e) => { + eprintln!( + "warning: could not minimize {}; copied verbatim ({})", + src_path.display(), + e + ); + fs::copy(&src_path, &dst_path)?; + } + } + } else { + if let Some(parent) = dst_path.parent() { + fs::create_dir_all(parent)?; + } + fs::copy(&src_path, &dst_path)?; + } + } + return Ok(minimized); +} + +fn add_file_to_zip( + zip: &mut ZipWriter, + in_path: &Path, + zip_name: &str, + options: SimpleFileOptions, +) -> io::Result<()> { + zip.start_file(zip_name, options) + .map_err(io::Error::other)?; + let mut file = File::open(in_path)?; + let mut buffer = Vec::new(); + file.read_to_end(&mut buffer)?; + zip.write_all(&buffer)?; + return Ok(()); +} + +fn add_bytes_to_zip( + zip: &mut ZipWriter, + zip_name: &str, + bytes: &[u8], + options: SimpleFileOptions, +) -> io::Result<()> { + zip.start_file(zip_name, options) + .map_err(io::Error::other)?; + zip.write_all(bytes)?; + return Ok(()); +} + +fn zip_entry( + zip: &mut ZipWriter, + full_path: &Path, + relative_path: &str, + options: SimpleFileOptions, +) -> io::Result { + let mut n_files_in_zip = 0; + if full_path.is_dir() { + for entry in read_dir(full_path)? { + let entry_path = entry?.path(); + if is_zip_file(&entry_path) { + continue; + } + let entry_name = file_name_str(&entry_path)?; + let child_rel = posix_join(relative_path, &entry_name); + n_files_in_zip += zip_entry(zip, &entry_path, &child_rel, options)?; + } + } else if is_yaml_file(full_path) { + add_file_to_zip(zip, full_path, relative_path, options)?; + n_files_in_zip += 1; + } + return Ok(n_files_in_zip); +} + +fn write_inner_zip(source_dir: &Path, inner: SimpleFileOptions) -> io::Result>> { + let cursor = Cursor::new(Vec::new()); + let mut zip = ZipWriter::new(cursor); + let n_files = zip_entry(&mut zip, source_dir, "", inner)?; + let cursor = zip.finish().map_err(io::Error::other)?; + if n_files == 0 { + return Ok(None); + } + return Ok(Some(cursor.into_inner())); +} + +/// Zip each immediate subdirectory of Languages/ or Braille/ into `/.zip`. +fn zip_dir( + rules_section: &Path, + archive_zip: &mut ZipWriter, + inner: SimpleFileOptions, + outer: SimpleFileOptions, + archive_prefix: &str, +) -> io::Result<()> { + if !rules_section.is_dir() { + return Ok(()); + } + for entry in read_dir(rules_section)? { + let entry_path = entry?.path(); + if is_zip_file(&entry_path) { + continue; + } + if entry_path.is_dir() { + let dir_name = file_name_str(&entry_path)?; + if dir_name == SKIP_LANGUAGE_DIR { + continue; + } + if let Some(bytes) = write_inner_zip(&entry_path, inner)? { + let zip_name = posix_path(&[archive_prefix, &dir_name, &format!("{}.zip", dir_name)]); + add_bytes_to_zip(archive_zip, &zip_name, &bytes, outer)?; + } + } else if is_yaml_file(&entry_path) { + // e.g. Rules/Braille/definitions.yaml + let name = file_name_str(&entry_path)?; + let zip_name = posix_path(&[archive_prefix, &name]); + add_file_to_zip(archive_zip, &entry_path, &zip_name, outer)?; + } + } + return Ok(()); +} + +/// Loose YAML at Rules/ and Rules/Intent/ (not zipped per-directory). +fn zip_other_files( + rules_dir: &Path, + archive_zip: &mut ZipWriter, + outer: SimpleFileOptions, + archive_prefix: &str, +) -> io::Result<()> { + for entry in read_dir(rules_dir)? { + let entry_path = entry?.path(); + let entry_name = file_name_str(&entry_path)?; + if entry_path.is_dir() { + if entry_name == "Intent" { + zip_other_files( + &rules_dir.join("Intent"), + archive_zip, + outer, + &posix_join(archive_prefix, "Intent"), + )?; + } + } else if is_yaml_file(&entry_path) { + let zip_name = posix_join(archive_prefix, &entry_name); + add_file_to_zip(archive_zip, &entry_path, &zip_name, outer)?; + } + } + return Ok(()); +} + +/// Write a MathCAT Rules archive from an already-staged tree (`rules_dir` is the `Rules` folder). +pub fn write_rules_archive( + rules_dir: &Path, + output: &Path, + compression: ArchiveCompression, +) -> io::Result<()> { + if let Some(parent) = output.parent() + && !parent.as_os_str().is_empty() + { + fs::create_dir_all(parent)?; + } + let inner = zip_options(compression.inner); + let outer = zip_options(compression.outer); + let archive_zip_file = File::create(output)?; + let mut archive_zip = ZipWriter::new(archive_zip_file); + + zip_other_files(rules_dir, &mut archive_zip, outer, ARCHIVE_ROOT)?; + zip_dir( + &rules_dir.join("Languages"), + &mut archive_zip, + inner, + outer, + &posix_join(ARCHIVE_ROOT, "Languages"), + )?; + zip_dir( + &rules_dir.join("Braille"), + &mut archive_zip, + inner, + outer, + &posix_join(ARCHIVE_ROOT, "Braille"), + )?; + + archive_zip.finish().map_err(io::Error::other)?; + return Ok(()); +} + +/// Copy (optionally minify) `source` and write a downloadable or embeddable Rules archive. +pub fn package_rules( + source: &Path, + output: &Path, + minify: bool, + compression: ArchiveCompression, +) -> io::Result { + if !source.is_dir() { + return Err(io::Error::new( + io::ErrorKind::NotFound, + format!("Rules source directory not found: {}", source.display()), + )); + } + + let staging_root = tempfile_staging_dir()?; + let staged_rules = staging_root.join(ARCHIVE_ROOT); + let minimized = copy_rules_tree(source, &staged_rules, minify)?; + write_rules_archive(&staged_rules, output, compression)?; + let _ = fs::remove_dir_all(&staging_root); + return Ok(minimized); +} + +fn tempfile_staging_dir() -> io::Result { + let base = std::env::temp_dir().join(format!( + "mathcat-rules-{}-{}", + std::process::id(), + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .map(|d| d.as_nanos()) + .unwrap_or(0) + )); + fs::create_dir_all(&base)?; + return Ok(base); +} From 2e2c19cf9532af816d488fa00b8e5cb7a71ce679 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Tue, 18 Aug 2026 00:23:37 -0700 Subject: [PATCH 054/162] Serialize rules unzip and YAML reads during parallel tests Co-authored-by: Cursor --- src/prefs.rs | 6 +----- src/shim_filesystem.rs | 32 +++++++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/prefs.rs b/src/prefs.rs index 0e04414f6..2fe69cdf3 100644 --- a/src/prefs.rs +++ b/src/prefs.rs @@ -26,7 +26,7 @@ use std::cell::RefCell; use std::rc::Rc; use log::{debug, error, warn}; use std::path::{Path, PathBuf}; -use std::sync::{LazyLock, Mutex}; +use std::sync::LazyLock; use crate::speech::{as_str_checked, RulesFor, FileAndTime}; use std::collections::{HashMap, HashSet}; use phf::phf_set; @@ -458,10 +458,6 @@ impl PreferenceManager { /// Unzip the files if needed /// Returns true if it unzipped them pub fn unzip_files(path: &Path, lang: &str, default_lang: Option<&str>) -> Result { - // cargo test runs many threads against the same Rules/ tree. Extracting en.zip - // concurrently can truncate unicode.yaml and yaml-rust then reports "Didn't find rules!". - static UNZIP_LOCK: Mutex<()> = Mutex::new(()); - let _guard = UNZIP_LOCK.lock().unwrap_or_else(|poisoned| poisoned.into_inner()); return PreferenceManager::unzip_files_locked(path, lang, default_lang); } diff --git a/src/shim_filesystem.rs b/src/shim_filesystem.rs index 38ff55106..14c5b26fb 100644 --- a/src/shim_filesystem.rs +++ b/src/shim_filesystem.rs @@ -361,15 +361,40 @@ cfg_if! { } } + // Tests extract language/braille zips in parallel. During extraction, individual YAML + // files can briefly exist in a partially-written state (created/truncated before the + // full contents are flushed). Guard both extraction and YAML reads with the same lock + // so readers never observe truncated YAML. + use std::sync::Mutex; + static RULES_ZIP_EXTRACT_LOCK: Mutex<()> = Mutex::new(()); + + fn should_lock_rules_yaml_path(path: &Path) -> bool { + let s = path.to_string_lossy(); + let is_yaml = s.ends_with(".yaml") || s.ends_with(".yml"); + if !is_yaml { + return false; + } + return s.contains("Rules/Languages/") || s.contains("Rules\\Languages\\") + || s.contains("Rules/Braille/") || s.contains("Rules\\Braille\\"); + } + pub fn read_to_string_shim(path: &Path) -> Result { let path = match path.canonicalize() { Ok(path) => path, Err(_) => path.to_path_buf(), }; debug!("Reading file '{}'", path.display()); - match std::fs::read_to_string(&path) { - Ok(str) => return Ok(str), - Err(e) => bail!("Read error while trying to read {}: {}", path.display(), e), + if should_lock_rules_yaml_path(&path) { + let _guard = RULES_ZIP_EXTRACT_LOCK.lock().unwrap_or_else(|poisoned| poisoned.into_inner()); + match std::fs::read_to_string(&path) { + Ok(str) => return Ok(str), + Err(e) => bail!("Read error while trying to read {}: {}", path.display(), e), + } + } else { + match std::fs::read_to_string(&path) { + Ok(str) => return Ok(str), + Err(e) => bail!("Read error while trying to read {}: {}", path.display(), e), + } } } @@ -386,6 +411,7 @@ cfg_if! { } }, Ok(contents) => { + let _guard = RULES_ZIP_EXTRACT_LOCK.lock().unwrap_or_else(|poisoned| poisoned.into_inner()); let archive = std::io::Cursor::new(contents); let mut zip_archive = zip::ZipArchive::new(archive).unwrap(); zip_archive.extract(dir).expect("Zip extraction failed"); From 5e899d7d66a56d0068a80c09a95c81e445fbadeb Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Tue, 18 Aug 2026 11:54:44 -0700 Subject: [PATCH 055/162] update version number --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 32e83cf27..67522e0b3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mathcat" -version = "0.7.6-rc.1" +version = "0.7.7-alpha.1" authors = ["Neil Soiffer "] license = "MIT" description = "MathCAT: Math Capable Assistive Technology ('Speech and braille from MathML')" From 04882d3fa42ebb4430b8245ba1a9101e6d41a784 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Tue, 18 Aug 2026 11:55:29 -0700 Subject: [PATCH 056/162] better speech for missing char used for parsing --- Rules/Languages/en/unicode-full.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rules/Languages/en/unicode-full.yaml b/Rules/Languages/en/unicode-full.yaml index 15c169d6a..8d66bbf9a 100644 --- a/Rules/Languages/en/unicode-full.yaml +++ b/Rules/Languages/en/unicode-full.yaml @@ -3777,7 +3777,7 @@ - "ïż«": [t: "right arrow"] # 0xffeb - "ïżŹ": [t: "down arrow"] # 0xffec - "ïżŒ": [t: "unknown or missing object"] # 0xfffc - - "ïżœ": [t: "unknown or missing character"] # 0xfffd + - "ïżœ": [t: "missing char"] # 0xfffd (used for missing input when entering braille) - "🣑": [t: "is in equilibrium with"] # 0x1F8D1 - "🣒": [t: "is in equilibrium biased to the right with"] # 0x1F8D2 From 25b472b60ee5a9d6340e7e9ef987c58b28f01fb9 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Tue, 18 Aug 2026 12:14:02 -0700 Subject: [PATCH 057/162] udate version # --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 67522e0b3..32e83cf27 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mathcat" -version = "0.7.7-alpha.1" +version = "0.7.6-rc.1" authors = ["Neil Soiffer "] license = "MIT" description = "MathCAT: Math Capable Assistive Technology ('Speech and braille from MathML')" From 67cc5462e7b96b176dbd0544e308b23b8ce3c937 Mon Sep 17 00:00:00 2001 From: Cristian Consonni Date: Wed, 19 Aug 2026 02:03:39 +0200 Subject: [PATCH 058/162] Add option --exclude to audit-translations --- PythonScripts/audit_translations/README.md | 11 ++++++- PythonScripts/audit_translations/auditor.py | 34 +++++++++++++-------- PythonScripts/audit_translations/cli.py | 14 ++++++++- 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/PythonScripts/audit_translations/README.md b/PythonScripts/audit_translations/README.md index 8aedf1265..fd399e412 100644 --- a/PythonScripts/audit_translations/README.md +++ b/PythonScripts/audit_translations/README.md @@ -77,6 +77,7 @@ uv run --project PythonScripts audit-translations --list * 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. +* `--exclude`: Exclude one or more files from the audit. * `--rules-dir`: Override the Rules/Languages directory path. * `--only`: Filter issue types (comma-separated): `missing`, `untranslated`, `extra`, `diffs`, `all`. * `--verbose`: Show detailed output including source/target snippets for rule differences. @@ -100,9 +101,17 @@ 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 +# Audit only a specific file (note: --file is incompatible with --exclude) +uv run audit-translations es --file ClearSpeak_Rules.yaml uv run audit-translations es --file SharedRules/default.yaml +# Exclude a list of files from the audit, note that if you use this option before specifying the +# target language you'll need to use the option terminator (--). +# (note: --exclude is incompatible with --file) +uv run audit-translations es --exclude unicode-full.yaml +uv run audit-translations es --exclude unicode-full.yaml unicode.yaml +uv run audit-translations --exclude unicode-full.yaml -- es + # Audit a regional variant (merges Rules/Languages/de and Rules/Languages/de/CH) uv run audit-translations de-CH diff --git a/PythonScripts/audit_translations/auditor.py b/PythonScripts/audit_translations/auditor.py index b67cbf911..37ec44f13 100644 --- a/PythonScripts/audit_translations/auditor.py +++ b/PythonScripts/audit_translations/auditor.py @@ -46,24 +46,31 @@ def is_definitions_file(file_path: str | Path) -> bool: return Path(file_path).name == "definitions.yaml" -def get_yaml_files(lang_dir: Path, region_dir: Path | None = None) -> list[Path]: +def get_yaml_files(lang_dir: Path, region_dir: Path | None = None, excluded_files: list[str] | None = None) -> list[Path]: """Get all YAML files to audit for a language, including region overrides.""" files: set[Path] = set() - def collect_from(directory: Path, root: Path) -> None: + def collect_from(directory: Path, root: Path, excluded: list[str] | None) -> None: if not directory.exists(): return - for f in directory.glob("*.yaml"): - if f.name != "prefs.yaml": - files.add(f.relative_to(root)) - shared_dir = directory / "SharedRules" - if shared_dir.exists(): - for f in shared_dir.glob("*.yaml"): - files.add(f.relative_to(root)) - - collect_from(lang_dir, lang_dir) + + excluded_paths = {Path(path) for path in excluded or []} + + candidates = {f for f in directory.glob("*.yaml") if f.name != "prefs.yaml"} + candidates.update((directory / "SharedRules").glob("*.yaml")) + + relative_candidates = {f.relative_to(directory): f for f in candidates} + + for path in excluded_paths - relative_candidates.keys(): + console.print(f"\n[yellow]⚠ Warning:[/] File to exclude {path} does not exist.") + + files.update( + f.relative_to(root) for relative_path, f in relative_candidates.items() if relative_path not in excluded_paths + ) + + collect_from(lang_dir, lang_dir, excluded_files) if region_dir: - collect_from(region_dir, region_dir) + collect_from(region_dir, region_dir, excluded_files) return sorted(files) @@ -215,6 +222,7 @@ def merge_definitions( def audit_language( language: str, specific_file: str | None = None, + excluded_files: list[str] | None = None, rules_dir: str | None = None, issue_filter: set[str] | None = None, verbose: bool = False, @@ -248,7 +256,7 @@ def audit_language( 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(source_dir, source_region_dir) + files = [specific_file] if specific_file else get_yaml_files(source_dir, source_region_dir, excluded_files) print_audit_header(language, len(files), source_language) diff --git a/PythonScripts/audit_translations/cli.py b/PythonScripts/audit_translations/cli.py index 6916a636e..5bdf30e6d 100644 --- a/PythonScripts/audit_translations/cli.py +++ b/PythonScripts/audit_translations/cli.py @@ -30,7 +30,18 @@ def main() -> None: 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')") + file_group = parser.add_mutually_exclusive_group() + file_group.add_argument( + "--file", + dest="specific_file", + help="Audit only a specific file (e.g., 'SharedRules/default.yaml')", + ) + file_group.add_argument( + "--exclude", + nargs="+", + dest="excluded_files", + help="Exclude a list of files from the audit.", + ) parser.add_argument("--list", action="store_true", help="List available languages") parser.add_argument("--rules-dir", help="Override Rules/Languages directory path") parser.add_argument( @@ -67,6 +78,7 @@ def main() -> None: audit_language( args.language, args.specific_file, + args.excluded_files, args.rules_dir, issue_filter, args.verbose, From 3d267a07461db2e597f03ee22d1e936c45e1e522 Mon Sep 17 00:00:00 2001 From: Cristian Consonni Date: Wed, 19 Aug 2026 03:21:14 +0200 Subject: [PATCH 059/162] Add tests for --exclude option --- .../tests/test_cli_end_to_end.py | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) 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 7876bc0de..4ef5ee9de 100644 --- a/PythonScripts/audit_translations/tests/test_cli_end_to_end.py +++ b/PythonScripts/audit_translations/tests/test_cli_end_to_end.py @@ -127,6 +127,79 @@ def test_cli_main_rich_only_filters_issue_groups(capsys, monkeypatch) -> None: assert "Structure Differences" not in output +@pytest.mark.parametrize( + ("excluded_file", "expected_file", "expected_rule", "unexpected_rule"), + [ + ( + "default.yaml", + "SharedRules/default.yaml", + "shared-only", + "root-only", + ), + ( + "SharedRules/default.yaml", + "default.yaml", + "root-only", + "shared-only", + ), + ], +) +def test_cli_main_exclude_uses_relative_paths( + tmp_path, + capsys, + monkeypatch, + excluded_file, + expected_file, + expected_rule, + unexpected_rule, +) -> None: + """Ensure --exclude distinguishes root files from SharedRules files.""" + rules_dir = tmp_path / "Rules" / "Languages" + source_dir = rules_dir / "en" + target_dir = rules_dir / "de" + + (source_dir / "SharedRules").mkdir(parents=True) + (target_dir / "SharedRules").mkdir(parents=True) + + (source_dir / "default.yaml").write_text( + '- name: root-only\n tag: mo\n match: ".//m:mi"\n replace:\n - t: "root"\n', + encoding="utf-8", + ) + (source_dir / "SharedRules" / "default.yaml").write_text( + '- name: shared-only\n tag: mo\n match: ".//m:mi"\n replace:\n - t: "shared"\n', + encoding="utf-8", + ) + + target_rule = '- name: target-only\n tag: mo\n match: ".//m:mi"\n replace:\n - t: "target"\n' + (target_dir / "default.yaml").write_text( + target_rule, + encoding="utf-8", + ) + (target_dir / "SharedRules" / "default.yaml").write_text( + target_rule, + encoding="utf-8", + ) + + args = [ + "de", + "--rules-dir", + str(rules_dir), + "--exclude", + excluded_file, + "--only", + "missing", + ] + monkeypatch.setattr(sys, "argv", ["audit_translations", *args]) + + audit_cli.main() + output = strip_ansi(capsys.readouterr().out) + + assert "Files to check: 1" in output + assert expected_file in output + assert expected_rule in output + assert unexpected_rule not in output + + def test_cli_main_accepts_source_language(capsys, monkeypatch) -> None: """ Ensure --source changes the reference language without changing target semantics. From 0f4791ccd674d4c0ea78a1576140e09ae1c33315 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Wed, 19 Aug 2026 08:39:00 +0200 Subject: [PATCH 060/162] Add test case IDs for CLI main exclude tests --- PythonScripts/audit_translations/tests/test_cli_end_to_end.py | 1 + 1 file changed, 1 insertion(+) 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 4ef5ee9de..40cf3f8b2 100644 --- a/PythonScripts/audit_translations/tests/test_cli_end_to_end.py +++ b/PythonScripts/audit_translations/tests/test_cli_end_to_end.py @@ -143,6 +143,7 @@ def test_cli_main_rich_only_filters_issue_groups(capsys, monkeypatch) -> None: "shared-only", ), ], + ids=["exclude-root", "exclude-shared-rules"], ) def test_cli_main_exclude_uses_relative_paths( tmp_path, From 512919a3c65f183bd568e43d1db8825f8c1e6107 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Wed, 19 Aug 2026 17:54:43 -0700 Subject: [PATCH 061/162] fix minimized zip file so that flow style is used to reduce space --- AGENTS.md | 2 +- src/bin/package_rules.rs | 91 +++++++++++++++++++-- src/rules_archive.rs | 167 ++++++++++++++++++++++++++++++++------- 3 files changed, 226 insertions(+), 34 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 76ea6a889..c6ca9e756 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,7 +13,7 @@ but add common mistakes of AI agents here instead. - `ClearSpeak_Rules.yaml`, `SimpleSpeak_Rules.yaml` - `SharedRules/`, `unicode.yaml`, `unicode-full.yaml`, `definitions.yaml`, `navigate.yaml` - `build.rs` can bundle rules into `rules.zip` when `include-zip` is enabled (always the minimized tree). Shared zipper: `src/rules_archive.rs`, invoked as `cargo run --bin package-rules -- Rules [--minimize]`. -- CI packages `Rules.zip` (verbatim) and `Rules-minimized.zip` (comments stripped from `Languages/**/unicode.yaml` and `unicode-full.yaml` only). Each language/braille subdir is stored as `/.zip`; top-level and `Intent/` YAML stay loose. Inner language zips use BZIP2; the outer downloadable archive uses DEFLATE so `unzip` works. Both omit `Languages/zz`; the `test-rules-package` job restores `zz` from git after unzip so unit tests still run against release-like archives. +- CI packages `Rules.zip` (verbatim) and `Rules-minimized.zip` (flow-style rewrite of all YAML: comments dropped). Each language/braille subdir is stored as `/.zip`; top-level and `Intent/` YAML stay loose. Inner language zips use BZIP2; the outer downloadable archive uses DEFLATE so `unzip` works. Both omit `Languages/zz`; the `test-rules-package` job restores `zz` from git after unzip so unit tests still run against release-like archives. ## Translation Conventions - `t:` means untranslated or unverified. diff --git a/src/bin/package_rules.rs b/src/bin/package_rules.rs index 261059bea..900af235f 100644 --- a/src/bin/package_rules.rs +++ b/src/bin/package_rules.rs @@ -15,14 +15,14 @@ use std::process::ExitCode; #[command( name = "package-rules", about = "Package MathCAT Rules/ into a zip archive. \ - Use --minimize to strip comments from Languages unicode YAML." + Use --minimize to rewrite all Rules YAML in compact flow style." )] struct Options { /// Path to the Rules directory source: PathBuf, /// Output zip file path (e.g. Rules.zip) output: PathBuf, - /// Emit compact unicode.yaml / unicode-full.yaml without comments (speech languages only) + /// Rewrite all Rules YAML as compact flow YAML without comments #[arg(long)] minimize: bool, } @@ -119,6 +119,23 @@ mod tests { assert_eq!(docs.len(), 1); } + #[test] + fn minimize_yaml_uses_flow_style() { + let source = "---\n# comment\n - \"+\": [t: \"plus\"] # inline\n - \"-\": [t: \"minus\"]\n"; + let minimized = minimize_yaml_text(source).unwrap(); + assert!( + minimized.contains('[') && minimized.contains('{'), + "expected flow collections, got: {minimized}" + ); + assert!( + !minimized.lines().any(|line| line.trim_start().starts_with("- ")), + "expected no block-sequence dashes, got: {minimized}" + ); + let original = yaml_rust::YamlLoader::load_from_str(source).unwrap(); + let roundtrip = yaml_rust::YamlLoader::load_from_str(&minimized).unwrap(); + assert_eq!(original, roundtrip); + } + #[test] fn minimize_quotes_infinity() { let source = "---\n - \"∞\": [t: \"infinity\"]\n"; @@ -132,6 +149,22 @@ mod tests { assert_eq!(docs.len(), 1); } + #[test] + fn minimize_roundtrips_en_unicode_files() { + for name in ["unicode.yaml", "unicode-full.yaml"] { + let path = std::path::Path::new("Rules/Languages/en").join(name); + let source = fs::read_to_string(&path).expect(name); + let minimized = minimize_yaml_text(&source).unwrap(); + assert!( + !minimized.lines().any(|line| line.trim_start().starts_with("- ")), + "{name} still uses block sequences" + ); + let original = yaml_rust::YamlLoader::load_from_str(&source).unwrap(); + let roundtrip = yaml_rust::YamlLoader::load_from_str(&minimized).unwrap(); + assert_eq!(original, roundtrip, "{name} did not round-trip"); + } + } + #[test] fn package_rules_standard_zip_layout() { let tmp = tempdir().unwrap(); @@ -161,8 +194,43 @@ mod tests { assert_eq!(unicode.replace("\r\n", "\n"), "- \"+\": [t: \"plus\"]\n"); } + fn walk_yaml_files(dir: &std::path::Path, out: &mut Vec) { + for entry in fs::read_dir(dir).unwrap() { + let entry = entry.unwrap(); + let path = entry.path(); + if path.is_dir() { + walk_yaml_files(&path, out); + } else if is_yaml_file(&path) { + out.push(path); + } + } + } + #[test] - fn should_not_minimize_braille_unicode() { + fn minimize_roundtrips_all_rules_yaml() { + let mut paths = Vec::new(); + walk_yaml_files(std::path::Path::new("Rules"), &mut paths); + assert!(!paths.is_empty()); + for path in paths { + if path.components().any(|c| c.as_os_str() == SKIP_LANGUAGE_DIR) { + continue; + } + let source = fs::read_to_string(&path).unwrap_or_else(|e| panic!("{}: {e}", path.display())); + let minimized = minimize_yaml_text(&source) + .unwrap_or_else(|e| panic!("{}: {e}", path.display())); + assert!( + !minimized.lines().any(|line| line.trim_start().starts_with("- ")), + "{} still uses block sequences", + path.display() + ); + let original = yaml_rust::YamlLoader::load_from_str(&source).unwrap(); + let roundtrip = yaml_rust::YamlLoader::load_from_str(&minimized).unwrap(); + assert_eq!(original, roundtrip, "{} did not round-trip", path.display()); + } + } + + #[test] + fn minimize_braille_unicode() { let tmp = tempdir().unwrap(); let rules = tmp.path().join("Rules"); let braille = rules.join("Braille").join("Nemeth"); @@ -172,11 +240,16 @@ mod tests { let output = tmp.path().join("Rules-minimized.zip"); let minimized = package_rules(&rules, &output, true, downloadable_compression()).unwrap(); - assert_eq!(minimized, 0); + assert_eq!(minimized, 1); let bytes = fs::read(&output).unwrap(); let text = read_nested_zip_text(&bytes, "Rules/Braille/Nemeth/Nemeth.zip", "unicode.yaml"); - assert_eq!(text.replace("\r\n", "\n"), source.replace("\r\n", "\n")); + assert!(!text.contains('#')); + assert!(text.contains('[') && text.contains('{')); + assert!(!text.lines().any(|line| line.trim_start().starts_with("- "))); + let original = yaml_rust::YamlLoader::load_from_str(source).unwrap(); + let roundtrip = yaml_rust::YamlLoader::load_from_str(&text).unwrap(); + assert_eq!(original, roundtrip); } #[test] @@ -198,7 +271,7 @@ mod tests { let output = tmp.path().join("Rules-minimized.zip"); let minimized = package_rules(&rules, &output, true, downloadable_compression()).unwrap(); - assert_eq!(minimized, 1); + assert_eq!(minimized, 2); let bytes = fs::read(&output).unwrap(); let names = outer_names(&bytes); @@ -208,8 +281,14 @@ mod tests { let unicode = read_nested_zip_text(&bytes, "Rules/Languages/en/en.zip", "unicode.yaml"); let defs = read_nested_zip_text(&bytes, "Rules/Languages/en/en.zip", "definitions.yaml"); assert!(!unicode.contains('#')); + assert!(unicode.contains('[') && unicode.contains('{')); + assert!(!unicode.lines().any(|line| line.trim_start().starts_with("- "))); + assert!(!defs.contains('#')); + assert!(defs.contains('[') && defs.contains('{')); + assert!(!defs.lines().any(|line| line.trim_start().starts_with("- "))); assert!(defs.contains("real=inf")); assert_eq!(yaml_rust::YamlLoader::load_from_str(&unicode).unwrap().len(), 1); + assert_eq!(yaml_rust::YamlLoader::load_from_str(&defs).unwrap().len(), 1); } #[test] diff --git a/src/rules_archive.rs b/src/rules_archive.rs index 108220c28..70d8d81fe 100644 --- a/src/rules_archive.rs +++ b/src/rules_archive.rs @@ -13,12 +13,11 @@ use std::fs::{self, File, read_dir}; use std::io::{self, Cursor, Read, Seek, Write}; use std::path::{Path, PathBuf}; -use yaml_rust::{YamlEmitter, YamlLoader}; +use yaml_rust::{Yaml, YamlLoader}; use zip::write::{SimpleFileOptions, ZipWriter}; use zip::CompressionMethod; const YAML_SUFFIXES: [&str; 2] = ["yaml", "yml"]; -const MINIMIZE_NAMES: [&str; 2] = ["unicode.yaml", "unicode-full.yaml"]; const SKIP_LANGUAGE_DIR: &str = "zz"; const ARCHIVE_ROOT: &str = "Rules"; @@ -83,17 +82,7 @@ fn file_name_str(path: &Path) -> io::Result { .ok_or_else(|| io::Error::other(format!("non-UTF-8 file name: {}", path.display())))?; return Ok(name.to_string()); } - -/// Speech unicode YAML only — braille `unicode.yaml` stays verbatim. -fn should_minimize(path: &Path) -> bool { - let name = path.file_name().and_then(|n| n.to_str()).unwrap_or(""); - if !MINIMIZE_NAMES.contains(&name) { - return false; - } - return path.components().any(|c| c.as_os_str() == "Languages"); -} - -/// Load YAML, drop comments, re-emit. Returns `Err` if yaml-rust cannot parse the file. +/// Load YAML, drop comments, re-emit in flow style. Returns `Err` if yaml-rust cannot parse the file. pub fn minimize_yaml_text(text: &str) -> Result { let normalized = text.replace('\t', " "); let docs = YamlLoader::load_from_str(&normalized).map_err(|e| e.to_string())?; @@ -101,16 +90,13 @@ pub fn minimize_yaml_text(text: &str) -> Result { return Ok(String::new()); } let mut out = String::new(); - { - let mut emitter = YamlEmitter::new(&mut out); - emitter.compact(true); - for doc in &docs { - emitter.dump(doc).map_err(|e| e.to_string())?; + for (i, doc) in docs.iter().enumerate() { + if i > 0 { + out.push_str("\n---\n"); } + emit_flow(&mut out, doc)?; } - if !out.ends_with('\n') { - out.push('\n'); - } + out.push('\n'); // yaml-rust quotes scalars that parse as f64 (including "infinity"); keep a guard in case // a future emitter change stops doing that — unquoted `infinity` becomes a float on load. if looks_like_unquoted_infinity(&out) { @@ -119,15 +105,143 @@ pub fn minimize_yaml_text(text: &str) -> Result { return Ok(out); } +fn emit_flow(out: &mut String, yaml: &Yaml) -> Result<(), String> { + match yaml { + Yaml::Array(items) => { + out.push('['); + for (i, item) in items.iter().enumerate() { + if i > 0 { + out.push(','); + } + emit_flow(out, item)?; + } + out.push(']'); + } + Yaml::Hash(hash) => { + out.push('{'); + for (i, (key, value)) in hash.iter().enumerate() { + if i > 0 { + out.push(','); + } + emit_flow(out, key)?; + out.push_str(": "); + emit_flow(out, value)?; + } + out.push('}'); + } + Yaml::String(s) => emit_yaml_string(out, s), + Yaml::Boolean(true) => out.push_str("true"), + Yaml::Boolean(false) => out.push_str("false"), + Yaml::Integer(i) => out.push_str(&i.to_string()), + Yaml::Real(s) => out.push_str(s), + Yaml::Null | Yaml::BadValue => out.push('~'), + Yaml::Alias(_) => return Err("cannot minimize YAML that contains aliases".to_string()), + } + return Ok(()); +} + +fn emit_yaml_string(out: &mut String, s: &str) { + if need_quotes(s) { + escape_yaml_string(out, s); + } else { + out.push_str(s); + } +} + +/// Same quoting rules as yaml-rust 0.4's emitter, so load/emit round-trips. +fn need_quotes(string: &str) -> bool { + string.is_empty() + || string.starts_with(' ') + || string.ends_with(' ') + || string.starts_with(|character: char| { + matches!(character, '&' | '*' | '?' | '|' | '-' | '<' | '>' | '=' | '!' | '%' | '@') + }) + || string.contains(|character: char| { + matches!( + character, + ':' | '{' | '}' | '[' | ']' | ',' | '#' | '`' | '"' | '\'' | '\\' + | '\0'..='\x06' + | '\t' + | '\n' + | '\r' + | '\x0e'..='\x1a' + | '\x1c'..='\x1f' + ) + }) + || [ + "yes", "Yes", "YES", "no", "No", "NO", "True", "TRUE", "true", "False", "FALSE", + "false", "on", "On", "ON", "off", "Off", "OFF", "null", "Null", "NULL", "~", + ] + .contains(&string) + || string.starts_with('.') + || string.starts_with("0x") + || string.parse::().is_ok() + || string.parse::().is_ok() +} + +fn escape_yaml_string(out: &mut String, v: &str) { + out.push('"'); + let mut start = 0; + for (i, byte) in v.bytes().enumerate() { + let escaped = match byte { + b'"' => "\\\"", + b'\\' => "\\\\", + b'\x00' => "\\u0000", + b'\x01' => "\\u0001", + b'\x02' => "\\u0002", + b'\x03' => "\\u0003", + b'\x04' => "\\u0004", + b'\x05' => "\\u0005", + b'\x06' => "\\u0006", + b'\x07' => "\\u0007", + b'\x08' => "\\b", + b'\t' => "\\t", + b'\n' => "\\n", + b'\x0b' => "\\u000b", + b'\x0c' => "\\f", + b'\r' => "\\r", + b'\x0e' => "\\u000e", + b'\x0f' => "\\u000f", + b'\x10' => "\\u0010", + b'\x11' => "\\u0011", + b'\x12' => "\\u0012", + b'\x13' => "\\u0013", + b'\x14' => "\\u0014", + b'\x15' => "\\u0015", + b'\x16' => "\\u0016", + b'\x17' => "\\u0017", + b'\x18' => "\\u0018", + b'\x19' => "\\u0019", + b'\x1a' => "\\u001a", + b'\x1b' => "\\u001b", + b'\x1c' => "\\u001c", + b'\x1d' => "\\u001d", + b'\x1e' => "\\u001e", + b'\x1f' => "\\u001f", + b'\x7f' => "\\u007f", + _ => continue, + }; + if start < i { + out.push_str(&v[start..i]); + } + out.push_str(escaped); + start = i + 1; + } + if start != v.len() { + out.push_str(&v[start..]); + } + out.push('"'); +} + fn looks_like_unquoted_infinity(yaml: &str) -> bool { - // Match a YAML value `infinity` that is not inside quotes. + // Block-style leftovers and flow mappings (`: infinity}` / `: infinity,`). for line in yaml.lines() { let trimmed = line.trim(); if trimmed == "infinity" || trimmed.ends_with(": infinity") || trimmed.ends_with("- infinity") { return true; } } - return false; + return yaml.contains(": infinity,") || yaml.contains(": infinity}") || yaml.contains(": infinity]"); } fn minimize_yaml_file(src: &Path, dst: &Path) -> Result<(), String> { @@ -143,9 +257,8 @@ fn minimize_yaml_file(src: &Path, dst: &Path) -> Result<(), String> { return Ok(()); } -/// Copy a Rules tree. When `minify` is true, rewrite `Languages/**/unicode.yaml` and -/// `unicode-full.yaml` (comments stripped). `Languages/zz` is omitted. Returns the number of -/// files successfully minimized. +/// Copy a Rules tree. When `minify` is true, rewrite every YAML file as comment-free flow YAML. +/// `Languages/zz` is omitted. Returns the number of files successfully minimized. pub fn copy_rules_tree(src: &Path, dst: &Path, minify: bool) -> io::Result { fs::create_dir_all(dst)?; return copy_dir(src, dst, minify, false); @@ -167,7 +280,7 @@ fn copy_dir(src: &Path, dst: &Path, minify: bool, parent_is_languages: bool) -> if src_path.is_dir() { fs::create_dir_all(&dst_path)?; minimized += copy_dir(&src_path, &dst_path, minify, name == "Languages")?; - } else if minify && should_minimize(&src_path) { + } else if minify && is_yaml_file(&src_path) { match minimize_yaml_file(&src_path, &dst_path) { Ok(()) => minimized += 1, Err(e) => { From 88856c9f8c72c69174f762ce23b07afcff421c48 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Wed, 19 Aug 2026 23:21:21 -0700 Subject: [PATCH 062/162] fix test that depending on the details of YAML notation -- broke for compact flow notation --- src/prefs.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/prefs.rs b/src/prefs.rs index 2fe69cdf3..4dc51c4bc 100644 --- a/src/prefs.rs +++ b/src/prefs.rs @@ -1288,8 +1288,11 @@ cfg_if::cfg_if! {if #[cfg(not(feature = "include-zip"))] { let braille_before = interface::get_braille("").unwrap(); let unicode_file = temp_rules_dir.join("Braille/Nemeth/unicode.yaml"); let unicode_contents = fs::read_to_string(&unicode_file).unwrap(); - // remap the digit '1' to the (distinctive) full braille cell 'â ż' - let changed_unicode = unicode_contents.replace("\"1\": [t: \"N⠂\"]", "\"1\": [t: \"Nâ ż\"]"); + // Remap digit '1' to the distinctive full braille cell 'â ż'. + // Source Rules use block style (`"1": [t: "N⠂"]`); Rules-minimized.zip uses flow (`{"1": [{t: N⠂}]}`). + let changed_unicode = unicode_contents + .replace("\"1\": [t: \"N⠂\"]", "\"1\": [t: \"Nâ ż\"]") + .replace("{\"1\": [{t: N⠂}]}", "{\"1\": [{t: Nâ ż}]}"); assert_ne!(changed_unicode, unicode_contents, "expected to find the Nemeth mapping for '1'"); fs::write(&unicode_file, changed_unicode).unwrap(); sleep(Duration::from_millis(5)); From 728bbb71d154ae6b7de43954db5e5dd0f0f9b577 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Thu, 20 Aug 2026 00:31:15 -0700 Subject: [PATCH 063/162] fix row terminator for UEB in mtable --- Rules/Braille/UEB/UEB_Rules.yaml | 3 +-- tests/braille/UEB/iceb.rs | 43 ++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/Rules/Braille/UEB/UEB_Rules.yaml b/Rules/Braille/UEB/UEB_Rules.yaml index 8e3491c80..04c63947d 100644 --- a/Rules/Braille/UEB/UEB_Rules.yaml +++ b/Rules/Braille/UEB/UEB_Rules.yaml @@ -159,8 +159,7 @@ replace: - test: if: "../*[2]" # more than one row - then: [t: "â  "] - - t: "" + then: [t: "â žW"] - x: $RowStart - test: if: .[self::m:mlabeledtr] diff --git a/tests/braille/UEB/iceb.rs b/tests/braille/UEB/iceb.rs index 731e136b1..2c7c9a5c7 100644 --- a/tests/braille/UEB/iceb.rs +++ b/tests/braille/UEB/iceb.rs @@ -1465,6 +1465,49 @@ fn binomial_14_3_3_2_mtable() -> Result<()> { } +#[test] +fn matrix_15_2_1() -> Result<()> { + // GTM 15.2 first example: I = [[1,0],[0,1]] with enlarged parentheses (one-line encoding). + let expr = r#"( + 10 + 01 + )"#; + test_braille("UEB", expr, "â žâ €â â Łâ Œâ â €â Œâ šâ  â â œâ žâ €â â Łâ Œâ šâ €â Œâ â  â â œ")?; + return Ok(()); +} + +#[test] +fn matrix_15_2_2() -> Result<()> { + // GTM 15.2: matrix with enlarged square brackets. + let expr = r#"[ + ab + cd + ]"#; + test_braille("UEB", expr, "⠾⠀⠹⠣⠁⠀⠃⠠⠹⠜⠾⠀⠹⠣⠰⠉⠀⠙⠠⠹⠜")?; + return Ok(()); +} + +#[test] +fn matrix_15_2_3() -> Result<()> { + // Single-row: no enlarged (dot-6) markers (UEB_Rules one-row path). + let expr = r#"( + 123 + )"#; + test_braille("UEB", expr, "â â Łâ Œâ â €â Œâ ƒâ €â Œâ ‰â â œ")?; + return Ok(()); +} + +#[test] +fn determinant_15_3_1() -> Result<()> { + // GTM 15.3: determinant with enlarged vertical bars. + let expr = r#"| + 12 + 34 + |"#; + test_braille("UEB", expr, "â žâ €â žâ łâ Œâ â €â Œâ ƒâ  â žâ łâ žâ €â žâ łâ Œâ ‰â €â Œâ ™â  â žâ ł")?; + return Ok(()); +} + #[test] fn chem_16_2_8() -> Result<()> { let expr = "Ca(OH)2"; From 4a7f5ca0e926d06606043ddd24301b9b74a91d86 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Thu, 20 Aug 2026 00:31:15 -0700 Subject: [PATCH 064/162] fix row terminator for UEB in mtable --- Rules/Braille/UEB/UEB_Rules.yaml | 3 +-- tests/braille/UEB/iceb.rs | 43 ++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/Rules/Braille/UEB/UEB_Rules.yaml b/Rules/Braille/UEB/UEB_Rules.yaml index 8e3491c80..04c63947d 100644 --- a/Rules/Braille/UEB/UEB_Rules.yaml +++ b/Rules/Braille/UEB/UEB_Rules.yaml @@ -159,8 +159,7 @@ replace: - test: if: "../*[2]" # more than one row - then: [t: "â  "] - - t: "" + then: [t: "â žW"] - x: $RowStart - test: if: .[self::m:mlabeledtr] diff --git a/tests/braille/UEB/iceb.rs b/tests/braille/UEB/iceb.rs index 731e136b1..2c7c9a5c7 100644 --- a/tests/braille/UEB/iceb.rs +++ b/tests/braille/UEB/iceb.rs @@ -1465,6 +1465,49 @@ fn binomial_14_3_3_2_mtable() -> Result<()> { } +#[test] +fn matrix_15_2_1() -> Result<()> { + // GTM 15.2 first example: I = [[1,0],[0,1]] with enlarged parentheses (one-line encoding). + let expr = r#"( + 10 + 01 + )"#; + test_braille("UEB", expr, "â žâ €â â Łâ Œâ â €â Œâ šâ  â â œâ žâ €â â Łâ Œâ šâ €â Œâ â  â â œ")?; + return Ok(()); +} + +#[test] +fn matrix_15_2_2() -> Result<()> { + // GTM 15.2: matrix with enlarged square brackets. + let expr = r#"[ + ab + cd + ]"#; + test_braille("UEB", expr, "⠾⠀⠹⠣⠁⠀⠃⠠⠹⠜⠾⠀⠹⠣⠰⠉⠀⠙⠠⠹⠜")?; + return Ok(()); +} + +#[test] +fn matrix_15_2_3() -> Result<()> { + // Single-row: no enlarged (dot-6) markers (UEB_Rules one-row path). + let expr = r#"( + 123 + )"#; + test_braille("UEB", expr, "â â Łâ Œâ â €â Œâ ƒâ €â Œâ ‰â â œ")?; + return Ok(()); +} + +#[test] +fn determinant_15_3_1() -> Result<()> { + // GTM 15.3: determinant with enlarged vertical bars. + let expr = r#"| + 12 + 34 + |"#; + test_braille("UEB", expr, "â žâ €â žâ łâ Œâ â €â Œâ ƒâ  â žâ łâ žâ €â žâ łâ Œâ ‰â €â Œâ ™â  â žâ ł")?; + return Ok(()); +} + #[test] fn chem_16_2_8() -> Result<()> { let expr = "Ca(OH)2"; From 18859bca60d88bbac58dfe02de912e733e21aafe Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Thu, 20 Aug 2026 00:40:44 -0700 Subject: [PATCH 065/162] Bring over fixes to the minified yaml files. --- src/bin/package_rules.rs | 91 +++++++++++++++++++-- src/main.rs | 45 ++--------- src/prefs.rs | 7 +- src/rules_archive.rs | 167 ++++++++++++++++++++++++++++++++------- 4 files changed, 237 insertions(+), 73 deletions(-) diff --git a/src/bin/package_rules.rs b/src/bin/package_rules.rs index 261059bea..900af235f 100644 --- a/src/bin/package_rules.rs +++ b/src/bin/package_rules.rs @@ -15,14 +15,14 @@ use std::process::ExitCode; #[command( name = "package-rules", about = "Package MathCAT Rules/ into a zip archive. \ - Use --minimize to strip comments from Languages unicode YAML." + Use --minimize to rewrite all Rules YAML in compact flow style." )] struct Options { /// Path to the Rules directory source: PathBuf, /// Output zip file path (e.g. Rules.zip) output: PathBuf, - /// Emit compact unicode.yaml / unicode-full.yaml without comments (speech languages only) + /// Rewrite all Rules YAML as compact flow YAML without comments #[arg(long)] minimize: bool, } @@ -119,6 +119,23 @@ mod tests { assert_eq!(docs.len(), 1); } + #[test] + fn minimize_yaml_uses_flow_style() { + let source = "---\n# comment\n - \"+\": [t: \"plus\"] # inline\n - \"-\": [t: \"minus\"]\n"; + let minimized = minimize_yaml_text(source).unwrap(); + assert!( + minimized.contains('[') && minimized.contains('{'), + "expected flow collections, got: {minimized}" + ); + assert!( + !minimized.lines().any(|line| line.trim_start().starts_with("- ")), + "expected no block-sequence dashes, got: {minimized}" + ); + let original = yaml_rust::YamlLoader::load_from_str(source).unwrap(); + let roundtrip = yaml_rust::YamlLoader::load_from_str(&minimized).unwrap(); + assert_eq!(original, roundtrip); + } + #[test] fn minimize_quotes_infinity() { let source = "---\n - \"∞\": [t: \"infinity\"]\n"; @@ -132,6 +149,22 @@ mod tests { assert_eq!(docs.len(), 1); } + #[test] + fn minimize_roundtrips_en_unicode_files() { + for name in ["unicode.yaml", "unicode-full.yaml"] { + let path = std::path::Path::new("Rules/Languages/en").join(name); + let source = fs::read_to_string(&path).expect(name); + let minimized = minimize_yaml_text(&source).unwrap(); + assert!( + !minimized.lines().any(|line| line.trim_start().starts_with("- ")), + "{name} still uses block sequences" + ); + let original = yaml_rust::YamlLoader::load_from_str(&source).unwrap(); + let roundtrip = yaml_rust::YamlLoader::load_from_str(&minimized).unwrap(); + assert_eq!(original, roundtrip, "{name} did not round-trip"); + } + } + #[test] fn package_rules_standard_zip_layout() { let tmp = tempdir().unwrap(); @@ -161,8 +194,43 @@ mod tests { assert_eq!(unicode.replace("\r\n", "\n"), "- \"+\": [t: \"plus\"]\n"); } + fn walk_yaml_files(dir: &std::path::Path, out: &mut Vec) { + for entry in fs::read_dir(dir).unwrap() { + let entry = entry.unwrap(); + let path = entry.path(); + if path.is_dir() { + walk_yaml_files(&path, out); + } else if is_yaml_file(&path) { + out.push(path); + } + } + } + #[test] - fn should_not_minimize_braille_unicode() { + fn minimize_roundtrips_all_rules_yaml() { + let mut paths = Vec::new(); + walk_yaml_files(std::path::Path::new("Rules"), &mut paths); + assert!(!paths.is_empty()); + for path in paths { + if path.components().any(|c| c.as_os_str() == SKIP_LANGUAGE_DIR) { + continue; + } + let source = fs::read_to_string(&path).unwrap_or_else(|e| panic!("{}: {e}", path.display())); + let minimized = minimize_yaml_text(&source) + .unwrap_or_else(|e| panic!("{}: {e}", path.display())); + assert!( + !minimized.lines().any(|line| line.trim_start().starts_with("- ")), + "{} still uses block sequences", + path.display() + ); + let original = yaml_rust::YamlLoader::load_from_str(&source).unwrap(); + let roundtrip = yaml_rust::YamlLoader::load_from_str(&minimized).unwrap(); + assert_eq!(original, roundtrip, "{} did not round-trip", path.display()); + } + } + + #[test] + fn minimize_braille_unicode() { let tmp = tempdir().unwrap(); let rules = tmp.path().join("Rules"); let braille = rules.join("Braille").join("Nemeth"); @@ -172,11 +240,16 @@ mod tests { let output = tmp.path().join("Rules-minimized.zip"); let minimized = package_rules(&rules, &output, true, downloadable_compression()).unwrap(); - assert_eq!(minimized, 0); + assert_eq!(minimized, 1); let bytes = fs::read(&output).unwrap(); let text = read_nested_zip_text(&bytes, "Rules/Braille/Nemeth/Nemeth.zip", "unicode.yaml"); - assert_eq!(text.replace("\r\n", "\n"), source.replace("\r\n", "\n")); + assert!(!text.contains('#')); + assert!(text.contains('[') && text.contains('{')); + assert!(!text.lines().any(|line| line.trim_start().starts_with("- "))); + let original = yaml_rust::YamlLoader::load_from_str(source).unwrap(); + let roundtrip = yaml_rust::YamlLoader::load_from_str(&text).unwrap(); + assert_eq!(original, roundtrip); } #[test] @@ -198,7 +271,7 @@ mod tests { let output = tmp.path().join("Rules-minimized.zip"); let minimized = package_rules(&rules, &output, true, downloadable_compression()).unwrap(); - assert_eq!(minimized, 1); + assert_eq!(minimized, 2); let bytes = fs::read(&output).unwrap(); let names = outer_names(&bytes); @@ -208,8 +281,14 @@ mod tests { let unicode = read_nested_zip_text(&bytes, "Rules/Languages/en/en.zip", "unicode.yaml"); let defs = read_nested_zip_text(&bytes, "Rules/Languages/en/en.zip", "definitions.yaml"); assert!(!unicode.contains('#')); + assert!(unicode.contains('[') && unicode.contains('{')); + assert!(!unicode.lines().any(|line| line.trim_start().starts_with("- "))); + assert!(!defs.contains('#')); + assert!(defs.contains('[') && defs.contains('{')); + assert!(!defs.lines().any(|line| line.trim_start().starts_with("- "))); assert!(defs.contains("real=inf")); assert_eq!(yaml_rust::YamlLoader::load_from_str(&unicode).unwrap().len(), 1); + assert_eq!(yaml_rust::YamlLoader::load_from_str(&defs).unwrap().len(), 1); } #[test] diff --git a/src/main.rs b/src/main.rs index 506bd15d7..4a5a8c6fb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -36,39 +36,8 @@ fn main() { .init(); let expr = r#" - - - - e - - − - - 1 - 2 - - - - - ( - - - - x - − - μ - - σ - - - ) - - - 2 - - - - - + RT⌢ + "#; // let expr = " // @@ -308,7 +277,7 @@ fn main() { // info!("#xpath = {}; duplicates = {}", xpath_counts.0, xpath_counts.1); // info!("Time taken (second time for speech + braille): {}ms", instant.elapsed().as_millis()); // debug!("Hashmap sizes:\n{}", libmathcat::speech::SpeechRules::print_sizes()); - timing_test(expr, 5000); + timing_test(expr, 100); } @@ -327,10 +296,10 @@ fn timing_test(expr: &str, n_loops: usize) { Ok(_) =>( ), Err(e) => {eprintln!("{}", errors_to_string(&e)); exit(1);}, } - match get_braille("") { - Ok(_) => (), - Err(e) => {eprintln!("{}", errors_to_string(&e)); exit(1);}, - } + // match get_braille("") { + // Ok(_) => (), + // Err(e) => {eprintln!("{}", errors_to_string(&e)); exit(1);}, + // } } info!("Time taken (time for set, speech, {} braille averaged over {} loops): {}ms", get_preference("BrailleCode").unwrap(), n_loops, instant.elapsed().as_millis() as f64/n_loops_float); diff --git a/src/prefs.rs b/src/prefs.rs index 2fe69cdf3..4dc51c4bc 100644 --- a/src/prefs.rs +++ b/src/prefs.rs @@ -1288,8 +1288,11 @@ cfg_if::cfg_if! {if #[cfg(not(feature = "include-zip"))] { let braille_before = interface::get_braille("").unwrap(); let unicode_file = temp_rules_dir.join("Braille/Nemeth/unicode.yaml"); let unicode_contents = fs::read_to_string(&unicode_file).unwrap(); - // remap the digit '1' to the (distinctive) full braille cell 'â ż' - let changed_unicode = unicode_contents.replace("\"1\": [t: \"N⠂\"]", "\"1\": [t: \"Nâ ż\"]"); + // Remap digit '1' to the distinctive full braille cell 'â ż'. + // Source Rules use block style (`"1": [t: "N⠂"]`); Rules-minimized.zip uses flow (`{"1": [{t: N⠂}]}`). + let changed_unicode = unicode_contents + .replace("\"1\": [t: \"N⠂\"]", "\"1\": [t: \"Nâ ż\"]") + .replace("{\"1\": [{t: N⠂}]}", "{\"1\": [{t: Nâ ż}]}"); assert_ne!(changed_unicode, unicode_contents, "expected to find the Nemeth mapping for '1'"); fs::write(&unicode_file, changed_unicode).unwrap(); sleep(Duration::from_millis(5)); diff --git a/src/rules_archive.rs b/src/rules_archive.rs index 108220c28..70d8d81fe 100644 --- a/src/rules_archive.rs +++ b/src/rules_archive.rs @@ -13,12 +13,11 @@ use std::fs::{self, File, read_dir}; use std::io::{self, Cursor, Read, Seek, Write}; use std::path::{Path, PathBuf}; -use yaml_rust::{YamlEmitter, YamlLoader}; +use yaml_rust::{Yaml, YamlLoader}; use zip::write::{SimpleFileOptions, ZipWriter}; use zip::CompressionMethod; const YAML_SUFFIXES: [&str; 2] = ["yaml", "yml"]; -const MINIMIZE_NAMES: [&str; 2] = ["unicode.yaml", "unicode-full.yaml"]; const SKIP_LANGUAGE_DIR: &str = "zz"; const ARCHIVE_ROOT: &str = "Rules"; @@ -83,17 +82,7 @@ fn file_name_str(path: &Path) -> io::Result { .ok_or_else(|| io::Error::other(format!("non-UTF-8 file name: {}", path.display())))?; return Ok(name.to_string()); } - -/// Speech unicode YAML only — braille `unicode.yaml` stays verbatim. -fn should_minimize(path: &Path) -> bool { - let name = path.file_name().and_then(|n| n.to_str()).unwrap_or(""); - if !MINIMIZE_NAMES.contains(&name) { - return false; - } - return path.components().any(|c| c.as_os_str() == "Languages"); -} - -/// Load YAML, drop comments, re-emit. Returns `Err` if yaml-rust cannot parse the file. +/// Load YAML, drop comments, re-emit in flow style. Returns `Err` if yaml-rust cannot parse the file. pub fn minimize_yaml_text(text: &str) -> Result { let normalized = text.replace('\t', " "); let docs = YamlLoader::load_from_str(&normalized).map_err(|e| e.to_string())?; @@ -101,16 +90,13 @@ pub fn minimize_yaml_text(text: &str) -> Result { return Ok(String::new()); } let mut out = String::new(); - { - let mut emitter = YamlEmitter::new(&mut out); - emitter.compact(true); - for doc in &docs { - emitter.dump(doc).map_err(|e| e.to_string())?; + for (i, doc) in docs.iter().enumerate() { + if i > 0 { + out.push_str("\n---\n"); } + emit_flow(&mut out, doc)?; } - if !out.ends_with('\n') { - out.push('\n'); - } + out.push('\n'); // yaml-rust quotes scalars that parse as f64 (including "infinity"); keep a guard in case // a future emitter change stops doing that — unquoted `infinity` becomes a float on load. if looks_like_unquoted_infinity(&out) { @@ -119,15 +105,143 @@ pub fn minimize_yaml_text(text: &str) -> Result { return Ok(out); } +fn emit_flow(out: &mut String, yaml: &Yaml) -> Result<(), String> { + match yaml { + Yaml::Array(items) => { + out.push('['); + for (i, item) in items.iter().enumerate() { + if i > 0 { + out.push(','); + } + emit_flow(out, item)?; + } + out.push(']'); + } + Yaml::Hash(hash) => { + out.push('{'); + for (i, (key, value)) in hash.iter().enumerate() { + if i > 0 { + out.push(','); + } + emit_flow(out, key)?; + out.push_str(": "); + emit_flow(out, value)?; + } + out.push('}'); + } + Yaml::String(s) => emit_yaml_string(out, s), + Yaml::Boolean(true) => out.push_str("true"), + Yaml::Boolean(false) => out.push_str("false"), + Yaml::Integer(i) => out.push_str(&i.to_string()), + Yaml::Real(s) => out.push_str(s), + Yaml::Null | Yaml::BadValue => out.push('~'), + Yaml::Alias(_) => return Err("cannot minimize YAML that contains aliases".to_string()), + } + return Ok(()); +} + +fn emit_yaml_string(out: &mut String, s: &str) { + if need_quotes(s) { + escape_yaml_string(out, s); + } else { + out.push_str(s); + } +} + +/// Same quoting rules as yaml-rust 0.4's emitter, so load/emit round-trips. +fn need_quotes(string: &str) -> bool { + string.is_empty() + || string.starts_with(' ') + || string.ends_with(' ') + || string.starts_with(|character: char| { + matches!(character, '&' | '*' | '?' | '|' | '-' | '<' | '>' | '=' | '!' | '%' | '@') + }) + || string.contains(|character: char| { + matches!( + character, + ':' | '{' | '}' | '[' | ']' | ',' | '#' | '`' | '"' | '\'' | '\\' + | '\0'..='\x06' + | '\t' + | '\n' + | '\r' + | '\x0e'..='\x1a' + | '\x1c'..='\x1f' + ) + }) + || [ + "yes", "Yes", "YES", "no", "No", "NO", "True", "TRUE", "true", "False", "FALSE", + "false", "on", "On", "ON", "off", "Off", "OFF", "null", "Null", "NULL", "~", + ] + .contains(&string) + || string.starts_with('.') + || string.starts_with("0x") + || string.parse::().is_ok() + || string.parse::().is_ok() +} + +fn escape_yaml_string(out: &mut String, v: &str) { + out.push('"'); + let mut start = 0; + for (i, byte) in v.bytes().enumerate() { + let escaped = match byte { + b'"' => "\\\"", + b'\\' => "\\\\", + b'\x00' => "\\u0000", + b'\x01' => "\\u0001", + b'\x02' => "\\u0002", + b'\x03' => "\\u0003", + b'\x04' => "\\u0004", + b'\x05' => "\\u0005", + b'\x06' => "\\u0006", + b'\x07' => "\\u0007", + b'\x08' => "\\b", + b'\t' => "\\t", + b'\n' => "\\n", + b'\x0b' => "\\u000b", + b'\x0c' => "\\f", + b'\r' => "\\r", + b'\x0e' => "\\u000e", + b'\x0f' => "\\u000f", + b'\x10' => "\\u0010", + b'\x11' => "\\u0011", + b'\x12' => "\\u0012", + b'\x13' => "\\u0013", + b'\x14' => "\\u0014", + b'\x15' => "\\u0015", + b'\x16' => "\\u0016", + b'\x17' => "\\u0017", + b'\x18' => "\\u0018", + b'\x19' => "\\u0019", + b'\x1a' => "\\u001a", + b'\x1b' => "\\u001b", + b'\x1c' => "\\u001c", + b'\x1d' => "\\u001d", + b'\x1e' => "\\u001e", + b'\x1f' => "\\u001f", + b'\x7f' => "\\u007f", + _ => continue, + }; + if start < i { + out.push_str(&v[start..i]); + } + out.push_str(escaped); + start = i + 1; + } + if start != v.len() { + out.push_str(&v[start..]); + } + out.push('"'); +} + fn looks_like_unquoted_infinity(yaml: &str) -> bool { - // Match a YAML value `infinity` that is not inside quotes. + // Block-style leftovers and flow mappings (`: infinity}` / `: infinity,`). for line in yaml.lines() { let trimmed = line.trim(); if trimmed == "infinity" || trimmed.ends_with(": infinity") || trimmed.ends_with("- infinity") { return true; } } - return false; + return yaml.contains(": infinity,") || yaml.contains(": infinity}") || yaml.contains(": infinity]"); } fn minimize_yaml_file(src: &Path, dst: &Path) -> Result<(), String> { @@ -143,9 +257,8 @@ fn minimize_yaml_file(src: &Path, dst: &Path) -> Result<(), String> { return Ok(()); } -/// Copy a Rules tree. When `minify` is true, rewrite `Languages/**/unicode.yaml` and -/// `unicode-full.yaml` (comments stripped). `Languages/zz` is omitted. Returns the number of -/// files successfully minimized. +/// Copy a Rules tree. When `minify` is true, rewrite every YAML file as comment-free flow YAML. +/// `Languages/zz` is omitted. Returns the number of files successfully minimized. pub fn copy_rules_tree(src: &Path, dst: &Path, minify: bool) -> io::Result { fs::create_dir_all(dst)?; return copy_dir(src, dst, minify, false); @@ -167,7 +280,7 @@ fn copy_dir(src: &Path, dst: &Path, minify: bool, parent_is_languages: bool) -> if src_path.is_dir() { fs::create_dir_all(&dst_path)?; minimized += copy_dir(&src_path, &dst_path, minify, name == "Languages")?; - } else if minify && should_minimize(&src_path) { + } else if minify && is_yaml_file(&src_path) { match minimize_yaml_file(&src_path, &dst_path) { Ok(()) => minimized += 1, Err(e) => { From 4b9d19ce367e8d4af45b24fe0840f00f64b5133f Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Thu, 20 Aug 2026 00:41:25 -0700 Subject: [PATCH 066/162] bump release number --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 32e83cf27..768d8bd50 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mathcat" -version = "0.7.6-rc.1" +version = "0.7.6-rc.2" authors = ["Neil Soiffer "] license = "MIT" description = "MathCAT: Math Capable Assistive Technology ('Speech and braille from MathML')" From eaa36e9ed03bfb147e66eb275186b718af464abd Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Thu, 20 Aug 2026 00:44:35 -0700 Subject: [PATCH 067/162] Fix #698 -- merge arc-like symbols under restricted condidtions --- src/canonicalize.rs | 128 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 126 insertions(+), 2 deletions(-) diff --git a/src/canonicalize.rs b/src/canonicalize.rs index 380c4de0c..8b91aff8e 100644 --- a/src/canonicalize.rs +++ b/src/canonicalize.rs @@ -776,7 +776,53 @@ impl CanonicalizeContext { fn contains_currency(s: &str) -> bool { s.chars().any(is_currency_symbol) - } + } + + /// Geometry arc names like AB / ABC: a leaf whose text is 2–3 ASCII capitals. + fn is_two_or_three_ascii_capitals(base: Element) -> bool { + if !is_leaf(base) { + return false; + } + let text = as_str!(as_text(base)); + let n = text.chars().count(); + return (n == 2 || n == 3) && text.chars().all(|c| c.is_ascii_uppercase()); + } + + /// `mrow` of 2 or 3 capital ``s, optionally separated by U+2062 / U+2063 ``s. + fn is_mrow_of_two_or_three_cap_identifiers(base: Element) -> bool { + if name(base) != "mrow" { + return false; + } + let children = base.children(); + if children.is_empty() { + return false; + } + let mut n_mi = 0; + let mut prev_was_mo = false; + for (i, child) in children.iter().enumerate() { + let child = as_element(*child); + if name(child) == "mi" { + let text = as_str!(as_text(child)); + if !(text.chars().count() == 1 && text.chars().next().unwrap().is_ascii_uppercase()) { + return false; + } + n_mi += 1; + prev_was_mo = false; + } else if name(child) == "mo" { + if i == 0 || prev_was_mo { + return false; + } + let text = as_str!(as_text(child)); + if text != "\u{2062}" && text != "\u{2063}" { + return false; + } + prev_was_mo = true; + } else { + return false; + } + } + return !prev_was_mo && (n_mi == 2 || n_mi == 3); + } // begin by cleaning up empty elements // debug!("clean_mathml\n{}", mml_to_string(mathml)); @@ -985,10 +1031,22 @@ impl CanonicalizeContext { } }, "..." => { - if name(get_parent(mathml)) != "mover" { + if parent_name != "mover" { mathml.set_text("
"); } // name might need to change -- checked below }, + "⌱" | "⏜" => { // lookalikes: U+2322 (“Frown”), U+23DC (“Top Parenthesis”) + // arc should be over constructs like AB or ABC + if parent_name == "mover" { + let parent = get_parent(mathml); + let base = as_element(parent.children()[0]); // already made sure correct number of children + if base != mathml && + (is_two_or_three_ascii_capitals(base) || is_mrow_of_two_or_three_cap_identifiers(base)) { + mathml.set_text("⌒"); // U+2312 + } + } + return Some(mathml); + }, ":" => { if is_ratio(mathml) { mathml.set_text("∶"); // ratio U+2236 @@ -6022,6 +6080,72 @@ mod canonicalize_tests { are_strs_canonically_equal_result(test_str, target_str, &[]) } + #[test] + fn clean_up_arc_lookalike_mrow() -> Result<()> { + // Frown over two capital identifiers is rewritten to the arc operator (U+2312) + let test_str = "ABC⌢"; + let target_str = " + + + A + ⁣ + B + ⁣ + C + + ⌒ + + "; + are_strs_canonically_equal_result(test_str, target_str, &[]) + } + + #[test] + fn clean_up_arc_lookalike_mrow_invisible_sep() -> Result<()> { + // Same rewrite when the capital identifiers are already separated by U+2063 + let test_str = "B⁣C⌢"; + let target_str = " + + + B + ⁣ + C + + ⌒ + + "; + are_strs_canonically_equal_result(test_str, target_str, &[]) + } + + #[test] + fn clean_up_arc_lookalike_mtext() -> Result<()> { + // Frown over a 2-letter capital mtext is rewritten to the arc operator (U+2312) + let test_str = "BC⌢"; + let target_str = " + + + B + ⁣ + C + + ⌒ + + "; + are_strs_canonically_equal_result(test_str, target_str, &[]) + } + + #[test] + fn clean_up_arc_lookalike_not_letters() -> Result<()> { + // Frown over a single lowercase identifier is left as a frown, not an arc + let test_str = "z⌢"; + let target_str = " + + z + ⌱ + + "; + are_strs_canonically_equal_result(test_str, target_str, &[]) + } + #[test] fn roman_numeral() -> Result<()> { let test_str = "XLVIII +mmxxvi"; From cf0b751b40a03c3d64d851f5b933bcfa21688087 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Arborealis=20L=C3=B6tberg?= <143188129+TimArborealis@users.noreply.github.com> Date: Thu, 20 Aug 2026 16:19:15 +0200 Subject: [PATCH 068/162] Update user guide Updated English user guide with info on how to use MathCAT as an addon in NVDA. --- docs/users.md | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/docs/users.md b/docs/users.md index a5ab487d3..6328e522f 100644 --- a/docs/users.md +++ b/docs/users.md @@ -10,6 +10,8 @@ MathCAT is a tool used together with a screen reader. Through MathCAT, you can h In screen readers NVDA and JAWS, MathCAT comes built-in. This means you don’t have to install it as an addon. +MathCAT is still available as an addon to NVDA. You can use it if you want access to the very latest features between NVDA releases. [How to use MathCAT as an addon is described here](#how-to-install-mathcat-as-an-addon-in-nvda). + ## Get started with MathCAT Use your screen reader on a web page or in an e-book as usual. When you get to a mathematical expression, the screen reader will read it out automatically. If you want to investigate the expression more closely you can activate the navigation mode by pressing Space. In NVDA, the NVDA-key+Alt+M can also be used. If you want to leave the navigation mode, press Escape. @@ -137,4 +139,42 @@ Note: tabular math means mathematical content in a table structure such as a mat ## Do you have feedback on MathCAT? -MathCAT is under active development, and we want your feedback. Do you have a feature request, or have you found any bugs? Please create an issue on [MathCAT's GitHub page](https://github.com/daisy/MathCAT/issues). You are also welcome to get in touch by signing up to [the mailing list of the DAISY MathCAT working group](https://www.surveymonkey.com/r/HXTLXGN). \ No newline at end of file +MathCAT is under active development, and we want your feedback. Do you have a feature request, or have you found any bugs? Please create an issue on [MathCAT's GitHub page](https://github.com/daisy/MathCAT/issues). You are also welcome to get in touch by signing up to [the mailing list of the DAISY MathCAT working group](https://www.surveymonkey.com/r/HXTLXGN). + +## How to install MathCAT as an addon in NVDA + +To use MathCAT as an add-on, do the following: + +1. Open the NVDA menu. +2. Choose Tools and then Add-on store. +3. In the add-on store, choose Available add-ons. + + The channel settings have the following options: + - Stable: Will only search for stable add-ons + - All: Will search for all add-ons + - Beta: Will search for add-ons that are in beta + - Dev: Will search for add-ons in development + + Choose option "All". + +4. Search for MathCAT and install. + +5. In the settings menu, you can control how add-ons are updated: + + - Open the NVDA menu + - Choose settings and Add-on Store + + For Automatic updates, you can choose between: + - Notify + - Update Automatically + - Deactivated + + For Default update channel, you have the following options: + + - Same: If automatic updates is set to “Update Automatically” and your add-on is a beta, it will update to the first available beta. + - Any: It will update to any version of the add-on. + - Do not update + - Stable: It will only update to stable versions. + - Beta or dev: It will update to beta or dev versions. + - Beta: It will update to beta versions. + - Dev: It will update to dev versions. \ No newline at end of file From c7c25faf8160add1d189dac4f2080a5d476006d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Arborealis=20L=C3=B6tberg?= <143188129+TimArborealis@users.noreply.github.com> Date: Fri, 21 Aug 2026 10:20:53 +0200 Subject: [PATCH 069/162] Updated acknowledgements Updated acknowledgements with French, Hungarian and Polish translators. --- docs/index.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/index.md b/docs/index.md index f0e944723..36b4ca41d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -171,13 +171,16 @@ Several people helped out in various ways with the project. I am very grateful f Translators: * Chinese (Traditional) -- Hon-Jang Yang -* Finnish -- Sami MÀÀttĂ€, Accessibility Library Celia, and Essi Viippola, freelancer +* Finnish -- Sami MÀÀttĂ€ (Accessibility Library Celia), and Essi Viippola (freelancer) +* French -- Olivier Thiffault (Technologies Humanware) * German -- Nazli Andjic, Robert Graf and Paul Libbrecht (IU International University of Applied Sciences) +* Hungarian -- Attila Hammer (IT Foundation for the Visually Impaired) * Indonesian -- Dr. Pinta Deniyanti Sampoerno, M.Si; Dr. Meiliasari, S.Pd., M.Sc; and Ari Hendarno, S.Pd., M.Kom. -* Norwegian -- Marthe Gjelstad, National Library of Norway, Kvile +* Norwegian -- Marthe Gjelstad (National Library of Norway), Kvile +* Polish -- MichaƂ Dziwisz (Fundacja Instytut Rozwoju Regionalnego) * Russian (both speech and braille) -- Danil Kostenkov * Spanish -- Noelia Ruiz MartĂ­nez (also helped with NVDA add-on development) and MarĂ­a Allo RoldĂĄn -* Swedish -- Tim Arborealis Lötberg, Swedish Agency for Accessible Media (MTM) and Anders Eklund, SPSM +* Swedish -- Tim Arborealis Lötberg (MTM), and Anders Eklund (SPSM) * Vietnamese -- Dang Hoai PhĂșc and Trang Pham * Others??? -- please volunteer so I can list you here... From 76b3e59ed385a667723f8e070e8e966845ba00cf Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Fri, 21 Aug 2026 18:15:57 -0700 Subject: [PATCH 070/162] fix #703 --- Rules/Braille/Nemeth/unicode-full.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rules/Braille/Nemeth/unicode-full.yaml b/Rules/Braille/Nemeth/unicode-full.yaml index 935933a2a..30ffc561d 100644 --- a/Rules/Braille/Nemeth/unicode-full.yaml +++ b/Rules/Braille/Nemeth/unicode-full.yaml @@ -801,7 +801,7 @@ - "⋁": [t: "⠈⠏"] # 0x22c1 - "⋂": [t: "â šâ ©"] # 0x22c2 - "⋃": [t: "â šâ Ź"] # 0x22c3 - - "⋄": [t: "â «â ©"] # 0x22c4 + - "⋄": [t: "⠫⠙"] # 0x22c4 - "⋜": [t: "⠱⠐⠅"] # 0x22dc - "⋝": [t: "⠱⠚⠂"] # 0x22dd - "⟂": [t: "⠫⠏"] # 0x27c2 From fc79ce983e4cfa34208d4e198ed1dc5fa9441a7e Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Fri, 21 Aug 2026 18:18:04 -0700 Subject: [PATCH 071/162] Fix up UEB mtable notations. There are made up rules (awaiting feedback from ICEB) about how to represent the start of a new row in linear form. add two dot-like characters used in an ellision example in a matrix --- Rules/Braille/UEB/UEB_Rules.yaml | 59 +++++++++------ Rules/Braille/UEB/unicode-full.yaml | 3 +- Rules/Braille/UEB/unicode.yaml | 1 + tests/braille/UEB/iceb.rs | 111 +++++++++++++++++++++++----- tests/braille/UEB/other.rs | 13 ++++ 5 files changed, 143 insertions(+), 44 deletions(-) diff --git a/Rules/Braille/UEB/UEB_Rules.yaml b/Rules/Braille/UEB/UEB_Rules.yaml index 04c63947d..4d5b8ca1d 100644 --- a/Rules/Braille/UEB/UEB_Rules.yaml +++ b/Rules/Braille/UEB/UEB_Rules.yaml @@ -138,42 +138,53 @@ # matrix and determinant are the same other than "matrix"/"determinant" based on the bracketing chars # we don't do spatial layout, instead the beginning/ending of each row uses the enlarged bracketing chars - - 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-matrix + tag: mrow + variables: + - RowStart: "*[1]" + - RowEnd: "*[3]" + match: + - "*[2][self::m:mtable] and" + - (IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|')) + replace: [x: "*[2]"] + - - name: default-mtable - tag: mtable - match: "." - replace: [x: "*"] + name: default-mtable + tag: mtable + match: "." + variables: # should only be here for lines of equations -- made up dot-6, dot 0 as a parallel to dot six before parens + - RowStart: "IfThenElse($RowStart = '', '⠀', $RowStart)" + - RowEnd: "IfThenElse($RowEnd = '', '⠀', $RowEnd)" + replace: [x: "*"] + - name: default tag: [mtr, mlabeledtr] match: "." replace: - - test: - if: "../*[2]" # more than one row + - test: + if: "preceding-sibling::*" # between rows (not before the first) then: [t: "â žW"] - - x: $RowStart - - test: + - test: + if: "../../self::m:mrow" # matrix, etc., or non-standalone lines (probably doesn't happen) + then: + - t: "â  " + - x: $RowStart + - test: if: .[self::m:mlabeledtr] then: - - t: "⠗⠕â șW⠇⠁⠃⠑⠇⠾⠒" # "row label:" - - x: "*[1]/*" # contents of row label - - test: + - t: "⠗⠕â șW⠇⠁⠃⠑⠇⠾⠒" # "row label:" + - x: "*[1]/*" # contents of row label + - test: if: .[self::m:mlabeledtr] then: [x: "*[position()>1]"] else: [x: "*"] - - test: - if: "../*[2]" # more than one row - then: [t: "â  "] - - x: $RowEnd + - test: + if: "../../self::m:mrow" # matrix, etc., or non-standalone lines (probably doesn't happen) + then: + - t: "â  " + - x: $RowEnd + - name: default tag: mtd diff --git a/Rules/Braille/UEB/unicode-full.yaml b/Rules/Braille/UEB/unicode-full.yaml index 1df920330..717fa5355 100644 --- a/Rules/Braille/UEB/unicode-full.yaml +++ b/Rules/Braille/UEB/unicode-full.yaml @@ -130,7 +130,8 @@ - "‒": [t: "â €"] # 0x2012 (figure dash) - "—": [t: "Pâ  â €"] # 0x2014 (em dash) - "‱": [t: "â žâ Č"] # 0x2022 - - " ": [t: "â Č"] # 0x2024 + - " ": [t: "⠄"] # 0x2024 (one dot leader; GTM 15.4 matrix omission dot) + - " ": [t: "â Čâ Č"] # 0x2025 - "‌": [t: "⠖⠖"] # 0x203C - "‟": [t: "â ±"] # 0x203E diff --git a/Rules/Braille/UEB/unicode.yaml b/Rules/Braille/UEB/unicode.yaml index ccee08652..477946d70 100644 --- a/Rules/Braille/UEB/unicode.yaml +++ b/Rules/Braille/UEB/unicode.yaml @@ -118,6 +118,7 @@ - "†": [t: "⠈⠠â č"] # 0x2020 (Dagger) - "‡": [t: "⠈⠠⠻"] # 0x2021 (Double dagger) - "
": [t: "câ Čcâ Čcâ Č"] # 0x2026 (Ellipsis) + - "⋯": [t: "⠄⠄⠄"] # 0x22EF (midline horizontal ellipsis; GTM 15.4 matrix omission) - "â€Č": [t: "1â ¶"] # 0x2032 (Prime sign) - "″": [t: "1â ¶â ¶"] # 0x2033 (Double prime sign) - "‮": [t: "1â ¶â ¶â ¶"] # 0x2034 (Triple prime sign) diff --git a/tests/braille/UEB/iceb.rs b/tests/braille/UEB/iceb.rs index 2c7c9a5c7..b7f3a6560 100644 --- a/tests/braille/UEB/iceb.rs +++ b/tests/braille/UEB/iceb.rs @@ -1468,43 +1468,116 @@ fn binomial_14_3_3_2_mtable() -> Result<()> { #[test] fn matrix_15_2_1() -> Result<()> { // GTM 15.2 first example: I = [[1,0],[0,1]] with enlarged parentheses (one-line encoding). - let expr = r#"( - 10 - 01 - )"#; - test_braille("UEB", expr, "â žâ €â â Łâ Œâ â €â Œâ šâ  â â œâ žâ €â â Łâ Œâ šâ €â Œâ â  â â œ")?; + let expr = r#"I= + ( + 10 + 01 + ) + "#; + test_braille("UEB", expr, "â  â Šâ €â â ¶â €â  â â Łâ Œâ â €â Œâ šâ  â â œâ žâ €â  â â Łâ Œâ šâ €â Œâ â  â â œ")?; return Ok(()); } #[test] fn matrix_15_2_2() -> Result<()> { - // GTM 15.2: matrix with enlarged square brackets. - let expr = r#"[ - ab - cd - ]"#; - test_braille("UEB", expr, "⠾⠀⠹⠣⠁⠀⠃⠠⠹⠜⠾⠀⠹⠣⠰⠉⠀⠙⠠⠹⠜")?; + // GTM 15.2 second example: matrix multiplication (linearized with `⠾⠀` between rows). + // [1 2 3; 4 5 6] [1 2; -3 4; 5 -6] + let expr = r#" + [ + 123 + 456 + ] + [ + 12 + -34 + 5-6 + ] + "#; + // example has G1 passage mode start/end, but they are not needed and not included. + test_braille( + "UEB", + expr, + "â  â šâ Łâ Œâ â €â Œâ ƒâ €â Œâ ‰â  â šâ œâ žâ €â  â šâ Łâ Œâ ™â €â Œâ ‘â €â Œâ ‹â  â šâ œâ  â šâ Łâ Œâ â €â Œâ ƒâ  â šâ œâ žâ €â  â šâ Łâ â €â Œâ ‰â €â Œâ ™â  â šâ œâ žâ €â  â šâ Łâ Œâ ‘â €â â €â Œâ ‹â  â šâ œ", + )?; return Ok(()); } #[test] fn matrix_15_2_3() -> Result<()> { - // Single-row: no enlarged (dot-6) markers (UEB_Rules one-row path). + // GTM 15.2 third example: (a −b ; −c d), linearized with `⠾⠀` between rows. + // Spec spatial braille (ASCII): ,"< a "-b,"> / ,"<"-c d,"> + // Spec spatial (Unicode): â  â â Łâ €â â €â â €â ƒâ  â â œ / â  â â Łâ â €â ‰â €â ™â  â â œ + // (extra space after the first-row open paren aligns columns so the minus stands out) let expr = r#"( - 123 + a-b + -cd )"#; - test_braille("UEB", expr, "â â Łâ Œâ â €â Œâ ƒâ €â Œâ ‰â â œ")?; + test_braille("UEB", expr, "â  â â Łâ â €â â €â ƒâ  â â œâ žâ €â  â â Łâ â €â ‰â €â ™â  â â œ")?; return Ok(()); } #[test] fn determinant_15_3_1() -> Result<()> { - // GTM 15.3: determinant with enlarged vertical bars. + // GTM 15.3: |P| = |a b; c d| = ad − bc (determinant linearized with `⠾⠀` between rows). + let expr = r#" + |P| + = + | + ab + cd + | + = + ad-bc + "#; + test_braille( + "UEB", + expr, + "â žâ łâ  â â žâ łâ €â â ¶â €â  â žâ łâ â €â ƒâ  â žâ łâ žâ €â  â žâ łâ ‰â €â ™â  â žâ łâ €â â ¶â €â â ™â â €â ƒâ ‰", + )?; + return Ok(()); +} + +#[test] +fn omission_15_4_1() -> Result<()> { + // GTM 15.4: determinant with omission dots (linearized with `⠾⠀` between rows). + // Spec spatial (ASCII): + // ;;;,_|a5#aa a5#ab 444 a5<#an>,_| + // ,_|a5#ba a5#bb 444 a5<#bn>,_| + // ,_| 4 4 444 4 ,_| + // ,_|a5 a5 444 a5 ,_|;' + // Spec uses . (⠄) / ⋯ (⠄⠄⠄) for omission dots; U+2024 / U+22EF in the MathML. let expr = r#"| - 12 - 34 - |"#; - test_braille("UEB", expr, "â žâ €â žâ łâ Œâ â €â Œâ ƒâ  â žâ łâ žâ €â žâ łâ Œâ ‰â €â Œâ ™â  â žâ ł")?; + + a11 + a12 + ⋯ + + a1n + + + a21 + a22 + ⋯ + a2n + + + . + . + ⋯ + . + + + am1 + am2 + ⋯ + amn + + |"#; + test_braille( + "UEB", + expr, + "â °â °â °â  â žâ łâ â ąâ Œâ â â €â â ąâ Œâ â ƒâ €â „â „â „â €â â ąâ Łâ Œâ â â œâ  â žâ łâ žâ €â  â žâ łâ â ąâ Œâ ƒâ â €â â ąâ Œâ ƒâ ƒâ €â „â „â „â €â â ąâ Łâ Œâ ƒâ â œâ  â žâ łâ žâ €â  â žâ łâ Č⠀â Č⠀⠄⠄⠄⠀â Čâ  â žâ łâ žâ €â  â žâ łâ â ąâ Łâ â Œâ â œâ €â â ąâ Łâ â Œâ ƒâ œâ €â „â „â „â €â â ąâ Łâ â â œâ  â žâ łâ °â „", + )?; return Ok(()); } diff --git a/tests/braille/UEB/other.rs b/tests/braille/UEB/other.rs index b31f9958f..f1beb55cc 100644 --- a/tests/braille/UEB/other.rs +++ b/tests/braille/UEB/other.rs @@ -255,3 +255,16 @@ fn ueb_italic_typeform_for_digits() -> Result<()> { return Ok(()); } +#[test] +fn multiple_lines() -> Result<()> { + init_logger(); + // Bare equation-line mtable: `⠾⠀` between rows, no start/end bounds. + let expr = "x=f(t)y=g(t)"; + test_braille( + "UEB", + expr, + "â °â ­â €â â ¶â €â ‹â â Łâ žâ â œâ žâ €â °â œâ €â â ¶â €â ›â â Łâ žâ â œ", + )?; + Ok(()) +} + From 1b32804d01fbe1b3a86fd5f023ef03cc5a969155 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Fri, 21 Aug 2026 20:04:30 -0700 Subject: [PATCH 072/162] accidentally picked up wrong version # when merged in release-candidate --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 768d8bd50..67522e0b3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mathcat" -version = "0.7.6-rc.2" +version = "0.7.7-alpha.1" authors = ["Neil Soiffer "] license = "MIT" description = "MathCAT: Math Capable Assistive Technology ('Speech and braille from MathML')" From 7ee9e3a3fc688660eb012adf41d8ca308ba99123 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Fri, 21 Aug 2026 20:05:16 -0700 Subject: [PATCH 073/162] bump version # --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 768d8bd50..26749dc34 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mathcat" -version = "0.7.6-rc.2" +version = "0.7.6-rc.3" authors = ["Neil Soiffer "] license = "MIT" description = "MathCAT: Math Capable Assistive Technology ('Speech and braille from MathML')" From f89080fa73bb8d2441ae28bb91bfef2f020864ed Mon Sep 17 00:00:00 2001 From: mgros Date: Sun, 23 Aug 2026 00:59:29 +0200 Subject: [PATCH 074/162] add Math4VIP to German translators --- docs/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index 36b4ca41d..62805d15a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -166,14 +166,14 @@ Several people helped out in various ways with the project. I am very grateful f * Elaine A. Moore -- helped me to figure out what should and should not be said for chemistry, along with what makes sense as chemistry and what doesn't. * Richard Orme -- did all the work for the MathCAT NVDA settings dialog. * Sam Dooley, Murray Sargent, and Volker Sorge -- provided tables of Nemeth translations of characters and Nemeth tests -* Moritz Groß ([Math4VIP](https://www.math4vip.de/)) -- worked on various parts of the Rust code base, and built the Python tool for tracking localization progress. +* Moritz Groß ([Math4VIP](https://www.math4vip.de/), Marburg University) -- worked on various parts of the Rust code base, and built the Python tool for tracking localization progress. Translators: * Chinese (Traditional) -- Hon-Jang Yang * Finnish -- Sami MÀÀttĂ€ (Accessibility Library Celia), and Essi Viippola (freelancer) * French -- Olivier Thiffault (Technologies Humanware) -* German -- Nazli Andjic, Robert Graf and Paul Libbrecht (IU International University of Applied Sciences) +* German -- Nazli Andjic, Robert Graf and Paul Libbrecht (IU International University of Applied Sciences), and Moritz Groß (Math4VIP, Marburg University) * Hungarian -- Attila Hammer (IT Foundation for the Visually Impaired) * Indonesian -- Dr. Pinta Deniyanti Sampoerno, M.Si; Dr. Meiliasari, S.Pd., M.Sc; and Ari Hendarno, S.Pd., M.Kom. * Norwegian -- Marthe Gjelstad (National Library of Norway), Kvile From 88129bed9597d4ed8ce92725b71f4bab49d497ee Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Sun, 23 Aug 2026 00:25:10 -0700 Subject: [PATCH 075/162] Fix up arc look-alike chars due to canonicalize change. Remove duplicate char definitions in unicode files. --- Rules/Braille/French/French_Rules.yaml | 2 +- Rules/Braille/French/unicode-full.yaml | 2 +- Rules/Braille/French/unicode.yaml | 12 +----------- 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/Rules/Braille/French/French_Rules.yaml b/Rules/Braille/French/French_Rules.yaml index 3c77813a5..46c74a15c 100644 --- a/Rules/Braille/French/French_Rules.yaml +++ b/Rules/Braille/French/French_Rules.yaml @@ -424,7 +424,7 @@ - name: single-char-exceptions tag: [mover] - match: "*[2][translate(., \"⏜^â†’â‡€ÂŻâŒŁâ—ŒÌŒ~\",'')='']" + match: "*[2][translate(., \"⌒⌱⏜^â†’â‡€ÂŻâŒŁâ—ŒÌŒ~\",'')='']" replace: - x: "*[2]" - x: "*[1]" diff --git a/Rules/Braille/French/unicode-full.yaml b/Rules/Braille/French/unicode-full.yaml index c0bc5275e..65530bdf8 100644 --- a/Rules/Braille/French/unicode-full.yaml +++ b/Rules/Braille/French/unicode-full.yaml @@ -19,7 +19,7 @@ - "ï»ż": [t: ""] # 0xfeff (BOM / zero-width no-break space) - - "⇌ℂ℄℃": [t: "â žâ »"] # 0x21CC/2942/2944/2943 equilibrium (incl. trend variants) + - "ℂ℄℃": [t: "â žâ »"] # 0x2942/2944/2943 equilibrium trend variants (⇌/0x21CC is in unicode.yaml) # Mappings for some new Unicode chemistry arrows/symbols # These repeat the short arrow version because that is what is in the spec (GTM 16), but the spec should really use the long version diff --git a/Rules/Braille/French/unicode.yaml b/Rules/Braille/French/unicode.yaml index 89f876bd6..694f6d73e 100644 --- a/Rules/Braille/French/unicode.yaml +++ b/Rules/Braille/French/unicode.yaml @@ -370,20 +370,10 @@ - "⊗": [t: "⠹⠔"] # 0x2297 (circle with interior cross (tensor product)) - "⊄": [t: "⠘⠳"] # 0x22A5 (is perpendicular to) - "⋅": [t: "⠔⠔"] # 0x22C5 (dot,and times) - - "⟔": [t: "â žâ Ș"] # 0x27F5 (Long leftwards arrow ) - - "⟶": # 0x27F6 (Long rightwards arrow) - - test: - if: "parent::m:mover and not(following-sibling::*)" - then: [t: "⠹⠒"] - else: [t: "â žâ ±"] - - "⟷": [t: "â žâ »"] # 0x27F7 (Long left right arrow) - - "⟾": [t: "⠐⠒"] # 0x27F8 (Long leftwards arrow ) - - "âŸč": [t: "⠒⠂"] # 0x27F9 (Long rightwards arrow) - - "âŸș": [t: "⠐⠒⠂"] # 0x27FA (Long left right arrow) - "⌄": [t: "⠾⠘⠒"] # 0x2304 (inverted caret) - "⌣": [t: "⠈⠈⠈"] # 0x2323 (smile) - - "⏜": [t: "⠈⠒"] # 0x23DC (arc concave upward) + - "⌒⌱⏜": [t: "⠈⠒"] # 0x2312 (ARC), 0x2322 (FROWN), 0x23DC (TOP PARENTHESIS) - "△": [t: "⠹⠘⠙"] # 0x25B3 (increment (laplacian Delta) ) - "✕": [t: "⠐⠐⠔"] # 0x2715 (multiplication X) - "⟧": [t: "â šâ Ÿ"] # 0x27E7 (right barred bracket) From 9f8d81f29fa0bf983b7746d3168f74838f81ffea Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Tue, 25 Aug 2026 01:47:42 -0700 Subject: [PATCH 076/162] fixes no-unsafe branch clippy issues --- src/braille.rs | 12 ++++++------ src/chemistry.rs | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/braille.rs b/src/braille.rs index 553059bfc..1966f09c0 100644 --- a/src/braille.rs +++ b/src/braille.rs @@ -2430,10 +2430,10 @@ fn remove_optional_group_indicators(braille: &str) -> String { for (i, &ch) in chars.iter().enumerate() { if ch == 'b' { stack.push(i); - } else if ch == 'e' { - if let Some(b_idx) = stack.pop() { - pairs.push((b_idx, i)); - } + } else if ch == 'e' + && let Some(b_idx) = stack.pop() + { + pairs.push((b_idx, i)); } } @@ -2583,7 +2583,7 @@ fn french_cleanup(_pref_manager: Ref, raw_braille: String) -> // This reuses the code just for getting rid of unnecessary "L"s and "N"s let result = remove_unneeded_mode_changes(&result, UEB_Mode::Grade1, UEB_Duration::Passage); - debug!(" after removing mode changes={}", &result); + debug!(" after removing mode changes={}", result); // remove any grouping pair at the start or end -- we ensure they are a pair but making sure there is no "o" inside the string let result = if result.starts_with('o') && result.ends_with('c') && !result[1..result.len() - 1].contains('o') { @@ -3553,7 +3553,7 @@ impl NeedsToBeGrouped { }; debug!("needs_grouping_for_french: mathml (sans '-') = {}", mml_to_string(mathml)); - let node_name = name(mathml); + let node_name = as_str!(name(mathml)); let children = mathml.children(); match node_name { "mn" | "mi" | "mtext" => { diff --git a/src/chemistry.rs b/src/chemistry.rs index 78bbd3746..64295196a 100644 --- a/src/chemistry.rs +++ b/src/chemistry.rs @@ -534,9 +534,9 @@ fn set_marked_chemistry_attr(mathml: Element, chem: &str) { // inherit from the base let base = as_element(mathml.children()[0]); if let Some(base_chem) = base.attribute(CHEM_EQUATION_OPERATOR) { - mathml.set_attribute_value(CHEM_EQUATION_OPERATOR, base_chem.value()); + mathml.set_attribute_value(CHEM_EQUATION_OPERATOR, as_str!(base_chem.value())); } else if let Some(base_chem) = base.attribute(CHEM_FORMULA_OPERATOR) { - mathml.set_attribute_value(CHEM_FORMULA_OPERATOR, base_chem.value()); + mathml.set_attribute_value(CHEM_FORMULA_OPERATOR, as_str!(base_chem.value())); } } _ => error!("Internal error: {} should not be marked as 'MAYBE_CHEMISTRY'", tag_name), From 4952dd78b8ffcf138635c6290b26c8e852965bbb Mon Sep 17 00:00:00 2001 From: Richard Orme Date: Fri, 28 Aug 2026 00:58:45 +0100 Subject: [PATCH 077/162] Update MathCAT logo and add descriptive alt text. (#714) Co-authored-by: Cursor --- README.md | 2 +- docs/callers.md | 2 +- docs/helpers_old.md | 2 +- docs/index.md | 2 +- docs/ru/callers.md | 2 +- docs/ru/helpers.md | 2 +- docs/ru/index.md | 2 +- docs/ru/users.md | 2 +- docs/users_old.md | 2 +- logo.png | Bin 5162 -> 64842 bytes mathcat_logo_regular.png | Bin 0 -> 55590 bytes 11 files changed, 9 insertions(+), 9 deletions(-) create mode 100644 mathcat_logo_regular.png diff --git a/README.md b/README.md index de080bb0f..d34a66632 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # MathCAT: Math Capable Assistive Technology -The MathCAT logo with a cat sitting on the text MathCAT +Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. is a library that supports conversion of MathML to: diff --git a/docs/callers.md b/docs/callers.md index 763a8484e..0fbe0f189 100644 --- a/docs/callers.md +++ b/docs/callers.md @@ -1,5 +1,5 @@ # MathCAT: Math Capable Assistive Technology - +Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. ## Information for AT and Other Library Users diff --git a/docs/helpers_old.md b/docs/helpers_old.md index 59b8387a3..dea983da6 100644 --- a/docs/helpers_old.md +++ b/docs/helpers_old.md @@ -1,4 +1,4 @@ -# Translator and Rule Developer Guide +# Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. Translator and Rule Developer Guide ## Information for MathCAT Rule Developers/Translators This page is a work-in-progress. diff --git a/docs/index.md b/docs/index.md index 62805d15a..e965c905d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,5 +1,5 @@ # MathCAT: Math Capable Assistive Technology - +Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. is a library that supports conversion of MathML to: * Speech strings with embedded speech engine commands diff --git a/docs/ru/callers.md b/docs/ru/callers.md index c189234e3..cc3117baa 100644 --- a/docs/ru/callers.md +++ b/docs/ru/callers.md @@ -5,7 +5,7 @@ ref: callers title: Đ˜ĐœŃ‚Đ”ĐłŃ€Đ°Ń†ĐžŃ MathCAT --- # MathCAT: срДЎстĐČĐŸ ĐŸĐ±Đ”ŃĐżĐ”Ń‡Đ”ĐœĐžŃ ĐŽĐŸŃŃ‚ŃƒĐżĐœĐŸŃŃ‚Đž ĐŒĐ°Ń‚Đ”ĐŒĐ°Ń‚ĐžĐșĐž - +Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. ## Đ˜ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃ ĐŽĐ»Ń Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐŸĐČ Đ°ŃŃĐžŃŃ‚ĐžĐČĐœŃ‹Ń… Ń‚Đ”Ń…ĐœĐŸĐ»ĐŸĐłĐžĐč Đž ĐżĐŸĐ»ŃŒĐ·ĐŸĐČатДлДĐč Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”ĐșĐž diff --git a/docs/ru/helpers.md b/docs/ru/helpers.md index be36a6116..0cb0b8769 100644 --- a/docs/ru/helpers.md +++ b/docs/ru/helpers.md @@ -4,7 +4,7 @@ lang: ru ref: helpers title: РуĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ пДрДĐČĐŸĐŽŃ‡ĐžĐșа Đž Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа праĐČОл --- -# РуĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ пДрДĐČĐŸĐŽŃ‡ĐžĐșа Đž Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа праĐČОл +# Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. РуĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ пДрДĐČĐŸĐŽŃ‡ĐžĐșа Đž Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа праĐČОл ## Đ˜ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃ ĐŽĐ»Ń Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐŸĐČ ĐżŃ€Đ°ĐČОл Đž пДрДĐČĐŸĐŽŃ‡ĐžĐșĐŸĐČ MathCAT Эта ŃŃ‚Ń€Đ°ĐœĐžŃ†Đ° ĐœĐ°Ń…ĐŸĐŽĐžŃ‚ŃŃ ĐČ ĐżŃ€ĐŸŃ†Đ”ŃŃĐ” ĐżĐŸĐŽĐłĐŸŃ‚ĐŸĐČĐșĐž. diff --git a/docs/ru/index.md b/docs/ru/index.md index 25c7d1b5a..a577238ad 100644 --- a/docs/ru/index.md +++ b/docs/ru/index.md @@ -5,7 +5,7 @@ ref: index title: MathCAT --- # MathCAT: срДЎстĐČĐŸ ĐŸĐ±Đ”ŃĐżĐ”Ń‡Đ”ĐœĐžŃ ĐŽĐŸŃŃ‚ŃƒĐżĐœĐŸŃŃ‚Đž ĐŒĐ°Ń‚Đ”ĐŒĐ°Ń‚ĐžĐșĐž - +Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. — Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đșа, ĐșĐŸŃ‚ĐŸŃ€Đ°Ń ĐżŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ŃƒĐ”Ń‚ MathML ĐČ: * тДĐșст ĐŽĐ»Ń ĐŸĐ·ĐČучоĐČĐ°ĐœĐžŃ ŃĐŸ ĐČŃŃ‚Ń€ĐŸĐ”ĐœĐœŃ‹ĐŒĐž ĐșĐŸĐŒĐ°ĐœĐŽĐ°ĐŒĐž ŃĐžĐœŃ‚Đ”Đ·Đ°Ń‚ĐŸŃ€Đ° рДчО; diff --git a/docs/ru/users.md b/docs/ru/users.md index 29d4fa9f1..bb4102cc5 100644 --- a/docs/ru/users.md +++ b/docs/ru/users.md @@ -4,7 +4,7 @@ lang: ru ref: users title: РуĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń MathCAT --- -# Đ›ĐŸĐłĐŸŃ‚ĐžĐż MathCAT РуĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń +# Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. РуĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń ## Đ Đ”ĐșĐŸĐŒĐ”ĐœĐŽĐ°Ń†ĐžĐž ĐżĐŸ ĐČŃ‹Đ±ĐŸŃ€Ńƒ ĐłĐŸĐ»ĐŸŃĐ° diff --git a/docs/users_old.md b/docs/users_old.md index 5acaecc8e..308f74bdb 100644 --- a/docs/users_old.md +++ b/docs/users_old.md @@ -3,7 +3,7 @@ layout: default lang: en ref: users --- -# MathCAT logo User Guide +# Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. User Guide ## Advice on Choosing a Voice diff --git a/logo.png b/logo.png index ca5b5c9f79a5ac789def198da43ada8e8810352f..51400749c09484d06e1157195d2a2cb12b116e3a 100644 GIT binary patch literal 64842 zcmd43i9eKW_%?pqv-gmqk`_xyWG%voWXrx3F|w~wgsf9ak4nm#ePkKCvSuBUgzQ^( zE%q48Ft(X_uiJRO-}m?a1;6<`pQpLzzRi8D=XspRd7KljuX}@)={OSvL9Ch@YK9O* z3*OQ~hv>mSA-tlY5Jdb(Q%%L#FZnNV(Tnp@DsDH}Q22J-2QePiyF8&)ED^$EA0>>s zWtxV0E!Q(0uX}$X{T@_)uz6)srRSqf_0Zp?zA{T18Kdk=H}87hz3})_#fP^A+9F*v zSFUTtxmg+#2%S zVm_^2@;vmH3WBESIOw>g$GYb%Xm{Z2^c*yEW@De`9#NVM{Pf+6pHzCh4sC&(B@SsE zLJxVWzRy3j2{&~#n9xa|w!81s65&C&Lf)t3PL8}r@qxx=UPh|26LQ=mPtb7F=~OFJ zMkB{{RkfQPH2os&pxVz7PvZ{bX+SeYRT3(kno(&wv;)2uwS0~TrGCE&eUFv|E+TMe z{z3WQ&zMr%e++_rng4g@d4gpuuA#V>MWX6u1KQqSwn)K|g(B)76Ag17_uuySO zP0@4P?0-$e%9(#8YPY7IAAYP1u0b4BP0!f_|2@0~cOXaYthL{Y3Om*QcS0C&>(&;E zfqVZ}l=|C4+;;*$(EQr~4+W90LCbOqSt$-poZW(-IYnplvQbst5wS82@4xPg#xyMS zN?(+2>~{ifq(O_9Q>sbWB=si*(GHZUyE~sCMsA(2H}xGjeh>m9^CCYp)V435r1{qe`&)_^rQi6cR&s_ zcZrq^nh-tJ$D6n_RNbmuPv9mu|Ch^k&!S$PYKW%>%?5Oa0D2ePElKG~6Y2+MR|E3? z2MON{H9h6dsX5;`M}5zKzxg^2)d`;5bch6&2txhHIRWlHEO!~c7^w29|297)|MbKO zxcT~=>B33>izBa+c;Mzj(;d|2dunt9!-W> z%|~C1msF@5Y{zoozwMT{5yicQRu0RZhns%Sx!W!Hp{t)G7~$r`xxqCyMu^>06&?^` z_psNaP~MkfQ-bh1pgJX4LN8Zn8bi|IQ}Dt;@{zX+9`Qqo4Xp68LF1}AgC{v4)?e!I zw1zAMei93_XB}Dt?tUgh?2i=OKF}l&F9;HCI@H0^p*T0+caX^?U zbxQNbUmtl6NN9?Fze!SI@s;F&WITU^dm#k*Ok92hErM%I0&aF=|DDe}N2UMx1RdPm z;rlp#pC7vONd<0MdmjEBdydNU=?S=VU|)ZnIK~gZ1M5i552>jig5T2fTtfDA3qha$ zfm_xq|Ln3pqDJj60ucl0qy;l^*a`OYU_7WN^nc!Zx8Uv_Q%C-q|##Yd|c0 z46qr7oW6hf@`@%6;*MkIfZN@*cmL&OP};v2boVNi1Pjke_yS6fUNP+C584KFh$q~J zaI6n5T={S?!z;}QL5Ti}?f%%Eid77YB8@1Z%M(0A$k zkMM3mH@~BahPcbvVIKf>2ZbJSWz&Jz0=)WV4>O`v+P>{K{M*rAl4;)VzlR{9#a+-9 zJDdGxo$Fznu6jMnB~;(WLu%{8lKV@BB6Z^~IZX;eJH&|nJ%mpSetmsc_F#MqL-CBL z;LcC`f4O6U{hAq+aPWYL`5IaT*1>$g8JfXo+gGoB@PMxyCe&y?sS9uu)!6TG$ptAu zxrFfA5v1z&NZ^8-4O5GlTjd`6(+VcxQP5jx4)bb%)~!F`wZD%XJD9xg#8f>9uPwO0 zt0Zc7&iE{CA54~$rJfM9b0&0uLQws?m)t;m|Ams%puCZw^_QjUUd)2+4Fnl4Oy8<- zq`Ze36ciJnx#?Gw=LpRYysHrU?-Dqb`!8;4#dv6Lz>sp!!obUq?p+6?K@t2#sJdVB zP)3m0<9g|y-hTrPctiPf>qB@QYV?rSx&5Y-iFk9hVl?Fv1gymVJJgwOPDYfKNceuM zLA#D)eN*jViOc?*gfPSqCsb$1w7)Wl8vM1tqZ|KCg7U!}vOF#lg#6QKDYKzF=fk42 zKW7l6iaNOWf8U^88BzBL`{xDfb{>EAESJ(P>qGz3b#DPG#I`d0vGuKoqJo>gzct~< zdq*m4O0ZyFtQJ z@MT(p(Jxwl@8IX7`JHWSu1QHr$p>r}TuVPpc;7-o>MWwWYLcZ5*=RbjsUgc5x^WNsGes{o~TKpVQne+3`Viztr z1qWNjiz5g7`;QRbKbI%5NkWIgc%76-D<1m!bEc>51vnV9`sQt=pyXb%leD~X_JKivF2k9K5Ga<*i-47~d`o{)^R`pPE7_C@75l_|Xme_;7dAUD0m^ z;ftFXz~iL{pd9V#T=K#~UR+!pr5`zMyC3z>$CNYIhLEi)+!yz@*I%fe9SadVyZ=0v zH-SpUOH1xxw&s2|Jr|-U->Yzs4=c^;b6)!U*9j~+{IKESp3k4D2cXLag+}Co0h7Yw zV%LBGiv*pSFT353lJ8u^5Q#x`LA$2;`T2=yX=Y#*zkNGIKr+iGLg+o%0Xp%GR>bOJ z%IoWkva$rk#KnhLNUlqkzCzR`!*0Xq3I_I5a}#v|i3tfkb93iaxV07(H;RvP3|1dw ze)hyL*LXhI$HDN6&82N(=>0hN(Ted_SyZFn5cp>3d|KDy@0Lh&3yZ!!j9#n;zb*@D zoa|e!h7gQ4IQ#beiT=2**@t9OkU6!!q5G7bB8IfVpOyR~PDn3xF2A@QUY5>OMFj~) zlkfWV3=?!um2Gmt7!7{iM>GlsHIZgEhH8XsdWn zYBspU-D23ybaZqSUY5QQs5R^&SS#K!=u=31iS9L@F>}3 z0DAuXx&Q8FVaf0XF{;ahIBae0ouTjH4%MHTpIytXv-a{b3J3@|e&WQ5PZ3ZGV&7PB zL)(E?;M0+@vHs`md@&sk`Eff#8KyFj7}XmW!ftUvf#1B`S1ZJMDY`-4;S*iC2?8m=F}J3 zdn+e{wK=RCjOpS19AvRW)T^QQ<$xm2QMMj5TG39zSa#hv*G8?6@l(;?kP8i&P0cr* zmQ+&eJc*(|ICqG`KC(~p=Rp@nPii#=O%!R!X=SprH_)-Od1NH<=&@rwv_EL~tra3I zU*>e7rAs;O8(Qv@9R=I2zDT7|$l}KS%*}Z%NB4kn-?=#ScD8Vk1HpkN%aqO(8>w!O z$jsW@^5&;%*mvD%Mcq-TJA77%QR1?E)lBj5;)yRSB}Pe54!qwWdW4*wx+XPC*uCOy zh572djuh@MYKWSH-m1xko{fTtg~tZ>242ddW)40!#?VNEk8?R2v1eLmMM)kOhUxly zlMz-z`H%(0yUcl6rR)W8Wxl1IPPQ*jbw>?YpGEN_$lqqyMI^iGrSeHA_3>`L9TvKs8|jT#&p z0#?j|iNvazEqq;sL#xMgHTA)}Z14M$=-r{u{%H%0Bybx)wS^Oh! zyakSFD?c&t;Q`A+S0k^;YEs%R>Fgs9@;60Y`#u$xQ00z(fw z$%hQ&4f+B5MzYODaEPY+Hp?(=HwcK}mu`P9KT7ItF!1mnZ|OWnpdLY|{&yn-@B8E9 z6qYy5qP#Kw_wV1vFZ;vy*A`{;@GRrhgeG6Onq8uxDwT!tcKtyucU8cY|rIags(1A^@G|dRT^t(1AO$5-4luW2$FeO!o^k4{18UGj&=5unl;spn z>*Cw3*_g|kLfX(EN-1tZwQV-q#sFJib=>sALVTAQxoc2|`bU)5{BtwmAg$YZLTa{B zs7e=BV!NHBy^0r>jvTXH`Fek_5}7Z!pcw-?RPizss<+Ebllp=cmUw=Zbr&v*hrW92Qm^(IZc1b$L;OTJ(2s_$>~Trzx|t!JU85pZ5F*7 zEQN==k;#k+?#}& zG>ToFViX^uNtI={c5%^4*Uxb;gi_2e4Y^2+YfOe%4rTN`C#8oR+?n80#NgdF#-|)y zkee$E;Ok8t9jCy+JN4>5+<88zw659M_UYHLos};qab~9vznKiVDy<-PMZfA|&&&Fd zFcPaQWq)2BDB3`EUWI%`8@AVHAFlqo{;cU|o)nb`&7?V1z58g%1sEm+#0rCDliBOC zt2> z5-q2Dmo400(nd|}qYeZZs(t!MWJ`HPMK;BeRhU9e5=Rcvf)l1C#Y+7cA^c5A_=@#t z#oBf)3^~B|Qw-eFk36NgmWjj0KPPQ`mcc7f1~T$Fe*;x+PDR=o!ny!B2Seo)1z+#= znVXjNfwygKZFlyzy>6qCdMKorN_QtMit~^1qqWQdN^{dp;NKp?i!C%@L5{Z>BL=>(mHcw}%7aN0Aov*jN?pusu- zlzEaFzsR_vph#mK5`x4{)QO6&D+^zls_(Ru%B->f!@S&3d zNKe3RfLFtZ5`ob;rV6|Exc-Tp;(>J3y-s02r8G0(l{!0L%gV~)k>m{|fKYvnjVi(_ zQ*3xW<`o4Q;^f=*>6rHEJVDDm0fsR!TL6a+sC_-nPF&w5+AsYx;Gm4ASn!57B?3X6 zw_f0;@mDyF`Q0i6=%xnr8(an$W5ZDd+@x6w)f8zrVohFHU+h-l=1Cy|2Hol+6}}y_ zLPhHTY)I}k74QWcP5CkRzN*V8xwN^tC0UKv9%q`ns$Qsu;*^l%DD&OvCuh#)%U$XI zZd((}amlMr0bhK)Ng~e_LMzo8!J~a6VhSC3Edm`EZ}KqiNJl+?7B)krQO-%Vtej84 z;sjDYeJ!acHD*88BP%i9rZa$|F%CsAG*#)?eBIPiW zNs}Pz>j6+fDATJhOX5SDzRpmguZ%D63f=9qbYED3Jx#YT(Ufh8O;V3p<0mg>;g>Eu zp6FY>Mtgn#*rJpMx@daF8nbKoiJf;IDa+S-_3n-hPhm?-g;wY&U?p;6T}xVM?&^}= z@xsL{EoQ=I_?DH`vunOZw%n8s?A$76LIo$$o!&4-$vgSy;*k$Tpn?o0)HO>ki0G$B zIJ>{_h_uB@9_U^fbs4fah7^BtgLLfguL~&kjo%IJRy};I*WlgZvOqxPJdl}6srs;4 z^MR}3&7XBHvhS!AyU!|rt-ceErB(&RJ+n{EDk;y_|5~wBBydE8W>8HMGu{=)bn1F* z`IA7^uuj^b7uSjMoYDi!@gAePJb|Pf7SbG@|2yvUg|};aPh^p;xMSkt?;T8dsqOTS zamMUq5h%CTj_8$*ZYeg>$`-qAN>sUDjv!~Ao^;gs=!BTO!zy}|wTu{3YpuOnH`a5y z_Kt9)fy||DYr_WpRmE3NUo?{WmUWy~wFuhel&(rH;#GXfF-pu&AES^{lofc|LjSEN zVP{#?g6e4TQvprKCrWi1c6c8-OsJ~1X)NLg@5%}Fjr~VTWJ;;5&p8H4j_h6hQL=G` zv%lkq(|xXq9_G9_?i?ZEsoLPl9#`yTo^F8MV4Dxj?e(TQqaBa-i*-fnZ6|jgE!h`O zjl)=)UQMbL8WSBp*vx+)8~oJW-jOqFN_59~Vp8$dVY#3I8X{+C zV8(kF^b*VU&)HvZbo|Oc{}4K<$C4a(M8lq$De?%Cyp@xi(280{GB55tLpuo3950^R z#W}PFUixW#S?luco8?y|XwZN}1uqm;x10W->xdZv-+?DxZv;PQ-+P@{4Z6O;tWp;k z-?QfbXgF}XwSGSTpE)`1Kb4~TK2~XGOf)MfPxK=T7Xt)b?JHC8!w&H~qj^ZlC+7Qo z?2CJZ_8Lyz)w)`yXEUcTlMF~7=7W7}BKmS-auTo<`MZ}A#aizj^W^~BiJ5@UOL0y*QNUfeYmjvbI#vRIWRBuGnhDQj{>5{5c5abZog8&pA+mI74OVux# zL**_Nwo#W8J9mxfZ(R>Fa46FOk%%H8#F~r534QJHf%8J1mDM2BrlY1}FLL{Iu-!DI z6npC`7@^So;m6SfVU|0@BV}?gC}`rexhu_F;Z2D9suh3YJF4#E2PgEm_YopG!8F?3 zT?|i>drr9-8tLI%x;`m8b)HZ5w$mqSR0HJuTG!agTvPAn9>Gk^8~3zCWOa9|DN9Ew%0_de_%Si)V}~BOdFjqWvND5om_K!uh&=$4Ks zCaaLv1tH@G&G8-#v!}>;o`qIT^as?faIij^(|x^1pO;g`)^cBLWr6-1)S)D(+v}>9 z$VV#le{NML}MHR{iUE6u;}7Zw%@Q^K)5?l6{ZmR1S=o(B=8 zyyMzR8GarzZB>{w#Q+$00OBC*@K;rwiN&OI})(~Y?$jh0f0-r^GzoiLi|QJi+& zN(GGI$mnR_%uF^6M%-lEFQ5bu{EWuFlLpb_y*%TQeIUGS3C!U}`;9NCqvig3!xe>Y zviaM^ByjTi!SK@T-9GSoq_VvciX2B$dLOPMyJS{<*<9ssHt~Rkq*(5Pn z8mH`XI!gB*-#2_?tarBIC4x04JK;;zZtBL_D!SImC1!Z&-SXmXnJI=#yIff#>PZ|_ zRF+*|E4XGGIp7k&d@!+%FIAjV&XbFMZdPPo z`|0$1N;BT=NdA$)dhvF~vB(>eQ=hUYa7Gi3xvPZgfuB(W^mkrIMgp2udP}1z;$Ukg zuaU9DC6AkhTCR@UWK9*P#)^$AM*4x`#a%qwLem#mni2$YLkVa-rKZz7`q%SuzSE#r z>K#uJ=WwNWxg~?5=DmWK@wBn-qgk__#h?Bs%8~we{|Vi*x}xM_3iOxc=9)|Qp-GtP?xupdHSzDYW7aNk_g`W**VY?@aou5w)|#7m~&mh|a9g1{LG zS(l?UenVcVo2L}qq3K0PN-MiS-Vj3eC(=mhq}|V_%t%m?Svz@rNdH3?u`El>>~QrS zc*?z^tu(^gPBMU{XZWS<=5!=7W>=ef%O{F8=#826vl?}2jhXifpLl!X>t%O>YbIx< z8h`EbyrlOgo8KA|r?Cr+QMLI`Yl5}9I0p|L4b@oK0`9|9dh8Ylh(HE4SRt?fY{Q&w-5ruRSLk=5 z_oXdznsRXO?;#Me$#LNMLayeYzHJgk1-`@*d$_-H$TiJ4V57Rau%!IGyUq};>@kIpO~w0Dv} zmX*gV$Zr$yKigAG7`yUzh7bFbc`ZU}ICx~|PINpk)3ZUZ)I_ex8sQism# zm=Ups9+wj+{@Za`ZnC27CC7DrSSj%aA}w!_bKGs4Tqhet_6^<5+yQZ}z~%$7jY2|{ zOC$Mr#^4K~1Dq5<9a8y3EJ*7Z=!Iwzhug|*k~58Gse8=@M%2!KI5FR-r`@ddkp&4C zyqDmFP<}3%S^*_zT5G2n#-#>yS57dy(3ACEcyVnSraVGg7!1>U7C)ASgl;#TZW!#p zodY9U^ico8^LxN~NCt`Me)ni{{`CJ6L&0Xs!3rjug$hE`yYu2gokY`X6U>cR06MNI zb*RzEb6%|@V-0gz(XDB|?9{JXeuJzEtJ3F{_Y}_2NQmy*25m(-^(ApmsxX+P1F&j- zZrh4qa%8N-S$Vw51;Tg)U6||hmPRKv+MK<%Ks1GBOA9It(v2Fi={Axrj@*fdw!H~j zx3B<|@tBQj*hV^jbJPe+4=Yt+p>{h(K`87ggJdK-=E!c+3sOk&HjD6a*^Q2Y57`-1 zFd)P@GWhp4LKW89tz}uqZY)w`&QaY=od=KdJ=;=}*)e{nWl|x{K*FMF}! zPXE;5PYzWybE^i(VWt`@WtAcwYkmb|#h=EWd%t7f)bIM=ITo2s=u#uvTX4yDR4kQ{ zRe}zTNZ!Chr=?}GZ)#JOtZLL`j9}Nh>HvX)P#qPEn&IA&Y9BAHxsWjp=RkZ8mvw&( z_J&Y~NgRp%$>0v5vMR|4!&aZd!!{YDSVaD9X8Yo4&>BxzVEtMfF$|ZMu@;hM;Kq>S z=&NEM6()lEx-nPC2KK-dzYr_*H1_2N+<{=LKE9N3Rx<_vyzqqg|!*@$$I;@6#Zrcg>jw+KpKAe5KX*MEhF@ds9C@x?5p@jGLi- zQIQFFTSD5JmOV2svjcCO03c82d)i|rmS^M*gSyWX=E;rez$(aF>>wZf%_PlXm9!S5 zlO$X=NVc2^uY+m%`jWHThd@rt)PM6U;1O{JHsDsz*chgk(bXkP=%HKBUf5k{H?9dV z5a?YHL5Q1Lvz$JnOam|Ir3anolG zeh??F+kjsg>2UAzo@HaLK-@pY5pZxpFqryY=U0%6ikG8vmb2s z@?P>-1Q+Vw_!vSz*K8E3t`lxl$@*qZ!FKp`Q$e(^0_4kam{1*q^7Nu!ioM7%66>E% z#xBO5U7>K4=&rI_n!0v@t*nLzlIT?fqk3I;zMS`t+Die}Mo;FWFY3Zxh`=c$boT^; z=#M`K`&4~x*(8vz90I8oK*Rt##yt4@>q6-2FDVw7Jq96&+BYHOvB-E3a3ePUS?XuZ zi*{Ps&P>Qb!pC003s7JFQVl0fvu|G|k~jTt0Z%3waN$9jdrbj{1IQ}5oPD)`dO*6j zFQJjpF=tc0ZCfGBLPl0LOJyX%}fPY>*wD3(T?8@8H0tQp=HE6){;##Y9jEv zv$A_`xAiNhoFAo1vMwS=Hx_leWB$~326nXk9aiyenUOw;^#exi{deQq32;6b0B95B zpi)wO5q47y@T0(`C%XTh56Le)26AYC2n%mfT z2uQ1VMbkQ={AW*q3mZyH<8`_^*9SQH>rK;|C@m{`g|NFZsZG*Z+D7MglyU0#jqf?6 zrQyfHV;aH<6?V5bnxE;Oz6!w426JOZ`a>$s-a#wf5T&1&QVa=JC%k9fT;7G#QSgC)^fBg*Bu#iWkQNrAtV^zCEF+KhK;}AVZ_5Bs+@!P8P$gwo!t5{s|IPn zKl;}Mlu>t8v}=uy4>@p$0e?H5Aewq>5`eQ`cK7Sj`H8CXIpHpm!WLnGRH)C(S{|QC zee3x~cy4tuMkxz>hXB$oEdAtBwfWNM%&r9VJ&;R*Q#-FY_|keY*yn&Ou}o%}1H3n! zu>$jxsW0U+E>)4~HZeFF*=%=Rbn)2wcCC+(PmC^RV{^%Zi0{**P>GK@!kmL{7W=xRm5FavIyu|FYdL#(snS7CvmF4|)Je{we0=S{s zd#f8$_+pV{8H-Tlkd-+qEyK&`1e{!W&#$hO%~N0BH;eoW@@0uBEKXOAPwl1Q6H9p-Z)mNEc$nvFb%nN@kqWM@0Lw7Yc>!+!T{N)Su`Ds$kR+}JpQLfdR zCt_;r6IbGkI`CJr)=0K0i<*(nqev^g=`Nq$FN4J3BY$nmznbz6Etzh6ZPY&hn1i&< zXnu;?JtI098LhjiO>@Y77F!AeuFIRZFBW6)>ouU)~dfGJk8n^)Id& z?2=hOWg76k#I;~`OZWXX5y7*`UsUa7Zj^>Hi53@g<|*pgpGN8#o<719OVX7-J^&aI zb#-;ENR@rC=|m%Bt%vE`*;>u0sHn)Jr*sS36S8AUB07+lCSQjT8)JTmjTpdE|Zh&508h1R_7Ysgh=y2=H;k9JuA^OQ&KEl zp#&?YkpP1_+}(2QEbZbmBd~E=>!s{^9zn(6ZTaB3qg60pa!Ve;DnItf$}TbMX#+4{ z-oT(AD1?TJEc>S0<5i<1U5q$TXHa1Oaf^UWy|SVY(iP^nZ})(lZmLpHUPMGhB2|d! zW3@um&oadOLDGG32CBHC>n(b_0w$~z$-({vBnZ`(_{@vK*LV~o`QijsnzwQ!v@Pr{-FF6+YW(Utl8JgJeO-Fz^`O-&NWvi2s>PLB7&u&Aa=@2 zSsmz|F2;)z>tN*!kmj5_ckYFHhW`#e_ugcEA&|pp^uEdzD;H*@s6JGiu53?^jPz#Q zh{Uh_R0RSW(YG2gg9}$ex|lH=tV25qE_GjeS4~j4#(5V$UCBk(#JQ+Kye(~&uE`5= zLUb-dwEKKXWE9myV+Ig4PNkTy|C2{YY%ewhjKB+WRVNDTVwl_Pf)b%w2bo$frf2YK zc6|RHQ!ifVHjxv1IY;i2r@3K+=AleOVcwG`og5u+fLYwvdW}cp$A40!cLc@SsO zkIJ?7#!qnQGVL%|Sei8;b#_kjot+<(vj}*!gemML_OpOQ84LYG(%vJ>8lRi%>+8VX zoex4L3~P61yod}$K*m!#tpD*oQ1c1 zNpF!|{GPKoGv>efbj(5~(BGvcXIPYW(Xy8?8Bz>1b3`IB+bVQE8c^9g@x?70FCxupgfO~78QPPQ*iIwZ&_&naB?$sD*qx72ph}e z3QNn&B1s*CL_j%EVFS=+h2_ZQ(^zwBr0Bne10oUtBLQ5b*_$Nifd>u|$i$`}RE15j ztM(=s7@2iN&hcHOq1n>+_c}>maoWTdc2Nzm`>2nyuS?NJUNFo}Z@O1*Z^0zm4gDaso+Oppp3Q zT{nP+8;eM?IgkhV0~OhCMo2Z0dt-jB|KGEBjg*kvUhz*{xkTwif_HB1TUDKKWbS!^ z;xVFCp?rfTeXWL_Hy9}xu#A_M2?7%hElqstURcaMxiCvhD%af=RgN!lHCRGpOKg7s z8Hfz~s;Xr9ZbkI!FIRtoabVytTGi%wV2P%Lxfa*ZBf}igb3IgWkg5N#?s_4F*W(c3VTnb(;5!Ge-BdD1Tu(j0qaE9&t1 z9~Hqey!{dLQy=?g&1rtRX>LEsGo>5*zsbM^{sw2)wJ|A<EUZ3zM@^=sFv5%!jJ85}^6|BpZ%xZL4o_t@se|k3C!Rs3qe#T9er%n>qi~aA~4^a(v#`Pba>^8h#W= zH&Dvhk$vi5&YSF7Zc^I`IJ%t!&QqW-?n3_N$C6Tx2R@RX1sgW<3qwB)x;?m?nK(w{ z7Ty&KSyZq|($x{)^@Wh42D@;Q@|WH2L1<&8?_NN#@fd*s0%0cl(B{oh*$|=e$PjbG z(`j8pI*0fVVh$TGKVL zTu>dyiZ+tE2B=z%MY7b+rUT7oOxug3c}?FZU&wwbrh(#S6(xmHoSCM&KE*Scb}E%BpN|7Ev= zg+`vkRX{`sroz88+TCRfIbU8i_(*=T9X4t}oNJlic12iNU-ZlhIIo($U%os&z*U-B zIX9=t9Q*tS%NgusF*r2CnhE~4+6S2hos`87k~6( zGJ*qC^KN%7u^H-V9nshjVtx=8R3`ah)zyc3brr2A6@4zNZ_Vd^>iTL=_)auTW~W`f zgbf~GI6dg{@G`OI1r6D%UQ|i9MC;{sfu=VAN_3>Mf=JC+#Hc%e>F>wU^bw|SM#U}V zXV)?}L;bI~t^)vypX)g{z5WOe0|7*Q*fBlV?>q7+HJXFE_v7T1h@0zfhbf~G02+rl zoR3%59eZai=ZXUHv+ni^5HSx94weDIFvtP*m;c`TG8?;a`7MznGd1S?d6Gd;EA{AL z52Jt4&)}8+p^8)0?7YB3&IFF>YQh(L#D!To4Qxn{BEeF2*@HIzC(;t4efNO4+mQ zj+j)SkQ8kBT=3LUyIY+~`)nzjAAf98IOJPF6O6jpGuf&v;0ie!*&AL-iz&7V#^TCqB7V>(U zcatlz#G9}l2%ysr)a0Y&=+q1o`+QREi;!wRmoX7A)KU5N`MQ3c*w8Ma=J&xtAi*@d zs=73E$@-%eW`d7*tH71@n)fmpsLAhKG~4t|E`JP$;+Vmg4eErnJPCilfXH=CkE;rVT zDL?^;(&CS?gs+S{L0nYWd4-@F)$-U7hUXmuy1GndDax++8tc)`k4%qU2B-$2s5Kyb)$%@gd*R*dNtW41uxGp)6ajH-_Bi3!%~T_;xwbkWXLG zLyqfoT-x`_Q+BENtF{^0MaV<{Bg`DdGB!ABynT~oge z>4xAuV`SU-%kjvmT)8dr5_jQP;i5A-165%k_T*ockQKOD7J!GT_F4K*e+O!5Gz~$C zL}9CUJ#**GD+foH%OS;*JRbl9I8=;W#H0m_&bv$C!(s6b?@GerTE zvkaBH4tayHkuJ0`Rfn1)>^Kf2mTc_o<-pDZi6!iALFfuse{^>0YGa7yPe^U!(*WO8 z-O&ZO6s8&Aavrs_27?Ua|6WrW8EIeC3mJ{itfq%d**0CJxtFt?SA`T)-AC=EIFenS zw-k>?(|SGu%Jy|`AncMkwew&HiF0*x2u9rht)jAslLCn?z>)3*{Q9s=g)&^N|1r`& z-_^wiNLH=g`58w+?yz+I^O^Z(#S6eP7m}utr0d7Tt&A_9jB`$m$^_s6RE4DDQ@lhV zcoIV84zwMhE~-=>J@GSXAdfovHXjIj2SXXyy>SzYfC_N(_AZ-^f+*)%{)!M8#Q*;P zcS%%uHVwHCj6K#4=#tgWp3#J>Ta<$Let1(i#K9CWUvVGMK`xk6`MH%NGwxb3Y&Hk9 z^1f53)uoQ1Bfo6E`>MxteVsdTnATdmgegkEqBSOqsM=mmy{{YK#Ieu919ep%9|^Ec z%s%_}-y$ToXnXsSWv!n9P=l{kg`L?7RHCDPT!I_l+WJ(#vyk5_(W&6Od>+VOQgqD< z*_;G;rtZ-IGcICsHgI>T5}-$$E|Y_0U9h_yS5aBH(ZsF{mqYD~TPZbIvPZV$j^oXA zPsV3{Hn80I`?uiiTa8@Yr(szXj6QD5UuN3U^}sLRgC=viP|JiepuG2gLax>$r?}p; zIgCz|uWSc0J#PXvVTRJjO->&^&rBL0!`%e+Z{RMx=r+S36Dp;FaA!i(2Q6tKOME&ZK0l%O268GsZO`@lbNfqUlGE5Wp6)R&zY&mf(PTnX-d)IED z7tju++7GOupsxu#X*z;{Cm*e5z?oRw9dzr))yIL{765Q_OQV%pRE~vi)J|VDsp`-C z&S4lwnrW+KnTyefvD|zb2q$@A7GCFs8B|>^$~cuOzVcjQf{xr9zwsL6b1&xpNJ4gP zq>N1Tq%W{z(#XIf!8GFc?>f%(h>YmX6s*NcH&>&d(A`Rcqg(ks?UNcc74@wzdGfH!Tk8sf=Zl+{v!J@hI#MPAi250?!6( zM1I!b8{K{_>Ls7%}t^#j-3+ z(c(c62+nFhATwjMvhqx+fJ6p2R+RxentS(((m~hR_fm3y!-8#KSxik$%j)VZ7Zf+~ zGWk9YAtT0qO*tO!cf^`yLRH3JMa0n+b^h)Id3|;n<8@)jN9WL;L#ualEn7q|qvlOKDwj&0h#{5m{bWSBTLA zr`a+u8>ogrBxhE1r>7WPD#=5E%+W!4;ILbT^vfpVEfAtNF&A_0i* z0VjwwpGMNGsi}#|1Un=qc3VEWeRgK1Z8KDX*szgmF0X<$@~;I1jX41Ik;-v&XE(~u z_O}BZg`wTUEI*SIF{e%Z6s7T_-_L%^{P%r@+cuU7wC{jc0;m^2I#;PlzfK0qG6^b5 zd#L=}Y{*GN@`Out&gul;NBc#-UX=*Cm+T`t(@mOV0_(cBgU-IymrUpv$L_rcR^4_$ zno_&!rfovi8*hh-{-O{<3cPKCiuMaw`=dEu6W`%re>+a64_MSekR`ilS#2zvTxxc( zh<5+ORB1*D3JH~0RpkOu%VbXd7-jSE9f(%VnfChT%YbPFwW@`-LT|8pYcD~fDbY&t z*2}K*aj$?l0+451Ni1_#g{Vo1<7_L7tWS@#-l_S=I#!5^C4w%f`tYjgN&EmW%Wk0I zg#~5*NbGmXm4yxI^~)P|gfPLbBcpt5i3Nd9_(T!2Wq`KkfH&{`Uw+&>Q^eZAK^+_l zU?YpmK->uETA%_9BJIJ_e{fPt;9}LOMjFd%Z%u&2-TiJPQnZmd(RaB))D9PGDwEfh z7uTlSvs9357;1D6XKR~e$ZTe5!l^$FpW25*d|eB?-;ZlFOm;Ms$N5i2I)r|)`Gt9R zxysu|jWfe}3A4CZF311uM&ORi=i-%ri?eRiM--*I&2)`*^)26I8K9pv5u^qdS^I>{ z0o1Cf69H)@wRC+Az>~n$Z9rU@3UrAnDZDpt-i+l4fk}TbOt1pSJf1sJA{187CFoLWk-$up>UdFA_^tHO2WOHP~_wy-%ax00+ zX&>D|;(5NKr9g@I=mHZd#T7_7{DFeFYxoH@$>#LaJS^)R;* zFDj3ILBopsADws06WiQPS6?iy!n>a#t&fzRb&V!Xb9LteEYEwXrr!4!CD@gGD$`5} z%ejRG>Y1#?he!YZcI9*x@I7u1v}(eDTN4#LaeQmIZRih6m$&~W@A5-`%=ltCz%Y#o z|6v%yvgJ)Zy?_VTaH*VA*RN%99z?GXdgZY#k$fPbl6-tCKxReH1;@5yWzCf-r*NBy zjEvstLiYOaUc!Xx+&3Igu)Z``e~Gu>xALp^f#xoC?5I9ZpyPVQMDTZBy75O`$4@?W zXDt zDLS|1zunT}_Zm^Y;6(m_hGUCl7GrnjoIkXa9!fL#G;HPuNR6_woj^Ww%-_1KXNA$~ zs`Q)oll)91Fh8>yZNzx1DBsK6*OAv>6mUf>ddeWXY!;3Exydi8Vb>MBkufY2$w z0su((o5iz#eJK!Bw$$AMWRw7y>uqb(Qk^C(9oowhSD14g`4C!v?9=YzWbpS`I-n6n zbXow#q&CPJ3xAC714RNs0d+r)dICQo)wrhe@4ypWhyqjnA`Q#6&r3$C=b|VJUjL@K;v#?Q_6`zV%#>-qoHa zvsNf_a}nN^8vGvhzz*O-$N}RuzIwBrDWdt%tvh!vScDGGS?kPeuZg|Y0LV0s-o3M{ zD?pwP%}4PcBj0%Ul>PAI zNJuDw0zugvGHAoZd4%*IiZQd5AF>)gy3#I=Ept~w6jRhqW#L|HbN}zp8B{EJlcoQ^ zny3lfeOz_MJf5z`??G@I(xl$A|ETAYF|5YPqoHI_6Jp7_n9qov2x*h!3LMIpJ~n z+r(sNdr!A<5kb}4#e60wJJ+wy>r}wi(N`b;k6Z%kAUL=M`C*VQJHbXunV(Zi(*wVJ zQF1}AsGTBK2j=US9r|bVl*+U&?O#4~5RZ{kzs=!Rn@X5aKJ=5ZL)IEacWIF$hmQwY zrRf20y~qawIo@r<)t>JgGDala3}F|<)L9^UfzK|;ZnQiJk#iiW2jz$7kMsh~7pFc1b+@XtJe6i|L*%-nywAE@WRsetq8=H|WdHfh9`ItBvg2)wnt*UYOYjp)tI z%@`fQ*sfWNdRfP>5l7FEetzm8wc=x;>wIhLmi)Lc01A-i=i%!}3PzS8=w zW=AW+hMzGBmrO!}LO}RuF~DymTuaxtB&7Zyvfcz9%KiQSzsFi4ZAui?Q9|N`>_$f` zvM;5wwAi=GzRi>qr#ez32_eZ&$x_5{R6>~SSsE>}Wgpv&x$pmV&p4mo=kxua$9eQP zC*z)bdEf8%^}epx>v;u_Kdz9q_w+P^0_vr374Z{1uZFnae!sjs_5`T9pibpC@b3ok zAh>pMEdr!*@ik%hhMOD1NzzkLd%~F@cv^d+PaV&&Jh(JMLB}W%>)IG0Ny^J!cQ@H( zW^*LHJ*>X7*;QTF0#p|TU3UFwJ0h$zYt@LcU|auKI~Tuq0PcW)KyD^%AeYPa44&@N z%;1Ha2QopeqW0u9R-3aOBSu_j@cI-U(TZw;%b z#0}r^|MSmvD7)>2EIU9(Mj?}R0QU(OD{I)qXim$b{rJ#w)0v%ci<9FgDpi8|W}&I4q+uY)%f}Y){fC3Trg_ zt~K=ao&79Z1Tg_52P|MX!iy7xF24qS)Ros~4Z1Eqde??|6$;l)5mR;^`QsUAuyA+2 ze|^%t)~U~3tMuNv{%O>*PSIldO?p9>cg;wsR%S5p#S3f^1m^FbW^4CzD z^u*z6_>Vu*?s7utQO`BrKe<9UDejEV;-wx7p&5cJPq(kK8630_A6h|Nuagq*@(8de zV5n__hv^GUjHZ^BF?iS+)q4}0MqzSh0F~t#yk=0Xc#(mU{1wjzGH8>BPVV+k{PQXo zs$dsw5W~@I2bNbAj;dsJd;ZSWAo{!CCR;4$)#*KhI)6Dt29yx(0&q6fO7Rc~Lk1H~I>mEcUN8nP+G(X{BvL0@m@`kB4! z2a*`a&Zf-a{03?6OBtBZ0$N7(Gb=x6y@bI6ojHg}YdgL4AQ%PTnVk(k?`_M@LtNnG z+3X%kP2At0DS~h|PXPWgk@?^)yfYXiAe?P#f2+)o6QKj)ehj-Pj&YCgKcNQFA^tTdJP`_A~OpfAIREgRAaqk4v_BLS8zrv2YCgFZHN%_`#CztiAI&~(teXf zaz$mexAsERi2caRJAWD`Jkv^;vv1u080~dkj2b<>M3T=e;ngCcXMv>xjwEvs@j`mc zQur+FZD6+@Mj`E}l3NKXF30bLWLW9Gzx-47Yh-pz3}DPjN*5?^ic3m-^Q>Rr+xWRb zXVHpT&AeHGdrJS0OwY#F*rm~Tm)$Q9Vi0Nkdnj`v^-RRYEYSc+R)a+Nk$TT_Z;tdq zOkCxX1dBzcwS)EXy2qIHv6RTGLLlMHyWV!e?(+5y+r+WJ7M|NJ>u-kzdJeTyW?p(8 z{7c>g>24gk`fS=mz^J1U>M=dGsGUJcDdOZY07Wy%2I0kJsD3&t=fM1kuN!!3x?!%A zoAYi&C7GQE!^`GZ72GdkuVb;D{Ey!|9f#!i5r5Feh7N?j4~%LKK9$3#Ci{u+Bc1y%a0cla~g1)(#_?<^Y3)~0&lPJ3)I~o$KS65OP|8E1-7SZ(QK#5^m2@= zZFnf%DMjf}f8MJ*qlKBvfkL%=3yrd7`tqF}xpjB5^#eh>9u^q#BoRrr5R3Bj^MiC2 zGI%hjWXvZWTB_oNZROPo2Ob+`0)q(8D#0ZLZCExK48?9=1>JA0IRhTkj=s=clRV$- zG>``FE7`k-_s=8kf^Yg;0((@pv0OUFve5HJVP9NZ`eQb$BCiUw#K-YFXs$4NHKD0(2!{IR$K3PU&1AIv+ZjF59c{v_ba` zUA2+>O0tBHwN6+iY3RpTR?BlzLH-pR5x&p%6b)E%QX?%MGl*f!rwj}X@JbUfU0~lG zEwp?!tiU#-3X`ktU7-DCGkL6%@Y;G(I%SQWUiwWR4Jn31A3- zYYlERW+kWOTWi-4rF)#~KfUKpN&7ZcyP1#hB$%^l^PqlAB@PXV9h!B@LXgB1mX1ifdKNwspNz>uX z8k^yfOfI{puR=e$K&0T~Iw|!53Jf3$hd>y3Up$COI_(J>rX>m zm@e!OzeeP2eDI?8t5;dDpx#A>xj1JKUVeF$C~*Kc!>xF;k6b6w?==V@L(CfO-qV~@ z(C}rn+cC^$DDWoW!3pS^fvgb~3CFerS8nLar+gUgl)N9Lg6>I*+7>IRiw(++PS4@; ze!IhmF#i6gtDF6T`A7)q=j3|SZg})+Xlb?MI4mnGjVq&e#`ToLQ_;;b1zgI}Rs_fU zhNm;1A$w;hRdpW0NyWPfxWMdKE;>X@zC6z?+^n zU6-~Yb>(qdw#zQrLAVXy0#y}lp=Ft+V}){7$Re-~3{|dfIl!MWPeN zJJZ#;tM7^dbCo8yu!jr<4J(45D0_w*IQ}vmeWNxR0sA6E7F4o+p)E~F;RPvj~E?@Vpgow^|O3~DpM@5R3b1u!*6Uw`j4Wx+l2<>vbp#A%ANM8{9VgJ& za}MO(!C>K>Aoz`vj2|iHB*6nI#sDW^K=z>Jdt?u>_@amyX>f=69@C#)@pE&BMBt0 z9k|?!TxGd+nS`+x9xpH}4A3n@fQ$O}=Vth#mA5{1(#N&it|SIyqYL1u!$kHordmJR zI^WeCLjuMw>pBlUZ845YN3cw1gzZh(mMvYo;kVC;`Y1t=!xb40OctGo(L+AOc@4Dl z`)i21F(iUx+o$Ip4JW~;Q#nkS;SN)t^J3xt@w2oEh_A8v`lTJkAR2<>ule$1;UW!<-)(J3CF;9UQ^3 zex(dZ4r{@#1ek@V_B}f;wF|gA3kBhvBaiiLUGCBxN!h{UOaW0Jd;pez&}c(7%+s#b zgl&x?7r6RQwLB$Ni$|6ASsV~dcjZMiBK>h}>$$d@11Tpka+&*Q+3pw*1J_;B)q>=S zm0ue^#r`!gN30uF3Gc zNZR@;jwvZ(O%0Js0dP^LDX(tYhydcl8KFLc@b^PNBwFKlc{9S`5Ep!SYKV$SixYDk z{kXFxuy5)wu0pTvtec{&ymqC4@>=1W0cz>^lrTNvXjQzl1FyY5=b@ef6FCTR!H)wK zT9?4U1h{?XrN7Q&6nPa5E>QE!ZMX@J4X6gg_GWhbxFY)%a~98>B;Gsj?CWa@=_Wuz z@nE`=vYyD^Z63&TF$sbw8@Ge&(%=>Y!0}Gw+tr*WAm68l0r9G&xcDi2Cx~OOlTw96 z{^y2dVNOD|SvCZ6GbcmRVrjGtDxH<+I6p*(^lP&7Hk{|<^SoqV3xbKW>*^g!NcnB{ zsMYdqEvFdnG2cA3ahW^xN7e$xev1>KJ-x?2=H$O`)MFQ)e!EJzQ|Pe)8fVfUNbt*J z{b z1AdjW;@fWlk_ zM_6~ExQL+pWSL^kc{gg`OfVJ18U9XxKv7FfIN{14VQ|xfZTgXFf$A?D6|B&7`6T6W z8VM=Sj1xjO$RWY2+0#*blMHL2Xfh>@r0eB&i5r0*a0Va#0}^ZmokB4|7I%>ONbs*3 zJ_N|weCz>|WpHT(11*sD2-7atmA;Hqn(8_>dw(>dK^fvUvo1|2_g&VnFgez=}a~x>H3;?F#%Ip(>vQ zM+UG{_&K-Ca-xQWryxMM0TrhnD~51tS%3;cU5%cY@#TP~Ei79Gh*l^eyl%->lN+%X zMbs48BVyoT5I@!t9!Jt8fn;(X_c)A6BEzVT67rmLCe^>&u0<~lN>WMsgII++qotdiJzVc$()SyYjpQ+GTXap*W%=Q_V6%yAIhLLuup+i zx8%7+4hTR5a#TFlhS3r^L-XmCalno(x6(PEYAp3Q&08U(MtX>C$3}?MmPe$Qn9@2 zI0tCZ7k(y!k9YFU!NCz?I7UW)=&*=t#kjoy)b>8!&Za1loK*)O5jC@Yj0!gnP#pPw z(+^+Jv7dscg~NRORHbw8w2@RBFeZ1(Dj-pEN&R}8eH`xAzH^Yv&z~rzcps)hz_H9D?joBvCR^W68CgPWl z=jS2TjgAr2^}1?>d8j;Rw1iU3P#SR&M;S&4!cEB*L>GVz@WyDw7<4jV1nf0?ZXvOM z>j9rV4?oQ=I{dzvA~+nz4Vpi~u$0rB-JALjQfvGSW)Q#M6s3LV-2U}OnD`J62F^V? zk+l4D1z6BIJ&*0;XjKe!YN@o1TUo3>FIIPF$;2K;G=800!g3kb*z2uqO%7~vaetDd zW5f(5!FD~{|Mi2TlLg2zB+t|{vCQX|`H2Y=R5^E% zuG3XeJOc{p_H8yow6AakPLLNtR$BJDa6u2h$etdc(|Rmkju@d+%xzBataDE@t&70& zGx33Z`zuM0y^>Y0^R~jYAt?m69TL?SPA?HNv3_ggUG}hMP2ZKFed;}_0v-cFtoQsP z&E)Gwi2p^s=kn0pI+Mq!c#Okw$R=FO>ikAj=zz>F$0ty(#MxA3^XXm?Mfuqa26yxA z4pMCp!|OO8#8g19He_~U2Qe=z1!&6W_3QX=m!qLyE>iKK2*js}b zl*{c%tdjFDMBz+UvF8uM&v&Cl_GY7;iUQTEF{q=QEJQV-4(Z4-`R`;#hLuQF{|8p~)A=u(7k`%r zlu8Y`kc_zqVH%{S>gjk!7}VvLyXo0@xU#bNJ^pB^sc$1yHc+(NYivm z)fbW~xXJ`>D66Vw;>yC0A5BnTyTN!y1hd*Au#VcTs6UWwz)Z8-e40Sx1H=skNGhUDxVSM|TS#8x~;$*U=k zB)4s*J4)xKoU@di*m)No_mSH-i^jIxv9_mQcg(~paQr)nNI0xY^SztCg^en)S1`W2 z@G@S#8vB(bahYqo|E__?;Pdx4aPjtb7CsAyEcw2Y)$YEjvZ;By2P|{wJW>R)AvEmN z1N_UdvCC%Il7WpEQDgN31ybGJG^Luq@yTf=w@!Mqq4n^qhst9=gD2iRaD0Y!iJ|`B zgo(iBWOROqWsU$$Y!NUN;)?X?fFwADoDf#rYQpT^t%^TgH)dIhPzw%|+cv->&Y{!p z@i-gRJb-#GAbW6|Gtg4*H}zWTDB;sNsEMIcAvN;H+rq^3XUp0#YI5CvBRYBh3<|uU zeC&iOnecr-M(gX-vO-&?h+eP5Q*AuB;w%Z#wxz1;fidk{`V@djkbq~D0fc4tckAC4 zv6+S02gUyP6$8Mie>;|N6nwGZzRTl$2cV|{?>Yjbtf<{Zmd`EEigXVOlA-z~ zh>33txdJZ(_uJbuqzJ5}?&eK$YWB!+VD9NeMKkETzIv$WYM($tKHbh-jG8H0srfwk zO5!H-!0%Nf(@&ODzLLf*Ro2_<$2u9}u7MHfRQV3%(g`Ge@eP=B7T)HR+kWS1A}X&_ zUXX=Tz3}2;70Pgfoi7Xtb zzP?0TF}pm(S<87s#P$K!(%fu@5|KqZoDARLT>O&8*48SH=I{joa;oya>IuZDjPrw6;FisRy`23oJv<@b&$< zg1p-f-^bF~?jAB>pq>sl%lBNqE4jkD_KMCrg%|_|kd7(&>@}FA%L{B&bd}vlC*r(ECIjyA*zX;%zuJIV@5Lfl&f_i{9y|Bz^UKZ#tPmCl z>sPsio@D%!1Ktw}R{UGxS|75XIb9w0+d#xM+yieC{F%5Pi?)O_tk8(#QFGZlpy=|{ z^;y^FQhC5#-FR;Y&pQ0J@p`aVA`r>I#ur*66b(=$?qdt3MpA@6Jwn~FP(7Lelw>@S z=NUR@xu!BOl0s(7*4(f0x=YvqdoxTO%1K65uY4Q2kI~YXDNZGT85ZPSzWiIp^rv(y zGH6J4_VIjjo$6bYgkqA9eqq8qTpSO~=0S{`jW*Uzx!Q@Tv#{4^3+PUBQe2R2cy`{j z0Si7|0VokGGGG)S>^8Z$Di?XQ`mx;B13#3cYVT?+-I#fT(G&%jSYa!zEq1Mkuz6Jq zOlG>0njS1WZNb{RBe8~(nP_D}{|Tfq2KYVn;Y<2BqwL_HmPr2E7P*pkoCl>`5o6+( zf!WEHBH)pSi0L{;sLg~0lv<~C2D4tDcX!qBIh9z%@Am-KS4;gAv!=L$UQkHMSB9v* zwM33pV!Rb(44PC$HzUx3<$u6LW z>Hiu8!+?yJ%0jo*HCeKiPesPFj?H{dtdurPaurX{)wE%Oss?OK_DIUI%hlzVmNReIiA+?N~+x&mR zu3Lphnke83s7Q?Mc)LR@I(_j`llC4< zVB&Y6q)tpohyA98HjH4v5xKyUlnU$>&=t|eTr#i}IAeCirYotDk5MGxB({w^^NNve<`~8o{c>w{zrb@+K(WXG)vW5~#$|`TRWJ|> zkm8JIelmWhxhxERJ%k&bgQ!IG?8E>N6Mp#zTdVgp_6rQ~Ojr<-3KAq3wqGqVY8R*7sJ>wZO*+& zi{(Q)GYl#kK7~!>BW#C9sz9o3{yeqIHQz;=fqh!Vxe@PU31mwnnURIU<$i$4r7wC%jNt)Pk*O!BPn1+PX1W^5EP|tYZ&So=&eSQ>&=nzTC!K*`(5UHWmR~`QmA-T4Ezo z{q@rwSu&&z!G8qlX^S0GldB;KH|1pz^&Z2|i5)R8{s!*@)&>pq)+%HQ44@^Qj>Jvw zXCOTJR?!rfSbIhgIn3Fm(-Ul9Hz&mnNr{j?O9Ut`O@@3RVFvM^Oresu=aPsAQb{I| zop~rT_+vVrD~`Zt`$8hpKo$I={wEP@y{Y7ZXkWuW!+D>swDOUIL?d>#S?}Y|Z1E3J zODQoYTq%4fur5=`KKF?bS(d!t9@!zrPE4g57nc)KtuP`sEGc2zMBZCM$Ybv;a_)uWegf;@0Ft-Uu0(`r4&~Pc<%~ z+z33ioDfm_v4v}vcVU((exsvSi=0{gtRfAvS8%_KIQQ$goH%mvc*ITsb?#V}w6V3k zu2wVDNfzXG_f57{g)CXM!=qJiMFofoF^ z_mmKj+6V54?QVEGAJwZHAs?O2g@!Px zEzn#ff9AkW<>MYm{^-R-A#sE%$Qk%gtOi>65aou(2Y0WzayuW&>~()5YV$#m{FPlY zNHtbIgW9cORn;~%wz>8o8Z^i69n?P#B7$2uzn|J6LUu>U>Dy~0JdktFFI~<%@4TkN zdHb$eSwYea89ypcW)w6<#A09B?VD2TO3JzJ3L(QhJ;FaK`^QF>6aih zkVxI=%sniq@TJ9790^iCO_*eFtA>AT%0qsYwO*u4!+A75IQI)H%Q)I7&rx~*2b|P% zC2Clk^UzMc%)FK~pSB&2_P1HlCH4xKw(wc;?;H_CbS?WcNWk@j3%@b2h9hAs7a`KaFysY|o&a_+{P|5R|G-UA>9PrD6_Qx)9P4j$Z7Ir}IZ_p&5y z+2<7W(4*H<4p6}*MMo!;YrFXd-q}|fIl#E(EZqDy2?YBOcU$fX>TQS&GjVhKG5Y)8 z9>{o@@ouj#6jwPUn@?1Na|aG9B_e`2r~2I!0#vx(Vt3oow$ZO1+|G8EH>_JW{-5Of z1GmFoobSjSJ;C>%N-h+>xbISsDDe`PJuoHjWT5HlzJ4mV(f{@O;?St@*|Ydw}%RE9a7iN#(T~PFYZt%Lw^W-@0t{QEWzlMx|IXJNUprgGgd(P8I~eH`L(F%X3jH6x^x=Yl12M+d*iR`bk)z0juD#(2p=1?PnLit zNB@b|AaV`FXY z;!>|)hX9hgwI4E;H-`8)>~^w5ogkvzsLt{?`dU`*BVd;+WG_k`CENaiS4C5Wp?_Zf zbAeV6H9zR8*hpUJ)u?{<8Olh!XNt0~>I!o%Fp_V-_w}K^Obil$xMY?MR?IK>^BL>; zS`%nt5(6VhrAq8>6#wwQz~i4uC^0AjKW^UsINE}qw>zFh5dlK%o?$mN-hpC`WyL@9 z*A5G_ZxU?A-i=TkM13)1ZHB}4)c;tGPqi!9g?}>3x8hIbR1Ofnzcf=z^L`p(ZoG4I zd`!zigG$QU=PN3JL}#wO^XQg4j)c1e-9q+UhX|%#mj@TEt(46eOI1)0)Ug1i0ILM( zKxUY%I@Bn%tDQN92ys*b7JSIC1KNh+UGf+rH6Oh%$D@;(@~l_)TJf;|Wqlio1Ek@k zpjVdq+<|&f}hZ>t6&886IL-NH1Yl!piuvNcmaaAa^wZKJxu=}aw<9hr|vXc!CTcVP zaz{i%;>@uWNJo=&mLQRwD7ie8gtjy_jezYGx8LC6xmOEJ7Kn^smji#oC=-%?0K?k; zWy6_md}AeP7-wlXWVD3Q(0Nsu#R2jd5%yRJ2`?;~q$M!0i@$-IeKs5eE%39PmsWu{HW{YuUn2@KqZoXxtuEGFYG)foET*e?71@c6u zpx*cNXXj(#qNPebB-cP9{#`3(MkB?VWBqQJgjPUmh5sb(PPQ~&qLP%hcX93{S$B{CagFnBZZM2=V5q@6}(A>|RAwV8NzG!e}L z(J=H1jFTvQ%}Ed`Yu`WA8u<0I4G>!6IjUz1hH5BvDE z1Bx##ljtdiXM&0@7ms@VmT|Es=2BpnqbD9tg059-ZnD#czx%k!>8b+?S;t?ga!ow8 zO$&5Cdgyyf6=#ilv|aRC)saKMSl5k*8hmZ79?&Fl*eBG~Zyx>wEa7h^6KAk%)`7Ba z1`S)DKCSqHop|ws1g4QUku?;Hyg%yMy(xYBy=?Qj^OCr!`LQE@Va9KQPUe5y3%Yku z=>OYfr|7HHZwzs^O8MLm9^8^_V{7XPeM2A@ENRJ1@(^kKCJei4Fb=VMi5ZRzYI^CT zx#z++idF^A9)K2VvlU^+CjuU?2kd^vN`4rKPBDqhLnybF}|AQqM)KxbnZ^yIZy;+LU?A$|j(kc0CD zz`_6xzic7-%xO~v;^p^8nb;;@6ASTSYx&`50NMkoM>Y~P%$ge(D+=3A>m?ZO!8U=HhjZsnE(mAlEgOm{HfT6Cv{0wpS-8z`tF^K_Y$HT*8WNPYpP+$Oe z2KL{XnNW4NACeROrt0;SE2%U9CY;gUM7RDT{r~qR`ew`8gW4XHw$?E3%*+&hc@vlp zogVsBvdTIM4~%^AhD;Q`^tvuaGo2ncSFGH4=X4KgA4cW z#i_q9R+Bl~#G{#W%rdd%3Ih!K*@>)9n3c-nGyNsOw>`t(J^C~>((*3Mx{S7$+_(cbSS8Q- zmDcJVD(E@i4VxAo9XGKs;A+>OT3-AfeMxBtYyf?iW-fs(_1>ysbM{EmvKnj0V7`@K zU}`1}U=z4<2A8hvWlgFWO)Yqldb_aMW!+$~mvtmwBdN>*9(GI(yd4LbdHQedt$6h<-HE%+C(4-u=dX#&DQHC_Wuf)KOp|4uKYsV;mJKU|E^SX$a-rQ;N6cObT?D$> z^q9qT)rU>Ec@%Uw@AaC>cox|!I<$CX1V5P`%T=xU{+RFrUO7+$LX;K1fq>g^q4p*s z$ajK^PGHZ95-yGnl-a9uIns+ml3)A5BMChiv^l~3BloCDb=$nu+@*TAk30t+qVz;o2~4no;osEi85(>7AF<{Wy~{@a*vh8X9Q!hWFRI@MPe;Vap zCG=etc(3>Fsy=k z#<1kA(=zdyys5U8uhvp!UQ$3MP*(B!K`ye*wuyIdK6mn(u~~;hlQHU*A2vhn?C}?W zC=*S%k{c}VN)duKvS%tjOLiC7${`lIp@u}s(Ng)cFxscxOzcGRwEwK4ty2e^bt4;ixRB{MVzOG$KopL%n4~!p4m0`bsqtuVjDUQZ0 zj#)^>;QH?CnC;M9_KS@G_#C}f)dKhkz#l_DNHMkPAE#s=Yt=1Wu?dWmjq6>|Kakqh zgFLiSZq4)w*6C_+yYj#N zI8O<8a}ugaPuglx&;&qU{zZ;njTD^J&kj(5-=}%=vehe!8%vWMd$F8q(PlaDT={f zpQm8o`ld_lVGI#3r-+f7H(3{3YTnG>H&VE7NHz3b8!OnlHY1r{#}%6X?XuA&4nZo% zzL(MAV?xo;=X(QT;7Zw)tyTz8AqU5Og9!%S^QF-3ReuRgBy5X$n%?GHNc*iZ=HJOa znlb9hd)MON#vPot8jgF8Uz;VD{6BGf?yu$?cGk3*L zJ;(rsM;&H5-hL|PeNNI_eGRKtyVK2Hj0WR{& zhw_P;KJ(N{)|k)mv5f5`V94P)qV4Y;u1LRNr+OqR4M*^JY;-u%D;`Qw4GSL{Z>{#1 z(@kH!4gk&iGivo@Xk}!T#?bmJy!Km)%8X54*Uyh9Pe^URQOBHJQKre>!y>v{*jrg| z7spo6S!Y?aocJ|lcv*Jf#TS-F!%}6r0>HMC#wxe6(dGMwW7Fp8Z&Kc#0D;FaDP+yQ`Yj2ay=~z;KrfKug?kgrXEu z&X%rM-!n2~z`Y1a^4oC6m#=ztbcbhL*BP-r{w3Z2*c&kLf}Pe`mjJO`Y5*}rvm+?F z$5hDMO#E!V6+q55~ZhD*3nbQ*zcw2}5KK)v&gLo=Q?Ia^(vAS3 z>iWVo`q_!DZ|1+RU#IN5(`;WCDgNWwQd&kx+KVCYo*XE{0DY;L;Bz8A-UY&VAL|ka z5^1T?j{dVre0*{edOVkGTDE>*hB@G_p9qz}X92fPOhwxcR!N?mZPc%2_qTW>sAoK6 z8)Yq@>Z!bQNTgP=;Y+5ON;N$TjZVCfanVk0(z>S9pmHfi=|=17H(iCVXG+v46;F=U zOFFGRR9RRX8v6RI5u~F)&IREkq@y0&YK|U*q8=h@Gya%v=S3l2BL-OxvcE1=W1q8| z>KU=MU8{}cs$;vd&m*qK{pG3*`hUq4suRCv`96tT$i=xCOX&y6?;{8Y(~I8KC})6N zqo1<5^Y+`c`NV+j9|@ecZq+8P%8Qva$=YU+7wk-N#BrLgYKNG*Y@V zW#`riBil37J#`=i$O)qaWr|fNE;NogkfUb4`GNtm#7ZcHt&|iLaq6%;b{%_n^MdsK zwV;GnhhnY#$PV)?8;9@c#5{9h{HX(ZT%YR|jR?q((u=*W&V@TKp_T0Je4?`d<9yeY zSe}h`pvPXI-Q2@{s8Ia`8D#zUyBp&i-TS~*yz577i{g*jIBT9)C7Sm8S^g4LcFl^_ z5YwH*WCPqcUjNZFmJ_m__YC9yerGo*btEu45sk&rF1G21oaVsJ-T>1C*UJwMUNXK; z(tCI4^gWXoLzu9CklbSCug&>ImPv0@3{|$QD%GobpaZwEWrbBS4Bl%P`H<}qxy|t1 zGc0FR7H?#@Dxlu#vbSALsdgwufY-%Mp%8Bi24b=b6&uMnW{i(*?_6)=f7J=?bN28P ztvt8t`m?k0dNm_VW2p`JqyR3;4L1)r){qKMGKeER$<=TDP;L``9IPl1RFNn*QHu43 z8C**(>)JCY@3L_9g_u2zBtaD3L+B`pcTJN{UR}O{%VV4Ez#Hr7%8-%bFS!eim8%cQ zma=7n-!4|qcKQBNBHB=1rFiPxV;AZmvqJx+@rjMMwI6sLi2~%^?LQu0d48-?afA{y zayjt%u93B&Y{uJo>_7S~Jh>+8I2m zP}g5&(foaiq4BTOti6y@62I_^mE#`z3Z@Tc*BjEg5}nyUVio@RUt@&15Op_uOzP$) zEn=`K1A`$B@?Q!;yJ`8>WzwvaP4q3lzSmUE3Ntvy4;7YhprB;$19r!unT&Jul>y9d zS)<0Xf7`N|Olt<w!dS$zh1g}_GboV&3-s1T<+_bim#glwOng+@47xTsoQ0VuB9_s_%8#wZ*IJdhP&k9 zaOcW3KtA4}Y$I^|rvSo$a>mdS>kEy;AOkxmuzA3i+NWAW(!PYAsj%B~6<|7Zbd!Tf zZTgIVDlnaZr3`S$|H{VZ5q=e=86p-au?s?nv-|zsH%z%e@*B#^m-dBLv!xbnOKMlE zf`pD+>O#`yw*za+^=0;;{>uf!$omdOQlaDr)PYugFY8caXX#w2kqy1V{A z&CcH)_c!7SQ4V$h9-h|ee2IHdv(wMePg(lc?F{gJfF7{X*r{JzZdD`0 zLPn_oqs)hz#O~Po9O!ULYMEtLQeHDrY_X2$3gZNT3w0AwN4r@6kFIe1L&X5a^)+QT zl&hel&_ho2n56dUag7Qp$ z`;yqSpbd!8jzz$C;5kk_?ayK^KyI;?xS?VnR5hRn1QA<)iL<%zWE)gCdiwh?9sp z+i>Rs){ZjtA#=V?jQ0yuwwxmo045D+_ylw_hA^nCeS|OLHsTlNSdy!iCjSx zsOXp_EsQBYZ5q9Gn1_7nG-Q#&@eb#sG>k>V9n#S2;{t}b`|;r|Yw#UB(?+9McPQ9Vw+2J7)N) zmoiyZ07HTtG%(G80#gpz$1sdZi@%Oxq+k-(-WfL;NR!+tweP$j--YnMPa0+lUy*8g zan2)B$I#c(y2dI$nNEh)cy3G7-Jz)9#Nv<3SF<(uY@f__)rf7KZ8x<{q3dMPd; zAxW)!sxJ&)IgMAoCMqWBgYkBwiC$HglLkxN<}~bN`ZcnqeL0XP4V?;z-XIg|YgUe))x=K;Fe2w=}P-%s%c3l>AA1cnxim7<`f`e$F6%Np1e)dQxdKNMlTq`I_yD>_^9I2?d5L^0@{5as$1g*YSd!40G z7msSyLcf-OUx;xDnq0Eg5Bj(9@$;*wt7ij}7v8kQ-9%TIA!tT6xg$^nx5I`Ul9lc|MVQ3y1CE?**Jl^ZBu`# zbf1I4I@VRV-3jd#T1+Yc@K6FuNE)j7HeXI6@?o7Zq?esoeG9Yai+^DsC84YPBb?=> z@%@B?-K&P~h)-sBGN13ip(4_fVEEI*YoF52qp`p2Z@=rPG|PT9Pj+T4%tsy`8;F%f zNS~cB@P4=4C;46Z=*CO*q-i0_RtnwY^d8T!h`F;0@r|-^`X{|Mt|2|#(V6dyg$beK zyD`uFIWNbkg7%);P)*hqvZ8b5>Hzse>i!y`#!+7);r8s0Zv&X?fds*d3pY&maUq(j z66=~;ez)^xBKP52w@XUm?aO30-?lk>Hcy>NlVMg@%bevJ&{nwKZxyzsyyZR$WP?}V zeX-RixD$l?QH)ep2`POv&<>j&(bQi0oE(D%6*emWEQ%jH$n>T)`@PnsmQ)DAX{h=4 z1sFHI5f0Y1FOd5wRy((A+xe|Xz&i^9G+4ZZaBUY?DdL!-~_T`DXSvW6i5DL?o( zA|j&sK7JMeQ&ksUr{3vN4e(F%WckU%Wi8vwzL+ab*4iF<;yHon{QnUWu+=9n*Z zSYdg_;aeB@u*^p+mc}e?1hkLUF!wqK1e}7!6bu!32Lewh1>~G9i;E22k;BKw2lTAC z<8z4jcWsp*Nx{Y1=-i4%=xvNsL1FS3o*V1Z(9kd=k%-c_Ba?Kl7CK@CpXjXvr}!0t z^?64#bVvEGDF5V~sz;YPS+s;-T`69VyWYOLpZD5KI-FFN$Wl?7k_12~90%GfTI}8A zGv1>D49aZB*Pe0|{=Xgp+QdS3u;=Rebgg8 z?+d8WLS*4d*;nlg)y5w`4r^;`J9SRHzu_DD4QgognLz_CvgnJ0=$TWevR;2TXdFW) z&r*}4nJRZrG$fr&PO|nq$aM1^AOU;{xPkcOq^GCXk%8PF<7$2qV03s|yGEM_k$7Hk ztYv6cnVWvs1uX;R!n=1zDg$SKwukR{iLI*m{{6!C?c1R^V*B@?8XU*(up0`1JF$OMvGJ*lDzO=|ug#7!#w%7rNZ zfedVLgX=WGnfPsj)Zd~WVFU-qPIUz!Py-P+XlW(`Z(NX;hBx8bn{3qO-o0_qq&ivx zFyZGmBNO0Y#LF$EZugQOjb>X`S)~(il$6z-GHPO(}P{?F=w6|~K#_ncY$ZF{5SY=y`E~@XA z?Yay$W@KRfBSKL0Ptsop%unEjJG`m`-;9HMK-fKx9GBYAQG>!m%n4^5O(Tb%Q|!uM zbo-_<4WCy*gnRir(QO19uW#;T_3~q#zL=bsfvfM9{mjX-W=3>W)W}4C1@tnoggV!c zA5z>HS&17959fxbb`)Zt?H=k*1>a%x*Vfi<3r0M4BHrtp5SHF7@$k89i&k*W;%q|P zT7=IzarzyE$hm7?{{Geqc2#*gt2)>4!uyg9U6SxI%UJiBMr(Osr_w&Ej*w0}VVW+> zU0HOBh*3CJM=4;EW@fAWgd61Zm;A++&p5Hx+_;WAP61U3Vao4|Yt-7F1IpMOmMCkO z<(HS=K)h;vt}zi1GdU+s;M1Vzf`lV91jmZ8CGng8(M@(>HKOXqwk_!m)jX{nQ6#9=#=Q(}= zm#n^AQLV$Iz-@&`T4sPnnTKQ2l8?}mq7J+K7z|iqGCf>QwYT?7{tm%jr|XP>o~v8o?ytZ9lawbE5#KOaq@U565P4+G_kB)+$pAosKzW3B zfVuVViS3(!G=-`~kQW@~=H?DbkvCi_spLXXSI2qE)_REr11wnstx#V~0V3N_3aJ44 z@F z>SgS6n|qs`*-@Q(#%Als#HqK2`;={Nou3HBOJ7iOKEGb^-HGRv&pVGP>3Z>GFG;$E ze=X6^_$KP9&MI@%yT)RLvSu0;IwI?ERn=%mF3)`x@5lbpi7&CCmfdp|auW~GGny!I z#Cyui4j7VXXehcg1UNa~lLl_Dm7Yl5T66HdKse)9^L$3H~{&{Wgrzhody#8+3M_WtseXQN28o+aH%S((> z(V96s)F;OxmA41gkuqzDW32Sr{D?Rs5{;q#mw8?dsnKL8}!ZUk}FN5E_=yN6YiypisJC*vWfl@ zS>9wF{~Vt5w5DxZeaq-KzHE2xkIS!Kl!lkotP@_f;3q-7w3Ym&u{a#{MzdJ3mh-J1{D_h#!E4rII z<5m@%vOsto$eZI2$Se4Me=mScrHFS0tCq2p8l=bLP|bX1%f$nLAk=`K^WoUkl}Awv zt}(leET5G)ruDy9diqj7M(wNYNY_+3PR7ye~Wq{6Q~$4xfP$(m<+F7So>d07+&p4>;#RXcJJ zS#>_PRPDY?;O@O=Fv6-kJ1qQbLg9%0J@YMJ7QN;?P6&tfb-Av|z^po-krpOtT_6*K zDffQ;#l`)Rr^@)hMl~lqKacc;&T)zUX?>9!krC}JKCMuF=v=LYPk+@5u2m9Z-bZ6s zE;ug=3kwO%s$9sAM|%@d{EaU6pL`5Aw?gO8wdU@|DOPvdUbysMR&Cm0@-<}2uI-4L zCE}yxAbfrcQ*roxl!&e(?~C#^6PLdS(b|5C5}q4H?`!s=>IYG`^ZZ4Qi6~6)zcVGT z9Lky!{KswT52dKd0eP;6!?3~I!Rz(lLw;z~cc~mz6=Zz%AHG}Oe0@JxC4G-t{rYLq z7IQ{cVWwLYmgmgaa;`rqG+HmtCBH_xT~sYmc+`t&g*V z0Li}f?pwlcWd}X(a{E>PT$JsDsBdEqVzZ@KT#h_2a7`)*))Ks7)FcJ71u|m6LCh`E zcb*dap48cj!3MRJuJDJL&?{Cz!PTIuzyG-!`-QLj>T;%;} z0;w-{^qnFgUtT`IK#!CpgL%1)QPw76$w~hoS??WBb^rg5zmA=(h7=iHZMzWJ+9_o3 zRoOdxA1NwHk?o))dz6lStcFVn;n*D|^AO_L$N4>8b$vhI@w;yQalLQvD_-OIdOjbI z`+8g<4>bp@ZS@V%j`7k4C@U+D5V;DN4`An@29~BqJ;>CYxZr(FwI(;RVS>6&RjGlJ z6-u&%;frj$-o-%8Kza3sBnL+~*lXn8gmCxpiEuHR-Qtpt{!HUrv?bR+@*ySSSIS>m za%c^vQ|m*h)#y~vmX@pPw8KZPXsph5B(7NSLJh)cUZz(z)_Q*@55$MRhTj3oRa~Au zOVj$#i82Sm>eygD_r5Qj`$VGV8?)%-!7r6gr5v;)$zo;-nSTE ziq4dsV2RXhrHu@3bmU&y7+<(RcDpthY)QPz$GJuv2zB~5#@_zjt&6h9MGH&BGCCrC z?n1UXdj1oOOkocUSp9{Av!Soo0tpc`+;a~`Dv^o>q2dFr9@Ng&9%B)J+5u=Hqo~*> zBl?frBjqgC%(H6nk!Uv!Dto2!LF%vz)%W!lEho6hO_2NwA|L|FXvaolHVI0?cPr07 zqpW{bet0uqtLaQ*&(Ki8_wUwFQxNA2h6+zefaym#%MhxbHE zK86Itsi6d1to?sxGX^m#lH4^5v}n0IxS%5IL)AK`?6`L?}|ZZIySmJS;oC2AfXZmT{Q$cT&{FYEo2JOdmJjAZp$r&WR<8Q1rZ zx5c*G=LAovJ#%uBsWC}H^EZAofuq zPs{0cKxZYOB?g;)zjxIawd7UFXU^{R%AJfTuj?VK$3qB~ip>%~a-Zz*} zl`J*U*?D6shUac%jSi1Cqq|8`3hkrK+`Fp0Uf$u&RCz8?n5CGlg3u$#GhY z{0W*MFE6z87re1tJsko?JI6RK62;EA!R7*izn52%KROYyZZ~h9gXIC;*3v6h?2Mw{ zLqtgRhXo_o&xue2ZA%3g;?I=Eh~S7X-~4iP@_K?E__C_Ey)TtHxSy9-M;>P&k2}V; z7H=8;`%V?Kk3R#?XO}K)9%>8O?%mn%NU+H16nkK8nnj_tLmQ{Qa-}8x%Q+6u;^185 zgi~-0^*0SZj^K^y99}`e9B0{cP10AbNxM7iS}z$TVi>~CHbX*49!wvZfvPi|0omQ_ zzo6-LN$k)??gnOS$8Ea{Cvh^IKLC+|um9`HiVr1hYjkw9ZSCPA;b%*n?q;9K zY7%sNw%+A!&a!bWw{I>IN}9=GRo$abR#rmGVOc}bNn1uUy7OB=T=yQRg=g!vQG5D@ zsXUIutKXLH2>=TT_2ga(?fl8$p2Wg0+rGRE&$V9tzDj;k);(+Wyy<(TXJG8h_<4up zebPCj|FE_q)!D@0Lnq?&RHZ7V7_XZZAa{rLE7D7I%4|nH+}$%#(XWe3QMEy*bBnjT zySuIXyqBV5{E2y}>)}rAK0hn^jy0ArJ+T*zm0mDLVy0XrgiWVybI0d5vtH(2P$KEz z(_{cd1?UF4pP5rT^USS+M=XNsEYia*#3^|)QxzGZwpPP!XYEx=u20$G-mseV+wyN! zZ1BsHX*4TS8mV|@gEki%a#mDUW>afDRIyU&sx~=L+ev6(8tJa~I+W4TYTm(lMAVmMEu^QxlqBFQ3yefTy;CP&W6d9Qrfj>CxCnEKbMsRKH*C-?$@WYlgpXY`u;EQFM6TV6^C{j-OTFi>&KF><;*`G zvYE0_zUPnc$+4JPp{|k)TfOGOsRjXv(fNu?)6Li}*sVb83t|(?t2*A~(>brB+qbXh9B`6i@xC=N z;NV_YQ^PlP>3VyFtL9|J`fB?f){(TPa%jj028>bD1r!%`hV(s7NdNPD&#zoj+HtaL zaRCO{)1K2VCl1B!B`(1Ti`(mb7FlCI49pWz89;%b%%ix?J90UQvpFdBx= zS_2_!-#KihhBziS8WGBz9ktoe59Fe@^IXX`idiO0e+kmUIvU2LPbGCQsCcGB? z^Eog`m@gyuqrsUT{mCjSN`XohzIUO1ZD1mp-hmI21j9G?tVa#w_KR0v)} zi6r0w>^jnMj)VRA0o=$jtF`Wo?N{ja!JBh2?`!IO&~nnUhM^0*0s;v~ zf+2VeRA(jMnB|R`xGGwXB6#>LA9UXzETpf4vIf3~!#v168*;tmom&gvDU+53>*=~& zozu?Qgkh=*ARef31}L7H(f8FpgKUy>VOTz?e&Ve%V19sdMC&TR-O$PoBHeGT=NLA> z-}bK$pnQ%KK%k;P^T{m;0Y|T*bG0syP{Icvv{-a4LX;AW?r;FG8M1`y?z=`eopD;Y z#qI>PUl2QHaOC&t7at;j)9&@Ouwpe;CUf1``RrV^box^-0eJyCZr+U(_HYJ4dD{nt z?ei-~&{5;CyVO*(iHgTvLuSS}xUDq9$4<ZZC^bpJs)WsiV>vQt&FSZhe9e{m@~V0{91a zq;c)qsX-g|gGIC=i|$Vbp>=@z-=qo>`8NS+Qh+JWH6}rFTfA;D#2#RjE zEeJN;*xUr?CTv_e;MUO4)O7qCqz_n0&X@0+1;|U~Du&FuekMdsgj;5oXXeEGh$GW& zsEUB?U~4Cas@Z1vLkj+jKP)G3lji(E(ghY=RvAUkc-{t!PgV8xp^gjl%ks0~-$zD9 z9A)l$moEd{q@hojw2H#yD5ni`J9^*&=9f_^L~Njkvt#f#3##(;`G0RFC_1~i^eS;! z>o^fZVRN^=7)d2p+=nI7_Px8oI_D7>+w^U#Lpr+F zXKpa>^)rCpd$}662EKhucT&>)b3P^e7GNAbi~bT{%P1?NEepAIQ#Ndw=aOHeDdymqSg zHq|UJARu3f8y;zI_w-azt9&wL{!^79c`KirPMXgh|MJ^DYFsCDosRTm3Qout># zpkDKI=5;9IFajdrjDYj1?lCkrb>8noW9AWa4dc7z)MeHf(Bs#^1Y)+Z-7XR>e2 zIl>C7_Nj_Lt+{EZ<5s@hm30}u$zoUC{u78ClpdcyKZ2!|dV@&{C)xaU)*t3-`J=|K ztQck1Eqv8CUW#N!;L1{~0G-k5akmQNTVmRSbT?RGND1$fV{DT&Ej2Ao@5PN9XHu2A zrN1sSCxJu)j?6!^AE0{fh|?@E%2KS_%gFF(!Q>S^qO$sEMP09^{OeYS(n{nCJe;@I zEul%uBm<(jp)mJIeQ5n4PlMv)`T6+@^H0X)RY3uP8Q@re$v!I+ZcMI~KKcWAQTll?`;rSTf1YQv@*1tx za{DE$z#g12$Jfy;?)F0SGeaHF)S+L3yZa3|fq=5=<=C7{@Q`PJo+dvcdsFbnVCdyE z2LFWjCrhX2=MCj?MCgsZeObxG=;(a;y8%H?_mPR(Q>NChyB!P@=`O&fE}gwk`SzH! zHn1fT*CLm$tJ%s>*p4WuNi~fAbK{=iKZ3|T>k|9pn&zfiI*h7ID!v~a7TkJFYieNw z0agv2X$OtN{c~!tna84ZFl=$t!1VLSdkiwG&%IvOJUVWzaz^{M`CAXrpz8~BvvYEy zu1|1)p|qrH(SZmc8Pm=oWiAu2X+Y}_Tf3Ph>kT*mi~CC%t(N`HUezvHwjek&p?MegHiq^nTjn%A!b>!Ogav)#&^ld-g)=Ch z^Q3X03A&+#GebMyTi?!O>fpSa1N52(>WP4Fy=IXG86CAir6#l zSA?~9O|(v5OjH46K#+= zcSolEc--rkSk+w?tg92P7(McB?<{FK*0M?4=#^DcXbBi7;kW(!{HHPuYl2bXHigWz zO9Yt@(c6W(ua>)hdWoY?7znig$Uitq&XNUJJUg~G=B{=q^BdUe$jh^o>WFAR z!|ohOXoiC9bnEG`{X&TQRe)V#EAxh}1E2|oFHb5x8ab9W{GG6G-oCwatij&S+`Nny zMHi@B3}O@?mj%*iJJJko(1yvPeY<32)tp>5bwRH#OZ%&%``-Iu_3^=-@4tveUz}6m zlC_YfmAR5(iXmSD4Z@(=XP39t8kj$DVz4{W$_l^)s677^SJNug>2vij8k~II6=h2zH{NXf z!*kQg(=&A%jfsgN7iX_Hve)wsiqT3a^LMu_M)u_(uaZ{>rsjJTWF4the2(61vfO4~ zY%~}Df6<)XKWIl*SXfwpsJQi*_sO6fn=Q>&=3!^1{r3fQ)jFp=kgan_=OHQNG&h1G z!Z0o##g(ocL30415_rN}-kV1PHhyu5zyXJT-1 zAO5lryYeaQb#j~%i|58!HGk5adw`1eJg&3NS52q;yK$LX^3OTnkM}A8GYUu1L#U4# zHtNO_b@I?~YG_?Xsyrh*j@}zCE`FCDry0Fv!rq1piAZfnZ~@nMEy(Q4k>u+_3FmHl zD|`D~lMNcsrZbPRl*S_5z0Qyq9H!h@!|^OY_n?5>_!+0QY`NVU+BF}ts(?xm(C|o9 zNeGXlQ}mg;j?+lJQosAsi+ZB`Due+5Td5l!(%rr`(Vp5{w2-pSk)lbpm9(Zyh2>Rk zTEKXe#ol*k0|2Mshy~Op&qx#<(*p?ONM58|y~v@hI@?z|dAcvOpO%;w<*zEw_MTqh z$}`yiRsDu-NK7hePhhh<`Fe#vyY|_TxgVZ8>Mv2_tGl*3zL;DrEiJvlesWlzG_bo= zMw|2PE*Azw9CE&Arl++nEi-`hgb)JY)hxx1MgiNNN^YIa3qb#mPoI`c0I33|vlotH z*lwXVg$kN?#`etX<@#iAnroiS+B})uJvEgJ2H1SsD$rymBdPuJ4;;=QlJu!y#?!Oo zhp$CnbRWL9wh%n))oQ90=a9|oAtI(oigzY}$ROT$dV~saCYZ8|#f=@LhsYC~_LCj* z&(yPl)?-BBy9(D4NI0eZOc`HY&B8f?-_`Tjg}1ac6SZU+HaX}?%7$B78>ZIQjDVTx z_3U=B7JHG+tm=2RJ*0**;^RrJBg8axsL+CD2HtkJ9Mxrf^H;eL3{x?~f{SO5<=A1N zY&OhT#FXqpD% z2^7qQ#{q>dctsrE3uO-VB6F{3#7FTc$%~?FWp*9;N~f-$xG8)H6bV{55!c{EGXK2K z=2_{D;QtqMHg&w$J2mM`uI`%}J|G}q0ELyV7=S-t^bk2lWF^xXw3MV!8Uf}1s;Z2s z^;Dx@KR*Vn=05MNe$&cQ{eG^9Hte`Px$IeF-2}fG{-f!^hHhnJPcl&~`pJ{sh#Wi@ zW&ht7KnQRIQO)H-{5}+3%YZ>o;)w+b&%I-N2JdIHHWU@@oGYUNE(#VLbS1&62AAmg z%;?7`wZ|E=*)%wfSDZ&evy5qZc_)FuLK$=LS)&h0oN-Fp9grUQ(<>%@`O+n6kc>fy z&&@YR>~zq2TX;V0o^!++km{?>+&+B(5Ep%@SfH%yorniUBw%GW88o)b9iiLZOE~2; zrh=jsPx}eqB<9yBH2?=wO>&ysxXTN;+J@UtO?LX3tth?Wj4ddqBsIxC^| zMdy5iFA;STL3NhSc!{_$&`$XkCj3I<%ENm-aZh)vUvb>38fe|hqhk>)Q5f|d-0FB@ zi*3A7z{&Mpu<4)L!>_PQ!g=iICX(%K%LP&&loxjYCF764pz|-z1ESsD?y+ASFKw~*f{Lg<$J+V@?_EG5dJ36Xx}(A9ZV08t=i8^z z-jqUp-f9DUFf^Cbpx*s6*BcZcK$-`XZGD`15$0AW7vUkK47Soag(|)!vR>`n^pt|{&{K|ke zgd01Q?fup5`)4={(ZCMfynrO8FnoVFPBZ_QiMA6F-H3Vl_;ioOEh?JbVMX1dP))*Y zv6t)X>nXj6wZirU;WccIC7U3JLdl;ar~&{)z25l92b48*vd5DrGi4ph08lLF%!um4 z&6`-`7JbI-Hq9djW_6MQa{60>8x$xF`*jfKuS56+kQ}Fz9~YZdy>vcfO7JnFKP>TO zr>t!?LCyy!{f#{R>{Da_C6bS7VipR;hfTaz3T<_kflJd>|Af3p!FmRNI}(0~HBRG! z1Tgmg&wA9q=g}?XuV)zR!Vw3;Z}Z@KZEH^NG~4CjbgFDP4c-IvgBi&bSq0OzkGu@8 zKxo9?4UsF$V0nkF6X)qn}X-N6B*M?qJEr>7yV*DHz<^r2F?7z}r2v?!4ccdgG zP5If@2}sZ})_;~XH5MMbY;Wr#Hw1eWNaj$%tBXrJ<#m~lYoX`-TEG4)^^5X(SGe_; ztvTw01%;7-kRs$t`Br!T4xykX=&xWMBl6rhZCzD=T#tG^`+goC9@x+eq<)Ol83p!k zbIXp5YI>Beu8bB*E5PY$W>?HLsA zn41%TfzW{1Pyl6cf&rVbdW$9I7g7XmlIBF?7Y|EIsSN;E1k|(R8Jzc6&Dck)^0-@u z&z4)QjmbktsdxHw8n=neb3QwcDla2fa*Grj$^5%Vi%X?xo*PQi^bDOlK+l0b_AmN~ zTFw7l=vNSt=A5WHzbqP{DcUi9RZ zOVoSYUgAbc>AG}SHC!3_zPo%P)Caw;hf|N!=suHQ5m^R54z^B&S`_B(q^q~36+zGf z8ZhyHQu&Ow3vMtIdL`73fcq>9;kNulTH+)waQ3>pO4J zm-yMpG7&HF$keohIA+tlY5Rr5$&DPZH$bFGr6s@S^~uo)&gaS+=+nI*D`Mu0G)sD^ z3_P-6^wNqKG*<6DH4KMoZ=D5r=Q;O+cV9wuDUKTETuIEaH{YOYzYaSZj!4zg&|nO> zdfyw_m(X|cf~I+YmfqE|1e3{DFb-_P#$b-dFBwA3l~cX*s%(AuN|D`&=-Ki+Dbv4} z<$GQG^|i;(b7CKvBo~&n46?Wfjf$$+!77vK=DF_=-3nFKd~BAERz;1Y9nA;u^}V zU=o}8g%`sl_8_vX6m%|5J$9KzK!k0tojQrhRA51ZVl{Kn@nl*m)SliuLqZmX1p93} z2@jbeexJ=3Lt-I{a`O7RN!~R05)99z&TWX=md%!+`&eBBkM`j9arOC+BKR+fnPTyI zy~ZRLy!^L{rg-7!QVJL^aTt+1aQJB8AfGDZ(Fd1ZtX*K+3?#7er5Go$2&KUgBx2VuX>6In!?iGLDsYSS$xVti@6p?I^Tx$WN+j#w}QM7ZlJc?z$7M z8CoG2{SdPjgESlu@h+KP`8ZgRJbS{8dOVm#19}GvP!mqU!6UuQyIcHMNP4>WC`<2L zcO`+>qjfxJN5oc&%|-Wn;~QgkZjqY4$kUmOYwbaGL>xk_i1EJjwX5~nvZ)|8&}9X~ zqRz!>XYB^JyE(FrTWMjg>rh?hLe_G-&fl)#e6CiFe!~)trX4f4?&2*Gp z%v7rRKV+4kkfxO_%?x~%Bu&D~hKZF@FLq!T4j~KAENx~-;1>dXl5a}8y6yAi$xR7H z6?*pS$!4vraZ|ND<*e~A0#2C0UO!t$d;NlNMkUXU6=-PEO42b{{j&8MYK6vl$U5S??su<(>CGwLO5)YIO6 z!JN*^0~i(_IwWIV#&jS$3eS`6txeh}=}I4T6)Y<)v~ktXnt#YM|LoU#7Z34KjAXDZ zSbl=)rj&Cb^a6X%*`nagnjCId+ z?0rW;Y{k*JItlWJ>`v){!{&sfuWj@41$6y@b;6_>8R#nk4lmoAd9AiTy`QCt&>Isd zWNJp&rG|7ehUjC~{NJp+T({iY+B-MguT>+kIeFkU{E|ljB`jWsNw&T3Uw0Sn)Dq@~ zU*SY8su{vm1IO&=mkWFjcrQ?73(7cPtd!`FXH-!Y_kIX0;DI}J@h}#-fZ-AVwaBO; zH`bEJsYIPzZLTxPT((^gTpzfFKtZ};XYrhdcG{r8U~e~>Ffg*ShU523ThoQP8v1v_ z4<@mEt)lR{BE`k&pAP5Il}a%B0bmU%5DO;gr}xF%H+~ga82;1A#`S;$#21TMtPLem z-dX0%{Tm&|z!bYWO3OWYl&SatqsEnxe_wMGsU)y9z>=A+$VOrWl)fffhU5WKz(u$A z?;McSYBd!BN*?E=RE2n1km?U5lsOB_!nq-SltUnHNr;aRgC_-4lH+#<%1FDO@4i^_ zaXgqV`d*$}7@sLmiVfmaZi9^E)47|lmi~v2ON6fPJcQM%O=sCLsMH)a!eYAEGbd5VoTh_Re679fO44>Gc*9?J=el4Bhw3Naw{6 zcCVQKkvM&$1W)jdunbn6ybw%QDKMcAt>D8%c&K)Ym$5Y{KCPlI&@-45VmE{wy+ zfrf9JZ&Br$prwH0d~j8kE!My;A4w6-FSTsOox{4-tzSZ21Hc-pXYZyzndpDkh<%38 z8~un^A!l0$r@4hpp~9%8mreyngsDFO`CFcDL!&pIK!DM%@zv8jBfMN7sr_%=mF z3JP6s@&g}yoQd)?15(2BLX`sG3i(Kg3Nfegx{i`YNLutc?4Lx!KMEC~0#O;(_wR=e zVXtkSFq{XCCrDfei_I1vC9VdRB!ti{Xt@^~oEq<$b#-%_*OOh-JS#>o7rGtPTz1Yv znz-l`^+9MMV5jPFYX??hUgbT0RWWM?<}{)X3V3^INVg+>qV33#NWY56z+nxu>(d>w z9Zsv%hjp6{mh&sA1*d_s%_*)q#$aS_USu!@jV{`E{jIbMI8KbY6ILE2w$om5PWE3G z41R^ua8O)>h9>N+g$0Q`*PfyAzA@8~53?qea#)0~q|eaz^B~?Ex)Kvj8w<~Wo=vS$ zOcOD~V536?F;nN}F5bdbwr}?h(Q)A(UhBm4>@N3g$P0~>VRKtiws&D#leiVkJ4@rj z^fP}is)e`m^4_bk>pB(3H}RX>7x;#biU}lm58qx)&}I4iB}Y4Q)dFn_=;nXu`R&{H zgfcZkX7BcNcV|JY89N7ua9m4n&T+YmcnifKN#s@-GDi8*&WU1@eI(P%2>dqhE%)}oU zoo`l_o+EoZm=WWiGD%&fhRnX#!A9d^zisOfuf~mu=5PTZI}NY|D$oEz9AIBGCF%dN zSilhlf9_#4e!pDL82Qg*1vduCW9ZcDl9G;9p$3ay_n@Fc=;2^j_1iG}u4moV;&~LI zUGVg>>54v0HW;w01NjqKAJKIBK4{J~+Pfi9vRcCaGBZ*a8BM&@ilkI=4yIx(2uXK} zSXE zLt&PIy{RovQPDQ4b%!fd-d?)}b)i8_3{NnoO_d~Hr4KL#=>=eeN`Wiaq4$OuJ)hv| z@OaaXc2h!w zhdLj0be7DH5|klT)j!irq|>vsi*`huxJp5h07Lmes|e=1cf3qVBfC#0x8?B*Ia%=9bF$R#5k`4V{M_JcoqXG4$0bwS4t@^Y|nnwqL!yw9g0h!J``Jo8W&cBXF$ z%d3Jb((c8VLo2&Vb_$3w_A4lMjb*Ih2_y>^tB`VPJqXD`X9XD+D3=3vPX}_S?LtnY#iXaD7m10L#kC={1mB09%B*L+qZ!7}mJ=jQ=Ta zN8an0v-RwbLR48VC*uVPh`ht#kMUX5$Ou|G6iQH3Jec}B^kmRTHKswtb%a?Y77QW* z)$dBeJe7F))Ex%zM_^a75nttBw9@VRf0VYX2wbZ9{0vDdWsw-vgOWf4-em@M)F<>` zz{{v7+$(v+{)50j{fPn$;{p?xmsAvVT>^rFf+p7dTE5XYYy@oWt+2(0=<`Hc58qvQ z)N!KqSnlz79(}}B#^sbO@o$%7Xh$1+OUW?rUzv#rtz17`JY3D0uJ;NT{&xG#cZ>6? z1?l&sdop@PVm1qCMR8oJ@>J)qC)gxILDgdF*^mr=mGD)QLu!XL58d^iR(tAmav^Iy zLvM3)%qyt&>*vki0oNMj&d@Kvt(FswZ)GV#>F)8%+^RJiro1CY3dvMi&H(Li8y&)+ z*|c+Qd;A#=s!5yM9tZR;eGmSPU@Pw|DI19g_Ho^~!-CoUH7;Wn?|H+Zs_?Zhv-{WU z`-SrIFm?oZQ8`?VqDqyZ{lcHJh9(k1^I({|;a#LYg=P!`59Zg_@=R9=m1pR^HjUrs zRa=1`?6)=R77z8A0gJymqg6(Wtm&`bng&0QThW`d_1>4p;X$Les~n7K8q;&@&=TqW z=Z34i1)Y1iI_J2A4owGH#%#aw$c=~kPT-v-yZcOV{}-A8bDC?Ly6Jfa@>lvYr}Mz` zg2(ZHE11aC;ST8cJZhD@*%m})>zIk#biTiayW&L*Z?2wg3S>YqKfS>RCRXn~K_Ipd z7V#BOCWlg$KH991N)3^u4pNj3LGI{h?fr_~RxBQqj@;PnL!;}SO4XYl^${BiB<_Zj z3~TSBL!#NUmt&&OQ>l?kO4IIFRmIwC-74&|aR~xOe0#)2MbYG1NEZML3~IS>>qSDO zY3E%$T$rZrn{-HeBp(b{`5`sPdZ5IYL2_j4FAhRB!1#IJ!n>~C4hbC=cMqWe^8Hyb zWK9jd1Hgt42i{Uf{Yrh39O>`h1)m(vw*3`eB+U>6UZ~x%yJJOa==wuLwa!&{X7qSj z>f8!HiBsvzy7%h%wO^t;?Bn?w?WC@8ULUK0gAU3p2bgOHA(o&os?(?U%32rHj53u{ zmAFrMw5#zl!gZs)E#%$jZ||}P-Vxy`5!Nl`am5K79PI2L9al)XczWzmJTmdA_U+r< z(|l##d7q)*o^(0ov6BVUOz7Jd=YBM z?OQ7b&kZ;cq13lq$pshGqA0^c&AOmtl#`UI?2QRd6;KZ)B~z3BC=WXS!??)_*yG2K zqcflZ_ay_@zX@U`IH38dZIVk)2e2ojY1^CgC{TGtoW8WK8Qcf|7GaLEsSYP?euO0r zh9aPJvf-$P=ImYVUe%3K5mmgPs%6ZtZ*n7?ncb1@%||hlv1lVlGM|pR&LuRhhuosN zz2kb^6CSAlru#7P*|{-{7FKEN75**#3)1qlmoYQaxCx zQ9RhsufO*W}?|H}IQrt*c)7~BOpBj^E&*;yR6 zc|_-=lbJ?U=&)E%6OsCgipiD)EF7cg(*ndExJvg?VEHyCQr+Hxyb3gBPe^fn?X;$M zK7-DTejq$j0`34#nBRpC<~@CrGAWF7T$=ycB?0YyaU=KFldcvW>>Ty20Ik-N>Sh6~ z%;XhHI5x6l6?F>$<_e{hEIb{2j3Gf*LdMjK7eg&%_Q zz#va1|EKOlv&T{NH^sr>K4FWbJnHSaaG;#pT@?23hYuf;Sve&VFc(~c)A5Tv;4FLe z@t-nPRR)=wy+Zbfu>KkolUH-Xv0vy}cX*~8WNR+L-A&HQkpZnl?x>&MyF zK>ok%)+}c9)2Y?K16bn>L(zQzXM2OlxD$vzy989<2214zg9>6|XUS?+o@{Dv?ouF# z{mDhA_ew!<)k!i=@ASI$Q}L=Ajl|#xvpXF0!u8wh5|P0v#k*M2k`_a=FG+S5bI>#9 zJY>?%vzf#6d?7^IST^$X9*xxTOVOamb0L)<$Z9!#`p5(=6e@ctu&PxGMxxTYpDhUYxxo7`o+Qf1Gc&smGbu9i{to-Y$iOVYI~EE%Y!w0ZAT#3vP6eL3accolTjs zVJnT#W68Q9>ejEx)9{;h`qSx0$O2tk6*A}b|)oEFh?h}WYtZygK-7Ygm1zE0R zeLm-~^C5$MpM0*?3zEB0D?C4EB7+=3w!oGyjAVewG1JeT4r@AWdaH@BDwxlevc3o) zX4(_Of{bhsUNyN(c%=??sB42Zq1?6`3nMCdjQBbLX1;6)z4K4H$&1|BpXNHQZrieo ziiQ7sYmECHT3;F5#wP}oK3E&(;5tu{uL^>0wtkyZ0x1{IZcW!4lIBV|)2M9X7zs#b z#3}d|=Y=3e5y<>XtBInh)2*CWgw^BuSE{9^=VGxYDLWbRLx)c7w@;M0(GQ-X!J$|I zWl~>^1SkGC>`mc!boH4u4>dr$!ok5YXi_{5yGlT_wE7Ed_gU+C?XJ8NQ2vz-cORt?;ka! z)amW&?_O&V!Ea!ISNGmar+0)uF}tGPD1o82gm9!`D@dhhLx~a|RvtQ({OKP0xK++@ zPy|WyGc@YDD%_OVIGd~4d4e+luItBk?*L~PNZ0QN{Al_G+flYoiw9Fp_gr??AX{gL zZMSuXy=v*jNp*v8%jsmxgvhf8;fQv;+W&;;lMY=w8u26~xrAdFmE@ zn)(@(cl1#^LI|3O`Fer=uE|lPN-Ax=1ui+^>d!l8;qWx@=kpK(8gJ+LKP_KVc&c}ksrGC(01v9_9HmXwmxrOvxXAjG4Xnt82vn@%zf zy-`rD0n^h=vcZJp_9m6eo@BR)-Jlv}g!pD_0p2y}@P;)r&MDWhotDN#0}=^6g`rFU zHyng2$sFNaI#moU3zsc?+#hdh!|v$o-8v};F81G5D#Cl%S&E^@vyh#cB1S8V!fxU1 zRkofnRI4}~3k#R5AtvXoC?>v{JqR?l3@+;sf(ehjSehOnx$kLWl zESq~BPGS$3rP6%B)C~felW{FxMP?n(n*hwPhY_}@z8oM; zc9)z-T6EYK>I$LQq^|vz>};hQwpA{>2QHrgY31i%F9%=6FZ~*J}V`>(gXedKeo>OiL84?p(E(0^c{m$oKc;v&d!?oyr#b?Ee(wIM1S`2*wif}R>5VEea!p%n2pD3fXbY12W+{7e3#>+>QhCn-H18ApX*cO&%DNRVc>`3 z9}Nz=NtZux*8JnrqbnNIAKOiLKiFGG0*BFpma&s_m#Vk*xDhwN@ahryrLQ2e?d3~9usmy zD6~58PcQxBLE~*-rD@w zcW)Zs;oQb61&6TfvU5R~G+XJ=uMyUFJP-}w`~~9vyd}3)FyT1&^ho1FV)?a=@lre! z_7Z$c!tsvPS#|Ka78ZUFgf$NCk5`~_)Y8(DVMt0!l0)y%ly0{iedDeuq(NLgoH0kO zT&8NyK&l~EhPISSRr}E9V`Nu1B44g~2s^;HHZ^qx6(zYgqFNGofnfZXk(P!or^rj* zylB?m`_g3{%Id+t0wB0wP|x;2Tz=||=E3ZxDn2x71|AKd62SMH*993HmRO+9PLV?~ zl(nSboYwI>-bm;4{6YX1?RTygW1l4X(uh&PXZKmnyR-!bs*d2nxFJP&b(%Q$^Xt?+0n@W5Qk!C#M3F z-Sbd6xA3j`B`^R&D^13!h^UM-_IFun;ZL-@p;7?phN&!+@w+-JXAf9LxRe3q1h6Z8Vp z0JgDh^=`-y_#_tz)l*kYU0huqt*yW7;V+ArTAt;%E9=cXAn6KY62Nu|SOH8;L?w%Z z0i!EUIfse(s67h0wg;7#C_VaNaWA5gB>|)f(k(#a& z5c9+;!Csr7s=9-^5y~4ux3W4=9H25(n@IZh{>Aq8`}Fj!+7f8fG)=Z1fQI1~qpA|% zCQ+MGQHgO^HN&LzA!~9MasjJURW3`vd_FCe=8tC@ke)p7r_Ga-`FHUxeMr&&4=mM# z)dzwmJ6rFxCI&Kg4%8s>5BgD&AY-m<9A9E%Xo1shQ=8Be1%`9qy%fn*vrP{`TI9J| zx8MLo7e>h1cV^VoV;Qt~AEZ2>wMz+MS@z6HEM0lFxZxdnbpIQRYjcOP0TM2B)MwlZ zCC^i|Ns)EP*!h#x?|rHbUPP5WtZ4z(Ma&HCb;P(h%fJnNW$BI0@r74|L!*r`n;VPc zF92437udNqN(#|jg&HcZMOxqdr~Z=4CON8G>Y7;evAE%z`3UT}&}B?BB3^1+#qPU$ zii*Y@AL=ftln7$yu3_4oL2{CRoQga)!R5D)LP_B8S4It3n+<*|6r2HC>56&EWQnyj3GcynpN{;*;CTYS*8+Ig30zwi|bNUff{Z$=6aWv%&v%rO` zrM3Th&ZBYR{T+*AyC3Qfr6)g1u-%}$f(!Lo$;U!FeKdr+E=b{bT*OujHCF+ZxhM`BW>QO12>Ew+hrkB<{D^{;?b;tzi>aX^9iCQ6>G-LWO z&azFr^O%B57&V19D_YH;o;criarKYFs9B723n!-}*rPz28~-s;^=Zy?WDs!+3Q~;i z5N%)Zv^$w&!w*v67j@-`^*MxV*GM7V1E(dG`V_0=-@SjeTzxJ96TPQg-`T{kdj<-1 zPT6_?_PyIs5N20od|D#Lh2R+DBk(!JzX-Tlcw@yShdEnUnMbrsBviA+E-URYv0-OW z-r@;7;XWfH&B8Jmz@E^!4FFAkkP*FmfU#=S>^1uK(~ti|mG&*HH`KYL`M>sv!*7wC z!+3h_5^SXhjq~@c2qS^Fn!(Sg%ZRKUsWYr%VLivKn#Mc5Ho(xTSbCf!E?86;=Y2lQk+US^vJvswVUx5Cy2mj79I_u!uEfM7ziQ{h)LsOi z#?Giob0AzJX>ZRf=cs;wKB9ecCwZ|QO%G!T zx`1#U8p)-5;JKvILTbEL6oTNZjW%U=4i*g%O*nT@1iqL%%#6SP9djudsa32C5!Cv; z+9gJ;Lvy|d|9yAk#1wclz^bPqw)1JV`?p*R)lTyjr!wldKWS1=o)CkT-BS*&ylgo> zPO~#si9P(wr&Y6eW`UX@5fTAkvrC98k@O-;HqN&28k^o*K1dJv<5X)s2%(8QLeYre?;~PVI zGtj&PtOJ%`dq-pJ`hnf8T2S~CXYl7!NVTXj6r_G2nv*$o>IFmrT>T3A zeK-~zzkKsc$7ngkmo>vHh?cj9{IIpz5#a+N!eooAj@ zPx6|sPefl0DJi2BX%pv!-UI%?I2_I(ZmeMV9Th%}!|5!@KmY1su4`!lj-}uCr7C#w ziPKWOYnktxGc)%Qoi)KLINOA__Zxtf|N2HKfUE^nf*XsvEK!0Tl`23>Mjkr0@rLnL z@YQI_p|&lYq+p*x1p|Gpftzu|)>e@Br2rQf4b9_1g0;eqa&1yEXjz;{)BLdLerm21(kn zLe7_(;h|Dw6>yWnqeo4}fD%B&U+fW7uMaXvv~3z59!_@IqcDE?KqjRY-q}KSO0yPm zjsxNr{43S0`V$$iYigo#AH6cuf32ZF6BZAMc5akC&P}V)nG36zNg_amDO%3Ax3!%} zZ9gMQP2`n@Tp)_hwq-^JxBY8YD~NS~Q0GnpQW$=x`@w)n$eEN&TNgGQc_u#{h%Ue5 zvGjw#c_LJ8^nc2>iGbeH`$)8H!hh`-fG#js2X@YP@=>=|_J+Xb?&Lrq$y(|f$NiBK z7i5>Z8cKPE>t>xV=408t`4$V^!2hc%&x1oK)kFZO)LoyJ4Dw0X-jhiLh~oi8EeH?$ z7B;30m+IwKL>(_maogkE^XVk7DgPI7(ZGmk+N@gy$repvkdg}<4kBNUKk4IfBX%){ zD=}O-7RP(=AOyArwg2k1Hs0OoY&?x7=bkxZFe2WurO@psoY9eya+Ov0uu|ZvvsAZz zi7gADjw;2=h-zoDkWjpOUVXhK6ncGsBTj)C)DzvOCB|uFY3X*B?djcMjbdLdUy~;` zoVKaS>xm&w+ZAu${&0j-b~e;3V4wF(ZN`)#ePrcz%&`xgyeiH6JktNYR{@>VT9xMU z+^uTAvM0qgZJBGZ2lU>02E3!Jtf4tg;Pp|=-1B((cG0t9_jlYn9!%aI0Cq*D#6e9d zosz_l^zT5dzxRlCRx4Wl)yoHaBjmkISMU`l@iQyy!&7PREE3x%pLR?Zm{QL&mPIG+ zCZpUBn#Tj$GMZ~(#*u)1XUhyS0cKE$n8FSFLg(}P_pQH4#!#dLjpidWi$4U~2)isE z&T@Cec+0D)oJ_6qt2q3aJT+|bn@f6yl244Cxpa;0)h`u$-stMB3KIj9f|fM@1$#=c z?^wTSjLVA~a^4y{P2XPz9qEW1Dcmoe8I#epd zF$D*fA;1G>*RzA^4Zdc#IrBo?cNWwaE;)+Z zPaOMEF7(=KC90x30gF>U!R*bCvur+mrFmpS)zNjoEn?<&6}w)cv&!_Oy=|ky)F9>h zF%Z3jMBQA;AVeT=QwQ^F!{B)<;So(^O zzw`U1t&U$miKG0$!HhhJ4%CLk0b*CL{63GfzbFX|iXmH-wlZ*cv7u_J1ZKq?W17!r z^*s+iPB!K z9~Ii~VZh)3ViGz17xtVCZ4J%&+Nz_+HraBf#cnZCp@-Oj5~v_N^N+0m`xEBv6$}wJ zXta;4uO}^TmPfRp!e=z$Pe$hBY$*N8!aC4Gv0gKEW5oHZIo;svB?9v*Eh#w~U_T!L zjVkmvsBE^-Rm*{7+s~e-rw+*vozZ-<`TODGC9nRs~$cRg2 z#G9^;`A=_To8QGp#7vM5SVUmjBTfN3ah-@)&v{~4W#+n{tCEsZ6i$Uk(9usGbh{v>Fkq%mq)F*x zT={8mgW%n90Nez+yTJzh$f`@Q7Eyo^m9bAvohYMeNPb^}-Rvlucaf`nxpFaBy6-ot zh=Ml;`Gk3zRty@DYy>W-?S)7cz4tMfV+5w54=i5hl_K?l@&mOn!8|MI!puYKE-hbJ z8G5dsje=8Pr2*v?A#hc5{u{xQz@xffr`k3j;k}P&mR(UZyWH$Si}t>%3Mn%n?0`&Q z5OzT0J=h~abmb5r2g??M3NGd9fe8ief&;c$5W%M~qPT+7^ED!c>(_8|wbxm^4+(EDe9*eQZ|a)81>WcldF}HCf~Lh-V!;8(R+>L*cc3BJq!IX&o-1 z!|Dm^6N-~w*AZ_tM5)#5!wo{n<1%C=qNh-G)U}%Vp^fzGqy4TicPrmUbif$8-j26% zV>fB*pu&+a3;9oo{r2s@0v}Q>OhrUQiqjH_^W-Aa3b4LVT8?Kh_*`cA6CvlRGx2|? zS`Ec7E5ZjwV9kubB#tNA!fwIeOcf23X@JLCU}`AC$B>k9t54ltk34V095I3S9=!hf z^B`Myb;O&2SS9lH{AvHL_FJUu-jTX}9xWr@A1K@AMZ15Pv^Nb>w`%1{@BPwEtCXS~ z?@>K>&^bLd65%QZvJ=KY=U^LLG`W!pc^9P|!p-`+Wd42f{-g<|D!ksIC$)0o2E=SZ zHBP%(wJr2Y2#Uj2v^p?jc?RDnE2`88o10-lY65_~7!}ehP(lvu$`d9579!a@Kdbfw zBW(}SsnE)G(bfcM=R-G#NXtJy?rgp!PD$En2?`BC+S+C6W<9OuzXZ;t142&%U0$nA z{HJ>YaD<%>j&V}~#q!U?oqXQUd}@;QAlDM`G1MwjPg|uC!L-hoFnc!seTwj-%!8YN zD}qP|AOaM?e6sn>lsVY7@NhW?!z^z+S74WDThx*g>tt2;>Oa3SuI=xUKQl6evGTel zIYE@UCeNq-GT2psM`X#2>jR#qd0oyf)Zh+1$?%Ax^1?F?N9t5>wDIe*!u(BwMl`5ya z5D+Y(l&-7jLQPqYX-l>V4TiyKiXU9(_ zp1n9V1K-S}3>5I)3rZYt)cZ)xSUn8v+t)pOcy-Ur-Qk1ta6^qAGNkY`!&A~(R{INcPzhr=)o^5!fcx~Kwov+wCk|P`QyEE z0=-j(b~*j4@3vhy785X6f5@r3ReH&$?8!T~F4~`)U)l3j?}v4@wd=QEemC#$K6+vV z9z1>Vdo%X#JtKeXowBj_ZVNZsPsV-Gf9i&Ax3}S~$|*(2z(vym4j|toz?;r9$Lp&4 zZmwK^>)2e@Uc-fURqL+oFxS^!X}z%{+Wc^=K1F6WE6yBrZ+Oyl`%A#&<)mQ#+!S8viuS z)jO`iN3)zmzLDR(jEc<-lYsVXxnt{gtFQOvo<9f$}B zGr~Yq4F4;qYU2S|Klgt36n0HAW8O6&j`h+PTBliOQ18TQ^!Yzt*>N6i3Rr*_<{iL5 z@(H$4%wZ`Ym1a9=F%t-qeOV-wIilTyN^C*+58J2B20UhUG9+#=8ehNy+1@}WB#}6> zt~t=>r)o7rz2OM}L9pSjo9%y}GPRQno?=EYQaz+fUd6V5oR4mTLp4T|xSL537~2vZ zSr&R`VeV>*2NWv{akt)9;qr*@$+Cc9OM~QFIRW0e6|9jOdFi#wDl9BHMHX>lA|43N z_OU|c!mp&6I*UzBrSN~GB035)rfnB=Us1!N*$C*lA9a9tAy@wv_v%~}?%(p);Whx1 zi!*?r-+<33Iw3#!gnfpEa!1KFC_A1U5c|JpkFgyJNhe>v@Gy}J1dn-m?Pz~(A{Q1g zLO}NxdICcE3D&Uq^Lp(rrEq~#-~+EOSF@Bd|I+PBiv!W-!c~BXyUbFq)R)F8aY1e< z&0Me+5W72A%BTJxZB>da(gq6G0YcTsQjXSt^s3Tjfl>g|^6nYI6ylP9S%h*Kh`RsG zggxp060caswCTH*LH&&D{#_|CD-KZ#mwLF^W=v#! z_wjPp6M;Ux+#Xb)9>kn2PGb#kzYP-s|J4Q+atEfmnzH3y?wAH>N0@3RJfxi+ZLNc< z`%q6MQ^!fWiztCEvaw4YDYn<$M8H7Z}|;* z_qj=DMN%@nA;K4_DwCH3LL7sw8>=7m$&ry9<0nW5kkY9SYpMZ+e~cSOJH$SNGTCxP zAi`)}s!8Gy4+?m`FCmmntzF{bRwJm!`csWk#u0{0Zz^`Ohg52V)Mt^eL&CLKgaN&u z-F#=MMkM569a}o|VXm@bp%N>hUjs`}6nX$*=OScTy}fo#brIJ!B_2;bZ7KKp_=w&J z6i5)gSv(slv5{>i@azVqOqruYww(|kbIB%2m>VPZ!sq8mkvcCo%cQ_V7yvhqv8I+{ z8G;bI`4lFC_Ub?q$rkbB&P7R!`y()CfekmWzw;z_s~6tj`9+Gb(_JF#HLTF)GIdx& zmx%Aa98>2zb&@L6b?$8eS~M`Jy6M=+MCAJt*#FGZ@gmXew)O)sI09NkW%u-cU|TZd zu136iTJmhvwy4e%38E_f$0IjPk10(8WC3!q_@P(Y>?Ti!K=Tst?Pi79xe8$d56K

#eaL`-Px|(N5S8u7U;xjZ(LJAX3tsBs&lO?c!fN%;4iJV>qu2O71oi8NBUS_7p^CJcK$Dx zefU{G8-Kj~HBwt=#=J#ubIO8KVUZ52BlX*`d?~5CRE?A*B_4j^4WD-2wrMr7THL6p ztj65e7IVsiQ(+xx*hn91eZgX4vDqP&iy#x)F#WkjH`sdfs@I7~o{W>f?!&8V*K^8( zQ(=(~t0VRM?@u-mV`C$vasf(D9e_~C$8$?QV(q;s?-?SsUPiZ`LqSPnVKtjEb8hRk zKu78q1>cd@^cri^iZ{v0Lx-WzXdxHbQB`>!dyikl;fqa3(+F|j_>oAC*P*`70wJ*@ zZ(Sj$EI1X`Nj8qiVLvX&CqI9?9WIF)Qk4*;l@+MC(g?Rm1*wRSRJ90ci3w1OV8sNaTzgMEgG5{;G}7oOh!~RxDg{4BS9@gdRht; zA~7zOmP4DGiZ@q(%oz{P1a+c~BXa23Q^ylyeI14k$O3o**zIB-Q<#6qv{ zjs}|nMdvO;<95M8+o4Iz#KILDIpe{ZpiZ=LL=L_1`ProO#6k4vk%^3+S=e>_H0rOI zam$dNh*2qVr06VqWa{CzIk9{9KK$XqM{(aHb2;O|nV^WI(}_wgf8$SN_l|FnoR*F> ztsF!8_r&Hew;?k<4ssFDXcI!;r#~vH8*uJIIW~Ot9j7cf71oJ%j<})My}Oe9^i3fM z_!u;(FZ!j)v3K7gl$Tc{H9-S?mJaGvJu2$mC@Cq!%JrK$Wx=Vih@;bq3cc~?JW_W4 z1RM?;x7;}aPdxh~YwLGjdznxah4~AYus?sZ`2%wF&|$n%u!d6>oC@niJ4f8m<9;)Q z2>1k9Ju*QF#OObCI3Az#M{48xjl@uY1<${Dbs=nCS3r*J-;4A=%x%$zl=+3xSZxq$57 ze-PQfxeaskUgeAjXM#G|&Ji=*>gCJHx|Id68Lz-c zgV7AJNQ{Y-Ct}u|ynll)_)l`;(61OcbQqpkz}*d96ns0D(9F9hkexesLd55xM@AX| zH;T(@pp?rItByfZQaqFjIn*jS%vL*+5;W-5GXv9~yZX|_R~uK5%cU2PmX-`-T{Rw9 zu!1uloC#`&eIu^xtMi^F`+wYy%BpHeRB8+x+7Ds@4_9jIu>bIBxZOPT>fIAp>I_gQ zWw`U!;pp8{kJ8c#@Le|a>Dv<%W?i4pzh3$fnex&G&UkPpDB|d~QK8r7Jxvb$xD{fV z9LLU-B4`|^sOUctFMAk zqC{5rL`-_(FVuleuaIFgqOV@H5lQEFTfXRZvhB0KBPk^j#TQE1ygh2va10te02G`k zJ%0{cckF>%77q#pE(++8mdIYp#3&^&o6JZ_PQ<8@*)Usd$bIhWmM$Dm*aU}Tvh9^Q z`<_Xpw!8>Zi3qhdHL%i7C{-~SJMK=TCdXmV&wKF8z7tTWVxW+U&|q^RJuMY{w++>` z257Y!BxqE)YvQet%H$aLz`u*U_UaaD|0wt%E%y1RACnIjzX*j?2vw{KZc77do9w7J zyOGjekFjHh&>;mE0rNYyA| zq6r*?52Xl@NJPjPJOG3GWg;yt5hWK&px5g#>EWyU_8+(Wm5j}u&nXK|g+&a-5EWUo z{2lV?-xk9~+_2IvWMp=SE+rnPj~<4}VuxLzM9$EGpb4<;yFD0?nTF!3dWeK#C?!Ch z(T;m2jza(5-O)|22XWE3WBLN>$Iq6NvG>ml3xlu-4bkplZ+`ob0i?3D7!s)%Mynl( ziSfwnmI70Q0Y+mJtTqRRjL1Pz*%efjlp?#g9%qWn!2^NCY6nj!!sKzIFlJN^raXFm zc>ng()nw8G&vMRzbAe%}7@`7;7A_! zppc4TcDUgre5h42+%a|}>{cs|o;ZUeXUh<)QUSCLZd((^jvj%#rc6ddqZM{jJ-X>L zFzLbh)aH*?5%7eV_V80-VGtIf?cl(9*H6}eNM3$n9%9u>h~WgE&jTSY$V3A0Bnl9L z6v>HN=+Y8VQGN+K_8f!JWCoA8*~N0p(0&+q+b~cEmOwa%V5nPl2 zl{E&$sN+ykZ2;{eaJiTofQORGYNV$mqqjZ<3Y8LNrKOm5??ha#HR8)}zK2RK#BIOL z#{9)=!)E`m3Fe$&8wEZ!Gnf4HpF7w?7r9sfr8XJeQWKz*OJOlJLL?HQw4?;!iI9-0 zgH$5MFMIaF$rEGjEhC}to(4m0H3s(4WA+PgQM3Lqg$(VRia);oURZ4(R^e@A!D+Y0 z9-Kk8ZQTkNZHGc8L3(#R8f&Ydk_y>;Z8TZYQ=bZ{kb;XZfk+}_k8T?+PWFZ_BSR0l zObie=at39ACsx4Pa0!VTB_=<{-5WR293SGcdGgUm$yfjQ3_?BysaOCWUjUocf)Uxh zK)ZPm!GYm9*%**L7*3}hb#-+puQH&#st#6*6-{OfoAYhvCXCF^!oY$3VQZ>|E+r0k zJ-IY&ju$q;A=*D|&F`BqmYgmsg4JdRA#MoZf>tB>1!9y62ptA!)Ji=026wMoMMHfM;HTa`g6!M3pRLgKNgBwc zA~c%qXfV?-+iCD99)toO1biM;v2hSe6&Nuh2kEH^xNx?J{Wfgzg%XG)awMjtLnP$k zeDMXy#6k@2mj#Ed37S|L6p2}Q=((#=g6k(NLb;w~u=2jzQb<01e+AB-IS#o@2BXyl z7a_3NoUqYOXjM{3!~!&$XaEE;atUH$)i62S5J{v^DI}nX8*tiCXE4HIr=inlA}K+O zlF~8=h!Z`#C4dr&k)Vmeze=jmr%xaB%1FY!PjL56J!6k3c&}A)@0j7FzM=>cRV)M) zP-wW1!Y(P;a!Lw*Cr4LJ@m2ClOFE(-fpi zHE5a!kI-;Boe=VX-dQ?mG+LBZ)S#iZ3fTkuK%1I@XY;u$_M+guz`yX!Gvw(0T~Nwp z;5(a8bg>eb3^q7jE(nDJINbyiA)j3U6anIuVraEmh!k;<$mFQ1se{d7gPZa4UR3L=3JHkt-=GoPZ3#hA&{vEsd}SFOID&6~d@ z^|dvyTTQ6ERD~Fo3bAT65|Y!9oBR8)FbIp#NPrtihvE8oCZab#6$UH&HVs8wNQ#x< zveC&dhFF<^_4*&r)->BOH#e7T*|LT0TUc0#>C>mTX5;H*wbeEgCQQKg?b}aa&pMQg9j0+lKzabcI{g7)Kfn1vq^ho^w26uoKo5>R;=xg z%cbYgWVInHQHh`bRU61|%^-u+p}Dxzv!8ox>1hz8td0SH zP0>(_M0S#)DjC2FnDKl;Xft>QIwQ{mzP`!IisuO>I9C-AI5uwlFEV@ftd{Dw=3L$$ z-`ut}@Qe_(T1^ZF11m37o3^G@pvXh=^YgJ}$&#Q#T7G^$S+iyhh7TXkju}c=;u3tz zFwcOWw{ST=SoIc;o;@GXUQ?$|C0~5;#dYc~Teb{&c>%vT!GdquE*S9F1hvVT+6A6b z_VD4uXlQ6?6=Y^+Cdtjs#i2uoA{M+ibdRSq%Kod?L~Z({kj$7FdcMxg%tUc zfa&XPxNC(S)~;O(9|a!C$;n}xYcv`>^w2|Wb?r$v% znIkh6<9#ikKn3tMz&CIR1w3P?@4x?^d+^MpckI{^D5Mb&AYUHuJi|xd0e?B(dt1rWGEC%Z`2@MA zZ|)W<_+S^5r(K7EXC~|`A2UW~LiLs{TblQ${&IW(S>v-0>SDs;63@XW$t9cvG-~ZRNQ$Rf{7F-PMiRfLYQLD&$g&d`*>eE z1S;-4;2HgVdHuD@+S`fzoyG<2Xk7;UHE7p?@Dyj>iy;tr@5y>9`q86Dv%3Z^!21jL zfxO<=>7l=Hf9>2ODEM6pe9N%zEBps4?gE78P7U>~6?mS{eTDp%N2h_pcMyB}u9xE( zjXhf|uS)xdQ0xmlvmI<@AIcf{V7%Tt}-1~TuDFXBI@~%5@@$3?q zBi0KSF0lIgIFe*f=zMIG0^ZKGwzKfSZ@B=nhTeu#r%s@*t{M)S2JLj>PcP=-t+$um zFi)?vcLRqYw{|{LMG%)h!EkTaJ9mD;2g=$0jLsOUprC+_6wJeTY|Eq8mRm(;%lGut zPcz4_%>A_Y0%#X_M!ql4x6v+CG+w=?ZTWbB1jx-d^l2HDLg{;Lur@nxn>z-zth#U` z4|vbM-E&XxnNppD2by-UuVgW=U>YsfE@jIurEECXk@o^vv3xbzy7hl>@#yYmRjMs6 z@F{@eG5=u#V6i)~;qM#R&x5$e4abyNnNjc|nEs;=HDzgA06@CB2Q%f^)?-4`20hcaSVf3w|ZWtv}bGt{;DEKyl@9N#6;JZ4(HtHV* z-$uiA^=?t{U7cVX^^byYqv5)GwkKNXER8K$D@zEKeH~KSQ)A6u zc48*mFx&G!V|>2Hd%XX_dmLZCjDwl`xtHs{mh(KXi8VIV=HWcT34uU(5IR?HKp@QE zugnm3R`3NWE*lMjjI1KAUNU=-`IoX9B)X772&HmfV~1UR>L_NNmv;*-^ws>YW=&r8 z0K&!4Xx!bf(B83hgDn&8Gt`)&+`rNjj&XI_(kIqB)y&#`Jg)vU+XIo8IRd-J31dIx zW@mHr>g!vOWe%;Ize$$Qp7BFbjK+|UgepQa44lCK{`~I_{O=C@f4KuEIowCtXft>C z6XlCiuX+m!A^W2@e4p#=EvKRteO9_?Eqq%XvHT#1qgnA(gxnELX;oXD~UBh+vds)bUiOw1p$UL5^g#8dV0Tk-nSf!5K{z$H={n*c-M0Q}u50j-&GSn$Dt ze+@5feJv<&qku~bcMJ-YzQS`T>4Kt4DG;6glNI+@a_Yx*Zd#SQKEOlCL1xEtf7@R7 zF&@jzQ-31`(J*0>o_SAfN9gVf$*aJ^rIm%J*HB&@t)*pCfTc`0T}<1Y*4? z@s&N#G@siB!K+XTa-%Ua$u|nX6UJLGMx8K*(;+!V2)9`O(`WWib|(^>AVs-~eQMY| zl~BQTOL2!Y!qct*N=m-R(b5?Kj6GHHKh|p)aBgdq>vTuvSm+&X)EBzR4k}6uh}b3~ z7&C7K6d}c;iy7{5pw8A#0jcX;)VA1@@P7dY&d<8ijxi*PaL^1f_sH@xi_VG?gQ@v% z$>*t%yd{EB#WD`aMoR21SStP#yjdD`ls@*{LfYLJro3rFh0S?+hD7WZ$wig$*&}_U z_xrA&3oCs%HIFUx`Hkc}sg~5uSRF<)g9|%=OI+a;a^MVe(*JBPkNM(Vo8dFXQY{!S zG-U8h@AMRW;Z3p4{jXxEtN*R!-WF1<^z{ZK~p9wyT@rCOWgmMKO&$P zoqEV4i;LM+bWD3x-DehN#GJ@{GC?){cSKF{#(5-FHSl&-nXHRwJ;l(}J1f1v+d`YT zlh8oylO}}>`k^)P9xN{z=nETXWx4usP|h{qb>&-rK}5KxiA!J4QiFwd{l>fe7=^Kr z=0QXfyCjEkSZa?CCdjdXGG!j$ia{EN2Y8xT3?EUev9bWC+d#6lMBA;2Ev+zVYfpS> z@8w1%@0-dYxmY^_6`CPcp&L4L!xYmLaa~2>T-90o{*|_}va)lVcqi+ei)Uj|F4kFj zPGc~Jr`<@oA;;=nQVS`_s}(T7W!C!^70t0&SFctvpY^o0bzkiI^*Gx*urjHU6D9uN zjwf3T7*}4!{c}IJG~Sg-TM6wkA*1HK=w<)v)OpV=LRSscqk8KfMPniqi@pC0rq#&; zjRw6Qfa@@0%HyTVBdX=)WB7Gt4g3vvJ*?F*R>P}7uR=Zq=h~Ln!@hm>w{yHoHx&m`fH%QHEfH8E*g-rq13jn|%>p9HP4>O0 zuDH3SInIKDk{=mf6}`gWk}|8KmRxzNI;gwwEFB>DW6G^jO>AyjF8a>6Nm!jZ5#+2U(=j_zF$hdd4`hNw_1uA`DkQBW}h zPYJP}8 zNLut6IV{-#y8_&?9l=Hg+aN=m4#)x>l9%H7!27M0|DXvt*WJUY6L>Iky4)Gj%~cKF zkbuC_*K?1OLO&;Hz7YTtIGx*Me<}Jwi7sQkM7hYE$)sVmb}O}ZS28w@~d}>j^-wgczB|AU;umB zJB=M2c>jIEs@{Ae=L8i+W+N0_?PuIsUYaFmoC|)Dhl3A2iaSD#`R|P?cPAx&DEMPe zB|%0KH+8XPd0yBn;`l99M4-WGb2T)=LF`(X_rQeUUAQAIIBkvgKy;&rn)<50b(;YCOxl!oxSZ;N%s4z30%O7(4scUS z&hL3{h@Y?_BQsNXZ&rM@oy#k>=^93|eG`B@x>OY6$q=uPm*C#iX4y$4Y^ocGKK^88x-7!$7> z%Z@s3gM`*h+pNm-hOHvhN~v0KLliVcQpAO^g>T*ao$xGaN;Fjr@7>LUz$91*t~tsH;oZ%=W#4JW6sEAmlf}I`!@QG}&F}%X z^q$yFj*(&u^H-|*9i`6?Yg{jX0^}I~d5w(MzX6L-=Aio+ti_B(SWcU9 zizHGg%&f>*BMqa`w|6K{!y|}4RtigC@pdfrN!WFz7OF3Viu=#5y6?_>msDEL{*y`YC zHm$n+Mo@g37>g?CSw@;RVUg|~xKn>z{*Vn1A8WZgUC zmgnGFY|9xXZyt^~)|&gNe3N{qxOwC3C43$uS?;>jaV2S4B9ZEy?7V0%q71o_yLXA+ z72GnQl-VdVIb2pAWaDA!QRK@N{OR^$HZklJ=Y7WiGDDtxuE$YMi=k|>3k;HvTnQ9X zg`}c*<=!&pEQXU3`Z&HNv4IUVX?j;G3aGT+*?_D1ZS>I=*{VAZ{q@UQ8X{h26N1AUavu8!lrnH8tD7JrT`FH+V+EWu^PLghAqdwQ( zI1Z^V6f`(o~uoJW#xLPaC0gpG^~NYY$EOc zSofR#XKVjSl&O^(YgpN^dR5~j>|j=F-%O<~#(X(s=ToVXMD->Movx-YNx z1A1iE`gL*S$BN4F%Br*88P>kz3_eO{6lG5RQ2SdP+%-im6^y9P4;E!qOMltJ#p;r{L=C+uO+BFesd^Yb)tTJfaqqcw=rL>5Ym}B zUHbC=6jJeb<;UFfvp$w)i4uYoik=&klU=ViQr}7YEH6D#TWHPjy~~Zh zhspLnilaOTmlR2c15U5h8FZQ)&dD4+a5^KQ;*7e9ycb{hnirgo01&$eUXX*QM zz?iZ0sFOUETl(|QwFs799Fn?b$0WZ$kGjm#bQq?`$qh6;%?030`$bhA@AIdX0xgn4 zy!Qk$ev|GPzu`I~#FO<>;7&Cs>l_4m{n za_g12GoK&1ADm2LFc+g|(rQYT41(^`5Hlmg*b~kW$Ni!LZmw8QJ<-0#UsWCU#?c1JOIhl|3l$a#mNdUt6<;JFJoZ$ZP-ALm| zriJn(JCu~(IlWIOYp+W*`WHE;`^&Nbna%Uznkfsvd->_h4Ro}VuYzTH4OBMY7+!j8 zKu+lCQFRJkFq7|9JtysY4a;F{F_b7RTM0IcHrOS=t9%X^Bh ze?dL>yHF^Xo(r@qAy7g;Sra*pTtHjPRZ}7W!*Y6h8`VP=rsYG7;qfK9<}0At^A=6l-E_6$^boWey*L#XYb0;~YQ<+&GaM1y5D2W9d3UGuh$}n-i;PZd1G|Zq|2o znQOha(5@<(&yxc z?*@=%g4X$Q6=dYC1EYbqOx7;=UH^uu~m;o^^+!?Vd7g9ixxDE_#y+SJD-=*hMOe#Bp8@;uG`q z2;5wvys;easogdo{)3;jI) z$g=W*KvGsgS*GXWXV8OkRlAwvh%@7uR#k|-GMj@;Z5!>l)@40*F^*BdYUQ)}#oLk}CJwl5~@2Abe-fHTs6w~+8ZN`C(k}WgYK__K7JhFN4XIq-* zMDPIi*%v|(E~45IEnO(;sWIZQvTSvQmbAy|8I+z)l45xCz2f0HNDsq*ciQWbJdmcJ zSl8ek1t53HDQlXpOM?;UTwr!i)wVNMhxH;j23S}}_&VWr1MO9MJxNoi)n%I0kvil(>&7)(L$gPYti? zDuB6M11Yqgl$T#R{QZX}0Q=mDa)A6TH?zl#46H}VkChpo(=v1aTJfX>*(dw4Z)WYj zl(;H($Xz=KS_4ZbZM1b8WVyy?FGDAJ@%M?VkaVWR|G*2f&`)<6hh2>95?Eb5TaB+- z&sq6Ou`m`N*OTVC~N zGAZ@`wz%qdFp4#lZMtDfgvZ1yQXD={8U12C;8+CbK)s~9ow-z3nGj&eV>cCGQvk+w zZIO2O7DgEr^@mgJs>H&xu1tj-My3jjUT& z+MO*^|Gw(^LO%2U@vs}VE=83>9DM`UmlIjjx`CO^Tc2(+2p-)jx5TDDdiA|@Ah7;S zJplh(%Og35dv*y`v=2SWim;c40))8dC9EuWf?2<$=H;_ktDHV3g(FIU_=rcz+X+hN zO{Sgjm1l9UXt_(xZTIi85(**wE%uazQIp#@S}{^dJw=wO-{l4ZHb6|Lx%!=dWc3Tj zG?yZ0L~8z7TQWDJ{(e?s_?8H0uj_q;b8i6)rOpUh18b76R*%U>%YY#%?3i3JGy- zHZL|u`7qvfxjZNk!O}iuXZ1rHZjTN24gu;?>Y8nZ3R*bB_X`NEV5d=D&v6Ps4ctLM z^st%orPb;Nbt5);N z>=cWJxBY&bqp*ae{(6&|0j58CRaO8;+79_&7vP@i%J#&v2}-?G4B?kqEaC;7gu}zz zOc1W005Z%rbug&zoSxOI@}RYa&On zYg9*>6M0lyG1@aclg@Stl4bq35cAtF%(<$vX79~&kGaApYB}F2ij&$q|j~VsPvka%xn8z zUU!N~!@((t-v&`W77u#%kcsRt7SsUOd)&okqsxLtJh}R@PtPiOv79`^B)JcX*Ug=0 z3BO~Cx9toxfH$k>Cl0}m)`xr?{J9qS)+>?`nPY#-cfrKhS_s?m@8VrH)WiMIe_2b= zbU3gobo$<1_mC8JlPC(%UzU7Q@;i>3{to4nG3zT>b-UY0o1XKK;lQ~7gNDl{@f>s4 z_qOik8C7nF?l4IIEBJxg8U_!+4?NR5BeXe}nd9IE`=y&<(ePT~M;3=4XM-f!W!*$u zDuZOrOBUq3I~+-T`0^>~0BwFEv&kTz(o3@G3yBmM zWBg%SAqRev_EyjpxS4WK+0>o*aXzdvU$hii$4h>c%l>ot+P}LI|%OJ}} z6h+u0LgvE7iYyLKw>N5|)g~8UGB*V-?;Tc$y;<_vLMjTjH1|uXBuiK-Tyn_*L;~XS zgy;EQhJrAK5kb^S!xNe|ZKT9;fcq>kHpYd{^F}V-qap6MN1Qr0-z)5a@%>AWi`Z3a zHttP39lHNxB36}0ny=Y89oAL%V|8Lg6FV7sT>9Fv+&#Yr`p~VPRo84qW|on>rNaK` z2pCAnO@-Kp%DEb0UDL1rI*eN>hk5FZzL zS?kHUvTkMoL_)O-7+ZKL<2n;%n|DY$mtf#RS;5mc9XO5um-5;tmx@s5ww#aNr z?>lNKe=_wyfK+g!zIsb`-nH~;FfqdhttZ?yT19Bu2VVXeHyN z4L{(F<`X#A-$rN}+!NA_AE+;@obU@EAi819qqbSrMNq=$9Iu`H&8kWB$TI>=2=LJJ zRINb^UIDYC($aw~yweyLuex7-6Lx#(wneXL)r=Cd;RNlId;&IhADqUTW<&$hZHM2# z$+0e40b@~I)qn;M^7>~mT|{8-ye$xZJwpw=n%fKl5hEX}s%?g`VFoVqy|}n~zF`Y} zp)V;FJhrz=-CbY9cc9xZ;OM@l<^g(jKXf8$EQFC|Zh2XAZm&yx{9_oS*SG)~8T*Rs5yHR^Zs? zCvT4+8eG^M8kkq}y+<6HVY{I>w_wOz+IG4>FtkRR+>kWM|L@B`*0qE(_u_MQUoNcW z;z9l#T-ZG53i%mZpK(t?+swBU*bdZFhi$+r#^_>dkVMtyLYikdiSl}zx8C*GpW7I0 zhDZ8e!W(X@p9!4XeCO0o`3Tnc#GYWt-clM{XgZ~A0BEEy5lt8{_Cks0NB9V`(n8dU@i7Qm zCW-Worh;{` zsI_>w+R5p@ASdMFQNA6kfeoqE@i>^Y9hx}@@Yh~Wp?d3u$Smn0FlhnW1;-rZ5RhyW z@bNFDs9iuX0+YBYil}j_=Gv$k+(4e@drN%GMlm!~_!!_P+frc2suCNo;l@7wFY;k` z&E2wPUR`#%UXbeDLNjobFzK+)y8j4!_%0XtPAhQL=7BRz)Q-Fx+ioa)`EDf8tj|H= z+R9e2ygwM(9DVnbQR zg(U%fncaonXRF6o*VNk=Oh+@0SLjlO)3Lkdj^OQGcm~+Sj;8v*1Y=%psg|#Ix=?Ln zJt5Q@-TY#+i5?EpGjDir0jZx@fL6arlcW|(P6FrOw^5I73qfQjaY)&v948s!RO~ow z!wJw6tw52@c|dpHp{nuC>TPvR2aEDCo~8y(c)+L7VR4PWy-T`=l81kA369Y!_gb~- z`zH?{m`pt_@&(QP#AUz@0Ks61W{;KcZ&U5^*op2;qne+`bne?OeZ8*@1$-@lT}S(J zE5lS>RCUi&Kpb3%f|Kr2n-GLR^W^`S*57@(gwBFvxtTn5h#&K~maC3AWkLNI_tK~y zPQZYS&Z|J1JMlC6PQBM=A-6`_MORZeS$9n$DY>9=TCr@yn%1clf%J#pqVx~&XGkq= zHkNjKXJd`}&R1e9&jlU3`iTw;YyVxH%n=c(p0K`3Fwyb55K^>7P%J$KFp{Dm9d#E} z1~cB^#!@zK{F|9{$c5^QU6o=*d$1i@U=~l-?-1Hw2r@9j$eFmE-Qz~gO=-QrfWhRa zLH|PC0uteFtXez7HeM%w2&hrH>*v$u^t4N~J~apB^5Q7+`=sj5{uJQJQ0iASC{mFZ6hh_Uy=ubcr?l z@~Mae>OXvKmj*9cOobueWu?B|nyYuK2AY1xJWx9GBS%n?^d;k=)_BUik5UWYEvQHK zd(PSqR>Rn+a2q?#SXj%4*xgpn*e`Nf>@O=S)tHerE4mG&`0U_FK$>r+bX%H-sO^b6 znZ9yQ{QlNN$?+=Q2Fotcv?M9&>DjwizD^xcjK35c?QloZ>xRQf^_z(GpDzZ`MR#`0 zDSb=-twI%@eu$c{zuO42H81CvYz%?RfL@i^gbDc8`>#yJEpb|>EN>XB+kiP^WW=wb zQ9sHTZj|Q1OKx8hn9+<)54DB^w<@Y0gE@@hdriJ0>0?&>}N!naM;mY13j>oPvSGVql6tmO;Y=t=_& zcC+FQxTOB&X=sV8eir&%7vk?DcL){($RMOq-xYz4iR8k^`P7L6>-PfjN$Sw4 zseW+Ho=p_FWjEbKLv1UC1cZMIZ zcN+-s+8X%hwp+V196W4of+6JPTaenM=i7xfAil;WZHs!!On^l5*|Z9QpLY&ATVk<| zrCji0ci&0#l8M0?j9B&s@i)~dvEYkd-r7%Yud;FMjLl~y6*0a{+B}Zv6ZAgao|oNE z-Qw0`zlUz8SNauQHv@LpDj6e|99=O`Jc;r-Vi(V*B=rT?@mE~JC1E3ytVA+_&#@J? z@w3cZ|3kBs$$GOiCDlS3S9Hs_8$v!#oRR(68KIFHIk%Z$J?a(5TP$Fk_QqP=uBKN! zDX;7G9>X2)BL79EKd86yk$Qp^artYcTdL5m2wU{-$W1=4d$;ar((;;8NFl6AURlI{ z;Jet^()%DEnlq)`?)RmY0+qNM5Vyi(c(->-(JFZ8u zSg~MyuNQKKq8>C3ibto7PwZe6Or`J^JYE~=v%Rl&Y<1{}NaLkTK!TKQ;;%P81BdPi zaFP3;8CqocZTwaM|TKy*SL1egNcbJ7cU8 zUChMcLCl~_t(t?ikUlG&FZw3!`UAti^Xmcw5+9 z5$}1yMz40+!kqJZ*rn?RE3$zb7n~dA;L|m7-3{Zd3+*DTRK$|Pu?G($ZseYFHEH6E zbm&Iei{rI#o;^&bhB|VfI|?0}%Q>dxT;v@Fq;W6W{8cqbO)n1*9}4vPVva;Slx|m_ zpgz7lFjGMpXR^v6pY5a$_Iw{`HBaolvX>gfeLbJqJLw5CjtC?TE z4){RnhBy#%z}Y2U|G??!IynT=#Wjtnsj^+dS5OM@rjL*2BY7yB9#?XZ73IK!%UB5h zQ&s`X(dFw8Yc`S$t2=c5O>@rTr~gOWr$)`*_;(9TG(gU5uD(g~pNl(>XO$SOVg~|)wD~a4peI>L z<6xO*_Uw!}oCgT;!t@V-IKlR4eEf;CY%SIK8zq4g5z=2hH_bsHwoxlQAj}P6m07+- z9OEKxRb9)nFLlp%MMIw1wRl@b9)>WTcFK2kZ?^0I-aI44skFfagr^Jb2&3(Sr_|q0 z_HbKE*I@Piwpy1_AT32w;y@`l@-ya_aMBsjJOOU zQ;r$A=pQJ&1by%!^&Q;GjM0JZTb~+FZ3R{(jGM7dVw7_95>@dbhZa0R5a$OdMK~X% zHX5Qq&4Re4RyI1&xF1j-PZ0`Ubc{-E(!4<3&0{NC& zj4FqPA72U;x_FR&LOS24kYob{u7g=}I0fg1fo_tVzKt!f+O9oFYj|(>>Gg~Cka$8I za(7t=RE7?|dfN>cSR#j4W`dF{moJXXHh-KjQ9-2d#0stb`{@3kimmCs1xWc+P8_l4 zm%Nbh8w^DCAKbcd0=CzmWYRN`-q?2ZDH&HSUW7kk%9Y4jn!g?210r_!f^SJ!dHFU}sGmL^XQbQYufK>JE)obfC{ zAs}?lS1C0wIDL>plhO+?+ay~a?fEncKe@<gwp%d}P7Eo|Bziirs!QIan9@|sZ zq6OU{4i7%qV;vrd_5Uettd?iD$zG`sSLP?X#WWawOJc@H0~wPSAB%#@5v#>gYI{?h z>pa^_alZPHOG|CPoUQL?+lZh4Al1t3Q`n1Y@t#q1Dnh(eiSnp zh#?1ZFzZOe6N^-u#=kXav;}GQ13HP8yT$Nf-u7E?x_Pu24rhx1b5-g_XEO-If2@XF z{8(j=z2Krm`nqsJs^p$HM-Id%u=p*vAHcDa~P^U7*k>Ik+EQ?ih*0<|3^r0_{?r3Y^Fj0U%Ve9}R7W=$n}5bl_VY|jSFt$w6jLuGK|odgNC`kaQz*hLG7DC$0E+-46K*4{ z?^#)o8$eL%i;O2m1Nh%WwMlI~Y<7qcW5k&L2Q|r+>de-wTDJ4&E-!0fR0iNRcZ>HY zl!fLv6miOwngiSEJF*!wQ#3xaMnx&8BjLNZI37KTJ}js+B)8Oa*7Nry`QLcXq}~)B(UL9Zjl@CcLRu)DzugOUVB%-WI&Yni;2lNYnQ~G-H@v>TtBC za7n(Thw-yWDLv4&*9R9B+1pzW)SdBS5II{0)ADI<@h)EwChIk=io=P!Xjp#+bYbUu zb&!4;u?@F?Ii`GX<57q*1Z_A>w2? zjx2iLp2r={hApNMYb0!v(&2c$bcdM%5wEsbSpri;zkue2mU7E~kH7IK-Rp4ZRl33n zqRRiipc;KeUoztv|InngGT-ipUW!Ouo62sCLKdaj?2PGgfokaX$g|f$2(?*1pMb zm4%wq?IFBv))^I11jiE!<1q>qOfB;1bQ--d$THtOnjZR<3&U+oG=ykY)E9)b$ zlu_rht<(Flmx&C)u3)YL257gMiNR;3Z8PFLe~K+rX)1F2(v_ae@-@?#pj{fp_%)dH zfGygDb%M~0&jWnDVo&-{VoojL8vAgvWB#Xf&6K7?5k@e|CCW_(T&D+Rw?O}sqz&>9 z#xTGv7mI}MmD!TbSJKfS2ZSvqR6$EHJ;OORR5J=GnnY>wwUDRePAO>EnRqvRTv_J3 z`ls^Pmp^Qjs)GzbNBHkj<7Zk=k6VHvkdv*9>9h(?9ugyAd6L7&`E>yp+i2{OW$K?H zh?w`F@Xo|^;B4UYRG7L+#upT6a;9sLMuT{~ptL6A-B@61Q^nDC_U1qZw478N69 z8ewmtaBrz2c^moKBNB+xuluK(WfK`@UBEB7Iu!lFE%nr4c#TpasBK#T!|xG6ytVls z2;9p!T^QuY!564$?(y{<-q zq2{CvBi7%Vswrd2Cnyh^wo~)wi(XBtDHqNcSry0`j*p$)`3cG46_RM4qEv5`r!Yx**E94C^QJgj<%p1L`bVJ(k)M5*rx z1FaI%m61STe#YhOTT|x)hWi#lB4jwh%K$bFjq%YE%eI0VI*XNuN!J=sakXWY4Yc7!7Gl`k-#TA{O zuZ_l4C=tkw3?&LVVmha?2ObEMaN#4)$e!|Pfj_|nQ6?iXrCFAVTVsb0E%b&(%eDG~ z6zuTY^4#|qR;ylr*)V&RP{4wT9!SwxxsAN4m=V`Dn}#-Lm8n0tcPAC5g;TQ)v;{$- zgY&$^xar{;F^5brZVy_g0MGOfg#>p#qN|!+dRk@BkHMNL=rYJx)NgcnxJ#!;KHdk@PQM>AVs6Jyk4bPh z+jg!*<7i?Wl}o3ZRW-HwzyjEzqI6H6kid&=8^*Cw`)breL~65a3A5F)(P(u<9onv@ zVRU5erQ?-#dp=;wq}*jnc-+u?z=W@u6VK)najHKJY2mD6FCn|xs>)y@&-LgEy_U+n zJ+?cMj9`7vN%nu%(O$@@!{?Kh4OR4igo7Oc31#xj z#IFUZ!XCf2@zp3FeE5Ued=ox*7N1GjeHOs}Km3k1ruJq0H(D|AYAgTNwr<}feE~oSTyI~L{cUOwu{=?hK&3S^+ zFc?#FTKU$7|C~BBcV8|zsh0pxK<;$)A4tx>OoKlLPkzMKCXBu4{aMW7s%K3_b)HPiJRT#84K{;wwCFbqh6uQk72dm(uYNAM#ohqwGX4V^>NC z^T60f90R3#@&p-8te8EB+Tk#6n^W*DDs;h% z$E!j3J?8_NBz<GE`**fm1kEv}3J#eRW_m&UyggIjdp%T%2^a#~TM1w_jDUAA zOCYzXo_fR_$8D9qO^JvRJVxeBP5)3`N~AIJQ(LgXP^nj09DLH-ea+ zw{b+AObUGsM|0e1PUN^453_x-6m-8a$3VRGX82A{xp~s}(w-#{X8|K)$zBInN?1no zrwW+7{78MoM|zgboe*p|2gE3KmMSEBY#~Q(Uz1{NPDM0Qbg>3sMe7esj2wRd?U!-= z)oZWmd2oSr?K0++@*^@qDZF>8BN+g5zCxu)gu&q`AYFvIz`@!K>JR_x`%+##o*_4u z3Wk?GeF!Lg1ar*xaRmT4YrPA+)_3ZzL06~P8;hr~KlmL^wd<^&;P(2p8{Ol7#xwu& z{v*H5=s0s#z&qd1V)CiE$3@;zzJF&QMkz#^}btaEr0!xsG;zl%CW8c{%btSfj2RO% z69DGYG~|WW4!Y8l*&I5T(if_+x!-_0o6L^4prkP+Y=QFy51FJ32oR`+D_d~iGs`Ie z+_ZTPXe(3pv_?&3&j1lp`=!)^j`N2cIAUBuYFid!*I~x-w?x>HIVO<;wv*utlp2Ge zLu__cgTTpidTRZZTV8D-nFBUvoRjYzrp1PZ$+IM|k0K%+*-LB0QRgKiee;XJwqNIl zYanb3LVBwb7ih{jx`;=ebvRIwQb0y{)?#d&tq%lCkO)tNJ|ALE411ukw4g9tqJO}M|Ew%OAx;c{62R3H=WO{y5QZt9nq}m;_fk``YDWMfXkdC3b7>)?oYY5UpQn#cCa-zaoKuA3G}9MrhP+ z!WeT|S?@~VSS6zeC{eLoyzpjcn6%g2q_5Y$^eu7a`_3(rIwUOBiwy#(egF#?lI(K- zfx$y~Gc45cF||p`lmp+C7lW4QHj^{E1F+Mf@!6}70ua%_trwY7q=>ziYTxTBr+e*| zkUwJGP_HV-|JuI*e${h)p`;SZ#-NFMluJRqXt@&M2RU8?W)<)49%(HSrFbr~4wELq zc0JtV_~XRwP5W{uOUfX}!QrfHUE+|>V(HTj?5zP84&sH=*MV#4oTya&H=n)xPKEDc z=nmlJA!OH1RL|MEo*vvu7z=)|ue2)oUV*HNzUgFjwy5QChYApuVOLf6!Wdgv)Z z(gIGITF~Zb;9cHN$YCJ}71KLp6eC(MA!`J^2kn`f4;6vk(BKIu{3P(@ z((8GLus5s}N)jP>q!_~*CVwMyI!DOU@z3f5;|j;eP;>Y5lRf(ZRQuH>-7M8=c*UoX&%8St&bUP(XFuou6z6oFg8OaR1 zWcP-E&=M1asoW%p?IhF3yj}t8)l-vRN7-kAWoTw~x znW%`I%{tN=3lGlmx8F)TxvT9v=!OOR8EH;ySd zRM;p6ww@)E-`2`?qgR~0=F0cfp7qj8`8p7N`ibUBmQaVmr&K+Xg^(SOTw#=^_ii~) zT&*D_{ox}fu~SV{dmt~5?HT$@CxMB{giA;W_$3wsdnVEIrpN==o(u0e*+u4}AE0yZ zKsDj+4=BoYuZap}sq_<#WTm|JYm|q$r~cwkd_?ivgGf-82f3+WE40cH+jaQ%O=Rpe zbnZ3+%%!Vn%~03DR+<<=t=K*5(HgwAMcQkD4()`OP~Ux`w?D zme_hiu*D5&+}*2Z_ZIr@P3$JAVmZO`4$V^i+mW^>c92F`4TQoqMu$6lCi8!|dh&*M3NIp;j*ocp@3>$Vx+??7a}jDV3*&XgsqN&1;gSq8HA)(! z(vEG6h+gxLvc^Kv%oWk~Xu@Tz1^pw9*L^MnNd0YQ2My(lY--lvu`F1~^&}(ScU9ZG zj7_4j7AP3+k z2{Y0CSdRtfr_4SS_;Mx^ewzA(w78*OfAc;b>)bu+j)a)cA1ot88Q02r3T~Y^9ecOg zirK&flM`FAE1Yeg6Tbe{yUH}8$d+r{M*gxPeHE|*BG43)L+rZhuI2Gry=iFqMe&!Bwfqvl^OYC%Py;!SHo z0E(QgYFDO{O-7z=?m2jWxSDRE0IA1JAm!vO5fi~c_?@z1%xtR+n7?xBt(^w>-zzy4t|w356UI;LG{{j~0GWh7@4? zMG#7pV6eX%vYyVXRNUWSC`)N&JmI(B3Q$s{+eqc^h5h(B! z`<#}sgBn%PFWBby;2&xh3*%BBE&CQ}R}OA*DnvA6nX9gZS)C8jaD~rA$R4ucWX!wY z(!@pD4qC)7=bg=~j1v@2_cs8Iz-7g}5EpqF&k%22v5ZP(eDBKToy|;HFRmmq42E+b zj!^CB-ZgZ`2%mC(3adf$KHLCv+qL7FBbzn;$nrJ@I{@j=@QWMZaXx_0lbN5pOV5(y z^8O!740bSnPi~DOaLokf^p<$^YJ)lsE^Y|2>X%<19@*uvqXng^Arb_|%fTvajAuP3 zIoJd@J;yTf)RcV-lNgyT&V1Pzap*fsg#=^FBnlnKv`HQ+tLh2*Z^8dnng8b^tfOk1 zu+cQchm@O~Pz|KCn|aZ9DpW#Y28kv@;uPrr3pL*fgq%6_nMo6Uho61$)6VDMcw_*6 zX^_$i>1(b>{JYv{aU|2OEt3f?y{PPhTf&gsD-uSS(UrRmNBiK5z@9)wZJkf9NQ?uj zWYv#gys^!4b*Z#|B45(!HUw_34kW!1va`Hspc=qvC($r3myvSS8H``GFn^^= zn}ZF|gN;3P;A6tMag@2gHZSBaB_0bV3lqYNV&jAxRV)!J(QQ^FzU+&)#GpT%@H)** zgmDL+z1LQd_B4dxWGYN%g;1`Lvnz8ANqQ3nTupX^&!+kVfbvdj_`A_jNOkKf52Pf_ z=%jz}BNM0^3Tx-g8wwVP%vcQ_HUGXl0hCV6L)AOV09>1VlX3m2q|-np$wCWTj+*#y zbd}zavO<}kP7>j#+)%qHlvYH^qQNZ8-7I^h2J53Z#k@%u2-qAuW;gLHT;d>)NHl=4 zml-X^sVvoCC0|V;&7HKp;F(S-2L?i{y6|!jnE8s(I%hCm~+$S2pAe1xe9mwauos8@0t&GROI~@tp2vPoMlMA~vu*tRlh~^D1}UVpz~im6v0=tlMaIEFuTU!y0esa0{_tO!2S3>opa-urdvIql%(dMD1G*fwYo^?P8Ep&*GGf=v z?@s=|lHH?HA{8KfmDz*i(y^eyT3^0l!-S;WF@2V3%(>8mo$$^FY+#pa_DTl?G{D6T z`Y;EZmzfN~CqNKEeghbmelHeKbHt3Y-#loJ4ExggO`Y>}a+wDxGUG@cyQKocP1B1Mu^DKx5ua2nV1tG4nledyAH4rQ`2lQW4&q zIs_$7W?6=B!w$Nehc8^HGg$1@3Bln$$#uipazZ9(jqS}p_do?vqvg7O$rA=q_N4`v(8vds=e&hk=rrz4Z>~4jP zV(G)o{IQHJEDZvSf91M?BS3AGaYM0L$pLNnxO!vw3lOIck1m<>;=Zc!z&lf6pfr$) zhLagfI?ki3VPm|cjAjh{H~=Pgv(Wv8sBJyjWfcu|ESy=P1NLbHkTupT-V}6;6#t6P zIZ_TW{U=tManj5lR`a3SGW@LSsh_<{X=Fec>Z=9{*8V#!csk33o^mh=9P+!U(aeyJ zyL0JR(`Z;j(UHO!n7s?my1xovV4Ug99qYWPwoGAR?IjQecn8|R%JW*+xn&SaXrL9Q z!)Bvd*-Q1eTy1P+6L#;gWnBOPLFLv*RVH7F?ul&-N9M@2XGvz@c> z&!1S-InpqB>m*p<{vF=^^D6{9eiN39_-T*6Tm9eq8kB8iKHg?>^5_8GPj)*#%;qp# zo1LKV3+d+h#U}J#iPsZF+hc&H9*!+QaTe)Co|d3HB3#+)YWq2}q**SKryq{mYm=WW+jvV!v}vn!scX>t&m+VJ#lk>i~Agl zl#miNNbLWYh1}vw8SA+S5XUdy0C9;fg^L5?X}X9yJs2xc+E zKoRG0T-x2Sucxtx2kt^|ZN~7k)THuUT`YB?K=l#(r8HVP)w4Y`H7ZQc;|6D zTF(kWjGcA%q&LgYBAnTQ$C`We_e$v4(z8|cbvw$&T{P|i%Ks@VPURs`A zd#Sv*)IOgclrfgwSnLV%V9_k5t>FD>=YgLFFz30fjyZ&pJ!}Jz4y(nUNv6n8MAbq#@ z9vce!t+jpTq7jFm54fYG`>m0NwM4`#Tt9p_gSq_l zF@gG>7zvar555k45(0%a(5Pjer0uTgRV)v4 z(jQk#hSe!Pp=YgGl|rk8m!^~0e8pymYz*oAcX02gsUqAL4U%9xB0(++D#}4}+Mm!2Q`ztfi1OZv|srUE8|0 zdX7a^pkkP^3Y*Eph74~4oJT=d5*1^avI=*BO)}P5qxnrD1g^FV&gi%te{c#GWSsx9 zDN5FgKodnt2FvYKctji=yWDTEfIBfx4B3DdkNy|+vCJDA>E?lc?weT7lo{w05 z^zhetc3kO(U?(_H0NR_gVl&v->CD*>j$-HnM^BiNU6CE$RsN*H;kOwi*b$&+AoRr= zf@?9XVsW=bUsK2b?5t24( AHHYz^G-c8H&yK*KeiT-}$Q~aMJa*Iglab>~(M_wp z9wKB|ntx^aHj)h%WRCOb>JUvupd@~WTv-Gf8e}V{XQQnZ9cSwm-NBKiHC5e#ePV+a za@(v$Z$cd_QRhI1#<3*RNb*O=N65*WhVC$hnIfF|ces6Pt zMZx0?|I|hQLY9wLhLtt6t5vr~;B6}WEQ4>4<$FtT2G4HzPV8Kx=V2 zM|gyJ!|lABT^s9==e^q2Hcu_LbKBRP`};fGvxyaC$PThc8NW@0YLw}qDV_WZl9PG& z)~Pcs3b+}2acy~ypU{IoY!Y^0%&EBK~_{ z1=>3B(<`WUUdfWXm9^Th(o@yWLLe^d4P24<0}|ed_~2${=ERO8*|fE4yX@C z<-99}{)>-*xxmXiGbrOKNNuy%Sj`?DXefnbx8J{jkxUCIIfkRf(>`!*!bBPLV6CPs zBad66tmMRc)Fsch`!uW+^Bi=ik`H=#F)tS;gf8s2hVBEWO~*mtwCVArRAU{M+{HMx zP92qXZy}!(rkI5%?@criZ1y)Pek~I-#J&#qFj1l@^%58>#Q}ZZR|LsiH!9VTC&NFQ zuaV$uY$`<1P4v&R5V-iGLkbYjvHRbifUa;vKh8b9tggU(TkBkw;A_ytLdRR~iO)H- zWVc}`e{w6lN9(OVwFSlJc8{^*%E{WhO^ut99`HaJ;*$j|!9SMfKG=Yh=Hq%c+P#TR zjTS=j(Vsf3(6t?mWqtM4Ddhd|1O%?Cqnzap)wE`a&v9@7cw#&%{W>-MaStn$z+C@V zMXE_CwM=>oxNHy^H-N$h9G64vUnf~3Y0Y&yaqg^gEF91wE~iy6?48p6yCBd6Z$MK9 z(wdEd^*H!%thzUJuNl(+w`U!q7a>)=t6imMzF0;RJoFRwEu8&h=|e$@aM9)m=Aw`_ zWJ&+FJ{|eY)>Q-FE`YPnG%tMgcTSufm;#v%)6lub%Q#W{LfKxSvz^YNMYo0#5?c|m%njQm~pM2akUEIqN ze^&6-r5$9POF9qs@53!X(74uKR5iln`6rnlz3+xX^mjAldHUM9V=VFFkm`+UM8QMv zVGb3w{sp+i<3we~ z28Ld~#(+SXSAu>=9>aC4EYI|uBKn;IsgRS*8$|F@%!9$jqwBK7f%&Ip9=i^rn+ZZq z#d|;!s_xZ@^@pXaElhJvXtxmKCHnPXm<4<+(AQmq5J1VP{62ZPlCjJRVCXr9957-0J&S7#bx4sWZDiIfUs$4CQtt74cmv zJiH)=!|U4KDj9Q@#fdNuD$Z>eZEi-1J{*^d9uUW*&UXU6b!~G5;pNc*HU5Gz{QySm zAU7NmXI6O>ySIvC^<4u`H;bt!Xoz#P$t|t%H$kEw`E}f!_c3NLoCQF})y(2OWsS2@HF;ByPhwyV_*Cbw}Q($uEQBJ7fIHM0g z9FuitWQ|Ng9DffDfJzQtaU~B8$lR4NJz`4_^HT^jVP$4SU-M)AN^oj^YB1!>j8uMA z3OFJlsbh~oB5k`s5b-)_!bJM0a%&*2QmPB@ zk>ZjU9Q$e#5zEZ^m|q51tt_8CFknwm&s!y{v9&V{$ASC|SQ74i2~lifdfX}o5L1kG z6)H%}uz`QDAtjS9>ootL3>@7}UiotM(SiYl+`r`5du*&8?dV1lN-prccz?=e9sPe3 zaaLi+=$^L{fgWsWVvNVuXAfZbaz%aWZiLHnCDF?0+aR^^PuBgLCLhLk_0lt(s)781 z@AWFdpbDNvv3!m+>DEEXYqF&@8y}=tFg5Vf=PhZ)&I?bSLWcR zTthtVd|x}>2|b)teRwv*WN&unx)!;XRceJ(<{k=Qa@K53Bieq<6UVR7@MNDV7n5%cA_36vtV@{lb4(&|p; zNe?QL7p7bjqX@kw!H;r#q)#M^&;}FG+;@}{g||-1a#i#3bwzh-GHTI8}T#*#njdB`xib_6r!B*zTidDYC#66P>&b?D-oGiZ7 zvUa~8VX2sZqKt_6cXFEeshxz`f!@tTC z*+ve7C-zW$YE5S0o8wqgA>85(hpQyAZ9RBlyQKpHsIcX=%YBN9USR)iRd=j&Z) z{j{e!n7M53Gj{XYc!1Z7AM!lmxDC@CZ)-ewXvKG(Czg$l|EH#&#pv~n5>?XmVNPJI zq2f9W4ae@f94F=7<;A;Yo6e?RsSU9PvZfuY={b|^nkfYgZE&L(frZvLsYaFA6KK>0 zK&UI&<5MZBe0O0T&jy zvGbf;4+krt#|}pq4v}hOosCBVYj7^RxIz+rBtu$G=Gz6LN-oMY`zOmuL9q`K!IAy>N+kFxEv zpey@Gp=^=htvZ*x8dCroCY39s3o zU86>{*2svTW-fcp4e^)eN*4^p-9UVXcAtjWYFL%d^6H-*+XXoeF6@ZECUSC@I`^Df zxhC=>&uxlR6!NMS596#byTV$=p6)zflRJK{KJQN-oUrFEhK79%V02M|^`N(Iw;Ki* zm+m*i0I$C7RH2!FZV@=N!HVhoAgu62jR^sMZpsl$3&ep0@^hLt^op&Pl`?ec<}g$# ze9iMTxa+h_^n)f@b+7e%-IKu*cqo~XpmScOxWhi3C7W0Ye*YhMyL4j*k_xC>LDwa1 z>VPzpMMgIED)}6U6o7u$f9A`37HpRCY&)K2Iz4&^L-)$)u7-uwM%YMGv@(+y&W3JX z&9+8II3>PwtW<4;0L4(H@mPUa!}(>78OYsZe_iD$#Rb-TGKrY|7PRYEnuGB68Y(@ z6idL`k(sz;zCQ8#Vjc{PR?9G6a}2rYB^4^Shu|60RU(NL!%hXd_5erQA06zplPRI6 zAt9H@_ovfwK(ouHU!edB2Ry+aF3>bTd^6Yn%_8KNR=r$%tYOFNV*>P|>JgWR+$_>CO}mz;!t_&AZj`LNfDv9{g{z8Z^Me{dw)Ti{AvlR_-)g<>Om_ z3$&_2AGk??$t}w=r-q=t$kmi`yil$%k)9i)HnZuSzKwX1nkrm!|9H}6YXtUh6XCErN@AdCb#f`)Od$qMzU7M7 z`(ITHF*D2VhJ7@fftI~$$>L;sE+E-*e!}T9^D@G5VEsD(VV)Q#z6T68qhO5wELMVY zWdnPhGJv%OSyE77hBSy;nroRp!%4~$)OG)5#aGESliJwj5b^T?nLm>g<00upmCt-f5yD8ikwr}0`=gR?;w-Z63E34F(h_Hi4X zO;?oEP60I)T|5&wvCH%#uWv^74zKO>3iQDnBklH}2-YvZgdK9qjNNbBNM{P=xPqO0 zc*AK9WBq=e%@&TD8VC1zobi)j@7!9%0;&)w84T^}&8p677lS&gBfM(GfTx_=jKSMt zK)+@`fPPsa!Vy< zVh#on-lBM}y>_O7!SF8C7;q0qTTncRUd9Auyny?u!|eMtttAKGiTbOdRPov;sFzVl zLubxSXXsZqZifuBSXcTUeGUB<#-97pt;CWR#s*LA8Ko_Lu#w#;`m3Zc9Ej6S8Y15O zzn;I{LZj<`h=of&J9`_W%79I=``ct~t_jhvhjyE=W#G{qC0*4V6uQP)hePZP<#0X| zw+(eC0eP@Gxco0852nFRqu#<^gtU3mBE*?8gw#6TdGL8+z+rt~)0V!-A+Gmb(tkjw zHFl;I?7%!DY6F}3(Nn%Z$X>uwND9Ht41AA+t8&q<;iL;git_2&lJ&wT#|^8Y_tx(h zA*vb~(5=AG5O=FK;t$oAClItUgVU1b3-|d^eqw3;) zd?PvsmmF|%;et39Cq*!G>4lI8jg1m$(q_!#K%$=~=byJ82DYqh82+%VbD@XbSOl2x z>XwY!LJ!_$WSW->GJMp{<1N_qhkgU!2^8OKpAI$Fd7Ei^CjM*T&-(CkY66h3&DGzy zj7PMq3!EB3m=^Ooo3w5|ewMaVVyz+^kWbZ}Rx-9ueQlk%QaIs*8J8;gTUoE zb=d^hRJ=C@AFVR?G~Qy0|~dqhXX!$@xe9ByEeT=c&TL%F>b44;4*s3Cw?yIlizA)&fx6L0DVB&4 z;Zb=uBfJb)1Zu7?ktjFosL%A(CO&L_dDGc`_3sGebQhp`cI>;wYGiFg%tljP@DPYR z=y}oqq=S4u?04d`TQ?h`kK>I4%V_MO-r7^C>cHGG zzZ77400Hdzwx5)q$`cHH!~e@r(JhWT482-P1?ZcGmXBxIv7b>pxIX`mmkKGK4;eRn zEJ-(8qALfVlz+Iv9#5oByrPf0U-8RBiMrux%>h4jr%#@dM(lIJ=Yqp$V{X_NZdGP} zi$j!LL3kq#gK@PxQ@Y={@5+0ll3adfJHHX?F;yiOBWT%cANckvr%T-vH{x&zDSod0 ze?$$}?5~Q-XvY7G*fZz>+XJMp#ZWFy3MajmHXVkn!v_+@>C%k6ka9r@Hx{WoCD)$R z?32XnirPDo+XI2eeQn6@pHj^kCilLcPiKQlA@*j>9&j?h&d)`Y-!7Ly?MO7SBQ7=B z+90``auXZLvYp$?o`2@TQ`RJdGk#8n)eL+AxlO$T%c^w|O6ach_VCKs3tBA!Gw{}P zt)05k_d83-BF=q9uk-DdE1y%w9G?!to5W&L3~?Vh@U(EiNX`LUY%*cK-mUH3CU~L5 zwSW8p1`nLmx8-j<5G4`Ia^K=+2HsmR`GSU%=O&vAV(=;#X$9g6|jZSHJLkNwxHbK{1_R}0cWN(-Dcvvj>? zJBM7ncU#1HT78I_4?}73{Q|f#-OLi84nXi}w--ShIDD>NPMvQ8a7g&MaD@yMqgQQ{$!)C?G>dYvduL8<1;@p7I382xDa&O@_S=leEIZ@?53F_`q(H(SFAg~h!LdvGkZ}KkhO`xtEsc92^SwOz-FaVhjS|QRd{{t$k zXr4aUKen{8%wuE@>gCbpkw6+q_k02NV8!sA$}FjE{$#d`=03g(`FC{yHtfujNQ-K1 z4Zlr&c*EhvZ|t|E*;l-&Z&d(?y*}lJacjw0??;-Cq;LX+{SsXiHru}WKwFiDF-qCI zLI`j3%82hB$Ci-`>T5##00HFipfp+~=<)hSL{83))#5K53OL6v9IAqrVLR`0*5>^L=Eus)zeS=S?;G8( zqLBS~f2bx`itEM?v-SbVbB&ZW?x<_J=~_nsDelpyaQ%-HPBuN{V=+Dt;NjQ5q_Grj zHm)0nD~9tR(gmPQ=wZ%B?+fVDsLHD(kv6$W=HJRGcxS)g35d;#qZnT0d@)bi2!a#9 zw?2gBQs1XuKle+?P+$Bum(%>26ml_xYua!O=h6!G@2J)KUgIDBx(pceZ8)##zn#6o z=?8H$V7D}DAb%uLkMx5gGr(oQj}Azg)UfCSv#JqgLlC1&= zsy63Fc4Prw$G0lf5>OKpPRwy0(W7q&%}P(st(Xx|McLSZ5jr8qm@7+gTPuOhS8$u6 z015->5pBm>p~TMFK$F>$lZ@?C)ss?6YXb*BEx#-GR<}+8cCu9@8nW$kdMj#onSUWc zg}mndUA6fps4qv%QnYonz2zvaJp8ho;7mv2aCYjlRi)#~>FzK;FRkmqKh8CGIX}7X zVDp=jMd;lg?VApq32tix!}H9ppwP{(Xn>^164@rMio`0nle>@{TL9-%^wBU~xGOQ` z_x4?F&VR07p!U^*Hx#FGcnxvTmictATxvFM8}^mE)R4NwDE4Yml_^3dJ+M!?km6R> zx4ZsUF^cNM_iE8{1>m|jfPPX3}x3Z^ze}UqWg-^p*CX@QlGL*Hrp`S!* zIhxc=zG&GtLAahsi(!Ytoqv&F#1-GEIUtM$DaNW=Dl({wBU1aoQ~%#U*nD22`9bMv z20Lz^UJEZ^NMqJtGJd!4RndAZ22iiX%fHP8VA+FC#hVz@IaEN%?MHBwJ>cg<{_ulp za-YZWLOb~(lj!Pp()Z7}clrPvXI!HZm!4-mavi33 z1=W%0Qn5^U4le+H&&V?+pWjEWI@mHwnuYl{q=tPl%X01@xY~^!3-ogneS74rehZo2 zX+TZ9_ojBG)R2bz-!}sX$48R;uO6TzrvQ+TIxbB`0^HMz)%hLc#k4-=^_Fla66P`^ zp|q10U3v+0Gx{$3d+U)@U*})@^zNR%{N{Nqey^`<&F3|^w*MB8_@v2hYo+ST`eW+w zkL&l3FLs9OjP??86d+Z0`V7;z2Ew%*676dGw_LcOd3@IBHm5137b|NXIx4h~s`?M> zYG2mwg2(vL!ze_>a@cN)8N=w^+#sc!8#_9IvU#sJJApM%Cm^>_<8yRo=#s97_%ff~ zQr}fb_+SGGD>tj6<_eFzfU!l4*GJ(=;(C5Aa7fC*v%@)^6e_($h@1Z4TIsHnDBPhP z1d3P(pxa7?9ZF==%2+@7Jcdo5kc)l2P3DHC_7Vd!2Z^_;T=K~TN%cjz#%M34U49Mw zYT#)%^-i(nljmNLf(k|LcV`j>g-ivA9FPCYNVB0qs;xyjXwM@n&u164G<@10-6~JiTYlAp4pU6dB@^e)h;?AQN|H=Bm_UQskb6&t^6n8vw`sKl1)LL5eZ{|5Di> z9^B$9Cj~izdahs8J1K~y*6a!RUak%(JsRgi%Utc#aIK1mR-&3gNg;fQNqz~${%=i5N+kU87S@n%Hn82FqSr)t$@w&C zn^mr)AT`%{1-_pPADp#JC*+vGD!3w9DAH&5ctXe;F@iJ>oh{}0fQGgrCdl}vqzu3-9_+;23@z?oZ zNA1*3(#!@%R%a_g!33irHzKGcdG`G)?`tBrmTCsJuF@8&ttI7 zAt}iBZ+J}34e$dSN9q|j=?Ten!58^zNi5M@J~H!TFs7qq*P6`DP(Xa=bBT$;Gl5fOL4&Ew6>%0H#9Mxi<{zzXg~d@Tu+#K%EM2nQRLll-)y>PUK%Qo66w z=yuJMfkravWMe>JK575SA2`5 zSxAZeF!X{HRdES!5G4&qc0YYTuO{1svFYx zmLe34M_6>v?a9;$8O=XgEBT#!-d1yK_#$V;h7!prPbi5KbXg& zTS2N&9=CJlvx)d^gh%El zd1=d_yc0$bn|Isnmf|*YbDrj0=394TRFmjl)5RWpcy_ZQN8o2&V!L;&pUyij7C7Jo z_R-Ic7i?}C2-U;kg3WK$%=9?Up8qVLUTKDX8KY|px5~ln`8@-{Suvn5l^sY}OA!*y z+nz4dr@yI^F%#I{3c_160B!#OKwFG=Yk(9eSoi%~$E_c4e3qUa9Ar&O&KvXCKCxlb zRh72sCtE%uFcWyU_@CfMazHIGWMGY8<2*|>07gll@Mwr~(QRTfR;xBb!Oz9XR^BYr zv8CoM(bWjHBvKh?_iuC~#1tV=&YT=g4N-)(+29-&0PbEGWt5;u&n3^P44z+|K2T8P zh*q&K6@kFuTGU422)}pWS2bn%akMis5+|e!r8AW#1p>0-JU5Wd>sts@Rh-?0byH+P z*~-L^f}-+^K)@v`^pq}20^)vG&Trk7Z17d#O(9wEO1W`-u~j==*OZKA;ZYbof9r() zfPX_=!Y@iNI`CB-<5Il{)S28N^nzpp$$vpotuAE@@Kb+Q@RT(?h|lbcc6orD{xt`fjR>s zu3O(RwfcMPpe*P$$?tKrJYfzkQ^24PYK#M%_y)HPq^qXv+LONcYPl+vFylVYjn1GP zoAn}6D1RBWg0T-N>xtHig7HKuMt6vql|&!`CkcQk)6{v$4@k+EBTys02q+pf-$AY6lK@I}aXg|4Jk6JO@1z*LAWBmkO<0^Q+;-tmtj*Rc z-wDs1Do_gY6{WN$XQ$NYtAi1ASSV=7@!ddeOb{&cVDuSw zIH<7+2B^YXJmLzJm zij_#rC0og?z^AIjSCSv0Dpr@Js8OL+vA|gEC>I0=P{Ps&m&T3jCH*qH-)a9`j`lO^ zxRPdJkBLrR3^%!TSlZn{`$BnSg%^=4S^^P|ibj~8wTOnlh(5eo=}I$?8CT-KToWMG z`MtYZ`y)C@m=eaGv|9 z^fQ~~Pm{Iy%m-{!61qJvWorlE4JBCHX#KM#E?}wZ zz7b)vLXav}zdFh9t!;-|9@E>yhuWvjLfpM8CSZA2#0+M#tR=O|Yc+IW9AnP5o_ zr=8&SG5EV&>*IG}ATd}5tzA%vlXatqr84E3UHLUCDhvNipq4s>!WWc*`?SvG1{J?1 zUF(3vH$P)z<6Lgsexq^NtJfssGAirnWmR5uFPx((?7EvWd4SgHm>P0^b)09*Cx44I?$F1u4H#H`?3-Crq{0;UqWiE#3yMk` zNa$+rM4*< z>!eE0I)ty>NlR9+#M+8sm-@3~V=ohsnc!BVVDzQa5fcw?)9loUeyS~JlAVDHKo}W~ zm{$3W{D!7KndbF2NcDUj+XX;8s4SzAZz)lUT{P+hOn49uSMDscA`~Z~i}$#db{=g| zH2u0lII4a#8vR5yEv11L$X6uruztL7ZwXE}Iw9#xuG#3J)cCTk&Np~TQ_uS z7o$-nup=Li+S|U!j@_+${?s0pYCHM<{V&}qm)Ri`r|ChmZY_09`^VQj*dh!VV1?0I z8b`TkU5XwW;SS4H*9trRdlmf0g84)~UBK>z1XXtmLj6i#b`k94JHG|EzNd0J3$VQO z_(%!$k%zru2Qw+ClBUcts=R0Phjg~B7%>=@jG;Z`UAep)MccCc`>-T8FPa#S%q zDNG>((DOEDp%L7A8m7gVz%b@0m7Uv#|8Q&8`&|ZAR<4~lH2T#G_wksRgG0Inc+~C+ zvX58n(GN{L`F~>s^^XX?s^7WYK?%kDtD!R0V@NRP+ur`u3p8(3PeY1QXWkCMOarax zoByb9?V2=T$-h#R3B||O8YOi#wW;S9VZTDTmUrh4KQsj0|HRcDcxKnpE#f@-0Vn8v zFJbP<^c-2qDt#BXUI{WkV`(Z z2bGw{Y?NJlv(_e1g!QcF*a52~5d-TxSoF5GDhCKAHqeI);Fm5lgfWbH z+fOX;Df0lDOO0hm(-cs_m$8!uedr|=$qzp~1XHKpsx7OuDj#)ih3c=!y}P1t>kNzY ztpb*FW!JG65dxe(=Za>Mx}Q?AZfE(4(o)ZYU5dF$Iv!asH#*Bcniz}`+Mrc(FF&P- zL!ZxGN-Tu3Im0L~Xf=4>a*)LDKP}jN-C(Pg8xkfsZ^P`*lwh-_4Gd`6k1~3ZX`Q%+ z0XR4ce)m`^Ohvu?mvMR@kXu`ywh;0ws+V@YIFQ)9l%)6WIKIZ9%Q0`auW3r&SfUIi zW>PU-lS}v2!xyy6>_xaiVS!HttMK!-s*S8-AT(B~p*tPAfs%D+`)2T&v3;CuT~pNmC=$u7n8_d_+g2G2^a%e`BZ?;+;5-ss8o@id&KVU=e2)S`^L0uLNy z;lj;w+am5ru1(`)ZC}wUSgdU}tOb%z=dZ#IHMF%lrUm32-8pjb{DuHm8I3cMQV?yS zV`JjiawymfQ`E52L_9rvjZbZvvnLqYpTVv=+dg1+*Z*kUAfIjiC_`_2W?GkYIkFvh zlgWrMIqtiBAF@Oc){(0<3@r!?S1lY$h z(LxrKxx`9kRq+nCXPC~>9=yNZG_6MC88OmNEiP>3Z=m1tl$H6`gxr+wu$5E!Y}mcn zV#ke|5o%O76~4B7F_^a)=T5j7p@5S!ptN#Z?HQSUzC$e)1`a~inK$PN5_Dyf-8Oc2 zF+5i3=(U3XiZ=d^}e1-JR;OY~$4WPsW!In+l9hhD2C)#ocs!KrIQB$b#| ztPNaTs+73d8kN-Lz`oMh{R)-3elNdD5(mE_$j)N_(i(IBHpueI>ggrOe;7~U>XzNO zwAbsz#76O{bC3Y5HFUytyH(+f&ZApvWNvU=XqMWx4^sx*gf1gH8sUHfY^Kn@iY0h$ zE21$E2H+z3)m;V_J56ZhLexjElXh*y6hnNV>zF9^r}^Ps7>{$1>W}YP8b{ z5j%~xnsT%0GF;ax%s(BlwPlTX>YB;UsLNv6AWa^lCn26OD?h(YS5 zaMAeMeNUu;8^lH_Kv%)e@*-_uZ1!^8hm3CIyOsIQirLpyzFEnL0VQhe9nAZX6H2Rp zV+?@vc=#t`7wjWgOo7e&Fs`KJ+7ENs;fJL(&A;J3nW!^uW=VH% z5B^b6Y=@A3(;h{uBqU!6~g>k%qw{hUyWk7M(*s7 zV6!h8(^(|`CbgUmzIRwR7&3JS*k@jA{9-SYRvb`EFfbeQZ`Er$T`9vtSApF|M@SLM5{sj( zjdu0aHwek&Go0<5`d{o7vcArmmU0p+6kB|nRopua2wV&rcJe&f^K=d!fs zH@Cq}vcIML$Hf=95zM1t;e_vqkLgN?>HxLdHg~2sPl;~SP}9%E{~FJHp_`IUdcj{% zZ2Os%XR_*Qd!gaoOmJlTiO1xijGmU8H6$Lubm~E&R3ER2@z5J?@B5+XdPfbA{`?Um zl3{xF-E~;%*O`P||CZcU;3u=JwtlmTOVqZwry_TxXF#!^ zmy?WkgV+*pu9D5LR^(EHV8h)`+CbMK`Q@xGCjbqeKuLAEH`!)HN?p-TZMm{8qNS z`neh2W#O?zE>k^Q+I?IBwD6GFXgkNZDf4W11@Nu9l!%T#)A*&EOxh>aC^?I4DBreE zHQ@Drcst!f@mu)rC+(enR=!QSSNN{PKJ~Z%(lL_-lW!VG|9FA-#u$+rL0DhyP&EFc9eTr&w<2j{$F%x_G zgZTR-nc02BzXt}K_E5sDDi;}!!tJj30VtglI_q>jnue{z&l`dCUE=tiPPo`JXe!bKRBDx?RT_Xs<}k@Fao$C>EFE9^{MDmnRR|)y=&67i7eaQ$Ca*& zB<%>c-7c}=i28vwSDCF|2t$3>X)LGFd{77DZI`PF7skxXIVmr|{-lVmZM-VpzIHIf z*XyIyft1FpTcR6$-XPFUTbk*bjZck;^)}HbO)R)x&Ksrr8?R9+?;MYO@fgUg`a=ls8 zUVo5=Sa)9+H2%8t^*ASmGhONCz+T98h*bV?b%$PC7|gf7Nho>8$NEbmhl60lbhWPh z&=$jrpkY4MR;~zLn~JEoPwdNUW-giY%OUN;)->(1cF8+fLf+qQfPCAbZ+DU5pw45C zgo3EFcY@-;*zWjpS3|y;!t61Hp?xM4wnUAr>y@Ciwfv1@>8>RBC228Jpr2;uaJQ&Y zV?n9wcETauqpM)!mIXEuaSI*QFY46p<7$(AM8B6PfnJYf(|={a-flhoR>R}F-IrRL z;!Z*;CBsDIa^J+&zWb?KV3rSbN&x~?M9_>YOW(x8$`jJC7gJ?}unN1$)x5hZ1CqN`SfD~VRbPKUOXhxa4Efdzl1~EkQH_X86fu4IT+pOad*OFc5Tm~c$4^yOQA}jOxT;G~Bmx;2WqIxG{AFnK%y~}n2(YLE$;8)5kj8-tK1zXPgqi0E(P~H;yO?HhErBKZA>0fO5jpDZHaxd{ z!!7ga-wWH`C6BWcSOJUSHfet#xn*rkvrCx-`;Q3ccY8iTRk@H zpsbt8Qh%Oz1}J(Q!9tY;O1sx?OPJWM)IYOW(L+}J#H#a=l@<4b6d8;YGB8HZ`n|Om zYNsp<}r~t;Ajo z+H}4Lo><8x6(IiT_{AJdI4>revR2dkQ4VJH#`@mSwmt%!4`Y_%552SLY(7P8Wqu5~DXw(lpGq=kVnv8js+9LLLut z&#A3NW1i>>b;R3SE?LJH|6^w2UQk&$w|VZu*mTR&2iAu7C5Q$_02sa)@I1UY(g9Z5 zz?qAJCsP7cBBV7L0f-;?l4A9kd8JOdFI!!LTy~;T=dOqT_7=OGf876a&CI%#&E*iG z=Pr9lCsZ zT0zy+qSblUP`ASz)Q!7VFyK>zxWC&F7f@ke*rU#9OHXQMYCu~;lI-4H9buk-@SG~7 z^!q_UvsL;z_Mw>{Ul_1D6vjxsqku65e4G-6BG66{D^AxX0#^dl)|BpB18$0hzSb&# z0bIoP)+=MS!ve}ll9ttTFouMK%}U)gP@Ons$j{%9)YcJe_#BMK{YS>5qj*_pQl}K&nKHDUihxV zdiLOhV?UNR+CshyOgzpdRVT`zbKy9PkrJQvr7a$>dAtBK9a8Pr!bZtX5)JaU*4fC< zOM4;7SWaF+_slNvqcP2pIs31-(6I(s{%JLyYHw{bYZ$~>Ty<2@yTM!;AMt|E)^@s7 zUJAeqbdyPy>^T{lMkmD{e+{CL zRN7;skd;?QwoaY0TNjviQF@%c8SVuejpXAN?ebX75ilF9&CY zp7PE3kO8VSQd%=dM!>R>23|+X(Zx<~hdV&7M3|N3A4Id=1S1v}^J%`L!NmL2m8rFd z7LTm+%d`oQTf*+i1Rqi3ig0udy>x2U@_krM79JXJ!DT5%G|FLcs(9g(U9 z_m>)=^?oYBR~e;V45wxGD0TLkf5ffGE@O*89zS5`lm(3Opb1veK48RQ0Nld9#Hrws ziNhO9?32Um&npL_3c)Zl7Kqu^i%hZ1bExBS-{{r7jB5eGCx@h@W-3igCF3KPV~42_ zX7tXpSEg}cL8_k7a?6Y+`0QtNNQS6l9j8kaah>2~qG>xFQ(d`Lr%;6ya;oweLCOpS zDM;;c<5zewZrxaF0oPO1+ocVR{At2bvr5XI>{kCtqq+a6ZvW8+D|I}XVXg0oA7Oiy zTR%KhIxEGk*dmLj3tiMjZUMRQdhX78(E=7q-tZb5E@oQ!^p}G-5#IK|&4L8+{I)GH za|yh=JKePfHp=oWP?tQs0a&g@ZN~()YOYnyzD8x`Rcx0?cWJfkY8>1cGzAO^zm^&-S$3D@-~9dDi6C*w-)28 zK7oV!FpH5iRn(yCFnyo=H~hoXzir|gPaGL(g) zRC>XzrJO{@#mkrG5rL5*Pyb`@OQ(T>aaHsjwH<6mpaQ}yJO^O{<=NinsUB!G+ZS?o zQZTNesJ>kCEGB5lP*a!x$@nDDe+$eIx&~fe)?q%1kN9ge_b%?AruT~kV+3i}s0TS2 zeX5Ar){fa*4wEJQXtggtJ?=#W%QullPTF9)@@jxb|I9$U5a0wuhvxoj#^_ze7tBbk z=eT0DdGBv^$jW}|SAV|ri_%U(AaGzyM}W%v?JkTDw(6w^vSuY!79RmaBcUOjsLUmi z(}2sL96+2Ed6;O@Y%q$cwf>{t&#ISg)rb7$U>(FsZ55R>uxZNg%9BzrN?&*NE@ELb z7uH!84ipsJt$N41PiiSa^D3vE+I%o+JJ0{aQ4!`dt^gB6Gkk%H)~J)w^vL3^UL{vi z<1&o&%)S(}mXv8%e&?R)$QoCLb{lSvFF12pi_xPuGU%u+( z>+=QfPe|V|pPBq2;0CqCXAB&}1RXLVdQxTW6{1Sdemz)PYsU}}v62>Uq3WF&@wPB4 z=@1Po=}-#gSE1vjR7vUkeQ>1sQ$&_e1Xbik(a%Zh6PS4_i5$JBjd*DiZ(CimBPDVQPq8J!`d*ED+mSX1O7DaX>r)7_2TbmNdf zh>+<)ZQ-rfmy!Z!buyxn|EeYso%?oJJyM{WVcCOM`$2ZMg1)sTZ0Uvyue22?R~2$d z!w2p+7)n$%hY!w}9zQl?YX2OYnTIq~aZ&vm@}tK%Y^!H;eqK^ryT5%jh?H0)(W(eP z8vNE4wro>Loa&$Z>yf!O%+v}Y^q&*Wn?)!Tnva+(zpR6O12kdXV`i^J=-8ohk4Pa?$L-ozkHCPNUrRV) zr7K9fTf9aeQnr_%GVt{v)YyquX2gOj6l|T+;Jy5?=QYDh7i5!#E_sgo-auYjRs*TB zgxf?jk7-(Q5MpCOOp2Skmt_z*)OAr&2q2wO0YX!c{6pE^XO}>_a)gK9?j_K<9Tz_; zZFshuWF`GNUNNz3k&-%o!6~g`UgB9p=^BWg z3vLp|?{aov>S`69V9$<0nF`H285ucjwzj!?y5>Jpu)3;pXQ-U3PfwfC98lD{<|{!O zKG?%{_^gljLX$De*3$=6MXs`3`;f@8#UT8jDk8b&0_$6pI?TBv zcg@ZRb-+|y_Qd%9XiNR#2DED>hbJd)GNe5-q{P&rPNuJbr;g&AYOMlG(F>*1dy{>_ z_FfTZzwcSV-x`Wf;5M6=qhDraWr>Q4%1s~JE(HIt(llGEL3|j5Y@DP)GfG%{X6+kCzw|JaaZu-81wJc+-(~fs zU&ZIj>0wH8c1v$MX7>dw42a@RW6b!|M)9@)Y0L2k-T91F^Sl zZ}JRZ`SA)PB5zcR^?(Z5--g| zt-Y`Fgi4rKsCQ!NEsv`DaS_F%Ej3(C9?PE=3DlbM5HLXMhImS;_T7*=UOH z{M1(<*6;NSq0O14&z$!ErGjXJev%3pZ0 z8hIT+-IU3ayqo2aPI$EC9z|wZSlT}J;XbIeM1OEjNZ!L~kXdz`1e4jUT=h$$#uB=K zx5R%YFHi~(5Rs8GXlC-MJ6XRZw%DKe&xvelas6CVr>vm-ijqajX>~oGraZ4r0T&(D zkSaJigL3cMWJVhWVL4Y?{cZUm>s?d#rm@ES|(O`BqR zeBTTDm-OAak3Ky!7o<=Z%C=g-*SSdA`_A5~+2| zIh78ay#y##)(lVJ*WGm=?_qr=2P(kCr`m=AeNG{WyEG1%WjCPAk zeyI#Ehpq`2k181V8yQFS?zHEUrjqx10y+5_0gHftL!PS!Az_vW){T{tb9|S*3#^O!1p=b_?Vd`Z&ZfqFq_C$J09T zKkEHQ8d=(Y78@N2lMlSpE`&^lD}VJF)kW=@sV%x1lU9r_pA4eHp5={kyNoHLUr0>g zs2xu)66xK~br_v94s4;EKd~80BqL|@-N*UnImu=|EQ0!1mFg(H>7QrR{{cD=y9d|= z_uO^A;-|j`QxvELJf`9U)jgix^#iXa;!IBu4nD9ME%Gc#d|pKZA|qr70UK`EB4zY! zQ19=v;5!-v1v-;tlfaxJ4t5M%=9`NRGL_>ClUm&>LjtMQ7de2zZaaIxb?$!x{&H>I zFX~rORN?_WTz;g)&3Uwt`ro{-nU{5xx6M?`6L4M<`oMBu5!0W0!b+g?Ic6VBJq6D; z-qknF>>j5+^AyXexaoU*qW;@*x#S6@(`)L>;T3z z{~BnU$hi9ZGq-}yujI|No~ZL8os#nwtBOhPm-80tBQoyx~;V%UmHz-(%2lFO@q2opu`Jkx;Q}3Zijj9i#_OEj_a;@7L!U|NNjRDGQ2$AG z+Qm5^vv2emNir?E}opv4oFj;yucwyfOKE_VsZ$wA@oho zX6E7fSCFljHitg)M(syC{PH(O)i9{HSEPF^CH#snZ5(A*C(Vk|V9WgZkBfahPwuJj zG;u~}i?(b*v{+VXLV6j`{GJ2yXhWuPZ`#721pT{RzH2UtQwddRL)V)-&vBT6Ngg${ zRQ_z5Pg7fZ9O9G%wKb0hudXZBuYcitat9KgIesUHBxJyNLcwET-=1s8_NpCW9V~<< z?7n%&LYT>3es=yQPqd41;WOUyw#1gkoJhu6RvRlCjsse2fevu=xejgKe-H<9=*l14 zhF?CS8bxQ;-t2rHU-d}SHNT8#7I@9Xy^_cCJBfL(AgA;0tzU!Awsoy9g4#qFr7eAc z9)7*-&zq{_LO!p)hA8a|pq&bb&-q$UpZSHhFAU`k9`LQ8v@Ygi z2ILz}(f(MDWHO-D)BQWbG<%{y%TeT1C9>i4+l}J@j}xN3)SWPXAqZn`jUvUCv*;TA zz?}K+i}KJs@sBlw4Hc}MPn?ovlPUV#1IqP2xn(Fr6+t~hQ1v9wwqj1pTSLVZ{?5;z zKigiTy_%SultpALz2gqs%L{NCpg7Q*BR0(ETH8}w_g>hx{0&^Nv|;*49=_~KfI$BP z)PMS&wcQh(Uhv*G7`cp$7a+=s=lZ5!cGm`#nrg%ngaPmW@q=u6ntS`}sd|c~@hq~! z$|2;>i8lMNWZ2C2-Pr#wHn4oKd>L&t_=*4;uo{}_-ZM1n$mYz6#kr%2s8ZF9)~cev zdV;ij^Y}Jb=oZPA=(3#I-Xg>=Hx#SL)0TfevacOvVMweI*|VjMR@t!TL19N}gBN-N~JI8yNUvV2yVK7=1F+(kfl;6tI#68z^-l}--{IMG2sKk?UQ<%1J%XGA!P zQG@}mL-)QL^Ok*k)d$B~5|Obmid)c(VAgt=RXl-e8Ba*YRR zF*~ziBf2S$*4ig?tDY{Ot3ZZcANa%zLzm>+H~J9C`7L;2% z#{w=NJ&N!9BRV;6{%+mpMQFPz!3aO#cjC{YBeEpiD_Pgx4ikxVny{_;J5Et)pAmMz%D7Ja>d9Out|8Nxbjep5erX;Q z)Z_|^pp4Y`$L|k8z_%USl~Bw&Tb zso6J>^j^c9xn3ej+tbV}#2zt!=unClS47@1ehH{}5Tpo-^w2wixe40|i8$SW8j zS5tuliV~f8vKlS}Z%r@ZB3?TKWvYHcffQ&6ZEU-VY%JE#2(&09REW4-Y1iTAOLW9G zr#8ad-WiJDNG%fA&LJT^k4-3W9_}tKT~lb~MT-XfIn0zO@uN}6XG>`vm^87tl>URcK9 zhE#&n46dKpaX3b-5QGNNBle0o+1Ih~#L2URv7%;k9-PO`N6z2!Oc8hNr~R^2y0eGP zZ;i}jMbQs=+};t?_EXT)6Fg78|N2?-SV84JG+WNj*7Y$=Zu-;mCvNi9GB6~!vDX1q z6I=3JF03rpNn9BD-r#20e7tG|K>LkN2R#W0Xo^D{8S=Zxgp*@Mj()8;9~{_Z!v@dt z++E3dl6?-k8(aPlDdG$*!#Bqjiym*!4oq^ebwh46BYe!L$HUZvGBZ8yj*d!DYk_J) zJ@#T{f1_Sq-YiZi+y*KYY4{2K{M@op2I9^qOBC@8#_<5YBmV@hS6RniY;aPu8TCGF7 z-VgT#)Z8Jw=+_4K;d)l3HyG=VifK%YOx!?92)ze7BZRe}r_@h$49}rdZ<0SxF<2Y! z7SpvfM7;{IPKVzrom0P!(Rj35{+WNe5-W$kbF=e>#EsNcY}EAxC&wsTbfsjcMMuze z3*AsXY;%M*3MAwA#@8>yR8S1joDphiub-Svf6vSrx+XI@^X@AAUtSPFFB;~QTIwV;p!rg{C##etANk76 z_8%7A2p2E=%wOIbo*f&c!4V1F3u2jkP;*T`Fo1vF=R(*XY2!TsJgSmlGxH?)*ap*`& zcwT*!uH7^a>=?MeK40%kSVyV(aHBg^VC%6*&Atb*&Gx0cj&W5mu|ya!UC9*nRnKu+ zWi_GRI=0rNHtMy#dqJ)Qbobfs#&g3$6K5JTbXfQDq~>ER&us4$h3y_ywEx<$Snt*j zSToqTgF^L9d~{c8PhWb2aRDoY5X2WX>EP2$cXZdpKYDk{Yf4VNZoG{|wjD%&clA4d z<7+I%zb_v|SpE$lLK!oD%KJ8Gr?ZP@kxF5lT7?XLwPP;RP>693cb{wOxt!gJp_%i! z_-MeWgVthy8HQypg*wwW-Y^c5db!w2lc3Jhe9_dRz%6k~m0Oc!=L8OX@8^&KJ1|Ix z=RJ*e3<#ktc3~d0NJxh(FZv&Urm!5tdQ1yo*&+zbP?)GexQr*aup6}Q^PZAUfvF-E zM<&~Z?|lXu%%Ysza%$5Vw~YB|B@h{JF;1|Kb?zq%j?S#XooJxUpKrqc%yy@Lb`&GB zgZk!V#<^n}sN}%b@xE3VMcVclpZ^WI&HD1!znp+K3bz~)G2TUF8#LB@ z(tM39ROvNaNFZf3oZv7WG3YDZ8N-n7%!;|LS)zS34j_fA(Lrm4oG=Pq3K|ONi~{c{ zp#JCNKw+j28+Wc-d9sH(~gD7wFwhyBmHVr4>R$SbiY zi6PaC(qZiNisn2}+*5hs&(f%upZAXIFSNd(9$**^S?j*X2Km9jd1>=Seq{PQIkIVi&&cEXhtwTL|i;Z0WleN2+=h7*H zZGCr*unGCdP|Pi#jm^mbz4B*Qj%BuXSqd8zvFPwUe#~d!O`!0~fa;ReT`_cS;tcF)Hm06SR)EfzfJ{yf$;@A}yjZ3;lq4g5y9@SfH~bvR0# zy8`sD3ZEzn`@tu< zc8pC_3eGzC_S>Hb4HF?&7x|)>o+&NlyL5hDz@nbg|IE%g%|B7K2gVA;#JE+6-&=j? zS)BF|C$8VGgTzEtV9n$;O$$eSg|&pFs2;0Eq#=8N0usXxpAJ(W9uyMl^FH6>`}?~8 zV3gQiO+PSY4{W)m^R0yXt(idUG6rpS-s+{r@K{-yz~;XHP$9GACix^a#W`-=-96f1 zMuH_L!#8*K!k0d?OxV)RPjHDwcfW+ibSXlS+%Ojx`wjG;d~c4odUvJH#@j%$G-@4a zm+*r-ZS$|2)0lL#E?o}5hL9W@t=ly-ANQSYb*iI?#Vp4o?(n)qzCUw>&5RxaEk;N# zF8{jfxeMtB>YU8oWDVI`6<$~Ew}EoN`K*91UneEwWJ?Qx)TFlTBoVBFD97QqE&ru; zC}PX9y0E(yz5OIw$HhqBfsPzJ%YUO3SUtrfSH^X2&QndA!LaH5^Znj*STb9%Sk-OR zG=y->7VIY)J9>;WAVlGfD_js~1DKxb*~n|XGD0g{8n*=WQw|y7^%)@3r_Xy23Du|E zqCxAs^j3tRE^pEaSF%p#`SWoDw9c>qJnm`qS=x6+jI-3?*Wx_gWypa`3R-g zlm;hGIP5?A(W4vueFf#DNRnJ`ekL>G+~nD+xU4x;|95-e$1Z6NcG0@Y{m~1;cCOR> zfZ(+V_3`Ig4+Qjy?rLCJ(zMyLe-EMtG7J(gs0=*K8pD({!}qc<$@L*TYy+iqL@E1W zqPpAvtF;6m`H0W)5xcz)Ka`DHRRMt{mYxvf< z^X4X=dTnKOuD0)g^lcy!S%*Z^-iK|OXQYVaHBwf=EQZcfkqx1#iMXzjmpOj3^ZRvB zT3)rfu;C)0H2yVmKsBqx4fcAH5nu|j@}cxo*#gs#<7%g}oW~u_s$w(x?Xi;jSq!`t z6~0v8WOSC46iP$OdLFPptJtBobHdUu!=Qi@iS|gn^LIF_i|>~^b*9M;=K6l@{dULf zQVrxEGm8|Kki@3936P$~3*g!8mc_N8ghFL6xPh4;rpw}&!vfDq<@{uJO!eO9Un#)o z4}^_urQoNBAab9Ag>n$N>bihZa9(_!@V>?6laiYB6;zbS?)!ug$JX`hKDx}g1#Ei? zj_fghAusH;2V_RscMh$S zi>rLXG{O&{m%rS4VK1YsF_2j;JO6h|`-}K7Mpd>&Kt3k5EkilJ#9%k%nSw$Y)V6LG z?xeV~6xgB{JtwWs?n~a&oz8#GH9l0x4RrgCUT+8)WSdx8LERJ~H-#p%jrN8xTM1Ue zz7WnXAdfw0;~(MCEZ3k1)qw;YpzJVD~rHf+9XuA@=&j z(9lrhxSNSD6f*lq60-0&FNCJHpH>Ls6NB*Q|+5%D~n!hD99WI_0j2# zviMk9$3gx3PcL!6iw4<~yyYLvP64kcix=ev>K?Y8Qm;574h>#y&1?VSY|A}oWQ1b4 zb`$@o=911fHL{45bxZzPv?e~3utWEqYDVg1*k)*AN;snm59kMvw*U8z=)F*4arcPL z4K~)z!CspL1sw*PJSN}bz*2XMmspcsKKm-)CcUx3xG>AP)*dSXu_?Fn{ZmWsXxE8u z%;dTfB`@$4g(t7YD2vqFtyHd^cuH_!l zHzlM{9nCrYgw3T_(7F+^h_QO1?M5Sh7r@{!z3>X|3u7ncRWi@iOv zl(Z<0@bsRdP3`uKyyKmvaMx9%)pM=a`DQ`)6EW`~_shUo;+_5HuLYYWJ$-Da*kOex)>Km*YaD*?+v;kh!$>CYI028p9N2-3{A;)lp=L397?g5#Fw;K2^HQ|nE7j@5 z+u*A24Rx@NH02M)(-+5bt%CS%$;U0U#zW3LL&RJB;qB)#o3fgr88KUDqeSq?*NMLv zA0~#0(&)wNGFqqV^3pbHidUY__1;IkEVA6ZpHq|x6 zALY4$eS78!bn;7Qfe9Ym9i*bWZUe_CBOs(+=tqWZPw==@5#Hz#Ga832OKNiWX7O2Z z9hbO#6w)WT=^kIT{;AQ}+nkN;Q!>d3zq{+$2W+KbR1MC8-^heDwabg5;Q=LygB3?rae zcxft=uh}b9%g!qIMMHe=#kfYwFJENY_n}MLOGnO|dYVs&5B!k&StFXvmiZ~M zRXz#4?eqA;m^da2v+*ND$AZ?eu^5Sp=jIeQ?gb7F`f^#={7g83#1Nv8Ue}NGKcIi- zVInOqD-E}$HpF7ushpmu*vfJ=swMCmpVO5nSa$TU$ml>p{^Bgk*6|an@~0)=Q^RJ7 z@HT+YI1dZu;8A1K^Yz5J?*Z`UtOULGB(lbZbVeh5&%ckNXAycoODXyqQyugHqo-Bf z)0RJd%kLPKLzAqsPe;Ihr_j`IwubtZS1h_u7D85r4?SG~gs4#_c}Dnh*CBrkg@VSB z|J8Tm^Zy?JBY8fV9d{P0bOUe?c1EI$%n0>=9^8%NTZImMo&0QYI2m?N<`*R*T&|aJ z3Jy8wHlC?M9H&BfD;K>FN@*Q&h35n{zwh|rz3=qvM8Oip*35Y0 z@&zm=D{EgFc$stPU>%OJ}MegJ_P@HVJWqjphz2TGfhi0xnW)K!$5}#bWn8 znQ{sDx(x8mBu81Z;?pc8V$K2$riwekF^VetjHYcREM1XQG70)ZWC#^8Pfh3BU!pH! zsKNhk=#qL54kK)~U_*?#F{UgGy_L@)G-u?c-!!16TJUmp)J#{Y))axJg{&RY3!-D% znRy_A=NM*;iG<{{i1S#=eHl9TaQ2O3b111yp4HLRo(lPP3MxBW!)kgr)*=FmUJ;&} z5eX4>u(@R4mG^Gq8;dGSgO*NiVj9XD$djgVKci!r@z3|p;_b^G-xQxts?|*q!r=B=vn_-;4x9}2lJ{QJ zJ+(xjM;b&om|8mG{8vyTr%tG52}s(lhk2SFV4K==VlCO9w8^==449^EJ&fD&@1sXe z9p<+CIf{+!mq5N-W9Rhf^?n`mX?ySU8*=DS*B<<(lfa#eK(+n&#gi@>!fUS~7N4>s zt#K;_H}{k$*CgqA{Mgd0x=keO5mP_(!v#u`HoCkf#cwiSmyEuvvu~lXG1j&hzhU;5 z>|5XNr|>=*Rt(d*@`Qn~IKeMRXSdD#6&Bg!nr`L?C7yh={UV=CjiaE-RKj_FFLm}` zL6JXnI=1ep=nK99I^8v2$)WxHS*fqJ!_&t2Tx>3oYitbg-t{5lk_-8t!zH%*1(zj? zC@{g@!}utjf~_E%^e7k<_qsF^W@$Ny_#Wv7TRUtt$P$&j5ww8}qEAxXjg{u}cMJ$8 zcKBUw)YKN4ljz=12wHbtEY61pu(LjC8RJp>q zD;KPLG{jsie{?rGEziJhBl#Y&XoXZs>v(;ib)OC}v;Q-bffjNHV%4o zdsKdB1X|CI#*I3^kqEq&>YV|FDq?TP0u-M@E&h#k2EiJnS`D_^T8Sru8{0vwR;e8E z=uLdkR>R9O;Y+;L;ZE)EpVo$VkIrmv8}s@j`K%7ERjI8h7Vr#U(J(&}H#B}>0*#eV5v*#Py84Gg3YFfcWm#k0yY^?WzOx=_~UA>%I@1w|-YkbAT zy7ZqR8JRQa`fEz`JAF*r_;G~8n=wX!2vR`)uWX)A*1?dnOiVx&X5J(V0ISCR5)tAB z+(7KaKG3O-xN(!%Huj_9MJT_EqT3%7OZTv9CArEQ}wl@)+bcHnbUC0x}5L7kW($< z_$1L!dM>jeYA1bDxOGyOssdGGHcoI!jT}3c8EU4!)lZ3freWy74B>RQu(B#gJvsD{ zfD)VV)>#=N{6~Kr&nN1z*e%3z^T;4uahe3az)>Z~gINohD}Pm)sC#GN3z792A`5$k z)Eutp`d>(JRH{ySMrgaYN&)RtB6{f;clsFg0&Ber>e2@`9ybU5l#7qro9IYdq<$(< zixl;tU=zquVpV$~^HH+qSNWc4*Turro`oU$)Y|Uq=T_j!k#ma=Wta%@Xh)N@L#U>+ zMbT}?8Z0feL&-0vQ9L)D+?B?c< zpxM^u%IZ`=PC}UuvSrXfD3IqbD|TQ{=N7FY{(j2=uGPn+)0(@F{LoNie8;Y6aZdE@ zIQN|_Am_oEdsuZb6g(x|hM8)1ZPr9nk-Bm?bNhApF9=3ZvelD+#aB{G@M1umo&Y&G ztLo#{-d|R8sn)^C+>DD*`Fl$#(`6HP&zGBHD&;tTd8yMnA#)$md;jHvw(MDuSX5rF z*s>1C<8w$`q@!ruaJ73+c*~gYOLvL%%K4yL+Kyi8(g)1b^)6X_Q;2tjZI4vWa`6)7 zFL&;rwjnZxgmkCC)v-b@z`Sn#v4`>fmK7Y`(zxfRbuCbM&rpMG=iC1jULrNWJTS;r zjL3+`O7t1Aw^dq$Zo|fWP)X7dl!{8eO{l1`0xvyGs2 z%n=sss0BWMZ$=3X>U>5UT2&I<v&6MqF>Yc zSFG;mmh{~SMRy8emPZ%Y0y*|U7{9ob3u%Qk<=$8!e zZQh3L^fV83!8{QzbL3hH-o(-MZ ziB}IBeF%b?c~5UikX+kS!A1-~_0fC?)%hT0x4tO`s=lCk8K+oCw0Ex`MaaADf)D#N zk>iU#>I2Zp6L*K&GtX!uFJAUOs^2G`bUAUqB^-K!C)t84{-|&j%UX=ihw>|KeLKyG z%4@XyE7M&q_})b$(w(56L|c`T((JQ!>5sAxTI=B?xdi6bNihm}It7P*Z>aseDLj&B zw2P>lx;isNpr5PUYjAg2LJV(R^;Y{vU6z9?{wWcy*^{ss_uil8El6SB^FUKl9^Ke) zeVXTlqY0SADs0ERoQD^hLIX$?`a3pPd`e+GZpd@KW$xQYW1{V;WumDERBTdSGDX8O z9$Y%n@a&WE=J>&}^p-+APw7m=uEns%&Ww}tGpUiRRT2=7zJ^z;G=vUsK! z_fJ$#p0jwAXHJ#IPnI!$yu@gfAL{BGWn^GtcKAjR`;j&ne<$fLe%i7nc)0m4B-K<| z_La&z3Nj@c9sRQJroc?)?``Q6dsyI%M;WiOglTv}M_QhK=bnA!Zc{N$A71e)n25_C zEGmx&b$Y?~mfEO?ea^O8zPOKesjk?hGvA*n7x3izz;{>js}i(+uH4Gq_;l{)#q{UA zPul~&gv^CF`_k#koOSUydkRoI_?PlHLHC-FBD#i`rlVjM;#eJD4?1~2snoSukKIc) z@QVN>HI1VfuQ172y*!fDtKoVX160;G;bv8zx(s?XDwFbRTx(M%)n3jeYvVQIRn@5sO$tQy*p8eRI6yk_h`RkfK=D*Ye`R=z`)+L%Kj|3DyGuM2rBJR{3<{mQzXU-D8BMr~j3$X84ZDXF!{i zBw;{l_(=1kG Date: Fri, 28 Aug 2026 19:56:34 +1000 Subject: [PATCH 078/162] fix clippy warning with new version of rust --- src/canonicalize.rs | 14 ++++++-------- src/chemistry.rs | 15 ++++++--------- src/tts.rs | 14 ++++++-------- 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/src/canonicalize.rs b/src/canonicalize.rs index 380c4de0c..d20374d49 100644 --- a/src/canonicalize.rs +++ b/src/canonicalize.rs @@ -2412,23 +2412,21 @@ impl CanonicalizeContext { // This is not yet in canonical form, so the fences may be siblings or siblings of the parent let preceding_siblings = as_element(children[0]).preceding_siblings(); let following_siblings = as_element(children[end-1]).following_siblings(); - let first_child; - let last_child; - if preceding_siblings.is_empty() && following_siblings.is_empty() { + + + let (first_child, last_child) = if preceding_siblings.is_empty() && following_siblings.is_empty() { // number spans all children, look to parent for fences let preceding_children = mrow.preceding_siblings(); let following_children = mrow.following_siblings(); if preceding_children.is_empty() || following_children.is_empty() { return true; // doesn't have left or right fence } - first_child = preceding_children[preceding_children.len()-1]; - last_child = following_children[0]; + (preceding_children[preceding_children.len()-1], following_children[0]) } else if preceding_siblings.is_empty() || following_siblings.is_empty() { return true; // can't be fences around it } else { - first_child = preceding_siblings[preceding_siblings.len()-1]; - last_child = following_siblings[0]; - } + (preceding_siblings[preceding_siblings.len()-1], following_siblings[0]) + }; let first_child = as_element(first_child); let last_child = as_element(last_child); return !(name(first_child) == "mo" && is_fence(first_child) && diff --git a/src/chemistry.rs b/src/chemistry.rs index 1176d8d3a..23de8668a 100644 --- a/src/chemistry.rs +++ b/src/chemistry.rs @@ -1384,17 +1384,14 @@ pub fn likely_adorned_chem_formula(mathml: Element) -> i32 { // prescripts are normally positive integers, chem 2.5.1 allows for a superscript for a Lewis dot // postscript should be a charge - let prescripts; - let postscripts; - if children.len() == 4 && name(as_element(children[1]))=="mprescripts" { // just prescripts - prescripts = &children[2..4]; - postscripts = &children[0..0]; // empty + + + let (prescripts, postscripts) = if children.len() == 4 && name(as_element(children[1]))=="mprescripts" { // just prescripts + (&children[2..4], &children[0..0]) // empty } else if children.len() == 6 && name(as_element(children[3]))=="mprescripts" { // pre and postscripts - prescripts = &children[4..6]; - postscripts = &children[1..3]; // empty + (&children[4..6], &children[1..3]) // empty } else if children.len() == 3 || children.len() == 5 { // just postscripts (simultaneous or offset) - prescripts = &children[0..0]; // empty - postscripts = &children[1..]; + (&children[0..0], &children[1..]) } else { return NOT_CHEMISTRY; }; diff --git a/src/tts.rs b/src/tts.rs index 91b05c0a8..c2f951b39 100644 --- a/src/tts.rs +++ b/src/tts.rs @@ -669,18 +669,16 @@ impl TTS { /// There is a bias towards pausing more _after_ longer strings. pub fn compute_auto_pause(&self, prefs: &PreferenceManager, before: &str, after: &str) -> Result { static REMOVE_XML: LazyLock = LazyLock::new(|| Regex::new(r"<.+?>").unwrap()); // punctuation ending with a '.' - let before_len; - let after_len; - match self { + + + let (before_len, after_len) = match self { TTS::SSML | TTS::SAPI5 => { - before_len = REMOVE_XML.replace_all(before, "").len(); - after_len = REMOVE_XML.replace_all(after, "").len(); + (REMOVE_XML.replace_all(before, "").len(), REMOVE_XML.replace_all(after, "").len()) }, _ => { - before_len = before.len(); - after_len = after.len(); + (before.len(), after.len()) }, - } + }; // pause values are not cut in stone // the calculation bias to 'previous' is based on MathPlayer which used '30 * #-of-descendants-on-left From 5a4aa2c35f38b1501900a61d1f4909664a2bc300 Mon Sep 17 00:00:00 2001 From: "U-rainshowers\\neils" Date: Fri, 28 Aug 2026 21:28:36 +1000 Subject: [PATCH 079/162] tried to align the MathCAT logo with the following text. --- README.md | 3 +-- docs/callers.md | 2 +- docs/helpers_old.md | 2 +- docs/index.md | 3 +-- docs/ru/callers.md | 2 +- docs/ru/helpers.md | 2 +- docs/ru/index.md | 3 +-- docs/ru/users.md | 2 +- docs/users_old.md | 2 +- 9 files changed, 9 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index d34a66632..bf974dc3b 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ # MathCAT: Math Capable Assistive Technology -Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. -is a library that supports conversion of MathML to: +Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. is a library that supports conversion of MathML to: * Speech strings (in several languages) with embedded speech engine commands diff --git a/docs/callers.md b/docs/callers.md index 0fbe0f189..caff0437d 100644 --- a/docs/callers.md +++ b/docs/callers.md @@ -1,5 +1,5 @@ # MathCAT: Math Capable Assistive Technology -Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. +Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. ## Information for AT and Other Library Users diff --git a/docs/helpers_old.md b/docs/helpers_old.md index dea983da6..5266c8b3e 100644 --- a/docs/helpers_old.md +++ b/docs/helpers_old.md @@ -1,4 +1,4 @@ -# Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. Translator and Rule Developer Guide +# Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. Translator and Rule Developer Guide ## Information for MathCAT Rule Developers/Translators This page is a work-in-progress. diff --git a/docs/index.md b/docs/index.md index e965c905d..b4283d1d5 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,5 @@ # MathCAT: Math Capable Assistive Technology -Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. -is a library that supports conversion of MathML to: +Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. is a library that supports conversion of MathML to: * Speech strings with embedded speech engine commands * Braille (Nemeth, UEB Technical, and eventually other braille math codes) diff --git a/docs/ru/callers.md b/docs/ru/callers.md index cc3117baa..e9a1270cf 100644 --- a/docs/ru/callers.md +++ b/docs/ru/callers.md @@ -5,7 +5,7 @@ ref: callers title: Đ˜ĐœŃ‚Đ”ĐłŃ€Đ°Ń†ĐžŃ MathCAT --- # MathCAT: срДЎстĐČĐŸ ĐŸĐ±Đ”ŃĐżĐ”Ń‡Đ”ĐœĐžŃ ĐŽĐŸŃŃ‚ŃƒĐżĐœĐŸŃŃ‚Đž ĐŒĐ°Ń‚Đ”ĐŒĐ°Ń‚ĐžĐșĐž -Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. +Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. ## Đ˜ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃ ĐŽĐ»Ń Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐŸĐČ Đ°ŃŃĐžŃŃ‚ĐžĐČĐœŃ‹Ń… Ń‚Đ”Ń…ĐœĐŸĐ»ĐŸĐłĐžĐč Đž ĐżĐŸĐ»ŃŒĐ·ĐŸĐČатДлДĐč Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”ĐșĐž diff --git a/docs/ru/helpers.md b/docs/ru/helpers.md index 0cb0b8769..ebcd6e8c4 100644 --- a/docs/ru/helpers.md +++ b/docs/ru/helpers.md @@ -4,7 +4,7 @@ lang: ru ref: helpers title: РуĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ пДрДĐČĐŸĐŽŃ‡ĐžĐșа Đž Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа праĐČОл --- -# Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. РуĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ пДрДĐČĐŸĐŽŃ‡ĐžĐșа Đž Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа праĐČОл +# Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. РуĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ пДрДĐČĐŸĐŽŃ‡ĐžĐșа Đž Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа праĐČОл ## Đ˜ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃ ĐŽĐ»Ń Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐŸĐČ ĐżŃ€Đ°ĐČОл Đž пДрДĐČĐŸĐŽŃ‡ĐžĐșĐŸĐČ MathCAT Эта ŃŃ‚Ń€Đ°ĐœĐžŃ†Đ° ĐœĐ°Ń…ĐŸĐŽĐžŃ‚ŃŃ ĐČ ĐżŃ€ĐŸŃ†Đ”ŃŃĐ” ĐżĐŸĐŽĐłĐŸŃ‚ĐŸĐČĐșĐž. diff --git a/docs/ru/index.md b/docs/ru/index.md index a577238ad..1ad5429e1 100644 --- a/docs/ru/index.md +++ b/docs/ru/index.md @@ -5,8 +5,7 @@ ref: index title: MathCAT --- # MathCAT: срДЎстĐČĐŸ ĐŸĐ±Đ”ŃĐżĐ”Ń‡Đ”ĐœĐžŃ ĐŽĐŸŃŃ‚ŃƒĐżĐœĐŸŃŃ‚Đž ĐŒĐ°Ń‚Đ”ĐŒĐ°Ń‚ĐžĐșĐž -Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. -— Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đșа, ĐșĐŸŃ‚ĐŸŃ€Đ°Ń ĐżŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ŃƒĐ”Ń‚ MathML ĐČ: +Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. — Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đșа, ĐșĐŸŃ‚ĐŸŃ€Đ°Ń ĐżŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ŃƒĐ”Ń‚ MathML ĐČ: * тДĐșст ĐŽĐ»Ń ĐŸĐ·ĐČучоĐČĐ°ĐœĐžŃ ŃĐŸ ĐČŃŃ‚Ń€ĐŸĐ”ĐœĐœŃ‹ĐŒĐž ĐșĐŸĐŒĐ°ĐœĐŽĐ°ĐŒĐž ŃĐžĐœŃ‚Đ”Đ·Đ°Ń‚ĐŸŃ€Đ° рДчО; * БраĐčĐ»ŃŒ (ĐșĐŸĐŽ ĐĐ”ĐŒĐ”Ń‚Đ°, Ń‚Đ”Ń…ĐœĐžŃ‡Đ”ŃĐșĐžĐč ĐČĐ°Ń€ĐžĐ°ĐœŃ‚ UEB, а ĐČ ĐŽĐ°Đ»ŃŒĐœĐ”ĐčŃˆĐ”ĐŒ Đž ĐŽŃ€ŃƒĐłĐžĐ” ĐŒĐ°Ń‚Đ”ĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșОД ŃĐžŃŃ‚Đ”ĐŒŃ‹ запОсО БраĐčĐ»Ń); diff --git a/docs/ru/users.md b/docs/ru/users.md index bb4102cc5..f6d61a9e0 100644 --- a/docs/ru/users.md +++ b/docs/ru/users.md @@ -4,7 +4,7 @@ lang: ru ref: users title: РуĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń MathCAT --- -# Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. РуĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń +# Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. РуĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń ## Đ Đ”ĐșĐŸĐŒĐ”ĐœĐŽĐ°Ń†ĐžĐž ĐżĐŸ ĐČŃ‹Đ±ĐŸŃ€Ńƒ ĐłĐŸĐ»ĐŸŃĐ° diff --git a/docs/users_old.md b/docs/users_old.md index 308f74bdb..df32d6a45 100644 --- a/docs/users_old.md +++ b/docs/users_old.md @@ -3,7 +3,7 @@ layout: default lang: en ref: users --- -# Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. User Guide +# Logo for MathCAT. a brown cat sits upright. Its tail swoops down to form the capital letter C in the word MathCAT. User Guide ## Advice on Choosing a Voice From ed724d10b5c4ebe163caf9afef2f0f39630fee89 Mon Sep 17 00:00:00 2001 From: "U-rainshowers\\neils" Date: Fri, 28 Aug 2026 22:21:02 +1000 Subject: [PATCH 080/162] Add logo-inline.png for README and GitHub Pages docs --- docs/logo-inline.png | Bin 0 -> 42032 bytes logo-inline.png | Bin 0 -> 42032 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/logo-inline.png create mode 100644 logo-inline.png diff --git a/docs/logo-inline.png b/docs/logo-inline.png new file mode 100644 index 0000000000000000000000000000000000000000..cdca63cc38743d117de9fa51c4811ea6902337da GIT binary patch literal 42032 zcmbUJcOcd8`v;B}CmosR6xkVv%xtoloaK(u3W(lxN-%@35*B) zG7DSizH+7DKuJzo=hgH^i?6-zLE1(5d)yA8&JLHEM43Q;83Nya7PS(YuOax9Y~P;V zU8ff$kV|K`IrL$ev92kYvndumiOMq2{czJ-im`ZfmC!mts20H!&omH;m;O^{Zm!P7 zw9rCMO8KG}$@?ps$3`h_=-B%=Lw7eS+tbHuaOlKCDF)oJ--4QTu8^$Q70*E#m;y@! z{^S-tYG=dzQwnqy^A89J^S2x+=5JEz|8E^wNiL3ZF5LOA^tq@p0tW*8NxnTjQT~K~ zY;0^kk8lbit!k#^6&1B5zVl$?aUhB0 zY30ph$0u)_jG4p3=+O(8>hC=GTB<(~OmMqjg}Y^uv$Fo#4C46sSk=+7Vs&-(`T6)l zy~CU>-u3G!u8$Czo*jgouWy_4X5&Pmr^K4*+y}Rc-C8Uy9DH$~(}t;PtC*=uvp|D7 z`!s_Z>o|i3rysz9eE9HTU}xzIK&94c0>_xZ-GcO|ai9bF?*ZWj!e+|6_4lQvUmEdd zW@fU6eb+BOOfWKn(JLfM=-LU0q$fQ_=7T@WjU_1h2Rj zdx>Rc?S=<%N=|p<6zK4qDIqVp*zKagIA{uTQdMuRHGm$bwX;Ge6~Wl)s{%>ouLM^4 z9n5=H7_@lQ8dO;*Ev{?i5i(%sHDf53ZzxnFa0-9Sg#WnG)c>ZL3^Mow`ESFX4^z^X zRJt!;69!yNN5o$vZ2I=GTpq(#x%houNRER2gW?)(g5Ny&d+@}KT)xQeXxajuTgyth zZM>R^oTkIBD{bVEOaAj?u_n$n+_hsU_x6czKt^mMWRU&&eX49^!Eop#l2?-kf6pWo zd%_9V8bdzX(dELWkpxIz$h`fZIaNG1vTNIam*+^3s?QU<ay7x&^PyAUrPNSy z4<^M?-?<|!D=Rx#>98Fj{#7Ou=oj0LJh?h%?1`mu6C&=uQ%Ffc;e_{m=2pl3qI@XG zqVgPS?JP-;InG$8xCerQmR((4{n4~y%TZC4%mJFp^332KdZ_hg`ma4)^i>HMBh?>1 zOdlE199vkBQ~*6wrsoR-2_;CaPf&ATE=Y>Up<6@nnP&HJd3pH;`Ldd_d|byd*mU*} zY1(6}=38hgS2}`R2?w-5K!fsS!xQsn8cajPKBrg+W8gbCi6v1w9IQy)3ovjal*cnt z!EvT0@y9St;mwY+%braBjW6-!F%rBHZki1ZBV_c?o9I-n;eKo?NT_MV>ii#x9PH{q8-Ri^9csF^*hpk6HPaEx*w+Uu2s>km$fjc!nsFu}a z*{IC!&wQK)IIhDs7Xn!$F6rW#zG4J3dV_ zNA*J3i=L8sut_M*HJRd8n{gt<iORx)Z|Kn<;cpo^5-lB>=hGgji`D5-*I>-pZ)_e|^wPAKT=@)c$+D{i1YaYowiHKT0 zRb6RweYV=PW|K^|Sad0lscot1VzL^ZS9S49RCCEUE>8QSI-AHhtrUdP`Kx7+gwYn7 z1YQ=EbO3RmjY(dsN6pJ14@X8=oRpQM=?Tu*j0BT^h84`|KzVoCpQM~k*aetiRItdd z!uy}>8iB_8Np)=It-iUW-@aq?%!jwxY%t*L4Joms3ruq=YqQ7n8EkllhQ<1k*XWra z$$V`;jV-;u!;0aU;9I*2TduRubC-!0;!ZuZIJhby#EzTr(`* zN?Lnb%yM5N62xL7Fb)W$K2FQTEsUgSJcaaY<9)5wQga;d)asVk8=iNK?<{Kidbtt1y{t(*5`Hd(6Pzcy&tcdpH6%hh&b0|%{D(`nQct_(Rv zgriF1*`Vo6GHcm?9RuVwaN9jaXR;a{E5sYSPG7+0pUx+vJD$5j#%Wjv%A|~-VHm!; z#Tl?ka647q+x|WO$!5Rsw*~v7J66(?>UeJNT$X!n8eUOn$q_KvI;S$iNHM!$eFPFi z$o=NG6CH?%c_-9HF(3O%b2~|TATHsNgQ2_KAx_T2{50d6b?KiJmzn<_3=HC{a`SWm7|n~>CHd|IK38&}z4KC)r{H(MT<#bDCY zQe&y;=E5UKVw<+_h!0tEQ`{6jTn#5U&xAtb`c>AL59Twj*;J5WRX!f$N>WFeXn2)L zC9m`e&O3q7v^aOAvmh&y;;3~H_A=7Ih_6cHZ6>kMk;Vz>YHxpF!G(=*tR_fD-^9us zcdBbRa_||Q*)R9$+1sh|&J@@wmKjr*9^t#S<<`r&*xL3zZu6N-Us2+G`}S?tZo0zC z`@K{p7;i-09|M6QiTJqRU|>9k|sp-6S1%x&eMX&S1W|IIBgH@y5P9L}6C=C&m;Byo@_;<}c| zq%C?IdRHmlV^DRXbjEH+hQa(!fPNxWBNiGsPq3p;J>6P77{Dn6ZjpZHFM5UUv&Av!GOZ+An$%{z-! zyIE=QxSY*`iJ%r#@X?JWY2l~8wmfOsa_jR&-7bOyiDKrwyYHqi;n^I+tDSM zwwXeovnTu}W6zlP_80k&XN7TFHd-@-rf_%OSu@-67+Bj86iMie)tfdOnMaAC{w)#j3|H##BVIDWzN`Cv$%M z!%cndU8sb^oAaEAv3t0v!CI!pKdH(JreAC3 z+O`#*5x#8#eT`*EC6HC2tX96>x$UY+4eU@wZaXKAqBl1vkE`f+aBud0sgih7_;_P1 z@;^GX>|wl1mCy8kyUxS>uUifNvb+A83tvq@7JEfu+yR;v8UYM{ViPm}SVX=iz2+N^ zT$JZyHPA{!E+Py3N!>du;?Ts?Q;-QogZ@E}s^TqIc=sN8s7ky{rH9AK9vse@PaKU7 z-M>ZeFCSsLNEv`-eP;*_1qBZva_{9da2TG)3MeX%Pqz^=uJq;d1+w4tMxZtk-v>#8 zhK(Ms-fn|`yv^>(B-};yO66{Kv~zXAt-VRJfJs&2+pb;|cr--VqTqWZgN32zg zWHP=YOX7bb7`)`~Sm{U;CVXo1`FYbhx^3ir%8$dR1Ekofjmmj*TG08=PkHCV-)7aW z>w05fza|-izA!3j_OTU&nWP1A6NnIso%7MEl)-ti=Vh)#Cn_Rh16NQ`^Y!&D5({PF zdRrE8I3;@9(t94$$4?%TnV!yPZf+h9S4@28%&KYPk99LSUz?^wpqA@2%HzTj;TVRo zpbt<2`n?DGsY4u2h(&L4is-(yM!S0v^7#)^j#W`H6U!;hE5Q8PRt5UAWLRVP+S56JVVeWC#R7TMjxs#Srz z&pxH*LZChLnvV+pnJSTD>aI%lSXRvf3RKh5Ga|HLl0JO&DV3GLaUUO=7H%5w-#N)a zbUvlNf6x2YOm%iJZ{sGcZ=ClQW*uRy0k#wcgL$~PxbMY6g{JR@4U@{d5Mqz$X_)Eg zU|tm77bXEY$bSMGR=7z+1q%R{BiF5gb&eTbh?&=h|D$>}OEz5ee`H>p0#n41F94me zI$Kfs|X zIP-u0AtZWOFtJix!zajp=Tb54xv2xbWv~qq^_%FW zxxE_v`zEPgR8qa7zFUZneP_jF7|0;xB6!^q z<>{MtrLPH-m2eW0Lyo`5y6#E~Gl*j4bR}q$Br=^>+h#rxpL|cLTcN>oN~bREZF|E` ze)mMSv|wzpayYVH49W2|ep;M)cqUI5_2(Qk@U*!*fA>N^rs5^uO>MWYg8NGv^z}eREIvtc;Ld zVheQM56#&UQXdkpYw~9I%zQ(@ffYF!z^{DW`@+|hiE>YQU`*4h*V2GdRLdAb$c{f? zls#AW-newk#Ath#M+5(PdSm4KrrsUBOTIevtAz7fPTrYR1^b@w;q87*(N6>N4$yf{ z*e9qak*TEi&$90W@xyUXm1RCvb=mCedwl49FliqIa&$#shaZXJ3@gj}ng6%0>lQj& ztVa|L)y)RdjzStJ<sw6t(pR= z0xSpclno>9>q|3QuTL^Y#eUz!Fswf4D=Wg(l-{5qm5@*3+d=43EZJU4SF$`FZnZxF z0qHWKJdf5ViutWevb*vcw6X~TuX~^RJGPixbTQz6y$^Ez*w4>lSln*|pTNhQmZ>Hv z!uY$s5@^mlo{1!-RD9fs+|XqidqK!JFkV!&wIIahi|ln3Jvu5o5?ahSKX9_Ei`>*c zIJr^0hA>MP>-0fie;*%Dq@<=+fd$A%MYE30*Yl->Ca=<1CW*i?p%oAs|If*MFJFlq zft=e{O_jyeAvmd`8T3UE_V49Q$=|K7{`jNoUT;ihq@f-=Sx z1g>C@G4AG&p+h0oCV&2Z{CEAK!OFtf+(KGMhjg{q(M}&>!a+*tLof3dks8mUM#nL& z>auokr!dpsBKUoHSUZ6~eBN4^7q1~0F5-LMEb{7i?o^d!#Ol^oE1SQ~0eJZd-7#7r zOCBFbwFG2H`ji^XjwBo6%^;}TUHU`LKfLQI%2SH2H((Vj<$Sk~he#sAcu={_7V1!8 z35m@}?=b3kNz1FX+`q?*wU--F+5G5;vQ)o9sDAc^iao?d%<_Q*lPQ!J-yoZB#hbIY zodjWFK9M{_L#cz{QA)F(Df?cMsoBjkqPx=e$p?{?(YcbEe2u0e`Ylr)>6+EOODCJ# zwW{_er6n%YkkaC>%aniLJ#XnMRMP#;bs&@JwtUfv9~G_H?sDF;vEvix+)95eqy@$AE*ybP>ZgRLOw zVRyduA^(h{*Y@k8sU)fCX<7G+WopKC?|I?if!%2~mkrTmvzRLiBB2u1jPIPETf6-p z@E7=rN@+)D2Ai9=i4_cGQLvr&mky77xXGZupW{EO>+2`>_V(`c-4+&LVN|@5 z5N29X7Qb&_3}o0?^^r6pkqlu<^3p$fc{%v{hLx0cs8+e$ACHd+y*<^wI3F%+Rt(z{ zACf;zn@(Bw*{(nE5>J3CQhTy8TZq<$;$*wURvr}{=Y^p(Q1U1RloEgQ>UsvaWNB!AG-@`}Kx9^F13-uZb4Eea%om8Busg zr2;Yaji(@yNFzREPI33J`6};Ryn@7AuJsSg;=%_a*LqbZhxX`VE<7U=r7n(~hrvi``u?Uw!neK$~gMtC7yB$mR_Mw zvVmR5z9?WK#~wIRqj<^>kAjC<+`p5x<+i-WhPgf3I18TJ61)2|ju~Tb)iVkdVuWtB z)r_XVf8TOX44v+$6T10{6IQOeqt_MYLHud4BJFVCX6sbO^!^eMUi(_Q z{4tndxhTc>1;}Zp?pfZ?6nQ19>N7tNFNv7@MCSI0i=Ui714T8CJ2eUzT2Edz*)zn& z!0>u=j6cNj{HYe`$K(tARACxvQcBIJy@UvTzu@sj__-}(%H`f8|uh(s;ks zJ+8LS(}@$kRQ(H=&1V0#=WzTWBI1J-ikF{b346m~miJ|nEBgy*o=G3b|u`#k!Pi=qw?X7w8$MU*nCpR7GP z6(<{h-i%V6lA3dgjohzPxYTJoa#^wq?kHLXAU*1Gz4yAHb2y`qywlmS>+aTvZPB4W z{@3XgIRgfoLPC0#X9-iZv+s+$`5Ml4F+>;EaPzdxZ6Z#ViKT0znGTC z_$4K^fPnNe*sZhF(0a?K8J-=)ZS8Af@L9bfrUI33|NUqeHP8`weE^6Bpqr3LJ_Q~{ zy^svBIls;6QUAh4+eKZ+spQ4U-2utdiuL{+$vw^LANygJ0okbL=JgOlWfzz@iVrH? z25O?L3k^W5*K#Y~GK+fgGr7IVgeiRdVBJayCnL%(mfpv@S7x^}YHrZ(#c7+@$IRnt zQIzZG`rqBD30@`g@i}hx#zfG)7FV-9g8;9`Xw~5N?0vkB(%#4P#zg7USrn^CQen2J zYoGYRtTO^Nn1%RSqU(&n?;`66`P3$B!K_O0OR*q5^{SV0KAv}i=!T8RPB*N z*m!4efQMMmOCAk6G$ZxFg5@JjVl$h5q7Ynj{yUxrTY`W$@?Sanr$~SS*qp{@yp4^T zfei9<+a+YB020eR7+*JHB@2Y2w^VZe#0j zLyC=}9`h}48pq`a1B6o9FsURd6&2*-c3%?5GLSa#|B2c%*TJP0tQy&n+9c2k)vf>` zxB|Wv@kY`2_r)*DrLotq+mJI-)c23-!FoNKh7Kxn4uhtuTEB3vS#x}~3&EtPc2Egz zH}5`7Wm1UlzbWa;r>mgdn*(TVeA6j8o|qn4P(q@?bYz2px-XpPh1*~i-ksa%6VR|a zngJYLN*WqMvNrgRl{QX6vTxVx$SOtmFw+q&vIB~i9V$EHoOkP=_U#4~E<>F0C+ErB zCJs#>J}^b(Y;u~86X!oSpKs+;sfrB+vlG0v&#Zdku|>d6A8^C z^FumOW|-g+8FfG41CfBY3v#=3KNQzZ! zqKsdV*JplR=olw!W1TbAj(YuDlH|#{S0;J`Qe=xm8E0dup@2~p^*kT#GZ|M*|EtNO z0X^I(Pg+(miQy6Oxj!%Ue0xJgpB&H1>JRfOO-V&kp?K<#!?1i6*#tUsD##up`0q5K z$7gQ)2NuJ>4=VE#EwErUBG&%PqlbOwmkBZgArJCZh$U}>wNI>wl z$S$=V4J%|B1b9UGY(OMiLQss&-!8U&XTCSrQOS>Bs^C(z*EFWu0H0y#%Xx5=dl-lB zF{Ld{K@KY9yxeTZMnTa!ul(8v@^eW~4_U89>hK)q@n7g#va|j6T_{n~gtJ~_KA&!U z;;ye|#UIGl3K*!<%y1Dzu?HyerOoHa{3V$`Xg!zdPoRu;=~;FSU@pBD3GXqIwp* z7Ny}yq8ortFu!^8rvJlstKDFZ29;66Vgt@FJTlwH{po9)R(bgWs&u zq+7TI9W)KsChpBPOuTn+z~pr`?r*nUv}zL{?|k7FgElzKiH=Q8Q5s$O)tA#0TS8sD z4^xJdwOyQT(^8)PAn{#E3|EHFq2j*q97TqFPO)^6o9DAu!KtS4hO8b}Iz4IFP5_KP z(`8*xLmUl=`a5AFY;v}yKhPCLZLVZ$c(m&b7_N23)Xu}eo~M+utg~=-63hFdjOvs% zT>j@FyrSwH$z46O9CdU>irr7*0Q^pesa;$#))= z@BJEGSQK$tiA@^Sn909go5=p^3oB^u;G-L-P+Wnd39!+UPGOssO2gm5b@4tW!A^}H5d@ESWESU8P38ck`n z(5o=cDlt$c_w33Sx*a|f3BTYf7D=p(Q)b~y&6h<~Q$`D=&#Hdj*qSbb#724hxe%dU zXum#E9V&LpJz{r9m>(7I^R@Bf$sN>fDepF)=%5_{wZse5y3`~dFoqur-fThs!uuKh z*2%Ygu`5}iD5*n$f7iu$J1wqs`@sV@x~J2>l=!#bPg#>vXGvrHKP2Hif;Z;DF%r#- z`#@Co^R1+(rzh>zaYcOnD}r_!ICtYBIDDb-@B$9Mt$rE&H+=p+K&3oDv-`RLSxejs zZjU)pnd5Kg-S~F;k}M-2{gyU}GeUR$O_OUv@gldJYZ)jVorP`99be!{c@Ds`Yg4xT{gFCO8?7MRDmQ2d>LdUpdBd1HvdPA-{@2_6h?G3|K3y+$fiu^-CXn{ykG=r9r z4*Yj_cBEP>Mv=Gj*2vWRR2U6Yr?X` zJ-Vfu_eND7;v+Mz_RC(W&NS0!!9PVOD=gNtr;a-AgX;f8o#%i!72`if&vBdfEfd|H z<+$rVU9+QyIw^>bv4;6A9MD?n{Sun(mPq*B5V)xROI?6Kd!m*47+Zm@g-Tsegb`5- z$w8$uJS(fx&GgA3;$lWsjdow2A$GeR1?vZh72U-0mD}kulVG%Md@lz2niA|nY<{-rJV!dS? zejdcnu1cD87gsndYbcCHnErh6CS#DO|m5;JUAvJz)p~YYo7MXz)C6a0Vby zyIs_dscsA26RK)zX}!HlckQAt-7cvm=HG{Zej$dkCE~tFRnOj8*-}&Cz_TQiwrm+^ zmG@jsw=A1R3@OAYfJ42R1O(<8ii0|{eyw;D+jix@;l6QJf1b0bopxU-we>+?!wm_^ z@a2ocG|T1Ci{0x#O>_*9<=&Pbb;-H#$4_Lp6V@jx7VMh}`E0Rw!RF6?-IZA*jl@z) zhd4#&%CoTV%??R|eR%V?IzR7_@-Yk_KGX6GxZ0MAh^$zRL%;d&bR^ zE-o&QZc1;THu1A%gpMnLT1E?<7lo2W8b`k$6hf1Az<(*?Wh8v>lHXH2ZP>DVu;a8t zSoy9>!xC4Q{GCLVZEE4NQdCzt*7&j2RDQ+Lk20&dtFe@;3DdYJ53a)Nv5P$|(JiI% ze+-x!reGntO3j2+QAN}E(P5-aa_y-lrHzTRk!9YzeJ&M?&7E9_Q~^wR&`&w9bF)Y# zC9|`f>XY>!Y8Ly#Asv_tpB&-UI*3i|Hc^?mvP$TNs8Wtl-& z2DP-`$VFIeW*yJ8of$drEGjww{w}S+0_2Q5v{`JRW6eRDzi7v&wAG#@GpGL15B)vJ zwl@Uf%;(febC_Ek{yWD>jSb$p8v6}S#ABxRC|paTP){+pwoG4R%CahdMJI! zd&~JvX(@*;ymCwJ>FE^5!0}k>_08bK)2=y=N1;yL@D-Ys$FD-azNPGqtKrmH8tik) zx&Qp*<5n*bfq#=M{Z0u1%v0+A{!1&~4KgXgf#Ej0J9+7S$iVz%2(J zZnAYs{!xtfs~QG^9yxXbtm_!x@QcaVeTi&$Tw6U2i-tNaCd}pVGrXlj_4h9oa+5fB zBKKKRgza{&Fg1lf=+l1qS6$EUnPk9u^e-D$!y5`9Lbgrw(hTVVy<)Jc6k+l z9)vb570g#@Z=0`AxxmhO{0|+FDh5EA+#8mHK3`{znaA>&5vA0)Y3# zJrLe=)4wuTK@i`bI~7>0EE77WB%NeAoI{(4lvw#PEFweB*FGn?GAHI@EU6$lL?#uU zqwF-~ZlOb@57V*o8j?QQf<5vdVxn)3Dcv4B@VqmVb4_*E!&5AT`0fTp30&cMQ!u7# zp~1oC^6BEDK-rWA0tEZ$0)SB&OhD_Ulf|!0!YnvrgUp*zg5Fp^CRQ&bm2xE4z+DuC%Q)i*GBP5?tfBZW z`_~*0CZ@>&lgg-@m|Bz~gTJ&vJ7D|oM_ANO)U)_+5Wuj-*PqP8&%ieY39O9(6et!N z(W7+bjL2+%V`@x*APfX8x+$&l1dD4xwt%{T{`yzqq!_s&HM|N~7t)ZxG(Ln!kzNx4 z;6NCn28Qp)qoJWT*mUBR*~IoT>W}pPa+&nd^bIz3Fpz@9 zvMPfT1S0>uHU(ZLprKz02?8gAMi$%tR*FqEloZ&7VTAKht43?Za&h8-2y>)xx488d^muKQZ zASl^Q>6SY{?R;Q(IF|CxotRl3435T63ydb~$hLy6$kS4{wOtVN{~-d1XM@rD&)?tw zQ5N=iSRdo;_Tvn)UCWvyIV`BCa3lYPI>*6>mGJ7!bD&{ASYw3*8Mk4|qnR-$5J?+ECN za^*M(lVZeFuvak)stgO^NeqCx(y`~bBx6zgjeyY$;Ss9x0~-3Fn0g+))m2Ve@>ng6 z00S&MY!T+~9vvJuMv8|IGxYv9Hcinq+nm7~EL+nA?xJPDWEA{#uW~-+1QD5q>D}rO z__w%97JvDu;9Leme=t_8{XokGH5@?SFEuNv{%<|rLNgBSrYBi8+m2GL3Sh-`$a2yi! zyjZCEYe>6z`bSVwK5&Hp<-x~>*Y^*P&=&_e>!3h9OgY#}B(qj&eH4lXN zdMgBA3(SM7+(KyTS05>5X?*Nz$YcM{e{QG%90K<~TipHt3(9RVPL7S41Cb_n&KOYDt3;iSiGmEw}@oJb8jx|MqVA z_m5A@KRY9qr)%vn(?hLIa8?PGN%vtqQQ)Sir)Vtl$_g?qGn0@DYl~ysKSLF*Gy*C) z0sxG^0yQ^0P`ON`ZVusz%UQU#qrfz$=omFnkQ#!D8vxW?2z%P}@P$*Gq^#*XGDV4tA}8 z@|7cS#UkZm0qLMOe3dGGX>Nv}LJ#LXw;B9FBR~HiN9m_0C0nrIbMg$G?@E*K+@}Y+ zJmm*HfouR+Yjkbe%Zui6awNauicN>x@t#e!?}bmb*(W^o1ok1hPe=0Q-&9l#9nqv> zl%|@b;>BY9^diyKVOY?|gSP|(DLh!Nx3O4K;H7$k*b%Hp%S{!giw0C&D=WvzqS5O4w|0E3~(z*E&Oi) zsSecE&V+uz44mH@^)&t^mf4i){WX4(#s4@>m+2Weiwd2N8lR+mY`Yx%($&Mxmpj}*9x3o6yRz8*Wm{OS3OJA za(`=XJ@J*LF0}7w2L0L;E1XvLD=Q1|It+6S^!PPX^da#Y0lAtO_`Jr8e1R}C9gy_6 zF!hSiYf4Tewjq{Zi25@RdjNfj5&7|4w|<7_alY{DKRyo%pJ9Qni;)9(ypgZz!`706 zqYGIH)Ml_~*&c|a5YMwfiv4R)IlDoUn)i|zb9(u^S|9~no>VTl8xBjovvL+$`Cn@| z>n}zMGHKGtC~KC0xw*N)^L8MHfX&~*L}GwFt?QE4fGU%|lMs4(w6lb8avILWMpByC z`dcjSzdpi3j7UzGg;s9>^#h=XpuYDoPlPC+IzJBT>tV%b4*Nz+ZB~jEmmUhEUyO+& z8hB>kA1ccLoYxJX{1?6OeO_(=*Gu>Fi#fWHCnN?zL6&(o7_Q^{_^lz#o#-hX;O1P; zJ;RcryO#$|kDG6SYeOna`i{Zha*Z5=eX9z2$WcIWD}o3y2d8@_1A!9)TGNG|pq zkEvWuV;R359B9=5Q*WXN)GkbX^x%1Oi;-0hVwuN;uK<7b zMdko_qFal-fJ)F*`yu0sGCGWyZFMhR-E?pZs(9CXG!h{C`c}3)I2@W7Ogx{|tQ6_M z@@%GVpbGKfe_bh51!CaGLmL*xa>0YA(+YMO3YBoxZfMP(-0xT6+U@QuPM& zm}m@`L344V{l_iKJcoqTPoX46&!8B5*&`XZ)vuqW2WZB}r3Ywx@IttgnJw3FO7M6z ztC^n{YM`JDuo3|=o(dKW7T%9}mW8*;xkBu)DM4MRG8_!Nz=O*msge8Frf*3DYy7g& z&YAuhqx;C6GCo_A#O&`_tETQavU)>c`T%3b-nUJUdn~a`W2oA3?6dGQpkv7Wfegc09AlnmCy-)Tn zzrirBzM_9r9OPXp(H=rQ(bW@M=qY|g8JR#U=M`4T={Cy3JAauaurS2R2kdiK4|wy= z=mSP2g;ERL7RLMPc*5MSa;h@l>T<=Wq$MPk<-=Jm^PV5HEK7)Cbc&+?yEup;XGwLg zC}GK%DF;40mQc9~W)jb1spI0KV|>@lfrC{Hsk$VsEbrV%oDT;O#^^{L{bH#oix#6= z3Udt-QtvY{!5*;RJy}v*?+rG=(+w$pp}P5g)Lj!HA7N{$_Jp@z`$iJ2P9u9!{uIIY z#;H+d%dfCmVE`+BA*rv$Q1g{bpkm4&BegfG?4e_QGENS4%@0wsFUt7DEFaZ0&}Bko zE!Cf}ZS*LC3zAF zL6MT``BK3-rx~3LupsUt9X<6EuCHNM2A?_8Eh<${Y+C@8L1v4c{PSnH0jt{6ssZRS zb5M`zamP9u0y^bZ?3}jDqDKl z)?Gi@JF`-u4*=RDtp8DNzoh&cB9rBqM9+RwxbsoSqVh%HM9Wg%8cWFt)K*Bl5IoIF zz?H9rF`uNk)RuVy;cQaiP)7mg5g&o1TZlMXdzQdvq1`36t?z&N!gB|zG<3<4AL)m% z!Y@T=pALH%K@WzS&*k#_oTT-PGxDAV3zjA)MQ zP0nw?2N`loI9(Ra(m&Va6OM|%dBC{R>Yzk5pZE^Dez5eCA@HFH$Ns~^21+U_zLu62 zV2Z$R>D@Iy8_NU1Yu=|n&4HNrn~Uh2U+E*P+7N(r0NHQMyva&;5OHkGs7V#R^ zw|!D{=09y!cGflRR(95nQ6s&TfSDojZsyBS8-90!`JpqHjtn zMuA;$B<_25qVc!}MU1Y$LP70M*u;l)$T2)s`56x;G>}#)V7kFsTlZeFlG7aP$>Z?| z1^fn(JMf<@S2e~`1eo*RrIYpBy2#O?2EG9&6&Z!`aAf3S-$Q~<(v`jm>`VW;GnyP$ zXRBA)#}9f2@ZQ)Y*1f+P8AX2zHLaGbA*&A1y^TJ-F9JfCz`|N;@?5G5uECgI_pez1 zXcodYgWJDhnw9m2>$}SX7_IGmP1CyI7~@AI=LEd$MSm1zWAgnc09Xr~zSA=qM$QI# zqNvC7MdGC;M4B3)#`kYBK%%KSDjBA{&mJc zW8T>III@0+m?w$xcEAspZnmD{9P68011q_~lR0?LjV{|;38pbmMwlmD|9PRWdP+12 zapd(Xld1!Rs5)tuA7eHEb2)x_Qe=5u`9|4ctNmF?@rYjOQxDZHvZRnDALL6;E#u8Vku{U z>p!3Um7GSA5%9Y1A=~Y!r(q2S9Ri<5TRc@2Z0ovfN*EuZ{!vr_QM(dy*?D^Ai}NA- zQv9 zbWKOKJ~j>AQf1Nw-d_UIlcggz1WDbam7Thy2zz!<>mV(luByoWvR&8u|Fl!W)F)@} zK6?9xw{B2np3%C%9O=Nmx~xU{ZwFm6-NTvG2Bd%IfnER=K7dMYRCFFYzkZ|pf4x{T zqVsw*Berg;Hr_6G;J@~4Gpqjz$Zj61@ zPpP5+7MZj|{7c1{g=^`*cYty{fg=z_2!JjYxEvm}8)tRon(m$L1L1VW#(IX?H3dv7 z6v`HwHw;pCG^kNbLpyfV|Dwzru?QCsFn^hR<=Rr7o*Yj%(8%~G82b#eM!-fvVVE}& zz^Iizrb|x(^I;!RDslxV{ht;?W{7m+sV84#pM~XS;Cm0J;9FvwV;_MMh!fnZ`EA+r zmZ4S(Kt_<~=+M6@Idr-&7I9{5SBoAEB;Dx)@I!l1Nk#M}%mGT>B;&Q>0kw3u5}DYJ}O8J`gMKHknZyE{u{3Zj34if&DB&*svgmWcIZ*D#9Wpp7*lmX&gswK zz&9J#vK#q~ee0?U0U#g;QGx=7lWJH4z>uh?Rra^EJ0ok}c_%c6nG*chDhI+>nUd0f zg~t!H*GiPsfhZxEoHeO*evM_`+G25Zwt?X5;^_y{M$FY=m@DuDLyHDHq82sC4U4=3 z>e5%R8BRYzh>n${>!Bx3D`^W)3i{ zBqAhC&CaHii&X?N^Tcr#YZT#Sz(*XOWB7-QCEy$_vJgAYkCCsueJ^N%x7(**WJ>wq zA76tJvkYXHi9YM+5Kfh1D$OkW??5^LUGhk`*6`qnjB^S$$Y(cG(|VBM8me=-wkyEo z;e8gkr9AMDGa9IlAR^bQd)U{^03XHn2vDyi(<_9FM#fdvrtl#_3XdEr-M=fw&2j*UU z;Q~t1U%Xai@4Ns$Rh7_Vn%1rOYN@e|30ta?tNhI;m_N&$cauNg6?pdPyzr(7VervD zx4fQNB^eDFOhebTm(NeOg#j3F%+ZR1q^LUHIuG!X6b$buGoYXNA?)or z!tG&VfT4$O7`jX8lA$C-x*McZx?|{+25AtGlt$?eX_QV82?6O2eQ)$R=l?tJxA`(V z?|tnn)>?bdLvNcG|9^KJFDEC54=5s(c6B{#2B&u@(I;tyW?ueaENtCA?6@*MTXCCw zd$u!~{c$~T`M&SjeW(vWPKNTUGaz+a1fXgR2lokT~O%IzTojQS&4Md=q%WEGsq-2sk!L(b?%T&6xhtLCS;= z&F_Yj=qJnpe)6)S22OwZZzHLXlk(qAKm5QpH`D_lugf_O1y@Y6?>Z{AXz0zPK@A)M z|LzvMm%4g3sRII3(gtoOrb}Ffho2tNN|_ILSCgZtt#oC71SKS#0C6-x&&=5YkHg-l z3>$Ckv?KEGNuD7EynRdR73Ej$+&rc2p!ittN8-ez5Slysg%z?9a6EG{12SEWaF zsqKJ{#|Hml8~F#j(AaJDY{;%m@h(9w6P?{gCs!!9vQx`Yx%sth=T2K7&)p%ZR;$)( zIG9azh$V-fBlGg;9RpqF>~F(=C%W{LrB{6GlR;KYP758m-ULuyHWAVz=u_bmXi0Vc z?FT_GLzzs5g<<`SI)6O?USGKLZf7<{vg$vZ0Br`bA-{VO_vDG~PNN#J{<^v&R zYiN9~?Uf9_v00|IIj$nF0MIy&Ecm#ScGOpM+aPK4D z^@B+l_0MhD)j|1JjBtSj)^X~=V#e4-f2~Tcs8<#sQ#g?X zvW%Od0-)#cVjhQl)0rV|1LEZfu$9(nmKCnWLMCK2j;#{wuVq$cN7wZFw}YI6spzR7 zPft&#WXX?|%DqsZ0*=P4Q|1sIs~1Q~O$eyya3?7idQJt^LHYSoIT@CHFCay@GZ?M| z){>|QuzChyb#v?0ofX`E3~?`#qEpaiYJIlP5|3M(B(y}i5ZQNoE?B6Uq^eE!*T@wJ z;P0lxD@4l__ZoNSia1yZNIhWH>M(xXX>WjryC_M5I z_Xh=h26r|Z&2$wvB#&IczPKBwA3qwKn~R#DTt(2RfLt#yRlQT-sDVI3dTMne9jiAa$aY@V5_vf6w}R^=4pHERez>Q4vv6sDhbB}B7AML|D?lcvOr{(aKH2)+%$0$0esjH+ipnw?7-8sqTG z=A~*r1Ek3nz1p4WYer|*nQ^S}Cm{;ilxdD}GFcNjW|qrnUe$axRGHkNuis3wSJ0!& z@>lHMT}AC#rPqh~VEhwHO9MbU90l23Up^Dm3#Acf=#_SXLx}ockdb&OQuU!cq zkvCoWP|yr$YjFVCegHSGYKfHMnO9Xo$R%I*{sWc;gTpU^^DgVZ=w2rXi$Tthfc?Pg z>Ye$6rt|a!Meu4z*ayg7M23^UCF4I_uBIZ=J5Ll@r2Sm%nY`{s{AoqCbY6Uc5$@2n zHa3FUc*M`kg@i}zRZar^cv6;Nk9SIf?e&!6e~WyQlk>>YMbWe;gIM}3>^6}Ip5)ZM4BeC%7j(I>4p5Ju55SMRie z<<$QjfEqv$2zdpH-iuEfcI~px3J6^bnxAK{EPIIiA5!+B$GkjP3$aiU{D1zbcYr2? zv`C-HkX`ykQ9SRmFnq8VrG&!DWR4eK&nq~--WdQbxrcdpzq{#)t36zD&882MLMw?|4<0)eb13a{T!*pirwofJhD^Hr1EI`DqR6%RGT`> zLnGZsFwko4Yy|72H-pe#V9#R)Hvvnr=xEet(lis|YpJS*&-Qlyw{3vaKLe8($ToUk3K7Z&aLGMQ?# z*OcnbHcIl*C$96kWf7Wner2F>dW}6jnPz$WrSkrny5MB870Tb^&!UNR=73>gvCF5H zS7n;aku12sllJWMv}y3M?O|TMb+Sry$}1?xIsdJGz?)b0{mkKd=|rVJsr8Goe6#Bv zCV7@ivr$`p3M?|F1~~C9By^(prGiKM`E8N(V_4*qn(jtCyz-3P*@CGNdHlruZ;oYKo( z>6D}Y(euKUOtq!Ize|PFh0Lb*SiOB)pso`1_WiSE60PeZt2g)RW!VtlPG6i>uGkSA zMb-0bwi-?)?WsRmRvro4X;Fia4VHRt)|tt(TWj&{~eH=0g^RS1B_YC)WJvbD?c*s7+pN=Y1k0)10$^yQM~|cbGAH1}HmFIcQSbpZQ|7sufyH zTeM1%>Nq{<^{lNKKPsaDL6=3wKQ*1i7Le5{834U1KK7642#`&OvF(@G3&e)(>BVc7 zNqbI>V@PC9zZj5HFQXu|7IVD=1U?c12)a$Em;M(|$nf{>+e+!K5(!yz&Tx_AG8UBj|S zj)LKD8)#h402>Z8q(vRB<{n+ZFDw=~dK>e5lJSZuctpkz-wNgH z0l~kE-xZ(K;~BIUrfEqS@k7oHm67Qe<{39$$6Kv+BPX&(pU#-9@?9bW^j#PDW^J9y zKU*fnnD`J3Vk{EOindt^wwmubG-nU?i>DV4Z4mVUK`5XGX!@W9Fvg7fOGOMpt=j*Jf?2ZH0lr1XGf7b_e);p1>%)Y*+7zEt5zv`R8-x*Zt>0FZ} zFOdOMQz>vIZyKK;`(*D_s(sBAyTmB{?C{TIV9Zp%e1tJdt-{XIC5z!@r^B%TuP*yn zkCvzEWZj~}VEbU`f|!ZZ*Ua}6?k~sfie<7o5?(z9l?8-08-*xQ5d)QexpFcKfTnFO zY*eBv0ose2Ao>o}scqPhX>}xSiFUD)%ByixeECJ8f5x!nE$Nbk&Y_EE_Ri?C@Woyv)f`Q z;q7y3pZ+T2j-|JbY1&AmQ)GNG=RPEljj!XwWY9mSesGTGp2EgeP+mjcdS^A3>haaM zHBXOKQ(+rG(1{4z8uE^98Y;*z7W?8fPi9SjB#h44Pf$LRpjg8HADE_AF&8sC zt@x&7(rCdJRux{Cr2~;kO?;tX!=SUY15_&g0X=05QKWvJ8n==m$H`s)rtyT-;k{1| z?b~aUb00o%J?f>sC*K6HR1?OIe~+YV#v>R<>n9eu>~GCvf$u32e~`59D!_E=9EOQ+ zrwC~yJVbQfQt6Cr9tSr6AEZ^B;lJX9WGO!Bb5QIa7Wu-knH<8y=?wL%@&EOU--xXZ*?z_>bX*2%w>2wkaufSi> zyBEa$`CpezD*+(_)+iOzG4;+P{kAe;j_Bvsh!EcYnWIbh#lJDkMW#n`Lkx7xttR%e|(#6c96fiLRi#Yk%H!n+HS_!p}6i+}C{fIf*eDle)due1>v_ z-3G<}+@DSCpM49(&EgI`iQNY1_5vo?y(BsF9dC~tBta}SpjLWBrs_n3N_-v(}S zu7WzB0c?ZqG#z6F4`zbXHm;%r%olv@E@$e`$5Kl~GeSVOqmpSpnq(Cq%|&@oA~dQV z(=-#b=jEBz2eK>-hUi28YhVFr?Dly@9Ar)^>;_}+}Y1*0{A?Z2o5+w zfC?lIB@e)#76h1s{J@q9K0=8G%AaL_mJkHk<+oqS$gLJ^@PLxIx!_R=~w{X1w$13ymkTBv~{= zwF@G25nG~T{k-!m0W?*+RD0!^Jn8lD;$dwno+hBQj3I|2V5?Ku)ZWBYn@TG55^2wx z#0WLZib@9J5hK#+RWE|`r*$EprH(NqT4rh-%XU3VF~a?$F5o@oHOetdF?Snr$jj(* z5E>9SdL0?>z_Ikf3*akM$*he`gv5K){53D%Km6qAi9g&VfSrD5R{hwcaIzCN`%rJ0JLS&nXQl;&qP9moWqG18w>WDeMW5Da(X+ZC}00Vhu0i5;Nk{|e_jI&(F_ zZQXPLmeLr1mm8(2iG=4Rna+%?@k*&3NG(nN3&#^h+-SOWQQJ4=i?6-2nf9LQP_>-x zl{#yI8rVKU*>xQRR7naM41fMC7?32!lo3z(z)c*5a1&#yEqLvnue0yA4(N@xar0D$ zoWSsRQ{hg{IvC_7A)#Gy?0aGhZ18r>Dxn3Bx>scZ{)QDor1iM;-eDXi8HGKnGZ{VJ~?7o&$HUnZM0YzB$ z=X{Y@l@^|=j}ut~bh+H}(2HIc?(5Hg{NQ%vf5NAB?l&~YD=UmsbG>zOSKCOpz{0*O zK%7`0d5H;sv~tp$XlQ7;CjLNgdQc?7uIqVjHcp$gRY{Nm00TTkS1~{__cQhHE9GfB zkT*@e{AE8^_4d8zPY4M5+MtUb4%%t7dWkqap;v7zSoZiSTgOJkQHf~D601G)@R#wtYu=mK03B9O zXNu~#NNjL|k)_kpS*k}9+R@o*z_y@0MB}_u(vmO@NKCEe*R#GbL>#LR5JfhFxr0HieXOj6ck;X@_QVT%qh)|Fqt--sg3&M8xa9H5~F_Uq+S$*^+AvN80|y&r5lCp!M z`nVARHUfaB&e$;$Ocy+RzfwP&S&WmviO@s>%NqRgk!85y5$ED#yk5cN{rhHT{NZZd z*{SQnv%&qRIzWj3X}E9JXOjK7FlZe@N6G~k84`If64^c(8?eeKVN1~;mKLV}mH^NV zqko$`-kgfRJC4MLT;ZzQQL`!@3^wHlsn(=OOnyyZ8@BfrM4*%ZnyJWvaq0x1aiomB z+bn=g{v3yKyZ6gW=|8_ByiDDn3X8e^7#@EKKQxzOECYnvtXsNTrE4$=y*5?!YWc9u z0g=L`Jc0!d%rbjbKl)h~H1x7T>ojr-Ta`*D)7>TIr|m1E2g~EA`@o9opNJIX2;7}T zg1_*U&cwp$vifViz^AEHNA2yGmzNQ%$eSaDY($Njs?BO8@0TKViO9wbKpr?Pg*plI zVjL8@uM}+b(H+i>wJ(DJIVHh{;Ofrfn(rdAHS_E>?dEy@rwZ29MfN)R1Gg{ctaWmZ z0~7YGTLe*o+q62pg=yt*@wJk}=EPNH1K|*>+T47L(Fh)}>ZvhB{|1syWn|JiaW5#6 zrC>%ctXTpdnM<===?rKScKH@eAF9<7ct!}jdTOYrm9}8l#dvgLPCO$}A3}xsD(%)Tr-%!k zuG=)9hl}~~%9>8{%AC0_>&}DF4M(Ni1cRZPGf0Vy-j2?W-cB2qAUPW=oGXC?xKeBBcJPb_#0`zH7BB{_k=qNq=am4L_t9N$U*8cW*_IL~tdsg~_z|vD^4a(RkA@v<>s;&v?27Jqhpj?w&>)fL!D>h}Rz$e6X zha38D=PEcvVVKbsmQ8pt;+gV>5PDA~sZCF?WX7L&?_YdEG zWKEEj(=0!WoRCh%x6Czp7^??bY^z7ua3z1=d#vRWgZ0LG!Q5 z2W8_@-!sf`0u*H+=DhgigEu#Q|Ht{rU#hcpB7i1iiyG)HGF-h$B5 zP+dC0Cp<&}dhU@KPNTbMf%ao>(&|#mvJ6~=+E-88j!X2a^AUaCI zJV~j72V$jZ|Cegk-o!FSw6_>)y81gltYulZU!urQ{l2BXe4_@{W$t=8P0Cd(2Cc^f zp~G`_d_G)}Z_#~Iqr}J8XFd-})bVzO;3$F{yPSqJ`SO)!^z@*RjYN%{hi&(?^=iT| z1*oB>x$MH8*1&+~9tT7Ln=)Rn4f?cZpB@`52oa7L=0707SN!?Mr*R=>+bvqeegv1H zar`;yi9{tguB?T_f1Q6lq8PWqop4*;@6c?CVhbVd-qJyf2#fg6Q$`?^VgAicufc*X zYm#=4gXsN44vdGWC-aU$AZ037tR$AG5bCo2l|A$D-vC_J(2ytG+V(r-TB7_w=Gr6C zeYG+&)Pu35Iofi$C63pdvtwMW;K3EabCe1tp4_6R()EL=LoSJpB)Zg)MKIj9nRJ>u zXUB8?E?hM6a$#PFWXjV_DugtqZ|uEtiCLoG4A~(K5~HehzT$NfG*j+v`CYL|LAhk2 zF-#Pb12@V6)Z=aj6I}{DTRHUYvNH=`J{>OdyIH(A#CAo*LkAg`}S2_ zRB}|Uol!$Y1y$bE!otO1pg)2C`a7VRI1?I=45t?Jc2U(WYm^@oU+YeLLR&}}`FYYC zakrOLC9N;rf)%}Mq6^URa004Z;ijK^dy!x~-`i5dbzf9Kmu^b_JPDn5ScdaIq@?`1AV zn;QDSG8pcLC{`Qne0~RLwXOoMVKD`~sYir45&m0DSCk$?^FQct|MelD{fxL{vqF^% zFlI?%#*qUCFzb$>z-qKG1Yo?u1P2DeX}YF_#t8KQxS+h-^ycY_`1MOkaj|yQ&x3)* z0X;%-Zio}#f?dx401|mC0AG;FkE9+2=0xmC{P?xHBKOpnb!*oB0rmI@me)?bmrIXJ z#KJ5|@}fR+P>k7b=?o3Vl?0oDRN)U8iAcK9h_V|%LtGy%M~Q)_x?25ARekS|Z?5xx zEq`o7M#CXIB3ERBaZ=nRU7~FAOrRVOe_wrzkJNw+b0QTWS)g>STmZv2{IEt#2gLB< zrpDC@be$@?yVI+iigNPd;a|E%-&_du%bw*ZDIiEq?RcYB5e27`@&FU8ePo??Tz`*6 z$*~2KrVrt)y8&;HT}_A{eFC^k+ZQa|i?YC2u;9R5vN&JDGL$%$S+gYne0}kX-bE>Sl>u~iKL;rma4>KD?T3%&HBdV|)SB=?t%<^p8 zcU)~D1ckEjmt@3Qn?2dp*>xfVXC;C!plBHp(I@*yx@MI*?>xZ3L8y3Hn<_bF=QKMd zZLJ}MDyE=YHif&j5RmT>_eY0lIZyrmCI^;C-NPr{-A1avbSk1A*;jhs{XzCe*UfR! z-Rzs8@Ni!UrMgU~9nEtxto=f7hs(HGf9A~&WUUgX?M^`g&`%=5Cam`i_)nSbm2al> z(0t60_-_$6i7R}lKLs7YA^+BWqu_SsY#kt1(mx+Um$9IW<4;48A<;OD7iM{1g*4c5~ z2vMi^XH)Z*IND?;OL1H@0q03~fJg_E&-xI#nEEL0D_xfOS!pT+7V3nnpz$pJ0hN2d z*-o~)xrXMF9NJ{4Jg{Y|HX%&~y=k#a=0pfcLQ_|d<8vuM$IT6p(v2|ueH;@wApUK2 z9;vq?^cqkD(K0l1nk6)iI{Nf_Gve;J4>z{2F5Ro$!CSv8uw%KwS_Lr_VM^q6{)eXY z3fCon@1j&@yQ*RN1IY1*!HkLW-Ke)zlRt3t^@TAVeefJ5h35Q1y86~P-Fic>4_Dh_*~hBcVx4R- zoWeFkrEh+IeZTs2QcQyqm2X>m76w}1x@%KhdB3m4O#P#epk(liV()Lr=4fJjA+20S zJcS_f5!o$IvzKabr2z_D8hY#oX+I;o=J02d@ROHd?US;tqPC0j`&p8)0t7|hfmmew zk)fELo_-ht6Cnde+w(TKAPBE^*RRqlgk`(I^%5T)j)yI@9 zm5BT9S*Q?B;nqq;{cc3#bIc$=fR)VsBdUiY@~Cg4eGdXP;_0a9!i&)-zWV8>wbgj@ zTQ>jQ5icrfY~g-Zc-RA5U!Uq`Y{WDpAHwyG$JR(%FFTbqm4`!~wIWm~BU#GL;mhD& z>(sqc23HG^JZ!<0xGvy9MMC9$hR38>1ARP8$dIb+TH`vd=a}!plkv2f%lm2FW3G%x z{qQ2L5M%_L*9<8oPHr$UF$ajYwP!;L!=AHKW&=<45Jy17GH7VZYYRF9jF}Ig{-_wS z?dy6sIekSMy8ip}<2y0Oa;Ad}@pc4`cG0zCp74{B(fcLfc@|N>O9w*IRMo(0HY#2@ zUUwF7J%amMWFT<7Qi3t(8h}J6iQ5sNS$POZ9ytNDs8#zU|_J?aNR${Hk)f+b$bUdGGpoJ1q=;b;bB21Y*Z|pZN4y1Muf4 z3MOzXu=O{;@XGz9l3#h~HodcZ$DHr~rQ`l|6a}mAY1XKfp+L7cF1I9mc#DqUTx@Kt zQ(pwO6TrAsGj-t@ey=G4M=3aS%wnY9QxuVGAsY;H+nI=#RU9AxED2mVF?y8mC9rl3 z?@BliC1&dse3H|}@vJ9uSgY>KDWw=YNCG-S9XG^{3d$z@zRW(|r9})1?HaIlSZXW} z9&4toV?{9BM{*ZC=_fcO>AIFRyXo{fE4>;2G=aJBVSPP&L^hAdQx18&{_C z)o{4n9W+5AWc{rjm?gEc0YfRPiVD3)1j_cWV4yQ8C`;X9ZE9Fv$#}B-ixDU(wM@V# zvux(x*5~CDp&_aZJkF37;!iG7G;M|2Tdm^9-N*wQxcuO@Fr4pR$8FaX_l{}IJc8F> zN8ZPvz}q~3u?1fMI{E``gn@sicn)TE((`q^i4StW+`arzLf`K7K2|Nt(Rgr=7E=29 zWsyxBHl)~00RrN;SFY>6|D^Crfq_X2!XXVcE#oBQ%Q)_3BR%&CHB)n^{6;&9?Q>X% zvNXEBJY+XdT#+XVvYXlY3WAy7BUA*a9!Yc2ZGsvKN| zyRtpT(MZ3ft39;`Dz~xVW$WQys2A<3^OzSMzi;QeS|2?%1k&_ZpLwyCN!n0r>U9`X=dw3)xL zn&dqnq5lgEzm%*!a9sQEYB1Basl2iAG0cuj#E%>>geCUk`0$N?!KQ9U@HD!@{`r(Z z*5V5quw-$;runUU96UAFt62o#^!=%EGNd~~*^HbFV3k0yZ0PP0Sp=y2PZqy@Oun|A zt73SRVkr{@w76|vl`hn0E2Fmc;YB_&*j1bt15S<>nzM5K<>b%}85Spa>JG^xo-52| z2PLq^P%qm(hcqI?m5(&OlIPn~e{i=$f+cc#STse*k4=?v{mOz1vwbB1?AJ7`)`9Z_ zhIC3+t@i5m7YtoqoCj8A%|Bcgg@bbN_S|x4Ew{TeuQu}h zMYrve@}K(D^|Vl7calq#!M>(L`-RI)77}ER zYGFs$)c6TUBL>na^Nj%2uwl(A&)hXLMW)XlCYZBt3VIkpjhMLZ|cat)bO=VbK_YI=rat{)jsbwPXrZi)AMXnF6ZycQn zU$=85-)m5x5BVb8n{5Ko?qk&J1Vq0mSe_TZbw{tNT94a-}e%#*ritx9iPc2kVybXWm}zGXdt|Ng#IS`UEh>NqE34y>dvE=Gj-wo{QK&F(KgV z0XO7`p(y-fhR&z`ehJ7RoCsyPRFO~xaJWbBEAoA~rbJHvLJ2Aye`CVIR*plN5&xY} z`j^i66$8>$4T((xkTniGaH=>ZfzuC#v08U)2Q3E*A~8z|0-*M*>wkWGc|F`-d{2bC z7-1{i=o0W_q0dfWI*9at*F#+X6ba;C+klHX04Hcc%xty4qX_rb_*(Q{TmmgW5*z18 zp+b_S5Z`-$j?)WRXe3lb=>>TNl)|eaKRM|)o>eE*Sx1ZR8;Mv8DCbB>h&|rFdEJ)Z0Df?!s+<^Ge%Q?tk+@&B1SJ3mI7Q_jpwf^h>(Br_2~`* z+~`$RlbE!Yv81=b>u1T--4c>fM?(SM0+-rD(3QMHRY=rMJw$fz4+GYC2L zTO>YK5S><_q=gtHeJ0*!NZjkjAXR2TrqbTiPl3ZQ@VWIzU;IVX8?v^$qu?b$8e{ja z+Y{fbNP3Frp-?V=90}Zfzds|kVkHg&^y%gpHL83Oz6dF6cDR=+vKt1ssm>8pG3;RZV+}E?8v;zZyBxzns*|i!<>`UW{_4~iIyHe5 zmD^fBAGHGfTV`G85DxHW#__k$ekuqcMvz4&v(0-w{OIXUub9C{e_t`Q)Uu_H$F@nv zJj?vBI@B}{*=V+~nWNopb1?n~G0h6@;XWX6e|WIikl$C39yKuoEkhC7;zz!*)E2xY zZ31bWA-!~zOjaMJ6!je5kmjOsy-i$>r0ik^Srij#Eq{bqo)_wgjX3JCrKKB?RXnF_8|_7dV4y!am5=(fu}L%dF(mK#;(Ot4~3wuzgqj z#J1$yM`v)ACB$Jlv$!K}CV(%dn*R%*a^WA$GLI9Vp{rmQoB@d{>N>|**GqrdB- z!Z^(eOMjpHgb2;_jtVsCSVUcEwoMeJ>&mh1r*9!G@WN{CI*W;=R*U<~@w9WyIeS=9 zEOuq<8k}?qqo>8}FSKlSL}h^CUsCdQ!Scm?)cM5t1{5l3@xNXyR>2Fj%agb)pQ{5# z*l+S%PZ)Cpmy9MRi1Ei6XO#g6=I7JsK_~r1N?KtCUsDx_Dw|oJJ0`xPuR=cVvO%{} zOBrZ5OIX#G`dlNsk(`d#h(xCnT4u{)&uT#P3SK&HVj9_rKc_ftsWu-Aoonvs<<09S?e^ zK|PI(p<}A^1h7%Ne%;QGGb~) zZpBtkw4_W@YbDI43UnZk;fBUGeu}{QLfNPh=baWG1eYY48w3qSNWUa-PGgoU450I8Mf#J%9 zhHm2?$pBnZ`$aa?1`Sj_YjAEX(4J2`*IidwMeYNa5If)T>)aLy+U&wo$F0UEtuGqM zu^$EEmqF@bBp}3q7xWekoMQ~;H3D8{Krd-^NI~&+R)Z8E*~UgLJ4%cLv=(;W5i7nc88J;fNzdE8g& zUQ$kYLFvj}P7Ia(u+8Ik&FyhcyvCNHra8SyoM$GYX4@i?3DB4k4i8C{qWF4>P_umM6LrY8CN!`9EB2|OBfv>I_IolH5pL3M^u|pEb%o85lS#{tL>At5H zNzyslIHmoR?AL2CTfP6dHABtO=Z7yPE0&A`?Bsdw!HMWTQt^e$2kgSXlJ>dZ(k|Bu3<&`}h zE;_3}lQfVeSlb7be(%BsMbj=|qr)7QwamaU(cyR;+PuBeO^R}HdWIY!1*Nlr6PU5v zO!AK#jtHx^L9Px=8abN9j}Or~erD`FL$!W|ebq5;^7_vTy-XtxDlHV5UyW3v?$5hj zv5rtzWzp|;z&kPn*8si8?GSkLT$$<0*xo2raf23o+D=Rb(pZO-oF14*MA`u!I#{q4 z1Yatl2O@L*?8j-_pny0pV`XkgY^O6JsDIWc1zXmCA3cwqJfxu0M+^0qJ7KD zY8?cDdif?;JT^Z8WVw&FUzx7H=Kr2~_!+LAnSKf!;OSRT?i!=1cQNM6J%8?~FXL0hE7qq{}bPaV}Ui%ffIPg##1?uzP( zPI^k+L-Vlv{IT?M=p1yHZD4Gi_p0*_b3N#6Tlwl_h^Fna5(Ie7O4y(sLm&pV0fVX; z#_fqR=M(Q|*~n;L2hB;UHn=|?#=q;jM^c{iL1a3UP)a7-bjlB{?!7OxKQQWd@K6Z` zhL60%C706s6-`;*008Xd0r*ocfSffOCGOVAbn7uy6i4rU9|||L^AEtgMak?03Q$g? z>73tfnK>8>H$51^Y#{|iWR9GGEBB*@u+dI8oddXu{@NI3>xaN2^*Y{MO_DAjN*MTxu+iZdP@C%756wEN zbS;8SNTUQ35hvV zCOO_kignCLD`mvjuj1K!ZPxw>)|vFlI$(dHryKsU!*pZMCDHT9Tq0TsqzW37 zd?t!`^_$26X9-$H6v!-YQ`Zi+2v!=UU};L6q8|>B3vz$ML zq;##DCpDjfZr*S3EP%q4RimVzK@skJ2)y0H2bwFfQdqn00F$k3O^Tp1du^IvV@Q2{ zY~^DYFWtZw8xB@$hSwhPh0tR>K&uLg46Tlw>0+WU7)^q`F_#YElVSur$ok5)87$Hm6AMsqmf6{62R zRDMDq<)dyhL780^lJ;J(~uBfW@71?+TE&ndj)PSmw}iqZO1yHO*)v)a?x#rDTh z<&$R2ovHDaF5j}L9b%ukCn#2ddZLVbXpMzFqiBy(*f@^yD`k%@_76PQMbW3;6m$aBa%k$0%s6EdP8=a)DhBe z-7|$$BPvzPO8Qg-GINZ9qqUc6Xxd~k0=N*`)VjIh==F0gmA*F+E3rxjnSskNT~Fp(n-^FR86kmFTp(bwfE<`($6IzJ>6=<`kOHQsEv%oCWVaMzr3AGpIlvByd?;Gv z-jEQIE3Q(P)nqZL#R~N(EE?95$=r*1f%98Sa@T%uW9)lJD4-<&TF_}lHCL2Z*4%sC zfR70kTptF4sdCPkf#Ymr`sE`bx+t(}e0(iTzT`VMqk@M*yh)Z^`X?x0{r{$Op|nfX zABgydz|?{T%a=&)r+-hgs#;mPR4o$;v?{c>-pd70rhUBiD|m!Tdbi-n(S2a^VWKux5xVTyYg8U~yz%BqMl-#U{Fj_%{ zPfi__xX%uAnS+*@{oJ$b=uy!<<}&F#NT7Lk2(a(dtK?rSm}L2QeX&?$!00_zU2HK| z=1hVPW50bkeY1loDH#lke5gaRGwU=>^N!=g@KgDDT1#8Pl5c4 z)*@bY%bri2_#kU+cwvS#K5<2r;DTx0G}3RNoMLnzhH?bFtLFqL7lade0=K9_On;cg zhw^?_@$Ia_IJemK`DP3PPzx;q=>0y)PslVW&jJxRN&3?kP(uVzJ=u}HBBcG^W-G-# z!F0T~F@ryV%jgcM#wPc+Dr4q`=|B=A6CdBeYy%2j-9~Mm)z|1?8C^6E-z{Z9*_u>O zM~R=j^Oxr1jDgQ0v@##(2NiPcl8=ZQ4C@hq`fpD49d23Ax4moY+Rm#8mI`~LkJQIT z%0ZD+A|=C$4`kX5P0-fi;l5R$#rxP8mPBOP(YAJE-%aK zfxnt}e#|~w`aUqDmN)h+_wQnU3HtCJ_!K3t--}9K15x);h?F-*S5xC|=S{6R567G5 zHZJKHc)&NJq~H?32%gxMEHN^bNDcU(9QX;rA7i4xrve z=5^qv>S%1>RLQbe6}_$a8x+HcGD2H_Q{&fOtl*hu$N<|ARD8RxPulGiLvaTi@9*|} zJ<6E6M#f97m9V4c~AdE^W znLam!FTxRdku3NY?^0!)ig>e%fKwd`jl#@pAU$-(t}!LRN(k>>z=U6V+b8%O9IKB1 z2pC1{Aw*ykL?#C8$CDC3+8nEB0y-jsP?qo z3i)+O@}Vg&W+1JU-=M}tB5To_KhO6#Q8}3ENH2ey4o?OoBooR4tYPw6Q_2-*WJC#) zY71E{SnPo0*N(#|$pO`8*Y(w@;h=}pXQ!wZ5ivN3eN2*+zG)~92;rTVw5DWJVlyma zR@k#^+}V=o>nWopC}AzJgElev+k|yb*&(U*F3LZN#%OJYn80>%J`R}g&xCNeuwVn(#zS71=9W5;KSnDASRyF8GoqPy75_@I} z34rrVXWEyQ%Dtq8qyOa-Xj$5n z9?>4eUZe3FQ4XD)m;hMujZf8U$BLsce^JUZ^)MK22$0r(k5HBgjZz-#>Lcz`0mBb6 zPL~Q0|G&zvJRYjH4G#u`F^;v78D^5QWQ~xqM+-`1NwzV03n`N9z05H7HQ|*Oin5!c zWH%;Mwu+K{5~FOBZ7|_G`rhyTz5jmqALpFE=6;@Mp5Hmwecjjn+$8+d%QNWcSU5Ik z(UYGPXbnTsmSrthO1VJr^vPN|Jx39?B3I+?N4uY7s@rqhPi3OXF&k4vaIhFo9NAfZP^3BG33ZD>f2zSr}q42A!le|Bo;5v z@jNX34RtIjP{jQ3$nyaKRw|=qdEyl_Jh-Q@urO@xTtd5=M~5cN`@oIUjS59`;(3bu zF}y&MZbhJ!48odOi~S|S;?%jPF()vd%5K@3Xv#$dt0zl2Ess9iR0el=h8|pEtW|Gf zc|ek!NZy4RPZJ7gv@NB{vV0JLS&`qDG^%AQja)eMz+fJfI$Q|mIcw;|RS^Ir$D=8t zN>hg{fd11nmU!DM%hKIo=zkE%d#mJliJLpkBo3eOLBxQ?3wmbSTYM+EcrWX}*estK zNzQ2@oNV;%;Z7yAOr-g}cYde_7cz_I>z6uaNP`$Fry~=KMLsM~{YwVm{Z&sluAP=L zi09+u0QyhudhEB%eQ}xNEjP42m|F|4)&&Yz(cabvYDxh! z#bv%d6p&w8ztTnQP~g1ohD3c-4Wt)9OoF?&Z)nP>;)8bx`oxGvv=amU?yHxLFZelj zR0Yrbaro|4gT(%^k#`a}2Qf~L?m5R}X>0z)$ud|46Fcl7ui&Joho5?#^bRVOf2 z_A|nY_eC*o%oZey9Dv2oU_i!?EL++}2=8M~qDuN*8iL<9ZmkW!K7)*7?pzzKyYraw zt|0V660su-q8r`nh@XbY2EVaaF1x%U!pTopxWd(@Fi}-O#^9nNThKumrrWkxJ}h}a zMP9~q|A8k?LB+b_Kj5jB$1xyFz#WA($1e5XCI(0asAh@O2Zu@lo7B3&LxA~LA0_$( z7&e^u(2M5yC4FoBvj&whv0Nusd(R1`0KRV-+Ci(^Yw4DidoSSn1a&}~u$74lqlhRJUJssoRup3ypXK-biD8!3hBtF?2U`2^8 z0g;lYXbHj$%(#4{AtznhrsJ*9ye1U_v0W%u+_5|?}o@IaNK4_3$_X7BTSnmaCx!S zOXY?2^heV0eA;=wSh^NOtloJY7p`I;GfrAugTyiIgSF_R$8=@@7|O$_Pwe%(^6ID; zw#G-%tsYS!AUmPa8oq^+3peWqTwfMnIxq6l~@ou$!q_#AC<|O>N+D z!$wtu@y`&}1MA>Fxse4ZQ*jj8K}jA_i(8=w{M=ZV4%c32<-#n8vKl;Sdp~MFb}Y5D zAJE5YyuMBeD6TQJh&PD+&5*i3;{v&JHExSDUFxX{Srcu!etuEndge{;GMJS~SDv;y zC1~@Jbqj9DlTM-XcM*vkB)f;>EXCA-0mt3c3@YQ2glsnW&0rXNo)~*r(y9zG?f+Iv zY-4(Jy~bw88vMO(?fP&IBfc|f)31sY4~dy51PBV04~JDBBb0^WUxAqVwsci-1F?9& za|cgrjtAfNgovJ-A54tw?id)j!OonxmQXcuK&z{`p*fuPBx!hv*@aFpYPTY2Ob|!!{p=!0m}&K1Os{jlo|@7ZTBDCuj#y_ z88Cp9I0~m~^(5P$Iyo^0@r-GlC%DV@%s|>NkLZ1_tlQM+i z0=`!%RMYYh?z>B@^1r81BNu6#yn0^%hKOoKAr4r1BHVq+Q`?|MZsE5A=-2XCW0-*5 zDFtK_T4E$imJsMHhbsl4mqpS{qMEbVqC%2}P9DDbQFfIS)Zrpn!Fph2uXAnEn(mbP2*-_bN24G)(NZKyPetx9~_HL_3BgbR&}lIEni1%@2= zh@+_;x-k?dR?0n1=wH8gDoqW94=IyYA*M;f_E|&3quM|ju~p@DdcZSHt|dQtlDKeI znB(2-?CiwSa?l^8(k9^!JkTm1-qDAGfh>&N5rEUWs(AxtqN?~&`--M^oAceM3Lz*+ zP*9xuaDRN{yk0sfY|$Nd%9uK5WUZH?y()M%K;#MXlHqaSP@DUMubsNlQulNNiX!z_ z^by|potH5uE=aPi6<+kzdwsV)KV^q5NH7Np3(I*qC}1CxjEJK4GyE>-_g&Aq^~LD( z>S!PT$?6|bxzD_gKXzR1Bl{>#z|)EZiHET2;I5J^nO?grIKH`CP%ih+kg-)g{a^IHl*Vx`Ob=4+sL)T&tnty8W1;Wn#~SNrN@HSTT6Ip@Dl$~+uC_s z6e~Z!z?L)GzBavAd@c4XWs#OikRiu$GL=KZN*At`?aN&Yf9ZWEnXj|jo<%ZgnAPcT zl^@_CPx-*)QyQs@s%tXCaVqC}i}#j5hyevRy(-<``mg!M zHv~wrO03^k#H8Dbqi3Y9_D|ib(pbA?$%b)R2}TD_Caxj@^*`qOau+|9KXajGPY$DVcO4N}P>41R*5!BsamI;GFCrmjM=$SuJ80;i zYPcQzb4#Qby;mHpu9vx4;nlfjCcA&LqG9ob^PniiE>(ZcQGKnMJ-V0yeE@2{#3OzV z`BX-^N6z`{cBG>OeAFko)W-+nTaJif!vN9r{f2^gFi3NGDwI z-xQ+M$TLO*dhfM5umcpC$@u{?)d26QGvYhe@C6hkU+y0gCNy1m{`RJzTS3jyZKosy z>LA9skq^$nWKM6E3do;w_MB;BeP#QfseK7-`|UuSBP*Z~GVlDZa&#eCdrbZlZ?l_V z!~*j#Dykh^SH#en>CNqe%Dzie0ns#eTyw`!ZXqcn(X^N?=|z*02;sdK{l{znj1T!f z?od`9*#c^c>OpN$U*9xO!t2O~#vf)Z)3lDLc)k0J+dKQjdX31XUjJ(>MChC4Cao%u z;+~W7h|KYL6L9jn=&?rom3Qel1NcSgy_sAQ{MXY29?^MSFYqQAJABSDF~-` zukH~G95y=pgUSd6=Ryzj7pgsIweB-q*^UcZws|YPN)$Fg24pH{(PMfV1-FK4LwU}|5$dG-52fV72gUjinL z_dsZkC*lzOk|tDCY(+i_pL0%;Fg`tBZljRdLqLi+9gtJZ*B>vx;91zHSZ&|I-NrOY z2@sV(<%V6MhyC2D6&krK@k^`xnrnJsR{;A`1{{BHwq8+Jg&qUrK~|O-g~HlvuZ=XX zpjH-@uzncWW;d`uIhp^WvX|9!^LZP-W;|NEmS&suoKY*pMMVN<58|wOqA3MjcH}g* zj(iLG<90dcya{fX3YAO6HW`_nhxxIU*Dn9nzV6+{LQTISuipRkBiP-s>4(wTN&fs^ zH`@gVaHoo1WN=1*Sd=vo@`=BrPL23_OKVzg+yM)$#6ksUW6Zo|?lLbpbSRt63U)*w z0dM1DUrLJ#kAA+XX5M-7vvo>|TCrG1Q}O-341ZaClN>O1ebA?&oY>GF{?eegri@i> z|Aa3g!y%=&J8PTWd251Q!b!~iB;eC;phloaK(u3W(lxN-%@35*B) zG7DSizH+7DKuJzo=hgH^i?6-zLE1(5d)yA8&JLHEM43Q;83Nya7PS(YuOax9Y~P;V zU8ff$kV|K`IrL$ev92kYvndumiOMq2{czJ-im`ZfmC!mts20H!&omH;m;O^{Zm!P7 zw9rCMO8KG}$@?ps$3`h_=-B%=Lw7eS+tbHuaOlKCDF)oJ--4QTu8^$Q70*E#m;y@! z{^S-tYG=dzQwnqy^A89J^S2x+=5JEz|8E^wNiL3ZF5LOA^tq@p0tW*8NxnTjQT~K~ zY;0^kk8lbit!k#^6&1B5zVl$?aUhB0 zY30ph$0u)_jG4p3=+O(8>hC=GTB<(~OmMqjg}Y^uv$Fo#4C46sSk=+7Vs&-(`T6)l zy~CU>-u3G!u8$Czo*jgouWy_4X5&Pmr^K4*+y}Rc-C8Uy9DH$~(}t;PtC*=uvp|D7 z`!s_Z>o|i3rysz9eE9HTU}xzIK&94c0>_xZ-GcO|ai9bF?*ZWj!e+|6_4lQvUmEdd zW@fU6eb+BOOfWKn(JLfM=-LU0q$fQ_=7T@WjU_1h2Rj zdx>Rc?S=<%N=|p<6zK4qDIqVp*zKagIA{uTQdMuRHGm$bwX;Ge6~Wl)s{%>ouLM^4 z9n5=H7_@lQ8dO;*Ev{?i5i(%sHDf53ZzxnFa0-9Sg#WnG)c>ZL3^Mow`ESFX4^z^X zRJt!;69!yNN5o$vZ2I=GTpq(#x%houNRER2gW?)(g5Ny&d+@}KT)xQeXxajuTgyth zZM>R^oTkIBD{bVEOaAj?u_n$n+_hsU_x6czKt^mMWRU&&eX49^!Eop#l2?-kf6pWo zd%_9V8bdzX(dELWkpxIz$h`fZIaNG1vTNIam*+^3s?QU<ay7x&^PyAUrPNSy z4<^M?-?<|!D=Rx#>98Fj{#7Ou=oj0LJh?h%?1`mu6C&=uQ%Ffc;e_{m=2pl3qI@XG zqVgPS?JP-;InG$8xCerQmR((4{n4~y%TZC4%mJFp^332KdZ_hg`ma4)^i>HMBh?>1 zOdlE199vkBQ~*6wrsoR-2_;CaPf&ATE=Y>Up<6@nnP&HJd3pH;`Ldd_d|byd*mU*} zY1(6}=38hgS2}`R2?w-5K!fsS!xQsn8cajPKBrg+W8gbCi6v1w9IQy)3ovjal*cnt z!EvT0@y9St;mwY+%braBjW6-!F%rBHZki1ZBV_c?o9I-n;eKo?NT_MV>ii#x9PH{q8-Ri^9csF^*hpk6HPaEx*w+Uu2s>km$fjc!nsFu}a z*{IC!&wQK)IIhDs7Xn!$F6rW#zG4J3dV_ zNA*J3i=L8sut_M*HJRd8n{gt<iORx)Z|Kn<;cpo^5-lB>=hGgji`D5-*I>-pZ)_e|^wPAKT=@)c$+D{i1YaYowiHKT0 zRb6RweYV=PW|K^|Sad0lscot1VzL^ZS9S49RCCEUE>8QSI-AHhtrUdP`Kx7+gwYn7 z1YQ=EbO3RmjY(dsN6pJ14@X8=oRpQM=?Tu*j0BT^h84`|KzVoCpQM~k*aetiRItdd z!uy}>8iB_8Np)=It-iUW-@aq?%!jwxY%t*L4Joms3ruq=YqQ7n8EkllhQ<1k*XWra z$$V`;jV-;u!;0aU;9I*2TduRubC-!0;!ZuZIJhby#EzTr(`* zN?Lnb%yM5N62xL7Fb)W$K2FQTEsUgSJcaaY<9)5wQga;d)asVk8=iNK?<{Kidbtt1y{t(*5`Hd(6Pzcy&tcdpH6%hh&b0|%{D(`nQct_(Rv zgriF1*`Vo6GHcm?9RuVwaN9jaXR;a{E5sYSPG7+0pUx+vJD$5j#%Wjv%A|~-VHm!; z#Tl?ka647q+x|WO$!5Rsw*~v7J66(?>UeJNT$X!n8eUOn$q_KvI;S$iNHM!$eFPFi z$o=NG6CH?%c_-9HF(3O%b2~|TATHsNgQ2_KAx_T2{50d6b?KiJmzn<_3=HC{a`SWm7|n~>CHd|IK38&}z4KC)r{H(MT<#bDCY zQe&y;=E5UKVw<+_h!0tEQ`{6jTn#5U&xAtb`c>AL59Twj*;J5WRX!f$N>WFeXn2)L zC9m`e&O3q7v^aOAvmh&y;;3~H_A=7Ih_6cHZ6>kMk;Vz>YHxpF!G(=*tR_fD-^9us zcdBbRa_||Q*)R9$+1sh|&J@@wmKjr*9^t#S<<`r&*xL3zZu6N-Us2+G`}S?tZo0zC z`@K{p7;i-09|M6QiTJqRU|>9k|sp-6S1%x&eMX&S1W|IIBgH@y5P9L}6C=C&m;Byo@_;<}c| zq%C?IdRHmlV^DRXbjEH+hQa(!fPNxWBNiGsPq3p;J>6P77{Dn6ZjpZHFM5UUv&Av!GOZ+An$%{z-! zyIE=QxSY*`iJ%r#@X?JWY2l~8wmfOsa_jR&-7bOyiDKrwyYHqi;n^I+tDSM zwwXeovnTu}W6zlP_80k&XN7TFHd-@-rf_%OSu@-67+Bj86iMie)tfdOnMaAC{w)#j3|H##BVIDWzN`Cv$%M z!%cndU8sb^oAaEAv3t0v!CI!pKdH(JreAC3 z+O`#*5x#8#eT`*EC6HC2tX96>x$UY+4eU@wZaXKAqBl1vkE`f+aBud0sgih7_;_P1 z@;^GX>|wl1mCy8kyUxS>uUifNvb+A83tvq@7JEfu+yR;v8UYM{ViPm}SVX=iz2+N^ zT$JZyHPA{!E+Py3N!>du;?Ts?Q;-QogZ@E}s^TqIc=sN8s7ky{rH9AK9vse@PaKU7 z-M>ZeFCSsLNEv`-eP;*_1qBZva_{9da2TG)3MeX%Pqz^=uJq;d1+w4tMxZtk-v>#8 zhK(Ms-fn|`yv^>(B-};yO66{Kv~zXAt-VRJfJs&2+pb;|cr--VqTqWZgN32zg zWHP=YOX7bb7`)`~Sm{U;CVXo1`FYbhx^3ir%8$dR1Ekofjmmj*TG08=PkHCV-)7aW z>w05fza|-izA!3j_OTU&nWP1A6NnIso%7MEl)-ti=Vh)#Cn_Rh16NQ`^Y!&D5({PF zdRrE8I3;@9(t94$$4?%TnV!yPZf+h9S4@28%&KYPk99LSUz?^wpqA@2%HzTj;TVRo zpbt<2`n?DGsY4u2h(&L4is-(yM!S0v^7#)^j#W`H6U!;hE5Q8PRt5UAWLRVP+S56JVVeWC#R7TMjxs#Srz z&pxH*LZChLnvV+pnJSTD>aI%lSXRvf3RKh5Ga|HLl0JO&DV3GLaUUO=7H%5w-#N)a zbUvlNf6x2YOm%iJZ{sGcZ=ClQW*uRy0k#wcgL$~PxbMY6g{JR@4U@{d5Mqz$X_)Eg zU|tm77bXEY$bSMGR=7z+1q%R{BiF5gb&eTbh?&=h|D$>}OEz5ee`H>p0#n41F94me zI$Kfs|X zIP-u0AtZWOFtJix!zajp=Tb54xv2xbWv~qq^_%FW zxxE_v`zEPgR8qa7zFUZneP_jF7|0;xB6!^q z<>{MtrLPH-m2eW0Lyo`5y6#E~Gl*j4bR}q$Br=^>+h#rxpL|cLTcN>oN~bREZF|E` ze)mMSv|wzpayYVH49W2|ep;M)cqUI5_2(Qk@U*!*fA>N^rs5^uO>MWYg8NGv^z}eREIvtc;Ld zVheQM56#&UQXdkpYw~9I%zQ(@ffYF!z^{DW`@+|hiE>YQU`*4h*V2GdRLdAb$c{f? zls#AW-newk#Ath#M+5(PdSm4KrrsUBOTIevtAz7fPTrYR1^b@w;q87*(N6>N4$yf{ z*e9qak*TEi&$90W@xyUXm1RCvb=mCedwl49FliqIa&$#shaZXJ3@gj}ng6%0>lQj& ztVa|L)y)RdjzStJ<sw6t(pR= z0xSpclno>9>q|3QuTL^Y#eUz!Fswf4D=Wg(l-{5qm5@*3+d=43EZJU4SF$`FZnZxF z0qHWKJdf5ViutWevb*vcw6X~TuX~^RJGPixbTQz6y$^Ez*w4>lSln*|pTNhQmZ>Hv z!uY$s5@^mlo{1!-RD9fs+|XqidqK!JFkV!&wIIahi|ln3Jvu5o5?ahSKX9_Ei`>*c zIJr^0hA>MP>-0fie;*%Dq@<=+fd$A%MYE30*Yl->Ca=<1CW*i?p%oAs|If*MFJFlq zft=e{O_jyeAvmd`8T3UE_V49Q$=|K7{`jNoUT;ihq@f-=Sx z1g>C@G4AG&p+h0oCV&2Z{CEAK!OFtf+(KGMhjg{q(M}&>!a+*tLof3dks8mUM#nL& z>auokr!dpsBKUoHSUZ6~eBN4^7q1~0F5-LMEb{7i?o^d!#Ol^oE1SQ~0eJZd-7#7r zOCBFbwFG2H`ji^XjwBo6%^;}TUHU`LKfLQI%2SH2H((Vj<$Sk~he#sAcu={_7V1!8 z35m@}?=b3kNz1FX+`q?*wU--F+5G5;vQ)o9sDAc^iao?d%<_Q*lPQ!J-yoZB#hbIY zodjWFK9M{_L#cz{QA)F(Df?cMsoBjkqPx=e$p?{?(YcbEe2u0e`Ylr)>6+EOODCJ# zwW{_er6n%YkkaC>%aniLJ#XnMRMP#;bs&@JwtUfv9~G_H?sDF;vEvix+)95eqy@$AE*ybP>ZgRLOw zVRyduA^(h{*Y@k8sU)fCX<7G+WopKC?|I?if!%2~mkrTmvzRLiBB2u1jPIPETf6-p z@E7=rN@+)D2Ai9=i4_cGQLvr&mky77xXGZupW{EO>+2`>_V(`c-4+&LVN|@5 z5N29X7Qb&_3}o0?^^r6pkqlu<^3p$fc{%v{hLx0cs8+e$ACHd+y*<^wI3F%+Rt(z{ zACf;zn@(Bw*{(nE5>J3CQhTy8TZq<$;$*wURvr}{=Y^p(Q1U1RloEgQ>UsvaWNB!AG-@`}Kx9^F13-uZb4Eea%om8Busg zr2;Yaji(@yNFzREPI33J`6};Ryn@7AuJsSg;=%_a*LqbZhxX`VE<7U=r7n(~hrvi``u?Uw!neK$~gMtC7yB$mR_Mw zvVmR5z9?WK#~wIRqj<^>kAjC<+`p5x<+i-WhPgf3I18TJ61)2|ju~Tb)iVkdVuWtB z)r_XVf8TOX44v+$6T10{6IQOeqt_MYLHud4BJFVCX6sbO^!^eMUi(_Q z{4tndxhTc>1;}Zp?pfZ?6nQ19>N7tNFNv7@MCSI0i=Ui714T8CJ2eUzT2Edz*)zn& z!0>u=j6cNj{HYe`$K(tARACxvQcBIJy@UvTzu@sj__-}(%H`f8|uh(s;ks zJ+8LS(}@$kRQ(H=&1V0#=WzTWBI1J-ikF{b346m~miJ|nEBgy*o=G3b|u`#k!Pi=qw?X7w8$MU*nCpR7GP z6(<{h-i%V6lA3dgjohzPxYTJoa#^wq?kHLXAU*1Gz4yAHb2y`qywlmS>+aTvZPB4W z{@3XgIRgfoLPC0#X9-iZv+s+$`5Ml4F+>;EaPzdxZ6Z#ViKT0znGTC z_$4K^fPnNe*sZhF(0a?K8J-=)ZS8Af@L9bfrUI33|NUqeHP8`weE^6Bpqr3LJ_Q~{ zy^svBIls;6QUAh4+eKZ+spQ4U-2utdiuL{+$vw^LANygJ0okbL=JgOlWfzz@iVrH? z25O?L3k^W5*K#Y~GK+fgGr7IVgeiRdVBJayCnL%(mfpv@S7x^}YHrZ(#c7+@$IRnt zQIzZG`rqBD30@`g@i}hx#zfG)7FV-9g8;9`Xw~5N?0vkB(%#4P#zg7USrn^CQen2J zYoGYRtTO^Nn1%RSqU(&n?;`66`P3$B!K_O0OR*q5^{SV0KAv}i=!T8RPB*N z*m!4efQMMmOCAk6G$ZxFg5@JjVl$h5q7Ynj{yUxrTY`W$@?Sanr$~SS*qp{@yp4^T zfei9<+a+YB020eR7+*JHB@2Y2w^VZe#0j zLyC=}9`h}48pq`a1B6o9FsURd6&2*-c3%?5GLSa#|B2c%*TJP0tQy&n+9c2k)vf>` zxB|Wv@kY`2_r)*DrLotq+mJI-)c23-!FoNKh7Kxn4uhtuTEB3vS#x}~3&EtPc2Egz zH}5`7Wm1UlzbWa;r>mgdn*(TVeA6j8o|qn4P(q@?bYz2px-XpPh1*~i-ksa%6VR|a zngJYLN*WqMvNrgRl{QX6vTxVx$SOtmFw+q&vIB~i9V$EHoOkP=_U#4~E<>F0C+ErB zCJs#>J}^b(Y;u~86X!oSpKs+;sfrB+vlG0v&#Zdku|>d6A8^C z^FumOW|-g+8FfG41CfBY3v#=3KNQzZ! zqKsdV*JplR=olw!W1TbAj(YuDlH|#{S0;J`Qe=xm8E0dup@2~p^*kT#GZ|M*|EtNO z0X^I(Pg+(miQy6Oxj!%Ue0xJgpB&H1>JRfOO-V&kp?K<#!?1i6*#tUsD##up`0q5K z$7gQ)2NuJ>4=VE#EwErUBG&%PqlbOwmkBZgArJCZh$U}>wNI>wl z$S$=V4J%|B1b9UGY(OMiLQss&-!8U&XTCSrQOS>Bs^C(z*EFWu0H0y#%Xx5=dl-lB zF{Ld{K@KY9yxeTZMnTa!ul(8v@^eW~4_U89>hK)q@n7g#va|j6T_{n~gtJ~_KA&!U z;;ye|#UIGl3K*!<%y1Dzu?HyerOoHa{3V$`Xg!zdPoRu;=~;FSU@pBD3GXqIwp* z7Ny}yq8ortFu!^8rvJlstKDFZ29;66Vgt@FJTlwH{po9)R(bgWs&u zq+7TI9W)KsChpBPOuTn+z~pr`?r*nUv}zL{?|k7FgElzKiH=Q8Q5s$O)tA#0TS8sD z4^xJdwOyQT(^8)PAn{#E3|EHFq2j*q97TqFPO)^6o9DAu!KtS4hO8b}Iz4IFP5_KP z(`8*xLmUl=`a5AFY;v}yKhPCLZLVZ$c(m&b7_N23)Xu}eo~M+utg~=-63hFdjOvs% zT>j@FyrSwH$z46O9CdU>irr7*0Q^pesa;$#))= z@BJEGSQK$tiA@^Sn909go5=p^3oB^u;G-L-P+Wnd39!+UPGOssO2gm5b@4tW!A^}H5d@ESWESU8P38ck`n z(5o=cDlt$c_w33Sx*a|f3BTYf7D=p(Q)b~y&6h<~Q$`D=&#Hdj*qSbb#724hxe%dU zXum#E9V&LpJz{r9m>(7I^R@Bf$sN>fDepF)=%5_{wZse5y3`~dFoqur-fThs!uuKh z*2%Ygu`5}iD5*n$f7iu$J1wqs`@sV@x~J2>l=!#bPg#>vXGvrHKP2Hif;Z;DF%r#- z`#@Co^R1+(rzh>zaYcOnD}r_!ICtYBIDDb-@B$9Mt$rE&H+=p+K&3oDv-`RLSxejs zZjU)pnd5Kg-S~F;k}M-2{gyU}GeUR$O_OUv@gldJYZ)jVorP`99be!{c@Ds`Yg4xT{gFCO8?7MRDmQ2d>LdUpdBd1HvdPA-{@2_6h?G3|K3y+$fiu^-CXn{ykG=r9r z4*Yj_cBEP>Mv=Gj*2vWRR2U6Yr?X` zJ-Vfu_eND7;v+Mz_RC(W&NS0!!9PVOD=gNtr;a-AgX;f8o#%i!72`if&vBdfEfd|H z<+$rVU9+QyIw^>bv4;6A9MD?n{Sun(mPq*B5V)xROI?6Kd!m*47+Zm@g-Tsegb`5- z$w8$uJS(fx&GgA3;$lWsjdow2A$GeR1?vZh72U-0mD}kulVG%Md@lz2niA|nY<{-rJV!dS? zejdcnu1cD87gsndYbcCHnErh6CS#DO|m5;JUAvJz)p~YYo7MXz)C6a0Vby zyIs_dscsA26RK)zX}!HlckQAt-7cvm=HG{Zej$dkCE~tFRnOj8*-}&Cz_TQiwrm+^ zmG@jsw=A1R3@OAYfJ42R1O(<8ii0|{eyw;D+jix@;l6QJf1b0bopxU-we>+?!wm_^ z@a2ocG|T1Ci{0x#O>_*9<=&Pbb;-H#$4_Lp6V@jx7VMh}`E0Rw!RF6?-IZA*jl@z) zhd4#&%CoTV%??R|eR%V?IzR7_@-Yk_KGX6GxZ0MAh^$zRL%;d&bR^ zE-o&QZc1;THu1A%gpMnLT1E?<7lo2W8b`k$6hf1Az<(*?Wh8v>lHXH2ZP>DVu;a8t zSoy9>!xC4Q{GCLVZEE4NQdCzt*7&j2RDQ+Lk20&dtFe@;3DdYJ53a)Nv5P$|(JiI% ze+-x!reGntO3j2+QAN}E(P5-aa_y-lrHzTRk!9YzeJ&M?&7E9_Q~^wR&`&w9bF)Y# zC9|`f>XY>!Y8Ly#Asv_tpB&-UI*3i|Hc^?mvP$TNs8Wtl-& z2DP-`$VFIeW*yJ8of$drEGjww{w}S+0_2Q5v{`JRW6eRDzi7v&wAG#@GpGL15B)vJ zwl@Uf%;(febC_Ek{yWD>jSb$p8v6}S#ABxRC|paTP){+pwoG4R%CahdMJI! zd&~JvX(@*;ymCwJ>FE^5!0}k>_08bK)2=y=N1;yL@D-Ys$FD-azNPGqtKrmH8tik) zx&Qp*<5n*bfq#=M{Z0u1%v0+A{!1&~4KgXgf#Ej0J9+7S$iVz%2(J zZnAYs{!xtfs~QG^9yxXbtm_!x@QcaVeTi&$Tw6U2i-tNaCd}pVGrXlj_4h9oa+5fB zBKKKRgza{&Fg1lf=+l1qS6$EUnPk9u^e-D$!y5`9Lbgrw(hTVVy<)Jc6k+l z9)vb570g#@Z=0`AxxmhO{0|+FDh5EA+#8mHK3`{znaA>&5vA0)Y3# zJrLe=)4wuTK@i`bI~7>0EE77WB%NeAoI{(4lvw#PEFweB*FGn?GAHI@EU6$lL?#uU zqwF-~ZlOb@57V*o8j?QQf<5vdVxn)3Dcv4B@VqmVb4_*E!&5AT`0fTp30&cMQ!u7# zp~1oC^6BEDK-rWA0tEZ$0)SB&OhD_Ulf|!0!YnvrgUp*zg5Fp^CRQ&bm2xE4z+DuC%Q)i*GBP5?tfBZW z`_~*0CZ@>&lgg-@m|Bz~gTJ&vJ7D|oM_ANO)U)_+5Wuj-*PqP8&%ieY39O9(6et!N z(W7+bjL2+%V`@x*APfX8x+$&l1dD4xwt%{T{`yzqq!_s&HM|N~7t)ZxG(Ln!kzNx4 z;6NCn28Qp)qoJWT*mUBR*~IoT>W}pPa+&nd^bIz3Fpz@9 zvMPfT1S0>uHU(ZLprKz02?8gAMi$%tR*FqEloZ&7VTAKht43?Za&h8-2y>)xx488d^muKQZ zASl^Q>6SY{?R;Q(IF|CxotRl3435T63ydb~$hLy6$kS4{wOtVN{~-d1XM@rD&)?tw zQ5N=iSRdo;_Tvn)UCWvyIV`BCa3lYPI>*6>mGJ7!bD&{ASYw3*8Mk4|qnR-$5J?+ECN za^*M(lVZeFuvak)stgO^NeqCx(y`~bBx6zgjeyY$;Ss9x0~-3Fn0g+))m2Ve@>ng6 z00S&MY!T+~9vvJuMv8|IGxYv9Hcinq+nm7~EL+nA?xJPDWEA{#uW~-+1QD5q>D}rO z__w%97JvDu;9Leme=t_8{XokGH5@?SFEuNv{%<|rLNgBSrYBi8+m2GL3Sh-`$a2yi! zyjZCEYe>6z`bSVwK5&Hp<-x~>*Y^*P&=&_e>!3h9OgY#}B(qj&eH4lXN zdMgBA3(SM7+(KyTS05>5X?*Nz$YcM{e{QG%90K<~TipHt3(9RVPL7S41Cb_n&KOYDt3;iSiGmEw}@oJb8jx|MqVA z_m5A@KRY9qr)%vn(?hLIa8?PGN%vtqQQ)Sir)Vtl$_g?qGn0@DYl~ysKSLF*Gy*C) z0sxG^0yQ^0P`ON`ZVusz%UQU#qrfz$=omFnkQ#!D8vxW?2z%P}@P$*Gq^#*XGDV4tA}8 z@|7cS#UkZm0qLMOe3dGGX>Nv}LJ#LXw;B9FBR~HiN9m_0C0nrIbMg$G?@E*K+@}Y+ zJmm*HfouR+Yjkbe%Zui6awNauicN>x@t#e!?}bmb*(W^o1ok1hPe=0Q-&9l#9nqv> zl%|@b;>BY9^diyKVOY?|gSP|(DLh!Nx3O4K;H7$k*b%Hp%S{!giw0C&D=WvzqS5O4w|0E3~(z*E&Oi) zsSecE&V+uz44mH@^)&t^mf4i){WX4(#s4@>m+2Weiwd2N8lR+mY`Yx%($&Mxmpj}*9x3o6yRz8*Wm{OS3OJA za(`=XJ@J*LF0}7w2L0L;E1XvLD=Q1|It+6S^!PPX^da#Y0lAtO_`Jr8e1R}C9gy_6 zF!hSiYf4Tewjq{Zi25@RdjNfj5&7|4w|<7_alY{DKRyo%pJ9Qni;)9(ypgZz!`706 zqYGIH)Ml_~*&c|a5YMwfiv4R)IlDoUn)i|zb9(u^S|9~no>VTl8xBjovvL+$`Cn@| z>n}zMGHKGtC~KC0xw*N)^L8MHfX&~*L}GwFt?QE4fGU%|lMs4(w6lb8avILWMpByC z`dcjSzdpi3j7UzGg;s9>^#h=XpuYDoPlPC+IzJBT>tV%b4*Nz+ZB~jEmmUhEUyO+& z8hB>kA1ccLoYxJX{1?6OeO_(=*Gu>Fi#fWHCnN?zL6&(o7_Q^{_^lz#o#-hX;O1P; zJ;RcryO#$|kDG6SYeOna`i{Zha*Z5=eX9z2$WcIWD}o3y2d8@_1A!9)TGNG|pq zkEvWuV;R359B9=5Q*WXN)GkbX^x%1Oi;-0hVwuN;uK<7b zMdko_qFal-fJ)F*`yu0sGCGWyZFMhR-E?pZs(9CXG!h{C`c}3)I2@W7Ogx{|tQ6_M z@@%GVpbGKfe_bh51!CaGLmL*xa>0YA(+YMO3YBoxZfMP(-0xT6+U@QuPM& zm}m@`L344V{l_iKJcoqTPoX46&!8B5*&`XZ)vuqW2WZB}r3Ywx@IttgnJw3FO7M6z ztC^n{YM`JDuo3|=o(dKW7T%9}mW8*;xkBu)DM4MRG8_!Nz=O*msge8Frf*3DYy7g& z&YAuhqx;C6GCo_A#O&`_tETQavU)>c`T%3b-nUJUdn~a`W2oA3?6dGQpkv7Wfegc09AlnmCy-)Tn zzrirBzM_9r9OPXp(H=rQ(bW@M=qY|g8JR#U=M`4T={Cy3JAauaurS2R2kdiK4|wy= z=mSP2g;ERL7RLMPc*5MSa;h@l>T<=Wq$MPk<-=Jm^PV5HEK7)Cbc&+?yEup;XGwLg zC}GK%DF;40mQc9~W)jb1spI0KV|>@lfrC{Hsk$VsEbrV%oDT;O#^^{L{bH#oix#6= z3Udt-QtvY{!5*;RJy}v*?+rG=(+w$pp}P5g)Lj!HA7N{$_Jp@z`$iJ2P9u9!{uIIY z#;H+d%dfCmVE`+BA*rv$Q1g{bpkm4&BegfG?4e_QGENS4%@0wsFUt7DEFaZ0&}Bko zE!Cf}ZS*LC3zAF zL6MT``BK3-rx~3LupsUt9X<6EuCHNM2A?_8Eh<${Y+C@8L1v4c{PSnH0jt{6ssZRS zb5M`zamP9u0y^bZ?3}jDqDKl z)?Gi@JF`-u4*=RDtp8DNzoh&cB9rBqM9+RwxbsoSqVh%HM9Wg%8cWFt)K*Bl5IoIF zz?H9rF`uNk)RuVy;cQaiP)7mg5g&o1TZlMXdzQdvq1`36t?z&N!gB|zG<3<4AL)m% z!Y@T=pALH%K@WzS&*k#_oTT-PGxDAV3zjA)MQ zP0nw?2N`loI9(Ra(m&Va6OM|%dBC{R>Yzk5pZE^Dez5eCA@HFH$Ns~^21+U_zLu62 zV2Z$R>D@Iy8_NU1Yu=|n&4HNrn~Uh2U+E*P+7N(r0NHQMyva&;5OHkGs7V#R^ zw|!D{=09y!cGflRR(95nQ6s&TfSDojZsyBS8-90!`JpqHjtn zMuA;$B<_25qVc!}MU1Y$LP70M*u;l)$T2)s`56x;G>}#)V7kFsTlZeFlG7aP$>Z?| z1^fn(JMf<@S2e~`1eo*RrIYpBy2#O?2EG9&6&Z!`aAf3S-$Q~<(v`jm>`VW;GnyP$ zXRBA)#}9f2@ZQ)Y*1f+P8AX2zHLaGbA*&A1y^TJ-F9JfCz`|N;@?5G5uECgI_pez1 zXcodYgWJDhnw9m2>$}SX7_IGmP1CyI7~@AI=LEd$MSm1zWAgnc09Xr~zSA=qM$QI# zqNvC7MdGC;M4B3)#`kYBK%%KSDjBA{&mJc zW8T>III@0+m?w$xcEAspZnmD{9P68011q_~lR0?LjV{|;38pbmMwlmD|9PRWdP+12 zapd(Xld1!Rs5)tuA7eHEb2)x_Qe=5u`9|4ctNmF?@rYjOQxDZHvZRnDALL6;E#u8Vku{U z>p!3Um7GSA5%9Y1A=~Y!r(q2S9Ri<5TRc@2Z0ovfN*EuZ{!vr_QM(dy*?D^Ai}NA- zQv9 zbWKOKJ~j>AQf1Nw-d_UIlcggz1WDbam7Thy2zz!<>mV(luByoWvR&8u|Fl!W)F)@} zK6?9xw{B2np3%C%9O=Nmx~xU{ZwFm6-NTvG2Bd%IfnER=K7dMYRCFFYzkZ|pf4x{T zqVsw*Berg;Hr_6G;J@~4Gpqjz$Zj61@ zPpP5+7MZj|{7c1{g=^`*cYty{fg=z_2!JjYxEvm}8)tRon(m$L1L1VW#(IX?H3dv7 z6v`HwHw;pCG^kNbLpyfV|Dwzru?QCsFn^hR<=Rr7o*Yj%(8%~G82b#eM!-fvVVE}& zz^Iizrb|x(^I;!RDslxV{ht;?W{7m+sV84#pM~XS;Cm0J;9FvwV;_MMh!fnZ`EA+r zmZ4S(Kt_<~=+M6@Idr-&7I9{5SBoAEB;Dx)@I!l1Nk#M}%mGT>B;&Q>0kw3u5}DYJ}O8J`gMKHknZyE{u{3Zj34if&DB&*svgmWcIZ*D#9Wpp7*lmX&gswK zz&9J#vK#q~ee0?U0U#g;QGx=7lWJH4z>uh?Rra^EJ0ok}c_%c6nG*chDhI+>nUd0f zg~t!H*GiPsfhZxEoHeO*evM_`+G25Zwt?X5;^_y{M$FY=m@DuDLyHDHq82sC4U4=3 z>e5%R8BRYzh>n${>!Bx3D`^W)3i{ zBqAhC&CaHii&X?N^Tcr#YZT#Sz(*XOWB7-QCEy$_vJgAYkCCsueJ^N%x7(**WJ>wq zA76tJvkYXHi9YM+5Kfh1D$OkW??5^LUGhk`*6`qnjB^S$$Y(cG(|VBM8me=-wkyEo z;e8gkr9AMDGa9IlAR^bQd)U{^03XHn2vDyi(<_9FM#fdvrtl#_3XdEr-M=fw&2j*UU z;Q~t1U%Xai@4Ns$Rh7_Vn%1rOYN@e|30ta?tNhI;m_N&$cauNg6?pdPyzr(7VervD zx4fQNB^eDFOhebTm(NeOg#j3F%+ZR1q^LUHIuG!X6b$buGoYXNA?)or z!tG&VfT4$O7`jX8lA$C-x*McZx?|{+25AtGlt$?eX_QV82?6O2eQ)$R=l?tJxA`(V z?|tnn)>?bdLvNcG|9^KJFDEC54=5s(c6B{#2B&u@(I;tyW?ueaENtCA?6@*MTXCCw zd$u!~{c$~T`M&SjeW(vWPKNTUGaz+a1fXgR2lokT~O%IzTojQS&4Md=q%WEGsq-2sk!L(b?%T&6xhtLCS;= z&F_Yj=qJnpe)6)S22OwZZzHLXlk(qAKm5QpH`D_lugf_O1y@Y6?>Z{AXz0zPK@A)M z|LzvMm%4g3sRII3(gtoOrb}Ffho2tNN|_ILSCgZtt#oC71SKS#0C6-x&&=5YkHg-l z3>$Ckv?KEGNuD7EynRdR73Ej$+&rc2p!ittN8-ez5Slysg%z?9a6EG{12SEWaF zsqKJ{#|Hml8~F#j(AaJDY{;%m@h(9w6P?{gCs!!9vQx`Yx%sth=T2K7&)p%ZR;$)( zIG9azh$V-fBlGg;9RpqF>~F(=C%W{LrB{6GlR;KYP758m-ULuyHWAVz=u_bmXi0Vc z?FT_GLzzs5g<<`SI)6O?USGKLZf7<{vg$vZ0Br`bA-{VO_vDG~PNN#J{<^v&R zYiN9~?Uf9_v00|IIj$nF0MIy&Ecm#ScGOpM+aPK4D z^@B+l_0MhD)j|1JjBtSj)^X~=V#e4-f2~Tcs8<#sQ#g?X zvW%Od0-)#cVjhQl)0rV|1LEZfu$9(nmKCnWLMCK2j;#{wuVq$cN7wZFw}YI6spzR7 zPft&#WXX?|%DqsZ0*=P4Q|1sIs~1Q~O$eyya3?7idQJt^LHYSoIT@CHFCay@GZ?M| z){>|QuzChyb#v?0ofX`E3~?`#qEpaiYJIlP5|3M(B(y}i5ZQNoE?B6Uq^eE!*T@wJ z;P0lxD@4l__ZoNSia1yZNIhWH>M(xXX>WjryC_M5I z_Xh=h26r|Z&2$wvB#&IczPKBwA3qwKn~R#DTt(2RfLt#yRlQT-sDVI3dTMne9jiAa$aY@V5_vf6w}R^=4pHERez>Q4vv6sDhbB}B7AML|D?lcvOr{(aKH2)+%$0$0esjH+ipnw?7-8sqTG z=A~*r1Ek3nz1p4WYer|*nQ^S}Cm{;ilxdD}GFcNjW|qrnUe$axRGHkNuis3wSJ0!& z@>lHMT}AC#rPqh~VEhwHO9MbU90l23Up^Dm3#Acf=#_SXLx}ockdb&OQuU!cq zkvCoWP|yr$YjFVCegHSGYKfHMnO9Xo$R%I*{sWc;gTpU^^DgVZ=w2rXi$Tthfc?Pg z>Ye$6rt|a!Meu4z*ayg7M23^UCF4I_uBIZ=J5Ll@r2Sm%nY`{s{AoqCbY6Uc5$@2n zHa3FUc*M`kg@i}zRZar^cv6;Nk9SIf?e&!6e~WyQlk>>YMbWe;gIM}3>^6}Ip5)ZM4BeC%7j(I>4p5Ju55SMRie z<<$QjfEqv$2zdpH-iuEfcI~px3J6^bnxAK{EPIIiA5!+B$GkjP3$aiU{D1zbcYr2? zv`C-HkX`ykQ9SRmFnq8VrG&!DWR4eK&nq~--WdQbxrcdpzq{#)t36zD&882MLMw?|4<0)eb13a{T!*pirwofJhD^Hr1EI`DqR6%RGT`> zLnGZsFwko4Yy|72H-pe#V9#R)Hvvnr=xEet(lis|YpJS*&-Qlyw{3vaKLe8($ToUk3K7Z&aLGMQ?# z*OcnbHcIl*C$96kWf7Wner2F>dW}6jnPz$WrSkrny5MB870Tb^&!UNR=73>gvCF5H zS7n;aku12sllJWMv}y3M?O|TMb+Sry$}1?xIsdJGz?)b0{mkKd=|rVJsr8Goe6#Bv zCV7@ivr$`p3M?|F1~~C9By^(prGiKM`E8N(V_4*qn(jtCyz-3P*@CGNdHlruZ;oYKo( z>6D}Y(euKUOtq!Ize|PFh0Lb*SiOB)pso`1_WiSE60PeZt2g)RW!VtlPG6i>uGkSA zMb-0bwi-?)?WsRmRvro4X;Fia4VHRt)|tt(TWj&{~eH=0g^RS1B_YC)WJvbD?c*s7+pN=Y1k0)10$^yQM~|cbGAH1}HmFIcQSbpZQ|7sufyH zTeM1%>Nq{<^{lNKKPsaDL6=3wKQ*1i7Le5{834U1KK7642#`&OvF(@G3&e)(>BVc7 zNqbI>V@PC9zZj5HFQXu|7IVD=1U?c12)a$Em;M(|$nf{>+e+!K5(!yz&Tx_AG8UBj|S zj)LKD8)#h402>Z8q(vRB<{n+ZFDw=~dK>e5lJSZuctpkz-wNgH z0l~kE-xZ(K;~BIUrfEqS@k7oHm67Qe<{39$$6Kv+BPX&(pU#-9@?9bW^j#PDW^J9y zKU*fnnD`J3Vk{EOindt^wwmubG-nU?i>DV4Z4mVUK`5XGX!@W9Fvg7fOGOMpt=j*Jf?2ZH0lr1XGf7b_e);p1>%)Y*+7zEt5zv`R8-x*Zt>0FZ} zFOdOMQz>vIZyKK;`(*D_s(sBAyTmB{?C{TIV9Zp%e1tJdt-{XIC5z!@r^B%TuP*yn zkCvzEWZj~}VEbU`f|!ZZ*Ua}6?k~sfie<7o5?(z9l?8-08-*xQ5d)QexpFcKfTnFO zY*eBv0ose2Ao>o}scqPhX>}xSiFUD)%ByixeECJ8f5x!nE$Nbk&Y_EE_Ri?C@Woyv)f`Q z;q7y3pZ+T2j-|JbY1&AmQ)GNG=RPEljj!XwWY9mSesGTGp2EgeP+mjcdS^A3>haaM zHBXOKQ(+rG(1{4z8uE^98Y;*z7W?8fPi9SjB#h44Pf$LRpjg8HADE_AF&8sC zt@x&7(rCdJRux{Cr2~;kO?;tX!=SUY15_&g0X=05QKWvJ8n==m$H`s)rtyT-;k{1| z?b~aUb00o%J?f>sC*K6HR1?OIe~+YV#v>R<>n9eu>~GCvf$u32e~`59D!_E=9EOQ+ zrwC~yJVbQfQt6Cr9tSr6AEZ^B;lJX9WGO!Bb5QIa7Wu-knH<8y=?wL%@&EOU--xXZ*?z_>bX*2%w>2wkaufSi> zyBEa$`CpezD*+(_)+iOzG4;+P{kAe;j_Bvsh!EcYnWIbh#lJDkMW#n`Lkx7xttR%e|(#6c96fiLRi#Yk%H!n+HS_!p}6i+}C{fIf*eDle)due1>v_ z-3G<}+@DSCpM49(&EgI`iQNY1_5vo?y(BsF9dC~tBta}SpjLWBrs_n3N_-v(}S zu7WzB0c?ZqG#z6F4`zbXHm;%r%olv@E@$e`$5Kl~GeSVOqmpSpnq(Cq%|&@oA~dQV z(=-#b=jEBz2eK>-hUi28YhVFr?Dly@9Ar)^>;_}+}Y1*0{A?Z2o5+w zfC?lIB@e)#76h1s{J@q9K0=8G%AaL_mJkHk<+oqS$gLJ^@PLxIx!_R=~w{X1w$13ymkTBv~{= zwF@G25nG~T{k-!m0W?*+RD0!^Jn8lD;$dwno+hBQj3I|2V5?Ku)ZWBYn@TG55^2wx z#0WLZib@9J5hK#+RWE|`r*$EprH(NqT4rh-%XU3VF~a?$F5o@oHOetdF?Snr$jj(* z5E>9SdL0?>z_Ikf3*akM$*he`gv5K){53D%Km6qAi9g&VfSrD5R{hwcaIzCN`%rJ0JLS&nXQl;&qP9moWqG18w>WDeMW5Da(X+ZC}00Vhu0i5;Nk{|e_jI&(F_ zZQXPLmeLr1mm8(2iG=4Rna+%?@k*&3NG(nN3&#^h+-SOWQQJ4=i?6-2nf9LQP_>-x zl{#yI8rVKU*>xQRR7naM41fMC7?32!lo3z(z)c*5a1&#yEqLvnue0yA4(N@xar0D$ zoWSsRQ{hg{IvC_7A)#Gy?0aGhZ18r>Dxn3Bx>scZ{)QDor1iM;-eDXi8HGKnGZ{VJ~?7o&$HUnZM0YzB$ z=X{Y@l@^|=j}ut~bh+H}(2HIc?(5Hg{NQ%vf5NAB?l&~YD=UmsbG>zOSKCOpz{0*O zK%7`0d5H;sv~tp$XlQ7;CjLNgdQc?7uIqVjHcp$gRY{Nm00TTkS1~{__cQhHE9GfB zkT*@e{AE8^_4d8zPY4M5+MtUb4%%t7dWkqap;v7zSoZiSTgOJkQHf~D601G)@R#wtYu=mK03B9O zXNu~#NNjL|k)_kpS*k}9+R@o*z_y@0MB}_u(vmO@NKCEe*R#GbL>#LR5JfhFxr0HieXOj6ck;X@_QVT%qh)|Fqt--sg3&M8xa9H5~F_Uq+S$*^+AvN80|y&r5lCp!M z`nVARHUfaB&e$;$Ocy+RzfwP&S&WmviO@s>%NqRgk!85y5$ED#yk5cN{rhHT{NZZd z*{SQnv%&qRIzWj3X}E9JXOjK7FlZe@N6G~k84`If64^c(8?eeKVN1~;mKLV}mH^NV zqko$`-kgfRJC4MLT;ZzQQL`!@3^wHlsn(=OOnyyZ8@BfrM4*%ZnyJWvaq0x1aiomB z+bn=g{v3yKyZ6gW=|8_ByiDDn3X8e^7#@EKKQxzOECYnvtXsNTrE4$=y*5?!YWc9u z0g=L`Jc0!d%rbjbKl)h~H1x7T>ojr-Ta`*D)7>TIr|m1E2g~EA`@o9opNJIX2;7}T zg1_*U&cwp$vifViz^AEHNA2yGmzNQ%$eSaDY($Njs?BO8@0TKViO9wbKpr?Pg*plI zVjL8@uM}+b(H+i>wJ(DJIVHh{;Ofrfn(rdAHS_E>?dEy@rwZ29MfN)R1Gg{ctaWmZ z0~7YGTLe*o+q62pg=yt*@wJk}=EPNH1K|*>+T47L(Fh)}>ZvhB{|1syWn|JiaW5#6 zrC>%ctXTpdnM<===?rKScKH@eAF9<7ct!}jdTOYrm9}8l#dvgLPCO$}A3}xsD(%)Tr-%!k zuG=)9hl}~~%9>8{%AC0_>&}DF4M(Ni1cRZPGf0Vy-j2?W-cB2qAUPW=oGXC?xKeBBcJPb_#0`zH7BB{_k=qNq=am4L_t9N$U*8cW*_IL~tdsg~_z|vD^4a(RkA@v<>s;&v?27Jqhpj?w&>)fL!D>h}Rz$e6X zha38D=PEcvVVKbsmQ8pt;+gV>5PDA~sZCF?WX7L&?_YdEG zWKEEj(=0!WoRCh%x6Czp7^??bY^z7ua3z1=d#vRWgZ0LG!Q5 z2W8_@-!sf`0u*H+=DhgigEu#Q|Ht{rU#hcpB7i1iiyG)HGF-h$B5 zP+dC0Cp<&}dhU@KPNTbMf%ao>(&|#mvJ6~=+E-88j!X2a^AUaCI zJV~j72V$jZ|Cegk-o!FSw6_>)y81gltYulZU!urQ{l2BXe4_@{W$t=8P0Cd(2Cc^f zp~G`_d_G)}Z_#~Iqr}J8XFd-})bVzO;3$F{yPSqJ`SO)!^z@*RjYN%{hi&(?^=iT| z1*oB>x$MH8*1&+~9tT7Ln=)Rn4f?cZpB@`52oa7L=0707SN!?Mr*R=>+bvqeegv1H zar`;yi9{tguB?T_f1Q6lq8PWqop4*;@6c?CVhbVd-qJyf2#fg6Q$`?^VgAicufc*X zYm#=4gXsN44vdGWC-aU$AZ037tR$AG5bCo2l|A$D-vC_J(2ytG+V(r-TB7_w=Gr6C zeYG+&)Pu35Iofi$C63pdvtwMW;K3EabCe1tp4_6R()EL=LoSJpB)Zg)MKIj9nRJ>u zXUB8?E?hM6a$#PFWXjV_DugtqZ|uEtiCLoG4A~(K5~HehzT$NfG*j+v`CYL|LAhk2 zF-#Pb12@V6)Z=aj6I}{DTRHUYvNH=`J{>OdyIH(A#CAo*LkAg`}S2_ zRB}|Uol!$Y1y$bE!otO1pg)2C`a7VRI1?I=45t?Jc2U(WYm^@oU+YeLLR&}}`FYYC zakrOLC9N;rf)%}Mq6^URa004Z;ijK^dy!x~-`i5dbzf9Kmu^b_JPDn5ScdaIq@?`1AV zn;QDSG8pcLC{`Qne0~RLwXOoMVKD`~sYir45&m0DSCk$?^FQct|MelD{fxL{vqF^% zFlI?%#*qUCFzb$>z-qKG1Yo?u1P2DeX}YF_#t8KQxS+h-^ycY_`1MOkaj|yQ&x3)* z0X;%-Zio}#f?dx401|mC0AG;FkE9+2=0xmC{P?xHBKOpnb!*oB0rmI@me)?bmrIXJ z#KJ5|@}fR+P>k7b=?o3Vl?0oDRN)U8iAcK9h_V|%LtGy%M~Q)_x?25ARekS|Z?5xx zEq`o7M#CXIB3ERBaZ=nRU7~FAOrRVOe_wrzkJNw+b0QTWS)g>STmZv2{IEt#2gLB< zrpDC@be$@?yVI+iigNPd;a|E%-&_du%bw*ZDIiEq?RcYB5e27`@&FU8ePo??Tz`*6 z$*~2KrVrt)y8&;HT}_A{eFC^k+ZQa|i?YC2u;9R5vN&JDGL$%$S+gYne0}kX-bE>Sl>u~iKL;rma4>KD?T3%&HBdV|)SB=?t%<^p8 zcU)~D1ckEjmt@3Qn?2dp*>xfVXC;C!plBHp(I@*yx@MI*?>xZ3L8y3Hn<_bF=QKMd zZLJ}MDyE=YHif&j5RmT>_eY0lIZyrmCI^;C-NPr{-A1avbSk1A*;jhs{XzCe*UfR! z-Rzs8@Ni!UrMgU~9nEtxto=f7hs(HGf9A~&WUUgX?M^`g&`%=5Cam`i_)nSbm2al> z(0t60_-_$6i7R}lKLs7YA^+BWqu_SsY#kt1(mx+Um$9IW<4;48A<;OD7iM{1g*4c5~ z2vMi^XH)Z*IND?;OL1H@0q03~fJg_E&-xI#nEEL0D_xfOS!pT+7V3nnpz$pJ0hN2d z*-o~)xrXMF9NJ{4Jg{Y|HX%&~y=k#a=0pfcLQ_|d<8vuM$IT6p(v2|ueH;@wApUK2 z9;vq?^cqkD(K0l1nk6)iI{Nf_Gve;J4>z{2F5Ro$!CSv8uw%KwS_Lr_VM^q6{)eXY z3fCon@1j&@yQ*RN1IY1*!HkLW-Ke)zlRt3t^@TAVeefJ5h35Q1y86~P-Fic>4_Dh_*~hBcVx4R- zoWeFkrEh+IeZTs2QcQyqm2X>m76w}1x@%KhdB3m4O#P#epk(liV()Lr=4fJjA+20S zJcS_f5!o$IvzKabr2z_D8hY#oX+I;o=J02d@ROHd?US;tqPC0j`&p8)0t7|hfmmew zk)fELo_-ht6Cnde+w(TKAPBE^*RRqlgk`(I^%5T)j)yI@9 zm5BT9S*Q?B;nqq;{cc3#bIc$=fR)VsBdUiY@~Cg4eGdXP;_0a9!i&)-zWV8>wbgj@ zTQ>jQ5icrfY~g-Zc-RA5U!Uq`Y{WDpAHwyG$JR(%FFTbqm4`!~wIWm~BU#GL;mhD& z>(sqc23HG^JZ!<0xGvy9MMC9$hR38>1ARP8$dIb+TH`vd=a}!plkv2f%lm2FW3G%x z{qQ2L5M%_L*9<8oPHr$UF$ajYwP!;L!=AHKW&=<45Jy17GH7VZYYRF9jF}Ig{-_wS z?dy6sIekSMy8ip}<2y0Oa;Ad}@pc4`cG0zCp74{B(fcLfc@|N>O9w*IRMo(0HY#2@ zUUwF7J%amMWFT<7Qi3t(8h}J6iQ5sNS$POZ9ytNDs8#zU|_J?aNR${Hk)f+b$bUdGGpoJ1q=;b;bB21Y*Z|pZN4y1Muf4 z3MOzXu=O{;@XGz9l3#h~HodcZ$DHr~rQ`l|6a}mAY1XKfp+L7cF1I9mc#DqUTx@Kt zQ(pwO6TrAsGj-t@ey=G4M=3aS%wnY9QxuVGAsY;H+nI=#RU9AxED2mVF?y8mC9rl3 z?@BliC1&dse3H|}@vJ9uSgY>KDWw=YNCG-S9XG^{3d$z@zRW(|r9})1?HaIlSZXW} z9&4toV?{9BM{*ZC=_fcO>AIFRyXo{fE4>;2G=aJBVSPP&L^hAdQx18&{_C z)o{4n9W+5AWc{rjm?gEc0YfRPiVD3)1j_cWV4yQ8C`;X9ZE9Fv$#}B-ixDU(wM@V# zvux(x*5~CDp&_aZJkF37;!iG7G;M|2Tdm^9-N*wQxcuO@Fr4pR$8FaX_l{}IJc8F> zN8ZPvz}q~3u?1fMI{E``gn@sicn)TE((`q^i4StW+`arzLf`K7K2|Nt(Rgr=7E=29 zWsyxBHl)~00RrN;SFY>6|D^Crfq_X2!XXVcE#oBQ%Q)_3BR%&CHB)n^{6;&9?Q>X% zvNXEBJY+XdT#+XVvYXlY3WAy7BUA*a9!Yc2ZGsvKN| zyRtpT(MZ3ft39;`Dz~xVW$WQys2A<3^OzSMzi;QeS|2?%1k&_ZpLwyCN!n0r>U9`X=dw3)xL zn&dqnq5lgEzm%*!a9sQEYB1Basl2iAG0cuj#E%>>geCUk`0$N?!KQ9U@HD!@{`r(Z z*5V5quw-$;runUU96UAFt62o#^!=%EGNd~~*^HbFV3k0yZ0PP0Sp=y2PZqy@Oun|A zt73SRVkr{@w76|vl`hn0E2Fmc;YB_&*j1bt15S<>nzM5K<>b%}85Spa>JG^xo-52| z2PLq^P%qm(hcqI?m5(&OlIPn~e{i=$f+cc#STse*k4=?v{mOz1vwbB1?AJ7`)`9Z_ zhIC3+t@i5m7YtoqoCj8A%|Bcgg@bbN_S|x4Ew{TeuQu}h zMYrve@}K(D^|Vl7calq#!M>(L`-RI)77}ER zYGFs$)c6TUBL>na^Nj%2uwl(A&)hXLMW)XlCYZBt3VIkpjhMLZ|cat)bO=VbK_YI=rat{)jsbwPXrZi)AMXnF6ZycQn zU$=85-)m5x5BVb8n{5Ko?qk&J1Vq0mSe_TZbw{tNT94a-}e%#*ritx9iPc2kVybXWm}zGXdt|Ng#IS`UEh>NqE34y>dvE=Gj-wo{QK&F(KgV z0XO7`p(y-fhR&z`ehJ7RoCsyPRFO~xaJWbBEAoA~rbJHvLJ2Aye`CVIR*plN5&xY} z`j^i66$8>$4T((xkTniGaH=>ZfzuC#v08U)2Q3E*A~8z|0-*M*>wkWGc|F`-d{2bC z7-1{i=o0W_q0dfWI*9at*F#+X6ba;C+klHX04Hcc%xty4qX_rb_*(Q{TmmgW5*z18 zp+b_S5Z`-$j?)WRXe3lb=>>TNl)|eaKRM|)o>eE*Sx1ZR8;Mv8DCbB>h&|rFdEJ)Z0Df?!s+<^Ge%Q?tk+@&B1SJ3mI7Q_jpwf^h>(Br_2~`* z+~`$RlbE!Yv81=b>u1T--4c>fM?(SM0+-rD(3QMHRY=rMJw$fz4+GYC2L zTO>YK5S><_q=gtHeJ0*!NZjkjAXR2TrqbTiPl3ZQ@VWIzU;IVX8?v^$qu?b$8e{ja z+Y{fbNP3Frp-?V=90}Zfzds|kVkHg&^y%gpHL83Oz6dF6cDR=+vKt1ssm>8pG3;RZV+}E?8v;zZyBxzns*|i!<>`UW{_4~iIyHe5 zmD^fBAGHGfTV`G85DxHW#__k$ekuqcMvz4&v(0-w{OIXUub9C{e_t`Q)Uu_H$F@nv zJj?vBI@B}{*=V+~nWNopb1?n~G0h6@;XWX6e|WIikl$C39yKuoEkhC7;zz!*)E2xY zZ31bWA-!~zOjaMJ6!je5kmjOsy-i$>r0ik^Srij#Eq{bqo)_wgjX3JCrKKB?RXnF_8|_7dV4y!am5=(fu}L%dF(mK#;(Ot4~3wuzgqj z#J1$yM`v)ACB$Jlv$!K}CV(%dn*R%*a^WA$GLI9Vp{rmQoB@d{>N>|**GqrdB- z!Z^(eOMjpHgb2;_jtVsCSVUcEwoMeJ>&mh1r*9!G@WN{CI*W;=R*U<~@w9WyIeS=9 zEOuq<8k}?qqo>8}FSKlSL}h^CUsCdQ!Scm?)cM5t1{5l3@xNXyR>2Fj%agb)pQ{5# z*l+S%PZ)Cpmy9MRi1Ei6XO#g6=I7JsK_~r1N?KtCUsDx_Dw|oJJ0`xPuR=cVvO%{} zOBrZ5OIX#G`dlNsk(`d#h(xCnT4u{)&uT#P3SK&HVj9_rKc_ftsWu-Aoonvs<<09S?e^ zK|PI(p<}A^1h7%Ne%;QGGb~) zZpBtkw4_W@YbDI43UnZk;fBUGeu}{QLfNPh=baWG1eYY48w3qSNWUa-PGgoU450I8Mf#J%9 zhHm2?$pBnZ`$aa?1`Sj_YjAEX(4J2`*IidwMeYNa5If)T>)aLy+U&wo$F0UEtuGqM zu^$EEmqF@bBp}3q7xWekoMQ~;H3D8{Krd-^NI~&+R)Z8E*~UgLJ4%cLv=(;W5i7nc88J;fNzdE8g& zUQ$kYLFvj}P7Ia(u+8Ik&FyhcyvCNHra8SyoM$GYX4@i?3DB4k4i8C{qWF4>P_umM6LrY8CN!`9EB2|OBfv>I_IolH5pL3M^u|pEb%o85lS#{tL>At5H zNzyslIHmoR?AL2CTfP6dHABtO=Z7yPE0&A`?Bsdw!HMWTQt^e$2kgSXlJ>dZ(k|Bu3<&`}h zE;_3}lQfVeSlb7be(%BsMbj=|qr)7QwamaU(cyR;+PuBeO^R}HdWIY!1*Nlr6PU5v zO!AK#jtHx^L9Px=8abN9j}Or~erD`FL$!W|ebq5;^7_vTy-XtxDlHV5UyW3v?$5hj zv5rtzWzp|;z&kPn*8si8?GSkLT$$<0*xo2raf23o+D=Rb(pZO-oF14*MA`u!I#{q4 z1Yatl2O@L*?8j-_pny0pV`XkgY^O6JsDIWc1zXmCA3cwqJfxu0M+^0qJ7KD zY8?cDdif?;JT^Z8WVw&FUzx7H=Kr2~_!+LAnSKf!;OSRT?i!=1cQNM6J%8?~FXL0hE7qq{}bPaV}Ui%ffIPg##1?uzP( zPI^k+L-Vlv{IT?M=p1yHZD4Gi_p0*_b3N#6Tlwl_h^Fna5(Ie7O4y(sLm&pV0fVX; z#_fqR=M(Q|*~n;L2hB;UHn=|?#=q;jM^c{iL1a3UP)a7-bjlB{?!7OxKQQWd@K6Z` zhL60%C706s6-`;*008Xd0r*ocfSffOCGOVAbn7uy6i4rU9|||L^AEtgMak?03Q$g? z>73tfnK>8>H$51^Y#{|iWR9GGEBB*@u+dI8oddXu{@NI3>xaN2^*Y{MO_DAjN*MTxu+iZdP@C%756wEN zbS;8SNTUQ35hvV zCOO_kignCLD`mvjuj1K!ZPxw>)|vFlI$(dHryKsU!*pZMCDHT9Tq0TsqzW37 zd?t!`^_$26X9-$H6v!-YQ`Zi+2v!=UU};L6q8|>B3vz$ML zq;##DCpDjfZr*S3EP%q4RimVzK@skJ2)y0H2bwFfQdqn00F$k3O^Tp1du^IvV@Q2{ zY~^DYFWtZw8xB@$hSwhPh0tR>K&uLg46Tlw>0+WU7)^q`F_#YElVSur$ok5)87$Hm6AMsqmf6{62R zRDMDq<)dyhL780^lJ;J(~uBfW@71?+TE&ndj)PSmw}iqZO1yHO*)v)a?x#rDTh z<&$R2ovHDaF5j}L9b%ukCn#2ddZLVbXpMzFqiBy(*f@^yD`k%@_76PQMbW3;6m$aBa%k$0%s6EdP8=a)DhBe z-7|$$BPvzPO8Qg-GINZ9qqUc6Xxd~k0=N*`)VjIh==F0gmA*F+E3rxjnSskNT~Fp(n-^FR86kmFTp(bwfE<`($6IzJ>6=<`kOHQsEv%oCWVaMzr3AGpIlvByd?;Gv z-jEQIE3Q(P)nqZL#R~N(EE?95$=r*1f%98Sa@T%uW9)lJD4-<&TF_}lHCL2Z*4%sC zfR70kTptF4sdCPkf#Ymr`sE`bx+t(}e0(iTzT`VMqk@M*yh)Z^`X?x0{r{$Op|nfX zABgydz|?{T%a=&)r+-hgs#;mPR4o$;v?{c>-pd70rhUBiD|m!Tdbi-n(S2a^VWKux5xVTyYg8U~yz%BqMl-#U{Fj_%{ zPfi__xX%uAnS+*@{oJ$b=uy!<<}&F#NT7Lk2(a(dtK?rSm}L2QeX&?$!00_zU2HK| z=1hVPW50bkeY1loDH#lke5gaRGwU=>^N!=g@KgDDT1#8Pl5c4 z)*@bY%bri2_#kU+cwvS#K5<2r;DTx0G}3RNoMLnzhH?bFtLFqL7lade0=K9_On;cg zhw^?_@$Ia_IJemK`DP3PPzx;q=>0y)PslVW&jJxRN&3?kP(uVzJ=u}HBBcG^W-G-# z!F0T~F@ryV%jgcM#wPc+Dr4q`=|B=A6CdBeYy%2j-9~Mm)z|1?8C^6E-z{Z9*_u>O zM~R=j^Oxr1jDgQ0v@##(2NiPcl8=ZQ4C@hq`fpD49d23Ax4moY+Rm#8mI`~LkJQIT z%0ZD+A|=C$4`kX5P0-fi;l5R$#rxP8mPBOP(YAJE-%aK zfxnt}e#|~w`aUqDmN)h+_wQnU3HtCJ_!K3t--}9K15x);h?F-*S5xC|=S{6R567G5 zHZJKHc)&NJq~H?32%gxMEHN^bNDcU(9QX;rA7i4xrve z=5^qv>S%1>RLQbe6}_$a8x+HcGD2H_Q{&fOtl*hu$N<|ARD8RxPulGiLvaTi@9*|} zJ<6E6M#f97m9V4c~AdE^W znLam!FTxRdku3NY?^0!)ig>e%fKwd`jl#@pAU$-(t}!LRN(k>>z=U6V+b8%O9IKB1 z2pC1{Aw*ykL?#C8$CDC3+8nEB0y-jsP?qo z3i)+O@}Vg&W+1JU-=M}tB5To_KhO6#Q8}3ENH2ey4o?OoBooR4tYPw6Q_2-*WJC#) zY71E{SnPo0*N(#|$pO`8*Y(w@;h=}pXQ!wZ5ivN3eN2*+zG)~92;rTVw5DWJVlyma zR@k#^+}V=o>nWopC}AzJgElev+k|yb*&(U*F3LZN#%OJYn80>%J`R}g&xCNeuwVn(#zS71=9W5;KSnDASRyF8GoqPy75_@I} z34rrVXWEyQ%Dtq8qyOa-Xj$5n z9?>4eUZe3FQ4XD)m;hMujZf8U$BLsce^JUZ^)MK22$0r(k5HBgjZz-#>Lcz`0mBb6 zPL~Q0|G&zvJRYjH4G#u`F^;v78D^5QWQ~xqM+-`1NwzV03n`N9z05H7HQ|*Oin5!c zWH%;Mwu+K{5~FOBZ7|_G`rhyTz5jmqALpFE=6;@Mp5Hmwecjjn+$8+d%QNWcSU5Ik z(UYGPXbnTsmSrthO1VJr^vPN|Jx39?B3I+?N4uY7s@rqhPi3OXF&k4vaIhFo9NAfZP^3BG33ZD>f2zSr}q42A!le|Bo;5v z@jNX34RtIjP{jQ3$nyaKRw|=qdEyl_Jh-Q@urO@xTtd5=M~5cN`@oIUjS59`;(3bu zF}y&MZbhJ!48odOi~S|S;?%jPF()vd%5K@3Xv#$dt0zl2Ess9iR0el=h8|pEtW|Gf zc|ek!NZy4RPZJ7gv@NB{vV0JLS&`qDG^%AQja)eMz+fJfI$Q|mIcw;|RS^Ir$D=8t zN>hg{fd11nmU!DM%hKIo=zkE%d#mJliJLpkBo3eOLBxQ?3wmbSTYM+EcrWX}*estK zNzQ2@oNV;%;Z7yAOr-g}cYde_7cz_I>z6uaNP`$Fry~=KMLsM~{YwVm{Z&sluAP=L zi09+u0QyhudhEB%eQ}xNEjP42m|F|4)&&Yz(cabvYDxh! z#bv%d6p&w8ztTnQP~g1ohD3c-4Wt)9OoF?&Z)nP>;)8bx`oxGvv=amU?yHxLFZelj zR0Yrbaro|4gT(%^k#`a}2Qf~L?m5R}X>0z)$ud|46Fcl7ui&Joho5?#^bRVOf2 z_A|nY_eC*o%oZey9Dv2oU_i!?EL++}2=8M~qDuN*8iL<9ZmkW!K7)*7?pzzKyYraw zt|0V660su-q8r`nh@XbY2EVaaF1x%U!pTopxWd(@Fi}-O#^9nNThKumrrWkxJ}h}a zMP9~q|A8k?LB+b_Kj5jB$1xyFz#WA($1e5XCI(0asAh@O2Zu@lo7B3&LxA~LA0_$( z7&e^u(2M5yC4FoBvj&whv0Nusd(R1`0KRV-+Ci(^Yw4DidoSSn1a&}~u$74lqlhRJUJssoRup3ypXK-biD8!3hBtF?2U`2^8 z0g;lYXbHj$%(#4{AtznhrsJ*9ye1U_v0W%u+_5|?}o@IaNK4_3$_X7BTSnmaCx!S zOXY?2^heV0eA;=wSh^NOtloJY7p`I;GfrAugTyiIgSF_R$8=@@7|O$_Pwe%(^6ID; zw#G-%tsYS!AUmPa8oq^+3peWqTwfMnIxq6l~@ou$!q_#AC<|O>N+D z!$wtu@y`&}1MA>Fxse4ZQ*jj8K}jA_i(8=w{M=ZV4%c32<-#n8vKl;Sdp~MFb}Y5D zAJE5YyuMBeD6TQJh&PD+&5*i3;{v&JHExSDUFxX{Srcu!etuEndge{;GMJS~SDv;y zC1~@Jbqj9DlTM-XcM*vkB)f;>EXCA-0mt3c3@YQ2glsnW&0rXNo)~*r(y9zG?f+Iv zY-4(Jy~bw88vMO(?fP&IBfc|f)31sY4~dy51PBV04~JDBBb0^WUxAqVwsci-1F?9& za|cgrjtAfNgovJ-A54tw?id)j!OonxmQXcuK&z{`p*fuPBx!hv*@aFpYPTY2Ob|!!{p=!0m}&K1Os{jlo|@7ZTBDCuj#y_ z88Cp9I0~m~^(5P$Iyo^0@r-GlC%DV@%s|>NkLZ1_tlQM+i z0=`!%RMYYh?z>B@^1r81BNu6#yn0^%hKOoKAr4r1BHVq+Q`?|MZsE5A=-2XCW0-*5 zDFtK_T4E$imJsMHhbsl4mqpS{qMEbVqC%2}P9DDbQFfIS)Zrpn!Fph2uXAnEn(mbP2*-_bN24G)(NZKyPetx9~_HL_3BgbR&}lIEni1%@2= zh@+_;x-k?dR?0n1=wH8gDoqW94=IyYA*M;f_E|&3quM|ju~p@DdcZSHt|dQtlDKeI znB(2-?CiwSa?l^8(k9^!JkTm1-qDAGfh>&N5rEUWs(AxtqN?~&`--M^oAceM3Lz*+ zP*9xuaDRN{yk0sfY|$Nd%9uK5WUZH?y()M%K;#MXlHqaSP@DUMubsNlQulNNiX!z_ z^by|potH5uE=aPi6<+kzdwsV)KV^q5NH7Np3(I*qC}1CxjEJK4GyE>-_g&Aq^~LD( z>S!PT$?6|bxzD_gKXzR1Bl{>#z|)EZiHET2;I5J^nO?grIKH`CP%ih+kg-)g{a^IHl*Vx`Ob=4+sL)T&tnty8W1;Wn#~SNrN@HSTT6Ip@Dl$~+uC_s z6e~Z!z?L)GzBavAd@c4XWs#OikRiu$GL=KZN*At`?aN&Yf9ZWEnXj|jo<%ZgnAPcT zl^@_CPx-*)QyQs@s%tXCaVqC}i}#j5hyevRy(-<``mg!M zHv~wrO03^k#H8Dbqi3Y9_D|ib(pbA?$%b)R2}TD_Caxj@^*`qOau+|9KXajGPY$DVcO4N}P>41R*5!BsamI;GFCrmjM=$SuJ80;i zYPcQzb4#Qby;mHpu9vx4;nlfjCcA&LqG9ob^PniiE>(ZcQGKnMJ-V0yeE@2{#3OzV z`BX-^N6z`{cBG>OeAFko)W-+nTaJif!vN9r{f2^gFi3NGDwI z-xQ+M$TLO*dhfM5umcpC$@u{?)d26QGvYhe@C6hkU+y0gCNy1m{`RJzTS3jyZKosy z>LA9skq^$nWKM6E3do;w_MB;BeP#QfseK7-`|UuSBP*Z~GVlDZa&#eCdrbZlZ?l_V z!~*j#Dykh^SH#en>CNqe%Dzie0ns#eTyw`!ZXqcn(X^N?=|z*02;sdK{l{znj1T!f z?od`9*#c^c>OpN$U*9xO!t2O~#vf)Z)3lDLc)k0J+dKQjdX31XUjJ(>MChC4Cao%u z;+~W7h|KYL6L9jn=&?rom3Qel1NcSgy_sAQ{MXY29?^MSFYqQAJABSDF~-` zukH~G95y=pgUSd6=Ryzj7pgsIweB-q*^UcZws|YPN)$Fg24pH{(PMfV1-FK4LwU}|5$dG-52fV72gUjinL z_dsZkC*lzOk|tDCY(+i_pL0%;Fg`tBZljRdLqLi+9gtJZ*B>vx;91zHSZ&|I-NrOY z2@sV(<%V6MhyC2D6&krK@k^`xnrnJsR{;A`1{{BHwq8+Jg&qUrK~|O-g~HlvuZ=XX zpjH-@uzncWW;d`uIhp^WvX|9!^LZP-W;|NEmS&suoKY*pMMVN<58|wOqA3MjcH}g* zj(iLG<90dcya{fX3YAO6HW`_nhxxIU*Dn9nzV6+{LQTISuipRkBiP-s>4(wTN&fs^ zH`@gVaHoo1WN=1*Sd=vo@`=BrPL23_OKVzg+yM)$#6ksUW6Zo|?lLbpbSRt63U)*w z0dM1DUrLJ#kAA+XX5M-7vvo>|TCrG1Q}O-341ZaClN>O1ebA?&oY>GF{?eegri@i> z|Aa3g!y%=&J8PTWd251Q!b!~iB;eC;ph Date: Tue, 1 Sep 2026 11:46:45 +0200 Subject: [PATCH 081/162] Cred to Greek translators --- docs/index.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index b4283d1d5..9a34a7b71 100644 --- a/docs/index.md +++ b/docs/index.md @@ -173,13 +173,14 @@ Translators: * Finnish -- Sami MÀÀttĂ€ (Accessibility Library Celia), and Essi Viippola (freelancer) * French -- Olivier Thiffault (Technologies Humanware) * German -- Nazli Andjic, Robert Graf and Paul Libbrecht (IU International University of Applied Sciences), and Moritz Groß (Math4VIP, Marburg University) +* Greek -- Theodora Antonakopoulou and Paraskevi Riga (National and Kapodistrian University of Athens) * Hungarian -- Attila Hammer (IT Foundation for the Visually Impaired) * Indonesian -- Dr. Pinta Deniyanti Sampoerno, M.Si; Dr. Meiliasari, S.Pd., M.Sc; and Ari Hendarno, S.Pd., M.Kom. -* Norwegian -- Marthe Gjelstad (National Library of Norway), Kvile +* Norwegian -- Marthe Gjelstad (National Library of Norway) and Kvile * Polish -- MichaƂ Dziwisz (Fundacja Instytut Rozwoju Regionalnego) * Russian (both speech and braille) -- Danil Kostenkov * Spanish -- Noelia Ruiz MartĂ­nez (also helped with NVDA add-on development) and MarĂ­a Allo RoldĂĄn -* Swedish -- Tim Arborealis Lötberg (MTM), and Anders Eklund (SPSM) +* Swedish -- Tim Arborealis Lötberg (MTM) and Anders Eklund (SPSM) * Vietnamese -- Dang Hoai PhĂșc and Trang Pham * Others??? -- please volunteer so I can list you here... From 0932ffb8f4f0429518b28dd06071316d389a9b0b Mon Sep 17 00:00:00 2001 From: K4itsit Date: Wed, 2 Sep 2026 20:18:10 +0800 Subject: [PATCH 082/162] Fix outdated MathCAT project URLs (#732) Co-authored-by: k4its1t <306379390+k4its1t@users.noreply.github.com> --- Cargo.toml | 6 +++--- README.md | 2 +- Rules/Braille/ASCIIMath/ASCIIMath_Rules.yaml | 2 +- Rules/Braille/French/French_Rules.yaml | 2 +- Rules/Braille/LaTeX/LaTeX_Rules.yaml | 2 +- Rules/Braille/Nemeth/Nemeth_Rules.yaml | 4 ++-- Rules/Braille/Swedish/Swedish_Rules.yaml | 2 +- Rules/Braille/UEB/UEB_Rules.yaml | 2 +- Rules/Braille/Vietnam/Vietnam_Rules.yaml | 2 +- Rules/Intent/general.yaml | 2 +- docs/helpers_old.md | 2 +- docs/ru/helpers.md | 2 +- src/canonicalize.rs | 2 +- src/chemistry.rs | 2 +- src/navigate.rs | 2 +- src/speech.rs | 2 +- src/xpath_functions.rs | 2 +- tests/braille/Nemeth/other.rs | 14 +++++++------- tests/braille/Nemeth/rules.rs | 6 +++--- tests/braille/UEB/iceb.rs | 2 +- tests/braille/UEB/other.rs | 10 +++++----- 21 files changed, 36 insertions(+), 36 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 67522e0b3..fcf5428d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,9 +4,9 @@ version = "0.7.7-alpha.1" authors = ["Neil Soiffer "] license = "MIT" description = "MathCAT: Math Capable Assistive Technology ('Speech and braille from MathML')" -repository = "https://github.com/NSoiffer/MathCAT" -homepage = "https://nsoiffer.github.io/MathCAT/" -documentation = "https://nsoiffer.github.io/MathCAT/" +repository = "https://github.com/daisy/MathCAT" +homepage = "https://daisy.github.io/MathCAT/" +documentation = "https://daisy.github.io/MathCAT/" edition = "2024" exclude = ["src/main.rs", "docs", "BrailleDocs", "PythonScripts"] # should have "Rules/", but then one can't run build.rs to build the zip file diff --git a/README.md b/README.md index bf974dc3b..0ee92c6fa 100644 --- a/README.md +++ b/README.md @@ -16,4 +16,4 @@ There are four related projects that make use of MathCAT: MathCAT is used in many assistive technologies including NVDA and JAWS. -For more information, see the [full documentation](https://nsoiffer.github.io/MathCAT/). +For more information, see the [full documentation](https://daisy.github.io/MathCAT/). diff --git a/Rules/Braille/ASCIIMath/ASCIIMath_Rules.yaml b/Rules/Braille/ASCIIMath/ASCIIMath_Rules.yaml index d3cb9d090..edae6abab 100644 --- a/Rules/Braille/ASCIIMath/ASCIIMath_Rules.yaml +++ b/Rules/Braille/ASCIIMath/ASCIIMath_Rules.yaml @@ -223,7 +223,7 @@ # FIX: what should be output name: mhchem-hack # this captures the output for the mhchem's "<=>", "<<=>", and "<=>>" output (there are no Unicode arrows for them) - # this isn't a perfect match, but should be good enough and allows merging all three (see github.com/NSoiffer/MathCAT/issues/60) + # this isn't a perfect match, but should be good enough and allows merging all three (see github.com/daisy/MathCAT/issues/60) tag: mover match: - "*[1][substring(., 1, 1)='↜'] and" diff --git a/Rules/Braille/French/French_Rules.yaml b/Rules/Braille/French/French_Rules.yaml index 46c74a15c..f3514cebf 100644 --- a/Rules/Braille/French/French_Rules.yaml +++ b/Rules/Braille/French/French_Rules.yaml @@ -326,7 +326,7 @@ - name: mhchem-hack # this captures the output for the mhchem's "<=>", "<<=>", and "<=>>" output (there are no Unicode arrows for them) - # this isn't a perfect match, but should be good enough and allows merging all three (see github.com/NSoiffer/MathCAT/issues/60) + # this isn't a perfect match, but should be good enough and allows merging all three (see github.com/daisy/MathCAT/issues/60) tag: mover match: - "*[1][substring(., 1, 1)='↜'] and" diff --git a/Rules/Braille/LaTeX/LaTeX_Rules.yaml b/Rules/Braille/LaTeX/LaTeX_Rules.yaml index 315192dde..b9237dee0 100644 --- a/Rules/Braille/LaTeX/LaTeX_Rules.yaml +++ b/Rules/Braille/LaTeX/LaTeX_Rules.yaml @@ -235,7 +235,7 @@ # FIX: what should be output name: mhchem-hack # this captures the output for the mhchem's "<=>", "<<=>", and "<=>>" output (there are no Unicode arrows for them) - # this isn't a perfect match, but should be good enough and allows merging all three (see github.com/NSoiffer/MathCAT/issues/60) + # this isn't a perfect match, but should be good enough and allows merging all three (see github.com/daisy/MathCAT/issues/60) tag: mover match: - "*[1][substring(., 1, 1)='↜'] and" diff --git a/Rules/Braille/Nemeth/Nemeth_Rules.yaml b/Rules/Braille/Nemeth/Nemeth_Rules.yaml index 4fe821d0c..b5f74e562 100644 --- a/Rules/Braille/Nemeth/Nemeth_Rules.yaml +++ b/Rules/Braille/Nemeth/Nemeth_Rules.yaml @@ -164,7 +164,7 @@ replace: - test: if: "preceding-sibling::*" - then: [t: "W⣍"] # github.com/NSoiffer/MathCAT/issues/43#issuecomment-1297048039 + then: [t: "W⣍"] # github.com/daisy/MathCAT/issues/43#issuecomment-1297048039 - test: if: .[self::m:mlabeledtr] then: [x: "*[position()>1]"] @@ -900,7 +900,7 @@ - # this captures the output for the mhchem's "<=>", "<<=>", and "<=>>" output (there are no Unicode arrows for them) - # this isn't a perfect match, but should be good enough and allows merging all three (see github.com/NSoiffer/MathCAT/issues/60) + # this isn't a perfect match, but should be good enough and allows merging all three (see github.com/daisy/MathCAT/issues/60) name: chemistry-mhchem-equilibrium-arrow tag: mover match: diff --git a/Rules/Braille/Swedish/Swedish_Rules.yaml b/Rules/Braille/Swedish/Swedish_Rules.yaml index 7a8504574..94a40bdd6 100644 --- a/Rules/Braille/Swedish/Swedish_Rules.yaml +++ b/Rules/Braille/Swedish/Swedish_Rules.yaml @@ -329,7 +329,7 @@ - name: mhchem-hack # this captures the output for the mhchem's "<=>", "<<=>", and "<=>>" output (there are no Unicode arrows for them) - # this isn't a perfect match, but should be good enough and allows merging all three (see github.com/NSoiffer/MathCAT/issues/60) + # this isn't a perfect match, but should be good enough and allows merging all three (see github.com/daisy/MathCAT/issues/60) tag: mover match: - "*[1][substring(., 1, 1)='↜'] and" diff --git a/Rules/Braille/UEB/UEB_Rules.yaml b/Rules/Braille/UEB/UEB_Rules.yaml index 4d5b8ca1d..912e03d8a 100644 --- a/Rules/Braille/UEB/UEB_Rules.yaml +++ b/Rules/Braille/UEB/UEB_Rules.yaml @@ -300,7 +300,7 @@ - name: mhchem-hack # this captures the output for the mhchem's "<=>", "<<=>", and "<=>>" output (there are no Unicode arrows for them) - # this isn't a perfect match, but should be good enough and allows merging all three (see github.com/NSoiffer/MathCAT/issues/60) + # this isn't a perfect match, but should be good enough and allows merging all three (see github.com/daisy/MathCAT/issues/60) tag: mover match: - "*[1][substring(., 1, 1)='↜'] and" diff --git a/Rules/Braille/Vietnam/Vietnam_Rules.yaml b/Rules/Braille/Vietnam/Vietnam_Rules.yaml index 85146aeb7..60319160b 100644 --- a/Rules/Braille/Vietnam/Vietnam_Rules.yaml +++ b/Rules/Braille/Vietnam/Vietnam_Rules.yaml @@ -360,7 +360,7 @@ - # this captures the output for the mhchem's "<=>", "<<=>", and "<=>>" output (there are no Unicode arrows for them) - # this isn't a perfect match, but should be good enough and allows merging all three (see github.com/NSoiffer/MathCAT/issues/60) + # this isn't a perfect match, but should be good enough and allows merging all three (see github.com/daisy/MathCAT/issues/60) name: chemistry-mhchem-equilibrium-arrow tag: mover match: diff --git a/Rules/Intent/general.yaml b/Rules/Intent/general.yaml index d5ee239e9..15bd1dc7a 100644 --- a/Rules/Intent/general.yaml +++ b/Rules/Intent/general.yaml @@ -380,7 +380,7 @@ - # this captures the output for the mhchem's "<=>", "<<=>", and "<=>>" output (there are no Unicode arrows for them) - # this isn't a perfect match, but should be good enough and allows merging all three (see github.com/NSoiffer/MathCAT/issues/60) + # this isn't a perfect match, but should be good enough and allows merging all three (see github.com/daisy/MathCAT/issues/60) name: chemistry-mhchem-equilibrium-arrow tag: mover match: diff --git a/docs/helpers_old.md b/docs/helpers_old.md index 5266c8b3e..9292a2557 100644 --- a/docs/helpers_old.md +++ b/docs/helpers_old.md @@ -5,7 +5,7 @@ This page is a work-in-progress. ## Getting Started If you plan to work on MathCAT development, you need to make use of github: -1. Fork the MathCAT repo at `github.com/NSoiffer/MathCAT` +1. Fork the MathCAT repo at `github.com/daisy/MathCAT` 2. Clone the forked copy so you have a local copy to work on. 3. Checkout the branch I create for your work (typically the country code for your translation) and work in that branch. diff --git a/docs/ru/helpers.md b/docs/ru/helpers.md index ebcd6e8c4..fa70fc86f 100644 --- a/docs/ru/helpers.md +++ b/docs/ru/helpers.md @@ -11,7 +11,7 @@ title: РуĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ пДрДĐČĐŸĐŽŃ‡ĐžĐșа Đž Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа ## ĐĐ°Ń‡Đ°Đ»ĐŸ Ń€Đ°Đ±ĐŸŃ‚Ń‹ ЕслО ĐČы ĐżĐ»Đ°ĐœĐžŃ€ŃƒĐ”Ń‚Đ” участĐČĐŸĐČать ĐČ Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚ĐșĐ” MathCAT, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД GitHub: -1. ĐĄĐŸĐ·ĐŽĐ°ĐčтД Ń„ĐŸŃ€Đș Ń€Đ”ĐżĐŸĐ·ĐžŃ‚ĐŸŃ€ĐžŃ MathCAT `github.com/NSoiffer/MathCAT`. +1. ĐĄĐŸĐ·ĐŽĐ°ĐčтД Ń„ĐŸŃ€Đș Ń€Đ”ĐżĐŸĐ·ĐžŃ‚ĐŸŃ€ĐžŃ MathCAT `github.com/daisy/MathCAT`. 2. ĐšĐ»ĐŸĐœĐžŃ€ŃƒĐčтД Ń„ĐŸŃ€Đș, Ń‡Ń‚ĐŸĐ±Ń‹ ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ŃŒ Đ»ĐŸĐșĐ°Đ»ŃŒĐœŃƒŃŽ ĐșĐŸĐżĐžŃŽ ĐŽĐ»Ń Ń€Đ°Đ±ĐŸŃ‚Ń‹. 3. ĐŸĐ”Ń€Đ”ĐșĐ»ŃŽŃ‡ĐžŃ‚Đ”ŃŃŒ ĐœĐ° ŃĐŸĐ·ĐŽĐ°ĐœĐœŃƒŃŽ ĐŽĐ»Ń ĐČашДĐč Ń€Đ°Đ±ĐŸŃ‚Ń‹ ĐČДтĐșу, ĐŸĐ±Ń‹Ń‡ĐœĐŸ ĐœĐ°Đ·ĐČĐ°ĐœĐœŃƒŃŽ ĐșĐŸĐŽĐŸĐŒ ŃĐ·Ń‹Đșа пДрДĐČĐŸĐŽĐ°, Đž Ń€Đ°Đ±ĐŸŃ‚Đ°ĐčтД ĐČ ĐœĐ”Đč. diff --git a/src/canonicalize.rs b/src/canonicalize.rs index 47be3ad00..0e0a81447 100644 --- a/src/canonicalize.rs +++ b/src/canonicalize.rs @@ -2083,7 +2083,7 @@ impl CanonicalizeContext { fn merge_number_blocks(context: &CanonicalizeContext, parent_mrow: Element, children: &mut Vec) { // debug!("parent:\n{}", mml_to_string(parent_mrow)); // If we find a comma that is not part of a number, don't form a number - // (see https://github.com/NSoiffer/MathCAT/issues/271) + // (see https://github.com/daisy/MathCAT/issues/271) // Unfortunately, we can't do this in the loop below because we might discover the "not part of a number" after a number has been formed let do_not_merge_comma = is_comma_not_part_of_a_number(children); let mut i = 0; diff --git a/src/chemistry.rs b/src/chemistry.rs index 5bec42313..173c5cccb 100644 --- a/src/chemistry.rs +++ b/src/chemistry.rs @@ -1653,7 +1653,7 @@ fn likely_chem_equation_operator(mathml: Element) -> i32 { return -3; // there is still a chance /// Detects output of mhchem for some equilibrium arrows that currently (11/22) don't have Unicode points - /// See github.com/NSoiffer/MathCAT/issues/60 for the patterns being matched + /// See github.com/daisy/MathCAT/issues/60 for the patterns being matched fn is_hack_for_missing_arrows(mover: Element) -> bool { assert_eq!(name(mover), "mover"); let children = mover.children(); diff --git a/src/navigate.rs b/src/navigate.rs index f893b3838..a3365ef56 100644 --- a/src/navigate.rs +++ b/src/navigate.rs @@ -798,7 +798,7 @@ fn key_press_to_command_and_param( // key press mapping should probably be stored externally (registry) with an app that allows changes // for now, we build in the defaults - // this is a hack to map alt+ctl+arrow to ctl+arrow to change table mappings (github.com/NSoiffer/MathCAT/issues/105) + // this is a hack to map alt+ctl+arrow to ctl+arrow to change table mappings (github.com/daisy/MathCAT/issues/105) // if this change sticks, choose_command() needs to be changed and this hack should go away let mut alt_key = alt_key; if alt_key && control_key && [VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN].contains(&key) { diff --git a/src/speech.rs b/src/speech.rs index eaaeff282..100d5ff39 100644 --- a/src/speech.rs +++ b/src/speech.rs @@ -152,7 +152,7 @@ fn speak_rules(rules: &'static std::thread::LocalKey>, math // 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 + // See https://github.com/daisy/MathCAT/issues/174 for why we can just start the speech at the nav node let raw_intent_attr = mathml.attribute_value("data-intent-property"); let intent_attr = raw_intent_attr.as_deref().unwrap_or_default(); if let Some(start) = speech_string.find("[[") { diff --git a/src/xpath_functions.rs b/src/xpath_functions.rs index 19cf0b6cd..97e1db5ee 100644 --- a/src/xpath_functions.rs +++ b/src/xpath_functions.rs @@ -1945,7 +1945,7 @@ mod tests { test_is_not_simple("-x y z", "-x ⁢y⁢z")?; - test_is_not_simple("C(-2,1,4)", // github.com/NSoiffer/MathCAT/issues/199 + test_is_not_simple("C(-2,1,4)", // github.com/daisy/MathCAT/issues/199 "C(−2,1,4)")?; return Ok( () ); }); diff --git a/tests/braille/Nemeth/other.rs b/tests/braille/Nemeth/other.rs index 102c68096..5efae3d3d 100644 --- a/tests/braille/Nemeth/other.rs +++ b/tests/braille/Nemeth/other.rs @@ -5,7 +5,7 @@ use anyhow::Result; #[test] fn not_number_space_blocks() -> Result<()> { - // https://github.com/NSoiffer/MathCAT/issues/144 + // https://github.com/daisy/MathCAT/issues/144 let expr = "123 ⁣456"; test_braille("Nemeth", expr, "⠌⠂⠆⠒⠀⠌â Č⠱⠖")?; return Ok(()); @@ -14,7 +14,7 @@ fn not_number_space_blocks() -> Result<()> { #[test] fn space_between_digits() -> Result<()> { - // https://github.com/NSoiffer/MathCAT/issues/144 + // https://github.com/daisy/MathCAT/issues/144 let expr = "1 3 5"; test_braille("Nemeth", expr, "â Œâ ‚â €â Œâ ’â €â Œâ ą")?; return Ok(()); @@ -23,7 +23,7 @@ fn space_between_digits() -> Result<()> { #[test] fn space_hack_between_digits() -> Result<()> { - // https://github.com/NSoiffer/MathCAT/issues/144 + // https://github.com/daisy/MathCAT/issues/144 let expr = "1 ⁣3 ⁣5"; test_braille("Nemeth", expr, "â Œâ ‚â €â Œâ ’â €â Œâ ą")?; return Ok(()); @@ -32,7 +32,7 @@ fn space_hack_between_digits() -> Result<()> { #[test] fn tilde_prefix_bug_244() -> Result<()> { - // https://github.com/NSoiffer/MathCAT/issues/244 + // https://github.com/daisy/MathCAT/issues/244 let expr = " ~ p "; test_braille("Nemeth", expr, "⠈⠱⠏")?; return Ok(()); @@ -41,7 +41,7 @@ fn tilde_prefix_bug_244() -> Result<()> { #[test] fn double_struck_bug_334() -> Result<()> { - // https://github.com/NSoiffer/MathCAT/issues/334 -- double struck was problem (â Œ was missing); test all of the scripted numbers here + // https://github.com/daisy/MathCAT/issues/334 -- double struck was problem (â Œ was missing); test all of the scripted numbers here let expr = "𝟙,𝟐,𝟯,đŸș"; test_braille("Nemeth", expr, "⠠⠞⠌⠂⠠⠀⠞⠌⠆⠠⠀⠠⠚⠞⠌⠒⠠⠀⠌â Č")?; return Ok(()); @@ -50,7 +50,7 @@ fn double_struck_bug_334() -> Result<()> { #[test] fn extra_indicators_bug_343() -> Result<()> { - // https://github.com/NSoiffer/MathCAT/issues/343 -- extra indicators before baseline indicator due to -x^2, not there for x^2 + // https://github.com/daisy/MathCAT/issues/343 -- extra indicators before baseline indicator due to -x^2, not there for x^2 let expr = " @@ -78,7 +78,7 @@ fn extra_indicators_bug_343() -> Result<()> { #[test] fn find_baseline_indicator_bug_364() -> Result<()> { - // https://github.com/NSoiffer/MathCAT/issues/364 + // https://github.com/daisy/MathCAT/issues/364 let expr = r#" π diff --git a/tests/braille/Nemeth/rules.rs b/tests/braille/Nemeth/rules.rs index 18d31204f..d0cde7248 100644 --- a/tests/braille/Nemeth/rules.rs +++ b/tests/braille/Nemeth/rules.rs @@ -71,7 +71,7 @@ fn test_9_b_4() -> Result<()> { } #[test] fn test_9_c_1_linear() -> Result<()> { - // see https://github.com/NSoiffer/MathCAT/issues/43 for discussion on linear layout + // see https://github.com/daisy/MathCAT/issues/43 for discussion on linear layout let expr = "| 12 -3-4 @@ -1763,7 +1763,7 @@ fn racket_below_121_4() -> Result<()> { #[test] fn identity_matrix_126_linearize() -> Result<()> { - // see https://github.com/NSoiffer/MathCAT/issues/43 for discussion on linear layout + // see https://github.com/daisy/MathCAT/issues/43 for discussion on linear layout let expr = " ( 100 010 @@ -2203,7 +2203,7 @@ fn tensor_from_mathml_spec() -> Result<()> { l "; - // Note: the braille answer was verified to be correct (see https://github.com/NSoiffer/MathCAT/issues/55) + // Note: the braille answer was verified to be correct (see https://github.com/daisy/MathCAT/issues/55) test_braille("Nemeth", expr, "⠠⠗⠰⠊⠐⠘⠚⠐⠰⠅⠐⠰⠇")?; return Ok(()); } diff --git a/tests/braille/UEB/iceb.rs b/tests/braille/UEB/iceb.rs index b7f3a6560..3bd48b19b 100644 --- a/tests/braille/UEB/iceb.rs +++ b/tests/braille/UEB/iceb.rs @@ -522,7 +522,7 @@ fn ratio_3_2_6() -> Result<()> { #[test] fn standing_alone_1() -> Result<()> { - // Tests bug: github.com/NSoiffer/MathCAT/issues/142 + // Tests bug: github.com/daisy/MathCAT/issues/142 let expr = "(n=7)"; test_braille("UEB", expr, "â â Łâ °â â €â â ¶â €â Œâ ›â â œ")?; return Ok(()); diff --git a/tests/braille/UEB/other.rs b/tests/braille/UEB/other.rs index f1beb55cc..7dda38f6c 100644 --- a/tests/braille/UEB/other.rs +++ b/tests/braille/UEB/other.rs @@ -72,7 +72,7 @@ fn number_space_before_and_after() -> Result<()> { #[test] fn not_number_space_blocks() -> Result<()> { - // https://github.com/NSoiffer/MathCAT/issues/144 + // https://github.com/daisy/MathCAT/issues/144 let expr = "123 ⁣456"; test_braille("UEB", expr, "⠌⠁⠃⠉⠀⠌⠙⠑⠋")?; return Ok(()); @@ -81,7 +81,7 @@ fn not_number_space_blocks() -> Result<()> { #[test] fn dot_above_bug_204() -> Result<()> { - // https://github.com/NSoiffer/MathCAT/issues/204 + // https://github.com/daisy/MathCAT/issues/204 let expr = " 0. 6 · "; test_braille("UEB", expr, "⠌⠚â Čâ Łâ Œâ ‹â œâ ˜â Č")?; return Ok(()); @@ -90,7 +90,7 @@ fn dot_above_bug_204() -> Result<()> { #[test] fn tilde_prefix_bug_244() -> Result<()> { - // https://github.com/NSoiffer/MathCAT/issues/244 + // https://github.com/daisy/MathCAT/issues/244 let expr = " ~ p "; test_braille("UEB", expr, "⠈⠔⠏")?; return Ok(()); @@ -109,7 +109,7 @@ fn double_tilde_prefix_bug_244() -> Result<()> { #[test] fn space_hack_between_digits() -> Result<()> { - // https://github.com/NSoiffer/MathCAT/issues/144 + // https://github.com/daisy/MathCAT/issues/144 let expr = "1 ⁣3 ⁣5"; test_braille("UEB", expr, "⠌⠁⠀⠌⠉⠀⠌⠑")?; return Ok(()); @@ -118,7 +118,7 @@ fn space_hack_between_digits() -> Result<()> { #[test] fn space_hack_around_operator() -> Result<()> { - // https://github.com/NSoiffer/MathCAT/issues/144 + // https://github.com/daisy/MathCAT/issues/144 let expr = "y ⁣= ⁣5"; test_braille("UEB", expr, "⠰⠜⠀⠐⠶⠀⠌⠑")?; return Ok(()); From 72e2b1ddf81950d2f12c6fd6cb2aadcdf4df8dac Mon Sep 17 00:00:00 2001 From: natalieac03 Date: Wed, 2 Sep 2026 10:04:44 -0300 Subject: [PATCH 083/162] Add Brazilian Portuguese (pt) translation- #729 (#736) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Create test * Traducao das regras pt-BR: unicode, definitions, SimpleSpeak, SharedRules e testes * VersĂŁo inicial em portuguĂȘs do MathCAT * Corrige bugs da auditoria e traduz unicode-full.yaml (acentos, setas, operadores, formas) * Regras da rodada de testes: probability, ignore_period, unicode-full * Corrige unidades sec/arcsec, remove dot-over espĂșria, ACHADOS.md * pt: corrige 7 bugs de regra e reconcilia os testes (92/92) cargo test Languages::pt saĂ­a de 33 falhas em 91 testes. Agora passa 92/92, e a suĂ­te inteira do repositĂłrio continua verde. Nada em src/ foi tocado. Bugs de regra: - SharedRules/general.yaml: a distinção Verbose/Medium tinha desabado na quĂ­mica. 14 pares de ramos diziam "subscrito"/"sobrescrito" nos dois nĂ­veis, onde o inglĂȘs tem subscript/sub. Um deles (ramo $Prescripts[4]) dizia "subscrito" onde o inglĂȘs diz superscript. - SharedRules/general.yaml: ligação dupla escrita "::" nĂŁo era reconhecida. A regra testava .='::', mas o canonicalizador converte para ∷ (U+2237) antes de as regras rodarem, entĂŁo H₂C::CH₂ saĂ­a "maiĂșsculo c, como maiĂșsculo c". - unicode.yaml: a regra de "|" era uma simplificação da inglesa e perdia trĂȘs casos — P(A|B) ("dado"), a|b entre nĂșmeros ("divide") e o intent literal. Portada a estrutura inglesa inteira. - SharedRules/general.yaml: fora da quĂ­mica caĂ­a no default-text, que fala o nome da tag, e saĂ­a a palavra inglesa "none". Agora "nenhum". - SharedRules/general.yaml: faltava o Log maiĂșsculo (valor principal), que saĂ­a "Log de x". Marcado t: — a tradução precisa de conferĂȘncia. - definitions.yaml: "segundo de arco" estava duplicado em PluralForms. O leitor de YAML do Rust aceita, mas audit-translations recusava o arquivo inteiro, ou seja, definitions.yaml nĂŁo estava sendo auditado de verdade. - definitions.yaml: plurais das formas prefixadas de "segundo de arco", que a regra genĂ©rica produzia como "yoctossegundo de arcos". Testes desatualizados: pausas geradas pelo motor (ver ACHADOS.md seção 1), o artigo em "o log de x", "1 meio" em vez de "um meio", "l n x" no modo conciso, e a vĂ­rgula do grego (que o teste inglĂȘs tambĂ©m tem). DecisĂŁo: menos unĂĄrio fica "menos", nĂŁo "negativo". Os testes estavam divididos; a regra jĂĄ dizia "menos" e os trĂȘs discordantes foram alinhados. Resolve duas pendĂȘncias do ACHADOS.md: a contradição aparente entre tensor_mmultiscripts e mhchem_so4_2mais (caminhos de cĂłdigo diferentes — sĂł o da quĂ­mica estava quebrado) e a divergĂȘncia de inverse_trig entre SimpleSpeak e ClearSpeak (as regras jĂĄ estavam alinhadas; era o teste). ACHADOS.md ganha a seção 6. Corrigidas duas afirmaçÔes das seçÔes anteriores: compute_auto_pause conta bytes, nĂŁo letras; e as regras de quĂ­mica nĂŁo eram idĂȘnticas Ă s inglesas (sĂł as diretivas de pausa eram). Registrado tambĂ©m que trocar bytes por caracteres foi testado e nĂŁo resolve — piora de 15 para 36 falhas. Co-Authored-By: Claude Opus 5 * Terminologia: maiĂșscula, romanos por valor, expoente zero cardinal, testes * pt: pertinĂȘncia sem verbo finito dentro de conjunto; ∉ com In deixa de colidir com ⊄ Duas correçÔes de fala, com varredura e nĂŁo caso a caso (ACHADOS 7.8/7.9): 1. Dentro de um conjunto ({x ∈ â„€ : x > 5}) a expressĂŁo modifica "todos os x" e nĂŁo pode ter verbo finito nem singular: o verbo grudava em "conjunto" ("o conjunto de todos os x pertence a inteiros"). Seis dos oito ramos estavam errados, nĂŁo sĂł o Belongs. Agora: em / membros de / elementos de / pertencentes a, e as negaçÔes nominais. "fora de" foi rejeitado por trocar pertinĂȘncia por localização; "nĂŁo em" por ser truncado. O ramo SimpleSpeak usava uma string sĂł para dentro e fora e passou a bifurcar. 2. ∉ com ClearSpeak_SetMemberSymbol=In fora de conjunto falava "nĂŁo estĂĄ contido em", exatamente a fala do ⊄. Passa a "nĂŁo estĂĄ em", espelhando o ∈. TambĂ©m nesta rodada, jĂĄ em varredura: termo Ășnico por famĂ­lia de estilo (fraktur, caligrĂĄfico) e adjetivo posposto nos dois arquivos; ∈ ∊ com Auto separado de Member como o ∉; ! volta a distinguir literal/fatorial; ≇ ≚ ≞ ⋕ com termo matemĂĄtico em vez do nome Unicode; cĂłpula dupla em ∊ ⊈ ⊉. Novo: tests/Languages/pt/ClearSpeak/sets.rs (pt vai de 102 para 142 testes, ∈ e ∊ travados iguais nas cinco preferĂȘncias e nos dois estilos), PythonScripts/conferir_vocabulario.py (consistĂȘncia de vocabulĂĄrio entre unicode.yaml e unicode-full.yaml: 8 -> 4 grupos, restantes benignos) e Rules/Languages/pt/TERMINOLOGIA_PT_BR.md (registro Ășnico das leituras). SuĂ­te inteira: 7307 passed, 0 failed. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_0134dJm6wzqbquvZrNhPD3Ea * pt: corrige o que o material real do ACESSÍLIA exige; recuo controlado; pacote de escuta DiagnĂłstico antes de escolher (ACHADOS 9): o MathML do ACESSÍLIA vem do latex2mathml nos dois caminhos (inclusive Docling) e nunca traz intent=, entĂŁo os 186 IntentMappings ausentes nĂŁo sĂŁo prioridade. O que importa Ă© o que o motor infere sozinho e o que sai cru para o sintetizador. CorreçÔes, pelo dano ao estudante: - caracteres crus no corpus real: negrito latino e grego (\mathbf, \boldsymbol), ⟹ ⟩, ÂŻ de \bar{x} (o motor canonicaliza U+0304/U+203E para U+00AF, entĂŁo a entrada "com mĂĄcron" nunca era alcançada), setas longas, ” Ω ℧ Å soltos - "1 terceiro" -> "1 terço": listas fracionĂĄrias paravam em "meio" - "o integral" -> "a integral": artigo concorda com o operador grande - "magnitude de x" -> "a norma de x": intent inferido sem mapping pt - "cross product"/"dot product" literais -> "produto vetorial/escalar": o intent inferido vem sem filhos e nenhuma regra casava com count(*)=0 - recuo controlado sĂł em regra (gerar_recuo_en.py): 2091 entradas do en para codepoints sem cobertura, estilo jĂĄ definido traduzido, resto em t: minĂșsculo. Antes o caractere saĂ­a cru; agora sai em inglĂȘs, contado como pendente. Pacote da sessĂŁo de escuta (gerar_pacote_escuta.py -> SESSAO_ESCUTA.md): 30 expressĂ”es em 6 ĂĄreas, fala real nos dois estilos e trĂȘs verbosidades, roteiro e tabela das decisĂ”es que dependem do ouvinte. cargo test: 7307 passed, 0 failed (pt: 142). conferir_vocabulario.py: 4 grupos, todos benignos, antes e depois. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_0134dJm6wzqbquvZrNhPD3Ea * pt: P(A ∣ B) fala "dado"; varredura de vazamento nas 593 expressĂ”es do en O latex2mathml emite \mid como U+2223, nĂŁo "|": P(A ∣ B) saĂ­a "A divide B". A entrada "∣" ganha a mesma condição de contexto da regra do "|" (dentro de P( · ∣ · ) Ă© "dado"; fora continua "divide"). Em conjunto por compreensĂŁo {x ∣ ...} o problema persiste e nĂŁo Ă© regra: o canonicalizador sĂł trata "|" como cerca (registrado como item de src/ em ACHADOS 9.6). Varredura: as 593 expressĂ”es dos testes do inglĂȘs faladas em portuguĂȘs, Ă  procura de palavras inglesas. Fora dos em inglĂȘs dos prĂłprios testes e das letras decoradas, nenhum vazamento em material real. As decoraçÔes (circulado, entre parĂȘnteses, com ponto, invertido) entraram no mapa de estilo do recuo controlado. cargo test: 7307 passed, 0 failed (pt: 142). conferir_vocabulario.py: 4. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_0134dJm6wzqbquvZrNhPD3Ea * pt: recuo marcado # RECUO-EN e separado da tradução pendente; regressĂŁo do recuo = 0 As entradas do recuo controlado usavam t: minĂșsculo, a mesma marca de "traduzido mas nĂŁo conferido" — 2 mil delas contra 20 pendĂȘncias reais, que sumiam no meio. Cada entrada do bloco leva agora # RECUO-EN na linha da chave e o conferir_vocabulario.py ganhou a seção 5, que reporta os dois nĂșmeros em separado: 2091 entradas de recuo (1980 strings em inglĂȘs) contra 20 strings pendentes de conferĂȘncia (fraktur x10, caligrĂĄfico x10). Verificação de regressĂŁo: as 593 expressĂ”es dos testes do en faladas em pt sem e com o bloco. 526 iguais; 67 mudaram, todas com caractere cru antes. Nenhuma expressĂŁo 100% portuguĂȘs mudou de fala. cargo test: 7307 passed, 0 failed (pt: 142). conferir_vocabulario.py: 4. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_0134dJm6wzqbquvZrNhPD3Ea * Delete auditar_pt.sh * Delete Rules/Languages/pt/ACHADOS.md * Delete Rules/Languages/pt/SESSAO_ESCUTA.md * Delete Rules/Languages/pt/TERMINOLOGIA_PT_BR.md * Terminologia: maiĂșscula, romanos por valor, expoente zero cardinal, testes * Restaura arquivos apagados por engano * Delete venv directory * Delete PythonScripts/venv directory * Delete PythonScripts/gerar_recuo_en.py * Delete PythonScripts/gerar_pacote_escuta.py * Delete PythonScripts/conferir_vocabulario.py * Remove translation correction comments from YAML Removed comments regarding translation corrections and pluralization issues. * Clean up comments in ClearSpeak_Rules.yaml Removed comments regarding corrections in Portuguese grammar and terminology for mathematical expressions. * Clean up comments in SimpleSpeak_Rules.yaml Removed comments regarding corrections related to gendered ordinal numbers and unnecessary English suffixes. * Clean up translation notes in definitions.yaml Removed translation notes and comments from definitions.yaml. * Fix tag for overview-default in overview.yaml Corrected the tag for 'overview-default' to include 'fraction' for better intent matching. * Clean up comments in escuta.rs Removed comments and documentation from escuta.rs. * Update expressions in escuta_expressoes.tsv * Clean up comments in intent.rs Removed cautionary comments regarding the Spanish equivalent tests and their historical inaccuracies. * Remove venv from version control * Restringe o PR a Rules/Languages/pt e tests/Languages/pt Reverte o .gitignore Ă  versĂŁo do upstream; arquivos locais (venv, saĂ­das de teste, scripts auxiliares e documentos .md) ficam fora do controle de versĂŁo via .git/info/exclude. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01VJN43HMwJHeagwCporXvF3 --------- Co-authored-by: Claude Opus 5 --- Rules/Languages/pt/ClearSpeak_Rules.yaml | 801 ++++ Rules/Languages/pt/SharedRules/calculus.yaml | 61 + Rules/Languages/pt/SharedRules/default.yaml | 734 ++++ Rules/Languages/pt/SharedRules/general.yaml | 1121 ++++++ Rules/Languages/pt/SharedRules/geometry.yaml | 80 + .../pt/SharedRules/linear-algebra.yaml | 35 + Rules/Languages/pt/SimpleSpeak_Rules.yaml | 338 ++ Rules/Languages/pt/definitions.yaml | 496 +++ Rules/Languages/pt/navigate.yaml | 1773 +++++++++ Rules/Languages/pt/overview.yaml | 119 + Rules/Languages/pt/unicode-full.yaml | 3431 +++++++++++++++++ Rules/Languages/pt/unicode.yaml | 571 +++ tests/Languages/pt.rs | 17 + tests/Languages/pt/ClearSpeak/sets.rs | 398 ++ tests/Languages/pt/SimpleSpeak/functions.rs | 422 ++ tests/Languages/pt/alphabets.rs | 438 +++ tests/Languages/pt/chemistry.rs | 721 ++++ tests/Languages/pt/escuta.rs | 33 + tests/Languages/pt/escuta_expressoes.tsv | 30 + tests/Languages/pt/intent.rs | 72 + tests/Languages/pt/shared.rs | 346 ++ tests/Languages/pt/unicode_full.rs | 159 + tests/Languages/pt/units.rs | 411 ++ tests/languages.rs | 1 + 24 files changed, 12608 insertions(+) create mode 100644 Rules/Languages/pt/ClearSpeak_Rules.yaml create mode 100644 Rules/Languages/pt/SharedRules/calculus.yaml create mode 100644 Rules/Languages/pt/SharedRules/default.yaml create mode 100644 Rules/Languages/pt/SharedRules/general.yaml create mode 100644 Rules/Languages/pt/SharedRules/geometry.yaml create mode 100644 Rules/Languages/pt/SharedRules/linear-algebra.yaml create mode 100644 Rules/Languages/pt/SimpleSpeak_Rules.yaml create mode 100644 Rules/Languages/pt/definitions.yaml create mode 100644 Rules/Languages/pt/navigate.yaml create mode 100644 Rules/Languages/pt/overview.yaml create mode 100644 Rules/Languages/pt/unicode-full.yaml create mode 100644 Rules/Languages/pt/unicode.yaml create mode 100644 tests/Languages/pt.rs create mode 100644 tests/Languages/pt/ClearSpeak/sets.rs create mode 100644 tests/Languages/pt/SimpleSpeak/functions.rs create mode 100644 tests/Languages/pt/alphabets.rs create mode 100644 tests/Languages/pt/chemistry.rs create mode 100644 tests/Languages/pt/escuta.rs create mode 100644 tests/Languages/pt/escuta_expressoes.tsv create mode 100644 tests/Languages/pt/intent.rs create mode 100644 tests/Languages/pt/shared.rs create mode 100644 tests/Languages/pt/unicode_full.rs create mode 100644 tests/Languages/pt/units.rs diff --git a/Rules/Languages/pt/ClearSpeak_Rules.yaml b/Rules/Languages/pt/ClearSpeak_Rules.yaml new file mode 100644 index 000000000..634aaf0ee --- /dev/null +++ b/Rules/Languages/pt/ClearSpeak_Rules.yaml @@ -0,0 +1,801 @@ +- name: pause + tag: "!*" + match: "not(self::m:math) and not($MatchingPause) and @data-intent-property[contains(., ':pause')]" + replace: + - with: + variables: [MatchingPause: "true()"] + replace: + - test: + - if: "contains(@data-intent-property, ':pause-long')" + then: [pause: long] + - else_if: "contains(@data-intent-property, ':pause-short')" + then: [pause: short] + else: [pause: medium] + - x: "." + +- name: intent-literal-silent + tag: [mi, mo, mn] + match: "contains(@data-intent-property, ':silent:')" + # say nothing + replace: [] + +# handling of negative numbers that come from 'intent' is hard -- we do something that is close to right here +- name: intent-literal-negative-number + tag: mn + match: "starts-with(text(), '-')" + replace: + - T: "menos" + - x: "translate(text(), '-_', '')" + +- name: default + tag: square-root + match: "." + replace: + - test: + if: "$Verbosity!='Terse'" + then: [T: "a"] # "a raiz" (feminino) + - T: "raiz quadrada" + # CORREÇÃO de ordem: o adjetivo vem depois do substantivo em portuguĂȘs + # "a raiz quadrada negativa/positiva de x", nĂŁo "a positiva raiz quadrada". + - test: + if: $ClearSpeak_Roots = 'PosNegSqRoot' or $ClearSpeak_Roots = 'PosNegSqRootEnd' + then: + - bookmark: "*[1]/@id" + - test: + if: parent::*[self::m:minus and count(*)=1] + then: [T: "negativa"] + else: [T: "positiva"] + - test: + if: "$Verbosity!='Terse'" + then: [T: "de"] + else: [pause: short] + - x: "*[1]" + - test: + - if: "$ClearSpeak_Roots = 'RootEnd' or $ClearSpeak_Roots = 'PosNegSqRootEnd'" + then: + - pause: short + - T: "fim da raiz" + - pause: medium + - else_if: "IsNode(*[1], 'simple')" + then: [pause: short] + else: [pause: long] + +- name: default + # audit-ignore: divergĂȘncia deliberada do en — adjetivo positiva/negativa pĂłs-posto (ordem do portuguĂȘs) + tag: root + match: "." + replace: + - test: + if: "$Verbosity!='Terse'" + then: [T: "a"] + - test: + if: "*[2][self::m:mn]" + then_test: + - if: "*[2][.='2']" + then: [T: "raiz quadrada"] + - else_if: "*[2][.='3']" + then: [T: "raiz cĂșbica"] + - else_if: "*[2][not(contains(., '.'))]" + then: [T: "raiz de Ă­ndice", x: "*[2]"] + else: + - T: "raiz de Ă­ndice" + - x: "*[2]" + # adjetivo depois do substantivo: "a raiz cĂșbica negativa de x" + - test: + if: $ClearSpeak_Roots = 'PosNegSqRoot' or $ClearSpeak_Roots = 'PosNegSqRootEnd' + then: + - test: + if: "parent::*[(self::m:minus or self::m:plus) and count(*)=1]" + then: [bookmark: "parent/@id"] + - test: + if: parent::m:minus + then: [T: "negativa"] + else: [T: "positiva"] + - test: + if: "$Verbosity!='Terse'" + then: [T: "de"] + - x: "*[1]" + - test: + if: $ClearSpeak_Roots = 'RootEnd' or $ClearSpeak_Roots = 'PosNegSqRootEnd' + then: + - pause: short + - T: "fim da raiz" + - pause: medium + else_test: + if: IsNode(*[1], 'simple') + then: [pause: short] + else: [pause: long] + +# The 'negative' rule interacts with the msqrt/mroot rules as those might pick off this case ("the negative square root of x") +- name: negative_and_positive + tag: [plus, minus] + match: "count(*)=1 and contains(@data-intent-property, ':prefix:')" + replace: + - test: + if: + - "*[1][self::m:square-root or self::m:root] and" + - "($ClearSpeak_Roots = 'PosNegSqRoot' or $ClearSpeak_Roots = 'PosNegSqRootEnd')" + then: [T: ""] + else: + - bookmark: "@id" + - test: + if: "self::m:minus" + then: [T: "menos"] + else: [T: "positivo"] + - x: "*[1]" + +# Fraction rules +# Mixed numbers mostly "just work" because the invisible char reads as "and" and other parts read properly on their own + +# Units (e.g., meters per second) +- name: per-fraction + tag: fraction + match: + - "$ClearSpeak_Fractions='Per' or" + - "(BaseNode(*[1])[contains(@data-intent-property, ':unit') or" + - " ( self::m:mrow and count(*)=3 and" # maybe a bit paranoid checking the structure... + - " *[1][self::m:mn] and *[2][.='\u2062'] and BaseNode(*[3])[contains(@data-intent-property, ':unit')] ) ] and" + - " BaseNode(*[2])[contains(@data-intent-property, ':unit')] )" + replace: + - x: "*[1]" + - T: "por" # "cinco metros por segundo" + - x: "*[2]" + +- name: common-fraction + tag: fraction + match: + - "($ClearSpeak_Fractions='Auto' or $ClearSpeak_Fractions='Ordinal' or $ClearSpeak_Fractions='EndFrac') and" + - "*[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))]" + replace: [x: ToCommonFraction(.)] + +- name: common-fraction-mixed-number + tag: fraction + match: + - "preceding-sibling::*[1][self::m:mo][.='⁀'] and" # preceding element is invisible plus + - "($ClearSpeak_Fractions='Auto' or $ClearSpeak_Fractions='Ordinal' or $ClearSpeak_Fractions='EndFrac') and" + - "*[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))]" + replace: [x: ToCommonFraction(.)] + +- 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: + - test: + if: "$Verbosity!='Terse'" + then: [OT: "a"] + - T: "fração" + - x: "*[1]" + # lĂ©xico = fração simples Ă© "a sobre b", nĂŁo "a partido por b" + - T: "sobre" + - 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: "fim da fração" + - pause: short + +- # fraction with text or numbers followed by text in both numerator and denominator + 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 " # fractions with text + - " (*[1][self::m:mrow][count(*)=3][ " + - " *[1][self::m:mn] and " + - " *[2][self::m:mo][.='⁹'] and " # invisible times + - " *[3][self::m:mi or self::m:mtext][string-length(.)>1] ]) ) and" + - " ((*[2][self::m:mi or self::m:mtext][string-length(.)>1]) or " # fractions with text + - " (*[2][self::m:mrow][count(*)=3][ " + - " *[1][self::m:mn] and " + - " *[2][self::m:mo][.='⁹'] and " # invisible times + - " *[3][self::m:mi or self::m:mtext][string-length(.)>1] ]) )" + - ")" + replace: + - x: "*[1]" + - T: "sobre" + - x: "*[2]" + - test: + if: "$ClearSpeak_Fractions='EndFrac' or $ClearSpeak_Fractions='OverEndFrac'" + then: + - pause: short + - T: "fim da fração" + - pause: short + +- name: default + tag: fraction + match: "." + replace: + - OT: "a" + - T: "fração com numerador" + - test: + if: not(IsNode(*[1], 'simple')) + then: [pause: medium] + - x: "*[1]" + - pause: medium + - T: "e denominador" + - x: "*[2]" + - pause: long + - test: + if: "$ClearSpeak_Fractions='EndFrac' or $ClearSpeak_Fractions='GeneralEndFrac'" + then: + - pause: short + - T: "fim da fração" + - pause: short + +# rules for functions raised to a power +# these could have been written on 'mrow' but putting them on msup seems more specific +# to see if it is a function, we look right to see if the following sibling is apply-function +- name: ClearSpeak-function-inverse + tag: inverse-function + match: "." + replace: + - test: + if: $ClearSpeak_Trig = 'TrigInverse' + then: [x: "*[1]", bookmark: "*[2]/@id", T: "inverso"] + else_test: + if: $ClearSpeak_Trig = 'ArcTrig' + then: [bookmark: "*[2]/@id", T: "arco", x: "*[1]"] + else: [bookmark: "*[2]/@id", T: "inversa de", x: "*[1]"] # default/Auto + +- name: function-squared-or-cubed + # audit-ignore: divergĂȘncia deliberada do en — ao quadrado/ao cubo com par verboso padronizado + tag: power + match: + - "*[2][self::m:mn][.='2' or .='3'] and" + - "following-sibling::*[1][self::m:mo][.='⁥']" #invisible function apply + replace: + - x: "*[1]" + - bookmark: "*[2]/@id" + - test: + if: "*[2][.='2']" + then_test: + if: "$Verbosity='Verbose'" + then: [T: "elevado ao quadrado"] + else: [T: "ao quadrado"] + else: [T: "ao cubo"] +- name: function-power + # audit-ignore: divergĂȘncia deliberada do en — forma cardinal no lugar de ToOrdinal (sem ordinais femininos no motor) + tag: power + match: + - "following-sibling::*[1][self::m:mo][.='⁥']" #invisible function apply + replace: + - test: + if: "$Verbosity!='Terse'" + then: [T: "a"] + - bookmark: "*[2]/@id" + - T: "potĂȘncia" + - x: "*[2]" + - T: "de" + - pause: short + - x: "*[1]" + +- name: AfterPower-nested + tag: power + match: # directly a superscript or an mrow that contains a superscript + - "$ClearSpeak_Exponents = 'AfterPower' and" + - "*[2][self::m:power or self::m:power or self::m:mrow[m:power]]" + replace: + - x: "*[1]" + - T: "elevado ao expoente" + - pause: short + - x: "*[2]" + - pause: short + - T: "fim do expoente" + +- name: AfterPower-default + tag: power + match: "$ClearSpeak_Exponents = 'AfterPower'" + replace: + - x: "*[1]" + - T: "elevado Ă  potĂȘncia" + - x: "*[2]" + - pause: short + +- name: squared + tag: power + match: "*[2][self::m:mn][.='2'] and $ClearSpeak_Exponents = 'Auto'" + replace: + - x: "*[1]" + - bookmark: "*[2]/@id" + - T: "ao quadrado" + +- name: cubed + tag: power + match: "*[2][self::m:mn][.='3'] and $ClearSpeak_Exponents = 'Auto'" + replace: + - x: "*[1]" + - bookmark: "*[2]/@id" + - T: "ao cubo" + +- name: simple-integer + # audit-ignore: divergĂȘncia deliberada do en — forma cardinal; preferĂȘncia Ordinal degrada documentadamente + tag: power + match: "*[2][self::m:mn][not(contains(., '.'))]" + replace: + - x: "*[1]" + - T: "elevado a" + - x: "*[2]" + +- name: simple-negative-integer + # audit-ignore: divergĂȘncia deliberada do en — forma cardinal + tag: power + match: + - "*[2][self::m:minus and count(*)=1 and" + - " *[1][self::m:mn][not(contains(., '.'))]" + - " ]" + replace: + - x: "*[1]" + - T: "elevado a" + - x: "*[2]" + +- name: simple-var + # audit-ignore: divergĂȘncia deliberada do en — sem o sufixo fonĂ©tico inglĂȘs -th + tag: power + match: "*[2][self::m:mi][string-length(.)=1]" + replace: + # CORREÇÃO: removido o bloco "pronounce" com o sufixo inglĂȘs "-th" (IPA Ξ), + # que produzia som estrangeiro. "x elevado a n" jĂĄ estĂĄ completo. + - x: "*[1]" + - T: "elevado a" + - x: "*[2]" + +# match nested exponent, where the nested exponent is has the power 2 or 3 (n below) +# [xxx]^n, - [xxx]^n, [xxx] var^n, -[xxx] var^n +# where xxx is a number or common fraction (or a var in the first two forms) +# short of creating a specialized built-in function, I don't see a way to eliminate a lot of repetition in the matches +# also really bad is that the test of a common fraction is replicated here (four times!) +# Note: the ClearSpeak doc doesn't say these only apply when the pref is "Auto", +# but the test cases all fall back to "raised to the exponent" when not "Auto" +# If these are allowed for non-Auto values, then you end up with "...power power...". +- # [xxx]^n + name: nested-squared-or-cubed + tag: power + match: + - "$ClearSpeak_Exponents = 'Auto' and" + - "*[2][self::m:power][" + - " *[2][self::m:mn][.='2' or .='3'] and " # exp is 2 or 3 + # base is mn, mi, common fraction ([xxx] case) + - " *[1][self::m:mn or self::m:mi or " + - " self::m:fraction[*[1][self::m:mn][not(contains(., '.')) and text()<20] and" + - " *[2][self::m:mn][not(contains(., '.')) and 2<= text() and text()<=10]]" + - " ]" + - " ]" + replace: + - x: "*[1]" + - T: "elevado Ă  potĂȘncia" + - x: "*[2]" + +- # - [xxx]^n + name: nested-negative-squared-or-cubed + tag: power + match: + - "$ClearSpeak_Exponents = 'Auto' and" + - " *[2][self::m:minus and count(*)=1 and " + - " *[1]/*[1][self::m:power][" + - " *[2][self::m:mn][.='2' or .='3'] and " # exp is 2 or 3" + # base is mn, mi, common fraction ([xxx] case) + - " *[1][self::m:mn or self::m:mi or " + - " self::m:fraction[*[1][self::m:mn][not(contains(., '.')) and text()<20] and" + - " *[2][self::m:mn][not(contains(., '.')) and 2<= text() and text()<=10]]" + - " ]" + - " ]" + - " ]" + replace: + - x: "*[1]" + - T: "elevado Ă  potĂȘncia" + - x: "*[2]" + +- # [xxx] var^n + name: nested-var-squared-or-cubed + tag: power + match: + - "$ClearSpeak_Exponents = 'Auto' and" + - " *[2][self::m:mrow][count(*)=3][ " + - " *[3][self::m:power][" + - " *[2][self::m:mn][.='2' or .='3'] and " # exp is 2 or 3 + - " *[1][self::m:mi]" + - " ] and " + - " *[2][self::m:mo][.='⁹'] and " # invisible times + # base is mn, or common fraction ([xxx] case) + - " *[1][self::m:mn or " + - " self::m:fraction[*[1][self::m:mn][not(contains(., '.')) and text()<20] and" + - " *[2][self::m:mn][not(contains(., '.')) and 2<= text() and text()<=10]]" + - " ]" + - " ]" + replace: + - x: "*[1]" + - T: "elevado Ă  potĂȘncia" + - x: "*[2]" + +- # -[xxx] var^n + name: nested-negative-var-squared-or-cubed + tag: power + match: + - "$ClearSpeak_Exponents = 'Auto' and" + - " *[2][self::m:mrow][count(*)=3][ " + - " *[3][self::m:power][" + - " *[2][self::m:mn][.='2' or .='3'] and " # exp is 2 or 3 + - " *[1][self::m:mi]" + - " ] and " + - " *[2][self::m:mo][.='⁹'] and " # invisible times + - " *[1][self::m:minus and count(*)=1 and " + # base is mn, or common fraction ([xxx] case) + - " *[1][self::m:mn or " + - " self::m:fraction[*[1][self::m:mn][not(contains(., '.')) and text()<20] and" + - " *[2][self::m:mn][not(contains(., '.')) and 2<= text() and text()<=10]]" + - " ]" + - " ]" + - " ]" + replace: + - x: "*[1]" + - T: "elevado Ă  potĂȘncia" + - x: "*[2]" + +- name: default-exponent-power + tag: power + match: # directly a superscript or an mrow that contains a superscript + - "*[2][self::m:power or self::m:power or self::m:mrow[m:power]]" + replace: + - x: "*[1]" + - T: "elevado ao expoente" + - pause: short + - x: "*[2]" + - pause: short + - T: "fim do expoente" + +- name: default + tag: power + match: "." + replace: + - x: "*[1]" + - T: "elevado Ă  potĂȘncia" + - x: "*[2]" + +# +# Some rules on mrows +# +- # the inference rules lump absolute value and cardinality together, so those rules are implemented here + name: ClearSpeak-absolute-value + # audit-ignore: divergĂȘncia deliberada do en — trĂȘs variĂĄveis por causa do gĂȘnero (a cardinalidade / o valor absoluto) + tag: absolute-value + match: "." + variables: + - WordToSay: "IfThenElse($ClearSpeak_AbsoluteValue = 'Cardinality', 'cardinalidade', 'valor absoluto')" + - ArticleToSay: "IfThenElse($ClearSpeak_AbsoluteValue = 'Cardinality', 'a', 'o')" + - EndToSay: "IfThenElse($ClearSpeak_AbsoluteValue = 'Cardinality', 'fim da cardinalidade', 'fim do valor absoluto')" + replace: + - test: + if: "$Verbosity!='Terse'" + then: [x: "$ArticleToSay"] + - x: "$WordToSay" + - T: "de" + - x: "*[1]" + - test: + if: "$ClearSpeak_AbsoluteValue = 'AbsEnd'" + then: + - pause: short + - x: "$EndToSay" + - pause: short + +- name: set + # audit-ignore: divergĂȘncia deliberada do en — conjunto de todos os x tal que (uso brasileiro) + tag: set + match: "." + replace: + - test: + - if: "count(*)=0" + then: [T: "o conjunto vazio"] + - else_if: "count(*)=2" + then: + - test: + if: "$Verbosity!='Terse'" + then: [T: "o"] + - T: "conjunto vazio" + - else_if: "count(*[1]/*)=3 and *[1]/*[2][self::m:mo][.=':' or .='|' or .='∣']" + then: + - test: + if: "$Verbosity!='Terse'" + then: [T: "o"] + # "conjunto de todos os x tal que" o inglĂȘs Ă© + # "set of all"; a preferĂȘncia woAll suprime sĂł o "todos os". + - T: "conjunto de" + - test: + if: $ClearSpeak_Sets != 'woAll' + then: [T: "todos os"] + - x: "*[1]/*[1]" + - T: "tal que" + - x: "*[1]/*[3]" + else: + - test: + if: $ClearSpeak_Sets != 'SilentBracket' + then: + - test: + if: "$Verbosity!='Terse'" + then: [T: "o"] + - T: "conjunto" + - x: "*[1]" + +- # intervals are controlled by a ClearSpeak Preference -- parens/brackets don't have to match, so we avoid IsBracketed + # alternatively, we could have four (or ten) rules, but there is a lot of duplication if we do that + # this one rule handles all ten cases listed as part $ClearSpeak_Paren = 'Interval' + # note that *[2] is an mrow with X, ",", Y, so getting X or Y is a double index + name: ClearSpeak-intervals # avoid overriding with default "intervals" name + variables: + - is_intervals_start_infinity: "*[1][self::m:minus and count(*)=1 and *[1][.='∞']]" + - is_intervals_end_infinity: "*[2][.='∞'or (self::m:plus and count(*)=1 and *[1][.='∞'])]" + tag: [open-interval, open-closed-interval, closed-interval, closed-open-interval] + match: "." + replace: + - T: "o intervalo de" + - x: "*[1]" + - T: "a" + - x: "*[2]" + - pause: short + - test: + if: "not($is_intervals_start_infinity)" + then: + - test: + if: "starts-with(name(.), 'open')" + # CORREÇÃO: "no" Ă© espanhol; em portuguĂȘs, "nĂŁo" + then: [T: "nĂŁo"] + - T: "incluindo" + - x: "*[1]" + # logic to deal with [not] arg #1 + - test: + if: "not($is_intervals_start_infinity or $is_intervals_end_infinity)" + then_test: + - if: "name(.)='open-interval'" + then: [T: "ou"] + - else_if: "name(.)='closed-interval'" + then: [T: "e"] + else: [T: "mas"] + # some ugly logic dealing with connectives: or, but, but, and (cleaner to be part of next clause?) + - test: + if: not($is_intervals_end_infinity) + then: + - test: + # there is some asymmetry to the test because of the and/or/but logic above + if: not( name(.)='open-interval' or name(.)='closed-interval' ) or $is_intervals_start_infinity + then: + - test: + if: "name(.) = 'open-interval' or name(.) = 'closed-open-interval'" + then: [T: "nĂŁo"] + - T: "incluindo" + - x: "*[2]" + + # onto the [not] [including]... part +- name: binomial-frac-vector + tag: matrix + match: + - "$ClearSpeak_Matrix = 'Combinatorics' and " + - "count(*[1]/*)=1 and count(*)=2" + replace: + - x: "*[1]/*[1]/*" # mtable/mtr/mtd + - T: "escolhe" + - x: "*[2]/*[1]/*" + +- name: ClearSpeak-default + tag: [mtr, mlabeledtr] + match: "parent::m:matrix or parent::m:determinant" + replace: + - pause: medium + - T: "linha" + - x: "count(preceding-sibling::*)+1" + - test: + if: .[self::m:mlabeledtr] + then: + - T: "com rĂłtulo" + - x: "*[1]/*" + - pause: short + - pause: medium + - test: + if: .[self::m:mlabeledtr] + then: [x: "*[position()>1]"] + else: [x: "*"] + +- name: matrix-default + tag: mtd + match: "parent::*[parent::m:matrix or parent::m:determinant]" + replace: + - test: + # ClearSpeak normally speaks "column 1" even though it says the row number, which is a waste... + # The following is commented out but the count(...)!=0 probably belongs in other rule sets + # if: not($IsColumnSilent) and ($ClearSpeak_Matrix = 'SpeakColNum' or count(preceding-sibling::*) != 0) + if: "not($IsColumnSilent)" + then: + - T: "coluna" + - x: "count(preceding-sibling::*)+1" + - pause: medium + - x: "*" + - test: + # short pause after each element; medium pause if last element in a row; long pause for last element in matrix + - if: count(following-sibling::*) > 0 + then: [pause: short] + - else_if: count(../following-sibling::*) > 0 + then: [pause: medium] + else: [pause: long] + +- # handle both log and ln + name: ClearSpeak-log + tag: mi + match: ".='log' or .='ln'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity!='Terse' and not(IsNode(following-sibling::*[2],'simple'))" + then: [T: "o"] + - test: + - if: ".='log'" + then: [T: "log"] + - else_if: "$ClearSpeak_Log = 'LnAsNaturalLog'" + then: [T: "logaritmo natural"] # phrase(the 'natural log' of x) + else: [spell: "'ln'"] + +- name: ClearSpeak-multi-line + # audit-ignore: divergĂȘncia deliberada do en — plural por cadeias singular/plural, nĂŁo por concatenação de s + tag: [piecewise, system-of-equations, lines] # these are ignored in favor of the ClearSpeak prefs + match: "." + variables: [IsColumnSilent: true()] + replace: + - x: "count(*)" + - test: + - if: $ClearSpeak_MultiLineOverview = 'Auto' + then: + - test: + if: "count(*) > 1" + then: + - test: + - if: "($ClearSpeak_MultiLineLabel = 'Auto' and self::m:piecewise) or $ClearSpeak_MultiLineLabel = 'Case'" + then: [T: "casos"] + - else_if: "$ClearSpeak_MultiLineLabel = 'Auto' or $ClearSpeak_MultiLineLabel = 'Line'" + then: [T: "linhas"] + - else_if: "$ClearSpeak_MultiLineLabel = 'Constraint'" + then: [T: "restriçÔes"] + - else_if: "$ClearSpeak_MultiLineLabel = 'Equation'" + then: [T: "equaçÔes"] + - else_if: "$ClearSpeak_MultiLineLabel = 'Row'" + then: [T: "linhas"] + - else_if: "$ClearSpeak_MultiLineLabel = 'Step'" + then: [T: "passos"] + # else 'None' — nĂŁo diz nada + else: + - test: + - if: "($ClearSpeak_MultiLineLabel = 'Auto' and self::m:piecewise) or $ClearSpeak_MultiLineLabel = 'Case'" + then: [T: "caso"] + - else_if: "$ClearSpeak_MultiLineLabel = 'Auto' or $ClearSpeak_MultiLineLabel = 'Line'" + then: [T: "linha"] + - else_if: "$ClearSpeak_MultiLineLabel = 'Constraint'" + then: [T: "restrição"] + - else_if: "$ClearSpeak_MultiLineLabel = 'Equation'" + then: [T: "equação"] + - else_if: "$ClearSpeak_MultiLineLabel = 'Row'" + then: [T: "linha"] + - else_if: "$ClearSpeak_MultiLineLabel = 'Step'" + then: [T: "passo"] + # else 'None' — nĂŁo diz nada + - pause: short + - x: "*" + +- name: ClearSpeak-default-multiline + # audit-ignore: divergĂȘncia deliberada do en — rĂłtulos com plural correto + tag: [mtr, mlabeledtr] + match: "parent::m:piecewise or parent::m:system-of-equations or parent::m:lines" + replace: + - test: + - if: "($ClearSpeak_MultiLineLabel = 'Auto' and parent::m:piecewise) or $ClearSpeak_MultiLineLabel = 'Case'" + then: [T: "caso"] + - else_if: "$ClearSpeak_MultiLineLabel = 'Auto' or $ClearSpeak_MultiLineLabel = 'Line'" + then: [T: "linha"] + - else_if: "$ClearSpeak_MultiLineLabel = 'Constraint'" + then: [T: "restrição"] + - else_if: "$ClearSpeak_MultiLineLabel = 'Equation'" + then: [T: "equação"] + - else_if: "$ClearSpeak_MultiLineLabel = 'Row'" + then: [T: "linha"] + - else_if: "$ClearSpeak_MultiLineLabel = 'Step'" + then: [T: "passo"] + # else 'None' — nĂŁo diz nada + - test: + if: "$ClearSpeak_MultiLineLabel != 'None'" + then: + - x: "count(preceding-sibling::*)+1" + - test: + if: .[self::m:mlabeledtr] + then: + - T: "com rĂłtulo" + - x: "*[1]/*" + - pause: medium + - test: + if: .[self::m:mlabeledtr] + then: [x: "*[position()>1]"] + else: [x: "*"] + - test: + if: "$ClearSpeak_MultiLineLabel != 'None'" + then: [pause: long] + +- name: ClearSpeak_Functions_None + tag: mo + match: + - ".='⁥' and $ClearSpeak_Functions = 'None' and" + - "not(preceding-sibling::*[1][IsInDefinition(., 'TrigFunctionNames')])" # Functions=None does not apply to "trig" functions + replace: + test: + if: "$ClearSpeak_ImpliedTimes = 'None'" + then: [T: ""] + # lĂ©xico = "vezes" Ă© a forma padrĂŁo; "multiplicado por" fica + # para o modo verboso + else_test: + if: "$Verbosity = 'Verbose'" + then: [T: "multiplicado por"] + else: [T: "vezes"] + +- name: no-times + tag: mo + match: + # Note: this rule is also part of the paren rule so that the parens speak + - ".='⁹' and $ClearSpeak_ImpliedTimes = 'None'" + replace: + - T: "" + +- name: ClearSpeak-times + # audit-ignore: divergĂȘncia deliberada do en — vezes/multiplicado por conforme verbosidade (lĂ©xico ACESSÍLIA) + tag: mo + match: + # say "times" when invisible times is followed by parens or a superscript that has a base with parens or "|"s + # if we aren't sure if it is times or not, don't say anything + - ".='⁹' and (not(@data-function-guess) or $ClearSpeak_Functions = 'None') and (" + - " $ClearSpeak_ImpliedTimes = 'MoreImpliedTimes'" + - " or " + - " following-sibling::*[1][" + - " IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|') or " + - " self::m:matrix or self::m:determinant or self::m:binomial or" # followed by parens + - " ( (self::m:msup or self::m:msub or self::m:msubsup or self::m:power) and " # followed by msup, etc. + - " *[1][self::m:mrow[IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|')] or " + - " self::m:matrix or self::m:determinant]" # base has parens + - " )" + - " ]" + # other possibility is the preceding element has parens (but not the following) + # this is not mentioned in the ClearSpeak rules or examples but seems like it should say "times". E.g, |x| y + - " or " + - " preceding-sibling::*[1][" + - " IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|')]" # followed by parens + - " )" + replace: + - test: + if: "$Verbosity = 'Verbose'" + then: [T: "multiplicado por"] + else: [T: "vezes"] + +- name: no-say-parens + # audit-ignore: divergĂȘncia deliberada do en — idem ClearSpeak-times + tag: mrow + match: + - "parent::*[not(self::m:msup) and not(self::m:msub) and not(self::m:msubsup) and not(self::m:power) and" + - " not(self::m:math) ] and " # rule out [x] standing alone + - "( IsBracketed(., '(', ')') or IsBracketed(., '[', ']') ) and " + - "not( $ClearSpeak_Functions = 'None' and " + - " (preceding-sibling::*[1][.='⁥'] or following-sibling::*[1][.='⁥']) ) and " + - "not( $ClearSpeak_ImpliedTimes = 'None' and " + - " (preceding-sibling::*[1][.='⁹'] or following-sibling::*[1][.='⁹']) ) and " + - "( IsNode(*[2], 'simple') )" + # missing clause: 'a positive fraction that is spoken as an ordinal + # (either by the Ordinal preference or by the default rules)' + replace: + - x: "*[2]" + +- include: "SharedRules/geometry.yaml" +- include: "SharedRules/linear-algebra.yaml" +- include: "SharedRules/calculus.yaml" +- include: "SharedRules/general.yaml" +- include: "SharedRules/default.yaml" diff --git a/Rules/Languages/pt/SharedRules/calculus.yaml b/Rules/Languages/pt/SharedRules/calculus.yaml new file mode 100644 index 000000000..03b99253a --- /dev/null +++ b/Rules/Languages/pt/SharedRules/calculus.yaml @@ -0,0 +1,61 @@ +--- + +- name: divergence + tag: divergence + match: "count(*) = 1" + replace: + # CORREÇÃO: a polaridade estava invertida — o modo padrĂŁo (Medium) ouvia a + # abreviação "div"; o nome completo sĂł saĂ­a no Verbose. No inglĂȘs, sĂł o + # Terse abrevia. E o "de" era incondicional, contrariando TerseFunctionNames + # (divergence/curl/gradient nĂŁo dizem "de" no modo conciso). + - test: + if: "$Verbosity='Terse'" + then: [T: "div"] + else: [T: "divergente de"] + - test: + if: "not(IsNode(*[1], 'leaf'))" + then: [pause: short] + - x: "*[1]" + +- name: curl + tag: curl + match: "count(*) = 1" + replace: + - T: "rotacional" # phrase(the 'curl of' a field) + - test: + if: "$Verbosity!='Terse'" + then: [T: "de"] + - test: + if: "not(IsNode(*[1], 'leaf'))" + then: [pause: short] + - x: "*[1]" + +- name: gradient + tag: gradient + match: "count(*) = 1" + replace: + - test: + if: "$Verbosity!='Terse'" + then: [T: "gradiente de"] # phrase('divergence' from the mean) + else: [T: "nabla"] # phrase('divergence' from the mean) + - test: + if: "not(IsNode(*[1], 'leaf'))" + then: [pause: short] + - x: "*[1]" + + +- name: laplacian + tag: laplacian + match: "count(*) <= 1" # can be on ∇^2 or on enclosing mrow + replace: + - T: "laplaciano" + - test: + if: "count(*) = 1" + then: + - test: + if: "$Verbosity!='Terse'" + then: [T: "de"] + - test: + if: "not(IsNode(*[1], 'leaf'))" + then: [pause: short] + - x: "*[1]" diff --git a/Rules/Languages/pt/SharedRules/default.yaml b/Rules/Languages/pt/SharedRules/default.yaml new file mode 100644 index 000000000..ff8ed2cf8 --- /dev/null +++ b/Rules/Languages/pt/SharedRules/default.yaml @@ -0,0 +1,734 @@ +--- +#default rules shared among several speech rules +- name: default + tag: math + match: "." + replace: + - with: + variables: + - ClearSpeak_Fractions: "IfThenElse($Verbosity='Verbose' and $ClearSpeak_Fractions='Auto', 'EndFrac', $ClearSpeak_Fractions)" + - ClearSpeak_AbsoluteValue: "IfThenElse($Verbosity='Verbose' and $ClearSpeak_AbsoluteValue='Auto', 'AbsEnd', $ClearSpeak_AbsoluteValue)" + - ClearSpeak_Roots: "IfThenElse($Verbosity='Verbose' and $ClearSpeak_Roots='Auto', 'RootEnd', $ClearSpeak_Roots)" + - ClearSpeak_Matrix: "IfThenElse($Verbosity='Verbose' and $ClearSpeak_Matrix='Auto', 'EndMatrix', $ClearSpeak_Matrix)" + # should be set at mtable level, but unknown intents make that impossible to know + - IsColumnSilent: false() + replace: + - test: + if: "$MathRate = 100" + then: [x: "*"] + else: + - rate: + value: "$MathRate" + replace: [x: "*"] + +- name: empty-mrow + tag: mrow + match: "not(*)" + replace: + - t: " " # say nothing -- placeholder + +- name: default + tag: mrow + match: "." + replace: + - insert: + nodes: "*" + replace: [pause: auto] + +- name: default + tag: mn + match: "." + replace: + - bookmark: "@id" + # ACRESCENTADO (en): numerais romanos sĂŁo soletrados ("XIV" -> letra a + # letra), nĂŁo lidos como palavra. + - test: + - if: "@data-roman-numeral" + then: [spell: "text()", pause: "short"] + else: [x: "translate(., $BlockSeparators, '')"] # remove digit block separators + +- name: default + tag: [mo, mtext] + match: "." + replace: + - bookmark: "@id" + - x: "text()" + +- name: default + tag: mi + match: "." + replace: + - bookmark: "@id" + - test: + - if: "string-length(.) = 1 and text() != '_'" # need unicode.tdl to kick in for single letter tokens + then: [x: "text()"] + # ACRESCENTADO (en): NavMode=Character precisa disto + - else_if: "@data-chem-element or @data-roman-numeral" + then: [spell: "text()", pause: "short"] + else: [x: "translate(., '-_\u00A0', ' ')"] # from intent literals + +- name: default + tag: ms + match: "." + replace: + - T: "a cadeia" + - pause: short + - x: "text()" + +- name: default + tag: mstyle + match: "." + replace: [x: "*"] + + +- name: literal-simple + # don't include nested fractions. E.g, fraction a plus b over c + 1 end fraction" is ambiguous + # by simplistic SimpleSpeak's rules "b over c" is a fraction, but if we say nested fractions + # are never simple, then any 'over' applies only to enclosing "fraction...end fraction" pair. + tag: mfrac + match: + - "(IsNode(*[1],'leaf') and IsNode(*[2],'leaf')) and" + - "not(ancestor::*[name() != 'mrow'][1]/self::m:fraction)" # FIX: can't test for mrow -- what should be used??? + replace: + - x: "*[1]" + - T: "sobre" + - x: "*[2]" + - pause: short + +- name: literal-default + tag: mfrac + match: "." + replace: + - T: "começar" + - pause: short + - x: "*[1]" + - test: + if: "not(IsNode(*[1],'leaf'))" + then: [pause: short] + - T: "sobre" + - test: + if: "not(IsNode(*[2],'leaf'))" + then: [pause: short] + - x: "*[2]" + - pause: short + # ALINHADO ao en: o marcador de fim Ă© dito apenas para cegueira + - test: + if: "$Impairment = 'Blindness'" + then: [T: "fim da fração"] + - pause: medium + +# ACRESCENTADO: leitura literal de msqrt/mroot sem semĂąntica inferida. +# O inglĂȘs evita dizer "quadrada" porque a forma literal nĂŁo garante Ă­ndice. +- name: literal-default + tag: msqrt + match: "." + replace: + - test: + if: "$Verbosity!='Terse'" + then: [OT: "a"] + - T: "raiz" + - test: + if: "$Verbosity!='Terse'" + then: [T: "de"] + - x: "*[1]" + - pause: short + - test: + if: "not(IsNode(*[1],'leaf')) or $Impairment = 'Blindness'" + then: [T: "fim da raiz", pause: medium] + +- name: literal-default + # audit-ignore: divergĂȘncia deliberada do en — ordem portuguesa: raiz de Ă­ndice N de X — o teste final acompanha o Ășltimo elemento falado + tag: mroot + match: "." + replace: + - test: + if: "$Verbosity!='Terse'" + then: [OT: "a"] + - T: "raiz de Ă­ndice" + - x: "*[2]" + - pause: short + - T: "de" + - x: "*[1]" + - pause: short + - test: + if: "not(IsNode(*[1],'leaf'))" + then: [T: "fim da raiz"] + +- name: simple-sub + tag: indexed-by + # invisible comma -- want "x 1 when subscript is an integer" + match: "count(*)=2 and $Verbosity='Terse' and *[2][self::m:mn and translate(., '.,', '')=.]" + replace: + - x: "*[1]" + - x: "*[2]" + - pause: short + +- name: no-end-sub + tag: indexed-by + # invisible comma -- want "x 1 when subscript is an integer" + match: "count(*)=2 and (IsNode(*[2], 'leaf') or *[2][self::m:mrow][*[2][.='⁣']])" + replace: + - x: "*[1]" + - test: + if: "$Verbosity!='Terse' or not(*[2][self::m:mn])" # just say "x 1" for terse vs "x sub 1" + then: [T: "subscrito"] + - x: "*[2]" + +- name: literal + tag: msub + match: "." + replace: + - x: "*[1]" + - T: "subscrito" + - x: "*[2]" + +- name: literal + tag: [msup, msubsup] + match: "." + replace: + - x: "*[1]" + - test: + if: "name(.)='msubsup'" + then: + - T: "subscrito" + - x: "*[2]" + - test: + if: "*[last()][translate(., 'â€Č″‮⁗†‡°*', '')='']" + then: [x: "*[last()]"] + else_test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" # FIX: is this test necessary? + then: + - T: "sobrescrito" + - x: "*[last()]" + - test: + if: "not(IsNode(*[last()], 'simple'))" + then: [T: "fim do sobrescrito"] + else: + - T: "elevado Ă " + - x: "*[last()]" + - T: "potĂȘncia" + +- name: default + tag: munder + match: "." + replace: + - test: + if: "not(IsNode(*[1], 'leaf'))" + then: [T: "modificado"] + - x: "*[1]" + - T: "com" + - x: "*[2]" + - T: abaixo +# NOTA: aqui existia uma regra "dot-over" que eu havia acrescentado supondo +# ser uma porta do inglĂȘs. Ela NÃO existe em en/ — o inglĂȘs trata a notação +# de Newton pela regra "diacriticals" abaixo, que apenas fala o caractere. +# A regra inventada encobria a diacriticals e produzia "x com ponto acima" +# no lugar de "x ponto". Removida. + +- name: diacriticals + tag: [mover, modified-variable] + match: "*[1][self::m:mi] and *[2][translate(., '\u0306\u030c.\u00A8\u02D9\u20DB\u20DC`^ˇ~→¯_', '')='']" + replace: + - x: "*[1]" + - x: "*[2]" + - pause: short + +- name: default + tag: mover + match: "." + replace: + - test: + if: "not(IsNode(*[1], 'leaf'))" + then: [T: "modificado"] + - x: "*[1]" + - T: "com" + - x: "*[2]" + - T: "acima de" + +- name: default + tag: munderover + match: "." + replace: + - test: + if: "not(IsNode(*[1], 'leaf'))" + then: [T: "modificado"] + - x: "*[1]" + - T: "com" + - x: "*[2]" + - T: "e abaixo" + - x: "*[3]" + - T: "acima de" + +- name: default + # Here we support up to 2 prescripts and up to 4 postscripts -- that should cover all reasonable cases + # If there are more, we just dump them out without regard to sup/super :-( + # FIX: this could use more special cases + # There is (currently) no way in MathCAT to deal with n-ary arguments other than "all" ('*') or an individual entry ('*[1]'). + tag: mmultiscripts + match: "." + variables: + # computing the number of postscripts is messy because of being optionally present -- we use "mod" to get the count right + - Prescripts: "m:mprescripts/following-sibling::*" + - NumChildren: "count(*)" # need to stash this since the count is wrong inside '*[...]' below + - Postscripts: "*[position()>1 and position() < (last() + ($NumChildren mod 2) -count($Prescripts))]" + replace: + - x: "*[1]" + - test: + if: "$Prescripts" # more common case + then: + - with: + variables: + - PreSubscript: "IfThenElse($Verbosity='Verbose', 'prĂ©-subscrito', 'prĂ©-sub')" + - PreSuperscript: "IfThenElse($Verbosity='Verbose', 'prĂ©-sobrescrito', 'prĂ©-super')" + replace: + - test: # only bother announcing if there is more than one prescript + if: "count($Prescripts) > 2" + then: + - T: "com" + - x: "count($Prescripts) div 2" + - T: "prĂ©-escritos" + - pause: short + - test: + if: "not($Prescripts[1][self::m:none])" + then: + - x: "$PreSubscript" + - x: "$Prescripts[1]" + - test: + if: "not($Prescripts[1][self::m:none] or $Prescripts[2][self::m:none])" + then: [T: "e"] + - test: + if: "not($Prescripts[2][self::m:none])" + then: + - x: "$PreSuperscript" + - x: "$Prescripts[2]" + - pause: short + - test: + if: "count($Prescripts) > 2" # more common case + then: + - test: + if: "not($Prescripts[3][self::m:none])" + then: + - x: "$PreSubscript" + - x: "$Prescripts[3]" + - test: + if: "not($Prescripts[3][self::m:none] or $Prescripts[4][self::m:none])" + then: [T: "e"] + - test: + if: "not($Prescripts[4][self::m:none])" + then: + - x: "$PreSuperscript" + - x: "$Prescripts[4]" + - test: + if: "count($Prescripts) > 4" # give up and just dump them out so at least the content is there + then: + - T: "e prĂ©-escritos alternados" + - x: "$Prescripts[position() > 4]" + - T: "fim dos prĂ©-escritos" + - test: + if: "$Postscripts" + then: + - with: + variables: + - PostSubscript: "IfThenElse($Verbosity='Verbose', 'subscrito', 'sub')" + - PostSuperscript: "IfThenElse($Verbosity='Verbose', 'sobrescrito', 'super')" + replace: + - test: # only bother announcing if there is more than one postscript + if: "count($Postscripts) > 2" + then: + - test: + if: "$Prescripts" + then: [T: "e"] + - T: "com" + - x: "count($Postscripts) div 2" + - T: "pĂłs-escritos" + - pause: short + - test: + if: "not($Postscripts[1][self::m:none])" + then: + - x: "$PostSubscript" + - x: "$Postscripts[1]" + - test: + if: "not($Postscripts[1][self::m:none] or $Postscripts[2][self::m:none])" + then: [T: "e"] + - test: + if: "not($Postscripts[2][self::m:none])" + then: + - x: "$PostSuperscript" + - x: "$Postscripts[2]" + - test: + if: "count($Postscripts) > 2" + then: + - test: + if: "not($Postscripts[3][self::m:none])" + then: + - x: "$PostSubscript" + - x: "$Postscripts[3]" + - test: + if: "not($Postscripts[3][self::m:none] or $Postscripts[4][self::m:none])" + then: [T: "e"] + - test: + if: "not($Postscripts[4][self::m:none])" + then: + - x: "$PostSuperscript" + - x: "$Postscripts[4]" + - test: + if: "count($Postscripts) > 4" + then: + - test: + if: "not($Postscripts[5][self::m:none])" + then: + - x: "$PostSubscript" + - x: "$Postscripts[5]" + - test: + if: "not($Postscripts[5][self::m:none] or $Postscripts[6][self::m:none])" + then: [T: "e"] + - test: + if: "not($Postscripts[6][self::m:none])" + then: + - x: "$PostSuperscript" + - x: "$Postscripts[6]" + - test: + if: "count($Postscripts) > 6" + then: + - test: + if: "not($Postscripts[7][self::m:none])" + then: + - x: "$PostSubscript" + - x: "$Postscripts[7]" + - test: + if: "not($Postscripts[7][self::m:none] or $Postscripts[8][self::m:none])" + then: [T: "e"] + - test: + if: "not($Postscripts[8][self::m:none])" + then: + - x: "$PostSuperscript" + - x: "$Postscripts[8]" + - test: + if: "count($Postscripts) > 8" # give up and just dump them out so at least the content is there + then: + - T: "e Ă­ndices alternados" + - x: "$Postscripts[position() > 8]" + - T: "fim dos Ă­ndices" + + +- name: default + tag: [mtable, array] + variables: + - IsColumnSilent: "false()" + - NumColumns: "count(*[1]/*) - IfThenElse(*/self::m:mlabeledtr, 1, 0)" + match: "." + replace: + - T: "tabela com" + - x: count(*) + - test: + if: count(*)=1 + then: [T: "linha"] + else: [T: "linhas"] + - T: e + - x: "$NumColumns" + - test: + if: "$NumColumns" + then: [T: "coluna"] + else: [T: "colunas"] + - pause: long + - x: "*" + +- name: default + # ATUALIZADO para a geração atual do en: anuncia "linha N" e, no + # mlabeledtr, o rĂłtulo — a versĂŁo herdada do es sĂł falava os filhos, + # deixando tabelas genĂ©ricas sem anĂșncio de linha. + tag: [mtr, mlabeledtr] + match: "." + replace: + - pause: medium + - T: "linha" + - x: "count(preceding-sibling::*)+1" + - test: + if: "self::m:mlabeledtr" + then: + - T: "com rĂłtulo" + - x: "*[1]/*" + - pause: short + - pause: medium + - test: + if: "self::m:mlabeledtr" + then: [x: "*[position()>1]"] + else: [x: "*"] + +- name: default + tag: mtd + match: "." + replace: + - T: "coluna" + - x: "count(preceding-sibling::*)+IfThenElse(parent::m:mlabeledtr, 0, 1)" + - pause: medium + - x: "*" # speak the entry + - pause: long + +- name: empty-box + # The ordering below is the order in which words come out when there is more than one value + # Note: @notation can contain more than one value + tag: menclose + match: "@notation='box' and *[self::m:mtext and .=' ']" + replace: + - T: "cĂ©lula vazia" + +- name: default + # The ordering below is the order in which words come out when there is more than one value + # Note: @notation can contain more than one value + tag: menclose + match: "." + replace: + - test: + if: ".[contains(concat(' ', normalize-space(@notation), ' '), ' box ')]" + then: [T: "cĂ©lula", pause: short] + - test: + if: ".[contains(@notation,'roundedbox')]" + then: [T: "cĂ©lula redonda", pause: short] + - test: + if: ".[contains(@notation,'circle')]" + then: [T: "cĂ­rculo", pause: short] + - test: + if: ".[ contains(concat(' ', normalize-space(@notation), ' '), ' left ') or contains(concat(' ', normalize-space(@notation), ' '), ' right ') or contains(@notation,'top') or contains(@notation,'bottom') ]" + then: + - T: linha acima + - test: + if: ".[contains(concat(' ', normalize-space(@notation), ' '), ' left ')]" + then: [T: "esquerda", pause: short] + - test: + if: ".[contains(concat(' ', normalize-space(@notation), ' '), ' right ')]" + then: [T: "direita", pause: short] + - test: + if: ".[contains(@notation,'top')]" + then: [T: "superior", pause: short] + - test: + if: ".[contains(@notation,'bottom')]" + then: [T: "inferior", pause: short] + - test: + if: ".[ contains(@notation,'updiagonalstrike') or contains(@notation,'downdiagonalstrike') or contains(@notation,'verticalstrike') or contains(@notation,'horizontalstrike') ]" + then: + - test: + if: ".[contains(@notation,'updiagonalstrike') and contains(@notation,'downdiagonalstrike')]" + then: [spell: "'x'", pause: short] # seems better to say 'x cross out' than 'up diagonal, down diagonal cross out' + else: + - test: + if: ".[contains(@notation,'updiagonalstrike')]" + then: [T: "diagonal superior", pause: short] + - test: + if: ".[contains(@notation,'downdiagonalstrike')]" + then: [T: "diagonal inferior", pause: short] + - test: + if: ".[contains(@notation,'verticalstrike')]" + then: [T: "vertical", pause: short] + - test: + if: ".[contains(@notation,'horizontalstrike')]" + then: [T: "horizontal", pause: short] + - T: riscado + - pause: short + - test: + if: ".[contains(@notation,'uparrow')]" + then: [T: "seta para cima", pause: short] + - test: + if: ".[contains(concat(' ', normalize-space(@notation), ' '), ' downarrow ')]" + then: [T: "seta para baixo", pause: short] + - test: + if: ".[contains(@notation,'leftarrow')]" + then: [T: "seta para a esquerda", pause: short] + - test: + if: ".[contains(concat(' ', normalize-space(@notation), ' '), ' rightarrow ')]" + then: [T: "seta para a direita", pause: short] + - test: + if: ".[contains(@notation,'northeastarrow')]" + then: [T: "seta para nordeste", pause: short] + - test: + if: ".[contains(concat(' ', normalize-space(@notation), ' '), ' southeastarrow ')]" + then: [T: "seta para sudeste", pause: short] + - test: + if: ".[contains(concat(' ', normalize-space(@notation), ' '), ' southwestarrow ')]" + then: [T: "seta para sudoeste", pause: short] + - test: + if: ".[contains(@notation,'northwestarrow')]" + then: [T: "seta para noroeste", pause: short] + - test: + if: ".[contains(@notation,'updownarrow')]" + then: [T: "seta vertical de duas pontas", pause: short] + - test: + if: ".[contains(@notation,'leftrightarrow')]" + then: [T: "seta horizontal de duas pontas", pause: short] + - test: + if: ".[contains(@notation,'northeastsouthwestarrow')]" + then: [T: "seta diagonal superior de duas pontas", pause: short] + - test: + if: ".[contains(@notation,'northwestsoutheastarrow')]" + then: [T: "seta diagonal inferior de duas pontas", pause: short] + - test: + if: ".[contains(@notation,'actuarial')]" + then: [T: "sĂ­mbolo atuarial", pause: short] + - test: + if: ".[contains(@notation,'madrub')]" + then: [T: "sĂ­mbolo fatorial arĂĄbico", pause: short] + - test: + if: ".[contains(@notation,'phasorangle')]" + then: [T: "Ăąngulo fasorial", pause: short] + - test: + if: ".[contains(@notation,'longdiv') or not(@notation) or normalize-space(@notation) ='']" # default + then: [T: "sĂ­mbolo de divisĂŁo longa", pause: short] + - test: + if: ".[contains(@notation,'radical')]" + then: [T: "raiz quadrada", pause: short] + - T: em torno de + - test: + if: "*[self::m:mtext and .=' ']" + then: [T: "espaço"] # otherwise there is complete silence + else: [x: "*"] + - test: + if: "$Impairment = 'Blindness' and ( $SpeechStyle != 'SimpleSpeak' or not(IsNode(*[1], 'leaf')) )" + then: [T: fim do destaque] + - pause: short + +- name: semantics + tag: "semantics" + match: "*[@encoding='MathML-Presentation']" + replace: + - x: "*[@encoding='MathML-Presentation']/*[1]" + +- name: semantics-default + tag: "semantics" + match: . + replace: + - x: "*[1]" + +- name: apply-function + tag: "apply-function" + match: . + replace: + - x: "*[1]" + - T: "de" + - pause: auto + - x: "*[position() > 1]" + +# Here are the intent hints that need to be handled: 'prefix' | 'infix' | 'postfix' | 'function' | 'silent' +- name: produto-vetorial-ou-escalar-sem-filhos + # O motor infere ⃗a × ⃗b e ⃗a ⋅ ⃗b como um elemento / + # SEM filhos (o prĂłprio operador vira o elemento, data-from-mathml='mo'). + # Nenhuma regra de intent casa com count(*)=0, e a regra genĂ©rica falava o + # NOME do intent: "cross product", em inglĂȘs. Aqui passa pelo IntentMappings + # do pt. Ver ACHADOS 9.4. + tag: [cross-product, dot-product] + match: "count(*)=0" + replace: + - x: "SpeakIntentName(name(.), $Verbosity, 'infix')" + +- name: silent-intent + # uncaught intent -- the args have been inserted in the order of speech + tag: "*" + match: "count(*)>0 and (contains(@data-intent-property, ':silent:') or translate(name(.), '-_', '')='')" + replace: + - x: "*" + - test: + if: "IsNode(., '2D')" + then: [pause: short] + else: [pause: auto] + +# ACRESCENTADO: potĂȘncia cujo expoente carrega um Ă­ndice (x^(y_z)). +- name: power-indexed-by + tag: power-indexed-by + match: "." + replace: + - x: "*[1]" + - T: "sub" + - x: "*[2]" + - pause: short + +# ACRESCENTADO: intents com a propriedade :nofix: os argumentos jĂĄ +# vĂȘm na ordem de fala; basta falar o nome do intent. +- name: nofix-intent + tag: "*" + match: "contains(@data-intent-property, ':nofix:') " + replace: + - x: "SpeakIntentName(name(.), $Verbosity, 'nofix')" + +- name: prefix-intent + # uncaught intent -- the args have been inserted in the order of speech + tag: "*" + match: "count(*)>0 and contains(@data-intent-property, ':prefix:')" + replace: + - x: "SpeakIntentName(name(.), $Verbosity, 'prefix')" + - x: "*" + - test: + if: "not( IsBracketed(., '', '') or IsNode(*[last()], 'simple') )" + then: [x: "GetBracketingIntentName(name(.), $Verbosity, 'prefix', 'end')"] + - test: + if: "IsNode(., '2D')" + then: [pause: short] + else: [pause: auto] + +- name: postfix-intent + # uncaught intent -- the args have been inserted in the order of speech + tag: "*" + match: "count(*)>0 and contains(@data-intent-property, ':postfix:')" + replace: + - test: + if: "$Impairment = 'Blindness' and not( IsBracketed(., '', '') or IsNode(*[1], 'simple') )" + then: [x: "GetBracketingIntentName(name(.), $Verbosity, 'postfix', 'start')"] + - x: "*" + - x: "SpeakIntentName(name(.), $Verbosity, 'postfix')" + +- name: infix-intent + # uncaught intent -- the args have been inserted in the order of speech + tag: "*" + match: "count(*)>0 and contains(@data-intent-property, ':infix:')" + replace: + - test: + if: "$Impairment = 'Blindness' and not( IsBracketed(., '', '') or IsNode(*[1], 'simple') )" + then: [x: "GetBracketingIntentName(name(.), $Verbosity, 'infix', 'start')"] + - test: + if: "count(*) = 1" # in cases such as continued-row, plus/minus might have just one child + then: + - x: "SpeakIntentName(name(.), $Verbosity, 'infix')" + - pause: auto + - x: "*[1]" + else: + - insert: + nodes: "*" + replace: [x: "SpeakIntentName(name(.), $Verbosity, 'infix')", pause: auto] + - test: + if: "$Impairment = 'Blindness' and not( IsBracketed(., '', '') or IsNode(*[last()], 'simple') )" + then: [x: "GetBracketingIntentName(name(.), $Verbosity, 'infix', 'end')"] + - test: + if: "IsNode(., '2D')" # add (probably) a slightly longer pause if this came from a 2D node + then: [pause: short] + else: [pause: auto] + +- name: function-intent + # uncaught intent -- speak as foo of arg1 comma arg2 .... The MathML spec requires arguments to functions + tag: "*" + match: "count(*)>0" + replace: + - x: "SpeakIntentName(name(.), $Verbosity, 'function')" + - test: + if: "not(contains(@data-intent-property, ':literal:')) and + not(count(*)=2 and (IsInDefinition(*[1], 'TrigFunctionNames') or IsInDefinition(name(.), 'TerseFunctionNames')) and IsNode(*[2], 'simple'))" + then: [T: "de", pause: auto] # phrase(sine 'of' 5) + - insert: + nodes: "*" + replace: + - test: + if: "not(contains(@data-intent-property, ':literal:'))" + then: [x: "','"] + - pause: auto + - test: + if: "$Impairment = 'Blindness' and not(*[last()][IsBracketed(., '', '') or IsNode(., 'simple')] )" + then: [x: "GetBracketingIntentName(name(.), $Verbosity, 'function', 'end')"] + - test: + if: "IsNode(., '2D')" + then: [pause: short] + else: [pause: auto] + + +- name: default-text + # unknown leaf -- just speak the text -- could be a literal intent + tag: "*" + match: "." + replace: + - x: "translate(name(), '-_', ' ')" diff --git a/Rules/Languages/pt/SharedRules/general.yaml b/Rules/Languages/pt/SharedRules/general.yaml new file mode 100644 index 000000000..5b5a69634 --- /dev/null +++ b/Rules/Languages/pt/SharedRules/general.yaml @@ -0,0 +1,1121 @@ +--- + +# number-sets are a little messy in that the base was converted to a number-set, so we have to match that (simple) case last +- name: pos-neg-number-sets + tag: number-sets + match: "count(*)=2 and *[2][.='+' or .='-']" + replace: + - test: + if: "$Verbosity!='Terse'" + then: + - T: "a" + - bookmark: "*[2]/@id" + - test: + - if: "*[2][.='+']" + then: [T: "positivo"] + else: [T: "negativo"] + - bookmark: "*[1]/@id" + - test: + - if: "*[1][.='ℂ']" + then: [T: nĂșmeros complexos] + - else_if: "*[1][.='ℕ']" + then: [T: nĂșmeros naturais] + - else_if: "*[1][.='ℚ']" + then: [T: nĂșmeros racionais] + - else_if: "*[1][.='ℝ']" + then: [T: nĂșmeros reais] + - else_if: "*[1][.='â„€']" + then: [T: inteiros] + else: [x: "*[1][text()]"] # shouldn't happen + +- name: dimension-number-sets + + # should be single digit integer at this point (e.g, R^3) + tag: number-sets + match: "count(*)=2" + replace: + - bookmark: "*[1]/@id" + - test: + - if: "*[1][.='ℂ']" + then: [T: "C"] + - else_if: "*[1][.='ℕ']" + then: [T: "N"] + - else_if: "*[1][.='ℚ']" + then: [T: "Q"] + - else_if: "*[1][.='ℝ']" + then: [T: "R"] + - else_if: "*[1][.='â„€']" + then: [T: "Z"] + else: [x: "*[1][text()]"] # shouldn't happen + - bookmark: "*[2]/@id" + - x: "*[2]" + +- name: simple-number-sets + tag: number-sets + match: "count(*)=0" + replace: + - bookmark: "@id" + - test: + - if: ".='ℂ'" + then: [T: nĂșmeros complexos] + - else_if: ".='ℕ'" + then: [T: nĂșmeros naturais] + - else_if: ".='ℚ'" + then: [T: nĂșmeros racionais] + - else_if: ".='ℝ'" + then: [T: nĂșmeros reais] + - else_if: ".='â„€'" + then: [T: inteiros] + else: [x: "text()"] # shouldn't happen + +- name: real-part + tag: real-part + match: "." + replace: + - bookmark: "@id" + - T: a parte real +- name: imaginary-part + tag: imaginary-part + match: "." + replace: + - bookmark: "@id" + - T: a parte imaginĂĄria# rules on scripted vertical bars ('evaluated at') +- name: evaluated-at-2 + tag: evaluate + match: "count(*)=2" + replace: + - x: "*[1]" + - pause: auto + - T: avaliado em + - pause: auto + - x: "*[2]" + +- name: evaluated-at-3 + tag: evaluate + match: "count(*)=3" + replace: + - x: "*[1]" + - pause: auto + - T: avaliado em + - pause: auto + - x: "*[3]" + - T: "avaliado na mesma expressĂŁo" + - x: "*[2]" + +- name: permutation + tag: pochhammer + match: "count(*)=2" + replace: + - x: "*[2]" + - T: permutaçÔes de + - x: "*[1]" + +- name: intervals + tag: [open-interval, open-closed-interval, closed-interval, closed-open-interval] + match: "count(*)=2" + replace: + - test: + if: "$Verbosity!='Terse'" + then: + - T: "o" + - test: + - if: "self::m:open-interval" + then: [T: "intervalo aberto"] + - else_if: "self::m:closed-interval" + then: [T: "intervalo fechado"] + - else_if: "self::m:open-closed-interval" + then: [T: "intervalo aberto fechado"] + else: [T: "intervalo fechado aberto"] + - test: + if: "$Verbosity!='Terse'" + then: + - T: "de" + - x: "*[1]" + - T: "a" + - x: "*[2]" + else: + - x: "*[1]" + - T: "vĂ­rgula" + - x: "*[2]" + +- name: default-point + tag: point + match: "count(*)=2" + replace: + - test: + if: "$Verbosity!='Terse'" + then: + - T: "o" + - T: "ponto" + - x: "*[1]" + - T: "vĂ­rgula" + - x: "*[2]" + +- name: bigop-both + tag: large-op + match: "count(*) = 3" + replace: + - test: + if: "$Verbosity!='Terse'" + then_test: + # "a integral", "o somatĂłrio": o artigo concorda com o operador. + if: "*[1][self::m:mo][contains('∫∏∭∟∯∰∱âˆČ∳⹋⹌⹍⹎⹏⹐⹑⹒⹓⹔⹕⹖⹗⹘⹙⹚⹛⹜', .)]" + then: [T: a] + else: [T: o] + - x: "*[1]" + - T: de + - x: "*[2]" + - T: a + - x: "*[3]" + - test: + if: "following-sibling::*" + then: [T: de] + +- name: bigop-under + tag: large-op + match: "count(*)=2" + replace: + - test: + if: "$Verbosity!='Terse'" + then_test: + # "a integral", "o somatĂłrio": o artigo concorda com o operador. + if: "*[1][self::m:mo][contains('∫∏∭∟∯∰∱âˆČ∳⹋⹌⹍⹎⹏⹐⹑⹒⹓⹔⹕⹖⹗⹘⹙⹚⹛⹜', .)]" + then: [T: a] + else: [T: o] + - x: "*[1]" + - T: sobre + - x: "*[2]" + - test: + if: "following-sibling::*" + then: [T: de] + +- name: largeop + tag: mrow + match: "count(*)=2 and IsInDefinition(*[1], 'LargeOperators')" + replace: + - test: + if: "$Verbosity!='Terse'" + then_test: + # "a integral", "o somatĂłrio": o artigo concorda com o operador. + if: "*[1][self::m:mo][contains('∫∏∭∟∯∰∱âˆČ∳⹋⹌⹍⹎⹏⹐⹑⹒⹓⹔⹕⹖⹗⹘⹙⹚⹛⹜', .)]" + then: [T: a] + else: [T: o] + - x: "*[1]" + - T: de + - x: "*[2]" + +- name: msubsup-skip-super + # handles single, double, etc., prime + tag: [skip-super, say-super] + match: "count(*)=3" + replace: + - x: "*[1]" + # CORREÇÃO: a distinção Verbose/conciso do inglĂȘs ("subscript"/"sub") + # tinha colapsado, os dois ramos diziam a mesma coisa. Restaurada, + # coerente com as abreviaçÔes de default.yaml ('subscrito'/'sub'). + # TambĂ©m restaurada a condição $Impairment='Blindness' do match interno, + # presente no inglĂȘs e perdida na tradução. + - test: + if: "$Verbosity='Verbose'" + then: [T: "subscrito"] + else: [T: "sub"] + - x: "*[2]" + - test: + if: "not(IsNode(*[2],'leaf') and $Impairment = 'Blindness')" + then: + - test: + if: "$Verbosity='Verbose'" + then: [T: "fim do subscrito"] + else: [T: "fim do sub"] + - pause: short + else_test: + if: "*[2][self::m:mi]" # need a pause in "x sub k prime" so the prime is not associated with the 'k' + then: [pause: short] + - test: + if: "name(.)='say-super'" + then_test: + if: "$Verbosity='Verbose'" + then: [T: "sobrescrito"] + else: [T: "super"] + - x: "*[3]" + - pause: short + +# the order of matching is +# 1. does it match the base of an SI unit +# 2. does it match an English unit (if in an English language) +# 3. does it match an SI prefix followed by an SI that accepts SI prefixes +# Due to this order, some things like "ft" and "cd" mean "feet" vs "femto-tonnes" and "pints" vs "pico-tonnes" +# ACRESCENTADO (en): no modo conciso, unidade de uma letra Ă© soletrada +# ("3 m" -> "3 m" soletrado), em vez de expandida para "metros". +- name: unit-terse + tag: unit + match: "$Verbosity = 'Terse' and string-length(.)=1" + replace: + - bookmark: "@id" + - spell: "text()" + +- name: unit + tag: unit + match: "." + variables: + # If the coefficient is singular, we don't add the plural ending. Finding the coefficient is tricky + # Normal case (A) "3m" (parents is mrow), but could also be (B) "3 m^2" (etc.). (parent is msup/mrow) + # But it might be in a fraction as (C) "3 m/s" (parent is mfrac/mrow) or (D) "3 m^2/s^2" (parent is msup/mfrac/mrow) + # or even (E) {3 m^2}/s (parent is msup/mrow) + # If in a fraction, only look in the numerator to find the coefficient + - MRowForCoefficient: "IfThenElse(parent::m:mrow, parent::m:mrow, + IfThenElse(parent::m:power, ancestor::*[2][self::m:mrow], + IfThenElse(parent::m:fraction and not(preceding-sibling::*), ancestor::*[2][self::m:mrow], + IfThenElse(parent::m:power[parent::m:fraction and not(preceding-sibling::*)], ancestor::*[3][self::m:mrow], false()) ) ) )" + - IsSingular: "(not($MRowForCoefficient) and parent::*[name(.)!='skip-super' or *[1][.=1]]) or + ($MRowForCoefficient and $MRowForCoefficient[(count(*) = 3 and *[1][self::m:mn and .=1] and *[2]='\u2062')])" + - Prefix: "''" + - Word: "''" + replace: + - bookmark: "@id" + - test: + # is the whole string match a SI Unit without a prefix? + - if: "DefinitionValue(., 'Speech', 'SIUnits') != ''" + then: + - set_variables: [Word: "DefinitionValue(., 'Speech', 'SIUnits')"] + - else_if: "DefinitionValue(., 'Speech', 'UnitsWithoutPrefixes') != ''" + then: + - set_variables: [Word: "DefinitionValue(., 'Speech', 'UnitsWithoutPrefixes')"] + - else_if: "DefinitionValue(., 'Speech', 'EnglishUnits') != ''" + then: + - set_variables: [Word: "DefinitionValue(., 'Speech', 'EnglishUnits')"] + + # do the first two chars match "da" and the remainder match an SIUnit + - else_if: "string-length(.) >= 3 and + substring(., 1, 2) = 'da' and + DefinitionValue(substring(., 3), 'Speech', 'SIUnits') != ''" + then: + - set_variables: + - Prefix: "DefinitionValue('da', 'Speech', 'SIPrefixes')" + - Word: "DefinitionValue(substring(., 3), 'Speech', 'SIUnits')" + + # does the first char match a prefix and the remainder match an SIUnit + - else_if: "string-length(.) >= 2 and + DefinitionValue(substring(., 1, 1), 'Speech', 'SIPrefixes') != '' and + DefinitionValue(substring(., 2), 'Speech', 'SIUnits') != ''" + then: + - set_variables: + - Prefix: "DefinitionValue(substring(., 1, 1), 'Speech', 'SIPrefixes')" + - Word: "DefinitionValue(substring(., 2), 'Speech', 'SIUnits')" + + # not a known unit -- just speak the text, possibly as a plural + - else: + - set_variables: + - Word: "text()" + + - with: + variables: + - Word: "IfThenElse(substring($Word, string-length($Word)-2, 3) = 'iĂĄn', concat(substring($Word, 1, string-length($Word)-2), ian), $Word)" + - LastChar: "substring($Word, string-length($Word), 1)" + - PluralEnding: "IfThenElse($LastChar = 'r' or $LastChar = 'l', 'es', + IfThenElse(substring($Word, string-length($Word)-2, 3) = 'ian', 'es', 's' )) " + replace: + # somewhat complicated logic to avoid spaces around "-" as in "centi-grams" vs "centi - grams" -- probably doesn't matter + - test: + if: "$Prefix = ''" + then: + - test: + - if: "$IsSingular" + # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets the prefix concatinated to the base + then: [x: "$Word"] + - else_if: "DefinitionValue($Word, 'Speech', 'PluralForms') != ''" + then: [x: "DefinitionValue($Word, 'Speech', 'PluralForms')"] + else: [x: "concat($Word, $PluralEnding)"] + else: + - x: "$Prefix" + - test: + - if: "$IsSingular" + # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets the prefix concatinated to the base + then: [x: "concat('\uF8FE', $Word)"] + - else_if: "DefinitionValue($Word, 'Speech', 'PluralForms') != ''" + then: [x: "concat('\uF8FE', DefinitionValue($Word, 'Speech', 'PluralForms'))"] + else: [x: "concat('\uF8FE', $Word, $PluralEnding)"] + + + +# ACRESCENTADO: valores monetĂĄrios "R$ 100" -> "100 reais". +# Depende de CurrencySymbols e dos plurais em definitions.yaml. +- name: currency + tag: mrow + match: "count(*)=3 and DefinitionValue(*[1], 'Speech', 'CurrencySymbols') != ''" + variables: + # se o valor Ă© 1, nĂŁo pluraliza + - IsSingular: "*[3][self::m:mn and .=1] and *[2]='\u2062'" + - CurrencyWord: "DefinitionValue(*[1], 'Speech', 'CurrencySymbols')" + replace: + - bookmark: "*[3]/@id" + - x: "*[3]" + - test: + - if: "$IsSingular" + then: [x: "$CurrencyWord"] + - else_if: "DefinitionValue($CurrencyWord, 'Speech', 'PluralForms') != ''" + then: [x: "DefinitionValue($CurrencyWord, 'Speech', 'PluralForms')"] + else: [x: "DefinitionValue(*[1], 'Speech', 'CurrencySymbols')", ct: "s"] + +- name: sin + tag: mi + match: ".='sin' or .='sen'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity='Terse'" + then: [T: sen] + else: [T: seno] +- name: cos + tag: mi + match: ".='cos'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity='Terse'" + then: [T: cos] + else: [T: cosseno] +- name: tan + tag: mi + match: ".='tan' or .='tg'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity='Terse'" + then: [T: tan] + else: [T: tangente] +- name: sec + tag: mi + match: ".='sec'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity='Terse'" + then: [T: sec] + else: [T: secante] +- name: csc + tag: mi + match: ".='csc'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity='Terse'" + # CORREÇÃO: dizia "sec", idĂȘntico Ă  regra sec; cossecante e secante + # ficavam indistinguĂ­veis na fala concisa. + then: [T: cossec] + else: [T: cossecante] +- name: cot + tag: mi + match: ".='cot'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity='Terse'" + then: [T: cotan] + else: [T: cotangente] + +- name: sinh + tag: mi + match: ".='sinh'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity='Terse'" + then: [T: seno hiperbĂłlico] + else: [T: seno hiperbĂłlico] +- name: cosh + tag: mi + match: ".='cosh'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity='Terse'" + then: [T: cosseno hiperbĂłlico] + else: [T: cosseno hiperbĂłlico] +- name: tanh + tag: mi + match: ".='tanh'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity='Terse'" + then: [T: tangente hiperbĂłlica] + else: [T: tangente hiperbĂłlica] +- name: sech + tag: mi + match: ".='sech'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity='Terse'" + then: [T: secante hiperbĂłlica] + else: [T: secante hiperbĂłlica] +- name: csch + tag: mi + match: ".='csch'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity='Terse'" + then: [T: cossecante hiperbĂłlica] + else: [T: cossecante hiperbĂłlica] +- name: coth + tag: mi + match: ".='coth'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity='Terse'" + + then: [T: cotangente hiperbĂłlica] + else: [T: cotangente hiperbĂłlica] + +- name: exponential + tag: mi + match: ".='exp'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity='Terse'" + then: [T: "exp"] + else: [T: "exponencial"] +- name: covariance + tag: mi + match: ".='Cov'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity='Terse'" + then: [T: "Cov"] + else: [T: "covariĂąncia"] + +- + # CORREÇÃO: faltava o 'Log' maiĂșsculo (valor principal), presente no inglĂȘs. + # Sem ele, "Log x" caĂ­a na regra genĂ©rica de mi e saĂ­a "Log de x", perdendo a + # distinção. A tradução de "principal value log" ainda nĂŁo foi verificada por + # falante nativo -- daĂ­ o 't:' minĂșsculo. + name: log # handle log, principal Log, and ln (if in an mrow, 'intents' are used) + tag: mi + match: ".='log' or .='Log' or .='ln'" + replace: + - bookmark: "@id" + - test: + - if: "$Verbosity!='Terse'" + then: [T: "o"] # phrase('the' logarithm function is used in mathematics) + - test: + - if: ".= 'log'" + then: [T: "log"] # phrase(the 'log' function is used in mathematics) + - else_if: ".= 'Log'" + then: [t: "log do valor principal"] # (en: 'principal value log') + - else_if: "$Verbosity='Terse'" + then: [SPELL: "'ln'"] + else: [T: "logaritmo natural"] # phrase(the 'natural log' function is used in mathematics) + +- name: multi-line + # audit-ignore: divergĂȘncia deliberada do en — plural por cadeias, nĂŁo por concatenação de s + # that eliminates the need for the if: else_if: ... + # IDEA: set a variable with the word to say for the row (e.g., RowLabel = Row/Case/Line/...) + tag: [piecewise, system-of-equations, lines] + match: "." + variables: [IsColumnSilent: true()] + replace: + - x: "count(*)" + # CORREÇÃO: o plural era feito concatenando "s" (ct: "s"), o que produzia + # "equaçãos". SubstituĂ­do por duas cadeias, singular e plural, escolhidas + # pela contagem — mesma correção jĂĄ aplicada no ClearSpeak. + - test: + if: "count(*) > 1" + then: + - test: + - if: "self::m:piecewise" + then: [T: "casos"] + - else_if: "self::m:system-of-equations" + then: [T: "equaçÔes"] + else: [T: "linhas"] + else: + - test: + - if: "self::m:piecewise" + then: [T: "caso"] + - else_if: "self::m:system-of-equations" + then: [T: "equação"] + else: [T: "linha"] + - pause: short + - x: "*" + +- name: default-multiline + tag: [mtr, mlabeledtr] + match: "parent::m:piecewise or parent::m:system-of-equations or parent::m:lines" + replace: + - pause: medium + - test: + - if: "parent::m:piecewise" + then: [T: "caso"] + - else_if: "parent::m:system-of-equations" + then: [T: "equação"] + else: [T: "linha"] + - x: "count(preceding-sibling::*)+1" + - test: + if: .[self::m:mlabeledtr] + then: + - T: rotulada com + - x: "*[1]/*" + - pause: medium + - test: + if: .[self::m:mlabeledtr] + then: [x: "*[position()>1]"] + else: [x: "*"] + +- name: default-multiline + tag: mtd + match: "parent::*[parent::m:piecewise or parent::m:system-of-equations or parent::m:lines]" + variables: [LongPause: "$SpeechStyle = 'ClearSpeak' and $ClearSpeak_MultiLinePausesBetweenColumns = 'Long'"] + replace: + - x: "*" + - test: + # short pause after each element; medium pause if last element in a row; long pause for last element in matrix unless ClearSpeak override + - if: "count(following-sibling::*) > 0" + then_test: + if: "$LongPause" + then: [pause: medium] + else: [pause: short] + - else_if: "count(../following-sibling::*) > 0" + then_test: + if: "$LongPause" + then: [pause: long] + else: [pause: medium] + else: [pause: long] + +# Matrix/Determinant rules +# matrix and determinant are the same other than "matrix"/"determinant" based on the bracketing chars +# the pausing logic is pushed down to the +# the rules either speak the s (to get "row n") or the s. "column n" spoken if $IsColumnSilent is false +# ACRESCENTADO: regra presente em en/ e ausente em es/ (e portanto em pt). +# Sem ela, dĂ­zimas periĂłdicas (0,333...) nĂŁo eram anunciadas como periĂłdicas. +- name: repeating-decimal + tag: repeating-decimal + match: "." + replace: + - x: "*[1]" + - T: "com dĂ­gitos periĂłdicos" + - spell: "*[2]" + +# NOTA: o inglĂȘs funde matrix e determinant numa regra sĂł. Em portuguĂȘs os +# artigos diferem ("a matriz" / "o determinante"), entĂŁo a separação Ă© +# deliberada, nĂŁo Ă© lacuna de paridade. +- name: 1x1-matrix + # audit-ignore: divergĂȘncia deliberada do en — separada de 1x1-determinant: artigos de gĂȘneros diferentes + tag: matrix + variables: [IsColumnSilent: true()] + match: "count(*)=1 and *[self::m:mtr][count(*) = 1]" + replace: + - OT: "a" + - T: "matriz 1 por 1" + - T: "com o elemento" + - x: "*[1]/*" + +- name: 1x1-determinant + # audit-ignore: divergĂȘncia deliberada do en — idem + tag: determinant + variables: [IsColumnSilent: true()] + match: "count(*)=1 and *[self::m:mtr][count(*) = 1]" + replace: + - OT: "o" + - T: "determinante 1 por 1" + - T: "com o elemento" + - x: "*[1]/*" + + +- name: zero-matrix + tag: matrix + match: "not( */*/*[not(self::m:mn and .= 0)] )" + replace: + - T: "a matriz nula" + - x: count(*) + - T: "por" + - x: count(*[self::m:mtr][1]/*) + - pause: long + +- name: identity-matrix + tag: matrix + match: + - "count(*) = count(*[1]/*) and " + - "not( */*[count(preceding-sibling::*) = count(../preceding-sibling::*)]/*[not(self::m:mn and .= 1)] ) and " + - "not( */*[count(preceding-sibling::*) != count(../preceding-sibling::*)]/*[not(self::m:mn and .= 0)] )" + replace: + - T: "a matriz identidade" + - x: count(*) + - T: "por" + - x: count(*[self::m:mtr][1]/*) + - pause: long + +- name: diagonal-matrix + tag: matrix + match: + - "count(*) = count(*[1]/*) and " + - "not( */*/*[not(self::m:mn and .= 0)]" + - " [count(../preceding-sibling::*)!=count(../../preceding-sibling::*)]" + - " )" + replace: + - T: "a matriz diagonal" + - x: count(*) + - T: "por" + - x: count(*[self::m:mtr][1]/*) + - pause: long + - insert: + nodes: "(*/*/*[not(self::m:mn and .= 0)]/..)" + replace: [pause: auto] + - pause: long + +# simpler reading methods for smaller matrices if the entries are simple +- name: 2-or-3x1-matrix + tag: matrix + variables: [IsColumnSilent: true()] + match: + - "$ClearSpeak_Matrix != 'SpeakColNum' and " # "simple" isn't used for this preference + - "*[self::m:mtr][count(*) = 1] and " # one column + - count(*)<=3 and # at least two rows + - IsNode(*/*/*,'simple') # IsNode() returns true if all the nodes are simple + replace: + - test: + if: "$ClearSpeak_Matrix = 'Vector' or $ClearSpeak_Matrix = 'EndVector'" + then: [T: "o vetor coluna"] + else: [T: "a matriz coluna"] + - x: count(*) + - T: "por 1 coluna" + - pause: long + - x: "*/*" + - test: + if: "$ClearSpeak_Matrix = 'EndMatrix' or $ClearSpeak_Matrix = 'EndVector'" + then: + - T: "fim" + - test: + if: $ClearSpeak_Matrix = 'EndVector' + then: [T: vetor] + else: [T: matriz] + +- name: default-column-matrix + tag: matrix + variables: [IsColumnSilent: true()] + match: "*[self::m:mtr][count(*) = 1]" + replace: + - test: + if: "$ClearSpeak_Matrix = 'Vector' or $ClearSpeak_Matrix = 'EndVector'" + then: [T: "o vetor"] + else: [T: "a matriz"] + - x: "count(*)" + - T: "por 1 coluna" + - pause: long + - x: "*" # select the rows (mtr) + - test: + if: "$ClearSpeak_Matrix = 'EndMatrix' or $ClearSpeak_Matrix = 'EndVector'" + then: [T: "fim da matriz"] + +- name: 1x2-or-3-matrix + tag: matrix + variables: [IsColumnSilent: "$SpeechStyle = 'ClearSpeak' and $ClearSpeak_Matrix != 'SpeakColNum'"] + match: + - "$ClearSpeak_Matrix != 'SpeakColNum' and " # "simple" isn't used for this preference + - count(*)=1 and # one row + - count(*[1]/*)<=3 and # at least two cols + - IsNode(*/*/*,'simple') # IsNode() returns true if all the nodes are simple + replace: + - test: + if: "$ClearSpeak_Matrix = 'Vector' or $ClearSpeak_Matrix = 'EndVector'" + then: [T: "o vetor"] + else: [T: "a matriz"] + - T: "1 por" + - x: count(*/*) + - T: "linha" + - pause: long + - x: "*/*" + - test: + if: "$ClearSpeak_Matrix = 'EndMatrix' or $ClearSpeak_Matrix = 'EndVector'" + then: + - T: "fim" + - test: + if: $ClearSpeak_Matrix = 'EndMatrix' + then: [T: matriz] + else: [T: vetor] + +- name: default-row-matrix + tag: matrix + variables: [IsColumnSilent: "$SpeechStyle = 'ClearSpeak' and $ClearSpeak_Matrix = 'SilentColNum'"] + match: "count(*)=1" # one row + replace: + - test: + if: "$ClearSpeak_Matrix = 'Vector' or $ClearSpeak_Matrix = 'EndVector'" + then: [T: "o vetor"] + else: [T: "a matriz"] + - T: "1 por" + - x: "count(*/*)" + - T: "linha" + - pause: long + - x: "*/*" # select the cols (mtd) + - test: + if: "$ClearSpeak_Matrix = 'EndMatrix' or $ClearSpeak_Matrix = 'EndVector'" + then: + - T: "fim" + - test: + if: $ClearSpeak_Matrix = 'EndMatrix' + then: [T: matriz] + else: [T: vetor] + +- name: simple-small-matrix + tag: [matrix, determinant] + match: + - "$ClearSpeak_Matrix != 'SpeakColNum' and " # "simple" isn't used for this preference + - (count(*)<=3 and count(*[1]/*)<=3) and # no bigger than a 3x3 matrix + - IsNode(*/*/*,'simple') # IsNode() returns true if all the nodes are simple + variables: [IsColumnSilent: "$SpeechStyle = 'ClearSpeak' and $ClearSpeak_Matrix != 'SpeakColNum'"] + replace: + - test: + if: "self::m:determinant" + then: [T: "o determinante"] + else: [T: "a matriz"] + - x: count(*) + - T: por + - x: count(*[self::m:mtr][1]/*) + - pause: long + - x: "*" + - test: + if: "$ClearSpeak_Matrix = 'EndMatrix' or $ClearSpeak_Matrix = 'EndVector'" + then: + - T: fim + - test: + if: "self::m:determinant" + then: [T: "determinante"] + else: [T: "matriz"] + +- name: default-matrix + tag: [matrix, determinant] + variables: [IsColumnSilent: "$SpeechStyle = 'ClearSpeak' and $ClearSpeak_Matrix = 'SilentColNum'"] + match: "not(@data-intent-property)" + replace: + - test: + if: "self::m:determinant" + then: [T: "o determinante"] + else: [T: "a matriz"] + - x: "count(*)" + - T: por + - x: "count(*[self::m:mtr][1]/*)" + - pause: long + - x: "*" + - test: + if: "$ClearSpeak_Matrix = 'EndMatrix' or $ClearSpeak_Matrix = 'EndVector'" + then: + - T: fim + - test: + if: "self::m:determinant" + then: [T: determinante] + else: [T: matriz] + +- name: chemistry-msub + + tag: [chemical-formula] + match: "*[1][.='msub']" + replace: + - x: "*[2]" + - test: + if: "$Verbosity='Verbose'" + then: [T: "subscrito"] + else_test: + if: "$Verbosity='Medium'" + then: [T: "sub"] + - x: "*[3]" + +# ACRESCENTADO: dimensĂ”es de matriz anotadas como dimension-product +# ("3×5" com intent de dimensĂŁo) fala "3 por 5". +- name: dimension-by + tag: mrow + match: dimension-product + replace: + - insert: + nodes: "*" + replace: [T: "por", pause: auto] + +- name: chemistry-msup + tag: [chemical-formula] + match: "count(*)=3 and *[1][.='msup']" + replace: + - x: "*[2]" + - test: + if: "$Verbosity='Verbose'" + then: [T: "sobrescrito"] + else_test: + if: "$Verbosity='Medium'" + then: [T: "super"] + - x: "*[3]" + - test: + if: "following-sibling::*[1][.='+' or .='-']" # a little lazy -- assumes chemistry superscripts end with + or - + then: [pause: medium] + +- + # There currently is no way to do sub/super for n-ary number of args + # Instead, we just deal with up to two prescripts and up to four postscripts (repeating blocks of similar code [UGLY!]) + # This hopefully covers all reasonable cases... + name: chemistry-scripts + tag: [chemical-formula, chemical-nuclide] + variables: + # computing the number of postscripts is messy because of being optionally present -- we use "mod" to get the count right + - Prescripts: "m:mprescripts/following-sibling::*" + - NumChildren: "count(*)" # need to stash this since the count is wrong inside '*[...]' below + - Postscripts: "*[position()>1 and position() < (last() + ($NumChildren mod 2) -count($Prescripts))]" + match: . # should only be msubsup or mmultiscripts at this point + replace: + - test: + if: "$Prescripts" # we have at least one pre sub/super + then: + # nuclide: speak the superscript first + - test: + if: "not($Prescripts[2][self::m:none])" + then: + - test: + if: "$Verbosity='Verbose'" + then: [T: "sobrescrito"] + else_test: + if: "$Verbosity='Medium'" + then: [T: "super"] + - x: "$Prescripts[2]" + - pause: "short" + - test: + if: "not($Prescripts[1][self::m:none])" + then: + - test: + if: "$Verbosity='Verbose'" + then: [T: "subscrito"] + else_test: + if: "$Verbosity='Medium'" + then: [T: "sub"] + - x: "$Prescripts[1]" + - pause: "short" + - test: + if: "count($Prescripts) > 2" # can this happen for chemistry??? we allow for one *extra* pre sub/super pair + then: + - test: + if: "not($Prescripts[4][self::m:none])" + then: + - test: + if: "$Verbosity='Verbose'" + then: [T: "sobrescrito"] + else_test: + if: "$Verbosity='Medium'" + then: [T: "super"] + - x: "$Prescripts[4]" + - pause: "short" + - test: + if: "not($Prescripts[3][self::m:none])" + then: + - test: + if: "$Verbosity='Verbose'" + then: [T: "subscrito"] + else_test: + if: "$Verbosity='Medium'" + then: [T: "sub"] + - x: "$Prescripts[3]" + - pause: "short" + - x: "*[1]" # base + - test: + if: "$Postscripts" + then: + - test: + if: "not($Postscripts[1][self::m:none])" + then: + - test: + if: "$Verbosity='Verbose'" + then: [T: "subscrito"] + else_test: + if: "$Verbosity='Medium'" + then: [T: "sub"] + - x: "$Postscripts[1]" + - pause: "short" + - test: + if: "not($Postscripts[2][self::m:none])" + then: + - test: + if: "$Verbosity='Verbose'" + then: [T: "sobrescrito"] + else_test: + if: "$Verbosity='Medium'" + then: [T: "super"] + - x: "$Postscripts[2]" + - pause: "short" + - test: + if: "count($Postscripts) > 2" + then: + - test: + if: "not($Postscripts[3][self::m:none])" + then: + - test: + if: "$Verbosity='Verbose'" + then: [T: "subscrito"] + else_test: + if: "$Verbosity='Medium'" + then: [T: "sub"] + - x: "$Postscripts[3]" + - pause: "short" + - test: + if: "not($Postscripts[4][self::m:none])" + then: + - test: + if: "$Verbosity='Verbose'" + then: [T: "sobrescrito"] + else_test: + if: "$Verbosity='Medium'" + then: [T: "super"] + - x: "$Postscripts[4]" + - pause: "short" + - test: + if: "count($Postscripts) > 4" + then: + - test: + if: "not($Postscripts[5][self::m:none])" + then: + - test: + if: "$Verbosity='Verbose'" + then: [T: "subscrito"] + else_test: + if: "$Verbosity='Medium'" + then: [T: "sub"] + - x: "$Postscripts[5]" + - pause: "short" + - test: + if: "not($Postscripts[6][self::m:none])" + then: + - test: + if: "$Verbosity='Verbose'" + then: [T: "sobrescrito"] + else_test: + if: "$Verbosity='Medium'" + then: [T: "super"] + - x: "$Postscripts[6]" + - pause: "short" + - test: + if: "count($Postscripts) > 6" + then: + - test: + if: "not($Postscripts[7][self::m:none])" + then: + - test: + if: "$Verbosity='Verbose'" + then: [T: "subscrito"] + else_test: + if: "$Verbosity='Medium'" + then: [T: "sub"] + - x: "$Postscripts[7]" + - pause: "short" + - test: + if: "not($Postscripts[8][self::m:none])" + then: + - test: + if: "$Verbosity='Verbose'" + then: [T: "sobrescrito"] + else_test: + if: "$Verbosity='Medium'" + then: [T: "super"] + - x: "$Postscripts[8]" + - pause: "short" + - test: + if: "$Postscripts[last()][not(self::m:none)] and following-sibling::*[1][.='+' or .='-']" + then: [pause: medium] + +- name: chemistry + + + tag: chemical-equation + match: "." + replace: + - x: "*" + +- name: chemical-element + tag: chemical-element + match: "." + replace: + - bookmark: "@id" + - spell: text() + - pause: short + +- name: chemical-state + tag: chemical-state + match: "count(*)=1" + replace: + - bookmark: "*[1]/@id" + - test: + - if: ".='s'" + then: [T: "sĂłlido"] + - else_if: ".='l'" + then: [T: "lĂ­quido"] + - else_if: ".='g'" + then: [T: "gasoso"] + else: [T: "aquoso"] # (aq) + - pause: short + +- name: chemical-formula-operator-bond + tag: chemical-formula-operator + match: "@data-chemical-bond" + replace: + # FIX: this might be better/more efficient if in unicode.yaml + - bookmark: "@id" + - test: + - if: ".='-' or .=':'" + then: [T: "ligação simples"] + - else_if: ".='=' or .='∷'" # U+2237: o canonicalizador converte '::' nesse caractere + then: [T: "ligação dupla"] + - else_if: ".='≡'" + then: [T: "ligação tripla"] + - else_if: ".='≣'" + then: [T: "ligação quĂĄdrupla"] + else: [x: "text()"] + +- name: chemical-formula-operator + tag: chemical-formula-operator + match: "." + replace: + x: "text()" + +- name: chemical-arrow-operator + tag: chemical-arrow-operator + match: "." + replace: + # FIX: this might be better/more efficient if in unicode.yaml + - bookmark: "@id" + - test: + - if: ".='→' or .='⟶'" + then_test: + if: "$Verbosity='Terse'" + then: [T: "forma"] + else: [T: "reage formando"] + - else_if: ".='⇌' or .='🣑'" # U+01F8D1 + then: [T: "estĂĄ em equilĂ­brio com"] + - else_if: ".='🣓'" # U+1F8D3 + then: [T: "estĂĄ em equilĂ­brio deslocado para a esquerda com"] + - else_if: ".='🣒'" # U+1F8D2 + then: [T: "estĂĄ em equilĂ­brio deslocado para a direita com"] + else: [x: "*"] + +- name: chemical-equation-operator + tag: chemical-equation-operator + match: "." + replace: + - bookmark: "@id" + - x: "text()" + +- name: none + tag: none + match: "../../*[self::m:chemical-formula or self::m:chemical-nuclide]" + replace: + - t: "" # don't say anything + +# ACRESCENTADO: fora da quĂ­mica, cai na regra 'default-text', que fala o +# nome da tag -- em inglĂȘs isso dĂĄ "none", que Ă© aceitĂĄvel lĂĄ, mas em portuguĂȘs +# saĂ­a a palavra inglesa. Aqui traduzimos. +- name: none-default + tag: none + match: "." + replace: + - T: "nenhum" + +- name: ignore-intent-wrapper + tag: intent-wrapper + match: "." + replace: + - x: "*" diff --git a/Rules/Languages/pt/SharedRules/geometry.yaml b/Rules/Languages/pt/SharedRules/geometry.yaml new file mode 100644 index 000000000..24227e81b --- /dev/null +++ b/Rules/Languages/pt/SharedRules/geometry.yaml @@ -0,0 +1,80 @@ + +--- + +- name: line-segment + tag: line-segment + match: "count(*)=2" + replace: + - test: + if: "$Verbosity='Verbose'" + then: + - T: "o segmento de reta de" + - x: "*[1]" + - T: "a" + - x: "*[2]" + else: + - T: "segmento de reta" + - x: "*[1]" + - x: "*[2]" + +- name: geometry-ray + tag: ray + match: "count(*)=2" + replace: + - test: + if: "$Verbosity='Verbose'" + then: + - T: "a semirreta de" + - x: "*[1]" + - T: "a" + - x: "*[2]" + else: + - T: "semirreta" + - x: "*[1]" + - x: "*[2]" + +- name: geometry-arc + tag: arc + match: "count(*)=2" + replace: + - test: + if: "$Verbosity='Verbose'" + then: [T: "o"] + - T: "arco" + - x: "*[1]" + - x: "*[2]" + +- name: measure-of-angle + tag: measure-of-angle + match: "count(*)=3" + replace: + - test: + if: "$Verbosity='Verbose'" + then: + - T: "a medida do Ăąngulo" + else: + - T: "medida do Ăąngulo" + - x: "*[1]" + - x: "*[2]" + - x: "*[3]" + +# ACRESCENTADO +- name: coordinate + tag: coordinate + match: "." + replace: + - test: + if: "$Verbosity='Verbose'" + then: [OT: "o"] + - T: "ponto" + - test: + if: "$Verbosity='Verbose'" + then: [T: "em"] + - pause: short + - insert: + nodes: "*" + replace: [T: "vĂ­rgula", pause: auto] + - pause: short + - test: + if: "($SpeechStyle='ClearSpeak' and $Verbosity='Verbose') or not(IsNode(*[last()],'leaf'))" + then: [T: "fim do ponto"] diff --git a/Rules/Languages/pt/SharedRules/linear-algebra.yaml b/Rules/Languages/pt/SharedRules/linear-algebra.yaml new file mode 100644 index 000000000..72acf26be --- /dev/null +++ b/Rules/Languages/pt/SharedRules/linear-algebra.yaml @@ -0,0 +1,35 @@ +--- + +- name: scalar-determinant + tag: determinant + match: "count(*)=1 and not(*[1][self::m:mtr])" + replace: + - test: + if: "$Verbosity='Verbose'" + then: + - T: "o" + - T: "determinante" + - test: + if: "$Verbosity!='Terse'" + then: + - T: "de" + - x: "*[1]" + - test: + if: "not(IsNode(*[1], 'simple'))" + then: [T: "fim do determinante"] + +- name: subscripted-norm + tag: subscripted-norm + match: "count(*)=2" + replace: + - test: + if: "$Verbosity='Verbose'" + then: + - T: "a" + - x: "*[2]" + - T: "norma" + - test: + if: "$Verbosity!='Terse'" + then: + - T: "de" + - x: "*[1]" diff --git a/Rules/Languages/pt/SimpleSpeak_Rules.yaml b/Rules/Languages/pt/SimpleSpeak_Rules.yaml new file mode 100644 index 000000000..7677751f0 --- /dev/null +++ b/Rules/Languages/pt/SimpleSpeak_Rules.yaml @@ -0,0 +1,338 @@ +--- + +- name: pause + tag: "!*" + match: "not(self::m:math) and not($MatchingPause) and @data-intent-property[contains(., ':pause')]" + replace: + - with: + variables: [MatchingPause: "true()"] + replace: + - test: + - if: "contains(@data-intent-property, ':pause-long')" + then: [pause: long] + - else_if: "contains(@data-intent-property, ':pause-short')" + then: [pause: short] + else: [pause: medium] + - x: "." + +- name: intent-literal-silent + tag: [mi, mo, mn] + match: "contains(@data-intent-property, ':silent:')" + # say nothing + replace: [] + +# handling of negative numbers that come from 'intent' is hard -- we do something that is close to right here +- name: intent-literal-negative-number + tag: mn + match: "starts-with(text(), '-')" + replace: + - T: "menos" # phrase(x 'minus' y) + - x: "translate(text(), '-_', '')" + +- name: default + tag: square-root + match: "." + replace: + - test: + if: "$Verbosity!='Terse'" + then: [T: "a"] # phrase('the' square root of x) — "a raiz" (feminino) + - T: "raiz quadrada" # phrase(the 'square root' of x) + - test: + if: "$Verbosity!='Terse'" + then: [T: "de"] # phrase(the square root 'of' x) + else: [pause: short] + - x: "*[1]" + - test: + if: IsNode(*[1], 'leaf') + then: [pause: short] + else: [T: "fim da raiz", pause: short] # phrase(the square root of x 'end root') + +- name: default + tag: root + match: "." + replace: + - test: + if: "$Verbosity!='Terse'" + then: [T: a] + - test: + if: "*[2][self::m:mn]" + then_test: + - if: "*[2][.='2']" + then: [T: "raiz quadrada"] + - else_if: "*[2][.='3']" + then: [T: "raiz cĂșbica"] + - else_if: "*[2][not(contains(., '.'))]" + then: [T: "raiz de Ă­ndice", x: "*[2]"] + else: + # CORREÇÃO: o arquivo em espanhol manteve o bloco "pronounce" com o + # sufixo inglĂȘs "-th" , herdado do inglĂȘs "n-th root". + # Em portuguĂȘs a leitura natural Ă© "raiz de Ă­ndice n", sem sufixo... + - T: "raiz de Ă­ndice" + - x: "*[2]" + - test: + if: "$Verbosity!='Terse'" + then: [T: "de"] + - x: "*[1]" + - test: + if: IsNode(*[1], 'leaf') + then: [pause: short] + else: [T: "fim da raiz", pause: short] + +# Fraction rules +# Mixed numbers mostly "just work" because the invisible char reads as "and" and other parts read properly on their own +- name: common-fraction + tag: fraction + match: + - "*[1][self::m:mn][not(contains(., '.')) and text()<20] and" + - "*[2][self::m:mn][not(contains(., '.')) and 2<= text() and text()<=10]" + replace: [x: ToCommonFraction(.)] +- name: common-fraction-mixed-number + tag: fraction + match: + - "preceding-sibling::*[1][self::m:mo][.='⁀'] and" # preceding element is invisible plus + - "*[1][self::m:mn][not(contains(., '.'))] and" + - "*[2][self::m:mn][not(contains(., '.'))]" + replace: [x: ToCommonFraction(.)] + + +# Units (e.g., meters per second, m^2/s^2, (3m^2)/s) +- name: per-fraction + tag: fraction + match: + - "BaseNode(*[1])[contains(@data-intent-property, ':unit') or" + - " ( self::m:mrow and count(*)=3 and" # maybe a bit paranoid checking the structure... + - " *[1][self::m:mn] and *[2][.='\u2062'] and BaseNode(*[3])[contains(@data-intent-property, ':unit')] ) ] and" + - "BaseNode(*[2])[contains(@data-intent-property, ':unit')] " + replace: + - x: "*[1]" + - T: "por" # phrase('5 meters 'per' second) — "cinco metros por segundo" + - x: "*[2]" + +- name: simple + # don't include nested fractions. E.g, fraction a plus b over c + 1 end fraction" is ambiguous + # by simplistic SimpleSpeak's rules "b over c" is a fraction, but if we say nested fractions + # are never simple, then any 'over' applies only to enclosing "fraction...end fraction" pair. + tag: fraction + match: + - "(IsNode(*[1],'leaf') and IsNode(*[2],'leaf')) and" + - "not(ancestor::*[name() != 'mrow'][1]/self::m:fraction)" # FIX: can't test for mrow -- what should be used??? + replace: + - x: "*[1]" + - T: "sobre" + - x: "*[2]" + - pause: short + +- name: default + tag: fraction + match: "." + replace: + - T: fração + - pause: short + - x: "*[1]" + - test: + if: "not(IsNode(*[1],'leaf'))" + then: [pause: short] + - T: "sobre" + - test: + if: "not(IsNode(*[2],'leaf'))" + then: [pause: short] + - x: "*[2]" + - pause: short + - T: "fim da fração" + - pause: medium + +# rules for functions raised to a power +# these could have been written on 'mrow' but putting them on msup seems more specific +# to see if it is a function, we look right to see if the following sibling is apply-function +- name: inverse-function + tag: inverse-function + match: "." + replace: + - T: "inversa de" # phrase(the 'inverse' of f) + - x: "*[1]" + +- name: function-squared-or-cubed + tag: power + match: + - "*[2][self::m:mn][.='2' or .='3'] and" + - "following-sibling::*[1][self::m:mo][.='⁥']" #invisible function apply + replace: + - x: "*[1]" + - bookmark: "*[2]/@id" + - test: + if: "*[2][.=2]" + then_test: + if: "$Verbosity='Verbose'" + then: [T: "elevado ao quadrado"] + else: [T: "ao quadrado"] + # CORREÇÃO: o espanhol dizia "cĂșbica" (adjetivo feminino solto), + # incoerente com "al cuadrado" logo acima. O inglĂȘs Ă© "cubed". + else: [T: "ao cubo"] +- name: function-power + tag: power + match: + - "following-sibling::*[1][self::m:mo][.='⁥']" #invisible function apply + replace: + - test: + if: "$Verbosity!='Terse'" + then: [T: a] + - bookmark: "*[2]/@id" + - T: "potĂȘncia" + - x: "*[2]" + - T: "de" + - pause: short + - x: "*[1]" + +# non-function rules for power +- name: squared-or-cubed + tag: power + match: "*[2][self::m:mn][.='2' or .='3']" + replace: + - x: "*[1]" + - bookmark: "*[2]/@id" + - test: + if: "*[2][.=2]" + then_test: + if: "$Verbosity='Verbose'" + then: [T: "elevado ao quadrado"] + else: [T: "ao quadrado"] + else: [T: "ao cubo"] + +- name: simple-integer + tag: power + match: "*[2][self::m:mn][not(contains(., '.'))]" + replace: + - x: "*[1]" + - T: "elevado a" + - x: "*[2]" +- name: simple-negative-integer + tag: power + match: + - "*[2][self::m:minus and count(*)=1 and" + - " *[1][self::m:mn][not(contains(., '.'))]]" + replace: + - x: "*[1]" + - T: "elevado a" + - x: "*[2]" +- name: simple-var + tag: power + match: "*[2][self::m:mi][string-length(.)=1]" + replace: + - x: "*[1]" + - T: "elevado a" + - x: "*[2]" + +- name: simple + tag: power + match: "IsNode(*[2], 'leaf')" + replace: + - x: "*[1]" + - T: "elevado a" + - x: "*[2]" + +- name: nested + # it won't end in "power" if the exponent is simple enough + # FIX: not that important, but this misses the case where the nested exp is a negative integer (change test if this is fixed) + # ending nested exponents with "...power power" sounds bad + tag: power + match: + - "*[2][" + - " (self::m:power and not(IsNode(*[2], 'leaf'))) or" # non-simple nested superscript + - " self::m:mrow[*[last()][self::m:power[not(IsNode(*[2], 'leaf'))]]]" # same as above but at the end of an mrow # FIX: need to figure out linear replacement + - " ]" + replace: + - x: "*[1]" + - T: "elevado a" + - x: "*[2]" + - pause: short + # CORREÇÃO: o espanhol escreveu "fin de la exponente" — "exponente" Ă© + # masculino, entĂŁo jĂĄ estava errado em espanhol ("fin del exponente"). + - T: "fim do expoente" +- name: default + tag: power + match: "." + replace: + - x: "*[1]" + # CORREÇÃO: a ordem herdada do inglĂȘs ("to the n plus 1 power") produzia + # "elevado Ă  n mais 1 potĂȘncia". Em portuguĂȘs o nĂșcleo vem antes do + # complemento: "elevado Ă  potĂȘncia n mais 1". + - T: "elevado Ă  potĂȘncia" + - x: "*[2]" + +# +# Some rules on mrows +# +- name: set + tag: set + match: "." + replace: + - test: + - if: "count(*)=0" + then: + - test: + if: "$Verbosity!='Terse'" + then: [T: o] + - T: "conjunto vazio" + - else_if: "count(*[1]/*)=3 and *[1]/*[2][self::m:mo][.=':' or .='|' or .='∣']" + then: + - test: + if: "$Verbosity!='Terse'" + then: [T: o] + - T: "conjunto de todos os" + - x: "*[1]/*[1]" + - T: "tal que" + - x: "*[1]/*[3]" + else: + - test: + if: "$Verbosity!='Terse'" + then: [T: o] + - T: "conjunto" + - x: "*[1]" + +- name: times + tag: mo + match: + # added: say times is the superscript is not simple + # if we aren't sure if it is times or not, don't say anything + - ".='⁹' and" + - "not(@data-function-guess) and (" + - "not(ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) and " + - " following-sibling::*[1][" + - " IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|') or " + - " self::m:matrix or self::m:determinant or self::m:binomial or" # followed by parens + - " ( (self::m:msub or self::m:msubsup or + ((self::m:msup or self::m:power) and not(IsNode(*[1], 'leaf') and *[2][self::m:mn and (.=2 or '.=3')]))) and " # followed by msup, etc. + - " (*[1][self::m:mrow[IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|')] or " + - " self::m:matrix or self::m:determinant] or" # base has parens + - " not(IsNode(*[2], 'simple')) or " + - " (self::m:msubsup and not(IsNode(*[3], 'simple'))))" + - " )" + - " ]" + # other possibility is the preceding element has parens (but not the following) + - " or " + - " preceding-sibling::*[1][" + - " IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|')]" # followed by parens + - " )" + replace: + - test: + if: "$Verbosity = 'Verbose'" + then: [T: "multiplicado por"] # (en: 'times') + else: [T: "vezes"] + +- name: no-say-parens + tag: mrow + match: + - "parent::*[not(self::m:msup) and not(self::m:msub) and not(self::m:msubsup) and not(self::m:power) and" + - " not(self::m:math) ] and " # rule out [x] standing alone + - "( IsBracketed(., '(', ')') or IsBracketed(., '[', ']') ) and " + - "( IsNode(*[2], 'simple') )" + # missing clause: 'a positive fraction that is spoken as an ordinal + # (either by the Ordinal preference or by the default rules_' + replace: + - x: "*[2]" + +- include: "SharedRules/geometry.yaml" +- include: "SharedRules/linear-algebra.yaml" +- include: "SharedRules/calculus.yaml" +- include: "SharedRules/general.yaml" +- include: "SharedRules/default.yaml" diff --git a/Rules/Languages/pt/definitions.yaml b/Rules/Languages/pt/definitions.yaml new file mode 100644 index 000000000..adf95240a --- /dev/null +++ b/Rules/Languages/pt/definitions.yaml @@ -0,0 +1,496 @@ +--- +- include: "../../definitions.yaml" +# Lines starting with "#" are a comment +# Each definition in this file is of the form +# - name: { "...", "..." "..." } +# For numbers, +# - name: [] "...", "..." "..." ] + + +# 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 only one ":" is used, it 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 +# Intent mappings must specify whether they are "prefix", "infix", "postfix", or "function" with an "=" sign +# If there are multiple fixities (e.g., see transpose), they are separated with "|| +# 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= ; Ă­ndice; fim do Ă­ndice", + "modified-variable": "silent= ", + "say-super": "infix=sobrescrito", # used with 'mo' for superscripts (e.g, "<") + "skip-super": "silent=", # used with 'mo' for superscripts (e.g, "*") + + "absolute-value": "function= ; valor absoluto: o valor absoluto de: o valor absoluto de; fim do valor absoluto", + "binomial": "infix=binomial; escolhe; fim do binomial", + "limit": "prefix=limite quando", + "lim-sup": "prefix=lim sup quando: o limite superior quando: o limite superior quando", + "lim-inf": "prefix=lim inf quando: o limite inferior quando: o limite inferior quando", + "logarithm-with-base": "prefix=log na base: o log na base: o logaritmo na base", + "minus": "infix=menos || prefix=menos", + "plus": "infix=mais || prefix=positivo", + + "transpose": "postfix=transposta || function=transposta", + "norm": "function=; norma: norma: a norma; fim da norma", + # ‖x‖ Ă© inferido pelo motor como 'magnitude' (nĂŁo 'norm'); sem esta linha + # vazava "magnitude de x" em inglĂȘs. Mesma fala da norma. + "magnitude": "function=; norma: norma: a norma; fim da norma", + "trace": "function=; traço: traço de: o traço de; fim do traço", + "dimension": "function=; dimensĂŁo: dimensĂŁo de: a dimensĂŁo de; fim da dimensĂŁo", + "homomorphism": "function= ; homomorfismo: homomorfismo de: o homomorfismo de; fim do homomorfismo", + "kernel": "function= ; nĂșcleo: nĂșcleo de: o nĂșcleo de; fim do nĂșcleo", + "vector": "function= ; vetor || prefix=vetor", + # O motor infere ⃗a × ⃗b como um SEM filhos (o operador vira + # o prĂłprio elemento); aĂ­ a fixidade infix nĂŁo se aplica e ele falava o nome + # literal, "cross product". A fixidade nofix cobre esse caso. Idem dot-product. + "cross-product": "infix=vetorial: produto vetorial: produto vetorial || nofix=vetorial: produto vetorial: produto vetorial", + "dot-product": "infix=escalar: produto escalar: produto escalar || nofix=escalar: produto escalar: produto escalar", + + "divergence": "function= ; div: divergente: divergente; fim do divergente", + "curl": "function= ; rotacional; fim do rotacional", + "gradient": "function= ; grad: gradiente: gradiente; fim do gradiente", + "laplacian": "function=laplaciano", + + "chemistry-concentration": "function= ; concentração: concentração de: a concentração de; fim da concentração", + # CORREÇÃO: o en tem duas fixidades (nofix || function); sĂł com a function + # a fala ganha o "de" ("probabilidade de x"). E o separador de palavras do + # conditional-probability Ă© "|", como no en — ";" nĂŁo Ă© reconhecido aqui. + "probability": "nofix=P: probabilidade || function=probabilidade", + "conditional-probability": "function=probabilidade | dado", + "intersection": "infix=interseção", + "union": "infix=uniĂŁo", + } + + +# ACRESCENTADO: definição presente em en/ e ausente em es/ (e portanto em pt). +# ATENÇÃO: estes NÃO sĂŁo textos falados — sĂŁo nomes de intent (chaves internas +# do motor, sempre em inglĂȘs). A regra os consulta com IsInDefinition(name(.), ...). +# Traduzi-los quebraria o casamento. Copiados tal e qual do inglĂȘs. +- TerseFunctionNames: { + "divergence", "del:gradient", "curl" + } + +- KnownWords: { + "abs", "adj", "ano", "cel", "dez", "din", "elo", "fim", "lux", "nos" + } + +- NavigationParts: { + "large-op": "base; limite inferior; limite superior", + "mfrac": "numerador;denominador", + "fraction": "numerador;denominador", + "msqrt": "radicando", + "square-root": "radicando", + "mroot": "radicando;Ă­ndice da raiz", + "root": "radicando;Ă­ndice da raiz", + "msub": "base;subscrito", + "sub": "base;subscrito", + "msup": "base;sobrescrito", + "say-super": "base;sobrescrito", + "skip-super": "base;sobrescrito", + "power": "base;expoente", + "msubsup": "base;subscrito;sobrescrito", + "munder": "base;limite inferior", + "mover": "base;limite superior", + "munderover": "base;limite inferior;limite superior", + + # 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": "em", + "out": "saindo de", + } + +- SIPrefixes: { + "Q": "quetta", "R": "ronna", "Y": "yotta", "Z": "zetta", "E": "exa", "P": "peta", "T": "tera", "G": "giga", "M": "mega", "k": "quilo", "h": "hecto", "da": "deca", + "d": "deci", "c": "centi", "m": "mili", "”": "micro", "n": "nano", "p": "pico", "f": "femto", "a": "atto", "z": "zepto", "y": "yocto", "r": "ronto", "q": "quecto" + } + +# this is a list of all units that accept SIPrefixes +# from www.bipm.org/documents/20126/41483022/SIBrochure-9-EN.pdf +# Prefixes may be used with any of the 29 SI units with special names +# The SI prefixes can be used with several of accepted units, but not, for example, with the non-SI units of time. + +- SIUnits: { + # base units + "A": "ampĂšre", + "cd": "candela", + "K": "kelvin", "â„Ș": "kelvin", + "g": "grama", + "m": "metro", + "mol": "mol", + "s": "segundo", "sec": "segundo", # "sec" not actually legal + + # derived units + "Bq": "becquerel", + "C": "coulomb", + "°C": "grau Celsius", "℃": "grau Celsius", # should only take negative powers + "F": "farad", + "Gy": "gray", + "H": "henry", + "Hz": "hertz", + "J": "joule", + "kat": "katal", + "lm": "lĂșmen", + "lx": "lux", + "N": "newton", + "Ω": "ohm", "℩": "ohm", # Greek Cap letter, U+2126 OHM SIGN + "Pa": "pascal", + "S": "siemens", + "Sv": "sievert", + "T": "tesla", + "V": "volt", + "W": "watt", + "Wb": "weber", + + # accepted (plus a few variants) that take SI prefixes + "l": "litro", "L": "litro", "ℓ": "litro", # Should only take negative powers + "t": "tonelada", # should only take positive powers + "Da": "dalton", + "Np": "neper", # should only take negative powers + "u": "unidade de massa atĂŽmica", + "eV": "elĂ©tron-volt", + "rad": "radiano", # should only take negative powers + "sr": "esferorradiano", # should only take negative powers + + # others that take a prefix + "a": "ano", # should only take positive powers + "as": "segundo de arco", # see en.wikipedia.org/wiki/Minute_and_second_of_arc + + # technically wrong, but used in practice with SI Units (and only positive powers) + "b": "bit", # should only take positive powers + "B": "byte", # should only take positive powers + "Bd": "baud", # should only take positive powers + } + + +- UnitsWithoutPrefixes: { + # time + "″": "segundo", "\"": "segundo", + "â€Č": "minuto", "'": "minuto","min": "minuto", + "h": "hora", "hr": "hora", "Hr": "hora", + "d": "dia", "dy": "dia", + "w": "semana", "wk": "semana", + "y": "ano", "yr": "ano", + + # angles + "°": "grau", "deg": "grau", # should only take negative powers + "arcmin": "minuto de arco", + "amin": "minuto de arco", + "am": "minuto de arco", + "MOA": "minuto de arco", + "arcsec": "segundo de arco", + "asec": "segundo de arco", + + # distance + "au": "unidade astronĂŽmica", "AU": "unidade astronĂŽmica", + "ltyr": "ano-luz", "ly": "ano-luz", + "pc": "parsec", + "Å": "angström", "Å": "angström", # U+00C5 and U+212B + "fm": "fermi", + + # others + "ha": "hectare", + # "B": "bel", # "B" more commonly means bytes + "dB": "decibel", # already logarithmic, so not used with SI prefixes + # radiano com prefixo dobra o r (nano+radiano = nanorradiano) + "mrad": "milirradiano", "”rad": "microrradiano", "nrad": "nanorradiano", "prad": "picorradiano", "krad": "quilorradiano", + + + # CORREÇÃO ORTOGRÁFICA pt: prefixo terminado em vogal seguido de + # palavra iniciada por "s" dobra o s ex: milissegundo, microssegundo, + # nanossegundo. É o mesmo caso jĂĄ tratado para "radiano" acima + # (milirradiano). A regra genĂ©rica de composição do MathCAT concatena + # sem dobrar e produziria "milisegundo". + # "as" fica de fora: o sĂ­mbolo jĂĄ significa "segundo de arco". + "Qs": "quettassegundo", "Rs": "ronnassegundo", "Ys": "yottassegundo", "Zs": "zettassegundo", "Es": "exassegundo", + "Ps": "petassegundo", "Ts": "terassegundo", "Gs": "gigassegundo", "Ms": "megassegundo", "ks": "quilossegundo", + "hs": "hectossegundo", "das": "decassegundo", "ds": "decissegundo", "cs": "centissegundo", "ms": "milissegundo", + "”s": "microssegundo", "ns": "nanossegundo", "ps": "picossegundo", "fs": "femtossegundo", "zs": "zeptossegundo", + "ys": "yoctossegundo", "rs": "rontossegundo", "qs": "quectossegundo", + + "Qsec": "quettassegundo", "Rsec": "ronnassegundo", "Ysec": "yottassegundo", "Zsec": "zettassegundo", + "Esec": "exassegundo", "Psec": "petassegundo", "Tsec": "terassegundo", "Gsec": "gigassegundo", + "Msec": "megassegundo", "ksec": "quilossegundo", "hsec": "hectossegundo", "dasec": "decassegundo", + "dsec": "decissegundo", "csec": "centissegundo", "msec": "milissegundo", "”sec": "microssegundo", + "ÎŒsec": "microssegundo", "nsec": "nanossegundo", "psec": "picossegundo", "fsec": "femtossegundo", + "zsec": "zeptossegundo", "ysec": "yoctossegundo", "rsec": "rontossegundo", "qsec": "quectossegundo", + + + "ÎŒs": "microssegundo", + + + "cas": "centissegundo de arco", "mas": "milissegundo de arco", + "”as": "microssegundo de arco", "ÎŒas": "microssegundo de arco", "nas": "nanossegundo de arco", + "pas": "picossegundo de arco", "fas": "femtossegundo de arco", "zas": "zeptossegundo de arco", + "yas": "yoctossegundo de arco", "ras": "rontossegundo de arco", "qas": "quectossegundo de arco", + + "QS": "quettassiemens", "RS": "ronnassiemens", "YS": "yottassiemens", "ZS": "zettassiemens", "ES": "exassiemens", + "PS": "petassiemens", "TS": "terassiemens", "GS": "gigassiemens", "MS": "megassiemens", "kS": "quilossiemens", + "hS": "hectossiemens", "daS": "decassiemens", "dS": "decissiemens", "cS": "centissiemens", "mS": "milissiemens", + "”S": "microssiemens", "nS": "nanossiemens", "pS": "picossiemens", "fS": "femtossiemens", "aS": "attossiemens", + "zS": "zeptossiemens", "yS": "yoctossiemens", "rS": "rontossiemens", "qS": "quectossiemens", + + "QSv": "quettassievert", "RSv": "ronnassievert", "YSv": "yottassievert", "ZSv": "zettassievert", "ESv": "exassievert", + "PSv": "petassievert", "TSv": "terassievert", "GSv": "gigassievert", "MSv": "megassievert", "kSv": "quilossievert", + "hSv": "hectossievert", "daSv": "decassievert", "dSv": "decissievert", "cSv": "centissievert", "mSv": "milissievert", + "”Sv": "microssievert", "nSv": "nanossievert", "pSv": "picossievert", "fSv": "femtossievert", "aSv": "attossievert", + "zSv": "zeptossievert", "ySv": "yoctossievert", "rSv": "rontossievert", "qSv": "quectossievert", + + "atm": "atmosfera", + "amu": "unidade de massa atĂŽmica", + "bar": "bar", + "cal": "caloria", + "Ci": "curie", + "grad": "grado", + "M": "molar", + "R": "roentgen", + "rpm": "rotação por minuto", + "℧": "mho", + "dyn": "dina", + "erg": "erg", + + # special case overrides because prefixes with the base "metro" all get accents + "Qm": "quetĂąmetro", "Rm": "ronĂąmetro", "Ym": "yotĂąmetro", "Zm": "zetĂąmetro", "Em": "exĂąmetro", "Pm": "petĂąmetro", + "Tm": "terĂąmetro", "Gm": "gigĂąmetro", "Mm": "megĂąmetro", "km": "quilĂŽmetro", "hm": "hectĂŽmetro", "dam": "decĂąmetro", + "dm": "decĂ­metro", "cm": "centĂ­metro", "mm": "milĂ­metro", "”m": "micrĂŽmetro", "nm": "nanĂŽmetro", "pm": "picĂŽmetro", + # conflicts: "fm": "femtĂŽmetro", "am": "attĂŽmetro", + "zm": "zeptĂŽmetro", "ym": "yoctĂŽmetro", "rm": "rontĂŽmetro", "qm": "quectĂŽmetro", + + # powers of 2 used with bits and bytes + "Kib": "kibibit", "Mib": "mebibit", "Gib": "gibibit", "Tib": "tebibit", "Pib": "pebibit", "Eib": "exbibit", "Zib": "zebibit", "Yib": "yobibit", + "KiB": "kibibyte", "MiB": "mebibyte", "GiB": "gibibyte", "TiB": "tebibyte", "PiB": "pebibyte", "EiB": "exbibyte", "ZiB": "zebibyte", "YiB": "yobibyte", + } + + + # this will only be used if the language is English, so it can be empty for other countries + # Mantida em inglĂȘs de propĂłsito: sĂŁo unidades imperiais, sem uso no Brasil. +- EnglishUnits: { + # length + "in": "inch", + "ft": "foot", + "mi": "mile", + "rd": "rod", + "li": "link", + "ch": "chain", + + # area + "sq in": "square inch", "sq. in": "square inch", "sq. in.": "square inch", + "sq ft": "square foot", "sq. ft": "square foot", "sq. ft.": "square foot", + "sq yd": "square yard", "sq. yd": "square yard", "sq. yd.": "square yard", + "sq mi": "square mile", "sq. mi": "square mile", "sq. mi.": "square mile", + "ac": "acre", + "FBM": "board foot", + + # volume + "cu in": "cubic inch", "cu. in": "cubic inch", "cu. in.": "cubic inch", + "cu ft": "cubic foot", "cu. ft": "cubic foot", "cu. ft.": "cubic foot", + "cu yd": "cubic yard", "cu. yd": "cubic yard", "cu. yd.": "cubic yard", + "bbl": "barrel", "BBL": "barrel", + "pk": "peck", + "bu": "bushel", + "tsp": "teaspoon", + "tbl": "tablespoon", + + # liquid + "fl dr": "fluid drams", + "fl oz": "fluid ounce", + "gi": "gill", + "cp": "cup", "cup": "cup", + "pt": "pint", + "qt": "quart", + "gal": "gallon", + + # weight + "gr": "grain", + "dr": "dram", + "oz": "ounce", "â„„": "ounce", + "lb": "pound", + "cwt": "hundredweight", + "dwt": "pennyweight", + "oz t": "troy ounce", + "lb t": "troy pound", + + # energy + "hp": "horsepower", + "BTU": "BTU", + "°F": "degree fahrenheit", "℉": "degree fahrenheit", + + # other + "mph": "mile per hour", + "mpg": "mile per gallon", + } + +# ACRESCENTADO sĂ­mbolos monetĂĄrios para a regra currency. +# O inglĂȘs nĂŁo tem R$; acrescentado por ser o caso principal no Brasil. +- CurrencySymbols: { + "R$": "real", + "$": "dĂłlar", "US$": "dĂłlar", "Âą": "centavo", "€": "euro", "ÂŁ": "libra", + "₡": "colĂłn", "â‚€": "lira", "₹": "rupia", "₩": "won", "â‚Ș": "shekel", + "₱": "peso", "â‚č": "rupia", "â‚ș": "lira", "₿": "bitcoin", + } + +- PluralForms: { + "lĂșmen": "lĂșmens", + "kelvin": "kelvins", + "grau Celsius": "graus Celsius", + # O plural genĂ©rico acrescenta "s" no FIM da string, o que produziria + # "yoctossegundo de arcos". O "s" tem de ir no substantivo, nĂŁo na frase. + # (a forma sem prefixo jĂĄ estĂĄ mais abaixo, junto de "minuto de arco".) + "centissegundo de arco": "centissegundos de arco", + "milissegundo de arco": "milissegundos de arco", + "microssegundo de arco": "microssegundos de arco", + "nanossegundo de arco": "nanossegundos de arco", + "picossegundo de arco": "picossegundos de arco", + "femtossegundo de arco": "femtossegundos de arco", + "zeptossegundo de arco": "zeptossegundos de arco", + "yoctossegundo de arco": "yoctossegundos de arco", + "rontossegundo de arco": "rontossegundos de arco", + "quectossegundo de arco": "quectossegundos de arco", + "grau Fahrenheit": "graus Fahrenheit", + "hertz": "hertz", + "siemens": "siemens", + "lux": "lux", + "mol": "mols", + # a regra genĂ©rica acrescenta "es" a palavras terminadas em l/r, o que + # gera "decibeles"/"molares". Em portuguĂȘs o plural de -el Ă© -Ă©is. + "decibel": "decibĂ©is", + "bel": "bĂ©is", + + # Unidades invariĂĄveis no plural continuam invariĂĄveis quando prefixadas. + # A regra genĂ©rica nĂŁo consulta o nome composto e produziria + # "milissiemenses", "decahertzes", "attoluxes". + "quettassiemens": "quettassiemens", "ronnassiemens": "ronnassiemens", "yottassiemens": "yottassiemens", "zettassiemens": "zettassiemens", + "exassiemens": "exassiemens", "petassiemens": "petassiemens", "terassiemens": "terassiemens", "gigassiemens": "gigassiemens", + "megassiemens": "megassiemens", "quilossiemens": "quilossiemens", "hectossiemens": "hectossiemens", "decassiemens": "decassiemens", + "decissiemens": "decissiemens", "centissiemens": "centissiemens", "milissiemens": "milissiemens", "microssiemens": "microssiemens", + "nanossiemens": "nanossiemens", "picossiemens": "picossiemens", "femtossiemens": "femtossiemens", "attossiemens": "attossiemens", + "zeptossiemens": "zeptossiemens", "yoctossiemens": "yoctossiemens", "rontossiemens": "rontossiemens", "quectossiemens": "quectossiemens", + "quettahertz": "quettahertz", "ronnahertz": "ronnahertz", "yottahertz": "yottahertz", "zettahertz": "zettahertz", + "exahertz": "exahertz", "petahertz": "petahertz", "terahertz": "terahertz", "gigahertz": "gigahertz", + "megahertz": "megahertz", "quilohertz": "quilohertz", "hectohertz": "hectohertz", "decahertz": "decahertz", + "decihertz": "decihertz", "centihertz": "centihertz", "milihertz": "milihertz", "microhertz": "microhertz", + "nanohertz": "nanohertz", "picohertz": "picohertz", "femtohertz": "femtohertz", "attohertz": "attohertz", + "zeptohertz": "zeptohertz", "yoctohertz": "yoctohertz", "rontohertz": "rontohertz", "quectohertz": "quectohertz", + "quettalux": "quettalux", "ronnalux": "ronnalux", "yottalux": "yottalux", "zettalux": "zettalux", + "exalux": "exalux", "petalux": "petalux", "teralux": "teralux", "gigalux": "gigalux", + "megalux": "megalux", "quilolux": "quilolux", "hectolux": "hectolux", "decalux": "decalux", + "decilux": "decilux", "centilux": "centilux", "mililux": "mililux", "microlux": "microlux", + "nanolux": "nanolux", "picolux": "picolux", "femtolux": "femtolux", "attolux": "attolux", + "zeptolux": "zeptolux", "yoctolux": "yoctolux", "rontolux": "rontolux", "quectolux": "quectolux", + + "mho": "mhos", + "real": "reais", "dĂłlar": "dĂłlares", "colĂłn": "colones", + "pascal": "pascals", + "weber": "webers", + "becquerel": "becquerels", + "katal": "katals", + "rotação por minuto": "rotaçÔes por minuto", + "unidade de massa atĂŽmica": "unidades de massa atĂŽmica", + "unidade astronĂŽmica": "unidades astronĂŽmicas", + "ano-luz": "anos-luz", + "minuto de arco": "minutos de arco", + "segundo de arco": "segundos de arco", + } + +# ---------------- Cardinal and Ordinal Numbers -------------------------- +# The following definitions are used to convert numbers to words +# The are mainly used for ordinals, of which there are two cases: +# 1. Regular ordinals: first, second, third, ... +# 2. Ordinals used in the denominator of fractions (e.g, one half, one third) +# When used in the denominator of fractions, a plural version might be +# used (e.g., two halves, two thirds) +# Although a lot of languages are regular after a few entries, for generality, +# the following lists should be filled out even though they are the same +# or easily derived from others in many languages (e.g, an 's' is added for plurals). +# The larger ordinal numbers (e.g, millionth) is used when there are only +# '0's after that decimal place (e.g., 23000000). +# +# NOTA DE TRADUÇÃO -> regra do portuguĂȘs para denominador de fração: +# atĂ© 1/10 usa-se o ordinal ("um terço", "um dĂ©cimo"); +# de 1/11 em diante usa-se "avos" ("um onze avos", "trĂȘs vinte avos"). +# Isso difere do inglĂȘs e do espanhol, e estĂĄ refletido nas listas plurais. + +# All definitions start 0, 10, 100, etc. + +# The definitions for the "ones" should extend until a regular pattern begins +# The minimum length is 10. + +- NumbersOnes: [ + "zero", "um", "dois", "trĂȘs", "quatro", "cinco", "seis", "sete", "oito", "nove", + "dez", "onze", "doze", "treze", "catorze", "quinze", "dezesseis", + "dezessete", "dezoito", "dezenove" + ] + +- NumbersOrdinalOnes: [ + "zero", "primeiro", "segundo", "terceiro", "quarto", "quinto", "sexto", "sĂ©timo", "oitavo", "nono", + "dĂ©cimo", "dĂ©cimo primeiro", "dĂ©cimo segundo", "dĂ©cimo terceiro", "dĂ©cimo quarto", "dĂ©cimo quinto", "dĂ©cimo sexto", + "dĂ©cimo sĂ©timo", "dĂ©cimo oitavo", "dĂ©cimo nono" + ] + +- NumbersOrdinalPluralOnes: [ + "zeros", "primeiros", "meios", "terços", "quartos", "quintos", "sextos", "sĂ©timos", "oitavos", "nonos", + "dĂ©cimos", "onze avos", "doze avos", "treze avos", "catorze avos", "quinze avos", "dezesseis avos", + "dezessete avos", "dezoito avos", "dezenove avos" + ] + + # stop when regularity begins +# A lista parava em "meio": de 1/3 em diante o motor caĂ­a nos ordinais +# comuns e falava "1 terceiro". AtĂ© 1/10 a forma Ă© a do denominador de +# fração ("um terço", "um dĂ©cimo"); de 1/11 em diante entra "avos", que jĂĄ +# estĂĄ nas listas plurais acima. Ver ACHADOS 9. +- NumbersOrdinalFractionalOnes: [ + "zero", "primeiro", "meio", "terço", "quarto", "quinto", "sexto", "sĂ©timo", "oitavo", "nono", + "dĂ©cimo" + ] + + # stop when regularity begins +- NumbersOrdinalFractionalPluralOnes: [ + "zeros", "primeiros", "meios", "terços", "quartos", "quintos", "sextos", "sĂ©timos", "oitavos", "nonos", + "dĂ©cimos" + ] + + + # What to use for multiples of 10 +- NumbersTens: [ + "", "dez", "vinte", "trinta", "quarenta", "cinquenta", "sessenta", "setenta", "oitenta", "noventa" + ] + +- NumbersOrdinalTens: [ + "", "dĂ©cimo", "vigĂ©simo", "trigĂ©simo", "quadragĂ©simo", "quinquagĂ©simo", "sexagĂ©simo", "septuagĂ©simo", "octogĂ©simo", "nonagĂ©simo" + ] + +- NumbersOrdinalPluralTens: [ + "", "dĂ©cimos", "vinte avos", "trinta avos", "quarenta avos", "cinquenta avos", "sessenta avos", "setenta avos", "oitenta avos", "noventa avos" + ] + + +- NumbersHundreds: [ + "", "cem", "duzentos", "trezentos", "quatrocentos", "quinhentos", + "seiscentos", "setecentos", "oitocentos", "novecentos" + ] + +- NumbersOrdinalHundreds: [ + "", "centĂ©simo", "ducentĂ©simo", "tricentĂ©simo", "quadringentĂ©simo", "quingentĂ©simo", + "sexcentĂ©simo", "septingentĂ©simo", "octingentĂ©simo", "noningentĂ©simo" + ] + +- NumbersOrdinalPluralHundreds: [ + "", "centĂ©simos", "ducentĂ©simos", "tricentĂ©simos", "quadringentĂ©simos", "quingentĂ©simos", + "sexcentĂ©simos", "septingentĂ©simos", "octingentĂ©simos", "noningentĂ©simos" + ] + + + # At this point, hopefully the language is regular. If not, code needs to be written +- NumbersLarge: [ + "", "mil", "milhĂŁo", "bilhĂŁo", "trilhĂŁo", "quatrilhĂŁo", + "quintilhĂŁo", "sextilhĂŁo", "septilhĂŁo", "octilhĂŁo", "nonilhĂŁo" + ] + +- NumbersOrdinalLarge: [ + "", "milĂ©simo", "milionĂ©simo", "bilionĂ©simo", "trilionĂ©simo", "quatrilionĂ©simo", + "quintilionĂ©simo", "sextilionĂ©simo", "septilionĂ©simo", "octilionĂ©simo", "nonilionĂ©simo" + ] + +- NumbersOrdinalPluralLarge: [ + "", "milĂ©simos", "milionĂ©simos", "bilionĂ©simos", "trilionĂ©simos", "quatrilionĂ©simos", + "quintilionĂ©simos", "sextilionĂ©simos", "septilionĂ©simos", "octilionĂ©simos", "nonilionĂ©simos" + ] diff --git a/Rules/Languages/pt/navigate.yaml b/Rules/Languages/pt/navigate.yaml new file mode 100644 index 000000000..bc7c5fe26 --- /dev/null +++ b/Rules/Languages/pt/navigate.yaml @@ -0,0 +1,1773 @@ +--- +# Documentation: +# +# 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 +# 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: +# * Verbose -- always echo the command and end points (e.g., "can't move right") +# * Medium -- only echo the command for obscure commands like the placemarker commands; also say end points +# * Terse -- no echo of commands or end points +# +# For the second item, a common set of rules is used. These rules require the variable "Move2D" +# to be set along with "Child2D", where "Move2D" is either 'in' or 'out'. +# +# In addition, the navigation rules make use of two functions: +# +# int DistanceFromLeaf(node, leftSide, treat2DElementsAsTokens) +# Returns the distance (number of children) until a leaf is reached by traversing the leftmost/rightmost child +# If 'treat2DElementsAsTokens' is true, then 2D notations such as fractions are treated like leaves +# A leaf has distance == 0 +# +# EdgeNode(node, "left"/"right", stopNodeName) +# Returns the stopNode if at left/right edge of named ancestor node. 'stopNodeName' can also be "2D" +# If the stopNode isn't found, the original node is returned +# Note: if stopNodeName=="math", then punctuation is taken into account since it isn't really part of the math +# +# A few other variables are of importance to Navigation +# NavMode -- Enhanced, Simple, Character +# ReadZoomLevel -- -1 for Enhanced, otherwise the distance from leaf the rules should maintain +# PlaceMarkerIndex + + +# Rules for speaking what happens when moving into or out of a notation +- name: into-or-out-of + tag: mfrac + match: "$Move2D != ''" + replace: + - x: "$Move2D" + - test: + if: "count($Child2D/preceding-sibling::*)=0" + then: [T: "numerador"] + else: [T: "denominador"] + - pause: "medium" + +- name: into-or-out-of + tag: msqrt + match: "$Move2D != ''" + replace: + - x: "$Move2D" + - T: "raiz quadrada" + - pause: "medium" + +- name: into-or-out-of + tag: mroot + match: "$Move2D != ''" + replace: + - x: "$Move2D" + - test: + if: "count($Child2D/preceding-sibling::*)=0" + then: [T: "radicando"] + else: [T: "Ă­ndice da raiz"] + - pause: "medium" + +- name: into-or-out-of + tag: msub + match: "$Move2D != ''" + replace: + - x: "$Move2D" + - test: + if: "count($Child2D/preceding-sibling::*)=0" + then: [T: "base"] + else: [T: "subscrito"] + - pause: "medium" + +- name: into-or-out-of + tag: msup + match: "$Move2D != ''" + replace: + - x: "$Move2D" + - test: + if: "count($Child2D/preceding-sibling::*)=0" + then: [T: "base"] + else: [T: "sobrescrito"] # 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: "base"] + - else_if: "count($Child2D/preceding-sibling::*)=1" + then: [T: "subscrito"] + else: [T: "sobrescrito"] # 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: "base"] + else: [T: "limite inferior"] + - pause: "medium" + +- name: into-or-out-of + tag: mover + match: "$Move2D != ''" + replace: + - x: "$Move2D" + - test: + if: "count($Child2D/preceding-sibling::*)=0" + then: [T: "base"] + else: [T: "limite superior"] + - pause: "medium" + +- name: into-or-out-of + tag: munderover + match: "$Move2D != ''" + replace: + - x: "$Move2D" + - test: + - if: "count($Child2D/preceding-sibling::*)=0" + then: [T: "base"] + - else_if: "count($Child2D/preceding-sibling::*)=1" + then: [T: "limite inferior"] + else: [T: "limite superior"] + - pause: "medium" + +- name: into-or-out-of + tag: mmultiscripts + match: "$Move2D != ''" + replace: + - test: + if: "name($Child2D)!='none'" + then: + - with: + variables: + - NumPrecedingSiblings: "count($Child2D/preceding-sibling::*)" + replace: + - x: "$Move2D" + - test: + - if: "$NumPrecedingSiblings=0" + then: [T: "base"] + - 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: "subscrito"] + else: [T: "sobrescrito"] + else: + - test: + if: "$NumPrecedingSiblings mod 2 = 0" + then: [T: "sobrescrito"] + else: [T: "subscrito"] + - pause: "medium" + +- name: into-or-out-of + tag: mtd + match: "$Move2D = 'em'" + replace: + - x: "$Move2D" + - T: "coluna" + - x: "count($Child2D/preceding-sibling::*)+1" + - pause: "medium" + +- name: into-or-out-of + tag: [mtr, mlabeledtr] + match: "$Move2D = 'em'" + replace: + - x: "$Move2D" + - x: "count($Child2D/preceding-sibling::*)+1" + - pause: "medium" + +- name: default-move + # nothing to do (not 2D) -- need to catch $Move2D though so rules based on NavCommand don't trigger + tag: "*" + match: "$Move2D != ''" + replace: [] + +# ********* Go back to last position *************** +# This is first since start/end position shouldn't matter +- name: move-last-location + + + tag: "*" + match: "$NavCommand = 'MoveLastLocation'" + replace: + - test: + if: "$NavVerbosity != 'Terse'" + then: + - test: + - if: "$PreviousNavCommand = 'ZoomIn'" + then: [T: "desfazer afastamento"] + - else_if: "$PreviousNavCommand = 'ZoomOut'" + then: [T: "desfazer aproximação"] + - else_if: "$PreviousNavCommand = 'ZoomInAll'" + then: [T: "desfazer afastamento mĂĄximo"] + - else_if: "$PreviousNavCommand = 'ZoomOutAll'" + then: [T: "desfazer aproximação mĂĄxima"] + - else_if: "$PreviousNavCommand = 'MovePrevious' or $PreviousNavCommand = 'MovePreviousZoom'" + then: [T: "desfazer movimento para a esquerda"] + - else_if: "$PreviousNavCommand = 'MoveNext' or $PreviousNavCommand = 'MoveNextZoom'" + then: [T: "desfazer movimento para a direita"] + - else_if: "$PreviousNavCommand = 'None'" + then: [T: "nenhum comando anterior"] + - pause: "long" + - set_variables: [NavNode: "@id"] + +# many times, for typographic reasons, people include punctuation at the end of a math expr +# these rules detect that and skip speaking it (should be similar regular rule) +- name: skip-punct-at-end-zoom-in + tag: mrow + match: + - "($NavCommand = 'ZoomIn' or $NavCommand = 'ZoomInAll' or $NavCommand = 'MoveNextZoom' or $NavCommand = 'MovePreviousZoom') and" + - " parent::m:math and count(*)=2 and" + - " *[2][translate(.,'.,;:?', '')='']" + replace: + - x: "*[1]" + +# ********* ZoomIn *************** +- name: zoom-in-leaf + + tag: "*" + match: "($NavCommand = 'ZoomIn' or $NavCommand = 'ZoomInAll') and IsNode(., 'leaf')" + replace: + - test: + if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" + then: [T: "aproximado ao mĂĄximo", pause: "long"] + - 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 element +- 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: "aproximado", pause: "long"] + - set_variables: [NavNode: "*[2]/*[1]/@id"] + +# special case of zooming into a table -- move to the first element +- name: zoom-in-table + tag: mtable + match: "$NavCommand = 'ZoomIn'" + replace: + - test: + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" + then: [T: "aproximado", pause: "long"] + - 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 + tag: math + match: "count(*)=1 and ($NavCommand = 'ZoomIn' or $NavCommand = 'MoveNextZoom' or $NavCommand = 'MovePreviousZoom')" + replace: + - test: + if: "$NavCommand = 'MovePreviousZoom'" + then: [x: "*[last()]"] + else: [x: "*[1]"] + +- # For msqrt and menclose, if the single child isn't an mrow, don't zoom in + name: zoom-in-again + # If there is only one child, this isn't an interesting move -- zoom in again + tag: "*" + 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))" + replace: + - test: + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" + then: [T: "aproximado", pause: "long"] + - with: + variables: [MatchCounter: "$MatchCounter + 1"] + replace: + - 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: "aproximado", pause: "long"] + - test: + - if: "self::m:mtr or self::m:mlabeledtr" + then: + - with: + variables: [Move2D: "'em'", Child2D: "*[1]/*[1]"] + replace: [x: "."] + - set_variables: [NavNode: "*[1]/*[1]/@id"] # skip mtd + - else_if: "*[1][self::m:mrow and IsBracketed(., '(', ')', false) or IsBracketed(., '[', ']', false)]" # auto zoom + then: + - with: + variables: [Move2D: "'em'", Child2D: "*[1]"] + replace: [x: "."] + - set_variables: [NavNode: "*[1]/*[2]/@id"] # skip parens/brackets + else: + - with: + variables: [Move2D: "'em'", Child2D: "*[1]"] + replace: [x: "."] + - set_variables: [NavNode: "*[1]/@id"] + +- name: zoom-in-2D-not-enhanced + tag: "*" + match: "$NavCommand = 'ZoomIn' and $NavMode!='Enhanced' and IsNode(., '2D')" + replace: + - test: + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" + then: [T: "aproximado", pause: "long"] + - with: + variables: [Move2D: "'em'", Child2D: "*[1]"] + replace: [x: "."] + - with: + variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MoveNextZoom'"] + replace: [x: "*[1]"] + +- name: zoom-in-default + tag: "*" + match: "$NavCommand = 'ZoomIn'" + replace: + - test: + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" + then: [T: "aproximado", pause: "long"] + - with: + variables: [Move2D: "'em'", Child2D: "*[1]"] + replace: [x: "."] + - test: + if: "$NavMode='Character'" + then: + - with: + variables: [MatchCounter: "$MatchCounter + 1"] + 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"] + +- name: zoom-in-all-default + tag: "*" + match: "$NavCommand = 'ZoomInAll'" + replace: + - test: + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" + then: [T: "aproximado ao mĂĄximo", pause: "medium"] + - with: + variables: [Move2D: "'em'", Child2D: "*[1]"] + replace: [x: "."] + - with: + variables: [MatchCounter: "$MatchCounter + 1"] + replace: [x: "*[1]"] + +- name: zoom-out + tag: math + match: "$NavCommand = 'ZoomOut' or $NavCommand = 'ZoomOutAll'" + replace: + - test: + if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" + then: [T: "afastado ao mĂĄximo", pause: "long"] + - 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: + - "($NavCommand = 'ZoomOut' or $NavCommand = 'ZoomOutAll') and" + - " parent::m:math and count(*)=2 and" + - " *[2][translate(.,'.,;:?', '')='']" + replace: + - x: ".." + +- name: zoom-out-all-default + tag: "*" + match: "$NavCommand = 'ZoomOutAll'" + replace: + - test: + if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" + then: [T: "afastado ao mĂĄximo", pause: "medium"] + - with: + variables: [Move2D: "'fora de'", Child2D: "."] + replace: [x: ".."] + - with: + variables: [MatchCounter: "$MatchCounter + 1"] + replace: [x: ".."] + +# deal with internal zooming: MoveNextZoom and MovePreviousZoom + +# start with Enhanced mode +- name: move-zoom-enhanced + tag: "*" + match: + - "($NavCommand = 'MoveNextZoom' or $NavCommand = 'MovePreviousZoom') and " + - "$NavMode = 'Enhanced'" + replace: + # don't bother with MatchCounter since we only get here if > 1 + - with: + variables: [Move2D: "'em'", Child2D: "*[1]"] + replace: [x: "."] + - test: + - if: "count(*)> 1 or IsNode(., 'leaf') or self::m:msqrt or self::m:menclose" + then: [set_variables: [NavNode: "@id"]] + else: [x: "*[1]"] + +- name: move-next-zoom-not-enhanced + # $ReadZoomLevel must be >= 0 + tag: "*" + match: "$NavCommand = 'MoveNextZoom'" + replace: + #don't bother with MatchCounter since we only get here if > 1 + - test: + if: "$ReadZoomLevel >= DistanceFromLeaf(., false, $NavMode!='Character')" + then: + # - with: + # variables: [Move2D: "'em'", Child2D: "following-sibling::*[1]"] + # replace: [x: ".."] + - set_variables: [NavNode: "@id"] + else: + - with: + variables: [Move2D: "'em'", Child2D: "*[1]"] + replace: [x: "."] + - x: "*[1]" + +- name: move-previous-zoom-not-enhanced + # $ReadZoomLevel must be >= 0 + tag: "*" + match: "$NavCommand = 'MovePreviousZoom'" + replace: + #don't bother with MatchCounter since we only get here if > 1 + - test: + if: "$ReadZoomLevel >= DistanceFromLeaf(., true, $NavMode!='Character')" + then: + # - with: + # variables: [Move2D: "'em'", Child2D: "preceding-sibling::*[1]"] + # replace: [x: ".."] + - set_variables: [NavNode: "@id"] + else: + - with: + variables: [Move2D: "'em'", Child2D: "*[last()]"] + replace: [x: "."] + - x: "*[last()]" + +# ********* ZoomOut *************** +- name: zoom-out-default + + + tag: mtd + match: "$Move2D = '' and ($NavCommand = 'ZoomOut')" + replace: + - test: + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" + then: [T: "afastar", pause: "medium"] + # we need to speak it here + - T: "linha" + # 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 + # a row around a single element -- these might duplicate the position/offset, so we jump an extra level here + tag: "*" + match: "$NavCommand = 'ZoomOut'" + replace: + - with: + variables: [MatchCounter: "$MatchCounter + 1"] + replace: + - test: + if: "$MatchCounter = 1 and $NavVerbosity = 'Verbose'" + then: [T: "afastar", pause: "medium"] + - 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: "'fora de'", 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"] + +# ********* MoveStart/End *************** +- name: math-move-to-start-or-end + tag: math + match: "$NavCommand = 'MoveStart' or $NavCommand = 'MoveLineStart' or $NavCommand = 'MoveEnd' or $NavCommand = 'MoveLineEnd'" + replace: + - with: + variables: [MatchCounter: "$MatchCounter + 1"] + replace: + - test: + if: "$NavVerbosity = 'Verbose'" + then: + - test: + - if: "$NavCommand = 'MoveStart'" + then: [T: "inĂ­cio da expressĂŁo"] + - else_if: "$NavCommand = 'MoveLineStart'" + then: [T: "mover para o inĂ­cio da linha"] + - else_if: "$NavCommand = 'MoveEnd'" + then: [T: "fim da expressĂŁo"] + else: [T: "mover para o fim da linha"] # "$NavCommand = 'MoveLineEnd'" + - 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) + - with: + variables: [NavCommand: "'MoveNextZoom'"] + replace: [x: "*[1]/*[1]"] + else: + - with: + variables: [NavCommand: "'MovePreviousZoom'"] + replace: [x: "*[last()]/*[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) )" + replace: + - test: + if: "$NavVerbosity = 'Verbose'" + then: + - test: + if: "$NavCommand = 'MoveLineStart'" + then: [T: "mover para o inĂ­cio da linha"] + else: [T: "mover para o fim da linha"] # "$NavCommand = 'MoveLineEnd'" + - pause: "medium" + - test: + if: "self::m:mrow" + then_test: + if: "$NavCommand = 'MoveLineStart'" + then: + - with: + variables: [NavCommand: "'MoveNextZoom'"] + replace: [x: "*[1]"] + else: + - with: + variables: [NavCommand: "'MovePreviousZoom'"] + replace: [x: "*[last()]"] + else: [set_variables: [NavNode: "@id"]] + +- name: move-to-start-or-end-default + tag: "*" + match: "$NavCommand = 'MoveStart' or $NavCommand = 'MoveLineStart' or $NavCommand = 'MoveEnd' or $NavCommand = 'MoveLineEnd'" + replace: + - with: + variables: [MatchCounter: "$MatchCounter + 1"] + replace: [x: ".."] + +# Table-related movement +# Typically, we need to zoom out to the mtd level, then we move the appropriate direction +- name: not-in-table + + + tag: math + match: + - "$NavCommand='MoveCellPrevious' or $NavCommand='MoveCellNext' or" + - "$NavCommand='MoveCellUp' or $NavCommand='MoveCellDown' or" + - "$NavCommand='MoveColumnStart' or $NavCommand='MoveColumnEnd' or" + - "$NavCommand='ReadCellCurrent'" + replace: + - T: "fora da tabela" + - pause: long + - set_variables: [SpeakExpression: false()] + +- name: move-cell-previous + tag: mtd + match: "$NavCommand='MoveCellPrevious'" + replace: + - test: + if: "preceding-sibling::*" + then: + - test: + if: "$NavVerbosity = 'Verbose'" + then: + - T: "mover para a esquerda" + - pause: short + - test: + if: "$NavVerbosity != 'Terse'" + then: + - T: "coluna" + - x: "count(preceding-sibling::*)" + - pause: medium + - test: + if: "$NavMode='Character'" + then: + - with: + variables: [NavCommand: "'MovePreviousZoom'"] + replace: [x: "preceding-sibling::*[1]"] + else: + - set_variables: [NavNode: "preceding-sibling::*[1]/*[1]/@id"] + else: + - T: "nĂŁo hĂĄ coluna anterior" + - set_variables: [SpeakExpression: false()] + +- name: move-cell-next + tag: mtd + match: "$NavCommand='MoveCellNext'" + replace: + - test: + if: "following-sibling::*" + then: + - test: + if: "$NavVerbosity = 'Verbose'" + then: + - T: "mover para a direita" + - pause: short + - test: + if: "$NavVerbosity != 'Terse'" + then: + - T: "coluna" + - x: "count(preceding-sibling::*)+2" + - pause: medium + - test: + if: "$NavMode='Character'" + then: + - with: + variables: [NavCommand: "'MoveNextZoom'"] + replace: [x: "following-sibling::*[1]"] + else: + - set_variables: [NavNode: "following-sibling::*[1]/*[1]/@id"] + else: + - T: "nĂŁo hĂĄ prĂłxima coluna" + - set_variables: [SpeakExpression: false()] + +- name: move-cell-up + tag: mtd + match: "$NavCommand='MoveCellUp'" + replace: + - test: + if: "../preceding-sibling::*" + then: + - with: + variables: [Column: "count(preceding-sibling::*)+1"] # store this because otherwise the value is used in the wrong context below + replace: + - test: + if: "$NavVerbosity = 'Verbose'" + then: + - T: "mover para cima" + - pause: short + - test: + if: "$NavVerbosity != 'Terse'" + then: + - T: "linha" + - x: "count(../preceding-sibling::*)" + - pause: short + - T: "coluna" + - x: "count(preceding-sibling::*)+1" + - pause: medium + - test: + if: "$NavMode='Character'" + then: + - with: + variables: [NavCommand: "'MoveNextZoom'"] + replace: [x: "../preceding-sibling::*[1]/*[$Column]"] + else: + - set_variables: [NavNode: "../preceding-sibling::*[1]/*[$Column]/*[1]/@id"] + else: + - T: "nĂŁo hĂĄ linha anterior" + - set_variables: [SpeakExpression: false()] + +- name: move-cell-down + tag: mtd + match: "$NavCommand='MoveCellDown'" + replace: + - test: + if: "../following-sibling::*" + then: + - with: + variables: [Column: "count(preceding-sibling::*)+1"] # store this because otherwise the value is used in the wrong context below + replace: + - test: + if: "$NavVerbosity = 'Verbose'" + then: + - T: "descer" + - pause: short + - test: + if: "$NavVerbosity != 'Terse'" + then: + - T: "linha" + - x: "count(../preceding-sibling::*)+2" + - pause: short + - T: "coluna" + - x: "count(preceding-sibling::*)+1" + - pause: medium + - test: + if: "$NavMode='Character'" + then: + - with: + variables: [NavCommand: "'MoveNextZoom'"] + replace: [x: "../following-sibling::*[1]/*[$Column]"] + else: + - set_variables: [NavNode: "../following-sibling::*[1]/*[$Column]/*[1]/@id"] + else: + - T: "nĂŁo hĂĄ prĂłxima linha" + - set_variables: [SpeakExpression: false()] + +- name: move-cell-up + tag: [mtr, mlabeledtr] + match: "$NavCommand='MoveCellUp'" + replace: + - test: + if: "preceding-sibling::*" + then: + - test: + if: "$NavVerbosity = 'Verbose'" + then: + - T: "subir" + - pause: medium + - T: "linha" + - x: "count(preceding-sibling::*)" + - pause: medium + - test: + if: "$NavMode='Character'" + then: + - with: + variables: [NavCommand: "'MoveNextZoom'"] + replace: [x: "preceding-sibling::*[1]"] + else: + - set_variables: [NavNode: "preceding-sibling::*[1]/@id"] + else: + - T: "nĂŁo hĂĄ linha anterior" + - set_variables: [SpeakExpression: false()] + +- name: move-cell-down + tag: [mtr, mlabeledtr] + match: "$NavCommand='MoveCellDown'" + replace: + - test: + if: "following-sibling::*" + then: + - test: + if: "$NavVerbosity = 'Verbose'" + then: + - T: "descer" + - pause: medium + - T: "linha" + - x: "count(preceding-sibling::*)+2" + - pause: medium + - test: + if: "$NavMode='Character'" + then: + - with: + variables: [NavCommand: "'MoveNextZoom'"] + replace: [x: "following-sibling::*[1]"] + else: + - set_variables: [NavNode: "following-sibling::*[1]/@id"] + else: + - T: "nĂŁo hĂĄ prĂłxima linha" + - set_variables: [SpeakExpression: false()] + +- name: default-read-cell + tag: "*" + match: "$NavCommand='ReadCellCurrent'" + replace: + - with: + variables: [MTD: "ancestor::m:mtd"] + replace: + - test: + if: "$MTD" + then: + - test: + if: "$NavVerbosity = 'Verbose'" + then: + - T: "ler a entrada atual" + - pause: medium + - test: + if: "$NavVerbosity != 'Terse'" + then: + - T: "linha" + - x: "count($MTD[1]/../preceding-sibling::*)+1" + - T: "coluna" + - x: "count($MTD[1]/preceding-sibling::*)+1" + - pause: short + - set_variables: [NavNode: "$MTD[1]/*[1]/@id"] + else: + - T: "fora da tabela" + - pause: long + - set_variables: [SpeakExpression: false()] + +# mtd ? ( $NavCommand='MoveColumnStart' ) +# => MoveColStart { +# ruleRef = name(^^match); +# column = index(match); +# ::StartPosition = ^^match[0][index(match)][0].dfs; +# ::EndPosition = ^^match[0][index(match)][0].offset; +# }; + +# mtd ? ( $NavCommand='MoveColumnEnd' ) +# => MoveColEnd { +# ruleRef = name(^^match); +# column = index(match); +# ::StartPosition = ^^match[count(^^match)-1][index(match)][0].dfs; +# ::EndPosition = ^^match[count(^^match)-1][index(match)][0].offset; +# }; + + + +# # Rules for columnar math (mstack and mlongdiv) -- each row is an msrow or mscarries except for the start of mlongdiv +# # FIX: not dealing with different number of digits on different lines +# # FIX: not dealing with + (etc) on same line if they are on the right side (Dutch, others) +# # FIX: not dealing with intervening msline (say it and move on??) +# # FIX: not dealing with carries well +# # FIX: not dealing with navigation of first three children of mlongdiv +# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# ($NavCommand="MovePrevious" || $NavCommand='MoveCellPrevious') && has_previous(match) ) +# => MoveCell { +# ruleRef = name(^^match); +# wordRef = "previous"; +# ::StartPosition = previous(match).dfs; +# ::EndPosition = previous(match).offset; +# }; + +# # no previous child -- in first column -- don't move +# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# ($NavCommand="MovePrevious" || $NavCommand='MoveCellPrevious' ) ) +# => MoveCell { +# ruleRef = name(^^match); +# wordRef = "previous"; +# childIndex = -1; # key to know what to say for each notation +# ::SpeakAfterMove = false; +# }; + +# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# ($NavCommand="MoveNext" || $NavCommand='MoveCellNext') && has_next(match) ) +# => MoveCell { +# ruleRef = name(^^match); +# wordRef = "next"; +# ::StartPosition = next(match).dfs; +# ::EndPosition = next(match).offset; +# }; + +# # no next child -- in first column -- don't move +# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# ($NavCommand="MoveNext" || $NavCommand='MoveCellNext' ) ) +# => MoveCell { +# ruleRef = name(^^match); +# wordRef = "next"; +# childIndex = -1; # key to know what to say for each notation +# ::SpeakAfterMove = false; +# }; + +# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# $NavCommand='MoveCellUp' && has_previous(^^match) ) +# => MoveCell { +# ruleRef = name(^^match); +# wordRef = "up"; +# ::StartPosition = ^^^match[index(^^match)-1][-1][index(match)-count(^match)].dfs; +# ::EndPosition = ^^^match[index(^^match)-1][-1][index(match)-count(^match)].offset; +# }; + +# # no previous child -- in first column -- don't move +# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# $NavCommand='MoveCellUp' ) +# => MoveCell { +# ruleRef = name(^^match); +# wordRef = "up"; +# childIndex = -1; # key to know what to say for each notation +# ::SpeakAfterMove = false; +# }; + +# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# $NavCommand='MoveCellDown' && has_next(^^match) ) +# => MoveCell { +# ruleRef = name(^^match); +# wordRef = "down"; +# ::StartPosition = ^^^match[index(^^match)+1][-1][index(match)-count(^match)].dfs; +# ::EndPosition = ^^^match[index(^^match)+1][-1][index(match)-count(^match)].offset; +# }; + +# # no previous child -- in first column -- don't move +# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# $NavCommand='MoveCellDown' ) +# => MoveCell { +# ruleRef = name(^^match); +# wordRef = "down"; +# childIndex = -1; # key to know what to say for each notation +# ::SpeakAfterMove = false; +# }; + +# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# $NavCommand='MoveColumnStart' ) +# => MoveColStart { +# ruleRef = name(^^match); +# column = index(match); +# ::StartPosition = ^^^match[0][-1][index(match)-count(^match)].dfs; +# ::EndPosition = ^^^match[0][-1][index(match)-count(^match)].offset; +# }; + +# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# $NavCommand='MoveColumnEnd' ) +# => MoveColEnd { +# ruleRef = name(^^match); +# column = index(match); +# ::StartPosition = ^^^match[count(^^^match)-1][-1][index(match)-count(^match)].dfs; +# ::EndPosition = ^^^match[count(^^^match)-1][-1][index(match)-count(^match)].offset; +# }; + +# any ? ( (name(match)=="mn" || name(match)=="none") && +# has_parent(match) && name(^match)=="mscarries" && +# ($NavCommand="MovePrevious" || $NavCommand='MoveCellPrevious') && has_previous(match) ) +# => MoveCell { +# ruleRef = name(^match); +# wordRef = "previous"; +# ::StartPosition = previous(match).dfs; +# ::EndPosition = previous(match).offset; +# }; + +# # no previous child -- in first column -- don't move +# any ? ( (name(match)=="mn" || name(match)=="none") && +# has_parent(match) && name(^match)=="mscarries" && +# ($NavCommand="MovePrevious" || $NavCommand='MoveCellPrevious') ) +# => MoveCell { +# ruleRef = name(^match); +# wordRef = "previous"; +# childIndex = -1; # key to know what to say for each notation +# ::SpeakAfterMove = false; +# }; + +# any ? ( (name(match)=="mn" || name(match)=="none") && +# has_parent(match) && name(^match)=="mscarries" && +# ($NavCommand="MoveNext" || $NavCommand='MoveCellNext') && has_next(match) ) +# => MoveCell { +# ruleRef = name(^match); +# wordRef = "next"; +# ::StartPosition = next(match).dfs; +# ::EndPosition = next(match).offset; +# }; + +# # no next child -- in last column -- don't move +# any ? ( (name(match)=="mn" || name(match)=="none") && +# has_parent(match) && name(^match)=="mscarries" && +# ($NavCommand="MoveNext" || $NavCommand='MoveCellNext') ) +# => MoveCell { +# ruleRef = name(^match); +# wordRef = "next"; +# childIndex = -1; # key to know what to say for each notation +# ::SpeakAfterMove = false; +# }; + +# any ? ( (name(match)=="mn" || name(match)=="none") && +# has_parent(match) && name(^match)=="mscarries" && +# $NavCommand='MoveCellUp' && has_previous(^match) ) +# => MoveCell { +# ruleRef = name(^match); +# wordRef = "up"; +# ::StartPosition = ^^match[index(^match)-1][index(match)-count(^match)].dfs; +# ::EndPosition = ^^match[index(^match)-1][index(match)-count(^match)].offset; +# }; + +# # no previous child -- in first row -- don't move +# any ? ( (name(match)=="mn" || name(match)=="none") && +# has_parent(match) && name(^match)=="mscarries" && +# $NavCommand='MoveCellUp' ) +# => MoveCell { +# ruleRef = name(^match); +# wordRef = "up"; +# childIndex = -1; # key to know what to say for each notation +# ::SpeakAfterMove = false; +# }; + +# any ? ( (name(match)=="mn" || name(match)=="none") && +# has_parent(match) && name(^match)=="mscarries" && +# $NavCommand='MoveCellDown' && has_next(^match) ) +# => MoveCell { +# ruleRef = name(^match); +# wordRef = "down"; +# ::StartPosition = ^^match[index(^match)+1][-1][index(match)-count(^match)].dfs; +# ::EndPosition = ^^match[index(^match)+1][-1][index(match)-count(^match)].offset; +# }; + +# # no next child -- in last row -- don't move +# any ? ( (name(match)=="mn" || name(match)=="none") && +# has_parent(match) && name(^match)=="mscarries" && +# $NavCommand='MoveCellDown' ) +# => MoveCell { +# ruleRef = name(^match); +# wordRef = "down"; +# childIndex = -1; # key to know what to say for each notation +# ::SpeakAfterMove = false; +# }; + +# mn ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# $NavCommand='MoveColumnStart' ) +# => MoveColStart { +# ruleRef = name(^^match); +# column = index(match); +# ::StartPosition = ^^^match[0][-1][index(match)-count(^match)].dfs; +# ::EndPosition = ^^^match[0][-1][index(match)-count(^match)].offset; +# }; + +# mn ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# $NavCommand='MoveColumnEnd' ) +# => MoveColEnd { +# ruleRef = name(^^match); +# column = index(match); +# ::StartPosition = ^^^match[count(^^^match)-1][-1][index(match)-count(^match)].dfs; +# ::EndPosition = ^^^match[count(^^^match)-1][-1][index(match)-count(^match)].offset; +# }; + + + +- name: default-cell-move + + tag: "*" + match: + - "$NavCommand='MoveCellPrevious' or $NavCommand='MoveCellNext' or" + - "$NavCommand='MoveCellUp' or $NavCommand='MoveCellDown' or" + - "$NavCommand='MoveColumnStart' or $NavCommand='MoveColumnEnd' or" + - "$NavCommand='ReadCellCurrent'" + replace: + - test: + if: "ancestor::m:mtd" + then: + - x: "ancestor::m:mtd[1]" # try again on an mtd node + else: + - T: "fora da tabela" + - pause: long + - set_variables: [SpeakExpression: false()] + +# ======== Move/Read/Describe Next rules ================= + +# skip 'none' +- name: move-next-none + tag: [none, mprescripts] + match: + - "($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext' or $NavCommand = 'DescribePrevious' or $NavCommand = 'MoveNextZoom') and" + - "parent::*[1][name(.)='mmultiscripts'] and following-sibling::*" + replace: + - with: + variables: [Following: "following-sibling::*[1]"] + replace: + # two 'none's in a row -- move over and try again; one 'none', zoom in on next + - test: + if: "$Following[name(.)='none']" + then: [x: "$Following"] + else: + - with: + variables: [Move2D: "'em'", Child2D: "$Following"] + replace: [x: ".."] + - with: + variables: [NavCommand: "'MoveNextZoom'"] + replace: [x: "$Following"] + +# skip 'none' +- name: move-previous-none + tag: [none, mprescripts] + match: + - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious' or $NavCommand = 'MovePreviousZoom') and" + - "parent::*[1][name(.)='mmultiscripts'] and preceding-sibling::*" + replace: + - with: + variables: [Preceding: "preceding-sibling::*[1]"] + replace: + # two 'none's in a row -- move over and try again; one 'none', zoom in on preceding + - test: + if: "$Preceding[name(.)='none']" + then: [x: "$Preceding"] + else: + - with: + variables: [Move2D: "'em'", Child2D: "$Preceding"] + replace: [x: ".."] + - with: + variables: [NavCommand: "'MovePreviousZoom'"] + replace: [x: "$Preceding"] + + + +# skip invisible chars except for Enhanced mode when "times" should be read +- name: move-next-invisible + tag: "*" + match: + - "($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: "ir"] + - else_if: "$NavCommand = 'ReadNext'" + then: [T: "ler"] + else: [T: "descrever"] + - T: "direita" + - 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]"] + +- name: move-next-no-auto-zoom-at-edge + # at edge of 2D and in a mode where moving right isn't an option + tag: "*" + variables: [EdgeNode: "EdgeNode(., 'right', '2D')"] + match: "$NavCommand = 'MoveNext' and $NavMode!='Character' and not($AutoZoomOut) and $EdgeNode/@id!=@id" + replace: + - test: + if: "$MatchCounter = 0 and $NavVerbosity != 'Terse' and $NavCommand = 'MoveNext'" + then: + - T: "nĂŁo Ă© possĂ­vel mover para a direita" + - with: + variables: [Move2D: "'fim de'", Child2D: "$EdgeNode/*[last()]"] + replace: [x: "$EdgeNode"] + - pause: long + - set_variables: [SpeakExpression: false()] + +- name: move-next-no-auto-zoom-at-edge-math + # at edge of math -- no where to go (must be after we rule out being at the edge of 2D) because we want to speak that + tag: "*" + match: + - "($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext') and" + - "(self::m:math or name(EdgeNode(., 'right', 'math'))='math')" # at edge of math + replace: + - test: + if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" + then: + - T: "nĂŁo Ă© possĂ­vel" + - test: + - if: "$NavCommand = 'MoveNext'" + then: [T: "mover"] + - else_if: "$NavCommand = 'ReadNext'" + then: [T: "ler"] + else: [T: "descrever"] + - T: "direita, fim da expressĂŁo" + - pause: long + - set_variables: [SpeakExpression: false()] + +- name: move-next-auto-zoom-up-one-level + # Last child or in auto-zoom'd in-- move up a level and try again + # Note: we've already checked the for the case where we are at an edge and should not AutoZoomOut + tag: "*" + match: + - "($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext') and" + - "( not(following-sibling::*) or" + - " ( $NavMode='Enhanced' and " + - " count(following-sibling::*)=1 and (IsBracketed(.., '(', ')') or IsBracketed(.., '[', ']'))" + - " )" + - ")" + replace: + - test: + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" + then: + - test: + - if: "$NavCommand = 'MoveNext'" + then: [T: "mover"] + - else_if: "$NavCommand = 'ReadNext'" + then: [T: "ler"] + else: [T: "descrever"] + - T: "direita" + - pause: short + - with: + variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MoveNext'"] + replace: + - test: + if: "following-sibling::*" + then: + - with: + variables: [Move2D: "'em'", Child2D: "."] + replace: [x: ".."] + else: + - with: + variables: [Move2D: "'fora de'", Child2D: "."] + replace: [x: ".."] + - test: + if: "following-sibling::*" + then: + - x: ".." # move out of parens + else: + - 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: + - test: + # can't get here with MatchCounter=0, so no need to echo command + if: "following-sibling::*" + then: + - test: + if: "$NavVerbosity != 'Terse'" + then: + - T: "coluna" + - x: "count(preceding-sibling::*)+2" + - pause: short + - test: + if: "$NavMode = 'Character'" + then: + - with: + variables: [NavCommand: "'MoveNextZoom'"] + replace: [x: "following-sibling::*[1]"] + else: [set_variables: [NavNode: "following-sibling::*[1]/*[1]/@id"]] + else: + - x: ".." # try again at the row level + +- name: move-next-default + tag: [mtr, mlabeledtr] + match: "$Move2D = '' and ($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext')" + replace: + - test: + # can't get here with MatchCounter=0, so no need to echo command + if: "following-sibling::*" + then: + - T: "linha" + - x: "count(preceding-sibling::*)+2" + - T: "coluna 1" + - 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 + +- name: move-next-auto-zoom-parens + # auto-zoom into next child if next child is parenthesized expr + tag: "*" + match: + - "($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext') and" + - "$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(., '[', ']'))" + - " ]" + replace: + - test: + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" + then: + - test: + - if: "$NavCommand = 'MoveNext'" + then: [T: mover] + - else_if: "$NavCommand = 'ReadNext'" + then: [T: "ler"] + else: [T: "descrever"] + - T: "direita" + - pause: short + - set_variables: [NavNode: "following-sibling::*[1]/*[2]/@id"] + +# normal cases for MoveNext +- name: move-next-locked-zoom-level + # locked zoom level + tag: "*" + match: + - "($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: mover] + - else_if: "$NavCommand = 'ReadNext'" + then: [T: "ler"] + else: [T: "descrever"] + - T: "direita" + - pause: short + - 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']" + then: + - with: + variables: [Move2D: "'fora de'", Child2D: "."] + replace: [x: ".."] + - with: + variables: [MatchCounter: "$MatchCounter + 1"] + replace: [x: "following-sibling::*[1]"] # skip over 'none' + else: + - with: + variables: [Move2D: "'em'", Child2D: "following-sibling::*[1]"] + replace: [x: ".."] + - with: + variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MoveNextZoom'"] + replace: [x: "following-sibling::*[1]"] + +- name: move-next-default + tag: "*" + match: "$NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext'" + replace: + - test: + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" + then: + - test: + - if: "$NavCommand = 'MoveNext'" + then: [T: mover] + - else_if: "$NavCommand = 'ReadNext'" + then: [T: "ler"] + else: [T: "descrever"] + - T: "direita" + - pause: short + - test: + if: "IsNode(.., '2D')" + then: + - with: + variables: [Move2D: "'em'", Child2D: "following-sibling::*[1]"] + replace: [x: ".."] + - set_variables: [NavNode: "following-sibling::*[1]/@id"] + +# ======== Move/Read/Describe Previous rules ================= + +# skip invisible chars except for Enhanced mode when "times" should be read +- name: move-previous-invisible + tag: "*" + match: + - "($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: "mover"] + - else_if: "$NavCommand = 'ReadPrevious'" + then: [T: "ler"] + else: [T: "descrever"] + - T: "esquerda" + - 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]"] + +# two rules for when can't move right +- name: move-previous-no-auto-zoom-at-edge + # at edge of 2D and in a mode where moving right 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'" + then: + - T: "nĂŁo Ă© possĂ­vel mover para a esquerda" + - with: + variables: [Move2D: "'fim de'", Child2D: "$EdgeNode/*[1]"] + replace: [x: "$EdgeNode"] + - pause: long + +- name: move-previous-no-auto-zoom-at-edge-of-math + # at edge of math -- no where to go (must be after we rule out being at the edge of 2D) because we want to speak that + tag: "*" + match: + - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious') and" + - "(self::m:math or name(EdgeNode(., 'left', 'math'))='math')" + replace: + - T: "inĂ­cio da expressĂŁo" + - pause: long + - set_variables: [SpeakExpression: false()] + +- name: move-previous-at-end + + tag: "*" + match: + - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious') and" + - "EdgeNode(., 'left', 'math')/@id!=@id" # at edge of math + replace: + - test: + if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" + then: + - T: "nĂŁo Ă© possĂ­vel mover para a esquerda, inĂ­cio da expressĂŁo" + - pause: long + - set_variables: [SpeakExpression: false()] + +- name: move-previous-auto-zoom-up-one-level + # Last child or in auto-zoom'd in-- move up a level and try again + # Note: we've already checked the for the case where we are at an edge and should not AutoZoomOut + tag: "*" + match: + - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious') and" + - "( not(preceding-sibling::*) or" + - " ( $NavMode='Enhanced' and " + - " count(preceding-sibling::*)=1 and (IsBracketed(.., '(', ')') or IsBracketed(.., '[', ']'))" + - " )" + - ")" + replace: + - test: + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" + then: + - test: + - if: "$NavCommand = 'MovePrevious'" + then: [T: "mover"] + - else_if: "$NavCommand = 'ReadPrevious'" + then: [T: "ler"] + else: [T: "descrever"] + - T: "esquerda" + - pause: short + - with: + variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MovePrevious'"] + replace: + - test: + if: "preceding-sibling::*" + then: + - with: + variables: [Move2D: "'em'", Child2D: "."] + replace: [x: ".."] + else: + - with: + variables: [Move2D: "'fora de'", Child2D: "."] + replace: [x: ".."] + - test: + if: "preceding-sibling::*" + then: + - x: .. # move out of parens + else: + - x: ".." + +- name: move-previous-auto-zoom-parens + # auto-zoom into next child if next child is parenthesized expr + # auto-zoom into previous child if previous child is parenthesized expr + # Note: there is an asymmetry here from MoveNext because the base of a scripted might have parens for grouping, but not true for the script + tag: "*" + match: + - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious') and" + - "$NavMode='Enhanced' and" + - "preceding-sibling::* and" + - "(parent::m:mrow or parent::m:msub or parent::m:msup or" + - " (count(preceding-sibling::*)=1 and (parent::m:msubsup or parent::m:mmultiscripts))" # make sure moving into base + - ") and" + - "preceding-sibling::*[1][self::m:mrow and count(*)=3 and " #exclude empty parens + - " (IsBracketed(., '(', ')') or IsBracketed(., '[', ']'))" + - " ]" + replace: + - test: + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" + then: + - test: + - if: "$NavCommand = 'MovePrevious'" + then: [T: mover] + - else_if: "$NavCommand = 'ReadPrevious'" + then: [T: "ler"] + else: [T: "descrever"] + - T: "esquerda" + - pause: short + - test: + if: "not(parent::m:mrow)" + then: + - with: + variables: [Move2D: "'em'", Child2D: "preceding-sibling::*[1]"] + replace: [x: ".."] + - set_variables: [NavNode: "preceding-sibling::*[1]/*[2]/@id"] + +# normal cases for MovePrevious + +- name: move-previous-default + tag: mtd + match: "$Move2D = '' and ($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious')" + replace: + - test: + # can't get here with MatchCounter=0, so no need to echo command + if: "preceding-sibling::*" + then: + - test: + if: "$NavVerbosity != 'Terse'" + then: + - T: "coluna" + - 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 + +- name: move-previous-default + tag: [mtr, mlabeledtr] + match: "$Move2D = '' and ($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious')" + replace: + - test: + # can't get here with MatchCounter=0, so no need to echo command + if: "preceding-sibling::*" + then: + - test: + if: "$NavVerbosity != 'Terse'" + then: + - T: "linha" + - x: "count(preceding-sibling::*)" + - T: "coluna" + - x: "count(*)" + - pause: medium + - test: + if: "$NavMode = 'Character'" + then: + - with: + variables: [NavCommand: "'MovePreviousZoom'"] + replace: [x: "preceding-sibling::*[1]"] + else: + - set_variables: [NavNode: "preceding-sibling::*[1]/*[last()]/*[last()]/@id"] + else: [x: ".."] # try again for after + +- name: move-previous-locked-zoom-level + # locked zoom level + tag: "*" + match: + - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious') and" + - "$ReadZoomLevel>=0" + replace: + - 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']" + then: + - with: + variables: [Move2D: "'fora de'", Child2D: "."] + replace: [x: ".."] + - with: + variables: [MatchCounter: "$MatchCounter + 1"] + replace: [x: "preceding-sibling::*[1]"] # skip over 'none' + else: + - test: + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" + then: + - test: + - if: "$NavCommand = 'MovePrevious'" + then: [T: mover] + - else_if: "$NavCommand = 'ReadPrevious'" + then: [T: "ler"] + else: [T: "descrever"] + - T: "esquerda" + - pause: short + - with: + variables: [Move2D: "'em'", Child2D: "preceding-sibling::*[1]"] + replace: [x: ".."] + - with: + variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MovePreviousZoom'"] + replace: [x: "preceding-sibling::*[1]"] + +- name: move-previous-default + tag: "*" + match: "$NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious'" + replace: + - test: + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" + then: + - test: + - if: "$NavCommand = 'MovePrevious'" + then: [T: mover] + - else_if: "$NavCommand = 'ReadPrevious'" + then: [T: "ler"] + else: [T: "descrever"] + - T: "esquerda" + - pause: short + - test: + if: "IsNode(.., '2D')" + then: + - with: + variables: [Move2D: "'em'", Child2D: "preceding-sibling::*[1]"] + replace: [x: ".."] + - set_variables: [NavNode: "preceding-sibling::*[1]/@id"] + +# ********* ReadZoomLevel toggle *************** +# These set ::NavMode + +- name: toggle-mode-up + + + tag: "*" + match: "$NavCommand = 'ToggleZoomLockUp'" + replace: + - test: + - if: "$NavMode = 'Enhanced'" + then: + - T: "caractere" + - set_variables: [NavMode: "'Character'", ReadZoomLevel: "1"] + - else_if: "$NavMode = 'Character'" + then: + - T: "simples" + - set_variables: [NavMode: "'Simple'", ReadZoomLevel: "1"] + - else: + - T: "avançado" + - set_variables: [NavMode: "'Enhanced'", ReadZoomLevel: "-1"] + - T: "modo" + - pause: long + - test: + - if: "$NavMode != 'Enhanced'" # potentially need to zoom to the sibling + then: + - with: + variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MoveNextZoom'"] + replace: [x: "."] + +- name: toggle-mode-down + tag: "*" + match: "$NavCommand = 'ToggleZoomLockDown'" + replace: + - test: + - if: "$NavMode = 'Enhanced'" + then: + - T: "simples" + - set_variables: [NavMode: "'Simple'", ReadZoomLevel: "1"] + - else_if: "$NavMode = 'Character'" + then: + - T: "avançado" + - set_variables: [NavMode: "'Enhanced'", ReadZoomLevel: "-1"] + - else: + - T: "caractere" + - set_variables: [NavMode: "'Character'", ReadZoomLevel: "1"] + - T: "modo" + - pause: long + - test: + - if: "$NavMode != 'Enhanced'" # potentially need to zoom to the sibling + then: + - with: + variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MoveNextZoom'"] + replace: [x: "."] + +- name: toggle-speech-describe + tag: "*" + match: "$NavCommand = 'ToggleSpeakMode'" + replace: + - test: + if: "$Overview = 'true'" + then: + - T: "falar a expressĂŁo apĂłs mover" + - set_variables: [Overview: "'false'"] + else: + - T: "resumo da expressĂŁo apĂłs mover" + - set_variables: [Overview: "'true'"] + - pause: long + +- name: current + tag: "*" + match: "$NavCommand = 'ReadCurrent' or $NavCommand = 'DescribeCurrent'" + replace: + - test: + if: "$NavVerbosity = 'Verbose'" + then: + - test: + - if: "$NavCommand = 'ReadCurrent'" + then: [T: "ler"] + else: [T: "descrever"] + - T: "atual" + - 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 + + tag: "*" + match: + - "starts-with($NavCommand, 'Read') or " + - "starts-with($NavCommand, 'Describe') or " + - "starts-with($NavCommand, 'MoveTo')" + replace: + - test: + if: "$NavVerbosity != 'Terse'" + then: + - test: + - if: "starts-with($NavCommand, 'Read')" + then: [T: "ler"] + - else_if: "starts-with($NavCommand, 'Describe')" + then: [T: "descrever"] + - else_if: "starts-with($NavCommand, 'MoveTo')" + then: [T: "mover para"] + else: [T: "definir"] + - T: "marcador de posição" + - x: "$PlaceMarkerIndex" + - pause: long + - set_variables: [NavNode: "$PlaceMarker"] + +- name: set-placemarker + tag: "*" + match: "starts-with($NavCommand, 'SetPlacemarker')" + replace: + - test: + if: "$NavVerbosity != 'Terse'" + then: + - T: "inserir marcador de posição" + - x: "$PlaceMarkerIndex" + - pause: long + - set_variables: [NavNode: "@id"] + +# ********* WhereAmI *************** + +# FIX: WhereAmI needs support from the Rust code to loop around and do speech at each iteration. +# 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: + - translate: "@id" + - pause: long + - with: + variables: [MatchCounter: "$MatchCounter + 1"] + replace: [x: ".."] + +- name: where-am-i-stop + tag: "*" + match: + - "($NavCommand = 'WhereAmI' or $NavCommand = 'WhereAmIAll') and $MatchCounter > 0 and" + # stopping conditions + - "(self::m:math or " + - " parent::*[self::m:math and (count(*)=1 or (count(*)=2 and *[2][.=',' or .='.' or .=';' or .='?']) ) ] " + - ")" + replace: + - test: + if: "$NavCommand = 'WhereAmI'" + then: + - T: "nĂŁo hĂĄ mais nada dentro" + - pause: long + - set_variables: [SpeakExpression: false()] + else: + - T: "interior" + - pause: medium + - set_variables: [NavNode: "@id"] + +- name: where-am-i-middle + tag: "*" + match: "$NavCommand = 'WhereAmI' or $NavCommand = 'WhereAmIAll'" + replace: + - T: "interior" + - pause: medium + - test: + - 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"]] + else: + - translate: "@id" + - pause: long + - x: '..' diff --git a/Rules/Languages/pt/overview.yaml b/Rules/Languages/pt/overview.yaml new file mode 100644 index 000000000..f28a44564 --- /dev/null +++ b/Rules/Languages/pt/overview.yaml @@ -0,0 +1,119 @@ +--- +# Provide an overview/outline/description of the math +# MathPlayer just tried to shorten things like "mfrac" by just saying "fraction" +# For mrow, it say up to 5 operands and just say "and n more things" for the rest +# This results in strings of varying length. Given human memory is about 7 words long, +# it would be better to aim for 7 words (maybe aim for a range of 6-10 words). +# Idea: +# Start by generating a terse form of the speech +# At every step when the strings are being joined +# a) if the #words <= 7, return the joined string +# b) otherwise, set verbosity to 'overview' and regenerate the expression and use that +# There is a balance that you want to maximize the info given, so 10 words is likely better then 3. +# That might mean that at the top level, we may want to allow the first few children to expand + + +- name: overview-default + tag: [fraction, mfrac] + match: "." + replace: + - test: + if: "IsNode(*[1], 'simple') and IsNode(*[2], 'simple')" + then: + - x: "*[1]" + - T: "sobre" + - x: "*[2]" + else: + - T: "fração" + +- name: overview-default + tag: [msqrt, "square-root"] # CORREÇÃO: idem + match: "." + replace: + - T: "raiz quadrada" + - test: + if: "IsNode(*[1], 'simple')" + then: + - test: + if: "$Verbosity!='Terse'" + then: [T: de] + - x: "*[1]" + +- name: overview-default + tag: [mroot, root] # CORREÇÃO: idem + match: "." + replace: + - test: + if: "*[2][self::m:mn]" + then_test: + - if: "*[2][.='2']" + then: [T: raiz quadrada] + - else_if: "*[2][.='3']" + then: [T: raiz cĂșbica] + - else_if: "*[2][not(contains(., '.'))]" + then: [T: raiz, T: de Ă­ndice, x: "*[2]"] + else: + # Ă­ndice simbĂłlico (ex.: raiz de Ă­ndice n) — em portuguĂȘs a ordem natural + # Ă© "raiz de Ă­ndice n", diferente do inglĂȘs "n-th root". + - T: raiz + - T: de Ă­ndice + - x: "*[2]" + - test: + if: "IsNode(*[1], 'simple')" + then: + - test: + if: "$Verbosity!='Terse'" + then: [T: de] + - x: "*[1]" + +- name: matrix-override + tag: mrow + match: + - "*[2][self::m:mtable] and" + - "(IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|'))" + replace: + # CORREÇÃO: a ordem herdada do inglĂȘs ("the 2 by 3 matrix") produzia + # "a 2 por 3 matriz". Em portuguĂȘs o substantivo vem antes da dimensĂŁo. + - test: + if: "*[1][.='|']" # just need to check the first bracket since we know it must be (, [, or | + then: [T: determinante] + else: [T: matriz] + - x: count(*[2]/*) + - T: por + - x: count(*[2]/*[self::m:mtr][1]/*) + +- name: overview-default + tag: mtable + match: "." + replace: + # CORREÇÃO: mesma inversĂŁo de ordem do bloco acima. + - T: "tabela" + - x: count(*[2]/*) + - T: por + - x: count(*[2]/*[self::m:mtr][1]/*) + +- name: short-mrow + tag: mrow + match: "count(*)<6" + replace: + - insert: + nodes: "*" + replace: [pause: auto] + +- name: long-mrow + tag: mrow + match: "." + replace: + - x: "*[1]" + - pause: auto + - x: "*[2]" + - pause: auto + - x: "*[3]" + - pause: auto + - x: "*[4]" + - pause: auto + - x: "*[5]" + - pause: auto + - T: "etc." + +- include: "SimpleSpeak_Rules.yaml" diff --git a/Rules/Languages/pt/unicode-full.yaml b/Rules/Languages/pt/unicode-full.yaml new file mode 100644 index 000000000..21a1e0b71 --- /dev/null +++ b/Rules/Languages/pt/unicode-full.yaml @@ -0,0 +1,3431 @@ + + - "˘": [T: "breve"] # 0x2d8 + - "˚": [T: "anel acima"] # 0x2da + - "˛": [T: "ogonek"] # 0x2db + - "˜": [T: "til pequeno"] # 0x2dc + - "˝": [T: "acento agudo duplo"] # 0x2dd + - "↔": [T: "seta para a esquerda e para a direita"] # 0x2194 + - "↕": [T: "seta para cima e para baixo"] # 0x2195 + - "↖": [T: "seta para noroeste"] # 0x2196 + - "↙": [T: "seta para sudoeste"] # 0x2199 + - "↚": [T: "seta para a esquerda com traço"] # 0x219a + - "↛": [T: "seta para a direita com traço"] # 0x219b + - "↜": [T: "seta ondulada para a esquerda"] # 0x219c + - "↝": [T: "seta ondulada para a direita"] # 0x219d + - "↞": [T: "seta de duas pontas para a esquerda"] # 0x219e + - "↟": [T: "seta de duas pontas para cima"] # 0x219f + - "↠": [T: "seta de duas pontas para a direita"] # 0x21a0 + - "↡": [T: "seta de duas pontas para baixo"] # 0x21a1 + - "↱": [T: "seta para a esquerda com cauda"] # 0x21a2 + - "↣": [T: "seta para a direita com cauda"] # 0x21a3 + - "ↀ": [T: "seta para a esquerda a partir de barra"] # 0x21a4 + - "ↄ": [T: "seta para cima a partir de barra"] # 0x21a5 + - "↩": [T: "seta para a direita a partir de barra"] # 0x21a6 + - "↧": [T: "seta para baixo a partir de barra"] # 0x21a7 + - "↹": [T: "seta para cima e para baixo com base"] # 0x21a8 + - "↩": [T: "seta para a esquerda com gancho"] # 0x21a9 + - "â†Ș": [T: "seta para a direita com gancho"] # 0x21aa + - "↫": [T: "seta para a esquerda com laço"] # 0x21ab + - "↬": [T: "seta para a direita com laço"] # 0x21ac + - "↭": [T: "seta ondulada para a esquerda e para a direita"] # 0x21ad + - "↼": [T: "seta para a esquerda e para a direita com traço"] # 0x21ae + - "↯": [T: "seta em zigue-zague para baixo"] # 0x21af + - "↰": [T: "seta para cima com ponta para a esquerda"] # 0x21b0 + - "↱": [T: "seta para cima com ponta para a direita"] # 0x21b1 + - "â†Č": [T: "seta para baixo com ponta para a esquerda"] # 0x21b2 + - "↳": [T: "seta para baixo com ponta para a direita"] # 0x21b3 + - "↮": [T: "seta para a direita com canto para baixo"] # 0x21b4 + - "↔": [T: "seta para baixo com canto para a esquerda"] # 0x21b5 + - "↶": [T: "seta semicircular superior no sentido anti-horĂĄrio"] # 0x21b6 + - "↷": [T: "seta semicircular superior no sentido horĂĄrio"] # 0x21b7 + - "↾": [T: "seta para noroeste atĂ© barra longa"] # 0x21b8 + - "â†č": [T: "seta para a esquerda atĂ© barra sobre seta para a direita atĂ© barra"] # 0x21b9 + - "â†ș": [T: "seta circular aberta no sentido anti-horĂĄrio"] # 0x21ba + - "↻": [T: "seta circular aberta no sentido horĂĄrio"] # 0x21bb + - "↌": [T: "arpĂŁo para a esquerda com farpa para cima"] # 0x21bc + - "↜": [T: "arpĂŁo para a esquerda com farpa para baixo"] # 0x21bd + - "↟": [T: "arpĂŁo para cima com farpa para a direita"] # 0x21be + - "↿": [T: "arpĂŁo para cima com farpa para a esquerda"] # 0x21bf + - "⇀": [T: "arpĂŁo para a direita com farpa para cima"] # 0x21c0 + - "⇁": [T: "arpĂŁo para a direita com farpa para baixo"] # 0x21c1 + - "⇂": [T: "arpĂŁo para baixo com farpa para a direita"] # 0x21c2 + - "⇃": [T: "arpĂŁo para baixo com farpa para a esquerda"] # 0x21c3 + - "⇄": [T: "seta para a direita sobre seta para a esquerda"] # 0x21c4 + - "⇅": [T: "seta para cima Ă  esquerda de seta para baixo"] # 0x21c5 + - "⇆": [T: "seta para a esquerda sobre seta para a direita"] # 0x21c6 + - "⇇": [T: "duas setas para a esquerda"] # 0x21c7 + - "⇈": [T: "duas setas para cima"] # 0x21c8 + - "⇉": [T: "duas setas para a direita"] # 0x21c9 + - "⇊": [T: "duas setas para baixo"] # 0x21ca + - "⇋": [T: "arpĂŁo para a esquerda sobre arpĂŁo para a direita"] # 0x21cb + - "⇌": [T: "arpĂŁo para a direita sobre arpĂŁo para a esquerda"] # 0x21cc + - "⇍": [T: "seta dupla para a esquerda com traço"] # 0x21cd + - "⇎": [T: "seta dupla para a esquerda e para a direita com traço"] # 0x21ce + - "⇏": [T: "seta dupla para a direita com traço"] # 0x21cf + - "⇐": [T: "seta dupla para a esquerda"] # 0x21d0 + - "⇑": [T: "seta dupla para cima"] # 0x21d1 + - "⇓": [T: "seta dupla para baixo"] # 0x21d3 + - "⇔": [T: "se e somente se"] # 0x21d4 + - "⇕": [T: "seta dupla para cima e para baixo"] # 0x21d5 + - "⇖": [T: "seta dupla para noroeste"] # 0x21d6 + - "⇗": [T: "seta dupla para nordeste"] # 0x21d7 + - "⇘": [T: "seta dupla para sudeste"] # 0x21d8 + - "⇙": [T: "seta dupla para sudoeste"] # 0x21d9 + - "⇚": [T: "seta tripla para a esquerda"] # 0x21da + - "⇛": [T: "seta tripla para a direita"] # 0x21db + - "⇜": [T: "seta serpenteante para a esquerda"] # 0x21dc + - "⇝": [T: "seta serpenteante para a direita"] # 0x21dd + - "⇞": [T: "seta para cima com traço duplo"] # 0x21de + - "⇟": [T: "seta para baixo com traço duplo"] # 0x21df + - "⇠": [T: "seta tracejada para a esquerda"] # 0x21e0 + - "⇡": [T: "seta tracejada para cima"] # 0x21e1 + - "⇱": [T: "seta tracejada para a direita"] # 0x21e2 + - "⇣": [T: "seta tracejada para baixo"] # 0x21e3 + - "⇀": [T: "seta para a esquerda atĂ© barra"] # 0x21e4 + - "⇄": [T: "seta para a direita atĂ© barra"] # 0x21e5 + - "⇩": [T: "seta vazada para a esquerda"] # 0x21e6 + - "⇧": [T: "seta vazada para cima"] # 0x21e7 + - "⇹": [T: "seta vazada para a direita"] # 0x21e8 + - "⇩": [T: "seta vazada para baixo"] # 0x21e9 + - "â‡Ș": [T: "seta vazada para cima a partir de barra"] # 0x21ea + - "⇫": [T: "seta vazada para cima sobre pedestal"] # 0x21eb + - "⇬": [T: "seta vazada para cima sobre pedestal com barra horizontal"] # 0x21ec + - "⇭": [T: "seta vazada para cima sobre pedestal com barra vertical"] # 0x21ed + - "⇼": [T: "seta vazada dupla para cima"] # 0x21ee + - "⇯": [T: "seta vazada dupla para cima sobre pedestal"] # 0x21ef + - "⇰": [T: "seta vazada para a direita a partir de parede"] # 0x21f0 + - "⇱": [T: "seta para noroeste atĂ© o canto"] # 0x21f1 + - "â‡Č": [T: "seta para sudeste atĂ© o canto"] # 0x21f2 + - "⇳": [T: "seta vazada para cima e para baixo"] # 0x21f3 + - "⇮": [T: "seta para a direita com cĂ­rculo pequeno"] # 0x21f4 + - "⇔": [T: "seta para baixo Ă  esquerda de seta para cima"] # 0x21f5 + - "⇶": [T: "trĂȘs setas para a direita"] # 0x21f6 + - "⇷": [T: "seta para a esquerda com traço vertical"] # 0x21f7 + - "⇾": [T: "seta para a direita com traço vertical"] # 0x21f8 + - "â‡č": [T: "seta para a esquerda e para a direita com traço vertical"] # 0x21f9 + - "â‡ș": [T: "seta para a esquerda com traço vertical duplo"] # 0x21fa + - "⇻": [T: "seta para a direita com traço vertical duplo"] # 0x21fb + - "⇌": [T: "seta para a esquerda e para a direita com traço vertical duplo"] # 0x21fc + - "⇜": [T: "seta de ponta aberta para a esquerda"] # 0x21fd + - "⇟": [T: "seta de ponta aberta para a direita"] # 0x21fe + - "⇿": [T: "seta vazada para a esquerda e para a direita"] # 0x21ff + - "∀": [T: "para todo"] # 0x2200 + - "∁": # 0x2201 + - test: + if: "$Verbosity!='Terse'" + then: [OT: "o"] + - T: "complemento de" + - "∃": [T: "existe"] # 0x2203 + - "∄": [T: "nĂŁo existe"] # 0x2204 + - "∅": [T: "conjunto vazio"] # 0x2205 + - "∇": [T: "nabla"] # 0x2207 + - "∋": [T: "contĂ©m o elemento"] # 0x220b + - "∌": [T: "nĂŁo contĂ©m o elemento"] # 0x220c + - "∍": [T: "contĂ©m o elemento"] # 0x220d + - "∎": [T: "fim da demonstração"] # 0x220e + - "∏": [T: "produtĂłrio"] # 0x220f + - "∑": [T: "somatĂłrio"] # 0x2211 + - "−": [T: "menos"] # 0x2212 + - "∓": [T: "menos ou mais"] # 0x2213 + - "∔": [T: "mais com ponto"] # 0x2214 + - "∕": [T: "dividido por"] # 0x2215 + - "∖": [T: "diferença de conjuntos"] # 0x2216 + - "∗": [T: "vezes"] # 0x2217 + - "∙": # 0x2219 + - test: + if: "@data-chem-formula-op" + then: [T: "ponto"] + else: [T: "vezes"] + - "∛": # 0x221b + - test: + if: "$Verbosity!='Terse'" + then: [OT: "a"] + - T: "raiz cĂșbica de" + - "∜": # 0x221c + - test: + if: "$Verbosity!='Terse'" + then: [OT: "a"] + - T: "raiz quarta de" + - "∞": [T: "infinito"] # 0x221e + - "∟": [T: "Ăąngulo reto"] # 0x221f + - "∠": [T: "Ăąngulo"] # 0x2220 + - "∥": [T: "Ăąngulo medido"] # 0x2221 + - "∹": [T: "Ăąngulo esfĂ©rico"] # 0x2222 + - "∧": [T: "e"] # 0x2227 + - "√": [T: "ou"] # 0x2228 + - "∩": [T: "interseção"] # 0x2229 + - "âˆȘ": [T: "uniĂŁo"] # 0x222a + - "∫": [T: "integral"] # 0x222b + - "∏": [T: "integral dupla"] # 0x222c + - "∭": [T: "integral tripla"] # 0x222d + - "∟": [T: "integral de contorno"] # 0x222e + - "∯": [T: "integral de superfĂ­cie"] # 0x222f + - "∰": [T: "integral de volume"] # 0x2230 + - "∱": [T: "integral no sentido horĂĄrio"] # 0x2231 + - "âˆČ": [T: "integral de contorno no sentido horĂĄrio"] # 0x2232 + - "∳": [T: "integral de contorno no sentido anti-horĂĄrio"] # 0x2233 + - "∎": [T: "portanto"] # 0x2234 + - "∔": [T: "porque"] # 0x2235 + - "∞": [T: "menos com ponto"] # 0x2238 + - "âˆč": [T: "tem excesso em relação a"] # 0x2239 + - "âˆș": # 0x223a + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "geometricamente proporcional a" + - "∻": # 0x223b + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "homotĂ©tico a" + - "≀": [T: "produto coroa"] # 0x2240 + - "≁": [T: "nĂŁo Ă© semelhante a"] # 0x2241 + - "≂": [T: "menos til"] # 0x2242 + - "≃": # 0x2243 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "assintoticamente igual a" + - "≄": # 0x2244 + # audit-ignore: em portuguĂȘs a negação jĂĄ Ă© frase completa; o "is" do inglĂȘs nĂŁo tem par que valha suprimir no Terse + - T: "nĂŁo Ă© assintoticamente igual a" + - "≅": # 0x2245 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "congruente a" + - "≆": # 0x2246 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "aproximadamente mas nĂŁo realmente igual a" + - "≇": # 0x2247 + + - T: "nĂŁo Ă© congruente a" + - "≈": # 0x2248 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "aproximadamente igual a" + - "≉": # 0x2249 + # audit-ignore: em portuguĂȘs a negação jĂĄ Ă© frase completa; o "is" do inglĂȘs nĂŁo tem par que valha suprimir no Terse + - T: "nĂŁo Ă© aproximadamente igual a" + - "≊": # 0x224a + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "aproximadamente igual ou igual a" + - "≋": [T: "til triplo"] # 0x224b + - "≌": [T: "sĂŁo todos iguais a"] # 0x224c + - "≍": # 0x224d + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "equivalente a" + - "≎": # 0x224e + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "geometricamente equivalente a" + - "≏": # 0x224f + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "a diferença entre" + - "≐": [T: "aproxima-se do limite"] # 0x2250 + - "≑": # 0x2251 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "geometricamente igual a" + - "≒": # 0x2252 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "aproximadamente igual ou a imagem de" + - "≓": # 0x2253 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "a imagem de ou aproximadamente igual a" + - "≔": [T: "dois pontos igual"] # 0x2254 + - "≕": [T: "igual dois pontos"] # 0x2255 + - "≖": [T: "igual com anel"] # 0x2256 + - "≗": # 0x2257 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "igual por definição a" + - "≘": [T: "corresponde a"] # 0x2258 + - "≙": [T: "estima"] # 0x2259 + - "≚": # 0x225a + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "equiangular a" # era "igual e inclinado a" (descrição do glifo); en: 'is equiangular to' + - "≛": [T: "igual com estrela"] # 0x225b + - "≜": [T: "igual delta"] # 0x225c + - "≝": [T: "Ă© definido como"] # 0x225d + - "≞": # 0x225e + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "medido por" # era "igual por medida a" (descrição); en: 'is measured by' + - "≟": [T: "tem relação desconhecida com"] # 0x225f + - "≱": # 0x2262 + # audit-ignore: em portuguĂȘs a negação jĂĄ Ă© frase completa; o "is" do inglĂȘs nĂŁo tem par que valha suprimir no Terse + - T: "nĂŁo Ă© idĂȘntico a" + - "≣": # 0x2263 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "estritamente equivalente a" + - "≹": # 0x2268 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "menor que mas nĂŁo igual a" + - "≩": # 0x2269 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "maior que mas nĂŁo igual a" + - "≬": # 0x226c + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "entre" + - "≭": # 0x226d + # audit-ignore: em portuguĂȘs a negação jĂĄ Ă© frase completa; o "is" do inglĂȘs nĂŁo tem par que valha suprimir no Terse + - T: "nĂŁo Ă© equivalente a" + - "≼": # 0x226e + # audit-ignore: em portuguĂȘs a negação jĂĄ Ă© frase completa; o "Ă©" do + # inglĂȘs (is not less than) nĂŁo tem par que valha suprimir no Terse + - T: "nĂŁo Ă© menor que" + - "≯": # 0x226f + # audit-ignore: em portuguĂȘs a negação jĂĄ Ă© frase completa; o "is" do inglĂȘs nĂŁo tem par que valha suprimir no Terse + - T: "nĂŁo Ă© maior que" + - "≰": # 0x2270 + # audit-ignore: em portuguĂȘs a negação jĂĄ Ă© frase completa; o "is" do inglĂȘs nĂŁo tem par que valha suprimir no Terse + - T: "nĂŁo Ă© menor nem igual a" + - "≱": # 0x2271 + # audit-ignore: em portuguĂȘs a negação jĂĄ Ă© frase completa; o "is" do inglĂȘs nĂŁo tem par que valha suprimir no Terse + - T: "nĂŁo Ă© maior nem igual a" + - "â‰Č": # 0x2272 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "menor ou equivalente a" + - "≳": # 0x2273 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "maior ou equivalente a" + - "≮": # 0x2274 + # audit-ignore: em portuguĂȘs a negação jĂĄ Ă© frase completa; o "is" do inglĂȘs nĂŁo tem par que valha suprimir no Terse + - T: "nĂŁo Ă© menor nem equivalente a" + - "≔": # 0x2275 + # audit-ignore: em portuguĂȘs a negação jĂĄ Ă© frase completa; o "is" do inglĂȘs nĂŁo tem par que valha suprimir no Terse + - T: "nĂŁo Ă© maior nem equivalente a" + - "≶": # 0x2276 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "menor ou maior que" + - "≷": # 0x2277 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "maior ou menor que" + - "≾": # 0x2278 + # audit-ignore: em portuguĂȘs a negação jĂĄ Ă© frase completa; o "is" do inglĂȘs nĂŁo tem par que valha suprimir no Terse + - T: "nem menor nem maior que" + - "â‰č": # 0x2279 + # audit-ignore: em portuguĂȘs a negação jĂĄ Ă© frase completa; o "is" do inglĂȘs nĂŁo tem par que valha suprimir no Terse + - T: "nem maior nem menor que" + - "â‰ș": [T: "precede"] # 0x227a + - "≻": [T: "sucede"] # 0x227b + - "≌": [T: "precede ou Ă© igual a"] # 0x227c + - "≜": [T: "sucede ou Ă© igual a"] # 0x227d + - "≟": [T: "precede ou Ă© equivalente a"] # 0x227e + - "≿": [T: "sucede ou Ă© equivalente a"] # 0x227f + - "⊀": [T: "nĂŁo precede"] # 0x2280 + - "⊁": [T: "nĂŁo sucede"] # 0x2281 + - "⊈": # 0x2288 + # audit-ignore: negação jĂĄ Ă© frase completa; com o ramo "Ă©" saĂ­a + # "Ă© nĂŁo estĂĄ contido em nem Ă© igual a". Igual a ≱, ≇ e ∊. + - T: "nĂŁo estĂĄ contido em nem Ă© igual a" + - "⊉": # 0x2289 + # audit-ignore: idem ⊈ — saĂ­a "Ă© nĂŁo contĂ©m nem Ă© igual a". + - T: "nĂŁo contĂ©m nem Ă© igual a" + - "⊊": [T: "estĂĄ contido em mas nĂŁo Ă© igual a"] # 0x228a + - "⊋": [T: "contĂ©m mas nĂŁo Ă© igual a"] # 0x228b + - "⊌": [T: "multiconjunto"] # 0x228c + - "⊍": [T: "multiplicação de multiconjunto"] # 0x228d + - "⊎": [T: "uniĂŁo de multiconjunto"] # 0x228e + - "⊏": [T: "imagem quadrada de"] # 0x228f + - "⊐": [T: "original quadrado de"] # 0x2290 + - "⊑": [T: "imagem quadrada de ou igual a"] # 0x2291 + - "⊒": [T: "original quadrado de ou igual a"] # 0x2292 + - "⊓": [T: "interseção quadrada"] # 0x2293 + - "⊔": [T: "uniĂŁo quadrada"] # 0x2294 + - "⊕": [T: "mais circulado"] # 0x2295 + - "⊖": [T: "menos circulado"] # 0x2296 + - "⊗": [T: "vezes circulado"] # 0x2297 + - "⊘": [T: "barra circulada"] # 0x2298 + - "⊙": [T: "ponto circulado"] # 0x2299 + - "⊚": [T: "anel circulado"] # 0x229a + - "⊛": [T: "asterisco circulado"] # 0x229b + - "⊜": [T: "igual circulado"] # 0x229c + - "⊝": [T: "traço circulado"] # 0x229d + - "⊞": [T: "mais enquadrado"] # 0x229e + - "⊟": [T: "menos enquadrado"] # 0x229f + - "⊠": [T: "vezes enquadrado"] # 0x22a0 + - "⊡": [T: "ponto enquadrado"] # 0x22a1 + - "⊱": [T: "demonstra"] # 0x22a2 + - "⊣": [T: "nĂŁo produz"] # 0x22a3 + - "⊀": [T: "topo"] # 0x22a4 + - "⊩": [T: "reduz a"] # 0x22a6 + - "⊧": [T: "modela"] # 0x22a7 + - "⊹": # 0x22a8 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "verdadeiro" + - "⊩": [T: "força"] # 0x22a9 + - "âŠȘ": [T: "barra vertical tripla com catraca Ă  direita"] # 0x22aa + - "⊫": [T: "barra vertical dupla com catraca dupla Ă  direita"] # 0x22ab + - "⊬": [T: "nĂŁo demonstra"] # 0x22ac + - "⊭": # 0x22ad + # audit-ignore: em portuguĂȘs a negação jĂĄ Ă© frase completa; o "is" do inglĂȘs nĂŁo tem par que valha suprimir no Terse + - T: "nĂŁo Ă© verdadeiro" + - "⊼": [T: "nĂŁo força"] # 0x22ae + - "⊯": [T: "barra vertical dupla com catraca dupla Ă  direita negada"] # 0x22af + - "⊰": [T: "precede sob relação"] # 0x22b0 + - "⊱": [T: "sucede sob relação"] # 0x22b1 + - "âŠČ": # 0x22b2 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "subgrupo normal de" + - "⊳": [T: "contĂ©m como subgrupo normal"] # 0x22b3 + - "⊮": # 0x22b4 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "subgrupo normal de ou igual a" + - "⊔": [T: "contĂ©m como subgrupo normal ou Ă© igual a"] # 0x22b5 + - "⊶": # 0x22b6 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "imagem original" + - "⊷": # 0x22b7 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "imagem" + - "⊾": [T: "multimapa"] # 0x22b8 + - "âŠč": [T: "matriz conjugada hermitiana"] # 0x22b9 + - "âŠș": [T: "intercala"] # 0x22ba + - "⊻": [T: "ou exclusivo"] # 0x22bb + - "⊌": [T: "nĂŁo-e"] # 0x22bc + - "⊜": [T: "nĂŁo-ou"] # 0x22bd + - "⊟": [T: "Ăąngulo reto com arco"] # 0x22be + - "⊿": [T: "triĂąngulo retĂąngulo"] # 0x22bf + - "⋀": [T: "e lĂłgico"] # 0x22c0 + - "⋁": [T: "ou lĂłgico"] # 0x22c1 + - "⋂": [T: "interseção"] # 0x22c2 + - "⋃": [T: "uniĂŁo"] # 0x22c3 + - "⋄": [T: "operador losango"] # 0x22c4 + - "⋅": # 0x22c5 + - test: + if: "@data-chem-formula-op" + then: [T: "ponto"] + else: [T: "vezes"] + - "⋆": [T: "vezes"] # 0x22c6 + - "⋇": [T: "divisĂŁo vezes"] # 0x22c7 + - "⋈": [T: "junção"] # 0x22c8 + - "⋉": # 0x22c9 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "produto semidireto Ă  esquerda" + - "⋊": # 0x22ca + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "produto semidireto Ă  direita" + - "⋋": # 0x22cb + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "junção semidireta Ă  esquerda" + - "⋌": # 0x22cc + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "junção semidireta Ă  direita" + - "⋍": [T: "til invertido igual"] # 0x22cd + - "⋎": [T: "ou lĂłgico ondulado"] # 0x22ce + - "⋏": [T: "e lĂłgico ondulado"] # 0x22cf + - "⋐": # 0x22d0 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "contido de forma fechada em" + - "⋑": # 0x22d1 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "contĂ©m de forma fechada" + - "⋒": # 0x22d2 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "interseção dupla" + - "⋓": # 0x22d3 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "uniĂŁo dupla" + - "⋔": # 0x22d4 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "transversal a" + - "⋕": # 0x22d5 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "igual e paralelo a" # era "paralelo forquilhado a" (descreve a forquilha); en: 'is equal to and parallel to' + - "⋖": [T: "menor que com ponto"] # 0x22d6 + - "⋗": [T: "maior que com ponto"] # 0x22d7 + - "⋘": # 0x22d8 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "muito menor que" + - "⋙": # 0x22d9 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "muito maior que" + - "⋚": # 0x22da + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "menor que, igual ou maior que" + - "⋛": # 0x22db + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "maior que, igual ou menor que" + - "⋜": # 0x22dc + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "igual ou menor que" + - "⋝": # 0x22dd + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "igual ou maior que" + - "⋞": # 0x22de + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "igual ou precede" + - "⋟": # 0x22df + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "igual ou sucede" + - "⋠": [T: "nĂŁo precede nem Ă© igual a"] # 0x22e0 + - "⋡": [T: "nĂŁo sucede nem Ă© igual a"] # 0x22e1 + - "⋱": [T: "nĂŁo Ă© imagem quadrada de nem igual a"] # 0x22e2 + - "⋣": [T: "nĂŁo Ă© original quadrado de nem igual a"] # 0x22e3 + - "â‹€": [T: "imagem quadrada de ou nĂŁo igual a"] # 0x22e4 + - "â‹„": [T: "original quadrado de ou nĂŁo igual a"] # 0x22e5 + - "⋩": # 0x22e6 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "menor mas nĂŁo equivalente a" + - "⋧": # 0x22e7 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "maior mas nĂŁo equivalente a" + - "⋹": [T: "precede mas nĂŁo Ă© equivalente a"] # 0x22e8 + - "⋩": [T: "sucede mas nĂŁo Ă© equivalente a"] # 0x22e9 + - "â‹Ș": # 0x22ea + # audit-ignore: em portuguĂȘs a negação jĂĄ Ă© frase completa; o "is" do inglĂȘs nĂŁo tem par que valha suprimir no Terse + - T: "nĂŁo Ă© subgrupo normal de" + - "⋫": [T: "nĂŁo contĂ©m como subgrupo normal"] # 0x22eb + - "⋬": # 0x22ec + # audit-ignore: em portuguĂȘs a negação jĂĄ Ă© frase completa; o "is" do inglĂȘs nĂŁo tem par que valha suprimir no Terse + - T: "nĂŁo Ă© subgrupo normal de nem igual a" + - "⋭": [T: "nĂŁo contĂ©m como subgrupo normal nem Ă© igual a"] # 0x22ed + - "⋼": [T: "reticĂȘncias verticais"] # 0x22ee + - "⋯": [T: "reticĂȘncias"] # 0x22ef + - "⋰": [T: "reticĂȘncias diagonais para cima"] # 0x22f0 + - "⋱": [T: "reticĂȘncias diagonais"] # 0x22f1 + - "â‹Č": [T: "pertence a com traço horizontal longo"] # 0x22f2 + - "⋳": [T: "pertence a com barra vertical no fim do traço"] # 0x22f3 + - "⋮": [T: "pertence a com barra vertical no fim do traço"] # 0x22f4 + - "â‹”": [T: "pertence a com ponto acima"] # 0x22f5 + - "⋶": [T: "pertence a com barra acima"] # 0x22f6 + - "⋷": [T: "pertence a com barra acima"] # 0x22f7 + - "⋾": [T: "pertence a com barra abaixo"] # 0x22f8 + - "â‹č": [T: "pertence a com dois traços horizontais"] # 0x22f9 + - "â‹ș": [T: "contĂ©m com traço horizontal longo"] # 0x22fa + - "⋻": [T: "contĂ©m com barra vertical no fim do traço"] # 0x22fb + - "⋌": [T: "contĂ©m com barra vertical no fim do traço"] # 0x22fc + - "⋜": [T: "contĂ©m com barra acima"] # 0x22fd + - "⋟": [T: "contĂ©m com barra acima"] # 0x22fe + - "⋿": [T: "pertinĂȘncia de multiconjunto da notação z"] # 0x22ff + - "■": [T: "quadrado preto"] # 0x25a0 + - "□": [T: "quadrado branco"] # 0x25a1 + - "▱": [T: "quadrado branco de cantos arredondados"] # 0x25a2 + - "▣": [T: "quadrado branco contendo quadrado preto pequeno"] # 0x25a3 + - "â–€": [T: "quadrado com preenchimento horizontal"] # 0x25a4 + - "â–„": [T: "quadrado com preenchimento vertical"] # 0x25a5 + - "▩": [T: "quadrado com hachura ortogonal"] # 0x25a6 + - "▧": [T: "quadrado com preenchimento diagonal descendente"] # 0x25a7 + - "▹": [T: "quadrado com preenchimento diagonal ascendente"] # 0x25a8 + - "▩": [T: "quadrado com hachura diagonal"] # 0x25a9 + - "â–Ș": [T: "quadrado preto pequeno"] # 0x25aa + - "▫": [T: "quadrado branco pequeno"] # 0x25ab + - "▬": [T: "retĂąngulo preto"] # 0x25ac + - "▭": [T: "retĂąngulo branco"] # 0x25ad + - "▼": [T: "retĂąngulo preto vertical"] # 0x25ae + - "▯": [T: "retĂąngulo branco vertical"] # 0x25af + - "▰": [T: "paralelogramo preto"] # 0x25b0 + - "▱": [T: "paralelogramo branco"] # 0x25b1 + - "â–Č": [T: "triĂąngulo preto apontando para cima"] # 0x25b2 + - "△": [T: "triĂąngulo"] # 0x25b3 + - "▮": [T: "triĂąngulo preto pequeno apontando para cima"] # 0x25b4 + - "â–”": [T: "triĂąngulo branco pequeno apontando para cima"] # 0x25b5 + - "▶": [T: "triĂąngulo preto apontando para a direita"] # 0x25b6 + - "▷": [T: "triĂąngulo branco apontando para a direita"] # 0x25b7 + - "▾": [T: "triĂąngulo preto pequeno apontando para a direita"] # 0x25b8 + - "â–č": [T: "triĂąngulo branco pequeno apontando para a direita"] # 0x25b9 + - "â–ș": [T: "ponteiro preto para a direita"] # 0x25ba + - "▻": [T: "ponteiro branco para a direita"] # 0x25bb + - "â–Œ": [T: "triĂąngulo preto apontando para baixo"] # 0x25bc + - "â–œ": [T: "triĂąngulo branco apontando para baixo"] # 0x25bd + - "â–Ÿ": [T: "triĂąngulo preto pequeno apontando para baixo"] # 0x25be + - "▿": [T: "triĂąngulo branco pequeno apontando para baixo"] # 0x25bf + - "◀": [T: "triĂąngulo preto apontando para a esquerda"] # 0x25c0 + - "◁": [T: "triĂąngulo branco apontando para a esquerda"] # 0x25c1 + - "◂": [T: "triĂąngulo preto pequeno apontando para a esquerda"] # 0x25c2 + - "◃": [T: "triĂąngulo branco pequeno apontando para a esquerda"] # 0x25c3 + - "◄": [T: "ponteiro preto para a esquerda"] # 0x25c4 + - "◅": [T: "ponteiro branco para a esquerda"] # 0x25c5 + - "◆": [T: "losango preto"] # 0x25c6 + - "◇": [T: "losango branco"] # 0x25c7 + - "◈": [T: "losango branco contendo losango preto pequeno"] # 0x25c8 + - "◉": [T: "olho de peixe"] # 0x25c9 + - "◊": [T: "losango"] # 0x25ca + - "○": [T: "cĂ­rculo branco"] # 0x25cb + - "◌": [T: "cĂ­rculo pontilhado"] # 0x25cc + - "◍": [T: "cĂ­rculo com preenchimento vertical"] # 0x25cd + - "◎": [T: "alvo"] # 0x25ce + - "●": [T: "cĂ­rculo preto"] # 0x25cf + - "◐": [T: "cĂ­rculo com metade esquerda preta"] # 0x25d0 + - "◑": [T: "cĂ­rculo com metade direita preta"] # 0x25d1 + - "◒": [T: "cĂ­rculo com metade inferior preta"] # 0x25d2 + - "◓": [T: "cĂ­rculo com metade superior preta"] # 0x25d3 + - "◔": [T: "cĂ­rculo com quadrante superior direito preto"] # 0x25d4 + - "◕": [T: "cĂ­rculo preto exceto o quadrante superior esquerdo"] # 0x25d5 + - "◖": [T: "meio cĂ­rculo preto esquerdo"] # 0x25d6 + - "◗": [T: "meio cĂ­rculo preto direito"] # 0x25d7 + - "◘": [T: "marcador inverso"] # 0x25d8 + - "◙": [T: "cĂ­rculo branco inverso"] # 0x25d9 + - "◚": [T: "metade superior de cĂ­rculo branco inverso"] # 0x25da + - "◛": [T: "metade inferior de cĂ­rculo branco inverso"] # 0x25db + - "◜": [T: "arco circular do quadrante superior esquerdo"] # 0x25dc + - "◝": [T: "arco circular do quadrante superior direito"] # 0x25dd + - "◞": [T: "arco circular do quadrante inferior direito"] # 0x25de + - "◟": [T: "arco circular do quadrante inferior esquerdo"] # 0x25df + - "◠": [T: "semicĂ­rculo superior"] # 0x25e0 + - "◡": [T: "semicĂ­rculo inferior"] # 0x25e1 + - "◱": [T: "triĂąngulo preto inferior direito"] # 0x25e2 + - "◣": [T: "triĂąngulo preto inferior esquerdo"] # 0x25e3 + - "â—€": [T: "triĂąngulo preto superior esquerdo"] # 0x25e4 + - "â—„": [T: "triĂąngulo preto superior direito"] # 0x25e5 + - "◩": [T: "composição"] # 0x25e6 + - "◧": [T: "quadrado com metade esquerda preta"] # 0x25e7 + - "◹": [T: "quadrado com metade direita preta"] # 0x25e8 + - "◩": [T: "quadrado com metade superior esquerda preta"] # 0x25e9 + - "â—Ș": [T: "quadrado com metade inferior direita preta"] # 0x25ea + - "◫": [T: "quadrado branco com linha divisĂłria"] # 0x25eb + - "◬": [T: "triĂąngulo branco apontando para cima com ponto"] # 0x25ec + - "◭": [T: "triĂąngulo apontando para cima com metade esquerda preta"] # 0x25ed + - "◼": [T: "triĂąngulo apontando para cima com metade direita preta"] # 0x25ee + - "◯": [T: "cĂ­rculo grande"] # 0x25ef + - "◰": [T: "quadrado branco com quadrante superior esquerdo"] # 0x25f0 + - "◱": [T: "quadrado branco com quadrante inferior esquerdo"] # 0x25f1 + - "â—Č": [T: "quadrado branco com quadrante inferior direito"] # 0x25f2 + - "◳": [T: "quadrado branco com quadrante superior direito"] # 0x25f3 + - "◮": [T: "cĂ­rculo branco com quadrante superior esquerdo"] # 0x25f4 + - "â—”": [T: "cĂ­rculo branco com quadrante inferior esquerdo"] # 0x25f5 + - "◶": [T: "cĂ­rculo branco com quadrante inferior direito"] # 0x25f6 + - "◷": [T: "cĂ­rculo branco com quadrante superior direito"] # 0x25f7 + - "◾": [T: "triĂąngulo superior esquerdo"] # 0x25f8 + - "â—č": [T: "triĂąngulo superior direito"] # 0x25f9 + - "â—ș": [T: "triĂąngulo inferior esquerdo"] # 0x25fa + - "◻": [T: "quadrado branco mĂ©dio"] # 0x25fb + - "â—Œ": [T: "quadrado preto mĂ©dio"] # 0x25fc + - "â—œ": [T: "quadrado branco pequeno mĂ©dio"] # 0x25fd + - "â—Ÿ": [T: "quadrado preto pequeno mĂ©dio"] # 0x25fe + - "◿": [T: "triĂąngulo inferior direito"] # 0x25ff + + +# Ordem das palavras: ao contrĂĄrio do inglĂȘs, que antepĂ”e o estilo +# ("fraktur cap a"), o portuguĂȘs pospĂ”e o adjetivo ("maiĂșscula a vazado"). +# Por isso o `spell:` vem ANTES da palavra de estilo nos blocos de alfabeto. +# Isso segue a expectativa jĂĄ registrada em tests/Languages/pt/alphabets.rs +# ("maiĂșscula delta vazado"). + + +# ---- FraçÔes vulgares (0x00bc-0x00be, 0x2150-0x215f) ---- + - "ÂŒ": [T: "um quarto"] # 0x00bc + - "œ": [T: "um meio"] # 0x00bd + - "Ÿ": [T: "trĂȘs quartos"] # 0x00be + - "⅐": [T: "um sĂ©timo"] # 0x2150 + - "⅑": [T: "um nono"] # 0x2151 + - "⅒": [T: "um dĂ©cimo"] # 0x2152 + - "⅓": [T: "um terço"] # 0x2153 + - "⅔": [T: "dois terços"] # 0x2154 + - "⅕": [T: "um quinto"] # 0x2155 + - "⅖": [T: "dois quintos"] # 0x2156 + - "⅗": [T: "trĂȘs quintos"] # 0x2157 + - "⅘": [T: "quatro quintos"] # 0x2158 + - "⅙": [T: "um sexto"] # 0x2159 + - "⅚": [T: "cinco sextos"] # 0x215a + - "⅛": [T: "um oitavo"] # 0x215b + - "⅜": [T: "trĂȘs oitavos"] # 0x215c + - "⅝": [T: "cinco oitavos"] # 0x215d + - "⅞": [T: "sete oitavos"] # 0x215e + - "⅟": [T: "um sobre"] # 0x215f + +# ---- Sobrescritos e subscritos (0x2070-0x209f) ---- + - "⁰": [T: "elevado a zero"] # 0x2070 + - "ⁱ": [T: "elevado a i"] # 0x2071 + - "⁎": [T: "elevado Ă  quarta potĂȘncia"] # 0x2074 + - "⁔": [T: "elevado Ă  quinta potĂȘncia"] # 0x2075 + - "⁶": [T: "elevado Ă  sexta potĂȘncia"] # 0x2076 + - "⁷": [T: "elevado Ă  sĂ©tima potĂȘncia"] # 0x2077 + - "⁞": [T: "elevado Ă  oitava potĂȘncia"] # 0x2078 + - "âč": [T: "elevado Ă  nona potĂȘncia"] # 0x2079 + - "âș": [T: "sinal de mais sobrescrito"] # 0x207a + - "⁻": [T: "menos sobrescrito"] # 0x207b + - "⁌": [T: "sinal de igual sobrescrito"] # 0x207c + - "⁜": [T: "abre parĂȘnteses sobrescrito"] # 0x207d + - " ": [T: "fecha parĂȘnteses sobrescrito"] # 0x207e + - "ⁿ": [T: "elevado Ă  enĂ©sima potĂȘncia"] # 0x207f + - "₀": [T: "subscrito zero"] # 0x2080 + - "₁": [T: "subscrito um"] # 0x2081 + - "₂": [T: "subscrito dois"] # 0x2082 + - "₃": [T: "subscrito trĂȘs"] # 0x2083 + - "₄": [T: "subscrito quatro"] # 0x2084 + - "₅": [T: "subscrito cinco"] # 0x2085 + - "₆": [T: "subscrito seis"] # 0x2086 + - "₇": [T: "subscrito sete"] # 0x2087 + - "₈": [T: "subscrito oito"] # 0x2088 + - "₉": [T: "subscrito nove"] # 0x2089 + - "₊": [T: "sinal de mais subscrito"] # 0x208a + - "₋": [T: "sinal de menos subscrito"] # 0x208b + - "₌": [T: "sinal de igual subscrito"] # 0x208c + - "₍": [T: "abre parĂȘnteses subscrito"] # 0x208d + - "₎": [T: "fecha parĂȘnteses subscrito"] # 0x208e + - "ₐ": [T: "subscrito A"] # 0x2090 + - "ₑ": [T: "subscrito E"] # 0x2091 + - "ₒ": [T: "subscrito O"] # 0x2092 + - "ₓ": [T: "subscrito X"] # 0x2093 + - "ₕ": [T: "subscrito H"] # 0x2095 + - "ₖ": [T: "subscrito K"] # 0x2096 + - "ₗ": [T: "subscrito L"] # 0x2097 + - "ₘ": [T: "subscrito M"] # 0x2098 + - "ₙ": [T: "subscrito N"] # 0x2099 + - "ₚ": [T: "subscrito P"] # 0x209a + - "ₛ": [T: "subscrito S"] # 0x209b + - "ₜ": [T: "subscrito T"] # 0x209c + +# ---- Numerais romanos (0x2160-0x217f) ---- + + - "Ⅰ": [T: "um"] # 0x2160 (valor 1) + - "Ⅱ": [T: "dois"] # 0x2161 (valor 2) + - "ⅱ": [T: "trĂȘs"] # 0x2162 (valor 3) + - "Ⅳ": [T: "quatro"] # 0x2163 (valor 4) + - "â…€": [T: "cinco"] # 0x2164 (valor 5) + - "â…„": [T: "seis"] # 0x2165 (valor 6) + - "Ⅹ": [T: "sete"] # 0x2166 (valor 7) + - "Ⅷ": [T: "oito"] # 0x2167 (valor 8) + - "ⅹ": [T: "nove"] # 0x2168 (valor 9) + - "Ⅹ": [T: "dez"] # 0x2169 (valor 10) + - "â…Ș": [T: "onze"] # 0x216a (valor 11) + - "Ⅻ": [T: "doze"] # 0x216b (valor 12) + - "Ⅼ": [T: "cinquenta"] # 0x216c (valor 50) + - "Ⅽ": [T: "cem"] # 0x216d (valor 100) + - "ⅼ": [T: "quinhentos"] # 0x216e (valor 500) + - "Ⅿ": [T: "mil"] # 0x216f (valor 1000) + - "ⅰ": [T: "um"] # 0x2170 (valor 1) + - "ⅱ": [T: "dois"] # 0x2171 (valor 2) + - "â…Č": [T: "trĂȘs"] # 0x2172 (valor 3) + - "ⅳ": [T: "quatro"] # 0x2173 (valor 4) + - "Ⅾ": [T: "cinco"] # 0x2174 (valor 5) + - "â…”": [T: "seis"] # 0x2175 (valor 6) + - "ⅶ": [T: "sete"] # 0x2176 (valor 7) + - "ⅷ": [T: "oito"] # 0x2177 (valor 8) + - "ⅾ": [T: "nove"] # 0x2178 (valor 9) + - "â…č": [T: "dez"] # 0x2179 (valor 10) + - "â…ș": [T: "onze"] # 0x217a (valor 11) + - "ⅻ": [T: "doze"] # 0x217b (valor 12) + - "â…Œ": [T: "cinquenta"] # 0x217c (valor 50) + - "â…œ": [T: "cem"] # 0x217d (valor 100) + - "â…Ÿ": [T: "quinhentos"] # 0x217e (valor 500) + - "ⅿ": [T: "mil"] # 0x217f (valor 1000) + +# ---- Alfabetos matemĂĄticos: fraktur, vazado (double-struck) e caligrĂĄfico ---- +# SĂ­mbolos avulsos do bloco "letterlike" (0x2100-0x214f). + + - "ℊ": [T: "g caligrĂĄfico"] # 0x210a + - "ℯ": [T: "e caligrĂĄfico"] # 0x212f + - "℮": [T: "o caligrĂĄfico"] # 0x2134 + - "ℌ": [T: "pi vazado"] # 0x213c + - "ℜ": [T: "gama vazado"] # 0x213d + - "⅀": [T: "somatĂłrio n-ĂĄrio vazado"] # 0x2140 + + - "ℌℑℹℭ": # 0x210c, 0x2111, 0x2128, 0x212d + - spell: "translate('.', 'ℌℑℹℭ', 'HIZC')" + - t: "fraktur" + + - "â„â„™â„Ÿâ„ż": # 0x210d, 0x2119, 0x213e, 0x213f + - spell: "translate('.', 'â„â„™â„Ÿâ„ż', 'HPΓΠ')" + - T: "vazado" + + - "â„â„’â„˜â„Źâ„°â„±â„ł": # 0x2110, 0x2112, 0x2118, 0x2130, 0x2131, 0x2133 + - spell: "translate('.', 'â„â„’â„˜â„Źâ„°â„±â„ł', 'ILPBEFM')" + - t: "caligrĂĄfico" + +# Blocos alfabĂ©ticos do plano 1 e as cĂłpias na ĂĄrea de uso privado do +# MathType. Chaves e argumentos de translate() copiados byte a byte do en. + + - "𝔄-𝔜": # 0x1d504 - 0x1d51d ('z' version is reserved) + - spell: "translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" + - t: "fraktur" + + - "-": # 0xf000 - 0xf018 + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" + - t: "fraktur" + + - "𝔞-đ”·": # 0x1d51e - 0x1d537 + - spell: "translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz')" + - t: "fraktur" + + - "-ï€ł": # 0xf01a - 0xf033 + - spell: "translate('.', 'ï€šï€›ï€œï€ï€žï€Ÿï€ ï€Ąï€ąï€Łï€€ï€„ï€Šï€§ï€šï€©ï€Șï€«ï€Źï€­ï€źï€Żï€°ï€±ï€Čï€ł', 'abcdefghijklmnopqrstuvwxyz')" + - t: "fraktur" + + - "𝕬-𝖅": # 0x1D56C - 0x1D585 + - spell: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - t: "fraktur" + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + + - "-": # 0xf040 - 0xf059 + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - t: "fraktur" + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + + - "𝖆-𝖟": # 0x1d586 - 0x1d59f + - spell: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" + - t: "fraktur" + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + + - "-ïł": # 0xf05a - 0xf073 + - spell: "translate('.', 'ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§ïšï©ïȘï«ïŹï­ïźïŻï°ï±ïČïł', 'abcdefghijklmnopqrstuvwxyz')" + - t: "fraktur" + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + + - "𝔾-𝕐": # 0x1d504 - 0x1d51d ('z' version is reserved) + - spell: "translate('.', '𝔾đ”čđ”șđ”»đ”Œđ”œđ”Ÿđ”żđ•€đ•đ•‚đ•ƒđ•„đ•…đ•†đ•‡đ•ˆđ•‰đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - T: "vazado" + + - "-": # 0xf080 - 0xf098 + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - T: "vazado" + + - "𝕒-đ•«": # 0x1d552 - 0x1d56b + - spell: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" + - T: "vazado" + + - "-ï‚ł": # 0xf09a - 0xf0b3 + - spell: "translate('.', 'ï‚šï‚›ï‚œï‚ï‚žï‚Ÿï‚ ï‚Ąï‚ąï‚Łï‚€ï‚„ï‚Šï‚§ï‚šï‚©ï‚Șï‚«ï‚Źï‚­ï‚źï‚Żï‚°ï‚±ï‚Čï‚ł', 'abcdefghijklmnopqrstuvwxyz')" + - T: "vazado" + + - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 + - spell: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" + - T: "vazado" + + - "-": # 0xf0c0 - 0xf0c9 + - spell: "translate('.', '', '0123456789')" + - T: "vazado" + + - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 + - spell: "translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - t: "caligrĂĄfico" + + - "-": # 0xf100 - 0xf119 + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - t: "caligrĂĄfico" + + - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf + - spell: "translate('.', 'đ’¶đ’·đ’žđ’čđ’șđ’»đ’Œđ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“„đ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdefghijklmnopqrstuvwxyz')" + - t: "caligrĂĄfico" + + - "-ï„ł": # 0xf11a - 0xf133 + - spell: "translate('.', 'ï„šï„›ï„œï„ï„žï„Ÿï„ ï„Ąï„ąï„Łï„€ï„„ï„Šï„§ï„šï„©ï„Șï„«ï„Źï„­ï„źï„Żï„°ï„±ï„Čï„ł', 'abcdefghijklmnopqrstuvwxyz')" + - t: "caligrĂĄfico" + + - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 + - spell: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - t: "caligrĂĄfico" + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + + - "-": # 0xf140 - 0xf159 + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - t: "caligrĂĄfico" + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + + - "đ“Ș-𝔃": # 0x1d4ea - 0x1d503 + - spell: "translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz')" + - t: "caligrĂĄfico" + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + + - "-ï…ł": # 0xf15a - 0xf173 + - spell: "translate('.', 'ï…šï…›ï…œï…ï…žï…Ÿï… ï…Ąï…ąï…Łï…€ï…„ï…Šï…§ï…šï…©ï…Șï…«ï…Źï…­ï…źï…Żï…°ï…±ï…Čï…ł', 'abcdefghijklmnopqrstuvwxyz')" + - t: "caligrĂĄfico" + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + + - "": [T: "nabla vazado"] # 0xf0ca + - "": [T: "constante de Euler vazada"] # 0xf0cb + +# ---- Rodada 9: caracteres que o corpus real (latex2mathml do ACESSÍLIA) mostrou +# saindo CRUS para o sintetizador. Prioridade pelo dano ao estudante, nĂŁo pelo +# tamanho da lacuna. Ver ACHADOS 9 e TERMINOLOGIA_PT_BR.md. +# +# Letras negrito: \mathbf{x} (vetores em Álgebra Linear) e \boldsymbol{\alpha}. +# Ordem posposta (8.1): "x negrito". Grego negrito passa de novo pela tabela +# e sai com o nome da letra ("alfa negrito"). + - "𝐀-𝐙": # 0x1d400 - 0x1d419 \mathbf maiĂșsculas + - spell: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - "𝐚-𝐳": # 0x1d41a - 0x1d433 \mathbf minĂșsculas + - spell: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - "𝑹-𝒁": # 0x1d468 - 0x1d481 negrito itĂĄlico maiĂșsculas (o en tambĂ©m fala sĂł "bold") + - spell: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - "𝒂-𝒛": # 0x1d482 - 0x1d49b negrito itĂĄlico minĂșsculas + - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - "𝚹-𝛀": # 0x1d6a8 - 0x1d6c0 grego negrito maiĂșsculas + - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - "𝛂-𝛚": # 0x1d6c2 - 0x1d6da grego negrito minĂșsculas + - spell: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙𝛚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - "𝜜-𝜮": # 0x1d71c - 0x1d734 grego negrito itĂĄlico maiĂșsculas (\boldsymbol) + - spell: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳𝜮', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - "đœ¶-𝝎": # 0x1d736 - 0x1d74e grego negrito itĂĄlico minĂșsculas (\boldsymbol) + - spell: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđđŽ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + +# Produto interno ⟹u, v⟩ e as setas longas (reaçÔes quĂ­micas, implicação). + - "⟹": [T: "abre colchete angular"] # 0x27e8 (en: 'left angle bracket') + - "⟩": [T: "fecha colchete angular"] # 0x27e9 + - "âŸȘ": [T: "abre colchete angular duplo"] # 0x27ea + - "⟫": [T: "fecha colchete angular duplo"] # 0x27eb + - "⟔": [T: "seta longa para a esquerda"] # 0x27f5 + - "⟶": [T: "seta longa para a direita"] # 0x27f6 (em quĂ­mica a regra de reação fala "reage formando" antes de chegar aqui) + - "⟷": [T: "seta longa para a esquerda e para a direita"] # 0x27f7 + - "⟾": [T: "seta dupla longa para a esquerda"] # 0x27f8 + - "âŸč": [T: "implica"] # 0x27f9 (en: 'implies') + - "âŸș": [T: "se e somente se"] # 0x27fa (en: 'if and only if') + +# Barra sobre variĂĄvel: \bar{x}, \overline{x}. O motor canonicaliza U+0304 e +# U+203E para U+00AF, entĂŁo a entrada "̄" (com mĂĄcron) do unicode.yaml nunca +# era alcançada em . "x barra" Ă© a leitura corrente (mĂ©dia amostral). + - "ÂŻ": # 0xaf + - test: + if: "ancestor::m:modified-variable and preceding-sibling::*[1][self::m:mi]" + then: [T: "barra"] # (en: 'bar') + else: [T: "linha superior"] # (en: 'line') + +# Sinais "letterlike" que aparecem soltos (fora de unidade, onde definitions.yaml +# jĂĄ resolve): a leitura Ă© a da letra, nĂŁo a do prefixo. + - "”": [T: "mi"] # 0xb5 MICRO SIGN — como letra; "micro" sĂł dentro de unidade + - "℩": [T: "ĂŽmega"] # 0x2126 OHM SIGN — espaço amostral, etc. + - "℧": [T: "mho"] # 0x2127 + - "Å": [T: "angstrom"] # 0xc5 + - "Å": [T: "angstrom"] # 0x212b + + + - "€": [T: "sĂ­mbolo de moeda"] + - "„": [T: "iene"] + - "Š": [T: "barra quebrada"] + - "§": [T: "seção"] + - "©": [T: "direitos autorais"] + - "ÂȘ": [T: "feminino ordinal indicador"] + - "«": [T: "apontando para a esquerda duplo aspas angulares"] + - "ÂČ": [T: "dois"] + - "Âł": [T: "trĂȘs"] + - "Âč": [T: "um"] + - "Âș": [T: "masculino ordinal indicador"] + - "ÂĄ": [T: "ponto invertido de exclamação"] + - "¶": [T: "parĂĄgrafo marca"] + - "Âż": [T: "ponto invertido de interrogação"] + - "ʰ": [T: "modificador pequeno agĂĄ"] + - "ʱ": [T: "modificador pequeno agĂĄ com gancho"] + - "ÊČ": [T: "modificador pequeno jota"] + - "Êł": [T: "modificador pequeno erre"] + - "ÊŽ": [T: "modificador pequeno invertido erre"] + - "Ê”": [T: "modificador pequeno invertido erre com gancho"] + - "ʶ": + - spell: "translate('R', 'R', 'R')" + - T: "modificador pequeno invertido" + - "Ê·": [T: "modificador pequeno w"] + - "Êž": [T: "modificador pequeno y"] + - "Êč": [T: "modificador linha"] + - "Êș": [T: "modificador duplo linha"] + - "Ê»": [T: "modificador invertido vĂ­rgula"] + - "ÊŒ": [T: "modificador apĂłstrofo"] + - "Êœ": [T: "modificador invertido vĂ­rgula"] + - "ÊŸ": [T: "modificador direita metade anel"] + - "Êż": [T: "modificador esquerda metade anel"] + - "ˀ": [T: "modificador oclusiva glotal"] + - "ˁ": [T: "modificador invertido oclusiva glotal"] + - "˂": [T: "modificador esquerda ponta de seta"] + - "˃": [T: "modificador direita ponta de seta"] + - "˄": [T: "modificador cima ponta de seta"] + - "˅": [T: "modificador baixo ponta de seta"] + - "ˆ": [T: "modificador circunflexo acento"] + - "ˇ": [T: "cĂĄron"] + - "ˈ": [T: "modificador barra vertical"] + - "ˉ": [T: "modificador mĂĄcron"] + - "ˊ": [T: "modificador agudo acento"] + - "ˋ": [T: "modificador grave acento"] + - "ˌ": [T: "modificador baixo barra vertical"] + - "ˍ": [T: "modificador baixo mĂĄcron"] + - "ˎ": [T: "modificador baixo grave acento"] + - "ˏ": [T: "modificador baixo agudo acento"] + - "ː": [T: "modificador triangular dois pontos"] + - "ˑ": [T: "modificador metade triangular dois pontos"] + - "˒": [T: "modificador centralizado direita metade anel"] + - "˓": [T: "modificador centralizado esquerda metade anel"] + - "˔": [T: "modificador cima taco"] + - "˕": [T: "modificador baixo taco"] + - "˖": [T: "modificador sinal de mais"] + - "˗": [T: "modificador sinal de menos"] + - "˞": [T: "modificador rĂłtico gancho"] + - "˟": [T: "cruzes modificador acento"] + - "Ë ": [T: "modificador pequeno gama"] + - "ËĄ": [T: "modificador pequeno l"] + - "Ëą": [T: "modificador pequeno esse"] + - "ËŁ": [T: "modificador pequeno xis"] + - "Ë€": [T: "modificador pequeno invertido oclusiva glotal"] + - "Ë„": [T: "modificador extra-alto tom barra"] + - "ËŠ": [T: "modificador alto tom barra"] + - "˧": [T: "modificador mĂ©dio tom barra"] + - "Ëš": [T: "modificador baixo tom barra"] + - "Ë©": [T: "modificador extra-baixo tom barra"] + - "ËȘ": [T: "modificador yin partindo tom marca"] + - "Ë«": [T: "modificador yang partindo tom marca"] + - "ËŹ": [T: "modificador sonorização"] + - "Ë­": [T: "modificador nĂŁo aspirado"] + - "Ëź": [T: "modificador duplo apĂłstrofo"] + - "ËŻ": [T: "modificador baixo baixo ponta de seta"] + - "˰": [T: "modificador baixo cima ponta de seta"] + - "˱": [T: "modificador baixo esquerda ponta de seta"] + - "ËČ": [T: "modificador baixo direita ponta de seta"] + - "Ëł": [T: "modificador baixo anel"] + - "ËŽ": [T: "modificador do meio grave acento"] + - "Ë”": [T: "modificador do meio duplo grave acento"] + - "˶": [T: "modificador do meio duplo agudo acento"] + - "Ë·": [T: "modificador baixo til"] + - "Ëž": [T: "modificador elevado dois pontos"] + - "Ëč": [T: "modificador inĂ­cio alto tom"] + - "Ëș": [T: "modificador fim alto tom"] + - "Ë»": [T: "modificador inĂ­cio baixo tom"] + - "ËŒ": [T: "modificador fim baixo tom"] + - "Ëœ": [T: "modificador prateleira"] + - "ËŸ": [T: "modificador aberto prateleira"] + - "Ëż": [T: "seta modificador baixo para a esquerda"] + - "̉": [T: "gancho acima de"] + - "̊": [T: "anel acima de"] + - "̋": [T: "duplo agudo acento"] + - "̍": [T: "barra vertical acima de"] + - "̎": [T: "barra dupla vertical acima de"] + - "̏": [T: "duplo grave acento"] + - "̐": [T: "candrabindu"] + - "̑": [T: "invertido breve"] + - "̒": [T: "invertido vĂ­rgula acima de"] + - "̓": [T: "vĂ­rgula acima de"] + - "̔": [T: "invertido vĂ­rgula acima de"] + - "̕": [T: "vĂ­rgula acima de direita"] + - "̖": [T: "grave acento abaixo de"] + - "̗": [T: "agudo acento abaixo de"] + - "̘": [T: "taco abaixo de Ă  esquerda"] + - "̙": [T: "taco abaixo de Ă  direita"] + - "̚": [T: "Ăąngulo acima de Ă  esquerda"] + - "̛": [T: "chifre"] + - "̜": [T: "esquerda metade anel abaixo de"] + - "̝": [T: "taco abaixo de para cima"] + - "̞": [T: "taco abaixo de para baixo"] + - "̟": [T: "sinal de mais abaixo de"] + - "Ì ": [T: "sinal de menos abaixo de"] + - "ÌĄ": [T: "palatalizado gancho abaixo de"] + - "Ìą": [T: "retroflexo gancho abaixo de"] + - "ÌŁ": [T: "ponto abaixo de"] + - "Ì€": [T: "trema abaixo de"] + - "Ì„": [T: "anel abaixo de"] + - "ÌŠ": [T: "vĂ­rgula abaixo de"] + - "̧": [T: "cedilha"] + - "Ìš": [T: "ogonek"] + - "Ì©": [T: "barra vertical abaixo de"] + - "ÌȘ": [T: "ponte abaixo de"] + - "Ì«": [T: "arco invertido duplo abaixo de"] + - "ÌŹ": [T: "cĂĄron abaixo de"] + - "Ì­": [T: "circunflexo acento abaixo de"] + - "Ìź": [T: "breve abaixo de"] + - "ÌŻ": [T: "invertido breve abaixo de"] + - "̰": [T: "til abaixo de"] + - "̱": [T: "mĂĄcron abaixo de"] + - "ÌČ": [T: "linha baixa"] + - "Ìł": [T: "linha dupla baixa"] + - "ÌŽ": [T: "til sobreposto"] + - "Ì”": [T: "traço curto sobreposto"] + - "̶": [T: "traço longo sobreposto"] + - "Ì·": [T: "barra curta sobreposto"] + - "Ìž": [T: "barra longa sobreposto"] + - "Ìč": [T: "direita metade anel abaixo de"] + - "Ìș": [T: "ponte invertida abaixo de"] + - "Ì»": [T: "quadrado abaixo de"] + - "ÌŒ": [T: "gaivota abaixo de"] + - "Ìœ": [T: "xis acima de"] + - "ÌŸ": [T: "til vertical"] + - "Ìż": [T: "linha dupla superior"] + - "̀": [T: "grave tom marca"] + - "́": [T: "agudo tom marca"] + - "͆": [T: "ponte acima de"] + - "ÎȘΫϏ": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "maiĂșscula"] + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [spell: "translate('.', 'ÎȘΫϏ', 'Îčυϗ')"] + - T: "com trema" + - "ϊ": [T: "iota com trema"] + - "ϋ": [T: "Ă­psilon com trema"] + - "ό": [T: "ĂŽmicron com tĂŽnico"] + - "ύ": [T: "Ă­psilon com tĂŽnico"] + - "ώ": [T: "ĂŽmega com tĂŽnico"] + - "ϐ": [T: "beta"] + - "ϑ": [T: "teta"] + - "ϒ": [T: "Ă­psilon com gancho"] + - "ϓ": [T: "Ă­psilon com agudo e gancho"] + - "ϔ": [T: "Ă­psilon com trema e gancho"] + - "ϗ": [T: "kai"] + - "Ϙ": [T: "maiĂșscula arcaico copa"] + - "ϙ": [T: "arcaico copa"] + - "А-ĐŻ": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "maiĂșscula"] + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [spell: "translate('.', 'ĐĐ‘Đ’Đ“Đ”Đ•Đ–Đ—Đ˜Đ™ĐšĐ›ĐœĐĐžĐŸĐ ĐĄĐąĐŁĐ€Đ„ĐŠĐ§ĐšĐ©ĐȘЫЏЭПЯ', 'абĐČгЎДжзОĐčĐșĐ»ĐŒĐœĐŸĐżŃ€ŃŃ‚ŃƒŃ„Ń…Ń†Ń‡ŃˆŃ‰ŃŠŃ‹ŃŒŃŃŽŃ')"] + - "а": [T: "a"] + - "б": [T: "ser"] + - "ĐČ": [T: "vĂȘ"] + - "Đł": [T: "guĂȘ"] + - "ĐŽ": [T: "de"] + - "Đ”": [T: "iĂȘ"] + - "ж": [T: "jĂȘ"] + - "Đ·": [T: "zĂȘ"] + - "Đž": [T: "i"] + - "Đč": [T: "curto i"] + - "Đș": [T: "ka"] + - "Đ»": [T: "ele"] + - "ĐŒ": [T: "em"] + - "Đœ": [T: "en"] + - "ĐŸ": [T: "o"] + - "Đż": [T: "pĂȘ"] + - "р": [T: "erre"] + - "с": [T: "esse"] + - "т": [T: "tĂȘ"] + - "у": [T: "u"] + - "ф": [T: "efe"] + - "х": [T: "rrĂĄ"] + - "ц": [T: "tsĂȘ"] + - "ч": [T: "tchĂȘ"] + - "ш": [T: "chĂĄ"] + - "щ": [T: "chtchĂĄ"] + - "ъ": [T: "forte sinal"] + - "ы": [T: "ierĂ­"] + - "ь": [T: "sinal suave"] + - "э": [T: "e"] + - "ю": [T: "iu"] + - "я": [T: "iĂĄ"] + - "ۆ": [T: "arĂĄbico-Ă­ndico raiz cĂșbica"] + - "ۇ": [T: "arĂĄbico-Ă­ndico raiz quarta"] + - "ۈ": [T: "arĂĄbico raio"] + - "‐": [T: "hĂ­fen"] + - "‑": [T: "hĂ­fen"] + - "‒": [T: "algarismo travessĂŁo"] + - "―": [T: "barra horizontal"] + - "†": [T: "adaga"] + - "‡": [T: "duplo adaga"] + - " - ": [t: " "] # RECUO-EN + - "‱": + - test: + if: "@data-chem-formula-op" + then: [T: "ponto"] + else: [T: "marcador"] + - "‰": [T: "por mil"] + - "‱": [T: "por dez mil"] + - "‾": [T: "a o"] + - "â€č": [T: "simples esquerda apontando aspas angulares"] + - "â€ș": [T: "simples direita apontando aspas angulares"] + - "‌": + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "ponto duplo de exclamação"] # 0x203c + else: [T: "duplo fatorial"] # 0x203c + - "⁄": + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "barra grande"] # 0x203c + else: [T: "dividido por"] # 0x203c + - "⁅": [T: "quadrado esquerda colchete com pena"] + - "⁆": [T: "quadrado direita colchete com pena"] + - "※": [T: "marca de referĂȘncia"] + - "‿": [T: "sob laço"] + - "⁀": [T: "laço"] + - "⁎": [T: "baixo asterisco"] + - "⁏": [T: "ponto invertido e vĂ­rgula"] + - "⁐": [T: "fechamento"] + - "⁑": [T: "dois vertical asteriscos"] + - "⁒": [T: "comercial sinal de menos"] + - "⁗": [T: "linha quĂĄdrupla"] + - "⁠": [T: ""] + - "₠": [T: "europeia moeda unidades"] + - "₡": [T: "dois pontos"] + - "₱": [T: "cruzeiro"] + - "₣": [T: "franco"] + - "â‚€": [T: "lira"] + - "â‚„": [T: "mills"] + - "₩": [T: "naira"] + - "₧": [T: "peseta"] + - "₹": [T: "rupias"] + - "₩": [T: "won"] + - "â‚Ș": [T: "novos shequels"] + - "₫": [T: "dong"] + - "€": [T: "euros"] + - "₭": [T: "kip"] + - "₼": [T: "tugrik"] + - "₯": [T: "dracma"] + - "₰": [T: "pfennigs"] + - "₱": [T: "pesos"] + - "â‚Č": [T: "guaranis"] + - "₳": [T: "australes"] + - "₮": [T: "hryvnias"] + - "â‚”": [T: "cedis"] + - "₶": [T: "livre tournois"] + - "₷": [T: "spesmilos"] + - "₾": [T: "tenges"] + - "â‚č": [T: "indiano rupias"] + - "â‚ș": [T: "liras turcas"] + - "⃐": [T: "arpĂŁo para a esquerda acima de"] + - "⃑": [T: "arpĂŁo para a direita acima de"] + - "⃒": [T: "barra longa vertical sobreposto"] + - "⃓": [T: "barra curta vertical sobreposto"] + - "⃔": [T: "seta no sentido anti-horĂĄrio acima de"] + - "⃕": [T: "seta no sentido horĂĄrio acima de"] + - "⃖": [T: "seta para a esquerda acima de"] + - "⃗": [T: "seta para a direita acima de"] + - "⃘": [T: "anel sobreposto"] + - "⃙": [T: "no sentido horĂĄrio anel sobreposto"] + - "⃚": [T: "no sentido anti-horĂĄrio anel sobreposto"] + - "⃝": [T: "cĂ­rculo envolvente"] + - "⃞": [T: "quadrado envolvente"] + - "⃟": [T: "losango envolvente"] + - "⃠": [T: "cĂ­rculo envolvente barra invertida"] + - "⃥": [T: "seta para a esquerda e para a direita acima de"] + - "⃹": [T: "envolvente tela"] + - "⃣": [T: "envolvente tecla"] + - "⃀": [T: "triĂąngulo envolvente para cima apontando"] + - "⃄": [T: "barra invertida sobreposto"] + - "⃊": [T: "traço duplo vertical"] + - "⃧": [T: "anuidade sĂ­mbolo"] + - "⃚": [T: "ponto triplo abaixo"] + - "⃩": [T: "ponte larga acima de"] + - "âƒȘ": [T: "seta para a esquerda sobreposto"] + - "⃫": [T: "barra longa dupla sobreposto"] + - "⃏": [T: "arpĂŁo para a direita com farpa baixo"] + - "⃭": [T: "arpĂŁo para a esquerda com farpa baixo"] + - "⃟": [T: "seta para a esquerda abaixo de"] + - "⃯": [T: "seta para a direita abaixo de"] + - "⃰": [T: "asterisco acima de"] + - "℄": [T: "centro linha sĂ­mbolo"] + - "℅": [T: "aos cuidados de"] + - "℆": [T: "cada uma"] + - "ℇ": [T: "euler'esse constante"] + - "℈": [T: "escrĂșpulos"] + - "ℏ": [T: "agĂĄ barra"] + - "℔": [T: "libras"] + - "№": [T: "nĂșmero"] + - "â„„": [T: "onças"] + - "℩": [T: "invertido iota"] + - "â„Čâ„ș⅁⅂⅃⅄": + - test: + - if: "'.' = 'â„ș'" + then: [T: "rotacionado"] + - else_if: "'.' = 'â„Č'" + then: [T: "invertido"] + - else_if: "'.' = '⅃'" + then: [T: "invertido sem serifa"] + else: [T: "invertido sem serifa"] + - spell: "translate('.', 'â„Čâ„ș⅁⅂⅃⅄', 'FQGLLY')" + - "â„”": [T: "primeiro transfinito cardinal"] + - "ℶ": [T: "segundo transfinito cardinal"] + - "ℷ": [T: "terceiro transfinito cardinal"] + - "ℾ": [T: "quarto transfinito cardinal"] + - "⅋": [T: "invertido e comercial"] + - "⅌": [T: "por"] + - "ⅎ": [T: "invertido efe"] + - "↉": [T: "zero terços"] + - "⌀": [T: "diĂąmetro"] + - "⌁": [T: "seta elĂ©trico"] + - "⌂": [T: "casa"] + - "⌃": [T: "ponta de seta para cima"] + - "⌄": [T: "ponta de seta para baixo"] + - "⌅": [T: "projetivo"] + - "⌆": [T: "perspectiva"] + - "⌇": [T: "linha ondulada"] + - "⌈": [T: "abre teto"] + - "⌉": [T: "fecha teto"] + - "⌊": [T: "abre piso"] + - "⌋": [T: "fecha piso"] + - "⌌": [T: "inferior direita corte"] + - "⌍": [T: "inferior esquerda corte"] + - "⌎": [T: "superior direita corte"] + - "⌏": [T: "superior esquerda corte"] + - "⌐": [T: "invertido nĂŁo sinal"] + - "⌑": [T: "quadrado losango"] + - "⌒": [T: "arco"] + - "⌓": [T: "segmento"] + - "⌔": [T: "setor"] + - "⌕": [T: "telefone gravador"] + - "⌖": [T: "posição indicador mira"] + - "⌗": [T: "quadrado viewdata"] + - "⌘": [T: "lugar de interesse sinal"] + - "⌙": [T: "invertido nĂŁo sinal"] + - "⌚": [T: "relĂłgio"] + - "⌛": [T: "ampulheta"] + - "⌜": [T: "superior esquerda canto"] + - "⌝": [T: "superior direita canto"] + - "⌞": [T: "inferior esquerda canto"] + - "⌟": [T: "inferior direita canto"] + - "⌠": [T: "superior metade integral"] + - "⌡": [T: "inferior metade integral"] + - "⌱": [T: "carranca"] + - "⌣": [T: "sorriso"] + - "⌀": [T: "ponta de seta entre dois barras horizontales para cima"] + - "⌄": [T: "tecla opção"] + - "〈": [T: "apagar Ă  direita"] + - "⌧": [T: "retĂąngulo xis em a caixa"] + - "⌹": [T: "teclado"] + - "〈": [T: "abre colchete apontando Ăąngulo"] + - "âŒȘ": [T: "fecha colchete apontando Ăąngulo"] + - "⌫": [T: "apagar Ă  esquerda"] + - "⌬": [T: "benzeno anel"] + - "⌭": [T: "cilindricidade"] + - "⌼": [T: "tudo ao redor perfil"] + - "⌯": [T: "simetria"] + - "⌰": [T: "total excentricidade"] + - "⌱": [T: "dimensĂŁo origem"] + - "âŒČ": [T: "cone de afunilamento"] + - "⌳": [T: "inclinação"] + - "⌮": [T: "rebaixo"] + - "⌔": [T: "escareado"] + - "⌶": [T: "viga i do apl"] + - "⌜": [T: "cĂ­rculo apl montante"] + - "⌿": [T: "barra do apl com barra sobreposta"] + - "⍰": [T: "desconhecido caixa"] + - "⍌": [T: "seta Ăąngulo com baixo em zigue-zague para a direita"] + - "⎔": [T: "hexĂĄgono"] + - "⎕": [T: "caixa"] + - "⎶": [T: "quadrado inferior colchete sobre superior quadrado colchete"] + - "⏜": [T: "parĂȘntese superior"] + - "⏝": [T: "parĂȘntese inferior"] + - "⏞": [T: "chave superior"] + - "⏟": [T: "chave inferior"] + - "⏠": [T: "concha superior de tartaruga colchete"] + - "⏡": [T: "concha inferior de tartaruga colchete"] + - "⏱": [T: "trapĂ©zio branco"] + - "⏣": [T: "cĂ­rculo benzeno direita com"] + - "⏀": [T: "retilineidade"] + - "⏄": [T: "planicidade"] + - "⏊": + - spell: "ac" + - T: "corrente" + - "⏧": [T: "interseção elĂ©trica"] + - "①-⑹": + - spell: "translate('.', '①⑥⑹④⑀⑄⑊⑧⑚', '123456789')" + - T: "circulado" + - "⑩": [T: "dez circulado"] + - "â‘Ș": [T: "onze circulado"] + - "⑫": [T: "doze circulado"] + - "⑬": [T: "treze circulado"] + - "⑭": [T: "quatorze circulado"] + - "⑼": [T: "quinze circulado"] + - "⑯": [T: "dezesseis circulado"] + - "⑰": [T: "dezessete circulado"] + - "⑱": [T: "dezoito circulado"] + - "⑳": [T: "vinte circulado"] + - "⑮-⑌": + - spell: "translate('.', '⑎⑔⑶⑷⑞â‘čâ‘ș⑻⑌', '123456789')" + - T: "entre parĂȘnteses" + - "⑜": [T: "dez entre parĂȘnteses"] + - "⑟": [T: "onze entre parĂȘnteses"] + - "⑿": [T: "doze entre parĂȘnteses"] + - "⒀": [T: "treze entre parĂȘnteses"] + - "⒁": [T: "quatorze entre parĂȘnteses"] + - "⒂": [T: "quinze entre parĂȘnteses"] + - "⒃": [T: "dezesseis entre parĂȘnteses"] + - "⒄": [T: "dezessete entre parĂȘnteses"] + - "⒅": [T: "dezoito entre parĂȘnteses"] + - "⒆": [T: "dezenove entre parĂȘnteses"] + - "⒇": [T: "vinte entre parĂȘnteses"] + - "⒈-⒐": + - spell: "translate('.', '⒈⒉⒊⒋⒌⒍⒎⒏⒐', '123456789')" + - T: "com ponto" + - "⒑": [T: "dez com ponto final"] + - "⒒": [T: "onze com ponto final"] + - "⒓": [T: "doze com ponto final"] + - "⒔": [T: "treze com ponto final"] + - "⒕": [T: "quatorze com ponto final"] + - "⒖": [T: "quinze com ponto final"] + - "⒗": [T: "dezesseis com ponto final"] + - "⒘": [T: "dezessete com ponto final"] + - "⒙": [T: "dezoito com ponto final"] + - "⒚": [T: "dezenove com ponto final"] + - "⒛": [T: "vinte com ponto final"] + - "⒜-â’”": + - spell: "translate('.', 'â’œâ’â’žâ’Ÿâ’ â’Ąâ’ąâ’Łâ’€â’„â’Šâ’§â’šâ’©â’Șâ’«â’Źâ’­â’źâ’Żâ’°â’±â’Čâ’łâ’Žâ’”', 'abcdefghijklmnopqrstuvwxyz')" + - T: "entre parĂȘnteses" + - "Ⓐ-ⓩ": + - spell: "translate('.', 'â’¶â’·â’žâ’čâ’șâ’»â’Œâ’œâ’Ÿâ’żâ“€â“â“‚â“ƒâ“„â“…â“†â“‡â“ˆâ“‰â“Šâ“‹â“Œâ“â“Žâ“', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - T: "circulado" + - "🅐-đŸ…©": + - spell: "translate('.', 'đŸ…đŸ…‘đŸ…’đŸ…“đŸ…”đŸ…•đŸ…–đŸ…—đŸ…˜đŸ…™đŸ…šđŸ…›đŸ…œđŸ…đŸ…žđŸ…ŸđŸ… đŸ…ĄđŸ…ąđŸ…ŁđŸ…€đŸ…„đŸ…ŠđŸ…§đŸ…šđŸ…©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - T: "circulado preto" + - "ⓐ-ⓩ": + - spell: "translate('.', 'â“â“‘â“’â““â“”â“•â“–â“—â“˜â“™â“šâ“›â“œâ“â“žâ“Ÿâ“ â“Ąâ“ąâ“Łâ“€â“„â“Šâ“§â“šâ“©', 'abcdefghijklmnopqrstuvwxyz')" + - T: "circulado" + - "â“Ș": [T: "zero circulado"] + - "⓫": [T: "onze circulado preto"] + - "⓬": [T: "doze circulado preto"] + - "⓭": [T: "treze circulado preto"] + - "⓼": [T: "quatorze circulado preto"] + - "⓯": [T: "quinze circulado preto"] + - "⓰": [T: "dezesseis circulado preto"] + - "⓱": [T: "dezessete circulado preto"] + - "â“Č": [T: "dezoito circulado preto"] + - "⓳": [T: "dezenove circulado preto"] + - "⓮": [T: "vinte circulado preto"] + - "â“”-ⓜ": + - spell: "translate('.', 'ⓔ⓶⓷ⓞâ“čâ“ș⓻Ⓦⓜ', '123456789')" + - T: "duplo circulado" + - "ⓟ": [T: "dez circulado duas vezes"] + - "⓿": [T: "zero circulado preto"] + - "★": [T: "estrela preta"] + - "☆": [T: "estrela branca"] + - "☉": [T: "sol"] + - "☌": [T: "conjunção"] + - "☒": [T: "cĂ©dula caixa com xis"] + - "☜": [T: "crescente lua"] + - "☟": [T: "minguante lua"] + - "☿": [T: "mercĂșrio"] + - "♀": [T: "feminino"] + - "♁": [T: "terra"] + - "♂": [T: "masculino"] + - "♃": [T: "jĂșpiter"] + - "♄": [T: "saturno"] + - "♅": [T: "urano"] + - "♆": [T: "netuno"] + - "♇": [T: "plutĂŁo"] + - "♈": [T: "ĂĄries"] + - "♉": [T: "touro"] + - "♩": [T: "um quarto nota"] + - "♭": [T: "bemol"] + - "♼": [T: "natural"] + - "♯": [T: "sustenido"] + - "♠": [T: "preto naipe de espadas"] + - "♡": [T: "branco naipe de copas"] + - "♱": [T: "branco naipe de ouros"] + - "♣": [T: "preto naipe de paus"] + - "♀": [T: "branco naipe de espadas"] + - "♄": [T: "preto naipe de copas"] + - "♩": [T: "preto naipe de ouros"] + - "♧": [T: "branco naipe de paus"] + - "⚀": [T: "face de dado 1"] + - "⚁": [T: "face de dado 2"] + - "⚂": [T: "face de dado 3"] + - "⚃": [T: "face de dado 4"] + - "⚄": [T: "face de dado 5"] + - "⚅": [T: "face de dado 6"] + - "⚆": [T: "cĂ­rculo branco com ponto direita"] + - "⚇": [T: "cĂ­rculo branco com dois pontos"] + - "⚈": [T: "cĂ­rculo preto com ponto direita"] + - "⚉": [T: "cĂ­rculo preto com dois pontos"] + - "âšȘ": [T: "cĂ­rculo mĂ©dio branco"] + - "⚫": [T: "cĂ­rculo mĂ©dio preto"] + - "⚬": [T: "cĂ­rculo mĂ©dio pequeno branco"] + - "âšČ": [T: "neutro"] + - "✓": [T: "verificação marca"] + - "✠": [T: "cruzes de malta"] + - "âœȘ": [T: "branco estrela circulado"] + - "✶": [T: "estrela seis pontuda preta"] + - "❚": [T: "mĂ©dio parĂȘnteses ornamento Ă  esquerda"] + - "❩": [T: "mĂ©dio parĂȘnteses ornamento Ă  direita"] + - "âȘ": [T: "mĂ©dio achatado parĂȘnteses ornamento Ă  esquerda"] + - "❫": [T: "mĂ©dio achatado parĂȘnteses ornamento Ă  direita"] + - "❬": [T: "mĂ©dio apontando para a colchete angular ornamento Ă  esquerda"] + - "❭": [T: "mĂ©dio apontando para a colchete angular ornamento Ă  direita"] + - "❼": [T: "grosso apontando para a esquerda aspas angulares ornamento"] + - "❯": [T: "grosso apontando para a direita aspas angulares ornamento"] + - "❰": [T: "grosso apontando para a colchete angular ornamento Ă  esquerda"] + - "❱": [T: "grosso apontando para a colchete angular ornamento Ă  direita"] + - "âČ": [T: "fino concha de tartaruga colchete ornamento Ă  esquerda"] + - "❳": [T: "fino concha de tartaruga colchete ornamento Ă  direita"] + - "❎": [T: "mĂ©dio chave ornamento Ă  esquerda"] + - "❔": [T: "mĂ©dio chave ornamento Ă  direita"] + - "❶": [T: "um circulado preto"] + - "❷": [T: "dois circulado preto"] + - "❞": [T: "trĂȘs circulado preto"] + - "âč": [T: "quatro circulado preto"] + - "âș": [T: "cinco circulado preto"] + - "❻": [T: "seis circulado preto"] + - "❌": [T: "sete circulado preto"] + - "❜": [T: "oito circulado preto"] + - "❟": [T: "nove circulado preto"] + - "❿": [T: "dez circulado preto"] + - "➀": [T: "um circulado sem serifa"] + - "➁": [T: "dois circulado sem serifa"] + - "➂": [T: "trĂȘs circulado sem serifa"] + - "➃": [T: "quatro circulado sem serifa"] + - "➄": [T: "cinco circulado sem serifa"] + - "➅": [T: "seis circulado sem serifa"] + - "➆": [T: "sete circulado sem serifa"] + - "➇": [T: "oito circulado sem serifa"] + - "➈": [T: "nove circulado sem serifa"] + - "➉": [T: "dez circulado sem serifa"] + - "➊": [T: "um circulado preto sem serifa"] + - "➋": [T: "dois circulado preto sem serifa"] + - "➌": [T: "trĂȘs circulado preto sem serifa"] + - "➍": [T: "quatro circulado preto sem serifa"] + - "➎": [T: "cinco circulado preto sem serifa"] + - "➏": [T: "seis circulado preto sem serifa"] + - "➐": [T: "sete circulado preto sem serifa"] + - "➑": [T: "oito circulado preto sem serifa"] + - "➒": [T: "nove circulado preto sem serifa"] + - "➓": [T: "dez circulado preto sem serifa"] + - "➔": [T: "seta grossa de cabeça larga para a direita"] + - "➕": [T: "sinal grosso de mais"] + - "➖": [T: "sinal grosso de menos"] + - "➗": [T: "sinal grosso de divisĂŁo"] + - "➘": [T: "seta grossa para sudeste"] + - "➙": [T: "seta grossa para a direita"] + - "➚": [T: "seta grossa para nordeste"] + - "➛": [T: "seta desenho tĂ©cnico ponto para a direita"] + - "➜": [T: "seta grossa de ponta arredondada para a direita"] + - "➝": [T: "seta de ponta triangular para a direita"] + - "➞": [T: "seta grossa de ponta triangular para a direita"] + - "➟": [T: "seta tracejada de ponta triangular para a direita"] + - "➠": [T: "seta grossa tracejada de ponta triangular para a direita"] + - "➡": [T: "seta preta para a direita"] + - "➱": [T: "seta trĂȘs dĂȘ superior aceso para a direita"] + - "➣": [T: "seta trĂȘs dĂȘ inferior aceso para a direita"] + - "➀": [T: "preto ponta de seta Ă  direita"] + - "➄": [T: "seta grossa preta curva baixo e para a direita"] + - "➊": [T: "seta grossa preta curva cima e para a direita"] + - "➧": [T: "seta achatado preta para a direita"] + - "➚": [T: "seta grossa de ponta cĂŽncava preta para a direita"] + - "➩": [T: "seta sombreado Ă  direita branca para a direita"] + - "âžȘ": [T: "seta sombreado Ă  esquerda branca para a direita"] + - "➫": [T: "seta inclinado para trĂĄs sombreada branca para a direita"] + - "➬": [T: "seta inclinado para a frente sombreada branca para a direita"] + - "➭": [T: "seta grossa inferior com sombra Ă  direita branca para a direita"] + - "➼": [T: "seta grossa superior com sombra Ă  direita branca para a direita"] + - "➯": [T: "seta entalhada inferior com sombra Ă  direita branca para a direita"] + - "➱": [T: "seta entalhada superior com sombra Ă  direita branca para a direita"] + - "âžČ": [T: "grosso branco direita seta circulado"] + - "➳": [T: "seta de pena branca para a direita"] + - "➮": [T: "seta de pena preta para sudeste"] + - "➔": [T: "seta de pena preta para a direita"] + - "➶": [T: "seta de pena preta para nordeste"] + - "➷": [T: "seta grossa de pena preta para sudeste"] + - "➾": [T: "seta grossa de pena preta para a direita"] + - "âžč": [T: "seta grossa de pena preta para nordeste"] + - "âžș": [T: "seta de farpa em gota para a direita"] + - "➻": [T: "seta grossa de haste em gota para a direita"] + - "➌": [T: "seta de cauda em cunha para a direita"] + - "➜": [T: "seta grossa de cauda em cunha para a direita"] + - "➟": [T: "seta de contorno aberto para a direita"] + - "⟀": [T: "trĂȘs dimensional Ăąngulo"] + - "⟁": [T: "triĂąngulo branco contendo pequeno branco triĂąngulo"] + - "⟃": + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "um aberto contido em" + - "⟄": + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] + - T: "um aberto contĂ©m" + - "⟅": [T: "esquerda em forma de s saco delimitador"] + - "⟆": [T: "direita em forma de s saco delimitador"] + - "⟇": [T: "ou com ponto dentro de"] + - "⟈": [T: "barra invertida precedente contido"] + - "⟉": [T: "contendo precedente barra"] + - "⟊": [T: "barra vertical com traço horizontal"] + - "⟋": [T: "matemĂĄtico subindo diagonal"] + - "⟌": [T: "divisĂŁo longa"] + - "⟍": [T: "matemĂĄtico descendo diagonal"] + - "⟎": [T: "e lĂłgico enquadrado"] + - "⟏": [T: "ou lĂłgico enquadrado"] + - "⟐": [T: "losango branco com centralizado ponto"] + - "⟑": [T: "e com ponto"] + - "⟒": [T: "pertence a abrindo cima"] + - "⟓": [T: "inferior direita canto com ponto"] + - "⟔": [T: "superior esquerda canto com ponto"] + - "⟕": [T: "esquerda externo unir"] + - "⟖": [T: "direita externo unir"] + - "⟗": [T: "completo externo unir"] + - "⟘": [T: "grande taco para cima"] + - "⟙": [T: "grande taco para baixo"] + - "⟚": [T: "esquerda e direita catraca dupla"] + - "⟛": [T: "esquerda e taco Ă  direita"] + - "⟜": [T: "esquerda multimapa"] + - "⟝": [T: "longo taco Ă  direita"] + - "⟞": [T: "longo taco Ă  esquerda"] + - "⟟": [T: "cĂ­rculo cima taco com acima de"] + - "⟠": [T: "losango dividido por horizontal rĂ©gua"] + - "⟡": [T: "losango branco cĂŽncavo lateral"] + - "⟱": [T: "losango branco cĂŽncavo lateral com esquerda marca"] + - "⟣": [T: "losango branco cĂŽncavo lateral com direita marca"] + - "⟀": [T: "quadrado branco com esquerda marca"] + - "⟄": [T: "quadrado branco com direita marca"] + - "⟩": [T: "abre colchete branco quadrado"] + - "⟧": [T: "fecha colchete branco quadrado"] + - "⟬": [T: "abre colchete branco concha de tartaruga"] + - "⟭": [T: "fecha colchete branco concha de tartaruga"] + - "⟼": [T: "abre parĂȘntese achatado"] + - "⟯": [T: "fecha parĂȘntese achatado"] + - "⟰": [T: "seta quĂĄdrupla para cima"] + - "⟱": [T: "seta quĂĄdrupla para baixo"] + - "âŸČ": [T: "seta no sentido anti-horĂĄrio com falha cĂ­rculo"] + - "⟳": [T: "seta no sentido horĂĄrio com falha cĂ­rculo"] + - "⟮": [T: "seta para a direita com circulado mais"] + - "⟻": [T: "seta longa para a esquerda a partir de barra"] + - "⟌": [T: "seta longa para a direita a partir de barra"] + - "⟜": [T: "seta longa dupla para a esquerda a partir de barra"] + - "⟟": [T: "seta longa dupla para a direita a partir de barra"] + - "⟿": [T: "seta longa serpenteante para a direita"] + - " ": [T: "seta de duas pontas para a direita com vertical traço"] + - " ": [T: "seta de duas pontas para a direita com duplo vertical traço"] + - " ": [T: "seta dupla para a esquerda com vertical traço"] + - " ": [T: "seta dupla para a direita com vertical traço"] + - " ": [T: "seta dupla para a esquerda e para a direita com vertical traço"] + - " ": [T: "seta de duas pontas para a direita a partir de barra"] + - " ": [T: "seta dupla para a esquerda a partir de barra"] + - " ": [T: "seta dupla para a direita a partir de barra"] + - " ": [T: "seta para baixo com horizontal traço"] + - " ": [T: "seta para cima com horizontal traço"] + - " ": [T: "seta tripla para cima"] + - "​": [T: "seta tripla para baixo"] + - "‌": [T: "seta dupla travessĂŁo para a esquerda"] + - "‍": [T: "seta dupla travessĂŁo para a direita"] + - "‎": [T: "seta de trĂȘs traços para a esquerda"] + - "‏": [T: "seta de trĂȘs traços para a direita"] + - "‐": [T: "seta de duas pontas de trĂȘs traços para a direita"] + - "‑": [T: "seta para a direita com pontilhado haste"] + - "‒": [T: "seta para cima a barra"] + - "–": [T: "seta para baixo a barra"] + - "—": [T: "seta para a direita com cauda e vertical traço"] + - "―": [T: "seta para a direita com cauda e duplo vertical traço"] + - "‖": [T: "seta de duas pontas para a direita com cauda"] + - "‗": [T: "seta de duas pontas para a direita com cauda com vertical traço"] + - "‘": [T: "seta de duas pontas para a direita com cauda com duplo vertical traço"] + - "’": [T: "seta para a esquerda cauda"] + - "‚": [T: "seta para a direita cauda"] + - "‛": [T: "seta dupla para a esquerda cauda"] + - "“": [T: "seta dupla para a direita cauda"] + - "”": [T: "seta para a esquerda a preenchido losango"] + - "„": [T: "seta para a direita a preenchido losango"] + - "‟": [T: "seta para a esquerda a partir de barra a preenchido losango"] + - "†": [T: "seta para a direita a partir de barra a preenchido losango"] + - "‥": [T: "seta e sul leste para noroeste"] + - "‹": [T: "seta e sul oeste para nordeste"] + - "‣": [T: "seta para noroeste com gancho"] + - " ": [T: "seta para nordeste com gancho"] + - " ": [T: "seta para sudeste com gancho"] + - " ": [T: "seta para sudoeste com gancho"] + - "‧": [T: "seta para noroeste e norte leste seta"] + - "‚": [T: "seta para nordeste e sul leste seta"] + - "
": [T: "seta para sudeste e sul oeste seta"] + - "â€Ș": [T: "seta para sudoeste e norte oeste seta"] + - "‫": [T: "subindo diagonal cruzando descendo diagonal"] + - "‏": [T: "descendo diagonal cruzando subindo diagonal"] + - "‭": [T: "seta para sudeste cruzando norte leste seta"] + - "‟": [T: "seta para nordeste cruzando sul leste seta"] + - " ": [T: "seta descendo diagonal cruzando para nordeste"] + - "‰": [T: "seta subindo diagonal cruzando para sudeste"] + - "‱": [T: "seta para nordeste cruzando norte oeste seta"] + - "â€Č": [T: "seta para noroeste cruzando norte leste seta"] + - "″": [T: "seta ondulada apontando diretamente direita"] + - "‎": [T: "seta apontando direita depois curvando cima"] + - "—": [T: "seta apontando direita depois curvando baixo"] + - "‶": [T: "seta apontando baixo depois curvando esquerda"] + - "‷": [T: "seta apontando baixo depois curvando direita"] + - "„": [T: "seta lado arco no sentido horĂĄrio para a direita"] + - "â€č": [T: "seta lado arco no sentido anti-horĂĄrio para a esquerda"] + - "â€ș": [T: "seta superior arco no sentido anti-horĂĄrio"] + - "※": [T: "seta inferior arco no sentido anti-horĂĄrio"] + - "‌": [T: "seta superior arco no sentido horĂĄrio com menos"] + - "“": [T: "seta superior arco no sentido anti-horĂĄrio com mais"] + - "‟": [T: "seta inferior semicircular no sentido horĂĄrio para a direita"] + - "‿": [T: "seta inferior semicircular no sentido anti-horĂĄrio para a esquerda"] + - "â„€": [T: "seta no sentido anti-horĂĄrio fechada cĂ­rculo"] + - "℁": [T: "seta no sentido horĂĄrio fechada cĂ­rculo"] + - "â„‚": [T: "seta para a direita acima de curto esquerda seta"] + - "℃": [T: "seta para a esquerda acima de curto direita seta"] + - "â„„": [T: "seta curta para a direita acima de esquerda seta"] + - "â„…": [T: "seta para a direita com mais abaixo de"] + - "℆": [T: "seta para a esquerda com mais abaixo de"] + - "ℇ": [T: "seta para a direita atravessado por xis"] + - "℈": [T: "seta para a esquerda e para a direita atravessado por cĂ­rculo"] + - "℉": [T: "seta de duas pontas para cima a partir de cĂ­rculo"] + - "ℊ": [T: "arpĂŁo farpa cima direita farpa baixo para a esquerda"] + - "â„‹": [T: "arpĂŁo farpa baixo direita farpa cima para a esquerda"] + - "ℌ": [T: "arpĂŁo cima farpa direita baixo farpa para a esquerda"] + - "ℍ": [T: "arpĂŁo cima farpa baixo farpa direita para a esquerda"] + - "ℎ": [T: "arpĂŁo farpa cima direita farpa cima para a esquerda"] + - "ℏ": [T: "arpĂŁo cima farpa baixo farpa direita para a direita"] + - "ℐ": [T: "arpĂŁo farpa baixo direita farpa baixo para a esquerda"] + - "â„‘": [T: "arpĂŁo cima farpa baixo farpa esquerda para a esquerda"] + - "â„’": [T: "arpĂŁo para a esquerda com farpa cima a barra"] + - "â„“": [T: "arpĂŁo para a direita com farpa cima a barra"] + - "â„”": [T: "arpĂŁo para cima com farpa direita a barra"] + - "â„•": [T: "arpĂŁo para baixo com farpa direita a barra"] + - "â„–": [T: "arpĂŁo para a esquerda com farpa baixo a barra"] + - "â„—": [T: "arpĂŁo para a direita com farpa baixo a barra"] + - "℘": [T: "arpĂŁo para cima com farpa esquerda a barra"] + - "â„™": [T: "arpĂŁo para baixo com farpa esquerda a barra"] + - "ℚ": [T: "arpĂŁo para a esquerda com farpa cima a partir de barra"] + - "â„›": [T: "arpĂŁo para a direita com farpa cima a partir de barra"] + - "ℜ": [T: "arpĂŁo para cima com farpa direita a partir de barra"] + - "ℝ": [T: "arpĂŁo para baixo com farpa direita a partir de barra"] + - "℞": [T: "arpĂŁo para a esquerda com farpa baixo a partir de barra"] + - "℟": [T: "arpĂŁo para a direita com farpa baixo a partir de barra"] + - "â„ ": [T: "arpĂŁo para cima com farpa esquerda a partir de barra"] + - "℥": [T: "arpĂŁo para baixo com farpa esquerda a partir de barra"] + - "ℹ": [T: "arpĂŁo para a esquerda com farpa cima acima de esquerda arpĂŁo com farpa baixo"] + - "℣": [T: "arpĂŁo para cima com farpa esquerda ao lado de cima arpĂŁo com farpa direita"] + - "â„€": [T: "arpĂŁo para a direita com farpa cima acima de direita arpĂŁo com farpa baixo"] + - "â„„": [T: "arpĂŁo para baixo com farpa esquerda ao lado de baixo arpĂŁo com farpa direita"] + - "ℊ": [T: "arpĂŁo para a esquerda com farpa cima acima de direita arpĂŁo com farpa cima"] + - "â„§": [T: "arpĂŁo para a esquerda com farpa baixo acima de direita arpĂŁo com farpa baixo"] + - "ℚ": [T: "arpĂŁo para a direita com farpa cima acima de esquerda arpĂŁo com farpa cima"] + - "â„©": [T: "arpĂŁo para a direita com farpa baixo acima de esquerda arpĂŁo com farpa baixo"] + - "â„Ș": [T: "arpĂŁo para a esquerda com farpa cima acima de longo travessĂŁo"] + - "â„«": [T: "arpĂŁo para a esquerda com farpa baixo abaixo de longo travessĂŁo"] + - "ℏ": [T: "arpĂŁo para a direita com farpa cima acima de longo travessĂŁo"] + - "â„­": [T: "arpĂŁo para a direita com farpa baixo abaixo de longo travessĂŁo"] + - "℟": [T: "arpĂŁo para cima com farpa esquerda ao lado de baixo arpĂŁo com farpa direita"] + - "ℯ": [T: "arpĂŁo para baixo com farpa esquerda ao lado de cima arpĂŁo com farpa direita"] + - "â„°": [T: "seta dupla para a direita com ponta arredondada"] + - "ℱ": [T: "seta igual acima de para a direita"] + - "â„Č": [T: "seta til operador acima de para a direita"] + - "ℳ": [T: "seta para a esquerda acima de operador til"] + - "ℎ": [T: "seta para a direita acima de operador til"] + - "â„”": [T: "seta para a direita acima de quase igual a"] + - "â„¶": [T: "seta menor que acima de para a esquerda"] + - "â„·": [T: "seta para a esquerda atravessado por menor que"] + - "℞": [T: "seta maior que acima de para a direita"] + - "â„č": [T: "seta contido acima de para a direita"] + - "â„ș": [T: "seta para a esquerda atravessado por contido"] + - "â„»": [T: "seta contendo acima de para a esquerda"] + - "ℌ": [T: "esquerda peixe cauda"] + - "ℜ": [T: "direita peixe cauda"] + - "℟": [T: "cima peixe cauda"] + - "ℿ": [T: "baixo peixe cauda"] + - "⩀": [T: "barra tripla vertical delimitador"] + - "⊁": [T: "da notação z ponto"] + - "⩂": [T: "da notação z tipo dois pontos"] + - "⊃": [T: "abre chave branca"] + - "⩄": [T: "fecha chave branca"] + - "⩅": [T: "abre parĂȘntese branco"] + - "⩆": [T: "fecha parĂȘntese branco"] + - "⩇": [T: "da notação z esquerda imagem colchete"] + - "⊈": [T: "da notação z direita imagem colchete"] + - "⩉": [T: "da notação z esquerda vinculação colchete"] + - "⩊": [T: "da notação z direita vinculação colchete"] + - "⩋": [T: "quadrado esquerda colchete com barra inferior"] + - "⩌": [T: "quadrado direita colchete com barra inferior"] + - "⊍": [T: "quadrado esquerda colchete com marca em superior canto"] + - "⊎": [T: "quadrado direita colchete com marca em inferior canto"] + - "⊏": [T: "quadrado esquerda colchete com marca em inferior canto"] + - "⊐": [T: "quadrado direita colchete com marca em superior canto"] + - "⩑": [T: "colchete angular com ponto Ă  esquerda"] + - "⩒": [T: "colchete angular com ponto Ă  direita"] + - "⩓": [T: "abre colchete arco menor que"] + - "⩔": [T: "fecha colchete arco maior que"] + - "⩕": [T: "arco duplo esquerda maior que colchete"] + - "⩖": [T: "arco duplo direita menor que colchete"] + - "⩗": [T: "abre colchete preto concha de tartaruga"] + - "⊘": [T: "fecha colchete preto concha de tartaruga"] + - "⩙": [T: "cerca pontilhada"] + - "⩚": [T: "linha vertical em zigue-zague"] + - "⩛": [T: "medido Ăąngulo abrindo esquerda"] + - "⩜": [T: "quadrado direita Ăąngulo variante com"] + - "⊝": [T: "medido Ăąngulo com ponto Ă  direita"] + - "⊞": [T: "Ăąngulo com esse dentro de"] + - "⩟": [T: "agudo Ăąngulo"] + - "⊠": [T: "Ăąngulo esfĂ©rico abrindo esquerda"] + - "⊥": [T: "Ăąngulo esfĂ©rico abrindo cima"] + - "⊹": [T: "Ăąngulo invertido"] + - "⊣": [T: "Ăąngulo invertido"] + - "⊀": [T: "Ăąngulo com barra inferior"] + - "⊄": [T: "Ăąngulo invertido com barra inferior"] + - "⊊": [T: "Ăąngulo oblĂ­quo abrindo cima"] + - "⊧": [T: "Ăąngulo oblĂ­quo abrindo baixo"] + - "⊚": [T: "seta medido Ăąngulo com aberta braço terminando em apontando cima e Ă  direita"] + - "⊩": [T: "seta medido Ăąngulo com aberta braço terminando em apontando cima e Ă  esquerda"] + - "âŠȘ": [T: "seta medido Ăąngulo com aberta braço terminando em apontando baixo e Ă  direita"] + - "⊫": [T: "seta medido Ăąngulo com aberta braço terminando em apontando baixo e Ă  esquerda"] + - "⊏": [T: "seta medido Ăąngulo com aberta braço terminando em apontando direita e cima"] + - "⊭": [T: "seta medido Ăąngulo com aberta braço terminando em apontando esquerda e cima"] + - "⊟": [T: "seta medido Ăąngulo com aberta braço terminando em apontando direita e baixo"] + - "⊯": [T: "seta medido Ăąngulo com aberta braço terminando em apontando esquerda e baixo"] + - "⊰": [T: "conjunto invertido vazio"] + - "⊱": [T: "conjunto vazio com barra superior"] + - "âŠČ": [T: "cĂ­rculo vazio conjunto com pequeno acima de"] + - "⊳": [T: "seta vazio conjunto com para a direita acima de"] + - "⊎": [T: "seta vazio conjunto com para a esquerda acima de"] + - "⊔": [T: "cĂ­rculo com barra horizontal"] + - "⊶": [T: "barra vertical circulado"] + - "⊷": [T: "paralelo circulado"] + - "⊞": [T: "invertido barra circulado"] + - "âŠč": [T: "perpendicular circulado"] + - "âŠș": [T: "dividido por barra horizontal e superior metade dividido por barra vertical circulado"] + - "⊻": [T: "cĂ­rculo com sobreposto xis"] + - "⊌": [T: "no sentido anti-horĂĄrio rotacionado sinal de divisĂŁo circulado"] + - "⊜": [T: "seta para cima atravessado por cĂ­rculo"] + - "⊟": [T: "branco marcador circulado"] + - "⊿": [T: "marcador circulado"] + - "⧀": [T: "menor que circulado"] + - "⧁": [T: "maior que circulado"] + - "⧂": [T: "cĂ­rculo com pequeno cĂ­rculo Ă  direita"] + - "⧃": [T: "cĂ­rculo com dois horizontal traços Ă  direita"] + - "⧄": [T: "subindo diagonal barra enquadrado"] + - "⧅": [T: "descendo diagonal barra enquadrado"] + - "⧆": [T: "asterisco enquadrado"] + - "⧇": [T: "pequeno cĂ­rculo enquadrado"] + - "⧈": [T: "quadrado enquadrado"] + - "⧉": [T: "quadrados dois unido"] + - "⧊": [T: "triĂąngulo com ponto acima de"] + - "⧋": [T: "triĂąngulo com barra inferior"] + - "⧌": [T: "triĂąngulo esse em"] + - "⧍": [T: "triĂąngulo com serifas em inferior"] + - "⧎": [T: "triĂąngulo direita acima de esquerda triĂąngulo"] + - "⧏": [T: "triĂąngulo esquerda ao lado de barra vertical"] + - "⧐": [T: "triĂąngulo vertical barra ao lado de direita"] + - "⧑": [T: "laço com esquerda metade preto"] + - "⧒": [T: "laço com direita metade preto"] + - "⧓": [T: "laço preto"] + - "⧔": [T: "vezes com esquerda metade preto"] + - "⧕": [T: "vezes com direita metade preto"] + - "⧖": [T: "ampulheta branco"] + - "⧗": [T: "ampulheta preto"] + - "⧘": [T: "abre cerca ondulada"] + - "⧙": [T: "fecha cerca ondulada"] + - "⧚": [T: "abre cerca dupla ondulada"] + - "⧛": [T: "fecha cerca dupla ondulada"] + - "⧜": [T: "incompleto infinito"] + - "⧝": [T: "laço sobre infinito"] + - "⧞": [T: "infinito negado com barra vertical"] + - "⧟": [T: "de duas pontas multimapa"] + - "â§ ": [T: "quadrado com contornado contorno"] + - "â§Ą": [T: "aumenta como"] + - "â§ą": [T: "embaralhamento produto"] + - "â§Ł": [T: "sinal de igual e inclinado paralelo"] + - "â§€": [T: "sinal de igual e inclinado paralelo com til acima de"] + - "â§„": [T: "idĂȘntico a e inclinado paralelo"] + - "â§Š": [T: "igualmente forte"] + - "â§§": [T: "termodinĂąmico"] + - "â§š": [T: "triĂąngulo baixo apontando com esquerda metade preto"] + - "â§©": [T: "triĂąngulo baixo apontando com direita metade preto"] + - "â§Ș": [T: "seta preta losango com para baixo"] + - "â§«": [T: "losango preto"] + - "â§Ź": [T: "seta branca cĂ­rculo com para baixo"] + - "â§­": [T: "seta preta cĂ­rculo com para baixo"] + - "â§ź": [T: "quadrado com barra de erro branco"] + - "â§Ż": [T: "quadrado com barra de erro preto"] + - "â§°": [T: "losango com barra de erro branco"] + - "â§±": [T: "losango com barra de erro preto"] + - "â§Č": [T: "cĂ­rculo com barra de erro branco"] + - "â§ł": [T: "cĂ­rculo com barra de erro preto"] + - "â§Ž": [T: "regra atrasada"] + - "â§”": [T: "barra invertida operador"] + - "â§¶": [T: "barra com barra superior"] + - "â§·": [T: "barra invertida com traço horizontal"] + - "â§ž": [T: "barra grande"] + - "â§č": [T: "barra grande invertida"] + - "â§ș": [T: "duplo mais"] + - "â§»": [T: "triplo mais"] + - "â§Œ": [T: "abre colchete apontando curvo Ăąngulo"] + - "â§œ": [T: "fecha colchete apontando curvo Ăąngulo"] + - "â§Ÿ": [T: "minĂșsculo"] + - "â§ż": [T: "miny"] + - "⹀": [T: "ponto circulado"] + - "⚁": [T: "mais operador circulado"] + - "⹂": [T: "vezes operador circulado"] + - "⚃": [T: "uniĂŁo operador com ponto"] + - "⹄": [T: "uniĂŁo operador com mais"] + - "⹅": [T: "quadrado interseção operador"] + - "⹆": [T: "quadrado uniĂŁo operador"] + - "⹇": [T: "dois e lĂłgico operador"] + - "⚈": [T: "dois ou lĂłgico operador"] + - "⹉": [T: "vezes operador"] + - "⹊": [T: "mĂłdulo dois soma"] + - "⹋": [T: "somatĂłrio com integral"] + - "⹌": [T: "integral quĂĄdrupla operador"] + - "⚍": [T: "integral de parte finita"] + - "⚎": [T: "integral com traço duplo"] + - "⚏": [T: "integral mĂ©dia com barra"] + - "⚐": [T: "circulação função"] + - "⹑": [T: "no sentido anti-horĂĄrio integração"] + - "⹒": [T: "linha integração com retangular caminho ao redor polo"] + - "⹓": [T: "linha integração com semicircular caminho ao redor polo"] + - "⹔": [T: "linha integração nĂŁo incluindo o polo"] + - "⹕": [T: "integral ao redor a ponto operador"] + - "⹖": [T: "quatĂ©rnio integral operador"] + - "⹗": [T: "seta integral com para a esquerda com gancho"] + - "⚘": [T: "integral com vezes sinal"] + - "⹙": [T: "integral com interseção"] + - "⹚": [T: "integral com uniĂŁo"] + - "⹛": [T: "integral com barra superior"] + - "⹜": [T: "integral com barra inferior"] + - "⚝": [T: "unir"] + - "⚞": [T: "triĂąngulo grande esquerda operador"] + - "⹟": [T: "da notação z esquema composição"] + - "âš ": [T: "da notação z esquema encanamento"] + - "⚥": [T: "da notação z esquema projeção"] + - "âšą": [T: "cĂ­rculo mais sinal com acima de"] + - "⚣": [T: "sinal de mais com circunflexo acento acima de"] + - "⚀": [T: "sinal de mais com til acima de"] + - "âš„": [T: "sinal de mais com ponto abaixo de"] + - "⚊": [T: "sinal de mais com til abaixo de"] + - "âš§": [T: "sinal de mais com subscrito dois"] + - "âšš": [T: "triĂąngulo mais sinal com preto"] + - "âš©": [T: "sinal de menos com vĂ­rgula acima de"] + - "âšȘ": [T: "sinal de menos com ponto abaixo de"] + - "âš«": [T: "sinal de menos com descendo pontos"] + - "⚏": [T: "sinal de menos com subindo pontos"] + - "âš­": [T: "cĂ­rculo mais sinal em esquerda metade"] + - "âšź": [T: "cĂ­rculo mais sinal em direita metade"] + - "⚯": + - test: + if: "$Verbosity='Terse'" + then: [T: "cruzes"] + else: [T: "cruzes produto"] + - "âš°": [T: "sinal de multiplicação com ponto acima de"] + - "âš±": [T: "sinal de multiplicação com barra inferior"] + - "âšČ": [T: "produto semidireto com inferior fechado"] + - "âšł": [T: "produto esmagado"] + - "⚎": [T: "cĂ­rculo multiplicação sinal em esquerda metade"] + - "âš”": [T: "cĂ­rculo multiplicação sinal em direita metade"] + - "âš¶": [T: "sinal de multiplicação com circunflexo acento circulado"] + - "âš·": [T: "cĂ­rculo multiplicação sinal em duplo"] + - "âšž": [T: "sinal de divisĂŁo circulado"] + - "âšč": [T: "triĂąngulo mais sinal em"] + - "âšș": [T: "triĂąngulo menos sinal em"] + - "âš»": [T: "triĂąngulo multiplicação sinal em"] + - "⚌": [T: "interior produto"] + - "âšœ": [T: "Ă  direita interior produto"] + - "⚟": [T: "da notação z relacional composição"] + - "âšż": [T: "amĂĄlgama ou coproduto"] + - "⩀": [T: "interseção com ponto"] + - "⩁": [T: "uniĂŁo com sinal de menos"] + - "⩂": [T: "uniĂŁo com barra superior"] + - "⩃": [T: "interseção com barra superior"] + - "⩄": [T: "interseção com e lĂłgico"] + - "⩅": [T: "uniĂŁo com ou lĂłgico"] + - "⩆": [T: "uniĂŁo acima de interseção"] + - "⩇": [T: "interseção acima de uniĂŁo"] + - "⩈": [T: "uniĂŁo acima de barra acima de interseção"] + - "⩉": [T: "interseção acima de barra acima de uniĂŁo"] + - "⩊": [T: "uniĂŁo ao lado de e unido com uniĂŁo"] + - "⩋": [T: "interseção ao lado de e unido com interseção"] + - "⩌": [T: "uniĂŁo fechada com serifas"] + - "⩍": [T: "interseção fechada com serifas"] + - "⩎": [T: "quadrado duplo interseção"] + - "⩏": [T: "quadrado duplo uniĂŁo"] + - "⩐": [T: "uniĂŁo fechada com serifas e produto esmagado"] + - "⩑": [T: "e lĂłgico com ponto acima de"] + - "⩒": [T: "ou lĂłgico com ponto acima de"] + - "⩓": [T: "duplo e lĂłgico"] + - "⩔": [T: "duplo ou lĂłgico"] + - "⩕": [T: "dois cruzando e lĂłgico"] + - "⩖": [T: "dois cruzando ou lĂłgico"] + - "⩗": [T: "inclinado grande ou"] + - "⩘": [T: "inclinado grande e"] + - "⩙": [T: "ou lĂłgico sobreposto e lĂłgico"] + - "⩚": [T: "e lĂłgico com do meio haste"] + - "⩛": [T: "ou lĂłgico com do meio haste"] + - "⩜": [T: "e lĂłgico com horizontal travessĂŁo"] + - "⩝": [T: "ou lĂłgico com horizontal travessĂŁo"] + - "⩞": [T: "e lĂłgico com barra dupla superior"] + - "⩟": [T: "e lĂłgico com barra inferior"] + - "â© ": [T: "e lĂłgico com barra dupla inferior"] + - "⩥": [T: "pequeno vĂȘ com barra inferior"] + - "⩹": [T: "ou lĂłgico com barra dupla superior"] + - "⩣": [T: "ou lĂłgico com barra dupla inferior"] + - "â©€": [T: "da notação z domĂ­nio antirrestrição"] + - "â©„": [T: "da notação z imagem antirrestrição"] + - "⩊": [T: "sinal de igual com ponto abaixo de"] + - "â©§": [T: "idĂȘntico com ponto acima de"] + - "⩚": [T: "barra tripla horizontal com traço duplo vertical"] + - "â©©": [T: "barra tripla horizontal com traço triplo vertical"] + - "â©Ș": [T: "operador til com ponto acima de"] + - "â©«": [T: "operador til com subindo pontos"] + - "⩏": [T: "semelhante menos semelhante"] + - "â©­": [T: "congruente com ponto acima de"] + - "⩟": [T: "igual com asterisco"] + - "⩯": [T: "quase igual a com circunflexo acento"] + - "â©°": [T: "aproximadamente igual a ou igual a"] + - "⩱": [T: "sinal de igual acima de sinal de mais"] + - "â©Č": [T: "sinal de mais acima de sinal de igual"] + - "⩳": [T: "sinal de igual acima de operador til"] + - "⩎": [T: "duplo dois pontos igual"] + - "â©”": [T: "dois consecutivo igual sinais"] + - "â©¶": [T: "trĂȘs consecutivo igual sinais"] + - "â©·": [T: "sinal de igual com dois pontos acima de e dois pontos abaixo de"] + - "⩞": [T: "equivalente com quatro pontos acima de"] + - "â©č": [T: "cĂ­rculo menor que com dentro de"] + - "â©ș": [T: "cĂ­rculo maior que com dentro de"] + - "â©»": [T: "menor que com ponto de interrogação acima de"] + - "⩌": [T: "maior que com ponto de interrogação acima de"] + - "⩜": [T: "menor que ou inclinado igual a"] + - "⩟": [T: "maior que ou inclinado igual a"] + - "⩿": [T: "menor que ou inclinado igual a com ponto dentro de"] + - "âȘ€": [T: "maior que ou inclinado igual a com ponto dentro de"] + - "âȘ": [T: "menor que ou inclinado igual a com ponto acima de"] + - "âȘ‚": [T: "maior que ou inclinado igual a com ponto acima de"] + - "âȘƒ": [T: "menor que ou inclinado igual a com ponto acima de direita"] + - "âȘ„": [T: "maior que ou inclinado igual a com ponto acima de esquerda"] + - "âȘ…": [T: "menor que ou aproximado"] + - "âȘ†": [T: "maior que ou aproximado"] + - "âȘ‡": [T: "menor que e linha simples nĂŁo igual a"] + - "âȘˆ": [T: "maior que e linha simples nĂŁo igual a"] + - "âȘ‰": [T: "menor que e nĂŁo aproximado"] + - "âȘŠ": [T: "maior que e nĂŁo aproximado"] + - "âȘ‹": [T: "menor que acima de linha dupla igual acima de maior que"] + - "âȘŒ": [T: "maior que acima de linha dupla igual acima de menor que"] + - "âȘ": [T: "menor que acima de semelhante ou igual"] + - "âȘŽ": [T: "maior que acima de semelhante ou igual"] + - "âȘ": [T: "menor que acima de semelhante acima de maior que"] + - "âȘ": [T: "maior que acima de semelhante acima de menor que"] + - "âȘ‘": [T: "menor que acima de maior que acima de linha dupla igual"] + - "âȘ’": [T: "maior que acima de menor que acima de linha dupla igual"] + - "âȘ“": [T: "menor que acima de inclinado igual acima de maior que acima de inclinado igual"] + - "âȘ”": [T: "maior que acima de inclinado igual acima de menor que acima de inclinado igual"] + - "âȘ•": [T: "inclinado igual a ou menor que"] + - "âȘ–": [T: "inclinado igual a ou maior que"] + - "âȘ—": [T: "inclinado igual a ou menor que com ponto dentro de"] + - "âȘ˜": [T: "inclinado igual a ou maior que com ponto dentro de"] + - "âȘ™": [T: "linha dupla igual a ou menor que"] + - "âȘš": [T: "linha dupla igual a ou maior que"] + - "âȘ›": [T: "linha dupla inclinado igual a ou menor que"] + - "âȘœ": [T: "linha dupla inclinado igual a ou maior que"] + - "âȘ": [T: "semelhante ou menor que"] + - "âȘž": [T: "semelhante ou maior que"] + - "âȘŸ": [T: "semelhante acima de menor que acima de sinal de igual"] + - "âȘ ": [T: "semelhante acima de maior que acima de sinal de igual"] + - "âȘĄ": [T: "duplo aninhado menor que"] + - "âȘą": [T: "duplo aninhado maior que"] + - "âȘŁ": [T: "duplo aninhado menor que com barra inferior"] + - "âȘ€": [T: "maior que sobreposto menor que"] + - "âȘ„": [T: "maior que ao lado de menor que"] + - "âȘŠ": [T: "menor que fechado por curva"] + - "âȘ§": [T: "maior que fechado por curva"] + - "âȘš": [T: "menor que fechado por curva acima de inclinado igual"] + - "âȘ©": [T: "maior que fechado por curva acima de inclinado igual"] + - "âȘȘ": [T: "menor que"] + - "âȘ«": [T: "maior que"] + - "âȘŹ": [T: "menor que ou igual a"] + - "âȘ­": [T: "maior que ou igual a"] + - "âȘź": [T: "sinal de igual com irregular acima de"] + - "âȘŻ": [T: "precede acima de linha simples sinal de igual"] + - "âȘ°": [T: "sucede acima de linha simples sinal de igual"] + - "âȘ±": [T: "precede acima de linha simples nĂŁo igual a"] + - "âȘČ": [T: "sucede acima de linha simples nĂŁo igual a"] + - "âȘł": [T: "precede acima de sinal de igual"] + - "âȘŽ": [T: "sucede acima de sinal de igual"] + - "âȘ”": [T: "precede acima de nĂŁo igual a"] + - "âȘ¶": [T: "sucede acima de nĂŁo igual a"] + - "âȘ·": [T: "precede acima de quase igual a"] + - "âȘž": [T: "sucede acima de quase igual a"] + - "âȘč": [T: "precede acima de nĂŁo quase igual a"] + - "âȘș": [T: "sucede acima de nĂŁo quase igual a"] + - "âȘ»": [T: "duplo precede"] + - "âȘŒ": [T: "duplo sucede"] + - "âȘœ": [T: "contido com ponto"] + - "âȘŸ": [T: "contendo com ponto"] + - "âȘż": [T: "contido com sinal de mais abaixo de"] + - "⫀": [T: "contendo com sinal de mais abaixo de"] + - "⫁": [T: "contido com sinal de multiplicação abaixo de"] + - "⫂": [T: "contendo com sinal de multiplicação abaixo de"] + - "⫃": [T: "contido em ou igual a com ponto acima de"] + - "⫄": [T: "contĂ©m ou igual a com ponto acima de"] + - "⫅": [T: "contido em acima de sinal de igual"] + - "⫆": [T: "contĂ©m acima de sinal de igual"] + - "⫇": [T: "contido em acima de operador til"] + - "⫈": [T: "contĂ©m acima de operador til"] + - "⫉": [T: "contido em acima de quase igual a"] + - "⫊": [T: "contĂ©m acima de quase igual a"] + - "⫋": [T: "contido acima de nĂŁo igual a"] + - "⫌": [T: "contĂ©m acima de nĂŁo igual a"] + - "⫍": [T: "quadrado esquerda aberto caixa operador"] + - "⫎": [T: "quadrado direita aberto caixa operador"] + - "⫏": [T: "fechado contido"] + - "⫐": [T: "fechado contendo"] + - "⫑": [T: "fechado contido ou igual a"] + - "⫒": [T: "fechado contendo ou igual a"] + - "⫓": [T: "contido acima de contendo"] + - "⫔": [T: "contendo acima de contido"] + - "⫕": [T: "contido acima de contido"] + - "⫖": [T: "contendo acima de contendo"] + - "⫗": [T: "contendo ao lado de contido"] + - "⫘": [T: "contendo ao lado de e unido por travessĂŁo com contido"] + - "⫙": [T: "pertence a abrindo baixo"] + - "⫚": [T: "forcado com t superior"] + - "⫛": [T: "interseção transversal"] + - "⫝̸": [T: "bifurcando"] + - "⫝": [T: "nĂŁo bifurcante"] + - "⫞": [T: "curto taco Ă  esquerda"] + - "⫟": [T: "curto taco para baixo"] + - "â« ": [T: "curto taco para cima"] + - "⫥": [T: "perpendicular com esse"] + - "⫹": [T: "barra vertical triplo catraca Ă  direita"] + - "⫣": [T: "barra dupla vertical catraca Ă  esquerda"] + - "â«€": [T: "barra vertical duplo catraca Ă  esquerda"] + - "â«„": [T: "barra dupla vertical duplo catraca Ă  esquerda"] + - "⫊": [T: "longo travessĂŁo a partir de esquerda membro de duplo vertical"] + - "â«§": [T: "curto taco com barra superior para baixo"] + - "⫚": [T: "curto taco com barra inferior para cima"] + - "â«©": [T: "curto taco acima de curto taco para baixo para cima"] + - "â«Ș": [T: "duplo taco para baixo"] + - "â««": [T: "duplo taco para cima"] + - "⫏": [T: "traço duplo nĂŁo sinal"] + - "â«­": [T: "traço invertido duplo nĂŁo sinal"] + - "⫟": [T: "nĂŁo divide com invertido negação barra"] + - "⫯": [T: "cĂ­rculo vertical linha com acima de"] + - "â«°": [T: "cĂ­rculo vertical linha com abaixo de"] + - "⫱": [T: "cĂ­rculo baixo taco com abaixo de"] + - "â«Č": [T: "paralelo com traço horizontal"] + - "⫳": [T: "paralelo com operador til"] + - "⫎": [T: "barra tripla vertical binĂĄrio relação"] + - "â«”": [T: "barra tripla vertical com traço horizontal"] + - "â«¶": [T: "triplo dois pontos operador"] + - "â«·": [T: "triplo aninhado menor que"] + - "⫞": [T: "triplo aninhado maior que"] + - "â«č": [T: "linha dupla inclinado menor ou igual a"] + - "â«ș": [T: "linha dupla inclinado maior ou igual a"] + - "â«»": [T: "barra tripla binĂĄrio relação"] + - "⫌": [T: "barra grande tripla operador vertical"] + - "⫝̸": [T: "barra dupla operador"] + - "⫟": [T: "barra branca vertical"] + - "⫿": [T: "barra branca vertical"] + - "⬀": [T: "seta branca para nordeste"] + - "⏁": [T: "seta branca para noroeste"] + - "⬂": [T: "seta branca para sudeste"] + - "⏃": [T: "seta branca para sudoeste"] + - "⬄": [T: "seta branca para a esquerda e para a direita"] + - "⬅": [T: "seta preta para a esquerda"] + - "⬆": [T: "seta preta para cima"] + - "⬇": [T: "seta preta para baixo"] + - "⏈": [T: "seta preta para nordeste"] + - "⬉": [T: "seta preta para noroeste"] + - "⬊": [T: "seta preta para sudeste"] + - "⬋": [T: "seta preta para sudoeste"] + - "⬌": [T: "seta preta para a esquerda e para a direita"] + - "⬍": [T: "seta preta para cima e para baixo"] + - "⬎": [T: "seta para a direita com ponta baixo"] + - "⬏": [T: "seta para a direita com ponta cima"] + - "⏐": [T: "seta para a esquerda com ponta baixo"] + - "⬑": [T: "seta para a esquerda com ponta cima"] + - "⬒": [T: "quadrado com superior metade preto"] + - "⬓": [T: "quadrado com inferior metade preto"] + - "⬔": [T: "quadrado com superior direita diagonal metade preto"] + - "⬕": [T: "quadrado com inferior esquerda diagonal metade preto"] + - "⬖": [T: "losango com esquerda metade preto"] + - "⬗": [T: "losango com direita metade preto"] + - "⏘": [T: "losango com superior metade preto"] + - "⬙": [T: "losango com inferior metade preto"] + - "⬚": [T: "caixa"] + - "⬛": [T: "quadrado preto grande"] + - "⬜": [T: "quadrado branco grande"] + - "⬝": [T: "quadrado preto muito pequeno"] + - "⬞": [T: "quadrado branco muito pequeno"] + - "⬟": [T: "pentĂĄgono preto"] + - "⏠": [T: "pentĂĄgono branco"] + - "⏥": [T: "hexĂĄgono branco"] + - "⏹": [T: "hexĂĄgono preto"] + - "⏣": [T: "hexĂĄgono horizontal preto"] + - "⏀": [T: "cĂ­rculo preto grande"] + - "⏄": [T: "losango preto mĂ©dio"] + - "⏊": [T: "losango branco mĂ©dio"] + - "⏧": [T: "losango preto mĂ©dio"] + - "⏚": [T: "losango branco mĂ©dio"] + - "⏩": [T: "losango preto pequeno"] + - "âŹȘ": [T: "losango preto pequeno"] + - "⏫": [T: "losango branco pequeno"] + - "⏏": [T: "elipse preta horizontal"] + - "⏭": [T: "elipse branca horizontal"] + - "⏟": [T: "elipse preta vertical"] + - "⏯": [T: "elipse branca vertical"] + - "⏰": [T: "seta para a esquerda com pequeno cĂ­rculo"] + - "⏱": [T: "setas trĂȘs para a esquerda"] + - "âŹČ": [T: "seta para a esquerda com circulado mais"] + - "⏳": [T: "seta longa serpenteante para a esquerda"] + - "⏎": [T: "seta de duas pontas para a esquerda com vertical traço"] + - "⏔": [T: "seta de duas pontas para a esquerda com duplo vertical traço"] + - "⏶": [T: "seta de duas pontas para a esquerda a partir de barra"] + - "⏷": [T: "seta de duas pontas de trĂȘs traços para a esquerda"] + - "⏞": [T: "seta para a esquerda com pontilhado haste"] + - "âŹč": [T: "seta para a esquerda com cauda com vertical traço"] + - "âŹș": [T: "seta para a esquerda com cauda com duplo vertical traço"] + - "⏻": [T: "seta de duas pontas para a esquerda com cauda"] + - "âŹŒ": [T: "seta de duas pontas para a esquerda com cauda com vertical traço"] + - "âŹœ": [T: "seta de duas pontas para a esquerda com cauda com duplo vertical traço"] + - "âŹŸ": [T: "seta para a esquerda atravessado por xis"] + - "⏿": [T: "seta ondulada apontando diretamente esquerda"] + - "⭀": [T: "seta igual sinal acima de para a esquerda"] + - "⭁": [T: "seta invertida til operador acima de para a esquerda"] + - "⭂": [T: "seta para a esquerda acima de invertido quase igual a"] + - "⭃": [T: "seta para a direita atravessado por maior que"] + - "⭄": [T: "seta para a direita atravessado por contendo"] + - "⭅": [T: "seta quĂĄdrupla para a esquerda"] + - "⭆": [T: "seta quĂĄdrupla para a direita"] + - "⭇": [T: "seta invertida til operador acima de para a direita"] + - "⭈": [T: "seta para a direita acima de invertido quase igual a"] + - "⭉": [T: "seta til operador acima de para a esquerda"] + - "⭊": [T: "seta para a esquerda acima de quase igual a"] + - "⭋": [T: "seta para a esquerda acima de invertido operador til"] + - "⭌": [T: "seta para a direita acima de invertido operador til"] + - "⭐": [T: "estrela branca mĂ©dia"] + - "⭑": [T: "estrela preta pequena"] + - "⭒": [T: "estrela branca pequena"] + - "⭓": [T: "pentĂĄgono preto direita apontando"] + - "⭔": [T: "pentĂĄgono branco direita apontando"] + - "⭕": [T: "cĂ­rculo grosso grande"] + - "⭖": [T: "grosso oval com oval dentro de"] + - "⭗": [T: "cĂ­rculo grosso com cĂ­rculo dentro de"] + - "⭘": [T: "cĂ­rculo grosso"] + - "⭙": [T: "grosso circulado aspa"] + - "⾀": [T: "Ăąngulo substituição marcador Ă  direita"] + - "➁": [T: "Ăąngulo pontilhado substituição marcador Ă  direita"] + - "⾂": [T: "abre colchete substituição"] + - "➃": [T: "fecha colchete substituição"] + - "⾄": [T: "abre colchete pontilhado substituição"] + - "⾅": [T: "fecha colchete pontilhado substituição"] + - "⾆": [T: "elevado interpolação marcador"] + - "⾇": [T: "elevado pontilhado interpolação marcador"] + - "➈": [T: "pontilhado transposição marcador marcador"] + - "⾉": [T: "abre colchete transposição"] + - "⾊": [T: "fecha colchete transposição"] + - "⾋": [T: "quadrado elevado"] + - "⾌": [T: "abre colchete elevado omissĂŁo"] + - "➍": [T: "fecha colchete elevado omissĂŁo"] + - "⾎": [T: "editorial corĂŽnis"] + - "➏": [T: "parĂĄgrafo"] + - "➐": [T: "bifurcado parĂĄgrafo"] + - "⾑": [T: "invertido bifurcado parĂĄgrafo"] + - "⾒": [T: "hipodiĂĄstole"] + - "⾓": [T: "pontilhado Ăłbelo"] + - "⾔": [T: "Ăąncora para baixo"] + - "⾕": [T: "Ăąncora para cima"] + - "⾖": [T: "pontilhado direita apontando Ăąngulo"] + - "⾗": [T: "duplo oblĂ­quo hĂ­fen"] + - "➘": [T: "invertido interrobang"] + - "⾙": [T: "ramo de palmeira"] + - "⾚": [T: "hĂ­fen com trema"] + - "⾛": [T: "til com anel acima de"] + - "⾜": [T: "abre colchete baixo parĂĄfrase"] + - "➝": [T: "fecha colchete baixo parĂĄfrase"] + - "⾞": [T: "til com ponto acima de"] + - "⾟": [T: "til com ponto abaixo de"] + - "âž ": [T: "barra vertical com pena Ă  esquerda"] + - "➥": [T: "barra vertical com pena Ă  direita"] + - "âžą": [T: "superior esquerda metade colchete"] + - "➣": [T: "superior direita metade colchete"] + - "➀": [T: "inferior esquerda metade colchete"] + - "âž„": [T: "inferior direita metade colchete"] + - "➊": [T: "abre colchete de lado u"] + - "âž§": [T: "fecha colchete de lado u"] + - "âžš": [T: "esquerda parĂȘnteses duplos"] + - "âž©": [T: "direita parĂȘnteses duplos"] + - "âžȘ": [T: "dois pontos sobre um ponto pontuação"] + - "âž«": [T: "um ponto sobre dois pontos pontuação"] + - "➏": [T: "quatro ponto pontuação enquadrado"] + - "âž­": [T: "cinco ponto marca"] + - "âžź": [T: "ponto invertido de interrogação"] + - "➯": [T: "til vertical"] + - "âž°": [T: "anel ponto"] + - "âž±": [T: "separador de palavras do meio ponto"] + - "âžČ": [T: "invertido vĂ­rgula"] + - "âžł": [T: "elevado ponto"] + - "➎": [T: "elevado vĂ­rgula"] + - "âž”": [T: "ponto invertido e vĂ­rgula"] + - "âž¶": [T: "adaga com esquerda guarda"] + - "âž·": [T: "adaga com direita guarda"] + - "âžž": [T: "invertido adaga"] + - "âžč": [T: "superior metade seção sinal"] + - "âžș": [T: "dois em travessĂŁo"] + - "âž»": [T: "trĂȘs em travessĂŁo"] + - "〃": [T: "idem marca"] + - "〈": [T: "abre colchete angular"] + - "〉": [T: "fecha colchete angular"] + - "《": [T: "abre colchete angular duplo"] + - "》": [T: "fecha colchete angular duplo"] + - "「": [T: "abre colchete canto"] + - "」": [T: "fecha colchete canto"] + - "『": [T: "abre colchete branco canto"] + - "』": [T: "fecha colchete branco canto"] + - "【": [T: "abre colchete preto lenticular"] + - "】": [T: "fecha colchete preto lenticular"] + - "〔": [T: "abre colchete concha de tartaruga"] + - "〕": [T: "fecha colchete concha de tartaruga"] + - "〖": [T: "abre colchete branco lenticular"] + - "〗": [T: "fecha colchete branco lenticular"] + - "〘": [T: "abre colchete branco concha de tartaruga"] + - "〙": [T: "fecha colchete branco concha de tartaruga"] + - "〚": [T: "abre colchete branco quadrado"] + - "〛": [T: "fecha colchete branco quadrado"] + - "〜": [T: "ondulado travessĂŁo"] + - "〰": [T: "ondulado travessĂŁo"] + - "㉈": [T: "dez sobre preto quadrado circulado"] + - "㉉": [T: "vinte sobre preto quadrado circulado"] + - "㉊": [T: "trinta sobre preto quadrado circulado"] + - "㉋": [T: "quarenta sobre pretos quadrado circulado"] + - "㉌": [T: "cinquenta sobre preto quadrado circulado"] + - "㉍": [T: "sessenta sobre preto quadrado circulado"] + - "㉎": [T: "setenta sobre preto quadrado circulado"] + - "㉏": [T: "oitenta sobre preto quadrado circulado"] + - "㉑": [T: "vinte um circulado"] + - "㉒": [T: "vinte dois circulado"] + - "㉓": [T: "vinte trĂȘs circulado"] + - "㉔": [T: "vinte quatro circulado"] + - "㉕": [T: "vinte cinco circulado"] + - "㉖": [T: "vinte seis circulado"] + - "㉗": [T: "vinte sete circulado"] + - "㉘": [T: "vinte oito circulado"] + - "㉙": [T: "vinte nove circulado"] + - "㉚": [T: "trinta circulado"] + - "㉛": [T: "trinta um circulado"] + - "㉜": [T: "trinta dois circulado"] + - "㉝": [T: "trinta trĂȘs circulado"] + - "㉞": [T: "trinta quatro circulado"] + - "㉟": [T: "trinta cinco circulado"] + - "㊱": [T: "trinta seis circulado"] + - "ăŠČ": [T: "trinta sete circulado"] + - "㊳": [T: "trinta oito circulado"] + - "㊮": [T: "trinta nove circulado"] + - "㊔": [T: "quarenta circulado"] + - "㊶": [T: "quarenta um circulado"] + - "㊷": [T: "quarenta dois circulado"] + - "㊾": [T: "quarenta trĂȘs circulado"] + - "ăŠč": [T: "quarenta quatro circulado"] + - "ăŠș": [T: "quarenta cinco circulado"] + - "㊻": [T: "quarenta seis circulado"] + - "ăŠŒ": [T: "quarenta sete circulado"] + - "ăŠœ": [T: "quarenta oito circulado"] + - "ăŠŸ": [T: "quarenta nove circulado"] + - "㊿": [T: "cinquenta circulado"] + - "㋌": [T: "mercĂșrio"] + - "㋍": [T: "ergs"] + - "㋎": [T: "elĂ©tron volts"] + - "㋏": [T: "limitado responsabilidade sinal"] + - "ă±": [T: "hectopascals"] + - "ăČ": [T: "daltons"] + - "㍳": [T: "unidades astronĂŽmicas"] + - "㍮": [T: "barras"] + - "ă”": [T: "o vĂȘ"] + - "ă¶": [T: "parsecs"] + - "ă·": [T: "decimetros"] + - "㍾": [T: "decĂ­metros ao quadrado"] + - "ăč": [T: "decĂ­metros ao cubo"] + - "ăș": [T: "instrumental unidades"] + - "㎀": [T: "picoampĂšres"] + - "㎁": [T: "nanoampĂšres"] + - "㎂": [T: "microampĂšres"] + - "㎃": [T: "miliampĂšres"] + - "㎄": [T: "quiloampĂšres"] + - "㎅": [T: "quilobytes"] + - "㎆": [T: "megabytes"] + - "㎇": [T: "gigabytes"] + - "㎈": [T: "calorias"] + - "㎉": [T: "quilocalorias"] + - "㎊": [T: "picofarads"] + - "㎋": [T: "nanofarads"] + - "㎌": [T: "microfarads"] + - "㎍": [T: "microgramas"] + - "㎎": [T: "miligramas"] + - "㎏": [T: "quilogramas"] + - "㎐": [T: "hertz"] + - "㎑": [T: "quilohertz"] + - "㎒": [T: "megahertz"] + - "㎓": [T: "gigahertz"] + - "㎔": [T: "terahertz"] + - "㎕": [T: "microlitros"] + - "㎖": [T: "mililitros"] + - "㎗": [T: "decilitros"] + - "㎘": [T: "quilolitros"] + - "㎙": [T: "femtometros"] + - "㎚": [T: "nanometros"] + - "㎛": [T: "micrometros"] + - "㎜": [T: "milimetros"] + - "㎝": [T: "centimetros"] + - "㎞": [T: "quilometros"] + - "㎟": [T: "milĂ­metros ao quadrado"] + - "㎠": [T: "centĂ­metros ao quadrado"] + - "㎡": [T: "metros ao quadrado"] + - "㎱": [T: "quilĂŽmetros ao quadrado"] + - "㎣": [T: "milĂ­metros ao cubo"] + - "㎀": [T: "centĂ­metros ao cubo"] + - "㎄": [T: "metros ao cubo"] + - "㎩": [T: "quilĂŽmetros ao cubo"] + - "㎧": [T: "metros por segundo"] + - "㎹": [T: "metros por segundo ao quadrado"] + - "㎩": [T: "pascals"] + - "ăŽȘ": [T: "quilopascals"] + - "㎫": [T: "megapascals"] + - "㎬": [T: "gigapascals"] + - "㎭": [T: "radianos"] + - "㎼": [T: "radianos por segundo"] + - "㎯": [T: "radianos por segundo ao quadrado"] + - "㎰": [T: "picosegundos"] + - "㎱": [T: "nanosegundos"] + - "ăŽČ": [T: "microsegundos"] + - "㎳": [T: "milisegundos"] + - "㎮": [T: "picovolts"] + - "㎔": [T: "nanovolts"] + - "㎶": [T: "microvolts"] + - "㎷": [T: "milivolts"] + - "㎾": [T: "quilovolts"] + - "ăŽč": [T: "megavolts"] + - "ăŽș": [T: "picowatts"] + - "㎻": [T: "nanowatts"] + - "ăŽŒ": [T: "microwatts"] + - "ăŽœ": [T: "miliwatts"] + - "ăŽŸ": [T: "quilowatts"] + - "㎿": [T: "megawatts"] + - "㏀": [T: "quiloohms"] + - "㏁": [T: "megaohms"] + - "㏂": [T: "atometros"] + - "㏃": [T: "becquereis"] + - "㏄": [T: "cĂșbico centĂ­metros"] + - "㏅": [T: "candelas"] + - "㏆": [T: "coulombs por quilograma"] + - "㏇": [T: "maiĂșscula C, o, ponto final"] + - "㏈": [T: "decibĂ©is"] + - "㏉": [T: "grays"] + - "㏊": [T: "hectares"] + - "㏋": [T: "cavalo-vapor"] + - "㏌": [T: "polegadas"] + - "㏍": [T: "quilokelvins"] + - "㏎": [T: "quilometros"] + - "㏏": [T: "nĂłs"] + - "㏐": [T: "lĂșmens"] + - "㏑": [T: "logaritmo natural"] + - "㏒": [T: "logaritmo"] + - "㏓": [T: "lux"] + - "㏔": [T: "milibarns"] + - "㏕": [T: "mills"] + - "㏖": [T: "moles"] + - "㏗": [T: "pĂȘ agĂĄ"] + - "㏘": [T: "picometros"] + - "㏙": [T: "partes por milhĂŁo"] + - "㏚": [T: "petaroentgens"] + - "㏛": [T: "esferorradianos"] + - "㏜": [T: "sieverts"] + - "㏝": [T: "webers"] + - "㏞": [T: "volts por metro"] + - "㏟": [T: "ampĂšres por metro"] + - "㏿": [T: "galĂ”es"] + - "": [T: "igual com chapĂ©u abaixo de"] + - "": [T: "igual com mais acima de"] + - "": [T: "igual com mais abaixo de"] + - "": [T: "til com mais acima de"] + - "": [T: "til com mais abaixo de"] + - "": [T: "igual duplo sobre maior que"] + - "": [T: "igual duplo sobre menor que"] + - "": [T: "contĂ©m ou igual a"] + - "": [T: "contĂ©m ou igual a"] + - "": [T: "contido em ou igual a"] + - "": [T: "igual sobre menor que"] + - "": [T: "pertence a ou igual a"] + - "": [T: "igual a ou maior que"] + - "": [T: "aproximado contĂ©m"] + - "": [T: "aproximado contido em"] + - "": [T: "contĂ©m com ponto inclui como sub relação"] + - "": [T: "contido em com ponto Ă© incluĂ­do em como sub relação"] + - "": [T: "igual com ponto abaixo de"] + - "": [T: "ponto sobre menos sobre ponto Ă  direita Ă  esquerda"] + - "": [T: "ponto sobre menos sobre ponto Ă  esquerda Ă  direita"] + - "": [T: "quase igual a menos"] + - "": [T: "quadrado duplo xĂ­cara"] + - "": [T: "quadrado duplo maiĂșscula"] + - "": [T: "menor que igual a ou maior que"] + - "": [T: "til com ponto"] + - "": [T: "til com dois pontos"] + - "": [T: "menor que maior ou igual a"] + - "": [T: "maior que menor ou igual a"] + - "": [T: "equivalente a ou menor que"] + - "": [T: "equivalente a ou maior que"] + - "î€Ș": [T: "esquerda aberto caixa operador"] + - "": [T: "direita aberto caixa operador"] + - "": [T: "idĂȘntico a com ponto"] + - "": [T: "maior que igual a ou menor que"] + - "": [T: "operador barra"] + - "": [T: "operador duplo barra"] + - "": [T: "operador triplo barra"] + - "î€Č": [T: "menor que ou aproximadamente igual a"] + - "": [T: "maior que ou aproximadamente igual a"] + - "": [T: "aninhado menor que"] + - "": [T: "aninhado maior que"] + - "î€ș": [T: "precede ou equivalente a"] + - "": [T: "sucede ou equivalente a"] + - "î„€": [T: "precede sobre igual"] + - "": [T: "sucede sobre igual"] + - "î„‚": [T: "menor igual inclinado maior"] + - "": [T: "maior igual inclinado menor"] + - "": [T: "satisfeito por"] + - "": [T: "deitado esse"] + - "": [T: "nĂŁo asserção"] + - "î„‹": [T: "duplo igual"] + - "": [T: "triplo igual"] + - "": [T: "rĂ©gua atrasado"] + - "": [T: "alias delimitador"] + - "": [T: "subgrupo normal de com barra"] + - "î„‘": [T: "contĂ©m como subgrupo normal com barra"] + - "î„”": [T: "implica arredondado"] + - "î„•": [T: "sorriso barra inferior"] + - "î„–": [T: "carranca barra superior"] + - "î„—": [T: "contĂ©m ou quase igual a"] + - "": [T: "contido em ou quase igual a"] + - "î„™": [T: "maior que quase igual a ou menor que"] + - "": [T: "menor que quase igual ou maior que"] + - "": [T: "duplo ou lĂłgico"] + - "": [T: "duplo e lĂłgico"] + - "": [T: "ou lĂłgico com barra dupla abaixo de"] + - "": [T: "ou lĂłgico com barra abaixo de"] + - "": [T: "quase igual sobre igual"] + - "î„€": [T: "triĂąngulo esquerda apontando com bissectando barra"] + - "î„„": [T: "triĂąngulo direita apontando com bissectando barra"] + - "": [T: "igual com linha pontilhada superior"] + - "î„§": [T: "precede com dois pontos"] + - "": [T: "sucede com dois pontos"] + - "î„©": [T: "menor que ou igual inclinado"] + - "î„Ș": [T: "maior que ou igual inclinado"] + - "î„«": [T: "aninhado muito muito menor que"] + - "": [T: "aninhado muito muito maior que"] + - "î„­": [T: "diferença entre variante"] + - "": [T: "menor que maior que sobreposto"] + - "": [T: "ou lĂłgico e lĂłgico sobreposto"] + - "î„°": [T: "contendo sobre contendo"] + - "": [T: "contido sobre contido"] + - "î„Č": [T: "contendo sobre contido"] + - "": [T: "contido sobre contendo"] + - "î„č": [T: "barra tripla vertical"] + - "î„ș": [T: "pontos pareados quĂĄdruplos verticales"] + - "î„»": [T: "perpendicular barra superior"] + - "": [T: "catraca barra dupla vertical Ă  esquerda"] + - "": [T: "duplo catraca barra dupla vertical Ă  esquerda"] + - "": [T: "perpendicular sobre invertido perpendicular"] + - "": [T: "duplo catraca barra vertical Ă  esquerda"] + - "": [T: "Ăąngulo esfĂ©rico abrindo cima"] + - "": [T: "barra dupla"] + - "": [T: "Ăąngulo com canto Ă  direita"] + - "": [T: "barra vertical circulado"] + - "": [T: "sinal de divisĂŁo circulado"] + - "": [T: "barra tracejada"] + - "": [T: "barra tracejada invertida"] + - "": [T: "linha tracejada mĂ©dia"] + - "": [T: "barra tracejada vertical"] + - "": [T: "perpendicular com esse"] + - "": [T: "Ăąngulo com esse"] + - "": [T: "Ăąngulo esfĂ©rico abrindo esquerda"] + - "": [T: "Ăąngulo abrindo esquerda"] + - "": [T: "barra vertical com gancho duplo"] + - "": [T: "ponto mĂ©dio operador radical livre"] + - "": [T: "triĂąngulo branco cima apontando acima de barra"] + - "": [T: "idĂȘntico e paralelo a"] + - "": [T: "produto esmagado"] + - "": [T: "operador triplo barra com barra horizontal"] + - "": [T: "idĂȘntico a com barra dupla"] + - "": [T: "barras triplas cruzadas"] + - "": [T: "cĂ­rculo vertical barra sobre"] + - "": [T: "vertical proporcional a"] + - "": [T: "preto Ășltimo um quarto lua"] + - "": [T: "preto primeiro um quarto lua"] + - "": [T: "negativo seno ondulado"] + - "": [T: "ponto entre parĂȘnteses"] + - "": [T: "parĂȘnteses"] + - "": [T: "branco sorriso"] + - "": [T: "branco carranca"] + - "": [T: "hexĂĄgono"] + - "": [T: "equivalente a sobre mais"] + - "": [T: "mais sobre equivalente a"] + - "": [T: "interseção serifas"] + - "": [T: "uniĂŁo serifas"] + - "îŠČ": [T: "quadrado interseção serifas"] + - "": [T: "quadrado uniĂŁo serifas"] + - "î§ ": [T: "precede equivalente a ou sucede"] + - "î§Ą": [T: "sucede equivalente a ou precede"] + - "î§ą": [T: "precede quase igual a ou sucede"] + - "î§Ł": [T: "sucede quase igual a ou precede"] + - "î§°": [T: "menor que equivalente a ou maior que"] + - "î§±": [T: "maior que equivalente a ou menor que"] + - "": [T: "nĂŁo vertical muito menor que"] + - "": [T: "nĂŁo vertical muito maior que"] + - "": [T: "nĂŁo muito menor que variante"] + - "": [T: "nĂŁo muito maior que variante"] + - "": [T: "menor vertical nĂŁo duplo igual"] + - "": [T: "maior que vertical nĂŁo duplo igual"] + - "": [T: "nĂŁo menor ou igual a"] + - "": [T: "nĂŁo maior ou igual a"] + - "": [T: "nem igual a nem menor que"] + - "": [T: "nĂŁo contĂ©m ou igual a"] + - "": [T: "nem contĂ©m nem igual a"] + - "": [T: "nem contido em nem igual a"] + - "": [T: "barra invertida contido"] + - "": [T: "nem igual a nem maior que"] + - "": [T: "nĂŁo menos operador til"] + - "": [T: "nem igual a nem menor que"] + - "": [T: "nĂŁo operador til"] + - "": [T: "nĂŁo pertence a ou igual a"] + - "": [T: "nem igual a nem maior que"] + - "": [T: "nĂŁo quase igual"] + - "": [T: "nĂŁo sucede semelhante"] + - "": [T: "menor que ou inclinado igual a com barra"] + - "": [T: "maior que ou inclinado igual a com barra"] + - "": [T: "contendo barra"] + - "": [T: "nĂŁo contĂ©m"] + - "": [T: "nĂŁo menor ou igual a"] + - "": [T: "nĂŁo maior ou igual a"] + - "": [T: "nĂŁo quase igual a menos"] + - "îšą": [T: "negado conjunto pertinĂȘncia ponto acima de"] + - "": [T: "nĂŁo Ăąngulo vertical"] + - "îš­": [T: "nĂŁo paralelo inclinado"] + - "îšź": [T: "nĂŁo operador barra"] + - "": [T: "nĂŁo operador duplo barra"] + - "îš°": [T: "nĂŁo operador triplo barra"] + - "îšČ": [T: "menor que mas nĂŁo aproximadamente igual a"] + - "îšł": [T: "maior que mas nĂŁo aproximadamente igual a"] + - "": [T: "menor que ou nĂŁo igual a"] + - "îš”": [T: "maior que ou nĂŁo igual a"] + - "îš¶": [T: "nĂŁo aninhado menor que"] + - "îš·": [T: "nĂŁo aninhado maior que"] + - "îšž": [T: "nĂŁo muito menor que"] + - "îšč": [T: "nĂŁo muito maior que"] + - "îšș": [T: "precede mas nĂŁo equivalente a"] + - "îš»": [T: "sucede mas nĂŁo equivalente a"] + - "": [T: "precede mas nĂŁo igual a"] + - "îšœ": [T: "sucede mas nĂŁo igual a"] + - "": [T: "nĂŁo igual ou precede"] + - "îšż": [T: "nĂŁo igual ou sucede"] + - "": [T: "precede mas nĂŁo igual a"] + - "": [T: "sucede mas nĂŁo igual a"] + - "": [T: "nĂŁo contido em nem igual a"] + - "": [T: "nĂŁo contĂ©m nem igual a"] + - "": [T: "contido em ou nĂŁo igual a"] + - "": [T: "contĂ©m ou nĂŁo igual a"] + - "": [T: "nĂŁo contido em nem igual a"] + - "": [T: "nĂŁo contĂ©m nem igual a"] + - "": [T: "nĂŁo triplo menor que"] + - "": [T: "nĂŁo triplo maior que"] + - "": [T: "nĂŁo precede igual"] + - "": [T: "nĂŁo sucede igual"] + - "": [T: "nĂŁo subgrupo normal de com barra"] + - "": [T: "nĂŁo contĂ©m como subgrupo normal com barra"] + - "": [T: "nĂŁo diferença entre"] + - "": [T: "nĂŁo geometricamente equivalente a"] + - "": [T: "nĂŁo vertical semelhante"] + - "": [T: "nĂŁo igual ou semelhante"] + - "": [T: "nĂŁo vertical aproximado"] + - "": [T: "nĂŁo aproximadamente idĂȘntico a"] + - "": [T: "nĂŁo irregular igual"] + - "": [T: "nĂŁo irregular simples igual"] + - "": [T: "nĂŁo igual ponto"] + - "": [T: "invertido nĂŁo equivalente"] + - "î© ": [T: "quadrado nĂŁo contido"] + - "": [T: "quadrado nĂŁo contendo"] + - "": [T: "nĂŁo quase igual sobre igual"] + - "": [T: "nĂŁo estritamente equivalente a"] + - "î©€": [T: "nĂŁo congruente ponto"] + - "î©„": [T: "invertido nĂŁo igual"] + - "î©°": [T: "triĂąngulo nĂŁo vertical esquerda igual"] + - "": [T: "triĂąngulo nĂŁo vertical direita igual"] + - "îȘ€": [T: "nĂŁo parcial"] + - "": [T: "seta extensor"] + - "": [T: "seta para a direita sobre seta esquerda"] + - "": [T: "seta para a direita sobre seta esquerda"] + - "": [T: "arpĂŁo para a direita sobre arpĂŁo esquerda"] + - "": [T: "arpĂŁo para a direita sobre arpĂŁo esquerda"] + - "": [T: "seta dupla para nordeste e para sudoeste"] + - "": [T: "seta dupla para noroeste e para sudeste"] + - "": [T: "arpĂŁo horizontal extensor"] + - "": [T: "seta no sentido anti-horĂĄrio arco para a esquerda"] + - "": [T: "seta no sentido anti-horĂĄrio arco para a direita"] + - "": [T: "seta grande para a direita acento"] + - "": [T: "seta grande para a esquerda acento"] + - "": [T: "ponta de seta Ă  esquerda"] + - "": [T: "ponta de seta Ă  direita"] + - "": [T: "seta grande para a esquerda e para a direita com traço"] + - "": [T: "seta horizontal dupla extensor"] + - "": [T: "seta grande dupla para a esquerda e para a direita com traço"] + - "": [T: "seta para baixo Ă  esquerda de seta para cima"] + - "": [T: "seta para a esquerda com canto baixo"] + - "": [T: "seta para a direita com canto cima"] + - "": [T: "seta para a esquerda com canto cima"] + - "": [T: "seta semicircular superior no sentido anti-horĂĄrio com mais"] + - "": [T: "seta semicircular superior no sentido horĂĄrio com menos"] + - "": [T: "seta para a direita com cauda com traço"] + - "": [T: "arpĂŁo para a direita com farpa para baixo"] + - "": [T: "arpĂŁo para a esquerda com farpa para baixo"] + - "": [T: "arpĂŁo para a esquerda e para a direita baixo"] + - "": [T: "arpĂŁo para a esquerda e para a direita cima"] + - "": [T: "arpĂŁo para cima e para baixo esquerda"] + - "": [T: "arpĂŁo para cima e para baixo direita"] + - "": [T: "seta para cima Ă  direita de baixo seta"] + - "": [T: "arpĂŁo para a esquerda a barra com farpa cima"] + - "": [T: "arpĂŁo para a direita a barra com farpa cima"] + - "": [T: "arpĂŁo para a esquerda a barra com farpa baixo"] + - "": [T: "arpĂŁo para a direita a barra com farpa baixo"] + - "": [T: "arpĂŁo para a esquerda a partir de barra com farpa cima"] + - "": [T: "arpĂŁo para a direita a partir de barra com farpa cima"] + - "": [T: "arpĂŁo para a esquerda a partir de barra com farpa baixo"] + - "": [T: "arpĂŁo para a direita a partir de barra com farpa baixo"] + - "": [T: "arpĂŁo para cima a barra com farpa esquerda"] + - "": [T: "arpĂŁo para baixo a barra com farpa esquerda"] + - "îŹȘ": [T: "arpĂŁo para cima a barra com farpa direita"] + - "": [T: "arpĂŁo para baixo a barra com farpa direita"] + - "": [T: "arpĂŁo para cima a partir de barra com farpa esquerda"] + - "": [T: "arpĂŁo para baixo a partir de barra com farpa esquerda"] + - "": [T: "arpĂŁo para cima a partir de barra com farpa direita"] + - "": [T: "arpĂŁo para baixo a partir de barra com farpa direita"] + - "": [T: "seta para cima a barra"] + - "": [T: "seta para baixo a barra"] + - "îŹČ": [T: "arpĂŁo para cima Ă  esquerda de baixo arpĂŁo"] + - "": [T: "arpĂŁo para cima Ă  direita de baixo arpĂŁo"] + - "": [T: "ponta de seta para cima"] + - "": [T: "ponta de seta para baixo"] + - "": [T: "arpĂŁo duplo com esquerda farpa baixo direita farpa cima"] + - "": [T: "arpĂŁo duplo com esquerda farpa cima direita farpa baixo"] + - "": [T: "seta para a esquerda barra superior"] + - "îŹč": [T: "seta para a direita barra superior"] + - "îŹș": [T: "seta para a esquerda barra inferior"] + - "": [T: "seta para a direita barra inferior"] + - "îŹŒ": [T: "seta tripla para a esquerda e para a direita"] + - "": [T: "seta dupla para nordeste e para sudeste"] + - "": [T: "seta semicircular no sentido anti-horĂĄrio para a esquerda"] + - "": [T: "seta semicircular no sentido horĂĄrio para a esquerda"] + - "": [T: "seta esquerda aberta cĂ­rculo para a esquerda e para a direita"] + - "": [T: "seta para a direita sobre til"] + - "": [T: "seta para a esquerda sobre til"] + - "": [T: "arpĂŁo para a esquerda barra superior"] + - "": [T: "arpĂŁo para a direita barra superior"] + - "": [T: "arpĂŁo para a esquerda barra inferior"] + - "": [T: "arpĂŁo para a direita barra inferior"] + - "": [T: "seta achatado preta para a esquerda"] + - "": [T: "seta semicircular no sentido horĂĄrio para a direita"] + - "": [T: "seta semicircular no sentido anti-horĂĄrio para a direita"] + - "": [T: "arpĂŁo esquerda aberto cĂ­rculo para a esquerda e para a direita"] + - "": [T: "seta para cima esquerda de barra vertical"] + - "": [T: "seta para baixo esquerda de barra vertical"] + - "": [T: "seta para cima direita de barra vertical"] + - "": [T: "seta para baixo direita de barra vertical"] + - "": [T: "seta para a direita com estendido baixo gancho"] + - "": [T: "seta para a esquerda com estendido gancho"] + - "": [T: "seta para a esquerda com estendido baixo gancho"] + - "": [T: "seta para a direita com estendido gancho"] + - "î­ ": [T: "seta nĂŁo para a direita ondulado"] + - "î­Ą": [T: "seta nĂŁo para a direita curvo"] + - "î­š": [T: "arpĂŁo para cima esquerda de barra vertical"] + - "î­©": [T: "arpĂŁo para baixo esquerda de barra vertical"] + - "î­Ș": [T: "arpĂŁo para cima direita de barra vertical"] + - "î­«": [T: "arpĂŁo para baixo direita de barra vertical"] + - "î­Ź": [T: "seta vertical dupla extensor"] + - "î­­": [T: "arpĂŁo vertical com farpa esquerda extensor"] + - "î­ź": [T: "arpĂŁo vertical com farpa direita extensor"] + - "î­Ż": [T: "arpĂŁo para a direita sobre esquerda arpĂŁo direita"] + - "î­°": [T: "arpĂŁo para a direita sobre esquerda arpĂŁo esquerda"] + - "î­±": [T: "arpĂŁo para a esquerda sobre direita arpĂŁo direita"] + - "î­Č": [T: "arpĂŁo para a esquerda sobre direita arpĂŁo esquerda"] + - "î­ł": [T: "seta para a esquerda a partir de barra ponta de seta"] + - "î­Ž": [T: "seta para a esquerda e para a direita a partir de barra extensor"] + - "î­”": [T: "seta para a esquerda a partir de barra cauda"] + - "î­¶": [T: "seta para a direita a partir de barra cauda"] + - "î­·": [T: "seta para a direita a partir de barra ponta de seta"] + - "î­ž": [T: "arpĂŁo para cima a partir de barra com farpa esquerda ponta de seta"] + - "î­č": [T: "seta para a direita sobre esquerda seta direita"] + - "î­ș": [T: "seta para a direita sobre esquerda seta esquerda"] + - "î­»": [T: "seta para a esquerda sobre direita seta direita"] + - "î­Œ": [T: "seta para a esquerda sobre direita seta esquerda"] + - "î­œ": [T: "seta para cima a partir de barra ponta de seta"] + - "î­Ÿ": [T: "seta para cima a partir de barra cauda"] + - "î­ż": [T: "seta para baixo a partir de barra cauda"] + - "": [T: "seta para baixo a partir de barra ponta de seta"] + - "": [T: "arpĂŁo para baixo a partir de barra com farpa direita ponta de seta"] + - "": [T: "arpĂŁo para cima Ă  esquerda de baixo arpĂŁo inferior"] + - "": [T: "arpĂŁo para cima Ă  esquerda de baixo arpĂŁo extensor"] + - "": [T: "arpĂŁo para baixo Ă  esquerda de cima arpĂŁo superior"] + - "": [T: "arpĂŁo para cima Ă  esquerda de baixo arpĂŁo superior"] + - "": [T: "arpĂŁo para baixo Ă  esquerda de o cima arpĂŁo extensor"] + - "": [T: "arpĂŁo para baixo Ă  esquerda de o cima arpĂŁo inferior"] + - "": [T: "seta para cima esquerda de baixo seta inferior"] + - "": [T: "seta para baixo esquerda de cima seta superior"] + - "": [T: "seta para cima esquerda de baixo seta superior"] + - "": [T: "seta para baixo esquerda de cima seta inferior"] + - "": [T: "setas para a esquerda e para a direita extensor"] + - "": [T: "seta para nordeste extensor"] + - "": [T: "seta para noroeste extensor"] + - "": [T: "baixo apontando chave esquerda"] + - "": [T: "baixo apontando chave mĂ©dio"] + - "": [T: "baixo apontando chave direita"] + - "": [T: "chave horizontal extensor"] + - "": [T: "cima apontando chave esquerda"] + - "": [T: "cima apontando chave mĂ©dio"] + - "": [T: "apontando para chave direita para cima"] + - "": [T: "barra vertical Ă  esquerda"] + - "": [T: "barra vertical Ă  direita"] + - "": [T: "esquerda barra dupla vertical"] + - "": [T: "direita barra dupla vertical"] + - "": [T: "colchete horizontal extensor"] + - "": [T: "quadrado sob colchete"] + - "⎔": [T: "quadrado sob colchete"] + - "": [T: "quadrado sobre colchete"] + - "⎮": [T: "quadrado sobre colchete"] + - "": [T: "sob colchete esquerda"] + - "": [T: "sob colchete direita"] + - "": [T: "sobre colchete esquerda"] + - "": [T: "sobre colchete direita"] + - "": [T: "abre parĂȘnteses 1"] + - "": [T: "abre parĂȘnteses 2"] + - "": [T: "abre parĂȘnteses 3"] + - "": [T: "abre parĂȘnteses 4"] + - "": [T: "fecha parĂȘnteses 1"] + - "": [T: "fecha parĂȘnteses 2"] + - "": [T: "fecha parĂȘnteses 3"] + - "": [T: "fecha parĂȘnteses 4"] + - "": [T: "radical 1"] + - "": [T: "radical 2"] + - "": [T: "radical 3"] + - "": [T: "radical 4"] + - "": [T: "radical 5"] + - "": [T: "radical inferior"] + - "î° ": [T: "radical extensor vertical"] + - "î°Ą": [T: "radical superior"] + - "î°ą": [T: "esquerda colchete branco superior"] + - "î°Ł": [T: "esquerda colchete branco extensor"] + - "î°€": [T: "esquerda colchete branco inferior"] + - "î°„": [T: "direita colchete branco superior"] + - "î°Š": [T: "direita colchete branco extensor"] + - "î°§": [T: "direita colchete branco inferior"] + - "î°°": [T: "abre colchete branco encaracolado"] + - "î°±": [T: "fecha colchete branco encaracolado"] + - "î°Č": [T: "sinal longo de divisĂŁo"] + - "î°ł": [T: "sinal longo de divisĂŁo extensor"] + - "î°Ž": [T: "divisĂŁo curta"] + - "": [T: "duplo sudoeste a nordeste ligação em"] + - "": [T: "duplo noroeste a sudeste ligação em"] + - "": [T: "simples horizontal ligação em"] + - "": [T: "duplo horizontal ligação em"] + - "": [T: "triplo horizontal ligação em"] + - "": [T: "simples vertical ligação em"] + - "": [T: "duplo vertical ligação em"] + - "": [T: "triplo vertical ligação em"] + - "": [T: "menor que ligação em"] + - "": [T: "maior que ligação em"] + - "": [T: "simples horizontal ligação en"] + - "": [T: "duplo horizontal ligação en"] + - "": [T: "triplo horizontal ligação en"] + - "îȀ": [T: "retĂąngulo superior esquerda"] + - "îȁ": [T: "retĂąngulo inferior esquerda"] + - "îȐ": [T: "retĂąngulo superior direita"] + - "îȑ": [T: "retĂąngulo inferior direita"] + - "îȒ": [T: "divisĂŁo sintĂ©tica canto"] + - "îȓ": [T: "divisĂŁo sintĂ©tica extensor horizontal"] + - "îȔ": [T: "divisĂŁo sintĂ©tica extensor vertical"] + - "îȕ": [T: "esquerda teto piso extensor"] + - "îȖ": [T: "direita teto piso extensor"] + - "îȗ": [T: "sobre colchete extensor"] + - "îȘ": [T: "barra extensor vertical"] + - "îș": [T: "esquerda barra dupla extensor vertical"] + - "îȚ": [T: "barra extensor horizontal"] + - "îȜ": [T: "sob colchete extensor"] + - "îȝ": [T: "baixo apontando parĂȘntese direita"] + - "îȞ": [T: "baixo apontando parĂȘntese extensor"] + - "îȟ": [T: "baixo apontando parĂȘntese esquerda"] + - "îČ ": [T: "cima apontando chave extensor"] + - "îČĄ": [T: "cima apontando parĂȘntese esquerda"] + - "îČą": [T: "cima apontando parĂȘntese extensor"] + - "îČŁ": [T: "cima apontando parĂȘntese direita"] + - "îČ€": [T: "baixo apontando chave extensor"] + - "": [T: "planck constante sobre dois pi barra"] + - "": [T: "g espelhado"] + - "": [T: "sem ponto jota"] + - "": [T: "digama"] + - "ϝ": [T: "digama"] + - "": [T: "dĂȘ"] + - "": [T: "e"] + - "": [T: "i"] + - "": [T: "jota"] + - "ⅅ": + - spell: "translate('.', 'ⅅ', 'DD')" # 0xed16, 0x2145 + - "": [T: "no sentido anti-horĂĄrio contorno integral laço"] + - "": [T: "no sentido horĂĄrio contorno integral laço"] + - "": [T: ""] + - "": [T: ""] + - "": [T: ""] + - "": [T: ""] + - "": [T: ""] + - "": [T: ""] + - "": [T: ""] + - "": [T: ""] + - "": [T: ""] + - "": [T: "junção status"] + - "": [T: "junção status esquerda"] + - "": [T: "junção status direita"] + - "": [T: "junção status extensor"] + - "": [T: "integral laço"] + - "": [T: "integral laço duplo"] + - "": [T: "integral laço triplo"] + - "": [T: "expandindo integral laço duplo"] + - "": [T: "expandindo integral laço triplo"] + - "": [T: "assintoticamente igual a acento"] + - "": [T: "sinal de igual acento"] + - "": [T: "linha quĂĄdrupla"] + - "": [T: "cĂ­rculo barra acento com aberto esquerda"] + - "": [T: "cĂ­rculo barra acento com fechado esquerda"] + - "": [T: "cĂ­rculo barra acento com aberto direita"] + - "": [T: "barra acento com sobre ponto"] + - "": [T: "barra acento com sob ponto"] + - "": [T: "barra acento com duplo sobre ponto"] + - "îž ": [T: "barra acento com duplo sob ponto"] + - "": [T: "barra acento com circunflexo"] + - "îžą": [T: "barra espessa acento inferior"] + - "": [T: "cĂ­rculo barra acento com fechado direita"] + - "": [T: "ponto grande acima de"] + - "": [T: "alinhamento marca"] + - "": [T: ""] + - "​": [T: ""] + - "": [T: ""] + - " ": [T: ""] + - "": [T: ""] + - " ": [T: ""] + - "": [T: ""] + - "": [T: ""] + - "": [T: ""] + - "": [T: ""] + - "": [T: ""] + - "": [T: ""] + - "": [T: ""] + - " ": [T: ""] + - "îŒą": [T: ""] + - "îŒŁ": [T: ""] + - "": [T: ""] + - "": [T: ""] + - "": [T: "ausente termo"] + - "": [T: "seta no sentido horĂĄrio contorno integral sobre esquerda"] + - "": [T: "quadrado integral com"] + - "": [T: "integral com barra"] + - "": [T: "integral invertida"] + - "": [T: "duplo zero sobre duplo zero"] + - "": [T: "zero com barra"] + - "-": + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "maiĂșscula"] + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [T: "ligadura a e"] + - "": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "maiĂșscula"] + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [T: "sustenido esse"] + - "": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "maiĂșscula"] + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [T: "o com traço"] + - "": + - spell: "translate('.', '', 'Î”ÎšÎ›Î ÎŁÎ˜Î“Î©Î„')" + - T: "vazado" + - "-": + - spell: "translate('.', 'ïˆ ïˆĄïˆąïˆŁïˆ€ïˆ„ïˆŠïˆ§ïˆšïˆ©ïˆȘïˆ«ïˆŹïˆ­ïˆźïˆŻïˆ°ïˆ±ïˆČïˆłïˆŽïˆ”ïˆ¶', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + - T: "vazado" + - "": [T: "vazado final sigma"] + - "": [T: "vazado rĂŽ"] + - "": [T: "vazado fi"] + - "-ï‰č": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ï‰ ï‰Ąï‰ąï‰Łï‰€ï‰„ï‰Šï‰§ï‰šï‰©ï‰Șï‰«ï‰Źï‰­ï‰źï‰Żï‰°ï‰±ï‰Čï‰łï‰Žï‰”ï‰¶ï‰·ï‰žï‰č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "ï‰ș-": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ï‰șï‰»ï‰Œï‰œï‰Ÿï‰żïŠ€ïŠïŠ‚ïŠƒïŠ„ïŠ…ïŠ†ïŠ‡ïŠˆïŠ‰ïŠŠïŠ‹ïŠŒïŠïŠŽïŠïŠïŠ‘ïŠ’ïŠ“', 'abcdefghijklmnopqrstuvwxyz')" + - "𝐮-𝑍": + - spell: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "-": + - spell: "translate('.', 'ïŠ”ïŠ•ïŠ–ïŠ—ïŠ˜ïŠ™ïŠšïŠ›ïŠœïŠïŠžïŠŸïŠ ïŠĄïŠąïŠŁïŠ€ïŠ„ïŠŠïŠ§ïŠšïŠ©ïŠȘïŠ«ïŠŹïŠ­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "𝑎-𝑧": + - spell: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”đ‘•đ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" + - "ïŠź-": + - spell: "translate('.', 'ïŠźïŠŻïŠ°ïŠ±ïŠČïŠłïŠŽïŠ”ïŠ¶ïŠ·ïŠžïŠčïŠșïŠ»ïŠŒïŠœïŠŸïŠżï‹€ï‹ï‹‚ï‹ƒï‹„ï‹…ï‹†ï‹‡', 'abcdefghijklmnopqrstuvwxyz')" + - "-ï‹Ą": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ï‹ˆï‹‰ï‹Šï‹‹ï‹Œï‹ï‹Žï‹ï‹ï‹‘ï‹’ï‹“ï‹”ï‹•ï‹–ï‹—ï‹˜ï‹™ï‹šï‹›ï‹œï‹ï‹žï‹Ÿï‹ ï‹Ą', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "ï‹ą-": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ï‹ąï‹Łï‹€ï‹„ï‹Šï‹§ï‹šï‹©ï‹Șï‹«ï‹Źï‹­ï‹źï‹Żï‹°ï‹±ï‹Čï‹łï‹Žï‹”ï‹¶ï‹·ï‹žï‹čï‹ș', 'abcdefghijklmnopqrstuvwxyz')" + - "𝖠-đ–č": + - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "-": + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "đ–ș-𝗓": + - spell: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" + - "-ïŒł": + - spell: "translate('.', 'ïŒšïŒ›ïŒœïŒïŒžïŒŸïŒ ïŒĄïŒąïŒŁïŒ€ïŒ„ïŒŠïŒ§ïŒšïŒ©ïŒȘïŒ«ïŒŹïŒ­ïŒźïŒŻïŒ°ïŒ±ïŒČïŒł', 'abcdefghijklmnopqrstuvwxyz')" + - "𝗔-𝗭": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "-": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ïŒčïŒșïŒ»ïŒŒïŒœïŒŸïŒżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒï', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "𝗼-𝘇": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" + - "-": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ïŽïïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§', 'abcdefghijklmnopqrstuvwxyz')" + - "𝘈-𝘡": + - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "-": + - spell: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżïŽ€ïŽ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "𝘱-đ˜»": + - spell: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" + - "-": + - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - "đ˜Œ-𝙕": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "-": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ïŽœïŽïŽžïŽŸïŽ ïŽĄïŽąïŽŁïŽ€ïŽ„ïŽŠïŽ§ïŽšïŽ©ïŽȘïŽ«ïŽŹïŽ­ïŽźïŽŻïŽ°ïŽ±ïŽČïŽłïŽŽïŽ”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "𝙖-𝙯": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" + - "-": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ïŽčïŽșïŽ»ïŽŒïŽœïŽŸïŽżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒïïŽï', 'abcdefghijklmnopqrstuvwxyz')" + - "𝙰-𝚉": + - spell: "translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "-": + - spell: "translate('.', 'ïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§ïšï©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "𝚊-𝚣": + - spell: "translate('.', '𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚱𝚣', 'abcdefghijklmnopqrstuvwxyz')" + - "ïȘ-": + - spell: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżï€ïï‚ïƒ', 'abcdefghijklmnopqrstuvwxyz')" + - "": [T: "sem ponto i"] + - "đš€": [T: "sem ponto i"] + - "đš„": [T: "sem ponto jota"] + - "-": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + - "ïą-ïș": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ïąïŁï€ï„ïŠï§ïšï©ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïș', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + - "ïĄ": [T: "em negrito nĂĄbela"] + - "𝛁": [T: "em negrito nĂĄbela"] + - "𝛛𝛜𝛝𝛞𝛟𝛠𝛡": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', '𝛛𝛜𝛝𝛞𝛟𝛠𝛡', '∂ΔΞÎșφρπ')" + - "ï»ïŒïœïŸïżï‘€ï‘": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ï»ïŒïœïŸïżï‘€ï‘', '∂ΔΞÎșφρπ')" + - "𝛱-đ›ș": + - spell: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›čđ›ș', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + - "-": + - spell: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + - "đ›Œ-𝜔": + - spell: "translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“đœ”', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + - "-": + - spell: "translate('.', 'ï‘œï‘ï‘žï‘Ÿï‘ ï‘Ąï‘ąï‘Łï‘€ï‘„ï‘Šï‘§ï‘šï‘©ï‘Șï‘«ï‘Źï‘­ï‘źï‘Żï‘°ï‘±ï‘Čï‘łï‘Ž', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + - "": [T: "itĂĄlico nĂĄbela"] + - "đ›»": [T: "itĂĄlico nĂĄbela"] + - "𝜕𝜖𝜗𝜘𝜙𝜚𝜛": + - spell: "translate('.', '𝜕𝜖𝜗𝜘𝜙𝜚𝜛', '∂ΔΞÎșφρπ')" + - "ï‘čï‘ș": + - spell: "translate('.', 'ï‘čï‘ș', '∂ΔΞÎșφρπ')" + - "-": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ï‘Œï‘œï‘Ÿï‘żï’€ï’ï’‚ï’ƒï’„ï’…ï’†ï’‡ï’ˆï’‰ï’Šï’‹ï’Œï’ï’Žï’ï’ï’‘ï’’ï’“ï’”', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + - "-ï’ź": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ï’–ï’—ï’˜ï’™ï’šï’›ï’œï’ï’žï’Ÿï’ ï’Ąï’ąï’Łï’€ï’„ï’Šï’§ï’šï’©ï’Șï’«ï’Źï’­ï’ź', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + - "𝝏𝝐𝝑𝝒𝝓𝝔𝝕": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', '𝝏𝝐𝝑𝝒𝝓𝝔𝝕', '∂ΔΞÎșφρπ')" + - "ï’Żï’°ï’±ï’Čï’łï’Žï’”": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ï’Żï’°ï’±ï’Čï’łï’Žï’”', '∂ΔΞÎșφρπ')" + - "đœ”": [T: "em negrito itĂĄlico nĂĄbela"] + - "": [T: "em negrito itĂĄlico nĂĄbela"] + - "𝝖-𝝼": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đź', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + - "-": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ï’¶ï’·ï’žï’čï’șï’»ï’Œï’œï’Ÿï’żï“€ï“ï“‚ï“ƒï“„ï“…ï“†ï“‡ï“ˆï“‰ï“Šï“‹ï“Œï“ï“Ž', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + - "𝝰-𝞈": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€đžđž‚đžƒđž„đž…đž†đž‡đžˆ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + - "-": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ï“ï“‘ï“’ï““ï“”ï“•ï“–ï“—ï“˜ï“™ï“šï“›ï“œï“ï“žï“Ÿï“ ï“Ąï“ąï“Łï“€ï“„ï“Šï“§ï“š', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + - "𝞉𝞊𝞋𝞌𝞍𝞎𝞏": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', '𝞉𝞊𝞋𝞌𝞍𝞎𝞏', '∂ΔΞÎșφρπ')" + - "ï“Șï“«ï“Źï“­ï“źï“Ż": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ï“Șï“«ï“Źï“­ï“źï“Ż', '∂ΔΞÎșφρπ')" + - "": [T: "em negrito nĂĄbela"] + - "𝝯": [T: "em negrito nĂĄbela"] + - "𝞐-𝞹": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + - "-": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ï“Čï“łï“Žï“”ï“¶ï“·ï“žï“čï“șï“»ï“Œï“œï“Ÿï“żï”€ï”ï”‚ï”ƒï”„ï”…ï”†ï”‡ï”ˆ', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + - "đžȘ-𝟂": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸđŸ‚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + - "-ï”ą": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ï”Šï”‹ï”Œï”ï”Žï”ï”ï”‘ï”’ï”“ï””ï”•ï”–ï”—ï”˜ï”™ï”šï”›ï”œï”ï”žï”Ÿï” ï”Ąï”ą', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + - "𝟃𝟄𝟅𝟆𝟇𝟈𝟉": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', '𝟃𝟄𝟅𝟆𝟇𝟈𝟉', '∂ΔΞÎșφρπ')" + - "ï”Łï”€ï”„ï”Šï”§ï”šï”©": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ï”Łï”€ï”„ï”Šï”§ï”šï”©', '∂ΔΞÎșφρπ')" + - "": [T: "em negrito nĂĄbela"] + - "đž©": [T: "em negrito nĂĄbela"] + - "ï”ź-": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'ï”źï”Żï”°ï”±ï”Čï”łï”Žï””ï”¶ï”·', '0123456789')" + - "𝟎-𝟗": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', '𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗', '0123456789')" + - "-": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', '', '0123456789')" + - "𝟬-đŸ”": + - test: + if: "not($IgnoreBold)" + then: [T: "negrito"] + - spell: "translate('.', 'đŸŹđŸ­đŸźđŸŻđŸ°đŸ±đŸČđŸłđŸŽđŸ”', '0123456789')" + - "-": + - spell: "translate('.', '', '0123456789')" + - "𝟱-đŸ«": + - spell: "translate('.', 'đŸąđŸŁđŸ€đŸ„đŸŠđŸ§đŸšđŸ©đŸȘđŸ«', '0123456789')" + - "đŸ¶-𝟿": + - spell: "translate('.', 'đŸ¶đŸ·đŸžđŸčđŸșđŸ»đŸŒđŸœđŸŸđŸż', '0123456789')" + - "": [T: "desconhecido caractere"] + - "": [T: "triĂąngulos inferior direita e inferior esquerda"] + - "": [T: "horizontal reticĂȘncias extensor"] + - "ïœź": [T: "linha mĂ©dia horizontal reticĂȘncias extensor"] + - "ïŁ„": [T: "radical extensor"] + - "ïŁŠ": [T: "seta vertical extensor"] + - "ïŁ§": [T: "seta horizontal extensor"] + - "ïŁš": [T: "registrado sinal sem serifa"] + - "ïŁ©": [T: "direitos autorais sinal sem serifa"] + - "ïŁȘ": [T: "marca registrada sinal sem serifa"] + - "ïŁ«": [T: "parĂȘntese superior Ă  esquerda"] + - "ïŁŹ": [T: "parĂȘntese extensor Ă  esquerda"] + - "ïŁ­": [T: "parĂȘntese inferior Ă  esquerda"] + - "ïŁź": [T: "colchete superior Ă  esquerda"] + - "ïŁŻ": [T: "colchete extensor Ă  esquerda"] + - "ïŁ°": [T: "colchete inferior Ă  esquerda"] + - "ïŁ±": [T: "chave superior Ă  esquerda"] + - "ïŁČ": [T: "chave mĂ©dio Ă  esquerda"] + - "ïŁł": [T: "chave inferior Ă  esquerda"] + - "ïŁŽ": [T: "chave extensor"] + - "ïŁ”": [T: "integral extensor"] + - "ïŁ¶": [T: "parĂȘntese superior Ă  direita"] + - "ïŁ·": [T: "parĂȘntese extensor Ă  direita"] + - "ïŁž": [T: "parĂȘntese inferior Ă  direita"] + - "ïŁč": [T: "colchete superior Ă  direita"] + - "ïŁș": [T: "colchete extensor Ă  direita"] + - "ïŁ»": [T: "colchete inferior Ă  direita"] + - "ïŁŒ": [T: "chave superior Ă  direita"] + - "ïŁœ": [T: "chave mĂ©dio Ă  direita"] + - "ïŁŸ": [T: "chave inferior Ă  direita"] + - "ïŁż": [T: "logo da apple"] + - "ïŹ€": [T: "ligadura ff"] + - "ïŹ": [T: "ligadura fi"] + - "ïŹ‚": [T: "ligadura fl"] + - "ïŹƒ": [T: "ligadura ffi"] + - "ïŹ„": [T: "ligadura ffl"] + - "ïŹ…": [T: "pĂ©s"] + - "ïŹ†": [T: "st"] + - "ïŹ©": [T: "letra hebraica alternativa mais"] + - "ïž ": [T: "ligadura esquerda metade"] + - "ïžĄ": [T: "ligadura direita metade"] + - "ïžą": [T: "til duplo esquerda metade"] + - "ïžŁ": [T: "til duplo direita metade"] + - "": [T: "mĂĄcron esquerda metade"] + - "ïž„": [T: "mĂĄcron direita metade"] + - "": [T: "conjugando mĂĄcron"] + - "ïž”": [T: "sobre parĂȘntese"] + - "ïž¶": [T: "sob parĂȘntese"] + - "ïž·": [T: "sobre chave"] + - "ïžž": [T: "sob chave"] + - "ïžż": [T: "sobre colchete angular"] + - "ïč€": [T: "sob colchete angular"] + - "ïčĄ": [T: "pequeno asterisco"] + - "ïčą": [T: "pequeno mais"] + - "ïčŁ": [T: "pequeno menos"] + - "ïč€": [T: "pequeno menor que"] + - "ïč„": [T: "pequeno maior que"] + - "ïčŠ": [T: "pequeno igual"] + - "": [T: "de largura total sinal de mais"] + - "": [T: "menor que"] + - "": [T: "igual"] + - "": [T: "maior que"] + - "": [T: "barra invertida"] + - "": [T: "chapĂ©u"] + - "": + - with: + variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) + replace: + - test: + - if: "$SpeechStyle != 'ClearSpeak'" + then_test: + if: "$DefaultToGiven" + then: [T: "dado"] + else: [T: "barra vertical"] + - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" + then: [T: "barra vertical"] + - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" + then: [T: "tal que"] + - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" + then: [T: "dado"] + - else: [T: "divide"] + - "": [T: "til"] + - "ïżą": [T: "nĂŁo"] + - "ïż©": [T: "seta para a esquerda"] + - "ïżȘ": [T: "seta para cima"] + - "ïż«": [T: "seta para a direita"] + - "ïżŹ": [T: "seta para baixo"] + - "ïżŒ": [T: "desconhecido ou ausente objeto"] + - "ïżœ": [T: "ausente caractere"] + - "🣑": [T: "Ă© em equilĂ­brio com"] + - "🣒": [T: "estĂĄ em equilĂ­brio deslocado para a direita com"] + - "🣓": [T: "estĂĄ em equilĂ­brio deslocado para a esquerda com"] +# ==== FIM DO RECUO CONTROLADO ==== diff --git a/Rules/Languages/pt/unicode.yaml b/Rules/Languages/pt/unicode.yaml new file mode 100644 index 000000000..64b3fb518 --- /dev/null +++ b/Rules/Languages/pt/unicode.yaml @@ -0,0 +1,571 @@ +--- + # Note to translators: + # most languages don't have two ways to pronounce 'a' -- if not need, remove the rules and change "B-Z" to "A-Z" + # some languages say the word for "uppercase" after the letter. Make sure to change that where appropriate by moving some code around + - "a-z": + - test: + if: "$TTS='none'" + then: [T: "."] + else: [spell: "'.'"] + - "A-Z": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "maiĂșscula"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + # note: processing of ranges converts '.' into the character, so it needs to be in quotes below + replace: [spell: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"] + + - "0-9": [T: "."] # (en: '.') + + - " ": [t: " "] # 0x20 + + - "!": # 0x21 + # Restaura a ramificação do inglĂȘs: dentro de :literal: Ă© pontuação, fora + # Ă© o operador. Sem isto, um ponto de exclamação literal Ă© lido "fatorial". + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then_test: + if: "$Verbosity = 'Terse'" + then: [T: "exclamação"] # (en: 'bang') + else: [T: "ponto de exclamação"] # (en: 'exclamation point') + else: [T: "fatorial"] # (en: 'factorial') + - "\"": [T: "aspas"] # 0x22 (en: 'quotation mark') + - "#": [T: "nĂșmero"] # 0x23 (en: 'number', MathPlayer: 'signo de nĂșmero', google: 'nĂșmero') + - "$": [T: "dĂłlares"] # 0x24 (en: 'dollars') + - "%": [T: "por cento"] # 0x25 (en: 'percent') + - "&": [T: "e comercial"] # 0x26 + - "'": [T: "apĂłstrofo"] # 0x27 (en: 'apostrophe', MathPlayer: 'apĂłstrofo', google: 'apĂłstrofe') + - "(": # 0x28 + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then_test: + if: "$Verbosity='Terse'" + then: [T: "abre parĂȘnteses"] # (en: 'open', google translation) + else: [T: "abre parĂȘnteses"] # (en: 'open paren', MathPlayer: 'parĂ©ntesis', google: 'parĂ©ntesis abierto') + else: [T: "abre parĂȘnteses"] # (en: 'left paren', MathPlayer: 'parĂ©ntesis', google: 'parĂ©ntesis dejado') + - ")": # 0x29 + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then_test: + if: "$Verbosity='Terse'" + then: [T: "fecha parĂȘnteses"] # (en: 'close', google translation) + else: [T: "fecha parĂȘnteses"] # (en: 'close paren', MathPlayer: 'cierra parĂ©ntesis', google: 'parĂ©ntesis cercana') + else: [T: "fecha parĂȘnteses"] # (en: 'right paren', MathPlayer: 'cierra parĂ©ntesis') + + - "*": # 0x2a + test: + if: "parent::*[name(.)='msup' or name(.)='msubsup']" + then: [T: "asterisco"] # (en: 'star', google translation) + else: [T: "vezes"] # (en: 'times') + - "+": [T: "mais"] # 0x2b (en: 'plus') + - ",": # 0x2c + # the following deals with the interaction of "," with "
" which sometimes wants the ',' to be silent + # that this test is here and not with "
" is not ideal, but seems simplest + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or " + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak "comma" when not adjacent to '
' + - "( following-sibling::*[1][text()!= '
'] and preceding-sibling::*[1][text()!='
'] ) or " + # except if expression starts with '
' + - "../*[1][.='
'] " + then: + - T: "vĂ­rgula" # (en: 'comma', google translation) + - test: + if: "$Verbosity != Terse" + then: [pause: short] + # else silent + + - "-": [T: "menos"] # 0x2d (en: 'minus') + - ".": # 0x2e + - test: + if: "parent::*[1][self::m:mn]" + then: [T: "ponto"] # (en: 'point', google translation) + else: [T: "ponto"] # (en: 'dot') + - "/": [T: "barra"] # 0x2f (en: 'divided by') + - ":": [T: "dois pontos"] # 0x3a (en: 'colon') + - ";": [T: "ponto e vĂ­rgula"] # 0x3b (en: 'semicolon') + - "<": # 0x3c + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] # (en: 'is', google translation) + - T: "menor que" # (en: 'less than') + - "=": # 0x3d + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă© igual a"] # (en: 'is equal to', google translation) + else: [T: "igual a"] # (en: 'equals', google: 'iguales') + + - ">": # 0x3e + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] # (en: 'is', google translation) + - T: "maior que" # (en: 'greater than') + - "?": [T: "ponto de interrogação"] # 0x3f (en: 'question mark', MathPlayer: 'cierra interrogaciĂłn', google: 'signo de interrogaciĂłn') + - "@": [T: "arroba"] # 0x40 (en: 'at sign') + - "[": # 0x5b + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "abre colchetes"] # (en: 'open bracket', google translation) + else: [T: "abre colchetes"] # (en: 'left bracket', MathPlayer: 'abre corchetes', google: 'soporte izquierdo') + - "\\": [T: "barra invertida"] # 0x5c (en: 'back slash', MathPlayer: 'abre corchetes', google: 'back slash') + - "]": # 0x5d + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "fecha colchetes"] # (en: 'close bracket', google translation) + else: [T: "fecha colchetes"] # (en: 'right bracket', MathPlayer: 'cierra corchetes', google: 'soporte derecho') + # NOTA: o inglĂȘs distingue 'hat' (ornamento sobre variĂĄvel) de 'caret' + # (o sĂ­mbolo isolado). O portuguĂȘs usa "circunflexo" nos dois casos, entĂŁo + # o teste contextual seria redundante e foi omitido de propĂłsito. + - "^": [T: "circunflexo"] # 0x5e (en: 'hat' / 'caret') + - "_": [T: "sublinhado"] # 0x5f (en: 'under bar') + - "`": [T: "acento grave"] # 0x60 (en: 'grave') + - "{": # 0x7b + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "abre chaves"] # (en: 'open brace', google translation) + else: [T: "abre chaves"] # (en: 'left brace', MathPlayer: 'abre llaves', google: 'abrazadera izquierda') + - "|": # 0x7c + # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' + # CORREÇÃO: a versĂŁo anterior era uma simplificação da regra inglesa e perdia + # trĂȘs casos: P(A|B) ("dado"), a|b entre nĂșmeros ("divide") e o intent literal. + # Fora do ClearSpeak tudo caĂ­a em "barra vertical". + - with: + variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) + replace: + - test: + - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "barra vertical"] # (en: 'vertical line') + - else_if: "$SpeechStyle != 'ClearSpeak'" + then_test: + - if: "$DefaultToGiven" + then: [T: "dado"] # (en: 'given') + - else_if: "preceding-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))] and + following-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))]" + then: [T: "divide"] # (en: 'divides') + else: [T: "barra vertical"] # (en: 'vertical line') + - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" + then: [T: "barra vertical"] # (en: 'vertical line') + - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" + then: [T: "tal que"] # (en: 'such that') + - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" + then: [T: "dado"] # (en: 'given') + - else: [T: "divide"] # (en: 'divides') + + - "}": # 0x7d + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "fecha chaves"] # (en: 'close brace', google translation) + else: [T: "fecha chaves"] # (en: 'right brace', MathPlayer: 'cierra llaves', google: 'abrazadera derecha') + + - "~": [T: "til"] # 0x7e + - " ": # 0xa0 + - test: + if: "@data-empty-in-2D" + then: [T: "vazio"] # want to say something for fraction (etc) with empty child (en: 'empty', google translation) + else: [T: ""] + + - "Âą": [T: "centavos"] # 0xa2 (en: 'cents') + - "ÂŁ": [T: "libras"] # 0xa3 (en: 'pounds') + - "ÂŹ": [T: "nĂŁo"] # 0xac (en: 'not') + - "°": [T: "graus"] # 0xb0 (en: 'degrees') + - "±": [T: "mais ou menos"] # 0xb1 (en: 'plus or minus') + - "ÂŽ": [T: "acento agudo"] # 0xb4 (en: 'acute') + - "·": # 0xB7 + - test: + if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolDot = 'Auto'" + then_test: + if: "$Verbosity = 'Verbose'" + then: [T: "multiplicado por"] # (en: 'times', google translation) + else: [T: "vezes"] + else: [T: "vezes"] # (en: 'dot') + - "×": # 0xd7 + - test: + if: "$Verbosity = 'Verbose'" + then: [T: "multiplicado por"] # (en: 'times', google translation) + else: [T: "vezes"] + - "Ă·": [T: "dividido por"] # 0xf7 (en: 'divided by') + - "̀": [T: "acento grave"] # 0x300 (en: 'grave accent embellishment', google: 'embellido de acento grave') + - "́": [T: "com acento agudo"] # 0x301 (en: 'acute accent embellishment', google: 'embellido de acento agudo') + - "̂": [T: "com acento circunflexo"] # 0x302 (en: 'circumflex accent embellishment', google: 'embellamiento del acento circunflejo') + - "̃": [T: "til"] # 0x303 (en: 'tilde embellishment', google: 'tilde adorno') + - "̄": [T: "com mĂĄcron"] # 0x304 (en: 'macron embellishment', google: 'embellido de macron') + - "̅": [T: "com barra acima"] # 0x305 (en: 'overbar embellishment', google: 'embellido de overbar') + - "̆": [T: "breve"] # 0x306 + - "̇": [T: "ponto acima"] # 0x307 (en: 'dot above embellishment', google: 'punto por encima del adorno') + + # Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong + - "Α-Ω": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "maiĂșscula"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + # note: processing of ranges converts '.' into the character, so it needs to be in quotes below + replace: [spell: "translate('.', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')"] + + - "α": [T: "alfa"] # 0x3b1 (en: 'alpha') + - "ÎČ": [T: "beta"] # 0x3b2 + - "Îł": [T: "gama"] # 0x3b3 (google: 'gama') + - "ÎŽ": [T: "delta"] # 0x3b4 + - "Δ": [T: "Ă©psilon"] # 0x3b5 (en: 'epsilon', google: 'epsilon') + - "ζ": [T: "zeta"] # 0x3b6 + - "η": [T: "eta"] # 0x3b7 + - "Ξ": [T: "teta"] # 0x3b8 + - "Îč": [T: "iota"] # 0x3b9 + - "Îș": [T: "capa"] # 0x3ba + - "λ": [T: "lambda"] # 0x3bb + - "ÎŒ": [T: "mi"] # 0x3bc (en: 'mu', google: 'mu') + - "Μ": [T: "ni"] # 0x3bd (en: 'nu', google: 'nu') + - "Ο": [T: "csi"] # 0x3be (en: 'zai', google: 'zai') + - "Îż": [T: "ĂŽmicron"] # 0x3bf (en: 'omicron', google: 'omicron') + - "π": [T: "pi"] # 0x3c0 + - "ρ": [T: "rĂŽ"] # 0x3c1 + - "ς": [T: "sigma final"] # 0x3c2 (en: 'final sigma', google: 'final sigma') + - "σ": [T: "sigma"] # 0x3c3 + - "τ": [T: "tau"] # 0x3c4 + - "υ": [T: "Ășpsilon"] # 0x3c5 (en: 'upsilon', google: 'upsilon') + - "φ": [T: "fi"] # 0x3c6 (google: 'fi') + - "χ": [T: "qui"] # 0x3c7 (en: 'chi', google: 'chi') + - "ψ": [T: "psi"] # 0x3c8 + - "ω": [T: "ĂŽmega"] # 0x3c9 + - "ϕ": [T: "fi reto"] # 0x3d5 (en: 'phi', google: 'fi') + - "ϖ": [T: "pi variante"] # 0x3d6 (en: 'pi', google: 'pi') + - "Ï”": [T: "Ă©psilon variante"] # 0x3f5 (en: 'epsilon', google: 'epsilon') + - "϶": [T: "Ă©psilon invertido"] # 0x3f6 (en: 'reversed epsilon') + + - "⁹": [T: ""] # 0x2062 + - "ℂℕℚℝ℀": # here we rely on this running through the table again to speak "cap xxx" + # Adjetivo de estilo POSPOSTO (decisĂŁo 8.1): o spell: vem primeiro. + - spell: "translate('.', 'ℂℕℚℝ℀', 'CNQRZ')" + - T: "vazado" # (en: 'double-struck', google: 'doble golpe') + + - "℃": [T: "graus Celsius"] # 0x2103 (en: 'degrees celsius', google: 'grados celsius') + - "ℋℛℓ": # 0x210b + # 'caligrĂĄfico', nĂŁo 'cursivo': termo Ășnico da famĂ­lia script, igual ao + # que o unicode-full.yaml usa (ℐ ℒ ℘ ℬ ℰ ℱ ℳ). t: minĂșsculo porque a + # escolha entre os dois ainda depende de escuta — ver ACHADOS 7.8. + - spell: "translate('.', 'ℋℛℓ', 'HRl')" + - t: "caligrĂĄfico" # (en: 'script', google: 'guion') + - "ℜ": # 0x211c + # 'fraktur', nĂŁo 'gĂłtico': termo Ășnico da famĂ­lia, igual ao + # unicode-full.yaml (ℑ ℌ ℹ ℭ e os blocos do plano 1). t: minĂșsculo. + - spell: "'R'" + - t: "fraktur" # (en: 'fraktur', google: 'fraktur') + + - "ⅆⅇⅈⅉ": # 0x2146-9 + - spell: "translate('.', 'ⅆⅇⅈⅉ', 'deij')" + - T: "vazado itĂĄlico" # (en: 'double-struck italic') + + - "∄": # 0x2225 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] # (en: 'is', google translation) + - T: "paralela a" # (en: 'parallel to') + - "∊": # 0x2226 + # audit-ignore: em portuguĂȘs a negação jĂĄ Ă© frase completa; o "is" do inglĂȘs + # nĂŁo tem par que valha suprimir no Terse. Com o ramo "Ă©" a fala saĂ­a + # "Ă© nĂŁo Ă© paralela a". Mesmo tratamento que ≱, ≇, ⊈ e ⊉. + - T: "nĂŁo Ă© paralela a" # (en: 'not parallel to') + - "≀": # 0x2264 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] # (en: 'is', google translation) + - T: "menor ou igual a" + - "≄": # 0x2265 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] # (en: 'is', google translation) + - T: "maior ou igual a" # (en: 'greater than or equal to') + + # --- restored complex short definitions (prefer over unicode-full) --- + - "
": # 0x2026 + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak '
' as 'and so on...' unless expr starts with '
' + - "../*[1][.='
']" + then: [T: "reticĂȘncias"] # (en: 'dot dot dot', google translation) + else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' + if: "count(following-sibling::*) = 0" + then: [T: "etcĂ©tera"] # (en: 'and so on', google translation) + else: [T: "reticĂȘncias"] # (en: 'and so on up to', MathPlayer: 'punto punteado punteado', google: 'y asĂ­ sucesivamente') + - "⁥": # 0x2061 + - test: + # skip saying "of" when Terse and a trig function, when it is a shape (does this happen?), or we are in :literal mode + if: "not( + ( $Verbosity='Terse' or ($SpeechStyle = 'ClearSpeak' and IsNode(following-sibling::*[1],'simple')) and + preceding-sibling::*[1][IfThenElse($SpeechStyle='ClearSpeak', + IsInDefinition(., 'ClearSpeakTrigFunctionNames'), + IsInDefinition(., 'TrigFunctionNames') )] + ) or + preceding-sibling::*[1][IsInDefinition(., 'GeometryShapes')] or + (@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) + )" + then: [T: "de"] # (en: 'of', google translation) + - "→": # 0x2192 + - test: + if: "ancestor::*[2][self::m:limit]" + then: [T: "tende a"] # (en: 'approaches') + else: [T: "seta para a direita"] # (en: 'right arrow', MathPlayer: 'flecha', google: 'flecha correcta') + - "∂": # 0x2202 + - test: + if: "$Verbosity='Terse'" + then: [T: "parcial"] # (en: 'partial', google translation) + else: [T: "derivada parcial"] # (en: 'partial derivative') + - "∆": # 0x2206 + - test: + if: "$Verbosity!='Terse'" + then: [T: "o"] # (en: 'the', google translation) + - T: "incremento" # (en: 'laplacian of') + - "∈": # 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + # TambĂ©m aqui o ramo dentro de um conjunto precisa do particĂ­pio: uma + # string sĂł para os dois contextos daria "o conjunto de todos os x + # pertence a inteiros", com o verbo grudando em "conjunto". + then_test: + if: "../../self::m:set or ../../../self::m:set" + then: [T: "pertencentes a"] + else: [T: "pertence a"] # (en: 'an element of'; uso brasileiro corrente) + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + # DENTRO de um conjunto a expressĂŁo modifica "todos os x": nada de + # verbo finito (grudaria em "conjunto") e concordĂąncia no plural. + # É o que o inglĂȘs faz com 'in / member of / element of / belonging to'. + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "em"] # (en: 'in', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "membros de"] # (en: 'member of'; plural concorda com "todos os x") + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "elementos de"] # (en: 'element of'; plural concorda com "todos os x") + - else: [T: "pertencentes a"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') + else_test: + # Auto separado de Member, como o ∉ jĂĄ tinha: com as preferĂȘncias + # padrĂŁo ($ClearSpeak_SetMemberSymbol = 'Auto') o brasileiro + # corrente Ă© "pertence a". Ver ACHADOS 7.8. + - if: $ClearSpeak_SetMemberSymbol = 'Auto' + then: [T: "pertence a"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "Ă© membro de"] # (en: 'is a member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "Ă© um elemento de"] # (en: 'is an element of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "estĂĄ em"] # (en: 'is in', google translation) + - else: [T: "pertence a"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') + - "∉": # 0x2209 + # rule is identical to 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then_test: + if: "../../self::m:set or ../../../self::m:set" + then: [T: "nĂŁo pertencentes a"] + else: [T: "nĂŁo pertence a"] # (en: 'is not an element of'; uso brasileiro) + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + # Idem ao 0x2208: sem verbo finito, concordando com "todos os x". + # "nĂŁo em" Ă© truncado ("nĂŁo" nĂŁo nega preposição nua) e "fora de" + # troca o conceito (afirma localização em vez de negar pertinĂȘncia, + # ambĂ­guo com complementar). Fica a forma nominal da negação, que + # coincide com o ramo Belongs — decisĂŁo registrada em + # TERMINOLOGIA_PT_BR.md e ACHADOS 7.9. + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "nĂŁo pertencentes a"] # (en: 'not in') + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "nĂŁo membros de"] # (en: 'not member of') + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "nĂŁo elementos de"] # (en: 'not element of') + - else: [T: "nĂŁo pertencentes a"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'not belonging to') + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' + then: [T: "nĂŁo pertence a"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "nĂŁo Ă© membro de"] # (en: 'is not a member of') + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "nĂŁo Ă© um elemento de"] # (en: 'is not an element of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + # Era "nĂŁo estĂĄ contido em", que Ă© exatamente a fala do ⊄ + # (ver 0x2284): duas relaçÔes distintas soavam iguais. Agora + # espelha o "estĂĄ em" do ∈ e o que o prĂłprio ∉ diz num conjunto. + then: [T: "nĂŁo estĂĄ em"] # (en: 'is not in', google translation) + - else: [T: "nĂŁo pertence a"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'does not belong to') + - "∊": # 0x220a + # variante de forma do 0x2208: fala igual ao ∈ em todos os ramos. + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then_test: + if: "../../self::m:set or ../../../self::m:set" + then: [T: "pertencentes a"] + else: [T: "pertence a"] # alinhado ao ∈ (era "Ă© um elemento de") + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + # DENTRO de um conjunto a expressĂŁo modifica "todos os x": nada de + # verbo finito (grudaria em "conjunto") e concordĂąncia no plural. + # É o que o inglĂȘs faz com 'in / member of / element of / belonging to'. + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "em"] # (en: 'in', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "membros de"] # (en: 'member of'; plural concorda com "todos os x") + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "elementos de"] # (en: 'element of'; plural concorda com "todos os x") + - else: [T: "pertencentes a"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') + else_test: + # Auto separado de Member, igual ao ∈ e ao ∉. Ver ACHADOS 7.8. + - if: $ClearSpeak_SetMemberSymbol = 'Auto' + then: [T: "pertence a"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "Ă© membro de"] # (en: 'is a member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "Ă© um elemento de"] # (en: 'is an element of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "estĂĄ em"] # (en: 'is in', google translation) + - else: [T: "pertence a"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') + - "√": # 0x221a + - test: + if: "$Verbosity!='Terse'" + then: [T: "a"] # (en: 'the', google translation) + - T: "raiz quadrada de" # (en: 'square root of') + - "∝": # 0x221d + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] # (en: 'is', google translation) + - T: "proporcional a" # (en: 'proportional to') + - "∶": # 0x2236 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] # (en: 'is', google translation) + - T: "a" # (en: 'to') + - "∟": # 0x223e + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] # (en: 'is', google translation) + - T: "mais positivo" # (en: 'most positive') + - "≠": # 0x2260 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # ("diferente de" jĂĄ dispensa a cĂłpula) + - T: "diferente de" # (en: 'not equal to'; MathPlayer sugeria 'distinto de' e o algoritmo escolheu a do Google) + - "≡": # 0x2261 + - test: + if: "$Verbosity!='Terse'" + then: [T: "Ă©"] # (en: 'is', google translation) + - T: "idĂȘntico a" # (en: 'identical to') + - "⊂": # 0x2282 + - test: + if: "$Verbosity!='Terse'" + then: [T: "estĂĄ"] # (en: 'is a'; "estĂĄ contido em" Ă© o uso brasileiro) + - T: "contido em" # (en: 'subset of') + - "⊃": # 0x2283 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is a'; "contĂ©m" jĂĄ Ă© verbo) + - T: "contĂ©m" # (en: 'superset of') + - "⊄": # 0x2284 + - test: + if: "$Verbosity!='Terse'" + then: [T: "nĂŁo"] # (coerente com ⊂: "nĂŁo estĂĄ contido em") + - T: "estĂĄ contido em" # (en: 'not a subset of') + - "⊅": # 0x2285 + - test: + if: "$Verbosity!='Terse'" + then: [T: "nĂŁo"] # (coerente com ⊃) + - T: "contĂ©m" # (en: 'not a superset of') + - "⊆": # 0x2286 + - test: + if: "$Verbosity!='Terse'" + then: [T: "estĂĄ"] # (coerente com ⊂) + - T: "contido em ou Ă© igual a" # (en: 'subset of or equal to') + - "⊇": # 0x2287 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (coerente com ⊃) + - T: "contĂ©m ou Ă© igual a" # (en: 'superset of or equal to') + + # --- restored short definitions that differ from unicode-full --- + - "–": [T: "meia-risca"] # 0x2013 (en: 'en dash') + - "—": [T: "travessĂŁo"] # 0x2014 (en: 'em dash') + - "‖": [T: "barra vertical dupla"] # 0x2016 (en: 'double vertical line') + - "″": [T: "duas linhas"] # 0x2033 (en: 'double prime', MathPlayer: 'segunda', google: 'doble primo') + - "‮": [T: "trĂȘs linhas"] # 0x2034 (en: 'triple prime', MathPlayer: 'tercera', google: 'triple prime') + - "—": [T: "linha invertida"] # 0x2035 (en: 'reversed prime') + - "‶": [T: "duas linhas invertidas"] # 0x2036 (en: 'reversed double prime') + - "‷": [T: "trĂȘs linhas invertidas"] # 0x2037 (en: 'reversed triple prime', google: 'triple prime invertido') + - "℉": [T: "graus Fahrenheit"] # 0x2109 (en: 'degrees fahrenheit') + - "ℎ": [T: "constante de Planck"] # 0x210e (en: 'planck constant', MathPlayer: 'constante de Planck', google: 'planck constante') + - "â„Ș": [T: "kelvin"] # 0x212a (en: 'kelvin') + - "←": [T: "seta para a esquerda"] # 0x2190 (en: 'leftwards arrow') + - "↑": [T: "seta para cima"] # 0x2191 (en: 'upwards arrow') + - "↓": [T: "seta para baixo"] # 0x2193 (en: 'downwards arrow') + - "⇒": [T: "implica que"] # 0x21d2 (en: 'rightwards double arrow') + - "∘": [T: "composto com"] # 0x2218 (en: 'composed with') + - "∣": # 0x2223 (en: 'divides') + # O latex2mathml emite \mid como U+2223, nĂŁo como "|". Em P(A ∣ B) Ă© + # "dado" — mesma condição de contexto da regra do "|" (0x7c). Fora disso, + # continua "divide" (a ∣ b entre inteiros). Ver ACHADOS 9.6. + - test: + if: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']" + then: [T: "dado"] # (en: 'given') + else: [T: "divide"] + - "∀": [T: "nĂŁo divide"] # 0x2224 (en: 'does not divide') + - "∷": [T: "como"] # 0x2237 (en: 'as') + - "∌": [T: "varia com"] # 0x223c (en: 'varies with') + - "∜": [T: "til invertido"] # 0x223d (en: 'reversed tilde') + - "∿": [T: "onda senoidal"] # 0x223f (en: 'sine wave') + - "≩": [T: "menor ou igual a"] # 0x2266 (en: 'less than over equal to') + - "≧": [T: "maior ou igual a"] # 0x2267 (en: 'greater than over equal to') + +# --- ACRÉSCIMOS pt (nĂŁo existiam no es e caĂ­am no unicode-full em inglĂȘs) --- + - "â‰Ș": [T: "Ă© muito menor que"] # 0x226a (en: 'much less than') + - "≫": [T: "Ă© muito maior que"] # 0x226b (en: 'much greater than') + - "⊄": [T: "Ă© perpendicular a"] # 0x22a5 (en: 'perpendicular to') +# Ornamentos usados em variĂĄveis modificadas (x com trema = 2a derivada): + - "̌": [T: "cĂĄron"] # 0x030c (en: 'caron embellishment') + - "̈": [T: "dois pontos"] # 0x0308 (en: 'double dot above') + - "⃛": [T: "trĂȘs pontos acima"] # 0x20db (en: 'triple dot above') + - "⃜": [T: "quatro pontos acima"] # 0x20dc (en: 'quadruple dot above') + - "⁀": [T: "e"] # 0x2064 (invisible plus — "dois e um meio"); FALTAVA em pt + - "∐": [T: "coproduto"] # 0x2210 (en: 'co-product'); FALTAVA em pt + - "⁣": [T: ""] # 0x2063 (invisible separator — silencioso) + - "â€Č": [T: "linha"] # 0x2032 (en: 'prime') + - "↗": # 0x2197 + - test: + if: "ancestor::*[2][self::m:limit]" + then: [T: "tende por baixo a"] + else: [T: "seta para nordeste"] + - "↘": # 0x2198 + - test: + if: "ancestor::*[2][self::m:limit]" + then: [T: "tende por cima a"] + else: [T: "seta para sudeste"] + - "˙": [T: "ponto"] # 0x02d9 (dot above) + - "š": [T: "dois pontos"] # 0x00a8 (diaeresis / 2a derivada) diff --git a/tests/Languages/pt.rs b/tests/Languages/pt.rs new file mode 100644 index 000000000..dac447ebd --- /dev/null +++ b/tests/Languages/pt.rs @@ -0,0 +1,17 @@ +#![allow(non_snake_case)] +// MĂłdulo de testes do idioma pt (portuguĂȘs). +// IMPORTANTE: acrescente `mod pt;` em tests/languages.rs para ativar. +mod ClearSpeak { + mod sets; +} +mod SimpleSpeak { + mod functions; +} +mod shared; +mod chemistry; +mod alphabets; +mod intent; +mod units; +mod unicode_full; +mod escuta; // gerador do pacote de escuta (#[ignore]) + diff --git a/tests/Languages/pt/ClearSpeak/sets.rs b/tests/Languages/pt/ClearSpeak/sets.rs new file mode 100644 index 000000000..ff2ee45cd --- /dev/null +++ b/tests/Languages/pt/ClearSpeak/sets.rs @@ -0,0 +1,398 @@ +/// Testes de conjuntos e pertinĂȘncia — pt-BR, ClearSpeak e SimpleSpeak. +/// +/// POR QUE ESTE ARQUIVO EXISTE +/// O par ∈ / ∊ falou "Ă© membro de" com as preferĂȘncias padrĂŁo durante duas +/// rodadas inteiras sem ninguĂ©m notar, porque o pt nĂŁo tinha NENHUM teste de +/// pertinĂȘncia — nem ClearSpeak, nem SimpleSpeak. O ∉ foi corrigido sozinho +/// numa rodada e os outros dois ficaram para trĂĄs. Ver ACHADOS 7.8. +/// +/// A invariante que este arquivo trava: **∈ (0x2208) e ∊ (0x220a) sĂŁo +/// variantes de forma do mesmo sĂ­mbolo e devem falar igual em todos os ramos** +/// — nas cinco preferĂȘncias de ClearSpeak_SetMemberSymbol, dentro e fora de +/// um conjunto, nos dois estilos de fala. +/// +/// COMO AS EXPECTATIVAS FORAM ESCRITAS +/// Todas saĂ­ram da saĂ­da real do motor, nunca de tradução do inglĂȘs. O mĂ©todo +/// Ă© o do cabeçalho de tests/Languages/pt/shared.rs: rodar, comparar `left` +/// com `right`, e se o gerado estiver certo em portuguĂȘs, copiĂĄ-lo; se estiver +/// errado, consertar a REGRA, nunca o teste. +/// +/// Cada teste de pertinĂȘncia fixa ClearSpeak_SetMemberSymbol explicitamente, +/// inclusive no caso 'Auto'. Isso Ă© de propĂłsito: as preferĂȘncias de +/// ClearSpeak nĂŁo sĂŁo reinicializadas entre testes na mesma thread, entĂŁo um +/// teste que dependesse do padrĂŁo implĂ­cito poderia passar ou falhar conforme +/// a ordem de execução. + +use crate::common::*; +use anyhow::Result; + +// x ℝ — pertinĂȘncia FORA de um conjunto (ramo else_test das regras) +fn sozinho(simbolo: &str) -> String { + format!("x{simbolo}ℝ") +} + +// { x â„€ : x > 5 } — pertinĂȘncia DENTRO de um conjunto (ramo then_test) +fn no_conjunto(simbolo: &str) -> String { + format!(" + {{ + x {simbolo} â„€ + : x > 5 + }} + ") +} + +const PERTENCE: &str = "\u{2208}"; // ∈ +const NAO_PERTENCE: &str = "\u{2209}"; // ∉ +const PERTENCE_PEQ: &str = "\u{220A}"; // ∊ — variante de forma do 0x2208 + +/// ∈ e ∊ tĂȘm de falar igual. É o caso que sobreviveu duas rodadas. +fn ambas_variantes(pref: &str, expr: fn(&str) -> String, esperado: &str) -> Result<()> { + test_ClearSpeak("pt", "ClearSpeak_SetMemberSymbol", pref, &expr(PERTENCE), esperado)?; + test_ClearSpeak("pt", "ClearSpeak_SetMemberSymbol", pref, &expr(PERTENCE_PEQ), esperado)?; + return Ok(()); +} + +// --------------------------------------------------------------------------- +// Conjuntos numĂ©ricos +// --------------------------------------------------------------------------- + +#[test] +fn complexos() -> Result<()> { + test("pt", "ClearSpeak", "ℂ", "nĂșmeros complexos")?; + return Ok(()); +} + +#[test] +fn naturais() -> Result<()> { + test("pt", "ClearSpeak", "ℕ", "nĂșmeros naturais")?; + return Ok(()); +} + +#[test] +fn racionais() -> Result<()> { + test("pt", "ClearSpeak", "ℚ", "nĂșmeros racionais")?; + return Ok(()); +} + +#[test] +fn reais() -> Result<()> { + test("pt", "ClearSpeak", "ℝ", "nĂșmeros reais")?; + return Ok(()); +} + +// Sem "nĂșmeros", diferente dos quatro acima. O inglĂȘs tem a mesma assimetria +// ("the integers" contra "the complex numbers"), entĂŁo isto acompanha o en. +#[test] +fn inteiros() -> Result<()> { + test("pt", "ClearSpeak", "â„€", "inteiros")?; + return Ok(()); +} + +#[test] +fn conjuntos_numericos_iguais_em_simplespeak() -> Result<()> { + test("pt", "SimpleSpeak", "ℂ", "nĂșmeros complexos")?; + test("pt", "SimpleSpeak", "ℕ", "nĂșmeros naturais")?; + test("pt", "SimpleSpeak", "ℚ", "nĂșmeros racionais")?; + test("pt", "SimpleSpeak", "ℝ", "nĂșmeros reais")?; + test("pt", "SimpleSpeak", "â„€", "inteiros")?; + return Ok(()); +} + +// --------------------------------------------------------------------------- +// Conjunto vazio, por extensĂŁo, por compreensĂŁo +// --------------------------------------------------------------------------- + +#[test] +fn conjunto_vazio_por_chaves() -> Result<()> { + test("pt", "ClearSpeak", "{ }", "o conjunto vazio")?; + test("pt", "SimpleSpeak", "{ }", "o conjunto vazio")?; + return Ok(()); +} + +// Sem artigo, ao contrĂĄrio das chaves vazias acima. O en faz a mesma distinção +// ('empty set' para ∅, 'the empty set' para {}), entĂŁo isto acompanha o en. +#[test] +fn conjunto_vazio_por_simbolo() -> Result<()> { + test("pt", "ClearSpeak", "∅", "conjunto vazio")?; + test("pt", "SimpleSpeak", "∅", "conjunto vazio")?; + return Ok(()); +} + +#[test] +fn extensao_um_elemento() -> Result<()> { + let expr = "{ 12 }"; + test("pt", "ClearSpeak", expr, "o conjunto 12")?; + test("pt", "SimpleSpeak", expr, "o conjunto 12")?; + return Ok(()); +} + +#[test] +fn extensao_varios_elementos() -> Result<()> { + let expr = " + { 5 , 10 , 15 } + "; + test("pt", "ClearSpeak", expr, "o conjunto 5 vĂ­rgula, 10 vĂ­rgula, 15")?; + test("pt", "SimpleSpeak", expr, "o conjunto 5 vĂ­rgula, 10 vĂ­rgula, 15")?; + return Ok(()); +} + +#[test] +fn compreensao_com_dois_pontos() -> Result<()> { + let expr = " + { x:x>2 } + "; + test("pt", "ClearSpeak", expr, "o conjunto de todos os x tal que x Ă© maior que 2")?; + return Ok(()); +} + +// A barra vertical tem de falar igual aos dois pontos. +#[test] +fn compreensao_com_barra() -> Result<()> { + let expr = " + { x|x>2 } + "; + test("pt", "ClearSpeak", expr, "o conjunto de todos os x tal que x Ă© maior que 2")?; + test("pt", "SimpleSpeak", expr, "o conjunto de todos os x tal que x Ă© maior que 2")?; + return Ok(()); +} + +// --------------------------------------------------------------------------- +// UniĂŁo e interseção +// --------------------------------------------------------------------------- + +#[test] +fn uniao() -> Result<()> { + let expr = "AâˆȘB"; + test("pt", "ClearSpeak", expr, "maiĂșscula a uniĂŁo maiĂșscula b")?; + test("pt", "SimpleSpeak", expr, "maiĂșscula a uniĂŁo maiĂșscula b")?; + return Ok(()); +} + +#[test] +fn intersecao() -> Result<()> { + let expr = "A∩B"; + test("pt", "ClearSpeak", expr, "maiĂșscula a interseção maiĂșscula b")?; + test("pt", "SimpleSpeak", expr, "maiĂșscula a interseção maiĂșscula b")?; + return Ok(()); +} + +// --------------------------------------------------------------------------- +// PertinĂȘncia FORA de um conjunto — as cinco preferĂȘncias +// --------------------------------------------------------------------------- + +#[test] +fn pertinencia_auto() -> Result<()> { + ambas_variantes("Auto", sozinho, "x pertence a nĂșmeros reais") +} + +#[test] +fn pertinencia_member() -> Result<()> { + ambas_variantes("Member", sozinho, "x Ă© membro de nĂșmeros reais") +} + +#[test] +fn pertinencia_element() -> Result<()> { + ambas_variantes("Element", sozinho, "x Ă© um elemento de, nĂșmeros reais") +} + +#[test] +fn pertinencia_belongs() -> Result<()> { + ambas_variantes("Belongs", sozinho, "x pertence a nĂșmeros reais") +} + +#[test] +fn pertinencia_in() -> Result<()> { + ambas_variantes("In", sozinho, "x estĂĄ em nĂșmeros reais") +} + +// --------------------------------------------------------------------------- +// PertinĂȘncia DENTRO de um conjunto — as cinco preferĂȘncias +// --------------------------------------------------------------------------- + +#[test] +fn pertinencia_no_conjunto_auto() -> Result<()> { + ambas_variantes("Auto", no_conjunto, + "o conjunto de todos os x em inteiros tal que x Ă© maior que 5") +} + +#[test] +fn pertinencia_no_conjunto_member() -> Result<()> { + ambas_variantes("Member", no_conjunto, + "o conjunto de todos os x membros de inteiros tal que x Ă© maior que 5") +} + +#[test] +fn pertinencia_no_conjunto_element() -> Result<()> { + ambas_variantes("Element", no_conjunto, + "o conjunto de todos os x elementos de inteiros tal que x Ă© maior que 5") +} + +// Auto e In coincidem dentro de um conjunto, como no inglĂȘs ('Auto or In'). +#[test] +fn pertinencia_no_conjunto_in() -> Result<()> { + ambas_variantes("In", no_conjunto, + "o conjunto de todos os x em inteiros tal que x Ă© maior que 5") +} + +// --------------------------------------------------------------------------- +// NĂŁo-pertinĂȘncia +// --------------------------------------------------------------------------- + +#[test] +fn nao_pertinencia_auto() -> Result<()> { + test_ClearSpeak("pt", "ClearSpeak_SetMemberSymbol", "Auto", + &sozinho(NAO_PERTENCE), "x nĂŁo pertence a nĂșmeros reais")?; + return Ok(()); +} + +#[test] +fn nao_pertinencia_member() -> Result<()> { + test_ClearSpeak("pt", "ClearSpeak_SetMemberSymbol", "Member", + &sozinho(NAO_PERTENCE), "x nĂŁo Ă© membro de, nĂșmeros reais")?; + return Ok(()); +} + +#[test] +fn nao_pertinencia_element() -> Result<()> { + test_ClearSpeak("pt", "ClearSpeak_SetMemberSymbol", "Element", + &sozinho(NAO_PERTENCE), "x nĂŁo Ă© um elemento de, nĂșmeros reais")?; + return Ok(()); +} + +#[test] +fn nao_pertinencia_belongs() -> Result<()> { + test_ClearSpeak("pt", "ClearSpeak_SetMemberSymbol", "Belongs", + &sozinho(NAO_PERTENCE), "x nĂŁo pertence a nĂșmeros reais")?; + return Ok(()); +} + +// Auto e In coincidem na negação tambĂ©m, como no positivo. E aqui coincidem +// tambĂ©m com Belongs: "nĂŁo em" Ă© truncado e "fora de" troca o conceito +// (localização, nĂŁo pertinĂȘncia), entĂŁo a negação nominal Ă© uma sĂł. +// Ver TERMINOLOGIA_PT_BR.md. +#[test] +fn nao_pertinencia_no_conjunto_auto() -> Result<()> { + test_ClearSpeak("pt", "ClearSpeak_SetMemberSymbol", "Auto", &no_conjunto(NAO_PERTENCE), + "o conjunto de todos os x nĂŁo pertencentes a inteiros tal que x Ă© maior que 5")?; + return Ok(()); +} + +#[test] +fn nao_pertinencia_no_conjunto_member() -> Result<()> { + test_ClearSpeak("pt", "ClearSpeak_SetMemberSymbol", "Member", &no_conjunto(NAO_PERTENCE), + "o conjunto de todos os x nĂŁo membros de inteiros tal que x Ă© maior que 5")?; + return Ok(()); +} + +#[test] +fn nao_pertinencia_no_conjunto_element() -> Result<()> { + test_ClearSpeak("pt", "ClearSpeak_SetMemberSymbol", "Element", &no_conjunto(NAO_PERTENCE), + "o conjunto de todos os x nĂŁo elementos de inteiros tal que x Ă© maior que 5")?; + return Ok(()); +} + +#[test] +fn nao_pertinencia_no_conjunto_in() -> Result<()> { + test_ClearSpeak("pt", "ClearSpeak_SetMemberSymbol", "In", &no_conjunto(NAO_PERTENCE), + "o conjunto de todos os x nĂŁo pertencentes a inteiros tal que x Ă© maior que 5")?; + return Ok(()); +} + +// --------------------------------------------------------------------------- +// SimpleSpeak — a preferĂȘncia de ClearSpeak nĂŁo vale aqui +// --------------------------------------------------------------------------- + +#[test] +fn pertinencia_simplespeak() -> Result<()> { + test("pt", "SimpleSpeak", &sozinho(PERTENCE), "x pertence a nĂșmeros reais")?; + test("pt", "SimpleSpeak", &sozinho(PERTENCE_PEQ), "x pertence a nĂșmeros reais")?; + return Ok(()); +} + +#[test] +fn nao_pertinencia_simplespeak() -> Result<()> { + test("pt", "SimpleSpeak", &sozinho(NAO_PERTENCE), "x nĂŁo pertence a nĂșmeros reais")?; + return Ok(()); +} + +// --------------------------------------------------------------------------- +// PertinĂȘncia sob um operador grande (nĂŁo Ă© "dentro de um conjunto") +// --------------------------------------------------------------------------- + +#[test] +fn pertinencia_sob_somatorio() -> Result<()> { + let expr = " + + ∑ + i ∈ â„€ + + + 1 + i 2 + + "; + test_ClearSpeak("pt", "ClearSpeak_SetMemberSymbol", "Auto", expr, + "o somatĂłrio sobre i pertence a inteiros de; a fração com numerador 1; e denominador i ao quadrado")?; + return Ok(()); +} + +// --------------------------------------------------------------------------- +// Ramos que exigem forma nĂŁo-finita (antes falavam com verbo finito) +// +// Dentro de um conjunto a expressĂŁo modifica "todos os x". Verbo finito ali +// gruda em "conjunto" ("o conjunto de todos os x PERTENCE A inteiros") e a +// concordĂąncia cai no lugar errado. O inglĂȘs usa 'belonging to' justamente +// para evitar isso. Ver ACHADOS 7.9. +// --------------------------------------------------------------------------- + +#[test] +fn pertinencia_no_conjunto_belongs() -> Result<()> { + ambas_variantes("Belongs", no_conjunto, + "o conjunto de todos os x pertencentes a inteiros tal que x Ă© maior que 5") +} + +#[test] +fn nao_pertinencia_no_conjunto_belongs() -> Result<()> { + test_ClearSpeak("pt", "ClearSpeak_SetMemberSymbol", "Belongs", &no_conjunto(NAO_PERTENCE), + "o conjunto de todos os x nĂŁo pertencentes a inteiros tal que x Ă© maior que 5")?; + return Ok(()); +} + +// O SimpleSpeak usava UMA string sĂł para dentro e fora do conjunto, entĂŁo nĂŁo +// conseguia distinguir os dois contextos. Agora bifurca como o ClearSpeak. +#[test] +fn pertinencia_no_conjunto_simplespeak() -> Result<()> { + test("pt", "SimpleSpeak", &no_conjunto(PERTENCE), + "o conjunto de todos os x pertencentes a inteiros tal que x Ă© maior que 5")?; + test("pt", "SimpleSpeak", &no_conjunto(PERTENCE_PEQ), + "o conjunto de todos os x pertencentes a inteiros tal que x Ă© maior que 5")?; + return Ok(()); +} + +#[test] +fn nao_pertinencia_no_conjunto_simplespeak() -> Result<()> { + test("pt", "SimpleSpeak", &no_conjunto(NAO_PERTENCE), + "o conjunto de todos os x nĂŁo pertencentes a inteiros tal que x Ă© maior que 5")?; + return Ok(()); +} + +/// Fora de um conjunto o verbo finito estĂĄ certo (o sujeito Ă© um termo sĂł), mas +/// o ∉ com 'In' falava "nĂŁo estĂĄ contido em" — exatamente a fala do ⊄ +/// (unicode.yaml, 0x2284). Duas relaçÔes distintas soavam idĂȘnticas. Agora +/// espelha o "estĂĄ em" do ∈, que Ă© o que o prĂłprio ∉ jĂĄ dizia num conjunto. +#[test] +fn nao_pertinencia_in_nao_colide_com_subconjunto() -> Result<()> { + test_ClearSpeak("pt", "ClearSpeak_SetMemberSymbol", "In", + &sozinho(NAO_PERTENCE), "x nĂŁo estĂĄ em nĂșmeros reais")?; + return Ok(()); +} + +/// Guarda da distinção: ∉ e ⊄ nĂŁo podem falar igual. +#[test] +fn nao_pertinencia_e_nao_subconjunto_falam_diferente() -> Result<()> { + test_ClearSpeak("pt", "ClearSpeak_SetMemberSymbol", "In", + "x\u{2209}ℝ", "x nĂŁo estĂĄ em nĂșmeros reais")?; + test("pt", "ClearSpeak", + "x\u{2284}ℝ", "x nĂŁo estĂĄ contido em, nĂșmeros reais")?; + return Ok(()); +} diff --git a/tests/Languages/pt/SimpleSpeak/functions.rs b/tests/Languages/pt/SimpleSpeak/functions.rs new file mode 100644 index 000000000..a656c2da0 --- /dev/null +++ b/tests/Languages/pt/SimpleSpeak/functions.rs @@ -0,0 +1,422 @@ +/// TESTES DO IDIOMA pt — como reconciliar com as regras +/// +/// As strings esperadas abaixo foram escritas para refletir a intenção +/// das regras em Rules/Languages/pt. VĂ­rgulas e ponto-e-vĂ­rgula marcam +/// PAUSAS inseridas pelo motor e podem divergir levemente na primeira +/// execução. MĂ©todo do guia oficial de tradutores: +/// 1. rode `cargo test Languages::pt` +/// 2. para cada falha, compare `left` (esperado) com `right` (gerado) +/// 3. se o GERADO estiver correto em portuguĂȘs, copie-o para o teste; +/// se estiver errado, conserte a REGRA, nunca o teste. +/// +/// ATENÇÃO ao histĂłrico: o arquivo espanhol equivalente continha testes +/// que nĂŁo refletiam as regras (ex.: esperava "logaritmo natural" com a +/// regra dizendo "natural log") e dano de busca-e-troca (ex.: "eigh"→"8"). +/// NĂŁo herde strings esperadas de es/ sem conferir. + +use crate::common::*; +use anyhow::Result; + +#[test] +fn trig_names() -> Result<()> { + let expr = " + sinx+ + cosy+ + tanz+ + secα+ + cscϕ+ + cotφ + "; + test("pt", "SimpleSpeak", expr, "seno de x mais cosseno de y mais tangente de z mais secante de alfa, mais cossecante de fi reto, mais cotangente de fi")?; + return Ok(()); + +} + +#[test] +fn hyperbolic_trig_names() -> Result<()> { + let expr = " + sinhx+ + coshy+ + tanhz+ + sechα+ + cschϕ+ + cothφ + "; + test("pt", "SimpleSpeak", expr, "seno hiperbĂłlico de x, mais \ + cosseno hiperbĂłlico de y, mais \ + tangente hiperbĂłlica de z, mais \ + secante hiperbĂłlica de alfa, mais, \ + cossecante hiperbĂłlica de fi reto, mais \ + cotangente hiperbĂłlica de fi")?; + return Ok(()); + +} + + +#[test] +fn inverse_trig() -> Result<()> { + let expr = "sin-1x"; + test("pt", "SimpleSpeak", expr, "inversa de seno de x")?; + return Ok(()); + +} + +#[test] +fn trig_squared() -> Result<()> { + let expr = "sin2x"; + test("pt", "SimpleSpeak", expr, "seno ao quadrado de x")?; + return Ok(()); + +} + +#[test] +fn trig_cubed() -> Result<()> { + let expr = "tan3x"; + test("pt", "SimpleSpeak", expr, "tangente ao cubo de x")?; + return Ok(()); + +} + +#[test] +// Reconciliado com a regra function-power corrigida: ToOrdinal() gerava +// "quarto" (masculino) contra "potĂȘncia" (feminino). +fn trig_fourth() -> Result<()> { + let expr = "sec4x"; + test("pt", "SimpleSpeak", expr, "a potĂȘncia 4 de, secante de x")?; + return Ok(()); + +} + + +#[test] +fn trig_power_other() -> Result<()> { + let expr = "sinh>n-1x"; + test("pt", "SimpleSpeak", expr, "a potĂȘncia n menos 1 de, seno hiperbĂłlico de x")?; + return Ok(()); + +} + +#[test] +fn simple_log() -> Result<()> { + let expr = " logx "; + test("pt", "SimpleSpeak", expr, "o log de x")?; + return Ok(()); + +} + +#[test] +fn normal_log() -> Result<()> { + let expr = "log(x+y)"; + test("pt", "SimpleSpeak", expr, "o log de, abre parĂȘnteses, x mais y, fecha parĂȘnteses")?; + return Ok(()); + +} + +#[test] +fn simple_log_with_base() -> Result<()> { + let expr = " logbx "; + test("pt", "SimpleSpeak", expr, "o log na base b, de x")?; + return Ok(()); + +} + +#[test] +fn normal_log_with_base() -> Result<()> { + let expr = "logb(x+y)"; + test("pt", "SimpleSpeak", expr, "o log na base b, de, abre parĂȘnteses, x mais y, fecha parĂȘnteses")?; + return Ok(()); + +} + +/// 'Log' com maiĂșscula Ă© o logaritmo de valor principal (variĂĄvel complexa) e +/// tem leitura prĂłpria, diferente de 'log'. +#[test] +fn principal_value_log() -> Result<()> { + let expr = " Logx "; + test("pt", "SimpleSpeak", expr, "o log do valor principal de x")?; + return Ok(()); + +} + +#[test] +fn simple_ln() -> Result<()> { + let expr = " lnx "; + test("pt", "SimpleSpeak", expr, "o logaritmo natural de x")?; + return Ok(()); + +} + +#[test] +fn normal_ln() -> Result<()> { + let expr = "ln(x+y)"; + test("pt", "SimpleSpeak", expr, "o logaritmo natural de, abre parĂȘnteses, x mais y, fecha parĂȘnteses")?; + return Ok(()); + +} + +#[test] +fn normal_ln_terse() -> Result<()> { + let expr = "ln(x+y)"; + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Terse")], + expr, "l n, abre parĂȘnteses, x mais y, fecha parĂȘnteses")?; + return Ok(()); + +} + +#[test] +fn simple_ln_terse() -> Result<()> { + let expr = " lnx "; + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Terse")], + expr, "l n x")?; + return Ok(()); + +} + +#[test] +fn explicit_function_call_with_parens() -> Result<()> { + let expr = "t⁡(x)"; + test("pt", "SimpleSpeak", expr, "t de x")?; + return Ok(()); + +} + + +#[test] +fn explicit_times_with_parens() -> Result<()> { + let expr = "t⁢(x)"; + test("pt", "SimpleSpeak", expr, "t vezes x")?; + return Ok(()); + +} + +#[test] +fn explicit_function_call() -> Result<()> { + let expr = "t⁡x"; + test("pt", "SimpleSpeak", expr, "t de x")?; + return Ok(()); + +} + +#[test] +fn explicit_times() -> Result<()> { + let expr = "t⁢x"; + test("pt", "SimpleSpeak", expr, "t x")?; + return Ok(()); + +} + + +/* + * Tests for times + */ +#[test] +fn no_times_binomial() -> Result<()> { + let expr = "x ⁢ y"; + test("pt", "SimpleSpeak", expr, "x y")?; + return Ok(()); + +} + +#[test] +fn times_following_paren() -> Result<()> { + let expr = " + 2 + ( 3 ) + "; + test("pt", "SimpleSpeak", expr, "2 vezes 3")?; + return Ok(()); + +} + +#[test] +fn times_preceding_paren() -> Result<()> { + let expr = " + ( 2 ) + 3 + "; + test("pt", "SimpleSpeak", expr, "2 vezes 3")?; + return Ok(()); + +} + +#[test] +fn no_times_sqrt() -> Result<()> { + let expr = " + a + b + = + ab + "; + test("pt", "SimpleSpeak", expr, + "a raiz quadrada de a; a raiz quadrada de b; Ă© igual a, a raiz quadrada de a b fim da raiz")?; + return Ok(()); + +} + +/* + * Tests for parens + */ + #[test] + fn no_parens_number() -> Result<()> { + let expr = " + ( + 25 + ) + x + "; + test("pt", "SimpleSpeak", expr, "25 vezes x")?; + return Ok(()); + + } + + #[test] + fn no_parens_monomial() -> Result<()> { + let expr = " + b + ( + xy + ) + "; + test("pt", "SimpleSpeak", expr, "b x y")?; + return Ok(()); + + } + + #[test] + fn no_parens_negative_number() -> Result<()> { + let expr = " + 2+ + ( + −2 + ) + "; + test("pt", "SimpleSpeak", expr, "2 mais menos 2")?; + return Ok(()); + + } + + + #[test] + fn no_parens_negative_number_with_var() -> Result<()> { + let expr = " + ( + −2x + ) + +1 + "; + test("pt", "SimpleSpeak", expr, "menos 2 x, mais 1")?; + return Ok(()); + + } + + #[test] + fn parens_superscript() -> Result<()> { + let expr = " + + + + ( + 2x + ) + 2 + + + "; + test("pt", "SimpleSpeak", expr, "abre parĂȘnteses 2 x fecha parĂȘnteses ao quadrado")?; + return Ok(()); + + } + + #[test] + fn no_parens_fraction() -> Result<()> { + let expr = " + 2 + + + + ( + 12 + ) + "; + test("pt", "SimpleSpeak", expr, "2 mais 1 meio")?; + return Ok(()); + + } + + + // Tests for the four types of intervals in SimpleSpeak + #[test] + fn parens_interval_open_open() -> Result<()> { + let expr = " + ( + (c,d) + ) + "; + test("pt", "SimpleSpeak",expr, "o intervalo aberto de c a d")?; + return Ok(()); + +} + +#[test] + fn parens_interval_closed_open() -> Result<()> { + let expr = " + [ + [(]c,d) + ) + "; + test("pt", "SimpleSpeak",expr, "o intervalo fechado aberto de c a d")?; + return Ok(()); + +} + + +#[test] +fn parens_interval_open_closed() -> Result<()> { + let expr = " + ( + (c,d] + ] + "; + test("pt", "SimpleSpeak",expr,"o intervalo aberto fechado de c a d")?; + return Ok(()); + +} + + +#[test] +fn parens_interval_closed_closed() -> Result<()> { + let expr = " + [ + [(]c,d] + ] + "; + test("pt", "SimpleSpeak",expr, "o intervalo fechado de c a d")?; + return Ok(()); + +} + + #[test] + fn parens_interval_neg_infinity_open_open() -> Result<()> { + let expr = " + ( + - ∞,d) + ) + "; + test("pt", "SimpleSpeak",expr, + "o intervalo aberto de menos infinito a d")?; + return Ok(()); + +} + + #[test] + fn parens_interval_neg_infinity_open_closed() -> Result<()> { + let expr = " + ( + - ∞,d] + ] + "; + test("pt", "SimpleSpeak",expr, + "o intervalo aberto fechado de menos infinito a d")?; + return Ok(()); + +} + diff --git a/tests/Languages/pt/alphabets.rs b/tests/Languages/pt/alphabets.rs new file mode 100644 index 000000000..b648e59c4 --- /dev/null +++ b/tests/Languages/pt/alphabets.rs @@ -0,0 +1,438 @@ +/// TESTES DO IDIOMA pt — como reconciliar com as regras +/// Testes de alfabetos — versĂŁo pt. +/// * this has tests focused on the various alphabets +use crate::common::*; +use anyhow::Result; + + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn special_alphabet_chars() -> Result<()> { + let expr = " ℌ,ℭ"; + test("pt", "SimpleSpeak", expr, "fraktur cap h comma fraktur cap c")?; + let expr = " ℍ,ℿ"; + test("pt", "SimpleSpeak", expr, "double struck cap h comma double struck cap pi")?; + let expr = " ℐ,ℳ"; + test("pt", "SimpleSpeak", expr, "script cap i comma script cap m")?; + return Ok(()); + +} + +#[test] +fn greek() -> Result<()> { + let expr = " Α,Ω"; + // a segunda vĂ­rgula Ă© a pausa automĂĄtica do motor depois do operador; + // o inglĂȘs tem a mesma ("cap alpha comma, cap omega"). + test("pt", "SimpleSpeak", expr, "maiĂșscula alfa vĂ­rgula, maiĂșscula ĂŽmega")?; + let expr = " α,ω"; + test("pt", "SimpleSpeak", expr, "alfa vĂ­rgula, ĂŽmega")?; + return Ok(()); +} + +#[test] +#[ignore] // caracteres de ĂĄrea privada do MathType: dependem do unicode-full.yaml, removido de pt de propĂłsito +fn greek_mathtype_private() -> Result<()> { + let expr = " \u{f8d3},\u{f8e0}"; + test("pt", "SimpleSpeak", expr, "maiĂșscula delta vazado, vĂ­rgula maiĂșscula Ășpsilon vazado")?; + return Ok(()); +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn cap_cyrillic() -> Result<()> { + let expr = " А,ĐŻ"; + test("pt", "SimpleSpeak", expr, "cap a comma cap ya")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn parenthesized() -> Result<()> { + let expr = " ⒜,â’”"; + test("pt", "SimpleSpeak", expr, "parenthesized eigh comma parenthesized z")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn circled() -> Result<()> { + let expr = " Ⓐ,Ⓩ"; + test("pt", "SimpleSpeak", expr, "circled cap eigh comma circled cap z")?; + let expr = " ⓐ,ⓩ"; + test("pt", "SimpleSpeak", expr, "circled eigh comma circled z")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn fraktur() -> Result<()> { + let expr = " 𝔄,𝔜"; + test("pt", "SimpleSpeak", expr, "fraktur cap eigh comma fraktur cap y")?; + let expr = " 𝔞,đ”·"; + test("pt", "SimpleSpeak", expr, "fraktur eigh comma fraktur z")?; + // MathType private space versions + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "fraktur cap eigh comma fraktur cap y")?; + let expr = " ,ï€ł"; + test("pt", "SimpleSpeak", expr, "fraktur eigh comma fraktur z")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn bold_fraktur() -> Result<()> { + let expr = " 𝕬,𝖅"; + test("pt", "SimpleSpeak", expr, "fraktur bold cap eigh, comma fraktur bold cap z")?; + let expr = " 𝖆,𝖟"; + test("pt", "SimpleSpeak", expr, "fraktur bold eigh comma fraktur bold z")?; + // MathType private space versions + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "fraktur bold cap eigh, comma fraktur bold cap z")?; + let expr = " ,ïł"; + test("pt", "SimpleSpeak", expr, "fraktur bold eigh comma fraktur bold z")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn double_struck() -> Result<()> { + let expr = " 𝔾,𝕐"; + test("pt", "SimpleSpeak", expr, "double struck cap eigh, comma double struck cap y")?; + let expr = " 𝕒,đ•«"; + test("pt", "SimpleSpeak", expr, "double struck eigh comma double struck z")?; + let expr = " 𝟘,𝟡"; + test("pt", "SimpleSpeak", expr, "double struck 0 comma double struck 9")?; + // MathType private space versions + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "double struck cap eigh, comma double struck cap y")?; + let expr = " ,ï‚ł"; + test("pt", "SimpleSpeak", expr, "double struck eigh comma double struck z")?; + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "double struck 0 comma double struck 9")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn script() -> Result<()> { + let expr = " 𝒜,đ’”"; + test("pt", "SimpleSpeak", expr, "script cap eigh comma script cap z")?; + let expr = " đ’¶,𝓏"; + test("pt", "SimpleSpeak", expr, "script eigh comma script z")?; + // MathType private space versions + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "script cap eigh comma script cap z")?; + let expr = " ,ï„ł"; + test("pt", "SimpleSpeak", expr, "script eigh comma script z")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn bold_script() -> Result<()> { + let expr = " 𝓐,đ“©"; + test("pt", "SimpleSpeak", expr, "script bold cap eigh comma script bold cap z")?; + let expr = " đ“Ș,𝔃"; + test("pt", "SimpleSpeak", expr, "script bold eigh comma script bold z")?; + // MathType private space versions + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "script bold cap eigh comma script bold cap z")?; + let expr = " ,ï…ł"; + test("pt", "SimpleSpeak", expr, "script bold eigh comma script bold z")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn bold() -> Result<()> { + let expr = " 𝐀,𝐙"; + test("pt", "SimpleSpeak", expr, "bold cap eigh comma bold cap z")?; + let expr = " 𝐚,𝐳"; + test("pt", "SimpleSpeak", expr, "bold eigh comma bold z")?; + // MathType private space versions + let expr = " ,ï‰č"; + test("pt", "SimpleSpeak", expr, "bold cap eigh comma bold cap z")?; + let expr = " ï‰ș,"; + test("pt", "SimpleSpeak", expr, "bold eigh comma bold z")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn italic() -> Result<()> { + let expr = " 𝐮,𝑍"; + test("pt", "SimpleSpeak", expr, "cap eigh comma cap z")?; + let expr = " 𝑎,𝑧"; + test("pt", "SimpleSpeak", expr, "eigh comma z")?; + // MathType private space versions + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "cap eigh comma cap z")?; + let expr = " ïŠź,"; + test("pt", "SimpleSpeak", expr, "eigh comma z")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn sans_serif() -> Result<()> { + let expr = " 𝖠,đ–č"; + test("pt", "SimpleSpeak", expr, "cap eigh comma cap z")?; + let expr = " đ–ș,𝗓"; + test("pt", "SimpleSpeak", expr, "eigh comma z")?; + // MathType private space versions + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "cap eigh comma cap z")?; + let expr = " ,ïŒł"; + test("pt", "SimpleSpeak", expr, "eigh comma z")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn sans_serif_bold() -> Result<()> { + let expr = " 𝗔,𝗭"; + test("pt", "SimpleSpeak", expr, "bold cap eigh comma bold cap z")?; + let expr = " 𝗼,𝘇"; + test("pt", "SimpleSpeak", expr, "bold eigh comma bold z")?; + // MathType private space versions + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "bold cap eigh comma bold cap z")?; + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "bold eigh comma bold z")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn sans_serif_italic() -> Result<()> { + let expr = " 𝘈,𝘡"; + test("pt", "SimpleSpeak", expr, "cap eigh comma cap z")?; + let expr = " 𝘱,đ˜»"; + test("pt", "SimpleSpeak", expr, "eigh comma z")?; + // MathType private space versions + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "cap eigh comma cap z")?; + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "eigh comma z")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn sans_serif_bold_italic() -> Result<()> { + let expr = " đ˜Œ,𝙕"; + test("pt", "SimpleSpeak", expr, "bold cap eigh comma bold cap z")?; + let expr = " 𝙖,𝙯"; + test("pt", "SimpleSpeak", expr, "bold eigh comma bold z")?; + // MathType private space versions + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "bold cap eigh comma bold cap z")?; + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "bold eigh comma bold z")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn monospace() -> Result<()> { + let expr = " 𝙰,𝚉"; + test("pt", "SimpleSpeak", expr, "cap eigh comma cap z")?; + let expr = " 𝚊,𝚣"; + test("pt", "SimpleSpeak", expr, "eigh comma z")?; + // MathType private space versions + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "cap eigh comma cap z")?; + let expr = " ïȘ,"; + test("pt", "SimpleSpeak", expr, "eigh comma z")?; + return Ok(()); + +} + + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn bold_greek() -> Result<()> { + let expr = " 𝚹,𝛀"; + test("pt", "SimpleSpeak", expr, "bold cap alpha comma bold cap omega")?; + let expr = " 𝛂,𝛚"; + test("pt", "SimpleSpeak", expr, "bold alpha comma bold omega")?; + // MathType private space versions + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "bold cap alpha comma bold cap omega")?; + let expr = " ïą,ïș"; + test("pt", "SimpleSpeak", expr, "bold alpha comma bold omega")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn bold_greek_others() -> Result<()> { + let expr = " 𝛛,𝛡"; + test("pt", "SimpleSpeak", expr, "bold partial derivative, comma bold pi")?; + // MathType private space versions + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "bold partial derivative, comma bold pi")?; + return Ok(()); + +} + + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn italic_greek() -> Result<()> { + let expr = " 𝛱,đ›ș"; + test("pt", "SimpleSpeak", expr, "maiĂșscula alfa vĂ­rgula maiĂșscula ĂŽmega")?; + let expr = " đ›Œ,𝜔"; + test("pt", "SimpleSpeak", expr, "alfa vĂ­rgula ĂŽmega")?; + // MathType private space versions + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "maiĂșscula alfa vĂ­rgula maiĂșscula ĂŽmega")?; + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "alfa vĂ­rgula ĂŽmega")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn italic_greek_others() -> Result<()> { + let expr = " 𝜕,𝜛"; + test("pt", "SimpleSpeak", expr, "partial derivative comma pi")?; + // MathType private space versions + let expr = " ï‘”,"; + test("pt", "SimpleSpeak", expr, "partial derivative comma pi")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn bold_italic_greek() -> Result<()> { + let expr = " 𝜜,𝜮"; + test("pt", "SimpleSpeak", expr, "bold cap alpha comma bold cap omega")?; + let expr = " đœ¶,𝝎"; + test("pt", "SimpleSpeak", expr, "bold alpha comma bold omega")?; + // MathType private space versions + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "bold cap alpha comma bold cap omega")?; + let expr = " ,ï’ź"; + test("pt", "SimpleSpeak", expr, "bold alpha comma bold omega")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn bold_italic_greek_others() -> Result<()> { + let expr = " 𝝏,𝝕"; + test("pt", "SimpleSpeak", expr, "bold partial derivative, comma bold pi")?; + // MathType private space versions + let expr = " ï’Ż,ï’”"; + test("pt", "SimpleSpeak", expr, "bold partial derivative, comma bold pi")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn sans_serif_bold_greek() -> Result<()> { + let expr = " 𝝖,𝝼"; + test("pt", "SimpleSpeak", expr, "bold cap alpha comma bold cap omega")?; + let expr = " 𝝰,𝞈"; + test("pt", "SimpleSpeak", expr, "bold alpha comma bold omega")?; + // MathType private space versions + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "bold cap alpha comma bold cap omega")?; + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "bold alpha comma bold omega")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn sans_serif_bold_greek_others() -> Result<()> { + let expr = " 𝞉,𝞏"; + test("pt", "SimpleSpeak", expr, "bold partial derivative, comma bold pi")?; + // MathType private space versions + let expr = " ,ï“Ż"; + test("pt", "SimpleSpeak", expr, "bold partial derivative, comma bold pi")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn sans_serif_bold_italic_greek() -> Result<()> { + let expr = " 𝞐,𝞹"; + test("pt", "SimpleSpeak", expr, "bold cap alpha comma bold cap omega")?; + let expr = " đžȘ,𝟂"; + test("pt", "SimpleSpeak", expr, "bold alpha comma bold omega")?; + // MathType private space versions + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "bold cap alpha comma bold cap omega")?; + let expr = " ,ï”ą"; + test("pt", "SimpleSpeak", expr, "bold alpha comma bold omega")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito (cai no inglĂȘs) +fn sans_serif_bold_italic_greek_others() -> Result<()> { + let expr = " 𝟃,𝟉"; + test("pt", "SimpleSpeak", expr, "bold partial derivative, comma bold pi")?; + // MathType private space versions + let expr = " ï”Ł,"; + test("pt", "SimpleSpeak", expr, "bold partial derivative, comma bold pi")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito +fn pua_regular() -> Result<()> { + let expr = " ,"; + test("pt", "SimpleSpeak", expr, "cap eigh comma cap z")?; + return Ok(()); + +} + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito +fn turned() -> Result<()> { + let expr = " â„Č,⅄"; + test("pt", "SimpleSpeak", expr, "turned cap f comma turned sans-serif cap y")?; + return Ok(()); + + } + +#[test] +#[ignore] // depende de unicode-full.yaml, removido de pt de propĂłsito +fn enclosed_numbers() -> Result<()> { + let expr = " ①,⑹"; + test("pt", "SimpleSpeak", expr, "circled 1 comma circled 9")?; + let expr = " ⑮,⑌"; + test("pt", "SimpleSpeak", expr, "parenthesized 1 comma parenthesized 9")?; + let expr = " ⒈,⒐"; + test("pt", "SimpleSpeak", expr, "1 with period comma 9 with period")?; + let expr = " â“”,ⓜ"; + test("pt", "SimpleSpeak", expr, "double circled 1 comma double circled 9")?; + return Ok(()); + +} diff --git a/tests/Languages/pt/chemistry.rs b/tests/Languages/pt/chemistry.rs new file mode 100644 index 000000000..b8448add8 --- /dev/null +++ b/tests/Languages/pt/chemistry.rs @@ -0,0 +1,721 @@ +/// TESTES DO IDIOMA pt — como reconciliar com as regras +/// Tests for rules shared between various speech styles: +/// * modified var +use crate::common::*; +use anyhow::Result; + +#[test] +fn salt() -> Result<()> { + let expr = "NaCl"; + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "maiĂșscula n a; maiĂșscula c l")?; + return Ok(()); + +} + +#[test] +fn water() -> Result<()> { + let expr = "H2O"; + // ClearSpeak reativado: Rules/Languages/pt/ClearSpeak_Rules.yaml traduzido. + // Pausas (vĂ­rgula/ponto-e-vĂ­rgula) podem precisar de reconciliação via cargo test. + test_prefs("pt", "ClearSpeak", vec![("Verbosity", "Terse")], expr, "maiĂșscula h, 2, maiĂșscula o")?; + // ClearSpeak reativado: Rules/Languages/pt/ClearSpeak_Rules.yaml traduzido. + // Pausas (vĂ­rgula/ponto-e-vĂ­rgula) podem precisar de reconciliação via cargo test. + test_prefs("pt", "ClearSpeak", vec![("Verbosity", "Medium")], expr, "maiĂșscula h, sub 2, maiĂșscula o")?; + // ClearSpeak reativado: Rules/Languages/pt/ClearSpeak_Rules.yaml traduzido. + // Pausas (vĂ­rgula/ponto-e-vĂ­rgula) podem precisar de reconciliação via cargo test. + test_prefs("pt", "ClearSpeak", vec![("Verbosity", "Verbose")], expr, "maiĂșscula h, subscrito 2, maiĂșscula o")?; + return Ok(()); + +} + +#[test] +fn carbon() -> Result<()> { + let expr = "C"; // not enough to trigger recognition + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "maiĂșscula c")?; + return Ok(()); + +} + +#[test] +fn sulfate() -> Result<()> { + let expr = " + [SO4] + 2− + "; + // ClearSpeak reativado: Rules/Languages/pt/ClearSpeak_Rules.yaml traduzido. + // Pausas (vĂ­rgula/ponto-e-vĂ­rgula) podem precisar de reconciliação via cargo test. + test_prefs("pt", "ClearSpeak", vec![("Verbosity", "Medium")], expr, "abre colchetes, maiĂșscula s, maiĂșscula o, sub 4; fecha colchetes super 2 menos")?; + return Ok(()); + +} + +#[test] +fn aluminum_sulfate() -> Result<()> { + let expr = "Al2 + (SO4)3"; + // ClearSpeak reativado: Rules/Languages/pt/ClearSpeak_Rules.yaml traduzido. + // Pausas (vĂ­rgula/ponto-e-vĂ­rgula) podem precisar de reconciliação via cargo test. + test_prefs("pt", "ClearSpeak", vec![("Verbosity", "Terse")], expr, "maiĂșscula a l, 2; abre parĂȘnteses, maiĂșscula s, maiĂșscula o, 4; fecha parĂȘnteses 3")?; + // ClearSpeak reativado: Rules/Languages/pt/ClearSpeak_Rules.yaml traduzido. + // Pausas (vĂ­rgula/ponto-e-vĂ­rgula) podem precisar de reconciliação via cargo test. + test_prefs("pt", "ClearSpeak", vec![("Verbosity", "Medium")], expr, "maiĂșscula a l, sub 2; abre parĂȘnteses, maiĂșscula s, maiĂșscula o, sub 4; fecha parĂȘnteses sub 3")?; + // ClearSpeak reativado: Rules/Languages/pt/ClearSpeak_Rules.yaml traduzido. + // Pausas (vĂ­rgula/ponto-e-vĂ­rgula) podem precisar de reconciliação via cargo test. + test_prefs("pt", "ClearSpeak", vec![("Verbosity", "Verbose")], expr, "maiĂșscula a l, subscrito 2; abre parĂȘnteses, maiĂșscula s, maiĂșscula o, subscrito 4; fecha parĂȘnteses subscrito 3")?; + return Ok(()); + +} + +#[test] +fn ethanol_bonds() -> Result<()> { + let expr = " + + C + H 3 + − + C + H 2 + − + O + H + + "; + // ClearSpeak reativado: Rules/Languages/pt/ClearSpeak_Rules.yaml traduzido. + // Pausas (vĂ­rgula/ponto-e-vĂ­rgula) podem precisar de reconciliação via cargo test. + test_prefs("pt", "ClearSpeak", vec![("Verbosity", "Terse")], expr, "maiĂșscula c, maiĂșscula h, 3, ligação simples, maiĂșscula c, maiĂșscula h, 2, ligação simples, maiĂșscula o, maiĂșscula h")?; + + return Ok(()); + +} + +#[test] +fn dichlorine_hexoxide() -> Result<()> { + let expr = " + + [ClO2] + + + + + [ClO4] + - + + "; + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Terse")], + expr, "abre colchetes, maiĂșscula c l; maiĂșscula o, 2; fecha colchetes mais; \ + abre colchetes, maiĂșscula c l; maiĂșscula o, 4; fecha colchetes menos")?; + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Medium")], + expr, "abre colchetes, maiĂșscula c l; maiĂșscula o, sub 2; fecha colchetes super mais; \ + abre colchetes, maiĂșscula c l; maiĂșscula o, sub 4; fecha colchetes super menos")?; + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Verbose")], + expr, "abre colchetes, maiĂșscula c l; maiĂșscula o, subscrito 2; fecha colchetes sobrescrito mais; \ + abre colchetes, maiĂșscula c l; maiĂșscula o, subscrito 4; fecha colchetes sobrescrito menos")?; + return Ok(()); + +} + + +#[test] +fn ethylene_with_bond() -> Result<()> { + let expr = " + H2C + = + CH2 + "; + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "maiĂșscula h, 2, maiĂșscula c; ligação dupla, maiĂșscula c, maiĂșscula h, 2")?; + return Ok(()); + +} + +#[test] +fn ferric_chloride_aq() -> Result<()> { + let expr = " + Fe + Cl3 + (aq) + "; + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "maiĂșscula f e; maiĂșscula c l, 3, aquoso")?; + return Ok(()); + + } + +#[test] +fn ethylene_with_colon_bond() -> Result<()> { + let expr = " + H2C + :: + CH2 + "; + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "maiĂșscula h, 2, maiĂșscula c; ligação dupla, maiĂșscula c, maiĂșscula h, 2")?; + return Ok(()); + +} + +#[test] +fn beta_decay() -> Result<()> { + let expr = " + + C + + 6 + 14 + + → + + N + + 7 + 14 + + + + + e + + + − + 1 + + 0 + + "; + // ClearSpeak reativado: Rules/Languages/pt/ClearSpeak_Rules.yaml traduzido. + // Pausas (vĂ­rgula/ponto-e-vĂ­rgula) podem precisar de reconciliação via cargo test. + test_prefs("pt", "ClearSpeak", vec![("Verbosity", "Terse")], expr, + "14, 6, maiĂșscula c; forma, 14, 7, maiĂșscula n; mais 0, menos 1, e")?; + // ClearSpeak reativado: Rules/Languages/pt/ClearSpeak_Rules.yaml traduzido. + // Pausas (vĂ­rgula/ponto-e-vĂ­rgula) podem precisar de reconciliação via cargo test. + test_prefs("pt", "ClearSpeak", vec![("Verbosity", "Medium")], expr, + "super 14, sub 6, maiĂșscula c; reage formando; super 14, sub 7, maiĂșscula n; mais super 0, sub menos 1, e")?; + // ClearSpeak reativado: Rules/Languages/pt/ClearSpeak_Rules.yaml traduzido. + // Pausas (vĂ­rgula/ponto-e-vĂ­rgula) podem precisar de reconciliação via cargo test. + test_prefs("pt", "ClearSpeak", vec![("Verbosity", "Verbose")], expr, + "sobrescrito 14, subscrito 6, maiĂșscula c; reage formando; sobrescrito 14, subscrito 7, maiĂșscula n; mais, sobrescrito 0, subscrito menos 1, e")?; + return Ok(()); + +} + +#[test] +fn mhchem_beta_decay() -> Result<()> { + let expr = " + + + + + + + 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 + + + "; + // ClearSpeak reativado: Rules/Languages/pt/ClearSpeak_Rules.yaml traduzido. + // Pausas (vĂ­rgula/ponto-e-vĂ­rgula) podem precisar de reconciliação via cargo test. + test_prefs("pt", "ClearSpeak", vec![("Verbosity", "Terse")], expr, + "14, 6, maiĂșscula c; forma, 14, 7, maiĂșscula n; mais 0, menos 1, e")?; + // ClearSpeak reativado: Rules/Languages/pt/ClearSpeak_Rules.yaml traduzido. + // Pausas (vĂ­rgula/ponto-e-vĂ­rgula) podem precisar de reconciliação via cargo test. + test_prefs("pt", "ClearSpeak", vec![("Verbosity", "Medium")], expr, + "super 14, sub 6, maiĂșscula c; reage formando; super 14, sub 7, maiĂșscula n; mais super 0, sub menos 1, e")?; + // ClearSpeak reativado: Rules/Languages/pt/ClearSpeak_Rules.yaml traduzido. + // Pausas (vĂ­rgula/ponto-e-vĂ­rgula) podem precisar de reconciliação via cargo test. + test_prefs("pt", "ClearSpeak", vec![("Verbosity", "Verbose")], expr, + "sobrescrito 14, subscrito 6, maiĂșscula c; reage formando; sobrescrito 14, subscrito 7, maiĂșscula n; mais, sobrescrito 0, subscrito menos 1, e")?; + return Ok(()); + +} + +#[test] +fn hcl_na_produz() -> Result<()> { + let expr = " + 2HCl+2Na + → + 2NaCl+ + H 2 + + "; + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, + "2, maiĂșscula h, maiĂșscula c l; mais 2 maiĂșscula n a; reage formando; 2, maiĂșscula n a; maiĂșscula c l; mais maiĂșscula h, subscrito 2")?; + return Ok(()); + +} + +#[test] +fn mhchem_so4_2mais() -> Result<()> { + let expr = " + + + SO + + + + + + + A + + + + + + + + 4 + + + + + + + + + + A + + + + + + 2 + + + + + + "; + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "maiĂșscula s; maiĂșscula o, 4, 2 mais")?; + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Medium")], expr, "maiĂșscula s; maiĂșscula o, sub 4, super 2 mais")?; + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "maiĂșscula s; maiĂșscula o, subscrito 4, sobrescrito 2 mais")?; + return Ok(()); + +} + + +#[test] +fn mhchem_hcl_aq_etc() -> Result<()> { + let expr = " + + 2 + + + + + HCl + + + ( + + aq + + ) + + + + + 2 + + + + + Na + + + ( + + s + + ) + + + ⟶ + + + 2 + + + + + NaCl + + + ( + + aq + + ) + + + + + + H + + + + + + + A + + + + + + + + 2 + + + + + + ( + + g + + ) + + "; + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Terse")], + expr, "2, maiĂșscula h, maiĂșscula c l; aquoso; mais, 2, maiĂșscula n a; sĂłlido; forma; 2, maiĂșscula n a; maiĂșscula c l; aquoso; mais, maiĂșscula h, 2; gasoso")?; + + return Ok(()); + +} + + +#[test] +fn mhchem_barbed_equilibrium() -> Result<()> { + let expr = " + + + + H + 2 + + + ⁣ + + ( + g + ) + + + + + + + + I + 2 + + + ⁣ + + ( + g + ) + + + ⁢ + + + ↜ + - + + + - + ⇀ + + + ⁢ + 2 + ⁢ + + H + ⁣ + I + ⁣ + + ( + g + ) + + + + + "; + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Terse")], + expr, "maiĂșscula h, 2; gasoso; mais; maiĂșscula i, 2; gasoso; estĂĄ em equilĂ­brio com, 2, maiĂșscula h, maiĂșscula i, gasoso")?; + return Ok(()); + +} + + + +#[test] +fn mhchem_roman_in_sobrescrito() -> Result<()> { + let expr = " + + + Fe + + II + + ⁣ + + Fe + + III + + ⁣ + + O + 4 + + + + "; + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Terse")], + expr, "maiĂșscula f e, 2; maiĂșscula f e, 3; maiĂșscula o, 4")?; + return Ok(()); + +} + + diff --git a/tests/Languages/pt/escuta.rs b/tests/Languages/pt/escuta.rs new file mode 100644 index 000000000..812be28be --- /dev/null +++ b/tests/Languages/pt/escuta.rs @@ -0,0 +1,33 @@ +use crate::common::*; + +fn falar(estilo: &str, verbosidade: &str, mathml: &str) -> String { + set_rules_dir(abs_rules_dir_path()).unwrap(); + set_preference("Language", "pt".to_string()).unwrap(); + set_preference("SpeechStyle", estilo.to_string()).unwrap(); + set_preference("Verbosity", verbosidade.to_string()).unwrap(); + set_preference("SpeechOverrides_CapitalLetters", "".to_string()).unwrap(); + set_preference("ClearSpeak_SetMemberSymbol", "Auto".to_string()).unwrap(); + match set_mathml(mathml.to_string()) { + Ok(_) => match get_spoken_text() { + Ok(fala) => regex::Regex::new(r" +").unwrap().replace_all(&fala, " ").to_string(), + Err(e) => format!("[ERRO ao falar: {}]", errors_to_string(&e)), + }, + Err(e) => format!("[ERRO no MathML: {}]", errors_to_string(&e)), + } +} + +#[test] +#[ignore = "gerador do pacote de escuta; rode com --ignored --nocapture"] +fn gerar_pacote_escuta() { + let tsv = include_str!("escuta_expressoes.tsv"); + for linha in tsv.lines().filter(|l| !l.starts_with('#') && !l.trim().is_empty()) { + let campos: Vec<&str> = linha.split('\t').collect(); + assert_eq!(campos.len(), 4, "linha malformada no tsv: {linha}"); + let (area, titulo, mathml) = (campos[0], campos[1], campos[3]); + for estilo in ["ClearSpeak", "SimpleSpeak"] { + for verb in ["Terse", "Medium", "Verbose"] { + println!("FALA\t{area}\t{titulo}\t{estilo}\t{verb}\t{}", falar(estilo, verb, mathml)); + } + } + } +} diff --git a/tests/Languages/pt/escuta_expressoes.tsv b/tests/Languages/pt/escuta_expressoes.tsv new file mode 100644 index 000000000..ce729ff9c --- /dev/null +++ b/tests/Languages/pt/escuta_expressoes.tsv @@ -0,0 +1,30 @@ +aritmetica Fração mista e decimal 3\frac{1}{2} + 0{,}75 = 4{,}25 312+0,75=4,25 +aritmetica Bhaskara x = \frac{-b \pm \sqrt{b^{2} - 4ac}}{2a} x=−b±b2−4ac2a +aritmetica PotĂȘncia e raiz \sqrt[3]{27} = 3^{1} \quad \text{e} \quad 2^{10} = 1024 273=31e210=1024 +aritmetica Porcentagem 15\% \cdot 200 = 30 15%·200=30 +aritmetica Fração de fração \frac{\frac{1}{2}}{\frac{3}{4}} = \frac{2}{3} 1234=23 +conjuntos_logica PertinĂȘncia e compreensĂŁo \{ x \in \mathbb{Z} : x > 5 \} {x∈ℤ:x>5} +conjuntos_logica UniĂŁo e interseção (A \cup B) \cap C = (A \cap C) \cup (B \cap C) (A∪B)∩C=(A∩C)∪(B∩C) +conjuntos_logica Implicação p \Rightarrow q \equiv \neg p \lor q p⇒q≡¬p∨q +conjuntos_logica Quantificadores \forall \varepsilon > 0 \; \exists \delta > 0 ∀ε>0∃δ>0 +conjuntos_logica ContinĂȘncia \emptyset \subseteq A \subseteq \mathbb{N} ∅⊆A⊆ℕ +calculo Limite fundamental \lim_{x \to 0} \frac{\sin x}{x} = 1 limx→0sinxx=1 +calculo Derivada \frac{d}{dx}\left(x^{2} e^{x}\right) = 2x e^{x} + x^{2} e^{x} ddx(x2ex)=2xex+x2ex +calculo Integral definida \int_{0}^{1} x^{2}\,dx = \frac{1}{3} ∫01x2dx=13 +calculo SĂ©rie \sum_{n=1}^{\infty} \frac{1}{n^{2}} = \frac{\pi^{2}}{6} ∑n=1∞1n2=π26 +calculo Derivada parcial \frac{\partial f}{\partial x} = 2xy ∂f∂x=2xy +algebra_linear Matriz e determinante A = \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix}, \quad \det(A) = -2 A=(1234),det(A)=−2 +algebra_linear Sistema A\mathbf{x} = \mathbf{b}, \quad \mathbf{x} \in \mathbb{R}^{n} A𝐱=𝐛,𝐱∈ℝn +algebra_linear Autovalor A v = \lambda v Av=λv +algebra_linear Produto interno e norma \langle u, v \rangle = \|u\| \|v\| \cos\theta ⟨u,v⟩=‖u‖‖v‖cosθ +algebra_linear Transposta e inversa (AB)^{T} = B^{T} A^{T}, \quad A^{-1}A = I (AB)T=BTAT,A−1A=I +quimica Água \mathrm{2H_2 + O_2 \longrightarrow 2H_2O} 2H2+O2⟶2H2O +quimica Ácido carbĂŽnico \mathrm{CO_2 + H_2O \rightleftharpoons H_2CO_3} CO2+H2O⇌H2CO3 +quimica Íon \mathrm{Na^{+} + Cl^{-} \longrightarrow NaCl} Na++Cl−⟶NaCl +quimica Concentração [\mathrm{H^{+}}] = 10^{-7}\ \mathrm{mol/L} [H+]=10−7 mol/L +quimica IsĂłtopo {}^{14}_{6}\mathrm{C} 614C +estatistica MĂ©dia amostral \bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_{i} x¯=1n∑i=1nxi +estatistica VariĂąncia \sigma^{2} = \frac{\sum (x_{i} - \mu)^{2}}{N} σ2=∑(xi−μ)2N +estatistica Probabilidade condicional P(A \mid B) = \frac{P(A \cap B)}{P(B)} P(A∣B)=P(A∩B)P(B) +estatistica Binomial \binom{n}{k} p^{k} (1-p)^{n-k} (nk)pk(1−p)n−k +estatistica Normal X \sim N(\mu, \sigma^{2}) X~N(μ,σ2) diff --git a/tests/Languages/pt/intent.rs b/tests/Languages/pt/intent.rs new file mode 100644 index 000000000..df164bc1b --- /dev/null +++ b/tests/Languages/pt/intent.rs @@ -0,0 +1,72 @@ +/// TESTES DO IDIOMA pt — como reconciliar com as regras +/// +/// As strings esperadas abaixo foram escritas para refletir a intenção +/// das regras em Rules/Languages/pt. VĂ­rgulas e ponto-e-vĂ­rgula marcam +/// PAUSAS inseridas pelo motor e podem divergir levemente na primeira +/// execução. MĂ©todo do guia oficial de tradutores: +/// 1. rode `cargo test Languages::pt` +/// 2. para cada falha, compare `left` (esperado) com `right` (gerado) +/// 3. se o GERADO estiver correto em portuguĂȘs, copie-o para o teste; +/// se estiver errado, conserte a REGRA, nunca o teste. +/// + +/// Tests for rules shared between various speech styles: +/// * this has tests focused on the various alphabets +use crate::common::*; +use anyhow::Result; + + +#[test] +fn silent_intent_mi() -> Result<()> { + let expr = " 2 x"; + test("pt", "SimpleSpeak", expr, "2")?; + // ClearSpeak reativado: Rules/Languages/pt/ClearSpeak_Rules.yaml traduzido. + // Pausas (vĂ­rgula/ponto-e-vĂ­rgula) podem precisar de reconciliação via cargo test. + test("pt", "ClearSpeak", expr, "2")?; + return Ok(()); + +} + +#[test] +fn silent_intent_msup() -> Result<()> { + let expr = " + + H + 2 + "; + test("pt", "SimpleSpeak", expr, "maiĂșscula h 2")?; + // ClearSpeak reativado: Rules/Languages/pt/ClearSpeak_Rules.yaml traduzido. + // Pausas (vĂ­rgula/ponto-e-vĂ­rgula) podem precisar de reconciliação via cargo test. + test("pt", "ClearSpeak", expr, "maiĂșscula h 2")?; + return Ok(()); + +} + +#[test] +fn silent_intent_underscore() -> Result<()> { + let expr = " + + H + 2 + "; + test("pt", "SimpleSpeak", expr, "maiĂșscula h 2")?; + // ClearSpeak reativado: Rules/Languages/pt/ClearSpeak_Rules.yaml traduzido. + // Pausas (vĂ­rgula/ponto-e-vĂ­rgula) podem precisar de reconciliação via cargo test. + test("pt", "ClearSpeak", expr, "maiĂșscula h 2")?; + return Ok(()); + +} + +#[test] +fn intent_prob_x() -> Result<()> { + let expr = " + + x + P + "; + // ClearSpeak reativado: Rules/Languages/pt/ClearSpeak_Rules.yaml traduzido. + // Pausas (vĂ­rgula/ponto-e-vĂ­rgula) podem precisar de reconciliação via cargo test. + test("pt", "ClearSpeak", expr, "probabilidade de x")?; + return Ok(()); + +} diff --git a/tests/Languages/pt/shared.rs b/tests/Languages/pt/shared.rs new file mode 100644 index 000000000..cf860236b --- /dev/null +++ b/tests/Languages/pt/shared.rs @@ -0,0 +1,346 @@ +/// TESTES DO IDIOMA pt — como reconciliar com as regras +/// +/// As strings esperadas abaixo foram escritas para refletir a intenção +/// das regras em Rules/Languages/pt. VĂ­rgulas e ponto-e-vĂ­rgula marcam +/// PAUSAS inseridas pelo motor e podem divergir levemente na primeira +/// execução. MĂ©todo do guia oficial de tradutores: +/// 1. rode `cargo test Languages::pt` +/// 2. para cada falha, compare `left` (esperado) com `right` (gerado) +/// 3. se o GERADO estiver correto em portuguĂȘs, copie-o para o teste; +/// se estiver errado, conserte a REGRA, nunca o teste. +/// +/// ATENÇÃO ao histĂłrico: o arquivo espanhol equivalente continha testes +/// que nĂŁo refletiam as regras (ex.: esperava "logaritmo natural" com a +/// regra dizendo "natural log") e dano de busca-e-troca (ex.: "eigh"→"8"). +/// NĂŁo herde strings esperadas de es/ sem conferir. + +/// Tests for rules shared between various speech styles: +/// * modified var +use crate::common::*; +use anyhow::Result; + +#[test] +fn modified_vars() -> Result<()> { + let expr = " + a ` + b ~ + c ̆ + b ̌ + c ` + + x . + y ˙ + z ¨ + u ⃛ + v ⃜ + + x ^ + + t → + "; + test("pt", "SimpleSpeak", expr, + "a acento grave, b til, c breve, b cĂĄron, c acento grave; mais; x ponto, y ponto, z dois pontos, u trĂȘs pontos acima; v quatro pontos acima; mais x circunflexo, mais vetor t")?; + return Ok(()); + +} + +#[test] +fn limit() -> Result<()> { + let expr = " + + lim + x → 0 + + + + sin ⁡ x + x + + + "; + test("pt", "SimpleSpeak", expr, "limite quando x tende a 0, de, fração, seno de x, sobre x, fim da fração")?; + return Ok(()); + +} + +#[test] +fn limit_from_below() -> Result<()> { + let expr = " + + lim + x ↗ 0 + + + sin ⁡ x + + "; + test("pt", "SimpleSpeak", expr, "limite quando x tende por baixo a 0, de seno de x")?; + return Ok(()); + +} + + +#[test] +fn binomial_mmultiscripts() -> Result<()> { + let expr = "Cmn"; + test("pt", "SimpleSpeak", expr, "n escolhe m")?; + return Ok(()); + +} + + +#[test] +fn permutation_mmultiscripts() -> Result<()> { + let expr = "Pkn"; + test("pt", "SimpleSpeak", expr, "k permutaçÔes de n")?; + return Ok(()); + +} + +#[test] +fn permutation_mmultiscripts_sup() -> Result<()> { + let expr = "Pkn"; + test("pt", "SimpleSpeak", expr, "k permutaçÔes de n")?; + return Ok(()); + +} + +#[test] +fn permutation_msubsup() -> Result<()> { + let expr = "Pkn"; + test("pt", "SimpleSpeak", expr, "k permutaçÔes de n")?; + return Ok(()); + +} + +#[test] +fn tensor_mmultiscripts() -> Result<()> { + let expr = " + R i j k l + "; + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, + "maiĂșscula r com 4 pĂłs-escritos, subscrito i sobrescrito j subscrito k subscrito l")?; + // em Medium as regras usam a forma abreviada ('sub'/'super'), como no inglĂȘs; + // a forma longa fica reservada ao Verbose (SharedRules/default.yaml). + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Medium")], expr, + "maiĂșscula r com 4 pĂłs-escritos, sub i super j sub k sub l")?; + return Ok(()); + +} + +#[test] +fn huge_num_mmultiscripts() -> Result<()> { + let expr = " + R i j k l m + I J K L + "; + test_prefs("pt", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, + "maiĂșscula r com 4 prĂ©-escritos, prĂ©-subscrito maiĂșscula i, prĂ©-sobrescrito maiĂșscula j e prĂ©-escritos alternados maiĂșscula k nenhum maiĂșscula l nenhum fim dos prĂ©-escritos e com 5 pĂłs-escritos, subscrito i sobrescrito j subscrito k subscrito l e Ă­ndices alternados m nenhum fim dos Ă­ndices")?; + return Ok(()); + +} + +#[test] +fn prime() -> Result<()> { + let expr = " x′ "; + test("pt", "SimpleSpeak", expr, "x linha")?; + return Ok(()); + +} + +#[test] +fn given() -> Result<()> { + let expr = "P(A|B)"; + // "dado": em P(A|B) a barra Ă© probabilidade condicional nos dois estilos, + // como no inglĂȘs ("cap eigh given cap b"). + test("pt", "SimpleSpeak", expr, "maiĂșscula p; abre parĂȘnteses, maiĂșscula a dado maiĂșscula b; fecha parĂȘnteses")?; + test("pt", "ClearSpeak", expr, "maiĂșscula p; abre parĂȘnteses, maiĂșscula a dado maiĂșscula b; fecha parĂȘnteses")?; // not good, but follows the spec + return Ok(()); + +} + +#[test] +fn simple_msubsup() -> Result<()> { + let expr = " + + + x + + k + + + i + + + + "; + test("pt", "SimpleSpeak", expr, "x subscrito k elevado a i")?; + return Ok(()); + +} + +#[test] +fn presentation_mathml_in_semantics() -> Result<()> { + let expr = " + + {\\displaystyle x_k^i} + + + x + + k + + + i + + + + + "; + test("pt", "SimpleSpeak", expr, "x subscrito k elevado a i")?; + return Ok(()); + +} + +#[test] +fn ignore_period() -> Result<()> { + // from https://en.wikipedia.org/wiki/Probability + let expr = " + + {\\displaystyle x_k^i} + + + + P + ( + A + + +  e  + + + B + ) + = + P + ( + A + ∩ + B + ) + = + P + ( + A + ) + P + ( + B + ) + . + + + + + "; + test("pt", "SimpleSpeak", expr, "maiĂșscula p; abre parĂȘnteses, maiĂșscula a e maiĂșscula b; fecha parĂȘnteses; Ă© igual a; maiĂșscula p; abre parĂȘnteses, maiĂșscula a interseção maiĂșscula b; fecha parĂȘnteses; Ă© igual a; maiĂșscula p de maiĂșscula a; maiĂșscula p de maiĂșscula b")?; + return Ok(()); + +} + +#[test] +fn ignore_mtext_period() -> Result<()> { + let expr = "{2}."; + test("pt", "SimpleSpeak", expr, "o conjunto 2")?; + return Ok(()); + +} + +#[test] +fn ignore_comma() -> Result<()> { + // from https://en.wikipedia.org/wiki/Probability + let expr = " + + + ϕ + ( + x + ) + = + c + + e + + − + + h + + 2 + + + + x + + 2 + + + + + , + + +"; + test("pt", "SimpleSpeak", expr, "fi reto de x, Ă© igual a; c vezes, e elevado Ă  potĂȘncia menos h ao quadrado, x ao quadrado")?; + return Ok(()); + +} + +#[test] +#[ignore] // issue #14 +fn ignore_period_and_space() -> Result<()> { + // from https://en.wikipedia.org/wiki/Probability + let expr = " + + + P + ( + A + ∣ + B + ) + = + + + + P + ( + A + ∩ + B + ) + + + P + ( + B + ) + + + + . + + + +"; + // ClearSpeak reativado: Rules/Languages/pt/ClearSpeak_Rules.yaml traduzido. + // Pausas (vĂ­rgula/ponto-e-vĂ­rgula) podem precisar de reconciliação via cargo test. + test("pt", "ClearSpeak", expr, "fi reto de x Ă© igual a; c, e elevado a menos h ao quadrado x ao quadrado, fim do expoente")?; + return Ok(()); + +} + + +#[test] +fn mn_with_space() -> Result<()> { + let expr = "1 234 567"; + test("pt", "SimpleSpeak", expr, "1234567")?; + return Ok(()); + +} diff --git a/tests/Languages/pt/unicode_full.rs b/tests/Languages/pt/unicode_full.rs new file mode 100644 index 000000000..1d1d659d7 --- /dev/null +++ b/tests/Languages/pt/unicode_full.rs @@ -0,0 +1,159 @@ +/// TESTES DO IDIOMA pt — decisĂ”es de terminologia registradas em +/// Rules/Languages/pt/ACHADOS.md, seção 8. +/// +/// Este arquivo cobre duas decisĂ”es que antes nĂŁo tinham teste nenhum: +/// * 8.2 — numerais romanos Unicode (0x2160-0x217F) falam o VALOR; +/// * 8.3 — os expoentes ⁰ e ⁱ usam a forma cardinal. +/// e fixa o comportamento ASCII que foi decidido PRESERVAR, para que uma +/// mudança futura no caminho de inferĂȘncia de contexto nĂŁo passe em silĂȘncio. +/// +/// Todas as expectativas abaixo foram capturadas da saĂ­da real do motor, sob +/// as preferĂȘncias do prĂłprio harness — nĂŁo foram escritas a partir do que se +/// esperava que saĂ­sse. +use crate::common::*; +use anyhow::Result; + +// --------------------------------------------------------------------------- +// 8.2 — Numerais romanos Unicode: falar o valor, nĂŁo a grafia. +// Antes desta decisĂŁo a saĂ­da era a soletração ("I V", "X I I", "M"). +// --------------------------------------------------------------------------- + +#[test] +fn numerais_romanos_unicode_falam_o_valor() -> Result<()> { + // Representativos da faixa 0x2160-0x216F (maiĂșsculas). + let expr = "Ⅰ"; // 0x2160 + test("pt", "SimpleSpeak", expr, "um")?; + let expr = "Ⅳ"; // 0x2163 — o caso que motivou a decisĂŁo + test("pt", "SimpleSpeak", expr, "quatro")?; + let expr = "Ⅻ"; // 0x216b + test("pt", "SimpleSpeak", expr, "doze")?; + let expr = "Ⅼ"; // 0x216c + test("pt", "SimpleSpeak", expr, "cinquenta")?; + let expr = "Ⅽ"; // 0x216d + test("pt", "SimpleSpeak", expr, "cem")?; + let expr = "ⅼ"; // 0x216e + test("pt", "SimpleSpeak", expr, "quinhentos")?; + let expr = "Ⅿ"; // 0x216f + test("pt", "SimpleSpeak", expr, "mil")?; + return Ok(()); +} + +#[test] +fn numerais_romanos_unicode_minusculos() -> Result<()> { + // A metade minĂșscula da faixa (0x2170-0x217F) tem os mesmos valores. + let expr = "ⅳ"; // 0x2173 + test("pt", "SimpleSpeak", expr, "quatro")?; + let expr = "ⅿ"; // 0x217f + test("pt", "SimpleSpeak", expr, "mil")?; + return Ok(()); +} + +#[test] +fn numerais_romanos_unicode_em_expressao() -> Result<()> { + // O valor tambĂ©m Ă© falado quando o numeral aparece dentro de uma conta. + let expr = "Ⅳ+Ⅻ"; + test("pt", "SimpleSpeak", expr, "quatro mais doze")?; + // A decisĂŁo nĂŁo depende do estilo de fala. + test("pt", "ClearSpeak", expr, "quatro mais doze")?; + return Ok(()); +} + +#[test] +fn numerais_romanos_unicode_em_mn() -> Result<()> { + // O caractere dedicado vale como numeral tanto em quanto em . + let expr = "Ⅳ"; + test("pt", "SimpleSpeak", expr, "quatro")?; + return Ok(()); +} + +// --------------------------------------------------------------------------- +// 8.3 — Expoentes ⁰ e ⁱ na forma cardinal. +// Antes: "elevado Ă  potĂȘncia zero" / "elevado Ă  potĂȘncia i". +// --------------------------------------------------------------------------- + +#[test] +fn expoente_zero_e_i_forma_cardinal() -> Result<()> { + let expr = "x⁰"; // 0x2070 + test("pt", "SimpleSpeak", expr, "x elevado a zero")?; + let expr = "xⁱ"; // 0x2071 + test("pt", "SimpleSpeak", expr, "x elevado a i")?; + // A decisĂŁo nĂŁo depende do estilo de fala. + let expr = "x⁰"; + test("pt", "ClearSpeak", expr, "x elevado a zero")?; + return Ok(()); +} + +#[test] +fn expoente_zero_e_i_isolados() -> Result<()> { + let expr = "⁰"; + test("pt", "SimpleSpeak", expr, "elevado a zero")?; + let expr = "ⁱ"; + test("pt", "SimpleSpeak", expr, "elevado a i")?; + return Ok(()); +} + +#[test] +fn expoentes_ordinais_vizinhos_intactos() -> Result<()> { + // As entradas vizinhas continuam na forma ORDINAL: a decisĂŁo 8.3 valeu sĂł + // para ⁰ e ⁱ, que nĂŁo tĂȘm ordinal. Este teste existe para impedir que + // alguĂ©m "uniformize" o bloco inteiro por engano (ver ACHADOS 5.2). + let expr = "x⁎"; // 0x2074 + test("pt", "SimpleSpeak", expr, "x elevado Ă  quarta potĂȘncia")?; + let expr = "xⁿ"; // 0x207f + test("pt", "SimpleSpeak", expr, "x elevado Ă  enĂ©sima potĂȘncia")?; + return Ok(()); +} + +// --------------------------------------------------------------------------- +// GUARDA DE REGRESSÃO — o caminho ASCII foi decidido intocado (ACHADOS 8.2). +// +// Numerais romanos escritos com letras ASCII NÃO passam pelo unicode-full.yaml: +// sĂŁo marcados por src/canonicalize.rs com `data-roman-numeral` e falados pelas +// regras `default` de / em SharedRules/default.yaml, que soletram. +// Esse Ă© o mesmo ramo de regra que trata I e V como identificador ou variĂĄvel. +// +// Se algum dia o valor passar a ser falado tambĂ©m no caminho ASCII, ESTES +// testes vĂŁo falhar — e Ă© essa a intenção: a mudança tem que ser deliberada. +// --------------------------------------------------------------------------- + +#[test] +fn romanos_ascii_continuam_soletrados_nao_viram_valor() -> Result<()> { + // XIV NÃO deve virar "quatorze". + let expr = "XIV"; + test("pt", "SimpleSpeak", expr, "maiĂșscula x maiĂșscula i maiĂșscula v")?; + let expr = "XIV"; + test("pt", "SimpleSpeak", expr, "maiĂșscula x maiĂșscula i maiĂșscula v")?; + // TambĂ©m nĂŁo depende do estilo de fala. + let expr = "XIV"; + test("pt", "ClearSpeak", expr, "maiĂșscula x maiĂșscula i maiĂșscula v")?; + // MIX (1009 em romano) Ă© o caso clĂĄssico de colisĂŁo com palavra. + let expr = "MIX"; + test("pt", "SimpleSpeak", expr, "maiĂșscula m maiĂșscula i maiĂșscula x")?; + // MinĂșsculas idem: "xiv" nĂŁo vira "quatorze". + let expr = "xiv"; + test("pt", "SimpleSpeak", expr, "x i v")?; + return Ok(()); +} + +#[test] +fn letras_ascii_isoladas_continuam_identificadores() -> Result<()> { + // I e V sozinhos sĂŁo identificadores/variĂĄveis, nĂŁo os romanos 1 e 5. + // Este Ă© o caminho que a decisĂŁo 8.2 mandou explicitamente NÃO tocar. + let expr = "I"; + test("pt", "SimpleSpeak", expr, "maiĂșscula i")?; + let expr = "V"; + test("pt", "SimpleSpeak", expr, "maiĂșscula v")?; + // Separados, continuam trĂȘs identificadores — nĂŁo o numeral 14. + let expr = "XIV"; + test("pt", "SimpleSpeak", expr, "maiĂșscula x maiĂșscula i maiĂșscula v")?; + return Ok(()); +} + +#[test] +fn romano_ascii_em_estado_de_oxidacao_intacto() -> Result<()> { + // O caminho da quĂ­mica (estado de oxidação) usa romanos ASCII e tem o seu + // prĂłprio tratamento em src/chemistry.rs. A decisĂŁo 8.2 nĂŁo o alcança. + let expr = "IV"; + test("pt", "SimpleSpeak", expr, "maiĂșscula i maiĂșscula v")?; + return Ok(()); +} diff --git a/tests/Languages/pt/units.rs b/tests/Languages/pt/units.rs new file mode 100644 index 000000000..47bd73056 --- /dev/null +++ b/tests/Languages/pt/units.rs @@ -0,0 +1,411 @@ +/// TESTES DO IDIOMA pt — como reconciliar com as regras +/// +/// As strings esperadas abaixo foram escritas para refletir a intenção +/// das regras em Rules/Languages/pt. VĂ­rgulas e ponto-e-vĂ­rgula marcam +/// PAUSAS inseridas pelo motor e podem divergir levemente na primeira +/// execução. MĂ©todo do guia oficial de tradutores: +/// 1. rode `cargo test Languages::pt` +/// 2. para cada falha, compare `left` (esperado) com `right` (gerado) +/// 3. se o GERADO estiver correto em portuguĂȘs, copie-o para o teste; +/// se estiver errado, conserte a REGRA, nunca o teste. +/// +/// ATENÇÃO ao histĂłrico: o arquivo espanhol equivalente continha testes +/// que nĂŁo refletiam as regras (ex.: esperava "logaritmo natural" com a +/// regra dizendo "natural log") e dano de busca-e-troca (ex.: "eigh"→"8"). +/// NĂŁo herde strings esperadas de es/ sem conferir. + +/// Tests for rules shared between various speech styles: +/// * modified var +use crate::common::*; +use anyhow::Result; + +// The basic layout of the tests is: +// 1. Sweep through all the SI prefixes +// 2. Sweep through each group of SI units +// a) with both singular and plural without prefixes +// b) with both singular and plural with one prefix +// 3. Sweep through each group of units that don't take SI prefixes +// These are broken into chunks so it is easier to see errors, when there are errors + +#[test] +fn prefix_sweep() -> Result<()> { + let expr = r#" + Qg, + Rg, + Yg, + Zg, + Eg, + Pg, + Tg, + Gg, + Mg, + kg, + hg, + dag, + dg, + cg, + mg, + ”g, + ng, + pg, + fg, + ag, + zg, + yg, + rg, + qg + "#; + test("pt", "SimpleSpeak", expr, + "quettagramas vĂ­rgula, ronnagramas vĂ­rgula, yottagramas vĂ­rgula, zettagramas vĂ­rgula, exagramas vĂ­rgula, petagramas vĂ­rgula, teragramas vĂ­rgula, gigagramas vĂ­rgula, megagramas vĂ­rgula, quilogramas vĂ­rgula, hectogramas vĂ­rgula, decagramas vĂ­rgula, decigramas vĂ­rgula, centigramas vĂ­rgula, miligramas vĂ­rgula, microgramas vĂ­rgula, nanogramas vĂ­rgula, picogramas vĂ­rgula, femtogramas vĂ­rgula, attogramas vĂ­rgula, zeptogramas vĂ­rgula, yoctogramas vĂ­rgula, rontogramas vĂ­rgula, quectogramas")?; + return Ok(()); + +} + +#[test] +fn si_base() -> Result<()> { + let expr = r#" + 1A,2A, + 1cd,2cd, + 1K,2K, + 1â„Ș,2â„Ș, + 1g,2g, + 1m,2m, + 1mol,2mol, + 1s,2s, + 1″,2″, + 1",2", + 1sec,2sec + "#; + test("pt", "SimpleSpeak", expr, + "1 ampĂšre, vĂ­rgula; 2 ampĂšres, vĂ­rgula; 1 candela, vĂ­rgula; 2 candelas, vĂ­rgula; 1 kelvin, vĂ­rgula; 2 kelvins, vĂ­rgula; 1 kelvin, vĂ­rgula; 2 kelvins, vĂ­rgula, 1 grama, vĂ­rgula; 2 gramas, vĂ­rgula, 1 metro, vĂ­rgula; 2 metros, vĂ­rgula, 1 mol, vĂ­rgula, 2 mols, vĂ­rgula; 1 segundo, vĂ­rgula; 2 segundos, vĂ­rgula; 1 segundo, vĂ­rgula; 2 segundos, vĂ­rgula; 1 segundo, vĂ­rgula; 2 segundos, vĂ­rgula; 1 segundo, vĂ­rgula; 2 segundos")?; + return Ok(()); + +} + +#[test] +fn si_base_with_prefixes() -> Result<()> { + let expr = r#" + 1QA,2RA, + 1Ycd,2Zcd, + 1EK,2PK, + 1Tâ„Ș,2Gâ„Ș, + 1Mg,2kg, + 1hm,2dam, + 1dmol,2cmol, + 1ms,2”s, + 1nsec,2psec + "#; + test("pt", "SimpleSpeak", expr, + "1 quettaampĂšre, vĂ­rgula; 2 ronnaampĂšres, vĂ­rgula; 1 yottacandela, vĂ­rgula; 2 zettacandelas, vĂ­rgula; 1 exakelvin, vĂ­rgula; 2 petakelvins, vĂ­rgula; 1 terakelvin, vĂ­rgula; 2 gigakelvins, vĂ­rgula; 1 megagrama, vĂ­rgula; 2 quilogramas, vĂ­rgula; 1 hectĂŽmetro, vĂ­rgula; 2 decĂąmetros, vĂ­rgula; 1 decimol, vĂ­rgula; 2 centimols, vĂ­rgula; 1 milissegundo, vĂ­rgula; 2 microssegundos, vĂ­rgula; 1 nanossegundo, vĂ­rgula; 2 picossegundos")?; + return Ok(()); + +} + + +#[test] +fn si_derived_1() -> Result<()> { + let expr = r#" + 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 + "#; + test("pt", "SimpleSpeak", expr, + "1 becquerel, vĂ­rgula; 2 becquerels, vĂ­rgula; 1 coulomb, vĂ­rgula; 2 coulombs, vĂ­rgula; 1 grau Celsius, vĂ­rgula; 2 graus Celsius, vĂ­rgula; 1 grau Celsius, vĂ­rgula; 2 graus Celsius, vĂ­rgula, 1 farad, vĂ­rgula; 2 farads, vĂ­rgula, 1 gray, vĂ­rgula, 2 grays, vĂ­rgula, 1 henry, vĂ­rgula; 2 henrys, vĂ­rgula, 1 hertz, vĂ­rgula, 2 hertz, vĂ­rgula, 1 joule, vĂ­rgula; 2 joules, vĂ­rgula, 1 katal, vĂ­rgula; 2 katals, vĂ­rgula; 1 lĂșmen, vĂ­rgula; 2 lĂșmens, vĂ­rgula, 1 lux, vĂ­rgula, 2 lux")?; + return Ok(()); + +} + +#[test] +fn si_derived_1_with_prefixes() -> Result<()> { + let expr = r#" + 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℃ + "#; + test("pt", "SimpleSpeak", expr, + "1 quettabecquerel, vĂ­rgula; 2 ronnabecquerels, vĂ­rgula; 1 yottacoulomb, vĂ­rgula; 2 zettacoulombs, vĂ­rgula; 1 exafarad, vĂ­rgula; 2 petafarads, vĂ­rgula; 1 teragray, vĂ­rgula; 2 gigagrays, vĂ­rgula; 1 megahenry, vĂ­rgula; 2 quilohenrys, vĂ­rgula; 1 decahertz, vĂ­rgula; 2 decihertz, vĂ­rgula; 1 centijoule, vĂ­rgula; 2 milijoules, vĂ­rgula; 1 microkatal, vĂ­rgula; 2 nanokatals, vĂ­rgula; 1 picolĂșmen, vĂ­rgula; 2 femtolĂșmens, vĂ­rgula; 1 attolux, vĂ­rgula; 2 zeptolux, vĂ­rgula; 1 miligrau Celsius, vĂ­rgula; 2 micrograus Celsius, vĂ­rgula; 1 picograu Celsius, vĂ­rgula; 2 nanograus Celsius")?; + return Ok(()); + +} + +#[test] +fn si_derived_2() -> Result<()> { + let expr = r#" + 1N,2N, + 1Ω,2Ω, + 1℩,2℩, + 1Pa,2Pa, + 1S,2S, + 1Sv,2Sv, + 1T,2T, + 1V,2V, + 1W,2W, + 1Wb,2Wb + "#; + test("pt", "SimpleSpeak", expr, + "1 newton, vĂ­rgula; 2 newtons, vĂ­rgula, 1 ohm, vĂ­rgula, 2 ohms, vĂ­rgula, 1 ohm, vĂ­rgula, 2 ohms, vĂ­rgula; 1 pascal, vĂ­rgula; 2 pascals, vĂ­rgula; 1 siemens, vĂ­rgula; 2 siemens, vĂ­rgula; 1 sievert, vĂ­rgula; 2 sieverts, vĂ­rgula, 1 tesla, vĂ­rgula; 2 teslas, vĂ­rgula, 1 volt, vĂ­rgula, 2 volts, vĂ­rgula, 1 watt, vĂ­rgula, 2 watts, vĂ­rgula, 1 weber, vĂ­rgula; 2 webers")?; + return Ok(()); + +} + +#[test] +fn si_derived_2_with_prefixes() -> Result<()> { + let expr = r#" + 1qN,2rN, + 1yΩ,2zΩ, + 1a℩,2f℩, + 1pPa,2nPa, + 1”S,2mS, + 1cSv,2dSv, + 1daT,2hT, + 1kV,2MV, + 1GW,2TW, + 1PWb,2EWb + "#; + test("pt", "SimpleSpeak", expr, + "1 quectonewton, vĂ­rgula; 2 rontonewtons, vĂ­rgula; 1 yoctoohm, vĂ­rgula; 2 zeptoohms, vĂ­rgula; 1 attoohm, vĂ­rgula; 2 femtoohms, vĂ­rgula; 1 picopascal, vĂ­rgula; 2 nanopascals, vĂ­rgula; 1 microssiemens, vĂ­rgula; 2 milissiemens, vĂ­rgula; 1 centissievert, vĂ­rgula; 2 decissieverts, vĂ­rgula; 1 decatesla, vĂ­rgula; 2 hectoteslas, vĂ­rgula; 1 quilovolt, vĂ­rgula; 2 megavolts, vĂ­rgula; 1 gigawatt, vĂ­rgula; 2 terawatts, vĂ­rgula; 1 petaweber, vĂ­rgula; 2 exawebers")?; + return Ok(()); + +} + + +#[test] +fn si_accepted() -> Result<()> { + let expr = r#" + 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 + "#; + test("pt", "SimpleSpeak", expr, + "1 litro, vĂ­rgula; 2 litros, vĂ­rgula, 1 litro, vĂ­rgula; 2 litros, vĂ­rgula, 1 litro, vĂ­rgula; 2 litros, vĂ­rgula; 1 tonelada, vĂ­rgula; 2 toneladas, vĂ­rgula; 1 dalton, vĂ­rgula; 2 daltons, vĂ­rgula, 1 neper, vĂ­rgula; 2 neperes, vĂ­rgula; 1 unidade de massa atĂŽmica, vĂ­rgula; 2 unidades de massa atĂŽmica; vĂ­rgula; 1 elĂ©tron-volt, vĂ­rgula; 2 elĂ©tron-volts, vĂ­rgula; 1 radiano, vĂ­rgula; 2 radianos, vĂ­rgula; 1 esferorradiano, vĂ­rgula; 2 esferorradianos, vĂ­rgula, 1 ano, vĂ­rgula, 2 anos, vĂ­rgula; 1 segundo de arco, vĂ­rgula; 2 segundos de arco, vĂ­rgula, 1 bit, vĂ­rgula, 2 bits, vĂ­rgula, 1 byte, vĂ­rgula, 2 bytes, vĂ­rgula, 1 baud, vĂ­rgula, 2 bauds")?; + return Ok(()); + +} + +#[test] +fn si_accepted_with_prefixes() -> Result<()> { + let expr = r#" + 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 + "#; + test("pt", "SimpleSpeak", expr, + "1 quettalitro, vĂ­rgula; 2 ronnalitros, vĂ­rgula; 1 yottalitro, vĂ­rgula; 2 zettalitros, vĂ­rgula; 1 exalitro, vĂ­rgula; 2 petalitros, vĂ­rgula; 1 teratonelada, vĂ­rgula; 2 gigatoneladas, vĂ­rgula; 1 megadalton, vĂ­rgula; 2 quilodaltons, vĂ­rgula; 1 decineper, vĂ­rgula; 2 centineperes, vĂ­rgula; 1 hectounidade de massa atĂŽmica; vĂ­rgula; 2 decaunidades de massa atĂŽmica; vĂ­rgula; 1 milielĂ©tron-volt, vĂ­rgula; 2 microelĂ©tron-volts, vĂ­rgula; 1 nanorradiano, vĂ­rgula; 2 picorradianos, vĂ­rgula; 1 femtoesferorradiano, vĂ­rgula; 2 attoesferorradianos, vĂ­rgula; 1 gigaano, vĂ­rgula; 2 megaanos, vĂ­rgula; 1 zeptossegundo de arco, vĂ­rgula; 2 yoctossegundos de arco, vĂ­rgula; 1 quilobit, vĂ­rgula; 2 megabits, vĂ­rgula; 1 gigabyte, vĂ­rgula; 2 terabytes, vĂ­rgula; 1 terabaud, vĂ­rgula; 2 exabauds")?; + return Ok(()); + +} + +#[test] +fn without_prefix_time() -> Result<()> { + let expr = r#" + 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 + "#; + test("pt", "SimpleSpeak", expr, + "1 segundo, vĂ­rgula; 2 segundos, vĂ­rgula; 1 segundo, vĂ­rgula; 2 segundos, vĂ­rgula; 1 minuto, vĂ­rgula; 2 minutos, vĂ­rgula; 1 minuto, vĂ­rgula; 2 minutos, vĂ­rgula; 1 minuto, vĂ­rgula; 2 minutos, vĂ­rgula, 1 hora, vĂ­rgula, 2 horas, vĂ­rgula, 1 hora, vĂ­rgula, 2 horas, vĂ­rgula, 1 hora, vĂ­rgula, 2 horas, vĂ­rgula, 1 dia, vĂ­rgula, 2 dias, vĂ­rgula, 1 dia, vĂ­rgula, 2 dias, vĂ­rgula; 1 semana, vĂ­rgula; 2 semanas, vĂ­rgula; 1 semana, vĂ­rgula; 2 semanas, vĂ­rgula, 1 ano, vĂ­rgula, 2 anos, vĂ­rgula, 1 ano, vĂ­rgula, 2 anos")?; + return Ok(()); + +} + +#[test] +fn without_prefix_angles() -> Result<()> { + let expr = r#" + 1°,2°, + 1deg,2deg, + 1arcmin,2arcmin, + 1amin,2amin, + 1am,2am, + 1MOA,2MOA, + 1arcsec,2arcsec, + 1asec,2asec + "#; + test("pt", "SimpleSpeak", expr, + "1 grau, vĂ­rgula, 2 graus, vĂ­rgula, \ + 1 grau, vĂ­rgula, 2 graus, vĂ­rgula; \ + 1 minuto de arco, vĂ­rgula; 2 minutos de arco, vĂ­rgula; \ + 1 minuto de arco, vĂ­rgula; 2 minutos de arco, vĂ­rgula; \ + 1 minuto de arco, vĂ­rgula; 2 minutos de arco, vĂ­rgula; \ + 1 minuto de arco, vĂ­rgula; 2 minutos de arco, vĂ­rgula; \ + 1 segundo de arco, vĂ­rgula; 2 segundos de arco, vĂ­rgula; \ + 1 segundo de arco, vĂ­rgula; 2 segundos de arco")?; + return Ok(()); + +} + +#[test] +fn without_prefix_distance() -> Result<()> { + let expr = r#" + 1au,2au, + 1ltyr,2ltyr, + 1pc,2pc, + 1Å,2Å, + 1Å,2Å, + 1fm,2fm + "#; + test("pt", "SimpleSpeak", expr, + "1 unidade astronĂŽmica, vĂ­rgula; 2 unidades astronĂŽmicas, vĂ­rgula; 1 ano-luz, vĂ­rgula; 2 anos-luz, vĂ­rgula; 1 parsec, vĂ­rgula; 2 parsecs, vĂ­rgula; 1 angström, vĂ­rgula; 2 angströms, vĂ­rgula; 1 angström, vĂ­rgula; 2 angströms, vĂ­rgula, 1 fermi, vĂ­rgula; 2 fermis")?; + return Ok(()); + +} + +#[test] +fn without_prefix_other() -> Result<()> { + let expr = r#" + 1ha,2ha, + 1dB,2dB, + 1atm,2atm, + 1amu,2amu, + 1bar,2bar, + 1cal,2cal, + 1Ci,2Ci, + 1grad,2grad, + 1M,2M, + 1R,2R, + 1rpm,2rpm, + 1℧,2℧, + 1dyn,2dyn, + 1erg,2erg + "#; + test("pt", "SimpleSpeak", expr, + "1 hectare, vĂ­rgula; 2 hectares, vĂ­rgula; 1 decibel, vĂ­rgula; 2 decibĂ©is, vĂ­rgula; 1 atmosfera, vĂ­rgula; 2 atmosferas, vĂ­rgula; 1 unidade de massa atĂŽmica, vĂ­rgula; 2 unidades de massa atĂŽmica; vĂ­rgula, 1 bar, vĂ­rgula, 2 bares, vĂ­rgula; 1 caloria, vĂ­rgula; 2 calorias, vĂ­rgula, 1 curie, vĂ­rgula; 2 curies, vĂ­rgula, 1 grado, vĂ­rgula; 2 grados, vĂ­rgula, 1 molar, vĂ­rgula; 2 molares, vĂ­rgula; 1 roentgen, vĂ­rgula; 2 roentgens, vĂ­rgula; 1 rotação por minuto, vĂ­rgula; 2 rotaçÔes por minuto, vĂ­rgula, 1 mho, vĂ­rgula, 2 mhos, vĂ­rgula, 1 dina, vĂ­rgula, 2 dinas, vĂ­rgula, 1 erg, vĂ­rgula, 2 ergs")?; + return Ok(()); + +} + +#[test] +fn metro() -> Result<()> { + // this is a special case in Spanish + let expr = r#" + 1m, + 2m, + 1Gm, + 2Gm, + 1Mm, + 2Mm, + 1km, + 2km, + 1hm, + 2hm, + 1dam, + 2dam, + 1mm, + 2mm + "#; + test("pt", "SimpleSpeak", expr, + "1 metro, vĂ­rgula; 2 metros, vĂ­rgula; 1 gigĂąmetro, vĂ­rgula; 2 gigĂąmetros, vĂ­rgula; 1 megĂąmetro, vĂ­rgula; 2 megĂąmetros, vĂ­rgula; 1 quilĂŽmetro, vĂ­rgula; 2 quilĂŽmetros, vĂ­rgula; 1 hectĂŽmetro, vĂ­rgula; 2 hectĂŽmetros, vĂ­rgula; 1 decĂąmetro, vĂ­rgula; 2 decĂąmetros, vĂ­rgula; 1 milĂ­metro, vĂ­rgula; 2 milĂ­metros")?; + return Ok(()); + +} + +#[test] +fn without_prefix_powers_of_2() -> Result<()> { + let expr = r#" + 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 + "#; + test("pt", "SimpleSpeak", expr, + "1 kibibit, vĂ­rgula; 2 kibibits, vĂ­rgula; 1 mebibit, vĂ­rgula; 2 mebibits, vĂ­rgula; 1 gibibit, vĂ­rgula; 2 gibibits, vĂ­rgula; 1 tebibit, vĂ­rgula; 2 tebibits, vĂ­rgula; 1 pebibit, vĂ­rgula; 2 pebibits, vĂ­rgula; 1 exbibit, vĂ­rgula; 2 exbibits, vĂ­rgula; 1 zebibit, vĂ­rgula; 2 zebibits, vĂ­rgula; 1 yobibit, vĂ­rgula; 2 yobibits, vĂ­rgula; 1 kibibyte, vĂ­rgula; 2 kibibytes, vĂ­rgula; 1 mebibyte, vĂ­rgula; 2 mebibytes, vĂ­rgula; 1 gibibyte, vĂ­rgula; 2 gibibytes, vĂ­rgula; 1 tebibyte, vĂ­rgula; 2 tebibytes, vĂ­rgula; 1 pebibyte, vĂ­rgula; 2 pebibytes, vĂ­rgula; 1 exbibyte, vĂ­rgula; 2 exbibytes, vĂ­rgula; 1 zebibyte, vĂ­rgula; 2 zebibytes, vĂ­rgula; 1 yobibyte, vĂ­rgula; 2 yobibytes")?; + return Ok(()); + +} + + +#[test] +fn si_other_numbers() -> Result<()> { + let expr = r#"1.0l, + 2.0 m, + x ms, + y”s, + dag, + 1235daN, + 2.5µsec, + 32.34mol"#; + test("pt", "SimpleSpeak", expr, + "10 litro, vĂ­rgula; 20 metros, vĂ­rgula; x milissegundos, vĂ­rgula; y microssegundos, vĂ­rgula, decagramas vĂ­rgula; 1235 decanewtons, vĂ­rgula; 25 microssegundos, vĂ­rgula; 3234 mols")?; + return Ok(()); + +} + + +#[test] +fn test_mtext_inference() -> Result<()> { + let expr = r#"[ + 1t, + 2PA, + 3Pa, + 4.5mT + ]"#; + test("pt", "SimpleSpeak", expr, + "abre colchetes; 1 tonelada, vĂ­rgula; 2 petaampĂšres, vĂ­rgula; 3 pascals, vĂ­rgula; 45 militeslas; fecha colchetes")?; + return Ok(()); + +} + diff --git a/tests/languages.rs b/tests/languages.rs index b0552b95b..287b53652 100644 --- a/tests/languages.rs +++ b/tests/languages.rs @@ -12,6 +12,7 @@ mod Languages { mod fi; mod pl; mod sv; + mod pt; mod nb; mod de; mod fr; From aaad7468e1fb0bc266a5855253bfcd7d6561ed18 Mon Sep 17 00:00:00 2001 From: NSoiffer Date: Wed, 2 Sep 2026 06:39:05 -0700 Subject: [PATCH 084/162] Release candidate (#743) * Add UEB G1 BANA/GTM mode preference and expand Grade-2 contractions. Adding the preference is a stall tactic while I wait for feedback from ICEB about whether BANA rules are obsolete. Introduce UEB_G1_BANA_Style (default true) to choose BANA 2019 vs ICEB GTM 1.7.3/1.7.5 grade-1 indicator placement in ueb_cleanup. Implement GTM 1.7 per-symbols-sequence counting with gtm_1_7_mode, and add matching ICEB tests. Extend handle_contractions for technical vocabulary: UEB 10.8 final-letter groupsigns, dot-5 through/part, dis/con prefixes, cc/ea exception words, and a ful-pattern fix. Add ueb_technical_word_contractions (311 words, goldens cross-checked with brailletranslators.com). Wire the preference through prefs, fuzz, and docs. * updated to new BANA and ICEB spec updates. Five tests fail. Still working on them * removed an option * fix contractions involving 'be, con, dis' which can only be at the start of a 'word' (where 'word' has a specific UEB meaning) * Updated to UEB to the latest guidance for grade 1 indicators. This adds new tests and changes a few tests. Also added more contractions. * update rc # * fix new clippy warnings * fix up Vietanmese tests * fix str compile issue with no-unsafe feature --- AGENTS.md | 3 +- Cargo.toml | 2 +- PythonScripts/audit_translations/README.md | 11 +- PythonScripts/audit_translations/auditor.py | 34 +- PythonScripts/audit_translations/cli.py | 14 +- .../tests/test_cli_end_to_end.py | 74 - Rules/Braille/Nemeth/unicode-full.yaml | 2728 ++++++++--------- Rules/Braille/UEB/UEB_Rules.yaml | 9 +- Rules/prefs.yaml | 1 + docs/users.md | 42 +- src/braille.rs | 980 +++++- tests/braille/UEB/iceb.rs | 1103 ++++++- tests/braille/UEB/other.rs | 21 +- 13 files changed, 3176 insertions(+), 1846 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index c6ca9e756..7093cf698 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,7 +13,7 @@ but add common mistakes of AI agents here instead. - `ClearSpeak_Rules.yaml`, `SimpleSpeak_Rules.yaml` - `SharedRules/`, `unicode.yaml`, `unicode-full.yaml`, `definitions.yaml`, `navigate.yaml` - `build.rs` can bundle rules into `rules.zip` when `include-zip` is enabled (always the minimized tree). Shared zipper: `src/rules_archive.rs`, invoked as `cargo run --bin package-rules -- Rules [--minimize]`. -- CI packages `Rules.zip` (verbatim) and `Rules-minimized.zip` (flow-style rewrite of all YAML: comments dropped). Each language/braille subdir is stored as `/.zip`; top-level and `Intent/` YAML stay loose. Inner language zips use BZIP2; the outer downloadable archive uses DEFLATE so `unzip` works. Both omit `Languages/zz`; the `test-rules-package` job restores `zz` from git after unzip so unit tests still run against release-like archives. +- CI packages `Rules.zip` (verbatim) and `Rules-minimized.zip` (comments stripped from `Languages/**/unicode.yaml` and `unicode-full.yaml` only). Each language/braille subdir is stored as `/.zip`; top-level and `Intent/` YAML stay loose. Inner language zips use BZIP2; the outer downloadable archive uses DEFLATE so `unzip` works. Both omit `Languages/zz`; the `test-rules-package` job restores `zz` from git after unzip so unit tests still run against release-like archives. ## Translation Conventions - `t:` means untranslated or unverified. @@ -33,6 +33,7 @@ but add common mistakes of AI agents here instead. - 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 ` +- Do **not** change test goldens (expected braille/speech/nav strings) unless the user explicitly says to. Prefer fixing code/rules to match existing goldens; if a golden looks wrong vs the spec, ask before editing it. - 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`). diff --git a/Cargo.toml b/Cargo.toml index fcf5428d9..2e73cbf80 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mathcat" -version = "0.7.7-alpha.1" +version = "0.7.6-rc.4" 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 fd399e412..8aedf1265 100644 --- a/PythonScripts/audit_translations/README.md +++ b/PythonScripts/audit_translations/README.md @@ -77,7 +77,6 @@ uv run --project PythonScripts audit-translations --list * 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. -* `--exclude`: Exclude one or more files from the audit. * `--rules-dir`: Override the Rules/Languages directory path. * `--only`: Filter issue types (comma-separated): `missing`, `untranslated`, `extra`, `diffs`, `all`. * `--verbose`: Show detailed output including source/target snippets for rule differences. @@ -101,17 +100,9 @@ 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 (note: --file is incompatible with --exclude) -uv run audit-translations es --file ClearSpeak_Rules.yaml +# Audit only a specific file uv run audit-translations es --file SharedRules/default.yaml -# Exclude a list of files from the audit, note that if you use this option before specifying the -# target language you'll need to use the option terminator (--). -# (note: --exclude is incompatible with --file) -uv run audit-translations es --exclude unicode-full.yaml -uv run audit-translations es --exclude unicode-full.yaml unicode.yaml -uv run audit-translations --exclude unicode-full.yaml -- es - # Audit a regional variant (merges Rules/Languages/de and Rules/Languages/de/CH) uv run audit-translations de-CH diff --git a/PythonScripts/audit_translations/auditor.py b/PythonScripts/audit_translations/auditor.py index 37ec44f13..b67cbf911 100644 --- a/PythonScripts/audit_translations/auditor.py +++ b/PythonScripts/audit_translations/auditor.py @@ -46,31 +46,24 @@ def is_definitions_file(file_path: str | Path) -> bool: return Path(file_path).name == "definitions.yaml" -def get_yaml_files(lang_dir: Path, region_dir: Path | None = None, excluded_files: list[str] | None = None) -> list[Path]: +def get_yaml_files(lang_dir: Path, region_dir: Path | None = None) -> list[Path]: """Get all YAML files to audit for a language, including region overrides.""" files: set[Path] = set() - def collect_from(directory: Path, root: Path, excluded: list[str] | None) -> None: + def collect_from(directory: Path, root: Path) -> None: if not directory.exists(): return - - excluded_paths = {Path(path) for path in excluded or []} - - candidates = {f for f in directory.glob("*.yaml") if f.name != "prefs.yaml"} - candidates.update((directory / "SharedRules").glob("*.yaml")) - - relative_candidates = {f.relative_to(directory): f for f in candidates} - - for path in excluded_paths - relative_candidates.keys(): - console.print(f"\n[yellow]⚠ Warning:[/] File to exclude {path} does not exist.") - - files.update( - f.relative_to(root) for relative_path, f in relative_candidates.items() if relative_path not in excluded_paths - ) - - collect_from(lang_dir, lang_dir, excluded_files) + for f in directory.glob("*.yaml"): + if f.name != "prefs.yaml": + files.add(f.relative_to(root)) + shared_dir = directory / "SharedRules" + if shared_dir.exists(): + for f in shared_dir.glob("*.yaml"): + files.add(f.relative_to(root)) + + collect_from(lang_dir, lang_dir) if region_dir: - collect_from(region_dir, region_dir, excluded_files) + collect_from(region_dir, region_dir) return sorted(files) @@ -222,7 +215,6 @@ def merge_definitions( def audit_language( language: str, specific_file: str | None = None, - excluded_files: list[str] | None = None, rules_dir: str | None = None, issue_filter: set[str] | None = None, verbose: bool = False, @@ -256,7 +248,7 @@ def audit_language( 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(source_dir, source_region_dir, excluded_files) + files = [specific_file] if specific_file else get_yaml_files(source_dir, source_region_dir) print_audit_header(language, len(files), source_language) diff --git a/PythonScripts/audit_translations/cli.py b/PythonScripts/audit_translations/cli.py index 5bdf30e6d..6916a636e 100644 --- a/PythonScripts/audit_translations/cli.py +++ b/PythonScripts/audit_translations/cli.py @@ -30,18 +30,7 @@ def main() -> None: 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')") - file_group = parser.add_mutually_exclusive_group() - file_group.add_argument( - "--file", - dest="specific_file", - help="Audit only a specific file (e.g., 'SharedRules/default.yaml')", - ) - file_group.add_argument( - "--exclude", - nargs="+", - dest="excluded_files", - help="Exclude a list of files from the audit.", - ) + 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") parser.add_argument( @@ -78,7 +67,6 @@ def main() -> None: audit_language( args.language, args.specific_file, - args.excluded_files, args.rules_dir, issue_filter, args.verbose, 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 40cf3f8b2..7876bc0de 100644 --- a/PythonScripts/audit_translations/tests/test_cli_end_to_end.py +++ b/PythonScripts/audit_translations/tests/test_cli_end_to_end.py @@ -127,80 +127,6 @@ def test_cli_main_rich_only_filters_issue_groups(capsys, monkeypatch) -> None: assert "Structure Differences" not in output -@pytest.mark.parametrize( - ("excluded_file", "expected_file", "expected_rule", "unexpected_rule"), - [ - ( - "default.yaml", - "SharedRules/default.yaml", - "shared-only", - "root-only", - ), - ( - "SharedRules/default.yaml", - "default.yaml", - "root-only", - "shared-only", - ), - ], - ids=["exclude-root", "exclude-shared-rules"], -) -def test_cli_main_exclude_uses_relative_paths( - tmp_path, - capsys, - monkeypatch, - excluded_file, - expected_file, - expected_rule, - unexpected_rule, -) -> None: - """Ensure --exclude distinguishes root files from SharedRules files.""" - rules_dir = tmp_path / "Rules" / "Languages" - source_dir = rules_dir / "en" - target_dir = rules_dir / "de" - - (source_dir / "SharedRules").mkdir(parents=True) - (target_dir / "SharedRules").mkdir(parents=True) - - (source_dir / "default.yaml").write_text( - '- name: root-only\n tag: mo\n match: ".//m:mi"\n replace:\n - t: "root"\n', - encoding="utf-8", - ) - (source_dir / "SharedRules" / "default.yaml").write_text( - '- name: shared-only\n tag: mo\n match: ".//m:mi"\n replace:\n - t: "shared"\n', - encoding="utf-8", - ) - - target_rule = '- name: target-only\n tag: mo\n match: ".//m:mi"\n replace:\n - t: "target"\n' - (target_dir / "default.yaml").write_text( - target_rule, - encoding="utf-8", - ) - (target_dir / "SharedRules" / "default.yaml").write_text( - target_rule, - encoding="utf-8", - ) - - args = [ - "de", - "--rules-dir", - str(rules_dir), - "--exclude", - excluded_file, - "--only", - "missing", - ] - monkeypatch.setattr(sys, "argv", ["audit_translations", *args]) - - audit_cli.main() - output = strip_ansi(capsys.readouterr().out) - - assert "Files to check: 1" in output - assert expected_file in output - assert expected_rule in output - assert unexpected_rule not in output - - def test_cli_main_accepts_source_language(capsys, monkeypatch) -> None: """ Ensure --source changes the reference language without changing target semantics. diff --git a/Rules/Braille/Nemeth/unicode-full.yaml b/Rules/Braille/Nemeth/unicode-full.yaml index bf4f842ea..30ffc561d 100644 --- a/Rules/Braille/Nemeth/unicode-full.yaml +++ b/Rules/Braille/Nemeth/unicode-full.yaml @@ -1,1364 +1,1364 @@ ---- -# To greatly simplify typeface/language generation, the chars have unique ASCII chars for them: -# Typeface: S: sans-serif, B: bold, T: script/blackboard, I: italic, R: Roman -# Language: E: English, D: German, G: Greek, V: Greek variants, H: Hebrew, U: Russian -# Indicators: C: capital, L: letter, N: number, P: punctuation, M: multipurpose -# Others: W -- whitespace that should be kept (e.g, in a numeral) -# SRE doesn't have H: Hebrew, so not encoded (yet) -# Some of the weird letters (e.g., circled letters) I didn't translate with the above because -# they don't interact with rules since they are enclosed in other chars. - - - "⚯": [t: "⠈⠥"] # U+2A2F(VECTOR OR CROSS PRODUCT) -- make the same as 0x00D7 (Multiplication sign) - - # --- Nemeth Default Alphabet bold chars. --- - - "𝐀-𝐙": # 0x1d400 - 0x1d419 - - tc: "BE" - - spell: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - "𝐚-𝐳": # 0x1d41a - 0x1d433 - - tc: "BE" - - spell: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝚹-𝛀": # 0x1d6a8 - 0x1d6c0 - - tc: "BG" - - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "𝛂-𝛒": # 0x1d6c2 - 0x1d6d2 - - tc: "BG" - - spell: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" - - - "𝛔-𝛖": # 0x1d6d4 - 0x1d6d6 - - tc: "BG" - - spell: "translate('.', '𝛔𝛕𝛖', 'στυ')" - - - "𝛘-𝛚": # 0x1d6d8 - 0x1d6da - - tc: "BG" - - spell: "translate('.', '𝛘𝛙𝛚', 'χψω')" - - - "𝛁": [tc: "BGLâ «"] # 0x1d6c1 - - "𝛓": [tc: "BVL⠎"] # 0x1d6d3 - - "𝛗": [tc: "BVL⠋"] # 0x1d6d7 - - "𝛛": [tc: "⠾⠈⠙"] # 0x1d6db - - "𝛜": [tc: "BGL⠑"] # 0x1d6dc - - "𝛝": [tc: "BVLâ č"] # 0x1d6dd - - "𝛞": [tc: "BGL⠅"] # 0x1d6de - - "𝛟": [tc: "BGL⠋"] # 0x1d6df - - "𝛠": [tc: "BGL⠗"] # 0x1d6e0 - - "𝛡": [tc: "BGL⠏"] # 0x1d6e1 - - - "𝟎-𝟗": # 0x1d7ce - 0x1d7d7 - - tc: "B" - - spell: "translate('.', '𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗', '0123456789')" - - # --- Nemeth Default Alphabet bold-fraktur chars. --- - - - "𝕬-𝖅": # 0x1d56c - 0x1d585 - - tc: "BD" - - spell: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝖆-𝖟": # 0x1d586 - 0x1d59f - - tc: "BD" - - spell: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" - - # --- Nemeth Default Alphabet bold-italic chars. --- - - "𝑹-𝒁": # 0x1d468 - 0x1d481 - - tc: "BE" - - spell: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝒂-𝒛": # 0x1d482 - 0x1d49b - - tc: "BE" - - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝜜-𝜮": # 0x1d71c - 0x1d734 - - tc: "BG" - - spell: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳𝜮', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "đœ”": [tc: "BGLâ «"] # 0x1d735 - - - "đœ¶-𝝆": # 0x1d736 - 0x1d746 - - tc: "BG" - - spell: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" - - - "𝝇": [tc: "BVL⠎"] # 0x1d747 - - - "𝝈-𝝊": # 0x1d748 - 0x1d74a - - tc: "BG" - - spell: "translate('.', '𝝈𝝉𝝊', 'στυ')" - - - "𝝋": [tc: "BVL⠋"] # 0x1d74b - - - "𝝌-𝝎": # 0x1d74c - 0x1d74e - - tc: "BG" - - spell: "translate('.', '𝝌𝝍𝝎', 'χψω')" - - - "𝝏": [tc: "BVL⠙"] # 0x1d74f - - "𝝐": [tc: "BGL⠑"] # 0x1d750 - - "𝝑": [tc: "BVLâ č"] # 0x1d751 - - - "𝝒-𝝕": # 0x1d752 - 0x1d755 - - tc: "BG" - - spell: "translate('.', '𝝒𝝓𝝔𝝕', 'Îșφρπ')" - - # --- Nemeth Default Alphabet bold-script chars. --- - - - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 - - tc: "BTE" - - spell: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "đ“Ș-𝔃": # 0x1d4ea - 0x1d503 - - tc: "BTE" - - spell: "translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz')" - - - "đš€-đš„": # 0x1d6a4 - 0x1d6a5 - - tc: "" - - spell: "translate('.', 'đš€đš„', '⠊⠚')" - -# Russian Alphabet (from Nemeth book) -# NOTE: is this translation needed? - - "А-ĐŻ": # 0x410 - 0x42f - - tc: "U" - - spell: "translate('.', 'ĐĐ‘Đ’Đ“Đ”Đ•Đ—Đ˜Đ™ĐšĐ›ĐœĐĐžĐŸĐ ĐĄĐąĐŁĐ€Đ­', 'ABVGDEZIYKLMNOPRSTUFE')" - - - "а-я": # 0x430 - 0x44f - - tc: "U" - - spell: "translate('.', 'абĐČгЎДзОĐčĐșĐ»ĐŒĐœĐŸĐżŃ€ŃŃ‚ŃƒŃ„Ń', 'abvgdeziylkmnoprstufye')" - - - "①-⑹": # 0x2460 - 0x2473 - - tc: "⠫⠉⠞⠫⠌" - - spell: "translate('.', '①⑥⑹④⑀⑄⑊⑧⑚', '123456789')" - - tc: "â »" - - - "â“Ș": [tc: "⠫⠉⠞⠫⠌⠎⠻"] # 0x24ea - - - "⑩": [tc: "⠫⠉⠞⠫⠌⠂⠎⠻"] # 0x2469 - - "â‘Ș": [tc: "⠫⠉⠞⠫⠌⠂⠂⠻"] # 0x246a - - "⑫": [tc: "⠫⠉⠞⠫⠌⠂⠆⠻"] # 0x246b - - "⑬": [tc: "⠫⠉⠞⠫⠌⠂⠒⠻"] # 0x246c - - "⑭": [tc: "⠫⠉⠞⠫⠌⠂â Čâ »"] # 0x246d - - "⑼": [tc: "â «â ‰â žâ «â Œâ ‚â ąâ »"] # 0x246e - - "⑯": [tc: "⠫⠉⠞⠫⠌⠂⠖⠻"] # 0x246f - - "⑰": [tc: "⠫⠉⠞⠫⠌⠂⠶⠻"] # 0x2470 - - "⑱": [tc: "⠫⠉⠞⠫⠌⠂⠊⠻"] # 0x2471 - - "â‘Č": [tc: "⠫⠉⠞⠫⠌⠂⠔⠻"] # 0x2472 - - "⑳": [tc: "⠫⠉⠞⠫⠌⠆⠎⠻"] # 0x2473 - - - "㉑": [tc: "⠫⠉⠞⠫⠌⠆⠂⠻"] # 0x3251 - - "㉒": [tc: "⠫⠉⠞⠫⠌⠆⠆⠻"] # 0x3252 - - "㉓": [tc: "⠫⠉⠞⠫⠌⠆⠒⠻"] # 0x3253 - - "㉔": [tc: "⠫⠉⠞⠫⠌⠆â Čâ »"] # 0x3254 - - "㉕": [tc: "â «â ‰â žâ «â Œâ †â ąâ »"] # 0x3255 - - "㉖": [tc: "⠫⠉⠞⠫⠌⠆⠖⠻"] # 0x3256 - - "㉗": [tc: "⠫⠉⠞⠫⠌⠆⠶⠻"] # 0x3257 - - "㉘": [tc: "⠫⠉⠞⠫⠌⠆⠊⠻"] # 0x3258 - - "㉙": [tc: "⠫⠉⠞⠫⠌⠆⠔⠻"] # 0x3259 - - "㉚": [tc: "⠫⠉⠞⠫⠌⠒⠎⠻"] # 0x325a - - "㉛": [tc: "⠫⠉⠞⠫⠌⠒⠂⠻"] # 0x325b - - "㉜": [tc: "⠫⠉⠞⠫⠌⠒⠆⠻"] # 0x325c - - "㉝": [tc: "⠫⠉⠞⠫⠌⠒⠒⠻"] # 0x325d - - "㉞": [tc: "⠫⠉⠞⠫⠌⠒â Čâ »"] # 0x325e - - "㉟": [tc: "â «â ‰â žâ «â Œâ ’â ąâ »"] # 0x325f - - "㊱": [tc: "⠫⠉⠞⠫⠌⠒⠖⠻"] # 0x32b1 - - "ăŠČ": [tc: "⠫⠉⠞⠫⠌⠒⠶⠻"] # 0x32b2 - - "㊳": [tc: "⠫⠉⠞⠫⠌⠒⠊⠻"] # 0x32b3 - - "㊮": [tc: "⠫⠉⠞⠫⠌⠒⠔⠻"] # 0x32b4 - - "㊔": [tc: "⠫⠉⠞⠫⠌â Čâ Žâ »"] # 0x32b5 - - "㊶": [tc: "⠫⠉⠞⠫⠌â Č⠂⠻"] # 0x32b6 - - "㊷": [tc: "⠫⠉⠞⠫⠌â Č⠆⠻"] # 0x32b7 - - "㊾": [tc: "⠫⠉⠞⠫⠌â Č⠒⠻"] # 0x32b8 - - "ăŠč": [tc: "⠫⠉⠞⠫⠌â Čâ Čâ »"] # 0x32b9 - - "ăŠș": [tc: "⠫⠉⠞⠫⠌â Čâ ąâ »"] # 0x32ba - - "㊻": [tc: "⠫⠉⠞⠫⠌â Č⠖⠻"] # 0x32bb - - "ăŠŒ": [tc: "⠫⠉⠞⠫⠌â Čâ ¶â »"] # 0x32bc - - "ăŠœ": [tc: "⠫⠉⠞⠫⠌â Čâ Šâ »"] # 0x32bd - - "ăŠŸ": [tc: "⠫⠉⠞⠫⠌â Č⠔⠻"] # 0x32be - - "㊿": [tc: "â «â ‰â žâ «â Œâ ąâ Žâ »"] # 0x32bf - -#NOTE: uncertainty here - - "Ⓐ-Ⓩ": # 0x24b6 - 0x24cf - - tc: "⠫⠉⠞⠫⠠" - - spell: "translate('.', 'â’¶â’·â’žâ’čâ’șâ’»â’Œâ’œâ’Ÿâ’żâ“€â“â“‚â“ƒâ“„â“…â“†â“‡â“ˆâ“‰â“Šâ“‹â“Œâ“â“Žâ“', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - tc: "â »" - - - "ⓐ-ⓩ": # 0x24d0 - 0x24e9 - - tc: "⠫⠉⠞⠫" - - spell: "translate('.', 'â“â“‘â“’â““â“”â“•â“–â“—â“˜â“™â“šâ“›â“œâ“â“žâ“Ÿâ“ â“Ąâ“ąâ“Łâ“€â“„â“Šâ“§â“šâ“©', 'abcdefghijklmnopqrstuvwxyz')" - - tc: "â »" - - # --- Nemeth Default Alphabet circled-sans-serif chars. --- - - - "➀-➈": # 0x1f10b, 0x2780 - 0x2788 - - tc: "⠫⠉⠞⠫⠠⠚⠌" - - spell: "translate('.', '➀➁➂➃➄➅➆➇➈', '123456789')" - - tc: "â »" - - - "🄋": [tc: "⠫⠉⠞⠫⠠⠚⠌⠎⠻"] # 0x1f10b - - "➉": [tc: "⠫⠉⠞⠫⠠⠚⠌⠂⠎⠻"] # 0x2789 - - # --- Nemeth Default Alphabet comma chars. --- - - - "🄁-🄊": # 0x1f101 - 0x1f10a - - spell: "translate('.', '🄁🄂🄃🄄🄅🄆🄇🄈🄉🄊', '0123456789')" - - tc: "â  " - - - # --- Nemeth Default Alphabet double-circled chars. --- - - - "â“”": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠂⠻⠻"] # 0x24f5 - - "⓶": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠆⠻⠻"] # 0x24f6 - - "⓷": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠒⠻⠻"] # 0x24f7 - - "⓾": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌â Č⠻⠻"] # 0x24f8 - - "â“č": [t: "â «â ‰â žâ «â «â ‰â žâ «â Œâ ąâ »â »"] # 0x24f9 - - "â“ș": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠖⠻⠻"] # 0x24fa - - "⓻": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠶⠻⠻"] # 0x24fb - - "Ⓦ": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠊⠻⠻"] # 0x24fc - - "ⓜ": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠔⠻⠻"] # 0x24fd - - "ⓟ": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠂⠎⠻⠻"] # 0x24fe - - # --- Nemeth Default Alphabet double-struck chars. --- - - "𝔾-𝕐": # 0x1d538 - 0x1d550 (partial, excludes ℂ ℍ ℕ ℙ ℚ ℝ â„€) - - tc: "đ”čE" - - spell: "translate('.', '𝔾đ”čđ”»đ”Œđ”œđ”Ÿđ•€đ•đ•‚đ•ƒđ•„đ•†đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'ABDEFGIJKLMOSTUVWXY')" - - - "ℂ": [tc: "đ”čECL⠉"] # 0x2102 - - "ℍ": [tc: "đ”čECL⠓"] # 0x210d - - "ℕ": [tc: "đ”čECL⠝"] # 0x2115 - - "ℙ": [tc: "đ”čECL⠏"] # 0x2119 - - "ℚ": [tc: "đ”čECL⠟"] # 0x211a - - "ℝ": [tc: "đ”čECL⠗"] # 0x211d - - "â„€": [tc: "đ”čECLâ ”"] # 0x2124 - - "℩": [t: "CGLâ ș"] # 0x2126 (Ohm sign (capital Greek omega)) - - - "𝕒-đ•«": # 0x1d552 - 0x1d56b - - tc: "đ”čE" - - spell: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 - - tc: "đ”č" - - spell: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" - - - # --- Nemeth Default Alphabet fraktur chars. --- - - - "𝔄-𝔜": # 0x1d504 - 0x1d51c - - tc: "D" - - spell: "translate('.', '𝔄𝔅𝔇𝔈𝔉𝔊𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'ABDEFGJKLMNOPQSTUVWXY')" - - - "ℭ": [tc: "DCL⠉"] # 0x212d - - "ℌ": [tc: "DCL⠓"] # 0x210c - - "ℑ": [tc: "DCL⠊"] # 0x2111 - - "ℜ": [tc: "DCL⠗"] # 0x211c - - "ℹ": [tc: "DCLâ ”"] # 0x2128 - - - "𝔞-đ”·": # 0x1d51e - 0x1d537 - - tc: "D" - - spell: "translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz')" - - # --- Nemeth Default Alphabet fullwidth chars. --- - - - "ïŒĄ-ïŒș": # 0xff21 - 0xff3a - - tc: "" - - spell: "translate('.', 'ïŒĄïŒąïŒŁïŒ€ïŒ„ïŒŠïŒ§ïŒšïŒ©ïŒȘïŒ«ïŒŹïŒ­ïŒźïŒŻïŒ°ïŒ±ïŒČïŒłïŒŽïŒ”ïŒ¶ïŒ·ïŒžïŒčïŒș', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xff41 - 0xff5a - - tc: "" - - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - - - "-": # 0xff10 - 0xff19 - - tc: "" - - spell: "translate('.', '', '0123456789')" - - # --- Nemeth Default Alphabet italic chars -- treat as non-italic. --- - - - "𝐮-𝑍": # 0x1d434 - 0x1d44d - - tc: "E" - - spell: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝑎-𝑧": # 0x1d44e - 0x1d467 - - tc: "E" - - spell: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”â„Žđ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝛱-đ›ș": # 0x1d6e2 - 0x1d6fa - - tc: "G" - - spell: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›čđ›ș', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "đ›»": [tc: "GLâ «"] # 0x1d6fb - - - "đ›Œ-𝜌": # 0x1d6fc - 0x1d70c - - tc: "G" - - spell: "translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" - - "𝜍": [tc: "VL⠎"] # 0x1d70d - - - "𝜎": [tc: "GL⠎"] # 0x1d70e - - "𝜏": [tc: "GL⠞"] # 0x1d70f - - "𝜐": [tc: "GLâ „"] # 0x1d710 - - - "𝜑": [tc: "VL⠋"] # 0x1d711 - - - "𝜒": [tc: "GLâ Ż"] # 0x1d712 - - "𝜓": [tc: "GLâ œ"] # 0x1d713 - - "𝜔": [tc: "GLâ ș"] # 0x1d714 - - - "𝜕": [tc: "VL⠙"] # 0x1d715 - - - "𝜖": [tc: "GL⠑"] # 0x1d716 - - - "𝜗": [tc: "VLâ č"] # 0x1d717 - - - "𝜘": [tc: "GL⠅"] # 0x1d718 - - "𝜙": [tc: "GL⠋"] # 0x1d719 - - "𝜚": [tc: "GL⠗"] # 0x1d71a - - "𝜛": [tc: "GL⠏"] # 0x1d71b - - # --- Nemeth Default Alphabet monospace chars. --- - - - "𝙰-𝚉": # 0x1d670 - 0x1d689 - - tc: "" - - spell: "translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝚊-𝚣": # 0x1d68a - 0x1d6a3 - - tc: "" - - spell: "translate('.', '𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚱𝚣', 'abcdefghijklmnopqrstuvwxyz')" - - - "đŸ¶-𝟿": # 0x1d7f6 - 0x1d7ff - - tc: "" - - spell: "translate('.', 'đŸ¶đŸ·đŸžđŸčđŸșđŸ»đŸŒđŸœđŸŸđŸż', '0123456789')" - - - # --- Nemeth Default Alphabet negative-circled chars. --- - - "⓿": [t: "⠫⠞⠉⠞⠫⠌⠎⠻"] # 0x24ff - - "❶": [t: "⠫⠞⠉⠞⠫⠌⠂⠻"] # 0x2776 - - "❷": [t: "⠫⠞⠉⠞⠫⠌⠆⠻"] # 0x2777 - - "❞": [t: "⠫⠞⠉⠞⠫⠌⠒⠻"] # 0x2778 - - "âč": [t: "⠫⠞⠉⠞⠫⠌â Čâ »"] # 0x2779 - - "âș": [t: "â «â žâ ‰â žâ «â Œâ ąâ »"] # 0x277a - - "❻": [t: "⠫⠞⠉⠞⠫⠌⠖⠻"] # 0x277b - - "❌": [t: "⠫⠞⠉⠞⠫⠌⠶⠻"] # 0x277c - - "❜": [t: "⠫⠞⠉⠞⠫⠌⠊⠻"] # 0x277d - - "❟": [t: "⠫⠞⠉⠞⠫⠌⠔⠻"] # 0x277e - - "❿": [t: "⠫⠞⠉⠞⠫⠌⠂⠎⠻"] # 0x277f - - "⓫": [t: "⠫⠞⠉⠞⠫⠌⠂⠂⠻"] # 0x24eb - - "⓬": [t: "⠫⠞⠉⠞⠫⠌⠂⠆⠻"] # 0x24ec - - "⓭": [t: "⠫⠞⠉⠞⠫⠌⠂⠒⠻"] # 0x24ed - - "⓼": [t: "⠫⠞⠉⠞⠫⠌⠂â Čâ »"] # 0x24ee - - "⓯": [t: "â «â žâ ‰â žâ «â Œâ ‚â ąâ »"] # 0x24ef - - "⓰": [t: "⠫⠞⠉⠞⠫⠌⠂⠖⠻"] # 0x24f0 - - "⓱": [t: "⠫⠞⠉⠞⠫⠌⠂⠶⠻"] # 0x24f1 - - "â“Č": [t: "⠫⠞⠉⠞⠫⠌⠂⠊⠻"] # 0x24f2 - - "⓳": [t: "⠫⠞⠉⠞⠫⠌⠂⠔⠻"] # 0x24f3 - - "⓮": [t: "⠫⠞⠉⠞⠫⠌⠆⠎⠻"] # 0x24f4 - - - "🅐": [t: "⠫⠞⠉⠞⠫⠠⠁⠻"] # 0x1f150 - - "🅑": [t: "⠫⠞⠉⠞⠫⠠⠃⠻"] # 0x1f151 - - "🅒": [t: "⠫⠞⠉⠞⠫⠠⠉⠻"] # 0x1f152 - - "🅓": [t: "⠫⠞⠉⠞⠫⠠⠙⠻"] # 0x1f153 - - "🅔": [t: "⠫⠞⠉⠞⠫⠠⠑⠻"] # 0x1f154 - - "🅕": [t: "⠫⠞⠉⠞⠫⠠⠋⠻"] # 0x1f155 - - "🅖": [t: "⠫⠞⠉⠞⠫⠠⠛⠻"] # 0x1f156 - - "🅗": [t: "⠫⠞⠉⠞⠫⠠⠓⠻"] # 0x1f157 - - "🅘": [t: "⠫⠞⠉⠞⠫⠠⠊⠻"] # 0x1f158 - - "🅙": [t: "⠫⠞⠉⠞⠫⠠⠚⠻"] # 0x1f159 - - "🅚": [t: "⠫⠞⠉⠞⠫⠠⠅⠻"] # 0x1f15a - - "🅛": [t: "⠫⠞⠉⠞⠫⠠⠇⠻"] # 0x1f15b - - "🅜": [t: "⠫⠞⠉⠞⠫⠠⠍⠻"] # 0x1f15c - - "🅝": [t: "⠫⠞⠉⠞⠫⠠⠝⠻"] # 0x1f15d - - "🅞": [t: "⠫⠞⠉⠞⠫⠠⠕⠻"] # 0x1f15e - - "🅟": [t: "⠫⠞⠉⠞⠫⠠⠏⠻"] # 0x1f15f - - "🅠": [t: "⠫⠞⠉⠞⠫⠠⠟⠻"] # 0x1f160 - - "🅡": [t: "⠫⠞⠉⠞⠫⠠⠗⠻"] # 0x1f161 - - "🅱": [t: "⠫⠞⠉⠞⠫⠠⠎⠻"] # 0x1f162 - - "🅣": [t: "⠫⠞⠉⠞⠫⠠⠞⠻"] # 0x1f163 - - "đŸ…€": [t: "⠫⠞⠉⠞⠫⠠⠄⠻"] # 0x1f164 - - "đŸ…„": [t: "⠫⠞⠉⠞⠫⠠⠧⠻"] # 0x1f165 - - "🅩": [t: "⠫⠞⠉⠞⠫⠠â șâ »"] # 0x1f166 - - "🅧": [t: "⠫⠞⠉⠞⠫⠠⠭⠻"] # 0x1f167 - - "🅹": [t: "⠫⠞⠉⠞⠫⠠⠜⠻"] # 0x1f168 - - "đŸ…©": [t: "⠫⠞⠉⠞⠫⠠⠔⠻"] # 0x1f169 - - # --- Nemeth Default Alphabet negative-circled-sans-serif chars. --- - - "🄌": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠎⠻"] # 0x1f10c - - "➊": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠂⠻"] # 0x278a - - "➋": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠆⠻"] # 0x278b - - "➌": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠒⠻"] # 0x278c - - "➍": [t: "⠫⠞⠉⠞⠫⠠⠚⠌â Čâ »"] # 0x278d - - "➎": [t: "â «â žâ ‰â žâ «â  â šâ Œâ ąâ »"] # 0x278e - - "➏": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠖⠻"] # 0x278f - - "➐": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠶⠻"] # 0x2790 - - "➑": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠊⠻"] # 0x2791 - - "➒": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠔⠻"] # 0x2792 - - "➓": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠂⠎⠻"] # 0x2793 - - # --- Nemeth Default Alphabet negative-squared chars. --- - - "🅰-🆉": # 0x1f170 - 0x1f189 - - tc: "â «â žâ Čâ žâ «â  " - - spell: "translate('.', 'đŸ…°đŸ…±đŸ…ČđŸ…łđŸ…ŽđŸ…”đŸ…¶đŸ…·đŸ…žđŸ…čđŸ…șđŸ…»đŸ…ŒđŸ…œđŸ…ŸđŸ…żđŸ†€đŸ†đŸ†‚đŸ†ƒđŸ†„đŸ†…đŸ††đŸ†‡đŸ†ˆđŸ†‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - tc: "â »" - - # --- Nemeth Default Alphabet parenthesized chars. --- - - - "⑮-⑌": # 0x2474 - 0x247c - - tc: "â ·" - - spell: "translate('.', '⑎⑔⑶⑷⑞â‘čâ‘ș⑻⑌', '123456789')" - - tc: "â Ÿ" - - - "⑜": [t: "â ·â ‚â Žâ Ÿ"] # 0x247d - - "⑟": [t: "â ·â ‚â ‚â Ÿ"] # 0x247e - - "⑿": [t: "⠷⠂⠆⠟"] # 0x247f - - "⒀": [t: "â ·â ‚â ’â Ÿ"] # 0x2480 - - "⒁": [t: "⠷⠂â Čâ Ÿ"] # 0x2481 - - "⒂": [t: "â ·â ‚â ąâ Ÿ"] # 0x2482 - - "⒃": [t: "â ·â ‚â –â Ÿ"] # 0x2483 - - "⒄": [t: "â ·â ‚â ¶â Ÿ"] # 0x2484 - - "⒅": [t: "â ·â ‚â Šâ Ÿ"] # 0x2485 - - "⒆": [t: "⠷⠂⠔⠟"] # 0x2486 - - "⒇": [t: "⠷⠆⠎⠟"] # 0x2487 - - - "🄐-đŸ„©": # 0x1f110 - 0x1f129 - - tc: "â ·â  " - - spell: "translate('.', 'đŸ„đŸ„‘đŸ„’đŸ„“đŸ„”đŸ„•đŸ„–đŸ„—đŸ„˜đŸ„™đŸ„šđŸ„›đŸ„œđŸ„đŸ„žđŸ„ŸđŸ„ đŸ„ĄđŸ„ąđŸ„ŁđŸ„€đŸ„„đŸ„ŠđŸ„§đŸ„šđŸ„©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - tc: "â Ÿ" - - - "⒜-â’”": # 0x249c - 0x24b5 - - tc: "â ·" - - spell: "translate('.', 'â’œâ’â’žâ’Ÿâ’ â’Ąâ’ąâ’Łâ’€â’„â’Šâ’§â’šâ’©â’Șâ’«â’Źâ’­â’źâ’Żâ’°â’±â’Čâ’łâ’Žâ’”', 'abcdefghijklmnopqrstuvwxyz')" - - tc: "â Ÿ" - - # --- Nemeth Default Alphabet period chars. --- - - "🄀": [t: "â Žâ žâ Č"] # 0x1f100 - - "⒈": [t: "⠂⠾â Č"] # 0x2488 - - "⒉": [t: "⠆⠾â Č"] # 0x2489 - - "⒊": [t: "⠒⠾â Č"] # 0x248a - - "⒋": [t: "â Čâ žâ Č"] # 0x248b - - "⒌": [t: "â ąâ žâ Č"] # 0x248c - - "⒍": [t: "⠖⠾â Č"] # 0x248d - - "⒎": [t: "â ¶â žâ Č"] # 0x248e - - "⒏": [t: "â Šâ žâ Č"] # 0x248f - - "⒐": [t: "⠔⠾â Č"] # 0x2490 - - - "⒑": [t: "⠂⠮⠾â Č"] # 0x2491 - - "⒒": [t: "⠂⠂⠾â Č"] # 0x2492 - - "⒓": [t: "⠂⠆⠾â Č"] # 0x2493 - - "⒔": [t: "⠂⠒⠾â Č"] # 0x2494 - - "⒕": [t: "⠂â Čâ žâ Č"] # 0x2495 - - "⒖": [t: "⠂⠱⠾â Č"] # 0x2496 - - "⒗": [t: "⠂⠖⠾â Č"] # 0x2497 - - "⒘": [t: "â ‚â ¶â žâ Č"] # 0x2498 - - "⒙": [t: "⠂⠩⠾â Č"] # 0x2499 - - "⒚": [t: "⠂⠔⠾â Č"] # 0x249a - - "⒛": [t: "⠆⠮⠾â Č"] # 0x249b - - # --- Nemeth Default Alphabet sans-serif chars. --- - - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 - - tc: "SE" - - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 - - tc: "SE" - - spell: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝟱-đŸ«": # 0x1d7e2 - 0x1d7eb - - tc: "S" - - spell: "translate('.', 'đŸąđŸŁđŸ€đŸ„đŸŠđŸ§đŸšđŸ©đŸȘđŸ«', '0123456789')" - - # --- Nemeth Default Alphabet sans-serif-bold chars. --- - - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed - - tc: "SBE" - - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝗼-𝘇": # 0x1d5ee - 0x1d607 - - tc: "SBE" - - spell: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝝖-𝝼": # 0x1d756 - 0x1d76e - - tc: "SBG" - - spell: "translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đź', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "𝝰-𝞀": # 0x1d770 - 0x1d780 - - tc: "SBG" - - spell: "translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" - - - "𝝯": [tc: "SBGLâ «"] # 0x1d76f - - - "𝞁": [tc: "SBVL⠎"] # 0x1d781 - - - "𝞂-𝞄": # 0x1d782 - 0x1d784 - - tc: "SBG" - - spell: "translate('.', '𝞂𝞃𝞄', 'στυ')" - - - "𝞅": [tc: "SBVL⠋"] # 0x1d785 - - - "𝞆-𝞈": # 0x1d786 - 0x1d788 - - tc: "SBG" - - spell: "translate('.', '𝞆𝞇𝞈', 'χψω')" - - - "𝞉": [tc: "⠠⠹⠾⠈⠙"] # 0x1d789 - - "𝞊": [tc: "SBGL⠑"] # 0x1d78a - - "𝞋": [tc: "SBVLâ č"] # 0x1d78b - - - "𝞌-𝞏": # 0x1d78c - 0x1d78f - - tc: "SBG" - - spell: "translate('.', '𝞌𝞍𝞎𝞏', 'Îșφρπ')" - - - "𝟬-đŸ”": # 0x1d7ec - 0x1d7f5 - - tc: "SB" - - spell: "translate('.', 'đŸŹđŸ­đŸźđŸŻđŸ°đŸ±đŸČđŸłđŸŽđŸ”', '0123456789')" - - # --- Nemeth Default Alphabet sans-serif-bold-italic chars. --- - - - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 - - tc: "SBE" - - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝙖-𝙯": # 0x1d656 - 0x1d66f - - tc: "SBE" - - spell: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝞐-𝞹": # 0x1d790 - 0x1d7a8 - - tc: "SBG" - - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "đž©": [t: "SBGLâ «"] # 0x1d7a9 - - - "đžȘ-đžș": # 0x1d7aa - 0x1d7ba - - tc: "SBG" - - spell: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžș', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" - - - "đž»": [t: "SBVL⠎"] # 0x1d7bb - - "đžŒ": [t: "SBGL⠎"] # 0x1d7bc - - "đžœ": [t: "SBGL⠞"] # 0x1d7bd - - "đžŸ": [t: "SBGLâ „"] # 0x1d7be - - "𝞿": [t: "SBVL⠋"] # 0x1d7bf - - - "𝟀": [t: "SBGLâ Ż"] # 0x1d7c0 - - "𝟁": [t: "SBGLâ œ"] # 0x1d7c1 - - "𝟂": [t: "SBGLâ ș"] # 0x1d7c2 - - "𝟃": [t: "SBVL⠙"] # 0x1d7c3 - - - "𝟄": [t: "SBGL⠑"] # 0x1d7c4 - - "𝟅": [t: "SBVLâ č"] # 0x1d7c5 - - - "𝟆": [t: "SBGL⠅"] # 0x1d7c6 - - "𝟇": [t: "SBGL⠋"] # 0x1d7c7 - - "𝟈": [t: "SBGL⠗"] # 0x1d7c8 - - "𝟉": [t: "SBGL⠏"] # 0x1d7c9 - - # --- Nemeth Default Alphabet sans-serif-italic chars. --- - - "𝘈-𝘡": # 0x1d608 - 0x1d621 - - tc: "SE" - - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝘱-đ˜»": # 0x1d622 - 0x1d63b - - tc: "SE" - - spell: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" - - # --- Nemeth Default Alphabet script chars. --- - - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 - - tc: "TE" - - spell: "translate('.', 'đ’œđ’žđ’Ÿđ’ąđ’„đ’Šđ’©đ’Șđ’«đ’Źđ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'ACDGJKNOPQSTUVWXYZ')" - - - "ℬ": [t: "TECL⠃"] # 0x212c - - "ℰ": [t: "TECL⠑"] # 0x2130 - - "ℱ": [t: "TECL⠋"] # 0x2131 - - "ℋ": [t: "TECL⠓"] # 0x210b - - "ℐ": [t: "TECL⠊"] # 0x2110 - - "ℒ": [t: "TECL⠇"] # 0x2112 - - "ℳ": [t: "TECL⠍"] # 0x2133 - - "ℛ": [t: "TECL⠗"] # 0x211b - - - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf - - tc: "TE" - - spell: "translate('.', 'đ’¶đ’·đ’žđ’čđ’»đ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdfhijklmnpqrstuvwxyz')" - - - "ℯ": [t: "TEL⠑"] # 0x212f - - "ℊ": [t: "TEL⠛"] # 0x210a - - "℮": [t: "TEL⠕"] # 0x2134 - - # --- Nemeth Default Alphabet squared chars. --- - - - "🄰": [t: "â «â Č⠞⠫⠠⠁⠻"] # 0x1f130 - - "đŸ„±": [t: "â «â Č⠞⠫⠠⠃⠻"] # 0x1f131 - - "đŸ„Č": [t: "â «â Č⠞⠫⠠⠉⠻"] # 0x1f132 - - "🄳": [t: "â «â Č⠞⠫⠠⠙⠻"] # 0x1f133 - - "🄮": [t: "â «â Čâ žâ «â  â ‘â »"] # 0x1f134 - - "đŸ„”": [t: "â «â Čâ žâ «â  â ‹â »"] # 0x1f135 - - "đŸ„¶": [t: "â «â Č⠞⠫⠠⠛⠻"] # 0x1f136 - - "đŸ„·": [t: "â «â Čâ žâ «â  â “â »"] # 0x1f137 - - "🄾": [t: "â «â Čâ žâ «â  â Šâ »"] # 0x1f138 - - "đŸ„č": [t: "â «â Čâ žâ «â  â šâ »"] # 0x1f139 - - "đŸ„ș": [t: "â «â Čâ žâ «â  â …â »"] # 0x1f13a - - "đŸ„»": [t: "â «â Č⠞⠫⠠⠇⠻"] # 0x1f13b - - "đŸ„Œ": [t: "â «â Č⠞⠫⠠⠍⠻"] # 0x1f13c - - "đŸ„œ": [t: "â «â Č⠞⠫⠠⠝⠻"] # 0x1f13d - - "đŸ„Ÿ": [t: "â «â Čâ žâ «â  â •â »"] # 0x1f13e - - "🄿": [t: "â «â Č⠞⠫⠠⠏⠻"] # 0x1f13f - - "🅀": [t: "â «â Čâ žâ «â  â Ÿâ »"] # 0x1f140 - - "🅁": [t: "â «â Čâ žâ «â  â —â »"] # 0x1f141 - - "🅂": [t: "â «â Čâ žâ «â  â Žâ »"] # 0x1f142 - - "🅃": [t: "â «â Čâ žâ «â  â žâ »"] # 0x1f143 - - "🅄": [t: "â «â Čâ žâ «â  â „â »"] # 0x1f144 - - "🅅": [t: "â «â Čâ žâ «â  â §â »"] # 0x1f145 - - "🅆": [t: "â «â Čâ žâ «â  â șâ »"] # 0x1f146 - - "🅇": [t: "â «â Čâ žâ «â  â ­â »"] # 0x1f147 - - "🅈": [t: "â «â Č⠞⠫⠠⠜⠻"] # 0x1f148 - - "🅉": [t: "â «â Č⠞⠫⠠⠔⠻"] # 0x1f149 - - # --- Nemeth Default Alphabet sub chars. --- - - - "₀": [t: "â °â Ž"] # 0x2080 - - "₁": [t: "⠰⠂"] # 0x2081 - - "₂": [t: "⠰⠆"] # 0x2082 - - "₃": [t: "⠰⠒"] # 0x2083 - - "₄": [t: "â °â Č"] # 0x2084 - - "₅": [t: "â °â ą"] # 0x2085 - - "₆": [t: "⠰⠖"] # 0x2086 - - "₇": [t: "â °â ¶"] # 0x2087 - - "₈": [t: "â °â Š"] # 0x2088 - - "₉": [t: "⠰⠔"] # 0x2089 - - # --- Nemeth Default Alphabet super chars. --- - - - "⁰": [t: "⠘⠎"] # 0x2070 - - "Âč": [t: "⠘⠂"] # 0xb9 - - "ÂČ": [t: "⠘⠆"] # 0xb2 - - "Âł": [t: "⠘⠒"] # 0xb3 - - "⁎": [t: "⠘â Č"] # 0x2074 - - "⁔": [t: "⠘⠹"] # 0x2075 - - "⁶": [t: "⠘⠖"] # 0x2076 - - "⁷": [t: "⠘⠶"] # 0x2077 - - "⁞": [t: "⠘⠊"] # 0x2078 - - "âč": [t: "⠘⠔"] # 0x2079 - - # --- Nemeth Default Characters latin-lower-phonetic chars. --- - - - "Ăž": [t: "⠈⠕"] # 0xf8 - - # --- Nemeth Default Characters math_geometry chars. --- - - - "─": [t: "â ±"] # 0x2500 - - "│": [t: "â ł"] # 0x2502 - - "▰": [t: "â «â žâ ›"] # 0x25b0 - - "▱": [t: "⠫⠛"] # 0x25b1 - - "â–œ": [t: "â šâ «"] # 0x25bd - - "◆": [t: "â «â žâ ™"] # 0x25c6 - - "◇": [t: "⠫⠙"] # 0x25c7 - - "◈": [t: "â «â žâ ™"] # 0x25c8 - - "◉": [t: "â «â žâ ‰"] # 0x25c9 - - "◊": [t: "⠫⠙"] # 0x25ca - - "⬟": [t: "â «â žâ ą"] # 0x2b1f - - "⏠": [t: "â «â ą"] # 0x2b20 - - "⏥": [t: "⠫⠖"] # 0x2b21 - - "⏹": [t: "â «â žâ –"] # 0x2b22 - - "⏣": [t: "â «â žâ –"] # 0x2b23 - - "⏀": [t: "â «â žâ ‰"] # 0x2b24 - - "⏄": [t: "â «â žâ ™"] # 0x2b25 - - # --- Nemeth Default Characters math_symbols chars. --- - - - "\"": [t: "⠄⠄"] # 0x22 - - "ÂĄ": [t: "⠖"] # 0xa1 - - "Âą": [t: "⠈⠉"] # 0xa2 - - "ÂŁ": [t: "⠈⠇"] # 0xa3 - - "€": [t: "⠈⠫"] # 0xa4 - - "„": [t: "⠈⠜"] # 0xa5 - - "§": [t: "⠈⠠⠎"] # 0xa7 - - "©": [t: "⠘⠉"] # 0xa9 (Copyright) - - "ÂȘ": [t: "⠞⠰⠁"] # 0xaa - - "«": [t: "⠐⠅⠈⠐⠅⠻"] # 0xab - - "Âź": [t: "⠘⠗"] # 0xae - - "ÂŽ": [t: "⠈"] # 0xb4 - - "”": [t: "⠚⠍"] # 0xb5 - - "¶": [t: "⠈⠠⠏"] # 0xb6 - - "Âż": [t: "â Š"] # 0xbf - - "Êč": [t: "⠄"] # 0x2b9 - - "Êș": [t: "⠄⠄"] # 0x2ba - - "˙": [t: "â Ą"] # 0x2d9 - - "˜": [t: "⠈⠱"] # 0x2dc - - "‐": [t: "â €"] # 0x2010 - - "‑": [t: "â €"] # 0x2011 - - "‒": [t: "⠀⠀"] # 0x2012 - - "–": [t: "⠀⠀"] # 0x2013 - - "‖": [t: "â łâ ł"] # 0x2016 - - "†": [t: "â žâ »"] # 0x2020 - - "‡": [t: "â žâ žâ »"] # 0x2021 - - "‱": [t: "â Ą"] # 0x2022 - - " ": [t: "⠄"] # 0x2024 - - " ": [t: "⠄⠄"] # 0x2025 - - "â€Č": [t: "⠄"] # 0x2032 - - "″": [t: "⠄⠄"] # 0x2033 - - "‮": [t: "⠄⠄."] # 0x2034 (Triple prime) - - "⁗": [t: "⠄⠄.."] # 0x2057 (Quadruple prime) - - "‌": [t: "⠖⠖"] # 0x203c - - "‟": [t: "â ±"] # 0x203e - - "⁇": [t: "â čâ č"] # 0x2047 - - "⁈": [t: "â č⠖"] # 0x2048 - - "⁉": [t: "⠖â č"] # 0x2049 - - "∀": [t: "⠈⠯"] # 0x2200 - - "∃": [t: "⠈⠿"] # 0x2203 - - "∄": [t: "⠌⠈⠿"] # 0x2204 - - "∅": [t: "â žâ Ž"] # 0x2205 - - "∈": [t: "⠈⠑"] # 0x2208 - - "∉": [t: "⠌⠈⠑"] # 0x2209 - - "∊": [t: "⠈⠑"] # 0x220a - - "∋": [t: "⠈⠹"] # 0x220b - - "∌": [t: "⠌⠈⠱"] # 0x220c - - "∍": [t: "⠈⠹"] # 0x220d - - "∎": [t: "â žâ ł"] # 0x220e - - "−": [t: "â €"] # 0x2212 - - "∓": [t: "⠀⠏"] # 0x2213 - - "∕": [t: "⠾⠌"] # 0x2215 - - "∖": [t: "â žâ Ą"] # 0x2216 - - "∗": [t: "⠈⠌"] # 0x2217 - - "∘": [t: "â šâ Ą"] # 0x2218 - - "∝": [t: "â žâ ż"] # 0x221d - - "∞": [t: "â  â ż"] # 0x221e - - "∟": [t: "â «â Șâ šâ —â »"] # 0x221f - - "∠": [t: "â «â Ș"] # 0x2220 - - "∹": [t: "â «â Ș⠞⠫⠫⠁⠻"] # 0x2222 - - "∣": [t: "â ł"] # 0x2223 - - "∀": [t: "⠌⠳"] # 0x2224 - - "∄": [t: "⠫⠇"] # 0x2225 - - "∊": [t: "⠌⠫⠇"] # 0x2226 - - "∧": [t: "⠈⠩"] # 0x2227 - - "√": [t: "⠈⠏"] # 0x2228 - - "∩": [t: "â šâ ©"] # 0x2229 - - "âˆȘ": [t: "â šâ Ź"] # 0x222a - - "∫": [t: "â ź"] # 0x222b - - "∏": [t: "â źâ ź"] # 0x222c - - "∭": [t: "â źâ źâ ź"] # 0x222d - - "∟": [t: "â źâ ˆâ «â ‰â »"] # 0x222e - - "âˆČ": [t: "⠟⠈⠫â Ș⠹⠔⠻"] # 0x2232 - - "∳": [t: "â źâ ˆâ «â ąâ ”â •â »"] # 0x2233 - - "∎": [t: "â  â Ą"] # 0x2234 - - "∔": [t: "⠈⠌"] # 0x2235 - - "∶": [t: "⠐⠂"] # 0x2236 - - "∷": [t: "⠰⠆"] # 0x2237 - - "∞": [t: "â šâ €"] # 0x2238 - - "∌": [t: "⠈⠱"] # 0x223c - - "≁": [t: "⠌⠈⠱"] # 0x2241 - - "≂": [t: "⠱⠈⠱"] # 0x2242 - - "≃": [t: "⠈⠱⠱"] # 0x2243 - - "≄": [t: "⠌⠈⠱⠱"] # 0x2244 - - "≅": [t: "⠈⠱⠚⠅"] # 0x2245 - - "≆": [t: "⠈⠱⠌⠚⠅"] # 0x2246 - - "≇": [t: "⠌⠈⠱⠚⠅"] # 0x2247 - - "≈": [t: "⠈⠱⠈⠱"] # 0x2248 - - "≉": [t: "⠌⠈⠱⠈⠱"] # 0x2249 - - "≊": [t: "⠈⠱⠈⠱⠱"] # 0x224a - - "≍": [t: "⠈⠣⠠⠣"] # 0x224d - - "≎": [t: "⠈⠣⠠⠣"] # 0x224e - - "≐": [t: "⠐⠚⠅⠣⠥⠻"] # 0x2250 - - "≑": [t: "⠐⠚⠅⠩⠥⠣⠥⠻"] # 0x2251 - - "≗": [t: "⠐⠚⠅⠣⠚⠥⠻"] # 0x2257 - - "≘": [t: "⠐⠚⠅⠣⠫⠁⠻"] # 0x2258 - - "≙": [t: "⠐⠚⠅⠣⠞⠣⠻"] # 0x2259 - - "≚": [t: "⠐⠚⠅⠣⠞⠩⠻"] # 0x225a - - "≛": [t: "⠐⠚⠅⠣⠫⠞⠎⠻"] # 0x225b - - "≜": [t: "⠐⠚⠅⠣⠫⠞⠻"] # 0x225c - - "≝": [t: "⠐⠚⠅⠣⠙⠑⠋⠻"] # 0x225d - - "≞": [t: "â â šâ …â Łâ â »"] # 0x225e - - "≟": [t: "⠐⠚⠅⠣⠞⠊⠻"] # 0x225f - - "≠": [t: "⠌⠹⠅"] # 0x2260 - - "≱": [t: "⠌⠾⠇"] # 0x2262 - - "≀": [t: "⠐⠅⠱"] # 0x2264 - - "≄": [t: "â šâ ‚â ±"] # 0x2265 - - "≩": [t: "⠐⠅⠹⠅"] # 0x2266 - - "≧": [t: "⠹⠂⠹⠅"] # 0x2267 - - "≹": [t: "⠐⠅⠌⠹⠅"] # 0x2268 - - "≩": [t: "⠹⠂⠌⠹⠅"] # 0x2269 - - "â‰Ș": [t: "⠐⠅⠈⠐⠅⠻"] # 0x226a - - "≫": [t: "⠚⠂⠈⠚⠂⠻"] # 0x226b - - "≭": [t: "⠌⠈⠣⠠⠣"] # 0x226d - - "≼": [t: "⠌⠐⠅"] # 0x226e - - "≯": [t: "⠌⠹⠂"] # 0x226f - - "≰": [t: "⠌⠐⠅⠱"] # 0x2270 - - "≱": [t: "⠌⠚⠂⠱"] # 0x2271 - - "â‰Č": [t: "⠐⠅⠈⠱"] # 0x2272 - - "≳": [t: "⠚⠂⠈⠱"] # 0x2273 - - "≮": [t: "⠌⠐⠅⠈⠱"] # 0x2274 - - "≔": [t: "⠌⠚⠂⠈⠱"] # 0x2275 - - "≶": [t: "⠐⠅⠹⠂"] # 0x2276 - - "≷": [t: "⠹⠂⠐⠅"] # 0x2277 - - "≾": [t: "⠌⠐⠅⠹⠂"] # 0x2278 - - "â‰č": [t: "⠌⠹⠂⠐⠅"] # 0x2279 - - "â‰ș": [t: "⠹⠐⠅"] # 0x227a - - "≻": [t: "⠹⠹⠂"] # 0x227b - - "≌": [t: "⠚⠐⠅⠱"] # 0x227c - - "≜": [t: "⠚⠚⠐⠱"] # 0x227d - - "≟": [t: "⠚⠐⠅⠈⠱"] # 0x227e - - "≿": [t: "⠚⠚⠂⠈⠱"] # 0x227f - - "⊀": [t: "⠌⠹⠐⠅"] # 0x2280 - - "⊁": [t: "⠌⠹⠐⠅"] # 0x2281 - - "⊂": [t: "⠾⠐⠅"] # 0x2282 - - "⊃": [t: "⠾⠹⠂"] # 0x2283 - - "⊄": [t: "⠌⠾⠐⠅"] # 0x2284 - - "⊅": [t: "⠌⠾⠹⠂"] # 0x2285 - - "⊆": [t: "⠞⠐⠅⠱"] # 0x2286 - - "⊇": [t: "â žâ šâ ‚â ±"] # 0x2287 - - "⊈": [t: "⠌⠞⠐⠅⠱"] # 0x2288 - - "⊉": [t: "⠌⠞⠚⠂⠱"] # 0x2289 - - "⊊": [t: "⠾⠐⠅⠌⠹⠅"] # 0x228a - - "⊋": [t: "⠾⠹⠂⠌⠹⠅"] # 0x228b - - "⊄": [t: "⠫⠏"] # 0x22a5 - - "⋀": [t: "⠈⠩"] # 0x22c0 - - "⋁": [t: "⠈⠏"] # 0x22c1 - - "⋂": [t: "â šâ ©"] # 0x22c2 - - "⋃": [t: "â šâ Ź"] # 0x22c3 - - "⋄": [t: "⠫⠙"] # 0x22c4 - - "⋜": [t: "⠱⠐⠅"] # 0x22dc - - "⋝": [t: "⠱⠚⠂"] # 0x22dd - - "⟂": [t: "⠫⠏"] # 0x27c2 - - "⩀": [t: "â łâ łâ ł"] # 0x2980 - - "⊶": [t: "⠫⠉⠞⠫⠳⠻"] # 0x29b6 - - "⊷": [t: "⠫⠉⠞⠫⠫⠇⠻"] # 0x29b7 - - "⊞": [t: "⠫⠉⠞⠫⠞⠥⠻"] # 0x29b8 - - "âŠč": [t: "⠫⠉⠞⠫⠫⠏⠻"] # 0x29b9 - - "⊿": [t: "⠫⠉⠞⠫⠔⠔⠻"] # 0x29bf - - "⧀": [t: "⠫⠉⠞⠫⠐⠅⠻"] # 0x29c0 - - "⧁": [t: "⠫⠉⠞⠫⠚⠂⠻"] # 0x29c1 - - "⹀": [t: "⠫⠉⠞⠫⠥⠻"] # 0x2a00 - - "⚁": [t: "⠫⠉⠞⠫⠏⠻"] # 0x2a01 - - "⹂": [t: "â «â ‰â žâ «â ˆâ Ąâ »"] # 0x2a02 - - "âȘŻ": [t: "⠚⠐⠅⠱"] # 0x2aaf - - "âȘ°": [t: "â šâ šâ ‚â ±"] # 0x2ab0 - - "âȘ±": [t: "⠚⠐⠅⠌⠱"] # 0x2ab1 - - "âȘČ": [t: "⠚⠚⠂⠌⠱"] # 0x2ab2 - - "âȘł": [t: "⠹⠐⠅⠹⠅"] # 0x2ab3 - - "âȘŽ": [t: "⠹⠹⠂⠹⠅"] # 0x2ab4 - - "âȘ”": [t: "⠹⠐⠅⠌⠹⠅"] # 0x2ab5 - - "âȘ¶": [t: "⠹⠹⠂⠌⠹⠅"] # 0x2ab6 - - "âȘ·": [t: "⠚⠐⠅⠈⠱⠈⠱"] # 0x2ab7 - - "âȘž": [t: "⠚⠚⠂⠈⠱⠈⠱"] # 0x2ab8 - - "âȘč": [t: "⠚⠐⠅⠌⠈⠱⠈⠱"] # 0x2ab9 - - "âȘș": [t: "⠚⠚⠂⠌⠈⠱⠈⠱"] # 0x2aba - - "âȘ»": [t: "⠚⠐⠅⠈⠚⠐⠅⠻"] # 0x2abb - - "âȘŒ": [t: "⠚⠚⠂⠈⠚⠚⠂⠻"] # 0x2abc - - "ïč©": [t: "⠈⠎"] # 0xfe69 - - "": [t: "⠈⠎"] # 0xff04 - - "ïŒż": [t: "â ±"] # 0xff3f - - "": [t: "⠈⠱"] # 0xff5e - - "ïż ": [t: "⠈⠉"] # 0xffe0 - - "ïżĄ": [t: "⠈⠇"] # 0xffe1 - - "ïżŁ": [t: "â ±"] # 0xffe3 - - "ïż„": [t: "⠈⠜"] # 0xffe5 - - # --- Nemeth Default Characters rest chars. --- - - - "â„”": [t: "⠠⠠⠁"] # 0x2135 - - "ℶ": [t: "⠠⠠⠃"] # 0x2136 - - "ℷ": [t: "⠠⠠⠉"] # 0x2137 - - "ℾ": [t: "⠠⠠⠙"] # 0x2138 - - "Ă ": [t: "⠈⠁"] # 0xe0 - - "ĂĄ": [t: "⠈⠁"] # 0xe1 - - "Ăą": [t: "⠈⠁"] # 0xe2 - - "ĂŁ": [t: "⠈⠁"] # 0xe3 - - "Ă€": [t: "⠈⠁"] # 0xe4 - - "Ă„": [t: "⠈⠁"] # 0xe5 - - "ç": [t: "⠈⠉"] # 0xe7 - - "Ăš": [t: "⠈⠑"] # 0xe8 - - "Ă©": [t: "⠈⠑"] # 0xe9 - - "ĂȘ": [t: "⠈⠑"] # 0xea - - "Ă«": [t: "⠈⠑"] # 0xeb - - "ĂŹ": [t: "⠈⠊"] # 0xec - - "Ă­": [t: "⠈⠊"] # 0xed - - "Ăź": [t: "⠈⠊"] # 0xee - - "ĂŻ": [t: "⠈⠊"] # 0xef - - "ñ": [t: "⠈⠝"] # 0xf1 - - "ĂČ": [t: "⠈⠕"] # 0xf2 - - "Ăł": [t: "⠈⠕"] # 0xf3 - - "ĂŽ": [t: "⠈⠕"] # 0xf4 - - "Ă”": [t: "⠈⠕"] # 0xf5 - - "ö": [t: "⠈⠕"] # 0xf6 - - "Ăč": [t: "⠈⠄"] # 0xf9 - - "Ăș": [t: "⠈⠄"] # 0xfa - - "Ă»": [t: "⠈⠄"] # 0xfb - - "ĂŒ": [t: "⠈⠄"] # 0xfc - - "Ăœ": [t: "⠈⠜"] # 0xfd - - "Ăż": [t: "⠈⠜"] # 0xff - - - "À": [t: "⠠⠈⠁"] # 0xc0 - - "Á": [t: "⠠⠈⠁"] # 0xc1 - - "Â": [t: "⠠⠈⠁"] # 0xc2 - - "Ã": [t: "⠠⠈⠁"] # 0xc3 - - "Ä": [t: "⠠⠈⠁"] # 0xc4 - - "Å": [t: "⠠⠈⠁"] # 0xc5 - - "Ç": [t: "⠠⠈⠉"] # 0xc7 - - "È": [t: "⠠⠈⠑"] # 0xc8 - - "É": [t: "⠠⠈⠑"] # 0xc9 - - "Ê": [t: "⠠⠈⠑"] # 0xca - - "Ë": [t: "⠠⠈⠑"] # 0xcb - - "Ì": [t: "⠠⠈⠊"] # 0xcc - - "Í": [t: "⠠⠈⠊"] # 0xcd - - "Î": [t: "⠠⠈⠊"] # 0xce - - "Ï": [t: "⠠⠈⠊"] # 0xcf - - "Ñ": [t: "⠠⠈⠝"] # 0xd1 - - "Ò": [t: "⠠⠈⠕"] # 0xd2 - - "Ó": [t: "⠠⠈⠕"] # 0xd3 - - "Ô": [t: "⠠⠈⠕"] # 0xd4 - - "Ö": [t: "⠠⠈⠕"] # 0xd6 - - "Ù": [t: "⠠⠈⠄"] # 0xd9 - - "Ú": [t: "⠠⠈⠄"] # 0xda - - "Û": [t: "⠠⠈⠄"] # 0xdb - - "Ü": [t: "⠠⠈⠄"] # 0xdc - - "Ý": [t: "⠠⠈⠜"] # 0xdd - - "←": [t: "â «â Ș⠒⠒"] # 0x2190 - - - "↑": # 0x2191 - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "â «â Ł"] - else: [t: "â «â Łâ ’â ’â •"] - - - "↓": # 0x2193 - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "â «â ©"] - else: [t: "⠫⠩⠒⠒⠕"] - - - "↔": [t: "â «â Ș⠒⠒⠕"] # 0x2194 - - "↕": [t: "â «â Łâ ©â Ș⠒⠒⠕"] # 0x2195 - - "↖": [t: "⠫⠘â Ș⠒⠒"] # 0x2196 - - "↗": [t: "⠫⠘⠒⠒⠕"] # 0x2197 - - "↘": [t: "⠫⠰⠒⠒⠕"] # 0x2198 - - "↙": [t: "â «â °â Ș⠒⠒"] # 0x2199 - - "↚": [t: "⠳⠈⠫â Ș⠒⠒⠻"] # 0x219a - - "↛": [t: "â łâ ˆâ «â ’â ’â •â »"] # 0x219b - - "↜": [t: "â «â Ș⠔⠒⠱"] # 0x219c - - "↝": [t: "⠫⠔⠒⠹⠕"] # 0x219d - - "↞": [t: "â «â Șâ Ș⠒⠒"] # 0x219e - - "↟": [t: "â «â Łâ ’â ’â •â •"] # 0x219f - - "↠": [t: "⠫⠒⠒⠕⠕"] # 0x21a0 - - "↡": [t: "⠫⠩⠒⠒⠕⠕"] # 0x21a1 - - "↱": [t: "â «â Șâ ’â ’â  â œ"] # 0x21a2 - - "↣": [t: "â «â  â Żâ ’â ’â •"] # 0x21a3 - - "ↀ": [t: "â «â Ș⠒⠒⠳"] # 0x21a4 - - "ↄ": [t: "â «â Łâ łâ ’â ’â •"] # 0x21a5 - - "↩": [t: "â «â łâ ’â ’â •"] # 0x21a6 - - "↧": [t: "â «â ©â łâ ’â ’â •"] # 0x21a7 - - "↹": [t: "â «â Ș⠒⠳⠒⠕"] # 0x21a8 - - "↩": [t: "â «â Ș⠒⠒⠠⠕"] # 0x21a9 - - "â†Ș": [t: "â «â  â Ș⠒⠒⠕"] # 0x21aa - - "↫": [t: "â «â Ș⠒⠒⠹⠡"] # 0x21ab - - "↬": [t: "â «â šâ Ąâ ’â ’â •"] # 0x21ac - - "↭": [t: "â «â Ș⠔⠒⠱⠕"] # 0x21ad - - "↼": [t: "⠳⠈⠫â Ș⠒⠒⠕"] # 0x21ae - - "↯": [t: "⠫⠩⠔⠹⠔"] # 0x21af - - "↮": [t: "â «â  â łâ ’â ’â •"] # 0x21b4 - - "↔": [t: "â «â ©â  â łâ ’â ’â •"] # 0x21b5 - - "↶": [t: "⠫⠹⠔⠕"] # 0x21b6 - - "↷": [t: "â «â Ș⠱⠔"] # 0x21b7 - - "â†ș": [t: "⠫⠹⠔⠕"] # 0x21ba - - "↻": [t: "â «â Ș⠱⠔"] # 0x21bb - - "⇄": [t: "⠫⠒⠒⠕⠫â Ș⠒⠒"] # 0x21c4 - - "⇅": [t: "⠫⠣⠒⠒⠕⠐⠫⠩⠒⠒⠕"] # 0x21c5 - - "⇆": [t: "â «â Ș⠒⠒⠫⠒⠒⠕"] # 0x21c6 - - "⇇": [t: "⠫⠚⠒⠒⠫⠚⠒⠒"] # 0x21c7 - - "⇈": [t: "⠫⠣⠒⠒⠕⠐⠫⠣⠒⠒⠕"] # 0x21c8 - - "⇉": [t: "⠫⠒⠒⠕⠫⠒⠒⠕"] # 0x21c9 - - "⇊": [t: "⠫⠩⠒⠒⠕⠐⠫⠩⠒⠒⠕"] # 0x21ca - - "⇍": [t: "⠳⠈⠫â Șâ Ș⠒⠒"] # 0x21cd - - "⇎": [t: "⠳⠈⠫â Șâ Ș⠒⠒⠕⠕"] # 0x21ce - - "⇏": [t: "â łâ ˆâ «â ’â ’â •â •"] # 0x21cf - - "⇐": [t: "â «â Șâ ¶â ¶"] # 0x21d0 - - "⇑": [t: "â «â Łâ ¶â ¶â •"] # 0x21d1 - - "⇒": [t: "⠫⠶⠶⠕"] # 0x21d2 - - "⇓": [t: "â «â Łâ ¶â ¶â •"] # 0x21d3 - - "⇔": [t: "â «â Ș⠶⠶⠕"] # 0x21d4 - - "⇕": [t: "â «â Łâ Ș⠶⠶⠕"] # 0x21d5 - - "⇖": [t: "⠫⠘â Șâ ¶â ¶"] # 0x21d6 - - "⇗": [t: "⠫⠘⠶⠶⠕"] # 0x21d7 - - "⇘": [t: "⠫⠰⠶⠶⠕"] # 0x21d8 - - "⇙": [t: "â «â °â Șâ Ș⠒⠒"] # 0x21d9 - - "⇚": [t: "â «â Șâ Șâ ¶â ¶"] # 0x21da FIX: how to represent triple shafts? - - "⇛": [t: "⠫⠶⠶⠕⠕"] # 0x21db FIX: how to represent triple shafts? - - "⇜": [t: "â «â Ș⠹⠀⠔⠒⠹"] # 0x21dc - - "⇝": [t: "⠫⠹⠀⠔⠒⠹⠕"] # 0x21dd - - "⇞": [t: "â łâ łâ ˆâ «â Łâ ’â ’â •â »"] # 0x21de - - "⇟": [t: "â łâ łâ ˆâ «â ©â ’â ’â •â »"] # 0x21df - - "⇠": [t: "â «â Ș⠒⠒"] # 0x21e0 - - "⇡": [t: "â «â Łâ ’â ’â •"] # 0x21e1 - - "⇱": [t: "⠫⠒⠒⠕"] # 0x21e2 - - "⇣": [t: "⠫⠩⠒⠒⠕"] # 0x21e3 - - "⇀": [t: "â «â łâ Ș⠒⠒"] # 0x21e4 - - "⇄": [t: "â «â ’â ’â •â ł"] # 0x21e5 - - "⇩": [t: "â «â žâ Ș⠒⠒"] # 0x21e6 - - "⇧": [t: "â «â Łâ žâ ’â ’â •"] # 0x21e7 - - "⇹": [t: "â «â žâ ’â ’â •"] # 0x21e8 - - "⇩": [t: "â «â ©â žâ ’â ’â •"] # 0x21e9 - - "⇳": [t: "â «â Łâ žâ Ș⠒⠒⠕"] # 0x21f3 - - "⇮": [t: "â «â ’â ’â •â šâ Ą"] # 0x21f4 - - "⇔": [t: "⠫⠩⠒⠒⠕⠐⠫⠣⠒⠒⠕"] # 0x21f5 - - "⇶": [t: "⠫⠒⠒⠕⠫⠒⠒⠕⠫⠒⠒⠕"] # 0x21f6 - - "⇷": [t: "⠳⠈⠫â Ș⠒⠒⠻"] # 0x21f7 - - "⇾": [t: "â łâ ˆâ «â ’â ’â •â »"] # 0x21f8 - - "â‡č": [t: "⠳⠈⠫â Ș⠒⠒⠕"] # 0x21f9 - - "â‡ș": [t: "⠳⠳⠈⠫â Ș⠒⠒⠻"] # 0x21fa - - "⇻": [t: "â łâ łâ ˆâ «â ’â ’â •â »"] # 0x21fb - - "⇌": [t: "⠳⠳⠈⠫â Ș⠒⠒⠕"] # 0x21fc - - "⇜": [t: "â «â łâ ’â ’"] # 0x21fd - - "⇟": [t: "â «â ’â ’â ł"] # 0x21fe - - "⇿": [t: "â «â łâ ’â ’â ł"] # 0x21ff - - - "ⅆ": [t: "⠙"] # 0x2146 - - "ⅇ": [t: "⠑"] # 0x2147 - - "ⅈ": [t: "⠊"] # 0x2148 - - "⌜": [t: "⠈⠘⠷"] # 0x231c - - "⌝": [t: "⠈⠘⠟"] # 0x231d - - "⌞": [t: "⠈⠰⠷"] # 0x231e - - "⌟": [t: "⠈⠰⠟"] # 0x231f - - "〈": [t: "â šâ šâ ·"] # 0x2329 - - "âŒȘ": [t: "â šâ šâ Ÿ"] # 0x232a - - "⏞": [t: "â šâ ·"] # 0x23de - - "⏟": [t: "â šâ Ÿ"] # 0x23df - - "⎮": [t: "⠈⠷"] # 0x23b4 - - "⎔": [t: "⠈⠟"] # 0x23b5 - - "âŸȘ": [t: "â šâ šâ šâ ·"] # 0x27ea - - "⟫": [t: "â šâ šâ šâ Ÿ"] # 0x27eb - - "〈": [t: "â šâ šâ ·"] # 0x3008 - - "〉": [t: "â šâ šâ Ÿ"] # 0x3009 - - "《": [t: "â šâ šâ šâ ·"] # 0x300a - - "》": [t: "â šâ šâ šâ Ÿ"] # 0x300b - - "「": [t: "⠈⠘⠷"] # 0x300c - - "」": [t: "⠈⠘⠟"] # 0x300d - - "↌": [t: "⠫⠈â Ș⠒⠒"] # 0x21bc - - "↜": [t: "â «â  â Ș⠒⠒"] # 0x21bd - - "↟": [t: "â «â Łâ ’â ’â  â •"] # 0x21be - - "↿": [t: "â «â Łâ ’â ’â ˆâ •"] # 0x21bf - - "⇀": [t: "⠫⠒⠒⠈⠕"] # 0x21c0 - - "⇁": [t: "⠫⠒⠒⠠⠕"] # 0x21c1 - - "⇂": [t: "â «â Ș⠒⠒⠈⠕"] # 0x21c2 - - "⇃": [t: "⠫⠩⠒⠒⠠⠕"] # 0x21c3 - - "⇋": # 0x21cb - - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "â «â Ș⠒⠫⠒⠕"] - else: [t: "⠫⠈â Ș⠒⠒⠫⠒⠒⠈⠕"] - - "⇌": # 0x21cc - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "⠫⠒⠕⠫â Ș⠒"] - else: [t: "⠫⠒⠒⠈⠕⠫⠈â Ș⠒⠒"] - - - "℔": [t: "â ł"] # 0x2114 - - "ℱ": [t: "⠘⠞"] # 0x2122 - - "Å": [t: "⠈⠠⠁"] # 0x212b - - "­": [t: "â €"] # 0xad - - " -​": [t: "W"] # 0x2000 - 0x200b (various spaces / ZWSP) - - "‹": [t: "W"] # 0x2028 - - "
": [t: "W"] # 0x2029 - - " ": [t: "W"] # 0x202f - - " ": [t: "W"] # 0x205f - - "₣": [t: "⠈⠋"] # 0x20A3 (French franc sign - - "₩": [t: "⠈⠝"] # 0x2046 (Naira sign) - - "₩": [t: "⠈â ș"] # 0x20A9 (Won sign) - - "€": [t: "⠈⠑"] # 0x20AC (Euro sign) - - "ï»ż": [t: "W"] # 0xfeff - - "☆": [t: "⠫⠎"] # 0x2606 - - "✕": [t: "⠈⠥"] # 0x2715 - - "ÂŒ": [t: "â č⠂⠌â Čâ Œ"] # 0xbc - - "œ": [t: "â č⠂⠌⠆⠌"] # 0xbd - - "Ÿ": [t: "â č⠒⠌â Čâ Œ"] # 0xbe - - "⅐": [t: "â č⠂⠌⠶⠌"] # 0x2150 - - "⅑": [t: "â č⠂⠌⠔⠌"] # 0x2151 - - "⅒": [t: "â č⠂⠌⠂⠎⠌"] # 0x2152 - - "⅓": [t: "â č⠂⠌⠒⠌"] # 0x2153 - - "⅔": [t: "â č⠆⠌⠒⠌"] # 0x2154 - - "⅕": [t: "â čâ ‚â Œâ ąâ Œ"] # 0x2155 - - "⅖": [t: "â čâ †â Œâ ąâ Œ"] # 0x2156 - - "⅗": [t: "â čâ ’â Œâ ąâ Œ"] # 0x2157 - - "⅘": [t: "â čâ Čâ Œâ ąâ Œ"] # 0x2158 - - "⅙": [t: "â č⠂⠌⠖⠌"] # 0x2159 - - "⅚": [t: "â čâ ąâ Œâ –â Œ"] # 0x215a - - "⅛": [t: "â č⠂⠌⠊⠌"] # 0x215b - - "⅜": [t: "â č⠒⠌⠊⠌"] # 0x215c - - "⅝": [t: "â čâ ąâ Œâ Šâ Œ"] # 0x215d - - "⅞": [t: "â č⠶⠌⠊⠌"] # 0x215e - - "⅟": [t: "â č⠂⠌⠌"] # 0x215f - - "↉": [t: "â č⠎⠌⠒⠌"] # 0x2189 - - "㉈": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠂⠎⠻⠻"] # 0x3248 - - "㉉": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠆⠎⠻⠻"] # 0x3249 - - "㉊": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠒⠎⠻⠻"] # 0x324a - - "㉋": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌â Č⠎⠻⠻"] # 0x324b - - "㉌": [t: "â «â žâ Čâ žâ «â «â ‰â žâ «â Œâ ąâ Žâ »â »"] # 0x324c - - "㉍": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠖⠎⠻⠻"] # 0x324d - - "㉎": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠶⠎⠻⠻"] # 0x324e - - "㉏": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠊⠎⠻⠻"] # 0x324f - - - - "‘": [t: "Pâ  â Š"] # 0x2018 (Left single quotation mark) - - "’": [t: "Pâ  â Ž"] # 0x2019 (Right single quotation mark) - - "“": [t: "Pâ Š"] # 0x201C (Left double quotation mark) - - "”": [t: "Pâ Ž"] # 0x201D (Right double quotation mark) - - "‰": [t: "`00"] - - "ℏ": [t: "⠈⠓"] # 0x210F (Planck constant over two pi) - - "ℓ": [t: "TE⠇"] # 0x2113 (Script small l (differs from 1d4c1: 4-56-123)) - - "℘": [tc: "TCL⠏"] # 0x2118 (Script Capital P) -# - "ℝ": [t: ""] # 0x211D (Double-struck capital R (no nemeth double struck)) -# - "ⅆ": [t: ""] # 0x2146 (Double-struck italic small d) -# - "ⅇ": [t: ""] # 0x2147 (Double-struck italic small e) -# - "⇚": [t: "⠀⠫â Ș⠾⠾⠀"] # 0x21DA (Leftwards triple arrow) -# - "⇛": [t: "⠀⠫⠞⠞⠕⠀"] # 0x21DB (Rightwards triple arrow) - - "∔": [t: "⠐⠏⠣⠥⠻"] # 0x2214 (Dot plus) - - "√": [t: "⠜"] # 0x221A (Square root) - - "∛": [t: "⠣⠒⠜"] # 0x221B (Cube root) - - "∜": [t: "â Łâ Č⠜"] # 0x221C (Fourth root) - - "∥": [t: "â «â Ș⠞⠫⠫⠁⠻"] # 0x2221 (Measured angle) - - "âˆč": [t: "⠀⠐⠂"] # 0x2239 (Excess) - - "âˆș": [t: "⠐⠀⠩⠥⠥⠣⠥⠥⠻"] # 0x223A (Geometric proportion) - - "∻": [t: "⠐⠈⠱⠩⠥⠣⠥⠻"] # 0x223B (Homothetic) - - "∜": [t: "â  â ±"] # 0x223D (Reversed tilde) - - "≋": [t: "⠈⠱⠈⠱⠈⠱"] # 0x224B (Triple tilde) - - "≌": [t: "⠠⠱⠚⠅"] # 0x224C (All equal to) - - "≏": [t: "⠈⠣⠱"] # 0x224F (Difference between) - - "≔": [t: "⠐⠂⠹⠅"] # 0x2254 (Colon equals) - - "≕": [t: "⠹⠅⠐⠂"] # 0x2255 (Equals colon) - - "≖": [t: "â €â šâ Ąâ ˆâ šâ …â »â €"] # 0x2256 (Ring in equal to) - - "⊌": [t: "⠚⠏⠈⠫â Ș⠒⠻"] # 0x228C (Multiset) - - "⊍": [t: "⠥⠈⠚⠏⠻"] # 0x228D (Multiset multiplication) - - "⊎": [t: "⠏⠈⠚⠏⠻"] # 0x228E (Multiset union) - - "⊕": [t: "⠫⠉⠞⠫⠏⠻"] # 0x2295 (Circled plus) - - "⊖": [t: "⠫⠉⠞⠫⠀⠻"] # 0x2296 (Circled minus) - - "⊗": [t: "â «â ‰â žâ «â ˆâ Ąâ »"] # 0x2297 (Circled times) - - "⊘": [t: "⠫⠉⠞⠫⠞⠌⠻"] # 0x2298 (Circled division slash) - - "⊙": [t: "⠫⠉⠞⠫⠥⠻"] # 0x2299 (Circled dot operator) - - "⊚": [t: "â «â ‰â žâ «â ˜â šâ Ąâ »"] # 0x229a (Circled ring operator) - - "⊛": [t: "⠫⠉⠞⠫⠈⠌⠻"] # 0x229B (Circled asterisk operator) - - "⊜": [t: "⠫⠉⠞⠫⠚⠅⠻"] # 0x229C (Circled equals) - - "⊝": [t: "⠫⠉⠞⠫⠀⠀⠻"] # 0x229D (Circled dash) - - "⊞": [t: "â «â Čâ žâ «â Źâ »"] # 0x229E (Squared plus) - - "⊟": [t: "â «â Č⠞⠫⠀⠻"] # 0x229F (Squared minus) - - "⊠": [t: "â «â Č⠞⠫⠈⠥⠻"] # 0x22A0 (Squared times) - - "⊡": [t: "â «â Čâ žâ «â Ąâ »"] # 0x22A1 (Squared dot operator) - - "⊱": [t: "â «â łâ ’"] # 0x22A2 (Right tack) - - "⊣": [t: "â «â ’â ł"] # 0x22A3 (Left tack) - - "⊀": [t: "â «â ©â łâ ’"] # 0x22A4 (Down tack) -# - "⊄": [t: "⠀⠫⠏⠀ or ⠀⠫⠣⠳⠒⠀"] # 0x22A5 (Up tack (See also 27C2)) -# - "⊩": [t: ""] # 0x22A6 (Assertion) -# - "⊹": [t: ""] # 0x22A8 (TRUE) -# - "âŠČ": [t: ""] # 0x22B2 (Normal subgroup of) -# - "⊳": [t: ""] # 0x22B3 (Contains as normal subgroup) -# - "⊮": [t: ""] # 0x22B4 (Normal subgroup of or equal to) -# - "⊔": [t: ""] # 0x22B5 (Contains as normal subgroup or equal to) - - "⊶": [t: "â «â šâ Ąâ ’â Ą"] # 0x22B6 (Original of) - - "⊷": [t: "â «â Ąâ ’â šâ Ą"] # 0x22B7 (Image of) - - "⊾": [t: "â «â ’â šâ Ą"] # 0x22B8 (Multimap) -# - "⊟": [t: ""] # 0x22BE (Right angle w arc) - - "⊿": [t: "â «â žâ šâ —â »"] # 0x22BF (Right triangle) - - "⋅": [t: "â Ą"] # 0x22C5 (Dot operator) - - "∙": [t: "â Ą"] # 0x2219 -- similar looking to 0x22c5, so using the same braille - - "⋆": [t: "⠫⠎"] # 0x22C6 (Star operator) - - "⋍": [t: "⠠⠱⠱"] # 0x22CD (Reversed tilde equals) - - "⋖": [t: "â Ąâ ˆâ â …â »"] # 0x22D6 (Less-than w dot) - - "⋗": [t: "â Ąâ ˆâ šâ ‚â »"] # 0x22D7 (Greater-than w dot) - - "⋘": [t: "⠐⠅⠈⠐⠅⠈⠐⠅⠻"] # 0x22D8 (Much less-than) - - "⋙": [t: "⠚⠂⠈⠚⠂⠈⠚⠂⠻"] # 0x22D9 (Much greater-than) - - "â‹Č": [t: "⠱⠈⠈⠑⠻"] # 0x22F2 (Element of w long horizontal stroke) - - "â‹”": [t: "â â ˆâ ‘â Łâ Ąâ »"] # 0x22F5 (Element of w dot above) - - "⋶": [t: "⠱⠈⠑"] # 0x22F6 (Element of w overbar) - - "â‹ș": [t: "⠱⠈⠈⠹⠻"] # 0x22FA (Contains w long horizontal stroke) - - "⋜": [t: "⠱⠈⠹"] # 0x22FD (Contains w overbar) - - "⌈": [t: "⠈⠘⠷"] # 0x2308 (Left ceiling) - - "⌉": [t: "⠈⠘⠟"] # 0x2309 (Right ceiling) - - "⌊": [t: "⠈⠰⠷"] # 0x230A (Left floor) - - "⌋": [t: "⠈⠰⠟"] # 0x230B (Right floor) - - "⌱": [t: "⠫⠁"] # 0x2322 (Frown) - - "⌣": [t: "⠫⠄"] # 0x2323 (Smile) - - "■": [t: "â «â žâ Č"] # 0x25A0 (Filled square) - - "▫": [t: "â «â Č"] # 0x25AB (Small white Square) - - "□": [t: "â «â Č"] # 0x25A1 (Square) - - "◻": [t: "â «â Č"] # 0x25FB (Square) - - "▬": [t: "â «â žâ —"] # 0x25AC (Filled rectangle) - - "▭": [t: "⠫⠗"] # 0x25AD (Rectangle) - - "â–Č": [t: "â «â žâ ž"] # 0x25B2 (Black up-pointing triangle) - - "△": [t: "⠫⠞"] # 0x25B3 (White up-pointing triangle) - - "â–Œ": [t: "â žâ šâ «"] # 0x25BC (Black down-pointing triangle) - - "○": [t: "⠫⠉"] # 0x25CB (White circle) - - "●": [t: "â «â žâ ‰"] # 0x25CF (Black circle) - - "◫": [t: "â «â Čâ žâ «â łâ »"] # 0x25EB (White square w vertical bisecting line) -# - "⊄": [t: "⠫⠏"] # 0x27C2 (Perpendicular) - - "⟃": [t: "â šâ Ąâ ˆâ žâ â …â »"] # 0x27C3 (Open subset) - - "⟄": [t: "â šâ Ąâ ˆâ žâ šâ ‚â »"] # 0x27C4 (Open superset) - - "⟜": [t: "â «â šâ Ąâ ’â ’"] # 0x27DC (Left multimap) - - "⟝": [t: "â «â łâ ’â ’"] # 0x27DD (Long right tack) - - "⟞": [t: "â «â ’â ’â ł"] # 0x27DE (Long left tack) - - "⟟": [t: "â «â Łâ łâ ’â ’â šâ Ą"] # 0x27DF (Up tack w circle above) - - "⟩": [t: "⠈⠞⠷"] # 0x27E6 (Mathematical left white square bracket) - - "⟧": [t: "⠈⠞⠟"] # 0x27E7 (Mathematical right white square bracket) - - "⟹": [t: "â šâ šâ ·"] # 0x27E8 (Mathematical left angle bracket) - - "⟩": [t: "â šâ šâ Ÿ"] # 0x27E9 (Mathematical right angle bracket) - - "⟔": [t: "⠀⠫â Ș⠒⠒⠒⠀"] # 0x27F5 (Long leftwards arrow ) - - "⟶": [t: "⠀⠫⠒⠒⠒⠕⠀"] # 0x27F6 (Long rightwards arrow) - - "⟷": [t: "⠀⠫â Ș⠒⠒⠒⠕⠀"] # 0x27F7 (Long left right arrow) - - "⟾": [t: "⠀⠫â Ș⠶⠶⠶⠀"] # 0x27F8 (Long leftwards arrow ) - - "âŸč": [t: "⠀⠫⠶⠶⠶⠕⠀"] # 0x27F9 (Long rightwards arrow) - - "âŸș": [t: "⠀⠫â Ș⠶⠶⠶⠕⠀"] # 0x27FA (Long left right arrow) - - "⟻": [t: "⠀⠫â Ș⠒⠒⠒⠳⠀"] # 0x27FB (Long leftwards arrow from bar) - - "⟌": [t: "⠀⠫⠳⠒⠒⠒⠕⠀"] # 0x27FC (Long rightwards arrow from bar) - - "⟜": [t: "⠀⠫â Șâ ¶â ¶â ¶â łâ €"] # 0x27FD (Long leftwards double arrow from bar) - - "⟟": [t: "⠀⠫⠳⠶⠶⠶⠕⠀"] # 0x27FE (Long rightwards double arrow from bar) - - "⟿": [t: "⠀⠫⠹⠀⠔⠒⠹⠀⠔⠒⠹⠕⠀"] # 0x27FF (Long rightwards squiggle arrow) - - "‥": [t: "⠀⠫⠘â Ș⠒⠒⠕⠀"] # 0x2921 (North west and south east arrow) - - "‹": [t: "⠀⠫⠰â Ș⠒⠒⠕⠀"] # 0x2922 (North east and south west arrow) - - "🣐": # 0x1f8d0 (Long rightwards arrow over leftwards arrow (equilibrium)) - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "⠫⠒⠕⠫â Ș⠒"] - else: [t: "⠫⠒⠒⠈⠕⠫⠠â Ș⠒⠒"] - - "🣑": # 0x1f8d1 (Long rightwards harpoon over leftwards harpoon (equilibrium)) - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "⠫⠒⠕⠫â Ș⠒"] - else: [t: "⠫⠒⠒⠈⠕⠫⠠â Ș⠒⠒"] - - "🣒": # 0x1f8d2 (Long rightwards harpoon over short leftwards harpoon (equilibrium)) - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "⠫⠒⠒⠕⠫â Ș⠒"] - else: [t: "⠫⠒⠒⠈⠕⠫⠈â Ș⠒⠒"] - - "🣓": # 0x1f8d3 (Short rightwards harpoon over long leftwards harpoon (equilibrium, trend to the right)) - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "⠫⠒⠕⠫â Ș⠒⠒"] - else: [t: "⠫⠒⠈⠕⠫⠠â Ș⠒⠒"] - - "🣔": # 0x1f8d4 (Long leftwards harpoon over short rightwards harpoon (equilibrium, trend to the left)) - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "â «â Ș⠒⠒⠫⠒⠕"] - else: [t: "⠫⠈â Ș⠒⠒⠫⠒⠠⠕"] - - "🣕": # 0x1f8d5 (Short leftwards harpoon over long rightwards harpoon (equilibrium, trend to the left)) - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "â «â Ș⠒⠫⠒⠒⠕"] - else: [t: "⠫⠈â Ș⠒⠫⠒⠒⠠⠕"] - - "â„‚": # 0x2942 (Long rightwards harpoon over short leftwards harpoon (equilibrium)) - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "⠫⠒⠒⠕⠫â Ș⠒"] - else: [t: "⠫⠒⠒⠈⠕⠫⠈â Ș⠒⠒"] - - "â„„": # 0x2944 (Short rightwards harpoon over long leftwards harpoon (equilibrium, trend to the right)) - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "⠫⠒⠕⠫â Ș⠒⠒"] - else: [t: "⠫⠒⠈⠕⠫⠠â Ș⠒⠒"] - - "℃": # 0x2943 (Long leftwards harpoon over short rightwards harpoon (equilibrium, trend to the left)) - - test: - if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" - then: [t: "â «â Ș⠒⠒⠫⠒⠕"] - else: [t: "⠫⠈â Ș⠒⠒⠫⠒⠠⠕"] - - "🣖": [t: "⠌⠫⠒⠒⠕"] # 0x1f8d6 (long rightwards arrow with through X) - - "🣗": [t: "⠌⠫⠒⠒⠕"] # 0x1f8d7 (long rightwards arrow with double slash) chem code says it is same as 0x1f8d6 - - - - "⊃": [t: "â šâ žâ ·"] # 0x2983 (Left white curly bracket) - - "⩄": [t: "â šâ žâ Ÿ"] # 0x2984 (Right white curly bracket) - - "⩑": [t: "⠥⠈⠚⠚⠷⠻"] # 0x2991 (Left angle bracket w dot) - - "⩒": [t: "â Ąâ ˆâ šâ šâ Ÿâ »"] # 0x2992 (Right angle bracket w dot) - - "⧄": [t: "â «â Č⠞⠫⠔⠻"] # 0x29C4 (Square rising diagonal slash) - - "⧅": [t: "â «â Čâ žâ «â ąâ »"] # 0x29C5 (Square falling diagonal slash) - - "⧆": [t: "â «â Č⠞⠫⠈⠌⠻"] # 0x29C6 (Squared asterisk) - - "⧊": [t: "⠐⠫⠞⠣⠥⠻"] # 0x29CA (Triangle w dot above) - - "⧋": [t: "⠫⠞⠱"] # 0x29CB (Triangle w underbar) - - "⧌": [t: "⠫⠞⠎"] # 0x29CC (s in triangle §114) - - "â§Š": [t: "â «â łâ ¶â ¶â ł"] # 0x29E6 (Gleich stark) - - "⹌": [t: "â źâ źâ źâ ź"] # 0x2A0C (Quadruple integral operator) - - "⚍": [t: "⠟⠈⠱⠻"] # 0x2A0D (Finite part integral) - - "⚎": [t: "⠟⠈⠱⠱⠻"] # 0x2A0E (Integral w double stroke) - - "⹖": [t: "⠟⠈⠫â Čâ »"] # 0x2A16 (Quaternion integral operator) - - "⚘": [t: "⠟⠈⠈⠥⠻"] # 0x2A18 (Integral w times sign) - - "⹙": [t: "⠟⠈⠚⠩⠻"] # 0x2A19 (Integral w intersection) - - "⹚": [t: "⠟⠈⠚⠏⠻"] # 0x2A1A (Integral w union) - - "⹛": [t: "â Łâ ź"] # 0x2A1B (Integral w overbar (upper)) - - "⹜": [t: "â ©â ź"] # 0x2A1C (Integral w underbar (lower)) - - "âšą": [t: "⠐⠏⠣⠚⠥⠻"] # 0x2A22 (Plus sign w small circle above) - - "⚣": [t: "⠐⠏⠣⠞⠣⠻"] # 0x2A23 (Plus sign w circumflex accent above) - - "⚀": [t: "⠐⠏⠣⠈⠱⠻"] # 0x2A24 (Plus sign w tilde above) - - "âš„": [t: "⠐⠏⠩⠥⠻"] # 0x2A25 (Plus sign w dot below) - - "âšȘ": [t: "⠐⠱⠩⠥⠻"] # 0x2A2A (Minus sign w dot below) - - "âš°": [t: "⠐⠈⠥⠣⠥⠻"] # 0x2A30 (Multiplication sign w dot above) - - "âš±": [t: "⠈⠥⠱"] # 0x2A31 (Multiplication sign w underbar) - - "âšž": [t: "⠫⠉⠞⠫⠚⠌⠻"] # 0x2A38 (Circled division sign) - - "âšč": [t: "â «â žâ žâ «â Źâ »"] # 0x2A39 (Plus sign in triangle) - - "âšș": [t: "⠫⠞⠞⠫⠀⠻"] # 0x2A3A (Minus sign in triangle) - - "âš»": [t: "â «â žâ žâ «â ˆâ Ąâ »"] # 0x2A3B (Multiplication sign in triangle) - - "⩀": [t: "⠥⠈⠚⠩⠻"] # 0x2A40 (Intersection w dot) - - "⩁": [t: "⠀⠈⠚⠏⠻"] # 0x2A41 (Union w minus sign) - - "⩂": [t: "⠱⠚⠏"] # 0x2A42 (Union w overbar) - - "⩃": [t: "⠱⠚⠩"] # 0x2A43 (Intersection w overbar) - - "⩑": [t: "⠐⠈⠩⠣⠥⠻"] # 0x2A51 (Logical AND w dot above) - - "⩒": [t: "⠐⠈⠏⠣⠥⠻"] # 0x2A52 (Logical OR w dot above) - - "⩜": [t: "⠱⠈⠈⠩⠻"] # 0x2A5C (Logical AND with horizontal dash) - - "⩝": [t: "⠱⠈⠈⠏⠻"] # 0x2A5D (Logical OR with horizontal dash) - - "⩞": [t: "⠱⠱⠈⠩"] # 0x2A5E (Logical AND w double overbar) - - "⩟": [t: "⠈⠩⠱"] # 0x2A5F (Logical AND w underbar) - - "â© ": [t: "⠈⠩⠱⠱"] # 0x2A60 (Logical AND w double underbar) - - "⩹": [t: "⠱⠱⠈⠏"] # 0x2A62 (Logical OR w double overbar) - - "⩣": [t: "⠈⠏⠱⠱"] # 0x2A63 (Logical OR w double underbar) - - "⩊": [t: "⠐⠚⠅⠩⠥⠻"] # 0x2A66 (Equals sign w dot below) - - "â©§": [t: "⠐⠞⠇⠣⠥⠻"] # 0x2A67 (Identical w dot above) - - "â©Ș": [t: "⠐⠈⠱⠣⠥⠻"] # 0x2A6A (Tilde operator w dot above) - - "⩏": [t: "⠈⠱⠱⠈⠱"] # 0x2A6C (Similar minus similar) - - "â©­": [t: "â â ˆâ ±â šâ …â Łâ Ąâ »"] # 0x2A6D (Congruent w dot above) - - "⩟": [t: "â â šâ …â Łâ ˆâ Œâ »"] # 0x2A6E (Equals w asterisk) - - "⩯": [t: "⠐⠈⠱⠈⠱⠣⠞⠣⠻"] # 0x2A6F (Almost equal to w circumflex) - - "â©°": [t: "⠈⠱⠈⠱⠚⠅"] # 0x2A70 (Approximately equal or equal to) - - "⩱": [t: "⠹⠅⠬"] # 0x2A71 (Equals sign above plus sign) - - "â©Č": [t: "⠬⠹⠅"] # 0x2A72 (Plus sign above equals sign) - - "⩳": [t: "⠚⠅⠈⠱"] # 0x2A73 (Equals sign above tilde operator) - - "⩎": [t: "⠐⠂⠐⠂⠹⠅"] # 0x2A74 (Double colon equal) - - "â©”": [t: "⠹⠅⠹⠅"] # 0x2A75 (Two consecutive equals signs) - - "â©¶": [t: "⠹⠅⠹⠅⠹⠅"] # 0x2A76 (Three consecutive equals signs) - - "â©·": [t: "⠐⠚⠅⠩⠥⠥⠣⠥⠥⠻"] # 0x2A77 (Equals sign w two dots above and two dots below) - - "⩞": [t: "⠐⠞⠇⠣⠥⠥⠥⠥⠻"] # 0x2A78 (Equivalent w four dots above) - - "â©č": [t: "â â …â ˆâ šâ Ąâ »"] # 0x2A79 (Less than w circle inside) - - "â©ș": [t: "â šâ ‚â ˆâ šâ Ąâ »"] # 0x2A7A (Greater than w circle inside) - - "â©»": [t: "⠐⠐⠅⠣⠞⠊⠻"] # 0x2A7B (Less-than w question mark above) - - "⩌": [t: "⠐⠚⠂⠣⠞⠊⠻"] # 0x2A7C (Greater-than w question mark above) - - "âȘ…": [t: "⠐⠅⠈⠱⠈⠱"] # 0x2A85 (Less-than or approximate) - - "âȘ†": [t: "⠚⠂⠈⠱⠈⠱"] # 0x2A86 (Greater-than or approximate) - - "âȘ‹": [t: "⠐⠅⠹⠅⠹⠂"] # 0x2A8B (Less-than above double-line equal above greater-than) - - "âȘŒ": [t: "⠹⠂⠹⠅⠐⠅"] # 0x2A8C (Greater-than above double-line equal above less-than) - - "âȘ": [t: "⠐⠅⠈⠱⠱"] # 0x2A8D (Less-than above similar or equal to) - - "âȘŽ": [t: "⠚⠂⠈⠱⠱"] # 0x2A8E (Greater-than above similar or equal to) - - "âȘ": [t: "⠐⠅⠈⠱⠚⠂"] # 0x2A8F (Less-than above similar above greater-than) - - "âȘ": [t: "⠚⠂⠈⠱⠐⠅"] # 0x2A90 (Greater-than above similar above less-than) - - "âȘ‘": [t: "⠐⠅⠹⠂⠹⠅"] # 0x2A91 (Less-than above greater-than above double-line equal) - - "âȘ’": [t: "⠹⠂⠐⠅⠹⠅"] # 0x2A92 (Greater-than above less-than above double-line equal) - - "âȘ™": [t: "⠹⠅⠐⠅"] # 0x2A99 (Double-line equal to or less-than) - - "âȘš": [t: "⠹⠅⠹⠂"] # 0x2A9A (Double-line equal to or greater-than) - - "âȘ": [t: "⠈⠱⠐⠅"] # 0x2A9D (Similar or less-than) - - "âȘž": [t: "⠈⠱⠚⠂"] # 0x2A9E (Similar or greater-than) - - "âȘŸ": [t: "⠈⠱⠐⠅⠚⠅"] # 0x2A9F (Similar above less-than above equals sign) - - "âȘ ": [t: "⠈⠱⠚⠂⠚⠅"] # 0x2AA0 (Similar above greater-than above equals sign) - - "âȘź": [t: "⠈⠣⠹⠅"] # 0x2AAE (Equals sign with bumpy above) - - "âȘœ": [t: "â Ąâ ˆâ žâ â …â »"] # 0x2ABD (Subset w dot) - - "âȘŸ": [t: "â Ąâ ˆâ žâ šâ ‚â »"] # 0x2ABE (Superset w dot) - - "âȘż": [t: "⠐⠞⠐⠅⠩⠏⠻"] # 0x2ABF (Subset with plus sign below) - - "⫀": [t: "⠐⠞⠚⠂⠩⠏⠻"] # 0x2AC0 (Superset with plus sign below) - - "⫁": [t: "â â žâ â …â ©â ˆâ Ąâ »"] # 0x2AC1 (Subset with multiplication sign below) - - "⫂": [t: "â â žâ šâ ‚â ©â ˆâ Ąâ »"] # 0x2AC2 (Superset with multiplication sign below) - - "⫅": [t: "⠾⠐⠅⠹⠅"] # 0x2AC5 (Subset of above equals sign) - - "⫆": [t: "⠾⠹⠂⠹⠅"] # 0x2AC6 (Superset of above equals sign) - - "⫇": [t: "⠞⠐⠅⠈⠱"] # 0x2AC7 (Subset of above tilde operator) - - "⫈": [t: "⠞⠚⠂⠈⠱"] # 0x2AC8 (Superset of above tilde operator) - - "⫉": [t: "⠞⠐⠅⠈⠱⠈⠱"] # 0x2AC9 (Subset of above almost equal to) - - "⫊": [t: "⠞⠚⠂⠈⠱⠈⠱"] # 0x2ACA (Superset of above almost equal to) - - "⫋": [t: "⠾⠐⠅⠌⠹⠅"] # 0x2ACB (Subset of above not equals sign) - - "⫌": [t: "⠾⠹⠂⠌⠹⠅"] # 0x2ACC (Superset of above not equals sign) - - "⫓": [t: "⠾⠐⠅⠾⠹⠂"] # 0x2AD3 (Subset above superset) - - "⫔": [t: "⠾⠹⠂⠾⠐⠅"] # 0x2AD4 (Superset above subset) - - "⫕": [t: "⠾⠐⠅⠾⠐⠅"] # 0x2AD5 (Subset above subset) - - "⫖": [t: "⠾⠹⠂⠾⠹⠂"] # 0x2AD6 (Superset above superset) - - "⫗": [t: "⠾⠹⠂⠐⠾⠐⠅"] # 0x2AD7 (Superset beside subset) - - "⫯": [t: "â «â ©â šâ Ąâ ’â ’"] # 0x2AEF (Vertical line w circle above) - - "â«°": [t: "â «â Łâ šâ Ąâ ’â ’"] # 0x2AF0 (Vertical line w circle below) - - "⫱": [t: "â «â Łâ šâ Ąâ ’â ’â ł"] # 0x2AF1 (Down tack w circle below) - - "â«Č": [t: "⠱⠈⠫⠇⠻"] # 0x2AF2 (Parallel w horizontal stroke) - - "⫳": [t: "⠈⠱⠈⠫⠇⠻"] # 0x2AF3 (Parallel w tilde operator) - - "⫎": [t: "â łâ łâ ł"] # 0x2AF4 (Triple vertical bar binary relation) - - "⏏": [t: "â «â žâ ‘"] # 0x2B2C (Black ellipse) - - "⏭": [t: "⠫⠑"] # 0x2B2D (White ellipse) - - "⏰": [t: "⠚⠥⠈⠫â Ș⠒⠒⠻"] # 0x2B30 (Left arrow w small circle) - - "⏱": [t: "â «â Ș⠒⠒⠫â Ș⠒⠒⠫â Ș⠒⠒"] # 0x2B31 (Three leftwards arrows) - - "âŹČ": [t: "â «â Șâ ’â ’â ˆâ «â ‰â žâ «â Źâ »"] # 0x2B32 (Left arrow w circled plus) - - "⼖": [t: "â šâ Ą"] # 0x2B96 (Standard State Symbol) - - "⯃": [t: "â «â žâ Š"] # 0x2BC3 (Horizontal black octagon) - - # SRE lists this as a custom transcription - - "⋊": [t: "⠈⠥⠳"] # 0x22ca (RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT) +--- +# To greatly simplify typeface/language generation, the chars have unique ASCII chars for them: +# Typeface: S: sans-serif, B: bold, T: script/blackboard, I: italic, R: Roman +# Language: E: English, D: German, G: Greek, V: Greek variants, H: Hebrew, U: Russian +# Indicators: C: capital, L: letter, N: number, P: punctuation, M: multipurpose +# Others: W -- whitespace that should be kept (e.g, in a numeral) +# SRE doesn't have H: Hebrew, so not encoded (yet) +# Some of the weird letters (e.g., circled letters) I didn't translate with the above because +# they don't interact with rules since they are enclosed in other chars. + + - "⚯": [t: "⠈⠥"] # U+2A2F(VECTOR OR CROSS PRODUCT) -- make the same as 0x00D7 (Multiplication sign) + + # --- Nemeth Default Alphabet bold chars. --- + - "𝐀-𝐙": # 0x1d400 - 0x1d419 + - tc: "BE" + - spell: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "𝐚-𝐳": # 0x1d41a - 0x1d433 + - tc: "BE" + - spell: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝚹-𝛀": # 0x1d6a8 - 0x1d6c0 + - tc: "BG" + - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "𝛂-𝛒": # 0x1d6c2 - 0x1d6d2 + - tc: "BG" + - spell: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" + + - "𝛔-𝛖": # 0x1d6d4 - 0x1d6d6 + - tc: "BG" + - spell: "translate('.', '𝛔𝛕𝛖', 'στυ')" + + - "𝛘-𝛚": # 0x1d6d8 - 0x1d6da + - tc: "BG" + - spell: "translate('.', '𝛘𝛙𝛚', 'χψω')" + + - "𝛁": [tc: "BGLâ «"] # 0x1d6c1 + - "𝛓": [tc: "BVL⠎"] # 0x1d6d3 + - "𝛗": [tc: "BVL⠋"] # 0x1d6d7 + - "𝛛": [tc: "⠾⠈⠙"] # 0x1d6db + - "𝛜": [tc: "BGL⠑"] # 0x1d6dc + - "𝛝": [tc: "BVLâ č"] # 0x1d6dd + - "𝛞": [tc: "BGL⠅"] # 0x1d6de + - "𝛟": [tc: "BGL⠋"] # 0x1d6df + - "𝛠": [tc: "BGL⠗"] # 0x1d6e0 + - "𝛡": [tc: "BGL⠏"] # 0x1d6e1 + + - "𝟎-𝟗": # 0x1d7ce - 0x1d7d7 + - tc: "B" + - spell: "translate('.', '𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗', '0123456789')" + + # --- Nemeth Default Alphabet bold-fraktur chars. --- + + - "𝕬-𝖅": # 0x1d56c - 0x1d585 + - tc: "BD" + - spell: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝖆-𝖟": # 0x1d586 - 0x1d59f + - tc: "BD" + - spell: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" + + # --- Nemeth Default Alphabet bold-italic chars. --- + - "𝑹-𝒁": # 0x1d468 - 0x1d481 + - tc: "BE" + - spell: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝒂-𝒛": # 0x1d482 - 0x1d49b + - tc: "BE" + - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝜜-𝜮": # 0x1d71c - 0x1d734 + - tc: "BG" + - spell: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳𝜮', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "đœ”": [tc: "BGLâ «"] # 0x1d735 + + - "đœ¶-𝝆": # 0x1d736 - 0x1d746 + - tc: "BG" + - spell: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" + + - "𝝇": [tc: "BVL⠎"] # 0x1d747 + + - "𝝈-𝝊": # 0x1d748 - 0x1d74a + - tc: "BG" + - spell: "translate('.', '𝝈𝝉𝝊', 'στυ')" + + - "𝝋": [tc: "BVL⠋"] # 0x1d74b + + - "𝝌-𝝎": # 0x1d74c - 0x1d74e + - tc: "BG" + - spell: "translate('.', '𝝌𝝍𝝎', 'χψω')" + + - "𝝏": [tc: "BVL⠙"] # 0x1d74f + - "𝝐": [tc: "BGL⠑"] # 0x1d750 + - "𝝑": [tc: "BVLâ č"] # 0x1d751 + + - "𝝒-𝝕": # 0x1d752 - 0x1d755 + - tc: "BG" + - spell: "translate('.', '𝝒𝝓𝝔𝝕', 'Îșφρπ')" + + # --- Nemeth Default Alphabet bold-script chars. --- + + - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 + - tc: "BTE" + - spell: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "đ“Ș-𝔃": # 0x1d4ea - 0x1d503 + - tc: "BTE" + - spell: "translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz')" + + - "đš€-đš„": # 0x1d6a4 - 0x1d6a5 + - tc: "" + - spell: "translate('.', 'đš€đš„', '⠊⠚')" + +# Russian Alphabet (from Nemeth book) +# NOTE: is this translation needed? + - "А-ĐŻ": # 0x410 - 0x42f + - tc: "U" + - spell: "translate('.', 'ĐĐ‘Đ’Đ“Đ”Đ•Đ—Đ˜Đ™ĐšĐ›ĐœĐĐžĐŸĐ ĐĄĐąĐŁĐ€Đ­', 'ABVGDEZIYKLMNOPRSTUFE')" + + - "а-я": # 0x430 - 0x44f + - tc: "U" + - spell: "translate('.', 'абĐČгЎДзОĐčĐșĐ»ĐŒĐœĐŸĐżŃ€ŃŃ‚ŃƒŃ„Ń', 'abvgdeziylkmnoprstufye')" + + - "①-⑹": # 0x2460 - 0x2473 + - tc: "⠫⠉⠞⠫⠌" + - spell: "translate('.', '①⑥⑹④⑀⑄⑊⑧⑚', '123456789')" + - tc: "â »" + + - "â“Ș": [tc: "⠫⠉⠞⠫⠌⠎⠻"] # 0x24ea + + - "⑩": [tc: "⠫⠉⠞⠫⠌⠂⠎⠻"] # 0x2469 + - "â‘Ș": [tc: "⠫⠉⠞⠫⠌⠂⠂⠻"] # 0x246a + - "⑫": [tc: "⠫⠉⠞⠫⠌⠂⠆⠻"] # 0x246b + - "⑬": [tc: "⠫⠉⠞⠫⠌⠂⠒⠻"] # 0x246c + - "⑭": [tc: "⠫⠉⠞⠫⠌⠂â Čâ »"] # 0x246d + - "⑼": [tc: "â «â ‰â žâ «â Œâ ‚â ąâ »"] # 0x246e + - "⑯": [tc: "⠫⠉⠞⠫⠌⠂⠖⠻"] # 0x246f + - "⑰": [tc: "⠫⠉⠞⠫⠌⠂⠶⠻"] # 0x2470 + - "⑱": [tc: "⠫⠉⠞⠫⠌⠂⠊⠻"] # 0x2471 + - "â‘Č": [tc: "⠫⠉⠞⠫⠌⠂⠔⠻"] # 0x2472 + - "⑳": [tc: "⠫⠉⠞⠫⠌⠆⠎⠻"] # 0x2473 + + - "㉑": [tc: "⠫⠉⠞⠫⠌⠆⠂⠻"] # 0x3251 + - "㉒": [tc: "⠫⠉⠞⠫⠌⠆⠆⠻"] # 0x3252 + - "㉓": [tc: "⠫⠉⠞⠫⠌⠆⠒⠻"] # 0x3253 + - "㉔": [tc: "⠫⠉⠞⠫⠌⠆â Čâ »"] # 0x3254 + - "㉕": [tc: "â «â ‰â žâ «â Œâ †â ąâ »"] # 0x3255 + - "㉖": [tc: "⠫⠉⠞⠫⠌⠆⠖⠻"] # 0x3256 + - "㉗": [tc: "⠫⠉⠞⠫⠌⠆⠶⠻"] # 0x3257 + - "㉘": [tc: "⠫⠉⠞⠫⠌⠆⠊⠻"] # 0x3258 + - "㉙": [tc: "⠫⠉⠞⠫⠌⠆⠔⠻"] # 0x3259 + - "㉚": [tc: "⠫⠉⠞⠫⠌⠒⠎⠻"] # 0x325a + - "㉛": [tc: "⠫⠉⠞⠫⠌⠒⠂⠻"] # 0x325b + - "㉜": [tc: "⠫⠉⠞⠫⠌⠒⠆⠻"] # 0x325c + - "㉝": [tc: "⠫⠉⠞⠫⠌⠒⠒⠻"] # 0x325d + - "㉞": [tc: "⠫⠉⠞⠫⠌⠒â Čâ »"] # 0x325e + - "㉟": [tc: "â «â ‰â žâ «â Œâ ’â ąâ »"] # 0x325f + - "㊱": [tc: "⠫⠉⠞⠫⠌⠒⠖⠻"] # 0x32b1 + - "ăŠČ": [tc: "⠫⠉⠞⠫⠌⠒⠶⠻"] # 0x32b2 + - "㊳": [tc: "⠫⠉⠞⠫⠌⠒⠊⠻"] # 0x32b3 + - "㊮": [tc: "⠫⠉⠞⠫⠌⠒⠔⠻"] # 0x32b4 + - "㊔": [tc: "⠫⠉⠞⠫⠌â Čâ Žâ »"] # 0x32b5 + - "㊶": [tc: "⠫⠉⠞⠫⠌â Č⠂⠻"] # 0x32b6 + - "㊷": [tc: "⠫⠉⠞⠫⠌â Č⠆⠻"] # 0x32b7 + - "㊾": [tc: "⠫⠉⠞⠫⠌â Č⠒⠻"] # 0x32b8 + - "ăŠč": [tc: "⠫⠉⠞⠫⠌â Čâ Čâ »"] # 0x32b9 + - "ăŠș": [tc: "⠫⠉⠞⠫⠌â Čâ ąâ »"] # 0x32ba + - "㊻": [tc: "⠫⠉⠞⠫⠌â Č⠖⠻"] # 0x32bb + - "ăŠŒ": [tc: "⠫⠉⠞⠫⠌â Čâ ¶â »"] # 0x32bc + - "ăŠœ": [tc: "⠫⠉⠞⠫⠌â Čâ Šâ »"] # 0x32bd + - "ăŠŸ": [tc: "⠫⠉⠞⠫⠌â Č⠔⠻"] # 0x32be + - "㊿": [tc: "â «â ‰â žâ «â Œâ ąâ Žâ »"] # 0x32bf + +#NOTE: uncertainty here + - "Ⓐ-Ⓩ": # 0x24b6 - 0x24cf + - tc: "⠫⠉⠞⠫⠠" + - spell: "translate('.', 'â’¶â’·â’žâ’čâ’șâ’»â’Œâ’œâ’Ÿâ’żâ“€â“â“‚â“ƒâ“„â“…â“†â“‡â“ˆâ“‰â“Šâ“‹â“Œâ“â“Žâ“', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - tc: "â »" + + - "ⓐ-ⓩ": # 0x24d0 - 0x24e9 + - tc: "⠫⠉⠞⠫" + - spell: "translate('.', 'â“â“‘â“’â““â“”â“•â“–â“—â“˜â“™â“šâ“›â“œâ“â“žâ“Ÿâ“ â“Ąâ“ąâ“Łâ“€â“„â“Šâ“§â“šâ“©', 'abcdefghijklmnopqrstuvwxyz')" + - tc: "â »" + + # --- Nemeth Default Alphabet circled-sans-serif chars. --- + + - "➀-➈": # 0x1f10b, 0x2780 - 0x2788 + - tc: "⠫⠉⠞⠫⠠⠚⠌" + - spell: "translate('.', '➀➁➂➃➄➅➆➇➈', '123456789')" + - tc: "â »" + + - "🄋": [tc: "⠫⠉⠞⠫⠠⠚⠌⠎⠻"] # 0x1f10b + - "➉": [tc: "⠫⠉⠞⠫⠠⠚⠌⠂⠎⠻"] # 0x2789 + + # --- Nemeth Default Alphabet comma chars. --- + + - "🄁-🄊": # 0x1f101 - 0x1f10a + - spell: "translate('.', '🄁🄂🄃🄄🄅🄆🄇🄈🄉🄊', '0123456789')" + - tc: "â  " + + + # --- Nemeth Default Alphabet double-circled chars. --- + + - "â“”": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠂⠻⠻"] # 0x24f5 + - "⓶": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠆⠻⠻"] # 0x24f6 + - "⓷": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠒⠻⠻"] # 0x24f7 + - "⓾": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌â Č⠻⠻"] # 0x24f8 + - "â“č": [t: "â «â ‰â žâ «â «â ‰â žâ «â Œâ ąâ »â »"] # 0x24f9 + - "â“ș": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠖⠻⠻"] # 0x24fa + - "⓻": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠶⠻⠻"] # 0x24fb + - "Ⓦ": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠊⠻⠻"] # 0x24fc + - "ⓜ": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠔⠻⠻"] # 0x24fd + - "ⓟ": [t: "⠫⠉⠞⠫⠫⠉⠞⠫⠌⠂⠎⠻⠻"] # 0x24fe + + # --- Nemeth Default Alphabet double-struck chars. --- + - "𝔾-𝕐": # 0x1d538 - 0x1d550 (partial, excludes ℂ ℍ ℕ ℙ ℚ ℝ â„€) + - tc: "đ”čE" + - spell: "translate('.', '𝔾đ”čđ”»đ”Œđ”œđ”Ÿđ•€đ•đ•‚đ•ƒđ•„đ•†đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'ABDEFGIJKLMOSTUVWXY')" + + - "ℂ": [tc: "đ”čECL⠉"] # 0x2102 + - "ℍ": [tc: "đ”čECL⠓"] # 0x210d + - "ℕ": [tc: "đ”čECL⠝"] # 0x2115 + - "ℙ": [tc: "đ”čECL⠏"] # 0x2119 + - "ℚ": [tc: "đ”čECL⠟"] # 0x211a + - "ℝ": [tc: "đ”čECL⠗"] # 0x211d + - "â„€": [tc: "đ”čECLâ ”"] # 0x2124 + - "℩": [t: "CGLâ ș"] # 0x2126 (Ohm sign (capital Greek omega)) + + - "𝕒-đ•«": # 0x1d552 - 0x1d56b + - tc: "đ”čE" + - spell: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 + - tc: "đ”č" + - spell: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" + + + # --- Nemeth Default Alphabet fraktur chars. --- + + - "𝔄-𝔜": # 0x1d504 - 0x1d51c + - tc: "D" + - spell: "translate('.', '𝔄𝔅𝔇𝔈𝔉𝔊𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'ABDEFGJKLMNOPQSTUVWXY')" + + - "ℭ": [tc: "DCL⠉"] # 0x212d + - "ℌ": [tc: "DCL⠓"] # 0x210c + - "ℑ": [tc: "DCL⠊"] # 0x2111 + - "ℜ": [tc: "DCL⠗"] # 0x211c + - "ℹ": [tc: "DCLâ ”"] # 0x2128 + + - "𝔞-đ”·": # 0x1d51e - 0x1d537 + - tc: "D" + - spell: "translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz')" + + # --- Nemeth Default Alphabet fullwidth chars. --- + + - "ïŒĄ-ïŒș": # 0xff21 - 0xff3a + - tc: "" + - spell: "translate('.', 'ïŒĄïŒąïŒŁïŒ€ïŒ„ïŒŠïŒ§ïŒšïŒ©ïŒȘïŒ«ïŒŹïŒ­ïŒźïŒŻïŒ°ïŒ±ïŒČïŒłïŒŽïŒ”ïŒ¶ïŒ·ïŒžïŒčïŒș', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xff41 - 0xff5a + - tc: "" + - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xff10 - 0xff19 + - tc: "" + - spell: "translate('.', '', '0123456789')" + + # --- Nemeth Default Alphabet italic chars -- treat as non-italic. --- + + - "𝐮-𝑍": # 0x1d434 - 0x1d44d + - tc: "E" + - spell: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝑎-𝑧": # 0x1d44e - 0x1d467 + - tc: "E" + - spell: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”â„Žđ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝛱-đ›ș": # 0x1d6e2 - 0x1d6fa + - tc: "G" + - spell: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›čđ›ș', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "đ›»": [tc: "GLâ «"] # 0x1d6fb + + - "đ›Œ-𝜌": # 0x1d6fc - 0x1d70c + - tc: "G" + - spell: "translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" + - "𝜍": [tc: "VL⠎"] # 0x1d70d + + - "𝜎": [tc: "GL⠎"] # 0x1d70e + - "𝜏": [tc: "GL⠞"] # 0x1d70f + - "𝜐": [tc: "GLâ „"] # 0x1d710 + + - "𝜑": [tc: "VL⠋"] # 0x1d711 + + - "𝜒": [tc: "GLâ Ż"] # 0x1d712 + - "𝜓": [tc: "GLâ œ"] # 0x1d713 + - "𝜔": [tc: "GLâ ș"] # 0x1d714 + + - "𝜕": [tc: "VL⠙"] # 0x1d715 + + - "𝜖": [tc: "GL⠑"] # 0x1d716 + + - "𝜗": [tc: "VLâ č"] # 0x1d717 + + - "𝜘": [tc: "GL⠅"] # 0x1d718 + - "𝜙": [tc: "GL⠋"] # 0x1d719 + - "𝜚": [tc: "GL⠗"] # 0x1d71a + - "𝜛": [tc: "GL⠏"] # 0x1d71b + + # --- Nemeth Default Alphabet monospace chars. --- + + - "𝙰-𝚉": # 0x1d670 - 0x1d689 + - tc: "" + - spell: "translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝚊-𝚣": # 0x1d68a - 0x1d6a3 + - tc: "" + - spell: "translate('.', '𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚱𝚣', 'abcdefghijklmnopqrstuvwxyz')" + + - "đŸ¶-𝟿": # 0x1d7f6 - 0x1d7ff + - tc: "" + - spell: "translate('.', 'đŸ¶đŸ·đŸžđŸčđŸșđŸ»đŸŒđŸœđŸŸđŸż', '0123456789')" + + + # --- Nemeth Default Alphabet negative-circled chars. --- + - "⓿": [t: "⠫⠞⠉⠞⠫⠌⠎⠻"] # 0x24ff + - "❶": [t: "⠫⠞⠉⠞⠫⠌⠂⠻"] # 0x2776 + - "❷": [t: "⠫⠞⠉⠞⠫⠌⠆⠻"] # 0x2777 + - "❞": [t: "⠫⠞⠉⠞⠫⠌⠒⠻"] # 0x2778 + - "âč": [t: "⠫⠞⠉⠞⠫⠌â Čâ »"] # 0x2779 + - "âș": [t: "â «â žâ ‰â žâ «â Œâ ąâ »"] # 0x277a + - "❻": [t: "⠫⠞⠉⠞⠫⠌⠖⠻"] # 0x277b + - "❌": [t: "⠫⠞⠉⠞⠫⠌⠶⠻"] # 0x277c + - "❜": [t: "⠫⠞⠉⠞⠫⠌⠊⠻"] # 0x277d + - "❟": [t: "⠫⠞⠉⠞⠫⠌⠔⠻"] # 0x277e + - "❿": [t: "⠫⠞⠉⠞⠫⠌⠂⠎⠻"] # 0x277f + - "⓫": [t: "⠫⠞⠉⠞⠫⠌⠂⠂⠻"] # 0x24eb + - "⓬": [t: "⠫⠞⠉⠞⠫⠌⠂⠆⠻"] # 0x24ec + - "⓭": [t: "⠫⠞⠉⠞⠫⠌⠂⠒⠻"] # 0x24ed + - "⓼": [t: "⠫⠞⠉⠞⠫⠌⠂â Čâ »"] # 0x24ee + - "⓯": [t: "â «â žâ ‰â žâ «â Œâ ‚â ąâ »"] # 0x24ef + - "⓰": [t: "⠫⠞⠉⠞⠫⠌⠂⠖⠻"] # 0x24f0 + - "⓱": [t: "⠫⠞⠉⠞⠫⠌⠂⠶⠻"] # 0x24f1 + - "â“Č": [t: "⠫⠞⠉⠞⠫⠌⠂⠊⠻"] # 0x24f2 + - "⓳": [t: "⠫⠞⠉⠞⠫⠌⠂⠔⠻"] # 0x24f3 + - "⓮": [t: "⠫⠞⠉⠞⠫⠌⠆⠎⠻"] # 0x24f4 + + - "🅐": [t: "⠫⠞⠉⠞⠫⠠⠁⠻"] # 0x1f150 + - "🅑": [t: "⠫⠞⠉⠞⠫⠠⠃⠻"] # 0x1f151 + - "🅒": [t: "⠫⠞⠉⠞⠫⠠⠉⠻"] # 0x1f152 + - "🅓": [t: "⠫⠞⠉⠞⠫⠠⠙⠻"] # 0x1f153 + - "🅔": [t: "⠫⠞⠉⠞⠫⠠⠑⠻"] # 0x1f154 + - "🅕": [t: "⠫⠞⠉⠞⠫⠠⠋⠻"] # 0x1f155 + - "🅖": [t: "⠫⠞⠉⠞⠫⠠⠛⠻"] # 0x1f156 + - "🅗": [t: "⠫⠞⠉⠞⠫⠠⠓⠻"] # 0x1f157 + - "🅘": [t: "⠫⠞⠉⠞⠫⠠⠊⠻"] # 0x1f158 + - "🅙": [t: "⠫⠞⠉⠞⠫⠠⠚⠻"] # 0x1f159 + - "🅚": [t: "⠫⠞⠉⠞⠫⠠⠅⠻"] # 0x1f15a + - "🅛": [t: "⠫⠞⠉⠞⠫⠠⠇⠻"] # 0x1f15b + - "🅜": [t: "⠫⠞⠉⠞⠫⠠⠍⠻"] # 0x1f15c + - "🅝": [t: "⠫⠞⠉⠞⠫⠠⠝⠻"] # 0x1f15d + - "🅞": [t: "⠫⠞⠉⠞⠫⠠⠕⠻"] # 0x1f15e + - "🅟": [t: "⠫⠞⠉⠞⠫⠠⠏⠻"] # 0x1f15f + - "🅠": [t: "⠫⠞⠉⠞⠫⠠⠟⠻"] # 0x1f160 + - "🅡": [t: "⠫⠞⠉⠞⠫⠠⠗⠻"] # 0x1f161 + - "🅱": [t: "⠫⠞⠉⠞⠫⠠⠎⠻"] # 0x1f162 + - "🅣": [t: "⠫⠞⠉⠞⠫⠠⠞⠻"] # 0x1f163 + - "đŸ…€": [t: "⠫⠞⠉⠞⠫⠠⠄⠻"] # 0x1f164 + - "đŸ…„": [t: "⠫⠞⠉⠞⠫⠠⠧⠻"] # 0x1f165 + - "🅩": [t: "⠫⠞⠉⠞⠫⠠â șâ »"] # 0x1f166 + - "🅧": [t: "⠫⠞⠉⠞⠫⠠⠭⠻"] # 0x1f167 + - "🅹": [t: "⠫⠞⠉⠞⠫⠠⠜⠻"] # 0x1f168 + - "đŸ…©": [t: "⠫⠞⠉⠞⠫⠠⠔⠻"] # 0x1f169 + + # --- Nemeth Default Alphabet negative-circled-sans-serif chars. --- + - "🄌": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠎⠻"] # 0x1f10c + - "➊": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠂⠻"] # 0x278a + - "➋": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠆⠻"] # 0x278b + - "➌": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠒⠻"] # 0x278c + - "➍": [t: "⠫⠞⠉⠞⠫⠠⠚⠌â Čâ »"] # 0x278d + - "➎": [t: "â «â žâ ‰â žâ «â  â šâ Œâ ąâ »"] # 0x278e + - "➏": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠖⠻"] # 0x278f + - "➐": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠶⠻"] # 0x2790 + - "➑": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠊⠻"] # 0x2791 + - "➒": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠔⠻"] # 0x2792 + - "➓": [t: "⠫⠞⠉⠞⠫⠠⠚⠌⠂⠎⠻"] # 0x2793 + + # --- Nemeth Default Alphabet negative-squared chars. --- + - "🅰-🆉": # 0x1f170 - 0x1f189 + - tc: "â «â žâ Čâ žâ «â  " + - spell: "translate('.', 'đŸ…°đŸ…±đŸ…ČđŸ…łđŸ…ŽđŸ…”đŸ…¶đŸ…·đŸ…žđŸ…čđŸ…șđŸ…»đŸ…ŒđŸ…œđŸ…ŸđŸ…żđŸ†€đŸ†đŸ†‚đŸ†ƒđŸ†„đŸ†…đŸ††đŸ†‡đŸ†ˆđŸ†‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - tc: "â »" + + # --- Nemeth Default Alphabet parenthesized chars. --- + + - "⑮-⑌": # 0x2474 - 0x247c + - tc: "â ·" + - spell: "translate('.', '⑎⑔⑶⑷⑞â‘čâ‘ș⑻⑌', '123456789')" + - tc: "â Ÿ" + + - "⑜": [t: "â ·â ‚â Žâ Ÿ"] # 0x247d + - "⑟": [t: "â ·â ‚â ‚â Ÿ"] # 0x247e + - "⑿": [t: "⠷⠂⠆⠟"] # 0x247f + - "⒀": [t: "â ·â ‚â ’â Ÿ"] # 0x2480 + - "⒁": [t: "⠷⠂â Čâ Ÿ"] # 0x2481 + - "⒂": [t: "â ·â ‚â ąâ Ÿ"] # 0x2482 + - "⒃": [t: "â ·â ‚â –â Ÿ"] # 0x2483 + - "⒄": [t: "â ·â ‚â ¶â Ÿ"] # 0x2484 + - "⒅": [t: "â ·â ‚â Šâ Ÿ"] # 0x2485 + - "⒆": [t: "⠷⠂⠔⠟"] # 0x2486 + - "⒇": [t: "⠷⠆⠎⠟"] # 0x2487 + + - "🄐-đŸ„©": # 0x1f110 - 0x1f129 + - tc: "â ·â  " + - spell: "translate('.', 'đŸ„đŸ„‘đŸ„’đŸ„“đŸ„”đŸ„•đŸ„–đŸ„—đŸ„˜đŸ„™đŸ„šđŸ„›đŸ„œđŸ„đŸ„žđŸ„ŸđŸ„ đŸ„ĄđŸ„ąđŸ„ŁđŸ„€đŸ„„đŸ„ŠđŸ„§đŸ„šđŸ„©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - tc: "â Ÿ" + + - "⒜-â’”": # 0x249c - 0x24b5 + - tc: "â ·" + - spell: "translate('.', 'â’œâ’â’žâ’Ÿâ’ â’Ąâ’ąâ’Łâ’€â’„â’Šâ’§â’šâ’©â’Șâ’«â’Źâ’­â’źâ’Żâ’°â’±â’Čâ’łâ’Žâ’”', 'abcdefghijklmnopqrstuvwxyz')" + - tc: "â Ÿ" + + # --- Nemeth Default Alphabet period chars. --- + - "🄀": [t: "â Žâ žâ Č"] # 0x1f100 + - "⒈": [t: "⠂⠾â Č"] # 0x2488 + - "⒉": [t: "⠆⠾â Č"] # 0x2489 + - "⒊": [t: "⠒⠾â Č"] # 0x248a + - "⒋": [t: "â Čâ žâ Č"] # 0x248b + - "⒌": [t: "â ąâ žâ Č"] # 0x248c + - "⒍": [t: "⠖⠾â Č"] # 0x248d + - "⒎": [t: "â ¶â žâ Č"] # 0x248e + - "⒏": [t: "â Šâ žâ Č"] # 0x248f + - "⒐": [t: "⠔⠾â Č"] # 0x2490 + + - "⒑": [t: "⠂⠮⠾â Č"] # 0x2491 + - "⒒": [t: "⠂⠂⠾â Č"] # 0x2492 + - "⒓": [t: "⠂⠆⠾â Č"] # 0x2493 + - "⒔": [t: "⠂⠒⠾â Č"] # 0x2494 + - "⒕": [t: "⠂â Čâ žâ Č"] # 0x2495 + - "⒖": [t: "⠂⠱⠾â Č"] # 0x2496 + - "⒗": [t: "⠂⠖⠾â Č"] # 0x2497 + - "⒘": [t: "â ‚â ¶â žâ Č"] # 0x2498 + - "⒙": [t: "⠂⠩⠾â Č"] # 0x2499 + - "⒚": [t: "⠂⠔⠾â Č"] # 0x249a + - "⒛": [t: "⠆⠮⠾â Č"] # 0x249b + + # --- Nemeth Default Alphabet sans-serif chars. --- + - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 + - tc: "SE" + - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 + - tc: "SE" + - spell: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝟱-đŸ«": # 0x1d7e2 - 0x1d7eb + - tc: "S" + - spell: "translate('.', 'đŸąđŸŁđŸ€đŸ„đŸŠđŸ§đŸšđŸ©đŸȘđŸ«', '0123456789')" + + # --- Nemeth Default Alphabet sans-serif-bold chars. --- + - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed + - tc: "SBE" + - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝗼-𝘇": # 0x1d5ee - 0x1d607 + - tc: "SBE" + - spell: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝝖-𝝼": # 0x1d756 - 0x1d76e + - tc: "SBG" + - spell: "translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đź', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "𝝰-𝞀": # 0x1d770 - 0x1d780 + - tc: "SBG" + - spell: "translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" + + - "𝝯": [tc: "SBGLâ «"] # 0x1d76f + + - "𝞁": [tc: "SBVL⠎"] # 0x1d781 + + - "𝞂-𝞄": # 0x1d782 - 0x1d784 + - tc: "SBG" + - spell: "translate('.', '𝞂𝞃𝞄', 'στυ')" + + - "𝞅": [tc: "SBVL⠋"] # 0x1d785 + + - "𝞆-𝞈": # 0x1d786 - 0x1d788 + - tc: "SBG" + - spell: "translate('.', '𝞆𝞇𝞈', 'χψω')" + + - "𝞉": [tc: "⠠⠹⠾⠈⠙"] # 0x1d789 + - "𝞊": [tc: "SBGL⠑"] # 0x1d78a + - "𝞋": [tc: "SBVLâ č"] # 0x1d78b + + - "𝞌-𝞏": # 0x1d78c - 0x1d78f + - tc: "SBG" + - spell: "translate('.', '𝞌𝞍𝞎𝞏', 'Îșφρπ')" + + - "𝟬-đŸ”": # 0x1d7ec - 0x1d7f5 + - tc: "SB" + - spell: "translate('.', 'đŸŹđŸ­đŸźđŸŻđŸ°đŸ±đŸČđŸłđŸŽđŸ”', '0123456789')" + + # --- Nemeth Default Alphabet sans-serif-bold-italic chars. --- + + - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 + - tc: "SBE" + - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝙖-𝙯": # 0x1d656 - 0x1d66f + - tc: "SBE" + - spell: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝞐-𝞹": # 0x1d790 - 0x1d7a8 + - tc: "SBG" + - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "đž©": [t: "SBGLâ «"] # 0x1d7a9 + + - "đžȘ-đžș": # 0x1d7aa - 0x1d7ba + - tc: "SBG" + - spell: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžș', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€Ï')" + + - "đž»": [t: "SBVL⠎"] # 0x1d7bb + - "đžŒ": [t: "SBGL⠎"] # 0x1d7bc + - "đžœ": [t: "SBGL⠞"] # 0x1d7bd + - "đžŸ": [t: "SBGLâ „"] # 0x1d7be + - "𝞿": [t: "SBVL⠋"] # 0x1d7bf + + - "𝟀": [t: "SBGLâ Ż"] # 0x1d7c0 + - "𝟁": [t: "SBGLâ œ"] # 0x1d7c1 + - "𝟂": [t: "SBGLâ ș"] # 0x1d7c2 + - "𝟃": [t: "SBVL⠙"] # 0x1d7c3 + + - "𝟄": [t: "SBGL⠑"] # 0x1d7c4 + - "𝟅": [t: "SBVLâ č"] # 0x1d7c5 + + - "𝟆": [t: "SBGL⠅"] # 0x1d7c6 + - "𝟇": [t: "SBGL⠋"] # 0x1d7c7 + - "𝟈": [t: "SBGL⠗"] # 0x1d7c8 + - "𝟉": [t: "SBGL⠏"] # 0x1d7c9 + + # --- Nemeth Default Alphabet sans-serif-italic chars. --- + - "𝘈-𝘡": # 0x1d608 - 0x1d621 + - tc: "SE" + - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝘱-đ˜»": # 0x1d622 - 0x1d63b + - tc: "SE" + - spell: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" + + # --- Nemeth Default Alphabet script chars. --- + - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 + - tc: "TE" + - spell: "translate('.', 'đ’œđ’žđ’Ÿđ’ąđ’„đ’Šđ’©đ’Șđ’«đ’Źđ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'ACDGJKNOPQSTUVWXYZ')" + + - "ℬ": [t: "TECL⠃"] # 0x212c + - "ℰ": [t: "TECL⠑"] # 0x2130 + - "ℱ": [t: "TECL⠋"] # 0x2131 + - "ℋ": [t: "TECL⠓"] # 0x210b + - "ℐ": [t: "TECL⠊"] # 0x2110 + - "ℒ": [t: "TECL⠇"] # 0x2112 + - "ℳ": [t: "TECL⠍"] # 0x2133 + - "ℛ": [t: "TECL⠗"] # 0x211b + + - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf + - tc: "TE" + - spell: "translate('.', 'đ’¶đ’·đ’žđ’čđ’»đ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdfhijklmnpqrstuvwxyz')" + + - "ℯ": [t: "TEL⠑"] # 0x212f + - "ℊ": [t: "TEL⠛"] # 0x210a + - "℮": [t: "TEL⠕"] # 0x2134 + + # --- Nemeth Default Alphabet squared chars. --- + + - "🄰": [t: "â «â Č⠞⠫⠠⠁⠻"] # 0x1f130 + - "đŸ„±": [t: "â «â Č⠞⠫⠠⠃⠻"] # 0x1f131 + - "đŸ„Č": [t: "â «â Č⠞⠫⠠⠉⠻"] # 0x1f132 + - "🄳": [t: "â «â Č⠞⠫⠠⠙⠻"] # 0x1f133 + - "🄮": [t: "â «â Čâ žâ «â  â ‘â »"] # 0x1f134 + - "đŸ„”": [t: "â «â Čâ žâ «â  â ‹â »"] # 0x1f135 + - "đŸ„¶": [t: "â «â Č⠞⠫⠠⠛⠻"] # 0x1f136 + - "đŸ„·": [t: "â «â Čâ žâ «â  â “â »"] # 0x1f137 + - "🄾": [t: "â «â Čâ žâ «â  â Šâ »"] # 0x1f138 + - "đŸ„č": [t: "â «â Čâ žâ «â  â šâ »"] # 0x1f139 + - "đŸ„ș": [t: "â «â Čâ žâ «â  â …â »"] # 0x1f13a + - "đŸ„»": [t: "â «â Č⠞⠫⠠⠇⠻"] # 0x1f13b + - "đŸ„Œ": [t: "â «â Č⠞⠫⠠⠍⠻"] # 0x1f13c + - "đŸ„œ": [t: "â «â Č⠞⠫⠠⠝⠻"] # 0x1f13d + - "đŸ„Ÿ": [t: "â «â Čâ žâ «â  â •â »"] # 0x1f13e + - "🄿": [t: "â «â Č⠞⠫⠠⠏⠻"] # 0x1f13f + - "🅀": [t: "â «â Čâ žâ «â  â Ÿâ »"] # 0x1f140 + - "🅁": [t: "â «â Čâ žâ «â  â —â »"] # 0x1f141 + - "🅂": [t: "â «â Čâ žâ «â  â Žâ »"] # 0x1f142 + - "🅃": [t: "â «â Čâ žâ «â  â žâ »"] # 0x1f143 + - "🅄": [t: "â «â Čâ žâ «â  â „â »"] # 0x1f144 + - "🅅": [t: "â «â Čâ žâ «â  â §â »"] # 0x1f145 + - "🅆": [t: "â «â Čâ žâ «â  â șâ »"] # 0x1f146 + - "🅇": [t: "â «â Čâ žâ «â  â ­â »"] # 0x1f147 + - "🅈": [t: "â «â Č⠞⠫⠠⠜⠻"] # 0x1f148 + - "🅉": [t: "â «â Č⠞⠫⠠⠔⠻"] # 0x1f149 + + # --- Nemeth Default Alphabet sub chars. --- + + - "₀": [t: "â °â Ž"] # 0x2080 + - "₁": [t: "⠰⠂"] # 0x2081 + - "₂": [t: "⠰⠆"] # 0x2082 + - "₃": [t: "⠰⠒"] # 0x2083 + - "₄": [t: "â °â Č"] # 0x2084 + - "₅": [t: "â °â ą"] # 0x2085 + - "₆": [t: "⠰⠖"] # 0x2086 + - "₇": [t: "â °â ¶"] # 0x2087 + - "₈": [t: "â °â Š"] # 0x2088 + - "₉": [t: "⠰⠔"] # 0x2089 + + # --- Nemeth Default Alphabet super chars. --- + + - "⁰": [t: "⠘⠎"] # 0x2070 + - "Âč": [t: "⠘⠂"] # 0xb9 + - "ÂČ": [t: "⠘⠆"] # 0xb2 + - "Âł": [t: "⠘⠒"] # 0xb3 + - "⁎": [t: "⠘â Č"] # 0x2074 + - "⁔": [t: "⠘⠹"] # 0x2075 + - "⁶": [t: "⠘⠖"] # 0x2076 + - "⁷": [t: "⠘⠶"] # 0x2077 + - "⁞": [t: "⠘⠊"] # 0x2078 + - "âč": [t: "⠘⠔"] # 0x2079 + + # --- Nemeth Default Characters latin-lower-phonetic chars. --- + + - "Ăž": [t: "⠈⠕"] # 0xf8 + + # --- Nemeth Default Characters math_geometry chars. --- + + - "─": [t: "â ±"] # 0x2500 + - "│": [t: "â ł"] # 0x2502 + - "▰": [t: "â «â žâ ›"] # 0x25b0 + - "▱": [t: "⠫⠛"] # 0x25b1 + - "â–œ": [t: "â šâ «"] # 0x25bd + - "◆": [t: "â «â žâ ™"] # 0x25c6 + - "◇": [t: "⠫⠙"] # 0x25c7 + - "◈": [t: "â «â žâ ™"] # 0x25c8 + - "◉": [t: "â «â žâ ‰"] # 0x25c9 + - "◊": [t: "⠫⠙"] # 0x25ca + - "⬟": [t: "â «â žâ ą"] # 0x2b1f + - "⏠": [t: "â «â ą"] # 0x2b20 + - "⏥": [t: "⠫⠖"] # 0x2b21 + - "⏹": [t: "â «â žâ –"] # 0x2b22 + - "⏣": [t: "â «â žâ –"] # 0x2b23 + - "⏀": [t: "â «â žâ ‰"] # 0x2b24 + - "⏄": [t: "â «â žâ ™"] # 0x2b25 + + # --- Nemeth Default Characters math_symbols chars. --- + + - "\"": [t: "⠄⠄"] # 0x22 + - "ÂĄ": [t: "⠖"] # 0xa1 + - "Âą": [t: "⠈⠉"] # 0xa2 + - "ÂŁ": [t: "⠈⠇"] # 0xa3 + - "€": [t: "⠈⠫"] # 0xa4 + - "„": [t: "⠈⠜"] # 0xa5 + - "§": [t: "⠈⠠⠎"] # 0xa7 + - "©": [t: "⠘⠉"] # 0xa9 (Copyright) + - "ÂȘ": [t: "⠞⠰⠁"] # 0xaa + - "«": [t: "⠐⠅⠈⠐⠅⠻"] # 0xab + - "Âź": [t: "⠘⠗"] # 0xae + - "ÂŽ": [t: "⠈"] # 0xb4 + - "”": [t: "⠚⠍"] # 0xb5 + - "¶": [t: "⠈⠠⠏"] # 0xb6 + - "Âż": [t: "â Š"] # 0xbf + - "Êč": [t: "⠄"] # 0x2b9 + - "Êș": [t: "⠄⠄"] # 0x2ba + - "˙": [t: "â Ą"] # 0x2d9 + - "˜": [t: "⠈⠱"] # 0x2dc + - "‐": [t: "â €"] # 0x2010 + - "‑": [t: "â €"] # 0x2011 + - "‒": [t: "⠀⠀"] # 0x2012 + - "–": [t: "⠀⠀"] # 0x2013 + - "‖": [t: "â łâ ł"] # 0x2016 + - "†": [t: "â žâ »"] # 0x2020 + - "‡": [t: "â žâ žâ »"] # 0x2021 + - "‱": [t: "â Ą"] # 0x2022 + - " ": [t: "⠄"] # 0x2024 + - " ": [t: "⠄⠄"] # 0x2025 + - "â€Č": [t: "⠄"] # 0x2032 + - "″": [t: "⠄⠄"] # 0x2033 + - "‮": [t: "⠄⠄."] # 0x2034 (Triple prime) + - "⁗": [t: "⠄⠄.."] # 0x2057 (Quadruple prime) + - "‌": [t: "⠖⠖"] # 0x203c + - "‟": [t: "â ±"] # 0x203e + - "⁇": [t: "â čâ č"] # 0x2047 + - "⁈": [t: "â č⠖"] # 0x2048 + - "⁉": [t: "⠖â č"] # 0x2049 + - "∀": [t: "⠈⠯"] # 0x2200 + - "∃": [t: "⠈⠿"] # 0x2203 + - "∄": [t: "⠌⠈⠿"] # 0x2204 + - "∅": [t: "â žâ Ž"] # 0x2205 + - "∈": [t: "⠈⠑"] # 0x2208 + - "∉": [t: "⠌⠈⠑"] # 0x2209 + - "∊": [t: "⠈⠑"] # 0x220a + - "∋": [t: "⠈⠹"] # 0x220b + - "∌": [t: "⠌⠈⠱"] # 0x220c + - "∍": [t: "⠈⠹"] # 0x220d + - "∎": [t: "â žâ ł"] # 0x220e + - "−": [t: "â €"] # 0x2212 + - "∓": [t: "⠀⠏"] # 0x2213 + - "∕": [t: "⠾⠌"] # 0x2215 + - "∖": [t: "â žâ Ą"] # 0x2216 + - "∗": [t: "⠈⠌"] # 0x2217 + - "∘": [t: "â šâ Ą"] # 0x2218 + - "∝": [t: "â žâ ż"] # 0x221d + - "∞": [t: "â  â ż"] # 0x221e + - "∟": [t: "â «â Șâ šâ —â »"] # 0x221f + - "∠": [t: "â «â Ș"] # 0x2220 + - "∹": [t: "â «â Ș⠞⠫⠫⠁⠻"] # 0x2222 + - "∣": [t: "â ł"] # 0x2223 + - "∀": [t: "⠌⠳"] # 0x2224 + - "∄": [t: "⠫⠇"] # 0x2225 + - "∊": [t: "⠌⠫⠇"] # 0x2226 + - "∧": [t: "⠈⠩"] # 0x2227 + - "√": [t: "⠈⠏"] # 0x2228 + - "∩": [t: "â šâ ©"] # 0x2229 + - "âˆȘ": [t: "â šâ Ź"] # 0x222a + - "∫": [t: "â ź"] # 0x222b + - "∏": [t: "â źâ ź"] # 0x222c + - "∭": [t: "â źâ źâ ź"] # 0x222d + - "∟": [t: "â źâ ˆâ «â ‰â »"] # 0x222e + - "âˆČ": [t: "⠟⠈⠫â Ș⠹⠔⠻"] # 0x2232 + - "∳": [t: "â źâ ˆâ «â ąâ ”â •â »"] # 0x2233 + - "∎": [t: "â  â Ą"] # 0x2234 + - "∔": [t: "⠈⠌"] # 0x2235 + - "∶": [t: "⠐⠂"] # 0x2236 + - "∷": [t: "⠰⠆"] # 0x2237 + - "∞": [t: "â šâ €"] # 0x2238 + - "∌": [t: "⠈⠱"] # 0x223c + - "≁": [t: "⠌⠈⠱"] # 0x2241 + - "≂": [t: "⠱⠈⠱"] # 0x2242 + - "≃": [t: "⠈⠱⠱"] # 0x2243 + - "≄": [t: "⠌⠈⠱⠱"] # 0x2244 + - "≅": [t: "⠈⠱⠚⠅"] # 0x2245 + - "≆": [t: "⠈⠱⠌⠚⠅"] # 0x2246 + - "≇": [t: "⠌⠈⠱⠚⠅"] # 0x2247 + - "≈": [t: "⠈⠱⠈⠱"] # 0x2248 + - "≉": [t: "⠌⠈⠱⠈⠱"] # 0x2249 + - "≊": [t: "⠈⠱⠈⠱⠱"] # 0x224a + - "≍": [t: "⠈⠣⠠⠣"] # 0x224d + - "≎": [t: "⠈⠣⠠⠣"] # 0x224e + - "≐": [t: "⠐⠚⠅⠣⠥⠻"] # 0x2250 + - "≑": [t: "⠐⠚⠅⠩⠥⠣⠥⠻"] # 0x2251 + - "≗": [t: "⠐⠚⠅⠣⠚⠥⠻"] # 0x2257 + - "≘": [t: "⠐⠚⠅⠣⠫⠁⠻"] # 0x2258 + - "≙": [t: "⠐⠚⠅⠣⠞⠣⠻"] # 0x2259 + - "≚": [t: "⠐⠚⠅⠣⠞⠩⠻"] # 0x225a + - "≛": [t: "⠐⠚⠅⠣⠫⠞⠎⠻"] # 0x225b + - "≜": [t: "⠐⠚⠅⠣⠫⠞⠻"] # 0x225c + - "≝": [t: "⠐⠚⠅⠣⠙⠑⠋⠻"] # 0x225d + - "≞": [t: "â â šâ …â Łâ â »"] # 0x225e + - "≟": [t: "⠐⠚⠅⠣⠞⠊⠻"] # 0x225f + - "≠": [t: "⠌⠹⠅"] # 0x2260 + - "≱": [t: "⠌⠾⠇"] # 0x2262 + - "≀": [t: "⠐⠅⠱"] # 0x2264 + - "≄": [t: "â šâ ‚â ±"] # 0x2265 + - "≩": [t: "⠐⠅⠹⠅"] # 0x2266 + - "≧": [t: "⠹⠂⠹⠅"] # 0x2267 + - "≹": [t: "⠐⠅⠌⠹⠅"] # 0x2268 + - "≩": [t: "⠹⠂⠌⠹⠅"] # 0x2269 + - "â‰Ș": [t: "⠐⠅⠈⠐⠅⠻"] # 0x226a + - "≫": [t: "⠚⠂⠈⠚⠂⠻"] # 0x226b + - "≭": [t: "⠌⠈⠣⠠⠣"] # 0x226d + - "≼": [t: "⠌⠐⠅"] # 0x226e + - "≯": [t: "⠌⠹⠂"] # 0x226f + - "≰": [t: "⠌⠐⠅⠱"] # 0x2270 + - "≱": [t: "⠌⠚⠂⠱"] # 0x2271 + - "â‰Č": [t: "⠐⠅⠈⠱"] # 0x2272 + - "≳": [t: "⠚⠂⠈⠱"] # 0x2273 + - "≮": [t: "⠌⠐⠅⠈⠱"] # 0x2274 + - "≔": [t: "⠌⠚⠂⠈⠱"] # 0x2275 + - "≶": [t: "⠐⠅⠹⠂"] # 0x2276 + - "≷": [t: "⠹⠂⠐⠅"] # 0x2277 + - "≾": [t: "⠌⠐⠅⠹⠂"] # 0x2278 + - "â‰č": [t: "⠌⠹⠂⠐⠅"] # 0x2279 + - "â‰ș": [t: "⠹⠐⠅"] # 0x227a + - "≻": [t: "⠹⠹⠂"] # 0x227b + - "≌": [t: "⠚⠐⠅⠱"] # 0x227c + - "≜": [t: "⠚⠚⠐⠱"] # 0x227d + - "≟": [t: "⠚⠐⠅⠈⠱"] # 0x227e + - "≿": [t: "⠚⠚⠂⠈⠱"] # 0x227f + - "⊀": [t: "⠌⠹⠐⠅"] # 0x2280 + - "⊁": [t: "⠌⠹⠐⠅"] # 0x2281 + - "⊂": [t: "⠾⠐⠅"] # 0x2282 + - "⊃": [t: "⠾⠹⠂"] # 0x2283 + - "⊄": [t: "⠌⠾⠐⠅"] # 0x2284 + - "⊅": [t: "⠌⠾⠹⠂"] # 0x2285 + - "⊆": [t: "⠞⠐⠅⠱"] # 0x2286 + - "⊇": [t: "â žâ šâ ‚â ±"] # 0x2287 + - "⊈": [t: "⠌⠞⠐⠅⠱"] # 0x2288 + - "⊉": [t: "⠌⠞⠚⠂⠱"] # 0x2289 + - "⊊": [t: "⠾⠐⠅⠌⠹⠅"] # 0x228a + - "⊋": [t: "⠾⠹⠂⠌⠹⠅"] # 0x228b + - "⊄": [t: "⠫⠏"] # 0x22a5 + - "⋀": [t: "⠈⠩"] # 0x22c0 + - "⋁": [t: "⠈⠏"] # 0x22c1 + - "⋂": [t: "â šâ ©"] # 0x22c2 + - "⋃": [t: "â šâ Ź"] # 0x22c3 + - "⋄": [t: "⠫⠙"] # 0x22c4 + - "⋜": [t: "⠱⠐⠅"] # 0x22dc + - "⋝": [t: "⠱⠚⠂"] # 0x22dd + - "⟂": [t: "⠫⠏"] # 0x27c2 + - "⩀": [t: "â łâ łâ ł"] # 0x2980 + - "⊶": [t: "⠫⠉⠞⠫⠳⠻"] # 0x29b6 + - "⊷": [t: "⠫⠉⠞⠫⠫⠇⠻"] # 0x29b7 + - "⊞": [t: "⠫⠉⠞⠫⠞⠥⠻"] # 0x29b8 + - "âŠč": [t: "⠫⠉⠞⠫⠫⠏⠻"] # 0x29b9 + - "⊿": [t: "⠫⠉⠞⠫⠔⠔⠻"] # 0x29bf + - "⧀": [t: "⠫⠉⠞⠫⠐⠅⠻"] # 0x29c0 + - "⧁": [t: "⠫⠉⠞⠫⠚⠂⠻"] # 0x29c1 + - "⹀": [t: "⠫⠉⠞⠫⠥⠻"] # 0x2a00 + - "⚁": [t: "⠫⠉⠞⠫⠏⠻"] # 0x2a01 + - "⹂": [t: "â «â ‰â žâ «â ˆâ Ąâ »"] # 0x2a02 + - "âȘŻ": [t: "⠚⠐⠅⠱"] # 0x2aaf + - "âȘ°": [t: "â šâ šâ ‚â ±"] # 0x2ab0 + - "âȘ±": [t: "⠚⠐⠅⠌⠱"] # 0x2ab1 + - "âȘČ": [t: "⠚⠚⠂⠌⠱"] # 0x2ab2 + - "âȘł": [t: "⠹⠐⠅⠹⠅"] # 0x2ab3 + - "âȘŽ": [t: "⠹⠹⠂⠹⠅"] # 0x2ab4 + - "âȘ”": [t: "⠹⠐⠅⠌⠹⠅"] # 0x2ab5 + - "âȘ¶": [t: "⠹⠹⠂⠌⠹⠅"] # 0x2ab6 + - "âȘ·": [t: "⠚⠐⠅⠈⠱⠈⠱"] # 0x2ab7 + - "âȘž": [t: "⠚⠚⠂⠈⠱⠈⠱"] # 0x2ab8 + - "âȘč": [t: "⠚⠐⠅⠌⠈⠱⠈⠱"] # 0x2ab9 + - "âȘș": [t: "⠚⠚⠂⠌⠈⠱⠈⠱"] # 0x2aba + - "âȘ»": [t: "⠚⠐⠅⠈⠚⠐⠅⠻"] # 0x2abb + - "âȘŒ": [t: "⠚⠚⠂⠈⠚⠚⠂⠻"] # 0x2abc + - "ïč©": [t: "⠈⠎"] # 0xfe69 + - "": [t: "⠈⠎"] # 0xff04 + - "ïŒż": [t: "â ±"] # 0xff3f + - "": [t: "⠈⠱"] # 0xff5e + - "ïż ": [t: "⠈⠉"] # 0xffe0 + - "ïżĄ": [t: "⠈⠇"] # 0xffe1 + - "ïżŁ": [t: "â ±"] # 0xffe3 + - "ïż„": [t: "⠈⠜"] # 0xffe5 + + # --- Nemeth Default Characters rest chars. --- + + - "â„”": [t: "⠠⠠⠁"] # 0x2135 + - "ℶ": [t: "⠠⠠⠃"] # 0x2136 + - "ℷ": [t: "⠠⠠⠉"] # 0x2137 + - "ℾ": [t: "⠠⠠⠙"] # 0x2138 + - "Ă ": [t: "⠈⠁"] # 0xe0 + - "ĂĄ": [t: "⠈⠁"] # 0xe1 + - "Ăą": [t: "⠈⠁"] # 0xe2 + - "ĂŁ": [t: "⠈⠁"] # 0xe3 + - "Ă€": [t: "⠈⠁"] # 0xe4 + - "Ă„": [t: "⠈⠁"] # 0xe5 + - "ç": [t: "⠈⠉"] # 0xe7 + - "Ăš": [t: "⠈⠑"] # 0xe8 + - "Ă©": [t: "⠈⠑"] # 0xe9 + - "ĂȘ": [t: "⠈⠑"] # 0xea + - "Ă«": [t: "⠈⠑"] # 0xeb + - "ĂŹ": [t: "⠈⠊"] # 0xec + - "Ă­": [t: "⠈⠊"] # 0xed + - "Ăź": [t: "⠈⠊"] # 0xee + - "ĂŻ": [t: "⠈⠊"] # 0xef + - "ñ": [t: "⠈⠝"] # 0xf1 + - "ĂČ": [t: "⠈⠕"] # 0xf2 + - "Ăł": [t: "⠈⠕"] # 0xf3 + - "ĂŽ": [t: "⠈⠕"] # 0xf4 + - "Ă”": [t: "⠈⠕"] # 0xf5 + - "ö": [t: "⠈⠕"] # 0xf6 + - "Ăč": [t: "⠈⠄"] # 0xf9 + - "Ăș": [t: "⠈⠄"] # 0xfa + - "Ă»": [t: "⠈⠄"] # 0xfb + - "ĂŒ": [t: "⠈⠄"] # 0xfc + - "Ăœ": [t: "⠈⠜"] # 0xfd + - "Ăż": [t: "⠈⠜"] # 0xff + + - "À": [t: "⠠⠈⠁"] # 0xc0 + - "Á": [t: "⠠⠈⠁"] # 0xc1 + - "Â": [t: "⠠⠈⠁"] # 0xc2 + - "Ã": [t: "⠠⠈⠁"] # 0xc3 + - "Ä": [t: "⠠⠈⠁"] # 0xc4 + - "Å": [t: "⠠⠈⠁"] # 0xc5 + - "Ç": [t: "⠠⠈⠉"] # 0xc7 + - "È": [t: "⠠⠈⠑"] # 0xc8 + - "É": [t: "⠠⠈⠑"] # 0xc9 + - "Ê": [t: "⠠⠈⠑"] # 0xca + - "Ë": [t: "⠠⠈⠑"] # 0xcb + - "Ì": [t: "⠠⠈⠊"] # 0xcc + - "Í": [t: "⠠⠈⠊"] # 0xcd + - "Î": [t: "⠠⠈⠊"] # 0xce + - "Ï": [t: "⠠⠈⠊"] # 0xcf + - "Ñ": [t: "⠠⠈⠝"] # 0xd1 + - "Ò": [t: "⠠⠈⠕"] # 0xd2 + - "Ó": [t: "⠠⠈⠕"] # 0xd3 + - "Ô": [t: "⠠⠈⠕"] # 0xd4 + - "Ö": [t: "⠠⠈⠕"] # 0xd6 + - "Ù": [t: "⠠⠈⠄"] # 0xd9 + - "Ú": [t: "⠠⠈⠄"] # 0xda + - "Û": [t: "⠠⠈⠄"] # 0xdb + - "Ü": [t: "⠠⠈⠄"] # 0xdc + - "Ý": [t: "⠠⠈⠜"] # 0xdd + - "←": [t: "â «â Ș⠒⠒"] # 0x2190 + + - "↑": # 0x2191 + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "â «â Ł"] + else: [t: "â «â Łâ ’â ’â •"] + + - "↓": # 0x2193 + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "â «â ©"] + else: [t: "⠫⠩⠒⠒⠕"] + + - "↔": [t: "â «â Ș⠒⠒⠕"] # 0x2194 + - "↕": [t: "â «â Łâ ©â Ș⠒⠒⠕"] # 0x2195 + - "↖": [t: "⠫⠘â Ș⠒⠒"] # 0x2196 + - "↗": [t: "⠫⠘⠒⠒⠕"] # 0x2197 + - "↘": [t: "⠫⠰⠒⠒⠕"] # 0x2198 + - "↙": [t: "â «â °â Ș⠒⠒"] # 0x2199 + - "↚": [t: "⠳⠈⠫â Ș⠒⠒⠻"] # 0x219a + - "↛": [t: "â łâ ˆâ «â ’â ’â •â »"] # 0x219b + - "↜": [t: "â «â Ș⠔⠒⠱"] # 0x219c + - "↝": [t: "⠫⠔⠒⠹⠕"] # 0x219d + - "↞": [t: "â «â Șâ Ș⠒⠒"] # 0x219e + - "↟": [t: "â «â Łâ ’â ’â •â •"] # 0x219f + - "↠": [t: "⠫⠒⠒⠕⠕"] # 0x21a0 + - "↡": [t: "⠫⠩⠒⠒⠕⠕"] # 0x21a1 + - "↱": [t: "â «â Șâ ’â ’â  â œ"] # 0x21a2 + - "↣": [t: "â «â  â Żâ ’â ’â •"] # 0x21a3 + - "ↀ": [t: "â «â Ș⠒⠒⠳"] # 0x21a4 + - "ↄ": [t: "â «â Łâ łâ ’â ’â •"] # 0x21a5 + - "↩": [t: "â «â łâ ’â ’â •"] # 0x21a6 + - "↧": [t: "â «â ©â łâ ’â ’â •"] # 0x21a7 + - "↹": [t: "â «â Ș⠒⠳⠒⠕"] # 0x21a8 + - "↩": [t: "â «â Ș⠒⠒⠠⠕"] # 0x21a9 + - "â†Ș": [t: "â «â  â Ș⠒⠒⠕"] # 0x21aa + - "↫": [t: "â «â Ș⠒⠒⠹⠡"] # 0x21ab + - "↬": [t: "â «â šâ Ąâ ’â ’â •"] # 0x21ac + - "↭": [t: "â «â Ș⠔⠒⠱⠕"] # 0x21ad + - "↼": [t: "⠳⠈⠫â Ș⠒⠒⠕"] # 0x21ae + - "↯": [t: "⠫⠩⠔⠹⠔"] # 0x21af + - "↮": [t: "â «â  â łâ ’â ’â •"] # 0x21b4 + - "↔": [t: "â «â ©â  â łâ ’â ’â •"] # 0x21b5 + - "↶": [t: "⠫⠹⠔⠕"] # 0x21b6 + - "↷": [t: "â «â Ș⠱⠔"] # 0x21b7 + - "â†ș": [t: "⠫⠹⠔⠕"] # 0x21ba + - "↻": [t: "â «â Ș⠱⠔"] # 0x21bb + - "⇄": [t: "⠫⠒⠒⠕⠫â Ș⠒⠒"] # 0x21c4 + - "⇅": [t: "⠫⠣⠒⠒⠕⠐⠫⠩⠒⠒⠕"] # 0x21c5 + - "⇆": [t: "â «â Ș⠒⠒⠫⠒⠒⠕"] # 0x21c6 + - "⇇": [t: "⠫⠚⠒⠒⠫⠚⠒⠒"] # 0x21c7 + - "⇈": [t: "⠫⠣⠒⠒⠕⠐⠫⠣⠒⠒⠕"] # 0x21c8 + - "⇉": [t: "⠫⠒⠒⠕⠫⠒⠒⠕"] # 0x21c9 + - "⇊": [t: "⠫⠩⠒⠒⠕⠐⠫⠩⠒⠒⠕"] # 0x21ca + - "⇍": [t: "⠳⠈⠫â Șâ Ș⠒⠒"] # 0x21cd + - "⇎": [t: "⠳⠈⠫â Șâ Ș⠒⠒⠕⠕"] # 0x21ce + - "⇏": [t: "â łâ ˆâ «â ’â ’â •â •"] # 0x21cf + - "⇐": [t: "â «â Șâ ¶â ¶"] # 0x21d0 + - "⇑": [t: "â «â Łâ ¶â ¶â •"] # 0x21d1 + - "⇒": [t: "⠫⠶⠶⠕"] # 0x21d2 + - "⇓": [t: "â «â Łâ ¶â ¶â •"] # 0x21d3 + - "⇔": [t: "â «â Ș⠶⠶⠕"] # 0x21d4 + - "⇕": [t: "â «â Łâ Ș⠶⠶⠕"] # 0x21d5 + - "⇖": [t: "⠫⠘â Șâ ¶â ¶"] # 0x21d6 + - "⇗": [t: "⠫⠘⠶⠶⠕"] # 0x21d7 + - "⇘": [t: "⠫⠰⠶⠶⠕"] # 0x21d8 + - "⇙": [t: "â «â °â Șâ Ș⠒⠒"] # 0x21d9 + - "⇚": [t: "â «â Șâ Șâ ¶â ¶"] # 0x21da FIX: how to represent triple shafts? + - "⇛": [t: "⠫⠶⠶⠕⠕"] # 0x21db FIX: how to represent triple shafts? + - "⇜": [t: "â «â Ș⠹⠀⠔⠒⠹"] # 0x21dc + - "⇝": [t: "⠫⠹⠀⠔⠒⠹⠕"] # 0x21dd + - "⇞": [t: "â łâ łâ ˆâ «â Łâ ’â ’â •â »"] # 0x21de + - "⇟": [t: "â łâ łâ ˆâ «â ©â ’â ’â •â »"] # 0x21df + - "⇠": [t: "â «â Ș⠒⠒"] # 0x21e0 + - "⇡": [t: "â «â Łâ ’â ’â •"] # 0x21e1 + - "⇱": [t: "⠫⠒⠒⠕"] # 0x21e2 + - "⇣": [t: "⠫⠩⠒⠒⠕"] # 0x21e3 + - "⇀": [t: "â «â łâ Ș⠒⠒"] # 0x21e4 + - "⇄": [t: "â «â ’â ’â •â ł"] # 0x21e5 + - "⇩": [t: "â «â žâ Ș⠒⠒"] # 0x21e6 + - "⇧": [t: "â «â Łâ žâ ’â ’â •"] # 0x21e7 + - "⇹": [t: "â «â žâ ’â ’â •"] # 0x21e8 + - "⇩": [t: "â «â ©â žâ ’â ’â •"] # 0x21e9 + - "⇳": [t: "â «â Łâ žâ Ș⠒⠒⠕"] # 0x21f3 + - "⇮": [t: "â «â ’â ’â •â šâ Ą"] # 0x21f4 + - "⇔": [t: "⠫⠩⠒⠒⠕⠐⠫⠣⠒⠒⠕"] # 0x21f5 + - "⇶": [t: "⠫⠒⠒⠕⠫⠒⠒⠕⠫⠒⠒⠕"] # 0x21f6 + - "⇷": [t: "⠳⠈⠫â Ș⠒⠒⠻"] # 0x21f7 + - "⇾": [t: "â łâ ˆâ «â ’â ’â •â »"] # 0x21f8 + - "â‡č": [t: "⠳⠈⠫â Ș⠒⠒⠕"] # 0x21f9 + - "â‡ș": [t: "⠳⠳⠈⠫â Ș⠒⠒⠻"] # 0x21fa + - "⇻": [t: "â łâ łâ ˆâ «â ’â ’â •â »"] # 0x21fb + - "⇌": [t: "⠳⠳⠈⠫â Ș⠒⠒⠕"] # 0x21fc + - "⇜": [t: "â «â łâ ’â ’"] # 0x21fd + - "⇟": [t: "â «â ’â ’â ł"] # 0x21fe + - "⇿": [t: "â «â łâ ’â ’â ł"] # 0x21ff + + - "ⅆ": [t: "⠙"] # 0x2146 + - "ⅇ": [t: "⠑"] # 0x2147 + - "ⅈ": [t: "⠊"] # 0x2148 + - "⌜": [t: "⠈⠘⠷"] # 0x231c + - "⌝": [t: "⠈⠘⠟"] # 0x231d + - "⌞": [t: "⠈⠰⠷"] # 0x231e + - "⌟": [t: "⠈⠰⠟"] # 0x231f + - "〈": [t: "â šâ šâ ·"] # 0x2329 + - "âŒȘ": [t: "â šâ šâ Ÿ"] # 0x232a + - "⏞": [t: "â šâ ·"] # 0x23de + - "⏟": [t: "â šâ Ÿ"] # 0x23df + - "⎮": [t: "⠈⠷"] # 0x23b4 + - "⎔": [t: "⠈⠟"] # 0x23b5 + - "âŸȘ": [t: "â šâ šâ šâ ·"] # 0x27ea + - "⟫": [t: "â šâ šâ šâ Ÿ"] # 0x27eb + - "〈": [t: "â šâ šâ ·"] # 0x3008 + - "〉": [t: "â šâ šâ Ÿ"] # 0x3009 + - "《": [t: "â šâ šâ šâ ·"] # 0x300a + - "》": [t: "â šâ šâ šâ Ÿ"] # 0x300b + - "「": [t: "⠈⠘⠷"] # 0x300c + - "」": [t: "⠈⠘⠟"] # 0x300d + - "↌": [t: "⠫⠈â Ș⠒⠒"] # 0x21bc + - "↜": [t: "â «â  â Ș⠒⠒"] # 0x21bd + - "↟": [t: "â «â Łâ ’â ’â  â •"] # 0x21be + - "↿": [t: "â «â Łâ ’â ’â ˆâ •"] # 0x21bf + - "⇀": [t: "⠫⠒⠒⠈⠕"] # 0x21c0 + - "⇁": [t: "⠫⠒⠒⠠⠕"] # 0x21c1 + - "⇂": [t: "â «â Ș⠒⠒⠈⠕"] # 0x21c2 + - "⇃": [t: "⠫⠩⠒⠒⠠⠕"] # 0x21c3 + - "⇋": # 0x21cb + + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "â «â Ș⠒⠫⠒⠕"] + else: [t: "⠫⠈â Ș⠒⠒⠫⠒⠒⠈⠕"] + - "⇌": # 0x21cc + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "⠫⠒⠕⠫â Ș⠒"] + else: [t: "⠫⠒⠒⠈⠕⠫⠈â Ș⠒⠒"] + + - "℔": [t: "â ł"] # 0x2114 + - "ℱ": [t: "⠘⠞"] # 0x2122 + - "Å": [t: "⠈⠠⠁"] # 0x212b + - "­": [t: "â €"] # 0xad + - " -​": [t: "W"] # 0x2000 - 0x200b (various spaces / ZWSP) + - "‹": [t: "W"] # 0x2028 + - "
": [t: "W"] # 0x2029 + - " ": [t: "W"] # 0x202f + - " ": [t: "W"] # 0x205f + - "₣": [t: "⠈⠋"] # 0x20A3 (French franc sign + - "₩": [t: "⠈⠝"] # 0x2046 (Naira sign) + - "₩": [t: "⠈â ș"] # 0x20A9 (Won sign) + - "€": [t: "⠈⠑"] # 0x20AC (Euro sign) + - "ï»ż": [t: "W"] # 0xfeff + - "☆": [t: "⠫⠎"] # 0x2606 + - "✕": [t: "⠈⠥"] # 0x2715 + - "ÂŒ": [t: "â č⠂⠌â Čâ Œ"] # 0xbc + - "œ": [t: "â č⠂⠌⠆⠌"] # 0xbd + - "Ÿ": [t: "â č⠒⠌â Čâ Œ"] # 0xbe + - "⅐": [t: "â č⠂⠌⠶⠌"] # 0x2150 + - "⅑": [t: "â č⠂⠌⠔⠌"] # 0x2151 + - "⅒": [t: "â č⠂⠌⠂⠎⠌"] # 0x2152 + - "⅓": [t: "â č⠂⠌⠒⠌"] # 0x2153 + - "⅔": [t: "â č⠆⠌⠒⠌"] # 0x2154 + - "⅕": [t: "â čâ ‚â Œâ ąâ Œ"] # 0x2155 + - "⅖": [t: "â čâ †â Œâ ąâ Œ"] # 0x2156 + - "⅗": [t: "â čâ ’â Œâ ąâ Œ"] # 0x2157 + - "⅘": [t: "â čâ Čâ Œâ ąâ Œ"] # 0x2158 + - "⅙": [t: "â č⠂⠌⠖⠌"] # 0x2159 + - "⅚": [t: "â čâ ąâ Œâ –â Œ"] # 0x215a + - "⅛": [t: "â č⠂⠌⠊⠌"] # 0x215b + - "⅜": [t: "â č⠒⠌⠊⠌"] # 0x215c + - "⅝": [t: "â čâ ąâ Œâ Šâ Œ"] # 0x215d + - "⅞": [t: "â č⠶⠌⠊⠌"] # 0x215e + - "⅟": [t: "â č⠂⠌⠌"] # 0x215f + - "↉": [t: "â č⠎⠌⠒⠌"] # 0x2189 + - "㉈": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠂⠎⠻⠻"] # 0x3248 + - "㉉": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠆⠎⠻⠻"] # 0x3249 + - "㉊": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠒⠎⠻⠻"] # 0x324a + - "㉋": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌â Č⠎⠻⠻"] # 0x324b + - "㉌": [t: "â «â žâ Čâ žâ «â «â ‰â žâ «â Œâ ąâ Žâ »â »"] # 0x324c + - "㉍": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠖⠎⠻⠻"] # 0x324d + - "㉎": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠶⠎⠻⠻"] # 0x324e + - "㉏": [t: "â «â žâ Č⠞⠫⠫⠉⠞⠫⠌⠊⠎⠻⠻"] # 0x324f + + + - "‘": [t: "Pâ  â Š"] # 0x2018 (Left single quotation mark) + - "’": [t: "Pâ  â Ž"] # 0x2019 (Right single quotation mark) + - "“": [t: "Pâ Š"] # 0x201C (Left double quotation mark) + - "”": [t: "Pâ Ž"] # 0x201D (Right double quotation mark) + - "‰": [t: "`00"] + - "ℏ": [t: "⠈⠓"] # 0x210F (Planck constant over two pi) + - "ℓ": [t: "TE⠇"] # 0x2113 (Script small l (differs from 1d4c1: 4-56-123)) + - "℘": [tc: "TCL⠏"] # 0x2118 (Script Capital P) +# - "ℝ": [t: ""] # 0x211D (Double-struck capital R (no nemeth double struck)) +# - "ⅆ": [t: ""] # 0x2146 (Double-struck italic small d) +# - "ⅇ": [t: ""] # 0x2147 (Double-struck italic small e) +# - "⇚": [t: "⠀⠫â Ș⠾⠾⠀"] # 0x21DA (Leftwards triple arrow) +# - "⇛": [t: "⠀⠫⠞⠞⠕⠀"] # 0x21DB (Rightwards triple arrow) + - "∔": [t: "⠐⠏⠣⠥⠻"] # 0x2214 (Dot plus) + - "√": [t: "⠜"] # 0x221A (Square root) + - "∛": [t: "⠣⠒⠜"] # 0x221B (Cube root) + - "∜": [t: "â Łâ Č⠜"] # 0x221C (Fourth root) + - "∥": [t: "â «â Ș⠞⠫⠫⠁⠻"] # 0x2221 (Measured angle) + - "âˆč": [t: "⠀⠐⠂"] # 0x2239 (Excess) + - "âˆș": [t: "⠐⠀⠩⠥⠥⠣⠥⠥⠻"] # 0x223A (Geometric proportion) + - "∻": [t: "⠐⠈⠱⠩⠥⠣⠥⠻"] # 0x223B (Homothetic) + - "∜": [t: "â  â ±"] # 0x223D (Reversed tilde) + - "≋": [t: "⠈⠱⠈⠱⠈⠱"] # 0x224B (Triple tilde) + - "≌": [t: "⠠⠱⠚⠅"] # 0x224C (All equal to) + - "≏": [t: "⠈⠣⠱"] # 0x224F (Difference between) + - "≔": [t: "⠐⠂⠹⠅"] # 0x2254 (Colon equals) + - "≕": [t: "⠹⠅⠐⠂"] # 0x2255 (Equals colon) + - "≖": [t: "â €â šâ Ąâ ˆâ šâ …â »â €"] # 0x2256 (Ring in equal to) + - "⊌": [t: "⠚⠏⠈⠫â Ș⠒⠻"] # 0x228C (Multiset) + - "⊍": [t: "⠥⠈⠚⠏⠻"] # 0x228D (Multiset multiplication) + - "⊎": [t: "⠏⠈⠚⠏⠻"] # 0x228E (Multiset union) + - "⊕": [t: "⠫⠉⠞⠫⠏⠻"] # 0x2295 (Circled plus) + - "⊖": [t: "⠫⠉⠞⠫⠀⠻"] # 0x2296 (Circled minus) + - "⊗": [t: "â «â ‰â žâ «â ˆâ Ąâ »"] # 0x2297 (Circled times) + - "⊘": [t: "⠫⠉⠞⠫⠞⠌⠻"] # 0x2298 (Circled division slash) + - "⊙": [t: "⠫⠉⠞⠫⠥⠻"] # 0x2299 (Circled dot operator) + - "⊚": [t: "â «â ‰â žâ «â ˜â šâ Ąâ »"] # 0x229a (Circled ring operator) + - "⊛": [t: "⠫⠉⠞⠫⠈⠌⠻"] # 0x229B (Circled asterisk operator) + - "⊜": [t: "⠫⠉⠞⠫⠚⠅⠻"] # 0x229C (Circled equals) + - "⊝": [t: "⠫⠉⠞⠫⠀⠀⠻"] # 0x229D (Circled dash) + - "⊞": [t: "â «â Čâ žâ «â Źâ »"] # 0x229E (Squared plus) + - "⊟": [t: "â «â Č⠞⠫⠀⠻"] # 0x229F (Squared minus) + - "⊠": [t: "â «â Č⠞⠫⠈⠥⠻"] # 0x22A0 (Squared times) + - "⊡": [t: "â «â Čâ žâ «â Ąâ »"] # 0x22A1 (Squared dot operator) + - "⊱": [t: "â «â łâ ’"] # 0x22A2 (Right tack) + - "⊣": [t: "â «â ’â ł"] # 0x22A3 (Left tack) + - "⊀": [t: "â «â ©â łâ ’"] # 0x22A4 (Down tack) +# - "⊄": [t: "⠀⠫⠏⠀ or ⠀⠫⠣⠳⠒⠀"] # 0x22A5 (Up tack (See also 27C2)) +# - "⊩": [t: ""] # 0x22A6 (Assertion) +# - "⊹": [t: ""] # 0x22A8 (TRUE) +# - "âŠČ": [t: ""] # 0x22B2 (Normal subgroup of) +# - "⊳": [t: ""] # 0x22B3 (Contains as normal subgroup) +# - "⊮": [t: ""] # 0x22B4 (Normal subgroup of or equal to) +# - "⊔": [t: ""] # 0x22B5 (Contains as normal subgroup or equal to) + - "⊶": [t: "â «â šâ Ąâ ’â Ą"] # 0x22B6 (Original of) + - "⊷": [t: "â «â Ąâ ’â šâ Ą"] # 0x22B7 (Image of) + - "⊾": [t: "â «â ’â šâ Ą"] # 0x22B8 (Multimap) +# - "⊟": [t: ""] # 0x22BE (Right angle w arc) + - "⊿": [t: "â «â žâ šâ —â »"] # 0x22BF (Right triangle) + - "⋅": [t: "â Ą"] # 0x22C5 (Dot operator) + - "∙": [t: "â Ą"] # 0x2219 -- similar looking to 0x22c5, so using the same braille + - "⋆": [t: "⠫⠎"] # 0x22C6 (Star operator) + - "⋍": [t: "⠠⠱⠱"] # 0x22CD (Reversed tilde equals) + - "⋖": [t: "â Ąâ ˆâ â …â »"] # 0x22D6 (Less-than w dot) + - "⋗": [t: "â Ąâ ˆâ šâ ‚â »"] # 0x22D7 (Greater-than w dot) + - "⋘": [t: "⠐⠅⠈⠐⠅⠈⠐⠅⠻"] # 0x22D8 (Much less-than) + - "⋙": [t: "⠚⠂⠈⠚⠂⠈⠚⠂⠻"] # 0x22D9 (Much greater-than) + - "â‹Č": [t: "⠱⠈⠈⠑⠻"] # 0x22F2 (Element of w long horizontal stroke) + - "â‹”": [t: "â â ˆâ ‘â Łâ Ąâ »"] # 0x22F5 (Element of w dot above) + - "⋶": [t: "⠱⠈⠑"] # 0x22F6 (Element of w overbar) + - "â‹ș": [t: "⠱⠈⠈⠹⠻"] # 0x22FA (Contains w long horizontal stroke) + - "⋜": [t: "⠱⠈⠹"] # 0x22FD (Contains w overbar) + - "⌈": [t: "⠈⠘⠷"] # 0x2308 (Left ceiling) + - "⌉": [t: "⠈⠘⠟"] # 0x2309 (Right ceiling) + - "⌊": [t: "⠈⠰⠷"] # 0x230A (Left floor) + - "⌋": [t: "⠈⠰⠟"] # 0x230B (Right floor) + - "⌱": [t: "⠫⠁"] # 0x2322 (Frown) + - "⌣": [t: "⠫⠄"] # 0x2323 (Smile) + - "■": [t: "â «â žâ Č"] # 0x25A0 (Filled square) + - "▫": [t: "â «â Č"] # 0x25AB (Small white Square) + - "□": [t: "â «â Č"] # 0x25A1 (Square) + - "◻": [t: "â «â Č"] # 0x25FB (Square) + - "▬": [t: "â «â žâ —"] # 0x25AC (Filled rectangle) + - "▭": [t: "⠫⠗"] # 0x25AD (Rectangle) + - "â–Č": [t: "â «â žâ ž"] # 0x25B2 (Black up-pointing triangle) + - "△": [t: "⠫⠞"] # 0x25B3 (White up-pointing triangle) + - "â–Œ": [t: "â žâ šâ «"] # 0x25BC (Black down-pointing triangle) + - "○": [t: "⠫⠉"] # 0x25CB (White circle) + - "●": [t: "â «â žâ ‰"] # 0x25CF (Black circle) + - "◫": [t: "â «â Čâ žâ «â łâ »"] # 0x25EB (White square w vertical bisecting line) +# - "⊄": [t: "⠫⠏"] # 0x27C2 (Perpendicular) + - "⟃": [t: "â šâ Ąâ ˆâ žâ â …â »"] # 0x27C3 (Open subset) + - "⟄": [t: "â šâ Ąâ ˆâ žâ šâ ‚â »"] # 0x27C4 (Open superset) + - "⟜": [t: "â «â šâ Ąâ ’â ’"] # 0x27DC (Left multimap) + - "⟝": [t: "â «â łâ ’â ’"] # 0x27DD (Long right tack) + - "⟞": [t: "â «â ’â ’â ł"] # 0x27DE (Long left tack) + - "⟟": [t: "â «â Łâ łâ ’â ’â šâ Ą"] # 0x27DF (Up tack w circle above) + - "⟩": [t: "⠈⠞⠷"] # 0x27E6 (Mathematical left white square bracket) + - "⟧": [t: "⠈⠞⠟"] # 0x27E7 (Mathematical right white square bracket) + - "⟹": [t: "â šâ šâ ·"] # 0x27E8 (Mathematical left angle bracket) + - "⟩": [t: "â šâ šâ Ÿ"] # 0x27E9 (Mathematical right angle bracket) + - "⟔": [t: "⠀⠫â Ș⠒⠒⠒⠀"] # 0x27F5 (Long leftwards arrow ) + - "⟶": [t: "⠀⠫⠒⠒⠒⠕⠀"] # 0x27F6 (Long rightwards arrow) + - "⟷": [t: "⠀⠫â Ș⠒⠒⠒⠕⠀"] # 0x27F7 (Long left right arrow) + - "⟾": [t: "⠀⠫â Ș⠶⠶⠶⠀"] # 0x27F8 (Long leftwards arrow ) + - "âŸč": [t: "⠀⠫⠶⠶⠶⠕⠀"] # 0x27F9 (Long rightwards arrow) + - "âŸș": [t: "⠀⠫â Ș⠶⠶⠶⠕⠀"] # 0x27FA (Long left right arrow) + - "⟻": [t: "⠀⠫â Ș⠒⠒⠒⠳⠀"] # 0x27FB (Long leftwards arrow from bar) + - "⟌": [t: "⠀⠫⠳⠒⠒⠒⠕⠀"] # 0x27FC (Long rightwards arrow from bar) + - "⟜": [t: "⠀⠫â Șâ ¶â ¶â ¶â łâ €"] # 0x27FD (Long leftwards double arrow from bar) + - "⟟": [t: "⠀⠫⠳⠶⠶⠶⠕⠀"] # 0x27FE (Long rightwards double arrow from bar) + - "⟿": [t: "⠀⠫⠹⠀⠔⠒⠹⠀⠔⠒⠹⠕⠀"] # 0x27FF (Long rightwards squiggle arrow) + - "‥": [t: "⠀⠫⠘â Ș⠒⠒⠕⠀"] # 0x2921 (North west and south east arrow) + - "‹": [t: "⠀⠫⠰â Ș⠒⠒⠕⠀"] # 0x2922 (North east and south west arrow) + - "🣐": # 0x1f8d0 (Long rightwards arrow over leftwards arrow (equilibrium)) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "⠫⠒⠕⠫â Ș⠒"] + else: [t: "⠫⠒⠒⠈⠕⠫⠠â Ș⠒⠒"] + - "🣑": # 0x1f8d1 (Long rightwards harpoon over leftwards harpoon (equilibrium)) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "⠫⠒⠕⠫â Ș⠒"] + else: [t: "⠫⠒⠒⠈⠕⠫⠠â Ș⠒⠒"] + - "🣒": # 0x1f8d2 (Long rightwards harpoon over short leftwards harpoon (equilibrium)) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "⠫⠒⠒⠕⠫â Ș⠒"] + else: [t: "⠫⠒⠒⠈⠕⠫⠈â Ș⠒⠒"] + - "🣓": # 0x1f8d3 (Short rightwards harpoon over long leftwards harpoon (equilibrium, trend to the right)) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "⠫⠒⠕⠫â Ș⠒⠒"] + else: [t: "⠫⠒⠈⠕⠫⠠â Ș⠒⠒"] + - "🣔": # 0x1f8d4 (Long leftwards harpoon over short rightwards harpoon (equilibrium, trend to the left)) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "â «â Ș⠒⠒⠫⠒⠕"] + else: [t: "⠫⠈â Ș⠒⠒⠫⠒⠠⠕"] + - "🣕": # 0x1f8d5 (Short leftwards harpoon over long rightwards harpoon (equilibrium, trend to the left)) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "â «â Ș⠒⠫⠒⠒⠕"] + else: [t: "⠫⠈â Ș⠒⠫⠒⠒⠠⠕"] + - "â„‚": # 0x2942 (Long rightwards harpoon over short leftwards harpoon (equilibrium)) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "⠫⠒⠒⠕⠫â Ș⠒"] + else: [t: "⠫⠒⠒⠈⠕⠫⠈â Ș⠒⠒"] + - "â„„": # 0x2944 (Short rightwards harpoon over long leftwards harpoon (equilibrium, trend to the right)) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "⠫⠒⠕⠫â Ș⠒⠒"] + else: [t: "⠫⠒⠈⠕⠫⠠â Ș⠒⠒"] + - "℃": # 0x2943 (Long leftwards harpoon over short rightwards harpoon (equilibrium, trend to the left)) + - test: + if: "@data-chem-equation-op or ancestor-or-self::*[contains(@intent, ':chemical-equation')]" + then: [t: "â «â Ș⠒⠒⠫⠒⠕"] + else: [t: "⠫⠈â Ș⠒⠒⠫⠒⠠⠕"] + - "🣖": [t: "⠌⠫⠒⠒⠕"] # 0x1f8d6 (long rightwards arrow with through X) + - "🣗": [t: "⠌⠫⠒⠒⠕"] # 0x1f8d7 (long rightwards arrow with double slash) chem code says it is same as 0x1f8d6 + + + - "⊃": [t: "â šâ žâ ·"] # 0x2983 (Left white curly bracket) + - "⩄": [t: "â šâ žâ Ÿ"] # 0x2984 (Right white curly bracket) + - "⩑": [t: "⠥⠈⠚⠚⠷⠻"] # 0x2991 (Left angle bracket w dot) + - "⩒": [t: "â Ąâ ˆâ šâ šâ Ÿâ »"] # 0x2992 (Right angle bracket w dot) + - "⧄": [t: "â «â Č⠞⠫⠔⠻"] # 0x29C4 (Square rising diagonal slash) + - "⧅": [t: "â «â Čâ žâ «â ąâ »"] # 0x29C5 (Square falling diagonal slash) + - "⧆": [t: "â «â Č⠞⠫⠈⠌⠻"] # 0x29C6 (Squared asterisk) + - "⧊": [t: "⠐⠫⠞⠣⠥⠻"] # 0x29CA (Triangle w dot above) + - "⧋": [t: "⠫⠞⠱"] # 0x29CB (Triangle w underbar) + - "⧌": [t: "⠫⠞⠎"] # 0x29CC (s in triangle §114) + - "â§Š": [t: "â «â łâ ¶â ¶â ł"] # 0x29E6 (Gleich stark) + - "⹌": [t: "â źâ źâ źâ ź"] # 0x2A0C (Quadruple integral operator) + - "⚍": [t: "⠟⠈⠱⠻"] # 0x2A0D (Finite part integral) + - "⚎": [t: "⠟⠈⠱⠱⠻"] # 0x2A0E (Integral w double stroke) + - "⹖": [t: "⠟⠈⠫â Čâ »"] # 0x2A16 (Quaternion integral operator) + - "⚘": [t: "⠟⠈⠈⠥⠻"] # 0x2A18 (Integral w times sign) + - "⹙": [t: "⠟⠈⠚⠩⠻"] # 0x2A19 (Integral w intersection) + - "⹚": [t: "⠟⠈⠚⠏⠻"] # 0x2A1A (Integral w union) + - "⹛": [t: "â Łâ ź"] # 0x2A1B (Integral w overbar (upper)) + - "⹜": [t: "â ©â ź"] # 0x2A1C (Integral w underbar (lower)) + - "âšą": [t: "⠐⠏⠣⠚⠥⠻"] # 0x2A22 (Plus sign w small circle above) + - "⚣": [t: "⠐⠏⠣⠞⠣⠻"] # 0x2A23 (Plus sign w circumflex accent above) + - "⚀": [t: "⠐⠏⠣⠈⠱⠻"] # 0x2A24 (Plus sign w tilde above) + - "âš„": [t: "⠐⠏⠩⠥⠻"] # 0x2A25 (Plus sign w dot below) + - "âšȘ": [t: "⠐⠱⠩⠥⠻"] # 0x2A2A (Minus sign w dot below) + - "âš°": [t: "⠐⠈⠥⠣⠥⠻"] # 0x2A30 (Multiplication sign w dot above) + - "âš±": [t: "⠈⠥⠱"] # 0x2A31 (Multiplication sign w underbar) + - "âšž": [t: "⠫⠉⠞⠫⠚⠌⠻"] # 0x2A38 (Circled division sign) + - "âšč": [t: "â «â žâ žâ «â Źâ »"] # 0x2A39 (Plus sign in triangle) + - "âšș": [t: "⠫⠞⠞⠫⠀⠻"] # 0x2A3A (Minus sign in triangle) + - "âš»": [t: "â «â žâ žâ «â ˆâ Ąâ »"] # 0x2A3B (Multiplication sign in triangle) + - "⩀": [t: "⠥⠈⠚⠩⠻"] # 0x2A40 (Intersection w dot) + - "⩁": [t: "⠀⠈⠚⠏⠻"] # 0x2A41 (Union w minus sign) + - "⩂": [t: "⠱⠚⠏"] # 0x2A42 (Union w overbar) + - "⩃": [t: "⠱⠚⠩"] # 0x2A43 (Intersection w overbar) + - "⩑": [t: "⠐⠈⠩⠣⠥⠻"] # 0x2A51 (Logical AND w dot above) + - "⩒": [t: "⠐⠈⠏⠣⠥⠻"] # 0x2A52 (Logical OR w dot above) + - "⩜": [t: "⠱⠈⠈⠩⠻"] # 0x2A5C (Logical AND with horizontal dash) + - "⩝": [t: "⠱⠈⠈⠏⠻"] # 0x2A5D (Logical OR with horizontal dash) + - "⩞": [t: "⠱⠱⠈⠩"] # 0x2A5E (Logical AND w double overbar) + - "⩟": [t: "⠈⠩⠱"] # 0x2A5F (Logical AND w underbar) + - "â© ": [t: "⠈⠩⠱⠱"] # 0x2A60 (Logical AND w double underbar) + - "⩹": [t: "⠱⠱⠈⠏"] # 0x2A62 (Logical OR w double overbar) + - "⩣": [t: "⠈⠏⠱⠱"] # 0x2A63 (Logical OR w double underbar) + - "⩊": [t: "⠐⠚⠅⠩⠥⠻"] # 0x2A66 (Equals sign w dot below) + - "â©§": [t: "⠐⠞⠇⠣⠥⠻"] # 0x2A67 (Identical w dot above) + - "â©Ș": [t: "⠐⠈⠱⠣⠥⠻"] # 0x2A6A (Tilde operator w dot above) + - "⩏": [t: "⠈⠱⠱⠈⠱"] # 0x2A6C (Similar minus similar) + - "â©­": [t: "â â ˆâ ±â šâ …â Łâ Ąâ »"] # 0x2A6D (Congruent w dot above) + - "⩟": [t: "â â šâ …â Łâ ˆâ Œâ »"] # 0x2A6E (Equals w asterisk) + - "⩯": [t: "⠐⠈⠱⠈⠱⠣⠞⠣⠻"] # 0x2A6F (Almost equal to w circumflex) + - "â©°": [t: "⠈⠱⠈⠱⠚⠅"] # 0x2A70 (Approximately equal or equal to) + - "⩱": [t: "⠹⠅⠬"] # 0x2A71 (Equals sign above plus sign) + - "â©Č": [t: "⠬⠹⠅"] # 0x2A72 (Plus sign above equals sign) + - "⩳": [t: "⠚⠅⠈⠱"] # 0x2A73 (Equals sign above tilde operator) + - "⩎": [t: "⠐⠂⠐⠂⠹⠅"] # 0x2A74 (Double colon equal) + - "â©”": [t: "⠹⠅⠹⠅"] # 0x2A75 (Two consecutive equals signs) + - "â©¶": [t: "⠹⠅⠹⠅⠹⠅"] # 0x2A76 (Three consecutive equals signs) + - "â©·": [t: "⠐⠚⠅⠩⠥⠥⠣⠥⠥⠻"] # 0x2A77 (Equals sign w two dots above and two dots below) + - "⩞": [t: "⠐⠞⠇⠣⠥⠥⠥⠥⠻"] # 0x2A78 (Equivalent w four dots above) + - "â©č": [t: "â â …â ˆâ šâ Ąâ »"] # 0x2A79 (Less than w circle inside) + - "â©ș": [t: "â šâ ‚â ˆâ šâ Ąâ »"] # 0x2A7A (Greater than w circle inside) + - "â©»": [t: "⠐⠐⠅⠣⠞⠊⠻"] # 0x2A7B (Less-than w question mark above) + - "⩌": [t: "⠐⠚⠂⠣⠞⠊⠻"] # 0x2A7C (Greater-than w question mark above) + - "âȘ…": [t: "⠐⠅⠈⠱⠈⠱"] # 0x2A85 (Less-than or approximate) + - "âȘ†": [t: "⠚⠂⠈⠱⠈⠱"] # 0x2A86 (Greater-than or approximate) + - "âȘ‹": [t: "⠐⠅⠹⠅⠹⠂"] # 0x2A8B (Less-than above double-line equal above greater-than) + - "âȘŒ": [t: "⠹⠂⠹⠅⠐⠅"] # 0x2A8C (Greater-than above double-line equal above less-than) + - "âȘ": [t: "⠐⠅⠈⠱⠱"] # 0x2A8D (Less-than above similar or equal to) + - "âȘŽ": [t: "⠚⠂⠈⠱⠱"] # 0x2A8E (Greater-than above similar or equal to) + - "âȘ": [t: "⠐⠅⠈⠱⠚⠂"] # 0x2A8F (Less-than above similar above greater-than) + - "âȘ": [t: "⠚⠂⠈⠱⠐⠅"] # 0x2A90 (Greater-than above similar above less-than) + - "âȘ‘": [t: "⠐⠅⠹⠂⠹⠅"] # 0x2A91 (Less-than above greater-than above double-line equal) + - "âȘ’": [t: "⠹⠂⠐⠅⠹⠅"] # 0x2A92 (Greater-than above less-than above double-line equal) + - "âȘ™": [t: "⠹⠅⠐⠅"] # 0x2A99 (Double-line equal to or less-than) + - "âȘš": [t: "⠹⠅⠹⠂"] # 0x2A9A (Double-line equal to or greater-than) + - "âȘ": [t: "⠈⠱⠐⠅"] # 0x2A9D (Similar or less-than) + - "âȘž": [t: "⠈⠱⠚⠂"] # 0x2A9E (Similar or greater-than) + - "âȘŸ": [t: "⠈⠱⠐⠅⠚⠅"] # 0x2A9F (Similar above less-than above equals sign) + - "âȘ ": [t: "⠈⠱⠚⠂⠚⠅"] # 0x2AA0 (Similar above greater-than above equals sign) + - "âȘź": [t: "⠈⠣⠹⠅"] # 0x2AAE (Equals sign with bumpy above) + - "âȘœ": [t: "â Ąâ ˆâ žâ â …â »"] # 0x2ABD (Subset w dot) + - "âȘŸ": [t: "â Ąâ ˆâ žâ šâ ‚â »"] # 0x2ABE (Superset w dot) + - "âȘż": [t: "⠐⠞⠐⠅⠩⠏⠻"] # 0x2ABF (Subset with plus sign below) + - "⫀": [t: "⠐⠞⠚⠂⠩⠏⠻"] # 0x2AC0 (Superset with plus sign below) + - "⫁": [t: "â â žâ â …â ©â ˆâ Ąâ »"] # 0x2AC1 (Subset with multiplication sign below) + - "⫂": [t: "â â žâ šâ ‚â ©â ˆâ Ąâ »"] # 0x2AC2 (Superset with multiplication sign below) + - "⫅": [t: "⠾⠐⠅⠹⠅"] # 0x2AC5 (Subset of above equals sign) + - "⫆": [t: "⠾⠹⠂⠹⠅"] # 0x2AC6 (Superset of above equals sign) + - "⫇": [t: "⠞⠐⠅⠈⠱"] # 0x2AC7 (Subset of above tilde operator) + - "⫈": [t: "⠞⠚⠂⠈⠱"] # 0x2AC8 (Superset of above tilde operator) + - "⫉": [t: "⠞⠐⠅⠈⠱⠈⠱"] # 0x2AC9 (Subset of above almost equal to) + - "⫊": [t: "⠞⠚⠂⠈⠱⠈⠱"] # 0x2ACA (Superset of above almost equal to) + - "⫋": [t: "⠾⠐⠅⠌⠹⠅"] # 0x2ACB (Subset of above not equals sign) + - "⫌": [t: "⠾⠹⠂⠌⠹⠅"] # 0x2ACC (Superset of above not equals sign) + - "⫓": [t: "⠾⠐⠅⠾⠹⠂"] # 0x2AD3 (Subset above superset) + - "⫔": [t: "⠾⠹⠂⠾⠐⠅"] # 0x2AD4 (Superset above subset) + - "⫕": [t: "⠾⠐⠅⠾⠐⠅"] # 0x2AD5 (Subset above subset) + - "⫖": [t: "⠾⠹⠂⠾⠹⠂"] # 0x2AD6 (Superset above superset) + - "⫗": [t: "⠾⠹⠂⠐⠾⠐⠅"] # 0x2AD7 (Superset beside subset) + - "⫯": [t: "â «â ©â šâ Ąâ ’â ’"] # 0x2AEF (Vertical line w circle above) + - "â«°": [t: "â «â Łâ šâ Ąâ ’â ’"] # 0x2AF0 (Vertical line w circle below) + - "⫱": [t: "â «â Łâ šâ Ąâ ’â ’â ł"] # 0x2AF1 (Down tack w circle below) + - "â«Č": [t: "⠱⠈⠫⠇⠻"] # 0x2AF2 (Parallel w horizontal stroke) + - "⫳": [t: "⠈⠱⠈⠫⠇⠻"] # 0x2AF3 (Parallel w tilde operator) + - "⫎": [t: "â łâ łâ ł"] # 0x2AF4 (Triple vertical bar binary relation) + - "⏏": [t: "â «â žâ ‘"] # 0x2B2C (Black ellipse) + - "⏭": [t: "⠫⠑"] # 0x2B2D (White ellipse) + - "⏰": [t: "⠚⠥⠈⠫â Ș⠒⠒⠻"] # 0x2B30 (Left arrow w small circle) + - "⏱": [t: "â «â Ș⠒⠒⠫â Ș⠒⠒⠫â Ș⠒⠒"] # 0x2B31 (Three leftwards arrows) + - "âŹČ": [t: "â «â Șâ ’â ’â ˆâ «â ‰â žâ «â Źâ »"] # 0x2B32 (Left arrow w circled plus) + - "⼖": [t: "â šâ Ą"] # 0x2B96 (Standard State Symbol) + - "⯃": [t: "â «â žâ Š"] # 0x2BC3 (Horizontal black octagon) + + # SRE lists this as a custom transcription + - "⋊": [t: "⠈⠥⠳"] # 0x22ca (RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT) diff --git a/Rules/Braille/UEB/UEB_Rules.yaml b/Rules/Braille/UEB/UEB_Rules.yaml index 912e03d8a..c161530dd 100644 --- a/Rules/Braille/UEB/UEB_Rules.yaml +++ b/Rules/Braille/UEB/UEB_Rules.yaml @@ -8,7 +8,7 @@ variables: [MatchingWhitespace: "true()"] replace: - test: - - if: "(@class='MathML-unit' or BaseNode(.)[@class='MathML-unit']) and @data-previous-space-width >= 0.25" # BANA 5.3(a) + - if: "(@class='MathML-unit' or contains(@data-intent-property, ':unit:') or BaseNode(.)[@class='MathML-unit' or contains(@data-intent-property, ':unit:')]) and @data-previous-space-width >= 0.25" # treat spaced units as separate exprs for G1 placement then: [t: "𝐖"] - else_if: "@data-previous-space-width > 1.1" then: [t: "â Ź"] @@ -16,7 +16,7 @@ then: [t: "W"] - x: "." - test: - - if: "(@class='MathML-unit' or BaseNode(.)[@class='MathML-unit']) and @data-following-space-width >= 0.25" # BANA 5.3(a) + - if: "(@class='MathML-unit' or contains(@data-intent-property, ':unit:') or BaseNode(.)[@class='MathML-unit' or contains(@data-intent-property, ':unit:')]) and @data-following-space-width >= 0.25" # treat spaced units as separate exprs for G1 placement then: [t: "𝐖"] - else_if: "@data-following-space-width > 1.1" then: [t: "â Ź"] @@ -107,7 +107,7 @@ replace: - t: "1â ·" - x: "*[1]" - - t: "1⠹⠌" + - t: "⠹⠌" - x: "*[2]" - t: "1â Ÿ" @@ -256,9 +256,10 @@ tag: mo # add spaces around comparison operators unless they are in a script position, variables: # ratio not spaced in UEB; also make sure it is an infix operator (e.g., "~" can be prefix) + # ∎ / ∔ / ∎ are spaced like comparison signs (GTM 1.7.9 "∎ force = 
"; GTM 11) - AddSpaces: "$UseSpacesAroundAllOperators or ( parent::*[self::m:mrow] and $NewScriptContext='' and - .!='∶' and IsInDefinition(., 'Braille', 'NemethComparisonOperators') )" + .!='∶' and (IsInDefinition(., 'Braille', 'NemethComparisonOperators') or .='∎' or .='∔' or .='∎') )" match: "." replace: - test: diff --git a/Rules/prefs.yaml b/Rules/prefs.yaml index 8a324721e..6c36c4020 100644 --- a/Rules/prefs.yaml +++ b/Rules/prefs.yaml @@ -61,6 +61,7 @@ UEB: StartMode: "Grade2" # Grade1/Grade2 -- assumed starting mode UEB braille (Grade1 assumes we are in G1 passage mode) + # Grade 1 indicators follow ICEB GTM 1.7 (also BANA 2026 math/science guidance) # UEB Guide to Technical Material (https://iceb.org/Guidelines_for_Technical_Material_2008-10.pdf) # says to normally treat Fraktur and DoubleStruck as Script diff --git a/docs/users.md b/docs/users.md index 6328e522f..a5ab487d3 100644 --- a/docs/users.md +++ b/docs/users.md @@ -10,8 +10,6 @@ MathCAT is a tool used together with a screen reader. Through MathCAT, you can h In screen readers NVDA and JAWS, MathCAT comes built-in. This means you don’t have to install it as an addon. -MathCAT is still available as an addon to NVDA. You can use it if you want access to the very latest features between NVDA releases. [How to use MathCAT as an addon is described here](#how-to-install-mathcat-as-an-addon-in-nvda). - ## Get started with MathCAT Use your screen reader on a web page or in an e-book as usual. When you get to a mathematical expression, the screen reader will read it out automatically. If you want to investigate the expression more closely you can activate the navigation mode by pressing Space. In NVDA, the NVDA-key+Alt+M can also be used. If you want to leave the navigation mode, press Escape. @@ -139,42 +137,4 @@ Note: tabular math means mathematical content in a table structure such as a mat ## Do you have feedback on MathCAT? -MathCAT is under active development, and we want your feedback. Do you have a feature request, or have you found any bugs? Please create an issue on [MathCAT's GitHub page](https://github.com/daisy/MathCAT/issues). You are also welcome to get in touch by signing up to [the mailing list of the DAISY MathCAT working group](https://www.surveymonkey.com/r/HXTLXGN). - -## How to install MathCAT as an addon in NVDA - -To use MathCAT as an add-on, do the following: - -1. Open the NVDA menu. -2. Choose Tools and then Add-on store. -3. In the add-on store, choose Available add-ons. - - The channel settings have the following options: - - Stable: Will only search for stable add-ons - - All: Will search for all add-ons - - Beta: Will search for add-ons that are in beta - - Dev: Will search for add-ons in development - - Choose option "All". - -4. Search for MathCAT and install. - -5. In the settings menu, you can control how add-ons are updated: - - - Open the NVDA menu - - Choose settings and Add-on Store - - For Automatic updates, you can choose between: - - Notify - - Update Automatically - - Deactivated - - For Default update channel, you have the following options: - - - Same: If automatic updates is set to “Update Automatically” and your add-on is a beta, it will update to the first available beta. - - Any: It will update to any version of the add-on. - - Do not update - - Stable: It will only update to stable versions. - - Beta or dev: It will update to beta or dev versions. - - Beta: It will update to beta versions. - - Dev: It will update to dev versions. \ No newline at end of file +MathCAT is under active development, and we want your feedback. Do you have a feature request, or have you found any bugs? Please create an issue on [MathCAT's GitHub page](https://github.com/daisy/MathCAT/issues). You are also welcome to get in touch by signing up to [the mailing list of the DAISY MathCAT working group](https://www.surveymonkey.com/r/HXTLXGN). \ No newline at end of file diff --git a/src/braille.rs b/src/braille.rs index 1966f09c0..4f0ac0ec7 100644 --- a/src/braille.rs +++ b/src/braille.rs @@ -15,6 +15,7 @@ use crate::canonicalize::get_parent; use std::borrow::Cow; use std::ops::Range; use std::sync::LazyLock; +#[allow(unused_imports)] use log::{debug, error}; fn is_ueb_prefix(ch: char) -> bool { @@ -1047,11 +1048,9 @@ fn ueb_cleanup(pref_manager: Ref, raw_braille: String) -> Str let use_only_grade1 = pref_manager.pref_to_string("UEB_START_MODE").as_str() == "Grade1"; - // '𝐖' is a hard break -- basically, it separates exprs - let mut result = result.split('𝐖') - .map(|str| pick_start_mode(str, use_only_grade1) + "W") - .collect::(); - result.pop(); // we added a 'W' at the end that needs to be removed. + // 𝐖 is a unit hard-break. For GTM 1.7 it is still a symbols-sequence boundary (same as W), + // so G1 passage decisions (1.7.3(b) / 1.7.5(c)) see the whole expression. + let result = pick_start_mode(&result, use_only_grade1); let result = result.replace("tW", "W"); @@ -1067,42 +1066,42 @@ fn ueb_cleanup(pref_manager: Ref, raw_braille: String) -> Str return result.to_string(); fn pick_start_mode(raw_braille: &str, use_only_grade1: bool) -> String { - // Need to decide what the start mode should be - // From http://www.brailleauthority.org/ueb/ueb_math_guidance/final_for_posting_ueb_math_guidance_may_2019_102419.pdf - // Unless a math expression can be correctly represented with only a grade 1 symbol indicator in the first three cells - // or before a single letter standing alone anywhere in the expression, - // begin the expression with a grade 1 word indicator (or a passage indicator if the expression includes spaces) - // Apparently "only a grade 1 symbol..." means at most one grade 1 symbol based on some examples (GTM 6.4, example 4) + // Decide grade 1 indicator placement per ICEB GTM 1.7 (2025). + // BANA's 2026 guidance adopts the same GTM §1.7 rules: + // https://www.brailleauthority.org/sites/default/files/2026-07/Guidance%20on%20Transcribing%20Math%20and%20Science%20in%20UEB%202026.pdf + // GTM 1.7.3 decides indicators per *symbols-sequence* (RUEB 2.1 -- text separated by spaces): + // (a) allow one grade 1 symbol per symbols-sequence, or a grade 1 word indicator if a sequence needs more than one; + // (b) use a grade 1 passage only if three or more symbols-sequences each need a grade 1 symbol or word indicator. + // Grade 1 symbol indicators forced by 'a-j' following a digit are not counted (GTM 1.7.3 note). // debug!("before determining mode: '{}'", raw_braille); - // a bit ugly because we need to store the string if we have cap passage mode - let raw_braille_string = if is_cap_passage_mode_good(raw_braille) {convert_to_cap_passage_mode(raw_braille)} else {String::default()}; - let raw_braille = if raw_braille_string.is_empty() {raw_braille} else {&raw_braille_string}; - if use_only_grade1 { - return remove_unneeded_mode_changes(raw_braille, UEB_Mode::Grade1, UEB_Duration::Passage); - } - let grade2 = remove_unneeded_mode_changes(raw_braille, UEB_Mode::Grade2, UEB_Duration::Symbol); - debug!("Symbol mode: '{}'", grade2); - - if is_grade2_string_ok(&grade2) { - return grade2; + // Capital passage (RUEB §8.5): like word mode's extra 'C' (CC
), passage uses CCC
Ce. + // Count G1 on the original (with capital markers) so standing-alone letters still force + // passage when needed (BANA Ex 5-15), but apply mode changes after stripping C/đ¶ so + // Grade 2 contractions are not blocked by cap_word_mode (chem "ch" → â Ą). + let had_unit_break = raw_braille.contains('𝐖'); + let raw_braille = raw_braille.replace('𝐖', "W"); + let use_cap_passage = is_cap_passage_mode_good(&raw_braille); + let stripped_caps = raw_braille.replace(['C', 'đ¶'], ""); + let apply_to = if use_cap_passage { stripped_caps.as_str() } else { raw_braille.as_str() }; + let result = if use_only_grade1 { + remove_unneeded_mode_changes(apply_to, UEB_Mode::Grade1, UEB_Duration::Passage) } else { - // BANA says use g1 word mode if spaces are present, but that's not what their examples do - // A conversation with Ms. DeAndrea from BANA said that they mean use passage mode if ≄3 "segments" (≄2 blanks) - // The G1 Word mode might not be at the start (iceb.rs:omission_3_6_7) - let grade1_word = try_grade1_word_mode(raw_braille); - debug!("Word mode: '{}'", grade1_word); - if !grade1_word.is_empty() { - return grade1_word; - } else { - let grade1_passage = remove_unneeded_mode_changes(raw_braille, UEB_Mode::Grade1, UEB_Duration::Passage); - return "â °â °â °".to_string() + &grade1_passage + "⠰⠄"; - } + gtm_1_7_mode(&raw_braille, apply_to, had_unit_break) + }; + if use_cap_passage { + return convert_to_cap_passage_mode(&result); } + return result; - /// Return true if at least five (= # of cap passage indicators) cap indicators and no lower case letters + /// Return true if capital passage mode should be used (RUEB §8.5 / BANA Ex 5-15). + /// Requires no lowercase letters, and either ≄5 capital indicators (chem / dense caps) + /// or ≄3 letter-bearing symbols-sequences that are fully capitalized. + /// Grade 1 / numeric / other non-letter markers are transparent (do not abort the scan). fn is_cap_passage_mode_good(braille: &str) -> bool { let mut n_caps = 0; + let mut n_letter_seqs = 0; + let mut seq_has_letter = false; let mut is_cap_mode = false; let mut cap_mode = UEB_Duration::Symbol; // real value set when is_cap_mode is set to true let mut chars = braille.chars(); @@ -1115,6 +1114,7 @@ fn ueb_cleanup(pref_manager: Ref, raw_braille: String) -> Str if !is_cap_mode { return false; } + seq_has_letter = true; chars.next(); // skip letter if cap_mode == UEB_Duration::Symbol { is_cap_mode = false; @@ -1130,76 +1130,33 @@ fn ueb_cleanup(pref_manager: Ref, raw_braille: String) -> Str } n_caps += 1; } else if ch == 'W' || ch == '𝐖' { - if is_cap_mode { - assert!(cap_mode == UEB_Duration::Word); + if seq_has_letter { + n_letter_seqs += 1; + seq_has_letter = false; } is_cap_mode = false; - } else if ch == '1' && is_cap_mode { - break; } + // else: '1', '𝟙', 'N', operators, typeforms, etc. — transparent } - return n_caps > 4; + if seq_has_letter { + n_letter_seqs += 1; + } + return n_caps >= 5 || n_letter_seqs >= 3; } + /// After G1 placement: strip any leftover capital markers and wrap with intermediate + /// `CCC`
`Ce` (same map as word mode: C→⠠, e→⠄ → ⠠⠠⠠
⠠⠄). Applied after + /// remove_unneeded_mode_changes so parsers never treat passage opener as CL letters. + /// If G1 passage is present (⠰⠰⠰
⠰⠄), capital passage goes inside (BANA Ex 5-15). fn convert_to_cap_passage_mode(braille: &str) -> String { - return "â  â  â  ".to_string() + &braille.replace(['C', 'đ¶'], "") + "⠠⠄"; - } - - /// Return true if the BANA or ICEB guidelines say it is ok to start with grade 2 - fn is_grade2_string_ok(grade2_braille: &str) -> bool { - // BANA says use grade 2 if there is not more than one grade one symbol or single letter standing alone. - // The exact quote from their guidance: - // Unless a math expression can be correctly represented with only a grade 1 symbol indicator in the first three cells - // or before a single letter standing alone anywhere in the expression, - // begin the expression with a grade 1 word indicator - // Note: I modified this slightly to exclude the cap indicator in the count. That allows three more ICEB rule to pass and seems - // like it is a reasonable thing to do. - // Another modification is allow a single G1 indicator to occur after whitespace later on - // because ICEB examples show it and it seems better than going to passage mode if it is the only G1 indicator - - // Because of the 'L's which go away, we have to put a little more work into finding the first three chars - let chars = grade2_braille.chars().collect::>(); - let mut n_real_chars = 0; // actually number of chars - let mut found_g1 = false; - let mut i = 0; - while i < chars.len() { - let ch = chars[i]; - if ch == '1' && !is_forced_grade1(&chars, i) { - if found_g1 { - return false; - } - found_g1 = true; - } else if !"đ¶CLobc".contains(ch) { - if n_real_chars == 2 { - i += 1; - break; // this is the third real char - }; - n_real_chars += 1; - } - i += 1 - } - - // if we find *another* g1 that isn't forced and isn't standing alone, we are done - // I've added a 'follows whitespace' clause for test iceb.rs:omission_3_6_2 to the standing alone rule - // we only allow one standing alone example -- not sure if BANA guidance has this limit, but GTM 11_5_5_3 seems better with it - // Same for GTM 1_7_3_1 (passage mode is mentioned also) - let mut is_standing_alone_already_encountered = false; - let mut is_after_whitespace = false; - while i < chars.len() { - let ch = chars[i]; - if ch == 'W' { - is_after_whitespace = true; - } else if ch == '1' && !is_forced_grade1(&chars, i) { - if is_standing_alone_already_encountered || - ((found_g1 || !is_after_whitespace) && !is_single_letter_on_right(&chars, i)) { - return false; - } - found_g1 = true; - is_standing_alone_already_encountered = true; + let body = braille.replace(['C', 'đ¶'], ""); + const G1_START: &str = "â °â °â °"; + const G1_END: &str = "⠰⠄"; + if let Some(rest) = body.strip_prefix(G1_START) + && let Some(mid) = rest.strip_suffix(G1_END) { + return format!("{G1_START}CCC{mid}Ce{G1_END}"); } - i += 1; - } - return true; + return format!("CCC{body}Ce"); } /// Return true if the sequence of chars forces a '1' at the `i`th position @@ -1221,56 +1178,139 @@ fn ueb_cleanup(pref_manager: Ref, raw_braille: String) -> Str return false; } - fn is_single_letter_on_right(chars: &[char], i: usize) -> bool { - fn is_skip_char(ch: char) -> bool { - matches!(ch, 'B' | 'I' | 'đ”č' | 'S' | 'T' | 'D' | 'C' | 'đ¶' | 's' | 'w') - } + /// Count the number of non-forced grade 1 indicators needed for a single symbols-sequence. + /// (Forced indicators -- 'a-j' following a digit -- are excluded per the GTM 1.7.3 note.) + fn grade1_count(raw_word: &str) -> usize { + let grade2 = remove_unneeded_mode_changes(raw_word, UEB_Mode::Grade2, UEB_Duration::Symbol); + let chars = grade2.chars().collect::>(); + return chars.iter().enumerate() + .filter(|&(i, &ch)| ch == '1' && !is_forced_grade1(&chars, i)) + .count(); + } - // find the first char (if any) - let mut count = 0; // how many letters - let mut i = i+1; + /// True if this symbols-sequence contains a literary English word (4+ letters). + /// GTM 1.7.5: short math names (sin, cos, lim, min, 
) and single-letter variables + /// are not treated as words. + fn sequence_contains_word(raw_word: &str) -> bool { + let chars: Vec = raw_word.chars().collect(); + let mut run = 0usize; + let mut i = 0usize; while i < chars.len() { let ch = chars[i]; - if !is_skip_char(ch) { - if ch == 'L' { - if count == 1 { - return false; // found a second letter in the sequence - } - count += 1; - } else { - return count==1; + if ch == 'L' { + run += 1; + i += 1; + if i < chars.len() { + i += 1; // skip the braille cell after 'L' + } + if run >= 4 { + return true; } - i += 2; // eat 'L' and actual letter + } else if ch == 'A' { + run += 1; + i += 1; + if run >= 4 { + return true; + } + } else if is_math_alphabet_typeform(ch) { + // Double-struck/script/fraktur/sans-serif letters are not part of an English word. + let end = math_typeform_item_end(&chars, i); + i = if end > i { end } else { i + 1 }; + run = 0; + } else if matches!(ch, 'C' | 'đ¶' | 'G' | 'V' | 'B' | 'I' | 's' | 'w' | 'e') { + i += 1; // letter prefixes / literary typeform — do not break the run } else { + run = 0; i += 1; } } - return true; + false + } + + /// G2 form of a general-fraction sequence when two symbol indicators keep words + /// contracted (GTM 1.7.5(a)). `None` if more than two G1 symbols would remain. + fn g2_two_symbol_form(raw_word: &str) -> Option { + // Only the GTM 1.7.5(a) case: a general fraction whose numerator/denominator + // contain literary words. Superscripts, radicals, etc. keep 1.7.3 word indicators. + if !(raw_word.contains('â ·') && raw_word.contains("⠹⠌")) { + return None; + } + let g2 = remove_unneeded_mode_changes(raw_word, UEB_Mode::Grade2, UEB_Duration::Symbol); + let chars: Vec = g2.chars().collect(); + let n_g1 = chars.iter().enumerate() + .filter(|&(i, &ch)| ch == '1' && !is_forced_grade1(&chars, i)) + .count(); + if n_g1 <= 2 { + Some(g2) + } else { + None + } } - fn try_grade1_word_mode(raw_braille: &str) -> String { - // this isn't quite right, but pretty close -- try splitting at 'W' (words) - // only one of the parts can be in word mode and none of the others can have '1' unless forced - let mut g1_words = Vec::default(); - let mut found_word_mode = false; - for raw_word in raw_braille.split('W') { - let word = remove_unneeded_mode_changes(raw_word, UEB_Mode::Grade2, UEB_Duration::Symbol); - // debug!("try_grade1_word_mode: word='{}'", word); - let word_chars = word.chars().collect::>(); - let needs_word_mode = word_chars.iter().enumerate() - .any(|(i, &ch) | ch == '1' && !is_forced_grade1(&word_chars, i)); - if needs_word_mode { - if found_word_mode { - return "".to_string(); + /// ICEB GTM 1.7 grade 1 indicator placement (per symbols-sequence). + /// GTM 1.7.3: one grade 1 symbol per sequence, or a word indicator if more than one. + /// GTM 1.7.5(a): for a sequence containing word(s), allow two grade 1 symbol + /// indicators when that keeps the words in their usual contracted form + /// (e.g. ⠷ ⠟ around work/distance). More than two still uses a word indicator. + /// `count_src` decides passage vs word vs symbol; changes are applied to `apply_to` + /// (may differ when capital markers were stripped for capital-passage mode). + fn gtm_1_7_mode(count_src: &str, apply_to: &str, had_unit_break: bool) -> String { + let count_words: Vec<&str> = count_src.split('W').collect(); + let apply_words: Vec<&str> = apply_to.split('W').collect(); + assert_eq!(count_words.len(), apply_words.len(), + "gtm_1_7_mode: count_src and apply_to must have the same number of symbols-sequences"); + + // Count how many symbols-sequences (whitespace-separated) need a non-forced grade 1 indicator. + let n_seq_needing = count_words.iter().filter(|raw_word| grade1_count(raw_word) >= 1).count(); + + // GTM 1.7.3(b) / 1.7.5(c): use a grade 1 passage if three or more sequences + // each need grade 1. 1.7.5(c) starts the passage at the first such sequence so + // preceding words (e.g. "speed") stay contracted. That delayed start is used when + // spaced units (𝐖) joined the expression; otherwise a passage wraps the whole + // expression (chem, roots, labelled equations). + if n_seq_needing >= 3 { + let first = count_words.iter().position(|w| grade1_count(w) >= 1) + .expect("n_seq_needing >= 3 implies a sequence that needs grade 1"); + let delay_start = had_unit_break && first > 0; + if delay_start { + let prefix: Vec = apply_words[..first].iter() + .map(|w| remove_unneeded_mode_changes(w, UEB_Mode::Grade2, UEB_Duration::Symbol)) + .collect(); + let rest = apply_words[first..].join("W"); + let passage = remove_unneeded_mode_changes(&rest, UEB_Mode::Grade1, UEB_Duration::Passage); + let mut out = prefix.join("W"); + if !out.is_empty() { + out.push('W'); } - found_word_mode = true; - g1_words.push("â °â °".to_string() + &remove_unneeded_mode_changes(raw_word, UEB_Mode::Grade1, UEB_Duration::Word) - ); - } else { - g1_words.push(word); + out.push_str("â °â °â °"); + out.push_str(&passage); + out.push_str("⠰⠄"); + return out; } + let grade1_passage = remove_unneeded_mode_changes(apply_to, UEB_Mode::Grade1, UEB_Duration::Passage); + return "â °â °â °".to_string() + &grade1_passage + "⠰⠄"; } - return if found_word_mode {g1_words.join("W")} else {"".to_string()}; + + // GTM 1.7.3(a): per sequence, allow one grade 1 symbol indicator, or a grade 1 word + // indicator if the sequence needs more than one. + let words = count_words.iter().zip(apply_words.iter()) + .map(|(&count_word, &apply_word)| { + let n_g1 = grade1_count(count_word); + if n_g1 >= 2 { + // GTM 1.7.5(a): two symbol indicators if that preserves contractions + if sequence_contains_word(count_word) + && let Some(g2) = g2_two_symbol_form(apply_word) { + g2 + } else { + "â °â °".to_string() + &remove_unneeded_mode_changes(apply_word, UEB_Mode::Grade1, UEB_Duration::Word) + } + } else { + // 0 or 1 grade 1 indicators: the grade 2 form leaves a single symbol indicator inline + remove_unneeded_mode_changes(apply_word, UEB_Mode::Grade2, UEB_Duration::Symbol) + } + }) + .collect::>(); + return words.join("W"); } } } @@ -1510,6 +1550,93 @@ fn is_left_intervening_char(ch: char) -> bool { matches!(ch, 'B' | 'I' | 'đ”č' | 'S' | 'T' | 'D' | 'C' | 'đ¶' | 's' | 'w') } +/// Double-struck / script / fraktur / sans-serif: math alphabets, not literary emphasis. +fn is_math_alphabet_typeform(ch: char) -> bool { + matches!(ch, 'đ”č' | 'T' | 'D' | 'S') +} + +/// Advance past one letter with optional capital, Greek, and accent prefixes (`C? G|V? A
? L cell`). +fn skip_one_prefixed_letter(chars: &[char], mut i: usize) -> usize { + if i >= chars.len() { + return i; + } + if matches!(chars[i], 'C' | 'đ¶') { + i += 1; + } + if i < chars.len() && matches!(chars[i], 'G' | 'V') { + i += 1; + } + if i < chars.len() && chars[i] == 'A' { + match index_after_accent_to_l(chars, i + 1) { + Some(i_l) => i = i_l, + None => return i, + } + } + if i < chars.len() && chars[i] == 'L' { + i += 1; + if i < chars.len() { + i += 1; // braille cell + } + } + i +} + +/// End index of a math-alphabet typeform item starting at `i` (`đ”č`/`T`/`D`/`S`). +/// `s` covers one letter; `w` covers the typeform word until its terminator. +fn math_typeform_item_end(chars: &[char], i: usize) -> usize { + if i >= chars.len() || !is_math_alphabet_typeform(chars[i]) { + return i; + } + let typeform = chars[i]; + let mut j = i + 1; + let word_mode = j < chars.len() && chars[j] == 'w'; + if j < chars.len() && matches!(chars[j], 's' | 'w') { + j += 1; + } + if word_mode { + loop { + let next = skip_one_prefixed_letter(chars, j); + if next == j { + break; + } + j = next; + } + if j + 1 < chars.len() && chars[j] == typeform && chars[j + 1] == 'e' { + j += 2; + } else if j < chars.len() && chars[j] == 'e' { + j += 1; + } + return j; + } + return skip_one_prefixed_letter(chars, j); +} + +/// RUEB 10.6.2: lower groupsigns "be", "con", "dis" only at the beginning of a word. +/// Beginning of a word = letters-sequence after space, hyphen or dash, optionally with +/// intervening punctuation/indicators from RUEB 2.6.2 (opening brackets/quotes, typeform, +/// capitals). Math operators and fraction indicators are not word boundaries. +/// `word_start` is the index of the first char of a grade-2 letter run ('L', 'C', or 'A'). +fn allows_lower_word_sign_at(chars: &[char], word_start: usize) -> bool { + if word_start >= chars.len() { + return false; + } + if word_start == 0 { + return true; + } + let mut j = word_start; + while j > 0 { + j -= 1; + let ch = chars[j]; + // 2.6.2 intervening symbols (opening punctuation flags, typeform, capitals, etc.) + if is_left_intervening_char(ch) || matches!(ch, 'e' | 'c' | 's' | 'w' | 'o' | 'b' | 'G' | 'V') { + continue; + } + // Must be space, hyphen or dash (RUEB 10.6.2 Note) + return "W𝐖-—―".contains(ch); + } + true +} + /// Return value for use_g1_word_mode() #[derive(Debug, PartialEq)] enum Grade1WordIndicator { @@ -1677,6 +1804,34 @@ fn remove_unneeded_mode_changes(raw_braille: &str, start_mode: UEB_Mode, start_d } // debug!("Grade 2: ch={}, duration: {:?}", ch, duration); match ch { + 'đ”č' | 'T' | 'D' | 'S' => { + // Math-alphabet typeform: this letter is not part of an English word + // (GTM 11.6). Close any current contraction run, emit the typeform + // item on its own, then let following letters start a new word. + if let Some(start) = start_g2_letter { + if !cap_word_mode { + result = handle_contractions(&chars, start, i, result); + } + cap_word_mode = false; + start_g2_letter = None; + } + let unit_end = math_typeform_item_end(&chars, i); + // Typeform prefix (`đ”čs`) must precede the grade 1 indicator: ⠈⠆⠰⠠⠗, not ⠰⠈⠆⠠⠗. + let mut letter_start = i + 1; + if letter_start < unit_end && matches!(chars[letter_start], 's' | 'w') { + letter_start += 1; + } + result.extend(chars[i..letter_start].iter().copied()); + if let Some(letter_idx) = chars[i..unit_end].iter().position(|&c| c == 'L') { + let (is_alone, _, n_letters) = stands_alone(&chars, i + letter_idx); + if is_alone && n_letters == 1 { + result.push('1'); + mode = UEB_Mode::Grade1; + } + } + result.extend(chars[letter_start..unit_end].iter().copied()); + i = unit_end; + }, 'L' => { if start_g2_letter.is_none() { start_g2_letter = Some(i); @@ -1758,6 +1913,16 @@ fn remove_unneeded_mode_changes(raw_braille: &str, start_mode: UEB_Mode, start_d } }, '1' => { + // Contract the preceding letter run before consuming '1'. The '1' arm used + // to increment first, so handle_contractions saw "work1" and the whole-word + // patterns `^work$` / `^time$` failed (GTM 1.7.9 work/distance, 1.7.5(a) time). + if let Some(start) = start_g2_letter { + if !cap_word_mode { + result = handle_contractions(&chars, start, i, result); + } + cap_word_mode = false; + start_g2_letter = None; + } result.push(ch); i += 1; mode = UEB_Mode::Grade1; @@ -1778,7 +1943,7 @@ fn remove_unneeded_mode_changes(raw_braille: &str, start_mode: UEB_Mode, start_d _ => { if let Some(start) = start_g2_letter { if !cap_word_mode { - result = handle_contractions(&chars[start..i], result); + result = handle_contractions(&chars, start, i, result); } cap_word_mode = false; start_g2_letter = None; // not start of char sequence @@ -1794,7 +1959,7 @@ fn remove_unneeded_mode_changes(raw_braille: &str, start_mode: UEB_Mode, start_d } if mode != UEB_Mode::Grade2 && !cap_word_mode && let Some(start) = start_g2_letter { - result = handle_contractions(&chars[start..i], result); + result = handle_contractions(&chars, start, i, result); start_g2_letter = None; // not start of char sequence } }, @@ -1814,7 +1979,7 @@ fn remove_unneeded_mode_changes(raw_braille: &str, start_mode: UEB_Mode, start_d } if mode == UEB_Mode::Grade2 && let Some(start) = start_g2_letter { - result = handle_contractions(&chars[start..i], result); + result = handle_contractions(&chars, start, i, result); } return result; @@ -1946,10 +2111,12 @@ fn stands_alone(chars: &[char], i: usize) -> (bool, &[char], usize) { /// Return a modified result if chars can be contracted. /// Otherwise, the original string is returned -fn handle_contractions(chars: &[char], mut result: String) -> String { +fn handle_contractions(full_chars: &[char], start: usize, end: usize, mut result: String) -> String { struct Replacement { pattern: String, - replacement: &'static str + replacement: &'static str, + skip_if_word_in: Option<&'static phf::Set<&'static str>>, + word_start_only: bool, } const ASCII_TO_UNICODE: &[char] = &[ @@ -1968,47 +2135,95 @@ fn handle_contractions(chars: &[char], mut result: String) -> String { return unicode; } + // Whole words where the lower groupsign 'cc' must not apply (10.11.1 compound/function names). + static CC_EXCEPTION_WORDS: phf::Set<&str> = phf_set! { + "L⠁L⠗L⠉L⠉L⠕L⠎", // arccos + "L⠁L⠗L⠉L⠉L⠕L⠎L⠊L⠝L⠑", // arccosine + "L⠁L⠗L⠉L⠉L⠕L⠎L⠓", // arccosh + "L⠁L⠗L⠉L⠉L⠕L⠎L⠑L⠉", // arccosec + "L⠁L⠗L⠉L⠉L⠕L⠎L⠑L⠉L⠁L⠝L⠞", // arccosecant + "L⠁L⠗L⠉L⠉L⠕L⠞", // arccot + "L⠁L⠗L⠉L⠉L⠕L⠞L⠁L⠝L⠛L⠑L⠝L⠞", // arccotangent + "L⠁L⠗L⠉L⠉L⠎L⠉", // arccsc + }; + + // Words where the 'ea' lower groupsign must not apply (re- prefix morpheme boundary). + static EA_EXCEPTION_WORDS: phf::Set<&str> = phf_set! { + "L⠗L⠑L⠁L⠉L⠞L⠁L⠝L⠉L⠑", // reactance + "L⠗L⠑L⠁L⠉L⠞L⠊L⠕L⠝", // reaction + "L⠗L⠑L⠁L⠉L⠞L⠊Lâ §L⠊L⠞Lâ œ", // reactivity + }; + + // Words where "be" is not the first syllable (RUEB 10.6.1 "But:" cases and similar). + static BE_EXCEPTION_WORDS: phf::Set<&str> = phf_set! { + "L⠃L⠑L⠁L⠗L⠊L⠝L⠛", // bearing + "L⠃L⠑L⠝L⠉L⠓L⠍L⠁L⠗L⠅", // benchmark + }; + // It would be much better from an extensibility point of view to read the table in from a file static CONTRACTIONS: LazyLock> = LazyLock::new(|| { vec![ + // 10.9: initial-letter (dot-5) wordsigns -- whole word only + Replacement{ pattern: format!("^{}$", to_unicode_braille("time")), replacement: "⠐⠞", skip_if_word_in: None, word_start_only: false }, + Replacement{ pattern: format!("^{}$", to_unicode_braille("work")), replacement: "⠐â ș", skip_if_word_in: None, word_start_only: false }, + Replacement{ pattern: format!("^{}$", to_unicode_braille("leverage")), replacement: "⠇⠐⠑⠁⠛⠑", skip_if_word_in: None, word_start_only: false }, + + // 10.7.1: dot-5 initial-letter contractions (as wordsigns / groupsigns) + Replacement{ pattern: format!("^{}", to_unicode_braille("through")), replacement: "⠐â č", skip_if_word_in: None, word_start_only: false }, + Replacement{ pattern: format!("(?PL.){}(?PL.)", to_unicode_braille("part")), replacement: "${s}⠐⠏${e}", skip_if_word_in: None, word_start_only: false }, + // 10.3: Strong contractions - Replacement{ pattern: to_unicode_braille("and"), replacement: "Lâ Ż"}, - Replacement{ pattern: to_unicode_braille("for"), replacement: "Lâ ż"}, - Replacement{ pattern: to_unicode_braille("of"), replacement: "Lâ ·"}, - Replacement{ pattern: to_unicode_braille("the"), replacement: "Lâ ź"}, - Replacement{ pattern: to_unicode_braille("with"), replacement: "Lâ Ÿ"}, + Replacement{ pattern: to_unicode_braille("and"), replacement: "Lâ Ż", skip_if_word_in: None, word_start_only: false }, + Replacement{ pattern: to_unicode_braille("for"), replacement: "Lâ ż", skip_if_word_in: None, word_start_only: false }, + Replacement{ pattern: to_unicode_braille("of"), replacement: "Lâ ·", skip_if_word_in: None, word_start_only: false }, + Replacement{ pattern: to_unicode_braille("the"), replacement: "Lâ ź", skip_if_word_in: None, word_start_only: false }, + Replacement{ pattern: to_unicode_braille("with"), replacement: "Lâ Ÿ", skip_if_word_in: None, word_start_only: false }, + + // 10.6.1-10.6.4 / 10.10.4: lower groupsigns be/con/dis -- only at word start, + // and preferred over other groupsigns (e.g. "distance" is â Č⠞⠹⠑, not di+st+ance). + Replacement{ pattern: format!("^{}", to_unicode_braille("be")), replacement: "⠆", skip_if_word_in: Some(&BE_EXCEPTION_WORDS), word_start_only: true }, + Replacement{ pattern: format!("^{}", to_unicode_braille("con")), replacement: "⠒", skip_if_word_in: None, word_start_only: true }, + Replacement{ pattern: format!("^{}", to_unicode_braille("dis")), replacement: "â Č", skip_if_word_in: None, word_start_only: true }, - // 10.8: final-letter group signs (this need to precede 'en' and any other shorter contraction) - Replacement{ pattern: "(?PL.)L⠍L⠑L⠝L⠞".to_string(), replacement: "${s}Lâ °L⠞" }, // ment - Replacement{ pattern: "(?PL.)L⠞L⠊L⠕L⠝".to_string(), replacement: "${s}Lâ °L⠝" } ,// tion + // 10.8: final-letter group signs (these need to precede 'en' and any other shorter contraction) + Replacement{ pattern: "(?PL.)L⠍L⠑L⠝L⠞".to_string(), replacement: "${s}Lâ °L⠞", skip_if_word_in: None, word_start_only: false }, // ment + Replacement{ pattern: "(?PL.)L⠞L⠊L⠕L⠝".to_string(), replacement: "${s}Lâ °L⠝", skip_if_word_in: None, word_start_only: false }, // tion + Replacement{ pattern: "(?PL.)L⠊L⠞Lâ œ".to_string(), replacement: "${s}Lâ °Lâ œ", skip_if_word_in: None, word_start_only: false }, // ity + Replacement{ pattern: "(?PL.)L⠁L⠝L⠉L⠑".to_string(), replacement: "${s}Lâ šL⠑", skip_if_word_in: None, word_start_only: false }, // ance + Replacement{ pattern: "(?PL.)L⠎L⠊L⠕L⠝".to_string(), replacement: "${s}Lâ šL⠝", skip_if_word_in: None, word_start_only: false }, // sion + Replacement{ pattern: "(?PL.)L⠑L⠝L⠉L⠑".to_string(), replacement: "${s}Lâ °L⠑", skip_if_word_in: None, word_start_only: false }, // ence + Replacement{ pattern: "(?PL.)L⠝L⠑L⠎L⠎".to_string(), replacement: "${s}Lâ °L⠎", skip_if_word_in: None, word_start_only: false }, // ness + Replacement{ pattern: "(?PL.)L⠕Lâ „L⠝L⠙".to_string(), replacement: "${s}Lâ šL⠙", skip_if_word_in: None, word_start_only: false }, // ound + Replacement{ pattern: "(?PL.)L⠕Lâ „L⠝L⠞".to_string(), replacement: "${s}Lâ šL⠞", skip_if_word_in: None, word_start_only: false }, // ount + Replacement{ pattern: "(?PL.)L⠇L⠑L⠎L⠎".to_string(), replacement: "${s}Lâ šL⠎", skip_if_word_in: None, word_start_only: false }, // less + Replacement{ pattern: "(?PL.)L⠕L⠝L⠛".to_string(), replacement: "${s}Lâ °L⠛", skip_if_word_in: None, word_start_only: false }, // ong + Replacement{ pattern: "(?PL.)L⠋Lâ „L⠇".to_string(), replacement: "${s}Lâ °L⠇", skip_if_word_in: None, word_start_only: false }, // ful // 10.4: Strong group signs - Replacement{ pattern: to_unicode_braille("ch"), replacement: "Lâ Ą"}, - Replacement{ pattern: to_unicode_braille("gh"), replacement: "Lâ Ł"}, - Replacement{ pattern: to_unicode_braille("sh"), replacement: "Lâ ©"}, - Replacement{ pattern: to_unicode_braille("th"), replacement: "Lâ č"}, - Replacement{ pattern: to_unicode_braille("wh"), replacement: "Lâ ±"}, - Replacement{ pattern: to_unicode_braille("ed"), replacement: "Lâ «"}, - Replacement{ pattern: to_unicode_braille("er"), replacement: "Lâ »"}, - Replacement{ pattern: to_unicode_braille("ou"), replacement: "Lâ ł"}, - Replacement{ pattern: to_unicode_braille("ow"), replacement: "Lâ Ș"}, - Replacement{ pattern: to_unicode_braille("st"), replacement: "L⠌"}, - Replacement{ pattern: "(?PL.)L⠊L⠝L⠛".to_string(), replacement: "${s}Lâ Ź" }, // 'ing', not at start - Replacement{ pattern: to_unicode_braille("ar"), replacement: "L⠜"}, + Replacement{ pattern: to_unicode_braille("ch"), replacement: "Lâ Ą", skip_if_word_in: None, word_start_only: false }, + Replacement{ pattern: to_unicode_braille("gh"), replacement: "Lâ Ł", skip_if_word_in: None, word_start_only: false }, + Replacement{ pattern: to_unicode_braille("sh"), replacement: "Lâ ©", skip_if_word_in: None, word_start_only: false }, + Replacement{ pattern: to_unicode_braille("th"), replacement: "Lâ č", skip_if_word_in: None, word_start_only: false }, + Replacement{ pattern: to_unicode_braille("wh"), replacement: "Lâ ±", skip_if_word_in: None, word_start_only: false }, + Replacement{ pattern: to_unicode_braille("ed"), replacement: "Lâ «", skip_if_word_in: None, word_start_only: false }, + Replacement{ pattern: to_unicode_braille("er"), replacement: "Lâ »", skip_if_word_in: None, word_start_only: false }, + Replacement{ pattern: to_unicode_braille("ou"), replacement: "Lâ ł", skip_if_word_in: None, word_start_only: false }, + Replacement{ pattern: to_unicode_braille("ow"), replacement: "Lâ Ș", skip_if_word_in: None, word_start_only: false }, + Replacement{ pattern: to_unicode_braille("st"), replacement: "L⠌", skip_if_word_in: None, word_start_only: false }, + Replacement{ pattern: "(?PL.)L⠊L⠝L⠛".to_string(), replacement: "${s}Lâ Ź", skip_if_word_in: None, word_start_only: false }, // 'ing', not at start + Replacement{ pattern: to_unicode_braille("ar"), replacement: "L⠜", skip_if_word_in: None, word_start_only: false }, // 10.6.5: Lower group signs preceded and followed by letters // FIX: don't match if after/before a cap letter -- can't use negative pattern (?!...) in regex package - // Note: removed cc because "arccos" shouldn't be contracted (10.11.1), but there is no way to know about compound words - // Add it back after implementing a lookup dictionary of exceptions - Replacement{ pattern: "(?PL.)L⠑L⠁(?PL.)".to_string(), replacement: "${s}L⠂${e}" }, // ea - Replacement{ pattern: "(?PL.)L⠃L⠃(?PL.)".to_string(), replacement: "${s}L⠆${e}" }, // bb - // Replacement{ pattern: "(?PL.)L⠉L⠉(?PL.)".to_string(), replacement: "${s}L⠒${e}" }, // cc - Replacement{ pattern: "(?PL.)L⠋L⠋(?PL.)".to_string(), replacement: "${s}L⠖${e}" }, // ff - Replacement{ pattern: "(?PL.)L⠛L⠛(?PL.)".to_string(), replacement: "${s}Lâ ¶${e}" }, // gg - - // 10.6.8: Lower group signs ("in" also 10.5.4 lower word signs) + Replacement{ pattern: "(?PL.)L⠑L⠁(?PL.)".to_string(), replacement: "${s}L⠂${e}", skip_if_word_in: Some(&EA_EXCEPTION_WORDS), word_start_only: false }, // ea + Replacement{ pattern: "(?PL.)L⠃L⠃(?PL.)".to_string(), replacement: "${s}L⠆${e}", skip_if_word_in: None, word_start_only: false }, // bb + Replacement{ pattern: "(?PL.)L⠉L⠉(?PL.)".to_string(), replacement: "${s}L⠒${e}", skip_if_word_in: Some(&CC_EXCEPTION_WORDS), word_start_only: false }, // cc + Replacement{ pattern: "(?PL.)L⠋L⠋(?PL.)".to_string(), replacement: "${s}L⠖${e}", skip_if_word_in: None, word_start_only: false }, // ff + Replacement{ pattern: "(?PL.)L⠛L⠛(?PL.)".to_string(), replacement: "${s}Lâ ¶${e}", skip_if_word_in: None, word_start_only: false }, // gg + + // 10.6.8: lower group signs; also 10.6.2 word signs when at word start ("sin", etc.) // FIX: these need restrictions about only applying when upper dots are present - Replacement{ pattern: to_unicode_braille("en"), replacement: "â ą"}, - Replacement{ pattern: to_unicode_braille("in"), replacement: "⠔"}, + Replacement{ pattern: to_unicode_braille("en"), replacement: "â ą", skip_if_word_in: None, word_start_only: false }, + Replacement{ pattern: to_unicode_braille("in"), replacement: "⠔", skip_if_word_in: None, word_start_only: false }, ] }); @@ -2016,11 +2231,28 @@ fn handle_contractions(chars: &[char], mut result: String) -> String { static CONTRACTION_PATTERNS: LazyLock = LazyLock::new(|| init_patterns(&CONTRACTIONS)); static CONTRACTION_REGEX: LazyLock> = LazyLock::new(|| init_regex(&CONTRACTIONS)); + let word_start_ok = allows_lower_word_sign_at(full_chars, start); + let chars = &full_chars[start..end]; + // A non-English letter glued to an English word (GTM 1.7.9 Δtime, or a + // double-struck/script/fraktur letter) is not part of the English + // letters-sequence; contract the following word on its own (time → ⠐⠞). + let skip = leading_non_word_letter_len(chars); + if skip > 0 && skip < chars.len() { + return handle_contractions(full_chars, start + skip, end, result); + } let mut chars_as_str = chars.iter().collect::(); + let original_chars_as_str = chars_as_str.clone(); // debug!(" handle_contractions: examine '{}'", &chars_as_str); let matches = CONTRACTION_PATTERNS.matches(&chars_as_str); for i in matches.iter() { let element = &CONTRACTIONS[i]; + if let Some(exceptions) = element.skip_if_word_in + && exceptions.contains(&original_chars_as_str) { + continue; + } + if element.word_start_only && !word_start_ok { + continue; + } // debug!(" replacing '{}' with '{}' in '{}'", element.pattern, element.replacement, &chars_as_str); result.truncate(result.len() - chars_as_str.len()); chars_as_str = CONTRACTION_REGEX[i].replace_all(&chars_as_str, element.replacement).to_string(); @@ -2031,6 +2263,31 @@ fn handle_contractions(chars: &[char], mut result: String) -> String { + fn leading_non_word_letter_len(chars: &[char]) -> usize { + if chars.is_empty() { + return 0; + } + if is_math_alphabet_typeform(chars[0]) { + let end = math_typeform_item_end(chars, 0); + return if end < chars.len() { end } else { 0 }; + } + let mut i = 0; + if i < chars.len() && matches!(chars[i], 'C' | 'đ¶') { + i += 1; + } + if i < chars.len() && matches!(chars[i], 'G' | 'V') { + i += 1; + if i < chars.len() && chars[i] == 'L' { + i += 1; + if i < chars.len() { + i += 1; // braille cell + } + return i; + } + } + 0 + } + fn init_patterns(contractions: &[Replacement]) -> RegexSet { let mut vec: Vec<&str> = Vec::with_capacity(contractions.len()); for contraction in contractions { @@ -3808,6 +4065,26 @@ mod tests { }); } + #[test] + fn ueb_lower_word_sign_contractions() -> Result<()> { + return braille_test(|| { + init_braille_mathml("distance")?; + set_preference("BrailleCode", "UEB")?; + let distance = get_braille("")?; + // RUEB 10.6.1 / 10.10.4: distance at word start uses dis lower groupsign + assert_eq!(distance, "â Č⠞⠹⠑", "dis lower groupsign at word start: got '{distance}'"); + // After fraction open (not a RUEB 10.6.2 word start), dis must not apply; st+ance may. + init_braille_mathml("distancetime")?; + let frac = get_braille("")?; + assert!(!frac.contains("â Č"), "dis wrongly used after fraction open: got '{frac}'"); + assert!(frac.contains("⠙⠊⠌⠹⠑") || frac.contains("⠙⠊⠎⠞⠁⠝⠉⠑"), + "expected st+ance or uncontracted distance after fraction open: got '{frac}'"); + init_braille_mathml("include")?; + assert!(get_braille("")?.starts_with("⠔"), "in lower groupsign at word start"); + return Ok(()); + }); + } + #[test] // This test probably should be repeated for each braille code and be taken out of here fn find_mathml_from_braille() -> Result<()> { @@ -3868,7 +4145,7 @@ mod tests { set_preference("BrailleCode", "UEB")?; let _braille = get_braille("")?; - let answers= &[0, 0, 0, 2, 3, 3, 3, 3, 4, 7, 7, 8, 9, 9, 10, 13, 12, 14, 14, 15, 15, 17, 17, 19, 19, 21, 10, 4, 4, 23, 23, 25, 25, 4, 0, 0]; + let answers= &[2, 2, 3, 3, 3, 3, 4, 4, 4, 7, 7, 8, 9, 9, 10, 13, 12, 14, 14, 15, 15, 17, 17, 19, 19, 21, 10, 4, 4, 23, 23, 25, 25, 4]; let answers = answers.map(|num| format!("id-{}", num)); debug!("\n\n*** Testing UEB ***"); for (i, answer) in answers.iter().enumerate() { @@ -3927,4 +4204,367 @@ mod tests { "oL⠈Nâ č⠜L⠁cL⠈N⠩⠜L⠃" ); } + + /// Letter-to-Unicode-braille mapping (matches handle_contractions). + const TEST_ASCII_TO_UNICODE: &[char] = &[ + '⠀', 'â ź', '⠐', 'â Œ', 'â «', 'â ©', 'â Ż', '⠄', 'â ·', 'â Ÿ', 'â Ą', 'â Ź', 'â  ', 'â €', 'â š', '⠌', + 'â Ž', '⠂', '⠆', '⠒', 'â Č', 'â ą', '⠖', 'â ¶', 'â Š', '⠔', 'â ±', 'â °', 'â Ł', 'â ż', '⠜', 'â č', + '⠈', '⠁', '⠃', '⠉', '⠙', '⠑', '⠋', '⠛', '⠓', '⠊', '⠚', '⠅', '⠇', '⠍', '⠝', '⠕', + '⠏', '⠟', '⠗', '⠎', '⠞', 'â „', 'â §', 'â ș', 'â ­', 'â œ', 'â ”', 'â Ș', 'â ł', 'â »', '⠘', 'â ž', + ]; + + fn ascii_to_uncontracted_braille(word: &str) -> String { + word.bytes() + .map(|b| TEST_ASCII_TO_UNICODE[(b.to_ascii_uppercase() - 32) as usize]) + .collect() + } + + /// Run handle_contractions on a lowercase ASCII word (L-cell input) and return Unicode braille. + fn contract_word(word: &str) -> String { + let l_chars: Vec = word.bytes() + .flat_map(|b| { + let ch = TEST_ASCII_TO_UNICODE[(b.to_ascii_uppercase() - 32) as usize]; + ['L', ch] + }) + .collect(); + let input: String = l_chars.iter().collect(); + let output = handle_contractions(&l_chars, 0, l_chars.len(), input); + output.chars().filter(|&c| c != 'L').collect() + } + + /// Grade-2 contraction coverage for technical vocabulary (311 words). + /// Cross-check goldens at https://brailletranslators.com/ (Grade 2 / UEB). + /// Should contract (225): force, work, time, speed, distance, area, height, weight, power, energy, density, gravity, acceleration, length, width, depth, cost, profit, interest, revenue, clearance, conductance, capacitance, resistance, impedance, reactance, variance, tolerance, luminosity, reliability, velocity, viscosity, precision, tension, efficiency, frequency, valence, stiffness, thickness, displacement, concentration, consumption, duration, elevation, fraction, friction, inflation, iteration, population, position, potential, production, resolution, rotation, charge, chord, pitch, growth, head, heat, reach, shear, margin, salary, offset, income, input, inventory, current, error, leverage, temperature, turnover, accuracy, breadth, strength, spread, discount, count, version, inductance, intensity, interval, perimeter, probability, utility, validity, parity, permeability, proportion, uncertainty, circumference, capacity, deceleration, dilution, enthalpy, entropy, equity, expense, gradient, headroom, inertia, latency, longitude, permittivity, period, principal, sensitivity, stress, throughput, thrust, wavelength, absorption, activation, activity, admittance, affinity, albedo, aperture, attenuation, average, bandwidth, baseline, bearing, benchmark, boiling, boundary, cohesion, compliance, compression, conductivity, coverage, damping, deflection, departure, depreciation, deviation, diffusion, dispersion, dissipation, distortion, divergence, downforce, elasticity, emissivity, emission, erosion, evaporation, expansion, expectation, extent, feedback, fidelity, filament, hardness, humidity, hysteresis, illuminance, incidence, index, inflow, influx, inhibition, injection, irradiance, kinetic, leakage, luminance, maturity, mean, median, melting, minimum, mobility, molarity, moisture, opacity, oscillation, outflow, overlap, parallax, parameter, peak, percentile, percentage, polarization, propagation, purity, quality, quantity, quenching, quotient, radiance, radiation, reaction, reactivity, redshift, reflectance, reflection, refraction, reluctance, remanence, resistivity, resonance, restitution, retardation, rigidity, salinity, saturation, scalar, scattering, separation, shrinkage, similarity, battery, diameter, epoch, gain, jitter, joule, momentum, shift, step, stride, zenith + /// Should not contract (86): mass, volume, base, rate, drag, drift, gap, lag, loss, pace, radius, range, ratio, risk, run, scale, size, slope, tax, torque, capital, impulse, latitude, magnitude, premium, pressure, response, return, trajectory, voltage, aspect, backlog, curvature, dosage, dose, equilibrium, excess, exposure, fatigue, hydraulic, lifetime, likelihood, maximum, metric, orbit, osmosis, pulse, quanta, quantum, regret, residual, ripple, root, rotor, sag, secant, signal, altitude, amplitude, angle, bias, bitrate, budget, bulk, decay, deficit, degree, delay, duty, lift, limit, load, modulus, payload, phase, price, sample, skew, slack, span, supply, total, value, vector, wage, yield + /// Note: arccos (cc exception, partial ar groupsign) is covered in tests/braille/UEB/other.rs contractions_1. + #[test] + fn ueb_technical_word_contractions() { + const SHOULD_CONTRACT: &[(&str, &str)] = &[ + ("force", "⠿⠉⠑"), + ("work", "⠐â ș"), + ("time", "⠐⠞"), + ("speed", "⠎⠏⠑⠫"), + ("distance", "â Č⠞⠹⠑"), + ("area", "⠜⠑⠁"), + ("height", "⠓⠑⠊⠣⠞"), + ("weight", "â ș⠑⠊⠣⠞"), + ("power", "⠏â Șâ »"), + ("energy", "â ąâ »â ›â œ"), + ("density", "â ™â ąâ Žâ °â œ"), + ("gravity", "⠛⠗⠁⠧⠰⠜"), + ("acceleration", "⠁⠒⠑⠇⠻⠁⠰⠝"), + ("length", "⠇⠱⠛â č"), + ("width", "â ș⠊⠙â č"), + ("depth", "⠙⠑⠏â č"), + ("cost", "⠉⠕⠌"), + ("profit", "⠏⠗⠷⠊⠞"), + ("interest", "⠔⠞⠻⠑⠌"), + ("revenue", "â —â ‘â §â ąâ „â ‘"), + ("clearance", "⠉⠇⠑⠜⠹⠑"), + ("conductance", "⠒⠙⠄⠉⠞⠚⠑"), + ("capacitance", "⠉⠁⠏⠁⠉⠊⠞⠹⠑"), + ("resistance", "⠗⠑⠎⠊⠌⠹⠑"), + ("impedance", "⠊⠍⠏⠫⠚⠑"), + ("reactance", "⠗⠑⠁⠉⠞⠹⠑"), + ("variance", "⠧⠜⠊⠹⠑"), + ("tolerance", "⠞⠕⠇⠻⠚⠑"), + ("luminosity", "⠇⠄⠍⠔⠕⠎⠰⠜"), + ("reliability", "⠗⠑⠇⠊⠁⠃⠊⠇⠰⠜"), + ("velocity", "⠧⠑⠇⠕⠉⠰⠜"), + ("viscosity", "⠧⠊⠎⠉⠕⠎⠰⠜"), + ("precision", "⠏⠗⠑⠉⠊⠹⠝"), + ("tension", "⠞⠱⠹⠝"), + ("efficiency", "â ‘â –â Šâ ‰â Šâ ąâ ‰â œ"), + ("frequency", "â ‹â —â ‘â Ÿâ „â ąâ ‰â œ"), + ("valence", "⠧⠁⠇⠰⠑"), + ("stiffness", "⠌⠊⠖⠰⠎"), + ("thickness", "â č⠊⠉⠅⠰⠎"), + ("displacement", "â Č⠏⠇⠁⠉⠑⠰⠞"), + ("concentration", "⠒⠉⠱⠞⠗⠁⠰⠝"), + ("consumption", "⠒⠎⠄⠍⠏⠰⠝"), + ("duration", "⠙⠄⠗⠁⠰⠝"), + ("elevation", "⠑⠇⠑⠧⠁⠰⠝"), + ("fraction", "⠋⠗⠁⠉⠰⠝"), + ("friction", "⠋⠗⠊⠉⠰⠝"), + ("inflation", "⠔⠋⠇⠁⠰⠝"), + ("iteration", "⠊⠞⠻⠁⠰⠝"), + ("population", "⠏⠕⠏⠄⠇⠁⠰⠝"), + ("position", "⠏⠕⠎⠊⠰⠝"), + ("potential", "⠏⠕⠞⠱⠞⠊⠁⠇"), + ("production", "⠏⠗⠕⠙⠄⠉⠰⠝"), + ("resolution", "⠗⠑⠎⠕⠇⠄⠰⠝"), + ("rotation", "⠗⠕⠞⠁⠰⠝"), + ("charge", "⠡⠜⠛⠑"), + ("chord", "⠡⠕⠗⠙"), + ("pitch", "⠏⠊⠞⠡"), + ("growth", "⠛⠗â Șâ č"), + ("head", "⠓⠂⠙"), + ("heat", "⠓⠂⠞"), + ("reach", "⠗⠂⠡"), + ("shear", "⠩⠑⠜"), + ("margin", "⠍⠜⠛⠔"), + ("salary", "⠎⠁⠇⠜⠜"), + ("offset", "⠷⠋⠎⠑⠞"), + ("income", "⠔⠉⠕⠍⠑"), + ("input", "⠔⠏⠄⠞"), + ("inventory", "â ”â §â ąâ žâ •â —â œ"), + ("current", "⠉⠄⠗⠗⠹⠞"), + ("error", "⠻⠗⠕⠗"), + ("leverage", "⠇⠐⠑⠁⠛⠑"), + ("temperature", "⠞⠑⠍⠏⠻⠁⠞⠄⠗⠑"), + ("turnover", "⠞⠄⠗⠝⠕⠧⠻"), + ("accuracy", "⠁⠒⠄⠗⠁⠉⠜"), + ("breadth", "⠃⠗⠂⠙â č"), + ("strength", "⠌⠗⠱⠛â č"), + ("spread", "⠎⠏⠗⠂⠙"), + ("discount", "â Č⠉⠹⠞"), + ("count", "⠉⠹⠞"), + ("version", "⠧⠻⠚⠝"), + ("inductance", "⠔⠙⠄⠉⠞⠚⠑"), + ("intensity", "â ”â žâ ąâ Žâ °â œ"), + ("interval", "⠔⠞⠻⠧⠁⠇"), + ("perimeter", "⠏⠻⠊⠍⠑⠞⠻"), + ("probability", "⠏⠗⠕⠃⠁⠃⠊⠇⠰⠜"), + ("utility", "⠄⠞⠊⠇⠰⠜"), + ("validity", "⠧⠁⠇⠊⠙⠰⠜"), + ("parity", "⠏⠜⠰⠜"), + ("permeability", "⠏⠻⠍⠂⠃⠊⠇⠰⠜"), + ("proportion", "⠏⠗⠕⠏⠕⠗⠰⠝"), + ("uncertainty", "⠄⠝⠉⠻⠞⠁⠔⠞⠜"), + ("circumference", "⠉⠊⠗⠉⠄⠍⠋⠻⠰⠑"), + ("capacity", "⠉⠁⠏⠁⠉⠰⠜"), + ("deceleration", "⠙⠑⠉⠑⠇⠻⠁⠰⠝"), + ("dilution", "⠙⠊⠇⠄⠰⠝"), + ("enthalpy", "â ąâ č⠁⠇⠏⠜"), + ("entropy", "â ąâ žâ —â •â â œ"), + ("equity", "â ‘â Ÿâ „â °â œ"), + ("expense", "⠑⠭⠏⠱⠎⠑"), + ("gradient", "⠛⠗⠁⠙⠊⠱⠞"), + ("headroom", "⠓⠂⠙⠗⠕⠕⠍"), + ("inertia", "⠔⠻⠞⠊⠁"), + ("latency", "â ‡â â žâ ąâ ‰â œ"), + ("longitude", "⠇⠰⠛⠊⠞⠄⠙⠑"), + ("permittivity", "⠏⠻⠍⠊⠞⠞⠊⠧⠰⠜"), + ("period", "⠏⠻⠊⠕⠙"), + ("principal", "⠏⠗⠔⠉⠊⠏⠁⠇"), + ("sensitivity", "â Žâ ąâ Žâ Šâ žâ Šâ §â °â œ"), + ("stress", "⠌⠗⠑⠎⠎"), + ("throughput", "⠐â č⠏⠄⠞"), + ("thrust", "â čâ —â „â Œ"), + ("wavelength", "â ș⠁⠧⠑⠇⠱⠛â č"), + ("absorption", "⠁⠃⠎⠕⠗⠏⠰⠝"), + ("activation", "⠁⠉⠞⠊⠧⠁⠰⠝"), + ("activity", "⠁⠉⠞⠊⠧⠰⠜"), + ("admittance", "⠁⠙⠍⠊⠞⠞⠹⠑"), + ("affinity", "⠁⠖⠔⠰⠜"), + ("albedo", "⠁⠇⠃⠫⠕"), + ("aperture", "⠁⠏⠻⠞⠄⠗⠑"), + ("attenuation", "â â žâ žâ ąâ „â â °â "), + ("average", "⠁⠧⠻⠁⠛⠑"), + ("bandwidth", "⠃⠯â ș⠊⠙â č"), + ("baseline", "⠃⠁⠎⠑⠇⠔⠑"), + ("bearing", "⠃⠑⠜⠬"), + ("benchmark", "⠃⠱⠡⠍⠜⠅"), + ("boiling", "⠃⠕⠊⠇⠬"), + ("boundary", "⠃⠚⠙⠜⠜"), + ("cohesion", "⠉⠕⠓⠑⠹⠝"), + ("compliance", "⠉⠕⠍⠏⠇⠊⠹⠑"), + ("compression", "⠉⠕⠍⠏⠗⠑⠎⠹⠝"), + ("conductivity", "⠒⠙⠄⠉⠞⠊⠧⠰⠜"), + ("coverage", "⠉⠕⠧⠻⠁⠛⠑"), + ("damping", "⠙⠁⠍⠏⠬"), + ("deflection", "⠙⠑⠋⠇⠑⠉⠰⠝"), + ("departure", "⠙⠑⠐⠏⠄⠗⠑"), + ("depreciation", "⠙⠑⠏⠗⠑⠉⠊⠁⠰⠝"), + ("deviation", "⠙⠑⠧⠊⠁⠰⠝"), + ("diffusion", "⠙⠊⠖⠄⠚⠝"), + ("dispersion", "â Č⠏⠻⠚⠝"), + ("dissipation", "â Č⠎⠊⠏⠁⠰⠝"), + ("distortion", "â Č⠞⠕⠗⠰⠝"), + ("divergence", "⠙⠊⠧⠻⠛⠰⠑"), + ("downforce", "⠙â Ș⠝⠿⠉⠑"), + ("elasticity", "⠑⠇⠁⠌⠊⠉⠰⠜"), + ("emissivity", "⠑⠍⠊⠎⠎⠊⠧⠰⠜"), + ("emission", "⠑⠍⠊⠎⠹⠝"), + ("erosion", "⠻⠕⠚⠝"), + ("evaporation", "⠑⠧⠁⠏⠕⠗⠁⠰⠝"), + ("expansion", "⠑⠭⠏⠁⠝⠹⠝"), + ("expectation", "⠑⠭⠏⠑⠉⠞⠁⠰⠝"), + ("extent", "⠑⠭⠞⠱⠞"), + ("feedback", "⠋⠑⠫⠃⠁⠉⠅"), + ("fidelity", "⠋⠊⠙⠑⠇⠰⠜"), + ("filament", "⠋⠊⠇⠁⠰⠞"), + ("hardness", "⠓⠜⠙⠰⠎"), + ("humidity", "⠓⠄⠍⠊⠙⠰⠜"), + ("hysteresis", "⠓⠜⠌⠻⠑⠎⠊⠎"), + ("illuminance", "⠊⠇⠇⠄⠍⠔⠚⠑"), + ("incidence", "⠔⠉⠊⠙⠰⠑"), + ("index", "⠔⠙⠑⠭"), + ("inflow", "⠔⠋⠇â Ș"), + ("influx", "⠔⠋⠇⠄⠭"), + ("inhibition", "⠔⠓⠊⠃⠊⠰⠝"), + ("injection", "⠔⠚⠑⠉⠰⠝"), + ("irradiance", "⠊⠗⠗⠁⠙⠊⠹⠑"), + ("kinetic", "⠅⠔⠑⠞⠊⠉"), + ("leakage", "⠇⠂⠅⠁⠛⠑"), + ("luminance", "⠇⠄⠍⠔⠚⠑"), + ("maturity", "⠍⠁⠞⠄⠗⠰⠜"), + ("mean", "⠍⠂⠝"), + ("median", "⠍⠫⠊⠁⠝"), + ("melting", "⠍⠑⠇⠞⠬"), + ("minimum", "⠍⠔⠊⠍⠄⠍"), + ("mobility", "⠍⠕⠃⠊⠇⠰⠜"), + ("molarity", "⠍⠕⠇⠜⠰⠜"), + ("moisture", "⠍⠕⠊⠌⠄⠗⠑"), + ("opacity", "⠕⠏⠁⠉⠰⠜"), + ("oscillation", "⠕⠎⠉⠊⠇⠇⠁⠰⠝"), + ("outflow", "⠳⠞⠋⠇â Ș"), + ("overlap", "⠕⠧⠻⠇⠁⠏"), + ("parallax", "⠏⠜⠁⠇⠇⠁⠭"), + ("parameter", "⠏⠜⠁⠍⠑⠞⠻"), + ("peak", "⠏⠂⠅"), + ("percentile", "â â »â ‰â ąâ žâ Šâ ‡â ‘"), + ("percentage", "â â »â ‰â ąâ žâ â ›â ‘"), + ("polarization", "⠏⠕⠇⠜⠊⠔⠁⠰⠝"), + ("propagation", "⠏⠗⠕⠏⠁⠛⠁⠰⠝"), + ("purity", "⠏⠄⠗⠰⠜"), + ("quality", "⠟⠄⠁⠇⠰⠜"), + ("quantity", "⠟⠄⠁⠝⠞⠰⠜"), + ("quenching", "â Ÿâ „â ąâ Ąâ Ź"), + ("quotient", "â Ÿâ „â •â žâ Šâ ąâ ž"), + ("radiance", "⠗⠁⠙⠊⠹⠑"), + ("radiation", "⠗⠁⠙⠊⠁⠰⠝"), + ("reaction", "⠗⠑⠁⠉⠰⠝"), + ("reactivity", "⠗⠑⠁⠉⠞⠊⠧⠰⠜"), + ("redshift", "⠗⠫⠩⠊⠋⠞"), + ("reflectance", "⠗⠑⠋⠇⠑⠉⠞⠹⠑"), + ("reflection", "⠗⠑⠋⠇⠑⠉⠰⠝"), + ("refraction", "⠗⠑⠋⠗⠁⠉⠰⠝"), + ("reluctance", "⠗⠑⠇⠄⠉⠞⠚⠑"), + ("remanence", "⠗⠑⠍⠁⠝⠰⠑"), + ("resistivity", "⠗⠑⠎⠊⠌⠊⠧⠰⠜"), + ("resonance", "⠗⠑⠎⠕⠝⠹⠑"), + ("restitution", "⠗⠑⠌⠊⠞⠄⠰⠝"), + ("retardation", "⠗⠑⠞⠜⠙⠁⠰⠝"), + ("rigidity", "⠗⠊⠛⠊⠙⠰⠜"), + ("salinity", "⠎⠁⠇⠔⠰⠜"), + ("saturation", "⠎⠁⠞⠄⠗⠁⠰⠝"), + ("scalar", "⠎⠉⠁⠇⠜"), + ("scattering", "⠎⠉⠁⠞⠞⠻⠏"), + ("separation", "⠎⠑⠏⠜⠁⠰⠝"), + ("shrinkage", "⠩⠗⠔⠅⠁⠛⠑"), + ("similarity", "⠎⠊⠍⠊⠇⠜⠰⠜"), + ("battery", "⠃⠁⠞⠞⠻⠜"), + ("diameter", "⠙⠊⠁⠍⠑⠞⠻"), + ("epoch", "⠑⠏⠕⠡"), + ("gain", "⠛⠁⠔"), + ("jitter", "⠚⠊⠞⠞⠻"), + ("joule", "⠚⠳⠇⠑"), + ("momentum", "⠍⠕⠰⠞⠄⠍"), + ("shift", "⠩⠊⠋⠞"), + ("step", "⠌⠑⠏"), + ("stride", "⠌⠗⠊⠙⠑"), + ("zenith", "⠔⠹⠊â č"), + ]; + const SHOULD_NOT_CONTRACT: &[&str] = &[ + "mass", "volume", "base", "rate", "drag", "drift", "gap", "lag", "loss", "pace", + "radius", "range", "ratio", "risk", "run", "scale", "size", "slope", "tax", "torque", + "capital", "impulse", "latitude", "magnitude", "premium", "pressure", "response", "return", + "trajectory", "voltage", "aspect", "backlog", "curvature", "dosage", "dose", "equilibrium", + "excess", "exposure", "fatigue", "hydraulic", "lifetime", "likelihood", "maximum", "metric", + "orbit", "osmosis", "pulse", "quanta", "quantum", "regret", "residual", "ripple", "root", + "rotor", "sag", "secant", "signal", "altitude", "amplitude", "angle", "bias", "bitrate", + "budget", "bulk", "decay", "deficit", "degree", "delay", "duty", "lift", "limit", "load", + "modulus", "payload", "phase", "price", "sample", "skew", "slack", "span", "supply", + "total", "value", "vector", "wage", "yield", + ]; + + for &(word, expected) in SHOULD_CONTRACT { + let got = contract_word(word); + assert_eq!(expected, got, "word '{word}'"); + assert_ne!(ascii_to_uncontracted_braille(word), got, "word '{word}' should contract"); + } + for &word in SHOULD_NOT_CONTRACT { + let got = contract_word(word); + let uncontracted = ascii_to_uncontracted_braille(word); + assert_eq!(uncontracted, got, "word '{word}' should not contract"); + } + } + + #[test] + #[ignore] + fn ueb_technical_word_contractions_probe_batch2() { + let try_contract = [ + "circumference", "capacity", "deceleration", "dilution", "enthalpy", "entropy", "equity", "expense", + "gradient", "headroom", "inertia", "latency", "longitude", "permittivity", "period", "principal", + "sensitivity", "stress", "throughput", "thrust", "wavelength", "absorption", "activation", "activity", + "admittance", "affinity", "albedo", "aperture", "attenuation", "average", "bandwidth", "baseline", + "bearing", "benchmark", "boiling", "boundary", "cohesion", "compliance", "compression", "conductivity", + "coverage", "damping", "deflection", "departure", "depreciation", "deviation", "diffusion", "dispersion", + "dissipation", "distortion", "divergence", "downforce", "elasticity", "emissivity", "emission", "erosion", + "evaporation", "expansion", "expectation", "extent", "feedback", "fidelity", "filament", "hardness", + "humidity", "hysteresis", "illuminance", "incidence", "index", "inflow", "influx", "inhibition", + "injection", "irradiance", "kinetic", "leakage", "luminance", "maturity", "mean", "median", "melting", + "minimum", "mobility", "molarity", "moisture", "opacity", "oscillation", "outflow", "overlap", "parallax", + "parameter", "peak", "percentile", "percentage", "polarization", "propagation", "purity", "quality", + "quantity", "quenching", "quotient", "radiance", "radiation", "reaction", "reactivity", "redshift", + "reflectance", "reflection", "refraction", "reluctance", "remanence", "resistivity", "resonance", + "restitution", "retardation", "rigidity", "salinity", "saturation", "scalar", "scattering", "separation", + "shrinkage", "similarity", "battery", "diameter", "epoch", "gain", "jitter", "joule", "momentum", "shift", + "step", "stride", "zenith", + ]; + let try_not = [ + "capital", "impulse", "latitude", "magnitude", "premium", "pressure", "response", "return", "trajectory", + "voltage", "aspect", "backlog", "curvature", "dosage", "dose", "equilibrium", "excess", "exposure", + "fatigue", "hydraulic", "lifetime", "likelihood", "maximum", "metric", "orbit", "osmosis", "pulse", + "quanta", "quantum", "regret", "residual", "ripple", "root", "rotor", "sag", "secant", "signal", + "altitude", "amplitude", "angle", "bias", "bitrate", "budget", "bulk", "decay", "deficit", "degree", + "delay", "duty", "lift", "limit", "load", "modulus", "payload", "phase", "price", "sample", "skew", + "slack", "span", "supply", "total", "value", "vector", "wage", "yield", + ]; + let mut out = String::new(); + for w in try_contract { + let c = contract_word(w); + out.push_str(&format!("(\"{w}\", \"{c}\"),\n")); + } + for w in try_not { + out.push_str(&format!("// no: {w}\n")); + } + let path = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("notes/_batch2_goldens.txt"); + std::fs::write(path, out).unwrap(); + } + + #[test] + #[ignore] + fn ueb_technical_word_contractions_probe() { + let should_contract = [ + "force", "work", "time", "speed", "distance", "area", "height", "weight", "power", "energy", + "density", "gravity", "acceleration", "length", "width", "depth", "cost", "profit", "interest", "revenue", + "clearance", "conductance", "capacitance", "resistance", "impedance", "reactance", "variance", "tolerance", + "luminosity", "reliability", "velocity", "viscosity", "precision", "tension", "efficiency", "frequency", + "valence", "stiffness", "thickness", "displacement", "concentration", "consumption", "duration", "elevation", + "fraction", "friction", "inflation", "iteration", "population", "position", "potential", "production", + "resolution", "rotation", "charge", "chord", "pitch", "growth", "head", "heat", "reach", "shear", "margin", + "salary", "offset", "income", "input", "inventory", "current", "error", "leverage", "temperature", + "turnover", "accuracy", "breadth", "strength", "spread", "discount", "count", "version", "inductance", + "intensity", "interval", "perimeter", "probability", "utility", "validity", "parity", "permeability", + "proportion", "uncertainty", + ]; + let should_not = [ + "mass", "volume", "base", "rate", "drag", "drift", "gap", "lag", "loss", "pace", + "radius", "range", "ratio", "risk", "run", "scale", "size", "slope", "tax", "torque", + ]; + eprintln!("=== SHOULD CONTRACT ==="); + for w in should_contract { + let c = contract_word(w); + let u = ascii_to_uncontracted_braille(w); + eprintln!("(\"{w}\", \"{c}\"), // uncontracted={u} changed={}", c != u); + } + eprintln!("=== SHOULD NOT CONTRACT ==="); + for w in should_not { + let c = contract_word(w); + let u = ascii_to_uncontracted_braille(w); + eprintln!("{w}: contracted={c} uncontracted={u} ok={}", c == u); + } + } } diff --git a/tests/braille/UEB/iceb.rs b/tests/braille/UEB/iceb.rs index 3bd48b19b..70eb878f8 100644 --- a/tests/braille/UEB/iceb.rs +++ b/tests/braille/UEB/iceb.rs @@ -1,7 +1,8 @@ // UEB tests for the basic mathml tags -// Initial tests are from BANA guidelines, mostly about initial chars for code switching -// http://www.brailleauthority.org/ueb/ueb_math_guidance/final_for_posting_ueb_math_guidance_may_2019_102419.pdf -// These tests start with "bana_" +// BANA guidance (2026; replaces 2019 provisional): +// https://www.brailleauthority.org/sites/default/files/2026-07/Guidance%20on%20Transcribing%20Math%20and%20Science%20in%20UEB%202026.pdf +// Older `bana_*` names map from 2019 section numbers where still valid; `bana2026_*` are new 2026 examples. +// Grade 1 indicators follow ICEB GTM §1.7 (adopted by BANA 2026). // // Many come from (refer to) https://iceb.org/guidelines_for_technical_material_2014.pdf // For example, "fraction_6_1_1" is a fraction example from section 6.1, and is the first example there. @@ -10,7 +11,8 @@ use anyhow::Result; #[test] fn bana_2_1() -> Result<()> { - let expr = "6=1×2×3 + // BANA 2026 Ex 2-1 (spacing of signs) + let expr = "6=1×2×3 =1+2+3"; test_braille("UEB", expr, "⠌⠋⠀⠐⠶⠀⠌⠁⠐⠊⠌⠃⠐⠊⠌⠉⠀⠐⠶⠀⠌⠁⠐⠖⠌⠃⠐⠖⠌⠉")?; return Ok(()); @@ -19,6 +21,7 @@ fn bana_2_1() -> Result<()> { #[test] fn bana_5_1() -> Result<()> { + // BANA 2026 Ex 5-1 let expr = "x+y=6"; test_braille("UEB", expr, "⠭⠐⠖⠜⠀⠐⠶⠀⠌⠋")?; return Ok(()); @@ -27,6 +30,7 @@ fn bana_5_1() -> Result<()> { #[test] fn bana_5_2() -> Result<()> { + // BANA 2026 Ex 5-7 let expr = "x2+y2=C"; test_braille("UEB", expr, "⠭⠰⠔⠌⠃⠐⠖⠜⠔⠌⠃⠀⠐⠶⠀⠰⠠⠉")?; return Ok(()); @@ -35,6 +39,7 @@ fn bana_5_2() -> Result<()> { #[test] fn bana_5_3() -> Result<()> { + // BANA 2026 Ex 5-10 let expr = "ab+cd"; test_braille("UEB", expr, "⠰⠰⠷⠁⠚⠌⠃⠟⠐⠖⠷⠉⠚⠌⠙⠟")?; return Ok(()); @@ -43,26 +48,27 @@ fn bana_5_3() -> Result<()> { #[test] fn bana_5_4() -> Result<()> { - let expr = "an×am= + // BANA 2026 Ex 5-14 (GTM 1.7: word indicator per sequence, not passage) + let expr = "an×am= an+m"; - test_braille("UEB", expr, "â °â °â °â â ”â â â Šâ â ”â â €â â ¶â €â â ”â Łâ â â –â â œâ °â „")?; + test_braille("UEB", expr, "â °â °â â ”â â â Šâ â ”â â €â â ¶â €â °â °â â ”â Łâ â â –â â œ")?; return Ok(()); } #[test] fn bana_5_5() -> Result<()> { - let expr = "logxy"; - // BANA example contradicts GTM 9.2 that says don't use a space after a function name if there is an intervening indicator. - // Corrected: removed the space and the G1 indicator needed if a space were inserted - test_braille("UEB", expr, "â °â °â ‡â •â ›â ąâ ­â œ")?; + // BANA 2026 Ex 5-8 (replaces 2019 log_x y example) + let expr = "log2x+logx"; + test_braille("UEB", expr, "â ‡â •â ›â °â ąâ Œâ ƒâ ­â â –â ‡â •â ›â €â °â ­")?; return Ok(()); } #[test] fn bana_5a_1() -> Result<()> { - let expr = "100°F"; + // Former 2019 §5(a) units example (dropped from BANA 2026); kept as unit-spacing practice + let expr = "100°F"; test_braille("UEB", expr, "⠌⠁⠚⠚⠘⠚⠠⠋")?; return Ok(()); @@ -70,7 +76,17 @@ fn bana_5a_1() -> Result<()> { #[test] fn bana_5a_1_baseline() -> Result<()> { - let expr = "100°F"; + // Former 2019 §5(a) units example (dropped from BANA 2026); kept as unit-spacing practice + let expr = "100°F"; + test_braille("UEB", expr, "⠌⠁⠚⠚⠘⠚⠠⠋")?; + return Ok(()); + +} + +#[test] +fn bana_5a_1_baseline_unit() -> Result<()> { + // Same as bana_5a_1_baseline; unit marked via data-intent-property + let expr = "100°F"; test_braille("UEB", expr, "⠌⠁⠚⠚⠘⠚⠠⠋")?; return Ok(()); @@ -78,22 +94,43 @@ fn bana_5a_1_baseline() -> Result<()> { #[test] fn bana_5a_2() -> Result<()> { + // Former 2019 §5(a) units example (dropped from BANA 2026); kept as unit-spacing practice let expr = "25 km2"; test_braille("UEB", expr, "⠌⠃⠑⠀⠅⠍⠰⠔⠌⠃")?; return Ok(()); } +#[test] +fn bana_5a_2_unit() -> Result<()> { + // Same as bana_5a_2; unit marked via data-intent-property + let expr = "25 km2"; + test_braille("UEB", expr, "⠌⠃⠑⠀⠅⠍⠰⠔⠌⠃")?; + return Ok(()); + +} + #[test] fn bana_5a_2_mtext() -> Result<()> { + // Former 2019 §5(a) units example (dropped from BANA 2026); kept as unit-spacing practice let expr = "25 km2"; test_braille("UEB", expr, "⠌⠃⠑⠀⠅⠍⠰⠔⠌⠃")?; return Ok(()); } +#[test] +fn bana_5a_2_mtext_unit() -> Result<()> { + // Same as bana_5a_2_mtext; unit marked via data-intent-property + let expr = "25 km2"; + test_braille("UEB", expr, "⠌⠃⠑⠀⠅⠍⠰⠔⠌⠃")?; + return Ok(()); + +} + #[test] fn bana_5a_3() -> Result<()> { + // Former 2019 §5(a) units example (dropped from BANA 2026); kept as unit-spacing practice let expr = "6 m  s-1"; test_braille("UEB", expr, "â Œâ ‹â €â °â â €â °â °â Žâ ”â Łâ â €â Œâ â œ")?; @@ -101,11 +138,183 @@ fn bana_5a_3() -> Result<()> { } +#[test] +fn bana_5a_3_unit() -> Result<()> { + // Same as bana_5a_3; unit marked via data-intent-property + let expr = "6 m  + s-1"; + test_braille("UEB", expr, "â Œâ ‹â €â °â â €â °â °â Žâ ”â Łâ â €â Œâ â œ")?; + return Ok(()); + +} + #[test] fn bana_6_1() -> Result<()> { + // Punctuation before G1 terminator (BANA 2026 §5.4 / GTM 1.7.3b note) let expr = "x+y=z =t2."; - test_braille("UEB", expr, "⠰⠰⠰⠭⠐⠖⠜⠀⠐⠶⠀⠔⠀⠐⠶⠀⠞⠔⠌⠃â Č⠰⠄")?; + test_braille("UEB", expr, "⠭⠐⠖⠜⠀⠐⠶⠀⠰⠔⠀⠐⠶⠀⠞⠰⠔⠌⠃â Č")?; + return Ok(()); + +} + +// --- BANA 2026 examples not covered by older bana_* tests --- + +#[test] +fn bana2026_2_2() -> Result<()> { + // BANA 2026 Ex 2-2: spaced operation signs for beginning readers + let expr = "6-3=_"; + test_braille_prefs("UEB", vec![("UseSpacesAroundAllOperators", "true")], expr, "⠌⠋⠀⠐⠀⠀⠌⠉⠀⠐⠶⠀⠚⠀")?; + return Ok(()); + +} + +#[test] +fn bana2026_5_2() -> Result<()> { + // BANA 2026 Ex 5-2: words with contractions in a technical expression + let expr = "Surface area=2lh+2lw+2wh"; + test_braille("UEB", expr, "⠠⠎⠄⠗⠋⠁⠉⠑⠀⠜⠑⠁⠀⠐⠶⠀⠌⠃⠇⠓⠐⠖⠌⠃⠇â ș⠐⠖⠌⠃â ș⠓")?; + return Ok(()); + +} + +#[test] +fn bana2026_5_3() -> Result<()> { + // BANA 2026 Ex 5-3 + let expr = "NaCl+H2O"; + test_braille("UEB", expr, "â  â â â  â ‰â ‡â â –â  â “â °â ąâ Œâ ƒâ  â •")?; + return Ok(()); + +} + +#[test] +fn bana2026_5_4() -> Result<()> { + // BANA 2026 Ex 5-4 + let expr = "5x2y3z"; + test_braille("UEB", expr, "⠰⠷⠌⠑⠭⠔⠌⠃⠚⠌⠜⠔⠌⠉⠔⠟")?; + return Ok(()); + +} + +#[test] +fn bana2026_5_5() -> Result<()> { + // BANA 2026 Ex 5-5: 1×3 matrix and column (linearized like other matrix_* tests) + let expr = r#" + (abc) + ( + -1 + 2 + -3 + ) + "#; + test_braille("UEB", expr, "â  â â Łâ â €â °â ƒâ €â ‰â  â â œâ  â â Łâ â €â Œâ â  â â œâ žâ €â  â â Łâ Œâ ƒâ  â â œâ žâ €â  â â Łâ â €â Œâ ‰â  â â œ")?; + return Ok(()); + +} + +#[test] +fn bana2026_5_6() -> Result<()> { + // BANA 2026 Ex 5-6 + let expr = r#" + (ab) + (-x2y) + "#; + test_braille("UEB", expr, "â  â â Łâ â €â ƒâ  â â œâ  â â Łâ â €â ­â  â â œâ žâ €â  â â Łâ Œâ ƒâ œâ  â â œ")?; + return Ok(()); + +} + +#[test] +fn bana2026_5_9_slope() -> Result<()> { + // BANA 2026 Ex 5-9 (math fragments): slope 3/5 and parallel lines l₁ ∄ l₂ + let expr = "l1∄l2"; + test_braille("UEB", expr, "â ‡â °â ąâ Œâ â €â Œâ ‡â €â ‡â °â ąâ Œâ ƒ")?; + return Ok(()); + +} + +#[test] +fn bana2026_5_11() -> Result<()> { + // BANA 2026 Ex 5-11 + let expr = "ab"; + test_braille("UEB", expr, "⠰⠰⠷⠁⠚⠌⠃⠟")?; + return Ok(()); + +} + +#[test] +fn bana2026_5_12() -> Result<()> { + // BANA 2026 Ex 5-12: vector AB with arrow + let expr = "AB→"; + test_braille("UEB", expr, "â °â °â Łâ  â  â â ƒâ œâ ˜â ±")?; + return Ok(()); + +} + +#[test] +fn bana2026_5_13() -> Result<()> { + // BANA 2026 Ex 5-13 + let expr = "x-1=1x"; + test_braille("UEB", expr, "â °â °â ­â ”â Łâ â €â Œâ â œâ €â â ¶â €â °â ·â Œâ â šâ Œâ ­â Ÿ")?; + return Ok(()); + +} + +#[test] +fn bana2026_5_15() -> Result<()> { + // BANA 2026 Ex 5-15: all-caps print uses capital passage (â  â  â   
 ⠠⠄) inside G1 passage + let expr = "P=VI=I2R=V2R"; + test_braille("UEB", expr, "⠰⠰⠰⠠⠠⠠⠏⠀⠐⠶⠀⠧⠊⠀⠐⠶⠀⠊⠔⠌⠃⠗⠀⠐⠶⠀⠷⠧⠔⠌⠃⠚⠌⠗⠟⠠⠄⠰⠄")?; + return Ok(()); + +} + +#[test] +fn bana2026_5_16() -> Result<()> { + // BANA 2026 Ex 5-16: CaCO₃ ⇄ CaO + CO₂ + let expr = "CaCO3 + ⇄ + CaO+ + CO2"; + test_braille("UEB", expr, "â °â °â °â  â ‰â â  â ‰â  â •â ąâ Œâ ‰â €â łâ •â »â łâ Șâ €â  â ‰â â  â •â â –â  â ‰â  â •â ąâ Œâ ƒâ °â „")?; + return Ok(()); + +} + +#[test] +fn bana2026_7_1() -> Result<()> { + // BANA 2026 Ex 7-1: V = lim Δx→0 ÎŁ f(xᔹ)Δx (single-line) + let expr = r#"V= + limΔx→0 + ∑i + f(xi)Δx + "#; + test_braille("UEB", expr, "â °â  â §â €â â ¶â €â °â °â ‡â Šâ â šâ ąâ Łâ  â šâ ™â ­â łâ •â Œâ šâ œâ  â šâ Žâ šâ ąâ Šâ ‹â â Łâ ­â ąâ Šâ â œâ  â šâ ™â ­")?; + return Ok(()); + +} + +#[test] +fn bana2026_7_2() -> Result<()> { + // BANA 2026 Ex 7-2: first step of radical simplification chain + let expr = r#"x= + 36-4(9)+3(12)18 + "#; + test_braille("UEB", expr, "â °â ­â €â â ¶â €â °â °â ·â ©â Œâ ‰â ‹â â €â Œâ ™â â Łâ Œâ Šâ â œâ â –â Œâ ‰â â Łâ Œâ â ƒâ â œâ Źâ šâ Œâ Œâ â “â Ÿ")?; + return Ok(()); + +} + +#[test] +fn bana2026_7_3() -> Result<()> { + // BANA 2026 Ex 7-3 + let expr = r#"x= + + 54+7-111×2+8000+1000 + -42 + + "#; + test_braille("UEB", expr, "⠰⠭⠀⠐⠶⠀⠰⠷⠌⠑⠙⠐⠖⠌⠛⠐⠀⠌⠁⠁⠁⠐⠊⠌⠃⠐⠖⠌⠓⠚⠚⠚⠐⠖⠌⠁⠚⠚⠚⠚⠌⠐⠀⠌⠙⠃⠟")?; return Ok(()); } @@ -167,7 +376,7 @@ fn grade1_1_7_2() -> Result<()> { #[test] fn grade1_1_7_3_1() -> Result<()> { let expr = " - 3x−4y+ + 3x−4y+ y2 = x2 @@ -193,13 +402,614 @@ fn grade1_1_7_3_2() -> Result<()> { #[test] fn grade1_1_7_4() -> Result<()> { let expr = " - (y−x2) + (y−x2) "; test_braille("UEB", expr, "â °â °â ©â â Łâ œâ â €â ­â ”â Œâ ƒâ â œâ Ź")?; return Ok(()); } +// Additional examples from GTM 1.7 (July 2025): +// https://iceb.org/wp-content/uploads/2026/02/GTM-1.7-Grade-1-Indicators-Approved.pdf +// Ordinary surrounding text is omitted; braille is the preferred math from the spec. + +#[test] +fn grade1_1_7_3_a_1() -> Result<()> { + let expr = "x2"; + test_braille("UEB", expr, "⠭⠰⠔⠌⠃")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_3_a_2() -> Result<()> { + let expr = "x→∞"; + test_braille("UEB", expr, "â °â ­â €â °â łâ •â €â Œâ ż")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_3_a_3() -> Result<()> { + let expr = "xy"; + test_braille("UEB", expr, "⠰⠰⠷⠭⠚⠌⠜⠟")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_3_b_1() -> Result<()> { + let expr = "xa=xb + =xc"; + test_braille("UEB", expr, "â °â °â °â ­â ąâ â €â â ¶â €â ­â ąâ ƒâ €â â ¶â €â ­â ąâ ‰â °â „")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_3_b_2() -> Result<()> { + let expr = "y=x2-4; +  y=x2-2x; +  y=x-x2."; + test_braille("UEB", expr, "⠰⠰⠰⠜⠀⠐⠶⠀⠭⠔⠌⠃⠐⠀⠌⠙⠆⠀⠜⠀⠐⠶⠀⠭⠔⠌⠃⠐⠀⠌⠃⠭⠆⠀⠜⠀⠐⠶⠀⠭⠐⠀⠭⠔⠌⠃â Č⠰⠄")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_4_1() -> Result<()> { + let expr = "x2-x-2 + =0"; + test_braille("UEB", expr, "⠭⠰⠔⠌⠃⠐⠀⠭⠐⠀⠌⠃⠀⠐⠶⠀⠌⠚")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_4_2() -> Result<()> { + let expr = "x2-4x-3 + =0"; + test_braille("UEB", expr, "⠭⠰⠔⠌⠃⠐⠀⠌⠙⠭⠐⠀⠌⠉⠀⠐⠶⠀⠌⠚")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_4_3() -> Result<()> { + let expr = "x2-1=0"; + test_braille("UEB", expr, "⠭⠰⠔⠌⠃⠐⠀⠌⠁⠀⠐⠶⠀⠌⠚")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_5_a() -> Result<()> { + let expr = "speed= + distancetime"; + // GTM 1.7.5(a) (2025): two grade 1 symbol indicators so the words stay contracted. + // After the fraction open, "dis" is not a word start (RUEB 10.6.2), so st+ance: ⠙⠊⠌⠹⠑. + test_braille("UEB", expr, "⠎⠏⠑⠫⠀⠐⠶⠀⠰⠷⠙⠊⠌⠚⠑⠚⠌⠐⠞⠰⠟")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_5_b() -> Result<()> { + let expr = "luminositysun"; + test_braille("UEB", expr, "â °â °â ‡â „â â Šâ â •â Žâ Šâ žâ œâ ąâ Łâ Žâ „â â œ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_5_c() -> Result<()> { + let expr = "speed= + distancetime= + 30,000 m + 60 s= + 500 m/s"; + test_braille("UEB", expr, "⠎⠏⠑⠫⠀⠐⠶⠀⠰⠰⠰⠷⠙⠊⠎⠞⠁⠝⠉⠑⠚⠌⠞⠊⠍⠑⠟⠀⠐⠶⠀⠷⠌⠉⠚⠂⠚⠚⠚⠀⠍⠚⠌⠌⠋⠚⠀⠎⠟⠀⠐⠶⠀⠌⠑⠚⠚⠀⠍⠞⠌⠎⠰⠄")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_5_c_unit() -> Result<()> { + // Same as grade1_1_7_5_c; unit marked via data-intent-property + let expr = "speed= + distancetime= + 30,000 m + 60 s= + 500 m/s"; + test_braille("UEB", expr, "⠎⠏⠑⠫⠀⠐⠶⠀⠰⠰⠰⠷⠙⠊⠎⠞⠁⠝⠉⠑⠚⠌⠞⠊⠍⠑⠟⠀⠐⠶⠀⠷⠌⠉⠚⠂⠚⠚⠚⠀⠍⠚⠌⠌⠋⠚⠀⠎⠟⠀⠐⠶⠀⠌⠑⠚⠚⠀⠍⠞⠌⠎⠰⠄")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_1() -> Result<()> { + let expr = "y=x"; + test_braille("UEB", expr, "⠰⠜⠀⠐⠶⠀⠰⠭")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_2() -> Result<()> { + let expr = "25=5"; + test_braille("UEB", expr, "â °â ©â Œâ ƒâ ‘â Źâ €â â ¶â €â Œâ ‘")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_3() -> Result<()> { + let expr = "x=7"; + test_braille("UEB", expr, "â °â °â ©â ­â Źâ €â â ¶â €â Œâ ›")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_4() -> Result<()> { + let expr = "ms + -1"; + test_braille("UEB", expr, "â °â °â â Žâ ”â Łâ â €â Œâ â œ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_4_unit() -> Result<()> { + // Same as grade1_1_7_9_4; unit marked via data-intent-property + let expr = "ms + -1"; + test_braille("UEB", expr, "â °â °â â Žâ ”â Łâ â €â Œâ â œ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_5() -> Result<()> { + let expr = "y=x2"; + // GTM 1.7.9 (July 2025): one symbol indicator; numeric mode covers the closer. + test_braille("UEB", expr, "⠰⠜⠀⠐⠶⠀⠰⠷⠭⠚⠌⠌⠃⠟")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_6() -> Result<()> { + let expr = "y=x22"; + test_braille("UEB", expr, "⠰⠜⠀⠐⠶⠀⠰⠰⠷⠭⠔⠌⠃⠚⠌⠌⠃⠟")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_7() -> Result<()> { + let expr = "xy=cd"; + test_braille("UEB", expr, "⠰⠰⠷⠭⠚⠌⠜⠟⠀⠐⠶⠀⠰⠰⠷⠉⠚⠌⠙⠟")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_8() -> Result<()> { + let expr = "(x,y)"; + test_braille("UEB", expr, "â â Łâ °â ­â ‚â €â °â œâ â œ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_9() -> Result<()> { + let expr = "(xi,yi)"; + test_braille("UEB", expr, "â â Łâ ­â °â ąâ Šâ ‚â €â œâ °â ąâ Šâ â œ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_10() -> Result<()> { + let expr = "(xi2, + yi2)"; + test_braille("UEB", expr, "â °â °â â Łâ ­â ąâ Šâ ”â Œâ ƒâ ‚â €â °â °â œâ ąâ Šâ ”â Œâ ƒâ â œ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_11() -> Result<()> { + let expr = "BÂŻ"; + test_braille("UEB", expr, "⠠⠃⠰⠱")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_12() -> Result<()> { + let expr = "M↔"; + test_braille("UEB", expr, "⠠⠍⠹⠔⠰⠳â ș⠗⠕")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_13() -> Result<()> { + let expr = "AZ + ↔"; + test_braille("UEB", expr, "â °â °â Łâ  â  â â ”â œâ šâ ”â łâ ș⠗⠕")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_14() -> Result<()> { + let expr = "1327Al"; + test_braille("UEB", expr, "â °â ąâ Œâ â ‰â ”â Œâ ƒâ ›â  â â ‡")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_15() -> Result<()> { + let expr = "O2-"; + test_braille("UEB", expr, "â °â °â  â •â ”â Łâ Œâ ƒâ â €â œ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_16() -> Result<()> { + let expr = "2H2 + (g)+ + O2 + (g)→ + 2H2 + O(l)"; + test_braille("UEB", expr, "â Œâ ƒâ  â “â ąâ Œâ ƒâ â Łâ ›â â œâ â –â  â •â ąâ Œâ ƒâ â Łâ ›â â œâ €â °â łâ •â €â Œâ ƒâ  â “â ąâ Œâ ƒâ  â •â â Łâ ‡â â œ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_17() -> Result<()> { + let expr = "y=mx+c"; + test_braille("UEB", expr, "⠰⠜⠀⠐⠶⠀⠍⠭⠐⠖⠉")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_18() -> Result<()> { + let expr = "A=πr2"; + test_braille("UEB", expr, "⠠⠁⠀⠐⠶⠀⠚⠏⠗⠰⠔⠌⠃")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_19() -> Result<()> { + let expr = "E=mc2"; + test_braille("UEB", expr, "⠰⠠⠑⠀⠐⠶⠀⠍⠉⠰⠔⠌⠃")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_20() -> Result<()> { + let expr = "x2-2x+1 + =(x-1)2"; + test_braille("UEB", expr, "â ­â °â ”â Œâ ƒâ â €â Œâ ƒâ ­â â –â Œâ â €â â ¶â €â â Łâ ­â â €â Œâ â â œâ ”â Œâ ƒ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_21() -> Result<()> { + let expr = "xn=1+ + -1nn"; + test_braille("UEB", expr, "â ­â °â ąâ â €â â ¶â €â Œâ â â –â ·â â €â Œâ â ”â â šâ Œâ â Ÿ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_22() -> Result<()> { + let expr = "xn= + 2nn2"; + test_braille("UEB", expr, "â ­â °â ąâ â €â â ¶â €â °â ·â Œâ ƒâ ”â â šâ Œâ â ”â Œâ ƒâ Ÿ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_23() -> Result<()> { + let expr = "x= + + −b± + b2−4ac + + 2a + + "; + test_braille("UEB", expr, "â °â ­â €â â ¶â €â °â °â ·â â €â ƒâ žâ –â ©â ƒâ ”â Œâ ƒâ â €â Œâ ™â °â â ‰â Źâ šâ Œâ Œâ ƒâ °â â Ÿ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_24() -> Result<()> { + let expr = "xsinΞ"; + test_braille("UEB", expr, "⠰⠰⠭⠩⠎⠊⠝⠚â čâ Ź")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_25() -> Result<()> { + let expr = "Version1b"; + test_braille("UEB", expr, "â °â °â  â §â ‘â —â Žâ Šâ •â â ”â Łâ Œâ â °â ƒâ œ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_26() -> Result<()> { + let expr = "W=Fs"; + test_braille("UEB", expr, "â °â  â ș⠀⠐⠶⠀⠠⠋⠎")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_27() -> Result<()> { + let expr = "work=force×distance"; + test_braille("UEB", expr, "⠐â șâ €â â ¶â €â żâ ‰â ‘â â Šâ ™â Šâ Œâ šâ ‘")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_28() -> Result<()> { + let expr = "∎force= + workdistance"; + test_braille("UEB", expr, "⠰⠠⠥⠀⠿⠉⠑⠀⠐⠶⠀⠰⠷⠐â ș⠚⠌⠙⠊⠌⠚⠑⠰⠟")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_29() -> Result<()> { + let expr = "acceleration= + Δspeed + Δtime"; + test_braille("UEB", expr, "⠁⠒⠑⠇⠻⠁⠰⠝⠀⠐⠶⠀⠰⠷⠠⠚⠙⠎⠏⠑⠫⠚⠌⠠⠚⠙⠐⠞⠰⠟")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_30() -> Result<()> { + let expr = "frequency=1time"; + test_braille("UEB", expr, "â ‹â —â ‘â Ÿâ „â ąâ ‰â œâ €â â ¶â €â °â ·â Œâ â šâ Œâ žâ Šâ â ‘â Ÿ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_31() -> Result<()> { + let expr = "frequency=1/time"; + test_braille("UEB", expr, "â ‹â —â ‘â Ÿâ „â ąâ ‰â œâ €â â ¶â €â Œâ â žâ Œâ žâ Šâ â ‘")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_32() -> Result<()> { + let expr = "Vcone= + 13π + r2h"; + test_braille("UEB", expr, "â °â °â  â §â ąâ Łâ ‰â •â â ‘â œâ €â â ¶â €â Œâ â Œâ ‰â šâ â —â ”â Œâ ƒâ °â “")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_33() -> Result<()> { + let expr = "V=∫π + y2dx"; + test_braille("UEB", expr, "â °â  â §â €â â ¶â €â °â °â źâ šâ â œâ ”â Œâ ƒâ °â ™â ­")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_34() -> Result<()> { + let expr = "period=2π + + lcosα + g + "; + test_braille("UEB", expr, "â â »â Šâ •â ™â €â â ¶â €â Œâ ƒâ šâ â ©â ·â ‡â €â °â °â ‰â •â Žâ šâ â šâ Œâ ›â Ÿâ Ź")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_35() -> Result<()> { + let expr = "Assume g=9.81  + ms + -2"; + test_braille("UEB", expr, "⠠⠁⠎⠎⠄⠍⠑⠀⠰⠛⠀⠐⠶⠀⠌⠊â Čâ “â â €â °â °â â Žâ ”â Łâ â €â Œâ ƒâ œ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_35_unit() -> Result<()> { + // Same as grade1_1_7_9_35; unit marked via data-intent-property + let expr = "Assume g=9.81  + ms + -2"; + test_braille("UEB", expr, "⠠⠁⠎⠎⠄⠍⠑⠀⠰⠛⠀⠐⠶⠀⠌⠊â Čâ “â â €â °â °â â Žâ ”â Łâ â €â Œâ ƒâ œ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_36() -> Result<()> { + let expr = "v1=x  + ms + -1"; + test_braille("UEB", expr, "â °â °â °â §â ąâ Œâ â €â â ¶â €â ­â €â â Žâ ”â Łâ â €â Œâ â œâ °â „")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_36_unit() -> Result<()> { + // Same as grade1_1_7_9_36; unit marked via data-intent-property + let expr = "v1=x  + ms + -1"; + test_braille("UEB", expr, "â °â °â °â §â ąâ Œâ â €â â ¶â €â ­â €â â Žâ ”â Łâ â €â Œâ â œâ °â „")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_37() -> Result<()> { + let expr = "P= + t,u,v"; + test_braille("UEB", expr, "â °â °â °â  â â €â â ¶â €â žâ Łâ žâ ‚â €â „â ‚â €â §â žâ œâ °â „")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_38() -> Result<()> { + let expr = "xa=xb + =xc=xd"; + test_braille("UEB", expr, "â °â °â °â ­â ąâ â €â â ¶â €â ­â ąâ ƒâ €â â ¶â €â ­â ąâ ‰â €â â ¶â €â ­â ąâ ™â °â „")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_39() -> Result<()> { + let expr = "x2×x3 + =x2+3 + =x5"; + test_braille("UEB", expr, "â °â °â °â ­â ”â Œâ ƒâ â Šâ ­â ”â Œâ ‰â €â â ¶â €â ­â ”â Łâ Œâ ƒâ â –â Œâ ‰â œâ €â â ¶â €â ­â ”â Œâ ‘â °â „")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_40() -> Result<()> { + let expr = "am×an + =am+n"; + test_braille("UEB", expr, "â °â °â â ”â â â Šâ â ”â â €â â ¶â €â °â °â â ”â Łâ â â –â â œ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_41() -> Result<()> { + let expr = "(am)n + =amn"; + test_braille("UEB", expr, "â °â °â â Łâ â ”â â â œâ ”â â €â â ¶â €â °â °â â ”â Łâ â â œ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_42() -> Result<()> { + let expr = "aman + =am-n"; + test_braille("UEB", expr, "â °â °â ·â â ”â â šâ Œâ â ”â â Ÿâ €â â ¶â €â °â °â â ”â Łâ â â €â â œ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_43() -> Result<()> { + let expr = "a-m + =1am"; + test_braille("UEB", expr, "â °â °â â ”â Łâ â €â â œâ €â â ¶â €â °â ·â Œâ â šâ Œâ â ”â â Ÿ")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_44() -> Result<()> { + let expr = "a0=1"; + test_braille("UEB", expr, "⠁⠰⠔⠌⠚⠀⠐⠶⠀⠌⠁")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_45() -> Result<()> { + let expr = "a1n + =an"; + test_braille("UEB", expr, "â °â °â â ”â ·â Œâ â šâ Œâ â Ÿâ €â â ¶â €â °â °â ©â ”â â â Ź")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_46() -> Result<()> { + let expr = "B→C"; + test_braille("UEB", expr, "⠰⠰⠰⠠⠃⠀⠳⠕⠀⠠⠉⠰⠄")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_47() -> Result<()> { + let expr = "x+y=5"; + test_braille("UEB", expr, "⠭⠐⠖⠜⠀⠐⠶⠀⠌⠑")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_48() -> Result<()> { + let expr = "CH4 + +4Cl2 + → + CCl4 + +4HCl"; + test_braille("UEB", expr, "â °â °â °â  â ‰â  â “â ąâ Œâ ™â â –â Œâ ™â  â ‰â ‡â ąâ Œâ ƒâ €â łâ •â €â  â ‰â  â ‰â ‡â ąâ Œâ ™â â –â Œâ ™â  â “â  â ‰â ‡â °â „")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_49() -> Result<()> { + let expr = "614C + → + 714N + + + -10ÎČ"; + test_braille("UEB", expr, "â °â °â °â ąâ Œâ ‹â ”â Œâ â ™â  â ‰â €â łâ •â €â ąâ Œâ ›â ”â Œâ â ™â  â â â –â ąâ Łâ â €â Œâ â œâ ”â Œâ šâ šâ ƒâ °â „")?; + return Ok(()); + +} + +#[test] +fn grade1_1_7_9_50() -> Result<()> { + let expr = "reliability= + number of faultstotal number of items + =p"; + test_braille("UEB", expr, "⠰⠰⠰⠗⠑⠇⠊⠁⠃⠊⠇⠊⠞⠜⠀⠐⠶⠀⠷⠝⠄⠍⠃⠑⠗⠀⠕⠋⠀⠋⠁⠄⠇⠞⠎⠚⠌⠞⠕⠞⠁⠇⠀⠝⠄⠍⠃⠑⠗⠀⠕⠋⠀⠊⠞⠑⠍⠎⠟⠀⠐⠶⠀⠏⠰⠄")?; + return Ok(()); + +} + #[test] fn number_2_1_2() -> Result<()> { let expr = "3,000"; @@ -313,7 +1123,7 @@ fn bold_2_7_3() -> Result<()> { fn signs_2_10_2() -> Result<()> { let expr = "$0.30,  30c  - or 30¢"; + or 30Âą"; test_braille("UEB", expr, "⠈⠎⠌⠚â Č⠉⠚⠂⠀⠌⠉⠚⠰⠉⠀⠕⠗⠀⠌⠉⠚⠈⠉")?; return Ok(()); @@ -323,7 +1133,7 @@ fn signs_2_10_2() -> Result<()> { fn signs_2_10_5() -> Result<()> { let expr = "1 ft 6 in  or  - 1′ 6′′"; + 1â€Č 6â€Čâ€Č"; test_braille("UEB", expr, "⠌⠁⠀⠋⠞⠀⠌⠋⠀⠔⠀⠕⠗⠀⠌⠁⠶⠀⠌⠋⠶⠶")?; return Ok(()); @@ -331,8 +1141,8 @@ fn signs_2_10_5() -> Result<()> { #[test] fn signs_2_10_8() -> Result<()> { - let expr = "0°C or -  32°F"; + let expr = "0°C or +  32°F"; test_braille("UEB", expr, "⠌⠚⠘⠚⠠⠉⠀⠕⠗⠀⠌⠉⠃⠘⠚⠠⠋")?; return Ok(()); @@ -340,9 +1150,9 @@ fn signs_2_10_8() -> Result<()> { #[test] fn signs_2_10_16() -> Result<()> { - let expr = "1 Å= + let expr = "1 Ă…= 110,000  - μ"; + ÎŒ"; test_braille("UEB", expr, "⠌⠁⠀⠠⠘⠫⠁⠀⠐⠶⠀⠌⠁⠌⠁⠚⠂⠚⠚⠚⠀⠚⠍")?; return Ok(()); @@ -384,7 +1194,7 @@ fn expr_3_1_2() -> Result<()> { #[test] fn expr_3_1_3() -> Result<()> { - let expr = "3×5=5×3=15"; + let expr = "3×5=5×3=15"; test_braille("UEB", expr, "⠌⠉⠐⠊⠌⠑⠀⠐⠶⠀⠌⠑⠐⠊⠌⠉⠀⠐⠶⠀⠌⠁⠑")?; return Ok(()); @@ -393,7 +1203,7 @@ fn expr_3_1_3() -> Result<()> { #[test] fn expr_3_1_6() -> Result<()> { // example includes spaces, so does the MathML (from WIRIS) - let expr = "5.72 m÷10= + let expr = "5.72 mĂ·10= 57.2 cm"; test_braille("UEB", expr, "⠌⠑â Č⠛⠃⠀⠍⠐⠌⠌⠁⠚⠀⠐⠶⠀⠌⠑⠛â Č⠃⠀⠉⠍")?; return Ok(()); @@ -402,7 +1212,7 @@ fn expr_3_1_6() -> Result<()> { #[test] fn expr_3_1_7() -> Result<()> { - let expr = "15±0.5"; + let expr = "15±0.5"; test_braille("UEB", expr, "⠌⠁⠑⠞⠖⠌⠚â Č⠑")?; return Ok(()); @@ -411,7 +1221,7 @@ fn expr_3_1_7() -> Result<()> { #[test] fn expr_3_1_8() -> Result<()> { let expr = "Area=bh= - 5·3=15"; + 5·3=15"; test_braille("UEB", expr, "⠠⠜⠑⠁⠀⠐⠶⠀⠃⠓⠀⠐⠶⠀⠌⠑⠐â Č⠌⠉⠀⠐⠶⠀⠌⠁⠑")?; return Ok(()); @@ -419,7 +1229,7 @@ fn expr_3_1_8() -> Result<()> { #[test] fn expr_3_1_9_wiris() -> Result<()> { - let expr = "3.9×4.1≃16"; + let expr = "3.9×4.1≃16"; test_braille("UEB", expr, "⠌⠉â Č⠊⠐⠊⠌⠙â Č⠁⠀⠞⠔⠀⠌⠁⠋")?; return Ok(()); @@ -427,7 +1237,7 @@ fn expr_3_1_9_wiris() -> Result<()> { #[test] fn expr_3_1_9() -> Result<()> { - let expr = "3.9×4.1≃16"; + let expr = "3.9×4.1≃16"; test_braille("UEB", expr, "⠌⠉â Č⠊⠐⠊⠌⠙â Č⠁⠀⠞⠔⠀⠌⠁⠋")?; return Ok(()); @@ -435,7 +1245,7 @@ fn expr_3_1_9() -> Result<()> { #[test] fn expr_3_1_10() -> Result<()> { - let expr = "5-3≠3-5"; + let expr = "5-3≠3-5"; test_braille("UEB", expr, "⠌⠑⠐⠀⠌⠉⠀⠐⠶⠈⠱⠀⠌⠉⠐⠀⠌⠑")?; return Ok(()); @@ -459,7 +1269,7 @@ fn ratio_3_1_12() -> Result<()> { #[test] fn alg_3_2_1_1() -> Result<()> { - let expr = "y∝x"; + let expr = "y∝x"; test_braille("UEB", expr, "⠰⠜⠀⠞⠐⠶⠀⠰⠭")?; return Ok(()); @@ -475,8 +1285,8 @@ fn alg_3_2_1_2() -> Result<()> { #[test] fn alg_3_2_2() -> Result<()> { - let expr = "0≤θ - ≤2π"; + let expr = "0≀Ξ + ≀2π"; test_braille("UEB", expr, "â Œâ šâ €â žâ ˆâ Łâ €â šâ čâ €â žâ ˆâ Łâ €â Œâ ƒâ šâ ")?; return Ok(()); @@ -502,10 +1312,7 @@ fn alg_3_2_4() -> Result<()> { #[test] fn alg_3_2_5() -> Result<()> { let expr = "d+ab=ac"; - // BANA says use a word indicator if G1 not in first 3 cells (it is after the '='); use passage if >=2 whitespace - // This seems like a poor choice in this case since there is only one G1 indicator, but that's the BANA guidance so... - // "⠰⠰⠰⠙⠐⠖⠁⠃⠀⠐⠶⠀⠁⠉⠰⠄" - // GTM says to use the following and it is more sensisble, so I'm going with it + // GTM 1.7 / BANA 2026: one G1 symbol for standing-alone 'a' after '=' test_braille("UEB", expr, "⠙⠐⠖⠁⠃⠀⠐⠶⠀⠰⠁⠉")?; return Ok(()); @@ -541,10 +1348,10 @@ fn example_3_4_1() -> Result<()> { fn example_3_4_2() -> Result<()> { // removed some cruft from TeX output of {}^{-}2+{}^{+}3, but the basics are preserved let expr = " - − + − 2 + - − + − 3 "; test_braille("UEB", expr, "⠰⠔⠐⠀⠌⠃⠐⠖⠔⠐⠀⠌⠉")?; @@ -578,7 +1385,7 @@ fn omission_3_6_3() -> Result<()> { #[test] fn omission_3_6_4() -> Result<()> { - let expr = "3□7=10"; + let expr = "3□7=10"; test_braille("UEB", expr, "⠌⠉⠫⠌⠙⠱⠌⠛⠀⠐⠶⠀⠌⠁⠚")?; return Ok(()); @@ -637,9 +1444,21 @@ fn fraction_6_2_1() -> Result<()> { #[test] fn fraction_6_2_2() -> Result<()> { let expr = "1750 -  cm= +  cm= + 134 +  m"; + test_braille("UEB", expr, "⠌⠁⠛⠑⠚⠀⠉⠍⠀⠐⠶⠀⠌⠁⠌⠉⠌⠙⠀⠰⠍")?; + return Ok(()); + +} + +#[test] +fn fraction_6_2_2_unit() -> Result<()> { + // Same as fraction_6_2_2; unit marked via data-intent-property + let expr = "1750 +  cm= 134 -  m"; +  m"; test_braille("UEB", expr, "⠌⠁⠛⠑⠚⠀⠉⠍⠀⠐⠶⠀⠌⠁⠌⠉⠌⠙⠀⠰⠍")?; return Ok(()); @@ -648,26 +1467,30 @@ fn fraction_6_2_2() -> Result<()> { #[test] fn fraction_6_2_2_unicode_frac() -> Result<()> { let expr = "1750 -  cm= - 1¾ -  m"; +  cm= + 1Ÿ +  m"; test_braille("UEB", expr, "⠌⠁⠛⠑⠚⠀⠉⠍⠀⠐⠶⠀⠌⠁⠌⠉⠌⠙⠀⠰⠍")?; return Ok(()); } #[test] -fn fraction_6_3_1() -> Result<()> { - let expr = "3/8"; - test_braille("UEB", expr, "⠌⠉⠞⠌⠌⠓")?; +fn fraction_6_2_2_unicode_frac_unit() -> Result<()> { + // Same as fraction_6_2_2_unicode_frac; unit marked via data-intent-property + let expr = "1750 +  cm= + 1Ÿ +  m"; + test_braille("UEB", expr, "⠌⠁⠛⠑⠚⠀⠉⠍⠀⠐⠶⠀⠌⠁⠌⠉⠌⠙⠀⠰⠍")?; return Ok(()); } #[test] -fn fraction_6_4_1() -> Result<()> { - let expr = "y=x2"; - test_braille("UEB", expr, "⠰⠰⠰⠜⠀⠐⠶⠀⠷⠭⠚⠌⠌⠃⠟⠰⠄")?; +fn fraction_6_3_1() -> Result<()> { + let expr = "3/8"; + test_braille("UEB", expr, "⠌⠉⠞⠌⠌⠓")?; return Ok(()); } @@ -716,8 +1539,9 @@ fn fraction_6_4_5() -> Result<()> { #[test] fn fraction_6_4_6() -> Result<()> { let expr = "speed=distancetime"; - // GTM lists two options: "⠎⠏⠑⠫⠀⠐⠶⠀⠰⠰⠷⠙⠊⠎⠞⠁⠝⠉⠑⠚⠌⠞⠊⠍⠑⠟" and "⠰⠰⠰⠎⠏⠑⠑⠙⠀⠐⠶⠀⠷⠙⠊⠎⠞⠁⠝⠉⠑⠚⠌⠞⠊⠍⠑⠟⠰⠄" - test_braille("UEB", expr, "⠎⠏⠑⠫⠀⠐⠶⠀⠰⠰⠷⠙⠊⠎⠞⠁⠝⠉⠑⠚⠌⠞⠊⠍⠑⠟")?; + // GTM 2014 §6.4 listed word-indicator and passage alternatives (uncontracted words). + // GTM 1.7.5(a) (2025) prefers two grade 1 symbol indicators with contracted words. + test_braille("UEB", expr, "⠎⠏⠑⠫⠀⠐⠶⠀⠰⠷⠙⠊⠌⠚⠑⠚⠌⠐⠞⠰⠟")?; return Ok(()); } @@ -766,7 +1590,7 @@ fn msup_7_3_7() -> Result<()> { #[test] fn msup_7_3_11() -> Result<()> { let expr = "xaby=x"; - test_braille("UEB", expr, "⠰⠰⠰⠭⠔⠷⠁⠚⠌⠃⠟⠜⠀⠐⠶⠀⠭⠰⠄")?; + test_braille("UEB", expr, "⠰⠰⠭⠔⠷⠁⠚⠌⠃⠟⠜⠀⠐⠶⠀⠰⠭")?; return Ok(()); } @@ -798,7 +1622,7 @@ fn msub_7_4_3() -> Result<()> { #[test] fn msup_7_5_1() -> Result<()> { let expr = "0.0045= - 4.5×10-3 + 4.5×10-3 "; test_braille("UEB", expr, "⠌⠚â Č⠚⠚⠙⠑⠀⠐⠶⠀⠌⠙â Čâ ‘â â Šâ Œâ â šâ ”â Łâ â €â Œâ ‰â œ")?; return Ok(()); @@ -824,7 +1648,7 @@ fn msup_7_6_2() -> Result<()> { #[test] fn msubsup_7_7_1() -> Result<()> { let expr = "x12=y23"; - test_braille("UEB", expr, "â °â °â °â ­â ąâ Œâ â ”â Œâ ƒâ €â â ¶â €â œâ ąâ Œâ ƒâ ”â Œâ ‰â °â „")?; + test_braille("UEB", expr, "â ­â °â ąâ Œâ â ”â Œâ ƒâ €â â ¶â €â œâ °â ąâ Œâ ƒâ ”â Œâ ‰")?; return Ok(()); } @@ -852,7 +1676,7 @@ fn pre_sup_7_8_2() -> Result<()> { +3- =5- "; - test_braille("UEB", expr, "⠰⠰⠰⠔⠐⠀⠌⠃⠐⠖⠔⠐⠀⠌⠉⠀⠐⠶⠀⠔⠐⠀⠌⠑⠰⠄")?; + test_braille("UEB", expr, "⠰⠔⠐⠀⠌⠃⠐⠖⠔⠐⠀⠌⠉⠀⠐⠶⠀⠰⠔⠐⠀⠌⠑")?; return Ok(()); } @@ -860,9 +1684,9 @@ fn pre_sup_7_8_2() -> Result<()> { #[test] fn sum_7_9_1() -> Result<()> { - let expr = "∑x=1n + let expr = "∑x=1n xi2"; - test_braille("UEB", expr, "â °â °â  â šâ Žâ šâ ąâ Łâ ­â â ¶â Œâ â œâ šâ ”â â ­â ąâ Šâ ”â Œâ ƒ")?; + test_braille("UEB", expr, "â  â šâ Žâ šâ ąâ °â Łâ ­â â ¶â Œâ â œâ šâ ”â â ­â ąâ Šâ ”â Œâ ƒ")?; return Ok(()); } @@ -870,7 +1694,7 @@ fn sum_7_9_1() -> Result<()> { #[test] fn lim_7_9_2() -> Result<()> { // Note: modified because passage indicator is not needed (same expr when word indicator is used) - let expr = "limx→a + let expr = "limx→a f(x)=1"; test_braille("UEB", expr, "â °â °â ‡â Šâ â šâ ąâ Łâ ­â łâ •â â œâ ‹â â Łâ ­â â œâ €â â ¶â €â Œâ ")?; return Ok(()); @@ -889,7 +1713,7 @@ fn sqrt_8_1_1() -> Result<()> { fn sqrt_8_1_2() -> Result<()> { let expr = "r= x2+y2"; - test_braille("UEB", expr, "â °â °â °â —â €â â ¶â €â ©â ­â ”â Œâ ƒâ â –â œâ ”â Œâ ƒâ Źâ °â „")?; + test_braille("UEB", expr, "â °â —â €â â ¶â €â °â °â ©â ­â ”â Œâ ƒâ â –â œâ ”â Œâ ƒâ Ź")?; return Ok(()); } @@ -899,7 +1723,7 @@ fn sqrt_8_1_3() -> Result<()> { let expr = " - 783.2×6.547 + 783.2×6.547 0.4628 @@ -915,17 +1739,17 @@ fn sqrt_8_1_4() -> Result<()> { x = - −b± + −b± b 2 - −4ac + −4ac 2a "; - test_braille("UEB", expr, "â °â °â °â ­â €â â ¶â €â ·â â €â ƒâ žâ –â ©â ƒâ ”â Œâ ƒâ â €â Œâ ™â °â â ‰â Źâ šâ Œâ Œâ ƒâ °â â Ÿâ °â „")?; + test_braille("UEB", expr, "â °â ­â €â â ¶â €â °â °â ·â â €â ƒâ žâ –â ©â ƒâ ”â Œâ ƒâ â €â Œâ ™â °â â ‰â Źâ šâ Œâ Œâ ƒâ °â â Ÿ")?; return Ok(()); } @@ -946,7 +1770,7 @@ fn root_8_2_2() -> Result<()> { y3+ z3 3"; - test_braille("UEB", expr, "â °â °â °â Ÿâ €â â ¶â €â ©â ”â Œâ ‰â ­â ”â Œâ ‰â â –â œâ ”â Œâ ‰â â –â ”â ”â Œâ ‰â Źâ °â „")?; + test_braille("UEB", expr, "â °â Ÿâ €â â ¶â €â °â °â ©â ”â Œâ ‰â ­â ”â Œâ ‰â â –â œâ ”â Œâ ‰â â –â ”â ”â Œâ ‰â Ź")?; return Ok(()); } @@ -992,7 +1816,7 @@ fn spacing_9_3_1_1() -> Result<()> { #[test] fn spacing_9_3_1_2() -> Result<()> { - let expr = "3tan45°"; + let expr = "3tan45°"; test_braille("UEB", expr, "⠌⠉⠞⠁⠝⠌⠙⠑⠘⠚")?; return Ok(()); @@ -1016,7 +1840,7 @@ fn spacing_9_3_2_1() -> Result<()> { #[test] fn spacing_9_3_2_2() -> Result<()> { - let expr = "sinθ"; + let expr = "sinΞ"; test_braille("UEB", expr, "⠎⠔⠹â č")?; return Ok(()); @@ -1041,7 +1865,9 @@ fn spacing_9_3_2_4() -> Result<()> { #[test] fn spacing_9_3_2_5() -> Result<()> { let expr = "Limx2"; - test_braille("UEB", expr, "⠰⠰⠠⠇⠊⠍⠷⠭⠚⠌⠌⠃⠟")?; + // GTM 2014 9.3.2 used a word indicator (;;,lim(x./#b)). GTM 1.7.3(a): one + // symbol indicator on the fraction open; numeric mode covers the closer. + test_braille("UEB", expr, "⠠⠇⠊⠍⠰⠷⠭⠚⠌⠌⠃⠟")?; return Ok(()); } @@ -1091,8 +1917,8 @@ fn spacing_9_3_3_5() -> Result<()> { #[test] fn spacing_9_3_3_6() -> Result<()> { - let expr = "sin2β= - 2sinβcosβ"; + let expr = "sin2ÎČ= + 2sinÎČcosÎČ"; test_braille("UEB", expr, "⠎⠔⠌⠃⠚⠃⠀⠐⠶⠀⠌⠃⠎⠊⠝⠚⠃⠉⠕⠎⠚⠃")?; return Ok(()); @@ -1121,9 +1947,9 @@ fn text_9_7_1() -> Result<()> { fn stat_9_7_2() -> Result<()> { let expr = "Exp(R)= n2+1"; - // GTM uses "â °â °â °â  â ‘â ­â â â Łâ  â —â â œâ €â â ¶â €â ·â â šâ Œâ Œâ ƒâ Ÿâ â –â Œâ â °â „", - // but "â  â ‘â ­â â â Łâ  â —â â œâ €â â ¶â €â °â °â ·â â šâ Œâ Œâ ƒâ Ÿâ â –â Œâ " is shorter and is consistent with omission_3_6_7 and fraction_6_4_6 - test_braille("UEB", expr, "â  â ‘â ­â â â Łâ  â —â â œâ €â â ¶â €â °â °â ·â â šâ Œâ Œâ ƒâ Ÿâ â –â Œâ ")?; + // GTM 2014 9.7 used a passage around the whole equation. GTM 1.7.3(a): one + // symbol indicator on n/2 (same as grade1_1_7_9_5). + test_braille("UEB", expr, "â  â ‘â ­â â â Łâ  â —â â œâ €â â ¶â €â °â ·â â šâ Œâ Œâ ƒâ Ÿâ â –â Œâ ")?; return Ok(()); } @@ -1141,7 +1967,7 @@ fn set_10_1() -> Result<()> { #[test] fn set_10_3() -> Result<()> { - let expr = "3∈A∩B"; + let expr = "3∈A∩B"; test_braille("UEB", expr, "⠌⠉⠀⠘⠑⠀⠠⠁⠚⠊⠠⠃")?; return Ok(()); @@ -1149,7 +1975,7 @@ fn set_10_3() -> Result<()> { #[test] fn set_10_4() -> Result<()> { - let expr = "A∩B⊂A∪B"; + let expr = "A∩B⊂AâˆȘB"; test_braille("UEB", expr, "⠠⠁⠹⠩⠠⠃⠀⠘⠣⠀⠠⠁⠹⠖⠠⠃")?; return Ok(()); @@ -1158,7 +1984,7 @@ fn set_10_4() -> Result<()> { fn set_10_5() -> Result<()> { let expr = "A'âˆȘB'= (A∩B)'"; - test_braille("UEB", expr, "â °â °â °â  â â ¶â šâ –â  â ƒâ ¶â €â â ¶â €â â Łâ  â â šâ Šâ  â ƒâ â œâ ¶â °â „")?; + test_braille("UEB", expr, "â °â °â  â â ¶â šâ –â  â ƒâ ¶â €â â ¶â €â â Łâ  â â šâ Šâ  â ƒâ â œâ °â ¶")?; return Ok(()); } @@ -1166,11 +1992,9 @@ fn set_10_5() -> Result<()> { #[test] fn set_10_6() -> Result<()> { // Note: example uses the wrong char "├" in the display -- should be "⊱" - let expr = "[(p∨q)∧¬p] + let expr = "[(p√q)∧p] ⊱q"; - // Acceptable: GTM does uses a G1 passage indicator: "⠰⠰⠰⠹⠣⠐⠣⠏⠈⠖⠟⠐⠜⠈⠩⠈â č⠏⠹⠜⠀⠾⠒⠀⠟⠰⠄" - // However, the BANA G1 standing alone rule ("...before a single letter standing alone") applies, so start in G2 mode. - // Corrected to remove the passage indicator + // GTM / BANA 2026: grade 1 passage test_braille("UEB", expr, "⠹⠣⠐⠣⠏⠈⠖⠟⠐⠜⠈⠩⠈â č⠏⠹⠜⠀⠾⠒⠀⠰⠟")?; return Ok(()); @@ -1187,9 +2011,7 @@ fn example_11_5_1_2() -> Result<()> { #[test] fn example_11_5_1_3() -> Result<()> { let expr = "f'(x)"; - // Acceptable: GTM uses a G1 start indicator: "â °â °â ‹â ¶â â Łâ ­â â œ" - // However, BANA says don't use a word indicator if G1 is in first 3 cells (the ':' needs it) - // Corrected to avoid word indicator + // GTM / BANA 2026: grade 1 word indicator test_braille("UEB", expr, "â ‹â °â ¶â â Łâ ­â â œ")?; return Ok(()); @@ -1197,7 +2019,7 @@ fn example_11_5_1_3() -> Result<()> { #[test] fn example_11_5_1_4() -> Result<()> { - let expr = "∂y∂x"; + let expr = "∂y∂x"; test_braille("UEB", expr, "⠰⠰⠷⠈⠙⠜⠚⠌⠈⠙⠭⠟")?; return Ok(()); @@ -1205,11 +2027,11 @@ fn example_11_5_1_4() -> Result<()> { #[test] fn example_11_5_2() -> Result<()> { - let expr = "∫23(2x+1)dx + let expr = "∫23(2x+1)dx =x2+x23 =(32+3)-(22+2) =12-6=6"; - test_braille("UEB", expr, "â °â °â °â źâ ąâ Œâ ƒâ ”â Œâ ‰â â Łâ Œâ ƒâ ­â â –â Œâ â â œâ ™â ­â €â â ¶â €â šâ Łâ ­â ”â Œâ ƒâ â –â ­â šâ œâ ąâ Œâ ƒâ ”â Œâ ‰â €â â ¶â €â â Łâ Œâ ‰â ”â Œâ ƒâ â –â Œâ ‰â â œâ â €â â Łâ Œâ ƒâ ”â Œâ ƒâ â –â Œâ ƒâ â œâ €â â ¶â €â Œâ â ƒâ â €â Œâ ‹â €â â ¶â €â Œâ ‹â °â „")?; + test_braille("UEB", expr, "â °â °â źâ ąâ Œâ ƒâ ”â Œâ ‰â â Łâ Œâ ƒâ ­â â –â Œâ â â œâ ™â ­â €â â ¶â €â šâ Łâ ­â °â ”â Œâ ƒâ â –â ­â šâ œâ ąâ Œâ ƒâ ”â Œâ ‰â €â â ¶â €â â Łâ Œâ ‰â ”â Œâ ƒâ â –â Œâ ‰â â œâ â €â â Łâ Œâ ƒâ ”â Œâ ƒâ â –â Œâ ƒâ â œâ €â â ¶â €â Œâ â ƒâ â €â Œâ ‹â €â â ¶â €â Œâ ‹")?; return Ok(()); } @@ -1229,19 +2051,19 @@ fn example_11_5_3() -> Result<()> { = n! - r!(n−r)! + r!(n−r)! "; // modified to use "shape" as recommended in a comment on this example - test_braille("UEB", expr, "â °â °â °â ”â â  â ‰â ąâ —â €â â ¶â €â â Łâ â °â »â —â â œâ €â â ¶â €â ·â â –â šâ Œâ —â –â â Łâ â â €â —â â œâ –â Ÿâ °â „")?; + test_braille("UEB", expr, "â °â °â ”â â  â ‰â ąâ —â €â â ¶â €â â Łâ â °â »â —â â œâ €â â ¶â €â °â °â ·â â –â šâ Œâ —â –â â Łâ â â €â —â â œâ –â Ÿ")?; return Ok(()); } #[test] fn example_11_5_4() -> Result<()> { - let expr = "a∗(b◦c) - =(a∗b)◦(a∗c)"; + let expr = "a∗(b◩c) + =(a∗b)◩(a∗c)"; test_braille("UEB", expr, "â â â ”â â Łâ ƒâ â Žâ ‰â â œâ €â â ¶â €â â Łâ â â ”â ƒâ â œâ â Žâ â Łâ â â ”â ‰â â œ")?; return Ok(()); @@ -1252,11 +2074,11 @@ fn example_11_5_5_2() -> Result<()> { let expr = " f - − 1 + − 1 : Y - → + → X "; test_braille("UEB", expr, "â °â °â °â ‹â ”â Łâ â €â Œâ â œâ ’â €â  â œâ €â łâ •â €â  â ­â °â „")?; @@ -1268,17 +2090,17 @@ fn example_11_5_5_2() -> Result<()> { fn example_11_5_5_3() -> Result<()> { // this comes from MathJax let expr = " - ∀ + ∀ y - ∈ + ∈ Y - ∃ + ∃ x - ∈ + ∈ X "; - test_braille("UEB", expr, "â °â °â °â ˜â â œâ €â ˜â ‘â €â  â œâ €â ˜â ąâ ­â €â ˜â ‘â €â  â ­â °â „")?; + test_braille("UEB", expr, "â ˜â â œâ €â ˜â ‘â €â °â  â œâ €â ˜â ąâ ­â €â ˜â ‘â €â °â  â ­")?; return Ok(()); } @@ -1291,7 +2113,7 @@ fn example_11_5_6() -> Result<()> { x + y = 6 return Ok(()); } "; - test_braille("UEB", expr, "â °â °â °â žâ Łâ â Łâ ­â ‚â €â œâ â œâ €â žâ łâ €â ­â â –â œâ €â â ¶â €â Œâ ‹â žâ œâ °â „")?; + test_braille("UEB", expr, "â žâ Łâ â Łâ °â ­â ‚â €â °â œâ â œâ €â žâ łâ €â ­â â –â œâ €â â ¶â €â Œâ ‹â žâ œ")?; return Ok(()); } @@ -1315,7 +2137,7 @@ fn example_11_6() -> Result<()> { fn bar_over_12_1_1() -> Result<()> { let expr = "x_= 10+11+123"; - test_braille("UEB", expr, "⠰⠰⠰⠭⠱⠀⠐⠶⠀⠷⠌⠁⠚⠐⠖⠌⠁⠁⠐⠖⠌⠁⠃⠚⠌⠌⠉⠟⠰⠄")?; + test_braille("UEB", expr, "⠭⠰⠱⠀⠐⠶⠀⠰⠷⠌⠁⠚⠐⠖⠌⠁⠁⠐⠖⠌⠁⠃⠚⠌⠌⠉⠟")?; return Ok(()); } @@ -1346,8 +2168,8 @@ fn dot_12_1_4() -> Result<()> { #[test] fn dot_12_1_5() -> Result<()> { - let expr = "0.561˙ - 23˙"; + let expr = "0.561˙ + 23˙"; test_braille("UEB", expr, "⠌⠚â Čâ ‘â ‹â Łâ Œâ â œâ ˜â Čâ Œâ ƒâ Łâ Œâ ‰â œâ ˜â Č")?; return Ok(()); @@ -1355,7 +2177,7 @@ fn dot_12_1_5() -> Result<()> { #[test] fn dot_12_1_6_single() -> Result<()> { - let expr = "x˙"; + let expr = "x˙"; test_braille("UEB", expr, "⠭⠘â Č")?; return Ok(()); @@ -1363,7 +2185,7 @@ fn dot_12_1_6_single() -> Result<()> { #[test] fn dot_12_1_6_double() -> Result<()> { - let expr = "x¨"; + let expr = "xš"; test_braille("UEB", expr, "⠰⠰⠭⠹⠔⠣â Čâ Č⠜")?; return Ok(()); @@ -1372,9 +2194,7 @@ fn dot_12_1_6_double() -> Result<()> { #[test] fn hat_12_1_7() -> Result<()> { let expr = "AB^C"; - // Acceptable: GTM uses a G1 start indicator: "⠰⠰⠠⠁⠠⠃⠐⠱⠠⠉" - // BANA says use a word indicator if G1 not in first 3 cells (modified it to not count cap indicators since that helps with GTM compatibility) - // Corrected to skip the G1 indicator at the start (it's debatable as to which is better) + // GTM / BANA 2026: grade 1 word indicator test_braille("UEB", expr, "⠠⠁⠠⠃⠰⠐⠱⠠⠉")?; return Ok(()); @@ -1400,7 +2220,7 @@ fn arrow_under_12() -> Result<()> { #[test] fn bar_12_2_1() -> Result<()> { - let expr = "xy¯"; + let expr = "xyÂŻ"; test_braille("UEB", expr, "â °â °â ­â ”â Łâ œâ ±â œ")?; return Ok(()); @@ -1408,7 +2228,7 @@ fn bar_12_2_1() -> Result<()> { #[test] fn bar_12_2_2() -> Result<()> { - let expr = "xy¯"; + let expr = "xyÂŻ"; test_braille("UEB", expr, "â °â °â Łâ ­â ”â œâ œâ ±")?; return Ok(()); @@ -1416,7 +2236,7 @@ fn bar_12_2_2() -> Result<()> { #[test] fn shape_14_1_1_1() -> Result<()> { - let expr = "△ ABC"; + let expr = "△ ABC"; test_braille("UEB", expr, "⠰⠫⠌⠉⠀⠠⠠⠁⠃⠉")?; return Ok(()); @@ -1424,7 +2244,7 @@ fn shape_14_1_1_1() -> Result<()> { #[test] fn shape_14_1_2_1() -> Result<()> { - let expr = "△ABC"; + let expr = "△ABC"; test_braille("UEB", expr, "⠰⠫⠌⠉⠱⠠⠠⠁⠃⠉")?; return Ok(()); @@ -1433,11 +2253,11 @@ fn shape_14_1_2_1() -> Result<()> { #[test] fn shape_14_1_2_2() -> Result<()> { // the for the shapes are wrong -- but it isn't clear what they should be (from WIRIS editor) - let expr = "{□, -  ◍, -  ▲, + let expr = "{□, +  â—, +  â–Č, return Ok(()); -  ▧ …}"; +  â–§ â€Š}"; test_braille("UEB", expr, "â žâ Łâ °â «â Œâ ™â ±â ‚â €â šâ «â żâ ±â ‚â €â žâ «â Œâ ‰â ±â ‚â €â šâ «â Œâ ™â €â Čâ Čâ Č⠾⠜")?; return Ok(()); } @@ -1584,11 +2404,8 @@ fn omission_15_4_1() -> Result<()> { #[test] fn chem_16_2_8() -> Result<()> { let expr = "Ca(OH)2"; - // Acceptable: GTM does not use a G1 start indicator: "â  â ‰â â â Łâ  â •â  â “â â œâ °â ąâ Œâ ƒ" - // However, BANA says use a word indicator if G1 not in first 3 cells (it is before the subscript near the end); use passage if >=2 whitespace - // This seems like a debateable choice in this case since there is only one G1 indicator, but that's the BANA guidance so... - // Corrected to use word indicator - test_braille("UEB", expr, "â °â °â  â ‰â â â Łâ  â •â  â “â â œâ ąâ Œâ ƒ")?; + // GTM / BANA 2026: single G1 symbol for subscript (no word indicator) + test_braille("UEB", expr, "â  â ‰â â â Łâ  â •â  â “â â œâ °â ąâ Œâ ƒ")?; return Ok(()); } @@ -1623,7 +2440,7 @@ fn chem_16_2_9() -> Result<()> { - ⋅ + ⋅ @@ -1658,11 +2475,8 @@ fn chem_16_2_9() -> Result<()> { "; - // Acceptable: GTM does not use a G1 start indicator: "â  â ‰â „â  â Žâ  â •â °â ąâ Œâ ™â â Čâ Œâ ‘â  â “â ąâ Œâ ƒâ  â •" - // However, BANA says use a word indicator if G1 not in first 3 cells (it is before the subscript); use passage if >=2 whitespace - // This seems like a debatable choice in this case since there is only one G1 indicator, but that's the BANA guidance so... - // Corrected to use word indicator - test_braille("UEB", expr, "â °â °â  â ‰â „â  â Žâ  â •â ąâ Œâ ™â â Čâ Œâ ‘â  â “â ąâ Œâ ƒâ  â •")?; + // GTM / BANA 2026: single G1 symbol for first subscript (no word indicator) + test_braille("UEB", expr, "â  â ‰â „â  â Žâ  â •â °â ąâ Œâ ™â â Čâ Œâ ‘â  â “â ąâ Œâ ƒâ  â •")?; return Ok(()); } @@ -1693,14 +2507,14 @@ fn chem_16_2_12() -> Result<()> { R - ⋅ + ⋅ CH ( OH ) - ⋅ + ⋅ CH @@ -1708,7 +2522,7 @@ fn chem_16_2_12() -> Result<()> { 2 - ⋅ + ⋅ CH @@ -1716,7 +2530,7 @@ fn chem_16_2_12() -> Result<()> { 2 - ⋅ + ⋅ CO @@ -1726,9 +2540,8 @@ fn chem_16_2_12() -> Result<()> { H "; - // GTM uses G2 mode and has two G1 indicators (in middle and near end). That definitely violates BANA guidelines and maybe there guidelines. - // I have switched it to G1 word mode, which seems better (same length, but no switching) - test_braille("UEB", expr, "⠰⠰⠠⠠⠠⠗⠐â Č⠉⠓⠐⠣⠕⠓⠐⠜⠐â Čâ ‰â “â ąâ Œâ ƒâ â Čâ ‰â “â ąâ Œâ ƒâ â Čâ ‰â •â ąâ Œâ ƒâ °â “â  â „")?; + // GTM / BANA 2026: G2 with inline G1 symbols (not forced word mode) + test_braille("UEB", expr, "⠠⠠⠠⠗⠐â Č⠡⠐⠣⠕⠓⠐⠜⠐â Čâ Ąâ °â ąâ Œâ ƒâ â Čâ ‰â “â ąâ Œâ ƒâ â Čâ ‰â •â ąâ Œâ ƒâ °â “â  â „")?; return Ok(()); } @@ -1815,7 +2628,7 @@ fn chem_16_5_1() -> Result<()> { - → + → Na @@ -1861,7 +2674,7 @@ fn chem_16_5_1() -> Result<()> { "#; - test_braille("UEB", expr, "â °â °â °â Œâ ƒâ  â â â  â •â  â “â â –â  â “â ąâ Œâ ƒâ  â Žâ  â •â ąâ Œâ ™â €â łâ •â €â  â â â ąâ Œâ ƒâ  â Žâ  â •â ąâ Œâ ™â â –â Œâ ƒâ  â “â ąâ Œâ ƒâ  â •â °â „")?; + test_braille("UEB", expr, "â Œâ ƒâ  â â â  â •â  â “â â –â  â “â ąâ Œâ ƒâ  â Žâ  â •â ąâ Œâ ™â €â °â łâ •â €â  â â â °â ąâ Œâ ƒâ  â Žâ  â •â ąâ Œâ ™â â –â Œâ ƒâ  â “â ąâ Œâ ƒâ  â •")?; return Ok(()); } @@ -1872,7 +2685,7 @@ fn chem_16_5_2() -> Result<()> { let expr = r#" N2 - →Haber processH2 + →Haber processH2 N H3 @@ -1952,7 +2765,7 @@ fn chem_16_5_4() -> Result<()> { - → + → @@ -1983,7 +2796,7 @@ fn chem_16_5_4() -> Result<()> { - ⋅ + ⋅ @@ -1995,7 +2808,7 @@ fn chem_16_5_4() -> Result<()> { - ⋅ + ⋅ @@ -2005,7 +2818,7 @@ fn chem_16_5_4() -> Result<()> { - → + → @@ -2040,7 +2853,7 @@ fn chem_16_5_4() -> Result<()> { - ⋅ + ⋅ @@ -2052,7 +2865,7 @@ fn chem_16_5_4() -> Result<()> { - ⋅ + ⋅ @@ -2111,16 +2924,16 @@ fn chem_16_5_5() -> Result<()> { - ↽ + ↜ - − + − - − + − - ⇀ + ⇀ @@ -2128,7 +2941,7 @@ fn chem_16_5_5() -> Result<()> { "#; - test_braille("UEB", expr, "â °â °â °â  â â ƒâ ”â Łâ â –â â –â œâ â –â Œâ ƒâ °â ‘â €â ˜â žâ ¶â €â  â â ƒâ °â „")?; + test_braille("UEB", expr, "â °â °â  â â ƒâ ”â Łâ â –â â –â œâ â –â Œâ ƒâ °â ‘â €â °â ˜â žâ ¶â €â  â â ƒ")?; return Ok(()); } diff --git a/tests/braille/UEB/other.rs b/tests/braille/UEB/other.rs index 7dda38f6c..9b8a1ab29 100644 --- a/tests/braille/UEB/other.rs +++ b/tests/braille/UEB/other.rs @@ -12,7 +12,7 @@ use anyhow::Result; #[test] fn overscript_grouping_aph_5_4_8() -> Result<()> { // this test was added because #220 (failed to add grouping around overscript) - let expr = " MN ↔ "; + let expr = " MN ↔ "; test_braille("UEB", expr, "⠰⠰⠣⠠⠠⠍⠝⠜⠹⠔⠳â ș⠗⠕")?; return Ok(()); @@ -39,7 +39,7 @@ fn blank_aph_7_1_ex5() -> Result<()> { #[test] fn word_symbol_aph_10_3_11() -> Result<()> { // this test was added because ⊻ (U+22bb) uses a 'G1 Word mode' char, so is different than others - let expr = " p ⊻ q "; + let expr = " p ⊻ q "; test_braille("UEB", expr, "⠰⠰⠏⠈⠖⠠⠱⠟")?; return Ok(()); @@ -247,6 +247,23 @@ fn ueb_no_italic_typeform_for_math_letters() -> Result<()> { return Ok(()); } +#[test] +fn ueb_space_because_and_qed() -> Result<()> { + // ∔ and ∎ are spaced like ∎ (GTM 11 miscellaneous; same mo AddSpaces path as 1.7.9). + test_braille("UEB", "∔x=1", "⠈⠌⠀⠰⠭⠀⠐⠶⠀⠌⠁")?; + test_braille("UEB", "x=1∎", "⠰⠭⠀⠐⠶⠀⠌⠁⠀⠞⠫⠌⠙⠱")?; + return Ok(()); +} + +#[test] +fn ueb_math_typeform_not_part_of_word() -> Result<()> { + // Double-struck/script/fraktur letters are math alphabets, not part of an English + // letters-sequence, so a following whole word still takes its contraction (time → ⠐⠞). + test_braille("UEB", "Rtime", "⠈⠆⠠⠗⠐⠞")?; + test_braille("UEB", "R", "⠈⠆⠰⠠⠗")?; + return Ok(()); +} + #[test] fn ueb_italic_typeform_for_digits() -> Result<()> { // UEB uses italic typeform for digits (GTM 2.7 emphasis of numeric material). From 9ea98c23e8c44eb19975f3da4a0284b5eaf0c056 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dziwisz?= Date: Wed, 2 Sep 2026 15:42:45 +0200 Subject: [PATCH 085/162] pl: fix five speech/navigation defects and catch up with recent en changes (#738) * pl: speak up tack (U+22A5) as perpendicular, matching en Follow-up to 45aefb2d for Polish. Editors commonly emit U+22A5 where perpendicularity is meant, so both U+27C2 and U+22A5 now say "jest prostopadle do". LiteralSpeak keeps reading U+22A5 literally as "dol". Previously Polish said "dol" for U+22A5, so the same formula was read differently in Polish than in English. Adds up_tack_330 to tests/Languages/pl/alphabets.rs, mirroring the English test. * pl: adopt the `|` argument-glue syntax from definitions.yaml Follow-up to 4347d884 for Polish. That commit added the `|` syntax and updated the Polish tests, but not the Polish rule files, so several intents lost their function name in speech. Fixed, with the spoken output before -> after: quotient "podzielone przez z x przecinek, y" -> "czesc calkowita z x podzielone przez y" remainder "podzielone przez z x przecinek, y" -> "reszta z x podzielone przez y" set-difference "i z wielka a przecinek, wielka b" -> "roznica zbiorow z wielka a i wielka b" polar-coordinate "przecinek z x przecinek, y" -> "wspolrzedna biegunowa z x przecinek, y" The `|` syntax needs the function-intent rule to call IntentFunctionUseArityPath / IntentFunctionGlueBefore. Only en and hu had it, so it is now ported to pl (with "of" -> "z"). Also here: * SharedRules/geometry.yaml: the `coordinate` rule matched "." instead of "not(*[@arg])", so it swallowed coordinate($x,...) intents that should fall through to IntentMappings. Its name was also mistranslated as "przecinek" (comma) rather than "punkt" (point). * transpose: fixity order now matches en (postfix first). The function form is tested explicitly via intent='transpose:function($x)', as en does. * empty-set: added, it was missing. NOT adopted: arity templates ("| po | od,do") for sum/product. intent_function_glue_before in src/infer_intent.rs hardcodes the English word "of" for the last argument, which yields "suma po i of x" in Polish. This affects every non-English language; hu avoids it the same way. The binary separator form works correctly and is what this commit uses. * pl: fix navigation direction words, unreachable for any translation Follow-up to ec36e057 and 080ca162 for Polish, but it also fixes a long-standing Polish bug rather than only porting the new code. navigate.yaml compared the suffix of $NavCommand (always English, e.g. "ZoomIn") against a substring offset by the length of the SPOKEN $Prefix. For English those are the same; for any translation they are not. With "przybliz" (8 chars) vs "Zoom" (4), "ZoomIn" was cut to "" instead of "In", so ALL 16 branches were dead: ZoomIn -> "" (want "In") ZoomOutAll -> "ll" (want "OutAll") MoveNext -> "t" (want "Next") DescribeNext -> "ibeNext" (want "Next") Users heard "przejdz; do mianownika" with no direction, never "przejdz w prawo". Using $CommandOffset, as ec36e057 introduced, fixes all of them. Two more things here: * Polish needs two verbs where English reuses "zoom": "przybliz na zewnatrz" (zoom in outwards) is self-contradictory, so ZoomOut* now says "oddal". The direction word for plain In/Out is dropped, as the verb already carries it: "przybliz" / "oddal", and "przybliz maksymalnie" / "oddal maksymalnie". * Ports into-or-out-of-prefix-or-silent-without-parts (080ca162) and the SpeakIntentName fallbacks in into-or-out-of-default, keeping our own Polish preposition logic (including "ze stopnia" euphony). Adds zoom_speech_pl and move_char_speech_pl. Both fail on the old formula, showing the missing direction word, so they do discriminate. * pl: announce table column and row separators Follow-up to fbc49bb7 (#679) for Polish. The HasVisibleColumnLine / HasVisibleRowLine rules were missing from pl/SharedRules/default.yaml, so visible lines in a matrix were silent for Polish users, e.g. an augmented matrix was read exactly like a plain one. before: "2 na 3 macierz rozszerzona; wiersz 1; 3, 1, 4; ..." after: "2 na 3 macierz rozszerzona; wiersz 1; 3, 1, separator, 4; ..." Two existing tests (augmented_matrix_2x3, augmented_matrix_3x4_end_matrix) were pinning the pre-#679 output; their English counterparts already expect "separator", so they are updated rather than worked around. Adds dashed_augmented_matrix_separator and matrix_row_separator, ported from tests/Languages/en/mtable.rs. Removing either rule fails all four tests, so they discriminate. * pl: clear the remaining untranslated unicode entries The audit tool reported 81 unicode entries whose text equals the English source. Reviewing them one by one, only two were actually untranslated: U+2127 "mhos" -> "mho" (unit, as nb and sv have it) U+2644 "Saturn" (Polish spelling is the same; key raised) The other 75 are correct as-is and only needed the verified key: * 30 Roman numerals (U+2160..U+217F) spelled out letter by letter * 29 space, PUA and zero-width entries with no speech at all * 6 typographic ligatures (ff, fl, ffi, ffl, ft, st) * 10 proper names and symbols (spesmilos, paragraphos, hypodiastole, digamma, differential d, imaginary j, oV, pH) Four more in unicode.yaml (digit separator, space, U+2062, U+2063) likewise carry no translatable speech. Raising the key on an entry whose text legitimately matches English is what the convention is for; it is not the same as marking English text as verified. Only the wording of "mhos" changed - the diff is otherwise key case only, checked line by line. Audit's "untranslated" for unicode files: 81 -> 0. --- Rules/Languages/pl/SharedRules/default.yaml | 47 ++++- Rules/Languages/pl/SharedRules/geometry.yaml | 10 +- Rules/Languages/pl/definitions.yaml | 35 ++-- Rules/Languages/pl/navigate.yaml | 80 ++++++--- Rules/Languages/pl/unicode-full.yaml | 173 +++++++++---------- Rules/Languages/pl/unicode.yaml | 8 +- src/navigate.rs | 53 ++++++ tests/Languages/pl/alphabets.rs | 15 ++ tests/Languages/pl/definitions.rs | 40 ++++- tests/Languages/pl/mtable.rs | 47 ++++- 10 files changed, 356 insertions(+), 152 deletions(-) diff --git a/Rules/Languages/pl/SharedRules/default.yaml b/Rules/Languages/pl/SharedRules/default.yaml index ae139ebd6..531f57a5d 100644 --- a/Rules/Languages/pl/SharedRules/default.yaml +++ b/Rules/Languages/pl/SharedRules/default.yaml @@ -513,6 +513,18 @@ - x: "count(preceding-sibling::*)+IfThenElse(parent::m:mlabeledtr, 0, 1)" - pause: medium - x: "*" + - test: + if: "HasVisibleColumnLine(../.., count(preceding-sibling::*) + 1)" + then: + - pause: short + - T: "separator" + - test: + # Separator wiersza zapowiadamy tylko po ostatniej komĂłrce wiersza, ĆŒeby + # wybrzmiaƂ raz na kaĆŒdą granicę poziomą. + if: "count(following-sibling::*) = 0 and HasVisibleRowLine(../.., count(../preceding-sibling::*) + 1)" + then: + - pause: short + - T: "separator wiersza" - test: # short pause after each element; medium pause if last element in a row; long pause for last element in matrix - if: count(following-sibling::*) > 0 @@ -737,21 +749,38 @@ - name: function-intent # uncaught intent -- speak as foo of arg1 comma arg2 .... The MathML spec requires arguments to functions + # IntentMappings mogą dodać po nazwie opcje spoiwa "| ...": + # * jedna opcja bez przecinka: separator dwuargumentowy po "z" + # (np. "| podzielone przez" daje "częƛć caƂkowita z x podzielone przez y") + # * wiele opcji albo opcja z przecinkami: szablony arnoƛci; k sƂów spoiwa + # opisuje k+1 argumentĂłw (np. "| po | od,do") + # * gdy arnoƛć nie pasuje, argumenty rozdziela przecinek tag: "*" match: "count(*)>0" replace: - x: "SpeakIntentName(name(.), $Verbosity, 'function')" - test: - if: "$Verbosity != 'Terse' and not(contains(@data-intent-property, ':literal:')) and - not(count(*)=2 and (IsInDefinition(*[1], 'TrigFunctionNames') or IsInDefinition(name(.), 'TerseFunctionNames')) and IsNode(*[2], 'simple'))" - then: [T: "z", pause: auto] # phrase(sine 'of' 5) - - insert: - nodes: "*" - replace: - - test: - if: "not(contains(@data-intent-property, ':literal:'))" - then: [x: "','"] + - if: "IntentFunctionUseArityPath(name(.), 'function', count(*))" + then: + - x: "IntentFunctionGlueBefore(name(.), 'function', 1, count(*))" - pause: auto + - insert: + nodes: "*" + replace: + - x: "IntentFunctionGlueBefore(name(.), 'function', $InsertIndex, count(*))" + - pause: auto + else: + - test: + if: "$Verbosity != 'Terse' and not(contains(@data-intent-property, ':literal:')) and + not(count(*)=2 and (IsInDefinition(*[1], 'TrigFunctionNames') or IsInDefinition(name(.), 'TerseFunctionNames')) and IsNode(*[2], 'simple'))" + then: [T: "z", pause: auto] # phrase(sine 'of' 5) + - insert: + nodes: "*" + replace: + - test: + if: "not(contains(@data-intent-property, ':literal:'))" + then: [x: "IntentFunctionArgSeparator(name(.), 'function', count(*))"] + - pause: auto - test: # speak "end ..." if not bracketed or last child is not simple and not last node if: "$Impairment = 'Blindness' and not(*[last()][IsBracketed(., '', '') or IsNode(., 'simple')] )" diff --git a/Rules/Languages/pl/SharedRules/geometry.yaml b/Rules/Languages/pl/SharedRules/geometry.yaml index 37155f79c..f110a71ed 100644 --- a/Rules/Languages/pl/SharedRules/geometry.yaml +++ b/Rules/Languages/pl/SharedRules/geometry.yaml @@ -57,12 +57,16 @@ - name: coordinate tag: coordinate - match: "." + # Intencje postaci coordinate($x,...) mają @arg i spadają do function-intent / IntentMappings + match: "not(*[@arg])" replace: - - T: "przecinek" # phrase(the 'point' at 1, 2) - test: if: "$Verbosity='Verbose'" - then: [t: "w"] # phrase('the' point at 1, 2) + then: [OT: "ten"] # phrase('the' point at 1, 2) + - T: "punkt" # phrase(the 'point' at 1, 2) + - test: + if: "$Verbosity='Verbose'" + then: [T: "w"] # phrase('the' point at 1, 2) - pause: short - insert: nodes: "*" diff --git a/Rules/Languages/pl/definitions.yaml b/Rules/Languages/pl/definitions.yaml index 6dda0ebe0..9c4c6e69c 100644 --- a/Rules/Languages/pl/definitions.yaml +++ b/Rules/Languages/pl/definitions.yaml @@ -13,9 +13,9 @@ "image":"function=obraz", "mixed-fraction":"infix=i", - "quotient":"function=częƛć caƂkowita; podzielone przez", + "quotient":"function=częƛć caƂkowita | podzielone przez", "evaluated-at":"infix=obliczone w", - "remainder":"function=reszta; podzielone przez", + "remainder":"function=reszta | podzielone przez", "max":"function=maksimum", "min":"function=minimum", @@ -32,10 +32,10 @@ "real-part": "function=częƛć rzeczywista", "imaginary-part": "function=częƛć urojona: częƛć urojona: częƛć urojona", - "polar-coordinate":"function=wspóƂrzędna biegunowa; przecinek", - "spherical-coordinate":"function=wspóƂrzędna sferyczna; przecinek; przecinek", - "cartesian-coordinate":"function=wspóƂrzędna kartezjaƄska; przecinek", - "coordinate":"function=wspóƂrzędna; przecinek", + "polar-coordinate":"function=wspóƂrzędna biegunowa", + "spherical-coordinate":"function=wspóƂrzędna sferyczna", + "cartesian-coordinate":"function=wspóƂrzędna kartezjaƄska", + "coordinate":"function=wspóƂrzędna", "floor":"function=podƂoga", "ceiling":"function=sufit", "round":"function=zaokrąglenie", @@ -51,16 +51,23 @@ ### Sets "set": "function=; zbiĂłr: zbiĂłr", - "set-difference":"function=rĂłĆŒnica zbiorĂłw; i || infix=minus", # NOTE: not tested + "set-difference":"function=rĂłĆŒnica zbiorĂłw | i || infix=minus", "complement":"function=dopeƂnienie", + "empty-set":"nofix=zbiĂłr pusty", "cardinality":"function=moc zbioru", "list":"function=lista", "tuple": "function=; krotka: krotka", ### Sequence and Series - "sum":"function=; suma po: suma; ", - "product":"function=iloczyn || function=iloczyn po || function=iloczyn od; do", + # UWAGA: NIE uĆŒywamy tu szablonĂłw arnoƛci ("| po | od,do"), choć angielski je ma. + # PowĂłd (zmierzone 31.08.2026): intent_function_glue_before w src/infer_intent.rs + # zwraca dla ostatniego argumentu ZASZYTE W KODZIE angielskie "of", więc polskie + # wyjƛcie brzmiaƂoby "suma po i of x". To defekt rdzenia dotyczący kaĆŒdego języka + # poza angielskim; węgierski uniknąƂ go tak samo, zostawiając prostą postać. + # Separator binarny (jedna opcja "| sƂowo") dziaƂa poprawnie i jest uĆŒywany niĆŒej. + "sum":"function=suma", + "product":"function=iloczyn", ### Elementary classical functions @@ -104,7 +111,7 @@ "median":"function=mediana", "mode":"function=dominanta", - "conditional-probability":"function=prawdopodobieƄstwo; pod warunkiem", # NOTE: Check test + "conditional-probability":"function=prawdopodobieƄstwo | pod warunkiem", ### Linear Algebra @@ -120,7 +127,7 @@ "unit-vector":"prefix=wektor jednostkowy", "identity-matrix":"nofix=macierz jednostkowa", # NOTE: no function specified - "transpose":"function=transpozycja || postfix=transponowane", + "transpose":"postfix=transponowane || function=transpozycja", "dimensional-product":"infix=na", # INFIX @@ -150,13 +157,13 @@ ### General Concepts "fenced-group":"function=grupa w nawiasach", - "ordered-pair": "function=; para; i", + "ordered-pair": "function=para | i", "indexed-by": "infix=; indeks dolny; koniec indeksu dolnego", "highlight":"postfix=podƛwietlone", "least-common-denominator":"function=najmniejszy wspĂłlny mianownik", "rate":"infix=na", - "translation":"function=przesunięcie o; przecinek", + "translation":"function=przesunięcie o", "constraint":"infix=; przy warunku; ", "binomial-coefficient":"infix=po", @@ -264,7 +271,7 @@ ## Default fixity nofix "diameter":"nofix=d: ƛrednica", "distance":"nofix=d; D: odlegƂoƛć", - "probability":"nofix=P: prawdopodobieƄstwo", + "probability":"nofix=P: prawdopodobieƄstwo || function=prawdopodobieƄstwo", "radius":"nofix=r: promieƄ", "volume":"nofix=V: objętoƛć || function=objętoƛć", "exponential-e":"nofix=e", diff --git a/Rules/Languages/pl/navigate.yaml b/Rules/Languages/pl/navigate.yaml index cfdecbcb4..c99b60490 100644 --- a/Rules/Languages/pl/navigate.yaml +++ b/Rules/Languages/pl/navigate.yaml @@ -53,39 +53,46 @@ then: [t: "maksymalnie oddalono", pause: "medium"] else: - test: - - if: "starts-with($NavCommand, 'Zoom')" - then: [set_variables: [Prefix: "'przybliĆŒ'"]] # phrase('zoom' in to see more details) + # CommandOffset to 1 + dƂugoƛć ANGIELSKIEGO rdzenia $NavCommand + # (Zoom/Move/Read/Describe), a NIE dƂugoƛć wymawianego $Prefix - + # dzięki temu tƂumaczenie moĆŒe mieć sƂowo Prefix innej dƂugoƛci. + # Angielskie "zoom" obsƂuguje oba kierunki, polski ma dwa rĂłĆŒne + # czasowniki - "przybliĆŒ na zewnątrz" byƂoby sprzeczne. + - if: "starts-with($NavCommand, 'ZoomOut')" + then: [set_variables: [Prefix: "'oddal'", CommandOffset: "5"]] # phrase('zoom' out to see less detail) + - else_if: "starts-with($NavCommand, 'Zoom')" + then: [set_variables: [Prefix: "'przybliĆŒ'", CommandOffset: "5"]] # phrase('zoom' in to see more details) - else_if: "starts-with($NavCommand, 'Move')" - then: [set_variables: [Prefix: "'przejdĆș'"]] # phrase('move' to next entry in table) + then: [set_variables: [Prefix: "'przejdĆș'", CommandOffset: "5"]] # phrase('move' to next entry in table) - else_if: "starts-with($NavCommand, 'Read')" - then: [set_variables: [Prefix: "'odczytaj'"]] # phrase('read' to next entry in table) + then: [set_variables: [Prefix: "'odczytaj'", CommandOffset: "5"]] # phrase('read' to next entry in table) - else_if: "starts-with($NavCommand, 'Describe')" - then: [set_variables: [Prefix: "'opisz'"]] # phrase('describe' to next entry in table) + then: [set_variables: [Prefix: "'opisz'", CommandOffset: "9"]] # phrase('describe' to next entry in table) - test: if: "$Prefix != ''" then: - x: "$Prefix" - test: - - if: "substring($NavCommand, string-length($Prefix)+1) = 'In'" - then: [T: "do"] # phrase(zoom 'in' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'InAll'" + - if: "substring($NavCommand, $CommandOffset) = 'In'" + then: [] # sam czasownik "przybliĆŒ" wystarcza + - else_if: "substring($NavCommand, $CommandOffset) = 'InAll'" # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets "ed" concatenated to "zoom" - then: [t: "maksymalnie do ƛrodka"] # phrase(zoom 'out all the way' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Out'" - then: [t: "na zewnątrz"] # phrase(zoom 'out' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'OutAll'" + then: [T: "maksymalnie"] # phrase(zoom 'in all of the way' to see more details) + - else_if: "substring($NavCommand, $CommandOffset) = 'Out'" + then: [] # sam czasownik "oddal" wystarcza + - else_if: "substring($NavCommand, $CommandOffset) = 'OutAll'" # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets "ed" concatenated to "zoom" - then: [t: "maksymalnie na zewnątrz"] # phrase(zoom 'out all the way' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Next'" - then: [t: "w prawo"] # phrase(move to the 'right') - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Previous'" - then: [t: "w lewo"] # phrase(move to the 'left') - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Current'" - then: [t: "bieĆŒÄ…cy"] # phrase(who is the 'current' president) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'LineStart'" - then: [t: "do początku linii"] # phrase(move 'to start of line') - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'LineEnd'" - then: [t: "do koƄca linii"] # phrase(move 'to end of line') + then: [T: "maksymalnie"] # phrase(zoom 'out all of the way' to see more details) + - else_if: "substring($NavCommand, $CommandOffset) = 'Next'" + then: [T: "w prawo"] # phrase(move to the 'right') + - else_if: "substring($NavCommand, $CommandOffset) = 'Previous'" + then: [T: "w lewo"] # phrase(move to the 'left') + - else_if: "substring($NavCommand, $CommandOffset) = 'Current'" + then: [T: "bieĆŒÄ…cy"] # phrase(who is the 'current' president) + - else_if: "substring($NavCommand, $CommandOffset) = 'LineStart'" + then: [T: "do początku linii"] # phrase(move 'to start of line') + - else_if: "substring($NavCommand, $CommandOffset) = 'LineEnd'" + then: [T: "do koƄca linii"] # phrase(move 'to end of line') - pause: "medium" - set_variables: [MatchCounter: "$MatchCounter + 1"] @@ -96,6 +103,15 @@ (name(.)='mrow' or name(.) = 'mtr' or name(.) = 'mlabeledtr' or @data-from-mathml = 'mtable')" replace: [] +- name: into-or-out-of-prefix-or-silent-without-parts + tag: "*" + # Intencje prefiksowe i ciche bez wpisu w NavigationParts (np. minus unarny, + # x z daszkiem) NIE powinny zapowiadać "do"/"na zewnątrz". + match: "$Move2D != '' and + (contains(@data-intent-property, ':prefix:') or contains(@data-intent-property, ':silent:')) and + GetNavigationPartName(name(.), count($Child2D/preceding-sibling::*)) = ''" + replace: [] + - name: into-or-out-of-mtr tag: [mtr, mlabeledtr] match: "$Move2D = 'in'" @@ -168,6 +184,24 @@ - test: - if: "$PartName != ''" then: [x: "$PartName"] + - else_if: "count(*) = 1" + then_test: + if: "$NavVerbosity = 'Verbose'" + then: # IntentMappings przez SpeakIntentName; w razie braku - nazwa intentu ze spacjami + - test: + - if: "contains(@data-intent-property, ':prefix:')" + then: [x: "SpeakIntentName(name(.), $Verbosity, 'prefix')"] + - else_if: "contains(@data-intent-property, ':postfix:')" + then: [x: "SpeakIntentName(name(.), $Verbosity, 'postfix')"] + - else_if: "contains(@data-intent-property, ':infix:')" + then: [x: "SpeakIntentName(name(.), $Verbosity, 'infix')"] + - else_if: "contains(@data-intent-property, ':function:')" + then: [x: "SpeakIntentName(name(.), $Verbosity, 'function')"] + - else_if: "contains(@data-intent-property, ':nofix:')" + then: [x: "SpeakIntentName(name(.), $Verbosity, 'nofix')"] + - else_if: "contains(@data-intent-property, ':silent:')" + then: [x: "SpeakIntentName(name(.), $Verbosity, 'silent')"] + - else: [x: "SpeakIntentName(name(.), $Verbosity, 'other')"] else: - t: "częƛci" # phrase(the 'part' of the expression) - x: "count($Child2D/preceding-sibling::*) + 1" diff --git a/Rules/Languages/pl/unicode-full.yaml b/Rules/Languages/pl/unicode-full.yaml index 0fbeda954..8246f4650 100644 --- a/Rules/Languages/pl/unicode-full.yaml +++ b/Rules/Languages/pl/unicode-full.yaml @@ -291,7 +291,7 @@ - "†": [t: "obelisk"] # 0x2020 - "‡": [t: "podwĂłjny obelisk"] # 0x2021 - - " - ": [t: " "] # 0x2000 - 0x2007 + - " - ": [T: " "] # 0x2000 - 0x2007 - "‱": # 0x2022 - test: @@ -344,7 +344,7 @@ - "⁑": [t: "dwie pionowe gwiazdki"] # 0x2051 - "⁒": [t: "handlowy znak minus"] # 0x2052 - "⁗": [t: "poczwĂłrny prim"] # 0x2057 - - "⁠": [t: ""] # 0x2060 + - "⁠": [T: ""] # 0x2060 - "⁰": [t: "do zerowej potęgi"] # 0x2070 - "ⁱ": [t: "do potęgi i"] # 0x2071 - "⁎": [t: "do czwartej potęgi"] # 0x2074 @@ -409,7 +409,7 @@ - "₮": [t: "hrywny"] # 0x20b4 - "â‚”": [t: "cedi"] # 0x20b5 - "₶": [t: "liwr turoƄski"] # 0x20b6 - - "₷": [t: "spesmilos"] # 0x20b7 + - "₷": [T: "spesmilos"] # 0x20b7 - "₾": [t: "tenge"] # 0x20b8 - "â‚č": [t: "rupie indyjskie"] # 0x20b9 - "â‚ș": [t: "liry tureckie"] # 0x20ba @@ -473,7 +473,7 @@ - "№": [t: "numer"] # 0x2116 - "â„„": [t: "uncje"] # 0x2125 - "℩": [t: "omy"] # 0x2126 - - "℧": [t: "mhos"] # 0x2127 + - "℧": [T: "mho"] # 0x2127 - "℩": [t: "odwrĂłcony jota"] # 0x2129 - "â„Ș": [t: "kelwin"] # 0x212a - "Å": [t: "angstremy"] # 0x212b @@ -522,37 +522,37 @@ - "⅞": [t: "siedem Ăłsmych"] # 0x215e - "⅟": [t: "jeden przez"] # 0x215f - "Ⅰ": [t: "I"] # 0x2160 - - "Ⅱ": [t: "I I"] # 0x2161 - - "ⅱ": [t: "I I I"] # 0x2162 - - "Ⅳ": [t: "I V"] # 0x2163 - - "â…€": [t: "V"] # 0x2164 - - "â…„": [t: "V I"] # 0x2165 - - "Ⅹ": [t: "V I I"] # 0x2166 - - "Ⅷ": [t: "V I I I"] # 0x2167 - - "ⅹ": [t: "I X"] # 0x2168 - - "Ⅹ": [t: "X"] # 0x2169 - - "â…Ș": [t: "X I"] # 0x216a - - "Ⅻ": [t: "X I I"] # 0x216b - - "Ⅼ": [t: "L"] # 0x216c - - "Ⅽ": [t: "C"] # 0x216d - - "ⅼ": [t: "D"] # 0x216e - - "Ⅿ": [t: "M"] # 0x216f + - "Ⅱ": [T: "I I"] # 0x2161 + - "ⅱ": [T: "I I I"] # 0x2162 + - "Ⅳ": [T: "I V"] # 0x2163 + - "â…€": [T: "V"] # 0x2164 + - "â…„": [T: "V I"] # 0x2165 + - "Ⅹ": [T: "V I I"] # 0x2166 + - "Ⅷ": [T: "V I I I"] # 0x2167 + - "ⅹ": [T: "I X"] # 0x2168 + - "Ⅹ": [T: "X"] # 0x2169 + - "â…Ș": [T: "X I"] # 0x216a + - "Ⅻ": [T: "X I I"] # 0x216b + - "Ⅼ": [T: "L"] # 0x216c + - "Ⅽ": [T: "C"] # 0x216d + - "ⅼ": [T: "D"] # 0x216e + - "Ⅿ": [T: "M"] # 0x216f - "ⅰ": [t: "I"] # 0x2170 - - "ⅱ": [t: "I I"] # 0x2171 - - "â…Č": [t: "I I I"] # 0x2172 - - "ⅳ": [t: "I V"] # 0x2173 - - "Ⅾ": [t: "V"] # 0x2174 - - "â…”": [t: "V I"] # 0x2175 - - "ⅶ": [t: "V I I"] # 0x2176 - - "ⅷ": [t: "V I I I"] # 0x2177 - - "ⅾ": [t: "I X"] # 0x2178 - - "â…č": [t: "X"] # 0x2179 - - "â…ș": [t: "X I"] # 0x217a - - "ⅻ": [t: "X I I"] # 0x217b - - "â…Œ": [t: "L"] # 0x217c - - "â…œ": [t: "C"] # 0x217d - - "â…Ÿ": [t: "D"] # 0x217e - - "ⅿ": [t: "M"] # 0x217f + - "ⅱ": [T: "I I"] # 0x2171 + - "â…Č": [T: "I I I"] # 0x2172 + - "ⅳ": [T: "I V"] # 0x2173 + - "Ⅾ": [T: "V"] # 0x2174 + - "â…”": [T: "V I"] # 0x2175 + - "ⅶ": [T: "V I I"] # 0x2176 + - "ⅷ": [T: "V I I I"] # 0x2177 + - "ⅾ": [T: "I X"] # 0x2178 + - "â…č": [T: "X"] # 0x2179 + - "â…ș": [T: "X I"] # 0x217a + - "ⅻ": [T: "X I I"] # 0x217b + - "â…Œ": [T: "L"] # 0x217c + - "â…œ": [T: "C"] # 0x217d + - "â…Ÿ": [T: "D"] # 0x217e + - "ⅿ": [T: "M"] # 0x217f - "↉": [t: "zero trzecich"] # 0x2189 - "↔": [t: "lewy strzaƂka w prawo"] # 0x2194 - "↕": [t: "gĂłrny strzaƂka w dóƂ"] # 0x2195 @@ -1081,11 +1081,6 @@ - "⊱": [t: "dowodzi"] # 0x22a2 - "⊣": [t: "jest dowodzone przez"] # 0x22a3 - "⊀": [t: "gĂłra"] # 0x22a4 - - "⊄": # 0x22a5 - - test: - if: "$Verbosity!='Terse'" - then: [T: "jest"] - - t: "dóƂ" - "⊩": [t: "redukuje się do"] # 0x22a6 - "⊧": [t: "modeluje"] # 0x22a7 - "⊹": # 0x22a8 @@ -1538,7 +1533,7 @@ - "♁": [t: "Ziemia"] # 0x2641 - "♂": [t: "męskie"] # 0x2642 - "♃": [t: "Jowisz"] # 0x2643 - - "♄": [t: "Saturn"] # 0x2644 + - "♄": [T: "Saturn"] # 0x2644 - "♅": [t: "Uran"] # 0x2645 - "♆": [t: "Neptun"] # 0x2646 - "♇": [t: "Pluton"] # 0x2647 @@ -1662,11 +1657,15 @@ - "➟": [t: "otwarta konturowa strzaƂka w prawo"] # 0x27be - "⟀": [t: "trĂłjwymiarowy kąt"] # 0x27c0 - "⟁": [t: "biaƂy trĂłjkąt zawierający maƂy biaƂy trĂłjkąt"] # 0x27c1 - - "⟂": # 0x27c2 - - test: - if: "$Verbosity!='Terse'" - then: [T: "jest"] - - t: "prostopadƂe do" + - "⟂⊄": # 0x27c2, 22A5 (22A5 wrongly used for perpendicular by most editors) + - test: + - if: "$SpeechStyle = 'LiteralSpeak' and text()='⊄'" # 22A5 (up tack/bottom) + then: [T: "dóƂ"] + - else: + - test: + if: "$Verbosity!='Terse'" + then: [T: "jest"] + - T: "prostopadƂe do" - "⟃": # 0x27c3 - test: if: "$Verbosity!='Terse'" @@ -2354,10 +2353,10 @@ - "⾌": [t: "lewy podniesiony pominięcia nawias kwadratowy"] # 0x2e0c - "➍": [t: "prawy podniesiony pominięcia nawias kwadratowy"] # 0x2e0d - "⾎": [t: "redakcyjny koronis"] # 0x2e0e - - "➏": [t: "paragraphos"] # 0x2e0f + - "➏": [T: "paragraphos"] # 0x2e0f - "➐": [t: "rozwidlony paragrafos"] # 0x2e10 - "⾑": [t: "odwrĂłcony rozwidlony paragrafos"] # 0x2e11 - - "⾒": [t: "hypodiastole"] # 0x2e12 + - "⾒": [T: "hypodiastole"] # 0x2e12 - "⾓": [t: "kropkowany obelos"] # 0x2e13 - "⾔": [t: "dolny ancora"] # 0x2e14 - "⾕": [t: "gĂłrny ancora"] # 0x2e15 @@ -2466,7 +2465,7 @@ - "ăČ": [t: "daltony"] # 0x3372 - "㍳": [t: "jednostki astronomiczne"] # 0x3373 - "㍮": [t: "bary"] # 0x3374 - - "ă”": [t: "o V"] # 0x3375 + - "ă”": [T: "o V"] # 0x3375 - "ă¶": [t: "parseki"] # 0x3376 - "ă·": [t: "decymetry"] # 0x3377 - "㍾": [t: "decymetry do kwadratu"] # 0x3378 @@ -2559,7 +2558,7 @@ - "㏔": [t: "milibarny"] # 0x33d4 - "㏕": [t: "mile"] # 0x33d5 - "㏖": [t: "mole"] # 0x33d6 - - "㏗": [t: "p h"] # 0x33d7 + - "㏗": [T: "p h"] # 0x33d7 - "㏘": [t: "pikometry"] # 0x33d8 - "㏙": [t: "częƛci na milion"] # 0x33d9 - "㏚": [t: "petarentgeny"] # 0x33da @@ -2992,30 +2991,30 @@ - "": [t: "staƂa Plancka przez dwa pi kreska"] # 0xed00 - "": [t: "lustrzane g"] # 0xed01 - "": [t: "j bez kropki"] # 0xed02 - - "": [t: "digamma"] # 0xed03 - - "ϝ": [t: "digamma"] # 0x3dd - - "": [t: "d"] # 0xed10 - - "ⅆ": [t: "d"] # 0x2146 + - "": [T: "digamma"] # 0xed03 + - "ϝ": [T: "digamma"] # 0x3dd + - "": [T: "d"] # 0xed10 + - "ⅆ": [T: "d"] # 0x2146 - "": [t: "e"] # 0xed11 - "ⅇ": [t: "e"] # 0x2147 - "": [t: "i"] # 0xed12 - "ⅈ": [t: "i"] # 0x2148 - - "": [t: "j"] # 0xed13 + - "": [T: "j"] # 0xed13 - "ⅅ": - spell: "translate('.', 'ⅅ', 'DD')" # 0xed16, 0x2145 # The private use chars are from MathType - "": [t: "caƂka krzywoliniowa z pętlą przeciwnie do ruchu wskazĂłwek zegara"] # 0xee00 - "": [t: "caƂka krzywoliniowa z pętlą zgodnie z ruchem wskazĂłwek zegara"] # 0xee01 - - "": [t: ""] # 0xee04 - - "": [t: ""] # 0xee05 - - "": [t: ""] # 0xee06 - - "": [t: ""] # 0xee07 - - "": [t: ""] # 0xee08 - - "": [t: ""] # 0xee09 - - "": [t: ""] # 0xee0a - - "": [t: ""] # 0xee0b - - "": [t: ""] # 0xee0c + - "": [T: ""] # 0xee04 + - "": [T: ""] # 0xee05 + - "": [T: ""] # 0xee06 + - "": [T: ""] # 0xee07 + - "": [T: ""] # 0xee08 + - "": [T: ""] # 0xee09 + - "": [T: ""] # 0xee0a + - "": [T: ""] # 0xee0b + - "": [T: ""] # 0xee0c - "": [t: "ozdobnik statusu poƂączenia"] # 0xee0d - "": [t: "lewy ozdobnik statusu poƂączenia"] # 0xee0e - "": [t: "prawy ozdobnik statusu poƂączenia"] # 0xee0f @@ -3040,24 +3039,24 @@ - "": [t: "kreska akcent z zamkniętym okręgiem po prawej"] # 0xee23 - "": [t: "duĆŒy kropka nad"] # 0xee24 - "": [t: "znak wyrĂłwnania"] # 0xef00 - - "": [t: ""] # 0xef01 - - "​": [t: ""] # 0x200b - - "": [t: ""] # 0xef02 - - " ": [t: ""] # 0x2009 - - "": [t: ""] # 0xef03 - - " ": [t: ""] # 0x205f - - "": [t: ""] # 0xef04 - - "": [t: ""] # 0xef05 - - "": [t: ""] # 0xef06 - - "": [t: ""] # 0xef07 - - "": [t: ""] # 0xef08 - - "": [t: ""] # 0xef09 - - "": [t: ""] # 0xef0a - - " ": [t: ""] # 0x200a - - "îŒą": [t: ""] # 0xef22 - - "îŒŁ": [t: ""] # 0xef23 - - "": [t: ""] # 0xef24 - - "": [t: ""] # 0xef29 + - "": [T: ""] # 0xef01 + - "​": [T: ""] # 0x200b + - "": [T: ""] # 0xef02 + - " ": [T: ""] # 0x2009 + - "": [T: ""] # 0xef03 + - " ": [T: ""] # 0x205f + - "": [T: ""] # 0xef04 + - "": [T: ""] # 0xef05 + - "": [T: ""] # 0xef06 + - "": [T: ""] # 0xef07 + - "": [T: ""] # 0xef08 + - "": [T: ""] # 0xef09 + - "": [T: ""] # 0xef0a + - " ": [T: ""] # 0x200a + - "îŒą": [T: ""] # 0xef22 + - "îŒŁ": [T: ""] # 0xef23 + - "": [T: ""] # 0xef24 + - "": [T: ""] # 0xef29 - "": [t: "brakujący skƂadnik"] # 0xef41 - "": [t: "caƂka krzywoliniowa zgodna z ruchem wskazĂłwek zegara ze strzaƂką po lewej"] # 0xef80 - "": [t: "caƂka z kwadrat"] # 0xef81 @@ -3564,13 +3563,13 @@ - "ïŁœ": [t: "prawy nawias klamrowy ƛrodkowy"] # 0xf8fd - "ïŁŸ": [t: "prawy nawias klamrowy dolny"] # 0xf8fe - "ïŁż": [t: "logo jabƂka"] # 0xf8ff - - "ïŹ€": [t: "ff"] # 0xfb00 + - "ïŹ€": [T: "ff"] # 0xfb00 - "ïŹ": [t: "fi"] # 0xfb01 - - "ïŹ‚": [t: "fl"] # 0xfb02 - - "ïŹƒ": [t: "ffi"] # 0xfb03 - - "ïŹ„": [t: "ffl"] # 0xfb04 - - "ïŹ…": [t: "ft"] # 0xfb05 - - "ïŹ†": [t: "st"] # 0xfb06 + - "ïŹ‚": [T: "fl"] # 0xfb02 + - "ïŹƒ": [T: "ffi"] # 0xfb03 + - "ïŹ„": [T: "ffl"] # 0xfb04 + - "ïŹ…": [T: "ft"] # 0xfb05 + - "ïŹ†": [T: "st"] # 0xfb06 - "ïŹ©": [t: "hebrajska litera alternatywny znak plus"] # 0xfb29 - "ïž ": [t: "lewa poƂowa ligatury, ozdobnik"] # 0xfe20 - "ïžĄ": [t: "prawa poƂowa ligatury, ozdobnik"] # 0xfe21 diff --git a/Rules/Languages/pl/unicode.yaml b/Rules/Languages/pl/unicode.yaml index 6d90fdcd3..bd3ee353a 100644 --- a/Rules/Languages/pl/unicode.yaml +++ b/Rules/Languages/pl/unicode.yaml @@ -60,9 +60,9 @@ # note: processing of ranges converts '.' into the character, so it needs to be in quotes below replace: [spell: "translate('.', 'BCDEFGHIJKLMNOPQRSTUVWXYZ', 'bcdefghijklmnopqrstuvwxyz')"] - - "0-9": [t: "."] + - "0-9": [T: "."] - - " ": [t: " "] # 0x20 + - " ": [T: " "] # 0x20 - "!": # 0x21 - test: @@ -337,8 +337,8 @@ (@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) )" then: [T: "z"] - - "⁹": [t: ""] # 0x2062 - - "⁣": [t: ""] # 0x2063 + - "⁹": [T: ""] # 0x2062 + - "⁣": [T: ""] # 0x2063 - "⁀": [T: "i"] # 0x2064 - "â€Č": [t: "prim"] # 0x2032 - "″": [t: "podwĂłjny prim"] # 0x2033 diff --git a/src/navigate.rs b/src/navigate.rs index a3365ef56..1fac4e766 100644 --- a/src/navigate.rs +++ b/src/navigate.rs @@ -1765,6 +1765,59 @@ mod tests { }); } + #[test] + fn zoom_speech_pl() -> Result<()> { + let mathml_str = " + b2 + d + "; + init_prefs(mathml_str, "Enhanced", "pl")?; + return MATHML_INSTANCE.with(|package_instance| { + let package_instance = package_instance.borrow(); + let mathml = get_element(&package_instance); + let speech = test_command("ZoomIn", mathml, "msup")?; + assert_eq!("przybliĆŒ; do licznika; b do kwadratu", speech); + let speech = test_command("ZoomIn", mathml, "base")?; + assert_eq!("przybliĆŒ; do podstawy; b", speech); + let speech = test_command("ZoomOut", mathml, "msup")?; + assert_eq!("oddal; z podstawy; b do kwadratu", speech); + let speech = test_command("ZoomInAll", mathml, "base")?; + assert_eq!("przybliĆŒ maksymalnie; do podstawy; b", speech); + let speech = test_command("ZoomOutAll", mathml, "mfrac")?; + assert_eq!("oddal maksymalnie; z podstawy; z licznika; uƂamek, b do kwadratu, przez d, koniec uƂamka", speech); + return Ok( () ); + }); + } + + #[test] + fn move_char_speech_pl() -> Result<()> { + let mathml_str = " + + + x + y + + ⁢ + z + + "; + init_prefs(mathml_str, "Character", "pl")?; + return MATHML_INSTANCE.with(|package_instance| { + let package_instance = package_instance.borrow(); + let mathml = get_element(&package_instance); + test_command("ZoomInAll", mathml, "id-3")?; + let speech = test_command("MoveNext", mathml, "id-4")?; + assert_eq!("przejdĆș w prawo; do mianownika; y", speech); + let speech = test_command("MoveNext", mathml, "id-7")?; + assert_eq!("przejdĆș w prawo; z mianownika; do pierwiastka; z", speech); + let speech = test_command("MovePrevious", mathml, "id-4")?; + assert_eq!("przejdĆș w lewo; z pierwiastka; do mianownika; y", speech); + let speech = test_command("MovePrevious", mathml, "id-3")?; + assert_eq!("przejdĆș w lewo; do licznika; x", speech); + return Ok( () ); + }); + } + #[test] fn move_char_speech_ru() -> Result<()> { let mathml_str = " diff --git a/tests/Languages/pl/alphabets.rs b/tests/Languages/pl/alphabets.rs index 5c2aef97b..eda0a1ae4 100644 --- a/tests/Languages/pl/alphabets.rs +++ b/tests/Languages/pl/alphabets.rs @@ -391,6 +391,21 @@ fn turned() -> Result<()> { } +#[test] +fn up_tack_330() -> Result<()> { + // Znak prostopadƂoƛci i znak "dóƂ" wyglądają identycznie, a edytory + // wstawiają U+22A5 tam, gdzie chodzi o prostopadƂoƛć. Dlatego oba znaki + // mĂłwią "prostopadƂe do", a osobna reguƂa LiteralSpeak zachowuje dosƂowne + // czytanie U+22A5 jako "dóƂ". + let perp = "a⟂b"; // 0x27c2 + test("pl", "SimpleSpeak", perp, "a jest prostopadƂe do b")?; + test("pl", "LiteralSpeak", perp, "a jest prostopadƂe do b")?; + let up_tack = "a⊄b"; // 0x22a5 + test("pl", "ClearSpeak", up_tack, "a jest prostopadƂe do b")?; + test("pl", "LiteralSpeak", up_tack, "a dóƂ b")?; + return Ok(()); + } + #[test] fn unicode_typo_regressions() -> Result<()> { test("pl", "SimpleSpeak", "ⁱ", "do potęgi i")?; diff --git a/tests/Languages/pl/definitions.rs b/tests/Languages/pl/definitions.rs index 312075f80..338f7ff95 100644 --- a/tests/Languages/pl/definitions.rs +++ b/tests/Languages/pl/definitions.rs @@ -91,7 +91,14 @@ fn set_difference_basic() -> Result<()> { "#; - test("pl", "ClearSpeak", expr, "i z wielka a przecinek, wielka b")?; + // Separator dwuargumentowy: nazwa funkcji + "z" + argumenty spięte sƂowem "i". + // Wczeƛniej nazwa przepadaƂa i zostawaƂo samo spoiwo ("i z wielka a..."). + test( + "pl", + "ClearSpeak", + expr, + "rĂłĆŒnica zbiorĂłw z wielka a i wielka b", + )?; Ok(()) } @@ -107,7 +114,9 @@ fn postfix_test() -> Result<()> { T "#, - "transpozycja z x", + // Test postfiksowy: bez jawnej fixity silnik bierze PIERWSZĄ z listy + // w IntentMappings, a tam (jak w EN) postfix jest pierwszy. + "x transponowane", ), ( "highlight", @@ -205,9 +214,11 @@ fn functions_and_inverses_tests() -> Result<()> { //("fraction", "fraction x over y end fraction"), ("mixed-fraction", "x i y"), - ("quotient", "podzielone przez z x przecinek, y"), + // Separator dwuargumentowy z IntentMappings ("| podzielone przez"): + // nazwa funkcji wraca na swoje miejsce, a spoiwo Ƃączy oba argumenty. + ("quotient", "częƛć caƂkowita z x podzielone przez y"), ("evaluated-at", "x obliczone w y"), - ("remainder", "podzielone przez z x przecinek, y"), + ("remainder", "reszta z x podzielone przez y"), ("max", "maksimum z x przecinek, y przecinek, z"), ("min", "minimum z x przecinek, y przecinek, z"), @@ -228,10 +239,18 @@ fn functions_and_inverses_tests() -> Result<()> { ("real-part", "częƛć rzeczywista"), ("imaginary-part", "częƛć urojona"), - ("polar-coordinate", "przecinek z x przecinek, y"), - ("spherical-coordinate", "przecinek z x przecinek, y przecinek, z"), - ("cartesian-coordinate", "przecinek z x przecinek, y przecinek, z"), - ("coordinate", "przecinek, x przecinek y przecinek z"), + // WspóƂrzędne: po usunięciu zbędnego "; przecinek" z IntentMappings + // nazwa wraca na swoje miejsce (wczeƛniej wyjƛcie brzmiaƂo "przecinek z x..."). + ("polar-coordinate", "wspóƂrzędna biegunowa z x przecinek, y"), + ( + "spherical-coordinate", + "wspóƂrzędna sferyczna z x przecinek, y przecinek, z", + ), + ( + "cartesian-coordinate", + "wspóƂrzędna kartezjaƄska z x przecinek, y przecinek, z", + ), + ("coordinate", "wspóƂrzędna z x przecinek, y przecinek, z"), ("floor", "podƂoga z x"), ("ceiling", "sufit z x"), @@ -598,6 +617,11 @@ fn linear_algebra_tests() -> Result<()> { " .to_string() } + "transpose" => " + + x + + ".to_string(), _ => format!( " diff --git a/tests/Languages/pl/mtable.rs b/tests/Languages/pl/mtable.rs index 8403eeae2..093cb1084 100644 --- a/tests/Languages/pl/mtable.rs +++ b/tests/Languages/pl/mtable.rs @@ -265,8 +265,8 @@ fn augmented_matrix_2x3() -> Result<()> { ] "; - test("pl", "ClearSpeak", expr, "2 na 3 macierz rozszerzona; wiersz 1; 3, 1, 4; wiersz 2; 0, 2, 6")?; - test("pl", "SimpleSpeak", expr, "2 na 3 macierz rozszerzona; wiersz 1; 3, 1, 4; wiersz 2; 0, 2, 6")?; + test("pl", "ClearSpeak", expr, "2 na 3 macierz rozszerzona; wiersz 1; 3, 1, separator, 4; wiersz 2; 0, 2, separator, 6")?; + test("pl", "SimpleSpeak", expr, "2 na 3 macierz rozszerzona; wiersz 1; 3, 1, separator, 4; wiersz 2; 0, 2, separator, 6")?; Ok(()) } @@ -897,9 +897,9 @@ let expr = " "; test_ClearSpeak("pl", "ClearSpeak_Matrix", "EndMatrix", - expr, "3 na 4 macierz rozszerzona; wiersz 1; kolumna 1; 1, kolumna 2; 2, kolumna 3; minus 1, kolumna 4; 3; wiersz 2; kolumna 1; minus 3, kolumna 2; 3, kolumna 3; minus 1, kolumna 4; 2; wiersz 3; kolumna 1; 2, kolumna 2; 3, kolumna 3; 2, kolumna 4; minus 1; koniec macierzy")?; + expr, "3 na 4 macierz rozszerzona; wiersz 1; kolumna 1; 1, kolumna 2; 2, kolumna 3; minus 1, separator, kolumna 4; 3; wiersz 2; kolumna 1; minus 3, kolumna 2; 3, kolumna 3; minus 1, separator, kolumna 4; 2; wiersz 3; kolumna 1; 2, kolumna 2; 3, kolumna 3; 2, separator, kolumna 4; minus 1; koniec macierzy")?; test("pl", "SimpleSpeak", - expr, "3 na 4 macierz rozszerzona; wiersz 1; kolumna 1; 1, kolumna 2; 2, kolumna 3; minus 1, kolumna 4; 3; wiersz 2; kolumna 1; minus 3, kolumna 2; 3, kolumna 3; minus 1, kolumna 4; 2; wiersz 3; kolumna 1; 2, kolumna 2; 3, kolumna 3; 2, kolumna 4; minus 1; koniec macierzy")?; + expr, "3 na 4 macierz rozszerzona; wiersz 1; kolumna 1; 1, kolumna 2; 2, kolumna 3; minus 1, separator, kolumna 4; 3; wiersz 2; kolumna 1; minus 3, kolumna 2; 3, kolumna 3; minus 1, separator, kolumna 4; 2; wiersz 3; kolumna 1; 2, kolumna 2; 3, kolumna 3; 2, separator, kolumna 4; minus 1; koniec macierzy")?; Ok(()) } @@ -1294,3 +1294,42 @@ fn single_line_with_label() -> Result<()> { expr, "1 rĂłwnanie, z etykietą 2; b rĂłwna się 2")?; return Ok(()); } + +/// Linia pionowa w tabeli jest zapowiadana jako separator (upstream #679). +#[test] +fn dashed_augmented_matrix_separator() -> Result<()> { + let expr = " + + [ + + 123 + + ] + "; + test("pl", "ClearSpeak", expr, "jeden na 3 wiersz macierz; 1, separator, 2, separator, 3")?; + test("pl", "SimpleSpeak", expr, "jeden na 3 wiersz macierz; 1, separator, 2, separator, 3")?; + Ok(()) +} + +/// Linia pozioma wybrzmiewa RAZ, po wierszu, ktory oddziela od nastepnego. +#[test] +fn matrix_row_separator() -> Result<()> { + let expr = " + + [ + + + 1 + 2 + + + 3 + 4 + + + ] + "; + test("pl", "ClearSpeak", expr, "2 na 2 macierz; wiersz 1; 1, 2, separator wiersza; wiersz 2; 3, 4")?; + test("pl", "SimpleSpeak", expr, "2 na 2 macierz; wiersz 1; 1, 2, separator wiersza; wiersz 2; 3, 4")?; + Ok(()) +} From df565e27cdf776249c7f97d37f126c38e6fcfeed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dziwisz?= Date: Thu, 3 Sep 2026 12:59:09 +0200 Subject: [PATCH 086/162] pl: inflect unit names according to the numeral, not with an English "s" (#744) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * pl: mark the unicode translations as verified (t -> T) Mechanical change: 2435 text keys raised from t/ot/ct to T/OT/CT in the two unicode files. No text is touched. The Polish rules were written before the lowercase/uppercase convention was in use, so entries that have been translated all along still carried the "needs review" key. The audit tool therefore reported them as untranslated, which made the real gaps impossible to see: audit-translations pl, untranslated text: 3162 -> 727 The remaining 727 are in the rule files, where the entries need reading rather than a mechanical pass, so they are deliberately left alone. Every raised entry was checked to differ from the English source, i.e. it really is translated. Entries whose text legitimately equals English (Roman numerals, ligatures, proper names, whitespace) were handled separately in the previous PR; entries still holding English text are NOT raised, since that would assert a translation that does not exist. Verification: cargo test --test languages Languages::pl 609 passed, 0 failed diff: 2436 insertions, 2436 deletions, zero changes outside key case The last point is checked by normalising the key case in the diff and confirming no unpaired lines remain (without normalising, 4710 remain, so the check does discriminate). * pl: also mark the multi-line unicode entries as verified The previous commit raised the key on entries written on a single line (`- "±": [t: "..."]`), but not on entries whose body is a block: - "°": - test: if: "parent::*[name(.)='msup' ...]" then: [t: "stopni"] else: [t: "stopieƄ"] Those are exactly the entries carrying inflection or a TTS condition, so 312 of the most deliberate translations in the file were left looking unreviewed. This raises them: 64 in unicode.yaml, 247 in unicode-full.yaml and one single-line entry (U+23E6) missed earlier. One entry is deliberately left with a lower-case key: `t: ""` for U+00A0, the else-branch of the `@data-empty-in-2D` test. That is silence rather than text, and an upper-case key means "a translator checked this wording" - there is no wording to check. English keeps a lower-case key there too. No content changes; only key case. `cargo test --test languages Languages::pl` gives 609 passed, 0 failed, which is the same result as before this commit, as expected for a change the engine treats as equivalent (src/speech.rs matches "t"|"T" in one match arm). * pl: raise the remaining rule-file keys and test the number-set rules Two loose ends in the Polish localization. **Rule-file keys.** 248 entries in the rule files still used a lower-case key while carrying translated Polish text. Content is untouched - every one of the 248 changed lines differs from its predecessor only in the case of the key name, verified line by line after normalizing the key. 17 entries are deliberately left lower-case: five are the letters C, N, Q, R, Z in `dimension-number-sets` (the letter itself is the wording, as in English); `ct: "s"`/`ct: "-"` in the unit rule are the plural suffix and prefix separator; `navigate.yaml:176` is a Polish euphony variant ("ze" before "st-"); the remaining seven are XPath expressions rather than speech. **Tests for the number-set rules.** These rules had no Polish test at all, in a file where two silent defects were already found. New `tests/Languages/pl/number_sets.rs` covers the bare symbols, the dimension form, both sign variants, and ClearSpeak agreeing with SimpleSpeak. The `number_set_with_variable_exponent` case is the negative control: `dimension-number-sets` fires on `count(*)=2`, so a non-numeric exponent must fall through to the full phrase ("liczby caƂkowite do potęgi n") rather than being read as a dimension. Without it, a rule that swallowed every superscript would still pass. Polish keeps the letter with a dimension ("R 3"), matching en, de, fr, nb, sv, fi and es; Hungarian is the only language that translates in that position too. Measured with the SAPI voice NVDA actually uses: "R 3" is byte-identical to a phonetic "er 3" and "N 4" to "en 4", so the letters are pronounced as their Polish names. cargo test --test languages Languages::pl 614 passed, 0 failed * pl: inflect unit names according to the numeral, not with an English "s" The `unit` rule appended `ct: "s"` whenever a unit had no entry in `PluralForms`, and the Polish `PluralForms` contained no SI base unit at all. Measured output of the engine before this change: 1 metr, 2 metrs, 5 metrs, 21 metrs, 2 grams, 2 sekundas, 2 ampers, 2 mols, 2 kilo-metrs So a Polish NVDA user heard an English plural ending on essentially every quantity. Hungarian avoids this with `CT: ""` (it appends nothing); French and German legitimately use "s"; Russian, whose plurals work like Polish, does not rely on a suffix at all and fills in `PluralForms` instead. Polish was in the wrong group. Polish does not have one plural form. The noun follows the numeral: 1 metr | 2, 3, 4 metry (nominative plural) | 5 metrĂłw (genitive plural) and the teens are the exception that breaks the naive rule: 12, 13, 14 metrĂłw, likewise 112-114, while 22 and 102 take the nominative again. One extra plural column is therefore not enough, so this adds a second definition section, `PluralGenitive`, next to `PluralForms` (now the nominative plural). No Rust change is needed: `build_values` accepts any definition name as a hashmap. The `unit` rule (both the bare and the prefixed branch) and the `currency` rule now read the value of the numeral and pick the section accordingly. When the numeral cannot be determined - a variable coefficient, as in "x ms" - `$Coefficient` is 0 and the genitive is used, which is also what Polish uses for unknown quantities ("x mili-sekund"). Where no inflected form is known the singular is spoken rather than a guessed ending: a wrong ending is worse for a screen reader user than a missing one. Both sections cover all 131 unit and currency names that the Polish `SIUnits`, `UnitsWithoutPrefixes`, `EnglishUnits` and `CurrencySymbols` can produce. The forms are written out because Polish inflection cannot be derived from the ending: metr/metry but litr/litry, om/omy, dzieƄ/dni, tydzieƄ/tygodnie, rok/lata. Multi-word units inflect the head noun and keep the dependent word's case ("5 lat ƛwietlnych", "5 minut Ƃuku"). They were checked against hunspell pl_PL; the only words it does not know are the binary-prefix neologisms (kibibajt, gibibit, ...) whose singular forms already existed in the file. Three base forms were themselves wrong - plurals used as singulars, so the engine said "1 herce" and "1 konie mechaniczne": Hz herce -> herc hp konie mechaniczne -> koƄ mechaniczny ℧ M h o -> mho Every other language has a singular here (en hertz, ru гДрц, fi hertsi, es hercio; hp: ru "Đ»ĐŸŃˆĐ°ĐŽĐžĐœĐ°Ń сОла", hu "lĂłerƑ", nb "hestekraft"; ℧: de/fr "mho"). Why this survived: the existing Polish expectations in tests/Languages/pl/units.rs recorded the broken output, so 609 tests passed while the speech was wrong ("2 dzieƄs", "2 tydzieƄs", "kwetta-grams"). Expectations harvested from real engine output are a good regression net but prove nothing about correctness unless they are read as a user would hear them. 21 test expectations are updated here, each difference reviewed word by word. Verification: cargo test --test languages Languages::pl 615 passed, 0 failed reverting general.yaml alone -> 6 of 6 new tests fail The new tests in tests/Languages/pl/unit_plurals.rs cover one class of phenomenon each: the three numeral classes including the teens exception, SI base units, the prefixed branch of the rule, irregular nouns, the corrected base forms, and multi-word units. --- Rules/Languages/pl/ClearSpeak_Rules.yaml | 50 +- Rules/Languages/pl/SharedRules/calculus.yaml | 12 +- Rules/Languages/pl/SharedRules/default.yaml | 80 +- Rules/Languages/pl/SharedRules/general.yaml | 189 +- Rules/Languages/pl/SharedRules/geometry.yaml | 14 +- .../pl/SharedRules/linear-algebra.yaml | 2 +- Rules/Languages/pl/definitions.yaml | 286 +- Rules/Languages/pl/navigate.yaml | 152 +- Rules/Languages/pl/overview.yaml | 30 +- Rules/Languages/pl/unicode-full.yaml | 5238 ++++++++--------- Rules/Languages/pl/unicode.yaml | 262 +- tests/Languages/pl.rs | 2 + tests/Languages/pl/ClearSpeak/mfrac.rs | 2 +- tests/Languages/pl/SimpleSpeak/mfrac.rs | 6 +- tests/Languages/pl/number_sets.rs | 69 + tests/Languages/pl/unit_plurals.rs | 86 + tests/Languages/pl/units.rs | 38 +- 17 files changed, 3474 insertions(+), 3044 deletions(-) create mode 100644 tests/Languages/pl/number_sets.rs create mode 100644 tests/Languages/pl/unit_plurals.rs diff --git a/Rules/Languages/pl/ClearSpeak_Rules.yaml b/Rules/Languages/pl/ClearSpeak_Rules.yaml index 5e6cca14c..c7bb0fc7f 100644 --- a/Rules/Languages/pl/ClearSpeak_Rules.yaml +++ b/Rules/Languages/pl/ClearSpeak_Rules.yaml @@ -228,13 +228,13 @@ tag: fraction match: "." replace: - - t: "uƂamek z licznikiem" # phrase(the 'fraction with numerator' 6) + - T: "uƂamek z licznikiem" # phrase(the 'fraction with numerator' 6) - test: if: "not(IsNode(*[1], 'simple'))" then: [pause: medium] - x: "*[1]" - pause: medium - - t: "i mianownikiem" # phrase(the fraction with numerator 5 'and denominator' 8) + - T: "i mianownikiem" # phrase(the fraction with numerator 5 'and denominator' 8) - x: "*[2]" - pause: long - test: @@ -525,7 +525,7 @@ replace: - test: - if: "count(*)=0" - then: [t: "zbiĂłr pusty"] # phrase('the empty set') + then: [T: "zbiĂłr pusty"] # phrase('the empty set') - else_if: "count(*)=2" then: - test: @@ -537,10 +537,10 @@ - test: if: "$Verbosity!='Terse'" then: [T: ""] # phrase('the' set of all integers) - - t: "zbiĂłr" # phrase(this is a 'set of' numbers) + - T: "zbiĂłr" # phrase(this is a 'set of' numbers) - test: if: "$ClearSpeak_Sets != 'woAll'" - then: [t: "wszystkie"] # phrase(the set of 'all' integers) + then: [T: "wszystkie"] # phrase(the set of 'all' integers) - x: "*[1]/*[1]" - T: "takich ĆŒe" # phrase(the set S 'such that' x is less than y) - x: "*[1]/*[3]" @@ -645,31 +645,31 @@ - if: "$IsCase" then_test: - if: "$LineCount = 1" - then: [t: "przypadek"] # phrase(this is the first 'case' of three cases) + then: [T: "przypadek"] # phrase(this is the first 'case' of three cases) - else_if: "$Paucal" - then: [t: "przypadki"] # phrase(there are 'two cases' to consider) - else: [t: "przypadkĂłw"] # phrase(there are 'five cases' to consider) + then: [T: "przypadki"] # phrase(there are 'two cases' to consider) + else: [T: "przypadkĂłw"] # phrase(there are 'five cases' to consider) - else_if: "$IsLine" then_test: - if: "$LineCount = 1" - then: [t: "linia"] # phrase(this is the first 'line' of three lines) + then: [T: "linia"] # phrase(this is the first 'line' of three lines) - else_if: "$Paucal" - then: [t: "linie"] # phrase(there are 'two lines' shown) - else: [t: "linii"] # phrase(there are 'five lines' shown) + then: [T: "linie"] # phrase(there are 'two lines' shown) + else: [T: "linii"] # phrase(there are 'five lines' shown) - else_if: "$ClearSpeak_MultiLineLabel = 'Constraint'" then_test: - if: "$LineCount = 1" - then: [t: "warunek"] # phrase(this is the first 'constraint' of three constraints) + then: [T: "warunek"] # phrase(this is the first 'constraint' of three constraints) - else_if: "$Paucal" - then: [t: "warunki"] # phrase(there are 'two constraints' to satisfy) - else: [t: "warunkĂłw"] # phrase(there are 'five constraints' to satisfy) + then: [T: "warunki"] # phrase(there are 'two constraints' to satisfy) + else: [T: "warunkĂłw"] # phrase(there are 'five constraints' to satisfy) - else_if: "$ClearSpeak_MultiLineLabel = 'Equation'" then_test: - if: "$LineCount = 1" - then: [t: "rĂłwnanie"] # phrase(this is the first 'equation' of three equations) + then: [T: "rĂłwnanie"] # phrase(this is the first 'equation' of three equations) - else_if: "$Paucal" - then: [t: "rĂłwnania"] # phrase(there are 'two equations' to solve) - else: [t: "rĂłwnaƄ"] # phrase(there are 'five equations' to solve) + then: [T: "rĂłwnania"] # phrase(there are 'two equations' to solve) + else: [T: "rĂłwnaƄ"] # phrase(there are 'five equations' to solve) - else_if: "$ClearSpeak_MultiLineLabel = 'Row'" then_test: - if: "$LineCount = 1" @@ -680,10 +680,10 @@ - else_if: "$ClearSpeak_MultiLineLabel = 'Step'" then_test: - if: "$LineCount = 1" - then: [t: "krok"] # phrase(this is the first 'step' of three steps) + then: [T: "krok"] # phrase(this is the first 'step' of three steps) - else_if: "$Paucal" - then: [t: "kroki"] # phrase(there are 'two steps' to follow) - else: [t: "krokĂłw"] # phrase(there are 'five steps' to follow) + then: [T: "kroki"] # phrase(there are 'two steps' to follow) + else: [T: "krokĂłw"] # phrase(there are 'five steps' to follow) # else 'None -- don't say anything' - pause: short - x: "*" @@ -700,17 +700,17 @@ - pause: medium - test: - if: "($ClearSpeak_MultiLineLabel = 'Auto' and parent::m:piecewise) or $ClearSpeak_MultiLineLabel = 'Case'" - then: [t: "przypadek"] # phrase(in this 'case' x is not equal to y) + then: [T: "przypadek"] # phrase(in this 'case' x is not equal to y) - else_if: "$ClearSpeak_MultiLineLabel = 'Auto' or $ClearSpeak_MultiLineLabel = 'Line'" # already dealt with Auto/Case - then: [t: "linia"] # phrase(the straight 'line' between x and y) + then: [T: "linia"] # phrase(the straight 'line' between x and y) - else_if: "$ClearSpeak_MultiLineLabel = 'Constraint'" - then: [t: "warunek"] # phrase(there is a 'constraint' on possible values) + then: [T: "warunek"] # phrase(there is a 'constraint' on possible values) - else_if: "$ClearSpeak_MultiLineLabel = 'Equation'" - then: [t: "rĂłwnanie"] # phrase(the 'equation' pi r squared gives the area of a circle) + then: [T: "rĂłwnanie"] # phrase(the 'equation' pi r squared gives the area of a circle) - else_if: "$ClearSpeak_MultiLineLabel = 'Row'" then: [T: "wiersz"] # phrase(the values on the top 'row' are relevant) - else_if: "$ClearSpeak_MultiLineLabel = 'Step'" - then: [t: "krok"] # phrase(this is a 'step' by step process) + then: [T: "krok"] # phrase(this is a 'step' by step process) # else 'None -- don't say anything' - x: "count(preceding-sibling::*[not(contains(@data-intent-property, ':continued-row:'))]) + 1" - test: diff --git a/Rules/Languages/pl/SharedRules/calculus.yaml b/Rules/Languages/pl/SharedRules/calculus.yaml index 777ca4171..4d499f9a8 100644 --- a/Rules/Languages/pl/SharedRules/calculus.yaml +++ b/Rules/Languages/pl/SharedRules/calculus.yaml @@ -4,7 +4,7 @@ tag: laplacian match: "count(*) <= 1" # can be on ∇^2 or on enclosing mrow replace: - - t: "laplasjan" # phrase('laplacian' of x) -- "LahPlahsian" sounds better with speech engines tested + - T: "laplasjan" # phrase('laplacian' of x) -- "LahPlahsian" sounds better with speech engines tested - test: if: "count(*) = 1" then: @@ -22,8 +22,8 @@ replace: - test: if: "$Verbosity='Terse'" - then: [t: "dywergencja"] # phrase('div' is short for divergence) -- note OneCore voices spell out "div" - else: [t: "dywergencja z"] # phrase('divergence of' this function from the mean) + then: [T: "dywergencja"] # phrase('div' is short for divergence) -- note OneCore voices spell out "div" + else: [T: "dywergencja z"] # phrase('divergence of' this function from the mean) - test: if: "not(IsNode(*[1], 'leaf'))" then: [pause: short] @@ -33,7 +33,7 @@ tag: curl match: "count(*) = 1" replace: - - t: "rotacja" # phrase(the 'curl of' a field) + - T: "rotacja" # phrase(the 'curl of' a field) - test: if: "$Verbosity!='Terse'" then: [T: "z"] # phrase(function 'of' one variable) -- note OneCore voices spell out "div" @@ -48,8 +48,8 @@ replace: - test: if: "$Verbosity!='Terse'" - then: [t: "gradient z"] # phrase(the hill has a 'gradient of' five percent) - else: [t: "gradient"] # phrase(the delete key is labeled 'del') + then: [T: "gradient z"] # phrase(the hill has a 'gradient of' five percent) + else: [T: "gradient"] # phrase(the delete key is labeled 'del') - test: if: "not(IsNode(*[1], 'leaf'))" then: [pause: short] diff --git a/Rules/Languages/pl/SharedRules/default.yaml b/Rules/Languages/pl/SharedRules/default.yaml index 531f57a5d..8397efb7b 100644 --- a/Rules/Languages/pl/SharedRules/default.yaml +++ b/Rules/Languages/pl/SharedRules/default.yaml @@ -100,7 +100,7 @@ tag: ms match: "." replace: - - t: "string" # phrase('the string' is long) + - T: "string" # phrase('the string' is long) - pause: short - x: "text()" @@ -142,7 +142,7 @@ - pause: short - test: if: "$Impairment = 'Blindness'" - then: [t: "koniec uƂamka"] # phrase("start of fraction x over y 'end over'") + then: [T: "koniec uƂamka"] # phrase("start of fraction x over y 'end over'") - pause: medium @@ -332,7 +332,7 @@ then: - T: "z" # phrase(substitute x 'with' y) - x: "count($Prescripts) div 2" - - t: "lewe indeksy" # phrase(in this equation certain 'prescripts' apply) + - T: "lewe indeksy" # phrase(in this equation certain 'prescripts' apply) - pause: short - test: if: "not($Prescripts[1][self::m:none])" @@ -367,9 +367,9 @@ - test: if: "count($Prescripts) > 4" # give up and just dump them out so at least the content is there then: - - t: "i kolejne lewe indeksy" # phrase(in this case there are values 'and alternating prescripts') + - T: "i kolejne lewe indeksy" # phrase(in this case there are values 'and alternating prescripts') - x: "$Prescripts[position() > 4]" - - t: "koniec lewych indeksĂłw" # phrase(This is where 'end prescripts' occurs) + - T: "koniec lewych indeksĂłw" # phrase(This is where 'end prescripts' occurs) - test: if: "$Postscripts" then: @@ -386,7 +386,7 @@ then: [T: "i"] # phrase(10 is greater than 8 'and' less than 15) - T: "z" # phrase(substitute x 'with' y) - x: "count($Postscripts) div 2" - - t: "prawe indeksy" # phrase(this material includes several 'postscripts') + - T: "prawe indeksy" # phrase(this material includes several 'postscripts') - pause: short - test: if: "not($Postscripts[1][self::m:none])" @@ -452,9 +452,9 @@ - test: if: "count($Postscripts) > 8" # give up and just dump them out so at least the content is there then: - - t: "i kolejne indeksy" # phrase(this situation involves complexities 'and alternating scripts') + - T: "i kolejne indeksy" # phrase(this situation involves complexities 'and alternating scripts') - x: "$Postscripts[position() > 8]" - - t: "koniec indeksĂłw" # phrase(At this point 'end scripts' occurs) + - T: "koniec indeksĂłw" # phrase(At this point 'end scripts' occurs) - name: default tag: mtable @@ -540,7 +540,7 @@ tag: menclose match: "@notation='box' and *[self::m:mtext and .=' ']" replace: - - t: "pusta ramka" # phrase(the 'empty box' contains no values) + - T: "pusta ramka" # phrase(the 'empty box' contains no values) - name: default # The ordering below is the order in which words come out when there is more than one value @@ -550,29 +550,29 @@ replace: - test: if: ".[contains(concat(' ', normalize-space(@notation), ' '), ' box ')]" - then: [t: "ramka", pause: short] # phrase(the 'box' around the expression) + then: [T: "ramka", pause: short] # phrase(the 'box' around the expression) - test: if: ".[contains(@notation,'roundedbox')]" - then: [t: "zaokrąglona ramka", pause: short] # phrase(the 'round box' around the expression) + then: [T: "zaokrąglona ramka", pause: short] # phrase(the 'round box' around the expression) - test: if: ".[contains(@notation,'circle')]" - then: [t: "okrąg", pause: short] # phrase(the 'circle' around the expression) + then: [T: "okrąg", pause: short] # phrase(the 'circle' around the expression) - test: if: ".[ contains(concat(' ', normalize-space(@notation), ' '), ' left ') or contains(concat(' ', normalize-space(@notation), ' '), ' right ') or contains(@notation,'top') or contains(@notation,'bottom') ]" then: - - t: "linia na" # phrase(draw a straight 'line' on the page) + - T: "linia na" # phrase(draw a straight 'line' on the page) - test: if: ".[contains(concat(' ', normalize-space(@notation), ' '), ' left ')]" - then: [t: "lewo", pause: short] # phrase(line on 'left' of the expression) + then: [T: "lewo", pause: short] # phrase(line on 'left' of the expression) - test: if: ".[contains(concat(' ', normalize-space(@notation), ' '), ' right ')]" - then: [t: "prawo", pause: short] # phrase(line on 'right' of the expression) + then: [T: "prawo", pause: short] # phrase(line on 'right' of the expression) - test: if: ".[contains(@notation,'top')]" - then: [t: "gĂłra", pause: short] # phrase(line on 'top' of the expression) + then: [T: "gĂłra", pause: short] # phrase(line on 'top' of the expression) - test: if: ".[contains(@notation,'bottom')]" - then: [t: "dóƂ", pause: short] # phrase(line on the 'bottom' of the expression) + then: [T: "dóƂ", pause: short] # phrase(line on the 'bottom' of the expression) - test: if: ".[ contains(@notation,'updiagonalstrike') or contains(@notation,'downdiagonalstrike') or contains(@notation,'verticalstrike') or contains(@notation,'horizontalstrike') ]" then: @@ -582,77 +582,77 @@ else: - test: if: ".[contains(@notation,'updiagonalstrike')]" - then: [t: "ukoƛnie w gĂłrę", pause: short] # phrase(the line runs 'up diagonal') + then: [T: "ukoƛnie w gĂłrę", pause: short] # phrase(the line runs 'up diagonal') - test: if: ".[contains(@notation,'downdiagonalstrike')]" - then: [t: "ukoƛnie w dóƂ", pause: short] # phrase(the line runs 'down diagonal') + then: [T: "ukoƛnie w dóƂ", pause: short] # phrase(the line runs 'down diagonal') - test: if: ".[contains(@notation,'verticalstrike')]" - then: [t: "pionowy", pause: short] # phrase(the line is 'vertical') + then: [T: "pionowy", pause: short] # phrase(the line is 'vertical') - test: if: ".[contains(@notation,'horizontalstrike')]" - then: [t: "poziomy", pause: short] # phrase(the line is 'horizontal') - - t: "krzyĆŒ na zewnątrz" # phrase(please 'cross out' the incorrect answer) + then: [T: "poziomy", pause: short] # phrase(the line is 'horizontal') + - T: "krzyĆŒ na zewnątrz" # phrase(please 'cross out' the incorrect answer) - pause: short - test: if: ".[contains(@notation,'uparrow')]" - then: [t: "strzaƂka w gĂłrę", pause: short] # phrase(direction is shown by the 'up arrow') + then: [T: "strzaƂka w gĂłrę", pause: short] # phrase(direction is shown by the 'up arrow') - test: if: ".[contains(concat(' ', normalize-space(@notation), ' '), ' downarrow ')]" - then: [t: "strzaƂka w dóƂ", pause: short] # phrase(the trend is shown by the 'down arrow') + then: [T: "strzaƂka w dóƂ", pause: short] # phrase(the trend is shown by the 'down arrow') - test: if: ".[contains(@notation,'leftarrow')]" - then: [t: "strzaƂka w lewo", pause: short] # phrase(the 'left arrow' indicates going back) + then: [T: "strzaƂka w lewo", pause: short] # phrase(the 'left arrow' indicates going back) - test: if: ".[contains(concat(' ', normalize-space(@notation), ' '), ' rightarrow ')]" - then: [t: "strzaƂka w prawo", pause: short] # phrase(the 'right arrow' indicates moving forward) + then: [T: "strzaƂka w prawo", pause: short] # phrase(the 'right arrow' indicates moving forward) - test: if: ".[contains(@notation,'northeastarrow')]" - then: [t: "strzaƂka na póƂnocny wschĂłd", pause: short] # phrase(direction is indicated by the 'northeast arrow') + then: [T: "strzaƂka na póƂnocny wschĂłd", pause: short] # phrase(direction is indicated by the 'northeast arrow') - test: if: ".[contains(concat(' ', normalize-space(@notation), ' '), ' southeastarrow ')]" - then: [t: "strzaƂka na poƂudniowy wschĂłd", pause: short] # phrase(direction is shown by the 'southeast arrow') + then: [T: "strzaƂka na poƂudniowy wschĂłd", pause: short] # phrase(direction is shown by the 'southeast arrow') - test: if: ".[contains(concat(' ', normalize-space(@notation), ' '), ' southwestarrow ')]" - then: [t: "strzaƂka na poƂudniowy zachĂłd", pause: short] # phrase(direction is shown by the 'southwest arrow') + then: [T: "strzaƂka na poƂudniowy zachĂłd", pause: short] # phrase(direction is shown by the 'southwest arrow') - test: if: ".[contains(@notation,'northwestarrow')]" - then: [t: "strzaƂka na póƂnocny zachĂłd", pause: short] # phrase(direction is shown by the 'northwest arrow') + then: [T: "strzaƂka na póƂnocny zachĂłd", pause: short] # phrase(direction is shown by the 'northwest arrow') - test: if: ".[contains(@notation,'updownarrow')]" - then: [t: "strzaƂka dwukierunkowa pionowa", pause: short] # phrase(upward movement is indicated by the 'double ended vertical arrow') + then: [T: "strzaƂka dwukierunkowa pionowa", pause: short] # phrase(upward movement is indicated by the 'double ended vertical arrow') - test: if: ".[contains(@notation,'leftrightarrow')]" - then: [t: "strzaƂka dwukierunkowa pozioma", pause: short] # phrase(progress is indicated by the 'double ended horizontal arrow') + then: [T: "strzaƂka dwukierunkowa pozioma", pause: short] # phrase(progress is indicated by the 'double ended horizontal arrow') - test: if: ".[contains(@notation,'northeastsouthwestarrow')]" - then: [t: "strzaƂka dwukierunkowa ukoƛna w gĂłrę", pause: short] # phrase(trend is indicated by the 'double ended up diagonal arrow') + then: [T: "strzaƂka dwukierunkowa ukoƛna w gĂłrę", pause: short] # phrase(trend is indicated by the 'double ended up diagonal arrow') - test: if: ".[contains(@notation,'northwestsoutheastarrow')]" - then: [t: "strzaƂka dwukierunkowa ukoƛna w dóƂ", pause: short] # phrase(trend is indicated by the 'double ended down diagonal arrow') + then: [T: "strzaƂka dwukierunkowa ukoƛna w dóƂ", pause: short] # phrase(trend is indicated by the 'double ended down diagonal arrow') - test: if: ".[contains(@notation,'actuarial')]" - then: [t: "symbol aktuarialny", pause: short] # phrase(the 'actuarial symbol' represents a specific quantity) + then: [T: "symbol aktuarialny", pause: short] # phrase(the 'actuarial symbol' represents a specific quantity) - test: if: ".[contains(@notation,'madrub')]" - then: [t: "arabski symbol silni", pause: short] # phrase(the 'arabic factorial symbol' represents a factorial operation) + then: [T: "arabski symbol silni", pause: short] # phrase(the 'arabic factorial symbol' represents a factorial operation) - test: if: ".[contains(@notation,'phasorangle')]" - then: [t: "kąt fazowy", pause: short] # phrase(the 'phasor angle' is used to measure electrical current) + then: [T: "kąt fazowy", pause: short] # phrase(the 'phasor angle' is used to measure electrical current) - test: if: ".[contains(@notation,'longdiv') or not(@notation) or normalize-space(@notation) ='']" # default - then: [t: "znak dzielenia pisemnego", pause: short] # phrase(the 'long division symbol' indicates a long division calculation) + then: [T: "znak dzielenia pisemnego", pause: short] # phrase(the 'long division symbol' indicates a long division calculation) - test: if: ".[contains(@notation,'radical')]" then: [T: "pierwiastek kwadratowy", pause: short] # phrase(5 is the 'square root' of 25) - - t: "obejmujący" # phrase(parentheses are 'enclosing' part of the equation) + - T: "obejmujący" # phrase(parentheses are 'enclosing' part of the equation) - test: if: "*[self::m:mtext and .=' ']" then: [T: "spacja"] # otherwise there is complete silence # phrase(there is a 'space' between the words) else: [x: "*"] - test: if: "$Impairment = 'Blindness' and ( $SpeechStyle != 'SimpleSpeak' or not(IsNode(*[1], 'leaf')) )" - then: [t: "koniec obramowania"] # phrase(reached the 'end enclosure' point) + then: [T: "koniec obramowania"] # phrase(reached the 'end enclosure' point) - pause: short - name: semantics diff --git a/Rules/Languages/pl/SharedRules/general.yaml b/Rules/Languages/pl/SharedRules/general.yaml index 40e996f49..f3d026f2b 100644 --- a/Rules/Languages/pl/SharedRules/general.yaml +++ b/Rules/Languages/pl/SharedRules/general.yaml @@ -17,15 +17,15 @@ - bookmark: "*[1]/@id" - test: - if: "*[1][.='ℂ']" - then: [t: "liczby zespolone"] # phrase('complex numbers' consist of two parts) + then: [T: "liczby zespolone"] # phrase('complex numbers' consist of two parts) - else_if: "*[1][.='ℕ']" - then: [t: "liczby naturalne"] # phrase('natural numbers' are numbers from 1 to infinity) + then: [T: "liczby naturalne"] # phrase('natural numbers' are numbers from 1 to infinity) - else_if: "*[1][.='ℚ']" - then: [t: "liczby wymierne"] # phrase('rational numbers' are the fraction of 2 integers) + then: [T: "liczby wymierne"] # phrase('rational numbers' are the fraction of 2 integers) - else_if: "*[1][.='ℝ']" - then: [t: "liczby rzeczywiste"] # phrase('real numbers' can be both positive and negative) + then: [T: "liczby rzeczywiste"] # phrase('real numbers' can be both positive and negative) - else_if: "*[1][.='â„€']" - then: [t: "liczby caƂkowite"] # phrase(positive 'integers' are natural numbers above 0) + then: [T: "liczby caƂkowite"] # phrase(positive 'integers' are natural numbers above 0) else: [x: "*[1][text()]"] # shouldn't happen - name: dimension-number-sets @@ -57,15 +57,15 @@ - bookmark: "@id" - test: - if: ".='ℂ'" - then: [t: "liczby zespolone"] # phrase('the complex numbers' include 2 parts) + then: [T: "liczby zespolone"] # phrase('the complex numbers' include 2 parts) - else_if: ".='ℕ'" - then: [t: "liczby naturalne"] # phrase('the natural numbers' begin at 1) + then: [T: "liczby naturalne"] # phrase('the natural numbers' begin at 1) - else_if: ".='ℚ'" - then: [t: "liczby wymierne"] # phrase('the rational numbers' are the fraction of 2 integers) + then: [T: "liczby wymierne"] # phrase('the rational numbers' are the fraction of 2 integers) - else_if: ".='ℝ'" - then: [t: "liczby rzeczywiste"] # phrase('the real numbers' can be both positive and negative) + then: [T: "liczby rzeczywiste"] # phrase('the real numbers' can be both positive and negative) - else_if: ".='â„€'" - then: [t: "liczby caƂkowite"] # phrase('the integers' are natural numbers above 0) + then: [T: "liczby caƂkowite"] # phrase('the integers' are natural numbers above 0) else: [x: "text()"] # shouldn't happen - name: word-degree-celsius-fahrenheit-unit @@ -101,14 +101,14 @@ match: "." replace: - bookmark: "@id" - - t: "częƛć rzeczywista" # phrase('the real part' of a complex number does not include the imaginary part) + - T: "częƛć rzeczywista" # phrase('the real part' of a complex number does not include the imaginary part) - name: imaginary-part tag: imaginary-part match: "." replace: - bookmark: "@id" - - t: "częƛć urojona" # phrase('the imaginary part' is part of a complex number) + - T: "częƛć urojona" # phrase('the imaginary part' is part of a complex number) # rules on scripted vertical bars ('evaluated at') - name: evaluated-at-2 @@ -117,7 +117,7 @@ replace: - x: "*[1]" - pause: auto - - t: "obliczone w" # phrase(results were 'evaluated at' a given point) + - T: "obliczone w" # phrase(results were 'evaluated at' a given point) - pause: auto - x: "*[2]" @@ -127,10 +127,10 @@ replace: - x: "*[1]" - pause: auto - - t: "obliczone w" # phrase(results were 'evaluated at' this point) + - T: "obliczone w" # phrase(results were 'evaluated at' this point) - pause: auto - x: "*[3]" - - t: "minus to samo wyraĆŒenie obliczone w" # phrase(this result is 'minus the same expression evaluated at' an earlier point) + - T: "minus to samo wyraĆŒenie obliczone w" # phrase(this result is 'minus the same expression evaluated at' an earlier point) - x: "*[2]" - name: permutation @@ -139,7 +139,7 @@ match: "count(*)=2 and contains(@data-intent-property, ':infix:')" replace: - x: "*[2]" - - t: "permutacji z" # phrase(the solution involves several 'permutations of' values) + - T: "permutacji z" # phrase(the solution involves several 'permutations of' values) - x: "*[1]" - name: intervals @@ -221,7 +221,7 @@ match: "." replace: - x: "*[1]" - - t: "z okresem" # phrase('with repeating digits') + - T: "z okresem" # phrase('with repeating digits') - spell: "*[2]" - name: msubsup-skip-super @@ -286,6 +286,15 @@ IfThenElse(parent::m:power[parent::m:fraction and not(preceding-sibling::*)], ancestor::*[3][self::m:mrow], false()) ) ) )" - IsSingular: "(not($MRowForCoefficient) and parent::*[name(.)!='skip-super' or *[1][.=1]]) or ($MRowForCoefficient and $MRowForCoefficient[(count(*) = 3 and *[1][self::m:mn and .=1] and *[2]='\u2062')])" + # Polish plural depends on the numeral, not only on "is it one": + # 1 metr | 2, 3, 4 metry (nominative plural) | 5 metrĂłw (genitive plural) + # and the teens break the naive rule: 12, 13, 14 metrĂłw (genitive, despite + # ending in 2, 3, 4), likewise 112-114. $Coefficient is 0 when the numeral + # cannot be determined, which falls through to the genitive - the form + # Polish uses with unknown or large quantities. + - Coefficient: "IfThenElse($MRowForCoefficient, number($MRowForCoefficient/*[1][self::m:mn]), 0)" + - IsNominativePlural: "$Coefficient mod 10 >= 2 and $Coefficient mod 10 <= 4 and + not($Coefficient mod 100 >= 12 and $Coefficient mod 100 <= 14)" - Prefix: "''" - Word: "''" replace: @@ -333,9 +342,13 @@ - if: "$IsSingular" # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets the prefix concatenated to the base then: [x: "$Word"] - - else_if: "DefinitionValue($Word, 'Speech', 'PluralForms') != ''" + - else_if: "$IsNominativePlural and DefinitionValue($Word, 'Speech', 'PluralForms') != ''" then: [x: "DefinitionValue($Word, 'Speech', 'PluralForms')"] - else: [x: "$Word", ct: "s"] + - else_if: "DefinitionValue($Word, 'Speech', 'PluralGenitive') != ''" + then: [x: "DefinitionValue($Word, 'Speech', 'PluralGenitive')"] + # No inflected form is known: speak the singular, because a wrong + # ending is worse for a screen reader user than a missing one. + else: [x: "$Word"] else: - x: "$Prefix" - ct: "-" @@ -343,9 +356,11 @@ - if: "$IsSingular" # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets the prefix concatenated to the base then: [x: "concat('\uF8FE', $Word)"] - - else_if: "DefinitionValue($Word, 'Speech', 'PluralForms') != ''" + - else_if: "$IsNominativePlural and DefinitionValue($Word, 'Speech', 'PluralForms') != ''" then: [x: "concat('\uF8FE', DefinitionValue($Word, 'Speech', 'PluralForms'))"] - else: [x: "concat('\uF8FE', $Word)", ct: "s"] + - else_if: "DefinitionValue($Word, 'Speech', 'PluralGenitive') != ''" + then: [x: "concat('\uF8FE', DefinitionValue($Word, 'Speech', 'PluralGenitive'))"] + else: [x: "concat('\uF8FE', $Word)"] # need to reverse the order of speech: $ 3 -> 3 dollars - name: currency @@ -355,15 +370,21 @@ # If the amount is singular, we don't add the plural ending. - IsSingular: "*[3][self::m:mn and .=1] and *[2]='\u2062'" - CurrencyWord: "DefinitionValue(*[1], 'Speech', 'CurrencySymbols')" + # Same numeral-dependent choice as in the 'unit' rule above. + - Coefficient: "IfThenElse(*[3][self::m:mn], number(*[3]), 0)" + - IsNominativePlural: "$Coefficient mod 10 >= 2 and $Coefficient mod 10 <= 4 and + not($Coefficient mod 100 >= 12 and $Coefficient mod 100 <= 14)" replace: - bookmark: "*[3]/@id" - x: "*[3]" - test: - if: "$IsSingular" then: [x: "$CurrencyWord"] - - else_if: "DefinitionValue($CurrencyWord, 'Speech', 'PluralForms') != ''" + - else_if: "$IsNominativePlural and DefinitionValue($CurrencyWord, 'Speech', 'PluralForms') != ''" then: [x: "DefinitionValue($CurrencyWord, 'Speech', 'PluralForms')"] - else: [x: "DefinitionValue(*[1], 'Speech', 'CurrencySymbols')", ct: "s"] + - else_if: "DefinitionValue($CurrencyWord, 'Speech', 'PluralGenitive') != ''" + then: [x: "DefinitionValue($CurrencyWord, 'Speech', 'PluralGenitive')"] + else: [x: "$CurrencyWord"] - name: sin tag: mi @@ -378,7 +399,7 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [t: "cosinus"] # phrase('cos' is the abbreviation for cosine) + then: [T: "cosinus"] # phrase('cos' is the abbreviation for cosine) else: [T: "cosinus"] # phrase(find the 'cosine' in a right-angle triangle) - name: tan tag: mi @@ -387,7 +408,7 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [t: "tangens"] # phrase(the 'tan' is the ratio of the opposite to the adjacent side of a right-angled triangle) + then: [T: "tangens"] # phrase(the 'tan' is the ratio of the opposite to the adjacent side of a right-angled triangle) else: [T: "tangens"] # phrase(a 'tangent' is a straight line that touches a curve) - name: sec tag: mi @@ -396,8 +417,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [t: "sekans"] # phrase(to 'seek' a solution) - else: [t: "sekans"] # phrase(a 'secant' intersects a curve at two or more points) + then: [T: "sekans"] # phrase(to 'seek' a solution) + else: [T: "sekans"] # phrase(a 'secant' intersects a curve at two or more points) - name: csc tag: mi match: ".='csc'" @@ -405,8 +426,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [t: "kosekans"] # phrase(we will 'cosecant' a solution) - else: [t: "kosekans"] # phrase(the 'cosecant' is the reciprocal of the secant) + then: [T: "kosekans"] # phrase(we will 'cosecant' a solution) + else: [T: "kosekans"] # phrase(the 'cosecant' is the reciprocal of the secant) - name: cot tag: mi match: ".='cot'" @@ -414,8 +435,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [t: "cotangens"] # phrase(find the 'cotangent' in a right-angle triangle) - else: [t: "cotangens"] # phrase(the 'cotangent' is the reciprocal of the tangent) + then: [T: "cotangens"] # phrase(find the 'cotangent' in a right-angle triangle) + else: [T: "cotangens"] # phrase(the 'cotangent' is the reciprocal of the tangent) - name: sinh tag: mi @@ -424,8 +445,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [t: "sinus hiperboliczny"] # phrase(the word 'sinch' is an abbreviation for hyperbolic sine) - else: [t: "sinus hiperboliczny"] # phrase(the 'hyperbolic sine' is used in mathematics) + then: [T: "sinus hiperboliczny"] # phrase(the word 'sinch' is an abbreviation for hyperbolic sine) + else: [T: "sinus hiperboliczny"] # phrase(the 'hyperbolic sine' is used in mathematics) - name: cosh tag: mi match: ".='cosh'" @@ -433,8 +454,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [t: "cosinus hiperboliczny"] # phrase('cosh' is an abbreviation of hyperbolic cosine) - else: [t: "cosinus hiperboliczny"] # phrase(the 'hyperbolic cosine' is a mathematical function) + then: [T: "cosinus hiperboliczny"] # phrase('cosh' is an abbreviation of hyperbolic cosine) + else: [T: "cosinus hiperboliczny"] # phrase(the 'hyperbolic cosine' is a mathematical function) - name: tanh tag: mi match: ".='tanh'" @@ -442,8 +463,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [t: "tangens hiperboliczny"] # phrase('tanch' is shorthand for hyperbolic tangent) - else: [t: "tangens hiperboliczny"] # phrase('hyperbolic tangent' is a mathematical function) + then: [T: "tangens hiperboliczny"] # phrase('tanch' is shorthand for hyperbolic tangent) + else: [T: "tangens hiperboliczny"] # phrase('hyperbolic tangent' is a mathematical function) - name: sech tag: mi match: ".='sech'" @@ -451,8 +472,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [t: "sekans hiperboliczny"] # phrase('sheck' is shorthand for hyperbolic secant) - else: [t: "sekans hiperboliczny"] # phrase('hyperbolic secant' is a mathematical function) + then: [T: "sekans hiperboliczny"] # phrase('sheck' is shorthand for hyperbolic secant) + else: [T: "sekans hiperboliczny"] # phrase('hyperbolic secant' is a mathematical function) - name: csch tag: mi match: ".='csch'" @@ -460,8 +481,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [t: "kosekans hiperboliczny"] # phrase('cosheck' is shorthand for hyperbolic cosecant) - else: [t: "kosekans hiperboliczny"] # phrase('hyperbolic cosecant' is a mathematical function) + then: [T: "kosekans hiperboliczny"] # phrase('cosheck' is shorthand for hyperbolic cosecant) + else: [T: "kosekans hiperboliczny"] # phrase('hyperbolic cosecant' is a mathematical function) - name: coth tag: mi match: ".='coth'" @@ -469,8 +490,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [t: "cotangens hiperboliczny"] # phrase('cotanch' is shorthand for hyperbolic cotangent) - else: [t: "cotangens hiperboliczny"] # phrase(the 'hyperbolic cotangent' is a mathematical function) + then: [T: "cotangens hiperboliczny"] # phrase('cotanch' is shorthand for hyperbolic cotangent) + else: [T: "cotangens hiperboliczny"] # phrase(the 'hyperbolic cotangent' is a mathematical function) - name: exponential tag: mi match: ".='exp'" @@ -478,8 +499,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [t: "eksponenta"] # phrase('exp' means exponential function) - else: [t: "funkcja wykƂadnicza"] # phrase('exponential' function) + then: [T: "eksponenta"] # phrase('exp' means exponential function) + else: [T: "funkcja wykƂadnicza"] # phrase('exponential' function) - name: covariance tag: mi match: ".='Cov'" @@ -487,8 +508,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [t: "kowariancja"] # phrase('Cov' is shorthand for the covariance function) - else: [t: "kowariancja"] # phrase('covariance' function) + then: [T: "kowariancja"] # phrase('Cov' is shorthand for the covariance function) + else: [T: "kowariancja"] # phrase('covariance' function) - name: maximum tag: mi @@ -551,25 +572,25 @@ then: - test: - if: "self::m:piecewise" - then: [t: "przypadek"] # phrase(this is the first 'case' of three cases) + then: [T: "przypadek"] # phrase(this is the first 'case' of three cases) - else_if: "self::m:system-of-equations" - then: [t: "rĂłwnanie"] # phrase(this is the first 'equation' of three equations) - else: [t: "linia"] # phrase(this is the first 'line' of three lines) + then: [T: "rĂłwnanie"] # phrase(this is the first 'equation' of three equations) + else: [T: "linia"] # phrase(this is the first 'line' of three lines) - else_if: "($LineCount mod 10 = 2 or $LineCount mod 10 = 3 or $LineCount mod 10 = 4) and not($LineCount mod 100 = 12 or $LineCount mod 100 = 13 or $LineCount mod 100 = 14)" then: - test: - if: "self::m:piecewise" - then: [t: "przypadki"] # phrase(there are 'two cases' to consider) + then: [T: "przypadki"] # phrase(there are 'two cases' to consider) - else_if: "self::m:system-of-equations" - then: [t: "rĂłwnania"] # phrase(there are 'two equations' to solve) - else: [t: "linie"] # phrase(there are 'two lines' shown) + then: [T: "rĂłwnania"] # phrase(there are 'two equations' to solve) + else: [T: "linie"] # phrase(there are 'two lines' shown) - else: - test: - if: "self::m:piecewise" - then: [t: "przypadkĂłw"] # phrase(there are 'five cases' to consider) + then: [T: "przypadkĂłw"] # phrase(there are 'five cases' to consider) - else_if: "self::m:system-of-equations" - then: [t: "rĂłwnaƄ"] # phrase(there are 'five equations' to solve) - else: [t: "linii"] # phrase(there are 'five lines' shown) + then: [T: "rĂłwnaƄ"] # phrase(there are 'five equations' to solve) + else: [T: "linii"] # phrase(there are 'five lines' shown) - pause: short - x: "*" - pause: long @@ -586,10 +607,10 @@ - pause: medium - test: - if: "parent::m:piecewise" - then: [t: "przypadek"] # phrase('case' 1 of 10 cases) + then: [T: "przypadek"] # phrase('case' 1 of 10 cases) - else_if: "parent::m:system-of-equations" - then: [t: "rĂłwnanie"] # phrase('equation' 1 of 10 equations) - else: [t: "linia"] # phrase('line 1 of 10 lines) + then: [T: "rĂłwnanie"] # phrase('equation' 1 of 10 equations) + else: [T: "linia"] # phrase('line 1 of 10 lines) - x: "count(preceding-sibling::*[not(contains(@data-intent-property, ':continued-row:'))]) + 1" - test: if: "self::m:mlabeledtr" @@ -638,13 +659,13 @@ variables: [IsColumnSilent: true()] match: "count(*)=1 and *[self::m:mtr][count(*) = 1]" replace: - - t: "jeden na jeden" # phrase(the '1 by 1' matrix) + - T: "jeden na jeden" # phrase(the '1 by 1' matrix) - test: if: "self::m:determinant" # just need to check the first bracket since we know it must be (, [, or | then: [T: "wyznacznik"] # phrase(the 2 by 2 'determinant')) else: [T: "macierz"] # phrase(the 2 by 2 'matrix') - - t: "z elementem" # phrase(the 2 by 2 matrix 'with entry' x) + - T: "z elementem" # phrase(the 2 by 2 matrix 'with entry' x) - x: "*[1]/*" # simpler reading methods for special case matrices @@ -657,7 +678,7 @@ - x: count(*) - T: "na" # phrase(the 1 'by' 2 matrix) - x: count(*[self::m:mtr][1]/*) - - t: "macierz zerowa" # phrase(the 2 by 2 'zero matrix') + - T: "macierz zerowa" # phrase(the 2 by 2 'zero matrix') - pause: long - name: identity-matrix @@ -672,7 +693,7 @@ - x: count(*) - T: "na" # phrase(the 1 'by' 2 matrix) - x: count(*[self::m:mtr][1]/*) - - t: "macierz jednostkowa" # phrase(the 2 by 2 'identity matrix') + - T: "macierz jednostkowa" # phrase(the 2 by 2 'identity matrix') - pause: long - name: diagonal-matrix @@ -689,7 +710,7 @@ - x: count(*) - T: "na" # phrase(the 1 'by' 2 matrix) - x: count(*[self::m:mtr][1]/*) - - t: "macierz diagonalna" # phrase(the 2 by 2 'diagonal matrix') + - T: "macierz diagonalna" # phrase(the 2 by 2 'diagonal matrix') - pause: long - insert: # this lists the diagonal 'mtd's to be read, and they say "column nnn" before reading the contents @@ -711,7 +732,7 @@ replace: - T: "" # phrase('the' 2 by 2 matrix M) - x: count(*) - - t: "na jedną kolumnę" # phrase(the 2 'by 1 column' matrix) + - T: "na jedną kolumnę" # phrase(the 2 'by 1 column' matrix) - test: if: "$ClearSpeak_Matrix = 'Vector' or $ClearSpeak_Matrix = 'EndVector'" then: [T: "wektor"] # phrase(the 2 by 2 'vector') @@ -733,7 +754,7 @@ replace: - T: "" # phrase('the' 2 by 2 matrix M) - x: "count(*)" - - t: "na jedną kolumnę" # phrase(the 2 'by 1 column' matrix) + - T: "na jedną kolumnę" # phrase(the 2 'by 1 column' matrix) - test: if: "$ClearSpeak_Matrix = 'Vector' or $ClearSpeak_Matrix = 'EndVector'" then: [T: "wektor"] # phrase(the 2 column 'vector') @@ -742,7 +763,7 @@ - x: "*" # select the rows (mtr) - test: if: "$ClearSpeak_Matrix = 'EndMatrix' or $ClearSpeak_Matrix = 'EndVector'" - then: [t: "koniec macierzy"] # phrase(the 'end of matrix' has been reached) + then: [T: "koniec macierzy"] # phrase(the 'end of matrix' has been reached) - name: 1x2-or-3-matrix tag: matrix @@ -753,7 +774,7 @@ - count(*[1]/*)<=3 and # at least two cols - IsNode(*/*/*,'simple') # IsNode() returns true if all the nodes are simple replace: - - t: "jeden na" # phrase('the 1 by' 2 matrix) + - T: "jeden na" # phrase('the 1 by' 2 matrix) - x: count(*/*) - T: "wiersz" # phrase(the 1 by 4 'row' matrix) - test: @@ -775,7 +796,7 @@ variables: [IsColumnSilent: "$SpeechStyle = 'ClearSpeak' and $ClearSpeak_Matrix = 'SilentColNum'"] match: "count(*)=1" # one row replace: - - t: "jeden na" # phrase('the 1 by' 2 matrix) + - T: "jeden na" # phrase('the 1 by' 2 matrix) - x: "count(*/*)" - T: "wiersz" # phrase(the 1 by 2 'row' matrix) - test: @@ -811,7 +832,7 @@ else: - test: if: "@columnlines and (contains(normalize-space(@columnlines), 'solid') or contains(normalize-space(@columnlines), 'dashed'))" - then: [t: "macierz rozszerzona"] # phrase(the 2 by 2 'augmented matrix') + then: [T: "macierz rozszerzona"] # phrase(the 2 by 2 'augmented matrix') else: [T: "macierz"] # phrase(the 2 by 2 'matrix') - pause: long - x: "*" @@ -838,7 +859,7 @@ else: - test: if: "@columnlines and (contains(normalize-space(@columnlines), 'solid') or contains(normalize-space(@columnlines), 'dashed'))" - then: [t: "macierz rozszerzona"] # phrase(the 2 by 2 'augmented matrix') + then: [T: "macierz rozszerzona"] # phrase(the 2 by 2 'augmented matrix') else: [T: "macierz"] # phrase(the 2 by 2 'matrix') - pause: long - x: "*" @@ -1077,12 +1098,12 @@ - bookmark: "*[1]/@id" - test: - if: ".='s'" - then: [t: "ciaƂo staƂe"] # phrase(Boron is a 'solid' in its natural state) + then: [T: "ciaƂo staƂe"] # phrase(Boron is a 'solid' in its natural state) - else_if: ".='l'" - then: [t: "ciecz"] # phrase(water is a 'liquid') + then: [T: "ciecz"] # phrase(water is a 'liquid') - else_if: ".='g'" - then: [t: "gaz"] # phrase(hydrogen is a 'gas' ) - else: [t: "wodny"] # phrase(an 'aqueous' solution is contained in water) + then: [T: "gaz"] # phrase(hydrogen is a 'gas' ) + else: [T: "wodny"] # phrase(an 'aqueous' solution is contained in water) - pause: short - name: chemical-formula-operator-bond @@ -1093,13 +1114,13 @@ - bookmark: "@id" - test: - if: ".='-' or .=':'" - then: [t: "wiązanie pojedyncze"] # phrase(a 'single bond' is formed when two atoms share one pair of electrons) + then: [T: "wiązanie pojedyncze"] # phrase(a 'single bond' is formed when two atoms share one pair of electrons) - else_if: ".='=' or .='∷'" - then: [t: "wiązanie podwĂłjne"] # phrase(a 'double bond' may occur when two atoms share two pairs of electrons) + then: [T: "wiązanie podwĂłjne"] # phrase(a 'double bond' may occur when two atoms share two pairs of electrons) - else_if: ".='≡'" - then: [t: "wiązanie potrĂłjne"] # phrase(a 'triple bond' occurs when two atoms share three pairs of electrons) + then: [T: "wiązanie potrĂłjne"] # phrase(a 'triple bond' occurs when two atoms share three pairs of electrons) - else_if: ".='≣'" - then: [t: "wiązanie poczwĂłrne"] # phrase(a 'quadruple bond' occurs when two atoms share four pairs of electrons) + then: [T: "wiązanie poczwĂłrne"] # phrase(a 'quadruple bond' occurs when two atoms share four pairs of electrons) else: [x: "text()"] - name: chemical-formula-operator @@ -1118,14 +1139,14 @@ - if: ".='→' or .='⟶'" then_test: if: "$Verbosity='Terse'" - then: [t: "tworzy"] # phrase(hydrogen and oxygen 'forms' water ) - else: [t: "reaguje tworząc"] # phrase(hydrogen and oxygen 'reacts to form' water) + then: [T: "tworzy"] # phrase(hydrogen and oxygen 'forms' water ) + else: [T: "reaguje tworząc"] # phrase(hydrogen and oxygen 'reacts to form' water) - else_if: ".='⇌' or .='🣑'" # U+01F8D1 - then: [t: "jest w rĂłwnowadze z"] # phrase(a reactant 'is in equilibrium with' a product) + then: [T: "jest w rĂłwnowadze z"] # phrase(a reactant 'is in equilibrium with' a product) - else_if: ".='🣓'" # U+1F8D3 - then: [t: "jest w rĂłwnowadze przesuniętej w lewo z"] # phrase(the reactant 'is in equilibrium biased to the left with' the product) + then: [T: "jest w rĂłwnowadze przesuniętej w lewo z"] # phrase(the reactant 'is in equilibrium biased to the left with' the product) - else_if: ".='🣒'" # U+1F8D2 - then: [t: "jest w rĂłwnowadze przesuniętej w prawo z"] # phrase(the reactant 'is in equilibrium biased to the right with' the product) + then: [T: "jest w rĂłwnowadze przesuniętej w prawo z"] # phrase(the reactant 'is in equilibrium biased to the right with' the product) else: [x: "*"] - name: chemical-equation-operator diff --git a/Rules/Languages/pl/SharedRules/geometry.yaml b/Rules/Languages/pl/SharedRules/geometry.yaml index f110a71ed..3fa9c9ccc 100644 --- a/Rules/Languages/pl/SharedRules/geometry.yaml +++ b/Rules/Languages/pl/SharedRules/geometry.yaml @@ -7,12 +7,12 @@ - test: if: "$Verbosity='Verbose'" then: - - t: "odcinek od" # phrase('the line segment from' A to B) + - T: "odcinek od" # phrase('the line segment from' A to B) - x: "*[1]" - T: "do" # phrase(the line segment from A 'to' B) - x: "*[2]" else: - - t: "odcinek" # phrase(the 'line segment' A B) + - T: "odcinek" # phrase(the 'line segment' A B) - x: "*[1]" - x: "*[2]" @@ -23,12 +23,12 @@ - test: if: "$Verbosity='Verbose'" then: - - t: "póƂprosta od" # phrase('the ray from' A to B) + - T: "póƂprosta od" # phrase('the ray from' A to B) - x: "*[1]" - T: "do" # phrase(the ray from A 'to' B) - x: "*[2]" else: - - t: "póƂprosta" # phrase(the 'ray'A B) + - T: "póƂprosta" # phrase(the 'ray'A B) - x: "*[1]" - x: "*[2]" @@ -47,9 +47,9 @@ - test: if: "$Verbosity='Verbose'" then: - - t: "miara kąta" # phrase('the measure of the angle' ABC) + - T: "miara kąta" # phrase('the measure of the angle' ABC) else: - - t: "miara kąta" # phrase('measure of angle' ABC) + - T: "miara kąta" # phrase('measure of angle' ABC) - x: "*[1]" - x: "*[2]" - x: "*[3]" @@ -74,4 +74,4 @@ - pause: short - test: if: "($SpeechStyle='ClearSpeak' and $Verbosity='Verbose') or not(IsNode(*[last()],'leaf'))" - then: [t: "punkt koƄcowy"] # phrase(start point, 'end point') + then: [T: "punkt koƄcowy"] # phrase(start point, 'end point') diff --git a/Rules/Languages/pl/SharedRules/linear-algebra.yaml b/Rules/Languages/pl/SharedRules/linear-algebra.yaml index 1ebcf9f95..69752bd48 100644 --- a/Rules/Languages/pl/SharedRules/linear-algebra.yaml +++ b/Rules/Languages/pl/SharedRules/linear-algebra.yaml @@ -36,7 +36,7 @@ - x: "*[1]" - test: if: "not(IsNode(*[1], 'simple')) and $Impairment = 'Blindness'" - then: [t: "koniec wyznacznika"] # phrase('end determinant' of a matrix) + then: [T: "koniec wyznacznika"] # phrase('end determinant' of a matrix) - name: subscripted-norm diff --git a/Rules/Languages/pl/definitions.yaml b/Rules/Languages/pl/definitions.yaml index 9c4c6e69c..18785562b 100644 --- a/Rules/Languages/pl/definitions.yaml +++ b/Rules/Languages/pl/definitions.yaml @@ -363,7 +363,7 @@ "F": "farad", "Gy": "grej", "H": "henr", - "Hz": "herce", + "Hz": "herc", "J": "dĆŒul", "kat": "katal", "lm": "lumen", @@ -438,7 +438,7 @@ "M": "molowy", "R": "rentgen", "rpm": "obrĂłt na minutę", - "℧": "M h o", + "℧": "mho", "dyn": "dyna", "erg": "erg", @@ -495,7 +495,7 @@ "lb t": "funt trojaƄski", # energy - "hp": "konie mechaniczne", + "hp": "koƄ mechaniczny", "BTU": "btu", "°F": "stopieƄ Fahrenheita", "℉": "stopieƄ Fahrenheita", @@ -511,25 +511,277 @@ } - PluralForms: { - # FIX: this needs to be flushed out - "cal": "cale", "cal kwadratowy": "cale kwadratowe", "cal szeƛcienny": "cale szeƛcienne", - "stopa": "stopy", "stopa kwadratowa": "stopy kwadratowe", "stopa szeƛcienna": "stopy szeƛcienne", + # Nominative plural - after the numerals 2, 3, 4 (but not 12-14 or 112-114). + # The genitive plural (5 and above) lives in PluralGenitive below. + "akr": "akry", + "amper": "ampery", + "angstrem": "angstremy", + "atmosfera": "atmosfery", + "bajt": "bajty", + "bar": "bary", + "baryƂka": "baryƂki", + "bekerel": "bekerele", + "bel": "bele", + "bit": "bity", + "bitcoin": "bitcoiny", + "bod": "body", + "btu": "btu", + "buszel": "buszle", + "cal": "cale", + "cal kwadratowy": "cale kwadratowe", + "cal szeƛcienny": "cale szeƛcienne", + "cent": "centy", + "cetnar": "cetnary", + "colon": "colony", + "dalton": "daltony", + "decybel": "decybele", + "dolar": "dolary", + "drachma": "drachmy", + "drachma pƂynu": "drachmy pƂynu", + "dyna": "dyny", + "dzieƄ": "dni", + "dĆŒul": "dĆŒule", + "eksbibajt": "eksbibajty", + "eksbibit": "eksbibity", + "elektronowolt": "elektronowolty", + "erg": "ergi", + "euro": "euro", + "farad": "farady", + "fermi": "fermi", + "funt": "funty", + "funt trojaƄski": "funty trojaƄskie", + "galon": "galony", + "gibibajt": "gibibajty", + "gibibit": "gibibity", + "gill": "gille", + "godzina": "godziny", + "grad": "grady", + "gram": "gramy", + "gran": "grany", + "grej": "greje", + "hektar": "hektary", + "henr": "henry", + "herc": "herce", + "jard kwadratowy": "jardy kwadratowe", + "jard szeƛcienny": "jardy szeƛcienne", + "jednostka astronomiczna": "jednostki astronomiczne", + "jednostka masy atomowej": "jednostki masy atomowej", + "jobibajt": "jobibajty", + "jobibit": "jobibity", + "kaloria": "kalorie", + "kandela": "kandele", + "katal": "katale", + "kelwin": "kelwiny", + "kibibajt": "kibibajty", + "kibibit": "kibibity", + "kiur": "kiury", + "koƄ mechaniczny": "konie mechaniczne", + "kubek": "kubki", + "kulomb": "kulomby", + "kwarta": "kwarty", + "lir": "liry", + "litr": "litry", + "luks": "luksy", + "lumen": "lumeny", + "mebibajt": "mebibajty", + "mebibit": "mebibity", + "metr": "metry", + "mho": "mho", + "mila": "mile", + "mila kwadratowa": "mile kwadratowe", + "mila na galon": "mile na galon", + "mila na godzinę": "mile na godzinę", + "minuta": "minuty", + "minuta Ƃuku": "minuty Ƃuku", + "mol": "mole", + "molowy": "molowe", + "neper": "nepery", + "niuton": "niutony", + "obrĂłt na minutę": "obroty na minutę", + "ogniwo": "ogniwa", + "om": "omy", + "parsek": "parseki", + "paskal": "paskale", + "pebibajt": "pebibajty", + "pebibit": "pebibity", + "pek": "peki", + "pennyweight": "pennyweight", + "peso": "peso", + "pinta": "pinty", + "pręt": "pręty", + "radian": "radiany", + "rentgen": "rentgeny", + "rok": "lata", + "rok ƛwietlny": "lata ƛwietlne", + "rupia": "rupie", + "sekunda": "sekundy", + "sekunda Ƃuku": "sekundy Ƃuku", + "siemens": "siemensy", + "siwert": "siwerty", + "steradian": "steradiany", + "stopa": "stopy", "stopa deskowa": "stopy deskowe", + "stopa kwadratowa": "stopy kwadratowe", + "stopa szeƛcienna": "stopy szeƛcienne", "stopieƄ": "stopnie", "stopieƄ Celsjusza": "stopnie Celsjusza", "stopieƄ Fahrenheita": "stopnie Fahrenheita", - "degree celsius": "stopnie Celsjusza", - "degree fahrenheit": "stopnie Fahrenheita", - "henr": "henry", - "wolt": "wolty", + "szekel": "szekle", + "tebibajt": "tebibajty", + "tebibit": "tebibity", + "tesla": "tesle", + "tona": "tony", + "tydzieƄ": "tygodnie", + "uncja": "uncje", + "uncja pƂynu": "uncje pƂynu", + "uncja trojaƄska": "uncje trojaƄskie", "wat": "waty", - "hertz": "herce", - "luks": "luksy", - "siemens": "siemens", - "obrĂłt na minutę": "obroty na minutę", - "mila na godzinę": "mile na godzinę", - "mila na galon": "mile na galon", - "colon": "colony", "lir": "liry", "won": "wony", "bitcoin": "bitcoiny" + "weber": "webery", + "wolt": "wolty", + "won": "wony", + "zebibajt": "zebibajty", + "zebibit": "zebibity", + "ƂaƄcuch": "ƂaƄcuchy", + "ƂyĆŒeczka": "ƂyĆŒeczki", + "ƂyĆŒka stoƂowa": "ƂyĆŒki stoƂowe" + } + +- PluralGenitive: { + # Genitive plural - after 5 and above, and after 12-14, 112-114. + # Polish inflects the noun according to the numeral, so a single plural + # form is not enough: 2 metry but 5 metrĂłw. The 'unit' and 'currency' + # rules pick the section based on the value of the numeral. + "akr": "akrĂłw", + "amper": "amperĂłw", + "angstrem": "angstremĂłw", + "atmosfera": "atmosfer", + "bajt": "bajtĂłw", + "bar": "barĂłw", + "baryƂka": "baryƂek", + "bekerel": "bekereli", + "bel": "beli", + "bit": "bitĂłw", + "bitcoin": "bitcoinĂłw", + "bod": "bodĂłw", + "btu": "btu", + "buszel": "buszli", + "cal": "cali", + "cal kwadratowy": "cali kwadratowych", + "cal szeƛcienny": "cali szeƛciennych", + "cent": "centĂłw", + "cetnar": "cetnarĂłw", + "colon": "colonĂłw", + "dalton": "daltonĂłw", + "decybel": "decybeli", + "dolar": "dolarĂłw", + "drachma": "drachm", + "drachma pƂynu": "drachm pƂynu", + "dyna": "dyn", + "dzieƄ": "dni", + "dĆŒul": "dĆŒuli", + "eksbibajt": "eksbibajtĂłw", + "eksbibit": "eksbibitĂłw", + "elektronowolt": "elektronowoltĂłw", + "erg": "ergĂłw", + "euro": "euro", + "farad": "faradĂłw", + "fermi": "fermi", + "funt": "funtĂłw", + "funt trojaƄski": "funtĂłw trojaƄskich", + "galon": "galonĂłw", + "gibibajt": "gibibajtĂłw", + "gibibit": "gibibitĂłw", + "gill": "gilli", + "godzina": "godzin", + "grad": "gradĂłw", + "gram": "gramĂłw", + "gran": "granĂłw", + "grej": "grejĂłw", + "hektar": "hektarĂłw", + "henr": "henrĂłw", + "herc": "hercĂłw", + "jard kwadratowy": "jardĂłw kwadratowych", + "jard szeƛcienny": "jardĂłw szeƛciennych", + "jednostka astronomiczna": "jednostek astronomicznych", + "jednostka masy atomowej": "jednostek masy atomowej", + "jobibajt": "jobibajtĂłw", + "jobibit": "jobibitĂłw", + "kaloria": "kalorii", + "kandela": "kandeli", + "katal": "katali", + "kelwin": "kelwinĂłw", + "kibibajt": "kibibajtĂłw", + "kibibit": "kibibitĂłw", + "kiur": "kiurĂłw", + "koƄ mechaniczny": "koni mechanicznych", + "kubek": "kubkĂłw", + "kulomb": "kulombĂłw", + "kwarta": "kwart", + "lir": "lirĂłw", + "litr": "litrĂłw", + "luks": "luksĂłw", + "lumen": "lumenĂłw", + "mebibajt": "mebibajtĂłw", + "mebibit": "mebibitĂłw", + "metr": "metrĂłw", + "mho": "mho", + "mila": "mil", + "mila kwadratowa": "mil kwadratowych", + "mila na galon": "mil na galon", + "mila na godzinę": "mil na godzinę", + "minuta": "minut", + "minuta Ƃuku": "minut Ƃuku", + "mol": "moli", + "molowy": "molowych", + "neper": "neperĂłw", + "niuton": "niutonĂłw", + "obrĂłt na minutę": "obrotĂłw na minutę", + "ogniwo": "ogniw", + "om": "omĂłw", + "parsek": "parsekĂłw", + "paskal": "paskali", + "pebibajt": "pebibajtĂłw", + "pebibit": "pebibitĂłw", + "pek": "pekĂłw", + "pennyweight": "pennyweight", + "peso": "peso", + "pinta": "pint", + "pręt": "prętĂłw", + "radian": "radianĂłw", + "rentgen": "rentgenĂłw", + "rok": "lat", + "rok ƛwietlny": "lat ƛwietlnych", + "rupia": "rupii", + "sekunda": "sekund", + "sekunda Ƃuku": "sekund Ƃuku", + "siemens": "siemensĂłw", + "siwert": "siwertĂłw", + "steradian": "steradianĂłw", + "stopa": "stĂłp", + "stopa deskowa": "stĂłp deskowych", + "stopa kwadratowa": "stĂłp kwadratowych", + "stopa szeƛcienna": "stĂłp szeƛciennych", + "stopieƄ": "stopni", + "stopieƄ Celsjusza": "stopni Celsjusza", + "stopieƄ Fahrenheita": "stopni Fahrenheita", + "szekel": "szekli", + "tebibajt": "tebibajtĂłw", + "tebibit": "tebibitĂłw", + "tesla": "tesli", + "tona": "ton", + "tydzieƄ": "tygodni", + "uncja": "uncji", + "uncja pƂynu": "uncji pƂynu", + "uncja trojaƄska": "uncji trojaƄskich", + "wat": "watĂłw", + "weber": "weberĂłw", + "wolt": "woltĂłw", + "won": "wonĂłw", + "zebibajt": "zebibajtĂłw", + "zebibit": "zebibitĂłw", + "ƂaƄcuch": "ƂaƄcuchĂłw", + "ƂyĆŒeczka": "ƂyĆŒeczek", + "ƂyĆŒka stoƂowa": "ƂyĆŒek stoƂowych" } # Lines starting with "#" are a comment diff --git a/Rules/Languages/pl/navigate.yaml b/Rules/Languages/pl/navigate.yaml index c99b60490..bb89c8a9a 100644 --- a/Rules/Languages/pl/navigate.yaml +++ b/Rules/Languages/pl/navigate.yaml @@ -48,9 +48,9 @@ - if: "$MatchCounter = 0 and $SayCommand = 'true'" then_test: - if: "self::m:math and starts-with($NavCommand, 'ZoomOut')" - then: [t: "maksymalnie oddalono", pause: "medium"] + then: [T: "maksymalnie oddalono", pause: "medium"] - else_if: "IsNode(., 'leaf') and starts-with($NavCommand, 'ZoomIn')" - then: [t: "maksymalnie oddalono", pause: "medium"] + then: [T: "maksymalnie oddalono", pause: "medium"] else: - test: # CommandOffset to 1 + dƂugoƛć ANGIELSKIEGO rdzenia $NavCommand @@ -133,13 +133,13 @@ replace: - test: - if: "$Move2D = 'in'" - then: [t: "do"] # phrase(move 'in' to a part) + then: [T: "do"] # phrase(move 'in' to a part) - else_if: "$Move2D = 'out of'" - then: [t: "z"] # phrase(move 'out of' a part) + then: [T: "z"] # phrase(move 'out of' a part) - else_if: "$Move2D = 'end of'" - then: [t: "na koniec"] # phrase(move to the 'end of' a part) + then: [T: "na koniec"] # phrase(move to the 'end of' a part) - else_if: "$Move2D = 'start of'" - then: [t: "na początek"] # phrase(move to the 'start of' a part) + then: [T: "na początek"] # phrase(move to the 'start of' a part) else: [x: "$Move2D"] - test: - if: "$NumPrecedingSiblings=0" @@ -148,8 +148,8 @@ then: - test: # in postscripts -- base shifts by one if: "$NumPrecedingSiblings mod 2 = 0" - then: [t: "lewego indeksu dolnego"] # phrase(x with 'subscript' 2) - else: [t: "lewego indeksu gĂłrnego"] # phrase(x with 'superscript' 2) + then: [T: "lewego indeksu dolnego"] # phrase(x with 'subscript' 2) + else: [T: "lewego indeksu gĂłrnego"] # phrase(x with 'superscript' 2) else: - test: if: "$NumPrecedingSiblings mod 2 = 0" @@ -171,15 +171,15 @@ replace: - test: - if: "$Move2D = 'in'" - then: [t: "do"] # phrase(move 'in' to a part) + then: [T: "do"] # phrase(move 'in' to a part) - else_if: "$Move2D = 'out of' and starts-with($PartName, 'st')" then: [t: "ze"] # "ze stopnia" (eufonia przed 'st') - else_if: "$Move2D = 'out of'" - then: [t: "z"] # phrase(move 'out of' a part) + then: [T: "z"] # phrase(move 'out of' a part) - else_if: "$Move2D = 'end of'" - then: [t: "na koniec"] # phrase(move to the 'end of' a part) + then: [T: "na koniec"] # phrase(move to the 'end of' a part) - else_if: "$Move2D = 'start of'" - then: [t: "na początek"] # phrase(move to the 'start of' a part) + then: [T: "na początek"] # phrase(move to the 'start of' a part) else: [x: "$Move2D"] - test: - if: "$PartName != ''" @@ -203,7 +203,7 @@ then: [x: "SpeakIntentName(name(.), $Verbosity, 'silent')"] - else: [x: "SpeakIntentName(name(.), $Verbosity, 'other')"] else: - - t: "częƛci" # phrase(the 'part' of the expression) + - T: "częƛci" # phrase(the 'part' of the expression) - x: "count($Child2D/preceding-sibling::*) + 1" - pause: "medium" @@ -226,19 +226,19 @@ then: - test: - if: "$PreviousNavCommand = 'ZoomIn'" - then: [t: "cofnij przybliĆŒenie"] # phrase('undo zoom in') + then: [T: "cofnij przybliĆŒenie"] # phrase('undo zoom in') - else_if: "$PreviousNavCommand = 'ZoomOut'" - then: [t: "cofnij oddalenie"] # phrase('undo zoom out') + then: [T: "cofnij oddalenie"] # phrase('undo zoom out') - else_if: "$PreviousNavCommand = 'ZoomInAll'" - then: [t: "cofnij maksymalne przybliĆŒenie"] # phrase('undo zooming in all the way') + then: [T: "cofnij maksymalne przybliĆŒenie"] # phrase('undo zooming in all the way') - else_if: "$PreviousNavCommand = 'ZoomOutAll'" - then: [t: "cofnij maksymalne oddalenie"] # phrase('undo zooming out all the way') + then: [T: "cofnij maksymalne oddalenie"] # phrase('undo zooming out all the way') - else_if: "$PreviousNavCommand = 'MovePrevious' or $PreviousNavCommand = 'MovePreviousZoom'" - then: [t: "cofnij ruch w lewo"] # phrase('undo move left') + then: [T: "cofnij ruch w lewo"] # phrase('undo move left') - else_if: "$PreviousNavCommand = 'MoveNext' or $PreviousNavCommand = 'MoveNextZoom'" - then: [t: "cofnij ruch w prawo"] # phrase('undo move right') + then: [T: "cofnij ruch w prawo"] # phrase('undo move right') - else_if: "$PreviousNavCommand = 'None'" - then: [t: "brak poprzedniego polecenia"] # phrase('no previous command') + then: [T: "brak poprzedniego polecenia"] # phrase('no previous command') - pause: "medium" - set_variables: [NavNode: "@id"] @@ -261,7 +261,7 @@ replace: - test: if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" - then: [t: "maksymalnie przybliĆŒono", pause: "long"] # phrase('zoomed in all of the way') + then: [T: "maksymalnie przybliĆŒono", pause: "long"] # phrase('zoomed in all of the way') - test: if: "$ReadZoomLevel!=-1" then: @@ -552,12 +552,12 @@ then: - test: - if: "$NavCommand = 'MoveStart'" - then: [t: "przejdĆș na początek wyraĆŒenia matematycznego"] # phrase('move to start of math') + then: [T: "przejdĆș na początek wyraĆŒenia matematycznego"] # phrase('move to start of math') - else_if: "$NavCommand = 'MoveLineStart'" - then: [t: "przejdĆș na początek linii"] # phrase('move to start of line') + then: [T: "przejdĆș na początek linii"] # phrase('move to start of line') - else_if: "$NavCommand = 'MoveEnd'" - then: [t: "przejdĆș na koniec wyraĆŒenia matematycznego"] # phrase('move to end of math') - else: [t: "przejdĆș na koniec linii"] # "$NavCommand = 'MoveLineEnd'" # phrase('move to end of line') + then: [T: "przejdĆș na koniec wyraĆŒenia matematycznego"] # phrase('move to end of math') + else: [T: "przejdĆș na koniec linii"] # "$NavCommand = 'MoveLineEnd'" # phrase('move to end of line') - pause: "medium" - test: if: "$NavCommand = 'MoveStart' or $NavCommand = 'MoveLineStart'" @@ -597,8 +597,8 @@ then: - test: if: "$NavCommand = 'MoveLineStart'" - then: [t: "przejdĆș na początek linii"] # phrase('move to start of line') - else: [t: "przejdĆș na koniec linii"] # "$NavCommand = 'MoveLineEnd'" # phrase('move to end of line') + then: [T: "przejdĆș na początek linii"] # phrase('move to start of line') + else: [T: "przejdĆș na koniec linii"] # "$NavCommand = 'MoveLineEnd'" # phrase('move to end of line') - pause: "medium" - test: if: "self::m:mrow or @data-from-mathml = 'mrow'" @@ -634,7 +634,7 @@ - "$NavCommand='MoveColumnStart' or $NavCommand='MoveColumnEnd' or" - "$NavCommand='ReadCellCurrent'" replace: - - t: "poza tabelą" # phrase('not in table') + - T: "poza tabelą" # phrase('not in table') - pause: long - set_variables: [SpeakExpression: "'false'"] @@ -648,7 +648,7 @@ - test: if: "$NavVerbosity = 'Verbose'" then: - - t: "przejdĆș w lewo" # phrase('move left') + - T: "przejdĆș w lewo" # phrase('move left') - pause: short - test: if: "$NavVerbosity != 'Terse'" @@ -665,7 +665,7 @@ else: - set_variables: [NavNode: "preceding-sibling::*[1]/*[1]/@id"] else: - - t: "brak poprzedniej kolumny" # phrase('no previous column' in the table) + - T: "brak poprzedniej kolumny" # phrase('no previous column' in the table) - set_variables: [SpeakExpression: "'false'"] - name: move-cell-next @@ -678,7 +678,7 @@ - test: if: "$NavVerbosity = 'Verbose'" then: - - t: "przejdĆș w prawo" # phrase('move right') + - T: "przejdĆș w prawo" # phrase('move right') - pause: short - test: if: "$NavVerbosity != 'Terse'" @@ -695,7 +695,7 @@ else: - set_variables: [NavNode: "following-sibling::*[1]/*[1]/@id"] else: - - t: "brak następnej kolumny" # phrase('no next column' in the table) + - T: "brak następnej kolumny" # phrase('no next column' in the table) - set_variables: [SpeakExpression: "'false'"] - name: move-cell-up @@ -711,7 +711,7 @@ - test: if: "$NavVerbosity = 'Verbose'" then: - - t: "przejdĆș w gĂłrę" # phrase('move up' to previous row in the table) + - T: "przejdĆș w gĂłrę" # phrase('move up' to previous row in the table) - pause: short - test: if: "$NavVerbosity != 'Terse'" @@ -731,7 +731,7 @@ else: - set_variables: [NavNode: "../preceding-sibling::*[1]/*[$Column]/*[1]/@id"] else: - - t: "brak poprzedniego wiersza" # phrase('no previous row' in the table) + - T: "brak poprzedniego wiersza" # phrase('no previous row' in the table) - set_variables: [SpeakExpression: "'false'"] - name: move-cell-down @@ -747,7 +747,7 @@ - test: if: "$NavVerbosity = 'Verbose'" then: - - t: "przejdĆș w dóƂ" # phrase('move down to the next row in the table) + - T: "przejdĆș w dóƂ" # phrase('move down to the next row in the table) - pause: short - test: if: "$NavVerbosity != 'Terse'" @@ -767,7 +767,7 @@ else: - set_variables: [NavNode: "../following-sibling::*[1]/*[$Column]/*[1]/@id"] else: - - t: "brak następnego wiersza" # phrase('no next row' in the table) + - T: "brak następnego wiersza" # phrase('no next row' in the table) - set_variables: [SpeakExpression: "'false'"] - name: move-cell-up @@ -777,7 +777,7 @@ - test: if: "$NavVerbosity = 'Verbose'" then: - - t: "przejdĆș do poprzedniego wiersza" # phrase('move to previous row' to the previous row in the table) + - T: "przejdĆș do poprzedniego wiersza" # phrase('move to previous row' to the previous row in the table) - pause: medium - test: if: "preceding-sibling::*" @@ -791,7 +791,7 @@ else: - set_variables: [NavNode: "preceding-sibling::*[1]/@id"] else: - - t: "brak poprzedniego wiersza" # phrase('no previous row' in the table) + - T: "brak poprzedniego wiersza" # phrase('no previous row' in the table) - set_variables: [SpeakExpression: "'false'"] - name: move-cell-down @@ -801,7 +801,7 @@ - test: if: "$NavVerbosity = 'Verbose'" then: - - t: "przejdĆș do następnego wiersza" # phrase('move to next row' to the next row in the table) + - T: "przejdĆș do następnego wiersza" # phrase('move to next row' to the next row in the table) - pause: medium - test: if: "following-sibling::*" @@ -815,7 +815,7 @@ else: - set_variables: [NavNode: "following-sibling::*[1]/@id"] else: - - t: "brak następnego wiersza" # phrase('no next row' in the table) + - T: "brak następnego wiersza" # phrase('no next row' in the table) - set_variables: [SpeakExpression: "'false'"] - name: move-cell-previous @@ -826,9 +826,9 @@ - test: if: "$NavVerbosity = 'Verbose'" then: - - t: "przejdĆș do poprzedniej kolumny" # phrase('move to previous column' to the previous row in the table) + - T: "przejdĆș do poprzedniej kolumny" # phrase('move to previous column' to the previous row in the table) - pause: medium - - t: "brak poprzedniej kolumny" # phrase('no previous column' in the table) + - T: "brak poprzedniej kolumny" # phrase('no previous column' in the table) - set_variables: [SpeakExpression: "'false'"] - name: move-cell-next @@ -839,9 +839,9 @@ - test: if: "$NavVerbosity = 'Verbose'" then: - - t: "przejdĆș do następnej kolumny" # phrase('move up' to the previous row in the table) + - T: "przejdĆș do następnej kolumny" # phrase('move up' to the previous row in the table) - pause: medium - - t: "brak następnej kolumny" # phrase('no next row' in the table) + - T: "brak następnej kolumny" # phrase('no next row' in the table) - set_variables: [SpeakExpression: "'false'"] - name: default-read-cell @@ -857,7 +857,7 @@ - test: if: "$NavVerbosity = 'Verbose'" then: - - t: "czytaj bieĆŒÄ…cy element" # phrase('read current entry' in the table) + - T: "czytaj bieĆŒÄ…cy element" # phrase('read current entry' in the table) - pause: medium - test: if: "$NavVerbosity != 'Terse'" @@ -870,7 +870,7 @@ - pause: short - set_variables: [NavNode: "$MTD[1]/*[1]/@id"] else: - - t: "poza tabelą" # phrase('not in table' or matrix) + - T: "poza tabelą" # phrase('not in table' or matrix) - pause: long - set_variables: [SpeakExpression: "'false'"] @@ -1110,7 +1110,7 @@ then: - x: "ancestor::m:mtd[1]" # try again on an mtd node else: - - t: "poza tabelą" # phrase('not in table' or matrix) + - T: "poza tabelą" # phrase('not in table' or matrix) - pause: long - set_variables: [SpeakExpression: "'false'"] @@ -1187,7 +1187,7 @@ - test: if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" then: - - t: "nie moĆŒna przejƛć w prawo" # phrase('cannot move right') + - T: "nie moĆŒna przejƛć w prawo" # phrase('cannot move right') - pause: medium - with: variables: @@ -1208,14 +1208,14 @@ - test: if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" then: - - t: "nie moĆŒna" # phrase('cannot' move right in expression) + - T: "nie moĆŒna" # phrase('cannot' move right in expression) - test: - if: "$NavCommand = 'MoveNext'" - then: [t: "przejƛć"] # phrase('move' to next entry in table) + then: [T: "przejƛć"] # phrase('move' to next entry in table) - else_if: "$NavCommand = 'ReadNext'" - then: [t: "odczytać"] # phrase('read' next entry in table) - else: [t: "opisać"] # phrase('describe' next entry in table) - - t: "w prawo" # phrase(move 'right') + then: [T: "odczytać"] # phrase('read' next entry in table) + else: [T: "opisać"] # phrase('describe' next entry in table) + - T: "w prawo" # phrase(move 'right') - pause: short - T: "koniec matematyki" # phrase(move 'end of math') - pause: long @@ -1382,7 +1382,7 @@ - test: if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose' and $NavCommand = 'MovePrevious'" then: - - t: "nie moĆŒna przejƛć w lewo" # phrase('cannot move left' in expression) + - T: "nie moĆŒna przejƛć w lewo" # phrase('cannot move left' in expression) - pause: medium - with: variables: @@ -1399,7 +1399,7 @@ - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious') and" - "(self::m:math or name(EdgeNode(., 'left', 'math'))='math')" replace: - - t: "początek wyraĆŒenia matematycznego" # phrase('start of math') + - T: "początek wyraĆŒenia matematycznego" # phrase('start of math') - pause: long - set_variables: [SpeakExpression: "'false'"] @@ -1412,7 +1412,7 @@ - test: if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" then: - - t: "nie moĆŒna przejƛć w lewo" # phrase('cannot move left') + - T: "nie moĆŒna przejƛć w lewo" # phrase('cannot move left') - pause: short - with: variables: [Move2D: "'start of'", Child2D: "."] @@ -1573,16 +1573,16 @@ - test: - if: "$NavMode = 'Enhanced'" then: - - t: "znak" # phrase(a mathematical 'character') + - T: "znak" # phrase(a mathematical 'character') - set_variables: [NavMode: "'Character'", ReadZoomLevel: "1"] - else_if: "$NavMode = 'Character'" then: - - t: "prosty" # phrase(a 'simple' way to do something) + - T: "prosty" # phrase(a 'simple' way to do something) - set_variables: [NavMode: "'Simple'", ReadZoomLevel: "1"] - else: - - t: "rozszerzony" # phrase(an 'enhanced' way to do something) + - T: "rozszerzony" # phrase(an 'enhanced' way to do something) - set_variables: [NavMode: "'Enhanced'", ReadZoomLevel: "-1"] - - t: "tryb" # phrase(a simple 'mode' of use) + - T: "tryb" # phrase(a simple 'mode' of use) - pause: long - test: - if: "$NavMode != 'Enhanced'" # potentially need to zoom to the sibling @@ -1598,16 +1598,16 @@ - test: - if: "$NavMode = 'Enhanced'" then: - - t: "prosty" # phrase(an 'simple' way to do something) + - T: "prosty" # phrase(an 'simple' way to do something) - set_variables: [NavMode: "'Simple'", ReadZoomLevel: "1"] - else_if: "$NavMode = 'Character'" then: - - t: "rozszerzony" # phrase(an 'enhanced' way to do something) + - T: "rozszerzony" # phrase(an 'enhanced' way to do something) - set_variables: [NavMode: "'Enhanced'", ReadZoomLevel: "-1"] - else: - - t: "znak" # phrase(a mathematical 'character') + - T: "znak" # phrase(a mathematical 'character') - set_variables: [NavMode: "'Character'", ReadZoomLevel: "1"] - - t: "tryb" # phrase(a simple 'mode' of use) + - T: "tryb" # phrase(a simple 'mode' of use) - pause: long - test: - if: "$NavMode != 'Enhanced'" # potentially need to zoom to the sibling @@ -1623,7 +1623,7 @@ - test: if: "$Overview = 'true'" then: - - t: "czytaj wyraĆŒenie po ruchu" # phrase('speak expression after move') + - T: "czytaj wyraĆŒenie po ruchu" # phrase('speak expression after move') - pause: long - set_variables: [Overview: "'false'"] else: @@ -1640,9 +1640,9 @@ then: - test: - if: "$NavCommand = 'ReadCurrent'" - then: [t: "czytaj"] # phrase('read' next entry in table) - else: [t: "opisz"] # phrase('describe' next entry in table) - - t: "bieĆŒÄ…cy" # phrase('current' entry in table) + then: [T: "czytaj"] # phrase('read' next entry in table) + else: [T: "opisz"] # phrase('describe' next entry in table) + - T: "bieĆŒÄ…cy" # phrase('current' entry in table) - pause: long - set_variables: [NavNode: "@id"] @@ -1660,13 +1660,13 @@ then: - test: - if: "starts-with($NavCommand, 'Read')" - then: [t: "czytaj"] # phrase('read' next entry in table) + then: [T: "czytaj"] # phrase('read' next entry in table) - else_if: "starts-with($NavCommand, 'Describe')" - then: [t: "opisz"] # phrase('describe' next entry in table) + then: [T: "opisz"] # phrase('describe' next entry in table) - else_if: "starts-with($NavCommand, 'MoveTo')" - then: [t: "przejdĆș do"] # phrase('move to' the next entry in table) + then: [T: "przejdĆș do"] # phrase('move to' the next entry in table) else: [T: "zbiĂłr"] # phrase('set' the value of the next entry in table) - - t: "symbol zastępczy" # phrase('placeholder' for the value) + - T: "symbol zastępczy" # phrase('placeholder' for the value) - x: "$PlaceMarkerIndex" - pause: long - set_variables: [NavNode: "$PlaceMarker"] @@ -1678,7 +1678,7 @@ - test: if: "$NavVerbosity != 'Terse'" then: - - t: "ustaw symbol zastępczy" # phrase('set placeholder' to the value) + - T: "ustaw symbol zastępczy" # phrase('set placeholder' to the value) - x: "$PlaceMarkerIndex" - pause: long - set_variables: [NavNode: "@id"] @@ -1710,11 +1710,11 @@ - test: if: "$NavCommand = 'WhereAmI'" then: - - t: "wewnątrz niczego więcej" # phrase('inside of nothing more') + - T: "wewnątrz niczego więcej" # phrase('inside of nothing more') - pause: long - set_variables: [SpeakExpression: "'false'"] else: - - t: "wewnątrz" # phrase('inside' a big expression) + - T: "wewnątrz" # phrase('inside' a big expression) - pause: medium - set_variables: [NavNode: "@id"] @@ -1722,7 +1722,7 @@ tag: "*" match: "$NavCommand = 'WhereAmI' or $NavCommand = 'WhereAmIAll'" replace: - - t: "wewnątrz" # phrase('inside' a big expression) + - T: "wewnątrz" # phrase('inside' a big expression) - pause: medium - test: - if: "$NavMode='Enhanced' and parent::*[self::m:mrow and (IsBracketed(., '(', ')', false) or IsBracketed(., '[', ']', false))]" diff --git a/Rules/Languages/pl/overview.yaml b/Rules/Languages/pl/overview.yaml index a65395889..a51169bb3 100644 --- a/Rules/Languages/pl/overview.yaml +++ b/Rules/Languages/pl/overview.yaml @@ -21,22 +21,22 @@ if: "IsNode(*[1], 'simple') and IsNode(*[2], 'simple')" then: - x: "*[1]" - - t: "przez" + - T: "przez" - x: "*[2]" else: - - t: "uƂamek" + - T: "uƂamek" - name: overview-default tag: [msqrt, "square-root"] match: "." replace: - - t: "pierwiastek kwadratowy" + - T: "pierwiastek kwadratowy" - test: if: "IsNode(*[1], 'simple')" then: - test: if: "$Verbosity!='Terse'" - then: [t: "z"] + then: [T: "z"] - x: "*[1]" - name: overview-default @@ -47,24 +47,24 @@ if: "*[2][self::m:mn]" then_test: - if: "*[2][.='2']" - then: [t: "pierwiastek kwadratowy"] + then: [T: "pierwiastek kwadratowy"] - else_if: "*[2][.='3']" - then: [t: "pierwiastek szeƛcienny"] + then: [T: "pierwiastek szeƛcienny"] - else_if: "*[2][not(contains(., '.'))]" - then: [x: "ToOrdinal(*[2])", t: "pierwiastek"] + then: [x: "ToOrdinal(*[2])", T: "pierwiastek"] else: - test: if: "*[2][self::m:mi][string-length(.)=1]" then: - x: "*[2]" else: {x: "*[2]"} - - t: "pierwiastek" + - T: "pierwiastek" - test: if: "IsNode(*[1], 'simple')" then: - test: if: "$Verbosity!='Terse'" - then: [t: "z"] + then: [T: "z"] - x: "*[1]" - name: matrix-override @@ -75,12 +75,12 @@ replace: - t: "" - x: count(*[2]/*) - - t: "na" + - T: "na" - x: count(*[2]/*[self::m:mtr][1]/*) - test: if: "*[1][.='|']" # just need to check the first bracket since we know it must be (, [, or | - then: [t: "wyznacznik"] - else: [t: "macierz"] + then: [T: "wyznacznik"] + else: [T: "macierz"] - name: overview-default tag: mtable @@ -88,9 +88,9 @@ replace: - t: "" - x: count(*[2]/*) - - t: "na" + - T: "na" - x: count(*[2]/*[self::m:mtr][1]/*) - - t: "tabela" + - T: "tabela" - name: short-mrow tag: mrow @@ -114,6 +114,6 @@ - pause: auto - x: "*[5]" - pause: auto - - t: "i tak dalej" + - T: "i tak dalej" - include: "SimpleSpeak_Rules.yaml" diff --git a/Rules/Languages/pl/unicode-full.yaml b/Rules/Languages/pl/unicode-full.yaml index 8246f4650..3c378bc8c 100644 --- a/Rules/Languages/pl/unicode-full.yaml +++ b/Rules/Languages/pl/unicode-full.yaml @@ -1,28 +1,28 @@ --- - - "Âą": [t: "centy"] # 0xa2 - - "ÂŁ": [t: "funty"] # 0xa3 - - "€": [t: "znak waluty"] # 0xa4 - - "„": [t: "jen"] # 0xa5 - - "Š": [t: "przerwana kreska"] # 0xa6 - - "§": [t: "paragraf"] # 0xa7 - - "š": [t: "diereza"] # 0xa8 - - "©": [t: "znak praw autorskich"] # 0xa9 - - "ÂȘ": [t: "ĆŒeƄski wskaĆșnik liczebnika porządkowego"] # 0xaa + - "Âą": [T: "centy"] # 0xa2 + - "ÂŁ": [T: "funty"] # 0xa3 + - "€": [T: "znak waluty"] # 0xa4 + - "„": [T: "jen"] # 0xa5 + - "Š": [T: "przerwana kreska"] # 0xa6 + - "§": [T: "paragraf"] # 0xa7 + - "š": [T: "diereza"] # 0xa8 + - "©": [T: "znak praw autorskich"] # 0xa9 + - "ÂȘ": [T: "ĆŒeƄski wskaĆșnik liczebnika porządkowego"] # 0xaa - "ÂŹ": [T: "nie"] # 0xac - - "«": [t: "lewy podwĂłjny cudzysƂów ostrokątny"] # 0xab + - "«": [T: "lewy podwĂłjny cudzysƂów ostrokątny"] # 0xab - "ÂŻ": # 0xaf - test: if: "ancestor::m:modified-variable and preceding-sibling::*[1][self::m:mi]" - then: [t: "kreska"] - else: [t: "linia"] - - "ÂČ": [t: "dwa"] # 0xb2 - - "Âł": [t: "trzy"] # 0xb3 - - "ÂŽ": [t: "akut"] # 0xb4 - - "”": [t: "mikro"] # 0xb5 - - "Âč": [t: "jeden"] # 0xb9 - - "Âș": [t: "męski wskaĆșnik liczebnika porządkowego"] # 0xb9 + then: [T: "kreska"] + else: [T: "linia"] + - "ÂČ": [T: "dwa"] # 0xb2 + - "Âł": [T: "trzy"] # 0xb3 + - "ÂŽ": [T: "akut"] # 0xb4 + - "”": [T: "mikro"] # 0xb5 + - "Âč": [T: "jeden"] # 0xb9 + - "Âș": [T: "męski wskaĆșnik liczebnika porządkowego"] # 0xb9 - "·": - test: if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolDot = 'Auto'" @@ -35,162 +35,162 @@ else_test: if: $ClearSpeak_MultSymbolX = 'By' then: [T: "na"] - else: [t: "krzyĆŒ"] + else: [T: "krzyĆŒ"] - "Ă·": [T: "podzielone przez"] # 0xf7 - - "ÂĄ": [t: "odwrĂłcony wykrzyknik"] # 0xa1 - - "¶": [t: "znak akapitu"] # 0xb6 - - "Âż": [t: "odwrĂłcony znak zapytania"] # 0xbf - - - "ʰ": [t: "modyfikator maƂy h"] # 0x2b0 - - "ʱ": [t: "modyfikator maƂy h z haczykiem"] # 0x2b1 - - "ÊČ": [t: "modyfikator maƂy j"] # 0x2b2 - - "Êł": [t: "modyfikator maƂy R"] # 0x2b3 - - "ÊŽ": [t: "modyfikator maƂy odwrĂłcony R"] # 0x2b4 - - "Ê”": [t: "modyfikator maƂy odwrĂłcony R z haczykiem"] # 0x2b5 + - "ÂĄ": [T: "odwrĂłcony wykrzyknik"] # 0xa1 + - "¶": [T: "znak akapitu"] # 0xb6 + - "Âż": [T: "odwrĂłcony znak zapytania"] # 0xbf + + - "ʰ": [T: "modyfikator maƂy h"] # 0x2b0 + - "ʱ": [T: "modyfikator maƂy h z haczykiem"] # 0x2b1 + - "ÊČ": [T: "modyfikator maƂy j"] # 0x2b2 + - "Êł": [T: "modyfikator maƂy R"] # 0x2b3 + - "ÊŽ": [T: "modyfikator maƂy odwrĂłcony R"] # 0x2b4 + - "Ê”": [T: "modyfikator maƂy odwrĂłcony R z haczykiem"] # 0x2b5 - "ʶ": # 0x2b6 - - t: "modyfikator maƂy odwrĂłcony" + - T: "modyfikator maƂy odwrĂłcony" - spell: "translate('R', 'R', 'R')" - - "Ê·": [t: "modyfikator maƂy w"] # 0x2b7 - - "Êž": [t: "modyfikator maƂy y"] # 0x2b8 - - "Êč": [t: "modyfikator prim"] # 0x2b9 - - "Êș": [t: "modyfikator podwĂłjny prim"] # 0x2ba - - "Ê»": [t: "modyfikator odwrĂłcony przecinek"] # 0x2bb - - "ÊŒ": [t: "modyfikator apostrof"] # 0x2bc - - "Êœ": [t: "modyfikator odwrĂłcony przecinek"] # 0x2bd - - "ÊŸ": [t: "modyfikator prawa poƂowa pierƛcieƄ"] # 0x2be - - "Êż": [t: "modyfikator lewa poƂowa pierƛcieƄ"] # 0x2bf - - "ˀ": [t: "modyfikator zwarcie krtaniowe"] # 0x2c0 - - "ˁ": [t: "modyfikator odwrĂłcone zwarcie krtaniowe"] # 0x2c1 - - "˂": [t: "modyfikator lewy grot strzaƂki"] # 0x2c2 - - "˃": [t: "modyfikator prawy grot strzaƂki"] # 0x2c3 - - "˄": [t: "modyfikator gĂłrny grot strzaƂki"] # 0x2c4 - - "˅": [t: "modyfikator dolny grot strzaƂki"] # 0x2c5 - - "ˆ": [t: "modyfikator akcent daszkowy"] # 0x2c6 - - "ˇ": [t: "haczek"] # 0x2c7 - - "ˈ": [t: "modyfikator pionowej kreski"] # 0x2c8 - - "ˉ": [t: "modyfikator makron"] # 0x2c9 - - "ˊ": [t: "modyfikator akut akcent"] # 0x2ca - - "ˋ": [t: "modyfikator grawis akcent"] # 0x2cb - - "ˌ": [t: "modyfikator dolnej pionowej kreski"] # 0x2cc - - "ˍ": [t: "modyfikator dolny makron"] # 0x2cd - - "ˎ": [t: "modyfikator dolny akcent grawis"] # 0x2ce - - "ˏ": [t: "modyfikator dolny akcent akut"] # 0x2cf - - "ː": [t: "modyfikator trĂłjkątny dwukropek"] # 0x2d0 - - "ˑ": [t: "modyfikator poƂowa trĂłjkątny dwukropek"] # 0x2d1 - - "˒": [t: "modyfikator wyƛrodkowany prawa poƂowa pierƛcieƄ"] # 0x2d2 - - "˓": [t: "modyfikator wyƛrodkowany lewa poƂowa pierƛcieƄ"] # 0x2d3 - - "˔": [t: "modyfikator gĂłrnej pinezki"] # 0x2d4 - - "˕": [t: "modyfikator dolnej pinezki"] # 0x2d5 - - "˖": [t: "modyfikator znaku plus"] # 0x2d6 - - "˗": [t: "modyfikator znaku minus"] # 0x2d7 - - "˘": [t: "znak krĂłtkoƛci"] # 0x2d8 + - "Ê·": [T: "modyfikator maƂy w"] # 0x2b7 + - "Êž": [T: "modyfikator maƂy y"] # 0x2b8 + - "Êč": [T: "modyfikator prim"] # 0x2b9 + - "Êș": [T: "modyfikator podwĂłjny prim"] # 0x2ba + - "Ê»": [T: "modyfikator odwrĂłcony przecinek"] # 0x2bb + - "ÊŒ": [T: "modyfikator apostrof"] # 0x2bc + - "Êœ": [T: "modyfikator odwrĂłcony przecinek"] # 0x2bd + - "ÊŸ": [T: "modyfikator prawa poƂowa pierƛcieƄ"] # 0x2be + - "Êż": [T: "modyfikator lewa poƂowa pierƛcieƄ"] # 0x2bf + - "ˀ": [T: "modyfikator zwarcie krtaniowe"] # 0x2c0 + - "ˁ": [T: "modyfikator odwrĂłcone zwarcie krtaniowe"] # 0x2c1 + - "˂": [T: "modyfikator lewy grot strzaƂki"] # 0x2c2 + - "˃": [T: "modyfikator prawy grot strzaƂki"] # 0x2c3 + - "˄": [T: "modyfikator gĂłrny grot strzaƂki"] # 0x2c4 + - "˅": [T: "modyfikator dolny grot strzaƂki"] # 0x2c5 + - "ˆ": [T: "modyfikator akcent daszkowy"] # 0x2c6 + - "ˇ": [T: "haczek"] # 0x2c7 + - "ˈ": [T: "modyfikator pionowej kreski"] # 0x2c8 + - "ˉ": [T: "modyfikator makron"] # 0x2c9 + - "ˊ": [T: "modyfikator akut akcent"] # 0x2ca + - "ˋ": [T: "modyfikator grawis akcent"] # 0x2cb + - "ˌ": [T: "modyfikator dolnej pionowej kreski"] # 0x2cc + - "ˍ": [T: "modyfikator dolny makron"] # 0x2cd + - "ˎ": [T: "modyfikator dolny akcent grawis"] # 0x2ce + - "ˏ": [T: "modyfikator dolny akcent akut"] # 0x2cf + - "ː": [T: "modyfikator trĂłjkątny dwukropek"] # 0x2d0 + - "ˑ": [T: "modyfikator poƂowa trĂłjkątny dwukropek"] # 0x2d1 + - "˒": [T: "modyfikator wyƛrodkowany prawa poƂowa pierƛcieƄ"] # 0x2d2 + - "˓": [T: "modyfikator wyƛrodkowany lewa poƂowa pierƛcieƄ"] # 0x2d3 + - "˔": [T: "modyfikator gĂłrnej pinezki"] # 0x2d4 + - "˕": [T: "modyfikator dolnej pinezki"] # 0x2d5 + - "˖": [T: "modyfikator znaku plus"] # 0x2d6 + - "˗": [T: "modyfikator znaku minus"] # 0x2d7 + - "˘": [T: "znak krĂłtkoƛci"] # 0x2d8 - "˙": [T: "kropka"] # 0x2d9 - - "˚": [t: "pierƛcieƄ nad"] # 0x2da + - "˚": [T: "pierƛcieƄ nad"] # 0x2da - "˛": [t: "ogonek"] # 0x2db - - "˜": [t: "maƂy tylda"] # 0x2dc - - "˝": [t: "podwĂłjny akut akcent"] # 0x2dd - - "˞": [t: "modyfikator rotycznego haczyka"] # 0x2de - - "˟": [t: "modyfikator krzyĆŒ akcent"] # 0x2df - - "Ë ": [t: "modyfikator maƂy gamma"] # 0x2e0 - - "ËĄ": [t: "modyfikator maƂy L"] # 0x2e1 - - "Ëą": [t: "modyfikator maƂy s"] # 0x2e2 - - "ËŁ": [t: "modyfikator maƂy X"] # 0x2e3 - - "Ë€": [t: "modyfikator maƂy odwrĂłcone zwarcie krtaniowe"] # 0x2e4 - - "Ë„": [t: "modyfikator kreski bardzo wysokiego tonu"] # 0x2e5 - - "ËŠ": [t: "modyfikator kreski wysokiego tonu"] # 0x2e6 - - "˧": [t: "modyfikator ƛrodkowy tonowy kreska"] # 0x2e7 - - "Ëš": [t: "modyfikator kreski niskiego tonu"] # 0x2e8 - - "Ë©": [t: "modyfikator kreski bardzo niskiego tonu"] # 0x2e9 - - "ËȘ": [t: "modyfikator znak tonu yin odchodzącego"] # 0x2ea - - "Ë«": [t: "modyfikator znak tonu yang odchodzącego"] # 0x2eb - - "ËŹ": [t: "modyfikator dĆșwięcznoƛć"] # 0x2ec - - "Ë­": [t: "modyfikator nieaspirowany"] # 0x2ed - - "Ëź": [t: "modyfikator podwĂłjny apostrof"] # 0x2ee - - "ËŻ": [t: "modyfikator dolny grot strzaƂki"] # 0x2ef - - "˰": [t: "modyfikator dolny gĂłrny grot strzaƂki"] # 0x2f0 - - "˱": [t: "modyfikator dolny lewy grot strzaƂki"] # 0x2f1 - - "ËČ": [t: "modyfikator dolny prawy grot strzaƂki"] # 0x2f2 - - "Ëł": [t: "modyfikator dolny pierƛcieƄ"] # 0x2f3 - - "ËŽ": [t: "modyfikator ƛrodkowy grawis akcent"] # 0x2f4 - - "Ë”": [t: "modyfikator ƛrodkowy podwĂłjny grawis akcent"] # 0x2f5 - - "˶": [t: "modyfikator ƛrodkowy podwĂłjny akut akcent"] # 0x2f6 - - "Ë·": [t: "modyfikator dolna tylda"] # 0x2f7 - - "Ëž": [t: "modyfikator podniesiony dwukropek"] # 0x2f8 - - "Ëč": [t: "modyfikator początek wysoki ton"] # 0x2f9 - - "Ëș": [t: "modyfikator koniec wysoki ton"] # 0x2fa - - "Ë»": [t: "modyfikator początek niski ton"] # 0x2fb - - "ËŒ": [t: "modyfikator koniec niski ton"] # 0x2fc - - "Ëœ": [t: "modyfikator póƂka"] # 0x2fd - - "ËŸ": [t: "modyfikator otwĂłrz póƂka"] # 0x2fe - - "Ëż": [t: "modyfikator dolny strzaƂka w lewo"] # 0x2ff - - "̀": [t: "ozdobnik akcentu grawis"] # 0x300 - - "́": [t: "ozdobnik akcentu ostrego"] # 0x301 - - "̂": [t: "ozdobnik daszka"] # 0x302 - - "̃": [t: "ozdobnik tyldy"] # 0x303 - - "̄": [t: "ozdobnik makronu"] # 0x304 - - "̅": [t: "ozdobnik kreski gĂłrnej"] # 0x305 - - "̆": [t: "ozdobnik znaku krĂłtkoƛci"] # 0x306 - - "̇": [t: "ozdobnik kropki nad"] # 0x307 - - "̈": [t: "ozdobnik diaerezy"] # 0x308 - - "̉": [t: "hak nad ozdobnik"] # 0x309 - - "̊": [t: "pierƛcieƄ nad ozdobnik"] # 0x30a - - "̋": [t: "ozdobnik podwĂłjnego akutu"] # 0x30b - - "̌": [t: "haczek"] # 0x30c - - "̍": [t: "ozdobnik pionowej kreski nad"] # 0x30d - - "̎": [t: "ozdobnik podwĂłjnej pionowej kreski nad"] # 0x30e - - "̏": [t: "ozdobnik podwĂłjnego grawisu"] # 0x30f - - "̐": [t: "ozdobnik ćandrabindu"] # 0x310 - - "̑": [t: "odwrĂłcony ozdobnik znaku krĂłtkoƛci"] # 0x311 - - "̒": [t: "odwrĂłcony przecinek nad ozdobnik"] # 0x312 - - "̓": [t: "przecinek nad ozdobnik"] # 0x313 - - "̔": [t: "odwrĂłcony przecinek nad ozdobnik"] # 0x314 - - "̕": [t: "przecinek nad prawy ozdobnik"] # 0x315 - - "̖": [t: "ozdobnik akcentu grawis pod"] # 0x316 - - "̗": [t: "ozdobnik akcentu ostrego pod"] # 0x317 - - "̘": [t: "ozdobnik lewej pinezki pod spodem"] # 0x318 - - "̙": [t: "ozdobnik prawej pinezki pod spodem"] # 0x319 - - "̚": [t: "lewy kąt nad ozdobnik"] # 0x31a - - "̛": [t: "ozdobnik roĆŒka"] # 0x31b - - "̜": [t: "lewa poƂowa pierƛcieƄ pod ozdobnik"] # 0x31c - - "̝": [t: "ozdobnik gĂłrnej pinezki pod spodem"] # 0x31d - - "̞": [t: "ozdobnik dolnej pinezki pod spodem"] # 0x31e - - "̟": [t: "ozdobnik znaku plus pod spodem"] # 0x31f - - "Ì ": [t: "ozdobnik znaku minus pod spodem"] # 0x320 - - "ÌĄ": [t: "palatalizowany haczyk pod spodem"] # 0x321 - - "Ìą": [t: "retrofleksyjny haczyk pod spodem"] # 0x322 - - "ÌŁ": [t: "ozdobnik kropki pod"] # 0x323 - - "Ì€": [t: "ozdobnik dierezy pod spodem"] # 0x324 - - "Ì„": [t: "pierƛcieƄ pod ozdobnik"] # 0x325 - - "ÌŠ": [t: "przecinek pod ozdobnik"] # 0x326 - - "̧": [t: "ozdobnik cedilli"] # 0x327 - - "Ìš": [t: "ogonek ozdobnik"] # 0x328 - - "Ì©": [t: "ozdobnik pionowej kreski pod spodem"] # 0x329 - - "ÌȘ": [t: "mostek pod ozdobnik"] # 0x32a - - "Ì«": [t: "odwrĂłcony podwĂłjny Ƃuk pod spodem"] # 0x32b - - "ÌŹ": [t: "haczek pod ozdobnik"] # 0x32c - - "Ì­": [t: "ozdobnik daszka pod"] # 0x32d - - "Ìź": [t: "ozdobnik znaku krĂłtkoƛci pod spodem"] # 0x32e - - "ÌŻ": [t: "odwrĂłcony ozdobnik znaku krĂłtkoƛci pod spodem"] # 0x32f - - "̰": [t: "tylda pod ozdobnik"] # 0x330 - - "̱": [t: "ozdobnik makronu pod"] # 0x331 - - "ÌČ": [t: "dolny linia ozdobnik"] # 0x332 - - "Ìł": [t: "podwĂłjny dolny linia ozdobnik"] # 0x333 - - "ÌŽ": [t: "tylda nakƂadka ozdobnik"] # 0x334 - - "Ì”": [t: "krĂłtkie przekreƛlenie nakƂadane jako ozdobnik"] # 0x335 - - "̶": [t: "dƂugie przekreƛlenie nakƂadane jako ozdobnik"] # 0x336 - - "Ì·": [t: "krĂłtki ukoƛnik nakƂadka ozdobnik"] # 0x337 - - "Ìž": [t: "dƂugi ukoƛnik nakƂadka ozdobnik"] # 0x338 - - "Ìč": [t: "prawa poƂowa pierƛcieƄ pod ozdobnik"] # 0x339 - - "Ìș": [t: "odwrĂłcony mostek pod ozdobnik"] # 0x33a - - "Ì»": [t: "kwadrat pod ozdobnik"] # 0x33b - - "ÌŒ": [t: "ozdobnik mewy pod spodem"] # 0x33c - - "Ìœ": [t: "X nad ozdobnik"] # 0x33d - - "ÌŸ": [t: "pionowy ozdobnik tyldy"] # 0x33e - - "Ìż": [t: "ozdobnik podwĂłjnej kreski gĂłrnej"] # 0x33f - - "̀": [t: "grawis tonowy znak ozdobnik"] # 0x340 - - "́": [t: "akut tonowy znak ozdobnik"] # 0x341 - - "͆": [t: "mostek nad"] # 0x346 + - "˜": [T: "maƂy tylda"] # 0x2dc + - "˝": [T: "podwĂłjny akut akcent"] # 0x2dd + - "˞": [T: "modyfikator rotycznego haczyka"] # 0x2de + - "˟": [T: "modyfikator krzyĆŒ akcent"] # 0x2df + - "Ë ": [T: "modyfikator maƂy gamma"] # 0x2e0 + - "ËĄ": [T: "modyfikator maƂy L"] # 0x2e1 + - "Ëą": [T: "modyfikator maƂy s"] # 0x2e2 + - "ËŁ": [T: "modyfikator maƂy X"] # 0x2e3 + - "Ë€": [T: "modyfikator maƂy odwrĂłcone zwarcie krtaniowe"] # 0x2e4 + - "Ë„": [T: "modyfikator kreski bardzo wysokiego tonu"] # 0x2e5 + - "ËŠ": [T: "modyfikator kreski wysokiego tonu"] # 0x2e6 + - "˧": [T: "modyfikator ƛrodkowy tonowy kreska"] # 0x2e7 + - "Ëš": [T: "modyfikator kreski niskiego tonu"] # 0x2e8 + - "Ë©": [T: "modyfikator kreski bardzo niskiego tonu"] # 0x2e9 + - "ËȘ": [T: "modyfikator znak tonu yin odchodzącego"] # 0x2ea + - "Ë«": [T: "modyfikator znak tonu yang odchodzącego"] # 0x2eb + - "ËŹ": [T: "modyfikator dĆșwięcznoƛć"] # 0x2ec + - "Ë­": [T: "modyfikator nieaspirowany"] # 0x2ed + - "Ëź": [T: "modyfikator podwĂłjny apostrof"] # 0x2ee + - "ËŻ": [T: "modyfikator dolny grot strzaƂki"] # 0x2ef + - "˰": [T: "modyfikator dolny gĂłrny grot strzaƂki"] # 0x2f0 + - "˱": [T: "modyfikator dolny lewy grot strzaƂki"] # 0x2f1 + - "ËČ": [T: "modyfikator dolny prawy grot strzaƂki"] # 0x2f2 + - "Ëł": [T: "modyfikator dolny pierƛcieƄ"] # 0x2f3 + - "ËŽ": [T: "modyfikator ƛrodkowy grawis akcent"] # 0x2f4 + - "Ë”": [T: "modyfikator ƛrodkowy podwĂłjny grawis akcent"] # 0x2f5 + - "˶": [T: "modyfikator ƛrodkowy podwĂłjny akut akcent"] # 0x2f6 + - "Ë·": [T: "modyfikator dolna tylda"] # 0x2f7 + - "Ëž": [T: "modyfikator podniesiony dwukropek"] # 0x2f8 + - "Ëč": [T: "modyfikator początek wysoki ton"] # 0x2f9 + - "Ëș": [T: "modyfikator koniec wysoki ton"] # 0x2fa + - "Ë»": [T: "modyfikator początek niski ton"] # 0x2fb + - "ËŒ": [T: "modyfikator koniec niski ton"] # 0x2fc + - "Ëœ": [T: "modyfikator póƂka"] # 0x2fd + - "ËŸ": [T: "modyfikator otwĂłrz póƂka"] # 0x2fe + - "Ëż": [T: "modyfikator dolny strzaƂka w lewo"] # 0x2ff + - "̀": [T: "ozdobnik akcentu grawis"] # 0x300 + - "́": [T: "ozdobnik akcentu ostrego"] # 0x301 + - "̂": [T: "ozdobnik daszka"] # 0x302 + - "̃": [T: "ozdobnik tyldy"] # 0x303 + - "̄": [T: "ozdobnik makronu"] # 0x304 + - "̅": [T: "ozdobnik kreski gĂłrnej"] # 0x305 + - "̆": [T: "ozdobnik znaku krĂłtkoƛci"] # 0x306 + - "̇": [T: "ozdobnik kropki nad"] # 0x307 + - "̈": [T: "ozdobnik diaerezy"] # 0x308 + - "̉": [T: "hak nad ozdobnik"] # 0x309 + - "̊": [T: "pierƛcieƄ nad ozdobnik"] # 0x30a + - "̋": [T: "ozdobnik podwĂłjnego akutu"] # 0x30b + - "̌": [T: "haczek"] # 0x30c + - "̍": [T: "ozdobnik pionowej kreski nad"] # 0x30d + - "̎": [T: "ozdobnik podwĂłjnej pionowej kreski nad"] # 0x30e + - "̏": [T: "ozdobnik podwĂłjnego grawisu"] # 0x30f + - "̐": [T: "ozdobnik ćandrabindu"] # 0x310 + - "̑": [T: "odwrĂłcony ozdobnik znaku krĂłtkoƛci"] # 0x311 + - "̒": [T: "odwrĂłcony przecinek nad ozdobnik"] # 0x312 + - "̓": [T: "przecinek nad ozdobnik"] # 0x313 + - "̔": [T: "odwrĂłcony przecinek nad ozdobnik"] # 0x314 + - "̕": [T: "przecinek nad prawy ozdobnik"] # 0x315 + - "̖": [T: "ozdobnik akcentu grawis pod"] # 0x316 + - "̗": [T: "ozdobnik akcentu ostrego pod"] # 0x317 + - "̘": [T: "ozdobnik lewej pinezki pod spodem"] # 0x318 + - "̙": [T: "ozdobnik prawej pinezki pod spodem"] # 0x319 + - "̚": [T: "lewy kąt nad ozdobnik"] # 0x31a + - "̛": [T: "ozdobnik roĆŒka"] # 0x31b + - "̜": [T: "lewa poƂowa pierƛcieƄ pod ozdobnik"] # 0x31c + - "̝": [T: "ozdobnik gĂłrnej pinezki pod spodem"] # 0x31d + - "̞": [T: "ozdobnik dolnej pinezki pod spodem"] # 0x31e + - "̟": [T: "ozdobnik znaku plus pod spodem"] # 0x31f + - "Ì ": [T: "ozdobnik znaku minus pod spodem"] # 0x320 + - "ÌĄ": [T: "palatalizowany haczyk pod spodem"] # 0x321 + - "Ìą": [T: "retrofleksyjny haczyk pod spodem"] # 0x322 + - "ÌŁ": [T: "ozdobnik kropki pod"] # 0x323 + - "Ì€": [T: "ozdobnik dierezy pod spodem"] # 0x324 + - "Ì„": [T: "pierƛcieƄ pod ozdobnik"] # 0x325 + - "ÌŠ": [T: "przecinek pod ozdobnik"] # 0x326 + - "̧": [T: "ozdobnik cedilli"] # 0x327 + - "Ìš": [T: "ogonek ozdobnik"] # 0x328 + - "Ì©": [T: "ozdobnik pionowej kreski pod spodem"] # 0x329 + - "ÌȘ": [T: "mostek pod ozdobnik"] # 0x32a + - "Ì«": [T: "odwrĂłcony podwĂłjny Ƃuk pod spodem"] # 0x32b + - "ÌŹ": [T: "haczek pod ozdobnik"] # 0x32c + - "Ì­": [T: "ozdobnik daszka pod"] # 0x32d + - "Ìź": [T: "ozdobnik znaku krĂłtkoƛci pod spodem"] # 0x32e + - "ÌŻ": [T: "odwrĂłcony ozdobnik znaku krĂłtkoƛci pod spodem"] # 0x32f + - "̰": [T: "tylda pod ozdobnik"] # 0x330 + - "̱": [T: "ozdobnik makronu pod"] # 0x331 + - "ÌČ": [T: "dolny linia ozdobnik"] # 0x332 + - "Ìł": [T: "podwĂłjny dolny linia ozdobnik"] # 0x333 + - "ÌŽ": [T: "tylda nakƂadka ozdobnik"] # 0x334 + - "Ì”": [T: "krĂłtkie przekreƛlenie nakƂadane jako ozdobnik"] # 0x335 + - "̶": [T: "dƂugie przekreƛlenie nakƂadane jako ozdobnik"] # 0x336 + - "Ì·": [T: "krĂłtki ukoƛnik nakƂadka ozdobnik"] # 0x337 + - "Ìž": [T: "dƂugi ukoƛnik nakƂadka ozdobnik"] # 0x338 + - "Ìč": [T: "prawa poƂowa pierƛcieƄ pod ozdobnik"] # 0x339 + - "Ìș": [T: "odwrĂłcony mostek pod ozdobnik"] # 0x33a + - "Ì»": [T: "kwadrat pod ozdobnik"] # 0x33b + - "ÌŒ": [T: "ozdobnik mewy pod spodem"] # 0x33c + - "Ìœ": [T: "X nad ozdobnik"] # 0x33d + - "ÌŸ": [T: "pionowy ozdobnik tyldy"] # 0x33e + - "Ìż": [T: "ozdobnik podwĂłjnej kreski gĂłrnej"] # 0x33f + - "̀": [T: "grawis tonowy znak ozdobnik"] # 0x340 + - "́": [T: "akut tonowy znak ozdobnik"] # 0x341 + - "͆": [T: "mostek nad"] # 0x346 - "ÎȘΫϏ": # 0x3aa, 0x3ab, 0x3cf - test: @@ -205,29 +205,29 @@ if: "$SpeechOverrides_CapitalLetters = ''" then_test: if: "$Impairment = 'Blindness'" - then: [t: "wielka"] + then: [T: "wielka"] else: [x: "$SpeechOverrides_CapitalLetters"] - pitch: value: "$CapitalLetters_Pitch" replace: [spell: "translate('.', 'ÎȘΫϏ', 'Îčυϗ')"] - - t: "z dialityką" - - "ϊ": [t: "jota z dialityką"] # 0x3ca - - "ϋ": [t: "ypsilon z dialityką"] # 0x3cb - - "ό": [t: "omikron z tonosem"] # 0x3cc - - "ύ": [t: "ypsilon z tonosem"] # 0x3cd - - "ώ": [t: "omega z tonosem"] # 0x3ce + - T: "z dialityką" + - "ϊ": [T: "jota z dialityką"] # 0x3ca + - "ϋ": [T: "ypsilon z dialityką"] # 0x3cb + - "ό": [T: "omikron z tonosem"] # 0x3cc + - "ύ": [T: "ypsilon z tonosem"] # 0x3cd + - "ώ": [T: "omega z tonosem"] # 0x3ce - "ϐ": [t: "beta"] # 0x3d0 - "ϑ": [t: "theta"] # 0x3d1 - - "ϒ": [t: "ypsilon z haczykiem"] # 0x3d2 - - "ϓ": [t: "ypsilon z akutem i haczykiem"] # 0x3d3 - - "ϔ": [t: "ypsilon z dierezą i haczykiem"] # 0x3d4 - - "ϕ": [t: "fi"] # 0x3d5 + - "ϒ": [T: "ypsilon z haczykiem"] # 0x3d2 + - "ϓ": [T: "ypsilon z akutem i haczykiem"] # 0x3d3 + - "ϔ": [T: "ypsilon z dierezą i haczykiem"] # 0x3d4 + - "ϕ": [T: "fi"] # 0x3d5 - "ϖ": [t: "pi"] # 0x3d6 - "ϗ": [t: "kai"] # 0x3d7 - - "Ϙ": [t: "wielka archaiczna koppa"] # 0x3d8 - - "ϙ": [t: "archaiczna koppa"] # 0x3d9 + - "Ϙ": [T: "wielka archaiczna koppa"] # 0x3d8 + - "ϙ": [T: "archaiczna koppa"] # 0x3d9 - "Ï”": [t: "epsilon"] # 0x3f5 - - "϶": [t: "odwrĂłcony epsilon"] # 0x3f6 + - "϶": [T: "odwrĂłcony epsilon"] # 0x3f6 - "А-ĐŻ": # 0x410 - 0x42f - test: if: "$CapitalLetters_Beep" @@ -241,23 +241,23 @@ if: "$SpeechOverrides_CapitalLetters = ''" then_test: if: "$Impairment = 'Blindness'" - then: [t: "wielka"] + then: [T: "wielka"] else: [x: "$SpeechOverrides_CapitalLetters"] - pitch: value: "$CapitalLetters_Pitch" replace: [spell: "translate('.', 'ĐĐ‘Đ’Đ“Đ”Đ•Đ–Đ—Đ˜Đ™ĐšĐ›ĐœĐĐžĐŸĐ ĐĄĐąĐŁĐ€Đ„ĐŠĐ§ĐšĐ©ĐȘЫЏЭПЯ', 'абĐČгЎДжзОĐčĐșĐ»ĐŒĐœĐŸĐżŃ€ŃŃ‚ŃƒŃ„Ń…Ń†Ń‡ŃˆŃ‰ŃŠŃ‹ŃŒŃŃŽŃ')"] - "а": [T: "a"] # 0x430 - "б": [t: "be"] # 0x431 - - "ĐČ": [t: "we"] # 0x432 - - "Đł": [t: "ge"] # 0x433 + - "ĐČ": [T: "we"] # 0x432 + - "Đł": [T: "ge"] # 0x433 - "ĐŽ": [t: "de"] # 0x434 - - "Đ”": [t: "je"] # 0x435 - - "ж": [t: "ĆŒe"] # 0x436 + - "Đ”": [T: "je"] # 0x435 + - "ж": [T: "ĆŒe"] # 0x436 - "Đ·": [t: "ze"] # 0x437 - "Đž": [t: "i"] # 0x438 - - "Đč": [t: "krĂłtkie i"] # 0x439 + - "Đč": [T: "krĂłtkie i"] # 0x439 - "Đș": [t: "ka"] # 0x43a - - "Đ»": [t: "eƂ"] # 0x43b + - "Đ»": [T: "eƂ"] # 0x43b - "ĐŒ": [t: "em"] # 0x43c - "Đœ": [t: "en"] # 0x43d - "ĐŸ": [t: "o"] # 0x43e @@ -267,29 +267,29 @@ - "т": [t: "te"] # 0x442 - "у": [t: "u"] # 0x443 - "ф": [t: "ef"] # 0x444 - - "х": [t: "cha"] # 0x445 - - "ц": [t: "ce"] # 0x446 - - "ч": [t: "cze"] # 0x447 - - "ш": [t: "sza"] # 0x448 - - "щ": [t: "szcza"] # 0x449 - - "ъ": [t: "twardy znak"] # 0x44a - - "ы": [t: "jery"] # 0x44b - - "ь": [t: "miękki znak"] # 0x44c + - "х": [T: "cha"] # 0x445 + - "ц": [T: "ce"] # 0x446 + - "ч": [T: "cze"] # 0x447 + - "ш": [T: "sza"] # 0x448 + - "щ": [T: "szcza"] # 0x449 + - "ъ": [T: "twardy znak"] # 0x44a + - "ы": [T: "jery"] # 0x44b + - "ь": [T: "miękki znak"] # 0x44c - "э": [t: "e"] # 0x44d - - "ю": [t: "ju"] # 0x44e - - "я": [t: "ja"] # 0x44f - - "ۆ": [t: "arabsko-indyjski pierwiastek szeƛcienny"] # 0x606 - - "ۇ": [t: "arabsko-indyjski czwarty pierwiastek"] # 0x607 - - "ۈ": [t: "arabski póƂprosta"] # 0x608 - - "‐": [t: "Ƃącznik"] # 0x2010 - - "‑": [t: "Ƃącznik"] # 0x2011 - - "‒": [t: "pauza cyfrowa"] # 0x2012 - - "–": [t: "póƂpauza"] # 0x2013 - - "—": [t: "pauza"] # 0x2014 - - "―": [t: "kreska pozioma"] # 0x2015 - - "‖": [t: "podwĂłjna pionowa kreska"] # 0x2016 - - "†": [t: "obelisk"] # 0x2020 - - "‡": [t: "podwĂłjny obelisk"] # 0x2021 + - "ю": [T: "ju"] # 0x44e + - "я": [T: "ja"] # 0x44f + - "ۆ": [T: "arabsko-indyjski pierwiastek szeƛcienny"] # 0x606 + - "ۇ": [T: "arabsko-indyjski czwarty pierwiastek"] # 0x607 + - "ۈ": [T: "arabski póƂprosta"] # 0x608 + - "‐": [T: "Ƃącznik"] # 0x2010 + - "‑": [T: "Ƃącznik"] # 0x2011 + - "‒": [T: "pauza cyfrowa"] # 0x2012 + - "–": [T: "póƂpauza"] # 0x2013 + - "—": [T: "pauza"] # 0x2014 + - "―": [T: "kreska pozioma"] # 0x2015 + - "‖": [T: "podwĂłjna pionowa kreska"] # 0x2016 + - "†": [T: "obelisk"] # 0x2020 + - "‡": [T: "podwĂłjny obelisk"] # 0x2021 - " - ": [T: " "] # 0x2000 - 0x2007 @@ -297,7 +297,7 @@ - test: if: "@data-chem-formula-op" then: [T: "kropka"] - else: [t: "punkt"] + else: [T: "punkt"] - "
": # 0x2026 test: @@ -306,221 +306,221 @@ # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' # speak '
' as 'and so on...' unless expr starts with '
' - "../*[1][.='
']" - then: [t: "trzy kropki"] + then: [T: "trzy kropki"] else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' if: "count(following-sibling::*) = 0" - then: [t: "i tak dalej"] - else: [t: "i tak dalej aĆŒ do"] - - - "‰": [t: "promil"] # 0x2030 - - "‱": [t: "na dziesięć tysięcy"] # 0x2031 - - "â€Č": [t: "prim"] # 0x2032 - - "″": [t: "podwĂłjny prim"] # 0x2033 - - "‮": [t: "potrĂłjny prim"] # 0x2034 - - "—": [t: "odwrĂłcony prim"] # 0x2035 - - "‶": [t: "odwrĂłcony podwĂłjny prim"] # 0x2036 - - "‷": [t: "odwrĂłcony potrĂłjny prim"] # 0x2037 + then: [T: "i tak dalej"] + else: [T: "i tak dalej aĆŒ do"] + + - "‰": [T: "promil"] # 0x2030 + - "‱": [T: "na dziesięć tysięcy"] # 0x2031 + - "â€Č": [T: "prim"] # 0x2032 + - "″": [T: "podwĂłjny prim"] # 0x2033 + - "‮": [T: "potrĂłjny prim"] # 0x2034 + - "—": [T: "odwrĂłcony prim"] # 0x2035 + - "‶": [T: "odwrĂłcony podwĂłjny prim"] # 0x2036 + - "‷": [T: "odwrĂłcony potrĂłjny prim"] # 0x2037 - "‾": [T: "do potęgi"] # 0x2038 - - "â€č": [t: "pojedynczy lewy cudzysƂów ostrokątny"] # 0x2039 - - "â€ș": [t: "pojedynczy prawy cudzysƂów ostrokątny"] # 0x203a + - "â€č": [T: "pojedynczy lewy cudzysƂów ostrokątny"] # 0x2039 + - "â€ș": [T: "pojedynczy prawy cudzysƂów ostrokątny"] # 0x203a - "‌": # 0x203c - test: if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [t: "podwĂłjny wykrzyknik punkt"] # 0x203c - else: [t: "podwĂłjny silnia"] # 0x203c + then: [T: "podwĂłjny wykrzyknik punkt"] # 0x203c + else: [T: "podwĂłjny silnia"] # 0x203c - "⁄": # 0x2044 - test: if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [t: "duĆŒy ukoƛnik"] # 0x203c + then: [T: "duĆŒy ukoƛnik"] # 0x203c else: [T: "podzielone przez"] # 0x203c - - "⁅": [t: "lewy kwadratowy nawias z piĂłrem"] # 0x2045 - - "⁆": [t: "prawy kwadratowy nawias z piĂłrem"] # 0x2046 - - "※": [t: "znak odsyƂacza"] # 0x203b - - "‿": [t: "Ƃuk dolny"] # 0x203F - - "⁀": [t: "Ƃuk gĂłrny"] # 0x2040 - - "⁎": [t: "dolna gwiazdka"] # 0x204e - - "⁏": [t: "odwrĂłcony ƛrednik"] # 0x204f - - "⁐": [t: "zamknij gĂłrny"] # 0x2050 - - "⁑": [t: "dwie pionowe gwiazdki"] # 0x2051 - - "⁒": [t: "handlowy znak minus"] # 0x2052 - - "⁗": [t: "poczwĂłrny prim"] # 0x2057 + - "⁅": [T: "lewy kwadratowy nawias z piĂłrem"] # 0x2045 + - "⁆": [T: "prawy kwadratowy nawias z piĂłrem"] # 0x2046 + - "※": [T: "znak odsyƂacza"] # 0x203b + - "‿": [T: "Ƃuk dolny"] # 0x203F + - "⁀": [T: "Ƃuk gĂłrny"] # 0x2040 + - "⁎": [T: "dolna gwiazdka"] # 0x204e + - "⁏": [T: "odwrĂłcony ƛrednik"] # 0x204f + - "⁐": [T: "zamknij gĂłrny"] # 0x2050 + - "⁑": [T: "dwie pionowe gwiazdki"] # 0x2051 + - "⁒": [T: "handlowy znak minus"] # 0x2052 + - "⁗": [T: "poczwĂłrny prim"] # 0x2057 - "⁠": [T: ""] # 0x2060 - - "⁰": [t: "do zerowej potęgi"] # 0x2070 - - "ⁱ": [t: "do potęgi i"] # 0x2071 - - "⁎": [t: "do czwartej potęgi"] # 0x2074 - - "⁔": [t: "do piątej potęgi"] # 0x2075 - - "⁶": [t: "do szĂłstej potęgi"] # 0x2076 - - "⁷": [t: "do siĂłdmej potęgi"] # 0x2077 - - "⁞": [t: "do Ăłsmej potęgi"] # 0x2078 - - "âč": [t: "do dziewiątej potęgi"] # 0x2079 - - "âș": [t: "znak plus w indeksie gĂłrnym"] # 0x207a - - "⁻": [t: "znak minus w indeksie gĂłrnym"] # 0x207b - - "⁌": [t: "znak rĂłwnoƛci w indeksie gĂłrnym"] # 0x207c - - "⁜": [t: "lewy nawias w indeksie gĂłrnym"] # 0x207d - - " ": [t: "prawy nawias w indeksie gĂłrnym"] # 0x207e - - "ⁿ": [t: "do potęgi n"] # 0x207f - - "₀": [t: "indeks dolny zero"] # 0x2080 - - "₁": [t: "indeks dolny jeden"] # 0x2081 - - "₂": [t: "indeks dolny dwa"] # 0x2082 - - "₃": [t: "indeks dolny trzy"] # 0x2083 - - "₄": [t: "indeks dolny cztery"] # 0x2084 - - "₅": [t: "indeks dolny pięć"] # 0x2085 - - "₆": [t: "indeks dolny szeƛć"] # 0x2086 - - "₇": [t: "indeks dolny siedem"] # 0x2087 - - "₈": [t: "indeks dolny osiem"] # 0x2088 - - "₉": [t: "indeks dolny dziewięć"] # 0x2089 - - "₊": [t: "znak plus w indeksie dolnym"] # 0x208a - - "₋": [t: "znak minus w indeksie dolnym"] # 0x208b - - "₌": [t: "znak rĂłwnoƛci w indeksie dolnym"] # 0x208c - - "₍": [t: "lewy nawias w indeksie dolnym"] # 0x208d - - "₎": [t: "prawy nawias w indeksie dolnym"] # 0x208e - - "ₐ": [t: "indeks dolny a"] # 0x2090 - - "ₑ": [t: "indeks dolny e"] # 0x2091 - - "ₒ": [t: "indeks dolny o"] # 0x2092 - - "ₓ": [t: "indeks dolny X"] # 0x2093 - - "ₕ": [t: "indeks dolny h"] # 0x2095 - - "ₖ": [t: "indeks dolny k"] # 0x2096 - - "ₗ": [t: "indeks dolny L"] # 0x2097 - - "ₘ": [t: "indeks dolny M"] # 0x2098 - - "ₙ": [t: "indeks dolny N"] # 0x2099 - - "ₚ": [t: "indeks dolny p"] # 0x209a - - "ₛ": [t: "indeks dolny s"] # 0x209b - - "ₜ": [t: "indeks dolny t"] # 0x209c - - "₠": [t: "europejska jednostka walutowa"] # 0x20a0 - - "₡": [t: "kolon"] # 0x20a1 - - "₱": [t: "znak cruzeiro"] # 0x20a2 - - "₣": [t: "frank"] # 0x20a3 + - "⁰": [T: "do zerowej potęgi"] # 0x2070 + - "ⁱ": [T: "do potęgi i"] # 0x2071 + - "⁎": [T: "do czwartej potęgi"] # 0x2074 + - "⁔": [T: "do piątej potęgi"] # 0x2075 + - "⁶": [T: "do szĂłstej potęgi"] # 0x2076 + - "⁷": [T: "do siĂłdmej potęgi"] # 0x2077 + - "⁞": [T: "do Ăłsmej potęgi"] # 0x2078 + - "âč": [T: "do dziewiątej potęgi"] # 0x2079 + - "âș": [T: "znak plus w indeksie gĂłrnym"] # 0x207a + - "⁻": [T: "znak minus w indeksie gĂłrnym"] # 0x207b + - "⁌": [T: "znak rĂłwnoƛci w indeksie gĂłrnym"] # 0x207c + - "⁜": [T: "lewy nawias w indeksie gĂłrnym"] # 0x207d + - " ": [T: "prawy nawias w indeksie gĂłrnym"] # 0x207e + - "ⁿ": [T: "do potęgi n"] # 0x207f + - "₀": [T: "indeks dolny zero"] # 0x2080 + - "₁": [T: "indeks dolny jeden"] # 0x2081 + - "₂": [T: "indeks dolny dwa"] # 0x2082 + - "₃": [T: "indeks dolny trzy"] # 0x2083 + - "₄": [T: "indeks dolny cztery"] # 0x2084 + - "₅": [T: "indeks dolny pięć"] # 0x2085 + - "₆": [T: "indeks dolny szeƛć"] # 0x2086 + - "₇": [T: "indeks dolny siedem"] # 0x2087 + - "₈": [T: "indeks dolny osiem"] # 0x2088 + - "₉": [T: "indeks dolny dziewięć"] # 0x2089 + - "₊": [T: "znak plus w indeksie dolnym"] # 0x208a + - "₋": [T: "znak minus w indeksie dolnym"] # 0x208b + - "₌": [T: "znak rĂłwnoƛci w indeksie dolnym"] # 0x208c + - "₍": [T: "lewy nawias w indeksie dolnym"] # 0x208d + - "₎": [T: "prawy nawias w indeksie dolnym"] # 0x208e + - "ₐ": [T: "indeks dolny a"] # 0x2090 + - "ₑ": [T: "indeks dolny e"] # 0x2091 + - "ₒ": [T: "indeks dolny o"] # 0x2092 + - "ₓ": [T: "indeks dolny X"] # 0x2093 + - "ₕ": [T: "indeks dolny h"] # 0x2095 + - "ₖ": [T: "indeks dolny k"] # 0x2096 + - "ₗ": [T: "indeks dolny L"] # 0x2097 + - "ₘ": [T: "indeks dolny M"] # 0x2098 + - "ₙ": [T: "indeks dolny N"] # 0x2099 + - "ₚ": [T: "indeks dolny p"] # 0x209a + - "ₛ": [T: "indeks dolny s"] # 0x209b + - "ₜ": [T: "indeks dolny t"] # 0x209c + - "₠": [T: "europejska jednostka walutowa"] # 0x20a0 + - "₡": [T: "kolon"] # 0x20a1 + - "₱": [T: "znak cruzeiro"] # 0x20a2 + - "₣": [T: "frank"] # 0x20a3 - "â‚€": [t: "lira"] # 0x20a4 - - "â‚„": [t: "mille"] # 0x20a5 + - "â‚„": [T: "mille"] # 0x20a5 - "₩": [t: "naira"] # 0x20a6 - "₧": [t: "peseta"] # 0x20a7 - - "₹": [t: "rupie"] # 0x20a8 + - "₹": [T: "rupie"] # 0x20a8 - "₩": [t: "won"] # 0x20a9 - - "â‚Ș": [t: "nowe szekle"] # 0x20aa + - "â‚Ș": [T: "nowe szekle"] # 0x20aa - "₫": [t: "dong"] # 0x20ab - - "€": [t: "euro"] # 0x20ac + - "€": [T: "euro"] # 0x20ac - "₭": [t: "kip"] # 0x20ad - "₼": [t: "tugrik"] # 0x20ae - "₯": [t: "drachma"] # 0x20af - - "₰": [t: "niemieckie fenigi"] # 0x20b0 - - "₱": [t: "peso"] # 0x20b1 - - "â‚Č": [t: "guarani"] # 0x20b2 - - "₳": [t: "australe"] # 0x20b3 - - "₮": [t: "hrywny"] # 0x20b4 - - "â‚”": [t: "cedi"] # 0x20b5 - - "₶": [t: "liwr turoƄski"] # 0x20b6 + - "₰": [T: "niemieckie fenigi"] # 0x20b0 + - "₱": [T: "peso"] # 0x20b1 + - "â‚Č": [T: "guarani"] # 0x20b2 + - "₳": [T: "australe"] # 0x20b3 + - "₮": [T: "hrywny"] # 0x20b4 + - "â‚”": [T: "cedi"] # 0x20b5 + - "₶": [T: "liwr turoƄski"] # 0x20b6 - "₷": [T: "spesmilos"] # 0x20b7 - - "₾": [t: "tenge"] # 0x20b8 - - "â‚č": [t: "rupie indyjskie"] # 0x20b9 - - "â‚ș": [t: "liry tureckie"] # 0x20ba - - "⃐": [t: "lewy harpun nad ozdobnik"] # 0x20d0 - - "⃑": [t: "prawy harpun nad ozdobnik"] # 0x20d1 - - "⃒": [t: "ozdobnik dƂugiej pionowej kreski nakƂadanej"] # 0x20d2 - - "⃓": [t: "ozdobnik krĂłtkiej pionowej kreski nakƂadanej"] # 0x20d3 - - "⃔": [t: "strzaƂka nad przeciwnie do ruchu wskazĂłwek zegara, ozdobnik"] # 0x20d4 - - "⃕": [t: "strzaƂka nad zgodnie z ruchem wskazĂłwek zegara, ozdobnik"] # 0x20d5 - - "⃖": [t: "strzaƂka w lewo nad ozdobnik"] # 0x20d6 - - "⃗": [t: "strzaƂka w prawo nad ozdobnik"] # 0x20d7 - - "⃘": [t: "pierƛcieƄ nakƂadka ozdobnik"] # 0x20d8 - - "⃙": [t: "pierƛcieƄ zgodnie z ruchem wskazĂłwek zegara, ozdobnik nakƂadany"] # 0x20d9 - - "⃚": [t: "pierƛcieƄ przeciwnie do ruchu wskazĂłwek zegara, ozdobnik nakƂadany"] # 0x20da - - "⃛": [t: "potrĂłjny kropka"] # 0x20db - - "⃜": [t: "poczwĂłrny kropka"] # 0x20dc - - "⃝": [t: "obejmujący okrąg ozdobnik"] # 0x20dd - - "⃞": [t: "obejmujący kwadrat ozdobnik"] # 0x20de - - "⃟": [t: "obejmujący romb ozdobnik"] # 0x20df - - "⃠": [t: "obejmujący okrąg ukoƛnik odwrotny ozdobnik"] # 0x20e0 - - "⃥": [t: "lewy strzaƂka w prawo nad ozdobnik"] # 0x20e1 - - "⃹": [t: "obejmujący ekran, ozdobnik"] # 0x20e2 - - "⃣": [t: "obejmujący nasadkę klawisza, ozdobnik"] # 0x20e3 - - "⃀": [t: "obejmujący w gĂłrę skierowany trĂłjkąt ozdobnik"] # 0x20e4 - - "⃄": [t: "odwrotny ukoƛnik nakƂadka ozdobnik"] # 0x20e5 - - "⃊": [t: "ozdobnik podwĂłjnej pionowej kreski"] # 0x20e6 - - "⃧": [t: "symbol renty, ozdobnik"] # 0x20e7 - - "⃚": [t: "potrĂłjna kropka pod spodem"] # 0x20e8 - - "⃩": [t: "szeroki mostek nad, ozdobnik"] # 0x20e9 - - "âƒȘ": [t: "strzaƂka w lewo nakƂadka ozdobnik"] # 0x20ea - - "⃫": [t: "dƂugi podwĂłjny ukoƛnik nakƂadka ozdobnik"] # 0x20eb - - "⃏": [t: "prawy harpun z grotem dolnym ozdobnik"] # 0x20ec - - "⃭": [t: "lewy harpun z grotem dolnym ozdobnik"] # 0x20ed - - "⃟": [t: "strzaƂka w lewo pod ozdobnik"] # 0x20ee - - "⃯": [t: "strzaƂka w prawo pod ozdobnik"] # 0x20ef - - "⃰": [t: "gwiazdka nad ozdobnik"] # 0x20f0 - - "℄": [t: "symbol linii ƛrodkowej"] # 0x2104 - - "℅": [t: "do rąk"] # 0x2105 - - "℆": [t: "kaĆŒda"] # 0x2106 - - "ℇ": [t: "staƂa Eulera"] # 0x2107 - - "℈": [t: "skrupule"] # 0x2108 - - "℉": [t: "stopnie Fahrenheita"] # 0x2109 - - "ℊ": [t: "pisane g"] # 0x210a + - "₾": [T: "tenge"] # 0x20b8 + - "â‚č": [T: "rupie indyjskie"] # 0x20b9 + - "â‚ș": [T: "liry tureckie"] # 0x20ba + - "⃐": [T: "lewy harpun nad ozdobnik"] # 0x20d0 + - "⃑": [T: "prawy harpun nad ozdobnik"] # 0x20d1 + - "⃒": [T: "ozdobnik dƂugiej pionowej kreski nakƂadanej"] # 0x20d2 + - "⃓": [T: "ozdobnik krĂłtkiej pionowej kreski nakƂadanej"] # 0x20d3 + - "⃔": [T: "strzaƂka nad przeciwnie do ruchu wskazĂłwek zegara, ozdobnik"] # 0x20d4 + - "⃕": [T: "strzaƂka nad zgodnie z ruchem wskazĂłwek zegara, ozdobnik"] # 0x20d5 + - "⃖": [T: "strzaƂka w lewo nad ozdobnik"] # 0x20d6 + - "⃗": [T: "strzaƂka w prawo nad ozdobnik"] # 0x20d7 + - "⃘": [T: "pierƛcieƄ nakƂadka ozdobnik"] # 0x20d8 + - "⃙": [T: "pierƛcieƄ zgodnie z ruchem wskazĂłwek zegara, ozdobnik nakƂadany"] # 0x20d9 + - "⃚": [T: "pierƛcieƄ przeciwnie do ruchu wskazĂłwek zegara, ozdobnik nakƂadany"] # 0x20da + - "⃛": [T: "potrĂłjny kropka"] # 0x20db + - "⃜": [T: "poczwĂłrny kropka"] # 0x20dc + - "⃝": [T: "obejmujący okrąg ozdobnik"] # 0x20dd + - "⃞": [T: "obejmujący kwadrat ozdobnik"] # 0x20de + - "⃟": [T: "obejmujący romb ozdobnik"] # 0x20df + - "⃠": [T: "obejmujący okrąg ukoƛnik odwrotny ozdobnik"] # 0x20e0 + - "⃥": [T: "lewy strzaƂka w prawo nad ozdobnik"] # 0x20e1 + - "⃹": [T: "obejmujący ekran, ozdobnik"] # 0x20e2 + - "⃣": [T: "obejmujący nasadkę klawisza, ozdobnik"] # 0x20e3 + - "⃀": [T: "obejmujący w gĂłrę skierowany trĂłjkąt ozdobnik"] # 0x20e4 + - "⃄": [T: "odwrotny ukoƛnik nakƂadka ozdobnik"] # 0x20e5 + - "⃊": [T: "ozdobnik podwĂłjnej pionowej kreski"] # 0x20e6 + - "⃧": [T: "symbol renty, ozdobnik"] # 0x20e7 + - "⃚": [T: "potrĂłjna kropka pod spodem"] # 0x20e8 + - "⃩": [T: "szeroki mostek nad, ozdobnik"] # 0x20e9 + - "âƒȘ": [T: "strzaƂka w lewo nakƂadka ozdobnik"] # 0x20ea + - "⃫": [T: "dƂugi podwĂłjny ukoƛnik nakƂadka ozdobnik"] # 0x20eb + - "⃏": [T: "prawy harpun z grotem dolnym ozdobnik"] # 0x20ec + - "⃭": [T: "lewy harpun z grotem dolnym ozdobnik"] # 0x20ed + - "⃟": [T: "strzaƂka w lewo pod ozdobnik"] # 0x20ee + - "⃯": [T: "strzaƂka w prawo pod ozdobnik"] # 0x20ef + - "⃰": [T: "gwiazdka nad ozdobnik"] # 0x20f0 + - "℄": [T: "symbol linii ƛrodkowej"] # 0x2104 + - "℅": [T: "do rąk"] # 0x2105 + - "℆": [T: "kaĆŒda"] # 0x2106 + - "ℇ": [T: "staƂa Eulera"] # 0x2107 + - "℈": [T: "skrupule"] # 0x2108 + - "℉": [T: "stopnie Fahrenheita"] # 0x2109 + - "ℊ": [T: "pisane g"] # 0x210a - "ℌℑℹℭ": # 0x210c, 0x2111, 0x2128, 0x212d - - t: "fraktura" + - T: "fraktura" - spell: "translate('.', 'ℌℑℹℭ', 'HIZC')" - "â„â„™â„Ÿâ„ż": # 0x210d, 0x2119, 0x213e, 0x213f - - t: "dwukreskowe" + - T: "dwukreskowe" - spell: "translate('.', 'â„â„™â„Ÿâ„ż', 'HPΓΠ')" - - "ℎ": [t: "staƂa Plancka"] # 0x210e - - "ℏ": [t: "h kreƛlone"] # 0x210f + - "ℎ": [T: "staƂa Plancka"] # 0x210e + - "ℏ": [T: "h kreƛlone"] # 0x210f - "â„â„’â„˜â„Źâ„°â„±â„ł": # 0x2110, 0x2112, 0x2118, 0x2130, 0x2131, 0x2133 - - t: "pisane" + - T: "pisane" - spell: "translate('.', 'â„â„’â„˜â„Źâ„°â„±â„ł', 'ILPBEFM')" - - "ℓ": [t: "pisane L"] # 0x2113 - - "℔": [t: "funty"] # 0x2114 - - "№": [t: "numer"] # 0x2116 - - "â„„": [t: "uncje"] # 0x2125 - - "℩": [t: "omy"] # 0x2126 + - "ℓ": [T: "pisane L"] # 0x2113 + - "℔": [T: "funty"] # 0x2114 + - "№": [T: "numer"] # 0x2116 + - "â„„": [T: "uncje"] # 0x2125 + - "℩": [T: "omy"] # 0x2126 - "℧": [T: "mho"] # 0x2127 - - "℩": [t: "odwrĂłcony jota"] # 0x2129 - - "â„Ș": [t: "kelwin"] # 0x212a - - "Å": [t: "angstremy"] # 0x212b - - "ℯ": [t: "pisane e"] # 0x212f + - "℩": [T: "odwrĂłcony jota"] # 0x2129 + - "â„Ș": [T: "kelwin"] # 0x212a + - "Å": [T: "angstremy"] # 0x212b + - "ℯ": [T: "pisane e"] # 0x212f # coalesced some chars that use cap letters - "â„Čâ„ș⅁⅂⅃⅄": # 0x2132, 0x213a, 0x2141, 0x2142, 0x2143, 0x2144 - test: - if: "'.' = 'â„ș'" - then: [t: "obrĂłcone"] + then: [T: "obrĂłcone"] - else_if: "'.' = 'â„Č'" - then: [t: "odwrĂłcone"] + then: [T: "odwrĂłcone"] - else_if: "'.' = '⅃'" - then: [t: "odwrĂłcone bezszeryfowe"] - else: [t: "odwrĂłcony bezszeryfowe"] + then: [T: "odwrĂłcone bezszeryfowe"] + else: [T: "odwrĂłcony bezszeryfowe"] - spell: "translate('.', 'â„Čâ„ș⅁⅂⅃⅄', 'FQGLLY')" - - "℮": [t: "pisane o"] # 0x2134 - - "â„”": [t: "pierwsza pozaskoƄczona liczba kardynalna"] # 0x2135 - - "ℶ": [t: "druga pozaskoƄczona liczba kardynalna"] # 0x2136 - - "ℷ": [t: "trzecia pozaskoƄczona liczba kardynalna"] # 0x2137 - - "ℾ": [t: "czwarta pozaskoƄczona liczba kardynalna"] # 0x2138 - - "ℌ": [t: "dwukreskowe pi"] # 0x213c - - "ℜ": [t: "dwukreskowe gamma"] # 0x213d - - "⅀": [t: "dwukreskowa suma N-arna"] # 0x2140 - - "⅋": [t: "odwrĂłcony znak et"] # 0x214b + - "℮": [T: "pisane o"] # 0x2134 + - "â„”": [T: "pierwsza pozaskoƄczona liczba kardynalna"] # 0x2135 + - "ℶ": [T: "druga pozaskoƄczona liczba kardynalna"] # 0x2136 + - "ℷ": [T: "trzecia pozaskoƄczona liczba kardynalna"] # 0x2137 + - "ℾ": [T: "czwarta pozaskoƄczona liczba kardynalna"] # 0x2138 + - "ℌ": [T: "dwukreskowe pi"] # 0x213c + - "ℜ": [T: "dwukreskowe gamma"] # 0x213d + - "⅀": [T: "dwukreskowa suma N-arna"] # 0x2140 + - "⅋": [T: "odwrĂłcony znak et"] # 0x214b - "⅌": [T: "na"] # 0x214c - - "ⅎ": [t: "odwrĂłcony f"] # 0x214e - - "ÂŒ": [t: "jedna czwarta"] # 0x00bc - - "œ": [t: "jedna druga"] # 0x00bd - - "Ÿ": [t: "trzy czwarte"] # 0x00be - - "⅐": [t: "jeden siĂłdmy"] # 0x2150 - - "⅑": [t: "jeden dziewiąty"] # 0x2151 - - "⅒": [t: "jedna dziesiąta"] # 0x2152 - - "⅓": [t: "jeden trzeci"] # 0x2153 - - "⅔": [t: "dwie trzecie"] # 0x2154 - - "⅕": [t: "jeden piąty"] # 0x2155 - - "⅖": [t: "dwie piąte"] # 0x2156 - - "⅗": [t: "trzy piąte"] # 0x2157 - - "⅘": [t: "cztery piąte"] # 0x2158 - - "⅙": [t: "jeden szĂłsty"] # 0x2159 - - "⅚": [t: "pięć szĂłstych"] # 0x215a - - "⅛": [t: "jeden Ăłsmy"] # 0x215b - - "⅜": [t: "trzy Ăłsme"] # 0x215c - - "⅝": [t: "pięć Ăłsmych"] # 0x215d - - "⅞": [t: "siedem Ăłsmych"] # 0x215e - - "⅟": [t: "jeden przez"] # 0x215f + - "ⅎ": [T: "odwrĂłcony f"] # 0x214e + - "ÂŒ": [T: "jedna czwarta"] # 0x00bc + - "œ": [T: "jedna druga"] # 0x00bd + - "Ÿ": [T: "trzy czwarte"] # 0x00be + - "⅐": [T: "jeden siĂłdmy"] # 0x2150 + - "⅑": [T: "jeden dziewiąty"] # 0x2151 + - "⅒": [T: "jedna dziesiąta"] # 0x2152 + - "⅓": [T: "jeden trzeci"] # 0x2153 + - "⅔": [T: "dwie trzecie"] # 0x2154 + - "⅕": [T: "jeden piąty"] # 0x2155 + - "⅖": [T: "dwie piąte"] # 0x2156 + - "⅗": [T: "trzy piąte"] # 0x2157 + - "⅘": [T: "cztery piąte"] # 0x2158 + - "⅙": [T: "jeden szĂłsty"] # 0x2159 + - "⅚": [T: "pięć szĂłstych"] # 0x215a + - "⅛": [T: "jeden Ăłsmy"] # 0x215b + - "⅜": [T: "trzy Ăłsme"] # 0x215c + - "⅝": [T: "pięć Ăłsmych"] # 0x215d + - "⅞": [T: "siedem Ăłsmych"] # 0x215e + - "⅟": [T: "jeden przez"] # 0x215f - "Ⅰ": [t: "I"] # 0x2160 - "Ⅱ": [T: "I I"] # 0x2161 - "ⅱ": [T: "I I I"] # 0x2162 @@ -553,170 +553,170 @@ - "â…œ": [T: "C"] # 0x217d - "â…Ÿ": [T: "D"] # 0x217e - "ⅿ": [T: "M"] # 0x217f - - "↉": [t: "zero trzecich"] # 0x2189 - - "↔": [t: "lewy strzaƂka w prawo"] # 0x2194 - - "↕": [t: "gĂłrny strzaƂka w dóƂ"] # 0x2195 - - "↖": [t: "póƂnoc zachĂłd strzaƂka"] # 0x2196 + - "↉": [T: "zero trzecich"] # 0x2189 + - "↔": [T: "lewy strzaƂka w prawo"] # 0x2194 + - "↕": [T: "gĂłrny strzaƂka w dóƂ"] # 0x2195 + - "↖": [T: "póƂnoc zachĂłd strzaƂka"] # 0x2196 - "↗": # 0x2197 - test: if: "ancestor::*[2][self::m:limit]" - then: [t: "dÄ…ĆŒy od doƂu"] - else: [t: "póƂnoc wschĂłd strzaƂka"] + then: [T: "dÄ…ĆŒy od doƂu"] + else: [T: "póƂnoc wschĂłd strzaƂka"] - "↘": # 0x2198 - test: if: "ancestor::*[2][self::m:limit]" - then: [t: "dÄ…ĆŒy od gĂłry"] - else: [t: "poƂudnie wschĂłd strzaƂka"] - - - "↙": [t: "poƂudnie zachĂłd strzaƂka"] # 0x2199 - - "↚": [t: "przekreƛlona strzaƂka w lewo"] # 0x219a - - "↛": [t: "przekreƛlona strzaƂka w prawo"] # 0x219b - - "↜": [t: "falista strzaƂka w lewo"] # 0x219c - - "↝": [t: "falista strzaƂka w prawo"] # 0x219d - - "↞": [t: "strzaƂka w lewo z dwoma grotami"] # 0x219e - - "↟": [t: "strzaƂka w gĂłrę z dwoma grotami"] # 0x219f - - "↠": [t: "strzaƂka w prawo z dwoma grotami"] # 0x21a0 - - "↡": [t: "strzaƂka w dóƂ z dwoma grotami"] # 0x21a1 - - "↱": [t: "strzaƂka w lewo z ogon"] # 0x21a2 - - "↣": [t: "strzaƂka w prawo z ogon"] # 0x21a3 - - "ↀ": [t: "strzaƂka w lewo od kreski"] # 0x21a4 - - "ↄ": [t: "strzaƂka w gĂłrę od kreski"] # 0x21a5 - - "↩": [t: "strzaƂka w prawo od kreski"] # 0x21a6 - - "↧": [t: "strzaƂka w dóƂ od kreski"] # 0x21a7 - - "↹": [t: "gĂłrny strzaƂka w dóƂ z podstawa"] # 0x21a8 - - "↩": [t: "strzaƂka w lewo z hak"] # 0x21a9 - - "â†Ș": [t: "strzaƂka w prawo z hak"] # 0x21aa - - "↫": [t: "strzaƂka w lewo z pętlą"] # 0x21ab - - "↬": [t: "strzaƂka w prawo z pętlą"] # 0x21ac - - "↭": [t: "falista strzaƂka w lewo i w prawo"] # 0x21ad - - "↼": [t: "przekreƛlona strzaƂka w lewo i w prawo"] # 0x21ae - - "↯": [t: "strzaƂka zygzakowata w dóƂ"] # 0x21af - - "↰": [t: "strzaƂka w gĂłrę z tip lewy"] # 0x21b0 - - "↱": [t: "strzaƂka w gĂłrę z tip prawy"] # 0x21b1 - - "â†Č": [t: "strzaƂka w dóƂ z tip lewy"] # 0x21b2 - - "↳": [t: "strzaƂka w dóƂ z tip prawy"] # 0x21b3 - - "↮": [t: "strzaƂka w prawo z naroĆŒnikiem w dóƂ"] # 0x21b4 - - "↔": [t: "strzaƂka w dóƂ z naroĆŒnikiem w lewo"] # 0x21b5 - - "↶": [t: "strzaƂka po gĂłrnym póƂokręgu przeciwnie do ruchu wskazĂłwek zegara"] # 0x21b6 - - "↷": [t: "strzaƂka po gĂłrnym póƂokręgu zgodnie z ruchem wskazĂłwek zegara"] # 0x21b7 - - "↾": [t: "strzaƂka póƂnocno-zachodnia do dƂugiej kreski"] # 0x21b8 - - "â†č": [t: "strzaƂka w lewo do kreski nad strzaƂką w prawo do kreski"] # 0x21b9 - - "â†ș": [t: "strzaƂka po otwartym okręgu przeciwnie do ruchu wskazĂłwek zegara"] # 0x21ba - - "↻": [t: "strzaƂka po otwartym okręgu zgodnie z ruchem wskazĂłwek zegara"] # 0x21bb - - "↌": [t: "lewy harpun gĂłrny"] # 0x21bc - - "↜": [t: "lewy harpun dolny"] # 0x21bd - - "↟": [t: "gĂłrny harpun prawy"] # 0x21be - - "↿": [t: "gĂłrny harpun lewy"] # 0x21bf - - "⇀": [t: "prawy harpun gĂłrny"] # 0x21c0 - - "⇁": [t: "prawy harpun dolny"] # 0x21c1 - - "⇂": [t: "dolny harpun prawy"] # 0x21c2 - - "⇃": [t: "dolny harpun lewy"] # 0x21c3 - - "⇄": [t: "strzaƂka w prawo nad strzaƂką w lewo"] # 0x21c4 - - "⇅": [t: "strzaƂka w gĂłrę po lewej i strzaƂka w dóƂ"] # 0x21c5 - - "⇆": [t: "strzaƂka w lewo nad strzaƂką w prawo"] # 0x21c6 - - "⇇": [t: "podwĂłjne strzaƂki w lewo"] # 0x21c7 - - "⇈": [t: "podwĂłjne strzaƂki w gĂłrę"] # 0x21c8 - - "⇉": [t: "podwĂłjne strzaƂki w prawo"] # 0x21c9 - - "⇊": [t: "podwĂłjne strzaƂki w dóƂ"] # 0x21ca - - "⇋": [t: "lewy harpun przez prawy harpun"] # 0x21cb - - "⇌": [t: "prawy harpun przez lewy harpun"] # 0x21cc + then: [T: "dÄ…ĆŒy od gĂłry"] + else: [T: "poƂudnie wschĂłd strzaƂka"] + + - "↙": [T: "poƂudnie zachĂłd strzaƂka"] # 0x2199 + - "↚": [T: "przekreƛlona strzaƂka w lewo"] # 0x219a + - "↛": [T: "przekreƛlona strzaƂka w prawo"] # 0x219b + - "↜": [T: "falista strzaƂka w lewo"] # 0x219c + - "↝": [T: "falista strzaƂka w prawo"] # 0x219d + - "↞": [T: "strzaƂka w lewo z dwoma grotami"] # 0x219e + - "↟": [T: "strzaƂka w gĂłrę z dwoma grotami"] # 0x219f + - "↠": [T: "strzaƂka w prawo z dwoma grotami"] # 0x21a0 + - "↡": [T: "strzaƂka w dóƂ z dwoma grotami"] # 0x21a1 + - "↱": [T: "strzaƂka w lewo z ogon"] # 0x21a2 + - "↣": [T: "strzaƂka w prawo z ogon"] # 0x21a3 + - "ↀ": [T: "strzaƂka w lewo od kreski"] # 0x21a4 + - "ↄ": [T: "strzaƂka w gĂłrę od kreski"] # 0x21a5 + - "↩": [T: "strzaƂka w prawo od kreski"] # 0x21a6 + - "↧": [T: "strzaƂka w dóƂ od kreski"] # 0x21a7 + - "↹": [T: "gĂłrny strzaƂka w dóƂ z podstawa"] # 0x21a8 + - "↩": [T: "strzaƂka w lewo z hak"] # 0x21a9 + - "â†Ș": [T: "strzaƂka w prawo z hak"] # 0x21aa + - "↫": [T: "strzaƂka w lewo z pętlą"] # 0x21ab + - "↬": [T: "strzaƂka w prawo z pętlą"] # 0x21ac + - "↭": [T: "falista strzaƂka w lewo i w prawo"] # 0x21ad + - "↼": [T: "przekreƛlona strzaƂka w lewo i w prawo"] # 0x21ae + - "↯": [T: "strzaƂka zygzakowata w dóƂ"] # 0x21af + - "↰": [T: "strzaƂka w gĂłrę z tip lewy"] # 0x21b0 + - "↱": [T: "strzaƂka w gĂłrę z tip prawy"] # 0x21b1 + - "â†Č": [T: "strzaƂka w dóƂ z tip lewy"] # 0x21b2 + - "↳": [T: "strzaƂka w dóƂ z tip prawy"] # 0x21b3 + - "↮": [T: "strzaƂka w prawo z naroĆŒnikiem w dóƂ"] # 0x21b4 + - "↔": [T: "strzaƂka w dóƂ z naroĆŒnikiem w lewo"] # 0x21b5 + - "↶": [T: "strzaƂka po gĂłrnym póƂokręgu przeciwnie do ruchu wskazĂłwek zegara"] # 0x21b6 + - "↷": [T: "strzaƂka po gĂłrnym póƂokręgu zgodnie z ruchem wskazĂłwek zegara"] # 0x21b7 + - "↾": [T: "strzaƂka póƂnocno-zachodnia do dƂugiej kreski"] # 0x21b8 + - "â†č": [T: "strzaƂka w lewo do kreski nad strzaƂką w prawo do kreski"] # 0x21b9 + - "â†ș": [T: "strzaƂka po otwartym okręgu przeciwnie do ruchu wskazĂłwek zegara"] # 0x21ba + - "↻": [T: "strzaƂka po otwartym okręgu zgodnie z ruchem wskazĂłwek zegara"] # 0x21bb + - "↌": [T: "lewy harpun gĂłrny"] # 0x21bc + - "↜": [T: "lewy harpun dolny"] # 0x21bd + - "↟": [T: "gĂłrny harpun prawy"] # 0x21be + - "↿": [T: "gĂłrny harpun lewy"] # 0x21bf + - "⇀": [T: "prawy harpun gĂłrny"] # 0x21c0 + - "⇁": [T: "prawy harpun dolny"] # 0x21c1 + - "⇂": [T: "dolny harpun prawy"] # 0x21c2 + - "⇃": [T: "dolny harpun lewy"] # 0x21c3 + - "⇄": [T: "strzaƂka w prawo nad strzaƂką w lewo"] # 0x21c4 + - "⇅": [T: "strzaƂka w gĂłrę po lewej i strzaƂka w dóƂ"] # 0x21c5 + - "⇆": [T: "strzaƂka w lewo nad strzaƂką w prawo"] # 0x21c6 + - "⇇": [T: "podwĂłjne strzaƂki w lewo"] # 0x21c7 + - "⇈": [T: "podwĂłjne strzaƂki w gĂłrę"] # 0x21c8 + - "⇉": [T: "podwĂłjne strzaƂki w prawo"] # 0x21c9 + - "⇊": [T: "podwĂłjne strzaƂki w dóƂ"] # 0x21ca + - "⇋": [T: "lewy harpun przez prawy harpun"] # 0x21cb + - "⇌": [T: "prawy harpun przez lewy harpun"] # 0x21cc - "⇍": [T: "nie wynika z"] # 0x21cd - "⇎": [T: "nie jest rĂłwnowaĆŒne"] # 0x21ce - "⇏": [T: "nie implikuje"] # 0x21cf - "⇐": [T: "wynika z"] # 0x21d0 - - "⇑": [t: "podwĂłjna strzaƂka w gĂłrę"] # 0x21d1 - - "⇒": [t: "implikuje"] # 0x21d2 - - "⇓": [t: "podwĂłjna strzaƂka w dóƂ"] # 0x21d3 - - "⇔": [t: "wtedy i tylko wtedy"] # 0x21d4 - - "⇕": [t: "podwĂłjna strzaƂka w gĂłrę i w dóƂ"] # 0x21d5 - - "⇖": [t: "podwĂłjna strzaƂka na póƂnocny zachĂłd"] # 0x21d6 - - "⇗": [t: "podwĂłjna strzaƂka na póƂnocny wschĂłd"] # 0x21d7 - - "⇘": [t: "podwĂłjna strzaƂka na poƂudniowy wschĂłd"] # 0x21d8 - - "⇙": [t: "podwĂłjna strzaƂka na poƂudniowy zachĂłd"] # 0x21d9 - - "⇚": [t: "lewy potrĂłjny strzaƂka"] # 0x21da - - "⇛": [t: "prawy potrĂłjny strzaƂka"] # 0x21db - - "⇜": [t: "falista strzaƂka w lewo"] # 0x21dc - - "⇝": [t: "falista strzaƂka w prawo"] # 0x21dd - - "⇞": [t: "strzaƂka w gĂłrę z podwĂłjną kreską"] # 0x21de - - "⇟": [t: "strzaƂka w dóƂ z podwĂłjną kreską"] # 0x21df - - "⇠": [t: "przerywana strzaƂka w lewo"] # 0x21e0 - - "⇡": [t: "przerywana strzaƂka w gĂłrę"] # 0x21e1 - - "⇱": [t: "przerywana strzaƂka w prawo"] # 0x21e2 - - "⇣": [t: "przerywana strzaƂka w dóƂ"] # 0x21e3 - - "⇀": [t: "strzaƂka w lewo do kreski"] # 0x21e4 - - "⇄": [t: "strzaƂka w prawo do kreski"] # 0x21e5 - - "⇩": [t: "biaƂa strzaƂka w lewo"] # 0x21e6 - - "⇧": [t: "biaƂa strzaƂka w gĂłrę"] # 0x21e7 - - "⇹": [t: "biaƂa strzaƂka w prawo"] # 0x21e8 - - "⇩": [t: "biaƂa strzaƂka w dóƂ"] # 0x21e9 - - "â‡Ș": [t: "biaƂa strzaƂka w gĂłrę od kreski"] # 0x21ea - - "⇫": [t: "gĂłrna biaƂa strzaƂka na podstawie"] # 0x21eb - - "⇬": [t: "gĂłrna biaƂa strzaƂka na podstawie z kreską poziomą"] # 0x21ec - - "⇭": [t: "gĂłrna biaƂa strzaƂka na podstawie z kreską pionową"] # 0x21ed - - "⇼": [t: "gĂłrny biaƂy podwĂłjna strzaƂka"] # 0x21ee - - "⇯": [t: "gĂłrna biaƂa podwĂłjna strzaƂka na podstawie"] # 0x21ef - - "⇰": [t: "biaƂa strzaƂka w prawo od ƛciany"] # 0x21f0 - - "⇱": [t: "strzaƂka póƂnocno-zachodnia do naroĆŒnika"] # 0x21f1 - - "â‡Č": [t: "strzaƂka poƂudniowo-wschodnia do naroĆŒnika"] # 0x21f2 - - "⇳": [t: "biaƂa strzaƂka w gĂłrę i w dóƂ"] # 0x21f3 - - "⇮": [t: "strzaƂka w prawo z maƂym okręgiem"] # 0x21f4 - - "⇔": [t: "strzaƂka w dóƂ po lewej od strzaƂki w gĂłrę"] # 0x21f5 - - "⇶": [t: "trzy strzaƂki w prawo"] # 0x21f6 - - "⇷": [t: "strzaƂka w lewo z pionową kreską"] # 0x21f7 - - "⇾": [t: "strzaƂka w prawo z pionową kreską"] # 0x21f8 - - "â‡č": [t: "strzaƂki w lewo i w prawo z pionową kreską"] # 0x21f9 - - "â‡ș": [t: "strzaƂka w lewo z podwĂłjną pionową kreską"] # 0x21fa - - "⇻": [t: "strzaƂka w prawo z podwĂłjną pionową kreską"] # 0x21fb - - "⇌": [t: "strzaƂki w lewo i w prawo z podwĂłjną pionową kreską"] # 0x21fc - - "⇜": [t: "strzaƂka w lewo z otwartym grotem"] # 0x21fd - - "⇟": [t: "strzaƂka w prawo z otwartym grotem"] # 0x21fe - - "⇿": [t: "strzaƂka w lewo i w prawo z otwartymi grotami"] # 0x21ff - - "∀": [t: "dla kaĆŒdego"] # 0x2200 + - "⇑": [T: "podwĂłjna strzaƂka w gĂłrę"] # 0x21d1 + - "⇒": [T: "implikuje"] # 0x21d2 + - "⇓": [T: "podwĂłjna strzaƂka w dóƂ"] # 0x21d3 + - "⇔": [T: "wtedy i tylko wtedy"] # 0x21d4 + - "⇕": [T: "podwĂłjna strzaƂka w gĂłrę i w dóƂ"] # 0x21d5 + - "⇖": [T: "podwĂłjna strzaƂka na póƂnocny zachĂłd"] # 0x21d6 + - "⇗": [T: "podwĂłjna strzaƂka na póƂnocny wschĂłd"] # 0x21d7 + - "⇘": [T: "podwĂłjna strzaƂka na poƂudniowy wschĂłd"] # 0x21d8 + - "⇙": [T: "podwĂłjna strzaƂka na poƂudniowy zachĂłd"] # 0x21d9 + - "⇚": [T: "lewy potrĂłjny strzaƂka"] # 0x21da + - "⇛": [T: "prawy potrĂłjny strzaƂka"] # 0x21db + - "⇜": [T: "falista strzaƂka w lewo"] # 0x21dc + - "⇝": [T: "falista strzaƂka w prawo"] # 0x21dd + - "⇞": [T: "strzaƂka w gĂłrę z podwĂłjną kreską"] # 0x21de + - "⇟": [T: "strzaƂka w dóƂ z podwĂłjną kreską"] # 0x21df + - "⇠": [T: "przerywana strzaƂka w lewo"] # 0x21e0 + - "⇡": [T: "przerywana strzaƂka w gĂłrę"] # 0x21e1 + - "⇱": [T: "przerywana strzaƂka w prawo"] # 0x21e2 + - "⇣": [T: "przerywana strzaƂka w dóƂ"] # 0x21e3 + - "⇀": [T: "strzaƂka w lewo do kreski"] # 0x21e4 + - "⇄": [T: "strzaƂka w prawo do kreski"] # 0x21e5 + - "⇩": [T: "biaƂa strzaƂka w lewo"] # 0x21e6 + - "⇧": [T: "biaƂa strzaƂka w gĂłrę"] # 0x21e7 + - "⇹": [T: "biaƂa strzaƂka w prawo"] # 0x21e8 + - "⇩": [T: "biaƂa strzaƂka w dóƂ"] # 0x21e9 + - "â‡Ș": [T: "biaƂa strzaƂka w gĂłrę od kreski"] # 0x21ea + - "⇫": [T: "gĂłrna biaƂa strzaƂka na podstawie"] # 0x21eb + - "⇬": [T: "gĂłrna biaƂa strzaƂka na podstawie z kreską poziomą"] # 0x21ec + - "⇭": [T: "gĂłrna biaƂa strzaƂka na podstawie z kreską pionową"] # 0x21ed + - "⇼": [T: "gĂłrny biaƂy podwĂłjna strzaƂka"] # 0x21ee + - "⇯": [T: "gĂłrna biaƂa podwĂłjna strzaƂka na podstawie"] # 0x21ef + - "⇰": [T: "biaƂa strzaƂka w prawo od ƛciany"] # 0x21f0 + - "⇱": [T: "strzaƂka póƂnocno-zachodnia do naroĆŒnika"] # 0x21f1 + - "â‡Č": [T: "strzaƂka poƂudniowo-wschodnia do naroĆŒnika"] # 0x21f2 + - "⇳": [T: "biaƂa strzaƂka w gĂłrę i w dóƂ"] # 0x21f3 + - "⇮": [T: "strzaƂka w prawo z maƂym okręgiem"] # 0x21f4 + - "⇔": [T: "strzaƂka w dóƂ po lewej od strzaƂki w gĂłrę"] # 0x21f5 + - "⇶": [T: "trzy strzaƂki w prawo"] # 0x21f6 + - "⇷": [T: "strzaƂka w lewo z pionową kreską"] # 0x21f7 + - "⇾": [T: "strzaƂka w prawo z pionową kreską"] # 0x21f8 + - "â‡č": [T: "strzaƂki w lewo i w prawo z pionową kreską"] # 0x21f9 + - "â‡ș": [T: "strzaƂka w lewo z podwĂłjną pionową kreską"] # 0x21fa + - "⇻": [T: "strzaƂka w prawo z podwĂłjną pionową kreską"] # 0x21fb + - "⇌": [T: "strzaƂki w lewo i w prawo z podwĂłjną pionową kreską"] # 0x21fc + - "⇜": [T: "strzaƂka w lewo z otwartym grotem"] # 0x21fd + - "⇟": [T: "strzaƂka w prawo z otwartym grotem"] # 0x21fe + - "⇿": [T: "strzaƂka w lewo i w prawo z otwartymi grotami"] # 0x21ff + - "∀": [T: "dla kaĆŒdego"] # 0x2200 - "∁": # 0x2201 - - t: "dopeƂnienie" + - T: "dopeƂnienie" - "∂": # 0x2202 - test: if: "$Verbosity='Terse'" - then: [t: "cząstkowe"] - else: [t: "pochodna cząstkowa"] - - "∃": [t: "istnieje"] # 0x2203 - - "∄": [t: "nie istnieje"] # 0x2204 + then: [T: "cząstkowe"] + else: [T: "pochodna cząstkowa"] + - "∃": [T: "istnieje"] # 0x2203 + - "∄": [T: "nie istnieje"] # 0x2204 - "∅": [T: "zbiĂłr pusty"] # 0x2205 - "∆": # 0x2206 - test: if: "following-sibling::*" then_test: if: "$Verbosity!='Terse'" - then: [t: "laplasjan"] # "LahPlahsian" sounds better than "laplacian" in speech engines tested - else: [t: "laplasjan"] - else: [t: "laplasjan"] + then: [T: "laplasjan"] # "LahPlahsian" sounds better than "laplacian" in speech engines tested + else: [T: "laplasjan"] + else: [T: "laplasjan"] - - "∇": [t: "nabla"] # 0x2207 + - "∇": [T: "nabla"] # 0x2207 - "∉": # 0x2209 # rule is identical to 0x2208 - test: if: "$SpeechStyle != 'ClearSpeak'" - then: [t: "nie jest elementem zbioru"] + then: [T: "nie jest elementem zbioru"] # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option else_test: if: "../../self::m:set or ../../../self::m:set" # inside a set then_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "nie naleĆŒy do"] + then: [T: "nie naleĆŒy do"] - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "nie jest elementem zbioru"] + then: [T: "nie jest elementem zbioru"] - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "nie jest elementem zbioru"] - - else: [t: "nienaleĆŒÄ…ce do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + then: [T: "nie jest elementem zbioru"] + - else: [T: "nienaleĆŒÄ…ce do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' else_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "nie jest elementem zbioru"] + then: [T: "nie jest elementem zbioru"] - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "nie jest elementem zbioru"] + then: [T: "nie jest elementem zbioru"] - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "nie naleĆŒy do"] - - else: [t: "nie naleĆŒy do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + then: [T: "nie naleĆŒy do"] + - else: [T: "nie naleĆŒy do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' - "∊": # 0x220a - test: if: "$SpeechStyle != 'ClearSpeak'" @@ -724,7 +724,7 @@ - test: if: "$Verbosity!='Terse' and not(parent::m:set)" # "the set x is an element of ..." sounds bad then: [T: "jest"] - - t: "element zbioru" + - T: "element zbioru" # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option else_test: if: "../../self::m:set or ../../../self::m:set" # inside a set @@ -732,32 +732,32 @@ - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' then: [T: "do"] - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "element zbioru"] + then: [T: "element zbioru"] - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "naleĆŒy do"] - - else: [t: "naleĆŒÄ…ce do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + then: [T: "naleĆŒy do"] + - else: [T: "naleĆŒÄ…ce do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' else_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "jest elementem zbioru"] + then: [T: "jest elementem zbioru"] - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "jest elementem zbioru"] + then: [T: "jest elementem zbioru"] - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "naleĆŒy do"] - - else: [t: "naleĆŒy do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' - - "∋": [t: "zawiera element"] # 0x220b - - "∌": [t: "nie zawiera elementu"] # 0x220c - - "∍": [t: "zawiera element"] # 0x220d - - "∎": [t: "koniec dowodu"] # 0x220e + then: [T: "naleĆŒy do"] + - else: [T: "naleĆŒy do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + - "∋": [T: "zawiera element"] # 0x220b + - "∌": [T: "nie zawiera elementu"] # 0x220c + - "∍": [T: "zawiera element"] # 0x220d + - "∎": [T: "koniec dowodu"] # 0x220e - "∏": [T: "iloczyn"] # 0x220f - - "∐": [t: "koprodukt"] # 0x2210 + - "∐": [T: "koprodukt"] # 0x2210 - "∑": [T: "suma"] # 0x2211 - "−": [T: "minus"] # 0x2212 - "∓": [T: "minus plus"] # 0x2213 - - "∔": [t: "kropka plus"] # 0x2214 + - "∔": [T: "kropka plus"] # 0x2214 - "∕": [T: "podzielone przez"] # 0x2215 - - "∖": [t: "zbiĂłr minus"] # 0x2216 + - "∖": [T: "zbiĂłr minus"] # 0x2216 - "∗": [T: "razy"] # 0x2217 - - "∘": [t: "zƂoĆŒone z"] # 0x2218 + - "∘": [T: "zƂoĆŒone z"] # 0x2218 - "∙": # 0x2219 - test: if: "@data-chem-formula-op" @@ -765,71 +765,71 @@ else: [T: "razy"] - "√": # 0x221a - - t: "pierwiastek kwadratowy z" + - T: "pierwiastek kwadratowy z" - "∛": # 0x221b - - t: "pierwiastek szeƛcienny z" + - T: "pierwiastek szeƛcienny z" - "∜": # 0x221c - - t: "czwarty pierwiastek z" + - T: "czwarty pierwiastek z" - "∝": # 0x221d - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "proporcjonalne do" + - T: "proporcjonalne do" - "∞": - test: if: "ancestor::*[self::m:limit or self::m:limit-sup or self::m:limit-inf or self::m:large-op]" then: [T: "nieskoƄczonoƛci"] else: [T: "nieskoƄczonoƛć"] # 0x221e - - "∟": [t: "kąt prosty"] # 0x221f - - "∠": [t: "kąt"] # 0x2220 - - "∥": [t: "kąt mierzony"] # 0x2221 - - "∹": [t: "kąt sferyczny"] # 0x2222 + - "∟": [T: "kąt prosty"] # 0x221f + - "∠": [T: "kąt"] # 0x2220 + - "∥": [T: "kąt mierzony"] # 0x2221 + - "∹": [T: "kąt sferyczny"] # 0x2222 - "∣": [T: "dzieli"] # 0x2223 - - "∀": [t: "nie dzieli"] # 0x2224 + - "∀": [T: "nie dzieli"] # 0x2224 - "∧": [T: "i"] # 0x2227 - "√": [T: "lub"] # 0x2228 - "∩": [T: "przecięcie"] # 0x2229 - "âˆȘ": [T: "suma zbiorĂłw"] # 0x222a - "∫": [T: "caƂka"] # 0x222b - - "∏": [t: "caƂka podwĂłjna"] # 0x222c - - "∭": [t: "caƂka potrĂłjna"] # 0x222d - - "∟": [t: "caƂka krzywoliniowa"] # 0x222e - - "∯": [t: "caƂka powierzchniowa"] # 0x222f - - "∰": [t: "caƂka objętoƛciowa"] # 0x2230 - - "∱": [t: "caƂka zgodnie z ruchem wskazĂłwek zegara"] # 0x2231 - - "âˆČ": [t: "caƂka krzywoliniowa zgodnie z ruchem wskazĂłwek zegara"] # 0x2232 - - "∳": [t: "caƂka krzywoliniowa przeciwnie do ruchu wskazĂłwek zegara"] # 0x2233 - - "∎": [t: "zatem"] # 0x2234 - - "∔": [t: "poniewaĆŒ"] # 0x2235 + - "∏": [T: "caƂka podwĂłjna"] # 0x222c + - "∭": [T: "caƂka potrĂłjna"] # 0x222d + - "∟": [T: "caƂka krzywoliniowa"] # 0x222e + - "∯": [T: "caƂka powierzchniowa"] # 0x222f + - "∰": [T: "caƂka objętoƛciowa"] # 0x2230 + - "∱": [T: "caƂka zgodnie z ruchem wskazĂłwek zegara"] # 0x2231 + - "âˆČ": [T: "caƂka krzywoliniowa zgodnie z ruchem wskazĂłwek zegara"] # 0x2232 + - "∳": [T: "caƂka krzywoliniowa przeciwnie do ruchu wskazĂłwek zegara"] # 0x2233 + - "∎": [T: "zatem"] # 0x2234 + - "∔": [T: "poniewaĆŒ"] # 0x2235 - "∶": # 0x2236 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - T: "do" - - "∷": [t: "jako"] # 0x2237 - - "∞": [t: "kropka minus"] # 0x2238 - - "âˆč": [t: "ma nadmiar względem"] # 0x2239 + - "∷": [T: "jako"] # 0x2237 + - "∞": [T: "kropka minus"] # 0x2238 + - "âˆč": [T: "ma nadmiar względem"] # 0x2239 - "âˆș": # 0x223a - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "geometrycznie proporcjonalne do" + - T: "geometrycznie proporcjonalne do" - "∻": # 0x223b - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "homotetyczne do" - - "∌": [t: "tylda"] # 0x223c - - "∜": [t: "odwrĂłcona tylda"] # 0x223d + - T: "homotetyczne do" + - "∌": [T: "tylda"] # 0x223c + - "∜": [T: "odwrĂłcona tylda"] # 0x223d - "∟": # 0x223e - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "most dodatnie" - - "∿": [t: "fala sinusoidalna"] # 0x223f - - "≀": [t: "iloczyn wieƄcowy"] # 0x2240 - - "≁": [t: "nie jest podobne"] # 0x2241 - - "≂": [t: "minus tylda"] # 0x2242 + - T: "most dodatnie" + - "∿": [T: "fala sinusoidalna"] # 0x223f + - "≀": [T: "iloczyn wieƄcowy"] # 0x2240 + - "≁": [T: "nie jest podobne"] # 0x2241 + - "≂": [T: "minus tylda"] # 0x2242 - "≃": # 0x2243 - test: if: "$Verbosity!='Terse'" @@ -844,7 +844,7 @@ - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "przystające do" + - T: "przystające do" - "≆": # 0x2246 - test: if: "$Verbosity!='Terse'" @@ -854,7 +854,7 @@ - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "nie przystające do" + - T: "nie przystające do" - "≈": # 0x2248 - test: if: "$Verbosity!='Terse'" @@ -870,21 +870,21 @@ if: "$Verbosity!='Terse'" then: [T: "jest"] - T: "w przybliĆŒeniu rĂłwne lub rĂłwne" - - "≋": [t: "potrĂłjny tylda"] # 0x224b + - "≋": [T: "potrĂłjny tylda"] # 0x224b - "≌": [T: "wszystkie rĂłwne"] # 0x224c - "≍": # 0x224d - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "RĂłwnowaĆŒne" + - T: "RĂłwnowaĆŒne" - "≎": # 0x224e - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - T: "geometrycznie rĂłwnowaĆŒne" - "≏": # 0x224f - - t: "rĂłĆŒnica między" - - "≐": [t: "dÄ…ĆŒy do granicy"] # 0x2250 + - T: "rĂłĆŒnica między" + - "≐": [T: "dÄ…ĆŒy do granicy"] # 0x2250 - "≑": # 0x2251 - test: if: "$Verbosity!='Terse'" @@ -898,32 +898,32 @@ - "≓": # 0x2253 - test: if: "$Verbosity!='Terse'" - then: [t: "jest"] + then: [T: "jest"] - T: "obrazem lub w przybliĆŒeniu rĂłwne" - - "≔": [t: "dwukropek rĂłwna się"] # 0x2254 - - "≕": [t: "rĂłwna się dwukropek"] # 0x2255 - - "≖": [t: "pierƛcieƄ w znaku rĂłwnoƛci"] # 0x2256 + - "≔": [T: "dwukropek rĂłwna się"] # 0x2254 + - "≕": [T: "rĂłwna się dwukropek"] # 0x2255 + - "≖": [T: "pierƛcieƄ w znaku rĂłwnoƛci"] # 0x2256 - "≗": # 0x2257 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - T: "w przybliĆŒeniu rĂłwne" - - "≘": [t: "odpowiada"] # 0x2258 - - "≙": [t: "estymuje"] # 0x2259 + - "≘": [T: "odpowiada"] # 0x2258 + - "≙": [T: "estymuje"] # 0x2259 - "≚": # 0x225a - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "rĂłwnokątne do" - - "≛": [t: "gwiazda rĂłwna się"] # 0x225b - - "≜": [t: "delta rĂłwna się"] # 0x225c - - "≝": [t: "jest z definicji rĂłwne"] # 0x225d + - T: "rĂłwnokątne do" + - "≛": [T: "gwiazda rĂłwna się"] # 0x225b + - "≜": [T: "delta rĂłwna się"] # 0x225c + - "≝": [T: "jest z definicji rĂłwne"] # 0x225d - "≞": # 0x225e - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "mierzone na" - - "≟": [t: "ma nieznaną relację z"] # 0x225f + - T: "mierzone na" + - "≟": [T: "ma nieznaną relację z"] # 0x225f - "≠": # 0x2260 - test: if: "$Verbosity!='Terse'" @@ -933,209 +933,209 @@ - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "identyczne z" + - T: "identyczne z" - "≱": # 0x2262 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "nie identyczne z" + - T: "nie identyczne z" - "≣": # 0x2263 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "ƛciƛle rĂłwnowaĆŒne" - - "≩": [t: "mniejsze nad rĂłwne"] # 0x2266 - - "≧": [t: "większe nad rĂłwne"] # 0x2267 + - T: "ƛciƛle rĂłwnowaĆŒne" + - "≩": [T: "mniejsze nad rĂłwne"] # 0x2266 + - "≧": [T: "większe nad rĂłwne"] # 0x2267 - "≹": # 0x2268 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "mniejsze niĆŒ ale nie rĂłwna się" + - T: "mniejsze niĆŒ ale nie rĂłwna się" - "≩": # 0x2269 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "większe niĆŒ ale nie rĂłwna się" + - T: "większe niĆŒ ale nie rĂłwna się" - "â‰Ș": # 0x226a - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "znacznie mniejsze niĆŒ" + - T: "znacznie mniejsze niĆŒ" - "≫": # 0x226b - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "znacznie większe niĆŒ" + - T: "znacznie większe niĆŒ" - "≬": # 0x226c - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "między" + - T: "między" - "≭": # 0x226d - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "nie rĂłwnowaĆŒne" + - T: "nie rĂłwnowaĆŒne" - "≼": # 0x226e - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "nie mniejsze niĆŒ" + - T: "nie mniejsze niĆŒ" - "≯": # 0x226f - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "nie większe niĆŒ" + - T: "nie większe niĆŒ" - "≰": # 0x2270 - - t: "nie jest mniejsze ani rĂłwne" + - T: "nie jest mniejsze ani rĂłwne" - "≱": # 0x2271 - - t: "nie jest większe ani rĂłwne" + - T: "nie jest większe ani rĂłwne" - "â‰Č": # 0x2272 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "mniejsze niĆŒ lub rĂłwnowaĆŒne" + - T: "mniejsze niĆŒ lub rĂłwnowaĆŒne" - "≳": # 0x2273 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "większe niĆŒ lub rĂłwnowaĆŒne" + - T: "większe niĆŒ lub rĂłwnowaĆŒne" - "≮": # 0x2274 - - t: "nie jest mniejsze ani rĂłwnowaĆŒne" + - T: "nie jest mniejsze ani rĂłwnowaĆŒne" - "≔": # 0x2275 - - t: "nie jest większe ani rĂłwnowaĆŒne" + - T: "nie jest większe ani rĂłwnowaĆŒne" - "≶": # 0x2276 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "mniejsze lub większe niĆŒ" + - T: "mniejsze lub większe niĆŒ" - "≷": # 0x2277 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "większe lub mniejsze niĆŒ" + - T: "większe lub mniejsze niĆŒ" - "≾": # 0x2278 - - t: "nie jest mniejsze ani większe niĆŒ" + - T: "nie jest mniejsze ani większe niĆŒ" - "â‰č": # 0x2279 - - t: "nie jest większe ani mniejsze niĆŒ" - - "â‰ș": [t: "poprzedza"] # 0x227a - - "≻": [t: "następuje po"] # 0x227b + - T: "nie jest większe ani mniejsze niĆŒ" + - "â‰ș": [T: "poprzedza"] # 0x227a + - "≻": [T: "następuje po"] # 0x227b - "≌": [T: "poprzedza lub jest rĂłwne"] # 0x227c - "≜": [T: "następuje po lub jest rĂłwne"] # 0x227d - - "≟": [t: "poprzedza lub jest rĂłwnowaĆŒne"] # 0x227e - - "≿": [t: "następuje po lub jest rĂłwnowaĆŒne"] # 0x227f + - "≟": [T: "poprzedza lub jest rĂłwnowaĆŒne"] # 0x227e + - "≿": [T: "następuje po lub jest rĂłwnowaĆŒne"] # 0x227f - "⊀": [T: "nie poprzedza"] # 0x2280 - "⊁": [T: "nie następuje po"] # 0x2281 - "⊂": # 0x2282 - test: if: "$Verbosity!='Terse'" - then: [t: "jest"] - - t: "podzbiĂłr" + then: [T: "jest"] + - T: "podzbiĂłr" - "⊃": # 0x2283 - test: if: "$Verbosity!='Terse'" - then: [t: "jest"] - - t: "nadzbiĂłr" + then: [T: "jest"] + - T: "nadzbiĂłr" - "⊄": # 0x2284 - - t: "nie jest podzbiorem" + - T: "nie jest podzbiorem" - "⊅": # 0x2285 - - t: "nie jest nadzbiorem" + - T: "nie jest nadzbiorem" - "⊆": # 0x2286 - test: if: "$Verbosity!='Terse'" - then: [t: "jest"] - - t: "podzbiĂłr lub rĂłwny" + then: [T: "jest"] + - T: "podzbiĂłr lub rĂłwny" - "⊇": # 0x2287 - test: if: "$Verbosity!='Terse'" - then: [t: "jest"] - - t: "nadzbiĂłr lub rĂłwny" + then: [T: "jest"] + - T: "nadzbiĂłr lub rĂłwny" - "⊈": # 0x2288 - - t: "nie jest podzbiorem ani nie jest rĂłwne" + - T: "nie jest podzbiorem ani nie jest rĂłwne" - "⊉": # 0x2289 - - t: "nie jest nadzbiorem ani nie jest rĂłwne" - - "⊊": [t: "podzbiĂłr z nie rĂłwna się"] # 0x228a - - "⊋": [t: "nadzbiĂłr z nie rĂłwna się"] # 0x228b - - "⊌": [t: "wielozbiĂłr"] # 0x228c - - "⊍": [t: "mnoĆŒenie wielozbiorĂłw"] # 0x228d - - "⊎": [t: "suma wielozbiorĂłw"] # 0x228e + - T: "nie jest nadzbiorem ani nie jest rĂłwne" + - "⊊": [T: "podzbiĂłr z nie rĂłwna się"] # 0x228a + - "⊋": [T: "nadzbiĂłr z nie rĂłwna się"] # 0x228b + - "⊌": [T: "wielozbiĂłr"] # 0x228c + - "⊍": [T: "mnoĆŒenie wielozbiorĂłw"] # 0x228d + - "⊎": [T: "suma wielozbiorĂłw"] # 0x228e - "⊏": [T: "kwadratowo poprzedza"] # 0x228f - "⊐": [T: "kwadratowo następuje po"] # 0x2290 - "⊑": [T: "kwadratowo poprzedza lub jest rĂłwne"] # 0x2291 - "⊒": [T: "kwadratowo następuje po lub jest rĂłwne"] # 0x2292 - - "⊓": [t: "kwadratowa częƛć wspĂłlna"] # 0x2293 - - "⊔": [t: "kwadratowa suma zbiorĂłw"] # 0x2294 - - "⊕": [t: "w kóƂku plus"] # 0x2295 - - "⊖": [t: "w kóƂku minus"] # 0x2296 - - "⊗": [t: "w kóƂku razy"] # 0x2297 - - "⊘": [t: "w kóƂku ukoƛnik"] # 0x2298 - - "⊙": [t: "kropka w kóƂku"] # 0x2299 - - "⊚": [t: "pierƛcieƄ w kóƂku"] # 0x229a - - "⊛": [t: "gwiazdka w kóƂku"] # 0x229b - - "⊜": [t: "rĂłwna się w kóƂku"] # 0x229c - - "⊝": [t: "kreska w kóƂku"] # 0x229d - - "⊞": [t: "plus w kwadracie"] # 0x229e - - "⊟": [t: "minus w kwadracie"] # 0x229f - - "⊠": [t: "razy w kwadracie"] # 0x22a0 - - "⊡": [t: "kropka w kwadracie"] # 0x22a1 - - "⊱": [t: "dowodzi"] # 0x22a2 - - "⊣": [t: "jest dowodzone przez"] # 0x22a3 - - "⊀": [t: "gĂłra"] # 0x22a4 - - "⊩": [t: "redukuje się do"] # 0x22a6 - - "⊧": [t: "modeluje"] # 0x22a7 + - "⊓": [T: "kwadratowa częƛć wspĂłlna"] # 0x2293 + - "⊔": [T: "kwadratowa suma zbiorĂłw"] # 0x2294 + - "⊕": [T: "w kóƂku plus"] # 0x2295 + - "⊖": [T: "w kóƂku minus"] # 0x2296 + - "⊗": [T: "w kóƂku razy"] # 0x2297 + - "⊘": [T: "w kóƂku ukoƛnik"] # 0x2298 + - "⊙": [T: "kropka w kóƂku"] # 0x2299 + - "⊚": [T: "pierƛcieƄ w kóƂku"] # 0x229a + - "⊛": [T: "gwiazdka w kóƂku"] # 0x229b + - "⊜": [T: "rĂłwna się w kóƂku"] # 0x229c + - "⊝": [T: "kreska w kóƂku"] # 0x229d + - "⊞": [T: "plus w kwadracie"] # 0x229e + - "⊟": [T: "minus w kwadracie"] # 0x229f + - "⊠": [T: "razy w kwadracie"] # 0x22a0 + - "⊡": [T: "kropka w kwadracie"] # 0x22a1 + - "⊱": [T: "dowodzi"] # 0x22a2 + - "⊣": [T: "jest dowodzone przez"] # 0x22a3 + - "⊀": [T: "gĂłra"] # 0x22a4 + - "⊩": [T: "redukuje się do"] # 0x22a6 + - "⊧": [T: "modeluje"] # 0x22a7 - "⊹": # 0x22a8 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "prawdziwe" - - "⊩": [t: "wymusza"] # 0x22a9 - - "âŠȘ": [t: "potrĂłjna pionowa kreska z prawym znacznikiem dedukcji"] # 0x22aa - - "⊫": [t: "podwĂłjna pionowa kreska z podwĂłjnym prawym znacznikiem dedukcji"] # 0x22ab - - "⊬": [t: "nie dowodzi"] # 0x22ac + - T: "prawdziwe" + - "⊩": [T: "wymusza"] # 0x22a9 + - "âŠȘ": [T: "potrĂłjna pionowa kreska z prawym znacznikiem dedukcji"] # 0x22aa + - "⊫": [T: "podwĂłjna pionowa kreska z podwĂłjnym prawym znacznikiem dedukcji"] # 0x22ab + - "⊬": [T: "nie dowodzi"] # 0x22ac - "⊭": # 0x22ad - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "nie jest prawdziwe" - - "⊼": [t: "nie wymusza"] # 0x22ae - - "⊯": [t: "zanegowana podwĂłjna pionowa kreska z podwĂłjnym prawym znacznikiem dedukcji"] # 0x22af - - "⊰": [t: "poprzedza pod relacją"] # 0x22b0 - - "⊱": [t: "następuje po pod relacją"] # 0x22b1 + - T: "nie jest prawdziwe" + - "⊼": [T: "nie wymusza"] # 0x22ae + - "⊯": [T: "zanegowana podwĂłjna pionowa kreska z podwĂłjnym prawym znacznikiem dedukcji"] # 0x22af + - "⊰": [T: "poprzedza pod relacją"] # 0x22b0 + - "⊱": [T: "następuje po pod relacją"] # 0x22b1 - "âŠČ": # 0x22b2 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "normalną podgrupą" - - "⊳": [t: "zawiera jako normalną podgrupę"] # 0x22b3 + - T: "normalną podgrupą" + - "⊳": [T: "zawiera jako normalną podgrupę"] # 0x22b3 - "⊮": # 0x22b4 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "normalną podgrupą lub rĂłwne" - - "⊔": [t: "zawiera jako normalną podgrupę lub jest rĂłwne"] # 0x22b5 + - T: "normalną podgrupą lub rĂłwne" + - "⊔": [T: "zawiera jako normalną podgrupę lub jest rĂłwne"] # 0x22b5 - "⊶": # 0x22b6 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "oryginaƂem" + - T: "oryginaƂem" - "⊷": # 0x22b7 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "obrazem" - - "⊾": [t: "multimapa"] # 0x22b8 - - "âŠč": [t: "macierz sprzÄ™ĆŒona hermitowsko"] # 0x22b9 - - "âŠș": [t: "interkalacja"] # 0x22ba - - "⊻": [t: "alternatywa wykluczająca"] # 0x22bb - - "⊌": [t: "negacja koniunkcji"] # 0x22bc - - "⊜": [t: "negacja alternatywy"] # 0x22bd - - "⊟": [t: "kąt prosty z Ƃukiem"] # 0x22be - - "⊿": [t: "prawy trĂłjkąt"] # 0x22bf - - "⋀": [t: "logiczne I"] # 0x22c0 - - "⋁": [t: "logiczne lub"] # 0x22c1 + - T: "obrazem" + - "⊾": [T: "multimapa"] # 0x22b8 + - "âŠč": [T: "macierz sprzÄ™ĆŒona hermitowsko"] # 0x22b9 + - "âŠș": [T: "interkalacja"] # 0x22ba + - "⊻": [T: "alternatywa wykluczająca"] # 0x22bb + - "⊌": [T: "negacja koniunkcji"] # 0x22bc + - "⊜": [T: "negacja alternatywy"] # 0x22bd + - "⊟": [T: "kąt prosty z Ƃukiem"] # 0x22be + - "⊿": [T: "prawy trĂłjkąt"] # 0x22bf + - "⋀": [T: "logiczne I"] # 0x22c0 + - "⋁": [T: "logiczne lub"] # 0x22c1 - "⋂": [T: "przecięcie"] # 0x22c2 - "⋃": [T: "suma zbiorĂłw"] # 0x22c3 - - "⋄": [t: "operator rombu"] # 0x22c4 + - "⋄": [T: "operator rombu"] # 0x22c4 - "⋅": # 0x22c5 - test: if: "@data-chem-formula-op" @@ -1143,520 +1143,520 @@ else: [T: "razy"] - "⋆": [T: "razy"] # 0x22c6 - - "⋇": [t: "znak dzielenia razy"] # 0x22c7 - - "⋈": [t: "muszka"] # 0x22c8 + - "⋇": [T: "znak dzielenia razy"] # 0x22c7 + - "⋈": [T: "muszka"] # 0x22c8 - "⋉": # 0x22c9 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "lewym iloczynem póƂprostym z czynnikiem normalnym" + - T: "lewym iloczynem póƂprostym z czynnikiem normalnym" - "⋊": # 0x22ca - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "prawym iloczynem póƂprostym z czynnikiem normalnym" + - T: "prawym iloczynem póƂprostym z czynnikiem normalnym" - "⋋": # 0x22cb - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "lewym iloczynem póƂprostym" + - T: "lewym iloczynem póƂprostym" - "⋌": # 0x22cc - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "prawym iloczynem póƂprostym" - - "⋍": [t: "odwrĂłcona tylda rĂłwna się"] # 0x22cd - - "⋎": [t: "zakręcone logiczne lub"] # 0x22ce - - "⋏": [t: "zakręcone logiczne i"] # 0x22cf + - T: "prawym iloczynem póƂprostym" + - "⋍": [T: "odwrĂłcona tylda rĂłwna się"] # 0x22cd + - "⋎": [T: "zakręcone logiczne lub"] # 0x22ce + - "⋏": [T: "zakręcone logiczne i"] # 0x22cf - "⋐": # 0x22d0 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "podwĂłjnym podzbiorem" + - T: "podwĂłjnym podzbiorem" - "⋑": # 0x22d1 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "podwĂłjnym nadzbiorem" + - T: "podwĂłjnym nadzbiorem" - "⋒": # 0x22d2 - - t: "podwĂłjna częƛć wspĂłlna" + - T: "podwĂłjna częƛć wspĂłlna" - "⋓": # 0x22d3 - - t: "podwĂłjna suma zbiorĂłw" + - T: "podwĂłjna suma zbiorĂłw" - "⋔": # 0x22d4 - - t: "wƂaƛciwa częƛć wspĂłlna" + - T: "wƂaƛciwa częƛć wspĂłlna" - "⋕": # 0x22d5 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "rĂłwne i rĂłwnolegƂe do" - - "⋖": [t: "mniejsze niĆŒ z kropką"] # 0x22d6 - - "⋗": [t: "większe niĆŒ z kropką"] # 0x22d7 + - T: "rĂłwne i rĂłwnolegƂe do" + - "⋖": [T: "mniejsze niĆŒ z kropką"] # 0x22d6 + - "⋗": [T: "większe niĆŒ z kropką"] # 0x22d7 - "⋘": # 0x22d8 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "bardzo znacznie mniejsze niĆŒ" + - T: "bardzo znacznie mniejsze niĆŒ" - "⋙": # 0x22d9 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "bardzo znacznie większe niĆŒ" + - T: "bardzo znacznie większe niĆŒ" - "⋚": # 0x22da - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "mniejsze niĆŒ, rĂłwne lub większe niĆŒ" + - T: "mniejsze niĆŒ, rĂłwne lub większe niĆŒ" - "⋛": # 0x22db - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "większe niĆŒ, rĂłwne lub mniejsze niĆŒ" + - T: "większe niĆŒ, rĂłwne lub mniejsze niĆŒ" - "⋜": # 0x22dc - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "rĂłwne lub mniejsze niĆŒ" + - T: "rĂłwne lub mniejsze niĆŒ" - "⋝": # 0x22dd - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "rĂłwne lub większe niĆŒ" + - T: "rĂłwne lub większe niĆŒ" - "⋞": # 0x22de - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "rĂłwne lub poprzedza" + - T: "rĂłwne lub poprzedza" - "⋟": # 0x22df - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "rĂłwne lub następuje po" - - "⋠": [t: "nie poprzedza ani nie jest rĂłwne"] # 0x22e0 - - "⋡": [t: "nie następuje po ani nie jest rĂłwne"] # 0x22e1 - - "⋱": [t: "nie poprzedza kwadratowo ani nie jest rĂłwne"] # 0x22e2 - - "⋣": [t: "nie następuje kwadratowo po ani nie jest rĂłwne"] # 0x22e3 - - "â‹€": [t: "poprzedza kwadratowo, ale nie jest rĂłwne"] # 0x22e4 - - "â‹„": [t: "następuje kwadratowo po, ale nie jest rĂłwne"] # 0x22e5 + - T: "rĂłwne lub następuje po" + - "⋠": [T: "nie poprzedza ani nie jest rĂłwne"] # 0x22e0 + - "⋡": [T: "nie następuje po ani nie jest rĂłwne"] # 0x22e1 + - "⋱": [T: "nie poprzedza kwadratowo ani nie jest rĂłwne"] # 0x22e2 + - "⋣": [T: "nie następuje kwadratowo po ani nie jest rĂłwne"] # 0x22e3 + - "â‹€": [T: "poprzedza kwadratowo, ale nie jest rĂłwne"] # 0x22e4 + - "â‹„": [T: "następuje kwadratowo po, ale nie jest rĂłwne"] # 0x22e5 - "⋩": # 0x22e6 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "mniejsze niĆŒ, ale nie rĂłwnowaĆŒne" + - T: "mniejsze niĆŒ, ale nie rĂłwnowaĆŒne" - "⋧": # 0x22e7 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "większe niĆŒ, ale nie rĂłwnowaĆŒne" - - "⋹": [t: "poprzedza, ale nie jest rĂłwnowaĆŒne"] # 0x22e8 - - "⋩": [t: "następuje po, ale nie jest rĂłwnowaĆŒne"] # 0x22e9 + - T: "większe niĆŒ, ale nie rĂłwnowaĆŒne" + - "⋹": [T: "poprzedza, ale nie jest rĂłwnowaĆŒne"] # 0x22e8 + - "⋩": [T: "następuje po, ale nie jest rĂłwnowaĆŒne"] # 0x22e9 - "â‹Ș": # 0x22ea - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "nie jest normalną podgrupą" - - "⋫": [t: "nie zawiera jako normalnej podgrupy"] # 0x22eb + - T: "nie jest normalną podgrupą" + - "⋫": [T: "nie zawiera jako normalnej podgrupy"] # 0x22eb - "⋬": # 0x22ec - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "nie jest normalną podgrupą ani rĂłwne" - - "⋭": [t: "nie zawiera jako normalnej podgrupy ani rĂłwne"] # 0x22ed - - "⋼": [t: "pionowy wielokropek"] # 0x22ee - - "⋯": [t: "trzy kropki"] # 0x22ef - - "⋰": [t: "ukoƛny wielokropek w gĂłrę"] # 0x22f0 - - "⋱": [t: "ukoƛny wielokropek w dóƂ"] # 0x22f1 - - "â‹Č": [t: "naleĆŒy do z dƂugą poziomą kreską"] # 0x22f2 - - "⋳": [t: "naleĆŒy do z pionową kreską na koƄcu i poziomą kreską"] # 0x22f3 - - "⋮": [t: "naleĆŒy do z pionową kreską na koƄcu i poziomą kreską"] # 0x22f4 - - "â‹”": [t: "naleĆŒy do z kropką nad"] # 0x22f5 - - "⋶": [t: "naleĆŒy do z kreską nad"] # 0x22f6 - - "⋷": [t: "naleĆŒy do z kreską nad"] # 0x22f7 - - "⋾": [t: "naleĆŒy do z podkreƛleniem"] # 0x22f8 - - "â‹č": [t: "naleĆŒy do z dwiema poziomymi kreskami"] # 0x22f9 - - "â‹ș": [t: "zawiera z dƂugą poziomą kreską"] # 0x22fa - - "⋻": [t: "zawiera z pionową kreską na koƄcu i poziomą kreską"] # 0x22fb - - "⋌": [t: "zawiera z pionową kreską na koƄcu i poziomą kreską"] # 0x22fc - - "⋜": [t: "zawiera z kreską nad"] # 0x22fd - - "⋟": [t: "zawiera z kreską nad"] # 0x22fe - - "⋿": [t: "przynaleĆŒnoƛć do wielozbioru w notacji Z"] # 0x22ff - - "⌀": [t: "znak ƛrednicy"] # 0x2300 - - "⌁": [t: "strzaƂka elektryczna"] # 0x2301 - - "⌂": [t: "dom"] # 0x2302 - - "⌃": [t: "gĂłrny grot strzaƂki"] # 0x2303 - - "⌄": [t: "dolny grot strzaƂki"] # 0x2304 - - "⌅": [t: "rzutowy"] # 0x2305 - - "⌆": [t: "perspektywiczny"] # 0x2306 - - "⌇": [t: "linia falista"] # 0x2307 - - "⌈": [t: "lewy sufit"] # 0x2308 - - "⌉": [t: "prawy sufit"] # 0x2309 - - "⌊": [t: "lewa podƂoga"] # 0x230a - - "⌋": [t: "prawa podƂoga"] # 0x230b - - "⌌": [t: "dolny prawy znacznik kadrowania"] # 0x230c - - "⌍": [t: "dolny lewy znacznik kadrowania"] # 0x230d - - "⌎": [t: "gĂłrny prawy znacznik kadrowania"] # 0x230e - - "⌏": [t: "gĂłrny lewy znacznik kadrowania"] # 0x230f - - "⌐": [t: "odwrĂłcony nie znak"] # 0x2310 - - "⌑": [t: "kwadrat romb"] # 0x2311 + - T: "nie jest normalną podgrupą ani rĂłwne" + - "⋭": [T: "nie zawiera jako normalnej podgrupy ani rĂłwne"] # 0x22ed + - "⋼": [T: "pionowy wielokropek"] # 0x22ee + - "⋯": [T: "trzy kropki"] # 0x22ef + - "⋰": [T: "ukoƛny wielokropek w gĂłrę"] # 0x22f0 + - "⋱": [T: "ukoƛny wielokropek w dóƂ"] # 0x22f1 + - "â‹Č": [T: "naleĆŒy do z dƂugą poziomą kreską"] # 0x22f2 + - "⋳": [T: "naleĆŒy do z pionową kreską na koƄcu i poziomą kreską"] # 0x22f3 + - "⋮": [T: "naleĆŒy do z pionową kreską na koƄcu i poziomą kreską"] # 0x22f4 + - "â‹”": [T: "naleĆŒy do z kropką nad"] # 0x22f5 + - "⋶": [T: "naleĆŒy do z kreską nad"] # 0x22f6 + - "⋷": [T: "naleĆŒy do z kreską nad"] # 0x22f7 + - "⋾": [T: "naleĆŒy do z podkreƛleniem"] # 0x22f8 + - "â‹č": [T: "naleĆŒy do z dwiema poziomymi kreskami"] # 0x22f9 + - "â‹ș": [T: "zawiera z dƂugą poziomą kreską"] # 0x22fa + - "⋻": [T: "zawiera z pionową kreską na koƄcu i poziomą kreską"] # 0x22fb + - "⋌": [T: "zawiera z pionową kreską na koƄcu i poziomą kreską"] # 0x22fc + - "⋜": [T: "zawiera z kreską nad"] # 0x22fd + - "⋟": [T: "zawiera z kreską nad"] # 0x22fe + - "⋿": [T: "przynaleĆŒnoƛć do wielozbioru w notacji Z"] # 0x22ff + - "⌀": [T: "znak ƛrednicy"] # 0x2300 + - "⌁": [T: "strzaƂka elektryczna"] # 0x2301 + - "⌂": [T: "dom"] # 0x2302 + - "⌃": [T: "gĂłrny grot strzaƂki"] # 0x2303 + - "⌄": [T: "dolny grot strzaƂki"] # 0x2304 + - "⌅": [T: "rzutowy"] # 0x2305 + - "⌆": [T: "perspektywiczny"] # 0x2306 + - "⌇": [T: "linia falista"] # 0x2307 + - "⌈": [T: "lewy sufit"] # 0x2308 + - "⌉": [T: "prawy sufit"] # 0x2309 + - "⌊": [T: "lewa podƂoga"] # 0x230a + - "⌋": [T: "prawa podƂoga"] # 0x230b + - "⌌": [T: "dolny prawy znacznik kadrowania"] # 0x230c + - "⌍": [T: "dolny lewy znacznik kadrowania"] # 0x230d + - "⌎": [T: "gĂłrny prawy znacznik kadrowania"] # 0x230e + - "⌏": [T: "gĂłrny lewy znacznik kadrowania"] # 0x230f + - "⌐": [T: "odwrĂłcony nie znak"] # 0x2310 + - "⌑": [T: "kwadrat romb"] # 0x2311 - "⌒": [T: "Ƃuk"] # 0x2312 - - "⌓": [t: "odcinek"] # 0x2313 - - "⌔": [t: "sektor"] # 0x2314 - - "⌕": [t: "rejestrator telefoniczny"] # 0x2315 - - "⌖": [t: "celownik wskaĆșnika pozycji"] # 0x2316 - - "⌗": [t: "kwadrat danych ekranowych"] # 0x2317 - - "⌘": [t: "znak miejsca zainteresowania"] # 0x2318 - - "⌙": [t: "odwrĂłcony nie znak"] # 0x2319 - - "⌚": [t: "zegarek"] # 0x231a - - "⌛": [t: "klepsydra"] # 0x231b - - "⌜": [t: "gĂłrny lewy naroĆŒnik"] # 0x231c - - "⌝": [t: "gĂłrny prawy naroĆŒnik"] # 0x231d - - "⌞": [t: "dolny lewy naroĆŒnik"] # 0x231e - - "⌟": [t: "dolny prawy naroĆŒnik"] # 0x231f - - "⌠": [t: "gĂłrna poƂowa caƂki"] # 0x2320 - - "⌡": [t: "dolna poƂowa caƂki"] # 0x2321 - - "⌱": [t: "Ƃuk w dóƂ"] # 0x2322 - - "⌣": [t: "Ƃuk w gĂłrę"] # 0x2323 - - "⌀": [t: "gĂłrny grot strzaƂki między dwiema poziomymi kreskami"] # 0x2324 - - "⌄": [t: "klawisz opcji"] # 0x2325 - - "〈": [t: "wymaĆŒ w prawo"] # 0x2326 - - "⌧": [t: "X w prostokątnej ramce"] # 0x2327 - - "⌹": [t: "klawiatura"] # 0x2328 - - "〈": [t: "kąt skierowany w lewo nawias kwadratowy"] # 0x2329 - - "âŒȘ": [t: "kąt skierowany w prawo nawias kwadratowy"] # 0x232a - - "⌫": [t: "wymaĆŒ w lewo"] # 0x232b - - "⌬": [t: "pierƛcieƄ benzenowy"] # 0x232c - - "⌭": [t: "walcowoƛć"] # 0x232d - - "⌼": [t: "profil dookoƂa"] # 0x232e - - "⌯": [t: "symetria"] # 0x232f - - "⌰": [t: "bicie caƂkowite"] # 0x2330 - - "⌱": [t: "początek wymiarowania"] # 0x2331 - - "âŒČ": [t: "stoĆŒkowatoƛć"] # 0x2332 - - "⌳": [t: "nachylenie"] # 0x2333 - - "⌮": [t: "pogƂębienie walcowe"] # 0x2334 - - "⌔": [t: "pogƂębienie stoĆŒkowe"] # 0x2335 - - "⌶": [t: "belka i APL"] # 0x2336 - - "⌜": [t: "okrąg z kreską pionową APL"] # 0x233d - - "⌿": [t: "apl ukoƛnik kreska"] # 0x233f - - "⍰": [t: "nieznana ramka"] # 0x2370 - - "⍌": [t: "kąt prosty z dolną strzaƂką zygzakowatą"] # 0x237c - - "⎔": [t: "szeƛciokąt"] # 0x2394 - - "⎕": [t: "ramka"] # 0x2395 - - "⎶": [t: "dolny nawias kwadratowy nad gĂłrnym nawiasem kwadratowym"] # 0x23b6 - - "⏜": [t: "gĂłrny nawias"] # 0x23dc - - "⏝": [t: "dolny nawias"] # 0x23dd - - "⏞": [t: "gĂłrny nawias klamrowy"] # 0x23de - - "⏟": [t: "dolny nawias klamrowy"] # 0x23df - - "⏠": [t: "gĂłrny nawias skorupowy"] # 0x23e0 - - "⏡": [t: "dolny nawias skorupowy"] # 0x23e1 - - "⏱": [t: "biaƂy trapez"] # 0x23e2 - - "⏣": [t: "benzenowy pierƛcieƄ z okręgiem po prawej"] # 0x23e3 - - "⏀": [t: "prostoliniowoƛć"] # 0x23e4 - - "⏄": [t: "pƂaskoƛć"] # 0x23e5 - - "⏊": [t: "prąd przemienny"] # 0x23e6 - - "⏧": [t: "symbol elektrycznego przecięcia"] # 0x23e7 + - "⌓": [T: "odcinek"] # 0x2313 + - "⌔": [T: "sektor"] # 0x2314 + - "⌕": [T: "rejestrator telefoniczny"] # 0x2315 + - "⌖": [T: "celownik wskaĆșnika pozycji"] # 0x2316 + - "⌗": [T: "kwadrat danych ekranowych"] # 0x2317 + - "⌘": [T: "znak miejsca zainteresowania"] # 0x2318 + - "⌙": [T: "odwrĂłcony nie znak"] # 0x2319 + - "⌚": [T: "zegarek"] # 0x231a + - "⌛": [T: "klepsydra"] # 0x231b + - "⌜": [T: "gĂłrny lewy naroĆŒnik"] # 0x231c + - "⌝": [T: "gĂłrny prawy naroĆŒnik"] # 0x231d + - "⌞": [T: "dolny lewy naroĆŒnik"] # 0x231e + - "⌟": [T: "dolny prawy naroĆŒnik"] # 0x231f + - "⌠": [T: "gĂłrna poƂowa caƂki"] # 0x2320 + - "⌡": [T: "dolna poƂowa caƂki"] # 0x2321 + - "⌱": [T: "Ƃuk w dóƂ"] # 0x2322 + - "⌣": [T: "Ƃuk w gĂłrę"] # 0x2323 + - "⌀": [T: "gĂłrny grot strzaƂki między dwiema poziomymi kreskami"] # 0x2324 + - "⌄": [T: "klawisz opcji"] # 0x2325 + - "〈": [T: "wymaĆŒ w prawo"] # 0x2326 + - "⌧": [T: "X w prostokątnej ramce"] # 0x2327 + - "⌹": [T: "klawiatura"] # 0x2328 + - "〈": [T: "kąt skierowany w lewo nawias kwadratowy"] # 0x2329 + - "âŒȘ": [T: "kąt skierowany w prawo nawias kwadratowy"] # 0x232a + - "⌫": [T: "wymaĆŒ w lewo"] # 0x232b + - "⌬": [T: "pierƛcieƄ benzenowy"] # 0x232c + - "⌭": [T: "walcowoƛć"] # 0x232d + - "⌼": [T: "profil dookoƂa"] # 0x232e + - "⌯": [T: "symetria"] # 0x232f + - "⌰": [T: "bicie caƂkowite"] # 0x2330 + - "⌱": [T: "początek wymiarowania"] # 0x2331 + - "âŒČ": [T: "stoĆŒkowatoƛć"] # 0x2332 + - "⌳": [T: "nachylenie"] # 0x2333 + - "⌮": [T: "pogƂębienie walcowe"] # 0x2334 + - "⌔": [T: "pogƂębienie stoĆŒkowe"] # 0x2335 + - "⌶": [T: "belka i APL"] # 0x2336 + - "⌜": [T: "okrąg z kreską pionową APL"] # 0x233d + - "⌿": [T: "apl ukoƛnik kreska"] # 0x233f + - "⍰": [T: "nieznana ramka"] # 0x2370 + - "⍌": [T: "kąt prosty z dolną strzaƂką zygzakowatą"] # 0x237c + - "⎔": [T: "szeƛciokąt"] # 0x2394 + - "⎕": [T: "ramka"] # 0x2395 + - "⎶": [T: "dolny nawias kwadratowy nad gĂłrnym nawiasem kwadratowym"] # 0x23b6 + - "⏜": [T: "gĂłrny nawias"] # 0x23dc + - "⏝": [T: "dolny nawias"] # 0x23dd + - "⏞": [T: "gĂłrny nawias klamrowy"] # 0x23de + - "⏟": [T: "dolny nawias klamrowy"] # 0x23df + - "⏠": [T: "gĂłrny nawias skorupowy"] # 0x23e0 + - "⏡": [T: "dolny nawias skorupowy"] # 0x23e1 + - "⏱": [T: "biaƂy trapez"] # 0x23e2 + - "⏣": [T: "benzenowy pierƛcieƄ z okręgiem po prawej"] # 0x23e3 + - "⏀": [T: "prostoliniowoƛć"] # 0x23e4 + - "⏄": [T: "pƂaskoƛć"] # 0x23e5 + - "⏊": [T: "prąd przemienny"] # 0x23e6 + - "⏧": [T: "symbol elektrycznego przecięcia"] # 0x23e7 - "①-⑹": # 0x2460 - 0x2469 - - t: "w kóƂku" + - T: "w kóƂku" - spell: "translate('.', '①⑥⑹④⑀⑄⑊⑧⑚', '123456789')" - - "⑩": [t: "w kóƂku dziesięć"] # 0x2469 - - "â‘Ș": [t: "w kóƂku jedenaƛcie"] # 0x246a - - "⑫": [t: "w kóƂku dwanaƛcie"] # 0x246b - - "⑬": [t: "w kóƂku trzynaƛcie"] # 0x246c - - "⑭": [t: "w kóƂku czternaƛcie"] # 0x246d - - "⑼": [t: "w kóƂku piętnaƛcie"] # 0x246e - - "⑯": [t: "w kóƂku szesnaƛcie"] # 0x246f - - "⑰": [t: "w kóƂku siedemnaƛcie"] # 0x2470 - - "⑱": [t: "w kóƂku osiemnaƛcie"] # 0x2471 - - "⑳": [t: "w kóƂku dwadzieƛcia"] # 0x2473 + - "⑩": [T: "w kóƂku dziesięć"] # 0x2469 + - "â‘Ș": [T: "w kóƂku jedenaƛcie"] # 0x246a + - "⑫": [T: "w kóƂku dwanaƛcie"] # 0x246b + - "⑬": [T: "w kóƂku trzynaƛcie"] # 0x246c + - "⑭": [T: "w kóƂku czternaƛcie"] # 0x246d + - "⑼": [T: "w kóƂku piętnaƛcie"] # 0x246e + - "⑯": [T: "w kóƂku szesnaƛcie"] # 0x246f + - "⑰": [T: "w kóƂku siedemnaƛcie"] # 0x2470 + - "⑱": [T: "w kóƂku osiemnaƛcie"] # 0x2471 + - "⑳": [T: "w kóƂku dwadzieƛcia"] # 0x2473 - "⑮-⑌": # 0x2474 - 0x247d - - t: "w nawiasie" + - T: "w nawiasie" - spell: "translate('.', '⑎⑔⑶⑷⑞â‘čâ‘ș⑻⑌', '123456789')" - - "⑜": [t: "w nawiasie dziesięć"] # 0x247d - - "⑟": [t: "w nawiasie jedenaƛcie"] # 0x247e - - "⑿": [t: "w nawiasie dwanaƛcie"] # 0x247f - - "⒀": [t: "w nawiasie trzynaƛcie"] # 0x2480 - - "⒁": [t: "w nawiasie czternaƛcie"] # 0x2481 - - "⒂": [t: "w nawiasie piętnaƛcie"] # 0x2482 - - "⒃": [t: "w nawiasie szesnaƛcie"] # 0x2483 - - "⒄": [t: "w nawiasie siedemnaƛcie"] # 0x2484 - - "⒅": [t: "w nawiasie osiemnaƛcie"] # 0x2485 - - "⒆": [t: "w nawiasie dziewiętnaƛcie"] # 0x2486 - - "⒇": [t: "w nawiasie dwadzieƛcia"] # 0x2487 + - "⑜": [T: "w nawiasie dziesięć"] # 0x247d + - "⑟": [T: "w nawiasie jedenaƛcie"] # 0x247e + - "⑿": [T: "w nawiasie dwanaƛcie"] # 0x247f + - "⒀": [T: "w nawiasie trzynaƛcie"] # 0x2480 + - "⒁": [T: "w nawiasie czternaƛcie"] # 0x2481 + - "⒂": [T: "w nawiasie piętnaƛcie"] # 0x2482 + - "⒃": [T: "w nawiasie szesnaƛcie"] # 0x2483 + - "⒄": [T: "w nawiasie siedemnaƛcie"] # 0x2484 + - "⒅": [T: "w nawiasie osiemnaƛcie"] # 0x2485 + - "⒆": [T: "w nawiasie dziewiętnaƛcie"] # 0x2486 + - "⒇": [T: "w nawiasie dwadzieƛcia"] # 0x2487 - "⒈-⒐": # 0x2488 - 0x2491 - spell: "translate('.', '⒈⒉⒊⒋⒌⒍⒎⒏⒐', '123456789')" - - t: "z kropką" - - "⒑": [t: "dziesięć z kropką"] # 0x2491 - - "⒒": [t: "jedenaƛcie z kropką"] # 0x2492 - - "⒓": [t: "dwanaƛcie z kropką"] # 0x2493 - - "⒔": [t: "trzynaƛcie z kropką"] # 0x2494 - - "⒕": [t: "czternaƛcie z kropką"] # 0x2495 - - "⒖": [t: "piętnaƛcie z kropką"] # 0x2496 - - "⒗": [t: "szesnaƛcie z kropką"] # 0x2497 - - "⒘": [t: "siedemnaƛcie z kropką"] # 0x2498 - - "⒙": [t: "osiemnaƛcie z kropką"] # 0x2499 - - "⒚": [t: "dziewiętnaƛcie z kropką"] # 0x249a - - "⒛": [t: "dwadzieƛcia z kropką"] # 0x249b + - T: "z kropką" + - "⒑": [T: "dziesięć z kropką"] # 0x2491 + - "⒒": [T: "jedenaƛcie z kropką"] # 0x2492 + - "⒓": [T: "dwanaƛcie z kropką"] # 0x2493 + - "⒔": [T: "trzynaƛcie z kropką"] # 0x2494 + - "⒕": [T: "czternaƛcie z kropką"] # 0x2495 + - "⒖": [T: "piętnaƛcie z kropką"] # 0x2496 + - "⒗": [T: "szesnaƛcie z kropką"] # 0x2497 + - "⒘": [T: "siedemnaƛcie z kropką"] # 0x2498 + - "⒙": [T: "osiemnaƛcie z kropką"] # 0x2499 + - "⒚": [T: "dziewiętnaƛcie z kropką"] # 0x249a + - "⒛": [T: "dwadzieƛcia z kropką"] # 0x249b - "⒜-â’”": # 0x249c - 0x24b5 - - t: "w nawiasie" + - T: "w nawiasie" - spell: "translate('.', 'â’œâ’â’žâ’Ÿâ’ â’Ąâ’ąâ’Łâ’€â’„â’Šâ’§â’šâ’©â’Șâ’«â’Źâ’­â’źâ’Żâ’°â’±â’Čâ’łâ’Žâ’”', 'abcdefghijklmnopqrstuvwxyz')" - "Ⓐ-ⓩ": # 0x24b6 - 0x24cf - - t: "w kóƂku" + - T: "w kóƂku" - spell: "translate('.', 'â’¶â’·â’žâ’čâ’șâ’»â’Œâ’œâ’Ÿâ’żâ“€â“â“‚â“ƒâ“„â“…â“†â“‡â“ˆâ“‰â“Šâ“‹â“Œâ“â“Žâ“', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "🅐-đŸ…©": # 0x1f150 - 0x1f169 - - t: "czarny w kóƂku" + - T: "czarny w kóƂku" - spell: "translate('.', 'đŸ…đŸ…‘đŸ…’đŸ…“đŸ…”đŸ…•đŸ…–đŸ…—đŸ…˜đŸ…™đŸ…šđŸ…›đŸ…œđŸ…đŸ…žđŸ…ŸđŸ… đŸ…ĄđŸ…ąđŸ…ŁđŸ…€đŸ…„đŸ…ŠđŸ…§đŸ…šđŸ…©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "ⓐ-ⓩ": # 0x24d0 - 0x24e9 - - t: "w kóƂku" + - T: "w kóƂku" - spell: "translate('.', 'â“â“‘â“’â““â“”â“•â“–â“—â“˜â“™â“šâ“›â“œâ“â“žâ“Ÿâ“ â“Ąâ“ąâ“Łâ“€â“„â“Šâ“§â“šâ“©', 'abcdefghijklmnopqrstuvwxyz')" - - "â“Ș": [t: "w kóƂku zero"] # 0x24ea - - "⓫": [t: "czarny w kóƂku jedenaƛcie"] # 0x24eb - - "⓬": [t: "czarny w kóƂku dwanaƛcie"] # 0x24ec - - "⓭": [t: "czarny w kóƂku trzynaƛcie"] # 0x24ed - - "⓼": [t: "czarny w kóƂku czternaƛcie"] # 0x24ee - - "⓯": [t: "czarny w kóƂku piętnaƛcie"] # 0x24ef - - "⓰": [t: "czarny w kóƂku szesnaƛcie"] # 0x24f0 - - "⓱": [t: "czarny w kóƂku siedemnaƛcie"] # 0x24f1 - - "â“Č": [t: "czarny w kóƂku osiemnaƛcie"] # 0x24f2 - - "⓳": [t: "czarny w kóƂku dziewiętnaƛcie"] # 0x24f3 - - "⓮": [t: "czarny w kóƂku dwadzieƛcia"] # 0x24f4 + - "â“Ș": [T: "w kóƂku zero"] # 0x24ea + - "⓫": [T: "czarny w kóƂku jedenaƛcie"] # 0x24eb + - "⓬": [T: "czarny w kóƂku dwanaƛcie"] # 0x24ec + - "⓭": [T: "czarny w kóƂku trzynaƛcie"] # 0x24ed + - "⓼": [T: "czarny w kóƂku czternaƛcie"] # 0x24ee + - "⓯": [T: "czarny w kóƂku piętnaƛcie"] # 0x24ef + - "⓰": [T: "czarny w kóƂku szesnaƛcie"] # 0x24f0 + - "⓱": [T: "czarny w kóƂku siedemnaƛcie"] # 0x24f1 + - "â“Č": [T: "czarny w kóƂku osiemnaƛcie"] # 0x24f2 + - "⓳": [T: "czarny w kóƂku dziewiętnaƛcie"] # 0x24f3 + - "⓮": [T: "czarny w kóƂku dwadzieƛcia"] # 0x24f4 - "â“”-ⓜ": # 0x24f5 - 0x24fe - - t: "podwĂłjny w kóƂku" + - T: "podwĂłjny w kóƂku" - spell: "translate('.', 'ⓔ⓶⓷ⓞâ“čâ“ș⓻Ⓦⓜ', '123456789')" - - "ⓟ": [t: "podwĂłjny w kóƂku dziesięć"] # 0x24fe - - "⓿": [t: "czarny w kóƂku zero"] # 0x24ff - - "■": [t: "czarny kwadrat"] # 0x25a0 - - "□": [t: "biaƂy kwadrat"] # 0x25a1 - - "▱": [t: "biaƂy kwadrat z zaokrąglonymi naroĆŒnikami"] # 0x25a2 - - "▣": [t: "biaƂy kwadrat zawierający maƂy czarny kwadrat"] # 0x25a3 - - "â–€": [t: "kwadrat z poziomym wypeƂnieniem"] # 0x25a4 - - "â–„": [t: "kwadrat z pionowym wypeƂnieniem"] # 0x25a5 - - "▩": [t: "kwadrat z ortogonalnym kreskowanym wypeƂnieniem"] # 0x25a6 - - "▧": [t: "kwadrat z wypeƂnieniem od gĂłry po lewej do doƂu po prawej"] # 0x25a7 - - "▹": [t: "kwadrat z wypeƂnieniem od gĂłry po prawej do doƂu po lewej"] # 0x25a8 - - "▩": [t: "kwadrat z ukoƛnym kreskowanym wypeƂnieniem"] # 0x25a9 - - "â–Ș": [t: "czarny maƂy kwadrat"] # 0x25aa - - "▫": [t: "biaƂy maƂy kwadrat"] # 0x25ab - - "▬": [t: "czarny prostokąt"] # 0x25ac - - "▭": [t: "biaƂy prostokąt"] # 0x25ad - - "▼": [t: "czarny pionowy prostokąt"] # 0x25ae - - "▯": [t: "biaƂy pionowy prostokąt"] # 0x25af - - "▰": [t: "czarny RĂłwnolegƂobok"] # 0x25b0 - - "▱": [t: "biaƂy RĂłwnolegƂobok"] # 0x25b1 - - "â–Č": [t: "czarny trĂłjkąt skierowany w gĂłrę"] # 0x25b2 - - "△": [t: "trĂłjkąt"] # 0x25b3 - - "▮": [t: "czarny maƂy trĂłjkąt skierowany w gĂłrę"] # 0x25b4 - - "â–”": [t: "biaƂy maƂy trĂłjkąt skierowany w gĂłrę"] # 0x25b5 - - "▶": [t: "czarny trĂłjkąt skierowany w prawo"] # 0x25b6 - - "▷": [t: "biaƂy trĂłjkąt skierowany w prawo"] # 0x25b7 - - "▾": [t: "czarny maƂy trĂłjkąt skierowany w prawo"] # 0x25b8 - - "â–č": [t: "biaƂy maƂy trĂłjkąt skierowany w prawo"] # 0x25b9 - - "â–ș": [t: "czarny wskaĆșnik skierowany w prawo"] # 0x25ba - - "▻": [t: "biaƂy wskaĆșnik skierowany w prawo"] # 0x25bb - - "â–Œ": [t: "czarny trĂłjkąt skierowany w dóƂ"] # 0x25bc - - "â–œ": [t: "biaƂy trĂłjkąt skierowany w dóƂ"] # 0x25bd - - "â–Ÿ": [t: "czarny maƂy trĂłjkąt skierowany w dóƂ"] # 0x25be - - "▿": [t: "biaƂy maƂy trĂłjkąt skierowany w dóƂ"] # 0x25bf - - "◀": [t: "czarny trĂłjkąt skierowany w lewo"] # 0x25c0 - - "◁": [t: "biaƂy trĂłjkąt skierowany w lewo"] # 0x25c1 - - "◂": [t: "czarny maƂy trĂłjkąt skierowany w lewo"] # 0x25c2 - - "◃": [t: "biaƂy maƂy trĂłjkąt skierowany w lewo"] # 0x25c3 - - "◄": [t: "czarny wskaĆșnik skierowany w lewo"] # 0x25c4 - - "◅": [t: "biaƂy wskaĆșnik skierowany w lewo"] # 0x25c5 - - "◆": [t: "czarny romb"] # 0x25c6 - - "◇": [t: "biaƂy romb"] # 0x25c7 - - "◈": [t: "biaƂy romb zawierający czarny maƂy romb"] # 0x25c8 - - "◉": [t: "rybie oko"] # 0x25c9 - - "◊": [t: "romb"] # 0x25ca - - "○": [t: "biaƂe koƂo"] # 0x25cb - - "◌": [t: "kropkowany okrąg"] # 0x25cc - - "◍": [t: "okrąg z pionowe wypeƂnienie"] # 0x25cd - - "◎": [t: "tarcza"] # 0x25ce - - "●": [t: "czarne koƂo"] # 0x25cf - - "◐": [t: "okrąg z czarną lewą poƂową"] # 0x25d0 - - "◑": [t: "okrąg z czarną prawą poƂową"] # 0x25d1 - - "◒": [t: "okrąg z czarną dolną poƂową"] # 0x25d2 - - "◓": [t: "okrąg z czarną gĂłrną poƂową"] # 0x25d3 - - "◔": [t: "okrąg z czarną gĂłrną prawą ćwiartką"] # 0x25d4 - - "◕": [t: "okrąg czarny poza gĂłrną lewą ćwiartką"] # 0x25d5 - - "◖": [t: "czarne koƂo z lewą poƂową"] # 0x25d6 - - "◗": [t: "czarne koƂo z prawą poƂową"] # 0x25d7 - - "◘": [t: "odwrotnoƛć punkt"] # 0x25d8 - - "◙": [t: "odwrotnoƛć biaƂe koƂo"] # 0x25d9 - - "◚": [t: "gĂłrna poƂowa odwrotnoƛć biaƂe koƂo"] # 0x25da - - "◛": [t: "dolna poƂowa odwrotnoƛć biaƂe koƂo"] # 0x25db - - "◜": [t: "gĂłrny lewy ćwiartka Ƃuk koƂowy"] # 0x25dc - - "◝": [t: "gĂłrny prawy ćwiartka Ƃuk koƂowy"] # 0x25dd - - "◞": [t: "dolny prawy ćwiartka Ƃuk koƂowy"] # 0x25de - - "◟": [t: "dolny lewy ćwiartka Ƃuk koƂowy"] # 0x25df - - "◠": [t: "gĂłrna poƂowa okrąg"] # 0x25e0 - - "◡": [t: "dolna poƂowa okrąg"] # 0x25e1 - - "◱": [t: "czarny dolny prawy trĂłjkąt"] # 0x25e2 - - "◣": [t: "czarny dolny lewy trĂłjkąt"] # 0x25e3 - - "â—€": [t: "czarny gĂłrny lewy trĂłjkąt"] # 0x25e4 - - "â—„": [t: "czarny gĂłrny prawy trĂłjkąt"] # 0x25e5 - - "◩": [t: "zƂoĆŒenie"] # 0x25e6 - - "◧": [t: "kwadrat z czarną lewą poƂową"] # 0x25e7 - - "◹": [t: "kwadrat z czarną prawą poƂową"] # 0x25e8 - - "◩": [t: "kwadrat z czarną gĂłrną lewą poƂową"] # 0x25e9 - - "â—Ș": [t: "kwadrat z czarną dolną prawą poƂową"] # 0x25ea - - "◫": [t: "biaƂy kwadrat z linią dzielącą na póƂ"] # 0x25eb - - "◬": [t: "biaƂy trĂłjkąt skierowany w gĂłrę z kropką"] # 0x25ec - - "◭": [t: "trĂłjkąt skierowany w gĂłrę z czarną lewą poƂową"] # 0x25ed - - "◼": [t: "trĂłjkąt skierowany w gĂłrę z czarną prawą poƂową"] # 0x25ee - - "◯": [t: "duĆŒy okrąg"] # 0x25ef - - "◰": [t: "biaƂy kwadrat z gĂłrną lewą ćwiartką"] # 0x25f0 - - "◱": [t: "biaƂy kwadrat z dolną lewą ćwiartką"] # 0x25f1 - - "â—Č": [t: "biaƂy kwadrat z dolną prawą ćwiartką"] # 0x25f2 - - "◳": [t: "biaƂy kwadrat z gĂłrną prawą ćwiartką"] # 0x25f3 - - "◮": [t: "biaƂe koƂo z gĂłrną lewą ćwiartką"] # 0x25f4 - - "â—”": [t: "biaƂe koƂo z dolną lewą ćwiartką"] # 0x25f5 - - "◶": [t: "biaƂe koƂo z dolną prawą ćwiartką"] # 0x25f6 - - "◷": [t: "biaƂe koƂo z gĂłrną prawą ćwiartką"] # 0x25f7 - - "◾": [t: "gĂłrny lewy trĂłjkąt"] # 0x25f8 - - "â—č": [t: "gĂłrny prawy trĂłjkąt"] # 0x25f9 - - "â—ș": [t: "dolny lewy trĂłjkąt"] # 0x25fa - - "◻": [t: "biaƂy ƛredni kwadrat"] # 0x25fb - - "â—Œ": [t: "czarny ƛredni kwadrat"] # 0x25fc - - "â—œ": [t: "biaƂy ƛredni maƂy kwadrat"] # 0x25fd - - "â—Ÿ": [t: "czarny ƛredni maƂy kwadrat"] # 0x25fe - - "◿": [t: "dolny prawy trĂłjkąt"] # 0x25ff - - "★": [t: "czarna gwiazda"] # 0x2605 - - "☆": [t: "biaƂy gwiazda"] # 0x2606 - - "☉": [t: "sƂoƄce"] # 0x2609 - - "☌": [t: "koniunkcja"] # 0x260c - - "☒": [t: "ramka wyboru z iksem"] # 0x2612 - - "☜": [t: "przybywający ksiÄ™ĆŒyc"] # 0x263d - - "☟": [t: "ubywający ksiÄ™ĆŒyc"] # 0x263e - - "☿": [t: "Merkury"] # 0x263f - - "♀": [t: "ĆŒeƄskie"] # 0x2640 - - "♁": [t: "Ziemia"] # 0x2641 - - "♂": [t: "męskie"] # 0x2642 - - "♃": [t: "Jowisz"] # 0x2643 + - "ⓟ": [T: "podwĂłjny w kóƂku dziesięć"] # 0x24fe + - "⓿": [T: "czarny w kóƂku zero"] # 0x24ff + - "■": [T: "czarny kwadrat"] # 0x25a0 + - "□": [T: "biaƂy kwadrat"] # 0x25a1 + - "▱": [T: "biaƂy kwadrat z zaokrąglonymi naroĆŒnikami"] # 0x25a2 + - "▣": [T: "biaƂy kwadrat zawierający maƂy czarny kwadrat"] # 0x25a3 + - "â–€": [T: "kwadrat z poziomym wypeƂnieniem"] # 0x25a4 + - "â–„": [T: "kwadrat z pionowym wypeƂnieniem"] # 0x25a5 + - "▩": [T: "kwadrat z ortogonalnym kreskowanym wypeƂnieniem"] # 0x25a6 + - "▧": [T: "kwadrat z wypeƂnieniem od gĂłry po lewej do doƂu po prawej"] # 0x25a7 + - "▹": [T: "kwadrat z wypeƂnieniem od gĂłry po prawej do doƂu po lewej"] # 0x25a8 + - "▩": [T: "kwadrat z ukoƛnym kreskowanym wypeƂnieniem"] # 0x25a9 + - "â–Ș": [T: "czarny maƂy kwadrat"] # 0x25aa + - "▫": [T: "biaƂy maƂy kwadrat"] # 0x25ab + - "▬": [T: "czarny prostokąt"] # 0x25ac + - "▭": [T: "biaƂy prostokąt"] # 0x25ad + - "▼": [T: "czarny pionowy prostokąt"] # 0x25ae + - "▯": [T: "biaƂy pionowy prostokąt"] # 0x25af + - "▰": [T: "czarny RĂłwnolegƂobok"] # 0x25b0 + - "▱": [T: "biaƂy RĂłwnolegƂobok"] # 0x25b1 + - "â–Č": [T: "czarny trĂłjkąt skierowany w gĂłrę"] # 0x25b2 + - "△": [T: "trĂłjkąt"] # 0x25b3 + - "▮": [T: "czarny maƂy trĂłjkąt skierowany w gĂłrę"] # 0x25b4 + - "â–”": [T: "biaƂy maƂy trĂłjkąt skierowany w gĂłrę"] # 0x25b5 + - "▶": [T: "czarny trĂłjkąt skierowany w prawo"] # 0x25b6 + - "▷": [T: "biaƂy trĂłjkąt skierowany w prawo"] # 0x25b7 + - "▾": [T: "czarny maƂy trĂłjkąt skierowany w prawo"] # 0x25b8 + - "â–č": [T: "biaƂy maƂy trĂłjkąt skierowany w prawo"] # 0x25b9 + - "â–ș": [T: "czarny wskaĆșnik skierowany w prawo"] # 0x25ba + - "▻": [T: "biaƂy wskaĆșnik skierowany w prawo"] # 0x25bb + - "â–Œ": [T: "czarny trĂłjkąt skierowany w dóƂ"] # 0x25bc + - "â–œ": [T: "biaƂy trĂłjkąt skierowany w dóƂ"] # 0x25bd + - "â–Ÿ": [T: "czarny maƂy trĂłjkąt skierowany w dóƂ"] # 0x25be + - "▿": [T: "biaƂy maƂy trĂłjkąt skierowany w dóƂ"] # 0x25bf + - "◀": [T: "czarny trĂłjkąt skierowany w lewo"] # 0x25c0 + - "◁": [T: "biaƂy trĂłjkąt skierowany w lewo"] # 0x25c1 + - "◂": [T: "czarny maƂy trĂłjkąt skierowany w lewo"] # 0x25c2 + - "◃": [T: "biaƂy maƂy trĂłjkąt skierowany w lewo"] # 0x25c3 + - "◄": [T: "czarny wskaĆșnik skierowany w lewo"] # 0x25c4 + - "◅": [T: "biaƂy wskaĆșnik skierowany w lewo"] # 0x25c5 + - "◆": [T: "czarny romb"] # 0x25c6 + - "◇": [T: "biaƂy romb"] # 0x25c7 + - "◈": [T: "biaƂy romb zawierający czarny maƂy romb"] # 0x25c8 + - "◉": [T: "rybie oko"] # 0x25c9 + - "◊": [T: "romb"] # 0x25ca + - "○": [T: "biaƂe koƂo"] # 0x25cb + - "◌": [T: "kropkowany okrąg"] # 0x25cc + - "◍": [T: "okrąg z pionowe wypeƂnienie"] # 0x25cd + - "◎": [T: "tarcza"] # 0x25ce + - "●": [T: "czarne koƂo"] # 0x25cf + - "◐": [T: "okrąg z czarną lewą poƂową"] # 0x25d0 + - "◑": [T: "okrąg z czarną prawą poƂową"] # 0x25d1 + - "◒": [T: "okrąg z czarną dolną poƂową"] # 0x25d2 + - "◓": [T: "okrąg z czarną gĂłrną poƂową"] # 0x25d3 + - "◔": [T: "okrąg z czarną gĂłrną prawą ćwiartką"] # 0x25d4 + - "◕": [T: "okrąg czarny poza gĂłrną lewą ćwiartką"] # 0x25d5 + - "◖": [T: "czarne koƂo z lewą poƂową"] # 0x25d6 + - "◗": [T: "czarne koƂo z prawą poƂową"] # 0x25d7 + - "◘": [T: "odwrotnoƛć punkt"] # 0x25d8 + - "◙": [T: "odwrotnoƛć biaƂe koƂo"] # 0x25d9 + - "◚": [T: "gĂłrna poƂowa odwrotnoƛć biaƂe koƂo"] # 0x25da + - "◛": [T: "dolna poƂowa odwrotnoƛć biaƂe koƂo"] # 0x25db + - "◜": [T: "gĂłrny lewy ćwiartka Ƃuk koƂowy"] # 0x25dc + - "◝": [T: "gĂłrny prawy ćwiartka Ƃuk koƂowy"] # 0x25dd + - "◞": [T: "dolny prawy ćwiartka Ƃuk koƂowy"] # 0x25de + - "◟": [T: "dolny lewy ćwiartka Ƃuk koƂowy"] # 0x25df + - "◠": [T: "gĂłrna poƂowa okrąg"] # 0x25e0 + - "◡": [T: "dolna poƂowa okrąg"] # 0x25e1 + - "◱": [T: "czarny dolny prawy trĂłjkąt"] # 0x25e2 + - "◣": [T: "czarny dolny lewy trĂłjkąt"] # 0x25e3 + - "â—€": [T: "czarny gĂłrny lewy trĂłjkąt"] # 0x25e4 + - "â—„": [T: "czarny gĂłrny prawy trĂłjkąt"] # 0x25e5 + - "◩": [T: "zƂoĆŒenie"] # 0x25e6 + - "◧": [T: "kwadrat z czarną lewą poƂową"] # 0x25e7 + - "◹": [T: "kwadrat z czarną prawą poƂową"] # 0x25e8 + - "◩": [T: "kwadrat z czarną gĂłrną lewą poƂową"] # 0x25e9 + - "â—Ș": [T: "kwadrat z czarną dolną prawą poƂową"] # 0x25ea + - "◫": [T: "biaƂy kwadrat z linią dzielącą na póƂ"] # 0x25eb + - "◬": [T: "biaƂy trĂłjkąt skierowany w gĂłrę z kropką"] # 0x25ec + - "◭": [T: "trĂłjkąt skierowany w gĂłrę z czarną lewą poƂową"] # 0x25ed + - "◼": [T: "trĂłjkąt skierowany w gĂłrę z czarną prawą poƂową"] # 0x25ee + - "◯": [T: "duĆŒy okrąg"] # 0x25ef + - "◰": [T: "biaƂy kwadrat z gĂłrną lewą ćwiartką"] # 0x25f0 + - "◱": [T: "biaƂy kwadrat z dolną lewą ćwiartką"] # 0x25f1 + - "â—Č": [T: "biaƂy kwadrat z dolną prawą ćwiartką"] # 0x25f2 + - "◳": [T: "biaƂy kwadrat z gĂłrną prawą ćwiartką"] # 0x25f3 + - "◮": [T: "biaƂe koƂo z gĂłrną lewą ćwiartką"] # 0x25f4 + - "â—”": [T: "biaƂe koƂo z dolną lewą ćwiartką"] # 0x25f5 + - "◶": [T: "biaƂe koƂo z dolną prawą ćwiartką"] # 0x25f6 + - "◷": [T: "biaƂe koƂo z gĂłrną prawą ćwiartką"] # 0x25f7 + - "◾": [T: "gĂłrny lewy trĂłjkąt"] # 0x25f8 + - "â—č": [T: "gĂłrny prawy trĂłjkąt"] # 0x25f9 + - "â—ș": [T: "dolny lewy trĂłjkąt"] # 0x25fa + - "◻": [T: "biaƂy ƛredni kwadrat"] # 0x25fb + - "â—Œ": [T: "czarny ƛredni kwadrat"] # 0x25fc + - "â—œ": [T: "biaƂy ƛredni maƂy kwadrat"] # 0x25fd + - "â—Ÿ": [T: "czarny ƛredni maƂy kwadrat"] # 0x25fe + - "◿": [T: "dolny prawy trĂłjkąt"] # 0x25ff + - "★": [T: "czarna gwiazda"] # 0x2605 + - "☆": [T: "biaƂy gwiazda"] # 0x2606 + - "☉": [T: "sƂoƄce"] # 0x2609 + - "☌": [T: "koniunkcja"] # 0x260c + - "☒": [T: "ramka wyboru z iksem"] # 0x2612 + - "☜": [T: "przybywający ksiÄ™ĆŒyc"] # 0x263d + - "☟": [T: "ubywający ksiÄ™ĆŒyc"] # 0x263e + - "☿": [T: "Merkury"] # 0x263f + - "♀": [T: "ĆŒeƄskie"] # 0x2640 + - "♁": [T: "Ziemia"] # 0x2641 + - "♂": [T: "męskie"] # 0x2642 + - "♃": [T: "Jowisz"] # 0x2643 - "♄": [T: "Saturn"] # 0x2644 - - "♅": [t: "Uran"] # 0x2645 - - "♆": [t: "Neptun"] # 0x2646 - - "♇": [t: "Pluton"] # 0x2647 - - "♈": [t: "Baran"] # 0x2648 - - "♉": [t: "Byk"] # 0x2649 - - "♩": [t: "ćwierćnuta"] # 0x2669 - - "♭": [t: "bemol"] # 0x266d - - "♼": [t: "kasownik"] # 0x266e - - "♯": [t: "krzyĆŒyk"] # 0x266f - - "♠": [t: "czarny pik"] # 0x2660 - - "♡": [t: "biaƂy kier"] # 0x2661 - - "♱": [t: "biaƂy karo"] # 0x2662 - - "♣": [t: "czarny trefl"] # 0x2663 - - "♀": [t: "biaƂy pik"] # 0x2664 - - "♄": [t: "czarny kier"] # 0x2665 - - "♩": [t: "czarny karo"] # 0x2666 - - "♧": [t: "biaƂy trefl"] # 0x2667 - - "⚀": [t: "ƛcianka kostki 1"] # 0x2680 - - "⚁": [t: "ƛcianka kostki 2"] # 0x2681 - - "⚂": [t: "ƛcianka kostki 3"] # 0x2682 - - "⚃": [t: "ƛcianka kostki 4"] # 0x2683 - - "⚄": [t: "ƛcianka kostki 5"] # 0x2684 - - "⚅": [t: "ƛcianka kostki 6"] # 0x2685 - - "⚆": [t: "biaƂe koƂo z kropką prawy"] # 0x2686 - - "⚇": [t: "biaƂe koƂo z dwiema kropkami"] # 0x2687 - - "⚈": [t: "czarne koƂo z kropką prawy"] # 0x2688 - - "⚉": [t: "czarne koƂo z dwiema kropkami"] # 0x2689 - - "âšȘ": [t: "ƛredni biaƂe koƂo"] # 0x26aa - - "⚫": [t: "ƛredni czarne koƂo"] # 0x26ab - - "⚬": [t: "ƛredni maƂy biaƂe koƂo"] # 0x26ac - - "âšČ": [t: "neutralny"] # 0x26b2 - - "✓": [t: "haczek znak"] # 0x2713 - - "✠": [t: "krzyĆŒ maltaƄski"] # 0x2720 - - "âœȘ": [t: "w kóƂku biaƂy gwiazda"] # 0x272a - - "✶": [t: "czarna szeƛcioramienna gwiazda"] # 0x2736 - - "❚": [t: "ƛredni lewy ornament nawiasu okrągƂego"] # 0x2768 - - "❩": [t: "ƛredni prawy ornament nawiasu okrągƂego"] # 0x2769 - - "âȘ": [t: "ƛredni spƂaszczony lewy ornament nawiasu okrągƂego"] # 0x276a - - "❫": [t: "ƛredni spƂaszczony prawy ornament nawiasu okrągƂego"] # 0x276b - - "❬": [t: "ƛredni kąt skierowany w lewo nawias kwadratowy ornament"] # 0x276c - - "❭": [t: "ƛredni kąt skierowany w prawo nawias kwadratowy ornament"] # 0x276d - - "❼": [t: "gruby kąt skierowany w lewo cudzysƂów ornament"] # 0x276e - - "❯": [t: "gruby kąt skierowany w prawo cudzysƂów ornament"] # 0x276f - - "❰": [t: "gruby kąt skierowany w lewo nawias kwadratowy ornament"] # 0x2770 - - "❱": [t: "gruby kąt skierowany w prawo nawias kwadratowy ornament"] # 0x2771 - - "âČ": [t: "lekki lewy nawias skorupowy ornament"] # 0x2772 - - "❳": [t: "lekki prawy nawias skorupowy ornament"] # 0x2773 - - "❎": [t: "ƛredni lewy nawias klamrowy ornament"] # 0x2774 - - "❔": [t: "ƛredni prawy nawias klamrowy ornament"] # 0x2775 - - "❶": [t: "czarny w kóƂku jeden"] # 0x2776 - - "❷": [t: "czarny w kóƂku dwa"] # 0x2777 - - "❞": [t: "czarny w kóƂku trzy"] # 0x2778 - - "âč": [t: "czarny w kóƂku cztery"] # 0x2779 - - "âș": [t: "czarny w kóƂku pięć"] # 0x277a - - "❻": [t: "czarny w kóƂku szeƛć"] # 0x277b - - "❌": [t: "czarny w kóƂku siedem"] # 0x277c - - "❜": [t: "czarny w kóƂku osiem"] # 0x277d - - "❟": [t: "czarny w kóƂku dziewięć"] # 0x277e - - "❿": [t: "czarny w kóƂku dziesięć"] # 0x277f - - "➀": [t: "w kóƂku bezszeryfowe jeden"] # 0x2780 - - "➁": [t: "w kóƂku bezszeryfowe dwa"] # 0x2781 - - "➂": [t: "w kóƂku bezszeryfowe trzy"] # 0x2782 - - "➃": [t: "w kóƂku bezszeryfowe cztery"] # 0x2783 - - "➄": [t: "w kóƂku bezszeryfowe pięć"] # 0x2784 - - "➅": [t: "w kóƂku bezszeryfowe szeƛć"] # 0x2785 - - "➆": [t: "w kóƂku bezszeryfowe siedem"] # 0x2786 - - "➇": [t: "w kóƂku bezszeryfowe osiem"] # 0x2787 - - "➈": [t: "w kóƂku bezszeryfowe dziewięć"] # 0x2788 - - "➉": [t: "w kóƂku bezszeryfowe dziesięć"] # 0x2789 - - "➊": [t: "czarny w kóƂku bezszeryfowe jeden"] # 0x278a - - "➋": [t: "czarny w kóƂku bezszeryfowe dwa"] # 0x278b - - "➌": [t: "czarny w kóƂku bezszeryfowe trzy"] # 0x278c - - "➍": [t: "czarny w kóƂku bezszeryfowe cztery"] # 0x278d - - "➎": [t: "czarny w kóƂku bezszeryfowe pięć"] # 0x278e - - "➏": [t: "czarny w kóƂku bezszeryfowe szeƛć"] # 0x278f - - "➐": [t: "czarny w kóƂku bezszeryfowe siedem"] # 0x2790 - - "➑": [t: "czarny w kóƂku bezszeryfowe osiem"] # 0x2791 - - "➒": [t: "czarny w kóƂku bezszeryfowe dziewięć"] # 0x2792 - - "➓": [t: "czarny w kóƂku bezszeryfowe dziesięć"] # 0x2793 - - "➔": [t: "gruba strzaƂka w prawo z szerokim grotem"] # 0x2794 - - "➕": [t: "gruby znak plus"] # 0x2795 - - "➖": [t: "gruby znak minus"] # 0x2796 - - "➗": [t: "gruby znak dzielenia"] # 0x2797 - - "➘": [t: "gruba strzaƂka na poƂudniowy wschĂłd"] # 0x2798 - - "➙": [t: "gruby strzaƂka w prawo"] # 0x2799 - - "➚": [t: "gruba strzaƂka na póƂnocny wschĂłd"] # 0x279a - - "➛": [t: "strzaƂka w prawo z grotem kreƛlarskim"] # 0x279b - - "➜": [t: "gruba strzaƂka w prawo z okrągƂym grotem"] # 0x279c - - "➝": [t: "strzaƂka w prawo z trĂłjkątnym grotem"] # 0x279d - - "➞": [t: "gruba strzaƂka w prawo z trĂłjkątnym grotem"] # 0x279e - - "➟": [t: "kreskowana strzaƂka w prawo z trĂłjkątnym grotem"] # 0x279f - - "➠": [t: "gruba kreskowana strzaƂka w prawo z trĂłjkątnym grotem"] # 0x27a0 - - "➡": [t: "czarny strzaƂka w prawo"] # 0x27a1 - - "➱": [t: "trĂłjwymiarowa strzaƂka w prawo podƛwietlona od gĂłry"] # 0x27a2 - - "➣": [t: "trĂłjwymiarowa strzaƂka w prawo podƛwietlona od doƂu"] # 0x27a3 - - "➀": [t: "czarny prawy grot strzaƂki"] # 0x27a4 - - "➄": [t: "gruba czarna zakrzywiona dolna strzaƂka w prawo"] # 0x27a5 - - "➊": [t: "gruba czarna zakrzywiona gĂłrna strzaƂka w prawo"] # 0x27a6 - - "➧": [t: "krĂłtki czarny strzaƂka w prawo"] # 0x27a7 - - "➚": [t: "gruba czarna wklęsƂa ostro zakoƄczona strzaƂka w prawo"] # 0x27a8 - - "➩": [t: "prawostronnie cieniowana biaƂa strzaƂka w prawo"] # 0x27a9 - - "âžȘ": [t: "lewostronnie cieniowana biaƂa strzaƂka w prawo"] # 0x27aa - - "➫": [t: "biaƂa strzaƂka w prawo pochylona do tyƂu z cieniem"] # 0x27ab - - "➬": [t: "biaƂa strzaƂka w prawo pochylona do przodu z cieniem"] # 0x27ac - - "➭": [t: "gruba biaƂa strzaƂka w prawo z cieniem w dolnym prawym rogu"] # 0x27ad - - "➼": [t: "gruba biaƂa strzaƂka w prawo z cieniem w gĂłrnym prawym rogu"] # 0x27ae - - "➯": [t: "biaƂa strzaƂka w prawo z dolnym prawym wcięciem i cieniem"] # 0x27af - - "➱": [t: "biaƂa strzaƂka w prawo z gĂłrnym prawym wcięciem i cieniem"] # 0x27b1 - - "âžČ": [t: "gruba biaƂa strzaƂka w prawo w kóƂku"] # 0x27b2 - - "➳": [t: "biaƂa pierzasta strzaƂka w prawo"] # 0x27b3 - - "➮": [t: "czarna pierzasta strzaƂka poƂudniowo-wschodnia"] # 0x27b4 - - "➔": [t: "czarna pierzasta strzaƂka w prawo"] # 0x27b5 - - "➶": [t: "czarny pierzasty póƂnoc wschĂłd strzaƂka"] # 0x27b6 - - "➷": [t: "gruby czarna pierzasta strzaƂka poƂudniowo-wschodnia"] # 0x27b7 - - "➾": [t: "gruby czarna pierzasta strzaƂka w prawo"] # 0x27b8 - - "âžč": [t: "gruby czarny pierzasty póƂnoc wschĂłd strzaƂka"] # 0x27b9 - - "âžș": [t: "strzaƂka w prawo z Ƃezkowatym grotem z zadziorami"] # 0x27ba - - "➻": [t: "gruba strzaƂka w prawo z Ƃezkowatym grotem i trzonkiem"] # 0x27bb - - "➌": [t: "strzaƂka w prawo z klinowym ogonem"] # 0x27bc - - "➜": [t: "gruby strzaƂka w prawo z klinowym ogonem"] # 0x27bd - - "➟": [t: "otwarta konturowa strzaƂka w prawo"] # 0x27be - - "⟀": [t: "trĂłjwymiarowy kąt"] # 0x27c0 - - "⟁": [t: "biaƂy trĂłjkąt zawierający maƂy biaƂy trĂłjkąt"] # 0x27c1 + - "♅": [T: "Uran"] # 0x2645 + - "♆": [T: "Neptun"] # 0x2646 + - "♇": [T: "Pluton"] # 0x2647 + - "♈": [T: "Baran"] # 0x2648 + - "♉": [T: "Byk"] # 0x2649 + - "♩": [T: "ćwierćnuta"] # 0x2669 + - "♭": [T: "bemol"] # 0x266d + - "♼": [T: "kasownik"] # 0x266e + - "♯": [T: "krzyĆŒyk"] # 0x266f + - "♠": [T: "czarny pik"] # 0x2660 + - "♡": [T: "biaƂy kier"] # 0x2661 + - "♱": [T: "biaƂy karo"] # 0x2662 + - "♣": [T: "czarny trefl"] # 0x2663 + - "♀": [T: "biaƂy pik"] # 0x2664 + - "♄": [T: "czarny kier"] # 0x2665 + - "♩": [T: "czarny karo"] # 0x2666 + - "♧": [T: "biaƂy trefl"] # 0x2667 + - "⚀": [T: "ƛcianka kostki 1"] # 0x2680 + - "⚁": [T: "ƛcianka kostki 2"] # 0x2681 + - "⚂": [T: "ƛcianka kostki 3"] # 0x2682 + - "⚃": [T: "ƛcianka kostki 4"] # 0x2683 + - "⚄": [T: "ƛcianka kostki 5"] # 0x2684 + - "⚅": [T: "ƛcianka kostki 6"] # 0x2685 + - "⚆": [T: "biaƂe koƂo z kropką prawy"] # 0x2686 + - "⚇": [T: "biaƂe koƂo z dwiema kropkami"] # 0x2687 + - "⚈": [T: "czarne koƂo z kropką prawy"] # 0x2688 + - "⚉": [T: "czarne koƂo z dwiema kropkami"] # 0x2689 + - "âšȘ": [T: "ƛredni biaƂe koƂo"] # 0x26aa + - "⚫": [T: "ƛredni czarne koƂo"] # 0x26ab + - "⚬": [T: "ƛredni maƂy biaƂe koƂo"] # 0x26ac + - "âšČ": [T: "neutralny"] # 0x26b2 + - "✓": [T: "haczek znak"] # 0x2713 + - "✠": [T: "krzyĆŒ maltaƄski"] # 0x2720 + - "âœȘ": [T: "w kóƂku biaƂy gwiazda"] # 0x272a + - "✶": [T: "czarna szeƛcioramienna gwiazda"] # 0x2736 + - "❚": [T: "ƛredni lewy ornament nawiasu okrągƂego"] # 0x2768 + - "❩": [T: "ƛredni prawy ornament nawiasu okrągƂego"] # 0x2769 + - "âȘ": [T: "ƛredni spƂaszczony lewy ornament nawiasu okrągƂego"] # 0x276a + - "❫": [T: "ƛredni spƂaszczony prawy ornament nawiasu okrągƂego"] # 0x276b + - "❬": [T: "ƛredni kąt skierowany w lewo nawias kwadratowy ornament"] # 0x276c + - "❭": [T: "ƛredni kąt skierowany w prawo nawias kwadratowy ornament"] # 0x276d + - "❼": [T: "gruby kąt skierowany w lewo cudzysƂów ornament"] # 0x276e + - "❯": [T: "gruby kąt skierowany w prawo cudzysƂów ornament"] # 0x276f + - "❰": [T: "gruby kąt skierowany w lewo nawias kwadratowy ornament"] # 0x2770 + - "❱": [T: "gruby kąt skierowany w prawo nawias kwadratowy ornament"] # 0x2771 + - "âČ": [T: "lekki lewy nawias skorupowy ornament"] # 0x2772 + - "❳": [T: "lekki prawy nawias skorupowy ornament"] # 0x2773 + - "❎": [T: "ƛredni lewy nawias klamrowy ornament"] # 0x2774 + - "❔": [T: "ƛredni prawy nawias klamrowy ornament"] # 0x2775 + - "❶": [T: "czarny w kóƂku jeden"] # 0x2776 + - "❷": [T: "czarny w kóƂku dwa"] # 0x2777 + - "❞": [T: "czarny w kóƂku trzy"] # 0x2778 + - "âč": [T: "czarny w kóƂku cztery"] # 0x2779 + - "âș": [T: "czarny w kóƂku pięć"] # 0x277a + - "❻": [T: "czarny w kóƂku szeƛć"] # 0x277b + - "❌": [T: "czarny w kóƂku siedem"] # 0x277c + - "❜": [T: "czarny w kóƂku osiem"] # 0x277d + - "❟": [T: "czarny w kóƂku dziewięć"] # 0x277e + - "❿": [T: "czarny w kóƂku dziesięć"] # 0x277f + - "➀": [T: "w kóƂku bezszeryfowe jeden"] # 0x2780 + - "➁": [T: "w kóƂku bezszeryfowe dwa"] # 0x2781 + - "➂": [T: "w kóƂku bezszeryfowe trzy"] # 0x2782 + - "➃": [T: "w kóƂku bezszeryfowe cztery"] # 0x2783 + - "➄": [T: "w kóƂku bezszeryfowe pięć"] # 0x2784 + - "➅": [T: "w kóƂku bezszeryfowe szeƛć"] # 0x2785 + - "➆": [T: "w kóƂku bezszeryfowe siedem"] # 0x2786 + - "➇": [T: "w kóƂku bezszeryfowe osiem"] # 0x2787 + - "➈": [T: "w kóƂku bezszeryfowe dziewięć"] # 0x2788 + - "➉": [T: "w kóƂku bezszeryfowe dziesięć"] # 0x2789 + - "➊": [T: "czarny w kóƂku bezszeryfowe jeden"] # 0x278a + - "➋": [T: "czarny w kóƂku bezszeryfowe dwa"] # 0x278b + - "➌": [T: "czarny w kóƂku bezszeryfowe trzy"] # 0x278c + - "➍": [T: "czarny w kóƂku bezszeryfowe cztery"] # 0x278d + - "➎": [T: "czarny w kóƂku bezszeryfowe pięć"] # 0x278e + - "➏": [T: "czarny w kóƂku bezszeryfowe szeƛć"] # 0x278f + - "➐": [T: "czarny w kóƂku bezszeryfowe siedem"] # 0x2790 + - "➑": [T: "czarny w kóƂku bezszeryfowe osiem"] # 0x2791 + - "➒": [T: "czarny w kóƂku bezszeryfowe dziewięć"] # 0x2792 + - "➓": [T: "czarny w kóƂku bezszeryfowe dziesięć"] # 0x2793 + - "➔": [T: "gruba strzaƂka w prawo z szerokim grotem"] # 0x2794 + - "➕": [T: "gruby znak plus"] # 0x2795 + - "➖": [T: "gruby znak minus"] # 0x2796 + - "➗": [T: "gruby znak dzielenia"] # 0x2797 + - "➘": [T: "gruba strzaƂka na poƂudniowy wschĂłd"] # 0x2798 + - "➙": [T: "gruby strzaƂka w prawo"] # 0x2799 + - "➚": [T: "gruba strzaƂka na póƂnocny wschĂłd"] # 0x279a + - "➛": [T: "strzaƂka w prawo z grotem kreƛlarskim"] # 0x279b + - "➜": [T: "gruba strzaƂka w prawo z okrągƂym grotem"] # 0x279c + - "➝": [T: "strzaƂka w prawo z trĂłjkątnym grotem"] # 0x279d + - "➞": [T: "gruba strzaƂka w prawo z trĂłjkątnym grotem"] # 0x279e + - "➟": [T: "kreskowana strzaƂka w prawo z trĂłjkątnym grotem"] # 0x279f + - "➠": [T: "gruba kreskowana strzaƂka w prawo z trĂłjkątnym grotem"] # 0x27a0 + - "➡": [T: "czarny strzaƂka w prawo"] # 0x27a1 + - "➱": [T: "trĂłjwymiarowa strzaƂka w prawo podƛwietlona od gĂłry"] # 0x27a2 + - "➣": [T: "trĂłjwymiarowa strzaƂka w prawo podƛwietlona od doƂu"] # 0x27a3 + - "➀": [T: "czarny prawy grot strzaƂki"] # 0x27a4 + - "➄": [T: "gruba czarna zakrzywiona dolna strzaƂka w prawo"] # 0x27a5 + - "➊": [T: "gruba czarna zakrzywiona gĂłrna strzaƂka w prawo"] # 0x27a6 + - "➧": [T: "krĂłtki czarny strzaƂka w prawo"] # 0x27a7 + - "➚": [T: "gruba czarna wklęsƂa ostro zakoƄczona strzaƂka w prawo"] # 0x27a8 + - "➩": [T: "prawostronnie cieniowana biaƂa strzaƂka w prawo"] # 0x27a9 + - "âžȘ": [T: "lewostronnie cieniowana biaƂa strzaƂka w prawo"] # 0x27aa + - "➫": [T: "biaƂa strzaƂka w prawo pochylona do tyƂu z cieniem"] # 0x27ab + - "➬": [T: "biaƂa strzaƂka w prawo pochylona do przodu z cieniem"] # 0x27ac + - "➭": [T: "gruba biaƂa strzaƂka w prawo z cieniem w dolnym prawym rogu"] # 0x27ad + - "➼": [T: "gruba biaƂa strzaƂka w prawo z cieniem w gĂłrnym prawym rogu"] # 0x27ae + - "➯": [T: "biaƂa strzaƂka w prawo z dolnym prawym wcięciem i cieniem"] # 0x27af + - "➱": [T: "biaƂa strzaƂka w prawo z gĂłrnym prawym wcięciem i cieniem"] # 0x27b1 + - "âžČ": [T: "gruba biaƂa strzaƂka w prawo w kóƂku"] # 0x27b2 + - "➳": [T: "biaƂa pierzasta strzaƂka w prawo"] # 0x27b3 + - "➮": [T: "czarna pierzasta strzaƂka poƂudniowo-wschodnia"] # 0x27b4 + - "➔": [T: "czarna pierzasta strzaƂka w prawo"] # 0x27b5 + - "➶": [T: "czarny pierzasty póƂnoc wschĂłd strzaƂka"] # 0x27b6 + - "➷": [T: "gruby czarna pierzasta strzaƂka poƂudniowo-wschodnia"] # 0x27b7 + - "➾": [T: "gruby czarna pierzasta strzaƂka w prawo"] # 0x27b8 + - "âžč": [T: "gruby czarny pierzasty póƂnoc wschĂłd strzaƂka"] # 0x27b9 + - "âžș": [T: "strzaƂka w prawo z Ƃezkowatym grotem z zadziorami"] # 0x27ba + - "➻": [T: "gruba strzaƂka w prawo z Ƃezkowatym grotem i trzonkiem"] # 0x27bb + - "➌": [T: "strzaƂka w prawo z klinowym ogonem"] # 0x27bc + - "➜": [T: "gruby strzaƂka w prawo z klinowym ogonem"] # 0x27bd + - "➟": [T: "otwarta konturowa strzaƂka w prawo"] # 0x27be + - "⟀": [T: "trĂłjwymiarowy kąt"] # 0x27c0 + - "⟁": [T: "biaƂy trĂłjkąt zawierający maƂy biaƂy trĂłjkąt"] # 0x27c1 - "⟂⊄": # 0x27c2, 22A5 (22A5 wrongly used for perpendicular by most editors) - test: - if: "$SpeechStyle = 'LiteralSpeak' and text()='⊄'" # 22A5 (up tack/bottom) @@ -1670,1327 +1670,1327 @@ - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "otwĂłrz podzbiĂłr" + - T: "otwĂłrz podzbiĂłr" - "⟄": # 0x27c4 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "otwĂłrz nadzbiĂłr" - - "⟅": [t: "lewy ogranicznik workowy w ksztaƂcie S"] # 0x27c5 - - "⟆": [t: "prawy ogranicznik workowy w ksztaƂcie S"] # 0x27c6 - - "⟇": [t: "lub z kropką wewnątrz"] # 0x27c7 - - "⟈": [t: "odwrotny ukoƛnik poprzedzający podzbiĂłr"] # 0x27c8 - - "⟉": [t: "nadzbiĂłr poprzedzający ukoƛnik"] # 0x27c9 - - "⟊": [t: "pionowa kreska z poziomą kreską"] # 0x27ca - - "⟋": [t: "matematyczny ukoƛnik wznoszący"] # 0x27cb - - "⟌": [t: "dzielenie pisemne"] # 0x27cc - - "⟍": [t: "matematyczny ukoƛnik opadający"] # 0x27cd - - "⟎": [t: "kwadratowa koniunkcja logiczna"] # 0x27ce - - "⟏": [t: "do kwadratu logiczne lub"] # 0x27cf - - "⟐": [t: "biaƂy romb z wyƛrodkowaną kropką"] # 0x27d0 - - "⟑": [t: "i z kropką"] # 0x27d1 - - "⟒": [t: "naleĆŒy do z otwarciem u gĂłry"] # 0x27d2 - - "⟓": [t: "prawy dolny naroĆŒnik z kropką"] # 0x27d3 - - "⟔": [t: "gĂłrny lewy naroĆŒnik z kropką"] # 0x27d4 - - "⟕": [t: "lewe zƂączenie zewnętrzne"] # 0x27d5 - - "⟖": [t: "prawe zƂączenie zewnętrzne"] # 0x27d6 - - "⟗": [t: "peƂne zƂączenie zewnętrzne"] # 0x27d7 - - "⟘": [t: "duĆŒy gĂłrny znacznik"] # 0x27d8 - - "⟙": [t: "duĆŒy dolny znacznik"] # 0x27d9 - - "⟚": [t: "lewy i prawy podwĂłjny znacznik dedukcji"] # 0x27da - - "⟛": [t: "lewy i prawy znacznik"] # 0x27db - - "⟜": [t: "lewa multimapa"] # 0x27dc - - "⟝": [t: "dƂugi prawy znacznik"] # 0x27dd - - "⟞": [t: "dƂugi lewy znacznik"] # 0x27de - - "⟟": [t: "gĂłrny znacznik z okręgiem nad"] # 0x27df - - "⟠": [t: "romb podzielony poziomą kreską"] # 0x27e0 - - "⟡": [t: "biaƂy romb o wklęsƂych bokach"] # 0x27e1 - - "⟱": [t: "biaƂy romb o wklęsƂych bokach z lewym haczykiem"] # 0x27e2 - - "⟣": [t: "biaƂy romb o wklęsƂych bokach z prawym haczykiem"] # 0x27e3 - - "⟀": [t: "biaƂy kwadrat z lewym haczykiem"] # 0x27e4 - - "⟄": [t: "biaƂy kwadrat z prawym haczykiem"] # 0x27e5 - - "⟩": [t: "lewy biaƂy nawias kwadratowy"] # 0x27e6 - - "⟧": [t: "prawy biaƂy nawias kwadratowy"] # 0x27e7 - - "⟹": [t: "lewy nawias kątowy"] # 0x27e8 - - "⟩": [t: "prawy nawias kątowy"] # 0x27e9 - - "âŸȘ": [t: "lewy podwĂłjny nawias kątowy"] # 0x27ea - - "⟫": [t: "prawy podwĂłjny nawias kątowy"] # 0x27eb - - "⟬": [t: "lewy biaƂy nawias skorupowy"] # 0x27ec - - "⟭": [t: "prawy biaƂy nawias skorupowy"] # 0x27ed - - "⟼": [t: "lewy spƂaszczony nawias"] # 0x27ee - - "⟯": [t: "prawy spƂaszczony nawias"] # 0x27ef - - "⟰": [t: "poczwĂłrna strzaƂka w gĂłrę"] # 0x27f0 - - "⟱": [t: "poczwĂłrna strzaƂka w dóƂ"] # 0x27f1 - - "âŸČ": [t: "okrÄ™ĆŒna strzaƂka z przerwą przeciwnie do ruchu wskazĂłwek zegara"] # 0x27f2 - - "⟳": [t: "okrÄ™ĆŒna strzaƂka z przerwą zgodnie z ruchem wskazĂłwek zegara"] # 0x27f3 - - "⟮": [t: "strzaƂka w prawo z plusem w kóƂku"] # 0x27f4 - - "⟔": [t: "dƂuga strzaƂka w lewo"] # 0x27f5 - - "⟶": [t: "dƂuga strzaƂka w prawo"] # 0x27f6 - - "⟷": [t: "dƂuga strzaƂka w lewo i w prawo"] # 0x27f7 - - "⟾": [t: "dƂuga podwĂłjna strzaƂka w lewo"] # 0x27f8 - - "âŸč": [t: "implikuje"] # 0x27f9 - - "âŸș": [t: "wtedy i tylko wtedy"] # 0x27fa - - "⟻": [t: "dƂuga strzaƂka w lewo od kreski"] # 0x27fb - - "⟌": [t: "dƂuga strzaƂka w prawo od kreski"] # 0x27fc - - "⟜": [t: "dƂuga podwĂłjna strzaƂka w lewo od kreski"] # 0x27fd - - "⟟": [t: "dƂuga podwĂłjna strzaƂka w prawo od kreski"] # 0x27fe - - "⟿": [t: "dƂuga falista strzaƂka w prawo"] # 0x27ff - - " ": [t: "strzaƂka w prawo z dwoma grotami i pionowym przekreƛleniem"] # 0x2900 - - " ": [t: "strzaƂka w prawo z dwoma grotami i podwĂłjnym pionowym przekreƛleniem"] # 0x2901 - - " ": [t: "podwĂłjna strzaƂka w lewo z pionową kreską"] # 0x2902 - - " ": [t: "podwĂłjna strzaƂka w prawo z pionową kreską"] # 0x2903 - - " ": [t: "podwĂłjna strzaƂka w lewo i w prawo z pionową kreską"] # 0x2904 - - " ": [t: "strzaƂka w prawo z dwoma grotami od kreski"] # 0x2905 - - " ": [t: "podwĂłjna strzaƂka w lewo od kreski"] # 0x2906 - - " ": [t: "podwĂłjna strzaƂka w prawo od kreski"] # 0x2907 - - " ": [t: "strzaƂka w dóƂ z poziomą kreską"] # 0x2908 - - " ": [t: "strzaƂka w gĂłrę z poziomą kreską"] # 0x2909 - - " ": [t: "gĂłrny potrĂłjny strzaƂka"] # 0x290a - - "​": [t: "dolny potrĂłjny strzaƂka"] # 0x290b - - "‌": [t: "lewy podwĂłjny kreska strzaƂka"] # 0x290c - - "‍": [t: "prawy podwĂłjny kreska strzaƂka"] # 0x290d - - "‎": [t: "lewy potrĂłjny kreska strzaƂka"] # 0x290e - - "‏": [t: "prawy potrĂłjny kreska strzaƂka"] # 0x290f - - "‐": [t: "strzaƂka w prawo z dwoma grotami i potrĂłjną kreską"] # 0x2910 - - "‑": [t: "strzaƂka w prawo z kropkowanym trzonem"] # 0x2911 - - "‒": [t: "strzaƂka w gĂłrę do kreski"] # 0x2912 - - "–": [t: "strzaƂka w dóƂ do kreski"] # 0x2913 - - "—": [t: "strzaƂka w prawo z ogonem i pionową kreską"] # 0x2914 - - "―": [t: "strzaƂka w prawo z ogonem i podwĂłjną pionową kreską"] # 0x2915 - - "‖": [t: "strzaƂka w prawo z dwoma grotami i ogonem"] # 0x2916 - - "‗": [t: "strzaƂka w prawo z dwoma grotami, ogonem i pionowym przekreƛleniem"] # 0x2917 - - "‘": [t: "strzaƂka w prawo z dwoma grotami, ogonem i podwĂłjnym pionowym przekreƛleniem"] # 0x2918 - - "’": [t: "strzaƂka w lewo ogon"] # 0x2919 - - "‚": [t: "strzaƂka w prawo ogon"] # 0x291a - - "‛": [t: "lewy podwĂłjna strzaƂka ogon"] # 0x291b - - "“": [t: "prawy podwĂłjna strzaƂka ogon"] # 0x291c - - "”": [t: "strzaƂka w lewo do wypeƂnionego rombu"] # 0x291d - - "„": [t: "strzaƂka w prawo do wypeƂnionego rombu"] # 0x291e - - "‟": [t: "strzaƂka w lewo od kreski do wypeƂnionego rombu"] # 0x291f - - "†": [t: "strzaƂka w prawo od kreski do wypeƂnionego rombu"] # 0x2920 - - "‥": [t: "strzaƂka póƂnocno-zachodnia i poƂudniowo-wschodnia"] # 0x2921 - - "‹": [t: "strzaƂka póƂnocno-wschodnia i poƂudniowo-zachodnia"] # 0x2922 - - "‣": [t: "strzaƂka póƂnocno-zachodnia z hakiem"] # 0x2923 - - " ": [t: "strzaƂka póƂnocno-wschodnia z hakiem"] # 0x2924 - - " ": [t: "strzaƂka poƂudniowo-wschodnia z hakiem"] # 0x2925 - - " ": [t: "strzaƂka poƂudniowo-zachodnia z hakiem"] # 0x2926 - - "‧": [t: "strzaƂka póƂnocno-zachodnia i strzaƂka póƂnocno-wschodnia"] # 0x2927 - - "‚": [t: "strzaƂka póƂnocno-wschodnia i strzaƂka poƂudniowo-wschodnia"] # 0x2928 - - "
": [t: "strzaƂka poƂudniowo-wschodnia i strzaƂka poƂudniowo-zachodnia"] # 0x2929 - - "â€Ș": [t: "strzaƂka poƂudniowo-zachodnia i strzaƂka póƂnocno-zachodnia"] # 0x292a - - "‫": [t: "ukoƛna wznosząca przecinająca ukoƛną opadającą"] # 0x292b - - "‏": [t: "ukoƛna opadająca przecinająca ukoƛną wznoszącą"] # 0x292c - - "‭": [t: "strzaƂka poƂudniowo-wschodnia przecinająca strzaƂkę póƂnocno-wschodnią"] # 0x292d - - "‟": [t: "strzaƂka póƂnocno-wschodnia przecinająca strzaƂkę poƂudniowo-wschodnią"] # 0x292e - - " ": [t: "ukoƛna opadająca przecinająca strzaƂkę póƂnocno-wschodnią"] # 0x292f - - "‰": [t: "ukoƛna wznosząca przecinająca strzaƂkę poƂudniowo-wschodnią"] # 0x2930 - - "‱": [t: "strzaƂka póƂnocno-wschodnia przecinająca strzaƂkę póƂnocno-zachodnią"] # 0x2931 - - "â€Č": [t: "strzaƂka póƂnocno-zachodnia przecinająca strzaƂkę póƂnocno-wschodnią"] # 0x2932 - - "″": [t: "falista strzaƂka skierowana bezpoƛrednio w prawo"] # 0x2933 - - "‎": [t: "strzaƂka skierowana w prawo, potem zakrzywiona w gĂłrę"] # 0x2934 - - "—": [t: "strzaƂka skierowana w prawo, potem zakrzywiona w dóƂ"] # 0x2935 - - "‶": [t: "strzaƂka skierowana w dóƂ, potem zakrzywiona w lewo"] # 0x2936 - - "‷": [t: "strzaƂka skierowana w dóƂ, potem zakrzywiona w prawo"] # 0x2937 - - "„": [t: "prawostronna strzaƂka Ƃukowa zgodna z ruchem wskazĂłwek zegara"] # 0x2938 - - "â€č": [t: "lewostronna strzaƂka Ƃukowa przeciwna do ruchu wskazĂłwek zegara"] # 0x2939 - - "â€ș": [t: "gĂłrna strzaƂka Ƃukowa przeciwna do ruchu wskazĂłwek zegara"] # 0x293a - - "※": [t: "dolna strzaƂka Ƃukowa przeciwna do ruchu wskazĂłwek zegara"] # 0x293b - - "‌": [t: "gĂłrna strzaƂka Ƃukowa zgodna z ruchem wskazĂłwek zegara z minusem"] # 0x293c - - "“": [t: "gĂłrna strzaƂka Ƃukowa przeciwna do ruchu wskazĂłwek zegara z plusem"] # 0x293d - - "‟": [t: "dolna prawa strzaƂka póƂokrągƂa zgodna z ruchem wskazĂłwek zegara"] # 0x293e - - "‿": [t: "dolna lewa strzaƂka póƂokrągƂa przeciwna do ruchu wskazĂłwek zegara"] # 0x293f - - "â„€": [t: "zamknięta strzaƂka okrÄ™ĆŒna przeciwna do ruchu wskazĂłwek zegara"] # 0x2940 - - "℁": [t: "zamknięta strzaƂka okrÄ™ĆŒna zgodna z ruchem wskazĂłwek zegara"] # 0x2941 - - "â„‚": [t: "strzaƂka w prawo nad krĂłtką strzaƂką w lewo"] # 0x2942 - - "℃": [t: "strzaƂka w lewo nad krĂłtką strzaƂką w prawo"] # 0x2943 - - "â„„": [t: "krĂłtka strzaƂka w prawo nad strzaƂką w lewo"] # 0x2944 - - "â„…": [t: "strzaƂka w prawo z plusem pod spodem"] # 0x2945 - - "℆": [t: "strzaƂka w lewo z plusem pod spodem"] # 0x2946 - - "ℇ": [t: "strzaƂka w prawo przez X"] # 0x2947 - - "℈": [t: "strzaƂka w lewo i w prawo przez okrąg"] # 0x2948 - - "℉": [t: "strzaƂka w gĂłrę z dwoma grotami od okręgu"] # 0x2949 - - "ℊ": [t: "lewy grot gĂłrny prawy grot dolny harpun"] # 0x294a - - "â„‹": [t: "lewy grot dolny prawy grot gĂłrny harpun"] # 0x294b - - "ℌ": [t: "gĂłrny grot prawy dolny grot lewy harpun"] # 0x294c - - "ℍ": [t: "gĂłrny grot lewy dolny grot prawy harpun"] # 0x294d - - "ℎ": [t: "lewy grot gĂłrny prawy grot gĂłrny harpun"] # 0x294e - - "ℏ": [t: "gĂłrny grot prawy dolny grot prawy harpun"] # 0x294f - - "ℐ": [t: "lewy grot dolny prawy grot dolny harpun"] # 0x2950 - - "â„‘": [t: "gĂłrny grot lewy dolny grot lewy harpun"] # 0x2951 - - "â„’": [t: "lewy harpun z grotem gĂłrnym do kreski"] # 0x2952 - - "â„“": [t: "prawy harpun z grotem gĂłrnym do kreski"] # 0x2953 - - "â„”": [t: "gĂłrny harpun z grotem prawym do kreski"] # 0x2954 - - "â„•": [t: "dolny harpun z grotem prawym do kreski"] # 0x2955 - - "â„–": [t: "lewy harpun z grotem dolnym do kreski"] # 0x2956 - - "â„—": [t: "prawy harpun z grotem dolnym do kreski"] # 0x2957 - - "℘": [t: "gĂłrny harpun z grotem lewym do kreski"] # 0x2958 - - "â„™": [t: "dolny harpun z grotem lewym do kreski"] # 0x2959 - - "ℚ": [t: "lewy harpun z grotem gĂłrnym od kreski"] # 0x295a - - "â„›": [t: "prawy harpun z grotem gĂłrnym od kreski"] # 0x295b - - "ℜ": [t: "gĂłrny harpun z grotem prawym od kreski"] # 0x295c - - "ℝ": [t: "dolny harpun z grotem prawym od kreski"] # 0x295d - - "℞": [t: "lewy harpun z grotem dolnym od kreski"] # 0x295e - - "℟": [t: "prawy harpun z grotem dolnym od kreski"] # 0x295f - - "â„ ": [t: "gĂłrny harpun z grotem lewym od kreski"] # 0x2960 - - "℥": [t: "dolny harpun z grotem lewym od kreski"] # 0x2961 - - "ℹ": [t: "lewy harpun z grotem gĂłrnym nad lewy harpun z grotem dolnym"] # 0x2962 - - "℣": [t: "gĂłrny harpun z grotem w lewo obok gĂłrnego harpuna z grotem w prawo"] # 0x2963 - - "â„€": [t: "prawy harpun z grotem gĂłrnym nad prawy harpun z grotem dolnym"] # 0x2964 - - "â„„": [t: "dolny harpun z grotem w lewo obok dolnego harpuna z grotem w prawo"] # 0x2965 - - "ℊ": [t: "lewy harpun z grotem gĂłrnym nad prawy harpun z grotem gĂłrnym"] # 0x2966 - - "â„§": [t: "lewy harpun z grotem dolnym nad prawy harpun z grotem dolnym"] # 0x2967 - - "ℚ": [t: "prawy harpun z grotem gĂłrnym nad lewy harpun z grotem gĂłrnym"] # 0x2968 - - "â„©": [t: "prawy harpun z grotem dolnym nad lewy harpun z grotem dolnym"] # 0x2969 - - "â„Ș": [t: "lewy harpun z grotem gĂłrnym nad dƂugą kreską"] # 0x296a - - "â„«": [t: "lewy harpun z grotem dolnym pod dƂugą kreską"] # 0x296b - - "ℏ": [t: "prawy harpun z grotem gĂłrnym nad dƂugą kreską"] # 0x296c - - "â„­": [t: "prawy harpun z grotem dolnym pod dƂugą kreską"] # 0x296d - - "℟": [t: "gĂłrny harpun z grotem w lewo obok dolnego harpuna z grotem w prawo"] # 0x296e - - "ℯ": [t: "dolny harpun z grotem w lewo obok gĂłrnego harpuna z grotem w prawo"] # 0x296f - - "â„°": [t: "podwĂłjna strzaƂka w prawo z zaokrąglonym grotem"] # 0x2970 - - "ℱ": [t: "rĂłwna się nad strzaƂka w prawo"] # 0x2971 - - "â„Č": [t: "operator tyldy nad strzaƂką w prawo"] # 0x2972 - - "ℳ": [t: "strzaƂka w lewo nad operatorem tyldy"] # 0x2973 - - "ℎ": [t: "strzaƂka w prawo nad operatorem tyldy"] # 0x2974 - - "â„”": [t: "strzaƂka w prawo nad znakiem przybliĆŒonej rĂłwnoƛci"] # 0x2975 - - "â„¶": [t: "mniejsze niĆŒ nad strzaƂka w lewo"] # 0x2976 - - "â„·": [t: "strzaƂka w lewo przez znak mniejsze niĆŒ"] # 0x2977 - - "℞": [t: "większe niĆŒ nad strzaƂka w prawo"] # 0x2978 - - "â„č": [t: "podzbiĂłr nad strzaƂka w prawo"] # 0x2979 - - "â„ș": [t: "strzaƂka w lewo przez znak podzbioru"] # 0x297a - - "â„»": [t: "nadzbiĂłr nad strzaƂka w lewo"] # 0x297b - - "ℌ": [t: "lewy rybi ogon"] # 0x297c - - "ℜ": [t: "prawy rybi ogon"] # 0x297d - - "℟": [t: "gĂłrny rybi ogon"] # 0x297e - - "ℿ": [t: "dolny rybi ogon"] # 0x297f - - "⩀": [t: "potrĂłjna pionowa kreska jako ogranicznik"] # 0x2980 - - "⊁": [t: "punkt w notacji Z"] # 0x2981 - - "⩂": [t: "dwukropek typu w notacji Z"] # 0x2982 - - "⊃": [t: "lewy biaƂy nawias klamrowy"] # 0x2983 - - "⩄": [t: "prawy biaƂy nawias klamrowy"] # 0x2984 - - "⩅": [t: "lewy biaƂy nawias"] # 0x2985 - - "⩆": [t: "prawy biaƂy nawias"] # 0x2986 - - "⩇": [t: "lewy nawias kwadratowy obrazu w notacji Z"] # 0x2987 - - "⊈": [t: "prawy nawias kwadratowy obrazu w notacji Z"] # 0x2988 - - "⩉": [t: "lewy nawias kwadratowy wiązania w notacji Z"] # 0x2989 - - "⩊": [t: "prawy nawias kwadratowy wiązania w notacji Z"] # 0x298a - - "⩋": [t: "lewy nawias kwadratowy z podkreƛleniem"] # 0x298b - - "⩌": [t: "prawy nawias kwadratowy z podkreƛleniem"] # 0x298c - - "⊍": [t: "lewy nawias kwadratowy z haczykiem w gĂłrnym rogu"] # 0x298d - - "⊎": [t: "prawy nawias kwadratowy z haczykiem w dolnym rogu"] # 0x298e - - "⊏": [t: "lewy nawias kwadratowy z haczykiem w dolnym rogu"] # 0x298f - - "⊐": [t: "prawy nawias kwadratowy z haczykiem w gĂłrnym rogu"] # 0x2990 - - "⩑": [t: "lewy kąt nawias kwadratowy z kropką"] # 0x2991 - - "⩒": [t: "prawy nawias kątowy z kropką"] # 0x2992 - - "⩓": [t: "lewy Ƃuk mniejsze niĆŒ nawias kwadratowy"] # 0x2993 - - "⩔": [t: "prawy Ƃuk większe niĆŒ nawias kwadratowy"] # 0x2994 - - "⩕": [t: "podwĂłjny lewy Ƃuk większe niĆŒ nawias kwadratowy"] # 0x2995 - - "⩖": [t: "podwĂłjny prawy Ƃuk mniejsze niĆŒ nawias kwadratowy"] # 0x2996 - - "⩗": [t: "lewy czarny nawias skorupowy"] # 0x2997 - - "⊘": [t: "prawy czarny nawias skorupowy"] # 0x2998 - - "⩙": [t: "kropkowany ogranicznik"] # 0x2999 - - "⩚": [t: "pionowa linia zygzakowata"] # 0x299a - - "⩛": [t: "kąt mierzony otwarty w lewo"] # 0x299b - - "⩜": [t: "wariant kąta prostego z kwadratem"] # 0x299c - - "⊝": [t: "mierzony kąt prosty z kropką"] # 0x299d - - "⊞": [t: "kąt z s wewnątrz"] # 0x299e - - "⩟": [t: "akut kąt"] # 0x299f - - "⊠": [t: "kąt sferyczny otwarty w lewo"] # 0x29a0 - - "⊥": [t: "kąt sferyczny otwarty w gĂłrę"] # 0x29a1 - - "⊹": [t: "odwrĂłcony kąt"] # 0x29a2 - - "⊣": [t: "kąt odwrĂłcony"] # 0x29a3 - - "⊀": [t: "kąt z podkreƛleniem"] # 0x29a4 - - "⊄": [t: "kąt odwrĂłcony z podkreƛleniem"] # 0x29a5 - - "⊊": [t: "kąt ukoƛny otwarty w gĂłrę"] # 0x29a6 - - "⊧": [t: "kąt ukoƛny otwarty w dóƂ"] # 0x29a7 - - "⊚": [t: "kąt mierzony z otwartym ramieniem zakoƄczonym strzaƂką skierowaną w gĂłrę i w prawo"] # 0x29a8 - - "⊩": [t: "kąt mierzony z otwartym ramieniem zakoƄczonym strzaƂką skierowaną w gĂłrę i w lewo"] # 0x29a9 - - "âŠȘ": [t: "kąt mierzony z otwartym ramieniem zakoƄczonym strzaƂką skierowaną w dóƂ i w prawo"] # 0x29aa - - "⊫": [t: "kąt mierzony z otwartym ramieniem zakoƄczonym strzaƂką skierowaną w dóƂ i w lewo"] # 0x29ab - - "⊏": [t: "kąt mierzony z otwartym ramieniem zakoƄczonym strzaƂką skierowaną w prawo i w gĂłrę"] # 0x29ac - - "⊭": [t: "kąt mierzony z otwartym ramieniem zakoƄczonym strzaƂką skierowaną w lewo i w gĂłrę"] # 0x29ad - - "⊟": [t: "kąt mierzony z otwartym ramieniem zakoƄczonym strzaƂką skierowaną w prawo i w dóƂ"] # 0x29ae - - "⊯": [t: "kąt mierzony z otwartym ramieniem zakoƄczonym strzaƂką skierowaną w lewo i w dóƂ"] # 0x29af - - "⊰": [t: "odwrĂłcony zbiĂłr pusty"] # 0x29b0 - - "⊱": [t: "zbiĂłr pusty z kreską nad"] # 0x29b1 - - "âŠČ": [t: "zbiĂłr pusty z maƂym okręgiem nad"] # 0x29b2 - - "⊳": [t: "zbiĂłr pusty ze strzaƂką w prawo nad"] # 0x29b3 - - "⊎": [t: "zbiĂłr pusty ze strzaƂką w lewo nad"] # 0x29b4 - - "⊔": [t: "okrąg z kreską poziomą"] # 0x29b5 - - "⊶": [t: "pionowa kreska w kóƂku"] # 0x29b6 - - "⊷": [t: "w kóƂku rĂłwnolegƂe"] # 0x29b7 - - "⊞": [t: "ukoƛnik odwrotny w kóƂku"] # 0x29b8 - - "âŠč": [t: "w kóƂku prostopadƂe"] # 0x29b9 - - "âŠș": [t: "okrąg podzielony kreską poziomą, z gĂłrną poƂową podzieloną kreską pionową"] # 0x29ba - - "⊻": [t: "okrąg z naƂoĆŒonym X"] # 0x29bb - - "⊌": [t: "znak dzielenia w kóƂku obrĂłcony przeciwnie do ruchu wskazĂłwek zegara"] # 0x29bc - - "⊜": [t: "strzaƂka w gĂłrę przez okrąg"] # 0x29bd - - "⊟": [t: "w kóƂku biaƂy punkt"] # 0x29be - - "⊿": [t: "w kóƂku punkt"] # 0x29bf - - "⧀": [t: "w kóƂku mniejsze niĆŒ"] # 0x29c0 - - "⧁": [t: "w kóƂku większe niĆŒ"] # 0x29c1 - - "⧂": [t: "okrąg z maƂym okręgiem po prawej"] # 0x29c2 - - "⧃": [t: "okrąg z dwiema poziomymi kreskami po prawej"] # 0x29c3 - - "⧄": [t: "kwadrat z ukoƛnikiem wznoszącym"] # 0x29c4 - - "⧅": [t: "kwadrat z ukoƛnikiem opadającym"] # 0x29c5 - - "⧆": [t: "do kwadratu gwiazdka"] # 0x29c6 - - "⧇": [t: "do kwadratu maƂy okrąg"] # 0x29c7 - - "⧈": [t: "do kwadratu kwadrat"] # 0x29c8 - - "⧉": [t: "dwa poƂączone kwadraty"] # 0x29c9 - - "⧊": [t: "trĂłjkąt z kropką nad"] # 0x29ca - - "⧋": [t: "trĂłjkąt z podkreƛleniem"] # 0x29cb - - "⧌": [t: "s w trĂłjkąt"] # 0x29cc - - "⧍": [t: "trĂłjkąt z szeryfami u doƂu"] # 0x29cd - - "⧎": [t: "prawy trĂłjkąt nad lewy trĂłjkąt"] # 0x29ce - - "⧏": [t: "lewy trĂłjkąt obok pionowej kreski"] # 0x29cf - - "⧐": [t: "pionowa kreska obok prawego trĂłjkąta"] # 0x29d0 - - "⧑": [t: "kokarda z lewą poƂową czarną"] # 0x29d1 - - "⧒": [t: "kokarda z prawą poƂową czarną"] # 0x29d2 - - "⧓": [t: "czarna kokarda"] # 0x29d3 - - "⧔": [t: "znak mnoĆŒenia z lewą poƂową czarną"] # 0x29d4 - - "⧕": [t: "znak mnoĆŒenia z prawą poƂową czarną"] # 0x29d5 - - "⧖": [t: "biaƂy klepsydra"] # 0x29d6 - - "⧗": [t: "czarny klepsydra"] # 0x29d7 - - "⧘": [t: "lewy falisty ogranicznik"] # 0x29d8 - - "⧙": [t: "prawy falisty ogranicznik"] # 0x29d9 - - "⧚": [t: "lewy podwĂłjny falisty ogranicznik"] # 0x29da - - "⧛": [t: "prawy podwĂłjny falisty ogranicznik"] # 0x29db - - "⧜": [t: "niepeƂna nieskoƄczonoƛć"] # 0x29dc - - "⧝": [t: "wiązanie nad nieskoƄczonoƛcią"] # 0x29dd - - "⧞": [t: "zanegowana nieskoƄczonoƛć z kreską pionową"] # 0x29de - - "⧟": [t: "podwĂłjnie zakoƄczona strzaƂka mapująca"] # 0x29df - - "â§ ": [t: "kwadrat z konturowym obrysem"] # 0x29e0 - - "â§Ą": [t: "wzrasta jak"] # 0x29e1 - - "â§ą": [t: "iloczyn przetasowania"] # 0x29e2 - - "â§Ł": [t: "znak rĂłwnoƛci i ukoƛne rĂłwnolegƂe"] # 0x29e3 - - "â§€": [t: "znak rĂłwnoƛci i ukoƛne rĂłwnolegƂe z tyldą nad"] # 0x29e4 - - "â§„": [t: "identyczne i ukoƛne rĂłwnolegƂe"] # 0x29e5 - - "â§Š": [t: "rĂłwnoliczne"] # 0x29e6 - - "â§§": [t: "termodynamiczny"] # 0x29e7 - - "â§š": [t: "trĂłjkąt skierowany w dóƂ z lewą poƂową czarną"] # 0x29e8 - - "â§©": [t: "trĂłjkąt skierowany w dóƂ z prawą poƂową czarną"] # 0x29e9 - - "â§Ș": [t: "czarny romb ze strzaƂką w dóƂ"] # 0x29ea - - "â§«": [t: "czarny romb"] # 0x29eb - - "â§Ź": [t: "biaƂe koƂo ze strzaƂką w dóƂ"] # 0x29ec - - "â§­": [t: "czarne koƂo ze strzaƂką w dóƂ"] # 0x29ed - - "â§ź": [t: "biaƂy kwadrat z przekreƛleniem bƂędu"] # 0x29ee - - "â§Ż": [t: "czarny kwadrat z przekreƛleniem bƂędu"] # 0x29ef - - "â§°": [t: "biaƂy romb z przekreƛleniem bƂędu"] # 0x29f0 - - "â§±": [t: "czarny romb z przekreƛleniem bƂędu"] # 0x29f1 - - "â§Č": [t: "biaƂe koƂo z przekreƛleniem bƂędu"] # 0x29f2 - - "â§ł": [t: "czarne koƂo z przekreƛleniem bƂędu"] # 0x29f3 - - "â§Ž": [t: "opĂłĆșniona reguƂa"] # 0x29f4 - - "â§”": [t: "operator ukoƛnika odwrotnego"] # 0x29f5 - - "â§¶": [t: "ukoƛnik z kreską nad"] # 0x29f6 - - "â§·": [t: "ukoƛnik odwrotny z poziomą kreską"] # 0x29f7 - - "â§ž": [t: "duĆŒy ukoƛnik"] # 0x29f8 - - "â§č": [t: "duĆŒy ukoƛnik odwrotny"] # 0x29f9 - - "â§ș": [t: "podwĂłjny plus"] # 0x29fa - - "â§»": [t: "potrĂłjny plus"] # 0x29fb - - "â§Œ": [t: "lewy zakrzywiony nawias kątowy"] # 0x29fc - - "â§œ": [t: "prawy zakrzywiony nawias kątowy"] # 0x29fd - - "â§Ÿ": [t: "maleƄki"] # 0x29fe - - "â§ż": [t: "mini"] # 0x29ff - - "⹀": [t: "operator kropka w kóƂku"] # 0x2a00 - - "⚁": [t: "operator plus w kóƂku"] # 0x2a01 - - "⹂": [t: "operator razy w kóƂku"] # 0x2a02 - - "⚃": [t: "operator sumy zbiorĂłw z kropką"] # 0x2a03 - - "⹄": [t: "operator sumy zbiorĂłw z plusem"] # 0x2a04 - - "⹅": [t: "operator kwadratowej częƛci wspĂłlnej"] # 0x2a05 - - "⹆": [t: "operator kwadratowej sumy zbiorĂłw"] # 0x2a06 - - "⹇": [t: "operator podwĂłjnej koniunkcji logicznej"] # 0x2a07 - - "⚈": [t: "dwa logiczne lub operator"] # 0x2a08 - - "⹉": [t: "razy operator"] # 0x2a09 - - "⹊": [t: "suma modulo dwa"] # 0x2a0a - - "⹋": [t: "suma z caƂką"] # 0x2a0b - - "⹌": [t: "operator poczwĂłrnej caƂki"] # 0x2a0c - - "⚍": [t: "caƂka częƛci skoƄczonej"] # 0x2a0d - - "⚎": [t: "caƂka z podwĂłjnym przekreƛleniem"] # 0x2a0e - - "⚏": [t: "caƂka uƛredniona z ukoƛnikiem"] # 0x2a0f - - "⚐": [t: "funkcja cyrkulacji"] # 0x2a10 - - "⹑": [t: "caƂka przeciwna do ruchu wskazĂłwek zegara"] # 0x2a11 - - "⹒": [t: "caƂka liniowa po prostokątnej ƛcieĆŒce wokóƂ bieguna"] # 0x2a12 - - "⹓": [t: "caƂka liniowa po póƂokrągƂej ƛcieĆŒce wokóƂ bieguna"] # 0x2a13 - - "⹔": [t: "caƂka liniowa bez pola"] # 0x2a14 - - "⹕": [t: "operator caƂki wokóƂ punktu"] # 0x2a15 - - "⹖": [t: "operator caƂki kwaternionowej"] # 0x2a16 - - "⹗": [t: "caƂka ze strzaƂką w lewo z haczykiem"] # 0x2a17 - - "⚘": [t: "caƂka ze znakiem razy"] # 0x2a18 - - "⹙": [t: "caƂka z częƛcią wspĂłlną"] # 0x2a19 - - "⹚": [t: "caƂka z sumą zbiorĂłw"] # 0x2a1a - - "⹛": [t: "caƂka z kreską nad"] # 0x2a1b - - "⹜": [t: "caƂka z podkreƛleniem"] # 0x2a1c - - "⚝": [t: "zƂączenie"] # 0x2a1d - - "⚞": [t: "duĆŒy lewy trĂłjkąt operator"] # 0x2a1e - - "⹟": [t: "skƂadanie schematĂłw w notacji Z"] # 0x2a1f - - "âš ": [t: "potok schematĂłw w notacji Z"] # 0x2a20 - - "⚥": [t: "rzutowanie schematĂłw w notacji Z"] # 0x2a21 - - "âšą": [t: "znak plus z okręgiem nad"] # 0x2a22 - - "⚣": [t: "znak plus z daszkiem nad"] # 0x2a23 - - "⚀": [t: "znak plus z tyldą nad"] # 0x2a24 - - "âš„": [t: "znak plus z kropką pod"] # 0x2a25 - - "⚊": [t: "znak plus z tyldą pod"] # 0x2a26 - - "âš§": [t: "znak plus z indeksem dolnym dwa"] # 0x2a27 - - "âšš": [t: "znak plus z czarnym trĂłjkątem"] # 0x2a28 - - "âš©": [t: "znak minus z przecinkiem nad"] # 0x2a29 - - "âšȘ": [t: "znak minus z kropką pod"] # 0x2a2a - - "âš«": [t: "znak minus z kropkami opadającymi"] # 0x2a2b - - "⚏": [t: "znak minus z kropkami wznoszącymi"] # 0x2a2c - - "âš­": [t: "znak plus w lewej poƂówce okręgu"] # 0x2a2d - - "âšź": [t: "znak plus w prawej poƂówce okręgu"] # 0x2a2e + - T: "otwĂłrz nadzbiĂłr" + - "⟅": [T: "lewy ogranicznik workowy w ksztaƂcie S"] # 0x27c5 + - "⟆": [T: "prawy ogranicznik workowy w ksztaƂcie S"] # 0x27c6 + - "⟇": [T: "lub z kropką wewnątrz"] # 0x27c7 + - "⟈": [T: "odwrotny ukoƛnik poprzedzający podzbiĂłr"] # 0x27c8 + - "⟉": [T: "nadzbiĂłr poprzedzający ukoƛnik"] # 0x27c9 + - "⟊": [T: "pionowa kreska z poziomą kreską"] # 0x27ca + - "⟋": [T: "matematyczny ukoƛnik wznoszący"] # 0x27cb + - "⟌": [T: "dzielenie pisemne"] # 0x27cc + - "⟍": [T: "matematyczny ukoƛnik opadający"] # 0x27cd + - "⟎": [T: "kwadratowa koniunkcja logiczna"] # 0x27ce + - "⟏": [T: "do kwadratu logiczne lub"] # 0x27cf + - "⟐": [T: "biaƂy romb z wyƛrodkowaną kropką"] # 0x27d0 + - "⟑": [T: "i z kropką"] # 0x27d1 + - "⟒": [T: "naleĆŒy do z otwarciem u gĂłry"] # 0x27d2 + - "⟓": [T: "prawy dolny naroĆŒnik z kropką"] # 0x27d3 + - "⟔": [T: "gĂłrny lewy naroĆŒnik z kropką"] # 0x27d4 + - "⟕": [T: "lewe zƂączenie zewnętrzne"] # 0x27d5 + - "⟖": [T: "prawe zƂączenie zewnętrzne"] # 0x27d6 + - "⟗": [T: "peƂne zƂączenie zewnętrzne"] # 0x27d7 + - "⟘": [T: "duĆŒy gĂłrny znacznik"] # 0x27d8 + - "⟙": [T: "duĆŒy dolny znacznik"] # 0x27d9 + - "⟚": [T: "lewy i prawy podwĂłjny znacznik dedukcji"] # 0x27da + - "⟛": [T: "lewy i prawy znacznik"] # 0x27db + - "⟜": [T: "lewa multimapa"] # 0x27dc + - "⟝": [T: "dƂugi prawy znacznik"] # 0x27dd + - "⟞": [T: "dƂugi lewy znacznik"] # 0x27de + - "⟟": [T: "gĂłrny znacznik z okręgiem nad"] # 0x27df + - "⟠": [T: "romb podzielony poziomą kreską"] # 0x27e0 + - "⟡": [T: "biaƂy romb o wklęsƂych bokach"] # 0x27e1 + - "⟱": [T: "biaƂy romb o wklęsƂych bokach z lewym haczykiem"] # 0x27e2 + - "⟣": [T: "biaƂy romb o wklęsƂych bokach z prawym haczykiem"] # 0x27e3 + - "⟀": [T: "biaƂy kwadrat z lewym haczykiem"] # 0x27e4 + - "⟄": [T: "biaƂy kwadrat z prawym haczykiem"] # 0x27e5 + - "⟩": [T: "lewy biaƂy nawias kwadratowy"] # 0x27e6 + - "⟧": [T: "prawy biaƂy nawias kwadratowy"] # 0x27e7 + - "⟹": [T: "lewy nawias kątowy"] # 0x27e8 + - "⟩": [T: "prawy nawias kątowy"] # 0x27e9 + - "âŸȘ": [T: "lewy podwĂłjny nawias kątowy"] # 0x27ea + - "⟫": [T: "prawy podwĂłjny nawias kątowy"] # 0x27eb + - "⟬": [T: "lewy biaƂy nawias skorupowy"] # 0x27ec + - "⟭": [T: "prawy biaƂy nawias skorupowy"] # 0x27ed + - "⟼": [T: "lewy spƂaszczony nawias"] # 0x27ee + - "⟯": [T: "prawy spƂaszczony nawias"] # 0x27ef + - "⟰": [T: "poczwĂłrna strzaƂka w gĂłrę"] # 0x27f0 + - "⟱": [T: "poczwĂłrna strzaƂka w dóƂ"] # 0x27f1 + - "âŸČ": [T: "okrÄ™ĆŒna strzaƂka z przerwą przeciwnie do ruchu wskazĂłwek zegara"] # 0x27f2 + - "⟳": [T: "okrÄ™ĆŒna strzaƂka z przerwą zgodnie z ruchem wskazĂłwek zegara"] # 0x27f3 + - "⟮": [T: "strzaƂka w prawo z plusem w kóƂku"] # 0x27f4 + - "⟔": [T: "dƂuga strzaƂka w lewo"] # 0x27f5 + - "⟶": [T: "dƂuga strzaƂka w prawo"] # 0x27f6 + - "⟷": [T: "dƂuga strzaƂka w lewo i w prawo"] # 0x27f7 + - "⟾": [T: "dƂuga podwĂłjna strzaƂka w lewo"] # 0x27f8 + - "âŸč": [T: "implikuje"] # 0x27f9 + - "âŸș": [T: "wtedy i tylko wtedy"] # 0x27fa + - "⟻": [T: "dƂuga strzaƂka w lewo od kreski"] # 0x27fb + - "⟌": [T: "dƂuga strzaƂka w prawo od kreski"] # 0x27fc + - "⟜": [T: "dƂuga podwĂłjna strzaƂka w lewo od kreski"] # 0x27fd + - "⟟": [T: "dƂuga podwĂłjna strzaƂka w prawo od kreski"] # 0x27fe + - "⟿": [T: "dƂuga falista strzaƂka w prawo"] # 0x27ff + - " ": [T: "strzaƂka w prawo z dwoma grotami i pionowym przekreƛleniem"] # 0x2900 + - " ": [T: "strzaƂka w prawo z dwoma grotami i podwĂłjnym pionowym przekreƛleniem"] # 0x2901 + - " ": [T: "podwĂłjna strzaƂka w lewo z pionową kreską"] # 0x2902 + - " ": [T: "podwĂłjna strzaƂka w prawo z pionową kreską"] # 0x2903 + - " ": [T: "podwĂłjna strzaƂka w lewo i w prawo z pionową kreską"] # 0x2904 + - " ": [T: "strzaƂka w prawo z dwoma grotami od kreski"] # 0x2905 + - " ": [T: "podwĂłjna strzaƂka w lewo od kreski"] # 0x2906 + - " ": [T: "podwĂłjna strzaƂka w prawo od kreski"] # 0x2907 + - " ": [T: "strzaƂka w dóƂ z poziomą kreską"] # 0x2908 + - " ": [T: "strzaƂka w gĂłrę z poziomą kreską"] # 0x2909 + - " ": [T: "gĂłrny potrĂłjny strzaƂka"] # 0x290a + - "​": [T: "dolny potrĂłjny strzaƂka"] # 0x290b + - "‌": [T: "lewy podwĂłjny kreska strzaƂka"] # 0x290c + - "‍": [T: "prawy podwĂłjny kreska strzaƂka"] # 0x290d + - "‎": [T: "lewy potrĂłjny kreska strzaƂka"] # 0x290e + - "‏": [T: "prawy potrĂłjny kreska strzaƂka"] # 0x290f + - "‐": [T: "strzaƂka w prawo z dwoma grotami i potrĂłjną kreską"] # 0x2910 + - "‑": [T: "strzaƂka w prawo z kropkowanym trzonem"] # 0x2911 + - "‒": [T: "strzaƂka w gĂłrę do kreski"] # 0x2912 + - "–": [T: "strzaƂka w dóƂ do kreski"] # 0x2913 + - "—": [T: "strzaƂka w prawo z ogonem i pionową kreską"] # 0x2914 + - "―": [T: "strzaƂka w prawo z ogonem i podwĂłjną pionową kreską"] # 0x2915 + - "‖": [T: "strzaƂka w prawo z dwoma grotami i ogonem"] # 0x2916 + - "‗": [T: "strzaƂka w prawo z dwoma grotami, ogonem i pionowym przekreƛleniem"] # 0x2917 + - "‘": [T: "strzaƂka w prawo z dwoma grotami, ogonem i podwĂłjnym pionowym przekreƛleniem"] # 0x2918 + - "’": [T: "strzaƂka w lewo ogon"] # 0x2919 + - "‚": [T: "strzaƂka w prawo ogon"] # 0x291a + - "‛": [T: "lewy podwĂłjna strzaƂka ogon"] # 0x291b + - "“": [T: "prawy podwĂłjna strzaƂka ogon"] # 0x291c + - "”": [T: "strzaƂka w lewo do wypeƂnionego rombu"] # 0x291d + - "„": [T: "strzaƂka w prawo do wypeƂnionego rombu"] # 0x291e + - "‟": [T: "strzaƂka w lewo od kreski do wypeƂnionego rombu"] # 0x291f + - "†": [T: "strzaƂka w prawo od kreski do wypeƂnionego rombu"] # 0x2920 + - "‥": [T: "strzaƂka póƂnocno-zachodnia i poƂudniowo-wschodnia"] # 0x2921 + - "‹": [T: "strzaƂka póƂnocno-wschodnia i poƂudniowo-zachodnia"] # 0x2922 + - "‣": [T: "strzaƂka póƂnocno-zachodnia z hakiem"] # 0x2923 + - " ": [T: "strzaƂka póƂnocno-wschodnia z hakiem"] # 0x2924 + - " ": [T: "strzaƂka poƂudniowo-wschodnia z hakiem"] # 0x2925 + - " ": [T: "strzaƂka poƂudniowo-zachodnia z hakiem"] # 0x2926 + - "‧": [T: "strzaƂka póƂnocno-zachodnia i strzaƂka póƂnocno-wschodnia"] # 0x2927 + - "‚": [T: "strzaƂka póƂnocno-wschodnia i strzaƂka poƂudniowo-wschodnia"] # 0x2928 + - "
": [T: "strzaƂka poƂudniowo-wschodnia i strzaƂka poƂudniowo-zachodnia"] # 0x2929 + - "â€Ș": [T: "strzaƂka poƂudniowo-zachodnia i strzaƂka póƂnocno-zachodnia"] # 0x292a + - "‫": [T: "ukoƛna wznosząca przecinająca ukoƛną opadającą"] # 0x292b + - "‏": [T: "ukoƛna opadająca przecinająca ukoƛną wznoszącą"] # 0x292c + - "‭": [T: "strzaƂka poƂudniowo-wschodnia przecinająca strzaƂkę póƂnocno-wschodnią"] # 0x292d + - "‟": [T: "strzaƂka póƂnocno-wschodnia przecinająca strzaƂkę poƂudniowo-wschodnią"] # 0x292e + - " ": [T: "ukoƛna opadająca przecinająca strzaƂkę póƂnocno-wschodnią"] # 0x292f + - "‰": [T: "ukoƛna wznosząca przecinająca strzaƂkę poƂudniowo-wschodnią"] # 0x2930 + - "‱": [T: "strzaƂka póƂnocno-wschodnia przecinająca strzaƂkę póƂnocno-zachodnią"] # 0x2931 + - "â€Č": [T: "strzaƂka póƂnocno-zachodnia przecinająca strzaƂkę póƂnocno-wschodnią"] # 0x2932 + - "″": [T: "falista strzaƂka skierowana bezpoƛrednio w prawo"] # 0x2933 + - "‎": [T: "strzaƂka skierowana w prawo, potem zakrzywiona w gĂłrę"] # 0x2934 + - "—": [T: "strzaƂka skierowana w prawo, potem zakrzywiona w dóƂ"] # 0x2935 + - "‶": [T: "strzaƂka skierowana w dóƂ, potem zakrzywiona w lewo"] # 0x2936 + - "‷": [T: "strzaƂka skierowana w dóƂ, potem zakrzywiona w prawo"] # 0x2937 + - "„": [T: "prawostronna strzaƂka Ƃukowa zgodna z ruchem wskazĂłwek zegara"] # 0x2938 + - "â€č": [T: "lewostronna strzaƂka Ƃukowa przeciwna do ruchu wskazĂłwek zegara"] # 0x2939 + - "â€ș": [T: "gĂłrna strzaƂka Ƃukowa przeciwna do ruchu wskazĂłwek zegara"] # 0x293a + - "※": [T: "dolna strzaƂka Ƃukowa przeciwna do ruchu wskazĂłwek zegara"] # 0x293b + - "‌": [T: "gĂłrna strzaƂka Ƃukowa zgodna z ruchem wskazĂłwek zegara z minusem"] # 0x293c + - "“": [T: "gĂłrna strzaƂka Ƃukowa przeciwna do ruchu wskazĂłwek zegara z plusem"] # 0x293d + - "‟": [T: "dolna prawa strzaƂka póƂokrągƂa zgodna z ruchem wskazĂłwek zegara"] # 0x293e + - "‿": [T: "dolna lewa strzaƂka póƂokrągƂa przeciwna do ruchu wskazĂłwek zegara"] # 0x293f + - "â„€": [T: "zamknięta strzaƂka okrÄ™ĆŒna przeciwna do ruchu wskazĂłwek zegara"] # 0x2940 + - "℁": [T: "zamknięta strzaƂka okrÄ™ĆŒna zgodna z ruchem wskazĂłwek zegara"] # 0x2941 + - "â„‚": [T: "strzaƂka w prawo nad krĂłtką strzaƂką w lewo"] # 0x2942 + - "℃": [T: "strzaƂka w lewo nad krĂłtką strzaƂką w prawo"] # 0x2943 + - "â„„": [T: "krĂłtka strzaƂka w prawo nad strzaƂką w lewo"] # 0x2944 + - "â„…": [T: "strzaƂka w prawo z plusem pod spodem"] # 0x2945 + - "℆": [T: "strzaƂka w lewo z plusem pod spodem"] # 0x2946 + - "ℇ": [T: "strzaƂka w prawo przez X"] # 0x2947 + - "℈": [T: "strzaƂka w lewo i w prawo przez okrąg"] # 0x2948 + - "℉": [T: "strzaƂka w gĂłrę z dwoma grotami od okręgu"] # 0x2949 + - "ℊ": [T: "lewy grot gĂłrny prawy grot dolny harpun"] # 0x294a + - "â„‹": [T: "lewy grot dolny prawy grot gĂłrny harpun"] # 0x294b + - "ℌ": [T: "gĂłrny grot prawy dolny grot lewy harpun"] # 0x294c + - "ℍ": [T: "gĂłrny grot lewy dolny grot prawy harpun"] # 0x294d + - "ℎ": [T: "lewy grot gĂłrny prawy grot gĂłrny harpun"] # 0x294e + - "ℏ": [T: "gĂłrny grot prawy dolny grot prawy harpun"] # 0x294f + - "ℐ": [T: "lewy grot dolny prawy grot dolny harpun"] # 0x2950 + - "â„‘": [T: "gĂłrny grot lewy dolny grot lewy harpun"] # 0x2951 + - "â„’": [T: "lewy harpun z grotem gĂłrnym do kreski"] # 0x2952 + - "â„“": [T: "prawy harpun z grotem gĂłrnym do kreski"] # 0x2953 + - "â„”": [T: "gĂłrny harpun z grotem prawym do kreski"] # 0x2954 + - "â„•": [T: "dolny harpun z grotem prawym do kreski"] # 0x2955 + - "â„–": [T: "lewy harpun z grotem dolnym do kreski"] # 0x2956 + - "â„—": [T: "prawy harpun z grotem dolnym do kreski"] # 0x2957 + - "℘": [T: "gĂłrny harpun z grotem lewym do kreski"] # 0x2958 + - "â„™": [T: "dolny harpun z grotem lewym do kreski"] # 0x2959 + - "ℚ": [T: "lewy harpun z grotem gĂłrnym od kreski"] # 0x295a + - "â„›": [T: "prawy harpun z grotem gĂłrnym od kreski"] # 0x295b + - "ℜ": [T: "gĂłrny harpun z grotem prawym od kreski"] # 0x295c + - "ℝ": [T: "dolny harpun z grotem prawym od kreski"] # 0x295d + - "℞": [T: "lewy harpun z grotem dolnym od kreski"] # 0x295e + - "℟": [T: "prawy harpun z grotem dolnym od kreski"] # 0x295f + - "â„ ": [T: "gĂłrny harpun z grotem lewym od kreski"] # 0x2960 + - "℥": [T: "dolny harpun z grotem lewym od kreski"] # 0x2961 + - "ℹ": [T: "lewy harpun z grotem gĂłrnym nad lewy harpun z grotem dolnym"] # 0x2962 + - "℣": [T: "gĂłrny harpun z grotem w lewo obok gĂłrnego harpuna z grotem w prawo"] # 0x2963 + - "â„€": [T: "prawy harpun z grotem gĂłrnym nad prawy harpun z grotem dolnym"] # 0x2964 + - "â„„": [T: "dolny harpun z grotem w lewo obok dolnego harpuna z grotem w prawo"] # 0x2965 + - "ℊ": [T: "lewy harpun z grotem gĂłrnym nad prawy harpun z grotem gĂłrnym"] # 0x2966 + - "â„§": [T: "lewy harpun z grotem dolnym nad prawy harpun z grotem dolnym"] # 0x2967 + - "ℚ": [T: "prawy harpun z grotem gĂłrnym nad lewy harpun z grotem gĂłrnym"] # 0x2968 + - "â„©": [T: "prawy harpun z grotem dolnym nad lewy harpun z grotem dolnym"] # 0x2969 + - "â„Ș": [T: "lewy harpun z grotem gĂłrnym nad dƂugą kreską"] # 0x296a + - "â„«": [T: "lewy harpun z grotem dolnym pod dƂugą kreską"] # 0x296b + - "ℏ": [T: "prawy harpun z grotem gĂłrnym nad dƂugą kreską"] # 0x296c + - "â„­": [T: "prawy harpun z grotem dolnym pod dƂugą kreską"] # 0x296d + - "℟": [T: "gĂłrny harpun z grotem w lewo obok dolnego harpuna z grotem w prawo"] # 0x296e + - "ℯ": [T: "dolny harpun z grotem w lewo obok gĂłrnego harpuna z grotem w prawo"] # 0x296f + - "â„°": [T: "podwĂłjna strzaƂka w prawo z zaokrąglonym grotem"] # 0x2970 + - "ℱ": [T: "rĂłwna się nad strzaƂka w prawo"] # 0x2971 + - "â„Č": [T: "operator tyldy nad strzaƂką w prawo"] # 0x2972 + - "ℳ": [T: "strzaƂka w lewo nad operatorem tyldy"] # 0x2973 + - "ℎ": [T: "strzaƂka w prawo nad operatorem tyldy"] # 0x2974 + - "â„”": [T: "strzaƂka w prawo nad znakiem przybliĆŒonej rĂłwnoƛci"] # 0x2975 + - "â„¶": [T: "mniejsze niĆŒ nad strzaƂka w lewo"] # 0x2976 + - "â„·": [T: "strzaƂka w lewo przez znak mniejsze niĆŒ"] # 0x2977 + - "℞": [T: "większe niĆŒ nad strzaƂka w prawo"] # 0x2978 + - "â„č": [T: "podzbiĂłr nad strzaƂka w prawo"] # 0x2979 + - "â„ș": [T: "strzaƂka w lewo przez znak podzbioru"] # 0x297a + - "â„»": [T: "nadzbiĂłr nad strzaƂka w lewo"] # 0x297b + - "ℌ": [T: "lewy rybi ogon"] # 0x297c + - "ℜ": [T: "prawy rybi ogon"] # 0x297d + - "℟": [T: "gĂłrny rybi ogon"] # 0x297e + - "ℿ": [T: "dolny rybi ogon"] # 0x297f + - "⩀": [T: "potrĂłjna pionowa kreska jako ogranicznik"] # 0x2980 + - "⊁": [T: "punkt w notacji Z"] # 0x2981 + - "⩂": [T: "dwukropek typu w notacji Z"] # 0x2982 + - "⊃": [T: "lewy biaƂy nawias klamrowy"] # 0x2983 + - "⩄": [T: "prawy biaƂy nawias klamrowy"] # 0x2984 + - "⩅": [T: "lewy biaƂy nawias"] # 0x2985 + - "⩆": [T: "prawy biaƂy nawias"] # 0x2986 + - "⩇": [T: "lewy nawias kwadratowy obrazu w notacji Z"] # 0x2987 + - "⊈": [T: "prawy nawias kwadratowy obrazu w notacji Z"] # 0x2988 + - "⩉": [T: "lewy nawias kwadratowy wiązania w notacji Z"] # 0x2989 + - "⩊": [T: "prawy nawias kwadratowy wiązania w notacji Z"] # 0x298a + - "⩋": [T: "lewy nawias kwadratowy z podkreƛleniem"] # 0x298b + - "⩌": [T: "prawy nawias kwadratowy z podkreƛleniem"] # 0x298c + - "⊍": [T: "lewy nawias kwadratowy z haczykiem w gĂłrnym rogu"] # 0x298d + - "⊎": [T: "prawy nawias kwadratowy z haczykiem w dolnym rogu"] # 0x298e + - "⊏": [T: "lewy nawias kwadratowy z haczykiem w dolnym rogu"] # 0x298f + - "⊐": [T: "prawy nawias kwadratowy z haczykiem w gĂłrnym rogu"] # 0x2990 + - "⩑": [T: "lewy kąt nawias kwadratowy z kropką"] # 0x2991 + - "⩒": [T: "prawy nawias kątowy z kropką"] # 0x2992 + - "⩓": [T: "lewy Ƃuk mniejsze niĆŒ nawias kwadratowy"] # 0x2993 + - "⩔": [T: "prawy Ƃuk większe niĆŒ nawias kwadratowy"] # 0x2994 + - "⩕": [T: "podwĂłjny lewy Ƃuk większe niĆŒ nawias kwadratowy"] # 0x2995 + - "⩖": [T: "podwĂłjny prawy Ƃuk mniejsze niĆŒ nawias kwadratowy"] # 0x2996 + - "⩗": [T: "lewy czarny nawias skorupowy"] # 0x2997 + - "⊘": [T: "prawy czarny nawias skorupowy"] # 0x2998 + - "⩙": [T: "kropkowany ogranicznik"] # 0x2999 + - "⩚": [T: "pionowa linia zygzakowata"] # 0x299a + - "⩛": [T: "kąt mierzony otwarty w lewo"] # 0x299b + - "⩜": [T: "wariant kąta prostego z kwadratem"] # 0x299c + - "⊝": [T: "mierzony kąt prosty z kropką"] # 0x299d + - "⊞": [T: "kąt z s wewnątrz"] # 0x299e + - "⩟": [T: "akut kąt"] # 0x299f + - "⊠": [T: "kąt sferyczny otwarty w lewo"] # 0x29a0 + - "⊥": [T: "kąt sferyczny otwarty w gĂłrę"] # 0x29a1 + - "⊹": [T: "odwrĂłcony kąt"] # 0x29a2 + - "⊣": [T: "kąt odwrĂłcony"] # 0x29a3 + - "⊀": [T: "kąt z podkreƛleniem"] # 0x29a4 + - "⊄": [T: "kąt odwrĂłcony z podkreƛleniem"] # 0x29a5 + - "⊊": [T: "kąt ukoƛny otwarty w gĂłrę"] # 0x29a6 + - "⊧": [T: "kąt ukoƛny otwarty w dóƂ"] # 0x29a7 + - "⊚": [T: "kąt mierzony z otwartym ramieniem zakoƄczonym strzaƂką skierowaną w gĂłrę i w prawo"] # 0x29a8 + - "⊩": [T: "kąt mierzony z otwartym ramieniem zakoƄczonym strzaƂką skierowaną w gĂłrę i w lewo"] # 0x29a9 + - "âŠȘ": [T: "kąt mierzony z otwartym ramieniem zakoƄczonym strzaƂką skierowaną w dóƂ i w prawo"] # 0x29aa + - "⊫": [T: "kąt mierzony z otwartym ramieniem zakoƄczonym strzaƂką skierowaną w dóƂ i w lewo"] # 0x29ab + - "⊏": [T: "kąt mierzony z otwartym ramieniem zakoƄczonym strzaƂką skierowaną w prawo i w gĂłrę"] # 0x29ac + - "⊭": [T: "kąt mierzony z otwartym ramieniem zakoƄczonym strzaƂką skierowaną w lewo i w gĂłrę"] # 0x29ad + - "⊟": [T: "kąt mierzony z otwartym ramieniem zakoƄczonym strzaƂką skierowaną w prawo i w dóƂ"] # 0x29ae + - "⊯": [T: "kąt mierzony z otwartym ramieniem zakoƄczonym strzaƂką skierowaną w lewo i w dóƂ"] # 0x29af + - "⊰": [T: "odwrĂłcony zbiĂłr pusty"] # 0x29b0 + - "⊱": [T: "zbiĂłr pusty z kreską nad"] # 0x29b1 + - "âŠČ": [T: "zbiĂłr pusty z maƂym okręgiem nad"] # 0x29b2 + - "⊳": [T: "zbiĂłr pusty ze strzaƂką w prawo nad"] # 0x29b3 + - "⊎": [T: "zbiĂłr pusty ze strzaƂką w lewo nad"] # 0x29b4 + - "⊔": [T: "okrąg z kreską poziomą"] # 0x29b5 + - "⊶": [T: "pionowa kreska w kóƂku"] # 0x29b6 + - "⊷": [T: "w kóƂku rĂłwnolegƂe"] # 0x29b7 + - "⊞": [T: "ukoƛnik odwrotny w kóƂku"] # 0x29b8 + - "âŠč": [T: "w kóƂku prostopadƂe"] # 0x29b9 + - "âŠș": [T: "okrąg podzielony kreską poziomą, z gĂłrną poƂową podzieloną kreską pionową"] # 0x29ba + - "⊻": [T: "okrąg z naƂoĆŒonym X"] # 0x29bb + - "⊌": [T: "znak dzielenia w kóƂku obrĂłcony przeciwnie do ruchu wskazĂłwek zegara"] # 0x29bc + - "⊜": [T: "strzaƂka w gĂłrę przez okrąg"] # 0x29bd + - "⊟": [T: "w kóƂku biaƂy punkt"] # 0x29be + - "⊿": [T: "w kóƂku punkt"] # 0x29bf + - "⧀": [T: "w kóƂku mniejsze niĆŒ"] # 0x29c0 + - "⧁": [T: "w kóƂku większe niĆŒ"] # 0x29c1 + - "⧂": [T: "okrąg z maƂym okręgiem po prawej"] # 0x29c2 + - "⧃": [T: "okrąg z dwiema poziomymi kreskami po prawej"] # 0x29c3 + - "⧄": [T: "kwadrat z ukoƛnikiem wznoszącym"] # 0x29c4 + - "⧅": [T: "kwadrat z ukoƛnikiem opadającym"] # 0x29c5 + - "⧆": [T: "do kwadratu gwiazdka"] # 0x29c6 + - "⧇": [T: "do kwadratu maƂy okrąg"] # 0x29c7 + - "⧈": [T: "do kwadratu kwadrat"] # 0x29c8 + - "⧉": [T: "dwa poƂączone kwadraty"] # 0x29c9 + - "⧊": [T: "trĂłjkąt z kropką nad"] # 0x29ca + - "⧋": [T: "trĂłjkąt z podkreƛleniem"] # 0x29cb + - "⧌": [T: "s w trĂłjkąt"] # 0x29cc + - "⧍": [T: "trĂłjkąt z szeryfami u doƂu"] # 0x29cd + - "⧎": [T: "prawy trĂłjkąt nad lewy trĂłjkąt"] # 0x29ce + - "⧏": [T: "lewy trĂłjkąt obok pionowej kreski"] # 0x29cf + - "⧐": [T: "pionowa kreska obok prawego trĂłjkąta"] # 0x29d0 + - "⧑": [T: "kokarda z lewą poƂową czarną"] # 0x29d1 + - "⧒": [T: "kokarda z prawą poƂową czarną"] # 0x29d2 + - "⧓": [T: "czarna kokarda"] # 0x29d3 + - "⧔": [T: "znak mnoĆŒenia z lewą poƂową czarną"] # 0x29d4 + - "⧕": [T: "znak mnoĆŒenia z prawą poƂową czarną"] # 0x29d5 + - "⧖": [T: "biaƂy klepsydra"] # 0x29d6 + - "⧗": [T: "czarny klepsydra"] # 0x29d7 + - "⧘": [T: "lewy falisty ogranicznik"] # 0x29d8 + - "⧙": [T: "prawy falisty ogranicznik"] # 0x29d9 + - "⧚": [T: "lewy podwĂłjny falisty ogranicznik"] # 0x29da + - "⧛": [T: "prawy podwĂłjny falisty ogranicznik"] # 0x29db + - "⧜": [T: "niepeƂna nieskoƄczonoƛć"] # 0x29dc + - "⧝": [T: "wiązanie nad nieskoƄczonoƛcią"] # 0x29dd + - "⧞": [T: "zanegowana nieskoƄczonoƛć z kreską pionową"] # 0x29de + - "⧟": [T: "podwĂłjnie zakoƄczona strzaƂka mapująca"] # 0x29df + - "â§ ": [T: "kwadrat z konturowym obrysem"] # 0x29e0 + - "â§Ą": [T: "wzrasta jak"] # 0x29e1 + - "â§ą": [T: "iloczyn przetasowania"] # 0x29e2 + - "â§Ł": [T: "znak rĂłwnoƛci i ukoƛne rĂłwnolegƂe"] # 0x29e3 + - "â§€": [T: "znak rĂłwnoƛci i ukoƛne rĂłwnolegƂe z tyldą nad"] # 0x29e4 + - "â§„": [T: "identyczne i ukoƛne rĂłwnolegƂe"] # 0x29e5 + - "â§Š": [T: "rĂłwnoliczne"] # 0x29e6 + - "â§§": [T: "termodynamiczny"] # 0x29e7 + - "â§š": [T: "trĂłjkąt skierowany w dóƂ z lewą poƂową czarną"] # 0x29e8 + - "â§©": [T: "trĂłjkąt skierowany w dóƂ z prawą poƂową czarną"] # 0x29e9 + - "â§Ș": [T: "czarny romb ze strzaƂką w dóƂ"] # 0x29ea + - "â§«": [T: "czarny romb"] # 0x29eb + - "â§Ź": [T: "biaƂe koƂo ze strzaƂką w dóƂ"] # 0x29ec + - "â§­": [T: "czarne koƂo ze strzaƂką w dóƂ"] # 0x29ed + - "â§ź": [T: "biaƂy kwadrat z przekreƛleniem bƂędu"] # 0x29ee + - "â§Ż": [T: "czarny kwadrat z przekreƛleniem bƂędu"] # 0x29ef + - "â§°": [T: "biaƂy romb z przekreƛleniem bƂędu"] # 0x29f0 + - "â§±": [T: "czarny romb z przekreƛleniem bƂędu"] # 0x29f1 + - "â§Č": [T: "biaƂe koƂo z przekreƛleniem bƂędu"] # 0x29f2 + - "â§ł": [T: "czarne koƂo z przekreƛleniem bƂędu"] # 0x29f3 + - "â§Ž": [T: "opĂłĆșniona reguƂa"] # 0x29f4 + - "â§”": [T: "operator ukoƛnika odwrotnego"] # 0x29f5 + - "â§¶": [T: "ukoƛnik z kreską nad"] # 0x29f6 + - "â§·": [T: "ukoƛnik odwrotny z poziomą kreską"] # 0x29f7 + - "â§ž": [T: "duĆŒy ukoƛnik"] # 0x29f8 + - "â§č": [T: "duĆŒy ukoƛnik odwrotny"] # 0x29f9 + - "â§ș": [T: "podwĂłjny plus"] # 0x29fa + - "â§»": [T: "potrĂłjny plus"] # 0x29fb + - "â§Œ": [T: "lewy zakrzywiony nawias kątowy"] # 0x29fc + - "â§œ": [T: "prawy zakrzywiony nawias kątowy"] # 0x29fd + - "â§Ÿ": [T: "maleƄki"] # 0x29fe + - "â§ż": [T: "mini"] # 0x29ff + - "⹀": [T: "operator kropka w kóƂku"] # 0x2a00 + - "⚁": [T: "operator plus w kóƂku"] # 0x2a01 + - "⹂": [T: "operator razy w kóƂku"] # 0x2a02 + - "⚃": [T: "operator sumy zbiorĂłw z kropką"] # 0x2a03 + - "⹄": [T: "operator sumy zbiorĂłw z plusem"] # 0x2a04 + - "⹅": [T: "operator kwadratowej częƛci wspĂłlnej"] # 0x2a05 + - "⹆": [T: "operator kwadratowej sumy zbiorĂłw"] # 0x2a06 + - "⹇": [T: "operator podwĂłjnej koniunkcji logicznej"] # 0x2a07 + - "⚈": [T: "dwa logiczne lub operator"] # 0x2a08 + - "⹉": [T: "razy operator"] # 0x2a09 + - "⹊": [T: "suma modulo dwa"] # 0x2a0a + - "⹋": [T: "suma z caƂką"] # 0x2a0b + - "⹌": [T: "operator poczwĂłrnej caƂki"] # 0x2a0c + - "⚍": [T: "caƂka częƛci skoƄczonej"] # 0x2a0d + - "⚎": [T: "caƂka z podwĂłjnym przekreƛleniem"] # 0x2a0e + - "⚏": [T: "caƂka uƛredniona z ukoƛnikiem"] # 0x2a0f + - "⚐": [T: "funkcja cyrkulacji"] # 0x2a10 + - "⹑": [T: "caƂka przeciwna do ruchu wskazĂłwek zegara"] # 0x2a11 + - "⹒": [T: "caƂka liniowa po prostokątnej ƛcieĆŒce wokóƂ bieguna"] # 0x2a12 + - "⹓": [T: "caƂka liniowa po póƂokrągƂej ƛcieĆŒce wokóƂ bieguna"] # 0x2a13 + - "⹔": [T: "caƂka liniowa bez pola"] # 0x2a14 + - "⹕": [T: "operator caƂki wokóƂ punktu"] # 0x2a15 + - "⹖": [T: "operator caƂki kwaternionowej"] # 0x2a16 + - "⹗": [T: "caƂka ze strzaƂką w lewo z haczykiem"] # 0x2a17 + - "⚘": [T: "caƂka ze znakiem razy"] # 0x2a18 + - "⹙": [T: "caƂka z częƛcią wspĂłlną"] # 0x2a19 + - "⹚": [T: "caƂka z sumą zbiorĂłw"] # 0x2a1a + - "⹛": [T: "caƂka z kreską nad"] # 0x2a1b + - "⹜": [T: "caƂka z podkreƛleniem"] # 0x2a1c + - "⚝": [T: "zƂączenie"] # 0x2a1d + - "⚞": [T: "duĆŒy lewy trĂłjkąt operator"] # 0x2a1e + - "⹟": [T: "skƂadanie schematĂłw w notacji Z"] # 0x2a1f + - "âš ": [T: "potok schematĂłw w notacji Z"] # 0x2a20 + - "⚥": [T: "rzutowanie schematĂłw w notacji Z"] # 0x2a21 + - "âšą": [T: "znak plus z okręgiem nad"] # 0x2a22 + - "⚣": [T: "znak plus z daszkiem nad"] # 0x2a23 + - "⚀": [T: "znak plus z tyldą nad"] # 0x2a24 + - "âš„": [T: "znak plus z kropką pod"] # 0x2a25 + - "⚊": [T: "znak plus z tyldą pod"] # 0x2a26 + - "âš§": [T: "znak plus z indeksem dolnym dwa"] # 0x2a27 + - "âšš": [T: "znak plus z czarnym trĂłjkątem"] # 0x2a28 + - "âš©": [T: "znak minus z przecinkiem nad"] # 0x2a29 + - "âšȘ": [T: "znak minus z kropką pod"] # 0x2a2a + - "âš«": [T: "znak minus z kropkami opadającymi"] # 0x2a2b + - "⚏": [T: "znak minus z kropkami wznoszącymi"] # 0x2a2c + - "âš­": [T: "znak plus w lewej poƂówce okręgu"] # 0x2a2d + - "âšź": [T: "znak plus w prawej poƂówce okręgu"] # 0x2a2e - "⚯": # 0x2a2f - test: if: "$Verbosity='Terse'" - then: [t: "krzyĆŒ"] - else: [t: "krzyĆŒ iloczyn"] - - "âš°": [t: "znak mnoĆŒenia z kropką nad"] # 0x2a30 - - "âš±": [t: "znak mnoĆŒenia z podkreƛleniem"] # 0x2a31 - - "âšČ": [t: "iloczyn póƂprosty domknięty od doƂu"] # 0x2a32 - - "âšł": [t: "iloczyn spƂaszczony"] # 0x2a33 - - "⚎": [t: "znak mnoĆŒenia w lewej poƂówce okręgu"] # 0x2a34 - - "âš”": [t: "znak mnoĆŒenia w prawej poƂówce okręgu"] # 0x2a35 - - "âš¶": [t: "znak mnoĆŒenia w kóƂku z daszkiem"] # 0x2a36 - - "âš·": [t: "znak mnoĆŒenia w podwĂłjnym okręgu"] # 0x2a37 - - "âšž": [t: "znak dzielenia w kóƂku"] # 0x2a38 - - "âšč": [t: "znak plus w trĂłjkącie"] # 0x2a39 - - "âšș": [t: "znak minus w trĂłjkącie"] # 0x2a3a - - "âš»": [t: "znak mnoĆŒenia w trĂłjkącie"] # 0x2a3b - - "⚌": [t: "iloczyn wewnętrzny"] # 0x2a3c - - "âšœ": [t: "prawostronny iloczyn wewnętrzny"] # 0x2a3d - - "⚟": [t: "skƂadanie relacji w notacji Z"] # 0x2a3e - - "âšż": [t: "amalgamacja lub koprodukt"] # 0x2a3f - - "⩀": [t: "częƛć wspĂłlna z kropką"] # 0x2a40 - - "⩁": [t: "suma zbiorĂłw ze znakiem minus"] # 0x2a41 - - "⩂": [t: "suma zbiorĂłw z kreską nad"] # 0x2a42 - - "⩃": [t: "częƛć wspĂłlna z kreską nad"] # 0x2a43 - - "⩄": [t: "częƛć wspĂłlna z koniunkcją logiczną"] # 0x2a44 - - "⩅": [t: "suma zbiorĂłw z alternatywą logiczną"] # 0x2a45 - - "⩆": [t: "suma zbiorĂłw nad częƛć wspĂłlna"] # 0x2a46 - - "⩇": [t: "częƛć wspĂłlna nad suma zbiorĂłw"] # 0x2a47 - - "⩈": [t: "suma zbiorĂłw nad kreska nad częƛć wspĂłlna"] # 0x2a48 - - "⩉": [t: "częƛć wspĂłlna nad kreska nad suma zbiorĂłw"] # 0x2a49 - - "⩊": [t: "suma zbiorĂłw obok sumy zbiorĂłw poƂączona kreską"] # 0x2a4a - - "⩋": [t: "częƛć wspĂłlna obok częƛci wspĂłlnej poƂączona kreską"] # 0x2a4b - - "⩌": [t: "zamknięta suma zbiorĂłw z szeryfami"] # 0x2a4c - - "⩍": [t: "zamknięta częƛć wspĂłlna z szeryfami"] # 0x2a4d - - "⩎": [t: "podwĂłjny kwadrat częƛć wspĂłlna"] # 0x2a4e - - "⩏": [t: "podwĂłjny kwadrat suma zbiorĂłw"] # 0x2a4f - - "⩐": [t: "zamknięta suma zbiorĂłw z szeryfami i iloczynem spƂaszczonym"] # 0x2a50 - - "⩑": [t: "koniunkcja logiczna z kropką nad"] # 0x2a51 - - "⩒": [t: "logiczne lub z kropką nad"] # 0x2a52 - - "⩓": [t: "podwĂłjna koniunkcja logiczna"] # 0x2a53 - - "⩔": [t: "podwĂłjny logiczne lub"] # 0x2a54 - - "⩕": [t: "dwa przecinające się logiczne i"] # 0x2a55 - - "⩖": [t: "dwa przecinające się logiczne lub"] # 0x2a56 - - "⩗": [t: "skoƛne duĆŒe lub"] # 0x2a57 - - "⩘": [t: "skoƛne duĆŒe i"] # 0x2a58 - - "⩙": [t: "logiczne lub nakƂadające się na logiczne i"] # 0x2a59 - - "⩚": [t: "logiczne i ze ƛrodkowym trzonem"] # 0x2a5a - - "⩛": [t: "logiczne lub ze ƛrodkowym trzonem"] # 0x2a5b - - "⩜": [t: "koniunkcja logiczna z poziomą kreską"] # 0x2a5c - - "⩝": [t: "alternatywa logiczna z poziomą kreską"] # 0x2a5d - - "⩞": [t: "logiczne i z podwĂłjną kreską nad"] # 0x2a5e - - "⩟": [t: "koniunkcja logiczna z podkreƛleniem"] # 0x2a5f - - "â© ": [t: "logiczne i z podwĂłjną kreską pod"] # 0x2a60 - - "⩥": [t: "maƂe logiczne lub z podkreƛleniem"] # 0x2a61 - - "⩹": [t: "logiczne lub z podwĂłjną kreską nad"] # 0x2a62 - - "⩣": [t: "logiczne lub z podwĂłjną kreską pod"] # 0x2a63 - - "â©€": [t: "antyograniczenie dziedziny w notacji Z"] # 0x2a64 - - "â©„": [t: "antyograniczenie przeciwdziedziny w notacji Z"] # 0x2a65 - - "⩊": [t: "znak rĂłwnoƛci z kropką pod spodem"] # 0x2a66 - - "â©§": [t: "identyczne z kropką nad"] # 0x2a67 - - "⩚": [t: "potrĂłjna kreska pozioma z podwĂłjną pionową kreską"] # 0x2a68 - - "â©©": [t: "potrĂłjna kreska pozioma z potrĂłjną pionową kreską"] # 0x2a69 - - "â©Ș": [t: "operator tyldy z kropką nad"] # 0x2a6a - - "â©«": [t: "operator tyldy ze wznoszącymi kropkami"] # 0x2a6b - - "⩏": [t: "podobne minus podobne"] # 0x2a6c - - "â©­": [t: "przystające z kropką nad"] # 0x2a6d - - "⩟": [t: "rĂłwna się z gwiazdką"] # 0x2a6e - - "⩯": [t: "w przybliĆŒeniu rĂłwne z daszkiem"] # 0x2a6f - - "â©°": [t: "w przybliĆŒeniu rĂłwne lub rĂłwne"] # 0x2a70 - - "⩱": [t: "znak rĂłwnoƛci nad znakiem plus"] # 0x2a71 - - "â©Č": [t: "znak plus nad znakiem rĂłwnoƛci"] # 0x2a72 - - "⩳": [t: "znak rĂłwnoƛci nad operatorem tyldy"] # 0x2a73 - - "⩎": [t: "podwĂłjny dwukropek rĂłwne"] # 0x2a74 - - "â©”": [t: "dwa kolejne znaki rĂłwnoƛci"] # 0x2a75 - - "â©¶": [t: "trzy kolejne znaki rĂłwnoƛci"] # 0x2a76 - - "â©·": [t: "znak rĂłwnoƛci z dwiema kropkami nad i dwiema kropkami pod"] # 0x2a77 - - "⩞": [t: "rĂłwnowaĆŒne z czterema kropkami nad"] # 0x2a78 - - "â©č": [t: "mniejsze niĆŒ z okrąg wewnątrz"] # 0x2a79 - - "â©ș": [t: "większe niĆŒ z okrąg wewnątrz"] # 0x2a7a - - "â©»": [t: "mniejsze niĆŒ ze znakiem zapytania nad"] # 0x2a7b - - "⩌": [t: "większe niĆŒ ze znakiem zapytania nad"] # 0x2a7c - - "⩜": [t: "mniejsze niĆŒ lub ukoƛnie rĂłwne"] # 0x2a7d - - "⩟": [t: "większe niĆŒ lub ukoƛnie rĂłwne"] # 0x2a7e - - "⩿": [t: "mniejsze niĆŒ lub ukoƛnie rĂłwne z kropką wewnątrz"] # 0x2a7f - - "âȘ€": [t: "większe niĆŒ lub ukoƛnie rĂłwne z kropką wewnątrz"] # 0x2a80 - - "âȘ": [t: "mniejsze niĆŒ lub ukoƛnie rĂłwne z kropką nad"] # 0x2a81 - - "âȘ‚": [t: "większe niĆŒ lub ukoƛnie rĂłwne z kropką nad"] # 0x2a82 - - "âȘƒ": [t: "mniejsze niĆŒ lub ukoƛnie rĂłwne z kropką nad prawą stroną"] # 0x2a83 - - "âȘ„": [t: "większe niĆŒ lub ukoƛnie rĂłwne z kropką nad lewą stroną"] # 0x2a84 - - "âȘ…": [t: "mniejsze niĆŒ lub przybliĆŒone"] # 0x2a85 - - "âȘ†": [t: "większe niĆŒ lub przybliĆŒone"] # 0x2a86 - - "âȘ‡": [t: "mniejsze niĆŒ z pojedynczą linią nierĂłwnoƛci"] # 0x2a87 - - "âȘˆ": [t: "większe niĆŒ z pojedynczą linią nierĂłwnoƛci"] # 0x2a88 - - "âȘ‰": [t: "mniejsze niĆŒ i nie przybliĆŒone"] # 0x2a89 - - "âȘŠ": [t: "większe niĆŒ i nie przybliĆŒone"] # 0x2a8a - - "âȘ‹": [t: "mniejsze niĆŒ nad podwĂłjną linią rĂłwnoƛci nad większe niĆŒ"] # 0x2a8b - - "âȘŒ": [t: "większe niĆŒ nad podwĂłjną linią rĂłwnoƛci nad mniejsze niĆŒ"] # 0x2a8c - - "âȘ": [t: "mniejsze niĆŒ nad podobne lub rĂłwne"] # 0x2a8d - - "âȘŽ": [t: "większe niĆŒ nad podobne lub rĂłwne"] # 0x2a8e - - "âȘ": [t: "mniejsze niĆŒ nad podobne nad większe niĆŒ"] # 0x2a8f - - "âȘ": [t: "większe niĆŒ nad podobne nad mniejsze niĆŒ"] # 0x2a90 - - "âȘ‘": [t: "mniejsze niĆŒ nad większe niĆŒ nad podwĂłjną linią rĂłwnoƛci"] # 0x2a91 - - "âȘ’": [t: "większe niĆŒ nad mniejsze niĆŒ nad podwĂłjną linią rĂłwnoƛci"] # 0x2a92 - - "âȘ“": [t: "mniejsze niĆŒ nad ukoƛnie rĂłwne nad większe niĆŒ nad ukoƛnie rĂłwne"] # 0x2a93 - - "âȘ”": [t: "większe niĆŒ nad ukoƛnie rĂłwne nad mniejsze niĆŒ nad ukoƛnie rĂłwne"] # 0x2a94 - - "âȘ•": [t: "ukoƛnie rĂłwne lub mniejsze niĆŒ"] # 0x2a95 - - "âȘ–": [t: "ukoƛnie rĂłwne lub większe niĆŒ"] # 0x2a96 - - "âȘ—": [t: "ukoƛnie rĂłwne lub mniejsze niĆŒ z kropką wewnątrz"] # 0x2a97 - - "âȘ˜": [t: "ukoƛnie rĂłwne lub większe niĆŒ z kropką wewnątrz"] # 0x2a98 - - "âȘ™": [t: "podwĂłjna linia rĂłwna lub mniejsze niĆŒ"] # 0x2a99 - - "âȘš": [t: "podwĂłjna linia rĂłwna lub większe niĆŒ"] # 0x2a9a - - "âȘ›": [t: "podwĂłjna linia ukoƛnie rĂłwna lub mniejsze niĆŒ"] # 0x2a9b - - "âȘœ": [t: "podwĂłjna linia ukoƛnie rĂłwna lub większe niĆŒ"] # 0x2a9c - - "âȘ": [t: "podobne lub mniejsze niĆŒ"] # 0x2a9d - - "âȘž": [t: "podobne lub większe niĆŒ"] # 0x2a9e - - "âȘŸ": [t: "podobne nad mniejsze niĆŒ nad znakiem rĂłwnoƛci"] # 0x2a9f - - "âȘ ": [t: "podobne nad większe niĆŒ nad znakiem rĂłwnoƛci"] # 0x2aa0 - - "âȘĄ": [t: "podwĂłjnie zagnieĆŒdĆŒone mniejsze niĆŒ"] # 0x2aa1 - - "âȘą": [t: "podwĂłjnie zagnieĆŒdĆŒone większe niĆŒ"] # 0x2aa2 - - "âȘŁ": [t: "podwĂłjnie zagnieĆŒdĆŒone mniejsze niĆŒ z podkreƛleniem"] # 0x2aa3 - - "âȘ€": [t: "większe niĆŒ nakƂadające się na mniejsze niĆŒ"] # 0x2aa4 - - "âȘ„": [t: "większe niĆŒ obok mniejsze niĆŒ"] # 0x2aa5 - - "âȘŠ": [t: "mniejsze niĆŒ zamknięte krzywą"] # 0x2aa6 - - "âȘ§": [t: "większe niĆŒ zamknięte krzywą"] # 0x2aa7 - - "âȘš": [t: "mniejsze niĆŒ zamknięte krzywą nad ukoƛnie rĂłwne"] # 0x2aa8 - - "âȘ©": [t: "większe niĆŒ zamknięte krzywą nad ukoƛnie rĂłwne"] # 0x2aa9 - - "âȘȘ": [t: "mniejsze niĆŒ"] # 0x2aaa - - "âȘ«": [t: "większe niĆŒ"] # 0x2aab - - "âȘŹ": [t: "mniejsze niĆŒ lub rĂłwne"] # 0x2aac - - "âȘ­": [t: "większe niĆŒ lub rĂłwne"] # 0x2aad - - "âȘź": [t: "znak rĂłwnoƛci z garbem nad"] # 0x2aae - - "âȘŻ": [t: "poprzedza nad pojedynczą linią rĂłwnoƛci"] # 0x2aaf - - "âȘ°": [t: "następuje po nad pojedynczą linią rĂłwnoƛci"] # 0x2ab0 - - "âȘ±": [t: "poprzedza nad pojedynczą linią nierĂłwnoƛci"] # 0x2ab1 - - "âȘČ": [t: "następuje po nad pojedynczy linia nie rĂłwna się"] # 0x2ab2 - - "âȘł": [t: "poprzedza nad znakiem rĂłwnoƛci"] # 0x2ab3 - - "âȘŽ": [t: "następuje po nad znakiem rĂłwnoƛci"] # 0x2ab4 - - "âȘ”": [t: "poprzedza nad nie rĂłwna się"] # 0x2ab5 - - "âȘ¶": [t: "następuje po nad nie rĂłwna się"] # 0x2ab6 - - "âȘ·": [t: "poprzedza nad znakiem przybliĆŒonej rĂłwnoƛci"] # 0x2ab7 - - "âȘž": [t: "następuje po nad znakiem przybliĆŒonej rĂłwnoƛci"] # 0x2ab8 - - "âȘč": [t: "poprzedza nad znakiem nie w przybliĆŒeniu rĂłwne"] # 0x2ab9 - - "âȘș": [t: "następuje po nad znakiem nie w przybliĆŒeniu rĂłwne"] # 0x2aba - - "âȘ»": [t: "podwĂłjny poprzedza"] # 0x2abb - - "âȘŒ": [t: "podwĂłjny następuje po"] # 0x2abc - - "âȘœ": [t: "podzbiĂłr z kropką"] # 0x2abd - - "âȘŸ": [t: "nadzbiĂłr z kropką"] # 0x2abe - - "âȘż": [t: "podzbiĂłr ze znakiem plus pod spodem"] # 0x2abf - - "⫀": [t: "nadzbiĂłr ze znakiem plus pod spodem"] # 0x2ac0 - - "⫁": [t: "podzbiĂłr ze znakiem mnoĆŒenia pod"] # 0x2ac1 - - "⫂": [t: "nadzbiĂłr ze znakiem mnoĆŒenia pod"] # 0x2ac2 - - "⫃": [t: "podzbiĂłr lub rĂłwny z kropką nad"] # 0x2ac3 - - "⫄": [t: "nadzbiĂłr lub rĂłwny z kropką nad"] # 0x2ac4 - - "⫅": [t: "podzbiĂłr nad znakiem rĂłwnoƛci"] # 0x2ac5 - - "⫆": [t: "nadzbiĂłr nad znakiem rĂłwnoƛci"] # 0x2ac6 - - "⫇": [t: "podzbiĂłr nad operatorem tyldy"] # 0x2ac7 - - "⫈": [t: "nadzbiĂłr nad operatorem tyldy"] # 0x2ac8 - - "⫉": [t: "podzbiĂłr nad znakiem przybliĆŒonej rĂłwnoƛci"] # 0x2ac9 - - "⫊": [t: "nadzbiĂłr nad znakiem przybliĆŒonej rĂłwnoƛci"] # 0x2aca - - "⫋": [t: "podzbiĂłr nad nie rĂłwna się"] # 0x2acb - - "⫌": [t: "nadzbiĂłr nad nie rĂłwna się"] # 0x2acc - - "⫍": [t: "kwadrat lewy otwĂłrz ramka operator"] # 0x2acd - - "⫎": [t: "kwadrat prawy otwĂłrz ramka operator"] # 0x2ace - - "⫏": [t: "zamknięty podzbiĂłr"] # 0x2acf - - "⫐": [t: "zamknięty nadzbiĂłr"] # 0x2ad0 - - "⫑": [t: "zamknięty podzbiĂłr lub rĂłwne"] # 0x2ad1 - - "⫒": [t: "zamknięty nadzbiĂłr lub rĂłwne"] # 0x2ad2 - - "⫓": [t: "podzbiĂłr nad nadzbiĂłr"] # 0x2ad3 - - "⫔": [t: "nadzbiĂłr nad podzbiĂłr"] # 0x2ad4 - - "⫕": [t: "podzbiĂłr nad podzbiĂłr"] # 0x2ad5 - - "⫖": [t: "nadzbiĂłr nad nadzbiĂłr"] # 0x2ad6 - - "⫗": [t: "nadzbiĂłr obok podzbioru"] # 0x2ad7 - - "⫘": [t: "nadzbiĂłr obok podzbioru poƂączony kreską"] # 0x2ad8 - - "⫙": [t: "naleĆŒy do otwarte od doƂu"] # 0x2ad9 - - "⫚": [t: "widƂy z gĂłrną poprzeczką"] # 0x2ada - - "⫛": [t: "poprzeczna częƛć wspĂłlna"] # 0x2adb - - "⫝̸": [t: "rozwidlanie"] # 0x2adc - - "⫝": [t: "nierozwidlanie"] # 0x2add - - "⫞": [t: "krĂłtki lewy znacznik"] # 0x2ade - - "⫟": [t: "krĂłtki dolny znacznik"] # 0x2adf - - "â« ": [t: "krĂłtki gĂłrny znacznik"] # 0x2ae0 - - "⫥": [t: "prostopadƂe z literą s"] # 0x2ae1 - - "⫹": [t: "pionowa kreska z potrĂłjnym prawym znacznikiem dedukcji"] # 0x2ae2 - - "⫣": [t: "podwĂłjna pionowa kreska z lewym znacznikiem dedukcji"] # 0x2ae3 - - "â«€": [t: "pionowa kreska z podwĂłjnym lewym znacznikiem dedukcji"] # 0x2ae4 - - "â«„": [t: "podwĂłjna pionowa kreska z podwĂłjnym lewym znacznikiem dedukcji"] # 0x2ae5 - - "⫊": [t: "dƂuga kreska od lewego elementu z podwĂłjną pionową kreską"] # 0x2ae6 - - "â«§": [t: "krĂłtki dolny znacznik z kreską nad"] # 0x2ae7 - - "⫚": [t: "krĂłtki gĂłrny znacznik z podkreƛleniem"] # 0x2ae8 - - "â«©": [t: "krĂłtki gĂłrny znacznik nad krĂłtkim dolnym znacznikiem"] # 0x2ae9 - - "â«Ș": [t: "podwĂłjny dolny znacznik"] # 0x2aea - - "â««": [t: "podwĂłjny gĂłrny znacznik"] # 0x2aeb - - "⫏": [t: "znak negacji z podwĂłjnym przekreƛleniem"] # 0x2aec - - "â«­": [t: "odwrĂłcony znak negacji z podwĂłjnym przekreƛleniem"] # 0x2aed - - "⫟": [t: "nie dzieli z odwrĂłconym ukoƛnikiem negacji"] # 0x2aee - - "⫯": [t: "pionowa linia z okręgiem nad"] # 0x2aef - - "â«°": [t: "pionowa linia z okręgiem pod"] # 0x2af0 - - "⫱": [t: "dolny znacznik z okręgiem pod"] # 0x2af1 - - "â«Č": [t: "rĂłwnolegƂe z poziomą kreską"] # 0x2af2 - - "⫳": [t: "rĂłwnolegƂe z operatorem tyldy"] # 0x2af3 - - "⫎": [t: "potrĂłjna pionowa kreska jako relacja binarna"] # 0x2af4 - - "â«”": [t: "potrĂłjna pionowa kreska z poziomą kreską"] # 0x2af5 - - "â«¶": [t: "potrĂłjny dwukropek operator"] # 0x2af6 - - "â«·": [t: "potrĂłjnie zagnieĆŒdĆŒone mniejsze niĆŒ"] # 0x2af7 - - "⫞": [t: "potrĂłjnie zagnieĆŒdĆŒone większe niĆŒ"] # 0x2af8 - - "â«č": [t: "podwĂłjna linia ukoƛnie mniejsze lub rĂłwne"] # 0x2af9 - - "â«ș": [t: "podwĂłjna linia ukoƛnie większe lub rĂłwne"] # 0x2afa - - "â«»": [t: "potrĂłjny ukoƛnik jako relacja binarna"] # 0x2afb - - "⫌": [t: "operator duĆŒej potrĂłjnej pionowej kreski"] # 0x2afc - - "⫝̸": [t: "podwĂłjny ukoƛnik operator"] # 0x2afd - - "⫟": [t: "biaƂa pionowa kreska"] # 0x2afe - - "⫿": [t: "biaƂa pionowa kreska"] # 0x2aff - - "⬀": [t: "biaƂa strzaƂka na póƂnocny wschĂłd"] # 0x2b00 - - "⏁": [t: "biaƂa strzaƂka na póƂnocny zachĂłd"] # 0x2b01 - - "⬂": [t: "biaƂa strzaƂka na poƂudniowy wschĂłd"] # 0x2b02 - - "⏃": [t: "biaƂa strzaƂka na poƂudniowy zachĂłd"] # 0x2b03 - - "⬄": [t: "biaƂa strzaƂka w lewo i w prawo"] # 0x2b04 - - "⬅": [t: "lewy czarny strzaƂka"] # 0x2b05 - - "⬆": [t: "gĂłrny czarny strzaƂka"] # 0x2b06 - - "⬇": [t: "dolny czarny strzaƂka"] # 0x2b07 - - "⏈": [t: "póƂnoc wschĂłd czarny strzaƂka"] # 0x2b08 - - "⬉": [t: "póƂnoc zachĂłd czarny strzaƂka"] # 0x2b09 - - "⬊": [t: "poƂudnie wschĂłd czarny strzaƂka"] # 0x2b0a - - "⬋": [t: "poƂudnie zachĂłd czarny strzaƂka"] # 0x2b0b - - "⬌": [t: "lewy prawy czarny strzaƂka"] # 0x2b0c - - "⬍": [t: "gĂłrny dolny czarny strzaƂka"] # 0x2b0d - - "⬎": [t: "strzaƂka w prawo z dolnym czubkiem"] # 0x2b0e - - "⬏": [t: "strzaƂka w prawo z gĂłrnym czubkiem"] # 0x2b0f - - "⏐": [t: "strzaƂka w lewo z dolnym czubkiem"] # 0x2b10 - - "⬑": [t: "strzaƂka w lewo z gĂłrnym czubkiem"] # 0x2b11 - - "⬒": [t: "kwadrat z gĂłrną poƂową czarną"] # 0x2b12 - - "⬓": [t: "kwadrat z dolną poƂową czarną"] # 0x2b13 - - "⬔": [t: "kwadrat z gĂłrną prawą ukoƛną poƂową czarną"] # 0x2b14 - - "⬕": [t: "kwadrat z dolną lewą ukoƛną poƂową czarną"] # 0x2b15 - - "⬖": [t: "romb z lewą poƂową czarną"] # 0x2b16 - - "⬗": [t: "romb z prawą poƂową czarną"] # 0x2b17 - - "⏘": [t: "romb z gĂłrną poƂową czarną"] # 0x2b18 - - "⬙": [t: "romb z dolną poƂową czarną"] # 0x2b19 - - "⬚": [t: "ramka"] # 0x2b1a - - "⬛": [t: "czarny duĆŒy kwadrat"] # 0x2b1b - - "⬜": [t: "biaƂy duĆŒy kwadrat"] # 0x2b1c - - "⬝": [t: "czarny bardzo maƂy kwadrat"] # 0x2b1d - - "⬞": [t: "biaƂy bardzo maƂy kwadrat"] # 0x2b1e - - "⬟": [t: "czarny pięciokąt"] # 0x2b1f - - "⏠": [t: "biaƂy pięciokąt"] # 0x2b20 - - "⏥": [t: "biaƂy szeƛciokąt"] # 0x2b21 - - "⏹": [t: "czarny szeƛciokąt"] # 0x2b22 - - "⏣": [t: "poziomy czarny szeƛciokąt"] # 0x2b23 - - "⏀": [t: "czarny duĆŒy okrąg"] # 0x2b24 - - "⏄": [t: "czarny ƛredni romb"] # 0x2b25 - - "⏊": [t: "biaƂy ƛredni romb"] # 0x2b26 - - "⏧": [t: "czarny ƛredni romb"] # 0x2b27 - - "⏚": [t: "biaƂy ƛredni romb"] # 0x2b28 - - "⏩": [t: "czarny maƂy romb"] # 0x2b29 - - "âŹȘ": [t: "czarny maƂy romb"] # 0x2b2a - - "⏫": [t: "biaƂy maƂy romb"] # 0x2b2b - - "⏏": [t: "czarna pozioma elipsa"] # 0x2b2c - - "⏭": [t: "biaƂa pozioma elipsa"] # 0x2b2d - - "⏟": [t: "czarna pionowa elipsa"] # 0x2b2e - - "⏯": [t: "biaƂa pionowa elipsa"] # 0x2b2f - - "⏰": [t: "strzaƂka w lewo z maƂym okręgiem"] # 0x2b30 - - "⏱": [t: "trzy strzaƂki w lewo"] # 0x2b31 - - "âŹČ": [t: "strzaƂka w lewo z plusem w kóƂku"] # 0x2b32 - - "⏳": [t: "dƂuga falista strzaƂka w lewo"] # 0x2b33 - - "⏎": [t: "strzaƂka w lewo z dwoma grotami i pionowym przekreƛleniem"] # 0x2b34 - - "⏔": [t: "strzaƂka w lewo z dwoma grotami i podwĂłjnym pionowym przekreƛleniem"] # 0x2b35 - - "⏶": [t: "strzaƂka w lewo z dwoma grotami od kreski"] # 0x2b36 - - "⏷": [t: "strzaƂka w lewo z dwoma grotami i potrĂłjną kreską"] # 0x2b37 - - "⏞": [t: "strzaƂka w lewo z kropkowanym trzonem"] # 0x2b38 - - "âŹč": [t: "strzaƂka w lewo z ogonem i pionową kreską"] # 0x2b39 - - "âŹș": [t: "strzaƂka w lewo z ogonem i podwĂłjną pionową kreską"] # 0x2b3a - - "⏻": [t: "strzaƂka w lewo z dwoma grotami i ogonem"] # 0x2b3b - - "âŹŒ": [t: "strzaƂka w lewo z dwoma grotami, ogonem i pionowym przekreƛleniem"] # 0x2b3c - - "âŹœ": [t: "strzaƂka w lewo z dwoma grotami, ogonem i podwĂłjnym pionowym przekreƛleniem"] # 0x2b3d - - "âŹŸ": [t: "strzaƂka w lewo przez X"] # 0x2b3e - - "⏿": [t: "falista strzaƂka skierowana bezpoƛrednio w lewo"] # 0x2b3f - - "⭀": [t: "znak rĂłwnoƛci nad strzaƂką w lewo"] # 0x2b40 - - "⭁": [t: "operator odwrotnej tyldy nad strzaƂką w lewo"] # 0x2b41 - - "⭂": [t: "strzaƂka w lewo nad odwrĂłconym znakiem przybliĆŒonej rĂłwnoƛci"] # 0x2b42 - - "⭃": [t: "strzaƂka w prawo przez znak większe niĆŒ"] # 0x2b43 - - "⭄": [t: "strzaƂka w prawo przez znak nadzbioru"] # 0x2b44 - - "⭅": [t: "lewy poczwĂłrny strzaƂka"] # 0x2b45 - - "⭆": [t: "prawy poczwĂłrny strzaƂka"] # 0x2b46 - - "⭇": [t: "operator odwrotnej tyldy nad strzaƂką w prawo"] # 0x2b47 - - "⭈": [t: "strzaƂka w prawo nad odwrĂłconym znakiem przybliĆŒonej rĂłwnoƛci"] # 0x2b48 - - "⭉": [t: "operator tyldy nad strzaƂką w lewo"] # 0x2b49 - - "⭊": [t: "strzaƂka w lewo nad znakiem przybliĆŒonej rĂłwnoƛci"] # 0x2b4a - - "⭋": [t: "strzaƂka w lewo nad operatorem odwrotnej tyldy"] # 0x2b4b - - "⭌": [t: "strzaƂka w prawo nad operatorem odwrotnej tyldy"] # 0x2b4c - - "⭐": [t: "biaƂy ƛredni gwiazda"] # 0x2b50 - - "⭑": [t: "czarny maƂy gwiazda"] # 0x2b51 - - "⭒": [t: "biaƂy maƂy gwiazda"] # 0x2b52 - - "⭓": [t: "czarny prawy skierowany pięciokąt"] # 0x2b53 - - "⭔": [t: "biaƂy prawy skierowany pięciokąt"] # 0x2b54 - - "⭕": [t: "gruby duĆŒy okrąg"] # 0x2b55 - - "⭖": [t: "gruby owal z owalem wewnątrz"] # 0x2b56 - - "⭗": [t: "gruby okrąg z okręgiem wewnątrz"] # 0x2b57 - - "⭘": [t: "gruby okrąg"] # 0x2b58 - - "⭙": [t: "gruby ukoƛny krzyĆŒ w kóƂku"] # 0x2b59 - - "⾀": [t: "kąt prosty znacznik podstawienia"] # 0x2e00 - - "➁": [t: "kąt prosty kropkowany znacznik podstawienia"] # 0x2e01 - - "⾂": [t: "lewy nawias kwadratowy podstawienia"] # 0x2e02 - - "➃": [t: "prawy nawias kwadratowy podstawienia"] # 0x2e03 - - "⾄": [t: "lewy kropkowany nawias kwadratowy podstawienia"] # 0x2e04 - - "⾅": [t: "prawy kropkowany nawias kwadratowy podstawienia"] # 0x2e05 - - "⾆": [t: "podniesiony znacznik interpolacji"] # 0x2e06 - - "⾇": [t: "podniesiony kropkowany znacznik interpolacji"] # 0x2e07 - - "➈": [t: "kropkowany znacznik transpozycji"] # 0x2e08 - - "⾉": [t: "lewy nawias kwadratowy transpozycji"] # 0x2e09 - - "⾊": [t: "prawy nawias kwadratowy transpozycji"] # 0x2e0a - - "⾋": [t: "podniesiony kwadrat"] # 0x2e0b - - "⾌": [t: "lewy podniesiony pominięcia nawias kwadratowy"] # 0x2e0c - - "➍": [t: "prawy podniesiony pominięcia nawias kwadratowy"] # 0x2e0d - - "⾎": [t: "redakcyjny koronis"] # 0x2e0e + then: [T: "krzyĆŒ"] + else: [T: "krzyĆŒ iloczyn"] + - "âš°": [T: "znak mnoĆŒenia z kropką nad"] # 0x2a30 + - "âš±": [T: "znak mnoĆŒenia z podkreƛleniem"] # 0x2a31 + - "âšČ": [T: "iloczyn póƂprosty domknięty od doƂu"] # 0x2a32 + - "âšł": [T: "iloczyn spƂaszczony"] # 0x2a33 + - "⚎": [T: "znak mnoĆŒenia w lewej poƂówce okręgu"] # 0x2a34 + - "âš”": [T: "znak mnoĆŒenia w prawej poƂówce okręgu"] # 0x2a35 + - "âš¶": [T: "znak mnoĆŒenia w kóƂku z daszkiem"] # 0x2a36 + - "âš·": [T: "znak mnoĆŒenia w podwĂłjnym okręgu"] # 0x2a37 + - "âšž": [T: "znak dzielenia w kóƂku"] # 0x2a38 + - "âšč": [T: "znak plus w trĂłjkącie"] # 0x2a39 + - "âšș": [T: "znak minus w trĂłjkącie"] # 0x2a3a + - "âš»": [T: "znak mnoĆŒenia w trĂłjkącie"] # 0x2a3b + - "⚌": [T: "iloczyn wewnętrzny"] # 0x2a3c + - "âšœ": [T: "prawostronny iloczyn wewnętrzny"] # 0x2a3d + - "⚟": [T: "skƂadanie relacji w notacji Z"] # 0x2a3e + - "âšż": [T: "amalgamacja lub koprodukt"] # 0x2a3f + - "⩀": [T: "częƛć wspĂłlna z kropką"] # 0x2a40 + - "⩁": [T: "suma zbiorĂłw ze znakiem minus"] # 0x2a41 + - "⩂": [T: "suma zbiorĂłw z kreską nad"] # 0x2a42 + - "⩃": [T: "częƛć wspĂłlna z kreską nad"] # 0x2a43 + - "⩄": [T: "częƛć wspĂłlna z koniunkcją logiczną"] # 0x2a44 + - "⩅": [T: "suma zbiorĂłw z alternatywą logiczną"] # 0x2a45 + - "⩆": [T: "suma zbiorĂłw nad częƛć wspĂłlna"] # 0x2a46 + - "⩇": [T: "częƛć wspĂłlna nad suma zbiorĂłw"] # 0x2a47 + - "⩈": [T: "suma zbiorĂłw nad kreska nad częƛć wspĂłlna"] # 0x2a48 + - "⩉": [T: "częƛć wspĂłlna nad kreska nad suma zbiorĂłw"] # 0x2a49 + - "⩊": [T: "suma zbiorĂłw obok sumy zbiorĂłw poƂączona kreską"] # 0x2a4a + - "⩋": [T: "częƛć wspĂłlna obok częƛci wspĂłlnej poƂączona kreską"] # 0x2a4b + - "⩌": [T: "zamknięta suma zbiorĂłw z szeryfami"] # 0x2a4c + - "⩍": [T: "zamknięta częƛć wspĂłlna z szeryfami"] # 0x2a4d + - "⩎": [T: "podwĂłjny kwadrat częƛć wspĂłlna"] # 0x2a4e + - "⩏": [T: "podwĂłjny kwadrat suma zbiorĂłw"] # 0x2a4f + - "⩐": [T: "zamknięta suma zbiorĂłw z szeryfami i iloczynem spƂaszczonym"] # 0x2a50 + - "⩑": [T: "koniunkcja logiczna z kropką nad"] # 0x2a51 + - "⩒": [T: "logiczne lub z kropką nad"] # 0x2a52 + - "⩓": [T: "podwĂłjna koniunkcja logiczna"] # 0x2a53 + - "⩔": [T: "podwĂłjny logiczne lub"] # 0x2a54 + - "⩕": [T: "dwa przecinające się logiczne i"] # 0x2a55 + - "⩖": [T: "dwa przecinające się logiczne lub"] # 0x2a56 + - "⩗": [T: "skoƛne duĆŒe lub"] # 0x2a57 + - "⩘": [T: "skoƛne duĆŒe i"] # 0x2a58 + - "⩙": [T: "logiczne lub nakƂadające się na logiczne i"] # 0x2a59 + - "⩚": [T: "logiczne i ze ƛrodkowym trzonem"] # 0x2a5a + - "⩛": [T: "logiczne lub ze ƛrodkowym trzonem"] # 0x2a5b + - "⩜": [T: "koniunkcja logiczna z poziomą kreską"] # 0x2a5c + - "⩝": [T: "alternatywa logiczna z poziomą kreską"] # 0x2a5d + - "⩞": [T: "logiczne i z podwĂłjną kreską nad"] # 0x2a5e + - "⩟": [T: "koniunkcja logiczna z podkreƛleniem"] # 0x2a5f + - "â© ": [T: "logiczne i z podwĂłjną kreską pod"] # 0x2a60 + - "⩥": [T: "maƂe logiczne lub z podkreƛleniem"] # 0x2a61 + - "⩹": [T: "logiczne lub z podwĂłjną kreską nad"] # 0x2a62 + - "⩣": [T: "logiczne lub z podwĂłjną kreską pod"] # 0x2a63 + - "â©€": [T: "antyograniczenie dziedziny w notacji Z"] # 0x2a64 + - "â©„": [T: "antyograniczenie przeciwdziedziny w notacji Z"] # 0x2a65 + - "⩊": [T: "znak rĂłwnoƛci z kropką pod spodem"] # 0x2a66 + - "â©§": [T: "identyczne z kropką nad"] # 0x2a67 + - "⩚": [T: "potrĂłjna kreska pozioma z podwĂłjną pionową kreską"] # 0x2a68 + - "â©©": [T: "potrĂłjna kreska pozioma z potrĂłjną pionową kreską"] # 0x2a69 + - "â©Ș": [T: "operator tyldy z kropką nad"] # 0x2a6a + - "â©«": [T: "operator tyldy ze wznoszącymi kropkami"] # 0x2a6b + - "⩏": [T: "podobne minus podobne"] # 0x2a6c + - "â©­": [T: "przystające z kropką nad"] # 0x2a6d + - "⩟": [T: "rĂłwna się z gwiazdką"] # 0x2a6e + - "⩯": [T: "w przybliĆŒeniu rĂłwne z daszkiem"] # 0x2a6f + - "â©°": [T: "w przybliĆŒeniu rĂłwne lub rĂłwne"] # 0x2a70 + - "⩱": [T: "znak rĂłwnoƛci nad znakiem plus"] # 0x2a71 + - "â©Č": [T: "znak plus nad znakiem rĂłwnoƛci"] # 0x2a72 + - "⩳": [T: "znak rĂłwnoƛci nad operatorem tyldy"] # 0x2a73 + - "⩎": [T: "podwĂłjny dwukropek rĂłwne"] # 0x2a74 + - "â©”": [T: "dwa kolejne znaki rĂłwnoƛci"] # 0x2a75 + - "â©¶": [T: "trzy kolejne znaki rĂłwnoƛci"] # 0x2a76 + - "â©·": [T: "znak rĂłwnoƛci z dwiema kropkami nad i dwiema kropkami pod"] # 0x2a77 + - "⩞": [T: "rĂłwnowaĆŒne z czterema kropkami nad"] # 0x2a78 + - "â©č": [T: "mniejsze niĆŒ z okrąg wewnątrz"] # 0x2a79 + - "â©ș": [T: "większe niĆŒ z okrąg wewnątrz"] # 0x2a7a + - "â©»": [T: "mniejsze niĆŒ ze znakiem zapytania nad"] # 0x2a7b + - "⩌": [T: "większe niĆŒ ze znakiem zapytania nad"] # 0x2a7c + - "⩜": [T: "mniejsze niĆŒ lub ukoƛnie rĂłwne"] # 0x2a7d + - "⩟": [T: "większe niĆŒ lub ukoƛnie rĂłwne"] # 0x2a7e + - "⩿": [T: "mniejsze niĆŒ lub ukoƛnie rĂłwne z kropką wewnątrz"] # 0x2a7f + - "âȘ€": [T: "większe niĆŒ lub ukoƛnie rĂłwne z kropką wewnątrz"] # 0x2a80 + - "âȘ": [T: "mniejsze niĆŒ lub ukoƛnie rĂłwne z kropką nad"] # 0x2a81 + - "âȘ‚": [T: "większe niĆŒ lub ukoƛnie rĂłwne z kropką nad"] # 0x2a82 + - "âȘƒ": [T: "mniejsze niĆŒ lub ukoƛnie rĂłwne z kropką nad prawą stroną"] # 0x2a83 + - "âȘ„": [T: "większe niĆŒ lub ukoƛnie rĂłwne z kropką nad lewą stroną"] # 0x2a84 + - "âȘ…": [T: "mniejsze niĆŒ lub przybliĆŒone"] # 0x2a85 + - "âȘ†": [T: "większe niĆŒ lub przybliĆŒone"] # 0x2a86 + - "âȘ‡": [T: "mniejsze niĆŒ z pojedynczą linią nierĂłwnoƛci"] # 0x2a87 + - "âȘˆ": [T: "większe niĆŒ z pojedynczą linią nierĂłwnoƛci"] # 0x2a88 + - "âȘ‰": [T: "mniejsze niĆŒ i nie przybliĆŒone"] # 0x2a89 + - "âȘŠ": [T: "większe niĆŒ i nie przybliĆŒone"] # 0x2a8a + - "âȘ‹": [T: "mniejsze niĆŒ nad podwĂłjną linią rĂłwnoƛci nad większe niĆŒ"] # 0x2a8b + - "âȘŒ": [T: "większe niĆŒ nad podwĂłjną linią rĂłwnoƛci nad mniejsze niĆŒ"] # 0x2a8c + - "âȘ": [T: "mniejsze niĆŒ nad podobne lub rĂłwne"] # 0x2a8d + - "âȘŽ": [T: "większe niĆŒ nad podobne lub rĂłwne"] # 0x2a8e + - "âȘ": [T: "mniejsze niĆŒ nad podobne nad większe niĆŒ"] # 0x2a8f + - "âȘ": [T: "większe niĆŒ nad podobne nad mniejsze niĆŒ"] # 0x2a90 + - "âȘ‘": [T: "mniejsze niĆŒ nad większe niĆŒ nad podwĂłjną linią rĂłwnoƛci"] # 0x2a91 + - "âȘ’": [T: "większe niĆŒ nad mniejsze niĆŒ nad podwĂłjną linią rĂłwnoƛci"] # 0x2a92 + - "âȘ“": [T: "mniejsze niĆŒ nad ukoƛnie rĂłwne nad większe niĆŒ nad ukoƛnie rĂłwne"] # 0x2a93 + - "âȘ”": [T: "większe niĆŒ nad ukoƛnie rĂłwne nad mniejsze niĆŒ nad ukoƛnie rĂłwne"] # 0x2a94 + - "âȘ•": [T: "ukoƛnie rĂłwne lub mniejsze niĆŒ"] # 0x2a95 + - "âȘ–": [T: "ukoƛnie rĂłwne lub większe niĆŒ"] # 0x2a96 + - "âȘ—": [T: "ukoƛnie rĂłwne lub mniejsze niĆŒ z kropką wewnątrz"] # 0x2a97 + - "âȘ˜": [T: "ukoƛnie rĂłwne lub większe niĆŒ z kropką wewnątrz"] # 0x2a98 + - "âȘ™": [T: "podwĂłjna linia rĂłwna lub mniejsze niĆŒ"] # 0x2a99 + - "âȘš": [T: "podwĂłjna linia rĂłwna lub większe niĆŒ"] # 0x2a9a + - "âȘ›": [T: "podwĂłjna linia ukoƛnie rĂłwna lub mniejsze niĆŒ"] # 0x2a9b + - "âȘœ": [T: "podwĂłjna linia ukoƛnie rĂłwna lub większe niĆŒ"] # 0x2a9c + - "âȘ": [T: "podobne lub mniejsze niĆŒ"] # 0x2a9d + - "âȘž": [T: "podobne lub większe niĆŒ"] # 0x2a9e + - "âȘŸ": [T: "podobne nad mniejsze niĆŒ nad znakiem rĂłwnoƛci"] # 0x2a9f + - "âȘ ": [T: "podobne nad większe niĆŒ nad znakiem rĂłwnoƛci"] # 0x2aa0 + - "âȘĄ": [T: "podwĂłjnie zagnieĆŒdĆŒone mniejsze niĆŒ"] # 0x2aa1 + - "âȘą": [T: "podwĂłjnie zagnieĆŒdĆŒone większe niĆŒ"] # 0x2aa2 + - "âȘŁ": [T: "podwĂłjnie zagnieĆŒdĆŒone mniejsze niĆŒ z podkreƛleniem"] # 0x2aa3 + - "âȘ€": [T: "większe niĆŒ nakƂadające się na mniejsze niĆŒ"] # 0x2aa4 + - "âȘ„": [T: "większe niĆŒ obok mniejsze niĆŒ"] # 0x2aa5 + - "âȘŠ": [T: "mniejsze niĆŒ zamknięte krzywą"] # 0x2aa6 + - "âȘ§": [T: "większe niĆŒ zamknięte krzywą"] # 0x2aa7 + - "âȘš": [T: "mniejsze niĆŒ zamknięte krzywą nad ukoƛnie rĂłwne"] # 0x2aa8 + - "âȘ©": [T: "większe niĆŒ zamknięte krzywą nad ukoƛnie rĂłwne"] # 0x2aa9 + - "âȘȘ": [T: "mniejsze niĆŒ"] # 0x2aaa + - "âȘ«": [T: "większe niĆŒ"] # 0x2aab + - "âȘŹ": [T: "mniejsze niĆŒ lub rĂłwne"] # 0x2aac + - "âȘ­": [T: "większe niĆŒ lub rĂłwne"] # 0x2aad + - "âȘź": [T: "znak rĂłwnoƛci z garbem nad"] # 0x2aae + - "âȘŻ": [T: "poprzedza nad pojedynczą linią rĂłwnoƛci"] # 0x2aaf + - "âȘ°": [T: "następuje po nad pojedynczą linią rĂłwnoƛci"] # 0x2ab0 + - "âȘ±": [T: "poprzedza nad pojedynczą linią nierĂłwnoƛci"] # 0x2ab1 + - "âȘČ": [T: "następuje po nad pojedynczy linia nie rĂłwna się"] # 0x2ab2 + - "âȘł": [T: "poprzedza nad znakiem rĂłwnoƛci"] # 0x2ab3 + - "âȘŽ": [T: "następuje po nad znakiem rĂłwnoƛci"] # 0x2ab4 + - "âȘ”": [T: "poprzedza nad nie rĂłwna się"] # 0x2ab5 + - "âȘ¶": [T: "następuje po nad nie rĂłwna się"] # 0x2ab6 + - "âȘ·": [T: "poprzedza nad znakiem przybliĆŒonej rĂłwnoƛci"] # 0x2ab7 + - "âȘž": [T: "następuje po nad znakiem przybliĆŒonej rĂłwnoƛci"] # 0x2ab8 + - "âȘč": [T: "poprzedza nad znakiem nie w przybliĆŒeniu rĂłwne"] # 0x2ab9 + - "âȘș": [T: "następuje po nad znakiem nie w przybliĆŒeniu rĂłwne"] # 0x2aba + - "âȘ»": [T: "podwĂłjny poprzedza"] # 0x2abb + - "âȘŒ": [T: "podwĂłjny następuje po"] # 0x2abc + - "âȘœ": [T: "podzbiĂłr z kropką"] # 0x2abd + - "âȘŸ": [T: "nadzbiĂłr z kropką"] # 0x2abe + - "âȘż": [T: "podzbiĂłr ze znakiem plus pod spodem"] # 0x2abf + - "⫀": [T: "nadzbiĂłr ze znakiem plus pod spodem"] # 0x2ac0 + - "⫁": [T: "podzbiĂłr ze znakiem mnoĆŒenia pod"] # 0x2ac1 + - "⫂": [T: "nadzbiĂłr ze znakiem mnoĆŒenia pod"] # 0x2ac2 + - "⫃": [T: "podzbiĂłr lub rĂłwny z kropką nad"] # 0x2ac3 + - "⫄": [T: "nadzbiĂłr lub rĂłwny z kropką nad"] # 0x2ac4 + - "⫅": [T: "podzbiĂłr nad znakiem rĂłwnoƛci"] # 0x2ac5 + - "⫆": [T: "nadzbiĂłr nad znakiem rĂłwnoƛci"] # 0x2ac6 + - "⫇": [T: "podzbiĂłr nad operatorem tyldy"] # 0x2ac7 + - "⫈": [T: "nadzbiĂłr nad operatorem tyldy"] # 0x2ac8 + - "⫉": [T: "podzbiĂłr nad znakiem przybliĆŒonej rĂłwnoƛci"] # 0x2ac9 + - "⫊": [T: "nadzbiĂłr nad znakiem przybliĆŒonej rĂłwnoƛci"] # 0x2aca + - "⫋": [T: "podzbiĂłr nad nie rĂłwna się"] # 0x2acb + - "⫌": [T: "nadzbiĂłr nad nie rĂłwna się"] # 0x2acc + - "⫍": [T: "kwadrat lewy otwĂłrz ramka operator"] # 0x2acd + - "⫎": [T: "kwadrat prawy otwĂłrz ramka operator"] # 0x2ace + - "⫏": [T: "zamknięty podzbiĂłr"] # 0x2acf + - "⫐": [T: "zamknięty nadzbiĂłr"] # 0x2ad0 + - "⫑": [T: "zamknięty podzbiĂłr lub rĂłwne"] # 0x2ad1 + - "⫒": [T: "zamknięty nadzbiĂłr lub rĂłwne"] # 0x2ad2 + - "⫓": [T: "podzbiĂłr nad nadzbiĂłr"] # 0x2ad3 + - "⫔": [T: "nadzbiĂłr nad podzbiĂłr"] # 0x2ad4 + - "⫕": [T: "podzbiĂłr nad podzbiĂłr"] # 0x2ad5 + - "⫖": [T: "nadzbiĂłr nad nadzbiĂłr"] # 0x2ad6 + - "⫗": [T: "nadzbiĂłr obok podzbioru"] # 0x2ad7 + - "⫘": [T: "nadzbiĂłr obok podzbioru poƂączony kreską"] # 0x2ad8 + - "⫙": [T: "naleĆŒy do otwarte od doƂu"] # 0x2ad9 + - "⫚": [T: "widƂy z gĂłrną poprzeczką"] # 0x2ada + - "⫛": [T: "poprzeczna częƛć wspĂłlna"] # 0x2adb + - "⫝̸": [T: "rozwidlanie"] # 0x2adc + - "⫝": [T: "nierozwidlanie"] # 0x2add + - "⫞": [T: "krĂłtki lewy znacznik"] # 0x2ade + - "⫟": [T: "krĂłtki dolny znacznik"] # 0x2adf + - "â« ": [T: "krĂłtki gĂłrny znacznik"] # 0x2ae0 + - "⫥": [T: "prostopadƂe z literą s"] # 0x2ae1 + - "⫹": [T: "pionowa kreska z potrĂłjnym prawym znacznikiem dedukcji"] # 0x2ae2 + - "⫣": [T: "podwĂłjna pionowa kreska z lewym znacznikiem dedukcji"] # 0x2ae3 + - "â«€": [T: "pionowa kreska z podwĂłjnym lewym znacznikiem dedukcji"] # 0x2ae4 + - "â«„": [T: "podwĂłjna pionowa kreska z podwĂłjnym lewym znacznikiem dedukcji"] # 0x2ae5 + - "⫊": [T: "dƂuga kreska od lewego elementu z podwĂłjną pionową kreską"] # 0x2ae6 + - "â«§": [T: "krĂłtki dolny znacznik z kreską nad"] # 0x2ae7 + - "⫚": [T: "krĂłtki gĂłrny znacznik z podkreƛleniem"] # 0x2ae8 + - "â«©": [T: "krĂłtki gĂłrny znacznik nad krĂłtkim dolnym znacznikiem"] # 0x2ae9 + - "â«Ș": [T: "podwĂłjny dolny znacznik"] # 0x2aea + - "â««": [T: "podwĂłjny gĂłrny znacznik"] # 0x2aeb + - "⫏": [T: "znak negacji z podwĂłjnym przekreƛleniem"] # 0x2aec + - "â«­": [T: "odwrĂłcony znak negacji z podwĂłjnym przekreƛleniem"] # 0x2aed + - "⫟": [T: "nie dzieli z odwrĂłconym ukoƛnikiem negacji"] # 0x2aee + - "⫯": [T: "pionowa linia z okręgiem nad"] # 0x2aef + - "â«°": [T: "pionowa linia z okręgiem pod"] # 0x2af0 + - "⫱": [T: "dolny znacznik z okręgiem pod"] # 0x2af1 + - "â«Č": [T: "rĂłwnolegƂe z poziomą kreską"] # 0x2af2 + - "⫳": [T: "rĂłwnolegƂe z operatorem tyldy"] # 0x2af3 + - "⫎": [T: "potrĂłjna pionowa kreska jako relacja binarna"] # 0x2af4 + - "â«”": [T: "potrĂłjna pionowa kreska z poziomą kreską"] # 0x2af5 + - "â«¶": [T: "potrĂłjny dwukropek operator"] # 0x2af6 + - "â«·": [T: "potrĂłjnie zagnieĆŒdĆŒone mniejsze niĆŒ"] # 0x2af7 + - "⫞": [T: "potrĂłjnie zagnieĆŒdĆŒone większe niĆŒ"] # 0x2af8 + - "â«č": [T: "podwĂłjna linia ukoƛnie mniejsze lub rĂłwne"] # 0x2af9 + - "â«ș": [T: "podwĂłjna linia ukoƛnie większe lub rĂłwne"] # 0x2afa + - "â«»": [T: "potrĂłjny ukoƛnik jako relacja binarna"] # 0x2afb + - "⫌": [T: "operator duĆŒej potrĂłjnej pionowej kreski"] # 0x2afc + - "⫝̸": [T: "podwĂłjny ukoƛnik operator"] # 0x2afd + - "⫟": [T: "biaƂa pionowa kreska"] # 0x2afe + - "⫿": [T: "biaƂa pionowa kreska"] # 0x2aff + - "⬀": [T: "biaƂa strzaƂka na póƂnocny wschĂłd"] # 0x2b00 + - "⏁": [T: "biaƂa strzaƂka na póƂnocny zachĂłd"] # 0x2b01 + - "⬂": [T: "biaƂa strzaƂka na poƂudniowy wschĂłd"] # 0x2b02 + - "⏃": [T: "biaƂa strzaƂka na poƂudniowy zachĂłd"] # 0x2b03 + - "⬄": [T: "biaƂa strzaƂka w lewo i w prawo"] # 0x2b04 + - "⬅": [T: "lewy czarny strzaƂka"] # 0x2b05 + - "⬆": [T: "gĂłrny czarny strzaƂka"] # 0x2b06 + - "⬇": [T: "dolny czarny strzaƂka"] # 0x2b07 + - "⏈": [T: "póƂnoc wschĂłd czarny strzaƂka"] # 0x2b08 + - "⬉": [T: "póƂnoc zachĂłd czarny strzaƂka"] # 0x2b09 + - "⬊": [T: "poƂudnie wschĂłd czarny strzaƂka"] # 0x2b0a + - "⬋": [T: "poƂudnie zachĂłd czarny strzaƂka"] # 0x2b0b + - "⬌": [T: "lewy prawy czarny strzaƂka"] # 0x2b0c + - "⬍": [T: "gĂłrny dolny czarny strzaƂka"] # 0x2b0d + - "⬎": [T: "strzaƂka w prawo z dolnym czubkiem"] # 0x2b0e + - "⬏": [T: "strzaƂka w prawo z gĂłrnym czubkiem"] # 0x2b0f + - "⏐": [T: "strzaƂka w lewo z dolnym czubkiem"] # 0x2b10 + - "⬑": [T: "strzaƂka w lewo z gĂłrnym czubkiem"] # 0x2b11 + - "⬒": [T: "kwadrat z gĂłrną poƂową czarną"] # 0x2b12 + - "⬓": [T: "kwadrat z dolną poƂową czarną"] # 0x2b13 + - "⬔": [T: "kwadrat z gĂłrną prawą ukoƛną poƂową czarną"] # 0x2b14 + - "⬕": [T: "kwadrat z dolną lewą ukoƛną poƂową czarną"] # 0x2b15 + - "⬖": [T: "romb z lewą poƂową czarną"] # 0x2b16 + - "⬗": [T: "romb z prawą poƂową czarną"] # 0x2b17 + - "⏘": [T: "romb z gĂłrną poƂową czarną"] # 0x2b18 + - "⬙": [T: "romb z dolną poƂową czarną"] # 0x2b19 + - "⬚": [T: "ramka"] # 0x2b1a + - "⬛": [T: "czarny duĆŒy kwadrat"] # 0x2b1b + - "⬜": [T: "biaƂy duĆŒy kwadrat"] # 0x2b1c + - "⬝": [T: "czarny bardzo maƂy kwadrat"] # 0x2b1d + - "⬞": [T: "biaƂy bardzo maƂy kwadrat"] # 0x2b1e + - "⬟": [T: "czarny pięciokąt"] # 0x2b1f + - "⏠": [T: "biaƂy pięciokąt"] # 0x2b20 + - "⏥": [T: "biaƂy szeƛciokąt"] # 0x2b21 + - "⏹": [T: "czarny szeƛciokąt"] # 0x2b22 + - "⏣": [T: "poziomy czarny szeƛciokąt"] # 0x2b23 + - "⏀": [T: "czarny duĆŒy okrąg"] # 0x2b24 + - "⏄": [T: "czarny ƛredni romb"] # 0x2b25 + - "⏊": [T: "biaƂy ƛredni romb"] # 0x2b26 + - "⏧": [T: "czarny ƛredni romb"] # 0x2b27 + - "⏚": [T: "biaƂy ƛredni romb"] # 0x2b28 + - "⏩": [T: "czarny maƂy romb"] # 0x2b29 + - "âŹȘ": [T: "czarny maƂy romb"] # 0x2b2a + - "⏫": [T: "biaƂy maƂy romb"] # 0x2b2b + - "⏏": [T: "czarna pozioma elipsa"] # 0x2b2c + - "⏭": [T: "biaƂa pozioma elipsa"] # 0x2b2d + - "⏟": [T: "czarna pionowa elipsa"] # 0x2b2e + - "⏯": [T: "biaƂa pionowa elipsa"] # 0x2b2f + - "⏰": [T: "strzaƂka w lewo z maƂym okręgiem"] # 0x2b30 + - "⏱": [T: "trzy strzaƂki w lewo"] # 0x2b31 + - "âŹČ": [T: "strzaƂka w lewo z plusem w kóƂku"] # 0x2b32 + - "⏳": [T: "dƂuga falista strzaƂka w lewo"] # 0x2b33 + - "⏎": [T: "strzaƂka w lewo z dwoma grotami i pionowym przekreƛleniem"] # 0x2b34 + - "⏔": [T: "strzaƂka w lewo z dwoma grotami i podwĂłjnym pionowym przekreƛleniem"] # 0x2b35 + - "⏶": [T: "strzaƂka w lewo z dwoma grotami od kreski"] # 0x2b36 + - "⏷": [T: "strzaƂka w lewo z dwoma grotami i potrĂłjną kreską"] # 0x2b37 + - "⏞": [T: "strzaƂka w lewo z kropkowanym trzonem"] # 0x2b38 + - "âŹč": [T: "strzaƂka w lewo z ogonem i pionową kreską"] # 0x2b39 + - "âŹș": [T: "strzaƂka w lewo z ogonem i podwĂłjną pionową kreską"] # 0x2b3a + - "⏻": [T: "strzaƂka w lewo z dwoma grotami i ogonem"] # 0x2b3b + - "âŹŒ": [T: "strzaƂka w lewo z dwoma grotami, ogonem i pionowym przekreƛleniem"] # 0x2b3c + - "âŹœ": [T: "strzaƂka w lewo z dwoma grotami, ogonem i podwĂłjnym pionowym przekreƛleniem"] # 0x2b3d + - "âŹŸ": [T: "strzaƂka w lewo przez X"] # 0x2b3e + - "⏿": [T: "falista strzaƂka skierowana bezpoƛrednio w lewo"] # 0x2b3f + - "⭀": [T: "znak rĂłwnoƛci nad strzaƂką w lewo"] # 0x2b40 + - "⭁": [T: "operator odwrotnej tyldy nad strzaƂką w lewo"] # 0x2b41 + - "⭂": [T: "strzaƂka w lewo nad odwrĂłconym znakiem przybliĆŒonej rĂłwnoƛci"] # 0x2b42 + - "⭃": [T: "strzaƂka w prawo przez znak większe niĆŒ"] # 0x2b43 + - "⭄": [T: "strzaƂka w prawo przez znak nadzbioru"] # 0x2b44 + - "⭅": [T: "lewy poczwĂłrny strzaƂka"] # 0x2b45 + - "⭆": [T: "prawy poczwĂłrny strzaƂka"] # 0x2b46 + - "⭇": [T: "operator odwrotnej tyldy nad strzaƂką w prawo"] # 0x2b47 + - "⭈": [T: "strzaƂka w prawo nad odwrĂłconym znakiem przybliĆŒonej rĂłwnoƛci"] # 0x2b48 + - "⭉": [T: "operator tyldy nad strzaƂką w lewo"] # 0x2b49 + - "⭊": [T: "strzaƂka w lewo nad znakiem przybliĆŒonej rĂłwnoƛci"] # 0x2b4a + - "⭋": [T: "strzaƂka w lewo nad operatorem odwrotnej tyldy"] # 0x2b4b + - "⭌": [T: "strzaƂka w prawo nad operatorem odwrotnej tyldy"] # 0x2b4c + - "⭐": [T: "biaƂy ƛredni gwiazda"] # 0x2b50 + - "⭑": [T: "czarny maƂy gwiazda"] # 0x2b51 + - "⭒": [T: "biaƂy maƂy gwiazda"] # 0x2b52 + - "⭓": [T: "czarny prawy skierowany pięciokąt"] # 0x2b53 + - "⭔": [T: "biaƂy prawy skierowany pięciokąt"] # 0x2b54 + - "⭕": [T: "gruby duĆŒy okrąg"] # 0x2b55 + - "⭖": [T: "gruby owal z owalem wewnątrz"] # 0x2b56 + - "⭗": [T: "gruby okrąg z okręgiem wewnątrz"] # 0x2b57 + - "⭘": [T: "gruby okrąg"] # 0x2b58 + - "⭙": [T: "gruby ukoƛny krzyĆŒ w kóƂku"] # 0x2b59 + - "⾀": [T: "kąt prosty znacznik podstawienia"] # 0x2e00 + - "➁": [T: "kąt prosty kropkowany znacznik podstawienia"] # 0x2e01 + - "⾂": [T: "lewy nawias kwadratowy podstawienia"] # 0x2e02 + - "➃": [T: "prawy nawias kwadratowy podstawienia"] # 0x2e03 + - "⾄": [T: "lewy kropkowany nawias kwadratowy podstawienia"] # 0x2e04 + - "⾅": [T: "prawy kropkowany nawias kwadratowy podstawienia"] # 0x2e05 + - "⾆": [T: "podniesiony znacznik interpolacji"] # 0x2e06 + - "⾇": [T: "podniesiony kropkowany znacznik interpolacji"] # 0x2e07 + - "➈": [T: "kropkowany znacznik transpozycji"] # 0x2e08 + - "⾉": [T: "lewy nawias kwadratowy transpozycji"] # 0x2e09 + - "⾊": [T: "prawy nawias kwadratowy transpozycji"] # 0x2e0a + - "⾋": [T: "podniesiony kwadrat"] # 0x2e0b + - "⾌": [T: "lewy podniesiony pominięcia nawias kwadratowy"] # 0x2e0c + - "➍": [T: "prawy podniesiony pominięcia nawias kwadratowy"] # 0x2e0d + - "⾎": [T: "redakcyjny koronis"] # 0x2e0e - "➏": [T: "paragraphos"] # 0x2e0f - - "➐": [t: "rozwidlony paragrafos"] # 0x2e10 - - "⾑": [t: "odwrĂłcony rozwidlony paragrafos"] # 0x2e11 + - "➐": [T: "rozwidlony paragrafos"] # 0x2e10 + - "⾑": [T: "odwrĂłcony rozwidlony paragrafos"] # 0x2e11 - "⾒": [T: "hypodiastole"] # 0x2e12 - - "⾓": [t: "kropkowany obelos"] # 0x2e13 - - "⾔": [t: "dolny ancora"] # 0x2e14 - - "⾕": [t: "gĂłrny ancora"] # 0x2e15 - - "⾖": [t: "kropkowany kąt skierowany w prawo"] # 0x2e16 - - "⾗": [t: "podwĂłjny ukoƛny Ƃącznik"] # 0x2e17 - - "➘": [t: "odwrĂłcony interrobang"] # 0x2e18 - - "⾙": [t: "gaƂązka palmowa"] # 0x2e19 - - "⾚": [t: "Ƃącznik z dierezą"] # 0x2e1a - - "⾛": [t: "tylda z pierƛcieniem nad"] # 0x2e1b - - "⾜": [t: "lewy dolny nawias kwadratowy parafrazy"] # 0x2e1c - - "➝": [t: "prawy dolny nawias kwadratowy parafrazy"] # 0x2e1d - - "⾞": [t: "tylda z kropką nad"] # 0x2e1e - - "⾟": [t: "tylda z kropką pod"] # 0x2e1f - - "âž ": [t: "lewa pionowa kreska z piĂłrem"] # 0x2e20 - - "➥": [t: "prawa pionowa kreska z piĂłrem"] # 0x2e21 - - "âžą": [t: "gĂłrny lewa poƂowa nawias kwadratowy"] # 0x2e22 - - "➣": [t: "gĂłrny prawa poƂowa nawias kwadratowy"] # 0x2e23 - - "➀": [t: "dolny lewa poƂowa nawias kwadratowy"] # 0x2e24 - - "âž„": [t: "dolny prawa poƂowa nawias kwadratowy"] # 0x2e25 - - "➊": [t: "lewy obrĂłcony nawias kwadratowy u"] # 0x2e26 - - "âž§": [t: "prawy obrĂłcony nawias kwadratowy u"] # 0x2e27 - - "âžš": [t: "lewy podwĂłjny nawias okrągƂy"] # 0x2e28 - - "âž©": [t: "prawy podwĂłjny nawias okrągƂy"] # 0x2e29 - - "âžȘ": [t: "dwie kropki nad jedną kropką interpunkcyjną"] # 0x2e2a - - "âž«": [t: "jedna kropka nad dwiema kropkami interpunkcyjnymi"] # 0x2e2b - - "➏": [t: "do kwadratu cztery kropka interpunkcyjny"] # 0x2e2c - - "âž­": [t: "pięć kropka znak"] # 0x2e2d - - "âžź": [t: "odwrĂłcony zapytania znak"] # 0x2e2e - - "➯": [t: "pionowy tylda"] # 0x2e2f - - "âž°": [t: "pierƛcieƄ punkt"] # 0x2e30 - - "âž±": [t: "separator wyrazĂłw ƛrodkowa kropka"] # 0x2e31 - - "âžČ": [t: "odwrĂłcony przecinek"] # 0x2e32 - - "âžł": [t: "podniesiony kropka"] # 0x2e33 - - "➎": [t: "podniesiony przecinek"] # 0x2e34 - - "âž”": [t: "odwrĂłcony ƛrednik"] # 0x2e35 - - "âž¶": [t: "obelisk z lewą osƂoną"] # 0x2e36 - - "âž·": [t: "obelisk z prawą osƂoną"] # 0x2e37 - - "âžž": [t: "odwrĂłcony obelisk"] # 0x2e38 - - "âžč": [t: "gĂłrna poƂowa paragraf znak"] # 0x2e39 - - "âžș": [t: "dwa pauza"] # 0x2e3a - - "âž»": [t: "trzy pauza"] # 0x2e3b - - "〃": [t: "znak powtĂłrzenia"] # 0x3003 - - "〈": [t: "lewy nawias kątowy"] # 0x3008 - - "〉": [t: "prawy nawias kątowy"] # 0x3009 - - "《": [t: "lewy podwĂłjny nawias kątowy"] # 0x300a - - "》": [t: "prawy podwĂłjny nawias kątowy"] # 0x300b - - "「": [t: "lewy nawias naroĆŒny"] # 0x300c - - "」": [t: "prawy nawias naroĆŒny"] # 0x300d - - "『": [t: "lewy biaƂy nawias naroĆŒny"] # 0x300e - - "』": [t: "prawy biaƂy nawias naroĆŒny"] # 0x300f - - "【": [t: "lewy czarny nawias soczewkowy"] # 0x3010 - - "】": [t: "prawy czarny nawias soczewkowy"] # 0x3011 - - "〔": [t: "lewy nawias skorupowy"] # 0x3014 - - "〕": [t: "prawy nawias skorupowy"] # 0x3015 - - "〖": [t: "lewy biaƂy nawias soczewkowy"] # 0x3016 - - "〗": [t: "prawy biaƂy nawias soczewkowy"] # 0x3017 - - "〘": [t: "lewy biaƂy nawias skorupowy"] # 0x3018 - - "〙": [t: "prawy biaƂy nawias skorupowy"] # 0x3019 - - "〚": [t: "lewy biaƂy nawias kwadratowy"] # 0x301a - - "〛": [t: "prawy biaƂy nawias kwadratowy"] # 0x301b - - "〜": [t: "falista kreska"] # 0x301c - - "〰": [t: "falista kreska"] # 0x3030 - - "㉈": [t: "liczba dziesięć w kóƂku na czarnym kwadracie"] # 0x3248 - - "㉉": [t: "liczba dwadzieƛcia w kóƂku na czarnym kwadracie"] # 0x3249 - - "㉊": [t: "liczba trzydzieƛci w kóƂku na czarnym kwadracie"] # 0x324a - - "㉋": [t: "liczba czterdzieƛci w kóƂku na czarnym kwadracie"] # 0x324b - - "㉌": [t: "liczba pięćdziesiąt w kóƂku na czarnym kwadracie"] # 0x324c - - "㉍": [t: "liczba szeƛćdziesiąt w kóƂku na czarnym kwadracie"] # 0x324d - - "㉎": [t: "liczba siedemdziesiąt w kóƂku na czarnym kwadracie"] # 0x324e - - "㉏": [t: "liczba osiemdziesiąt w kóƂku na czarnym kwadracie"] # 0x324f - - "㉑": [t: "w kóƂku numer dwadzieƛcia jeden"] # 0x3251 - - "㉒": [t: "w kóƂku numer dwadzieƛcia dwa"] # 0x3252 - - "㉓": [t: "w kóƂku numer dwadzieƛcia trzy"] # 0x3253 - - "㉔": [t: "w kóƂku numer dwadzieƛcia cztery"] # 0x3254 - - "㉕": [t: "w kóƂku numer dwadzieƛcia pięć"] # 0x3255 - - "㉖": [t: "w kóƂku numer dwadzieƛcia szeƛć"] # 0x3256 - - "㉗": [t: "w kóƂku numer dwadzieƛcia siedem"] # 0x3257 - - "㉘": [t: "w kóƂku numer dwadzieƛcia osiem"] # 0x3258 - - "㉙": [t: "w kóƂku numer dwadzieƛcia dziewięć"] # 0x3259 - - "㉚": [t: "w kóƂku numer trzydzieƛci"] # 0x325a - - "㉛": [t: "w kóƂku numer trzydzieƛci jeden"] # 0x325b - - "㉜": [t: "w kóƂku numer trzydzieƛci dwa"] # 0x325c - - "㉝": [t: "w kóƂku numer trzydzieƛci trzy"] # 0x325d - - "㉞": [t: "w kóƂku numer trzydzieƛci cztery"] # 0x325e - - "㉟": [t: "w kóƂku numer trzydzieƛci pięć"] # 0x325f - - "㊱": [t: "w kóƂku numer trzydzieƛci szeƛć"] # 0x32b1 - - "ăŠČ": [t: "w kóƂku numer trzydzieƛci siedem"] # 0x32b2 (GPT-5.4 translation) - - "㊳": [t: "w kóƂku numer trzydzieƛci osiem"] # 0x32b3 (GPT-5.4 translation) - - "㊮": [t: "w kóƂku numer trzydzieƛci dziewięć"] # 0x32b4 (GPT-5.4 translation) - - "㊔": [t: "w kóƂku numer czterdzieƛci"] # 0x32b5 (GPT-5.4 translation) - - "㊶": [t: "w kóƂku numer czterdzieƛci jeden"] # 0x32b6 (GPT-5.4 translation) - - "㊷": [t: "w kóƂku numer czterdzieƛci dwa"] # 0x32b7 (GPT-5.4 translation) - - "㊾": [t: "w kóƂku numer czterdzieƛci trzy"] # 0x32b8 (GPT-5.4 translation) - - "ăŠč": [t: "w kóƂku numer czterdzieƛci cztery"] # 0x32b9 (GPT-5.4 translation) - - "ăŠș": [t: "w kóƂku numer czterdzieƛci pięć"] # 0x32ba (GPT-5.4 translation) - - "㊻": [t: "w kóƂku numer czterdzieƛci szeƛć"] # 0x32bb (GPT-5.4 translation) - - "ăŠŒ": [t: "w kóƂku numer czterdzieƛci siedem"] # 0x32bc (GPT-5.4 translation) - - "ăŠœ": [t: "w kóƂku numer czterdzieƛci osiem"] # 0x32bd (GPT-5.4 translation) - - "ăŠŸ": [t: "w kóƂku numer czterdzieƛci dziewięć"] # 0x32be (GPT-5.4 translation) - - "㊿": [t: "w kóƂku numer pięćdziesiąt"] # 0x32bf (GPT-5.4 translation) - - "㋌": [t: "Merkury"] # 0x32cc - - "㋍": [t: "ergi"] # 0x32cd - - "㋎": [t: "elektron wolty"] # 0x32ce - - "㋏": [t: "znak ograniczonej odpowiedzialnoƛci"] # 0x32cf - - "ă±": [t: "hektopaskale"] # 0x3371 - - "ăČ": [t: "daltony"] # 0x3372 - - "㍳": [t: "jednostki astronomiczne"] # 0x3373 - - "㍮": [t: "bary"] # 0x3374 + - "⾓": [T: "kropkowany obelos"] # 0x2e13 + - "⾔": [T: "dolny ancora"] # 0x2e14 + - "⾕": [T: "gĂłrny ancora"] # 0x2e15 + - "⾖": [T: "kropkowany kąt skierowany w prawo"] # 0x2e16 + - "⾗": [T: "podwĂłjny ukoƛny Ƃącznik"] # 0x2e17 + - "➘": [T: "odwrĂłcony interrobang"] # 0x2e18 + - "⾙": [T: "gaƂązka palmowa"] # 0x2e19 + - "⾚": [T: "Ƃącznik z dierezą"] # 0x2e1a + - "⾛": [T: "tylda z pierƛcieniem nad"] # 0x2e1b + - "⾜": [T: "lewy dolny nawias kwadratowy parafrazy"] # 0x2e1c + - "➝": [T: "prawy dolny nawias kwadratowy parafrazy"] # 0x2e1d + - "⾞": [T: "tylda z kropką nad"] # 0x2e1e + - "⾟": [T: "tylda z kropką pod"] # 0x2e1f + - "âž ": [T: "lewa pionowa kreska z piĂłrem"] # 0x2e20 + - "➥": [T: "prawa pionowa kreska z piĂłrem"] # 0x2e21 + - "âžą": [T: "gĂłrny lewa poƂowa nawias kwadratowy"] # 0x2e22 + - "➣": [T: "gĂłrny prawa poƂowa nawias kwadratowy"] # 0x2e23 + - "➀": [T: "dolny lewa poƂowa nawias kwadratowy"] # 0x2e24 + - "âž„": [T: "dolny prawa poƂowa nawias kwadratowy"] # 0x2e25 + - "➊": [T: "lewy obrĂłcony nawias kwadratowy u"] # 0x2e26 + - "âž§": [T: "prawy obrĂłcony nawias kwadratowy u"] # 0x2e27 + - "âžš": [T: "lewy podwĂłjny nawias okrągƂy"] # 0x2e28 + - "âž©": [T: "prawy podwĂłjny nawias okrągƂy"] # 0x2e29 + - "âžȘ": [T: "dwie kropki nad jedną kropką interpunkcyjną"] # 0x2e2a + - "âž«": [T: "jedna kropka nad dwiema kropkami interpunkcyjnymi"] # 0x2e2b + - "➏": [T: "do kwadratu cztery kropka interpunkcyjny"] # 0x2e2c + - "âž­": [T: "pięć kropka znak"] # 0x2e2d + - "âžź": [T: "odwrĂłcony zapytania znak"] # 0x2e2e + - "➯": [T: "pionowy tylda"] # 0x2e2f + - "âž°": [T: "pierƛcieƄ punkt"] # 0x2e30 + - "âž±": [T: "separator wyrazĂłw ƛrodkowa kropka"] # 0x2e31 + - "âžČ": [T: "odwrĂłcony przecinek"] # 0x2e32 + - "âžł": [T: "podniesiony kropka"] # 0x2e33 + - "➎": [T: "podniesiony przecinek"] # 0x2e34 + - "âž”": [T: "odwrĂłcony ƛrednik"] # 0x2e35 + - "âž¶": [T: "obelisk z lewą osƂoną"] # 0x2e36 + - "âž·": [T: "obelisk z prawą osƂoną"] # 0x2e37 + - "âžž": [T: "odwrĂłcony obelisk"] # 0x2e38 + - "âžč": [T: "gĂłrna poƂowa paragraf znak"] # 0x2e39 + - "âžș": [T: "dwa pauza"] # 0x2e3a + - "âž»": [T: "trzy pauza"] # 0x2e3b + - "〃": [T: "znak powtĂłrzenia"] # 0x3003 + - "〈": [T: "lewy nawias kątowy"] # 0x3008 + - "〉": [T: "prawy nawias kątowy"] # 0x3009 + - "《": [T: "lewy podwĂłjny nawias kątowy"] # 0x300a + - "》": [T: "prawy podwĂłjny nawias kątowy"] # 0x300b + - "「": [T: "lewy nawias naroĆŒny"] # 0x300c + - "」": [T: "prawy nawias naroĆŒny"] # 0x300d + - "『": [T: "lewy biaƂy nawias naroĆŒny"] # 0x300e + - "』": [T: "prawy biaƂy nawias naroĆŒny"] # 0x300f + - "【": [T: "lewy czarny nawias soczewkowy"] # 0x3010 + - "】": [T: "prawy czarny nawias soczewkowy"] # 0x3011 + - "〔": [T: "lewy nawias skorupowy"] # 0x3014 + - "〕": [T: "prawy nawias skorupowy"] # 0x3015 + - "〖": [T: "lewy biaƂy nawias soczewkowy"] # 0x3016 + - "〗": [T: "prawy biaƂy nawias soczewkowy"] # 0x3017 + - "〘": [T: "lewy biaƂy nawias skorupowy"] # 0x3018 + - "〙": [T: "prawy biaƂy nawias skorupowy"] # 0x3019 + - "〚": [T: "lewy biaƂy nawias kwadratowy"] # 0x301a + - "〛": [T: "prawy biaƂy nawias kwadratowy"] # 0x301b + - "〜": [T: "falista kreska"] # 0x301c + - "〰": [T: "falista kreska"] # 0x3030 + - "㉈": [T: "liczba dziesięć w kóƂku na czarnym kwadracie"] # 0x3248 + - "㉉": [T: "liczba dwadzieƛcia w kóƂku na czarnym kwadracie"] # 0x3249 + - "㉊": [T: "liczba trzydzieƛci w kóƂku na czarnym kwadracie"] # 0x324a + - "㉋": [T: "liczba czterdzieƛci w kóƂku na czarnym kwadracie"] # 0x324b + - "㉌": [T: "liczba pięćdziesiąt w kóƂku na czarnym kwadracie"] # 0x324c + - "㉍": [T: "liczba szeƛćdziesiąt w kóƂku na czarnym kwadracie"] # 0x324d + - "㉎": [T: "liczba siedemdziesiąt w kóƂku na czarnym kwadracie"] # 0x324e + - "㉏": [T: "liczba osiemdziesiąt w kóƂku na czarnym kwadracie"] # 0x324f + - "㉑": [T: "w kóƂku numer dwadzieƛcia jeden"] # 0x3251 + - "㉒": [T: "w kóƂku numer dwadzieƛcia dwa"] # 0x3252 + - "㉓": [T: "w kóƂku numer dwadzieƛcia trzy"] # 0x3253 + - "㉔": [T: "w kóƂku numer dwadzieƛcia cztery"] # 0x3254 + - "㉕": [T: "w kóƂku numer dwadzieƛcia pięć"] # 0x3255 + - "㉖": [T: "w kóƂku numer dwadzieƛcia szeƛć"] # 0x3256 + - "㉗": [T: "w kóƂku numer dwadzieƛcia siedem"] # 0x3257 + - "㉘": [T: "w kóƂku numer dwadzieƛcia osiem"] # 0x3258 + - "㉙": [T: "w kóƂku numer dwadzieƛcia dziewięć"] # 0x3259 + - "㉚": [T: "w kóƂku numer trzydzieƛci"] # 0x325a + - "㉛": [T: "w kóƂku numer trzydzieƛci jeden"] # 0x325b + - "㉜": [T: "w kóƂku numer trzydzieƛci dwa"] # 0x325c + - "㉝": [T: "w kóƂku numer trzydzieƛci trzy"] # 0x325d + - "㉞": [T: "w kóƂku numer trzydzieƛci cztery"] # 0x325e + - "㉟": [T: "w kóƂku numer trzydzieƛci pięć"] # 0x325f + - "㊱": [T: "w kóƂku numer trzydzieƛci szeƛć"] # 0x32b1 + - "ăŠČ": [T: "w kóƂku numer trzydzieƛci siedem"] # 0x32b2 (GPT-5.4 translation) + - "㊳": [T: "w kóƂku numer trzydzieƛci osiem"] # 0x32b3 (GPT-5.4 translation) + - "㊮": [T: "w kóƂku numer trzydzieƛci dziewięć"] # 0x32b4 (GPT-5.4 translation) + - "㊔": [T: "w kóƂku numer czterdzieƛci"] # 0x32b5 (GPT-5.4 translation) + - "㊶": [T: "w kóƂku numer czterdzieƛci jeden"] # 0x32b6 (GPT-5.4 translation) + - "㊷": [T: "w kóƂku numer czterdzieƛci dwa"] # 0x32b7 (GPT-5.4 translation) + - "㊾": [T: "w kóƂku numer czterdzieƛci trzy"] # 0x32b8 (GPT-5.4 translation) + - "ăŠč": [T: "w kóƂku numer czterdzieƛci cztery"] # 0x32b9 (GPT-5.4 translation) + - "ăŠș": [T: "w kóƂku numer czterdzieƛci pięć"] # 0x32ba (GPT-5.4 translation) + - "㊻": [T: "w kóƂku numer czterdzieƛci szeƛć"] # 0x32bb (GPT-5.4 translation) + - "ăŠŒ": [T: "w kóƂku numer czterdzieƛci siedem"] # 0x32bc (GPT-5.4 translation) + - "ăŠœ": [T: "w kóƂku numer czterdzieƛci osiem"] # 0x32bd (GPT-5.4 translation) + - "ăŠŸ": [T: "w kóƂku numer czterdzieƛci dziewięć"] # 0x32be (GPT-5.4 translation) + - "㊿": [T: "w kóƂku numer pięćdziesiąt"] # 0x32bf (GPT-5.4 translation) + - "㋌": [T: "Merkury"] # 0x32cc + - "㋍": [T: "ergi"] # 0x32cd + - "㋎": [T: "elektron wolty"] # 0x32ce + - "㋏": [T: "znak ograniczonej odpowiedzialnoƛci"] # 0x32cf + - "ă±": [T: "hektopaskale"] # 0x3371 + - "ăČ": [T: "daltony"] # 0x3372 + - "㍳": [T: "jednostki astronomiczne"] # 0x3373 + - "㍮": [T: "bary"] # 0x3374 - "ă”": [T: "o V"] # 0x3375 - - "ă¶": [t: "parseki"] # 0x3376 - - "ă·": [t: "decymetry"] # 0x3377 - - "㍾": [t: "decymetry do kwadratu"] # 0x3378 - - "ăč": [t: "decymetry do szeƛcianu"] # 0x3379 - - "ăș": [t: "jednostki międzynarodowe"] # 0x337a - - "㎀": [t: "pikoampery"] # 0x3380 - - "㎁": [t: "nanoampery"] # 0x3381 - - "㎂": [t: "mikroampery"] # 0x3382 - - "㎃": [t: "miliampery"] # 0x3383 - - "㎄": [t: "kiloampery"] # 0x3384 - - "㎅": [t: "kilobajty"] # 0x3385 - - "㎆": [t: "megabajty"] # 0x3386 - - "㎇": [t: "gigabajty"] # 0x3387 - - "㎈": [t: "kalorie"] # 0x3388 - - "㎉": [t: "kilokalorie"] # 0x3389 - - "㎊": [t: "pikofarady"] # 0x338a - - "㎋": [t: "nanofarady"] # 0x338b - - "㎌": [t: "mikrofarady"] # 0x338c - - "㎍": [t: "mikrogramy"] # 0x338d - - "㎎": [t: "miligramy"] # 0x338e - - "㎏": [t: "kilogramy"] # 0x338f - - "㎐": [t: "herce"] # 0x3390 - - "㎑": [t: "kiloherce"] # 0x3391 - - "㎒": [t: "megaherce"] # 0x3392 - - "㎓": [t: "gigaherce"] # 0x3393 - - "㎔": [t: "teraherce"] # 0x3394 - - "㎕": [t: "mikrolitry"] # 0x3395 - - "㎖": [t: "mililitry"] # 0x3396 - - "㎗": [t: "decylitry"] # 0x3397 - - "㎘": [t: "kilolitry"] # 0x3398 - - "㎙": [t: "femtometry"] # 0x3399 - - "㎚": [t: "nanometry"] # 0x339a - - "㎛": [t: "mikrometry"] # 0x339b - - "㎜": [t: "milimetry"] # 0x339c - - "㎝": [t: "centymetry"] # 0x339d - - "㎞": [t: "kilometry"] # 0x339e - - "㎟": [t: "milimetry do kwadratu"] # 0x339f - - "㎠": [t: "centymetry do kwadratu"] # 0x33a0 - - "㎡": [t: "metry do kwadratu"] # 0x33a1 - - "㎱": [t: "kilometry do kwadratu"] # 0x33a2 - - "㎣": [t: "milimetry do szeƛcianu"] # 0x33a3 - - "㎀": [t: "centymetry do szeƛcianu"] # 0x33a4 - - "㎄": [t: "metry do szeƛcianu"] # 0x33a5 - - "㎩": [t: "kilometry do szeƛcianu"] # 0x33a6 - - "㎧": [t: "metry na drugi"] # 0x33a7 - - "㎹": [t: "metry na drugi do kwadratu"] # 0x33a8 - - "㎩": [t: "paskale"] # 0x33a9 - - "ăŽȘ": [t: "kilopaskale"] # 0x33aa - - "㎫": [t: "megapaskale"] # 0x33ab - - "㎬": [t: "gigapaskale"] # 0x33ac - - "㎭": [t: "radiany"] # 0x33ad - - "㎼": [t: "radiany na sekundę"] # 0x33ae - - "㎯": [t: "radiany na sekundę do kwadratu"] # 0x33af - - "㎰": [t: "pikosekundy"] # 0x33b0 - - "㎱": [t: "nanosekundy"] # 0x33b1 - - "ăŽČ": [t: "mikrosekundy"] # 0x33b2 - - "㎳": [t: "milisekundy"] # 0x33b3 - - "㎮": [t: "pikowolty"] # 0x33b4 - - "㎔": [t: "nanowolty"] # 0x33b5 - - "㎶": [t: "mikrowolty"] # 0x33b6 - - "㎷": [t: "miliwolty"] # 0x33b7 - - "㎾": [t: "kilowolty"] # 0x33b8 - - "ăŽč": [t: "megawolty"] # 0x33b9 - - "ăŽș": [t: "pikowaty"] # 0x33ba - - "㎻": [t: "nanowaty"] # 0x33bb - - "ăŽŒ": [t: "mikrowaty"] # 0x33bc - - "ăŽœ": [t: "miliwaty"] # 0x33bd - - "ăŽŸ": [t: "kilowaty"] # 0x33be - - "㎿": [t: "megawaty"] # 0x33bf - - "㏀": [t: "kilo omy"] # 0x33c0 - - "㏁": [t: "megaomy"] # 0x33c1 - - "㏂": [t: "A M"] # 0x33c2 - - "㏃": [t: "bekerele"] # 0x33c3 - - "㏄": [t: "centymetry szeƛcienne"] # 0x33c4 - - "㏅": [t: "kandele"] # 0x33c5 - - "㏆": [t: "kulomby na kilogram"] # 0x33c6 - - "㏇": [t: "wielkie C, o, kropka"] # 0x33c7 (I have no idea what this is) - - "㏈": [t: "decybele"] # 0x33c8 - - "㏉": [t: "greje"] # 0x33c9 - - "㏊": [t: "hektary"] # 0x33ca - - "㏋": [t: "konie mechaniczne"] # 0x33cb - - "㏌": [t: "cale"] # 0x33cc - - "㏍": [t: "kilokelwiny"] # 0x33cd - - "㏎": [t: "kilometry"] # 0x33ce - - "㏏": [t: "węzƂy"] # 0x33cf - - "㏐": [t: "lumeny"] # 0x33d0 + - "ă¶": [T: "parseki"] # 0x3376 + - "ă·": [T: "decymetry"] # 0x3377 + - "㍾": [T: "decymetry do kwadratu"] # 0x3378 + - "ăč": [T: "decymetry do szeƛcianu"] # 0x3379 + - "ăș": [T: "jednostki międzynarodowe"] # 0x337a + - "㎀": [T: "pikoampery"] # 0x3380 + - "㎁": [T: "nanoampery"] # 0x3381 + - "㎂": [T: "mikroampery"] # 0x3382 + - "㎃": [T: "miliampery"] # 0x3383 + - "㎄": [T: "kiloampery"] # 0x3384 + - "㎅": [T: "kilobajty"] # 0x3385 + - "㎆": [T: "megabajty"] # 0x3386 + - "㎇": [T: "gigabajty"] # 0x3387 + - "㎈": [T: "kalorie"] # 0x3388 + - "㎉": [T: "kilokalorie"] # 0x3389 + - "㎊": [T: "pikofarady"] # 0x338a + - "㎋": [T: "nanofarady"] # 0x338b + - "㎌": [T: "mikrofarady"] # 0x338c + - "㎍": [T: "mikrogramy"] # 0x338d + - "㎎": [T: "miligramy"] # 0x338e + - "㎏": [T: "kilogramy"] # 0x338f + - "㎐": [T: "herce"] # 0x3390 + - "㎑": [T: "kiloherce"] # 0x3391 + - "㎒": [T: "megaherce"] # 0x3392 + - "㎓": [T: "gigaherce"] # 0x3393 + - "㎔": [T: "teraherce"] # 0x3394 + - "㎕": [T: "mikrolitry"] # 0x3395 + - "㎖": [T: "mililitry"] # 0x3396 + - "㎗": [T: "decylitry"] # 0x3397 + - "㎘": [T: "kilolitry"] # 0x3398 + - "㎙": [T: "femtometry"] # 0x3399 + - "㎚": [T: "nanometry"] # 0x339a + - "㎛": [T: "mikrometry"] # 0x339b + - "㎜": [T: "milimetry"] # 0x339c + - "㎝": [T: "centymetry"] # 0x339d + - "㎞": [T: "kilometry"] # 0x339e + - "㎟": [T: "milimetry do kwadratu"] # 0x339f + - "㎠": [T: "centymetry do kwadratu"] # 0x33a0 + - "㎡": [T: "metry do kwadratu"] # 0x33a1 + - "㎱": [T: "kilometry do kwadratu"] # 0x33a2 + - "㎣": [T: "milimetry do szeƛcianu"] # 0x33a3 + - "㎀": [T: "centymetry do szeƛcianu"] # 0x33a4 + - "㎄": [T: "metry do szeƛcianu"] # 0x33a5 + - "㎩": [T: "kilometry do szeƛcianu"] # 0x33a6 + - "㎧": [T: "metry na drugi"] # 0x33a7 + - "㎹": [T: "metry na drugi do kwadratu"] # 0x33a8 + - "㎩": [T: "paskale"] # 0x33a9 + - "ăŽȘ": [T: "kilopaskale"] # 0x33aa + - "㎫": [T: "megapaskale"] # 0x33ab + - "㎬": [T: "gigapaskale"] # 0x33ac + - "㎭": [T: "radiany"] # 0x33ad + - "㎼": [T: "radiany na sekundę"] # 0x33ae + - "㎯": [T: "radiany na sekundę do kwadratu"] # 0x33af + - "㎰": [T: "pikosekundy"] # 0x33b0 + - "㎱": [T: "nanosekundy"] # 0x33b1 + - "ăŽČ": [T: "mikrosekundy"] # 0x33b2 + - "㎳": [T: "milisekundy"] # 0x33b3 + - "㎮": [T: "pikowolty"] # 0x33b4 + - "㎔": [T: "nanowolty"] # 0x33b5 + - "㎶": [T: "mikrowolty"] # 0x33b6 + - "㎷": [T: "miliwolty"] # 0x33b7 + - "㎾": [T: "kilowolty"] # 0x33b8 + - "ăŽč": [T: "megawolty"] # 0x33b9 + - "ăŽș": [T: "pikowaty"] # 0x33ba + - "㎻": [T: "nanowaty"] # 0x33bb + - "ăŽŒ": [T: "mikrowaty"] # 0x33bc + - "ăŽœ": [T: "miliwaty"] # 0x33bd + - "ăŽŸ": [T: "kilowaty"] # 0x33be + - "㎿": [T: "megawaty"] # 0x33bf + - "㏀": [T: "kilo omy"] # 0x33c0 + - "㏁": [T: "megaomy"] # 0x33c1 + - "㏂": [T: "A M"] # 0x33c2 + - "㏃": [T: "bekerele"] # 0x33c3 + - "㏄": [T: "centymetry szeƛcienne"] # 0x33c4 + - "㏅": [T: "kandele"] # 0x33c5 + - "㏆": [T: "kulomby na kilogram"] # 0x33c6 + - "㏇": [T: "wielkie C, o, kropka"] # 0x33c7 (I have no idea what this is) + - "㏈": [T: "decybele"] # 0x33c8 + - "㏉": [T: "greje"] # 0x33c9 + - "㏊": [T: "hektary"] # 0x33ca + - "㏋": [T: "konie mechaniczne"] # 0x33cb + - "㏌": [T: "cale"] # 0x33cc + - "㏍": [T: "kilokelwiny"] # 0x33cd + - "㏎": [T: "kilometry"] # 0x33ce + - "㏏": [T: "węzƂy"] # 0x33cf + - "㏐": [T: "lumeny"] # 0x33d0 - "㏑": [T: "logarytm naturalny"] # 0x33d1 - - "㏒": [t: "logarytm"] # 0x33d2 - - "㏓": [t: "luksy"] # 0x33d3 - - "㏔": [t: "milibarny"] # 0x33d4 - - "㏕": [t: "mile"] # 0x33d5 - - "㏖": [t: "mole"] # 0x33d6 + - "㏒": [T: "logarytm"] # 0x33d2 + - "㏓": [T: "luksy"] # 0x33d3 + - "㏔": [T: "milibarny"] # 0x33d4 + - "㏕": [T: "mile"] # 0x33d5 + - "㏖": [T: "mole"] # 0x33d6 - "㏗": [T: "p h"] # 0x33d7 - - "㏘": [t: "pikometry"] # 0x33d8 - - "㏙": [t: "częƛci na milion"] # 0x33d9 - - "㏚": [t: "petarentgeny"] # 0x33da - - "㏛": [t: "steradiany"] # 0x33db - - "㏜": [t: "siwerty"] # 0x33dc - - "㏝": [t: "webery"] # 0x33dd - - "㏞": [t: "wolty na metr"] # 0x33de - - "㏟": [t: "ampery na metr"] # 0x33df - - "㏿": [t: "galony"] # 0x33ff - - "": [t: "rĂłwna się z daszkiem pod"] # 0xe900 - - "": [t: "rĂłwna się z plusem nad"] # 0xe901 - - "": [t: "rĂłwna się z plusem pod"] # 0xe902 - - "": [t: "tylda z plusem nad"] # 0xe903 - - "": [t: "tylda z plusem pod"] # 0xe904 - - "": [t: "rĂłwne podwĂłjny przez większe niĆŒ"] # 0xe908 - - "": [t: "rĂłwne podwĂłjny przez mniejsze niĆŒ"] # 0xe909 - - "": [t: "zawiera lub rĂłwne"] # 0xe90a - - "": [t: "nadzbiĂłr lub rĂłwny"] # 0xe90b - - "": [t: "podzbiĂłr lub rĂłwny"] # 0xe90c - - "": [t: "rĂłwne przez mniejsze niĆŒ"] # 0xe90d - - "": [t: "naleĆŒy do lub rĂłwne"] # 0xe912 - - "": [t: "rĂłwne lub większe niĆŒ"] # 0xe913 - - "": [t: "przybliĆŒone nadzbiĂłr"] # 0xe914 - - "": [t: "przybliĆŒone podzbiĂłr"] # 0xe915 - - "": [t: "nadzbiĂłr z kropką zawiera jako relację indeksu dolnego"] # 0xe916 - - "": [t: "podzbiĂłr z kropką jest zawarty jako relacja indeksu dolnego"] # 0xe917 - - "": [t: "rĂłwne z kropką pod"] # 0xe918 - - "": [t: "lewy kropka nad minus przez prawy kropka"] # 0xe919 - - "": [t: "prawy kropka nad minus przez lewy kropka"] # 0xe91a - - "": [t: "w przybliĆŒeniu rĂłwne minus"] # 0xe91f - - "": [t: "podwĂłjna kwadratowa suma zbiorĂłw"] # 0xe920 - - "": [t: "podwĂłjny kwadrat wielka"] # 0xe921 - - "": [t: "mniejsze niĆŒ rĂłwne lub większe niĆŒ"] # 0xe922 - - "": [t: "tylda z kropką"] # 0xe924 - - "": [t: "tylda z dwiema kropkami"] # 0xe925 - - "": [t: "mniejsze niĆŒ większe lub rĂłwne"] # 0xe926 - - "": [t: "większe niĆŒ mniejsze lub rĂłwne"] # 0xe927 - - "": [t: "RĂłwnowaĆŒne lub mniejsze niĆŒ"] # 0xe928 - - "": [t: "RĂłwnowaĆŒne lub większe niĆŒ"] # 0xe929 - - "î€Ș": [t: "lewy otwĂłrz ramka operator"] # 0xe92a - - "": [t: "prawy otwĂłrz ramka operator"] # 0xe92b - - "": [t: "identyczne z kropką"] # 0xe92c - - "": [t: "większe niĆŒ rĂłwne lub mniejsze niĆŒ"] # 0xe92d - - "": [t: "kreska operator"] # 0xe92e - - "": [t: "podwĂłjny kreska operator"] # 0xe92f - - "": [t: "potrĂłjny kreska operator"] # 0xe930 - - "î€Č": [t: "mniejsze niĆŒ lub w przybliĆŒeniu rĂłwne"] # 0xe932 - - "": [t: "większe niĆŒ lub w przybliĆŒeniu rĂłwne"] # 0xe933 - - "": [t: "zagnieĆŒdĆŒone mniejsze niĆŒ"] # 0xe936 - - "": [t: "zagnieĆŒdĆŒone większe niĆŒ"] # 0xe937 - - "î€ș": [t: "poprzedza lub RĂłwnowaĆŒne"] # 0xe93a - - "": [t: "następuje po lub RĂłwnowaĆŒne"] # 0xe93b - - "î„€": [t: "poprzedza nad rĂłwne"] # 0xe940 - - "": [t: "następuje po nad rĂłwne"] # 0xe941 - - "î„‚": [t: "mniejsze niĆŒ nad ukoƛnie rĂłwne nad większe niĆŒ"] # 0xe942 - - "": [t: "większe niĆŒ nad ukoƛnie rĂłwne nad mniejsze niĆŒ"] # 0xe943 - - "": [t: "speƂnione przez"] # 0xe948 - - "": [t: "leniwe s"] # 0xe949 - - "": [t: "nie asercja"] # 0xe94a - - "î„‹": [t: "podwĂłjny rĂłwne"] # 0xe94b - - "": [t: "potrĂłjny rĂłwne"] # 0xe94c - - "": [t: "reguƂa opĂłĆșniona"] # 0xe94d - - "": [t: "alias ogranicznika"] # 0xe94e - - "": [t: "normalna podgrupa z kreską"] # 0xe950 - - "î„‘": [t: "zawiera jako normalny podgrupa z kreską"] # 0xe951 - - "î„”": [t: "zaokrąglone implikuje"] # 0xe954 - - "î„•": [t: "uƛmiech pod kreską"] # 0xe955 - - "î„–": [t: "smutek przez kreskę"] # 0xe956 - - "î„—": [t: "nadzbiĂłr lub w przybliĆŒeniu rĂłwne"] # 0xe957 - - "": [t: "podzbiĂłr lub w przybliĆŒeniu rĂłwne"] # 0xe958 - - "î„™": [t: "większe niĆŒ w przybliĆŒeniu rĂłwne lub mniejsze niĆŒ"] # 0xe959 - - "": [t: "mniejsze niĆŒ w przybliĆŒeniu rĂłwne lub większe niĆŒ"] # 0xe95a - - "": [t: "podwĂłjny logiczne lub"] # 0xe95c - - "": [t: "podwĂłjna koniunkcja logiczna"] # 0xe95d - - "": [t: "alternatywa logiczna z podwĂłjną kreską pod"] # 0xe95e - - "": [t: "logiczne lub z kreską pod"] # 0xe95f - - "": [t: "w przybliĆŒeniu rĂłwne nad rĂłwne"] # 0xe962 - - "î„€": [t: "trĂłjkąt skierowany w lewo z kreską dzielącą"] # 0xe964 - - "î„„": [t: "trĂłjkąt skierowany w prawo z kreską dzielącą"] # 0xe965 - - "": [t: "rĂłwna się z kropkowaną gĂłrną linią"] # 0xe966 - - "î„§": [t: "poprzedza z dwukropkiem"] # 0xe967 - - "": [t: "następuje po z dwukropkiem"] # 0xe968 - - "î„©": [t: "mniejsze niĆŒ lub ukoƛnie rĂłwne"] # 0xe969 - - "î„Ș": [t: "większe niĆŒ lub ukoƛnie rĂłwne"] # 0xe96a - - "î„«": [t: "zagnieĆŒdĆŒone bardzo znacznie mniejsze niĆŒ"] # 0xe96b - - "": [t: "zagnieĆŒdĆŒone bardzo znacznie większe niĆŒ"] # 0xe96c - - "î„­": [t: "wariant rĂłĆŒnicy między"] # 0xe96d - - "": [t: "mniejsze niĆŒ większe niĆŒ nakƂadka"] # 0xe96e - - "": [t: "alternatywa logiczna z naƂoĆŒoną koniunkcją logiczną"] # 0xe96f - - "î„°": [t: "nadzbiĂłr przez nadzbiĂłr"] # 0xe970 - - "": [t: "podzbiĂłr przez podzbiĂłr"] # 0xe971 - - "î„Č": [t: "nadzbiĂłr przez podzbiĂłr"] # 0xe972 - - "": [t: "podzbiĂłr przez nadzbiĂłr"] # 0xe973 - - "î„č": [t: "potrĂłjna pionowa kreska"] # 0xe979 - - "î„ș": [t: "sparowane poczwĂłrne pionowe kropki"] # 0xe97a - - "î„»": [t: "prostopadƂe przez kreskę"] # 0xe97b - - "": [t: "lewy znak dedukcji z podwĂłjną pionową kreską"] # 0xe97c - - "": [t: "podwĂłjny lewy znak dedukcji z podwĂłjną pionową kreską"] # 0xe97d - - "": [t: "prostopadƂe przez odwrĂłcony prostopadƂe"] # 0xe97e - - "": [t: "podwĂłjny lewy znak dedukcji z pionową kreską"] # 0xe97f - - "": [t: "kąt sferyczny otwarty w gĂłrę"] # 0xe980 - - "": [t: "podwĂłjny ukoƛnik"] # 0xe981 - - "": [t: "kąt prosty z naroĆŒnikiem"] # 0xe982 - - "": [t: "pionowa kreska w kóƂku"] # 0xe984 - - "": [t: "znak dzielenia w kóƂku"] # 0xe985 - - "": [t: "kreskowany ukoƛnik"] # 0xe986 - - "": [t: "kreskowany ukoƛnik odwrotny"] # 0xe987 - - "": [t: "kreskowana linia ƛrodkowa"] # 0xe988 - - "": [t: "kreskowana pionowa kreska"] # 0xe989 - - "": [t: "prostopadƂe z s"] # 0xe98a - - "": [t: "kąt z s"] # 0xe98b - - "": [t: "kąt sferyczny otwarty w lewo"] # 0xe98c - - "": [t: "kąt otwarty w lewo"] # 0xe98d - - "": [t: "pionowa kreska z podwĂłjnym haczykiem"] # 0xe98e - - "": [t: "operator ƛredniej kropki wolnego rodnika"] # 0xe98f - - "": [t: "biaƂy trĂłjkąt skierowany w gĂłrę nad kreską"] # 0xe990 - - "": [t: "identyczne i rĂłwnolegƂe do"] # 0xe991 - - "": [t: "iloczyn spƂaszczony"] # 0xe992 - - "": [t: "potrĂłjny operator kreski z kreską poziomą"] # 0xe993 - - "": [t: "identyczne z podwĂłjnym ukoƛnikiem"] # 0xe994 - - "": [t: "potrĂłjne skrzyĆŒowane kreski"] # 0xe995 - - "": [t: "pionowa kreska przez okrąg"] # 0xe996 - - "": [t: "pionowy proporcjonalne do"] # 0xe997 - - "": [t: "czarna ostatnia kwadra ksiÄ™ĆŒyca"] # 0xe998 - - "": [t: "czarna pierwsza kwadra ksiÄ™ĆŒyca"] # 0xe999 - - "": [t: "ujemna fala sinusoidalna"] # 0xe9a0 - - "": [t: "kropka w nawiasach"] # 0xe9a1 - - "": [t: "nawiasy"] # 0xe9a2 - - "": [t: "biaƂy uƛmiech"] # 0xe9a3 - - "": [t: "biaƂy smutek"] # 0xe9a4 - - "": [t: "szeƛciokąt"] # 0xe9a5 - - "": [t: "RĂłwnowaĆŒne nad plus"] # 0xe9a6 - - "": [t: "plus przez RĂłwnowaĆŒne"] # 0xe9a7 - - "": [t: "częƛć wspĂłlna z szeryfami"] # 0xe9b0 - - "": [t: "suma zbiorĂłw z szeryfami"] # 0xe9b1 - - "îŠČ": [t: "kwadratowa częƛć wspĂłlna z szeryfami"] # 0xe9b2 - - "": [t: "kwadratowa suma zbiorĂłw z szeryfami"] # 0xe9b3 - - "î§ ": [t: "poprzedza RĂłwnowaĆŒne lub następuje po"] # 0xe9e0 - - "î§Ą": [t: "następuje po RĂłwnowaĆŒne lub poprzedza"] # 0xe9e1 - - "î§ą": [t: "poprzedza w przybliĆŒeniu rĂłwne lub następuje po"] # 0xe9e2 - - "î§Ł": [t: "następuje po w przybliĆŒeniu rĂłwne lub poprzedza"] # 0xe9e3 - - "î§°": [t: "mniejsze niĆŒ RĂłwnowaĆŒne lub większe niĆŒ"] # 0xe9f0 - - "î§±": [t: "większe niĆŒ RĂłwnowaĆŒne lub mniejsze niĆŒ"] # 0xe9f1 - - "": [t: "pionowo przekreƛlone znacznie mniejsze niĆŒ"] # 0xea00 - - "": [t: "pionowo przekreƛlone znacznie większe niĆŒ"] # 0xea01 - - "": [t: "nie jest znacznie mniejsze niĆŒ, wariant"] # 0xea02 - - "": [t: "nie jest znacznie większe niĆŒ, wariant"] # 0xea03 - - "": [t: "mniejsze niĆŒ z pionową kreską i nie podwĂłjne rĂłwne"] # 0xea04 - - "": [t: "większe niĆŒ z pionową kreską i nie podwĂłjne rĂłwne"] # 0xea05 - - "": [t: "nie mniejsze lub rĂłwne"] # 0xea06 - - "": [t: "nie większe lub rĂłwne"] # 0xea07 - - "": [t: "ani rĂłwne, ani mniejsze niĆŒ"] # 0xea09 - - "": [t: "nie zawiera lub rĂłwne"] # 0xea0a - - "": [t: "ani nadzbiĂłr, ani rĂłwne"] # 0xea0b - - "": [t: "ani podzbiĂłr, ani rĂłwne"] # 0xea0c - - "": [t: "ukoƛnik odwrotny z podzbiorem"] # 0xea0d - - "": [t: "ani rĂłwne, ani większe niĆŒ"] # 0xea0e - - "": [t: "nie minus operator tyldy"] # 0xea0f - - "": [t: "ani rĂłwne, ani mniejsze niĆŒ"] # 0xea10 - - "": [t: "nie operator tyldy"] # 0xea11 - - "": [t: "nie jest elementem zbioru lub rĂłwne"] # 0xea12 - - "": [t: "ani rĂłwne, ani większe niĆŒ"] # 0xea13 - - "": [t: "nie w przybliĆŒeniu rĂłwne"] # 0xea14 - - "": [t: "nie następuje po podobne"] # 0xea15 - - "": [t: "mniejsze niĆŒ lub ukoƛnie rĂłwne z ukoƛnikiem"] # 0xea16 - - "": [t: "większe niĆŒ lub ukoƛnie rĂłwne z ukoƛnikiem"] # 0xea17 - - "": [t: "nadzbiĂłr ukoƛnik"] # 0xea1a - - "": [t: "nie zawiera"] # 0xea1b - - "": [t: "nie mniejsze lub rĂłwne"] # 0xea1d - - "": [t: "nie większe lub rĂłwne"] # 0xea1e - - "": [t: "nie w przybliĆŒeniu rĂłwne minus"] # 0xea1f - - "îšą": [t: "zanegowana przynaleĆŒnoƛć do zbioru z kropką nad"] # 0xea22 - - "": [t: "nie kąt pionowy"] # 0xea2c - - "îš­": [t: "nie ukoƛnie rĂłwnolegƂe"] # 0xea2d - - "îšź": [t: "nie kreska operator"] # 0xea2e - - "": [t: "nie podwĂłjny kreska operator"] # 0xea2f - - "îš°": [t: "nie potrĂłjny kreska operator"] # 0xea30 - - "îšČ": [t: "mniejsze niĆŒ ale nie w przybliĆŒeniu rĂłwne"] # 0xea32 - - "îšł": [t: "większe niĆŒ ale nie w przybliĆŒeniu rĂłwne"] # 0xea33 - - "": [t: "mniejsze niĆŒ lub nie rĂłwna się"] # 0xea34 - - "îš”": [t: "większe niĆŒ lub nie rĂłwna się"] # 0xea35 - - "îš¶": [t: "nie zagnieĆŒdĆŒone mniejsze niĆŒ"] # 0xea36 - - "îš·": [t: "nie zagnieĆŒdĆŒone większe niĆŒ"] # 0xea37 - - "îšž": [t: "nie jest znacznie mniejsze niĆŒ"] # 0xea38 - - "îšč": [t: "nie jest znacznie większe niĆŒ"] # 0xea39 - - "îšș": [t: "poprzedza ale nie RĂłwnowaĆŒne"] # 0xea3a - - "îš»": [t: "następuje po ale nie RĂłwnowaĆŒne"] # 0xea3b - - "": [t: "poprzedza ale nie rĂłwna się"] # 0xea3c - - "îšœ": [t: "następuje po ale nie rĂłwna się"] # 0xea3d - - "": [t: "nie rĂłwna się ani nie poprzedza"] # 0xea3e - - "îšż": [t: "nie rĂłwna się ani nie następuje po"] # 0xea3f - - "": [t: "poprzedza ale nie rĂłwna się"] # 0xea40 - - "": [t: "następuje po ale nie rĂłwna się"] # 0xea41 - - "": [t: "ani podzbiĂłr, ani rĂłwne"] # 0xea42 - - "": [t: "ani nadzbiĂłr, ani rĂłwne"] # 0xea43 - - "": [t: "podzbiĂłr lub nie rĂłwna się"] # 0xea44 - - "": [t: "nadzbiĂłr lub nie rĂłwna się"] # 0xea45 - - "": [t: "ani podzbiĂłr, ani rĂłwne"] # 0xea46 - - "": [t: "ani nadzbiĂłr, ani rĂłwne"] # 0xea47 - - "": [t: "nie potrĂłjny mniejsze niĆŒ"] # 0xea48 - - "": [t: "nie potrĂłjny większe niĆŒ"] # 0xea49 - - "": [t: "nie poprzedza rĂłwna się"] # 0xea4c - - "": [t: "nie następuje po rĂłwna się"] # 0xea4d - - "": [t: "nie normalna podgrupa z kreską"] # 0xea50 - - "": [t: "nie zawiera jako normalnej podgrupy z kreską"] # 0xea51 - - "": [t: "nie rĂłĆŒnica między"] # 0xea52 - - "": [t: "nie geometrycznie rĂłwnowaĆŒne"] # 0xea53 - - "": [t: "nie pionowo podobne"] # 0xea54 - - "": [t: "nie rĂłwne lub podobne"] # 0xea55 - - "": [t: "nie pionowo przybliĆŒone"] # 0xea56 - - "": [t: "nie w przybliĆŒeniu identyczne z"] # 0xea57 - - "": [t: "nie wyboiƛcie rĂłwne"] # 0xea58 - - "": [t: "nie wyboiƛcie pojedynczo rĂłwne"] # 0xea59 - - "": [t: "nie rĂłwne kropka"] # 0xea5a - - "": [t: "odwrotne nie rĂłwnowaĆŒne"] # 0xea5b - - "î© ": [t: "nie kwadrat podzbiĂłr"] # 0xea60 - - "": [t: "nie kwadrat nadzbiĂłr"] # 0xea61 - - "": [t: "nie w przybliĆŒeniu rĂłwne nad znakiem rĂłwnoƛci"] # 0xea62 - - "": [t: "nie ƛciƛle rĂłwnowaĆŒne"] # 0xea63 - - "î©€": [t: "nie przystające z kropką"] # 0xea64 - - "î©„": [t: "odwrotnie nie rĂłwne"] # 0xea65 - - "î©°": [t: "nie pionowy lewy trĂłjkąt rĂłwna się"] # 0xea70 - - "": [t: "nie pionowy prawy trĂłjkąt rĂłwna się"] # 0xea71 - - "îȘ€": [t: "nie cząstkowe"] # 0xea80 - - "": [t: "ozdobnik przedƂuĆŒenia strzaƂki"] # 0xeb00 - - "": [t: "strzaƂka prawy przeze strzaƂką lewy"] # 0xeb01 - - "": [t: "strzaƂka prawy przeze strzaƂką lewy"] # 0xeb02 - - "": [t: "harpun prawy przez harpun lewy"] # 0xeb03 - - "": [t: "harpun prawy przez harpun lewy"] # 0xeb04 - - "": [t: "podwĂłjna strzaƂka póƂnocny wschĂłd poƂudniowy zachĂłd"] # 0xeb05 - - "": [t: "podwĂłjna strzaƂka póƂnocny zachĂłd poƂudniowy wschĂłd"] # 0xeb06 - - "": [t: "poziome przedƂuĆŒenie harpuna"] # 0xeb07 - - "": [t: "Ƃuk ze strzaƂką w lewo przeciwnie do ruchu wskazĂłwek zegara"] # 0xeb08 - - "": [t: "Ƃuk ze strzaƂką w prawo przeciwnie do ruchu wskazĂłwek zegara"] # 0xeb09 - - "": [t: "duĆŒy strzaƂka w prawo akcent"] # 0xeb0b - - "": [t: "duĆŒy strzaƂka w lewo akcent"] # 0xeb0c - - "": [t: "lewy grot strzaƂki"] # 0xeb0d - - "": [t: "prawy grot strzaƂki"] # 0xeb0e - - "": [t: "duĆŒa strzaƂka w prawo z lewym przekreƛleniem"] # 0xeb0f - - "": [t: "poziome przedƂuĆŒenie podwĂłjnej strzaƂki"] # 0xeb10 - - "": [t: "duĆŒa podwĂłjna strzaƂka w lewo i prawo z przekreƛleniem"] # 0xeb11 - - "": [t: "strzaƂka w dóƂ po lewej i strzaƂka w gĂłrę"] # 0xeb12 - - "": [t: "strzaƂka w lewo z dolnym naroĆŒnikiem"] # 0xeb13 - - "": [t: "strzaƂka w prawo z gĂłrnym naroĆŒnikiem"] # 0xeb14 - - "": [t: "strzaƂka w lewo z gĂłrnym naroĆŒnikiem"] # 0xeb15 - - "": [t: "strzaƂka po gĂłrnym póƂokręgu przeciwnie do ruchu wskazĂłwek zegara z plusem"] # 0xeb16 - - "": [t: "strzaƂka po gĂłrnym póƂokręgu zgodnie z ruchem wskazĂłwek zegara z minusem"] # 0xeb17 - - "": [t: "strzaƂka w prawo z ogonem i przekreƛleniem"] # 0xeb18 - - "": [t: "prawy harpun dolny"] # 0xeb19 - - "": [t: "lewy harpun dolny"] # 0xeb1a - - "": [t: "lewy prawy harpun dolny"] # 0xeb1b - - "": [t: "lewy prawy harpun gĂłrny"] # 0xeb1c - - "": [t: "gĂłrny dolny harpun lewy"] # 0xeb1d - - "": [t: "gĂłrny dolny harpun prawy"] # 0xeb1e - - "": [t: "strzaƂka w gĂłrę w prawo ze strzaƂką w dóƂ"] # 0xeb1f - - "": [t: "lewy harpun do kreski z grotem gĂłrnym"] # 0xeb20 - - "": [t: "prawy harpun do kreski z grotem gĂłrnym"] # 0xeb21 - - "": [t: "lewy harpun do kreski z grotem dolnym"] # 0xeb22 - - "": [t: "prawy harpun do kreski z grotem dolnym"] # 0xeb23 - - "": [t: "lewy harpun od kreski z grotem gĂłrnym"] # 0xeb24 - - "": [t: "prawy harpun od kreski z grotem gĂłrnym"] # 0xeb25 - - "": [t: "lewy harpun od kreski z grotem dolnym"] # 0xeb26 - - "": [t: "prawy harpun od kreski z grotem dolnym"] # 0xeb27 - - "": [t: "gĂłrny harpun do kreski z grotem lewym"] # 0xeb28 - - "": [t: "dolny harpun do kreski z grotem lewym"] # 0xeb29 - - "îŹȘ": [t: "gĂłrny harpun do kreski z grotem prawym"] # 0xeb2a - - "": [t: "dolny harpun do kreski z grotem prawym"] # 0xeb2b - - "": [t: "gĂłrny harpun od kreski z grotem lewym"] # 0xeb2c - - "": [t: "dolny harpun od kreski z grotem lewym"] # 0xeb2d - - "": [t: "gĂłrny harpun od kreski z grotem prawym"] # 0xeb2e - - "": [t: "dolny harpun od kreski z grotem prawym"] # 0xeb2f - - "": [t: "strzaƂka w gĂłrę do kreski"] # 0xeb30 - - "": [t: "strzaƂka w dóƂ do kreski"] # 0xeb31 - - "îŹČ": [t: "gĂłrny harpun w lewo z dolnym harpunem"] # 0xeb32 - - "": [t: "gĂłrny harpun w prawo z dolnym harpunem"] # 0xeb33 - - "": [t: "gĂłrny grot strzaƂki"] # 0xeb34 - - "": [t: "dolny grot strzaƂki"] # 0xeb35 - - "": [t: "podwĂłjny harpun z lewym grotem dolnym i prawym grotem gĂłrnym"] # 0xeb36 - - "": [t: "podwĂłjny harpun z lewym grotem gĂłrnym i prawym grotem dolnym"] # 0xeb37 - - "": [t: "strzaƂka w lewo przez kreskę"] # 0xeb38 - - "îŹč": [t: "strzaƂka w prawo przez kreskę"] # 0xeb39 - - "îŹș": [t: "strzaƂka w lewo pod kreski"] # 0xeb3a - - "": [t: "strzaƂka w prawo pod kreski"] # 0xeb3b - - "îŹŒ": [t: "lewy prawy potrĂłjny strzaƂka"] # 0xeb3c - - "": [t: "podwĂłjna strzaƂka póƂnocny wschĂłd poƂudniowy wschĂłd"] # 0xeb3f - - "": [t: "strzaƂka po lewym póƂokręgu przeciwnie do ruchu wskazĂłwek zegara"] # 0xeb40 - - "": [t: "strzaƂka po lewym póƂokręgu zgodnie z ruchem wskazĂłwek zegara"] # 0xeb41 - - "": [t: "lewy otwarty okrąg lewy strzaƂka w prawo"] # 0xeb42 - - "": [t: "strzaƂka w prawo przez tylda"] # 0xeb44 - - "": [t: "strzaƂka w lewo przez tylda"] # 0xeb45 - - "": [t: "lewy harpun przez kreskę"] # 0xeb48 - - "": [t: "prawy harpun przez kreskę"] # 0xeb49 - - "": [t: "lewy harpun pod kreski"] # 0xeb4a - - "": [t: "prawy harpun pod kreski"] # 0xeb4b - - "": [t: "krĂłtka czarna strzaƂka w lewo"] # 0xeb4c - - "": [t: "strzaƂka po prawym póƂokręgu zgodnie z ruchem wskazĂłwek zegara"] # 0xeb50 - - "": [t: "strzaƂka po prawym póƂokręgu przeciwnie do ruchu wskazĂłwek zegara"] # 0xeb51 - - "": [t: "lewy otwarty okrąg lewy prawy harpun"] # 0xeb52 - - "": [t: "strzaƂka w gĂłrę lewy z pionową kreską"] # 0xeb58 - - "": [t: "strzaƂka w dóƂ lewy z pionową kreską"] # 0xeb59 - - "": [t: "strzaƂka w gĂłrę prawy z pionową kreską"] # 0xeb5a - - "": [t: "strzaƂka w dóƂ prawy z pionową kreską"] # 0xeb5b - - "": [t: "strzaƂka w prawo z wydƂuĆŒonym dolnym hakiem"] # 0xeb5c - - "": [t: "strzaƂka w lewo z wydƂuĆŒonym hakiem"] # 0xeb5d - - "": [t: "strzaƂka w lewo z wydƂuĆŒonym dolnym hakiem"] # 0xeb5e - - "": [t: "strzaƂka w prawo z wydƂuĆŒonym hakiem"] # 0xeb5f - - "î­ ": [t: "nie strzaƂka w prawo falista"] # 0xeb60 - - "î­Ą": [t: "nie strzaƂka w prawo zakrzywiony"] # 0xeb61 - - "î­š": [t: "gĂłrny harpun lewy z pionową kreską"] # 0xeb68 - - "î­©": [t: "dolny harpun lewy z pionową kreską"] # 0xeb69 - - "î­Ș": [t: "gĂłrny harpun prawy z pionową kreską"] # 0xeb6a - - "î­«": [t: "dolny harpun prawy z pionową kreską"] # 0xeb6b - - "î­Ź": [t: "pionowe przedƂuĆŒenie podwĂłjnej strzaƂki"] # 0xeb6c - - "î­­": [t: "pionowe przedƂuĆŒenie harpuna z grotem w lewo"] # 0xeb6d - - "î­ź": [t: "pionowe przedƂuĆŒenie harpuna z grotem w prawo"] # 0xeb6e - - "î­Ż": [t: "prawy harpun przez lewy harpun prawy"] # 0xeb6f - - "î­°": [t: "prawy harpun przez lewy harpun lewy"] # 0xeb70 - - "î­±": [t: "lewy harpun przez prawy harpun prawy"] # 0xeb71 - - "î­Č": [t: "lewy harpun przez prawy harpun lewy"] # 0xeb72 - - "î­ł": [t: "strzaƂka w lewo od kreski z grotem strzaƂki"] # 0xeb73 - - "î­Ž": [t: "przedƂuĆŒenie strzaƂki w prawo od lewej kreski"] # 0xeb74 - - "î­”": [t: "strzaƂka w lewo od kreski ogon"] # 0xeb75 - - "î­¶": [t: "strzaƂka w prawo od kreski ogon"] # 0xeb76 - - "î­·": [t: "strzaƂka w prawo od kreski z grotem strzaƂki"] # 0xeb77 - - "î­ž": [t: "gĂłrny harpun od kreski z lewym grotem strzaƂki"] # 0xeb78 - - "î­č": [t: "strzaƂka w prawo nad strzaƂką w lewo prawy"] # 0xeb79 - - "î­ș": [t: "strzaƂka w prawo nad strzaƂką w lewo lewy"] # 0xeb7a - - "î­»": [t: "strzaƂka w lewo nad strzaƂką w prawo prawy"] # 0xeb7b - - "î­Œ": [t: "strzaƂka w lewo nad strzaƂką w prawo lewy"] # 0xeb7c - - "î­œ": [t: "strzaƂka w gĂłrę od kreski z grotem strzaƂki"] # 0xeb7d - - "î­Ÿ": [t: "strzaƂka w gĂłrę od kreski ogon"] # 0xeb7e - - "î­ż": [t: "strzaƂka w dóƂ od kreski ogon"] # 0xeb7f - - "": [t: "strzaƂka w dóƂ od kreski z grotem strzaƂki"] # 0xeb80 - - "": [t: "dolny harpun od kreski z prawym grotem strzaƂki"] # 0xeb81 - - "": [t: "gĂłrny harpun w lewo z dolnym harpunem dolny"] # 0xeb82 - - "": [t: "przedƂuĆŒenie gĂłrnego harpuna w lewo i dolnego harpuna"] # 0xeb83 - - "": [t: "dolny harpun w lewo z gĂłrnym harpunem gĂłrny"] # 0xeb84 - - "": [t: "gĂłrny harpun w lewo z dolnym harpunem gĂłrny"] # 0xeb85 - - "": [t: "przedƂuĆŒenie dolnego harpuna w lewo i gĂłrnego harpuna"] # 0xeb86 - - "": [t: "dolny harpun w lewo z gĂłrnym harpunem dolny"] # 0xeb87 - - "": [t: "strzaƂka w gĂłrę po lewej i strzaƂka w dóƂ dolny"] # 0xeb88 - - "": [t: "strzaƂka w dóƂ po lewej i strzaƂka w gĂłrę gĂłrny"] # 0xeb89 - - "": [t: "strzaƂka w gĂłrę po lewej i strzaƂka w dóƂ gĂłrny"] # 0xeb8a - - "": [t: "strzaƂka w dóƂ po lewej i strzaƂka w gĂłrę dolny"] # 0xeb8b - - "": [t: "przedƂuĆŒenie strzaƂki w lewo i w prawo"] # 0xeb8c - - "": [t: "przedƂuĆŒenie strzaƂki póƂnocno-wschodniej"] # 0xeb8d - - "": [t: "przedƂuĆŒenie strzaƂki póƂnocno-zachodniej"] # 0xeb8e - - "": [t: "lewa częƛć dolnego nawiasu klamrowego"] # 0xec00 - - "": [t: "ƛrodkowa częƛć dolnego nawiasu klamrowego"] # 0xec01 - - "": [t: "prawa częƛć dolnego nawiasu klamrowego"] # 0xec02 - - "": [t: "poziome przedƂuĆŒenie nawiasu klamrowego"] # 0xec03 - - "": [t: "lewa częƛć gĂłrnego nawiasu klamrowego"] # 0xec04 - - "": [t: "ƛrodkowa częƛć gĂłrnego nawiasu klamrowego"] # 0xec05 - - "": [t: "prawa częƛć gĂłrnego nawiasu klamrowego"] # 0xec06 - - "": [t: "lewa pionowa kreska"] # 0xec07 - - "": [t: "prawa pionowa kreska"] # 0xec08 - - "": [t: "lewa podwĂłjna pionowa kreska"] # 0xec09 - - "": [t: "prawa podwĂłjna pionowa kreska"] # 0xec0a - - "": [t: "poziome przedƂuĆŒenie nawiasu kwadratowego"] # 0xec0b - - "": [t: "dolny nawias kwadratowy"] # 0xec0c - - "⎔": [t: "dolny nawias kwadratowy"] # 0x23b5 - - "": [t: "gĂłrny nawias kwadratowy"] # 0xec0d - - "⎮": [t: "gĂłrny nawias kwadratowy"] # 0x23b4 - - "": [t: "pod nawias kwadratowy lewy"] # 0xec0e - - "": [t: "pod nawias kwadratowy prawy"] # 0xec0f - - "": [t: "przez nawias kwadratowy lewy"] # 0xec10 - - "": [t: "przez nawias kwadratowy prawy"] # 0xec11 - - "": [t: "lewy nawias okrągƂy 1"] # 0xec12 - - "": [t: "lewy nawias okrągƂy 2"] # 0xec13 - - "": [t: "lewy nawias okrągƂy 3"] # 0xec14 - - "": [t: "lewy nawias okrągƂy 4"] # 0xec15 - - "": [t: "prawy nawias okrągƂy 1"] # 0xec16 - - "": [t: "prawy nawias okrągƂy 2"] # 0xec17 - - "": [t: "prawy nawias okrągƂy 3"] # 0xec18 - - "": [t: "prawy nawias okrągƂy 4"] # 0xec19 - - "": [t: "znak pierwiastka 1"] # 0xec1a - - "": [t: "znak pierwiastka 2"] # 0xec1b - - "": [t: "znak pierwiastka 3"] # 0xec1c - - "": [t: "znak pierwiastka 4"] # 0xec1d - - "": [t: "znak pierwiastka 5"] # 0xec1e - - "": [t: "dolna częƛć znaku pierwiastka"] # 0xec1f - - "î° ": [t: "pionowe przedƂuĆŒenie znaku pierwiastka"] # 0xec20 - - "î°Ą": [t: "gĂłrna częƛć znaku pierwiastka"] # 0xec21 - - "î°ą": [t: "lewy biaƂy nawias kwadratowy gĂłrny"] # 0xec22 - - "î°Ł": [t: "przedƂuĆŒenie lewego biaƂego nawiasu kwadratowego"] # 0xec23 - - "î°€": [t: "lewy biaƂy nawias kwadratowy dolny"] # 0xec24 - - "î°„": [t: "prawy biaƂy nawias kwadratowy gĂłrny"] # 0xec25 - - "î°Š": [t: "przedƂuĆŒenie prawego biaƂego nawiasu kwadratowego"] # 0xec26 - - "î°§": [t: "prawy biaƂy nawias kwadratowy dolny"] # 0xec27 - - "î°°": [t: "lewy biaƂy zakrzywiony nawias kwadratowy"] # 0xec30 - - "î°±": [t: "prawy biaƂy zakrzywiony nawias kwadratowy"] # 0xec31 - - "î°Č": [t: "znak dzielenia pisemnego"] # 0xec32 - - "î°ł": [t: "przedƂuĆŒenie znaku dzielenia pisemnego"] # 0xec33 - - "î°Ž": [t: "krĂłtkie dzielenie"] # 0xec34 - - "": [t: "podwĂłjne wiązanie em od poƂudniowego zachodu do póƂnocnego wschodu"] # 0xec40 - - "": [t: "podwĂłjne wiązanie em od póƂnocnego zachodu do poƂudniowego wschodu"] # 0xec41 - - "": [t: "pojedyncze poziome wiązanie em"] # 0xec42 - - "": [t: "podwĂłjne poziome wiązanie em"] # 0xec43 - - "": [t: "potrĂłjne poziome wiązanie em"] # 0xec44 - - "": [t: "pojedyncze pionowe wiązanie em"] # 0xec45 - - "": [t: "podwĂłjne pionowe wiązanie em"] # 0xec46 - - "": [t: "potrĂłjne pionowe wiązanie em"] # 0xec47 - - "": [t: "wiązanie em mniejsze niĆŒ"] # 0xec48 - - "": [t: "wiązanie em większe niĆŒ"] # 0xec49 - - "": [t: "pojedyncze poziome wiązanie en"] # 0xec4a - - "": [t: "podwĂłjne poziome wiązanie en"] # 0xec4b - - "": [t: "potrĂłjne poziome wiązanie en"] # 0xec4c - - "îȀ": [t: "gĂłrny lewy prostokąt"] # 0xec80 - - "îȁ": [t: "dolny lewy prostokąt"] # 0xec81 - - "îȐ": [t: "gĂłrny prawy prostokąt"] # 0xec90 - - "îȑ": [t: "dolny prawy prostokąt"] # 0xec91 - - "îȒ": [t: "naroĆŒnik dzielenia syntetycznego"] # 0xec92 - - "îȓ": [t: "poziome przedƂuĆŒenie dzielenia syntetycznego"] # 0xec93 - - "îȔ": [t: "pionowe przedƂuĆŒenie dzielenia syntetycznego"] # 0xec94 - - "îȕ": [t: "lewy przedƂuĆŒacz sufitu i podƂogi"] # 0xec95 - - "îȖ": [t: "prawy przedƂuĆŒacz sufitu i podƂogi"] # 0xec96 - - "îȗ": [t: "przedƂuĆŒenie przez nawias kwadratowy"] # 0xec97 - - "îȘ": [t: "pionowe przedƂuĆŒenie kreski"] # 0xec98 - - "îș": [t: "lewy podwĂłjny pionowe przedƂuĆŒenie kreski"] # 0xec99 - - "îȚ": [t: "poziome przedƂuĆŒenie kreski"] # 0xec9a - - "îȜ": [t: "przedƂuĆŒenie pod nawiasem kwadratowym"] # 0xec9c - - "îȝ": [t: "prawa częƛć dolnego nawiasu"] # 0xec9d - - "îȞ": [t: "przedƂuĆŒenie dolnego nawiasu"] # 0xec9e - - "îȟ": [t: "lewa częƛć dolnego nawiasu"] # 0xec9f - - "îČ ": [t: "przedƂuĆŒenie gĂłrnego nawiasu klamrowego"] # 0xeca0 - - "îČĄ": [t: "lewa częƛć gĂłrnego nawiasu"] # 0xeca1 - - "îČą": [t: "przedƂuĆŒenie gĂłrnego nawiasu"] # 0xeca2 - - "îČŁ": [t: "prawa częƛć gĂłrnego nawiasu"] # 0xeca3 - - "îČ€": [t: "przedƂuĆŒenie dolnego nawiasu klamrowego"] # 0xeca4 - - "": [t: "staƂa Plancka przez dwa pi kreska"] # 0xed00 - - "": [t: "lustrzane g"] # 0xed01 - - "": [t: "j bez kropki"] # 0xed02 + - "㏘": [T: "pikometry"] # 0x33d8 + - "㏙": [T: "częƛci na milion"] # 0x33d9 + - "㏚": [T: "petarentgeny"] # 0x33da + - "㏛": [T: "steradiany"] # 0x33db + - "㏜": [T: "siwerty"] # 0x33dc + - "㏝": [T: "webery"] # 0x33dd + - "㏞": [T: "wolty na metr"] # 0x33de + - "㏟": [T: "ampery na metr"] # 0x33df + - "㏿": [T: "galony"] # 0x33ff + - "": [T: "rĂłwna się z daszkiem pod"] # 0xe900 + - "": [T: "rĂłwna się z plusem nad"] # 0xe901 + - "": [T: "rĂłwna się z plusem pod"] # 0xe902 + - "": [T: "tylda z plusem nad"] # 0xe903 + - "": [T: "tylda z plusem pod"] # 0xe904 + - "": [T: "rĂłwne podwĂłjny przez większe niĆŒ"] # 0xe908 + - "": [T: "rĂłwne podwĂłjny przez mniejsze niĆŒ"] # 0xe909 + - "": [T: "zawiera lub rĂłwne"] # 0xe90a + - "": [T: "nadzbiĂłr lub rĂłwny"] # 0xe90b + - "": [T: "podzbiĂłr lub rĂłwny"] # 0xe90c + - "": [T: "rĂłwne przez mniejsze niĆŒ"] # 0xe90d + - "": [T: "naleĆŒy do lub rĂłwne"] # 0xe912 + - "": [T: "rĂłwne lub większe niĆŒ"] # 0xe913 + - "": [T: "przybliĆŒone nadzbiĂłr"] # 0xe914 + - "": [T: "przybliĆŒone podzbiĂłr"] # 0xe915 + - "": [T: "nadzbiĂłr z kropką zawiera jako relację indeksu dolnego"] # 0xe916 + - "": [T: "podzbiĂłr z kropką jest zawarty jako relacja indeksu dolnego"] # 0xe917 + - "": [T: "rĂłwne z kropką pod"] # 0xe918 + - "": [T: "lewy kropka nad minus przez prawy kropka"] # 0xe919 + - "": [T: "prawy kropka nad minus przez lewy kropka"] # 0xe91a + - "": [T: "w przybliĆŒeniu rĂłwne minus"] # 0xe91f + - "": [T: "podwĂłjna kwadratowa suma zbiorĂłw"] # 0xe920 + - "": [T: "podwĂłjny kwadrat wielka"] # 0xe921 + - "": [T: "mniejsze niĆŒ rĂłwne lub większe niĆŒ"] # 0xe922 + - "": [T: "tylda z kropką"] # 0xe924 + - "": [T: "tylda z dwiema kropkami"] # 0xe925 + - "": [T: "mniejsze niĆŒ większe lub rĂłwne"] # 0xe926 + - "": [T: "większe niĆŒ mniejsze lub rĂłwne"] # 0xe927 + - "": [T: "RĂłwnowaĆŒne lub mniejsze niĆŒ"] # 0xe928 + - "": [T: "RĂłwnowaĆŒne lub większe niĆŒ"] # 0xe929 + - "î€Ș": [T: "lewy otwĂłrz ramka operator"] # 0xe92a + - "": [T: "prawy otwĂłrz ramka operator"] # 0xe92b + - "": [T: "identyczne z kropką"] # 0xe92c + - "": [T: "większe niĆŒ rĂłwne lub mniejsze niĆŒ"] # 0xe92d + - "": [T: "kreska operator"] # 0xe92e + - "": [T: "podwĂłjny kreska operator"] # 0xe92f + - "": [T: "potrĂłjny kreska operator"] # 0xe930 + - "î€Č": [T: "mniejsze niĆŒ lub w przybliĆŒeniu rĂłwne"] # 0xe932 + - "": [T: "większe niĆŒ lub w przybliĆŒeniu rĂłwne"] # 0xe933 + - "": [T: "zagnieĆŒdĆŒone mniejsze niĆŒ"] # 0xe936 + - "": [T: "zagnieĆŒdĆŒone większe niĆŒ"] # 0xe937 + - "î€ș": [T: "poprzedza lub RĂłwnowaĆŒne"] # 0xe93a + - "": [T: "następuje po lub RĂłwnowaĆŒne"] # 0xe93b + - "î„€": [T: "poprzedza nad rĂłwne"] # 0xe940 + - "": [T: "następuje po nad rĂłwne"] # 0xe941 + - "î„‚": [T: "mniejsze niĆŒ nad ukoƛnie rĂłwne nad większe niĆŒ"] # 0xe942 + - "": [T: "większe niĆŒ nad ukoƛnie rĂłwne nad mniejsze niĆŒ"] # 0xe943 + - "": [T: "speƂnione przez"] # 0xe948 + - "": [T: "leniwe s"] # 0xe949 + - "": [T: "nie asercja"] # 0xe94a + - "î„‹": [T: "podwĂłjny rĂłwne"] # 0xe94b + - "": [T: "potrĂłjny rĂłwne"] # 0xe94c + - "": [T: "reguƂa opĂłĆșniona"] # 0xe94d + - "": [T: "alias ogranicznika"] # 0xe94e + - "": [T: "normalna podgrupa z kreską"] # 0xe950 + - "î„‘": [T: "zawiera jako normalny podgrupa z kreską"] # 0xe951 + - "î„”": [T: "zaokrąglone implikuje"] # 0xe954 + - "î„•": [T: "uƛmiech pod kreską"] # 0xe955 + - "î„–": [T: "smutek przez kreskę"] # 0xe956 + - "î„—": [T: "nadzbiĂłr lub w przybliĆŒeniu rĂłwne"] # 0xe957 + - "": [T: "podzbiĂłr lub w przybliĆŒeniu rĂłwne"] # 0xe958 + - "î„™": [T: "większe niĆŒ w przybliĆŒeniu rĂłwne lub mniejsze niĆŒ"] # 0xe959 + - "": [T: "mniejsze niĆŒ w przybliĆŒeniu rĂłwne lub większe niĆŒ"] # 0xe95a + - "": [T: "podwĂłjny logiczne lub"] # 0xe95c + - "": [T: "podwĂłjna koniunkcja logiczna"] # 0xe95d + - "": [T: "alternatywa logiczna z podwĂłjną kreską pod"] # 0xe95e + - "": [T: "logiczne lub z kreską pod"] # 0xe95f + - "": [T: "w przybliĆŒeniu rĂłwne nad rĂłwne"] # 0xe962 + - "î„€": [T: "trĂłjkąt skierowany w lewo z kreską dzielącą"] # 0xe964 + - "î„„": [T: "trĂłjkąt skierowany w prawo z kreską dzielącą"] # 0xe965 + - "": [T: "rĂłwna się z kropkowaną gĂłrną linią"] # 0xe966 + - "î„§": [T: "poprzedza z dwukropkiem"] # 0xe967 + - "": [T: "następuje po z dwukropkiem"] # 0xe968 + - "î„©": [T: "mniejsze niĆŒ lub ukoƛnie rĂłwne"] # 0xe969 + - "î„Ș": [T: "większe niĆŒ lub ukoƛnie rĂłwne"] # 0xe96a + - "î„«": [T: "zagnieĆŒdĆŒone bardzo znacznie mniejsze niĆŒ"] # 0xe96b + - "": [T: "zagnieĆŒdĆŒone bardzo znacznie większe niĆŒ"] # 0xe96c + - "î„­": [T: "wariant rĂłĆŒnicy między"] # 0xe96d + - "": [T: "mniejsze niĆŒ większe niĆŒ nakƂadka"] # 0xe96e + - "": [T: "alternatywa logiczna z naƂoĆŒoną koniunkcją logiczną"] # 0xe96f + - "î„°": [T: "nadzbiĂłr przez nadzbiĂłr"] # 0xe970 + - "": [T: "podzbiĂłr przez podzbiĂłr"] # 0xe971 + - "î„Č": [T: "nadzbiĂłr przez podzbiĂłr"] # 0xe972 + - "": [T: "podzbiĂłr przez nadzbiĂłr"] # 0xe973 + - "î„č": [T: "potrĂłjna pionowa kreska"] # 0xe979 + - "î„ș": [T: "sparowane poczwĂłrne pionowe kropki"] # 0xe97a + - "î„»": [T: "prostopadƂe przez kreskę"] # 0xe97b + - "": [T: "lewy znak dedukcji z podwĂłjną pionową kreską"] # 0xe97c + - "": [T: "podwĂłjny lewy znak dedukcji z podwĂłjną pionową kreską"] # 0xe97d + - "": [T: "prostopadƂe przez odwrĂłcony prostopadƂe"] # 0xe97e + - "": [T: "podwĂłjny lewy znak dedukcji z pionową kreską"] # 0xe97f + - "": [T: "kąt sferyczny otwarty w gĂłrę"] # 0xe980 + - "": [T: "podwĂłjny ukoƛnik"] # 0xe981 + - "": [T: "kąt prosty z naroĆŒnikiem"] # 0xe982 + - "": [T: "pionowa kreska w kóƂku"] # 0xe984 + - "": [T: "znak dzielenia w kóƂku"] # 0xe985 + - "": [T: "kreskowany ukoƛnik"] # 0xe986 + - "": [T: "kreskowany ukoƛnik odwrotny"] # 0xe987 + - "": [T: "kreskowana linia ƛrodkowa"] # 0xe988 + - "": [T: "kreskowana pionowa kreska"] # 0xe989 + - "": [T: "prostopadƂe z s"] # 0xe98a + - "": [T: "kąt z s"] # 0xe98b + - "": [T: "kąt sferyczny otwarty w lewo"] # 0xe98c + - "": [T: "kąt otwarty w lewo"] # 0xe98d + - "": [T: "pionowa kreska z podwĂłjnym haczykiem"] # 0xe98e + - "": [T: "operator ƛredniej kropki wolnego rodnika"] # 0xe98f + - "": [T: "biaƂy trĂłjkąt skierowany w gĂłrę nad kreską"] # 0xe990 + - "": [T: "identyczne i rĂłwnolegƂe do"] # 0xe991 + - "": [T: "iloczyn spƂaszczony"] # 0xe992 + - "": [T: "potrĂłjny operator kreski z kreską poziomą"] # 0xe993 + - "": [T: "identyczne z podwĂłjnym ukoƛnikiem"] # 0xe994 + - "": [T: "potrĂłjne skrzyĆŒowane kreski"] # 0xe995 + - "": [T: "pionowa kreska przez okrąg"] # 0xe996 + - "": [T: "pionowy proporcjonalne do"] # 0xe997 + - "": [T: "czarna ostatnia kwadra ksiÄ™ĆŒyca"] # 0xe998 + - "": [T: "czarna pierwsza kwadra ksiÄ™ĆŒyca"] # 0xe999 + - "": [T: "ujemna fala sinusoidalna"] # 0xe9a0 + - "": [T: "kropka w nawiasach"] # 0xe9a1 + - "": [T: "nawiasy"] # 0xe9a2 + - "": [T: "biaƂy uƛmiech"] # 0xe9a3 + - "": [T: "biaƂy smutek"] # 0xe9a4 + - "": [T: "szeƛciokąt"] # 0xe9a5 + - "": [T: "RĂłwnowaĆŒne nad plus"] # 0xe9a6 + - "": [T: "plus przez RĂłwnowaĆŒne"] # 0xe9a7 + - "": [T: "częƛć wspĂłlna z szeryfami"] # 0xe9b0 + - "": [T: "suma zbiorĂłw z szeryfami"] # 0xe9b1 + - "îŠČ": [T: "kwadratowa częƛć wspĂłlna z szeryfami"] # 0xe9b2 + - "": [T: "kwadratowa suma zbiorĂłw z szeryfami"] # 0xe9b3 + - "î§ ": [T: "poprzedza RĂłwnowaĆŒne lub następuje po"] # 0xe9e0 + - "î§Ą": [T: "następuje po RĂłwnowaĆŒne lub poprzedza"] # 0xe9e1 + - "î§ą": [T: "poprzedza w przybliĆŒeniu rĂłwne lub następuje po"] # 0xe9e2 + - "î§Ł": [T: "następuje po w przybliĆŒeniu rĂłwne lub poprzedza"] # 0xe9e3 + - "î§°": [T: "mniejsze niĆŒ RĂłwnowaĆŒne lub większe niĆŒ"] # 0xe9f0 + - "î§±": [T: "większe niĆŒ RĂłwnowaĆŒne lub mniejsze niĆŒ"] # 0xe9f1 + - "": [T: "pionowo przekreƛlone znacznie mniejsze niĆŒ"] # 0xea00 + - "": [T: "pionowo przekreƛlone znacznie większe niĆŒ"] # 0xea01 + - "": [T: "nie jest znacznie mniejsze niĆŒ, wariant"] # 0xea02 + - "": [T: "nie jest znacznie większe niĆŒ, wariant"] # 0xea03 + - "": [T: "mniejsze niĆŒ z pionową kreską i nie podwĂłjne rĂłwne"] # 0xea04 + - "": [T: "większe niĆŒ z pionową kreską i nie podwĂłjne rĂłwne"] # 0xea05 + - "": [T: "nie mniejsze lub rĂłwne"] # 0xea06 + - "": [T: "nie większe lub rĂłwne"] # 0xea07 + - "": [T: "ani rĂłwne, ani mniejsze niĆŒ"] # 0xea09 + - "": [T: "nie zawiera lub rĂłwne"] # 0xea0a + - "": [T: "ani nadzbiĂłr, ani rĂłwne"] # 0xea0b + - "": [T: "ani podzbiĂłr, ani rĂłwne"] # 0xea0c + - "": [T: "ukoƛnik odwrotny z podzbiorem"] # 0xea0d + - "": [T: "ani rĂłwne, ani większe niĆŒ"] # 0xea0e + - "": [T: "nie minus operator tyldy"] # 0xea0f + - "": [T: "ani rĂłwne, ani mniejsze niĆŒ"] # 0xea10 + - "": [T: "nie operator tyldy"] # 0xea11 + - "": [T: "nie jest elementem zbioru lub rĂłwne"] # 0xea12 + - "": [T: "ani rĂłwne, ani większe niĆŒ"] # 0xea13 + - "": [T: "nie w przybliĆŒeniu rĂłwne"] # 0xea14 + - "": [T: "nie następuje po podobne"] # 0xea15 + - "": [T: "mniejsze niĆŒ lub ukoƛnie rĂłwne z ukoƛnikiem"] # 0xea16 + - "": [T: "większe niĆŒ lub ukoƛnie rĂłwne z ukoƛnikiem"] # 0xea17 + - "": [T: "nadzbiĂłr ukoƛnik"] # 0xea1a + - "": [T: "nie zawiera"] # 0xea1b + - "": [T: "nie mniejsze lub rĂłwne"] # 0xea1d + - "": [T: "nie większe lub rĂłwne"] # 0xea1e + - "": [T: "nie w przybliĆŒeniu rĂłwne minus"] # 0xea1f + - "îšą": [T: "zanegowana przynaleĆŒnoƛć do zbioru z kropką nad"] # 0xea22 + - "": [T: "nie kąt pionowy"] # 0xea2c + - "îš­": [T: "nie ukoƛnie rĂłwnolegƂe"] # 0xea2d + - "îšź": [T: "nie kreska operator"] # 0xea2e + - "": [T: "nie podwĂłjny kreska operator"] # 0xea2f + - "îš°": [T: "nie potrĂłjny kreska operator"] # 0xea30 + - "îšČ": [T: "mniejsze niĆŒ ale nie w przybliĆŒeniu rĂłwne"] # 0xea32 + - "îšł": [T: "większe niĆŒ ale nie w przybliĆŒeniu rĂłwne"] # 0xea33 + - "": [T: "mniejsze niĆŒ lub nie rĂłwna się"] # 0xea34 + - "îš”": [T: "większe niĆŒ lub nie rĂłwna się"] # 0xea35 + - "îš¶": [T: "nie zagnieĆŒdĆŒone mniejsze niĆŒ"] # 0xea36 + - "îš·": [T: "nie zagnieĆŒdĆŒone większe niĆŒ"] # 0xea37 + - "îšž": [T: "nie jest znacznie mniejsze niĆŒ"] # 0xea38 + - "îšč": [T: "nie jest znacznie większe niĆŒ"] # 0xea39 + - "îšș": [T: "poprzedza ale nie RĂłwnowaĆŒne"] # 0xea3a + - "îš»": [T: "następuje po ale nie RĂłwnowaĆŒne"] # 0xea3b + - "": [T: "poprzedza ale nie rĂłwna się"] # 0xea3c + - "îšœ": [T: "następuje po ale nie rĂłwna się"] # 0xea3d + - "": [T: "nie rĂłwna się ani nie poprzedza"] # 0xea3e + - "îšż": [T: "nie rĂłwna się ani nie następuje po"] # 0xea3f + - "": [T: "poprzedza ale nie rĂłwna się"] # 0xea40 + - "": [T: "następuje po ale nie rĂłwna się"] # 0xea41 + - "": [T: "ani podzbiĂłr, ani rĂłwne"] # 0xea42 + - "": [T: "ani nadzbiĂłr, ani rĂłwne"] # 0xea43 + - "": [T: "podzbiĂłr lub nie rĂłwna się"] # 0xea44 + - "": [T: "nadzbiĂłr lub nie rĂłwna się"] # 0xea45 + - "": [T: "ani podzbiĂłr, ani rĂłwne"] # 0xea46 + - "": [T: "ani nadzbiĂłr, ani rĂłwne"] # 0xea47 + - "": [T: "nie potrĂłjny mniejsze niĆŒ"] # 0xea48 + - "": [T: "nie potrĂłjny większe niĆŒ"] # 0xea49 + - "": [T: "nie poprzedza rĂłwna się"] # 0xea4c + - "": [T: "nie następuje po rĂłwna się"] # 0xea4d + - "": [T: "nie normalna podgrupa z kreską"] # 0xea50 + - "": [T: "nie zawiera jako normalnej podgrupy z kreską"] # 0xea51 + - "": [T: "nie rĂłĆŒnica między"] # 0xea52 + - "": [T: "nie geometrycznie rĂłwnowaĆŒne"] # 0xea53 + - "": [T: "nie pionowo podobne"] # 0xea54 + - "": [T: "nie rĂłwne lub podobne"] # 0xea55 + - "": [T: "nie pionowo przybliĆŒone"] # 0xea56 + - "": [T: "nie w przybliĆŒeniu identyczne z"] # 0xea57 + - "": [T: "nie wyboiƛcie rĂłwne"] # 0xea58 + - "": [T: "nie wyboiƛcie pojedynczo rĂłwne"] # 0xea59 + - "": [T: "nie rĂłwne kropka"] # 0xea5a + - "": [T: "odwrotne nie rĂłwnowaĆŒne"] # 0xea5b + - "î© ": [T: "nie kwadrat podzbiĂłr"] # 0xea60 + - "": [T: "nie kwadrat nadzbiĂłr"] # 0xea61 + - "": [T: "nie w przybliĆŒeniu rĂłwne nad znakiem rĂłwnoƛci"] # 0xea62 + - "": [T: "nie ƛciƛle rĂłwnowaĆŒne"] # 0xea63 + - "î©€": [T: "nie przystające z kropką"] # 0xea64 + - "î©„": [T: "odwrotnie nie rĂłwne"] # 0xea65 + - "î©°": [T: "nie pionowy lewy trĂłjkąt rĂłwna się"] # 0xea70 + - "": [T: "nie pionowy prawy trĂłjkąt rĂłwna się"] # 0xea71 + - "îȘ€": [T: "nie cząstkowe"] # 0xea80 + - "": [T: "ozdobnik przedƂuĆŒenia strzaƂki"] # 0xeb00 + - "": [T: "strzaƂka prawy przeze strzaƂką lewy"] # 0xeb01 + - "": [T: "strzaƂka prawy przeze strzaƂką lewy"] # 0xeb02 + - "": [T: "harpun prawy przez harpun lewy"] # 0xeb03 + - "": [T: "harpun prawy przez harpun lewy"] # 0xeb04 + - "": [T: "podwĂłjna strzaƂka póƂnocny wschĂłd poƂudniowy zachĂłd"] # 0xeb05 + - "": [T: "podwĂłjna strzaƂka póƂnocny zachĂłd poƂudniowy wschĂłd"] # 0xeb06 + - "": [T: "poziome przedƂuĆŒenie harpuna"] # 0xeb07 + - "": [T: "Ƃuk ze strzaƂką w lewo przeciwnie do ruchu wskazĂłwek zegara"] # 0xeb08 + - "": [T: "Ƃuk ze strzaƂką w prawo przeciwnie do ruchu wskazĂłwek zegara"] # 0xeb09 + - "": [T: "duĆŒy strzaƂka w prawo akcent"] # 0xeb0b + - "": [T: "duĆŒy strzaƂka w lewo akcent"] # 0xeb0c + - "": [T: "lewy grot strzaƂki"] # 0xeb0d + - "": [T: "prawy grot strzaƂki"] # 0xeb0e + - "": [T: "duĆŒa strzaƂka w prawo z lewym przekreƛleniem"] # 0xeb0f + - "": [T: "poziome przedƂuĆŒenie podwĂłjnej strzaƂki"] # 0xeb10 + - "": [T: "duĆŒa podwĂłjna strzaƂka w lewo i prawo z przekreƛleniem"] # 0xeb11 + - "": [T: "strzaƂka w dóƂ po lewej i strzaƂka w gĂłrę"] # 0xeb12 + - "": [T: "strzaƂka w lewo z dolnym naroĆŒnikiem"] # 0xeb13 + - "": [T: "strzaƂka w prawo z gĂłrnym naroĆŒnikiem"] # 0xeb14 + - "": [T: "strzaƂka w lewo z gĂłrnym naroĆŒnikiem"] # 0xeb15 + - "": [T: "strzaƂka po gĂłrnym póƂokręgu przeciwnie do ruchu wskazĂłwek zegara z plusem"] # 0xeb16 + - "": [T: "strzaƂka po gĂłrnym póƂokręgu zgodnie z ruchem wskazĂłwek zegara z minusem"] # 0xeb17 + - "": [T: "strzaƂka w prawo z ogonem i przekreƛleniem"] # 0xeb18 + - "": [T: "prawy harpun dolny"] # 0xeb19 + - "": [T: "lewy harpun dolny"] # 0xeb1a + - "": [T: "lewy prawy harpun dolny"] # 0xeb1b + - "": [T: "lewy prawy harpun gĂłrny"] # 0xeb1c + - "": [T: "gĂłrny dolny harpun lewy"] # 0xeb1d + - "": [T: "gĂłrny dolny harpun prawy"] # 0xeb1e + - "": [T: "strzaƂka w gĂłrę w prawo ze strzaƂką w dóƂ"] # 0xeb1f + - "": [T: "lewy harpun do kreski z grotem gĂłrnym"] # 0xeb20 + - "": [T: "prawy harpun do kreski z grotem gĂłrnym"] # 0xeb21 + - "": [T: "lewy harpun do kreski z grotem dolnym"] # 0xeb22 + - "": [T: "prawy harpun do kreski z grotem dolnym"] # 0xeb23 + - "": [T: "lewy harpun od kreski z grotem gĂłrnym"] # 0xeb24 + - "": [T: "prawy harpun od kreski z grotem gĂłrnym"] # 0xeb25 + - "": [T: "lewy harpun od kreski z grotem dolnym"] # 0xeb26 + - "": [T: "prawy harpun od kreski z grotem dolnym"] # 0xeb27 + - "": [T: "gĂłrny harpun do kreski z grotem lewym"] # 0xeb28 + - "": [T: "dolny harpun do kreski z grotem lewym"] # 0xeb29 + - "îŹȘ": [T: "gĂłrny harpun do kreski z grotem prawym"] # 0xeb2a + - "": [T: "dolny harpun do kreski z grotem prawym"] # 0xeb2b + - "": [T: "gĂłrny harpun od kreski z grotem lewym"] # 0xeb2c + - "": [T: "dolny harpun od kreski z grotem lewym"] # 0xeb2d + - "": [T: "gĂłrny harpun od kreski z grotem prawym"] # 0xeb2e + - "": [T: "dolny harpun od kreski z grotem prawym"] # 0xeb2f + - "": [T: "strzaƂka w gĂłrę do kreski"] # 0xeb30 + - "": [T: "strzaƂka w dóƂ do kreski"] # 0xeb31 + - "îŹČ": [T: "gĂłrny harpun w lewo z dolnym harpunem"] # 0xeb32 + - "": [T: "gĂłrny harpun w prawo z dolnym harpunem"] # 0xeb33 + - "": [T: "gĂłrny grot strzaƂki"] # 0xeb34 + - "": [T: "dolny grot strzaƂki"] # 0xeb35 + - "": [T: "podwĂłjny harpun z lewym grotem dolnym i prawym grotem gĂłrnym"] # 0xeb36 + - "": [T: "podwĂłjny harpun z lewym grotem gĂłrnym i prawym grotem dolnym"] # 0xeb37 + - "": [T: "strzaƂka w lewo przez kreskę"] # 0xeb38 + - "îŹč": [T: "strzaƂka w prawo przez kreskę"] # 0xeb39 + - "îŹș": [T: "strzaƂka w lewo pod kreski"] # 0xeb3a + - "": [T: "strzaƂka w prawo pod kreski"] # 0xeb3b + - "îŹŒ": [T: "lewy prawy potrĂłjny strzaƂka"] # 0xeb3c + - "": [T: "podwĂłjna strzaƂka póƂnocny wschĂłd poƂudniowy wschĂłd"] # 0xeb3f + - "": [T: "strzaƂka po lewym póƂokręgu przeciwnie do ruchu wskazĂłwek zegara"] # 0xeb40 + - "": [T: "strzaƂka po lewym póƂokręgu zgodnie z ruchem wskazĂłwek zegara"] # 0xeb41 + - "": [T: "lewy otwarty okrąg lewy strzaƂka w prawo"] # 0xeb42 + - "": [T: "strzaƂka w prawo przez tylda"] # 0xeb44 + - "": [T: "strzaƂka w lewo przez tylda"] # 0xeb45 + - "": [T: "lewy harpun przez kreskę"] # 0xeb48 + - "": [T: "prawy harpun przez kreskę"] # 0xeb49 + - "": [T: "lewy harpun pod kreski"] # 0xeb4a + - "": [T: "prawy harpun pod kreski"] # 0xeb4b + - "": [T: "krĂłtka czarna strzaƂka w lewo"] # 0xeb4c + - "": [T: "strzaƂka po prawym póƂokręgu zgodnie z ruchem wskazĂłwek zegara"] # 0xeb50 + - "": [T: "strzaƂka po prawym póƂokręgu przeciwnie do ruchu wskazĂłwek zegara"] # 0xeb51 + - "": [T: "lewy otwarty okrąg lewy prawy harpun"] # 0xeb52 + - "": [T: "strzaƂka w gĂłrę lewy z pionową kreską"] # 0xeb58 + - "": [T: "strzaƂka w dóƂ lewy z pionową kreską"] # 0xeb59 + - "": [T: "strzaƂka w gĂłrę prawy z pionową kreską"] # 0xeb5a + - "": [T: "strzaƂka w dóƂ prawy z pionową kreską"] # 0xeb5b + - "": [T: "strzaƂka w prawo z wydƂuĆŒonym dolnym hakiem"] # 0xeb5c + - "": [T: "strzaƂka w lewo z wydƂuĆŒonym hakiem"] # 0xeb5d + - "": [T: "strzaƂka w lewo z wydƂuĆŒonym dolnym hakiem"] # 0xeb5e + - "": [T: "strzaƂka w prawo z wydƂuĆŒonym hakiem"] # 0xeb5f + - "î­ ": [T: "nie strzaƂka w prawo falista"] # 0xeb60 + - "î­Ą": [T: "nie strzaƂka w prawo zakrzywiony"] # 0xeb61 + - "î­š": [T: "gĂłrny harpun lewy z pionową kreską"] # 0xeb68 + - "î­©": [T: "dolny harpun lewy z pionową kreską"] # 0xeb69 + - "î­Ș": [T: "gĂłrny harpun prawy z pionową kreską"] # 0xeb6a + - "î­«": [T: "dolny harpun prawy z pionową kreską"] # 0xeb6b + - "î­Ź": [T: "pionowe przedƂuĆŒenie podwĂłjnej strzaƂki"] # 0xeb6c + - "î­­": [T: "pionowe przedƂuĆŒenie harpuna z grotem w lewo"] # 0xeb6d + - "î­ź": [T: "pionowe przedƂuĆŒenie harpuna z grotem w prawo"] # 0xeb6e + - "î­Ż": [T: "prawy harpun przez lewy harpun prawy"] # 0xeb6f + - "î­°": [T: "prawy harpun przez lewy harpun lewy"] # 0xeb70 + - "î­±": [T: "lewy harpun przez prawy harpun prawy"] # 0xeb71 + - "î­Č": [T: "lewy harpun przez prawy harpun lewy"] # 0xeb72 + - "î­ł": [T: "strzaƂka w lewo od kreski z grotem strzaƂki"] # 0xeb73 + - "î­Ž": [T: "przedƂuĆŒenie strzaƂki w prawo od lewej kreski"] # 0xeb74 + - "î­”": [T: "strzaƂka w lewo od kreski ogon"] # 0xeb75 + - "î­¶": [T: "strzaƂka w prawo od kreski ogon"] # 0xeb76 + - "î­·": [T: "strzaƂka w prawo od kreski z grotem strzaƂki"] # 0xeb77 + - "î­ž": [T: "gĂłrny harpun od kreski z lewym grotem strzaƂki"] # 0xeb78 + - "î­č": [T: "strzaƂka w prawo nad strzaƂką w lewo prawy"] # 0xeb79 + - "î­ș": [T: "strzaƂka w prawo nad strzaƂką w lewo lewy"] # 0xeb7a + - "î­»": [T: "strzaƂka w lewo nad strzaƂką w prawo prawy"] # 0xeb7b + - "î­Œ": [T: "strzaƂka w lewo nad strzaƂką w prawo lewy"] # 0xeb7c + - "î­œ": [T: "strzaƂka w gĂłrę od kreski z grotem strzaƂki"] # 0xeb7d + - "î­Ÿ": [T: "strzaƂka w gĂłrę od kreski ogon"] # 0xeb7e + - "î­ż": [T: "strzaƂka w dóƂ od kreski ogon"] # 0xeb7f + - "": [T: "strzaƂka w dóƂ od kreski z grotem strzaƂki"] # 0xeb80 + - "": [T: "dolny harpun od kreski z prawym grotem strzaƂki"] # 0xeb81 + - "": [T: "gĂłrny harpun w lewo z dolnym harpunem dolny"] # 0xeb82 + - "": [T: "przedƂuĆŒenie gĂłrnego harpuna w lewo i dolnego harpuna"] # 0xeb83 + - "": [T: "dolny harpun w lewo z gĂłrnym harpunem gĂłrny"] # 0xeb84 + - "": [T: "gĂłrny harpun w lewo z dolnym harpunem gĂłrny"] # 0xeb85 + - "": [T: "przedƂuĆŒenie dolnego harpuna w lewo i gĂłrnego harpuna"] # 0xeb86 + - "": [T: "dolny harpun w lewo z gĂłrnym harpunem dolny"] # 0xeb87 + - "": [T: "strzaƂka w gĂłrę po lewej i strzaƂka w dóƂ dolny"] # 0xeb88 + - "": [T: "strzaƂka w dóƂ po lewej i strzaƂka w gĂłrę gĂłrny"] # 0xeb89 + - "": [T: "strzaƂka w gĂłrę po lewej i strzaƂka w dóƂ gĂłrny"] # 0xeb8a + - "": [T: "strzaƂka w dóƂ po lewej i strzaƂka w gĂłrę dolny"] # 0xeb8b + - "": [T: "przedƂuĆŒenie strzaƂki w lewo i w prawo"] # 0xeb8c + - "": [T: "przedƂuĆŒenie strzaƂki póƂnocno-wschodniej"] # 0xeb8d + - "": [T: "przedƂuĆŒenie strzaƂki póƂnocno-zachodniej"] # 0xeb8e + - "": [T: "lewa częƛć dolnego nawiasu klamrowego"] # 0xec00 + - "": [T: "ƛrodkowa częƛć dolnego nawiasu klamrowego"] # 0xec01 + - "": [T: "prawa częƛć dolnego nawiasu klamrowego"] # 0xec02 + - "": [T: "poziome przedƂuĆŒenie nawiasu klamrowego"] # 0xec03 + - "": [T: "lewa częƛć gĂłrnego nawiasu klamrowego"] # 0xec04 + - "": [T: "ƛrodkowa częƛć gĂłrnego nawiasu klamrowego"] # 0xec05 + - "": [T: "prawa częƛć gĂłrnego nawiasu klamrowego"] # 0xec06 + - "": [T: "lewa pionowa kreska"] # 0xec07 + - "": [T: "prawa pionowa kreska"] # 0xec08 + - "": [T: "lewa podwĂłjna pionowa kreska"] # 0xec09 + - "": [T: "prawa podwĂłjna pionowa kreska"] # 0xec0a + - "": [T: "poziome przedƂuĆŒenie nawiasu kwadratowego"] # 0xec0b + - "": [T: "dolny nawias kwadratowy"] # 0xec0c + - "⎔": [T: "dolny nawias kwadratowy"] # 0x23b5 + - "": [T: "gĂłrny nawias kwadratowy"] # 0xec0d + - "⎮": [T: "gĂłrny nawias kwadratowy"] # 0x23b4 + - "": [T: "pod nawias kwadratowy lewy"] # 0xec0e + - "": [T: "pod nawias kwadratowy prawy"] # 0xec0f + - "": [T: "przez nawias kwadratowy lewy"] # 0xec10 + - "": [T: "przez nawias kwadratowy prawy"] # 0xec11 + - "": [T: "lewy nawias okrągƂy 1"] # 0xec12 + - "": [T: "lewy nawias okrągƂy 2"] # 0xec13 + - "": [T: "lewy nawias okrągƂy 3"] # 0xec14 + - "": [T: "lewy nawias okrągƂy 4"] # 0xec15 + - "": [T: "prawy nawias okrągƂy 1"] # 0xec16 + - "": [T: "prawy nawias okrągƂy 2"] # 0xec17 + - "": [T: "prawy nawias okrągƂy 3"] # 0xec18 + - "": [T: "prawy nawias okrągƂy 4"] # 0xec19 + - "": [T: "znak pierwiastka 1"] # 0xec1a + - "": [T: "znak pierwiastka 2"] # 0xec1b + - "": [T: "znak pierwiastka 3"] # 0xec1c + - "": [T: "znak pierwiastka 4"] # 0xec1d + - "": [T: "znak pierwiastka 5"] # 0xec1e + - "": [T: "dolna częƛć znaku pierwiastka"] # 0xec1f + - "î° ": [T: "pionowe przedƂuĆŒenie znaku pierwiastka"] # 0xec20 + - "î°Ą": [T: "gĂłrna częƛć znaku pierwiastka"] # 0xec21 + - "î°ą": [T: "lewy biaƂy nawias kwadratowy gĂłrny"] # 0xec22 + - "î°Ł": [T: "przedƂuĆŒenie lewego biaƂego nawiasu kwadratowego"] # 0xec23 + - "î°€": [T: "lewy biaƂy nawias kwadratowy dolny"] # 0xec24 + - "î°„": [T: "prawy biaƂy nawias kwadratowy gĂłrny"] # 0xec25 + - "î°Š": [T: "przedƂuĆŒenie prawego biaƂego nawiasu kwadratowego"] # 0xec26 + - "î°§": [T: "prawy biaƂy nawias kwadratowy dolny"] # 0xec27 + - "î°°": [T: "lewy biaƂy zakrzywiony nawias kwadratowy"] # 0xec30 + - "î°±": [T: "prawy biaƂy zakrzywiony nawias kwadratowy"] # 0xec31 + - "î°Č": [T: "znak dzielenia pisemnego"] # 0xec32 + - "î°ł": [T: "przedƂuĆŒenie znaku dzielenia pisemnego"] # 0xec33 + - "î°Ž": [T: "krĂłtkie dzielenie"] # 0xec34 + - "": [T: "podwĂłjne wiązanie em od poƂudniowego zachodu do póƂnocnego wschodu"] # 0xec40 + - "": [T: "podwĂłjne wiązanie em od póƂnocnego zachodu do poƂudniowego wschodu"] # 0xec41 + - "": [T: "pojedyncze poziome wiązanie em"] # 0xec42 + - "": [T: "podwĂłjne poziome wiązanie em"] # 0xec43 + - "": [T: "potrĂłjne poziome wiązanie em"] # 0xec44 + - "": [T: "pojedyncze pionowe wiązanie em"] # 0xec45 + - "": [T: "podwĂłjne pionowe wiązanie em"] # 0xec46 + - "": [T: "potrĂłjne pionowe wiązanie em"] # 0xec47 + - "": [T: "wiązanie em mniejsze niĆŒ"] # 0xec48 + - "": [T: "wiązanie em większe niĆŒ"] # 0xec49 + - "": [T: "pojedyncze poziome wiązanie en"] # 0xec4a + - "": [T: "podwĂłjne poziome wiązanie en"] # 0xec4b + - "": [T: "potrĂłjne poziome wiązanie en"] # 0xec4c + - "îȀ": [T: "gĂłrny lewy prostokąt"] # 0xec80 + - "îȁ": [T: "dolny lewy prostokąt"] # 0xec81 + - "îȐ": [T: "gĂłrny prawy prostokąt"] # 0xec90 + - "îȑ": [T: "dolny prawy prostokąt"] # 0xec91 + - "îȒ": [T: "naroĆŒnik dzielenia syntetycznego"] # 0xec92 + - "îȓ": [T: "poziome przedƂuĆŒenie dzielenia syntetycznego"] # 0xec93 + - "îȔ": [T: "pionowe przedƂuĆŒenie dzielenia syntetycznego"] # 0xec94 + - "îȕ": [T: "lewy przedƂuĆŒacz sufitu i podƂogi"] # 0xec95 + - "îȖ": [T: "prawy przedƂuĆŒacz sufitu i podƂogi"] # 0xec96 + - "îȗ": [T: "przedƂuĆŒenie przez nawias kwadratowy"] # 0xec97 + - "îȘ": [T: "pionowe przedƂuĆŒenie kreski"] # 0xec98 + - "îș": [T: "lewy podwĂłjny pionowe przedƂuĆŒenie kreski"] # 0xec99 + - "îȚ": [T: "poziome przedƂuĆŒenie kreski"] # 0xec9a + - "îȜ": [T: "przedƂuĆŒenie pod nawiasem kwadratowym"] # 0xec9c + - "îȝ": [T: "prawa częƛć dolnego nawiasu"] # 0xec9d + - "îȞ": [T: "przedƂuĆŒenie dolnego nawiasu"] # 0xec9e + - "îȟ": [T: "lewa częƛć dolnego nawiasu"] # 0xec9f + - "îČ ": [T: "przedƂuĆŒenie gĂłrnego nawiasu klamrowego"] # 0xeca0 + - "îČĄ": [T: "lewa częƛć gĂłrnego nawiasu"] # 0xeca1 + - "îČą": [T: "przedƂuĆŒenie gĂłrnego nawiasu"] # 0xeca2 + - "îČŁ": [T: "prawa częƛć gĂłrnego nawiasu"] # 0xeca3 + - "îČ€": [T: "przedƂuĆŒenie dolnego nawiasu klamrowego"] # 0xeca4 + - "": [T: "staƂa Plancka przez dwa pi kreska"] # 0xed00 + - "": [T: "lustrzane g"] # 0xed01 + - "": [T: "j bez kropki"] # 0xed02 - "": [T: "digamma"] # 0xed03 - "ϝ": [T: "digamma"] # 0x3dd - "": [T: "d"] # 0xed10 @@ -3004,8 +3004,8 @@ - spell: "translate('.', 'ⅅ', 'DD')" # 0xed16, 0x2145 # The private use chars are from MathType - - "": [t: "caƂka krzywoliniowa z pętlą przeciwnie do ruchu wskazĂłwek zegara"] # 0xee00 - - "": [t: "caƂka krzywoliniowa z pętlą zgodnie z ruchem wskazĂłwek zegara"] # 0xee01 + - "": [T: "caƂka krzywoliniowa z pętlą przeciwnie do ruchu wskazĂłwek zegara"] # 0xee00 + - "": [T: "caƂka krzywoliniowa z pętlą zgodnie z ruchem wskazĂłwek zegara"] # 0xee01 - "": [T: ""] # 0xee04 - "": [T: ""] # 0xee05 - "": [T: ""] # 0xee06 @@ -3015,30 +3015,30 @@ - "": [T: ""] # 0xee0a - "": [T: ""] # 0xee0b - "": [T: ""] # 0xee0c - - "": [t: "ozdobnik statusu poƂączenia"] # 0xee0d - - "": [t: "lewy ozdobnik statusu poƂączenia"] # 0xee0e - - "": [t: "prawy ozdobnik statusu poƂączenia"] # 0xee0f - - "": [t: "przedƂuĆŒenie ozdobnika statusu poƂączenia"] # 0xee10 - - "": [t: "caƂka z pętlą"] # 0xee11 - - "": [t: "podwĂłjna caƂka z pętlą"] # 0xee12 - - "": [t: "potrĂłjna caƂka z pętlą"] # 0xee13 - - "": [t: "rozszerzająca się podwĂłjna caƂka z pętlą"] # 0xee15 - - "": [t: "rozszerzająca się potrĂłjna caƂka z pętlą"] # 0xee16 + - "": [T: "ozdobnik statusu poƂączenia"] # 0xee0d + - "": [T: "lewy ozdobnik statusu poƂączenia"] # 0xee0e + - "": [T: "prawy ozdobnik statusu poƂączenia"] # 0xee0f + - "": [T: "przedƂuĆŒenie ozdobnika statusu poƂączenia"] # 0xee10 + - "": [T: "caƂka z pętlą"] # 0xee11 + - "": [T: "podwĂłjna caƂka z pętlą"] # 0xee12 + - "": [T: "potrĂłjna caƂka z pętlą"] # 0xee13 + - "": [T: "rozszerzająca się podwĂłjna caƂka z pętlą"] # 0xee15 + - "": [T: "rozszerzająca się potrĂłjna caƂka z pętlą"] # 0xee16 - "": [T: "akcent asymptotycznie rĂłwny"] # 0xee17 - - "": [t: "akcent znaku rĂłwnoƛci"] # 0xee18 - - "": [t: "poczwĂłrny prim"] # 0xee19 - - "": [t: "kreska akcent z otwartym okręgiem po lewej"] # 0xee1a - - "": [t: "kreska akcent z zamkniętym okręgiem po lewej"] # 0xee1b - - "": [t: "kreska akcent z otwartym okręgiem po prawej"] # 0xee1c - - "": [t: "kreska akcent z przekreƛloną kropką"] # 0xee1d - - "": [t: "kreska akcent z kropką pod spodem"] # 0xee1e - - "": [t: "kreska akcent z podwĂłjnie przekreƛloną kropką"] # 0xee1f - - "îž ": [t: "kreska akcent z podwĂłjną kropką pod spodem"] # 0xee20 - - "": [t: "kreska akcent z daszkiem"] # 0xee21 - - "îžą": [t: "gruby akcent kreski dolnej"] # 0xee22 - - "": [t: "kreska akcent z zamkniętym okręgiem po prawej"] # 0xee23 - - "": [t: "duĆŒy kropka nad"] # 0xee24 - - "": [t: "znak wyrĂłwnania"] # 0xef00 + - "": [T: "akcent znaku rĂłwnoƛci"] # 0xee18 + - "": [T: "poczwĂłrny prim"] # 0xee19 + - "": [T: "kreska akcent z otwartym okręgiem po lewej"] # 0xee1a + - "": [T: "kreska akcent z zamkniętym okręgiem po lewej"] # 0xee1b + - "": [T: "kreska akcent z otwartym okręgiem po prawej"] # 0xee1c + - "": [T: "kreska akcent z przekreƛloną kropką"] # 0xee1d + - "": [T: "kreska akcent z kropką pod spodem"] # 0xee1e + - "": [T: "kreska akcent z podwĂłjnie przekreƛloną kropką"] # 0xee1f + - "îž ": [T: "kreska akcent z podwĂłjną kropką pod spodem"] # 0xee20 + - "": [T: "kreska akcent z daszkiem"] # 0xee21 + - "îžą": [T: "gruby akcent kreski dolnej"] # 0xee22 + - "": [T: "kreska akcent z zamkniętym okręgiem po prawej"] # 0xee23 + - "": [T: "duĆŒy kropka nad"] # 0xee24 + - "": [T: "znak wyrĂłwnania"] # 0xef00 - "": [T: ""] # 0xef01 - "​": [T: ""] # 0x200b - "": [T: ""] # 0xef02 @@ -3057,110 +3057,110 @@ - "îŒŁ": [T: ""] # 0xef23 - "": [T: ""] # 0xef24 - "": [T: ""] # 0xef29 - - "": [t: "brakujący skƂadnik"] # 0xef41 - - "": [t: "caƂka krzywoliniowa zgodna z ruchem wskazĂłwek zegara ze strzaƂką po lewej"] # 0xef80 - - "": [t: "caƂka z kwadrat"] # 0xef81 - - "": [t: "caƂka z ukoƛnikiem"] # 0xef82 - - "": [t: "odwrĂłcony caƂka"] # 0xef83 - - "": [t: "podwĂłjny zero przez podwĂłjny zero"] # 0xef90 - - "": [t: "zero z ukoƛnikiem"] # 0xef91 + - "": [T: "brakujący skƂadnik"] # 0xef41 + - "": [T: "caƂka krzywoliniowa zgodna z ruchem wskazĂłwek zegara ze strzaƂką po lewej"] # 0xef80 + - "": [T: "caƂka z kwadrat"] # 0xef81 + - "": [T: "caƂka z ukoƛnikiem"] # 0xef82 + - "": [T: "odwrĂłcony caƂka"] # 0xef83 + - "": [T: "podwĂłjny zero przez podwĂłjny zero"] # 0xef90 + - "": [T: "zero z ukoƛnikiem"] # 0xef91 # fraktur 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) - - t: "fraktura" + - T: "fraktura" - spell: "translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" - "-": # 0xf000 - 0xf018 - - t: "fraktura" + - T: "fraktura" - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" - "𝔞-đ”·": # 0x1d51e - 0x1d537 - - t: "fraktura" + - T: "fraktura" - spell: "translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz')" - "-ï€ł": # 0xf01a - 0xf033 - - t: "fraktura" + - T: "fraktura" - spell: "translate('.', 'ï€šï€›ï€œï€ï€žï€Ÿï€ ï€Ąï€ąï€Łï€€ï€„ï€Šï€§ï€šï€©ï€Șï€«ï€Źï€­ï€źï€Żï€°ï€±ï€Čï€ł', 'abcdefghijklmnopqrstuvwxyz')" - "𝕬-𝖅": # 0x1D56C - 0x1D585 - - t: "fraktura" - - t: "pogrubione" + - T: "fraktura" + - T: "pogrubione" - spell: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf040 - 0xf059 - - t: "fraktura" - - t: "pogrubione" + - T: "fraktura" + - T: "pogrubione" - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝖆-𝖟": # 0x1d586 - 0x1d59f - - t: "fraktura" - - t: "pogrubione" + - T: "fraktura" + - T: "pogrubione" - spell: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" - "-ïł": # 0xf05a - 0xf073 - - t: "fraktura" - - t: "pogrubione" + - T: "fraktura" + - T: "pogrubione" - 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) - - t: "dwukreskowe" + - T: "dwukreskowe" - spell: "translate('.', '𝔾đ”čđ”șđ”»đ”Œđ”œđ”Ÿđ”żđ•€đ•đ•‚đ•ƒđ•„đ•…đ•†đ•‡đ•ˆđ•‰đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf080 - 0xf098 - - t: "dwukreskowe" + - T: "dwukreskowe" - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝕒-đ•«": # 0x1d552 - 0x1d56b - - t: "dwukreskowe" + - T: "dwukreskowe" - spell: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" - "-ï‚ł": # 0xf09a - 0xf0b3 - - t: "dwukreskowe" + - T: "dwukreskowe" - spell: "translate('.', 'ï‚šï‚›ï‚œï‚ï‚žï‚Ÿï‚ ï‚Ąï‚ąï‚Łï‚€ï‚„ï‚Šï‚§ï‚šï‚©ï‚Șï‚«ï‚Źï‚­ï‚źï‚Żï‚°ï‚±ï‚Čï‚ł', 'abcdefghijklmnopqrstuvwxyz')" - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 - - t: "dwukreskowe" + - T: "dwukreskowe" - spell: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" - "-": # 0xf0c0 - 0xf0c9 - - t: "dwukreskowe" + - T: "dwukreskowe" - spell: "translate('.', '', '0123456789')" - - "": [t: "dwukreskowe nabla"] # 0xf0ca - - "": [t: "dwukreskowa staƂa Eulera"] # 0xf0cb + - "": [T: "dwukreskowe nabla"] # 0xf0ca + - "": [T: "dwukreskowa staƂa Eulera"] # 0xf0cb # script chars in math alphabetic block and also MathType private use area - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 - - t: "pisane" + - T: "pisane" - spell: "translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf100 - 0xf119 - - t: "pisane" + - T: "pisane" - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf - - t: "pisane" + - T: "pisane" - spell: "translate('.', 'đ’¶đ’·đ’žđ’čđ’șđ’»đ’Œđ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“„đ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdefghijklmnopqrstuvwxyz')" - "-ï„ł": # 0xf11a - 0xf133 - - t: "pisane" + - T: "pisane" - spell: "translate('.', 'ï„šï„›ï„œï„ï„žï„Ÿï„ ï„Ąï„ąï„Łï„€ï„„ï„Šï„§ï„šï„©ï„Șï„«ï„Źï„­ï„źï„Żï„°ï„±ï„Čï„ł', 'abcdefghijklmnopqrstuvwxyz')" # bold script chars in math alphabetic block and also MathType private use area - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 - - t: "pisane" - - t: "pogrubione" + - T: "pisane" + - T: "pogrubione" - spell: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf140 - 0xf159 - - t: "pisane" - - t: "pogrubione" + - T: "pisane" + - T: "pogrubione" - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "đ“Ș-𝔃": # 0x1d4ea - 0x1d503 - - t: "pisane" - - t: "pogrubione" + - T: "pisane" + - T: "pogrubione" - spell: "translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz')" - "-ï…ł": # 0xf15a - 0xf173 - - t: "pisane" - - t: "pogrubione" + - T: "pisane" + - T: "pogrubione" - spell: "translate('.', 'ï…šï…›ï…œï…ï…žï…Ÿï… ï…Ąï…ąï…Łï…€ï…„ï…Šï…§ï…šï…©ï…Șï…«ï…Źï…­ï…źï…Żï…°ï…±ï…Čï…ł', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf180 - 0xf199 @@ -3179,11 +3179,11 @@ if: "$SpeechOverrides_CapitalLetters = ''" then_test: if: "$Impairment = 'Blindness'" - then: [t: "wielka"] + then: [T: "wielka"] else: [x: "$SpeechOverrides_CapitalLetters"] - pitch: value: "$CapitalLetters_Pitch" - replace: [t: "ligatura ae"] + replace: [T: "ligatura ae"] - "": # 0xf19b - test: if: "$CapitalLetters_Beep" @@ -3197,11 +3197,11 @@ if: "$SpeechOverrides_CapitalLetters = ''" then_test: if: "$Impairment = 'Blindness'" - then: [t: "wielka"] + then: [T: "wielka"] else: [x: "$SpeechOverrides_CapitalLetters"] - pitch: value: "$CapitalLetters_Pitch" - replace: [t: "eszett"] + replace: [T: "eszett"] - "": # 0xf19c - test: if: "$CapitalLetters_Beep" @@ -3215,38 +3215,38 @@ if: "$SpeechOverrides_CapitalLetters = ''" then_test: if: "$Impairment = 'Blindness'" - then: [t: "wielka"] + then: [T: "wielka"] else: [x: "$SpeechOverrides_CapitalLetters"] - pitch: value: "$CapitalLetters_Pitch" - replace: [t: "o z kreską"] + replace: [T: "o z kreską"] # MathType only has a few of the cap Greek letters in PUA - "": # 0xf201 - 0xf209 - - t: "dwukreskowe" + - T: "dwukreskowe" - spell: "translate('.', '', 'Î”ÎšÎ›Î ÎŁÎ˜Î“Î©Î„')" - "-": # 0xf220 - 0xf236 - - t: "dwukreskowe" + - T: "dwukreskowe" - spell: "translate('.', 'ïˆ ïˆĄïˆąïˆŁïˆ€ïˆ„ïˆŠïˆ§ïˆšïˆ©ïˆȘïˆ«ïˆŹïˆ­ïˆźïˆŻïˆ°ïˆ±ïˆČïˆłïˆŽïˆ”ïˆ¶', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - "": [t: "dwukreskowe sigma koƄcowa"] # 0xf237 - - "": [t: "dwukreskowe ro"] # 0xf250 - - "": [t: "dwukreskowe fi"] # 0xf251 + - "": [T: "dwukreskowe sigma koƄcowa"] # 0xf237 + - "": [T: "dwukreskowe ro"] # 0xf250 + - "": [T: "dwukreskowe fi"] # 0xf251 - "𝐀-𝐙": # 0x1d400 - 0x1d419 - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-ï‰č": # 0xf260 - 0xf279 - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', 'ï‰ ï‰Ąï‰ąï‰Łï‰€ï‰„ï‰Šï‰§ï‰šï‰©ï‰Șï‰«ï‰Źï‰­ï‰źï‰Żï‰°ï‰±ï‰Čï‰łï‰Žï‰”ï‰¶ï‰·ï‰žï‰č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝐚-𝐳": # 0x1d41a - 0x1d433 - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" - "ï‰ș-": # 0xf27a - 0xf293 - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', 'ï‰șï‰»ï‰Œï‰œï‰Ÿï‰żïŠ€ïŠïŠ‚ïŠƒïŠ„ïŠ…ïŠ†ïŠ‡ïŠˆïŠ‰ïŠŠïŠ‹ïŠŒïŠïŠŽïŠïŠïŠ‘ïŠ’ïŠ“', 'abcdefghijklmnopqrstuvwxyz')" - "𝐮-𝑍": # 0x1d434 - 0x1d44d @@ -3262,23 +3262,23 @@ - spell: "translate('.', 'ïŠźïŠŻïŠ°ïŠ±ïŠČïŠłïŠŽïŠ”ïŠ¶ïŠ·ïŠžïŠčïŠșïŠ»ïŠŒïŠœïŠŸïŠżï‹€ï‹ï‹‚ï‹ƒï‹„ï‹…ï‹†ï‹‡', 'abcdefghijklmnopqrstuvwxyz')" - "𝑹-𝒁": # 0x1d468 - 0x1d481 - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-ï‹Ą": # 0xf2c8 - 0xf2e1 - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', 'ï‹ˆï‹‰ï‹Šï‹‹ï‹Œï‹ï‹Žï‹ï‹ï‹‘ï‹’ï‹“ï‹”ï‹•ï‹–ï‹—ï‹˜ï‹™ï‹šï‹›ï‹œï‹ï‹žï‹Ÿï‹ ï‹Ą', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝒂-𝒛": # 0x1d482 - 0x1d49b - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" - "ï‹ą-": # 0xf2e2 - 0xf2fb - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', 'ï‹ąï‹Łï‹€ï‹„ï‹Šï‹§ï‹šï‹©ï‹Șï‹«ï‹Źï‹­ï‹źï‹Żï‹°ï‹±ï‹Čï‹łï‹Žï‹”ï‹¶ï‹·ï‹žï‹čï‹ș', 'abcdefghijklmnopqrstuvwxyz')" - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 @@ -3294,53 +3294,53 @@ - spell: "translate('.', 'ïŒšïŒ›ïŒœïŒïŒžïŒŸïŒ ïŒĄïŒąïŒŁïŒ€ïŒ„ïŒŠïŒ§ïŒšïŒ©ïŒȘïŒ«ïŒŹïŒ­ïŒźïŒŻïŒ°ïŒ±ïŒČïŒł', 'abcdefghijklmnopqrstuvwxyz')" - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf334 - 0xf34d - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', 'ïŒčïŒșïŒ»ïŒŒïŒœïŒŸïŒżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒï', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝗼-𝘇": # 0x1d5ee - 0x1d607 - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf34e - 0xf367 - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', 'ïŽïïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§', 'abcdefghijklmnopqrstuvwxyz')" - "𝘈-𝘡": # 0x1d608 - 0x1d621 - # - t: "kursywa" + # - T: "kursywa" - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf368 - 0xf381 - # - t: "kursywa" + # - T: "kursywa" - spell: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżïŽ€ïŽ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝘱-đ˜»": # 0x1d622 - 0x1d63b - # - t: "kursywa" + # - T: "kursywa" - spell: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf382 - 0xf39b - # - t: "kursywa" + # - T: "kursywa" - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf39c - 0xf3b5 - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', 'ïŽœïŽïŽžïŽŸïŽ ïŽĄïŽąïŽŁïŽ€ïŽ„ïŽŠïŽ§ïŽšïŽ©ïŽȘïŽ«ïŽŹïŽ­ïŽźïŽŻïŽ°ïŽ±ïŽČïŽłïŽŽïŽ”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝙖-𝙯": # 0x1d656 - 0x1d66f - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf3b6 - 0xf3cf - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', 'ïŽčïŽșïŽ»ïŽŒïŽœïŽŸïŽżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒïïŽï', 'abcdefghijklmnopqrstuvwxyz')" - "𝙰-𝚉": # 0x1d670 - 0x1d689 @@ -3355,170 +3355,170 @@ - "ïȘ-": # 0xf3ea - 0xf403 - spell: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżï€ïï‚ïƒ', 'abcdefghijklmnopqrstuvwxyz')" - - "": [t: "bez kropki I"] # 0xf404 - - "đš€": [t: "bez kropki I"] # 0x1d6a4 - - "đš„": [t: "j bez kropki"] # 0x1d6a5 + - "": [T: "bez kropki I"] # 0xf404 + - "đš€": [T: "bez kropki I"] # 0x1d6a4 + - "đš„": [T: "j bez kropki"] # 0x1d6a5 - "𝚹-𝛀": # 0x1d6a8 - 0x1d6c0 - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - "-": # 0xf408 - 0xf420 - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - "𝛂-𝛚": # 0x1d6c2 - 0x1d6da - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙𝛚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "ïą-ïș": # 0xf422 - 0xf43a - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', 'ïąïŁï€ï„ïŠï§ïšï©ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïș', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - "ïĄ": [t: "pogrubiona nabla"] # 0xf421 - - "𝛁": [t: "pogrubiona nabla"] # 0x1d6c1 + - "ïĄ": [T: "pogrubiona nabla"] # 0xf421 + - "𝛁": [T: "pogrubiona nabla"] # 0x1d6c1 - "𝛛𝛜𝛝𝛞𝛟𝛠𝛡": # 0x1D6DB - 0x1D6E1 - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', '𝛛𝛜𝛝𝛞𝛟𝛠𝛡', '∂ΔΞÎșφρπ')" - "ï»ïŒïœïŸïżï‘€ï‘": # 0xF43C - 0xF441 - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', 'ï»ïŒïœïŸïżï‘€ï‘', '∂ΔΞÎșφρπ')" - "𝛱-đ›ș": # 0x1d6e2 - 0x1d6fa - # - t: "kursywa" + # - T: "kursywa" - spell: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›čđ›ș', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - "-": # 0xf442 - 0xf45a - # - t: "kursywa" + # - T: "kursywa" - spell: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - "đ›Œ-𝜔": # 0x1d6fc - 0x1d714 - # - t: "kursywa" + # - T: "kursywa" - spell: "translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“đœ”', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "-": # 0xf45c - 0xf474 - # - t: "kursywa" + # - T: "kursywa" - spell: "translate('.', 'ï‘œï‘ï‘žï‘Ÿï‘ ï‘Ąï‘ąï‘Łï‘€ï‘„ï‘Šï‘§ï‘šï‘©ï‘Șï‘«ï‘Źï‘­ï‘źï‘Żï‘°ï‘±ï‘Čï‘łï‘Ž', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - "": [t: "kursywa nabla"] # 0xf45b - - "đ›»": [t: "kursywa nabla"] # 0x1d6fb + - "": [T: "kursywa nabla"] # 0xf45b + - "đ›»": [T: "kursywa nabla"] # 0x1d6fb - "𝜕𝜖𝜗𝜘𝜙𝜚𝜛": # 0x1d715 - 0x1d71b - # - t: "kursywa" + # - T: "kursywa" - spell: "translate('.', '𝜕𝜖𝜗𝜘𝜙𝜚𝜛', '∂ΔΞÎșφρπ')" - "ï‘čï‘ș": # 0xf475 - 0xf47b - # - t: "kursywa" + # - T: "kursywa" - spell: "translate('.', 'ï‘čï‘ș', '∂ΔΞÎșφρπ')" - "𝜜-𝜮": # 0x1d71c - 0x1d734 - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳𝜮', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - "-": # 0xf47c - 0xf494 - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', 'ï‘Œï‘œï‘Ÿï‘żï’€ï’ï’‚ï’ƒï’„ï’…ï’†ï’‡ï’ˆï’‰ï’Šï’‹ï’Œï’ï’Žï’ï’ï’‘ï’’ï’“ï’”', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - "đœ¶-𝝎": # 0x1d736 - 0x1d74e - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđđŽ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "-ï’ź": # 0xf496 - 0xf4ae - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', 'ï’–ï’—ï’˜ï’™ï’šï’›ï’œï’ï’žï’Ÿï’ ï’Ąï’ąï’Łï’€ï’„ï’Šï’§ï’šï’©ï’Șï’«ï’Źï’­ï’ź', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "𝝏𝝐𝝑𝝒𝝓𝝔𝝕": # 0x1d74f - 0x1d755 - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', '𝝏𝝐𝝑𝝒𝝓𝝔𝝕', '∂ΔΞÎșφρπ')" - "ï’Żï’°ï’±ï’Čï’łï’Žï’”": # 0xf422 - 0xf43a - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', 'ï’Żï’°ï’±ï’Čï’łï’Žï’”', '∂ΔΞÎșφρπ')" - - "đœ”": [t: "pogrubiona pochylona nabla"] # 0x1d735 - - "": [t: "pogrubiona pochylona nabla"] # 0xf495 + - "đœ”": [T: "pogrubiona pochylona nabla"] # 0x1d735 + - "": [T: "pogrubiona pochylona nabla"] # 0xf495 - "𝝖-𝝼": # 0x1d756 - 0x1d76e - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đź', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - "-": # 0xf4b6 - 0xf4ce - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', 'ï’¶ï’·ï’žï’čï’șï’»ï’Œï’œï’Ÿï’żï“€ï“ï“‚ï“ƒï“„ï“…ï“†ï“‡ï“ˆï“‰ï“Šï“‹ï“Œï“ï“Ž', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - "𝝰-𝞈": # 0x1d770 - 0x1d788 - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€đžđž‚đžƒđž„đž…đž†đž‡đžˆ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "-": # 0xf4d0 - 0xf4e8 - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', 'ï“ï“‘ï“’ï““ï“”ï“•ï“–ï“—ï“˜ï“™ï“šï“›ï“œï“ï“žï“Ÿï“ ï“Ąï“ąï“Łï“€ï“„ï“Šï“§ï“š', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "𝞉𝞊𝞋𝞌𝞍𝞎𝞏": # 0x1d789 - 0x1d78f - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', '𝞉𝞊𝞋𝞌𝞍𝞎𝞏', '∂ΔΞÎșφρπ')" - "ï“Șï“«ï“Źï“­ï“źï“Ż": # 0xf4e9 - 0xf4ef - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', 'ï“Șï“«ï“Źï“­ï“źï“Ż', '∂ΔΞÎșφρπ')" - - "": [t: "pogrubiona nabla"] # 0xf4cf - - "𝝯": [t: "pogrubiona nabla"] # 0x1d76f + - "": [T: "pogrubiona nabla"] # 0xf4cf + - "𝝯": [T: "pogrubiona nabla"] # 0x1d76f - "𝞐-𝞹": # 0x1d790 - 0x1d7a8 - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - "-": # 0xf4f0 - 0xf508 - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', 'ï“Čï“łï“Žï“”ï“¶ï“·ï“žï“čï“șï“»ï“Œï“œï“Ÿï“żï”€ï”ï”‚ï”ƒï”„ï”…ï”†ï”‡ï”ˆ', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - "đžȘ-𝟂": # 0x1d7aa - 0x1d7c2 - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸđŸ‚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "-ï”ą": # 0xf50a - 0xf522 - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', 'ï”Šï”‹ï”Œï”ï”Žï”ï”ï”‘ï”’ï”“ï””ï”•ï”–ï”—ï”˜ï”™ï”šï”›ï”œï”ï”žï”Ÿï” ï”Ąï”ą', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - "𝟃𝟄𝟅𝟆𝟇𝟈𝟉": # 0x1d7c3 - 0x1d7c9 - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', '𝟃𝟄𝟅𝟆𝟇𝟈𝟉', '∂ΔΞÎșφρπ')" - "ï”Łï”€ï”„ï”Šï”§ï”šï”©": # 0xf523 - 0xf529 - # - t: "pogrubiona kursywa" - - t: "pogrubione" + # - T: "pogrubiona kursywa" + - T: "pogrubione" - spell: "translate('.', 'ï”Łï”€ï”„ï”Šï”§ï”šï”©', '∂ΔΞÎșφρπ')" - - "": [t: "pogrubiona nabla"] # 0xf509 - - "đž©": [t: "pogrubiona nabla"] # 0x1d7a9 + - "": [T: "pogrubiona nabla"] # 0xf509 + - "đž©": [T: "pogrubiona nabla"] # 0x1d7a9 - "ï”ź-": # 0xf52e - 0xf537 (old MathType) - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', 'ï”źï”Żï”°ï”±ï”Čï”łï”Žï””ï”¶ï”·', '0123456789')" - "𝟎-𝟗": # 0x1d7ce - 0x1d7d7 - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', '𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗', '0123456789')" - "-": # 0xf52e - 0xf537 (old MathType) - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', '', '0123456789')" - "𝟬-đŸ”": # 0x1D7EC - 0x1D7F5 - - t: "pogrubione" + - T: "pogrubione" - spell: "translate('.', 'đŸŹđŸ­đŸźđŸŻđŸ°đŸ±đŸČđŸłđŸŽđŸ”', '0123456789')" - "-": # 0xf556 - 0xf55f (old MathType) @@ -3532,37 +3532,37 @@ - spell: "translate('.', 'đŸ¶đŸ·đŸžđŸčđŸșđŸ»đŸŒđŸœđŸŸđŸż', '0123456789')" - - "": [t: "nieznany znak"] # 0xf700 - - "": [t: "dolny prawy i dolny lewy trĂłjkąt"] # 0xf726 - - "": [t: "poziome przedƂuĆŒenie wielokropka"] # 0xf72d - - "ïœź": [t: "poziome przedƂuĆŒenie wielokropka w linii ƛrodkowej"] # 0xf72e - - "ïŁ„": [t: "przedƂuĆŒenie znaku pierwiastka"] # 0xf8e5 - - "ïŁŠ": [t: "pionowy strzaƂka przedƂuĆŒenie"] # 0xf8e6 - - "ïŁ§": [t: "poziomy strzaƂka przedƂuĆŒenie"] # 0xf8e7 - - "ïŁš": [t: "bezszeryfowy znak zastrzeĆŒony"] # 0xf8e8 - - "ïŁ©": [t: "znak praw autorskich znak bezszeryfowe"] # 0xf8e9 - - "ïŁȘ": [t: "bezszeryfowy znak towarowy"] # 0xf8ea - - "ïŁ«": [t: "lewy nawias gĂłrny"] # 0xf8eb - - "ïŁŹ": [t: "lewy nawias przedƂuĆŒenie"] # 0xf8ec - - "ïŁ­": [t: "lewy nawias dolny"] # 0xf8ed - - "ïŁź": [t: "lewy nawias kwadratowy gĂłrny"] # 0xf8ee - - "ïŁŻ": [t: "lewy nawias kwadratowy przedƂuĆŒenie"] # 0xf8ef - - "ïŁ°": [t: "lewy nawias kwadratowy dolny"] # 0xf8f0 - - "ïŁ±": [t: "lewy nawias klamrowy gĂłrny"] # 0xf8f1 - - "ïŁČ": [t: "lewy nawias klamrowy ƛrodkowy"] # 0xf8f2 - - "ïŁł": [t: "lewy nawias klamrowy dolny"] # 0xf8f3 - - "ïŁŽ": [t: "nawias klamrowy przedƂuĆŒenie"] # 0xf8f4 - - "ïŁ”": [t: "caƂka przedƂuĆŒenie"] # 0xf8f5 - - "ïŁ¶": [t: "prawy nawias gĂłrny"] # 0xf8f6 - - "ïŁ·": [t: "prawy nawias przedƂuĆŒenie"] # 0xf8f7 - - "ïŁž": [t: "prawy nawias dolny"] # 0xf8f8 - - "ïŁč": [t: "prawy nawias kwadratowy gĂłrny"] # 0xf8f9 - - "ïŁș": [t: "prawy nawias kwadratowy przedƂuĆŒenie"] # 0xf8fa - - "ïŁ»": [t: "prawy nawias kwadratowy dolny"] # 0xf8fb - - "ïŁŒ": [t: "prawy nawias klamrowy gĂłrny"] # 0xf8fc - - "ïŁœ": [t: "prawy nawias klamrowy ƛrodkowy"] # 0xf8fd - - "ïŁŸ": [t: "prawy nawias klamrowy dolny"] # 0xf8fe - - "ïŁż": [t: "logo jabƂka"] # 0xf8ff + - "": [T: "nieznany znak"] # 0xf700 + - "": [T: "dolny prawy i dolny lewy trĂłjkąt"] # 0xf726 + - "": [T: "poziome przedƂuĆŒenie wielokropka"] # 0xf72d + - "ïœź": [T: "poziome przedƂuĆŒenie wielokropka w linii ƛrodkowej"] # 0xf72e + - "ïŁ„": [T: "przedƂuĆŒenie znaku pierwiastka"] # 0xf8e5 + - "ïŁŠ": [T: "pionowy strzaƂka przedƂuĆŒenie"] # 0xf8e6 + - "ïŁ§": [T: "poziomy strzaƂka przedƂuĆŒenie"] # 0xf8e7 + - "ïŁš": [T: "bezszeryfowy znak zastrzeĆŒony"] # 0xf8e8 + - "ïŁ©": [T: "znak praw autorskich znak bezszeryfowe"] # 0xf8e9 + - "ïŁȘ": [T: "bezszeryfowy znak towarowy"] # 0xf8ea + - "ïŁ«": [T: "lewy nawias gĂłrny"] # 0xf8eb + - "ïŁŹ": [T: "lewy nawias przedƂuĆŒenie"] # 0xf8ec + - "ïŁ­": [T: "lewy nawias dolny"] # 0xf8ed + - "ïŁź": [T: "lewy nawias kwadratowy gĂłrny"] # 0xf8ee + - "ïŁŻ": [T: "lewy nawias kwadratowy przedƂuĆŒenie"] # 0xf8ef + - "ïŁ°": [T: "lewy nawias kwadratowy dolny"] # 0xf8f0 + - "ïŁ±": [T: "lewy nawias klamrowy gĂłrny"] # 0xf8f1 + - "ïŁČ": [T: "lewy nawias klamrowy ƛrodkowy"] # 0xf8f2 + - "ïŁł": [T: "lewy nawias klamrowy dolny"] # 0xf8f3 + - "ïŁŽ": [T: "nawias klamrowy przedƂuĆŒenie"] # 0xf8f4 + - "ïŁ”": [T: "caƂka przedƂuĆŒenie"] # 0xf8f5 + - "ïŁ¶": [T: "prawy nawias gĂłrny"] # 0xf8f6 + - "ïŁ·": [T: "prawy nawias przedƂuĆŒenie"] # 0xf8f7 + - "ïŁž": [T: "prawy nawias dolny"] # 0xf8f8 + - "ïŁč": [T: "prawy nawias kwadratowy gĂłrny"] # 0xf8f9 + - "ïŁș": [T: "prawy nawias kwadratowy przedƂuĆŒenie"] # 0xf8fa + - "ïŁ»": [T: "prawy nawias kwadratowy dolny"] # 0xf8fb + - "ïŁŒ": [T: "prawy nawias klamrowy gĂłrny"] # 0xf8fc + - "ïŁœ": [T: "prawy nawias klamrowy ƛrodkowy"] # 0xf8fd + - "ïŁŸ": [T: "prawy nawias klamrowy dolny"] # 0xf8fe + - "ïŁż": [T: "logo jabƂka"] # 0xf8ff - "ïŹ€": [T: "ff"] # 0xfb00 - "ïŹ": [t: "fi"] # 0xfb01 - "ïŹ‚": [T: "fl"] # 0xfb02 @@ -3570,31 +3570,31 @@ - "ïŹ„": [T: "ffl"] # 0xfb04 - "ïŹ…": [T: "ft"] # 0xfb05 - "ïŹ†": [T: "st"] # 0xfb06 - - "ïŹ©": [t: "hebrajska litera alternatywny znak plus"] # 0xfb29 - - "ïž ": [t: "lewa poƂowa ligatury, ozdobnik"] # 0xfe20 - - "ïžĄ": [t: "prawa poƂowa ligatury, ozdobnik"] # 0xfe21 - - "ïžą": [t: "podwĂłjny tylda lewa poƂowa ozdobnik"] # 0xfe22 - - "ïžŁ": [t: "podwĂłjny tylda prawa poƂowa ozdobnik"] # 0xfe23 - - "": [t: "makron lewa poƂowa ozdobnik"] # 0xfe24 - - "ïž„": [t: "makron prawa poƂowa ozdobnik"] # 0xfe25 - - "": [t: "Ƃączący ozdobnik makronu"] # 0xfe26 - - "ïž”": [t: "przez nawias"] # 0xfe35 - - "ïž¶": [t: "pod nawias"] # 0xfe36 - - "ïž·": [t: "przez nawias klamrowy"] # 0xfe37 - - "ïžž": [t: "pod nawias klamrowy"] # 0xfe38 - - "ïžż": [t: "przez kąt nawias kwadratowy"] # 0xfe3f - - "ïč€": [t: "pod kąt nawias kwadratowy"] # 0xfe40 - - "ïčĄ": [t: "maƂy gwiazdka"] # 0xfe61 - - "ïčą": [t: "maƂy plus"] # 0xfe62 - - "ïčŁ": [t: "maƂy minus"] # 0xfe63 - - "ïč€": [t: "maƂy mniejsze niĆŒ"] # 0xfe64 - - "ïč„": [t: "maƂy większe niĆŒ"] # 0xfe65 - - "ïčŠ": [t: "maƂy rĂłwna się"] # 0xfe66 - - "": [t: "peƂnoszeroki znak plus"] # 0xff0b + - "ïŹ©": [T: "hebrajska litera alternatywny znak plus"] # 0xfb29 + - "ïž ": [T: "lewa poƂowa ligatury, ozdobnik"] # 0xfe20 + - "ïžĄ": [T: "prawa poƂowa ligatury, ozdobnik"] # 0xfe21 + - "ïžą": [T: "podwĂłjny tylda lewa poƂowa ozdobnik"] # 0xfe22 + - "ïžŁ": [T: "podwĂłjny tylda prawa poƂowa ozdobnik"] # 0xfe23 + - "": [T: "makron lewa poƂowa ozdobnik"] # 0xfe24 + - "ïž„": [T: "makron prawa poƂowa ozdobnik"] # 0xfe25 + - "": [T: "Ƃączący ozdobnik makronu"] # 0xfe26 + - "ïž”": [T: "przez nawias"] # 0xfe35 + - "ïž¶": [T: "pod nawias"] # 0xfe36 + - "ïž·": [T: "przez nawias klamrowy"] # 0xfe37 + - "ïžž": [T: "pod nawias klamrowy"] # 0xfe38 + - "ïžż": [T: "przez kąt nawias kwadratowy"] # 0xfe3f + - "ïč€": [T: "pod kąt nawias kwadratowy"] # 0xfe40 + - "ïčĄ": [T: "maƂy gwiazdka"] # 0xfe61 + - "ïčą": [T: "maƂy plus"] # 0xfe62 + - "ïčŁ": [T: "maƂy minus"] # 0xfe63 + - "ïč€": [T: "maƂy mniejsze niĆŒ"] # 0xfe64 + - "ïč„": [T: "maƂy większe niĆŒ"] # 0xfe65 + - "ïčŠ": [T: "maƂy rĂłwna się"] # 0xfe66 + - "": [T: "peƂnoszeroki znak plus"] # 0xff0b - "": [T: "mniejsze niĆŒ"] # 0xff1c - "": [T: "rĂłwna się"] # 0xff1d - "": [T: "większe niĆŒ"] # 0xff1e - - "": [t: "ukoƛnik odwrotny"] # 0xff3c + - "": [T: "ukoƛnik odwrotny"] # 0xff3c - "": [T: "daszek"] # 0xff3e - "": # 0xff5c # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' @@ -3616,21 +3616,21 @@ - else: [T: "dzieli"] - "": [T: "tylda"] # 0xff5e - "ïżą": [T: "nie"] # 0xffe2 - - "ïż©": [t: "strzaƂka w lewo"] # 0xffe9 - - "ïżȘ": [t: "strzaƂka w gĂłrę"] # 0xffea - - "ïż«": [t: "strzaƂka w prawo"] # 0xffeb - - "ïżŹ": [t: "strzaƂka w dóƂ"] # 0xffec - - "ïżŒ": [t: "nieznany lub brakujący obiekt"] # 0xfffc - - "ïżœ": [t: "nieznany lub brakujący znak"] # 0xfffd + - "ïż©": [T: "strzaƂka w lewo"] # 0xffe9 + - "ïżȘ": [T: "strzaƂka w gĂłrę"] # 0xffea + - "ïż«": [T: "strzaƂka w prawo"] # 0xffeb + - "ïżŹ": [T: "strzaƂka w dóƂ"] # 0xffec + - "ïżŒ": [T: "nieznany lub brakujący obiekt"] # 0xfffc + - "ïżœ": [T: "nieznany lub brakujący znak"] # 0xfffd - - "🣑": [t: "jest w rĂłwnowadze z"] # 0x1F8D1 - - "🣒": [t: "jest w rĂłwnowadze przesuniętej w prawo z"] # 0x1F8D2 - - "🣓": [t: "jest w rĂłwnowadze przesuniętej w lewo z"] # 0x1F8D3 + - "🣑": [T: "jest w rĂłwnowadze z"] # 0x1F8D1 + - "🣒": [T: "jest w rĂłwnowadze przesuniętej w prawo z"] # 0x1F8D2 + - "🣓": [T: "jest w rĂłwnowadze przesuniętej w lewo z"] # 0x1F8D3 # MathJax v4 has adopted these PUA values for some partial chem bonds that aren't in Unicode - - "\uE410": [t: "wiązanie cząstkowe"] # 0xe410 - - "\uE411": [t: "podwĂłjne wiązanie cząstkowe"] # 0xe411 - - "\uE412": [t: "potrĂłjne wiązanie cząstkowe"] # 0xe412 + - "\uE410": [T: "wiązanie cząstkowe"] # 0xe410 + - "\uE411": [T: "podwĂłjne wiązanie cząstkowe"] # 0xe411 + - "\uE412": [T: "potrĂłjne wiązanie cząstkowe"] # 0xe412 # MathJax v4 also adopted these PUA values for some arrows thar are in Unicode # Hopefully these will be exported properly in future versions of MathJax diff --git a/Rules/Languages/pl/unicode.yaml b/Rules/Languages/pl/unicode.yaml index bd3ee353a..c67b5cc8a 100644 --- a/Rules/Languages/pl/unicode.yaml +++ b/Rules/Languages/pl/unicode.yaml @@ -5,12 +5,12 @@ - "a": - test: if: "$TTS='none'" - then: [t: "a"] # long "a" sound in all speech engines I tested (espeak, MS SAPI, eloquence, + then: [T: "a"] # long "a" sound in all speech engines I tested (espeak, MS SAPI, eloquence, else: [spell: "'a'"] # AWS Polly, ReadSpeaker, NaturalReader, google cloud, nuance, ibm watson) - "b-z": - test: if: "$TTS='none'" - then: [t: "."] + then: [T: "."] else: [spell: "'.'"] # Capital letters are a little tricky: users can pick their favorite word (something that was requested) and @@ -30,14 +30,14 @@ if: "$SpeechOverrides_CapitalLetters = ''" then_test: if: "$Impairment = 'Blindness'" - then: [t: "wielka"] + then: [T: "wielka"] else: [x: "$SpeechOverrides_CapitalLetters"] - pitch: value: "$CapitalLetters_Pitch" replace: - test: if: "$TTS='none'" - then: [t: "a"] + then: [T: "a"] else: [spell: "'a'"] - "B-Z": @@ -53,7 +53,7 @@ if: "$SpeechOverrides_CapitalLetters = ''" then_test: if: "$Impairment = 'Blindness'" - then: [t: "wielka"] + then: [T: "wielka"] else: [x: "$SpeechOverrides_CapitalLetters"] - pitch: value: "$CapitalLetters_Pitch" @@ -73,12 +73,12 @@ else: [T: "wykrzyknik"] # 0x21 else: [T: "silnia"] # 0x21 - - "\"": [t: "cudzysƂów"] # 0x22 - - "#": [t: "numer"] # 0x23 - - "$": [t: "dolary"] # 0x24 + - "\"": [T: "cudzysƂów"] # 0x22 + - "#": [T: "numer"] # 0x23 + - "$": [T: "dolary"] # 0x24 - "%": [T: "procent"] # 0x25 - - "&": [t: "znak et"] # 0x26 - - "'": [t: "apostrof"] # 0x27 + - "&": [T: "znak et"] # 0x26 + - "'": [T: "apostrof"] # 0x27 - "(": # 0x28 - test: if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' @@ -105,7 +105,7 @@ then: [T: "gwiazdkowa"] # 0x2a (norma 'gwiazdkowa' - * jako indeks normy) else_test: if: "parent::*[name(.)='msup' or name(.)='msubsup' or name(.)='skip-super']" - then: [t: "gwiazda"] # 0x2a + then: [T: "gwiazda"] # 0x2a else: [T: "razy"] # 0x2a - "+": [T: "plus"] # 0x2b - ",": # 0x2c @@ -157,7 +157,7 @@ then: [T: "jest"] - T: "większe niĆŒ" - "?": [T: "znak zapytania"] # 0x3f - - "@": [t: "maƂpa"] # 0x40 + - "@": [T: "maƂpa"] # 0x40 - "[": # 0x5b - test: if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' @@ -173,9 +173,9 @@ - test: if: "parent::m:modified-variable or parent::m:mover" then: [T: "daszek"] - else: [t: "daszek"] - - "_": [t: "pod kreska"] # 0x5f - - "`": [t: "grawis"] # 0x60 + else: [T: "daszek"] + - "_": [T: "pod kreska"] # 0x5f + - "`": [T: "grawis"] # 0x60 - "{": # 0x7b - test: if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' @@ -226,7 +226,7 @@ then: [T: "stopni"] else: [T: "stopieƄ"] - "±": [T: "plus minus"] # 0xb1 - - "ÂŽ": [t: "akut"] # 0xb4 + - "ÂŽ": [T: "akut"] # 0xb4 - "·": # 0xB7 - test: if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')] or not($SpeechStyle = 'ClearSpeak' and $ClearSpeak_MultSymbolDot = 'Auto')" @@ -240,21 +240,21 @@ then: [T: "razy"] - else_if: "$ClearSpeak_MultSymbolX = 'By'" then: [T: "na"] - else: [t: "krzyĆŒ"] + else: [T: "krzyĆŒ"] else_test: if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [t: "krzyĆŒ"] + then: [T: "krzyĆŒ"] else: [T: "razy"] - "Ă·": [T: "podzielone przez"] # 0xf7 - - "̀": [t: "ozdobnik akcentu grawis"] # 0x300 - - "́": [t: "ozdobnik akcentu ostrego"] # 0x301 - - "̂": [t: "ozdobnik daszka"] # 0x302 - - "̃": [t: "ozdobnik tyldy"] # 0x303 - - "̄": [t: "ozdobnik makronu"] # 0x304 - - "̅": [t: "ozdobnik kreski gĂłrnej"] # 0x305 - - "̆": [t: "znak krĂłtkoƛci"] # 0x306 - - "̇": [t: "ozdobnik kropki nad"] # 0x307 + - "̀": [T: "ozdobnik akcentu grawis"] # 0x300 + - "́": [T: "ozdobnik akcentu ostrego"] # 0x301 + - "̂": [T: "ozdobnik daszka"] # 0x302 + - "̃": [T: "ozdobnik tyldy"] # 0x303 + - "̄": [T: "ozdobnik makronu"] # 0x304 + - "̅": [T: "ozdobnik kreski gĂłrnej"] # 0x305 + - "̆": [T: "znak krĂłtkoƛci"] # 0x306 + - "̇": [T: "ozdobnik kropki nad"] # 0x307 # Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong - "Α-Ω": @@ -270,47 +270,47 @@ if: "$SpeechOverrides_CapitalLetters = ''" then_test: if: "$Impairment = 'Blindness'" - then: [t: "wielka"] + then: [T: "wielka"] else: [x: "$SpeechOverrides_CapitalLetters"] - pitch: value: "$CapitalLetters_Pitch" # note: processing of ranges converts '.' into the character, so it needs to be in quotes below replace: [spell: "translate('.', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')"] - - "α": [t: "alfa"] # 0x3b1 + - "α": [T: "alfa"] # 0x3b1 - "ÎČ": [t: "beta"] # 0x3b2 - "Îł": [t: "gamma"] # 0x3b3 - "ÎŽ": [t: "delta"] # 0x3b4 - "Δ": [t: "epsilon"] # 0x3b5 - - "ζ": [t: "dzeta"] # 0x3b6 + - "ζ": [T: "dzeta"] # 0x3b6 - "η": [t: "eta"] # 0x3b7 - "Ξ": [t: "theta"] # 0x3b8 - - "Îč": [t: "jota"] # 0x3b9 + - "Îč": [T: "jota"] # 0x3b9 - "Îș": [t: "kappa"] # 0x3ba - "λ": [t: "lambda"] # 0x3bb - - "ÎŒ": [t: "mi"] # 0x3bc - - "Μ": [t: "ni"] # 0x3bd - - "Ο": [t: "ksi"] # 0x3be - - "Îż": [t: "omikron"] # 0x3bf + - "ÎŒ": [T: "mi"] # 0x3bc + - "Μ": [T: "ni"] # 0x3bd + - "Ο": [T: "ksi"] # 0x3be + - "Îż": [T: "omikron"] # 0x3bf - "π": [t: "pi"] # 0x3c0 - - "ρ": [t: "ro"] # 0x3c1 - - "ς": [t: "sigma koƄcowa"] # 0x3c2 + - "ρ": [T: "ro"] # 0x3c1 + - "ς": [T: "sigma koƄcowa"] # 0x3c2 - "σ": [t: "sigma"] # 0x3c3 - "τ": [t: "tau"] # 0x3c4 - - "υ": [t: "ypsilon"] # 0x3c5 - - "φ": [t: "fi"] # 0x3c6 + - "υ": [T: "ypsilon"] # 0x3c5 + - "φ": [T: "fi"] # 0x3c6 - "χ": [t: "chi"] # 0x3c7 - "ψ": [t: "psi"] # 0x3c8 - "ω": [t: "omega"] # 0x3c9 - - "ϕ": [t: "fi"] # 0x3d5 + - "ϕ": [T: "fi"] # 0x3d5 - "ϖ": [t: "pi"] # 0x3d6 - "Ï”": [t: "epsilon"] # 0x3f5 - - "϶": [t: "odwrĂłcony epsilon"] # 0x3f6 + - "϶": [T: "odwrĂłcony epsilon"] # 0x3f6 - - "–": [t: "póƂpauza"] # 0x2013 - - "—": [t: "pauza"] # 0x2014 - - "―": [t: "kreska pozioma"] # 0x2015 - - "‖": [t: "podwĂłjna pionowa kreska"] # 0x2016 + - "–": [T: "póƂpauza"] # 0x2013 + - "—": [T: "pauza"] # 0x2014 + - "―": [T: "kreska pozioma"] # 0x2015 + - "‖": [T: "podwĂłjna pionowa kreska"] # 0x2016 - "
": # 0x2026 test: if: @@ -318,11 +318,11 @@ # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' # speak '
' as 'and so on...' unless expr starts with '
' - "../*[1][.='
']" - then: [t: "trzy kropki"] + then: [T: "trzy kropki"] else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' if: "count(following-sibling::*) = 0" - then: [t: "i tak dalej"] - else: [t: "i tak dalej aĆŒ do"] + then: [T: "i tak dalej"] + else: [T: "i tak dalej aĆŒ do"] - "⁥": # 0x2061 - test: @@ -340,55 +340,55 @@ - "⁹": [T: ""] # 0x2062 - "⁣": [T: ""] # 0x2063 - "⁀": [T: "i"] # 0x2064 - - "â€Č": [t: "prim"] # 0x2032 - - "″": [t: "podwĂłjny prim"] # 0x2033 - - "‮": [t: "potrĂłjny prim"] # 0x2034 + - "â€Č": [T: "prim"] # 0x2032 + - "″": [T: "podwĂłjny prim"] # 0x2033 + - "‮": [T: "potrĂłjny prim"] # 0x2034 - "ℂℕℚℝ℀": # here we rely on this running through the table again to speak "cap xxx" - - t: "dwukreskowe" + - T: "dwukreskowe" - spell: "translate('.', 'ℂℕℚℝ℀', 'CNQRZ')" - - "℃": [t: "stopnie Celsjusza"] # 0x2103 - - "℉": [t: "stopnie Fahrenheita"] # 0x2109 + - "℃": [T: "stopnie Celsjusza"] # 0x2103 + - "℉": [T: "stopnie Fahrenheita"] # 0x2109 - "ℋℛℓ": # 0x210b - - t: "pisane" + - T: "pisane" - spell: "translate('.', 'ℋℛℓ', 'HRl')" - - "ℎ": [t: "staƂa Plancka"] # 0x210e + - "ℎ": [T: "staƂa Plancka"] # 0x210e - "ℜ": # 0x211c - - t: "fraktura" + - T: "fraktura" - spell: "'R'" - - "℩": [t: "omy"] # 0x2126 - - "â„Ș": [t: "kelwin"] # 0x212a - - "Å": [t: "angstremy"] # 0x212b + - "℩": [T: "omy"] # 0x2126 + - "â„Ș": [T: "kelwin"] # 0x212a + - "Å": [T: "angstremy"] # 0x212b - "ⅆⅇⅈⅉ": # 0x2146-9 - - t: "dwukreskowa kursywa" + - T: "dwukreskowa kursywa" - spell: "translate('.', 'ⅆⅇⅈⅉ', 'deij')" - - "←": [t: "strzaƂka w lewo"] # 0x2190 - - "↑": [t: "strzaƂka w gĂłrę"] # 0x2191 + - "←": [T: "strzaƂka w lewo"] # 0x2190 + - "↑": [T: "strzaƂka w gĂłrę"] # 0x2191 - "→": # 0x2192 - test: if: "ancestor::*[2][self::m:limit or self::m:limit-sup or self::m:limit-inf]" - then: [t: "dÄ…ĆŒy do"] + then: [T: "dÄ…ĆŒy do"] else_test: if: "parent::*[self::m:mrow]/parent::*[self::m:subscripted-norm]" - then: [t: "do"] # indeks normy operatorowej ‖·‖_{p→q}: → czyta sie "do" - else: [t: "strzaƂka w prawo"] + then: [T: "do"] # indeks normy operatorowej ‖·‖_{p→q}: → czyta sie "do" + else: [T: "strzaƂka w prawo"] - - "↓": [t: "strzaƂka w dóƂ"] # 0x2193 + - "↓": [T: "strzaƂka w dóƂ"] # 0x2193 - "⇒": [T: "implikuje"] # 0x21d2 - - "∀": [t: "dla kaĆŒdego"] # 0x2200 + - "∀": [T: "dla kaĆŒdego"] # 0x2200 - "∂": # 0x2202 - test: if: "$Verbosity='Terse'" - then: [t: "cząstkowe"] - else: [t: "pochodna cząstkowa"] - - "∃": [t: "istnieje"] # 0x2203 - - "∄": [t: "nie istnieje"] # 0x2204 + then: [T: "cząstkowe"] + else: [T: "pochodna cząstkowa"] + - "∃": [T: "istnieje"] # 0x2203 + - "∄": [T: "nie istnieje"] # 0x2204 - "∅": [T: "zbiĂłr pusty"] # 0x2205 - "∆": # 0x2206 - - t: "laplasjan" + - T: "laplasjan" - "∈": # 0x2208 - test: if: "$SpeechStyle != 'ClearSpeak'" @@ -396,7 +396,7 @@ - test: if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" then: [T: "jest"] - - t: "elementem zbioru" + - T: "elementem zbioru" # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option else_test: if: "../../self::m:set or ../../../self::m:set" # inside a set @@ -404,43 +404,43 @@ - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' then: [T: "do"] - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "element zbioru"] + then: [T: "element zbioru"] - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "naleĆŒy do"] - - else: [t: "naleĆŒÄ…ce do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + then: [T: "naleĆŒy do"] + - else: [T: "naleĆŒÄ…ce do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' else_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "jest elementem zbioru"] + then: [T: "jest elementem zbioru"] - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "jest elementem zbioru"] + then: [T: "jest elementem zbioru"] - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "naleĆŒy do"] - - else: [t: "naleĆŒy do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + then: [T: "naleĆŒy do"] + - else: [T: "naleĆŒy do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' - "∉": # 0x2209 # rule is identical to 0x2208 - test: if: "$SpeechStyle != 'ClearSpeak'" then: - - t: "nie jest elementem zbioru" + - T: "nie jest elementem zbioru" # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option else_test: if: "../../self::m:set or ../../../self::m:set" # inside a set then_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "nie naleĆŒy do"] + then: [T: "nie naleĆŒy do"] - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "nie jest elementem zbioru"] + then: [T: "nie jest elementem zbioru"] - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "nie jest elementem zbioru"] - - else: [t: "nienaleĆŒÄ…ce do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + then: [T: "nie jest elementem zbioru"] + - else: [T: "nienaleĆŒÄ…ce do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' else_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "nie jest elementem zbioru"] + then: [T: "nie jest elementem zbioru"] - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "nie jest elementem zbioru"] + then: [T: "nie jest elementem zbioru"] - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "nie naleĆŒy do"] - - else: [t: "nie naleĆŒy do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + then: [T: "nie naleĆŒy do"] + - else: [T: "nie naleĆŒy do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' - "∊": # 0x220a - test: if: "$SpeechStyle != 'ClearSpeak'" @@ -448,7 +448,7 @@ - test: if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" then: [T: "jest"] - - t: "element zbioru" + - T: "element zbioru" # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option else_test: if: "../../self::m:set or ../../../self::m:set" # inside a set @@ -456,20 +456,20 @@ - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' then: [T: "do"] - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "element zbioru"] + then: [T: "element zbioru"] - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "naleĆŒy do"] - - else: [t: "naleĆŒÄ…ce do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + then: [T: "naleĆŒy do"] + - else: [T: "naleĆŒÄ…ce do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' else_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "jest elementem zbioru"] + then: [T: "jest elementem zbioru"] - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "jest elementem zbioru"] + then: [T: "jest elementem zbioru"] - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "naleĆŒy do"] - - else: [t: "naleĆŒy do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + then: [T: "naleĆŒy do"] + - else: [T: "naleĆŒy do"] # $ClearSpeak_SetMemberSymbol = 'Belongs' - "∏": [T: "iloczyn"] # 0x220f - - "∐": [t: "koprodukt"] # 0x2210 + - "∐": [T: "koprodukt"] # 0x2210 - "∑": [T: "suma"] # 0x2211 - "−": [T: "minus"] # 0x2212 - "∓": [T: "minus plus"] # 0x2213 @@ -481,60 +481,60 @@ - "parent::*[name(.)='msubsup' and *[1][self::m:mo and .='∄']] and count(preceding-sibling::*)=1" then: [T: "gwiazdkowa"] # norma ‖·‖_* -> "norma gwiazdkowa" else: [T: "razy"] # 0x2217 - - "∘": [t: "zƂoĆŒone z"] # 0x2218 + - "∘": [T: "zƂoĆŒone z"] # 0x2218 - "√": # 0x221a - - t: "pierwiastek kwadratowy z" + - T: "pierwiastek kwadratowy z" - "∝": # 0x221d - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "proporcjonalne do" + - T: "proporcjonalne do" - "∞": - test: if: "ancestor::*[self::m:limit or self::m:limit-sup or self::m:limit-inf or self::m:large-op] or parent::*[self::m:subscripted-norm] or parent::*[self::m:mrow]/parent::*[self::m:subscripted-norm]" then: [T: "nieskoƄczonoƛci"] else: [T: "nieskoƄczonoƛć"] # 0x221e - - "∟": [t: "kąt prosty"] # 0x221f - - "∠": [t: "kąt"] # 0x2220 - - "∥": [t: "kąt mierzony"] # 0x2221 + - "∟": [T: "kąt prosty"] # 0x221f + - "∠": [T: "kąt"] # 0x2220 + - "∥": [T: "kąt mierzony"] # 0x2221 - "∣": [T: "dzieli"] # 0x2223 - - "∀": [t: "nie dzieli"] # 0x2224 + - "∀": [T: "nie dzieli"] # 0x2224 - "∄": # 0x2225 - test: if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [t: "podwĂłjna pionowa kreska"] + then: [T: "podwĂłjna pionowa kreska"] else: - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "rĂłwnolegƂe do" + - T: "rĂłwnolegƂe do" - "∊": # 0x2226 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "nierĂłwnolegƂe do" + - T: "nierĂłwnolegƂe do" - "∧": [T: "i"] # 0x2227 - "√": [T: "lub"] # 0x2228 - "∩": [T: "przecięcie"] # 0x2229 - "âˆȘ": [T: "suma zbiorĂłw"] # 0x222a - "∫": [T: "caƂka"] # 0x222b - - "∏": [t: "caƂka podwĂłjna"] # 0x222c - - "∭": [t: "caƂka potrĂłjna"] # 0x222d - - "∟": [t: "caƂka krzywoliniowa"] # 0x222e + - "∏": [T: "caƂka podwĂłjna"] # 0x222c + - "∭": [T: "caƂka potrĂłjna"] # 0x222d + - "∟": [T: "caƂka krzywoliniowa"] # 0x222e - "∶": # 0x2236 - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - T: "do" - - "∷": [t: "jako"] # 0x2237 - - "∌": [t: "tylda"] # 0x223c - - "∜": [t: "odwrĂłcona tylda"] # 0x223d + - "∷": [T: "jako"] # 0x2237 + - "∌": [T: "tylda"] # 0x223c + - "∜": [T: "odwrĂłcona tylda"] # 0x223d - "∟": # 0x223e - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "most dodatnie" - - "∿": [t: "fala sinusoidalna"] # 0x223f + - T: "most dodatnie" + - "∿": [T: "fala sinusoidalna"] # 0x223f - "≠": # 0x2260 - test: if: "$Verbosity!='Terse'" @@ -544,7 +544,7 @@ - test: if: "$Verbosity!='Terse'" then: [T: "jest"] - - t: "identyczne z" + - T: "identyczne z" - "≀": # 0x2264 - test: if: "$Verbosity!='Terse'" @@ -555,31 +555,31 @@ if: "$Verbosity!='Terse'" then: [T: "jest"] - T: "większe lub rĂłwne" - - "≩": [t: "mniejsze nad rĂłwne"] # 0x2266 - - "≧": [t: "większe nad rĂłwne"] # 0x2267 - - "â‰ș": [t: "poprzedza"] # 0x227a - - "≻": [t: "następuje po"] # 0x227b + - "≩": [T: "mniejsze nad rĂłwne"] # 0x2266 + - "≧": [T: "większe nad rĂłwne"] # 0x2267 + - "â‰ș": [T: "poprzedza"] # 0x227a + - "≻": [T: "następuje po"] # 0x227b - "⊂": # 0x2282 - test: if: "$Verbosity!='Terse'" - then: [t: "jest"] - - t: "podzbiorem" + then: [T: "jest"] + - T: "podzbiorem" - "⊃": # 0x2283 - test: if: "$Verbosity!='Terse'" - then: [t: "jest"] - - t: "nadzbiorem" + then: [T: "jest"] + - T: "nadzbiorem" - "⊄": # 0x2284 - - t: "nie jest podzbiorem" + - T: "nie jest podzbiorem" - "⊅": # 0x2285 - - t: "nie jest nadzbiorem" + - T: "nie jest nadzbiorem" - "⊆": # 0x2286 - test: if: "$Verbosity!='Terse'" - then: [t: "jest"] - - t: "podzbiorem lub rĂłwnym" + then: [T: "jest"] + - T: "podzbiorem lub rĂłwnym" - "⊇": # 0x2287 - test: if: "$Verbosity!='Terse'" - then: [t: "jest"] - - t: "nadzbiorem lub rĂłwnym" + then: [T: "jest"] + - T: "nadzbiorem lub rĂłwnym" diff --git a/tests/Languages/pl.rs b/tests/Languages/pl.rs index 44016ff5b..c9423ea9f 100644 --- a/tests/Languages/pl.rs +++ b/tests/Languages/pl.rs @@ -2,6 +2,8 @@ // Existing hand-written Polish tests (norms, degrees, relations, etc.) mod pl; +mod number_sets; +mod unit_plurals; // Tests mirrored from the English suite, with expected speech localized to Polish. mod ClearSpeak { diff --git a/tests/Languages/pl/ClearSpeak/mfrac.rs b/tests/Languages/pl/ClearSpeak/mfrac.rs index f7197bcb2..a53bba559 100644 --- a/tests/Languages/pl/ClearSpeak/mfrac.rs +++ b/tests/Languages/pl/ClearSpeak/mfrac.rs @@ -86,7 +86,7 @@ fn frac_with_units() -> Result<()> { "; - test("pl", "ClearSpeak", expr, "62 milas na godzina")?; + test("pl", "ClearSpeak", expr, "62 mile na godzina")?; return Ok(()); } diff --git a/tests/Languages/pl/SimpleSpeak/mfrac.rs b/tests/Languages/pl/SimpleSpeak/mfrac.rs index 2e84dc987..a07f0592b 100644 --- a/tests/Languages/pl/SimpleSpeak/mfrac.rs +++ b/tests/Languages/pl/SimpleSpeak/mfrac.rs @@ -164,7 +164,7 @@ fn frac_with_units() -> Result<()> { "; - test("pl", "SimpleSpeak", expr, "62 milas na godzina")?; + test("pl", "SimpleSpeak", expr, "62 mile na godzina")?; return Ok(()); } @@ -198,7 +198,7 @@ fn number_in_numerator_with_units() -> Result<()> { mi "; - test("pl", "SimpleSpeak", expr, "3 galons na mila")?; + test("pl", "SimpleSpeak", expr, "3 galony na mila")?; return Ok(()); } @@ -212,7 +212,7 @@ fn units_with_powers() -> Result<()> { s2 "; - test("pl", "SimpleSpeak", expr, "3 metrs na sekunda do kwadratu")?; + test("pl", "SimpleSpeak", expr, "3 metry na sekunda do kwadratu")?; return Ok(()); } diff --git a/tests/Languages/pl/number_sets.rs b/tests/Languages/pl/number_sets.rs new file mode 100644 index 000000000..6d672447b --- /dev/null +++ b/tests/Languages/pl/number_sets.rs @@ -0,0 +1,69 @@ +/// Number sets: ℂ ℕ ℚ ℝ â„€, on their own and with a dimension (ℝ³). +/// +/// These rules had no Polish test at all, which is how the earlier defects in +/// this file were able to sit unnoticed: a rule with no test in a given +/// language is not "known good", it is "never looked at". +use crate::common::*; +use anyhow::Result; + +/// A bare number set is spoken as a full Polish phrase. +#[test] +fn simple_number_sets() -> Result<()> { + let expr = r#" + ℂ, + ℕ, + ℚ, + ℝ, + ℤ + "#; + test("pl", "SimpleSpeak", expr, "liczby zespolone przecinek, liczby naturalne przecinek, liczby wymierne przecinek, liczby rzeczywiste, przecinek, liczby caƂkowite")?; + Ok(()) +} + +/// With a dimension the letter itself is spoken, as in every language except +/// Hungarian: "R 3", not "liczby rzeczywiste 3". +#[test] +fn dimension_number_sets() -> Result<()> { + let expr = r#" + ℝ3, + ℂ2, + ℕ4 + "#; + test("pl", "SimpleSpeak", expr, "R 3 przecinek, C 2 przecinek, N 4")?; + Ok(()) +} + +/// A non-numeric exponent is not a dimension, so the full phrase comes back. +/// This is the negative control for the rule above: it fires on `count(*)=2` +/// with a digit, and must not swallow every superscript. +#[test] +fn number_set_with_variable_exponent() -> Result<()> { + let expr = r#" + ℤn + "#; + test("pl", "SimpleSpeak", expr, "liczby caƂkowite do potęgi n")?; + Ok(()) +} + +/// Positive and negative variants (ℝâș, ℀⁻) are a separate rule again. +#[test] +fn pos_neg_number_sets() -> Result<()> { + let expr = r#" + ℝ+, + ℤ- + "#; + test("pl", "SimpleSpeak", expr, "plus liczby rzeczywiste, przecinek; minus liczby caƂkowite")?; + Ok(()) +} + +/// ClearSpeak must agree with SimpleSpeak here - the rules live in +/// SharedRules, so a divergence would mean one of them stopped matching. +#[test] +fn number_sets_clearspeak_matches() -> Result<()> { + let expr = r#" + ℝ, + ℝ3 + "#; + test("pl", "ClearSpeak", expr, "liczby rzeczywiste, przecinek, R 3")?; + Ok(()) +} diff --git a/tests/Languages/pl/unit_plurals.rs b/tests/Languages/pl/unit_plurals.rs new file mode 100644 index 000000000..a3a6ec5b8 --- /dev/null +++ b/tests/Languages/pl/unit_plurals.rs @@ -0,0 +1,86 @@ +/// Polish unit plurals: the noun form follows the numeral, not just "is it one". +/// 1 metr | 2, 3, 4 metry (nominative plural) | 5+ metrĂłw (genitive plural) +/// The teens are the exception that breaks the naive rule: 12, 13, 14 metrĂłw. +use crate::common::*; +use anyhow::Result; + +/// The three numeral classes on a single unit, including the teens exception. +#[test] +fn unit_plural_numeral_classes() -> Result<()> { + let expr = r#" + 1m,2m, + 3m,4m, + 5m,11m, + 12m,13m, + 14m,22m, + 101m,102m, + 112m + "#; + test("pl", "SimpleSpeak", expr, "1 metr, przecinek; 2 metry, przecinek; 3 metry, przecinek; 4 metry, przecinek; 5 metrĂłw, przecinek; 11 metrĂłw, przecinek; 12 metrĂłw, przecinek; 13 metrĂłw, przecinek; 14 metrĂłw, przecinek; 22 metry, przecinek; 101 metrĂłw, przecinek; 102 metry, przecinek; 112 metrĂłw")?; + Ok(()) +} + +/// SI base units: previously all of these took the English "s". +#[test] +fn unit_plural_si_base() -> Result<()> { + let expr = r#" + 2g,5g, + 2s,5s, + 2A,5A, + 2K,5K, + 2mol,5mol, + 2cd,5cd + "#; + test("pl", "SimpleSpeak", expr, "2 gramy, przecinek; 5 gramĂłw, przecinek; 2 sekundy, przecinek; 5 sekund, przecinek; 2 ampery, przecinek; 5 amperĂłw, przecinek; 2 kelwiny, przecinek; 5 kelwinĂłw, przecinek; 2 mole, przecinek; 5 moli, przecinek; 2 kandele, przecinek; 5 kandeli")?; + Ok(()) +} + +/// With an SI prefix the unit goes through a different branch of the rule. +#[test] +fn unit_plural_with_prefix() -> Result<()> { + let expr = r#" + 2km,5km, + 2mg,5mg, + 2daA,5daA + "#; + test("pl", "SimpleSpeak", expr, "2 kilo-metry, przecinek; 5 kilo-metrĂłw, przecinek; 2 mili-gramy, przecinek; 5 mili-gramĂłw, przecinek; 2 deka-ampery, przecinek; 5 deka-amperĂłw")?; + Ok(()) +} + +/// Irregular nouns: the plural cannot be derived from the ending. +#[test] +fn unit_plural_irregular() -> Result<()> { + let expr = r#" + 2d,5d, + 2w,5w, + 2yr,5yr, + 2ft,5ft + "#; + test("pl", "SimpleSpeak", expr, "2 dni, przecinek, 5 dni, przecinek; 2 tygodnie, przecinek; 5 tygodni, przecinek; 2 lata, przecinek, 5 lat, przecinek; 2 stopy, przecinek; 5 stĂłp")?; + Ok(()) +} + +/// Units whose base form was itself wrong (plural used as singular). +#[test] +fn unit_singular_forms_fixed() -> Result<()> { + let expr = r#" + 1Hz,2Hz, + 5Hz, + 1hp,2hp, + 1℧ + "#; + test("pl", "SimpleSpeak", expr, "1 herc, przecinek; 2 herce, przecinek; 5 hercĂłw, przecinek; 1 koƄ mechaniczny, przecinek; 2 konie mechaniczne, przecinek, 1 mho")?; + Ok(()) +} + +/// Multi-word units inflect the head noun and keep the dependent word's case. +#[test] +fn unit_plural_multiword() -> Result<()> { + let expr = r#" + 2ly,5ly, + 2au,5au, + 2arcmin,5arcmin + "#; + test("pl", "SimpleSpeak", expr, "2 lata ƛwietlne, przecinek; 5 lat ƛwietlnych, przecinek; 2 jednostki astronomiczne, przecinek; 5 jednostek astronomicznych; przecinek; 2 minuty Ƃuku, przecinek; 5 minut Ƃuku")?; + Ok(()) +} diff --git a/tests/Languages/pl/units.rs b/tests/Languages/pl/units.rs index 1676cf8ae..591e2eaff 100644 --- a/tests/Languages/pl/units.rs +++ b/tests/Languages/pl/units.rs @@ -40,7 +40,7 @@ fn prefix_sweep() -> Result<()> { qg "#; test("pl", "SimpleSpeak", expr, - "kwetta-grams, przecinek; ronna-grams, przecinek; jotta-grams, przecinek; zetta-grams, przecinek; eksa-grams, przecinek; peta-grams, przecinek; tera-grams, przecinek; giga-grams, przecinek; mega-grams, przecinek; kilo-grams, przecinek; hekto-grams, przecinek; deka-grams, przecinek; decy-grams, przecinek; centy-grams, przecinek; mili-grams, przecinek; mikro-grams, przecinek; nano-grams, przecinek; piko-grams, przecinek; femto-grams, przecinek; atto-grams, przecinek; zepto-grams, przecinek; jokto-grams, przecinek; ronto-grams, przecinek; kwekto-grams")?; + "kwetta-gramĂłw, przecinek; ronna-gramĂłw, przecinek; jotta-gramĂłw, przecinek; zetta-gramĂłw, przecinek; eksa-gramĂłw, przecinek; peta-gramĂłw, przecinek; tera-gramĂłw, przecinek; giga-gramĂłw, przecinek; mega-gramĂłw, przecinek; kilo-gramĂłw, przecinek; hekto-gramĂłw, przecinek; deka-gramĂłw, przecinek; decy-gramĂłw, przecinek; centy-gramĂłw, przecinek; mili-gramĂłw, przecinek; mikro-gramĂłw, przecinek; nano-gramĂłw, przecinek; piko-gramĂłw, przecinek; femto-gramĂłw, przecinek; atto-gramĂłw, przecinek; zepto-gramĂłw, przecinek; jokto-gramĂłw, przecinek; ronto-gramĂłw, przecinek; kwekto-gramĂłw")?; return Ok(()); } @@ -61,7 +61,7 @@ fn si_base() -> Result<()> { 1sec,2sec "#; test("pl", "SimpleSpeak", expr, - "1 amper, przecinek; 2 ampers, przecinek; 1 kandela, przecinek; 2 kandelas, przecinek; 1 kelwin, przecinek; 2 kelwins, przecinek; 1 kelwin, przecinek; 2 kelwins, przecinek; 1 gram, przecinek; 2 grams, przecinek; 1 metr, przecinek; 2 metrs, przecinek, 1 mol, przecinek; 2 mols, przecinek; 1 sekunda, przecinek; 2 sekundas, przecinek; 1 sekunda, przecinek; 2 sekundas, przecinek; 1 sekunda, przecinek; 2 sekundas, przecinek; 1 sekunda, przecinek; 2 sekundas")?; + "1 amper, przecinek; 2 ampery, przecinek; 1 kandela, przecinek; 2 kandele, przecinek; 1 kelwin, przecinek; 2 kelwiny, przecinek; 1 kelwin, przecinek; 2 kelwiny, przecinek; 1 gram, przecinek; 2 gramy, przecinek; 1 metr, przecinek; 2 metry, przecinek, 1 mol, przecinek; 2 mole, przecinek; 1 sekunda, przecinek; 2 sekundy, przecinek; 1 sekunda, przecinek; 2 sekundy, przecinek; 1 sekunda, przecinek; 2 sekundy, przecinek; 1 sekunda, przecinek; 2 sekundy")?; return Ok(()); } @@ -80,7 +80,7 @@ fn si_base_with_prefixes() -> Result<()> { 1nsec,2psec "#; test("pl", "SimpleSpeak", expr, - "1 kwetta-amper, przecinek; 2 ronna-ampers, przecinek; 1 jotta-kandela, przecinek; 2 zetta-kandelas; przecinek; 1 eksa-kelwin, przecinek; 2 peta-kelwins, przecinek; 1 tera-kelwin, przecinek; 2 giga-kelwins, przecinek; 1 mega-gram, przecinek; 2 kilo-grams, przecinek; 1 hekto-metr, przecinek; 2 deka-metrs, przecinek; 1 decy-mol, przecinek; 2 centy-mols, przecinek; 1 mili-sekunda, przecinek; 2 mikro-sekundas; przecinek; 1 nano-sekunda, przecinek; 2 piko-sekundas")?; + "1 kwetta-amper, przecinek; 2 ronna-ampery, przecinek; 1 jotta-kandela, przecinek; 2 zetta-kandele, przecinek; 1 eksa-kelwin, przecinek; 2 peta-kelwiny, przecinek; 1 tera-kelwin, przecinek; 2 giga-kelwiny, przecinek; 1 mega-gram, przecinek; 2 kilo-gramy, przecinek; 1 hekto-metr, przecinek; 2 deka-metry, przecinek; 1 decy-mol, przecinek; 2 centy-mole, przecinek; 1 mili-sekunda, przecinek; 2 mikro-sekundy, przecinek; 1 nano-sekunda, przecinek; 2 piko-sekundy")?; return Ok(()); } @@ -103,7 +103,7 @@ fn si_derived_1() -> Result<()> { 1lx,2lx "#; test("pl", "SimpleSpeak", expr, - "1 bekerel, przecinek; 2 bekerels, przecinek; 1 kulomb, przecinek; 2 kulombs, przecinek; 1 stopieƄ Celsjusza, przecinek; 2 stopnie Celsjusza, przecinek; 1 stopieƄ Celsjusza, przecinek; 2 stopnie Celsjusza, przecinek; 1 farad, przecinek; 2 farads, przecinek; 1 grej, przecinek; 2 grejs, przecinek; 1 henr, przecinek; 2 henry, przecinek; 1 herce, przecinek; 2 herces, przecinek; 1 dĆŒul, przecinek; 2 dĆŒuls, przecinek; 1 katal, przecinek; 2 katals, przecinek; 1 lumen, przecinek; 2 lumens, przecinek; 1 luks, przecinek; 2 luksy")?; + "1 bekerel, przecinek; 2 bekerele, przecinek; 1 kulomb, przecinek; 2 kulomby, przecinek; 1 stopieƄ Celsjusza, przecinek; 2 stopnie Celsjusza, przecinek; 1 stopieƄ Celsjusza, przecinek; 2 stopnie Celsjusza, przecinek; 1 farad, przecinek; 2 farady, przecinek; 1 grej, przecinek; 2 greje, przecinek; 1 henr, przecinek; 2 henry, przecinek; 1 herc, przecinek; 2 herce, przecinek; 1 dĆŒul, przecinek; 2 dĆŒule, przecinek; 1 katal, przecinek; 2 katale, przecinek; 1 lumen, przecinek; 2 lumeny, przecinek; 1 luks, przecinek; 2 luksy")?; return Ok(()); } @@ -125,7 +125,7 @@ fn si_derived_1_with_prefixes() -> Result<()> { 1p℃,2n℃ "#; test("pl", "SimpleSpeak", expr, - "1 kwetta-bekerel, przecinek; 2 ronna-bekerels; przecinek; 1 jotta-kulomb, przecinek; 2 zetta-kulombs; przecinek; 1 eksa-farad, przecinek; 2 peta-farads, przecinek; 1 tera-grej, przecinek; 2 giga-grejs, przecinek; 1 mega-henr, przecinek; 2 kilo-henry, przecinek; 1 deka-herce, przecinek; 2 decy-herces, przecinek; 1 centy-dĆŒul, przecinek; 2 mili-dĆŒuls, przecinek; 1 mikro-katal, przecinek; 2 nano-katals, przecinek; 1 piko-lumen, przecinek; 2 femto-lumens, przecinek; 1 atto-luks, przecinek; 2 zepto-luksy, przecinek; 1 mili-stopieƄ Celsjusza; przecinek; 2 mikro-stopnie Celsjusza; przecinek; 1 piko-stopieƄ Celsjusza; przecinek; 2 nano-stopnie Celsjusza")?; + "1 kwetta-bekerel, przecinek; 2 ronna-bekerele, przecinek; 1 jotta-kulomb, przecinek; 2 zetta-kulomby, przecinek; 1 eksa-farad, przecinek; 2 peta-farady, przecinek; 1 tera-grej, przecinek; 2 giga-greje, przecinek; 1 mega-henr, przecinek; 2 kilo-henry, przecinek; 1 deka-herc, przecinek; 2 decy-herce, przecinek; 1 centy-dĆŒul, przecinek; 2 mili-dĆŒule, przecinek; 1 mikro-katal, przecinek; 2 nano-katale, przecinek; 1 piko-lumen, przecinek; 2 femto-lumeny, przecinek; 1 atto-luks, przecinek; 2 zepto-luksy, przecinek; 1 mili-stopieƄ Celsjusza; przecinek; 2 mikro-stopnie Celsjusza; przecinek; 1 piko-stopieƄ Celsjusza; przecinek; 2 nano-stopnie Celsjusza")?; return Ok(()); } @@ -145,7 +145,7 @@ fn si_derived_2() -> Result<()> { 1Wb,2Wb "#; test("pl", "SimpleSpeak", expr, - "1 niuton, przecinek; 2 niutons, przecinek, 1 om przecinek; 2 oms, przecinek, 1 om przecinek; 2 oms, przecinek; 1 paskal, przecinek; 2 paskals, przecinek; 1 siemens, przecinek; 2 siemens, przecinek; 1 siwert, przecinek; 2 siwerts, przecinek; 1 tesla, przecinek; 2 teslas, przecinek; 1 wolt, przecinek; 2 wolty, przecinek, 1 wat, przecinek; 2 waty, przecinek; 1 weber, przecinek; 2 webers")?; + "1 niuton, przecinek; 2 niutony, przecinek, 1 om przecinek, 2 omy, przecinek, 1 om przecinek, 2 omy, przecinek; 1 paskal, przecinek; 2 paskale, przecinek; 1 siemens, przecinek; 2 siemensy, przecinek; 1 siwert, przecinek; 2 siwerty, przecinek; 1 tesla, przecinek; 2 tesle, przecinek; 1 wolt, przecinek; 2 wolty, przecinek, 1 wat, przecinek; 2 waty, przecinek; 1 weber, przecinek; 2 webery")?; return Ok(()); } @@ -165,7 +165,7 @@ fn si_derived_2_with_prefixes() -> Result<()> { 1PWb,2EWb "#; test("pl", "SimpleSpeak", expr, - "1 kwekto-niuton, przecinek; 2 ronto-niutons; przecinek; 1 jokto-om, przecinek; 2 zepto-oms, przecinek; 1 atto-om, przecinek; 2 femto-oms, przecinek; 1 piko-paskal, przecinek; 2 nano-paskals, przecinek; 1 mikro-siemens, przecinek; 2 mili-siemens, przecinek; 1 centy-siwert, przecinek; 2 decy-siwerts, przecinek; 1 deka-tesla, przecinek; 2 hekto-teslas, przecinek; 1 kilo-wolt, przecinek; 2 mega-wolty, przecinek; 1 giga-wat, przecinek; 2 tera-waty, przecinek; 1 peta-weber, przecinek; 2 eksa-webers")?; + "1 kwekto-niuton, przecinek; 2 ronto-niutony, przecinek; 1 jokto-om, przecinek; 2 zepto-omy, przecinek; 1 atto-om, przecinek; 2 femto-omy, przecinek; 1 piko-paskal, przecinek; 2 nano-paskale, przecinek; 1 mikro-siemens, przecinek; 2 mili-siemensy, przecinek; 1 centy-siwert, przecinek; 2 decy-siwerty, przecinek; 1 deka-tesla, przecinek; 2 hekto-tesle, przecinek; 1 kilo-wolt, przecinek; 2 mega-wolty, przecinek; 1 giga-wat, przecinek; 2 tera-waty, przecinek; 1 peta-weber, przecinek; 2 eksa-webery")?; return Ok(()); } @@ -191,7 +191,7 @@ fn si_accepted() -> Result<()> { 1Bd,2Bd "#; test("pl", "SimpleSpeak", expr, - "1 litr, przecinek; 2 litrs, przecinek; 1 litr, przecinek; 2 litrs, przecinek; 1 litr, przecinek; 2 litrs, przecinek; 1 tona, przecinek; 2 tonas, przecinek; 1 dalton, przecinek; 2 daltons, przecinek; 1 neper, przecinek; 2 nepers, przecinek; 1 jednostka masy atomowej, przecinek; 2 jednostka masy atomowejs; przecinek; 1 elektronowolt, przecinek; 2 elektronowolts, przecinek; 1 radian, przecinek; 2 radians, przecinek; 1 steradian, przecinek; 2 steradians, przecinek, 1 rok, przecinek; 2 roks, przecinek; 1 sekunda Ƃuku, przecinek; 2 sekunda Ƃukus, przecinek, 1 bit, przecinek; 2 bits, przecinek; 1 bajt, przecinek; 2 bajts, przecinek, 1 bod, przecinek; 2 bods")?; + "1 litr, przecinek; 2 litry, przecinek; 1 litr, przecinek; 2 litry, przecinek; 1 litr, przecinek; 2 litry, przecinek; 1 tona, przecinek; 2 tony, przecinek; 1 dalton, przecinek; 2 daltony, przecinek; 1 neper, przecinek; 2 nepery, przecinek; 1 jednostka masy atomowej, przecinek; 2 jednostki masy atomowej, przecinek; 1 elektronowolt, przecinek; 2 elektronowolty, przecinek; 1 radian, przecinek; 2 radiany, przecinek; 1 steradian, przecinek; 2 steradiany, przecinek, 1 rok, przecinek; 2 lata, przecinek; 1 sekunda Ƃuku, przecinek; 2 sekundy Ƃuku, przecinek, 1 bit, przecinek; 2 bity, przecinek; 1 bajt, przecinek; 2 bajty, przecinek, 1 bod, przecinek; 2 body")?; return Ok(()); } @@ -216,7 +216,7 @@ fn si_accepted_with_prefixes() -> Result<()> { 1TBd,2EBd "#; test("pl", "SimpleSpeak", expr, - "1 kwetta-litr, przecinek; 2 ronna-litrs, przecinek; 1 jotta-litr, przecinek; 2 zetta-litrs, przecinek; 1 eksa-litr, przecinek; 2 peta-litrs, przecinek; 1 tera-tona, przecinek; 2 giga-tonas, przecinek; 1 mega-dalton, przecinek; 2 kilo-daltons, przecinek; 1 decy-neper, przecinek; 2 centy-nepers, przecinek; 1, hekto-jednostka masy atomowej; przecinek; 2, deka-jednostka masy atomowejs; przecinek; 1 mili-elektronowolt; przecinek; 2 mikro-elektronowolts; przecinek; 1 nano-radian, przecinek; 2 piko-radians, przecinek; 1 femto-steradian, przecinek; 2 atto-steradians; przecinek; 1 giga-rok, przecinek; 2 mega-roks, przecinek; 1 zepto-sekunda Ƃuku; przecinek; 2 jokto-sekunda Ƃukus; przecinek; 1 kilo-bit, przecinek; 2 mega-bits, przecinek; 1 giga-bajt, przecinek; 2 tera-bajts, przecinek; 1 tera-bod, przecinek; 2 eksa-bods")?; + "1 kwetta-litr, przecinek; 2 ronna-litry, przecinek; 1 jotta-litr, przecinek; 2 zetta-litry, przecinek; 1 eksa-litr, przecinek; 2 peta-litry, przecinek; 1 tera-tona, przecinek; 2 giga-tony, przecinek; 1 mega-dalton, przecinek; 2 kilo-daltony, przecinek; 1 decy-neper, przecinek; 2 centy-nepery, przecinek; 1, hekto-jednostka masy atomowej; przecinek; 2, deka-jednostki masy atomowej; przecinek; 1 mili-elektronowolt; przecinek; 2 mikro-elektronowolty; przecinek; 1 nano-radian, przecinek; 2 piko-radiany, przecinek; 1 femto-steradian, przecinek; 2 atto-steradiany, przecinek; 1 giga-rok, przecinek; 2 mega-lata, przecinek; 1 zepto-sekunda Ƃuku; przecinek; 2 jokto-sekundy Ƃuku; przecinek; 1 kilo-bit, przecinek; 2 mega-bity, przecinek; 1 giga-bajt, przecinek; 2 tera-bajty, przecinek; 1 tera-bod, przecinek; 2 eksa-body")?; return Ok(()); } @@ -240,7 +240,7 @@ fn without_prefix_time() -> Result<()> { 1yr,2yr "#; test("pl", "SimpleSpeak", expr, - "1 sekunda, przecinek; 2 sekundas, przecinek; 1 sekunda, przecinek; 2 sekundas, przecinek; 1 minuta, przecinek; 2 minutas, przecinek; 1 minuta, przecinek; 2 minutas, przecinek; 1 minuta, przecinek; 2 minutas, przecinek; 1 godzina, przecinek; 2 godzinas, przecinek; 1 godzina, przecinek; 2 godzinas, przecinek; 1 godzina, przecinek; 2 godzinas, przecinek; 1 dzieƄ, przecinek; 2 dzieƄs, przecinek; 1 dzieƄ, przecinek; 2 dzieƄs, przecinek; 1 tydzieƄ, przecinek; 2 tydzieƄs, przecinek; 1 tydzieƄ, przecinek; 2 tydzieƄs, przecinek, 1 rok, przecinek; 2 roks, przecinek, 1 rok, przecinek; 2 roks")?; + "1 sekunda, przecinek; 2 sekundy, przecinek; 1 sekunda, przecinek; 2 sekundy, przecinek; 1 minuta, przecinek; 2 minuty, przecinek; 1 minuta, przecinek; 2 minuty, przecinek; 1 minuta, przecinek; 2 minuty, przecinek; 1 godzina, przecinek; 2 godziny, przecinek; 1 godzina, przecinek; 2 godziny, przecinek; 1 godzina, przecinek; 2 godziny, przecinek; 1 dzieƄ, przecinek, 2 dni, przecinek; 1 dzieƄ, przecinek, 2 dni, przecinek; 1 tydzieƄ, przecinek; 2 tygodnie, przecinek; 1 tydzieƄ, przecinek; 2 tygodnie, przecinek, 1 rok, przecinek; 2 lata, przecinek, 1 rok, przecinek; 2 lata")?; return Ok(()); } @@ -258,7 +258,7 @@ fn without_prefix_angles() -> Result<()> { 1asec,2asec "#; test("pl", "SimpleSpeak", expr, - "1 stopieƄ, przecinek; 2 stopnie, przecinek; 1 stopieƄ, przecinek; 2 stopnie, przecinek; 1 minuta Ƃuku, przecinek; 2 minuta Ƃukus, przecinek; 1 minuta Ƃuku, przecinek; 2 minuta Ƃukus, przecinek; 1 minuta Ƃuku, przecinek; 2 minuta Ƃukus, przecinek; 1 minuta Ƃuku, przecinek; 2 minuta Ƃukus, przecinek; 1 sekunda Ƃuku, przecinek; 2 sekunda Ƃukus, przecinek; 1 sekunda Ƃuku, przecinek; 2 sekunda Ƃukus")?; + "1 stopieƄ, przecinek; 2 stopnie, przecinek; 1 stopieƄ, przecinek; 2 stopnie, przecinek; 1 minuta Ƃuku, przecinek; 2 minuty Ƃuku, przecinek; 1 minuta Ƃuku, przecinek; 2 minuty Ƃuku, przecinek; 1 minuta Ƃuku, przecinek; 2 minuty Ƃuku, przecinek; 1 minuta Ƃuku, przecinek; 2 minuty Ƃuku, przecinek; 1 sekunda Ƃuku, przecinek; 2 sekundy Ƃuku, przecinek; 1 sekunda Ƃuku, przecinek; 2 sekundy Ƃuku")?; return Ok(()); } @@ -274,7 +274,7 @@ fn without_prefix_distance() -> Result<()> { 1fm,2fm "#; test("pl", "SimpleSpeak", expr, - "1 jednostka astronomiczna, przecinek; 2 jednostka astronomicznas; przecinek; 1 rok ƛwietlny, przecinek; 2 rok ƛwietlnys, przecinek; 1 parsek, przecinek; 2 parseks, przecinek; 1 angstrem, przecinek; 2 angstrems, przecinek; 1 angstrem, przecinek; 2 angstrems, przecinek; 1 fermi, przecinek; 2 fermis")?; + "1 jednostka astronomiczna, przecinek; 2 jednostki astronomiczne, przecinek; 1 rok ƛwietlny, przecinek; 2 lata ƛwietlne, przecinek; 1 parsek, przecinek; 2 parseki, przecinek; 1 angstrem, przecinek; 2 angstremy, przecinek; 1 angstrem, przecinek; 2 angstremy, przecinek; 1 fermi, przecinek; 2 fermi")?; return Ok(()); } @@ -299,7 +299,7 @@ fn without_prefix_other() -> Result<()> { 1erg,2erg "#; test("pl", "SimpleSpeak", expr, - "1 hektar, przecinek; 2 hektars, przecinek; 1 decybel, przecinek; 2 decybels, przecinek; 1 atmosfera, przecinek; 2 atmosferas, przecinek; 1 jednostka masy atomowej, przecinek; 2 jednostka masy atomowejs; przecinek, 1 bar, przecinek; 2 bars, przecinek; 1 kaloria, przecinek; 2 kalorias, przecinek; 1 kiur, przecinek; 2 kiurs, przecinek; 1 grad, przecinek; 2 grads, przecinek; 1 molowy, przecinek; 2 molowys, przecinek; 1 rentgen, przecinek; 2 rentgens, przecinek; 1 obrĂłt na minutę, przecinek; 2 obroty na minutę, przecinek; 1 drachma pƂynu, przecinek; 2 drachma pƂynus, przecinek; 1 M h o, przecinek; 2 M h os, przecinek; 1 dyna, przecinek; 2 dynas, przecinek, 1 erg, przecinek; 2 ergs")?; + "1 hektar, przecinek; 2 hektary, przecinek; 1 decybel, przecinek; 2 decybele, przecinek; 1 atmosfera, przecinek; 2 atmosfery, przecinek; 1 jednostka masy atomowej, przecinek; 2 jednostki masy atomowej, przecinek, 1 bar, przecinek; 2 bary, przecinek; 1 kaloria, przecinek; 2 kalorie, przecinek; 1 kiur, przecinek; 2 kiury, przecinek; 1 grad, przecinek; 2 grady, przecinek; 1 molowy, przecinek; 2 molowe, przecinek; 1 rentgen, przecinek; 2 rentgeny, przecinek; 1 obrĂłt na minutę, przecinek; 2 obroty na minutę, przecinek; 1 drachma pƂynu, przecinek; 2 drachmy pƂynu, przecinek, 1 mho, przecinek, 2 mho, przecinek; 1 dyna, przecinek; 2 dyny, przecinek, 1 erg, przecinek; 2 ergi")?; return Ok(()); } @@ -325,7 +325,7 @@ fn without_prefix_powers_of_2() -> Result<()> { 1YiB,2YiB "#; test("pl", "SimpleSpeak", expr, - "1 kibibit, przecinek; 2 kibibits, przecinek; 1 mebibit, przecinek; 2 mebibits, przecinek; 1 gibibit, przecinek; 2 gibibits, przecinek; 1 tebibit, przecinek; 2 tebibits, przecinek; 1 pebibit, przecinek; 2 pebibits, przecinek; 1 eksbibit, przecinek; 2 eksbibits, przecinek; 1 zebibit, przecinek; 2 zebibits, przecinek; 1 jobibit, przecinek; 2 jobibits, przecinek; 1 kibibajt, przecinek; 2 kibibajts, przecinek; 1 mebibajt, przecinek; 2 mebibajts, przecinek; 1 gibibajt, przecinek; 2 gibibajts, przecinek; 1 tebibajt, przecinek; 2 tebibajts, przecinek; 1 pebibajt, przecinek; 2 pebibajts, przecinek; 1 eksbibajt, przecinek; 2 eksbibajts, przecinek; 1 zebibajt, przecinek; 2 zebibajts, przecinek; 1 jobibajt, przecinek; 2 jobibajts")?; + "1 kibibit, przecinek; 2 kibibity, przecinek; 1 mebibit, przecinek; 2 mebibity, przecinek; 1 gibibit, przecinek; 2 gibibity, przecinek; 1 tebibit, przecinek; 2 tebibity, przecinek; 1 pebibit, przecinek; 2 pebibity, przecinek; 1 eksbibit, przecinek; 2 eksbibity, przecinek; 1 zebibit, przecinek; 2 zebibity, przecinek; 1 jobibit, przecinek; 2 jobibity, przecinek; 1 kibibajt, przecinek; 2 kibibajty, przecinek; 1 mebibajt, przecinek; 2 mebibajty, przecinek; 1 gibibajt, przecinek; 2 gibibajty, przecinek; 1 tebibajt, przecinek; 2 tebibajty, przecinek; 1 pebibajt, przecinek; 2 pebibajty, przecinek; 1 eksbibajt, przecinek; 2 eksbibajty, przecinek; 1 zebibajt, przecinek; 2 zebibajty, przecinek; 1 jobibajt, przecinek; 2 jobibajty")?; return Ok(()); } @@ -342,11 +342,11 @@ fn si_other_numbers() -> Result<()> { 2.5µsec, 32.34mol"#; test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, - "10 l przecinek, 20 m przecinek; x mili-sekundas; przecinek; y mikro-sekundas; przecinek; deka-grams, przecinek; 1235 deka-niutons; przecinek; 25 mikro-sekundas; przecinek; 3234 mols")?; + "10 l przecinek, 20 m przecinek; x mili-sekund, przecinek; y mikro-sekund, przecinek; deka-gramĂłw, przecinek; 1235 deka-niutonĂłw; przecinek; 25 mikro-sekundy, przecinek; 3234 mole")?; test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium")], expr, - "10 litr, przecinek; 20 metrs, przecinek; x mili-sekundas; przecinek; y mikro-sekundas; przecinek; deka-grams, przecinek; 1235 deka-niutons; przecinek; 25 mikro-sekundas; przecinek; 3234 mols")?; + "10 litr, przecinek; 20 metry, przecinek; x mili-sekund, przecinek; y mikro-sekund, przecinek; deka-gramĂłw, przecinek; 1235 deka-niutonĂłw; przecinek; 25 mikro-sekundy, przecinek; 3234 mole")?; test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, - "10 litr, przecinek; 20 metrs, przecinek; x mili-sekundas; przecinek; y mikro-sekundas; przecinek; deka-grams, przecinek; 1235 deka-niutons; przecinek; 25 mikro-sekundas; przecinek; 3234 mols")?; + "10 litr, przecinek; 20 metry, przecinek; x mili-sekund, przecinek; y mikro-sekund, przecinek; deka-gramĂłw, przecinek; 1235 deka-niutonĂłw; przecinek; 25 mikro-sekundy, przecinek; 3234 mole")?; return Ok(()); } @@ -361,7 +361,7 @@ fn test_mtext_inference() -> Result<()> { 4.5mT ]"#; test("pl", "SimpleSpeak", expr, - "nawias kwadratowy otwierający; 1 tona, przecinek; 2 peta-ampers, przecinek; 3 paskals, przecinek; 45 mili-teslas; nawias kwadratowy zamykający")?; + "nawias kwadratowy otwierający; 1 tona, przecinek; 2 peta-ampery, przecinek; 3 paskale, przecinek; 45 mili-tesli; nawias kwadratowy zamykający")?; return Ok(()); } @@ -376,7 +376,7 @@ fn test_mtext_inference() -> Result<()> { mmin "#; test("pl", "SimpleSpeak", expr, - "3 metrs, przecinek; 1 kilo-metr, przecinek; 3 metrs, przecinek; 3 dziesiąte farads, przecinek; m indeks dolny minimum koniec indeksu dolnego")?; + "3 metry, przecinek; 1 kilo-metr, przecinek; 3 metry, przecinek; 3 dziesiąte faradĂłw, przecinek; m indeks dolny minimum koniec indeksu dolnego")?; return Ok(()); } From 9f4721a517eb986c318f1f113531d9cc648e0882 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dziwisz?= Date: Thu, 3 Sep 2026 13:15:05 +0200 Subject: [PATCH 087/162] pl: speak the unit after "na" in the accusative, not the nominative (#745) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * pl: mark the unicode translations as verified (t -> T) Mechanical change: 2435 text keys raised from t/ot/ct to T/OT/CT in the two unicode files. No text is touched. The Polish rules were written before the lowercase/uppercase convention was in use, so entries that have been translated all along still carried the "needs review" key. The audit tool therefore reported them as untranslated, which made the real gaps impossible to see: audit-translations pl, untranslated text: 3162 -> 727 The remaining 727 are in the rule files, where the entries need reading rather than a mechanical pass, so they are deliberately left alone. Every raised entry was checked to differ from the English source, i.e. it really is translated. Entries whose text legitimately equals English (Roman numerals, ligatures, proper names, whitespace) were handled separately in the previous PR; entries still holding English text are NOT raised, since that would assert a translation that does not exist. Verification: cargo test --test languages Languages::pl 609 passed, 0 failed diff: 2436 insertions, 2436 deletions, zero changes outside key case The last point is checked by normalising the key case in the diff and confirming no unpaired lines remain (without normalising, 4710 remain, so the check does discriminate). * pl: also mark the multi-line unicode entries as verified The previous commit raised the key on entries written on a single line (`- "±": [t: "..."]`), but not on entries whose body is a block: - "°": - test: if: "parent::*[name(.)='msup' ...]" then: [t: "stopni"] else: [t: "stopieƄ"] Those are exactly the entries carrying inflection or a TTS condition, so 312 of the most deliberate translations in the file were left looking unreviewed. This raises them: 64 in unicode.yaml, 247 in unicode-full.yaml and one single-line entry (U+23E6) missed earlier. One entry is deliberately left with a lower-case key: `t: ""` for U+00A0, the else-branch of the `@data-empty-in-2D` test. That is silence rather than text, and an upper-case key means "a translator checked this wording" - there is no wording to check. English keeps a lower-case key there too. No content changes; only key case. `cargo test --test languages Languages::pl` gives 609 passed, 0 failed, which is the same result as before this commit, as expected for a change the engine treats as equivalent (src/speech.rs matches "t"|"T" in one match arm). * pl: raise the remaining rule-file keys and test the number-set rules Two loose ends in the Polish localization. **Rule-file keys.** 248 entries in the rule files still used a lower-case key while carrying translated Polish text. Content is untouched - every one of the 248 changed lines differs from its predecessor only in the case of the key name, verified line by line after normalizing the key. 17 entries are deliberately left lower-case: five are the letters C, N, Q, R, Z in `dimension-number-sets` (the letter itself is the wording, as in English); `ct: "s"`/`ct: "-"` in the unit rule are the plural suffix and prefix separator; `navigate.yaml:176` is a Polish euphony variant ("ze" before "st-"); the remaining seven are XPath expressions rather than speech. **Tests for the number-set rules.** These rules had no Polish test at all, in a file where two silent defects were already found. New `tests/Languages/pl/number_sets.rs` covers the bare symbols, the dimension form, both sign variants, and ClearSpeak agreeing with SimpleSpeak. The `number_set_with_variable_exponent` case is the negative control: `dimension-number-sets` fires on `count(*)=2`, so a non-numeric exponent must fall through to the full phrase ("liczby caƂkowite do potęgi n") rather than being read as a dimension. Without it, a rule that swallowed every superscript would still pass. Polish keeps the letter with a dimension ("R 3"), matching en, de, fr, nb, sv, fi and es; Hungarian is the only language that translates in that position too. Measured with the SAPI voice NVDA actually uses: "R 3" is byte-identical to a phonetic "er 3" and "N 4" to "en 4", so the letters are pronounced as their Polish names. cargo test --test languages Languages::pl 614 passed, 0 failed * pl: inflect unit names according to the numeral, not with an English "s" The `unit` rule appended `ct: "s"` whenever a unit had no entry in `PluralForms`, and the Polish `PluralForms` contained no SI base unit at all. Measured output of the engine before this change: 1 metr, 2 metrs, 5 metrs, 21 metrs, 2 grams, 2 sekundas, 2 ampers, 2 mols, 2 kilo-metrs So a Polish NVDA user heard an English plural ending on essentially every quantity. Hungarian avoids this with `CT: ""` (it appends nothing); French and German legitimately use "s"; Russian, whose plurals work like Polish, does not rely on a suffix at all and fills in `PluralForms` instead. Polish was in the wrong group. Polish does not have one plural form. The noun follows the numeral: 1 metr | 2, 3, 4 metry (nominative plural) | 5 metrĂłw (genitive plural) and the teens are the exception that breaks the naive rule: 12, 13, 14 metrĂłw, likewise 112-114, while 22 and 102 take the nominative again. One extra plural column is therefore not enough, so this adds a second definition section, `PluralGenitive`, next to `PluralForms` (now the nominative plural). No Rust change is needed: `build_values` accepts any definition name as a hashmap. The `unit` rule (both the bare and the prefixed branch) and the `currency` rule now read the value of the numeral and pick the section accordingly. When the numeral cannot be determined - a variable coefficient, as in "x ms" - `$Coefficient` is 0 and the genitive is used, which is also what Polish uses for unknown quantities ("x mili-sekund"). Where no inflected form is known the singular is spoken rather than a guessed ending: a wrong ending is worse for a screen reader user than a missing one. Both sections cover all 131 unit and currency names that the Polish `SIUnits`, `UnitsWithoutPrefixes`, `EnglishUnits` and `CurrencySymbols` can produce. The forms are written out because Polish inflection cannot be derived from the ending: metr/metry but litr/litry, om/omy, dzieƄ/dni, tydzieƄ/tygodnie, rok/lata. Multi-word units inflect the head noun and keep the dependent word's case ("5 lat ƛwietlnych", "5 minut Ƃuku"). They were checked against hunspell pl_PL; the only words it does not know are the binary-prefix neologisms (kibibajt, gibibit, ...) whose singular forms already existed in the file. Three base forms were themselves wrong - plurals used as singulars, so the engine said "1 herce" and "1 konie mechaniczne": Hz herce -> herc hp konie mechaniczne -> koƄ mechaniczny ℧ M h o -> mho Every other language has a singular here (en hertz, ru гДрц, fi hertsi, es hercio; hp: ru "Đ»ĐŸŃˆĐ°ĐŽĐžĐœĐ°Ń сОла", hu "lĂłerƑ", nb "hestekraft"; ℧: de/fr "mho"). Why this survived: the existing Polish expectations in tests/Languages/pl/units.rs recorded the broken output, so 609 tests passed while the speech was wrong ("2 dzieƄs", "2 tydzieƄs", "kwetta-grams"). Expectations harvested from real engine output are a good regression net but prove nothing about correctness unless they are read as a user would hear them. 21 test expectations are updated here, each difference reviewed word by word. Verification: cargo test --test languages Languages::pl 615 passed, 0 failed reverting general.yaml alone -> 6 of 6 new tests fail The new tests in tests/Languages/pl/unit_plurals.rs cover one class of phenomenon each: the three numeral classes including the teens exception, SI base units, the prefixed branch of the rule, irregular nouns, the corrected base forms, and multi-word units. * pl: speak the unit after "na" in the accusative, not the nominative The `per-fraction` rule speaks the denominator of a unit fraction after the preposition "na", which in Polish governs the accusative case. The unit was inserted in the nominative, so the engine said: 62 mile na godzina (should be "na godzinę") 5 metrĂłw na sekunda (should be "na sekundę") 3 galony na mila (should be "na milę") 3 metry na sekunda do kwadratu Only feminine nouns change form here. For masculine inanimate and neuter names the accusative already equals the nominative, so "3 gramy na litr" and "1 dĆŒul na mol" were correct and stay untouched. That narrows the work to 32 of the 131 unit and currency names, which is why `AccusativeCase` deliberately holds only those - a missing entry means "the form does not change". Why this lives in the `unit` rule rather than in `per-fraction`: Russian has the same problem and solves it inside `per-fraction` by testing the unit symbol and writing the inflected word inline (`ĐŒĐžĐ»ŃŽ`), which works because only one word is affected. Polish would need 32 such cases in the rule. Instead the `unit` rule asks whether it is being spoken as a fraction denominator, so the choice is made once, in one place, for every name. The denominator can also be raised to a power, as in m/sÂČ, and then the unit's parent is the `power` element rather than the fraction itself, so `IsFractionDenominator` tests both shapes. That second case was found only after the first fix: the existing expectation "3 metry na sekunda do kwadratu" was still passing green, because the list of failing tests shows only the cases whose output actually changed. Searching every Polish expectation for a nominative after "na" is what surfaced it. An adjective agrees with its noun ("na stopę kwadratową") while a dependent noun keeps its own case ("na minutę Ƃuku", "na uncję pƂynu"), so the forms are written out rather than derived. Verification: cargo test --test languages Languages::pl 620 passed, 0 failed New tests in tests/Languages/pl/preposition_case.rs include two negative controls: masculine and neuter denominators must NOT change, and a unit standing on its own must stay in the nominative, so the accusative cannot leak outside the fraction denominator. --------- Co-authored-by: NSoiffer --- Rules/Languages/pl/SharedRules/general.yaml | 16 ++++- Rules/Languages/pl/definitions.yaml | 42 ++++++++++++ tests/Languages/pl.rs | 1 + tests/Languages/pl/ClearSpeak/mfrac.rs | 2 +- tests/Languages/pl/SimpleSpeak/mfrac.rs | 8 +-- tests/Languages/pl/preposition_case.rs | 71 +++++++++++++++++++++ 6 files changed, 133 insertions(+), 7 deletions(-) create mode 100644 tests/Languages/pl/preposition_case.rs diff --git a/Rules/Languages/pl/SharedRules/general.yaml b/Rules/Languages/pl/SharedRules/general.yaml index f3d026f2b..e6c94a36a 100644 --- a/Rules/Languages/pl/SharedRules/general.yaml +++ b/Rules/Languages/pl/SharedRules/general.yaml @@ -293,6 +293,14 @@ # cannot be determined, which falls through to the genitive - the form # Polish uses with unknown or large quantities. - Coefficient: "IfThenElse($MRowForCoefficient, number($MRowForCoefficient/*[1][self::m:mn]), 0)" + # The 'per-fraction' rule speaks the denominator after the preposition "na", + # which governs the accusative: "na godzinę", not "na godzina". Only feminine + # nouns change form, so AccusativeCase holds just those; a missing entry + # means the accusative equals the nominative (as for "na litr", "na mol"). + # The second test covers a denominator raised to a power, as in m/s^2, where + # the unit's parent is the 'power' element rather than the fraction itself. + - IsFractionDenominator: "(parent::m:fraction and preceding-sibling::*) or + (parent::m:power and parent::*[parent::m:fraction and preceding-sibling::*])" - IsNominativePlural: "$Coefficient mod 10 >= 2 and $Coefficient mod 10 <= 4 and not($Coefficient mod 100 >= 12 and $Coefficient mod 100 <= 14)" - Prefix: "''" @@ -339,7 +347,9 @@ if: "$Prefix = ''" then: - test: - - if: "$IsSingular" + - if: "$IsSingular and $IsFractionDenominator and DefinitionValue($Word, 'Speech', 'AccusativeCase') != ''" + then: [x: "DefinitionValue($Word, 'Speech', 'AccusativeCase')"] + - else_if: "$IsSingular" # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets the prefix concatenated to the base then: [x: "$Word"] - else_if: "$IsNominativePlural and DefinitionValue($Word, 'Speech', 'PluralForms') != ''" @@ -353,7 +363,9 @@ - x: "$Prefix" - ct: "-" - test: - - if: "$IsSingular" + - if: "$IsSingular and $IsFractionDenominator and DefinitionValue($Word, 'Speech', 'AccusativeCase') != ''" + then: [x: "concat('\uF8FE', DefinitionValue($Word, 'Speech', 'AccusativeCase'))"] + - else_if: "$IsSingular" # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets the prefix concatenated to the base then: [x: "concat('\uF8FE', $Word)"] - else_if: "$IsNominativePlural and DefinitionValue($Word, 'Speech', 'PluralForms') != ''" diff --git a/Rules/Languages/pl/definitions.yaml b/Rules/Languages/pl/definitions.yaml index 18785562b..0f212c4e4 100644 --- a/Rules/Languages/pl/definitions.yaml +++ b/Rules/Languages/pl/definitions.yaml @@ -646,6 +646,48 @@ "ƂyĆŒka stoƂowa": "ƂyĆŒki stoƂowe" } +- AccusativeCase: { + # Accusative singular, used after the preposition "na" in the + # 'per-fraction' rule: "62 mile na godzinę", not "na godzina". + # Only feminine nouns differ from the nominative, so masculine and + # neuter names are deliberately absent - a missing entry means + # "the form does not change" (na litr, na mol, na metr). + # An adjective agrees with its noun (milę kwadratową), while a + # dependent noun keeps its own case (uncję pƂynu, minutę Ƃuku). + "atmosfera": "atmosferę", + "baryƂka": "baryƂkę", + "drachma": "drachmę", + "drachma pƂynu": "drachmę pƂynu", + "dyna": "dynę", + "godzina": "godzinę", + "jednostka astronomiczna": "jednostkę astronomiczną", + "jednostka masy atomowej": "jednostkę masy atomowej", + "kaloria": "kalorię", + "kandela": "kandelę", + "kwarta": "kwartę", + "mila": "milę", + "mila kwadratowa": "milę kwadratową", + "mila na galon": "milę na galon", + "mila na godzinę": "milę na godzinę", + "minuta": "minutę", + "minuta Ƃuku": "minutę Ƃuku", + "pinta": "pintę", + "rupia": "rupię", + "sekunda": "sekundę", + "sekunda Ƃuku": "sekundę Ƃuku", + "stopa": "stopę", + "stopa deskowa": "stopę deskową", + "stopa kwadratowa": "stopę kwadratową", + "stopa szeƛcienna": "stopę szeƛcienną", + "tesla": "teslę", + "tona": "tonę", + "uncja": "uncję", + "uncja pƂynu": "uncję pƂynu", + "uncja trojaƄska": "uncję trojaƄską", + "ƂyĆŒeczka": "ƂyĆŒeczkę", + "ƂyĆŒka stoƂowa": "ƂyĆŒkę stoƂową" + } + - PluralGenitive: { # Genitive plural - after 5 and above, and after 12-14, 112-114. # Polish inflects the noun according to the numeral, so a single plural diff --git a/tests/Languages/pl.rs b/tests/Languages/pl.rs index c9423ea9f..8e4c56f37 100644 --- a/tests/Languages/pl.rs +++ b/tests/Languages/pl.rs @@ -4,6 +4,7 @@ mod pl; mod number_sets; mod unit_plurals; +mod preposition_case; // Tests mirrored from the English suite, with expected speech localized to Polish. mod ClearSpeak { diff --git a/tests/Languages/pl/ClearSpeak/mfrac.rs b/tests/Languages/pl/ClearSpeak/mfrac.rs index a53bba559..fff485696 100644 --- a/tests/Languages/pl/ClearSpeak/mfrac.rs +++ b/tests/Languages/pl/ClearSpeak/mfrac.rs @@ -86,7 +86,7 @@ fn frac_with_units() -> Result<()> { "; - test("pl", "ClearSpeak", expr, "62 mile na godzina")?; + test("pl", "ClearSpeak", expr, "62 mile na godzinę")?; return Ok(()); } diff --git a/tests/Languages/pl/SimpleSpeak/mfrac.rs b/tests/Languages/pl/SimpleSpeak/mfrac.rs index a07f0592b..3b421b0f2 100644 --- a/tests/Languages/pl/SimpleSpeak/mfrac.rs +++ b/tests/Languages/pl/SimpleSpeak/mfrac.rs @@ -164,7 +164,7 @@ fn frac_with_units() -> Result<()> { "; - test("pl", "SimpleSpeak", expr, "62 mile na godzina")?; + test("pl", "SimpleSpeak", expr, "62 mile na godzinę")?; return Ok(()); } @@ -181,7 +181,7 @@ fn singular_frac_with_units() -> Result<()> { "; - test("pl", "SimpleSpeak", expr, "1 galon na mila")?; + test("pl", "SimpleSpeak", expr, "1 galon na milę")?; return Ok(()); } @@ -198,7 +198,7 @@ fn number_in_numerator_with_units() -> Result<()> { mi "; - test("pl", "SimpleSpeak", expr, "3 galony na mila")?; + test("pl", "SimpleSpeak", expr, "3 galony na milę")?; return Ok(()); } @@ -212,7 +212,7 @@ fn units_with_powers() -> Result<()> { s2 "; - test("pl", "SimpleSpeak", expr, "3 metry na sekunda do kwadratu")?; + test("pl", "SimpleSpeak", expr, "3 metry na sekundę do kwadratu")?; return Ok(()); } diff --git a/tests/Languages/pl/preposition_case.rs b/tests/Languages/pl/preposition_case.rs new file mode 100644 index 000000000..92d1a4521 --- /dev/null +++ b/tests/Languages/pl/preposition_case.rs @@ -0,0 +1,71 @@ +/// Polish prepositions govern case: the denominator of a unit fraction is spoken +/// after "na", which requires the accusative - "na godzinę", not "na godzina". +use crate::common::*; +use anyhow::Result; + +/// Feminine denominators: these are the ones whose form actually changes. +#[test] +fn per_fraction_feminine_denominator() -> Result<()> { + let expr = r#" + 62mihr, + 5ms, + 2kmhr, + 7radmin, + 3Jt + "#; + test("pl", "SimpleSpeak", expr, "62 mile na godzinę, przecinek; 5 metrĂłw na sekundę, przecinek; 2 kilo-metry na godzinę; przecinek; 7 radianĂłw na minutę, przecinek; 3 dĆŒule na tonę")?; + Ok(()) +} + +/// Masculine and neuter denominators must NOT change: their accusative already +/// equals the nominative. This is the negative control for the change. +#[test] +fn per_fraction_masculine_denominator_unchanged() -> Result<()> { + let expr = r#" + 3gl, + 1Jmol, + 5Nm, + 2VA + "#; + test("pl", "SimpleSpeak", expr, "3 gramy na litr, przecinek; 1 dĆŒul na mol, przecinek; 5 niutonĂłw na metr, przecinek; 2 wolty na amper")?; + Ok(()) +} + +/// A unit standing on its own keeps the nominative - the accusative must not +/// leak outside the fraction denominator. +#[test] +fn standalone_unit_stays_nominative() -> Result<()> { + let expr = r#" + 1hr, + 1s, + 1t, + 1min + "#; + test("pl", "SimpleSpeak", expr, "1 godzina, przecinek; 1 sekunda, przecinek; 1 tona, przecinek; 1 minuta")?; + Ok(()) +} + +/// Multi-word feminine units: the adjective agrees, a dependent noun does not. +#[test] +fn per_fraction_multiword_denominator() -> Result<()> { + let expr = r#" + 3gsq ft, + 2marcmin + "#; + test("pl", "SimpleSpeak", expr, "3 gramy na stopę kwadratową; przecinek; 2 metry na minutę Ƃuku")?; + Ok(()) +} + +/// A denominator raised to a power, as in m/s^2: the unit's parent is the +/// 'power' element, not the fraction, so this needs its own test. +#[test] +fn per_fraction_denominator_with_power() -> Result<()> { + let expr = r#" + + 3m + s2 + + "#; + test("pl", "SimpleSpeak", expr, "3 metry na sekundę do kwadratu")?; + Ok(()) +} From 6a5170a57526ea1c873f4cb67f92a0b892c6087f Mon Sep 17 00:00:00 2001 From: mgros Date: Fri, 4 Sep 2026 01:59:00 +0200 Subject: [PATCH 088/162] Update: Add `Cargo.lock` file to track dependencies --- .gitignore | 1 - Cargo.lock | 2075 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 2075 insertions(+), 1 deletion(-) create mode 100644 Cargo.lock diff --git a/.gitignore b/.gitignore index fef5d915c..b2784f7e8 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ target build.rs.orig Python/libmathcat.pyd -Cargo.lock src-pest.7z src.7z mp2.7z diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 000000000..50bccf29f --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2075 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alsa" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43" +dependencies = [ + "alsa-sys", + "bitflags 2.11.0", + "cfg-if", + "libc", +] + +[[package]] +name = "alsa-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "android_log-sys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84521a3cf562bc62942e294181d9eef17eb38ceb8c68677bc49f144e4c3d4f8d" + +[[package]] +name = "android_logger" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb4e440d04be07da1f1bf44fb4495ebd58669372fe0cffa6e48595ac5bd88a3" +dependencies = [ + "android_log-sys", + "env_filter 0.1.4", + "log", +] + +[[package]] +name = "anstream" +version = "0.6.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +dependencies = [ + "anstyle", + "anstyle-parse 0.2.7", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse 1.0.0", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" + +[[package]] +name = "bumpalo" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "bzip2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a53fac24f34a81bc9954b5d6cfce0c21e18ec6959f44f56e8e90e4bb7c346c" +dependencies = [ + "libbz2-rs-sys", +] + +[[package]] +name = "cc" +version = "1.2.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad887fd958be91b5098c0248def011f4523ab786cd411be668777e55063501f" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "clap" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstream 1.0.0", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" +dependencies = [ + "heck", + "proc-macro2 1.0.106", + "quote 1.0.45", + "syn 2.0.117", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "coreaudio-rs" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aae284fbaf7d27aa0e292f7677dfbe26503b0d555026f702940805a630eac17" +dependencies = [ + "bitflags 1.3.2", + "libc", + "objc2-audio-toolbox", + "objc2-core-audio", + "objc2-core-audio-types", + "objc2-core-foundation", +] + +[[package]] +name = "cpal" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbd307f43cc2a697e2d1f8bc7a1d824b5269e052209e28883e5bc04d095aaa3f" +dependencies = [ + "alsa", + "coreaudio-rs", + "dasp_sample", + "jni", + "js-sys", + "libc", + "mach2", + "ndk", + "ndk-context", + "num-derive", + "num-traits", + "objc2-audio-toolbox", + "objc2-core-audio", + "objc2-core-audio-types", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2 1.0.106", + "quote 1.0.45", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote 1.0.45", + "syn 2.0.117", +] + +[[package]] +name = "dasp_sample" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" + +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling", + "proc-macro2 1.0.106", + "quote 1.0.45", + "syn 2.0.117", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn 2.0.117", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.11.0", + "objc2", +] + +[[package]] +name = "doc-comment" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "780955b8b195a21ab8e4ac6b60dd1dbdcec1dc6c51c0617964b08c81785e12c9" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "env_filter" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_filter" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a1c3cc8e57274ec99de65301228b537f1e4eedc1b8e0f9411c6caac8ae7308f" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2daee4ea451f429a58296525ddf28b45a3b64f1acf6587e2067437bb11e218d" +dependencies = [ + "anstream 0.6.21", + "anstyle", + "env_filter 1.0.0", + "jiff", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "extended" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af9673d8203fcb076b19dfd17e38b3d4ae9f44959416ea532ce72415a6020365" + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "miniz_oxide", + "zlib-rs", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hound" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" + +[[package]] +name = "html-escape" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" +dependencies = [ + "utf8-width", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "jiff" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c867c356cc096b33f4981825ab281ecba3db0acefe60329f044c1789d94c6543" +dependencies = [ + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", +] + +[[package]] +name = "jiff-static" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7946b4325269738f270bb55b3c19ab5c5040525f83fd625259422a9d25d9be5" +dependencies = [ + "proc-macro2 1.0.106", + "quote 1.0.45", + "syn 2.0.117", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote 1.0.45", + "syn 2.0.117", +] + +[[package]] +name = "js-sys" +version = "0.3.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libbz2-rs-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" + +[[package]] +name = "libc" +version = "0.2.182" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" + +[[package]] +name = "libredox" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +dependencies = [ + "bitflags 2.11.0", + "libc", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "mach2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" +dependencies = [ + "libc", +] + +[[package]] +name = "mathcat" +version = "0.7.6-rc.4" +dependencies = [ + "android_logger", + "anyhow", + "bitflags 2.11.0", + "cfg-if", + "clap", + "dirs", + "env_logger", + "fastrand", + "html-escape", + "log", + "natural-tts", + "phf", + "radix_fmt", + "regex", + "roman-numerals-rs", + "strum", + "sxd-document-no-unsafe", + "sxd-xpath-no-unsafe", + "tempfile", + "unicode-script", + "yaml-rust", + "zip", +] + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "minreq" +version = "2.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05015102dad0f7d61691ca347e9d9d9006685a64aefb3d79eecf62665de2153d" +dependencies = [ + "rustls", + "rustls-webpki", + "webpki-roots", +] + +[[package]] +name = "natural-tts" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06ae31375ea7364dfadc29bbae70683fce13617e602c458898ebd2630fb1a89" +dependencies = [ + "derive_builder", + "hound", + "minreq", + "percent-encoding", + "rodio", + "serde", + "thiserror 2.0.18", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.11.0", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2 1.0.106", + "quote 1.0.45", + "syn 2.0.117", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate", + "proc-macro2 1.0.106", + "quote 1.0.45", + "syn 2.0.117", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-audio-toolbox" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6948501a91121d6399b79abaa33a8aa4ea7857fe019f341b8c23ad6e81b79b08" +dependencies = [ + "bitflags 2.11.0", + "libc", + "objc2", + "objc2-core-audio", + "objc2-core-audio-types", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-audio" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1eebcea8b0dbff5f7c8504f3107c68fc061a3eb44932051c8cf8a68d969c3b2" +dependencies = [ + "dispatch2", + "objc2", + "objc2-core-audio-types", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-core-audio-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a89f2ec274a0cf4a32642b2991e8b351a404d290da87bb6a9a9d8632490bd1c" +dependencies = [ + "bitflags 2.11.0", + "objc2", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "objc2", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "peresil" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f658886ed52e196e850cfbbfddab9eaa7f6d90dd0929e264c31e5cec07e09e57" + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros", + "phf_shared", + "serde", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2 1.0.106", + "quote 1.0.45", + "syn 2.0.117", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "portable-atomic-util" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" +dependencies = [ + "proc-macro2 0.4.30", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2 1.0.106", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "radix_fmt" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce082a9940a7ace2ad4a8b7d0b1eac6aa378895f18be598230c5f2284ac05426" + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rodio" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e40ecf59e742e03336be6a3d53755e789fd05a059fa22dfa0ed624722319e183" +dependencies = [ + "cpal", + "dasp_sample", + "num-rational", + "symphonia", +] + +[[package]] +name = "roman-numerals-rs" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8408ef3512d2c5d6876de3cf8f24751e19c5f2566e37e1d31ced56a1892f1e92" + +[[package]] +name = "rustc-demangle" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b74b56ffa8bb2830709a538c2cbcae9aa062db0d2a42563bfb09bdaae44020eb" + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2 1.0.106", + "quote 1.0.45", + "syn 2.0.117", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "siphasher" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "snafu" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d0bf93d08d6a44363b47d737f1f5bebbf5e6a1eaaa3d4c128ceeaca6b718292" +dependencies = [ + "backtrace", + "doc-comment", + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624e94bd38e471f67883b467711e7a7ad7dbe284f5fb7e661dc8a671fc5b26a0" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "syn 0.15.44", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +dependencies = [ + "heck", + "proc-macro2 1.0.106", + "quote 1.0.45", + "syn 2.0.117", +] + +[[package]] +name = "sxd-document-no-unsafe" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c08c6a37e27fb1559e036ae8f45672faf06623f13c74c8de9719d50536981f5" +dependencies = [ + "peresil", + "typed-arena", +] + +[[package]] +name = "sxd-xpath-no-unsafe" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff5bfe9c78786014d5a76d9328ea6508b0b74b7dc4a7c4d9b881ace23ce50d" +dependencies = [ + "peresil", + "snafu", + "sxd-document-no-unsafe", +] + +[[package]] +name = "symphonia" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5773a4c030a19d9bfaa090f49746ff35c75dfddfa700df7a5939d5e076a57039" +dependencies = [ + "lazy_static", + "symphonia-bundle-flac", + "symphonia-bundle-mp3", + "symphonia-codec-aac", + "symphonia-codec-pcm", + "symphonia-codec-vorbis", + "symphonia-core", + "symphonia-format-isomp4", + "symphonia-format-ogg", + "symphonia-format-riff", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-bundle-flac" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91565e180aea25d9b80a910c546802526ffd0072d0b8974e3ebe59b686c9976" +dependencies = [ + "log", + "symphonia-core", + "symphonia-metadata", + "symphonia-utils-xiph", +] + +[[package]] +name = "symphonia-bundle-mp3" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4872dd6bb56bf5eac799e3e957aa1981086c3e613b27e0ac23b176054f7c57ed" +dependencies = [ + "lazy_static", + "log", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-codec-aac" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c263845aa86881416849c1729a54c7f55164f8b96111dba59de46849e73a790" +dependencies = [ + "lazy_static", + "log", + "symphonia-core", +] + +[[package]] +name = "symphonia-codec-pcm" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e89d716c01541ad3ebe7c91ce4c8d38a7cf266a3f7b2f090b108fb0cb031d95" +dependencies = [ + "log", + "symphonia-core", +] + +[[package]] +name = "symphonia-codec-vorbis" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f025837c309cd69ffef572750b4a2257b59552c5399a5e49707cc5b1b85d1c73" +dependencies = [ + "log", + "symphonia-core", + "symphonia-utils-xiph", +] + +[[package]] +name = "symphonia-core" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea00cc4f79b7f6bb7ff87eddc065a1066f3a43fe1875979056672c9ef948c2af" +dependencies = [ + "arrayvec", + "bitflags 1.3.2", + "bytemuck", + "lazy_static", + "log", +] + +[[package]] +name = "symphonia-format-isomp4" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243739585d11f81daf8dac8d9f3d18cc7898f6c09a259675fc364b382c30e0a5" +dependencies = [ + "encoding_rs", + "log", + "symphonia-core", + "symphonia-metadata", + "symphonia-utils-xiph", +] + +[[package]] +name = "symphonia-format-ogg" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b4955c67c1ed3aa8ae8428d04ca8397fbef6a19b2b051e73b5da8b1435639cb" +dependencies = [ + "log", + "symphonia-core", + "symphonia-metadata", + "symphonia-utils-xiph", +] + +[[package]] +name = "symphonia-format-riff" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2d7c3df0e7d94efb68401d81906eae73c02b40d5ec1a141962c592d0f11a96f" +dependencies = [ + "extended", + "log", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-metadata" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36306ff42b9ffe6e5afc99d49e121e0bd62fe79b9db7b9681d48e29fa19e6b16" +dependencies = [ + "encoding_rs", + "lazy_static", + "log", + "symphonia-core", +] + +[[package]] +name = "symphonia-utils-xiph" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27c85ab799a338446b68eec77abf42e1a6f1bb490656e121c6e27bfbab9f16" +dependencies = [ + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "syn" +version = "0.15.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "unicode-xid", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2 1.0.106", + "quote 1.0.45", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2 1.0.106", + "quote 1.0.45", + "syn 2.0.117", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2 1.0.106", + "quote 1.0.45", + "syn 2.0.117", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow", +] + +[[package]] +name = "typed-arena" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" + +[[package]] +name = "typed-path" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" + +[[package]] +name = "unicode-ident" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537dd038a89878be9b64dd4bd1b260315c1bb94f4d784956b81e27a088d9a09e" + +[[package]] +name = "unicode-script" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" + +[[package]] +name = "unicode-xid" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "utf8-width" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d" +dependencies = [ + "quote 1.0.45", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd" +dependencies = [ + "bumpalo", + "proc-macro2 1.0.106", + "quote 1.0.45", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "windows" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +dependencies = [ + "windows-core", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +dependencies = [ + "memchr", +] + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "zip" +version = "8.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d04a6b5381502aa6087c94c669499eb1602eb9c5e8198e534de571f7154809b" +dependencies = [ + "bzip2", + "crc32fast", + "flate2", + "indexmap", + "memchr", + "typed-path", + "zopfli", +] + +[[package]] +name = "zlib-rs" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7948af682ccbc3342b6e9420e8c51c1fe5d7bf7756002b4a3c6cabfe96a7e3c" + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] From a6b6af1592cf35c46a8d2309abdfd514c71e0115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Arborealis=20L=C3=B6tberg?= <143188129+TimArborealis@users.noreply.github.com> Date: Mon, 7 Sep 2026 13:34:39 +0200 Subject: [PATCH 089/162] Minor chemistry fix in Swedish Changed chemical arrow operator to read "reagerar och bildar" instead of "reaktion bildar", to make grammatical sense. --- Rules/Languages/sv/SharedRules/general.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rules/Languages/sv/SharedRules/general.yaml b/Rules/Languages/sv/SharedRules/general.yaml index 192c11204..48676832d 100644 --- a/Rules/Languages/sv/SharedRules/general.yaml +++ b/Rules/Languages/sv/SharedRules/general.yaml @@ -1161,7 +1161,7 @@ then_test: if: "$Verbosity='Terse'" then: [{T: "bildar"}] # phrase(hydrogen and oxygen 'forms' water ) - else: [{T: "reaktion bildar"}] # phrase(hydrogen and oxygen 'reacts to form' water) + else: [{T: "reagerar och bildar"}] # phrase(hydrogen and oxygen 'reacts to form' water) - else_if: ".='⇌' or .='\u1f8d2'" then: [{T: "Ă€r i jĂ€mvikt med"}] # phrase(a reactant 'is in equilibrium with' a product) - else_if: ".='\u1f8d4'" From bd03fcd02cc69344b574e1d417ded032e40ed290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dziwisz?= Date: Tue, 8 Sep 2026 00:57:22 +0200 Subject: [PATCH 090/162] pl: mark the unicode translations as verified (t -> T) (#741) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * pl: mark the unicode translations as verified (t -> T) Mechanical change: 2435 text keys raised from t/ot/ct to T/OT/CT in the two unicode files. No text is touched. The Polish rules were written before the lowercase/uppercase convention was in use, so entries that have been translated all along still carried the "needs review" key. The audit tool therefore reported them as untranslated, which made the real gaps impossible to see: audit-translations pl, untranslated text: 3162 -> 727 The remaining 727 are in the rule files, where the entries need reading rather than a mechanical pass, so they are deliberately left alone. Every raised entry was checked to differ from the English source, i.e. it really is translated. Entries whose text legitimately equals English (Roman numerals, ligatures, proper names, whitespace) were handled separately in the previous PR; entries still holding English text are NOT raised, since that would assert a translation that does not exist. Verification: cargo test --test languages Languages::pl 609 passed, 0 failed diff: 2436 insertions, 2436 deletions, zero changes outside key case The last point is checked by normalising the key case in the diff and confirming no unpaired lines remain (without normalising, 4710 remain, so the check does discriminate). * pl: also mark the multi-line unicode entries as verified The previous commit raised the key on entries written on a single line (`- "±": [t: "..."]`), but not on entries whose body is a block: - "°": - test: if: "parent::*[name(.)='msup' ...]" then: [t: "stopni"] else: [t: "stopieƄ"] Those are exactly the entries carrying inflection or a TTS condition, so 312 of the most deliberate translations in the file were left looking unreviewed. This raises them: 64 in unicode.yaml, 247 in unicode-full.yaml and one single-line entry (U+23E6) missed earlier. One entry is deliberately left with a lower-case key: `t: ""` for U+00A0, the else-branch of the `@data-empty-in-2D` test. That is silence rather than text, and an upper-case key means "a translator checked this wording" - there is no wording to check. English keeps a lower-case key there too. No content changes; only key case. `cargo test --test languages Languages::pl` gives 609 passed, 0 failed, which is the same result as before this commit, as expected for a change the engine treats as equivalent (src/speech.rs matches "t"|"T" in one match arm). * pl: raise the remaining rule-file keys and test the number-set rules Two loose ends in the Polish localization. **Rule-file keys.** 248 entries in the rule files still used a lower-case key while carrying translated Polish text. Content is untouched - every one of the 248 changed lines differs from its predecessor only in the case of the key name, verified line by line after normalizing the key. 17 entries are deliberately left lower-case: five are the letters C, N, Q, R, Z in `dimension-number-sets` (the letter itself is the wording, as in English); `ct: "s"`/`ct: "-"` in the unit rule are the plural suffix and prefix separator; `navigate.yaml:176` is a Polish euphony variant ("ze" before "st-"); the remaining seven are XPath expressions rather than speech. **Tests for the number-set rules.** These rules had no Polish test at all, in a file where two silent defects were already found. New `tests/Languages/pl/number_sets.rs` covers the bare symbols, the dimension form, both sign variants, and ClearSpeak agreeing with SimpleSpeak. The `number_set_with_variable_exponent` case is the negative control: `dimension-number-sets` fires on `count(*)=2`, so a non-numeric exponent must fall through to the full phrase ("liczby caƂkowite do potęgi n") rather than being read as a dimension. Without it, a rule that swallowed every superscript would still pass. Polish keeps the letter with a dimension ("R 3"), matching en, de, fr, nb, sv, fi and es; Hungarian is the only language that translates in that position too. Measured with the SAPI voice NVDA actually uses: "R 3" is byte-identical to a phonetic "er 3" and "N 4" to "en 4", so the letters are pronounced as their Polish names. cargo test --test languages Languages::pl 614 passed, 0 failed --------- Co-authored-by: NSoiffer From e1990813b058ff4c27671c244c0960983e78acae Mon Sep 17 00:00:00 2001 From: "U-rainshowers\\neils" Date: Tue, 8 Sep 2026 12:26:42 +1000 Subject: [PATCH 091/162] add PauseFactor to test initialization so that local changes don't affect the outcome. Also consolodate nav preference testing. --- src/interface.rs | 22 ++++++++++++++++++++++ src/navigate.rs | 8 +------- tests/Languages/en/navigate.rs | 15 +-------------- tests/Languages/nb/navigate.rs | 15 +-------------- tests/Languages/ru/navigate.rs | 15 +-------------- tests/common/mod.rs | 11 +++++++++++ 6 files changed, 37 insertions(+), 49 deletions(-) diff --git a/src/interface.rs b/src/interface.rs index 3177c22c8..157a895f1 100644 --- a/src/interface.rs +++ b/src/interface.rs @@ -540,6 +540,28 @@ pub fn do_navigate_command(command: impl AsRef) -> Result { return report_any_panic(result); } +/// Preferences shared by navigation unit and integration tests. +/// +/// Sets `PauseFactor` to 100 so local user prefs (e.g. AppData) cannot change +/// TTS:None pause punctuation (`,` vs `;`) in goldens. +/// `auto_zoom_out` is true for most `src/navigate.rs` tests and false for +/// `tests/Languages/*/navigate.rs`. +pub fn set_navigation_test_preferences( + language: impl AsRef, + nav_mode: impl AsRef, + auto_zoom_out: bool, +) -> Result<()> { + set_preference("NavMode", nav_mode)?; + set_preference("NavVerbosity", "Verbose")?; + set_preference("AutoZoomOut", if auto_zoom_out { "True" } else { "False" })?; + set_preference("Language", language)?; + set_preference("SpeechStyle", "SimpleSpeak")?; + set_preference("Verbosity", "Medium")?; + set_preference("PauseFactor", "100")?; + set_preference("Overview", "False")?; + return Ok(()); +} + /// Given an 'id' and an offset (for tokens), set the navigation node to that id. /// An error is returned if the 'id' doesn't exist pub fn set_navigation_node(id: impl AsRef, offset: usize) -> Result<()> { diff --git a/src/navigate.rs b/src/navigate.rs index 1fac4e766..d1444a86c 100644 --- a/src/navigate.rs +++ b/src/navigate.rs @@ -1030,13 +1030,7 @@ mod tests { init_panic_handler(); let result = catch_unwind(AssertUnwindSafe(|| { set_rules_dir(super::super::abs_rules_dir_path())?; - set_preference("NavMode", nav_mode_default)?; - set_preference("NavVerbosity", "Verbose")?; - set_preference("AutoZoomOut", "True")?; - set_preference("Language", language)?; - set_preference("SpeechStyle", "SimpleSpeak")?; - set_preference("Verbosity", "Medium")?; - set_preference("Overview", "False")?; + set_navigation_test_preferences(language, nav_mode_default, true)?; set_mathml(mathml)?; return Ok( () ); })); diff --git a/tests/Languages/en/navigate.rs b/tests/Languages/en/navigate.rs index abb317f18..6752f9773 100644 --- a/tests/Languages/en/navigate.rs +++ b/tests/Languages/en/navigate.rs @@ -8,23 +8,10 @@ use crate::common::*; use anyhow::Result; use std::panic::{catch_unwind, AssertUnwindSafe}; -fn init_nav(mathml: &str) -> Result<()> { - set_rules_dir(abs_rules_dir_path())?; - set_preference("Language", "en")?; - set_preference("SpeechStyle", "SimpleSpeak")?; - set_preference("Verbosity", "Medium")?; - set_preference("NavMode", "Enhanced")?; - set_preference("NavVerbosity", "Verbose")?; - set_preference("AutoZoomOut", "False")?; - set_preference("Overview", "False")?; - set_mathml(mathml)?; - Ok(()) -} - fn assert_zoom_in(command: &str, mathml: &str, expected: &str) -> Result<()> { init_panic_handler(); let result = catch_unwind(AssertUnwindSafe(|| { - init_nav(mathml)?; + init_nav("en", mathml)?; let speech = do_navigate_command(command)?; let trimmed_speech = speech.trim_end_matches([' ', ',', ';']).to_string(); assert_eq!(expected, trimmed_speech); diff --git a/tests/Languages/nb/navigate.rs b/tests/Languages/nb/navigate.rs index 4f1b8dbf2..fd254c6b3 100644 --- a/tests/Languages/nb/navigate.rs +++ b/tests/Languages/nb/navigate.rs @@ -8,23 +8,10 @@ use crate::common::*; use anyhow::Result; use std::panic::{catch_unwind, AssertUnwindSafe}; -fn init_nav(mathml: &str) -> Result<()> { - set_rules_dir(abs_rules_dir_path())?; - set_preference("Language", "nb")?; - set_preference("SpeechStyle", "SimpleSpeak")?; - set_preference("Verbosity", "Medium")?; - set_preference("NavMode", "Enhanced")?; - set_preference("NavVerbosity", "Verbose")?; - set_preference("AutoZoomOut", "False")?; - set_preference("Overview", "False")?; - set_mathml(mathml)?; - Ok(()) -} - fn assert_zoom_in(command: &str, mathml: &str, expected: &str) -> Result<()> { init_panic_handler(); let result = catch_unwind(AssertUnwindSafe(|| { - init_nav(mathml)?; + init_nav("nb", mathml)?; let speech = do_navigate_command(command)?; let trimmed_speech = speech.trim_end_matches([' ', ',', ';']).to_string(); assert_eq!(expected, trimmed_speech); diff --git a/tests/Languages/ru/navigate.rs b/tests/Languages/ru/navigate.rs index 690df9eff..0195f5bde 100644 --- a/tests/Languages/ru/navigate.rs +++ b/tests/Languages/ru/navigate.rs @@ -4,23 +4,10 @@ use crate::common::*; use anyhow::Result; use std::panic::{catch_unwind, AssertUnwindSafe}; -fn init_nav(mathml: &str) -> Result<()> { - set_rules_dir(abs_rules_dir_path())?; - set_preference("Language", "ru")?; - set_preference("SpeechStyle", "SimpleSpeak")?; - set_preference("Verbosity", "Medium")?; - set_preference("NavMode", "Enhanced")?; - set_preference("NavVerbosity", "Verbose")?; - set_preference("AutoZoomOut", "False")?; - set_preference("Overview", "False")?; - set_mathml(mathml)?; - Ok(()) -} - fn assert_zoom_in(mathml: &str, expected: &str) -> Result<()> { init_panic_handler(); let result = catch_unwind(AssertUnwindSafe(|| { - init_nav(mathml)?; + init_nav("ru", mathml)?; let speech = do_navigate_command("ZoomIn")?; let trimmed_speech = speech.trim_end_matches([' ', ',', ';']).to_string(); assert_eq!(expected, trimmed_speech); diff --git a/tests/common/mod.rs b/tests/common/mod.rs index 6b42a25b8..837fca05b 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -75,6 +75,17 @@ fn set_default_speech_prefs() { prefs.set_user_prefs("Impairment", "Blindness").unwrap(); }); } + +/// Initialize navigation prefs + MathML for `tests/Languages/*/navigate.rs`. +/// Uses the same prefs as `src/navigate.rs` tests via [`set_navigation_test_preferences`], +/// except `AutoZoomOut` is false (language ZoomIn speech tests need that). +#[allow(dead_code)] // used in testing +pub fn init_nav(language: &str, mathml: &str) -> Result<()> { + set_rules_dir(abs_rules_dir_path())?; + set_navigation_test_preferences(language, "Enhanced", false)?; + set_mathml(mathml)?; + Ok(()) +} // Compare the result of speaking the mathml input to the output 'speech' // This uses default preferences #[allow(dead_code)] // used in testing From d3b7970e38fa073e1f187afb6537e37d6b9ab859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Tue, 8 Sep 2026 05:59:07 +0200 Subject: [PATCH 092/162] Fix pica unit parsing in spacing width conversion (#755) --- src/xpath_functions.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/xpath_functions.rs b/src/xpath_functions.rs index 97e1db5ee..17b6d360b 100644 --- a/src/xpath_functions.rs +++ b/src/xpath_functions.rs @@ -1408,9 +1408,10 @@ pub struct FontSizeGuess; /// "" // returns original node match isn't found impl FontSizeGuess { + /// Returns an estimated width in em units, using an assumed 12-point font for conversions. pub fn em_from_value(value_with_unit: &str) -> f64 { // match one or more digits followed by a unit -- there are many more units, but they tend to be large and rarer(?) - static FONT_VALUE: LazyLock = LazyLock::new(|| { Regex::new(r"(-?[0-9]*\.?[0-9]*)(px|cm|mm|Q|in|ppc|pt|ex|em|rem)").unwrap() }); + static FONT_VALUE: LazyLock = LazyLock::new(|| { Regex::new(r"(-?[0-9]*\.?[0-9]*)(px|cm|mm|Q|in|pc|pt|ex|em|rem)").unwrap() }); let cap = FONT_VALUE.captures(value_with_unit); if let Some(cap) = cap { if cap.len() == 3 { @@ -1784,6 +1785,16 @@ mod tests { return Ok( () ); } + // Pica widths must use the existing 12pt font estimate: 1pc, 12pt, and 1em are equivalent. + #[test] + fn font_size_guess_pica_widths() { + assert_eq!(FontSizeGuess::em_from_value("1pc"), 1.0); + assert_eq!(FontSizeGuess::em_from_value("0.5pc"), 0.5); + assert_eq!(FontSizeGuess::em_from_value("-1pc"), -1.0); + assert_eq!(FontSizeGuess::em_from_value("12pt"), 1.0); + assert_eq!(FontSizeGuess::em_from_value("1em"), 1.0); + } + #[test] fn ordinal_one_digit() -> Result<()> { return xpath_test(|| { From 07149291fde5258e24148f18139082d49ebf2016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Arborealis=20L=C3=B6tberg?= <143188129+TimArborealis@users.noreply.github.com> Date: Tue, 8 Sep 2026 09:34:46 +0200 Subject: [PATCH 093/162] Update chemistry.rs --- tests/Languages/sv/chemistry.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/Languages/sv/chemistry.rs b/tests/Languages/sv/chemistry.rs index 6332997fc..09612bd26 100644 --- a/tests/Languages/sv/chemistry.rs +++ b/tests/Languages/sv/chemistry.rs @@ -160,9 +160,9 @@ fn beta_decay() -> Result<()> { test_prefs("sv", "ClearSpeak", vec![("Verbosity", "Terse")], expr, "14, 6, versal c; bildar, 14, 7, versal n; plus 0, minus 1, e")?; test_prefs("sv", "ClearSpeak", vec![("Verbosity", "Medium")], expr, - "upphöjt 14, nedsĂ€nkt 6, versal c; reaktion bildar; upphöjt 14, nedsĂ€nkt 7, versal n; plus, upphöjt 0, nedsĂ€nkt minus 1, e")?; + "upphöjt 14, nedsĂ€nkt 6, versal c; reagerar och bildar; upphöjt 14, nedsĂ€nkt 7, versal n; plus, upphöjt 0, nedsĂ€nkt minus 1, e")?; test_prefs("sv", "ClearSpeak", vec![("Verbosity", "Verbose")], expr, - "övre index 14, nedre index 6, versal c; reaktion bildar; övre index 14, nedre index 7, versal n; plus, övre index 0, nedre index minus 1, e")?; + "övre index 14, nedre index 6, versal c; reagerar och bildar; övre index 14, nedre index 7, versal n; plus, övre index 0, nedre index minus 1, e")?; return Ok(()); } @@ -426,9 +426,9 @@ fn mhchem_beta_decay() -> Result<()> { test_prefs("sv", "ClearSpeak", vec![("Verbosity", "Terse")], expr, "14, 6, versal c; bildar, 14, 7, versal n; plus 0, minus 1, e")?; test_prefs("sv", "ClearSpeak", vec![("Verbosity", "Medium")], expr, - "upphöjt 14, nedsĂ€nkt 6, versal c; reaktion bildar; upphöjt 14, nedsĂ€nkt 7, versal n; plus, upphöjt 0, nedsĂ€nkt minus 1, e")?; + "upphöjt 14, nedsĂ€nkt 6, versal c; reagerar och bildar; upphöjt 14, nedsĂ€nkt 7, versal n; plus, upphöjt 0, nedsĂ€nkt minus 1, e")?; test_prefs("sv", "ClearSpeak", vec![("Verbosity", "Verbose")], expr, - "övre index 14, nedre index 6, versal c; reaktion bildar; övre index 14, nedre index 7, versal n; plus, övre index 0, nedre index minus 1, e")?; + "övre index 14, nedre index 6, versal c; reagerar och bildar; övre index 14, nedre index 7, versal n; plus, övre index 0, nedre index minus 1, e")?; return Ok(()); } @@ -443,7 +443,7 @@ fn hcl_na_yields() -> Result<()> { "; test_prefs("sv", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, - "2, versal h, versal c l; plus 2 versal n a; reaktion bildar; 2, versal n a, versal c l; plus versal h, nedre index 2")?; + "2, versal h, versal c l; plus 2 versal n a; reagerar och bildar; 2, versal n a, versal c l; plus versal h, nedre index 2")?; return Ok(()); } From d5d1933c07396b84642e6839eb8d3569340d499d Mon Sep 17 00:00:00 2001 From: Jeff Witt <1848307+wittjeff@users.noreply.github.com> Date: Sun, 13 Sep 2026 07:37:39 -0400 Subject: [PATCH 094/162] Fix "TEMP NAME of" when a parenthesized matrix is raised to a power (#762) (#763) * fix(speech): flatten nested TEMP_NAME wrappers so a matrix raised to a power is not read as "TEMP NAME of" The mrow 'matrix' intent rule replaces with a bare `x: "*[2]"`, so its result is wrapped in the internal TEMP_NAME transport element; the parent `power` rule's `x: "*[1]"` wraps it again and lift_children only stripped one level. The leftover wrapper reached the generic function-intent speech rule, which spoke its name: "TEMP NAME of the 2 by 2 matrix; ...; squared" (#762). lift_children now flattens nested wrappers recursively. A leaf wrapper holding text is still only unwrapped as a direct child, matching the previous behavior. Two regression tests added to tests/Languages/en/mtable.rs; no goldens changed. Fixes #762 Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01U86v5m1m8oaLSy5UsNbBpc * Simplify condition in push_lifted function Fixes clippy warning * Fix indent and delete extra "}" I should have deleted on the last change --------- Co-authored-by: Claude Fable 5.1 Co-authored-by: NSoiffer --- src/speech.rs | 32 ++++++++++++++++++-------- tests/Languages/en/mtable.rs | 44 ++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 10 deletions(-) diff --git a/src/speech.rs b/src/speech.rs index 100d5ff39..544ce35c7 100644 --- a/src/speech.rs +++ b/src/speech.rs @@ -709,24 +709,36 @@ impl Intent { /// "lift" up the children any "TEMP_NAME" child -- could short circuit when only one child + /// + /// TEMP_NAME is only ever a transport wrapper created by `replace_nodes_tree`, so wrappers can nest: + /// a rule whose replacement is a bare `x:` (e.g., the mrow 'matrix' rule returns `x: "*[2]"`) yields + /// TEMP_NAME(matrix), and the parent intent's `x: "*[1]"` wraps that again. Lifting only one level left + /// `power(TEMP_NAME(matrix), 2)`, spoken as "TEMP NAME of the 2 by 2 matrix ... squared" (issue #762). + /// Nested wrappers whose children are all elements are flattened; a leaf wrapper (text from a Text or + /// Attribute node) is only unwrapped when it is a direct child, matching the previous behavior. fn lift_children(result: Element) -> Element { // debug!("lift_children:\n{}", mml_to_string(result)); // most likely there will be the same number of new children as result has, but there could be more let mut new_children = Vec::with_capacity(2*result.children().len()); for child_of_element in result.children() { - match child_of_element { - ChildOfElement::Element(child) => { - if name(child) == "TEMP_NAME" { - new_children.append(&mut child.children()); // almost always just one - } else { - new_children.push(child_of_element); - } - }, - _ => new_children.push(child_of_element), // text() - } + push_lifted(child_of_element, &mut new_children, true); } result.replace_children(new_children); return result; + + fn push_lifted<'a>(child_of_element: ChildOfElement<'a>, new_children: &mut Vec>, is_direct_child: bool) { + if let ChildOfElement::Element(child) = child_of_element && name(child) == "TEMP_NAME" { + let grandchildren = child.children(); + let is_leaf_wrapper = grandchildren.iter().any(|gc| matches!(gc, ChildOfElement::Text(_))); + if is_direct_child || !is_leaf_wrapper { + for grandchild in grandchildren { + push_lifted(grandchild, new_children, false); + } + return; + } + } + new_children.push(child_of_element); + } } } } diff --git a/tests/Languages/en/mtable.rs b/tests/Languages/en/mtable.rs index 8a670988e..e2d063689 100644 --- a/tests/Languages/en/mtable.rs +++ b/tests/Languages/en/mtable.rs @@ -1390,3 +1390,47 @@ fn single_line_with_label() -> Result<()> { expr, "1 equation, with label 2; b equals 2")?; return Ok(()); } + +#[test] +fn matrix_raised_to_power() -> Result<()> { + // A parenthesized matrix as the base of msup must speak as "the matrix ... squared". + // Regression for #762: the mrow 'matrix' intent rule returns a bare `x:`, so the intent tree + // carried a nested TEMP_NAME wrapper into `power` and NVDA read "TEMP NAME of the 2 by 2 matrix ...". + let expr = " + ( + + 12 + 34 + + ) + 2 + "; + test("en", "ClearSpeak", expr, "the 2 by 2 matrix; row 1; 1, 2; row 2; 3, 4; squared") +} + +#[test] +fn matrix_raised_to_power_lualatex_spacing() -> Result<()> { + // The exact MathML from #762 (LuaLaTeX pmatrix output): negative-width mspace around the + // table and fence attributes on the parens. Canonicalization must fold the spacing away so + // the matrix is still recognized as the base of the power. + let expr = " + + + ( + + + + + 12 + 34 + + + + + ) + + 2 + + "; + test("en", "ClearSpeak", expr, "the 2 by 2 matrix; row 1; 1, 2; row 2; 3, 4; squared") +} From 8ef6ee1b134262b7f6db24851ca2da2588052b82 Mon Sep 17 00:00:00 2001 From: "U-rainshowers\\neils" Date: Tue, 15 Sep 2026 10:59:32 +1000 Subject: [PATCH 095/162] Fix typo in fallback --- src/speech.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/speech.rs b/src/speech.rs index 544ce35c7..6d5b252a7 100644 --- a/src/speech.rs +++ b/src/speech.rs @@ -293,7 +293,7 @@ pub fn process_include(current_file: &Path, new_file_name: &str, mut read_new // get the subdir ...Rules/Braille/en/... // could have ...Rules/Braille/definitions.yaml, so 'next()' doesn't exist in this case, but the file wasn't zipped up if let Some(subdir) = new_file.strip_prefix(unzip_dir).unwrap().iter().next() { - let default_lang = if unzip_dir.ends_with("Languages") {"en"} else {"UEB;"}; + let default_lang = if unzip_dir.ends_with("Languages") {"en"} else {"UEB"}; PreferenceManager::unzip_files(unzip_dir, subdir.to_str().unwrap(), Some(default_lang)).unwrap_or_default(); } } @@ -2868,8 +2868,6 @@ pub fn braille_replace_chars(str: &str, mathml: Element) -> Result { ), Err(e) => Err(e), } - - }) } From 87f4c590a497acaa5daeb2b9864493760e3b0f15 Mon Sep 17 00:00:00 2001 From: "U-rainshowers\\neils" Date: Tue, 15 Sep 2026 11:01:03 +1000 Subject: [PATCH 096/162] The word "of" was hard-coded into intents. This moves its value to definitions.yaml. This also cleans up some really old code that tried to figure out if what was read was a vector or hashmap/hashset. Fixes #739. --- Rules/Languages/en/definitions.yaml | 7 +++ src/definitions.rs | 69 +++++++++++++++++------------ src/infer_intent.rs | 17 ++++--- 3 files changed, 60 insertions(+), 33 deletions(-) diff --git a/Rules/Languages/en/definitions.yaml b/Rules/Languages/en/definitions.yaml index c71e10b89..9a720e7f4 100644 --- a/Rules/Languages/en/definitions.yaml +++ b/Rules/Languages/en/definitions.yaml @@ -363,6 +363,13 @@ "chemistry-concentration": "function= ; concentration: concentration of: the concentration of; end concentration", } + # The connector word to say for functional 'IntentMappings' (in English, "of") + # This is likely the word used for U+2061 in unicode.yaml, but for technical reasons needs to be defined here + # vector of length=1 because scalars not supported +- FunctionApplicationWord: [ + "of", "foo" + ] + # Names of functions that in terse mode don't say "of" (or it's equivalent in other languages) - TerseFunctionNames: { "divergence", "del:gradient", "curl" diff --git a/src/definitions.rs b/src/definitions.rs index 489c25b61..b7c45fca9 100644 --- a/src/definitions.rs +++ b/src/definitions.rs @@ -141,9 +141,20 @@ pub fn read_definitions_file(use_speech_defs: bool) -> Result> { let file_path = pref_manager.get_definitions_file(use_speech_defs); let definitions = if use_speech_defs {&SPEECH_DEFINITIONS} else {&BRAILLE_DEFINITIONS}; definitions.with( |defs| defs.borrow_mut().name_to_var_mapping.clear() ); - let mut new_files = vec![file_path.to_path_buf()]; - let mut files_read = read_one_definitions_file(use_speech_defs, file_path).with_context(|| format!("in file '{}", file_path.to_string_lossy()))?; - new_files.append(&mut files_read); + let mut files_read = read_one_definitions_file(use_speech_defs, file_path) + .with_context(|| format!("in file '{}'", file_path.to_string_lossy()))?; + let mut seen: HashSet = HashSet::with_capacity(files_read.len()); + let mut new_files: Vec = Vec::with_capacity(files_read.len()); + for p in files_read.drain(..) { + let canon = match crate::shim_filesystem::canonicalize_shim(&p) { + Ok(c) => c, + Err(_) => p, + }; + let key = canon.to_string_lossy().to_string(); + if seen.insert(key) { + new_files.push(canon); + } + } // merge the contents of `TrigFunctions` into a set that contains all the function names (from `AdditionalFunctionNames`). return definitions.with(|defs| { @@ -228,39 +239,21 @@ fn build_values(definition: &Yaml, use_speech_defs: bool, path: &Path) -> Result return Ok( Some(crate::speech::process_include(path, include_file_name, do_include_fn)?) ); } - let result; - if def_name.starts_with("Numbers") || def_name.ends_with("_vec") { - result = Contains::Vec( Rc::new( RefCell::new( get_vec_values(value.as_vec().unwrap())? ) ) ); + let result = if let Some(vec) = value.as_vec() { + Contains::Vec( Rc::new( RefCell::new( get_vec_values(vec)? ) ) ) } else { - // match value.as_vec() { - // Some(vec) => { - // result = Contains::Set( Rc::new( RefCell::new( get_set_values(vec)? ) ) ); }, - // None => { - // let dict = value.as_hash().ok_or_else(|| anyhow!("definition list value '{}' is not an array or dictionary", yaml_to_type(value)))?; - // result = Contains::Map( Rc::new( RefCell::new( get_map_values(dict) - // .chain_err(||format!("while reading value '{}'", def_name))? ) ) ); - - // }, - // } let dict = value.as_hash().ok_or_else(|| anyhow!("definition list value '{}' is not an array or dictionary", yaml_to_type(value)))?; if dict.is_empty() { - result = Contains::Set( Rc::new( RefCell::new( HashSet::with_capacity(0) ) ) ); + Contains::Set( Rc::new( RefCell::new( HashSet::with_capacity(0) ) ) ) } else { // peak and see if this is a set or a map let (_, entry_value) = dict.iter().next().unwrap(); if entry_value.is_null() { - result = Contains::Set( Rc::new( RefCell::new( get_set_values(dict) - .with_context(||format!("while reading value '{def_name}'"))? ) ) ); + Contains::Set( Rc::new( RefCell::new( get_set_values(dict) + .with_context(||format!("while reading value '{def_name}'"))? ) ) ) } else { - // peak and see if this is a set or a map - let (_, entry_value) = dict.iter().next().unwrap(); - if entry_value.is_null() { - result = Contains::Set( Rc::new( RefCell::new( get_set_values(dict) - .with_context(||format!("while reading value '{def_name}'"))? ) ) ); - } else { - result = Contains::Map( Rc::new( RefCell::new( get_map_values(dict) - .with_context(||format!("while reading value '{def_name}'"))? ) ) ); - } + Contains::Map( Rc::new( RefCell::new( get_map_values(dict) + .with_context(||format!("while reading value '{def_name}'"))? ) ) ) } } }; @@ -369,6 +362,26 @@ mod tests { }); } + #[test] + fn test_vec_not_numbers() { + let function_application_word = r#"[FunctionApplicationWord: ["of"]]"#; + let defs_build_fn = |variable_def_list: &Yaml| { + for variable_def in variable_def_list.as_vec().unwrap() { + if let Err(e) = build_values(variable_def, true, Path::new("")) { + bail!("{}", crate::interface::errors_to_string(&e.context(format!("in file {:?}", function_application_word)))); + } + } + return Ok(vec![]); + }; + compile_rule(function_application_word, defs_build_fn).unwrap(); + SPEECH_DEFINITIONS.with(|defs| { + let defs = defs.borrow(); + let word = defs.get_vec("FunctionApplicationWord"); + assert!(word.is_some()); + assert_eq!(word.unwrap().as_slice(), ["of"]); + }); + } + #[test] fn test_hashmap() { let units = r#"[Units: {"A": "amp", "g": "gram", "m": "meter", "sec": "second"}]"#; diff --git a/src/infer_intent.rs b/src/infer_intent.rs index 4dc0b3d2e..81cbb9933 100644 --- a/src/infer_intent.rs +++ b/src/infer_intent.rs @@ -314,19 +314,26 @@ pub fn intent_function_has_arity_match(intent_name: &str, fixity: &str, arg_coun /// Spoken glue immediately before argument `arg_index` (1-based) when using an arity template. /// Empty when not in a matching arity template (caller uses separator/`of` path instead). pub fn intent_function_glue_before(intent_name: &str, fixity: &str, arg_index: usize, arg_count: usize) -> String { - let Some(after_eq) = intent_mapping_for_fixity(intent_name, fixity) else { return String::new(); }; if !intent_function_is_arity_mode(intent_name, fixity) { return String::new(); } - let Some(words) = intent_function_arity_glue(&after_eq, arg_count) else { return String::new(); }; - // words has arg_count-1 entries for args 1..arg_count-1; last arg is preceded by "of" if arg_index == arg_count { - return "of".to_string(); + return crate::definitions::SPEECH_DEFINITIONS.with(|definitions| { + let definitions = definitions.borrow(); + let word_ref = definitions.get_vec("FunctionApplicationWord"); + if let Some(word) = word_ref && !word.is_empty() { + return word[0].clone(); + } + return String::new(); + }) } + let Some(after_eq) = intent_mapping_for_fixity(intent_name, fixity) else { return String::new(); }; + let Some(words) = intent_function_arity_glue(&after_eq, arg_count) else { return String::new(); }; + // words has arg_count-1 entries for args 1..arg_count-1; last arg is preceded by "of" if arg_index >= 1 && arg_index < arg_count { return words[arg_index - 1].to_string(); } - String::new() + return String::new(); } /// Separator between args when not using an arity template. From a74a6e2d45f1f0ca454091d75d56b4335c9a8e88 Mon Sep 17 00:00:00 2001 From: "U-rainshowers\\neils" Date: Tue, 15 Sep 2026 11:16:18 +1000 Subject: [PATCH 097/162] remove value used in debugging --- Rules/Languages/en/definitions.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Rules/Languages/en/definitions.yaml b/Rules/Languages/en/definitions.yaml index 9a720e7f4..bd3931549 100644 --- a/Rules/Languages/en/definitions.yaml +++ b/Rules/Languages/en/definitions.yaml @@ -366,9 +366,7 @@ # The connector word to say for functional 'IntentMappings' (in English, "of") # This is likely the word used for U+2061 in unicode.yaml, but for technical reasons needs to be defined here # vector of length=1 because scalars not supported -- FunctionApplicationWord: [ - "of", "foo" - ] +- FunctionApplicationWord: ["of"] # Names of functions that in terse mode don't say "of" (or it's equivalent in other languages) - TerseFunctionNames: { From 2622ee5b2ef2bc3294ee50b1a520e2d65e2f3f1f Mon Sep 17 00:00:00 2001 From: Danil <81031453+Kostenkov-2021@users.noreply.github.com> Date: Sat, 19 Sep 2026 11:19:58 +0300 Subject: [PATCH 098/162] Fix audit-ignore rule scoping Adjust the audit-translations parser so `# audit-ignore` markers immediately above a rule apply to that rule, while still supporting existing inline markers inside a rule block. This also clarifies the documented behavior and adds regression tests for leading, inline, and first-item ignore cases. --- PythonScripts/audit_translations/README.md | 3 +- PythonScripts/audit_translations/parsers.py | 17 +++++-- .../audit_translations/tests/test_parsers.py | 47 +++++++++++++++++++ 3 files changed, 61 insertions(+), 6 deletions(-) diff --git a/PythonScripts/audit_translations/README.md b/PythonScripts/audit_translations/README.md index 8aedf1265..fe391d49b 100644 --- a/PythonScripts/audit_translations/README.md +++ b/PythonScripts/audit_translations/README.md @@ -12,7 +12,8 @@ The tool analyzes rule files to detect the following issues: * **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. +Add `# audit-ignore` on the line immediately before a rule to suppress auditing +that rule. Existing markers inside a rule block are also supported. --- diff --git a/PythonScripts/audit_translations/parsers.py b/PythonScripts/audit_translations/parsers.py index 11dfc5292..a96de8bef 100644 --- a/PythonScripts/audit_translations/parsers.py +++ b/PythonScripts/audit_translations/parsers.py @@ -149,13 +149,20 @@ def format_tag(tag_value: Any) -> str | None: def build_raw_blocks(lines: list[str], starts: list[int]) -> list[str]: - blocks = [] if not starts: - return blocks + return [] + + block_starts = starts.copy() for idx, start in enumerate(starts): - end = starts[idx + 1] if idx + 1 < len(starts) else len(lines) - blocks.append("\n".join(lines[start:end])) - return blocks + lower_bound = starts[idx - 1] + 1 if idx else 0 + while start > lower_bound and (not lines[start - 1].strip() or lines[start - 1].lstrip().startswith("#")): + start -= 1 + block_starts[idx] = start + + return [ + "\n".join(lines[start : block_starts[idx + 1] if idx + 1 < len(block_starts) else len(lines)]) + for idx, start in enumerate(block_starts) + ] def _extract_item_fields(item: Any, is_unicode: bool) -> tuple[str, str | None, str | None, Any] | None: diff --git a/PythonScripts/audit_translations/tests/test_parsers.py b/PythonScripts/audit_translations/tests/test_parsers.py index db7f31e1f..a8d1c36db 100644 --- a/PythonScripts/audit_translations/tests/test_parsers.py +++ b/PythonScripts/audit_translations/tests/test_parsers.py @@ -174,6 +174,53 @@ def test_detects_audit_ignore(self): rules = parse_rules_file(content, data) assert rules[0].audit_ignore + def test_assigns_leading_audit_ignore_to_following_rule(self): + """A marker directly above a rule suppresses that rule, not its neighbour.""" + content = """- name: first + tag: mo + match: "." + +# audit-ignore: the following placeholder intentionally differs +# from the source-language rule. +- name: second + tag: mi + match: "false()" +""" + yaml = YAML() + data = yaml.load(content) + rules = parse_rules_file(content, data) + assert not rules[0].audit_ignore + assert rules[1].audit_ignore + + def test_keeps_audit_ignore_inside_rule(self): + """Existing markers within a rule block remain supported.""" + content = """- name: first + tag: mo + # audit-ignore + match: "." + +- name: second + tag: mi + match: "x" +""" + yaml = YAML() + data = yaml.load(content) + rules = parse_rules_file(content, data) + assert rules[0].audit_ignore + assert not rules[1].audit_ignore + + def test_assigns_file_header_to_first_rule(self): + """A leading marker before the first item is included in its raw block.""" + content = """# audit-ignore +- name: first + tag: mo + match: "." +""" + yaml = YAML() + data = yaml.load(content) + rules = parse_rules_file(content, data) + assert rules[0].audit_ignore + def test_handles_array_tag(self): """Ensure handles array tag.""" content = """- name: multi-tag From a6e65c80560ff302a82b6e821cd8758ce0aace03 Mon Sep 17 00:00:00 2001 From: dtsengchromium Date: Sat, 19 Sep 2026 04:39:38 -0700 Subject: [PATCH 099/162] Add in-memory virtual filesystem support to shim_filesystem (#760) * Add in-memory virtual filesystem support to shim_filesystem * Fix clippy warnings across codebase and tests --- src/prefs.rs | 14 +-- src/shim_filesystem.rs | 105 ++++++++++++++++---- tests/Languages/pt/ClearSpeak/sets.rs | 48 ++++----- tests/Languages/pt/SimpleSpeak/functions.rs | 30 +++--- tests/Languages/pt/escuta.rs | 12 +-- tests/Languages/pt/intent.rs | 25 +++-- tests/Languages/pt/shared.rs | 36 +++---- tests/Languages/pt/units.rs | 36 +++---- 8 files changed, 180 insertions(+), 126 deletions(-) diff --git a/src/prefs.rs b/src/prefs.rs index 4dc51c4bc..89748119f 100644 --- a/src/prefs.rs +++ b/src/prefs.rs @@ -261,17 +261,9 @@ impl PreferenceManager { // 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) => { - if rules_dir.is_absolute() { - rules_dir - } else { - std::env::current_dir() - .unwrap_or_default() - .join(&rules_dir) - } - }, - Ok(rules_dir) => rules_dir, + let rules_dir = match canonicalize_shim(&rules_dir) { + Err(e) => bail!("set_rules_dir: could not canonicalize path {}: {}", rules_dir.display(), e), + Ok(rules_dir) => rules_dir, }; self.set_rules_dir(&rules_dir)?; diff --git a/src/shim_filesystem.rs b/src/shim_filesystem.rs index 14c5b26fb..d539a6300 100644 --- a/src/shim_filesystem.rs +++ b/src/shim_filesystem.rs @@ -281,15 +281,81 @@ cfg_if! { crate::interface::set_rules_dir("Rules").unwrap(); // force reinitialization after the change } } else { + use std::collections::{HashMap, HashSet}; + use std::sync::RwLock; + + static IN_MEMORY_FILES: RwLock>> = RwLock::new(None); + static IN_MEMORY_DIRS: RwLock>> = RwLock::new(None); + + pub fn add_in_memory_file(path: &str, content: &str) { + { + let mut files = IN_MEMORY_FILES.write().unwrap(); + files.get_or_insert_with(HashMap::new).insert(path.to_string(), content.to_string()); + } + + let path_obj = Path::new(path); + { + let mut dirs = IN_MEMORY_DIRS.write().unwrap(); + let dirs = dirs.get_or_insert_with(HashSet::new); + for parent in path_obj.ancestors().skip(1) { + let parent_str = parent.to_str().unwrap_or_default(); + if !parent_str.is_empty() { + dirs.insert(parent_str.to_string()); + } + } + } + } + + pub fn canonicalize_shim(path: &Path) -> std::io::Result { + use std::ffi::OsStr; + let dot = OsStr::new("."); + let dot_dot = OsStr::new(".."); + let mut result = PathBuf::new(); + for part in path.iter() { + if dot == part { + continue; + } else if dot_dot == part { + result.pop(); + } else { + result.push(part); + } + } + return Ok(result); + } + + fn get_in_memory_key(path: &Path) -> String { + canonicalize_shim(path).unwrap_or_else(|_| path.to_path_buf()).to_str().unwrap_or_default().to_string() + } + pub fn is_file_shim(path: &Path) -> bool { + if IN_MEMORY_FILES.read().unwrap().as_ref().is_some_and(|f| f.contains_key(&get_in_memory_key(path))) { + return true; + } return path.is_file(); } pub fn is_dir_shim(path: &Path) -> bool { + if IN_MEMORY_DIRS.read().unwrap().as_ref().is_some_and(|d| d.contains(&get_in_memory_key(path))) { + return true; + } return path.is_dir(); } pub fn find_files_in_dir_that_ends_with_shim(dir: &Path, ending: &str) -> Vec { + let dir_name = get_in_memory_key(dir); + let mut answer = Vec::new(); + if let Some(files) = IN_MEMORY_FILES.read().unwrap().as_ref() { + for file_name in files.keys() { + if file_name.starts_with(&dir_name) && file_name.ends_with(ending) { + let name = Path::new(file_name).file_name().unwrap_or_default().to_str().unwrap_or_default(); + answer.push(name.to_string()); + } + } + } + if !answer.is_empty() { + return answer; + } + match dir.read_dir() { Err(_) => return vec![], // empty Ok(read_dir) => { @@ -340,27 +406,6 @@ 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 { - 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)) - } - } - } - } - // Tests extract language/braille zips in parallel. During extraction, individual YAML // files can briefly exist in a partially-written state (created/truncated before the // full contents are flushed). Guard both extraction and YAML reads with the same lock @@ -379,6 +424,10 @@ cfg_if! { } pub fn read_to_string_shim(path: &Path) -> Result { + if let Some(content) = IN_MEMORY_FILES.read().unwrap().as_ref().and_then(|f| f.get(&get_in_memory_key(path)).cloned()) { + return Ok(content); + } + let path = match path.canonicalize() { Ok(path) => path, Err(_) => path.to_path_buf(), @@ -490,4 +539,18 @@ mod tests { assert_eq!("test-value", read_to_string_shim(&existing_file).unwrap()); assert!(read_to_string_shim(&test_dir.path().join("does-not-exist.yaml")).is_err()); } + + #[test] + fn in_memory_filesystem_shim() { + add_in_memory_file("virtual/rules/Languages/en/test_Rules.yaml", "key: value"); + let file_path = Path::new("virtual/rules/Languages/en/test_Rules.yaml"); + let dir_path = Path::new("virtual/rules/Languages/en"); + + assert!(is_file_shim(file_path)); + assert!(is_dir_shim(dir_path)); + assert_eq!(read_to_string_shim(file_path).unwrap(), "key: value"); + + let found = find_files_in_dir_that_ends_with_shim(dir_path, "_Rules.yaml"); + assert_eq!(found, vec!["test_Rules.yaml".to_string()]); + } } diff --git a/tests/Languages/pt/ClearSpeak/sets.rs b/tests/Languages/pt/ClearSpeak/sets.rs index ff2ee45cd..87923aeac 100644 --- a/tests/Languages/pt/ClearSpeak/sets.rs +++ b/tests/Languages/pt/ClearSpeak/sets.rs @@ -1,27 +1,27 @@ -/// Testes de conjuntos e pertinĂȘncia — pt-BR, ClearSpeak e SimpleSpeak. -/// -/// POR QUE ESTE ARQUIVO EXISTE -/// O par ∈ / ∊ falou "Ă© membro de" com as preferĂȘncias padrĂŁo durante duas -/// rodadas inteiras sem ninguĂ©m notar, porque o pt nĂŁo tinha NENHUM teste de -/// pertinĂȘncia — nem ClearSpeak, nem SimpleSpeak. O ∉ foi corrigido sozinho -/// numa rodada e os outros dois ficaram para trĂĄs. Ver ACHADOS 7.8. -/// -/// A invariante que este arquivo trava: **∈ (0x2208) e ∊ (0x220a) sĂŁo -/// variantes de forma do mesmo sĂ­mbolo e devem falar igual em todos os ramos** -/// — nas cinco preferĂȘncias de ClearSpeak_SetMemberSymbol, dentro e fora de -/// um conjunto, nos dois estilos de fala. -/// -/// COMO AS EXPECTATIVAS FORAM ESCRITAS -/// Todas saĂ­ram da saĂ­da real do motor, nunca de tradução do inglĂȘs. O mĂ©todo -/// Ă© o do cabeçalho de tests/Languages/pt/shared.rs: rodar, comparar `left` -/// com `right`, e se o gerado estiver certo em portuguĂȘs, copiĂĄ-lo; se estiver -/// errado, consertar a REGRA, nunca o teste. -/// -/// Cada teste de pertinĂȘncia fixa ClearSpeak_SetMemberSymbol explicitamente, -/// inclusive no caso 'Auto'. Isso Ă© de propĂłsito: as preferĂȘncias de -/// ClearSpeak nĂŁo sĂŁo reinicializadas entre testes na mesma thread, entĂŁo um -/// teste que dependesse do padrĂŁo implĂ­cito poderia passar ou falhar conforme -/// a ordem de execução. +//! Testes de conjuntos e pertinĂȘncia — pt-BR, ClearSpeak e SimpleSpeak. +//! +//! POR QUE ESTE ARQUIVO EXISTE +//! O par ∈ / ∊ falou "Ă© membro de" com as preferĂȘncias padrĂŁo durante duas +//! rodadas inteiras sem ninguĂ©m notar, porque o pt nĂŁo tinha NENHUM teste de +//! pertinĂȘncia — nem ClearSpeak, nem SimpleSpeak. O ∉ foi corrigido sozinho +//! numa rodada e os outros dois ficaram para trĂĄs. Ver ACHADOS 7.8. +//! +//! A invariante que este arquivo trava: **∈ (0x2208) e ∊ (0x220a) sĂŁo +//! variantes de forma do mesmo sĂ­mbolo e devem falar igual em todos os ramos** +//! — nas cinco preferĂȘncias de ClearSpeak_SetMemberSymbol, dentro e fora de +//! um conjunto, nos dois estilos de fala. +//! +//! COMO AS EXPECTATIVAS FORAM ESCRITAS +//! Todas saĂ­ram da saĂ­da real do motor, nunca de tradução do inglĂȘs. O mĂ©todo +//! Ă© o do cabeçalho de tests/Languages/pt/shared.rs: rodar, comparar `left` +//! com `right`, e se o gerado estiver certo em portuguĂȘs, copiĂĄ-lo; se estiver +//! errado, consertar a REGRA, nunca o teste. +//! +//! Cada teste de pertinĂȘncia fixa ClearSpeak_SetMemberSymbol explicitamente, +//! inclusive no caso 'Auto'. Isso Ă© de propĂłsito: as preferĂȘncias de +//! ClearSpeak nĂŁo sĂŁo reinicializadas entre testes na mesma thread, entĂŁo um +//! teste que dependesse do padrĂŁo implĂ­cito poderia passar ou falhar conforme +//! a ordem de execução. use crate::common::*; use anyhow::Result; diff --git a/tests/Languages/pt/SimpleSpeak/functions.rs b/tests/Languages/pt/SimpleSpeak/functions.rs index a656c2da0..1429d1447 100644 --- a/tests/Languages/pt/SimpleSpeak/functions.rs +++ b/tests/Languages/pt/SimpleSpeak/functions.rs @@ -1,18 +1,18 @@ -/// TESTES DO IDIOMA pt — como reconciliar com as regras -/// -/// As strings esperadas abaixo foram escritas para refletir a intenção -/// das regras em Rules/Languages/pt. VĂ­rgulas e ponto-e-vĂ­rgula marcam -/// PAUSAS inseridas pelo motor e podem divergir levemente na primeira -/// execução. MĂ©todo do guia oficial de tradutores: -/// 1. rode `cargo test Languages::pt` -/// 2. para cada falha, compare `left` (esperado) com `right` (gerado) -/// 3. se o GERADO estiver correto em portuguĂȘs, copie-o para o teste; -/// se estiver errado, conserte a REGRA, nunca o teste. -/// -/// ATENÇÃO ao histĂłrico: o arquivo espanhol equivalente continha testes -/// que nĂŁo refletiam as regras (ex.: esperava "logaritmo natural" com a -/// regra dizendo "natural log") e dano de busca-e-troca (ex.: "eigh"→"8"). -/// NĂŁo herde strings esperadas de es/ sem conferir. +//! TESTES DO IDIOMA pt — como reconciliar com as regras +//! +//! As strings esperadas abaixo foram escritas para refletir a intenção +//! das regras em Rules/Languages/pt. VĂ­rgulas e ponto-e-vĂ­rgula marcam +//! PAUSAS inseridas pelo motor e podem divergir levemente na primeira +//! execução. MĂ©todo do guia oficial de tradutores: +//! 1. rode `cargo test Languages::pt` +//! 2. para cada falha, compare `left` (esperado) com `right` (gerado) +//! 3. se o GERADO estiver correto em portuguĂȘs, copie-o para o teste; +//! se estiver errado, conserte a REGRA, nunca o teste. +//! +//! ATENÇÃO ao histĂłrico: o arquivo espanhol equivalente continha testes +//! que nĂŁo refletiam as regras (ex.: esperava "logaritmo natural" com a +//! regra dizendo "natural log") e dano de busca-e-troca (ex.: "eigh"→"8"). +//! NĂŁo herde strings esperadas de es/ sem conferir. use crate::common::*; use anyhow::Result; diff --git a/tests/Languages/pt/escuta.rs b/tests/Languages/pt/escuta.rs index 812be28be..661cf4c85 100644 --- a/tests/Languages/pt/escuta.rs +++ b/tests/Languages/pt/escuta.rs @@ -2,12 +2,12 @@ use crate::common::*; fn falar(estilo: &str, verbosidade: &str, mathml: &str) -> String { set_rules_dir(abs_rules_dir_path()).unwrap(); - set_preference("Language", "pt".to_string()).unwrap(); - set_preference("SpeechStyle", estilo.to_string()).unwrap(); - set_preference("Verbosity", verbosidade.to_string()).unwrap(); - set_preference("SpeechOverrides_CapitalLetters", "".to_string()).unwrap(); - set_preference("ClearSpeak_SetMemberSymbol", "Auto".to_string()).unwrap(); - match set_mathml(mathml.to_string()) { + set_preference("Language", "pt").unwrap(); + set_preference("SpeechStyle", estilo).unwrap(); + set_preference("Verbosity", verbosidade).unwrap(); + set_preference("SpeechOverrides_CapitalLetters", "").unwrap(); + set_preference("ClearSpeak_SetMemberSymbol", "Auto").unwrap(); + match set_mathml(mathml) { Ok(_) => match get_spoken_text() { Ok(fala) => regex::Regex::new(r" +").unwrap().replace_all(&fala, " ").to_string(), Err(e) => format!("[ERRO ao falar: {}]", errors_to_string(&e)), diff --git a/tests/Languages/pt/intent.rs b/tests/Languages/pt/intent.rs index df164bc1b..cd43e0251 100644 --- a/tests/Languages/pt/intent.rs +++ b/tests/Languages/pt/intent.rs @@ -1,17 +1,16 @@ -/// TESTES DO IDIOMA pt — como reconciliar com as regras -/// -/// As strings esperadas abaixo foram escritas para refletir a intenção -/// das regras em Rules/Languages/pt. VĂ­rgulas e ponto-e-vĂ­rgula marcam -/// PAUSAS inseridas pelo motor e podem divergir levemente na primeira -/// execução. MĂ©todo do guia oficial de tradutores: -/// 1. rode `cargo test Languages::pt` -/// 2. para cada falha, compare `left` (esperado) com `right` (gerado) -/// 3. se o GERADO estiver correto em portuguĂȘs, copie-o para o teste; -/// se estiver errado, conserte a REGRA, nunca o teste. -/// +//! TESTES DO IDIOMA pt — como reconciliar com as regras +//! +//! As strings esperadas abaixo foram escritas para refletir a intenção +//! das regras em Rules/Languages/pt. VĂ­rgulas e ponto-e-vĂ­rgula marcam +//! PAUSAS inseridas pelo motor e podem divergir levemente na primeira +//! execução. MĂ©todo do guia oficial de tradutores: +//! 1. rode `cargo test Languages::pt` +//! 2. para cada falha, compare `left` (esperado) com `right` (gerado) +//! 3. se o GERADO estiver correto em portuguĂȘs, copie-o para o teste; +//! se estiver errado, conserte a REGRA, nunca o teste. -/// Tests for rules shared between various speech styles: -/// * this has tests focused on the various alphabets +// Tests for rules shared between various speech styles: +// * this has tests focused on the various alphabets use crate::common::*; use anyhow::Result; diff --git a/tests/Languages/pt/shared.rs b/tests/Languages/pt/shared.rs index cf860236b..50a28d49a 100644 --- a/tests/Languages/pt/shared.rs +++ b/tests/Languages/pt/shared.rs @@ -1,21 +1,21 @@ -/// TESTES DO IDIOMA pt — como reconciliar com as regras -/// -/// As strings esperadas abaixo foram escritas para refletir a intenção -/// das regras em Rules/Languages/pt. VĂ­rgulas e ponto-e-vĂ­rgula marcam -/// PAUSAS inseridas pelo motor e podem divergir levemente na primeira -/// execução. MĂ©todo do guia oficial de tradutores: -/// 1. rode `cargo test Languages::pt` -/// 2. para cada falha, compare `left` (esperado) com `right` (gerado) -/// 3. se o GERADO estiver correto em portuguĂȘs, copie-o para o teste; -/// se estiver errado, conserte a REGRA, nunca o teste. -/// -/// ATENÇÃO ao histĂłrico: o arquivo espanhol equivalente continha testes -/// que nĂŁo refletiam as regras (ex.: esperava "logaritmo natural" com a -/// regra dizendo "natural log") e dano de busca-e-troca (ex.: "eigh"→"8"). -/// NĂŁo herde strings esperadas de es/ sem conferir. - -/// Tests for rules shared between various speech styles: -/// * modified var +//! TESTES DO IDIOMA pt — como reconciliar com as regras +//! +//! As strings esperadas abaixo foram escritas para refletir a intenção +//! das regras em Rules/Languages/pt. VĂ­rgulas e ponto-e-vĂ­rgula marcam +//! PAUSAS inseridas pelo motor e podem divergir levemente na primeira +//! execução. MĂ©todo do guia oficial de tradutores: +//! 1. rode `cargo test Languages::pt` +//! 2. para cada falha, compare `left` (esperado) com `right` (gerado) +//! 3. se o GERADO estiver correto em portuguĂȘs, copie-o para o teste; +//! se estiver errado, conserte a REGRA, nunca o teste. +//! +//! ATENÇÃO ao histĂłrico: o arquivo espanhol equivalente continha testes +//! que nĂŁo refletiam as regras (ex.: esperava "logaritmo natural" com a +//! regra dizendo "natural log") e dano de busca-e-troca (ex.: "eigh"→"8"). +//! NĂŁo herde strings esperadas de es/ sem conferir. + +// Tests for rules shared between various speech styles: +// * modified var use crate::common::*; use anyhow::Result; diff --git a/tests/Languages/pt/units.rs b/tests/Languages/pt/units.rs index 47bd73056..cf0048f0d 100644 --- a/tests/Languages/pt/units.rs +++ b/tests/Languages/pt/units.rs @@ -1,21 +1,21 @@ -/// TESTES DO IDIOMA pt — como reconciliar com as regras -/// -/// As strings esperadas abaixo foram escritas para refletir a intenção -/// das regras em Rules/Languages/pt. VĂ­rgulas e ponto-e-vĂ­rgula marcam -/// PAUSAS inseridas pelo motor e podem divergir levemente na primeira -/// execução. MĂ©todo do guia oficial de tradutores: -/// 1. rode `cargo test Languages::pt` -/// 2. para cada falha, compare `left` (esperado) com `right` (gerado) -/// 3. se o GERADO estiver correto em portuguĂȘs, copie-o para o teste; -/// se estiver errado, conserte a REGRA, nunca o teste. -/// -/// ATENÇÃO ao histĂłrico: o arquivo espanhol equivalente continha testes -/// que nĂŁo refletiam as regras (ex.: esperava "logaritmo natural" com a -/// regra dizendo "natural log") e dano de busca-e-troca (ex.: "eigh"→"8"). -/// NĂŁo herde strings esperadas de es/ sem conferir. - -/// Tests for rules shared between various speech styles: -/// * modified var +//! TESTES DO IDIOMA pt — como reconciliar com as regras +//! +//! As strings esperadas abaixo foram escritas para refletir a intenção +//! das regras em Rules/Languages/pt. VĂ­rgulas e ponto-e-vĂ­rgula marcam +//! PAUSAS inseridas pelo motor e podem divergir levemente na primeira +//! execução. MĂ©todo do guia oficial de tradutores: +//! 1. rode `cargo test Languages::pt` +//! 2. para cada falha, compare `left` (esperado) com `right` (gerado) +//! 3. se o GERADO estiver correto em portuguĂȘs, copie-o para o teste; +//! se estiver errado, conserte a REGRA, nunca o teste. +//! +//! ATENÇÃO ao histĂłrico: o arquivo espanhol equivalente continha testes +//! que nĂŁo refletiam as regras (ex.: esperava "logaritmo natural" com a +//! regra dizendo "natural log") e dano de busca-e-troca (ex.: "eigh"→"8"). +//! NĂŁo herde strings esperadas de es/ sem conferir. + +// Tests for rules shared between various speech styles: +// * modified var use crate::common::*; use anyhow::Result; From 49de6d67c802f0f516cef11eef8f2528339f2a5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Sat, 19 Sep 2026 13:45:17 +0200 Subject: [PATCH 100/162] Refactor: Simplify match return logic and improve string interpolation readability (#774) --- src/bin/package_rules.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/bin/package_rules.rs b/src/bin/package_rules.rs index 900af235f..971e95175 100644 --- a/src/bin/package_rules.rs +++ b/src/bin/package_rules.rs @@ -37,7 +37,7 @@ fn main() -> ExitCode { return ExitCode::from(1); } - match package_rules( + return match package_rules( &cli.source, &cli.output, cli.minimize, @@ -45,15 +45,15 @@ fn main() -> ExitCode { ) { Ok(minimized) => { let label = if cli.minimize { "minimized" } else { "standard" }; - println!("Created {} archive: {}", label, cli.output.display()); + println!("Created {label} archive: {}", cli.output.display()); if cli.minimize { - println!(" minimized YAML files: {}", minimized); + println!(" minimized YAML files: {minimized}"); } - return ExitCode::SUCCESS; + ExitCode::SUCCESS } Err(e) => { - eprintln!("error: {}", e); - return ExitCode::from(1); + eprintln!("error: {e}"); + ExitCode::from(1) } } } From 5c8117e99041f74aeb4f322593ec11d1e3766d07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dziwisz?= Date: Sun, 20 Sep 2026 09:21:16 +0200 Subject: [PATCH 101/162] de, el: use $CommandOffset instead of string-length($Prefix) in navigate.yaml (#766) Ports ec36e057 to the two remaining languages that still cut the direction word out of $NavCommand with the length of the SPOKEN prefix. $NavCommand is always English (ZoomIn, MoveNext), while $Prefix is the translated word, so string-length($Prefix)+1 only lands on the right offset while the prefix happens to match the English stem. In de and el the prefixes are still the untranslated zoom/move/read/describe, so all 18 branches work today by coincidence; localizing those strings -- the obvious thing for a translator to do -- silently kills every direction word. This is a no-op right now, which is exactly why it is a good time to do it: substring($NavCommand, $CommandOffset) returns the same value as before for every one of the 15 navigation commands with the current prefixes. Verified on the engine, not only on paper: Languages::de is 209/209 both with and without this change. Greek has no tests at all (tests/Languages/el exists but is not declared in tests/languages.rs), so el rests on the structural check: offsets and the list of 9 branches are now identical to en. Refs #740. --- Rules/Languages/de/navigate.yaml | 26 +++++++++++++------------- Rules/Languages/el/navigate.yaml | 26 +++++++++++++------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Rules/Languages/de/navigate.yaml b/Rules/Languages/de/navigate.yaml index 4ff42e67a..0b5ea83e8 100644 --- a/Rules/Languages/de/navigate.yaml +++ b/Rules/Languages/de/navigate.yaml @@ -54,37 +54,37 @@ else: - test: - if: "starts-with($NavCommand, 'Zoom')" - then: [set_variables: [Prefix: "'zoom'"]] # phrase('zoom' in to see more details) + then: [set_variables: [Prefix: "'zoom'", CommandOffset: "5"]] # phrase('zoom' in to see more details) - else_if: "starts-with($NavCommand, 'Move')" - then: [set_variables: [Prefix: "'move'"]] # phrase('move' to next entry in table) + then: [set_variables: [Prefix: "'move'", CommandOffset: "5"]] # phrase('move' to next entry in table) - else_if: "starts-with($NavCommand, 'Read')" - then: [set_variables: [Prefix: "'read'"]] # phrase('read' to next entry in table) + then: [set_variables: [Prefix: "'read'", CommandOffset: "5"]] # phrase('read' to next entry in table) - else_if: "starts-with($NavCommand, 'Describe')" - then: [set_variables: [Prefix: "'describe'"]] # phrase('describe' to next entry in table) + then: [set_variables: [Prefix: "'describe'", CommandOffset: "9"]] # phrase('describe' to next entry in table) - test: if: "$Prefix != ''" then: - x: "$Prefix" - test: - - if: "substring($NavCommand, string-length($Prefix)+1) = 'In'" + - if: "substring($NavCommand, $CommandOffset) = 'In'" then: [T: "in"] # phrase(zoom 'in' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'InAll'" + - else_if: "substring($NavCommand, $CommandOffset) = 'InAll'" # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets "ed" concatenated to "zoom" then: [T: "den ganzen weg"] # phrase(zoom 'out all the way' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Out'" + - else_if: "substring($NavCommand, $CommandOffset) = 'Out'" then: [T: "raus"] # phrase(zoom 'out' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'OutAll'" + - else_if: "substring($NavCommand, $CommandOffset) = 'OutAll'" # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets "ed" concatenated to "zoom" then: [T: "den ganzen weg"] # phrase(zoom 'out all the way' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Next'" + - else_if: "substring($NavCommand, $CommandOffset) = 'Next'" then: [T: "rechten"] # phrase(move to the 'right') - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Previous'" + - else_if: "substring($NavCommand, $CommandOffset) = 'Previous'" then: [T: "linken"] # phrase(move to the 'left') - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Current'" + - else_if: "substring($NavCommand, $CommandOffset) = 'Current'" then: [T: "aktuelle"] # phrase(who is the 'current' president) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'LineStart'" + - else_if: "substring($NavCommand, $CommandOffset) = 'LineStart'" then: [T: "start der linie"] # phrase(move 'to start of line') - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'LineEnd'" + - else_if: "substring($NavCommand, $CommandOffset) = 'LineEnd'" then: [T: "bis zum ende der linie"] # phrase(move 'to end of line') - pause: "medium" - set_variables: [MatchCounter: "1"] diff --git a/Rules/Languages/el/navigate.yaml b/Rules/Languages/el/navigate.yaml index 2466efd8c..1cbfcc6f5 100644 --- a/Rules/Languages/el/navigate.yaml +++ b/Rules/Languages/el/navigate.yaml @@ -54,37 +54,37 @@ else: - test: - if: "starts-with($NavCommand, 'Zoom')" - then: [set_variables: [Prefix: "'zoom'"]] # phrase('zoom' in to see more details) + then: [set_variables: [Prefix: "'zoom'", CommandOffset: "5"]] # phrase('zoom' in to see more details) - else_if: "starts-with($NavCommand, 'Move')" - then: [set_variables: [Prefix: "'move'"]] # phrase('move' to next entry in table) + then: [set_variables: [Prefix: "'move'", CommandOffset: "5"]] # phrase('move' to next entry in table) - else_if: "starts-with($NavCommand, 'Read')" - then: [set_variables: [Prefix: "'read'"]] # phrase('read' to next entry in table) + then: [set_variables: [Prefix: "'read'", CommandOffset: "5"]] # phrase('read' to next entry in table) - else_if: "starts-with($NavCommand, 'Describe')" - then: [set_variables: [Prefix: "'describe'"]] # phrase('describe' to next entry in table) + then: [set_variables: [Prefix: "'describe'", CommandOffset: "9"]] # phrase('describe' to next entry in table) - test: if: "$Prefix != ''" then: - x: "$Prefix" - test: - - if: "substring($NavCommand, string-length($Prefix)+1) = 'In'" + - if: "substring($NavCommand, $CommandOffset) = 'In'" then: [t: "ΔΜτός"] # phrase(zoom 'in' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'InAll'" + - else_if: "substring($NavCommand, $CommandOffset) = 'InAll'" # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets "ed" concatenated to "zoom" then: [t: "\uF8FEed Ï€Î»ÎźÏÏ‰Ï‚"] #theodora. check # phrase(zoom 'out all the way' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Out'" + - else_if: "substring($NavCommand, $CommandOffset) = 'Out'" then: [t: "ΔÎșτός"] # phrase(zoom 'out' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'OutAll'" + - else_if: "substring($NavCommand, $CommandOffset) = 'OutAll'" # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets "ed" concatenated to "zoom" then: [t: "\uF8FEed Ï€Î»ÎźÏÏ‰Ï‚"] #theodora. check # phrase(zoom 'out all the way' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Next'" + - else_if: "substring($NavCommand, $CommandOffset) = 'Next'" then: [t: "ΎΔΟÎčÎŹ"] # phrase(move to the 'right') - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Previous'" + - else_if: "substring($NavCommand, $CommandOffset) = 'Previous'" then: [t: "αρÎčÏƒÏ„Î”ÏÎŹ"] # phrase(move to the 'left') - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Current'" + - else_if: "substring($NavCommand, $CommandOffset) = 'Current'" then: [t: "Ï„ÏÎ­Ï‡ÎżÎœ"] # phrase(who is the 'current' president) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'LineStart'" + - else_if: "substring($NavCommand, $CommandOffset) = 'LineStart'" then: [t: "στηΜ Î±ÏÏ‡Îź της ÎłÏÎ±ÎŒÎŒÎźÏ‚"] # phrase(move 'to start of line') - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'LineEnd'" + - else_if: "substring($NavCommand, $CommandOffset) = 'LineEnd'" then: [t: "ÏƒÏ„Îż Ï„Î­Î»ÎżÏ‚ της ÎłÏÎ±ÎŒÎŒÎźÏ‚"] # phrase(move 'to end of line') - pause: "medium" - set_variables: [MatchCounter: "$MatchCounter + 1"] From 600180b4291f0f5a5797d443e84dfb41337d29d5 Mon Sep 17 00:00:00 2001 From: Danil <81031453+Kostenkov-2021@users.noreply.github.com> Date: Sun, 20 Sep 2026 10:41:20 +0300 Subject: [PATCH 102/162] Fix audit-ignore parsing around comments This change fixes how audit_translations YAML blocks are split when comments or blank lines appear around list items. It keeps introductory comments with the correct rule, preserves explicit audit-ignore markers inside a rule, and avoids incorrectly attaching comment-only lines to neighboring items. --- PythonScripts/audit_translations/README.md | 4 +- PythonScripts/audit_translations/parsers.py | 35 ++++++++++++--- .../audit_translations/tests/test_parsers.py | 44 +++++++++++++++++-- 3 files changed, 71 insertions(+), 12 deletions(-) diff --git a/PythonScripts/audit_translations/README.md b/PythonScripts/audit_translations/README.md index fe391d49b..241a500d2 100644 --- a/PythonScripts/audit_translations/README.md +++ b/PythonScripts/audit_translations/README.md @@ -12,8 +12,8 @@ The tool analyzes rule files to detect the following issues: * **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` on the line immediately before a rule to suppress auditing -that rule. Existing markers inside a rule block are also supported. +After a blank line, add `# audit-ignore` immediately before a rule to suppress +auditing that rule. Existing markers inside a rule block are also supported. --- diff --git a/PythonScripts/audit_translations/parsers.py b/PythonScripts/audit_translations/parsers.py index a96de8bef..bcbdd0027 100644 --- a/PythonScripts/audit_translations/parsers.py +++ b/PythonScripts/audit_translations/parsers.py @@ -154,15 +154,36 @@ def build_raw_blocks(lines: list[str], starts: list[int]) -> list[str]: block_starts = starts.copy() for idx, start in enumerate(starts): - lower_bound = starts[idx - 1] + 1 if idx else 0 - while start > lower_bound and (not lines[start - 1].strip() or lines[start - 1].lstrip().startswith("#")): + if idx == 0: + while start > 0 and (not lines[start - 1].strip() or lines[start - 1].lstrip().startswith("#")): + start -= 1 + block_starts[idx] = start + continue + + lower_bound = starts[idx - 1] + 1 + dash_line = re.fullmatch(r"\s*-\s*(?:#.*)?", lines[start - 1]) if start > lower_bound else None + if dash_line: start -= 1 - block_starts[idx] = start + block_starts[idx] = start + continue - return [ - "\n".join(lines[start : block_starts[idx + 1] if idx + 1 < len(block_starts) else len(lines)]) - for idx, start in enumerate(block_starts) - ] + comment_start = start + while comment_start > lower_bound and lines[comment_start - 1].lstrip().startswith("#"): + comment_start -= 1 + + # A separating blank makes the comment run introductory text for this + # item. Without one, leave the run with the preceding rule. + if comment_start > lower_bound and not lines[comment_start - 1].strip(): + start = comment_start - 1 + while start > lower_bound and not lines[start - 1].strip(): + start -= 1 + block_starts[idx] = start + + blocks = [] + for idx, start in enumerate(block_starts): + end = block_starts[idx + 1] if idx + 1 < len(block_starts) else len(lines) + blocks.append("\n".join(lines[start:end])) + return blocks def _extract_item_fields(item: Any, is_unicode: bool) -> tuple[str, str | None, str | None, Any] | None: diff --git a/PythonScripts/audit_translations/tests/test_parsers.py b/PythonScripts/audit_translations/tests/test_parsers.py index a8d1c36db..6714f3581 100644 --- a/PythonScripts/audit_translations/tests/test_parsers.py +++ b/PythonScripts/audit_translations/tests/test_parsers.py @@ -176,7 +176,8 @@ def test_detects_audit_ignore(self): def test_assigns_leading_audit_ignore_to_following_rule(self): """A marker directly above a rule suppresses that rule, not its neighbour.""" - content = """- name: first + content = """ +- name: first tag: mo match: "." @@ -194,7 +195,8 @@ def test_assigns_leading_audit_ignore_to_following_rule(self): def test_keeps_audit_ignore_inside_rule(self): """Existing markers within a rule block remain supported.""" - content = """- name: first + content = """ +- name: first tag: mo # audit-ignore match: "." @@ -209,9 +211,45 @@ def test_keeps_audit_ignore_inside_rule(self): assert rules[0].audit_ignore assert not rules[1].audit_ignore + def test_keeps_touching_comment_with_preceding_rule(self): + """A comment without a separating blank remains part of the preceding rule.""" + content = """ +- name: first + tag: mo + match: "." +# audit-ignore: this comment documents the first rule +- name: second + tag: mi + match: "x" +""" + yaml = YAML() + data = yaml.load(content) + rules = parse_rules_file(content, data) + assert rules[0].audit_ignore + assert not rules[1].audit_ignore + + def test_includes_comment_on_item_dash_line(self): + """A comment attached to an item's dash belongs to that item.""" + content = """ +- name: first + tag: mo + match: "." + +- # second rule introduction + name: second + tag: mi + match: "x" +""" + yaml = YAML() + data = yaml.load(content) + rules = parse_rules_file(content, data) + assert "second rule introduction" not in rules[0].raw_content + assert "second rule introduction" in rules[1].raw_content + def test_assigns_file_header_to_first_rule(self): """A leading marker before the first item is included in its raw block.""" - content = """# audit-ignore + content = """ +# audit-ignore - name: first tag: mo match: "." From 7f3e79dc19a6a8d3fca0732f60ff878174fe3a37 Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 01:23:11 +0200 Subject: [PATCH 103/162] add tests for intervals in German --- tests/Languages/de.rs | 1 + tests/Languages/de/ClearSpeak/intervals.rs | 149 +++++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 tests/Languages/de/ClearSpeak/intervals.rs diff --git a/tests/Languages/de.rs b/tests/Languages/de.rs index 4d2be48ab..b2c36e61e 100644 --- a/tests/Languages/de.rs +++ b/tests/Languages/de.rs @@ -2,6 +2,7 @@ mod ClearSpeak { mod functions; + mod intervals; mod large_ops; mod menclose; mod mfrac; diff --git a/tests/Languages/de/ClearSpeak/intervals.rs b/tests/Languages/de/ClearSpeak/intervals.rs new file mode 100644 index 000000000..3bf359a55 --- /dev/null +++ b/tests/Languages/de/ClearSpeak/intervals.rs @@ -0,0 +1,149 @@ +//! Regression tests for German ClearSpeak interval endpoint wording. +//! Each endpoint combination should use one German connector and no untranslated words. + +use crate::common::*; +use anyhow::Result; + +#[test] +fn interval_open_open() -> Result<()> { + let expr = " + ( + c,d + ) + "; + test_ClearSpeak( + "de", + "ClearSpeak_Paren", + "Interval", + expr, + "das Intervall c bis d, nicht einschließlich c und nicht einschließlich d", + ) +} + +#[test] +fn interval_open_closed() -> Result<()> { + let expr = " + ( + c,d + ] + "; + test_ClearSpeak( + "de", + "ClearSpeak_Paren", + "Interval", + expr, + "das Intervall c bis d, nicht einschließlich c aber einschließlich d", + ) +} + +#[test] +fn interval_closed_open() -> Result<()> { + let expr = " + [ + c,d + ) + "; + test_ClearSpeak( + "de", + "ClearSpeak_Paren", + "Interval", + expr, + "das Intervall c bis d, einschließlich c aber nicht einschließlich d", + ) +} + +#[test] +fn interval_closed_closed() -> Result<()> { + let expr = " + [ + c,d + ] + "; + test_ClearSpeak( + "de", + "ClearSpeak_Paren", + "Interval", + expr, + "das Intervall c bis d, einschließlich c und d", + ) +} + +#[test] +fn interval_negative_infinity_to_open_endpoint() -> Result<()> { + let expr = " + ( + -∞,d + ) + "; + test_ClearSpeak( + "de", + "ClearSpeak_Paren", + "Interval", + expr, + "das Intervall negative unendlich bis d, nicht einschließlich d", + ) +} + +#[test] +fn interval_negative_infinity_to_closed_endpoint() -> Result<()> { + let expr = " + ( + -∞,d + ] + "; + test_ClearSpeak( + "de", + "ClearSpeak_Paren", + "Interval", + expr, + "das Intervall negative unendlich bis d, einschließlich d", + ) +} + +#[test] +fn interval_open_endpoint_to_infinity() -> Result<()> { + let expr = " + ( + c,∞ + ) + "; + test_ClearSpeak( + "de", + "ClearSpeak_Paren", + "Interval", + expr, + "das Intervall c bis unendlich, nicht einschließlich c", + ) +} + +#[test] +fn interval_closed_endpoint_to_infinity() -> Result<()> { + let expr = " + [ + c,∞ + ) + "; + test_ClearSpeak( + "de", + "ClearSpeak_Paren", + "Interval", + expr, + "das Intervall c bis unendlich, einschließlich c", + ) +} + +#[test] +fn interval_between_infinities_has_no_endpoint_qualifier() -> Result<()> { + let expr = " + ( + -∞,∞ + ) + "; + test_ClearSpeak( + "de", + "ClearSpeak_Paren", + "Interval", + expr, + "das Intervall negative unendlich bis unendlich", + ) +} From f1895d960dcd692cc3c748564aaddc12025cd067 Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 01:41:01 +0200 Subject: [PATCH 104/162] Refine German interval descriptions and update translation rules --- Rules/Languages/de/ClearSpeak_Rules.yaml | 57 ++++++++++++++---------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/Rules/Languages/de/ClearSpeak_Rules.yaml b/Rules/Languages/de/ClearSpeak_Rules.yaml index 4c8f1d277..8d23c3502 100644 --- a/Rules/Languages/de/ClearSpeak_Rules.yaml +++ b/Rules/Languages/de/ClearSpeak_Rules.yaml @@ -532,37 +532,46 @@ - x: "*[2]" - pause: short - test: - if: "not($is_intervals_start_infinity)" + if: "not($is_intervals_start_infinity) and starts-with(name(.), 'open')" + then: + - T: "nicht einschließlich" + - x: "*[1]" + - test: + if: "not($is_intervals_start_infinity) and not(starts-with(name(.), 'open'))" then: - - test: - if: "starts-with(name(.), 'open')" - then: [T: "no"] - T: "einschließlich" - x: "*[1]" - # logic to deal with [not] arg #1 - test: - if: "not($is_intervals_start_infinity or $is_intervals_end_infinity)" - then_test: - - if: "name(.)='open-interval'" - then: [T: "ohne"] - - else_if: "name(.)='closed-interval'" - then: [T: "mit"] - else: [T: "ohne"] - # some ugly logic dealing with connectives: or, but, but, and (cleaner to be part of next clause?) - - test: - if: not($is_intervals_end_infinity) + if: "not($is_intervals_start_infinity or $is_intervals_end_infinity) and name(.)='open-interval'" then: - - test: - # there is some asymmetry to the test because of the and/or/but logic above - if: not( name(.)='open-interval' or name(.)='closed-interval' ) or $is_intervals_start_infinity - then: - - test: - if: "name(.) = 'open-interval' or name(.) = 'closed-open-interval'" - then: [T: "ohne"] - - T: "einschließlich" + - T: "und nicht einschließlich" + - x: "*[2]" + - test: + if: "not($is_intervals_start_infinity or $is_intervals_end_infinity) and name(.)='open-closed-interval'" + then: + - T: "aber einschließlich" + - x: "*[2]" + - test: + if: "not($is_intervals_start_infinity or $is_intervals_end_infinity) and name(.)='closed-open-interval'" + then: + - T: "aber nicht einschließlich" + - x: "*[2]" + - test: + if: "not($is_intervals_start_infinity or $is_intervals_end_infinity) and name(.)='closed-interval'" + then: + - T: "und" + - x: "*[2]" + - test: + if: "$is_intervals_start_infinity and not($is_intervals_end_infinity) and (name(.)='open-interval' or name(.)='closed-open-interval')" + then: + - T: "nicht einschließlich" + - x: "*[2]" + - test: + if: "$is_intervals_start_infinity and not($is_intervals_end_infinity) and (name(.)='open-closed-interval' or name(.)='closed-interval')" + then: + - T: "einschließlich" - x: "*[2]" - # onto the [not] [including]... part - name: binomial-frac-vector tag: matrix match: From ee539f2855b4e90a4fea5cb607f0c38f3480f790 Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 01:56:01 +0200 Subject: [PATCH 105/162] Add German ClearSpeak rule and tests for pause intent --- Rules/Languages/de/ClearSpeak_Rules.yaml | 15 +++++++++++++++ tests/Languages/de/intent.rs | 21 +++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/Rules/Languages/de/ClearSpeak_Rules.yaml b/Rules/Languages/de/ClearSpeak_Rules.yaml index 8d23c3502..d2551ffef 100644 --- a/Rules/Languages/de/ClearSpeak_Rules.yaml +++ b/Rules/Languages/de/ClearSpeak_Rules.yaml @@ -1,4 +1,19 @@ --- +- name: pause + tag: "!*" + match: "not(self::m:math) and not($MatchingPause) and @data-intent-property[contains(., ':pause')]" + replace: + - with: + variables: [MatchingPause: "true()"] + replace: + - test: + - if: "contains(@data-intent-property, ':pause-long')" + then: [pause: long] + - else_if: "contains(@data-intent-property, ':pause-short')" + then: [pause: short] + else: [pause: medium] + - x: "." + - name: intent-literal-silent tag: [mi, mo, mn] match: "contains(@data-intent-property, ':silent:')" diff --git a/tests/Languages/de/intent.rs b/tests/Languages/de/intent.rs index a93e49d2d..62e711db6 100644 --- a/tests/Languages/de/intent.rs +++ b/tests/Languages/de/intent.rs @@ -3,6 +3,27 @@ use crate::common::*; use anyhow::Result; +#[test] +fn clear_speak_short_pause_intent() -> Result<()> { + // A short pause intent should survive intent inference and render as a comma. + let expr = "xy"; + test("de", "ClearSpeak", expr, "x, y") +} + +#[test] +fn clear_speak_medium_pause_intent() -> Result<()> { + // An unsuffixed pause intent requests the default medium pause. + let expr = "xy"; + test("de", "ClearSpeak", expr, "x; y") +} + +#[test] +fn clear_speak_long_pause_intent() -> Result<()> { + // A long pause intent should be preserved in ClearSpeak text output. + let expr = "xy"; + test("de", "ClearSpeak", expr, "x; y") +} + #[test] fn silent_intent() -> Result<()> { From 21fd1ebf5358a03a00d5fafeb3e4d6f6b82f2248 Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 02:03:52 +0200 Subject: [PATCH 106/162] Add German localization for currency symbol placement and corresponding tests --- Rules/Languages/de/SharedRules/general.yaml | 18 +++++++++++++++++- tests/Languages/de/units.rs | 9 +++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Rules/Languages/de/SharedRules/general.yaml b/Rules/Languages/de/SharedRules/general.yaml index a5792c745..4c0f252fb 100644 --- a/Rules/Languages/de/SharedRules/general.yaml +++ b/Rules/Languages/de/SharedRules/general.yaml @@ -317,7 +317,23 @@ then: [x: "concat('\uF8FE', DefinitionValue($Word, 'Speech', 'PluralForms'))", ct: " "] else: [x: "concat('\uF8FE', $Word)", ct: "s"] - +# Currency symbols precede amounts in MathML but are spoken after them in German: $ 3 -> 3 dollar. +- name: currency + tag: mrow + match: "count(*)=3 and DefinitionValue(*[1], 'Speech', 'CurrencySymbols') != ''" + variables: + - IsSingular: "*[3][self::m:mn and .=1] and *[2]='\u2062'" + - CurrencyWord: "DefinitionValue(*[1], 'Speech', 'CurrencySymbols')" + replace: + - bookmark: "*[3]/@id" + - x: "*[3]" + - test: + - if: "$IsSingular" + then: [x: "$CurrencyWord"] + - else_if: "DefinitionValue($CurrencyWord, 'Speech', 'PluralForms') != ''" + then: [x: "DefinitionValue($CurrencyWord, 'Speech', 'PluralForms')"] + else: [x: "$CurrencyWord"] + - name: sin tag: mi match: ".='sin'" diff --git a/tests/Languages/de/units.rs b/tests/Languages/de/units.rs index fffd6ac5a..81467b92f 100644 --- a/tests/Languages/de/units.rs +++ b/tests/Languages/de/units.rs @@ -103,6 +103,15 @@ fn non_si_unit_plural_regression() -> Result<()> { Ok(()) } +#[test] +fn currency_symbol_precedes_amount() -> Result<()> { + // German speaks a prefixed currency symbol after its amount. + let expr = r#"$3"#; + test("de", "ClearSpeak", expr, "3 dollar")?; + test("de", "SimpleSpeak", expr, "3 dollar")?; + Ok(()) +} + /* #[test] fn si_base_with_prefixes() -> Result<()> { From 327d988b3dfc7d0e7f4b6f51601b5a0d940e723e Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 02:05:57 +0200 Subject: [PATCH 107/162] add another test for euro --- tests/Languages/de/units.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/Languages/de/units.rs b/tests/Languages/de/units.rs index 81467b92f..1c932ae1c 100644 --- a/tests/Languages/de/units.rs +++ b/tests/Languages/de/units.rs @@ -109,6 +109,10 @@ fn currency_symbol_precedes_amount() -> Result<()> { let expr = r#"$3"#; test("de", "ClearSpeak", expr, "3 dollar")?; test("de", "SimpleSpeak", expr, "3 dollar")?; + + let expr = r#"€1"#; + test("de", "ClearSpeak", expr, "1 euro")?; + test("de", "SimpleSpeak", expr, "1 euro")?; Ok(()) } From a4083cef4adf0dd8c73b1b04c3f46a4c5517458e Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 02:07:32 +0200 Subject: [PATCH 108/162] add another test for pound/pfund --- tests/Languages/de/units.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/Languages/de/units.rs b/tests/Languages/de/units.rs index 1c932ae1c..605ac2ed1 100644 --- a/tests/Languages/de/units.rs +++ b/tests/Languages/de/units.rs @@ -113,6 +113,10 @@ fn currency_symbol_precedes_amount() -> Result<()> { let expr = r#"€1"#; test("de", "ClearSpeak", expr, "1 euro")?; test("de", "SimpleSpeak", expr, "1 euro")?; + + let expr = r#"ÂŁ4,7"#; + test("de", "ClearSpeak", expr, "4,7 pfund")?; + test("de", "SimpleSpeak", expr, "4,7 pfund")?; Ok(()) } From 692343a4b3c97ae07682c300b6198e8ac48e06be Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 02:21:32 +0200 Subject: [PATCH 109/162] Update German ClearSpeak rules: Add support for principal logarithm (Log) and corresponding tests --- Rules/Languages/de/SharedRules/general.yaml | 6 ++++-- tests/Languages/de/ClearSpeak/functions.rs | 9 +++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Rules/Languages/de/SharedRules/general.yaml b/Rules/Languages/de/SharedRules/general.yaml index 4c0f252fb..3098d76ac 100644 --- a/Rules/Languages/de/SharedRules/general.yaml +++ b/Rules/Languages/de/SharedRules/general.yaml @@ -460,9 +460,9 @@ else: [T: "kovarianz"] # phrase('covariance' function) - - name: log # handle both log and ln (if in an mrow, 'intents' are used) + name: log # handle log, principal Log, and ln (if in an mrow, 'intents' are used) tag: mi - match: ".='log' or .='ln'" + match: ".='log' or .='Log' or .='ln'" replace: - bookmark: "@id" - test: @@ -472,6 +472,8 @@ - test: - if: ".= 'log'" then: [T: "log"] # phrase(the 'log' function is used in mathematics) + - else_if: ".= 'Log'" + then: [T: "hauptwert des logarithmus"] - else_if: "$Verbosity='Terse'" then: [spell: "'ln'"] else: [T: "natĂŒrliche logarithmus"] # phrase(the 'natural log' function is used in mathematics) diff --git a/tests/Languages/de/ClearSpeak/functions.rs b/tests/Languages/de/ClearSpeak/functions.rs index 6cb30e259..90217658e 100644 --- a/tests/Languages/de/ClearSpeak/functions.rs +++ b/tests/Languages/de/ClearSpeak/functions.rs @@ -106,6 +106,15 @@ fn simple_log() -> Result<()> { } +#[test] +fn principal_value_log() -> Result<()> { + // Uppercase Log denotes the principal-value logarithm. + let expr = "Logx"; + test("de", "ClearSpeak", expr, "der hauptwert des logarithmus, von x")?; + test("de", "SimpleSpeak", expr, "der hauptwert des logarithmus, von x")?; + Ok(()) +} + #[test] fn normal_log() -> Result<()> { let expr = "log(x+y)"; From 25059ddcd19d85abd4f7ac35eaba805cf504cbd5 Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 02:29:39 +0200 Subject: [PATCH 110/162] Refine German ClearSpeak fraction translations and update ordinal fraction definitions --- Rules/Languages/de/definitions.yaml | 4 +++- tests/Languages/de/ClearSpeak/mfrac.rs | 16 ++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Rules/Languages/de/definitions.yaml b/Rules/Languages/de/definitions.yaml index 94ac82330..de78c7530 100644 --- a/Rules/Languages/de/definitions.yaml +++ b/Rules/Languages/de/definitions.yaml @@ -253,7 +253,9 @@ # stop when regularity begins - NumbersOrdinalFractionalPluralOnes: [ - "nulle", "erste", "hĂ€lften" + "nulle", "erste", "hĂ€lften", "Drittel", "Viertel", "FĂŒnftel", "Sechstel", "Siebtel", "Achtel", "Neuntel", "Zehntel", + "Elftel", "Zwölftel", "Dreizehntel", "Vierzehntel", "FĂŒnfzehntel", "Sechzehntel", + "Siebzehntel", "Achtzehntel", "Neunzehntel" ] # What to use for multiples of 10 diff --git a/tests/Languages/de/ClearSpeak/mfrac.rs b/tests/Languages/de/ClearSpeak/mfrac.rs index 0081e0197..c5744d8aa 100644 --- a/tests/Languages/de/ClearSpeak/mfrac.rs +++ b/tests/Languages/de/ClearSpeak/mfrac.rs @@ -19,7 +19,7 @@ fn common_fraction_thirds() -> Result<()> { let expr = " 2 3 "; - test("de", "ClearSpeak", expr, "2 dritte")?; + test("de", "ClearSpeak", expr, "2 Drittel")?; return Ok(()); } @@ -29,8 +29,8 @@ fn common_fraction_tenths() -> Result<()> { let expr = " 17 10 "; - test_prefs("de", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Auto")], expr, "17 zehnte")?; - test_prefs("de", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Ordinal")], expr, "17 zehnte")?; + test_prefs("de", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Auto")], expr, "17 Zehntel")?; + test_prefs("de", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Ordinal")], expr, "17 Zehntel")?; return Ok(()); } @@ -42,7 +42,7 @@ fn not_ClearSpeak_common_fraction_tenths() -> Result<()> { 89 10 "; test_prefs("de", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Auto")], expr, "89 durch 10")?; - test_prefs("de", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Ordinal")], expr, "89 zehnte")?; + test_prefs("de", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Ordinal")], expr, "89 Zehntel")?; return Ok(()); } @@ -172,14 +172,14 @@ fn nested_simple_fractions() -> Result<()> { "; - test_prefs("de", "ClearSpeak", vec![("ClearSpeak_Fractions", "Auto")], expr, "1 hĂ€lfte durch 2 dritte")?; - test_prefs("de", "ClearSpeak", vec![("ClearSpeak_Fractions", "Ordinal")], expr, "1 hĂ€lfte durch 2 dritte")?; + test_prefs("de", "ClearSpeak", vec![("ClearSpeak_Fractions", "Auto")], expr, "1 hĂ€lfte durch 2 Drittel")?; + test_prefs("de", "ClearSpeak", vec![("ClearSpeak_Fractions", "Ordinal")], expr, "1 hĂ€lfte durch 2 Drittel")?; test_prefs("de", "ClearSpeak", vec![("ClearSpeak_Fractions", "Over")], expr, "1 durch 2 durch 2 durch 3")?; test_prefs("de", "ClearSpeak", vec![("ClearSpeak_Fractions", "FracOver")], expr, "der bruch der bruch 1 durch 2 durch der bruch 2 durch 3")?; test_prefs("de", "ClearSpeak", vec![("ClearSpeak_Fractions", "General")], expr, "der bruch mit zĂ€hler der bruch mit zĂ€hler 1; und nenner 2; und nenner der bruch mit zĂ€hler 2; und nenner 3")?; - test_prefs("de", "ClearSpeak", vec![("ClearSpeak_Fractions", "EndFrac")], expr, "1 hĂ€lfte durch 2 dritte")?; + test_prefs("de", "ClearSpeak", vec![("ClearSpeak_Fractions", "EndFrac")], expr, "1 hĂ€lfte durch 2 Drittel")?; test_prefs("de", "ClearSpeak", vec![("ClearSpeak_Fractions", "GeneralEndFrac")], expr, "der bruch mit zĂ€hler der bruch mit zĂ€hler 1; und nenner 2; ende des bruchs; und nenner der bruch mit zĂ€hler 2; und nenner 3; ende des bruchs; ende des bruchs")?; test_prefs("de", "ClearSpeak", vec![("ClearSpeak_Fractions", "OverEndFrac")], expr, @@ -205,7 +205,7 @@ fn semi_nested_fraction() -> Result<()> { "; - test("de", "ClearSpeak", expr, "2 dritte x durch 6")?; + test("de", "ClearSpeak", expr, "2 Drittel x durch 6")?; return Ok(()); } From 5df8e8123eca59dd945f5779afb29e55518f2ee0 Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 03:18:00 +0200 Subject: [PATCH 111/162] German ClearSpeak: subset & superset --- Rules/Languages/de/unicode-full.yaml | 8 ++++---- Rules/Languages/de/unicode.yaml | 4 ++-- tests/Languages/de/ClearSpeak/sets.rs | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/Rules/Languages/de/unicode-full.yaml b/Rules/Languages/de/unicode-full.yaml index 8a98107f8..871e4e434 100644 --- a/Rules/Languages/de/unicode-full.yaml +++ b/Rules/Languages/de/unicode-full.yaml @@ -1102,13 +1102,13 @@ - "⊆": # 0x2286 - test: if: "$Verbosity!='Terse'" - then: [T: "ist ein"] # (en: 'is a', google translation) - - T: "Teilmenge oder gleich" # (en: 'subset of or equal to', MathPlayer: 'Teilmenge von odre gleich', google: 'teilmenge von oder gleich') + then: [T: "ist eine"] # (en: 'is a', google translation) + - T: "Teilmenge von oder gleich" # (en: 'subset of or equal to', MathPlayer: 'Teilmenge von odre gleich', google: 'teilmenge von oder gleich') - "⊇": # 0x2287 - test: if: "$Verbosity!='Terse'" - then: [T: "ist ein"] # (en: 'is a', google translation) - - T: "Obermenge oder gleich" # (en: 'superset of or equal to', MathPlayer: 'Obermenge von oder gleich', google: 'superset von oder gleich') + then: [T: "ist eine"] # (en: 'is a', google translation) + - T: "Obermenge von oder gleich" # (en: 'superset of or equal to', MathPlayer: 'Obermenge von oder gleich', google: 'superset von oder gleich') - "⊈": # 0x2288 - test: if: "$Verbosity!='Terse'" diff --git a/Rules/Languages/de/unicode.yaml b/Rules/Languages/de/unicode.yaml index bdd89fc76..bee3b6e7b 100644 --- a/Rules/Languages/de/unicode.yaml +++ b/Rules/Languages/de/unicode.yaml @@ -431,12 +431,12 @@ - test: if: "$Verbosity!='Terse'" then: [T: "ist eine"] # (en: 'is a', google translation) - - T: "teilmenge oder gleich" # (en: 'subset of or equal to', MathPlayer: 'Teilmenge von odre gleich', google: 'teilmenge von oder gleich') + - T: "teilmenge von oder gleich" # (en: 'subset of or equal to', MathPlayer: 'Teilmenge von odre gleich', google: 'teilmenge von oder gleich') - "⊇": # 0x2287 - test: if: "$Verbosity!='Terse'" then: [T: "ist eine"] # (en: 'is a', google translation) - - T: "obermenge oder gleich" # (en: 'superset of or equal to', MathPlayer: 'Obermenge von oder gleich', google: 'superset von oder gleich') + - T: "obermenge von oder gleich" # (en: 'superset of or equal to', MathPlayer: 'Obermenge von oder gleich', google: 'superset von oder gleich') # --- restored short definitions that differ from unicode-full --- - "–": [T: "halbgeviertstrich"] # 0x2013 (SRE: 'En Dash') diff --git a/tests/Languages/de/ClearSpeak/sets.rs b/tests/Languages/de/ClearSpeak/sets.rs index e8911f33f..e9f70e3cc 100644 --- a/tests/Languages/de/ClearSpeak/sets.rs +++ b/tests/Languages/de/ClearSpeak/sets.rs @@ -230,6 +230,24 @@ fn element_alone() -> Result<()> { } +#[test] +fn subset_and_superset_or_equal_include_von() -> Result<()> { + // Both inclusive set relations should form complete German relational phrases. + test( + "de", + "ClearSpeak", + "A⊆B", + "groß a, ist eine teilmenge von oder gleich, groß b", + )?; + test( + "de", + "ClearSpeak", + "A⊇B", + "groß a, ist eine obermenge von oder gleich, groß b", + )?; + Ok(()) +} + #[test] fn element_under_sum() -> Result<()> { let expr = " From 88404bfa21276daf86a4883f45d79483571ea225 Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 03:28:13 +0200 Subject: [PATCH 112/162] de: fix chemical state names --- Rules/Languages/de/SharedRules/general.yaml | 8 ++--- tests/Languages/de/chemistry.rs | 34 +++++++++++++++++++++ 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/Rules/Languages/de/SharedRules/general.yaml b/Rules/Languages/de/SharedRules/general.yaml index 3098d76ac..9f4807946 100644 --- a/Rules/Languages/de/SharedRules/general.yaml +++ b/Rules/Languages/de/SharedRules/general.yaml @@ -1005,12 +1005,12 @@ - bookmark: "*[1]/@id" - test: - if: ".='s'" - then: [T: "solide"] # phrase(Boron is a 'solid' in its natural state) + then: [T: "fest"] # phrase(Boron is a 'solid' in its natural state) - else_if: ".='l'" - then: [T: "flĂŒssigkeit"] # phrase(water is a 'liquid') + then: [T: "flĂŒssig"] # phrase(water is a 'liquid') - else_if: ".='g'" - then: [T: "gas"] # phrase(hydrogen is a 'gas' ) - else: [T: "wĂ€ssrige"] # phrase(an 'aqueous' solution is contained in water) + then: [T: "gasförmig"] # phrase(hydrogen is a 'gas' ) + else: [T: "wĂ€ssrig"] # phrase(an 'aqueous' solution is contained in water) - pause: short - name: chemical-formula-operator-bond diff --git a/tests/Languages/de/chemistry.rs b/tests/Languages/de/chemistry.rs index 14bb1bfd1..63c46302d 100644 --- a/tests/Languages/de/chemistry.rs +++ b/tests/Languages/de/chemistry.rs @@ -40,6 +40,40 @@ fn sulfate() -> Result<()> { } +#[test] +fn chemical_state_names_are_german_adjectives() -> Result<()> { + // Chemical state suffixes should use the standard German adjectival names. + test_prefs( + "de", + "ClearSpeak", + vec![("Verbosity", "Terse")], + "Na(s)", + "groß n a, fest", + )?; + test_prefs( + "de", + "ClearSpeak", + vec![("Verbosity", "Terse")], + "H2O(l)", + "groß h, 2 groß o, flĂŒssig", + )?; + test_prefs( + "de", + "ClearSpeak", + vec![("Verbosity", "Terse")], + "HCl(g)", + "groß h, groß c l, gasförmig", + )?; + test_prefs( + "de", + "ClearSpeak", + vec![("Verbosity", "Terse")], + "HCl(aq)", + "groß h, groß c l, wĂ€ssrig", + )?; + Ok(()) +} + /* // ignored below #[test] From c17671cb3b7fca7609f54603015ed7fef036b155 Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 03:50:13 +0200 Subject: [PATCH 113/162] de: fix chemical reaction arrow --- Rules/Languages/de/SharedRules/general.yaml | 5 +--- tests/Languages/de/chemistry.rs | 26 +++++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Rules/Languages/de/SharedRules/general.yaml b/Rules/Languages/de/SharedRules/general.yaml index 9f4807946..b600b517f 100644 --- a/Rules/Languages/de/SharedRules/general.yaml +++ b/Rules/Languages/de/SharedRules/general.yaml @@ -1044,10 +1044,7 @@ - bookmark: "@id" - test: - if: ".='→' or .='⟶'" - then_test: - if: "$Verbosity='Terse'" - then: [T: "formen"] # phrase(hydrogen and oxygen 'forms' water ) - else: [T: "reagiert auf die form"] # phrase(hydrogen and oxygen 'reacts to form' water) + then: [T: "ergibt"] # phrase(hydrogen and oxygen 'forms/reacts to form' water) - else_if: ".='⇌' or .='🣑'" # U+01F8D1 then: [T: "ist im gleichgewicht mit"] # phrase(a reactant 'is in equilibrium with' a product) - else_if: ".='🣓'" # U+1F8D3 diff --git a/tests/Languages/de/chemistry.rs b/tests/Languages/de/chemistry.rs index 63c46302d..25b888ec2 100644 --- a/tests/Languages/de/chemistry.rs +++ b/tests/Languages/de/chemistry.rs @@ -74,6 +74,32 @@ fn chemical_state_names_are_german_adjectives() -> Result<()> { Ok(()) } +#[test] +fn reaction_arrow_uses_idiomatic_german() -> Result<()> { + // A reaction arrow should describe the resulting products idiomatically in German. + let expr = " + 2HCl+2Na + → + 2NaCl+ + H2 + "; + test_prefs( + "de", + "SimpleSpeak", + vec![("Verbosity", "Terse")], + expr, + "2, groß h, groß c l; plus 2 groß n a; ergibt; 2, groß n a, groß c l; plus groß h, 2", + )?; + test_prefs( + "de", + "SimpleSpeak", + vec![("Verbosity", "Verbose")], + expr, + "2, groß h, groß c l; plus 2 groß n a; ergibt; 2, groß n a, groß c l; plus groß h, index 2", + )?; + Ok(()) +} + /* // ignored below #[test] From 771dc68e4e836404e0c52b964969e6c078d0d7dc Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 04:09:31 +0200 Subject: [PATCH 114/162] de: fix integer exponentiation --- Rules/Languages/de/ClearSpeak_Rules.yaml | 8 +------- Rules/Languages/de/SimpleSpeak_Rules.yaml | 7 ++----- tests/Languages/de/shared.rs | 13 +++++++++++++ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Rules/Languages/de/ClearSpeak_Rules.yaml b/Rules/Languages/de/ClearSpeak_Rules.yaml index d2551ffef..01f8c9eba 100644 --- a/Rules/Languages/de/ClearSpeak_Rules.yaml +++ b/Rules/Languages/de/ClearSpeak_Rules.yaml @@ -326,13 +326,7 @@ replace: - x: "*[1]" - T: "hoch" - - test: - if: "*[2][.>0]" - then: [x: "ToOrdinal(*[2])"] - else: [x: "*[2]"] - - test: - if: "$ClearSpeak_Exponents != 'Ordinal'" - then: [T: "hoch"] + - x: "*[2]" - name: simple-negative-integer tag: power diff --git a/Rules/Languages/de/SimpleSpeak_Rules.yaml b/Rules/Languages/de/SimpleSpeak_Rules.yaml index e04749887..d23a47d7c 100644 --- a/Rules/Languages/de/SimpleSpeak_Rules.yaml +++ b/Rules/Languages/de/SimpleSpeak_Rules.yaml @@ -208,11 +208,8 @@ match: "*[2][self::m:mn][not(contains(., '.'))]" replace: - x: "*[1]" - - T: "zu dem" # phrase(15 raised 'to the' second power equals 225) - - test: - if: "*[2][.>0]" - then: [x: "ToOrdinal(*[2])"] - else: [x: "*[2]"] + - T: "hoch" # phrase(15 raised 'to the' fourth power equals 50625) + - x: "*[2]" - name: simple-negative-integer tag: power match: diff --git a/tests/Languages/de/shared.rs b/tests/Languages/de/shared.rs index 34518d9e0..53d1468db 100644 --- a/tests/Languages/de/shared.rs +++ b/tests/Languages/de/shared.rs @@ -3,6 +3,19 @@ use crate::common::*; use anyhow::Result; +#[test] +fn ordinary_integer_powers() -> Result<()> { + // Ordinary integer exponents use the idiomatic German "hoch" construction. + let fourth_power = "x4"; + test("de", "ClearSpeak", fourth_power, "x hoch 4")?; + test("de", "SimpleSpeak", fourth_power, "x hoch 4")?; + + let zeroth_power = "x0"; + test("de", "ClearSpeak", zeroth_power, "x hoch 0")?; + test("de", "SimpleSpeak", zeroth_power, "x hoch 0")?; + Ok(()) +} + #[test] fn modified_vars() -> Result<()> { let expr = " From c6a33fad46c8a3cc83c91c771160113c381023ee Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 04:27:02 +0200 Subject: [PATCH 115/162] de: fix exponentiation by arbitrary exponents --- Rules/Languages/de/ClearSpeak_Rules.yaml | 4 ---- Rules/Languages/de/SimpleSpeak_Rules.yaml | 1 - tests/Languages/de/shared.rs | 9 +++++++++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Rules/Languages/de/ClearSpeak_Rules.yaml b/Rules/Languages/de/ClearSpeak_Rules.yaml index 01f8c9eba..c1dd81eb5 100644 --- a/Rules/Languages/de/ClearSpeak_Rules.yaml +++ b/Rules/Languages/de/ClearSpeak_Rules.yaml @@ -349,10 +349,6 @@ - x: "*[1]" - T: "hoch" - x: "*[2]" - - pronounce: [text: "-th", ipa: "Ξ", sapi5: "th", eloquence: "T"] - - test: - if: "$ClearSpeak_Exponents != 'Ordinal'" - then: [T: "hoch"] # match nested exponent, where the nested exponent is has the power 2 or 3 (n below) # [xxx]^n, - [xxx]^n, [xxx] var^n, -[xxx] var^n diff --git a/Rules/Languages/de/SimpleSpeak_Rules.yaml b/Rules/Languages/de/SimpleSpeak_Rules.yaml index d23a47d7c..4d48fd27e 100644 --- a/Rules/Languages/de/SimpleSpeak_Rules.yaml +++ b/Rules/Languages/de/SimpleSpeak_Rules.yaml @@ -226,7 +226,6 @@ - x: "*[1]" - T: "hoch" # phrase(15 raised 'to the' second power equals 225) - x: "*[2]" - - pronounce: [text: "-th", ipa: "Ξ", sapi5: "th", eloquence: "T"] - name: simple tag: power diff --git a/tests/Languages/de/shared.rs b/tests/Languages/de/shared.rs index 53d1468db..d69acf25a 100644 --- a/tests/Languages/de/shared.rs +++ b/tests/Languages/de/shared.rs @@ -16,6 +16,15 @@ fn ordinary_integer_powers() -> Result<()> { Ok(()) } +#[test] +fn variable_powers() -> Result<()> { + // Variable exponents should not acquire an English ordinal suffix or a second "hoch". + let expr = "2x"; + test("de", "ClearSpeak", expr, "2 hoch x")?; + test("de", "SimpleSpeak", expr, "2 hoch x")?; + Ok(()) +} + #[test] fn modified_vars() -> Result<()> { let expr = " From 6f24b27a37cb986e1434c5dc76aeb65adc45f66d Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 04:37:54 +0200 Subject: [PATCH 116/162] de: add vector norm --- Rules/Languages/de/definitions.yaml | 1 + tests/Languages/de/intent.rs | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/Rules/Languages/de/definitions.yaml b/Rules/Languages/de/definitions.yaml index de78c7530..163c3f86d 100644 --- a/Rules/Languages/de/definitions.yaml +++ b/Rules/Languages/de/definitions.yaml @@ -29,6 +29,7 @@ "plus": "infix=plus || prefix=positiv", "real-part": "function=der reale teil", "transpose": "postfix=transponieren || function=transponieren", + "magnitude": "function=; Norm: Norm: Norm; Ende Norm", "norm": "function=; norm: norm: norm; ende norm", "trace": "function=; spur : spur: die spur; ende spur", "dimension": "function=; dimension : dimension: die dimension; ende dimension", diff --git a/tests/Languages/de/intent.rs b/tests/Languages/de/intent.rs index 62e711db6..d31af9d9b 100644 --- a/tests/Languages/de/intent.rs +++ b/tests/Languages/de/intent.rs @@ -3,6 +3,15 @@ use crate::common::*; use anyhow::Result; +#[test] +fn magnitude_is_localized_as_norm() -> Result<()> { + // Double bars infer the magnitude intent, which should use the German term "Norm". + let expr = "‖x‖"; + test("de", "ClearSpeak", expr, "Norm von x")?; + test("de", "SimpleSpeak", expr, "Norm von x")?; + Ok(()) +} + #[test] fn clear_speak_short_pause_intent() -> Result<()> { // A short pause intent should survive intent inference and render as a comma. From 11736b5bb3638ae30ab955a1a8cdfee8e196333d Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 04:42:03 +0200 Subject: [PATCH 117/162] de: fix "transpose" --- Rules/Languages/de/definitions.yaml | 2 +- tests/Languages/de/shared.rs | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Rules/Languages/de/definitions.yaml b/Rules/Languages/de/definitions.yaml index 163c3f86d..427eec726 100644 --- a/Rules/Languages/de/definitions.yaml +++ b/Rules/Languages/de/definitions.yaml @@ -28,7 +28,7 @@ "minus": "infix=minus || prefix=negativ", "plus": "infix=plus || prefix=positiv", "real-part": "function=der reale teil", - "transpose": "postfix=transponieren || function=transponieren", + "transpose": "postfix=transponiert || function=die Transponierte", "magnitude": "function=; Norm: Norm: Norm; Ende Norm", "norm": "function=; norm: norm: norm; ende norm", "trace": "function=; spur : spur: die spur; ende spur", diff --git a/tests/Languages/de/shared.rs b/tests/Languages/de/shared.rs index d69acf25a..93d570108 100644 --- a/tests/Languages/de/shared.rs +++ b/tests/Languages/de/shared.rs @@ -3,6 +3,18 @@ use crate::common::*; use anyhow::Result; +#[test] +fn transpose_uses_grammatical_german_forms() -> Result<()> { + // A superscript T uses the participle, while a function intent names the transpose. + let postfix = "AT"; + test("de", "ClearSpeak", postfix, "groß a transponiert")?; + test("de", "SimpleSpeak", postfix, "groß a transponiert")?; + + let function = "A"; + test("de", "ClearSpeak", function, "die Transponierte von groß a")?; + Ok(()) +} + #[test] fn ordinary_integer_powers() -> Result<()> { // Ordinary integer exponents use the idiomatic German "hoch" construction. From bb775c5a7b8d5a9d50b65629106023bdefbed1df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Tue, 22 Sep 2026 08:28:44 +0200 Subject: [PATCH 118/162] replace lamda with lambda (#789) * replace lamda with lambda * fix line endings --- Rules/Languages/de/unicode.yaml | 2 +- Rules/Languages/id/unicode-full.yaml | 4 ++-- Rules/Languages/id/unicode.yaml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Rules/Languages/de/unicode.yaml b/Rules/Languages/de/unicode.yaml index bee3b6e7b..f8b0ec641 100644 --- a/Rules/Languages/de/unicode.yaml +++ b/Rules/Languages/de/unicode.yaml @@ -214,7 +214,7 @@ - "Ξ": [T: "theta"] # 0x3b8 - "Îč": [T: "iota"] # 0x3b9 (google: 'jota') - "Îș": [T: "kappa"] # 0x3ba - - "λ": [T: "lamda"] # 0x3bb (en: 'lambda', google: 'lambda') + - "λ": [T: "lambda"] # 0x3bb (en: 'lambda', google: 'lambda') - "ÎŒ": [T: "mĂŒ"] # 0x3bc - "Μ": [T: "nĂŒ"] # 0x3bd - "Ο": [T: "xi"] # 0x3be (en: 'zai', google: 'zai') diff --git a/Rules/Languages/id/unicode-full.yaml b/Rules/Languages/id/unicode-full.yaml index 5591060fd..65af01886 100644 --- a/Rules/Languages/id/unicode-full.yaml +++ b/Rules/Languages/id/unicode-full.yaml @@ -314,7 +314,7 @@ - test: if: "($Blind or $Verbosity!='Terse')" then: [T: huruf besar] - - T: lamda + - T: lambda - "Μ": # 0x39c - test: if: "($Blind or $Verbosity!='Terse')" @@ -400,7 +400,7 @@ - "Ξ": [T: theta] # 0x3b8 - "Îč": [T: iota] # 0x3b9 - "Îș": [T: kappa] # 0x3ba - - "λ": [T: lamda] # 0x3bb + - "λ": [T: lambda] # 0x3bb - "ÎŒ": [T: mu] # 0x3bc - "Μ": [T: nu] # 0x3bd - "Ο": [T: zai] # 0x3be diff --git a/Rules/Languages/id/unicode.yaml b/Rules/Languages/id/unicode.yaml index 11f586349..ebc0a1909 100644 --- a/Rules/Languages/id/unicode.yaml +++ b/Rules/Languages/id/unicode.yaml @@ -243,7 +243,7 @@ - "Ξ": [T: theta] # 0x3b8 - "Îč": [T: iota] # 0x3b9 - "Îș": [T: kappa] # 0x3ba -- "λ": [T: lamda] # 0x3bb +- "λ": [T: lambda] # 0x3bb - "ÎŒ": [T: mu] # 0x3bc - "Μ": [T: nu] # 0x3bd - "Ο": [T: zai] # 0x3be From 24eaee398ca4b5c6bc308efcfa66c73dbfd888d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dziwisz?= Date: Tue, 22 Sep 2026 08:31:10 +0200 Subject: [PATCH 119/162] =?UTF-8?q?fix(pl):=20przywr=C3=B3=C4=87=20szablon?= =?UTF-8?q?y=20sum=20i=20iloczyn=C3=B3w=20po=20naprawie=20s=C5=82owa=20?= =?UTF-8?q?=C5=82=C4=85cz=C4=85cego=20(#783)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Rules/Languages/pl/definitions.yaml | 19 +++++++++++-------- tests/Languages/pl/definitions.rs | 8 ++++---- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/Rules/Languages/pl/definitions.yaml b/Rules/Languages/pl/definitions.yaml index 0f212c4e4..e3a8bc1db 100644 --- a/Rules/Languages/pl/definitions.yaml +++ b/Rules/Languages/pl/definitions.yaml @@ -60,14 +60,12 @@ ### Sequence and Series - # UWAGA: NIE uĆŒywamy tu szablonĂłw arnoƛci ("| po | od,do"), choć angielski je ma. - # PowĂłd (zmierzone 31.08.2026): intent_function_glue_before w src/infer_intent.rs - # zwraca dla ostatniego argumentu ZASZYTE W KODZIE angielskie "of", więc polskie - # wyjƛcie brzmiaƂoby "suma po i of x". To defekt rdzenia dotyczący kaĆŒdego języka - # poza angielskim; węgierski uniknąƂ go tak samo, zostawiając prostą postać. - # Separator binarny (jedna opcja "| sƂowo") dziaƂa poprawnie i jest uĆŒywany niĆŒej. - "sum":"function=suma", - "product":"function=iloczyn", + # Szablony arnoƛci dziaƂają od czasu, gdy sƂowo Ƃączące przestaƂo być zaszyte + # w kodzie (issue #739): ostatni argument poprzedza teraz FunctionApplicationWord + # z tego pliku, czyli polskie "z". SƂowa "przez" i "od,do" dobrane tak, jak mĂłwią + # o tym istniejące reguƂy duĆŒych operatorĂłw ("suma przez wielka s z i"). + "sum":"function=suma | przez | od,do", + "product":"function=iloczyn | przez | od,do", ### Elementary classical functions @@ -298,6 +296,11 @@ "chemistry-concentration": "function=; stÄ™ĆŒenie: stÄ™ĆŒenie: stÄ™ĆŒenie; koniec stÄ™ĆŒenia", } + # The connector word to say for functional 'IntentMappings' (in English, "of") + # This is likely the word used for U+2061 in unicode.yaml, but for technical reasons needs to be defined here + # vector of length=1 because scalars not supported +- FunctionApplicationWord: ["z"] + # Names of functions that in terse mode don't say "of" (or it's equivalent in other languages) - TerseFunctionNames: { "divergence", "gradient", "curl" diff --git a/tests/Languages/pl/definitions.rs b/tests/Languages/pl/definitions.rs index 338f7ff95..d009d9120 100644 --- a/tests/Languages/pl/definitions.rs +++ b/tests/Languages/pl/definitions.rs @@ -422,7 +422,7 @@ fn sequence_and_series_intents() -> Result<()> { x "#, - "suma z i przecinek, x", + "suma przez i z x", ), ( "sum-3", @@ -434,7 +434,7 @@ fn sequence_and_series_intents() -> Result<()> { x "#, - "suma z i przecinek, n przecinek, x", + "suma od i do n z x", ), ( "product-1", @@ -455,7 +455,7 @@ fn sequence_and_series_intents() -> Result<()> { x "#, - "iloczyn z i przecinek, x", + "iloczyn przez i z x", ), ( "product-3", @@ -467,7 +467,7 @@ fn sequence_and_series_intents() -> Result<()> { x "#, - "iloczyn z i przecinek, n przecinek, x", + "iloczyn od i do n z x", ), ]; From e46e7dbcc89f11d304de660ca1444fdf8322acb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Tue, 22 Sep 2026 08:42:49 +0200 Subject: [PATCH 120/162] Refactor/simplify prefs rs (#780) * remove pointless cloning * simplify logic flow of is_user_pref * simplify path joins * Add comment to clarify update condition Added a comment to prevent unnecessary updates if the value hasn't changed. --------- Co-authored-by: NSoiffer --- src/prefs.rs | 68 ++++++++++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/src/prefs.rs b/src/prefs.rs index 89748119f..f515ca483 100644 --- a/src/prefs.rs +++ b/src/prefs.rs @@ -133,12 +133,11 @@ impl Preferences{ verify_keys(doc, "Other", file_name)?; } - let prefs = &mut base_prefs.prefs; - add_prefs(prefs, &doc["Speech"], "", file_name); - add_prefs(prefs, &doc["Navigation"], "", file_name); - add_prefs(prefs, &doc["Braille"], "", file_name); - add_prefs(prefs, &doc["Other"], "", file_name); - return Ok( Preferences{ prefs: prefs.to_owned() } ); + add_prefs(&mut base_prefs.prefs, &doc["Speech"], "", file_name); + add_prefs(&mut base_prefs.prefs, &doc["Navigation"], "", file_name); + add_prefs(&mut base_prefs.prefs, &doc["Braille"], "", file_name); + add_prefs(&mut base_prefs.prefs, &doc["Other"], "", file_name); + return Ok(base_prefs); @@ -317,8 +316,7 @@ impl PreferenceManager { let mut prefs = Preferences::default(); - let mut system_prefs_file = self.rules_dir.to_path_buf(); - system_prefs_file.push("prefs.yaml"); + let system_prefs_file: PathBuf = self.rules_dir.join("prefs.yaml"); if is_file_shim(&system_prefs_file) { let defaults = DEFAULT_USER_PREFERENCES.with(|defaults| defaults.clone()); prefs = Preferences::read_prefs_file(&system_prefs_file, defaults)?; @@ -363,11 +361,11 @@ impl PreferenceManager { let language = self.pref_to_string("Language"); let language = if language.as_str() == "Auto" {"en"} else {language.as_str()}; // avoid 'temp value dropped while borrowed' error - let language_dir = rules_dir.to_path_buf().join("Languages"); + let language_dir = rules_dir.join("Languages"); self.set_speech_files(&language_dir, language, None)?; // also sets style file let braille_code = self.pref_to_string("BrailleCode"); - let braille_dir = rules_dir.to_path_buf().join("Braille"); + let braille_dir = rules_dir.join("Braille"); self.set_braille_files(&braille_dir, &braille_code)?; return Ok(()); } @@ -426,12 +424,12 @@ impl PreferenceManager { let new_language = new_prefs.prefs.get("Language").unwrap(); debug!("set_files_based_on_changes: old_language={old_language:?}, new_language={new_language:?}"); if old_language != new_language { - let language_dir = self.rules_dir.to_path_buf().join("Languages"); + let language_dir = self.rules_dir.join("Languages"); self.set_speech_files(&language_dir, new_language.as_str().unwrap(), None)?; // also sets style file } else { let old_speech_style = self.user_prefs.prefs.get("SpeechStyle").unwrap(); let new_speech_style = new_prefs.prefs.get("SpeechStyle").unwrap(); - let language_dir = self.rules_dir.to_path_buf().join("Languages"); + let language_dir = self.rules_dir.join("Languages"); if old_speech_style != new_speech_style { self.set_speech_files(&language_dir, new_language.as_str().unwrap(), new_speech_style.as_str())?; } @@ -440,7 +438,7 @@ impl PreferenceManager { let old_braille_code = self.user_prefs.prefs.get("BrailleCode").unwrap(); let new_braille_code = new_prefs.prefs.get("BrailleCode").unwrap(); if old_braille_code != new_braille_code { - let braille_code_dir = self.rules_dir.to_path_buf().join("Braille"); + let braille_code_dir = self.rules_dir.join("Braille"); self.set_braille_files(&braille_code_dir, new_braille_code.as_str().unwrap())?; // also sets style file } @@ -566,7 +564,7 @@ impl PreferenceManager { let mut alternative_style_file = None; // back up in case we don't find the target style in lang_dir let looking_for_style_file = file_name.ends_with("_Rules.yaml"); for os_path in lang_dir.ancestors() { // ancestor returns self and ancestors - let path = PathBuf::from(os_path).join(file_name); + let path = os_path.join(file_name); // debug!("find_file: checking file: {}", path.to_string_lossy()); if is_file_shim(&path) { // we make an exception for definitions.yaml -- there a language specific checks for Hundreds, etc @@ -634,8 +632,7 @@ impl PreferenceManager { fn get_language_dir(rules_dir: &Path, lang: &str, default_lang: Option<&str>) -> Result { // return 'Rules/Language/fr', 'Rules/Language/en/gb', etc, if they exist. // fall back to main language, and then to default_dir if language dir doesn't exist - let mut full_path = rules_dir.to_path_buf(); - full_path.push(lang.replace('-', std::path::MAIN_SEPARATOR_STR)); + let full_path = rules_dir.join(lang.replace('-', std::path::MAIN_SEPARATOR_STR)); for parent in full_path.ancestors() { if parent == rules_dir { break; @@ -710,21 +707,17 @@ impl PreferenceManager { !value.chars().all(|c| matches!(c, 'a'..='z' | 'A'..='Z' | '_' | '-')) { bail!("{} is an invalid value! Must contains only ascii letters, '_', or'-'", key); } - + // don't do an update if the value hasn't changed - let mut is_user_pref = true; - if let Some(pref_value) = self.api_prefs.prefs.get(key) { - if pref_value.as_str().unwrap() != value { - is_user_pref = false; - self.reset_files_from_preference_change(key, value)?; - } - } else if let Some(pref_value) = self.user_prefs.prefs.get(key) { - if pref_value.as_str().unwrap() != value { - self.reset_files_from_preference_change(key, value)?; - } - } else { - bail!("{} is an unknown MathCAT preference!", key); + let api_pref: Option<&Yaml> = self.api_prefs.prefs.get(key); + let Some(pref_value) = api_pref.or_else(|| self.user_prefs.prefs.get(key)) else { + bail!("{key} is an unknown MathCAT preference!"); + }; + if pref_value.as_str().unwrap() == value { + return Ok( () ); } + let is_user_pref: bool = api_pref.is_none(); + self.reset_files_from_preference_change(key, value)?; // debug!("Setting ({}) {} to '{}'", if is_user_pref {"user"} else {"sys"}, key, value); if is_user_pref { @@ -755,7 +748,7 @@ impl PreferenceManager { } let changed_pref = if changed_pref == "LanguageAuto" {"Language"} else {changed_pref}; - let language_dir = self.rules_dir.to_path_buf().join("Languages"); + let language_dir = self.rules_dir.join("Languages"); match changed_pref { "Language" => { self.set_speech_files(&language_dir, changed_value, None)?; @@ -768,7 +761,7 @@ impl PreferenceManager { crate::speech::invalidate_speech_style_caches(); }, "BrailleCode" => { - let braille_dir = self.rules_dir.to_path_buf().join("Braille"); + let braille_dir = self.rules_dir.join("Braille"); self.set_braille_files(&braille_dir, changed_value)?; crate::speech::invalidate_braille_caches(); }, @@ -1170,6 +1163,19 @@ cfg_if::cfg_if! {if #[cfg(not(feature = "include-zip"))] { }); } + /// Setting `TTS` to its existing value should not copy it from API preferences into user preferences. + #[test] + fn unchanged_api_string_pref_is_noop() { + let mut pref_manager = PreferenceManager { + api_prefs: Preferences::api_defaults(), + ..PreferenceManager::default() + }; + + pref_manager.set_string_pref("TTS", "none").unwrap(); + + assert!(!pref_manager.user_prefs.prefs.contains_key("TTS")); + } + /// #262: MathCAT must notice when a rule file on disk changes and reload it. /// This copies the rule files it needs (`en`, `zz`, and `Nemeth`) into a uniquely-named /// temp dir, so the test can freely modify files and run in parallel without touching the From 8ef55c415e68400fe24a7bacaa703ea8b3720096 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20Rand=C3=A9n?= Date: Tue, 8 Sep 2026 10:39:34 +0200 Subject: [PATCH 121/162] ci: add scheduled workflow to alert translators of English rule changes --- .github/translator-alert.config | 7 + .github/workflows/translator-alert.yml | 268 +++++++++++++++++++++++++ 2 files changed, 275 insertions(+) create mode 100644 .github/translator-alert.config create mode 100644 .github/workflows/translator-alert.yml diff --git a/.github/translator-alert.config b/.github/translator-alert.config new file mode 100644 index 000000000..1ed950460 --- /dev/null +++ b/.github/translator-alert.config @@ -0,0 +1,7 @@ +# Add your GitHub username (including '@') to the 'notify' list to receive alerts when English rules change. +# Append to the existing list on the same line, separated by a single space (e.g. notify=@user1 @user2). +# You do not have to add your Github username if you are already in the mathcat-translators group. + +paths=Rules/Languages/en/ +exclude=Rules/Languages/en/gb/ +notify=@johannes-spsm @daisy/mathcat-translators \ No newline at end of file diff --git a/.github/workflows/translator-alert.yml b/.github/workflows/translator-alert.yml new file mode 100644 index 000000000..c8c54c397 --- /dev/null +++ b/.github/workflows/translator-alert.yml @@ -0,0 +1,268 @@ +name: Alert Translators on English File Changes + +permissions: + contents: read + discussions: write + +on: + schedule: + - cron: '3 14 1,15 * *' + +jobs: + alert: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v7 + with: + fetch-depth: 0 + + - name: Load alert config + id: config + run: | + CONFIG_FILE=".github/translator-alert.config" + + PATHS=$(grep '^paths=' "$CONFIG_FILE" | cut -d '=' -f2-) + EXCLUDE=$(grep '^exclude=' "$CONFIG_FILE" | cut -d '=' -f2-) + NOTIFY=$(grep '^notify=' "$CONFIG_FILE" | cut -d '=' -f2-) + + echo "paths=$PATHS" >> $GITHUB_OUTPUT + echo "exclude=$EXCLUDE" >> $GITHUB_OUTPUT + echo "notify=$NOTIFY" >> $GITHUB_OUTPUT + + - name: Determine changed files + id: changes + run: | + LAST_WORKFLOW_RUN_DATE=$([ "$(date "+%d")" -eq 1 ] && echo "$(date --date "-1 month" "+%Y-%m")-15 14:03:00 +0000" || echo "$(date "+%Y-%m")-01 14:03:00 +0000") + LOG=$(git log --since="$LAST_WORKFLOW_RUN_DATE" --name-only --pretty=format:'COMMIT:%H') + + FILES=$(printf "%s\n" "$LOG" | awk '/^COMMIT:/{next} NF' | sort -u) + + { + echo "log<> "$GITHUB_OUTPUT" + + { + echo "files<> "$GITHUB_OUTPUT" + + - name: Check if monitored paths has changes + id: check + env: + FILES: ${{ steps.changes.outputs.files }} + INCLUDES: ${{ steps.config.outputs.paths }} + EXCLUDES: ${{ steps.config.outputs.exclude }} + run: | + + ALERT=false + MATCHED_FILES="" + + while IFS= read -r f; do + [ -z "$f" ] && continue + + INCLUDED=false + for p in $INCLUDES; do + case "$f" in + $p*) INCLUDED=true; break ;; + esac + done + [ "$INCLUDED" = false ] && continue + + EXCLUDED=false + for x in $EXCLUDES; do + [ -z "$x" ] && continue + case "$f" in + $x*) EXCLUDED=true; break ;; + esac + done + [ "$EXCLUDED" = true ] && continue + + ALERT=true + MATCHED_FILES="${MATCHED_FILES}${f}\n" + done <<< "${FILES}" + + echo "alert=$ALERT" >> "$GITHUB_OUTPUT" + + echo "matched<> "$GITHUB_OUTPUT" + printf "%b" "$MATCHED_FILES" >> "$GITHUB_OUTPUT" + echo "EOF" >> "$GITHUB_OUTPUT" + + - name: Craft alert message + id: message + if: steps.check.outputs.alert == 'true' + uses: actions/github-script@v9 + env: + NOTIFY: ${{ steps.config.outputs.notify }} + PATHS: ${{ steps.config.outputs.paths }} + EXCLUDES: ${{ steps.config.outputs.exclude }} + MATCHED: ${{ steps.check.outputs.matched }} + LOG: ${{ steps.changes.outputs.log }} + with: + script: | + const notify = process.env.NOTIFY; + const paths = process.env.PATHS; + const excludes = process.env.EXCLUDES; + + const matchedList = process.env.MATCHED + .split("\n") + .map(s => s.trim()) + .filter(Boolean); + + const rawLog = process.env.LOG; + const lines = rawLog.split("\n"); + + const shaSet = new Set(); + let currentSha = null; + + for (const line of lines) { + if (line.startsWith("COMMIT:")) { + currentSha = line.substring("COMMIT:".length).trim(); + } else { + const file = line.trim(); + if (!file || !currentSha) continue; + + if (matchedList.includes(file)) { + shaSet.add(currentSha); + } + } + } + + const commitUrls = shaSet.size + ? Array.from(shaSet).map(sha => `- https://github.com/${context.repo.owner}/${context.repo.repo}/commit/${sha}`).join("\n") + : "(No commits specifically touched monitored files)"; + + const body = ` + Changes detected in english files. + + Changed files: + ${JSON.stringify(matchedList, null, 2)} + + See changes in the commits affecting monitored files: + ${commitUrls} + + Notifying: ${notify} + `; + + core.setOutput('body', body); + + - name: Resolve discussion category + id: discussion_meta + if: steps.check.outputs.alert == 'true' + uses: actions/github-script@v9 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const QUERY = `query ($owner: String!, $name: String!) { + repository(owner: $owner, name: $name) { + id + discussionCategories(first: 50) { + nodes { id slug } + } + } + }`; + + const data = await github.graphql(QUERY, { + owner: context.repo.owner, + name: context.repo.repo + }); + + const category = data.repository.discussionCategories.nodes + .find(c => c.slug === "announcements"); + + if (!category) { + core.setFailed("Discussion category not found."); + return; + } + + core.setOutput("repository_id", data.repository.id); + core.setOutput("category_id", category.id); + + - name: Determine release title + id: release + if: steps.check.outputs.alert == 'true' + run: | + RELEASE_TAG=$(git describe --tags --abbrev=0) + RELEASE_TITLE="Translation alerts for release ${RELEASE_TAG}" + echo "title=$RELEASE_TITLE" >> $GITHUB_OUTPUT + + - name: Find or create release discussion + id: discussion + if: steps.check.outputs.alert == 'true' + uses: actions/github-script@v9 + env: + REPOSITORY_ID: ${{ steps.discussion_meta.outputs.repository_id }} + CATEGORY_ID: ${{ steps.discussion_meta.outputs.category_id }} + TITLE: ${{ steps.release.outputs.title }} + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const repoId = process.env.REPOSITORY_ID; + const categoryId = process.env.CATEGORY_ID; + const title = process.env.TITLE; + + const FIND = `query ($owner: String!, $name: String!) { + repository(owner: $owner, name: $name) { + discussions(first: 50) { + nodes { id title category { id } } + } + } + }`; + + const result = await github.graphql(FIND, { + owner: context.repo.owner, + name: context.repo.repo + }); + + let discussion = result.repository.discussions.nodes + .find(d => d.title === title && d.category?.id === categoryId); + + if (!discussion) { + const CREATE = `mutation ($input: CreateDiscussionInput!) { + createDiscussion(input: $input) { + discussion { id } + } + }`; + + const created = await github.graphql(CREATE, { + input: { + repositoryId: repoId, + categoryId, + title, + body: "Translation updates for this release." + } + }); + + discussion = created.createDiscussion.discussion; + } + + core.setOutput("discussion_id", discussion.id); + + - name: Post alert comment + if: steps.check.outputs.alert == 'true' + uses: actions/github-script@v9 + env: + DISCUSSION_ID: ${{ steps.discussion.outputs.discussion_id }} + BODY: ${{ steps.message.outputs.body }} + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const discussionId = process.env.DISCUSSION_ID; + const body = process.env.BODY; + + const ADD = `mutation ($input: AddDiscussionCommentInput!) { + addDiscussionComment(input: $input) { + comment { id } + } + }`; + + await github.graphql(ADD, { + input: { + discussionId: discussionId, + body: body + } + }); \ No newline at end of file From 1af0b432f867bfcb3e0803eb191931a0dc0a01b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Wed, 9 Sep 2026 19:25:46 +0200 Subject: [PATCH 122/162] Add comment to cron schedule in translator-alert.yml --- .github/workflows/translator-alert.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/translator-alert.yml b/.github/workflows/translator-alert.yml index c8c54c397..0ceacbae1 100644 --- a/.github/workflows/translator-alert.yml +++ b/.github/workflows/translator-alert.yml @@ -6,7 +6,7 @@ permissions: on: schedule: - - cron: '3 14 1,15 * *' + - cron: '3 14 1,15 * *' # 14:03 UTC on day 1 and 15 of the month jobs: alert: @@ -265,4 +265,4 @@ jobs: discussionId: discussionId, body: body } - }); \ No newline at end of file + }); From 6172909b5eb6194aa0f807bb0afa37e859102a84 Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 14:55:53 +0200 Subject: [PATCH 123/162] de: fix "k-th root" --- Rules/Languages/de/ClearSpeak_Rules.yaml | 2 +- Rules/Languages/de/SimpleSpeak_Rules.yaml | 2 +- tests/Languages/de/ClearSpeak/mroot.rs | 14 +++++++++++--- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Rules/Languages/de/ClearSpeak_Rules.yaml b/Rules/Languages/de/ClearSpeak_Rules.yaml index c1dd81eb5..0436516f5 100644 --- a/Rules/Languages/de/ClearSpeak_Rules.yaml +++ b/Rules/Languages/de/ClearSpeak_Rules.yaml @@ -90,7 +90,7 @@ if: "*[2][self::m:mi][string-length(.)=1]" then: - x: "*[2]" - - pronounce: [text: "-th", ipa: "Ξ", sapi5: "th", eloquence: "T"] + - pronounce: [text: "-te", ipa: "te", sapi5: "te", eloquence: "T"] else: [x: "*[2]"] - T: "wurzel" - test: diff --git a/Rules/Languages/de/SimpleSpeak_Rules.yaml b/Rules/Languages/de/SimpleSpeak_Rules.yaml index 4d48fd27e..f5afa4120 100644 --- a/Rules/Languages/de/SimpleSpeak_Rules.yaml +++ b/Rules/Languages/de/SimpleSpeak_Rules.yaml @@ -66,7 +66,7 @@ if: "*[2][self::m:mi][string-length(.)=1]" then: - x: "*[2]" - - pronounce: [text: "-th", ipa: "Ξ", sapi5: "th", eloquence: "T"] + - pronounce: [text: "-te", ipa: "te", sapi5: "te", eloquence: "T"] else: [x: "*[2]"] - T: "wurzel" # phrase(the square 'root' of) - test: diff --git a/tests/Languages/de/ClearSpeak/mroot.rs b/tests/Languages/de/ClearSpeak/mroot.rs index 5acba4ebb..577c6751a 100644 --- a/tests/Languages/de/ClearSpeak/mroot.rs +++ b/tests/Languages/de/ClearSpeak/mroot.rs @@ -119,17 +119,25 @@ fn ordinal_root() -> Result<()> { } -/* // should have n-te wurze #[test] -fn simple_mi_root() -> Result<()> { +fn variable_root_index_uses_german_ordinal_suffix() -> Result<()> { + // A variable root index uses the German ordinal suffix in both speech styles. let expr = " x n "; - test("de", "ClearSpeak", expr, "die n-th wurzel von x")?; + test("de", "ClearSpeak", expr, "die n-te wurzel von x")?; + test("de", "SimpleSpeak", expr, "die n-te wurzel von x")?; + + let expr = " + x k + "; + test("de", "ClearSpeak", expr, "die k-te wurzel von x")?; + test("de", "SimpleSpeak", expr, "die k-te wurzel von x")?; return Ok(()); } +/* #[test] fn mroot_simple_pos_end_root() -> Result<()> { let expr = " From 71f2f8ac4ac317c3a3242cf788899ad8fe9797c5 Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 15:03:40 +0200 Subject: [PATCH 124/162] de: fix "negativ positiv" --- Rules/Languages/de/ClearSpeak_Rules.yaml | 6 +++--- Rules/Languages/de/definitions.yaml | 4 ++-- tests/Languages/de/ClearSpeak/intervals.rs | 6 +++--- tests/Languages/de/ClearSpeak/mroot.rs | 2 +- .../de/ClearSpeak/symbols_and_adornments.rs | 8 ++++---- tests/Languages/de/mtable.rs | 2 +- tests/Languages/de/shared.rs | 13 +++++++++++++ 7 files changed, 27 insertions(+), 14 deletions(-) diff --git a/Rules/Languages/de/ClearSpeak_Rules.yaml b/Rules/Languages/de/ClearSpeak_Rules.yaml index 0436516f5..eed98a687 100644 --- a/Rules/Languages/de/ClearSpeak_Rules.yaml +++ b/Rules/Languages/de/ClearSpeak_Rules.yaml @@ -108,7 +108,7 @@ then: [pause: short] else: [pause: long] -# The 'negative' rule interacts with the msqrt/mroot rules as those might pick off this case ("the negative square root of x") +# Prefix signs interact with the msqrt/mroot rules as those might pick off this case. - name: negative_and_positive tag: [plus, minus] match: "count(*)=1 and contains(@data-intent-property, ':prefix:')" @@ -122,8 +122,8 @@ - bookmark: "@id" - test: if: "self::m:minus" - then: [T: "negative"] - else: [T: "positive"] + then: [T: "minus"] + else: [T: "plus"] - x: "*[1]" # Fraction rules diff --git a/Rules/Languages/de/definitions.yaml b/Rules/Languages/de/definitions.yaml index 427eec726..bb54a3c82 100644 --- a/Rules/Languages/de/definitions.yaml +++ b/Rules/Languages/de/definitions.yaml @@ -25,8 +25,8 @@ "lim-inf": "prefix=lim inf bei: der untere grenzwert bei : der untere grenzwert bei", "logarithm-with-base": "prefix=logarithmus basis: der logarithmus basis: der logarithmus basis", "natural-logarithm": "function=ln: natĂŒrlicher logarithmus: natĂŒrlicher logarithmus", - "minus": "infix=minus || prefix=negativ", - "plus": "infix=plus || prefix=positiv", + "minus": "infix=minus || prefix=minus", + "plus": "infix=plus || prefix=plus", "real-part": "function=der reale teil", "transpose": "postfix=transponiert || function=die Transponierte", "magnitude": "function=; Norm: Norm: Norm; Ende Norm", diff --git a/tests/Languages/de/ClearSpeak/intervals.rs b/tests/Languages/de/ClearSpeak/intervals.rs index 3bf359a55..e3a5a8ff1 100644 --- a/tests/Languages/de/ClearSpeak/intervals.rs +++ b/tests/Languages/de/ClearSpeak/intervals.rs @@ -80,7 +80,7 @@ fn interval_negative_infinity_to_open_endpoint() -> Result<()> { "ClearSpeak_Paren", "Interval", expr, - "das Intervall negative unendlich bis d, nicht einschließlich d", + "das Intervall minus unendlich bis d, nicht einschließlich d", ) } @@ -96,7 +96,7 @@ fn interval_negative_infinity_to_closed_endpoint() -> Result<()> { "ClearSpeak_Paren", "Interval", expr, - "das Intervall negative unendlich bis d, einschließlich d", + "das Intervall minus unendlich bis d, einschließlich d", ) } @@ -144,6 +144,6 @@ fn interval_between_infinities_has_no_endpoint_qualifier() -> Result<()> { "ClearSpeak_Paren", "Interval", expr, - "das Intervall negative unendlich bis unendlich", + "das Intervall minus unendlich bis unendlich", ) } diff --git a/tests/Languages/de/ClearSpeak/mroot.rs b/tests/Languages/de/ClearSpeak/mroot.rs index 577c6751a..e237552dc 100644 --- a/tests/Languages/de/ClearSpeak/mroot.rs +++ b/tests/Languages/de/ClearSpeak/mroot.rs @@ -71,7 +71,7 @@ fn neg_without_root() -> Result<()> { let expr = " - x - y "; - test("de", "ClearSpeak", expr, "negative x minus y")?; + test("de", "ClearSpeak", expr, "minus x minus y")?; return Ok(()); } diff --git a/tests/Languages/de/ClearSpeak/symbols_and_adornments.rs b/tests/Languages/de/ClearSpeak/symbols_and_adornments.rs index f0c5cb6b3..535de28ed 100644 --- a/tests/Languages/de/ClearSpeak/symbols_and_adornments.rs +++ b/tests/Languages/de/ClearSpeak/symbols_and_adornments.rs @@ -85,7 +85,7 @@ fn ellipses_auto_start() -> Result<()> { 
, -2,-1,0 "; - test("de", "ClearSpeak", expr, "punkt punkt punkt komma negative 2 komma negative 1 komma 0")?; + test("de", "ClearSpeak", expr, "punkt punkt punkt komma minus 2 komma minus 1 komma 0")?; return Ok(()); } @@ -135,7 +135,7 @@ fn ellipses_auto_both() -> Result<()> { ,
 "; test_ClearSpeak("de", "ClearSpeak_Ellipses", "Auto", expr, - "punkt punkt punkt komma negative 2 komma negative 1 komma 0 komma 1 komma 2 komma punkt punkt punkt")?; + "punkt punkt punkt komma minus 2 komma minus 1 komma 0 komma 1 komma 2 komma punkt punkt punkt")?; return Ok(()); } @@ -146,7 +146,7 @@ fn ellipses_and_so_on_start() -> Result<()> { 
, -2,-1,0 "; - test_ClearSpeak("de", "ClearSpeak_Ellipses", "AndSoOn", expr, "punkt punkt punkt komma negative 2 komma negative 1 komma 0")?; + test_ClearSpeak("de", "ClearSpeak_Ellipses", "AndSoOn", expr, "punkt punkt punkt komma minus 2 komma minus 1 komma 0")?; return Ok(()); } @@ -196,7 +196,7 @@ fn ellipses_and_so_on_both() -> Result<()> { ,
 "; test_ClearSpeak("de", "ClearSpeak_Ellipses", "AndSoOn", expr, - "punkt punkt punkt komma negative 2 komma negative 1 komma 0 komma 1 komma 2 komma punkt punkt punkt")?; + "punkt punkt punkt komma minus 2 komma minus 1 komma 0 komma 1 komma 2 komma punkt punkt punkt")?; return Ok(()); } diff --git a/tests/Languages/de/mtable.rs b/tests/Languages/de/mtable.rs index d8ad1aa28..e00273738 100644 --- a/tests/Languages/de/mtable.rs +++ b/tests/Languages/de/mtable.rs @@ -1196,7 +1196,7 @@ fn identity_matrix_false_positive_negative_one() -> Result<()> { ] "; test_prefs("de", "SimpleSpeak", vec![("Verbosity", "Terse")], - expr, "die 2 mal 2 diagonalmatrix; spalte 1; 1; spalte 2; negativ 1")?; + expr, "die 2 mal 2 diagonalmatrix; spalte 1; 1; spalte 2; minus 1")?; Ok(()) } diff --git a/tests/Languages/de/shared.rs b/tests/Languages/de/shared.rs index 93d570108..3b86d7d89 100644 --- a/tests/Languages/de/shared.rs +++ b/tests/Languages/de/shared.rs @@ -37,6 +37,19 @@ fn variable_powers() -> Result<()> { Ok(()) } +#[test] +fn unary_signs_use_plus_and_minus() -> Result<()> { + // Unary signs use their mathematical names rather than adjectival forms. + let signed_numbers = "−5,+5"; + test("de", "ClearSpeak", signed_numbers, "minus 5 komma plus 5")?; + test("de", "SimpleSpeak", signed_numbers, "minus 5 komma plus 5")?; + + let negative_root = "−x"; + test("de", "ClearSpeak", negative_root, "minus die quadratwurzel von x")?; + test("de", "SimpleSpeak", negative_root, "minus die quadratwurzel von x")?; + Ok(()) +} + #[test] fn modified_vars() -> Result<()> { let expr = " From 8ebda89cceeb59bee377e60b4696e18718c28609 Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 15:45:07 +0200 Subject: [PATCH 125/162] de: fix RPM singular/plural --- Rules/Languages/de/definitions.yaml | 4 ++-- tests/Languages/de/units.rs | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Rules/Languages/de/definitions.yaml b/Rules/Languages/de/definitions.yaml index bb54a3c82..73dfcf7f7 100644 --- a/Rules/Languages/de/definitions.yaml +++ b/Rules/Languages/de/definitions.yaml @@ -96,7 +96,7 @@ "pc": "parsec", "Å": "Ă„ngström", "Å": "Ă„ngström", "fm": "fermi", "ha": "hektar", "dB": "dezibel", "amu": "atommasse-einheit", "atm": "atmosphĂ€re", "bar": "bar", "cal": "kalorie", "Ci": "curie", "grad": "gon", "M": "mol/liter", - "R": "röntgen", "rpm": "umdrehungen pro minute", "℧": "mho", "dyn": "dyn", "erg": "erg", + "R": "röntgen", "rpm": "Umdrehung pro Minute", "℧": "mho", "dyn": "dyn", "erg": "erg", "Kib": "kibi-bit", "Mib": "mebi-bit", "Gib": "gibi-bit", "Tib": "tebi-bit", "Pib": "pebi-bit", "Eib": "exbi-bit", "Zib": "zebi-bit", "Yib": "yobi-bit", "KiB": "kibi-byte", "MiB": "mebi-byte", "GiB": "gibi-byte", "TiB": "tebi-byte", "PiB": "pebi-byte", "EiB": "exbi-byte", @@ -204,7 +204,7 @@ "kibi-byte": "kibi-byte", "mebi-byte": "mebi-byte", "gibi-byte": "gibi-byte", "tebi-byte": "tebi-byte", "pebi-byte": "pebi-byte", "exbi-byte": "exbi-byte", "zebi-byte": "zebi-byte", "yobi-byte": "yobi-byte", - "umdrehungen pro minute": "umdrehungen pro minute" + "Umdrehung pro Minute": "Umdrehungen pro Minute" } diff --git a/tests/Languages/de/units.rs b/tests/Languages/de/units.rs index 605ac2ed1..06de867e2 100644 --- a/tests/Languages/de/units.rs +++ b/tests/Languages/de/units.rs @@ -120,6 +120,24 @@ fn currency_symbol_precedes_amount() -> Result<()> { Ok(()) } +#[test] +fn rpm_uses_singular_and_plural_forms() -> Result<()> { + // The unit name is singular only for a coefficient of exactly one. + test( + "de", + "SimpleSpeak", + r#"1rpm"#, + "1 Umdrehung pro Minute", + )?; + test( + "de", + "SimpleSpeak", + r#"2rpm"#, + "2 Umdrehungen pro Minute", + )?; + Ok(()) +} + /* #[test] fn si_base_with_prefixes() -> Result<()> { From 32d7a9c6872e4e19b9bcdfee72faec28a1725149 Mon Sep 17 00:00:00 2001 From: mgros Date: Wed, 23 Sep 2026 00:36:24 +0200 Subject: [PATCH 126/162] Set CRLF line endings for .rs and .yaml files --- .editorconfig | 7 + .gitattributes | 2 + Rules/Languages/de/unicode.yaml | 930 ++++++++++++++++---------------- 3 files changed, 474 insertions(+), 465 deletions(-) create mode 100644 .editorconfig create mode 100644 .gitattributes diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..f8b039633 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,7 @@ +root = true + +[*.rs] +end_of_line = crlf + +[*.yaml] +end_of_line = crlf diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..40c212418 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.rs text eol=crlf +*.yaml text eol=crlf diff --git a/Rules/Languages/de/unicode.yaml b/Rules/Languages/de/unicode.yaml index f8b0ec641..2a093e90b 100644 --- a/Rules/Languages/de/unicode.yaml +++ b/Rules/Languages/de/unicode.yaml @@ -1,476 +1,476 @@ ---- - # Note to translators: - # most languages don't have two ways to pronounce 'a' -- if not need, remove the rules and change "B-Z" to "A-Z" - # some languages say the word for "uppercase" after the letter. Make sure to change that where appropriate by moving some code around - - "a-z": - - test: - if: "$TTS='none'" - then: [ T: "." ] # (en: '.', google translation) - else: [ spell: "'.'" ] - -# Capital letters are a little tricky: users can pick their favorite word (something that was requested) and - # screen readers have options to use pitch changes or beeps instead of or in addition to say "cap" - # Also, if a user can see the screen, they probably don't need to hear "cap", but if they specified an override, they must want to hear the override. - - - "A-Z": - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "groß"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - # note: processing of ranges converts '.' into the character, so it needs to be in quotes below - replace: [spell: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"] - - - "0-9": [T: "."] # (en: '.', google: 'A') - - - "!": # 0x21 - - test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':structure:')]" - then_test: - if: "$Verbosity = ' '" - then: [T: "knall"] # 0x21 (en: 'bang', google translation) - else: [T: "ausrufezeichen"] # 0x21 (en: 'exclamation point') - else: [T: "fakultĂ€t"] # 0x21 (en: 'factorial') - - - "\"": [T: "anfĂŒhrungszeichen"] # 0x22 (en: 'quotation mark') - - "#": [T: "nummernzeichen"] # 0x23 (en: 'number') - - "$": [T: "dollar"] # 0x24 (en: 'dollars') - - "%": [T: "prozent"] # 0x25 (en: 'percent') - - "&": [T: "kaufmĂ€nnisches und"] # 0x26 (en: 'ampersand') - - "'": [T: "hochkomma"] # 0x27 (en: 'apostrophe', MathPlayer: 'Hochkomma', google: 'apostroph') - - "(": # 0x28 - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then_test: - if: "$Verbosity='Terse'" - then: [T: "klammer auf"] # 0x28 (en: 'open', google translation) #unklar - else: [T: "klammer auf"] # 0x28 (en: 'open paren') - else: [T: "klammer auf"] # 0x28 (en: 'left paren') - - ")": # 0x29 - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then_test: - if: "$Verbosity='Terse'" - then: [T: "klammer zu"] # 0x29 (en: 'close', google translation) #unklar - else: [T: "klammer zu"] # 0x29 (en: 'close paren') - else: [T: "klammer zu"] # 0x29 (en: 'right paren') - - - "*": # 0x2a - test: - if: "parent::*[name(.)='msup' or name(.)='msubsup' or name(.)='skip-super']" - then: [T: "stern"] # 0x2a (en: 'star', google translation) - else: [T: "mal"] # 0x2a - - "+": [T: "plus"] # 0x2b - - ",": # 0x2c - # the following deals with the interaction of "," with "
" which sometimes wants the ',' to be silent - # that this test is here and not with "
" is not ideal, but seems simplest - test: - if: - - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or " - # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' - # speak "comma" when not adjacent to '
' - - "( following-sibling::*[1][text()!= '
'] and preceding-sibling::*[1][text()!='
'] ) or " - # except if expression starts with '
' - - "../*[1][text()='
'] " - then: [T: "komma"] # (en: 'comma', google translation) - # else silent - - - "-": [T: "minus"] # 0x2d - - ".": # 0x2e - - test: - if: "parent::*[1][self::m:mn]" - then: [T: "punkt"] # (en: 'point', google translation) - else: [T: "punkt"] # (en: 'dot', google: 'punkt') - - "/": [T: "schrĂ€gstrich"] # 0x2f (en: 'divided by') - - ":": [T: "doppelpunkt"] # 0x3a (en: 'colon') - - ";": [T: "strichpunkt"] # 0x3b (en: 'semicolon') - - "<": # 0x3c - - test: - if: "$Verbosity!='Terse'" - then: [T: "ist"] # (en: 'is', google translation) - - T: "kleiner als" # (en: 'less than') - - "=": # 0x3d - - test: - if: "$Verbosity!='Terse'" - then: [T: "ist gleich"] # (en: 'is equal to', google translation) - else: [T: "ist gleich"] # (en: 'equals') - - - ">": # 0x3e - - test: - if: "$Verbosity!='Terse'" - then: [T: "ist"] # (en: 'is', google translation) - - T: "grĂ¶ĂŸer als" # (en: 'greater than') - - "?": [T: "fragezeichen"] # 0x3f (en: 'question mark', MathPlayer: 'Frgezeichen', google: 'fragezeichen') - - "@": [T: "Ă€t-zeichen"] # 0x40 (en: 'at sign') - - "[": # 0x5b - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "offene eckige klammer"] # (en: 'open bracket', google translation) #unklar - else: [T: "eckige klammer auf"] # (en: 'left bracket', MathPlayer: 'eckig Klammer auf', google: 'linke klammer') - - "\\": [T: "eckige klammer auf"] # 0x5c (en: 'back slash', MathPlayer: 'eckig Klammer auf', google: 'rĂŒckenstrich') - - "]": # 0x5d - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "schließende eckige klammer"] # (en: 'close bracket', google translation) #unklar - else: [T: "eckige klammer zu"] # (en: 'right bracket') - - "^": [T: "zirkumflex"] # 0x5e (en: 'hat') - - "_": [T: "unterstrich"] # 0x5f (en: 'under bar', MathPlayer: 'under bar', google: 'unter bar') - - "`": [T: "gravis akzent"] # 0x60 (en: 'grave', MathPlayer: 'grave accent', google: 'grab') - - "{": # 0x7b - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "offene geschweifte klammer"] # (en: 'open brace', google translation) - else: [T: "geschweifte klammer auf"] # (en: 'left brace') - - "|": # 0x7c - # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' - - test: - - if: "$SpeechStyle != 'ClearSpeak' or not(preceding-sibling::*) or not(following-sibling::*)" - then: [T: "senkrechter strich"] # (en: 'vertical line', google translation) - - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" - then: [T: "so dass"] # (en: 'such that', google translation) - - else_if: "$ClearSpeak_VerticalLine = 'Given'" - then: [T: "gegeben"] # (en: 'given', google translation) - - else: [T: "teilt"] # (en: 'divides') - - - "}": # 0x7d - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "schließende geschweifte klammer"] # (en: 'close brace', google translation) - else: [T: "geschweifte klammer zu"] # (en: 'right brace') - - - "~": [T: "tilde"] # 0x7e - - " ": # 0xa0 - - test: - if: "@data-empty-in-2D and ../../../../*[name(.)!='equations']" - then: [T: "leer"] # want to say something for fraction (etc) with empty child (en: 'empty', google translation) - else: [T: ""] - - - "ÂŹ": [T: "nicht"] # 0xac (en: 'not') - - "°": [T: "grad"] # 0xb0 (en: 'degrees') - - "±": [T: "plus minus"] # 0xb1 (en: 'plus or minus') - - "ÂŽ": [T: "akut akzent"] # 0xb4 (en: 'acute', MathPlayer: 'acute accent', google: 'akut') - - "·": # 0xB7 - - test: - if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolDot = 'Auto'" - then: [T: "mal"] # (en: 'times', google translation) - else: [T: "mal"] # (en: 'dot', MathPlayer: 'Punkt mittig', google: 'punkt') - - "×": # 0xd7 - - test: - if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolX = 'Auto'" - then: [T: "mal"] # (en: 'times', google translation) - else_test: - if: $ClearSpeak_MultSymbolX = 'By' - then: [T: "von"] # (en: 'by', google translation) - else: [T: "mal"] # (en: 'cross', MathPlayer: 'times', google: 'kreuzen') #unklar - - "Ă·": [T: "geteilt durch"] # 0xf7 (en: 'divided by', MathPlayer: 'divides') - - "̀": [T: "accent grave"] # 0x300 (en: 'grave accent embellishment', google: 'grabakzentverzierung') - - "́": [T: "accent aigu"] # 0x301 (en: 'acute accent embellishment', google: 'akute akzentverzierung') - - "̂": [T: "zirkumflex"] # 0x302 (en: 'circumflex accent embellishment', google: 'zirma akzentverzierung') - - "̃": [T: "tilde"] # 0x303 (google: 'tilde verzierung') - - "̄": [T: "makron"] # 0x304 (en: 'macron embellishment', google: 'makron -verzierung') - - "̅": [T: "ĂŒberstrich"] # 0x305 (google: 'ĂŒberbĂ€rerverzierung') - - "̆": [T: "brevis"] # 0x306 (en: 'breve', google: 'breve') - - "̇": [T: "punkt darĂŒber"] # 0x307 (google: 'punkt ĂŒber verzierung') - - # Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong - - "Α-Ω": - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "großbuchstabe"] # (en: 'cap', google translation) #großbuchstaben? - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - # note: processing of ranges converts '.' into the character, so it needs to be in quotes below - replace: [spell: "translate('.', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')"] - - - "α": [T: "alpha"] # 0x3b1 - - "ÎČ": [T: "beta"] # 0x3b2 - - "Îł": [T: "gamma"] # 0x3b3 - - "ÎŽ": [T: "delta"] # 0x3b4 - - "Δ": [T: "epsilon"] # 0x3b5 - - "ζ": [T: "zeta"] # 0x3b6 - - "η": [T: "eta"] # 0x3b7 - - "Ξ": [T: "theta"] # 0x3b8 - - "Îč": [T: "iota"] # 0x3b9 (google: 'jota') - - "Îș": [T: "kappa"] # 0x3ba - - "λ": [T: "lambda"] # 0x3bb (en: 'lambda', google: 'lambda') - - "ÎŒ": [T: "mĂŒ"] # 0x3bc - - "Μ": [T: "nĂŒ"] # 0x3bd - - "Ο": [T: "xi"] # 0x3be (en: 'zai', google: 'zai') - - "Îż": [T: "omicron"] # 0x3bf - - "π": [T: "pi"] # 0x3c0 - - "ρ": [T: "rho"] # 0x3c1 - - "ς": [T: "sigma am wortende"] # 0x3c2 - - "σ": [T: "sigma"] # 0x3c3 - - "τ": [T: "tau"] # 0x3c4 - - "υ": [T: "ĂŒpsilon"] # 0x3c5 #ypsilon - - "φ": [T: "phi"] # 0x3c6 - - "χ": [T: "chi"] # 0x3c7 - - "ψ": [T: "psi"] # 0x3c8 - - "ω": [T: "omega"] # 0x3c9 - - "ϕ": [T: "phi"] # 0x3d5 (en: 'phi', google: 'phi') - - "ϖ": [T: "pi"] # 0x3d6 (en: 'pi', google: 'pi') - - "Ï”": [T: "epsilon"] # 0x3f5 - - "϶": [T: "umgekehrtes epsilon"] # 0x3f6 (en: 'reversed epsilon', MathPlayer: 'reversed epsilon', google: 'umgekehrter epsilon') - - - "⁥": # 0x2061 - - test: - if: "$Verbosity!='Terse' and not(preceding-sibling::*[1][IsInDefinition(., 'GeometryShapes')]) and - not(@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':structure:')])" - then: [T: "von"] # (en: 'of', google translation) - - "⁹": [T: ""] # 0x2062 - - "⁣": [T: ""] # 0x2063 - - "⁀": [T: "und"] # 0x2064 (en: 'and', google: 'und') - - "ℂℕℚℝ℀": # here we rely on this running through the table again to speak "cap xxx" - - T: "drei Strich" # (en: 'double-struck', MathPlayer: 'drei-strich', google: 'doppelter takt') - - spell: "translate('.', 'ℂℕℚℝ℀', 'CNQRZ')" - - - "℃": [T: "grad celsius"] # 0x2103 (google: 'grad celsius') - - "ℋℛℓ": # 0x210b #klĂ€ren - - T: "schreibschrift" # (en: 'script', google: 'skript') - - spell: "translate('.', 'ℋℛℓ', 'HRl')" - - "ℜ": # 0x211c - - T: "frakturschrift groß r" # (en: 'fraktur', google: 'fraktur') - - spell: "'R'" - - - "ⅆⅇⅈⅉ": # 0x2146-9 - - T: "doppelstrich kursiv" # (en: 'double-struck italic', MathPlayer: 'angstroms', google: 'doppelt ĂŒbertroffene kursivschrift') - - spell: "translate('.', 'ⅆⅇⅈⅉ', 'deij')" - - - "∄": # 0x2225 - - test: - if: "$Verbosity!='Terse'" - then: [T: "ist"] # (en: 'is', google translation) - - T: "parallel zu" # (en: 'parallel to') - - "∊": # 0x2226 - - test: - if: "$Verbosity!='Terse'" - then: [T: "ist"] # (en: 'is', google translation) - - T: "nicht parallel zu" # (en: 'not parallel to') - - "≀": # 0x2264 - - test: - if: "$Verbosity!='Terse'" - then: [T: "ist"] # (en: 'is', google translation) - - T: "kleiner gleich" - - "≄": # 0x2265 - - test: - if: "$Verbosity!='Terse'" - then: [T: "ist"] # (en: 'is', google translation) - - T: "grĂ¶ĂŸer gleich" # (en: 'greater than or equal to') - - # --- restored complex short definitions (prefer over unicode-full) --- - - "
": # 0x2026 - test: - if: - - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" - # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' - # speak '
' as 'and so on...' unless expr starts with '
' - - "../*[1][text()='
']" - then: [T: "punkt punkt punkt"] # (en: 'dot dot dot', google translation) - else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' - if: "count(following-sibling::*) = 0" - then: [T: "und so weiter"] # (en: 'and so on', google translation) - else: [T: "punkt punkt punkt"] # (en: 'and so on up to', MathPlayer: 'dot dot dot', google: 'und so weiter bis') #horizontale Ellipsis - - "→": # 0x2192 - - test: - if: "ancestor::*[2][self::m:limit]" - then: [T: "gegen"] # (en: 'approaches', google translation) - else: [T: "pfeil nach rechts"] # (en: 'right arrow', MathPlayer: 'rightwards arrow', google: 'rechter pfeil') - - "∂": # 0x2202 - - test: - if: "$Verbosity='Terse'" - then: [T: "teilweise"] # (en: 'partial', google translation) - else: [T: "partielle ableitung"] # (en: 'partial derivative', google: 'partielle ableitung') - - "∆": # 0x2206 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'the', google translation) - - T: "delta" # (en: 'laplacian of', MathPlayer: 'increment', google: 'laplace von') #unklar, sehr kontextabhĂ€ngig - - "∇": # 0x2207 - - test: - if: "$Verbosity!='Terse'" - then: [T: "der"] # (en: 'the', google translation) - - T: "nabla-operator" # (en: 'gradient of', google: 'gradient von') #gradient nur einer der drei möglichen differentialoperatoren - - "∈": # 0x2208 - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: [T: "ein element von"] # (en: 'an element of', google translation) - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: +--- + # Note to translators: + # most languages don't have two ways to pronounce 'a' -- if not need, remove the rules and change "B-Z" to "A-Z" + # some languages say the word for "uppercase" after the letter. Make sure to change that where appropriate by moving some code around + - "a-z": + - test: + if: "$TTS='none'" + then: [ T: "." ] # (en: '.', google translation) + else: [ spell: "'.'" ] + +# Capital letters are a little tricky: users can pick their favorite word (something that was requested) and + # screen readers have options to use pitch changes or beeps instead of or in addition to say "cap" + # Also, if a user can see the screen, they probably don't need to hear "cap", but if they specified an override, they must want to hear the override. + + - "A-Z": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "groß"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + # note: processing of ranges converts '.' into the character, so it needs to be in quotes below + replace: [spell: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"] + + - "0-9": [T: "."] # (en: '.', google: 'A') + + - "!": # 0x21 + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':structure:')]" + then_test: + if: "$Verbosity = ' '" + then: [T: "knall"] # 0x21 (en: 'bang', google translation) + else: [T: "ausrufezeichen"] # 0x21 (en: 'exclamation point') + else: [T: "fakultĂ€t"] # 0x21 (en: 'factorial') + + - "\"": [T: "anfĂŒhrungszeichen"] # 0x22 (en: 'quotation mark') + - "#": [T: "nummernzeichen"] # 0x23 (en: 'number') + - "$": [T: "dollar"] # 0x24 (en: 'dollars') + - "%": [T: "prozent"] # 0x25 (en: 'percent') + - "&": [T: "kaufmĂ€nnisches und"] # 0x26 (en: 'ampersand') + - "'": [T: "hochkomma"] # 0x27 (en: 'apostrophe', MathPlayer: 'Hochkomma', google: 'apostroph') + - "(": # 0x28 + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then_test: + if: "$Verbosity='Terse'" + then: [T: "klammer auf"] # 0x28 (en: 'open', google translation) #unklar + else: [T: "klammer auf"] # 0x28 (en: 'open paren') + else: [T: "klammer auf"] # 0x28 (en: 'left paren') + - ")": # 0x29 + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then_test: + if: "$Verbosity='Terse'" + then: [T: "klammer zu"] # 0x29 (en: 'close', google translation) #unklar + else: [T: "klammer zu"] # 0x29 (en: 'close paren') + else: [T: "klammer zu"] # 0x29 (en: 'right paren') + + - "*": # 0x2a + test: + if: "parent::*[name(.)='msup' or name(.)='msubsup' or name(.)='skip-super']" + then: [T: "stern"] # 0x2a (en: 'star', google translation) + else: [T: "mal"] # 0x2a + - "+": [T: "plus"] # 0x2b + - ",": # 0x2c + # the following deals with the interaction of "," with "
" which sometimes wants the ',' to be silent + # that this test is here and not with "
" is not ideal, but seems simplest + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or " + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak "comma" when not adjacent to '
' + - "( following-sibling::*[1][text()!= '
'] and preceding-sibling::*[1][text()!='
'] ) or " + # except if expression starts with '
' + - "../*[1][text()='
'] " + then: [T: "komma"] # (en: 'comma', google translation) + # else silent + + - "-": [T: "minus"] # 0x2d + - ".": # 0x2e + - test: + if: "parent::*[1][self::m:mn]" + then: [T: "punkt"] # (en: 'point', google translation) + else: [T: "punkt"] # (en: 'dot', google: 'punkt') + - "/": [T: "schrĂ€gstrich"] # 0x2f (en: 'divided by') + - ":": [T: "doppelpunkt"] # 0x3a (en: 'colon') + - ";": [T: "strichpunkt"] # 0x3b (en: 'semicolon') + - "<": # 0x3c + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) + - T: "kleiner als" # (en: 'less than') + - "=": # 0x3d + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist gleich"] # (en: 'is equal to', google translation) + else: [T: "ist gleich"] # (en: 'equals') + + - ">": # 0x3e + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) + - T: "grĂ¶ĂŸer als" # (en: 'greater than') + - "?": [T: "fragezeichen"] # 0x3f (en: 'question mark', MathPlayer: 'Frgezeichen', google: 'fragezeichen') + - "@": [T: "Ă€t-zeichen"] # 0x40 (en: 'at sign') + - "[": # 0x5b + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "offene eckige klammer"] # (en: 'open bracket', google translation) #unklar + else: [T: "eckige klammer auf"] # (en: 'left bracket', MathPlayer: 'eckig Klammer auf', google: 'linke klammer') + - "\\": [T: "eckige klammer auf"] # 0x5c (en: 'back slash', MathPlayer: 'eckig Klammer auf', google: 'rĂŒckenstrich') + - "]": # 0x5d + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "schließende eckige klammer"] # (en: 'close bracket', google translation) #unklar + else: [T: "eckige klammer zu"] # (en: 'right bracket') + - "^": [T: "zirkumflex"] # 0x5e (en: 'hat') + - "_": [T: "unterstrich"] # 0x5f (en: 'under bar', MathPlayer: 'under bar', google: 'unter bar') + - "`": [T: "gravis akzent"] # 0x60 (en: 'grave', MathPlayer: 'grave accent', google: 'grab') + - "{": # 0x7b + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "offene geschweifte klammer"] # (en: 'open brace', google translation) + else: [T: "geschweifte klammer auf"] # (en: 'left brace') + - "|": # 0x7c + # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' + - test: + - if: "$SpeechStyle != 'ClearSpeak' or not(preceding-sibling::*) or not(following-sibling::*)" + then: [T: "senkrechter strich"] # (en: 'vertical line', google translation) + - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" + then: [T: "so dass"] # (en: 'such that', google translation) + - else_if: "$ClearSpeak_VerticalLine = 'Given'" + then: [T: "gegeben"] # (en: 'given', google translation) + - else: [T: "teilt"] # (en: 'divides') + + - "}": # 0x7d + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "schließende geschweifte klammer"] # (en: 'close brace', google translation) + else: [T: "geschweifte klammer zu"] # (en: 'right brace') + + - "~": [T: "tilde"] # 0x7e + - " ": # 0xa0 + - test: + if: "@data-empty-in-2D and ../../../../*[name(.)!='equations']" + then: [T: "leer"] # want to say something for fraction (etc) with empty child (en: 'empty', google translation) + else: [T: ""] + + - "ÂŹ": [T: "nicht"] # 0xac (en: 'not') + - "°": [T: "grad"] # 0xb0 (en: 'degrees') + - "±": [T: "plus minus"] # 0xb1 (en: 'plus or minus') + - "ÂŽ": [T: "akut akzent"] # 0xb4 (en: 'acute', MathPlayer: 'acute accent', google: 'akut') + - "·": # 0xB7 + - test: + if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolDot = 'Auto'" + then: [T: "mal"] # (en: 'times', google translation) + else: [T: "mal"] # (en: 'dot', MathPlayer: 'Punkt mittig', google: 'punkt') + - "×": # 0xd7 + - test: + if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolX = 'Auto'" + then: [T: "mal"] # (en: 'times', google translation) + else_test: + if: $ClearSpeak_MultSymbolX = 'By' + then: [T: "von"] # (en: 'by', google translation) + else: [T: "mal"] # (en: 'cross', MathPlayer: 'times', google: 'kreuzen') #unklar + - "Ă·": [T: "geteilt durch"] # 0xf7 (en: 'divided by', MathPlayer: 'divides') + - "̀": [T: "accent grave"] # 0x300 (en: 'grave accent embellishment', google: 'grabakzentverzierung') + - "́": [T: "accent aigu"] # 0x301 (en: 'acute accent embellishment', google: 'akute akzentverzierung') + - "̂": [T: "zirkumflex"] # 0x302 (en: 'circumflex accent embellishment', google: 'zirma akzentverzierung') + - "̃": [T: "tilde"] # 0x303 (google: 'tilde verzierung') + - "̄": [T: "makron"] # 0x304 (en: 'macron embellishment', google: 'makron -verzierung') + - "̅": [T: "ĂŒberstrich"] # 0x305 (google: 'ĂŒberbĂ€rerverzierung') + - "̆": [T: "brevis"] # 0x306 (en: 'breve', google: 'breve') + - "̇": [T: "punkt darĂŒber"] # 0x307 (google: 'punkt ĂŒber verzierung') + + # Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong + - "Α-Ω": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "großbuchstabe"] # (en: 'cap', google translation) #großbuchstaben? + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + # note: processing of ranges converts '.' into the character, so it needs to be in quotes below + replace: [spell: "translate('.', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')"] + + - "α": [T: "alpha"] # 0x3b1 + - "ÎČ": [T: "beta"] # 0x3b2 + - "Îł": [T: "gamma"] # 0x3b3 + - "ÎŽ": [T: "delta"] # 0x3b4 + - "Δ": [T: "epsilon"] # 0x3b5 + - "ζ": [T: "zeta"] # 0x3b6 + - "η": [T: "eta"] # 0x3b7 + - "Ξ": [T: "theta"] # 0x3b8 + - "Îč": [T: "iota"] # 0x3b9 (google: 'jota') + - "Îș": [T: "kappa"] # 0x3ba + - "λ": [T: "lambda"] # 0x3bb (en: 'lambda', google: 'lambda') + - "ÎŒ": [T: "mĂŒ"] # 0x3bc + - "Μ": [T: "nĂŒ"] # 0x3bd + - "Ο": [T: "xi"] # 0x3be (en: 'zai', google: 'zai') + - "Îż": [T: "omicron"] # 0x3bf + - "π": [T: "pi"] # 0x3c0 + - "ρ": [T: "rho"] # 0x3c1 + - "ς": [T: "sigma am wortende"] # 0x3c2 + - "σ": [T: "sigma"] # 0x3c3 + - "τ": [T: "tau"] # 0x3c4 + - "υ": [T: "ĂŒpsilon"] # 0x3c5 #ypsilon + - "φ": [T: "phi"] # 0x3c6 + - "χ": [T: "chi"] # 0x3c7 + - "ψ": [T: "psi"] # 0x3c8 + - "ω": [T: "omega"] # 0x3c9 + - "ϕ": [T: "phi"] # 0x3d5 (en: 'phi', google: 'phi') + - "ϖ": [T: "pi"] # 0x3d6 (en: 'pi', google: 'pi') + - "Ï”": [T: "epsilon"] # 0x3f5 + - "϶": [T: "umgekehrtes epsilon"] # 0x3f6 (en: 'reversed epsilon', MathPlayer: 'reversed epsilon', google: 'umgekehrter epsilon') + + - "⁥": # 0x2061 + - test: + if: "$Verbosity!='Terse' and not(preceding-sibling::*[1][IsInDefinition(., 'GeometryShapes')]) and + not(@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':structure:')])" + then: [T: "von"] # (en: 'of', google translation) + - "⁹": [T: ""] # 0x2062 + - "⁣": [T: ""] # 0x2063 + - "⁀": [T: "und"] # 0x2064 (en: 'and', google: 'und') + - "ℂℕℚℝ℀": # here we rely on this running through the table again to speak "cap xxx" + - T: "drei Strich" # (en: 'double-struck', MathPlayer: 'drei-strich', google: 'doppelter takt') + - spell: "translate('.', 'ℂℕℚℝ℀', 'CNQRZ')" + + - "℃": [T: "grad celsius"] # 0x2103 (google: 'grad celsius') + - "ℋℛℓ": # 0x210b #klĂ€ren + - T: "schreibschrift" # (en: 'script', google: 'skript') + - spell: "translate('.', 'ℋℛℓ', 'HRl')" + - "ℜ": # 0x211c + - T: "frakturschrift groß r" # (en: 'fraktur', google: 'fraktur') + - spell: "'R'" + + - "ⅆⅇⅈⅉ": # 0x2146-9 + - T: "doppelstrich kursiv" # (en: 'double-struck italic', MathPlayer: 'angstroms', google: 'doppelt ĂŒbertroffene kursivschrift') + - spell: "translate('.', 'ⅆⅇⅈⅉ', 'deij')" + + - "∄": # 0x2225 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) + - T: "parallel zu" # (en: 'parallel to') + - "∊": # 0x2226 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) + - T: "nicht parallel zu" # (en: 'not parallel to') + - "≀": # 0x2264 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) + - T: "kleiner gleich" + - "≄": # 0x2265 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) + - T: "grĂ¶ĂŸer gleich" # (en: 'greater than or equal to') + + # --- restored complex short definitions (prefer over unicode-full) --- + - "
": # 0x2026 + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak '
' as 'and so on...' unless expr starts with '
' + - "../*[1][text()='
']" + then: [T: "punkt punkt punkt"] # (en: 'dot dot dot', google translation) + else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' + if: "count(following-sibling::*) = 0" + then: [T: "und so weiter"] # (en: 'and so on', google translation) + else: [T: "punkt punkt punkt"] # (en: 'and so on up to', MathPlayer: 'dot dot dot', google: 'und so weiter bis') #horizontale Ellipsis + - "→": # 0x2192 + - test: + if: "ancestor::*[2][self::m:limit]" + then: [T: "gegen"] # (en: 'approaches', google translation) + else: [T: "pfeil nach rechts"] # (en: 'right arrow', MathPlayer: 'rightwards arrow', google: 'rechter pfeil') + - "∂": # 0x2202 + - test: + if: "$Verbosity='Terse'" + then: [T: "teilweise"] # (en: 'partial', google translation) + else: [T: "partielle ableitung"] # (en: 'partial derivative', google: 'partielle ableitung') + - "∆": # 0x2206 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'the', google translation) + - T: "delta" # (en: 'laplacian of', MathPlayer: 'increment', google: 'laplace von') #unklar, sehr kontextabhĂ€ngig + - "∇": # 0x2207 + - test: + if: "$Verbosity!='Terse'" + then: [T: "der"] # (en: 'the', google translation) + - T: "nabla-operator" # (en: 'gradient of', google: 'gradient von') #gradient nur einer der drei möglichen differentialoperatoren + - "∈": # 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: [T: "ein element von"] # (en: 'an element of', google translation) + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' then: [T: "in"] - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "element von"] # (en: 'member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "element von"] # (en: 'element of', google translation) - - else: [T: "element von"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "ist ein element von"] # (en: 'is a member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "ist ein element von"] # (en: 'is an element of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "ist in"] # (en: 'is in', google translation) - - else: [T: "element von"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') - - "∉": # 0x2209 - # rule is identical to 0x2208 - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: [T: "ist kein element von"] # (en: 'is not an element of', google translation) - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: + then: [T: "element von"] # (en: 'member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "element von"] # (en: 'element of', google translation) + - else: [T: "element von"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "ist ein element von"] # (en: 'is a member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "ist ein element von"] # (en: 'is an element of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "ist in"] # (en: 'is in', google translation) + - else: [T: "element von"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') + - "∉": # 0x2209 + # rule is identical to 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: [T: "ist kein element von"] # (en: 'is not an element of', google translation) + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' then: [T: "nicht in"] - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "nicht element von"] # (en: 'not member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "nicht element von"] # (en: 'not element of', google translation) - - else: [T: "nicht element von"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'not belonging to') - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "ist kein element von"] # (en: 'is not a member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "ist kein element von"] # (en: 'is not an element of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "ist nicht in"] # (en: 'is not in', google translation) - - else: [T: "nicht element von"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'does not belong to') - - "∊": # 0x220a - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: [T: "ist ein element von"] # (en: 'is an element of', google translation) - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: + then: [T: "nicht element von"] # (en: 'not member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "nicht element von"] # (en: 'not element of', google translation) + - else: [T: "nicht element von"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'not belonging to') + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "ist kein element von"] # (en: 'is not a member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "ist kein element von"] # (en: 'is not an element of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "ist nicht in"] # (en: 'is not in', google translation) + - else: [T: "nicht element von"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'does not belong to') + - "∊": # 0x220a + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: [T: "ist ein element von"] # (en: 'is an element of', google translation) + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' then: [T: "in"] - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "element von"] # (en: 'member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "element von"] # (en: 'element of', google translation) - - else: [T: "element von"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "ist ein element von"] # (en: 'is a member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "ist ein element von"] # (en: 'is an element of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "ist in"] # (en: 'is in', google translation) - - else: [T: "element von"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') - - "∝": # 0x221d - - test: - if: "$Verbosity!='Terse'" - then: [T: "ist"] # (en: 'is', google translation) - - T: "proportional zu" # (en: 'proportional to') - - "∶": # 0x2236 - - test: - if: "$Verbosity!='Terse'" - then: [T: "ist"] # (en: 'is', google translation) #unklar - - T: "zu" # (en: 'to') - - "∟": # 0x223e - - test: - if: "$Verbosity!='Terse'" - then: [T: "ist"] # (en: 'is', google translation) - - T: "umgekehrtes stummes s" # (en: 'most positive', MathPlayer: 'inverted lazy s', google: 'am positivsten') - - "≠": # 0x2260 - - test: - if: "$Verbosity!='Terse'" - then: [T: "ist"] # (en: 'is', google translation) - - T: "ungleich" # (en: 'not equal to') - - "≡": # 0x2261 - - test: - if: "$Verbosity!='Terse'" - then: [T: "ist"] # (en: 'is', google translation) - - T: "identisch mit" # (en: 'identical to', SRE: 'kongruent mit') - - "⊂": # 0x2282 - - test: - if: "$Verbosity!='Terse'" - then: [T: "ist eine"] # (en: 'is a', google translation) - - T: "teilmenge von" # (en: 'subset of', MathPlayer: 'Teilmenge von', google: 'untergruppe von') - - "⊃": # 0x2283 - - test: - if: "$Verbosity!='Terse'" - then: [T: "ist eine"] # (en: 'is a', google translation) - - T: "obermenge von" # (en: 'superset of', MathPlayer: 'Obermenge von', google: 'superset von') - - "⊄": # 0x2284 - - test: - if: "$Verbosity!='Terse'" - then: [T: "ist"] # (en: 'is', google translation) - - T: "keine teilmenge von" # (en: 'not a subset of', MathPlayer: 'nicht Teilmenge von', google: 'keine teilmenge von') - - "⊅": # 0x2285 - - test: - if: "$Verbosity!='Terse'" - then: [T: "ist"] # (en: 'is', google translation) - - T: "keine obermenge von" # (en: 'not a superset of', MathPlayer: 'nicht Obermenge von', google: 'kein superset von') - - "⊆": # 0x2286 - - test: - if: "$Verbosity!='Terse'" - then: [T: "ist eine"] # (en: 'is a', google translation) + then: [T: "element von"] # (en: 'member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "element von"] # (en: 'element of', google translation) + - else: [T: "element von"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "ist ein element von"] # (en: 'is a member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "ist ein element von"] # (en: 'is an element of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "ist in"] # (en: 'is in', google translation) + - else: [T: "element von"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') + - "∝": # 0x221d + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) + - T: "proportional zu" # (en: 'proportional to') + - "∶": # 0x2236 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) #unklar + - T: "zu" # (en: 'to') + - "∟": # 0x223e + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) + - T: "umgekehrtes stummes s" # (en: 'most positive', MathPlayer: 'inverted lazy s', google: 'am positivsten') + - "≠": # 0x2260 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) + - T: "ungleich" # (en: 'not equal to') + - "≡": # 0x2261 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) + - T: "identisch mit" # (en: 'identical to', SRE: 'kongruent mit') + - "⊂": # 0x2282 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist eine"] # (en: 'is a', google translation) + - T: "teilmenge von" # (en: 'subset of', MathPlayer: 'Teilmenge von', google: 'untergruppe von') + - "⊃": # 0x2283 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist eine"] # (en: 'is a', google translation) + - T: "obermenge von" # (en: 'superset of', MathPlayer: 'Obermenge von', google: 'superset von') + - "⊄": # 0x2284 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) + - T: "keine teilmenge von" # (en: 'not a subset of', MathPlayer: 'nicht Teilmenge von', google: 'keine teilmenge von') + - "⊅": # 0x2285 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist"] # (en: 'is', google translation) + - T: "keine obermenge von" # (en: 'not a superset of', MathPlayer: 'nicht Obermenge von', google: 'kein superset von') + - "⊆": # 0x2286 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist eine"] # (en: 'is a', google translation) - T: "teilmenge von oder gleich" # (en: 'subset of or equal to', MathPlayer: 'Teilmenge von odre gleich', google: 'teilmenge von oder gleich') - - "⊇": # 0x2287 - - test: - if: "$Verbosity!='Terse'" - then: [T: "ist eine"] # (en: 'is a', google translation) + - "⊇": # 0x2287 + - test: + if: "$Verbosity!='Terse'" + then: [T: "ist eine"] # (en: 'is a', google translation) - T: "obermenge von oder gleich" # (en: 'superset of or equal to', MathPlayer: 'Obermenge von oder gleich', google: 'superset von oder gleich') - - # --- restored short definitions that differ from unicode-full --- - - "–": [T: "halbgeviertstrich"] # 0x2013 (SRE: 'En Dash') - - "—": [T: "geviertstrich"] # 0x2014 (SRE: 'EM Dash') - - "―": [T: "horizontale linie"] # 0x2015 (en: 'horizontal bar', MathPlayer: 'horizontal bar', google: 'horizontale linie') - - "‖": [T: "doppelte senkrechte linie"] # 0x2016 (en: 'double vertical line', MathPlayer: 'double vertical bar', google: 'doppelte vertikale linie') - - "â€Č": [T: "strich"] # 0x2032 (en: 'prime', MathPlayer: 'strich', google: 'prime') - - "″": [T: "zwei strich"] # 0x2033 (en: 'double prime', MathPlayer: 'zwei-strich', google: 'double prime') - - "‮": [T: "drei strich"] # 0x2034 (en: 'triple prime', MathPlayer: 'drei-strich', google: 'triple prime') - - "℉": [T: "grad fahrenheit"] # 0x2109 (google: 'grad fahrenheit') - - "ℎ": [T: "planck-konstante"] # 0x210e (en: 'planck constant', MathPlayer: 'planck constant', google: 'planck konstant') - - "℩": [T: "ohm"] # 0x2126 (en: 'ohms', MathPlayer: 'ohm sign', google: 'ohm') - - "â„Ș": [T: "kelvin"] # 0x212a (en: 'kelvin', MathPlayer: 'degrees kelvin', google: 'kelvin') - - "Å": [T: "angström"] # 0x212b (en: 'angstroms', MathPlayer: 'angstroms', google: 'angstrome') - - "←": [T: "pfeil nach links"] # 0x2190 (en: 'leftwards arrow', MathPlayer: 'leftwards arrow', google: 'pfeil nach links') - - "↑": [T: "pfeil nach oben"] # 0x2191 (en: 'upwards arrow', MathPlayer: 'upwards arrow', google: 'nach oben pfeil') - - "↓": [T: "pfeil nach unten"] # 0x2193 (en: 'downwards arrow', MathPlayer: 'downwards arrow', google: 'nach unten pfeil') - - "⇒": [T: "doppelpfeil nach rechts"] # 0x21d2 (en: 'rightwards double arrow', MathPlayer: 'rightwards double arrow', google: 'richtiger doppelpfeil') - - "∏": [T: "produkt"] # 0x220f (en: 'product', MathPlayer: 'Product', google: 'produkt') - - "∐": [T: "koprodukt"] # 0x2210 (en: 'co-product', MathPlayer: 'coproduct', google: 'ko-produkt') - - "∑": [T: "summe"] # 0x2211 (en: 'sum') - - "∗": [T: "mal"] # 0x2217 (en: 'times', MathPlayer: 'asterisk operator', google: 'mal') - - "√": # 0x221a - - T: "quadratwurzel" # (en: 'square root of', MathPlayer: 'radical', google: 'quadratwurzel von') - - "∟": [T: "rechter winkel"] # 0x221f (en: 'right angle') - - "∠": [T: "winkel"] # 0x2220 (en: 'angle') - - "∥": [T: "gerichteter winkel"] # 0x2221 (en: 'measured angle', MathPlayer: 'measured angle', google: 'gemessener winkel') - - "∩": [T: "schnitt mit"] # 0x2229 (en: 'intersection') #Problem: Schnittmenge wenn alleinstehend vor Bezeichnung, schnitt wenn zwischen 2 Mengen - - "âˆȘ": [T: "vereinigt mit"] # 0x222a (en: 'union') #Problem: vereinigungsmenge wenn alleinstehend vor Bezeichnung, vereinigt mit wenn zwischen 2 Mengen - - "∫": [T: "integral"] # 0x222b (en: 'integral') - - "∏": [T: "doppelintegral"] # 0x222c (en: 'double integral') - - "∭": [T: "dreifachintegral"] # 0x222d (en: 'triple integral', MathPlayer: 'Dreifaches Integral', google: 'dreifachintegral') - - "∟": [T: "randintegral"] # 0x222e (en: 'contour integral', MathPlayer: 'Kontur-Integral', google: 'konturintegral') - - "∷": [T: "proportional"] # 0x2237 (en: 'as') - - "∌": [T: "tilde"] # 0x223c (en: 'varies with', MathPlayer: 'tilde operator', google: 'variiert mit') - - "∜": [T: "umgekehrte tilde"] # 0x223d (en: 'reversed tilde', MathPlayer: 'reversed tilde', google: 'umgekehrte tilde') - - "∿": [T: "sinuswelle"] # 0x223f (en: 'sine wave', MathPlayer: 'sine wave', google: 'sinus') + + # --- restored short definitions that differ from unicode-full --- + - "–": [T: "halbgeviertstrich"] # 0x2013 (SRE: 'En Dash') + - "—": [T: "geviertstrich"] # 0x2014 (SRE: 'EM Dash') + - "―": [T: "horizontale linie"] # 0x2015 (en: 'horizontal bar', MathPlayer: 'horizontal bar', google: 'horizontale linie') + - "‖": [T: "doppelte senkrechte linie"] # 0x2016 (en: 'double vertical line', MathPlayer: 'double vertical bar', google: 'doppelte vertikale linie') + - "â€Č": [T: "strich"] # 0x2032 (en: 'prime', MathPlayer: 'strich', google: 'prime') + - "″": [T: "zwei strich"] # 0x2033 (en: 'double prime', MathPlayer: 'zwei-strich', google: 'double prime') + - "‮": [T: "drei strich"] # 0x2034 (en: 'triple prime', MathPlayer: 'drei-strich', google: 'triple prime') + - "℉": [T: "grad fahrenheit"] # 0x2109 (google: 'grad fahrenheit') + - "ℎ": [T: "planck-konstante"] # 0x210e (en: 'planck constant', MathPlayer: 'planck constant', google: 'planck konstant') + - "℩": [T: "ohm"] # 0x2126 (en: 'ohms', MathPlayer: 'ohm sign', google: 'ohm') + - "â„Ș": [T: "kelvin"] # 0x212a (en: 'kelvin', MathPlayer: 'degrees kelvin', google: 'kelvin') + - "Å": [T: "angström"] # 0x212b (en: 'angstroms', MathPlayer: 'angstroms', google: 'angstrome') + - "←": [T: "pfeil nach links"] # 0x2190 (en: 'leftwards arrow', MathPlayer: 'leftwards arrow', google: 'pfeil nach links') + - "↑": [T: "pfeil nach oben"] # 0x2191 (en: 'upwards arrow', MathPlayer: 'upwards arrow', google: 'nach oben pfeil') + - "↓": [T: "pfeil nach unten"] # 0x2193 (en: 'downwards arrow', MathPlayer: 'downwards arrow', google: 'nach unten pfeil') + - "⇒": [T: "doppelpfeil nach rechts"] # 0x21d2 (en: 'rightwards double arrow', MathPlayer: 'rightwards double arrow', google: 'richtiger doppelpfeil') + - "∏": [T: "produkt"] # 0x220f (en: 'product', MathPlayer: 'Product', google: 'produkt') + - "∐": [T: "koprodukt"] # 0x2210 (en: 'co-product', MathPlayer: 'coproduct', google: 'ko-produkt') + - "∑": [T: "summe"] # 0x2211 (en: 'sum') + - "∗": [T: "mal"] # 0x2217 (en: 'times', MathPlayer: 'asterisk operator', google: 'mal') + - "√": # 0x221a + - T: "quadratwurzel" # (en: 'square root of', MathPlayer: 'radical', google: 'quadratwurzel von') + - "∟": [T: "rechter winkel"] # 0x221f (en: 'right angle') + - "∠": [T: "winkel"] # 0x2220 (en: 'angle') + - "∥": [T: "gerichteter winkel"] # 0x2221 (en: 'measured angle', MathPlayer: 'measured angle', google: 'gemessener winkel') + - "∩": [T: "schnitt mit"] # 0x2229 (en: 'intersection') #Problem: Schnittmenge wenn alleinstehend vor Bezeichnung, schnitt wenn zwischen 2 Mengen + - "âˆȘ": [T: "vereinigt mit"] # 0x222a (en: 'union') #Problem: vereinigungsmenge wenn alleinstehend vor Bezeichnung, vereinigt mit wenn zwischen 2 Mengen + - "∫": [T: "integral"] # 0x222b (en: 'integral') + - "∏": [T: "doppelintegral"] # 0x222c (en: 'double integral') + - "∭": [T: "dreifachintegral"] # 0x222d (en: 'triple integral', MathPlayer: 'Dreifaches Integral', google: 'dreifachintegral') + - "∟": [T: "randintegral"] # 0x222e (en: 'contour integral', MathPlayer: 'Kontur-Integral', google: 'konturintegral') + - "∷": [T: "proportional"] # 0x2237 (en: 'as') + - "∌": [T: "tilde"] # 0x223c (en: 'varies with', MathPlayer: 'tilde operator', google: 'variiert mit') + - "∜": [T: "umgekehrte tilde"] # 0x223d (en: 'reversed tilde', MathPlayer: 'reversed tilde', google: 'umgekehrte tilde') + - "∿": [T: "sinuswelle"] # 0x223f (en: 'sine wave', MathPlayer: 'sine wave', google: 'sinus') From 7c7f9b57564763345bd77afe1161b9978c2c0eac Mon Sep 17 00:00:00 2001 From: mgros Date: Wed, 23 Sep 2026 01:04:33 +0200 Subject: [PATCH 127/162] Add support for stdin, inline MathML, and default fallback --- src/bin/mathml2text.rs | 56 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/src/bin/mathml2text.rs b/src/bin/mathml2text.rs index ff05b5219..f0116ec32 100644 --- a/src/bin/mathml2text.rs +++ b/src/bin/mathml2text.rs @@ -7,6 +7,11 @@ use log::*; use std::path::PathBuf; use clap::{Parser, ValueEnum}; +// The quadratic formula used as the MathCAT demo's starting example. +const DEFAULT_MATHML: &str = r#" + x=−b±b2−4ac2a + "#; + // Maybe also have this speak to test the TTS generation. // There is a rust winapi crate that mirrors the WinPAI and has "Speak(...)" in it @@ -32,8 +37,19 @@ struct Options { #[arg(short, long)] rules_dir: Option, + #[arg( + value_name = "INPUT_FILE", + help = "MathML file to read, or '-' to read from stdin")] input_file: Option, + #[arg( + long, + conflicts_with = "input_file", + value_name = "MATHML", + help = "Use MathML text directly as input", + )] + mathml: Option, + #[arg(short, long, default_value="en")] language: String, @@ -52,22 +68,42 @@ fn main() -> Result<()> { let cli = Options::parse(); - let expr = if let Some(f) = cli.input_file { - std::fs::read_to_string(&f).with_context(|| format!("unable to open {}", f.to_str().unwrap_or_default()))? - } else { - r#" - (1) - "#.to_string() + let expr = match (cli.input_file, cli.mathml) { + + // Match "-" as stdin + (Some(f), None) if f.as_os_str() == std::ffi::OsStr::new("-") => { + let mut mathml = String::new(); + std::io::Read::read_to_string(&mut std::io::stdin(), &mut mathml) + .with_context(|| "unable to read MathML from stdin")?; + mathml + } + + // regular file + (Some(f), None) => { + std::fs::read_to_string(&f) + .with_context(|| format!("unable to open {}", f.to_str().unwrap_or_default()))? + } + + (None, Some(mathml)) => mathml, + + (None, None) => DEFAULT_MATHML.to_string(), + + (Some(_), Some(_)) => unreachable!("clap rejects conflicting input sources"), }; - if let Err(e) = set_rules_dir(get_rules_dir()) { - panic!("Error: exiting -- {}", errors_to_string(&e)); - } + let rules_dir = if let Some(path) = cli.rules_dir { + path.to_str() + .context("Rules directory path must be valid UTF-8")? + .to_string() + } else { + get_rules_dir() + }; + set_rules_dir(&rules_dir).with_context(|| format!("unable to use Rules dir {}", rules_dir))?; debug!("Languages: {}", libmathcat::interface::get_supported_languages()?.join(", ")); #[cfg(feature = "include-zip")] info!("***********include-zip is present**********"); - info!("Version = '{}' using Rules dir {}", get_version(), get_rules_dir()); + info!("Version = '{}' using Rules dir {}", get_version(), rules_dir); set_preference("Language", cli.language)?; set_preference("DecimalSeparator", "Auto").unwrap(); From a8f2e3c1e129d9e6dca160cb36599379bfd96ca6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Arborealis=20L=C3=B6tberg?= <143188129+TimArborealis@users.noreply.github.com> Date: Wed, 23 Sep 2026 17:43:51 +0200 Subject: [PATCH 128/162] Re-add addon info to user guide Added back the info on how to use MathCAT as an addon to NVDA, which was accidentally removed. --- docs/users.md | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/docs/users.md b/docs/users.md index a5ab487d3..7e7c59c12 100644 --- a/docs/users.md +++ b/docs/users.md @@ -10,6 +10,8 @@ MathCAT is a tool used together with a screen reader. Through MathCAT, you can h In screen readers NVDA and JAWS, MathCAT comes built-in. This means you don’t have to install it as an addon. +MathCAT is still available as an addon to NVDA. You can use it if you want access to the very latest features between NVDA releases. [How to use MathCAT as an addon is described here](#how-to-install-mathcat-as-an-addon-in-nvda). + ## Get started with MathCAT Use your screen reader on a web page or in an e-book as usual. When you get to a mathematical expression, the screen reader will read it out automatically. If you want to investigate the expression more closely you can activate the navigation mode by pressing Space. In NVDA, the NVDA-key+Alt+M can also be used. If you want to leave the navigation mode, press Escape. @@ -49,6 +51,7 @@ You can choose between the following settings for speech. Below each setting you - Indonesian (id) - Norwegian bokmĂ„l (nb) - Polish (pl) + - Brazilian Portugese (pt) - Russian (ru) - Swedish (sv) - Vietnamese (vi) @@ -137,4 +140,42 @@ Note: tabular math means mathematical content in a table structure such as a mat ## Do you have feedback on MathCAT? -MathCAT is under active development, and we want your feedback. Do you have a feature request, or have you found any bugs? Please create an issue on [MathCAT's GitHub page](https://github.com/daisy/MathCAT/issues). You are also welcome to get in touch by signing up to [the mailing list of the DAISY MathCAT working group](https://www.surveymonkey.com/r/HXTLXGN). \ No newline at end of file +MathCAT is under active development, and we want your feedback. Do you have a feature request, or have you found any bugs? Please create an issue on [MathCAT's GitHub page](https://github.com/daisy/MathCAT/issues). You are also welcome to get in touch by signing up to [the mailing list of the DAISY MathCAT working group](https://www.surveymonkey.com/r/HXTLXGN). + +## How to install MathCAT as an addon in NVDA + +To use MathCAT as an add-on, do the following: + +1. Open the NVDA menu. +2. Choose Tools and then Add-on store. +3. In the add-on store, choose Available add-ons. + + The channel settings have the following options: + - Stable: Will only search for stable add-ons + - All: Will search for all add-ons + - Beta: Will search for add-ons that are in beta + - Dev: Will search for add-ons in development + + Choose option "All". + +4. Search for MathCAT and install. + +5. In the settings menu, you can control how add-ons are updated: + + - Open the NVDA menu + - Choose settings and Add-on Store + + For Automatic updates, you can choose between: + - Notify + - Update Automatically + - Deactivated + + For Default update channel, you have the following options: + + - Same: If automatic updates is set to “Update Automatically” and your add-on is a beta, it will update to the first available beta. + - Any: It will update to any version of the add-on. + - Do not update + - Stable: It will only update to stable versions. + - Beta or dev: It will update to beta or dev versions. + - Beta: It will update to beta versions. + - Dev: It will update to dev versions. From 709b7164af73c8717d1307491f292405bee8f79c Mon Sep 17 00:00:00 2001 From: mgros Date: Thu, 24 Sep 2026 01:35:54 +0200 Subject: [PATCH 129/162] Add rule order checks and reporting for shared rule mismatches --- PythonScripts/audit_translations/README.md | 1 + PythonScripts/audit_translations/auditor.py | 20 +++ .../audit_translations/models/rules.py | 1 + PythonScripts/audit_translations/renderer.py | 9 ++ .../audit_translations/tests/test_auditor.py | 127 ++++++++++++++++++ .../audit_translations/tests/test_parsers.py | 2 +- 6 files changed, 159 insertions(+), 1 deletion(-) diff --git a/PythonScripts/audit_translations/README.md b/PythonScripts/audit_translations/README.md index 241a500d2..5ebf83203 100644 --- a/PythonScripts/audit_translations/README.md +++ b/PythonScripts/audit_translations/README.md @@ -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. +* **Rule Order:** After the summary, reports the first differing position of shared named rules in each affected file. Missing, extra, and `# audit-ignore` rules do not shift the comparison. Include entries are not checked. * **Definition Coverage:** Compares literal `definitions.yaml` entries by name and collection kind (`vector`, `set`, or `map`). After a blank line, add `# audit-ignore` immediately before a rule to suppress diff --git a/PythonScripts/audit_translations/auditor.py b/PythonScripts/audit_translations/auditor.py index b67cbf911..6cf718ea1 100644 --- a/PythonScripts/audit_translations/auditor.py +++ b/PythonScripts/audit_translations/auditor.py @@ -19,6 +19,7 @@ print_audit_summary, print_definition_findings, print_language_list, + print_order_findings, print_warnings, ) @@ -109,6 +110,19 @@ def merge_rules(base_rules: list[RuleInfo], region_rules: list[RuleInfo]) -> lis include_untranslated = include_all or "untranslated" in issue_filter include_extra = include_all or "extra" in issue_filter include_diffs = include_all or "diffs" in issue_filter + include_order = include_all + + first_order_mismatch_position = None + if include_order: + source_keys = {rule.key for rule in english_rules if rule.name is not None and not rule.audit_ignore} + target_keys = {rule.key for rule in translated_rules if rule.name is not None and not rule.audit_ignore} + shared_keys = source_keys & target_keys + source_order = [rule for rule in english_rules if rule.key in shared_keys and not rule.audit_ignore] + target_order = [rule for rule in translated_rules if rule.key in shared_keys and not rule.audit_ignore] + for position, (source_rule, target_rule) in enumerate(zip(source_order, target_order), start=1): + if source_rule.key != target_rule.key: + first_order_mismatch_position = position + break # Find missing rules (in source but not in translation) missing_rules = [] @@ -146,6 +160,7 @@ def merge_rules(base_rules: list[RuleInfo], region_rules: list[RuleInfo]) -> lis extra_rules=extra_rules, untranslated_text=untranslated_text, rule_differences=rule_differences, + first_order_mismatch_position=first_order_mismatch_position, english_rule_count=len(english_rules), translated_rule_count=len(translated_rules), ) @@ -262,6 +277,7 @@ def audit_language( total_definition_type_mismatches = 0 files_with_issues = 0 files_ok = 0 + order_findings: list[tuple[str, int]] = [] # One item per file, eg [("calculus.yaml", 2), ...] for file_name in files: english_path = source_dir / file_name @@ -308,6 +324,8 @@ def audit_language( existing_translated_region_path, existing_english_region_path, ) + if result.first_order_mismatch_position is not None: + order_findings.append((file_name, result.first_order_mismatch_position)) if result.has_issues: issues = print_warnings(result, file_name, verbose, language, source_language) @@ -338,6 +356,8 @@ def audit_language( ) ) + print_order_findings(order_findings) + return total_issues diff --git a/PythonScripts/audit_translations/models/rules.py b/PythonScripts/audit_translations/models/rules.py index 39069d9db..fd0044521 100644 --- a/PythonScripts/audit_translations/models/rules.py +++ b/PythonScripts/audit_translations/models/rules.py @@ -107,6 +107,7 @@ class ComparisonResult: english_rule_count: int translated_rule_count: int rule_differences: list[RuleDifference] = field(default_factory=list) + first_order_mismatch_position: int | None = None @property def has_issues(self) -> bool: diff --git a/PythonScripts/audit_translations/renderer.py b/PythonScripts/audit_translations/renderer.py index d79449e80..1ba2db693 100644 --- a/PythonScripts/audit_translations/renderer.py +++ b/PythonScripts/audit_translations/renderer.py @@ -260,6 +260,15 @@ def print_audit_summary(summary: AuditSummary) -> None: console.print(Panel(table, style="cyan")) +def print_order_findings(findings: list[tuple[str, int]]) -> None: + """Print the first shared-rule order difference for each affected file.""" + for file_name, position in findings: + console.print( + f"[yellow]Rule order differs[/] in {escape(str(file_name))}: " + f"first difference at shared rule position {position}" + ) + + def print_language_list(languages: list[tuple[str, int]]) -> None: """Print the available languages table. diff --git a/PythonScripts/audit_translations/tests/test_auditor.py b/PythonScripts/audit_translations/tests/test_auditor.py index 38b63694f..ff7f32a0f 100644 --- a/PythonScripts/audit_translations/tests/test_auditor.py +++ b/PythonScripts/audit_translations/tests/test_auditor.py @@ -46,6 +46,133 @@ def fixture_rules_dir() -> Path: return Path(__file__).resolve().parent / "fixtures" / "Rules" / "Languages" +def test_rule_order_reports_first_shared_difference(tmp_path) -> None: + """A swapped pair records the first shared rule position without adding an issue.""" + source = tmp_path / "source.yaml" + target = tmp_path / "target.yaml" + source.write_text("""- name: a + tag: mi +- name: b + tag: mi +- name: c + tag: mi +""", encoding="utf-8") + target.write_text("""- name: a + tag: mi +- name: c + tag: mi +- name: b + tag: mi +""", encoding="utf-8") + + result = compare_files(source, target) + assert result.first_order_mismatch_position == 2 + assert not result.has_issues + + +def test_missing_and_ignored_rules_do_not_shift_order(tmp_path) -> None: + """Only shared rules without audit-ignore markers participate in ordering.""" + source = tmp_path / "source.yaml" + target = tmp_path / "target.yaml" + source.write_text("""- name: a + tag: mi +- name: missing + tag: mi +- name: b + tag: mi +""", encoding="utf-8") + target.write_text("""- name: a + tag: mi +- name: extra + tag: mi +- name: b + tag: mi +""", encoding="utf-8") + assert compare_files(source, target).first_order_mismatch_position is None + + source.write_text("""- name: a + tag: mi +- name: b + tag: mi +# audit-ignore +- name: c + tag: mi +""", encoding="utf-8") + target.write_text("""# audit-ignore +- name: c + tag: mi +- name: a + tag: mi +- name: b + tag: mi +""", encoding="utf-8") + assert compare_files(source, target).first_order_mismatch_position is None + + +def test_include_placement_is_not_checked(tmp_path) -> None: + """An include moving around a named rule has no effect on named rule order.""" + source = tmp_path / "source.yaml" + target = tmp_path / "target.yaml" + source.write_text("""- include: shared.yaml +- name: a + tag: mi +""", encoding="utf-8") + target.write_text("""- name: a + tag: mi +- include: shared.yaml +""", encoding="utf-8") + result = compare_files(source, target) + assert result.first_order_mismatch_position is None + assert result.english_rule_count == result.translated_rule_count == 1 + assert not result.missing_rules and not result.extra_rules + assert compare_files(source, target, {"missing"}).first_order_mismatch_position is None + + +def test_unicode_entries_are_not_checked_for_order(tmp_path) -> None: + """The order check only covers named rules, not Unicode character entries.""" + source = tmp_path / "unicode.yaml" + target = tmp_path / "target" / "unicode.yaml" + target.parent.mkdir() + source.write_text("""- "←": [t: left] +- "∄": [t: parallel] +""", encoding="utf-8") + target.write_text("""- "∄": [T: parallel] +- "←": [T: left] +""", encoding="utf-8") + + assert compare_files(source, target).first_order_mismatch_position is None + + +def test_order_findings_appear_after_summary_without_affecting_totals(tmp_path, capsys) -> None: + """Each affected file gets one final line while the audit issue count stays zero.""" + rules_dir = tmp_path / "Rules" / "Languages" + source_dir = rules_dir / "en" + target_dir = rules_dir / "de" + source_dir.mkdir(parents=True) + target_dir.mkdir(parents=True) + source = """- name: a + tag: mi +- name: b + tag: mi +""" + target = """- name: b + tag: mi +- name: a + tag: mi +""" + for filename in ("first.yaml", "second.yaml"): + (source_dir / filename).write_text(source, encoding="utf-8") + (target_dir / filename).write_text(target, encoding="utf-8") + + assert audit_language("de", rules_dir=str(rules_dir)) == 0 + output = strip_ansi(capsys.readouterr().out) + assert "Files with issues 0" in output + assert "Rule order differences" not in output + assert output.count("first difference at shared rule position 1") == 2 + assert output.index("SUMMARY") < output.index("Rule order differs in first.yaml") + assert output.index("Rule order differs in first.yaml") < output.index("Rule order differs in second.yaml") + + def aggregate_issue_counts( language: str, issue_filter: set[str] | None = None, diff --git a/PythonScripts/audit_translations/tests/test_parsers.py b/PythonScripts/audit_translations/tests/test_parsers.py index 6714f3581..92ea56ab0 100644 --- a/PythonScripts/audit_translations/tests/test_parsers.py +++ b/PythonScripts/audit_translations/tests/test_parsers.py @@ -303,7 +303,7 @@ def test_skips_items_without_name(self): assert rules[0].name == "real-rule" def test_mixed_valid_and_skipped_items(self): - """Valid rules interspersed with non-rule items keep correct line numbers.""" + """Named rules retain their line numbers around skipped includes.""" content = """- name: first tag: mo match: "." From e42aec2f9cd87f8402b02ec862033878797da48a Mon Sep 17 00:00:00 2001 From: mgros Date: Thu, 24 Sep 2026 01:49:10 +0200 Subject: [PATCH 130/162] fix ruff --- PythonScripts/audit_translations/auditor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PythonScripts/audit_translations/auditor.py b/PythonScripts/audit_translations/auditor.py index 6cf718ea1..a3ce4a3c8 100644 --- a/PythonScripts/audit_translations/auditor.py +++ b/PythonScripts/audit_translations/auditor.py @@ -119,7 +119,7 @@ def merge_rules(base_rules: list[RuleInfo], region_rules: list[RuleInfo]) -> lis shared_keys = source_keys & target_keys source_order = [rule for rule in english_rules if rule.key in shared_keys and not rule.audit_ignore] target_order = [rule for rule in translated_rules if rule.key in shared_keys and not rule.audit_ignore] - for position, (source_rule, target_rule) in enumerate(zip(source_order, target_order), start=1): + for position, (source_rule, target_rule) in enumerate(zip(source_order, target_order, strict=True), start=1): if source_rule.key != target_rule.key: first_order_mismatch_position = position break From 16a830d59ccfdf7f14a5d1a6727ec94189b8076c Mon Sep 17 00:00:00 2001 From: mgros Date: Thu, 24 Sep 2026 01:51:04 +0200 Subject: [PATCH 131/162] uv run ruff format audit_translations/ --- PythonScripts/audit_translations/auditor.py | 2 +- PythonScripts/audit_translations/renderer.py | 3 +- .../audit_translations/tests/test_auditor.py | 70 +++++++++++++------ 3 files changed, 52 insertions(+), 23 deletions(-) diff --git a/PythonScripts/audit_translations/auditor.py b/PythonScripts/audit_translations/auditor.py index a3ce4a3c8..5df06b6fe 100644 --- a/PythonScripts/audit_translations/auditor.py +++ b/PythonScripts/audit_translations/auditor.py @@ -277,7 +277,7 @@ def audit_language( total_definition_type_mismatches = 0 files_with_issues = 0 files_ok = 0 - order_findings: list[tuple[str, int]] = [] # One item per file, eg [("calculus.yaml", 2), ...] + order_findings: list[tuple[str, int]] = [] # One item per file, eg [("calculus.yaml", 2), ...] for file_name in files: english_path = source_dir / file_name diff --git a/PythonScripts/audit_translations/renderer.py b/PythonScripts/audit_translations/renderer.py index 1ba2db693..198aefc54 100644 --- a/PythonScripts/audit_translations/renderer.py +++ b/PythonScripts/audit_translations/renderer.py @@ -264,8 +264,7 @@ def print_order_findings(findings: list[tuple[str, int]]) -> None: """Print the first shared-rule order difference for each affected file.""" for file_name, position in findings: console.print( - f"[yellow]Rule order differs[/] in {escape(str(file_name))}: " - f"first difference at shared rule position {position}" + f"[yellow]Rule order differs[/] in {escape(str(file_name))}: first difference at shared rule position {position}" ) diff --git a/PythonScripts/audit_translations/tests/test_auditor.py b/PythonScripts/audit_translations/tests/test_auditor.py index ff7f32a0f..e8e7ec266 100644 --- a/PythonScripts/audit_translations/tests/test_auditor.py +++ b/PythonScripts/audit_translations/tests/test_auditor.py @@ -50,20 +50,26 @@ def test_rule_order_reports_first_shared_difference(tmp_path) -> None: """A swapped pair records the first shared rule position without adding an issue.""" source = tmp_path / "source.yaml" target = tmp_path / "target.yaml" - source.write_text("""- name: a + source.write_text( + """- name: a tag: mi - name: b tag: mi - name: c tag: mi -""", encoding="utf-8") - target.write_text("""- name: a +""", + encoding="utf-8", + ) + target.write_text( + """- name: a tag: mi - name: c tag: mi - name: b tag: mi -""", encoding="utf-8") +""", + encoding="utf-8", + ) result = compare_files(source, target) assert result.first_order_mismatch_position == 2 @@ -74,38 +80,50 @@ def test_missing_and_ignored_rules_do_not_shift_order(tmp_path) -> None: """Only shared rules without audit-ignore markers participate in ordering.""" source = tmp_path / "source.yaml" target = tmp_path / "target.yaml" - source.write_text("""- name: a + source.write_text( + """- name: a tag: mi - name: missing tag: mi - name: b tag: mi -""", encoding="utf-8") - target.write_text("""- name: a +""", + encoding="utf-8", + ) + target.write_text( + """- name: a tag: mi - name: extra tag: mi - name: b tag: mi -""", encoding="utf-8") +""", + encoding="utf-8", + ) assert compare_files(source, target).first_order_mismatch_position is None - source.write_text("""- name: a + source.write_text( + """- name: a tag: mi - name: b tag: mi # audit-ignore - name: c tag: mi -""", encoding="utf-8") - target.write_text("""# audit-ignore +""", + encoding="utf-8", + ) + target.write_text( + """# audit-ignore - name: c tag: mi - name: a tag: mi - name: b tag: mi -""", encoding="utf-8") +""", + encoding="utf-8", + ) assert compare_files(source, target).first_order_mismatch_position is None @@ -113,14 +131,20 @@ def test_include_placement_is_not_checked(tmp_path) -> None: """An include moving around a named rule has no effect on named rule order.""" source = tmp_path / "source.yaml" target = tmp_path / "target.yaml" - source.write_text("""- include: shared.yaml + source.write_text( + """- include: shared.yaml - name: a tag: mi -""", encoding="utf-8") - target.write_text("""- name: a +""", + encoding="utf-8", + ) + target.write_text( + """- name: a tag: mi - include: shared.yaml -""", encoding="utf-8") +""", + encoding="utf-8", + ) result = compare_files(source, target) assert result.first_order_mismatch_position is None assert result.english_rule_count == result.translated_rule_count == 1 @@ -133,12 +157,18 @@ def test_unicode_entries_are_not_checked_for_order(tmp_path) -> None: source = tmp_path / "unicode.yaml" target = tmp_path / "target" / "unicode.yaml" target.parent.mkdir() - source.write_text("""- "←": [t: left] + source.write_text( + """- "←": [t: left] - "∄": [t: parallel] -""", encoding="utf-8") - target.write_text("""- "∄": [T: parallel] +""", + encoding="utf-8", + ) + target.write_text( + """- "∄": [T: parallel] - "←": [T: left] -""", encoding="utf-8") +""", + encoding="utf-8", + ) assert compare_files(source, target).first_order_mismatch_position is None From fc7d939705581685065f033f6ca20d52e2f8c71f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Thu, 24 Sep 2026 21:08:34 +0200 Subject: [PATCH 132/162] Refactor: Replace custom path utilities with `Path` API and update zip methods accordingly (#775) --- src/rules_archive.rs | 50 ++++++++++++++++++-------------------------- 1 file changed, 20 insertions(+), 30 deletions(-) diff --git a/src/rules_archive.rs b/src/rules_archive.rs index 70d8d81fe..938937683 100644 --- a/src/rules_archive.rs +++ b/src/rules_archive.rs @@ -64,17 +64,6 @@ fn is_zip_file(path: &Path) -> bool { return path.extension().map(|ext| ext.eq_ignore_ascii_case("zip")).unwrap_or(false); } -fn posix_path(parts: &[&str]) -> String { - return parts.join("/"); -} - -fn posix_join(prefix: &str, name: &str) -> String { - if prefix.is_empty() { - return name.to_string(); - } - return format!("{}/{}", prefix, name); -} - fn file_name_str(path: &Path) -> io::Result { let name = path .file_name() @@ -305,10 +294,10 @@ fn copy_dir(src: &Path, dst: &Path, minify: bool, parent_is_languages: bool) -> fn add_file_to_zip( zip: &mut ZipWriter, in_path: &Path, - zip_name: &str, + zip_path: &Path, options: SimpleFileOptions, ) -> io::Result<()> { - zip.start_file(zip_name, options) + zip.start_file_from_path(zip_path, options) .map_err(io::Error::other)?; let mut file = File::open(in_path)?; let mut buffer = Vec::new(); @@ -319,11 +308,11 @@ fn add_file_to_zip( fn add_bytes_to_zip( zip: &mut ZipWriter, - zip_name: &str, + zip_path: &Path, bytes: &[u8], options: SimpleFileOptions, ) -> io::Result<()> { - zip.start_file(zip_name, options) + zip.start_file_from_path(zip_path, options) .map_err(io::Error::other)?; zip.write_all(bytes)?; return Ok(()); @@ -332,7 +321,7 @@ fn add_bytes_to_zip( fn zip_entry( zip: &mut ZipWriter, full_path: &Path, - relative_path: &str, + relative_path: &Path, options: SimpleFileOptions, ) -> io::Result { let mut n_files_in_zip = 0; @@ -343,7 +332,7 @@ fn zip_entry( continue; } let entry_name = file_name_str(&entry_path)?; - let child_rel = posix_join(relative_path, &entry_name); + let child_rel = relative_path.join(entry_name); n_files_in_zip += zip_entry(zip, &entry_path, &child_rel, options)?; } } else if is_yaml_file(full_path) { @@ -356,7 +345,7 @@ fn zip_entry( fn write_inner_zip(source_dir: &Path, inner: SimpleFileOptions) -> io::Result>> { let cursor = Cursor::new(Vec::new()); let mut zip = ZipWriter::new(cursor); - let n_files = zip_entry(&mut zip, source_dir, "", inner)?; + let n_files = zip_entry(&mut zip, source_dir, Path::new(""), inner)?; let cursor = zip.finish().map_err(io::Error::other)?; if n_files == 0 { return Ok(None); @@ -370,7 +359,7 @@ fn zip_dir( archive_zip: &mut ZipWriter, inner: SimpleFileOptions, outer: SimpleFileOptions, - archive_prefix: &str, + archive_prefix: &Path, ) -> io::Result<()> { if !rules_section.is_dir() { return Ok(()); @@ -386,14 +375,14 @@ fn zip_dir( continue; } if let Some(bytes) = write_inner_zip(&entry_path, inner)? { - let zip_name = posix_path(&[archive_prefix, &dir_name, &format!("{}.zip", dir_name)]); - add_bytes_to_zip(archive_zip, &zip_name, &bytes, outer)?; + let zip_path = archive_prefix.join(&dir_name).join(format!("{dir_name}.zip")); + add_bytes_to_zip(archive_zip, &zip_path, &bytes, outer)?; } } else if is_yaml_file(&entry_path) { // e.g. Rules/Braille/definitions.yaml let name = file_name_str(&entry_path)?; - let zip_name = posix_path(&[archive_prefix, &name]); - add_file_to_zip(archive_zip, &entry_path, &zip_name, outer)?; + let zip_path = archive_prefix.join(name); + add_file_to_zip(archive_zip, &entry_path, &zip_path, outer)?; } } return Ok(()); @@ -404,7 +393,7 @@ fn zip_other_files( rules_dir: &Path, archive_zip: &mut ZipWriter, outer: SimpleFileOptions, - archive_prefix: &str, + archive_prefix: &Path, ) -> io::Result<()> { for entry in read_dir(rules_dir)? { let entry_path = entry?.path(); @@ -415,12 +404,12 @@ fn zip_other_files( &rules_dir.join("Intent"), archive_zip, outer, - &posix_join(archive_prefix, "Intent"), + &archive_prefix.join("Intent"), )?; } } else if is_yaml_file(&entry_path) { - let zip_name = posix_join(archive_prefix, &entry_name); - add_file_to_zip(archive_zip, &entry_path, &zip_name, outer)?; + let zip_path = archive_prefix.join(entry_name); + add_file_to_zip(archive_zip, &entry_path, &zip_path, outer)?; } } return Ok(()); @@ -441,21 +430,22 @@ pub fn write_rules_archive( let outer = zip_options(compression.outer); let archive_zip_file = File::create(output)?; let mut archive_zip = ZipWriter::new(archive_zip_file); + let archive_root = Path::new(ARCHIVE_ROOT); - zip_other_files(rules_dir, &mut archive_zip, outer, ARCHIVE_ROOT)?; + zip_other_files(rules_dir, &mut archive_zip, outer, archive_root)?; zip_dir( &rules_dir.join("Languages"), &mut archive_zip, inner, outer, - &posix_join(ARCHIVE_ROOT, "Languages"), + &archive_root.join("Languages"), )?; zip_dir( &rules_dir.join("Braille"), &mut archive_zip, inner, outer, - &posix_join(ARCHIVE_ROOT, "Braille"), + &archive_root.join("Braille"), )?; archive_zip.finish().map_err(io::Error::other)?; From e79dda767673b9349d15d6d71b4bd3ed1501890c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Thu, 24 Sep 2026 21:15:47 +0200 Subject: [PATCH 133/162] Refactor navigation state management: unify position and command stacks into a single history vector (#776) * Refactor navigation state management: unify position and command stacks into a single history vector * fix cargo clippy no-unsafe --- src/navigate.rs | 79 ++++++++++++++++++++++--------------------------- 1 file changed, 35 insertions(+), 44 deletions(-) diff --git a/src/navigate.rs b/src/navigate.rs index d1444a86c..b398f3c75 100644 --- a/src/navigate.rs +++ b/src/navigate.rs @@ -52,6 +52,12 @@ struct NavigationPosition { current_node_offset: usize, // for leaves, char offset in leaf (default = 0), otherwise id for artificial intent node } +#[derive(Clone, Debug)] +struct NavigationHistoryEntry { + position: NavigationPosition, + command: &'static str, +} + impl fmt::Display for NavigationPosition { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { return write!(f, "{}[+{}]", self.current_node, self.current_node_offset); @@ -71,10 +77,7 @@ impl Default for NavigationPosition { #[derive(Debug, Clone)] pub struct NavigationState { - // it might be better to use a linked for the stacks, with the first node being the top - // these two stacks should be kept in sync. - position_stack: Vec, // all positions, so we can go back to them - command_stack: Vec<&'static str>, // all commands, so we can undo them + history: Vec, // positions and commands, so we can undo them place_markers: [NavigationPosition; MAX_PLACE_MARKERS], where_am_i: NavigationPosition, // current 'where am i' location @@ -90,13 +93,13 @@ impl fmt::Display for NavigationState { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { writeln!(f, "NavigationState{{")?; write!(f, " Position Stack: ")?; - for (i, nav_state) in self.position_stack.iter().enumerate() { - write!(f, "{}{}", if i==0 {""} else {", "}, nav_state)?; + for (i, entry) in self.history.iter().enumerate() { + write!(f, "{}{}", if i==0 {""} else {", "}, entry.position)?; } writeln!(f)?; write!(f, " Command Stack: ")?; - for (i, nav_state) in self.command_stack.iter().enumerate() { - write!(f, "{}{}", if i==0 {""} else {", "}, *nav_state)?; + for (i, entry) in self.history.iter().enumerate() { + write!(f, "{}{}", if i==0 {""} else {", "}, entry.command)?; } writeln!(f)?; writeln!(f, " where_am_i: {}, start_time: {:?}", self.where_am_i, self.where_am_i_start_time)?; @@ -109,8 +112,7 @@ impl fmt::Display for NavigationState { impl NavigationState { fn new() -> NavigationState { return NavigationState { - position_stack: Vec::with_capacity(1024), - command_stack: Vec::with_capacity(1024), + history: Vec::with_capacity(1024), place_markers: Default::default(), where_am_i: NavigationPosition::default(), // FIX: figure this out for the web @@ -124,8 +126,7 @@ impl NavigationState { } pub fn reset(&mut self) { - self.position_stack.clear(); - self.command_stack.clear(); + self.history.clear(); self.where_am_i = NavigationPosition::default(); self.reset_start_time() } @@ -146,32 +147,22 @@ impl NavigationState { fn push(&mut self, position: NavigationPosition, command: &'static str) { - self.position_stack.push(position); - self.command_stack.push(command); + self.history.push(NavigationHistoryEntry { position, command }); } - fn pop(&mut self) -> Option<(NavigationPosition, &'static str)> { - assert_eq!(self.position_stack.len(), self.command_stack.len()); - if self.position_stack.is_empty() { - return None; - } else { - return Some( (self.position_stack.pop().unwrap(), self.command_stack.pop().unwrap()) ); - } + fn pop(&mut self) -> Option { + return self.history.pop(); } - fn top(&self) -> Option<(&NavigationPosition, &'static str)> { - if self.position_stack.is_empty() { - return None; - } - let last = self.position_stack.len()-1; - return Some( (&self.position_stack[last], self.command_stack[last]) ); + fn top(&self) -> Option<&NavigationHistoryEntry> { + return self.history.last(); } pub fn get_navigation_mathml<'a>(&self, mathml: Element<'a>) -> Result<(Element<'a>, usize)> { - if self.position_stack.is_empty() { + if self.history.is_empty() { return Ok( (mathml, 0) ); } else { - let (position, _) = self.top().unwrap(); + let position = &self.top().unwrap().position; return match get_node_by_id(mathml, position) { None => bail!("internal error: id '{}' was not found in mathml:\n{}", position.current_node, mml_to_string(mathml)), @@ -181,23 +172,23 @@ impl NavigationState { } pub fn get_navigation_mathml_id(&self, mathml: Element) -> (String, usize) { - if self.position_stack.is_empty() { + if self.history.is_empty() { return (mathml.attribute_value("id").unwrap().to_string(), 0); } else { - let (position, _) = self.top().unwrap(); + let position = &self.top().unwrap().position; return (position.current_node.clone(), position.current_node_offset); } } fn init_navigation_context(&self, context: &mut sxd_xpath_no_unsafe::Context, command: &'static str, - nav_state_top: Option<(&NavigationPosition, &'static str)>) { + nav_state_top: Option<&NavigationHistoryEntry>) { context.set_variable("NavCommand", command); if command == "WhereAmI" && self.where_am_i == NavigationPosition::default() { context.set_variable("NavNode", self.where_am_i.current_node.as_str()); context.set_variable("NavNodeOffset", self.where_am_i.current_node_offset as f64); } else { - let position = &self.position_stack[self.position_stack.len()-1]; + let position = &self.history.last().unwrap().position; context.set_variable("NavNode", position.current_node.as_str()); context.set_variable("NavNodeOffset", position.current_node_offset as f64); } @@ -218,7 +209,7 @@ impl NavigationState { if command == "MoveLastLocation" { let previous_command = match nav_state_top { None => "None", - Some( (_, previous_command) ) => previous_command, + Some(entry) => entry.command, }; context.set_variable("PreviousNavCommand", previous_command); } @@ -372,7 +363,7 @@ pub fn do_navigate_command_string(mathml: Element, nav_command: &'static str) -> return NAVIGATION_STATE.with(|nav_state| { let mut nav_state = nav_state.borrow_mut(); // debug!("MathML: {}", mml_to_string(mathml)); - if nav_state.position_stack.is_empty() { + if nav_state.history.is_empty() { // initialize to root node nav_state.push(NavigationPosition{ current_node: mathml.attribute_value("id").unwrap().to_string(), @@ -440,7 +431,7 @@ pub fn do_navigate_command_string(mathml: Element, nav_command: &'static str) -> } bail!("Internal error: Navigation exceeded limit of number of times no speech generated when attempting to {} in {} mode start at id={} in this MathML:\n{}.", - nav_command, nav_state.mode, nav_state.top().unwrap().0.current_node, mml_to_string(mathml)); + nav_command, nav_state.mode, nav_state.top().unwrap().position.current_node, mml_to_string(mathml)); }); }); @@ -450,14 +441,14 @@ pub fn do_navigate_command_string(mathml: Element, nav_command: &'static str) -> let nav_position = NavigationPosition { current_node: mathml.attribute_value("id").unwrap().to_string(), current_node_offset: 0 }; get_node_by_id(mathml, &nav_position) }, - Some( (position, _) ) => get_node_by_id(mathml, position), + Some(entry) => get_node_by_id(mathml, &entry.position), }; return match element { Some(node) => Ok(node), None => { bail!("Internal Error: didn't find id/offset '{:?}' while attempting to start navigation. MathML is\n{}", - nav_state.top().map(|t| t.0), mml_to_string(mathml)); + nav_state.top().map(|entry| &entry.position), mml_to_string(mathml)); } }; } @@ -518,7 +509,7 @@ pub fn do_navigate_command_string(mathml: Element, nav_command: &'static str) -> // debug!("intent=\n{}", mml_to_string(intent)); // debug!("nav intent=\n{}", mml_to_string(nav_intent)); - // debug!("start_node id={}\n{}", nav_state.top().unwrap().0.current_node.as_str(), mml_to_string(start_node)); + // debug!("start_node id={}\n{}", nav_state.top().unwrap().position.current_node.as_str(), mml_to_string(start_node)); // if name(start_node) != "math" { // let mut parent= get_parent(start_node); // if name(parent) != "math" { @@ -528,7 +519,7 @@ pub fn do_navigate_command_string(mathml: Element, nav_command: &'static str) -> // } let offset = context_get_int_variable(rules_with_context.get_context(), "NavNodeOffset", intent)?; rules_with_context.set_nav_node_offset(offset); - debug!("starting nav_position: {}, start node ={}", nav_state.top().unwrap().0, name(start_node)); + debug!("starting nav_position: {}, start node ={}", nav_state.top().unwrap().position, name(start_node)); let raw_speech_string = rules_with_context.match_pattern::(start_node) .context("Pattern match/replacement failure during math navigation!")?; @@ -569,7 +560,7 @@ pub fn do_navigate_command_string(mathml: Element, nav_command: &'static str) -> debug!("after match nav_position: {}", nav_position); // push the new location on the stack - if nav_position != NavigationPosition::default() && &nav_position != nav_state.top().unwrap().0 { + if nav_position != NavigationPosition::default() && nav_position != nav_state.top().unwrap().position { nav_state.push(nav_position.clone(), nav_command); } @@ -634,12 +625,12 @@ pub fn do_navigate_command_string(mathml: Element, nav_command: &'static str) -> let push_command_on_stack = (nav_command.starts_with("Move") && nav_command != "MoveLastLocation") || nav_command.starts_with("Zoom"); // debug!("pop_stack: nav_command={}, count={}, push? {} stack=\n{}", nav_command, count, push_command_on_stack, nav_state); if count == 0 { - if !push_command_on_stack && nav_command == nav_state.top().unwrap().1 { + if !push_command_on_stack && nav_command == nav_state.top().unwrap().command { nav_state.pop(); // remove ReadXXX, SetPlacemarker, etc. commands that don't change the state } return; } - let (top_position, top_command) = nav_state.pop().unwrap(); + let top_entry = nav_state.pop().unwrap(); let mut count = count - 1; loop { // debug!(" ... loop count={}", count); @@ -650,7 +641,7 @@ pub fn do_navigate_command_string(mathml: Element, nav_command: &'static str) -> count -= 1; }; if push_command_on_stack { - nav_state.push(top_position, top_command); + nav_state.push(top_entry.position, top_entry.command); } // debug!("END pop_stack: stack=\n{}", nav_state); } From c1130286b6dcce18d5dc8f0e4d841d45bc646f4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Thu, 24 Sep 2026 21:24:26 +0200 Subject: [PATCH 134/162] simplify `read_prefs_file` (#808) * Refactor `read_prefs_file` to simplify error handling and optimize section processing * use with_context(..) from anyhow-crate for error-handling --- src/prefs.rs | 41 +++++++++++++---------------------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/src/prefs.rs b/src/prefs.rs index f515ca483..162574c5b 100644 --- a/src/prefs.rs +++ b/src/prefs.rs @@ -106,37 +106,24 @@ impl Preferences{ fn read_prefs_file(file: &Path, mut base_prefs: Preferences) -> Result { let file_name = file.to_str().unwrap(); - let docs; - match read_to_string_shim(file) { - Err(e) => { - bail!("Couldn't read file {}\n{}", file_name, e); - }, - Ok( file_contents) => { - match YamlLoader::load_from_str(&file_contents) { - Err(e) => { - bail!("Yaml parse error ('{}') in preference file {}.", e, file_name); - }, - Ok(d) => docs = d, - } - - } - } + let file_contents = read_to_string_shim(file) + .with_context(|| format!("Couldn't read file {file_name}"))?; + let docs = YamlLoader::load_from_str(&file_contents) + .with_context(|| format!("Yaml parse error in preference file {file_name}."))?; if docs.len() != 1 { bail!("MathCAT: error in prefs file '{}'.\nFound {} 'documents' -- should only be 1.", file_name, docs.len()); } let doc = &docs[0]; + const SECTIONS: [&str; 4] = ["Speech", "Navigation", "Braille", "Other"]; if cfg!(debug_assertions) { - verify_keys(doc, "Speech", file_name)?; - verify_keys(doc, "Navigation", file_name)?; - verify_keys(doc, "Braille", file_name)?; - verify_keys(doc, "Other", file_name)?; + for section in SECTIONS { + verify_keys(doc, section, file_name)?; + } + } + for section in SECTIONS { + add_prefs(&mut base_prefs.prefs, &doc[section], "", file_name); } - - add_prefs(&mut base_prefs.prefs, &doc["Speech"], "", file_name); - add_prefs(&mut base_prefs.prefs, &doc["Navigation"], "", file_name); - add_prefs(&mut base_prefs.prefs, &doc["Braille"], "", file_name); - add_prefs(&mut base_prefs.prefs, &doc["Other"], "", file_name); return Ok(base_prefs); @@ -260,10 +247,8 @@ impl PreferenceManager { // 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 canonicalize_shim(&rules_dir) { - Err(e) => bail!("set_rules_dir: could not canonicalize path {}: {}", rules_dir.display(), e), - Ok(rules_dir) => rules_dir, - }; + let rules_dir = canonicalize_shim(&rules_dir) + .with_context(|| format!("set_rules_dir: could not canonicalize path {}", rules_dir.display()))?; self.set_rules_dir(&rules_dir)?; self.set_preference_files()?; From 7764ea64c13f86300206871547f5e244ad4fb175 Mon Sep 17 00:00:00 2001 From: mgros Date: Wed, 23 Sep 2026 22:15:41 +0200 Subject: [PATCH 135/162] Replace `unwrap()` with `let Some(...) else` constructs for safer option handling --- src/interface.rs | 5 ++--- src/speech.rs | 43 +++++++++++++++--------------------------- src/xpath_functions.rs | 10 ++++------ 3 files changed, 21 insertions(+), 37 deletions(-) diff --git a/src/interface.rs b/src/interface.rs index 157a895f1..20389959f 100644 --- a/src/interface.rs +++ b/src/interface.rs @@ -526,11 +526,10 @@ pub fn do_navigate_command(command: impl AsRef) -> Result { enable_logs(); let command = command.as_ref().to_string(); let result = catch_unwind(AssertUnwindSafe(|| { - let cmd = NAV_COMMANDS.get_key(&command); // gets a &'static version of the command - if cmd.is_none() { + let Some(cmd) = NAV_COMMANDS.get_key(&command) else { // gets a &'static version of the command. bail!("Unknown command in call to DoNavigateCommand()"); }; - let cmd = *cmd.unwrap(); + let cmd = *cmd; MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); diff --git a/src/speech.rs b/src/speech.rs index 6d5b252a7..4b6691bec 100644 --- a/src/speech.rs +++ b/src/speech.rs @@ -431,11 +431,9 @@ impl fmt::Display for Replacement { impl Replacement { fn build(replacement: &Yaml) -> Result { // Replacement -- single key/value (see below for allowed values) - let dictionary = replacement.as_hash(); - if dictionary.is_none() { + let Some(dictionary) = replacement.as_hash() else { bail!(" expected a key/value pair. Found {}.", yaml_to_string(replacement, 0)); }; - let dictionary = dictionary.unwrap(); if dictionary.is_empty() { bail!("No key/value pairs found for key 'replace'.\n\ Suggestion: are the following lines indented properly?"); @@ -898,8 +896,7 @@ impl ReplacementArray { /// Any errors are passed back out. pub fn build(replacements: &Yaml) -> Result { // replacements is either a single replacement or an array of replacements - let result= if replacements.is_array() { - let replacements = replacements.as_vec().unwrap(); + let result= if let Some(replacements) = replacements.as_vec() { replacements .iter() .enumerate() // useful for errors @@ -1173,12 +1170,9 @@ impl MyXPath { /// Convert DEBUG(...) input to the internal function which is DEBUG(arg, arg_as_string) fn add_debug_string_arg(xpath: &str) -> Result { // do a quick check to see if "DEBUG" is in the string -- this is the common case - let debug_start = xpath.find("DEBUG("); - if debug_start.is_none() { + let Some(debug_start) = xpath.find("DEBUG(") else { return Ok( xpath.to_string() ); - } - - let debug_start = debug_start.unwrap(); + }; let mut before_paren = xpath[..debug_start+5].to_string(); // includes "DEBUG" let chars = xpath[debug_start+5..].chars().collect::>(); // begins at '(' before_paren.push_str(&chars_add_debug_string_arg(&chars).with_context(|| format!("In xpath='{xpath}'"))?); @@ -1469,9 +1463,9 @@ impl TestArray { // 'if:' should only be the first entry in the array; 'else_if' should never be the first entry. Otherwise, they are the same let mut test_array = vec![]; for test in tests { - if test.as_hash().is_none() { + let Some(test_hash) = test.as_hash() else { bail!("Value for array entry in 'test:' must be a dictionary/contain keys"); - } + }; let if_part = &test[if test_array.is_empty() {"if"} else {"else_if"}]; if !if_part.is_badvalue() { // first case: if:, then:, optional else: @@ -1479,7 +1473,7 @@ impl TestArray { let then_part = TestOrReplacements::build(test, "then", "then_test", true)?; let else_part = TestOrReplacements::build(test, "else", "else_test", false)?; let n_keys = if else_part.is_none() {2} else {3}; - if test.as_hash().unwrap().len() > n_keys { + if test_hash.len() > n_keys { bail!("A key other than 'if', 'else_if', 'then', 'then_test', 'else', or 'else_test' was found in the 'then' clause of 'test'"); }; test_array.push( @@ -1488,7 +1482,7 @@ impl TestArray { } else { // second case: should be else/else_test let else_part = TestOrReplacements::build(test, "else", "else_test", true)?; - if test.as_hash().unwrap().len() > 1 { + if test_hash.len() > 1 { bail!("A key other than 'if', 'else_if', 'then', 'then_test', 'else', or 'else_test' was found the 'else' clause of 'test'"); }; test_array.push( @@ -1715,8 +1709,7 @@ impl VariableDefinitions { if defs.is_badvalue() { return Ok( VariableDefinitions::new(0) ); }; - if defs.is_array() { - let defs = defs.as_vec().unwrap(); + if let Some(defs) = defs.as_vec() { let mut definitions = VariableDefinitions::new(defs.len()); for def in defs { let variable_def = VariableDefinition::build(def) @@ -1874,12 +1867,9 @@ impl UnicodeDef { return Ok( Some(process_include(file_name, include_file_name, do_include_fn)?) ); } // key: char, value is replacement or array of replacements - let dictionary = unicode_def.as_hash(); - if dictionary.is_none() { + let Some(dictionary) = unicode_def.as_hash() else { bail!("Expected a unicode definition (e.g, '+':[t: \"plus\"]'), found {}", yaml_to_string(unicode_def, 0)); - } - - let dictionary = dictionary.unwrap(); + }; if dictionary.len() != 1 { bail!("Expected a unicode definition (e.g, '+':[t: \"plus\"]'), found {}", yaml_to_string(unicode_def, 0)); } @@ -2334,11 +2324,9 @@ impl SpeechRules { fn build_speech_patterns(&mut self, patterns: &Yaml, file_name: &Path) -> Result> { // Rule::SpeechPatternList - let patterns_vec = patterns.as_vec(); - if patterns_vec.is_none() { + let Some(patterns_vec) = patterns.as_vec() else { bail!(yaml_type_err(patterns, "array")); - } - let patterns_vec = patterns.as_vec().unwrap(); + }; let mut files_read = vec![file_name.to_path_buf()]; for entry in patterns_vec.iter() { if let Some(mut added_files) = SpeechPattern::build(entry, file_name, self)? { @@ -2368,12 +2356,11 @@ impl SpeechRules { // info!("Reading unicode file {}", path.to_str().unwrap()); let unicode_file_contents = read_to_string_shim(&path)?; let unicode_build_fn = |unicode_def_list: &Yaml| { - let unicode_defs = unicode_def_list.as_vec(); - if unicode_defs.is_none() { + let Some(unicode_defs) = unicode_def_list.as_vec() else { bail!("File '{}' does not begin with an array", yaml_to_type(unicode_def_list)); }; let mut files_read = vec![path.to_path_buf()]; - for unicode_def in unicode_defs.unwrap() { + for unicode_def in unicode_defs { if let Some(mut added_files) = UnicodeDef::build(unicode_def, &path, self, use_short) .with_context(|| {format!("In file {:?}", path.to_str())})? { files_read.append(&mut added_files); diff --git a/src/xpath_functions.rs b/src/xpath_functions.rs index 17b6d360b..ec2f7c4ec 100644 --- a/src/xpath_functions.rs +++ b/src/xpath_functions.rs @@ -266,14 +266,12 @@ impl IsNode { return false; } - let num = children[0].element(); - let denom = children[1].element(); - if num.is_none() || denom.is_none() { + let Some(num) = children[0].element() else { + return false; + }; + let Some(denom) = children[1].element() else { return false; }; - - let num = num.unwrap(); - let denom = denom.unwrap(); if !is_tag(num, "mn") || !is_tag(denom, "mn") { return false }; From 2b801136fee44a27ba36d32fd8a8d77b1a04c92f Mon Sep 17 00:00:00 2001 From: mgros Date: Thu, 24 Sep 2026 22:46:36 +0200 Subject: [PATCH 136/162] simplify destructuring syntax using tuples --- src/xpath_functions.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/xpath_functions.rs b/src/xpath_functions.rs index ec2f7c4ec..a713fad88 100644 --- a/src/xpath_functions.rs +++ b/src/xpath_functions.rs @@ -266,10 +266,7 @@ impl IsNode { return false; } - let Some(num) = children[0].element() else { - return false; - }; - let Some(denom) = children[1].element() else { + let (Some(num), Some(denom)) = (children[0].element(), children[1].element()) else { return false; }; if !is_tag(num, "mn") || !is_tag(denom, "mn") { From 824cdda5d940ebcf2e6431202312b354198e699c Mon Sep 17 00:00:00 2001 From: mgros Date: Sun, 20 Sep 2026 02:58:37 +0200 Subject: [PATCH 137/162] use elements.rs as chemistry database --- Cargo.lock | 12 +++++ Cargo.toml | 1 + src/chemistry.rs | 120 ++++++++++++++++++++++++++++------------------- 3 files changed, 84 insertions(+), 49 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 50bccf29f..529029471 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -447,6 +447,17 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "780955b8b195a21ab8e4ac6b60dd1dbdcec1dc6c51c0617964b08c81785e12c9" +[[package]] +name = "elements_rs" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5834efe826a9a66b548e0887d9fc744fc8bb57065dcc6e5495359b25ab98319" +dependencies = [ + "strum", + "strum_macros", + "thiserror 2.0.18", +] + [[package]] name = "encoding_rs" version = "0.8.35" @@ -784,6 +795,7 @@ dependencies = [ "cfg-if", "clap", "dirs", + "elements_rs", "env_logger", "fastrand", "html-escape", diff --git a/Cargo.toml b/Cargo.toml index 2e73cbf80..e07193031 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,6 +38,7 @@ cfg-if = "1.0.1" fastrand = { version = "2.3.0" } clap = { version = "4.5.60", features = ["derive"] } html-escape = "0.2.13" +elements_rs = { version = "0.2.8", default-features = false } # Runtime extracts inner language/braille zips (BZIP2). The package-rules binary also # writes DEFLATE outer archives for Windows/unzip-compatible Rules.zip downloads. diff --git a/src/chemistry.rs b/src/chemistry.rs index 173c5cccb..f54e018dd 100644 --- a/src/chemistry.rs +++ b/src/chemistry.rs @@ -52,6 +52,10 @@ use std::collections::HashSet; use std::cmp::Ordering; use crate::errors::*; use std::sync::LazyLock; +use elements_rs::{ + AtomicNumber, Electronegativity, Element as PeriodicElement, ElementCategory, + ElementClassification, +}; pub static NOT_CHEMISTRY: i32 = -10000; // should overwhelm any positive signal @@ -411,7 +415,7 @@ pub fn convert_leaves_to_chem_elements(mathml: Element) -> Option> } match str::from_utf8(&bytes_str[..n]) { Ok(chem_element) => { - if CHEMICAL_ELEMENT_ELECTRONEGATIVITY.contains_key(chem_element) { + if is_known_chemical_symbol(chem_element) { return Some(new_chemical_element(doc, chem_element)); } return None; @@ -1254,7 +1258,7 @@ fn likely_chem_formula(mathml: Element) -> i32 { fn is_order_ok(mrow: Element) -> bool { assert_eq!(name(mrow), "mrow"); if let Some(elements) = collect_elements(mrow) { - if elements.iter().any(|e| !CHEMICAL_ELEMENT_ELECTRONEGATIVITY.contains_key(as_str!(*e))) { + if elements.iter().any(|e| !is_known_chemical_symbol(as_str!(e))) { return false; } let n_elements = elements.len(); @@ -1278,10 +1282,10 @@ fn is_order_ok(mrow: Element) -> bool { fn has_noble_element(elements: &[NameStr<'_>]) -> bool { - static NOBLE_ELEMENTS: phf::Set<&str> = phf_set! { - "He", "Ne", "Ar", "Kr", "Xe", "Rn", "Og" // Og might be reactive, but it is unstable - }; - return elements.iter().any(|e| NOBLE_ELEMENTS.contains(as_str!(*e))); + return elements.iter().any(|symbol| { + periodic_element(as_str!(symbol)) + .is_some_and(|e| e.classification() == ElementCategory::NobleGas) + }); } #[allow(clippy::manual_contains)] @@ -1343,7 +1347,9 @@ fn is_ordered_by_electronegativity(elements: &[NameStr<'_>]) -> bool { // HPO_4^2 (Mono-hydrogen phosphate) doesn't fit this pattern, nor does HCO_3^- (Hydrogen carbonate) and some others // FIX: drop "H" from the ordering?? assert!(elements.len() > 1); // already handled - return elements.windows(2).all(|pair| CHEMICAL_ELEMENT_ELECTRONEGATIVITY.get(as_str!(pair[0])).unwrap() < CHEMICAL_ELEMENT_ELECTRONEGATIVITY.get(as_str!(pair[1])).unwrap()); + return elements.windows(2).all(|pair| { + chemical_electronegativity(as_str!(pair[0])).unwrap() < chemical_electronegativity(as_str!(pair[1])).unwrap() + }); } fn is_generalized_salt(elements: &[NameStr<'_>]) -> bool { @@ -1429,8 +1435,8 @@ pub fn likely_adorned_chem_formula(mathml: Element) -> i32 { let base = as_element(children[0]); let base_name = name(base); let atomic_number = if matches!(as_str!(base_name), "mi" | "mtext") && - let Some(atomic_number) = CHEMICAL_ELEMENT_ATOMIC_NUMBER.get(as_str!(as_text(base))) { - *atomic_number + let Some(atomic_number) = chemical_element_atomic_number(as_str!(as_text(base))) { + atomic_number } else { return NOT_CHEMISTRY; }; @@ -1835,46 +1841,34 @@ fn convert_to_short_form(mathml: Element) -> Result { } } -/// A map of chemical elements and their relative IUPAC electronegativity (https://i.stack.imgur.com/VCSzW.png) -/// That list uses a horizontal line for the Lanthanide and Actinide Series. -/// Because I had already ordered the elements before realizing that, I opened a gap and started the higher ones again with a '1' in front. -/// The list is missing recent (unstable) elements -- I added them with the same value as the element above them in the periodic table. -static CHEMICAL_ELEMENT_ELECTRONEGATIVITY: phf::Map<&str, u32> = phf_map! { - "Ac" => 40, "Ag" => 155, "Al" => 163, "Am" => 29, "Ar" => 4, "As" => 172, "At" => 181, "Au" => 154, - "B" => 164, "Ba" => 14, "Be" => 18, "Bh" => 137, "Bi" => 170, "Bk" => 27, "Br" => 183, - "C" => 169, "Ca" => 16, "Cd" => 158, "Ce" => 56, "Cf" => 26, "Cl" => 184, "Cm" => 28, "Cn" => 157, "Co" => 148, "Cr" => 136, "Cs" => 8, "Cu" => 156, - "Db" => 129, "Ds" => 149, "Dy" => 48, - "Er" => 46, "Es" => 25, "Eu" => 51, "F" => 185, "Fe" => 144, "Fl" => 165, "Fm" => 24, "Fr" => 7, "Ga" => 162, "Gd" => 50, "Ge" => 167, - "H" => 175, "He" => 6, "Hf" => 126, "Hg" => 157, "Ho" => 47, "Hs" => 141, "I" => 182, "In" => 161, "Ir" => 146, "K" => 10, "Kr" => 3, - "La" => 62, "Li" => 12, "Lr" => 19, "Lu" => 41, "Lv" => 176, "Mc" => 170, "Md" => 23, "Mg" => 17, "Mn" => 140, "Mo" => 135, "Mt" => 145, - "N" => 174, "Na" => 11, "Nb" => 131, "Nd" => 54, "Ne" => 5, "Nh" => 160, "Ni" => 152, "No" => 22, "Np" => 31, "O" => 180, "Og" => 1, "Os" => 142, - "P" => 173, "Pa" => 33, "Pb" => 165, "Pd" => 151, "Pm" => 53, "Po" => 176, "Pr" => 55, "Pt" => 150, "Pu" => 30, - "Ra" => 13, "Rb" => 9, "Re" => 138, "Rf" => 125, "Rg" => 153, "Rh" => 147, "Rn" => 1, "Ru" => 143, - "S" => 179, "Sb" => 171, "Sc" => 124, "Se" => 178, "Sg" => 133, "Si" => 168, "Sm" => 52, "Sn" => 166, "Sr" => 15, - "Ta" => 130, "Tb" => 49, "Tc" => 139, "Te" => 177, "Th" => 34, "Ti" => 128, "Tl" => 160, "Tm" => 45, "Ts" => 181, - "U" => 32, "V" => 132, "W" => 134, "Xe" => 2, "Y" => 123, "Yb" => 44, "Zn" => 159, "Zr" => 127, - // The following come from E.A. Moore who said to treat them like chemicals - // These stand for methyl, ethyl, alkyl, acetyl and phenyl and apparently are quite commonly used ("Ac" is already a chemical) - // A full(er?) list is at en.wikipedia.org/wiki/Skeletal_formula#Alkyl_groups and in following sections - "Me" => 0, "Et" => 0, "R" => 0, /* "Ac" => 0, */ "Ph" => 0, - "X" => 0, /* treated as an unknown */ +// These MathCAT-specific abbreviations are commonly used in chemical formulae, but are not +// elements. Ac is deliberately absent: it is the real element actinium, even when authors use +// the same spelling for acetyl. X represents an unknown element in MathCAT's chemistry heuristic. +static CHEMICAL_ABBREVIATIONS: phf::Set<&str> = phf_set! { + "Me", "Et", "R", "Ph", "X" }; -// A map of the chemical elements and their atomic numbers -static CHEMICAL_ELEMENT_ATOMIC_NUMBER: phf::Map<&str, u32> = phf_map! { - "H" => 1, "He" => 2, "Li" => 3, "Be" => 4, "B" => 5, "C" => 6, "N" => 7, "O" => 8, "F" => 9, "Ne" => 10, - "Na" => 11, "Mg" => 12, "Al" => 13, "Si" => 14, "P" => 15, "S" => 16, "Cl" => 17, "Ar" => 18, "K" => 19, "Ca" => 20, - "Sc" => 21, "Ti" => 22, "V" => 23, "Cr" => 24, "Mn" => 25, "Fe" => 26, "Co" => 27, "Ni" => 28, "Cu" => 29, "Zn" => 30, - "Ga" => 31, "Ge" => 32, "As" => 33, "Se" => 34, "Br" => 35, "Kr" => 36, "Rb" => 37, "Sr" => 38, "Y" => 39, "Zr" => 40, - "Nb" => 41, "Mo" => 42, "Tc" => 43, "Ru" => 44, "Rh" => 45, "Pd" => 46, "Ag" => 47, "Cd" => 48, "In" => 49, "Sn" => 50, - "Sb" => 51, "Te" => 52, "I" => 53, "Xe" => 54, "Cs" => 55, "Ba" => 56, "La" => 57, "Ce" => 58, "Pr" => 59, "Nd" => 60, - "Pm" => 61, "Sm" => 62, "Eu" => 63, "Gd" => 64, "Tb" => 65, "Dy" => 66, "Ho" => 67, "Er" => 68, "Tm" => 69, "Yb" => 70, - "Lu" => 71, "Hf" => 72, "Ta" => 73, "W" => 74, "Re" => 75, "Os" => 76, "Ir" => 77, "Pt" => 78, "Au" => 79, "Hg" => 80, - "Tl" => 81, "Pb" => 82, "Bi" => 83, "Po" => 84, "At" => 85, "Rn" => 86, "Fr" => 87, "Ra" => 88, "Ac" => 89, "Th" => 90, - "Pa" => 91, "U" => 92, "Np" => 93, "Pu" => 94, "Am" => 95, "Cm" => 96, "Bk" => 97, "Cf" => 98, "Es" => 99, "Fm" => 100, - "Md" => 101, "No" => 102, "Lr" => 103, "Rf" => 104, "Db" => 105, "Sg" => 106, "Bh" => 107, "Hs" => 108, "Mt" => 109, "Ds" => 110, - "Rg" => 111, "Cn" => 112, "Nh" => 113, "Fl" => 114, "Mc" => 115, "Lv" => 116, "Ts" => 117, "Og" => 118, -}; +fn periodic_element(symbol: &str) -> Option { + symbol.parse().ok() +} + +fn is_known_chemical_symbol(symbol: &str) -> bool { + periodic_element(symbol).is_some() || CHEMICAL_ABBREVIATIONS.contains(symbol) +} + +fn chemical_element_atomic_number(symbol: &str) -> Option { + periodic_element(symbol).map(|e| u32::from(e.atomic_number())) +} + +fn chemical_electronegativity(symbol: &str) -> Option { + if CHEMICAL_ABBREVIATIONS.contains(symbol) { + return Some(0.0); + } + + // MathCAT historically assigned a value to every real element. Keep that coverage for + // elements whose Pauling electronegativity has not been measured by sorting them at zero. + periodic_element(symbol).map(|e| e.pauling_electronegativity().unwrap_or(0.0)) +} pub fn is_chemical_element(node: Element) -> bool { // FIX: allow name to be in an mrow (e.g., Na @@ -1884,7 +1878,7 @@ pub fn is_chemical_element(node: Element) -> bool { } let text = as_text(node); - return CHEMICAL_ELEMENT_ELECTRONEGATIVITY.contains_key(as_str!(text)) || + return is_known_chemical_symbol(as_str!(text)) || has_chem_intent(node, "chemical-element") || has_inherited_property(node, "chemical-formula"); } @@ -1973,6 +1967,34 @@ mod chem_tests { return Ok( () ); } + #[test] + fn test_periodic_element_lookups() { + // Representative symbols retain their old validity and atomic-number results. + assert_eq!(chemical_element_atomic_number("H"), Some(1)); + assert_eq!(chemical_element_atomic_number("Fe"), Some(26)); + assert_eq!(chemical_element_atomic_number("Og"), Some(118)); + assert!(is_known_chemical_symbol("H")); + assert!(is_known_chemical_symbol("Fe")); + assert!(is_known_chemical_symbol("Og")); + assert!(!is_known_chemical_symbol("fe")); + assert!(!is_known_chemical_symbol("Zz")); + } + + #[test] + fn test_chemical_abbreviations_are_not_periodic_elements() { + // MathCAT abbreviations remain valid chemistry tokens without acquiring element data. + for abbreviation in ["Me", "Et", "Ph", "R", "X"] { + assert!(is_known_chemical_symbol(abbreviation)); + assert!(periodic_element(abbreviation).is_none()); + assert_eq!(chemical_element_atomic_number(abbreviation), None); + assert_eq!(chemical_electronegativity(abbreviation), Some(0.0)); + } + + // Ac remains actinium; its alternate use as acetyl does not shadow the real element. + assert!(!CHEMICAL_ABBREVIATIONS.contains("Ac")); + assert_eq!(chemical_element_atomic_number("Ac"), Some(89)); + } + #[test] fn test_noble_element() -> Result<()> { return chem_test(|| { @@ -2054,7 +2076,7 @@ mod chem_tests { N⁣ H3 "#; - assert_chem_elements(test, true, is_ordered_by_electronegativity)?; + assert_chem_elements(test, false, is_ordered_by_electronegativity)?; let test = r#" O⁣ F2 From d22ed4d7644692c0c1efe5b392c6b734d2d2d4de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Fri, 25 Sep 2026 06:58:23 +0200 Subject: [PATCH 138/162] fix redundant call of pref_to_string (#815) --- src/interface.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/interface.rs b/src/interface.rs index 20389959f..823d89430 100644 --- a/src/interface.rs +++ b/src/interface.rs @@ -287,10 +287,7 @@ pub fn get_preference(name: impl AsRef) -> Result { crate::speech::SPEECH_RULES.with(|rules| { let rules = rules.borrow(); let pref_manager = rules.pref_manager.borrow(); - let mut value = pref_manager.pref_to_string(&name); - if value == NO_PREFERENCE { - value = pref_manager.pref_to_string(&name); - } + let value = pref_manager.pref_to_string(&name); if value == NO_PREFERENCE { bail!("No preference named '{}'", name); } else { From ad0e716e515fe850e3e1a193f4500e7fdb235e29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Fri, 25 Sep 2026 07:03:28 +0200 Subject: [PATCH 139/162] clean up unused types in definitions and remove outdated docstring (#818) --- src/definitions.rs | 53 ++++++++++------------------------------------ 1 file changed, 11 insertions(+), 42 deletions(-) diff --git a/src/definitions.rs b/src/definitions.rs index b7c45fca9..33b833912 100644 --- a/src/definitions.rs +++ b/src/definitions.rs @@ -33,44 +33,13 @@ use std::path::{Path, PathBuf}; use std::collections::{HashMap, HashSet}; use crate::shim_filesystem::read_to_string_shim; -/// An enum to paper over the different types of data access needed. -/// -/// Having a Rc> seems a bit complicated in terms of types but... -/// 1. The rust book seems to endorse the Rc>> approach when there are multiple owners of mutable date. -/// See towards the end -/// 2. When a file is read, we need to clear and add data to the structure being read (reassigning could work for clearing). -/// When we use the data, we either want to index into it or test if an item is there. -/// The structures we use are either a Vec or a HashMap, so we need to abstract that away in `FromFileVariable`. -/// Unfortunately, traits don't quite work as an option here: -/// * Vec implements extends (`add`), but there is no test/contains -/// * Hashmap implements `index`, but panics if the item isn't there -/// -/// Because of the above limitations, we introduce the enum [`Contains`] which dispatches appropriately to Vec/Hashmap #[derive(Debug, Clone)] -pub enum Contains { +pub enum DefinitionCollection { Vec(Rc>>), Set(Rc>>), Map(Rc>>), } -impl Contains { - // fn add(&mut self, item: String) { - // match self { - // Contains::Vec(v) => { v.borrow_mut().push(item); }, - // Contains::Set(s) => { s.borrow_mut().insert(item); } - // } - // } - - // fn clear(&mut self) { - // match self { - // Contains::Vec(v) => { v.borrow_mut().clear(); }, - // Contains::Set(s) => { s.borrow_mut().clear(); } - // } - // } -} -pub type CollectionFromFile = Contains; -type VariableDefHashMap = HashMap; - /// Global structure containing all of the definitions. /// Each field in the structure corresponds to a named value read in from the `definitions.yaml` files. /// @@ -80,7 +49,7 @@ type VariableDefHashMap = HashMap; /// There should only be one instance of this structure ([`DEFINITIONS`]) // FIX: this probably can done with a macro to remove all the repetition pub struct Definitions { - pub name_to_var_mapping: VariableDefHashMap, + pub name_to_var_mapping: HashMap, } impl Default for Definitions { @@ -100,7 +69,7 @@ impl Definitions { pub fn get_hashset(&self, name: &str) -> Option>> { let names = self.name_to_var_mapping.get(name); - if let Some(Contains::Set(set)) = names { + if let Some(DefinitionCollection::Set(set)) = names { return Some(set.borrow()); } return None; @@ -108,7 +77,7 @@ impl Definitions { pub fn get_hashmap(&self, name: &str) -> Option>> { let names = self.name_to_var_mapping.get(name); - if let Some(Contains::Map(map)) = names { + if let Some(DefinitionCollection::Map(map)) = names { return Some(map.borrow()); } return None; @@ -116,7 +85,7 @@ impl Definitions { pub fn get_vec(&self, name: &str) -> Option>> { let names = self.name_to_var_mapping.get(name); - if let Some(Contains::Vec(vec)) = names { + if let Some(DefinitionCollection::Vec(vec)) = names { return Some(vec.borrow()); } return None; @@ -172,12 +141,12 @@ pub fn read_definitions_file(use_speech_defs: bool) -> Result> { // let name_to_mapping = defs.name_to_var_mapping.borrow_mut(); for set_name in used_set_names { if defs.get_hashset(set_name).is_none() { - defs.name_to_var_mapping.insert(set_name.to_string(), Contains::Set( Rc::new( RefCell::new( HashSet::with_capacity(0) ) ) )); + defs.name_to_var_mapping.insert(set_name.to_string(), DefinitionCollection::Set( Rc::new( RefCell::new( HashSet::with_capacity(0) ) ) )); } } if defs.get_hashset("FunctionNames").is_none() { let all_functions = build_all_functions_set(defs); - defs.name_to_var_mapping.insert("FunctionNames".to_string(), Contains::Set( Rc::new( RefCell::new( all_functions ) ) )); + defs.name_to_var_mapping.insert("FunctionNames".to_string(), DefinitionCollection::Set( Rc::new( RefCell::new( all_functions ) ) )); } } @@ -240,19 +209,19 @@ fn build_values(definition: &Yaml, use_speech_defs: bool, path: &Path) -> Result } let result = if let Some(vec) = value.as_vec() { - Contains::Vec( Rc::new( RefCell::new( get_vec_values(vec)? ) ) ) + DefinitionCollection::Vec( Rc::new( RefCell::new( get_vec_values(vec)? ) ) ) } else { let dict = value.as_hash().ok_or_else(|| anyhow!("definition list value '{}' is not an array or dictionary", yaml_to_type(value)))?; if dict.is_empty() { - Contains::Set( Rc::new( RefCell::new( HashSet::with_capacity(0) ) ) ) + DefinitionCollection::Set( Rc::new( RefCell::new( HashSet::with_capacity(0) ) ) ) } else { // peak and see if this is a set or a map let (_, entry_value) = dict.iter().next().unwrap(); if entry_value.is_null() { - Contains::Set( Rc::new( RefCell::new( get_set_values(dict) + DefinitionCollection::Set( Rc::new( RefCell::new( get_set_values(dict) .with_context(||format!("while reading value '{def_name}'"))? ) ) ) } else { - Contains::Map( Rc::new( RefCell::new( get_map_values(dict) + DefinitionCollection::Map( Rc::new( RefCell::new( get_map_values(dict) .with_context(||format!("while reading value '{def_name}'"))? ) ) ) } } From 414a7dfa927fa6a2db1a52c74e68b4b0ebbe5d00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Fri, 25 Sep 2026 07:06:49 +0200 Subject: [PATCH 140/162] remove dead functions set_string_value and set_bool_value (#819) --- src/prefs.rs | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/prefs.rs b/src/prefs.rs index 162574c5b..406a9d314 100644 --- a/src/prefs.rs +++ b/src/prefs.rs @@ -170,16 +170,6 @@ impl Preferences{ } } } - - #[allow(dead_code)] // used in testing - fn set_string_value(&mut self, name: &str, value: &str) { - self.prefs.insert(name.to_string(), Yaml::String(value.trim().to_string())); - } - - #[allow(dead_code)] // used in testing - fn set_bool_value(&mut self, name: &str, value: bool) { - self.prefs.insert(name.to_string(), Yaml::Boolean(value)); - } } From 307109fac7da71c6950dc1b1214138a443ee4018 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Fri, 25 Sep 2026 07:34:13 +0200 Subject: [PATCH 141/162] replace custom constructor with struct literals for TTSCommandRule (#821) --- src/tts.rs | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/tts.rs b/src/tts.rs index c2f951b39..134c96251 100644 --- a/src/tts.rs +++ b/src/tts.rs @@ -243,16 +243,6 @@ impl fmt::Display for TTSCommandRule { } -impl TTSCommandRule { - pub fn new(command: TTSCommand, value: TTSCommandValue, replacements: ReplacementArray) -> TTSCommandRule { - return TTSCommandRule{ - command, - value, - replacements - } - } -} - /// Supported TTS engines /// These types should do something for all the TTSCommands #[allow(clippy::upper_case_acronyms)] @@ -348,7 +338,11 @@ impl TTS { TTSCommandValue::String(tts_str_value.to_string()) }, }; - return Ok( Box::new( TTSCommandRule::new(tts_enum, tts_command_value, replacements) ) ); + return Ok(Box::new(TTSCommandRule { + command: tts_enum, + value: tts_command_value, + replacements, + })); } /// The rule called to execute the TTSCommand `command` @@ -691,11 +685,11 @@ impl TTS { } let pause = std::cmp::min(3000, ((2 * before_len + after_len)/48) * 128); // create a TTSCommandRule so we reuse code - let command = TTSCommandRule::new( - TTSCommand::Pause, - TTSCommandValue::Number(pause as f64), - ReplacementArray::build_empty(), - ); + let command = TTSCommandRule { + command: TTSCommand::Pause, + value: TTSCommandValue::Number(pause as f64), + replacements: ReplacementArray::build_empty(), + }; return match self { TTS::None => self.get_string_none(&command, prefs, true), TTS::SSML => self.get_string_ssml(&command, prefs, true), From 614664562560dc883fe1b4e10717ed40e1245350 Mon Sep 17 00:00:00 2001 From: mgros Date: Sat, 26 Sep 2026 20:15:29 +0200 Subject: [PATCH 142/162] Add GitHub Actions workflows to measure and report library size changes --- .github/workflows/library-size-comment.yml | 102 +++++++++++++++++++++ .github/workflows/library-size.yml | 83 +++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 .github/workflows/library-size-comment.yml create mode 100644 .github/workflows/library-size.yml diff --git a/.github/workflows/library-size-comment.yml b/.github/workflows/library-size-comment.yml new file mode 100644 index 000000000..2eca78919 --- /dev/null +++ b/.github/workflows/library-size-comment.yml @@ -0,0 +1,102 @@ +name: Library Size Comment + +on: + workflow_run: + workflows: [Library Size] + types: [completed] + +permissions: + actions: read + pull-requests: write + +concurrency: + group: library-size-comment-${{ github.event.workflow_run.head_repository.id }}-${{ github.event.workflow_run.head_branch }} + cancel-in-progress: false + +jobs: + comment: + name: Update PR comment + if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' + runs-on: ubuntu-24.04 + steps: + - name: Download measurements + uses: actions/download-artifact@v8 + with: + name: library-size-report + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + path: ${{ runner.temp }}/mathcat-size-report + + # This job never checks out or executes PR code. Treat the downloaded report as untrusted. + - name: Update size comment + uses: actions/github-script@v9 + env: + REPORT_PATH: ${{ runner.temp }}/mathcat-size-report/report.json + with: + script: | + const fs = require('fs'); + const report = JSON.parse(fs.readFileSync(process.env.REPORT_PATH, 'utf8')); + const run = context.payload.workflow_run; + const shaPattern = /^[0-9a-f]{40}$/i; + if (!Number.isSafeInteger(report.prNumber) || report.prNumber <= 0 || + !shaPattern.test(report.baseSha) || !shaPattern.test(report.headSha) || + !Number.isSafeInteger(report.baseBytes) || report.baseBytes <= 0 || + !Number.isSafeInteger(report.headBytes) || report.headBytes <= 0) { + core.setFailed('Invalid library size report'); + return; + } + + const {owner, repo} = context.repo; + const {data: pull} = await github.rest.pulls.get({ + owner, repo, pull_number: report.prNumber, + }); + if (pull.state !== 'open' || pull.base.sha !== report.baseSha || + pull.head.sha !== report.headSha) { + core.notice('PR revisions changed or PR closed; ignoring stale measurements'); + return; + } + if (run.head_repository?.id !== pull.head.repo?.id || + run.head_branch !== pull.head.ref) { + core.setFailed('Report does not match the triggering branch'); + return; + } + if (run.pull_requests?.length > 0 && + !run.pull_requests.some(pr => pr.number === report.prNumber)) { + core.setFailed('Report does not belong to the triggering PR'); + return; + } + + const marker = ''; + const formatSize = bytes => `${(bytes / 1048576).toFixed(2)} MiB (${bytes.toLocaleString('en-US')} bytes)`; + const delta = report.headBytes - report.baseBytes; + const deltaPercent = 100 * delta / report.baseBytes; + const signed = value => value > 0 ? `+${value}` : String(value); + const body = [ + marker, + '### Linux library size', + '', + '| Revision | Release `liblibmathcat.so` |', + '| --- | ---: |', + `| Base (${report.baseSha.slice(0, 7)}) | ${formatSize(report.baseBytes)} |`, + `| PR (${report.headSha.slice(0, 7)}) | ${formatSize(report.headBytes)} |`, + `| Change | ${delta > 0 ? '+' : ''}${delta.toLocaleString('en-US')} bytes (${signed(deltaPercent.toFixed(2))}%) |`, + '', + `Built with default features, Rust 1.96.0, and Ubuntu 24.04. [Workflow run](${run.html_url}).`, + ].join('\n'); + + const comments = await github.paginate(github.rest.issues.listComments, { + owner, repo, issue_number: report.prNumber, per_page: 100, + }); + const previous = comments.find(comment => + comment.user?.login === 'github-actions[bot]' && comment.body?.includes(marker)); + if (previous) { + if (previous.body !== body) { + await github.rest.issues.updateComment({ + owner, repo, comment_id: previous.id, body, + }); + } + } else { + await github.rest.issues.createComment({ + owner, repo, issue_number: report.prNumber, body, + }); + } diff --git a/.github/workflows/library-size.yml b/.github/workflows/library-size.yml new file mode 100644 index 000000000..c94cf9e87 --- /dev/null +++ b/.github/workflows/library-size.yml @@ -0,0 +1,83 @@ +name: Library Size + +on: pull_request + +permissions: + contents: read + +concurrency: + group: library-size-${{ github.event.pull_request.number }} + cancel-in-progress: true + +jobs: + measure: + name: Measure Linux shared library + runs-on: ubuntu-24.04 + steps: + - name: Check out base revision + uses: actions/checkout@v5 + with: + ref: ${{ github.event.pull_request.base.sha }} + path: base + persist-credentials: false + + - name: Check out PR revision + uses: actions/checkout@v5 + with: + repository: ${{ github.event.pull_request.head.repo.full_name }} + ref: ${{ github.event.pull_request.head.sha }} + path: head + persist-credentials: false + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@1.96.0 + + - name: Build base library + id: base + working-directory: base + env: + CARGO_TARGET_DIR: ${{ runner.temp }}/mathcat-size-base-target + run: | + cargo build --release --lib --locked + bytes=$(stat -c%s "$CARGO_TARGET_DIR/release/liblibmathcat.so") + echo "bytes=$bytes" >> "$GITHUB_OUTPUT" + + - name: Build PR library + id: head + working-directory: head + env: + CARGO_TARGET_DIR: ${{ runner.temp }}/mathcat-size-head-target + run: | + cargo build --release --lib --locked + bytes=$(stat -c%s "$CARGO_TARGET_DIR/release/liblibmathcat.so") + echo "bytes=$bytes" >> "$GITHUB_OUTPUT" + + - name: Save measurements + env: + PR_NUMBER: ${{ github.event.pull_request.number }} + BASE_SHA: ${{ github.event.pull_request.base.sha }} + HEAD_SHA: ${{ github.event.pull_request.head.sha }} + BASE_BYTES: ${{ steps.base.outputs.bytes }} + HEAD_BYTES: ${{ steps.head.outputs.bytes }} + REPORT_DIR: ${{ runner.temp }}/mathcat-size-report + run: | + mkdir -p "$REPORT_DIR" + node - <<'NODE' + const fs = require('fs'); + const path = require('path'); + const report = { + prNumber: Number(process.env.PR_NUMBER), + baseSha: process.env.BASE_SHA, + headSha: process.env.HEAD_SHA, + baseBytes: Number(process.env.BASE_BYTES), + headBytes: Number(process.env.HEAD_BYTES), + }; + fs.writeFileSync(path.join(process.env.REPORT_DIR, 'report.json'), JSON.stringify(report)); + NODE + + - name: Upload measurements + uses: actions/upload-artifact@v7 + with: + name: library-size-report + path: ${{ runner.temp }}/mathcat-size-report/report.json + retention-days: 1 From 89d018b071796c89b0092c47d2beb983f3128073 Mon Sep 17 00:00:00 2001 From: mgros Date: Sat, 26 Sep 2026 21:17:03 +0200 Subject: [PATCH 143/162] Refactor library size comment script to improve readability and error handling --- .github/workflows/library-size-comment.yml | 129 ++++++++++++--------- 1 file changed, 73 insertions(+), 56 deletions(-) diff --git a/.github/workflows/library-size-comment.yml b/.github/workflows/library-size-comment.yml index 2eca78919..3fbb3b3cf 100644 --- a/.github/workflows/library-size-comment.yml +++ b/.github/workflows/library-size-comment.yml @@ -35,68 +35,85 @@ jobs: with: script: | const fs = require('fs'); - const report = JSON.parse(fs.readFileSync(process.env.REPORT_PATH, 'utf8')); const run = context.payload.workflow_run; - const shaPattern = /^[0-9a-f]{40}$/i; - if (!Number.isSafeInteger(report.prNumber) || report.prNumber <= 0 || - !shaPattern.test(report.baseSha) || !shaPattern.test(report.headSha) || - !Number.isSafeInteger(report.baseBytes) || report.baseBytes <= 0 || - !Number.isSafeInteger(report.headBytes) || report.headBytes <= 0) { - core.setFailed('Invalid library size report'); - return; - } - const {owner, repo} = context.repo; - const {data: pull} = await github.rest.pulls.get({ - owner, repo, pull_number: report.prNumber, - }); - if (pull.state !== 'open' || pull.base.sha !== report.baseSha || - pull.head.sha !== report.headSha) { - core.notice('PR revisions changed or PR closed; ignoring stale measurements'); - return; - } - if (run.head_repository?.id !== pull.head.repo?.id || - run.head_branch !== pull.head.ref) { - core.setFailed('Report does not match the triggering branch'); - return; + const marker = ''; + + // Read and validate the artifact from the untrusted PR build. + function readReport() { + const report = JSON.parse(fs.readFileSync(process.env.REPORT_PATH, 'utf8')); + const shaPattern = /^[0-9a-f]{40}$/i; + if (!Number.isSafeInteger(report.prNumber) || report.prNumber <= 0 || + !shaPattern.test(report.baseSha) || !shaPattern.test(report.headSha) || + !Number.isSafeInteger(report.baseBytes) || report.baseBytes <= 0 || + !Number.isSafeInteger(report.headBytes) || report.headBytes <= 0) { + throw new Error('Invalid library size report'); + } + return report; } - if (run.pull_requests?.length > 0 && - !run.pull_requests.some(pr => pr.number === report.prNumber)) { - core.setFailed('Report does not belong to the triggering PR'); - return; + + // Only report measurements for the current PR and source branch. + async function matchesCurrentPull(report) { + const {data: pull} = await github.rest.pulls.get({ + owner, repo, pull_number: report.prNumber, + }); + if (pull.state !== 'open' || pull.base.sha !== report.baseSha || + pull.head.sha !== report.headSha) { + core.notice('PR revisions changed or PR closed; ignoring stale measurements'); + return false; + } + if (run.head_repository?.id !== pull.head.repo?.id || + run.head_branch !== pull.head.ref || + (run.pull_requests?.length > 0 && + !run.pull_requests.some(pr => pr.number === report.prNumber))) { + throw new Error('Report does not belong to the triggering PR branch'); + } + return true; } - const marker = ''; - const formatSize = bytes => `${(bytes / 1048576).toFixed(2)} MiB (${bytes.toLocaleString('en-US')} bytes)`; - const delta = report.headBytes - report.baseBytes; - const deltaPercent = 100 * delta / report.baseBytes; - const signed = value => value > 0 ? `+${value}` : String(value); - const body = [ - marker, - '### Linux library size', - '', - '| Revision | Release `liblibmathcat.so` |', - '| --- | ---: |', - `| Base (${report.baseSha.slice(0, 7)}) | ${formatSize(report.baseBytes)} |`, - `| PR (${report.headSha.slice(0, 7)}) | ${formatSize(report.headBytes)} |`, - `| Change | ${delta > 0 ? '+' : ''}${delta.toLocaleString('en-US')} bytes (${signed(deltaPercent.toFixed(2))}%) |`, - '', - `Built with default features, Rust 1.96.0, and Ubuntu 24.04. [Workflow run](${run.html_url}).`, - ].join('\n'); + // The summary is the entire collapsed view; the table is shown on expansion. + function renderComment(report) { + const mib = bytes => `${(bytes / 1048576).toFixed(2)} MiB`; + const size = bytes => `${mib(bytes)} (${bytes.toLocaleString('en-US')} bytes)`; + const delta = report.headBytes - report.baseBytes; + const percent = `${delta > 0 ? '+' : ''}${(100 * delta / report.baseBytes).toFixed(2)}%`; + return [ + marker, + '
', + `Linux library size: ${mib(report.headBytes)} (${percent})`, + '', + '| Revision | Release `liblibmathcat.so` |', + '| --- | ---: |', + `| Base (${report.baseSha.slice(0, 7)}) | ${size(report.baseBytes)} |`, + `| PR (${report.headSha.slice(0, 7)}) | ${size(report.headBytes)} |`, + `| Change | ${delta > 0 ? '+' : ''}${delta.toLocaleString('en-US')} bytes (${percent}) |`, + '', + `Built with default features, Rust 1.96.0, and Ubuntu 24.04. [Workflow run](${run.html_url}).`, + '
', + ].join('\n'); + } - const comments = await github.paginate(github.rest.issues.listComments, { - owner, repo, issue_number: report.prNumber, per_page: 100, - }); - const previous = comments.find(comment => - comment.user?.login === 'github-actions[bot]' && comment.body?.includes(marker)); - if (previous) { - if (previous.body !== body) { - await github.rest.issues.updateComment({ - owner, repo, comment_id: previous.id, body, + // Reuse the bot's marked comment instead of posting on every run. + async function upsertComment(prNumber, body) { + const comments = await github.paginate(github.rest.issues.listComments, { + owner, repo, issue_number: prNumber, per_page: 100, + }); + const previous = comments.find(comment => + comment.user?.login === 'github-actions[bot]' && comment.body?.includes(marker)); + if (previous) { + if (previous.body !== body) { + await github.rest.issues.updateComment({ + owner, repo, comment_id: previous.id, body, + }); + } + } else { + await github.rest.issues.createComment({ + owner, repo, issue_number: prNumber, body, }); } - } else { - await github.rest.issues.createComment({ - owner, repo, issue_number: report.prNumber, body, - }); + } + + const report = readReport(); + if (await matchesCurrentPull(report)) { + await upsertComment(report.prNumber, renderComment(report)); } From aab967cf7fb8a2cd28d7916f2fa7c767ac6b6b8b Mon Sep 17 00:00:00 2001 From: mgros Date: Wed, 23 Sep 2026 23:15:11 +0200 Subject: [PATCH 144/162] Update README with supported and in-progress speech languages list --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 0ee92c6fa..e72c60c1b 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,17 @@ * Navigation of math (in multiple ways including overviews) +
+Supported speech languages + +**Supported:** Chinese (Traditional), English, Finnish, French, German, Greek, Hungarian, Indonesian, Norwegian, Polish, Portuguese, Russian, Spanish, Swedish, and Vietnamese. + +**In progress:** Catalan, Icelandic, Italian, Japanese, and Urdu. + +Source: [DAISY MathCAT Initiative](https://daisy.org/activities/projects/mathcat-initiative/). + +
+ There are four related projects that make use of MathCAT: - [MathCATDemo](https://nsoiffer.github.io/MathCATDemo/) -- an online demonstration of some of what can be done with MathCAT - [A python interface for MathCAT](https://github.com/NSoiffer/MathCATForPython) -- used by a [MathCAT NVDA add-on](https://addons.nvda-project.org/addons/MathCAT.en.html). From 3bbbd4426725b1b20e6f501d2312e7d92f2ed6bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Sun, 27 Sep 2026 22:48:03 +0200 Subject: [PATCH 145/162] replace buggy Display implementation for Pronounce with Debug trait (#820) * replace buggy Display implementation for Pronounce with Debug trait * remove unused `eloquence` field and related code from `Pronounce` struct * fix outdated syntax --- src/tts.rs | 63 ++++++++++++++++++++++++------------------------------ 1 file changed, 28 insertions(+), 35 deletions(-) diff --git a/src/tts.rs b/src/tts.rs index 134c96251..0c26e52c7 100644 --- a/src/tts.rs +++ b/src/tts.rs @@ -114,36 +114,10 @@ pub struct Pronounce { text: String, // plain text ipa: String, // ipa sapi5: String, - eloquence: String, + // eloquence: String, } -impl fmt::Display for Pronounce { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let mut comma = ""; // comma separator so it looks right - write!(f, "pronounce: [")?; - if !self.text.is_empty() { - write!(f, "text: '{}'", self.text)?; - comma = ","; - } - write!(f, "pronounce: [")?; - if !self.ipa.is_empty() { - write!(f, "{}ipa: '{}'", comma, self.ipa)?; - comma = ","; - } - write!(f, "pronounce: [")?; - if !self.sapi5.is_empty() { - write!(f, "{}sapi5: '{}'", comma, self.sapi5)?; - comma = ","; - } - write!(f, "pronounce: [")?; - if !self.eloquence.is_empty() { - write!(f, "{}eloquence: '{}'", comma, self.eloquence)?; - } - return writeln!(f, "]"); - } -} - impl Pronounce { fn build(values: &Yaml) -> Result { use crate::speech::{as_str_checked, yaml_to_type}; @@ -152,7 +126,6 @@ impl Pronounce { let mut text = ""; let mut ipa = ""; let mut sapi5 = ""; - let mut eloquence = ""; // values should be an array with potential values for Pronounce let values = values.as_vec().ok_or_else(|| anyhow!("'pronounce' value '{}' is not an array", yaml_to_type(values)))?; @@ -168,7 +141,7 @@ impl Pronounce { "text" => text = as_str_checked(value)?, "ipa" => ipa = as_str_checked(value)?, "sapi5" => sapi5 = as_str_checked(value)?, - "eloquence" => eloquence = as_str_checked(value)?, + "eloquence" => { as_str_checked(value)?; }, _ => bail!("unknown pronounce type: {} with value {}", yaml_to_string(key, 0), yaml_to_string(value, 0)), } } @@ -180,7 +153,7 @@ impl Pronounce { text: text.to_string(), ipa: ipa.to_string(), sapi5: sapi5.to_string(), - eloquence: eloquence.to_string() + // eloquence: eloquence.to_string() } ); @@ -232,7 +205,7 @@ impl fmt::Display for TTSCommandRule { TTSCommandValue::String(s) => s.to_string(), TTSCommandValue::Number(f) => f.to_string(), TTSCommandValue::XPath(p) => p.to_string(), - TTSCommandValue::Pronounce(p) => p.to_string(), + TTSCommandValue::Pronounce(p) => format!("{p:?}"), }; if self.command == TTSCommand::Pause { return write!(f, "pause: {value}"); @@ -783,10 +756,30 @@ mod tests { let rule = TTS::build("pronounce", values).unwrap(); let rendered = format!("{rule}"); - assert!(rendered.contains("text: 'alpha'")); - assert!(rendered.contains("ipa: 'a'")); - assert!(rendered.contains("sapi5: 'b'")); - assert!(rendered.contains("eloquence: 'c'")); + assert!(rendered.contains("text: \"alpha\"")); + assert!(rendered.contains("ipa: \"a\"")); + assert!(rendered.contains("sapi5: \"b\"")); + assert!(!rendered.contains("eloquence")); + } + + /// Shows the derived pronunciation details when displaying a TTS rule. + #[test] + fn pronounce_rule_display_uses_debug_fields() { + let pronounce = Pronounce { + text: "bli bla blub".to_string(), + ipa: "a".to_string(), + sapi5: "b".to_string(), + }; + let rule = TTSCommandRule { + command: TTSCommand::Pronounce, + value: TTSCommandValue::Pronounce(Box::new(pronounce)), + replacements: ReplacementArray::build_empty(), + }; + + assert_eq!( + rule.to_string(), + "pronounce: Pronounce { text: \"bli bla blub\", ipa: \"a\", sapi5: \"b\" }\n" + ); } #[test] From 429cf07446dc0589aea85298c5135a8ff09e3e3b Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Mon, 28 Sep 2026 16:43:13 -0700 Subject: [PATCH 146/162] define ratio (U+2236) --- Rules/Braille/ASCIIMath/unicode.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Rules/Braille/ASCIIMath/unicode.yaml b/Rules/Braille/ASCIIMath/unicode.yaml index 94c9bf260..0adf91c66 100644 --- a/Rules/Braille/ASCIIMath/unicode.yaml +++ b/Rules/Braille/ASCIIMath/unicode.yaml @@ -184,6 +184,7 @@ - "âˆȘ": [t: "𝐖uu𝐖"] # 0x222a - "∫": [t: "𝐖int𝐖"] # 0x222b - "∟": [t: "𝐖oint𝐖"] # 0x222e + - "∶": [t: ":"] # 0x2236 - "∌": [t: "~"] # 0x223c - "≅": [t: "~="] # 0x2245 - "≈": [t: "~~"] # 0x2248 From 71f208c62c6450c5120df7490112c39f4e609c04 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Tue, 29 Sep 2026 12:45:23 -0700 Subject: [PATCH 147/162] added/modified comments for functions that deal with function names and parts --- src/xpath_functions.rs | 92 ++++++++++++++++++++++++++++-------------- 1 file changed, 61 insertions(+), 31 deletions(-) diff --git a/src/xpath_functions.rs b/src/xpath_functions.rs index a713fad88..29215c65f 100644 --- a/src/xpath_functions.rs +++ b/src/xpath_functions.rs @@ -1198,14 +1198,16 @@ impl Function for EdgeNode { } pub struct SpeakIntentName; -/// SpeakIntentName(intent, verbosity, fixity) -/// Real-life example: -/// If a MathML element has intent="factorial($x)", in the rules you might see: -/// - x: "SpeakIntentName(name(.), $Verbosity, 'postfix')" -/// For English, MathCAT will resolve: -/// SpeakIntentName("factorial", "Verbose", "postfix") → "factorial" -/// This is used to generate speech like "x factorial" for expressions like "x!". -/// Returns a string corresponding to the intent name with the indicated verbosity +/// SpeakIntentName(intentName, verbosity, fixity) +/// Returns the spoken name for an intent, using the selected verbosity and fixity. +/// Calling arguments (as used by the rule layer): +/// 1. intentName: the intent name, e.g. "factorial" or "ratio" +/// 2. verbosity: "Terse", "Medium", or "Verbose" +/// 3. fixity: the function fixity, e.g. "prefix", "infix", "postfix" +/// Example: +/// SpeakIntentName("factorial", "Verbose", "postfix") -> "factorial" +/// SpeakIntentName("ratio", "Medium", "infix") -> "ratio" +/// This is used to generate speech such as "x factorial" for expressions like "x!". impl Function for SpeakIntentName { fn evaluate<'d>(&self, _context: &context::Evaluation<'_, 'd>, @@ -1222,12 +1224,16 @@ impl Function for SpeakIntentName { } pub struct IntentFunctionUseArityPath; -/// IntentFunctionUseArityPath(name, fixity, argCount) -/// True when IntentMappings `|` arity templates match this argument count. -/// For example, in en/definitions.yaml for intent "choose": -/// "function=choose|from|to" -/// means for three arguments, templates like "choose n from k to l" apply. -/// This returns true if the `choose` function is used with three arguments. +/// IntentFunctionUseArityPath(intentName, fixity, argCount) +/// Returns true when the intent uses an arity-based template instead of a binary separator form. +/// Calling arguments (as used by the rule layer): +/// 1. intentName: the intent name, e.g. "choose" or "ratio" +/// 2. fixity: the function fixity, e.g. "function" or "postfix" +/// 3. argCount: the number of arguments supplied to the function +/// Example: +/// IntentFunctionUseArityPath("choose", "function", 3) -> true +/// IntentFunctionUseArityPath("ratio", "function", 2) -> false +/// This is used for patterns such as "choose n from k to l", where the template depends on arity. impl Function for IntentFunctionUseArityPath { fn evaluate<'d>(&self, _context: &context::Evaluation<'_, 'd>, @@ -1246,8 +1252,17 @@ impl Function for IntentFunctionUseArityPath { } pub struct IntentFunctionGlueBefore; -/// IntentFunctionGlueBefore(name, fixity, argIndex, argCount) -/// Glue spoken immediately before the given 1-based argument when using an arity template. +/// IntentFunctionGlueBefore(intentName, fixity, argIndex, argCount) +/// Returns the leading glue text to speak before a specific argument in an arity-based template. +/// Calling arguments (as used by the rule layer): +/// 1. intentName: the intent name, e.g. "choose" or "binomial" +/// 2. fixity: the function fixity, e.g. "function" +/// 3. argIndex: the 1-based argument position to inspect +/// 4. argCount: the total number of arguments in the call +/// Example: +/// IntentFunctionGlueBefore("choose", "function", 2, 3) -> "from" +/// IntentFunctionGlueBefore("choose", "function", 3, 3) -> "to" +/// This controls text such as "choose n from k to l". impl Function for IntentFunctionGlueBefore { fn evaluate<'d>(&self, _context: &context::Evaluation<'_, 'd>, @@ -1267,13 +1282,16 @@ impl Function for IntentFunctionGlueBefore { } pub struct IntentFunctionArgSeparator; -/// IntentFunctionArgSeparator(name, fixity, argCount) -/// Glue spoken immediately before the given 1-based argument when using an arity template. -/// For example, in en/definitions.yaml, for the intent name "choose", the mapping is: -/// "function=choose|from|to". -/// When called as IntentFunctionGlueBefore("choose", "function", 2, 3), this returns "from", -/// which is spoken before the second argument when reading an expression like "choose n from k". -/// Likewise, for arg_index = 3, it would return "to". +/// IntentFunctionArgSeparator(intentName, fixity, argCount) +/// Returns the separator text placed between arguments when the intent uses a binary separator form. +/// Calling arguments (as used by the rule layer): +/// 1. intentName: the intent name, e.g. "ratio" or "gcd" +/// 2. fixity: the function fixity, e.g. "function" +/// 3. argCount: the number of arguments supplied to the function +/// Example: +/// IntentFunctionArgSeparator("ratio", "function", 2) -> "to" +/// IntentFunctionArgSeparator("gcd", "function", 2) -> "and" +/// This is the text spoken between the first and second arguments, as in "ratio of 6 to 3". impl Function for IntentFunctionArgSeparator { fn evaluate<'d>(&self, _context: &context::Evaluation<'_, 'd>, @@ -1292,9 +1310,17 @@ impl Function for IntentFunctionArgSeparator { } pub struct GetBracketingIntentName; -/// GetBracketingIntentName(name, verbosity, at_start_or_end) -/// Returns a potentially empty string to use to bracket an intent expression (start foo... end foo) -/// +/// GetBracketingIntentName(intentName, fixity, verbosity, startOrEnd) +/// Returns the optional bracket wording for an intent expression, such as the leading/trailing phrase +/// around a start/end bracketed form. +/// Calling arguments (as used by the rule layer): +/// 1. intentName: the intent name, e.g. "floor" or "ceil" +/// 2. fixity: the fixity, e.g. "prefix" or "postfix" +/// 3. verbosity: "Terse", "Medium", or "Verbose" +/// 4. startOrEnd: either "start" or "end" +/// Example: +/// GetBracketingIntentName("floor", "prefix", "Medium", "start") -> "the floor of" +/// This is used to wrap expressions like "the floor of x" rather than just speaking the bare function name. impl GetBracketingIntentName { fn bracketing_words(intent_name: &str, verbosity: &str, fixity: &str, at_start: bool) -> String { crate::definitions::SPEECH_DEFINITIONS.with(|definitions| { @@ -1360,11 +1386,15 @@ impl Function for GetBracketingIntentName { } pub struct GetNavigationPartName; -/// GetNavigationPartName(name, index) -/// Returns the name to use to speak the part of a navigation expression (e.g., 'numerator', 'denominator', 'base', 'exponent', ...). -/// If there is no match, an empty string is returned. -/// 'index' is 0-based -/// +/// GetNavigationPartName(intentName, index) +/// Returns the navigation label for one part of a structured expression. +/// Calling arguments (as used by the rule layer): +/// 1. intentName: the intent name, e.g. "fraction" or "power" +/// 2. index: the 0-based position of the part to speak +/// Example: +/// GetNavigationPartName("fraction", 0) -> "numerator" +/// GetNavigationPartName("fraction", 1) -> "denominator" +/// If no matching part exists, this returns an empty string. impl GetNavigationPartName { fn navigation_part_name(intent_name: &str, index: usize) -> String { crate::definitions::SPEECH_DEFINITIONS.with(|definitions| { From 5ad398739270ed10fcd32c6dcab78d871b8ba131 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Wed, 30 Sep 2026 00:11:05 -0700 Subject: [PATCH 148/162] Swap IntentMappings so ":" is argument glue and "|" is verbosity -- this looks much better. All language `definitions.yaml` are updated. Fix parsing of `IntentMappings`. Parsing now lives in one place, so ratio-style "name : glue" pairs, arity templates, and bracketing speech stay consistent across languages. This all started as a fix to #709, but then I discovered that the format used in `IntentMappings` was parsed incorrectly in some cases (such as "ratio"). --- Rules/Intent/general.yaml | 14 ++ Rules/Languages/de/definitions.yaml | 127 +++++++--- Rules/Languages/el/definitions.yaml | 123 ++++++++-- Rules/Languages/en/definitions.yaml | 176 ++++++------- Rules/Languages/es/definitions.yaml | 113 +++++++-- Rules/Languages/fi/definitions.yaml | 101 ++++++-- Rules/Languages/fr/definitions.yaml | 130 +++++++--- Rules/Languages/hu/definitions.yaml | 168 +++++++------ Rules/Languages/id/definitions.yaml | 111 +++++++-- Rules/Languages/nb/definitions.yaml | 101 ++++++-- Rules/Languages/pl/definitions.yaml | 167 +++++++++---- Rules/Languages/pt/definitions.yaml | 119 +++++++-- Rules/Languages/ru/definitions.yaml | 125 +++++++--- Rules/Languages/sv/definitions.yaml | 113 +++++++-- Rules/Languages/vi/definitions.yaml | 105 ++++++-- Rules/Languages/zh/tw/definitions.yaml | 157 ++++++++---- Rules/Languages/zz/definitions.yaml | 95 ++++++- src/infer_intent.rs | 328 ++++++++++++++++--------- src/xpath_functions.rs | 45 +--- tests/Languages/en/definitions.rs | 20 +- 20 files changed, 1766 insertions(+), 672 deletions(-) diff --git a/Rules/Intent/general.yaml b/Rules/Intent/general.yaml index 15bd1dc7a..54303de79 100644 --- a/Rules/Intent/general.yaml +++ b/Rules/Intent/general.yaml @@ -81,6 +81,20 @@ children: [x: "*[2]"] + +- + # We want to say "ratio of x to y" instead of "x ratio y" (which is ambiguous) + name: ratio + tag: mrow + match: "count(*)=3 and *[2][self::m:mo][.='∶']" + replace: + - intent: + name: "ratio" + attrs: "data-intent-property='concat(data-intent-property, \":function:\")'" + children: + - x: "*[1]" + - x: "*[3]" + - # (a,b) has many interpretations; (a, b] (etc) have fewer interpretations. # as an interval, it represents a set and hence a clue that it is an interval is that a set operator comes diff --git a/Rules/Languages/de/definitions.yaml b/Rules/Languages/de/definitions.yaml index 73dfcf7f7..4e1cce7f7 100644 --- a/Rules/Languages/de/definitions.yaml +++ b/Rules/Languages/de/definitions.yaml @@ -1,48 +1,117 @@ --- - 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 only one ":" is used, it 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 -# Intent mappings must specify whether they are "prefix", "infix", "postfix", or "function" with an "=" sign -# If there are multiple fixities (e.g., see transpose), they are separated with "|| -# 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 Syntax: +# +# This section defines how each "intent" is spoken for various grammatical forms (fixities such as "prefix", "infix", "postfix", and "function"), +# along with supporting different verbosity levels. +# The syntax is a little bit complicated, but allows a declarative syntax so you don't have to write as many rules. +# +# For each intent, you specify spoken forms for one or more fixities using the syntax below. +# +# - Each mapping has the form: +# "": "= || = || ...", +# Every alternative must name a fixity and use "="; the fixity requested when speaking selects one. +# +# - Separate multiple fixities with "||". Spaces are allowed around any delimiter for readability. +# - Within a speech string, "|" selects the verbosity form: +# - one "|" (two forms): the first is 'terse', the second is used for 'medium' and 'verbose' +# - two "|" (three forms): 'terse', 'medium', 'verbose', in that order +# - no "|": the same spoken form is used for all verbosity levels +# +# - Use semicolons ";" to divide opening; main; closing bracketing words within the name part, +# where such words make sense (a name with no ";" is just the main phrase). +# - If an intent has multiple fixities but a definition does not specify one, the first fixity listed is chosen by default. +# +# Functions and argument glue (the part after the name): +# - ":" separates the name/bracketing phrase from the argument-glue options that follow it. +# - Arity template (two or more ":" options, or one option with ','-separated glue words): the +# number of glue words implies the arity, and the final argument is preceded by "of". +# Example: "sum: over: from,to" +# - 1 arg: "sum of x" +# - 2 args: "sum over i of x" +# - 3 args: "sum from i to n of x" +# If no option matches the argument count, the arguments are separated with "comma". +# - Binary separator (exactly one ":" option, no commas in it): after "of", that word joins the two args. +# Example: "quotient": "function=integer part: divided by" → "integer part of x divided by y" +# If there are not exactly two args, the arguments fall back to "comma". +# - Paired "ratio-style" (" : | : | ..."): used when every "|"-separated +# piece is a single "name : glue" pair. Verbosity selects one pair, whose glue is the binary +# separator described above. Example: "ratio": "function=ratio : to | the ratio : to | the ratio : to" +# +# Conceptual grammar (with precedence): +# +# IntentMappingsEntry ::= ":" # ":" is the YAML key/value separator +# +# ::= ( "||" )* +# +# ::= "=" +# +# ::= "prefix" | "infix" | "postfix" | "function" | "nofix" | "silent" +# +# ::= | +# +# # Standard form: a name/bracketing part, then ":"-separated argument-glue options. +# ::= ( ":" )* +# +# ::= [ ";" ";" ] # 1 part: name; 3 parts: opening; main; closing +# +# ::= [ "|" [ "|" ] ] # terse | medium | verbose +# +# ::= # a single glue word, or ","-separated arity words +# +# # Paired "ratio-style" form: recognized only when every "|" piece is a single "name : glue" pair. +# ::= ( "|" )+ +# +# ::= ":" # the glue contains no ":" +# +# ::= text +# +# Precedence depends on the form: +# - Standard: split on ":" first (name vs. argument-glue options), then split each piece on "|" +# for terse|medium|verbose, and split only the name part on ";" for opening; main; closing. +# - Paired: split on "|" first into "name : glue" pairs, then verbosity selects one pair. +# +# Example: +# "absolute-value": "function= ; absolute value| the absolute value| the absolute value; end absolute value" +# "sum": "function=sum: over: from,to" +# "quotient": "function=integer part: divided by" +# "ratio": "function=ratio : to | the ratio : to | the ratio : to" # verbosity of name:glue pairs +# - IntentMappings: { - "indexed-by": "infix= ; sub; ende sub: ende sub: ende subskript", + "indexed-by": "infix= ; sub; ende sub| ende sub| ende subskript", "modified-variable": "silent= ", - "say-super": "infix=super: hochstellung: hochstellung", + "say-super": "infix=super| hochstellung| hochstellung", "skip-super": "silent=", - "absolute-value": "function= ; absoluter wert: der absolute wert: der absolute wert; ende absoluter wert", + "absolute-value": "function= ; absoluter wert| der absolute wert| der absolute wert; ende absoluter wert", "binomial": "infix=binomial; wĂ€hlen; ende binomial", "dimension-product": "infix=mal", - "greatest-common-divisor": "function=gcd: der gcd: der grĂ¶ĂŸte gemeinsame teiler", + "greatest-common-divisor": "function=gcd| der gcd| der grĂ¶ĂŸte gemeinsame teiler", "imaginary-part": "function=imaginĂ€rer teil, der imaginĂ€re teil, der imaginĂ€re teil", - "least-common-multiple": "function=lcm:der lcm:das kleinste gemeinsame vielfache", - "limit": "prefix=grenzwert bei: der grenzwert bei: der grenzwert bei", - "lim-sup": "prefix=lim sup bei: der obere grenzwert bei: der obere grenzwert bei", - "lim-inf": "prefix=lim inf bei: der untere grenzwert bei : der untere grenzwert bei", - "logarithm-with-base": "prefix=logarithmus basis: der logarithmus basis: der logarithmus basis", - "natural-logarithm": "function=ln: natĂŒrlicher logarithmus: natĂŒrlicher logarithmus", + "least-common-multiple": "function=lcm|der lcm|das kleinste gemeinsame vielfache", + "limit": "prefix=grenzwert bei| der grenzwert bei| der grenzwert bei", + "lim-sup": "prefix=lim sup bei| der obere grenzwert bei| der obere grenzwert bei", + "lim-inf": "prefix=lim inf bei| der untere grenzwert bei | der untere grenzwert bei", + "logarithm-with-base": "prefix=logarithmus basis| der logarithmus basis| der logarithmus basis", + "natural-logarithm": "function=ln| natĂŒrlicher logarithmus| natĂŒrlicher logarithmus", "minus": "infix=minus || prefix=minus", "plus": "infix=plus || prefix=plus", "real-part": "function=der reale teil", "transpose": "postfix=transponiert || function=die Transponierte", - "magnitude": "function=; Norm: Norm: Norm; Ende Norm", - "norm": "function=; norm: norm: norm; ende norm", - "trace": "function=; spur : spur: die spur; ende spur", - "dimension": "function=; dimension : dimension: die dimension; ende dimension", - "homomorphism": "function= ; homomorphismus : homomorphismus: der homomorphismus; ende homomorphismus", - "kernel": "function= ; kern : kern: der kern; ende kern", + "magnitude": "function=; Norm| Norm| Norm; Ende Norm", + "norm": "function=; norm| norm| norm; ende norm", + "trace": "function=; spur | spur| die spur; ende spur", + "dimension": "function=; dimension | dimension| die dimension; ende dimension", + "homomorphism": "function= ; homomorphismus | homomorphismus| der homomorphismus; ende homomorphismus", + "kernel": "function= ; kern | kern| der kern; ende kern", "vector": "function= ; vektor || prefix=vektor", - "cross-product": "infix=kreuz: kreuzprodukt: kreuzprodukt", - "dot-product": "infix=punkt: punktprodukt: punkt:punktprodukt", - "divergence": "function= ; div: divergenz: divergenz; ende divergenz", + "cross-product": "infix=kreuz| kreuzprodukt| kreuzprodukt", + "dot-product": "infix=punkt| punktprodukt| punkt|punktprodukt", + "divergence": "function= ; div| divergenz| divergenz; ende divergenz", "curl": "function= ; rotation; ende rotation", - "gradient": "function= ; grad: gradient: gradient; ende gradient", + "gradient": "function= ; grad| gradient| gradient; ende gradient", "laplacian": "function=laplace", - "chemistry-concentration": "function= ; konzentration: konzentration von: die konzentration von; ende konzentration" + "chemistry-concentration": "function= ; konzentration| konzentration von| die konzentration von; ende konzentration" } - NavigationParts: { diff --git a/Rules/Languages/el/definitions.yaml b/Rules/Languages/el/definitions.yaml index d507f0719..d00479d31 100644 --- a/Rules/Languages/el/definitions.yaml +++ b/Rules/Languages/el/definitions.yaml @@ -2,33 +2,102 @@ --- - 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 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 -# Intent mappings must specify whether they are "prefix", "infix", "postfix", or "function" with an "=" sign -# If there are multiple fixities (e.g., see transpose), they are separated with "||" -# 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 Syntax: +# +# This section defines how each "intent" is spoken for various grammatical forms (fixities such as "prefix", "infix", "postfix", and "function"), +# along with supporting different verbosity levels. +# The syntax is a little bit complicated, but allows a declarative syntax so you don't have to write as many rules. +# +# For each intent, you specify spoken forms for one or more fixities using the syntax below. +# +# - Each mapping has the form: +# "": "= || = || ...", +# Every alternative must name a fixity and use "="; the fixity requested when speaking selects one. +# +# - Separate multiple fixities with "||". Spaces are allowed around any delimiter for readability. +# - Within a speech string, "|" selects the verbosity form: +# - one "|" (two forms): the first is 'terse', the second is used for 'medium' and 'verbose' +# - two "|" (three forms): 'terse', 'medium', 'verbose', in that order +# - no "|": the same spoken form is used for all verbosity levels +# +# - Use semicolons ";" to divide opening; main; closing bracketing words within the name part, +# where such words make sense (a name with no ";" is just the main phrase). +# - If an intent has multiple fixities but a definition does not specify one, the first fixity listed is chosen by default. +# +# Functions and argument glue (the part after the name): +# - ":" separates the name/bracketing phrase from the argument-glue options that follow it. +# - Arity template (two or more ":" options, or one option with ','-separated glue words): the +# number of glue words implies the arity, and the final argument is preceded by "of". +# Example: "sum: over: from,to" +# - 1 arg: "sum of x" +# - 2 args: "sum over i of x" +# - 3 args: "sum from i to n of x" +# If no option matches the argument count, the arguments are separated with "comma". +# - Binary separator (exactly one ":" option, no commas in it): after "of", that word joins the two args. +# Example: "quotient": "function=integer part: divided by" → "integer part of x divided by y" +# If there are not exactly two args, the arguments fall back to "comma". +# - Paired "ratio-style" (" : | : | ..."): used when every "|"-separated +# piece is a single "name : glue" pair. Verbosity selects one pair, whose glue is the binary +# separator described above. Example: "ratio": "function=ratio : to | the ratio : to | the ratio : to" +# +# Conceptual grammar (with precedence): +# +# IntentMappingsEntry ::= ":" # ":" is the YAML key/value separator +# +# ::= ( "||" )* +# +# ::= "=" +# +# ::= "prefix" | "infix" | "postfix" | "function" | "nofix" | "silent" +# +# ::= | +# +# # Standard form: a name/bracketing part, then ":"-separated argument-glue options. +# ::= ( ":" )* +# +# ::= [ ";" ";" ] # 1 part: name; 3 parts: opening; main; closing +# +# ::= [ "|" [ "|" ] ] # terse | medium | verbose +# +# ::= # a single glue word, or ","-separated arity words +# +# # Paired "ratio-style" form: recognized only when every "|" piece is a single "name : glue" pair. +# ::= ( "|" )+ +# +# ::= ":" # the glue contains no ":" +# +# ::= text +# +# Precedence depends on the form: +# - Standard: split on ":" first (name vs. argument-glue options), then split each piece on "|" +# for terse|medium|verbose, and split only the name part on ";" for opening; main; closing. +# - Paired: split on "|" first into "name : glue" pairs, then verbosity selects one pair. +# +# Example: +# "absolute-value": "function= ; absolute value| the absolute value| the absolute value; end absolute value" +# "sum": "function=sum: over: from,to" +# "quotient": "function=integer part: divided by" +# "ratio": "function=ratio : to | the ratio : to | the ratio : to" # verbosity of name:glue pairs +# - IntentMappings: { - "indexed-by": "infix= ; ΎΔίÎșτης; Ï„Î­Î»ÎżÏ‚ ΎΔίÎșτη: Ï„Î­Î»ÎżÏ‚ ΎΔίÎșτη: Ï„Î­Î»ÎżÏ‚ ΎΔίÎșτη", + "indexed-by": "infix= ; ΎΔίÎșτης; Ï„Î­Î»ÎżÏ‚ ΎΔίÎșτη| Ï„Î­Î»ÎżÏ‚ ΎΔίÎșτη| Ï„Î­Î»ÎżÏ‚ ΎΔίÎșτη", "modified-variable": "silent= ", - "say-super": "infix= ΔÎčς τηΜ: ΔÎșΞέτης: ΔÎșΞέτης", # used with 'mo' for superscripts (e.g, "<") + "say-super": "infix= ΔÎčς τηΜ| ΔÎșΞέτης| ΔÎșΞέτης", # used with 'mo' for superscripts (e.g, "<") "skip-super": "silent=", # used with 'mo' for superscripts (e.g, "*") - "absolute-value": "function= ; απόλυτη τÎčÎŒÎź: η απόλυτη τÎčÎŒÎź: η απόλυτη τÎčÎŒÎź; Ï„Î­Î»ÎżÏ‚ απόλυτης τÎčÎŒÎźÏ‚", + "absolute-value": "function= ; απόλυτη τÎčÎŒÎź| η απόλυτη τÎčÎŒÎź| η απόλυτη τÎčÎŒÎź; Ï„Î­Î»ÎżÏ‚ απόλυτης τÎčÎŒÎźÏ‚", "binomial": "infix=ÎŽÎčωΜυΌÎčÎșό; Î±ÎœÎŹ; Ï„Î­Î»ÎżÏ‚ ÎŽÎčωΜυΌÎčÎșÎżÏ", #theodora. αΜጀ = chooce in english. check "dimension-product": "infix=Î”Ï€ÎŻ", # "closed-interval": "other=closed-interval; from,to; end closed-interval", - "greatest-common-divisor": "function=ÎŒÎșÎŽ: Îż ÎŒÎșÎŽ: Îż ÎŒÎ­ÎłÎčÏƒÏ„ÎżÏ‚ ÎșÎżÎčΜός ÎŽÎčαÎčρέτης", # theodora. check how ÎŒÎșÎŽ and ΔÎșπ sounds + "greatest-common-divisor": "function=ÎŒÎșÎŽ| Îż ÎŒÎșÎŽ| Îż ÎŒÎ­ÎłÎčÏƒÏ„ÎżÏ‚ ÎșÎżÎčΜός ÎŽÎčαÎčρέτης", # theodora. check how ÎŒÎșÎŽ and ΔÎșπ sounds "imaginary-part": "function=φαΜταστÎčÎșό ÎŒÎ­ÏÎżÏ‚, Ï„Îż φαΜταστÎčÎșό ÎŒÎ­ÏÎżÏ‚, Ï„Îż φαΜταστÎčÎșό ÎŒÎ­ÏÎżÏ‚", - "least-common-multiple": "function=ΔÎșπ:Ï„Îż ΔÎșπ:Ï„Îż Î”Î»ÎŹÏ‡ÎčÏƒÏ„Îż ÎșÎżÎčΜό Ï€ÎżÎ»Î»Î±Ï€Î»ÎŹÏƒÎčÎż", + "least-common-multiple": "function=ΔÎșπ|Ï„Îż ΔÎșπ|Ï„Îż Î”Î»ÎŹÏ‡ÎčÏƒÏ„Îż ÎșÎżÎčΜό Ï€ÎżÎ»Î»Î±Ï€Î»ÎŹÏƒÎčÎż", # "large-op": "infix=over || other=from,to", - "limit": "prefix=όρÎčÎż όταΜ: Ï„Îż όρÎčÎż όταΜ: Ï„Îż όρÎčÎż όταΜ", - "lim-sup": "prefix=Î±ÎœÏŽÏ„Î±Ï„Îż όρÎčÎż όταΜ: Ï„Îż Î±ÎœÏŽÏ„Î±Ï„Îż όρÎčÎż όταΜ: Ï„Îż Î±ÎœÏŽÏ„Î±Ï„Îż όρÎčÎż όταΜ", #theodora. check "όταΜ " english: as - "lim-inf": "prefix=ÎșÎ±Ï„ÏŽÏ„Î±Ï„Îż όρÎčÎż όταΜ: Ï„Îż ÎșÎ±Ï„ÏŽÏ„Î±Ï„Îż όρÎčÎż όταΜ : Ï„Îż ÎșÎ±Ï„ÏŽÏ„Î±Ï„Îż όρÎčÎż όταΜ", - "logarithm-with-base": "prefix=Îż Î»ÎżÎłÎŹÏÎčÎžÎŒÎżÏ‚ ΌΔ ÎČÎŹÏƒÎ·: Îż Î»ÎżÎłÎŹÏÎčÎžÎŒÎżÏ‚ ΌΔ ÎČÎŹÏƒÎ·: Îż Î»ÎżÎłÎŹÏÎčÎžÎŒÎżÏ‚ ΌΔ ÎČÎŹÏƒÎ·", - "natural-logarithm": "function=l n: φυσÎčÎșός Î»ÎżÎłÎŹÏÎčÎžÎŒÎżÏ‚: φυσÎčÎșός Î»ÎżÎłÎŹÏÎčÎžÎŒÎżÏ‚", + "limit": "prefix=όρÎčÎż όταΜ| Ï„Îż όρÎčÎż όταΜ| Ï„Îż όρÎčÎż όταΜ", + "lim-sup": "prefix=Î±ÎœÏŽÏ„Î±Ï„Îż όρÎčÎż όταΜ| Ï„Îż Î±ÎœÏŽÏ„Î±Ï„Îż όρÎčÎż όταΜ| Ï„Îż Î±ÎœÏŽÏ„Î±Ï„Îż όρÎčÎż όταΜ", #theodora. check "όταΜ " english: as + "lim-inf": "prefix=ÎșÎ±Ï„ÏŽÏ„Î±Ï„Îż όρÎčÎż όταΜ| Ï„Îż ÎșÎ±Ï„ÏŽÏ„Î±Ï„Îż όρÎčÎż όταΜ | Ï„Îż ÎșÎ±Ï„ÏŽÏ„Î±Ï„Îż όρÎčÎż όταΜ", + "logarithm-with-base": "prefix=Îż Î»ÎżÎłÎŹÏÎčÎžÎŒÎżÏ‚ ΌΔ ÎČÎŹÏƒÎ·| Îż Î»ÎżÎłÎŹÏÎčÎžÎŒÎżÏ‚ ΌΔ ÎČÎŹÏƒÎ·| Îż Î»ÎżÎłÎŹÏÎčÎžÎŒÎżÏ‚ ΌΔ ÎČÎŹÏƒÎ·", + "natural-logarithm": "function=l n| φυσÎčÎșός Î»ÎżÎłÎŹÏÎčÎžÎŒÎżÏ‚| φυσÎčÎșός Î»ÎżÎłÎŹÏÎčÎžÎŒÎżÏ‚", "minus": "infix=ÎŒÎ”ÎŻÎżÎœ || prefix=ÎŒÎ”ÎŻÎżÎœ", "plus": "infix=συΜ || prefix=συΜ", # check. prefix = negative prefix = positive in english. not always appropriate/unatural for greek @@ -37,21 +106,21 @@ "transpose": "postfix=Î±ÎœÎŹÏƒÏ„ÏÎżÏ†ÎżÏ‚ || function=Î±ÎœÎŹÏƒÏ„ÏÎżÏ†ÎżÏ‚", "magnitude": "postfix=ΜόρΌα || function=ΜόρΌα", #theodora. added the magnitude, was read in english otherwise. Check if "ÎŽÎčÏ€Î»Îź ÎșÎŹÎžÎ”Ï„ÎżÏ‚" is more appropriate - "norm": "function=; ΜόρΌα: ΜόρΌα: ΜόρΌα; Ï„Î­Î»ÎżÏ‚ ΜόρΌας", - "trace": "function=;ÎŻÏ‡ÎœÎżÏ‚ : ÎŻÏ‡ÎœÎżÏ‚: Ï„Îż ÎŻÏ‡ÎœÎżÏ‚; Ï„Î­Î»ÎżÏ‚ ÎŻÏ‡ÎœÎżÏ…Ï‚", - "dimension": "function=; ÎŽÎčÎŹÏƒÏ„Î±ÏƒÎ· : ÎŽÎčÎŹÏƒÏ„Î±ÏƒÎ·: η ÎŽÎčÎŹÏƒÏ„Î±ÏƒÎ·; Ï„Î­Î»ÎżÏ‚ ÎŽÎčÎŹÏƒÏ„Î±ÏƒÎ·Ï‚", - "homomorphism": "function= ; ÎżÎŒÎżÎŒÎżÏÏ†ÎčσΌός : ÎżÎŒÎżÎŒÎżÏÏ†ÎčσΌός: Îż ÎżÎŒÎżÎŒÎżÏÏ†ÎčσΌός; Ï„Î­Î»ÎżÏ‚ ÎżÎŒÎżÎŒÎżÏÏ†ÎčÏƒÎŒÎżÏ", - "kernel": "function= ; Ï€Ï…ÏÎźÎœÎ±Ï‚ : Ï€Ï…ÏÎźÎœÎ±Ï‚: Îż Ï€Ï…ÏÎźÎœÎ±Ï‚; Ï„Î­Î»ÎżÏ‚ Ï€Ï…ÏÎźÎœÎ±", + "norm": "function=; ΜόρΌα| ΜόρΌα| ΜόρΌα; Ï„Î­Î»ÎżÏ‚ ΜόρΌας", + "trace": "function=;ÎŻÏ‡ÎœÎżÏ‚ | ÎŻÏ‡ÎœÎżÏ‚| Ï„Îż ÎŻÏ‡ÎœÎżÏ‚; Ï„Î­Î»ÎżÏ‚ ÎŻÏ‡ÎœÎżÏ…Ï‚", + "dimension": "function=; ÎŽÎčÎŹÏƒÏ„Î±ÏƒÎ· | ÎŽÎčÎŹÏƒÏ„Î±ÏƒÎ·| η ÎŽÎčÎŹÏƒÏ„Î±ÏƒÎ·; Ï„Î­Î»ÎżÏ‚ ÎŽÎčÎŹÏƒÏ„Î±ÏƒÎ·Ï‚", + "homomorphism": "function= ; ÎżÎŒÎżÎŒÎżÏÏ†ÎčσΌός | ÎżÎŒÎżÎŒÎżÏÏ†ÎčσΌός| Îż ÎżÎŒÎżÎŒÎżÏÏ†ÎčσΌός; Ï„Î­Î»ÎżÏ‚ ÎżÎŒÎżÎŒÎżÏÏ†ÎčÏƒÎŒÎżÏ", + "kernel": "function= ; Ï€Ï…ÏÎźÎœÎ±Ï‚ | Ï€Ï…ÏÎźÎœÎ±Ï‚| Îż Ï€Ï…ÏÎźÎœÎ±Ï‚; Ï„Î­Î»ÎżÏ‚ Ï€Ï…ÏÎźÎœÎ±", "vector": "function= ; ÎŽÎčÎŹÎœÏ…ÏƒÎŒÎ± || prefix=ÎŽÎčÎŹÎœÏ…ÏƒÎŒÎ±", "cross-product": "infix=ÎŽÎčαΜυσΌατÎčÎșό ÎłÎčÎœÏŒÎŒÎ”ÎœÎż", # theodora. check Ï„Îż Î”ÎŻÏ‡Î” έτσÎč "infix=cross: ÎŽÎčαΜυσΌατÎčÎșό ÎłÎčÎœÏŒÎŒÎ”ÎœÎż: ÎŽÎčαΜυσΌατÎčÎșό ÎłÎčÎœÏŒÎŒÎ”ÎœÎż", - "dot-product": "infix=Ï„Î”Î»Î”ÎŻÎ±: ΔσωτΔρÎčÎșό ÎłÎčÎœÏŒÎŒÎ”ÎœÎż: Ï„Î”Î»Î”ÎŻÎ±: ΔσωτΔρÎčÎșό ÎłÎčÎœÏŒÎŒÎ”ÎœÎż", #theodora. check. Î”ÎŻÎœÎ±Îč ολα ΔσωτΔρÎčÎșό ÎłÎčÎœÏŒÎŒÎ”ÎœÎż Îź πÎčÎŹÎœÎ”Îč ÎșÎč Ώλλα ÎżÏ€ÏŒÏ„Î” ΞέλΔÎč πÎčÎż ÎłÎ”ÎœÎčÎșό ÏŒÏÎż; + "dot-product": "infix=Ï„Î”Î»Î”ÎŻÎ±| ΔσωτΔρÎčÎșό ÎłÎčÎœÏŒÎŒÎ”ÎœÎż| Ï„Î”Î»Î”ÎŻÎ±| ΔσωτΔρÎčÎșό ÎłÎčÎœÏŒÎŒÎ”ÎœÎż", #theodora. check. Î”ÎŻÎœÎ±Îč ολα ΔσωτΔρÎčÎșό ÎłÎčÎœÏŒÎŒÎ”ÎœÎż Îź πÎčÎŹÎœÎ”Îč ÎșÎč Ώλλα ÎżÏ€ÏŒÏ„Î” ΞέλΔÎč πÎčÎż ÎłÎ”ÎœÎčÎșό ÏŒÏÎż; - "divergence": "function= ; απόÎșλÎčση: απόÎșλÎčση: απόÎșλÎčση; Ï„Î­Î»ÎżÏ‚ απόÎșλÎčσης", + "divergence": "function= ; απόÎșλÎčση| απόÎșλÎčση| απόÎșλÎčση; Ï„Î­Î»ÎżÏ‚ απόÎșλÎčσης", "curl": "function= ; ÏƒÏ„ÏÎżÎČÎčλÎčσΌός; Ï„Î­Î»ÎżÏ‚ ÏƒÏ„ÏÎżÎČÎčλÎčÏƒÎŒÎżÏ", - "gradient": "function= ; Î±ÎœÎŹÎŽÎ”Î»Ï„Î±: Î±ÎœÎŹÎŽÎ”Î»Ï„Î±: Î±ÎœÎŹÎŽÎ”Î»Ï„Î±; Ï„Î­Î»ÎżÏ‚ Î±ÎœÎŹÎŽÎ”Î»Ï„Î±", + "gradient": "function= ; Î±ÎœÎŹÎŽÎ”Î»Ï„Î±| Î±ÎœÎŹÎŽÎ”Î»Ï„Î±| Î±ÎœÎŹÎŽÎ”Î»Ï„Î±; Ï„Î­Î»ÎżÏ‚ Î±ÎœÎŹÎŽÎ”Î»Ï„Î±", "laplacian": "function=λαπλασÎčÎ±ÎœÎź", # speech engines don't do a good job with "laplacian" - "chemistry-concentration": "function= ; ÏƒÏ…ÎłÎșέΜτρωση: η ÏƒÏ…ÎłÎșέΜτρωση Ï„ÎżÏ…: η ÏƒÏ…ÎłÎșέΜτρωση Ï„ÎżÏ…; Ï„Î­Î»ÎżÏ‚ ÏƒÏ…ÎłÎșέΜτρωσης", + "chemistry-concentration": "function= ; ÏƒÏ…ÎłÎșέΜτρωση| η ÏƒÏ…ÎłÎșέΜτρωση Ï„ÎżÏ…| η ÏƒÏ…ÎłÎșέΜτρωση Ï„ÎżÏ…; Ï„Î­Î»ÎżÏ‚ ÏƒÏ…ÎłÎșέΜτρωσης", } # Names of functions that in terse mode don't say "of" (or it's equivalent in other languages) diff --git a/Rules/Languages/en/definitions.yaml b/Rules/Languages/en/definitions.yaml index bd3931549..677d7c78c 100644 --- a/Rules/Languages/en/definitions.yaml +++ b/Rules/Languages/en/definitions.yaml @@ -11,60 +11,72 @@ # # - Each mapping has the form: # "": "= || = || ...", -# or just -# "": "", -# where is used for all forms if fixity and '=' are omitted. +# Every alternative must name a fixity and use "="; the fixity requested when speaking selects one. # -# - If an intent has multiple fixities, separate them with "||". Spaces are allowed around delimiters for readability. -# - If only one ":" is present in **, it provides the 'terse' form, and the following string is used for both 'medium' and 'verbose'. -# - If more than one ":" is present, the string is split into 'terse', 'medium', and 'verbose' forms, in that order (each separated by ":"). -# - If no ":" is present, the same spoken form is used for all styles. +# - Separate multiple fixities with "||". Spaces are allowed around any delimiter for readability. +# - Within a speech string, "|" selects the verbosity form: +# - one "|" (two forms): the first is 'terse', the second is used for 'medium' and 'verbose' +# - two "|" (three forms): 'terse', 'medium', 'verbose', in that order +# - no "|": the same spoken form is used for all verbosity levels # -# - Use semicolons ";" to divide opening, main, and closing bracketing words within a speech string, where such words make sense. +# - Use semicolons ";" to divide opening; main; closing bracketing words within the name part, +# where such words make sense (a name with no ";" is just the main phrase). # - If an intent has multiple fixities but a definition does not specify one, the first fixity listed is chosen by default. # -# Functions and argument glue: -# - The "|" character delimits options describing how to glue arguments together when speaking function arguments. -# - Arity templates (multiple "|" options, or one option with ','-separated glue words): glue-word count -# implies arity; the final argument is preceded by "of". Example: "sum | over | from,to" +# Functions and argument glue (the part after the name): +# - ":" separates the name/bracketing phrase from the argument-glue options that follow it. +# - Arity template (two or more ":" options, or one option with ','-separated glue words): the +# number of glue words implies the arity, and the final argument is preceded by "of". +# Example: "sum: over: from,to" # - 1 arg: "sum of x" # - 2 args: "sum over i of x" # - 3 args: "sum from i to n of x" -# If no option matches the argument count, separators fall back to "comma". -# - Binary separator (exactly one "|" option, no commas in it): after "of", that word joins the two args. -# Example: "quotient": "function=integer part | divided by" → "integer part of x divided by y" -# If there are not exactly two args, separators fall back to "comma" (no real n-ary use of these words). +# If no option matches the argument count, the arguments are separated with "comma". +# - Binary separator (exactly one ":" option, no commas in it): after "of", that word joins the two args. +# Example: "quotient": "function=integer part: divided by" → "integer part of x divided by y" +# If there are not exactly two args, the arguments fall back to "comma". +# - Paired "ratio-style" (" : | : | ..."): used when every "|"-separated +# piece is a single "name : glue" pair. Verbosity selects one pair, whose glue is the binary +# separator described above. Example: "ratio": "function=ratio : to | the ratio : to | the ratio : to" # -# BNF-like description: +# Conceptual grammar (with precedence): # -# IntentMappingsEntry ::= ":" +# IntentMappingsEntry ::= ":" # ":" is the YAML key/value separator # # ::= ( "||" )* -# | # -# ::= "=" +# ::= "=" # # ::= "prefix" | "infix" | "postfix" | "function" | "nofix" | "silent" # -# ::= -# | "|" ( "|" )* +# ::= | # -# ::= text -# # May use ":" to separate terse:medium:verbose forms. -# # May use ";" for bracketing (opening; main; closing). +# # Standard form: a name/bracketing part, then ":"-separated argument-glue options. +# ::= ( ":" )* # -# ::= text -# # One option, no commas: binary separator after "of" (e.g. "divided by"). -# # One option with "," or several "|" options: arity templates -# # (glue-word count = arg_count - 1; last arg preceded by "of"). -# # Unmatched arity (or binary glue with ≠2 args): fall back to "comma". +# ::= [ ";" ";" ] # 1 part: name; 3 parts: opening; main; closing # -# ::= (applies to all fixities) +# ::= [ "|" [ "|" ] ] # terse | medium | verbose +# +# ::= # a single glue word, or ","-separated arity words +# +# # Paired "ratio-style" form: recognized only when every "|" piece is a single "name : glue" pair. +# ::= ( "|" )+ +# +# ::= ":" # the glue contains no ":" +# +# ::= text +# +# Precedence depends on the form: +# - Standard: split on ":" first (name vs. argument-glue options), then split each piece on "|" +# for terse|medium|verbose, and split only the name part on ";" for opening; main; closing. +# - Paired: split on "|" first into "name : glue" pairs, then verbosity selects one pair. # # Example: -# "absolute-value": "function= ; absolute value: the absolute value: the absolute value; end absolute value" -# "sum": "function=sum | over | from,to" -# "quotient": "function=integer part | divided by" +# "absolute-value": "function= ; absolute value| the absolute value| the absolute value; end absolute value" +# "sum": "function=sum: over: from,to" +# "quotient": "function=integer part: divided by" +# "ratio": "function=ratio : to | the ratio : to | the ratio : to" # verbosity of name:glue pairs # - IntentMappings: { "binomial": "infix=binomial; choose; end binomial", @@ -79,9 +91,9 @@ "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", + "quotient":"function=integer part: divided by", "evaluated-at":"infix=evaluated at", - "remainder":"function=the remainder | divided by", + "remainder":"function=the remainder: divided by", "max":"function=max", "min":"function=min", @@ -89,14 +101,14 @@ "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" + "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", + "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", + "imaginary-part": "function=imaginary part| the imaginary part| the imaginary part", "polar-coordinate":"function=polar coordinate", "spherical-coordinate":"function=spherical coordinate", @@ -113,34 +125,34 @@ # "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", + "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", + "set": "function= ; set| the set", + "set-difference":"function=set difference: and || infix=minus", "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", + "tuple": "function= ; tuple| the tuple", ### Sequence and Series - "sum": "function=sum | over | from,to", - "product": "function=product | over | from,to", + "sum": "function=sum: over: from,to", + "product": "function=product: over: 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", + "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", @@ -164,7 +176,7 @@ "arc-hyperbolic-cotangent":"function=arc coth", "exponential":"function=exponential", - "natural-logarithm": "function=l n: natural log: natural log", + "natural-logarithm": "function=l n| natural log| natural log", "logarithm":"function=log", ##Check arity 2 @@ -175,7 +187,7 @@ "median":"function=median", "mode":"function=mode", - "conditional-probability":"function=probability | given", + "conditional-probability":"function=probability: given", ### Linear Algebra @@ -184,7 +196,7 @@ "determinant":"function=determinant", "adjugate":"function=adjugate", "magnitude":"function=magnitude", - "norm": "function=; norm: norm: norm; end norm", + "norm": "function=; norm| norm| norm; end norm", "span":"function=span", "unit-vector":"prefix=unit vector", @@ -195,12 +207,12 @@ ### 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", + "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 @@ -221,9 +233,9 @@ ### 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 + "ordered-pair": "function=the pair: and", # Needs to be tested # Simple last arg: "x sub k". Complex: "
 end sub" (terse/medium) / "end subscript" (verbose) via infix-intent. - "indexed-by": "infix= ; sub; end sub: end sub: end subscript", + "indexed-by": "infix= ; sub; end sub| end sub| end subscript", "highlight":"postfix=highlighted", "least-common-denominator":"function=least common denominator", @@ -245,8 +257,8 @@ ### Other ## Default fixity function "curl": "function=curl", - "divergence": "function=div:divergence", - "gradient": "function=del:gradient", + "divergence": "function=div|divergence", + "gradient": "function=del|gradient", "laplacian": "function=laplacian", ## Default fixity prefix @@ -271,7 +283,7 @@ "congruent": "infix=congruent to", "cartesian-product": "infix=cartesian product", "composed-with": "infix=composed with", - "cross-product": "infix=cross: cross product: cross product", + "cross-product": "infix=cross| cross product| cross product", "defined-as": "infix=defined as", "divided-by": "infix=divided by", "divides": "infix=divides", @@ -315,7 +327,7 @@ "precedes": "infix=precedes", "proportional": "infix=proportional to", "range-separator": "infix=through", - "ratio": "infix=ratio", + "ratio": "function=ratio : to | the ratio : to | the ratio : to", "similar": "infix=similar to", "subset": "infix=subset of", "subset-or-equal": "infix=subset or equal to", @@ -335,11 +347,11 @@ "percent": "postfix=percent", ## Default fixity nofix - "diameter":"nofix=d: diameter", - "distance":"nofix=d; D: distance", - "probability":"nofix=P: probability || function=probability", - "radius":"nofix=r: radius", - "volume":"nofix=V: volume || function=volume", + "diameter":"nofix=d| diameter", + "distance":"nofix=d; D| distance", + "probability":"nofix=P| probability || function=probability", + "radius":"nofix=r| radius", + "volume":"nofix=V| volume || function=volume", "exponential-e":"nofix=e", "imaginary-i":"nofix=i", "differential-d":"nofix=d", @@ -348,19 +360,19 @@ ## 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, "<") + "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", - "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", + "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", # "pochhammer": "infix=permutations of", # arguments are in reverse order, so can't work here - "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", + "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", - "chemistry-concentration": "function= ; concentration: concentration of: the concentration of; end concentration", + "chemistry-concentration": "function= ; concentration| concentration of| the concentration of; end concentration", } # The connector word to say for functional 'IntentMappings' (in English, "of") @@ -370,7 +382,7 @@ # Names of functions that in terse mode don't say "of" (or it's equivalent in other languages) - TerseFunctionNames: { - "divergence", "del:gradient", "curl" + "divergence", "del|gradient", "curl" } - NavigationParts: { diff --git a/Rules/Languages/es/definitions.yaml b/Rules/Languages/es/definitions.yaml index 47267348e..795892f5c 100644 --- a/Rules/Languages/es/definitions.yaml +++ b/Rules/Languages/es/definitions.yaml @@ -7,45 +7,114 @@ # - name: [] "...", "..." "..." ] -# 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 only one ":" is used, it 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 -# Intent mappings must specify whether they are "prefix", "infix", "postfix", or "function" with an "=" sign -# If there are multiple fixities (e.g., see transpose), they are separated with "|| -# 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 Syntax: +# +# This section defines how each "intent" is spoken for various grammatical forms (fixities such as "prefix", "infix", "postfix", and "function"), +# along with supporting different verbosity levels. +# The syntax is a little bit complicated, but allows a declarative syntax so you don't have to write as many rules. +# +# For each intent, you specify spoken forms for one or more fixities using the syntax below. +# +# - Each mapping has the form: +# "": "= || = || ...", +# Every alternative must name a fixity and use "="; the fixity requested when speaking selects one. +# +# - Separate multiple fixities with "||". Spaces are allowed around any delimiter for readability. +# - Within a speech string, "|" selects the verbosity form: +# - one "|" (two forms): the first is 'terse', the second is used for 'medium' and 'verbose' +# - two "|" (three forms): 'terse', 'medium', 'verbose', in that order +# - no "|": the same spoken form is used for all verbosity levels +# +# - Use semicolons ";" to divide opening; main; closing bracketing words within the name part, +# where such words make sense (a name with no ";" is just the main phrase). +# - If an intent has multiple fixities but a definition does not specify one, the first fixity listed is chosen by default. +# +# Functions and argument glue (the part after the name): +# - ":" separates the name/bracketing phrase from the argument-glue options that follow it. +# - Arity template (two or more ":" options, or one option with ','-separated glue words): the +# number of glue words implies the arity, and the final argument is preceded by "of". +# Example: "sum: over: from,to" +# - 1 arg: "sum of x" +# - 2 args: "sum over i of x" +# - 3 args: "sum from i to n of x" +# If no option matches the argument count, the arguments are separated with "comma". +# - Binary separator (exactly one ":" option, no commas in it): after "of", that word joins the two args. +# Example: "quotient": "function=integer part: divided by" → "integer part of x divided by y" +# If there are not exactly two args, the arguments fall back to "comma". +# - Paired "ratio-style" (" : | : | ..."): used when every "|"-separated +# piece is a single "name : glue" pair. Verbosity selects one pair, whose glue is the binary +# separator described above. Example: "ratio": "function=ratio : to | the ratio : to | the ratio : to" +# +# Conceptual grammar (with precedence): +# +# IntentMappingsEntry ::= ":" # ":" is the YAML key/value separator +# +# ::= ( "||" )* +# +# ::= "=" +# +# ::= "prefix" | "infix" | "postfix" | "function" | "nofix" | "silent" +# +# ::= | +# +# # Standard form: a name/bracketing part, then ":"-separated argument-glue options. +# ::= ( ":" )* +# +# ::= [ ";" ";" ] # 1 part: name; 3 parts: opening; main; closing +# +# ::= [ "|" [ "|" ] ] # terse | medium | verbose +# +# ::= # a single glue word, or ","-separated arity words +# +# # Paired "ratio-style" form: recognized only when every "|" piece is a single "name : glue" pair. +# ::= ( "|" )+ +# +# ::= ":" # the glue contains no ":" +# +# ::= text +# +# Precedence depends on the form: +# - Standard: split on ":" first (name vs. argument-glue options), then split each piece on "|" +# for terse|medium|verbose, and split only the name part on ";" for opening; main; closing. +# - Paired: split on "|" first into "name : glue" pairs, then verbosity selects one pair. +# +# Example: +# "absolute-value": "function= ; absolute value| the absolute value| the absolute value; end absolute value" +# "sum": "function=sum: over: from,to" +# "quotient": "function=integer part: divided by" +# "ratio": "function=ratio : to | the ratio : to | the ratio : to" # verbosity of name:glue pairs +# - IntentMappings: { "indexed-by": "infix= ; subĂ­ndice; final del subĂ­ndice", "modified-variable": "silent= ", "say-super": "infix=superĂ­ndice", # used with 'mo' for superscripts (e.g, "<") "skip-super": "silent=", # used with 'mo' for superscripts (e.g, "*") - "absolute-value": "function= ; valor absoluto: el valor absoluto de: el valor absoluto de; final del valor absoluto", + "absolute-value": "function= ; valor absoluto| el valor absoluto de| el valor absoluto de; final del valor absoluto", "binomial": "infix=binomial; elegir; end binomial", "limit": "prefix=lĂ­mite cuando", - "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: el log base: el log base", + "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| el log base| el log base", "minus": "infix=menos || prefix=negativo", "plus": "infix=mĂĄs || prefix=positivo", "transpose": "postfix=intercambiar || function=intercambiar", - "norm": "function=; regla: regla: la regla; fin de la regla", - "trace": "function=;traza : traza de: la traza de; fin de la traza", - "dimension": "function=; dimensiĂłn : dimensiĂłn de: la dimensiĂłn de; fin de la dimensiĂłn", - "homomorphism": "function= ; homomorfismo : homomorfismo de: el homomorfismo de; find de el homomorfismo", - "kernel": "function= ; nĂșcleo : nĂșcleo de: el nĂșcleo de; fin de el nĂșcleo", + "norm": "function=; regla| regla| la regla; fin de la regla", + "trace": "function=;traza | traza de| la traza de; fin de la traza", + "dimension": "function=; dimensiĂłn | dimensiĂłn de| la dimensiĂłn de; fin de la dimensiĂłn", + "homomorphism": "function= ; homomorfismo | homomorfismo de| el homomorfismo de; find de el homomorfismo", + "kernel": "function= ; nĂșcleo | nĂșcleo de| el nĂșcleo de; fin de el nĂșcleo", "vector": "function= ; vector || prefix=vector", - "cross-product": "infix=cross: cross product: cross product", - "dot-product": "infix=dot: dot product: dot:dot product", + "cross-product": "infix=cross| cross product| cross product", + "dot-product": "infix=dot| dot product| dot|dot product", - "divergence": "function= ; div: divergence: divergence; end divergence", + "divergence": "function= ; div| divergence| divergence; end divergence", "curl": "function= ; curl; end curl", - "gradient": "function= ; grad: gradient: gradient; end gradient", + "gradient": "function= ; grad| gradient| gradient; end gradient", "laplacian": "function=lahplahsian", # speech engines don't do a good job with "laplacian" - "chemistry-concentration": "function= ; concentraciĂłn: concentraciĂłn de: la concentraciĂłn de; fin de la concentraciĂłn", + "chemistry-concentration": "function= ; concentraciĂłn| concentraciĂłn de| la concentraciĂłn de; fin de la concentraciĂłn", } - NavigationParts: { diff --git a/Rules/Languages/fi/definitions.yaml b/Rules/Languages/fi/definitions.yaml index d68062a01..67abe6f23 100644 --- a/Rules/Languages/fi/definitions.yaml +++ b/Rules/Languages/fi/definitions.yaml @@ -6,25 +6,94 @@ # name: [ "...", "..." "..." ], -# 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 only one ":" is used, it 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 -# Intent mappings must specify whether they are "prefix", "infix", "postfix", or "function" with an "=" sign -# If there are multiple fixities (e.g., see transpose), they are separated with "|| -# 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 Syntax: +# +# This section defines how each "intent" is spoken for various grammatical forms (fixities such as "prefix", "infix", "postfix", and "function"), +# along with supporting different verbosity levels. +# The syntax is a little bit complicated, but allows a declarative syntax so you don't have to write as many rules. +# +# For each intent, you specify spoken forms for one or more fixities using the syntax below. +# +# - Each mapping has the form: +# "": "= || = || ...", +# Every alternative must name a fixity and use "="; the fixity requested when speaking selects one. +# +# - Separate multiple fixities with "||". Spaces are allowed around any delimiter for readability. +# - Within a speech string, "|" selects the verbosity form: +# - one "|" (two forms): the first is 'terse', the second is used for 'medium' and 'verbose' +# - two "|" (three forms): 'terse', 'medium', 'verbose', in that order +# - no "|": the same spoken form is used for all verbosity levels +# +# - Use semicolons ";" to divide opening; main; closing bracketing words within the name part, +# where such words make sense (a name with no ";" is just the main phrase). +# - If an intent has multiple fixities but a definition does not specify one, the first fixity listed is chosen by default. +# +# Functions and argument glue (the part after the name): +# - ":" separates the name/bracketing phrase from the argument-glue options that follow it. +# - Arity template (two or more ":" options, or one option with ','-separated glue words): the +# number of glue words implies the arity, and the final argument is preceded by "of". +# Example: "sum: over: from,to" +# - 1 arg: "sum of x" +# - 2 args: "sum over i of x" +# - 3 args: "sum from i to n of x" +# If no option matches the argument count, the arguments are separated with "comma". +# - Binary separator (exactly one ":" option, no commas in it): after "of", that word joins the two args. +# Example: "quotient": "function=integer part: divided by" → "integer part of x divided by y" +# If there are not exactly two args, the arguments fall back to "comma". +# - Paired "ratio-style" (" : | : | ..."): used when every "|"-separated +# piece is a single "name : glue" pair. Verbosity selects one pair, whose glue is the binary +# separator described above. Example: "ratio": "function=ratio : to | the ratio : to | the ratio : to" +# +# Conceptual grammar (with precedence): +# +# IntentMappingsEntry ::= ":" # ":" is the YAML key/value separator +# +# ::= ( "||" )* +# +# ::= "=" +# +# ::= "prefix" | "infix" | "postfix" | "function" | "nofix" | "silent" +# +# ::= | +# +# # Standard form: a name/bracketing part, then ":"-separated argument-glue options. +# ::= ( ":" )* +# +# ::= [ ";" ";" ] # 1 part: name; 3 parts: opening; main; closing +# +# ::= [ "|" [ "|" ] ] # terse | medium | verbose +# +# ::= # a single glue word, or ","-separated arity words +# +# # Paired "ratio-style" form: recognized only when every "|" piece is a single "name : glue" pair. +# ::= ( "|" )+ +# +# ::= ":" # the glue contains no ":" +# +# ::= text +# +# Precedence depends on the form: +# - Standard: split on ":" first (name vs. argument-glue options), then split each piece on "|" +# for terse|medium|verbose, and split only the name part on ";" for opening; main; closing. +# - Paired: split on "|" first into "name : glue" pairs, then verbosity selects one pair. +# +# Example: +# "absolute-value": "function= ; absolute value| the absolute value| the absolute value; end absolute value" +# "sum": "function=sum: over: from,to" +# "quotient": "function=integer part: divided by" +# "ratio": "function=ratio : to | the ratio : to | the ratio : to" # verbosity of name:glue pairs +# - IntentMappings: { "indexed-by": "infix= ; ala; loppu ala", "modified-variable": "silent= ", - "say-super": "infix=ylĂ€: ylĂ€indeksi: ylĂ€indeksi", # used with 'mo' for superscripts (e.g, "<") + "say-super": "infix=ylĂ€| ylĂ€indeksi| ylĂ€indeksi", # used with 'mo' for superscripts (e.g, "<") "skip-super": "silent=", # used with 'mo' for superscripts (e.g, "*") "absolute-value": "function= ; itseisarvo; loppu itseisarvo", "binomial": "infix=binomi; yli; loppu binomi", - "limit": "prefix=raja-arvo: raja-arvo kun: raja-arvo kun", - "lim-sup": "prefix=supremum: supremum: supremum", - "lim-inf": "prefix=infimum: infimum : infimum", + "limit": "prefix=raja-arvo| raja-arvo kun| raja-arvo kun", + "lim-sup": "prefix=supremum| supremum| supremum", + "lim-inf": "prefix=infimum| infimum | infimum", "logarithm-with-base": "prefix=log kanta", "minus": "infix=miinus || prefix=negatiivinen", "plus": "infix=plus || prefix=positiivinen", @@ -36,12 +105,12 @@ "homomorphism": "function= ; homomorfismi; loppu homomorfismi", "kernel": "function= ; ydin; loppu ydin", "vector": "function= ; vektori || prefix=vektori", - "cross-product": "infix=risti: ristitulo: ristitulo", - "dot-product": "infix=piste: pistetulo: piste:pistetulo", + "cross-product": "infix=risti| ristitulo| ristitulo", + "dot-product": "infix=piste| pistetulo| piste|pistetulo", - "divergence": "function= ; div: divergenssi: divergenssi; loppu divergenssi", + "divergence": "function= ; div| divergenssi| divergenssi; loppu divergenssi", "curl": "function= ; roottori; loppu roottori", - "gradient": "function= ; grad: gradientti: gradientti; loppu gradientti", + "gradient": "function= ; grad| gradientti| gradientti; loppu gradientti", "laplacian": "function=laplasen", # speech engines don't do a good job with "laplacian" } diff --git a/Rules/Languages/fr/definitions.yaml b/Rules/Languages/fr/definitions.yaml index c2e822d5b..9e49cc01f 100644 --- a/Rules/Languages/fr/definitions.yaml +++ b/Rules/Languages/fr/definitions.yaml @@ -4,52 +4,120 @@ # French overrides for language-dependent speech definitions. Anything omitted # here continues to fall back to the shared English defaults. -# 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 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 -# Intent mappings must specify whether they are "prefix", "infix", "postfix", or "function" with an "=" sign -# If there are multiple fixities (e.g., see transpose), they are separated with "||" -# 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 Syntax: +# +# This section defines how each "intent" is spoken for various grammatical forms (fixities such as "prefix", "infix", "postfix", and "function"), +# along with supporting different verbosity levels. +# The syntax is a little bit complicated, but allows a declarative syntax so you don't have to write as many rules. +# +# For each intent, you specify spoken forms for one or more fixities using the syntax below. +# +# - Each mapping has the form: +# "": "= || = || ...", +# Every alternative must name a fixity and use "="; the fixity requested when speaking selects one. +# +# - Separate multiple fixities with "||". Spaces are allowed around any delimiter for readability. +# - Within a speech string, "|" selects the verbosity form: +# - one "|" (two forms): the first is 'terse', the second is used for 'medium' and 'verbose' +# - two "|" (three forms): 'terse', 'medium', 'verbose', in that order +# - no "|": the same spoken form is used for all verbosity levels +# +# - Use semicolons ";" to divide opening; main; closing bracketing words within the name part, +# where such words make sense (a name with no ";" is just the main phrase). +# - If an intent has multiple fixities but a definition does not specify one, the first fixity listed is chosen by default. +# +# Functions and argument glue (the part after the name): +# - ":" separates the name/bracketing phrase from the argument-glue options that follow it. +# - Arity template (two or more ":" options, or one option with ','-separated glue words): the +# number of glue words implies the arity, and the final argument is preceded by "of". +# Example: "sum: over: from,to" +# - 1 arg: "sum of x" +# - 2 args: "sum over i of x" +# - 3 args: "sum from i to n of x" +# If no option matches the argument count, the arguments are separated with "comma". +# - Binary separator (exactly one ":" option, no commas in it): after "of", that word joins the two args. +# Example: "quotient": "function=integer part: divided by" → "integer part of x divided by y" +# If there are not exactly two args, the arguments fall back to "comma". +# - Paired "ratio-style" (" : | : | ..."): used when every "|"-separated +# piece is a single "name : glue" pair. Verbosity selects one pair, whose glue is the binary +# separator described above. Example: "ratio": "function=ratio : to | the ratio : to | the ratio : to" +# +# Conceptual grammar (with precedence): +# +# IntentMappingsEntry ::= ":" # ":" is the YAML key/value separator +# +# ::= ( "||" )* +# +# ::= "=" +# +# ::= "prefix" | "infix" | "postfix" | "function" | "nofix" | "silent" +# +# ::= | +# +# # Standard form: a name/bracketing part, then ":"-separated argument-glue options. +# ::= ( ":" )* +# +# ::= [ ";" ";" ] # 1 part: name; 3 parts: opening; main; closing +# +# ::= [ "|" [ "|" ] ] # terse | medium | verbose +# +# ::= # a single glue word, or ","-separated arity words +# +# # Paired "ratio-style" form: recognized only when every "|" piece is a single "name : glue" pair. +# ::= ( "|" )+ +# +# ::= ":" # the glue contains no ":" +# +# ::= text +# +# Precedence depends on the form: +# - Standard: split on ":" first (name vs. argument-glue options), then split each piece on "|" +# for terse|medium|verbose, and split only the name part on ";" for opening; main; closing. +# - Paired: split on "|" first into "name : glue" pairs, then verbosity selects one pair. +# +# Example: +# "absolute-value": "function= ; absolute value| the absolute value| the absolute value; end absolute value" +# "sum": "function=sum: over: from,to" +# "quotient": "function=integer part: divided by" +# "ratio": "function=ratio : to | the ratio : to | the ratio : to" # verbosity of name:glue pairs +# - IntentMappings: { - "indexed-by": "infix= ; indice; fin d'indice: fin d'indice: fin d'indice", + "indexed-by": "infix= ; indice; fin d'indice| fin d'indice| fin d'indice", "modified-variable": "silent= ", - "say-super": "infix=super: exposant: exposant", + "say-super": "infix=super| exposant| exposant", "skip-super": "silent=", - "absolute-value": "function= ; valeur absolue: la valeur absolue: la valeur absolue; fin de valeur absolue", + "absolute-value": "function= ; valeur absolue| la valeur absolue| la valeur absolue; fin de valeur absolue", "binomial": "infix=binĂŽme; parmi; fin du binĂŽme", "dimension-product": "infix=par", - "greatest-common-divisor": "function=pgcd: le pgcd: le plus grand commun diviseur", - "imaginary-part": "function=partie imaginaire: la partie imaginaire: la partie imaginaire", - "least-common-multiple": "function=ppcm: le ppcm: le plus petit commun multiple", - "limit": "prefix=limite quand: la limite quand: la limite quand", - "lim-sup": "prefix=lim sup quand: la limite supĂ©rieure quand: la limite supĂ©rieure quand", - "lim-inf": "prefix=lim inf quand: la limite infĂ©rieure quand: la limite infĂ©rieure quand", - "logarithm-with-base": "prefix=log en base: le log en base: le log en base", - "natural-logarithm": "function=l n: logarithme naturel: logarithme naturel", + "greatest-common-divisor": "function=pgcd| le pgcd| le plus grand commun diviseur", + "imaginary-part": "function=partie imaginaire| la partie imaginaire| la partie imaginaire", + "least-common-multiple": "function=ppcm| le ppcm| le plus petit commun multiple", + "limit": "prefix=limite quand| la limite quand| la limite quand", + "lim-sup": "prefix=lim sup quand| la limite supĂ©rieure quand| la limite supĂ©rieure quand", + "lim-inf": "prefix=lim inf quand| la limite infĂ©rieure quand| la limite infĂ©rieure quand", + "logarithm-with-base": "prefix=log en base| le log en base| le log en base", + "natural-logarithm": "function=l n| logarithme naturel| logarithme naturel", "minus": "infix=moins || prefix=moins", "plus": "infix=plus || prefix=positif", "real-part": "function=la partie rĂ©elle", "transpose": "postfix=transposĂ©e || function=transposĂ©e", - "norm": "function= ; norme: norme: la norme de; fin de norme", - "trace": "function= ; trace : trace: la trace de; fin de trace", - "dimension": "function= ; dimension : dimension: la dimension de; fin de dimension", - "homomorphism": "function= ; homomorphisme : homomorphisme: l'homomorphisme de; fin de l'homomorphisme", - "kernel": "function= ; noyau : noyau: le noyau de; fin du noyau", + "norm": "function= ; norme| norme| la norme de; fin de norme", + "trace": "function= ; trace | trace| la trace de; fin de trace", + "dimension": "function= ; dimension | dimension| la dimension de; fin de dimension", + "homomorphism": "function= ; homomorphisme | homomorphisme| l'homomorphisme de; fin de l'homomorphisme", + "kernel": "function= ; noyau | noyau| le noyau de; fin du noyau", "vector": "function= ; vecteur || prefix=vecteur", - "cross-product": "infix=croix: produit vectoriel: produit vectoriel", - "dot-product": "infix=point: produit scalaire: point: produit scalaire", + "cross-product": "infix=croix| produit vectoriel| produit vectoriel", + "dot-product": "infix=point| produit scalaire| point| produit scalaire", - "divergence": "function= ; div: divergence: divergence; fin de divergence", - "curl": "function= ; rotationnel: rotationnel: rotationnel; fin du rotationnel", - "gradient": "function= ; grad: gradient: gradient; fin de gradient", + "divergence": "function= ; div| divergence| divergence; fin de divergence", + "curl": "function= ; rotationnel| rotationnel| rotationnel; fin du rotationnel", + "gradient": "function= ; grad| gradient| gradient; fin de gradient", "laplacian": "function=laplacien", - "chemistry-concentration": "function= ; concentration: concentration de: la concentration de; fin de concentration", + "chemistry-concentration": "function= ; concentration| concentration de| la concentration de; fin de concentration", } # Names of functions that in terse mode don't say "of" (or it's equivalent in other languages) diff --git a/Rules/Languages/hu/definitions.yaml b/Rules/Languages/hu/definitions.yaml index d66738ec4..f070f72fc 100644 --- a/Rules/Languages/hu/definitions.yaml +++ b/Rules/Languages/hu/definitions.yaml @@ -11,67 +11,79 @@ # # - Each mapping has the form: # "": "= || = || ...", -# or just -# "": "", -# where is used for all forms if fixity and '=' are omitted. +# Every alternative must name a fixity and use "="; the fixity requested when speaking selects one. # -# - If an intent has multiple fixities, separate them with "||". Spaces are allowed around delimiters for readability. -# - If only one ":" is present in **, it provides the 'terse' form, and the following string is used for both 'medium' and 'verbose'. -# - If more than one ":" is present, the string is split into 'terse', 'medium', and 'verbose' forms, in that order (each separated by ":"). -# - If no ":" is present, the same spoken form is used for all styles. +# - Separate multiple fixities with "||". Spaces are allowed around any delimiter for readability. +# - Within a speech string, "|" selects the verbosity form: +# - one "|" (two forms): the first is 'terse', the second is used for 'medium' and 'verbose' +# - two "|" (three forms): 'terse', 'medium', 'verbose', in that order +# - no "|": the same spoken form is used for all verbosity levels # -# - Use semicolons ";" to divide opening, main, and closing bracketing words within a speech string, where such words make sense. +# - Use semicolons ";" to divide opening; main; closing bracketing words within the name part, +# where such words make sense (a name with no ";" is just the main phrase). # - If an intent has multiple fixities but a definition does not specify one, the first fixity listed is chosen by default. # -# Functions and argument glue: -# - The "|" character delimits options describing how to glue arguments together when speaking function arguments. -# - Arity templates (multiple "|" options, or one option with ','-separated glue words): glue-word count -# implies arity; the final argument is preceded by "of". Example: "sum | over | from,to" +# Functions and argument glue (the part after the name): +# - ":" separates the name/bracketing phrase from the argument-glue options that follow it. +# - Arity template (two or more ":" options, or one option with ','-separated glue words): the +# number of glue words implies the arity, and the final argument is preceded by "of". +# Example: "sum: over: from,to" # - 1 arg: "sum of x" # - 2 args: "sum over i of x" # - 3 args: "sum from i to n of x" -# If no option matches the argument count, separators fall back to "comma". -# - Binary separator (exactly one "|" option, no commas in it): after "of", that word joins the two args. -# Example: "quotient": "function=integer part | divided by" → "integer part of x divided by y" -# If there are not exactly two args, separators fall back to "comma" (no real n-ary use of these words). +# If no option matches the argument count, the arguments are separated with "comma". +# - Binary separator (exactly one ":" option, no commas in it): after "of", that word joins the two args. +# Example: "quotient": "function=integer part: divided by" → "integer part of x divided by y" +# If there are not exactly two args, the arguments fall back to "comma". +# - Paired "ratio-style" (" : | : | ..."): used when every "|"-separated +# piece is a single "name : glue" pair. Verbosity selects one pair, whose glue is the binary +# separator described above. Example: "ratio": "function=ratio : to | the ratio : to | the ratio : to" # -# BNF-like description: +# Conceptual grammar (with precedence): # -# IntentMappingsEntry ::= ":" +# IntentMappingsEntry ::= ":" # ":" is the YAML key/value separator # # ::= ( "||" )* -# | # -# ::= "=" +# ::= "=" # # ::= "prefix" | "infix" | "postfix" | "function" | "nofix" | "silent" # -# ::= -# | "|" ( "|" )* +# ::= | # -# ::= text -# # May use ":" to separate terse:medium:verbose forms. -# # May use ";" for bracketing (opening; main; closing). +# # Standard form: a name/bracketing part, then ":"-separated argument-glue options. +# ::= ( ":" )* # -# ::= text -# # One option, no commas: binary separator after "of" (e.g. "divided by"). -# # One option with "," or several "|" options: arity templates -# # (glue-word count = arg_count - 1; last arg preceded by "of"). -# # Unmatched arity (or binary glue with ≠2 args): fall back to "comma". +# ::= [ ";" ";" ] # 1 part: name; 3 parts: opening; main; closing # -# ::= (applies to all fixities) +# ::= [ "|" [ "|" ] ] # terse | medium | verbose +# +# ::= # a single glue word, or ","-separated arity words +# +# # Paired "ratio-style" form: recognized only when every "|" piece is a single "name : glue" pair. +# ::= ( "|" )+ +# +# ::= ":" # the glue contains no ":" +# +# ::= text +# +# Precedence depends on the form: +# - Standard: split on ":" first (name vs. argument-glue options), then split each piece on "|" +# for terse|medium|verbose, and split only the name part on ";" for opening; main; closing. +# - Paired: split on "|" first into "name : glue" pairs, then verbosity selects one pair. # # Example: -# "absolute-value": "function= ; absolute value: the absolute value: the absolute value; end absolute value" -# "sum": "function=sum | over | from,to" -# "quotient": "function=integer part | divided by" +# "absolute-value": "function= ; absolute value| the absolute value| the absolute value; end absolute value" +# "sum": "function=sum: over: from,to" +# "quotient": "function=integer part: divided by" +# "ratio": "function=ratio : to | the ratio : to | the ratio : to" # verbosity of name:glue pairs # - IntentMappings: { - "indexed-by": "infix= alsĂł index kezdete; alsĂł index; alsĂł index vĂ©ge: alsĂł index vĂ©ge: alsĂł index vĂ©ge", - "say-super": "infix=felsƑ index: felsƑ index: felsƑ index", # used with 'mo' for superscripts (e.g, "<") + "indexed-by": "infix= alsĂł index kezdete; alsĂł index; alsĂł index vĂ©ge| alsĂł index vĂ©ge| alsĂł index vĂ©ge", + "say-super": "infix=felsƑ index| felsƑ index| felsƑ index", # used with 'mo' for superscripts (e.g, "<") "skip-super": "silent=", # used with 'mo' for superscripts (e.g, "*") - "absolute-value": "function= ; abszolĂșt Ă©rtĂ©k: az abszolĂșt Ă©rtĂ©k: az abszolĂșt Ă©rtĂ©k; abszolĂșt Ă©rtĂ©k vĂ©ge", + "absolute-value": "function= ; abszolĂșt Ă©rtĂ©k| az abszolĂșt Ă©rtĂ©k| az abszolĂșt Ă©rtĂ©k; abszolĂșt Ă©rtĂ©k vĂ©ge", "binomial": "infix=binomiĂĄlis kezdete; a; binomiĂĄlis vĂ©ge", "dimension-product": "infix=by", ### Functions and Inverses @@ -87,15 +99,15 @@ #"fraction":"function=fraction; over; end fraction", # NOTE: Fails "mixed-fraction":"infix=Ă©s", # NOTE: in website says function, but follow infix speech pattern. "greatest-common-divisor": "function=a legnagyobb közös osztĂł", - "quotient":"function=egĂ©sz rĂ©sz | osztva", # NOTE: Logic somewhere here failing, becomes "divided by of x comma, y" instead of "integer part of x divided by y" + "quotient":"function=egĂ©sz rĂ©sz : osztva", # NOTE: Logic somewhere here failing, becomes "divided by of x comma, y" instead of "integer part of x divided by y" "evaluated-at":"infix=Ă©rtĂ©kelve || postfix=Ă©rtĂ©kkĂ©nt", - "remainder":"function=a maradĂ©k | osztva", + "remainder":"function=a maradĂ©k : osztva", "max":"function=max", "min":"function=min", "power":"infix=a hatvĂĄnyra", "root":"function=root", - "imaginary-part": "function=a kĂ©pzeletbeli rĂ©sz: a kĂ©pzeletbeli rĂ©sz: a kĂ©pzeletbeli rĂ©sz", - "least-common-multiple": "function=lcm: a legkisebb közös többszörös: a legkisebb közös többszörös", + "imaginary-part": "function=a kĂ©pzeletbeli rĂ©sz| a kĂ©pzeletbeli rĂ©sz| a kĂ©pzeletbeli rĂ©sz", + "least-common-multiple": "function=lcm| a legkisebb közös többszörös| a legkisebb közös többszörös", "complex-conjugate":"function=Komplex konjugĂĄlt", "complex-arg":"function=argumentum", "polar-coordinate":"function=polĂĄris koordinĂĄta", @@ -107,47 +119,47 @@ "round":"function=kerekĂ­tett Ă©rtĂ©k", "fractional-part":"function=tört rĂ©sz", # "large-op": "infix=over || other=from,to", - "limit": "prefix=hatĂĄrĂ©rtĂ©k: hatĂĄrĂ©rtĂ©k: hatĂĄrĂ©rtĂ©k", - "lim-sup": "prefix=lim-sup: a hatĂĄrĂ©rtĂ©k, amely nagyobb, mint: a hatĂĄrĂ©rtĂ©k, amely nagyobb, mint", - "lim-inf": "prefix=lim inf mint: az alsĂł hatĂĄrĂ©rtĂ©k, mint: a hatĂĄrĂ©rtĂ©k alsĂł hatĂĄrĂ©rtĂ©ke, mint", - "logarithm-with-base": "prefix=alap logaritmus: alap logaritmus: alap logaritmus", + "limit": "prefix=hatĂĄrĂ©rtĂ©k| hatĂĄrĂ©rtĂ©k| hatĂĄrĂ©rtĂ©k", + "lim-sup": "prefix=lim-sup| a hatĂĄrĂ©rtĂ©k, amely nagyobb, mint| a hatĂĄrĂ©rtĂ©k, amely nagyobb, mint", + "lim-inf": "prefix=lim inf mint| az alsĂł hatĂĄrĂ©rtĂ©k, mint| a hatĂĄrĂ©rtĂ©k alsĂł hatĂĄrĂ©rtĂ©ke, mint", + "logarithm-with-base": "prefix=alap logaritmus| alap logaritmus| alap logaritmus", # "pochhammer": "infix=permutations of", # arguments are in reverse order, so can't work here "real-part": "function=az igazi rĂ©sz", - "trace": "function= ; nyom : nyom: a nyom; nyom vĂ©ge", - "dimension": "function=; dimenziĂł : dimenziĂł: a dimenziĂł; dimenziĂł vĂ©ge", - "homomorphism": "function= ; homomorfizmus : homomorfizmus: a homomorfizmus; homomorfizmus vĂ©ge", - "kernel": "function= ; kernel : kernel: a kernel; kernel vĂ©ge", + "trace": "function= ; nyom | nyom| a nyom; nyom vĂ©ge", + "dimension": "function=; dimenziĂł | dimenziĂł| a dimenziĂł; dimenziĂł vĂ©ge", + "homomorphism": "function= ; homomorfizmus | homomorfizmus| a homomorfizmus; homomorfizmus vĂ©ge", + "kernel": "function= ; kernel | kernel| a kernel; kernel vĂ©ge", "dot-product": "infix=skalĂĄris szorzat", #"divergence": "function= ; dihv: divergencia: divergencia; divergencia vĂ©ge", #"laplacian": "function=laplaciĂĄns", # speech engines don't do a good job with "laplacian" - "chemistry-concentration": "function= ; koncentrĂĄciĂł: koncentrĂĄciĂłja ennek: a koncentrĂĄciĂłja; koncentrĂĄciĂł vĂ©ge", + "chemistry-concentration": "function= ; koncentrĂĄciĂł| koncentrĂĄciĂłja ennek| a koncentrĂĄciĂłja; koncentrĂĄciĂł vĂ©ge", ### Calculus - "definite-integral":"function=integrĂĄl felett || function=integrĂĄl innen:; ide:", # Property ??? - "derivative":"function=a derivĂĄltja; mely erre vonatkozik:", # Property ??? + "definite-integral":"function=integrĂĄl felett || function=integrĂĄl innen|; ide|", # Property ??? + "derivative":"function=a derivĂĄltja; mely erre vonatkozik|", # Property ??? "tends-to":"infix=ehhez tart", "tends-to-from-above":"infix=ĂĄltalĂĄban alulrĂłl indul", "tends-to-from-below":"infix=alulrĂłl indul", ### Sets - "set": "function= ; halmaz: a halmaz", - "set-difference":"function=kĂŒlönbsĂ©ghalmaz | Ă©s || infix=mĂ­nusz", + "set": "function= ; halmaz| a halmaz", + "set-difference":"function=kĂŒlönbsĂ©ghalmaz : Ă©s || infix=mĂ­nusz", "complement":"function=komplemens", "empty-set":"nofix=ĂŒres halmaz", "cardinality":"function=szĂĄmossĂĄg", # NOTE: does not have a defined speech template in website "list":"function=lista", - "tuple": "function= ; tuple: a tuple", + "tuple": "function= ; tuple| a tuple", ### Sequence and Series "sum": "function=összeg", "product":"function=szorzat", ### Elementary classical functions - "sine":"function=szinusz: szinusz", - "cosine":"function=koszinusz: koszinusz", - "tangent":"function=tangens: tangens", - "secant":"function=szekĂĄns: szekĂĄns", - "cosecant":"function=koszekĂĄns: koszekĂĄns", - "cotangent":"function=kotangens: kotangens", + "sine":"function=szinusz| szinusz", + "cosine":"function=koszinusz| koszinusz", + "tangent":"function=tangens| tangens", + "secant":"function=szekĂĄns| szekĂĄns", + "cosecant":"function=koszekĂĄns| koszekĂĄns", + "cotangent":"function=kotangens| kotangens", "arcsine":"function=arkusz szinusz", "arccosine":"function=arkusz koszinusz", "arctangent":"function=arkusz tangens", @@ -167,7 +179,7 @@ "arc-hyperbolic-cosecant":"function=arkusz hiperbolikus koszekĂĄns", "arc-hyperbolic-cotangent":"function=arkusz hiperbolikus kotangens", "exponential":"function=exponenciĂĄlis", - "natural-logarithm": "function=l n: termĂ©szetes alapĂș logaritmus: termĂ©szetes alapĂș logaritmus", + "natural-logarithm": "function=l n| termĂ©szetes alapĂș logaritmus| termĂ©szetes alapĂș logaritmus", "logarithm":"function=logaritmus", ##Check arity 2 ### Statistics and Probability "mean":"function=jelentĂ©se", @@ -184,7 +196,7 @@ "determinant":"function=determinĂĄns", "adjugate":"function=adjugĂĄlt", "magnitude":"function=nagysĂĄgrend", - "norm": "function=; normalizĂĄlĂĄs: normalizĂĄlĂĄs: normalizĂĄlĂĄs; normalizĂĄlĂĄs vĂ©ge", + "norm": "function=; normalizĂĄlĂĄs| normalizĂĄlĂĄs| normalizĂĄlĂĄs; normalizĂĄlĂĄs vĂ©ge", "span":"function=fesztĂĄvolsĂĄg", "unit-vector":"prefix=egysĂ©gvektor", @@ -195,12 +207,12 @@ ### Constants and Sets - "set-of-integers":"nofix=â„€: az összes egĂ©sz szĂĄm halmaza", - "set-of-reals":"nofix=valĂłs szĂĄmok halmaza: az összes valĂłs szĂĄm halmaza", - "set-of-rationals":"nofix=ℚ: az összes racionĂĄlis szĂĄm halmaza", - "set-of-natural-numbers":"nofix=ℕ: az összes termĂ©szetes szĂĄm halmaza", - "set-of-complex-numbers":"nofix=ℂ: az összes komplex szĂĄm halmaza", - "set-of-primes":"nofix=ℙ: az összes prĂ­mszĂĄm halmaza", + "set-of-integers":"nofix=â„€| az összes egĂ©sz szĂĄm halmaza", + "set-of-reals":"nofix=valĂłs szĂĄmok halmaza| az összes valĂłs szĂĄm halmaza", + "set-of-rationals":"nofix=ℚ| az összes racionĂĄlis szĂĄm halmaza", + "set-of-natural-numbers":"nofix=ℕ| az összes termĂ©szetes szĂĄm halmaza", + "set-of-complex-numbers":"nofix=ℂ| az összes komplex szĂĄm halmaza", + "set-of-primes":"nofix=ℙ| az összes prĂ­mszĂĄm halmaza", ### Geometry @@ -221,7 +233,7 @@ ### General Concepts "fenced-group":"function=bekerĂ­tett csoport", # 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=a pĂĄr | Ă©s", # Needs to be tested, test converts "and" to "comma," + "ordered-pair": "function=a pĂĄr : Ă©s", # Needs to be tested, test converts "and" to "comma," "highlight":"postfix=kiemelt", "least-common-denominator":"function=legkisebb közös nevezƑ", "rate":"infix=per", @@ -236,8 +248,8 @@ ### Other ## Default fixity function "curl": "function=rotĂĄciĂł", - "divergence": "function=eltĂ©rĂ©s:eltĂ©rĂ©s", - "gradient": "function=gradiens:gradiens", + "divergence": "function=eltĂ©rĂ©s|eltĂ©rĂ©s", + "gradient": "function=gradiens|gradiens", "laplacian": "function=laplaciĂĄnus", ## Default fixity prefix @@ -262,7 +274,7 @@ "congruent": "infix=egybeesik", "cartesian-product": "infix=derĂ©kszögƱ szorzat", "composed-with": "infix=komponĂĄlva", - "cross-product": "infix=kereszt szorzata: kereszt szorzata: kereszt szorzata", + "cross-product": "infix=kereszt szorzata| kereszt szorzata| kereszt szorzata", "defined-as": "infix=definiĂĄlva", "divided-by": "infix=osztva", "divides": "infix=osztja", @@ -325,11 +337,11 @@ "percent": "postfix=szĂĄzalĂ©k", ## Default fixity nofix - "diameter":"nofix=ĂĄtmĂ©rƑ: ĂĄtmĂ©rƑ", - "distance":"nofix=tĂĄvolsĂĄg; tĂĄvolsĂĄg: tĂĄvolsĂĄg", - "probability":"nofix=P: valĂłszĂ­nƱsĂ©g || function=valĂłszĂ­nƱsĂ©g", - "radius":"nofix=r: sugĂĄr", - "volume":"nofix=hangerƑ: hangerƑ || function=hangerƑ", + "diameter":"nofix=ĂĄtmĂ©rƑ| ĂĄtmĂ©rƑ", + "distance":"nofix=tĂĄvolsĂĄg; tĂĄvolsĂĄg| tĂĄvolsĂĄg", + "probability":"nofix=P| valĂłszĂ­nƱsĂ©g || function=valĂłszĂ­nƱsĂ©g", + "radius":"nofix=r| sugĂĄr", + "volume":"nofix=hangerƑ| hangerƑ || function=hangerƑ", "exponential-e":"nofix=e", "imaginary-i":"nofix=kĂ©pzeletbeli Ă©n", "differential-d":"nofix=d", diff --git a/Rules/Languages/id/definitions.yaml b/Rules/Languages/id/definitions.yaml index 6f063cfd8..2051a5488 100644 --- a/Rules/Languages/id/definitions.yaml +++ b/Rules/Languages/id/definitions.yaml @@ -2,39 +2,108 @@ - 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 only one ":" is used, it 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 -# Intent mappings must specify whether they are "prefix", "infix", "postfix", or "function" with an "=" sign -# If there are multiple fixities (e.g., see transpose), they are separated with "|| -# 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 Syntax: +# +# This section defines how each "intent" is spoken for various grammatical forms (fixities such as "prefix", "infix", "postfix", and "function"), +# along with supporting different verbosity levels. +# The syntax is a little bit complicated, but allows a declarative syntax so you don't have to write as many rules. +# +# For each intent, you specify spoken forms for one or more fixities using the syntax below. +# +# - Each mapping has the form: +# "": "= || = || ...", +# Every alternative must name a fixity and use "="; the fixity requested when speaking selects one. +# +# - Separate multiple fixities with "||". Spaces are allowed around any delimiter for readability. +# - Within a speech string, "|" selects the verbosity form: +# - one "|" (two forms): the first is 'terse', the second is used for 'medium' and 'verbose' +# - two "|" (three forms): 'terse', 'medium', 'verbose', in that order +# - no "|": the same spoken form is used for all verbosity levels +# +# - Use semicolons ";" to divide opening; main; closing bracketing words within the name part, +# where such words make sense (a name with no ";" is just the main phrase). +# - If an intent has multiple fixities but a definition does not specify one, the first fixity listed is chosen by default. +# +# Functions and argument glue (the part after the name): +# - ":" separates the name/bracketing phrase from the argument-glue options that follow it. +# - Arity template (two or more ":" options, or one option with ','-separated glue words): the +# number of glue words implies the arity, and the final argument is preceded by "of". +# Example: "sum: over: from,to" +# - 1 arg: "sum of x" +# - 2 args: "sum over i of x" +# - 3 args: "sum from i to n of x" +# If no option matches the argument count, the arguments are separated with "comma". +# - Binary separator (exactly one ":" option, no commas in it): after "of", that word joins the two args. +# Example: "quotient": "function=integer part: divided by" → "integer part of x divided by y" +# If there are not exactly two args, the arguments fall back to "comma". +# - Paired "ratio-style" (" : | : | ..."): used when every "|"-separated +# piece is a single "name : glue" pair. Verbosity selects one pair, whose glue is the binary +# separator described above. Example: "ratio": "function=ratio : to | the ratio : to | the ratio : to" +# +# Conceptual grammar (with precedence): +# +# IntentMappingsEntry ::= ":" # ":" is the YAML key/value separator +# +# ::= ( "||" )* +# +# ::= "=" +# +# ::= "prefix" | "infix" | "postfix" | "function" | "nofix" | "silent" +# +# ::= | +# +# # Standard form: a name/bracketing part, then ":"-separated argument-glue options. +# ::= ( ":" )* +# +# ::= [ ";" ";" ] # 1 part: name; 3 parts: opening; main; closing +# +# ::= [ "|" [ "|" ] ] # terse | medium | verbose +# +# ::= # a single glue word, or ","-separated arity words +# +# # Paired "ratio-style" form: recognized only when every "|" piece is a single "name : glue" pair. +# ::= ( "|" )+ +# +# ::= ":" # the glue contains no ":" +# +# ::= text +# +# Precedence depends on the form: +# - Standard: split on ":" first (name vs. argument-glue options), then split each piece on "|" +# for terse|medium|verbose, and split only the name part on ";" for opening; main; closing. +# - Paired: split on "|" first into "name : glue" pairs, then verbosity selects one pair. +# +# Example: +# "absolute-value": "function= ; absolute value| the absolute value| the absolute value; end absolute value" +# "sum": "function=sum: over: from,to" +# "quotient": "function=integer part: divided by" +# "ratio": "function=ratio : to | the ratio : to | the ratio : to" # verbosity of name:glue pairs +# - IntentMappings: { "indexed-by": "infix= ; indeks; akhir indeks", - "absolute-value": "function= ; nilai mutlak: nilai mutlak dari: nilai mutlak dari; akhir nilai mutlak", + "absolute-value": "function= ; nilai mutlak| nilai mutlak dari| nilai mutlak dari; akhir nilai mutlak", "binomial": "infix=binomial; memilih; end binomial", "dimension-product": "infix=kali", - "limit": "prefix=raja-arvo: raja-arvo kun: raja-arvo kun", - "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", + "limit": "prefix=raja-arvo| raja-arvo kun| raja-arvo kun", + "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", "minus": "infix=kurang || prefix=negatif", "plus": "infix=tambah || prefix=positif", "transpose": "postfix=transpose || function=transpose", - "norm": "function=; norma: norma: norma dari; end norm", - "trace": "function=;jejak : jejak: jejak dari; end trace", - "dimension": "function=; dimensi : dimensi: dimensi dari; end dimension", - "homomorphism": "function= ; homomorfisme : homomorfisme: homomorfisme dari; end homomorphism", - "kernel": "function= ; kernel : kernel: kernel dari; end kernel", + "norm": "function=; norma| norma| norma dari; end norm", + "trace": "function=;jejak | jejak| jejak dari; end trace", + "dimension": "function=; dimensi | dimensi| dimensi dari; end dimension", + "homomorphism": "function= ; homomorfisme | homomorfisme| homomorfisme dari; end homomorphism", + "kernel": "function= ; kernel | kernel| kernel dari; end kernel", "vector": "function= ; vector || prefix=vector", - "cross-product": "infix=cross: cross product: cross product", - "dot-product": "infix=dot: dot product: dot:dot product", + "cross-product": "infix=cross| cross product| cross product", + "dot-product": "infix=dot| dot product| dot|dot product", - "divergence": "function= ; div: divergence: divergence; end divergence", + "divergence": "function= ; div| divergence| divergence; end divergence", "curl": "function= ; curl; end curl", - "gradient": "function= ; grad: gradient: gradient; end gradient", + "gradient": "function= ; grad| gradient| gradient; end gradient", "laplacian": "function=lahplahsian", # speech engines don't do a good job with "laplacian" } diff --git a/Rules/Languages/nb/definitions.yaml b/Rules/Languages/nb/definitions.yaml index 08a5520f4..e0bc7dda4 100644 --- a/Rules/Languages/nb/definitions.yaml +++ b/Rules/Languages/nb/definitions.yaml @@ -4,18 +4,87 @@ # Each definition in this file is of the form # name: [ "...", "..." "..." ], -# 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 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 -# Intent mappings must specify whether they are "prefix", "infix", "postfix", or "function" with an "=" sign -# If there are multiple fixities (e.g., see transpose), they are separated with "||" -# 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 Syntax: +# +# This section defines how each "intent" is spoken for various grammatical forms (fixities such as "prefix", "infix", "postfix", and "function"), +# along with supporting different verbosity levels. +# The syntax is a little bit complicated, but allows a declarative syntax so you don't have to write as many rules. +# +# For each intent, you specify spoken forms for one or more fixities using the syntax below. +# +# - Each mapping has the form: +# "": "= || = || ...", +# Every alternative must name a fixity and use "="; the fixity requested when speaking selects one. +# +# - Separate multiple fixities with "||". Spaces are allowed around any delimiter for readability. +# - Within a speech string, "|" selects the verbosity form: +# - one "|" (two forms): the first is 'terse', the second is used for 'medium' and 'verbose' +# - two "|" (three forms): 'terse', 'medium', 'verbose', in that order +# - no "|": the same spoken form is used for all verbosity levels +# +# - Use semicolons ";" to divide opening; main; closing bracketing words within the name part, +# where such words make sense (a name with no ";" is just the main phrase). +# - If an intent has multiple fixities but a definition does not specify one, the first fixity listed is chosen by default. +# +# Functions and argument glue (the part after the name): +# - ":" separates the name/bracketing phrase from the argument-glue options that follow it. +# - Arity template (two or more ":" options, or one option with ','-separated glue words): the +# number of glue words implies the arity, and the final argument is preceded by "of". +# Example: "sum: over: from,to" +# - 1 arg: "sum of x" +# - 2 args: "sum over i of x" +# - 3 args: "sum from i to n of x" +# If no option matches the argument count, the arguments are separated with "comma". +# - Binary separator (exactly one ":" option, no commas in it): after "of", that word joins the two args. +# Example: "quotient": "function=integer part: divided by" → "integer part of x divided by y" +# If there are not exactly two args, the arguments fall back to "comma". +# - Paired "ratio-style" (" : | : | ..."): used when every "|"-separated +# piece is a single "name : glue" pair. Verbosity selects one pair, whose glue is the binary +# separator described above. Example: "ratio": "function=ratio : to | the ratio : to | the ratio : to" +# +# Conceptual grammar (with precedence): +# +# IntentMappingsEntry ::= ":" # ":" is the YAML key/value separator +# +# ::= ( "||" )* +# +# ::= "=" +# +# ::= "prefix" | "infix" | "postfix" | "function" | "nofix" | "silent" +# +# ::= | +# +# # Standard form: a name/bracketing part, then ":"-separated argument-glue options. +# ::= ( ":" )* +# +# ::= [ ";" ";" ] # 1 part: name; 3 parts: opening; main; closing +# +# ::= [ "|" [ "|" ] ] # terse | medium | verbose +# +# ::= # a single glue word, or ","-separated arity words +# +# # Paired "ratio-style" form: recognized only when every "|" piece is a single "name : glue" pair. +# ::= ( "|" )+ +# +# ::= ":" # the glue contains no ":" +# +# ::= text +# +# Precedence depends on the form: +# - Standard: split on ":" first (name vs. argument-glue options), then split each piece on "|" +# for terse|medium|verbose, and split only the name part on ";" for opening; main; closing. +# - Paired: split on "|" first into "name : glue" pairs, then verbosity selects one pair. +# +# Example: +# "absolute-value": "function= ; absolute value| the absolute value| the absolute value; end absolute value" +# "sum": "function=sum: over: from,to" +# "quotient": "function=integer part: divided by" +# "ratio": "function=ratio : to | the ratio : to | the ratio : to" # verbosity of name:glue pairs +# - IntentMappings: { - "indexed-by": "infix= ; senket: senket: nedre indeks; slutt senket: slutt senket: slutt nedre indeks", + "indexed-by": "infix= ; senket| senket| nedre indeks; slutt senket| slutt senket| slutt nedre indeks", "modified-variable": "silent= ", - "say-super": "infix=opphĂžyd: Ăžvre indeks: Ăžvre indeks", # used with 'mo' for superscripts (e.g, "<") + "say-super": "infix=opphĂžyd| Ăžvre indeks| Ăžvre indeks", # used with 'mo' for superscripts (e.g, "<") "skip-super": "silent=", # used with 'mo' for superscripts (e.g, "*") "absolute-value": "function= ; absoluttverdien; slutt absoluttverdi", @@ -27,8 +96,8 @@ "limit": "prefix=grenseverdien nĂ„r", "lim-sup": "prefix=den Ăžvre grenseverdien nĂ„r", "lim-inf": "prefix=den nedre grenseverdien nĂ„r", - "logarithm-with-base": "prefix=log med grunntall: logaritmen med grunntall: logaritmen med grunntall", - "natural-logarithm": "function=l n: den naturlige logaritmen: den naturlige logaritmen", + "logarithm-with-base": "prefix=log med grunntall| logaritmen med grunntall| logaritmen med grunntall", + "natural-logarithm": "function=l n| den naturlige logaritmen| den naturlige logaritmen", "minus": "infix=minus || prefix=minus", "plus": "infix=pluss || prefix=pluss", "real-part": "function=den reelle delen", @@ -40,16 +109,16 @@ #"dimension": "function=; dimensjonen; slutt dimensjon", # NORWEGIAN: We say "dimensjonen til" (the dimension to), so this rule is in linear-algebra # "homomorphism": "function= ; homomorfi; slutt homomorfi", # doesn't fit function pattern # "kernel": "function= ; nullrommet ; slutt nullrommet # NORWEGIAN: We say "nullrommet til" (the kernel to), so this rule is in linear-algebra - "vector": "function= ; vektor: vektoren: vektoren || prefix=vektor: vektoren: vektoren", - "cross-product": "infix=kryss: kryssprodukt: kryssprodukt", - "dot-product": "infix=prikk: skalarprodukt: skalarprodukt", + "vector": "function= ; vektor| vektoren| vektoren || prefix=vektor| vektoren| vektoren", + "cross-product": "infix=kryss| kryssprodukt| kryssprodukt", + "dot-product": "infix=prikk| skalarprodukt| skalarprodukt", #"divergence": "function= ; div: divergens: divergens; slutt divergens", #NORWEGIAN: We say "divergensen til" (the divergence to), so this rule is in calculus. #"curl": "function= ; curl; slutt curl", #NORWEGIAN: We say "curlen til" (the curl to), so this rule is in calculus #"gradient": "function= ; grad: gradient: gradient; slutt gradient", #NORWEGIAN: We say "gradienten til" (the gradient to), so this rule is in calculus "laplacian": "function=laplace", # speech engines don't do a good job with "laplacian" (swedish ones might) - "chemistry-concentration": "function= ; konsentrasjon: konsentrasjonen av: konsentrasjonen av; slutt konsentrasjon", + "chemistry-concentration": "function= ; konsentrasjon| konsentrasjonen av| konsentrasjonen av; slutt konsentrasjon", } - NavigationParts: { diff --git a/Rules/Languages/pl/definitions.yaml b/Rules/Languages/pl/definitions.yaml index e3a8bc1db..6a37d3999 100644 --- a/Rules/Languages/pl/definitions.yaml +++ b/Rules/Languages/pl/definitions.yaml @@ -1,8 +1,83 @@ --- - include: "../../definitions.yaml" -# If an "intent" is used, the 'terse:medium:verbose' speech for the intent name is given here. -# Polish entries below are source-level speech strings used by MathCAT. +# IntentMappings Syntax: +# +# This section defines how each "intent" is spoken for various grammatical forms (fixities such as "prefix", "infix", "postfix", and "function"), +# along with supporting different verbosity levels. +# The syntax is a little bit complicated, but allows a declarative syntax so you don't have to write as many rules. +# +# For each intent, you specify spoken forms for one or more fixities using the syntax below. +# +# - Each mapping has the form: +# "": "= || = || ...", +# Every alternative must name a fixity and use "="; the fixity requested when speaking selects one. +# +# - Separate multiple fixities with "||". Spaces are allowed around any delimiter for readability. +# - Within a speech string, "|" selects the verbosity form: +# - one "|" (two forms): the first is 'terse', the second is used for 'medium' and 'verbose' +# - two "|" (three forms): 'terse', 'medium', 'verbose', in that order +# - no "|": the same spoken form is used for all verbosity levels +# +# - Use semicolons ";" to divide opening; main; closing bracketing words within the name part, +# where such words make sense (a name with no ";" is just the main phrase). +# - If an intent has multiple fixities but a definition does not specify one, the first fixity listed is chosen by default. +# +# Functions and argument glue (the part after the name): +# - ":" separates the name/bracketing phrase from the argument-glue options that follow it. +# - Arity template (two or more ":" options, or one option with ','-separated glue words): the +# number of glue words implies the arity, and the final argument is preceded by "of". +# Example: "sum: over: from,to" +# - 1 arg: "sum of x" +# - 2 args: "sum over i of x" +# - 3 args: "sum from i to n of x" +# If no option matches the argument count, the arguments are separated with "comma". +# - Binary separator (exactly one ":" option, no commas in it): after "of", that word joins the two args. +# Example: "quotient": "function=integer part: divided by" → "integer part of x divided by y" +# If there are not exactly two args, the arguments fall back to "comma". +# - Paired "ratio-style" (" : | : | ..."): used when every "|"-separated +# piece is a single "name : glue" pair. Verbosity selects one pair, whose glue is the binary +# separator described above. Example: "ratio": "function=ratio : to | the ratio : to | the ratio : to" +# +# Conceptual grammar (with precedence): +# +# IntentMappingsEntry ::= ":" # ":" is the YAML key/value separator +# +# ::= ( "||" )* +# +# ::= "=" +# +# ::= "prefix" | "infix" | "postfix" | "function" | "nofix" | "silent" +# +# ::= | +# +# # Standard form: a name/bracketing part, then ":"-separated argument-glue options. +# ::= ( ":" )* +# +# ::= [ ";" ";" ] # 1 part: name; 3 parts: opening; main; closing +# +# ::= [ "|" [ "|" ] ] # terse | medium | verbose +# +# ::= # a single glue word, or ","-separated arity words +# +# # Paired "ratio-style" form: recognized only when every "|" piece is a single "name : glue" pair. +# ::= ( "|" )+ +# +# ::= ":" # the glue contains no ":" +# +# ::= text +# +# Precedence depends on the form: +# - Standard: split on ":" first (name vs. argument-glue options), then split each piece on "|" +# for terse|medium|verbose, and split only the name part on ";" for opening; main; closing. +# - Paired: split on "|" first into "name : glue" pairs, then verbosity selects one pair. +# +# Example: +# "absolute-value": "function= ; absolute value| the absolute value| the absolute value; end absolute value" +# "sum": "function=sum: over: from,to" +# "quotient": "function=integer part: divided by" +# "ratio": "function=ratio : to | the ratio : to | the ratio : to" # verbosity of name:glue pairs +# - IntentMappings: { "binomial": "infix=symbol newtona; po; koniec symbolu newtona", @@ -13,9 +88,9 @@ "image":"function=obraz", "mixed-fraction":"infix=i", - "quotient":"function=częƛć caƂkowita | podzielone przez", + "quotient":"function=częƛć caƂkowita : podzielone przez", "evaluated-at":"infix=obliczone w", - "remainder":"function=reszta | podzielone przez", + "remainder":"function=reszta : podzielone przez", "max":"function=maksimum", "min":"function=minimum", @@ -23,14 +98,14 @@ "power":"infix=do potęgi", "root":"function=pierwiastek", - "greatest-common-divisor": "function=nwd: największy wspĂłlny dzielnik: największy wspĂłlny dzielnik", - "least-common-multiple":"function=nww: najmniejsza wspĂłlna wielokrotnoƛć: najmniejsza wspĂłlna wielokrotnoƛć", + "greatest-common-divisor": "function=nwd| największy wspĂłlny dzielnik| największy wspĂłlny dzielnik", + "least-common-multiple":"function=nww| najmniejsza wspĂłlna wielokrotnoƛć| najmniejsza wspĂłlna wielokrotnoƛć", - "absolute-value": "function=; wartoƛć bezwzględna: wartoƛć bezwzględna: wartoƛć bezwzględna; koniec wartoƛci bezwzględnej", + "absolute-value": "function=; wartoƛć bezwzględna| wartoƛć bezwzględna| wartoƛć bezwzględna; koniec wartoƛci bezwzględnej", "complex-conjugate":"function=sprzÄ™ĆŒenie zespolone", "complex-arg":"function=arg", "real-part": "function=częƛć rzeczywista", - "imaginary-part": "function=częƛć urojona: częƛć urojona: częƛć urojona", + "imaginary-part": "function=częƛć urojona| częƛć urojona| częƛć urojona", "polar-coordinate":"function=wspóƂrzędna biegunowa", "spherical-coordinate":"function=wspóƂrzędna sferyczna", @@ -50,13 +125,13 @@ ### Sets - "set": "function=; zbiĂłr: zbiĂłr", - "set-difference":"function=rĂłĆŒnica zbiorĂłw | i || infix=minus", + "set": "function=; zbiĂłr| zbiĂłr", + "set-difference":"function=rĂłĆŒnica zbiorĂłw : i || infix=minus", "complement":"function=dopeƂnienie", "empty-set":"nofix=zbiĂłr pusty", "cardinality":"function=moc zbioru", "list":"function=lista", - "tuple": "function=; krotka: krotka", + "tuple": "function=; krotka| krotka", ### Sequence and Series @@ -64,17 +139,17 @@ # w kodzie (issue #739): ostatni argument poprzedza teraz FunctionApplicationWord # z tego pliku, czyli polskie "z". SƂowa "przez" i "od,do" dobrane tak, jak mĂłwią # o tym istniejące reguƂy duĆŒych operatorĂłw ("suma przez wielka s z i"). - "sum":"function=suma | przez | od,do", - "product":"function=iloczyn | przez | od,do", + "sum":"function=suma : przez : od,do", + "product":"function=iloczyn : przez : od,do", ### Elementary classical functions - "sine":"function=sin: sinus", - "cosine":"function=cos: cosinus", - "tangent":"function=tan: tangens", - "secant":"function=sec: sekans", - "cosecant":"function=cosec: kosekans", - "cotangent":"function=cot: cotangens", + "sine":"function=sin| sinus", + "cosine":"function=cos| cosinus", + "tangent":"function=tan| tangens", + "secant":"function=sec| sekans", + "cosecant":"function=cosec| kosekans", + "cotangent":"function=cot| cotangens", "arcsine":"function=arcus sinus", "arccosine":"function=arcus cosinus", @@ -98,7 +173,7 @@ "arc-hyperbolic-cotangent":"function=arcus cotangens hiperboliczny", "exponential":"function=funkcja wykƂadnicza", - "natural-logarithm": "function=L N: logarytm naturalny: logarytm naturalny", + "natural-logarithm": "function=L N| logarytm naturalny| logarytm naturalny", "logarithm":"function=logarytm", ##Check arity 2 @@ -109,7 +184,7 @@ "median":"function=mediana", "mode":"function=dominanta", - "conditional-probability":"function=prawdopodobieƄstwo | pod warunkiem", + "conditional-probability":"function=prawdopodobieƄstwo : pod warunkiem", ### Linear Algebra @@ -119,7 +194,7 @@ "determinant":"function=wyznacznik", "adjugate":"function=macierz dopeƂnieƄ algebraicznych", "magnitude":"function=dƂugoƛć", - "norm": "function=; norma: norma: norma; koniec normy", + "norm": "function=; norma| norma| norma; koniec normy", "span":"function=powƂoka liniowa", "unit-vector":"prefix=wektor jednostkowy", @@ -130,12 +205,12 @@ ### Constants and Sets - "set-of-integers":"nofix=â„€: zbiĂłr liczb caƂkowitych", - "set-of-reals":"nofix=ℝ: zbiĂłr liczb rzeczywistych", - "set-of-rationals":"nofix=ℚ: zbiĂłr liczb wymiernych", - "set-of-natural-numbers":"nofix=ℕ: zbiĂłr liczb naturalnych", - "set-of-complex-numbers":"nofix=ℂ: zbiĂłr liczb zespolonych", - "set-of-primes":"nofix=ℙ: zbiĂłr liczb pierwszych", + "set-of-integers":"nofix=â„€| zbiĂłr liczb caƂkowitych", + "set-of-reals":"nofix=ℝ| zbiĂłr liczb rzeczywistych", + "set-of-rationals":"nofix=ℚ| zbiĂłr liczb wymiernych", + "set-of-natural-numbers":"nofix=ℕ| zbiĂłr liczb naturalnych", + "set-of-complex-numbers":"nofix=ℂ| zbiĂłr liczb zespolonych", + "set-of-primes":"nofix=ℙ| zbiĂłr liczb pierwszych", ### Geometry @@ -155,7 +230,7 @@ ### General Concepts "fenced-group":"function=grupa w nawiasach", - "ordered-pair": "function=para | i", + "ordered-pair": "function=para : i", "indexed-by": "infix=; indeks dolny; koniec indeksu dolnego", "highlight":"postfix=podƛwietlone", @@ -203,7 +278,7 @@ "congruent": "infix=przystające do", "cartesian-product": "infix=iloczyn kartezjaƄski", "composed-with": "infix=zƂoĆŒone z", - "cross-product": "infix=krzyĆŒ: iloczyn wektorowy: iloczyn wektorowy", + "cross-product": "infix=krzyĆŒ| iloczyn wektorowy| iloczyn wektorowy", "defined-as": "infix=zdefiniowane jako", "divided-by": "infix=podzielone przez", "divides": "infix=dzieli", @@ -267,11 +342,11 @@ "percent": "postfix=procent", ## Default fixity nofix - "diameter":"nofix=d: ƛrednica", - "distance":"nofix=d; D: odlegƂoƛć", - "probability":"nofix=P: prawdopodobieƄstwo || function=prawdopodobieƄstwo", - "radius":"nofix=r: promieƄ", - "volume":"nofix=V: objętoƛć || function=objętoƛć", + "diameter":"nofix=d| ƛrednica", + "distance":"nofix=d; D| odlegƂoƛć", + "probability":"nofix=P| prawdopodobieƄstwo || function=prawdopodobieƄstwo", + "radius":"nofix=r| promieƄ", + "volume":"nofix=V| objętoƛć || function=objętoƛć", "exponential-e":"nofix=e", "imaginary-i":"nofix=i", "differential-d":"nofix=d", @@ -280,20 +355,20 @@ ## Other : Not tested, don't appear in https://w3c.github.io/mathml-docs/intent-core-concepts/ "modified-variable": "silent=", - "say-super": "infix=indeks gĂłrny: indeks gĂłrny: indeks gĂłrny", # used with 'mo' for superscripts (e.g, "<") + "say-super": "infix=indeks gĂłrny| indeks gĂłrny| indeks gĂłrny", # used with 'mo' for superscripts (e.g, "<") "skip-super": "silent=", # used with 'mo' for superscripts (e.g, "*") # "large-op": "infix=przez|| other=od,do", - "lim-sup": "prefix=lim sup gdy: granica gĂłrna gdy: granica gĂłrna gdy", - "lim-inf": "prefix=lim inf gdy: granica dolna gdy: granica dolna gdy", - "limit-sup": "prefix=lim sup gdy: granica gĂłrna gdy: granica gĂłrna gdy", - "limit-inf": "prefix=lim inf gdy: granica dolna gdy: granica dolna gdy", - "logarithm-with-base": "prefix=log podstawa: logarytm o podstawie: logarytm o podstawie", - "trace": "function=; ƛlad: ƛlad: ƛlad; koniec ƛladu", - "dimension": "function=; wymiar: wymiar: wymiar; koniec wymiaru", - "homomorphism": "function=; homomorfizm: homomorfizm: homomorfizm; koniec homomorfizmu", - "kernel": "function=; jądro: jądro: jądro; koniec jądra", + "lim-sup": "prefix=lim sup gdy| granica gĂłrna gdy| granica gĂłrna gdy", + "lim-inf": "prefix=lim inf gdy| granica dolna gdy| granica dolna gdy", + "limit-sup": "prefix=lim sup gdy| granica gĂłrna gdy| granica gĂłrna gdy", + "limit-inf": "prefix=lim inf gdy| granica dolna gdy| granica dolna gdy", + "logarithm-with-base": "prefix=log podstawa| logarytm o podstawie| logarytm o podstawie", + "trace": "function=; ƛlad| ƛlad| ƛlad; koniec ƛladu", + "dimension": "function=; wymiar| wymiar| wymiar; koniec wymiaru", + "homomorphism": "function=; homomorfizm| homomorfizm| homomorfizm; koniec homomorfizmu", + "kernel": "function=; jądro| jądro| jądro; koniec jądra", - "chemistry-concentration": "function=; stÄ™ĆŒenie: stÄ™ĆŒenie: stÄ™ĆŒenie; koniec stÄ™ĆŒenia", + "chemistry-concentration": "function=; stÄ™ĆŒenie| stÄ™ĆŒenie| stÄ™ĆŒenie; koniec stÄ™ĆŒenia", } # The connector word to say for functional 'IntentMappings' (in English, "of") diff --git a/Rules/Languages/pt/definitions.yaml b/Rules/Languages/pt/definitions.yaml index adf95240a..fd0beffcf 100644 --- a/Rules/Languages/pt/definitions.yaml +++ b/Rules/Languages/pt/definitions.yaml @@ -7,56 +7,125 @@ # - name: [] "...", "..." "..." ] -# 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 only one ":" is used, it 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 -# Intent mappings must specify whether they are "prefix", "infix", "postfix", or "function" with an "=" sign -# If there are multiple fixities (e.g., see transpose), they are separated with "|| -# 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 Syntax: +# +# This section defines how each "intent" is spoken for various grammatical forms (fixities such as "prefix", "infix", "postfix", and "function"), +# along with supporting different verbosity levels. +# The syntax is a little bit complicated, but allows a declarative syntax so you don't have to write as many rules. +# +# For each intent, you specify spoken forms for one or more fixities using the syntax below. +# +# - Each mapping has the form: +# "": "= || = || ...", +# Every alternative must name a fixity and use "="; the fixity requested when speaking selects one. +# +# - Separate multiple fixities with "||". Spaces are allowed around any delimiter for readability. +# - Within a speech string, "|" selects the verbosity form: +# - one "|" (two forms): the first is 'terse', the second is used for 'medium' and 'verbose' +# - two "|" (three forms): 'terse', 'medium', 'verbose', in that order +# - no "|": the same spoken form is used for all verbosity levels +# +# - Use semicolons ";" to divide opening; main; closing bracketing words within the name part, +# where such words make sense (a name with no ";" is just the main phrase). +# - If an intent has multiple fixities but a definition does not specify one, the first fixity listed is chosen by default. +# +# Functions and argument glue (the part after the name): +# - ":" separates the name/bracketing phrase from the argument-glue options that follow it. +# - Arity template (two or more ":" options, or one option with ','-separated glue words): the +# number of glue words implies the arity, and the final argument is preceded by "of". +# Example: "sum: over: from,to" +# - 1 arg: "sum of x" +# - 2 args: "sum over i of x" +# - 3 args: "sum from i to n of x" +# If no option matches the argument count, the arguments are separated with "comma". +# - Binary separator (exactly one ":" option, no commas in it): after "of", that word joins the two args. +# Example: "quotient": "function=integer part: divided by" → "integer part of x divided by y" +# If there are not exactly two args, the arguments fall back to "comma". +# - Paired "ratio-style" (" : | : | ..."): used when every "|"-separated +# piece is a single "name : glue" pair. Verbosity selects one pair, whose glue is the binary +# separator described above. Example: "ratio": "function=ratio : to | the ratio : to | the ratio : to" +# +# Conceptual grammar (with precedence): +# +# IntentMappingsEntry ::= ":" # ":" is the YAML key/value separator +# +# ::= ( "||" )* +# +# ::= "=" +# +# ::= "prefix" | "infix" | "postfix" | "function" | "nofix" | "silent" +# +# ::= | +# +# # Standard form: a name/bracketing part, then ":"-separated argument-glue options. +# ::= ( ":" )* +# +# ::= [ ";" ";" ] # 1 part: name; 3 parts: opening; main; closing +# +# ::= [ "|" [ "|" ] ] # terse | medium | verbose +# +# ::= # a single glue word, or ","-separated arity words +# +# # Paired "ratio-style" form: recognized only when every "|" piece is a single "name : glue" pair. +# ::= ( "|" )+ +# +# ::= ":" # the glue contains no ":" +# +# ::= text +# +# Precedence depends on the form: +# - Standard: split on ":" first (name vs. argument-glue options), then split each piece on "|" +# for terse|medium|verbose, and split only the name part on ";" for opening; main; closing. +# - Paired: split on "|" first into "name : glue" pairs, then verbosity selects one pair. +# +# Example: +# "absolute-value": "function= ; absolute value| the absolute value| the absolute value; end absolute value" +# "sum": "function=sum: over: from,to" +# "quotient": "function=integer part: divided by" +# "ratio": "function=ratio : to | the ratio : to | the ratio : to" # verbosity of name:glue pairs +# - IntentMappings: { "indexed-by": "infix= ; Ă­ndice; fim do Ă­ndice", "modified-variable": "silent= ", "say-super": "infix=sobrescrito", # used with 'mo' for superscripts (e.g, "<") "skip-super": "silent=", # used with 'mo' for superscripts (e.g, "*") - "absolute-value": "function= ; valor absoluto: o valor absoluto de: o valor absoluto de; fim do valor absoluto", + "absolute-value": "function= ; valor absoluto| o valor absoluto de| o valor absoluto de; fim do valor absoluto", "binomial": "infix=binomial; escolhe; fim do binomial", "limit": "prefix=limite quando", - "lim-sup": "prefix=lim sup quando: o limite superior quando: o limite superior quando", - "lim-inf": "prefix=lim inf quando: o limite inferior quando: o limite inferior quando", - "logarithm-with-base": "prefix=log na base: o log na base: o logaritmo na base", + "lim-sup": "prefix=lim sup quando| o limite superior quando| o limite superior quando", + "lim-inf": "prefix=lim inf quando| o limite inferior quando| o limite inferior quando", + "logarithm-with-base": "prefix=log na base| o log na base| o logaritmo na base", "minus": "infix=menos || prefix=menos", "plus": "infix=mais || prefix=positivo", "transpose": "postfix=transposta || function=transposta", - "norm": "function=; norma: norma: a norma; fim da norma", + "norm": "function=; norma| norma| a norma; fim da norma", # ‖x‖ Ă© inferido pelo motor como 'magnitude' (nĂŁo 'norm'); sem esta linha # vazava "magnitude de x" em inglĂȘs. Mesma fala da norma. - "magnitude": "function=; norma: norma: a norma; fim da norma", - "trace": "function=; traço: traço de: o traço de; fim do traço", - "dimension": "function=; dimensĂŁo: dimensĂŁo de: a dimensĂŁo de; fim da dimensĂŁo", - "homomorphism": "function= ; homomorfismo: homomorfismo de: o homomorfismo de; fim do homomorfismo", - "kernel": "function= ; nĂșcleo: nĂșcleo de: o nĂșcleo de; fim do nĂșcleo", + "magnitude": "function=; norma| norma| a norma; fim da norma", + "trace": "function=; traço| traço de| o traço de; fim do traço", + "dimension": "function=; dimensĂŁo| dimensĂŁo de| a dimensĂŁo de; fim da dimensĂŁo", + "homomorphism": "function= ; homomorfismo| homomorfismo de| o homomorfismo de; fim do homomorfismo", + "kernel": "function= ; nĂșcleo| nĂșcleo de| o nĂșcleo de; fim do nĂșcleo", "vector": "function= ; vetor || prefix=vetor", # O motor infere ⃗a × ⃗b como um SEM filhos (o operador vira # o prĂłprio elemento); aĂ­ a fixidade infix nĂŁo se aplica e ele falava o nome # literal, "cross product". A fixidade nofix cobre esse caso. Idem dot-product. - "cross-product": "infix=vetorial: produto vetorial: produto vetorial || nofix=vetorial: produto vetorial: produto vetorial", - "dot-product": "infix=escalar: produto escalar: produto escalar || nofix=escalar: produto escalar: produto escalar", + "cross-product": "infix=vetorial| produto vetorial| produto vetorial || nofix=vetorial| produto vetorial| produto vetorial", + "dot-product": "infix=escalar| produto escalar| produto escalar || nofix=escalar| produto escalar| produto escalar", - "divergence": "function= ; div: divergente: divergente; fim do divergente", + "divergence": "function= ; div| divergente| divergente; fim do divergente", "curl": "function= ; rotacional; fim do rotacional", - "gradient": "function= ; grad: gradiente: gradiente; fim do gradiente", + "gradient": "function= ; grad| gradiente| gradiente; fim do gradiente", "laplacian": "function=laplaciano", - "chemistry-concentration": "function= ; concentração: concentração de: a concentração de; fim da concentração", + "chemistry-concentration": "function= ; concentração| concentração de| a concentração de; fim da concentração", # CORREÇÃO: o en tem duas fixidades (nofix || function); sĂł com a function # a fala ganha o "de" ("probabilidade de x"). E o separador de palavras do # conditional-probability Ă© "|", como no en — ";" nĂŁo Ă© reconhecido aqui. - "probability": "nofix=P: probabilidade || function=probabilidade", - "conditional-probability": "function=probabilidade | dado", + "probability": "nofix=P| probabilidade || function=probabilidade", + "conditional-probability": "function=probabilidade : dado", "intersection": "infix=interseção", "union": "infix=uniĂŁo", } diff --git a/Rules/Languages/ru/definitions.yaml b/Rules/Languages/ru/definitions.yaml index c89178abc..2426a2c53 100644 --- a/Rules/Languages/ru/definitions.yaml +++ b/Rules/Languages/ru/definitions.yaml @@ -1,57 +1,126 @@ --- - 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 only one ":" is used, it 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 -# Intent mappings must specify whether they are "prefix", "infix", "postfix", or "function" with an "=" sign -# If there are multiple fixities (e.g., see transpose), they are separated with "|| -# 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 Syntax: +# +# This section defines how each "intent" is spoken for various grammatical forms (fixities such as "prefix", "infix", "postfix", and "function"), +# along with supporting different verbosity levels. +# The syntax is a little bit complicated, but allows a declarative syntax so you don't have to write as many rules. +# +# For each intent, you specify spoken forms for one or more fixities using the syntax below. +# +# - Each mapping has the form: +# "": "= || = || ...", +# Every alternative must name a fixity and use "="; the fixity requested when speaking selects one. +# +# - Separate multiple fixities with "||". Spaces are allowed around any delimiter for readability. +# - Within a speech string, "|" selects the verbosity form: +# - one "|" (two forms): the first is 'terse', the second is used for 'medium' and 'verbose' +# - two "|" (three forms): 'terse', 'medium', 'verbose', in that order +# - no "|": the same spoken form is used for all verbosity levels +# +# - Use semicolons ";" to divide opening; main; closing bracketing words within the name part, +# where such words make sense (a name with no ";" is just the main phrase). +# - If an intent has multiple fixities but a definition does not specify one, the first fixity listed is chosen by default. +# +# Functions and argument glue (the part after the name): +# - ":" separates the name/bracketing phrase from the argument-glue options that follow it. +# - Arity template (two or more ":" options, or one option with ','-separated glue words): the +# number of glue words implies the arity, and the final argument is preceded by "of". +# Example: "sum: over: from,to" +# - 1 arg: "sum of x" +# - 2 args: "sum over i of x" +# - 3 args: "sum from i to n of x" +# If no option matches the argument count, the arguments are separated with "comma". +# - Binary separator (exactly one ":" option, no commas in it): after "of", that word joins the two args. +# Example: "quotient": "function=integer part: divided by" → "integer part of x divided by y" +# If there are not exactly two args, the arguments fall back to "comma". +# - Paired "ratio-style" (" : | : | ..."): used when every "|"-separated +# piece is a single "name : glue" pair. Verbosity selects one pair, whose glue is the binary +# separator described above. Example: "ratio": "function=ratio : to | the ratio : to | the ratio : to" +# +# Conceptual grammar (with precedence): +# +# IntentMappingsEntry ::= ":" # ":" is the YAML key/value separator +# +# ::= ( "||" )* +# +# ::= "=" +# +# ::= "prefix" | "infix" | "postfix" | "function" | "nofix" | "silent" +# +# ::= | +# +# # Standard form: a name/bracketing part, then ":"-separated argument-glue options. +# ::= ( ":" )* +# +# ::= [ ";" ";" ] # 1 part: name; 3 parts: opening; main; closing +# +# ::= [ "|" [ "|" ] ] # terse | medium | verbose +# +# ::= # a single glue word, or ","-separated arity words +# +# # Paired "ratio-style" form: recognized only when every "|" piece is a single "name : glue" pair. +# ::= ( "|" )+ +# +# ::= ":" # the glue contains no ":" +# +# ::= text +# +# Precedence depends on the form: +# - Standard: split on ":" first (name vs. argument-glue options), then split each piece on "|" +# for terse|medium|verbose, and split only the name part on ";" for opening; main; closing. +# - Paired: split on "|" first into "name : glue" pairs, then verbosity selects one pair. +# +# Example: +# "absolute-value": "function= ; absolute value| the absolute value| the absolute value; end absolute value" +# "sum": "function=sum: over: from,to" +# "quotient": "function=integer part: divided by" +# "ratio": "function=ratio : to | the ratio : to | the ratio : to" # verbosity of name:glue pairs +# - IntentMappings: { - "indexed-by": "infix= ; с ĐžĐœĐŽĐ”ĐșŃĐŸĐŒ; ĐșĐŸĐœĐ”Ń† ĐžĐœĐŽĐ”Đșса: с ĐžĐœĐŽĐ”ĐșŃĐŸĐŒ: с ĐžĐœĐŽĐ”ĐșŃĐŸĐŒ", + "indexed-by": "infix= ; с ĐžĐœĐŽĐ”ĐșŃĐŸĐŒ; ĐșĐŸĐœĐ”Ń† ĐžĐœĐŽĐ”Đșса| с ĐžĐœĐŽĐ”ĐșŃĐŸĐŒ| с ĐžĐœĐŽĐ”ĐșŃĐŸĐŒ", "modified-variable": "silent= ", - "say-super": "infix=ĐČĐ”Ń€Ń…ĐœĐžĐč ĐžĐœĐŽĐ”Đșс: ĐČĐ”Ń€Ń…ĐœĐžĐč ĐžĐœĐŽĐ”Đșс: ĐČĐ”Ń€Ń…ĐœĐžĐč ĐžĐœĐŽĐ”Đșс", # used with 'mo' for superscripts (e.g, "<") + "say-super": "infix=ĐČĐ”Ń€Ń…ĐœĐžĐč ĐžĐœĐŽĐ”Đșс| ĐČĐ”Ń€Ń…ĐœĐžĐč ĐžĐœĐŽĐ”Đșс| ĐČĐ”Ń€Ń…ĐœĐžĐč ĐžĐœĐŽĐ”Đșс", # used with 'mo' for superscripts (e.g, "<") "skip-super": "silent=", # used with 'mo' for superscripts (e.g, "*") - "absolute-value": "function= ; ĐŒĐŸĐŽŃƒĐ»ŃŒ: ĐŒĐŸĐŽŃƒĐ»ŃŒ: ĐŒĐŸĐŽŃƒĐ»ŃŒ; ĐșĐŸĐœĐ”Ń† ĐŒĐŸĐŽŃƒĐ»Ń", + "absolute-value": "function= ; ĐŒĐŸĐŽŃƒĐ»ŃŒ| ĐŒĐŸĐŽŃƒĐ»ŃŒ| ĐŒĐŸĐŽŃƒĐ»ŃŒ; ĐșĐŸĐœĐ”Ń† ĐŒĐŸĐŽŃƒĐ»Ń", "binomial": "infix=Ń‡ĐžŃĐ»ĐŸ ŃĐŸŃ‡Đ”Ń‚Đ°ĐœĐžĐč Оз; ĐżĐŸ; ĐșĐŸĐœĐ”Ń† чОсла ŃĐŸŃ‡Đ”Ń‚Đ°ĐœĐžĐč", # "closed-interval": "other=closed-interval; ĐŸŃ‚,ĐŽĐŸ; end closed-interval", - "greatest-common-divisor": "function=ĐœĐŸĐŽ: ĐœĐŸĐŽ: ĐœĐ°ĐžĐ±ĐŸĐ»ŃŒŃˆĐžĐč ĐŸĐ±Ń‰ĐžĐč ĐŽĐ”Đ»ĐžŃ‚Đ”Đ»ŃŒ", + "greatest-common-divisor": "function=ĐœĐŸĐŽ| ĐœĐŸĐŽ| ĐœĐ°ĐžĐ±ĐŸĐ»ŃŒŃˆĐžĐč ĐŸĐ±Ń‰ĐžĐč ĐŽĐ”Đ»ĐžŃ‚Đ”Đ»ŃŒ", "imaginary-part": "function=ĐŒĐœĐžĐŒĐ°Ń часть, ĐŒĐœĐžĐŒĐ°Ń часть, ĐŒĐœĐžĐŒĐ°Ń часть", - "least-common-multiple": "function=ĐœĐŸĐș:ĐœĐŸĐș:ĐœĐ°ĐžĐŒĐ”ĐœŃŒŃˆĐ”Đ” ĐŸĐ±Ń‰Đ”Đ” ĐșŃ€Đ°Ń‚ĐœĐŸĐ”", + "least-common-multiple": "function=ĐœĐŸĐș|ĐœĐŸĐș|ĐœĐ°ĐžĐŒĐ”ĐœŃŒŃˆĐ”Đ” ĐŸĐ±Ń‰Đ”Đ” ĐșŃ€Đ°Ń‚ĐœĐŸĐ”", # "large-op": "infix=ĐœĐ°ĐŽ || other=ĐŸŃ‚,ĐŽĐŸ", - "limit": "prefix=прДЎДл про: прДЎДл про: прДЎДл про", - "lim-sup": "prefix=ĐČĐ”Ń€Ń…ĐœĐžĐč прДЎДл про: ĐČĐ”Ń€Ń…ĐœĐžĐč прДЎДл про: ĐČĐ”Ń€Ń…ĐœĐžĐč прДЎДл про", - "lim-inf": "prefix=ĐœĐžĐ¶ĐœĐžĐč прДЎДл про: ĐœĐžĐ¶ĐœĐžĐč прДЎДл про: ĐœĐžĐ¶ĐœĐžĐč прДЎДл про", - "logarithm-with-base": "prefix=Đ»ĐŸĐłĐ°Ń€ĐžŃ„ĐŒ ĐżĐŸ ĐŸŃĐœĐŸĐČĐ°ĐœĐžŃŽ: Đ»ĐŸĐłĐ°Ń€ĐžŃ„ĐŒ ĐżĐŸ ĐŸŃĐœĐŸĐČĐ°ĐœĐžŃŽ: Đ»ĐŸĐłĐ°Ń€ĐžŃ„ĐŒ ĐżĐŸ ĐŸŃĐœĐŸĐČĐ°ĐœĐžŃŽ", - "natural-logarithm": "function=ŃĐ» ŃĐœ: ĐœĐ°Ń‚ŃƒŃ€Đ°Đ»ŃŒĐœŃ‹Đč Đ»ĐŸĐłĐ°Ń€ĐžŃ„ĐŒ: ĐœĐ°Ń‚ŃƒŃ€Đ°Đ»ŃŒĐœŃ‹Đč Đ»ĐŸĐłĐ°Ń€ĐžŃ„ĐŒ", + "limit": "prefix=прДЎДл про| прДЎДл про| прДЎДл про", + "lim-sup": "prefix=ĐČĐ”Ń€Ń…ĐœĐžĐč прДЎДл про| ĐČĐ”Ń€Ń…ĐœĐžĐč прДЎДл про| ĐČĐ”Ń€Ń…ĐœĐžĐč прДЎДл про", + "lim-inf": "prefix=ĐœĐžĐ¶ĐœĐžĐč прДЎДл про| ĐœĐžĐ¶ĐœĐžĐč прДЎДл про| ĐœĐžĐ¶ĐœĐžĐč прДЎДл про", + "logarithm-with-base": "prefix=Đ»ĐŸĐłĐ°Ń€ĐžŃ„ĐŒ ĐżĐŸ ĐŸŃĐœĐŸĐČĐ°ĐœĐžŃŽ| Đ»ĐŸĐłĐ°Ń€ĐžŃ„ĐŒ ĐżĐŸ ĐŸŃĐœĐŸĐČĐ°ĐœĐžŃŽ| Đ»ĐŸĐłĐ°Ń€ĐžŃ„ĐŒ ĐżĐŸ ĐŸŃĐœĐŸĐČĐ°ĐœĐžŃŽ", + "natural-logarithm": "function=ŃĐ» ŃĐœ| ĐœĐ°Ń‚ŃƒŃ€Đ°Đ»ŃŒĐœŃ‹Đč Đ»ĐŸĐłĐ°Ń€ĐžŃ„ĐŒ| ĐœĐ°Ń‚ŃƒŃ€Đ°Đ»ŃŒĐœŃ‹Đč Đ»ĐŸĐłĐ°Ń€ĐžŃ„ĐŒ", "minus": "infix=ĐŒĐžĐœŃƒŃ || prefix=ĐŒĐžĐœŃƒŃ", "plus": "infix=плюс || prefix=плюс", # "pochhammer": "infix=permutations of", # arguments are in reverse order, so can't work here "real-part": "function=ĐŽĐ”ĐčстĐČĐžŃ‚Đ”Đ»ŃŒĐœĐ°Ń часть", "transpose": "postfix=Ń‚Ń€Đ°ĐœŃĐżĐŸĐœĐžŃ€ĐŸĐČĐ°ĐœĐžĐ” || function=Ń‚Ń€Đ°ĐœŃĐżĐŸĐœĐžŃ€ĐŸĐČĐ°ĐœĐœĐ°Ń", - "norm": "function=; ĐœĐŸŃ€ĐŒĐ°: ĐœĐŸŃ€ĐŒĐ°: ĐœĐŸŃ€ĐŒĐ°; ĐșĐŸĐœĐ”Ń† ĐœĐŸŃ€ĐŒŃ‹", - "trace": "function=;слДЎ : слДЎ: слДЎ; ĐșĐŸĐœĐ”Ń† слДЎа", - "dimension": "function=; Ń€Đ°Đ·ĐŒĐ”Ń€ĐœĐŸŃŃ‚ŃŒ : Ń€Đ°Đ·ĐŒĐ”Ń€ĐœĐŸŃŃ‚ŃŒ: Ń€Đ°Đ·ĐŒĐ”Ń€ĐœĐŸŃŃ‚ŃŒ; ĐșĐŸĐœĐ”Ń† Ń€Đ°Đ·ĐŒĐ”Ń€ĐœĐŸŃŃ‚Đž", - "homomorphism": "function= ; ĐłĐŸĐŒĐŸĐŒĐŸŃ€Ń„ĐžĐ·ĐŒ : ĐłĐŸĐŒĐŸĐŒĐŸŃ€Ń„ĐžĐ·ĐŒ: ĐłĐŸĐŒĐŸĐŒĐŸŃ€Ń„ĐžĐ·ĐŒ; ĐșĐŸĐœĐ”Ń† ĐłĐŸĐŒĐŸĐŒĐŸŃ€Ń„ĐžĐ·ĐŒĐ°", - "kernel": "function= ; ŃĐŽŃ€ĐŸ : ŃĐŽŃ€ĐŸ: ŃĐŽŃ€ĐŸ; ĐșĐŸĐœĐ”Ń† яЮра", + "norm": "function=; ĐœĐŸŃ€ĐŒĐ°| ĐœĐŸŃ€ĐŒĐ°| ĐœĐŸŃ€ĐŒĐ°; ĐșĐŸĐœĐ”Ń† ĐœĐŸŃ€ĐŒŃ‹", + "trace": "function=;слДЎ | слДЎ| слДЎ; ĐșĐŸĐœĐ”Ń† слДЎа", + "dimension": "function=; Ń€Đ°Đ·ĐŒĐ”Ń€ĐœĐŸŃŃ‚ŃŒ | Ń€Đ°Đ·ĐŒĐ”Ń€ĐœĐŸŃŃ‚ŃŒ| Ń€Đ°Đ·ĐŒĐ”Ń€ĐœĐŸŃŃ‚ŃŒ; ĐșĐŸĐœĐ”Ń† Ń€Đ°Đ·ĐŒĐ”Ń€ĐœĐŸŃŃ‚Đž", + "homomorphism": "function= ; ĐłĐŸĐŒĐŸĐŒĐŸŃ€Ń„ĐžĐ·ĐŒ | ĐłĐŸĐŒĐŸĐŒĐŸŃ€Ń„ĐžĐ·ĐŒ| ĐłĐŸĐŒĐŸĐŒĐŸŃ€Ń„ĐžĐ·ĐŒ; ĐșĐŸĐœĐ”Ń† ĐłĐŸĐŒĐŸĐŒĐŸŃ€Ń„ĐžĐ·ĐŒĐ°", + "kernel": "function= ; ŃĐŽŃ€ĐŸ | ŃĐŽŃ€ĐŸ| ŃĐŽŃ€ĐŸ; ĐșĐŸĐœĐ”Ń† яЮра", "vector": "function= ; ĐČĐ”ĐșŃ‚ĐŸŃ€ || prefix=ĐČĐ”ĐșŃ‚ĐŸŃ€", - "cross-product": "infix=ĐČĐ”ĐșŃ‚ĐŸŃ€ĐœĐŸĐ” ĐżŃ€ĐŸĐžĐ·ĐČĐ”ĐŽĐ”ĐœĐžĐ”: ĐČĐ”ĐșŃ‚ĐŸŃ€ĐœĐŸĐ” ĐżŃ€ĐŸĐžĐ·ĐČĐ”ĐŽĐ”ĐœĐžĐ”: ĐČĐ”ĐșŃ‚ĐŸŃ€ĐœĐŸĐ” ĐżŃ€ĐŸĐžĐ·ĐČĐ”ĐŽĐ”ĐœĐžĐ”", - "dot-product": "infix=сĐșĐ°Đ»ŃŃ€ĐœĐŸĐ” ĐżŃ€ĐŸĐžĐ·ĐČĐ”ĐŽĐ”ĐœĐžĐ”: сĐșĐ°Đ»ŃŃ€ĐœĐŸĐ” ĐżŃ€ĐŸĐžĐ·ĐČĐ”ĐŽĐ”ĐœĐžĐ”: сĐșĐ°Đ»ŃŃ€ĐœĐŸĐ” ĐżŃ€ĐŸĐžĐ·ĐČĐ”ĐŽĐ”ĐœĐžĐ”", + "cross-product": "infix=ĐČĐ”ĐșŃ‚ĐŸŃ€ĐœĐŸĐ” ĐżŃ€ĐŸĐžĐ·ĐČĐ”ĐŽĐ”ĐœĐžĐ”| ĐČĐ”ĐșŃ‚ĐŸŃ€ĐœĐŸĐ” ĐżŃ€ĐŸĐžĐ·ĐČĐ”ĐŽĐ”ĐœĐžĐ”| ĐČĐ”ĐșŃ‚ĐŸŃ€ĐœĐŸĐ” ĐżŃ€ĐŸĐžĐ·ĐČĐ”ĐŽĐ”ĐœĐžĐ”", + "dot-product": "infix=сĐșĐ°Đ»ŃŃ€ĐœĐŸĐ” ĐżŃ€ĐŸĐžĐ·ĐČĐ”ĐŽĐ”ĐœĐžĐ”| сĐșĐ°Đ»ŃŃ€ĐœĐŸĐ” ĐżŃ€ĐŸĐžĐ·ĐČĐ”ĐŽĐ”ĐœĐžĐ”| сĐșĐ°Đ»ŃŃ€ĐœĐŸĐ” ĐżŃ€ĐŸĐžĐ·ĐČĐ”ĐŽĐ”ĐœĐžĐ”", "perpendicular-to": "infix=ĐżĐ”Ń€ĐżĐ”ĐœĐŽĐžĐșŃƒĐ»ŃŃ€ĐœĐŸ", "perpendicular to": "infix=ĐżĐ”Ń€ĐżĐ”ĐœĐŽĐžĐșŃƒĐ»ŃŃ€ĐœĐŸ", "perpendicular_to": "infix=ĐżĐ”Ń€ĐżĐ”ĐœĐŽĐžĐșŃƒĐ»ŃŃ€ĐœĐŸ", "forced": "prefix=Ń„ĐŸŃ€ŃĐžĐŽ", - "divergence": "function= ; ĐŽĐžĐČĐ”Ń€ĐłĐ”ĐœŃ†ĐžŃ: ĐŽĐžĐČĐ”Ń€ĐłĐ”ĐœŃ†ĐžŃ: ĐŽĐžĐČĐ”Ń€ĐłĐ”ĐœŃ†ĐžŃ; ĐșĐŸĐœĐ”Ń† ĐŽĐžĐČĐ”Ń€ĐłĐ”ĐœŃ†ĐžĐž", + "divergence": "function= ; ĐŽĐžĐČĐ”Ń€ĐłĐ”ĐœŃ†ĐžŃ| ĐŽĐžĐČĐ”Ń€ĐłĐ”ĐœŃ†ĐžŃ| ĐŽĐžĐČĐ”Ń€ĐłĐ”ĐœŃ†ĐžŃ; ĐșĐŸĐœĐ”Ń† ĐŽĐžĐČĐ”Ń€ĐłĐ”ĐœŃ†ĐžĐž", "curl": "function= ; Ń€ĐŸŃ‚ĐŸŃ€; ĐșĐŸĐœĐ”Ń† Ń€ĐŸŃ‚ĐŸŃ€Đ°", - "gradient": "function= ; ĐłŃ€Đ°ĐŽĐžĐ”ĐœŃ‚: ĐłŃ€Đ°ĐŽĐžĐ”ĐœŃ‚: ĐłŃ€Đ°ĐŽĐžĐ”ĐœŃ‚; ĐșĐŸĐœĐ”Ń† ĐłŃ€Đ°ĐŽĐžĐ”ĐœŃ‚Đ°", + "gradient": "function= ; ĐłŃ€Đ°ĐŽĐžĐ”ĐœŃ‚| ĐłŃ€Đ°ĐŽĐžĐ”ĐœŃ‚| ĐłŃ€Đ°ĐŽĐžĐ”ĐœŃ‚; ĐșĐŸĐœĐ”Ń† ĐłŃ€Đ°ĐŽĐžĐ”ĐœŃ‚Đ°", "laplacian": "function=Đ»Đ°ĐżĐ»Đ°ŃĐžĐ°Đœ", # speech engines don't do a good job with "laplacian" - "chemistry-concentration": "function= ; ĐșĐŸĐœŃ†Đ”ĐœŃ‚Ń€Đ°Ń†ĐžŃ: ĐșĐŸĐœŃ†Đ”ĐœŃ‚Ń€Đ°Ń†ĐžŃ: ĐșĐŸĐœŃ†Đ”ĐœŃ‚Ń€Đ°Ń†ĐžŃ; ĐșĐŸĐœĐ”Ń† ĐșĐŸĐœŃ†Đ”ĐœŃ‚Ń€Đ°Ń†ĐžĐž", + "chemistry-concentration": "function= ; ĐșĐŸĐœŃ†Đ”ĐœŃ‚Ń€Đ°Ń†ĐžŃ| ĐșĐŸĐœŃ†Đ”ĐœŃ‚Ń€Đ°Ń†ĐžŃ| ĐșĐŸĐœŃ†Đ”ĐœŃ‚Ń€Đ°Ń†ĐžŃ; ĐșĐŸĐœĐ”Ń† ĐșĐŸĐœŃ†Đ”ĐœŃ‚Ń€Đ°Ń†ĐžĐž", } # Names of functions that in terse mode don't say "of" (or it's equivalent in other languages) diff --git a/Rules/Languages/sv/definitions.yaml b/Rules/Languages/sv/definitions.yaml index 643f50377..b0c7cffbd 100644 --- a/Rules/Languages/sv/definitions.yaml +++ b/Rules/Languages/sv/definitions.yaml @@ -5,32 +5,101 @@ # name: [ "...", "..." "..." ], -# 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 only one ":" is used, it 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 -# Intent mappings must specify whether they are "prefix", "infix", "postfix", or "function" with an "=" sign -# If there are multiple fixities (e.g., see transpose), they are separated with "|| -# 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 Syntax: +# +# This section defines how each "intent" is spoken for various grammatical forms (fixities such as "prefix", "infix", "postfix", and "function"), +# along with supporting different verbosity levels. +# The syntax is a little bit complicated, but allows a declarative syntax so you don't have to write as many rules. +# +# For each intent, you specify spoken forms for one or more fixities using the syntax below. +# +# - Each mapping has the form: +# "": "= || = || ...", +# Every alternative must name a fixity and use "="; the fixity requested when speaking selects one. +# +# - Separate multiple fixities with "||". Spaces are allowed around any delimiter for readability. +# - Within a speech string, "|" selects the verbosity form: +# - one "|" (two forms): the first is 'terse', the second is used for 'medium' and 'verbose' +# - two "|" (three forms): 'terse', 'medium', 'verbose', in that order +# - no "|": the same spoken form is used for all verbosity levels +# +# - Use semicolons ";" to divide opening; main; closing bracketing words within the name part, +# where such words make sense (a name with no ";" is just the main phrase). +# - If an intent has multiple fixities but a definition does not specify one, the first fixity listed is chosen by default. +# +# Functions and argument glue (the part after the name): +# - ":" separates the name/bracketing phrase from the argument-glue options that follow it. +# - Arity template (two or more ":" options, or one option with ','-separated glue words): the +# number of glue words implies the arity, and the final argument is preceded by "of". +# Example: "sum: over: from,to" +# - 1 arg: "sum of x" +# - 2 args: "sum over i of x" +# - 3 args: "sum from i to n of x" +# If no option matches the argument count, the arguments are separated with "comma". +# - Binary separator (exactly one ":" option, no commas in it): after "of", that word joins the two args. +# Example: "quotient": "function=integer part: divided by" → "integer part of x divided by y" +# If there are not exactly two args, the arguments fall back to "comma". +# - Paired "ratio-style" (" : | : | ..."): used when every "|"-separated +# piece is a single "name : glue" pair. Verbosity selects one pair, whose glue is the binary +# separator described above. Example: "ratio": "function=ratio : to | the ratio : to | the ratio : to" +# +# Conceptual grammar (with precedence): +# +# IntentMappingsEntry ::= ":" # ":" is the YAML key/value separator +# +# ::= ( "||" )* +# +# ::= "=" +# +# ::= "prefix" | "infix" | "postfix" | "function" | "nofix" | "silent" +# +# ::= | +# +# # Standard form: a name/bracketing part, then ":"-separated argument-glue options. +# ::= ( ":" )* +# +# ::= [ ";" ";" ] # 1 part: name; 3 parts: opening; main; closing +# +# ::= [ "|" [ "|" ] ] # terse | medium | verbose +# +# ::= # a single glue word, or ","-separated arity words +# +# # Paired "ratio-style" form: recognized only when every "|" piece is a single "name : glue" pair. +# ::= ( "|" )+ +# +# ::= ":" # the glue contains no ":" +# +# ::= text +# +# Precedence depends on the form: +# - Standard: split on ":" first (name vs. argument-glue options), then split each piece on "|" +# for terse|medium|verbose, and split only the name part on ";" for opening; main; closing. +# - Paired: split on "|" first into "name : glue" pairs, then verbosity selects one pair. +# +# Example: +# "absolute-value": "function= ; absolute value| the absolute value| the absolute value; end absolute value" +# "sum": "function=sum: over: from,to" +# "quotient": "function=integer part: divided by" +# "ratio": "function=ratio : to | the ratio : to | the ratio : to" # verbosity of name:glue pairs +# - IntentMappings: { - "indexed-by": "infix= ; nedsĂ€nkt: nedsĂ€nkt: nedre index; slut nedsĂ€nkt: slut nedsĂ€nkt: slut nedre index", + "indexed-by": "infix= ; nedsĂ€nkt| nedsĂ€nkt| nedre index; slut nedsĂ€nkt| slut nedsĂ€nkt| slut nedre index", "modified-variable": "silent= ", - "say-super": "infix=upphöjt: övre index: övre index", # used with 'mo' for superscripts (e.g, "<") + "say-super": "infix=upphöjt| övre index| övre index", # used with 'mo' for superscripts (e.g, "<") "skip-super": "silent=", # used with 'mo' for superscripts (e.g, "*") "absolute-value": "function= ; absolutbeloppet; slut absolutbelopp", "binomial": "infix=binomial; över; slut binomial", "dimension-product": "infix=gĂ„nger", # "closed-interval": "other=closed-interval; from,to; end closed-interval", - "greatest-common-divisor": "function=sgd: sgd: största gemensamma delaren", - "imaginary-part": "function=imaginĂ€r del: den imaginĂ€ra delen: den imaginĂ€ra delen", - "least-common-multiple": "function=mgm: mgm: den minsta gemensamma multipeln", + "greatest-common-divisor": "function=sgd| sgd| största gemensamma delaren", + "imaginary-part": "function=imaginĂ€r del| den imaginĂ€ra delen| den imaginĂ€ra delen", + "least-common-multiple": "function=mgm| mgm| den minsta gemensamma multipeln", # "large-op": "infix=over || other=from,to", "limit": "prefix=grĂ€nsvĂ€rdet dĂ„", - "lim-sup": "prefix=lim sup dĂ„: övre grĂ€nsvĂ€rdet dĂ„: det övre grĂ€nsvĂ€rdet dĂ„", - "lim-inf": "prefix=lim inf dĂ„: undre grĂ€nsvĂ€rdet dĂ„ : det undre grĂ€nsvĂ€rdet dĂ„", - "logarithm-with-base": "prefix=logg bas: logaritmen med bas: logaritmen med bas", + "lim-sup": "prefix=lim sup dĂ„| övre grĂ€nsvĂ€rdet dĂ„| det övre grĂ€nsvĂ€rdet dĂ„", + "lim-inf": "prefix=lim inf dĂ„| undre grĂ€nsvĂ€rdet dĂ„ | det undre grĂ€nsvĂ€rdet dĂ„", + "logarithm-with-base": "prefix=logg bas| logaritmen med bas| logaritmen med bas", "minus": "infix=minus || prefix=minus", "plus": "infix=plus || prefix=positivt", # "pochhammer": "infix=permutations of", # arguments are in reverse order, so can't work here @@ -42,16 +111,16 @@ "dimension": "function=; dimensionen; slut dimension", # "homomorphism": "function= ; homomorfism; slut homomorfism", # SWEDISH: doesn't fit function pattern # "kernel": "function= ; noll-rummet : noll-rummet till: noll-rummet till; slut noll-rummet", # SWEDISH: doesn't fit function pattern - "vector": "function= ; vektor: vektorn: vektorn || prefix=vektor: vektorn: vektorn", - "cross-product": "infix=kryss: kryssprodukt: kryssprodukt", - "dot-product": "infix=skalĂ€rt: skalĂ€rprodukt: skalĂ€rprodukt", + "vector": "function= ; vektor| vektorn| vektorn || prefix=vektor| vektorn| vektorn", + "cross-product": "infix=kryss| kryssprodukt| kryssprodukt", + "dot-product": "infix=skalĂ€rt| skalĂ€rprodukt| skalĂ€rprodukt", - "divergence": "function= ; div: divergens: divergens; slut divergens", + "divergence": "function= ; div| divergens| divergens; slut divergens", "curl": "function= ; rotation; slut rotation", - "gradient": "function= ; grad: gradient: gradient; slut gradient", + "gradient": "function= ; grad| gradient| gradient; slut gradient", "laplacian": "function=laplacianen", # speech engines don't do a good job with "laplacian" (swedish ones might) - "chemistry-concentration": "function= ; koncentration: koncentrationen av: koncentrationen av; slut koncentration", + "chemistry-concentration": "function= ; koncentration| koncentrationen av| koncentrationen av; slut koncentration", } - NavigationParts: { diff --git a/Rules/Languages/vi/definitions.yaml b/Rules/Languages/vi/definitions.yaml index aba2adf36..ba0617a73 100644 --- a/Rules/Languages/vi/definitions.yaml +++ b/Rules/Languages/vi/definitions.yaml @@ -8,21 +8,90 @@ # - name: [] "...", "..." "..." ] -# 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 only one ":" is used, it 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 -# Intent mappings must specify whether they are "prefix", "infix", "postfix", or "function" with an "=" sign -# If there are multiple fixities (e.g., see transpose), they are separated with "|| -# 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 Syntax: +# +# This section defines how each "intent" is spoken for various grammatical forms (fixities such as "prefix", "infix", "postfix", and "function"), +# along with supporting different verbosity levels. +# The syntax is a little bit complicated, but allows a declarative syntax so you don't have to write as many rules. +# +# For each intent, you specify spoken forms for one or more fixities using the syntax below. +# +# - Each mapping has the form: +# "": "= || = || ...", +# Every alternative must name a fixity and use "="; the fixity requested when speaking selects one. +# +# - Separate multiple fixities with "||". Spaces are allowed around any delimiter for readability. +# - Within a speech string, "|" selects the verbosity form: +# - one "|" (two forms): the first is 'terse', the second is used for 'medium' and 'verbose' +# - two "|" (three forms): 'terse', 'medium', 'verbose', in that order +# - no "|": the same spoken form is used for all verbosity levels +# +# - Use semicolons ";" to divide opening; main; closing bracketing words within the name part, +# where such words make sense (a name with no ";" is just the main phrase). +# - If an intent has multiple fixities but a definition does not specify one, the first fixity listed is chosen by default. +# +# Functions and argument glue (the part after the name): +# - ":" separates the name/bracketing phrase from the argument-glue options that follow it. +# - Arity template (two or more ":" options, or one option with ','-separated glue words): the +# number of glue words implies the arity, and the final argument is preceded by "of". +# Example: "sum: over: from,to" +# - 1 arg: "sum of x" +# - 2 args: "sum over i of x" +# - 3 args: "sum from i to n of x" +# If no option matches the argument count, the arguments are separated with "comma". +# - Binary separator (exactly one ":" option, no commas in it): after "of", that word joins the two args. +# Example: "quotient": "function=integer part: divided by" → "integer part of x divided by y" +# If there are not exactly two args, the arguments fall back to "comma". +# - Paired "ratio-style" (" : | : | ..."): used when every "|"-separated +# piece is a single "name : glue" pair. Verbosity selects one pair, whose glue is the binary +# separator described above. Example: "ratio": "function=ratio : to | the ratio : to | the ratio : to" +# +# Conceptual grammar (with precedence): +# +# IntentMappingsEntry ::= ":" # ":" is the YAML key/value separator +# +# ::= ( "||" )* +# +# ::= "=" +# +# ::= "prefix" | "infix" | "postfix" | "function" | "nofix" | "silent" +# +# ::= | +# +# # Standard form: a name/bracketing part, then ":"-separated argument-glue options. +# ::= ( ":" )* +# +# ::= [ ";" ";" ] # 1 part: name; 3 parts: opening; main; closing +# +# ::= [ "|" [ "|" ] ] # terse | medium | verbose +# +# ::= # a single glue word, or ","-separated arity words +# +# # Paired "ratio-style" form: recognized only when every "|" piece is a single "name : glue" pair. +# ::= ( "|" )+ +# +# ::= ":" # the glue contains no ":" +# +# ::= text +# +# Precedence depends on the form: +# - Standard: split on ":" first (name vs. argument-glue options), then split each piece on "|" +# for terse|medium|verbose, and split only the name part on ";" for opening; main; closing. +# - Paired: split on "|" first into "name : glue" pairs, then verbosity selects one pair. +# +# Example: +# "absolute-value": "function= ; absolute value| the absolute value| the absolute value; end absolute value" +# "sum": "function=sum: over: from,to" +# "quotient": "function=integer part: divided by" +# "ratio": "function=ratio : to | the ratio : to | the ratio : to" # verbosity of name:glue pairs +# - IntentMappings: { "indexed-by": "infix= ; chỉ số dưới lĂ ; háșżt chỉ số dưới", "modified-variable": "silent= ", "say-super": "infix=chỉ số trĂȘn", # used with 'mo' for superscripts (e.g, "<") "skip-super": "silent=", # used with 'mo' for superscripts (e.g, "*") - "absolute-value": "function= ; trị tuyệt đối: trị tuyệt đối cá»§a: trị tuyệt đối cá»§a; háșżt trị tuyệt đối", + "absolute-value": "function= ; trị tuyệt đối| trị tuyệt đối cá»§a| trị tuyệt đối cá»§a; háșżt trị tuyệt đối", "binomial": "infix=nhị thức; chọn; háșżt nhị thức", "limit": "prefix=giới háșĄn", "lim-sup": "prefix=giới háșĄn trĂȘn khi", @@ -32,18 +101,18 @@ "plus": "infix=cộng || prefix=dÆ°ÆĄng", "transpose": "postfix=ma tráș­n chuyển vị || function=ma tráș­n chuyển vị", - "norm": "function=; định mức: định mức: định mức cá»§a; end norm", - "trace": "function=;váșżt : váșżt: váșżt cá»§a; háșżt váșżt", - "dimension": "function=; kĂ­ch thước : kĂ­ch thước: kĂ­ch thước cá»§a; háșżt kĂ­ch thước", - "homomorphism": "function= ; đồng cáș„u : đồng cáș„u: đồng cáș„u cá»§a; háșżt đồng cáș„u", - "kernel": "function= ; háșĄch tĂąm : háșĄch tĂąm: háșĄch tĂąm cá»§a; háșżt háșĄch tĂąm", + "norm": "function=; định mức| định mức| định mức cá»§a; end norm", + "trace": "function=;váșżt | váșżt| váșżt cá»§a; háșżt váșżt", + "dimension": "function=; kĂ­ch thước | kĂ­ch thước| kĂ­ch thước cá»§a; háșżt kĂ­ch thước", + "homomorphism": "function= ; đồng cáș„u | đồng cáș„u| đồng cáș„u cá»§a; háșżt đồng cáș„u", + "kernel": "function= ; háșĄch tĂąm | háșĄch tĂąm| háșĄch tĂąm cá»§a; háșżt háșĄch tĂąm", "vector": "function=vĂ©c tÆĄ || prefix=vĂ©c tÆĄ", - "cross-product": "infix=hướng: tĂ­ch cĂł hướng: tĂ­ch cĂł hướng", - "dot-product": "infix=cháș„m: tĂ­ch vĂŽ hướng: dot:tĂ­ch vĂŽ hướng", + "cross-product": "infix=hướng| tĂ­ch cĂł hướng| tĂ­ch cĂł hướng", + "dot-product": "infix=cháș„m| tĂ­ch vĂŽ hướng| dot|tĂ­ch vĂŽ hướng", - "divergence": "function= ; phĂąn kĂŹ: độ phĂąn kĂŹ: độ phĂąn kĂŹ; háșżt độ phĂąn kĂŹ", + "divergence": "function= ; phĂąn kĂŹ| độ phĂąn kĂŹ| độ phĂąn kĂŹ; háșżt độ phĂąn kĂŹ", "curl": "function= ; vĂČng xoĂĄy; háșżt vĂČng xoĂĄy", - "gradient": "function= ; đáșĄo hĂ m: đáșĄo hĂ m: đáșĄo hĂ m; háșżt đáșĄo hĂ m", + "gradient": "function= ; đáșĄo hĂ m| đáșĄo hĂ m| đáșĄo hĂ m; háșżt đáșĄo hĂ m", "laplacian": "function=lĂĄp-la-xe", # speech engines don't do a good job with "laplacian" } diff --git a/Rules/Languages/zh/tw/definitions.yaml b/Rules/Languages/zh/tw/definitions.yaml index d5857679f..e79991b91 100644 --- a/Rules/Languages/zh/tw/definitions.yaml +++ b/Rules/Languages/zh/tw/definitions.yaml @@ -1,14 +1,83 @@ --- - 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||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 -# Intent mappings must specify whether they are "prefix", "infix", "postfix", or "function" with an "=" sign -# If there are multiple fixities (e.g., see transpose), they are separated with "|| -# 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 Syntax: +# +# This section defines how each "intent" is spoken for various grammatical forms (fixities such as "prefix", "infix", "postfix", and "function"), +# along with supporting different verbosity levels. +# The syntax is a little bit complicated, but allows a declarative syntax so you don't have to write as many rules. +# +# For each intent, you specify spoken forms for one or more fixities using the syntax below. +# +# - Each mapping has the form: +# "": "= || = || ...", +# Every alternative must name a fixity and use "="; the fixity requested when speaking selects one. +# +# - Separate multiple fixities with "||". Spaces are allowed around any delimiter for readability. +# - Within a speech string, "|" selects the verbosity form: +# - one "|" (two forms): the first is 'terse', the second is used for 'medium' and 'verbose' +# - two "|" (three forms): 'terse', 'medium', 'verbose', in that order +# - no "|": the same spoken form is used for all verbosity levels +# +# - Use semicolons ";" to divide opening; main; closing bracketing words within the name part, +# where such words make sense (a name with no ";" is just the main phrase). +# - If an intent has multiple fixities but a definition does not specify one, the first fixity listed is chosen by default. +# +# Functions and argument glue (the part after the name): +# - ":" separates the name/bracketing phrase from the argument-glue options that follow it. +# - Arity template (two or more ":" options, or one option with ','-separated glue words): the +# number of glue words implies the arity, and the final argument is preceded by "of". +# Example: "sum: over: from,to" +# - 1 arg: "sum of x" +# - 2 args: "sum over i of x" +# - 3 args: "sum from i to n of x" +# If no option matches the argument count, the arguments are separated with "comma". +# - Binary separator (exactly one ":" option, no commas in it): after "of", that word joins the two args. +# Example: "quotient": "function=integer part: divided by" → "integer part of x divided by y" +# If there are not exactly two args, the arguments fall back to "comma". +# - Paired "ratio-style" (" : | : | ..."): used when every "|"-separated +# piece is a single "name : glue" pair. Verbosity selects one pair, whose glue is the binary +# separator described above. Example: "ratio": "function=ratio : to | the ratio : to | the ratio : to" +# +# Conceptual grammar (with precedence): +# +# IntentMappingsEntry ::= ":" # ":" is the YAML key/value separator +# +# ::= ( "||" )* +# +# ::= "=" +# +# ::= "prefix" | "infix" | "postfix" | "function" | "nofix" | "silent" +# +# ::= | +# +# # Standard form: a name/bracketing part, then ":"-separated argument-glue options. +# ::= ( ":" )* +# +# ::= [ ";" ";" ] # 1 part: name; 3 parts: opening; main; closing +# +# ::= [ "|" [ "|" ] ] # terse | medium | verbose +# +# ::= # a single glue word, or ","-separated arity words +# +# # Paired "ratio-style" form: recognized only when every "|" piece is a single "name : glue" pair. +# ::= ( "|" )+ +# +# ::= ":" # the glue contains no ":" +# +# ::= text +# +# Precedence depends on the form: +# - Standard: split on ":" first (name vs. argument-glue options), then split each piece on "|" +# for terse|medium|verbose, and split only the name part on ";" for opening; main; closing. +# - Paired: split on "|" first into "name : glue" pairs, then verbosity selects one pair. +# +# Example: +# "absolute-value": "function= ; absolute value| the absolute value| the absolute value; end absolute value" +# "sum": "function=sum: over: from,to" +# "quotient": "function=integer part: divided by" +# "ratio": "function=ratio : to | the ratio : to | the ratio : to" # verbosity of name:glue pairs +# - IntentMappings: { "binomial": "infix=; 遞; ", @@ -36,14 +105,14 @@ "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" + "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", + "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", + "imaginary-part": "function=imaginary part| the imaginary part| the imaginary part", "polar-coordinate":"function=polar coordinate; comma", "spherical-coordinate":"function=spherical coordinate; comma; comma", @@ -67,27 +136,27 @@ ### Sets - "set": "function= ; set: the set", + "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", + "tuple": "function= ; tuple| the tuple", ### Sequence and Series - "sum":"function= ; sum over : sum ; ", #: sum over : sum from; to", + "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", + "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", @@ -111,7 +180,7 @@ "arc-hyperbolic-cotangent":"function=arc coth", "exponential":"function=exponential", - "natural-logarithm": "function=l n: natural log: natural log", + "natural-logarithm": "function=l n| natural log| natural log", "logarithm":"function=log", ##Check arity 2 @@ -131,7 +200,7 @@ "determinant":"function=determinant", "adjugate":"function=adjugate", "magnitude":"function=magnitude", - "norm": "function=; norm: norm: norm; 甐束 norm", + "norm": "function=; norm| norm| norm; 甐束 norm", "span":"function=span", "unit-vector":"prefix=unit vector", @@ -142,12 +211,12 @@ ### 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", + "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 @@ -192,8 +261,8 @@ ### Other ## Default fixity function "curl": "function=curl", - "divergence": "function=div:divergence", - "gradient": "function=del:gradient", + "divergence": "function=div|divergence", + "gradient": "function=del|gradient", "laplacian": "function=laplacian", ## Default fixity prefix @@ -218,7 +287,7 @@ "congruent": "infix=congruent to", "cartesian-product": "infix=cartesian product", "composed-with": "infix=composed with", - "cross-product": "infix=cross: cross product: cross product", + "cross-product": "infix=cross| cross product| cross product", "defined-as": "infix=defined as", "divided-by": "infix=divided by", "divides": "infix=divides", @@ -282,11 +351,11 @@ "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", + "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", @@ -298,16 +367,16 @@ "say-super": "infix=䞊暙", # used with 'mo' for superscripts (e.g, "<") "skip-super": "silent=", # used with 'mo' for superscripts (e.g, "*") # "large-op": "infix=over || other=from,to", - "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", + "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 ćș•敞", #"prefix=log base: the log base: the log base", # "pochhammer": "infix=permutations of", # arguments are in reverse order, so can't work here - "trace": "function= ; trace : trace: trace; 甐束 trace", - "dimension": "function=; dimension : dimension: dimension; 甐束 dimension", - "homomorphism": "function= ; homomorphism : homomorphism: homomorphism; 甐束 homomorphism", - "kernel": "function= ; kernel : kernel: kernel; 甐束 kernel", + "trace": "function= ; trace | trace| trace; 甐束 trace", + "dimension": "function=; dimension | dimension| dimension; 甐束 dimension", + "homomorphism": "function= ; homomorphism | homomorphism| homomorphism; 甐束 homomorphism", + "kernel": "function= ; kernel | kernel| kernel; 甐束 kernel", - "chemistry-concentration": "function= ; concentration: concentration of: the concentration of; end concentration", + "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) diff --git a/Rules/Languages/zz/definitions.yaml b/Rules/Languages/zz/definitions.yaml index 592871ab4..27966dc68 100644 --- a/Rules/Languages/zz/definitions.yaml +++ b/Rules/Languages/zz/definitions.yaml @@ -7,30 +7,99 @@ # - name: [] "...", "..." "..." ] -# 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 only one ":" is used, it 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 -# Intent mappings must specify whether they are "prefix", "infix", "postfix", or "function" with an "=" sign -# If there are multiple fixities (e.g., see transpose), they are separated with "|| -# 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 Syntax: +# +# This section defines how each "intent" is spoken for various grammatical forms (fixities such as "prefix", "infix", "postfix", and "function"), +# along with supporting different verbosity levels. +# The syntax is a little bit complicated, but allows a declarative syntax so you don't have to write as many rules. +# +# For each intent, you specify spoken forms for one or more fixities using the syntax below. +# +# - Each mapping has the form: +# "": "= || = || ...", +# Every alternative must name a fixity and use "="; the fixity requested when speaking selects one. +# +# - Separate multiple fixities with "||". Spaces are allowed around any delimiter for readability. +# - Within a speech string, "|" selects the verbosity form: +# - one "|" (two forms): the first is 'terse', the second is used for 'medium' and 'verbose' +# - two "|" (three forms): 'terse', 'medium', 'verbose', in that order +# - no "|": the same spoken form is used for all verbosity levels +# +# - Use semicolons ";" to divide opening; main; closing bracketing words within the name part, +# where such words make sense (a name with no ";" is just the main phrase). +# - If an intent has multiple fixities but a definition does not specify one, the first fixity listed is chosen by default. +# +# Functions and argument glue (the part after the name): +# - ":" separates the name/bracketing phrase from the argument-glue options that follow it. +# - Arity template (two or more ":" options, or one option with ','-separated glue words): the +# number of glue words implies the arity, and the final argument is preceded by "of". +# Example: "sum: over: from,to" +# - 1 arg: "sum of x" +# - 2 args: "sum over i of x" +# - 3 args: "sum from i to n of x" +# If no option matches the argument count, the arguments are separated with "comma". +# - Binary separator (exactly one ":" option, no commas in it): after "of", that word joins the two args. +# Example: "quotient": "function=integer part: divided by" → "integer part of x divided by y" +# If there are not exactly two args, the arguments fall back to "comma". +# - Paired "ratio-style" (" : | : | ..."): used when every "|"-separated +# piece is a single "name : glue" pair. Verbosity selects one pair, whose glue is the binary +# separator described above. Example: "ratio": "function=ratio : to | the ratio : to | the ratio : to" +# +# Conceptual grammar (with precedence): +# +# IntentMappingsEntry ::= ":" # ":" is the YAML key/value separator +# +# ::= ( "||" )* +# +# ::= "=" +# +# ::= "prefix" | "infix" | "postfix" | "function" | "nofix" | "silent" +# +# ::= | +# +# # Standard form: a name/bracketing part, then ":"-separated argument-glue options. +# ::= ( ":" )* +# +# ::= [ ";" ";" ] # 1 part: name; 3 parts: opening; main; closing +# +# ::= [ "|" [ "|" ] ] # terse | medium | verbose +# +# ::= # a single glue word, or ","-separated arity words +# +# # Paired "ratio-style" form: recognized only when every "|" piece is a single "name : glue" pair. +# ::= ( "|" )+ +# +# ::= ":" # the glue contains no ":" +# +# ::= text +# +# Precedence depends on the form: +# - Standard: split on ":" first (name vs. argument-glue options), then split each piece on "|" +# for terse|medium|verbose, and split only the name part on ";" for opening; main; closing. +# - Paired: split on "|" first into "name : glue" pairs, then verbosity selects one pair. +# +# Example: +# "absolute-value": "function= ; absolute value| the absolute value| the absolute value; end absolute value" +# "sum": "function=sum: over: from,to" +# "quotient": "function=integer part: divided by" +# "ratio": "function=ratio : to | the ratio : to | the ratio : to" # verbosity of name:glue pairs +# - IntentMappings: { "absolute-value": "function=absolute value", "binomial": "infix=binomial; choose; end binomial", "closed-interval": "other=closed-interval;from,to;end closed-interval", - "dot-product": "infix=dot:dot product:dot product", - "greatest-common-divisor": "function=gcd: the gcd: the greatest common divisor", + "dot-product": "infix=dot|dot product|dot product", + "greatest-common-divisor": "function=gcd| the gcd| the greatest common divisor", "imaginary-part": "function=imaginary part, the imaginary part, the imaginary part", - "least-common-multiple": "function=lcm:the lcm:the least common multiple", + "least-common-multiple": "function=lcm|the lcm|the least common multiple", "large-op:2": "infix=over", "large-op:3": "other=from,to", "real-part": "function=the real part", "transpose": "postfix=transpose || function=transpose", - "divergence": "function= ; div: divergence: divergence; end divergence", + "divergence": "function= ; div| divergence| divergence; end divergence", "curl": "function= ; curl; end curl", - "gradient": "function= ; grad: gradient: gradient; end gradient", + "gradient": "function= ; grad| gradient| gradient; end gradient", "laplacian": "function=lahplahsian", # speech engines don't do a good job with "laplacian" } diff --git a/src/infer_intent.rs b/src/infer_intent.rs index 81cbb9933..251be6674 100644 --- a/src/infer_intent.rs +++ b/src/infer_intent.rs @@ -215,158 +215,224 @@ pub fn add_fixity_children(intent: Element) -> Element { } } -pub fn intent_speech_for_name(intent_name: &str, verbosity: &str, fixity: &str) -> String { - crate::definitions::SPEECH_DEFINITIONS.with(|definitions| { - let definitions = definitions.borrow(); - if let Some(intent_name_pattern) = definitions.get_hashmap("IntentMappings").unwrap().get(intent_name) { - // Split the pattern is: - // fixity-def [|| fixity-def]* - // fixity-def := fixity=[open;] verbosity[; close] [| arity-or-sep]* - // verbosity := terse | medium | verbose - // After '|': arity templates (glue words, ','-separated) or a single repeating separator - if let Some(matched_intent) = intent_name_pattern.split("||").find(|&entry| entry.trim().starts_with(fixity)) { - let (_, matched_intent) = matched_intent.split_once("=").unwrap_or_default(); - let name_part = intent_mapping_name_part(matched_intent); - let parts = name_part.split(";").collect::>(); - let mut operator_names = (if parts.len() > 1 {parts[1]} else {parts[0]}).split(":").collect::>(); - match operator_names.len() { - 1 => return operator_names[0].trim().to_string(), - 2 | 3 => { - if operator_names.len() == 2 { - warn!("Intent '{intent_name}' has only two operator names, but should have three"); - operator_names.push(operator_names[1]); - } - let intent_word = match verbosity { - "Terse" => operator_names[0], - "Medium" => operator_names[1], - _ => operator_names[2], - }; - return intent_word.trim().to_string(); - }, - _ => { - error!("Intent '{}' has too many ({}) operator names, should only have 2", intent_name, operator_names.len()); - return intent_name.to_string(); - }, - } - } - }; - return intent_name.replace(['_', '-'], " ").trim().to_string(); - }) +// ------------------------------------------------------------------------------------------------- +// IntentMappings parsing +// +// A mapping value is `fixity=
[|| fixity2= ...]`. Each `` is parsed by +// `parse_fixity_mapping` into a `FixityMapping` (resolved for the current verbosity). Two forms +// are supported: +// * Standard: `[open;] name [;close] [: glue]*` +// `|` inside any piece selects terse|medium|verbose. The `:`-separated glue +// options describe how arguments are joined (arity templates or a binary word). +// * Ratio-style: `name : glue | name2 : glue2 | ...` +// each `|`-alternative is a whole `name : glue` pair and verbosity picks one. +// All the query functions below operate on the parsed `FixityMapping`, so the delimiter rules +// live in exactly one place. +// ------------------------------------------------------------------------------------------------- + +/// A fixity mapping (`fixity=...` text) parsed and resolved for one verbosity level. +struct FixityMapping { + /// Bracketing phrase spoken before the arguments (only present for an `open; name; close` form). + open: String, + /// The main spoken name/phrase. + name: String, + /// Bracketing phrase spoken after the arguments. + close: String, + /// Argument-glue options (the `:`-separated parts after the name). An arity template has one + /// entry per supported arity (comma-separated glue words); a binary separator is a single entry + /// with no comma; a plain function has none. + glue: Vec, } -/// Portion of a fixity mapping before `|` arity/separator options. -pub fn intent_mapping_name_part(matched_after_equals: &str) -> &str { - matched_after_equals.split('|').next().unwrap_or(matched_after_equals).trim() +pub fn intent_speech_for_name(intent_name: &str, verbosity: &str, fixity: &str) -> String { + match fixity_mapping(intent_name, fixity, verbosity) { + Some(mapping) => mapping.name, + None => intent_name.replace(['_', '-'], " ").trim().to_string(), + } } -/// `|` options after the spoken-name portion of a fixity mapping. -fn intent_mapping_pipe_options(matched_after_equals: &str) -> Vec<&str> { - let mut parts = matched_after_equals.split('|'); - parts.next(); // name / bracketing portion - parts.map(str::trim).filter(|s| !s.is_empty()).collect() +/// Bracketing phrase for an intent's `open; name; close` speech form. `at_start` selects the +/// opening phrase, otherwise the closing one. Empty when the mapping has no bracketing or the +/// fixity is not found. +pub fn intent_bracketing_word(intent_name: &str, fixity: &str, verbosity: &str, at_start: bool) -> String { + match fixity_mapping(intent_name, fixity, verbosity) { + Some(mapping) => if at_start { mapping.open } else { mapping.close }, + None => String::new(), + } } -fn intent_mapping_for_fixity(intent_name: &str, fixity: &str) -> Option { +/// Look up `intent_name`'s body for `fixity` and parse it, resolving `|` variants for `verbosity`. +fn fixity_mapping(intent_name: &str, fixity: &str, verbosity: &str) -> Option { crate::definitions::SPEECH_DEFINITIONS.with(|definitions| { let definitions = definitions.borrow(); let mappings = definitions.get_hashmap("IntentMappings").unwrap(); - let intent_name_pattern = mappings.get(intent_name)?; - let matched = intent_name_pattern.split("||").find(|&entry| entry.trim().starts_with(fixity))?; - let (_, after_eq) = matched.split_once("=")?; - Some(after_eq.trim().to_string()) + let pattern = mappings.get(intent_name)?; + let body = pattern.split("||").find(|entry| entry.trim().starts_with(fixity))?; + let (_, after_eq) = body.split_once('=')?; + Some(parse_fixity_mapping(after_eq.trim(), verbosity)) }) } -/// True when `|` options are arity templates (more than one option, or an option listing multiple glue words). -pub fn intent_function_is_arity_mode(intent_name: &str, fixity: &str) -> bool { - let Some(after_eq) = intent_mapping_for_fixity(intent_name, fixity) else { return false; }; - let options = intent_mapping_pipe_options(&after_eq); - options.len() > 1 || options.iter().any(|opt| opt.contains(',')) +fn parse_fixity_mapping(after_eq: &str, verbosity: &str) -> FixityMapping { + // Ratio-style: `name : glue | name2 : glue2 | ...` — verbosity picks one (name, glue) pair. + if let Some((name, glue)) = ratio_style_pair(after_eq, verbosity) { + return FixityMapping { open: String::new(), name, close: String::new(), glue: vec![glue] }; + } + + // Standard: the name/bracketing part (before the first `:`), then argument-glue options. + let mut sections = after_eq.split(':'); + let (open, name, close) = split_bracketing(sections.next().unwrap_or_default()); + let glue = sections + .map(str::trim) + .filter(|s| !s.is_empty()) + .map(|option| pick_verbosity(option, verbosity)) + .collect(); + FixityMapping { + open: pick_verbosity(open, verbosity), + name: pick_verbosity(name, verbosity), + close: pick_verbosity(close, verbosity), + glue, + } } -/// Glue words for an exact arity match: `arg_count - 1` words, else `None`. -fn intent_function_arity_glue(after_eq: &str, arg_count: usize) -> Option> { - if arg_count == 0 { +/// Split the name portion into `(open, name, close)` on `;`. Bracketing words are only present +/// when there are exactly three parts; otherwise the second part (if any) is the name. +fn split_bracketing(speech_part: &str) -> (&str, &str, &str) { + let parts: Vec<&str> = speech_part.split(';').collect(); + match parts.len() { + 1 => ("", parts[0], ""), + 3 => (parts[0], parts[1], parts[2]), + _ => ("", parts.get(1).copied().unwrap_or_default(), ""), + } +} + +/// The index into a `|`-separated option (or ratio-style pair list) for `verbosity`, clamped to +/// the number of available forms: terse=0, medium=1, verbose=2. +fn verbosity_index(verbosity: &str, len: usize) -> usize { + match verbosity { + _ if len <= 1 => 0, + "Terse" => 0, + "Medium" => 1.min(len - 1), + _ => 2.min(len - 1), + } +} + +/// Selects the form for `verbosity` from a `|`-separated option, e.g. `sin | sine` or `to | to`. +fn pick_verbosity(option: &str, verbosity: &str) -> String { + let forms: Vec<&str> = option.split('|').map(str::trim).filter(|s| !s.is_empty()).collect(); + match forms.as_slice() { + [] => String::new(), + _ => forms[verbosity_index(verbosity, forms.len())].to_string(), + } +} + +/// Ratio-style mapping: `name : glue | name2 : glue2 | ...`. Returns the (name, glue) pair for +/// `verbosity`, or `None` if the text is not a set of `name : glue` alternatives. +fn ratio_style_pair(after_eq: &str, verbosity: &str) -> Option<(String, String)> { + let alternatives: Vec<&str> = after_eq.split('|').map(str::trim).filter(|s| !s.is_empty()).collect(); + if alternatives.len() < 2 { return None; } - let want = arg_count - 1; - for opt in intent_mapping_pipe_options(after_eq) { - let words: Vec<&str> = if opt.is_empty() { - Vec::new() - } else { - opt.split(',').map(str::trim).filter(|s| !s.is_empty()).collect() - }; - if words.len() == want { - return Some(words); - } + let pairs: Vec<(&str, &str)> = alternatives.iter() + .map(|alternative| { + let (name, glue) = alternative.split_once(':')?; + let glue = glue.trim(); + (!glue.is_empty() && !glue.contains(':')).then_some((name.trim(), glue)) + }) + .collect::>()?; + let (name, glue) = pairs[verbosity_index(verbosity, pairs.len())]; + Some((name.to_string(), glue.to_string())) +} + +fn get_verbosity_pref() -> String { + PreferenceManager::get().borrow().pref_to_string("Verbosity") +} + +/// A binary separator is a single glue option with no comma (e.g. `integer part: divided by`). +fn binary_separator(mapping: &FixityMapping) -> Option<&str> { + match mapping.glue.as_slice() { + [only] if !only.contains(',') => Some(only), + _ => None, } - None } -pub fn intent_function_has_arity_match(intent_name: &str, fixity: &str, arg_count: usize) -> bool { - let Some(after_eq) = intent_mapping_for_fixity(intent_name, fixity) else { return false; }; - if !intent_function_is_arity_mode(intent_name, fixity) { - return false; +/// True when the glue is an arity template (multiple options, or one option with comma-separated +/// glue words) rather than a binary separator or a plain function. +fn is_arity_mode(mapping: &FixityMapping) -> bool { + binary_separator(mapping).is_none() + && (mapping.glue.len() > 1 || mapping.glue.iter().any(|option| option.contains(','))) +} + +/// The glue words for an exact arity match: the option with `arg_count - 1` comma-separated words. +fn arity_glue(mapping: &FixityMapping, arg_count: usize) -> Option> { + if arg_count == 0 || binary_separator(mapping).is_some() { + return None; } - intent_function_arity_glue(&after_eq, arg_count).is_some() + let want = arg_count - 1; + mapping.glue.iter().find_map(|option| { + let words: Vec<&str> = option.split(',').map(str::trim).filter(|s| !s.is_empty()).collect(); + (words.len() == want).then_some(words) + }) } -/// Spoken glue immediately before argument `arg_index` (1-based) when using an arity template. -/// Empty when not in a matching arity template (caller uses separator/`of` path instead). + +/// Whether the function intent matches an arity-template pattern for the current argument count. +pub fn intent_function_has_arity_match(intent_name: &str, fixity: &str, arg_count: usize) -> bool { + let verbosity = get_verbosity_pref(); + let Some(mapping) = fixity_mapping(intent_name, fixity, &verbosity) else { return false; }; + is_arity_mode(&mapping) && arity_glue(&mapping, arg_count).is_some() +} + +/// Returns the glue word immediately before a specific argument when using an arity template. pub fn intent_function_glue_before(intent_name: &str, fixity: &str, arg_index: usize, arg_count: usize) -> String { - if !intent_function_is_arity_mode(intent_name, fixity) { + let verbosity = get_verbosity_pref(); + let Some(mapping) = fixity_mapping(intent_name, fixity, &verbosity) else { return String::new(); }; + if !is_arity_mode(&mapping) { return String::new(); } if arg_index == arg_count { - return crate::definitions::SPEECH_DEFINITIONS.with(|definitions| { - let definitions = definitions.borrow(); - let word_ref = definitions.get_vec("FunctionApplicationWord"); - if let Some(word) = word_ref && !word.is_empty() { - return word[0].clone(); - } - return String::new(); - }) + return function_application_word(); // last argument is preceded by "of" } - let Some(after_eq) = intent_mapping_for_fixity(intent_name, fixity) else { return String::new(); }; - let Some(words) = intent_function_arity_glue(&after_eq, arg_count) else { return String::new(); }; - // words has arg_count-1 entries for args 1..arg_count-1; last arg is preceded by "of" - if arg_index >= 1 && arg_index < arg_count { - return words[arg_index - 1].to_string(); + match arity_glue(&mapping, arg_count) { + Some(words) if (1..arg_count).contains(&arg_index) => words[arg_index - 1].to_string(), + _ => String::new(), } - return String::new(); } -/// Separator between args when not using an arity template. -/// A single `|` option is a binary separator after "of" (e.g. `| divided by`); otherwise comma. -/// Non-comma glue is only used when there are exactly two args — there is no real n-ary case for it. +/// Returns the separator used between arguments when not using an arity-template path. pub fn intent_function_arg_separator(intent_name: &str, fixity: &str, arg_count: usize) -> String { - let Some(after_eq) = intent_mapping_for_fixity(intent_name, fixity) else { - return ",".to_string(); - }; - let options = intent_mapping_pipe_options(&after_eq); - if intent_function_is_arity_mode(intent_name, fixity) { - // Extra/unknown arity: always commas (including when multiple arity options exist) - if intent_function_arity_glue(&after_eq, arg_count).is_some() { - return String::new(); // unused on arity-match path - } - return ",".to_string(); - } - if options.len() == 1 && arg_count == 2 { - let sep = options[0]; - // IntentMappings write the word "comma"; speech uses the ',' character so unicode → "comma" - if sep.eq_ignore_ascii_case("comma") { - return ",".to_string(); + let verbosity = get_verbosity_pref(); + let Some(mapping) = fixity_mapping(intent_name, fixity, &verbosity) else { return ",".to_string(); }; + if is_arity_mode(&mapping) { + // On an exact arity match the glue words are inserted individually (no separator). + return if arity_glue(&mapping, arg_count).is_some() { String::new() } else { ",".to_string() }; + } + if arg_count == 2 { + if let Some(separator) = binary_separator(&mapping) { + if !separator.eq_ignore_ascii_case("comma") { + return separator.to_string(); + } } - return sep.to_string(); } ",".to_string() } -/// Whether function-intent should use the arity-template word order (no trailing name-level "of"). +/// Returns true when the function-intent should use the arity-template word order instead of +/// a generic `of`/separator pattern. pub fn intent_function_use_arity_path(intent_name: &str, fixity: &str, arg_count: usize) -> bool { intent_function_has_arity_match(intent_name, fixity, arg_count) } +/// The word inserted before a function's final argument (e.g. English "of"), from definitions. +fn function_application_word() -> String { + crate::definitions::SPEECH_DEFINITIONS.with(|definitions| { + let definitions = definitions.borrow(); + definitions.get_vec("FunctionApplicationWord") + .and_then(|words| words.first().cloned()) + .unwrap_or_default() + }) +} + // intent := self-property-list | expression @@ -883,6 +949,44 @@ mod tests { return Ok(()); } + #[test] + fn parse_intent_mapping_forms() -> Result<()> { + use super::{parse_fixity_mapping, ratio_style_pair, pick_verbosity, binary_separator, is_arity_mode, arity_glue}; + + // Ratio-style: verbosity selects a whole `name : glue` pair; glue acts as a binary separator. + let ratio = "ratio : to | the ratio : to | the ratio : to"; + assert_eq!(ratio_style_pair(ratio, "Terse"), Some(("ratio".to_string(), "to".to_string()))); + assert_eq!(ratio_style_pair(ratio, "Medium"), Some(("the ratio".to_string(), "to".to_string()))); + let ratio_terse = parse_fixity_mapping(ratio, "Terse"); + assert_eq!(ratio_terse.name, "ratio"); + assert_eq!(binary_separator(&ratio_terse), Some("to")); + assert!(!is_arity_mode(&ratio_terse)); + assert_eq!(arity_glue(&ratio_terse, 2), None); + + // `|` selects terse/medium/verbose within one piece. + assert_eq!(pick_verbosity("sin | sine", "Terse"), "sin"); + assert_eq!(pick_verbosity("sin | sine", "Medium"), "sine"); + + // Arity template: `:`-separated glue options, `,`-separated glue words imply arity. + let sum = parse_fixity_mapping("sum: over: from,to", "Medium"); + assert_eq!(sum.name, "sum"); + assert_eq!(sum.glue, vec!["over".to_string(), "from,to".to_string()]); + assert!(is_arity_mode(&sum)); + assert_eq!(arity_glue(&sum, 3), Some(vec!["from", "to"])); + assert_eq!(arity_glue(&sum, 1), None); // no zero-word option -> falls back to "of" + + // Binary separator: a single non-comma glue option. + let quotient = parse_fixity_mapping("integer part: divided by", "Medium"); + assert_eq!(quotient.name, "integer part"); + assert_eq!(binary_separator("ient), Some("divided by")); + assert!(!is_arity_mode("ient)); + + // Bracketing: `open; name; close`, with `|` verbosity inside the name. + let norm = parse_fixity_mapping("; norm| norm| norm; end norm", "Verbose"); + assert_eq!((norm.open.as_str(), norm.name.as_str(), norm.close.as_str()), ("", "norm", "end norm")); + Ok(()) + } + #[test] fn silent_underscore() -> Result<()> { let mathml = "silent+e"; diff --git a/src/xpath_functions.rs b/src/xpath_functions.rs index 29215c65f..b917e68ea 100644 --- a/src/xpath_functions.rs +++ b/src/xpath_functions.rs @@ -24,7 +24,7 @@ use crate::definitions::{Definitions, SPEECH_DEFINITIONS, BRAILLE_DEFINITIONS}; use regex::Regex; use crate::pretty_print::mml_to_string; use std::{cell::{Ref, RefCell}, collections::HashMap}; -use log::{debug, error, warn}; +use log::debug; use std::sync::LazyLock; use std::thread::LocalKey; use phf::phf_set; @@ -1323,46 +1323,9 @@ pub struct GetBracketingIntentName; /// This is used to wrap expressions like "the floor of x" rather than just speaking the bare function name. impl GetBracketingIntentName { fn bracketing_words(intent_name: &str, verbosity: &str, fixity: &str, at_start: bool) -> String { - crate::definitions::SPEECH_DEFINITIONS.with(|definitions| { - let definitions = definitions.borrow(); - if let Some(intent_name_pattern) = definitions.get_hashmap("IntentMappings").unwrap().get(intent_name) { - // Split the pattern is: fixity-def [|| fixity-def]* - // fixity-def := fixity=open; verbosity; close - // verbosity := terse | medium | verbose - if let Some(matched_intent) = intent_name_pattern.split("||").find(|&entry| entry.trim().starts_with(fixity)) { - let (_, matched_intent) = matched_intent.split_once("=").unwrap_or_default(); - let name_part = crate::infer_intent::intent_mapping_name_part(matched_intent); - let parts = name_part.split(";").collect::>(); - if parts.len() == 1 { - return "".to_string(); - } - if parts.len() != 3 { - error!("Intent '{}' has {} ';' separated parts, should have 3", intent_name, parts.len()); - return "".to_string(); - } - let mut speech = (if at_start {parts[0]} else {parts[2]}).split(":").collect::>(); - match speech.len() { - 1 => return speech[0].to_string(), - 2 | 3 => { - if speech.len() == 2 { - warn!("Intent '{intent_name}' has only two ':' separated parts, but should have three"); - speech.push(speech[1]); - } - let bracketing_words = match verbosity { - "Terse" => speech[0], - "Medium" => speech[1], - _ => speech[2], - }; - return bracketing_words.to_string(); - }, - _ => { - error!("Intent '{}' has too many ({}) operator names, should only have 2", intent_name, speech.len()); - }, - } - } - }; - return "".to_string(); - }) + // Bracketing words come from the `open; name; close` form of a fixity mapping; the + // parsing lives in infer_intent so all IntentMappings delimiter rules stay in one place. + crate::infer_intent::intent_bracketing_word(intent_name, fixity, verbosity, at_start) } } diff --git a/tests/Languages/en/definitions.rs b/tests/Languages/en/definitions.rs index adbae499c..8f7577c4d 100644 --- a/tests/Languages/en/definitions.rs +++ b/tests/Languages/en/definitions.rs @@ -79,6 +79,24 @@ fn floor_basic() -> Result<()> { Ok(()) } +#[test] +fn ratio_function_basic() -> Result<()> { + let expr = r#" + + + 6 + 3 + + + "#; + + test_prefs("en", "ClearSpeak", vec![("Verbosity", "Terse")], expr, "ratio 6 to 3")?; + test_prefs("en", "ClearSpeak", vec![("Verbosity", "Medium")], expr, "the ratio of 6 to 3")?; + test_prefs("en", "ClearSpeak", vec![("Verbosity", "Verbose")], expr, "the ratio of 6 to 3")?; + test("en", "ClearSpeak", expr, "the ratio of 6 to 3")?; + Ok(()) +} + #[test] fn set_difference_basic() -> Result<()> { let expr = r#" @@ -944,7 +962,7 @@ fn infix_default_fixity_tests() -> Result<()> { ("precedes", "x precedes y"), ("proportional", "x proportional to y"), ("range-separator", "x through y"), - ("ratio", "x ratio y"), + ("ratio", "the ratio of x to y"), ("similar", "x similar to y"), ("subset", "x subset of y"), ("subset-or-equal", "x subset or equal to y"), From 762d492901c6b97cf58f77f5bd1bc1720230113c Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Wed, 30 Sep 2026 00:15:35 -0700 Subject: [PATCH 149/162] shorten 'ratio' def after debugging --- Rules/Languages/en/definitions.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rules/Languages/en/definitions.yaml b/Rules/Languages/en/definitions.yaml index 677d7c78c..fc18be07f 100644 --- a/Rules/Languages/en/definitions.yaml +++ b/Rules/Languages/en/definitions.yaml @@ -327,7 +327,7 @@ "precedes": "infix=precedes", "proportional": "infix=proportional to", "range-separator": "infix=through", - "ratio": "function=ratio : to | the ratio : to | the ratio : to", + "ratio": "function=ratio : to | the ratio : to", "similar": "infix=similar to", "subset": "infix=subset of", "subset-or-equal": "infix=subset or equal to", From a3de867933ecfb05ec90c406b008d15f7baf6c91 Mon Sep 17 00:00:00 2001 From: nsoiffer Date: Wed, 30 Sep 2026 00:32:24 -0700 Subject: [PATCH 150/162] fix clippy warnings (about comments) --- src/infer_intent.rs | 11 +++++------ src/xpath_functions.rs | 6 ++++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/infer_intent.rs b/src/infer_intent.rs index 251be6674..79f813d84 100644 --- a/src/infer_intent.rs +++ b/src/infer_intent.rs @@ -407,12 +407,11 @@ pub fn intent_function_arg_separator(intent_name: &str, fixity: &str, arg_count: // On an exact arity match the glue words are inserted individually (no separator). return if arity_glue(&mapping, arg_count).is_some() { String::new() } else { ",".to_string() }; } - if arg_count == 2 { - if let Some(separator) = binary_separator(&mapping) { - if !separator.eq_ignore_ascii_case("comma") { - return separator.to_string(); - } - } + if arg_count == 2 + && let Some(separator) = binary_separator(&mapping) + && !separator.eq_ignore_ascii_case("comma") + { + return separator.to_string(); } ",".to_string() } diff --git a/src/xpath_functions.rs b/src/xpath_functions.rs index b917e68ea..d4b174adf 100644 --- a/src/xpath_functions.rs +++ b/src/xpath_functions.rs @@ -1204,6 +1204,7 @@ pub struct SpeakIntentName; /// 1. intentName: the intent name, e.g. "factorial" or "ratio" /// 2. verbosity: "Terse", "Medium", or "Verbose" /// 3. fixity: the function fixity, e.g. "prefix", "infix", "postfix" +/// /// Example: /// SpeakIntentName("factorial", "Verbose", "postfix") -> "factorial" /// SpeakIntentName("ratio", "Medium", "infix") -> "ratio" @@ -1230,6 +1231,7 @@ pub struct IntentFunctionUseArityPath; /// 1. intentName: the intent name, e.g. "choose" or "ratio" /// 2. fixity: the function fixity, e.g. "function" or "postfix" /// 3. argCount: the number of arguments supplied to the function +/// /// Example: /// IntentFunctionUseArityPath("choose", "function", 3) -> true /// IntentFunctionUseArityPath("ratio", "function", 2) -> false @@ -1259,6 +1261,7 @@ pub struct IntentFunctionGlueBefore; /// 2. fixity: the function fixity, e.g. "function" /// 3. argIndex: the 1-based argument position to inspect /// 4. argCount: the total number of arguments in the call +/// /// Example: /// IntentFunctionGlueBefore("choose", "function", 2, 3) -> "from" /// IntentFunctionGlueBefore("choose", "function", 3, 3) -> "to" @@ -1288,6 +1291,7 @@ pub struct IntentFunctionArgSeparator; /// 1. intentName: the intent name, e.g. "ratio" or "gcd" /// 2. fixity: the function fixity, e.g. "function" /// 3. argCount: the number of arguments supplied to the function +/// /// Example: /// IntentFunctionArgSeparator("ratio", "function", 2) -> "to" /// IntentFunctionArgSeparator("gcd", "function", 2) -> "and" @@ -1318,6 +1322,7 @@ pub struct GetBracketingIntentName; /// 2. fixity: the fixity, e.g. "prefix" or "postfix" /// 3. verbosity: "Terse", "Medium", or "Verbose" /// 4. startOrEnd: either "start" or "end" +/// /// Example: /// GetBracketingIntentName("floor", "prefix", "Medium", "start") -> "the floor of" /// This is used to wrap expressions like "the floor of x" rather than just speaking the bare function name. @@ -1354,6 +1359,7 @@ pub struct GetNavigationPartName; /// Calling arguments (as used by the rule layer): /// 1. intentName: the intent name, e.g. "fraction" or "power" /// 2. index: the 0-based position of the part to speak +/// /// Example: /// GetNavigationPartName("fraction", 0) -> "numerator" /// GetNavigationPartName("fraction", 1) -> "denominator" From e1692f01841ab6fcfeb0f8d879507d0f294fc6b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Thu, 1 Oct 2026 01:52:38 +0200 Subject: [PATCH 151/162] Normalize tracked files to match .gitattributes (#843) --- Rules/Braille/CMU/unicode-full.yaml | 470 +- Rules/Braille/CMU/unicode.yaml | 1396 ++-- Rules/Braille/Nemeth/unicode.yaml | 704 +-- Rules/Braille/UEB/unicode.yaml | 902 +-- Rules/Braille/Vietnam/unicode.yaml | 1176 ++-- Rules/Languages/en/unicode.yaml | 1068 ++-- Rules/Languages/es/unicode-full.yaml | 6802 ++++++++++---------- Rules/Languages/es/unicode.yaml | 932 +-- Rules/Languages/fi/unicode-full.yaml | 6870 ++++++++++---------- Rules/Languages/fi/unicode.yaml | 964 +-- Rules/Languages/hu/ClearSpeak_Rules.yaml | 1680 ++--- Rules/Languages/hu/unicode.yaml | 1016 +-- Rules/Languages/nb/unicode-full.yaml | 7342 +++++++++++----------- Rules/Languages/nb/unicode.yaml | 972 +-- Rules/Languages/ru/unicode.yaml | 1096 ++-- Rules/Languages/vi/unicode-full.yaml | 6764 ++++++++++---------- Rules/Languages/vi/unicode.yaml | 1036 +-- 17 files changed, 20595 insertions(+), 20595 deletions(-) diff --git a/Rules/Braille/CMU/unicode-full.yaml b/Rules/Braille/CMU/unicode-full.yaml index 558972fcf..5c24c0c8f 100644 --- a/Rules/Braille/CMU/unicode-full.yaml +++ b/Rules/Braille/CMU/unicode-full.yaml @@ -1,235 +1,235 @@ ---- - - "ⅆ": [t: "⠙"] # 0x2146 - - "ⅇ": [t: "⠑"] # 0x2147 - - "ⅈ": [t: "⠊"] # 0x2148 - - "ℭ": [t: "⠾⠕"] # 0x212D (nĂșmeros de Cailey (octoniones)) - - - "𝐚-𝐳": # 0x1d41a - 0x1d433 - - tc: "B" - - spell: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝐀-𝐙": # 0x1d400 - 0x1d419 - - tc: "BC" - - spell: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'abcdefghijklmnopqrstuvwxyz')" - -# don't mark these as italic - - "𝑎-𝑧": # 0x1d44e - 0x1d467 - - tc: "" - - spell: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”đ‘•đ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝐮-𝑍": # 0x1d434 - 0x1d44d - - tc: "C" - - spell: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝒂-𝒛": # 0x1d482 - 0x1d49b - - tc: "B" - - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝑹-𝒁": # 0x1d468 - 0x1d481 - - tc: "BC" - - spell: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'abcdefghijklmnopqrstuvwxyz')" - - - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf - - tc: "Ts" - - spell: "translate('.', 'đ’¶đ’·đ’žđ’čđ’șđ’»đ’Œđ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“„đ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 - - tc: "TsC" - - spell: "translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'abcdefghijklmnopqrstuvwxyz')" - - - "ℊ": [t: "TL⠛⠁"] # 0x210a (Script Small G) - - "ℋ": [t: "TCL⠓⠁"] # 0x210b (Script Capital H) - - "ℒ": [t: "TCL⠇"] # 0x2113 (Script Capital L) - - "ℓ": [t: "TL⠇"] # 0x2113 (Script Small L) - - "℘": [t: "TCL⠏"] # 0x2118 (Script Capital P) - - "ℛ": [t: "TCL⠗"] # 0x211B (Script Capital R) - - "ℯ": [t: "TL⠑"] # 0x212F (Script Small E) - - "ℰ": [t: "TCL⠑"] # 0x2130 (Script Capital E) - - "ℱ": [t: "TCL⠋"] # 0x2131 (Script Capital F) - - "ℳ": [t: "TCL⠍"] # 0x2133 (Script Capital M) - - "℮": [t: "TL⠕"] # 0x21334 (Script Small O) - - "đ“Ș-𝔃": # 0x1d4ea - 0x1d503 - - tc: "BTs" - - spell: "translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 - - tc: "BTsC" - - spell: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝔞-đ”·": # 0x1d51e - 0x1d537 - - tc: "D" - - spell: "translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝔄-𝔝": # 0x1d504 - 0x1d51d - - tc: "DC" - - spell: "translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'abcdefgjklmnopqstuvwxy')" - - - "ℌ": [t: "DCL⠓"] # 0x210C (Fraktur Capital H) - - "ℑ": [t: "DCL⠊"] # 0x2111 (Fraktur Capital I) - - "ℜ": [t: "DCL⠗"] # 0x211C (Fraktur Capital R) - - "ℹ": [t: "DCLâ ”"] # 0x2128 (Fraktur Capital Z) - - "𝕒-đ•«": # 0x1d552 - 0x1d56b - - tc: "đ”č" - - spell: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝔾-𝕐": # 0x1d538 - 0x1d550 (blackboard bold capitals, excluding special number sets) - - tc: "đ”čC" - - spell: "translate('.', '𝔾đ”čđ”»đ”Œđ”œđ”Ÿđ•€đ•đ•‚đ•ƒđ•„đ•†đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'abcdefghijklmnopqrst')" - - - "ℂ": [t: "⠾⠉"] # 0x2102 (nĂșmeros complejos) - - "ℍ": [t: "⠾⠓"] # 0x210D (cuaterniones) - - "ℕ": [t: "⠞⠝"] # 0x2115 (nĂșmeros naturales) - - "ℙ": [t: "⠞⠏"] # 0x2119 (nĂșmeros primos) - - "ℚ": [t: "⠾⠟"] # 0x211A (nĂșmeros racionales) - - "ℝ": [t: "⠾⠗"] # 0x211D (nĂșmeros reales) - - "â„€": [t: "â žâ ”"] # 0x2124 (nĂșmeros enteros) - - - "𝖆-𝖟": # 0x1d586 - 0x1d59f - - tc: "BD" - - spell: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝕬-𝖅": # 0x1d56c - 0x1d585 - - tc: "BDC" - - spell: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'abcdefghijklmnopqrstuvwxyz')" - - - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 - - tc: "S" - - spell: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 - - tc: "SC" - - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝗼-𝘇": # 0x1d5ee - 0x1d607 - - tc: "BS" - - spell: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed - - tc: "BSC" - - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝘱-đ˜»": # 0x1d622 - 0x1d63b - - tc: "S" - - spell: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝘈-𝘡": # 0x1d608 - 0x1d621 - - tc: "SC" - - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝙖-𝙯": # 0x1d656 - 0x1d66f - - tc: "BS" - - spell: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" - - - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 - - tc: "BSC" - - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝚊-𝚣": # 0x1d68a - 0x1d6a3 - - tc: "" - - spell: "translate('.', '𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚱𝚣', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝙰-𝚉": # 0x1d670 - 0x1d689 - - tc: "C" - - spell: "translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'abcdefghijklmnopqrstuvwxyz')" - - - "đš€": [t: "L⠊"] # 0x1d6a4 (dotless i) - - "đš„": [t: "L⠚"] # 0x1d6a5 (dotless j) - - "𝛂-𝛙": # 0x1d6c2 - 0x1d6d9 - - tc: "BGL" - - spell: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙')" - - - "𝚹-𝚿": # 0x1d6a8 - 0x1d6bf - - tc: "BCGL" - - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšż', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšż')" - - - "đ›Œ-𝜓": # 0x1d6fc - 0x1d713 - - tc: "GL" - - spell: "translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“')" - - - "𝛱-đ›č": # 0x1d6e2 - 0x1d6f9 - - tc: "CGL" - - spell: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›č', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›č')" - - - "đœ¶-𝝍": # 0x1d736 - 0x1d74d - - tc: "BGL" - - spell: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđ', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđ')" - - - "𝜜-𝜳": # 0x1d71c - 0x1d733 - - tc: "BCGL" - - spell: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳')" - - - "𝝰-𝞇": # 0x1d770 - 0x1d787 - - tc: "BSGL" - - spell: "translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€đžđž‚đžƒđž„đž…đž†đž‡', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€đžđž‚đžƒđž„đž…đž†đž‡')" - - - "𝝖-𝝭": # 0x1d756 - 0x1d76d - - tc: "BSCGL" - - spell: "translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­')" - - - "đžȘ-𝟁": # 0x1d7aa - 0x1d7c1 - - tc: "BSGL" - - spell: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸ', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸ')" - - - "𝞐-𝞧": # 0x1d790 - 0x1d7a7 - - tc: "BSCGL" - - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§')" - - - "𝟎-𝟗": # 0x1d7ce - 0x1d7d7 - - tc: "BN" - - spell: "translate('.', '𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗', '0123456789')" - - - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 - - tc: "SBN" - - spell: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" - - - "𝟱-đŸ«": # 0x1d7e2 - 0x1d7eb - - tc: "SN" - - spell: "translate('.', 'đŸąđŸŁđŸ€đŸ„đŸŠđŸ§đŸšđŸ©đŸȘđŸ«', '0123456789')" - - - "𝟬-đŸ”": # 0x1d7ec - 0x1d7f5 - - tc: "BSN" - - spell: "translate('.', 'đŸŹđŸ­đŸźđŸŻđŸ°đŸ±đŸČđŸłđŸŽđŸ”', '0123456789')" - - - "đŸ¶-𝟿": # 0x1d7f6 - 0x1d7ff - - tc: "N" - - spell: "translate('.', 'đŸ¶đŸ·đŸžđŸčđŸșđŸ»đŸŒđŸœđŸŸđŸż', '0123456789')" - - - "ÂŒ": [t: "#N⠁Nâ Č"] # 0x00BC (Vulgar Fraction One Quarter) - - "œ": [t: "#N⠁N⠆"] # 0x00BD (Vulgar Fraction One Half) - - "Ÿ": [t: "#N⠒Nâ Č"] # 0x00BE (Vulgar Fraction Three Quarters) - - "⅐": [t: "#N⠁Nâ ¶"] # 0x2150 (Vulgar Fraction One Seventh) - - "⅑": [t: "#N⠁N⠔"] # 0x2151 (Vulgar Fraction One Ninth) - - "⅒": [t: "#N⠁N⠂Nâ Ž"] # 0x2152 (Vulgar Fraction One Tenth) - - "⅓": [t: "#N⠁N⠒"] # 0x2153 (Vulgar Fraction One Third) - - "⅔": [t: "#N⠃N⠒"] # 0x2154 (Vulgar Fraction Two Thirds) - - "⅕": [t: "#N⠁Nâ ą"] # 0x2155 (Vulgar Fraction One Fifth) - - "⅖": [t: "#N⠃Nâ ą"] # 0x2156 (Vulgar Fraction Two Fifths) - - "⅗": [t: "#N⠒Nâ ą"] # 0x2157 (Vulgar Fraction Three Fifths) - - "⅘": [t: "#N⠙Nâ ą"] # 0x2158 (Vulgar Fraction Four Fifths) - - "⅙": [t: "#N⠁N⠖"] # 0x2159 (Vulgar Fraction One Sixth) - - "⅚": [t: "#Nâ ąN⠖"] # 0x215A (Vulgar Fraction Five Sixths) - - "⅛": [t: "#N⠁Nâ Š"] # 0x215B (Vulgar Fraction One Eighth) - - "⅜": [t: "#N⠒Nâ Š"] # 0x215C (Vulgar Fraction Three Eighths) - - "⅝": [t: "#Nâ ąNâ Š"] # 0x215D (Vulgar Fraction Five Eighths) - - "⅞": [t: "#N⠛Nâ Š"] # 0x215E (Vulgar Fraction Seven Eighths) - - "↉": [t: "#N⠚N⠒"] # 0x2189 (Vulgar Fraction Zero Thirds) - - - "̊": [t: "⠈⠎"] # 0x030A (Ring) - - "ˇ": [t: "⠰⠒"] # 0x02C7 (Caron) - - "⌱": [T: "⠈⠒"] # 0x2322 - - "⌣": [T: "⠠⠒"] # 0x2323 - - "⏜": [T: "⠈⠒"] # 0x232DC - - "⏝": [T: "⠠⠒"] # 0x23DD - - - "∟": [t: "â žâ €"] # 0x221F (ĂĄngulo recto) - - "⩜": [t: "â žâ €"] # 0x299C (ĂĄngulo recto) - - "⊝": [t: "â žâ €"] # 0x299D (ĂĄngulo recto) - - "⊚": [t: "â šâ ±"] # 0x29A8 (ĂĄngulo orientado positivo) - - "⊩": [t: "⠹⠜"] # 0x29A9 (ĂĄngulo orientado negativo) - - "ᮗ": [t: "⠱⠜"] # 0x1D17 (arco correspondiente al ĂĄngulo abc) - - "※": [t: "â  â ±"] # 0x293B (vector axial positivo) - - "↷": [t: "⠈⠜"] # 0x21B7 (vector axial negativo) - - - "∟": [t: "⠰⠱⠆"] # 0x223E (homĂłlogo a/semejante a) - - "⌅": [t: "â žâ «"] # 0x2305 (proyectividad) - - "⌆": [t: "â žâ »"] # 0x2306 (perspectividad) +--- + - "ⅆ": [t: "⠙"] # 0x2146 + - "ⅇ": [t: "⠑"] # 0x2147 + - "ⅈ": [t: "⠊"] # 0x2148 + - "ℭ": [t: "⠾⠕"] # 0x212D (nĂșmeros de Cailey (octoniones)) + + - "𝐚-𝐳": # 0x1d41a - 0x1d433 + - tc: "B" + - spell: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝐀-𝐙": # 0x1d400 - 0x1d419 + - tc: "BC" + - spell: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'abcdefghijklmnopqrstuvwxyz')" + +# don't mark these as italic + - "𝑎-𝑧": # 0x1d44e - 0x1d467 + - tc: "" + - spell: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”đ‘•đ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝐮-𝑍": # 0x1d434 - 0x1d44d + - tc: "C" + - spell: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝒂-𝒛": # 0x1d482 - 0x1d49b + - tc: "B" + - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝑹-𝒁": # 0x1d468 - 0x1d481 + - tc: "BC" + - spell: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'abcdefghijklmnopqrstuvwxyz')" + + - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf + - tc: "Ts" + - spell: "translate('.', 'đ’¶đ’·đ’žđ’čđ’șđ’»đ’Œđ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“„đ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 + - tc: "TsC" + - spell: "translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'abcdefghijklmnopqrstuvwxyz')" + + - "ℊ": [t: "TL⠛⠁"] # 0x210a (Script Small G) + - "ℋ": [t: "TCL⠓⠁"] # 0x210b (Script Capital H) + - "ℒ": [t: "TCL⠇"] # 0x2113 (Script Capital L) + - "ℓ": [t: "TL⠇"] # 0x2113 (Script Small L) + - "℘": [t: "TCL⠏"] # 0x2118 (Script Capital P) + - "ℛ": [t: "TCL⠗"] # 0x211B (Script Capital R) + - "ℯ": [t: "TL⠑"] # 0x212F (Script Small E) + - "ℰ": [t: "TCL⠑"] # 0x2130 (Script Capital E) + - "ℱ": [t: "TCL⠋"] # 0x2131 (Script Capital F) + - "ℳ": [t: "TCL⠍"] # 0x2133 (Script Capital M) + - "℮": [t: "TL⠕"] # 0x21334 (Script Small O) + - "đ“Ș-𝔃": # 0x1d4ea - 0x1d503 + - tc: "BTs" + - spell: "translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 + - tc: "BTsC" + - spell: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝔞-đ”·": # 0x1d51e - 0x1d537 + - tc: "D" + - spell: "translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝔄-𝔝": # 0x1d504 - 0x1d51d + - tc: "DC" + - spell: "translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'abcdefgjklmnopqstuvwxy')" + + - "ℌ": [t: "DCL⠓"] # 0x210C (Fraktur Capital H) + - "ℑ": [t: "DCL⠊"] # 0x2111 (Fraktur Capital I) + - "ℜ": [t: "DCL⠗"] # 0x211C (Fraktur Capital R) + - "ℹ": [t: "DCLâ ”"] # 0x2128 (Fraktur Capital Z) + - "𝕒-đ•«": # 0x1d552 - 0x1d56b + - tc: "đ”č" + - spell: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝔾-𝕐": # 0x1d538 - 0x1d550 (blackboard bold capitals, excluding special number sets) + - tc: "đ”čC" + - spell: "translate('.', '𝔾đ”čđ”»đ”Œđ”œđ”Ÿđ•€đ•đ•‚đ•ƒđ•„đ•†đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'abcdefghijklmnopqrst')" + + - "ℂ": [t: "⠾⠉"] # 0x2102 (nĂșmeros complejos) + - "ℍ": [t: "⠾⠓"] # 0x210D (cuaterniones) + - "ℕ": [t: "⠞⠝"] # 0x2115 (nĂșmeros naturales) + - "ℙ": [t: "⠞⠏"] # 0x2119 (nĂșmeros primos) + - "ℚ": [t: "⠾⠟"] # 0x211A (nĂșmeros racionales) + - "ℝ": [t: "⠾⠗"] # 0x211D (nĂșmeros reales) + - "â„€": [t: "â žâ ”"] # 0x2124 (nĂșmeros enteros) + + - "𝖆-𝖟": # 0x1d586 - 0x1d59f + - tc: "BD" + - spell: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝕬-𝖅": # 0x1d56c - 0x1d585 + - tc: "BDC" + - spell: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'abcdefghijklmnopqrstuvwxyz')" + + - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 + - tc: "S" + - spell: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 + - tc: "SC" + - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝗼-𝘇": # 0x1d5ee - 0x1d607 + - tc: "BS" + - spell: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed + - tc: "BSC" + - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝘱-đ˜»": # 0x1d622 - 0x1d63b + - tc: "S" + - spell: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝘈-𝘡": # 0x1d608 - 0x1d621 + - tc: "SC" + - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝙖-𝙯": # 0x1d656 - 0x1d66f + - tc: "BS" + - spell: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" + + - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 + - tc: "BSC" + - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝚊-𝚣": # 0x1d68a - 0x1d6a3 + - tc: "" + - spell: "translate('.', '𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚱𝚣', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝙰-𝚉": # 0x1d670 - 0x1d689 + - tc: "C" + - spell: "translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'abcdefghijklmnopqrstuvwxyz')" + + - "đš€": [t: "L⠊"] # 0x1d6a4 (dotless i) + - "đš„": [t: "L⠚"] # 0x1d6a5 (dotless j) + - "𝛂-𝛙": # 0x1d6c2 - 0x1d6d9 + - tc: "BGL" + - spell: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙')" + + - "𝚹-𝚿": # 0x1d6a8 - 0x1d6bf + - tc: "BCGL" + - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšż', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšż')" + + - "đ›Œ-𝜓": # 0x1d6fc - 0x1d713 + - tc: "GL" + - spell: "translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“')" + + - "𝛱-đ›č": # 0x1d6e2 - 0x1d6f9 + - tc: "CGL" + - spell: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›č', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›č')" + + - "đœ¶-𝝍": # 0x1d736 - 0x1d74d + - tc: "BGL" + - spell: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđ', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđ')" + + - "𝜜-𝜳": # 0x1d71c - 0x1d733 + - tc: "BCGL" + - spell: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳')" + + - "𝝰-𝞇": # 0x1d770 - 0x1d787 + - tc: "BSGL" + - spell: "translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€đžđž‚đžƒđž„đž…đž†đž‡', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€đžđž‚đžƒđž„đž…đž†đž‡')" + + - "𝝖-𝝭": # 0x1d756 - 0x1d76d + - tc: "BSCGL" + - spell: "translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­')" + + - "đžȘ-𝟁": # 0x1d7aa - 0x1d7c1 + - tc: "BSGL" + - spell: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸ', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸ')" + + - "𝞐-𝞧": # 0x1d790 - 0x1d7a7 + - tc: "BSCGL" + - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§')" + + - "𝟎-𝟗": # 0x1d7ce - 0x1d7d7 + - tc: "BN" + - spell: "translate('.', '𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗', '0123456789')" + + - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 + - tc: "SBN" + - spell: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" + + - "𝟱-đŸ«": # 0x1d7e2 - 0x1d7eb + - tc: "SN" + - spell: "translate('.', 'đŸąđŸŁđŸ€đŸ„đŸŠđŸ§đŸšđŸ©đŸȘđŸ«', '0123456789')" + + - "𝟬-đŸ”": # 0x1d7ec - 0x1d7f5 + - tc: "BSN" + - spell: "translate('.', 'đŸŹđŸ­đŸźđŸŻđŸ°đŸ±đŸČđŸłđŸŽđŸ”', '0123456789')" + + - "đŸ¶-𝟿": # 0x1d7f6 - 0x1d7ff + - tc: "N" + - spell: "translate('.', 'đŸ¶đŸ·đŸžđŸčđŸșđŸ»đŸŒđŸœđŸŸđŸż', '0123456789')" + + - "ÂŒ": [t: "#N⠁Nâ Č"] # 0x00BC (Vulgar Fraction One Quarter) + - "œ": [t: "#N⠁N⠆"] # 0x00BD (Vulgar Fraction One Half) + - "Ÿ": [t: "#N⠒Nâ Č"] # 0x00BE (Vulgar Fraction Three Quarters) + - "⅐": [t: "#N⠁Nâ ¶"] # 0x2150 (Vulgar Fraction One Seventh) + - "⅑": [t: "#N⠁N⠔"] # 0x2151 (Vulgar Fraction One Ninth) + - "⅒": [t: "#N⠁N⠂Nâ Ž"] # 0x2152 (Vulgar Fraction One Tenth) + - "⅓": [t: "#N⠁N⠒"] # 0x2153 (Vulgar Fraction One Third) + - "⅔": [t: "#N⠃N⠒"] # 0x2154 (Vulgar Fraction Two Thirds) + - "⅕": [t: "#N⠁Nâ ą"] # 0x2155 (Vulgar Fraction One Fifth) + - "⅖": [t: "#N⠃Nâ ą"] # 0x2156 (Vulgar Fraction Two Fifths) + - "⅗": [t: "#N⠒Nâ ą"] # 0x2157 (Vulgar Fraction Three Fifths) + - "⅘": [t: "#N⠙Nâ ą"] # 0x2158 (Vulgar Fraction Four Fifths) + - "⅙": [t: "#N⠁N⠖"] # 0x2159 (Vulgar Fraction One Sixth) + - "⅚": [t: "#Nâ ąN⠖"] # 0x215A (Vulgar Fraction Five Sixths) + - "⅛": [t: "#N⠁Nâ Š"] # 0x215B (Vulgar Fraction One Eighth) + - "⅜": [t: "#N⠒Nâ Š"] # 0x215C (Vulgar Fraction Three Eighths) + - "⅝": [t: "#Nâ ąNâ Š"] # 0x215D (Vulgar Fraction Five Eighths) + - "⅞": [t: "#N⠛Nâ Š"] # 0x215E (Vulgar Fraction Seven Eighths) + - "↉": [t: "#N⠚N⠒"] # 0x2189 (Vulgar Fraction Zero Thirds) + + - "̊": [t: "⠈⠎"] # 0x030A (Ring) + - "ˇ": [t: "⠰⠒"] # 0x02C7 (Caron) + - "⌱": [T: "⠈⠒"] # 0x2322 + - "⌣": [T: "⠠⠒"] # 0x2323 + - "⏜": [T: "⠈⠒"] # 0x232DC + - "⏝": [T: "⠠⠒"] # 0x23DD + + - "∟": [t: "â žâ €"] # 0x221F (ĂĄngulo recto) + - "⩜": [t: "â žâ €"] # 0x299C (ĂĄngulo recto) + - "⊝": [t: "â žâ €"] # 0x299D (ĂĄngulo recto) + - "⊚": [t: "â šâ ±"] # 0x29A8 (ĂĄngulo orientado positivo) + - "⊩": [t: "⠹⠜"] # 0x29A9 (ĂĄngulo orientado negativo) + - "ᮗ": [t: "⠱⠜"] # 0x1D17 (arco correspondiente al ĂĄngulo abc) + - "※": [t: "â  â ±"] # 0x293B (vector axial positivo) + - "↷": [t: "⠈⠜"] # 0x21B7 (vector axial negativo) + + - "∟": [t: "⠰⠱⠆"] # 0x223E (homĂłlogo a/semejante a) + - "⌅": [t: "â žâ «"] # 0x2305 (proyectividad) + - "⌆": [t: "â žâ »"] # 0x2306 (perspectividad) diff --git a/Rules/Braille/CMU/unicode.yaml b/Rules/Braille/CMU/unicode.yaml index fa027b0b6..b37edce03 100644 --- a/Rules/Braille/CMU/unicode.yaml +++ b/Rules/Braille/CMU/unicode.yaml @@ -1,698 +1,698 @@ ---- -# UEB characters -# -# Some chars that originally came from an Excel spreadsheet, converted to csv, and the greatly expanded -# -# The UEB translation makes use of some non-braille chars as flags -# L -- what follows is a letter -# N -- what follows is a digit -# C -- precedes L for capital letters -# G -- precedes L for Greek Letters (after C for capitals) -# Typeface Indicators ("typeforms") -# B bold, I Italic, S Sans-serif, T script, D, Fraktur, đ”č blackboard-bold -# the type face indicators can be combined with B (first) and I (second) -# Standing alone chars: -# Any character which acts as a standing alone character (e.g, "{") needs each braille symbol to be labeled -# o -- opening/left side, c -- closing/right side, b -- both open and close (e.g, '"') - - - "0": [t: "N⠚"] # 0x30 - - "1": [t: "N⠁"] # 0x31 - - "2": [t: "N⠃"] # 0x32 - - "3": [t: "N⠉"] # 0x33 - - "4": [t: "N⠙"] # 0x34 - - "5": [t: "N⠑"] # 0x35 - - "6": [t: "N⠋"] # 0x36 - - "7": [t: "N⠛"] # 0x37 - - "8": [t: "N⠓"] # 0x38 - - "9": [t: "N⠊"] # 0x39 - -# we stick the drop numbers into the private use area for consistency - - "\ue000": [t: "Nâ Ž"] # 0 - - "\ue001": [t: "N⠂"] # 1 - - "\ue002": [t: "N⠆"] # 2 - - "\ue003": [t: "N⠒"] # 3 - - "\ue004": [t: "Nâ Č"] # 4 - - "\ue005": [t: "Nâ ą"] # 5 - - "\ue006": [t: "N⠖"] # 6 - - "\ue007": [t: "Nâ ¶"] # 7 - - "\ue008": [t: "Nâ Š"] # 8 - - "\ue009": [t: "N⠔"] # 9 - -# we stick hex digits into the private use area for consistency -# these are used when we don't want to add a numeric indicator for subsequent digits (3.3) - - "\ue00A": [t: "N⠐N⠁"] # A - - "\ue00B": [t: "N⠐N⠃"] # B - - "\ue00C": [t: "N⠐N⠉"] # C - - "\ue00D": [t: "N⠐N⠙"] # D - - "\ue00E": [t: "N⠐N⠑"] # E - - "\ue00F": [t: "N⠐N⠋"] # F - -# leave room for the rest of the alphabet - - "\ue01A": [t: "Nâ šN⠁"] # A - - "\ue01B": [t: "Nâ šN⠃"] # B - - "\ue01C": [t: "Nâ šN⠉"] # C - - "\ue01D": [t: "Nâ šN⠙"] # D - - "\ue01E": [t: "Nâ šN⠑"] # E - - "\ue01F": [t: "Nâ šN⠋"] # F - -# Omission char -- there isn't a specific code point, so we use a private use area - - "\ue020": [t: "â °"] # omission (three dot 5s with letter indicator) - - - - "a": [t: "L⠁"] # 0x61 - - "b": [t: "L⠃"] # 0x62 - - "c": [t: "L⠉"] # 0x63 - - "d": [t: "L⠙"] # 0x64 - - "e": [t: "L⠑"] # 0x65 - - "f": [t: "L⠋"] # 0x66 - - "g": [t: "L⠛"] # 0x67 - - "h": [t: "L⠓"] # 0x68 - - "i": [t: "L⠊"] # 0x69 - - "j": [t: "L⠚"] # 0x6a - - "k": [t: "L⠅"] # 0x6b - - "l": [t: "L⠇"] # 0x6c - - "m": [t: "L⠍"] # 0x6d - - "n": [t: "L⠝"] # 0x6e - - "o": # 0x6f - - test: # special case because these have the same dot pattern - if: "preceding-sibling::*[1][self::m:mo and (.='>' or .='≫')]" - then: [t: "⠐"] - - t: "L⠕" - - "p": [t: "L⠏"] # 0x70 - - "q": [t: "L⠟"] # 0x71 - - "r": [t: "L⠗"] # 0x72 - - "s": [t: "L⠎"] # 0x73 - - "t": [t: "L⠞"] # 0x74 - - "u": [t: "Lâ „"] # 0x75 - - "v": [t: "Lâ §"] # 0x76 - - "w": [t: "Lâ ș"] # 0x77 - - "x": [t: "Lâ ­"] # 0x78 - - "y": [t: "Lâ œ"] # 0x79 - - "z": [t: "Lâ ”"] # 0x7a - - - - "ĂĄ": [t: "Lâ ·"] # 0xE1 - - "Ă©": [t: "Lâ ź"] # 0xE9 - - "Ă­": [t: "L⠌"] # 0xED - - "ñ": [t: "Lâ »"] # 0xF1 - - "Ăł": [t: "Lâ Ź"] # 0xF3 - - "Ăș": [t: "Lâ Ÿ"] # 0xFA - - "ĂŒ": [t: "Lâ ł"] # 0xFC - - - "Á": [t: "CLâ ·"] # 0xC0 - - "É": [t: "CLâ ź"] # 0xC9 - - "Í": [t: "CL⠌"] # 0xCD - - "Ñ": [t: "CLâ »"] # 0xD1 - - "Ó": [t: "CLâ Ź"] # 0xD3 - - "Û": [t: "CLâ Ÿ"] # 0xDA - - "Ü": [t: "CLâ ł"] # 0xDC - - # Latin capitals: chem-element letters use đ¶ (no word indicator); others use C. - # Cells come from lowercase a-z via spell/translate. - - "BCHIKNOPSUVWY": # chemistry-capable capitals - - test: - if: "@data-chem-element" - then: [tc: "đ¶"] - else: [tc: "C"] - - spell: "translate('.', 'BCHIKNOPSUVWY', 'bchiknopsuvwy')" - - "ADEFGJLMQRTXZ": # remaining capitals - - tc: "C" - - spell: "translate('.', 'ADEFGJLMQRTXZ', 'adefgjlmqrtxz')" - - - "α": [t: "GL⠁"] # 0x3b1 - - "ÎČ": [t: "GL⠃"] # 0x3b2 - - "Îł": [t: "GL⠛"] # 0x3b3 - - "ÎŽ": [t: "GL⠙"] # 0x3b4 - - "Δ": [t: "GL⠑"] # 0x3b5 - - "ζ": [t: "GLâ ”"] # 0x3b6 - - "η": [t: "GLâ ±"] # 0x3b7 - - "Ξ": [t: "GLâ č"] # 0x3b8 - - "Îč": [t: "GL⠊"] # 0x3b9 - - "Îș": [t: "GL⠅"] # 0x3ba - - "λ": [t: "GL⠇"] # 0x3bb - - "ÎŒ": [t: "GL⠍"] # 0x3bc - - "Μ": [t: "GL⠝"] # 0x3bd - - "Ο": [t: "GLâ ­"] # 0x3be - - "Îż": [t: "GL⠕"] # 0x3bf - - "π": [t: "GL⠏"] # 0x3c0 - - "ρ": [t: "GL⠗"] # 0x3c1 - - "ς": [t: "VL⠎"] # 0x3c2 - - "σ": [t: "GL⠎"] # 0x3c3 - - "τ": [t: "GL⠞"] # 0x3c4 - - "υ": [t: "GLâ „"] # 0x3c5 - - "φ": [t: "GL⠋"] # 0x3c6 - - "χ": [t: "GLâ Ż"] # 0x3c7 - - "ψ": [t: "GLâ œ"] # 0x3c8 - - "ω": [t: "GLâ ș"] # 0x3c9 - - - "Α": [t: "CGL⠁"] # 0x391 - - "Β": [t: "CGL⠃"] # 0x392 - - "Γ": [t: "CGL⠛"] # 0x393 - - "Δ": [t: "CGL⠙"] # 0x394 - - "Ε": [t: "CGL⠑"] # 0x395 - - "Ζ": [t: "CGLâ ”"] # 0x396 - - "Η": [t: "CGLâ ± "] # 0x397 - - "Θ": [t: "CGLâ č"] # 0x398 - - "Ι": [t: "CGL⠊"] # 0x399 - - "Κ": [t: "CGL⠅"] # 0x39a - - "Λ": [t: "CGL⠇"] # 0x39b - - "Μ": [t: "CGL⠍"] # 0x39c - - "Ν": [t: "CGL⠝"] # 0x39d - - "Ξ": [t: "CGLâ ­"] # 0x39e - - "Ο": [t: "CGL⠕"] # 0x39f - - "Π": [t: "CGL⠏"] # 0x3a0 - - "ÎĄ": [t: "CGL⠗"] # 0x3a1 - - "Îą": [t: "CGL⠎"] # 0x3a2 - - "ÎŁ": [t: "CGL⠎"] # 0x3a3 - - "΀": [t: "CGL⠞"] # 0x3a4 - - "΄": [t: "CGLâ „"] # 0x3a5 - - "Ί": [t: "CGL⠋"] # 0x3a6 - - "Χ": [t: "CGLâ Ż"] # 0x3a7 - - "Κ": [t: "CGLâ œ"] # 0x3a8 - - "Ω": [t: "CGLâ ș"] # 0x3a9 - - - "ϑ": [t: "VLâ č"] # 0x3d1 - - "Ï”": [t: "VL⠑"] # 0x3f5 - - "ϰ": [t: "VL⠅"] # 0x3f0 - - "ϕ": [t: "VL⠋"] # 0x3d5 - - "ϱ": [t: "VL⠗"] # 0x3f1 - - "ϖ": [t: "VL⠏"] # 0x3d6 - - "Ϝ": [t: "VLâ §"] # 0x3d7 - - - "”": [t: "GL⠍"] # 0x00B5 (Micro (Greek mu)) - - "℩": [t: "CGLâ ș"] # 0x2126 (Ohm sign (capital Greek omega)) - - "∆": [t: "â žâ Š"] # 0x2206 (Increment) - - "∏": # 0x220F (Product (capital Greek pi)) - - t: "CGL⠏" - - test: - if: "not(IsNode(.., 'modified'))" - then: [t: "â ±"] - - "∐": # 0x2210 (CoProduct (capital Greek pi)) - - t: "⠘⠻" - - test: - if: "not(IsNode(.., 'modified'))" - then: [t: "â ±"] - - "∑": # 0x2211 (Sum (capital Greek sigma)) - - t: "CGL⠎" - - test: - if: "not(IsNode(.., 'modified'))" - then: [t: "â ±"] - - - "<": [t: "â Ș"] # 0x003C (Less than) - - "≹": [t: "â Ș"] # 0x2268 (Less-Than But Not Equal To) - - "⋩": [t: "â Ș"] # 0x22E6 (Less-Than But Not Equivalent To) - - ">": [t: "⠕"] # 0x003E (Greater than) - - "≩": [t: "⠕"] # 0x2269 (Greater-Than But Not Equal To) - - "⋧": [t: "⠕"] # 0x22E7 (Greater-Than But Not Equivalent To) -# - "≼": [t: "⠈⠣⠈⠱"] # 0x226E (Not less than) -# - "≯": [t: "⠈⠜⠈⠱"] # 0x226F (Not greater than) -# - "≰": [t: "⠞⠈⠣⠈⠱"] # 0x2270 (Neither less than nor equal to) -# - "≱": [t: "⠞⠈⠜⠈⠱"] # 0x2271 (Neither greater than nor equal to) -# - "∝": [t: "⠞⠐⠶"] # 0x221D (Proportional to) -# - "≃": [t: "⠾⠔"] # 0x2243 (Approximately equal to (tilde over horizontal line)) -# - "≅": [t: "⠐⠾⠔"] # 0x2245 (Approximately equal to (tilde over equals sign)) -# - "≏": [t: "⠘⠐⠶"] # 0x224F (Equals with bump in top bar (difference between)) -# - "≱": [t: "⠞⠿⠈⠱"] # 0x2262 (Not identical to) -# - "∈": [t: "⠘⠑"] # 0x2208 (Element of (member of)) -# - "∉": [t: "⠘⠑⠈⠱"] # 0x2209 (Not Element of) - - "+": [t: "⠖"] # 0x002B (Plus sign) -# - "∋": [t: "⠈⠘⠑"] # 0x220B (Contains) -# - "⊂": [t: "⠘⠣"] # 0x2282 (Subset of) -# - "⊃": [t: "⠘⠜"] # 0x2283 (Superset of) -# - "⊆": [t: "⠞⠘⠣"] # 0x2286 (Subset of or equal) -# - "⊇": [t: "⠾⠘⠜"] # 0x2287 (Superset of or equal) -# - "⊊": [t: "⠚⠘⠣"] # 0x228A (Subset of with not equal) -# - "⊋": [t: "⠹⠘⠜"] # 0x228B (Superset of with not equal) -# - "âŠČ": [t: "⠈⠞⠣"] # 0x22B2 (Normal subgroup of) -# - "⊳": [t: "⠈⠾⠜"] # 0x22B3 (Contains as normal subgroup) -# - "⊮": [t: "â žâ žâ Ł"] # 0x22B4 (Normal subgroup of or equal) -# - "⊔": [t: "⠾⠾⠜"] # 0x22B5 (Contains as normal subgroup or equal) -# - "⋬": [t: "â šâ žâ Ł"] # 0x22EC (not normal subgroup) -- this isn't the same as what is in GTM 10, but that similar has no Unicode equiv -# - "⋭": [t: "â šâ žâ Ł"] # 0x22ED (does not contain as normal subgroup) -- this isn't the same as what is in GTM 10, but that similar has no Unicode equiv -# - "⊱": [t: "⠾⠒"] # 0x22a2 (Right tack) -# - "⊣": [t: "⠈⠾⠒"] # 0x22a3 (Left tack) - - "−": [t: "⠐⠀"] # 0x2212 (Minus sign) - - "·": [t: "⠠𝘄"] # 0x00B7 (Multiplication dot (times)) -# - "∗": [t: "⠐⠔"] # 0x2217 (Asterisk operator) - - "∘": [t: "⠠⠆"] # 0x2218 (Ring operator) value based on last row in 5.1 (probably what they should have used) - - "◩": [t: "⠠⠆"] # 0x25E6 (White bullet) (value based on 2218) - - "⋅": [t: "⠰⠄"] # 0x22C5 (Dot operator)(value based on 2218) -# - "∖": [t: "â žâ Ą"] # 0x2216 (Set minus) - - "(": [t: "â Ł"] # 0x0028 (Left parenthesis) - - ")": [t: "⠜"] # 0x0029 (Right parenthesis) - - "[": [t: "â ·"] # 0x005B (Left square bracket) - - "]": [t: "â Ÿ"] # 0x005D (Right square bracket) - - "!": # 0x21 (Exclamation (factorial)) - - test: # CMU seems to use a different char for factorial (7.5) -- this weak guess for factorial - if: "self::m:mo and preceding-sibling::*" - then: [t: "⠘⠄"] - else: [t: "⠖"] - - "&": [t: "â  â Ż"] # 0x26 (Ampersand) - - "*": [t: "â Č"] # 0x002A (Asterisk) - - "?": [t: "â ą"] # 0x003F (Question mark) - - "Âż": [t: "â ą"] # 0x00BF (Question mark) - - "@": [t: "⠐"] # 0x0040 (Commercial at sign) - - "^": # 0x005E (Caret (hat, up arrow)) 4.3.2 uses one form as a circumflex, and 11.1 as a geometric angle - - test: # it is not clear how to distinguish one form from another -- the following passes the tests, but is almost certainly wrong - - if: "..[self::m:mover][ *[1][self::m:mi and string-length(.)=1 and translate(., 'abcdefghijklmnopqrstuvwxyz', '') = ''] ]" - then: [t: "⠰⠒"] # circumflex - else: [t: "⠘⠒"] # angle and everything else - - "_": [t: "â €"] # 0x005F (Low line (underscore)) - - "ÂŻ": [t: "⠈⠉"] # 0x00AF (macron) - - "═": [t: "⠈⠉⠈⠉"] # 0x2550 (BOX DRAWINGS DOUBLE HORIZONTAL) - - "~": # 0x007E (Tilde (swung dash)) - - test: # unclear what really should happen see 4.3.2, 4.3.3, 6.1, and 8.2 -- all use different codes - - if: "..[self::m:mover]" - then: [t: "⠐⠹"] - - else_if: "..[self::m:munder]" - then: [t: "â  â ą"] - - else_if: "not(preceding-sibling::*)" - then: [t: "⠠⠄"] # (8.2 -- prefix?) - else: [t: "⠐⠹⠠"] # (6.1 -- infix?) - - ∌: # 223c (Tilde operator) - - test: # unclear what really should happen see 4.3.2, 4.3.3, 6.1, and 8.2 -- all use different codes - - if: "..[self::m:mover]" - then: [t: "⠐⠹"] - - else_if: "..[self::m:munder]" - then: [t: "â  â ą"] - - else_if: "not(preceding-sibling::*)" - then: [t: "⠠⠄"] # (8.2 -- prefix?) - else: [t: "⠐⠹⠠"] # (6.1 -- infix?) - - "—": [t: "⠀⠀"] # 0x2014 (Em dash) - - "‖": [t: "⠾⠇"] # 0x2016 -# - "Š": [t: "â šâ ł"] # 0x00A6 (Broken bar) -# - "ÂŹ": [t: "⠈â č"] # 0x00AC (Not sign) - - "°": [t: "â Ž"] # 0x00B0 (Degree sign) - - "ÂČ": [t: "â Ąâ Œâ ƒâ ‰"] # 0x00B2 (superscripted 2) - - "Âł": [t: "â Ąâ Œâ ‰"] # 0x00B3 (superscripted 3) -# - "†": [t: "⠈⠠â č"] # 0x2020 (Dagger) -# - "‡": [t: "⠈⠠⠻"] # 0x2021 (Double dagger) -# - "‰": [t: "â žâ Žâ Ž"] # 0x2030 (Per mille) - - "â€Č": [t: "â ł"] # 0x2032 (Prime sign) - - "″": [t: "â łâ ł"] # 0x2033 (Double prime sign) - - "‮": [t: "â łâ łâ ł"] # 0x2034 (Triple prime sign) -# - "Å": [t: "⠠⠘⠫⠁"] # 0x212B (Angstrom symbol) -# - "Å": [t: "⠠⠘⠫⠁"] # 0x00C5 (WIRIS uses this for Angstrom) -# - "∀": [t: "⠘⠁"] # 0x2200 (For all) - - "∂": [t: "⠾⠙"] # 0x2202 (Partial differential) -# - "∃": [t: "⠘⠹"] # 0x2203 (There exists) -# - "∄": [t: "⠘⠹⠈⠱"] # 0x2204 (There does not exist) -# - "∅": [t: "⠈⠚"] # 0x2205 (Empty set) -# - "∎": [t: "⠞⠫⠌⠙t"] # 0x220E (End of proof) -# - "√": [t: "⠐⠩"] # 0x221A (Square root (radical) without vinculum) -# - "∠": [t: "â žâ Ș"] # 0x2220 (Angle) -# - "∥": [t: "â šâ žâ Ș"] # 0x2221 (Measured angle) -# - "⊟": [t: "⠌⠞â Ș"] # 0x22BE (Right angle with arc) - - "∫": # 0x222B (Integral) - - t: "â Ż" - - test: - if: "not(IsNode(.., 'modified'))" - then: [t: "â ±"] - - "∏": # 0x222c (Double integral) - - t: "â Żâ Ż" - - test: - if: "not(IsNode(.., 'modified'))" - then: [t: "â ±"] - - "∭": # 0x222d (Triple integral) - - t: "â Żâ Żâ Ż" - - test: - if: "not(IsNode(.., 'modified'))" - then: [t: "â ±"] - - "∟": # 0x222E (Contour integral (closed line integral)) - - t: "â Żâ Ž" - - test: - if: "not(IsNode(.., 'modified'))" - then: [t: "â ±"] -# - "∷": [t: "⠒⠒"] # 0x2237 (Proportion) -# - "∣": [t: "â žâ ł"] # 0x2223 (Divides) -# - "∀": [t: "⠞⠳⠈⠱"] # 0x2224 (Does not divide) - - "←": # 0x2190 (Leftwards arrow) - - test: # this is a guess as to when to use each - if: # mi on either side or if parent is mover, mi on either side of the parent (e.g., A⟶B or labeled arrow) - - "(..[self::m:mrow] and preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]) or " - - "(..[self::m:mover][ ..[self::m:mrow][preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]] ])" - then: [t: "⠐⠒⠒"] # 9.1 - else: [t: "⠐⠒"] # 9.2 - - "⟔": # 0x27F5 (Long leftwards arrow) - - test: # this is a guess as to when to use each - if: # mi on either side or if parent is mover, mi on either side of the parent (e.g., A⟶B or labeled arrow) - - "(..[self::m:mrow] and preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]) or " - - "(..[self::m:mover][ ..[self::m:mrow][preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]] ])" - then: [t: "⠐⠒⠒"] # 9.1 - else: [t: "⠐⠒"] # 9.2 - - "→": # 0x2192 (Rightwards arrow) - - test: # this is a guess as to when to use each - if: # mi on either side or if parent is mover, mi on either side of the parent (e.g., A⟶B or labeled arrow), but rule out limit - - "(" - - " (..[self::m:mrow] and preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]) or " - - " (..[self::m:mover][ ..[self::m:mrow][preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]] ])" - - ") and" - - "not(../..[self::m:munder or self::m:msub][*[1][self::m:mi and starts-with(., 'lim')]])" - then: [t: "⠒⠒⠂"] # 9.1 - else: [t: "⠒⠂"] # 9.2 - - "⟶": # 0x27F6 (Long rightwards arrow) - - test: # this is a guess as to when to use each - if: # mi on either side or if parent is mover, mi on either side of the parent (e.g., A⟶B or labeled arrow), but rule out limit - - "(" - - " (..[self::m:mrow] and preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]) or " - - " (..[self::m:mover][ ..[self::m:mrow][preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]] ])" - - ") and" - - "not(../..[self::m:munder or self::m:msub][*[1][self::m:mi and starts-with(., 'lim')]])" - then: [t: "⠒⠒⠂"] # 9.1 - else: [t: "⠒⠂"] # 9.2 - - "⇀": # 0x21C0 (RIGHTWARDS HARPOON WITH BARB UPWARDS) [not mentioned in spec] - - test: # this is a guess as to when to use each - if: # mi on either side or if parent is mover, mi on either side of the parent (e.g., A⟶B or labeled arrow), but rule out limit - - "(" - - " (..[self::m:mrow] and preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]) or " - - " (..[self::m:mover][ ..[self::m:mrow][preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]] ])" - - ") and" - - "not(../..[self::m:munder or self::m:msub][*[1][self::m:mi and starts-with(., 'lim')]])" - then: [t: "⠒⠒⠂"] # 9.1 - else: [t: "⠒⠂"] # 9.2 - - "↔": # 0x2194 (Left right arrow) - - test: # this is a guess as to when to use each - if: # mi on either side or if parent is mover, mi on either side of the parent (e.g., A⟶B or labeled arrow) - - "(..[self::m:mrow] and preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]) or " - - "(..[self::m:mover][ ..[self::m:mrow][preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]] ])" - then: [t: "⠐⠒⠒⠂"] # 9.1 - else: [t: "⠐⠒⠂"] # 9.2 - - "⟷": # 0x27F7 (Long Left right arrow) - - test: # this is a guess as to when to use each - if: # mi on either side or if parent is mover, mi on either side of the parent (e.g., A⟶B or labeled arrow) - - "(..[self::m:mrow] and preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]) or " - - "(..[self::m:mover][ ..[self::m:mrow][preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]] ])" - then: [t: "⠐⠒⠒⠂"] # 9.1 - else: [t: "⠐⠒⠂"] # 9.2 -# - "↚": [t: "1â łâ Ș⠈⠱"] # 0x219A (Leftwards arrow with stroke) -# - "↛": [t: "1â łâ •â ˆâ ±"] # 0x219B (Rightwards arrow with stroke) -# - "↜": [t: "1⠳⠔⠱â Ș"] # 0x219C (Leftwards wave arrow) -# - "↝": [t: "1⠳⠱⠔⠕"] # 0x219D (Rightwards wave arrow) -# - "↞": [t: "1⠳⠒⠗⠗â Ș"] # 0x219E (Leftwards two headed arrow) -# - "↟": [t: "1⠳⠒⠗⠗⠬"] # 0x219F (Upwards two headed arrow) -# - "↠": [t: "1⠳⠒⠗⠗⠕"] # 0x21A0 (Rightwards two headed arrow) -# - "↡": [t: "1â łâ ’â —â —â ©"] # 0x21A1 (Downwards two headed arrow) -# - "↱": [t: "1⠳⠗⠗â Ș"] # 0x21A2 (Leftwards arrow with tail) -# - "↣": [t: "1⠳⠗⠗⠕"] # 0x21A3 (Rightwards arrow with tail) -# - "ↀ": [t: "1⠳⠳⠗â Ș"] # 0x21A4 (Leftwards arrow from bar) -# - "ↄ": [t: "1⠳⠳⠗⠬"] # 0x21A5 (Upwards arrow from bar) -# - "↩": [t: "1⠳⠳⠗⠕"] # 0x21A6 (Rightwards arrow from bar) -# - "↧": [t: "1â łâ łâ —â ©"] # 0x21A7 (Downwards arrow from bar) -# - "↭": [t: "1â łâ ș⠔⠱⠗⠕"] # 0x21AD (Left right wave arrow) -# - "↼": [t: "1â łâ ș⠗⠕⠈⠱"] # 0x21AE (Left right arrow with stroke) -# - "↰": [t: "1â łâ Žâ Ź"] # 0x21B0 (Upwards arrow with tip left) -# - "↱": [t: "1â łâ Čâ Ź"] # 0x21B1 (Upwards arrow with tip right) -# - "â†Č": [t: "1â łâ Čâ ©"] # 0x21B2 (Downwards arrow with tip left) -# - "↳": [t: "1â łâ Žâ ©"] # 0x21B3 (Downwards arrow with tip right) -# - "↶": [t: "1⠳⠔⠔â Ș"] # 0x21B6 (Anticlockwise top semicircle arrow) -# - "↷": [t: "1⠳⠱⠱⠕"] # 0x21B7 (Clockwise top semicircle arrow) -# - "↌": [t: "1⠳⠈⠗â Ș"] # 0x21BC (Leftwards harpoon with barb upwards) -# - "↜": [t: "1⠳⠠⠗â Ș"] # 0x21BD (Leftwards harpoon with barb downwards) -# - "↟": [t: "1⠳⠠⠗⠬"] # 0x21BE (Upwards harpoon with barb rightwards) -# - "↿": [t: "1⠳⠈⠗⠬"] # 0x21BF (Upwards harpoon with barb leftwards) -# - "⇀": [t: "1⠳⠈⠗⠕"] # 0x21C0 (Rightwards harpoon with barb upwards) -# - "⇁": [t: "1⠳⠠⠗⠕"] # 0x21C1 (Rightwards harpoon with barb downwards) -# - "⇂": [t: "1â łâ ˆâ —â ©"] # 0x21C2 (Downwards harpoon with barb rightwards) -# - "⇃": [t: "1â łâ  â —â ©"] # 0x21C3 (Downwards harpoon with barb leftwards) -# - "⇄": [t: "1⠳⠕⠻⠳â Ș"] # 0x21C4 (Rightwards arrow over leftwards arrow) -# - "⇅": [t: "1â łâ Źâ żâ łâ ©"] # 0x21C5 (Upwards arrow left of Downwards arrow) -# - "⇌": [t: "⠘⠞⠶"] # 0x21CC (Rightwards harpoon over leftwards harpoon (equilibrium)) -# - "⇑": [t: "1â łâ ¶â Ź"] # 0x21D1 (Upwards double arrow) -# - "⇓": [t: "1â łâ ¶â ©"] # 0x21D3 (Downwards double arrow) -# - "⇕": [t: "1â łâ șâ ¶â —â Ź"] # 0x21D5 (Up down double arrow) -# - "⇠": [t: "1⠳⠂â Ș"] # 0x21E0 (Leftwards dashed arrow) -# - "⇡": [t: "1⠳⠂⠬"] # 0x21E1 (Upwards dashed arrow) -# - "⇱": [t: "1⠳⠂⠕"] # 0x21E2 (Rightwards dashed arrow) -# - "⇣": [t: "1â łâ ‚â ©"] # 0x21E3 (Downwards dashed arrow) -# - "â„‚": [t: "â žâ ¶"] # 0x2942 (Rightwards arrow above short leftwards arrow (equilibrium, trend to the right)) -# - "â„„": [t: "⠈⠞⠶"] # 0x2944 (Short rightwards arrow above leftwards arrow (equilibrium, trend to the left)) -# - "â–€": [t: "⠚⠫⠌⠙t"] # 0x25A4 (Square with horizontal fill) -# - "â–„": [t: "⠚⠫⠌⠙t"] # 0x25A5 (Square with vertical fill) -# - "▩": [t: "⠚⠫⠌⠙t"] # 0x25A6 (Square with orthogonal crosshatch fill) -# - "▧": [t: "⠚⠫⠌⠙t"] # 0x25A7 (Square with upper left to lower right fill) -# - "▹": [t: "⠚⠫⠌⠙t"] # 0x25A8 (Square with upper right to lower left fill) -# - "▩": [t: "⠚⠫⠌⠙t"] # 0x25A9 (Square with diagonal crosshatch fill) -# - "◍": [t: "â šâ «â żt"] # 0x25CD (Circle with vertical fill) -# - "▱": [t: "1⠫⠈⠌⠙t"] # 0x25B1 (Parallelogram) -# - "â–Č": [t: "⠞⠫⠌⠉t"] # 0x25B2 (Filled triangle) -# - "■": [t: "⠞⠫⠌⠙t"] # 0x25A0 (Filled square) -# - "≜": [t: "⠠⠚⠙⠻⠐⠶"] # 0x225C (Delta equal to) -# - "≝": [t: "1â Łâ ™â ‘â ‹â œâ »â â ¶"] # 0x225D (Equal to by definition) -# - "⊕": [t: "1â «â żâ Ș⠐⠖t"] # 0x2295 (Circled plus) -# - "⊖": [t: "1â «â żâ Ș⠐⠀t"] # 0x2296 (Circled minus) -# - "⊗": [t: "1â «â żâ Ș⠐⠊t"] # 0x2297 (Circled times) -# - "⊛": [t: "1â «â żâ Ș⠐⠔t"] # 0x229B (Circled asterisk operator) -# - "⊞": [t: "1⠫⠌⠙â Ș⠐⠖t"] # 0x229E (Squared plus) -# - "⊟": [t: "1⠫⠌⠙â Ș⠐⠀t"] # 0x229F (Squared minus) -# - "⊠": [t: "1⠫⠌⠙â Ș⠐⠊t"] # 0x22A0 (Squared times) -# - "⋇": [t: "1⠌⠯⠩"] # 0x22C7 (Division times) -# - "⊩": [t: "⠾⠳⠿⠾⠒"] # 0x22A9 (Forces) - - "˙": [t: "⠈"] # 0x02D9 ( Dot Above) - - "š": [t: "⠈⠈"] # 0x00A8 ( Diaeresis/Double Dot Above ) - - "⃛": [t: "⠈⠈⠈"] # 0x20db (combining triple dot) - - "©": [t: "⠣⠹⠉⠜"] # 0xa9 (Copyright) - - "Âź": [t: "⠣⠹⠗⠜"] # 0xa9 (Registered sign) - - - "
": [t: "⠄⠄⠄"] # 0x2026 (Ellipsis) - - "⋯": [t: "⠄⠄⠄"] # 0x22EF (mid-line Ellipsis) -- seems to be same based on Example 10.1.3 - - -# All the quotes are the same - - "\"": [t: "â Š"] - - "'": [t: "⠄"] - - "“": [t: "â Š"] # 0x201C - - "”": [t: "â Š"] # 0x201C - - "‘": [t: "â Š"] - - "’": # 0x2019 (2.3_3) - - test: - if: "self::m:mn" - then: [t: "N⠂"] # same as '.' block separator - else: [t: "â Š"] - - "«": [t: "â Š"] - - "»": [t: "â Š"] - - - " ": # 0x20 (Space) - - test: - - if: "self::m:mn" - then: [t: "N⠄"] - - else_if: "@data-added='missing-content' or @data-empty-in-2D or @width > 1.1" - then: [t: "⠰⠀⠆"] # omission - - else_if: "@width < 0.25" - then: [t: ""] # tweaking space -- ignore - else: [t: "W"] # space in text or wide enough space - - " ": # 0xa0 (Non-breaking Space) - - test: - - if: "self::m:mn" - then: [t: "N⠄"] - else: [t: "W"] - - ",": # 0x2c (Comma) - - test: - if: "self::m:mn" - then: [t: "N⠂"] - else: [t: "W⠂"] - - ".": # 0x2e (Period) -- 2.3 says that if this is acting like a decimal separator, it should be brailled like "," - - test: - if: "self::m:mn" - then: - # presunme this is likely uses "," for a decimal separator, so just do a few checks - # 1. if there are < 3 chars after the first ".", then not a block separator - # 2. if there is a '.' or other likely block separator after the first '.', then not decimal separator - # likely other (complicated?) other tests that could be used - - with: - variables: [StringAfter: "substring-after(., '.')"] - replace: - - test: - if: "string-length($StringAfter) >= 3 and string-length($StringAfter)=string-length( translate($StringAfter, $BlockSeparators, '') )" - then: [t: "N⠄"] # really is a block separator - else: [t: "N⠂"] # treat as decimal separator - else: [t: "W⠄"] - - ":": [t: "⠐⠂"] # 0x003A (Colon) - - "-": [t: "â €"] # 0x2d (Minus sign or hyphen) - - "⁥": [t: ""] # 0x2061⁥ (invisible function apply) - - "⁹": [t: ""] # 0x2062 (invisible times) - - "⁣": [t: ""] # 0x2063⁥ (invisible separator) - - "⁀": [t: ""] # 0x2064 (invisible plus) - - - "`": [t: "â ą"] # 0x0060 (GRAVE ACCEN) - - - "ڐ": [t: "â  â ł"] # 0x05D0 (aleph) - - "○": [t: "â Ș⠕"] # 0x25CB (cĂ­rculo) - - "∞": [t: "â Œâ ł"] # 0x221E (infinito) - - "⎔": [t: "⠯⠕"] # 0x2394 (polĂ­gono) - - "‰": [t: "â žâ Žâ Ž"] # 0x2030 (tanto por mil) - - "ÂŹ": [t: "⠠⠄"] # 0x00AC (negaciĂłn lĂłgica) - - "↕": [t: "⠾⠅"] # 0x2195 (flecha arriba-abajo) - - "↖": [t: "⠐⠥"] # 0x2196 (flecha oblicua arriba-izquierda) - - "↙": [t: "⠐⠌"] # 0x2199 (flecha abajo-izquierda) - - "↓": [t: "⠾⠄"] # 0x2193 (flecha hacia abajo) - - "↘": [t: "⠡⠂"] # 0x2198 (flecha oblicua abajo-derecha) - - "↗": [t: "⠌⠂"] # 0x2197 (flecha arriba-derecha) - - "↑": [t: "⠞⠁"] # 0x2191 (flecha hacia arriba) - - "△": [t: "â  â Ÿ"] # 0x25B3 (Triangle) - - "▭": [t: "â Żâ œ"] # 0x25AD (rectĂĄngulo) - - "□": [t: "â žâ œ"] # 0x25A1 (cuadrado) - - "âŸș": [t: "â Ș⠒⠕"] # 0x27FA (doble implicaciĂłn «si y solo si») - - "⟾": [t: "â Ș⠒"] # 0x27F8 (implicaciĂłn recĂ­proca; porque) - - "âŸč": [t: "⠒⠕"] # 0x27F9 (implicaciĂłn directa; implica) - - "⇔": [t: "â Ș⠒⠕"] # 0x21D4 (LEFT RIGHT DOUBLE ARROW) - - "⇐": [t: "â Ș⠒"] # 0x21D0 (LEFTWARDS DOUBLE ARROW) - - "⇒": [t: "⠒⠕"] # 0x21D2 (RIGHTWARDS DOUBLE ARROW) - - "‥": [t: "⠐⠡⠂"] # 0x2921 (flecha abajo-derecha y arriba izquierda) - - "‹": [t: "⠐⠌⠂"] # 0x2922 (flecha abajo-izquierda y arriba derecha) - - "⌋": [t: "â  â Ÿ"] # 0x230B (cerrar suelo) - - "⌊": [t: "⠷⠄"] # 0x230A (abrir suelo) - - "⌉": [t: "⠐⠟"] # 0x2309 (cerrar techo) - - "⌈": [t: "⠷⠂"] # 0x2308 (abrir techo) - - "⋩": [t: "⠕⠂"] # 0x22E9 (posterior a MULTI) - - "⋹": [t: "⠐â Ș"] # 0x22E8 (anterior a MULTI) - - "⋟": [t: "⠕⠂⠶"] # 0x22DF (posterior o igual a) - - "⋞": [t: "⠐â Șâ ¶"] # 0x22DE (anterior o igual a) - - "⋝": [t: "⠕⠶"] # 0x22DD (mayor o igual que MULTI) - - "⋜": [t: "â Șâ ¶"] # 0x22DC (menor o igual que MULTI) - - "⋏": [t: "â žâ Ł"] # 0x22CF (proposiciĂłn falsa) - - "⋎": [t: "⠾⠎"] # 0x22CE (proposiciĂłn verdadera) - - "⹂": [t: "â Șâ Š"] # 0x2A02 (producto tensorial) - - "⚁": [t: "â Ș⠖"] # 0x2A01 (suma directa) - - "⋃": # 0x22C3 (uniĂłn de una familia de conjuntos) - - t: "⠿⠜" - - test: - if: "not(IsNode(.., 'modified'))" - then: [t: "â ±"] - - "⋂": # 0x22C2 (intersecciĂłn de una familia de conjuntos) - - t: "â żâ ±" - - test: - if: "not(IsNode(.., 'modified'))" - then: [t: "â ±"] - - "⋁": # 0x22C1 (disyunciĂłn de una familia de proposiciones) - - t: "⠿⠊" - - test: - if: "not(IsNode(.., 'modified'))" - then: [t: "â ±"] - - "⋀": # 0x22C0 (conjunciĂłn de una familia de proposiciones) - - t: "â żâ ą" - - test: - if: "not(IsNode(.., 'modified'))" - then: [t: "â ±"] - - "⊿": [t: "â žâ Š"] # 0x22BF (triĂĄngulo rectĂĄngulo) - - "⊩": [t: "â žâ ¶"] # 0x22A9 (tautologĂ­a) - - "⊼": [t: "⠘⠞⠶"] # 0x22AE (no tautologĂ­a) - - "⊇": [t: "⠰⠜"] # 0x2287 (incluye o es igual a) - - "⊉": [t: "⠘⠰⠜"] # 0x2289 (no incluye ni es igual a) - - "⊆": [t: "⠣⠆"] # 0x2286 (incluido o es igual a) - - "⊈": [t: "⠘⠣⠆"] # 0x2288 (no incluido ni es igual a) - - "⊃": [t: "⠠⠜"] # 0x2283 (Incluye; tiene como subconjunto) - - "⊅": [t: "⠘⠠⠜"] # 0x2285 (no incluye a) - - "⊂": [t: "⠣⠄"] # 0x2282 (Incluido; subconjunto) - - "⊄": [t: "⠘⠣⠄"] # 0x2284 (no incluido en) - - "⋡": [t: "⠘⠕⠂⠶"] # 0x22E1 (no es posterior ni igual a) - - "≜": [t: "⠕⠂⠶"] # 0x227D (sigue o igual a) - - "⋠": [t: "⠘⠐â Șâ ¶"] # 0x22E0 (no es anterior ni igual a) - - "≌": [t: "⠐â Șâ ¶"] # 0x227C (precede o igual a) - - "â‰č": [t: "⠘⠕â Ș"] # 0x2279 (ni mayor ni menor que) - - "≾": [t: "⠘⠕â Ș"] # 0x2278 (ni mayor ni menor que) - - "≧": [t: "⠕⠶"] # 0x2267 (mayor o igual que MULTI) - - "≩": [t: "â Șâ ¶"] # 0x2266 (menor o igual que MULTI) - - "≱": [t: "⠘⠕⠶"] # 0x2271 (no es mayor ni igual que) - - "≄": [t: "⠕⠶"] # 0x2265 (mayor o igual que MULTI) - - "≀": [t: "â Șâ ¶"] # 0x2264 (menor o igual que MULTI) - - "≰": [t: "⠘â Șâ ¶"] # 0x2270 (no es menor ni igual que) - - "⩜": [t: "â Șâ ¶"] # 0x227D - - "⩟": [t: "⠕⠶"] # 0x2A7E (greater-than-or-slanted-equals) - # FIX: ≈" p99 has "⠐⠶" - - "≈": [t: "⠐⠶⠄"] # 0x2248 (casi igual a; asintĂłticamente igual a) - - "≄": [t: "⠘⠐⠶⠄"] # 0x2244 (no es asintĂłticamente igual a) - - "≁": [t: "⠘⠐⠱⠄"] # 0x2241 (tilde sube-baja tachada) - - "âˆș": [t: "⠹⠒⠅"] # 0x223A (progresiĂłn geomĂ©trica) - - "∷": [t: "⠰⠆"] # 0x2237 (proporciĂłn; igualdad de razones) - - "∶": [t: "⠐⠂"] # 0x2236 (ratio) - - "∔": [t: "⠀⠈⠌⠀"] # 0x2235 (puesto que) - - "∎": [t: "⠀⠠⠡⠀"] # 0x2234 (por lo tanto) - - "âˆȘ": [t: "⠾⠜"] # 0x222A (uniĂłn) - - "⩊": [t: "⠱⠔"] # 0x2A4A (curva geomĂ©trica) - - "∩": [t: "â žâ ±"] # 0x2229 (intersecciĂłn) - - "⊻": [t: "â žâ ź"] # 0x2228 (disyunciĂłn excluyente) - - "√": [t: "⠾⠊"] # 0x2228 (disyunciĂłn (o)) - - "∧": [t: "â žâ ą"] # 0x2227 (conjunciĂłn (y)) - - "∀": [t: "⠘⠾⠀"] # 0x2224 (no es divisor de) - - "∝": [t: "â žâ Č"] # 0x221D (proporcional a) - - "∖": [t: "⠐⠄"] # 0x2216 (diferencia de conjuntos) - - "∌": [t: "⠘⠐⠜"] # 0x220C (no comprende; no tiene como elemento) - - "∋": [t: "⠐⠜"] # 0x220B (comprende; tiene como elemento) - - "∈": [t: "⠣⠂"] # 0x2208 (es elemento de; pertenece a) - - "∉": [t: "⠘⠣⠂"] # 0x2209 (no es un elemento de; no pertenece a) - - "∅": [t: "⠾⠚"] # 0x2205 (conjunto vacĂ­o) - - "∃": [t: "â šâ ą"] # 0x2203 (cuantificador existencial: existe por lo menos un elemento) - - "∄": [t: "⠘⠚⠹"] # 0x2204 (no existe) - - "∀": [t: "⠹⠄"] # 0x2200 (cuantificador universal: para todo) - - "ǁ": [t: "⠾⠇"] # 0x01C1 (doble barra) - - "Ă·": [t: "â Č"] # 0x00F7 (dividido por) - - "×": # 0x00D7 (multiplicar (aspas)) - # FIX: this is a hacky attempt to figure out whether this is vector multiplication or regular multiplication - # Look for an arrow above or a bold on each side - - test: - if: - - "preceding-sibling::*[1][@math-variant='bold' or self::m:mover[*[2][.='→' or .='⟶' or .='⇀']]] and" - - "following-sibling::*[1][@math-variant='bold' or self::m:mover[*[2][.='→' or .='⟶' or .='⇀']]]" - then: [t: "⠈⠊"] - else: [t: "â Š"] - - "≫": [t: "⠕⠕"] # 0x226B (mucho mayor que) - - "â‰Ș": [t: "â Șâ Ș"] # 0x226A (mucho menor que) - - "±": [t: "â –â ’â €"] # 0x00B1 (mĂĄs o menos) - - "⊁": [t: "⠘⠕⠂"] # 0x2281 (no es posterior a) - - "≻": [t: "⠕⠂"] # 0x227B (sigue a; posterior a) - - "≯": [t: "⠘⠕"] # 0x226F (no mayor que) - - "=": [t: "â ¶"] # 0x003D (igual a) - - "≠": [t: "⠘⠶"] # 0x2260 (distinto de) - - "⊀": [t: "⠘⠐â Ș"] # 0x2280 (no es anterior a) - - "âȘŒ": [t: "⠕⠕⠂"] # 0x2ABC (muy posterior a) - - "âȘ»": [t: "⠐â Șâ Ș"] # 0x2ABB (muy anterior a) - - "â‰ș": [t: "⠐â Ș"] # 0x227A (precede a; anterior a) - - "≼": [t: "⠘â Ș"] # 0x226E (no menor que) - - "∓": [t: "⠀⠒⠖"] # 0x2213 (menos o mĂĄs) - - "∕": [t: "⠠⠂"] # 0x2215 (conjunto cociente) - - "〛": [t: "â Ÿâ ‚"] # 0x301B (cerrar corchetes de clase) - - "〚": [t: "⠐⠷"] # 0x301A (abrir corchetes de clase) - - "₡": [t: "⠾⠉"] # 0x20A1 (colĂłn) - - "€": [t: "⠾⠑"] # 0x20AC (euro) - - "„": [t: "â žâ œ"] # 0x00A5 (yen) - - "ÂŁ": [t: "⠐⠟"] # 0x00A3 (libra) - - "Âą": [t: "⠘⠉"] # 0x00A2 (centavo) - - "âŒȘ": [t: "⠹⠂"] # 0x232A (cerrar parĂ©ntesis angulares) - - "〈": [t: "⠐⠅"] # 0x2329 (abrir parĂ©ntesis angulares) - - "⟹": [t: "⠐⠅"] # 0x27E8 (Mathematical left angle bracket) - - "⟩": [t: "⠹⠂"] # 0x27E9 (Mathematical right angle bracket) - - "}": [t: "⠾⠂"] # 0x007D (cerrar llaves) - - "|": [t: "⠾𝘄"] # 0x007C (barra vertical) - - "{": [t: "⠐⠇"] # 0x007B (abrir llaves) - - "\\": [t: "⠐⠄"] # 0x005C (barra inversa) - - ";": [t: "⠀⠆"] # 0x003B (punto y coma de separaciĂłn) - - "/": [t: "â Č"] # 0x002F (barra oblicua) - - "%": [t: "â žâ Ž"] # 0x0025 (tanto por ciento) - - "$": - - test: - if: "following-sibling::*[self::m:mn]" - then: [t: "⠞⠏"] # 0x0024 (peso) - else: [t: "⠾⠎"] # 0x0024 (dĂłlar) - - "#": [t: "⠌⠅"] # 0x0023 (cardinal de un conjunto) - - "₿": [t: "⠞⠃"] # 0x20BF (bitcoin) - - "⟧": [t: "â Ÿâ ‚"] # 0x27E7 (cerrar corchete de clase) - - "⟩": [t: "⠐⠷"] # 0x27E6 (abrir corchete de clase) - - "∇": [t: "⠈⠻"] # 0x2207 (Nabla (del, inverted capital delta)) - - - "≐": [t: "⠈⠶"] # 0x2250 (aproximadamente igual a) - - "≟": [t: "â ¶â ąâ €"] # 0x225F (cuestionado que sea igual a) - - "≔": [t: "â °â ¶"] # 0x2254 (igual por definiciĂłn) - - "≙": [t: "⠰⠒⠶"] # 0x2259 (corresponde a) - - "≡": [t: "â ¶â ¶"] # 0x2261 (idĂ©ntico a; congruente con) - - - "∄": [t: "⠾⠇"] # 0x2225 (es paralela a) - - "∊": [t: "⠘⠾⠇"] # 0x2226 (no paralela) - - "≅": [t: "⠐⠹⠶"] # 0x2245 (congruente con) - - "⊄": [t: "⠌⠄"] # 0x22A5 (perpendicular a/ortogonal a) [symbol used in spec] - - "⟂": [t: "⠌⠀"] # 0x27C2 (Perpendicular) - - - "⊙": [t: "⠰⠄"] # 0x2299 (operador genĂ©rico (suele utilizarse para representar una operaciĂłn entre elementos de un conjunto) - - "⊚": [t: "⠰⠄"] # 0x229A (operador genĂ©rico (suele utilizarse para representar una operaciĂłn entre elementos de un conjunto) - - "⋆": [t: "⠰⠄"] # 0x22C6 (operador genĂ©rico (suele utilizarse para representar una operaciĂłn entre elementos de un conjunto) - - "†": [t: "⠰⠄"] # 0x2020 (operador genĂ©rico (suele utilizarse para representar una operaciĂłn entre elementos de un conjunto) - - "∗": [t: "⠰⠄"] # 0x2217 (operador genĂ©rico (suele utilizarse para representar una operaciĂłn entre elementos de un conjunto) +--- +# UEB characters +# +# Some chars that originally came from an Excel spreadsheet, converted to csv, and the greatly expanded +# +# The UEB translation makes use of some non-braille chars as flags +# L -- what follows is a letter +# N -- what follows is a digit +# C -- precedes L for capital letters +# G -- precedes L for Greek Letters (after C for capitals) +# Typeface Indicators ("typeforms") +# B bold, I Italic, S Sans-serif, T script, D, Fraktur, đ”č blackboard-bold +# the type face indicators can be combined with B (first) and I (second) +# Standing alone chars: +# Any character which acts as a standing alone character (e.g, "{") needs each braille symbol to be labeled +# o -- opening/left side, c -- closing/right side, b -- both open and close (e.g, '"') + + - "0": [t: "N⠚"] # 0x30 + - "1": [t: "N⠁"] # 0x31 + - "2": [t: "N⠃"] # 0x32 + - "3": [t: "N⠉"] # 0x33 + - "4": [t: "N⠙"] # 0x34 + - "5": [t: "N⠑"] # 0x35 + - "6": [t: "N⠋"] # 0x36 + - "7": [t: "N⠛"] # 0x37 + - "8": [t: "N⠓"] # 0x38 + - "9": [t: "N⠊"] # 0x39 + +# we stick the drop numbers into the private use area for consistency + - "\ue000": [t: "Nâ Ž"] # 0 + - "\ue001": [t: "N⠂"] # 1 + - "\ue002": [t: "N⠆"] # 2 + - "\ue003": [t: "N⠒"] # 3 + - "\ue004": [t: "Nâ Č"] # 4 + - "\ue005": [t: "Nâ ą"] # 5 + - "\ue006": [t: "N⠖"] # 6 + - "\ue007": [t: "Nâ ¶"] # 7 + - "\ue008": [t: "Nâ Š"] # 8 + - "\ue009": [t: "N⠔"] # 9 + +# we stick hex digits into the private use area for consistency +# these are used when we don't want to add a numeric indicator for subsequent digits (3.3) + - "\ue00A": [t: "N⠐N⠁"] # A + - "\ue00B": [t: "N⠐N⠃"] # B + - "\ue00C": [t: "N⠐N⠉"] # C + - "\ue00D": [t: "N⠐N⠙"] # D + - "\ue00E": [t: "N⠐N⠑"] # E + - "\ue00F": [t: "N⠐N⠋"] # F + +# leave room for the rest of the alphabet + - "\ue01A": [t: "Nâ šN⠁"] # A + - "\ue01B": [t: "Nâ šN⠃"] # B + - "\ue01C": [t: "Nâ šN⠉"] # C + - "\ue01D": [t: "Nâ šN⠙"] # D + - "\ue01E": [t: "Nâ šN⠑"] # E + - "\ue01F": [t: "Nâ šN⠋"] # F + +# Omission char -- there isn't a specific code point, so we use a private use area + - "\ue020": [t: "â °"] # omission (three dot 5s with letter indicator) + + + - "a": [t: "L⠁"] # 0x61 + - "b": [t: "L⠃"] # 0x62 + - "c": [t: "L⠉"] # 0x63 + - "d": [t: "L⠙"] # 0x64 + - "e": [t: "L⠑"] # 0x65 + - "f": [t: "L⠋"] # 0x66 + - "g": [t: "L⠛"] # 0x67 + - "h": [t: "L⠓"] # 0x68 + - "i": [t: "L⠊"] # 0x69 + - "j": [t: "L⠚"] # 0x6a + - "k": [t: "L⠅"] # 0x6b + - "l": [t: "L⠇"] # 0x6c + - "m": [t: "L⠍"] # 0x6d + - "n": [t: "L⠝"] # 0x6e + - "o": # 0x6f + - test: # special case because these have the same dot pattern + if: "preceding-sibling::*[1][self::m:mo and (.='>' or .='≫')]" + then: [t: "⠐"] + - t: "L⠕" + - "p": [t: "L⠏"] # 0x70 + - "q": [t: "L⠟"] # 0x71 + - "r": [t: "L⠗"] # 0x72 + - "s": [t: "L⠎"] # 0x73 + - "t": [t: "L⠞"] # 0x74 + - "u": [t: "Lâ „"] # 0x75 + - "v": [t: "Lâ §"] # 0x76 + - "w": [t: "Lâ ș"] # 0x77 + - "x": [t: "Lâ ­"] # 0x78 + - "y": [t: "Lâ œ"] # 0x79 + - "z": [t: "Lâ ”"] # 0x7a + + + - "ĂĄ": [t: "Lâ ·"] # 0xE1 + - "Ă©": [t: "Lâ ź"] # 0xE9 + - "Ă­": [t: "L⠌"] # 0xED + - "ñ": [t: "Lâ »"] # 0xF1 + - "Ăł": [t: "Lâ Ź"] # 0xF3 + - "Ăș": [t: "Lâ Ÿ"] # 0xFA + - "ĂŒ": [t: "Lâ ł"] # 0xFC + + - "Á": [t: "CLâ ·"] # 0xC0 + - "É": [t: "CLâ ź"] # 0xC9 + - "Í": [t: "CL⠌"] # 0xCD + - "Ñ": [t: "CLâ »"] # 0xD1 + - "Ó": [t: "CLâ Ź"] # 0xD3 + - "Û": [t: "CLâ Ÿ"] # 0xDA + - "Ü": [t: "CLâ ł"] # 0xDC + + # Latin capitals: chem-element letters use đ¶ (no word indicator); others use C. + # Cells come from lowercase a-z via spell/translate. + - "BCHIKNOPSUVWY": # chemistry-capable capitals + - test: + if: "@data-chem-element" + then: [tc: "đ¶"] + else: [tc: "C"] + - spell: "translate('.', 'BCHIKNOPSUVWY', 'bchiknopsuvwy')" + - "ADEFGJLMQRTXZ": # remaining capitals + - tc: "C" + - spell: "translate('.', 'ADEFGJLMQRTXZ', 'adefgjlmqrtxz')" + + - "α": [t: "GL⠁"] # 0x3b1 + - "ÎČ": [t: "GL⠃"] # 0x3b2 + - "Îł": [t: "GL⠛"] # 0x3b3 + - "ÎŽ": [t: "GL⠙"] # 0x3b4 + - "Δ": [t: "GL⠑"] # 0x3b5 + - "ζ": [t: "GLâ ”"] # 0x3b6 + - "η": [t: "GLâ ±"] # 0x3b7 + - "Ξ": [t: "GLâ č"] # 0x3b8 + - "Îč": [t: "GL⠊"] # 0x3b9 + - "Îș": [t: "GL⠅"] # 0x3ba + - "λ": [t: "GL⠇"] # 0x3bb + - "ÎŒ": [t: "GL⠍"] # 0x3bc + - "Μ": [t: "GL⠝"] # 0x3bd + - "Ο": [t: "GLâ ­"] # 0x3be + - "Îż": [t: "GL⠕"] # 0x3bf + - "π": [t: "GL⠏"] # 0x3c0 + - "ρ": [t: "GL⠗"] # 0x3c1 + - "ς": [t: "VL⠎"] # 0x3c2 + - "σ": [t: "GL⠎"] # 0x3c3 + - "τ": [t: "GL⠞"] # 0x3c4 + - "υ": [t: "GLâ „"] # 0x3c5 + - "φ": [t: "GL⠋"] # 0x3c6 + - "χ": [t: "GLâ Ż"] # 0x3c7 + - "ψ": [t: "GLâ œ"] # 0x3c8 + - "ω": [t: "GLâ ș"] # 0x3c9 + + - "Α": [t: "CGL⠁"] # 0x391 + - "Β": [t: "CGL⠃"] # 0x392 + - "Γ": [t: "CGL⠛"] # 0x393 + - "Δ": [t: "CGL⠙"] # 0x394 + - "Ε": [t: "CGL⠑"] # 0x395 + - "Ζ": [t: "CGLâ ”"] # 0x396 + - "Η": [t: "CGLâ ± "] # 0x397 + - "Θ": [t: "CGLâ č"] # 0x398 + - "Ι": [t: "CGL⠊"] # 0x399 + - "Κ": [t: "CGL⠅"] # 0x39a + - "Λ": [t: "CGL⠇"] # 0x39b + - "Μ": [t: "CGL⠍"] # 0x39c + - "Ν": [t: "CGL⠝"] # 0x39d + - "Ξ": [t: "CGLâ ­"] # 0x39e + - "Ο": [t: "CGL⠕"] # 0x39f + - "Π": [t: "CGL⠏"] # 0x3a0 + - "ÎĄ": [t: "CGL⠗"] # 0x3a1 + - "Îą": [t: "CGL⠎"] # 0x3a2 + - "ÎŁ": [t: "CGL⠎"] # 0x3a3 + - "΀": [t: "CGL⠞"] # 0x3a4 + - "΄": [t: "CGLâ „"] # 0x3a5 + - "Ί": [t: "CGL⠋"] # 0x3a6 + - "Χ": [t: "CGLâ Ż"] # 0x3a7 + - "Κ": [t: "CGLâ œ"] # 0x3a8 + - "Ω": [t: "CGLâ ș"] # 0x3a9 + + - "ϑ": [t: "VLâ č"] # 0x3d1 + - "Ï”": [t: "VL⠑"] # 0x3f5 + - "ϰ": [t: "VL⠅"] # 0x3f0 + - "ϕ": [t: "VL⠋"] # 0x3d5 + - "ϱ": [t: "VL⠗"] # 0x3f1 + - "ϖ": [t: "VL⠏"] # 0x3d6 + - "Ϝ": [t: "VLâ §"] # 0x3d7 + + - "”": [t: "GL⠍"] # 0x00B5 (Micro (Greek mu)) + - "℩": [t: "CGLâ ș"] # 0x2126 (Ohm sign (capital Greek omega)) + - "∆": [t: "â žâ Š"] # 0x2206 (Increment) + - "∏": # 0x220F (Product (capital Greek pi)) + - t: "CGL⠏" + - test: + if: "not(IsNode(.., 'modified'))" + then: [t: "â ±"] + - "∐": # 0x2210 (CoProduct (capital Greek pi)) + - t: "⠘⠻" + - test: + if: "not(IsNode(.., 'modified'))" + then: [t: "â ±"] + - "∑": # 0x2211 (Sum (capital Greek sigma)) + - t: "CGL⠎" + - test: + if: "not(IsNode(.., 'modified'))" + then: [t: "â ±"] + + - "<": [t: "â Ș"] # 0x003C (Less than) + - "≹": [t: "â Ș"] # 0x2268 (Less-Than But Not Equal To) + - "⋩": [t: "â Ș"] # 0x22E6 (Less-Than But Not Equivalent To) + - ">": [t: "⠕"] # 0x003E (Greater than) + - "≩": [t: "⠕"] # 0x2269 (Greater-Than But Not Equal To) + - "⋧": [t: "⠕"] # 0x22E7 (Greater-Than But Not Equivalent To) +# - "≼": [t: "⠈⠣⠈⠱"] # 0x226E (Not less than) +# - "≯": [t: "⠈⠜⠈⠱"] # 0x226F (Not greater than) +# - "≰": [t: "⠞⠈⠣⠈⠱"] # 0x2270 (Neither less than nor equal to) +# - "≱": [t: "⠞⠈⠜⠈⠱"] # 0x2271 (Neither greater than nor equal to) +# - "∝": [t: "⠞⠐⠶"] # 0x221D (Proportional to) +# - "≃": [t: "⠾⠔"] # 0x2243 (Approximately equal to (tilde over horizontal line)) +# - "≅": [t: "⠐⠾⠔"] # 0x2245 (Approximately equal to (tilde over equals sign)) +# - "≏": [t: "⠘⠐⠶"] # 0x224F (Equals with bump in top bar (difference between)) +# - "≱": [t: "⠞⠿⠈⠱"] # 0x2262 (Not identical to) +# - "∈": [t: "⠘⠑"] # 0x2208 (Element of (member of)) +# - "∉": [t: "⠘⠑⠈⠱"] # 0x2209 (Not Element of) + - "+": [t: "⠖"] # 0x002B (Plus sign) +# - "∋": [t: "⠈⠘⠑"] # 0x220B (Contains) +# - "⊂": [t: "⠘⠣"] # 0x2282 (Subset of) +# - "⊃": [t: "⠘⠜"] # 0x2283 (Superset of) +# - "⊆": [t: "⠞⠘⠣"] # 0x2286 (Subset of or equal) +# - "⊇": [t: "⠾⠘⠜"] # 0x2287 (Superset of or equal) +# - "⊊": [t: "⠚⠘⠣"] # 0x228A (Subset of with not equal) +# - "⊋": [t: "⠹⠘⠜"] # 0x228B (Superset of with not equal) +# - "âŠČ": [t: "⠈⠞⠣"] # 0x22B2 (Normal subgroup of) +# - "⊳": [t: "⠈⠾⠜"] # 0x22B3 (Contains as normal subgroup) +# - "⊮": [t: "â žâ žâ Ł"] # 0x22B4 (Normal subgroup of or equal) +# - "⊔": [t: "⠾⠾⠜"] # 0x22B5 (Contains as normal subgroup or equal) +# - "⋬": [t: "â šâ žâ Ł"] # 0x22EC (not normal subgroup) -- this isn't the same as what is in GTM 10, but that similar has no Unicode equiv +# - "⋭": [t: "â šâ žâ Ł"] # 0x22ED (does not contain as normal subgroup) -- this isn't the same as what is in GTM 10, but that similar has no Unicode equiv +# - "⊱": [t: "⠾⠒"] # 0x22a2 (Right tack) +# - "⊣": [t: "⠈⠾⠒"] # 0x22a3 (Left tack) + - "−": [t: "⠐⠀"] # 0x2212 (Minus sign) + - "·": [t: "⠠𝘄"] # 0x00B7 (Multiplication dot (times)) +# - "∗": [t: "⠐⠔"] # 0x2217 (Asterisk operator) + - "∘": [t: "⠠⠆"] # 0x2218 (Ring operator) value based on last row in 5.1 (probably what they should have used) + - "◩": [t: "⠠⠆"] # 0x25E6 (White bullet) (value based on 2218) + - "⋅": [t: "⠰⠄"] # 0x22C5 (Dot operator)(value based on 2218) +# - "∖": [t: "â žâ Ą"] # 0x2216 (Set minus) + - "(": [t: "â Ł"] # 0x0028 (Left parenthesis) + - ")": [t: "⠜"] # 0x0029 (Right parenthesis) + - "[": [t: "â ·"] # 0x005B (Left square bracket) + - "]": [t: "â Ÿ"] # 0x005D (Right square bracket) + - "!": # 0x21 (Exclamation (factorial)) + - test: # CMU seems to use a different char for factorial (7.5) -- this weak guess for factorial + if: "self::m:mo and preceding-sibling::*" + then: [t: "⠘⠄"] + else: [t: "⠖"] + - "&": [t: "â  â Ż"] # 0x26 (Ampersand) + - "*": [t: "â Č"] # 0x002A (Asterisk) + - "?": [t: "â ą"] # 0x003F (Question mark) + - "Âż": [t: "â ą"] # 0x00BF (Question mark) + - "@": [t: "⠐"] # 0x0040 (Commercial at sign) + - "^": # 0x005E (Caret (hat, up arrow)) 4.3.2 uses one form as a circumflex, and 11.1 as a geometric angle + - test: # it is not clear how to distinguish one form from another -- the following passes the tests, but is almost certainly wrong + - if: "..[self::m:mover][ *[1][self::m:mi and string-length(.)=1 and translate(., 'abcdefghijklmnopqrstuvwxyz', '') = ''] ]" + then: [t: "⠰⠒"] # circumflex + else: [t: "⠘⠒"] # angle and everything else + - "_": [t: "â €"] # 0x005F (Low line (underscore)) + - "ÂŻ": [t: "⠈⠉"] # 0x00AF (macron) + - "═": [t: "⠈⠉⠈⠉"] # 0x2550 (BOX DRAWINGS DOUBLE HORIZONTAL) + - "~": # 0x007E (Tilde (swung dash)) + - test: # unclear what really should happen see 4.3.2, 4.3.3, 6.1, and 8.2 -- all use different codes + - if: "..[self::m:mover]" + then: [t: "⠐⠹"] + - else_if: "..[self::m:munder]" + then: [t: "â  â ą"] + - else_if: "not(preceding-sibling::*)" + then: [t: "⠠⠄"] # (8.2 -- prefix?) + else: [t: "⠐⠹⠠"] # (6.1 -- infix?) + - ∌: # 223c (Tilde operator) + - test: # unclear what really should happen see 4.3.2, 4.3.3, 6.1, and 8.2 -- all use different codes + - if: "..[self::m:mover]" + then: [t: "⠐⠹"] + - else_if: "..[self::m:munder]" + then: [t: "â  â ą"] + - else_if: "not(preceding-sibling::*)" + then: [t: "⠠⠄"] # (8.2 -- prefix?) + else: [t: "⠐⠹⠠"] # (6.1 -- infix?) + - "—": [t: "⠀⠀"] # 0x2014 (Em dash) + - "‖": [t: "⠾⠇"] # 0x2016 +# - "Š": [t: "â šâ ł"] # 0x00A6 (Broken bar) +# - "ÂŹ": [t: "⠈â č"] # 0x00AC (Not sign) + - "°": [t: "â Ž"] # 0x00B0 (Degree sign) + - "ÂČ": [t: "â Ąâ Œâ ƒâ ‰"] # 0x00B2 (superscripted 2) + - "Âł": [t: "â Ąâ Œâ ‰"] # 0x00B3 (superscripted 3) +# - "†": [t: "⠈⠠â č"] # 0x2020 (Dagger) +# - "‡": [t: "⠈⠠⠻"] # 0x2021 (Double dagger) +# - "‰": [t: "â žâ Žâ Ž"] # 0x2030 (Per mille) + - "â€Č": [t: "â ł"] # 0x2032 (Prime sign) + - "″": [t: "â łâ ł"] # 0x2033 (Double prime sign) + - "‮": [t: "â łâ łâ ł"] # 0x2034 (Triple prime sign) +# - "Å": [t: "⠠⠘⠫⠁"] # 0x212B (Angstrom symbol) +# - "Å": [t: "⠠⠘⠫⠁"] # 0x00C5 (WIRIS uses this for Angstrom) +# - "∀": [t: "⠘⠁"] # 0x2200 (For all) + - "∂": [t: "⠾⠙"] # 0x2202 (Partial differential) +# - "∃": [t: "⠘⠹"] # 0x2203 (There exists) +# - "∄": [t: "⠘⠹⠈⠱"] # 0x2204 (There does not exist) +# - "∅": [t: "⠈⠚"] # 0x2205 (Empty set) +# - "∎": [t: "⠞⠫⠌⠙t"] # 0x220E (End of proof) +# - "√": [t: "⠐⠩"] # 0x221A (Square root (radical) without vinculum) +# - "∠": [t: "â žâ Ș"] # 0x2220 (Angle) +# - "∥": [t: "â šâ žâ Ș"] # 0x2221 (Measured angle) +# - "⊟": [t: "⠌⠞â Ș"] # 0x22BE (Right angle with arc) + - "∫": # 0x222B (Integral) + - t: "â Ż" + - test: + if: "not(IsNode(.., 'modified'))" + then: [t: "â ±"] + - "∏": # 0x222c (Double integral) + - t: "â Żâ Ż" + - test: + if: "not(IsNode(.., 'modified'))" + then: [t: "â ±"] + - "∭": # 0x222d (Triple integral) + - t: "â Żâ Żâ Ż" + - test: + if: "not(IsNode(.., 'modified'))" + then: [t: "â ±"] + - "∟": # 0x222E (Contour integral (closed line integral)) + - t: "â Żâ Ž" + - test: + if: "not(IsNode(.., 'modified'))" + then: [t: "â ±"] +# - "∷": [t: "⠒⠒"] # 0x2237 (Proportion) +# - "∣": [t: "â žâ ł"] # 0x2223 (Divides) +# - "∀": [t: "⠞⠳⠈⠱"] # 0x2224 (Does not divide) + - "←": # 0x2190 (Leftwards arrow) + - test: # this is a guess as to when to use each + if: # mi on either side or if parent is mover, mi on either side of the parent (e.g., A⟶B or labeled arrow) + - "(..[self::m:mrow] and preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]) or " + - "(..[self::m:mover][ ..[self::m:mrow][preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]] ])" + then: [t: "⠐⠒⠒"] # 9.1 + else: [t: "⠐⠒"] # 9.2 + - "⟔": # 0x27F5 (Long leftwards arrow) + - test: # this is a guess as to when to use each + if: # mi on either side or if parent is mover, mi on either side of the parent (e.g., A⟶B or labeled arrow) + - "(..[self::m:mrow] and preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]) or " + - "(..[self::m:mover][ ..[self::m:mrow][preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]] ])" + then: [t: "⠐⠒⠒"] # 9.1 + else: [t: "⠐⠒"] # 9.2 + - "→": # 0x2192 (Rightwards arrow) + - test: # this is a guess as to when to use each + if: # mi on either side or if parent is mover, mi on either side of the parent (e.g., A⟶B or labeled arrow), but rule out limit + - "(" + - " (..[self::m:mrow] and preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]) or " + - " (..[self::m:mover][ ..[self::m:mrow][preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]] ])" + - ") and" + - "not(../..[self::m:munder or self::m:msub][*[1][self::m:mi and starts-with(., 'lim')]])" + then: [t: "⠒⠒⠂"] # 9.1 + else: [t: "⠒⠂"] # 9.2 + - "⟶": # 0x27F6 (Long rightwards arrow) + - test: # this is a guess as to when to use each + if: # mi on either side or if parent is mover, mi on either side of the parent (e.g., A⟶B or labeled arrow), but rule out limit + - "(" + - " (..[self::m:mrow] and preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]) or " + - " (..[self::m:mover][ ..[self::m:mrow][preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]] ])" + - ") and" + - "not(../..[self::m:munder or self::m:msub][*[1][self::m:mi and starts-with(., 'lim')]])" + then: [t: "⠒⠒⠂"] # 9.1 + else: [t: "⠒⠂"] # 9.2 + - "⇀": # 0x21C0 (RIGHTWARDS HARPOON WITH BARB UPWARDS) [not mentioned in spec] + - test: # this is a guess as to when to use each + if: # mi on either side or if parent is mover, mi on either side of the parent (e.g., A⟶B or labeled arrow), but rule out limit + - "(" + - " (..[self::m:mrow] and preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]) or " + - " (..[self::m:mover][ ..[self::m:mrow][preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]] ])" + - ") and" + - "not(../..[self::m:munder or self::m:msub][*[1][self::m:mi and starts-with(., 'lim')]])" + then: [t: "⠒⠒⠂"] # 9.1 + else: [t: "⠒⠂"] # 9.2 + - "↔": # 0x2194 (Left right arrow) + - test: # this is a guess as to when to use each + if: # mi on either side or if parent is mover, mi on either side of the parent (e.g., A⟶B or labeled arrow) + - "(..[self::m:mrow] and preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]) or " + - "(..[self::m:mover][ ..[self::m:mrow][preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]] ])" + then: [t: "⠐⠒⠒⠂"] # 9.1 + else: [t: "⠐⠒⠂"] # 9.2 + - "⟷": # 0x27F7 (Long Left right arrow) + - test: # this is a guess as to when to use each + if: # mi on either side or if parent is mover, mi on either side of the parent (e.g., A⟶B or labeled arrow) + - "(..[self::m:mrow] and preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]) or " + - "(..[self::m:mover][ ..[self::m:mrow][preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]] ])" + then: [t: "⠐⠒⠒⠂"] # 9.1 + else: [t: "⠐⠒⠂"] # 9.2 +# - "↚": [t: "1â łâ Ș⠈⠱"] # 0x219A (Leftwards arrow with stroke) +# - "↛": [t: "1â łâ •â ˆâ ±"] # 0x219B (Rightwards arrow with stroke) +# - "↜": [t: "1⠳⠔⠱â Ș"] # 0x219C (Leftwards wave arrow) +# - "↝": [t: "1⠳⠱⠔⠕"] # 0x219D (Rightwards wave arrow) +# - "↞": [t: "1⠳⠒⠗⠗â Ș"] # 0x219E (Leftwards two headed arrow) +# - "↟": [t: "1⠳⠒⠗⠗⠬"] # 0x219F (Upwards two headed arrow) +# - "↠": [t: "1⠳⠒⠗⠗⠕"] # 0x21A0 (Rightwards two headed arrow) +# - "↡": [t: "1â łâ ’â —â —â ©"] # 0x21A1 (Downwards two headed arrow) +# - "↱": [t: "1⠳⠗⠗â Ș"] # 0x21A2 (Leftwards arrow with tail) +# - "↣": [t: "1⠳⠗⠗⠕"] # 0x21A3 (Rightwards arrow with tail) +# - "ↀ": [t: "1⠳⠳⠗â Ș"] # 0x21A4 (Leftwards arrow from bar) +# - "ↄ": [t: "1⠳⠳⠗⠬"] # 0x21A5 (Upwards arrow from bar) +# - "↩": [t: "1⠳⠳⠗⠕"] # 0x21A6 (Rightwards arrow from bar) +# - "↧": [t: "1â łâ łâ —â ©"] # 0x21A7 (Downwards arrow from bar) +# - "↭": [t: "1â łâ ș⠔⠱⠗⠕"] # 0x21AD (Left right wave arrow) +# - "↼": [t: "1â łâ ș⠗⠕⠈⠱"] # 0x21AE (Left right arrow with stroke) +# - "↰": [t: "1â łâ Žâ Ź"] # 0x21B0 (Upwards arrow with tip left) +# - "↱": [t: "1â łâ Čâ Ź"] # 0x21B1 (Upwards arrow with tip right) +# - "â†Č": [t: "1â łâ Čâ ©"] # 0x21B2 (Downwards arrow with tip left) +# - "↳": [t: "1â łâ Žâ ©"] # 0x21B3 (Downwards arrow with tip right) +# - "↶": [t: "1⠳⠔⠔â Ș"] # 0x21B6 (Anticlockwise top semicircle arrow) +# - "↷": [t: "1⠳⠱⠱⠕"] # 0x21B7 (Clockwise top semicircle arrow) +# - "↌": [t: "1⠳⠈⠗â Ș"] # 0x21BC (Leftwards harpoon with barb upwards) +# - "↜": [t: "1⠳⠠⠗â Ș"] # 0x21BD (Leftwards harpoon with barb downwards) +# - "↟": [t: "1⠳⠠⠗⠬"] # 0x21BE (Upwards harpoon with barb rightwards) +# - "↿": [t: "1⠳⠈⠗⠬"] # 0x21BF (Upwards harpoon with barb leftwards) +# - "⇀": [t: "1⠳⠈⠗⠕"] # 0x21C0 (Rightwards harpoon with barb upwards) +# - "⇁": [t: "1⠳⠠⠗⠕"] # 0x21C1 (Rightwards harpoon with barb downwards) +# - "⇂": [t: "1â łâ ˆâ —â ©"] # 0x21C2 (Downwards harpoon with barb rightwards) +# - "⇃": [t: "1â łâ  â —â ©"] # 0x21C3 (Downwards harpoon with barb leftwards) +# - "⇄": [t: "1⠳⠕⠻⠳â Ș"] # 0x21C4 (Rightwards arrow over leftwards arrow) +# - "⇅": [t: "1â łâ Źâ żâ łâ ©"] # 0x21C5 (Upwards arrow left of Downwards arrow) +# - "⇌": [t: "⠘⠞⠶"] # 0x21CC (Rightwards harpoon over leftwards harpoon (equilibrium)) +# - "⇑": [t: "1â łâ ¶â Ź"] # 0x21D1 (Upwards double arrow) +# - "⇓": [t: "1â łâ ¶â ©"] # 0x21D3 (Downwards double arrow) +# - "⇕": [t: "1â łâ șâ ¶â —â Ź"] # 0x21D5 (Up down double arrow) +# - "⇠": [t: "1⠳⠂â Ș"] # 0x21E0 (Leftwards dashed arrow) +# - "⇡": [t: "1⠳⠂⠬"] # 0x21E1 (Upwards dashed arrow) +# - "⇱": [t: "1⠳⠂⠕"] # 0x21E2 (Rightwards dashed arrow) +# - "⇣": [t: "1â łâ ‚â ©"] # 0x21E3 (Downwards dashed arrow) +# - "â„‚": [t: "â žâ ¶"] # 0x2942 (Rightwards arrow above short leftwards arrow (equilibrium, trend to the right)) +# - "â„„": [t: "⠈⠞⠶"] # 0x2944 (Short rightwards arrow above leftwards arrow (equilibrium, trend to the left)) +# - "â–€": [t: "⠚⠫⠌⠙t"] # 0x25A4 (Square with horizontal fill) +# - "â–„": [t: "⠚⠫⠌⠙t"] # 0x25A5 (Square with vertical fill) +# - "▩": [t: "⠚⠫⠌⠙t"] # 0x25A6 (Square with orthogonal crosshatch fill) +# - "▧": [t: "⠚⠫⠌⠙t"] # 0x25A7 (Square with upper left to lower right fill) +# - "▹": [t: "⠚⠫⠌⠙t"] # 0x25A8 (Square with upper right to lower left fill) +# - "▩": [t: "⠚⠫⠌⠙t"] # 0x25A9 (Square with diagonal crosshatch fill) +# - "◍": [t: "â šâ «â żt"] # 0x25CD (Circle with vertical fill) +# - "▱": [t: "1⠫⠈⠌⠙t"] # 0x25B1 (Parallelogram) +# - "â–Č": [t: "⠞⠫⠌⠉t"] # 0x25B2 (Filled triangle) +# - "■": [t: "⠞⠫⠌⠙t"] # 0x25A0 (Filled square) +# - "≜": [t: "⠠⠚⠙⠻⠐⠶"] # 0x225C (Delta equal to) +# - "≝": [t: "1â Łâ ™â ‘â ‹â œâ »â â ¶"] # 0x225D (Equal to by definition) +# - "⊕": [t: "1â «â żâ Ș⠐⠖t"] # 0x2295 (Circled plus) +# - "⊖": [t: "1â «â żâ Ș⠐⠀t"] # 0x2296 (Circled minus) +# - "⊗": [t: "1â «â żâ Ș⠐⠊t"] # 0x2297 (Circled times) +# - "⊛": [t: "1â «â żâ Ș⠐⠔t"] # 0x229B (Circled asterisk operator) +# - "⊞": [t: "1⠫⠌⠙â Ș⠐⠖t"] # 0x229E (Squared plus) +# - "⊟": [t: "1⠫⠌⠙â Ș⠐⠀t"] # 0x229F (Squared minus) +# - "⊠": [t: "1⠫⠌⠙â Ș⠐⠊t"] # 0x22A0 (Squared times) +# - "⋇": [t: "1⠌⠯⠩"] # 0x22C7 (Division times) +# - "⊩": [t: "⠾⠳⠿⠾⠒"] # 0x22A9 (Forces) + - "˙": [t: "⠈"] # 0x02D9 ( Dot Above) + - "š": [t: "⠈⠈"] # 0x00A8 ( Diaeresis/Double Dot Above ) + - "⃛": [t: "⠈⠈⠈"] # 0x20db (combining triple dot) + - "©": [t: "⠣⠹⠉⠜"] # 0xa9 (Copyright) + - "Âź": [t: "⠣⠹⠗⠜"] # 0xa9 (Registered sign) + + - "
": [t: "⠄⠄⠄"] # 0x2026 (Ellipsis) + - "⋯": [t: "⠄⠄⠄"] # 0x22EF (mid-line Ellipsis) -- seems to be same based on Example 10.1.3 + + +# All the quotes are the same + - "\"": [t: "â Š"] + - "'": [t: "⠄"] + - "“": [t: "â Š"] # 0x201C + - "”": [t: "â Š"] # 0x201C + - "‘": [t: "â Š"] + - "’": # 0x2019 (2.3_3) + - test: + if: "self::m:mn" + then: [t: "N⠂"] # same as '.' block separator + else: [t: "â Š"] + - "«": [t: "â Š"] + - "»": [t: "â Š"] + + - " ": # 0x20 (Space) + - test: + - if: "self::m:mn" + then: [t: "N⠄"] + - else_if: "@data-added='missing-content' or @data-empty-in-2D or @width > 1.1" + then: [t: "⠰⠀⠆"] # omission + - else_if: "@width < 0.25" + then: [t: ""] # tweaking space -- ignore + else: [t: "W"] # space in text or wide enough space + - " ": # 0xa0 (Non-breaking Space) + - test: + - if: "self::m:mn" + then: [t: "N⠄"] + else: [t: "W"] + - ",": # 0x2c (Comma) + - test: + if: "self::m:mn" + then: [t: "N⠂"] + else: [t: "W⠂"] + - ".": # 0x2e (Period) -- 2.3 says that if this is acting like a decimal separator, it should be brailled like "," + - test: + if: "self::m:mn" + then: + # presunme this is likely uses "," for a decimal separator, so just do a few checks + # 1. if there are < 3 chars after the first ".", then not a block separator + # 2. if there is a '.' or other likely block separator after the first '.', then not decimal separator + # likely other (complicated?) other tests that could be used + - with: + variables: [StringAfter: "substring-after(., '.')"] + replace: + - test: + if: "string-length($StringAfter) >= 3 and string-length($StringAfter)=string-length( translate($StringAfter, $BlockSeparators, '') )" + then: [t: "N⠄"] # really is a block separator + else: [t: "N⠂"] # treat as decimal separator + else: [t: "W⠄"] + - ":": [t: "⠐⠂"] # 0x003A (Colon) + - "-": [t: "â €"] # 0x2d (Minus sign or hyphen) + - "⁥": [t: ""] # 0x2061⁥ (invisible function apply) + - "⁹": [t: ""] # 0x2062 (invisible times) + - "⁣": [t: ""] # 0x2063⁥ (invisible separator) + - "⁀": [t: ""] # 0x2064 (invisible plus) + + - "`": [t: "â ą"] # 0x0060 (GRAVE ACCEN) + + - "ڐ": [t: "â  â ł"] # 0x05D0 (aleph) + - "○": [t: "â Ș⠕"] # 0x25CB (cĂ­rculo) + - "∞": [t: "â Œâ ł"] # 0x221E (infinito) + - "⎔": [t: "⠯⠕"] # 0x2394 (polĂ­gono) + - "‰": [t: "â žâ Žâ Ž"] # 0x2030 (tanto por mil) + - "ÂŹ": [t: "⠠⠄"] # 0x00AC (negaciĂłn lĂłgica) + - "↕": [t: "⠾⠅"] # 0x2195 (flecha arriba-abajo) + - "↖": [t: "⠐⠥"] # 0x2196 (flecha oblicua arriba-izquierda) + - "↙": [t: "⠐⠌"] # 0x2199 (flecha abajo-izquierda) + - "↓": [t: "⠾⠄"] # 0x2193 (flecha hacia abajo) + - "↘": [t: "⠡⠂"] # 0x2198 (flecha oblicua abajo-derecha) + - "↗": [t: "⠌⠂"] # 0x2197 (flecha arriba-derecha) + - "↑": [t: "⠞⠁"] # 0x2191 (flecha hacia arriba) + - "△": [t: "â  â Ÿ"] # 0x25B3 (Triangle) + - "▭": [t: "â Żâ œ"] # 0x25AD (rectĂĄngulo) + - "□": [t: "â žâ œ"] # 0x25A1 (cuadrado) + - "âŸș": [t: "â Ș⠒⠕"] # 0x27FA (doble implicaciĂłn «si y solo si») + - "⟾": [t: "â Ș⠒"] # 0x27F8 (implicaciĂłn recĂ­proca; porque) + - "âŸč": [t: "⠒⠕"] # 0x27F9 (implicaciĂłn directa; implica) + - "⇔": [t: "â Ș⠒⠕"] # 0x21D4 (LEFT RIGHT DOUBLE ARROW) + - "⇐": [t: "â Ș⠒"] # 0x21D0 (LEFTWARDS DOUBLE ARROW) + - "⇒": [t: "⠒⠕"] # 0x21D2 (RIGHTWARDS DOUBLE ARROW) + - "‥": [t: "⠐⠡⠂"] # 0x2921 (flecha abajo-derecha y arriba izquierda) + - "‹": [t: "⠐⠌⠂"] # 0x2922 (flecha abajo-izquierda y arriba derecha) + - "⌋": [t: "â  â Ÿ"] # 0x230B (cerrar suelo) + - "⌊": [t: "⠷⠄"] # 0x230A (abrir suelo) + - "⌉": [t: "⠐⠟"] # 0x2309 (cerrar techo) + - "⌈": [t: "⠷⠂"] # 0x2308 (abrir techo) + - "⋩": [t: "⠕⠂"] # 0x22E9 (posterior a MULTI) + - "⋹": [t: "⠐â Ș"] # 0x22E8 (anterior a MULTI) + - "⋟": [t: "⠕⠂⠶"] # 0x22DF (posterior o igual a) + - "⋞": [t: "⠐â Șâ ¶"] # 0x22DE (anterior o igual a) + - "⋝": [t: "⠕⠶"] # 0x22DD (mayor o igual que MULTI) + - "⋜": [t: "â Șâ ¶"] # 0x22DC (menor o igual que MULTI) + - "⋏": [t: "â žâ Ł"] # 0x22CF (proposiciĂłn falsa) + - "⋎": [t: "⠾⠎"] # 0x22CE (proposiciĂłn verdadera) + - "⹂": [t: "â Șâ Š"] # 0x2A02 (producto tensorial) + - "⚁": [t: "â Ș⠖"] # 0x2A01 (suma directa) + - "⋃": # 0x22C3 (uniĂłn de una familia de conjuntos) + - t: "⠿⠜" + - test: + if: "not(IsNode(.., 'modified'))" + then: [t: "â ±"] + - "⋂": # 0x22C2 (intersecciĂłn de una familia de conjuntos) + - t: "â żâ ±" + - test: + if: "not(IsNode(.., 'modified'))" + then: [t: "â ±"] + - "⋁": # 0x22C1 (disyunciĂłn de una familia de proposiciones) + - t: "⠿⠊" + - test: + if: "not(IsNode(.., 'modified'))" + then: [t: "â ±"] + - "⋀": # 0x22C0 (conjunciĂłn de una familia de proposiciones) + - t: "â żâ ą" + - test: + if: "not(IsNode(.., 'modified'))" + then: [t: "â ±"] + - "⊿": [t: "â žâ Š"] # 0x22BF (triĂĄngulo rectĂĄngulo) + - "⊩": [t: "â žâ ¶"] # 0x22A9 (tautologĂ­a) + - "⊼": [t: "⠘⠞⠶"] # 0x22AE (no tautologĂ­a) + - "⊇": [t: "⠰⠜"] # 0x2287 (incluye o es igual a) + - "⊉": [t: "⠘⠰⠜"] # 0x2289 (no incluye ni es igual a) + - "⊆": [t: "⠣⠆"] # 0x2286 (incluido o es igual a) + - "⊈": [t: "⠘⠣⠆"] # 0x2288 (no incluido ni es igual a) + - "⊃": [t: "⠠⠜"] # 0x2283 (Incluye; tiene como subconjunto) + - "⊅": [t: "⠘⠠⠜"] # 0x2285 (no incluye a) + - "⊂": [t: "⠣⠄"] # 0x2282 (Incluido; subconjunto) + - "⊄": [t: "⠘⠣⠄"] # 0x2284 (no incluido en) + - "⋡": [t: "⠘⠕⠂⠶"] # 0x22E1 (no es posterior ni igual a) + - "≜": [t: "⠕⠂⠶"] # 0x227D (sigue o igual a) + - "⋠": [t: "⠘⠐â Șâ ¶"] # 0x22E0 (no es anterior ni igual a) + - "≌": [t: "⠐â Șâ ¶"] # 0x227C (precede o igual a) + - "â‰č": [t: "⠘⠕â Ș"] # 0x2279 (ni mayor ni menor que) + - "≾": [t: "⠘⠕â Ș"] # 0x2278 (ni mayor ni menor que) + - "≧": [t: "⠕⠶"] # 0x2267 (mayor o igual que MULTI) + - "≩": [t: "â Șâ ¶"] # 0x2266 (menor o igual que MULTI) + - "≱": [t: "⠘⠕⠶"] # 0x2271 (no es mayor ni igual que) + - "≄": [t: "⠕⠶"] # 0x2265 (mayor o igual que MULTI) + - "≀": [t: "â Șâ ¶"] # 0x2264 (menor o igual que MULTI) + - "≰": [t: "⠘â Șâ ¶"] # 0x2270 (no es menor ni igual que) + - "⩜": [t: "â Șâ ¶"] # 0x227D + - "⩟": [t: "⠕⠶"] # 0x2A7E (greater-than-or-slanted-equals) + # FIX: ≈" p99 has "⠐⠶" + - "≈": [t: "⠐⠶⠄"] # 0x2248 (casi igual a; asintĂłticamente igual a) + - "≄": [t: "⠘⠐⠶⠄"] # 0x2244 (no es asintĂłticamente igual a) + - "≁": [t: "⠘⠐⠱⠄"] # 0x2241 (tilde sube-baja tachada) + - "âˆș": [t: "⠹⠒⠅"] # 0x223A (progresiĂłn geomĂ©trica) + - "∷": [t: "⠰⠆"] # 0x2237 (proporciĂłn; igualdad de razones) + - "∶": [t: "⠐⠂"] # 0x2236 (ratio) + - "∔": [t: "⠀⠈⠌⠀"] # 0x2235 (puesto que) + - "∎": [t: "⠀⠠⠡⠀"] # 0x2234 (por lo tanto) + - "âˆȘ": [t: "⠾⠜"] # 0x222A (uniĂłn) + - "⩊": [t: "⠱⠔"] # 0x2A4A (curva geomĂ©trica) + - "∩": [t: "â žâ ±"] # 0x2229 (intersecciĂłn) + - "⊻": [t: "â žâ ź"] # 0x2228 (disyunciĂłn excluyente) + - "√": [t: "⠾⠊"] # 0x2228 (disyunciĂłn (o)) + - "∧": [t: "â žâ ą"] # 0x2227 (conjunciĂłn (y)) + - "∀": [t: "⠘⠾⠀"] # 0x2224 (no es divisor de) + - "∝": [t: "â žâ Č"] # 0x221D (proporcional a) + - "∖": [t: "⠐⠄"] # 0x2216 (diferencia de conjuntos) + - "∌": [t: "⠘⠐⠜"] # 0x220C (no comprende; no tiene como elemento) + - "∋": [t: "⠐⠜"] # 0x220B (comprende; tiene como elemento) + - "∈": [t: "⠣⠂"] # 0x2208 (es elemento de; pertenece a) + - "∉": [t: "⠘⠣⠂"] # 0x2209 (no es un elemento de; no pertenece a) + - "∅": [t: "⠾⠚"] # 0x2205 (conjunto vacĂ­o) + - "∃": [t: "â šâ ą"] # 0x2203 (cuantificador existencial: existe por lo menos un elemento) + - "∄": [t: "⠘⠚⠹"] # 0x2204 (no existe) + - "∀": [t: "⠹⠄"] # 0x2200 (cuantificador universal: para todo) + - "ǁ": [t: "⠾⠇"] # 0x01C1 (doble barra) + - "Ă·": [t: "â Č"] # 0x00F7 (dividido por) + - "×": # 0x00D7 (multiplicar (aspas)) + # FIX: this is a hacky attempt to figure out whether this is vector multiplication or regular multiplication + # Look for an arrow above or a bold on each side + - test: + if: + - "preceding-sibling::*[1][@math-variant='bold' or self::m:mover[*[2][.='→' or .='⟶' or .='⇀']]] and" + - "following-sibling::*[1][@math-variant='bold' or self::m:mover[*[2][.='→' or .='⟶' or .='⇀']]]" + then: [t: "⠈⠊"] + else: [t: "â Š"] + - "≫": [t: "⠕⠕"] # 0x226B (mucho mayor que) + - "â‰Ș": [t: "â Șâ Ș"] # 0x226A (mucho menor que) + - "±": [t: "â –â ’â €"] # 0x00B1 (mĂĄs o menos) + - "⊁": [t: "⠘⠕⠂"] # 0x2281 (no es posterior a) + - "≻": [t: "⠕⠂"] # 0x227B (sigue a; posterior a) + - "≯": [t: "⠘⠕"] # 0x226F (no mayor que) + - "=": [t: "â ¶"] # 0x003D (igual a) + - "≠": [t: "⠘⠶"] # 0x2260 (distinto de) + - "⊀": [t: "⠘⠐â Ș"] # 0x2280 (no es anterior a) + - "âȘŒ": [t: "⠕⠕⠂"] # 0x2ABC (muy posterior a) + - "âȘ»": [t: "⠐â Șâ Ș"] # 0x2ABB (muy anterior a) + - "â‰ș": [t: "⠐â Ș"] # 0x227A (precede a; anterior a) + - "≼": [t: "⠘â Ș"] # 0x226E (no menor que) + - "∓": [t: "⠀⠒⠖"] # 0x2213 (menos o mĂĄs) + - "∕": [t: "⠠⠂"] # 0x2215 (conjunto cociente) + - "〛": [t: "â Ÿâ ‚"] # 0x301B (cerrar corchetes de clase) + - "〚": [t: "⠐⠷"] # 0x301A (abrir corchetes de clase) + - "₡": [t: "⠾⠉"] # 0x20A1 (colĂłn) + - "€": [t: "⠾⠑"] # 0x20AC (euro) + - "„": [t: "â žâ œ"] # 0x00A5 (yen) + - "ÂŁ": [t: "⠐⠟"] # 0x00A3 (libra) + - "Âą": [t: "⠘⠉"] # 0x00A2 (centavo) + - "âŒȘ": [t: "⠹⠂"] # 0x232A (cerrar parĂ©ntesis angulares) + - "〈": [t: "⠐⠅"] # 0x2329 (abrir parĂ©ntesis angulares) + - "⟹": [t: "⠐⠅"] # 0x27E8 (Mathematical left angle bracket) + - "⟩": [t: "⠹⠂"] # 0x27E9 (Mathematical right angle bracket) + - "}": [t: "⠾⠂"] # 0x007D (cerrar llaves) + - "|": [t: "⠾𝘄"] # 0x007C (barra vertical) + - "{": [t: "⠐⠇"] # 0x007B (abrir llaves) + - "\\": [t: "⠐⠄"] # 0x005C (barra inversa) + - ";": [t: "⠀⠆"] # 0x003B (punto y coma de separaciĂłn) + - "/": [t: "â Č"] # 0x002F (barra oblicua) + - "%": [t: "â žâ Ž"] # 0x0025 (tanto por ciento) + - "$": + - test: + if: "following-sibling::*[self::m:mn]" + then: [t: "⠞⠏"] # 0x0024 (peso) + else: [t: "⠾⠎"] # 0x0024 (dĂłlar) + - "#": [t: "⠌⠅"] # 0x0023 (cardinal de un conjunto) + - "₿": [t: "⠞⠃"] # 0x20BF (bitcoin) + - "⟧": [t: "â Ÿâ ‚"] # 0x27E7 (cerrar corchete de clase) + - "⟩": [t: "⠐⠷"] # 0x27E6 (abrir corchete de clase) + - "∇": [t: "⠈⠻"] # 0x2207 (Nabla (del, inverted capital delta)) + + - "≐": [t: "⠈⠶"] # 0x2250 (aproximadamente igual a) + - "≟": [t: "â ¶â ąâ €"] # 0x225F (cuestionado que sea igual a) + - "≔": [t: "â °â ¶"] # 0x2254 (igual por definiciĂłn) + - "≙": [t: "⠰⠒⠶"] # 0x2259 (corresponde a) + - "≡": [t: "â ¶â ¶"] # 0x2261 (idĂ©ntico a; congruente con) + + - "∄": [t: "⠾⠇"] # 0x2225 (es paralela a) + - "∊": [t: "⠘⠾⠇"] # 0x2226 (no paralela) + - "≅": [t: "⠐⠹⠶"] # 0x2245 (congruente con) + - "⊄": [t: "⠌⠄"] # 0x22A5 (perpendicular a/ortogonal a) [symbol used in spec] + - "⟂": [t: "⠌⠀"] # 0x27C2 (Perpendicular) + + - "⊙": [t: "⠰⠄"] # 0x2299 (operador genĂ©rico (suele utilizarse para representar una operaciĂłn entre elementos de un conjunto) + - "⊚": [t: "⠰⠄"] # 0x229A (operador genĂ©rico (suele utilizarse para representar una operaciĂłn entre elementos de un conjunto) + - "⋆": [t: "⠰⠄"] # 0x22C6 (operador genĂ©rico (suele utilizarse para representar una operaciĂłn entre elementos de un conjunto) + - "†": [t: "⠰⠄"] # 0x2020 (operador genĂ©rico (suele utilizarse para representar una operaciĂłn entre elementos de un conjunto) + - "∗": [t: "⠰⠄"] # 0x2217 (operador genĂ©rico (suele utilizarse para representar una operaciĂłn entre elementos de un conjunto) diff --git a/Rules/Braille/Nemeth/unicode.yaml b/Rules/Braille/Nemeth/unicode.yaml index 5b9c973f9..6ac9c74d8 100644 --- a/Rules/Braille/Nemeth/unicode.yaml +++ b/Rules/Braille/Nemeth/unicode.yaml @@ -1,352 +1,352 @@ ---- -# To greatly simplify typeface/language generation, the chars have unique ASCII chars for them: -# Typeface: S: sans-serif, B: bold, T: script/blackboard, I: italic, R: Roman -# Language: E: English, D: German, G: Greek, V: Greek variants, H: Hebrew, U: Russian -# Indicators: C: capital, L: letter, N: number, P: punctuation, M: multipurpose -# Others: W -- whitespace that should be kept (e.g, in a numeral) -# SRE doesn't have H: Hebrew or U: Russian, so not encoded (yet) -# Some of the weird letters (e.g., circled letters) I didn't translate with the above because -# they don't interact with rules since they are enclosed in other chars. - - - # --- Nemeth Default Alphabet normal chars. --- - - "0": [t: "Nâ Ž"] # 0x30 - - "1": [t: "N⠂"] # 0x31 - - "2": [t: "N⠆"] # 0x32 - - "3": [t: "N⠒"] # 0x33 - - "4": [t: "Nâ Č"] # 0x34 - - "5": [t: "Nâ ą"] # 0x35 - - "6": [t: "N⠖"] # 0x36 - - "7": [t: "Nâ ¶"] # 0x37 - - "8": [t: "Nâ Š"] # 0x38 - - "9": [t: "N⠔"] # 0x39 - # Latin capitals: C + cells from lowercase a-z via spell/translate. - - "A-Z": # 0x41 - 0x5a - - tc: "C" - - spell: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')" - - "a": [t: "L⠁"] # 0x61 - - "b": [t: "L⠃"] # 0x62 - - "c": [t: "L⠉"] # 0x63 - - "d": [t: "L⠙"] # 0x64 - - "e": [t: "L⠑"] # 0x65 - - "f": [t: "L⠋"] # 0x66 - - "g": [t: "L⠛"] # 0x67 - - "h": [t: "L⠓"] # 0x68 - - "i": [t: "L⠊"] # 0x69 - - "j": [t: "L⠚"] # 0x6a - - "k": [t: "L⠅"] # 0x6b - - "l": [t: "L⠇"] # 0x6c - - "m": [t: "L⠍"] # 0x6d - - "n": [t: "L⠝"] # 0x6e - - "o": [t: "L⠕"] # 0x6f - - "p": [t: "L⠏"] # 0x70 - - "q": [t: "L⠟"] # 0x71 - - "r": [t: "L⠗"] # 0x72 - - "s": [t: "L⠎"] # 0x73 - - "t": [t: "L⠞"] # 0x74 - - "u": [t: "Lâ „"] # 0x75 - - "v": [t: "Lâ §"] # 0x76 - - "w": [t: "Lâ ș"] # 0x77 - - "x": [t: "Lâ ­"] # 0x78 - - "y": [t: "Lâ œ"] # 0x79 - - "z": [t: "Lâ ”"] # 0x7a - - "Α": [t: "GCL⠁"] # 0x391 - - "Β": [t: "GCL⠃"] # 0x392 - - "Γ": [t: "GCL⠛"] # 0x393 - - "Δ": [t: "GCL⠙"] # 0x394 - - "Ε": [t: "GCL⠑"] # 0x395 - - "Ζ": [t: "GCLâ ”"] # 0x396 - - "Η": [t: "GCLâ ±"] # 0x397 - - "Θ": [t: "GCLâ č"] # 0x398 - - "Ι": [t: "GCL⠊"] # 0x399 - - "Κ": [t: "GCL⠅"] # 0x39a - - "Λ": [t: "GCL⠇"] # 0x39b - - "Μ": [t: "GCL⠍"] # 0x39c - - "Ν": [t: "GCL⠝"] # 0x39d - - "Ξ": [t: "GCLâ ­"] # 0x39e - - "Ο": [t: "GCL⠕"] # 0x39f - - "Π": [t: "GCL⠏"] # 0x3a0 - - "ÎĄ": [t: "GCL⠗"] # 0x3a1 - - "ÏŽ": [t: "GCLâ č"] # 0x3f4 - - "ÎŁ": [t: "GCL⠎"] # 0x3a3 - - "΀": [t: "GCL⠞"] # 0x3a4 - - "΄": [t: "GCLâ „"] # 0x3a5 - - "Ί": [t: "GCL⠋"] # 0x3a6 - - "Χ": [t: "GCLâ Ż"] # 0x3a7 - - "Κ": [t: "GCLâ œ"] # 0x3a8 - - "Ω": [t: "GCLâ ș"] # 0x3a9 - - "∇": [t: "GLâ «"] # 0x2207 - - "α": [t: "GL⠁"] # 0x3b1 - - "ÎČ": [t: "GL⠃"] # 0x3b2 - - "Îł": [t: "GL⠛"] # 0x3b3 - - "ÎŽ": [t: "GL⠙"] # 0x3b4 - - "Δ": [t: "GL⠑"] # 0x3b5 - - "ζ": [t: "GLâ ”"] # 0x3b6 - - "η": [t: "GLâ ±"] # 0x3b7 - - "Ξ": [t: "GLâ č"] # 0x3b8 - - "Îč": [t: "GL⠊"] # 0x3b9 - - "Îș": [t: "GL⠅"] # 0x3ba - - "λ": [t: "GL⠇"] # 0x3bb - - "ÎŒ": [t: "GL⠍"] # 0x3bc - - "Μ": [t: "GL⠝"] # 0x3bd - - "Ο": [t: "GLâ ­"] # 0x3be - - "Îż": [t: "GL⠕"] # 0x3bf - - "π": [t: "GL⠏"] # 0x3c0 - - "ρ": [t: "GL⠗"] # 0x3c1 - - "ς": [t: "VL⠎"] # 0x3c2 - - "σ": [t: "GL⠎"] # 0x3c3 - - "τ": [t: "GL⠞"] # 0x3c4 - - "υ": [t: "GLâ „"] # 0x3c5 - - "φ": [t: "VL⠋"] # 0x3c6 - - "χ": [t: "GLâ Ż"] # 0x3c7 - - "ψ": [t: "GLâ œ"] # 0x3c8 - - "ω": [t: "GLâ ș"] # 0x3c9 - - "Ï”": [t: "GL⠑"] # 0x3f5 - - "ϑ": [t: "VLâ č"] # 0x3d1 - - "ϰ": [t: "GL⠅"] # 0x3f0 - - "ϕ": [t: "GL⠋"] # 0x3d5 - - "ϱ": [t: "GL⠗"] # 0x3f1 - - "ϖ": [t: "GL⠏"] # 0x3d6 - - - # --- Nemeth Default Characters math_symbols chars. --- - - "`": [t: "⠈"] # 0x60 - - "⋼": # 0x22ee - - test: # if we have a triple bond represented by "⋼⋼", the we output the triple bond for the first but not the second - if: "@data-chemical-bond and (preceding-sibling::*[1] = '⋼' or following-sibling::*[1] = '⋼')" - then_test: - if: "following-sibling::*[1] = '⋼'" - then: [t: "â šâ č"] # output only the first of the two chars - else: [t: "⠩⠄⠄"] - - "⋯": [t: "⠄⠄⠄"] # 0x22ef - - "⋰": [t: "⠘⠄⠄"] # 0x22f0 - - "⋱": [t: "⠰⠄⠄"] # 0x22f1 - - "≡": # 0x2261 - - test: - if: "@data-chemical-bond" - then: [t: "â žâ żâ »"] - else: [t: "⠾⠇"] - - # --- Nemeth Default Characters rest chars. --- - - " ": # 0x20 (space) - - test: - if: "self::m:mn" - then: [t: "⠀"] - else: [t: "W"] - - - " ": # 0xA0 (non-breaking space) - - test: - - if: "self::m:mn" - then: [t: "⠀"] - # # part of longer string or part of preceeding or following text - - else_if: "@data-added='missing-content' or @data-empty-in-2D or @width > 1.1" - then: [t: "â ż"] # omission - - else_if: "(string-length(.) > 1 or preceding-sibling::*[1][self::m:mtext and .!=','] or following-sibling::*[1][self::m:mtext])" - then: [t: "W"] - # treat mo like 0x2061 (function apply) - - else_if: "self::m:mo and - (preceding-sibling::*[1][IsInDefinition(., 'Braille', 'GeometryShapes')] or - @data-function-likelihood and - IsInDefinition(BaseNode(.), 'Braille', 'FunctionNames') and - not(following-sibling::*[1][IsBracketed(., '', '')]) - )" - then: [t: "w"] # follows a function name, so lowercase - - - "!": # 0x21 (Factorial) - - test: - if: "self::m:mo" - then: [t: "â Ż"] - else: [t: "P⠖"] - -# - "\"": [t: ""] # 0x22 (Quotation mark) - - "#": [t: "â šâ Œ"] # 0x23 (Number sign) - - "$": [t: "⠈⠎"] # 0x24 (Dollar sign) - - "%": [t: "⠈⠎"] # 0x25 (Percent sign) - - "&": [t: "â žâ Ż"] # 0x26 (Ampersand) - - "'": [t: "P⠄"] # 0x27 (Apostrophe) - - "(": [t: "â ·"] # 0x28 (Left parenthesis) - - ")": [t: "â Ÿ"] # 0x29 (Right parenthesis) - - "*": [t: "⠈⠌"] # 0x002A (Asterisk) - - "+": # 0x002B (Plus sign) - - test: - # Add multipurpose indicator before prefix '+' to avoid being the same as '∓' - if: "not(preceding-sibling::*) and parent::*[1][name(.)='mrow' and preceding-sibling::*[1][name(.)='mo' and .='-']]" - then: [t: "mâ Ź"] - else: [t: "â Ź"] - - - ",": # 0x002C (Comma) - - test: - # test if first ancestor that isn't an mrow is a script tag (rule 78) - - if: "self::m:mn" - then: [t: "â  "] - - else_if: "ancestor-or-self::*[not(parent::m:mrow)][1][parent::m:msub or parent::m:msup or parent::m:msubsup or parent::m:mmultiscripts][preceding-sibling::*]" - then: [t: "â Ș"] # Rule 78 - else: [t: ","] # ',' used for matching purposes, converted to "⠠⠀" - - "-": # 0x002D (Hyphen) (0x2212 normalized to here) -- 38vi says don't use the punctuation indicator - - test: - # Add multipurpose indicator before prefix '+' to avoid being the same as '±' or a dash - if: "@data-chemical-bond" - then: [t: "â žâ ’â »"] - else_test: - if: "not(preceding-sibling::*) and parent::*[1][name(.)='mrow' and preceding-sibling::*[1][name(.)='mo' and (.='+' or .='-')]]" - then: [t: "mâ €"] - else: [t: "â €"] - - - ".": # 0x002E (Full stop or decimal pt) - # '.' is particularly tricky because we need to know if it is really numeric or not. - # if it is numeric, it might be a on it's own or part of a number. - # normally, it is merged with the digits if part of a number, but if the adjacent digit(s) are modified - # by something (e.g., a bar over the digit to signify that it repeats), then it is really part of the number - # If it is the last part of the expr, then it is punctuation (for typographic reasons, punctuation is often included in the math) - - test: - if: "self::m:mn or (self::m:mo and following-sibling::*)" - then_test: - if: "string-length(text()) = 1 and not( - following-sibling::*[1][BaseNode(.)[self::m:mn]] or - following-sibling::*[1][self::m:menclose and @notation='top' and *[1][self::m:mn]] - )" - then: [t: "𝑁⠹"] # example 8c(4) -- lone "." is not considered numeric, but not a period - else: [t: "Nâ š"] - else_test: - - if: "parent::m:mover and preceding-sibling::*" - then: [t: "â Ą"] - - else_if: "preceding-sibling::*[1][@data-roman-numeral or - (name(.)='mrow' and *[last()][@data-roman-numeral])]" - then: [t: "𝐏â Č"] - else: [t: "Pâ Č"] - - "/": [t: "⠾⠌"] # 0x002F (Solidus) - - ":": # 0x003A (Colon) - # sometimes a colon is meant to be a ratio - # we start to see if this is marked as 'ratio' and not marked as something else (but ignoring a literal) - # this test is based on what SRE does -- if the "roles" are the same, it guesses "ratio" - # MathCAT doesn't have roles, so we do a hack that looks checks mrows if not atomic. - # If an mrow, guess it is infix and checks the operator. This is pretty weak! - # Need to rule out field extensions "[K:F]" and trilinear coordinates "a:b:c" as they use the punctuation form - # When using the punctuation form, there may or may not be a trailing spacing depending on the "print" - # NFB Lesson 5.7 says "Follow print for spacing after the colon." - # We can't normally tell spacing, but it *should* have a space in function mapping and set builder notation if the author used appropriate notation - # The canonicalization code makes this guess and adds "data-space-after" - - test: - - if: "@intent='ratio' or - ( (@intent and starts-with(@intent, '_')) and - ../self::m:mrow and - not(ancestor::*[2][IsBracketed(., '[', ']')]) and - not( preceding-sibling::*[2][.=':'] or following-sibling::*[2][.=':']) and - name(preceding-sibling::*[1]) = name(following-sibling::*[1]) and - ( name(preceding-sibling::*[1]) != 'mrow' or - (preceding-sibling::*[1]/*[2][text()] = following-sibling::*[1]/*[2][text()]) ) - )" - then: [t: "W⠐⠂W"] - - else_if: "@data-chem-formula-op" # lewis dots - then: - - t: "â č" - else: - - t: "P⠒" - - test: - if: "@data-space-after or ancestor::*[2][IsBracketed(., '{', '}')] or following-sibling::*[1]/*[2][IsInDefinition(., 'Braille', 'Arrows')]" # "Arrows" is a bit broad... - then: [t: "W"] - - ";": [t: "P⠆"] # 0x003B (Semicolon) - - "<": [t: "⠐⠅"] # 0x003C (Less-than sign) - - "=": # 0x003D (Equals sign) - - test: - if: "@data-chemical-bond" - then: [t: "â žâ ¶â »"] - else: [t: "⠹⠅"] - - - ">": [t: "⠹⠂"] # 0x003E (Greater-than sign) - - "?": [t: "Pâ Š"] # 0x003F (Question mark) - - "@": [t: "⠈⠁"] # 0x40 (Commercial at) - - "[": [t: "⠈⠷"] # 0x005B (Left square bracket) - - "\\": [t: "â žâ Ą"] # 0x005C (Reverse solidus) - - "]": [t: "⠈⠟"] # 0x005D (Right square bracket) - - "^": [t: "â žâ Ł"] # 0x005E (Circumflex accent) - - "_": [t: ""] # 0x005F (Low line) - - "{": [t: "â šâ ·"] # 0x007B (Left curly bracket) - - "|": # 0x007C (Vertical line) - - test: - if: "preceding-sibling::* and following-sibling::*" - then: [t: "wâ łw"] # comparison (e.g., such that -- rule 145) - else: [t: "â ł"] # absolute value, others??? - - "}": [t: "â šâ Ÿ"] # 0x007D (Right curly bracket) - - "~": [t: "⠈⠱"] # 0x007E (Tilde) - - "ÂŹ": [t: ""] # 0x00AC (Not sign) - - "ÂŻ": [t: "â ±"] # 0x00AF (bar) - - "°": [t: "â šâ Ą"] # 0x00B0 (Degree sign) - - "±": [t: "â Źâ €"] # 0x00B1 (Plus-minus sign) - - "·": [t: "â Ą"] # 0x00B7 (Middle dot) - - "×": [t: "⠈⠥"] # 0x00D7 (Multiplication sign) - - "Ă·": [t: "⠹⠌"] # 0x00F7 (Division sign) - - "—": [t: "P⠀⠀"] # 0x2014 (Em dash) - # rule 43b about spaces (references rule 42) - # dashes are 'mo's so no inserted invisible times between it and currency symbols - - "―": # 0x2015 (Horizontal bar) - - test: - if: - - "not(" - - " (not(preceding-sibling::*) and parent::*[1][name(.)='mrow' and preceding-sibling::*[1][IsInDefinition(., 'Braille', 'NemethPunctAndOpenBeforeSymbols')]]) or" - - " (preceding-sibling::*[1][IsInDefinition(., 'Braille', 'NemethCurrencyBeforeSymbols')])" - - ")" - then: [t: "W"] - - t: "⠀⠀⠀⠀" - - test: - if: - - "not(" - - " name(parent::*[1])='mrow' and (" - - " (following-sibling::*[1][IsInDefinition(., 'Braille', 'NemethPunctAndOpenAfterSymbols')]) or " - - " (not(following-sibling::*) and parent::*[1][name(.)='mrow' and following-sibling::*[1][IsInDefinition(., 'Braille', 'NemethPunctAndOpenAfterSymbols')]]) or " - - " (following-sibling::*[1][.='\u2062'] and following-sibling::*[2][IsInDefinition(., 'Braille', 'NemethCurrencyAfterSymbols')])" - - " )" - - ")" - then: [t: "W"] - - - "
": # 0x2026 (Ellipsis) - # rule 43b about spaces (references rule 42); partly superseded by lesson 2.13 - # tests are ugly because an invisible times might have been inserted and we need to skip that - - test: - if: - - "not(" - - " (not(preceding-sibling::*) and parent::*[1][name(.)='mrow' and preceding-sibling::*[1][IsInDefinition(., 'Braille', 'NemethPunctAndOpenBeforeSymbols')]]) or" - - " (preceding-sibling::*[1][.='\u2062'] and preceding-sibling::*[2][IsInDefinition(., 'Braille', 'NemethCurrencyBeforeSymbols')])" - - ")" - then: [t: "W"] - - t: "⠄⠄⠄" - - test: - if: - - "not(" - - " name(parent::*[1])='mrow' and (" - - " (following-sibling::*[1][IsInDefinition(., 'Braille', 'NemethPunctAndOpenAfterSymbols')]) or " - - " (not(following-sibling::*) and parent::*[1][name(.)='mrow' and following-sibling::*[1][IsInDefinition(., 'Braille', 'NemethPunctAndOpenAfterSymbols')]]) or " - - " (following-sibling::*[1][.='\u2062'] and following-sibling::*[2][IsInDefinition(., 'Braille', 'NemethCurrencyAfterSymbols')])" - - " )" - - ")" - then: [t: "W"] - - "⁥": # 0x2061⁥ (invisible function apply) - # add a space if name doesn't have brackets after it or is in FunctionNames list - - test: - if: "not(following-sibling::*[1][IsBracketed(., '', '')]) or preceding-sibling::*[1][IsInDefinition(BaseNode(.), 'Braille', 'FunctionNames')]" - then: [t: "w"] # follows a function name, so lowercase - - "⁹": [t: ""] # 0x2062 - - "⁣": # 0x2063 (Invisible Comma -- treat like a normal comma when in a subscript[issue #40]) else ignore - - test: - # test if first ancestor that isn't an mrow is a script tag (rule 78) - - if: "self::m:mn" - then: [t: ""] - - else_if: "ancestor-or-self::*[not(parent::m:mrow)][1][parent::m:msub or parent::m:msup or parent::m:msubsup or parent::m:mmultiscripts][preceding-sibling::*]" - then: [t: "â Ș"] # Rule 78 - else: [t: ""] - - "⁀": [t: ""] # 0x2064 - - - "→": # 0x2192 (Rightwards arrow) - - test: # Rule 96 -- uncontracted form if base of under/over - if: "not(preceding-sibling::*) and parent::*[self::m:mover or self::m:munder or self::m:munderover]" - then: [t: "⠫⠒⠒⠕"] # uncontracted version - else: [t: "⠫⠕"] # contracted version - - "∂": [t: "⠈⠙"] # 0x2202 (Partial differential) - - "∆": [t: "GCL⠙"] # 2206 - - - "℃": [t: "⠘⠹⠡⠀⠰⠠⠉"] # 0x2103 (Degrees Celsius) - - "℉": [t: "⠘⠹⠡⠀⠰⠠⠋"] # 0x2109 (Degrees Fahrenheit) - - # --- restored short definitions that differ from unicode-full --- - - "∏": [t: "GCL⠏"] # 0x220F (N-ary product) - - "∑": [t: "GCL⠎"] # 0x2211 (N-ary summation) +--- +# To greatly simplify typeface/language generation, the chars have unique ASCII chars for them: +# Typeface: S: sans-serif, B: bold, T: script/blackboard, I: italic, R: Roman +# Language: E: English, D: German, G: Greek, V: Greek variants, H: Hebrew, U: Russian +# Indicators: C: capital, L: letter, N: number, P: punctuation, M: multipurpose +# Others: W -- whitespace that should be kept (e.g, in a numeral) +# SRE doesn't have H: Hebrew or U: Russian, so not encoded (yet) +# Some of the weird letters (e.g., circled letters) I didn't translate with the above because +# they don't interact with rules since they are enclosed in other chars. + + + # --- Nemeth Default Alphabet normal chars. --- + - "0": [t: "Nâ Ž"] # 0x30 + - "1": [t: "N⠂"] # 0x31 + - "2": [t: "N⠆"] # 0x32 + - "3": [t: "N⠒"] # 0x33 + - "4": [t: "Nâ Č"] # 0x34 + - "5": [t: "Nâ ą"] # 0x35 + - "6": [t: "N⠖"] # 0x36 + - "7": [t: "Nâ ¶"] # 0x37 + - "8": [t: "Nâ Š"] # 0x38 + - "9": [t: "N⠔"] # 0x39 + # Latin capitals: C + cells from lowercase a-z via spell/translate. + - "A-Z": # 0x41 - 0x5a + - tc: "C" + - spell: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')" + - "a": [t: "L⠁"] # 0x61 + - "b": [t: "L⠃"] # 0x62 + - "c": [t: "L⠉"] # 0x63 + - "d": [t: "L⠙"] # 0x64 + - "e": [t: "L⠑"] # 0x65 + - "f": [t: "L⠋"] # 0x66 + - "g": [t: "L⠛"] # 0x67 + - "h": [t: "L⠓"] # 0x68 + - "i": [t: "L⠊"] # 0x69 + - "j": [t: "L⠚"] # 0x6a + - "k": [t: "L⠅"] # 0x6b + - "l": [t: "L⠇"] # 0x6c + - "m": [t: "L⠍"] # 0x6d + - "n": [t: "L⠝"] # 0x6e + - "o": [t: "L⠕"] # 0x6f + - "p": [t: "L⠏"] # 0x70 + - "q": [t: "L⠟"] # 0x71 + - "r": [t: "L⠗"] # 0x72 + - "s": [t: "L⠎"] # 0x73 + - "t": [t: "L⠞"] # 0x74 + - "u": [t: "Lâ „"] # 0x75 + - "v": [t: "Lâ §"] # 0x76 + - "w": [t: "Lâ ș"] # 0x77 + - "x": [t: "Lâ ­"] # 0x78 + - "y": [t: "Lâ œ"] # 0x79 + - "z": [t: "Lâ ”"] # 0x7a + - "Α": [t: "GCL⠁"] # 0x391 + - "Β": [t: "GCL⠃"] # 0x392 + - "Γ": [t: "GCL⠛"] # 0x393 + - "Δ": [t: "GCL⠙"] # 0x394 + - "Ε": [t: "GCL⠑"] # 0x395 + - "Ζ": [t: "GCLâ ”"] # 0x396 + - "Η": [t: "GCLâ ±"] # 0x397 + - "Θ": [t: "GCLâ č"] # 0x398 + - "Ι": [t: "GCL⠊"] # 0x399 + - "Κ": [t: "GCL⠅"] # 0x39a + - "Λ": [t: "GCL⠇"] # 0x39b + - "Μ": [t: "GCL⠍"] # 0x39c + - "Ν": [t: "GCL⠝"] # 0x39d + - "Ξ": [t: "GCLâ ­"] # 0x39e + - "Ο": [t: "GCL⠕"] # 0x39f + - "Π": [t: "GCL⠏"] # 0x3a0 + - "ÎĄ": [t: "GCL⠗"] # 0x3a1 + - "ÏŽ": [t: "GCLâ č"] # 0x3f4 + - "ÎŁ": [t: "GCL⠎"] # 0x3a3 + - "΀": [t: "GCL⠞"] # 0x3a4 + - "΄": [t: "GCLâ „"] # 0x3a5 + - "Ί": [t: "GCL⠋"] # 0x3a6 + - "Χ": [t: "GCLâ Ż"] # 0x3a7 + - "Κ": [t: "GCLâ œ"] # 0x3a8 + - "Ω": [t: "GCLâ ș"] # 0x3a9 + - "∇": [t: "GLâ «"] # 0x2207 + - "α": [t: "GL⠁"] # 0x3b1 + - "ÎČ": [t: "GL⠃"] # 0x3b2 + - "Îł": [t: "GL⠛"] # 0x3b3 + - "ÎŽ": [t: "GL⠙"] # 0x3b4 + - "Δ": [t: "GL⠑"] # 0x3b5 + - "ζ": [t: "GLâ ”"] # 0x3b6 + - "η": [t: "GLâ ±"] # 0x3b7 + - "Ξ": [t: "GLâ č"] # 0x3b8 + - "Îč": [t: "GL⠊"] # 0x3b9 + - "Îș": [t: "GL⠅"] # 0x3ba + - "λ": [t: "GL⠇"] # 0x3bb + - "ÎŒ": [t: "GL⠍"] # 0x3bc + - "Μ": [t: "GL⠝"] # 0x3bd + - "Ο": [t: "GLâ ­"] # 0x3be + - "Îż": [t: "GL⠕"] # 0x3bf + - "π": [t: "GL⠏"] # 0x3c0 + - "ρ": [t: "GL⠗"] # 0x3c1 + - "ς": [t: "VL⠎"] # 0x3c2 + - "σ": [t: "GL⠎"] # 0x3c3 + - "τ": [t: "GL⠞"] # 0x3c4 + - "υ": [t: "GLâ „"] # 0x3c5 + - "φ": [t: "VL⠋"] # 0x3c6 + - "χ": [t: "GLâ Ż"] # 0x3c7 + - "ψ": [t: "GLâ œ"] # 0x3c8 + - "ω": [t: "GLâ ș"] # 0x3c9 + - "Ï”": [t: "GL⠑"] # 0x3f5 + - "ϑ": [t: "VLâ č"] # 0x3d1 + - "ϰ": [t: "GL⠅"] # 0x3f0 + - "ϕ": [t: "GL⠋"] # 0x3d5 + - "ϱ": [t: "GL⠗"] # 0x3f1 + - "ϖ": [t: "GL⠏"] # 0x3d6 + + + # --- Nemeth Default Characters math_symbols chars. --- + - "`": [t: "⠈"] # 0x60 + - "⋼": # 0x22ee + - test: # if we have a triple bond represented by "⋼⋼", the we output the triple bond for the first but not the second + if: "@data-chemical-bond and (preceding-sibling::*[1] = '⋼' or following-sibling::*[1] = '⋼')" + then_test: + if: "following-sibling::*[1] = '⋼'" + then: [t: "â šâ č"] # output only the first of the two chars + else: [t: "⠩⠄⠄"] + - "⋯": [t: "⠄⠄⠄"] # 0x22ef + - "⋰": [t: "⠘⠄⠄"] # 0x22f0 + - "⋱": [t: "⠰⠄⠄"] # 0x22f1 + - "≡": # 0x2261 + - test: + if: "@data-chemical-bond" + then: [t: "â žâ żâ »"] + else: [t: "⠾⠇"] + + # --- Nemeth Default Characters rest chars. --- + - " ": # 0x20 (space) + - test: + if: "self::m:mn" + then: [t: "⠀"] + else: [t: "W"] + + - " ": # 0xA0 (non-breaking space) + - test: + - if: "self::m:mn" + then: [t: "⠀"] + # # part of longer string or part of preceeding or following text + - else_if: "@data-added='missing-content' or @data-empty-in-2D or @width > 1.1" + then: [t: "â ż"] # omission + - else_if: "(string-length(.) > 1 or preceding-sibling::*[1][self::m:mtext and .!=','] or following-sibling::*[1][self::m:mtext])" + then: [t: "W"] + # treat mo like 0x2061 (function apply) + - else_if: "self::m:mo and + (preceding-sibling::*[1][IsInDefinition(., 'Braille', 'GeometryShapes')] or + @data-function-likelihood and + IsInDefinition(BaseNode(.), 'Braille', 'FunctionNames') and + not(following-sibling::*[1][IsBracketed(., '', '')]) + )" + then: [t: "w"] # follows a function name, so lowercase + + - "!": # 0x21 (Factorial) + - test: + if: "self::m:mo" + then: [t: "â Ż"] + else: [t: "P⠖"] + +# - "\"": [t: ""] # 0x22 (Quotation mark) + - "#": [t: "â šâ Œ"] # 0x23 (Number sign) + - "$": [t: "⠈⠎"] # 0x24 (Dollar sign) + - "%": [t: "⠈⠎"] # 0x25 (Percent sign) + - "&": [t: "â žâ Ż"] # 0x26 (Ampersand) + - "'": [t: "P⠄"] # 0x27 (Apostrophe) + - "(": [t: "â ·"] # 0x28 (Left parenthesis) + - ")": [t: "â Ÿ"] # 0x29 (Right parenthesis) + - "*": [t: "⠈⠌"] # 0x002A (Asterisk) + - "+": # 0x002B (Plus sign) + - test: + # Add multipurpose indicator before prefix '+' to avoid being the same as '∓' + if: "not(preceding-sibling::*) and parent::*[1][name(.)='mrow' and preceding-sibling::*[1][name(.)='mo' and .='-']]" + then: [t: "mâ Ź"] + else: [t: "â Ź"] + + - ",": # 0x002C (Comma) + - test: + # test if first ancestor that isn't an mrow is a script tag (rule 78) + - if: "self::m:mn" + then: [t: "â  "] + - else_if: "ancestor-or-self::*[not(parent::m:mrow)][1][parent::m:msub or parent::m:msup or parent::m:msubsup or parent::m:mmultiscripts][preceding-sibling::*]" + then: [t: "â Ș"] # Rule 78 + else: [t: ","] # ',' used for matching purposes, converted to "⠠⠀" + - "-": # 0x002D (Hyphen) (0x2212 normalized to here) -- 38vi says don't use the punctuation indicator + - test: + # Add multipurpose indicator before prefix '+' to avoid being the same as '±' or a dash + if: "@data-chemical-bond" + then: [t: "â žâ ’â »"] + else_test: + if: "not(preceding-sibling::*) and parent::*[1][name(.)='mrow' and preceding-sibling::*[1][name(.)='mo' and (.='+' or .='-')]]" + then: [t: "mâ €"] + else: [t: "â €"] + + - ".": # 0x002E (Full stop or decimal pt) + # '.' is particularly tricky because we need to know if it is really numeric or not. + # if it is numeric, it might be a on it's own or part of a number. + # normally, it is merged with the digits if part of a number, but if the adjacent digit(s) are modified + # by something (e.g., a bar over the digit to signify that it repeats), then it is really part of the number + # If it is the last part of the expr, then it is punctuation (for typographic reasons, punctuation is often included in the math) + - test: + if: "self::m:mn or (self::m:mo and following-sibling::*)" + then_test: + if: "string-length(text()) = 1 and not( + following-sibling::*[1][BaseNode(.)[self::m:mn]] or + following-sibling::*[1][self::m:menclose and @notation='top' and *[1][self::m:mn]] + )" + then: [t: "𝑁⠹"] # example 8c(4) -- lone "." is not considered numeric, but not a period + else: [t: "Nâ š"] + else_test: + - if: "parent::m:mover and preceding-sibling::*" + then: [t: "â Ą"] + - else_if: "preceding-sibling::*[1][@data-roman-numeral or + (name(.)='mrow' and *[last()][@data-roman-numeral])]" + then: [t: "𝐏â Č"] + else: [t: "Pâ Č"] + - "/": [t: "⠾⠌"] # 0x002F (Solidus) + - ":": # 0x003A (Colon) + # sometimes a colon is meant to be a ratio + # we start to see if this is marked as 'ratio' and not marked as something else (but ignoring a literal) + # this test is based on what SRE does -- if the "roles" are the same, it guesses "ratio" + # MathCAT doesn't have roles, so we do a hack that looks checks mrows if not atomic. + # If an mrow, guess it is infix and checks the operator. This is pretty weak! + # Need to rule out field extensions "[K:F]" and trilinear coordinates "a:b:c" as they use the punctuation form + # When using the punctuation form, there may or may not be a trailing spacing depending on the "print" + # NFB Lesson 5.7 says "Follow print for spacing after the colon." + # We can't normally tell spacing, but it *should* have a space in function mapping and set builder notation if the author used appropriate notation + # The canonicalization code makes this guess and adds "data-space-after" + - test: + - if: "@intent='ratio' or + ( (@intent and starts-with(@intent, '_')) and + ../self::m:mrow and + not(ancestor::*[2][IsBracketed(., '[', ']')]) and + not( preceding-sibling::*[2][.=':'] or following-sibling::*[2][.=':']) and + name(preceding-sibling::*[1]) = name(following-sibling::*[1]) and + ( name(preceding-sibling::*[1]) != 'mrow' or + (preceding-sibling::*[1]/*[2][text()] = following-sibling::*[1]/*[2][text()]) ) + )" + then: [t: "W⠐⠂W"] + - else_if: "@data-chem-formula-op" # lewis dots + then: + - t: "â č" + else: + - t: "P⠒" + - test: + if: "@data-space-after or ancestor::*[2][IsBracketed(., '{', '}')] or following-sibling::*[1]/*[2][IsInDefinition(., 'Braille', 'Arrows')]" # "Arrows" is a bit broad... + then: [t: "W"] + - ";": [t: "P⠆"] # 0x003B (Semicolon) + - "<": [t: "⠐⠅"] # 0x003C (Less-than sign) + - "=": # 0x003D (Equals sign) + - test: + if: "@data-chemical-bond" + then: [t: "â žâ ¶â »"] + else: [t: "⠹⠅"] + + - ">": [t: "⠹⠂"] # 0x003E (Greater-than sign) + - "?": [t: "Pâ Š"] # 0x003F (Question mark) + - "@": [t: "⠈⠁"] # 0x40 (Commercial at) + - "[": [t: "⠈⠷"] # 0x005B (Left square bracket) + - "\\": [t: "â žâ Ą"] # 0x005C (Reverse solidus) + - "]": [t: "⠈⠟"] # 0x005D (Right square bracket) + - "^": [t: "â žâ Ł"] # 0x005E (Circumflex accent) + - "_": [t: ""] # 0x005F (Low line) + - "{": [t: "â šâ ·"] # 0x007B (Left curly bracket) + - "|": # 0x007C (Vertical line) + - test: + if: "preceding-sibling::* and following-sibling::*" + then: [t: "wâ łw"] # comparison (e.g., such that -- rule 145) + else: [t: "â ł"] # absolute value, others??? + - "}": [t: "â šâ Ÿ"] # 0x007D (Right curly bracket) + - "~": [t: "⠈⠱"] # 0x007E (Tilde) + - "ÂŹ": [t: ""] # 0x00AC (Not sign) + - "ÂŻ": [t: "â ±"] # 0x00AF (bar) + - "°": [t: "â šâ Ą"] # 0x00B0 (Degree sign) + - "±": [t: "â Źâ €"] # 0x00B1 (Plus-minus sign) + - "·": [t: "â Ą"] # 0x00B7 (Middle dot) + - "×": [t: "⠈⠥"] # 0x00D7 (Multiplication sign) + - "Ă·": [t: "⠹⠌"] # 0x00F7 (Division sign) + - "—": [t: "P⠀⠀"] # 0x2014 (Em dash) + # rule 43b about spaces (references rule 42) + # dashes are 'mo's so no inserted invisible times between it and currency symbols + - "―": # 0x2015 (Horizontal bar) + - test: + if: + - "not(" + - " (not(preceding-sibling::*) and parent::*[1][name(.)='mrow' and preceding-sibling::*[1][IsInDefinition(., 'Braille', 'NemethPunctAndOpenBeforeSymbols')]]) or" + - " (preceding-sibling::*[1][IsInDefinition(., 'Braille', 'NemethCurrencyBeforeSymbols')])" + - ")" + then: [t: "W"] + - t: "⠀⠀⠀⠀" + - test: + if: + - "not(" + - " name(parent::*[1])='mrow' and (" + - " (following-sibling::*[1][IsInDefinition(., 'Braille', 'NemethPunctAndOpenAfterSymbols')]) or " + - " (not(following-sibling::*) and parent::*[1][name(.)='mrow' and following-sibling::*[1][IsInDefinition(., 'Braille', 'NemethPunctAndOpenAfterSymbols')]]) or " + - " (following-sibling::*[1][.='\u2062'] and following-sibling::*[2][IsInDefinition(., 'Braille', 'NemethCurrencyAfterSymbols')])" + - " )" + - ")" + then: [t: "W"] + + - "
": # 0x2026 (Ellipsis) + # rule 43b about spaces (references rule 42); partly superseded by lesson 2.13 + # tests are ugly because an invisible times might have been inserted and we need to skip that + - test: + if: + - "not(" + - " (not(preceding-sibling::*) and parent::*[1][name(.)='mrow' and preceding-sibling::*[1][IsInDefinition(., 'Braille', 'NemethPunctAndOpenBeforeSymbols')]]) or" + - " (preceding-sibling::*[1][.='\u2062'] and preceding-sibling::*[2][IsInDefinition(., 'Braille', 'NemethCurrencyBeforeSymbols')])" + - ")" + then: [t: "W"] + - t: "⠄⠄⠄" + - test: + if: + - "not(" + - " name(parent::*[1])='mrow' and (" + - " (following-sibling::*[1][IsInDefinition(., 'Braille', 'NemethPunctAndOpenAfterSymbols')]) or " + - " (not(following-sibling::*) and parent::*[1][name(.)='mrow' and following-sibling::*[1][IsInDefinition(., 'Braille', 'NemethPunctAndOpenAfterSymbols')]]) or " + - " (following-sibling::*[1][.='\u2062'] and following-sibling::*[2][IsInDefinition(., 'Braille', 'NemethCurrencyAfterSymbols')])" + - " )" + - ")" + then: [t: "W"] + - "⁥": # 0x2061⁥ (invisible function apply) + # add a space if name doesn't have brackets after it or is in FunctionNames list + - test: + if: "not(following-sibling::*[1][IsBracketed(., '', '')]) or preceding-sibling::*[1][IsInDefinition(BaseNode(.), 'Braille', 'FunctionNames')]" + then: [t: "w"] # follows a function name, so lowercase + - "⁹": [t: ""] # 0x2062 + - "⁣": # 0x2063 (Invisible Comma -- treat like a normal comma when in a subscript[issue #40]) else ignore + - test: + # test if first ancestor that isn't an mrow is a script tag (rule 78) + - if: "self::m:mn" + then: [t: ""] + - else_if: "ancestor-or-self::*[not(parent::m:mrow)][1][parent::m:msub or parent::m:msup or parent::m:msubsup or parent::m:mmultiscripts][preceding-sibling::*]" + then: [t: "â Ș"] # Rule 78 + else: [t: ""] + - "⁀": [t: ""] # 0x2064 + + - "→": # 0x2192 (Rightwards arrow) + - test: # Rule 96 -- uncontracted form if base of under/over + if: "not(preceding-sibling::*) and parent::*[self::m:mover or self::m:munder or self::m:munderover]" + then: [t: "⠫⠒⠒⠕"] # uncontracted version + else: [t: "⠫⠕"] # contracted version + - "∂": [t: "⠈⠙"] # 0x2202 (Partial differential) + - "∆": [t: "GCL⠙"] # 2206 + + - "℃": [t: "⠘⠹⠡⠀⠰⠠⠉"] # 0x2103 (Degrees Celsius) + - "℉": [t: "⠘⠹⠡⠀⠰⠠⠋"] # 0x2109 (Degrees Fahrenheit) + + # --- restored short definitions that differ from unicode-full --- + - "∏": [t: "GCL⠏"] # 0x220F (N-ary product) + - "∑": [t: "GCL⠎"] # 0x2211 (N-ary summation) diff --git a/Rules/Braille/UEB/unicode.yaml b/Rules/Braille/UEB/unicode.yaml index 477946d70..0700fa24f 100644 --- a/Rules/Braille/UEB/unicode.yaml +++ b/Rules/Braille/UEB/unicode.yaml @@ -1,451 +1,451 @@ ---- -# UEB characters -# -# Some chars that originally came from an Excel spreadsheet, converted to csv, and the greatly expanded -# -# The UEB translation makes use of some non-braille chars as flags -# L -- what follows is a letter -# N -- what follows is a digit -# C -- precedes L for capital letters -# G -- precedes L for Greek Letters (after C for capitals) -# Typeface Indicators ("typeforms") -# B bold, I Italic, S Sans-serif, T script, D, Fraktur, đ”č blackboard-bold -# the type face indicators can be combined with B (first) and I (second) -# Standing alone chars: -# Any character which acts as a standing alone character (e.g, "{") needs each braille symbol to be labeled -# o -- opening/left side, c -- closing/right side, b -- both open and close (e.g, '"') - - - - "=": [t: "⠐⠶"] # 0x003D (Equals) - - "≠": [t: "⠐⠶⠈⠱"] # 0x2260 (Not equal) - - "<": [t: "⠈⠣"] # 0x003C (Less than) - - "≀": [t: "⠞⠈⠣"] # 0x2264 (Less than or equal to) - - ">": [t: "⠈⠜"] # 0x003E (Greater than) - - "≣": [t: "⠈⠞⠠⠀"] # 0x2263 - - "≄": [t: "⠾⠈⠜"] # 0x2265 (Greater than or equal to) - - "â‰Ș": [t: "⠚⠈⠣"] # 0x226A (Much less than) - - "≫": [t: "⠹⠈⠜"] # 0x226B (Much greater than) - - "≼": [t: "⠈⠣⠈⠱"] # 0x226E (Not less than) - - "≯": [t: "⠈⠜⠈⠱"] # 0x226F (Not greater than) - - "≰": [t: "⠞⠈⠣⠈⠱"] # 0x2270 (Neither less than nor equal to) - - "≱": [t: "⠞⠈⠜⠈⠱"] # 0x2271 (Neither greater than nor equal to) - - "∝": [t: "⠞⠐⠶"] # 0x221D (Proportional to) - - "≃": [t: "⠾⠔"] # 0x2243 (Approximately equal to (tilde over horizontal line)) - - "≅": [t: "⠐⠾⠔"] # 0x2245 (Approximately equal to (tilde over equals sign)) - - "≈": [t: "⠘⠔"] # 0x2248 (Approximately equal (tilde over tilde)) - - "≏": [t: "⠘⠐⠶"] # 0x224F (Equals with bump in top bar (difference between)) - - "≑": [t: "⠚⠐⠶"] # 0x2251 (Geometrically equal to (equals dotted above and below)) - - "≟": [t: "đŸ™â Šâ »â â ¶"] # 0x225F (Questioned equal to) - - "≡": [t: "â žâ ż"] # 0x2261 (Equivalent to (three horizontal lines)) - - "≱": [t: "⠞⠿⠈⠱"] # 0x2262 (Not identical to) - - "∈": [t: "⠘⠑"] # 0x2208 (Element of (member of)) - - "∉": [t: "⠘⠑⠈⠱"] # 0x2209 (Not Element of) - - "+": [t: "⠐⠖"] # 0x002B (Plus sign) - - "∋": [t: "⠈⠘⠑"] # 0x220B (Contains) - - "⊂": [t: "⠘⠣"] # 0x2282 (Subset of) - - "⊃": [t: "⠘⠜"] # 0x2283 (Superset of) - - "⊆": [t: "⠞⠘⠣"] # 0x2286 (Subset of or equal) - - "⊇": [t: "⠾⠘⠜"] # 0x2287 (Superset of or equal) - - "⊊": [t: "⠚⠘⠣"] # 0x228A (Subset of with not equal) - - "⊋": [t: "⠹⠘⠜"] # 0x228B (Superset of with not equal) - - "âŠČ": [t: "⠈⠞⠣"] # 0x22B2 (Normal subgroup of) - - "⊳": [t: "⠈⠾⠜"] # 0x22B3 (Contains as normal subgroup) - - "⊮": [t: "â žâ žâ Ł"] # 0x22B4 (Normal subgroup of or equal) - - "⊔": [t: "⠾⠾⠜"] # 0x22B5 (Contains as normal subgroup or equal) - - "⊻": [t: "đŸ™â ˆâ –â  â ±"] # 0x22bb (Xor) - - "⋬": [t: "â šâ žâ Ł"] # 0x22EC (not normal subgroup) -- this isn't the same as what is in GTM 10, but that similar has no Unicode equiv - - "⋭": [t: "â šâ žâ Ł"] # 0x22ED (does not contain as normal subgroup) -- this isn't the same as what is in GTM 10, but that similar has no Unicode equiv - - "⊱": [t: "⠾⠒"] # 0x22a2 (Right tack) - - "⊣": [t: "⠈⠾⠒"] # 0x22a3 (Left tack) - - "−": [t: "⠐⠀"] # 0x2212 (Minus sign) - - "·": [t: "⠐â Č"] # 0x00B7 (Multiplication dot (times)) - - "×": [t: "⠐⠊"] # 0x00D7 (Multiplication sign (times)) - - "Ă·": [t: "⠐⠌"] # 0x00F7 (Division sign (divided by)) - - "±": [t: "⠾⠖"] # 0x00B1 (Plus or minus) - - "∓": [t: "â žâ €"] # 0x2213 (Minus or plus) - - "∗": [t: "⠐⠔"] # 0x2217 (Asterisk operator) - - "∘": [t: "⠐⠎"] # 0x2218 (Ring operator) - - "◩": [t: "⠐⠎"] # 0x25E6 (White bullet) - - "∌": [t: "⠈⠔"] # 0x223C (Tilde operator) - - "⋅": [t: "⠐â Č"] # 0x22C5 (Dot operator) - - "∧": [t: "⠈⠊"] # 0x2227 (Logical and) - - "√": [t: "⠈⠖"] # 0x2228 (Logical or) - - "∩": [t: "â šâ Š"] # 0x2229 (Intersection) - - "âˆȘ": [t: "⠹⠖"] # 0x222A (Union) - - "∖": [t: "â žâ Ą"] # 0x2216 (Set minus) - - "(": [t: "o⠐oâ Ł"] # 0x0028 (Left parenthesis) - - ")": [t: "c⠐c⠜"] # 0x0029 (Right parenthesis) - - "[": [t: "oâ šoâ Ł"] # 0x005B (Left square bracket) - - "]": [t: "câ šc⠜"] # 0x005D (Right square bracket) - - "{": [t: "oâ žoâ Ł"] # 0x007B (Left curly bracket) - - "}": [t: "câ žc⠜"] # 0x007D (Right curly bracket) - - "〈": [t: "o⠈⠣"] # 0x2329 (Left angle bracket) - - "âŒȘ": [t: "c⠈⠜"] # 0x232A (Right angle bracket) - - "⟹": [t: "o⠈⠣"] # 0x27E8 (Left angle bracket) - - "⟩": [t: "c⠈⠜"] # 0x27E9 (Right angle bracket) - - "|": # 0x007C (Vertical line) - - test: - if: "preceding-sibling::* and following-sibling::*" - then: [t: "Wâ žâ łW"] # comparison (e.g., such that -- rule 145) - else: [t: "â žâ ł"] # absolute value, others??? - - "!": [t: "c⠖"] # 0x21 (Exclamation (factorial)) - - "#": [t: "â žâ č"] # 0x23 (Number sign (hash)) - - "%": [t: "â šâ Ž"] # 0x25 (Percent sign) - - "&": [t: "⠈⠯"] # 0x26 (Ampersand) - - "*": [t: "⠐⠔"] # 0x002A (Asterisk) - - "/": [t: "⠾⠌"] # 0x002F (Solidus (slash)) - - ";": [t: "1c⠆"] # 0x003B (Semicolon) - - "?": [t: "1câ Š"] # 0x003F (Question mark) - - "@": [t: "⠈⠁"] # 0x0040 (Commercial at sign) - - "\\": [t: "â žâ Ą"] # 0x005C (Backslash) - - "^": [t: "⠈⠹"] # 0x005E (Caret (hat, up arrow)) - - "_": [t: "â šâ €"] # 0x005F (Low line (underscore)) - - "~": [t: "⠈⠔"] # 0x007E (Tilde (swung dash)) - - "Âą": [t: "⠈⠉"] # 0x00A2 (Cents sign) - - "‐": [t: "â €"] # 0x2010 (Hyphen) - - "–": [t: "Pâ  â €"] # 0x2013 (En Dash) - - "―": [t: "⠐⠠⠀"] # 0x2015 (Horizontal Bar) - - "‖": [t: "â žâ ł"] # 0x2016 - - "€": [t: "⠈⠑"] # 0x20AC (Euro sign) - - "₣": [t: "⠈⠋"] # 0x20A3 (French franc sign) - - "ÂŁ": [t: "⠈⠇"] # 0x00A3 (Pound sign) - - "₩": [t: "⠈⠝"] # 0x20A6 (Naira sign) - - "$": [t: "⠈⠎"] # 0x0024 (Dollar sign) - - "„": [t: "⠈⠜"] # 0x00A5 (Yen sign) - - "Š": [t: "â šâ ł"] # 0x00A6 (Broken bar) - - "ÂŹ": [t: "⠈â č"] # 0x00AC (Not sign) - - "°": [t: "⠘⠚"] # 0x00B0 (Degree sign) - - "†": [t: "⠈⠠â č"] # 0x2020 (Dagger) - - "‡": [t: "⠈⠠⠻"] # 0x2021 (Double dagger) - - "
": [t: "câ Čcâ Čcâ Č"] # 0x2026 (Ellipsis) - - "⋯": [t: "⠄⠄⠄"] # 0x22EF (midline horizontal ellipsis; GTM 15.4 matrix omission) - - "â€Č": [t: "1â ¶"] # 0x2032 (Prime sign) - - "″": [t: "1â ¶â ¶"] # 0x2033 (Double prime sign) - - "‮": [t: "1â ¶â ¶â ¶"] # 0x2034 (Triple prime sign) - - "℃": [t: "⠘⠚⠠⠉"] # 0x2103 (Degrees Celsius) - - "℉": [t: "⠘⠚⠠⠋"] # 0x2109 (Degrees Fahrenheit) - - "Å": [t: "CA⠘⠫L⠁"] # 0x212B (Angstrom symbol) - - "Å": [t: "CA⠘⠫L⠁"] # 0x00C5 (WIRIS uses this for Angstrom) - - "∀": [t: "⠘⠁"] # 0x2200 (For all) - - "∂": [t: "⠈⠙"] # 0x2202 (Partial differential) - - "∃": [t: "⠘⠹"] # 0x2203 (There exists) - - "∄": [t: "⠘⠹⠈⠱"] # 0x2204 (There does not exist) - - "∅": [t: "⠈⠚"] # 0x2205 (Empty set) - - "∇": [t: "⠘⠙"] # 0x2207 (Nabla (del, inverted capital delta)) - - "∎": [t: "⠞⠫⠌⠙t"] # 0x220E (End of proof) - - "√": [t: "⠐⠩"] # 0x221A (Square root (radical) without vinculum) - - "∞": [t: "â Œâ ż"] # 0x221E (Infinity) - - "∠": [t: "â žâ Ș"] # 0x2220 (Angle) - - "∥": [t: "â šâ žâ Ș"] # 0x2221 (Measured angle) - - "⊟": [t: "⠌⠞â Ș"] # 0x22BE (Right angle with arc) - - "∫": [t: "1â ź"] # 0x222B (Integral) - - "∟": [t: "⠈⠟"] # 0x222E (Contour integral (closed line integral)) - - "∎": [t: "1â  â Ą"] # 0x2234 (Therefore) - - "∔": [t: "⠈⠌"] # 0x2235 (Because (since)) - - "∶": [t: "⠒"] # 0x2236 (Ratio) - - "∷": [t: "⠒⠒"] # 0x2237 (Proportion) - - "∣": [t: "â žâ ł"] # 0x2223 (Divides) - - "∀": [t: "⠞⠳⠈⠱"] # 0x2224 (Does not divide) - - "∄": [t: "⠌⠇"] # 0x2225 (Parallel) - - "∊": [t: "⠌⠇⠈⠱"] # 0x2226 (Not parallel) - - "⟂": [t: "⠌⠀"] # 0x27C2 (Perpendicular) - - "⊄": [t: "⠌⠀"] # 0x22A5 (Up tack (perpendicular)) - - "⊩": [t: "⠾⠒"] # 0x22A6 (Assertion (is a theorem)) - - "⊹": [t: "⠘⠾⠒"] # 0x22A8 (TRUE (is valid)) - - "⊬": [t: "⠞⠒⠈⠱"] # 0x22AC (Does not prove) - - "⊭": [t: "⠘⠞⠒⠈⠱"] # 0x22AD (Not TRUE) - - "⫅": [t: "⠘⠣⠰⠻⠐⠶"] # 0x2AC5 (Subset above equals) - - "⫆": [t: "⠘⠜⠰⠻⠐⠶"] # 0x2AC6 (Superset above equals) - - "â«€": [t: "⠹⠾⠒"] # 0x2AE4 (Vertical bar double left turnstile) - - "⏠": [t: "1⠫⠌⠑t"] # 0x2B20 (White Pentagon) - - "⏥": [t: "1⠫⠌⠋t"] # 0x2B21 (White Hexagon) - - "✓": [t: "⠈⠩"] # 0x2713 (Check mark (tick)) - - "⊔": [t: "⠹⠚"] # 0x29B5 (Plimsoll sign) - - "⼖": [t: "1⠐⠠⠀⠯⠫⠿"] # 0x2B96 (MEDIUM SMALL WHITE CIRCLE WITH HORIZONTAL BAR (standard state)) - - "←": [t: "1â łâ Ș"] # 0x2190 (Leftwards arrow) - - "↑": [t: "1â łâ Ź"] # 0x2191 (Upwards arrow) - - "→": [t: "1⠳⠕"] # 0x2192 (Rightwards arrow) - - "↓": [t: "1â łâ ©"] # 0x2193 (Downwards arrow) - - "↔": [t: "1â łâ ș⠗⠕"] # 0x2194 (Left right arrow) - - "↕": [t: "1â łâ ș⠗⠬"] # 0x2195 (Up down arrow) - - "↖": [t: "1â łâ ±"] # 0x2196 (Northwest arrow) - - "↗": [t: "1⠳⠎"] # 0x2197 (Northeast arrow) - - "↘": [t: "1â łâ Ł"] # 0x2198 (Southeast arrow) - - "↙": [t: "1⠳⠜"] # 0x2199 (Southwest arrow) - - "↚": [t: "1â łâ Ș⠈⠱"] # 0x219A (Leftwards arrow with stroke) - - "↛": [t: "1â łâ •â ˆâ ±"] # 0x219B (Rightwards arrow with stroke) - - "↜": [t: "1⠳⠔⠱â Ș"] # 0x219C (Leftwards wave arrow) - - "↝": [t: "1⠳⠱⠔⠕"] # 0x219D (Rightwards wave arrow) - - "↞": [t: "1⠳⠒⠗⠗â Ș"] # 0x219E (Leftwards two headed arrow) - - "↟": [t: "1⠳⠒⠗⠗⠬"] # 0x219F (Upwards two headed arrow) - - "↠": [t: "1⠳⠒⠗⠗⠕"] # 0x21A0 (Rightwards two headed arrow) - - "↡": [t: "1â łâ ’â —â —â ©"] # 0x21A1 (Downwards two headed arrow) - - "↱": [t: "1⠳⠗⠗â Ș"] # 0x21A2 (Leftwards arrow with tail) - - "↣": [t: "1⠳⠗⠗⠕"] # 0x21A3 (Rightwards arrow with tail) - - "ↀ": [t: "1⠳⠳⠗â Ș"] # 0x21A4 (Leftwards arrow from bar) - - "ↄ": [t: "1⠳⠳⠗⠬"] # 0x21A5 (Upwards arrow from bar) - - "↩": [t: "1⠳⠳⠗⠕"] # 0x21A6 (Rightwards arrow from bar) - - "↧": [t: "1â łâ łâ —â ©"] # 0x21A7 (Downwards arrow from bar) - - "↭": [t: "1â łâ ș⠔⠱⠗⠕"] # 0x21AD (Left right wave arrow) - - "↼": [t: "1â łâ ș⠗⠕⠈⠱"] # 0x21AE (Left right arrow with stroke) - - "↰": [t: "1â łâ Žâ Ź"] # 0x21B0 (Upwards arrow with tip left) - - "↱": [t: "1â łâ Čâ Ź"] # 0x21B1 (Upwards arrow with tip right) - - "â†Č": [t: "1â łâ Čâ ©"] # 0x21B2 (Downwards arrow with tip left) - - "↳": [t: "1â łâ Žâ ©"] # 0x21B3 (Downwards arrow with tip right) - - "↶": [t: "1⠳⠔⠔â Ș"] # 0x21B6 (Anticlockwise top semicircle arrow) - - "↷": [t: "1⠳⠱⠱⠕"] # 0x21B7 (Clockwise top semicircle arrow) - - "↌": [t: "1⠳⠈⠗â Ș"] # 0x21BC (Leftwards harpoon with barb upwards) - - "↜": [t: "1⠳⠠⠗â Ș"] # 0x21BD (Leftwards harpoon with barb downwards) - - "↟": [t: "1⠳⠠⠗⠬"] # 0x21BE (Upwards harpoon with barb rightwards) - - "↿": [t: "1⠳⠈⠗⠬"] # 0x21BF (Upwards harpoon with barb leftwards) - - "⇀": [t: "1⠳⠈⠗⠕"] # 0x21C0 (Rightwards harpoon with barb upwards) - - "⇁": [t: "1⠳⠠⠗⠕"] # 0x21C1 (Rightwards harpoon with barb downwards) - - "⇂": [t: "1â łâ ˆâ —â ©"] # 0x21C2 (Downwards harpoon with barb rightwards) - - "⇃": [t: "1â łâ  â —â ©"] # 0x21C3 (Downwards harpoon with barb leftwards) - - "⇄": [t: "1⠳⠕⠻⠳â Ș"] # 0x21C4 (Rightwards arrow over leftwards arrow) - - "⇅": [t: "1â łâ Źâ żâ łâ ©"] # 0x21C5 (Upwards arrow left of Downwards arrow) - - "⇌": [t: "1⠘⠞⠶"] # 0x21CC (Rightwards harpoon over leftwards harpoon (equilibrium)) - - "⇐": [t: "1â łâ ¶â Ș"] # 0x21D0 (Leftwards double arrow) - - "⇑": [t: "1â łâ ¶â Ź"] # 0x21D1 (Upwards double arrow) - - "⇒": [t: "1â łâ ¶â •"] # 0x21D2 (Rightwards double arrow) - - "⇓": [t: "1â łâ ¶â ©"] # 0x21D3 (Downwards double arrow) - - "⇔": [t: "1â łâ ș⠶⠗⠕"] # 0x21D4 (Left right double arrow) - - "⇕": [t: "1â łâ șâ ¶â —â Ź"] # 0x21D5 (Up down double arrow) - - "⇠": [t: "1⠳⠂â Ș"] # 0x21E0 (Leftwards dashed arrow) - - "⇡": [t: "1⠳⠂⠬"] # 0x21E1 (Upwards dashed arrow) - - "⇱": [t: "1⠳⠂⠕"] # 0x21E2 (Rightwards dashed arrow) - - "⇣": [t: "1â łâ ‚â ©"] # 0x21E3 (Downwards dashed arrow) - - "⟔": [t: "1⠳⠒⠒⠒â Ș"] # 0x27F5 (Long leftwards arrow) - - "⟶": [t: "1⠳⠒⠒⠒⠕"] # 0x27F6 (Long rightwards arrow) - - "â„‚": [t: "1â žâ ¶"] # 0x2942 (Rightwards arrow above short leftwards arrow (equilibrium, trend to the right)) - - "â„„": [t: "1⠈⠞⠶"] # 0x2944 (Short rightwards arrow above leftwards arrow (equilibrium, trend to the left)) - -# Mappings for some new Unicode chemistry arrows/symbols -# These repeat the short arrow version because that is what is in the spec (GTM 16), but the spec should really use the long version - - "🣑": [t: "1⠘⠞⠶"] # 0x1F8D1 LONG RIGHTWARDS HARPOON OVER LONG LEFTWARDS HARPOON (equilibrium) - - "🣒": [t: "1⠐⠞⠶"] # 0x1f8d2 LONG RIGHTWARDS HARPOON ABOVE SHORT LEFTWARDS HARPOON(equilibrium, trend to the right) - - "🣓": [t: "1⠈⠞⠶"] # 0x1f8d3 SHORT RIGHTWARDS HARPOON ABOVE LONG LEFTWARDS HARPOON (equilibrium, trend to the left)) - -# These need to be verified -- 0x1f8d1, 0x1f8d2, and 0x1f8d3 conflict with GTM 16 (uses short arrow when really should be long) - - "🣐": [t: "1⠳⠒⠒⠒⠕⠻⠳⠒⠒⠒â Ș"] # 0x1F8D0 LONG RIGHTWARDS ARROW OVER LONG LEFTWARDS ARROW - - "🣕": [t: "1⠳⠒⠈⠗â Ș⠻⠳⠒⠒⠒⠠⠗⠕"] # 0x1F8D5 SHORT LEFTWARDS HARPOON ABOVELONG RIGHTWARDS HARPOON - - "🣖": [t: "1⠳⠒⠒⠒⠕⠯⠠⠭"] # 0x1F8D6 LONG RIGHTWARDS ARROW WITH THROUGH X - - "🣗": [t: "1⠳⠒⠒⠒⠕⠯⠣⠾⠌⠾⠌⠜"] # 0x1F8D7 LONG RIGHTWARDS ARROW WITH DOUBLE SLASH -# - "": [t: ""] # 0x1F8D8 LONG LEFT RIGHT ARROW WITH DEPENDENT LOBE (no clue what to do) - - - "△": [t: "1⠫⠌⠉t"] # 0x25B3 (Triangle) - - "▫": [t: "1⠫⠌⠙t"] # 0x25AB (Small white Square) - - "□": [t: "1⠫⠌⠙t"] # 0x25A1 (Square) - - "◻": [t: "1⠫⠌⠙t"] # 0x25FB (Square) - - "â–€": [t: "⠚⠫⠌⠙t"] # 0x25A4 (Square with horizontal fill) - - "â–„": [t: "⠚⠫⠌⠙t"] # 0x25A5 (Square with vertical fill) - - "▩": [t: "⠚⠫⠌⠙t"] # 0x25A6 (Square with orthogonal crosshatch fill) - - "▧": [t: "⠚⠫⠌⠙t"] # 0x25A7 (Square with upper left to lower right fill) - - "▹": [t: "⠚⠫⠌⠙t"] # 0x25A8 (Square with upper right to lower left fill) - - "▩": [t: "⠚⠫⠌⠙t"] # 0x25A9 (Square with diagonal crosshatch fill) - - "○": [t: "1â «â żt"] # 0x25CB (Circle) - - "◍": [t: "â šâ «â żt"] # 0x25CD (Circle with vertical fill) - - "▱": [t: "1⠫⠈⠌⠙t"] # 0x25B1 (Parallelogram) - - "â–Č": [t: "⠞⠫⠌⠉t"] # 0x25B2 (Filled triangle) - - "■": [t: "⠞⠫⠌⠙t"] # 0x25A0 (Filled square) - - "≜": [t: "⠠⠚⠙⠻⠐⠶"] # 0x225C (Delta equal to) - - "≝": [t: "1â Łâ ™â ‘â ‹â œâ »â â ¶"] # 0x225D (Equal to by definition) - - "⊕": [t: "1â «â żâ Ș⠐⠖t"] # 0x2295 (Circled plus) - - "⊖": [t: "1â «â żâ Ș⠐⠀t"] # 0x2296 (Circled minus) - - "⊗": [t: "1â «â żâ Ș⠐⠊t"] # 0x2297 (Circled times) - - "⊛": [t: "1â «â żâ Ș⠐⠔t"] # 0x229B (Circled asterisk operator) - - "⊞": [t: "1⠫⠌⠙â Ș⠐⠖t"] # 0x229E (Squared plus) - - "⊟": [t: "1⠫⠌⠙â Ș⠐⠀t"] # 0x229F (Squared minus) - - "⊠": [t: "1⠫⠌⠙â Ș⠐⠊t"] # 0x22A0 (Squared times) - - "˙": [t: "1â Č"] # 0x02D9 ( Dot Above) - - "š": [t: "1â Čâ Č"] # 0x00A8 ( Diaeresis/Double Dot Above ) - - "©": [t: "⠘⠉"] # 0xa9 (Copyright) - - - - "\"": [t: "bâ  bâ ¶"] - - "'": [t: "b⠄"] - - "“": [t: "o⠘oâ Š"] - - "”": [t: "c⠘câ Ž"] - - "‘": [t: "oâ  oâ Š"] - - "’": [t: "câ  câ Ž"] - - "«": [t: "oâ žoâ Š"] - - "»": [t: "câ žcâ Ž"] - - - " ": # 0x20 (Space) - - test: - if: "self::m:mn" - then: [t: "N⠐"] - else: [t: "W"] - - " ": # 0xa0 (Non-breaking Space) - - test: - - if: "self::m:mn" - then: [t: "N⠐"] - - else_if: "@data-added='missing-content' or @data-empty-in-2D or @width > 1.1" - then: [t: "â Ź"] # omission - - else_if: "@width < 0.25" - then: [t: ""] # tweaking space -- ignore - else: [t: "W"] # space in text or wide enough space - - ",": # 0x2c (Comma) - - test: - if: "self::m:mn" - then: [t: "N⠂"] - else: [t: "c,W"] - - ".": # 0x2e (Period) - - test: - if: "self::m:mn" - then: [t: "Nâ Č"] - else: [t: "c."] - - ":": # 0x003A (Colon) - # We can't normally tell spacing, but it *should* have a space in function mapping and set builder notation if the author used appropriate notation - # The canonicalization code makes this guess and adds "data-space-after" - - test: - if: "@data-space-after or (../self::m:mrow and ancestor::*[2][IsBracketed(., '{', '}')]) or following-sibling::*[1]/*[2][IsInDefinition(., 'Braille', 'Arrows')]" # "Arrows" is a bit broad... - then: [t: "1⠒W"] - else: [t: "1c⠒"] - - - "-": # 0x2d (Minus sign or hyphen) - - test: - if: "self::m:mo" - then: [t: "⠐⠀"] - else: [t: "â €"] - - - "⁥": # 0x2061⁥ (invisible function apply) - - test: - if: - - "preceding-sibling::*[1][self::m:mi and substring(., string-length(.), 1)!=' '] and " # avoid scripted function names and one that end with spaces - - "following-sibling::*[1][self::m:mi and translate(., 'abcdefghijklmnopqrstuvwxyz', '') = '']" # GTM 9.3.2 - then: [t: "W"] - else: [t: ""] - - - "⁹": # 0x2062 (invisible times) - - test: - if: # GTM 9.3.3 (not very clear in rule, but the function name has to start with a lower case latin char ['no indicators']) - - "parent::m:mrow and " - - "preceding-sibling::*[1][" - - " (self::m:mi and translate(., 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', '') = '') or " - - " (self::m:mrow and translate(*[last()], 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', '') = '')] and" - - " following::*[1][self::m:mrow and count(*)=3 and " # look for function apply - - " *[2][.='⁥'] and *[1][self::m:mi and translate(., 'abcdefghijklmnopqrstuvwxyz', '') = '']]" - then: [t: "W"] - else: [t: ""] - - "⁣": [t: ""] # 0x2063⁥ (invisible separator) - - "⁀": [t: ""] # 0x2064 (invisible plus) - - "0": [t: "N⠚"] # 0x30 - - "1": [t: "N⠁"] # 0x31 - - "2": [t: "N⠃"] # 0x32 - - "3": [t: "N⠉"] # 0x33 - - "4": [t: "N⠙"] # 0x34 - - "5": [t: "N⠑"] # 0x35 - - "6": [t: "N⠋"] # 0x36 - - "7": [t: "N⠛"] # 0x37 - - "8": [t: "N⠓"] # 0x38 - - "9": [t: "N⠊"] # 0x39 - - - "a": [t: "L⠁"] # 0x61 - - "b": [t: "L⠃"] # 0x62 - - "c": [t: "L⠉"] # 0x63 - - "d": [t: "L⠙"] # 0x64 - - "e": [t: "L⠑"] # 0x65 - - "f": [t: "L⠋"] # 0x66 - - "g": [t: "L⠛"] # 0x67 - - "h": [t: "L⠓"] # 0x68 - - "i": [t: "L⠊"] # 0x69 - - "j": [t: "L⠚"] # 0x6a - - "k": [t: "L⠅"] # 0x6b - - "l": [t: "L⠇"] # 0x6c - - "m": [t: "L⠍"] # 0x6d - - "n": [t: "L⠝"] # 0x6e - - "o": [t: "L⠕"] # 0x6f - - "p": [t: "L⠏"] # 0x70 - - "q": [t: "L⠟"] # 0x71 - - "r": [t: "L⠗"] # 0x72 - - "s": [t: "L⠎"] # 0x73 - - "t": [t: "L⠞"] # 0x74 - - "u": [t: "Lâ „"] # 0x75 - - "v": [t: "Lâ §"] # 0x76 - - "w": [t: "Lâ ș"] # 0x77 - - "x": [t: "Lâ ­"] # 0x78 - - "y": [t: "Lâ œ"] # 0x79 - - "z": [t: "Lâ ”"] # 0x7a - - # Latin capitals: chem-element letters use đ¶ (no word indicator); others use C. - # Cells come from lowercase a-z via spell/translate. - - "BCHIKNOPSUVWY": # chemistry-capable capitals - - test: - if: "@data-chem-element" - then: [tc: "đ¶"] - else: [tc: "C"] - - spell: "translate('.', 'BCHIKNOPSUVWY', 'bchiknopsuvwy')" - - "ADEFGJLMQRTXZ": # remaining capitals - - tc: "C" - - spell: "translate('.', 'ADEFGJLMQRTXZ', 'adefgjlmqrtxz')" - - - "α": [t: "GL⠁"] # 0x3b1 - - "ÎČ": [t: "GL⠃"] # 0x3b2 - - "Îł": [t: "GL⠛"] # 0x3b3 - - "ÎŽ": [t: "GL⠙"] # 0x3b4 - - "Δ": [t: "GL⠑"] # 0x3b5 - - "ζ": [t: "GLâ ”"] # 0x3b6 - - "η": [t: "GLâ ±"] # 0x3b7 - - "Ξ": [t: "GLâ č"] # 0x3b8 - - "Îč": [t: "GL⠊"] # 0x3b9 - - "Îș": [t: "GL⠅"] # 0x3ba - - "λ": [t: "GL⠇"] # 0x3bb - - "ÎŒ": [t: "GL⠍"] # 0x3bc - - "Μ": [t: "GL⠝"] # 0x3bd - - "Ο": [t: "GLâ ­"] # 0x3be - - "Îż": [t: "GL⠕"] # 0x3bf - - "π": [t: "GL⠏"] # 0x3c0 - - "ρ": [t: "GL⠗"] # 0x3c1 - - "ς": [t: "GL⠎"] # 0x3c2 - - "σ": [t: "GL⠎"] # 0x3c3 - - "τ": [t: "GL⠞"] # 0x3c4 - - "υ": [t: "GLâ „"] # 0x3c5 - - "φ": [t: "GL⠋"] # 0x3c6 - - "χ": [t: "GLâ Ż"] # 0x3c7 - - "ψ": [t: "GLâ œ"] # 0x3c8 - - "ω": [t: "GLâ ș"] # 0x3c9 - - - "ϑ": [t: "GLâ č"] # 0x3d1 - - "Ï”": [t: "GL⠑"] # 0x3f5 \varepsilon - - "ϰ": [t: "GL⠅"] # 0x3f0 - - "ϕ": [t: "GL⠋"] # 0x3d5 - - "ϱ": [t: "GL⠗"] # 0x3f1 - - "ϖ": [t: "GL⠏"] # 0x3d6 - - "Ϝ": [t: "GLâ §"] # 0x3d7 - - - "Α": [t: "CGL⠁"] # 0x391 - - "Β": [t: "CGL⠃"] # 0x392 - - "Γ": [t: "CGL⠛"] # 0x393 - - "Δ": [t: "CGL⠙"] # 0x394 - - "Ε": [t: "CGL⠑"] # 0x395 - - "Ζ": [t: "CGLâ ”"] # 0x396 - - "Η": [t: "CGLâ ±"] # 0x397 - - "Θ": [t: "CGLâ č"] # 0x398 - - "Ι": [t: "CGL⠊"] # 0x399 - - "Κ": [t: "CGL⠅"] # 0x39a - - "Λ": [t: "CGL⠇"] # 0x39b - - "Μ": [t: "CGL⠍"] # 0x39c - - "Ν": [t: "CGL⠝"] # 0x39d - - "Ξ": [t: "CGLâ ­"] # 0x39e - - "Ο": [t: "CGL⠕"] # 0x39f - - "Π": [t: "CGL⠏"] # 0x3a0 - - "ÎĄ": [t: "CGL⠗"] # 0x3a1 - - "Îą": [t: "CGL⠎"] # 0x3a2 - - "ÎŁ": [t: "CGL⠎"] # 0x3a3 - - "΀": [t: "CGL⠞"] # 0x3a4 - - "΄": [t: "CGLâ „"] # 0x3a5 - - "Ί": [t: "CGL⠋"] # 0x3a6 - - "Χ": [t: "CGLâ Ż"] # 0x3a7 - - "Κ": [t: "CGLâ œ"] # 0x3a8 - - "Ω": [t: "CGLâ ș"] # 0x3a9 - - - "”": [t: "GL⠍"] # 0x00B5 (Micro (Greek mu)) - - "℩": [t: "CGLâ ș"] # 0x2126 (Ohm sign (capital Greek omega)) - - "∆": [t: "CGL⠙"] # 0x2206 (Increment (capital Greek delta)) - - "∏": [t: "CGL⠏"] # 0x220F (Product (capital Greek pi)) - - "∑": [t: "CGL⠎"] # 0x2211 (Sum (capital Greek sigma)) - - # --- restored short definitions that differ from unicode-full --- - - "⋇": [t: "1⠌⠯⠩"] # 0x22C7 (Division times) - - "⊩": [t: "⠾⠳⠿⠾⠒"] # 0x22A9 (Forces) +--- +# UEB characters +# +# Some chars that originally came from an Excel spreadsheet, converted to csv, and the greatly expanded +# +# The UEB translation makes use of some non-braille chars as flags +# L -- what follows is a letter +# N -- what follows is a digit +# C -- precedes L for capital letters +# G -- precedes L for Greek Letters (after C for capitals) +# Typeface Indicators ("typeforms") +# B bold, I Italic, S Sans-serif, T script, D, Fraktur, đ”č blackboard-bold +# the type face indicators can be combined with B (first) and I (second) +# Standing alone chars: +# Any character which acts as a standing alone character (e.g, "{") needs each braille symbol to be labeled +# o -- opening/left side, c -- closing/right side, b -- both open and close (e.g, '"') + + + - "=": [t: "⠐⠶"] # 0x003D (Equals) + - "≠": [t: "⠐⠶⠈⠱"] # 0x2260 (Not equal) + - "<": [t: "⠈⠣"] # 0x003C (Less than) + - "≀": [t: "⠞⠈⠣"] # 0x2264 (Less than or equal to) + - ">": [t: "⠈⠜"] # 0x003E (Greater than) + - "≣": [t: "⠈⠞⠠⠀"] # 0x2263 + - "≄": [t: "⠾⠈⠜"] # 0x2265 (Greater than or equal to) + - "â‰Ș": [t: "⠚⠈⠣"] # 0x226A (Much less than) + - "≫": [t: "⠹⠈⠜"] # 0x226B (Much greater than) + - "≼": [t: "⠈⠣⠈⠱"] # 0x226E (Not less than) + - "≯": [t: "⠈⠜⠈⠱"] # 0x226F (Not greater than) + - "≰": [t: "⠞⠈⠣⠈⠱"] # 0x2270 (Neither less than nor equal to) + - "≱": [t: "⠞⠈⠜⠈⠱"] # 0x2271 (Neither greater than nor equal to) + - "∝": [t: "⠞⠐⠶"] # 0x221D (Proportional to) + - "≃": [t: "⠾⠔"] # 0x2243 (Approximately equal to (tilde over horizontal line)) + - "≅": [t: "⠐⠾⠔"] # 0x2245 (Approximately equal to (tilde over equals sign)) + - "≈": [t: "⠘⠔"] # 0x2248 (Approximately equal (tilde over tilde)) + - "≏": [t: "⠘⠐⠶"] # 0x224F (Equals with bump in top bar (difference between)) + - "≑": [t: "⠚⠐⠶"] # 0x2251 (Geometrically equal to (equals dotted above and below)) + - "≟": [t: "đŸ™â Šâ »â â ¶"] # 0x225F (Questioned equal to) + - "≡": [t: "â žâ ż"] # 0x2261 (Equivalent to (three horizontal lines)) + - "≱": [t: "⠞⠿⠈⠱"] # 0x2262 (Not identical to) + - "∈": [t: "⠘⠑"] # 0x2208 (Element of (member of)) + - "∉": [t: "⠘⠑⠈⠱"] # 0x2209 (Not Element of) + - "+": [t: "⠐⠖"] # 0x002B (Plus sign) + - "∋": [t: "⠈⠘⠑"] # 0x220B (Contains) + - "⊂": [t: "⠘⠣"] # 0x2282 (Subset of) + - "⊃": [t: "⠘⠜"] # 0x2283 (Superset of) + - "⊆": [t: "⠞⠘⠣"] # 0x2286 (Subset of or equal) + - "⊇": [t: "⠾⠘⠜"] # 0x2287 (Superset of or equal) + - "⊊": [t: "⠚⠘⠣"] # 0x228A (Subset of with not equal) + - "⊋": [t: "⠹⠘⠜"] # 0x228B (Superset of with not equal) + - "âŠČ": [t: "⠈⠞⠣"] # 0x22B2 (Normal subgroup of) + - "⊳": [t: "⠈⠾⠜"] # 0x22B3 (Contains as normal subgroup) + - "⊮": [t: "â žâ žâ Ł"] # 0x22B4 (Normal subgroup of or equal) + - "⊔": [t: "⠾⠾⠜"] # 0x22B5 (Contains as normal subgroup or equal) + - "⊻": [t: "đŸ™â ˆâ –â  â ±"] # 0x22bb (Xor) + - "⋬": [t: "â šâ žâ Ł"] # 0x22EC (not normal subgroup) -- this isn't the same as what is in GTM 10, but that similar has no Unicode equiv + - "⋭": [t: "â šâ žâ Ł"] # 0x22ED (does not contain as normal subgroup) -- this isn't the same as what is in GTM 10, but that similar has no Unicode equiv + - "⊱": [t: "⠾⠒"] # 0x22a2 (Right tack) + - "⊣": [t: "⠈⠾⠒"] # 0x22a3 (Left tack) + - "−": [t: "⠐⠀"] # 0x2212 (Minus sign) + - "·": [t: "⠐â Č"] # 0x00B7 (Multiplication dot (times)) + - "×": [t: "⠐⠊"] # 0x00D7 (Multiplication sign (times)) + - "Ă·": [t: "⠐⠌"] # 0x00F7 (Division sign (divided by)) + - "±": [t: "⠾⠖"] # 0x00B1 (Plus or minus) + - "∓": [t: "â žâ €"] # 0x2213 (Minus or plus) + - "∗": [t: "⠐⠔"] # 0x2217 (Asterisk operator) + - "∘": [t: "⠐⠎"] # 0x2218 (Ring operator) + - "◩": [t: "⠐⠎"] # 0x25E6 (White bullet) + - "∌": [t: "⠈⠔"] # 0x223C (Tilde operator) + - "⋅": [t: "⠐â Č"] # 0x22C5 (Dot operator) + - "∧": [t: "⠈⠊"] # 0x2227 (Logical and) + - "√": [t: "⠈⠖"] # 0x2228 (Logical or) + - "∩": [t: "â šâ Š"] # 0x2229 (Intersection) + - "âˆȘ": [t: "⠹⠖"] # 0x222A (Union) + - "∖": [t: "â žâ Ą"] # 0x2216 (Set minus) + - "(": [t: "o⠐oâ Ł"] # 0x0028 (Left parenthesis) + - ")": [t: "c⠐c⠜"] # 0x0029 (Right parenthesis) + - "[": [t: "oâ šoâ Ł"] # 0x005B (Left square bracket) + - "]": [t: "câ šc⠜"] # 0x005D (Right square bracket) + - "{": [t: "oâ žoâ Ł"] # 0x007B (Left curly bracket) + - "}": [t: "câ žc⠜"] # 0x007D (Right curly bracket) + - "〈": [t: "o⠈⠣"] # 0x2329 (Left angle bracket) + - "âŒȘ": [t: "c⠈⠜"] # 0x232A (Right angle bracket) + - "⟹": [t: "o⠈⠣"] # 0x27E8 (Left angle bracket) + - "⟩": [t: "c⠈⠜"] # 0x27E9 (Right angle bracket) + - "|": # 0x007C (Vertical line) + - test: + if: "preceding-sibling::* and following-sibling::*" + then: [t: "Wâ žâ łW"] # comparison (e.g., such that -- rule 145) + else: [t: "â žâ ł"] # absolute value, others??? + - "!": [t: "c⠖"] # 0x21 (Exclamation (factorial)) + - "#": [t: "â žâ č"] # 0x23 (Number sign (hash)) + - "%": [t: "â šâ Ž"] # 0x25 (Percent sign) + - "&": [t: "⠈⠯"] # 0x26 (Ampersand) + - "*": [t: "⠐⠔"] # 0x002A (Asterisk) + - "/": [t: "⠾⠌"] # 0x002F (Solidus (slash)) + - ";": [t: "1c⠆"] # 0x003B (Semicolon) + - "?": [t: "1câ Š"] # 0x003F (Question mark) + - "@": [t: "⠈⠁"] # 0x0040 (Commercial at sign) + - "\\": [t: "â žâ Ą"] # 0x005C (Backslash) + - "^": [t: "⠈⠹"] # 0x005E (Caret (hat, up arrow)) + - "_": [t: "â šâ €"] # 0x005F (Low line (underscore)) + - "~": [t: "⠈⠔"] # 0x007E (Tilde (swung dash)) + - "Âą": [t: "⠈⠉"] # 0x00A2 (Cents sign) + - "‐": [t: "â €"] # 0x2010 (Hyphen) + - "–": [t: "Pâ  â €"] # 0x2013 (En Dash) + - "―": [t: "⠐⠠⠀"] # 0x2015 (Horizontal Bar) + - "‖": [t: "â žâ ł"] # 0x2016 + - "€": [t: "⠈⠑"] # 0x20AC (Euro sign) + - "₣": [t: "⠈⠋"] # 0x20A3 (French franc sign) + - "ÂŁ": [t: "⠈⠇"] # 0x00A3 (Pound sign) + - "₩": [t: "⠈⠝"] # 0x20A6 (Naira sign) + - "$": [t: "⠈⠎"] # 0x0024 (Dollar sign) + - "„": [t: "⠈⠜"] # 0x00A5 (Yen sign) + - "Š": [t: "â šâ ł"] # 0x00A6 (Broken bar) + - "ÂŹ": [t: "⠈â č"] # 0x00AC (Not sign) + - "°": [t: "⠘⠚"] # 0x00B0 (Degree sign) + - "†": [t: "⠈⠠â č"] # 0x2020 (Dagger) + - "‡": [t: "⠈⠠⠻"] # 0x2021 (Double dagger) + - "
": [t: "câ Čcâ Čcâ Č"] # 0x2026 (Ellipsis) + - "⋯": [t: "⠄⠄⠄"] # 0x22EF (midline horizontal ellipsis; GTM 15.4 matrix omission) + - "â€Č": [t: "1â ¶"] # 0x2032 (Prime sign) + - "″": [t: "1â ¶â ¶"] # 0x2033 (Double prime sign) + - "‮": [t: "1â ¶â ¶â ¶"] # 0x2034 (Triple prime sign) + - "℃": [t: "⠘⠚⠠⠉"] # 0x2103 (Degrees Celsius) + - "℉": [t: "⠘⠚⠠⠋"] # 0x2109 (Degrees Fahrenheit) + - "Å": [t: "CA⠘⠫L⠁"] # 0x212B (Angstrom symbol) + - "Å": [t: "CA⠘⠫L⠁"] # 0x00C5 (WIRIS uses this for Angstrom) + - "∀": [t: "⠘⠁"] # 0x2200 (For all) + - "∂": [t: "⠈⠙"] # 0x2202 (Partial differential) + - "∃": [t: "⠘⠹"] # 0x2203 (There exists) + - "∄": [t: "⠘⠹⠈⠱"] # 0x2204 (There does not exist) + - "∅": [t: "⠈⠚"] # 0x2205 (Empty set) + - "∇": [t: "⠘⠙"] # 0x2207 (Nabla (del, inverted capital delta)) + - "∎": [t: "⠞⠫⠌⠙t"] # 0x220E (End of proof) + - "√": [t: "⠐⠩"] # 0x221A (Square root (radical) without vinculum) + - "∞": [t: "â Œâ ż"] # 0x221E (Infinity) + - "∠": [t: "â žâ Ș"] # 0x2220 (Angle) + - "∥": [t: "â šâ žâ Ș"] # 0x2221 (Measured angle) + - "⊟": [t: "⠌⠞â Ș"] # 0x22BE (Right angle with arc) + - "∫": [t: "1â ź"] # 0x222B (Integral) + - "∟": [t: "⠈⠟"] # 0x222E (Contour integral (closed line integral)) + - "∎": [t: "1â  â Ą"] # 0x2234 (Therefore) + - "∔": [t: "⠈⠌"] # 0x2235 (Because (since)) + - "∶": [t: "⠒"] # 0x2236 (Ratio) + - "∷": [t: "⠒⠒"] # 0x2237 (Proportion) + - "∣": [t: "â žâ ł"] # 0x2223 (Divides) + - "∀": [t: "⠞⠳⠈⠱"] # 0x2224 (Does not divide) + - "∄": [t: "⠌⠇"] # 0x2225 (Parallel) + - "∊": [t: "⠌⠇⠈⠱"] # 0x2226 (Not parallel) + - "⟂": [t: "⠌⠀"] # 0x27C2 (Perpendicular) + - "⊄": [t: "⠌⠀"] # 0x22A5 (Up tack (perpendicular)) + - "⊩": [t: "⠾⠒"] # 0x22A6 (Assertion (is a theorem)) + - "⊹": [t: "⠘⠾⠒"] # 0x22A8 (TRUE (is valid)) + - "⊬": [t: "⠞⠒⠈⠱"] # 0x22AC (Does not prove) + - "⊭": [t: "⠘⠞⠒⠈⠱"] # 0x22AD (Not TRUE) + - "⫅": [t: "⠘⠣⠰⠻⠐⠶"] # 0x2AC5 (Subset above equals) + - "⫆": [t: "⠘⠜⠰⠻⠐⠶"] # 0x2AC6 (Superset above equals) + - "â«€": [t: "⠹⠾⠒"] # 0x2AE4 (Vertical bar double left turnstile) + - "⏠": [t: "1⠫⠌⠑t"] # 0x2B20 (White Pentagon) + - "⏥": [t: "1⠫⠌⠋t"] # 0x2B21 (White Hexagon) + - "✓": [t: "⠈⠩"] # 0x2713 (Check mark (tick)) + - "⊔": [t: "⠹⠚"] # 0x29B5 (Plimsoll sign) + - "⼖": [t: "1⠐⠠⠀⠯⠫⠿"] # 0x2B96 (MEDIUM SMALL WHITE CIRCLE WITH HORIZONTAL BAR (standard state)) + - "←": [t: "1â łâ Ș"] # 0x2190 (Leftwards arrow) + - "↑": [t: "1â łâ Ź"] # 0x2191 (Upwards arrow) + - "→": [t: "1⠳⠕"] # 0x2192 (Rightwards arrow) + - "↓": [t: "1â łâ ©"] # 0x2193 (Downwards arrow) + - "↔": [t: "1â łâ ș⠗⠕"] # 0x2194 (Left right arrow) + - "↕": [t: "1â łâ ș⠗⠬"] # 0x2195 (Up down arrow) + - "↖": [t: "1â łâ ±"] # 0x2196 (Northwest arrow) + - "↗": [t: "1⠳⠎"] # 0x2197 (Northeast arrow) + - "↘": [t: "1â łâ Ł"] # 0x2198 (Southeast arrow) + - "↙": [t: "1⠳⠜"] # 0x2199 (Southwest arrow) + - "↚": [t: "1â łâ Ș⠈⠱"] # 0x219A (Leftwards arrow with stroke) + - "↛": [t: "1â łâ •â ˆâ ±"] # 0x219B (Rightwards arrow with stroke) + - "↜": [t: "1⠳⠔⠱â Ș"] # 0x219C (Leftwards wave arrow) + - "↝": [t: "1⠳⠱⠔⠕"] # 0x219D (Rightwards wave arrow) + - "↞": [t: "1⠳⠒⠗⠗â Ș"] # 0x219E (Leftwards two headed arrow) + - "↟": [t: "1⠳⠒⠗⠗⠬"] # 0x219F (Upwards two headed arrow) + - "↠": [t: "1⠳⠒⠗⠗⠕"] # 0x21A0 (Rightwards two headed arrow) + - "↡": [t: "1â łâ ’â —â —â ©"] # 0x21A1 (Downwards two headed arrow) + - "↱": [t: "1⠳⠗⠗â Ș"] # 0x21A2 (Leftwards arrow with tail) + - "↣": [t: "1⠳⠗⠗⠕"] # 0x21A3 (Rightwards arrow with tail) + - "ↀ": [t: "1⠳⠳⠗â Ș"] # 0x21A4 (Leftwards arrow from bar) + - "ↄ": [t: "1⠳⠳⠗⠬"] # 0x21A5 (Upwards arrow from bar) + - "↩": [t: "1⠳⠳⠗⠕"] # 0x21A6 (Rightwards arrow from bar) + - "↧": [t: "1â łâ łâ —â ©"] # 0x21A7 (Downwards arrow from bar) + - "↭": [t: "1â łâ ș⠔⠱⠗⠕"] # 0x21AD (Left right wave arrow) + - "↼": [t: "1â łâ ș⠗⠕⠈⠱"] # 0x21AE (Left right arrow with stroke) + - "↰": [t: "1â łâ Žâ Ź"] # 0x21B0 (Upwards arrow with tip left) + - "↱": [t: "1â łâ Čâ Ź"] # 0x21B1 (Upwards arrow with tip right) + - "â†Č": [t: "1â łâ Čâ ©"] # 0x21B2 (Downwards arrow with tip left) + - "↳": [t: "1â łâ Žâ ©"] # 0x21B3 (Downwards arrow with tip right) + - "↶": [t: "1⠳⠔⠔â Ș"] # 0x21B6 (Anticlockwise top semicircle arrow) + - "↷": [t: "1⠳⠱⠱⠕"] # 0x21B7 (Clockwise top semicircle arrow) + - "↌": [t: "1⠳⠈⠗â Ș"] # 0x21BC (Leftwards harpoon with barb upwards) + - "↜": [t: "1⠳⠠⠗â Ș"] # 0x21BD (Leftwards harpoon with barb downwards) + - "↟": [t: "1⠳⠠⠗⠬"] # 0x21BE (Upwards harpoon with barb rightwards) + - "↿": [t: "1⠳⠈⠗⠬"] # 0x21BF (Upwards harpoon with barb leftwards) + - "⇀": [t: "1⠳⠈⠗⠕"] # 0x21C0 (Rightwards harpoon with barb upwards) + - "⇁": [t: "1⠳⠠⠗⠕"] # 0x21C1 (Rightwards harpoon with barb downwards) + - "⇂": [t: "1â łâ ˆâ —â ©"] # 0x21C2 (Downwards harpoon with barb rightwards) + - "⇃": [t: "1â łâ  â —â ©"] # 0x21C3 (Downwards harpoon with barb leftwards) + - "⇄": [t: "1⠳⠕⠻⠳â Ș"] # 0x21C4 (Rightwards arrow over leftwards arrow) + - "⇅": [t: "1â łâ Źâ żâ łâ ©"] # 0x21C5 (Upwards arrow left of Downwards arrow) + - "⇌": [t: "1⠘⠞⠶"] # 0x21CC (Rightwards harpoon over leftwards harpoon (equilibrium)) + - "⇐": [t: "1â łâ ¶â Ș"] # 0x21D0 (Leftwards double arrow) + - "⇑": [t: "1â łâ ¶â Ź"] # 0x21D1 (Upwards double arrow) + - "⇒": [t: "1â łâ ¶â •"] # 0x21D2 (Rightwards double arrow) + - "⇓": [t: "1â łâ ¶â ©"] # 0x21D3 (Downwards double arrow) + - "⇔": [t: "1â łâ ș⠶⠗⠕"] # 0x21D4 (Left right double arrow) + - "⇕": [t: "1â łâ șâ ¶â —â Ź"] # 0x21D5 (Up down double arrow) + - "⇠": [t: "1⠳⠂â Ș"] # 0x21E0 (Leftwards dashed arrow) + - "⇡": [t: "1⠳⠂⠬"] # 0x21E1 (Upwards dashed arrow) + - "⇱": [t: "1⠳⠂⠕"] # 0x21E2 (Rightwards dashed arrow) + - "⇣": [t: "1â łâ ‚â ©"] # 0x21E3 (Downwards dashed arrow) + - "⟔": [t: "1⠳⠒⠒⠒â Ș"] # 0x27F5 (Long leftwards arrow) + - "⟶": [t: "1⠳⠒⠒⠒⠕"] # 0x27F6 (Long rightwards arrow) + - "â„‚": [t: "1â žâ ¶"] # 0x2942 (Rightwards arrow above short leftwards arrow (equilibrium, trend to the right)) + - "â„„": [t: "1⠈⠞⠶"] # 0x2944 (Short rightwards arrow above leftwards arrow (equilibrium, trend to the left)) + +# Mappings for some new Unicode chemistry arrows/symbols +# These repeat the short arrow version because that is what is in the spec (GTM 16), but the spec should really use the long version + - "🣑": [t: "1⠘⠞⠶"] # 0x1F8D1 LONG RIGHTWARDS HARPOON OVER LONG LEFTWARDS HARPOON (equilibrium) + - "🣒": [t: "1⠐⠞⠶"] # 0x1f8d2 LONG RIGHTWARDS HARPOON ABOVE SHORT LEFTWARDS HARPOON(equilibrium, trend to the right) + - "🣓": [t: "1⠈⠞⠶"] # 0x1f8d3 SHORT RIGHTWARDS HARPOON ABOVE LONG LEFTWARDS HARPOON (equilibrium, trend to the left)) + +# These need to be verified -- 0x1f8d1, 0x1f8d2, and 0x1f8d3 conflict with GTM 16 (uses short arrow when really should be long) + - "🣐": [t: "1⠳⠒⠒⠒⠕⠻⠳⠒⠒⠒â Ș"] # 0x1F8D0 LONG RIGHTWARDS ARROW OVER LONG LEFTWARDS ARROW + - "🣕": [t: "1⠳⠒⠈⠗â Ș⠻⠳⠒⠒⠒⠠⠗⠕"] # 0x1F8D5 SHORT LEFTWARDS HARPOON ABOVELONG RIGHTWARDS HARPOON + - "🣖": [t: "1⠳⠒⠒⠒⠕⠯⠠⠭"] # 0x1F8D6 LONG RIGHTWARDS ARROW WITH THROUGH X + - "🣗": [t: "1⠳⠒⠒⠒⠕⠯⠣⠾⠌⠾⠌⠜"] # 0x1F8D7 LONG RIGHTWARDS ARROW WITH DOUBLE SLASH +# - "": [t: ""] # 0x1F8D8 LONG LEFT RIGHT ARROW WITH DEPENDENT LOBE (no clue what to do) + + - "△": [t: "1⠫⠌⠉t"] # 0x25B3 (Triangle) + - "▫": [t: "1⠫⠌⠙t"] # 0x25AB (Small white Square) + - "□": [t: "1⠫⠌⠙t"] # 0x25A1 (Square) + - "◻": [t: "1⠫⠌⠙t"] # 0x25FB (Square) + - "â–€": [t: "⠚⠫⠌⠙t"] # 0x25A4 (Square with horizontal fill) + - "â–„": [t: "⠚⠫⠌⠙t"] # 0x25A5 (Square with vertical fill) + - "▩": [t: "⠚⠫⠌⠙t"] # 0x25A6 (Square with orthogonal crosshatch fill) + - "▧": [t: "⠚⠫⠌⠙t"] # 0x25A7 (Square with upper left to lower right fill) + - "▹": [t: "⠚⠫⠌⠙t"] # 0x25A8 (Square with upper right to lower left fill) + - "▩": [t: "⠚⠫⠌⠙t"] # 0x25A9 (Square with diagonal crosshatch fill) + - "○": [t: "1â «â żt"] # 0x25CB (Circle) + - "◍": [t: "â šâ «â żt"] # 0x25CD (Circle with vertical fill) + - "▱": [t: "1⠫⠈⠌⠙t"] # 0x25B1 (Parallelogram) + - "â–Č": [t: "⠞⠫⠌⠉t"] # 0x25B2 (Filled triangle) + - "■": [t: "⠞⠫⠌⠙t"] # 0x25A0 (Filled square) + - "≜": [t: "⠠⠚⠙⠻⠐⠶"] # 0x225C (Delta equal to) + - "≝": [t: "1â Łâ ™â ‘â ‹â œâ »â â ¶"] # 0x225D (Equal to by definition) + - "⊕": [t: "1â «â żâ Ș⠐⠖t"] # 0x2295 (Circled plus) + - "⊖": [t: "1â «â żâ Ș⠐⠀t"] # 0x2296 (Circled minus) + - "⊗": [t: "1â «â żâ Ș⠐⠊t"] # 0x2297 (Circled times) + - "⊛": [t: "1â «â żâ Ș⠐⠔t"] # 0x229B (Circled asterisk operator) + - "⊞": [t: "1⠫⠌⠙â Ș⠐⠖t"] # 0x229E (Squared plus) + - "⊟": [t: "1⠫⠌⠙â Ș⠐⠀t"] # 0x229F (Squared minus) + - "⊠": [t: "1⠫⠌⠙â Ș⠐⠊t"] # 0x22A0 (Squared times) + - "˙": [t: "1â Č"] # 0x02D9 ( Dot Above) + - "š": [t: "1â Čâ Č"] # 0x00A8 ( Diaeresis/Double Dot Above ) + - "©": [t: "⠘⠉"] # 0xa9 (Copyright) + + + - "\"": [t: "bâ  bâ ¶"] + - "'": [t: "b⠄"] + - "“": [t: "o⠘oâ Š"] + - "”": [t: "c⠘câ Ž"] + - "‘": [t: "oâ  oâ Š"] + - "’": [t: "câ  câ Ž"] + - "«": [t: "oâ žoâ Š"] + - "»": [t: "câ žcâ Ž"] + + - " ": # 0x20 (Space) + - test: + if: "self::m:mn" + then: [t: "N⠐"] + else: [t: "W"] + - " ": # 0xa0 (Non-breaking Space) + - test: + - if: "self::m:mn" + then: [t: "N⠐"] + - else_if: "@data-added='missing-content' or @data-empty-in-2D or @width > 1.1" + then: [t: "â Ź"] # omission + - else_if: "@width < 0.25" + then: [t: ""] # tweaking space -- ignore + else: [t: "W"] # space in text or wide enough space + - ",": # 0x2c (Comma) + - test: + if: "self::m:mn" + then: [t: "N⠂"] + else: [t: "c,W"] + - ".": # 0x2e (Period) + - test: + if: "self::m:mn" + then: [t: "Nâ Č"] + else: [t: "c."] + - ":": # 0x003A (Colon) + # We can't normally tell spacing, but it *should* have a space in function mapping and set builder notation if the author used appropriate notation + # The canonicalization code makes this guess and adds "data-space-after" + - test: + if: "@data-space-after or (../self::m:mrow and ancestor::*[2][IsBracketed(., '{', '}')]) or following-sibling::*[1]/*[2][IsInDefinition(., 'Braille', 'Arrows')]" # "Arrows" is a bit broad... + then: [t: "1⠒W"] + else: [t: "1c⠒"] + + - "-": # 0x2d (Minus sign or hyphen) + - test: + if: "self::m:mo" + then: [t: "⠐⠀"] + else: [t: "â €"] + + - "⁥": # 0x2061⁥ (invisible function apply) + - test: + if: + - "preceding-sibling::*[1][self::m:mi and substring(., string-length(.), 1)!=' '] and " # avoid scripted function names and one that end with spaces + - "following-sibling::*[1][self::m:mi and translate(., 'abcdefghijklmnopqrstuvwxyz', '') = '']" # GTM 9.3.2 + then: [t: "W"] + else: [t: ""] + + - "⁹": # 0x2062 (invisible times) + - test: + if: # GTM 9.3.3 (not very clear in rule, but the function name has to start with a lower case latin char ['no indicators']) + - "parent::m:mrow and " + - "preceding-sibling::*[1][" + - " (self::m:mi and translate(., 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', '') = '') or " + - " (self::m:mrow and translate(*[last()], 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', '') = '')] and" + - " following::*[1][self::m:mrow and count(*)=3 and " # look for function apply + - " *[2][.='⁥'] and *[1][self::m:mi and translate(., 'abcdefghijklmnopqrstuvwxyz', '') = '']]" + then: [t: "W"] + else: [t: ""] + - "⁣": [t: ""] # 0x2063⁥ (invisible separator) + - "⁀": [t: ""] # 0x2064 (invisible plus) + - "0": [t: "N⠚"] # 0x30 + - "1": [t: "N⠁"] # 0x31 + - "2": [t: "N⠃"] # 0x32 + - "3": [t: "N⠉"] # 0x33 + - "4": [t: "N⠙"] # 0x34 + - "5": [t: "N⠑"] # 0x35 + - "6": [t: "N⠋"] # 0x36 + - "7": [t: "N⠛"] # 0x37 + - "8": [t: "N⠓"] # 0x38 + - "9": [t: "N⠊"] # 0x39 + + - "a": [t: "L⠁"] # 0x61 + - "b": [t: "L⠃"] # 0x62 + - "c": [t: "L⠉"] # 0x63 + - "d": [t: "L⠙"] # 0x64 + - "e": [t: "L⠑"] # 0x65 + - "f": [t: "L⠋"] # 0x66 + - "g": [t: "L⠛"] # 0x67 + - "h": [t: "L⠓"] # 0x68 + - "i": [t: "L⠊"] # 0x69 + - "j": [t: "L⠚"] # 0x6a + - "k": [t: "L⠅"] # 0x6b + - "l": [t: "L⠇"] # 0x6c + - "m": [t: "L⠍"] # 0x6d + - "n": [t: "L⠝"] # 0x6e + - "o": [t: "L⠕"] # 0x6f + - "p": [t: "L⠏"] # 0x70 + - "q": [t: "L⠟"] # 0x71 + - "r": [t: "L⠗"] # 0x72 + - "s": [t: "L⠎"] # 0x73 + - "t": [t: "L⠞"] # 0x74 + - "u": [t: "Lâ „"] # 0x75 + - "v": [t: "Lâ §"] # 0x76 + - "w": [t: "Lâ ș"] # 0x77 + - "x": [t: "Lâ ­"] # 0x78 + - "y": [t: "Lâ œ"] # 0x79 + - "z": [t: "Lâ ”"] # 0x7a + + # Latin capitals: chem-element letters use đ¶ (no word indicator); others use C. + # Cells come from lowercase a-z via spell/translate. + - "BCHIKNOPSUVWY": # chemistry-capable capitals + - test: + if: "@data-chem-element" + then: [tc: "đ¶"] + else: [tc: "C"] + - spell: "translate('.', 'BCHIKNOPSUVWY', 'bchiknopsuvwy')" + - "ADEFGJLMQRTXZ": # remaining capitals + - tc: "C" + - spell: "translate('.', 'ADEFGJLMQRTXZ', 'adefgjlmqrtxz')" + + - "α": [t: "GL⠁"] # 0x3b1 + - "ÎČ": [t: "GL⠃"] # 0x3b2 + - "Îł": [t: "GL⠛"] # 0x3b3 + - "ÎŽ": [t: "GL⠙"] # 0x3b4 + - "Δ": [t: "GL⠑"] # 0x3b5 + - "ζ": [t: "GLâ ”"] # 0x3b6 + - "η": [t: "GLâ ±"] # 0x3b7 + - "Ξ": [t: "GLâ č"] # 0x3b8 + - "Îč": [t: "GL⠊"] # 0x3b9 + - "Îș": [t: "GL⠅"] # 0x3ba + - "λ": [t: "GL⠇"] # 0x3bb + - "ÎŒ": [t: "GL⠍"] # 0x3bc + - "Μ": [t: "GL⠝"] # 0x3bd + - "Ο": [t: "GLâ ­"] # 0x3be + - "Îż": [t: "GL⠕"] # 0x3bf + - "π": [t: "GL⠏"] # 0x3c0 + - "ρ": [t: "GL⠗"] # 0x3c1 + - "ς": [t: "GL⠎"] # 0x3c2 + - "σ": [t: "GL⠎"] # 0x3c3 + - "τ": [t: "GL⠞"] # 0x3c4 + - "υ": [t: "GLâ „"] # 0x3c5 + - "φ": [t: "GL⠋"] # 0x3c6 + - "χ": [t: "GLâ Ż"] # 0x3c7 + - "ψ": [t: "GLâ œ"] # 0x3c8 + - "ω": [t: "GLâ ș"] # 0x3c9 + + - "ϑ": [t: "GLâ č"] # 0x3d1 + - "Ï”": [t: "GL⠑"] # 0x3f5 \varepsilon + - "ϰ": [t: "GL⠅"] # 0x3f0 + - "ϕ": [t: "GL⠋"] # 0x3d5 + - "ϱ": [t: "GL⠗"] # 0x3f1 + - "ϖ": [t: "GL⠏"] # 0x3d6 + - "Ϝ": [t: "GLâ §"] # 0x3d7 + + - "Α": [t: "CGL⠁"] # 0x391 + - "Β": [t: "CGL⠃"] # 0x392 + - "Γ": [t: "CGL⠛"] # 0x393 + - "Δ": [t: "CGL⠙"] # 0x394 + - "Ε": [t: "CGL⠑"] # 0x395 + - "Ζ": [t: "CGLâ ”"] # 0x396 + - "Η": [t: "CGLâ ±"] # 0x397 + - "Θ": [t: "CGLâ č"] # 0x398 + - "Ι": [t: "CGL⠊"] # 0x399 + - "Κ": [t: "CGL⠅"] # 0x39a + - "Λ": [t: "CGL⠇"] # 0x39b + - "Μ": [t: "CGL⠍"] # 0x39c + - "Ν": [t: "CGL⠝"] # 0x39d + - "Ξ": [t: "CGLâ ­"] # 0x39e + - "Ο": [t: "CGL⠕"] # 0x39f + - "Π": [t: "CGL⠏"] # 0x3a0 + - "ÎĄ": [t: "CGL⠗"] # 0x3a1 + - "Îą": [t: "CGL⠎"] # 0x3a2 + - "ÎŁ": [t: "CGL⠎"] # 0x3a3 + - "΀": [t: "CGL⠞"] # 0x3a4 + - "΄": [t: "CGLâ „"] # 0x3a5 + - "Ί": [t: "CGL⠋"] # 0x3a6 + - "Χ": [t: "CGLâ Ż"] # 0x3a7 + - "Κ": [t: "CGLâ œ"] # 0x3a8 + - "Ω": [t: "CGLâ ș"] # 0x3a9 + + - "”": [t: "GL⠍"] # 0x00B5 (Micro (Greek mu)) + - "℩": [t: "CGLâ ș"] # 0x2126 (Ohm sign (capital Greek omega)) + - "∆": [t: "CGL⠙"] # 0x2206 (Increment (capital Greek delta)) + - "∏": [t: "CGL⠏"] # 0x220F (Product (capital Greek pi)) + - "∑": [t: "CGL⠎"] # 0x2211 (Sum (capital Greek sigma)) + + # --- restored short definitions that differ from unicode-full --- + - "⋇": [t: "1⠌⠯⠩"] # 0x22C7 (Division times) + - "⊩": [t: "⠾⠳⠿⠾⠒"] # 0x22A9 (Forces) diff --git a/Rules/Braille/Vietnam/unicode.yaml b/Rules/Braille/Vietnam/unicode.yaml index 78a9adaa6..c86e95055 100644 --- a/Rules/Braille/Vietnam/unicode.yaml +++ b/Rules/Braille/Vietnam/unicode.yaml @@ -1,588 +1,588 @@ ---- -# Definitions for Vietnamese Math Braille. But most of theym are same as UEB. -# UEB characters -# -# Some chars that originally came from an Excel spreadsheet, converted to csv, and the greatly expanded -# -# The UEB translation makes use of some non-braille chars as flags -# L -- what follows is a letter -# N -- what follows is a digit -# C -- precedes L for capital letters -# G -- precedes L for Greek Letters (after C for capitals) -# Typeface Indicators ("typeforms") -# B bold, I Italic, S Sans-serif, T script, D, Fraktur, đ”č blackboard-bold -# the type face indicators can be combined with B (first) and I (second) -# Standing alone chars: -# Any character which acts as a standing alone character (e.g, "{") needs each braille symbol to be labeled -# o -- opening/left side, c -- closing/right side, b -- both open and close (e.g, '"') - - - - "=": [T: "⠐⠶"] # 0x003D (Equals) - - "≠": [T: "⠐⠟"] # 0x2260 (Not equal) - - "<": [T: "⠐â Ș"] # 0x003C (Less than) - - "≀": [T: "⠐â Șâ ¶"] # 0x2264 (Less than or equal to) - - ">": [T: "⠐⠕"] # 0x003E (Greater than) - - "≄": [T: "⠐⠕⠶"] # 0x2265 (Greater than or equal to) - - "â‰Ș": [T: "⠐â Șâ Ș"] # 0x226A (Much less than) - - "≫": [T: "⠐⠕⠕"] # 0x226B (Much greater than) - - "≼": [T: "⠐â Ș⠈"] # 0x226E (Not less than) - - "≯": [T: "⠐⠕⠈"] # 0x226F (Not greater than) - - "≰": [T: "⠞⠐â Ș⠈⠐⠟"] # 0x2270 (Neither less than nor equal to) - - "≱": [T: "⠞⠐⠕⠈⠐⠟"] # 0x2271 (Neither greater than nor equal to) - - "∝": [t: "⠞⠐⠶"] # 0x221D (Proportional to) - - "≃": [T: "⠐⠹⠹"] # 0x2243 (Approximately equal to (tilde over horizontal line)) - - "≅": [T: "⠐⠹⠹"] # 0x2245 (Approximately equal to (tilde over equals sign)) - - "≈": [T: "⠐⠹⠹"] # 0x2248 (Approximately equal (tilde over tilde)) - - "≏": [t: "⠘⠐⠶"] # 0x224F (Equals with bump in top bar (difference between)) - - "≑": [t: "⠚⠐⠶"] # 0x2251 (Geometrically equal to (equals dotted above and below)) - - "≡": [T: "⠐⠿"] # 0x2261 (Equivalent to (three horizontal lines)) vi: trĂčng - - "≱": [T: "⠐⠿⠈"] # 0x2262 (Not identical to) - - "∈": [T: "⠈⠑"] # 0x2208 (Element of (member of)) - - "∉": [T: "⠈⠑⠈"] # 0x2209 (Element of (not member of)) - - "+": [T: "⠐⠖"] # 0x002B (Plus sign) - - "∋": [t: "⠈⠘⠑"] # 0x220B (Contains) - - "⊂": [T: "⠘⠣"] # 0x2282 (Subset of) - - "⊃": [T: "⠘⠜"] # 0x2283 (Superset of) - - "⊆": [T: "⠘⠣⠐⠶"] # 0x2286 (Subset of or equal) - - "⊇": [T: "⠘⠜⠐⠶"] # 0x2287 (Superset of or equal) - - "⊊": [t: "⠚⠘⠣"] # 0x228A (Subset of with not equal) - - "⊋": [t: "⠹⠘⠜"] # 0x228B (Superset of with not equal) - - "âŠČ": [t: "⠈⠞⠣"] # 0x22B2 (Normal subgroup of) - - "⊳": [t: "⠈⠾⠜"] # 0x22B3 (Contains as normal subgroup) - - "⊮": [t: "â žâ žâ Ł"] # 0x22B4 (Normal subgroup of or equal) - - "⊔": [t: "⠾⠾⠜"] # 0x22B5 (Contains as normal subgroup or equal) - - "⋬": [t: "â šâ žâ Ł"] # 0x22EC (not normal subgroup) -- this isn't the same as what is in GTM 10, but that similar has no Unicode equiv - - "⋭": [t: "â šâ žâ Ł"] # 0x22ED (does not contain as normal subgroup) -- this isn't the same as what is in GTM 10, but that similar has no Unicode equiv - - "−": [t: "⠐⠀"] # 0x2212 (Minus sign) - - "·": [T: "⠐⠊"] # 0x00D7 (Multiplication dot (times)) - - "×": [T: "⠐⠊"] # 0x00D7 (Multiplication sign (times)) - - "Ă·": [T: "⠐â Č"] # 0x00F7 (Division sign (divided by)) - - "±": [T: "⠐⠖⠀"] # 0x00B1 (Plus or minus) - - "∓": [T: "⠐⠀⠖"] # 0x2213 (Minus or plus) - - "∗": [t: "⠐⠊"] # 0x2217 (Asterisk operator) - - "∘": [t: "⠐⠎"] # 0x2218 (Ring operator) - - "◩": [t: "⠐⠎"] # 0x25E6 (White bullet) - - "∌": [t: "⠈⠔"] # 0x223C (Tilde operator) - - "⋅": [t: "⠐⠊"] # 0x22C5 (Dot operator) - - "∧": [t: "⠈⠊"] # 0x2227 (Logical and) - - "√": [t: "⠈⠖"] # 0x2228 (Logical or) - - "∩": [T: "â šâ Š"] # 0x2229 (Intersection) - - "âˆȘ": [T: "⠹⠖"] # 0x222A (Union) - - "∖": [T: "â žâ Ą"] # 0x2216 (Set minus) - - "(": [T: "o⠈oâ Ł"] # 0x0028 (Left parenthesis) - - ")": [T: "c⠈c⠜"] # 0x0029 (Right parenthesis) - - "[": [T: "oâ šoâ Ł"] # 0x005B (Left square bracket) - - "]": [T: "câ šc⠜"] # 0x005D (Right square bracket) - - "{": [T: "oâ žoâ Ł"] # 0x007B (Left curly bracket) - - "}": [T: "câ žc⠜"] # 0x007D (Right curly bracket) - - "〈": [T: "oâ žâ Łâ €"] # 0x2329 (Left angle bracket) - - "âŒȘ": [T: "c⠀⠞⠜"] # 0x232A (Right angle bracket) - - "|": [T: "â žâ ł"] # 0x007C (Vertical line) - # - test: - # if: "preceding-sibling::* and following-sibling::*" - # then: [T: "Wâ žâ łW"] # comparison (e.g., such that -- rule 145) - # else: [T: "â žâ ł"] # absolute value, others??? - - "!": [T: "c⠖"] # 0x21 (Exclamation (factorial)) - - "#": [T: "â Œ"] # 0x23 (Number sign (hash)) - - "%": [T: "⠌⠚⠎"] # 0x25 (Percent sign) No dots 46 before as in UEB - - "&": [t: "⠈⠯"] # 0x26 (Ampersand) - - "*": [T: "⠐⠊"] # 0x002A (Asterisk) - - "/": [T: "⠐â Č"] # 0x002F (Solidus (slash)) - - ";": [t: "c⠆"] # 0x003B (Semicolon) - - "?": [T: "câ ą"] # 0x003F (Question mark) - - "@": [T: "⠈⠁"] # 0x0040 (Commercial at sign) - - "\\": [t: "â žâ Ą"] # 0x005C (Backslash) - - "^": [t: "⠈⠹"] # 0x005E (Caret (hat, up arrow)) - - "_": [t: "â šâ €"] # 0x005F (Low line (underscore)) - - "~": [t: "⠈⠔"] # 0x007E (Tilde (swung dash)) - - "Âą": [t: "⠈⠉"] # 0x00A2 (Cents sign) - - "€": [t: "⠈⠑"] # 0x20AC (Euro sign) - - "₣": [t: "⠈⠋"] # 0x20A3 (French franc sign) - - "ÂŁ": [t: "⠈⠇"] # 0x00A3 (Pound sign) - - "₩": [t: "⠈⠝"] # 0x20A6 (Naira sign) - - "$": [t: "⠈⠎"] # 0x0024 (Dollar sign) - - "„": [t: "⠈⠜"] # 0x00A5 (Yen sign) - - "Š": [t: "â šâ ł"] # 0x00A6 (Broken bar) - - "ÂŹ": [t: "⠈â č"] # 0x00AC (Not sign) - - "°": [T: "⠔⠚"] # 0x00B0 (Degree sign) - - "†": [t: "⠈⠠â č"] # 0x2020 (Dagger) - - "‡": [t: "⠈⠠⠻"] # 0x2021 (Double dagger) - - "
": [T: "c⠄c⠄c⠄"] # 0x2026 (Ellipsis) - - "â€Č": [T: "⠄"] # 0x2032 (Prime sign) - - "″": [T: "⠄⠄"] # 0x2033 (Double prime sign) - - "‮": [T: "⠄⠄⠄"] # 0x2034 (Triple prime sign) - - "Å": [t: "⠠⠘⠫⠁"] # 0x212B (Angstrom symbol) - - "Å": [t: "⠠⠘⠫⠁"] # 0x00C5 (WIRIS uses this for Angstrom) - - "∀": [t: "⠘⠁"] # 0x2200 (For all) - - "∂": [t: "⠈⠙"] # 0x2202 (Partial differential) - - "∃": [T: "⠘⠑"] # 0x2203 (There exists) - - "∄": [T: "⠘⠑⠈"] # 0x2204 (There does not exist) - - "∅": [T: "⠈⠚"] # 0x2205 (Empty set) - - "∇": [t: "⠘⠙"] # 0x2207 (Nabla (del, inverted capital delta)) - - "∎": [t: "⠞⠫⠌⠙t"] # 0x220E (End of proof) - - "√": [T: "â ©"] # 0x221A (Square root (radical) without vinculum) - - "∞": [T: "⠌⠕"] # 0x221E (Infinity) - - "∠": [T: "⠫⠛"] # 0x2220 (Angle) - - "∥": [T: "â šâ «â ›"] # 0x2221 (Measured angle) - - "⊟": [T: "⠌⠫⠛"] # 0x22BE (Right angle with arc) - - "∟": [T: "â «â §"] - - "∫": [T: "â Ÿ"] # 0x222B (Integral) - - "∟": [T: "⠐⠟"] # 0x222E (Contour integral (closed line integral)) - - "∎": [t: "â  â Ą"] # 0x2234 (Therefore) - - "∔": [t: "⠈⠌"] # 0x2235 (Because (since)) - - "∶": [t: "⠒"] # 0x2236 (Ratio) - - "∷": [T: "⠒⠒"] # 0x2237 (Proportion) - - "∣": [T: "⠣⠮⠜"] # 0x2223 (Divides) ueb: â žâ ł - - "∀": [T: "â Łâ Œâ œ"] # 0x2224 (Does not divide) ueb: ⠞⠳⠈⠱ - - "∄": [T: "â «â ¶"] # 0x2225 (Parallel) VI: AB parallel to CD, should be: â «ABâ ¶CD - - "∊": [T: "â «â Ÿ"] # 0x2226 (Not parallel) Vi: AB not parallel to CD, should be: â «AB⠐⠟CD - - "⟂": [T: "â «â §"] # 0x27C2 (Perpendicular) - - "⊱": [t: "⠾⠒"] # 0x22a2 (Right tack) - - "⊣": [t: "⠈⠾⠒"] # 0x22a3 (Left tack) - - "⊄": [T: "â «â §"] # 0x22A5 (Up tack (perpendicular)) - - "⊩": [t: "⠾⠒"] # 0x22A6 (Assertion (is a theorem)) - - "⊹": [t: "⠘⠾⠒"] # 0x22A8 (TRUE (is valid)) - - "⊬": [t: "⠞⠒⠈⠱"] # 0x22AC (Does not prove) - - "⊭": [t: "⠘⠞⠒⠈⠱"] # 0x22AD (Not TRUE) - - "â«€": [t: "⠹⠾⠒"] # 0x2AE4 (Vertical bar double left turnstile) - - "✓": [t: "⠈⠩"] # 0x2713 (Check mark (tick)) - - "⊔": [t: "⠹⠚"] # 0x29B5 (Plimsoll sign (standard state)) - - "⼖": [t: "1⠐⠠⠀⠯⠫⠿"] # 0x2B96 (MEDIUM SMALL WHITE CIRCLE WITH HORIZONTAL BAR (standard state)) - - "←": [t: "â łâ Ș"] # 0x2190 (Leftwards arrow) - - "↑": [t: "â łâ Ź"] # 0x2191 (Upwards arrow) - - "→": [t: "⠳⠕"] # 0x2192 (Rightwards arrow) - - "↓": [t: "â łâ ©"] # 0x2193 (Downwards arrow) - - "↔": [T: "â łâ Ș⠶⠕"] # 0x2194 (Left right arrow) - - "↕": [t: "â łâ ș⠗⠬"] # 0x2195 (Up down arrow) - - "↖": [t: "â łâ ±"] # 0x2196 (Northwest arrow) - - "↗": [t: "⠳⠎"] # 0x2197 (Northeast arrow) - - "↘": [t: "â łâ Ł"] # 0x2198 (Southeast arrow) - - "↙": [t: "⠳⠜"] # 0x2199 (Southwest arrow) - - "↚": [t: "â łâ Ș⠈⠱"] # 0x219A (Leftwards arrow with stroke) - - "↛": [t: "â łâ •â ˆâ ±"] # 0x219B (Rightwards arrow with stroke) - - "↜": [t: "⠳⠔⠱â Ș"] # 0x219C (Leftwards wave arrow) - - "↝": [t: "⠳⠱⠔⠕"] # 0x219D (Rightwards wave arrow) - - "↞": [t: "⠳⠒⠗⠗â Ș"] # 0x219E (Leftwards two headed arrow) - - "↟": [t: "⠳⠒⠗⠗⠬"] # 0x219F (Upwards two headed arrow) - - "↠": [t: "⠳⠒⠗⠗⠕"] # 0x21A0 (Rightwards two headed arrow) - - "↡": [t: "â łâ ’â —â —â ©"] # 0x21A1 (Downwards two headed arrow) - - "↱": [t: "⠳⠗⠗â Ș"] # 0x21A2 (Leftwards arrow with tail) - - "↣": [t: "⠳⠗⠗⠕"] # 0x21A3 (Rightwards arrow with tail) - - "ↀ": [t: "⠳⠳⠗â Ș"] # 0x21A4 (Leftwards arrow from bar) - - "ↄ": [t: "⠳⠳⠗⠬"] # 0x21A5 (Upwards arrow from bar) - - "↩": [t: "⠳⠳⠗⠕"] # 0x21A6 (Rightwards arrow from bar) - - "↧": [t: "â łâ łâ —â ©"] # 0x21A7 (Downwards arrow from bar) - - "↭": [t: "â łâ ș⠔⠱⠗⠕"] # 0x21AD (Left right wave arrow) - - "↼": [t: "â łâ ș⠗⠕⠈⠱"] # 0x21AE (Left right arrow with stroke) - - "↰": [t: "â łâ Žâ Ź"] # 0x21B0 (Upwards arrow with tip left) - - "↱": [t: "â łâ Čâ Ź"] # 0x21B1 (Upwards arrow with tip right) - - "â†Č": [t: "â łâ Čâ ©"] # 0x21B2 (Downwards arrow with tip left) - - "↳": [t: "â łâ Žâ ©"] # 0x21B3 (Downwards arrow with tip right) - - "↶": [t: "⠳⠔⠔â Ș"] # 0x21B6 (Anticlockwise top semicircle arrow) - - "↷": [t: "⠳⠱⠱⠕"] # 0x21B7 (Clockwise top semicircle arrow) - - "↌": [t: "⠳⠈⠗â Ș"] # 0x21BC (Leftwards harpoon with barb upwards) - - "↜": [t: "⠳⠠⠗â Ș"] # 0x21BD (Leftwards harpoon with barb downwards) - - "↟": [t: "⠳⠠⠗⠬"] # 0x21BE (Upwards harpoon with barb rightwards) - - "↿": [t: "⠳⠈⠗⠬"] # 0x21BF (Upwards harpoon with barb leftwards) - - "⇀": [t: "⠳⠈⠗⠕"] # 0x21C0 (Rightwards harpoon with barb upwards) - - "⇁": [t: "⠳⠠⠗⠕"] # 0x21C1 (Rightwards harpoon with barb downwards) - - "⇂": [t: "â łâ ˆâ —â ©"] # 0x21C2 (Downwards harpoon with barb rightwards) - - "⇃": [t: "â łâ  â —â ©"] # 0x21C3 (Downwards harpoon with barb leftwards) - - "⇄": [t: "⠳⠕⠻⠳â Ș"] # 0x21C4 (Rightwards arrow over leftwards arrow) - - "⇅": [t: "â łâ Źâ żâ łâ ©"] # 0x21C5 (Upwards arrow left of Downwards arrow) - - "⇌": [T: "â łâ Ș⠕"] # 0x21CC (Rightwards harpoon over leftwards harpoon (equilibrium)) - - "⇐": [t: "â łâ ¶â Ș"] # 0x21D0 (Leftwards double arrow) - - "⇑": [t: "â łâ ¶â Ź"] # 0x21D1 (Upwards double arrow) - - "⇒": [t: "â łâ ¶â •"] # 0x21D2 (Rightwards double arrow) - - "⇓": [t: "â łâ ¶â ©"] # 0x21D3 (Downwards double arrow) - - "⇔": [T: "â łâ Ș⠶⠕"] # 0x21D4 (Left right double arrow) - - "⇕": [t: "â łâ șâ ¶â —â Ź"] # 0x21D5 (Up down double arrow) - - "⇠": [t: "⠳⠂â Ș"] # 0x21E0 (Leftwards dashed arrow) - - "⇡": [t: "⠳⠂⠬"] # 0x21E1 (Upwards dashed arrow) - - "⇱": [t: "⠳⠂⠕"] # 0x21E2 (Rightwards dashed arrow) - - "⇣": [t: "â łâ ‚â ©"] # 0x21E3 (Downwards dashed arrow) - - "⟔": [t: "â łâ Ș"] # 0x27F5 (Long leftwards arrow) - - "⟶": [t: "⠳⠕"] # 0x27F6 (Long rightwards arrow) - - "â„‚": [t: "â žâ ¶"] # 0x2942 (Rightwards arrow above short leftwards arrow (equilibrium, trend to the right)) - - "â„„": [t: "⠈⠞⠶"] # 0x2944 (Short rightwards arrow above leftwards arrow (equilibrium, trend to the left)) - -# Mappings for some new Unicode chemistry arrows/symbols -# These need to be verified -- 0x1f8d1, 0x1f8d2, and 0x1f8d3 conflict with GTM 16 (uses short arrow when really should be long) - - "🣐": [t: "⠳⠒⠒⠒⠕⠻⠳⠒⠒⠒â Ș"] # 0x1F8D0 LONG RIGHTWARDS ARROW OVER LONG LEFTWARDS ARROW - - "🣑": [t: "â łâ Ș⠕"] # 0x1f8d1 (Long rightwards harpoon over leftwards harpoon (equilibrium)) - - "🣒": [t: "â žâ ¶"] # 0x1f8d2 (Long rightwards harpoon over leftwards harpoon (equilibrium, trend to the right)) - - "🣓": [t: "⠈⠞⠶"] # 0x1f8d3 (Long rightwards harpoon over leftwards harpoon (equilibrium, trend to the left)) -# - "🣑": [t: "â łâ ’â ’â ’â ˆâ —â •â »â łâ ’â ’â ’â  â —â Ș"] # 0x1F8D1 LONG RIGHTWARDS HARPOON OVER LONG LEFTWARDS HARPOON -# - "🣒": [t: "â łâ ’â ’â ’â ˆâ —â •â »â łâ ’â  â —â Ș"] # 0x1F8D2 LONG RIGHTWARDS HARPOON ABOVESHORT LEFTWARDS HARPOON -# - "🣓": [t: "â łâ ’â ˆâ —â •â »â łâ ’â ’â ’â  â —â Ș"] # 0x1F8D3 SHORT RIGHTWARDS HARPOON ABOVELONG LEFTWARDS HARPOON - - "🣔": [t: "⠳⠒⠒⠒⠈⠗â Ș⠻⠳⠒⠠⠗⠕"] # 0x1F8D4 LONG LEFTWARDS HARPOON ABOVESHORT RIGHTWARDS HARPOON - - "🣕": [t: "⠳⠒⠈⠗â Ș⠻⠳⠒⠒⠒⠠⠗⠕"] # 0x1F8D5 SHORT LEFTWARDS HARPOON ABOVELONG RIGHTWARDS HARPOON - - "🣖": [t: "⠳⠒⠒⠒⠕⠯⠠⠭"] # 0x1F8D6 LONG RIGHTWARDS ARROW WITH THROUGH X - - "🣗": [t: "⠐⠠⠀⠯⠫⠿"] # 0x1F8D7 LONG RIGHTWARDS ARROW WITH DOUBLE SLASH - - - "△": [T: "⠫⠌⠉"] # 0x25B3 (Triangle) - - "□": [T: "⠫⠌⠙"] # 0x25A1 (Square) - - "â–€": [T: "⠚⠫⠌⠙"] # 0x25A4 (Square with horizontal fill) - - "â–„": [T: "⠚⠫⠌⠙"] # 0x25A5 (Square with vertical fill) - - "▩": [T: "⠚⠫⠌⠙"] # 0x25A6 (Square with orthogonal crosshatch fill) - - "▧": [T: "⠚⠫⠌⠙"] # 0x25A7 (Square with upper left to lower right fill) - - "▹": [T: "⠚⠫⠌⠙"] # 0x25A8 (Square with upper right to lower left fill) - - "▩": [T: "⠚⠫⠌⠙"] # 0x25A9 (Square with diagonal crosshatch fill) - - "○": [t: "â «â ż"] # 0x25CB (Circle) - - "◍": [T: "â šâ «â ż"] # 0x25CD (Circle with vertical fill) - - "▱": [T: "⠫⠈⠌⠙"] # 0x25B1 (Parallelogram) - - "â–Č": [T: "⠞⠫⠌⠉"] # 0x25B2 (Filled triangle) - - "■": [T: "⠞⠫⠌⠙"] # 0x25A0 (Filled square) - - "≜": [T: "⠞⠙⠐⠶"] # 0x225C (Delta equal to) - - "≝": [t: "â Łâ ™â ‘â ‹â œâ »â â ¶"] # 0x225D (Equal to by definition) - - "⊕": [t: "â «â żâ Ș⠐⠖t"] # 0x2295 (Circled plus) - - "⊖": [t: "â «â żâ Ș⠐⠀t"] # 0x2296 (Circled minus) - - "⊗": [t: "⠐⠊t"] # 0x2297 (Circled times) - - "⊛": [t: "⠐⠊t"] # 0x229B (Circled asterisk operator) - - "⊞": [t: "⠫⠌⠙â Ș⠐⠖t"] # 0x229E (Squared plus) - - "⊟": [t: "⠫⠌⠙â Ș⠐⠀t"] # 0x229F (Squared minus) - - "⊠": [t: "⠫⠌⠙â Ș⠐⠊t"] # 0x22A0 (Squared times) - - "˙": [t: "â Č"] # 0x02D9 ( Dot Above) - - "š": [t: "â Čâ Č"] # 0x00A8 ( Diaeresis/Double Dot Above) - - "©": [t: "⠘⠉"] # 0xa9 (Copyright) - - - - "\"": [t: "bâ  bâ ¶"] - - "'": [t: "b⠄"] - - "“": [t: "o⠘oâ Š"] - - "”": [t: "c⠘câ Ž"] - - "‘": [t: "oâ  oâ Š"] - - "’": [t: "câ  câ Ž"] - - "«": [t: "oâ žoâ Š"] - - "»": [t: "câ žcâ Ž"] - - - " ": # 0x20 (Space) - - test: - if: "self::m:mn" - then: [t: "N⠐"] - else: [t: "W"] - - " ": # 0xa0 (Non-breaking Space) - - test: - - if: "self::m:mn" - then: [t: "N⠐"] - - else_if: "following-sibling::*[1][@class='MathML-unit' or BaseNode(.)[@class='MathML-unit']]" - then: [t: "𝐖"] - else: [t: "W"] - - ",": # 0x2c (Comma) - - test: - if: "self::m:mn" - then: [t: "N⠂"] - else: [t: ",W"] - - ".": # 0x2e (Period) - - test: - if: "self::m:mn" - then: [T: "N⠄"] - else: [t: "."] - - ":": # 0x003A (Colon) - # Sometimes a colon is meant to be a ratio/mathord and sometimes a map/punct. - # The latter has a space after it. - # If in an mrow, guess it is infix and checks the operator. This is pretty weak! - # Field extensions "[K:F]" and trilinear coordinates "a:b:c" don't want extra space - # Time doesn't want an extra space -- the am/pm get wrapped in an mrow with the minutes after the colon - - test: - if: - - "ancestor::*[2][IsBracketed(., '{', '}')] or " # field extension - - "preceding-sibling::*[2][.=':'] or following-sibling::*[2][.=':'] or" # trilinear form - # ratios tend to have similar left and right sides - - "name(preceding-sibling::*[1]) = name(following-sibling::*[1]) or" - # am/pm test - - "(name(preceding-sibling::*[1]) = 'mn' and " - - " following-sibling::*[1][self::m:mrow and count(*)=3 and *[1][self::m:mn] and " - - " *[3][translate(., 'APM\u00A0', 'apm') = 'am' or translate(., 'APM\u00A0', 'apm') = 'pm']" - - " ])" - then: [t: "⠒"] - else: [t: "⠒W"] - - - "-": # 0x2d (Minus sign or hyphen) - - test: - if: "self::m:mo" - then: [t: "⠐⠀"] - else: [t: "â €"] - - - "⁥": [t: ""] # 0x2061⁥ (invisible function apply) - #- test: - #if: - #- "preceding-sibling::*[1][self::m:mi and substring(., string-length(.), 1)!=' '] and " # avoid scripted function names and one that end with spaces - #- "following-sibling::*[1][self::m:mi and translate(., 'abcdefghijklmnopqrstuvwxyz', '') = '']" # GTM 9.3.2 - #then: [t: "W"] - #else: [t: ""] - - - "⁹": [t: ""] # 0x2062 (invisible times) - #- test: - #if: # GTM 9.3.3 (not very clear in rule, but the function name has to start with a lower case latin char ['no indicators']) - #- "parent::m:mrow and " - #- "preceding-sibling::*[1][" - #- " (self::m:mi and translate(., 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', '') = '') or " - #- " (self::m:mrow and translate(*[last()], 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', '') = '')] and" - #- " following::*[1][self::m:mrow and count(*)=3 and " # look for function apply - #- " *[2][.='⁥'] and *[1][self::m:mi and translate(., 'abcdefghijklmnopqrstuvwxyz', '') = '']]" - #then: [t: "W"] - #else: [t: ""] - - "⁣": [t: ""] # 0x2063⁥ (invisible separator) - - "⁀": [t: ""] # 0x2064 (invisible plus) - - "0": [t: "N⠚"] # 0x30 - - "1": [t: "N⠁"] # 0x31 - - "2": [t: "N⠃"] # 0x32 - - "3": [t: "N⠉"] # 0x33 - - "4": [t: "N⠙"] # 0x34 - - "5": [t: "N⠑"] # 0x35 - - "6": [t: "N⠋"] # 0x36 - - "7": [t: "N⠛"] # 0x37 - - "8": [t: "N⠓"] # 0x38 - - "9": [t: "N⠊"] # 0x39 - - # we stick the drop numbers into the private use area for consistency - - "\ue000": [t: "Nâ Ž"] # 0 - - "\ue001": [t: "N⠂"] # 1 - - "\ue002": [t: "N⠆"] # 2 - - "\ue003": [t: "N⠒"] # 3 - - "\ue004": [t: "Nâ Č"] # 4 - - "\ue005": [t: "Nâ ą"] # 5 - - "\ue006": [t: "N⠖"] # 6 - - "\ue007": [t: "Nâ ¶"] # 7 - - "\ue008": [t: "Nâ Š"] # 8 - - "\ue009": [t: "N⠔"] # 9 - - - "a": [t: "L⠁"] # 0x61 - - "b": [t: "L⠃"] # 0x62 - - "c": [t: "L⠉"] # 0x63 - - "d": [t: "L⠙"] # 0x64 - - "e": [t: "L⠑"] # 0x65 - - "f": [t: "L⠋"] # 0x66 - - "g": [t: "L⠛"] # 0x67 - - "h": [t: "L⠓"] # 0x68 - - "i": [t: "L⠊"] # 0x69 - - "j": [t: "L⠚"] # 0x6a - - "k": [t: "L⠅"] # 0x6b - - "l": [t: "L⠇"] # 0x6c - - "m": [t: "L⠍"] # 0x6d - - "n": [t: "L⠝"] # 0x6e - - "o": [t: "L⠕"] # 0x6f - - "p": [t: "L⠏"] # 0x70 - - "q": [t: "L⠟"] # 0x71 - - "r": [t: "L⠗"] # 0x72 - - "s": [t: "L⠎"] # 0x73 - - "t": [t: "L⠞"] # 0x74 - - "u": [t: "Lâ „"] # 0x75 - - "v": [t: "Lâ §"] # 0x76 - - "w": [t: "Lâ ș"] # 0x77 - - "x": [t: "Lâ ­"] # 0x78 - - "y": [t: "Lâ œ"] # 0x79 - - "z": [t: "Lâ ”"] # 0x7a - - - "đ": [t: "Lâ ź"] - - "ĂĄ": [t: "L⠔L⠁"] - - "Ă ": [t: "Lâ °L⠁"] - - "áșŁ": [t: "Lâ ąL⠁"] - - "ĂŁ": [t: "Lâ €L⠁"] - - "áșĄ": [t: "Lâ  L⠁"] - - "Ăą": [t: "Lâ Ą"] - - "áș„": [t: "L⠔Lâ Ą"] - - "áș§": [t: "Lâ °Lâ Ą"] - - "áș©": [t: "Lâ ąLâ Ą"] - - "áș«": [t: "Lâ €Lâ Ą"] - - "áș­": [t: "Lâ  Lâ Ą"] - - "ă": [t: "L⠜"] - - "áșŻ": [t: "L⠔L⠜"] - - "áș±": [t: "Lâ °L⠜"] - - "áșł": [t: "Lâ ąL⠜"] - - "áș”": [t: "Lâ €L⠜"] - - "áș·": [t: "Lâ  L⠜"] - - "Ă©": [t: "L⠔L⠑"] - - "Ăš": [t: "Lâ °L⠑"] - - "áș»": [t: "Lâ ąL⠑"] - - "áșœ": [t: "Lâ €L⠑"] - - "áșč": [t: "Lâ  L⠑"] - - "ĂȘ": [t: "Lâ Ł"] - - "áșż": [t: "L⠔Lâ Ł"] - - "ề": [t: "Lâ °Lâ Ł"] - - "ể": [t: "Lâ ąLâ Ł"] - - "ễ": [t: "Lâ €Lâ Ł"] - - "ệ": [t: "Lâ  Lâ Ł"] - - "Ă­": [t: "L⠔L⠊"] - - "ĂŹ": [t: "Lâ °L⠊"] - - "ỉ": [t: "Lâ ąL⠊"] - - "Ä©": [t: "Lâ €L⠊"] - - "ị": [t: "Lâ  L⠊"] - - "Ăł": [t: "L⠔L⠕"] - - "ĂČ": [t: "Lâ °L⠕"] - - "ỏ": [t: "Lâ ąL⠕"] - - "Ă”": [t: "Lâ €L⠕"] - - "ọ": [t: "Lâ  L⠕"] - - "ĂŽ": [t: "Lâ č"] - - "ố": [t: "L⠔Lâ č"] - - "ồ": [t: "Lâ °Lâ č"] - - "ổ": [t: "Lâ ąLâ č"] - - "ỗ": [t: "Lâ €Lâ č"] - - "ộ": [t: "Lâ  Lâ č"] - - "ÆĄ": [t: "Lâ Ș"] - - "ớ": [t: "L⠔Lâ Ș"] - - "ờ": [t: "Lâ °Lâ Ș"] - - "ở": [t: "Lâ ąLâ Ș"] - - "ụ": [t: "Lâ €Lâ Ș"] - - "ợ": [t: "Lâ  Lâ Ș"] - - "Ăș": [t: "L⠔Lâ „"] - - "Ăč": [t: "Lâ °Lâ „"] - - "á»§": [t: "Lâ ąLâ „"] - - "Ć©": [t: "Lâ €Lâ „"] - - "Ễ": [t: "Lâ  Lâ „"] - - "ư": [t: "Lâ ł"] - - "ứ": [t: "L⠔Lâ ł"] - - "ừ": [t: "Lâ °Lâ ł"] - - "á»­": [t: "Lâ ąLâ ł"] - - "ữ": [t: "Lâ €Lâ ł"] - - "á»±": [t: "Lâ  Lâ ł"] - - "Ăœ": [t: "L⠔Lâ œ"] - - "ỳ": [t: "Lâ °Lâ œ"] - - "á»·": [t: "Lâ ąLâ œ"] - - "á»č": [t: "Lâ €Lâ œ"] - - "á»”": [t: "Lâ  Lâ œ"] - - - "Đ": [t: "CLâ ź"] - - "Á": [t: "CL⠔𝑐L⠁"] - - "À": [t: "CL⠰𝑐L⠁"] - - "áșą": [t: "CL⠱𝑐L⠁"] - - "Ã": [t: "CLâ €đ‘L⠁"] - - "áș ": [t: "CL⠠𝑐L⠁"] - - "Â": [t: "CLâ Ą"] - - "áș€": [t: "CL⠔𝑐Lâ Ą"] - - "áșŠ": [t: "CL⠰𝑐Lâ Ą"] - - "áșš": [t: "CL⠱𝑐Lâ Ą"] - - "áșȘ": [t: "CLâ €đ‘Lâ Ą"] - - "áșŹ": [t: "CL⠠𝑐Lâ Ą"] - - "Ă": [t: "CL⠜"] - - "áșź": [t: "CL⠔𝑐L⠜"] - - "áș°": [t: "CL⠰𝑐L⠜"] - - "áșČ": [t: "CL⠱𝑐L⠜"] - - "áșŽ": [t: "CLâ €đ‘L⠜"] - - "áș¶": [t: "CL⠠𝑐L⠜"] - - "É": [t: "CL⠔𝑐L⠑"] - - "È": [t: "CL⠰𝑐L⠑"] - - "áșș": [t: "CL⠱𝑐L⠑"] - - "áșŒ": [t: "CLâ €đ‘L⠑"] - - "áșž": [t: "CL⠠𝑐L⠑"] - - "Ê": [t: "CLâ Ł"] - - "áșŸ": [t: "CL⠔𝑐Lâ Ł"] - - "Ề": [t: "CL⠰𝑐Lâ Ł"] - - "Ể": [t: "CL⠱𝑐Lâ Ł"] - - "Ễ": [t: "CLâ €đ‘Lâ Ł"] - - "Ệ": [t: "CL⠠𝑐Lâ Ł"] - - "Í": [t: "CL⠔𝑐L⠊"] - - "Ì": [t: "CL⠰𝑐L⠊"] - - "Ỉ": [t: "CL⠱𝑐L⠊"] - - "Äš": [t: "CLâ €đ‘L⠊"] - - "Ị": [t: "CL⠠𝑐L⠊"] - - "Ó": [t: "CL⠔𝑐L⠕"] - - "Ò": [t: "CL⠰𝑐L⠕"] - - "Ỏ": [t: "CL⠱𝑐L⠕"] - - "Õ": [t: "CLâ €đ‘L⠕"] - - "Ọ": [t: "CL⠠𝑐L⠕"] - - "Ô": [t: "CLâ č"] - - "Ố": [t: "CL⠔𝑐Lâ č"] - - "Ồ": [t: "CL⠰𝑐Lâ č"] - - "Ổ": [t: "CL⠱𝑐Lâ č"] - - "Ỗ": [t: "CLâ €đ‘Lâ č"] - - "Ộ": [t: "CL⠠𝑐Lâ č"] - - "Æ ": [t: "CLâ Ș"] - - "Ớ": [t: "CL⠔𝑐Lâ Ș"] - - "Ờ": [t: "CL⠰𝑐Lâ Ș"] - - "Ở": [t: "CL⠱𝑐Lâ Ș"] - - "á» ": [t: "CLâ €đ‘Lâ Ș"] - - "ỹ": [t: "CL⠠𝑐Lâ Ș"] - - "Ú": [t: "CL⠔𝑐Lâ „"] - - "Ù": [t: "CL⠰𝑐Lâ „"] - - "Ị": [t: "CL⠱𝑐Lâ „"] - - "Ćš": [t: "CLâ €đ‘Lâ „"] - - "Ề": [t: "CL⠠𝑐Lâ „"] - - "ÆŻ": [t: "CLâ ł"] - - "Ớ": [t: "CL⠔𝑐Lâ ł"] - - "á»Ș": [t: "CL⠰𝑐Lâ ł"] - - "ỏ": [t: "CL⠱𝑐Lâ ł"] - - "ở": [t: "CLâ €đ‘Lâ ł"] - - "á»°": [t: "CL⠠𝑐Lâ ł"] - - "Ý": [t: "CL⠔𝑐Lâ œ"] - - "á»Č": [t: "CL⠰𝑐Lâ œ"] - - "á»¶": [t: "CL⠱𝑐Lâ œ"] - - "Ở": [t: "CLâ €đ‘Lâ œ"] - - "Ỏ": [t: "CL⠠𝑐Lâ œ"] - - # Latin capitals: C + cells from lowercase a-z via spell/translate. - - "A-Z": # 0x41 - 0x5a - - tc: "C" - - spell: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')" - - - "α": [t: "GL⠁"] # 0x3b1 - - "ÎČ": [t: "GL⠃"] # 0x3b2 - - "Îł": [t: "GL⠛"] # 0x3b3 - - "ÎŽ": [t: "GL⠙"] # 0x3b4 - - "Δ": [t: "GL⠑"] # 0x3b5 - - "ζ": [t: "GLâ ”"] # 0x3b6 - - "η": [t: "GLâ ±"] # 0x3b7 - - "Ξ": [t: "GLâ č"] # 0x3b8 - - "Îč": [t: "GL⠊"] # 0x3b9 - - "Îș": [t: "GL⠅"] # 0x3ba - - "λ": [t: "GL⠇"] # 0x3bb - - "ÎŒ": [t: "GL⠍"] # 0x3bc - - "Μ": [t: "GL⠝"] # 0x3bd - - "Ο": [t: "GLâ ­"] # 0x3be - - "Îż": [t: "GL⠕"] # 0x3bf - - "π": [t: "GL⠏"] # 0x3c0 - - "ρ": [t: "GL⠗"] # 0x3c1 - - "ς": [t: "GL⠎"] # 0x3c2 - - "σ": [t: "GL⠎"] # 0x3c3 - - "τ": [t: "GL⠞"] # 0x3c4 - - "υ": [t: "GLâ „"] # 0x3c5 - - "φ": [T: "GL⠋"] # 0x3c6 - - "ϕ": [T: "GL⠋"] # 0x3c6 - - "χ": [T: "GLâ Ż"] # 0x3c7 - - "ψ": [t: "GLâ œ"] # 0x3c8 - - "ω": [t: "GLâ ș"] # 0x3c9 - - - "Α": [t: "CGL⠁"] # 0x391 - - "Β": [t: "CGL⠃"] # 0x392 - - "Γ": [t: "CGL⠛"] # 0x393 - - "Δ": [t: "CGL⠙"] # 0x394 - - "Ε": [t: "CGL⠑"] # 0x395 - - "Ζ": [t: "CGLâ ”"] # 0x396 - - "Η": [t: "CGLâ ± "] # 0x397 - - "Θ": [t: "CGLâ č"] # 0x398 - - "Ι": [t: "CGL⠊"] # 0x399 - - "Κ": [t: "CGL⠅"] # 0x39a - - "Λ": [t: "CGL⠇"] # 0x39b - - "Μ": [t: "CGL⠍"] # 0x39c - - "Ν": [t: "CGL⠝"] # 0x39d - - "Ξ": [t: "CGLâ ­"] # 0x39e - - "Ο": [t: "CGL⠕"] # 0x39f - - "Π": [t: "CGL⠏"] # 0x3a0 - - "ÎĄ": [t: "CGL⠗"] # 0x3a1 - - "Îą": [t: "CGL⠎"] # 0x3a2 - - "ÎŁ": [t: "CGL⠎"] # 0x3a3 - - "΀": [t: "CGL⠞"] # 0x3a4 - - "΄": [t: "CGLâ „"] # 0x3a5 - - "Ί": [t: "CGL⠋"] # 0x3a6 - - "Χ": [t: "CGLâ Ż"] # 0x3a7 - - "Κ": [t: "CGLâ œ"] # 0x3a8 - - "Ω": [T: "CGLâ ș"] # 0x3a9 - - - "”": [t: "GL⠍"] # 0x00B5 (Micro (Greek mu)) - - "℩": [t: "CGLâ ș"] # 0x2126 (Ohm sign (capital Greek omega)) - - "∆": [t: "CGL⠙"] # 0x2206 (Increment (capital Greek delta)) - - "∏": [t: "CGL⠏"] # 0x220F (Product (capital Greek pi)) - - "∑": [t: "CGL⠎"] # 0x2211 (Sum (capital Greek sigma)) - - -# Not yet defined symbols - - "‰": [T: "⠌⠚⠎⠎"] - - "≊": [T: "⠐⠹⠹⠶"] - - "⋼": [T: "⠣⠮⠜"] # 0x22ee (vertical ellipsis used to indicate dividable) - - "â§”": [T: "â žâ Ą"] - - "∕": [T: "⠐â Č"] - - "⊘": [T: "⠐â Č"] - - "⁄": [T: "⠐â Č"] - - "℃": [T: "⠔⠚⠀⠹⠉"] - - "℉": [T: "⠔⠚⠀⠹⠋"] +--- +# Definitions for Vietnamese Math Braille. But most of theym are same as UEB. +# UEB characters +# +# Some chars that originally came from an Excel spreadsheet, converted to csv, and the greatly expanded +# +# The UEB translation makes use of some non-braille chars as flags +# L -- what follows is a letter +# N -- what follows is a digit +# C -- precedes L for capital letters +# G -- precedes L for Greek Letters (after C for capitals) +# Typeface Indicators ("typeforms") +# B bold, I Italic, S Sans-serif, T script, D, Fraktur, đ”č blackboard-bold +# the type face indicators can be combined with B (first) and I (second) +# Standing alone chars: +# Any character which acts as a standing alone character (e.g, "{") needs each braille symbol to be labeled +# o -- opening/left side, c -- closing/right side, b -- both open and close (e.g, '"') + + + - "=": [T: "⠐⠶"] # 0x003D (Equals) + - "≠": [T: "⠐⠟"] # 0x2260 (Not equal) + - "<": [T: "⠐â Ș"] # 0x003C (Less than) + - "≀": [T: "⠐â Șâ ¶"] # 0x2264 (Less than or equal to) + - ">": [T: "⠐⠕"] # 0x003E (Greater than) + - "≄": [T: "⠐⠕⠶"] # 0x2265 (Greater than or equal to) + - "â‰Ș": [T: "⠐â Șâ Ș"] # 0x226A (Much less than) + - "≫": [T: "⠐⠕⠕"] # 0x226B (Much greater than) + - "≼": [T: "⠐â Ș⠈"] # 0x226E (Not less than) + - "≯": [T: "⠐⠕⠈"] # 0x226F (Not greater than) + - "≰": [T: "⠞⠐â Ș⠈⠐⠟"] # 0x2270 (Neither less than nor equal to) + - "≱": [T: "⠞⠐⠕⠈⠐⠟"] # 0x2271 (Neither greater than nor equal to) + - "∝": [t: "⠞⠐⠶"] # 0x221D (Proportional to) + - "≃": [T: "⠐⠹⠹"] # 0x2243 (Approximately equal to (tilde over horizontal line)) + - "≅": [T: "⠐⠹⠹"] # 0x2245 (Approximately equal to (tilde over equals sign)) + - "≈": [T: "⠐⠹⠹"] # 0x2248 (Approximately equal (tilde over tilde)) + - "≏": [t: "⠘⠐⠶"] # 0x224F (Equals with bump in top bar (difference between)) + - "≑": [t: "⠚⠐⠶"] # 0x2251 (Geometrically equal to (equals dotted above and below)) + - "≡": [T: "⠐⠿"] # 0x2261 (Equivalent to (three horizontal lines)) vi: trĂčng + - "≱": [T: "⠐⠿⠈"] # 0x2262 (Not identical to) + - "∈": [T: "⠈⠑"] # 0x2208 (Element of (member of)) + - "∉": [T: "⠈⠑⠈"] # 0x2209 (Element of (not member of)) + - "+": [T: "⠐⠖"] # 0x002B (Plus sign) + - "∋": [t: "⠈⠘⠑"] # 0x220B (Contains) + - "⊂": [T: "⠘⠣"] # 0x2282 (Subset of) + - "⊃": [T: "⠘⠜"] # 0x2283 (Superset of) + - "⊆": [T: "⠘⠣⠐⠶"] # 0x2286 (Subset of or equal) + - "⊇": [T: "⠘⠜⠐⠶"] # 0x2287 (Superset of or equal) + - "⊊": [t: "⠚⠘⠣"] # 0x228A (Subset of with not equal) + - "⊋": [t: "⠹⠘⠜"] # 0x228B (Superset of with not equal) + - "âŠČ": [t: "⠈⠞⠣"] # 0x22B2 (Normal subgroup of) + - "⊳": [t: "⠈⠾⠜"] # 0x22B3 (Contains as normal subgroup) + - "⊮": [t: "â žâ žâ Ł"] # 0x22B4 (Normal subgroup of or equal) + - "⊔": [t: "⠾⠾⠜"] # 0x22B5 (Contains as normal subgroup or equal) + - "⋬": [t: "â šâ žâ Ł"] # 0x22EC (not normal subgroup) -- this isn't the same as what is in GTM 10, but that similar has no Unicode equiv + - "⋭": [t: "â šâ žâ Ł"] # 0x22ED (does not contain as normal subgroup) -- this isn't the same as what is in GTM 10, but that similar has no Unicode equiv + - "−": [t: "⠐⠀"] # 0x2212 (Minus sign) + - "·": [T: "⠐⠊"] # 0x00D7 (Multiplication dot (times)) + - "×": [T: "⠐⠊"] # 0x00D7 (Multiplication sign (times)) + - "Ă·": [T: "⠐â Č"] # 0x00F7 (Division sign (divided by)) + - "±": [T: "⠐⠖⠀"] # 0x00B1 (Plus or minus) + - "∓": [T: "⠐⠀⠖"] # 0x2213 (Minus or plus) + - "∗": [t: "⠐⠊"] # 0x2217 (Asterisk operator) + - "∘": [t: "⠐⠎"] # 0x2218 (Ring operator) + - "◩": [t: "⠐⠎"] # 0x25E6 (White bullet) + - "∌": [t: "⠈⠔"] # 0x223C (Tilde operator) + - "⋅": [t: "⠐⠊"] # 0x22C5 (Dot operator) + - "∧": [t: "⠈⠊"] # 0x2227 (Logical and) + - "√": [t: "⠈⠖"] # 0x2228 (Logical or) + - "∩": [T: "â šâ Š"] # 0x2229 (Intersection) + - "âˆȘ": [T: "⠹⠖"] # 0x222A (Union) + - "∖": [T: "â žâ Ą"] # 0x2216 (Set minus) + - "(": [T: "o⠈oâ Ł"] # 0x0028 (Left parenthesis) + - ")": [T: "c⠈c⠜"] # 0x0029 (Right parenthesis) + - "[": [T: "oâ šoâ Ł"] # 0x005B (Left square bracket) + - "]": [T: "câ šc⠜"] # 0x005D (Right square bracket) + - "{": [T: "oâ žoâ Ł"] # 0x007B (Left curly bracket) + - "}": [T: "câ žc⠜"] # 0x007D (Right curly bracket) + - "〈": [T: "oâ žâ Łâ €"] # 0x2329 (Left angle bracket) + - "âŒȘ": [T: "c⠀⠞⠜"] # 0x232A (Right angle bracket) + - "|": [T: "â žâ ł"] # 0x007C (Vertical line) + # - test: + # if: "preceding-sibling::* and following-sibling::*" + # then: [T: "Wâ žâ łW"] # comparison (e.g., such that -- rule 145) + # else: [T: "â žâ ł"] # absolute value, others??? + - "!": [T: "c⠖"] # 0x21 (Exclamation (factorial)) + - "#": [T: "â Œ"] # 0x23 (Number sign (hash)) + - "%": [T: "⠌⠚⠎"] # 0x25 (Percent sign) No dots 46 before as in UEB + - "&": [t: "⠈⠯"] # 0x26 (Ampersand) + - "*": [T: "⠐⠊"] # 0x002A (Asterisk) + - "/": [T: "⠐â Č"] # 0x002F (Solidus (slash)) + - ";": [t: "c⠆"] # 0x003B (Semicolon) + - "?": [T: "câ ą"] # 0x003F (Question mark) + - "@": [T: "⠈⠁"] # 0x0040 (Commercial at sign) + - "\\": [t: "â žâ Ą"] # 0x005C (Backslash) + - "^": [t: "⠈⠹"] # 0x005E (Caret (hat, up arrow)) + - "_": [t: "â šâ €"] # 0x005F (Low line (underscore)) + - "~": [t: "⠈⠔"] # 0x007E (Tilde (swung dash)) + - "Âą": [t: "⠈⠉"] # 0x00A2 (Cents sign) + - "€": [t: "⠈⠑"] # 0x20AC (Euro sign) + - "₣": [t: "⠈⠋"] # 0x20A3 (French franc sign) + - "ÂŁ": [t: "⠈⠇"] # 0x00A3 (Pound sign) + - "₩": [t: "⠈⠝"] # 0x20A6 (Naira sign) + - "$": [t: "⠈⠎"] # 0x0024 (Dollar sign) + - "„": [t: "⠈⠜"] # 0x00A5 (Yen sign) + - "Š": [t: "â šâ ł"] # 0x00A6 (Broken bar) + - "ÂŹ": [t: "⠈â č"] # 0x00AC (Not sign) + - "°": [T: "⠔⠚"] # 0x00B0 (Degree sign) + - "†": [t: "⠈⠠â č"] # 0x2020 (Dagger) + - "‡": [t: "⠈⠠⠻"] # 0x2021 (Double dagger) + - "
": [T: "c⠄c⠄c⠄"] # 0x2026 (Ellipsis) + - "â€Č": [T: "⠄"] # 0x2032 (Prime sign) + - "″": [T: "⠄⠄"] # 0x2033 (Double prime sign) + - "‮": [T: "⠄⠄⠄"] # 0x2034 (Triple prime sign) + - "Å": [t: "⠠⠘⠫⠁"] # 0x212B (Angstrom symbol) + - "Å": [t: "⠠⠘⠫⠁"] # 0x00C5 (WIRIS uses this for Angstrom) + - "∀": [t: "⠘⠁"] # 0x2200 (For all) + - "∂": [t: "⠈⠙"] # 0x2202 (Partial differential) + - "∃": [T: "⠘⠑"] # 0x2203 (There exists) + - "∄": [T: "⠘⠑⠈"] # 0x2204 (There does not exist) + - "∅": [T: "⠈⠚"] # 0x2205 (Empty set) + - "∇": [t: "⠘⠙"] # 0x2207 (Nabla (del, inverted capital delta)) + - "∎": [t: "⠞⠫⠌⠙t"] # 0x220E (End of proof) + - "√": [T: "â ©"] # 0x221A (Square root (radical) without vinculum) + - "∞": [T: "⠌⠕"] # 0x221E (Infinity) + - "∠": [T: "⠫⠛"] # 0x2220 (Angle) + - "∥": [T: "â šâ «â ›"] # 0x2221 (Measured angle) + - "⊟": [T: "⠌⠫⠛"] # 0x22BE (Right angle with arc) + - "∟": [T: "â «â §"] + - "∫": [T: "â Ÿ"] # 0x222B (Integral) + - "∟": [T: "⠐⠟"] # 0x222E (Contour integral (closed line integral)) + - "∎": [t: "â  â Ą"] # 0x2234 (Therefore) + - "∔": [t: "⠈⠌"] # 0x2235 (Because (since)) + - "∶": [t: "⠒"] # 0x2236 (Ratio) + - "∷": [T: "⠒⠒"] # 0x2237 (Proportion) + - "∣": [T: "⠣⠮⠜"] # 0x2223 (Divides) ueb: â žâ ł + - "∀": [T: "â Łâ Œâ œ"] # 0x2224 (Does not divide) ueb: ⠞⠳⠈⠱ + - "∄": [T: "â «â ¶"] # 0x2225 (Parallel) VI: AB parallel to CD, should be: â «ABâ ¶CD + - "∊": [T: "â «â Ÿ"] # 0x2226 (Not parallel) Vi: AB not parallel to CD, should be: â «AB⠐⠟CD + - "⟂": [T: "â «â §"] # 0x27C2 (Perpendicular) + - "⊱": [t: "⠾⠒"] # 0x22a2 (Right tack) + - "⊣": [t: "⠈⠾⠒"] # 0x22a3 (Left tack) + - "⊄": [T: "â «â §"] # 0x22A5 (Up tack (perpendicular)) + - "⊩": [t: "⠾⠒"] # 0x22A6 (Assertion (is a theorem)) + - "⊹": [t: "⠘⠾⠒"] # 0x22A8 (TRUE (is valid)) + - "⊬": [t: "⠞⠒⠈⠱"] # 0x22AC (Does not prove) + - "⊭": [t: "⠘⠞⠒⠈⠱"] # 0x22AD (Not TRUE) + - "â«€": [t: "⠹⠾⠒"] # 0x2AE4 (Vertical bar double left turnstile) + - "✓": [t: "⠈⠩"] # 0x2713 (Check mark (tick)) + - "⊔": [t: "⠹⠚"] # 0x29B5 (Plimsoll sign (standard state)) + - "⼖": [t: "1⠐⠠⠀⠯⠫⠿"] # 0x2B96 (MEDIUM SMALL WHITE CIRCLE WITH HORIZONTAL BAR (standard state)) + - "←": [t: "â łâ Ș"] # 0x2190 (Leftwards arrow) + - "↑": [t: "â łâ Ź"] # 0x2191 (Upwards arrow) + - "→": [t: "⠳⠕"] # 0x2192 (Rightwards arrow) + - "↓": [t: "â łâ ©"] # 0x2193 (Downwards arrow) + - "↔": [T: "â łâ Ș⠶⠕"] # 0x2194 (Left right arrow) + - "↕": [t: "â łâ ș⠗⠬"] # 0x2195 (Up down arrow) + - "↖": [t: "â łâ ±"] # 0x2196 (Northwest arrow) + - "↗": [t: "⠳⠎"] # 0x2197 (Northeast arrow) + - "↘": [t: "â łâ Ł"] # 0x2198 (Southeast arrow) + - "↙": [t: "⠳⠜"] # 0x2199 (Southwest arrow) + - "↚": [t: "â łâ Ș⠈⠱"] # 0x219A (Leftwards arrow with stroke) + - "↛": [t: "â łâ •â ˆâ ±"] # 0x219B (Rightwards arrow with stroke) + - "↜": [t: "⠳⠔⠱â Ș"] # 0x219C (Leftwards wave arrow) + - "↝": [t: "⠳⠱⠔⠕"] # 0x219D (Rightwards wave arrow) + - "↞": [t: "⠳⠒⠗⠗â Ș"] # 0x219E (Leftwards two headed arrow) + - "↟": [t: "⠳⠒⠗⠗⠬"] # 0x219F (Upwards two headed arrow) + - "↠": [t: "⠳⠒⠗⠗⠕"] # 0x21A0 (Rightwards two headed arrow) + - "↡": [t: "â łâ ’â —â —â ©"] # 0x21A1 (Downwards two headed arrow) + - "↱": [t: "⠳⠗⠗â Ș"] # 0x21A2 (Leftwards arrow with tail) + - "↣": [t: "⠳⠗⠗⠕"] # 0x21A3 (Rightwards arrow with tail) + - "ↀ": [t: "⠳⠳⠗â Ș"] # 0x21A4 (Leftwards arrow from bar) + - "ↄ": [t: "⠳⠳⠗⠬"] # 0x21A5 (Upwards arrow from bar) + - "↩": [t: "⠳⠳⠗⠕"] # 0x21A6 (Rightwards arrow from bar) + - "↧": [t: "â łâ łâ —â ©"] # 0x21A7 (Downwards arrow from bar) + - "↭": [t: "â łâ ș⠔⠱⠗⠕"] # 0x21AD (Left right wave arrow) + - "↼": [t: "â łâ ș⠗⠕⠈⠱"] # 0x21AE (Left right arrow with stroke) + - "↰": [t: "â łâ Žâ Ź"] # 0x21B0 (Upwards arrow with tip left) + - "↱": [t: "â łâ Čâ Ź"] # 0x21B1 (Upwards arrow with tip right) + - "â†Č": [t: "â łâ Čâ ©"] # 0x21B2 (Downwards arrow with tip left) + - "↳": [t: "â łâ Žâ ©"] # 0x21B3 (Downwards arrow with tip right) + - "↶": [t: "⠳⠔⠔â Ș"] # 0x21B6 (Anticlockwise top semicircle arrow) + - "↷": [t: "⠳⠱⠱⠕"] # 0x21B7 (Clockwise top semicircle arrow) + - "↌": [t: "⠳⠈⠗â Ș"] # 0x21BC (Leftwards harpoon with barb upwards) + - "↜": [t: "⠳⠠⠗â Ș"] # 0x21BD (Leftwards harpoon with barb downwards) + - "↟": [t: "⠳⠠⠗⠬"] # 0x21BE (Upwards harpoon with barb rightwards) + - "↿": [t: "⠳⠈⠗⠬"] # 0x21BF (Upwards harpoon with barb leftwards) + - "⇀": [t: "⠳⠈⠗⠕"] # 0x21C0 (Rightwards harpoon with barb upwards) + - "⇁": [t: "⠳⠠⠗⠕"] # 0x21C1 (Rightwards harpoon with barb downwards) + - "⇂": [t: "â łâ ˆâ —â ©"] # 0x21C2 (Downwards harpoon with barb rightwards) + - "⇃": [t: "â łâ  â —â ©"] # 0x21C3 (Downwards harpoon with barb leftwards) + - "⇄": [t: "⠳⠕⠻⠳â Ș"] # 0x21C4 (Rightwards arrow over leftwards arrow) + - "⇅": [t: "â łâ Źâ żâ łâ ©"] # 0x21C5 (Upwards arrow left of Downwards arrow) + - "⇌": [T: "â łâ Ș⠕"] # 0x21CC (Rightwards harpoon over leftwards harpoon (equilibrium)) + - "⇐": [t: "â łâ ¶â Ș"] # 0x21D0 (Leftwards double arrow) + - "⇑": [t: "â łâ ¶â Ź"] # 0x21D1 (Upwards double arrow) + - "⇒": [t: "â łâ ¶â •"] # 0x21D2 (Rightwards double arrow) + - "⇓": [t: "â łâ ¶â ©"] # 0x21D3 (Downwards double arrow) + - "⇔": [T: "â łâ Ș⠶⠕"] # 0x21D4 (Left right double arrow) + - "⇕": [t: "â łâ șâ ¶â —â Ź"] # 0x21D5 (Up down double arrow) + - "⇠": [t: "⠳⠂â Ș"] # 0x21E0 (Leftwards dashed arrow) + - "⇡": [t: "⠳⠂⠬"] # 0x21E1 (Upwards dashed arrow) + - "⇱": [t: "⠳⠂⠕"] # 0x21E2 (Rightwards dashed arrow) + - "⇣": [t: "â łâ ‚â ©"] # 0x21E3 (Downwards dashed arrow) + - "⟔": [t: "â łâ Ș"] # 0x27F5 (Long leftwards arrow) + - "⟶": [t: "⠳⠕"] # 0x27F6 (Long rightwards arrow) + - "â„‚": [t: "â žâ ¶"] # 0x2942 (Rightwards arrow above short leftwards arrow (equilibrium, trend to the right)) + - "â„„": [t: "⠈⠞⠶"] # 0x2944 (Short rightwards arrow above leftwards arrow (equilibrium, trend to the left)) + +# Mappings for some new Unicode chemistry arrows/symbols +# These need to be verified -- 0x1f8d1, 0x1f8d2, and 0x1f8d3 conflict with GTM 16 (uses short arrow when really should be long) + - "🣐": [t: "⠳⠒⠒⠒⠕⠻⠳⠒⠒⠒â Ș"] # 0x1F8D0 LONG RIGHTWARDS ARROW OVER LONG LEFTWARDS ARROW + - "🣑": [t: "â łâ Ș⠕"] # 0x1f8d1 (Long rightwards harpoon over leftwards harpoon (equilibrium)) + - "🣒": [t: "â žâ ¶"] # 0x1f8d2 (Long rightwards harpoon over leftwards harpoon (equilibrium, trend to the right)) + - "🣓": [t: "⠈⠞⠶"] # 0x1f8d3 (Long rightwards harpoon over leftwards harpoon (equilibrium, trend to the left)) +# - "🣑": [t: "â łâ ’â ’â ’â ˆâ —â •â »â łâ ’â ’â ’â  â —â Ș"] # 0x1F8D1 LONG RIGHTWARDS HARPOON OVER LONG LEFTWARDS HARPOON +# - "🣒": [t: "â łâ ’â ’â ’â ˆâ —â •â »â łâ ’â  â —â Ș"] # 0x1F8D2 LONG RIGHTWARDS HARPOON ABOVESHORT LEFTWARDS HARPOON +# - "🣓": [t: "â łâ ’â ˆâ —â •â »â łâ ’â ’â ’â  â —â Ș"] # 0x1F8D3 SHORT RIGHTWARDS HARPOON ABOVELONG LEFTWARDS HARPOON + - "🣔": [t: "⠳⠒⠒⠒⠈⠗â Ș⠻⠳⠒⠠⠗⠕"] # 0x1F8D4 LONG LEFTWARDS HARPOON ABOVESHORT RIGHTWARDS HARPOON + - "🣕": [t: "⠳⠒⠈⠗â Ș⠻⠳⠒⠒⠒⠠⠗⠕"] # 0x1F8D5 SHORT LEFTWARDS HARPOON ABOVELONG RIGHTWARDS HARPOON + - "🣖": [t: "⠳⠒⠒⠒⠕⠯⠠⠭"] # 0x1F8D6 LONG RIGHTWARDS ARROW WITH THROUGH X + - "🣗": [t: "⠐⠠⠀⠯⠫⠿"] # 0x1F8D7 LONG RIGHTWARDS ARROW WITH DOUBLE SLASH + + - "△": [T: "⠫⠌⠉"] # 0x25B3 (Triangle) + - "□": [T: "⠫⠌⠙"] # 0x25A1 (Square) + - "â–€": [T: "⠚⠫⠌⠙"] # 0x25A4 (Square with horizontal fill) + - "â–„": [T: "⠚⠫⠌⠙"] # 0x25A5 (Square with vertical fill) + - "▩": [T: "⠚⠫⠌⠙"] # 0x25A6 (Square with orthogonal crosshatch fill) + - "▧": [T: "⠚⠫⠌⠙"] # 0x25A7 (Square with upper left to lower right fill) + - "▹": [T: "⠚⠫⠌⠙"] # 0x25A8 (Square with upper right to lower left fill) + - "▩": [T: "⠚⠫⠌⠙"] # 0x25A9 (Square with diagonal crosshatch fill) + - "○": [t: "â «â ż"] # 0x25CB (Circle) + - "◍": [T: "â šâ «â ż"] # 0x25CD (Circle with vertical fill) + - "▱": [T: "⠫⠈⠌⠙"] # 0x25B1 (Parallelogram) + - "â–Č": [T: "⠞⠫⠌⠉"] # 0x25B2 (Filled triangle) + - "■": [T: "⠞⠫⠌⠙"] # 0x25A0 (Filled square) + - "≜": [T: "⠞⠙⠐⠶"] # 0x225C (Delta equal to) + - "≝": [t: "â Łâ ™â ‘â ‹â œâ »â â ¶"] # 0x225D (Equal to by definition) + - "⊕": [t: "â «â żâ Ș⠐⠖t"] # 0x2295 (Circled plus) + - "⊖": [t: "â «â żâ Ș⠐⠀t"] # 0x2296 (Circled minus) + - "⊗": [t: "⠐⠊t"] # 0x2297 (Circled times) + - "⊛": [t: "⠐⠊t"] # 0x229B (Circled asterisk operator) + - "⊞": [t: "⠫⠌⠙â Ș⠐⠖t"] # 0x229E (Squared plus) + - "⊟": [t: "⠫⠌⠙â Ș⠐⠀t"] # 0x229F (Squared minus) + - "⊠": [t: "⠫⠌⠙â Ș⠐⠊t"] # 0x22A0 (Squared times) + - "˙": [t: "â Č"] # 0x02D9 ( Dot Above) + - "š": [t: "â Čâ Č"] # 0x00A8 ( Diaeresis/Double Dot Above) + - "©": [t: "⠘⠉"] # 0xa9 (Copyright) + + + - "\"": [t: "bâ  bâ ¶"] + - "'": [t: "b⠄"] + - "“": [t: "o⠘oâ Š"] + - "”": [t: "c⠘câ Ž"] + - "‘": [t: "oâ  oâ Š"] + - "’": [t: "câ  câ Ž"] + - "«": [t: "oâ žoâ Š"] + - "»": [t: "câ žcâ Ž"] + + - " ": # 0x20 (Space) + - test: + if: "self::m:mn" + then: [t: "N⠐"] + else: [t: "W"] + - " ": # 0xa0 (Non-breaking Space) + - test: + - if: "self::m:mn" + then: [t: "N⠐"] + - else_if: "following-sibling::*[1][@class='MathML-unit' or BaseNode(.)[@class='MathML-unit']]" + then: [t: "𝐖"] + else: [t: "W"] + - ",": # 0x2c (Comma) + - test: + if: "self::m:mn" + then: [t: "N⠂"] + else: [t: ",W"] + - ".": # 0x2e (Period) + - test: + if: "self::m:mn" + then: [T: "N⠄"] + else: [t: "."] + - ":": # 0x003A (Colon) + # Sometimes a colon is meant to be a ratio/mathord and sometimes a map/punct. + # The latter has a space after it. + # If in an mrow, guess it is infix and checks the operator. This is pretty weak! + # Field extensions "[K:F]" and trilinear coordinates "a:b:c" don't want extra space + # Time doesn't want an extra space -- the am/pm get wrapped in an mrow with the minutes after the colon + - test: + if: + - "ancestor::*[2][IsBracketed(., '{', '}')] or " # field extension + - "preceding-sibling::*[2][.=':'] or following-sibling::*[2][.=':'] or" # trilinear form + # ratios tend to have similar left and right sides + - "name(preceding-sibling::*[1]) = name(following-sibling::*[1]) or" + # am/pm test + - "(name(preceding-sibling::*[1]) = 'mn' and " + - " following-sibling::*[1][self::m:mrow and count(*)=3 and *[1][self::m:mn] and " + - " *[3][translate(., 'APM\u00A0', 'apm') = 'am' or translate(., 'APM\u00A0', 'apm') = 'pm']" + - " ])" + then: [t: "⠒"] + else: [t: "⠒W"] + + - "-": # 0x2d (Minus sign or hyphen) + - test: + if: "self::m:mo" + then: [t: "⠐⠀"] + else: [t: "â €"] + + - "⁥": [t: ""] # 0x2061⁥ (invisible function apply) + #- test: + #if: + #- "preceding-sibling::*[1][self::m:mi and substring(., string-length(.), 1)!=' '] and " # avoid scripted function names and one that end with spaces + #- "following-sibling::*[1][self::m:mi and translate(., 'abcdefghijklmnopqrstuvwxyz', '') = '']" # GTM 9.3.2 + #then: [t: "W"] + #else: [t: ""] + + - "⁹": [t: ""] # 0x2062 (invisible times) + #- test: + #if: # GTM 9.3.3 (not very clear in rule, but the function name has to start with a lower case latin char ['no indicators']) + #- "parent::m:mrow and " + #- "preceding-sibling::*[1][" + #- " (self::m:mi and translate(., 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', '') = '') or " + #- " (self::m:mrow and translate(*[last()], 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', '') = '')] and" + #- " following::*[1][self::m:mrow and count(*)=3 and " # look for function apply + #- " *[2][.='⁥'] and *[1][self::m:mi and translate(., 'abcdefghijklmnopqrstuvwxyz', '') = '']]" + #then: [t: "W"] + #else: [t: ""] + - "⁣": [t: ""] # 0x2063⁥ (invisible separator) + - "⁀": [t: ""] # 0x2064 (invisible plus) + - "0": [t: "N⠚"] # 0x30 + - "1": [t: "N⠁"] # 0x31 + - "2": [t: "N⠃"] # 0x32 + - "3": [t: "N⠉"] # 0x33 + - "4": [t: "N⠙"] # 0x34 + - "5": [t: "N⠑"] # 0x35 + - "6": [t: "N⠋"] # 0x36 + - "7": [t: "N⠛"] # 0x37 + - "8": [t: "N⠓"] # 0x38 + - "9": [t: "N⠊"] # 0x39 + + # we stick the drop numbers into the private use area for consistency + - "\ue000": [t: "Nâ Ž"] # 0 + - "\ue001": [t: "N⠂"] # 1 + - "\ue002": [t: "N⠆"] # 2 + - "\ue003": [t: "N⠒"] # 3 + - "\ue004": [t: "Nâ Č"] # 4 + - "\ue005": [t: "Nâ ą"] # 5 + - "\ue006": [t: "N⠖"] # 6 + - "\ue007": [t: "Nâ ¶"] # 7 + - "\ue008": [t: "Nâ Š"] # 8 + - "\ue009": [t: "N⠔"] # 9 + + - "a": [t: "L⠁"] # 0x61 + - "b": [t: "L⠃"] # 0x62 + - "c": [t: "L⠉"] # 0x63 + - "d": [t: "L⠙"] # 0x64 + - "e": [t: "L⠑"] # 0x65 + - "f": [t: "L⠋"] # 0x66 + - "g": [t: "L⠛"] # 0x67 + - "h": [t: "L⠓"] # 0x68 + - "i": [t: "L⠊"] # 0x69 + - "j": [t: "L⠚"] # 0x6a + - "k": [t: "L⠅"] # 0x6b + - "l": [t: "L⠇"] # 0x6c + - "m": [t: "L⠍"] # 0x6d + - "n": [t: "L⠝"] # 0x6e + - "o": [t: "L⠕"] # 0x6f + - "p": [t: "L⠏"] # 0x70 + - "q": [t: "L⠟"] # 0x71 + - "r": [t: "L⠗"] # 0x72 + - "s": [t: "L⠎"] # 0x73 + - "t": [t: "L⠞"] # 0x74 + - "u": [t: "Lâ „"] # 0x75 + - "v": [t: "Lâ §"] # 0x76 + - "w": [t: "Lâ ș"] # 0x77 + - "x": [t: "Lâ ­"] # 0x78 + - "y": [t: "Lâ œ"] # 0x79 + - "z": [t: "Lâ ”"] # 0x7a + + - "đ": [t: "Lâ ź"] + - "ĂĄ": [t: "L⠔L⠁"] + - "Ă ": [t: "Lâ °L⠁"] + - "áșŁ": [t: "Lâ ąL⠁"] + - "ĂŁ": [t: "Lâ €L⠁"] + - "áșĄ": [t: "Lâ  L⠁"] + - "Ăą": [t: "Lâ Ą"] + - "áș„": [t: "L⠔Lâ Ą"] + - "áș§": [t: "Lâ °Lâ Ą"] + - "áș©": [t: "Lâ ąLâ Ą"] + - "áș«": [t: "Lâ €Lâ Ą"] + - "áș­": [t: "Lâ  Lâ Ą"] + - "ă": [t: "L⠜"] + - "áșŻ": [t: "L⠔L⠜"] + - "áș±": [t: "Lâ °L⠜"] + - "áșł": [t: "Lâ ąL⠜"] + - "áș”": [t: "Lâ €L⠜"] + - "áș·": [t: "Lâ  L⠜"] + - "Ă©": [t: "L⠔L⠑"] + - "Ăš": [t: "Lâ °L⠑"] + - "áș»": [t: "Lâ ąL⠑"] + - "áșœ": [t: "Lâ €L⠑"] + - "áșč": [t: "Lâ  L⠑"] + - "ĂȘ": [t: "Lâ Ł"] + - "áșż": [t: "L⠔Lâ Ł"] + - "ề": [t: "Lâ °Lâ Ł"] + - "ể": [t: "Lâ ąLâ Ł"] + - "ễ": [t: "Lâ €Lâ Ł"] + - "ệ": [t: "Lâ  Lâ Ł"] + - "Ă­": [t: "L⠔L⠊"] + - "ĂŹ": [t: "Lâ °L⠊"] + - "ỉ": [t: "Lâ ąL⠊"] + - "Ä©": [t: "Lâ €L⠊"] + - "ị": [t: "Lâ  L⠊"] + - "Ăł": [t: "L⠔L⠕"] + - "ĂČ": [t: "Lâ °L⠕"] + - "ỏ": [t: "Lâ ąL⠕"] + - "Ă”": [t: "Lâ €L⠕"] + - "ọ": [t: "Lâ  L⠕"] + - "ĂŽ": [t: "Lâ č"] + - "ố": [t: "L⠔Lâ č"] + - "ồ": [t: "Lâ °Lâ č"] + - "ổ": [t: "Lâ ąLâ č"] + - "ỗ": [t: "Lâ €Lâ č"] + - "ộ": [t: "Lâ  Lâ č"] + - "ÆĄ": [t: "Lâ Ș"] + - "ớ": [t: "L⠔Lâ Ș"] + - "ờ": [t: "Lâ °Lâ Ș"] + - "ở": [t: "Lâ ąLâ Ș"] + - "ụ": [t: "Lâ €Lâ Ș"] + - "ợ": [t: "Lâ  Lâ Ș"] + - "Ăș": [t: "L⠔Lâ „"] + - "Ăč": [t: "Lâ °Lâ „"] + - "á»§": [t: "Lâ ąLâ „"] + - "Ć©": [t: "Lâ €Lâ „"] + - "Ễ": [t: "Lâ  Lâ „"] + - "ư": [t: "Lâ ł"] + - "ứ": [t: "L⠔Lâ ł"] + - "ừ": [t: "Lâ °Lâ ł"] + - "á»­": [t: "Lâ ąLâ ł"] + - "ữ": [t: "Lâ €Lâ ł"] + - "á»±": [t: "Lâ  Lâ ł"] + - "Ăœ": [t: "L⠔Lâ œ"] + - "ỳ": [t: "Lâ °Lâ œ"] + - "á»·": [t: "Lâ ąLâ œ"] + - "á»č": [t: "Lâ €Lâ œ"] + - "á»”": [t: "Lâ  Lâ œ"] + + - "Đ": [t: "CLâ ź"] + - "Á": [t: "CL⠔𝑐L⠁"] + - "À": [t: "CL⠰𝑐L⠁"] + - "áșą": [t: "CL⠱𝑐L⠁"] + - "Ã": [t: "CLâ €đ‘L⠁"] + - "áș ": [t: "CL⠠𝑐L⠁"] + - "Â": [t: "CLâ Ą"] + - "áș€": [t: "CL⠔𝑐Lâ Ą"] + - "áșŠ": [t: "CL⠰𝑐Lâ Ą"] + - "áșš": [t: "CL⠱𝑐Lâ Ą"] + - "áșȘ": [t: "CLâ €đ‘Lâ Ą"] + - "áșŹ": [t: "CL⠠𝑐Lâ Ą"] + - "Ă": [t: "CL⠜"] + - "áșź": [t: "CL⠔𝑐L⠜"] + - "áș°": [t: "CL⠰𝑐L⠜"] + - "áșČ": [t: "CL⠱𝑐L⠜"] + - "áșŽ": [t: "CLâ €đ‘L⠜"] + - "áș¶": [t: "CL⠠𝑐L⠜"] + - "É": [t: "CL⠔𝑐L⠑"] + - "È": [t: "CL⠰𝑐L⠑"] + - "áșș": [t: "CL⠱𝑐L⠑"] + - "áșŒ": [t: "CLâ €đ‘L⠑"] + - "áșž": [t: "CL⠠𝑐L⠑"] + - "Ê": [t: "CLâ Ł"] + - "áșŸ": [t: "CL⠔𝑐Lâ Ł"] + - "Ề": [t: "CL⠰𝑐Lâ Ł"] + - "Ể": [t: "CL⠱𝑐Lâ Ł"] + - "Ễ": [t: "CLâ €đ‘Lâ Ł"] + - "Ệ": [t: "CL⠠𝑐Lâ Ł"] + - "Í": [t: "CL⠔𝑐L⠊"] + - "Ì": [t: "CL⠰𝑐L⠊"] + - "Ỉ": [t: "CL⠱𝑐L⠊"] + - "Äš": [t: "CLâ €đ‘L⠊"] + - "Ị": [t: "CL⠠𝑐L⠊"] + - "Ó": [t: "CL⠔𝑐L⠕"] + - "Ò": [t: "CL⠰𝑐L⠕"] + - "Ỏ": [t: "CL⠱𝑐L⠕"] + - "Õ": [t: "CLâ €đ‘L⠕"] + - "Ọ": [t: "CL⠠𝑐L⠕"] + - "Ô": [t: "CLâ č"] + - "Ố": [t: "CL⠔𝑐Lâ č"] + - "Ồ": [t: "CL⠰𝑐Lâ č"] + - "Ổ": [t: "CL⠱𝑐Lâ č"] + - "Ỗ": [t: "CLâ €đ‘Lâ č"] + - "Ộ": [t: "CL⠠𝑐Lâ č"] + - "Æ ": [t: "CLâ Ș"] + - "Ớ": [t: "CL⠔𝑐Lâ Ș"] + - "Ờ": [t: "CL⠰𝑐Lâ Ș"] + - "Ở": [t: "CL⠱𝑐Lâ Ș"] + - "á» ": [t: "CLâ €đ‘Lâ Ș"] + - "ỹ": [t: "CL⠠𝑐Lâ Ș"] + - "Ú": [t: "CL⠔𝑐Lâ „"] + - "Ù": [t: "CL⠰𝑐Lâ „"] + - "Ị": [t: "CL⠱𝑐Lâ „"] + - "Ćš": [t: "CLâ €đ‘Lâ „"] + - "Ề": [t: "CL⠠𝑐Lâ „"] + - "ÆŻ": [t: "CLâ ł"] + - "Ớ": [t: "CL⠔𝑐Lâ ł"] + - "á»Ș": [t: "CL⠰𝑐Lâ ł"] + - "ỏ": [t: "CL⠱𝑐Lâ ł"] + - "ở": [t: "CLâ €đ‘Lâ ł"] + - "á»°": [t: "CL⠠𝑐Lâ ł"] + - "Ý": [t: "CL⠔𝑐Lâ œ"] + - "á»Č": [t: "CL⠰𝑐Lâ œ"] + - "á»¶": [t: "CL⠱𝑐Lâ œ"] + - "Ở": [t: "CLâ €đ‘Lâ œ"] + - "Ỏ": [t: "CL⠠𝑐Lâ œ"] + + # Latin capitals: C + cells from lowercase a-z via spell/translate. + - "A-Z": # 0x41 - 0x5a + - tc: "C" + - spell: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')" + + - "α": [t: "GL⠁"] # 0x3b1 + - "ÎČ": [t: "GL⠃"] # 0x3b2 + - "Îł": [t: "GL⠛"] # 0x3b3 + - "ÎŽ": [t: "GL⠙"] # 0x3b4 + - "Δ": [t: "GL⠑"] # 0x3b5 + - "ζ": [t: "GLâ ”"] # 0x3b6 + - "η": [t: "GLâ ±"] # 0x3b7 + - "Ξ": [t: "GLâ č"] # 0x3b8 + - "Îč": [t: "GL⠊"] # 0x3b9 + - "Îș": [t: "GL⠅"] # 0x3ba + - "λ": [t: "GL⠇"] # 0x3bb + - "ÎŒ": [t: "GL⠍"] # 0x3bc + - "Μ": [t: "GL⠝"] # 0x3bd + - "Ο": [t: "GLâ ­"] # 0x3be + - "Îż": [t: "GL⠕"] # 0x3bf + - "π": [t: "GL⠏"] # 0x3c0 + - "ρ": [t: "GL⠗"] # 0x3c1 + - "ς": [t: "GL⠎"] # 0x3c2 + - "σ": [t: "GL⠎"] # 0x3c3 + - "τ": [t: "GL⠞"] # 0x3c4 + - "υ": [t: "GLâ „"] # 0x3c5 + - "φ": [T: "GL⠋"] # 0x3c6 + - "ϕ": [T: "GL⠋"] # 0x3c6 + - "χ": [T: "GLâ Ż"] # 0x3c7 + - "ψ": [t: "GLâ œ"] # 0x3c8 + - "ω": [t: "GLâ ș"] # 0x3c9 + + - "Α": [t: "CGL⠁"] # 0x391 + - "Β": [t: "CGL⠃"] # 0x392 + - "Γ": [t: "CGL⠛"] # 0x393 + - "Δ": [t: "CGL⠙"] # 0x394 + - "Ε": [t: "CGL⠑"] # 0x395 + - "Ζ": [t: "CGLâ ”"] # 0x396 + - "Η": [t: "CGLâ ± "] # 0x397 + - "Θ": [t: "CGLâ č"] # 0x398 + - "Ι": [t: "CGL⠊"] # 0x399 + - "Κ": [t: "CGL⠅"] # 0x39a + - "Λ": [t: "CGL⠇"] # 0x39b + - "Μ": [t: "CGL⠍"] # 0x39c + - "Ν": [t: "CGL⠝"] # 0x39d + - "Ξ": [t: "CGLâ ­"] # 0x39e + - "Ο": [t: "CGL⠕"] # 0x39f + - "Π": [t: "CGL⠏"] # 0x3a0 + - "ÎĄ": [t: "CGL⠗"] # 0x3a1 + - "Îą": [t: "CGL⠎"] # 0x3a2 + - "ÎŁ": [t: "CGL⠎"] # 0x3a3 + - "΀": [t: "CGL⠞"] # 0x3a4 + - "΄": [t: "CGLâ „"] # 0x3a5 + - "Ί": [t: "CGL⠋"] # 0x3a6 + - "Χ": [t: "CGLâ Ż"] # 0x3a7 + - "Κ": [t: "CGLâ œ"] # 0x3a8 + - "Ω": [T: "CGLâ ș"] # 0x3a9 + + - "”": [t: "GL⠍"] # 0x00B5 (Micro (Greek mu)) + - "℩": [t: "CGLâ ș"] # 0x2126 (Ohm sign (capital Greek omega)) + - "∆": [t: "CGL⠙"] # 0x2206 (Increment (capital Greek delta)) + - "∏": [t: "CGL⠏"] # 0x220F (Product (capital Greek pi)) + - "∑": [t: "CGL⠎"] # 0x2211 (Sum (capital Greek sigma)) + + +# Not yet defined symbols + - "‰": [T: "⠌⠚⠎⠎"] + - "≊": [T: "⠐⠹⠹⠶"] + - "⋼": [T: "⠣⠮⠜"] # 0x22ee (vertical ellipsis used to indicate dividable) + - "â§”": [T: "â žâ Ą"] + - "∕": [T: "⠐â Č"] + - "⊘": [T: "⠐â Č"] + - "⁄": [T: "⠐â Č"] + - "℃": [T: "⠔⠚⠀⠹⠉"] + - "℉": [T: "⠔⠚⠀⠹⠋"] diff --git a/Rules/Languages/en/unicode.yaml b/Rules/Languages/en/unicode.yaml index 0a6b6b3b8..f9b39fb2e 100644 --- a/Rules/Languages/en/unicode.yaml +++ b/Rules/Languages/en/unicode.yaml @@ -1,534 +1,534 @@ ---- - # Note to translators: - # most languages don't have two ways to pronounce 'a' -- if not need, remove the rules and change "B-Z" to "A-Z" - # some languages say the word for "uppercase" after the letter. Make sure to change that where appropriate by moving some code around - - "a": - - test: - if: "$TTS='none'" - then: [t: "eigh"] # long "a" sound in all speech engines I tested (espeak, MS SAPI, eloquence, - else: [spell: "'a'"] # AWS Polly, ReadSpeaker, NaturalReader, google cloud, nuance, ibm watson) - - "b-z": - - test: - if: "$TTS='none'" - then: [t: "."] - else: [spell: "'.'"] - - # Capital letters are a little tricky: users can pick their favorite word (something that was requested) and - # screen readers have options to use pitch changes or beeps instead of or in addition to say "cap" - # Also, if a user can see the screen, they probably don't need to hear "cap", but if they specified an override, they must want to hear the override. - - - "A": - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [t: "cap"] - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: - - test: - if: "$TTS='none'" - then: [t: "eigh"] - else: [spell: "'a'"] - - - "B-Z": - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [t: "cap"] - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - # note: processing of ranges converts '.' into the character, so it needs to be in quotes below - replace: [spell: "translate('.', 'BCDEFGHIJKLMNOPQRSTUVWXYZ', 'bcdefghijklmnopqrstuvwxyz')"] - - - "0-9": [t: "."] - - - " ": [t: " "] # 0x20 - - - "!": # 0x21 - - test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then_test: - if: "$Verbosity = 'Terse'" - then: [t: "bang"] # 0x21 - else: [t: "exclamation point"] # 0x21 - else: [t: "factorial"] # 0x21 - - - "\"": [t: "quotation mark"] # 0x22 - - "#": [t: "number"] # 0x23 - - "$": [t: "dollars"] # 0x24 - - "%": [t: "percent"] # 0x25 - - "&": [t: "ampersand"] # 0x26 - - "'": [t: "apostrophe"] # 0x27 - - "(": # 0x28 - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then_test: - if: "$Verbosity='Terse'" - then: [t: "open"] # 0x28 - else: [t: "open paren"] # 0x28 - else: [t: "left paren"] # 0x28 - - ")": # 0x29 - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then_test: - if: "$Verbosity='Terse'" - then: [t: "close"] # 0x29 - else: [t: "close paren"] # 0x29 - else: [t: "right paren"] # 0x29 - - - "*": # 0x2a - test: - if: "parent::*[name(.)='msup' or name(.)='msubsup' or name(.)='skip-super']" - then: [t: "star"] # 0x2a - else: [t: "times"] # 0x2a - - "+": [t: "plus"] # 0x2b - - ",": # 0x2c - # the following deals with the interaction of "," with "
" which sometimes wants the ',' to be silent - # that this test is here and not with "
" is not ideal, but seems simplest - test: - if: - - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or " - # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' - # speak "comma" when not adjacent to '
' - - "( following-sibling::*[1][text()!= '
'] and preceding-sibling::*[1][text()!='
'] ) or " - # except if expression starts with '
' - - "../*[1][.='
'] " - then: - - T: "comma" # (en: 'comma', google translation) - - test: - if: "$Verbosity != Terse" - then: [pause: short] - # else silent - - - "-": [t: "minus"] # 0x2d - - ".": # 0x2e - - test: - if: "parent::*[1][self::m:mn]" - then: [t: "point"] - else: [t: "dot"] - - "/": # 0x2f - - test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [t: "slash"] # 0x2f - else: [t: "divided by"] # 0x2f - - - ":": [t: "colon"] # 0x3a - - ";": [t: "semicolon"] # 0x3b - - "<": # 0x3c - - test: - if: "$Verbosity!='Terse'" - then: [t: "is"] - - t: "less than" - - "=": # 0x3d - - test: - if: "$Verbosity!='Terse'" - then: [t: "is equal to"] - else: [t: "equals"] - - - ">": # 0x3e - - test: - if: "$Verbosity!='Terse'" - then: [t: "is"] - - t: "greater than" - - "?": [t: "question mark"] # 0x3f - - "@": [t: "at sign"] # 0x40 - - "[": # 0x5b - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [t: "open bracket"] - else: [t: "left bracket"] - - "\\": [t: "back slash"] # 0x5c - - "]": # 0x5d - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [t: "close bracket"] - else: [t: "right bracket"] - - "^": # 0x5e - - test: - if: "parent::m:modified-variable or parent::m:mover" - then: [t: "hat"] - else: [t: "caret"] - - "_": [t: "under bar"] # 0x5f - - "`": [t: "grave"] # 0x60 - - "{": # 0x7b - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [t: "open brace"] - else: [t: "left brace"] - - "|": # 0x7c - # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' - - with: - variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) - replace: - - test: - - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [t: "vertical line"] - - else_if: "$SpeechStyle != 'ClearSpeak'" - then_test: - - if: "$DefaultToGiven" - then: [t: "given"] - - else_if: "preceding-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))] and - following-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))]" - then: [t: "divides"] - else: [t: "vertical line"] - - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" - then: [t: "vertical line"] - - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" - then: [t: "such that"] - - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" - then: [t: "given"] - - else: [t: "divides"] - - - "}": # 0x7d - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [t: "close brace"] - else: [t: "right brace"] - - - "~": [t: "tilde"] # 0x7e - - " ": # 0xa0 - - test: - # could be mtext in mtd or mtext in an mrow that is a concatenation of mtd's. Is there a better solution? - if: "@data-empty-in-2D and not(ancestor::*[self::m:piecewise or self::m:system-of-equations or self::m:lines])" - then: [t: "empty"] # want to say something for fraction (etc) with empty child - else: [t: ""] - - - "ÂŹ": [t: "not"] # 0xac - - "°": [t: "degrees"] # 0xb0 - - "±": [t: "plus or minus"] # 0xb1 - - "ÂŽ": [t: "acute"] # 0xb4 - - "·": # 0xB7 - - test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')] or not($SpeechStyle = 'ClearSpeak' and $ClearSpeak_MultSymbolDot = 'Auto')" - then: [t: "dot"] - else: [t: "times"] - - "×": # 0xd7 - - test: - if: "$SpeechStyle = 'ClearSpeak'" - then_test: - - if: "$ClearSpeak_MultSymbolX = 'Auto'" - then: [t: "times"] - - else_if: "$ClearSpeak_MultSymbolX = 'By'" - then: [t: "by"] - else: [t: "cross"] - else_test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [t: "cross"] - else: [t: "times"] - - - "Ă·": [t: "divided by"] # 0xf7 - - "̀": [t: "grave accent embellishment"] # 0x300 - - "́": [t: "acute accent embellishment"] # 0x301 - - "̂": [t: "circumflex accent embellishment"] # 0x302 - - "̃": [t: "tilde embellishment"] # 0x303 - - "̄": [t: "macron embellishment"] # 0x304 - - "̅": [t: "overbar embellishment"] # 0x305 - - "̆": [t: "breve"] # 0x306 - - "̇": [t: "dot above embellishment"] # 0x307 - - # Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong - - "Α-Ω": - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [t: "cap"] - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - # note: processing of ranges converts '.' into the character, so it needs to be in quotes below - replace: [spell: "translate('.', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')"] - - - "α": [t: "alpha"] # 0x3b1 - - "ÎČ": [t: "beta"] # 0x3b2 - - "Îł": [t: "gamma"] # 0x3b3 - - "ÎŽ": [t: "delta"] # 0x3b4 - - "Δ": [t: "epsilon"] # 0x3b5 - - "ζ": [t: "zeta"] # 0x3b6 - - "η": [t: "eta"] # 0x3b7 - - "Ξ": [t: "theta"] # 0x3b8 - - "Îč": [t: "iota"] # 0x3b9 - - "Îș": [t: "kappa"] # 0x3ba - - "λ": [t: "lambda"] # 0x3bb - - "ÎŒ": [t: "mu"] # 0x3bc - - "Μ": [t: "nu"] # 0x3bd - - "Ο": [t: "zai"] # 0x3be - - "Îż": [t: "omicron"] # 0x3bf - - "π": [t: "pi"] # 0x3c0 - - "ρ": [t: "rho"] # 0x3c1 - - "ς": [t: "final sigma"] # 0x3c2 - - "σ": [t: "sigma"] # 0x3c3 - - "τ": [t: "tau"] # 0x3c4 - - "υ": [t: "upsilon"] # 0x3c5 - - "φ": [t: "phi"] # 0x3c6 - - "χ": [t: "chi"] # 0x3c7 - - "ψ": [t: "psi"] # 0x3c8 - - "ω": [t: "omega"] # 0x3c9 - - "ϕ": [t: "phi"] # 0x3d5 - - "ϖ": [t: "pi"] # 0x3d6 - - "Ï”": [t: "epsilon"] # 0x3f5 - - "϶": [t: "reversed epsilon"] # 0x3f6 - - - "⁥": # 0x2061 - - test: - # skip saying "of" when Terse and a trig function, when it is a shape (does this happen?), or we are in :literal mode - if: "not( - ( $Verbosity='Terse' or ($SpeechStyle = 'ClearSpeak' and IsNode(following-sibling::*[1],'simple')) and - preceding-sibling::*[1][IfThenElse($SpeechStyle='ClearSpeak', - IsInDefinition(., 'ClearSpeakTrigFunctionNames'), - IsInDefinition(., 'TrigFunctionNames') )] - ) or - preceding-sibling::*[1][IsInDefinition(., 'GeometryShapes')] or - (@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) - )" - then: [t: "of"] - - "⁹": [t: ""] # 0x2062 - - "⁣": [t: ""] # 0x2063 - - "⁀": [t: "and"] # 0x2064 - - "ℂℕℚℝ℀": # here we rely on this running through the table again to speak "cap xxx" - - t: "double-struck" - - spell: "translate('.', 'ℂℕℚℝ℀', 'CNQRZ')" - - - "℃": [t: "degrees celsius"] # 0x2103 - - "ℋℛℓ": # 0x210b - - t: "script" - - spell: "translate('.', 'ℋℛℓ', 'HRl')" - - "ℜ": # 0x211c - - t: "fraktur" - - spell: "'R'" - - - "ⅆⅇⅈⅉ": # 0x2146-9 - - t: "double-struck italic" - - spell: "translate('.', 'ⅆⅇⅈⅉ', 'deij')" - - - "←": [t: "left arrow"] # 0x2190 - - "↑": [t: "up arrow"] # 0x2191 - - "→": # 0x2192 - - test: - if: "ancestor::*[2][self::m:limit]" - then: [t: "approaches"] - else: [t: "right arrow"] - - - "↓": [t: "down arrow"] # 0x2193 - - "∈": # 0x2208 - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: - - test: - if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" - then: [t: "is"] - - t: "an element of" - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "in"] - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "member of"] - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "element of"] - - else: [t: "belonging to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "is a member of"] - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "is an element of"] - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "is in"] - - else: [t: "belongs to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' - - "∄": # 0x2225 - - test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [t: "double vertical line"] - else: - - test: - if: "$Verbosity!='Terse'" - then: [t: "is"] - - t: "parallel to" - - "∊": # 0x2226 - - test: - if: "$Verbosity!='Terse'" - then: [t: "is"] - - t: "not parallel to" - - "≀": # 0x2264 - - test: - if: "$Verbosity!='Terse'" - then: [t: "is"] - - t: "less than or equal to" - - "≄": # 0x2265 - - test: - if: "$Verbosity!='Terse'" - then: [t: "is"] - - t: "greater than or equal to" - - # --- restored complex short definitions (prefer over unicode-full) --- - - "
": # 0x2026 - test: - if: - - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" - # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' - # speak '
' as 'and so on...' unless expr starts with '
' - - "../*[1][.='
']" - then: [t: "dot dot dot"] - else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' - if: "count(following-sibling::*) = 0" - then: [t: "and so on"] - else: [t: "and so on up to"] - - "∂": # 0x2202 - - test: - if: "$Verbosity='Terse'" - then: [t: "partial"] - else: [t: "partial derivative"] - - "∆": # 0x2206 - - test: - if: "$Verbosity!='Terse'" - then: [ot: "the"] - - t: "laplacian of" - - "∉": # 0x2209 - # rule is identical to 0x2208 - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: - - test: - if: "$Verbosity!='Terse'" - then: [t: "is"] - - t: "not an element of" - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "not in"] - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "not member of"] - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "not element of"] - - else: [t: "not belonging to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "is not a member of"] - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "is not an element of"] - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "is not in"] - - else: [t: "does not belong to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' - - "∊": # 0x220a - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: - - test: - if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" - then: [t: "is"] - - t: "an element of" - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "in"] - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "member of"] - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "element of"] - - else: [t: "belonging to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "is a member of"] - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "is an element of"] - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "is in"] - - else: [t: "belongs to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' - - "√": # 0x221a - - test: - if: "$Verbosity!='Terse'" - then: [ot: "the"] - - t: "square root of" - - "∝": # 0x221d - - test: - if: "$Verbosity!='Terse'" - then: [t: "is"] - - t: "proportional to" - - "∶": # 0x2236 - - test: - if: "$Verbosity!='Terse'" - then: [t: "is"] - - t: "to" - - "∟": # 0x223e - - test: - if: "$Verbosity!='Terse'" - then: [t: "is"] - - t: "most positive" - - "≠": # 0x2260 - - test: - if: "$Verbosity!='Terse'" - then: [t: "is"] - - t: "not equal to" - - "≡": # 0x2261 - - test: - if: "$Verbosity!='Terse'" - then: [t: "is"] - - t: "identical to" - - "⊂": # 0x2282 - - test: - if: "$Verbosity!='Terse'" - then: [t: "is a"] - - t: "subset of" - - "⊃": # 0x2283 - - test: - if: "$Verbosity!='Terse'" - then: [t: "is a"] - - t: "superset of" - - "⊄": # 0x2284 - - test: - if: "$Verbosity!='Terse'" - then: [t: "is"] - - t: "not a subset of" - - "⊅": # 0x2285 - - test: - if: "$Verbosity!='Terse'" - then: [t: "is"] - - t: "not a superset of" - - "⊆": # 0x2286 - - test: - if: "$Verbosity!='Terse'" - then: [t: "is a"] - - t: "subset of or equal to" - - "⊇": # 0x2287 - - test: - if: "$Verbosity!='Terse'" - then: [t: "is a"] - - t: "superset of or equal to" - - # --- restored short definitions that differ from unicode-full --- - - "⇒": [t: "right double arrow"] # 0x21d2 - - "∐": [t: "co-product"] # 0x2210 +--- + # Note to translators: + # most languages don't have two ways to pronounce 'a' -- if not need, remove the rules and change "B-Z" to "A-Z" + # some languages say the word for "uppercase" after the letter. Make sure to change that where appropriate by moving some code around + - "a": + - test: + if: "$TTS='none'" + then: [t: "eigh"] # long "a" sound in all speech engines I tested (espeak, MS SAPI, eloquence, + else: [spell: "'a'"] # AWS Polly, ReadSpeaker, NaturalReader, google cloud, nuance, ibm watson) + - "b-z": + - test: + if: "$TTS='none'" + then: [t: "."] + else: [spell: "'.'"] + + # Capital letters are a little tricky: users can pick their favorite word (something that was requested) and + # screen readers have options to use pitch changes or beeps instead of or in addition to say "cap" + # Also, if a user can see the screen, they probably don't need to hear "cap", but if they specified an override, they must want to hear the override. + + - "A": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [t: "cap"] + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: + - test: + if: "$TTS='none'" + then: [t: "eigh"] + else: [spell: "'a'"] + + - "B-Z": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [t: "cap"] + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + # note: processing of ranges converts '.' into the character, so it needs to be in quotes below + replace: [spell: "translate('.', 'BCDEFGHIJKLMNOPQRSTUVWXYZ', 'bcdefghijklmnopqrstuvwxyz')"] + + - "0-9": [t: "."] + + - " ": [t: " "] # 0x20 + + - "!": # 0x21 + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then_test: + if: "$Verbosity = 'Terse'" + then: [t: "bang"] # 0x21 + else: [t: "exclamation point"] # 0x21 + else: [t: "factorial"] # 0x21 + + - "\"": [t: "quotation mark"] # 0x22 + - "#": [t: "number"] # 0x23 + - "$": [t: "dollars"] # 0x24 + - "%": [t: "percent"] # 0x25 + - "&": [t: "ampersand"] # 0x26 + - "'": [t: "apostrophe"] # 0x27 + - "(": # 0x28 + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then_test: + if: "$Verbosity='Terse'" + then: [t: "open"] # 0x28 + else: [t: "open paren"] # 0x28 + else: [t: "left paren"] # 0x28 + - ")": # 0x29 + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then_test: + if: "$Verbosity='Terse'" + then: [t: "close"] # 0x29 + else: [t: "close paren"] # 0x29 + else: [t: "right paren"] # 0x29 + + - "*": # 0x2a + test: + if: "parent::*[name(.)='msup' or name(.)='msubsup' or name(.)='skip-super']" + then: [t: "star"] # 0x2a + else: [t: "times"] # 0x2a + - "+": [t: "plus"] # 0x2b + - ",": # 0x2c + # the following deals with the interaction of "," with "
" which sometimes wants the ',' to be silent + # that this test is here and not with "
" is not ideal, but seems simplest + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or " + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak "comma" when not adjacent to '
' + - "( following-sibling::*[1][text()!= '
'] and preceding-sibling::*[1][text()!='
'] ) or " + # except if expression starts with '
' + - "../*[1][.='
'] " + then: + - T: "comma" # (en: 'comma', google translation) + - test: + if: "$Verbosity != Terse" + then: [pause: short] + # else silent + + - "-": [t: "minus"] # 0x2d + - ".": # 0x2e + - test: + if: "parent::*[1][self::m:mn]" + then: [t: "point"] + else: [t: "dot"] + - "/": # 0x2f + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [t: "slash"] # 0x2f + else: [t: "divided by"] # 0x2f + + - ":": [t: "colon"] # 0x3a + - ";": [t: "semicolon"] # 0x3b + - "<": # 0x3c + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "less than" + - "=": # 0x3d + - test: + if: "$Verbosity!='Terse'" + then: [t: "is equal to"] + else: [t: "equals"] + + - ">": # 0x3e + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "greater than" + - "?": [t: "question mark"] # 0x3f + - "@": [t: "at sign"] # 0x40 + - "[": # 0x5b + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [t: "open bracket"] + else: [t: "left bracket"] + - "\\": [t: "back slash"] # 0x5c + - "]": # 0x5d + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [t: "close bracket"] + else: [t: "right bracket"] + - "^": # 0x5e + - test: + if: "parent::m:modified-variable or parent::m:mover" + then: [t: "hat"] + else: [t: "caret"] + - "_": [t: "under bar"] # 0x5f + - "`": [t: "grave"] # 0x60 + - "{": # 0x7b + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [t: "open brace"] + else: [t: "left brace"] + - "|": # 0x7c + # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' + - with: + variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) + replace: + - test: + - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [t: "vertical line"] + - else_if: "$SpeechStyle != 'ClearSpeak'" + then_test: + - if: "$DefaultToGiven" + then: [t: "given"] + - else_if: "preceding-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))] and + following-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))]" + then: [t: "divides"] + else: [t: "vertical line"] + - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" + then: [t: "vertical line"] + - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" + then: [t: "such that"] + - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" + then: [t: "given"] + - else: [t: "divides"] + + - "}": # 0x7d + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [t: "close brace"] + else: [t: "right brace"] + + - "~": [t: "tilde"] # 0x7e + - " ": # 0xa0 + - test: + # could be mtext in mtd or mtext in an mrow that is a concatenation of mtd's. Is there a better solution? + if: "@data-empty-in-2D and not(ancestor::*[self::m:piecewise or self::m:system-of-equations or self::m:lines])" + then: [t: "empty"] # want to say something for fraction (etc) with empty child + else: [t: ""] + + - "ÂŹ": [t: "not"] # 0xac + - "°": [t: "degrees"] # 0xb0 + - "±": [t: "plus or minus"] # 0xb1 + - "ÂŽ": [t: "acute"] # 0xb4 + - "·": # 0xB7 + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')] or not($SpeechStyle = 'ClearSpeak' and $ClearSpeak_MultSymbolDot = 'Auto')" + then: [t: "dot"] + else: [t: "times"] + - "×": # 0xd7 + - test: + if: "$SpeechStyle = 'ClearSpeak'" + then_test: + - if: "$ClearSpeak_MultSymbolX = 'Auto'" + then: [t: "times"] + - else_if: "$ClearSpeak_MultSymbolX = 'By'" + then: [t: "by"] + else: [t: "cross"] + else_test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [t: "cross"] + else: [t: "times"] + + - "Ă·": [t: "divided by"] # 0xf7 + - "̀": [t: "grave accent embellishment"] # 0x300 + - "́": [t: "acute accent embellishment"] # 0x301 + - "̂": [t: "circumflex accent embellishment"] # 0x302 + - "̃": [t: "tilde embellishment"] # 0x303 + - "̄": [t: "macron embellishment"] # 0x304 + - "̅": [t: "overbar embellishment"] # 0x305 + - "̆": [t: "breve"] # 0x306 + - "̇": [t: "dot above embellishment"] # 0x307 + + # Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong + - "Α-Ω": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [t: "cap"] + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + # note: processing of ranges converts '.' into the character, so it needs to be in quotes below + replace: [spell: "translate('.', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')"] + + - "α": [t: "alpha"] # 0x3b1 + - "ÎČ": [t: "beta"] # 0x3b2 + - "Îł": [t: "gamma"] # 0x3b3 + - "ÎŽ": [t: "delta"] # 0x3b4 + - "Δ": [t: "epsilon"] # 0x3b5 + - "ζ": [t: "zeta"] # 0x3b6 + - "η": [t: "eta"] # 0x3b7 + - "Ξ": [t: "theta"] # 0x3b8 + - "Îč": [t: "iota"] # 0x3b9 + - "Îș": [t: "kappa"] # 0x3ba + - "λ": [t: "lambda"] # 0x3bb + - "ÎŒ": [t: "mu"] # 0x3bc + - "Μ": [t: "nu"] # 0x3bd + - "Ο": [t: "zai"] # 0x3be + - "Îż": [t: "omicron"] # 0x3bf + - "π": [t: "pi"] # 0x3c0 + - "ρ": [t: "rho"] # 0x3c1 + - "ς": [t: "final sigma"] # 0x3c2 + - "σ": [t: "sigma"] # 0x3c3 + - "τ": [t: "tau"] # 0x3c4 + - "υ": [t: "upsilon"] # 0x3c5 + - "φ": [t: "phi"] # 0x3c6 + - "χ": [t: "chi"] # 0x3c7 + - "ψ": [t: "psi"] # 0x3c8 + - "ω": [t: "omega"] # 0x3c9 + - "ϕ": [t: "phi"] # 0x3d5 + - "ϖ": [t: "pi"] # 0x3d6 + - "Ï”": [t: "epsilon"] # 0x3f5 + - "϶": [t: "reversed epsilon"] # 0x3f6 + + - "⁥": # 0x2061 + - test: + # skip saying "of" when Terse and a trig function, when it is a shape (does this happen?), or we are in :literal mode + if: "not( + ( $Verbosity='Terse' or ($SpeechStyle = 'ClearSpeak' and IsNode(following-sibling::*[1],'simple')) and + preceding-sibling::*[1][IfThenElse($SpeechStyle='ClearSpeak', + IsInDefinition(., 'ClearSpeakTrigFunctionNames'), + IsInDefinition(., 'TrigFunctionNames') )] + ) or + preceding-sibling::*[1][IsInDefinition(., 'GeometryShapes')] or + (@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) + )" + then: [t: "of"] + - "⁹": [t: ""] # 0x2062 + - "⁣": [t: ""] # 0x2063 + - "⁀": [t: "and"] # 0x2064 + - "ℂℕℚℝ℀": # here we rely on this running through the table again to speak "cap xxx" + - t: "double-struck" + - spell: "translate('.', 'ℂℕℚℝ℀', 'CNQRZ')" + + - "℃": [t: "degrees celsius"] # 0x2103 + - "ℋℛℓ": # 0x210b + - t: "script" + - spell: "translate('.', 'ℋℛℓ', 'HRl')" + - "ℜ": # 0x211c + - t: "fraktur" + - spell: "'R'" + + - "ⅆⅇⅈⅉ": # 0x2146-9 + - t: "double-struck italic" + - spell: "translate('.', 'ⅆⅇⅈⅉ', 'deij')" + + - "←": [t: "left arrow"] # 0x2190 + - "↑": [t: "up arrow"] # 0x2191 + - "→": # 0x2192 + - test: + if: "ancestor::*[2][self::m:limit]" + then: [t: "approaches"] + else: [t: "right arrow"] + + - "↓": [t: "down arrow"] # 0x2193 + - "∈": # 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: + - test: + if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" + then: [t: "is"] + - t: "an element of" + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [t: "in"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [t: "member of"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [t: "element of"] + - else: [t: "belonging to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [t: "is a member of"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [t: "is an element of"] + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [t: "is in"] + - else: [t: "belongs to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + - "∄": # 0x2225 + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [t: "double vertical line"] + else: + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "parallel to" + - "∊": # 0x2226 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "not parallel to" + - "≀": # 0x2264 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "less than or equal to" + - "≄": # 0x2265 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "greater than or equal to" + + # --- restored complex short definitions (prefer over unicode-full) --- + - "
": # 0x2026 + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak '
' as 'and so on...' unless expr starts with '
' + - "../*[1][.='
']" + then: [t: "dot dot dot"] + else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' + if: "count(following-sibling::*) = 0" + then: [t: "and so on"] + else: [t: "and so on up to"] + - "∂": # 0x2202 + - test: + if: "$Verbosity='Terse'" + then: [t: "partial"] + else: [t: "partial derivative"] + - "∆": # 0x2206 + - test: + if: "$Verbosity!='Terse'" + then: [ot: "the"] + - t: "laplacian of" + - "∉": # 0x2209 + # rule is identical to 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "not an element of" + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [t: "not in"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [t: "not member of"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [t: "not element of"] + - else: [t: "not belonging to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [t: "is not a member of"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [t: "is not an element of"] + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [t: "is not in"] + - else: [t: "does not belong to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + - "∊": # 0x220a + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: + - test: + if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" + then: [t: "is"] + - t: "an element of" + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [t: "in"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [t: "member of"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [t: "element of"] + - else: [t: "belonging to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [t: "is a member of"] + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [t: "is an element of"] + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [t: "is in"] + - else: [t: "belongs to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' + - "√": # 0x221a + - test: + if: "$Verbosity!='Terse'" + then: [ot: "the"] + - t: "square root of" + - "∝": # 0x221d + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "proportional to" + - "∶": # 0x2236 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "to" + - "∟": # 0x223e + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "most positive" + - "≠": # 0x2260 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "not equal to" + - "≡": # 0x2261 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "identical to" + - "⊂": # 0x2282 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is a"] + - t: "subset of" + - "⊃": # 0x2283 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is a"] + - t: "superset of" + - "⊄": # 0x2284 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "not a subset of" + - "⊅": # 0x2285 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "not a superset of" + - "⊆": # 0x2286 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is a"] + - t: "subset of or equal to" + - "⊇": # 0x2287 + - test: + if: "$Verbosity!='Terse'" + then: [t: "is a"] + - t: "superset of or equal to" + + # --- restored short definitions that differ from unicode-full --- + - "⇒": [t: "right double arrow"] # 0x21d2 + - "∐": [t: "co-product"] # 0x2210 diff --git a/Rules/Languages/es/unicode-full.yaml b/Rules/Languages/es/unicode-full.yaml index 603fc3a85..23d453e29 100644 --- a/Rules/Languages/es/unicode-full.yaml +++ b/Rules/Languages/es/unicode-full.yaml @@ -1,3401 +1,3401 @@ ---- - - - "€": [T: "moneda"] # 0xa4 (en: 'currency sign') - - "„": [T: "yen"] # 0xa5 - - "Š": [T: "barra vertical partida"] # 0xa6 (en: 'broken bar') - - "§": [T: "secciĂłn"] # 0xa7 (en: 'section') - - "š": [T: "diĂ©resis"] # 0xa8 (en: 'double dot') - - "©": [T: "copyright"] # 0xa9 - - "ÂȘ": [T: "ordinal femenino"] # 0xaa (en: 'feminine ordinal indicator') - - "«": [T: "abrir comillas angulare"] # 0xab (en: 'left-pointing double angle quote mark', MathPlayer: 'abre comillas angulares', google: 'marca de cotizaciĂłn de doble ĂĄngulo de punta izquierda') - - "ÂŻ": # 0xaf - - test: - if: "ancestor::m:modified-variable and preceding-sibling::*[1][self::m:mi]" - then: [T: "barra"] # (google translation) - else: [T: "barra"] # (en: 'line') - - "ÂČ": [T: "al cuadrado"] # 0xb2 (en: 'two', MathPlayer: 'super 2', google: 'dos') - - "Âł": [T: "al cubo"] # 0xb3 (en: 'three', MathPlayer: 'super 3', google: 'tres') - - "”": [T: "micro"] # 0xb5 - - "Âč": [T: "super 1"] # 0xb9 (en: 'one', google: 'uno') - - "Âș": [T: "ordinal masculino"] # 0xb9 (en: 'masculine ordinal indicator') - - "ʰ": [T: "modificador pequeño h"] # 0x2b0 (en: 'modifier small h', google translation) - - "ʱ": [T: "modificador pequeño h con gancho"] # 0x2b1 (en: 'modifier small h with hook', google translation) - - "ÊČ": [T: "modificador pequeño j"] # 0x2b2 (en: 'modifier small j', google translation) - - "Êł": [T: "modificador pequeño r"] # 0x2b3 (en: 'modifier small r', google translation) - - "ÊŽ": [T: "modificador pequeño girado r"] # 0x2b4 (en: 'modifier small turned r', google translation) - - "Ê”": [T: "modificador pequeño girado r con gancho"] # 0x2b5 (en: 'modifier small turned r with hook', google translation) - - "ʶ": # 0x2b6 - - T: "modificador pequeño invertido" # (en: 'modifier small inverted', google translation) - - spell: "translate('R', 'R', 'R')" - - - "Ê·": [T: "modificador pequeño w"] # 0x2b7 (en: 'modifier small w', google translation) - - "Êž": [T: "modificador pequeño y"] # 0x2b8 (en: 'modifier small y', google translation) - - "Êč": [T: "prima"] # 0x2b9 (en: 'modifier prime', google: 'modificador prime') - - "Êș": [T: "dos prima"] # 0x2ba (en: 'modifier double prime', google: 'modificador doble prime') - - "Ê»": [T: "modificador girado por coma"] # 0x2bb (en: 'modifier turned comma', google translation) - - "ÊŒ": [T: "apĂłstrofo modificador"] # 0x2bc (en: 'modifier apostrophe', google translation) - - "Êœ": [T: "modificador de coma invertida"] # 0x2bd (en: 'modifier reversed comma', google translation) - - "ÊŸ": [T: "semianillo a la derecha"] # 0x2be (en: 'modifier right half ring', google: 'modificador de medio anillo derecho') - - "Êż": [T: "semianillo a la izquierda"] # 0x2bf (en: 'modifier left half ring', google: 'modificador de medio anillo izquierdo') - - "ˀ": [T: "modificador de parada glĂłtica"] # 0x2c0 (en: 'modifier glottal stop', google translation) - - "ˁ": [T: "modificador invertido de parada glĂłtica"] # 0x2c1 (en: 'modifier reversed glottal stop', google translation) - - "˂": [T: "modificador de punta de flecha izquierda"] # 0x2c2 (en: 'modifier left arrowhead', google translation) - - "˃": [T: "modificador de punta de flecha derecha"] # 0x2c3 (en: 'modifier right arrowhead', google translation) - - "˄": [T: "modificador de punta de flecha hacia arriba"] # 0x2c4 (en: 'modifier up arrowhead', google translation) - - "˅": [T: "modificador de punta de flecha hacia abajo"] # 0x2c5 (en: 'modifier down arrowhead', google translation) - - "ˆ": [T: "circunflejo"] # 0x2c6 (en: 'modifier circumflex accent', google: 'acento circunflejo modificador') - - "ˇ": [T: "carĂłn"] # 0x2c7 (en: 'caron', google: 'caron') - - "ˈ": [T: "lĂ­nea vertical modificador"] # 0x2c8 (en: 'modifier vertical line', google translation) - - "ˉ": [T: "modificador macron"] # 0x2c9 (en: 'modifier macron', google translation) - - "ˊ": [T: "modificador acento agudo"] # 0x2ca (en: 'modifier acute accent', google translation) - - "ˋ": [T: "modificador acento grave"] # 0x2cb (en: 'modifier grave accent', google translation) - - "ˌ": [T: "modificador lĂ­nea baja vertical"] # 0x2cc (en: 'modifier low vertical line', google translation) - - "ˍ": [T: "modificador bajo macron"] # 0x2cd (en: 'modifier low macron', google translation) - - "ˎ": [T: "modificador acento acento grave bajo"] # 0x2ce (en: 'modifier low grave accent', google translation) - - "ˏ": [T: "modificador acento bajo agudo"] # 0x2cf (en: 'modifier low acute accent', google translation) - - "ː": [T: "modificador de colon triangular"] # 0x2d0 (en: 'modifier triangular colon', google translation) - - "ˑ": [T: "modificador de medio colon triangular"] # 0x2d1 (en: 'modifier half triangular colon', google translation) - - "˒": [T: "modificador centrado en la mitad del anillo rerecho"] # 0x2d2 (en: 'modifier centered right half ring', google translation) - - "˓": [T: "modificador centrado en la mitad del anillo izquierdo"] # 0x2d3 (en: 'modifier centered left half ring', google translation) - - "˔": [T: "modificador de tadck superior"] # 0x2d4 (en: 'modifier up tadck', google translation) - - "˕": [T: "modificador hacia abajo"] # 0x2d5 (en: 'modifier down tack', google translation) - - "˖": [T: "modificador mĂĄs signo"] # 0x2d6 (en: 'modifier plus sign', google translation) - - "˗": [T: "medio anillo derecho por debajo de la ornamentaciĂłn"] # 0x339 (en: 'right half ring below embellishment', google translation) - - "Ìș": [T: "puente invertido debajo de la ornamentaciĂłn"] # 0x33a (en: 'inverted bridge below embellishment', google translation) - - "Ì»": [T: "cuadrado por debajo de la ornamentaciĂłn"] # 0x33b (en: 'square below embellishment', google translation) - - "ÌŒ": [T: "gaviota por debajo del adorno"] # 0x33c (en: 'seagull below embellishment', google translation) - - "Ìœ": [T: "x por encima del adorno"] # 0x33d (en: 'x above embellishment', google translation) - - "ÌŸ": [T: "ornamentaciĂłn de tilde vertical"] # 0x33e (en: 'vertical tilde embellishment', google translation) - - "Ìż": [T: "ornamentaciĂłn de doble superposiciĂłn"] # 0x33f (en: 'double overline embellishment', google translation) - - "̀": [T: "ornamentaciĂłn de la señal de tono grave"] # 0x340 (en: 'grave tone mark embellishment', google translation) - - "́": [T: "ornamentaciĂłn de la señal de tono agudo"] # 0x341 (en: 'acute tone mark embellishment', google translation) - - - "ÎȘΫϏ": # 0x3aa, 0x3ab, 0x3cf - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "mayĂșscula"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [spell: "translate('.', 'ÎȘΫϏ', 'Îčυϗ')"] - - T: "con dialytika" # (en: 'with dialytika', google translation) - - "ϊ": [T: "iota con dialytika"] # 0x3ca (en: 'iota with dialytika', google translation) - - "ϋ": [T: "Ă©psilon con dialytika"] # 0x3cb (en: 'upsilon with dialytika', google translation) - - "ό": [T: "Ăłmicron con tonos"] # 0x3cc (en: 'omicron with tonos', google translation) - - "ύ": [T: "Ă©psilon con tonos"] # 0x3cd (en: 'upsilon with tonos', google translation) - - "ώ": [T: "omega con tonos"] # 0x3ce (en: 'omega with tonos', google translation) - - "ϐ": [T: "sĂ­mbolo beta"] # 0x3d0 (en: 'beta') - - "ϑ": [T: "variante de theta"] # 0x3d1 (en: 'theta', google: 'theta') - - "ϒ": [T: "Ă­psilon con gancho"] # 0x3d2 (en: 'upsilon with hook', google: 'upsilon con gancho') - - "ϓ": [T: "Ă©psilon con diĂ©resis y gancho"] # 0x3d4 (en: 'upsilon with diaeresis and hook', google translation) - - "ϗ": [T: "sĂ­mbolo kai griego"] # 0x3d7 (en: 'kai') - - "А-ĐŻ": # 0x410 - 0x42f - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "mayĂșscula"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [spell: "translate('.', 'ĐĐ‘Đ’Đ“Đ”Đ•Đ–Đ—Đ˜Đ™ĐšĐ›ĐœĐĐžĐŸĐ ĐĄĐąĐŁĐ€Đ„ĐŠĐ§ĐšĐ©ĐȘЫЏЭПЯ', 'абĐČгЎДжзОĐčĐșĐ»ĐŒĐœĐŸĐżŃ€ŃŃ‚ŃƒŃ„Ń…Ń†Ń‡ŃˆŃ‰ŃŠŃ‹ŃŒŃŃŽŃ')"] - - "а": [T: "a"] # 0x430 (google: 'а') - - "б": [T: "be"] # 0x431 (google: 'ser') - - "ĐČ": [T: "ve"] # 0x432 (google: 'veinte') - - "Đł": [T: "ghe"] # 0x433 - - "ĐŽ": [T: "de"] # 0x434 (google: 'delaware') - - "Đ”": [T: "ie"] # 0x435 (google: 'es decir') - - "ж": [T: "zhe"] # 0x436 - - "Đ·": [T: "i"] # 0x438 (google: 'Đž') - - "Đč": [T: "i corta"] # 0x439 (en: 'short i', google: 'corto i') - - "Đș": [T: "ka"] # 0x43a - - "Đ»": [T: "em"] # 0x43c - - "Đœ": [T: "o"] # 0x43e (google: 'ĐŸ') - - "Đż": [T: "pe"] # 0x43f (google: 'educaciĂłn fĂ­sica') - - "р": [T: "er"] # 0x440 - - "с": [T: "es"] # 0x441 - - "т": [T: "te"] # 0x442 - - "у": [T: "u"] # 0x443 (google: 'у') - - "ф": [T: "ef"] # 0x444 - - "х": [T: "ha"] # 0x445 (google: 'ja') - - "ц": [T: "tse"] # 0x446 - - "ч": [T: "che"] # 0x447 - - "ш": [T: "sha"] # 0x448 - - "щ": [T: "shcha"] # 0x449 - - "ъ": [T: "signo duro"] # 0x44a (en: 'hard sign') - - "ы": [T: "yeru"] # 0x44b - - "ь": [T: "signo suave"] # 0x44c (en: 'soft sign') - - "э": [T: "e"] # 0x44d (google: 'э') - - "ю": [T: "yu"] # 0x44e - - "я": [T: "ya"] # 0x44f - - "‐": [T: "menos"] # 0x2010 (en: 'hyphen') - - "‑": [T: "guiĂłn indivisible"] # 0x2011 (en: 'hyphen', google: 'guiĂłn') - - "‒": [T: "figura Dash"] # 0x2012 (en: 'figure dash', google: 'figura dash') - - "―": [T: "barra horizontal"] # 0x2015 (en: 'horizontal bar') - - "‱": # 0x2022 - - test: - if: "@data-chem-formula-op" - then: [T: "punto"] # (en: 'dot', google translation) - else: [T: "bala"] # (en: 'bullet') - - - "‰": [T: "tanto por millar"] # 0x2030 (en: 'per mille') - - "‱": [T: "tanto por diez mil"] # 0x2031 (en: 'per ten thousand') - - "â€Č": [T: "prima"] # 0x2032 (en: 'prime') - - "‾": [T: "signo de intercalaciĂłn"] # 0x2038 (en: 'to the', google: 'hacia') - - "â€č": [T: "comillas izquierda"] # 0x2039 (en: 'single left pointing angle quote mark', MathPlayer: 'abre comillas', google: 'marque de cotizaciĂłn de ĂĄngulo de punta individual izquierdo') - - "â€ș": [T: "comillas derecha"] # 0x203a (en: 'single right pointing angle quote mark', MathPlayer: 'cierra comillas', google: 'marque de cita de ĂĄngulo de punta de la derecha Ășnica') - - "‌": [T: "doble signo de exclamaciĂłn"] # 0x203c (en: 'double factorial', google: 'doble factorial') - - "⁄": [T: "barra de fracciĂłn"] # 0x2044 (en: 'divided by') - - "⁅": [T: "corchete izquierdo"] # 0x2045 (en: 'left square bracket with quill') - - "⁆": [T: "corchete derecho"] # 0x2046 (en: 'right square bracket with quill') - - "⁗": [T: "cuatro prima"] # 0x2057 (en: 'quadruple prime', MathPlayer: 'cuarta', google: 'prime cuĂĄdruple') - - "⁠": [T: ""] # 0x2060 - - "⁣": [T: ""] # 0x2063 - - "⁀": [T: "mĂĄs"] # 0x2064 (en: 'and', google: 'y') - - "⁰": [T: "a la potencia de cero"] # 0x2070 (en: 'to the zeroth power', google translation) - - "ⁱ": [T: "superĂ­ndice i"] # 0x2071 (en: 'to the eihth power', google: 'al poder eihth') - - "⁎": [T: "a la cuarta potencia"] # 0x2074 (en: 'to the fourth power', google translation) - - "⁔": [T: "a la quinta potencia"] # 0x2075 (en: 'to the fifth power', google translation) - - "⁶": [T: "a la sexta potencia"] # 0x2076 (en: 'to the sixth power', google translation) - - "⁷": [T: "a la sĂ©ptima potencia"] # 0x2077 (en: 'to the seventh power', google translation) - - "⁞": [T: "a la octava potencia"] # 0x2078 (en: 'to the eighth power', google translation) - - "âč": [T: "a la novena potencia"] # 0x2079 (en: 'to the ninth power', google translation) - - "âș": [T: "superĂ­ndice signo mĂĄs"] # 0x207a (en: 'superscript plus sign', google: 'superscript plus sign') - - "⁻": [T: "superĂ­ndice menos"] # 0x207b (en: 'superscript minus', google: 'superscript menos') - - "⁌": [T: "superĂ­ndice signo igual"] # 0x207c (en: 'superscript equals sign', google: 'superscript es igual a signo') - - "⁜": [T: "parĂ©ntesis izquierdo superĂ­ndice"] # 0x207d (en: 'superscript left parenthesis', google: 'superscript dejĂł parĂ©ntesis') - - " ": [T: "parĂ©ntesis derecho superĂ­ndice"] # 0x207e (en: 'superscript right parenthesis', google: 'superscript direcciĂłn de entrega de parĂ©ntesis') - - "ⁿ": [T: "superĂ­ndice n"] # 0x207f (en: 'to the ennth power', google: 'al poder de enth') - - "₀": [T: "bajo cero"] # 0x2080 (en: 'sub zero', google translation) - - "₁": [T: "sub uno"] # 0x2081 (en: 'sub one', google translation) - - "₂": [T: "sub dos"] # 0x2082 (en: 'sub two', google translation) - - "₃": [T: "sub tres"] # 0x2083 (en: 'sub three', google translation) - - "₄": [T: "sub cuatro"] # 0x2084 (en: 'sub four', google translation) - - "₅": [T: "sub cinco"] # 0x2085 (en: 'sub five', google translation) - - "₆": [T: "sub seis"] # 0x2086 (en: 'sub six', google translation) - - "₇": [T: "sub siete"] # 0x2087 (en: 'sub seven', google translation) - - "₈": [T: "sub ocho"] # 0x2088 (en: 'sub eight', google translation) - - "₉": [T: "sub nueve"] # 0x2089 (en: 'sub nine', google translation) - - "₊": [T: "subĂ­ndice signo mĂĄs"] # 0x208a (en: 'subscript plus sign', google: 'subscript plus sign') - - "₋": [T: "subĂ­ndice menos"] # 0x208b (en: 'subscript minus sign', google: 'subĂ­ndico menos signo') - - "₌": [T: "subĂ­ndice signo igual"] # 0x208c (en: 'subscript equals sign', google: 'el subĂ­ndice es igual al signo') - - "₍": [T: "subĂ­ndice parĂ©ntesis derecho"] # 0x208e (en: 'subscript right parenthesis', google: 'subĂ­ndice de parĂ©ntesis derecha') - - "ₐ": [T: "subĂ­ndice a"] # 0x2090 (en: 'sub A', google: 'sub a') - - "ₑ": [T: "subĂ­ndice e"] # 0x2091 (en: 'sub E', google: 'sub e') - - "ₒ": [T: "subĂ­ndice o"] # 0x2092 (en: 'sub O', google: 'sub o') - - "ₓ": [T: "subĂ­ndice x"] # 0x2093 (en: 'sub X', google: 'sub x') - - "ₕ": [T: "subĂ­ndice h"] # 0x2095 (en: 'sub H', google: 'sub h') - - "ₖ": [T: "subĂ­ndice k"] # 0x2096 (en: 'sub K', google: 'sub k') - - "ₗ": [T: "subĂ­ndice l"] # 0x2097 (en: 'sub L', google: 'sub l') - - "ₘ": [T: "subĂ­ndice m"] # 0x2098 (en: 'sub M', google: 'sub m') - - "ₙ": [T: "subĂ­ndice n"] # 0x2099 (en: 'sub N', google: 'sub n') - - "ₚ": [T: "subĂ­ndice p"] # 0x209a (en: 'sub P', google: 'sub p') - - "ₛ": [T: "subĂ­ndice s"] # 0x209b (en: 'sub S', google: 'sub s') - - "ₜ": [T: "subĂ­ndice t"] # 0x209c (en: 'sub T', google: 'sub t') - - "₠": [T: "unidades de corriente europeas"] # 0x20a0 (en: 'european currenty units', google translation) - - "₡": [T: "dos puntos"] # 0x20a1 (en: 'colons', google: 'colons') - - "₱": [T: "cruzeiro"] # 0x20a2 (en: 'cruzeiro', google: 'cruzeiro') - - "₣": [T: "franco"] # 0x20a3 (en: 'franc') - - "â‚€": [T: "lira"] # 0x20a4 - - "â‚„": [T: "molinos"] # 0x20a5 (en: 'mills') - - "₩": [T: "naira"] # 0x20a6 - - "₧": [T: "peseta"] # 0x20a7 - - "₹": [T: "rupia"] # 0x20a8 (en: 'rupees', google: 'rupias') - - "₩": [T: "won"] # 0x20a9 (google: 'ganado') - - "â‚Ș": [T: "nuevo sheqel"] # 0x20aa (en: 'new sheqels', google: 'nuevo sheqels') - - "₫": [T: "dong"] # 0x20ab (google: 'polla') - - "€": [T: "euro"] # 0x20ac (en: 'euros', google: 'euros') - - "₭": [T: "kip"] # 0x20ad (google: 'dormir') - - "₼": [T: "tugrik"] # 0x20ae - - "₯": [T: "dracma"] # 0x20af (en: 'drachma') - - "₰": [T: "penique alemĂĄn"] # 0x20b0 (en: 'german pennies', google: 'centavos alemanes') - - "₱": [T: "peso"] # 0x20b1 (en: 'pesos', google: 'pesos') - - "â‚Č": [T: "guaranĂ­es"] # 0x20b2 (en: 'guaranis', google translation) - - "₳": [T: "australs"] # 0x20b3 (google translation) - - "₮": [T: "hryvnias"] # 0x20b4 (google translation) - - "â‚”": [T: "cedis"] # 0x20b5 (google translation) - - "₶": [T: "livre tournois"] # 0x20b6 (google translation) - - "₷": [T: "spesmilos"] # 0x20b7 (google translation) - - "₾": [T: "tenges"] # 0x20b8 (google translation) - - "â‚č": [T: "rupias indias"] # 0x20b9 (en: 'indian rupees', google translation) - - "â‚ș": [T: "liras turcas"] # 0x20ba (en: 'turkish liras', google translation) - - "⃐": [T: "arpĂłn izquierdo por encima de la ornamentaciĂłn"] # 0x20d0 (en: 'left harpoon above embellishment', google: 'arpĂłn de izquierda por encima del adorno') - - "⃑": [T: "arpĂłn derecho por encima de la ornamentaciĂłn"] # 0x20d1 (en: 'right harpoon above embellishment', google: 'arpĂłn derecho por encima del adorno') - - "⃒": [T: "lĂ­nea vertical larga con ornamentaciĂłn superpuesta"] # 0x20d2 (en: 'long vertical line overlay embellishment', google translation) - - "⃓": [T: "lĂ­nea vertical corta con ornamentaciĂłn superpuesta"] # 0x20d3 (en: 'short vertical line overlay embellishment', google translation) - - "⃔": [T: "flecha en sentido contrario a las agujas del reloj por encima de la ornamentaciĂłn"] # 0x20d4 (en: 'anticlockwise arrow above embellishment', google translation) - - "⃕": [T: "flecha en el sentido de las agujas del reloj por encima de la ornamentaciĂłn"] # 0x20d5 (en: 'clockwise arrow above embellishment', google translation) - - "⃖": [T: "flecha izquierda por encima de la ornamentaciĂłn"] # 0x20d6 (en: 'left arrow above embellishment', google: 'flecha izquierda por encima del adorno') - - "⃗": [T: "flecha derecha por encima de la ornamentaciĂłn"] # 0x20d7 (en: 'right arrow above embellishment', google: 'flecha derecha por encima del adorno') - - "⃘": [T: "ornamentaciĂłn superpuesta al anillo"] # 0x20d8 (en: 'ring overlay embellishment', google translation) - - "⃙": [T: "anillo en el sentido de las agujas del reloj con ornamentaciĂłn superpuesta"] # 0x20d9 (en: 'clockwise ring overlay embellishment', google translation) - - "⃚": [T: "anilo en sentido contrario a las agujas del reloj con ornamentaciĂłn superpuesta"] # 0x20da (en: 'anticlockwise ring overlay embellishment', google translation) - - "⃛": [T: "tres puntos"] # 0x20db (en: 'triple dot', google: 'triple punto') - - "⃜": [T: "cuatro puntos "] # 0x20dc (en: 'quadruple dot', google: 'punto cuĂĄdruple') - - "⃝": [T: "ornamentaciĂłn de cĂ­rculo envolvente"] # 0x20dd (en: 'enclosing circle embellishment', google translation) - - "⃞": [T: "ornamentaciĂłn de cuadrado envolvente"] # 0x20de (en: 'enclosing square embellishment', google translation) - - "⃟": [T: "ornamentaciĂłn de rombo envolvente"] # 0x20df (en: 'enclosing diamond embellishment', google translation) - - "⃠": [T: "ornamentaciĂłn con bara inversa de cĂ­rculo envolvente"] # 0x20e0 (en: 'enclosing circle backslash embellishment', google translation) - - "⃥": [T: "doble flecha por encima de la ornamentaciĂłn"] # 0x20e1 (en: 'left right arrow above embellishment', google: 'flecha derecha izquierda por encima del adorno') - - "⃹": [T: "ornamentaciĂłn de pantalla envolvente"] # 0x20e2 (en: 'enclosing screen embellishment', google translation) - - "⃣": [T: "ornamentaciĂłn de clave envolvente"] # 0x20e3 (en: 'enclosing keycap embellishment', google translation) - - "⃀": [T: "ornamentaciĂłn de triĂĄngulo envolvente apuntando hacia arriba"] # 0x20e4 (en: 'enclosing upward pointing triangle embellishment', google translation) - - "⃄": [T: "solidus invertido con ornamentaciĂłn superpuesta"] # 0x20e5 (en: 'reverse solidus overlay embellishment', google translation) - - "⃊": [T: "doble vĂ©rtice con ornamentaciĂłn de trazo"] # 0x20e6 (en: 'double verticle stroke embellishment', google translation) - - "⃧": [T: "sĂ­mbolo de anualidad con ornamentaciĂłn"] # 0x20e7 (en: 'annuity symbol embellishment', google translation) - - "⃚": [T: "triple punto bajo"] # 0x20e8 (en: 'triple underdot', google translation) - - "⃩": [T: "amplio puente por encima de la ornamentaciĂłn"] # 0x20e9 (en: 'wide bridge above embellishment', google translation) - - "âƒȘ": [T: "flecha izquierda con ornamentaciĂłn superpuesta"] # 0x20ea (en: 'leftwards arrow overlay embellishment', google translation) - - "⃫": [T: "largo y doble solidus con ornamentaciĂłn superpuesta"] # 0x20eb (en: 'long double solidus overlay embellishment', google translation) - - "⃏": [T: "arpĂłn hacia la derecha con ornamentaciĂłn apuntando hacia abajo"] # 0x20ec (en: 'rightwards harpoon with barb downwards embellishment', google translation) - - "⃭": [T: "arpĂłn hacia la izquierda con ornamentaciĂłn apuntando hacia abajo"] # 0x20ed (en: 'leftwards harpoon with barb downwards embellishment', google translation) - - "⃟": [T: "flecha izquierda por debajo de la ornamentaciĂłn"] # 0x20ee (en: 'left arrow below embellishment', google translation) - - "⃯": [T: "flecha derecha por debajo de la ornamentaciĂłn"] # 0x20ef (en: 'right arrow below embellishment', google translation) - - "⃰": [T: "asterisco por encima de la ornamentaciĂłn"] # 0x20f0 (en: 'asterisk above embellishment', google translation) - - "℄": [T: "sĂ­mbolo de lĂ­nea central"] # 0x2104 (en: 'center line symbol', google translation) - - "℅": [T: "para"] # 0x2105 (en: 'care of', google: 'cuidado de') - - "℆": [T: "cada una"] # 0x2106 (google: 'cadada una') - - "ℇ": [T: "constante de euler"] # 0x2107 (en: 'euler's constant', google: 'la constante de euler') - - "℈": [T: "escrĂșpulo"] # 0x2108 (en: 'scruples', google translation) - - "ℊ": [T: "g cursiva"] # 0x210a (en: 'script g', google: 'guiĂłn g') - - "ℌℑℹℭ": # 0x210c, 0x2111, 0x2128, 0x212d - - T: "g cursiva" # (en: 'fraktur', google: 'fraktur') - - spell: "translate('.', 'ℌℑℹℭ', 'HIZC')" - - - "â„â„™â„Ÿâ„ż": # 0x210d, 0x2119, 0x213e, 0x213f - - test: - if: "$Verbosity!='Terse'" - then: [T: "doble tachadura"] # (en: 'double struck', google translation) - - spell: "translate('.', 'â„â„™â„Ÿâ„ż', 'HPΓΠ')" - - - "ℏ": # 0x210f - - test: - if: "($Verbosity='Terse')" - then: [T: "h bar"] # (google translation) - else: [T: "h barra"] # (en: 'reduced planck constant') - - - "â„â„’â„˜â„Źâ„°â„±â„ł": # 0x2110, 0x2112, 0x2118, 0x2130, 0x2131, 0x2133 - - T: "h barra" # (en: 'script') - - spell: "translate('.', 'â„â„’â„˜â„Źâ„°â„±â„ł', 'ILPBEFM')" - - - "℔": [T: "L B sĂ­mbolo de barra"] # 0x2114 (en: 'pounds', google: 'libras') - - "№": [T: "signo de nĂșmero"] # 0x2116 (en: 'number') - - "â„„": [T: "onza"] # 0x2125 (en: 'ounces') - - "℩": [T: "ohmio"] # 0x2126 (en: 'ohms') - - "℧": [T: "iota invertida"] # 0x2129 (en: 'turned iota', google: 'convertido en iota') - - "Å": [T: "angstrom"] # 0x212b (en: 'angstroms') - - "ℯ": [T: "e cursiva"] # 0x212f (en: 'script e', google: 'guiĂłn e') - - # coalesced some chars that use cap letters - - "â„Čâ„ș⅁⅂⅃⅄": # 0x2132, 0x213a, 0x2141, 0x2142, 0x2143, 0x2144 - - test: - - if: "'.' = 'â„ș'" - then: [T: "rotado"] # (en: 'rotated', google translation) - - else_if: "'.' = 'â„Č'" - then: [T: "transformado"] # (en: 'turned', google translation) - - else_if: "'.' = '⅃'" - then: [T: "invertido sans-serif"] # (en: 'reversed sans-serif', google translation) - else: [T: "e cursiva"] # (en: 'turned sans-serif', google: 'convertido en sans-serif') - - spell: "translate('.', 'â„Čâ„ș⅁⅂⅃⅄', 'FQGLLY')" - - - "℮": [T: "o cursiva"] # 0x2134 (en: 'script o', google: 'guiĂłn o') - - "â„”": [T: "alef"] # 0x2135 (en: 'first transfinite cardinal') - - "ℶ": [T: "bet"] # 0x2136 (en: 'second transfinite cardinal') - - "ℷ": [T: "guĂ­mel"] # 0x2137 (en: 'third transfinite cardinal') - - "ℾ": [T: "dĂĄlet"] # 0x2138 (en: 'fourth transfinite cardinal') - - "ℌ": [T: "pi en negrita de pizarra"] # 0x213c (en: 'double struck pi', google: 'double golpeado pi') - - "ℜ": [T: "gamma en negrita de pizarra"] # 0x213d (en: 'double struck gamma', google: 'double golpeĂł a gamma') - - "⅀": [T: "suma de n-ary en negrita"] # 0x2140 (en: 'double struck n-ary summation', google: 'suma de doble apolĂłn n-ary') - - "⅋": [T: "ampersand invertido"] # 0x214b (en: 'turned ampersand', google: 'convertido en ampersand') - - "⅌": [T: "por"] # 0x214c (en: 'per', google: 'por') - - "ⅎ": [T: "f invertida"] # 0x214e (en: 'turned F', google: 'girado f') - - "⅐": [T: "un sĂ©ptimo"] # 0x2150 (en: 'one seventh', google: 'un septimo') - - "⅑": [T: "un noveno"] # 0x2151 (en: 'one ninth', google: 'un noveno') - - "⅒": [T: "un dadoĂ©cimo"] # 0x2152 (en: 'one tenth', google: 'una dĂ©cima parte') - - "⅓": [T: "un tercio"] # 0x2153 (en: 'one third', SRE: 'Vulgar FracciĂłn Un Tercero') - - "⅔": [T: "dos tercios"] # 0x2154 (en: 'two thirds', SRE: 'FracciĂłn vulgar dos tercios') - - "⅕": [T: "un quinto"] # 0x2155 (en: 'one fifth', SRE: 'Vulgar Fraction One Fifth') - - "⅖": [T: " franciĂłn comĂșndos quintos"] # 0x2156 (en: 'two fifths', MathPlayer: 'dos quintos', google: 'dos quintas partes') - - "⅗": [T: " fracciĂłn comĂșn tres quintos"] # 0x2157 (en: 'three fifths', SRE: 'FracciĂłn vulgar tres quintos') - - "⅘": [T: " fracciĂłn comĂșn cuatro quintos"] # 0x2158 (en: 'four fifths', SRE: 'FracciĂłn vulgar cuatro quintos') - - "⅙": [T: "un sexto"] # 0x2159 (en: 'one sixth', SRE: 'Vulgar FracciĂłn Un Sexto') - - "⅚": [T: "cinco sextos"] # 0x215a (en: 'five sixths', SRE: 'Vulgar fracciĂłn cinco sextos') - - "⅛": [T: "fracciĂłn comĂșn un octavo"] # 0x215b (en: 'one eighth', MathPlayer: 'un octavo', google: 'un ath') - - "⅜": [T: "fracciĂłn comĂșn tres octavos"] # 0x215c (en: 'three eighths', MathPlayer: 'tres octavos', google: 'tres ats') - - "⅝": [T: "fracciĂłn comĂșn cinco octavos"] # 0x215d (en: 'five eighths', MathPlayer: 'cinco octavos', google: 'cinco ats') - - "⅞": [T: "fracciĂłn comĂșn siete octavos"] # 0x215e (en: 'seven eighths', MathPlayer: 'siete octavos', google: 'siete ats') - - "⅟": [T: "Numerador de fracciĂłn uno"] # 0x215f (en: 'one over', google: 'uno sobre') - - "Ⅰ": [T: "Ⅰ"] # 0x2160 (en: 'I', google translation) - - "Ⅱ": [T: "T"] # 0x2161 (en: 'I I', google translation) - - "ⅱ": [T: "III"] # 0x2162 (en: 'I I I', google translation) - - "Ⅳ": [T: "IV"] # 0x2163 (en: 'I V', google translation) - - "â…€": [T: "V"] # 0x2164 (en: 'V', google translation) - - "â…„": [T: "VI"] # 0x2165 (en: 'V I', google translation) - - "Ⅹ": [T: "VII"] # 0x2166 (en: 'V I I', google translation) - - "Ⅷ": [T: "VIII"] # 0x2167 (en: 'V I I I', google translation) - - "ⅹ": [T: "IX"] # 0x2168 (en: 'I X', google translation) - - "Ⅹ": [T: "XI"] # 0x216a (en: 'X I', google translation) - - "Ⅻ": [T: "XII"] # 0x216b (en: 'X I I', google translation) - - "Ⅼ": [T: "Ⅼ"] # 0x216c (en: 'L', google translation) - - "Ⅽ": [T: "Ⅽ"] # 0x216d (en: 'C', google translation) - - "ⅼ": [T: "ⅼ"] # 0x216e (en: 'D', google translation) - - "Ⅿ": [T: "Ⅿ"] # 0x216f (en: 'M', google translation) - - "ⅰ": [T: "ⅰ"] # 0x2170 (en: 'I', google translation) - - "ⅱ": [T: "I"] # 0x2171 (en: 'I I', google translation) - - "â…Č": [T: "III"] # 0x2172 (en: 'I I I', google translation) - - "ⅳ": [T: "IV"] # 0x2173 (en: 'I V', google translation) - - "Ⅾ": [T: "Ⅾ"] # 0x2174 (en: 'V', google translation) - - "â…”": [T: "VI"] # 0x2175 (en: 'V I', google translation) - - "ⅶ": [T: "VII"] # 0x2176 (en: 'V I I', google translation) - - "ⅷ": [T: "VIII"] # 0x2177 (en: 'V I I I', google translation) - - "ⅾ": [T: "IX"] # 0x2178 (en: 'I X', google translation) - - "â…č": [T: "â…č"] # 0x2179 (en: 'X', google translation) - - "â…ș": [T: "XI"] # 0x217a (en: 'X I', google translation) - - "ⅻ": [T: "XII"] # 0x217b (en: 'X I I', google translation) - - "â…Œ": [T: "â…Œ"] # 0x217c (en: 'L', google translation) - - "â…œ": [T: "â…œ"] # 0x217d (en: 'C', google translation) - - "â…Ÿ": [T: "â…Ÿ"] # 0x217e (en: 'D', google translation) - - "ⅿ": [T: "ⅿ"] # 0x217f (en: 'M', google translation) - - "↉": [T: "fracciĂłn comĂșn cero tercios"] # 0x2189 (en: 'zero thirds', google: 'cero tercios') - - "↔": [T: "flecha hacia izquierda y derecha"] # 0x2194 (en: 'left right arrow') - - "↕": [T: "flecha hacia arriba y abajo"] # 0x2195 (en: 'up down arrow') - - "↖": [T: "flecha hacia el noroeste"] # 0x2196 (en: 'north west arrow') - - "↗": # 0x2197 - - test: - if: "ancestor::*[2][self::m:limit]" - then: [T: "enfoque desde abajo"] # (en: 'approaches from below', google translation) - else: [T: "flecha hacia el nordeste"] # (en: 'north east arrow') - - - "↘": # 0x2198 - - test: - if: "ancestor::*[2][self::m:limit]" - then: [T: "enfoque desde arriba"] # (en: 'approaches from above', google translation) - else: [T: "flecha hacia el sudeste"] # (en: 'south east arrow') - - - "↙": [T: "flecha hacia el sudoeste"] # 0x2199 (en: 'south west arrow') - - "↚": [T: "flecha con trazo hacia la izquierda"] # 0x219a (en: 'leftwards arrow with stroke') - - "↛": [T: "flecha con trazo hacia la derecha"] # 0x219b (en: 'rightwards arrow with stroke') - - "↜": [T: "flecha izquierda ondulada"] # 0x219c (en: 'leftwards wave arrow') - - "↝": [T: "flecha derecha ondulada"] # 0x219d (en: 'rightwards wave arrow') - - "↞": [T: "flecha hacia la izquierda con doble punta"] # 0x219e (en: 'leftwards two headed arrow') - - "↟": [T: "flecha hacia arriba con doble punta"] # 0x219f (en: 'upwards two headed arrow') - - "↠": [T: "flecha hacia la derecha con doble punta"] # 0x21a0 (en: 'rightwards two headed arrow') - - "↡": [T: "flecha hacia abajo con doble punta"] # 0x21a1 (en: 'downwards two headed arrow') - - "↱": [T: "flecha hacia la izquierda con cola"] # 0x21a2 (en: 'leftwards arrow with tail') - - "↣": [T: "flecha hacia la derecha con cola"] # 0x21a3 (en: 'rightwards arrow with tail') - - "ↀ": [T: "flecha hacia la izquierda con barra"] # 0x21a4 (en: 'leftwards arrow from bar') - - "ↄ": [T: "flecha hacia arriba con barra"] # 0x21a5 (en: 'upwards arrow from bar') - - "↩": [T: "flecha derecha hacia arriba con barra"] # 0x21a6 (en: 'rightwards arrow from bar') - - "↧": [T: "flecha hacia abajo con barra"] # 0x21a7 (en: 'downwards arrow from bar') - - "↹": [T: "flecha hacia arriba y hacia abajo con base"] # 0x21a8 (en: 'up down arrow with base') - - "↩": [T: "flecha hacia la izquierda con gancho"] # 0x21a9 (en: 'leftwards arrow with hook') - - "â†Ș": [T: "fflecha hacia la derecha con gancho"] # 0x21aa (en: 'rightwards arrow with hook') - - "↫": [T: "flecha hacia la izquierda con bucle"] # 0x21ab (en: 'leftwards arrow with loop') - - "↬": [T: "flecha hacia la derecha con bucle"] # 0x21ac (en: 'rightwards arrow with loop') - - "↭": [T: "flecha ondulada hacia la izquierda y la derecha"] # 0x21ad (en: 'left right wave arrow') - - "↼": [T: "flecha hacia la izquierda y derecha con trazo"] # 0x21ae (en: 'left right arrow with stroke') - - "↯": [T: "flecha hacia abajo en zigzag"] # 0x21af (en: 'downwards zigzag arrow') - - "↰": [T: "flecha hacia arriba con punta hacia la izquierda"] # 0x21b0 (en: 'upwards arrow with tip leftwards') - - "↱": [T: "flecha hacia arriba con punta hacia la derecha"] # 0x21b1 (en: 'upwards arrow with tip rightwards') - - "â†Č": [T: "flecha hacia abajo con punta hacia la izquierda"] # 0x21b2 (en: 'downwards arrow with tip leftwards') - - "↳": [T: "flecha hacia abajo con punta hacia la derecha"] # 0x21b3 (en: 'downwards arrow with tip rightwards') - - "↮": [T: "flecha hacia la derecha con intersecciĂłn hacia abajo"] # 0x21b4 (en: 'rightwards arrow with corner downwards') - - "↔": [T: "flecha hacia abajo con intersecciĂłn hacia la izquierda"] # 0x21b5 (en: 'downwards arrow with corner leftwards') - - "↶": [T: "flecha semicircular superior en sentido contrario a las agujas del reloj"] # 0x21b6 (en: 'anticlockwise top semicircle arrow') - - "↷": [T: "flecha semicircular superior en sentido de las agujas del reloj"] # 0x21b7 (en: 'clockwise top semicircle arrow') - - "↾": [T: "flecha noroeste hacia barra larga"] # 0x21b8 (en: 'north west arrow to long bar') - - "â†č": [T: "flecha izquierda hacia barra por encima de flecha derecha hacia barra"] # 0x21b9 (en: 'leftwards arrow to bar over rightwards arrow to bar') - - "â†ș": [T: "flecha circular abierta en sentido contrario a las agujas del reloj"] # 0x21ba (en: 'anticlockwise open circle arrow') - - "↻": [T: "flecha circular abierta en sentido de las agujas del reloj"] # 0x21bb (en: 'clockwise open circle arrow') - - "↌": [T: "flecha izquierda con arpĂłn en la parte superior"] # 0x21bc (en: 'left harpoon up') - - "↜": [T: "flecha izquierda con arpĂłn en la parte inferior"] # 0x21bd (en: 'left harpoon down') - - "↟": [T: "arpĂłn derecho hacia arriba"] # 0x21be (en: 'up harpoon right') - - "↿": [T: "arpĂłn izquierdo hacia arriba"] # 0x21bf (en: 'up harpoon left') - - "⇀": [T: "arpĂłn derecho hacia arriba"] # 0x21c0 (en: 'right harpoon up') - - "⇁": [T: "arpĂłn derecho hacia abajo"] # 0x21c1 (en: 'right harpoon down') - - "⇂": [T: "arpĂłn derecho hacia abajo"] # 0x21c2 (en: 'down harpoon right') - - "⇃": [T: "arpĂłn izquierdo hacia abajo"] # 0x21c3 (en: 'down harpoon left') - - "⇄": [T: "flecha hacia la derecha por encima de flecha hacia la izquierda"] # 0x21c4 (en: 'rightwards arrow over leftwards arrow') - - "⇅": [T: "flecha hacia arriba a la izquierda de flecha hacia abajo"] # 0x21c5 (en: 'upwards arrow leftwards of downwards arrow') - - "⇆": [T: "flecha hacia la izquierda por encima de flecha hacia la derecha"] # 0x21c6 (en: 'leftwards arrow over rightwards arrow') - - "⇇": [T: "dos flechas hacia la izquierda"] # 0x21c7 (en: 'leftwards paired arrows') - - "⇈": [T: "dos flechas hacia arriba"] # 0x21c8 (en: 'upwards paired arrows') - - "⇉": [T: "dos flechas hacia la derecha"] # 0x21c9 (en: 'rightwards paired arrows') - - "⇊": [T: "dos flechas hacia abajo"] # 0x21ca (en: 'downwards paired arrows') - - "⇋": [T: "arpĂłn izquierdo por encima de arpĂłn derecho"] # 0x21cb (en: 'left harpoon over right harpoon') - - "⇌": [T: "arpĂłn derecho por encima de arpĂłn izquierdo"] # 0x21cc (en: 'right harpoon over left harpoon') - - "⇍": [T: "flecha doble izquierda con trazo"] # 0x21cd (en: 'leftwards double arrow with stroke') - - "⇎": [T: "flecha doble izquierda y derecha con trazo"] # 0x21ce (en: 'left right double arrow with stroke') - - "⇏": [T: "flecha doble hacia la derecha con trazo"] # 0x21cf (en: 'rightwards double arrow with stroke') - - "⇐": [T: "flecha doble hacia la izquierda"] # 0x21d0 (en: 'leftwards double arrow') - - "⇑": [T: "flecha doble hacia arriba"] # 0x21d1 (en: 'upwards double arrow') - - "⇓": [T: "flecha doble hacia abajo"] # 0x21d3 (en: 'downwards double arrow') - - "⇔": [T: "flecha doble vertical"] # 0x21d5 (en: 'up down double arrow') - - "⇖": [T: "flecha doble hacia noroeste"] # 0x21d6 (en: 'north west double arrow') - - "⇗": [T: "flecha doble hacia nordeste"] # 0x21d7 (en: 'north east double arrow') - - "⇘": [T: "flecha doble hacia sudeste"] # 0x21d8 (en: 'south east double arrow') - - "⇙": [T: "flecha doble hacia sudoeste"] # 0x21d9 (en: 'south west double arrow') - - "⇚": [T: "flecha triple hacia la izquierda"] # 0x21da (en: 'leftwards triple arrow') - - "⇛": [T: "flecha triple hacia la derecha"] # 0x21db (en: 'rightwards triple arrow') - - "⇜": [T: "flecha ondulada izquierda"] # 0x21dc (en: 'leftwards squiggle arrow') - - "⇝": [T: "flecha ondulada hacia la derecha"] # 0x21dd (en: 'rightwards squiggle arrow') - - "⇞": [T: "flecha hacia arriba con doble trazo"] # 0x21de (en: 'upwards arrow with double stroke') - - "⇟": [T: "flecha hacia abajo con doble trazo"] # 0x21df (en: 'downwards arrow with double stroke') - - "⇠": [T: "flecha de puntos hacia la izquierda"] # 0x21e0 (en: 'leftwards dashed arrow') - - "⇡": [T: "flecha de puntos hacia arriba"] # 0x21e1 (en: 'upwards dashed arrow') - - "⇱": [T: "flecha de puntos hacia la derecha"] # 0x21e2 (en: 'rightwards dashed arrow') - - "⇣": [T: "flecha de puntos hacia abajo"] # 0x21e3 (en: 'downwards dashed arrow') - - "⇀": [T: "flecha hacia la izquierda con barra"] # 0x21e4 (en: 'leftwards arrow to bar') - - "⇄": [T: "flecha hacia la derecha con barra"] # 0x21e5 (en: 'rightwards arrow to bar') - - "⇩": [T: "flecha blanca hacia la izquierda"] # 0x21e6 (en: 'leftwards white arrow') - - "⇧": [T: "flecha blanca hacia arriba"] # 0x21e7 (en: 'upwards white arrow') - - "⇹": [T: "flecha blanca hacia la derecha"] # 0x21e8 (en: 'rightwards white arrow') - - "⇩": [T: "flecha blanca hacia abajo"] # 0x21e9 (en: 'downwards white arrow') - - "â‡Ș": [T: "flecha blanca hacia arriba partiendo de barra"] # 0x21ea (en: 'upwards white arrow from bar') - - "⇫": [T: "flecha blanca hacia arriba sobre un pedestal con barra horizontal"] # 0x21eb - - "⇬": [T: "flecha blanca hacia arriba sobre pedestal con barra horizontal"] # 0x21ec (en: 'upwards white arrow on pedestal with horizontal bar', google: 'arrow blanca hacia arriba en el pedestal con barra horizontal') - - "⇭": [T: "flecha blanca hacia arriba sobre un pedestal con barra vertical"] # 0x21ed (en: 'upwards white arrow on pedestal with vertical bar', google: 'arrow blanca hacia arriba en el pedestal con barra vertical') - - "⇼": [T: "flecha doble blanca hacia arriba"] # 0x21ee (en: 'upwards white double arrow', google: 'hacia arriba flecha doble blanca') - - "⇯": [T: "flecha doble blanca hacia arriba sobre un pedestal"] # 0x21ef (en: 'upwards white double arrow on pedestal', google: 'arrow doble blanca hacia arriba en el pedestal') - - "⇰": [T: "flecha blanca hacia la derecha partiendo de un muro"] # 0x21f0 (en: 'rightwards white arrow from wall', google: 'arrow blanca hacia la derecha desde la pared') - - "⇱": [T: "flecha noroeste hacia la intersecciĂłn"] # 0x21f1 (en: 'north west arrow to corner', google: 'north west arrow a la esquina') - - "â‡Č": [T: "flecha sudeste hacia la intersecciĂłn"] # 0x21f2 (en: 'south east arrow to corner', google: 'south east arrow a la esquina') - - "⇳": [T: "flecha blanca vertical"] # 0x21f3 (en: 'up down white arrow', google: 'arrow white arrow') - - "⇮": [T: "flecha derecha con cĂ­rculo pequeño"] # 0x21f4 (en: 'right arrow with small circle') - - "⇔": [T: "flecha superior hacia la derecha de flecha inferior"] # 0x21f5 (en: 'downwards arrow leftwards of upwards arrow') - - "⇶": [T: "tres flechashacia la derecha"] # 0x21f6 - - ⇷": [T: "flecha hacia la izquierda con trazo vertical"] # 0x21f7 (en: 'leftwards arrow with vertical stroke') - - "⇾": [T: "flecha hacia la derecha con trazo vertical"] # 0x21f8 (en: 'rightwards arrow with vertical stroke') - - "â‡č": [T: "flecha izquierda derecha con trazo vertical"] # 0x21f9 (en: 'left right arrow with vertical stroke', google: 'flecha derecha izquierda con carrera vertical') - - "â‡ș": [T: "flecha hacia la izquierda con doble trazo vertical"] # 0x21fa (en: 'leftwards arrow with double vertical stroke', google: 'flecha hacia la izquierda con trazo vertical doble') - - "⇻": [T: "flecha hacia la derecha con doble trazo vertical"] # 0x21fb (en: 'rightwards arrow with double vertical stroke', google: 'flecha hacia la derecha con trazo vertical doble') - - "⇌": [T: "flecha izquierda derecha con doble trazo vertical"] # 0x21fc (en: 'left right arrow with double vertical stroke', google: 'flecha derecha izquierda con doble carrera vertical') - - "⇜": [T: "flecha hacia la izquierda con punta abierta"] # 0x21fd (en: 'leftwards open headed arrow') - - "⇟": [T: "flecha hacia la derecha con punta abierta"] # 0x21fe (en: 'rightwards open headed arrow') - - "⇿": [T: "flecha izquierda derecha con punta abierta"] # 0x21ff (en: 'left right open headed arrow') - - "∀": [T: "para todo"] # 0x2200 (en: 'for all') - - "∁": # 0x2201 - - test: - if: "$Verbosity!='Terse'" - then: [T: "el"] # (en: 'the', google translation) - - T: "complemento de" # (en: 'complement of') - - "∃": [T: "existe"] # 0x2203 (en: 'there exists') - - "∄": [T: "no existe"] # 0x2204 (en: 'there does not exist') - - "∅": [T: "conjunto vacĂ­o"] # 0x2205 (en: 'empty set') - - "∇": # 0x2207 - - test: - if: "$Verbosity!='Terse'" - then: [T: "el"] # (en: 'the', google translation) - - T: "gradiente" # (en: 'gradient of', google: 'gradiente de') - - "∋": [T: "comprende "] # 0x220b (en: 'contains the member') - - "∌": [T: "no comprende"] # 0x220c (en: 'does not contain the member') - - "∍": [T: "comprende "] # 0x220d (en: 'contains the member') - - "∎": [T: "fin de demostraciĂłn"] # 0x220e (en: 'end of proof') - - "∏": [T: "producto"] # 0x220f (en: 'product') - - "∐": [T: "coproducto"] # 0x2210 (en: 'coproduct') - - "∑": [T: "suma"] # 0x2211 (en: 'sum', SRE: 'sumatorio') - - "−": [T: "menos"] # 0x2212 (en: 'minus') - - "∓": [T: "menos mĂĄs"] # 0x2213 (en: 'minus or plus') - - "∔": [T: "punto mĂĄs"] # 0x2214 (en: 'dot plus') - - "∕": [T: "dividido por"] # 0x2215 (en: 'divided by') - - "∖": [T: "menos"] # 0x2216 (en: 'set minus') - - "∗": [T: "asterisco"] # 0x2217 (en: 'times') - - "∙": # 0x2219 - - test: - if: "@data-chem-formula-op" - then: [T: "punto"] # (en: 'dot', google translation) - else: [T: "bala"] # (en: 'times') - - - "∛": # 0x221b - - test: - if: "$Verbosity!='Terse'" - then: [T: "raĂ­z cĂșbica de"] # (en: 'cube root of') - - "∜": # 0x221c - - test: - if: "$Verbosity!='Terse'" - then: [T: "el"] # (en: 'the', google translation) - - T: "raĂ­z cuarta de" # (en: 'fourth root of') - - "∞": [T: "infinito"] # 0x221e (en: 'infinity') - - "∟": [T: "ĂĄngulo recto"] # 0x221f (en: 'right angle') - - "∠": [T: "ĂĄngulo"] # 0x2220 (en: 'angle') - - "∥": [T: "ĂĄngulo medido"] # 0x2221 (en: 'measured angle') - - "∹": [T: "ĂĄngulo esfĂ©rico"] # 0x2222 (en: 'spherical angle') - - "∧": [T: "y"] # 0x2227 (en: 'and') - - "√": [T: "o"] # 0x2228 (en: 'or') - - "∩": [T: "intersecciĂłn"] # 0x2229 (en: 'intersection') - - "âˆȘ": [T: "uniĂłn"] # 0x222a (en: 'union') - - "∫": [T: "integral"] # 0x222b - - "∏": [T: "integral doble"] # 0x222c (en: 'double integral') - - "∭": [T: "integral triple"] # 0x222d (en: 'triple integral') - - "∟": [T: "integral de contorno"] # 0x222e (en: 'contour integral') - - "∯": [T: "integral de superficie"] # 0x222f (en: 'surface integral') - - "∰": [T: "integral de volumen"] # 0x2230 (en: 'volume integral') - - "∱": [T: "integral de contorno en sentido de las agujas del reloj"] # 0x2231 (en: 'clockwise integral') - - "âˆČ": [T: "integral de contorno en sentido de las agujas del reloj"] # 0x2232 (en: 'clockwise contour integral') - - "∳": [T: "integral de contorno en sentido contrario a las agujas del reloj"] # 0x2233 (en: 'anticlockwise contour integral') - - "∎": [T: "por lo tanto"] # 0x2234 (en: 'therefore') - - "∔": [T: "porque"] # 0x2235 (en: 'because') - - "∞": [T: "punto menos"] # 0x2238 (en: 'dot minus') - - "âˆč": [T: "exceso"] # 0x2239 (en: 'has excess compared to') - - "âˆș": # 0x223a - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "geomĂ©tricamente proporcional a" # (en: 'geometrically proportional to') - - "∻": # 0x223b - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "homotĂ©tico a" # (en: 'homothetic to') - - "≀": [T: "producto de guirnalda"] # 0x2240 (en: 'wreath product') - - "≁": [T: "no tilde"] # 0x2241 (en: 'not tilde') - - "≂": [T: "menos tilde"] # 0x2242 (en: 'minus tilde') - - "≃": # 0x2243 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "asintĂłticamente igual a" # (en: 'asymptotically equal to') - - "≄": # 0x2244 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no asintĂłticamente igual a" # (en: 'not asymptotically equal to') - - "≅": # 0x2245 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "aproximadamente igual a" # (en: 'approximately equal to') - - "≆": # 0x2246 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "aproximado pero no igual a" # (en: 'approximately but not actually equal to') - - "≇": # 0x2247 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "ni proximadamente ni realmente igual a" # (en: 'neither approximately nor actually equal to') - - "≈": # 0x2248 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "casi igual a" # (en: 'almost equal to', SRE: 'aproximado') - - "≉": # 0x2249 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no es casi igual a" # (en: 'not almost equal to') - - "≊": # 0x224a - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "igual o casi igual a" # (en: 'almost equal or equal to') - - "≋": [T: "triple tilde"] # 0x224b - - "≌": [T: "todo igual a"] # 0x224c (en: 'are all equal to') - - "≍": # 0x224d - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "equivalente a" # (en: 'equivalent to') - - "≎": # 0x224e - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "geomĂ©tricamente equivalente a" # (en: 'geometrically equivalent to') - - "≏": # 0x224f - - test: - if: "$Verbosity!='Terse'" - then: [T: "la"] # (en: 'the', google translation) - - T: "diferencia entre" # (en: 'difference between') - - "≐": [T: "se acerca al lĂ­mite"] # 0x2250 (en: 'approaches the limit') - - "≑": # 0x2251 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "geomĂ©tricamente igual a" # (en: 'geometrically equal to') - - "≒": # 0x2252 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "aproximadamente igual a o imagen de" # (en: 'approximately equal to or the image of') - - "≓": # 0x2253 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es la"] # (en: 'is the', google translation) - - T: "imagen de o aproximadamente igual a" # (en: 'image of or approximately equal to') - - "≔": [T: "dos puntos igual"] # 0x2254 (en: 'colon equals') - - "≕": [T: "igual dos puntos"] # 0x2255 (en: 'equals colon') - - "≖": [T: "igual incluyendo anillo"] # 0x2256 (en: 'ring in equal to') - - "≗": # 0x2257 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "aproximadamente igual a" # (en: 'approximately equal to') - - "≘": [T: "corresponde a"] # 0x2258 (en: 'corresponds to') - - "≙": [T: "estimaciĂłn"] # 0x2259 (en: 'estimates') - - "≚": # 0x225a - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "equiĂĄngulo con" # (en: 'equiangular to') - - "≛": [T: "igual con estrella"] # 0x225b (en: 'star equals') - - "≜": [T: "delta igual a"] # 0x225c (en: 'delta equals') - - "≝": [T: "igual por definiciĂłn a"] # 0x225d (en: 'is defined to be') - - "≞": # 0x225e - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "medido por" # (en: 'measured by') - - "≟": [T: "igual con interrogante"] # 0x225f (en: 'has an unknown relationship with') - - "≱": # 0x2262 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no es idĂ©ntico a" # (en: 'not identical to') - - "≣": # 0x2263 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "estrictamente equivalente a" # (en: 'strictly equivalent to') - - "≹": # 0x2268 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "menor que pero no igual a" # (en: 'less than but not equal to') - - "≩": # 0x2269 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "mayor que pero no igual a" # (en: 'greater than but not equal to') - - "â‰Ș": # 0x226a - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "mucho menor que" # (en: 'much less than') - - "≫": # 0x226b - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "mucho mayor que" # (en: 'much greater than') - - "≬": # 0x226c - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "entre" # (en: 'between') - - "≭": # 0x226d - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no equivalente a" # (en: 'not equivalent to') - - "≼": # 0x226e - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no menor que" # (en: 'not less than') - - "≯": # 0x226f - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no mayor que" # (en: 'not greater than') - - "≰": # 0x2270 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no menor ni igual a" # (en: 'neither less than nor equal to') - - "≱": # 0x2271 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no mayor ni igual a" # (en: 'neither greater than nor equal to') - - "â‰Č": # 0x2272 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "menor o equivalente a" # (en: 'less than or equivalent to') - - "≳": # 0x2273 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "mayor o equivalente a" # (en: 'greater than or equivalent to') - - "≮": # 0x2274 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no menor ni equivalente a" # (en: 'neither less than nor equivalent to') - - "≔": # 0x2275 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no mayor ni equivalente a" # (en: 'neither greater than nor equivalent to') - - "≶": # 0x2276 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "menor o mayor que" # (en: 'less than or greater than') - - "≷": # 0x2277 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "mayor o menor que" # (en: 'greater than or less than') - - "≾": # 0x2278 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no menor ni mayor que" # (en: 'neither less than nor greater than') - - "â‰č": # 0x2279 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no mayor ni menor que" # (en: 'neither greater than nor less than') - - "â‰ș": [T: "precede a"] # 0x227a (en: 'precedes') - - "≻": [T: "sigue a"] # 0x227b (en: 'succeeds') - - "≌": [T: "precede o es igual a"] # 0x227c (en: 'precedes or is equal to') - - "≜": [T: "sigue o es igual a"] # 0x227d (en: 'succeeds or is equal to') - - "≟": [T: "precede o es equivalente a"] # 0x227e (en: 'precedes or is equivalent to') - - "≿": [T: "sigue o es equivalente a"] # 0x227f (en: 'succeeds or is equivalent to') - - "⊀": [T: "no precede a"] # 0x2280 (en: 'does not precede') - - "⊁": [T: "no sigue a"] # 0x2281 (en: 'does not succeed') - - "⊈": # 0x2288 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no incluido ni igual a" # (en: 'neither a subset of nor equal to') - - "⊉": # 0x2289 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no contiene ni es igual a" # (en: 'neither a superset of nor equal to') - - "⊊": [T: "incluido estrictamente en"] # 0x228a (en: 'subset of with not equal to') - - "⊋": [T: "contiene estrictamente a"] # 0x228b (en: 'superset of with not equal to') - - "⊌": [T: "multiconjunto"] # 0x228c (en: 'multiset') - - "⊍": [T: "multiplicaciĂłn de multiconjuntos"] # 0x228d (en: 'multiset multiplication') - - "⊎": [T: "uniĂłn de multiconjuntos"] # 0x228e (en: 'multiset union') - - "⊏": [T: "imagen cuadrada de"] # 0x228f (en: 'square image of') - - "⊐": [T: "original cuadrado de"] # 0x2290 (en: 'square original of') - - "⊑": [T: "imagen cuadrada de o igual a"] # 0x2291 (en: 'square image of or equal to') - - "⊒": [T: "original cuadrado de o igual a"] # 0x2292 (en: 'square original of or equal to') - - "⊓": [T: "intersecciĂłn cuadrada"] # 0x2293 (en: 'square cap') - - "⊔": [T: "uniĂłn cuadrada"] # 0x2294 (en: 'square cup') - - "⊕": [T: "signo mĂĄs en forma de cĂ­rculo"] # 0x2295 (en: 'circled plus') - - "⊖": [T: "signo menos en forma de cĂ­rculo"] # 0x2296 (en: 'circled minus') - - "⊗": [T: "signo por en forma de cĂ­rculo"] # 0x2297 (en: 'circled times') - - "⊘": [T: "barra en forma de cĂ­rculo"] # 0x2298 (en: 'circled slash') - - "⊙": [T: "punto en forma de cĂ­rculo"] # 0x2299 (en: 'circled dot operator') - - "⊚": [T: "anillo en cĂ­rculo"] # 0x229a (en: 'circled ring') - - "⊛": [T: "asterisco en cĂ­rculo"] # 0x229b (en: 'circled asterisk') - - "⊜": [T: "signo igual en cĂ­rculo"] # 0x229c (en: 'circled equals') - - "⊝": [T: "signo menos en cĂ­rculo"] # 0x229d (en: 'circled dash') - - "⊞": [T: "signo mĂĄs en forma de cuadrado"] # 0x229e (en: 'squared plus') - - "⊟": [T: "menos en forma de cuadrado"] # 0x229f (en: 'squared minus') - - "⊠": [T: "signo por en forma de cuadrado"] # 0x22a0 (en: 'squared times') - - "⊡": [T: "punto en forma de cuadrado"] # 0x22a1 (en: 'squared dot operator') - - "⊱": [T: "t horizontal hacia la izquierda"] # 0x22a2 (en: 'proves') - - "⊣": [T: "t horizontal hacia la derecha"] # 0x22a3 (en: 'does not yield') - - "⊀": [T: "perpendicular"] # 0x22a4 (en: 'top') - - "⊄": # 0x22a5 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "perpendicular invertida" # (en: 'bottom') - - "⊩": [T: "afirmaciĂłn"] # 0x22a6 (en: 'reduces to') - - "⊧": [T: "modela"] # 0x22a7 (en: 'models') - - "⊹": # 0x22a8 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "verdadero" # (en: 'true') - - "⊩": [T: "obliga"] # 0x22a9 (en: 'forces') - - "âŠȘ": [T: "triple barra vertical torniquete a la derecha"] # 0x22aa (en: 'triple vertical bar right turnstile') - - "⊫": [T: "doble barra vertical con doble torniquete a la derecha"] # 0x22ab (en: 'double vertical bar double right turnstile') - - "⊬": [T: "no demuestra"] # 0x22ac (en: 'does not prove') - - "⊭": # 0x22ad - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "falso" # (en: 'not true') - - "⊼": [T: "no obliga"] # 0x22ae (en: 'does not force') - - "⊯": [T: "doble barra vertical negada con doble torniquete a la derecha"] # 0x22af (en: 'negated double vertical bar double right turnstile') - - "⊰": [T: "precede con respecto a"] # 0x22b0 (en: 'precedes under relation') - - "⊱": [T: "sigue con respecto a"] # 0x22b1 (en: 'succeeds under relation') - - "âŠČ": # 0x22b2 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "subgrupo normal de" # (en: 'a normal subgroup of') - - "⊳": [T: "contiene como subgrupo normal a"] # 0x22b3 (en: 'contains as a normal subgroup') - - "⊮": # 0x22b4 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "subgrupo normal o es igual a" # (en: 'a normal subgroup of or equal to') - - "⊔": [T: "contiene como subgrupo normal o es igual a"] # 0x22b5 (en: 'contains as a normal subgroup or equal to') - - "⊶": # 0x22b6 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "el original de" # (en: 'the original of') - - "⊷": # 0x22b7 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "imagen de" # (en: 'an image of') - - "⊾": [T: "multifunciĂłn"] # 0x22b8 (en: 'multimap') - - "âŠč": [T: "matriz hermitiana conjugada"] # 0x22b9 (en: 'hermitian conjugate matrix') - - "âŠș": [T: "intercalada"] # 0x22ba (en: 'intercalate') - - "⊻": [T: "o excluyente"] # 0x22bb (en: 'xor') - - "⊌": [T: "no y"] # 0x22bc (en: 'nand') - - "⊜": [T: "no o"] # 0x22bd (en: 'nor') - - "⊟": [T: "ĂĄngulo recto con arco"] # 0x22be (en: 'right angle with arc') - - "⊿": [T: "triĂĄngulo rectĂĄngulo"] # 0x22bf (en: 'right triangle') - - "⋀": [T: "y"] # 0x22c0 (en: 'logical and') - - "⋁": [T: "o"] # 0x22c1 (en: 'logical or') - - "⋂": [T: "intersecciĂłn"] # 0x22c2 (en: 'intersection') - - "⋃": [T: "uniĂłn"] # 0x22c3 (en: 'union') - - "⋄": [T: "operador diamante"] # 0x22c4 (en: 'diamond operator') - - "⋅": # 0x22c5 - - test: - if: "@data-chem-formula-op" - then: [T: "punto"] # (en: 'dot', google translation) - else: [T: "punto"] # (en: 'times') - - - "⋆": [T: "operador estrella"] # 0x22c6 (en: 'times') - - "⋇": [T: "dividido por"] # 0x22c7 (en: 'division times') - - "⋈": [T: "moño"] # 0x22c8 (en: 'bowtie') - - "⋉": # 0x22c9 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "factor normal izquierdo producto semidirecto" # (en: 'the left normal factor semidirect product of') - - "⋊": # 0x22ca - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "factor normal derecho producto semidirecto" # (en: 'the right normal factor semidirect product of') - - "⋋": # 0x22cb - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "producto semidirecto izquierdo" # (en: 'the left semidirect product of') - - "⋌": # 0x22cc - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "producto semidirecto derecho" # (en: 'the right semidirect product of') - - "⋍": [T: "tilde invertida igual a"] # 0x22cd (en: 'reversed tilde equals') - - "⋎": [T: "o rotacional"] # 0x22ce (en: 'curly logical or') - - "⋏": [T: "y rotacional"] # 0x22cf (en: 'curly logical and') - - "⋐": # 0x22d0 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "subconjunto doble de" # (en: 'a double subset of') - - "⋑": # 0x22d1 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "superconjunto doble de" # (en: 'a double superset of') - - "⋒": # 0x22d2 - - test: - if: "$Verbosity!='Terse'" - then: [T: "la"] # (en: 'the', google translation) - - T: "doble intersecciĂłn" # (en: 'double intersection of') - - "⋓": # 0x22d3 - - test: - if: "$Verbosity!='Terse'" - then: [T: "la"] # (en: 'the', google translation) - - T: "doble uniĂłn" # (en: 'double union of') - - "⋔": # 0x22d4 - - test: - if: "$Verbosity!='Terse'" - then: [T: "el"] # (en: 'the', google translation) - - T: "intersecciĂłn propia de" # (en: 'proper intersection of') - - "⋕": # 0x22d5 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "paralela o igual a" # (en: 'equal to and parallel to') - - "⋖": [T: "menor que con punto"] # 0x22d6 (en: 'less than with dot') - - "⋗": [T: "mayor que con punto"] # 0x22d7 (en: 'greater than with dot') - - "⋘": # 0x22d8 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "mucho menor que" # (en: 'very much less than') - - "⋙": # 0x22d9 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "mucho mayor que" # (en: 'very much greater than') - - "⋚": # 0x22da - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "menor que igual a o mayor que" # (en: 'less than equal to or greater than') - - "⋛": # 0x22db - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "mayor que igual a o menor que" # (en: 'greater than equal to or less than') - - "⋜": # 0x22dc - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "menor o igual que" # (en: 'equal to or less than') - - "⋝": # 0x22dd - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "mayor o igual que" # (en: 'equal to or greater than') - - "⋞": # 0x22de - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "precede o es igual a" # (en: 'equal to or precedes') - - "⋟": # 0x22df - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "sigue o es igual a" # (en: 'equal to or succeeds') - - "⋠": [T: "no precede ni es igual a"] # 0x22e0 (en: 'does not precede nor is equal to') - - "⋡": [T: "no sigue ni es igual a"] # 0x22e1 (en: 'does not succeed nor is equal to') - - "⋱": [T: "no es imagen cuadrada ni igual a"] # 0x22e2 (en: 'not square image of or equal to') - - "⋣": [T: "no es original cuadrada ni igual a"] # 0x22e3 (en: 'not square original of or equal to') - - "â‹€": [T: "imagen cuadrada precisa"] # 0x22e4 (en: 'square image of or not equal to') - - "â‹„": [T: "cuadrada original precisa"] # 0x22e5 (en: 'square original of or not equal to') - - "⋩": # 0x22e6 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "menor que no equivalente a" # (en: 'less than but not equivalent to') - - "⋧": # 0x22e7 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "mayor que no equivalente a" # (en: 'greater than but not equivalent to') - - "⋹": [T: "precede pero no es equivalente a"] # 0x22e8 (en: 'precedes but is not equivalent to') - - "⋩": [T: "sigue pero no es equivalente a"] # 0x22e9 (en: 'succeeds but is not equivalent to') - - "â‹Ș": # 0x22ea - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no subgrupo normal de" # (en: 'not a normal subgroup of') - - "⋫": [T: "no contiene como subgrupo normal a"] # 0x22eb (en: 'does not contain as a normal subgroup') - - "⋬": # 0x22ec - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no es subgrupo normal ni igual a" # (en: 'not a normal subgroup of nor is equal to') - - "⋭": [T: "no contiene como subgrupo normal ni es igual a"] # 0x22ed (en: 'does not contain as a normal subgroup nor is equal to') - - "⋼": [T: "puntos suspensivos verticales"] # 0x22ee (en: 'vertical ellipsis') - - "⋯": [T: "puntos suspensivos altos"] # 0x22ef (en: 'dot dot dot') - - "⋰": [T: "puntos suspensivos diagonales hacia arriba"] # 0x22f0 (en: 'upwards diagonal ellipsis') - - "⋱": [T: "puntos suspensivos diagonales hacia abajo"] # 0x22f1 (en: 'diagonal ellipsis') - - "â‹Č": [T: "pertenece a con trazo horizontal"] # 0x22f2 (en: 'element of with long horizontal stroke') - - "⋳": [T: "pertenece a con barra vertical al final del trazo horizontal"] # 0x22f3 (en: 'element of with vertical bar at end of horizontal stroke') - - "⋮": [T: "pertenece a con barra vertical al final del trazo horizontal"] # 0x22f4 (en: 'element of with vertical bar at end of horizontal stroke') - - "â‹”": [T: "pertenece a con punto arriba"] # 0x22f5 (en: 'element of with dot above') - - "⋶": [T: "pertenece a con barra arriba"] # 0x22f6 (en: 'element of with overbar') - - "⋷": [T: "perteneciente subrayado"] # 0x22f7 (en: 'element of with overbar') - - "⋾": [T: "perteneciente subrayado"] # 0x22f8 (en: 'element of with underbar') - - "â‹č": [T: "pertenece con dos trazos horizontales"] # 0x22f9 (en: 'element of with two horizontal strokes') - - "â‹ș": [T: "contiene o es igual a"] # 0x22fa (en: 'contains with long horizontal stroke') - - "⋻": [T: "contiene barra vertical al final de trazo horizontal"] # 0x22fb (en: 'contains with vertical bar at end of horizontal stroke') - - "⋌": [T: "contiene barra vertical al final de trazo horizontal"] # 0x22fc (en: 'contains with vertical bar at end of horizontal stroke') - - "⋜": [T: "contiene barra superior"] # 0x22fd (en: 'contains with overbar') - - "⋟": [T: "incluye barra superior"] # 0x22fe (en: 'contains with overbar') - - "⋿": [T: "z anotaciĂłn pertenencia a bolsa"] # 0x22ff (en: 'z notation bag membership') - - "⌀": [T: "diĂĄmetro"] # 0x2300 (en: 'diameter') - - "⌁": [T: "flecha elĂ©ctrica"] # 0x2301 (en: 'electric arrow', google: 'flecha elĂ©ctrica') - - "⌂": [T: "casa"] # 0x2302 (en: 'house') - - "⌃": [T: "flecha arriba"] # 0x2303 (en: 'up arrowhead', google: 'arrowhead de flecha') - - "⌄": [T: "flecha con punta hacia abajo"] # 0x2304 (en: 'down arrowhead', google: 'abajo de arrowhead') - - "⌅": [T: "proyectiva"] # 0x2305 (en: 'projective') - - "⌆": [T: "perspectiva"] # 0x2306 (en: 'perspective') - - "⌇": [T: "lĂ­nea ondulada"] # 0x2307 (en: 'wavy line') - - "⌈": [T: "lĂ­mite superior izquierdo"] # 0x2308 (en: 'left ceiling') - - "⌉": [T: "lĂ­mite superior derecho"] # 0x2309 (en: 'right ceiling') - - "⌊": [T: "lĂ­mite inferior izquierdo"] # 0x230a (en: 'left floor') - - "⌋": [T: "lĂ­mite inferior derecho"] # 0x230b (en: 'right floor') - - "⌌": [T: "corte inferior derecho"] # 0x230c (en: 'bottom right crop') - - "⌍": [T: "corte inferior izquierdo"] # 0x230d (en: 'bottom left crop') - - "⌎": [T: "corte superior derecho "] # 0x230e (en: 'top right crop', MathPlayer: 'corte superior derecho', google: 'cropa de arriba a la derecha') - - "⌏": [T: "corte superior izquierdo"] # 0x230f (en: 'top left crop') - - "⌐": [T: "no invertido"] # 0x2310 (en: 'reversed not sign') - - "⌑": [T: "rombo cuadrado"] # 0x2311 (en: 'square lozenge', google: 'pombra cuadrada') - - "⌒": [T: "arco"] # 0x2312 (en: 'arc') - - "⌓": [T: "segmento"] # 0x2313 (en: 'segment') - - "⌔": [T: "sector"] # 0x2314 - - "⌕": [T: "grabadora telefĂłnica"] # 0x2315 (en: 'telephone recorder', google: 'recordadora telefĂłnica') - - "⌖": [T: "indicador de posiciĂłn"] # 0x2316 (en: 'position indicator crosshairs', google: 'posiciĂłn indicador de mira') - - "⌗": [T: "viewdata square"] # 0x2317 (google translation) - - "⌘": [T: "lugar del signo de interĂ©s"] # 0x2318 (en: 'place of interest sign', google: 'señal de lugar de interĂ©s') - - "⌙": [T: "signo no invertido"] # 0x2319 (en: 'turned not sign', google translation) - - "⌚": [T: "reloj"] # 0x231a (en: 'watch', google: 'mirar') - - "⌛": [T: "reloj de arena"] # 0x231b (en: 'hourglass', google translation) - - "⌜": [T: "ĂĄngulo superior izquierdo"] # 0x231c (en: 'top left corner') - - "⌝": [T: "ĂĄngulo superior derecho"] # 0x231d (en: 'top right corner') - - "⌞": [T: "ĂĄngulo inferior izquierdo"] # 0x231e (en: 'bottom left corner') - - "⌟": [T: "ĂĄngulo inferior derecho"] # 0x231f (en: 'bottom right corner') - - "⌠": [T: "mitad superior de integral"] # 0x2320 (en: 'top half integral') - - "⌡": [T: "mitad inferior de integral"] # 0x2321 (en: 'bottom half integral') - - "⌱": [T: "ceño fruncido"] # 0x2322 (en: 'frown', google: 'fruncir el ceño') - - "⌣": [T: "sonrisa"] # 0x2323 (en: 'smile') - - "⌀": [T: "flecha arriba entre dos barras horizontales"] # 0x2324 (en: 'up arrowhead between two horizontal bars', google: 'arrowehead de flecha entre dos barras horizontales') - - "⌄": [T: "clave de opciĂłn"] # 0x2325 (en: 'option key', google translation) - - "〈": [T: "borrar hacia la derecha"] # 0x2326 (en: 'erase to the right', google translation) - - "⌧": [T: "x en un rectĂĄngulo"] # 0x2327 (en: 'x in a rectangle box', google translation) - - "⌹": [T: "teclado"] # 0x2328 (en: 'keyboard', google translation) - - "〈": [T: "parĂ©ntesis angular izquierdo"] # 0x2329 (en: 'left pointing angle bracket') - - "âŒȘ": [T: "parĂ©ntesis angular derecho"] # 0x232a (en: 'right pointing angle bracket') - - "⌫": [T: "borrar hacia la izquierda"] # 0x232b (en: 'erase to the left', google translation) - - "⌬": [T: "anillo de benceno"] # 0x232c (en: 'benzene ring', google translation) - - "⌭": [T: "cilindro"] # 0x232d (en: 'cylindricity') - - "⌼": [T: "perfil"] # 0x232e (en: 'all around profile', google: 'alrededor de perfil') - - "⌯": [T: "simetrĂ­a"] # 0x232f (en: 'symmetry', google translation) - - "⌰": [T: "desviaciĂłn total"] # 0x2330 (en: 'total runout', google translation) - - "⌱": [T: "origen de dimensiĂłn"] # 0x2331 (en: 'dimension origin', google translation) - - "âŒČ": [T: "cĂłnico cĂłnico"] # 0x2332 (en: 'conical taper', google translation) - - "⌳": [T: "pendiente"] # 0x2333 (en: 'slope', google translation) - - "⌮": [T: "contrataladro"] # 0x2334 (en: 'counterbore', google translation) - - "⌔": [T: "avellanador"] # 0x2335 (en: 'countersink', google translation) - - "⍰": [T: "interrogaciĂłn en caja"] # 0x2370 (en: 'unknown box', google: 'caja desconocida') - - "⎕": [T: "caja"] # 0x2395 (en: 'box', google translation) - - "⏞": [T: "corchete rotacional superior"] # 0x23DE (en: 'top brace') - - "⏟": [T: "corchete rotacional inferior"] # 0x23DF (en: 'bottom brace') - - "①-⑹": # 0x2460 - 0x2469 - - T: "corchete rotacional inferior" # (en: 'circled') - - spell: "translate('.', '①⑥⑹④⑀⑄⑊⑧⑚', '123456789')" - - "⑩": [T: "diez en un cĂ­rculo"] # 0x2469 (en: 'circled ten', google translation) - - "â‘Ș": [T: "once en un cĂ­rculo"] # 0x246a (en: 'circled eleven', google translation) - - "⑫": [T: "doce en un cĂ­rculo"] # 0x246b (en: 'circled twelve', google translation) - - "⑬": [T: "trece en un cĂ­rculo"] # 0x246c (en: 'circled thirteen', google translation) - - "⑭": [T: "catorce en un cĂ­rculo"] # 0x246d (en: 'circled fourteen', google translation) - - "⑼": [T: "quince en un cĂ­rculo"] # 0x246e (en: 'circled fifteen', google translation) - - "⑯": [T: "diecisĂ©is en un cĂ­rculo"] # 0x246f (en: 'circled sixteen', google translation) - - "⑰": [T: "diecisiete en un cĂ­rculo"] # 0x2470 (en: 'circled seventeen', google translation) - - "⑱": [T: "dieciocho en un cĂ­rculo"] # 0x2471 (en: 'circled eighteen', google translation) - - "⑱": [T: "diecinueve en un cĂ­rculo"] # 0x2471 (en: 'circled nineteen', google translation) - - "⑳": [T: "veinte en un cĂ­rculo"] # 0x2473 (en: 'circled twenty', google translation) - - "⑮-⑌": # 0x2474 - 0x247d - - T: "entre parĂ©ntesis" # (en: 'parenthesized', google translation) - - spell: "translate('.', '⑎⑔⑶⑷⑞â‘čâ‘ș⑻⑌', '123456789')" - - "⑜": [T: "diez entre parĂ©ntesis"] # 0x247d (en: 'parenthesized ten', google translation) - - "⑟": [T: "once entre parĂ©ntesis"] # 0x247e (en: 'parenthesized eleven', google translation) - - "⑿": [T: "doce entre parĂ©ntesis"] # 0x247f (en: 'parenthesized twelve', google translation) - - "⒀": [T: "trece entre parĂ©ntesis"] # 0x2480 (en: 'parenthesized thirteen', google translation) - - "⒁": [T: "catorce entre parĂ©ntesis"] # 0x2481 (en: 'parenthesized fourteen', google translation) - - "⒂": [T: "quince entre parĂ©ntesis"] # 0x2482 (en: 'parenthesized fifteen', google translation) - - "⒃": [T: "diecisĂ©is entre parĂ©ntesis"] # 0x2483 (en: 'parenthesized sixteen', google translation) - - "⒄": [T: "diecisiete entre parĂ©ntesis"] # 0x2484 (en: 'parenthesized seventeen', google translation) - - "⒅": [T: "dieciocho entre parĂ©ntesis"] # 0x2485 (en: 'parenthesized eighteen', google translation) - - "⒆": [T: "diecinueve entre parĂ©ntesis"] # 0x2486 (en: 'parenthesized nineteen', google translation) - - "⒇": [T: "veinte entre parĂ©ntesis"] # 0x2487 (en: 'parenthesized twenty', google translation) - - "⒈-⒐": # 0x2488 - 0x2491 - - spell: "translate('.', '⒈⒉⒊⒋⒌⒍⒎⒏⒐', '123456789')" - - T: "con periodo" # (en: 'with period', google translation) - - "⒑": [T: "diez con signo de periodo"] # 0x2491 (en: 'ten with period', google translation) - - "⒒": [T: "once con signo de periodo"] # 0x2492 (en: 'eleven with period', google translation) - - "⒓": [T: "doce con signo de periodo"] # 0x2493 (en: 'twelve with period', google translation) - - "⒔": [T: "trece con signo de periodo"] # 0x2494 (en: 'thirteen with period', google translation) - - "⒕": [T: "catorce con signo de periodo"] # 0x2495 (en: 'fourteen with period', google translation) - - "⒖": [T: "quince con signo de periodo"] # 0x2496 (en: 'fifteen with period', google translation) - - "⒗": [T: "diecisĂ©is con signo de periodo"] # 0x2497 (en: 'sixteen with period', google translation) - - "⒘": [T: "diecisiete con signo de periodo"] # 0x2498 (en: 'seventeen with period', google translation) - - "⒙": [T: "dieciocho con signo de periodo"] # 0x2499 (en: 'eighteen with period', google translation) - - "⒚": [T: "diecinueve con signo de periodo"] # 0x249a (en: 'nineteen with period', google translation) - - "⒛": [T: "veinte con signo de periodo"] # 0x249b (en: 'twenty with period', google translation) - - "⒜-â’”": # 0x249c - 0x24b5 - - T: "entre parĂ©ntesis" # (en: 'parenthesized', google translation) - - spell: "translate('.', 'â’œâ’â’žâ’Ÿâ’ â’Ąâ’ąâ’Łâ’€â’„â’Šâ’§â’šâ’©â’Șâ’«â’Źâ’­â’źâ’Żâ’°â’±â’Čâ’łâ’Žâ’”', 'abcdefghijklmnopqrstuvwxyz')" - - - "Ⓐ-Ⓩ": - - T: "dentro de uncĂ­rculo" # (en: 'circled', google translation) - - spell: "translate('.', 'â’¶â’·â’žâ’čâ’șâ’»â’Œâ’œâ’Ÿâ’żâ“€â“â“‚â“ƒâ“„â“…â“†â“‡â“ˆâ“‰â“Šâ“‹â“Œâ“â“Žâ“', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "🅐-đŸ…©": # 0x1f150 - 0x1f169 - - T: "dentro de un cĂ­rculo negro" # (en: 'black circled', google translation) - - spell: "translate('.', 'đŸ…đŸ…‘đŸ…’đŸ…“đŸ…”đŸ…•đŸ…–đŸ…—đŸ…˜đŸ…™đŸ…šđŸ…›đŸ…œđŸ…đŸ…žđŸ…ŸđŸ… đŸ…ĄđŸ…ąđŸ…ŁđŸ…€đŸ…„đŸ…ŠđŸ…§đŸ…šđŸ…©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "ⓐ-ⓩ": # 0x24d0 - 0x24e9 - - T: "dentro de un cĂ­rculo" # (en: 'circled', google translation) - - spell: "translate('.', 'â“â“‘â“’â““â“”â“•â“–â“—â“˜â“™â“šâ“›â“œâ“â“žâ“Ÿâ“ â“Ąâ“ąâ“Łâ“€â“„â“Šâ“§â“šâ“©', 'abcdefghijklmnopqrstuvwxyz')" - - "â“Ș": [T: "cero en un cĂ­rculo"] # 0x24ea (en: 'circled zero', google translation) - - "⓫": [T: "once en un cĂ­rculo negro"] # 0x24eb (google translation) - - "⓬": [T: "doce en un cĂ­rculo negro"] # 0x24ec (en: 'black circled twelve', google translation) - - "⓭": [T: "trece en un cĂ­rculo negro"] # 0x24ed (en: 'black circled thirteen', google translation) - - "⓼": [T: "catorce en un cĂ­rculo negro"] # 0x24ee (en: 'black circled fourteen', google translation) - - "⓯": [T: "quince en un cĂ­rculo negro"] # 0x24ef (en: 'black circled fifteen', google translation) - - "⓰": [T: "diecisĂ©is en un cĂ­rculo negro"] # 0x24f0 (en: 'black circled sixteen', google translation) - - "⓱": [T: "diecisiete en un cĂ­rculo negro"] # 0x24f1 (en: 'black circled seventeen', google translation) - - "â“Č": [T: "dieciocho en un cĂ­rculo negro"] # 0x24f2 (en: 'black circled eighteen', google translation) - - "⓳": [T: "diecinueve en un cĂ­rculo negro"] # 0x24f3 (en: 'black circled nineteen', google translation) - - "⓮": [T: "veinte en un cĂ­rculo negro"] # 0x24f4 (en: 'black circled twenty', google translation) - - "â“”-ⓜ": # 0x24f5 - 0x24fe - - T: "doble cĂ­rculo" # (en: 'double circled', google translation) - - spell: "translate('.', 'ⓔ⓶⓷ⓞâ“čâ“ș⓻Ⓦⓜ', '123456789')" - - "ⓟ": [T: "diez en un doble cĂ­rculo"] # 0x24fe (en: 'double circled ten', google translation) - - "⓿": [T: "cero en cĂ­rculo negro"] # 0x24ff (en: 'black circled zero', google translation) - - "■": [T: "cuadrado negro"] # 0x25a0 (en: 'black square') - - "□": [T: "cuadrado blanco"] # 0x25a1 (en: 'white square') - - "▱": [T: "cuadrado blanco con esquinas redondeadas"] # 0x25a2 (en: 'white square with rounded corners') - - "▣": [T: "cuadrado blanco que contiene cuadrado pequeño negro"] # 0x25a3 (en: 'white square containing small black square', google: 'cuadrado blanco que contiene un pequeño cuadrado negro') - - "â–€": [T: "cuadrado con relleno horizontal"] # 0x25a4 (en: 'square with horizontal fill') - - "â–„": [T: "cuadrado con relleno vertical"] # 0x25a5 (en: 'square with vertical fill') - - "▩": [T: "cuadrado con relleno octogonal de rayas"] # 0x25a6 (en: 'square with orthogonal crosshatch fill', google: 'cuadrado con relleno ortogonal de muñeca') - - "▧": [T: "cuadrado con la esquina superior izquierda hacia la parte derecha inferior del relleno"] # 0x25a7 (en: 'square with upper left to lower right fill', google: 'cuadrado con la parte superior izquierda a la parte inferior del relleno derecho') - - "▹": [T: "cuadrado con la parte superior derecha hacia la parte inferior izquierda del relleno"] # 0x25a8 (en: 'square with upper right to lower left fill', google: 'cuadrado con la parte superior derecha a la parte inferior izquierda del relleno') - - "▩": [T: "cuadrado con relleno diagonal rayado"] # 0x25a9 (en: 'square with diagonal crosshatch fill', google: 'cuadrado con relleno de shatch diagonal') - - "â–Ș": [T: "cuadrado pequeño negro"] # 0x25aa (en: 'black small square') - - "▫": [T: "cuadrado pequeño blanco"] # 0x25ab (en: 'white small square') - - "▬": [T: "rectĂĄngulo negro"] # 0x25ac (en: 'black rectangle') - - "▭": [T: "rectĂĄngulo blanco"] # 0x25ad (en: 'white rectangle') - - "▼": [T: "rectĂĄngulo relleno vertical"] # 0x25ae (en: 'black vertical rectangle') - - "▯": [T: "rectĂĄngulo vertical blanco"] # 0x25af (en: 'white vertical rectangle') - - "▰": [T: "paralelogramo negro"] # 0x25b0 (en: 'black parallelogram', google: 'paralelograma negro') - - "▱": [T: "paralelogramo blanco"] # 0x25b1 (en: 'white parallelogram') - - "â–Č": [T: "triĂĄngulo negro apuntando hacia arriba"] # 0x25b2 (en: 'black up pointing triangle') - - "△": [T: "triĂĄngulo blanco apuntando hacia arriba"] # 0x25b3 (en: 'white up pointing triangle') - - "▮": [T: "triĂĄngulo negro pequeño apuntando hacia arriba"] # 0x25b4 (en: 'black up pointing small triangle') - - "â–”": [T: "triĂĄngulo blanco pequeño apuntando hacia arriba"] # 0x25b5 (en: 'white up pointing small triangle') - - "▶": [T: "triĂĄngulo negro apuntando hacia la derecha"] # 0x25b6 (en: 'black right pointing triangle') - - "▷": [T: "triĂĄngulo blanco apuntando hacia la derecha"] # 0x25b7 (en: 'white right pointing triangle') - - "▾": [T: "triĂĄngulonegro pequeño apuntando hacia la derecha"] # 0x25b8 (en: 'black right pointing small triangle') - - "â–č": [T: "triĂĄngulo blanco pequeño apuntando hacia la derecha"] # 0x25b9 (en: 'white right pointing small triangle') - - "â–ș": [T: "indicador negro apuntando a la derecha"] # 0x25ba (en: 'black right pointing pointer', google: 'puntero de punta derecha negra') - - "▻": [T: "indicador blanco apuntando hacia la derecha"] # 0x25bb (en: 'white right pointing pointer', google: 'puntero de punta derecha blanca') - - "â–Œ": [T: "triĂĄngulo negro apuntando hacia abajo"] # 0x25bc (en: 'black down pointing triangle') - - "â–œ": [T: "triĂĄngulo blanco apuntando hacia abajo"] # 0x25bd (en: 'white down pointing triangle') - - "â–Ÿ": [T: "pequeño triĂĄngulo negro apuntando hacia abajo"] # 0x25be (en: 'black down pointing small triangle') - - "▿": [T: "triĂĄngulo pequeño blanco apuntando hacia abajo"] # 0x25bf (en: 'white down pointing small triangle') - - "◀": [T: "triĂĄngulo negro apuntando hacia la izquierda"] # 0x25c0 (en: 'black left pointing triangle') - - "◁": [T: "triĂĄngulo blanco apuntando hacia la izquierda"] # 0x25c1 (en: 'white left pointing triangle') - - "◂": [T: "pequeño triĂĄngulo negro apuntando hacia la izquierda izquierda"] # 0x25c2 (en: 'black left pointing small triangle') - - "◃": [T: "pequeño triĂĄngulo blanco apuntando hacia la izquierda"] # 0x25c3 (en: 'white left pointing small triangle') - - "◄": [T: "puntero negro apuntando hacia la izquierda"] # 0x25c4 (en: 'black left pointing pointer') - - "◅": [T: "puntero blanco apuntando hacia la izquierda"] # 0x25c5 (en: 'white left pointing pointer') - - "◆": [T: "rombo negro"] # 0x25c6 (en: 'black diamond') - - "◇": [T: "rombo blanco"] # 0x25c7 (en: 'white diamond') - - "◈": [T: "rombo blanco contiene rombo pequeño negro"] # 0x25c8 (en: 'white diamond containing black small diamond') - - "◉": [T: "ojo de pez"] # 0x25c9 (en: 'fisheye') - - "◊": [T: "rombo"] # 0x25ca (en: 'lozenge') - - "○": [T: "cĂ­rculo blanco"] # 0x25cb (en: 'white circle') - - "◌": [T: "cĂ­rculo punteado"] # 0x25cc (en: 'dotted circle') - - "◍": [T: "cĂ­rculo con relleno vertical"] # 0x25cd (en: 'circle with vertical fill') - - "◎": [T: "diana"] # 0x25ce (en: 'bullseye') - - "●": [T: "cĂ­rculo negro"] # 0x25cf (en: 'black circle') - - "◐": [T: "cĂ­rculo con mitad izquierda negra"] # 0x25d0 (en: 'circle with left half black') - - "◑": [T: "cĂ­rculo con mitad derecha negra"] # 0x25d1 (en: 'circle with right half black') - - "◒": [T: "cĂ­rculo con mitad inferior negra"] # 0x25d2 (en: 'circle with lower half black') - - "◓": [T: "cĂ­rculo con mitad superior negra"] # 0x25d3 - - "◔": [T: "cĂ­rculo con cuadrante superior derecho relleno"] # 0x25d4 (en: 'circle with upper right quadrant black') - - "◕": [T: "cĂ­rculo con cuadrante superior izquierdo negro"] # 0x25d5 (en: 'circle with all but upper left quadrant black') - - "◖": [T: "semicĂ­rculo izquierdo negro"] # 0x25d6 (en: 'left half black circle') - - "◗": [T: "semicĂ­rculo derecho negro"] # 0x25d7 (en: 'right half black circle') - - "◘": [T: "viñeta inversa"] # 0x25d8 (en: 'inverse bullet') - - "◙": [T: "cĂ­rculo blanco inverso"] # 0x25d9 (en: 'inverse white circle') - - "◚": [T: "semicĂ­rculo superior blanco inverso"] # 0x25da (en: 'upper half inverse white circle') - - "◛": [T: "semicĂ­rculo inferior blanco inverso"] # 0x25db (en: 'lower half inverse white circle') - - "◜": [T: "cuadrante superior izquierdo arco circular"] # 0x25dc (en: 'upper left quadrant circular arc') - - "◝": [T: "cuadrante superior derecho arco circular"] # 0x25dd (en: 'upper right quadrant circular arc') - - "◞": [T: "cuadrante inferior derecho arco circular"] # 0x25de (en: 'lower right quadrant circular arc') - - "◟": [T: "cuadrante inferior izquierdo arco circular"] # 0x25df (en: 'lower left quadrant circular arc') - - "◠": [T: "semicĂ­rculo superior"] # 0x25e0 (en: 'upper half circle') - - "◡": [T: "semicĂ­rculo inferior"] # 0x25e1 (en: 'lower half circle') - - "◱": [T: "triĂĄngulo inferior derecha relleno"] # 0x25e2 (en: 'black lower right triangle') - - "◣": [T: "triĂĄngulo negro inferior izquierdo"] # 0x25e3 (en: 'black lower left triangle') - - "â—€": [T: "triĂĄngulo negro superior izquierdo"] # 0x25e4 (en: 'black upper left triangle') - - "â—„": [T: "triĂĄngulo negro superior derecho"] # 0x25e5 (en: 'black upper right triangle') - - "◩": [T: "composiciĂłn"] # 0x25e6 (en: 'composition') - - "◧": [T: "cuadrado con mitad izquierda negra"] # 0x25e7 (en: 'square with left half black') - - "◹": [T: "cuadrado con mitad derecha negra"] # 0x25e8 (en: 'square with right half black') - - "◩": [T: "cuadrado con mitad superior izquierda negra"] # 0x25e9 (en: 'square with upper left half black') - - "â—Ș": [T: "cuadrado con mitad inferior derecha negra"] # 0x25ea (en: 'square with lower right half black') - - "◫": [T: "cuadrado blanco con bisectriz"] # 0x25eb (en: 'white square with bisecting line') - - "◬": [T: "triĂĄngulo blanco apuntando hacia arriba con punto"] # 0x25ec (en: 'white up pointing triangle with dot') - - "◭": [T: "triĂĄngulo apuntando hacia arriba con mitad izquierda negra"] # 0x25ed (en: 'up pointing triangle with left half black') - - "◼": [T: "triĂĄngulo apuntando hacia arriba con mitad derecha negra"] # 0x25ee (en: 'up pointing triangle with right half black') - - "◯": [T: "cĂ­rculo grande"] # 0x25ef (en: 'large circle') - - "◰": [T: "cuadrado blanco con cuadrante superior izquierdo"] # 0x25f0 (en: 'white square with upper left quadrant') - - "◱": [T: "cuadrado blanco con cuadrante inferior izquierdo"] # 0x25f1 (en: 'white square with lower left quadrant') - - "â—Č": [T: "cuadrado blanco con cuadrante inferior derecho"] # 0x25f2 (en: 'white square with lower right quadrant') - - "◳": [T: "cuadrado blanco con cuadrante superior derecho"] # 0x25f3 (en: 'white square with upper right quadrant') - - "◮": [T: "cĂ­rculo blanco con cuadrante superior izquierdo"] # 0x25f4 (en: 'white circle with upper left quadrant') - - "â—”": [T: "cĂ­rculo blanco con cuadrante inferior izquierdo"] # 0x25f5 (en: 'white circle with lower left quadrant') - - "◶": [T: "cĂ­rculo blanco con cuadrante inferior derecho"] # 0x25f6 (en: 'white circle with lower right quadrant') - - "◷": [T: "cĂ­rculo blanco con cuadrante superior derecho"] # 0x25f7 (en: 'white circle with upper right quadrant', google: 'cĂ­rculo blanco con cuadrante superior derecha') - - "◾": [T: "triĂĄngulo superior izquierdo"] # 0x25f8 (en: 'upper left triangle') - - "â—č": [T: "triĂĄngulo superior derecho"] # 0x25f9 (en: 'upper right triangle') - - "â—ș": [T: "triĂĄngulo inferior izquierda"] # 0x25fa (en: 'lower left triangle') - - "◻": [T: "cuadrado blanco mediano"] # 0x25fb (en: 'white medium square') - - "â—Œ": [T: "cuadrado negro mediano"] # 0x25fc (en: 'black medium square') - - "â—œ": [T: "cuadrado pequeño medianamente vacĂ­o"] # 0x25fd (en: 'white medium small square') - - "â—Ÿ": [T: "cuadrado pequeño medianamente lleno"] # 0x25fe (en: 'black medium small square') - - "◿": [T: "triĂĄngulo inferior derecho"] # 0x25ff (en: 'lower right triangle') - - "♠": [T: "picas"] # 0x2660 (google: 'traje de pala negro') - - "♡": [T: "corazones"] # 0x2661 (google: 'traje de corazĂłn blanco') - - "♱": [T: "diamantes"] # 0x2662 (google: 'traje de diamante blanco') - - "♣": [T: "trĂ©bol"] # 0x2663 (google: 'traje de club negro') - - "♀": [T: "picas"] # 0x2664 (google: 'traje de pala blanca') - - "♄": [T: "corazones"] # 0x2665 (google: 'traje de corazĂłn negro') - - "♩": [T: "diamantes"] # 0x2666 (google: 'traje de diamante negro') - - "♧": [T: "trĂ©bol"] # 0x2667 (google: 'traje de club blanco') - - "❚": [T: "ornamento en parĂ©ntesis mediano izquierdo"] # 0x2768 (en: 'medium left parentheses ornament', google: 'medio de la parĂ©ntesis de la izquierda adorno') - - "❩": [T: "ornamento en parĂ©ntesis mediano derecho"] # 0x2769 (en: 'medium right parentheses ornament', google: 'medio derecho a la derecha del adorno') - - "âȘ": [T: "ornamento en parĂ©ntesis izquierdo medio aplanado"] # 0x276a (en: 'medium flattened left parentheses ornament', google: 'medio aplanado a la izquierda parĂ©ntesis de adornos') - - "❫": [T: "ornamento en parĂ©ntesis derecho medio aplanado"] # 0x276b (en: 'medium flattened right parentheses ornament', google: 'medio aplanado a la derecha parĂ©ntesis de adornos') - - "❬": [T: "ornamento en soporte de ĂĄngulo medio apuntando hacia la izquierda"] # 0x276c (en: 'medium left-pointing angle bracket ornament', google: 'ornamento de soporte de ĂĄngulo de punta izquierda mediana') - - "❭": [T: "ornamento en soporte de ĂĄngulo medio apuntando hacia la derecha"] # 0x276d (en: 'medium right-pointing angle bracket ornament', google: 'ornamento de soporte de ĂĄngulo de punta derecha mediana') - - "❼": [T: "ornamento en comillas en el ĂĄngulo que apunta hacia la izquierda"] # 0x276e (en: 'heavy left-pointing angle quotation mark ornament', google: 'ornamento de cita de ĂĄngulo de punta izquierda pesada') - - "❯": [T: "ornamento en comillas en el ĂĄngulo recto que apunta hacia la derecha"] # 0x276f (en: 'heavy right-pointing angle quotation mark ornament', google: 'ornamento de cita de cita de ĂĄngulo derecho pesado') - - "❰": [T: "ornamento en soporte del ĂĄngulo que apunta a la izquierda"] # 0x2770 (en: 'heavy left-pointing angle bracket ornament', google: 'adorno de soporte de ĂĄngulo izquierdo pesado') - - "❱": [T: "ornamento en soporte del ĂĄngulo que apunta hacia la derecha"] # 0x2771 (en: 'heavy right-pointing angle bracket ornament', google: 'ornamento de soporte de ĂĄngulo de punta derecha pesada') - - "âČ": [T: "ornamento en soporte de concha de tortuga a la izquierda"] # 0x2772 (en: 'light left tortoise shell bracket ornament', google: 'ornamento de soporte de concha de tortuga de luz') - - "❳": [T: "ornamento en corchete derecho de concha de tortuga hacia la derecha"] # 0x2773 (en: 'light right tortoise shell bracket ornament', google: 'ornamento de soporte de carcasa de tortuga ligera') - - "❎": [T: "ornamento en soporte izquierdo mediano"] # 0x2774 (en: 'medium left brace ornament', google: 'ornamento de brace izquierdo mediano') - - "❔": [T: "ornamento en soporte derechomediano"] # 0x2775 (en: 'medium right brace ornament', google: 'ornamento de aparato ortopĂ©dico medio derecho') - - "❶": [T: "cĂ­rculo negro rodeando uno"] # 0x2776 (en: 'black circled one', google translation) - - "❷": [T: "cÂŽriculo negro rodeando dos"] # 0x2777 (en: 'black circled two', google translation) - - "❞": [T: "cĂ­rculo negro rodeando tres"] # 0x2778 (en: 'black circled three', google translation) - - "âč": [T: "cĂ­rculo negro rodeando cuatro"] # 0x2779 (en: 'black circled four', google translation) - - "âș": [T: "cĂ­rculo negro rodeando cinco"] # 0x277a (en: 'black circled five', google translation) - - "❻": [T: "cĂ­rculo negro rodeando seis"] # 0x277b (en: 'black circled six', google translation) - - "❌": [T: "cĂ­rculo negro rodeando siete"] # 0x277c (en: 'black circled seven', google translation) - - "❜": [T: "cĂ­rculo negro rodeando ocho"] # 0x277d (en: 'black circled eight', google translation) - - "❟": [T: "cĂ­rculo negro rodeando nueve"] # 0x277e (en: 'black circled nine', google translation) - - "❿": [T: "cĂ­rculo negro rodeando diez"] # 0x277f (en: 'black circled ten', google translation) - - "➀": [T: "cĂ­rculo rodeando sans serif uno"] # 0x2780 (en: 'circled sans serif one', google translation) - - "➁": [T: "cĂ­rculo rodeando sans serif dos"] # 0x2781 (en: 'circled sans serif two', google translation) - - "➂": [T: "cĂ­rculo rodeando sans serif tres"] # 0x2782 (en: 'circled sans serif three', google translation) - - "➃": [T: "cĂ­rculo rodeando sans serif cuatro"] # 0x2783 (en: 'circled sans serif four', google translation) - - "➄": [T: "cĂ­rculo rodeando sans serif cinco"] # 0x2784 (en: 'circled sans serif five', google translation) - - "➅": [T: "cĂ­rculo rodeando sans serif seis"] # 0x2785 (en: 'circled sans serif six', google translation) - - "➆": [T: "cĂ­rculo rodeando sans serif siete"] # 0x2786 (en: 'circled sans serif seven', google translation) - - "➇": [T: "cĂ­rculo rodeando sans serif ocho"] # 0x2787 (en: 'circled sans serif eight', google translation) - - "➈": [T: "cĂ­rculo rodeando sans serif nueve"] # 0x2788 (en: 'circled sans serif nine', google translation) - - "➉": [T: "cĂ­rculo rodeando sans serif diez"] # 0x2789 (en: 'circled sans serif ten', google translation) - - "➊": [T: "cĂ­rculo negro rodeando sans serif uno"] # 0x278a (google translation) - - "➋": [T: "cĂ­rculo negro rodeando sans serif dos"] # 0x278b (en: 'black circled sans serif two', google translation) - - "➌": [T: "cĂ­rculo negro rodeando sans serif tres"] # 0x278c (en: 'black circled sans serif three', google translation) - - "➍": [T: "cĂ­rculo negro rodeando sans serif cuatro"] # 0x278d (google translation) - - "➎": [T: "cĂ­rculo negro rodeando sans serif cinco"] # 0x278e (google translation) - - "➏": [T: "cĂ­rculo negro rodeando sans serif seis"] # 0x278f (google translation) - - "➐": [T: "cĂ­rculo negro rodeando sans serif siete"] # 0x2790 (google translation) - - "➑": [T: "cĂ­rculo negro rodeando sans serif ocho"] # 0x2791 (en: 'black circled sans serif eight', google translation) - - "➒": [T: "cĂ­rculo negro rodeando sans serif nueve"] # 0x2792 (google translation) - - "➓": [T: "cĂ­rculo negro rodeando sans serif diez"] # 0x2793 (google translation) - - "➔": [T: "flecha hacia la derecha con cabeza ancha"] # 0x2794 (en: 'heavy wide-headed rightwards arrow', google: 'a la cabeza ancha de cabeza ancha') - - "➕": [T: "signo mĂĄs"] # 0x2795 (en: 'heavy plus sign', google: 'señal de plus plus') - - "➖": [T: "signo menos"] # 0x2796 (en: 'heavy minus sign', google: 'fuerte señal menos') - - "➗": [T: "signo de dividir"] # 0x2797 (en: 'heavy division sign', google: 'señal de divisiĂłn pesada') - - "➘": [T: "flecha gruesa hacia el sudeste"] # 0x2798 (en: 'heavy south east arrow', google: 'heavy south east arrow') - - "➙": [T: "flecha gruesa hacia la derecha"] # 0x2799 (en: 'heavy rightwards arrow', google: 'flecha pesada hacia la derecha') - - "➚": [T: "flecha gruesa hacia el nordeste"] # 0x279a (en: 'heavy north east arrow', google: 'heavy north east arrow') - - "➛": [T: "flecha hacia la derecha con punto centrado"] # 0x279b (en: 'drafting point rightwards arrow', google: 'punto de redacciĂłn arrow hacia la derecha') - - "➜": [T: "flecha hacia la derecha con punta gruesa y redonda"] # 0x279c (en: 'heavy round-tipped rightwards arrow', google: 'arrow de la derecha pesada con punta redonda') - - "➝": [T: "flecha hacia la derecha con cabeza triangular"] # 0x279d (en: 'triangle-headed rightwards arrow', google: 'arrow de cabeza de triĂĄngulo') - - "➞": [T: "flecha hacia la derecha con cabeza gruesa triangular"] # 0x279e (en: 'heavy triangle-headed rightwards arrow', google: 'arrow de cabeza de triĂĄngulo pesado hacia el triĂĄngulo') - - "➟": [T: "flecha discontinua hacia la derecha de cabeza triangular"] # 0x279f (en: 'dashed triangle-headed rightwards arrow', google: 'arrow de cabeza de triĂĄngulo discontinua') - - "➠": [T: "flecha gruesa derecha discontinua con cabeza triangular"] # 0x27a0 (en: 'heavy dashed triangle-headed rightwards arrow', google: 'arrow de cabeza de triĂĄngulo pesado con cabeza de triĂĄngulo') - - "➡": [T: "flecha negra hacia la derecha"] # 0x27a1 (en: 'black rightwards arrow', google: 'negra flecha derecha hacia la derecha') - - "➱": [T: "flecha hacia la derecha tres d en parte superior"] # 0x27a2 (en: 'three d top lighted rightwards arrow', google: 'tres d top iluminados con flecha hacia la derecha') - - "➣": [T: "flecha hacia la derecha tres d en parte inferior en tres dimensiones"] # 0x27a3 (en: 'three d bottom lighted rightwards arrow', google: 'tres d de fondo iluminado hacia la derecha') - - "➀": [T: "punta de flecha negra hacia la derecha"] # 0x27a4 (en: 'black rightwards arrowhead', google: 'black rightwards arrowhead') - - "➄": [T: "flecha gruesa y negra curvada hacia la derecha y hacia abajo"] # 0x27a5 (en: 'heavy black curved downwards and rightwards arrow', google: 'negro pesado curvado hacia abajo y flecha derecha') - - "➊": [T: "flecha gruesa y negra curvada hacia la derecha y hacia arriba"] # 0x27a6 (en: 'heavy black curved upwards and rightwards arrow', google: 'negro pesado curvado hacia arriba y flecha hacia la derecha') - - "➧": [T: "flecha negra corta hacia la derecha"] # 0x27a7 (en: 'squat black rightwards arrow', google: 'corta la flecha negra a la derecha') - - "➚": [T: "flecha negra hacia la derecha con punta cĂłncava"] # 0x27a8 (en: 'heavy concave-pointed black rightwards arrow', google: 'flecha negra cĂłncava pesada pesada hacia la derecha') - - "➩": [T: "flecha hacia la derecha sombreada en la parte derecha"] # 0x27a9 (en: 'right-shaded white rightwards arrow', google: 'flecha blanca a la derecha de sombreado derecho') - - "âžȘ": [T: "flecha blanca hacia la derecha sombreada en la parte izquierda"] # 0x27aa (en: 'left-shaded white rightwards arrow', google: 'flecha blanca a la derecha de sombreado izquierdo') - - "➫": [T: "flecha blanca hacia la derecha con sonbra inclinada hacia la parte posterior"] # 0x27ab (en: 'bck-tilted shadowed white rightwards arrow', google: 'flecha blanca a la derecha en la espalda') - - "➬": [T: "flecha blanca hacia la derecha con sombra inclinada hacia la parte anterior"] # 0x27ac (en: 'front-tilted shadowed white rightwards arrow', google: 'flecha blanca a la derecha sombreada en la sombra frontal') - - "➭": [T: "flecha gruesa inferior hacia la derecha sombreada en la parte derecha"] # 0x27ad (en: 'heavy lower right-shadowed white rightwards arrow', google: 'flecha blanca hacia la derecha inferior derecha pesada') - - "➼": [T: "flecha gruesa superior hacia la derecha sombreada en la parte derecha"] # 0x27ae (en: 'heavy upper right-shadowed white rightwards arrow', google: 'flecha blanca hacia la derecha de la parte superior derecha pesada') - - "➯": [T: "flecha escopleada inferior hacia la derecha sombreada en la parte derecha"] # 0x27af (en: 'notched lower right-shadowed white rightwards arrow', google: 'muesca con muescas de la flecha blanca a la derecha de la derecha inferior') - - "➱": [T: "flecha escopleada superior hacia la derecha sombreada en la parte derecha"] # 0x27b1 (en: 'notched upper right-shadowed white rightwards arrow', google: 'arrow blanca de sombra superior derecha con muescas de la parte superior') - - "âžČ": [T: "flecha blanca hacia la derecha rodeada por un cĂ­rculo grueso"] # 0x27b2 (en: 'circled heavy white rightwards arrow', google: 'flecha de color blanco pesado con rodajas') - - "➳": [T: "flecha hacia la derecha con pluma blanca"] # 0x27b3 (en: 'white-feathered rightwards arrow', google: 'flecha derecha de plumas blancas') - - "➮": [T: "flecha sudeste con pluma negra"] # 0x27b4 (en: 'black-feathered south east arrow', google: 'flecha del sureste de plumas negras') - - "➔": [T: "flecha hacia la derecha con pluma negra"] # 0x27b5 (en: 'black-feathered rightwards arrow', google: 'flecha derecha de plumas negras') - - "➶": [T: "flecha nordeste con pluma negra"] # 0x27b6 (en: 'black-feathered north east arrow', google: 'flecha del noreste de plumas negras') - - "➷": [T: "flecha sudeste con pluma negra y gruesa"] # 0x27b7 (en: 'heavy black-feathered south east arrow', google: 'pesada flecha del sureste de plumas negras') - - "➾": [T: "flecha hacia la derecha con pluma gruesa y negra"] # 0x27b8 (en: 'heavy black-feathered rightwards arrow', google: 'flecha pesada de plumas negras hacia la derecha') - - "âžč": [T: "flecha nordeste con pluma negra y gruesa"] # 0x27b9 (en: 'heavy black-feathered north east arrow', google: 'pesada flecha del noreste de plumas negras') - - "âžș": [T: "flecha hacia la derecha con punta en forma de lĂĄgrima"] # 0x27ba (en: 'teradrop-barbed rightwards arrow', google: 'teradrop-barbed rightwards arrow') - - "➻": [T: "flecha hacia la derecha con punta en forma de lĂĄgrima"] # 0x27bb (en: 'heavy teardrop-shanked rightwards arrow', google: 'arrow a la derecha de la lĂĄgrima pesada hacia la lĂĄgrima') - - "➌": [T: "flecha hacia la derecha con cola de cuña"] # 0x27bc (en: 'wedge-tailed rightwards arrow', google: 'arrow de cola de cola de cuña') - - "➜": [T: "flecha hacia la derecha con cola de cuña gruesa"] # 0x27bd (en: 'heavy wedge-tailed rightwards arrow', google: 'flecha de cola de cuña pesada') - - "➟": [T: "flecha abierta delineada hacia fuera"] # 0x27be (en: 'open-outlined rightwards arrow', google: 'abra por la flecha de la derecha abierta') - - "⟀": [T: "ĂĄngulo tridimensional"] # 0x27c0 (en: 'three dimensional angle') - - "⟁": [T: "triĂĄngulo blanco conteniendo triĂĄngulo pequeño y blanco"] # 0x27c1 (en: 'white triangle containing small white triangle') - - "⟂": # 0x27c2 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "perpendicular a" # (en: 'perpendicular to') - - "⟃": # 0x27c3 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "un subconjunto de" # (en: 'an open subset of') - - "⟄": # 0x27c4 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "un subconjunto de" # (en: 'an open superset of') - - "⟅": [T: "sĂ­mbolo delimitador con forma de s inversa"] # 0x27c5 (en: 'left s-shaped bag delimiter') - - "⟆": [T: "sĂ­mbolo delimitador con forma de s"] # 0x27c6 (en: 'right s-shaped bag delimiter') - - "⟇": [T: "o con punto en el interior"] # 0x27c7 (en: 'or with dot inside') - - "⟈": [T: "solidus inverso precediendo subconjunto"] # 0x27c8 (en: 'reverse solidus preceding subset') - - "⟉": [T: "superconjunto precediendo solidus"] # 0x27c9 (en: 'superset preceding solidus') - - "⟊": [T: "barra vertical con trazo horizontal"] # 0x27ca (en: 'vertical bar with horizontal stroke') - - "⟋": [T: "diagonal ascendiente"] # 0x27cb (en: 'mathematical rising diagonal', google: 'diagonal matemĂĄtica en ascenso') - - "⟌": [T: "divisiĂłn larga"] # 0x27cc (en: 'long division') - - "⟍": [T: "diagonal descendente"] # 0x27cd (en: 'mathematical falling diagonal', google: 'diagonal de caĂ­da matemĂĄtica') - - "⟎": [T: "cuadrado LĂłgico Y"] # 0x27ce (en: 'squared logical and', google: 'cuadrado lĂłgico y') - - "⟏": [T: "cuadrado LĂłgico O"] # 0x27cf (en: 'squared logical or', google: 'cuadrado lĂłgico o') - - "⟐": [T: "diamante blanco con punto centrado"] # 0x27d0 (en: 'white diamond with centered dot') - - "⟑": [T: "y con punto interior"] # 0x27d1 (en: 'and with dot') - - "⟒": [T: "elemento de apertura hacia arriba"] # 0x27d2 (en: 'element of opening upwards') - - "⟓": [T: "esquina inferior derecha con punto"] # 0x27d3 (en: 'lower right corner with dot') - - "⟔": [T: "esquina superior izquierda con punto"] # 0x27d4 (en: 'upper left corner with dot') - - "⟕": [T: "uniĂłn exterior izquierda"] # 0x27d5 (en: 'left outer join') - - "⟖": [T: "uniĂłn exterior derecha"] # 0x27d6 (en: 'right outer join') - - "⟗": [T: "uniĂłn exterior llena de"] # 0x27d7 (en: 'full outer join') - - "⟘": [T: "perpendicular inversa"] # 0x27d8 (en: 'large up tack') - - "⟙": [T: "perpendicular"] # 0x27d9 (en: 'large down tack') - - "⟚": [T: "izquierdo y derecho doble torniquete"] # 0x27da (en: 'left and right double turnstile') - - "⟛": [T: "doble T horizontal"] # 0x27db (en: 'left and right tack') - - "⟜": [T: "multifunciĂłn por la izquierda"] # 0x27dc (en: 'left multimap') - - "⟝": [T: "t horizontal derecha"] # 0x27dd (en: 'long right tack', MathPlayer: 'T horizontal derecha larga', google: 'tachuela a la derecha larga') - - "⟞": [T: "t horizontal izquierda"] # 0x27de (en: 'long left tack', MathPlayer: 'T horizontal izquierda larga', google: 'tĂĄctica izquierda larga') - - "⟟": [T: "perpendicular inversa con cĂ­rculo arriba"] # 0x27df (en: 'up tack with circle above') - - "⟠": [T: "rombo dividido por regla horizontal"] # 0x27e0 (en: 'lozenge divided by horizontal rule') - - "⟡": [T: "rombo blanco cĂłncavo"] # 0x27e1 (en: 'white concave sided diamond') - - "⟱": [T: "rombo blanco cĂłncavo con marca hacia la izquierda"] # 0x27e2 (en: 'white concave sided diamond with leftwards tick') - - "⟣": [T: "rombo cĂłncavo con marca hacia la derecha"] # 0x27e3 (en: 'white concave sided diamond with rightwards tick') - - "⟀": [T: "cuadrado blanco con marca hacia la izquierda"] # 0x27e4 (en: 'white square with leftwards tick') - - "⟄": [T: "cuadrado blanco con marca hacia la derecha"] # 0x27e5 (en: 'white square with rightwards tick') - - "⟩": [T: "abrir corchete"] # 0x27e6 (en: 'left white square bracket') - - "⟧": [T: "cerrar corchete"] # 0x27e7 (en: 'right white square bracket') - - "⟹": [T: "soporte angular izquierdo"] # 0x27e8 (en: 'left angle bracket') - - "⟩": [T: "soporte angular derecho"] # 0x27e9 (en: 'right angle bracket') - - "âŸȘ": [T: "doble corchetehacia la izquierda"] # 0x27ea (en: 'left double angle bracket') - - "⟫": [T: "doble corchete hacia la derecha"] # 0x27eb (en: 'right double angle bracket') - - "⟬": [T: "corchete blanco hacia la izquierda con concha de tortuga"] # 0x27ec (en: 'left white tortoise shell bracket') - - "⟭": [T: "corchete blanco hacia la derecha con concha de tortuga"] # 0x27ed (en: 'right white tortoise shell bracket', MathPlayer: 'corchete de tortuga vacĂ­o derecho', google: 'soporte de carcasa de tortuga blanca derecha') - - "⟼": [T: "parĂ©ntesis plano izquierdo"] # 0x27ee (en: 'left flattened parenthesis') - - "⟯": [T: "parĂ©ntesis plano derecho"] # 0x27ef (en: 'right flattened parenthesis') - - "⟰": [T: "flecha cuĂĄdruple hacia arriba"] # 0x27f0 (en: 'upwards quadruple arrow') - - "⟱": [T: "flecha cuĂĄdruple hacia abajo"] # 0x27f1 (en: 'downwards quadruple arrow') - - "âŸČ": [T: "flecha circular vacĂ­a en sentido contrario a las agujas del reloj"] # 0x27f2 (en: 'anticlockwise gapped circle arrow') - - "⟳": [T: "flecha circular vacĂ­a en sentido a las agujas del reloj"] # 0x27f3 (en: 'clockwise gapped circle arrow') - - "⟮": [T: "flecha hacia la derecha con signo mĂĄs rodeado por un cĂ­rculo"] # 0x27f4 (en: 'right arrow with circled plus') - - "⟔": [T: "flecha larga hacia la izquierda"] # 0x27f5 (en: 'long leftwards arrow') - - "⟶": [T: "flecha larga hacia la derecha"] # 0x27f6 (en: 'long rightwards arrow') - - "⟷": [T: "flecha larga hacia izquierda y derecha"] # 0x27f7 (en: 'long left right arrow') - - "⟾": [T: "doble flecha larga hacia la izquierda"] # 0x27f8 (en: 'long leftwards double arrow') - - "âŸč": [T: "doble flecha larga hacia la derecha"] # 0x27f9 (en: 'long rightwards double arrow') - - "âŸș": [T: "doble flecha larga hacia izquierda y derecha"] # 0x27fa (en: 'long left right double arrow') - - "⟻": [T: "flecha larga hacia la izquierda partiendo de una barra"] # 0x27fb (en: 'long leftwards arrow from bar') - - "⟌": [T: "flecha larga hacia la derecha partiendo de una barra"] # 0x27fc (en: 'long rightwards arrow from bar') - - "⟜": [T: "doble flecha larga hacia la izquierda partiendo de una barra"] # 0x27fd (en: 'long leftwards double arrow from bar') - - "⟟": [T: "doble flecha larga hacia la derecha partiendo de una barra"] # 0x27fe (en: 'long rightwards double arrow from bar') - - "⟿": [T: "flecha ondulada hacia la derecha"] # 0x27ff (en: 'long rightwards squiggle arrow') - - " ": [T: "flecha de dos cabezas hacia la derecha con trazo vertical"] # 0x2900 (en: 'rightwards two headed arrow with vertical stroke', google: 'derecho de dos flechas con trazo vertical') - - " ": [T: "flecha de dos cabezas hacia la derecha con doble trazo vertical"] # 0x2901 (en: 'rightwards two headed arrow with double vertical stroke', google: 'derecho de dos flechas con cabeza de carrera vertical doble') - - " ": [T: "doble flecha hacia la izquierda con trazo vertical"] # 0x2902 (en: 'leftwards double arrow with vertical stroke', google: 'flecha doble hacia la izquierda con carrera vertical') - - " ": [T: "doble flecha hacia la derecha con trazo vertical"] # 0x2903 (en: 'rightwards double arrow with vertical stroke', google: 'arrow doble hacia la derecha con trazo vertical') - - " ": [T: "doble flecha hacia izquierda y derecha con trazo vertical"] # 0x2904 (en: 'left right double arrow with vertical stroke', google: 'flecha doble derecha izquierda con carrera vertical') - - " ": [T: "flecha de dos cabezas hacia la derecha partiendo de una barra"] # 0x2905 - - " ": [T: "doble flecha hacia la izquierda partiendo de una barra"] # 0x2906 (en: 'leftwards double arrow from bar', google: 'flecha doble a la izquierda desde el bar') - - " ": [T: "flecha doble hacia la derecha partiendo de una barra"] # 0x2907 (en: 'rightwards double arrow from bar', google: 'arrow doble hacia la derecha desde el bar') - - " ": [T: "flecha hacia abajo con trazo horizontal"] # 0x2908 (en: 'downwards arrow with horizontal stroke') - - " ": [T: "flecha hacia arriba con trazo horizontal"] # 0x2909 (en: 'upwards arrow with horizontal stroke', google: 'arrow hacia arriba con trazo horizontal') - - " ": [T: "triple flecha hacia arriba"] # 0x290a (en: 'upwards triple arrow', google: 'arriba de arriba arriba') - - "​": [T: "triple flecha hacia abajo"] # 0x290b (en: 'downwards triple arrow', google: 'aleja hacia abajo') - - "‌": [T: "flecha doble discontinua hacia la izquierda"] # 0x290c - - "‍": [T: "doble flecha discontinua hacia la derecha"] # 0x290d - - "‎": [T: "triple flecha discontinua hacia la izquierda"] # 0x290e - - "‏": [T: "triple flecha discontinua hacia la derecha"] # 0x290f - - "‐": [T: "triple flecha discontinua con dos cabezas hacia la derecha"] # 0x2910 - - "‑": [T: "flecha hacia la derecha con trazo punteado"] # 0x2911 - - "‒": [T: "flecha hacia arriba partiendo de una barra"] # 0x2912 - - "–": [T: "flecha hacia abajo partiendo de una barra"] # 0x2913 - - "—": [T: "flecha hacia la derecha con cola y trazo vertical"] # 0x2914 (en: 'rightwards arrow with tail and vertical stroke', google: 'flecha hacia la derecha con cola y trazo vertical') - - "―": [T: "flecha hacia la derecha con cola y doble trazo vertical"] # 0x2915 (en: 'rightwards arrow with tail and double vertical stroke', google: 'flecha hacia la derecha con cola y trazo vertical doble') - - "‖": [T: "flecha hacia la derecha con cola y dos cabezas"] # 0x2916 - - "‗": [T: "flecha de dos cabezas hacia la derecha con cola con trazo vertical"] # 0x2917 (en: 'rightwards two headed arrow with tail with vertical stroke', google: 'derecho de dos flecha con la cola con trazo vertical') - - "‘": [T: "flecha de dos cabezas hacia la derecha con cola con doble trazo vertical"] # 0x2918 (en: 'rightwards two headed arrow with tail with double vertical stroke', google: 'derecho de dos flecha con la cola con trazo vertical doble') - - "’": [T: "cola de doble flecha hacia la izquierda"] # 0x2919 (en: 'leftwards arrow tail') - - "‚": [T: "cola de flecha hacia la derecha"] # 0x291a (en: 'rightwards arrow tail', google: 'tail de flecha hacia la derecha') - - "‛": [T: "doble flecha hacia la izquierda con cola"] # 0x291b (en: 'leftwards double arrow tail') - - "“": [T: "cola de doble flecha hacia la derecha"] # 0x291c (en: 'rightwards double arrow tail') - - "”": [T: "flecha izquierda hacia rombo lleno"] # 0x291d (en: 'leftwards arrow to filled diamond') - - "„": [T: "flecha derecha hacia rombo lleno"] # 0x291e (en: 'rightwards arrow to filled diamond') - - "‟": [T: "flecha izquierda desde barra hacia rombo lleno"] # 0x291f (en: 'leftwards arrow from bar to filled diamond') - - "†": [T: "flecha derecha desde barra hacia rombo lleno"] # 0x2920 (en: 'rightwards arrow from bar to filled diamond') - - "‥": [T: "flecha del noroeste y del sudeste"] # 0x2921 (en: 'north west and south east arrow', google: 'noroeste y arrow south east') - - "‹": [T: "flecha nordeste y sudoeste"] # 0x2922 (en: 'north east and south west arrow', google: 'north east y south west arrow') - - "‣": [T: "flecha hacia el noroeste con garfio"] # 0x2923 (en: 'north west arrow with hook') - - " ": [T: "flecha hacia el nordeste con garfio"] # 0x2924 (en: 'north east arrow with hook') - - " ": [T: "flecha hacia el sudeste con garfio"] # 0x2925 (en: 'south east arrow with hook') - - " ": [T: "flecha hacia el suroeste con garfio"] # 0x2926 (en: 'south west arrow with hook') - - "‧": [T: "flechas hacia el noroeste y hacia el nordeste"] # 0x2927 (en: 'north west arrow and north east arrow') - - "‚": [T: "flechas hacia el nordeste y hacia el sudeste"] # 0x2928 (en: 'north east arrow and south east arrow') - - "
": [T: "flechas hacia el sudeste y hacia el sudoeste"] # 0x2929 (en: 'south east arrow and south west arrow') - - "â€Ș": [T: "flechas hacia el sudoeste y hacia el noroeste"] # 0x292a (en: 'south west arrow and north west arrow') - - "‫": [T: "cruce de diagonal ascendente con diagonal descendente"] # 0x292b (en: 'rising diagonal crossing falling diagonal', google: 'cruce diagonal en ascenso caĂ­da diagonal') - - "‏": [T: "cruce de diagonal descendente con diagonal ascendente"] # 0x292c (en: 'falling diagonal crossing rising diagonal', google: 'cambio de cruce diagonal diagonal') - - "‭": [T: "flecha Sureste Cruzando Flecha Noreste"] # 0x292d (en: 'south east arrow crossing north east arrow', google: 'south east arrow crossing north east arrow') - - "‟": [T: "flecha nordeste atravesando flecha sudeste"] # 0x292e (en: 'north east arrow crossing south east arrow', google: 'north east arrow crossing south east arrow') - - " ": [T: "diagonal descendente atravesando flecha nordeste"] # 0x292f (en: 'falling diagonal crossing north east arrow', google: 'caĂ­da diagonal atravesando la flecha del noreste') - - "‰": [T: "diagonal ascendente atravesando flecha sudeste"] # 0x2930 (en: 'rising diagonal crossing south east arrow', google: 'cruce diagonal ascendente crossing south east arrow') - - "‱": [T: "flecha nordeste atravesando flecha noroeste"] # 0x2931 (en: 'north east arrow crossing north west arrow', google: 'north east arrow crossing north west arrow') - - "â€Č": [T: "flecha noroeste atravesando flecha nordeste"] # 0x2932 (en: 'north west arrow crossing north east arrow', google: 'north west arrow crossing north east arrow') - - "″": [T: "flecha ondulada apuntando hacia la derecha"] # 0x2933 (en: 'wave arrow pointing directly right') - - "‎": [T: "flecha hacia la derecha curvada hacia arriba"] # 0x2934 (en: 'arrow pointing rightwards then curving upwards', google: 'arrow apuntando hacia la derecha y luego curvando hacia arriba') - - "—": [T: "flecha hacia la derecha curvada hacia abajo"] # 0x2935 (en: 'arrow pointing rightwards then curving downwards') - - "‶": [T: "flecha hacia abajo curvada hacia la izquierda"] # 0x2936 (en: 'arrow pointing downwards then curving leftwards') - - "‷": [T: "flecha hacia abajo curvada hacia la derecha"] # 0x2937 (en: 'arrow pointing downwards then curving rightwards') - - "„": [T: "flecha semicircular hacia la derecha en sentido de las agujas del reloj"] # 0x2938 (en: 'right side arc clockwise arrow') - - "â€č": [T: "flecha semicircular hacia la izquierda en sentido contrario a las agujas del reloj"] # 0x2939 (en: 'left side arc anticlockwise arrow') - - "â€ș": [T: "arco superior en flecha en sentido contrario a las agujas del reloj"] # 0x293a (en: 'top arc anticlockwise arrow', google: 'arro de arco superior en sentido antihorario') - - "※": [T: "arco inferior en flecha hen sentido contrario a las agujas del reloj"] # 0x293b (en: 'bottom arc anticlockwise arrow', google: 'arco inferior de la flecha en sentido antihorario') - - "‌": [T: "flecha en sentido a las agujas del reloj, con arco superior y signo menos"] # 0x293c (en: 'top arc clockwise arrow with minus') - - "“": [T: "flecha en sentido contrario a las agujas del reloj, con arco superior y signo mĂĄs"] # 0x293d (en: 'top arc anticlockwise arrow with plus') - - "‟": [T: "flecha semicircular inferior en sentido a las agujas del reloj"] # 0x293e (en: 'lower right semicircular clockwise arrow', google: 'flecha semicircular inferior derecha en el sentido de las agujas del reloj') - - "‿": [T: "flecha semicircular inferior en sentido contrario a las agujas del reloj"] # 0x293f (en: 'lower left semicircular anticlockwise arrow', google: 'flecha semicircular inferior izquierda en sentido antihorario') - - "â„€": [T: "cĂ­rculo cerrado en sentido contrario a las agujas del reloj"] # 0x2940 (en: 'anticlockwise closed circle arrow', google: 'flecha de cĂ­rculo cerrado en sentido antihorario') - - "℁": [T: "cĂ­rculo cerrado en sentido de las agujas del reloj"] # 0x2941 (en: 'clockwise closed circle arrow', google: 'flecha del cĂ­rculo cerrado en el sentido de las agujas del reloj') - - "â„‚": [T: "flecha hacia la derecha sobre flecha corta hacia la izquierda"] # 0x2942 (en: 'rightwards arrow above short leftwards arrow') - - "℃": [T: "flecha hacia la izquierda sobre flecha corta hacia la derecha"] # 0x2943 (en: 'leftwards arrow above short rightwards arrow', google: 'flecha hacia la izquierda sobre la flecha corta derecha hacia la derecha') - - "â„„": [T: "flecha corta hacia la derecha sobre flecha hacia la izquierda"] # 0x2944 (en: 'short rightwards arrow above leftwards arrow', google: 'flecha corta hacia la derecha sobre la flecha hacia la izquierda') - - "â„…": [T: "flecha hacia la derecha con signo mĂĄs inferior"] # 0x2945 (en: 'rightwards arrow with plus below') - - "℆": [T: "flecha hacia la izquierda con signo mĂĄs inferior"] # 0x2946 (en: 'leftwards arrow with plus below', google: 'flecha hacia la izquierda con mĂĄs a continuaciĂłn') - - "ℇ": [T: "flecha hacia la derecha a travĂ©s de X"] # 0x2947 (en: 'rightwards arrow through x', google: 'flecha hacia la derecha a travĂ©s de x') - - "℈": [T: "flecha hacia la izquierda a travĂ©s de cĂ­rculo"] # 0x2948 (en: 'left right arrow through circle') - - "℉": [T: "flecha con dos cabezas haciarriba partiendo de un cĂ­rculo"] # 0x2949 (en: 'upwards two headed arrow from circle') - - "ℊ": [T: "arpĂłn con punta izquierda hacia arriba y punta derecha hacia abajo"] # 0x294a (en: 'left barb up right barb down harpoon', MathPlayer: 'left barb up right barb down harpoon', google: 'barb de la izquierda hacia arriba barb barb por harpoon') - - "â„‹": [T: "arpĂłn con punta izquierda hacia abajo y punta derecha hacia arriba"] # 0x294b (en: 'left barb down right barb up harpoon', MathPlayer: 'left barb down right barb up harpoon', google: 'barb de la izquierda hacia abajo barb en la barbilla hacia arriba') - - "ℌ": [T: "arpĂłn conpunta derecha hacia arriba y punta izquierda hacia abajo"] # 0x294c (google: 'barb a la derecha por barb harpoon izquierda') - - "ℍ": [T: "arpĂłn con punta izquierda hacia arriba y punta derecha hacia abajo"] # 0x294d (en: 'up barb left down barb right harpoon', google: 'barb a la barb izquierda por barb right harpoon') - - "ℎ": [T: "arpĂłn con puntas derecha e izquierda hacia arriba"] # 0x294e (en: 'left barb up right barb up harpoon', MathPlayer: 'arpĂłn superior derecha-izquierda', google: 'barb izquierda arriba barb arriba de barca') - - "ℏ": [T: "arpĂłn con puntas superior e inferior hacia la derecha"] # 0x294f (en: 'up barb right down barb right harpoon') - - "ℐ": [T: "arpĂłn con puntas derecha e izquierda hacia abajo"] # 0x2950 (en: 'left barb down right barb down harpoon', MathPlayer: 'arpĂłn inferior derecha-izquierda', google: 'barb de la izquierda hacia abajo barb barb por harpoon') - - "â„‘": [T: "arpĂłn izquierdo con puntas hacia arriba y hacia abajo"] # 0x2951 (en: 'up barb left down barb left harpoon') - - "â„’": [T: "arpĂłn hacia la izquierda con punta hasta la barra"] # 0x2952 (en: 'leftwards harpoon with barb up to bar', MathPlayer: 'leftwards harpoon to bar with barb upwards', google: 'arpĂłn de la izquierda con barb hasta bar') - - "â„“": [T: "arpĂłn hacia la derecha con punta hasta la barra"] # 0x2953 (en: 'rightwards harpoon with barb up to bar', MathPlayer: 'rightwards harpoon to bar with barb upwards', google: 'arpoon a la derecha con barb hasta bar') - - "â„”": [T: "arpĂłn ascendente con punta derecha hacia la barra"] # 0x2954 (en: 'upwards harpoon with barb right to bar', MathPlayer: 'upwards harpoon to bar with barb rightwards', google: 'hacia arriba hacia arriba con barb directamente a bar') - - "â„•": [T: "arpĂłn hacia abajo con punta derecha hacia la barra"] # 0x2955 (en: 'downwards harpoon with barb right to bar', MathPlayer: 'downwards harpoon to bar with barb rightwards', google: 'harpoon hacia abajo con barb directamente a bar') - - "â„–": [T: "arpĂłn hacia la izquierda con punta descendente hacia la barra"] # 0x2956 (en: 'leftwards harpoon with barb down to bar', MathPlayer: 'leftwards harpoon to bar with barb downwards', google: 'arpĂłn de la izquierda con barb hasta el bar') - - "â„—": [T: "arpĂłn hacia la derecha con punta inferior hacia la barra"] # 0x2957 (en: 'rightwards harpoon with barb down to bar', MathPlayer: 'rightwards harpoon to bar with barb downwards', google: 'arpoon a la derecha con barb hasta bar') - - "℘": [T: "arpĂłn ascendente con punta izquierda hacia la barra"] # 0x2958 (en: 'upwards harpoon with barb left to bar', MathPlayer: 'upwards harpoon to bar with barb leftwards', google: 'hace arriba de barb con barb se fue a bar') - - "â„™": [T: "arpĂłn hacia abajo con punta izquierda hacia la barra"] # 0x2959 (en: 'downwards harpoon with barb left to bar', MathPlayer: 'downwards harpoon to bar with barb leftwards', google: 'arpĂłn hacia abajo con barb se fue a bar') - - "ℚ": [T: "arpĂłn hacia la izquierda con punta por encima de la barra"] # 0x295a (en: 'leftwards harpoon with barb up from bar', MathPlayer: 'leftwards harpoon from bar with barb upwards', google: 'arpĂłn de la izquierda con barb arriba desde el bar') - - "â„›": [T: "arpĂłn hacia la derecha con punta por encima de la barra"] # 0x295b (en: 'rightwards harpoon with barb up from bar', MathPlayer: 'rightwards harpoon from bar with barb upwards', google: 'arpoon a la derecha con barb up from bar') - - "ℜ": [T: "arpĂłn ascendente con punta partiendo de la barra"] # 0x295c (en: 'upwards harpoon with barb right from bar', MathPlayer: 'upwards harpoon from bar with barb rightwards', google: 'hacia arriba hacia arriba con barb directamente desde el bar') - - "ℝ": [T: "arpĂłn descendente con punta partiendo de la barra"] # 0x295d (en: 'downwards harpoon with barb right from bar', MathPlayer: 'downwards harpoon from bar with barb rightwards', google: 'arpĂłn hacia abajo con barb directamente desde el bar') - - "℞": [T: "arpĂłn hacia la izquierda con punta por debajo de la barra"] # 0x295e (en: 'leftwards harpoon with barb down from bar', MathPlayer: 'leftwards harpoon from bar with barb downwards', google: 'arpĂłn hacia la izquierda con barb down desde bar') - - "℟": [T: "arpĂłn hacia la derecha con punta por debajo de barra"] # 0x295f (en: 'rightwards harpoon with barb down from bar', MathPlayer: 'rightwards harpoon from bar with barb downwards', google: 'arpoon a la derecha con barb down desde bar') - - "â„ ": [T: "arpĂłn ascendente con punta a la izquierda de la barra"] # 0x2960 (en: 'upwards harpoon with barb left from bar', MathPlayer: 'upwards harpoon from bar with barb leftwards', google: 'hacia arriba de la arpĂłn con barb se queda desde el bar') - - "℥": [T: "arpĂłn descendente con punta a la izquierda de la barra"] # 0x2961 (en: 'downwards harpoon with barb left from bar', MathPlayer: 'downwards harpoon from bar with barb leftwards', google: 'arpĂłn hacia abajo con barb se queda desde el bar') - - "ℹ": [T: "arpĂłn hacia la izquierda con punta por encima de arpon hacia la izquierda con punta hacia abajo"] # 0x2962 (en: 'leftwards harpoon with barb up above leftwards harpoon with barb down', MathPlayer: 'leftwards harpoon with barb up above leftwards harpoon with barb down', google: 'arpĂłn de la izquierda con barb arriba sobre la arpĂłn hacia la izquierda con barb down') - - "℣": [T: "arpĂłn ascendente con punta hacia la izquierda al lado de arpĂłn ascendente con punta hacia la derecha"] # 0x2963 (en: 'upwards harpoon with barb left beside upwards harpoon with barb right', MathPlayer: 'upwards harpoon with barb left beside upwards harpoon with barb right', google: 'hacia arriba de la arpĂłn con barb izquierda junto a la arpĂłn hacia arriba con barb a la derecha') - - "â„€": [T: "arpĂłn hacia la derecha con punta por encima de arpĂłn hacia la derecha con punta hacia abajo"] # 0x2964 (en: 'rightwards harpoon with barb up above rightwards harpoon with barb down', MathPlayer: 'rightwards harpoon with barb up above rightwards harpoon with barb down', google: 'arpoon a la derecha con barb arriba sobre la arpĂłn de la derecha con barb down') - - "â„„": [T: "arpĂłn hacia abajo con lengĂŒeta a la izquierda al lado arpĂłn hacia abajo con lengĂŒeta a la derecha"] # 0x2965 (en: 'downwards harpoon with barb left beside downwards harpoon with barb right', MathPlayer: 'downwards harpoon with barb left beside downwards harpoon with barb right', google: 'arpĂłn hacia abajo con barb izquierda junto a la arpĂłn hacia abajo con barb a la derecha') - - "ℊ": [T: "arpĂłn a la izquierda con punta por encima de arpĂłn a la derecha con punta hacia arriba"] # 0x2966 (en: 'leftwards harpoon with barb up above rightwards harpoon with barb up', MathPlayer: 'leftwards harpoon with barb up above rightwards harpoon with barb up', google: 'arpĂłn hacia la izquierda con barb arriba sobre la arpĂłn hacia la derecha con barb') - - "â„§": [T: "arpĂłn a la izquierda con punta hacia abajo por encima de arpĂłn a la derecha con punta hacia abajo"] # 0x2967 (en: 'leftwards harpoon with barb down above rightwards harpoon with barb down', MathPlayer: 'leftwards harpoon with barb down above rightwards harpoon with barb down', google: 'arpĂłn de la izquierda con barb hacia abajo sobre la arpĂłn hacia la derecha con barb down') - - "ℚ": [T: "arpĂłn a la derecha con punta hacia arriba por encima de arpĂłn hacia la izquierda con punta hacia arriba"] # 0x2968 (en: 'rightwards harpoon with barb up above leftwards harpoon with barb up', MathPlayer: 'rightwards harpoon with barb up above leftwards harpoon with barb up', google: 'arpoon a la derecha con barb arriba sobre la arpĂłn de la izquierda con barb hacia arriba') - - "â„©": [T: "arpĂłn a la derecha con punta hacia abajo por encima de arpĂłn a la izquierda con punta hacia abajo"] # 0x2969 (en: 'rightwards harpoon with barb down above leftwards harpoon with barb down', MathPlayer: 'rightwards harpoon with barb down above leftwards harpoon with barb down', google: 'arpĂłn a la derecha con barb hacia abajo sobre la arpĂłn hacia la izquierda con barb down') - - "â„Ș": [T: "arpĂłn hacia la izquierda con punta hacia arriba por encima de raya larga discontinua"] # 0x296a (en: 'leftwards harpoon with barb up above long dash') - - "â„«": [T: "arpĂłn hacia la izquierda con punta hacia abajo por debajo de raya larga discontinua"] # 0x296b (en: 'leftwards harpoon with barb down below long dash') - - "ℏ": [T: "arpĂłn hacia la derecha con punta por encima de raya larga discontinua"] # 0x296c (en: 'rightwards harpoon with barb up above long dash') - - "â„­": [T: "arpĂłn hacia la derecha con punta hacia abajo por debajo de raya larga discontinua"] # 0x296d (en: 'rightwards harpoon with barb down below long dash') - - "℟": [T: "arpĂłn ascendente con punta a la izquierda al lado arpĂłn descendente con punta a la derecha"] # 0x296e (en: 'upwards harpoon with barb left beside downwards harpoon with barb right', MathPlayer: 'upwards harpoon to the left of downwards harpoon', google: 'hacia arriba de la arpĂłn con barb izquierda junto al arpĂłn hacia abajo con barb a la derecha') - - "ℯ": [T: "arpĂłn hacia abajo con lengĂŒeta a la izquierda al lado arpĂłn hacia arriba con lengĂŒeta a la derecha"] # 0x296f (en: 'downwards harpoon with barb left beside upwards harpoon with barb right', MathPlayer: 'upwards harpoon to the right of downwards harpoon', google: 'arpĂłn hacia abajo con barb izquierda junto a la arpĂłn hacia arriba con barb a la derecha') - - "â„°": [T: "flecha doble hacia la derecha con cabeza redondeada"] # 0x2970 (en: 'right double arrow with rounded head') - - "ℱ": [T: "flecha hacia la derecha con signo igual por encima"] # 0x2971 (en: 'equals above rightwards arrow') - - "â„Č": [T: "flecha con tilde"] # 0x2972 (en: 'tilde operator above rightwards arrow') - - "ℳ": [T: "tilde con flecha"] # 0x2974 (en: 'rightwards arrow above tilde operator') - - "â„”": [T: "flecha hacia la derecha por encima de signo casi igual a"] # 0x2975 (en: 'rightwards arrow above almost equal to') - - "â„¶": [T: "signo menor que por encima de flecha hacia la izquierda"] # 0x2976 (en: 'less than above leftwards arrow') - - "â„·": [T: "flecha hacia la izquierda atravesando signo menor que"] # 0x2977 (en: 'leftwards arrow through less than') - - "℞": [T: "signo mayor que por encima de flecha hacia la derecha"] # 0x2978 (en: 'greater than above rightwards arrow') - - "â„č": [T: "subconjunto por encima de flecha hacia la derecha"] # 0x2979 (en: 'subset above rightwards arrow') - - "â„ș": [T: "flecha hacia la izquierda a travĂ©s de subconjunto"] # 0x297a (en: 'leftwards arrow through subset') - - "â„»": [T: "superconjunto por encima de flecha hacia la izquierda"] # 0x297b (en: 'superset above leftwards arrow') - - "ℌ": [T: "cola de pez izquierda"] # 0x297c (en: 'left fish tail', MathPlayer: 'left fish tail', google: 'cola de pescado izquierdo') - - "ℜ": [T: "cola de pez derecha"] # 0x297d (en: 'right fish tail', MathPlayer: 'right fish tail', google: 'cola de pescado derecho') - - "℟": [T: "cola de pez hacia arriba"] # 0x297e (en: 'up fish tail') - - "ℿ": [T: "cola de pez haciaabajo"] # 0x297f (en: 'down fish tail', MathPlayer: 'down fish tail', google: 'abajo de la cola de pescado') - - "⩀": [T: "delimitador triple barra vertical"] # 0x2980 (en: 'triple vertical bar delimiter', google: 'delimitador de triple barra vertical') - - "⊁": [T: "punto de notaciĂłn Z"] # 0x2981 (en: 'z notation spot', google: 'z spot de notaciĂłn') - - "⩂": [T: "tipo de notaciĂłn Z Colon"] # 0x2982 (en: 'z notation type colon', google: 'z tipo de notaciĂłn colon') - - "⊃": [T: "soporte rotacional blanco izquierdo"] # 0x2983 (en: 'left white brace', google: 'brace blanco izquierdo') - - "⩄": [T: "soporte rotacional blanco derecho"] # 0x2984 (en: 'right white brace', google: 'brace blanco derecho') - - "⩅": [T: "parĂ©ntesis izquierdo"] # 0x2985 (en: 'left white parenthesis') - - "⩆": [T: "parĂ©ntesis derecho"] # 0x2986 (en: 'right white parenthesis') - - "⩇": [T: "notaciĂłn Z izquierda soporte de imagen"] # 0x2987 (en: 'z notation left image bracket', google: 'z notaciĂłn del soporte de la imagen izquierda') - - "⊈": [T: "notaciĂłn Z derecha soporte de imagen"] # 0x2988 (en: 'z notation right image bracket', google: 'z notaciĂłn de la imagen correcta soporte de imagen') - - "⩉": [T: "notaciĂłn Z izquierda unida a soporte"] # 0x2989 - - "⩊": [T: "notaciĂłn Z derecha unida a soporte"] # 0x298a - - "⩋": [T: "corchete izquierdo con barra ijnferior"] # 0x298b (en: 'left square bracket with underbar') - - "⩌": [T: "corchete derecho con barra inferior"] # 0x298c (en: 'right square bracket with underbar') - - "⊍": [T: "corchete izquierdo con trazo en esquina superior"] # 0x298d (en: 'left square bracket with tick in top corner') - - "⊎": [T: "corchete derecho con trazo en esquina inferior"] # 0x298e (en: 'right square bracket with tick in bottom corner') - - "⊏": [T: "corchete izquierdo con trazo en esquina inferior"] # 0x298f (en: 'left square bracket with tick in bottom corner') - - "⊐": [T: "corchete derecho con trazo en esquina superior"] # 0x2990 (en: 'right square bracket with tick in top corner') - - "⩑": [T: "ĂĄngulo izquierdo de corchete con punto"] # 0x2991 - - "⩒": [T: "ĂĄngulo derecho de corchete con punto"] # 0x2992 - - "⩓": [T: "arco izquierdo menor que soporte"] # 0x2993 - - "⩔": [T: "arco derecho mayor que soporte"] # 0x2994 - - "⩕": [T: "doble arco izquierdo mayor que soporte"] # 0x2995 - - "⩖": [T: "doble arco derecho menor que soporte"] # 0x2996 - - "⩗": [T: "soporte de concha de tortuga negra izquierda"] # 0x2997 (en: 'left black tortoise shell bracket') - - "⊘": [T: "soporte con concha de tortuga a la derecha"] # 0x2998 (en: 'right black tortoise shell bracket', google: 'soporte de carcasa de tortuga negra derecha') - - "⩙": [T: "valla punteada"] # 0x2999 (en: 'dotted fence') - - "⩚": [T: "lĂ­nea vertical en zigzag"] # 0x299a (en: 'vertical zigzag line') - - "⩛": [T: "Ángulo medido de apertura a la izquierda"] # 0x299b (en: 'measured angle opening left', google: 'apertura de ĂĄngulo medido a la izquierda') - - "⩜": [T: "Variante de ĂĄngulo recto con cuadrado"] # 0x299c (en: 'right angle variant with square', google: 'variante de ĂĄngulo recto con cuadrado') - - "⊝": [T: "ĂĄngulo recto medido con punto"] # 0x299d (en: 'measured right angle with dot') - - "⊞": [T: "Ángulo con S dentro"] # 0x299e (en: 'angle with s inside', google: 'ĂĄngulo con s adentro') - - "⩟": [T: "Ángulo agudo"] # 0x299f (en: 'acute angle', google: 'ĂĄngulo agudo') - - "⊠": [T: "Ángulo esfĂ©rico de apertura a la izquierda"] # 0x29a0 (en: 'spherical angle opening left', google: 'abertura del ĂĄngulo esfĂ©rico izquierda') - - "⊥": [T: "ĂĄngulo esfĂ©rico con apertura hacia arriaba"] # 0x29a1 (en: 'spherical angle opening up', google: 'abertura del ĂĄngulo esfĂ©rico') - - "⊹": [T: "ĂĄngulo girado"] # 0x29a2 (en: 'turned angle', google: 'ĂĄngulo girado') - - "⊣": [T: "Ángulo invertido"] # 0x29a3 (en: 'reversed angle', google: 'ĂĄngulo invertido') - - "⊀": [T: "ĂĄngulo con barra inferior"] # 0x29a4 (en: 'angle with underbar') - - "⊄": [T: "ĂĄngulo invertido con barra inferior"] # 0x29a5 (en: 'reversed angle with underbar') - - "⊊": [T: "ĂĄngulo oblicuo abierto hacia arriba"] # 0x29a6 (en: 'oblique angle opening up') - - "⊧": [T: "ĂĄngulo oblicuo abierto hacia abajo"] # 0x29a7 (en: 'oblique angle opening down') - - "⊚": [T: "ĂĄngulo medio con brazo extendido terminando en flecha hacia arriba y hacia la derecha"] # 0x29a8 - - "⊩": [T: "ĂĄngulo medio con brazo extendido terminando en flecha hacia arriba y hacia la izquierda"] # 0x29a9 - - "âŠȘ": [T: "ĂĄngulo medio con brazo extendido terminando en flecha hacia abajo y hacia la derecha"] # 0x29aa - - "⊫": [T: "ĂĄngulo medio con brazo extendido terminando en flecha hacia abajo y hacia la izquierda"] # 0x29ab - - "⊏": [T: "ĂĄngulo medio con brazo extendido terminando en flecha hacia la derecha y hacia arriba"] # 0x29ac - - "⊭": [T: "ĂĄngulo medio con brazo extendido terminando en flecha apuntando hacia la izquierda y hacia arriba"] # 0x29ad - - "⊟": [T: "ĂĄngulo medio con brazo extendido terminando en flecha hacia la derecha y hacia abajo"] # 0x29ae - - "⊯": [T: "ĂĄngulo medio con brazo extendido terminando en flecha hacia la izquierda y hacia abajo"] # 0x29af - - "⊰": [T: "conjunto vacĂ­o invertido"] # 0x29b0 (en: 'reversed empty set') - - "⊱": [T: "conjunto vacĂ­o con barra superior"] # 0x29b1 (en: 'empty set with overbar') - - "âŠČ": [T: "conjunto vacĂ­o con cĂ­rculo pequeño encima"] # 0x29b2 (en: 'empty set with small circle above') - - "⊳": [T: "conjunto vacĂ­o con flecha derecha encima"] # 0x29b3 (en: 'empty set with right arrow above') - - "⊎": [T: "conjunto vacĂ­o con flecha izquierda encima"] # 0x29b4 (en: 'empty set with left arrow above') - - "⊔": [T: "cĂ­rculo con barra horizontal"] # 0x29b5 (en: 'circle with horizontal bar') - - "⊶": [T: "barra vertical rodeada por un cĂ­rculo"] # 0x29b6 (en: 'circled vertical bar') - - "⊷": [T: "paralelas rodeadas por un cĂ­rculo"] # 0x29b7 (en: 'circled parallel') - - "⊞": [T: "solidus en cĂ­rculo inverso"] # 0x29b8 (en: 'circled reverse solidus', google: 'solidus reverso en circulaciĂłn') - - "âŠč": [T: "perpendicular rodeada por un cĂ­rculo"] # 0x29b9 (en: 'circled perpendicular') - - "âŠș": [T: "cĂ­rculo dividido por barra horizontal y mitad superior dividido por barra vertical"] # 0x29ba (en: 'circled divided by horizontal bar and top half divided by vertical bar', google: 'cĂ­rculo dividido por la barra horizontal y la mitad superior dividida por la barra vertical') - - "⊻": [T: "cĂ­rculo con x superpuesta"] # 0x29bb (en: 'circle with superimposed x') - - "⊌": [T: "cĂ­rculo en sentido contrario a las agujas del reloj virando a signo de divisiĂłn"] # 0x29bc (en: 'circled anticlockwise rotated division sign') - - "⊜": [T: "flecha hacia arriba a travĂ©s de cĂ­rculo"] # 0x29bd (en: 'up arrow through circle', google: 'arrow a travĂ©s del cĂ­rculo') - - "⊟": [T: "viñeta vacĂ­a en un cĂ­rculo"] # 0x29be (en: 'circled white bullet') - - "⊿": [T: "viñeta en un cĂ­rculo"] # 0x29bf (en: 'circled bullet') - - "⧀": [T: "signo menor que en un cĂ­rculo"] # 0x29c0 (en: 'circled less than') - - "⧁": [T: "signo mayor que en un cĂ­rculo"] # 0x29c1 (en: 'circled greater than') - - "⧂": [T: "cĂ­rculo con cĂ­rculo pequeño a la derecha"] # 0x29c2 (en: 'circle with small circle to the right') - - "⧃": [T: "cĂ­rculo con dos trazos horizontales a la derecha"] # 0x29c3 - - "⧄": [T: "cuadrado con diagonal ascendente"] # 0x29c4 (en: 'squared rising diagonal slash') - - "⧅": [T: "cuadrado con diagonal descendente"] # 0x29c5 (en: 'squared falling diagonal slash') - - "⧆": [T: "asterisco cuadrado"] # 0x29c6 (en: 'squared asterisk') - - "⧇": [T: "pequeño cĂ­rculo cuadrado"] # 0x29c7 (en: 'squared small circle', google: 'cĂ­rculo pequeño cuadrado') - - "⧈": [T: "cuadrado cuadrado"] # 0x29c8 (en: 'squared square') - - "⧉": [T: "dos cuadrados unidos"] # 0x29c9 (en: 'two joined squares') - - "⧊": [T: "triĂĄngulo con punto arriba"] # 0x29ca (en: 'triangle with dot above') - - "⧋": [T: "triĂĄngulo con barra inferior"] # 0x29cb (en: 'triangle with underbar', google: 'triĂĄngulo con debajo de la barra') - - "⧌": [T: "s dentro de un triangulo"] # 0x29cc (en: 's in triangle', google: 's en triĂĄngulo') - - "⧍": [T: "triĂĄngulo con serifs en la parte inferior"] # 0x29cd - - "⧎": [T: "triĂĄngulo hacia la derecha sobre triĂĄngulo hacia la izquierda"] # 0x29ce (en: 'right triangle above left triangle') - - "⧏": [T: "triĂĄngulo izquierdo al lado de barra vertical"] # 0x29cf (en: 'left triangle beside vertical bar') - - "⧐": [T: "barra vertical al lado de triĂĄngulo derecho"] # 0x29d0 (en: 'vertical bar beside right triangle') - - "⧑": [T: "pajarita Con Mitad Izquierda Negra"] # 0x29d1 (en: 'bowtie with left half black', google: 'bowtie con la mitad de la izquierda') - - "⧒": [T: "pajarita Con Mitad Derecha Negra"] # 0x29d2 (en: 'bowtie with right half black', google: 'bowtie con la mitad derecha negra') - - "⧓": [T: "pajarita Negra"] # 0x29d3 (en: 'black bowtie', google: 'bowtie negro') - - "⧔": [T: "multiplicado por con mitad izquierda negra"] # 0x29d4 (en: 'times with left half black', google: 'veces con la mitad de la izquierda') - - "⧕": [T: "multiplicado por con mitad derecha negra"] # 0x29d5 (en: 'times with right half black', google: 'veces con la mitad derecha negra') - - "⧖": [T: "reloj de arena blanco"] # 0x29d6 (en: 'white hourglass', google: 'hourglass blancos') - - "⧗": [T: "reloj de arena negro"] # 0x29d7 (en: 'black hourglass', google: 'hourglass negros') - - "⧘": [T: "valla izquierda ondulada"] # 0x29d8 (en: 'left wiggly fence', google: 'left fence wiggly') - - "⧙": [T: "valla derecha ondulada"] # 0x29d9 (en: 'right wiggly fence', google: 'derecha cerca ondulada') - - "⧚": [T: "valla doble izquierda ondulada"] # 0x29da - - "⧛": [T: "valla doble derecha ondulada"] # 0x29db - - "⧜": [T: "infinito incompleto"] # 0x29dc (en: 'incomplete infinity') - - "⧝": [T: "infinito"] # 0x29dd (en: 'tie over infinity', google: 'ate el infinito') - - "⧞": [T: "no infinito"] # 0x29de (en: 'infinity negated with vertical bar') - - "⧟": [T: "multimapa de doble extremo"] # 0x29df (en: 'double-ended multimap') - - "â§ ": [T: "cuadrado con contorno delineado"] # 0x29e0 (en: 'square with contoured outline') - - "â§Ą": [T: "aumenta a medida que"] # 0x29e1 (en: 'increases as') - - "â§ą": [T: "producto aleatorio"] # 0x29e2 (en: 'shuffle product', google: 'producto de baraja') - - "â§Ł": [T: "signo igual y paralela inclinada"] # 0x29e3 (en: 'equals sign and slanted parallel', MathPlayer: 'igual tachado doble', google: 'es igual a la señal y se inclinĂł paralelo') - - "â§€": [T: "signo igual y paralela inclinada con tilde por encima"] # 0x29e4 (en: 'equals sign and slanted parallel with tilde above') - - "â§„": [T: "idĂ©ntico a una paralela inclinada"] # 0x29e5 (en: 'identical to and slanted parallel') - - "â§Š": [T: "gleich Stark"] # 0x29e6 (en: 'gleich stark', google: 'gleich stark') - - "â§§": [T: "termodinĂĄmica"] # 0x29e7 (en: 'thermodynamic', google: 'termodinĂĄmico') - - "â§š": [T: "triĂĄngulo apuntando hacia abajo con la mitad izquierda negra"] # 0x29e8 (en: 'down pointing triangle with left half black', google: 'down pointing triangle con la mitad izquierda') - - "â§©": [T: "triĂĄngulo apuntando hacia abajo con la mitad derecha negra"] # 0x29e9 (en: 'down pointing triangle with right half black', google: 'down apuntando al triĂĄngulo con la mitad derecha negra') - - "â§Ș": [T: "rombo negro con flecha hacia abajo"] # 0x29ea (en: 'black diamond with down arrow') - - "â§«": [T: "rombo relleno"] # 0x29eb (en: 'black lozenge') - - "â§Ź": [T: "cĂ­rculo blanco con flecha hacia abajo"] # 0x29ec (en: 'white circle with down arrow') - - "â§­": [T: "cĂ­rculo negro con flecha hacia abajo"] # 0x29ed (en: 'black circle with down arrow') - - "â§ź": [T: "cuadrado blanco con error barrado"] # 0x29ee (en: 'error-barred white square', google: 'cuadrado blanco con barra de error') - - "â§Ż": [T: "cuadrado negro con error barrado"] # 0x29ef (en: 'error-barred black square', google: 'cuadrado negro con barra de error') - - "â§°": [T: "rombo blanco con error barrado"] # 0x29f0 (en: 'error-barred white diamond', google: 'diamante blanco con accesorios de error') - - "â§±": [T: "rombo negro con error barrado"] # 0x29f1 (en: 'error-barred black diamond', google: 'diamante negro con accesorios de error') - - "â§Č": [T: "cĂ­rculo blanco con error barrado"] # 0x29f2 (en: 'error-barred white circle', google: 'cĂ­rculo blanco con barra de error') - - "â§ł": [T: "cĂ­rculo negro con error barrado"] # 0x29f3 (en: 'error-barred black circle', google: 'cĂ­rculo negro con barra de error') - - "â§Ž": [T: "regla retardada"] # 0x29f4 (en: 'rule-delayed') - - "â§”": [T: "operador de Solidus Inverso"] # 0x29f5 (en: 'reverse solidus operator', google: 'operador reverso de solidus') - - "â§¶": [T: "solidus con barra superior"] # 0x29f6 - - "â§·": [T: "solidus inverso con trazo horizontal"] # 0x29f7 (en: 'reverse solidus with horizontal stroke', google: 'reverse solidus con carrera horizontal') - - "â§ž": [T: "sĂłlido grande"] # 0x29f8 (en: 'big solidus', google: 'big solidus') - - "â§č": [T: "solidus inverso grande"] # 0x29f9 (en: 'big reverse solidus', google: 'big reverso solidus') - - "â§ș": [T: "doble signo mĂĄs"] # 0x29fa (en: 'double plus', google: 'doble mĂĄs') - - "â§»": [T: "triple signo mĂĄs"] # 0x29fb (en: 'triple plus', google: 'triple plus') - - "â§Œ": [T: "parĂ©ntesis con ĂĄngulo curvado hacia la izquierda"] # 0x29fc (en: 'left pointing curved angle bracket', google: 'soporte de ĂĄngulo curvo de apuntamiento izquierdo') - - "â§œ": [T: "parĂ©ntesis con ĂĄngulo curvado hacia la derecha"] # 0x29fd (en: 'right pointing curved angle bracket', google: 'soporte de ĂĄngulo curvo apuntando a la derecha') - - "â§Ÿ": [T: "minĂșsculo"] # 0x29fe (en: 'tiny', google: 'diminuto') - - "â§ż": [T: "miny"] # 0x29ff - - "⹀": [T: "operador de puntos circulares N-Ary"] # 0x2a00 (en: 'circled dot operator', google: 'operador de puntos en circulaciĂłn') - - "⚁": [T: "operador N-Ary con signo mĂĄs en un cĂ­rculo"] # 0x2a01 (en: 'circled plus operator', google: 'operador circlado plus') - - "⹂": [T: "operador N-Ary con signo multiplicado por dentro de un cĂ­rculo"] # 0x2a02 (en: 'circled times operator', google: 'operador de times en circulaciĂłn') - - "⚃": [T: "operador de la uniĂłn N-Ary con punto"] # 0x2a03 (en: 'union operator with dot', google: 'operador sindical con dot') - - "⹄": [T: "n-Ary Union Operator con signo mĂĄs"] # 0x2a04 (en: 'union operator with plus', google: 'operador sindical con mĂĄs') - - "⹅": [T: "operador de intersecciones cuadradas N-Ary"] # 0x2a05 (en: 'square intersection operator', google: 'operador de intersecciĂłn cuadrada') - - "⹆": [T: "n-Ary Square Union Operator"] # 0x2a06 (en: 'square union operator', google: 'operador de la uniĂłn square') - - "⹇": [T: "dos lĂłgico y operador"] # 0x2a07 (en: 'two logical and operator', google: 'dos lĂłgicos y operadores') - - "⚈": [T: "dos lĂłgico u operador"] # 0x2a08 (en: 'two logical or operator', google: 'dos lĂłgicos u operadores') - - "⹉": [T: "operador multiplicado por N-Ary Times"] # 0x2a09 (en: 'times operator', google: 'operador de tiempos') - - "⹊": [T: "mĂłdulo dos sumas"] # 0x2a0a (en: 'modulo two sum', google: 'mĂłdulo dos suma') - - "⹋": [T: "suma con Integral"] # 0x2a0b (en: 'summation with integral', google: 'suma con integral') - - "⹌": [T: "operador integral cuĂĄdruple"] # 0x2a0c (en: 'quadruple integral operator') - - "⚍": [T: "parte integral finita"] # 0x2a0d - - "⚎": [T: "integral con Doble Trazo"] # 0x2a0e (en: 'integral with double stroke', google: 'integral con doble trazo') - - "⚏": [T: "promedio Integral con barra discontinua"] # 0x2a0f (en: 'integral average with slash', google: 'promedio integral con corte') - - "⚐": [T: "circulation function"] # 0x2a10 - - "⹑": [T: "integral en sentido contrario a las agujas del reloj"] # 0x2a11 (en: 'anticlockwise integration') - - "⹒": [T: "integral lineal para rectĂĄngulo en polo"] # 0x2a12 (en: 'line integration with rectangular path around pole') - - "⹓": [T: "integral lineal para semicĂ­rculo en polo"] # 0x2a13 (en: 'line integration with semicircular path around pole') - - "⹔": [T: "integral lineal excluyendo el polo"] # 0x2a14 (en: 'line integration not including the pole') - - "⹕": [T: "integral en torno a un punto operador"] # 0x2a15 (en: 'integral around a point operator') - - "⹖": [T: "operador integral para cuaterniones"] # 0x2a16 (en: 'quaternion integral operator') - - "⹗": [T: "integral con flecha hacia la izquierda con garfio"] # 0x2a17 (en: 'integral with leftwards arrow with hook') - - "⚘": [T: "integral con signo multiplicado por"] # 0x2a18 (en: 'integral with times sign', google: 'integral con el signo de tiempos') - - "⹙": [T: "integral con IntersecciĂłn"] # 0x2a19 (en: 'integral with intersection', google: 'integral con la intersecciĂłn') - - "⹚": [T: "integral con uniĂłn"] # 0x2a1a (en: 'integral with union', google: 'integral con la uniĂłn') - - "⹛": [T: "integral con barra superior"] # 0x2a1b (en: 'integral with overbar', google: 'integral con overbar') - - "⹜": [T: "integral con barra inferior"] # 0x2a1c (en: 'integral with underbar', google: 'integral con underbar') - - "⚝": [T: "unir"] # 0x2a1d (en: 'join') - - "⚞": [T: "operador de triĂĄngulo izquierdo grande"] # 0x2a1e (en: 'large left triangle operator', google: 'gran operador del triĂĄngulo izquierdo') - - "⹟": [T: "composiciĂłn de esquemas de notaciĂłn Z"] # 0x2a1f (en: 'z notation schema composition', google: 'z composiciĂłn de esquema de notaciĂłn') - - "âš ": [T: "esquema de notaciĂłn Z"] # 0x2a20 (en: 'z notation schema piping', google: 'z tuberĂ­a de esquema de notaciĂłn') - - "⚥": [T: "proyecciĂłn del esquema de notaciĂłn Z"] # 0x2a21 (en: 'z notation schema projection', google: 'z proyecciĂłn de esquema de notaciĂłn') - - "âšą": [T: "signo mĂĄs con cĂ­rculo encima"] # 0x2a22 (en: 'plus sign with circle above') - - "⚣": [T: "signo mĂĄs con signo circunflejo encima"] # 0x2a23 (en: 'plus sign with circumflex accent above') - - "⚀": [T: "signo mĂĄs con tilde encima"] # 0x2a24 (en: 'plus sign with tilde above') - - "âš„": [T: "signo mĂĄs con punto inferior"] # 0x2a25 (en: 'plus sign with dot below') - - "⚊": [T: "signo mĂĄs con tilde inferior"] # 0x2a26 (en: 'plus sign with tilde below') - - "âš§": [T: "signo mĂĄs con 2 subĂ­ndice"] # 0x2a27 (en: 'plus sign with subscript two') - - "âšš": [T: "signo mĂĄs con triĂĄngulo negro"] # 0x2a28 (en: 'plus sign with black triangle', google: 'mĂĄs letrero con triĂĄngulo negro') - - "âš©": [T: "signo menos con coma encima"] # 0x2a29 (en: 'minus sign with comma above') - - "âšȘ": [T: "signo menos con punto inferior"] # 0x2a2a (en: 'minus sign with dot below') - - "âš«": [T: "signo menos con puntos descendentes"] # 0x2a2b (en: 'minus sign with falling dots', google: 'señal menos con puntos de caĂ­da') - - "⚏": [T: "signo menos con puntos ascendentes"] # 0x2a2c (en: 'minus sign with rising dots', google: 'minus firma con puntos ascendentes') - - "âš­": [T: "signo mĂĄs en semicĂ­rculo izquierdo"] # 0x2a2d (en: 'plus sign in left half circle') - - "âšź": [T: "signo mĂĄs en semicĂ­rculo derecho"] # 0x2a2e (en: 'plus sign in right half circle') - - "⚯": [T: "producto vectorial"] # 0x2a2f (en: 'cross product') - - "âš°": [T: "signo de multiplicaciĂłn con punto encima"] # 0x2a30 (en: 'multiplication sign with dot above') - - "âš±": [T: "signo de multiplicaciĂłn con barra inferior"] # 0x2a31 (en: 'multiplication sign with underbar') - - "âšČ": [T: "producto semidirecto con fondo cerrado"] # 0x2a32 (en: 'semidirect product with bottom closed') - - "âšł": [T: "smash product"] # 0x2a33 - - "⚎": [T: "signo de multiplicaciĂłn dentro de semicĂ­rculo izquierdo"] # 0x2a34 (en: 'multiplication sign in left half circle') - - "âš”": [T: "signo de multiplicaciĂłn dentro de semicĂ­rculo derecho"] # 0x2a35 (en: 'multiplication sign in right half circle') - - "âš¶": [T: "signo de multiplicaciĂłn dentro de cĂ­rculo con circunflejo"] # 0x2a36 (en: 'circled multiplication sign with circumflex accent') - - "âš·": [T: "signo de multiplicaciĂłn en doble cĂ­rculo"] # 0x2a37 (en: 'multiplication sign in double circle') - - "âšž": [T: "signo de divisiĂłn dentro de un cĂ­rdulo"] # 0x2a38 (en: 'circled division sign') - - "âšč": [T: "signo mĂĄs dentro de un triĂĄngulo"] # 0x2a39 (en: 'plus sign in triangle') - - "âšș": [T: "signo menos dentro de un triĂĄngulo"] # 0x2a3a (en: 'minus sign in triangle') - - "âš»": [T: "signo de multiplicaciĂłn dentro de un triĂĄngulo"] # 0x2a3b (en: 'multiplication sign in triangle') - - "⚌": [T: "producto interior"] # 0x2a3c (en: 'interior product') - - "âšœ": [T: "producto interior derecho"] # 0x2a3d (en: 'righthand interior product') - - "âšź": [T: "signo mĂĄs en semicĂ­rculo derecho"] # 0x2a2e (en: 'z notation relational composition') - - "âšż": [T: "coproducto"] # 0x2a3f (en: 'amalgamation or coproduct') - - "⩀": [T: "intersecciĂłn con punto"] # 0x2a40 (en: 'intersection with dot') - - "⩁": [T: "uniĂłn con signo menos"] # 0x2a41 (en: 'union with minus sign', google: 'uniĂłn con menos signo') - - "⩂": [T: "uniĂłn con barrasuperior"] # 0x2a42 (en: 'union with overbar') - - "⩃": [T: "intersecciĂłn con barrasuperior"] # 0x2a43 (en: 'intersection with overbar') - - "⩄": [T: "intersecciĂłn con and lĂłgico"] # 0x2a44 (en: 'intersection with logical and') - - "⩅": [T: "uniĂłn con or lĂłgico"] # 0x2a45 (en: 'union with logical or') - - "⩆": [T: "uniĂłn sobre intersecciĂłn"] # 0x2a46 (en: 'union above intersection') - - "⩇": [T: "intersecciĂłn sobre uniĂłn"] # 0x2a47 (en: 'intersection above union') - - "⩈": [T: "uniĂłn sobre barra sobre intersecciĂłn"] # 0x2a48 (en: 'union above bar above intersection') - - "⩉": [T: "intersecciĂłn sobre barra sobre uniĂłn"] # 0x2a49 (en: 'intersection above bar above union', MathPlayer: 'intersecciĂłn sobre barra, sobre uniĂłn', google: 'intersecciĂłn por encima de la barra por encima de la uniĂłn') - - "⩊": [T: "uniĂłn y uniĂłn"] # 0x2a4a (en: 'union beside and joined with union') - - "⩋": [T: "intersecciĂłn e intersecciĂłn"] # 0x2a4b (en: 'intersection beside and joined with intersection') - - "⩌": [T: "uniĂłn cerrada con serifs"] # 0x2a4c (en: 'closed union with serifs') - - "⩍": [T: "intersecciĂłn cerrada con serifs"] # 0x2a4d (en: 'closed intersection with serifs') - - "⩎": [T: "intersecciĂłn cuadrada doble"] # 0x2a4e (en: 'double square intersection', google: 'intersecciĂłn doble cuadrado') - - "⩏": [T: "uniĂłn cuadrada doble"] # 0x2a4f (en: 'double square union', google: 'uniĂłn doble cuadrado') - - "⩐": [T: "uniĂłn cerrada con serifs y signo de multiplicaciĂłn"] # 0x2a50 (en: 'closed union with serifs and smash product') - - "⩑": [T: "lĂłgico y con punto arriba."] # 0x2a51 (en: 'logical and with dot above', google: 'lĂłgico y con punto arriba') - - "⩒": [T: "lĂłgico o con punto arriba"] # 0x2a52 (en: 'logical or with dot above') - - "⩓": [T: "Y"] # 0x2a53 (en: 'double logical and') - - "⩔": [T: "O"] # 0x2a54 (en: 'double logical or') - - "⩕": [T: "doble Y lĂłgica intersecada"] # 0x2a55 - - "⩖": [T: "doble O lĂłgica intersecada"] # 0x2a56 - - "⩗": [T: "O grande inclinada"] # 0x2a57 - - "⩘": [T: "Y grande inclinada"] # 0x2a58 - - "⩙": [T: "lĂłgica O superpuesta a lĂłgica Y"] # 0x2a59 (en: 'logical or overlapping logical and', google: 'lĂłgico o superpuesto lĂłgico y') - - "⩚": [T: "Y lĂłgica con trazo en medio"] # 0x2a5a - - "⩛": [T: "O lĂłgica con trazo en medio"] # 0x2a5b - - "⩜": [T: "Y lĂłgica con barra horizontal discontinua"] # 0x2a5c - - "⩝": [T: "O lĂłgica con barra horizontal discontinua"] # 0x2a5d - - "⩞": [T: "Y lĂłgica con doble barra superior"] # 0x2a5e (en: 'logical and with double overbar', google: 'lĂłgico y con doble overbar') - - "⩟": [T: "Y lĂłgica con barra inferior"] # 0x2a5f - - "â© ": [T: "Y lĂłgica con doble barra inferior."] # 0x2a60 (en: 'logical and with double underbar', google: 'lĂłgico y con doble debajo de la barra') - - "⩥": [T: "pequeño Vee con barra inferior"] # 0x2a61 (en: 'small vee with underbar', google: 'pequeño vee con debajo de la barra') - - "⩹": [T: "O lĂłgica con doble barra."] # 0x2a62 (en: 'logical or with double overbar', google: 'lĂłgico o con doble overbar') - - "⩣": [T: "O lĂłgica con doble barra inferior"] # 0x2a63 (en: 'logical or with double underbar', google: 'lĂłgico o con doble bajo') - - "â©€": [T: "notaciĂłn Z Dominio AntirestricciĂłn"] # 0x2a64 (en: 'z notation domain antirestriction', google: 'z dominio de notaciĂłn antirestricciĂłn') - - "â©„": [T: "notaciĂłn Z, rango antirrestriciĂłn"] # 0x2a65 (en: 'z notation range antirestriction', google: 'z rango de notaciĂłn antirestricciĂłn') - - "⩊": [T: "signo igual con punto abajo"] # 0x2a66 (en: 'equals sign with dot below') - - "â©§": [T: "idĂ©ntico a con punto arriba"] # 0x2a67 (en: 'identical with dot above', google: 'idĂ©ntico al punto arriba') - - "⩚": [T: "triple barra horizontal con doble trazo vertical"] # 0x2a68 (en: 'triple horizontal bar with double vertical stroke', google: 'barra horizontal triple con doble carrera vertical') - - "â©©": [T: "triple barra horizontal con triple trazo vertical"] # 0x2a69 (en: 'triple horizontal bar with triple vertical stroke', google: 'barra horizontal triple con trazo vertical triple') - - "â©Ș": [T: "tilde con punto encima"] # 0x2a6a (en: 'tilde operator with dot above') - - "â©«": [T: "tilde con puntos ascendentes"] # 0x2a6b (en: 'tilde operator with rising dots', google: 'operador de tilde con puntos ascendentes') - - "⩏": [T: "similar menos similar"] # 0x2a6c (en: 'similar minus similar', google: 'similar menos similar') - - "â©­": [T: "congruente con punto encima"] # 0x2a6d (en: 'congruent with dot above') - - "⩟": [T: "igual a con Asterisco"] # 0x2a6e (en: 'equals with asterisk', google: 'igualmente con asterisco') - - "⩯": [T: "casi igual con acento circunflejo"] # 0x2a6f (en: 'almost equal to with circumflex accent') - - "â©°": [T: "aproximadamente igual o igual a"] # 0x2a70 (en: 'approximately equal to or equal to') - - "⩱": [T: "signo igual por encima de signo mĂĄs"] # 0x2a71 (en: 'equals sign above plus sign') - - "â©Č": [T: "signo mĂĄs por encima de signo igual"] # 0x2a72 (en: 'plus sign above equals sign') - - "⩳": [T: "signo igual por encima de tilde"] # 0x2a73 (en: 'equals sign above tilde operator') - - "⩎": [T: "signo igual con dos puntos"] # 0x2a74 (en: 'double colon equal') - - "â©”": [T: "doble signo igual"] # 0x2a75 (en: 'two consecutive equals signs') - - "â©¶": [T: "triple signo igual"] # 0x2a76 (en: 'three consecutive equals signs', google: 'tres signos consecutivos iguales') - - "â©·": [T: "signo igual entre dos puntos arriba y dos puntos abajo"] # 0x2a77 (en: 'equals sign with two dots above and two dots below') - - "⩞": [T: "equivalente a con cuatro puntos en la parte superior"] # 0x2a78 (en: 'equivalent with four dots above') - - "â©č": [T: "menor que con cĂ­rculo dentro"] # 0x2a79 (en: 'less than with circle inside') - - "â©ș": [T: "mayor que con cĂ­rculo dentro"] # 0x2a7a (en: 'greater than with circle inside') - - "â©»": [T: "menor que con signo de interrogaciĂłn en la parte superior"] # 0x2a7b (en: 'less than with question mark above') - - "⩌": [T: "mayor que con signo de interrogaciĂłn en la parte superior"] # 0x2a7c (en: 'greater than with question mark above') - - "⩜": [T: "menor que o signo igual inclinado"] # 0x2a7d (en: 'less than or slanted equal to') - - "⩟": [T: "mayor que o signo igual inclinado"] # 0x2a7e (en: 'greater than or slanted equal to') - - "⩿": [T: "menor que o signo igual inclinado con punto en el interior"] # 0x2a7f (en: 'less than or slanted equal to with dot inside') - - "âȘ€": [T: "mayor que o signo igual inclinado con punto en el interior"] # 0x2a80 (en: 'greater than or slanted equal to with dot inside') - - "âȘ": [T: "menor que o signo igual inclinado con punto en la parte superior"] # 0x2a81 (en: 'less than or slanted equal to with dot above') - - "âȘ‚": [T: "mayor que o signo igual con punto en la parte superior"] # 0x2a82 (en: 'greater than or slanted equal to with dot above') - - "âȘƒ": [T: "menor que o signo igual inclinado con punto superior a la derecha"] # 0x2a83 (en: 'less than or slanted equal to with dot above right') - - "âȘ„": [ T: "mayor que con signo igual inclinado con punto superior hacia la izquierda"] # 0x2a84 (en: 'greater than or slanted equal to with dot above left') - - "âȘ…": [T: "menor que o aproximado"] # 0x2a85 (en: 'less than or approximate', google: 'menos o aproximado') - - "âȘ†": [T: "mayor que o aproximado"] # 0x2a86 (en: 'greater than or approximate', google: 'mayor o aproximado') - - "âȘ‡": [T: "menor que y una lĂ­nea no es igual a"] # 0x2a87 (en: 'less than and single line not equal to', google: 'menos que y una sola lĂ­nea no es igual a') - - "âȘˆ": [T: "mayor que y una lĂ­nea no es igual a"] # 0x2a88 (en: 'greater than and single line not equal to', google: 'mayor que y una sola lĂ­nea no es igual a') - - "âȘ‰": [T: "menor que y no aproximado a"] # 0x2a89 (en: 'less than and not approximate') - - "âȘŠ": [T: "mayor que y no aproximado a"] # 0x2a8a (en: 'greater than and not approximate') - - "âȘ‹": [T: "menor que por encima de lĂ­nea doble, signo iguaal por encima de mayor que"] # 0x2a8b (en: 'less than above double line equal above greater than', google: 'menos que por encima de la doble lĂ­nea igual por encima de mĂĄs que') - - "âȘŒ": [T: "mayor que por encima de doble lĂ­nea, signo igual por encima de menor que"] # 0x2a8c (en: 'greater than above double line equal above less than', google: 'mayor que por encima de la doble lĂ­nea igual por encima de menos que') - - "âȘ": [T: "menor que por encima de similar o igual a"] # 0x2a8d (en: 'less than above similar or equal') - - "âȘŽ": [T: "mayor que por encima de similar o igual a"] # 0x2a8e (en: 'greater than above similar or equal') - - "âȘ": [T: "menor que por encima de similar por encima de mayor que"] # 0x2a8f (en: 'less than above similar above greater than') - - "âȘ": [T: "mayor que por encima de similar por encima de menor que"] # 0x2a90 (en: 'greater than above similar above less than') - - "âȘ‘": [T: "menor que por encima de mayor que por encima de doble lĂ­nea igual"] # 0x2a91 (en: 'less than above greater than above double line equal') - - "âȘ’": [T: "mayor que por encima de menor que por encima de doble lĂ­nea igual"] # 0x2a92 (en: 'greater than above less than above double line equal') - - "âȘ“": [T: "menor que por encima de signo igual inclinado por encima de mayor que por encima de signo igual inclinado"] # 0x2a93 (en: 'less than above slanted equal above greater than above slanted equal') - - "âȘ”": [T: "mayor que por encima de signo igual inclinado por encima de menor que por encima de signo igual inclinado"] # 0x2a94 (en: 'greater than above slanted equal above less than above slanted equal') - - "âȘ•": [T: "igual o menor que"] # 0x2a95 (en: 'slanted equal to or less than', google: 'inclinado igual o menos de') - - "âȘ–": [T: "igual o mayor que"] # 0x2a96 (en: 'slanted equal to or greater than') - - "âȘ—": [T: "igual o menor que con punto en el interior"] # 0x2a97 (en: 'slanted equal to or less than with dot inside') - - "âȘ˜": [T: "igual o mayor que con punto en el interior"] # 0x2a98 (en: 'slanted equal to or greater than with dot inside') - - "âȘ™": [T: "doble lĂ­nea igual a o menor que"] # 0x2a99 (en: 'double line equal to or less than') - - "âȘš": [T: "doble lĂ­nea igual a o mayor que"] # 0x2a9a (en: 'double line equal to or greater than') - - "âȘ›": [T: "doble lĂ­nea inclinada igual a o menor que"] # 0x2a9b (en: 'double line slanted equal to or less than', google: 'doble lĂ­nea inclinada igual o menos de') - - "âȘœ": [T: "doble lĂ­nea inclinada igual a o mayor que"] # 0x2a9c (en: 'double line slanted equal to or greater than', google: 'lĂ­nea doble inclinada igual o mayor que') - - "âȘ": [T: "similar a o menor que"] # 0x2a9d (en: 'similar or less than') - - "âȘž": [T: "similar a o mayor que"] # 0x2a9e (en: 'similar or greater than') - - "âȘŸ": [T: "similar a por encima de menor que por encima de signo igual"] # 0x2a9f (en: 'similar above less than above equals sign') - - "âȘ ": [T: "similar a por encima de mayor que por encima de signo egual"] # 0x2aa0 (en: 'similar above greater than above equals sign') - - "âȘĄ": [T: "mucho menor que"] # 0x2aa1 (en: 'double nested less than') - - "âȘą": [T: "mucho mayor que"] # 0x2aa2 (en: 'double nested greater than') - - "âȘŁ": [T: "signo menor que doblemente anidado con barra inferior"] # 0x2aa3 (en: 'double nested less than with underbar', google: 'doble anidado menos que con debajo de la barra') - - "âȘ€": [T: "signo mayor que superpuesto a signo menor que"] # 0x2aa4 (en: 'greater than overlapping less than') - - "âȘ„": [T: "signo mayor que al lado de signo enor que"] # 0x2aa5 (en: 'greater than beside less than') - - "âȘŠ": [T: "menor que cerrado con curva"] # 0x2aa6 (en: 'less than closed by curve') - - "âȘ§": [T: "mayor que cerrado con curva"] # 0x2aa7 (en: 'greater than closed by curve') - - "âȘš": [T: "signo menor que cerrado con curva por encima de signo igual inclinadoa"] # 0x2aa8 (en: 'less than closed by curve above slanted equal') - - "âȘ©": [T: "signo mayor que cerrado con curva por encima de signo igual inclinado"] # 0x2aa9 (en: 'greater than closed by curve above slanted equal') - - "âȘȘ": [T: "mĂĄs pequeño que"] # 0x2aaa (en: 'smaller than') - - "âȘ«": [T: "mĂĄs grande que"] # 0x2aab (en: 'larger than') - - "âȘŹ": [T: "mĂĄs pequeño que o igual a"] # 0x2aac (en: 'smaller than or equal to') - - "âȘ­": [T: "mĂĄs grande que o igual a"] # 0x2aad (en: 'larger than or equal to') - - "âȘź": [T: "signo igual abultado en la parte superior"] # 0x2aae (en: 'equals sign with bumpy above') - - "âȘŻ": [T: "precede o es igual a"] # 0x2aaf (en: 'precedes above single line equals sign') - - "âȘ°": [T: "sucede o es igual a"] # 0x2ab0 (en: 'succeeds above single line equals sign', google: 'tiene Ă©xito por encima de la lĂ­nea Ășnica es igual al signo') - - "âȘ±": [T: "precede no es igual a"] # 0x2ab1 (en: 'precedes above single line not equal to', google: 'precede por encima de una sola lĂ­nea no es igual a') - - "âȘČ": [T: "sucede no es igual a"] # 0x2ab2 (en: 'succeeds above single line not equal to', google: 'tiene Ă©xito por encima de una sola lĂ­nea no es igual a') - - "âȘł": [T: "precede por encima del signo igual"] # 0x2ab3 (en: 'precedes above equals sign', google: 'precede arriba es igual al signo') - - "âȘŽ": [T: "sucede por encima del signo igual"] # 0x2ab4 (en: 'succeeds above equals sign', google: 'tiene Ă©xito arriba es igual al signo') - - "âȘ”": [T: "precede por encima de no es igual a"] # 0x2ab5 (en: 'precedes above not equal to') - - "âȘ¶": [T: "sucede por encima de no es igual a"] # 0x2ab6 (en: 'succeeds above not equal to') - - "âȘ·": [T: "precede por encima de casi igual a"] # 0x2ab7 (en: 'precedes above almost equal to') - - "âȘž": [T: "sucede por encima de casi igual a"] # 0x2ab8 (en: 'succeeds above almost equal to') - - "âȘč": [T: "precede por encima de no es casi igual a"] # 0x2ab9 (en: 'precedes above not almost equal to', google: 'precede arriba no casi igual a') - - "âȘș": [T: "sucede por encima de casi igual a"] # 0x2aba (en: 'succeeds above not almost equal to', google: 'tiene Ă©xito arriba no casi igual a') - - "âȘ»": [T: "es muy anterior a"] # 0x2abb (en: 'double precedes') - - "âȘŒ": [T: "sigue mucho despuĂ©s"] # 0x2abc (en: 'double succeeds') - - "âȘœ": [T: "subconjunto con punto"] # 0x2abd (en: 'subset with dot') - - "âȘŸ": [T: "superconjunto con punto"] # 0x2abe (en: 'superset with dot') - - "âȘż": [T: "subconjunto con signo mĂĄs debajo de"] # 0x2abf (en: 'subset with plus sign below') - - "⫁": [T: "subconjunto con signo de multiplicaciĂłn debajo de"] # 0x2ac1 (en: 'subset with multiplication sign below') - - "⫀": [T: "superconjunto con signo mĂĄs debajo de"] # 0x2ac0 (en: 'superset with plus sign below') - - "⫂": [T: "superconjunto con signo de multiplicaciĂłn debajo de"] # 0x2ac2 (en: 'superset with multiplication sign below') - - "⫃": [T: "incluido con punto o es igual a"] # 0x2ac3 (en: 'subset of or equal to with dot above') - - "⫄": [T: "superconjunto de o igual a con punto encima"] # 0x2ac4 (en: 'superset of or equal to with dot above') - - "⫅": [T: "subconjunto de signo igual encima de"] # 0x2ac5 (en: 'subset of above equals sign', google: 'el subconjunto de arriba es igual al signo') - - "⫆": [T: "superconjunto de signo igual encima de"] # 0x2ac6 (en: 'superset of above equals sign', google: 'el superconjunto de arriba es igual al signo') - - "⫇": [T: "subconjunto por encima de tilde"] # 0x2ac7 (en: 'subset of above tilde operator') - - "⫈": [T: "superconjunto por encima de"] # 0x2ac8 (en: 'superset of above tilde operator') - - "⫉": [T: "subconjunto por encima de signo casi igual a"] # 0x2ac9 (en: 'subset of above almost equal to', google: 'subconjunto de arriba casi igual a') - - "⫊": [T: "superconjunto por encima de casi igual a"] # 0x2aca (en: 'superset of above almost equal to', google: 'superset de arriba casi igual a') - - "⫋": [T: "subconjunto por encima de signo no es igual a"] # 0x2acb (en: 'subset above not equal to', google: 'subconjunto arriba no igual a') - - "⫌": [T: "superconjunto por encima de signo no es igual a "] # 0x2acc (en: 'superset of above not equal to', google: 'superset de arriba no es igual a') - - "⫍": [T: "operador de caja abierta cuadrada a la izquierda"] # 0x2acd (en: 'square left open box operator', google: 'operador de caja abierta cuadrada izquierda') - - "⫎": [T: "operador de caja abierta cuadrada a la derecha"] # 0x2ace (en: 'square right open box operator', google: 'operador de caja abierta cuadrada derecha') - - "⫏": [T: "subconjunto cerrado"] # 0x2acf (en: 'closed subset') - - "⫐": [T: "superconjunto cerrado"] # 0x2ad0 (en: 'closed superset') - - "⫑": [T: "subconjunto cerrado o es igual a"] # 0x2ad1 (en: 'closed subset or equal to') - - "⫒": [T: "superconjunto cerrado o es igual a"] # 0x2ad2 (en: 'closed superset or equal to') - - "⫓": [T: "subconjunto por encima de superconjunto"] # 0x2ad3 (en: 'subset above superset') - - "⫔": [T: "superconjunto por encima de subconjunto"] # 0x2ad4 (en: 'superset above subset') - - "⫕": [T: "subconjunto por encima de subconjunto"] # 0x2ad5 (en: 'subset above subset') - - "⫖": [T: "superconjunto por encima de superconjunto"] # 0x2ad6 (en: 'superset above superset') - - "⫗": [T: "superconjunto al lado de subconjunto"] # 0x2ad7 (en: 'superset beside subset') - - "⫘": [T: "superconjunto al lado de y unido por barra discontinua a subconjunto"] # 0x2ad8 (en: 'superset beside and joined by dash with subset') - - "⫙": [T: "grupo de apertura hacia arriba y hacia abajo"] # 0x2ad9 (en: 'element of opening downwards') - - "⫚": [T: "bifurcaciĂłn"] # 0x2ada - - "⫛": [T: "intersecciĂłn transversal"] # 0x2adb - - "⫝̸": [T: "bifurcaciĂłn"] # 0x2adc (en: 'forking') - - "⫝": [T: "sin bifurcaciĂłn"] # 0x2add (google: 'no efectivo') - - "⫞": [T: "tack corto a la izquierda"] # 0x2ade (en: 'short left tack', google: 'tachuela a la izquierda corta') - - "⫟": [T: "tack corto hacia abajo"] # 0x2adf (en: 'short down tack', google: 'tachuela corta') - - "â« ": [T: "tack corto hacia arriba"] # 0x2ae0 (en: 'short up tack', google: 'tachuela corta') - - "⫥": [T: "perpendicular a s"] # 0x2ae1 (en: 'perpendicular with s') - - "⫹": [T: "barra vertical con triple torniquete a la derecha"] # 0x2ae2 (en: 'vertical bar triple right turnstile', google: 'barra vertical triple turnstile a la derecha') - - "⫣": [T: "doble barra vertical con torniquete a la izquierda"] # 0x2ae3 (en: 'double vertical bar left turnstile', google: 'doble barra vertical a la izquierda el torniquete') - - "â«€": [T: "barra vertical con doble torniquete a la izquierda"] # 0x2ae4 (en: 'vertical bar double left turnstile') - - "â«„": [T: "doble barra vertical doble torniquete a la izquierda"] # 0x2ae5 (en: 'double vertical bar double left turnstile', google: 'doble barra vertical de doble tornillo a la izquierda') - - "⫊": [T: "larga barra discontinua partiendo de doble barra vertical izquierda"] # 0x2ae6 - - "â«§": [T: "tack corto con barra superior"] # 0x2ae7 - - "⫚": [T: "tack corto arriba con barra inferior"] # 0x2ae8 (en: 'short up tack with underbar') - - "â«©": [T: "tack corto arriba sobre tack corto abajo"] # 0x2ae9 - - "â«Ș": [T: "doble tack hacia abajo"] # 0x2aea (en: 'double down tack', google: 'duplicar la tachuela') - - "â««": [T: "doble tack hacia arriba"] # 0x2aeb - - "⫏": [T: "doble trazo sin signo"] # 0x2aec - - "â«­": [T: "doble trazo invertido sin signo"] # 0x2aed - - "⫟": [T: "no divide con barra invertida discontinua de negaciĂłn"] # 0x2aee - - "⫯": [T: "lĂ­nea vertical con cĂ­rculo encima"] # 0x2aef (en: 'vertical line with circle above') - - "â«°": [T: "lĂ­nea vertical con cĂ­rculo abajo"] # 0x2af0 (en: 'vertical line with circle below') - - "⫱": [T: "tack hacia abajo con cĂ­rculo abajo"] # 0x2af1 - - "â«Č": [T: "paralela con trazo horizontal"] # 0x2af2 (en: 'parallel with horizontal stroke') - - "⫳": [T: "paralela con tilde"] # 0x2af3 (en: 'parallel with tilde operator') - - "⫎": [T: "relaciĂłn binaria de barra vertical triple"] # 0x2af4 (en: 'triple vertical bar binary relation', google: 'relaciĂłn binaria de la barra vertical triple') - - "â«”": [T: "barra vertical triple con trazo horizontal"] # 0x2af5 (en: 'triple vertical bar with horizontal stroke', google: 'barra vertical triple con carrera horizontal') - - "â«¶": [T: "operador TripleC olon"] # 0x2af6 (en: 'triple colon operator', google: 'operador de triple colon') - - "â«·": [T: "signo menor que triplemente anidado"] # 0x2af7 (en: 'triple nested less than', google: 'triple anidado menos que') - - "⫞": [T: "signo mayor que triplemente anidado"] # 0x2af8 (en: 'triple nested greater than', google: 'triple anidado mĂĄs grande que') - - "â«č": [T: "doble lĂ­nea inclinada menor o igual a"] # 0x2af9 (en: 'double line slanted less than or equal to', google: 'doble lĂ­nea inclinada menos o igual a') - - "â«ș": [T: "doble lĂ­nea inclinada mayor o igual a"] # 0x2afa (en: 'double line slanted greater than or equal to', google: 'lĂ­nea doble inclinada mayor o igual a') - - "â«»": [T: "relaciĂłn Binaria Triple SĂłlida"] # 0x2afb (en: 'triple solidus binary relation', google: 'triple relaciĂłn binaria de solidus') - - "⫌": [T: "operador de barra vertical triple y grande"] # 0x2afc (en: 'large triple vertical bar operator', google: 'gran operador de barra vertical triple') - - "⫝̸": [T: "operador Doble SĂłlido"] # 0x2afd (en: 'double solidus operator', google: 'operador doble solidus') - - "⫟": [T: "barra vertical blanca"] # 0x2afe (en: 'white vertical bar') - - "⫿": [T: "barra vertical blanca N-Ary"] # 0x2aff (en: 'white vertical bar', google: 'barra vertical blanca') - - "⬀": [T: "flecha blanca apuntando al nordeste"] # 0x2b00 (en: 'north east white arrow', google: 'noreste de la flecha blanca') - - "⏁": [T: "flecha blanca apuntando a noroeste"] # 0x2b01 (en: 'north west white arrow', google: 'noroeste de flecha blanca') - - "⬂": [T: "flecha blanca apuntando al sudeste"] # 0x2b02 (en: 'south east white arrow', google: 'south east white arrow') - - "⏃": [T: "flecha blanca apuntando al sudoeste"] # 0x2b03 (en: 'south west white arrow', google: 'south west white arrow') - - "⬄": [T: "flecha blanca hacia izquierda y derecha"] # 0x2b04 (en: 'left right white arrow', google: 'flecha blanca derecha izquierda') - - "⬅": [T: "flecha negra hacia la izquierda"] # 0x2b05 (en: 'leftwards black arrow') - - "⬆": [T: "flecha negra hacia arriba"] # 0x2b06 (en: 'upwards black arrow', google: 'arrow negro hacia arriba') - - "⬇": [T: "flecha negra hacia abajo"] # 0x2b07 (en: 'downwards black arrow', google: 'arrow negra hacia abajo') - - "⏈": [T: "flecha negra apuntando al nordeste"] # 0x2b08 (en: 'north east black arrow', google: 'north east black arrow') - - "⬉": [T: "flecha negra apuntando al noroeste"] # 0x2b09 (en: 'north west black arrow', google: 'noroeste de flecha negra') - - "⬊": [T: "flecha negra apuntando al sudeste"] # 0x2b0a (en: 'south east black arrow', google: 'south east black arrow') - - "⬋": [T: "flecha negra apuntando al sudoeste"] # 0x2b0b (en: 'south west black arrow', google: 'south west arrow negro') - - "⬌": [T: "flecha negra hacia izquierda y derecha"] # 0x2b0c (en: 'left right black arrow', google: 'flecha negra derecha izquierda') - - "⬍": [T: "flecha negra hacia arriba y hacia abajo"] # 0x2b0d (en: 'up down black arrow', google: 'arrow black arrow') - - "⬎": [T: "flecha hacia la derecha con la punta hacia abajo"] # 0x2b0e (en: 'rightwards arrow with tip downwards') - - "⬏": [T: "flecha hacia la derecha con la punta hacia arriba"] # 0x2b0f (en: 'rightwards arrow with tip upwards') - - "⏐": [T: "flecha hacia la izquierda con la punta hacia abajo"] # 0x2b10 (en: 'leftwards arrow with tip downwards', google: 'flecha hacia la izquierda con punta hacia abajo') - - "⬑": [T: "flecha hacia la izquierda con la punta hacia arriba"] # 0x2b11 (en: 'leftwards arrow with tip upwards', google: 'flecha hacia la izquierda con punta hacia arriba') - - "⬒": [T: "cuadrado con mitad superior negra"] # 0x2b12 (en: 'square with top half black', google: 'cuadrado con la mitad superior negra') - - "⬓": [T: "cuadrado con mitad inferior negra"] # 0x2b13 (en: 'square with bottom half black', google: 'cuadrado con la mitad inferior negra') - - "⬔": [T: "cuadrado con mitad derecha superior diagonal negra"] # 0x2b14 (en: 'square with upper right diagonal half black', google: 'cuadrado con diagonal superior derecha de la parte superior negra') - - "⬕": [T: "cuadrado con mitad izquierda inferior diagonal negra"] # 0x2b15 (en: 'square with lower left diagonal half black', google: 'cuadrado con diagonal inferior izquierda mitad negra') - - "⬖": [T: "rombo con Mitad Izquierda Negro"] # 0x2b16 (en: 'diamond with left half black', google: 'diamante con la mitad de la izquierda') - - "⬗": [T: "rombo con mitad derecha negra"] # 0x2b17 (en: 'diamond with right half black', google: 'diamante con la mitad derecha negra') - - "⏘": [T: "rombo con mitad superior negra"] # 0x2b18 (en: 'diamond with top half black', google: 'diamante con mitad superior negro') - - "⬙": [T: "rojmbo con mitad inferior negra"] # 0x2b19 (en: 'diamond with bottom half black', google: 'diamante con la mitad de negro') - - "⬚": [T: "cuadrado punteado"] # 0x2b1a (en: 'box', google: 'caja') - - "⬛": [T: "cuadrado grande negro"] # 0x2b1b (en: 'black large square') - - "⬜": [T: "cuadrado grande blanco"] # 0x2b1c (en: 'white large square', google: 'cuadrado grande blanco') - - "⬝": [T: "cuadrado muy pequeño negro"] # 0x2b1d (en: 'black very small square', google: 'negro muy pequeño cuadrado') - - "⬞": [T: "cuadrado muy pequeño blanco"] # 0x2b1e (en: 'white very small square', google: 'blanco muy pequeño cuadrado') - - "⬟": [T: "pentĂĄgono blanco"] # 0x2b20 (en: 'white pentagon') - - "⏥": [T: "hexĂĄgono blanco"] # 0x2b21 (en: 'white hexagon') - - "⏹": [T: "hexĂĄgono negro"] # 0x2b22 (en: 'black hexagon') - - "⏣": [T: "hexĂĄgono hegro horizontal"] # 0x2b23 (en: 'horizontal black hexagon', google: 'hexagon negro horizontal') - - "⏀": [T: "circulo grande negro"] # 0x2b24 (en: 'black large circle', google: 'cĂ­rculo negro negro') - - "⏄": [T: "rombo Mediano Negro"] # 0x2b25 (en: 'black medium diamond', google: 'diamante medio negro') - - "⏊": [T: "rombo mediano blanco"] # 0x2b26 (en: 'white medium diamond', google: 'diamante medio blanco') - - "⏧": [T: "rombo Mediano Negro"] # 0x2b27 (en: 'black medium lozenge', google: 'rombina media negra') - - "⏚": [T: "rombo mediano blanco"] # 0x2b28 (en: 'white medium lozenge', google: 'rombita media blanca') - - "⏩": [T: "rombo pequeño negro"] # 0x2b29 (en: 'black small diamond', google: 'diamante pequeño negro') - - "âŹȘ": [T: "rombo pequeño negro"] # 0x2b2a (en: 'black small lozenge', google: 'pequeña barra negra') - - "⏫": [T: "rombo pequeño blanco"] # 0x2b2b (en: 'white small lozenge', google: 'pequeña barra blanca') - - "⏏": [T: "elipse horizontal negra"] # 0x2b2c (en: 'black horizontal ellipse') - - "⏭": [T: "elipse horizontal blanca"] # 0x2b2d (en: 'white horizontal ellipse') - - "⏟": [T: "elipse Vertical Negra"] # 0x2b2e (en: 'black vertical ellipse', google: 'elipse vertical negro') - - "⏯": [T: "elipse Vertical Blanca"] # 0x2b2f (en: 'white vertical ellipse', google: 'elipse vertical blanco') - - "⏰": [T: "flecha izquierda con cĂ­rculo pequeño"] # 0x2b30 (en: 'left arrow with small circle') - - "⏱": [T: "tres flechas a la izquierda"] # 0x2b31 (en: 'three leftwards arrows', google: 'tres flechas de izquierda') - - "âŹČ": [T: "flecha izquierda con signo mĂĄs en el interior de uncĂ­rculo"] # 0x2b32 (en: 'left arrow with circled plus', google: 'flecha izquierda con cĂ­rculos plus') - - "⏳": [T: "flecha serpenteante larga hacia la izquierda"] # 0x2b33 (en: 'long leftwards squiggle arrow', google: 'larga flecha de tirantes de la izquierda') - - "⏎": [T: "flecha de dos cabezas hacia la izquierda con trazo vertical"] # 0x2b34 (en: 'leftwards two headed arrow with vertical stroke', google: 'a la izquierda, dos flechas con carrera vertical') - - "⏔": [T: "flecha de dos cabezas hacia la izquierda con doble trazo vertical"] # 0x2b35 (en: 'leftwards two headed arrow with double vertical stroke', google: 'a la izquierda, dos flechas con cabeza de carrera vertical doble') - - "⏶": [T: "flecha de dos cabezas hacia la izquierda partiendo de barra"] # 0x2b36 (en: 'leftwards two headed arrow from bar', google: 'a la izquierda, dos flechas de la cabeza del bar') - - "⏷": [T: "flecha de dos cabezas hacia la izquierda con triple barra discontinua"] # 0x2b37 (en: 'leftwards two headed triple dash arrow', google: 'a la izquierda, dos flechas del triple tablero') - - "⏞": [T: "flecha hacia la izquierda con trazo punteado"] # 0x2b38 (en: 'leftwards arrow with dotted stem') - - "âŹč": [T: "flecha hacia la izquierda con cola con trazo vertical"] # 0x2b39 (en: 'leftwards arrow with tail with vertical stroke') - - "âŹș": [T: "flecha hacia la izquierda con cola con doble trazo vertical"] # 0x2b3a (en: 'leftwards arrow with tail with double vertical stroke', google: 'flecha hacia la izquierda con cola con doble carrera vertical') - - "⏻": [T: "flecha de dos cabezas hacia la izquierda con cola"] # 0x2b3b (en: 'leftwards two headed arrow with tail', google: 'a la izquierda, dos flechas con la cola') - - "âŹŒ": [T: "flecha de dos cabezas hacia la izquierda con cola con trazo vertical"] # 0x2b3c (en: 'leftwards two headed arrow with tail with vertical stroke', google: 'a la izquierda, dos flechas con cola con trazo vertical') - - "âŹœ": [T: "flecha de dos cabezas hacia la izquierda con cola con doble trazo vertical"] # 0x2b3d (en: 'leftwards two headed arrow with tail with double vertical stroke', google: 'a la izquierda, dos flechas con cola con trazo vertical doble') - - "âŹŸ": [T: "flecha hacia la izquierda a travĂ©s de X"] # 0x2b3e (en: 'leftwards arrow through x', google: 'flecha hacia la izquierda a travĂ©s de x') - - "⏿": [T: "flecha ondulada apuntando directamente a la izquierda"] # 0x2b3f (en: 'wave arrow pointing directly left', google: 'flecha de onda apuntando directamente a la izquierda') - - "⭀": [T: "signo igual por encima de flecha hacia la izquierda"] # 0x2b40 (en: 'equals sign above leftwards arrow', google: 'igual de la señal de la flecha hacia la izquierda') - - "⭁": [T: "operador de tilde inverso sobre la flecha hacia la izquierda"] # 0x2b41 (en: 'reverse tilde operator above leftwards arrow', google: 'reverse del operador de tilde sobre la flecha de la izquierda') - - "⭂": [T: "flecha hacia la izquierda sobre el reverso de signo casi igual a"] # 0x2b42 (en: 'leftwards arrow above reverse almost equal to') - - "⭃": [T: "flecha hacia la derecha a travĂ©s de signomayor que"] # 0x2b43 (en: 'rightwards arrow through greater than', google: 'flecha hacia la derecha a travĂ©s de mayor que') - - "⭄": [T: "flecha hacia la derecha a travĂ©s de superconjunto"] # 0x2b44 (en: 'rightwards arrow through superset', google: 'arrow hacia la derecha a travĂ©s del superconjunto') - - "⭅": [T: "flecha cuĂĄdruple hacia la izquierda"] # 0x2b45 (en: 'leftwards quadruple arrow', google: 'flecha quadruple hacia la izquierda') - - "⭆": [T: "flecha cuĂĄdruple hacia la derecha"] # 0x2b46 (en: 'rightwards quadruple arrow', google: 'arrow cuĂĄdruple hacia la derecha') - - "⭇": [T: "operador de tilde inverso sobre flecha hacia la derecha"] # 0x2b47 (en: 'reverse tilde operator above rightwards arrow', google: 'reverse el operador de tilde sobre la flecha derecha hacia la derecha') - - "⭈": [T: "flecha hacia la derecha sobre el reverso de signo casi igual a"] # 0x2b48 (en: 'rightwards arrow above reverse almost equal to') - - "⭉": [T: "operador de tilde sobre flecha hacia la izquierda"] # 0x2b49 (en: 'tilde operator above leftwards arrow', google: 'operador de tilde sobre la flecha de la izquierda') - - "⭊": [T: "flecha hacia la izquierda por encima de signo casi igual a"] # 0x2b4a (en: 'leftwards arrow above almost equal to', google: 'flecha hacia la izquierda arriba casi igual a') - - "⭋": [T: "flecha hacia la izquierda sobre operador de tilde inverso"] # 0x2b4b (en: 'leftwards arrow above reverse tilde operator') - - "⭌": [T: "flecha hacia la derecha sobre operador de tilde inverso"] # 0x2b4c (en: 'rightwards arrow above reverse tilde operator') - - "⭐": [T: "estrella media vacĂ­a"] # 0x2b50 (en: 'white medium star') - - "⭑": [T: "estrella pequeña llena"] # 0x2b51 (en: 'black small star') - - "⭒": [T: "estrella pequeña vacĂ­a"] # 0x2b52 (en: 'white small star') - - "⭓": [T: "pentĂĄgono negro apuntando hacia la derecha"] # 0x2b53 (en: 'black right pointing pentagon', google: 'black derecha apuntando al pentĂĄgono') - - "⭔": [T: "pentĂĄgono blanco apuntando hacia la derecha"] # 0x2b54 (en: 'white right pointing pentagon', google: 'pentĂĄgono apuntando a la derecha blanca') - - "⭕": [T: "cĂ­rculo grueso grande"] # 0x2b55 (en: 'heavy large circle', google: 'cĂ­rculo grande y pesado') - - "⭖": [T: "Ăłvalo grueso con Ăłvalo en el interior"] # 0x2b56 (en: 'heavy oval with oval inside', google: 'ovalo pesado con Ăłvalo en el interior') - - "⭗": [T: "cĂ­rculo grueso con cĂ­rculo en el interior"] # 0x2b57 (en: 'heavy circle with circle inside', google: 'cĂ­rculo pesado con cĂ­rculo interior') - - "⭘": [T: "cĂ­rculo grueso"] # 0x2b58 (en: 'heavy circle') - - "⭙": [T: "saltire en cĂ­rculo grueso"] # 0x2b59 (en: 'heavy circled saltire', google: 'saltire con cĂ­rculo pesado') - - "⾀": [T: "marcador de sustituciĂłn en ĂĄngulo recto"] # 0x2e00 (en: 'right angle substitution marker', google translation) - - "➁": [T: "marcador de sustituciĂłn punteado en ĂĄngulo recto"] # 0x2e01 (en: 'right angle dotted substitution marker', google translation) - - "⾂": [T: "soporte de sustituciĂłn izquierdo"] # 0x2e02 (en: 'left substitution bracket', google translation) - - "➃": [T: "soporte de sustituciĂłn derecho"] # 0x2e03 (en: 'right substitution bracket', google translation) - - "⾄": [T: "soporte de sustituciĂłn punteado izquierdo"] # 0x2e04 (en: 'left dotted substitution bracket', google translation) - - "⾅": [T: "soporte de sustituciĂłn punteado derecho"] # 0x2e05 (en: 'right dotted substitution bracket', google translation) - - "⾆": [T: "marcador de interpolaciĂłn elevado"] # 0x2e06 (en: 'raised interpolation marker', google translation) - - "⾇": [T: "marcador de interpolaciĂłn punteado elevado"] # 0x2e07 (en: 'raised dotted interpolation marker', google translation) - - "➈": [T: "marcador de marcador de transposiciĂłn punteado"] # 0x2e08 (en: 'dotted transposition marker marker', google translation) - - "⾉": [T: "soporte de transposiciĂłn izquierdo"] # 0x2e09 (en: 'left transposition bracket', google translation) - - "⾊": [T: "soporte de transposiciĂłn derecho"] # 0x2e0a (en: 'right transposition bracket', google translation) - - "⾋": [T: "cuadrado elevado"] # 0x2e0b (en: 'raised square', google translation) - - "⾌": [T: "soporte de omisiĂłn izquierdo elevado"] # 0x2e0c (en: 'left raised omission bracket', google translation) - - "➍": [T: "soporte de omisiĂłn derecho elevado"] # 0x2e0d (en: 'right raised omission bracket', google translation) - - "⾎": [T: "editorial coronis"] # 0x2e0e (google translation) - - "➏": [T: "pĂĄrrafos"] # 0x2e0f (en: 'paragraphos', google translation) - - "➐": [T: "pĂĄrrafos bifurcados"] # 0x2e10 (en: 'forked paragraphos', google translation) - - "⾑": [T: "pĂĄrrafos invertidos bifurcados"] # 0x2e11 (en: 'reversed forked paragraphos', google translation) - - "⾒": [T: "hipodiastole"] # 0x2e12 (en: 'hypodiastole', google translation) - - "⾓": [T: "Ăłbelos punteados"] # 0x2e13 (en: 'dotted obelos', google translation) - - "⾔": [T: "ĂĄncora hacia abajo"] # 0x2e14 (en: 'downwards ancora', google translation) - - "⾕": [T: "ĂĄncora hacia arriba"] # 0x2e15 (en: 'upwards ancora', google translation) - - "⾖": [T: "ĂĄngulo punteado apuntando hacia la derecha"] # 0x2e16 (en: 'dotted right pointing angle', google translation) - - "⾗": [T: "doble guiĂłn oblicuo"] # 0x2e17 (en: 'double oblique hyphen', google translation) - - "➘": [T: "interrobang invertido"] # 0x2e18 (en: 'inverted interrobang', google translation) - - "⾙": [T: "rama de palma"] # 0x2e19 (en: 'palm branch', google translation) - - "⾚": [T: "guiĂłn con diĂ©resis"] # 0x2e1a (en: 'hyphen with diaeresis', google translation) - - "⾛": [T: "tilde con anillo arriba"] # 0x2e1b (en: 'tilde with ring above', google translation) - - "⾜": [T: "soporte de parĂĄfrasis bajo izquierdo"] # 0x2e1c (en: 'left low paraphrase bracket', google translation) - - "➝": [T: "soporte de parĂĄfrasis bajo derecho"] # 0x2e1d (en: 'right low paraphrase bracket', google translation) - - "⾞": [T: "tilde con punto arriba"] # 0x2e1e (en: 'tilde with dot above', google translation) - - "⾟": [T: "tilde con punto abajo"] # 0x2e1f (en: 'tilde with dot below', google translation) - - "âž ": [T: "barra vertical izquierda con pluma"] # 0x2e20 (en: 'left vertical bar with quill', google translation) - - "➥": [T: "barra vertical derecha con pluma"] # 0x2e21 (en: 'right vertical bar with quill', google translation) - - "âžą": [T: "medio soporte superior izquierdo"] # 0x2e22 (en: 'top left half bracket', google: 'medio soporte superior izquierdo') - - "➣": [T: "medio soporte superior derecho"] # 0x2e23 (en: 'top right half bracket', google: 'arroja superior derecha') - - "➀": [T: "abrazadera inferior izquierda"] # 0x2e24 (en: 'bottom left half bracket', google: 'medio soporte inferior izquierdo') - - "âž„": [T: "medio soporte inferior derecho"] # 0x2e25 (en: 'bottom right half bracket') - - "➊": [T: "soporte U lateral izquierdo"] # 0x2e26 (en: 'left sideways u bracket', google: 'izquierda lateral u soporte') - - "âž§": [T: "soporte U lateral derecho"] # 0x2e27 (en: 'right sideways u bracket', google: 'right sideways u soporte') - - "âžš": [T: "doble parĂ©ntesis izquierdo"] # 0x2e28 (en: 'left double parentheses', google: 'dejĂł doble parĂ©ntesis de tesas') - - "âž©": [T: "doble parĂ©ntesis derecho"] # 0x2e29 (en: 'right double parentheses', google: 'doble parĂ©ntesis derecha') - - "âžȘ": [T: "dos puntos sobre un punto de puntuaciĂłn"] # 0x2e2a (en: 'two dots over one dot punctuation', google translation) - - "âž«": [T: "un punto sobre dos puntos de puntuaciĂłn"] # 0x2e2b (en: 'one dot over two dots punctuation', google translation) - - "➏": [T: "cuatro puntos de puntuaciĂłn al cuadrado"] # 0x2e2c (en: 'squared four dot punctuation', google translation) - - "âž­": [T: "marca de cinco puntos"] # 0x2e2d (en: 'five dot mark', google translation) - - "âžź": [T: "signo de interrogaciĂłn invertido"] # 0x2e2e (en: 'reversed question mark', google translation) - - "➯": [T: "tilde vertical"] # 0x2e2f (en: 'vertical tilde', google translation) - - "âž°": [T: "punta del anillo"] # 0x2e30 (en: 'ring point', google translation) - - "âž±": [T: "punto medio separador de palabras"] # 0x2e31 (en: 'word separator middle dot', google translation) - - "âžČ": [T: "convertido en coma"] # 0x2e32 (en: 'turned comma', google translation) - - "âžł": [T: "punto elevado"] # 0x2e33 (en: 'raised dot', google translation) - - "➎": [T: "coma elevada"] # 0x2e34 (en: 'raised comma', google translation) - - "âž”": [T: "convertido en punto y coma"] # 0x2e35 (en: 'turned semicolon', google translation) - - "âž¶": [T: "obelisco con portaestandarte izquierdo"] # 0x2e36 (en: 'dagger with left guard', google translation) - - "âž·": [T: "obelisco con portaestandarte derecho"] # 0x2e37 (en: 'dagger with right guard', google translation) - - "âžž": [T: "obelisco girado"] # 0x2e38 (en: 'turned dagger', google translation) - - "âžč": [T: "señal de la mitad superior de la secciĂłn"] # 0x2e39 (en: 'top half section sign', google translation) - - "âžș": [T: "dos em lĂ­nea discontinua"] # 0x2e3a (en: 'two em dash', google translation) - - "âž»": [T: "tres em lĂ­nea discontinua"] # 0x2e3b (en: 'three em dash', google translation) - - "〃": [T: "Ă­dem mark"] # 0x3003 (en: 'ditto mark', google translation) - - "〈": [T: "soporte de ĂĄngulo izquierdo"] # 0x3008 (en: 'left angle bracket') - - "〉": [T: "soporte de ĂĄngulo derecho"] # 0x3009 (en: 'right angle bracket') - - "《": [T: "doble parĂ©ntesis angular izquierdo"] # 0x300a (en: 'left double angle bracket') - - "》": [T: "doble parĂ©ntesis angular derecho"] # 0x300b (en: 'right double angle bracket', MathPlayer: 'cierra parĂ©ntesis angular doble', google: 'soporte de doble ĂĄngulo derecho') - - "「": [T: "soporte de esquina izquierda"] # 0x300c (en: 'left corner bracket', google: 'soporte de esquina izquierda') - - "」": [T: "soporte de esquina derecha"] # 0x300d (en: 'right corner bracket') - - "『": [T: "soporte de esquina blanca izquierda"] # 0x300e (en: 'left white corner bracket', google: 'soporte de esquina blanca izquierda') - - "』": [T: "soporte de esquina blanca derecha"] # 0x300f (en: 'right white corner bracket', google: 'soporte de esquina blanca derecha') - - "【": [T: "soporte Lenticular negro izquierdo"] # 0x3010 (en: 'left black lenticular bracket', google: 'soporte lenticular negro izquierdo') - - "】": [T: "soporte Lenticular Negro Derecho"] # 0x3011 (en: 'right black lenticular bracket', google: 'soporte lenticular negro derecho') - - "〔": [T: "soporte de caparazĂłn de tortuga izquierdo"] # 0x3014 - - "〕": [T: "soporte de caparazĂłn de tortuga derecho"] # 0x3015 - - "〖": [T: "soporte lenticular blanco izquierdo"] # 0x3016 (en: 'left white lenticular bracket') - - "〗": [T: "soporte lenticular blanco derecho"] # 0x3017 (en: 'right white lenticular bracket') - - "〘": [T: "soporte de caparazĂłn de tortuga blanco izquierdo"] # 0x3018 (en: 'left white tortoise shell bracket', google: 'soporte de carcasa de tortuga blanca izquierda') - - "〙": [T: "soporte de caparazĂłn de tortuga blanco derecho"] # 0x3019 (en: 'right white tortoise shell bracket', google: 'soporte de carcasa de tortuga blanca derecha') - - "〚": [T: "corchete vacĂ­o izquierdo"] # 0x301a (en: 'left white square bracket') - - "〛": [T: "corchete vacĂ­o derecho"] # 0x301b (en: 'right white square bracket', MathPlayer: 'cierra corchete vacĂ­o', google: 'soporte cuadrado blanco derecho') - - "〜": [T: "lĂ­nea discontinua ondulada"] # 0x301c (en: 'wave dash', google: 'ola de ola') - - "〰": [T: "lĂ­nea discontinua en zigzag"] # 0x3030 (en: 'wavy dash', google: 'dash ondulado') - - "㉈": [T: "nĂșmero diez rodeado por un cĂ­rculo en un cuadrado negro"] # 0x3248 (en: 'circled number ten on black square', google: 'circlado nĂșmero diez en black square') - - "㉉": [T: "nĂșmero veinte rodeado por un cĂ­rculo en un cuadrado negro"] # 0x3249 (en: 'circled number twenty on black square', google: 'nĂșmero de cĂ­rculo veinte en black square') - - "㉊": [T: "nĂșmero treinta rodeado por un cĂ­rculo en un cuadrado negro"] # 0x324a (en: 'circled number thirty on black square', google: 'nĂșmero de cĂ­rculo treinta en black square') - - "㉋": [T: "nĂșmero cuarenta rodeado por un cĂ­rculo en un cuadrado negro"] # 0x324b (en: 'circled number forty on blacks square', google: 'nĂșmero de cĂ­rculo cuarenta en blacks square') - - "㉌": [T: "nĂșmero cincuenta rodeado por un cĂ­rculo en un cuadrado negro"] # 0x324c (en: 'circled number fifty on black square', google: 'nĂșmero de cĂ­rculo cincuenta en black square') - - "㉍": [T: "nĂșmero sesenta rodeado por un cĂ­rculo en un cuadrado negro"] # 0x324d (en: 'circled number sixty on black square', google: 'nĂșmero de cĂ­rculos sesenta en black square') - - "㉎": [T: "nĂșmero setenta rodeado por un cĂ­rculo en un cuadrado negro"] # 0x324e (en: 'circled number seventy on black square', google: 'nĂșmero de cĂ­rculo setenta en black square') - - "㉏": [T: "nĂșmero ochenta rodeado por un cĂ­rculo en un cuadrado negro"] # 0x324f (en: 'circled number eighty on black square', google: 'nĂșmero de cĂ­rculo aty en black square') - - "㉑": [T: "nĂșmero veintiuno rodeado por un cĂ­rculo"] # 0x3251 (en: 'circled number twenty one', google translation) - - "㉒": [T: "nĂșmero veintidĂłs rodeado por un cĂ­rculo"] # 0x3252 (en: 'circled number twenty two', google translation) - - "㉓": [T: "nĂșmero veintitrĂ©s rodeado por un cĂ­rculo"] # 0x3253 (en: 'circled number twenty three', google translation) - - "㉔": [T: "nĂșmero veinticuatro rodeado por un cĂ­rculo"] # 0x3254 (en: 'circled number twenty four', google translation) - - "㉕": [T: "nĂșmero veinticinco rodeado por un cĂ­rculo"] # 0x3255 (en: 'circled number twenty five', google translation) - - "㉖": [T: "nĂșmero veintisĂ©is rodeado por un cĂ­rculo"] # 0x3256 (en: 'circled number twenty six', GPT-5.4 fixed translation) - - "㉗": [T: "nĂșmero veintisiete rodeado por un cĂ­rculo"] # 0x3257 (en: 'circled number twenty seven', google translation) - - "㉘": [T: "nĂșmero veintiocho rodeado por un cĂ­rculo"] # 0x3258 (en: 'circled number twenty eight', google translation) - - "㉙": [T: "nĂșmero veintinueve rodeado por un cĂ­rculo"] # 0x3259 (en: 'circled number twenty nine', GPT-5.4 fixed translation) - - "㉚": [T: "nĂșmero treinta rodeado por un cĂ­rculo"] # 0x325a (en: 'circled number thirty', google translation) - - "㉛": [T: "nĂșmero treinta y uno rodeado por un cĂ­rculo"] # 0x325b (en: 'circled number thirty one', GPT-5.4 fixed translation) - - "㉜": [T: "nĂșmero treinta y dos rodeado por un cĂ­rculo"] # 0x325c (en: 'circled number thirty two', google translation) - - "㉝": [T: "nĂșmero treinta y tres rodeado por un cĂ­rculo"] # 0x325d (en: 'circled number thirty three', google translation) - - "㉞": [T: "nĂșmero treinta y cuatro rodeado por un cĂ­rculo"] # 0x325e (en: 'circled number thirty four', google translation) - - "㉟": [T: "nĂșmero treinta y cinco rodeado por un cĂ­rculo"] # 0x325f (en: 'circled number thirty five', google translation) - - "㊱": [T: "nĂșmero treinta y seis rodeado por un cĂ­rculo"] # 0x32b1 (en: 'circled number thirty six', google translation) - - "ăŠČ": [T: "nĂșmero treinta y siete rodeado por un cĂ­rculo"] # 0x32b2 (en: 'circled number thirty seven', GPT-5.4 translation) - - "㊳": [T: "nĂșmero treinta y ocho rodeado por un cĂ­rculo"] # 0x32b3 (en: 'circled number thirty eight', GPT-5.4 translation) - - "㊮": [T: "nĂșmero treinta y nueve rodeado por un cĂ­rculo"] # 0x32b4 (en: 'circled number thirty nine', GPT-5.4 translation) - - "㊔": [T: "nĂșmero cuarenta rodeado por un cĂ­rculo"] # 0x32b5 (en: 'circled number forty', GPT-5.4 translation) - - "㊶": [T: "nĂșmero cuarenta y uno rodeado por un cĂ­rculo"] # 0x32b6 (en: 'circled number forty one', GPT-5.4 translation) - - "㊷": [T: "nĂșmero cuarenta y dos rodeado por un cĂ­rculo"] # 0x32b7 (en: 'circled number forty two', GPT-5.4 translation) - - "㊾": [T: "nĂșmero cuarenta y tres rodeado por un cĂ­rculo"] # 0x32b8 (en: 'circled number forty three', GPT-5.4 translation) - - "ăŠč": [T: "nĂșmero cuarenta y cuatro rodeado por un cĂ­rculo"] # 0x32b9 (en: 'circled number forty four', GPT-5.4 translation) - - "ăŠș": [T: "nĂșmero cuarenta y cinco rodeado por un cĂ­rculo"] # 0x32ba (en: 'circled number forty five', GPT-5.4 translation) - - "㊻": [T: "nĂșmero cuarenta y seis rodeado por un cĂ­rculo"] # 0x32bb (en: 'circled number forty six', GPT-5.4 translation) - - "ăŠŒ": [T: "nĂșmero cuarenta y siete rodeado por un cĂ­rculo"] # 0x32bc (en: 'circled number forty seven', GPT-5.4 translation) - - "ăŠœ": [T: "nĂșmero cuarenta y ocho rodeado por un cĂ­rculo"] # 0x32bd (en: 'circled number forty eight', GPT-5.4 translation) - - "ăŠŸ": [T: "nĂșmero cuarenta y nueve rodeado por un cĂ­rculo"] # 0x32be (en: 'circled number forty nine', GPT-5.4 translation) - - "㊿": [T: "nĂșmero cincuenta rodeado por un cĂ­rculo"] # 0x32bf (en: 'circled number fifty', GPT-5.4 translation) - - "㋌": [T: "mercurio"] # 0x32cc (en: 'mercury', google translation) - - "㋍": [T: "ergs"] # 0x32cd (google translation) - - "㋎": [T: "electronvoltios"] # 0x32ce (en: 'electron volts', google translation) - - "㋏": [T: "señal de responsabilidad limitada"] # 0x32cf (en: 'limited liability sign', google translation) - - "ă±": [T: "hectopascales"] # 0x3371 (en: 'hectopascals', google translation) - - "ăČ": [T: "daltons"] # 0x3372 (google translation) - - "㍳": [T: "unidades astronĂłmicas"] # 0x3373 (en: 'astronomical units', google translation) - - "㍮": [T: "barras"] # 0x3374 (en: 'bars', google translation) - - "ă”": [T: "o v"] # 0x3375 (google translation) - - "ă¶": [T: "parsecs"] # 0x3376 (google translation) - - "ă·": [T: "decĂ­metros"] # 0x3377 (en: 'decimeters', google translation) - - "㍾": [T: "decĂ­metros al cuadrado"] # 0x3378 (en: 'decimeters squared', google translation) - - "ăč": [T: "decĂ­metros al cubo"] # 0x3379 (en: 'decimeters cubed', google translation) - - "ăș": [T: "unidades instrumentales"] # 0x337a (en: 'instrumental units', google translation) - - "㎀": [T: "picoamperios"] # 0x3380 (google translation) - - "㎁": [T: "nanoamperios"] # 0x3381 (google translation) - - "㎂": [T: "microamperios"] # 0x3382 (google translation) - - "㎃": [T: "miliamperios"] # 0x3383 (en: 'milliamps', google translation) - - "㎄": [T: "kiloamperios"] # 0x3384 (google translation) - - "㎅": [T: "kilobytes"] # 0x3385 (google translation) - - "㎆": [T: "megabytes"] # 0x3386 (google translation) - - "㎇": [T: "gigabytes"] # 0x3387 (google translation) - - "㎈": [T: "calorĂ­as"] # 0x3388 (en: 'calories', google translation) - - "㎉": [T: "kilocalorĂ­as"] # 0x3389 (en: 'kilocalories', google translation) - - "㎊": [T: "picofaradios"] # 0x338a (google translation) - - "㎋": [T: "nanofaradios"] # 0x338b (google translation) - - "㎌": [T: "microfaradios"] # 0x338c (google translation) - - "㎍": [T: "microgramos"] # 0x338d (en: 'micrograms', google translation) - - "㎎": [T: "miligramos"] # 0x338e (en: 'milligrams', google translation) - - "㎏": [T: "kilogramos"] # 0x338f (en: 'kilograms', google translation) - - "㎐": [T: "hercios"] # 0x3390 (google translation) - - "㎑": [T: "kilohercios"] # 0x3391 (en: 'kilohertz', google translation) - - "㎒": [T: "megahercios"] # 0x3392 (en: 'megahertz', google translation) - - "㎓": [T: "gigahercios"] # 0x3393 (google translation) - - "㎔": [T: "terahercios"] # 0x3394 (google translation) - - "㎕": [T: "microlitros"] # 0x3395 (en: 'microliters', google translation) - - "㎖": [T: "mililitros"] # 0x3396 (google translation) - - "㎗": [T: "decilitros"] # 0x3397 (en: 'deciliters', google translation) - - "㎘": [T: "kilolitros"] # 0x3398 (en: 'kiloliters', google translation) - - "㎙": [T: "femtĂłmetros"] # 0x3399 (en: 'femtometers', google translation) - - "㎚": [T: "micrĂłmetros"] # 0x339b (en: 'micrometers', google translation) - - "㎜": [T: "milĂ­metros"] # 0x339c (en: 'millimeters', google translation) - - "㎝": [T: "centĂ­metros"] # 0x339d (en: 'centimeters', google translation) - - "㎞": [T: "kilĂłmetros"] # 0x339e (en: 'kilometers', google translation) - - "㎟": [T: "milĂ­metros cuadrados"] # 0x339f (en: 'millimeters squared', google translation) - - "㎠": [T: "centĂ­metros cuadrados"] # 0x33a0 (en: 'centimeters squared', google translation) - - "㎡": [T: "metros cuadrados"] # 0x33a1 (en: 'meters squared', google translation) - - "㎱": [T: "kilĂłmetros cuadrados"] # 0x33a2 (en: 'kilometers squared', google translation) - - "㎣": [T: "milĂ­metros cĂșbicos"] # 0x33a3 (en: 'millimeters cubed', google translation) - - "㎀": [T: "centĂ­metros cĂșbicos"] # 0x33a4 (en: 'centimeters cubed', google translation) - - "㎄": [T: "metros cĂșbicos"] # 0x33a5 (en: 'meters cubed', google translation) - - "㎩": [T: "kilĂłmetros cĂșbicos"] # 0x33a6 (en: 'kilometers cubed', google translation) - - "㎧": [T: "metros por segundo"] # 0x33a7 (en: 'meters per second', google translation) - - "㎹": [T: "metros por segundo al cuadrado"] # 0x33a8 (en: 'meters per second squared', google translation) - - "㎩": [T: "pascales"] # 0x33a9 (en: 'pascals', google translation) - - "ăŽȘ": [T: "kilopascales"] # 0x33aa (en: 'kilopascals', google translation) - - "㎫": [T: "megapascales"] # 0x33ab (en: 'megapascals', google translation) - - "㎬": [T: "gigapascales"] # 0x33ac (en: 'gigapascals', google translation) - - "㎭": [T: "radiĂĄn"] # 0x33ad (google translation) - - "㎼": [T: "radiĂĄn por segundo"] # 0x33ae (en: 'rads per second', google translation) - - "㎯": [T: "radiĂĄn por segundo al cuadrado"] # 0x33af (en: 'rads per second squared', google translation) - - "㎰": [T: "picosegundos"] # 0x33b0 (en: 'picoseconds', google translation) - - "㎱": [T: "nanosegundos"] # 0x33b1 (en: 'nanoseconds', google translation) - - "ăŽČ": [T: "microsegundos"] # 0x33b2 (en: 'microseconds', google translation) - - "㎳": [T: "milisegundos"] # 0x33b3 (en: 'milliseconds', google translation) - - "㎮": [T: "picovoltios"] # 0x33b4 (google translation) - - "㎔": [T: "nanovoltios"] # 0x33b5 (en: 'nanovolts', google translation) - - "㎶": [T: "microvoltios"] # 0x33b6 (en: 'microvolts', google translation) - - "㎷": [T: "milivoltios"] # 0x33b7 (en: 'millivolts', google translation) - - "㎾": [T: "kilovoltios"] # 0x33b8 (en: 'kilovolts', google translation) - - "ăŽč": [T: "megavoltios"] # 0x33b9 (google translation) - - "ăŽș": [T: "picovatios"] # 0x33ba (google translation) - - "㎻": [T: "nanovatios"] # 0x33bb (google translation) - - "ăŽŒ": [T: "microvatios"] # 0x33bc (google translation) - - "ăŽœ": [T: "milivatios"] # 0x33bd (google translation) - - "ăŽŸ": [T: "kilovatios"] # 0x33be (en: 'kilowatts', google translation) - - "㎿": [T: "megavatios"] # 0x33bf (google translation) - - "㏀": [T: "kiloohmios"] # 0x33c0 (google translation) - - "㏁": [T: "megaohmios"] # 0x33c1 (google translation) - - "㏂": [T: "attĂłmetros"] # 0x33c2 (en: 'attometers', google translation) - - "㏃": [T: "becquerels"] # 0x33c3 (google translation) - - "㏄": [T: "centĂ­metros cubicos"] # 0x33c4 (en: 'cubic centimeters', google translation) - - "㏅": [T: "candelas"] # 0x33c5 (google translation) - - "㏆": [T: "culombios por kilogramos"] # 0x33c6 (en: 'coulombs per kilogram', google translation) - - "㏇": [T: "volumen minuto"] # 0x33c7 (en: 'cardiac output', google translation) - - "㏈": [T: "decibelios"] # 0x33c8 (en: 'decibels', google translation) - - "㏉": [T: "grises"] # 0x33c9 (en: 'grays', google translation) - - "㏊": [T: "hectĂĄreas"] # 0x33ca (en: 'hectares', google translation) - - "㏋": [T: "caballo de fuerza"] # 0x33cb (en: 'horsepower', google translation) - - "㏌": [T: "pulgadas"] # 0x33cc (en: 'inches', google translation) - - "㏍": [T: "kilokelvins"] # 0x33cd (google translation) - - "㏎": [T: "kilĂłmetros"] # 0x33ce (en: 'kilometers', google translation) - - "㏏": [T: "nudos"] # 0x33cf (en: 'knots', google translation) - - "㏐": [T: "lĂșmenes"] # 0x33d0 (en: 'lumens', google translation) - - "㏑": [T: "logaritmo natural"] # 0x33d1 (en: 'natural log', google translation) - - "㏒": [T: "logaritmo"] # 0x33d2 (en: 'logarithm', google translation) - - "㏓": [T: "lux"] # 0x33d3 (google translation) - - "㏔": [T: "milibares"] # 0x33d4 (google translation) - - "㏕": [T: "mills"] # 0x33d5 (en: 'mills', google translation) - - "㏖": [T: "moles"] # 0x33d6 (google translation) - - "㏗": [T: "p h"] # 0x33d7 (google translation) - - "㏘": [T: "picĂłmetros"] # 0x33d8 (en: 'picometers', google translation) - - "㏙": [T: "partes por millĂłn"] # 0x33d9 (en: 'parts per million', google translation) - - "㏚": [T: "roentgens"] # 0x33da (en: 'petaroentgens', google translation) - - "㏛": [T: "estererradiĂĄn"] # 0x33db (en: 'steradians', google translation) - - "㏜": [T: "sieverts"] # 0x33dc (google translation) - - "㏝": [T: "webers"] # 0x33dd (google translation) - - "㏞": [T: "voltios por metro"] # 0x33de (en: 'volts per meter', google translation) - - "㏟": [T: "amperios por metro"] # 0x33df (en: 'amps per meter', google translation) - - "㏿": [T: "galones"] # 0x33ff (en: 'gallons', google translation) - - "": [T: "sino igual a con sombrero debajo"] # 0xe900 (en: 'equals with hat below', google translation) - - "": [T: "es igual a con signo mĂĄs encima"] # 0xe901 (en: 'equals with plus above', google translation) - - "â©Č": [T: "es igual a con signo mĂĄs encima"] # 0x2a72 (en: 'equals with plus above') - - "": [T: "es igual a con signo mĂĄs debajo"] # 0xe902 (en: 'equals with plus below', google translation) - - "⩱": [T: "es igual a con signo mĂĄs debajo"] # 0x2a71 (en: 'equals with plus below') - - "": [T: "tilde con mĂĄs encima"] # 0xe903 (en: 'tilde with plus above', google translation) - - "⚊": [T: "tilde con signo mĂĄs encima"] # 0x2a26 (en: 'tilde with plus above') - - "": [T: "tilde signo mĂĄs debajo"] # 0xe904 (en: 'tilde with plus below', google translation) - - "⚀": [T: "tilde con signo mĂĄs debajo"] # 0x2a24 (en: 'tilde with plus below') - - "": [T: "doble signo igual sobre mayor que"] # 0xe908 (en: 'equal double over greater than', google translation) - - "": [T: "doble signo igual sobre menor que"] # 0xe909 (en: 'equal double over less than', google translation) - - "âȘ™": [T: "doble signo igual sobre menor que"] # 0x2a99 (en: 'equal double over less than') - - "": [T: "contiene o igual a"] # 0xe90a (en: 'contains or equal to', google translation) - - "⋜": [T: "contiene o igual a"] # 0x22fd (en: 'contains or equal to') - - "": [T: "superconjunto de o igual a"] # 0xe90b (en: 'superset of or equal to', google translation) - - "": [T: "subconjunto de o igual a"] # 0xe90c (en: 'subset of or equal to', google translation) - - "": [T: "signo igual sobre signo menor que"] # 0xe90d (en: 'equal over less than', google translation) - - "": [T: "elemento de o igual a"] # 0xe912 (en: 'element of or equal to', google translation) - - "⋷": [T: "elemento de o igual a"] # 0x22f7 (en: 'element of or equal to') - - "": [T: "igual a o mayor que"] # 0xe913 (en: 'equal to or greater than', google translation) - - "âȘš": [T: "mayor que o igual a"] # 0x2a9a (en: 'equal to or greater than') - - "": [T: "superconjunto aproximado de"] # 0xe914 (en: 'approximate superset of', google translation) - - "⫈": [T: "contiene aproximadamente a"] # 0x2ac8 (en: 'approximate superset of') - - "": [T: "subconjunto aproximado de"] # 0xe915 (en: 'approximate subset of', google translation) - - "⫇": [T: "incluido aproximadamente en"] # 0x2ac7 (en: 'approximate subset of') - - "": [T: "superconjunto de con punto incluido como sub-relaciĂłn"] # 0xe916 (en: 'superset of with dot includes as sub relation', google translation) - - "âȘŸ": [T: "contiene como sub-relaciĂłn a"] # 0x2abe (en: 'superset of with dot includes as sub relation') - - "": [T: "el subconjunto de con dot se incluye en una subselecciĂłn"] # 0xe917 (en: 'subset of with dot is included in as sub relation', google translation) - - "âȘœ": [T: "sub-relaciĂłn de"] # 0x2abd (en: 'subset of with dot is included in as sub relation') - - "": [T: "signo igual a con punto debajo"] # 0xe918 (en: 'equal with dot below', google translation) - - "⩊": [T: "signo igual a con punto debajo"] # 0x2a66 (en: 'equal with dot below') - - "": [T: "punto izquierdo sobre signo menos sobre punto derecho"] # 0xe919 (en: 'left dot over minus over right dot', google translation) - - "": [T: "punto derecho sobre signo menos sobre punto izquierdo"] # 0xe91a (en: 'right dot over minus over left dot', google translation) - - "": [T: "casi igual a menos"] # 0xe91f (en: 'almost equal to minus', google translation) - - "": [T: "taza doble cuadrada"] # 0xe920 (en: 'double square cup', google translation) - - "": [T: "doble cuadrado en mayĂșsculas"] # 0xe921 (en: 'double square cap', google translation) - - "": [T: "menor que igual o mayor que"] # 0xe922 (en: 'less than equal to or greater than', google translation) - - "": [T: "tilde con punto"] # 0xe924 (en: 'tilde with dot', google translation) - - "â©Ș": [T: "tilde con punto"] # 0x2a6a (en: 'tilde with dot') - - "": [T: "tilde con dos puntos"] # 0xe925 (en: 'tilde with two dots', google translation) - - "": [T: "menor que mayor o igual a"] # 0xe926 (en: 'less than greater than or equal to', google translation) - - "âȘ‘": [T: "menor que mayor que o igual a"] # 0x2a91 (en: 'less than greater than or equal to') - - "": [T: "mayor que menor que o igual a"] # 0xe927 (en: 'greater than less than or equal to', google translation) - - "âȘ’": [T: "mayor que menor que o igual a"] # 0x2a92 (en: 'greater than less than or equal to') - - "": [T: "equivalente a o menor que"] # 0xe928 (en: 'equivalent to or less than', google translation) - - "âȘ": [T: "equivalente a o menor que"] # 0x2a9d (en: 'equivalent to or less than') - - "": [T: "equivalente a o mayor que"] # 0xe929 (en: 'equivalent to or greater than', google translation) - - "î€Ș": [T: "operador de caja abierta izquierda"] # 0xe92a (en: 'left open box operator', google translation) - - "": [T: "operador de caja abierta derecha"] # 0xe92b (en: 'right open box operator', google translation) - - "": [T: "idĂ©ntico a con punto"] # 0xe92c (en: 'identical to with dot', google translation) - - "": [T: "mayor que igual a o menor que"] # 0xe92d (en: 'greater than equal to or less than', google translation) - - "": [T: "operador de barra"] # 0xe92e (en: 'bar operator', google translation) - - "": [T: "operador de doble barra"] # 0xe92f (en: 'double bar operator', google translation) - - "": [T: "operador de triple barra"] # 0xe930 (en: 'triple bar operator', google translation) - - "î€Č": [T: "menor que o aproximadamente igual a"] # 0xe932 (en: 'less than or approximately equal to', google translation) - - "": [T: "mayor que o aproximadamente igual a"] # 0xe933 (en: 'greater than or approximately equal to', google translation) - - "": [T: "menor que anidado"] # 0xe936 (en: 'nested less than', google translation) - - "âȘĄ": [T: "mucho menor que"] # 0x2aa1 (en: 'nested less than') - - "": [T: "mayor que anidado"] # 0xe937 (en: 'nested greater than', google translation) - - "âȘą": [T: "mucho mayor que"] # 0x2aa2 (en: 'nested greater than') - - "î€ș": [T: "precede o equivalente a"] # 0xe93a (en: 'precedes or equivalent to', google translation) - - "": [T: "sucede o equivalente a"] # 0xe93b (en: 'succeeds or equivalent to', google translation) - - "î„€": [T: "precede sobre signo igual"] # 0xe940 (en: 'precedes over equal', google translation) - - "": [T: "sucede sobre signo igual"] # 0xe941 (en: 'succeeds over equal', google translation) - - "î„‚": [T: "menor igual inclinado mayor"] # 0xe942 (en: 'less equal slanted greater', google translation) - - "": [T: "mayor igual inclinado menor"] # 0xe943 (en: 'greater equal slanted less', google translation) - - "": [T: "satisfecho por"] # 0xe948 (en: 'satisfied by', google translation) - - "": [T: "lazy s"] # 0xe949 (en: 'lazy s', google translation) - - "": [T: "no afirmaciĂłn"] # 0xe94a (en: 'not assertion', google translation) - - "î„‹": [T: "doble igual"] # 0xe94b (en: 'double equal', google translation) - - "â©”": [T: "doble igual"] # 0x2a75 (en: 'double equal') - - "": [T: "triple igual"] # 0xe94c (en: 'triple equal', google translation) - - "": [T: "regla retardada"] # 0xe94d (en: 'rule delayed', google translation) - - "â§Ž": [T: "regla retardada"] # 0x29f4 - - "": [T: "delimitador de alias"] # 0xe94e (en: 'alias delimiter', google translation) - - "": [T: "subgrupo normal de con barra"] # 0xe950 (en: 'normal subgroup of with bar', google translation) - - "⧏": [T: "subgrupo normal o igual a"] # 0x29cf (en: 'normal subgroup of with bar') - - "î„‘": [T: "contiene como subgrupo normal con barra"] # 0xe951 (en: 'contains as normal subgroup with bar', google translation) - - "⧐": [T: "contiene como subgrupo normal o es igual a"] # 0x29d0 (en: 'contains as normal subgroup with bar') - - "î„”": [T: "implica circular"] # 0xe954 (en: 'round implies', google translation) - - "â„°": [T: "implica circular"] # 0x2970 - - "î„•": [T: "emoticono de sonrisa debajo de una barra"] # 0xe955 (en: 'smile under bar', google translation) - - "î„–": [T: "emoticono de ceño fruncido sobe barra"] # 0xe956 (en: 'frown over bar', google translation) - - "î„—": [T: "superconjunto de o casi igual a"] # 0xe957 (en: 'superset of or almost equal to', google translation) - - "": [T: "subconjunto de o casi igual a"] # 0xe958 (en: 'subset of or almost equal to', google translation) - - "î„™": [T: "mayor que casi igual a o menor que"] # 0xe959 (en: 'greater than almost equal to or less than', google translation) - - "": [T: "menor que casi igual a o mayor que"] # 0xe95a (en: 'less than almost equal or greater than', google translation) - - "": [T: "doble o lĂłgica"] # 0xe95c (en: 'double logical or', google translation) - - "⩔": [T: "o"] # 0x2a54 (en: 'double logical or') - - "": [T: "doble y lĂłgica"] # 0xe95d (en: 'double logical and', google translation) - - "⩓": [T: "y"] # 0x2a53 (en: 'double logical and') - - "": [T: "o lĂłgica con doble barra debajo"] # 0xe95e (en: 'logical or with double bar below', google translation) - - "": [T: "o lĂłgica con barra debajo"] # 0xe95f (en: 'logical or with bar below', google translation) - - "": [T: "casi igual sobre igual"] # 0xe962 (en: 'almost equal over equal', google translation) - - "î„€": [T: "triĂĄngulo apuntando a la izquierda con barra bisectriz"] # 0xe964 - - "î„„": [T: "triĂĄngulo apuntando a la derecha con barra bisectriz"] # 0xe965 (en: 'right pointing triangle with bisecting bar', google translation) - - "": [T: "es igual a la lĂ­nea punteada superior"] # 0xe966 (en: 'equals with dotted top line', google translation) - - "î„§": [T: "precede con dos puntos"] # 0xe967 (en: 'precedes with colon', google translation) - - "": [T: "sucede con dos puntos"] # 0xe968 (en: 'succeeds with colon', google translation) - - "î„©": [T: "mĂĄs pequeño o igual inclinado"] # 0xe969 (en: 'smaller than or equal slanted', google translation) - - "î„Ș": [T: "mĂĄs grande o igual inclinado"] # 0xe96a (en: 'larger than or equal slanted', google translation) - - "î„«": [T: "mucho menor que anidado"] # 0xe96b (en: 'nested very much less than', google translation) - - "": [T: "mucho mayor que anidado"] # 0xe96c (en: 'nested very much greater than', google translation) - - "î„­": [T: "diferencia entre variantes"] # 0xe96d (en: 'difference between variant', google translation) - - "âȘź": [T: "diferencia entre"] # 0x2aae (en: 'difference between variant') - - "": [T: "superposiciĂłn de menor que mayor que"] # 0xe96e (en: 'less than greater than overlay', google translation) - - "âȘ€": [T: "superposiciĂłn de menor que mayor que"] # 0x2aa4 (en: 'less than greater than overlay') - - "": [T: "o lĂłgica y lĂłgica superpuestas"] # 0xe96f (en: 'logical or logical and overlay', google translation) - - "î„°": [T: "superconjunto sobre superconjunto"] # 0xe970 (en: 'superset over superset', google translation) - - "⫖": [T: "superconjunto sobre superconjunto"] # 0x2ad6 (en: 'superset over superset') - - "": [T: "subconjunto sobre subconjunto"] # 0xe971 (en: 'subset over subset', google translation) - - "⫕": [T: "subconjunto por encima de subconjunto"] # 0x2ad5 (en: 'subset over subset') - - "î„Č": [T: "superconjunto sobre subconjunto"] # 0xe972 (en: 'superset over subset', google translation) - - "⫔": [T: "contiene o estĂĄ incluido en"] # 0x2ad4 (en: 'superset over subset') - - "": [T: "subconjunto sobre superconjunto"] # 0xe973 (en: 'subset over superset', google translation) - - "⫓": [T: "estĂĄ incluido o contiene a"] # 0x2ad3 (en: 'subset over superset') - - "î„č": [T: "triple barra vertical"] # 0xe979 (en: 'triple vertical bar', google translation) - - "î„ș": [T: "puntos verticales cuĂĄdruples emparejados"] # 0xe97a (en: 'paired quadruple vertical dots', google translation) - - "î„»": [T: "perpendicular sobre barra"] # 0xe97b (en: 'perpendicular over bar', google translation) - - "⫚": [T: "perpendicular sobre barra"] # 0x2ae8 (en: 'perpendicular over bar') - - "": [T: "doble barra vertical con torniquete a la izquierda"] # 0xe97c (en: 'left turnstile double vertical bar', google translation) - - "": [T: "doble barra vertical con doble torniquete a la izquierda"] # 0xe97d (en: 'double left turnstile double vertical bar', google translation) - - "": [T: "perpendicular sobre perpendicular invertida"] # 0xe97e (en: 'perpendicular over inverted perpendicular', google translation) - - "": [T: "barra vertical con doble torniquete a la izquierda"] # 0xe97f (en: 'double left turnstile vertical bar', google translation) - - "â«€": [T: "barra vertical con doble torniquete a la izquierda"] # 0x2ae4 - - "": [T: "apertura de ĂĄngulo esfĂ©rico"] # 0xe980 (en: 'spherical angle opening up', google translation) - - "": [T: "doble barra"] # 0xe981 (en: 'double slash', google translation) - - "": [T: "ĂĄngulo recto con esquina"] # 0xe982 (en: 'right angle with corner', google translation) - - "": [T: "barra vertical rodeada por un cĂ­rculo"] # 0xe984 (en: 'circled vertical bar', google translation) - - "⊶": [T: "barra vertical rodeada por un cĂ­rculo"] # 0x29b6 (en: 'circled vertical bar') - - "": [T: "signo de divisiĂłn rodeado por un cĂ­rculo"] # 0xe985 (en: 'circled division sign', google translation) - - "âšž": [T: "signo de divisiĂłn rodeado por un cĂ­rculo"] # 0x2a38 (en: 'circled division sign') - - "": [T: "solidus discontinuo"] # 0xe986 (en: 'dashed solidus', google translation) - - "": [T: "barra inversa discontinua"] # 0xe987 (en: 'dashed backslash', google translation) - - "": [T: "lĂ­nea media discontinua"] # 0xe988 (en: 'dashed mid line', google translation) - - "": [T: "barra vertical discontinua"] # 0xe989 (en: 'dashed vertical bar', google translation) - - "": [T: "perpendicular con s"] # 0xe98a (en: 'perpendicular with s', google translation) - - "": [T: "ĂĄngulo con s"] # 0xe98b (en: 'angle with s', google translation) - - "": [T: "apertura izquierda en ĂĄngulo esfĂ©rico"] # 0xe98c (en: 'spherical angle opening left', google translation) - - "": [T: "apertura angular izquierda"] # 0xe98d (en: 'angle opening left', google translation) - - "": [T: "barra vertical con doble garfio"] # 0xe98e (en: 'vertical bar with double hook', google translation) - - "℟": [T: "barra vertical con doble garfio"] # 0x297e (en: 'vertical bar with double hook') - - "": [T: "operador de punto medio radical libre"] # 0xe98f (en: 'medium dot operator free radical', google translation) - - "": [T: "blanco apuntando al triĂĄngulo sobre la barra"] # 0xe990 (en: 'white up pointing triangle above bar', google translation) - - "": [T: "idĂ©ntico y paralelo a"] # 0xe991 (en: 'identical and parallel to', google translation) - - "": [T: "smash product"] # 0xe992 (en: 'smash product', google translation) - - "âšł": [T: "smash product"] # 0x2a33 - - "": [T: "operador de triple barra con barra horizontal"] # 0xe993 (en: 'triple bar operator with horizontal bar', google translation) - - "": [T: "idĂ©ntico a con doble barra cortada"] # 0xe994 (en: 'identical to with double slash', google translation) - - "â§„": [T: "idĂ©ntico a con doble barra cortada"] # 0x29e5 (en: 'identical to with double slash') - - "": [T: "barras triples cruzadas"] # 0xe995 (en: 'triple crossed bars', google translation) - - "": [T: "barra vertical sobre cĂ­rculo"] # 0xe996 (en: 'vertical bar over circle', google translation) - - "": [T: "vertical proporcional a"] # 0xe997 (en: 'vertical proportional to', google translation) - - "": [T: "luna en cuarto menguante"] # 0xe998 (google translation) - - "": [T: "cuarto creciente"] # 0xe999 (google translation) - - "": [T: "onda sinusoidal negativa"] # 0xe9a0 (en: 'negative sine wave', google translation) - - "": [T: "punto entre parĂ©ntesis"] # 0xe9a1 (en: 'parenthesized dot', google translation) - - "": [T: "parĂ©ntesis"] # 0xe9a2 (en: 'parens', google translation) - - "": [T: "emoticono de sonrisa blanca"] # 0xe9a3 (en: 'white smile', google translation) - - "": [T: "emoticono de ceño fruncido"] # 0xe9a4 (en: 'white frown', google translation) - - "": [T: "hexĂĄgono"] # 0xe9a5 (en: 'hexagon', google translation) - - "": [T: "equivalente a sobre signo mĂĄs"] # 0xe9a6 (en: 'equivalent to over plus', google translation) - - "": [T: "signo mĂĄs sobre equivalente a"] # 0xe9a7 (en: 'plus over equivalent to', google translation) - - "": [T: "intersecciĂłn serifs"] # 0xe9b0 (en: 'intersection serifs', google translation) - - "": [T: "union serifs"] # 0xe9b1 (google translation) - - "îŠČ": [T: "intersecciĂłn cuadrada serifs"] # 0xe9b2 (en: 'square intersection serifs', google translation) - - "": [T: "uniĂłn cuadrada serifs"] # 0xe9b3 (google translation) - - "î§ ": [T: "precede equivalente a o sucede a"] # 0xe9e0 (en: 'precedes equivalent to or succeeds', google translation) - - "î§Ą": [T: "sucede equivalente a o precede"] # 0xe9e1 (en: 'succeeds equivalent to or precedes', google translation) - - "î§ą": [T: "precede casi igual a o sucede a"] # 0xe9e2 (en: 'precedes almost equal to or succeeds', google translation) - - "î§Ł": [T: "sucede casi igual o precede"] # 0xe9e3 (en: 'succeeds almost equal to or precedes', google translation) - - "î§°": [T: "menor que equivalente a o mayor que"] # 0xe9f0 (en: 'less than equivalent to or greater than', google translation) - - "î§±": [T: "mayor que equivalente a o menor que"] # 0xe9f1 (en: 'greater than equivalent to or less than', google translation) - - "": [T: "no vert mucho menor que"] # 0xea00 (en: 'not vert much less than', google translation) - - "": [T: "no vert mucho mayor que"] # 0xea01 (en: 'not vert much greater than', google translation) - - "": [T: "variante no mucho menor que"] # 0xea02 (en: 'not much less than variant', google translation) - - "": [T: "variante no mucho mayor que"] # 0xea03 (en: 'not much greater than variant', google translation) - - "": [T: "menor que vert no signos igual doble"] # 0xea04 (en: 'less vert not double equals', google translation) - - "": [T: "gt vert no doble signo igual"] # 0xea05 (en: 'gt vert not double equals', google translation) - - "": [T: "no menor que o igual a"] # 0xea06 (en: 'not less than or equal to', google translation) - - "": [T: "no mayor que o igual a"] # 0xea07 (en: 'not greater than or equal to', google translation) - - "": [T: "ni igual a ni menor que"] # 0xea09 (en: 'neither equal to nor less than', google translation) - - "": [T: "no contiene ni igual a"] # 0xea0a (en: 'does not contain or equal to', google translation) - - "": [T: "ni superconjunto ni igual a"] # 0xea0b (en: 'neither superset of nor equal to', google translation) - - "": [T: "ni subconjunto ni igual a"] # 0xea0c (en: 'neither subset of nor equal to', google translation) - - "": [T: "subconjunto con solidus invertido"] # 0xea0d (en: 'reverse solidus subset', google translation) - - "": [T: "ni igual a ni mayor que"] # 0xea0e (en: 'neither equal to nor greater than', google translation) - - "": [T: "no menos operador tilde"] # 0xea0f (en: 'not minus tilde operator', google translation) - - "": [T: "ni igual a ni menor que"] # 0xea10 (en: 'neither equal to nor less than', google translation) - - "": [T: "no operador tilde"] # 0xea11 (en: 'not tilde operator', google translation) - - "": [T: "ni elemento de ni igual a"] # 0xea12 (en: 'not element of or equal to', google translation) - - "": [T: "ni igual ni mayor que"] # 0xea13 (en: 'neither equal to nor greater than', google translation) - - "": [T: "no casi igual"] # 0xea14 (en: 'not almost equal', google translation) - - "": [T: "no sucede similar"] # 0xea15 (en: 'not succeeds similar', google translation) - - "": [T: "menor que o igual a inclinado con barra cortada"] # 0xea16 (en: 'less than or slanted equal to with slash', google translation) - - "": [T: "mayor que o igual a inclinado con barra cortada"] # 0xea17 (en: 'greater than or slanted equal to with slash', google translation) - - "": [T: "superconjunto solidus"] # 0xea1a (google translation) - - "": [T: "no contiene"] # 0xea1b (en: 'does not contain', google translation) - - "": [T: "no menor que o igual a"] # 0xea1d (en: 'not less than or equal to', google translation) - - "": [T: "no mayor que o igual a"] # 0xea1e (en: 'not greater than or equal to', google translation) - - "": [T: "no casi igual a menos"] # 0xea1f (en: 'not almost equal to minus', google translation) - - "îšą": [T: "conjunto negado de afiliaciĂłn con punto encima"] # 0xea22 (en: 'negated set membership dot above', google translation) - - "": [T: "no ĂĄngulo de vert"] # 0xea2c (en: 'not vert angle', google translation) - - "îš­": [T: "no paralelo inclinado"] # 0xea2d (en: 'not parallel slanted', google translation) - - "îšź": [T: "no operador de barra"] # 0xea2e (en: 'not bar operator', google translation) - - "": [T: "no operador de barra doble"] # 0xea2f (en: 'not double bar operator', google translation) - - "îš°": [T: "no operador de triple barra"] # 0xea30 (en: 'not triple bar operator', google translation) - - "îšČ": [T: "menor que pero no aproximadamente igual a"] # 0xea32 (en: 'less than but not approximately equal to', google translation) - - "âȘ‰": [T: "menor que pero no aproximadamente igual a"] # 0x2a89 (en: 'less than but not approximately equal to') - - "îšł": [T: "mayor que pero no aproximadamente igual a"] # 0xea33 (en: 'greater than but not approximately equal to', google translation) - - "âȘŠ": [T: "mayor que pero no aproximadamente igual a"] # 0x2a8a (en: 'greater than but not approximately equal to') - - "": [T: "menor que o no igual a"] # 0xea34 (en: 'less than or not equal to', google translation) - - "îš”": [T: "mayor que o no igual a"] # 0xea35 (en: 'greater than or not equal to', google translation) - - "îš¶": [T: "menor que no anidado"] # 0xea36 (en: 'not nested less than', google translation) - - "îš·": [T: "mayor que no anidado"] # 0xea37 (en: 'not nested greater than', google translation) - - "îšž": [T: "no mucho menor que"] # 0xea38 (en: 'not much less than', google translation) - - "îšč": [T: "no mucho mayor que"] # 0xea39 (en: 'not much greater than', google translation) - - "îšș": [T: "precede pero no equivalente a"] # 0xea3a (en: 'precedes but not equivalent to', google translation) - - "îš»": [T: "sucede pero no equivalente a"] # 0xea3b (en: 'succeeds but not equivalent to', google translation) - - "": [T: "precede pero no es igual a"] # 0xea3c (en: 'precedes but not equal to', google translation) - - "îšœ": [T: "sucede pero no es igual a"] # 0xea3d (en: 'succeeds but not equal to', google translation) - - "": [T: "ni es igual a ni precede"] # 0xea3e (en: 'does not equal or precede', google translation) - - "îšż": [T: "ni es igual a ni sucede"] # 0xea3f (en: 'does not equal or succeed', google translation) - - "": [T: "precede pero no es igual a"] # 0xea40 (en: 'precedes but not equal to', google translation) - - "âȘ”": [T: "precede pero no es igual a"] # 0x2ab5 (en: 'precedes but not equal to') - - "": [T: "sucede pero no es igual a"] # 0xea41 (en: 'succeeds but not equal to', google translation) - - "âȘ¶": [T: "sucede pero no es igual a"] # 0x2ab6 (en: 'succeeds but not equal to') - - "": [T: "ni subconjunto de ni igual a"] # 0xea42 (en: 'not subset of nor equal to', google translation) - - "": [T: "ni superconjunto de ni igual a"] # 0xea43 (en: 'not superset of nor equal to', google translation) - - "": [T: "subconjunto de o no igual a"] # 0xea44 (en: 'subset of or not equal to', google translation) - - "": [T: "superconjunto de o no igual a"] # 0xea45 (en: 'superset of or not equal to', google translation) - - "": [T: "ni subconjunto de ni igual a"] # 0xea46 (en: 'not subset of nor equal to', google translation) - - "": [T: "ni superconjunto de ni igual a"] # 0xea47 (en: 'not superset of nor equal to', google translation) - - "": [T: "no triple menor que"] # 0xea48 (en: 'not triple less than', google translation) - - "": [T: "no triple mayor que"] # 0xea49 (en: 'not triple greater than', google translation) - - "": [T: "no precede a igual"] - - "": [T: "no sucede a igual"] # 0xea4d (en: 'not succeeds equals', google translation) - - "": [T: "no subgrupo normal de con barra"] # 0xea50 (en: 'not normal subgroup of with bar', google translation) - - "": [T: "no contiene como subgrupo normal con barra"] # 0xea51 (en: 'does not contain as normal subgroup with bar', google translation) - - "": [T: "no diferencia entre"] # 0xea52 (en: 'not difference between', google translation) - - "": [T: "no geomĂ©tricamente equivalente a"] # 0xea53 (en: 'not geometrically equivalent to', google translation) - - "": [T: "no vert similar"] # 0xea54 (en: 'not vert similar', google translation) - - "": [T: "no igual o similar"] # 0xea55 (en: 'not equal or similar', google translation) - - "": [T: "no vert aproximado"] # 0xea56 (en: 'not vert approximate', google translation) - - "": [T: "no aproximadamente idĂ©ntico a"] # 0xea57 (en: 'not approximately identical to', google translation) - - "": [T: "no bump igual"] # 0xea58 (en: 'not bumpy equals', google translation) - - "": [T: "ni un solo bumpy igual a"] # 0xea59 (en: 'not bumpy single equals', google translation) - - "": [T: "no punto igual"] # 0xea5a (en: 'not equal dot', google translation) - - "": [T: "inverso no equivalente"] # 0xea5b (en: 'reverse not equivalent', google translation) - - "î© ": [T: "no subconjunto cuadrado"] # 0xea60 (en: 'not square subset', google translation) - - "": [T: "no superconjunto cuadrado"] # 0xea61 (en: 'not square superset', google translation) - - "": [T: "no casi igual sobre igual"] # 0xea62 (en: 'not almost equal over equal', google translation) - - "": [T: "no estrictamente equivalente a"] # 0xea63 (en: 'not strictly equivalent to', google translation) - - "î©€": [T: "no congruente punto"] # 0xea64 (en: 'not congruent dot', google translation) - - "î©„": [T: "reverso no es igual"] # 0xea65 (en: 'reverse not equal', google translation) - - "î©°": [T: "no vert triĂĄngulo izquierdo es igual a"] # 0xea70 (en: 'not vert left triangle equals', google translation) - - "": [T: "no vert triĂĄngulo recto es igual a"] # 0xea71 (en: 'not vert right triangle equals', google translation) - - "îȘ€": [T: "no parcial"] # 0xea80 (en: 'not partial', google translation) - - "": [T: "extensor de adornos de flecha"] # 0xeb00 (en: 'arrow embellishment extender', google translation) - - "": [T: "flecha hacia la derecha sobre flecha hacia la izquierda"] # 0xeb01 (en: 'arrow rightwards over arrow leftwards', google translation) - - "": [T: "flecha hacia la derecha sobre flecha hacia la izquierda"] # 0xeb02 (en: 'arrow rightwards over arrow leftwards', google translation) - - "": [T: "arpĂłn a la derecha sobre arpĂłn a la izquierda"] # 0xeb03 (en: 'harpoon right over harpoon left', google translation) - - "": [T: "arpĂłn a la derecha sobre arpĂłn a la izquierda"] # 0xeb04 (en: 'harpoon right over harpoon left', google translation) - - "": [T: "doble flecha al nordeste desde el sudoeste"] # 0xeb05 (en: 'double arrow northeast southwest', google translation) - - "": [T: "doble flecha al noroeste desde el sudeste"] # 0xeb06 (en: 'double arrow northwest southeast', google translation) - - "": [T: "extensor de arpĂłn horizontal"] # 0xeb07 (en: 'horizontal harpoon extender', google translation) - - "": [T: "arco en sentido contrario a las agujas del reloj a la izquierda de flecha"] # 0xeb08 (en: 'anticlockwise arc leftwards arrow', google translation) - - "": [T: "arco en sentido contrario a las agujas del reloj a la derecha de flecha"] # 0xeb09 (en: 'anticlockwise arc rightwards arrow', google translation) - - "": [T: "acento con flecha grande hacia la derecha"] # 0xeb0b (en: 'large rightwards arrow accent', google translation) - - "": [T: "acento con flecha grande hacia la izquierda"] # 0xeb0c (en: 'large leftwards arrow accent', google translation) - - "": [T: "punta de flecha hacia la izquierda"] # 0xeb0d (en: 'leftwards arrowhead', google translation) - - "": [T: "punta de flecha hacia la derecha"] # 0xeb0e (en: 'rightwards arrowhead', google translation) - - "": [T: "gran flecha derecha izquierda con trazo"] # 0xeb0f (en: 'large left right arrow with stroke', google translation) - - "": [T: "extensor de flecha doble horizontal"] # 0xeb10 (en: 'horizontal double arrow extender', google translation) - - "": [T: "gran flecha doble izquierda derecha con trazo"] # 0xeb11 (en: 'large left right double arrow with stroke', google translation) - - "": [T: "flecha hacia abajo y hacia la izquierda de flecha hacia arriba"] # 0xeb12 (en: 'downwards arrow leftwards of upwards arrow', google translation) - - "⇔": [T: "flecha hacia arriba y a la derecha de flecha hacia abajo"] # 0x21f5 (en: 'downwards arrow leftwards of upwards arrow') - - "": [T: "flecha hacia la izquierda con la esquina hacia abajo"] # 0xeb13 (en: 'leftwards arrow with corner downwards', google translation) - - "": [T: "flecha hacia la derecha con la esquina hacia arriba"] # 0xeb14 (en: 'rightwards arrow with corner upwards', google translation) - - "": [T: "flecha hacia la izquierda con la esquina hacia arriba"] # 0xeb15 (en: 'leftwards arrow with corner upwards', google translation) - - "": [T: "flecha superior semicircular en sentido contrario a las agujas del reloj con signo mĂĄs"] # 0xeb16 (en: 'anticlockwise top semicircle arrow with plus', google translation) - - "“": [T: "flecha superior semicircular en sentido contrario a las agujas del reloj con signo mĂĄs"] # 0x293d (en: 'anticlockwise top semicircle arrow with plus') - - "": [T: "flecha superior semicircular en sentido a las agujas del reloj con signo menos"] # 0xeb17 (en: 'clockwise top semicircle arrow with minus', google translation) - - "‌": [T: "flecha superior semicircular en sentido a las agujas del reloj con signo menos"] # 0x293c (en: 'clockwise top semicircle arrow with minus') - - "": [T: "flecha hacia la derecha con cola con trazo"] # 0xeb18 (en: 'rightwards arrow with tail with stroke', google translation) - - "": [T: "arpĂłn derecho hacia abajo"] # 0xeb19 (en: 'right harpoon down', google translation) - - "": [T: "arpĂłn izquierdo hacia abajo"] # 0xeb1a (en: 'left harpoon down', google translation) - - "": [T: "arpĂłn derecho izquierdo hacia abajo"] # 0xeb1b (en: 'left right harpoon down', google translation) - - "ℐ": [T: "arpĂłn derecho izquierdo hacia abajo"] # 0x2950 (en: 'left right harpoon down', MathPlayer: 'arpĂłn inferior derecha-izquierda', google: 'arpĂłn derecho izquierdo hacia abajo') - - "": [T: "arpĂłn derecho izquierdo hacia arriba"] # 0xeb1c (en: 'left right harpoon up', google translation) - - "ℎ": [T: "arpĂłn izquierdo derecho hacia arriba"] # 0x294e (en: 'left right harpoon up', MathPlayer: 'arpĂłn superior derecha-izquierda', google: 'arpĂłn derecho izquierdo hacia arriba') - - "": [T: "arpĂłn izquierdo arriba y abajo"] # 0xeb1d (en: 'up down harpoon left', google translation) - - "â„‘": [T: "arpĂłn izquierdo arriba y abajo"] # 0x2951 (en: 'up down harpoon left') - - "": [T: "arpĂłn derecho arriba y abajo"] # 0xeb1e (en: 'up down harpoon right', google translation) - - "ℏ": [T: "arpĂłn derecho arriba y abajo"] # 0x294f (en: 'up down harpoon right') - - "": [T: "flecha hacia arriba a la derecha de flecha hacia abajo"] # 0xeb1f (en: 'upwards arrow to the right of downwards arrow', google translation) - - "⇔": [T: "flecha hacia arriba a la derecha de flecha hacia abajo"] # 0x21f5 - - "": [T: "arpĂłn hacia la izquierda a barra con punta hacia arriba"] # 0xeb20 (en: 'leftwards harpoon to bar with barb upwards', google translation) - - "â„’": [T: "arpĂłn hacia la izquierda a barra con punta hacia arriba"] # 0x2952 (en: 'leftwards harpoon to bar with barb upwards', MathPlayer: 'leftwards harpoon to bar with barb upwards', google: 'arpĂłn de la izquierda para bar con barb hacia arriba') - - "": [T: "arpĂłn hacia la derecha a barra con punta hacia arriba"] # 0xeb21 (en: 'rightwards harpoon to bar with barb upwards', google translation) - - "â„“": [T: "arpĂłn hacia la derechaa a barra con punta hacia arriba"] # 0x2953 (en: 'rightwards harpoon to bar with barb upwards', MathPlayer: 'rightwards harpoon to bar with barb upwards', google: 'arpoon a la derecha para bar con barb hacia arriba') - - "": [T: "arpĂłn hacia la izquierda a barra con punta hacia abajo"] # 0xeb22 (en: 'leftwards harpoon to bar with barb downwards', google translation) - - "â„–": [T: "arpĂłn hacia la izquierda a barra con punta hacia abajo"] # 0x2956 (en: 'leftwards harpoon to bar with barb downwards', MathPlayer: 'leftwards harpoon to bar with barb downwards', google: 'arpoon hacia la izquierda para bar con barb hacia abajo') - - "": [T: "arpĂłn hacia la derecha a barra con punta hacia abajo"] # 0xeb23 (en: 'rightwards harpoon to bar with barb downwards', google translation) - - "â„—": [T: "arpĂłn hacia la derecha a barra con punta hacia abajo"] # 0x2957 (en: 'rightwards harpoon to bar with barb downwards', MathPlayer: 'rightwards harpoon to bar with barb downwards', google: 'arpoon a la derecha para bar con barb hacia abajo') - - "": [T: "arpĂłn hacia la izquierda partiendo de barra con punta hacia arriba"] # 0xeb24 (en: 'leftwards harpoon from bar with barb upwards', google translation) - - "ℚ": [T: "arpĂłn hacia la izquierda partiendo d barra con punta hacia arriba"] # 0x295a (en: 'leftwards harpoon from bar with barb upwards', MathPlayer: 'leftwards harpoon from bar with barb upwards', google: 'arpĂłn de la izquierda desde el bar con barb al alza') - - "": [T: "arpĂłn hacia la derecha partiendo de barra con punta hacia arriba"] # 0xeb25 (en: 'rightwards harpoon from bar with barb upwards', google translation) - - "â„›": [T: "arpĂłn hacia la derecha partiendo de barra con punta hacia arriba"] # 0x295b (en: 'rightwards harpoon from bar with barb upwards', MathPlayer: 'rightwards harpoon from bar with barb upwards', google: 'arpoon a la derecha desde el bar con barb al alza') - - "": [T: "arpĂłn hacia la izquierda partiendo de barra con punta hacia abajo"] # 0xeb26 (en: 'leftwards harpoon from bar with barb downwards', google translation) - - "℞": [T: "arpĂłn hacia la izquierda partiendo de barra con punta hacia abajo"] # 0x295e (en: 'leftwards harpoon from bar with barb downwards', MathPlayer: 'leftwards harpoon from bar with barb downwards', google: 'arpĂłn de la izquierda desde el bar con barb hacia abajo') - - "": [T: "arpĂłn hacia la derecha partiendo de barra con punta hacia abajo"] # 0xeb27 (en: 'rightwards harpoon from bar with barb downwards', google translation) - - "℟": [T: "arpĂłn hacia la derecha partiendo de barra con punta hacia abajo"] # 0x295f (en: 'rightwards harpoon from bar with barb downwards', MathPlayer: 'rightwards harpoon from bar with barb downwards', google: 'arpoon a la derecha desde el bar con barb hacia abajo') - - "": [T: "arpĂłn hacia arriba a barra con punta a la izquierda"] # 0xeb28 (en: 'upwards harpoon to bar with barb leftwards', google translation) - - "℘": [T: "arpĂłn hacia arriba a barra con pĂșa a la izquierda"] # 0x2958 (en: 'upwards harpoon to bar with barb leftwards', MathPlayer: 'upwards harpoon to bar with barb leftwards', google: 'hace arriba hacia arriba para bar con barb a la izquierda') - - "": [T: "arpĂłn hacia abajo a barra con punta hacia la izquierda"] # 0xeb29 (en: 'downwards harpoon to bar with barb leftwards', google translation) - - "â„™": [T: "arpĂłn hacia abajo a barra con punta hacia la izquierda"] # 0x2959 (en: 'downwards harpoon to bar with barb leftwards', MathPlayer: 'downwards harpoon to bar with barb leftwards', google: 'harpoon hacia abajo para bar con barb a la izquierda') - - "îŹȘ": [T: "arpĂłn hacia arriba a barra con punta hacia la derecha"] # 0xeb2a (en: 'upwards harpoon to bar with barb rightwards', google translation) - - "â„”": [T: "arpĂłn hacia arriba a barra con punta hacia la derecha"] # 0x2954 (en: 'upwards harpoon to bar with barb rightwards', MathPlayer: 'upwards harpoon to bar with barb rightwards', google: 'hace arriba hacia arriba para bar con barb a la derecha') - - "": [T: "arpĂłn hacia abajo a barra con punta hacia la derecha"] # 0xeb2b (en: 'downwards harpoon to bar with barb rightwards', google translation) - - "â„•": [T: "arpĂłn hacia abajo a barra con punta hacia la derecha"] # 0x2955 (en: 'downwards harpoon to bar with barb rightwards', MathPlayer: 'downwards harpoon to bar with barb rightwards', google: 'harpoon hacia abajo para bar con barb a la derecha') - - "": [T: "arpĂłn hacia harriba partiendo de barra con punta hacia la izquierda"] # 0xeb2c (en: 'upwards harpoon from bar with barb leftwards', google translation) - - "â„ ": [T: "arpĂłn hacia arriba partiendo de barra con punta hacia la izquierda"] # 0x2960 (en: 'upwards harpoon from bar with barb leftwards', MathPlayer: 'upwards harpoon from bar with barb leftwards', google: 'hacia arriba hacia arriba desde el bar con barb a la izquierda') - - "": [T: "arpĂłn hacia abajo partiendo de barra con punta hacia la izquierda"] # 0xeb2d (en: 'downwards harpoon from bar with barb leftwards', google translation) - - "℥": [T: "arpĂłn hacia abajo partiendo de barra con punta hacia la izquierda"] # 0x2961 (en: 'downwards harpoon from bar with barb leftwards', MathPlayer: 'downwards harpoon from bar with barb leftwards', google: 'hosto hacia abajo de bar con barb a la izquierda') - - "": [T: "arpĂłn hacia arriba partiendo de barra con punta hacia la derecha"] # 0xeb2e (en: 'upwards harpoon from bar with barb rightwards', google translation) - - "ℜ": [T: "arpĂłn hacia arriba partiendo de barra con punta hacia la derecha"] # 0x295c (en: 'upwards harpoon from bar with barb rightwards', MathPlayer: 'upwards harpoon from bar with barb rightwards', google: 'hace arriba hacia arriba desde el bar con barb a la derecha') - - "": [T: "arpĂłn hacia abajo partiendo de barra con punta hacia la derecha"] # 0xeb2f (en: 'downwards harpoon from bar with barb rightwards', google translation) - - "ℝ": [T: "arpĂłn hacia abajo partiendo de barra con punta hacia la derecha"] # 0x295d (en: 'downwards harpoon from bar with barb rightwards', MathPlayer: 'downwards harpoon from bar with barb rightwards', google: 'hosto hacia abajo desde el bar con barb a la derecha') - - "": [T: "flecha hacia arriba a barra"] # 0xeb30 (en: 'upwards arrow to bar', google translation) - - "‒": [T: "flecha hacia arriba a barra"] # 0x2912 - - "": [T: "flecha hacia abajo a barra"] # 0xeb31 (en: 'downwards arrow to bar', google translation) - - "–": [T: "flecha hacia abajo a barra"] # 0x2913 - - "îŹČ": [T: "arpĂłn hacia arriba a la izquierda de arpĂłn hacia abajo"] # 0xeb32 (en: 'upwards harpoon to the left of downwards harpoon', google translation) - - "℟": [T: "arpĂłn hacia arriba a la izquierda de arpĂłn hacia abajo"] # 0x296e (en: 'upwards harpoon to the left of downwards harpoon', MathPlayer: 'upwards harpoon to the left of downwards harpoon', google: 'hacia arriba harpoon a la izquierda de la arpĂłn hacia abajo') - - "": [T: "arpĂłn hacia arriba a la derecha de arpĂłn hacia abajo"] # 0xeb33 (en: 'upwards harpoon to the right of downwards harpoon', google translation) - - "ℯ": [T: "arpĂłn hacia arriba a la derecha de arpĂłn hacia abajo"] # 0x296f (en: 'upwards harpoon to the right of downwards harpoon', MathPlayer: 'upwards harpoon to the right of downwards harpoon', google: 'hacia arriba hacia arriba a la derecha de la arpĂłn hacia abajo') - - "": [T: "punta de flecha hacia arriba"] # 0xeb34 (en: 'upwards arrowhead', google translation) - - "": [T: "punta de flecha hacia abajo"] # 0xeb35 (en: 'downwards arrowhead', google translation) - - "": [T: "doble arpĂłn con punta hacia abajo a la izquierda y punta hacia arriba a la derecha"] # 0xeb36 (en: 'double harpoon with leftwards barb down rightwards barb up', google translation) - - "": [T: "doble arpĂłn con punta hacia arriba a la izquierda y con punta hacia abajo a la derecha"] # 0xeb37 (en: 'double harpoon with leftwards barb up rightwards barb down', google translation) - - "": [T: "flecha hacia la izquierda sobre barra"] # 0xeb38 (en: 'leftwards arrow over bar', google translation) - - "îŹč": [T: "flecha hacia la derecha sobre barra"] # 0xeb39 (en: 'rightwards arrow over bar', google translation) - - "îŹș": [T: "flecha hacia la izquierda debajo de barra"] # 0xeb3a (en: 'leftwards arrow under bar', google translation) - - "": [T: "flecha hacia la derecha debajo de barra"] # 0xeb3b (en: 'rightwards arrow under bar', google translation) - - "îŹŒ": [T: "triple flecha derecha e izquierda"] # 0xeb3c (en: 'left right triple arrow', google translation) - - "": [T: "doble flecha nordeste sudeste"] # 0xeb3f (en: 'double arrow northeast southeast', google translation) - - "": [T: "flecha semicircular izquierda en sentido contrario a las agujas del reloj"] # 0xeb40 (en: 'anticlockwise left semicircle arrow', google translation) - - "â€č": [T: "flecha semicircular izquierda en sentido contrario a las agujas del reloj"] # 0x2939 (en: 'anticlockwise left semicircle arrow') - - "": [T: "flecha semicircular izquierda en sentido a las agujas del reloj"] # 0xeb41 (en: 'clockwise left semicircle arrow', google translation) - - "": [T: "cĂ­rculo abierto izquierdo flecha derecha izquierda"] # 0xeb42 (en: 'left open circle left right arrow', google translation) - - "": [T: "flecha hacia la derecha sobre tilde"] # 0xeb44 (en: 'rightwards arrow over tilde', google translation) - - "ℎ": [T: "flecha hacia la derecha sobre tilde"] # 0x2974 (en: 'rightwards arrow over tilde') - - "": [T: "flecha hacia la izquierda sobre tilde"] # 0xeb45 (en: 'leftwards arrow over tilde', google translation) - - "ℳ": [T: "flecha hacia la derecha sobre tilde"] # 0x2973 (en: 'leftwards arrow over tilde') - - "": [T: "arpĂłn hacia la izquierda sobre barra"] # 0xeb48 (en: 'leftwards harpoon over bar', google translation) - - "â„Ș": [T: "arpĂłn hacia la izquierda sobre barra"] # 0x296a (en: 'leftwards harpoon over bar') - - "": [T: "arpĂłn hacia la derecha sobre barra"] # 0xeb49 (en: 'rightwards harpoon over bar', google translation) - - "ℏ": [T: "arpĂłn hacia la derecha sobre barra"] # 0x296c (en: 'rightwards harpoon over bar') - - "": [T: "arpĂłn hacia la izquierda debajo de barra"] # 0xeb4a (en: 'leftwards harpoon under bar', google translation) - - "â„«": [T: "arpĂłn hacia la izquierda debajo de barra"] # 0x296b (en: 'leftwards harpoon under bar') - - "": [T: "arpĂłn hacia la derecha debajo de barra"] # 0xeb4b (en: 'rightwards harpoon under bar', google translation) - - "â„­": [T: "arpĂłn hacia la derecha debajo de barra"] # 0x296d (en: 'rightwards harpoon under bar') - - "": [T: "flecha corta negra hacia la izquierda"] # 0xeb4c (en: 'squat black leftwards arrow', google translation) - - "": [T: "flecha semicircular derecha en sentido a las agujas del reloj"] # 0xeb50 (en: 'clockwise right semicircle arrow', google translation) - - "„": [T: "flecha semicircular derecha en sentido a las agujas del relojt"] # 0x2938 (en: 'clockwise right semicircle arrow') - - "": [T: "flecha semicircular derecha en sentido contrario a las agujas del reloj"] # 0xeb51 (en: 'anticlockwise right semicircle arrow', google translation) - - "": [T: "cĂ­rculo abierto izquierdo arpĂłn izquierdo derecho"] # 0xeb52 (en: 'left open circle left right harpoon', google translation) - - "": [T: "flecha hacia arriba y hacia la izquierda de barra vertical"] # 0xeb58 (en: 'upwards arrow leftwards of vertical bar', google translation) - - "": [T: "flecha hacia abajo hacia la izquierda de barra vertical"] # 0xeb59 (en: 'downwards arrow leftwards of vertical bar', google translation) - - "": [T: "flecha hacia arriba hacia la derecha de barra vertical"] # 0xeb5a (en: 'upwards arrow rightwards of vertical bar', google translation) - - "": [T: "flecha hacia abajo hacia la derecha de barra vertical"] # 0xeb5b (en: 'downwards arrow rightwards of vertical bar', google translation) - - "": [T: "flecha hacia la derecha con garfio hacia abajo extendido"] # 0xeb5c (en: 'rightwards arrow with extended downwards hook', google translation) - - "": [T: "flecha hacia la izquierda con gancho extendido"] # 0xeb5d (en: 'leftwards arrow with extended hook', google translation) - - "": [T: "flecha hacia la izquierda con gancho hacia abajo extendido"] # 0xeb5e (en: 'leftwards arrow with extended downwards hook', google translation) - - "": [T: "flecha hacia la derecha con garfio extendido"] # 0xeb5f (en: 'rightwards arrow with extended hook', google translation) - - "î­ ": [T: "no flecha derecha ondulada"] # 0xeb60 (en: 'not right arrow wavy', google translation) - - "î­Ą": [T: "no flecha derecha curva"] # 0xeb61 (en: 'not right arrow curved', google translation) - - "î­š": [T: "arpĂłn hacia arriba hacia la izquierda de barra vertical"] # 0xeb68 (en: 'upwards harpoon leftwards of vertical bar', google translation) - - "î­©": [T: "arpoon hacia abajo hacia la izquierda de barra vertical"] # 0xeb69 (en: 'downwards harpoon leftwards of vertical bar', google translation) - - "î­Ș": [T: "arpĂłn hacia arriba hacia la derecha de barra vertical"] # 0xeb6a (en: 'upwards harpoon rightwards of vertical bar', google translation) - - "î­«": [T: "arpĂłn hacia abajo hacia la derecha de barra vertical"] # 0xeb6b (en: 'downwards harpoon rightwards of vertical bar', google translation) - - "î­Ź": [T: "extensor de flecha doble vertical"] # 0xeb6c (en: 'vertical double arrow extender', google translation) - - "î­­": [T: "arpĂłn vertical con extensor de punta izquierda"] # 0xeb6d (en: 'vertical harpoon with barb left extender', google translation) - - "î­ź": [T: "arpĂłn vertical con extensor de punta derecha"] # 0xeb6e (en: 'vertical harpoon with barb right extender', google translation) - - "î­Ż": [T: "arpĂłn derecho sobre arpĂłn izquierdo a la derecha"] # 0xeb6f (en: 'right harpoon over left harpoon right', google translation) - - "î­°": [T: "arpĂłn derecho sobre arpĂłn izquierdo a la izquierda"] # 0xeb70 (en: 'right harpoon over left harpoon left', google translation) - - "î­±": [T: "arpĂłn izquierdo sobre arpĂłn derecho a la derecha"] # 0xeb71 (en: 'left harpoon over right harpoon right', google translation) - - "î­Č": [T: "arpĂłn izquierdo sobre arpĂłn derecho a la izquierda"] # 0xeb72 (en: 'left harpoon over right harpoon left', google translation) - - "î­ł": [T: "flecha hacia la izquierda partiendo de punta de flecha de barra"] # 0xeb73 (en: 'leftwards arrow from bar arrowhead', google translation) - - "î­Ž": [T: "flecha hacia la izquierda y derecha partiendo de extensor de barra"] # 0xeb74 (en: 'leftwards rightwards arrow from bar extender', google translation) - - "î­”": [T: "flecha hacia la izquierda partiendo de cola de barra"] # 0xeb75 (en: 'leftwards arrow from bar tail', google translation) - - "î­¶": [T: "flecha hacia la derecha partiendo de cola de barra"] # 0xeb76 (en: 'rightwards arrow from bar tail', google translation) - - "î­·": [T: "flecha hacia la derecha partiendo de punta de flecha de barra"] # 0xeb77 (en: 'rightwards arrow from bar arrowhead', google translation) - - "î­ž": [T: "arpĂłn hacia arriba partiendo de barra punzante con punta de flecha hacia la izquierda"] # 0xeb78 (en: 'upwards harpoon from bar with barb leftwards arrowhead', google translation) - - "î­č": [T: "flecha hacia la derecha sobre flecha derecha hacia la izquierda"] # 0xeb79 (en: 'rightwards arrow over leftwards arrow right', google translation) - - "î­ș": [T: "flecha derecha sobre flecha izquierda hacia la izquierda"] # 0xeb7a (en: 'rightwards arrow over leftwards arrow left', google translation) - - "î­»": [T: "flecha hacia la izquierda sobre flecha derecha hacia la derecha"] # 0xeb7b (en: 'leftwards arrow over rightwards arrow right', google translation) - - "î­Œ": [T: "flecha hacia la izquierda sobre flecha derecha hacia la izquierda"] # 0xeb7c (en: 'leftwards arrow over rightwards arrow left', google translation) - - "î­œ": [T: "flecha hacia arriba partiendo de punta de flecha de barra"] # 0xeb7d (en: 'upwards arrow from bar arrowhead', google translation) - - "î­Ÿ": [T: "flecha hacia arriba partiendo de la cola de la barra"] # 0xeb7e (en: 'upwards arrow from bar tail', google translation) - - "î­ż": [T: "flecha hacia abajo partiendo de la cola de la barra"] # 0xeb7f (en: 'downwards arrow from bar tail', google translation) - - "": [T: "flecha hacia abajo partiendo de la punta de flecha de la barra"] # 0xeb80 (en: 'downwards arrow from bar arrowhead', google translation) - - "": [T: "arpĂłn hacia abajo partiendo de punta de flecha derecha de barra punzante"] # 0xeb81 (en: 'downwards harpoon from bar with barb rightwards arrowhead', google translation) - - "": [T: "arpĂłn hacia arriba a la izquierda del fondo del arpĂłn hacia abajo"] # 0xeb82 (en: 'upwards harpoon to the left of downwards harpoon bottom', google translation) - - "": [T: "arpĂłn hacia arriba a la izquierda de extensor de arpĂłn hacia abajo"] # 0xeb83 (en: 'upwards harpoon to the left of downwards harpoon extender', google translation) - - "": [T: "arpĂłn hacia abajo a la izquierda de parte superior de arpĂłn hacia arriba"] # 0xeb84 (en: 'downwards harpoon to the left of upwards harpoon top', google translation) - - "": [T: "arpĂłn hacia arriba a la izquierda de parte superior de arpĂłn hacia abajo"] # 0xeb85 (en: 'upwards harpoon to the left of downwards harpoon top', google translation) - - "": [T: "arpĂłn hacia abajo a la izquierda de extensor de arpĂłn hacia arriba"] # 0xeb86 (en: 'downwards harpoon to the left of the upwards harpoon extender', google translation) - - "": [T: "arpĂłn hacia arriba a la izquierda de parte inferior d arpĂłn hacia abajo"] # 0xeb87 (en: 'downwards harpoon to the left of the upwards harpoon bottom', google translation) - - "": [T: "flecha hacia arriba hacia la izquierda del fondo de flecha hacia abajo"] # 0xeb88 (en: 'upwards arrow leftwards of downwards arrow bottom', google translation) - - "": [T: "flecha hacia abajo hacia la izquierda de la parte superiorde flecha hacia arriba"] # 0xeb89 (en: 'downwards arrow leftwards of upwards arrow top', google translation) - - "": [T: "flecha hacia arriba hacia la izquierda de la parte superior de flecha hacia abajo"] # 0xeb8a (en: 'upwards arrow leftwards of downwards arrow top', google translation) - - "": [T: "flecha hacia abajo hacia la izquierda de la parte inferior de flecha hacia arriba"] # 0xeb8b (en: 'downwards arrow leftwards of upwards arrow bottom', google translation) - - "": [T: "extensor de flechas hacia izquierda y derecha"] # 0xeb8c (en: 'leftwards rightwards arrows extender', google translation) - - "": [T: "extensor de flecha nordeste"] # 0xeb8d (google translation) - - "": [T: "extensor de flecha noroeste"] # 0xeb8e (google translation) - - "": [T: "parĂ©ntesis izquierdo apuntando hacia abajo"] # 0xec00 (en: 'down pointing brace left', google translation) - - "": [T: "parĂ©ntesis medio apuntando hacia abajo"] # 0xec01 (google translation) - - "": [T: "parĂ©ntesis derecho apuntando hacia abajo"] # 0xec02 (en: 'down pointing brace right', google translation) - - "": [T: "extensor de parĂ©ntesis horizontal"] # 0xec03 (en: 'horizontal brace extender', google translation) - - "": [T: "parĂ©ntesis izquierdo apuntando hacia arriba"] # 0xec04 (en: 'up pointing brace left', google translation) - - "": [T: "parĂ©ntesis medio apuntando hacia arriba"] # 0xec05 (en: 'up pointing brace mid', google translation) - - "": [T: "parĂ©ntesis derecho apuntando hacia arriba"] # 0xec06 (en: 'up-pointing brace right', google translation) - - "": [T: "barra vertical izquierda"] # 0xec07 (en: 'left vertical bar', google translation) - - "": [T: "barra vertical derecha"] # 0xec08 (en: 'right vertical bar', google translation) - - "": [T: "doble barra vertical izquierda"] # 0xec09 (en: 'left double vertical bar', google translation) - - "": [T: "doble barra vertical derecha"] # 0xec0a (en: 'right double vertical bar', google translation) - - "": [T: "extensor de soporte horizontal"] # 0xec0b (en: 'horizontal bracket extender', google translation) - - "": [T: "debajo de corchete"] # 0xec0c (en: 'under square bracket', google translation) - - "⎔": [T: "debajo de corchete"] # 0x23b5 (en: 'under square bracket') - - "": [T: "encima de corchete"] # 0xec0d (en: 'over square bracket', google translation) - - "⎮": [T: "encima de corchete"] # 0x23b4 (en: 'over square bracket') - - "": [T: "debajo de parĂ©ntesis izquierdo"] # 0xec0e (en: 'under bracket left', google translation) - - "": [T: "debajo de parĂ©ntesis derecho"] # 0xec0f (en: 'under bracket right', google translation) - - "": [T: "sobre parĂ©ntesis izquierdo"] # 0xec10 (en: 'over bracket left', google translation) - - "": [T: "encima de parĂ©ntesis derecho"] # 0xec11 (en: 'over bracket right', google translation) - - "": [T: "abrir parĂ©ntesis 1"] # 0xec12 (en: 'left parens 1', google translation) - - "": [T: "abrir parĂ©ntesis 2"] # 0xec13 (en: 'left parens 2', google translation) - - "": [T: "abrir parĂ©ntesis 3"] # 0xec14 (en: 'left parens 3', google translation) - - "": [T: "abrir parĂ©ntesis 4"] # 0xec15 (en: 'left parens 4', google translation) - - "": [T: "cerrar parĂ©ntesis 1"] # 0xec16 (en: 'right parens 1', google translation) - - "": [T: "cerrar parĂ©ntesis 2"] # 0xec17 (en: 'right parens 2', google translation) - - "": [T: "cerrar parĂ©ntesis 3"] # 0xec18 (en: 'right parens 3', google translation) - - "": [T: "cerrar parĂ©ntesis 4"] # 0xec19 (en: 'right parens 4', google translation) - - "": [T: "radical 1"] # 0xec1a (google translation) - - "": [T: "radical 2"] # 0xec1b (google translation) - - "": [T: "radical 3"] # 0xec1c (google translation) - - "": [T: "radical 4"] # 0xec1d (google translation) - - "": [T: "radical 5"] # 0xec1e (google translation) - - "": [T: "radical inferior"] # 0xec1f (en: 'radical bottom', google translation) - - "î° ": [T: "extensor de radical vertical"] # 0xec20 (en: 'radical vertical extender', google translation) - - "î°Ą": [T: "radical superior"] # 0xec21 (en: 'radical top', google translation) - - "î°ą": [T: "soporte blanco izquierdo superior"] # 0xec22 (en: 'left white bracket top', google translation) - - "î°Ł": [T: "extensor de soporte blanco izquierdo"] # 0xec23 (en: 'left white bracket extender', google translation) - - "î°€": [T: "soporte blanco izquierdo inferior"] # 0xec24 (en: 'left white bracket bottom', google translation) - - "î°„": [T: "soporte blanco derecho superior"] # 0xec25 (en: 'right white bracket top', google translation) - - "î°Š": [T: "extensor de soporte blanco derecho"] # 0xec26 (en: 'right white bracket extender', google translation) - - "î°§": [T: "soporte blanco derecho inferior"] # 0xec27 (en: 'right white bracket bottom', google translation) - - "î°°": [T: "soporte blanco izquierdo rotacional"] # 0xec30 (en: 'left white curly bracket', google translation) - - "î°±": [T: "soporte blanco derecho rotacional"] # 0xec31 (en: 'right white curly bracket', google translation) - - "î°Č": [T: "signo de divisiĂłn largo"] # 0xec32 (google translation) - - "î°ł": [T: "extensor de signo de divisiĂłn largo"] # 0xec33 (en: 'long division sign extender', google translation) - - "î°Ž": [T: "divisiĂłn corta"] # 0xec34 (en: 'short division', google translation) - - "": [T: "doble sudoeste al nordeste uniĂłn em"] # 0xec40 (en: 'double southwest to northeast em bond', google translation) - - "": [T: "doble noroeste al sudeste uniĂłn em"] # 0xec41 (en: 'double northwest to southeast em bond', google translation) - - "": [T: "enlace em horizontal Ășnico"] # 0xec42 (en: 'single horizontal em bond', google translation) - - "": [T: "doble enlace em horizontal"] # 0xec43 (en: 'double horizontal em bond', google translation) - - "": [T: "triple enlace em horizontal"] # 0xec44 (en: 'triple horizontal em bond', google translation) - - "": [T: "enlace em Ășnico vertical"] # 0xec45 (en: 'single vertical em bond', google translation) - - "": [T: "doble enlace em vertical"] # 0xec46 (en: 'double vertical em bond', google translation) - - "": [T: "triple enlace em vertical"] # 0xec47 (en: 'triple vertical em bond', google translation) - - "": [T: "menr que enlace em"] # 0xec48 (en: 'less than em bond', google translation) - - "": [T: "mayor que enlace em"] # 0xec49 (en: 'greater than em bond', google translation) - - "": [T: "enlace Ășnico horizontal"] # 0xec4a (en: 'single horizontal en bond', google translation) - - "": [T: "doble enlace horizontal en"] # 0xec4b (en: 'double horizontal en bond', google translation) - - "": [T: "triple enlace horizontal en"] # 0xec4c (en: 'triple horizontal en bond', google translation) - - "îȀ": [T: "rectĂĄngulo superior izquierdo"] # 0xec80 (en: 'top left rectangle', google translation) - - "îȁ": [T: "rectĂĄngulo inferior izquierdo"] # 0xec81 (en: 'bottom left rectangle', google translation) - - "îȐ": [T: "rectĂĄngulo superior derecho"] # 0xec90 (en: 'top right rectangle', google translation) - - "îȑ": [T: "rectĂĄngulo inferior derecho"] # 0xec91 (en: 'bottom right rectangle', google translation) - - "îȒ": [T: "intersecciĂłn de divisiĂłn sintĂ©tica"] # 0xec92 (en: 'synthetic division corner', google translation) - - "îȓ": [T: "extensor horizontal de divisiĂłn sintĂ©tica"] # 0xec93 (en: 'synthetic division horizontal extender', google translation) - - "îȔ": [T: "extensor vertical de divisiĂłn sintĂ©tica"] # 0xec94 (en: 'synthetic division vertical extender', google translation) - - "îȕ": [T: "extensor de lĂ­mite izquierdo del fondo"] # 0xec95 (en: 'left ceiling floor extender', google translation) - - "îȖ": [T: "extensor de lĂ­mite derecho del fondo"] # 0xec96 (en: 'right ceiling floor extender', google translation) - - "îȗ": [T: "por encima de extensor de soporte"] # 0xec97 (en: 'over bracket extender', google translation) - - "îȘ": [T: "extensor de barra vertical"] # 0xec98 (en: 'vertical bar extender', google translation) - - "îș": [T: "extensor de barra vertical doble izquierda"] # 0xec99 (en: 'left double vertical bar extender', google translation) - - "îȚ": [T: "extensor de barra horizontal"] # 0xec9a (en: 'horizontal bar extender', google translation) - - "îȜ": [T: "debajo de extensor de soporte"] # 0xec9c (en: 'under bracket extender', google translation) - - "îȝ": [T: "apuntando hacia abajo de parĂ©ntesis derecho"] # 0xec9d (en: 'down pointing paren right', google translation) - - "îȞ": [T: "apuntando hacia abajo de extensor de parĂ©ntesis"] # 0xec9e (en: 'down pointing paren extender', google translation) - - "îȟ": [T: "apuntando hacia abajo de parĂ©ntesis izquierdo"] # 0xec9f (en: 'down pointing paren left', google translation) - - "îČ ": [T: "apuntando hacia arriba de extensor de parĂ©ntesis"] # 0xeca0 (en: 'up pointing brace extender', google translation) - - "îČĄ": [T: "apuntando hacia arriba de parĂ©ntesis de izquierda"] # 0xeca1 (en: 'up pointing paren left', google translation) - - "îČą": [T: "apuntando hacia arriba de extensor de parĂ©ntesis"] # 0xeca2 (en: 'up pointing paren extender', google translation) - - "îČŁ": [T: "apuntando hacia arriba de parĂ©ntesis derecho"] # 0xeca3 (en: 'up pointing paren right', google translation) - - "îČ€": [T: "apuntando hacia abajo de extensor de parĂ©ntesis"] # 0xeca4 (google translation) - - "": [T: "constante de Planck sobre dos barras pi"] # 0xed00 (en: 'planck constant over two pi bar', google translation) - - "": [T: "espejo g"] # 0xed01 (en: 'mirror g', google translation) - - "": [T: "j sin puntos"] # 0xed02 (google translation) - - "": [T: "digamma"] # 0xed03 (google translation) - - "ϝ": [T: "digamma"] # 0x3dd - - "": [T: "d"] # 0xed10 (en: 'd', google translation) - - "": [T: "e"] # 0xed11 (en: 'e', google translation) - - "": [T: "i"] # 0xed12 (en: 'i', google translation) - - "": [T: "j"] # 0xed13 (en: 'j', google translation) - - "ⅅ": - - spell: "translate('.', 'ⅅ', 'DD')" # 0xed16, 0x2145 - -# The private use chars are efrom MathType - - "": [T: "bucle integral de contorno en sentido contrario a las agujas del reloj"] # 0xee00 (en: 'anticlockwise contour integral loop', google translation) - - "": [T: "bucle integral de contorno en sentido de las agujas del reloj"] # 0xee01 (en: 'clockwise contour integral loop', google translation) - - "": [t: ""] # 0xee04 - - "": [t: ""] # 0xee05 - - "": [t: ""] # 0xee06 - - "": [t: ""] # 0xee07 - - "": [t: ""] # 0xee08 - - "": [t: ""] # 0xee09 - - "": [t: ""] # 0xee0a - - "": [t: ""] # 0xee0b - - "": [t: ""] # 0xee0c - - "": [T: "ornamentaciĂłn de estatus conjunto"] # 0xee0d (en: 'joint status embellishment', google translation) - - "": [T: "ornamentaciĂłn de estatus conjunto"] # 0xee0e (en: 'joint status embellishment left', google translation) - - "": [T: "ornamentaciĂłn derecha de estatus conjunto"] # 0xee0f (en: 'joint status embellishment right', google translation) - - "": [T: "extensiĂłn de ornamentos de estatus conjunto"] # 0xee10 (en: 'joint status embellishment extender', google translation) - - "": [T: "bucle integral"] # 0xee11 (en: 'integral loop', google translation) - - "": [T: "doble bucle integral"] # 0xee12 (en: 'integral loop double', google translation) - - "": [T: "triple bucle integral"] # 0xee13 (en: 'integral loop triple', google translation) - - "": [T: "doble expansiĂłn de bucle integral"] # 0xee15 (en: 'expanding integral loop double', google translation) - - "": [T: "triple expansiĂłn de bucle integral"] # 0xee16 (en: 'expanding integral loop triple', google translation) - - "": [T: "asintĂłticamente igual al acento"] # 0xee17 (en: 'asymptotically equal to accent', google translation) - - "": [T: "signo igual a acetno"] # 0xee18 (en: 'equal sign accent', google translation) - - "": [T: "prima cuĂĄdruple"] # 0xee19 (en: 'quadruple prime', google translation) - - "⁗": [T: "prima cuĂĄdruple"] # 0x2057 (en: 'quadruple prime', MathPlayer: 'cuarta', google: 'prime cuĂĄdruple') - - "": [T: "acento de barra con cĂ­rculo abierto izquierdo"] # 0xee1a (en: 'bar accent with open circle left', google translation) - - "": [T: "acento de barra con cĂ­rculo cerrado izquierdo"] # 0xee1b (en: 'bar accent with closed circle left', google translation) - - "": [T: "acento de barra con cĂ­rculo abierto derecho"] # 0xee1c (en: 'bar accent with open circle right', google translation) - - "": [T: "acento de barra con punto encima"] # 0xee1d (en: 'bar accent with over dot', google translation) - - "": [T: "acento de barra con punto debajo"] # 0xee1e (en: 'bar accent with under dot', google translation) - - "": [T: "acento de barra con doble punto encima"] # 0xee1f (en: 'bar accent with double over dot', google translation) - - "îž ": [T: "acento de barra con doble punto debajo"] # 0xee20 (en: 'bar accent with double under dot', google translation) - - "": [T: "acento de barra con signo de intercalaciĂłn"] # 0xee21 (en: 'bar accent with caret', google translation) - - "îžą": [T: "marcado debajo de acento de barra"] # 0xee22 (en: 'thick under bar accent', google translation) - - "": [T: "acento de barra con cĂ­rculo cerrado a la derecha"] # 0xee23 (en: 'bar accent with closed circle right', google translation) - - "": [T: "gran punto arriba"] # 0xee24 (en: 'large dot above', google translation) - - "": [T: "marca de alineaciĂłn"] # 0xef00 (en: 'alignment mark', google translation) - - "": [t: ""] # 0xef01 - - "​": [t: ""] # 0x200b - - "": [t: ""] # 0xef02 - - " ": [t: ""] # 0x2009 - - "": [t: ""] # 0xef03 - - " ": [t: ""] # 0x205f - - "": [t: ""] # 0xef04 - - "": [t: ""] # 0xef05 - - " ": [t: ""] # 0x2003 - - "": [t: ""] # 0xef06 - - "": [t: ""] # 0xef07 - - "": [t: ""] # 0xef08 - - "": [t: ""] # 0xef09 - - "": [t: ""] # 0xef0a - - " ": [t: ""] # 0x200a - - "îŒą": [t: ""] # 0xef22 - - "îŒŁ": [t: ""] # 0xef23 - - "": [t: ""] # 0xef24 - - "": [t: ""] # 0xef29 - - "": [T: "tĂ©rmino ausente"] # 0xef41 (en: 'missing term', google translation) - - "": [T: "flecha integral de contorno en sentido de las agujas del reloj a la izquierda"] # 0xef80 (en: 'clockwise contour integral arrow on left', google translation) - - "": [T: "integral con cuadrado"] # 0xef81 (en: 'integral with square', google translation) - - "": [T: "integral con barra cortada"] # 0xef82 (en: 'integral with slash', google translation) - - "": [T: "integral invertida"] # 0xef83 (en: 'reversed integral', google translation) - - "": [T: "doble cero sobre doble cero"] # 0xef90 (en: 'double zero over double zero', google translation) - - "": [T: "cero con barra cortada"] # 0xef91 (en: 'zero with slash', google translation) - - # fraktur 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) - - T: "fraktur" # (google translation) - - spell: "translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" - - - "-": # 0xf000 - 0xf018 - - T: "fraktur" # (google translation) - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" - - - "𝔞-đ”·": # 0x1d51e - 0x1d537 - - T: "fraktur" # (google translation) - - spell: "translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz')" - - "-ï€ł": # 0xf01a - 0xf033 - - T: "fraktur" # (google translation) - - spell: "translate('.', 'ï€šï€›ï€œï€ï€žï€Ÿï€ ï€Ąï€ąï€Łï€€ï€„ï€Šï€§ï€šï€©ï€Șï€«ï€Źï€­ï€źï€Żï€°ï€±ï€Čï€ł', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝕬-𝖅": # 0x1D56C - 0x1D585 - - T: "fraktur bold" # (google translation) - - spell: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf040 - 0xf059 - - T: "fraktur bold" # (google translation) - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝖆-𝖟": # 0x1d586 - 0x1d59f - - T: "fraktur bold" # (google translation) - - spell: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" - - "-ïł": # 0xf05a - 0xf073 - - T: "fraktur bold" # (google translation) - - 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) - - test: - if: "$Verbosity!='Terse'" - then: [T: "doble tachadura"] # (en: 'double struck', google translation) - - spell: "translate('.', '𝔾đ”čđ”șđ”»đ”Œđ”œđ”Ÿđ”żđ•€đ•đ•‚đ•ƒđ•„đ•…đ•†đ•‡đ•ˆđ•‰đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf080 - 0xf098 - - test: - if: "$Verbosity!='Terse'" - then: [T: "doble tachadura"] # (en: 'double struck', google translation) - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝕒-đ•«": # 0x1d552 - 0x1d56b - - test: - if: "$Verbosity!='Terse'" - then: [T: "doble tachadura"] # (en: 'double struck', google translation) - - spell: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" - - "-ï‚ł": # 0xf09a - 0xf0b3 - - test: - if: "$Verbosity!='Terse'" - then: [T: "doble tachadura"] # (en: 'double struck', google translation) - - spell: "translate('.', 'ï‚šï‚›ï‚œï‚ï‚žï‚Ÿï‚ ï‚Ąï‚ąï‚Łï‚€ï‚„ï‚Šï‚§ï‚šï‚©ï‚Șï‚«ï‚Źï‚­ï‚źï‚Żï‚°ï‚±ï‚Čï‚ł', 'abcdefghijklmnopqrstuvwxyz')" - - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 - - test: - if: "$Verbosity!='Terse'" - then: [T: "doble tachadura"] # (en: 'double struck', google translation) - - spell: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" - - "-": # 0xf0c0 - 0xf0c9 - - test: - if: "$Verbosity!='Terse'" - then: [T: "doble tachadura"] # (en: 'double struck', google translation) - - spell: "translate('.', '', '0123456789')" - - - "": [T: "doble nabla tachada"] # 0xf0ca (en: 'double struck nabla', google translation) - - "": [T: "doble constante de Euler tachada"] # 0xf0cb (en: 'double struck euler constant', google translation) - - # script chars in math alphabetic block and also MathType private use area - - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 - - T: "guiĂłn" # (en: 'script', google translation) - - spell: "translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf100 - 0xf119 - - T: "guiĂłn" # (en: 'script', google translation) - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf - - T: "guiĂłn" # (en: 'script', google translation) - - spell: "translate('.', 'đ’¶đ’·đ’žđ’čđ’șđ’»đ’Œđ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“„đ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdefghijklmnopqrstuvwxyz')" - - "-ï„ł": # 0xf11a - 0xf133 - - T: "guiĂłn" # (en: 'script', google translation) - - spell: "translate('.', 'ï„šï„›ï„œï„ï„žï„Ÿï„ ï„Ąï„ąï„Łï„€ï„„ï„Šï„§ï„šï„©ï„Șï„«ï„Źï„­ï„źï„Żï„°ï„±ï„Čï„ł', 'abcdefghijklmnopqrstuvwxyz')" - - # bold script chars in math alphabetic block and also MathType private use area - - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 - - T: "guiĂłn en negrita" # (en: 'script bold', google translation) - - spell: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf140 - 0xf159 - - T: "guiĂłn en negrita" # (en: 'script bold', google translation) - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "đ“Ș-𝔃": # 0x1d4ea - 0x1d503 - - T: "guiĂłn en negrita" # (en: 'script bold', google translation) - - spell: "translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz')" - - "-ï…ł": # 0xf15a - 0xf173 - - T: "guiĂłn en negrita" # (en: 'script bold', google translation) - - spell: "translate('.', 'ï…šï…›ï…œï…ï…žï…Ÿï… ï…Ąï…ąï…Łï…€ï…„ï…Šï…§ï…šï…©ï…Șï…«ï…Źï…­ï…źï…Żï…°ï…±ï…Čï…ł', 'abcdefghijklmnopqrstuvwxyz')" - - - "-": # 0xf180 - 0xf199 - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "": # 0xf19a - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "mayĂșscula"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [T: "ligadura ae"] # (en: 'ligature ae', google translation) - - "": # 0xf19b - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "mayĂșscula"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [T: "s puntiaguda"] # (en: 'sharp s', google translation) - - "": # 0xf19c - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "mayĂșscula"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [T: "o con trazo"] # (en: 'o with stroke', google translation) - - # MathType only has a few of the cap Greek letters in PUA - - "": # 0xf201 - 0xf209 - - test: - if: "$Verbosity!='Terse'" - then: [T: "doble tachadura"] # (en: 'double struck', google translation) - - spell: "translate('.', '', 'Î”ÎšÎ›Î ÎŁÎ˜Î“Î©Î„')" - - - "-": # 0xf220 - 0xf236 - - test: - if: "$Verbosity!='Terse'" - then: [T: "doble tachadura"] # (en: 'double struck', google translation) - - spell: "translate('.', 'ïˆ ïˆĄïˆąïˆŁïˆ€ïˆ„ïˆŠïˆ§ïˆšïˆ©ïˆȘïˆ«ïˆŹïˆ­ïˆźïˆŻïˆ°ïˆ±ïˆČïˆłïˆŽïˆ”ïˆ¶', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "": [T: "doble tachadura en sigma final"] # 0xf237 (en: 'double struck final sigma', google translation) - - "": [T: "doble tachadura en rho"] # 0xf250 (en: 'double struck rho', google translation) - - "": [T: "doble tachadura en phi"] # 0xf251 (en: 'double struck phi', google translation) - - "𝐀-𝐙": # 0x1d400 - 0x1d419 - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-ï‰č": # 0xf260 - 0xf279 - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'ï‰ ï‰Ąï‰ąï‰Łï‰€ï‰„ï‰Šï‰§ï‰šï‰©ï‰Șï‰«ï‰Źï‰­ï‰źï‰Żï‰°ï‰±ï‰Čï‰łï‰Žï‰”ï‰¶ï‰·ï‰žï‰č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝐚-𝐳": # 0x1d41a - 0x1d433 - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" - - - "ï‰ș-": # 0xf27a - 0xf293 - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'ï‰șï‰»ï‰Œï‰œï‰Ÿï‰żïŠ€ïŠïŠ‚ïŠƒïŠ„ïŠ…ïŠ†ïŠ‡ïŠˆïŠ‰ïŠŠïŠ‹ïŠŒïŠïŠŽïŠïŠïŠ‘ïŠ’ïŠ“', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝐮-𝑍": # 0x1d434 - 0x1d44d - - spell: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf294 - 0xf2ad - - spell: "translate('.', 'ïŠ”ïŠ•ïŠ–ïŠ—ïŠ˜ïŠ™ïŠšïŠ›ïŠœïŠïŠžïŠŸïŠ ïŠĄïŠąïŠŁïŠ€ïŠ„ïŠŠïŠ§ïŠšïŠ©ïŠȘïŠ«ïŠŹïŠ­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝑎-𝑧": # 0x1d44e - 0x1d467 - - spell: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”đ‘•đ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" - - - "ïŠź-": # 0xf2ae - 0xf2c7 - - spell: "translate('.', 'ïŠźïŠŻïŠ°ïŠ±ïŠČïŠłïŠŽïŠ”ïŠ¶ïŠ·ïŠžïŠčïŠșïŠ»ïŠŒïŠœïŠŸïŠżï‹€ï‹ï‹‚ï‹ƒï‹„ï‹…ï‹†ï‹‡', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝑹-𝒁": # 0x1d468 - 0x1d481 - # - T: "negrita cursiva" - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-ï‹Ą": # 0xf2c8 - 0xf2e1 - # - T: "negrita cursiva" - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'ï‹ˆï‹‰ï‹Šï‹‹ï‹Œï‹ï‹Žï‹ï‹ï‹‘ï‹’ï‹“ï‹”ï‹•ï‹–ï‹—ï‹˜ï‹™ï‹šï‹›ï‹œï‹ï‹žï‹Ÿï‹ ï‹Ą', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝒂-𝒛": # 0x1d482 - 0x1d49b - # - T: "negrita cursiva" - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" - - - "ï‹ą-": # 0xf2e2 - 0xf2fb - # - T: "negrita cursiva" # (en: 'bold', google translation) - - spell: "translate('.', 'ï‹ąï‹Łï‹€ï‹„ï‹Šï‹§ï‹šï‹©ï‹Șï‹«ï‹Źï‹­ï‹źï‹Żï‹°ï‹±ï‹Čï‹łï‹Žï‹”ï‹¶ï‹·ï‹žï‹čï‹ș', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 - - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf300 - 0xf319 - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 - - spell: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" - - - "-ïŒł": # 0xf31a - 0xf333 - - spell: "translate('.', 'ïŒšïŒ›ïŒœïŒïŒžïŒŸïŒ ïŒĄïŒąïŒŁïŒ€ïŒ„ïŒŠïŒ§ïŒšïŒ©ïŒȘïŒ«ïŒŹïŒ­ïŒźïŒŻïŒ°ïŒ±ïŒČïŒł', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf334 - 0xf34d - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'ïŒčïŒșïŒ»ïŒŒïŒœïŒŸïŒżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒï', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝗼-𝘇": # 0x1d5ee - 0x1d607 - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" - - - "-": # 0xf34e - 0xf367 - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'ïŽïïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§', 'abcdefghijklmnopqrstuvwxyz')" - - "𝘈-𝘡": # 0x1d608 - 0x1d621 - # - T: "cursiva" - - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - "-": # 0xf368 - 0xf381 - # - T: "cursiva" - - spell: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżïŽ€ïŽ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝘱-đ˜»": # 0x1d622 - 0x1d63b - # - T: "cursiva" - - spell: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" - - - "-": # 0xf382 - 0xf39b - # - T: "cursiva" - - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - - - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 - # - T: "negrita cursiva" - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf39c - 0xf3b5 - # - T: "negrita cursiva" - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'ïŽœïŽïŽžïŽŸïŽ ïŽĄïŽąïŽŁïŽ€ïŽ„ïŽŠïŽ§ïŽšïŽ©ïŽȘïŽ«ïŽŹïŽ­ïŽźïŽŻïŽ°ïŽ±ïŽČïŽłïŽŽïŽ”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝙖-𝙯": # 0x1d656 - 0x1d66f - # - T: "negrita cursiva" - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" - - - "-": # 0xf3b6 - 0xf3cf - # - T: "negrita cursiva" - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'ïŽčïŽșïŽ»ïŽŒïŽœïŽŸïŽżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒïïŽï', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝙰-𝚉": # 0x1d670 - 0x1d689 - - spell: "translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf3d0 - 0xf3e9 - - spell: "translate('.', 'ïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§ïšï©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝚊-𝚣": # 0x1d68a - 0x1d6a3 - - spell: "translate('.', '𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚱𝚣', 'abcdefghijklmnopqrstuvwxyz')" - - - "ïȘ-": # 0xf3ea - 0xf403 - - spell: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżï€ïï‚ïƒ', 'abcdefghijklmnopqrstuvwxyz')" - - - "": [T: "i sin punto"] # 0xf404 (google translation) - - "đš€": [T: "ci cursiva sin punto"] # 0x1d6a4 (en: 'dotless i', google: 'dotless i') - - "đš„": [T: "j cursiva sin punto"] # 0x1d6a5 (en: 'dotless j', google: 'dotless j') - - - "𝚹-𝛀": # 0x1d6a8 - 0x1d6c0 - - T: "j cursiva sin punto" # (en: 'bold', google: 'atrevido') - - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "-": # 0xf408 - 0xf420 - - T: "j cursiva sin punto" # (en: 'bold', google: 'atrevido') - - spell: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "𝛂-𝛚": # 0x1d6c2 - 0x1d6da - - T: "j cursiva sin punto" # (en: 'bold', google: 'atrevido') - - spell: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙𝛚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "ïą-ïș": # 0xf422 - 0xf43a - - T: "j cursiva sin punto" # (en: 'bold', google: 'atrevido') - - spell: "translate('.', 'ïąïŁï€ï„ïŠï§ïšï©ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïș', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "ïĄ": [T: "nabla en negrita"] # 0xf421 (google translation) - - "𝛁": [T: "nabla en negrita"] # 0x1d6c1 (google translation) - - - "𝛛𝛜𝛝𝛞𝛟𝛠𝛡": # 0x1D6DB - 0x1D6E1 - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', '𝛛𝛜𝛝𝛞𝛟𝛠𝛡', '∂ΔΞÎșφρπ')" - - - "ï»ïŒïœïŸïżï‘€ï‘": # 0xF43C - 0xF441 - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'ï»ïŒïœïŸïżï‘€ï‘', '∂ΔΞÎșφρπ')" - - - "𝛱-đ›ș": # 0x1d6e2 - 0x1d6fa - # - T: "cursiva" - - spell: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›čđ›ș', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "-": # 0xf442 - 0xf45a - # - T: "cursiva" - - spell: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "đ›Œ-𝜔": # 0x1d6fc - 0x1d714 - # - T: "cursiva" - - spell: "translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“đœ”', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "-": # 0xf45c - 0xf474 - # - T: "cursiva" - - spell: "translate('.', 'ï‘œï‘ï‘žï‘Ÿï‘ ï‘Ąï‘ąï‘Łï‘€ï‘„ï‘Šï‘§ï‘šï‘©ï‘Șï‘«ï‘Źï‘­ï‘źï‘Żï‘°ï‘±ï‘Čï‘łï‘Ž', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "": [T: "nabla en cursiva"] # 0xf45b (en: 'italic nabla', google translation) - - "đ›»": [T: "nabla en cursiva"] # 0x1d6fb (en: 'italic nabla', google translation) - - - "𝜕𝜖𝜗𝜘𝜙𝜚𝜛": # 0x1d715 - 0x1d71b - # - T: "cursiva" - - spell: "translate('.', '𝜕𝜖𝜗𝜘𝜙𝜚𝜛', '∂ΔΞÎșφρπ')" - - - "ï‘čï‘ș": # 0xf475 - 0xf47b - # - T: "cursiva" - - spell: "translate('.', 'ï‘čï‘ș', '∂ΔΞÎșφρπ')" - - - "𝜜-𝜮": # 0x1d71c - 0x1d734 - # - T: "negrita cursiva" - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳𝜮', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "-": # 0xf47c - 0xf494 - # - T: "negrita cursiva" - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'ï‘Œï‘œï‘Ÿï‘żï’€ï’ï’‚ï’ƒï’„ï’…ï’†ï’‡ï’ˆï’‰ï’Šï’‹ï’Œï’ï’Žï’ï’ï’‘ï’’ï’“ï’”', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "đœ¶-𝝎": # 0x1d736 - 0x1d74e - # - T: "negrita cursiva" - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđđŽ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "-ï’ź": # 0xf496 - 0xf4ae - # - T: "negrita cursiva" - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'ï’–ï’—ï’˜ï’™ï’šï’›ï’œï’ï’žï’Ÿï’ ï’Ąï’ąï’Łï’€ï’„ï’Šï’§ï’šï’©ï’Șï’«ï’Źï’­ï’ź', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "𝝏𝝐𝝑𝝒𝝓𝝔𝝕": # 0x1d74f - 0x1d755 - # - T: "negrita cursiva" - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', '𝝏𝝐𝝑𝝒𝝓𝝔𝝕', '∂ΔΞÎșφρπ')" - - - "ï’Żï’°ï’±ï’Čï’łï’Žï’”": # 0xf422 - 0xf43a - # - T: "negrita cursiva" - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'ï’Żï’°ï’±ï’Čï’łï’Žï’”', '∂ΔΞÎșφρπ')" - - - "đœ”": [T: "nabla en cursiva y negrita"] # 0x1d735 (en: 'bold italic nabla', google translation) - - "": [T: "nabla en cursiva y negrita"] # 0xf495 (en: 'bold italic nabla', google translation) - - - "𝝖-𝝼": # 0x1d756 - 0x1d76e - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đź', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - "-": # 0xf4b6 - 0xf4ce - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'ï’¶ï’·ï’žï’čï’șï’»ï’Œï’œï’Ÿï’żï“€ï“ï“‚ï“ƒï“„ï“…ï“†ï“‡ï“ˆï“‰ï“Šï“‹ï“Œï“ï“Ž', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "𝝰-𝞈": # 0x1d770 - 0x1d788 - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€đžđž‚đžƒđž„đž…đž†đž‡đžˆ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "-": # 0xf4d0 - 0xf4e8 - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'ï“ï“‘ï“’ï““ï“”ï“•ï“–ï“—ï“˜ï“™ï“šï“›ï“œï“ï“žï“Ÿï“ ï“Ąï“ąï“Łï“€ï“„ï“Šï“§ï“š', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "𝞉𝞊𝞋𝞌𝞍𝞎𝞏": # 0x1d789 - 0x1d78f - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', '𝞉𝞊𝞋𝞌𝞍𝞎𝞏', '∂ΔΞÎșφρπ')" - - - "ï“Șï“«ï“Źï“­ï“źï“Ż": # 0xf4e9 - 0xf4ef - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'ï“Șï“«ï“Źï“­ï“źï“Ż', '∂ΔΞÎșφρπ')" - - - "": [T: "nabla en negrita"] # 0xf4cf (google translation) - - "𝝯": [T: "nabla en negrita"] # 0x1d76f (google translation) - - - "𝞐-𝞹": # 0x1d790 - 0x1d7a8 - # - T: "negrita cursiva" - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "-": # 0xf4f0 - 0xf508 - # - T: "negrita cursiva" - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'ï“Čï“łï“Žï“”ï“¶ï“·ï“žï“čï“șï“»ï“Œï“œï“Ÿï“żï”€ï”ï”‚ï”ƒï”„ï”…ï”†ï”‡ï”ˆ', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "đžȘ-𝟂": # 0x1d7aa - 0x1d7c2 - # - T: "negrita cursiva" - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸđŸ‚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "-ï”ą": # 0xf50a - 0xf522 - # - T: "negrita cursiva" - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'ï”Šï”‹ï”Œï”ï”Žï”ï”ï”‘ï”’ï”“ï””ï”•ï”–ï”—ï”˜ï”™ï”šï”›ï”œï”ï”žï”Ÿï” ï”Ąï”ą', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "𝟃𝟄𝟅𝟆𝟇𝟈𝟉": # 0x1d7c3 - 0x1d7c9 - # - T: "negrita cursiva" - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', '𝟃𝟄𝟅𝟆𝟇𝟈𝟉', '∂ΔΞÎșφρπ')" - - - "ï”Łï”€ï”„ï”Šï”§ï”šï”©": # 0xf523 - 0xf529 - # - T: "negrita cursiva" - - T: "negrita" # (en: 'bold', google translation) - - spell: "translate('.', 'ï”Łï”€ï”„ï”Šï”§ï”šï”©', '∂ΔΞÎșφρπ')" - - - "": [T: "nabla en negrita"] # 0xf509 (google translation) - - "đž©": [T: "nabla en negrita"] # 0x1d7a9 (google translation) - - - "ï”ź": [T: "cero en negrita"] # 0xf52e (en: 'bold zero', google translation) - - "𝟎": [T: "cero en negrita"] # 0x1d7ce (en: 'bold zero', google translation) - - "ï”Ż": [T: "uno en negrita"] # 0xf52f (en: 'bold one', google translation) - - "𝟏": [T: "negrita"] # 0x1d7cf (en: 'bold one', google translation) - - "": [T: "dos en negrita"] # 0xf530 (en: 'bold two', google translation) - - "𝟐": [T: "dos en negrita"] # 0x1d7d0 (en: 'bold two', google translation) - - "": [T: "tres en negrita"] # 0xf531 (en: 'bold three', google translation) - - "𝟑": [T: "tres en negrita"] # 0x1d7d1 (en: 'bold three', google translation) - - "ï”Č": [T: "cuatro en negrita"] # 0xf532 (en: 'bold four', google translation) - - "𝟒": [T: "bold en negrita"] # 0x1d7d2 (en: 'bold four', google translation) - - "ï”ł": [T: "cinco en negrita"] # 0xf533 (en: 'bold five', google translation) - - "𝟓": [T: "cinco en negrita"] # 0x1d7d3 (en: 'bold five', google translation) - - "": [T: "seis en negrita"] # 0xf534 (en: 'bold six', google translation) - - "𝟔": [T: "seis en negrita"] # 0x1d7d4 (en: 'bold six', google translation) - - "ï””": [T: "siete en negrita"] # 0xf535 (en: 'bold seven', google translation) - - "𝟕": [T: "siete en negrita"] # 0x1d7d5 (en: 'bold seven', google translation) - - "": [T: "ocho en negrita"] # 0xf536 (en: 'bold eight', google translation) - - "𝟖": [T: "ocho en negrita"] # 0x1d7d6 (en: 'bold eight', google translation) - - "": [T: "nueve en negrita"] # 0xf537 (en: 'bold nine', google translation) - - "𝟗": [T: "nueve en negrita"] # 0x1d7d7 (en: 'bold nine', google translation) - - "": [T: "cero"] # 0xf542 (en: 'zero', google translation) - - "𝟱": [T: "cero"] # 0x1d7e2 (en: 'zero', google translation) - - "": [T: "uno"] # 0x1d7e3 (en: 'one', google translation) - - "": [T: "dos"] # 0xf544 (en: 'two', google translation) - - "đŸ€": [T: "dos"] # 0x1d7e4 (en: 'two', google translation) - - "": [T: "tres"] # 0xf545 (en: 'three', google translation) - - "đŸ„": [T: "tres"] # 0x1d7e5 (en: 'three', google translation) - - "": [T: "cuatro"] # 0xf546 (en: 'four', google translation) - - "𝟩": [T: "cuatro"] # 0x1d7e6 (en: 'four', google translation) - - "": [T: "cinco"] # 0xf547 (en: 'five', google translation) - - "𝟧": [T: "cinco"] # 0x1d7e7 (en: 'five', google translation) - - "": [T: "seis"] # 0xf548 (en: 'six', google translation) - - "𝟹": [T: "seis"] # 0x1d7e8 (en: 'six', google translation) - - "": [T: "siete"] # 0xf549 (en: 'seven', google translation) - - "đŸ©": [T: "siete"] # 0x1d7e9 (en: 'seven', google translation) - - "": [T: "ocho"] # 0xf54a (en: 'eight', google translation) - - "đŸȘ": [T: "ocho"] # 0x1d7ea (en: 'eight', google translation) - - "": [T: "nueve"] # 0xf54b (en: 'nine', google translation) - - "đŸ«": [T: "nueve"] # 0x1d7eb (en: 'nine', google translation) - - "": [T: "cero en negrita"] # 0xf54c (en: 'bold zero', google translation) - - "𝟬": [T: "cero en negrita"] # 0x1d7ec (en: 'bold zero', google translation) - - "": [T: "uno en negrita"] # 0xf54d (en: 'bold one', google translation) - - "𝟭": [T: "uno en negrita"] # 0x1d7ed (en: 'bold one', google translation) - - "": [T: "dos en negrita"] # 0xf54e (en: 'bold two', google translation) - - "𝟼": [T: "dos en negrita"] # 0x1d7ee (en: 'bold two', google translation) - - "": [T: "tres en negrita"] # 0xf54f (en: 'bold three', google translation) - - "𝟯": [T: "tres en negrita"] # 0x1d7ef (en: 'bold three', google translation) - - "": [T: "cuatro en negrita"] # 0xf550 (en: 'bold four', google translation) - - "𝟰": [T: "bold en negrita"] # 0x1d7f0 (en: 'bold four', google translation) - - "": [T: "cinco en negrita"] # 0xf551 (en: 'bold five', google translation) - - "đŸ±": [T: "bcinco en negrita"] # 0x1d7f1 (en: 'bold five', google translation) - - "": [T: "seis negrita"] # 0xf552 (en: 'bold six', google translation) - - "đŸČ": [T: "seis negrita"] # 0x1d7f2 (en: 'bold six', google translation) - - "": [T: "siete negrita"] # 0xf553 (en: 'bold seven', google translation) - - "𝟳": [T: "siete en negrita"] # 0x1d7f3 (en: 'bold seven', google translation) - - "": [T: "ocho en negrita"] # 0xf554 (en: 'bold eight', google translation) - - "𝟮": [T: "ocho en negrita"] # 0x1d7f4 (en: 'bold eight', google translation) - - "": [T: "nueve en negrita"] # 0xf555 (en: 'bold nine', google translation) - - "đŸ”": [T: "nueve en negrita"] # 0x1d7f5 (en: 'bold nine', google translation) - - "": [T: "cero"] # 0xf556 (en: 'zero', google translation) - - "đŸ¶": [T: "cero"] # 0x1d7f6 (en: 'zero', google translation) - - "": [T: "uno"] # 0xf557 (en: 'one', google translation) - - "đŸ·": [T: "uno"] # 0x1d7f7 (en: 'one', google translation) - - "": [T: "dos"] # 0xf558 (en: 'two', google translation) - - "𝟾": [T: "dos"] # 0x1d7f8 (en: 'two', google translation) - - "": [T: "tres"] # 0xf559 (en: 'three', google translation) - - "đŸč": [T: "tres"] # 0x1d7f9 (en: 'three', google translation) - - "": [T: "cuatro"] # 0xf55a (en: 'four', google translation) - - "đŸș": [T: "cuatro"] # 0x1d7fa (en: 'four', google translation) - - "": [T: "cinco"] # 0xf55b (en: 'five', google translation) - - "đŸ»": [T: "cinco"] # 0x1d7fb (en: 'five', google translation) - - "": [T: "seis"] # 0xf55c (en: 'six', google translation) - - "đŸŒ": [T: "seis"] # 0x1d7fc (en: 'six', google translation) - - "": [T: "siete"] # 0xf55d (en: 'seven', google translation) - - "đŸœ": [T: "siete"] # 0x1d7fd (en: 'seven', google translation) - - "": [T: "ocho"] # 0xf55e (en: 'eight', google translation) - - "đŸŸ": [T: "ocho"] # 0x1d7fe (en: 'eight', google translation) - - "": [T: "nueve"] # 0xf55f (en: 'nine', google translation) - - "𝟿": [T: "nueve"] # 0x1d7ff (en: 'nine', google translation) - - "": [T: "carĂĄcter desconocido"] # 0xf700 (en: 'unknown character', google translation) - - "": [T: "triĂĄngulos inferior derecho e inferior izquierdo"] # 0xf726 (en: 'lower right and lower left triangles', google translation) - - "": [T: "extensor de puntos suspensivos horizontales"] # 0xf72d (en: 'horizontal ellipsis extender', google translation) - - "ïœź": [T: "extensor de puntos suspensivos de lĂ­nea media horizontal"] # 0xf72e (en: 'midline horizontal ellipsis extender', google translation) - - "ïŁ„": [T: "extensor radical"] # 0xf8e5 (en: 'radical extender', google translation) - - "ïŁŠ": [T: "extensor de flecha vertical"] # 0xf8e6 (en: 'vertical arrow extender', google translation) - - "ïŁ§": [T: "extensor de flecha horizontal"] # 0xf8e7 (en: 'horizontal arrow extender', google translation) - - "ïŁš": [T: "señal registrada sans serif"] # 0xf8e8 (en: 'registered sign sans serif', google translation) - - "ïŁ©": [T: "copyright sign sans serif"] # 0xf8e9 (google translation) - - "ïŁȘ": [T: "signo de marca comercial sans serif"] # 0xf8ea (en: 'trade mark sign sans serif', google translation) - - "ïŁ«": [T: "parĂ©ntesis superior izquierdo"] # 0xf8eb (en: 'left paren top', google translation) - - "ïŁŹ": [T: "extensor de parĂ©ntesis izquierdo"] # 0xf8ec (en: 'left paren extender', google translation) - - "ïŁ­": [T: "parĂ©ntesis izquierdo inferior"] # 0xf8ed (en: 'left paren bottom', google translation) - - "ïŁź": [T: "soporte izquierdo superior"] # 0xf8ee (en: 'left bracket top', google translation) - - "ïŁŻ": [T: "extensor de soporte izquierdo"] # 0xf8ef (en: 'left bracket extender', google translation) - - "ïŁ°": [T: "soporte izquierdo inferior"] # 0xf8f0 (en: 'left bracket bottom', google translation) - - "ïŁ±": [T: "soporte izquierdo superior"] # 0xf8f1 (en: 'left brace top', google translation) - - "ïŁČ": [T: "soporte izquierdo medio"] # 0xf8f2 (en: 'left brace mid', google translation) - - "ïŁł": [T: "soporte izquierdo inferior"] # 0xf8f3 (en: 'left brace bottom', google translation) - - "ïŁŽ": [T: "extensor de soporte"] # 0xf8f4 (en: 'brace extender', google translation) - - "ïŁ”": [T: "extensor integral"] # 0xf8f5 (en: 'integral extender', google translation) - - "ïŁ¶": [T: "parĂ©ntesis superior derecho"] # 0xf8f6 (en: 'right paren top', google translation) - - "ïŁ·": [T: "extensor de parĂ©ntesis derecho"] # 0xf8f7 (en: 'right paren extender', google translation) - - "ïŁž": [T: "parĂ©ntesis inferior derecho"] # 0xf8f8 (en: 'right paren bottom', google translation) - - "ïŁč": [T: "soporte derecho superior"] # 0xf8f9 (en: 'right bracket top', google translation) - - "ïŁș": [T: "extensor de soporte derecho"] # 0xf8fa (en: 'right bracket extender', google translation) - - "ïŁ»": [T: "soporte derecho inferior"] # 0xf8fc (en: 'right brace top', google translation) - - "ïŁœ": [T: "soporte derecho medio"] # 0xf8fd (en: 'right brace mid', google translation) - - "ïŁŸ": [T: "soporte derecho inferior"] # 0xf8fe (en: 'right brace bottom', google translation) - - "ïŁż": [T: "logotipo de apple"] # 0xf8ff (en: 'apple logo', google translation) - - "ïŹ€": [T: "ff ligadas"] # 0xfb00 (en: 'ff', google: 'ff') - - "ïŹ": [T: "fi ligadas"] # 0xfb01 (en: 'fi', google: 'f') - - "ïŹ‚": [T: "fl ligadas"] # 0xfb02 (en: 'fl', google: 'florida') - - "ïŹƒ": [T: "ffl ligadas"] # 0xfb04 (en: 'ffl', google: 'ffl') - - "ïŹ…": [T: "pie"] # 0xfb05 (en: 'ft', google translation) - - "ïŹ†": [T: "calle"] # 0xfb06 (en: 'st', google translation) - - "ïž ": [T: "mitad de ornamentaciĂłn izquierda en ligadura"] # 0xfe20 (en: 'ligature left half embellishment', google translation) - - "ïžĄ": [T: "mitad de ornamentaciĂłn derecha en ligadura"] # 0xfe21 (en: 'ligature right half embellishment', google translation) - - "ïžą": [T: "doble tilde con media ornamentaciĂłn izquierda"] # 0xfe22 (en: 'double tilde left half embellishment', google translation) - - "ïžŁ": [T: "doble tilde medio adorno"] # 0xfe23 (en: 'double tilde right half embellishment', google translation) - - "": [T: "macron dejĂł medio adorno"] # 0xfe24 (en: 'macron left half embellishment', google translation) - - "ïž„": [T: "macron medio adorno"] # 0xfe25 (en: 'macron right half embellishment', google translation) - - "": [T: "unir el adorno de macron"] # 0xfe26 (en: 'conjoining macron embellishment', google translation) - - "ïž”": [T: "parĂ©ntesis superior"] # 0xfe35 (en: 'over paren') - - "ïž¶": [T: "parĂ©ntesis inferior"] # 0xfe36 (en: 'under paren') - - "ïž·": [T: "llave superior"] # 0xfe37 (en: 'over brace') - - "ïžž": [T: "llave inferior"] # 0xfe38 (en: 'under brace') - - "ïžż": [T: "parĂ©ntesis angular superior"] # 0xfe3f (en: 'over angle bracket') - - "ïč€": [T: "parĂ©ntesis angular inferior"] # 0xfe40 (en: 'under angle bracket') - - "ïčš": [T: "divisiĂłn entera"] # 0xfe68 (en: 'integer divide') - - "ïżŒ": [T: "objeto desconocido o faltante"] # 0xfffc (en: 'unknown or missing object', google translation) - - "ïżœ": [T: "caracter desconocido o faltante"] # 0xfffd (en: 'unknown or missing character', google: 'personaje desconocido o faltante') - +--- + + - "€": [T: "moneda"] # 0xa4 (en: 'currency sign') + - "„": [T: "yen"] # 0xa5 + - "Š": [T: "barra vertical partida"] # 0xa6 (en: 'broken bar') + - "§": [T: "secciĂłn"] # 0xa7 (en: 'section') + - "š": [T: "diĂ©resis"] # 0xa8 (en: 'double dot') + - "©": [T: "copyright"] # 0xa9 + - "ÂȘ": [T: "ordinal femenino"] # 0xaa (en: 'feminine ordinal indicator') + - "«": [T: "abrir comillas angulare"] # 0xab (en: 'left-pointing double angle quote mark', MathPlayer: 'abre comillas angulares', google: 'marca de cotizaciĂłn de doble ĂĄngulo de punta izquierda') + - "ÂŻ": # 0xaf + - test: + if: "ancestor::m:modified-variable and preceding-sibling::*[1][self::m:mi]" + then: [T: "barra"] # (google translation) + else: [T: "barra"] # (en: 'line') + - "ÂČ": [T: "al cuadrado"] # 0xb2 (en: 'two', MathPlayer: 'super 2', google: 'dos') + - "Âł": [T: "al cubo"] # 0xb3 (en: 'three', MathPlayer: 'super 3', google: 'tres') + - "”": [T: "micro"] # 0xb5 + - "Âč": [T: "super 1"] # 0xb9 (en: 'one', google: 'uno') + - "Âș": [T: "ordinal masculino"] # 0xb9 (en: 'masculine ordinal indicator') + - "ʰ": [T: "modificador pequeño h"] # 0x2b0 (en: 'modifier small h', google translation) + - "ʱ": [T: "modificador pequeño h con gancho"] # 0x2b1 (en: 'modifier small h with hook', google translation) + - "ÊČ": [T: "modificador pequeño j"] # 0x2b2 (en: 'modifier small j', google translation) + - "Êł": [T: "modificador pequeño r"] # 0x2b3 (en: 'modifier small r', google translation) + - "ÊŽ": [T: "modificador pequeño girado r"] # 0x2b4 (en: 'modifier small turned r', google translation) + - "Ê”": [T: "modificador pequeño girado r con gancho"] # 0x2b5 (en: 'modifier small turned r with hook', google translation) + - "ʶ": # 0x2b6 + - T: "modificador pequeño invertido" # (en: 'modifier small inverted', google translation) + - spell: "translate('R', 'R', 'R')" + + - "Ê·": [T: "modificador pequeño w"] # 0x2b7 (en: 'modifier small w', google translation) + - "Êž": [T: "modificador pequeño y"] # 0x2b8 (en: 'modifier small y', google translation) + - "Êč": [T: "prima"] # 0x2b9 (en: 'modifier prime', google: 'modificador prime') + - "Êș": [T: "dos prima"] # 0x2ba (en: 'modifier double prime', google: 'modificador doble prime') + - "Ê»": [T: "modificador girado por coma"] # 0x2bb (en: 'modifier turned comma', google translation) + - "ÊŒ": [T: "apĂłstrofo modificador"] # 0x2bc (en: 'modifier apostrophe', google translation) + - "Êœ": [T: "modificador de coma invertida"] # 0x2bd (en: 'modifier reversed comma', google translation) + - "ÊŸ": [T: "semianillo a la derecha"] # 0x2be (en: 'modifier right half ring', google: 'modificador de medio anillo derecho') + - "Êż": [T: "semianillo a la izquierda"] # 0x2bf (en: 'modifier left half ring', google: 'modificador de medio anillo izquierdo') + - "ˀ": [T: "modificador de parada glĂłtica"] # 0x2c0 (en: 'modifier glottal stop', google translation) + - "ˁ": [T: "modificador invertido de parada glĂłtica"] # 0x2c1 (en: 'modifier reversed glottal stop', google translation) + - "˂": [T: "modificador de punta de flecha izquierda"] # 0x2c2 (en: 'modifier left arrowhead', google translation) + - "˃": [T: "modificador de punta de flecha derecha"] # 0x2c3 (en: 'modifier right arrowhead', google translation) + - "˄": [T: "modificador de punta de flecha hacia arriba"] # 0x2c4 (en: 'modifier up arrowhead', google translation) + - "˅": [T: "modificador de punta de flecha hacia abajo"] # 0x2c5 (en: 'modifier down arrowhead', google translation) + - "ˆ": [T: "circunflejo"] # 0x2c6 (en: 'modifier circumflex accent', google: 'acento circunflejo modificador') + - "ˇ": [T: "carĂłn"] # 0x2c7 (en: 'caron', google: 'caron') + - "ˈ": [T: "lĂ­nea vertical modificador"] # 0x2c8 (en: 'modifier vertical line', google translation) + - "ˉ": [T: "modificador macron"] # 0x2c9 (en: 'modifier macron', google translation) + - "ˊ": [T: "modificador acento agudo"] # 0x2ca (en: 'modifier acute accent', google translation) + - "ˋ": [T: "modificador acento grave"] # 0x2cb (en: 'modifier grave accent', google translation) + - "ˌ": [T: "modificador lĂ­nea baja vertical"] # 0x2cc (en: 'modifier low vertical line', google translation) + - "ˍ": [T: "modificador bajo macron"] # 0x2cd (en: 'modifier low macron', google translation) + - "ˎ": [T: "modificador acento acento grave bajo"] # 0x2ce (en: 'modifier low grave accent', google translation) + - "ˏ": [T: "modificador acento bajo agudo"] # 0x2cf (en: 'modifier low acute accent', google translation) + - "ː": [T: "modificador de colon triangular"] # 0x2d0 (en: 'modifier triangular colon', google translation) + - "ˑ": [T: "modificador de medio colon triangular"] # 0x2d1 (en: 'modifier half triangular colon', google translation) + - "˒": [T: "modificador centrado en la mitad del anillo rerecho"] # 0x2d2 (en: 'modifier centered right half ring', google translation) + - "˓": [T: "modificador centrado en la mitad del anillo izquierdo"] # 0x2d3 (en: 'modifier centered left half ring', google translation) + - "˔": [T: "modificador de tadck superior"] # 0x2d4 (en: 'modifier up tadck', google translation) + - "˕": [T: "modificador hacia abajo"] # 0x2d5 (en: 'modifier down tack', google translation) + - "˖": [T: "modificador mĂĄs signo"] # 0x2d6 (en: 'modifier plus sign', google translation) + - "˗": [T: "medio anillo derecho por debajo de la ornamentaciĂłn"] # 0x339 (en: 'right half ring below embellishment', google translation) + - "Ìș": [T: "puente invertido debajo de la ornamentaciĂłn"] # 0x33a (en: 'inverted bridge below embellishment', google translation) + - "Ì»": [T: "cuadrado por debajo de la ornamentaciĂłn"] # 0x33b (en: 'square below embellishment', google translation) + - "ÌŒ": [T: "gaviota por debajo del adorno"] # 0x33c (en: 'seagull below embellishment', google translation) + - "Ìœ": [T: "x por encima del adorno"] # 0x33d (en: 'x above embellishment', google translation) + - "ÌŸ": [T: "ornamentaciĂłn de tilde vertical"] # 0x33e (en: 'vertical tilde embellishment', google translation) + - "Ìż": [T: "ornamentaciĂłn de doble superposiciĂłn"] # 0x33f (en: 'double overline embellishment', google translation) + - "̀": [T: "ornamentaciĂłn de la señal de tono grave"] # 0x340 (en: 'grave tone mark embellishment', google translation) + - "́": [T: "ornamentaciĂłn de la señal de tono agudo"] # 0x341 (en: 'acute tone mark embellishment', google translation) + + - "ÎȘΫϏ": # 0x3aa, 0x3ab, 0x3cf + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "mayĂșscula"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [spell: "translate('.', 'ÎȘΫϏ', 'Îčυϗ')"] + - T: "con dialytika" # (en: 'with dialytika', google translation) + - "ϊ": [T: "iota con dialytika"] # 0x3ca (en: 'iota with dialytika', google translation) + - "ϋ": [T: "Ă©psilon con dialytika"] # 0x3cb (en: 'upsilon with dialytika', google translation) + - "ό": [T: "Ăłmicron con tonos"] # 0x3cc (en: 'omicron with tonos', google translation) + - "ύ": [T: "Ă©psilon con tonos"] # 0x3cd (en: 'upsilon with tonos', google translation) + - "ώ": [T: "omega con tonos"] # 0x3ce (en: 'omega with tonos', google translation) + - "ϐ": [T: "sĂ­mbolo beta"] # 0x3d0 (en: 'beta') + - "ϑ": [T: "variante de theta"] # 0x3d1 (en: 'theta', google: 'theta') + - "ϒ": [T: "Ă­psilon con gancho"] # 0x3d2 (en: 'upsilon with hook', google: 'upsilon con gancho') + - "ϓ": [T: "Ă©psilon con diĂ©resis y gancho"] # 0x3d4 (en: 'upsilon with diaeresis and hook', google translation) + - "ϗ": [T: "sĂ­mbolo kai griego"] # 0x3d7 (en: 'kai') + - "А-ĐŻ": # 0x410 - 0x42f + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "mayĂșscula"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [spell: "translate('.', 'ĐĐ‘Đ’Đ“Đ”Đ•Đ–Đ—Đ˜Đ™ĐšĐ›ĐœĐĐžĐŸĐ ĐĄĐąĐŁĐ€Đ„ĐŠĐ§ĐšĐ©ĐȘЫЏЭПЯ', 'абĐČгЎДжзОĐčĐșĐ»ĐŒĐœĐŸĐżŃ€ŃŃ‚ŃƒŃ„Ń…Ń†Ń‡ŃˆŃ‰ŃŠŃ‹ŃŒŃŃŽŃ')"] + - "а": [T: "a"] # 0x430 (google: 'а') + - "б": [T: "be"] # 0x431 (google: 'ser') + - "ĐČ": [T: "ve"] # 0x432 (google: 'veinte') + - "Đł": [T: "ghe"] # 0x433 + - "ĐŽ": [T: "de"] # 0x434 (google: 'delaware') + - "Đ”": [T: "ie"] # 0x435 (google: 'es decir') + - "ж": [T: "zhe"] # 0x436 + - "Đ·": [T: "i"] # 0x438 (google: 'Đž') + - "Đč": [T: "i corta"] # 0x439 (en: 'short i', google: 'corto i') + - "Đș": [T: "ka"] # 0x43a + - "Đ»": [T: "em"] # 0x43c + - "Đœ": [T: "o"] # 0x43e (google: 'ĐŸ') + - "Đż": [T: "pe"] # 0x43f (google: 'educaciĂłn fĂ­sica') + - "р": [T: "er"] # 0x440 + - "с": [T: "es"] # 0x441 + - "т": [T: "te"] # 0x442 + - "у": [T: "u"] # 0x443 (google: 'у') + - "ф": [T: "ef"] # 0x444 + - "х": [T: "ha"] # 0x445 (google: 'ja') + - "ц": [T: "tse"] # 0x446 + - "ч": [T: "che"] # 0x447 + - "ш": [T: "sha"] # 0x448 + - "щ": [T: "shcha"] # 0x449 + - "ъ": [T: "signo duro"] # 0x44a (en: 'hard sign') + - "ы": [T: "yeru"] # 0x44b + - "ь": [T: "signo suave"] # 0x44c (en: 'soft sign') + - "э": [T: "e"] # 0x44d (google: 'э') + - "ю": [T: "yu"] # 0x44e + - "я": [T: "ya"] # 0x44f + - "‐": [T: "menos"] # 0x2010 (en: 'hyphen') + - "‑": [T: "guiĂłn indivisible"] # 0x2011 (en: 'hyphen', google: 'guiĂłn') + - "‒": [T: "figura Dash"] # 0x2012 (en: 'figure dash', google: 'figura dash') + - "―": [T: "barra horizontal"] # 0x2015 (en: 'horizontal bar') + - "‱": # 0x2022 + - test: + if: "@data-chem-formula-op" + then: [T: "punto"] # (en: 'dot', google translation) + else: [T: "bala"] # (en: 'bullet') + + - "‰": [T: "tanto por millar"] # 0x2030 (en: 'per mille') + - "‱": [T: "tanto por diez mil"] # 0x2031 (en: 'per ten thousand') + - "â€Č": [T: "prima"] # 0x2032 (en: 'prime') + - "‾": [T: "signo de intercalaciĂłn"] # 0x2038 (en: 'to the', google: 'hacia') + - "â€č": [T: "comillas izquierda"] # 0x2039 (en: 'single left pointing angle quote mark', MathPlayer: 'abre comillas', google: 'marque de cotizaciĂłn de ĂĄngulo de punta individual izquierdo') + - "â€ș": [T: "comillas derecha"] # 0x203a (en: 'single right pointing angle quote mark', MathPlayer: 'cierra comillas', google: 'marque de cita de ĂĄngulo de punta de la derecha Ășnica') + - "‌": [T: "doble signo de exclamaciĂłn"] # 0x203c (en: 'double factorial', google: 'doble factorial') + - "⁄": [T: "barra de fracciĂłn"] # 0x2044 (en: 'divided by') + - "⁅": [T: "corchete izquierdo"] # 0x2045 (en: 'left square bracket with quill') + - "⁆": [T: "corchete derecho"] # 0x2046 (en: 'right square bracket with quill') + - "⁗": [T: "cuatro prima"] # 0x2057 (en: 'quadruple prime', MathPlayer: 'cuarta', google: 'prime cuĂĄdruple') + - "⁠": [T: ""] # 0x2060 + - "⁣": [T: ""] # 0x2063 + - "⁀": [T: "mĂĄs"] # 0x2064 (en: 'and', google: 'y') + - "⁰": [T: "a la potencia de cero"] # 0x2070 (en: 'to the zeroth power', google translation) + - "ⁱ": [T: "superĂ­ndice i"] # 0x2071 (en: 'to the eihth power', google: 'al poder eihth') + - "⁎": [T: "a la cuarta potencia"] # 0x2074 (en: 'to the fourth power', google translation) + - "⁔": [T: "a la quinta potencia"] # 0x2075 (en: 'to the fifth power', google translation) + - "⁶": [T: "a la sexta potencia"] # 0x2076 (en: 'to the sixth power', google translation) + - "⁷": [T: "a la sĂ©ptima potencia"] # 0x2077 (en: 'to the seventh power', google translation) + - "⁞": [T: "a la octava potencia"] # 0x2078 (en: 'to the eighth power', google translation) + - "âč": [T: "a la novena potencia"] # 0x2079 (en: 'to the ninth power', google translation) + - "âș": [T: "superĂ­ndice signo mĂĄs"] # 0x207a (en: 'superscript plus sign', google: 'superscript plus sign') + - "⁻": [T: "superĂ­ndice menos"] # 0x207b (en: 'superscript minus', google: 'superscript menos') + - "⁌": [T: "superĂ­ndice signo igual"] # 0x207c (en: 'superscript equals sign', google: 'superscript es igual a signo') + - "⁜": [T: "parĂ©ntesis izquierdo superĂ­ndice"] # 0x207d (en: 'superscript left parenthesis', google: 'superscript dejĂł parĂ©ntesis') + - " ": [T: "parĂ©ntesis derecho superĂ­ndice"] # 0x207e (en: 'superscript right parenthesis', google: 'superscript direcciĂłn de entrega de parĂ©ntesis') + - "ⁿ": [T: "superĂ­ndice n"] # 0x207f (en: 'to the ennth power', google: 'al poder de enth') + - "₀": [T: "bajo cero"] # 0x2080 (en: 'sub zero', google translation) + - "₁": [T: "sub uno"] # 0x2081 (en: 'sub one', google translation) + - "₂": [T: "sub dos"] # 0x2082 (en: 'sub two', google translation) + - "₃": [T: "sub tres"] # 0x2083 (en: 'sub three', google translation) + - "₄": [T: "sub cuatro"] # 0x2084 (en: 'sub four', google translation) + - "₅": [T: "sub cinco"] # 0x2085 (en: 'sub five', google translation) + - "₆": [T: "sub seis"] # 0x2086 (en: 'sub six', google translation) + - "₇": [T: "sub siete"] # 0x2087 (en: 'sub seven', google translation) + - "₈": [T: "sub ocho"] # 0x2088 (en: 'sub eight', google translation) + - "₉": [T: "sub nueve"] # 0x2089 (en: 'sub nine', google translation) + - "₊": [T: "subĂ­ndice signo mĂĄs"] # 0x208a (en: 'subscript plus sign', google: 'subscript plus sign') + - "₋": [T: "subĂ­ndice menos"] # 0x208b (en: 'subscript minus sign', google: 'subĂ­ndico menos signo') + - "₌": [T: "subĂ­ndice signo igual"] # 0x208c (en: 'subscript equals sign', google: 'el subĂ­ndice es igual al signo') + - "₍": [T: "subĂ­ndice parĂ©ntesis derecho"] # 0x208e (en: 'subscript right parenthesis', google: 'subĂ­ndice de parĂ©ntesis derecha') + - "ₐ": [T: "subĂ­ndice a"] # 0x2090 (en: 'sub A', google: 'sub a') + - "ₑ": [T: "subĂ­ndice e"] # 0x2091 (en: 'sub E', google: 'sub e') + - "ₒ": [T: "subĂ­ndice o"] # 0x2092 (en: 'sub O', google: 'sub o') + - "ₓ": [T: "subĂ­ndice x"] # 0x2093 (en: 'sub X', google: 'sub x') + - "ₕ": [T: "subĂ­ndice h"] # 0x2095 (en: 'sub H', google: 'sub h') + - "ₖ": [T: "subĂ­ndice k"] # 0x2096 (en: 'sub K', google: 'sub k') + - "ₗ": [T: "subĂ­ndice l"] # 0x2097 (en: 'sub L', google: 'sub l') + - "ₘ": [T: "subĂ­ndice m"] # 0x2098 (en: 'sub M', google: 'sub m') + - "ₙ": [T: "subĂ­ndice n"] # 0x2099 (en: 'sub N', google: 'sub n') + - "ₚ": [T: "subĂ­ndice p"] # 0x209a (en: 'sub P', google: 'sub p') + - "ₛ": [T: "subĂ­ndice s"] # 0x209b (en: 'sub S', google: 'sub s') + - "ₜ": [T: "subĂ­ndice t"] # 0x209c (en: 'sub T', google: 'sub t') + - "₠": [T: "unidades de corriente europeas"] # 0x20a0 (en: 'european currenty units', google translation) + - "₡": [T: "dos puntos"] # 0x20a1 (en: 'colons', google: 'colons') + - "₱": [T: "cruzeiro"] # 0x20a2 (en: 'cruzeiro', google: 'cruzeiro') + - "₣": [T: "franco"] # 0x20a3 (en: 'franc') + - "â‚€": [T: "lira"] # 0x20a4 + - "â‚„": [T: "molinos"] # 0x20a5 (en: 'mills') + - "₩": [T: "naira"] # 0x20a6 + - "₧": [T: "peseta"] # 0x20a7 + - "₹": [T: "rupia"] # 0x20a8 (en: 'rupees', google: 'rupias') + - "₩": [T: "won"] # 0x20a9 (google: 'ganado') + - "â‚Ș": [T: "nuevo sheqel"] # 0x20aa (en: 'new sheqels', google: 'nuevo sheqels') + - "₫": [T: "dong"] # 0x20ab (google: 'polla') + - "€": [T: "euro"] # 0x20ac (en: 'euros', google: 'euros') + - "₭": [T: "kip"] # 0x20ad (google: 'dormir') + - "₼": [T: "tugrik"] # 0x20ae + - "₯": [T: "dracma"] # 0x20af (en: 'drachma') + - "₰": [T: "penique alemĂĄn"] # 0x20b0 (en: 'german pennies', google: 'centavos alemanes') + - "₱": [T: "peso"] # 0x20b1 (en: 'pesos', google: 'pesos') + - "â‚Č": [T: "guaranĂ­es"] # 0x20b2 (en: 'guaranis', google translation) + - "₳": [T: "australs"] # 0x20b3 (google translation) + - "₮": [T: "hryvnias"] # 0x20b4 (google translation) + - "â‚”": [T: "cedis"] # 0x20b5 (google translation) + - "₶": [T: "livre tournois"] # 0x20b6 (google translation) + - "₷": [T: "spesmilos"] # 0x20b7 (google translation) + - "₾": [T: "tenges"] # 0x20b8 (google translation) + - "â‚č": [T: "rupias indias"] # 0x20b9 (en: 'indian rupees', google translation) + - "â‚ș": [T: "liras turcas"] # 0x20ba (en: 'turkish liras', google translation) + - "⃐": [T: "arpĂłn izquierdo por encima de la ornamentaciĂłn"] # 0x20d0 (en: 'left harpoon above embellishment', google: 'arpĂłn de izquierda por encima del adorno') + - "⃑": [T: "arpĂłn derecho por encima de la ornamentaciĂłn"] # 0x20d1 (en: 'right harpoon above embellishment', google: 'arpĂłn derecho por encima del adorno') + - "⃒": [T: "lĂ­nea vertical larga con ornamentaciĂłn superpuesta"] # 0x20d2 (en: 'long vertical line overlay embellishment', google translation) + - "⃓": [T: "lĂ­nea vertical corta con ornamentaciĂłn superpuesta"] # 0x20d3 (en: 'short vertical line overlay embellishment', google translation) + - "⃔": [T: "flecha en sentido contrario a las agujas del reloj por encima de la ornamentaciĂłn"] # 0x20d4 (en: 'anticlockwise arrow above embellishment', google translation) + - "⃕": [T: "flecha en el sentido de las agujas del reloj por encima de la ornamentaciĂłn"] # 0x20d5 (en: 'clockwise arrow above embellishment', google translation) + - "⃖": [T: "flecha izquierda por encima de la ornamentaciĂłn"] # 0x20d6 (en: 'left arrow above embellishment', google: 'flecha izquierda por encima del adorno') + - "⃗": [T: "flecha derecha por encima de la ornamentaciĂłn"] # 0x20d7 (en: 'right arrow above embellishment', google: 'flecha derecha por encima del adorno') + - "⃘": [T: "ornamentaciĂłn superpuesta al anillo"] # 0x20d8 (en: 'ring overlay embellishment', google translation) + - "⃙": [T: "anillo en el sentido de las agujas del reloj con ornamentaciĂłn superpuesta"] # 0x20d9 (en: 'clockwise ring overlay embellishment', google translation) + - "⃚": [T: "anilo en sentido contrario a las agujas del reloj con ornamentaciĂłn superpuesta"] # 0x20da (en: 'anticlockwise ring overlay embellishment', google translation) + - "⃛": [T: "tres puntos"] # 0x20db (en: 'triple dot', google: 'triple punto') + - "⃜": [T: "cuatro puntos "] # 0x20dc (en: 'quadruple dot', google: 'punto cuĂĄdruple') + - "⃝": [T: "ornamentaciĂłn de cĂ­rculo envolvente"] # 0x20dd (en: 'enclosing circle embellishment', google translation) + - "⃞": [T: "ornamentaciĂłn de cuadrado envolvente"] # 0x20de (en: 'enclosing square embellishment', google translation) + - "⃟": [T: "ornamentaciĂłn de rombo envolvente"] # 0x20df (en: 'enclosing diamond embellishment', google translation) + - "⃠": [T: "ornamentaciĂłn con bara inversa de cĂ­rculo envolvente"] # 0x20e0 (en: 'enclosing circle backslash embellishment', google translation) + - "⃥": [T: "doble flecha por encima de la ornamentaciĂłn"] # 0x20e1 (en: 'left right arrow above embellishment', google: 'flecha derecha izquierda por encima del adorno') + - "⃹": [T: "ornamentaciĂłn de pantalla envolvente"] # 0x20e2 (en: 'enclosing screen embellishment', google translation) + - "⃣": [T: "ornamentaciĂłn de clave envolvente"] # 0x20e3 (en: 'enclosing keycap embellishment', google translation) + - "⃀": [T: "ornamentaciĂłn de triĂĄngulo envolvente apuntando hacia arriba"] # 0x20e4 (en: 'enclosing upward pointing triangle embellishment', google translation) + - "⃄": [T: "solidus invertido con ornamentaciĂłn superpuesta"] # 0x20e5 (en: 'reverse solidus overlay embellishment', google translation) + - "⃊": [T: "doble vĂ©rtice con ornamentaciĂłn de trazo"] # 0x20e6 (en: 'double verticle stroke embellishment', google translation) + - "⃧": [T: "sĂ­mbolo de anualidad con ornamentaciĂłn"] # 0x20e7 (en: 'annuity symbol embellishment', google translation) + - "⃚": [T: "triple punto bajo"] # 0x20e8 (en: 'triple underdot', google translation) + - "⃩": [T: "amplio puente por encima de la ornamentaciĂłn"] # 0x20e9 (en: 'wide bridge above embellishment', google translation) + - "âƒȘ": [T: "flecha izquierda con ornamentaciĂłn superpuesta"] # 0x20ea (en: 'leftwards arrow overlay embellishment', google translation) + - "⃫": [T: "largo y doble solidus con ornamentaciĂłn superpuesta"] # 0x20eb (en: 'long double solidus overlay embellishment', google translation) + - "⃏": [T: "arpĂłn hacia la derecha con ornamentaciĂłn apuntando hacia abajo"] # 0x20ec (en: 'rightwards harpoon with barb downwards embellishment', google translation) + - "⃭": [T: "arpĂłn hacia la izquierda con ornamentaciĂłn apuntando hacia abajo"] # 0x20ed (en: 'leftwards harpoon with barb downwards embellishment', google translation) + - "⃟": [T: "flecha izquierda por debajo de la ornamentaciĂłn"] # 0x20ee (en: 'left arrow below embellishment', google translation) + - "⃯": [T: "flecha derecha por debajo de la ornamentaciĂłn"] # 0x20ef (en: 'right arrow below embellishment', google translation) + - "⃰": [T: "asterisco por encima de la ornamentaciĂłn"] # 0x20f0 (en: 'asterisk above embellishment', google translation) + - "℄": [T: "sĂ­mbolo de lĂ­nea central"] # 0x2104 (en: 'center line symbol', google translation) + - "℅": [T: "para"] # 0x2105 (en: 'care of', google: 'cuidado de') + - "℆": [T: "cada una"] # 0x2106 (google: 'cadada una') + - "ℇ": [T: "constante de euler"] # 0x2107 (en: 'euler's constant', google: 'la constante de euler') + - "℈": [T: "escrĂșpulo"] # 0x2108 (en: 'scruples', google translation) + - "ℊ": [T: "g cursiva"] # 0x210a (en: 'script g', google: 'guiĂłn g') + - "ℌℑℹℭ": # 0x210c, 0x2111, 0x2128, 0x212d + - T: "g cursiva" # (en: 'fraktur', google: 'fraktur') + - spell: "translate('.', 'ℌℑℹℭ', 'HIZC')" + + - "â„â„™â„Ÿâ„ż": # 0x210d, 0x2119, 0x213e, 0x213f + - test: + if: "$Verbosity!='Terse'" + then: [T: "doble tachadura"] # (en: 'double struck', google translation) + - spell: "translate('.', 'â„â„™â„Ÿâ„ż', 'HPΓΠ')" + + - "ℏ": # 0x210f + - test: + if: "($Verbosity='Terse')" + then: [T: "h bar"] # (google translation) + else: [T: "h barra"] # (en: 'reduced planck constant') + + - "â„â„’â„˜â„Źâ„°â„±â„ł": # 0x2110, 0x2112, 0x2118, 0x2130, 0x2131, 0x2133 + - T: "h barra" # (en: 'script') + - spell: "translate('.', 'â„â„’â„˜â„Źâ„°â„±â„ł', 'ILPBEFM')" + + - "℔": [T: "L B sĂ­mbolo de barra"] # 0x2114 (en: 'pounds', google: 'libras') + - "№": [T: "signo de nĂșmero"] # 0x2116 (en: 'number') + - "â„„": [T: "onza"] # 0x2125 (en: 'ounces') + - "℩": [T: "ohmio"] # 0x2126 (en: 'ohms') + - "℧": [T: "iota invertida"] # 0x2129 (en: 'turned iota', google: 'convertido en iota') + - "Å": [T: "angstrom"] # 0x212b (en: 'angstroms') + - "ℯ": [T: "e cursiva"] # 0x212f (en: 'script e', google: 'guiĂłn e') + + # coalesced some chars that use cap letters + - "â„Čâ„ș⅁⅂⅃⅄": # 0x2132, 0x213a, 0x2141, 0x2142, 0x2143, 0x2144 + - test: + - if: "'.' = 'â„ș'" + then: [T: "rotado"] # (en: 'rotated', google translation) + - else_if: "'.' = 'â„Č'" + then: [T: "transformado"] # (en: 'turned', google translation) + - else_if: "'.' = '⅃'" + then: [T: "invertido sans-serif"] # (en: 'reversed sans-serif', google translation) + else: [T: "e cursiva"] # (en: 'turned sans-serif', google: 'convertido en sans-serif') + - spell: "translate('.', 'â„Čâ„ș⅁⅂⅃⅄', 'FQGLLY')" + + - "℮": [T: "o cursiva"] # 0x2134 (en: 'script o', google: 'guiĂłn o') + - "â„”": [T: "alef"] # 0x2135 (en: 'first transfinite cardinal') + - "ℶ": [T: "bet"] # 0x2136 (en: 'second transfinite cardinal') + - "ℷ": [T: "guĂ­mel"] # 0x2137 (en: 'third transfinite cardinal') + - "ℾ": [T: "dĂĄlet"] # 0x2138 (en: 'fourth transfinite cardinal') + - "ℌ": [T: "pi en negrita de pizarra"] # 0x213c (en: 'double struck pi', google: 'double golpeado pi') + - "ℜ": [T: "gamma en negrita de pizarra"] # 0x213d (en: 'double struck gamma', google: 'double golpeĂł a gamma') + - "⅀": [T: "suma de n-ary en negrita"] # 0x2140 (en: 'double struck n-ary summation', google: 'suma de doble apolĂłn n-ary') + - "⅋": [T: "ampersand invertido"] # 0x214b (en: 'turned ampersand', google: 'convertido en ampersand') + - "⅌": [T: "por"] # 0x214c (en: 'per', google: 'por') + - "ⅎ": [T: "f invertida"] # 0x214e (en: 'turned F', google: 'girado f') + - "⅐": [T: "un sĂ©ptimo"] # 0x2150 (en: 'one seventh', google: 'un septimo') + - "⅑": [T: "un noveno"] # 0x2151 (en: 'one ninth', google: 'un noveno') + - "⅒": [T: "un dadoĂ©cimo"] # 0x2152 (en: 'one tenth', google: 'una dĂ©cima parte') + - "⅓": [T: "un tercio"] # 0x2153 (en: 'one third', SRE: 'Vulgar FracciĂłn Un Tercero') + - "⅔": [T: "dos tercios"] # 0x2154 (en: 'two thirds', SRE: 'FracciĂłn vulgar dos tercios') + - "⅕": [T: "un quinto"] # 0x2155 (en: 'one fifth', SRE: 'Vulgar Fraction One Fifth') + - "⅖": [T: " franciĂłn comĂșndos quintos"] # 0x2156 (en: 'two fifths', MathPlayer: 'dos quintos', google: 'dos quintas partes') + - "⅗": [T: " fracciĂłn comĂșn tres quintos"] # 0x2157 (en: 'three fifths', SRE: 'FracciĂłn vulgar tres quintos') + - "⅘": [T: " fracciĂłn comĂșn cuatro quintos"] # 0x2158 (en: 'four fifths', SRE: 'FracciĂłn vulgar cuatro quintos') + - "⅙": [T: "un sexto"] # 0x2159 (en: 'one sixth', SRE: 'Vulgar FracciĂłn Un Sexto') + - "⅚": [T: "cinco sextos"] # 0x215a (en: 'five sixths', SRE: 'Vulgar fracciĂłn cinco sextos') + - "⅛": [T: "fracciĂłn comĂșn un octavo"] # 0x215b (en: 'one eighth', MathPlayer: 'un octavo', google: 'un ath') + - "⅜": [T: "fracciĂłn comĂșn tres octavos"] # 0x215c (en: 'three eighths', MathPlayer: 'tres octavos', google: 'tres ats') + - "⅝": [T: "fracciĂłn comĂșn cinco octavos"] # 0x215d (en: 'five eighths', MathPlayer: 'cinco octavos', google: 'cinco ats') + - "⅞": [T: "fracciĂłn comĂșn siete octavos"] # 0x215e (en: 'seven eighths', MathPlayer: 'siete octavos', google: 'siete ats') + - "⅟": [T: "Numerador de fracciĂłn uno"] # 0x215f (en: 'one over', google: 'uno sobre') + - "Ⅰ": [T: "Ⅰ"] # 0x2160 (en: 'I', google translation) + - "Ⅱ": [T: "T"] # 0x2161 (en: 'I I', google translation) + - "ⅱ": [T: "III"] # 0x2162 (en: 'I I I', google translation) + - "Ⅳ": [T: "IV"] # 0x2163 (en: 'I V', google translation) + - "â…€": [T: "V"] # 0x2164 (en: 'V', google translation) + - "â…„": [T: "VI"] # 0x2165 (en: 'V I', google translation) + - "Ⅹ": [T: "VII"] # 0x2166 (en: 'V I I', google translation) + - "Ⅷ": [T: "VIII"] # 0x2167 (en: 'V I I I', google translation) + - "ⅹ": [T: "IX"] # 0x2168 (en: 'I X', google translation) + - "Ⅹ": [T: "XI"] # 0x216a (en: 'X I', google translation) + - "Ⅻ": [T: "XII"] # 0x216b (en: 'X I I', google translation) + - "Ⅼ": [T: "Ⅼ"] # 0x216c (en: 'L', google translation) + - "Ⅽ": [T: "Ⅽ"] # 0x216d (en: 'C', google translation) + - "ⅼ": [T: "ⅼ"] # 0x216e (en: 'D', google translation) + - "Ⅿ": [T: "Ⅿ"] # 0x216f (en: 'M', google translation) + - "ⅰ": [T: "ⅰ"] # 0x2170 (en: 'I', google translation) + - "ⅱ": [T: "I"] # 0x2171 (en: 'I I', google translation) + - "â…Č": [T: "III"] # 0x2172 (en: 'I I I', google translation) + - "ⅳ": [T: "IV"] # 0x2173 (en: 'I V', google translation) + - "Ⅾ": [T: "Ⅾ"] # 0x2174 (en: 'V', google translation) + - "â…”": [T: "VI"] # 0x2175 (en: 'V I', google translation) + - "ⅶ": [T: "VII"] # 0x2176 (en: 'V I I', google translation) + - "ⅷ": [T: "VIII"] # 0x2177 (en: 'V I I I', google translation) + - "ⅾ": [T: "IX"] # 0x2178 (en: 'I X', google translation) + - "â…č": [T: "â…č"] # 0x2179 (en: 'X', google translation) + - "â…ș": [T: "XI"] # 0x217a (en: 'X I', google translation) + - "ⅻ": [T: "XII"] # 0x217b (en: 'X I I', google translation) + - "â…Œ": [T: "â…Œ"] # 0x217c (en: 'L', google translation) + - "â…œ": [T: "â…œ"] # 0x217d (en: 'C', google translation) + - "â…Ÿ": [T: "â…Ÿ"] # 0x217e (en: 'D', google translation) + - "ⅿ": [T: "ⅿ"] # 0x217f (en: 'M', google translation) + - "↉": [T: "fracciĂłn comĂșn cero tercios"] # 0x2189 (en: 'zero thirds', google: 'cero tercios') + - "↔": [T: "flecha hacia izquierda y derecha"] # 0x2194 (en: 'left right arrow') + - "↕": [T: "flecha hacia arriba y abajo"] # 0x2195 (en: 'up down arrow') + - "↖": [T: "flecha hacia el noroeste"] # 0x2196 (en: 'north west arrow') + - "↗": # 0x2197 + - test: + if: "ancestor::*[2][self::m:limit]" + then: [T: "enfoque desde abajo"] # (en: 'approaches from below', google translation) + else: [T: "flecha hacia el nordeste"] # (en: 'north east arrow') + + - "↘": # 0x2198 + - test: + if: "ancestor::*[2][self::m:limit]" + then: [T: "enfoque desde arriba"] # (en: 'approaches from above', google translation) + else: [T: "flecha hacia el sudeste"] # (en: 'south east arrow') + + - "↙": [T: "flecha hacia el sudoeste"] # 0x2199 (en: 'south west arrow') + - "↚": [T: "flecha con trazo hacia la izquierda"] # 0x219a (en: 'leftwards arrow with stroke') + - "↛": [T: "flecha con trazo hacia la derecha"] # 0x219b (en: 'rightwards arrow with stroke') + - "↜": [T: "flecha izquierda ondulada"] # 0x219c (en: 'leftwards wave arrow') + - "↝": [T: "flecha derecha ondulada"] # 0x219d (en: 'rightwards wave arrow') + - "↞": [T: "flecha hacia la izquierda con doble punta"] # 0x219e (en: 'leftwards two headed arrow') + - "↟": [T: "flecha hacia arriba con doble punta"] # 0x219f (en: 'upwards two headed arrow') + - "↠": [T: "flecha hacia la derecha con doble punta"] # 0x21a0 (en: 'rightwards two headed arrow') + - "↡": [T: "flecha hacia abajo con doble punta"] # 0x21a1 (en: 'downwards two headed arrow') + - "↱": [T: "flecha hacia la izquierda con cola"] # 0x21a2 (en: 'leftwards arrow with tail') + - "↣": [T: "flecha hacia la derecha con cola"] # 0x21a3 (en: 'rightwards arrow with tail') + - "ↀ": [T: "flecha hacia la izquierda con barra"] # 0x21a4 (en: 'leftwards arrow from bar') + - "ↄ": [T: "flecha hacia arriba con barra"] # 0x21a5 (en: 'upwards arrow from bar') + - "↩": [T: "flecha derecha hacia arriba con barra"] # 0x21a6 (en: 'rightwards arrow from bar') + - "↧": [T: "flecha hacia abajo con barra"] # 0x21a7 (en: 'downwards arrow from bar') + - "↹": [T: "flecha hacia arriba y hacia abajo con base"] # 0x21a8 (en: 'up down arrow with base') + - "↩": [T: "flecha hacia la izquierda con gancho"] # 0x21a9 (en: 'leftwards arrow with hook') + - "â†Ș": [T: "fflecha hacia la derecha con gancho"] # 0x21aa (en: 'rightwards arrow with hook') + - "↫": [T: "flecha hacia la izquierda con bucle"] # 0x21ab (en: 'leftwards arrow with loop') + - "↬": [T: "flecha hacia la derecha con bucle"] # 0x21ac (en: 'rightwards arrow with loop') + - "↭": [T: "flecha ondulada hacia la izquierda y la derecha"] # 0x21ad (en: 'left right wave arrow') + - "↼": [T: "flecha hacia la izquierda y derecha con trazo"] # 0x21ae (en: 'left right arrow with stroke') + - "↯": [T: "flecha hacia abajo en zigzag"] # 0x21af (en: 'downwards zigzag arrow') + - "↰": [T: "flecha hacia arriba con punta hacia la izquierda"] # 0x21b0 (en: 'upwards arrow with tip leftwards') + - "↱": [T: "flecha hacia arriba con punta hacia la derecha"] # 0x21b1 (en: 'upwards arrow with tip rightwards') + - "â†Č": [T: "flecha hacia abajo con punta hacia la izquierda"] # 0x21b2 (en: 'downwards arrow with tip leftwards') + - "↳": [T: "flecha hacia abajo con punta hacia la derecha"] # 0x21b3 (en: 'downwards arrow with tip rightwards') + - "↮": [T: "flecha hacia la derecha con intersecciĂłn hacia abajo"] # 0x21b4 (en: 'rightwards arrow with corner downwards') + - "↔": [T: "flecha hacia abajo con intersecciĂłn hacia la izquierda"] # 0x21b5 (en: 'downwards arrow with corner leftwards') + - "↶": [T: "flecha semicircular superior en sentido contrario a las agujas del reloj"] # 0x21b6 (en: 'anticlockwise top semicircle arrow') + - "↷": [T: "flecha semicircular superior en sentido de las agujas del reloj"] # 0x21b7 (en: 'clockwise top semicircle arrow') + - "↾": [T: "flecha noroeste hacia barra larga"] # 0x21b8 (en: 'north west arrow to long bar') + - "â†č": [T: "flecha izquierda hacia barra por encima de flecha derecha hacia barra"] # 0x21b9 (en: 'leftwards arrow to bar over rightwards arrow to bar') + - "â†ș": [T: "flecha circular abierta en sentido contrario a las agujas del reloj"] # 0x21ba (en: 'anticlockwise open circle arrow') + - "↻": [T: "flecha circular abierta en sentido de las agujas del reloj"] # 0x21bb (en: 'clockwise open circle arrow') + - "↌": [T: "flecha izquierda con arpĂłn en la parte superior"] # 0x21bc (en: 'left harpoon up') + - "↜": [T: "flecha izquierda con arpĂłn en la parte inferior"] # 0x21bd (en: 'left harpoon down') + - "↟": [T: "arpĂłn derecho hacia arriba"] # 0x21be (en: 'up harpoon right') + - "↿": [T: "arpĂłn izquierdo hacia arriba"] # 0x21bf (en: 'up harpoon left') + - "⇀": [T: "arpĂłn derecho hacia arriba"] # 0x21c0 (en: 'right harpoon up') + - "⇁": [T: "arpĂłn derecho hacia abajo"] # 0x21c1 (en: 'right harpoon down') + - "⇂": [T: "arpĂłn derecho hacia abajo"] # 0x21c2 (en: 'down harpoon right') + - "⇃": [T: "arpĂłn izquierdo hacia abajo"] # 0x21c3 (en: 'down harpoon left') + - "⇄": [T: "flecha hacia la derecha por encima de flecha hacia la izquierda"] # 0x21c4 (en: 'rightwards arrow over leftwards arrow') + - "⇅": [T: "flecha hacia arriba a la izquierda de flecha hacia abajo"] # 0x21c5 (en: 'upwards arrow leftwards of downwards arrow') + - "⇆": [T: "flecha hacia la izquierda por encima de flecha hacia la derecha"] # 0x21c6 (en: 'leftwards arrow over rightwards arrow') + - "⇇": [T: "dos flechas hacia la izquierda"] # 0x21c7 (en: 'leftwards paired arrows') + - "⇈": [T: "dos flechas hacia arriba"] # 0x21c8 (en: 'upwards paired arrows') + - "⇉": [T: "dos flechas hacia la derecha"] # 0x21c9 (en: 'rightwards paired arrows') + - "⇊": [T: "dos flechas hacia abajo"] # 0x21ca (en: 'downwards paired arrows') + - "⇋": [T: "arpĂłn izquierdo por encima de arpĂłn derecho"] # 0x21cb (en: 'left harpoon over right harpoon') + - "⇌": [T: "arpĂłn derecho por encima de arpĂłn izquierdo"] # 0x21cc (en: 'right harpoon over left harpoon') + - "⇍": [T: "flecha doble izquierda con trazo"] # 0x21cd (en: 'leftwards double arrow with stroke') + - "⇎": [T: "flecha doble izquierda y derecha con trazo"] # 0x21ce (en: 'left right double arrow with stroke') + - "⇏": [T: "flecha doble hacia la derecha con trazo"] # 0x21cf (en: 'rightwards double arrow with stroke') + - "⇐": [T: "flecha doble hacia la izquierda"] # 0x21d0 (en: 'leftwards double arrow') + - "⇑": [T: "flecha doble hacia arriba"] # 0x21d1 (en: 'upwards double arrow') + - "⇓": [T: "flecha doble hacia abajo"] # 0x21d3 (en: 'downwards double arrow') + - "⇔": [T: "flecha doble vertical"] # 0x21d5 (en: 'up down double arrow') + - "⇖": [T: "flecha doble hacia noroeste"] # 0x21d6 (en: 'north west double arrow') + - "⇗": [T: "flecha doble hacia nordeste"] # 0x21d7 (en: 'north east double arrow') + - "⇘": [T: "flecha doble hacia sudeste"] # 0x21d8 (en: 'south east double arrow') + - "⇙": [T: "flecha doble hacia sudoeste"] # 0x21d9 (en: 'south west double arrow') + - "⇚": [T: "flecha triple hacia la izquierda"] # 0x21da (en: 'leftwards triple arrow') + - "⇛": [T: "flecha triple hacia la derecha"] # 0x21db (en: 'rightwards triple arrow') + - "⇜": [T: "flecha ondulada izquierda"] # 0x21dc (en: 'leftwards squiggle arrow') + - "⇝": [T: "flecha ondulada hacia la derecha"] # 0x21dd (en: 'rightwards squiggle arrow') + - "⇞": [T: "flecha hacia arriba con doble trazo"] # 0x21de (en: 'upwards arrow with double stroke') + - "⇟": [T: "flecha hacia abajo con doble trazo"] # 0x21df (en: 'downwards arrow with double stroke') + - "⇠": [T: "flecha de puntos hacia la izquierda"] # 0x21e0 (en: 'leftwards dashed arrow') + - "⇡": [T: "flecha de puntos hacia arriba"] # 0x21e1 (en: 'upwards dashed arrow') + - "⇱": [T: "flecha de puntos hacia la derecha"] # 0x21e2 (en: 'rightwards dashed arrow') + - "⇣": [T: "flecha de puntos hacia abajo"] # 0x21e3 (en: 'downwards dashed arrow') + - "⇀": [T: "flecha hacia la izquierda con barra"] # 0x21e4 (en: 'leftwards arrow to bar') + - "⇄": [T: "flecha hacia la derecha con barra"] # 0x21e5 (en: 'rightwards arrow to bar') + - "⇩": [T: "flecha blanca hacia la izquierda"] # 0x21e6 (en: 'leftwards white arrow') + - "⇧": [T: "flecha blanca hacia arriba"] # 0x21e7 (en: 'upwards white arrow') + - "⇹": [T: "flecha blanca hacia la derecha"] # 0x21e8 (en: 'rightwards white arrow') + - "⇩": [T: "flecha blanca hacia abajo"] # 0x21e9 (en: 'downwards white arrow') + - "â‡Ș": [T: "flecha blanca hacia arriba partiendo de barra"] # 0x21ea (en: 'upwards white arrow from bar') + - "⇫": [T: "flecha blanca hacia arriba sobre un pedestal con barra horizontal"] # 0x21eb + - "⇬": [T: "flecha blanca hacia arriba sobre pedestal con barra horizontal"] # 0x21ec (en: 'upwards white arrow on pedestal with horizontal bar', google: 'arrow blanca hacia arriba en el pedestal con barra horizontal') + - "⇭": [T: "flecha blanca hacia arriba sobre un pedestal con barra vertical"] # 0x21ed (en: 'upwards white arrow on pedestal with vertical bar', google: 'arrow blanca hacia arriba en el pedestal con barra vertical') + - "⇼": [T: "flecha doble blanca hacia arriba"] # 0x21ee (en: 'upwards white double arrow', google: 'hacia arriba flecha doble blanca') + - "⇯": [T: "flecha doble blanca hacia arriba sobre un pedestal"] # 0x21ef (en: 'upwards white double arrow on pedestal', google: 'arrow doble blanca hacia arriba en el pedestal') + - "⇰": [T: "flecha blanca hacia la derecha partiendo de un muro"] # 0x21f0 (en: 'rightwards white arrow from wall', google: 'arrow blanca hacia la derecha desde la pared') + - "⇱": [T: "flecha noroeste hacia la intersecciĂłn"] # 0x21f1 (en: 'north west arrow to corner', google: 'north west arrow a la esquina') + - "â‡Č": [T: "flecha sudeste hacia la intersecciĂłn"] # 0x21f2 (en: 'south east arrow to corner', google: 'south east arrow a la esquina') + - "⇳": [T: "flecha blanca vertical"] # 0x21f3 (en: 'up down white arrow', google: 'arrow white arrow') + - "⇮": [T: "flecha derecha con cĂ­rculo pequeño"] # 0x21f4 (en: 'right arrow with small circle') + - "⇔": [T: "flecha superior hacia la derecha de flecha inferior"] # 0x21f5 (en: 'downwards arrow leftwards of upwards arrow') + - "⇶": [T: "tres flechashacia la derecha"] # 0x21f6 + - ⇷": [T: "flecha hacia la izquierda con trazo vertical"] # 0x21f7 (en: 'leftwards arrow with vertical stroke') + - "⇾": [T: "flecha hacia la derecha con trazo vertical"] # 0x21f8 (en: 'rightwards arrow with vertical stroke') + - "â‡č": [T: "flecha izquierda derecha con trazo vertical"] # 0x21f9 (en: 'left right arrow with vertical stroke', google: 'flecha derecha izquierda con carrera vertical') + - "â‡ș": [T: "flecha hacia la izquierda con doble trazo vertical"] # 0x21fa (en: 'leftwards arrow with double vertical stroke', google: 'flecha hacia la izquierda con trazo vertical doble') + - "⇻": [T: "flecha hacia la derecha con doble trazo vertical"] # 0x21fb (en: 'rightwards arrow with double vertical stroke', google: 'flecha hacia la derecha con trazo vertical doble') + - "⇌": [T: "flecha izquierda derecha con doble trazo vertical"] # 0x21fc (en: 'left right arrow with double vertical stroke', google: 'flecha derecha izquierda con doble carrera vertical') + - "⇜": [T: "flecha hacia la izquierda con punta abierta"] # 0x21fd (en: 'leftwards open headed arrow') + - "⇟": [T: "flecha hacia la derecha con punta abierta"] # 0x21fe (en: 'rightwards open headed arrow') + - "⇿": [T: "flecha izquierda derecha con punta abierta"] # 0x21ff (en: 'left right open headed arrow') + - "∀": [T: "para todo"] # 0x2200 (en: 'for all') + - "∁": # 0x2201 + - test: + if: "$Verbosity!='Terse'" + then: [T: "el"] # (en: 'the', google translation) + - T: "complemento de" # (en: 'complement of') + - "∃": [T: "existe"] # 0x2203 (en: 'there exists') + - "∄": [T: "no existe"] # 0x2204 (en: 'there does not exist') + - "∅": [T: "conjunto vacĂ­o"] # 0x2205 (en: 'empty set') + - "∇": # 0x2207 + - test: + if: "$Verbosity!='Terse'" + then: [T: "el"] # (en: 'the', google translation) + - T: "gradiente" # (en: 'gradient of', google: 'gradiente de') + - "∋": [T: "comprende "] # 0x220b (en: 'contains the member') + - "∌": [T: "no comprende"] # 0x220c (en: 'does not contain the member') + - "∍": [T: "comprende "] # 0x220d (en: 'contains the member') + - "∎": [T: "fin de demostraciĂłn"] # 0x220e (en: 'end of proof') + - "∏": [T: "producto"] # 0x220f (en: 'product') + - "∐": [T: "coproducto"] # 0x2210 (en: 'coproduct') + - "∑": [T: "suma"] # 0x2211 (en: 'sum', SRE: 'sumatorio') + - "−": [T: "menos"] # 0x2212 (en: 'minus') + - "∓": [T: "menos mĂĄs"] # 0x2213 (en: 'minus or plus') + - "∔": [T: "punto mĂĄs"] # 0x2214 (en: 'dot plus') + - "∕": [T: "dividido por"] # 0x2215 (en: 'divided by') + - "∖": [T: "menos"] # 0x2216 (en: 'set minus') + - "∗": [T: "asterisco"] # 0x2217 (en: 'times') + - "∙": # 0x2219 + - test: + if: "@data-chem-formula-op" + then: [T: "punto"] # (en: 'dot', google translation) + else: [T: "bala"] # (en: 'times') + + - "∛": # 0x221b + - test: + if: "$Verbosity!='Terse'" + then: [T: "raĂ­z cĂșbica de"] # (en: 'cube root of') + - "∜": # 0x221c + - test: + if: "$Verbosity!='Terse'" + then: [T: "el"] # (en: 'the', google translation) + - T: "raĂ­z cuarta de" # (en: 'fourth root of') + - "∞": [T: "infinito"] # 0x221e (en: 'infinity') + - "∟": [T: "ĂĄngulo recto"] # 0x221f (en: 'right angle') + - "∠": [T: "ĂĄngulo"] # 0x2220 (en: 'angle') + - "∥": [T: "ĂĄngulo medido"] # 0x2221 (en: 'measured angle') + - "∹": [T: "ĂĄngulo esfĂ©rico"] # 0x2222 (en: 'spherical angle') + - "∧": [T: "y"] # 0x2227 (en: 'and') + - "√": [T: "o"] # 0x2228 (en: 'or') + - "∩": [T: "intersecciĂłn"] # 0x2229 (en: 'intersection') + - "âˆȘ": [T: "uniĂłn"] # 0x222a (en: 'union') + - "∫": [T: "integral"] # 0x222b + - "∏": [T: "integral doble"] # 0x222c (en: 'double integral') + - "∭": [T: "integral triple"] # 0x222d (en: 'triple integral') + - "∟": [T: "integral de contorno"] # 0x222e (en: 'contour integral') + - "∯": [T: "integral de superficie"] # 0x222f (en: 'surface integral') + - "∰": [T: "integral de volumen"] # 0x2230 (en: 'volume integral') + - "∱": [T: "integral de contorno en sentido de las agujas del reloj"] # 0x2231 (en: 'clockwise integral') + - "âˆČ": [T: "integral de contorno en sentido de las agujas del reloj"] # 0x2232 (en: 'clockwise contour integral') + - "∳": [T: "integral de contorno en sentido contrario a las agujas del reloj"] # 0x2233 (en: 'anticlockwise contour integral') + - "∎": [T: "por lo tanto"] # 0x2234 (en: 'therefore') + - "∔": [T: "porque"] # 0x2235 (en: 'because') + - "∞": [T: "punto menos"] # 0x2238 (en: 'dot minus') + - "âˆč": [T: "exceso"] # 0x2239 (en: 'has excess compared to') + - "âˆș": # 0x223a + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "geomĂ©tricamente proporcional a" # (en: 'geometrically proportional to') + - "∻": # 0x223b + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "homotĂ©tico a" # (en: 'homothetic to') + - "≀": [T: "producto de guirnalda"] # 0x2240 (en: 'wreath product') + - "≁": [T: "no tilde"] # 0x2241 (en: 'not tilde') + - "≂": [T: "menos tilde"] # 0x2242 (en: 'minus tilde') + - "≃": # 0x2243 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "asintĂłticamente igual a" # (en: 'asymptotically equal to') + - "≄": # 0x2244 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no asintĂłticamente igual a" # (en: 'not asymptotically equal to') + - "≅": # 0x2245 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "aproximadamente igual a" # (en: 'approximately equal to') + - "≆": # 0x2246 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "aproximado pero no igual a" # (en: 'approximately but not actually equal to') + - "≇": # 0x2247 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "ni proximadamente ni realmente igual a" # (en: 'neither approximately nor actually equal to') + - "≈": # 0x2248 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "casi igual a" # (en: 'almost equal to', SRE: 'aproximado') + - "≉": # 0x2249 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no es casi igual a" # (en: 'not almost equal to') + - "≊": # 0x224a + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "igual o casi igual a" # (en: 'almost equal or equal to') + - "≋": [T: "triple tilde"] # 0x224b + - "≌": [T: "todo igual a"] # 0x224c (en: 'are all equal to') + - "≍": # 0x224d + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "equivalente a" # (en: 'equivalent to') + - "≎": # 0x224e + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "geomĂ©tricamente equivalente a" # (en: 'geometrically equivalent to') + - "≏": # 0x224f + - test: + if: "$Verbosity!='Terse'" + then: [T: "la"] # (en: 'the', google translation) + - T: "diferencia entre" # (en: 'difference between') + - "≐": [T: "se acerca al lĂ­mite"] # 0x2250 (en: 'approaches the limit') + - "≑": # 0x2251 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "geomĂ©tricamente igual a" # (en: 'geometrically equal to') + - "≒": # 0x2252 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "aproximadamente igual a o imagen de" # (en: 'approximately equal to or the image of') + - "≓": # 0x2253 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es la"] # (en: 'is the', google translation) + - T: "imagen de o aproximadamente igual a" # (en: 'image of or approximately equal to') + - "≔": [T: "dos puntos igual"] # 0x2254 (en: 'colon equals') + - "≕": [T: "igual dos puntos"] # 0x2255 (en: 'equals colon') + - "≖": [T: "igual incluyendo anillo"] # 0x2256 (en: 'ring in equal to') + - "≗": # 0x2257 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "aproximadamente igual a" # (en: 'approximately equal to') + - "≘": [T: "corresponde a"] # 0x2258 (en: 'corresponds to') + - "≙": [T: "estimaciĂłn"] # 0x2259 (en: 'estimates') + - "≚": # 0x225a + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "equiĂĄngulo con" # (en: 'equiangular to') + - "≛": [T: "igual con estrella"] # 0x225b (en: 'star equals') + - "≜": [T: "delta igual a"] # 0x225c (en: 'delta equals') + - "≝": [T: "igual por definiciĂłn a"] # 0x225d (en: 'is defined to be') + - "≞": # 0x225e + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "medido por" # (en: 'measured by') + - "≟": [T: "igual con interrogante"] # 0x225f (en: 'has an unknown relationship with') + - "≱": # 0x2262 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no es idĂ©ntico a" # (en: 'not identical to') + - "≣": # 0x2263 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "estrictamente equivalente a" # (en: 'strictly equivalent to') + - "≹": # 0x2268 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "menor que pero no igual a" # (en: 'less than but not equal to') + - "≩": # 0x2269 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "mayor que pero no igual a" # (en: 'greater than but not equal to') + - "â‰Ș": # 0x226a + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "mucho menor que" # (en: 'much less than') + - "≫": # 0x226b + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "mucho mayor que" # (en: 'much greater than') + - "≬": # 0x226c + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "entre" # (en: 'between') + - "≭": # 0x226d + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no equivalente a" # (en: 'not equivalent to') + - "≼": # 0x226e + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no menor que" # (en: 'not less than') + - "≯": # 0x226f + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no mayor que" # (en: 'not greater than') + - "≰": # 0x2270 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no menor ni igual a" # (en: 'neither less than nor equal to') + - "≱": # 0x2271 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no mayor ni igual a" # (en: 'neither greater than nor equal to') + - "â‰Č": # 0x2272 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "menor o equivalente a" # (en: 'less than or equivalent to') + - "≳": # 0x2273 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "mayor o equivalente a" # (en: 'greater than or equivalent to') + - "≮": # 0x2274 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no menor ni equivalente a" # (en: 'neither less than nor equivalent to') + - "≔": # 0x2275 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no mayor ni equivalente a" # (en: 'neither greater than nor equivalent to') + - "≶": # 0x2276 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "menor o mayor que" # (en: 'less than or greater than') + - "≷": # 0x2277 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "mayor o menor que" # (en: 'greater than or less than') + - "≾": # 0x2278 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no menor ni mayor que" # (en: 'neither less than nor greater than') + - "â‰č": # 0x2279 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no mayor ni menor que" # (en: 'neither greater than nor less than') + - "â‰ș": [T: "precede a"] # 0x227a (en: 'precedes') + - "≻": [T: "sigue a"] # 0x227b (en: 'succeeds') + - "≌": [T: "precede o es igual a"] # 0x227c (en: 'precedes or is equal to') + - "≜": [T: "sigue o es igual a"] # 0x227d (en: 'succeeds or is equal to') + - "≟": [T: "precede o es equivalente a"] # 0x227e (en: 'precedes or is equivalent to') + - "≿": [T: "sigue o es equivalente a"] # 0x227f (en: 'succeeds or is equivalent to') + - "⊀": [T: "no precede a"] # 0x2280 (en: 'does not precede') + - "⊁": [T: "no sigue a"] # 0x2281 (en: 'does not succeed') + - "⊈": # 0x2288 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no incluido ni igual a" # (en: 'neither a subset of nor equal to') + - "⊉": # 0x2289 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no contiene ni es igual a" # (en: 'neither a superset of nor equal to') + - "⊊": [T: "incluido estrictamente en"] # 0x228a (en: 'subset of with not equal to') + - "⊋": [T: "contiene estrictamente a"] # 0x228b (en: 'superset of with not equal to') + - "⊌": [T: "multiconjunto"] # 0x228c (en: 'multiset') + - "⊍": [T: "multiplicaciĂłn de multiconjuntos"] # 0x228d (en: 'multiset multiplication') + - "⊎": [T: "uniĂłn de multiconjuntos"] # 0x228e (en: 'multiset union') + - "⊏": [T: "imagen cuadrada de"] # 0x228f (en: 'square image of') + - "⊐": [T: "original cuadrado de"] # 0x2290 (en: 'square original of') + - "⊑": [T: "imagen cuadrada de o igual a"] # 0x2291 (en: 'square image of or equal to') + - "⊒": [T: "original cuadrado de o igual a"] # 0x2292 (en: 'square original of or equal to') + - "⊓": [T: "intersecciĂłn cuadrada"] # 0x2293 (en: 'square cap') + - "⊔": [T: "uniĂłn cuadrada"] # 0x2294 (en: 'square cup') + - "⊕": [T: "signo mĂĄs en forma de cĂ­rculo"] # 0x2295 (en: 'circled plus') + - "⊖": [T: "signo menos en forma de cĂ­rculo"] # 0x2296 (en: 'circled minus') + - "⊗": [T: "signo por en forma de cĂ­rculo"] # 0x2297 (en: 'circled times') + - "⊘": [T: "barra en forma de cĂ­rculo"] # 0x2298 (en: 'circled slash') + - "⊙": [T: "punto en forma de cĂ­rculo"] # 0x2299 (en: 'circled dot operator') + - "⊚": [T: "anillo en cĂ­rculo"] # 0x229a (en: 'circled ring') + - "⊛": [T: "asterisco en cĂ­rculo"] # 0x229b (en: 'circled asterisk') + - "⊜": [T: "signo igual en cĂ­rculo"] # 0x229c (en: 'circled equals') + - "⊝": [T: "signo menos en cĂ­rculo"] # 0x229d (en: 'circled dash') + - "⊞": [T: "signo mĂĄs en forma de cuadrado"] # 0x229e (en: 'squared plus') + - "⊟": [T: "menos en forma de cuadrado"] # 0x229f (en: 'squared minus') + - "⊠": [T: "signo por en forma de cuadrado"] # 0x22a0 (en: 'squared times') + - "⊡": [T: "punto en forma de cuadrado"] # 0x22a1 (en: 'squared dot operator') + - "⊱": [T: "t horizontal hacia la izquierda"] # 0x22a2 (en: 'proves') + - "⊣": [T: "t horizontal hacia la derecha"] # 0x22a3 (en: 'does not yield') + - "⊀": [T: "perpendicular"] # 0x22a4 (en: 'top') + - "⊄": # 0x22a5 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "perpendicular invertida" # (en: 'bottom') + - "⊩": [T: "afirmaciĂłn"] # 0x22a6 (en: 'reduces to') + - "⊧": [T: "modela"] # 0x22a7 (en: 'models') + - "⊹": # 0x22a8 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "verdadero" # (en: 'true') + - "⊩": [T: "obliga"] # 0x22a9 (en: 'forces') + - "âŠȘ": [T: "triple barra vertical torniquete a la derecha"] # 0x22aa (en: 'triple vertical bar right turnstile') + - "⊫": [T: "doble barra vertical con doble torniquete a la derecha"] # 0x22ab (en: 'double vertical bar double right turnstile') + - "⊬": [T: "no demuestra"] # 0x22ac (en: 'does not prove') + - "⊭": # 0x22ad + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "falso" # (en: 'not true') + - "⊼": [T: "no obliga"] # 0x22ae (en: 'does not force') + - "⊯": [T: "doble barra vertical negada con doble torniquete a la derecha"] # 0x22af (en: 'negated double vertical bar double right turnstile') + - "⊰": [T: "precede con respecto a"] # 0x22b0 (en: 'precedes under relation') + - "⊱": [T: "sigue con respecto a"] # 0x22b1 (en: 'succeeds under relation') + - "âŠČ": # 0x22b2 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "subgrupo normal de" # (en: 'a normal subgroup of') + - "⊳": [T: "contiene como subgrupo normal a"] # 0x22b3 (en: 'contains as a normal subgroup') + - "⊮": # 0x22b4 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "subgrupo normal o es igual a" # (en: 'a normal subgroup of or equal to') + - "⊔": [T: "contiene como subgrupo normal o es igual a"] # 0x22b5 (en: 'contains as a normal subgroup or equal to') + - "⊶": # 0x22b6 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "el original de" # (en: 'the original of') + - "⊷": # 0x22b7 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "imagen de" # (en: 'an image of') + - "⊾": [T: "multifunciĂłn"] # 0x22b8 (en: 'multimap') + - "âŠč": [T: "matriz hermitiana conjugada"] # 0x22b9 (en: 'hermitian conjugate matrix') + - "âŠș": [T: "intercalada"] # 0x22ba (en: 'intercalate') + - "⊻": [T: "o excluyente"] # 0x22bb (en: 'xor') + - "⊌": [T: "no y"] # 0x22bc (en: 'nand') + - "⊜": [T: "no o"] # 0x22bd (en: 'nor') + - "⊟": [T: "ĂĄngulo recto con arco"] # 0x22be (en: 'right angle with arc') + - "⊿": [T: "triĂĄngulo rectĂĄngulo"] # 0x22bf (en: 'right triangle') + - "⋀": [T: "y"] # 0x22c0 (en: 'logical and') + - "⋁": [T: "o"] # 0x22c1 (en: 'logical or') + - "⋂": [T: "intersecciĂłn"] # 0x22c2 (en: 'intersection') + - "⋃": [T: "uniĂłn"] # 0x22c3 (en: 'union') + - "⋄": [T: "operador diamante"] # 0x22c4 (en: 'diamond operator') + - "⋅": # 0x22c5 + - test: + if: "@data-chem-formula-op" + then: [T: "punto"] # (en: 'dot', google translation) + else: [T: "punto"] # (en: 'times') + + - "⋆": [T: "operador estrella"] # 0x22c6 (en: 'times') + - "⋇": [T: "dividido por"] # 0x22c7 (en: 'division times') + - "⋈": [T: "moño"] # 0x22c8 (en: 'bowtie') + - "⋉": # 0x22c9 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "factor normal izquierdo producto semidirecto" # (en: 'the left normal factor semidirect product of') + - "⋊": # 0x22ca + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "factor normal derecho producto semidirecto" # (en: 'the right normal factor semidirect product of') + - "⋋": # 0x22cb + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "producto semidirecto izquierdo" # (en: 'the left semidirect product of') + - "⋌": # 0x22cc + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "producto semidirecto derecho" # (en: 'the right semidirect product of') + - "⋍": [T: "tilde invertida igual a"] # 0x22cd (en: 'reversed tilde equals') + - "⋎": [T: "o rotacional"] # 0x22ce (en: 'curly logical or') + - "⋏": [T: "y rotacional"] # 0x22cf (en: 'curly logical and') + - "⋐": # 0x22d0 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "subconjunto doble de" # (en: 'a double subset of') + - "⋑": # 0x22d1 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "superconjunto doble de" # (en: 'a double superset of') + - "⋒": # 0x22d2 + - test: + if: "$Verbosity!='Terse'" + then: [T: "la"] # (en: 'the', google translation) + - T: "doble intersecciĂłn" # (en: 'double intersection of') + - "⋓": # 0x22d3 + - test: + if: "$Verbosity!='Terse'" + then: [T: "la"] # (en: 'the', google translation) + - T: "doble uniĂłn" # (en: 'double union of') + - "⋔": # 0x22d4 + - test: + if: "$Verbosity!='Terse'" + then: [T: "el"] # (en: 'the', google translation) + - T: "intersecciĂłn propia de" # (en: 'proper intersection of') + - "⋕": # 0x22d5 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "paralela o igual a" # (en: 'equal to and parallel to') + - "⋖": [T: "menor que con punto"] # 0x22d6 (en: 'less than with dot') + - "⋗": [T: "mayor que con punto"] # 0x22d7 (en: 'greater than with dot') + - "⋘": # 0x22d8 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "mucho menor que" # (en: 'very much less than') + - "⋙": # 0x22d9 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "mucho mayor que" # (en: 'very much greater than') + - "⋚": # 0x22da + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "menor que igual a o mayor que" # (en: 'less than equal to or greater than') + - "⋛": # 0x22db + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "mayor que igual a o menor que" # (en: 'greater than equal to or less than') + - "⋜": # 0x22dc + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "menor o igual que" # (en: 'equal to or less than') + - "⋝": # 0x22dd + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "mayor o igual que" # (en: 'equal to or greater than') + - "⋞": # 0x22de + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "precede o es igual a" # (en: 'equal to or precedes') + - "⋟": # 0x22df + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "sigue o es igual a" # (en: 'equal to or succeeds') + - "⋠": [T: "no precede ni es igual a"] # 0x22e0 (en: 'does not precede nor is equal to') + - "⋡": [T: "no sigue ni es igual a"] # 0x22e1 (en: 'does not succeed nor is equal to') + - "⋱": [T: "no es imagen cuadrada ni igual a"] # 0x22e2 (en: 'not square image of or equal to') + - "⋣": [T: "no es original cuadrada ni igual a"] # 0x22e3 (en: 'not square original of or equal to') + - "â‹€": [T: "imagen cuadrada precisa"] # 0x22e4 (en: 'square image of or not equal to') + - "â‹„": [T: "cuadrada original precisa"] # 0x22e5 (en: 'square original of or not equal to') + - "⋩": # 0x22e6 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "menor que no equivalente a" # (en: 'less than but not equivalent to') + - "⋧": # 0x22e7 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "mayor que no equivalente a" # (en: 'greater than but not equivalent to') + - "⋹": [T: "precede pero no es equivalente a"] # 0x22e8 (en: 'precedes but is not equivalent to') + - "⋩": [T: "sigue pero no es equivalente a"] # 0x22e9 (en: 'succeeds but is not equivalent to') + - "â‹Ș": # 0x22ea + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no subgrupo normal de" # (en: 'not a normal subgroup of') + - "⋫": [T: "no contiene como subgrupo normal a"] # 0x22eb (en: 'does not contain as a normal subgroup') + - "⋬": # 0x22ec + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no es subgrupo normal ni igual a" # (en: 'not a normal subgroup of nor is equal to') + - "⋭": [T: "no contiene como subgrupo normal ni es igual a"] # 0x22ed (en: 'does not contain as a normal subgroup nor is equal to') + - "⋼": [T: "puntos suspensivos verticales"] # 0x22ee (en: 'vertical ellipsis') + - "⋯": [T: "puntos suspensivos altos"] # 0x22ef (en: 'dot dot dot') + - "⋰": [T: "puntos suspensivos diagonales hacia arriba"] # 0x22f0 (en: 'upwards diagonal ellipsis') + - "⋱": [T: "puntos suspensivos diagonales hacia abajo"] # 0x22f1 (en: 'diagonal ellipsis') + - "â‹Č": [T: "pertenece a con trazo horizontal"] # 0x22f2 (en: 'element of with long horizontal stroke') + - "⋳": [T: "pertenece a con barra vertical al final del trazo horizontal"] # 0x22f3 (en: 'element of with vertical bar at end of horizontal stroke') + - "⋮": [T: "pertenece a con barra vertical al final del trazo horizontal"] # 0x22f4 (en: 'element of with vertical bar at end of horizontal stroke') + - "â‹”": [T: "pertenece a con punto arriba"] # 0x22f5 (en: 'element of with dot above') + - "⋶": [T: "pertenece a con barra arriba"] # 0x22f6 (en: 'element of with overbar') + - "⋷": [T: "perteneciente subrayado"] # 0x22f7 (en: 'element of with overbar') + - "⋾": [T: "perteneciente subrayado"] # 0x22f8 (en: 'element of with underbar') + - "â‹č": [T: "pertenece con dos trazos horizontales"] # 0x22f9 (en: 'element of with two horizontal strokes') + - "â‹ș": [T: "contiene o es igual a"] # 0x22fa (en: 'contains with long horizontal stroke') + - "⋻": [T: "contiene barra vertical al final de trazo horizontal"] # 0x22fb (en: 'contains with vertical bar at end of horizontal stroke') + - "⋌": [T: "contiene barra vertical al final de trazo horizontal"] # 0x22fc (en: 'contains with vertical bar at end of horizontal stroke') + - "⋜": [T: "contiene barra superior"] # 0x22fd (en: 'contains with overbar') + - "⋟": [T: "incluye barra superior"] # 0x22fe (en: 'contains with overbar') + - "⋿": [T: "z anotaciĂłn pertenencia a bolsa"] # 0x22ff (en: 'z notation bag membership') + - "⌀": [T: "diĂĄmetro"] # 0x2300 (en: 'diameter') + - "⌁": [T: "flecha elĂ©ctrica"] # 0x2301 (en: 'electric arrow', google: 'flecha elĂ©ctrica') + - "⌂": [T: "casa"] # 0x2302 (en: 'house') + - "⌃": [T: "flecha arriba"] # 0x2303 (en: 'up arrowhead', google: 'arrowhead de flecha') + - "⌄": [T: "flecha con punta hacia abajo"] # 0x2304 (en: 'down arrowhead', google: 'abajo de arrowhead') + - "⌅": [T: "proyectiva"] # 0x2305 (en: 'projective') + - "⌆": [T: "perspectiva"] # 0x2306 (en: 'perspective') + - "⌇": [T: "lĂ­nea ondulada"] # 0x2307 (en: 'wavy line') + - "⌈": [T: "lĂ­mite superior izquierdo"] # 0x2308 (en: 'left ceiling') + - "⌉": [T: "lĂ­mite superior derecho"] # 0x2309 (en: 'right ceiling') + - "⌊": [T: "lĂ­mite inferior izquierdo"] # 0x230a (en: 'left floor') + - "⌋": [T: "lĂ­mite inferior derecho"] # 0x230b (en: 'right floor') + - "⌌": [T: "corte inferior derecho"] # 0x230c (en: 'bottom right crop') + - "⌍": [T: "corte inferior izquierdo"] # 0x230d (en: 'bottom left crop') + - "⌎": [T: "corte superior derecho "] # 0x230e (en: 'top right crop', MathPlayer: 'corte superior derecho', google: 'cropa de arriba a la derecha') + - "⌏": [T: "corte superior izquierdo"] # 0x230f (en: 'top left crop') + - "⌐": [T: "no invertido"] # 0x2310 (en: 'reversed not sign') + - "⌑": [T: "rombo cuadrado"] # 0x2311 (en: 'square lozenge', google: 'pombra cuadrada') + - "⌒": [T: "arco"] # 0x2312 (en: 'arc') + - "⌓": [T: "segmento"] # 0x2313 (en: 'segment') + - "⌔": [T: "sector"] # 0x2314 + - "⌕": [T: "grabadora telefĂłnica"] # 0x2315 (en: 'telephone recorder', google: 'recordadora telefĂłnica') + - "⌖": [T: "indicador de posiciĂłn"] # 0x2316 (en: 'position indicator crosshairs', google: 'posiciĂłn indicador de mira') + - "⌗": [T: "viewdata square"] # 0x2317 (google translation) + - "⌘": [T: "lugar del signo de interĂ©s"] # 0x2318 (en: 'place of interest sign', google: 'señal de lugar de interĂ©s') + - "⌙": [T: "signo no invertido"] # 0x2319 (en: 'turned not sign', google translation) + - "⌚": [T: "reloj"] # 0x231a (en: 'watch', google: 'mirar') + - "⌛": [T: "reloj de arena"] # 0x231b (en: 'hourglass', google translation) + - "⌜": [T: "ĂĄngulo superior izquierdo"] # 0x231c (en: 'top left corner') + - "⌝": [T: "ĂĄngulo superior derecho"] # 0x231d (en: 'top right corner') + - "⌞": [T: "ĂĄngulo inferior izquierdo"] # 0x231e (en: 'bottom left corner') + - "⌟": [T: "ĂĄngulo inferior derecho"] # 0x231f (en: 'bottom right corner') + - "⌠": [T: "mitad superior de integral"] # 0x2320 (en: 'top half integral') + - "⌡": [T: "mitad inferior de integral"] # 0x2321 (en: 'bottom half integral') + - "⌱": [T: "ceño fruncido"] # 0x2322 (en: 'frown', google: 'fruncir el ceño') + - "⌣": [T: "sonrisa"] # 0x2323 (en: 'smile') + - "⌀": [T: "flecha arriba entre dos barras horizontales"] # 0x2324 (en: 'up arrowhead between two horizontal bars', google: 'arrowehead de flecha entre dos barras horizontales') + - "⌄": [T: "clave de opciĂłn"] # 0x2325 (en: 'option key', google translation) + - "〈": [T: "borrar hacia la derecha"] # 0x2326 (en: 'erase to the right', google translation) + - "⌧": [T: "x en un rectĂĄngulo"] # 0x2327 (en: 'x in a rectangle box', google translation) + - "⌹": [T: "teclado"] # 0x2328 (en: 'keyboard', google translation) + - "〈": [T: "parĂ©ntesis angular izquierdo"] # 0x2329 (en: 'left pointing angle bracket') + - "âŒȘ": [T: "parĂ©ntesis angular derecho"] # 0x232a (en: 'right pointing angle bracket') + - "⌫": [T: "borrar hacia la izquierda"] # 0x232b (en: 'erase to the left', google translation) + - "⌬": [T: "anillo de benceno"] # 0x232c (en: 'benzene ring', google translation) + - "⌭": [T: "cilindro"] # 0x232d (en: 'cylindricity') + - "⌼": [T: "perfil"] # 0x232e (en: 'all around profile', google: 'alrededor de perfil') + - "⌯": [T: "simetrĂ­a"] # 0x232f (en: 'symmetry', google translation) + - "⌰": [T: "desviaciĂłn total"] # 0x2330 (en: 'total runout', google translation) + - "⌱": [T: "origen de dimensiĂłn"] # 0x2331 (en: 'dimension origin', google translation) + - "âŒČ": [T: "cĂłnico cĂłnico"] # 0x2332 (en: 'conical taper', google translation) + - "⌳": [T: "pendiente"] # 0x2333 (en: 'slope', google translation) + - "⌮": [T: "contrataladro"] # 0x2334 (en: 'counterbore', google translation) + - "⌔": [T: "avellanador"] # 0x2335 (en: 'countersink', google translation) + - "⍰": [T: "interrogaciĂłn en caja"] # 0x2370 (en: 'unknown box', google: 'caja desconocida') + - "⎕": [T: "caja"] # 0x2395 (en: 'box', google translation) + - "⏞": [T: "corchete rotacional superior"] # 0x23DE (en: 'top brace') + - "⏟": [T: "corchete rotacional inferior"] # 0x23DF (en: 'bottom brace') + - "①-⑹": # 0x2460 - 0x2469 + - T: "corchete rotacional inferior" # (en: 'circled') + - spell: "translate('.', '①⑥⑹④⑀⑄⑊⑧⑚', '123456789')" + - "⑩": [T: "diez en un cĂ­rculo"] # 0x2469 (en: 'circled ten', google translation) + - "â‘Ș": [T: "once en un cĂ­rculo"] # 0x246a (en: 'circled eleven', google translation) + - "⑫": [T: "doce en un cĂ­rculo"] # 0x246b (en: 'circled twelve', google translation) + - "⑬": [T: "trece en un cĂ­rculo"] # 0x246c (en: 'circled thirteen', google translation) + - "⑭": [T: "catorce en un cĂ­rculo"] # 0x246d (en: 'circled fourteen', google translation) + - "⑼": [T: "quince en un cĂ­rculo"] # 0x246e (en: 'circled fifteen', google translation) + - "⑯": [T: "diecisĂ©is en un cĂ­rculo"] # 0x246f (en: 'circled sixteen', google translation) + - "⑰": [T: "diecisiete en un cĂ­rculo"] # 0x2470 (en: 'circled seventeen', google translation) + - "⑱": [T: "dieciocho en un cĂ­rculo"] # 0x2471 (en: 'circled eighteen', google translation) + - "⑱": [T: "diecinueve en un cĂ­rculo"] # 0x2471 (en: 'circled nineteen', google translation) + - "⑳": [T: "veinte en un cĂ­rculo"] # 0x2473 (en: 'circled twenty', google translation) + - "⑮-⑌": # 0x2474 - 0x247d + - T: "entre parĂ©ntesis" # (en: 'parenthesized', google translation) + - spell: "translate('.', '⑎⑔⑶⑷⑞â‘čâ‘ș⑻⑌', '123456789')" + - "⑜": [T: "diez entre parĂ©ntesis"] # 0x247d (en: 'parenthesized ten', google translation) + - "⑟": [T: "once entre parĂ©ntesis"] # 0x247e (en: 'parenthesized eleven', google translation) + - "⑿": [T: "doce entre parĂ©ntesis"] # 0x247f (en: 'parenthesized twelve', google translation) + - "⒀": [T: "trece entre parĂ©ntesis"] # 0x2480 (en: 'parenthesized thirteen', google translation) + - "⒁": [T: "catorce entre parĂ©ntesis"] # 0x2481 (en: 'parenthesized fourteen', google translation) + - "⒂": [T: "quince entre parĂ©ntesis"] # 0x2482 (en: 'parenthesized fifteen', google translation) + - "⒃": [T: "diecisĂ©is entre parĂ©ntesis"] # 0x2483 (en: 'parenthesized sixteen', google translation) + - "⒄": [T: "diecisiete entre parĂ©ntesis"] # 0x2484 (en: 'parenthesized seventeen', google translation) + - "⒅": [T: "dieciocho entre parĂ©ntesis"] # 0x2485 (en: 'parenthesized eighteen', google translation) + - "⒆": [T: "diecinueve entre parĂ©ntesis"] # 0x2486 (en: 'parenthesized nineteen', google translation) + - "⒇": [T: "veinte entre parĂ©ntesis"] # 0x2487 (en: 'parenthesized twenty', google translation) + - "⒈-⒐": # 0x2488 - 0x2491 + - spell: "translate('.', '⒈⒉⒊⒋⒌⒍⒎⒏⒐', '123456789')" + - T: "con periodo" # (en: 'with period', google translation) + - "⒑": [T: "diez con signo de periodo"] # 0x2491 (en: 'ten with period', google translation) + - "⒒": [T: "once con signo de periodo"] # 0x2492 (en: 'eleven with period', google translation) + - "⒓": [T: "doce con signo de periodo"] # 0x2493 (en: 'twelve with period', google translation) + - "⒔": [T: "trece con signo de periodo"] # 0x2494 (en: 'thirteen with period', google translation) + - "⒕": [T: "catorce con signo de periodo"] # 0x2495 (en: 'fourteen with period', google translation) + - "⒖": [T: "quince con signo de periodo"] # 0x2496 (en: 'fifteen with period', google translation) + - "⒗": [T: "diecisĂ©is con signo de periodo"] # 0x2497 (en: 'sixteen with period', google translation) + - "⒘": [T: "diecisiete con signo de periodo"] # 0x2498 (en: 'seventeen with period', google translation) + - "⒙": [T: "dieciocho con signo de periodo"] # 0x2499 (en: 'eighteen with period', google translation) + - "⒚": [T: "diecinueve con signo de periodo"] # 0x249a (en: 'nineteen with period', google translation) + - "⒛": [T: "veinte con signo de periodo"] # 0x249b (en: 'twenty with period', google translation) + - "⒜-â’”": # 0x249c - 0x24b5 + - T: "entre parĂ©ntesis" # (en: 'parenthesized', google translation) + - spell: "translate('.', 'â’œâ’â’žâ’Ÿâ’ â’Ąâ’ąâ’Łâ’€â’„â’Šâ’§â’šâ’©â’Șâ’«â’Źâ’­â’źâ’Żâ’°â’±â’Čâ’łâ’Žâ’”', 'abcdefghijklmnopqrstuvwxyz')" + + - "Ⓐ-Ⓩ": + - T: "dentro de uncĂ­rculo" # (en: 'circled', google translation) + - spell: "translate('.', 'â’¶â’·â’žâ’čâ’șâ’»â’Œâ’œâ’Ÿâ’żâ“€â“â“‚â“ƒâ“„â“…â“†â“‡â“ˆâ“‰â“Šâ“‹â“Œâ“â“Žâ“', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "🅐-đŸ…©": # 0x1f150 - 0x1f169 + - T: "dentro de un cĂ­rculo negro" # (en: 'black circled', google translation) + - spell: "translate('.', 'đŸ…đŸ…‘đŸ…’đŸ…“đŸ…”đŸ…•đŸ…–đŸ…—đŸ…˜đŸ…™đŸ…šđŸ…›đŸ…œđŸ…đŸ…žđŸ…ŸđŸ… đŸ…ĄđŸ…ąđŸ…ŁđŸ…€đŸ…„đŸ…ŠđŸ…§đŸ…šđŸ…©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "ⓐ-ⓩ": # 0x24d0 - 0x24e9 + - T: "dentro de un cĂ­rculo" # (en: 'circled', google translation) + - spell: "translate('.', 'â“â“‘â“’â““â“”â“•â“–â“—â“˜â“™â“šâ“›â“œâ“â“žâ“Ÿâ“ â“Ąâ“ąâ“Łâ“€â“„â“Šâ“§â“šâ“©', 'abcdefghijklmnopqrstuvwxyz')" + - "â“Ș": [T: "cero en un cĂ­rculo"] # 0x24ea (en: 'circled zero', google translation) + - "⓫": [T: "once en un cĂ­rculo negro"] # 0x24eb (google translation) + - "⓬": [T: "doce en un cĂ­rculo negro"] # 0x24ec (en: 'black circled twelve', google translation) + - "⓭": [T: "trece en un cĂ­rculo negro"] # 0x24ed (en: 'black circled thirteen', google translation) + - "⓼": [T: "catorce en un cĂ­rculo negro"] # 0x24ee (en: 'black circled fourteen', google translation) + - "⓯": [T: "quince en un cĂ­rculo negro"] # 0x24ef (en: 'black circled fifteen', google translation) + - "⓰": [T: "diecisĂ©is en un cĂ­rculo negro"] # 0x24f0 (en: 'black circled sixteen', google translation) + - "⓱": [T: "diecisiete en un cĂ­rculo negro"] # 0x24f1 (en: 'black circled seventeen', google translation) + - "â“Č": [T: "dieciocho en un cĂ­rculo negro"] # 0x24f2 (en: 'black circled eighteen', google translation) + - "⓳": [T: "diecinueve en un cĂ­rculo negro"] # 0x24f3 (en: 'black circled nineteen', google translation) + - "⓮": [T: "veinte en un cĂ­rculo negro"] # 0x24f4 (en: 'black circled twenty', google translation) + - "â“”-ⓜ": # 0x24f5 - 0x24fe + - T: "doble cĂ­rculo" # (en: 'double circled', google translation) + - spell: "translate('.', 'ⓔ⓶⓷ⓞâ“čâ“ș⓻Ⓦⓜ', '123456789')" + - "ⓟ": [T: "diez en un doble cĂ­rculo"] # 0x24fe (en: 'double circled ten', google translation) + - "⓿": [T: "cero en cĂ­rculo negro"] # 0x24ff (en: 'black circled zero', google translation) + - "■": [T: "cuadrado negro"] # 0x25a0 (en: 'black square') + - "□": [T: "cuadrado blanco"] # 0x25a1 (en: 'white square') + - "▱": [T: "cuadrado blanco con esquinas redondeadas"] # 0x25a2 (en: 'white square with rounded corners') + - "▣": [T: "cuadrado blanco que contiene cuadrado pequeño negro"] # 0x25a3 (en: 'white square containing small black square', google: 'cuadrado blanco que contiene un pequeño cuadrado negro') + - "â–€": [T: "cuadrado con relleno horizontal"] # 0x25a4 (en: 'square with horizontal fill') + - "â–„": [T: "cuadrado con relleno vertical"] # 0x25a5 (en: 'square with vertical fill') + - "▩": [T: "cuadrado con relleno octogonal de rayas"] # 0x25a6 (en: 'square with orthogonal crosshatch fill', google: 'cuadrado con relleno ortogonal de muñeca') + - "▧": [T: "cuadrado con la esquina superior izquierda hacia la parte derecha inferior del relleno"] # 0x25a7 (en: 'square with upper left to lower right fill', google: 'cuadrado con la parte superior izquierda a la parte inferior del relleno derecho') + - "▹": [T: "cuadrado con la parte superior derecha hacia la parte inferior izquierda del relleno"] # 0x25a8 (en: 'square with upper right to lower left fill', google: 'cuadrado con la parte superior derecha a la parte inferior izquierda del relleno') + - "▩": [T: "cuadrado con relleno diagonal rayado"] # 0x25a9 (en: 'square with diagonal crosshatch fill', google: 'cuadrado con relleno de shatch diagonal') + - "â–Ș": [T: "cuadrado pequeño negro"] # 0x25aa (en: 'black small square') + - "▫": [T: "cuadrado pequeño blanco"] # 0x25ab (en: 'white small square') + - "▬": [T: "rectĂĄngulo negro"] # 0x25ac (en: 'black rectangle') + - "▭": [T: "rectĂĄngulo blanco"] # 0x25ad (en: 'white rectangle') + - "▼": [T: "rectĂĄngulo relleno vertical"] # 0x25ae (en: 'black vertical rectangle') + - "▯": [T: "rectĂĄngulo vertical blanco"] # 0x25af (en: 'white vertical rectangle') + - "▰": [T: "paralelogramo negro"] # 0x25b0 (en: 'black parallelogram', google: 'paralelograma negro') + - "▱": [T: "paralelogramo blanco"] # 0x25b1 (en: 'white parallelogram') + - "â–Č": [T: "triĂĄngulo negro apuntando hacia arriba"] # 0x25b2 (en: 'black up pointing triangle') + - "△": [T: "triĂĄngulo blanco apuntando hacia arriba"] # 0x25b3 (en: 'white up pointing triangle') + - "▮": [T: "triĂĄngulo negro pequeño apuntando hacia arriba"] # 0x25b4 (en: 'black up pointing small triangle') + - "â–”": [T: "triĂĄngulo blanco pequeño apuntando hacia arriba"] # 0x25b5 (en: 'white up pointing small triangle') + - "▶": [T: "triĂĄngulo negro apuntando hacia la derecha"] # 0x25b6 (en: 'black right pointing triangle') + - "▷": [T: "triĂĄngulo blanco apuntando hacia la derecha"] # 0x25b7 (en: 'white right pointing triangle') + - "▾": [T: "triĂĄngulonegro pequeño apuntando hacia la derecha"] # 0x25b8 (en: 'black right pointing small triangle') + - "â–č": [T: "triĂĄngulo blanco pequeño apuntando hacia la derecha"] # 0x25b9 (en: 'white right pointing small triangle') + - "â–ș": [T: "indicador negro apuntando a la derecha"] # 0x25ba (en: 'black right pointing pointer', google: 'puntero de punta derecha negra') + - "▻": [T: "indicador blanco apuntando hacia la derecha"] # 0x25bb (en: 'white right pointing pointer', google: 'puntero de punta derecha blanca') + - "â–Œ": [T: "triĂĄngulo negro apuntando hacia abajo"] # 0x25bc (en: 'black down pointing triangle') + - "â–œ": [T: "triĂĄngulo blanco apuntando hacia abajo"] # 0x25bd (en: 'white down pointing triangle') + - "â–Ÿ": [T: "pequeño triĂĄngulo negro apuntando hacia abajo"] # 0x25be (en: 'black down pointing small triangle') + - "▿": [T: "triĂĄngulo pequeño blanco apuntando hacia abajo"] # 0x25bf (en: 'white down pointing small triangle') + - "◀": [T: "triĂĄngulo negro apuntando hacia la izquierda"] # 0x25c0 (en: 'black left pointing triangle') + - "◁": [T: "triĂĄngulo blanco apuntando hacia la izquierda"] # 0x25c1 (en: 'white left pointing triangle') + - "◂": [T: "pequeño triĂĄngulo negro apuntando hacia la izquierda izquierda"] # 0x25c2 (en: 'black left pointing small triangle') + - "◃": [T: "pequeño triĂĄngulo blanco apuntando hacia la izquierda"] # 0x25c3 (en: 'white left pointing small triangle') + - "◄": [T: "puntero negro apuntando hacia la izquierda"] # 0x25c4 (en: 'black left pointing pointer') + - "◅": [T: "puntero blanco apuntando hacia la izquierda"] # 0x25c5 (en: 'white left pointing pointer') + - "◆": [T: "rombo negro"] # 0x25c6 (en: 'black diamond') + - "◇": [T: "rombo blanco"] # 0x25c7 (en: 'white diamond') + - "◈": [T: "rombo blanco contiene rombo pequeño negro"] # 0x25c8 (en: 'white diamond containing black small diamond') + - "◉": [T: "ojo de pez"] # 0x25c9 (en: 'fisheye') + - "◊": [T: "rombo"] # 0x25ca (en: 'lozenge') + - "○": [T: "cĂ­rculo blanco"] # 0x25cb (en: 'white circle') + - "◌": [T: "cĂ­rculo punteado"] # 0x25cc (en: 'dotted circle') + - "◍": [T: "cĂ­rculo con relleno vertical"] # 0x25cd (en: 'circle with vertical fill') + - "◎": [T: "diana"] # 0x25ce (en: 'bullseye') + - "●": [T: "cĂ­rculo negro"] # 0x25cf (en: 'black circle') + - "◐": [T: "cĂ­rculo con mitad izquierda negra"] # 0x25d0 (en: 'circle with left half black') + - "◑": [T: "cĂ­rculo con mitad derecha negra"] # 0x25d1 (en: 'circle with right half black') + - "◒": [T: "cĂ­rculo con mitad inferior negra"] # 0x25d2 (en: 'circle with lower half black') + - "◓": [T: "cĂ­rculo con mitad superior negra"] # 0x25d3 + - "◔": [T: "cĂ­rculo con cuadrante superior derecho relleno"] # 0x25d4 (en: 'circle with upper right quadrant black') + - "◕": [T: "cĂ­rculo con cuadrante superior izquierdo negro"] # 0x25d5 (en: 'circle with all but upper left quadrant black') + - "◖": [T: "semicĂ­rculo izquierdo negro"] # 0x25d6 (en: 'left half black circle') + - "◗": [T: "semicĂ­rculo derecho negro"] # 0x25d7 (en: 'right half black circle') + - "◘": [T: "viñeta inversa"] # 0x25d8 (en: 'inverse bullet') + - "◙": [T: "cĂ­rculo blanco inverso"] # 0x25d9 (en: 'inverse white circle') + - "◚": [T: "semicĂ­rculo superior blanco inverso"] # 0x25da (en: 'upper half inverse white circle') + - "◛": [T: "semicĂ­rculo inferior blanco inverso"] # 0x25db (en: 'lower half inverse white circle') + - "◜": [T: "cuadrante superior izquierdo arco circular"] # 0x25dc (en: 'upper left quadrant circular arc') + - "◝": [T: "cuadrante superior derecho arco circular"] # 0x25dd (en: 'upper right quadrant circular arc') + - "◞": [T: "cuadrante inferior derecho arco circular"] # 0x25de (en: 'lower right quadrant circular arc') + - "◟": [T: "cuadrante inferior izquierdo arco circular"] # 0x25df (en: 'lower left quadrant circular arc') + - "◠": [T: "semicĂ­rculo superior"] # 0x25e0 (en: 'upper half circle') + - "◡": [T: "semicĂ­rculo inferior"] # 0x25e1 (en: 'lower half circle') + - "◱": [T: "triĂĄngulo inferior derecha relleno"] # 0x25e2 (en: 'black lower right triangle') + - "◣": [T: "triĂĄngulo negro inferior izquierdo"] # 0x25e3 (en: 'black lower left triangle') + - "â—€": [T: "triĂĄngulo negro superior izquierdo"] # 0x25e4 (en: 'black upper left triangle') + - "â—„": [T: "triĂĄngulo negro superior derecho"] # 0x25e5 (en: 'black upper right triangle') + - "◩": [T: "composiciĂłn"] # 0x25e6 (en: 'composition') + - "◧": [T: "cuadrado con mitad izquierda negra"] # 0x25e7 (en: 'square with left half black') + - "◹": [T: "cuadrado con mitad derecha negra"] # 0x25e8 (en: 'square with right half black') + - "◩": [T: "cuadrado con mitad superior izquierda negra"] # 0x25e9 (en: 'square with upper left half black') + - "â—Ș": [T: "cuadrado con mitad inferior derecha negra"] # 0x25ea (en: 'square with lower right half black') + - "◫": [T: "cuadrado blanco con bisectriz"] # 0x25eb (en: 'white square with bisecting line') + - "◬": [T: "triĂĄngulo blanco apuntando hacia arriba con punto"] # 0x25ec (en: 'white up pointing triangle with dot') + - "◭": [T: "triĂĄngulo apuntando hacia arriba con mitad izquierda negra"] # 0x25ed (en: 'up pointing triangle with left half black') + - "◼": [T: "triĂĄngulo apuntando hacia arriba con mitad derecha negra"] # 0x25ee (en: 'up pointing triangle with right half black') + - "◯": [T: "cĂ­rculo grande"] # 0x25ef (en: 'large circle') + - "◰": [T: "cuadrado blanco con cuadrante superior izquierdo"] # 0x25f0 (en: 'white square with upper left quadrant') + - "◱": [T: "cuadrado blanco con cuadrante inferior izquierdo"] # 0x25f1 (en: 'white square with lower left quadrant') + - "â—Č": [T: "cuadrado blanco con cuadrante inferior derecho"] # 0x25f2 (en: 'white square with lower right quadrant') + - "◳": [T: "cuadrado blanco con cuadrante superior derecho"] # 0x25f3 (en: 'white square with upper right quadrant') + - "◮": [T: "cĂ­rculo blanco con cuadrante superior izquierdo"] # 0x25f4 (en: 'white circle with upper left quadrant') + - "â—”": [T: "cĂ­rculo blanco con cuadrante inferior izquierdo"] # 0x25f5 (en: 'white circle with lower left quadrant') + - "◶": [T: "cĂ­rculo blanco con cuadrante inferior derecho"] # 0x25f6 (en: 'white circle with lower right quadrant') + - "◷": [T: "cĂ­rculo blanco con cuadrante superior derecho"] # 0x25f7 (en: 'white circle with upper right quadrant', google: 'cĂ­rculo blanco con cuadrante superior derecha') + - "◾": [T: "triĂĄngulo superior izquierdo"] # 0x25f8 (en: 'upper left triangle') + - "â—č": [T: "triĂĄngulo superior derecho"] # 0x25f9 (en: 'upper right triangle') + - "â—ș": [T: "triĂĄngulo inferior izquierda"] # 0x25fa (en: 'lower left triangle') + - "◻": [T: "cuadrado blanco mediano"] # 0x25fb (en: 'white medium square') + - "â—Œ": [T: "cuadrado negro mediano"] # 0x25fc (en: 'black medium square') + - "â—œ": [T: "cuadrado pequeño medianamente vacĂ­o"] # 0x25fd (en: 'white medium small square') + - "â—Ÿ": [T: "cuadrado pequeño medianamente lleno"] # 0x25fe (en: 'black medium small square') + - "◿": [T: "triĂĄngulo inferior derecho"] # 0x25ff (en: 'lower right triangle') + - "♠": [T: "picas"] # 0x2660 (google: 'traje de pala negro') + - "♡": [T: "corazones"] # 0x2661 (google: 'traje de corazĂłn blanco') + - "♱": [T: "diamantes"] # 0x2662 (google: 'traje de diamante blanco') + - "♣": [T: "trĂ©bol"] # 0x2663 (google: 'traje de club negro') + - "♀": [T: "picas"] # 0x2664 (google: 'traje de pala blanca') + - "♄": [T: "corazones"] # 0x2665 (google: 'traje de corazĂłn negro') + - "♩": [T: "diamantes"] # 0x2666 (google: 'traje de diamante negro') + - "♧": [T: "trĂ©bol"] # 0x2667 (google: 'traje de club blanco') + - "❚": [T: "ornamento en parĂ©ntesis mediano izquierdo"] # 0x2768 (en: 'medium left parentheses ornament', google: 'medio de la parĂ©ntesis de la izquierda adorno') + - "❩": [T: "ornamento en parĂ©ntesis mediano derecho"] # 0x2769 (en: 'medium right parentheses ornament', google: 'medio derecho a la derecha del adorno') + - "âȘ": [T: "ornamento en parĂ©ntesis izquierdo medio aplanado"] # 0x276a (en: 'medium flattened left parentheses ornament', google: 'medio aplanado a la izquierda parĂ©ntesis de adornos') + - "❫": [T: "ornamento en parĂ©ntesis derecho medio aplanado"] # 0x276b (en: 'medium flattened right parentheses ornament', google: 'medio aplanado a la derecha parĂ©ntesis de adornos') + - "❬": [T: "ornamento en soporte de ĂĄngulo medio apuntando hacia la izquierda"] # 0x276c (en: 'medium left-pointing angle bracket ornament', google: 'ornamento de soporte de ĂĄngulo de punta izquierda mediana') + - "❭": [T: "ornamento en soporte de ĂĄngulo medio apuntando hacia la derecha"] # 0x276d (en: 'medium right-pointing angle bracket ornament', google: 'ornamento de soporte de ĂĄngulo de punta derecha mediana') + - "❼": [T: "ornamento en comillas en el ĂĄngulo que apunta hacia la izquierda"] # 0x276e (en: 'heavy left-pointing angle quotation mark ornament', google: 'ornamento de cita de ĂĄngulo de punta izquierda pesada') + - "❯": [T: "ornamento en comillas en el ĂĄngulo recto que apunta hacia la derecha"] # 0x276f (en: 'heavy right-pointing angle quotation mark ornament', google: 'ornamento de cita de cita de ĂĄngulo derecho pesado') + - "❰": [T: "ornamento en soporte del ĂĄngulo que apunta a la izquierda"] # 0x2770 (en: 'heavy left-pointing angle bracket ornament', google: 'adorno de soporte de ĂĄngulo izquierdo pesado') + - "❱": [T: "ornamento en soporte del ĂĄngulo que apunta hacia la derecha"] # 0x2771 (en: 'heavy right-pointing angle bracket ornament', google: 'ornamento de soporte de ĂĄngulo de punta derecha pesada') + - "âČ": [T: "ornamento en soporte de concha de tortuga a la izquierda"] # 0x2772 (en: 'light left tortoise shell bracket ornament', google: 'ornamento de soporte de concha de tortuga de luz') + - "❳": [T: "ornamento en corchete derecho de concha de tortuga hacia la derecha"] # 0x2773 (en: 'light right tortoise shell bracket ornament', google: 'ornamento de soporte de carcasa de tortuga ligera') + - "❎": [T: "ornamento en soporte izquierdo mediano"] # 0x2774 (en: 'medium left brace ornament', google: 'ornamento de brace izquierdo mediano') + - "❔": [T: "ornamento en soporte derechomediano"] # 0x2775 (en: 'medium right brace ornament', google: 'ornamento de aparato ortopĂ©dico medio derecho') + - "❶": [T: "cĂ­rculo negro rodeando uno"] # 0x2776 (en: 'black circled one', google translation) + - "❷": [T: "cÂŽriculo negro rodeando dos"] # 0x2777 (en: 'black circled two', google translation) + - "❞": [T: "cĂ­rculo negro rodeando tres"] # 0x2778 (en: 'black circled three', google translation) + - "âč": [T: "cĂ­rculo negro rodeando cuatro"] # 0x2779 (en: 'black circled four', google translation) + - "âș": [T: "cĂ­rculo negro rodeando cinco"] # 0x277a (en: 'black circled five', google translation) + - "❻": [T: "cĂ­rculo negro rodeando seis"] # 0x277b (en: 'black circled six', google translation) + - "❌": [T: "cĂ­rculo negro rodeando siete"] # 0x277c (en: 'black circled seven', google translation) + - "❜": [T: "cĂ­rculo negro rodeando ocho"] # 0x277d (en: 'black circled eight', google translation) + - "❟": [T: "cĂ­rculo negro rodeando nueve"] # 0x277e (en: 'black circled nine', google translation) + - "❿": [T: "cĂ­rculo negro rodeando diez"] # 0x277f (en: 'black circled ten', google translation) + - "➀": [T: "cĂ­rculo rodeando sans serif uno"] # 0x2780 (en: 'circled sans serif one', google translation) + - "➁": [T: "cĂ­rculo rodeando sans serif dos"] # 0x2781 (en: 'circled sans serif two', google translation) + - "➂": [T: "cĂ­rculo rodeando sans serif tres"] # 0x2782 (en: 'circled sans serif three', google translation) + - "➃": [T: "cĂ­rculo rodeando sans serif cuatro"] # 0x2783 (en: 'circled sans serif four', google translation) + - "➄": [T: "cĂ­rculo rodeando sans serif cinco"] # 0x2784 (en: 'circled sans serif five', google translation) + - "➅": [T: "cĂ­rculo rodeando sans serif seis"] # 0x2785 (en: 'circled sans serif six', google translation) + - "➆": [T: "cĂ­rculo rodeando sans serif siete"] # 0x2786 (en: 'circled sans serif seven', google translation) + - "➇": [T: "cĂ­rculo rodeando sans serif ocho"] # 0x2787 (en: 'circled sans serif eight', google translation) + - "➈": [T: "cĂ­rculo rodeando sans serif nueve"] # 0x2788 (en: 'circled sans serif nine', google translation) + - "➉": [T: "cĂ­rculo rodeando sans serif diez"] # 0x2789 (en: 'circled sans serif ten', google translation) + - "➊": [T: "cĂ­rculo negro rodeando sans serif uno"] # 0x278a (google translation) + - "➋": [T: "cĂ­rculo negro rodeando sans serif dos"] # 0x278b (en: 'black circled sans serif two', google translation) + - "➌": [T: "cĂ­rculo negro rodeando sans serif tres"] # 0x278c (en: 'black circled sans serif three', google translation) + - "➍": [T: "cĂ­rculo negro rodeando sans serif cuatro"] # 0x278d (google translation) + - "➎": [T: "cĂ­rculo negro rodeando sans serif cinco"] # 0x278e (google translation) + - "➏": [T: "cĂ­rculo negro rodeando sans serif seis"] # 0x278f (google translation) + - "➐": [T: "cĂ­rculo negro rodeando sans serif siete"] # 0x2790 (google translation) + - "➑": [T: "cĂ­rculo negro rodeando sans serif ocho"] # 0x2791 (en: 'black circled sans serif eight', google translation) + - "➒": [T: "cĂ­rculo negro rodeando sans serif nueve"] # 0x2792 (google translation) + - "➓": [T: "cĂ­rculo negro rodeando sans serif diez"] # 0x2793 (google translation) + - "➔": [T: "flecha hacia la derecha con cabeza ancha"] # 0x2794 (en: 'heavy wide-headed rightwards arrow', google: 'a la cabeza ancha de cabeza ancha') + - "➕": [T: "signo mĂĄs"] # 0x2795 (en: 'heavy plus sign', google: 'señal de plus plus') + - "➖": [T: "signo menos"] # 0x2796 (en: 'heavy minus sign', google: 'fuerte señal menos') + - "➗": [T: "signo de dividir"] # 0x2797 (en: 'heavy division sign', google: 'señal de divisiĂłn pesada') + - "➘": [T: "flecha gruesa hacia el sudeste"] # 0x2798 (en: 'heavy south east arrow', google: 'heavy south east arrow') + - "➙": [T: "flecha gruesa hacia la derecha"] # 0x2799 (en: 'heavy rightwards arrow', google: 'flecha pesada hacia la derecha') + - "➚": [T: "flecha gruesa hacia el nordeste"] # 0x279a (en: 'heavy north east arrow', google: 'heavy north east arrow') + - "➛": [T: "flecha hacia la derecha con punto centrado"] # 0x279b (en: 'drafting point rightwards arrow', google: 'punto de redacciĂłn arrow hacia la derecha') + - "➜": [T: "flecha hacia la derecha con punta gruesa y redonda"] # 0x279c (en: 'heavy round-tipped rightwards arrow', google: 'arrow de la derecha pesada con punta redonda') + - "➝": [T: "flecha hacia la derecha con cabeza triangular"] # 0x279d (en: 'triangle-headed rightwards arrow', google: 'arrow de cabeza de triĂĄngulo') + - "➞": [T: "flecha hacia la derecha con cabeza gruesa triangular"] # 0x279e (en: 'heavy triangle-headed rightwards arrow', google: 'arrow de cabeza de triĂĄngulo pesado hacia el triĂĄngulo') + - "➟": [T: "flecha discontinua hacia la derecha de cabeza triangular"] # 0x279f (en: 'dashed triangle-headed rightwards arrow', google: 'arrow de cabeza de triĂĄngulo discontinua') + - "➠": [T: "flecha gruesa derecha discontinua con cabeza triangular"] # 0x27a0 (en: 'heavy dashed triangle-headed rightwards arrow', google: 'arrow de cabeza de triĂĄngulo pesado con cabeza de triĂĄngulo') + - "➡": [T: "flecha negra hacia la derecha"] # 0x27a1 (en: 'black rightwards arrow', google: 'negra flecha derecha hacia la derecha') + - "➱": [T: "flecha hacia la derecha tres d en parte superior"] # 0x27a2 (en: 'three d top lighted rightwards arrow', google: 'tres d top iluminados con flecha hacia la derecha') + - "➣": [T: "flecha hacia la derecha tres d en parte inferior en tres dimensiones"] # 0x27a3 (en: 'three d bottom lighted rightwards arrow', google: 'tres d de fondo iluminado hacia la derecha') + - "➀": [T: "punta de flecha negra hacia la derecha"] # 0x27a4 (en: 'black rightwards arrowhead', google: 'black rightwards arrowhead') + - "➄": [T: "flecha gruesa y negra curvada hacia la derecha y hacia abajo"] # 0x27a5 (en: 'heavy black curved downwards and rightwards arrow', google: 'negro pesado curvado hacia abajo y flecha derecha') + - "➊": [T: "flecha gruesa y negra curvada hacia la derecha y hacia arriba"] # 0x27a6 (en: 'heavy black curved upwards and rightwards arrow', google: 'negro pesado curvado hacia arriba y flecha hacia la derecha') + - "➧": [T: "flecha negra corta hacia la derecha"] # 0x27a7 (en: 'squat black rightwards arrow', google: 'corta la flecha negra a la derecha') + - "➚": [T: "flecha negra hacia la derecha con punta cĂłncava"] # 0x27a8 (en: 'heavy concave-pointed black rightwards arrow', google: 'flecha negra cĂłncava pesada pesada hacia la derecha') + - "➩": [T: "flecha hacia la derecha sombreada en la parte derecha"] # 0x27a9 (en: 'right-shaded white rightwards arrow', google: 'flecha blanca a la derecha de sombreado derecho') + - "âžȘ": [T: "flecha blanca hacia la derecha sombreada en la parte izquierda"] # 0x27aa (en: 'left-shaded white rightwards arrow', google: 'flecha blanca a la derecha de sombreado izquierdo') + - "➫": [T: "flecha blanca hacia la derecha con sonbra inclinada hacia la parte posterior"] # 0x27ab (en: 'bck-tilted shadowed white rightwards arrow', google: 'flecha blanca a la derecha en la espalda') + - "➬": [T: "flecha blanca hacia la derecha con sombra inclinada hacia la parte anterior"] # 0x27ac (en: 'front-tilted shadowed white rightwards arrow', google: 'flecha blanca a la derecha sombreada en la sombra frontal') + - "➭": [T: "flecha gruesa inferior hacia la derecha sombreada en la parte derecha"] # 0x27ad (en: 'heavy lower right-shadowed white rightwards arrow', google: 'flecha blanca hacia la derecha inferior derecha pesada') + - "➼": [T: "flecha gruesa superior hacia la derecha sombreada en la parte derecha"] # 0x27ae (en: 'heavy upper right-shadowed white rightwards arrow', google: 'flecha blanca hacia la derecha de la parte superior derecha pesada') + - "➯": [T: "flecha escopleada inferior hacia la derecha sombreada en la parte derecha"] # 0x27af (en: 'notched lower right-shadowed white rightwards arrow', google: 'muesca con muescas de la flecha blanca a la derecha de la derecha inferior') + - "➱": [T: "flecha escopleada superior hacia la derecha sombreada en la parte derecha"] # 0x27b1 (en: 'notched upper right-shadowed white rightwards arrow', google: 'arrow blanca de sombra superior derecha con muescas de la parte superior') + - "âžČ": [T: "flecha blanca hacia la derecha rodeada por un cĂ­rculo grueso"] # 0x27b2 (en: 'circled heavy white rightwards arrow', google: 'flecha de color blanco pesado con rodajas') + - "➳": [T: "flecha hacia la derecha con pluma blanca"] # 0x27b3 (en: 'white-feathered rightwards arrow', google: 'flecha derecha de plumas blancas') + - "➮": [T: "flecha sudeste con pluma negra"] # 0x27b4 (en: 'black-feathered south east arrow', google: 'flecha del sureste de plumas negras') + - "➔": [T: "flecha hacia la derecha con pluma negra"] # 0x27b5 (en: 'black-feathered rightwards arrow', google: 'flecha derecha de plumas negras') + - "➶": [T: "flecha nordeste con pluma negra"] # 0x27b6 (en: 'black-feathered north east arrow', google: 'flecha del noreste de plumas negras') + - "➷": [T: "flecha sudeste con pluma negra y gruesa"] # 0x27b7 (en: 'heavy black-feathered south east arrow', google: 'pesada flecha del sureste de plumas negras') + - "➾": [T: "flecha hacia la derecha con pluma gruesa y negra"] # 0x27b8 (en: 'heavy black-feathered rightwards arrow', google: 'flecha pesada de plumas negras hacia la derecha') + - "âžč": [T: "flecha nordeste con pluma negra y gruesa"] # 0x27b9 (en: 'heavy black-feathered north east arrow', google: 'pesada flecha del noreste de plumas negras') + - "âžș": [T: "flecha hacia la derecha con punta en forma de lĂĄgrima"] # 0x27ba (en: 'teradrop-barbed rightwards arrow', google: 'teradrop-barbed rightwards arrow') + - "➻": [T: "flecha hacia la derecha con punta en forma de lĂĄgrima"] # 0x27bb (en: 'heavy teardrop-shanked rightwards arrow', google: 'arrow a la derecha de la lĂĄgrima pesada hacia la lĂĄgrima') + - "➌": [T: "flecha hacia la derecha con cola de cuña"] # 0x27bc (en: 'wedge-tailed rightwards arrow', google: 'arrow de cola de cola de cuña') + - "➜": [T: "flecha hacia la derecha con cola de cuña gruesa"] # 0x27bd (en: 'heavy wedge-tailed rightwards arrow', google: 'flecha de cola de cuña pesada') + - "➟": [T: "flecha abierta delineada hacia fuera"] # 0x27be (en: 'open-outlined rightwards arrow', google: 'abra por la flecha de la derecha abierta') + - "⟀": [T: "ĂĄngulo tridimensional"] # 0x27c0 (en: 'three dimensional angle') + - "⟁": [T: "triĂĄngulo blanco conteniendo triĂĄngulo pequeño y blanco"] # 0x27c1 (en: 'white triangle containing small white triangle') + - "⟂": # 0x27c2 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "perpendicular a" # (en: 'perpendicular to') + - "⟃": # 0x27c3 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "un subconjunto de" # (en: 'an open subset of') + - "⟄": # 0x27c4 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "un subconjunto de" # (en: 'an open superset of') + - "⟅": [T: "sĂ­mbolo delimitador con forma de s inversa"] # 0x27c5 (en: 'left s-shaped bag delimiter') + - "⟆": [T: "sĂ­mbolo delimitador con forma de s"] # 0x27c6 (en: 'right s-shaped bag delimiter') + - "⟇": [T: "o con punto en el interior"] # 0x27c7 (en: 'or with dot inside') + - "⟈": [T: "solidus inverso precediendo subconjunto"] # 0x27c8 (en: 'reverse solidus preceding subset') + - "⟉": [T: "superconjunto precediendo solidus"] # 0x27c9 (en: 'superset preceding solidus') + - "⟊": [T: "barra vertical con trazo horizontal"] # 0x27ca (en: 'vertical bar with horizontal stroke') + - "⟋": [T: "diagonal ascendiente"] # 0x27cb (en: 'mathematical rising diagonal', google: 'diagonal matemĂĄtica en ascenso') + - "⟌": [T: "divisiĂłn larga"] # 0x27cc (en: 'long division') + - "⟍": [T: "diagonal descendente"] # 0x27cd (en: 'mathematical falling diagonal', google: 'diagonal de caĂ­da matemĂĄtica') + - "⟎": [T: "cuadrado LĂłgico Y"] # 0x27ce (en: 'squared logical and', google: 'cuadrado lĂłgico y') + - "⟏": [T: "cuadrado LĂłgico O"] # 0x27cf (en: 'squared logical or', google: 'cuadrado lĂłgico o') + - "⟐": [T: "diamante blanco con punto centrado"] # 0x27d0 (en: 'white diamond with centered dot') + - "⟑": [T: "y con punto interior"] # 0x27d1 (en: 'and with dot') + - "⟒": [T: "elemento de apertura hacia arriba"] # 0x27d2 (en: 'element of opening upwards') + - "⟓": [T: "esquina inferior derecha con punto"] # 0x27d3 (en: 'lower right corner with dot') + - "⟔": [T: "esquina superior izquierda con punto"] # 0x27d4 (en: 'upper left corner with dot') + - "⟕": [T: "uniĂłn exterior izquierda"] # 0x27d5 (en: 'left outer join') + - "⟖": [T: "uniĂłn exterior derecha"] # 0x27d6 (en: 'right outer join') + - "⟗": [T: "uniĂłn exterior llena de"] # 0x27d7 (en: 'full outer join') + - "⟘": [T: "perpendicular inversa"] # 0x27d8 (en: 'large up tack') + - "⟙": [T: "perpendicular"] # 0x27d9 (en: 'large down tack') + - "⟚": [T: "izquierdo y derecho doble torniquete"] # 0x27da (en: 'left and right double turnstile') + - "⟛": [T: "doble T horizontal"] # 0x27db (en: 'left and right tack') + - "⟜": [T: "multifunciĂłn por la izquierda"] # 0x27dc (en: 'left multimap') + - "⟝": [T: "t horizontal derecha"] # 0x27dd (en: 'long right tack', MathPlayer: 'T horizontal derecha larga', google: 'tachuela a la derecha larga') + - "⟞": [T: "t horizontal izquierda"] # 0x27de (en: 'long left tack', MathPlayer: 'T horizontal izquierda larga', google: 'tĂĄctica izquierda larga') + - "⟟": [T: "perpendicular inversa con cĂ­rculo arriba"] # 0x27df (en: 'up tack with circle above') + - "⟠": [T: "rombo dividido por regla horizontal"] # 0x27e0 (en: 'lozenge divided by horizontal rule') + - "⟡": [T: "rombo blanco cĂłncavo"] # 0x27e1 (en: 'white concave sided diamond') + - "⟱": [T: "rombo blanco cĂłncavo con marca hacia la izquierda"] # 0x27e2 (en: 'white concave sided diamond with leftwards tick') + - "⟣": [T: "rombo cĂłncavo con marca hacia la derecha"] # 0x27e3 (en: 'white concave sided diamond with rightwards tick') + - "⟀": [T: "cuadrado blanco con marca hacia la izquierda"] # 0x27e4 (en: 'white square with leftwards tick') + - "⟄": [T: "cuadrado blanco con marca hacia la derecha"] # 0x27e5 (en: 'white square with rightwards tick') + - "⟩": [T: "abrir corchete"] # 0x27e6 (en: 'left white square bracket') + - "⟧": [T: "cerrar corchete"] # 0x27e7 (en: 'right white square bracket') + - "⟹": [T: "soporte angular izquierdo"] # 0x27e8 (en: 'left angle bracket') + - "⟩": [T: "soporte angular derecho"] # 0x27e9 (en: 'right angle bracket') + - "âŸȘ": [T: "doble corchetehacia la izquierda"] # 0x27ea (en: 'left double angle bracket') + - "⟫": [T: "doble corchete hacia la derecha"] # 0x27eb (en: 'right double angle bracket') + - "⟬": [T: "corchete blanco hacia la izquierda con concha de tortuga"] # 0x27ec (en: 'left white tortoise shell bracket') + - "⟭": [T: "corchete blanco hacia la derecha con concha de tortuga"] # 0x27ed (en: 'right white tortoise shell bracket', MathPlayer: 'corchete de tortuga vacĂ­o derecho', google: 'soporte de carcasa de tortuga blanca derecha') + - "⟼": [T: "parĂ©ntesis plano izquierdo"] # 0x27ee (en: 'left flattened parenthesis') + - "⟯": [T: "parĂ©ntesis plano derecho"] # 0x27ef (en: 'right flattened parenthesis') + - "⟰": [T: "flecha cuĂĄdruple hacia arriba"] # 0x27f0 (en: 'upwards quadruple arrow') + - "⟱": [T: "flecha cuĂĄdruple hacia abajo"] # 0x27f1 (en: 'downwards quadruple arrow') + - "âŸČ": [T: "flecha circular vacĂ­a en sentido contrario a las agujas del reloj"] # 0x27f2 (en: 'anticlockwise gapped circle arrow') + - "⟳": [T: "flecha circular vacĂ­a en sentido a las agujas del reloj"] # 0x27f3 (en: 'clockwise gapped circle arrow') + - "⟮": [T: "flecha hacia la derecha con signo mĂĄs rodeado por un cĂ­rculo"] # 0x27f4 (en: 'right arrow with circled plus') + - "⟔": [T: "flecha larga hacia la izquierda"] # 0x27f5 (en: 'long leftwards arrow') + - "⟶": [T: "flecha larga hacia la derecha"] # 0x27f6 (en: 'long rightwards arrow') + - "⟷": [T: "flecha larga hacia izquierda y derecha"] # 0x27f7 (en: 'long left right arrow') + - "⟾": [T: "doble flecha larga hacia la izquierda"] # 0x27f8 (en: 'long leftwards double arrow') + - "âŸč": [T: "doble flecha larga hacia la derecha"] # 0x27f9 (en: 'long rightwards double arrow') + - "âŸș": [T: "doble flecha larga hacia izquierda y derecha"] # 0x27fa (en: 'long left right double arrow') + - "⟻": [T: "flecha larga hacia la izquierda partiendo de una barra"] # 0x27fb (en: 'long leftwards arrow from bar') + - "⟌": [T: "flecha larga hacia la derecha partiendo de una barra"] # 0x27fc (en: 'long rightwards arrow from bar') + - "⟜": [T: "doble flecha larga hacia la izquierda partiendo de una barra"] # 0x27fd (en: 'long leftwards double arrow from bar') + - "⟟": [T: "doble flecha larga hacia la derecha partiendo de una barra"] # 0x27fe (en: 'long rightwards double arrow from bar') + - "⟿": [T: "flecha ondulada hacia la derecha"] # 0x27ff (en: 'long rightwards squiggle arrow') + - " ": [T: "flecha de dos cabezas hacia la derecha con trazo vertical"] # 0x2900 (en: 'rightwards two headed arrow with vertical stroke', google: 'derecho de dos flechas con trazo vertical') + - " ": [T: "flecha de dos cabezas hacia la derecha con doble trazo vertical"] # 0x2901 (en: 'rightwards two headed arrow with double vertical stroke', google: 'derecho de dos flechas con cabeza de carrera vertical doble') + - " ": [T: "doble flecha hacia la izquierda con trazo vertical"] # 0x2902 (en: 'leftwards double arrow with vertical stroke', google: 'flecha doble hacia la izquierda con carrera vertical') + - " ": [T: "doble flecha hacia la derecha con trazo vertical"] # 0x2903 (en: 'rightwards double arrow with vertical stroke', google: 'arrow doble hacia la derecha con trazo vertical') + - " ": [T: "doble flecha hacia izquierda y derecha con trazo vertical"] # 0x2904 (en: 'left right double arrow with vertical stroke', google: 'flecha doble derecha izquierda con carrera vertical') + - " ": [T: "flecha de dos cabezas hacia la derecha partiendo de una barra"] # 0x2905 + - " ": [T: "doble flecha hacia la izquierda partiendo de una barra"] # 0x2906 (en: 'leftwards double arrow from bar', google: 'flecha doble a la izquierda desde el bar') + - " ": [T: "flecha doble hacia la derecha partiendo de una barra"] # 0x2907 (en: 'rightwards double arrow from bar', google: 'arrow doble hacia la derecha desde el bar') + - " ": [T: "flecha hacia abajo con trazo horizontal"] # 0x2908 (en: 'downwards arrow with horizontal stroke') + - " ": [T: "flecha hacia arriba con trazo horizontal"] # 0x2909 (en: 'upwards arrow with horizontal stroke', google: 'arrow hacia arriba con trazo horizontal') + - " ": [T: "triple flecha hacia arriba"] # 0x290a (en: 'upwards triple arrow', google: 'arriba de arriba arriba') + - "​": [T: "triple flecha hacia abajo"] # 0x290b (en: 'downwards triple arrow', google: 'aleja hacia abajo') + - "‌": [T: "flecha doble discontinua hacia la izquierda"] # 0x290c + - "‍": [T: "doble flecha discontinua hacia la derecha"] # 0x290d + - "‎": [T: "triple flecha discontinua hacia la izquierda"] # 0x290e + - "‏": [T: "triple flecha discontinua hacia la derecha"] # 0x290f + - "‐": [T: "triple flecha discontinua con dos cabezas hacia la derecha"] # 0x2910 + - "‑": [T: "flecha hacia la derecha con trazo punteado"] # 0x2911 + - "‒": [T: "flecha hacia arriba partiendo de una barra"] # 0x2912 + - "–": [T: "flecha hacia abajo partiendo de una barra"] # 0x2913 + - "—": [T: "flecha hacia la derecha con cola y trazo vertical"] # 0x2914 (en: 'rightwards arrow with tail and vertical stroke', google: 'flecha hacia la derecha con cola y trazo vertical') + - "―": [T: "flecha hacia la derecha con cola y doble trazo vertical"] # 0x2915 (en: 'rightwards arrow with tail and double vertical stroke', google: 'flecha hacia la derecha con cola y trazo vertical doble') + - "‖": [T: "flecha hacia la derecha con cola y dos cabezas"] # 0x2916 + - "‗": [T: "flecha de dos cabezas hacia la derecha con cola con trazo vertical"] # 0x2917 (en: 'rightwards two headed arrow with tail with vertical stroke', google: 'derecho de dos flecha con la cola con trazo vertical') + - "‘": [T: "flecha de dos cabezas hacia la derecha con cola con doble trazo vertical"] # 0x2918 (en: 'rightwards two headed arrow with tail with double vertical stroke', google: 'derecho de dos flecha con la cola con trazo vertical doble') + - "’": [T: "cola de doble flecha hacia la izquierda"] # 0x2919 (en: 'leftwards arrow tail') + - "‚": [T: "cola de flecha hacia la derecha"] # 0x291a (en: 'rightwards arrow tail', google: 'tail de flecha hacia la derecha') + - "‛": [T: "doble flecha hacia la izquierda con cola"] # 0x291b (en: 'leftwards double arrow tail') + - "“": [T: "cola de doble flecha hacia la derecha"] # 0x291c (en: 'rightwards double arrow tail') + - "”": [T: "flecha izquierda hacia rombo lleno"] # 0x291d (en: 'leftwards arrow to filled diamond') + - "„": [T: "flecha derecha hacia rombo lleno"] # 0x291e (en: 'rightwards arrow to filled diamond') + - "‟": [T: "flecha izquierda desde barra hacia rombo lleno"] # 0x291f (en: 'leftwards arrow from bar to filled diamond') + - "†": [T: "flecha derecha desde barra hacia rombo lleno"] # 0x2920 (en: 'rightwards arrow from bar to filled diamond') + - "‥": [T: "flecha del noroeste y del sudeste"] # 0x2921 (en: 'north west and south east arrow', google: 'noroeste y arrow south east') + - "‹": [T: "flecha nordeste y sudoeste"] # 0x2922 (en: 'north east and south west arrow', google: 'north east y south west arrow') + - "‣": [T: "flecha hacia el noroeste con garfio"] # 0x2923 (en: 'north west arrow with hook') + - " ": [T: "flecha hacia el nordeste con garfio"] # 0x2924 (en: 'north east arrow with hook') + - " ": [T: "flecha hacia el sudeste con garfio"] # 0x2925 (en: 'south east arrow with hook') + - " ": [T: "flecha hacia el suroeste con garfio"] # 0x2926 (en: 'south west arrow with hook') + - "‧": [T: "flechas hacia el noroeste y hacia el nordeste"] # 0x2927 (en: 'north west arrow and north east arrow') + - "‚": [T: "flechas hacia el nordeste y hacia el sudeste"] # 0x2928 (en: 'north east arrow and south east arrow') + - "
": [T: "flechas hacia el sudeste y hacia el sudoeste"] # 0x2929 (en: 'south east arrow and south west arrow') + - "â€Ș": [T: "flechas hacia el sudoeste y hacia el noroeste"] # 0x292a (en: 'south west arrow and north west arrow') + - "‫": [T: "cruce de diagonal ascendente con diagonal descendente"] # 0x292b (en: 'rising diagonal crossing falling diagonal', google: 'cruce diagonal en ascenso caĂ­da diagonal') + - "‏": [T: "cruce de diagonal descendente con diagonal ascendente"] # 0x292c (en: 'falling diagonal crossing rising diagonal', google: 'cambio de cruce diagonal diagonal') + - "‭": [T: "flecha Sureste Cruzando Flecha Noreste"] # 0x292d (en: 'south east arrow crossing north east arrow', google: 'south east arrow crossing north east arrow') + - "‟": [T: "flecha nordeste atravesando flecha sudeste"] # 0x292e (en: 'north east arrow crossing south east arrow', google: 'north east arrow crossing south east arrow') + - " ": [T: "diagonal descendente atravesando flecha nordeste"] # 0x292f (en: 'falling diagonal crossing north east arrow', google: 'caĂ­da diagonal atravesando la flecha del noreste') + - "‰": [T: "diagonal ascendente atravesando flecha sudeste"] # 0x2930 (en: 'rising diagonal crossing south east arrow', google: 'cruce diagonal ascendente crossing south east arrow') + - "‱": [T: "flecha nordeste atravesando flecha noroeste"] # 0x2931 (en: 'north east arrow crossing north west arrow', google: 'north east arrow crossing north west arrow') + - "â€Č": [T: "flecha noroeste atravesando flecha nordeste"] # 0x2932 (en: 'north west arrow crossing north east arrow', google: 'north west arrow crossing north east arrow') + - "″": [T: "flecha ondulada apuntando hacia la derecha"] # 0x2933 (en: 'wave arrow pointing directly right') + - "‎": [T: "flecha hacia la derecha curvada hacia arriba"] # 0x2934 (en: 'arrow pointing rightwards then curving upwards', google: 'arrow apuntando hacia la derecha y luego curvando hacia arriba') + - "—": [T: "flecha hacia la derecha curvada hacia abajo"] # 0x2935 (en: 'arrow pointing rightwards then curving downwards') + - "‶": [T: "flecha hacia abajo curvada hacia la izquierda"] # 0x2936 (en: 'arrow pointing downwards then curving leftwards') + - "‷": [T: "flecha hacia abajo curvada hacia la derecha"] # 0x2937 (en: 'arrow pointing downwards then curving rightwards') + - "„": [T: "flecha semicircular hacia la derecha en sentido de las agujas del reloj"] # 0x2938 (en: 'right side arc clockwise arrow') + - "â€č": [T: "flecha semicircular hacia la izquierda en sentido contrario a las agujas del reloj"] # 0x2939 (en: 'left side arc anticlockwise arrow') + - "â€ș": [T: "arco superior en flecha en sentido contrario a las agujas del reloj"] # 0x293a (en: 'top arc anticlockwise arrow', google: 'arro de arco superior en sentido antihorario') + - "※": [T: "arco inferior en flecha hen sentido contrario a las agujas del reloj"] # 0x293b (en: 'bottom arc anticlockwise arrow', google: 'arco inferior de la flecha en sentido antihorario') + - "‌": [T: "flecha en sentido a las agujas del reloj, con arco superior y signo menos"] # 0x293c (en: 'top arc clockwise arrow with minus') + - "“": [T: "flecha en sentido contrario a las agujas del reloj, con arco superior y signo mĂĄs"] # 0x293d (en: 'top arc anticlockwise arrow with plus') + - "‟": [T: "flecha semicircular inferior en sentido a las agujas del reloj"] # 0x293e (en: 'lower right semicircular clockwise arrow', google: 'flecha semicircular inferior derecha en el sentido de las agujas del reloj') + - "‿": [T: "flecha semicircular inferior en sentido contrario a las agujas del reloj"] # 0x293f (en: 'lower left semicircular anticlockwise arrow', google: 'flecha semicircular inferior izquierda en sentido antihorario') + - "â„€": [T: "cĂ­rculo cerrado en sentido contrario a las agujas del reloj"] # 0x2940 (en: 'anticlockwise closed circle arrow', google: 'flecha de cĂ­rculo cerrado en sentido antihorario') + - "℁": [T: "cĂ­rculo cerrado en sentido de las agujas del reloj"] # 0x2941 (en: 'clockwise closed circle arrow', google: 'flecha del cĂ­rculo cerrado en el sentido de las agujas del reloj') + - "â„‚": [T: "flecha hacia la derecha sobre flecha corta hacia la izquierda"] # 0x2942 (en: 'rightwards arrow above short leftwards arrow') + - "℃": [T: "flecha hacia la izquierda sobre flecha corta hacia la derecha"] # 0x2943 (en: 'leftwards arrow above short rightwards arrow', google: 'flecha hacia la izquierda sobre la flecha corta derecha hacia la derecha') + - "â„„": [T: "flecha corta hacia la derecha sobre flecha hacia la izquierda"] # 0x2944 (en: 'short rightwards arrow above leftwards arrow', google: 'flecha corta hacia la derecha sobre la flecha hacia la izquierda') + - "â„…": [T: "flecha hacia la derecha con signo mĂĄs inferior"] # 0x2945 (en: 'rightwards arrow with plus below') + - "℆": [T: "flecha hacia la izquierda con signo mĂĄs inferior"] # 0x2946 (en: 'leftwards arrow with plus below', google: 'flecha hacia la izquierda con mĂĄs a continuaciĂłn') + - "ℇ": [T: "flecha hacia la derecha a travĂ©s de X"] # 0x2947 (en: 'rightwards arrow through x', google: 'flecha hacia la derecha a travĂ©s de x') + - "℈": [T: "flecha hacia la izquierda a travĂ©s de cĂ­rculo"] # 0x2948 (en: 'left right arrow through circle') + - "℉": [T: "flecha con dos cabezas haciarriba partiendo de un cĂ­rculo"] # 0x2949 (en: 'upwards two headed arrow from circle') + - "ℊ": [T: "arpĂłn con punta izquierda hacia arriba y punta derecha hacia abajo"] # 0x294a (en: 'left barb up right barb down harpoon', MathPlayer: 'left barb up right barb down harpoon', google: 'barb de la izquierda hacia arriba barb barb por harpoon') + - "â„‹": [T: "arpĂłn con punta izquierda hacia abajo y punta derecha hacia arriba"] # 0x294b (en: 'left barb down right barb up harpoon', MathPlayer: 'left barb down right barb up harpoon', google: 'barb de la izquierda hacia abajo barb en la barbilla hacia arriba') + - "ℌ": [T: "arpĂłn conpunta derecha hacia arriba y punta izquierda hacia abajo"] # 0x294c (google: 'barb a la derecha por barb harpoon izquierda') + - "ℍ": [T: "arpĂłn con punta izquierda hacia arriba y punta derecha hacia abajo"] # 0x294d (en: 'up barb left down barb right harpoon', google: 'barb a la barb izquierda por barb right harpoon') + - "ℎ": [T: "arpĂłn con puntas derecha e izquierda hacia arriba"] # 0x294e (en: 'left barb up right barb up harpoon', MathPlayer: 'arpĂłn superior derecha-izquierda', google: 'barb izquierda arriba barb arriba de barca') + - "ℏ": [T: "arpĂłn con puntas superior e inferior hacia la derecha"] # 0x294f (en: 'up barb right down barb right harpoon') + - "ℐ": [T: "arpĂłn con puntas derecha e izquierda hacia abajo"] # 0x2950 (en: 'left barb down right barb down harpoon', MathPlayer: 'arpĂłn inferior derecha-izquierda', google: 'barb de la izquierda hacia abajo barb barb por harpoon') + - "â„‘": [T: "arpĂłn izquierdo con puntas hacia arriba y hacia abajo"] # 0x2951 (en: 'up barb left down barb left harpoon') + - "â„’": [T: "arpĂłn hacia la izquierda con punta hasta la barra"] # 0x2952 (en: 'leftwards harpoon with barb up to bar', MathPlayer: 'leftwards harpoon to bar with barb upwards', google: 'arpĂłn de la izquierda con barb hasta bar') + - "â„“": [T: "arpĂłn hacia la derecha con punta hasta la barra"] # 0x2953 (en: 'rightwards harpoon with barb up to bar', MathPlayer: 'rightwards harpoon to bar with barb upwards', google: 'arpoon a la derecha con barb hasta bar') + - "â„”": [T: "arpĂłn ascendente con punta derecha hacia la barra"] # 0x2954 (en: 'upwards harpoon with barb right to bar', MathPlayer: 'upwards harpoon to bar with barb rightwards', google: 'hacia arriba hacia arriba con barb directamente a bar') + - "â„•": [T: "arpĂłn hacia abajo con punta derecha hacia la barra"] # 0x2955 (en: 'downwards harpoon with barb right to bar', MathPlayer: 'downwards harpoon to bar with barb rightwards', google: 'harpoon hacia abajo con barb directamente a bar') + - "â„–": [T: "arpĂłn hacia la izquierda con punta descendente hacia la barra"] # 0x2956 (en: 'leftwards harpoon with barb down to bar', MathPlayer: 'leftwards harpoon to bar with barb downwards', google: 'arpĂłn de la izquierda con barb hasta el bar') + - "â„—": [T: "arpĂłn hacia la derecha con punta inferior hacia la barra"] # 0x2957 (en: 'rightwards harpoon with barb down to bar', MathPlayer: 'rightwards harpoon to bar with barb downwards', google: 'arpoon a la derecha con barb hasta bar') + - "℘": [T: "arpĂłn ascendente con punta izquierda hacia la barra"] # 0x2958 (en: 'upwards harpoon with barb left to bar', MathPlayer: 'upwards harpoon to bar with barb leftwards', google: 'hace arriba de barb con barb se fue a bar') + - "â„™": [T: "arpĂłn hacia abajo con punta izquierda hacia la barra"] # 0x2959 (en: 'downwards harpoon with barb left to bar', MathPlayer: 'downwards harpoon to bar with barb leftwards', google: 'arpĂłn hacia abajo con barb se fue a bar') + - "ℚ": [T: "arpĂłn hacia la izquierda con punta por encima de la barra"] # 0x295a (en: 'leftwards harpoon with barb up from bar', MathPlayer: 'leftwards harpoon from bar with barb upwards', google: 'arpĂłn de la izquierda con barb arriba desde el bar') + - "â„›": [T: "arpĂłn hacia la derecha con punta por encima de la barra"] # 0x295b (en: 'rightwards harpoon with barb up from bar', MathPlayer: 'rightwards harpoon from bar with barb upwards', google: 'arpoon a la derecha con barb up from bar') + - "ℜ": [T: "arpĂłn ascendente con punta partiendo de la barra"] # 0x295c (en: 'upwards harpoon with barb right from bar', MathPlayer: 'upwards harpoon from bar with barb rightwards', google: 'hacia arriba hacia arriba con barb directamente desde el bar') + - "ℝ": [T: "arpĂłn descendente con punta partiendo de la barra"] # 0x295d (en: 'downwards harpoon with barb right from bar', MathPlayer: 'downwards harpoon from bar with barb rightwards', google: 'arpĂłn hacia abajo con barb directamente desde el bar') + - "℞": [T: "arpĂłn hacia la izquierda con punta por debajo de la barra"] # 0x295e (en: 'leftwards harpoon with barb down from bar', MathPlayer: 'leftwards harpoon from bar with barb downwards', google: 'arpĂłn hacia la izquierda con barb down desde bar') + - "℟": [T: "arpĂłn hacia la derecha con punta por debajo de barra"] # 0x295f (en: 'rightwards harpoon with barb down from bar', MathPlayer: 'rightwards harpoon from bar with barb downwards', google: 'arpoon a la derecha con barb down desde bar') + - "â„ ": [T: "arpĂłn ascendente con punta a la izquierda de la barra"] # 0x2960 (en: 'upwards harpoon with barb left from bar', MathPlayer: 'upwards harpoon from bar with barb leftwards', google: 'hacia arriba de la arpĂłn con barb se queda desde el bar') + - "℥": [T: "arpĂłn descendente con punta a la izquierda de la barra"] # 0x2961 (en: 'downwards harpoon with barb left from bar', MathPlayer: 'downwards harpoon from bar with barb leftwards', google: 'arpĂłn hacia abajo con barb se queda desde el bar') + - "ℹ": [T: "arpĂłn hacia la izquierda con punta por encima de arpon hacia la izquierda con punta hacia abajo"] # 0x2962 (en: 'leftwards harpoon with barb up above leftwards harpoon with barb down', MathPlayer: 'leftwards harpoon with barb up above leftwards harpoon with barb down', google: 'arpĂłn de la izquierda con barb arriba sobre la arpĂłn hacia la izquierda con barb down') + - "℣": [T: "arpĂłn ascendente con punta hacia la izquierda al lado de arpĂłn ascendente con punta hacia la derecha"] # 0x2963 (en: 'upwards harpoon with barb left beside upwards harpoon with barb right', MathPlayer: 'upwards harpoon with barb left beside upwards harpoon with barb right', google: 'hacia arriba de la arpĂłn con barb izquierda junto a la arpĂłn hacia arriba con barb a la derecha') + - "â„€": [T: "arpĂłn hacia la derecha con punta por encima de arpĂłn hacia la derecha con punta hacia abajo"] # 0x2964 (en: 'rightwards harpoon with barb up above rightwards harpoon with barb down', MathPlayer: 'rightwards harpoon with barb up above rightwards harpoon with barb down', google: 'arpoon a la derecha con barb arriba sobre la arpĂłn de la derecha con barb down') + - "â„„": [T: "arpĂłn hacia abajo con lengĂŒeta a la izquierda al lado arpĂłn hacia abajo con lengĂŒeta a la derecha"] # 0x2965 (en: 'downwards harpoon with barb left beside downwards harpoon with barb right', MathPlayer: 'downwards harpoon with barb left beside downwards harpoon with barb right', google: 'arpĂłn hacia abajo con barb izquierda junto a la arpĂłn hacia abajo con barb a la derecha') + - "ℊ": [T: "arpĂłn a la izquierda con punta por encima de arpĂłn a la derecha con punta hacia arriba"] # 0x2966 (en: 'leftwards harpoon with barb up above rightwards harpoon with barb up', MathPlayer: 'leftwards harpoon with barb up above rightwards harpoon with barb up', google: 'arpĂłn hacia la izquierda con barb arriba sobre la arpĂłn hacia la derecha con barb') + - "â„§": [T: "arpĂłn a la izquierda con punta hacia abajo por encima de arpĂłn a la derecha con punta hacia abajo"] # 0x2967 (en: 'leftwards harpoon with barb down above rightwards harpoon with barb down', MathPlayer: 'leftwards harpoon with barb down above rightwards harpoon with barb down', google: 'arpĂłn de la izquierda con barb hacia abajo sobre la arpĂłn hacia la derecha con barb down') + - "ℚ": [T: "arpĂłn a la derecha con punta hacia arriba por encima de arpĂłn hacia la izquierda con punta hacia arriba"] # 0x2968 (en: 'rightwards harpoon with barb up above leftwards harpoon with barb up', MathPlayer: 'rightwards harpoon with barb up above leftwards harpoon with barb up', google: 'arpoon a la derecha con barb arriba sobre la arpĂłn de la izquierda con barb hacia arriba') + - "â„©": [T: "arpĂłn a la derecha con punta hacia abajo por encima de arpĂłn a la izquierda con punta hacia abajo"] # 0x2969 (en: 'rightwards harpoon with barb down above leftwards harpoon with barb down', MathPlayer: 'rightwards harpoon with barb down above leftwards harpoon with barb down', google: 'arpĂłn a la derecha con barb hacia abajo sobre la arpĂłn hacia la izquierda con barb down') + - "â„Ș": [T: "arpĂłn hacia la izquierda con punta hacia arriba por encima de raya larga discontinua"] # 0x296a (en: 'leftwards harpoon with barb up above long dash') + - "â„«": [T: "arpĂłn hacia la izquierda con punta hacia abajo por debajo de raya larga discontinua"] # 0x296b (en: 'leftwards harpoon with barb down below long dash') + - "ℏ": [T: "arpĂłn hacia la derecha con punta por encima de raya larga discontinua"] # 0x296c (en: 'rightwards harpoon with barb up above long dash') + - "â„­": [T: "arpĂłn hacia la derecha con punta hacia abajo por debajo de raya larga discontinua"] # 0x296d (en: 'rightwards harpoon with barb down below long dash') + - "℟": [T: "arpĂłn ascendente con punta a la izquierda al lado arpĂłn descendente con punta a la derecha"] # 0x296e (en: 'upwards harpoon with barb left beside downwards harpoon with barb right', MathPlayer: 'upwards harpoon to the left of downwards harpoon', google: 'hacia arriba de la arpĂłn con barb izquierda junto al arpĂłn hacia abajo con barb a la derecha') + - "ℯ": [T: "arpĂłn hacia abajo con lengĂŒeta a la izquierda al lado arpĂłn hacia arriba con lengĂŒeta a la derecha"] # 0x296f (en: 'downwards harpoon with barb left beside upwards harpoon with barb right', MathPlayer: 'upwards harpoon to the right of downwards harpoon', google: 'arpĂłn hacia abajo con barb izquierda junto a la arpĂłn hacia arriba con barb a la derecha') + - "â„°": [T: "flecha doble hacia la derecha con cabeza redondeada"] # 0x2970 (en: 'right double arrow with rounded head') + - "ℱ": [T: "flecha hacia la derecha con signo igual por encima"] # 0x2971 (en: 'equals above rightwards arrow') + - "â„Č": [T: "flecha con tilde"] # 0x2972 (en: 'tilde operator above rightwards arrow') + - "ℳ": [T: "tilde con flecha"] # 0x2974 (en: 'rightwards arrow above tilde operator') + - "â„”": [T: "flecha hacia la derecha por encima de signo casi igual a"] # 0x2975 (en: 'rightwards arrow above almost equal to') + - "â„¶": [T: "signo menor que por encima de flecha hacia la izquierda"] # 0x2976 (en: 'less than above leftwards arrow') + - "â„·": [T: "flecha hacia la izquierda atravesando signo menor que"] # 0x2977 (en: 'leftwards arrow through less than') + - "℞": [T: "signo mayor que por encima de flecha hacia la derecha"] # 0x2978 (en: 'greater than above rightwards arrow') + - "â„č": [T: "subconjunto por encima de flecha hacia la derecha"] # 0x2979 (en: 'subset above rightwards arrow') + - "â„ș": [T: "flecha hacia la izquierda a travĂ©s de subconjunto"] # 0x297a (en: 'leftwards arrow through subset') + - "â„»": [T: "superconjunto por encima de flecha hacia la izquierda"] # 0x297b (en: 'superset above leftwards arrow') + - "ℌ": [T: "cola de pez izquierda"] # 0x297c (en: 'left fish tail', MathPlayer: 'left fish tail', google: 'cola de pescado izquierdo') + - "ℜ": [T: "cola de pez derecha"] # 0x297d (en: 'right fish tail', MathPlayer: 'right fish tail', google: 'cola de pescado derecho') + - "℟": [T: "cola de pez hacia arriba"] # 0x297e (en: 'up fish tail') + - "ℿ": [T: "cola de pez haciaabajo"] # 0x297f (en: 'down fish tail', MathPlayer: 'down fish tail', google: 'abajo de la cola de pescado') + - "⩀": [T: "delimitador triple barra vertical"] # 0x2980 (en: 'triple vertical bar delimiter', google: 'delimitador de triple barra vertical') + - "⊁": [T: "punto de notaciĂłn Z"] # 0x2981 (en: 'z notation spot', google: 'z spot de notaciĂłn') + - "⩂": [T: "tipo de notaciĂłn Z Colon"] # 0x2982 (en: 'z notation type colon', google: 'z tipo de notaciĂłn colon') + - "⊃": [T: "soporte rotacional blanco izquierdo"] # 0x2983 (en: 'left white brace', google: 'brace blanco izquierdo') + - "⩄": [T: "soporte rotacional blanco derecho"] # 0x2984 (en: 'right white brace', google: 'brace blanco derecho') + - "⩅": [T: "parĂ©ntesis izquierdo"] # 0x2985 (en: 'left white parenthesis') + - "⩆": [T: "parĂ©ntesis derecho"] # 0x2986 (en: 'right white parenthesis') + - "⩇": [T: "notaciĂłn Z izquierda soporte de imagen"] # 0x2987 (en: 'z notation left image bracket', google: 'z notaciĂłn del soporte de la imagen izquierda') + - "⊈": [T: "notaciĂłn Z derecha soporte de imagen"] # 0x2988 (en: 'z notation right image bracket', google: 'z notaciĂłn de la imagen correcta soporte de imagen') + - "⩉": [T: "notaciĂłn Z izquierda unida a soporte"] # 0x2989 + - "⩊": [T: "notaciĂłn Z derecha unida a soporte"] # 0x298a + - "⩋": [T: "corchete izquierdo con barra ijnferior"] # 0x298b (en: 'left square bracket with underbar') + - "⩌": [T: "corchete derecho con barra inferior"] # 0x298c (en: 'right square bracket with underbar') + - "⊍": [T: "corchete izquierdo con trazo en esquina superior"] # 0x298d (en: 'left square bracket with tick in top corner') + - "⊎": [T: "corchete derecho con trazo en esquina inferior"] # 0x298e (en: 'right square bracket with tick in bottom corner') + - "⊏": [T: "corchete izquierdo con trazo en esquina inferior"] # 0x298f (en: 'left square bracket with tick in bottom corner') + - "⊐": [T: "corchete derecho con trazo en esquina superior"] # 0x2990 (en: 'right square bracket with tick in top corner') + - "⩑": [T: "ĂĄngulo izquierdo de corchete con punto"] # 0x2991 + - "⩒": [T: "ĂĄngulo derecho de corchete con punto"] # 0x2992 + - "⩓": [T: "arco izquierdo menor que soporte"] # 0x2993 + - "⩔": [T: "arco derecho mayor que soporte"] # 0x2994 + - "⩕": [T: "doble arco izquierdo mayor que soporte"] # 0x2995 + - "⩖": [T: "doble arco derecho menor que soporte"] # 0x2996 + - "⩗": [T: "soporte de concha de tortuga negra izquierda"] # 0x2997 (en: 'left black tortoise shell bracket') + - "⊘": [T: "soporte con concha de tortuga a la derecha"] # 0x2998 (en: 'right black tortoise shell bracket', google: 'soporte de carcasa de tortuga negra derecha') + - "⩙": [T: "valla punteada"] # 0x2999 (en: 'dotted fence') + - "⩚": [T: "lĂ­nea vertical en zigzag"] # 0x299a (en: 'vertical zigzag line') + - "⩛": [T: "Ángulo medido de apertura a la izquierda"] # 0x299b (en: 'measured angle opening left', google: 'apertura de ĂĄngulo medido a la izquierda') + - "⩜": [T: "Variante de ĂĄngulo recto con cuadrado"] # 0x299c (en: 'right angle variant with square', google: 'variante de ĂĄngulo recto con cuadrado') + - "⊝": [T: "ĂĄngulo recto medido con punto"] # 0x299d (en: 'measured right angle with dot') + - "⊞": [T: "Ángulo con S dentro"] # 0x299e (en: 'angle with s inside', google: 'ĂĄngulo con s adentro') + - "⩟": [T: "Ángulo agudo"] # 0x299f (en: 'acute angle', google: 'ĂĄngulo agudo') + - "⊠": [T: "Ángulo esfĂ©rico de apertura a la izquierda"] # 0x29a0 (en: 'spherical angle opening left', google: 'abertura del ĂĄngulo esfĂ©rico izquierda') + - "⊥": [T: "ĂĄngulo esfĂ©rico con apertura hacia arriaba"] # 0x29a1 (en: 'spherical angle opening up', google: 'abertura del ĂĄngulo esfĂ©rico') + - "⊹": [T: "ĂĄngulo girado"] # 0x29a2 (en: 'turned angle', google: 'ĂĄngulo girado') + - "⊣": [T: "Ángulo invertido"] # 0x29a3 (en: 'reversed angle', google: 'ĂĄngulo invertido') + - "⊀": [T: "ĂĄngulo con barra inferior"] # 0x29a4 (en: 'angle with underbar') + - "⊄": [T: "ĂĄngulo invertido con barra inferior"] # 0x29a5 (en: 'reversed angle with underbar') + - "⊊": [T: "ĂĄngulo oblicuo abierto hacia arriba"] # 0x29a6 (en: 'oblique angle opening up') + - "⊧": [T: "ĂĄngulo oblicuo abierto hacia abajo"] # 0x29a7 (en: 'oblique angle opening down') + - "⊚": [T: "ĂĄngulo medio con brazo extendido terminando en flecha hacia arriba y hacia la derecha"] # 0x29a8 + - "⊩": [T: "ĂĄngulo medio con brazo extendido terminando en flecha hacia arriba y hacia la izquierda"] # 0x29a9 + - "âŠȘ": [T: "ĂĄngulo medio con brazo extendido terminando en flecha hacia abajo y hacia la derecha"] # 0x29aa + - "⊫": [T: "ĂĄngulo medio con brazo extendido terminando en flecha hacia abajo y hacia la izquierda"] # 0x29ab + - "⊏": [T: "ĂĄngulo medio con brazo extendido terminando en flecha hacia la derecha y hacia arriba"] # 0x29ac + - "⊭": [T: "ĂĄngulo medio con brazo extendido terminando en flecha apuntando hacia la izquierda y hacia arriba"] # 0x29ad + - "⊟": [T: "ĂĄngulo medio con brazo extendido terminando en flecha hacia la derecha y hacia abajo"] # 0x29ae + - "⊯": [T: "ĂĄngulo medio con brazo extendido terminando en flecha hacia la izquierda y hacia abajo"] # 0x29af + - "⊰": [T: "conjunto vacĂ­o invertido"] # 0x29b0 (en: 'reversed empty set') + - "⊱": [T: "conjunto vacĂ­o con barra superior"] # 0x29b1 (en: 'empty set with overbar') + - "âŠČ": [T: "conjunto vacĂ­o con cĂ­rculo pequeño encima"] # 0x29b2 (en: 'empty set with small circle above') + - "⊳": [T: "conjunto vacĂ­o con flecha derecha encima"] # 0x29b3 (en: 'empty set with right arrow above') + - "⊎": [T: "conjunto vacĂ­o con flecha izquierda encima"] # 0x29b4 (en: 'empty set with left arrow above') + - "⊔": [T: "cĂ­rculo con barra horizontal"] # 0x29b5 (en: 'circle with horizontal bar') + - "⊶": [T: "barra vertical rodeada por un cĂ­rculo"] # 0x29b6 (en: 'circled vertical bar') + - "⊷": [T: "paralelas rodeadas por un cĂ­rculo"] # 0x29b7 (en: 'circled parallel') + - "⊞": [T: "solidus en cĂ­rculo inverso"] # 0x29b8 (en: 'circled reverse solidus', google: 'solidus reverso en circulaciĂłn') + - "âŠč": [T: "perpendicular rodeada por un cĂ­rculo"] # 0x29b9 (en: 'circled perpendicular') + - "âŠș": [T: "cĂ­rculo dividido por barra horizontal y mitad superior dividido por barra vertical"] # 0x29ba (en: 'circled divided by horizontal bar and top half divided by vertical bar', google: 'cĂ­rculo dividido por la barra horizontal y la mitad superior dividida por la barra vertical') + - "⊻": [T: "cĂ­rculo con x superpuesta"] # 0x29bb (en: 'circle with superimposed x') + - "⊌": [T: "cĂ­rculo en sentido contrario a las agujas del reloj virando a signo de divisiĂłn"] # 0x29bc (en: 'circled anticlockwise rotated division sign') + - "⊜": [T: "flecha hacia arriba a travĂ©s de cĂ­rculo"] # 0x29bd (en: 'up arrow through circle', google: 'arrow a travĂ©s del cĂ­rculo') + - "⊟": [T: "viñeta vacĂ­a en un cĂ­rculo"] # 0x29be (en: 'circled white bullet') + - "⊿": [T: "viñeta en un cĂ­rculo"] # 0x29bf (en: 'circled bullet') + - "⧀": [T: "signo menor que en un cĂ­rculo"] # 0x29c0 (en: 'circled less than') + - "⧁": [T: "signo mayor que en un cĂ­rculo"] # 0x29c1 (en: 'circled greater than') + - "⧂": [T: "cĂ­rculo con cĂ­rculo pequeño a la derecha"] # 0x29c2 (en: 'circle with small circle to the right') + - "⧃": [T: "cĂ­rculo con dos trazos horizontales a la derecha"] # 0x29c3 + - "⧄": [T: "cuadrado con diagonal ascendente"] # 0x29c4 (en: 'squared rising diagonal slash') + - "⧅": [T: "cuadrado con diagonal descendente"] # 0x29c5 (en: 'squared falling diagonal slash') + - "⧆": [T: "asterisco cuadrado"] # 0x29c6 (en: 'squared asterisk') + - "⧇": [T: "pequeño cĂ­rculo cuadrado"] # 0x29c7 (en: 'squared small circle', google: 'cĂ­rculo pequeño cuadrado') + - "⧈": [T: "cuadrado cuadrado"] # 0x29c8 (en: 'squared square') + - "⧉": [T: "dos cuadrados unidos"] # 0x29c9 (en: 'two joined squares') + - "⧊": [T: "triĂĄngulo con punto arriba"] # 0x29ca (en: 'triangle with dot above') + - "⧋": [T: "triĂĄngulo con barra inferior"] # 0x29cb (en: 'triangle with underbar', google: 'triĂĄngulo con debajo de la barra') + - "⧌": [T: "s dentro de un triangulo"] # 0x29cc (en: 's in triangle', google: 's en triĂĄngulo') + - "⧍": [T: "triĂĄngulo con serifs en la parte inferior"] # 0x29cd + - "⧎": [T: "triĂĄngulo hacia la derecha sobre triĂĄngulo hacia la izquierda"] # 0x29ce (en: 'right triangle above left triangle') + - "⧏": [T: "triĂĄngulo izquierdo al lado de barra vertical"] # 0x29cf (en: 'left triangle beside vertical bar') + - "⧐": [T: "barra vertical al lado de triĂĄngulo derecho"] # 0x29d0 (en: 'vertical bar beside right triangle') + - "⧑": [T: "pajarita Con Mitad Izquierda Negra"] # 0x29d1 (en: 'bowtie with left half black', google: 'bowtie con la mitad de la izquierda') + - "⧒": [T: "pajarita Con Mitad Derecha Negra"] # 0x29d2 (en: 'bowtie with right half black', google: 'bowtie con la mitad derecha negra') + - "⧓": [T: "pajarita Negra"] # 0x29d3 (en: 'black bowtie', google: 'bowtie negro') + - "⧔": [T: "multiplicado por con mitad izquierda negra"] # 0x29d4 (en: 'times with left half black', google: 'veces con la mitad de la izquierda') + - "⧕": [T: "multiplicado por con mitad derecha negra"] # 0x29d5 (en: 'times with right half black', google: 'veces con la mitad derecha negra') + - "⧖": [T: "reloj de arena blanco"] # 0x29d6 (en: 'white hourglass', google: 'hourglass blancos') + - "⧗": [T: "reloj de arena negro"] # 0x29d7 (en: 'black hourglass', google: 'hourglass negros') + - "⧘": [T: "valla izquierda ondulada"] # 0x29d8 (en: 'left wiggly fence', google: 'left fence wiggly') + - "⧙": [T: "valla derecha ondulada"] # 0x29d9 (en: 'right wiggly fence', google: 'derecha cerca ondulada') + - "⧚": [T: "valla doble izquierda ondulada"] # 0x29da + - "⧛": [T: "valla doble derecha ondulada"] # 0x29db + - "⧜": [T: "infinito incompleto"] # 0x29dc (en: 'incomplete infinity') + - "⧝": [T: "infinito"] # 0x29dd (en: 'tie over infinity', google: 'ate el infinito') + - "⧞": [T: "no infinito"] # 0x29de (en: 'infinity negated with vertical bar') + - "⧟": [T: "multimapa de doble extremo"] # 0x29df (en: 'double-ended multimap') + - "â§ ": [T: "cuadrado con contorno delineado"] # 0x29e0 (en: 'square with contoured outline') + - "â§Ą": [T: "aumenta a medida que"] # 0x29e1 (en: 'increases as') + - "â§ą": [T: "producto aleatorio"] # 0x29e2 (en: 'shuffle product', google: 'producto de baraja') + - "â§Ł": [T: "signo igual y paralela inclinada"] # 0x29e3 (en: 'equals sign and slanted parallel', MathPlayer: 'igual tachado doble', google: 'es igual a la señal y se inclinĂł paralelo') + - "â§€": [T: "signo igual y paralela inclinada con tilde por encima"] # 0x29e4 (en: 'equals sign and slanted parallel with tilde above') + - "â§„": [T: "idĂ©ntico a una paralela inclinada"] # 0x29e5 (en: 'identical to and slanted parallel') + - "â§Š": [T: "gleich Stark"] # 0x29e6 (en: 'gleich stark', google: 'gleich stark') + - "â§§": [T: "termodinĂĄmica"] # 0x29e7 (en: 'thermodynamic', google: 'termodinĂĄmico') + - "â§š": [T: "triĂĄngulo apuntando hacia abajo con la mitad izquierda negra"] # 0x29e8 (en: 'down pointing triangle with left half black', google: 'down pointing triangle con la mitad izquierda') + - "â§©": [T: "triĂĄngulo apuntando hacia abajo con la mitad derecha negra"] # 0x29e9 (en: 'down pointing triangle with right half black', google: 'down apuntando al triĂĄngulo con la mitad derecha negra') + - "â§Ș": [T: "rombo negro con flecha hacia abajo"] # 0x29ea (en: 'black diamond with down arrow') + - "â§«": [T: "rombo relleno"] # 0x29eb (en: 'black lozenge') + - "â§Ź": [T: "cĂ­rculo blanco con flecha hacia abajo"] # 0x29ec (en: 'white circle with down arrow') + - "â§­": [T: "cĂ­rculo negro con flecha hacia abajo"] # 0x29ed (en: 'black circle with down arrow') + - "â§ź": [T: "cuadrado blanco con error barrado"] # 0x29ee (en: 'error-barred white square', google: 'cuadrado blanco con barra de error') + - "â§Ż": [T: "cuadrado negro con error barrado"] # 0x29ef (en: 'error-barred black square', google: 'cuadrado negro con barra de error') + - "â§°": [T: "rombo blanco con error barrado"] # 0x29f0 (en: 'error-barred white diamond', google: 'diamante blanco con accesorios de error') + - "â§±": [T: "rombo negro con error barrado"] # 0x29f1 (en: 'error-barred black diamond', google: 'diamante negro con accesorios de error') + - "â§Č": [T: "cĂ­rculo blanco con error barrado"] # 0x29f2 (en: 'error-barred white circle', google: 'cĂ­rculo blanco con barra de error') + - "â§ł": [T: "cĂ­rculo negro con error barrado"] # 0x29f3 (en: 'error-barred black circle', google: 'cĂ­rculo negro con barra de error') + - "â§Ž": [T: "regla retardada"] # 0x29f4 (en: 'rule-delayed') + - "â§”": [T: "operador de Solidus Inverso"] # 0x29f5 (en: 'reverse solidus operator', google: 'operador reverso de solidus') + - "â§¶": [T: "solidus con barra superior"] # 0x29f6 + - "â§·": [T: "solidus inverso con trazo horizontal"] # 0x29f7 (en: 'reverse solidus with horizontal stroke', google: 'reverse solidus con carrera horizontal') + - "â§ž": [T: "sĂłlido grande"] # 0x29f8 (en: 'big solidus', google: 'big solidus') + - "â§č": [T: "solidus inverso grande"] # 0x29f9 (en: 'big reverse solidus', google: 'big reverso solidus') + - "â§ș": [T: "doble signo mĂĄs"] # 0x29fa (en: 'double plus', google: 'doble mĂĄs') + - "â§»": [T: "triple signo mĂĄs"] # 0x29fb (en: 'triple plus', google: 'triple plus') + - "â§Œ": [T: "parĂ©ntesis con ĂĄngulo curvado hacia la izquierda"] # 0x29fc (en: 'left pointing curved angle bracket', google: 'soporte de ĂĄngulo curvo de apuntamiento izquierdo') + - "â§œ": [T: "parĂ©ntesis con ĂĄngulo curvado hacia la derecha"] # 0x29fd (en: 'right pointing curved angle bracket', google: 'soporte de ĂĄngulo curvo apuntando a la derecha') + - "â§Ÿ": [T: "minĂșsculo"] # 0x29fe (en: 'tiny', google: 'diminuto') + - "â§ż": [T: "miny"] # 0x29ff + - "⹀": [T: "operador de puntos circulares N-Ary"] # 0x2a00 (en: 'circled dot operator', google: 'operador de puntos en circulaciĂłn') + - "⚁": [T: "operador N-Ary con signo mĂĄs en un cĂ­rculo"] # 0x2a01 (en: 'circled plus operator', google: 'operador circlado plus') + - "⹂": [T: "operador N-Ary con signo multiplicado por dentro de un cĂ­rculo"] # 0x2a02 (en: 'circled times operator', google: 'operador de times en circulaciĂłn') + - "⚃": [T: "operador de la uniĂłn N-Ary con punto"] # 0x2a03 (en: 'union operator with dot', google: 'operador sindical con dot') + - "⹄": [T: "n-Ary Union Operator con signo mĂĄs"] # 0x2a04 (en: 'union operator with plus', google: 'operador sindical con mĂĄs') + - "⹅": [T: "operador de intersecciones cuadradas N-Ary"] # 0x2a05 (en: 'square intersection operator', google: 'operador de intersecciĂłn cuadrada') + - "⹆": [T: "n-Ary Square Union Operator"] # 0x2a06 (en: 'square union operator', google: 'operador de la uniĂłn square') + - "⹇": [T: "dos lĂłgico y operador"] # 0x2a07 (en: 'two logical and operator', google: 'dos lĂłgicos y operadores') + - "⚈": [T: "dos lĂłgico u operador"] # 0x2a08 (en: 'two logical or operator', google: 'dos lĂłgicos u operadores') + - "⹉": [T: "operador multiplicado por N-Ary Times"] # 0x2a09 (en: 'times operator', google: 'operador de tiempos') + - "⹊": [T: "mĂłdulo dos sumas"] # 0x2a0a (en: 'modulo two sum', google: 'mĂłdulo dos suma') + - "⹋": [T: "suma con Integral"] # 0x2a0b (en: 'summation with integral', google: 'suma con integral') + - "⹌": [T: "operador integral cuĂĄdruple"] # 0x2a0c (en: 'quadruple integral operator') + - "⚍": [T: "parte integral finita"] # 0x2a0d + - "⚎": [T: "integral con Doble Trazo"] # 0x2a0e (en: 'integral with double stroke', google: 'integral con doble trazo') + - "⚏": [T: "promedio Integral con barra discontinua"] # 0x2a0f (en: 'integral average with slash', google: 'promedio integral con corte') + - "⚐": [T: "circulation function"] # 0x2a10 + - "⹑": [T: "integral en sentido contrario a las agujas del reloj"] # 0x2a11 (en: 'anticlockwise integration') + - "⹒": [T: "integral lineal para rectĂĄngulo en polo"] # 0x2a12 (en: 'line integration with rectangular path around pole') + - "⹓": [T: "integral lineal para semicĂ­rculo en polo"] # 0x2a13 (en: 'line integration with semicircular path around pole') + - "⹔": [T: "integral lineal excluyendo el polo"] # 0x2a14 (en: 'line integration not including the pole') + - "⹕": [T: "integral en torno a un punto operador"] # 0x2a15 (en: 'integral around a point operator') + - "⹖": [T: "operador integral para cuaterniones"] # 0x2a16 (en: 'quaternion integral operator') + - "⹗": [T: "integral con flecha hacia la izquierda con garfio"] # 0x2a17 (en: 'integral with leftwards arrow with hook') + - "⚘": [T: "integral con signo multiplicado por"] # 0x2a18 (en: 'integral with times sign', google: 'integral con el signo de tiempos') + - "⹙": [T: "integral con IntersecciĂłn"] # 0x2a19 (en: 'integral with intersection', google: 'integral con la intersecciĂłn') + - "⹚": [T: "integral con uniĂłn"] # 0x2a1a (en: 'integral with union', google: 'integral con la uniĂłn') + - "⹛": [T: "integral con barra superior"] # 0x2a1b (en: 'integral with overbar', google: 'integral con overbar') + - "⹜": [T: "integral con barra inferior"] # 0x2a1c (en: 'integral with underbar', google: 'integral con underbar') + - "⚝": [T: "unir"] # 0x2a1d (en: 'join') + - "⚞": [T: "operador de triĂĄngulo izquierdo grande"] # 0x2a1e (en: 'large left triangle operator', google: 'gran operador del triĂĄngulo izquierdo') + - "⹟": [T: "composiciĂłn de esquemas de notaciĂłn Z"] # 0x2a1f (en: 'z notation schema composition', google: 'z composiciĂłn de esquema de notaciĂłn') + - "âš ": [T: "esquema de notaciĂłn Z"] # 0x2a20 (en: 'z notation schema piping', google: 'z tuberĂ­a de esquema de notaciĂłn') + - "⚥": [T: "proyecciĂłn del esquema de notaciĂłn Z"] # 0x2a21 (en: 'z notation schema projection', google: 'z proyecciĂłn de esquema de notaciĂłn') + - "âšą": [T: "signo mĂĄs con cĂ­rculo encima"] # 0x2a22 (en: 'plus sign with circle above') + - "⚣": [T: "signo mĂĄs con signo circunflejo encima"] # 0x2a23 (en: 'plus sign with circumflex accent above') + - "⚀": [T: "signo mĂĄs con tilde encima"] # 0x2a24 (en: 'plus sign with tilde above') + - "âš„": [T: "signo mĂĄs con punto inferior"] # 0x2a25 (en: 'plus sign with dot below') + - "⚊": [T: "signo mĂĄs con tilde inferior"] # 0x2a26 (en: 'plus sign with tilde below') + - "âš§": [T: "signo mĂĄs con 2 subĂ­ndice"] # 0x2a27 (en: 'plus sign with subscript two') + - "âšš": [T: "signo mĂĄs con triĂĄngulo negro"] # 0x2a28 (en: 'plus sign with black triangle', google: 'mĂĄs letrero con triĂĄngulo negro') + - "âš©": [T: "signo menos con coma encima"] # 0x2a29 (en: 'minus sign with comma above') + - "âšȘ": [T: "signo menos con punto inferior"] # 0x2a2a (en: 'minus sign with dot below') + - "âš«": [T: "signo menos con puntos descendentes"] # 0x2a2b (en: 'minus sign with falling dots', google: 'señal menos con puntos de caĂ­da') + - "⚏": [T: "signo menos con puntos ascendentes"] # 0x2a2c (en: 'minus sign with rising dots', google: 'minus firma con puntos ascendentes') + - "âš­": [T: "signo mĂĄs en semicĂ­rculo izquierdo"] # 0x2a2d (en: 'plus sign in left half circle') + - "âšź": [T: "signo mĂĄs en semicĂ­rculo derecho"] # 0x2a2e (en: 'plus sign in right half circle') + - "⚯": [T: "producto vectorial"] # 0x2a2f (en: 'cross product') + - "âš°": [T: "signo de multiplicaciĂłn con punto encima"] # 0x2a30 (en: 'multiplication sign with dot above') + - "âš±": [T: "signo de multiplicaciĂłn con barra inferior"] # 0x2a31 (en: 'multiplication sign with underbar') + - "âšČ": [T: "producto semidirecto con fondo cerrado"] # 0x2a32 (en: 'semidirect product with bottom closed') + - "âšł": [T: "smash product"] # 0x2a33 + - "⚎": [T: "signo de multiplicaciĂłn dentro de semicĂ­rculo izquierdo"] # 0x2a34 (en: 'multiplication sign in left half circle') + - "âš”": [T: "signo de multiplicaciĂłn dentro de semicĂ­rculo derecho"] # 0x2a35 (en: 'multiplication sign in right half circle') + - "âš¶": [T: "signo de multiplicaciĂłn dentro de cĂ­rculo con circunflejo"] # 0x2a36 (en: 'circled multiplication sign with circumflex accent') + - "âš·": [T: "signo de multiplicaciĂłn en doble cĂ­rculo"] # 0x2a37 (en: 'multiplication sign in double circle') + - "âšž": [T: "signo de divisiĂłn dentro de un cĂ­rdulo"] # 0x2a38 (en: 'circled division sign') + - "âšč": [T: "signo mĂĄs dentro de un triĂĄngulo"] # 0x2a39 (en: 'plus sign in triangle') + - "âšș": [T: "signo menos dentro de un triĂĄngulo"] # 0x2a3a (en: 'minus sign in triangle') + - "âš»": [T: "signo de multiplicaciĂłn dentro de un triĂĄngulo"] # 0x2a3b (en: 'multiplication sign in triangle') + - "⚌": [T: "producto interior"] # 0x2a3c (en: 'interior product') + - "âšœ": [T: "producto interior derecho"] # 0x2a3d (en: 'righthand interior product') + - "âšź": [T: "signo mĂĄs en semicĂ­rculo derecho"] # 0x2a2e (en: 'z notation relational composition') + - "âšż": [T: "coproducto"] # 0x2a3f (en: 'amalgamation or coproduct') + - "⩀": [T: "intersecciĂłn con punto"] # 0x2a40 (en: 'intersection with dot') + - "⩁": [T: "uniĂłn con signo menos"] # 0x2a41 (en: 'union with minus sign', google: 'uniĂłn con menos signo') + - "⩂": [T: "uniĂłn con barrasuperior"] # 0x2a42 (en: 'union with overbar') + - "⩃": [T: "intersecciĂłn con barrasuperior"] # 0x2a43 (en: 'intersection with overbar') + - "⩄": [T: "intersecciĂłn con and lĂłgico"] # 0x2a44 (en: 'intersection with logical and') + - "⩅": [T: "uniĂłn con or lĂłgico"] # 0x2a45 (en: 'union with logical or') + - "⩆": [T: "uniĂłn sobre intersecciĂłn"] # 0x2a46 (en: 'union above intersection') + - "⩇": [T: "intersecciĂłn sobre uniĂłn"] # 0x2a47 (en: 'intersection above union') + - "⩈": [T: "uniĂłn sobre barra sobre intersecciĂłn"] # 0x2a48 (en: 'union above bar above intersection') + - "⩉": [T: "intersecciĂłn sobre barra sobre uniĂłn"] # 0x2a49 (en: 'intersection above bar above union', MathPlayer: 'intersecciĂłn sobre barra, sobre uniĂłn', google: 'intersecciĂłn por encima de la barra por encima de la uniĂłn') + - "⩊": [T: "uniĂłn y uniĂłn"] # 0x2a4a (en: 'union beside and joined with union') + - "⩋": [T: "intersecciĂłn e intersecciĂłn"] # 0x2a4b (en: 'intersection beside and joined with intersection') + - "⩌": [T: "uniĂłn cerrada con serifs"] # 0x2a4c (en: 'closed union with serifs') + - "⩍": [T: "intersecciĂłn cerrada con serifs"] # 0x2a4d (en: 'closed intersection with serifs') + - "⩎": [T: "intersecciĂłn cuadrada doble"] # 0x2a4e (en: 'double square intersection', google: 'intersecciĂłn doble cuadrado') + - "⩏": [T: "uniĂłn cuadrada doble"] # 0x2a4f (en: 'double square union', google: 'uniĂłn doble cuadrado') + - "⩐": [T: "uniĂłn cerrada con serifs y signo de multiplicaciĂłn"] # 0x2a50 (en: 'closed union with serifs and smash product') + - "⩑": [T: "lĂłgico y con punto arriba."] # 0x2a51 (en: 'logical and with dot above', google: 'lĂłgico y con punto arriba') + - "⩒": [T: "lĂłgico o con punto arriba"] # 0x2a52 (en: 'logical or with dot above') + - "⩓": [T: "Y"] # 0x2a53 (en: 'double logical and') + - "⩔": [T: "O"] # 0x2a54 (en: 'double logical or') + - "⩕": [T: "doble Y lĂłgica intersecada"] # 0x2a55 + - "⩖": [T: "doble O lĂłgica intersecada"] # 0x2a56 + - "⩗": [T: "O grande inclinada"] # 0x2a57 + - "⩘": [T: "Y grande inclinada"] # 0x2a58 + - "⩙": [T: "lĂłgica O superpuesta a lĂłgica Y"] # 0x2a59 (en: 'logical or overlapping logical and', google: 'lĂłgico o superpuesto lĂłgico y') + - "⩚": [T: "Y lĂłgica con trazo en medio"] # 0x2a5a + - "⩛": [T: "O lĂłgica con trazo en medio"] # 0x2a5b + - "⩜": [T: "Y lĂłgica con barra horizontal discontinua"] # 0x2a5c + - "⩝": [T: "O lĂłgica con barra horizontal discontinua"] # 0x2a5d + - "⩞": [T: "Y lĂłgica con doble barra superior"] # 0x2a5e (en: 'logical and with double overbar', google: 'lĂłgico y con doble overbar') + - "⩟": [T: "Y lĂłgica con barra inferior"] # 0x2a5f + - "â© ": [T: "Y lĂłgica con doble barra inferior."] # 0x2a60 (en: 'logical and with double underbar', google: 'lĂłgico y con doble debajo de la barra') + - "⩥": [T: "pequeño Vee con barra inferior"] # 0x2a61 (en: 'small vee with underbar', google: 'pequeño vee con debajo de la barra') + - "⩹": [T: "O lĂłgica con doble barra."] # 0x2a62 (en: 'logical or with double overbar', google: 'lĂłgico o con doble overbar') + - "⩣": [T: "O lĂłgica con doble barra inferior"] # 0x2a63 (en: 'logical or with double underbar', google: 'lĂłgico o con doble bajo') + - "â©€": [T: "notaciĂłn Z Dominio AntirestricciĂłn"] # 0x2a64 (en: 'z notation domain antirestriction', google: 'z dominio de notaciĂłn antirestricciĂłn') + - "â©„": [T: "notaciĂłn Z, rango antirrestriciĂłn"] # 0x2a65 (en: 'z notation range antirestriction', google: 'z rango de notaciĂłn antirestricciĂłn') + - "⩊": [T: "signo igual con punto abajo"] # 0x2a66 (en: 'equals sign with dot below') + - "â©§": [T: "idĂ©ntico a con punto arriba"] # 0x2a67 (en: 'identical with dot above', google: 'idĂ©ntico al punto arriba') + - "⩚": [T: "triple barra horizontal con doble trazo vertical"] # 0x2a68 (en: 'triple horizontal bar with double vertical stroke', google: 'barra horizontal triple con doble carrera vertical') + - "â©©": [T: "triple barra horizontal con triple trazo vertical"] # 0x2a69 (en: 'triple horizontal bar with triple vertical stroke', google: 'barra horizontal triple con trazo vertical triple') + - "â©Ș": [T: "tilde con punto encima"] # 0x2a6a (en: 'tilde operator with dot above') + - "â©«": [T: "tilde con puntos ascendentes"] # 0x2a6b (en: 'tilde operator with rising dots', google: 'operador de tilde con puntos ascendentes') + - "⩏": [T: "similar menos similar"] # 0x2a6c (en: 'similar minus similar', google: 'similar menos similar') + - "â©­": [T: "congruente con punto encima"] # 0x2a6d (en: 'congruent with dot above') + - "⩟": [T: "igual a con Asterisco"] # 0x2a6e (en: 'equals with asterisk', google: 'igualmente con asterisco') + - "⩯": [T: "casi igual con acento circunflejo"] # 0x2a6f (en: 'almost equal to with circumflex accent') + - "â©°": [T: "aproximadamente igual o igual a"] # 0x2a70 (en: 'approximately equal to or equal to') + - "⩱": [T: "signo igual por encima de signo mĂĄs"] # 0x2a71 (en: 'equals sign above plus sign') + - "â©Č": [T: "signo mĂĄs por encima de signo igual"] # 0x2a72 (en: 'plus sign above equals sign') + - "⩳": [T: "signo igual por encima de tilde"] # 0x2a73 (en: 'equals sign above tilde operator') + - "⩎": [T: "signo igual con dos puntos"] # 0x2a74 (en: 'double colon equal') + - "â©”": [T: "doble signo igual"] # 0x2a75 (en: 'two consecutive equals signs') + - "â©¶": [T: "triple signo igual"] # 0x2a76 (en: 'three consecutive equals signs', google: 'tres signos consecutivos iguales') + - "â©·": [T: "signo igual entre dos puntos arriba y dos puntos abajo"] # 0x2a77 (en: 'equals sign with two dots above and two dots below') + - "⩞": [T: "equivalente a con cuatro puntos en la parte superior"] # 0x2a78 (en: 'equivalent with four dots above') + - "â©č": [T: "menor que con cĂ­rculo dentro"] # 0x2a79 (en: 'less than with circle inside') + - "â©ș": [T: "mayor que con cĂ­rculo dentro"] # 0x2a7a (en: 'greater than with circle inside') + - "â©»": [T: "menor que con signo de interrogaciĂłn en la parte superior"] # 0x2a7b (en: 'less than with question mark above') + - "⩌": [T: "mayor que con signo de interrogaciĂłn en la parte superior"] # 0x2a7c (en: 'greater than with question mark above') + - "⩜": [T: "menor que o signo igual inclinado"] # 0x2a7d (en: 'less than or slanted equal to') + - "⩟": [T: "mayor que o signo igual inclinado"] # 0x2a7e (en: 'greater than or slanted equal to') + - "⩿": [T: "menor que o signo igual inclinado con punto en el interior"] # 0x2a7f (en: 'less than or slanted equal to with dot inside') + - "âȘ€": [T: "mayor que o signo igual inclinado con punto en el interior"] # 0x2a80 (en: 'greater than or slanted equal to with dot inside') + - "âȘ": [T: "menor que o signo igual inclinado con punto en la parte superior"] # 0x2a81 (en: 'less than or slanted equal to with dot above') + - "âȘ‚": [T: "mayor que o signo igual con punto en la parte superior"] # 0x2a82 (en: 'greater than or slanted equal to with dot above') + - "âȘƒ": [T: "menor que o signo igual inclinado con punto superior a la derecha"] # 0x2a83 (en: 'less than or slanted equal to with dot above right') + - "âȘ„": [ T: "mayor que con signo igual inclinado con punto superior hacia la izquierda"] # 0x2a84 (en: 'greater than or slanted equal to with dot above left') + - "âȘ…": [T: "menor que o aproximado"] # 0x2a85 (en: 'less than or approximate', google: 'menos o aproximado') + - "âȘ†": [T: "mayor que o aproximado"] # 0x2a86 (en: 'greater than or approximate', google: 'mayor o aproximado') + - "âȘ‡": [T: "menor que y una lĂ­nea no es igual a"] # 0x2a87 (en: 'less than and single line not equal to', google: 'menos que y una sola lĂ­nea no es igual a') + - "âȘˆ": [T: "mayor que y una lĂ­nea no es igual a"] # 0x2a88 (en: 'greater than and single line not equal to', google: 'mayor que y una sola lĂ­nea no es igual a') + - "âȘ‰": [T: "menor que y no aproximado a"] # 0x2a89 (en: 'less than and not approximate') + - "âȘŠ": [T: "mayor que y no aproximado a"] # 0x2a8a (en: 'greater than and not approximate') + - "âȘ‹": [T: "menor que por encima de lĂ­nea doble, signo iguaal por encima de mayor que"] # 0x2a8b (en: 'less than above double line equal above greater than', google: 'menos que por encima de la doble lĂ­nea igual por encima de mĂĄs que') + - "âȘŒ": [T: "mayor que por encima de doble lĂ­nea, signo igual por encima de menor que"] # 0x2a8c (en: 'greater than above double line equal above less than', google: 'mayor que por encima de la doble lĂ­nea igual por encima de menos que') + - "âȘ": [T: "menor que por encima de similar o igual a"] # 0x2a8d (en: 'less than above similar or equal') + - "âȘŽ": [T: "mayor que por encima de similar o igual a"] # 0x2a8e (en: 'greater than above similar or equal') + - "âȘ": [T: "menor que por encima de similar por encima de mayor que"] # 0x2a8f (en: 'less than above similar above greater than') + - "âȘ": [T: "mayor que por encima de similar por encima de menor que"] # 0x2a90 (en: 'greater than above similar above less than') + - "âȘ‘": [T: "menor que por encima de mayor que por encima de doble lĂ­nea igual"] # 0x2a91 (en: 'less than above greater than above double line equal') + - "âȘ’": [T: "mayor que por encima de menor que por encima de doble lĂ­nea igual"] # 0x2a92 (en: 'greater than above less than above double line equal') + - "âȘ“": [T: "menor que por encima de signo igual inclinado por encima de mayor que por encima de signo igual inclinado"] # 0x2a93 (en: 'less than above slanted equal above greater than above slanted equal') + - "âȘ”": [T: "mayor que por encima de signo igual inclinado por encima de menor que por encima de signo igual inclinado"] # 0x2a94 (en: 'greater than above slanted equal above less than above slanted equal') + - "âȘ•": [T: "igual o menor que"] # 0x2a95 (en: 'slanted equal to or less than', google: 'inclinado igual o menos de') + - "âȘ–": [T: "igual o mayor que"] # 0x2a96 (en: 'slanted equal to or greater than') + - "âȘ—": [T: "igual o menor que con punto en el interior"] # 0x2a97 (en: 'slanted equal to or less than with dot inside') + - "âȘ˜": [T: "igual o mayor que con punto en el interior"] # 0x2a98 (en: 'slanted equal to or greater than with dot inside') + - "âȘ™": [T: "doble lĂ­nea igual a o menor que"] # 0x2a99 (en: 'double line equal to or less than') + - "âȘš": [T: "doble lĂ­nea igual a o mayor que"] # 0x2a9a (en: 'double line equal to or greater than') + - "âȘ›": [T: "doble lĂ­nea inclinada igual a o menor que"] # 0x2a9b (en: 'double line slanted equal to or less than', google: 'doble lĂ­nea inclinada igual o menos de') + - "âȘœ": [T: "doble lĂ­nea inclinada igual a o mayor que"] # 0x2a9c (en: 'double line slanted equal to or greater than', google: 'lĂ­nea doble inclinada igual o mayor que') + - "âȘ": [T: "similar a o menor que"] # 0x2a9d (en: 'similar or less than') + - "âȘž": [T: "similar a o mayor que"] # 0x2a9e (en: 'similar or greater than') + - "âȘŸ": [T: "similar a por encima de menor que por encima de signo igual"] # 0x2a9f (en: 'similar above less than above equals sign') + - "âȘ ": [T: "similar a por encima de mayor que por encima de signo egual"] # 0x2aa0 (en: 'similar above greater than above equals sign') + - "âȘĄ": [T: "mucho menor que"] # 0x2aa1 (en: 'double nested less than') + - "âȘą": [T: "mucho mayor que"] # 0x2aa2 (en: 'double nested greater than') + - "âȘŁ": [T: "signo menor que doblemente anidado con barra inferior"] # 0x2aa3 (en: 'double nested less than with underbar', google: 'doble anidado menos que con debajo de la barra') + - "âȘ€": [T: "signo mayor que superpuesto a signo menor que"] # 0x2aa4 (en: 'greater than overlapping less than') + - "âȘ„": [T: "signo mayor que al lado de signo enor que"] # 0x2aa5 (en: 'greater than beside less than') + - "âȘŠ": [T: "menor que cerrado con curva"] # 0x2aa6 (en: 'less than closed by curve') + - "âȘ§": [T: "mayor que cerrado con curva"] # 0x2aa7 (en: 'greater than closed by curve') + - "âȘš": [T: "signo menor que cerrado con curva por encima de signo igual inclinadoa"] # 0x2aa8 (en: 'less than closed by curve above slanted equal') + - "âȘ©": [T: "signo mayor que cerrado con curva por encima de signo igual inclinado"] # 0x2aa9 (en: 'greater than closed by curve above slanted equal') + - "âȘȘ": [T: "mĂĄs pequeño que"] # 0x2aaa (en: 'smaller than') + - "âȘ«": [T: "mĂĄs grande que"] # 0x2aab (en: 'larger than') + - "âȘŹ": [T: "mĂĄs pequeño que o igual a"] # 0x2aac (en: 'smaller than or equal to') + - "âȘ­": [T: "mĂĄs grande que o igual a"] # 0x2aad (en: 'larger than or equal to') + - "âȘź": [T: "signo igual abultado en la parte superior"] # 0x2aae (en: 'equals sign with bumpy above') + - "âȘŻ": [T: "precede o es igual a"] # 0x2aaf (en: 'precedes above single line equals sign') + - "âȘ°": [T: "sucede o es igual a"] # 0x2ab0 (en: 'succeeds above single line equals sign', google: 'tiene Ă©xito por encima de la lĂ­nea Ășnica es igual al signo') + - "âȘ±": [T: "precede no es igual a"] # 0x2ab1 (en: 'precedes above single line not equal to', google: 'precede por encima de una sola lĂ­nea no es igual a') + - "âȘČ": [T: "sucede no es igual a"] # 0x2ab2 (en: 'succeeds above single line not equal to', google: 'tiene Ă©xito por encima de una sola lĂ­nea no es igual a') + - "âȘł": [T: "precede por encima del signo igual"] # 0x2ab3 (en: 'precedes above equals sign', google: 'precede arriba es igual al signo') + - "âȘŽ": [T: "sucede por encima del signo igual"] # 0x2ab4 (en: 'succeeds above equals sign', google: 'tiene Ă©xito arriba es igual al signo') + - "âȘ”": [T: "precede por encima de no es igual a"] # 0x2ab5 (en: 'precedes above not equal to') + - "âȘ¶": [T: "sucede por encima de no es igual a"] # 0x2ab6 (en: 'succeeds above not equal to') + - "âȘ·": [T: "precede por encima de casi igual a"] # 0x2ab7 (en: 'precedes above almost equal to') + - "âȘž": [T: "sucede por encima de casi igual a"] # 0x2ab8 (en: 'succeeds above almost equal to') + - "âȘč": [T: "precede por encima de no es casi igual a"] # 0x2ab9 (en: 'precedes above not almost equal to', google: 'precede arriba no casi igual a') + - "âȘș": [T: "sucede por encima de casi igual a"] # 0x2aba (en: 'succeeds above not almost equal to', google: 'tiene Ă©xito arriba no casi igual a') + - "âȘ»": [T: "es muy anterior a"] # 0x2abb (en: 'double precedes') + - "âȘŒ": [T: "sigue mucho despuĂ©s"] # 0x2abc (en: 'double succeeds') + - "âȘœ": [T: "subconjunto con punto"] # 0x2abd (en: 'subset with dot') + - "âȘŸ": [T: "superconjunto con punto"] # 0x2abe (en: 'superset with dot') + - "âȘż": [T: "subconjunto con signo mĂĄs debajo de"] # 0x2abf (en: 'subset with plus sign below') + - "⫁": [T: "subconjunto con signo de multiplicaciĂłn debajo de"] # 0x2ac1 (en: 'subset with multiplication sign below') + - "⫀": [T: "superconjunto con signo mĂĄs debajo de"] # 0x2ac0 (en: 'superset with plus sign below') + - "⫂": [T: "superconjunto con signo de multiplicaciĂłn debajo de"] # 0x2ac2 (en: 'superset with multiplication sign below') + - "⫃": [T: "incluido con punto o es igual a"] # 0x2ac3 (en: 'subset of or equal to with dot above') + - "⫄": [T: "superconjunto de o igual a con punto encima"] # 0x2ac4 (en: 'superset of or equal to with dot above') + - "⫅": [T: "subconjunto de signo igual encima de"] # 0x2ac5 (en: 'subset of above equals sign', google: 'el subconjunto de arriba es igual al signo') + - "⫆": [T: "superconjunto de signo igual encima de"] # 0x2ac6 (en: 'superset of above equals sign', google: 'el superconjunto de arriba es igual al signo') + - "⫇": [T: "subconjunto por encima de tilde"] # 0x2ac7 (en: 'subset of above tilde operator') + - "⫈": [T: "superconjunto por encima de"] # 0x2ac8 (en: 'superset of above tilde operator') + - "⫉": [T: "subconjunto por encima de signo casi igual a"] # 0x2ac9 (en: 'subset of above almost equal to', google: 'subconjunto de arriba casi igual a') + - "⫊": [T: "superconjunto por encima de casi igual a"] # 0x2aca (en: 'superset of above almost equal to', google: 'superset de arriba casi igual a') + - "⫋": [T: "subconjunto por encima de signo no es igual a"] # 0x2acb (en: 'subset above not equal to', google: 'subconjunto arriba no igual a') + - "⫌": [T: "superconjunto por encima de signo no es igual a "] # 0x2acc (en: 'superset of above not equal to', google: 'superset de arriba no es igual a') + - "⫍": [T: "operador de caja abierta cuadrada a la izquierda"] # 0x2acd (en: 'square left open box operator', google: 'operador de caja abierta cuadrada izquierda') + - "⫎": [T: "operador de caja abierta cuadrada a la derecha"] # 0x2ace (en: 'square right open box operator', google: 'operador de caja abierta cuadrada derecha') + - "⫏": [T: "subconjunto cerrado"] # 0x2acf (en: 'closed subset') + - "⫐": [T: "superconjunto cerrado"] # 0x2ad0 (en: 'closed superset') + - "⫑": [T: "subconjunto cerrado o es igual a"] # 0x2ad1 (en: 'closed subset or equal to') + - "⫒": [T: "superconjunto cerrado o es igual a"] # 0x2ad2 (en: 'closed superset or equal to') + - "⫓": [T: "subconjunto por encima de superconjunto"] # 0x2ad3 (en: 'subset above superset') + - "⫔": [T: "superconjunto por encima de subconjunto"] # 0x2ad4 (en: 'superset above subset') + - "⫕": [T: "subconjunto por encima de subconjunto"] # 0x2ad5 (en: 'subset above subset') + - "⫖": [T: "superconjunto por encima de superconjunto"] # 0x2ad6 (en: 'superset above superset') + - "⫗": [T: "superconjunto al lado de subconjunto"] # 0x2ad7 (en: 'superset beside subset') + - "⫘": [T: "superconjunto al lado de y unido por barra discontinua a subconjunto"] # 0x2ad8 (en: 'superset beside and joined by dash with subset') + - "⫙": [T: "grupo de apertura hacia arriba y hacia abajo"] # 0x2ad9 (en: 'element of opening downwards') + - "⫚": [T: "bifurcaciĂłn"] # 0x2ada + - "⫛": [T: "intersecciĂłn transversal"] # 0x2adb + - "⫝̸": [T: "bifurcaciĂłn"] # 0x2adc (en: 'forking') + - "⫝": [T: "sin bifurcaciĂłn"] # 0x2add (google: 'no efectivo') + - "⫞": [T: "tack corto a la izquierda"] # 0x2ade (en: 'short left tack', google: 'tachuela a la izquierda corta') + - "⫟": [T: "tack corto hacia abajo"] # 0x2adf (en: 'short down tack', google: 'tachuela corta') + - "â« ": [T: "tack corto hacia arriba"] # 0x2ae0 (en: 'short up tack', google: 'tachuela corta') + - "⫥": [T: "perpendicular a s"] # 0x2ae1 (en: 'perpendicular with s') + - "⫹": [T: "barra vertical con triple torniquete a la derecha"] # 0x2ae2 (en: 'vertical bar triple right turnstile', google: 'barra vertical triple turnstile a la derecha') + - "⫣": [T: "doble barra vertical con torniquete a la izquierda"] # 0x2ae3 (en: 'double vertical bar left turnstile', google: 'doble barra vertical a la izquierda el torniquete') + - "â«€": [T: "barra vertical con doble torniquete a la izquierda"] # 0x2ae4 (en: 'vertical bar double left turnstile') + - "â«„": [T: "doble barra vertical doble torniquete a la izquierda"] # 0x2ae5 (en: 'double vertical bar double left turnstile', google: 'doble barra vertical de doble tornillo a la izquierda') + - "⫊": [T: "larga barra discontinua partiendo de doble barra vertical izquierda"] # 0x2ae6 + - "â«§": [T: "tack corto con barra superior"] # 0x2ae7 + - "⫚": [T: "tack corto arriba con barra inferior"] # 0x2ae8 (en: 'short up tack with underbar') + - "â«©": [T: "tack corto arriba sobre tack corto abajo"] # 0x2ae9 + - "â«Ș": [T: "doble tack hacia abajo"] # 0x2aea (en: 'double down tack', google: 'duplicar la tachuela') + - "â««": [T: "doble tack hacia arriba"] # 0x2aeb + - "⫏": [T: "doble trazo sin signo"] # 0x2aec + - "â«­": [T: "doble trazo invertido sin signo"] # 0x2aed + - "⫟": [T: "no divide con barra invertida discontinua de negaciĂłn"] # 0x2aee + - "⫯": [T: "lĂ­nea vertical con cĂ­rculo encima"] # 0x2aef (en: 'vertical line with circle above') + - "â«°": [T: "lĂ­nea vertical con cĂ­rculo abajo"] # 0x2af0 (en: 'vertical line with circle below') + - "⫱": [T: "tack hacia abajo con cĂ­rculo abajo"] # 0x2af1 + - "â«Č": [T: "paralela con trazo horizontal"] # 0x2af2 (en: 'parallel with horizontal stroke') + - "⫳": [T: "paralela con tilde"] # 0x2af3 (en: 'parallel with tilde operator') + - "⫎": [T: "relaciĂłn binaria de barra vertical triple"] # 0x2af4 (en: 'triple vertical bar binary relation', google: 'relaciĂłn binaria de la barra vertical triple') + - "â«”": [T: "barra vertical triple con trazo horizontal"] # 0x2af5 (en: 'triple vertical bar with horizontal stroke', google: 'barra vertical triple con carrera horizontal') + - "â«¶": [T: "operador TripleC olon"] # 0x2af6 (en: 'triple colon operator', google: 'operador de triple colon') + - "â«·": [T: "signo menor que triplemente anidado"] # 0x2af7 (en: 'triple nested less than', google: 'triple anidado menos que') + - "⫞": [T: "signo mayor que triplemente anidado"] # 0x2af8 (en: 'triple nested greater than', google: 'triple anidado mĂĄs grande que') + - "â«č": [T: "doble lĂ­nea inclinada menor o igual a"] # 0x2af9 (en: 'double line slanted less than or equal to', google: 'doble lĂ­nea inclinada menos o igual a') + - "â«ș": [T: "doble lĂ­nea inclinada mayor o igual a"] # 0x2afa (en: 'double line slanted greater than or equal to', google: 'lĂ­nea doble inclinada mayor o igual a') + - "â«»": [T: "relaciĂłn Binaria Triple SĂłlida"] # 0x2afb (en: 'triple solidus binary relation', google: 'triple relaciĂłn binaria de solidus') + - "⫌": [T: "operador de barra vertical triple y grande"] # 0x2afc (en: 'large triple vertical bar operator', google: 'gran operador de barra vertical triple') + - "⫝̸": [T: "operador Doble SĂłlido"] # 0x2afd (en: 'double solidus operator', google: 'operador doble solidus') + - "⫟": [T: "barra vertical blanca"] # 0x2afe (en: 'white vertical bar') + - "⫿": [T: "barra vertical blanca N-Ary"] # 0x2aff (en: 'white vertical bar', google: 'barra vertical blanca') + - "⬀": [T: "flecha blanca apuntando al nordeste"] # 0x2b00 (en: 'north east white arrow', google: 'noreste de la flecha blanca') + - "⏁": [T: "flecha blanca apuntando a noroeste"] # 0x2b01 (en: 'north west white arrow', google: 'noroeste de flecha blanca') + - "⬂": [T: "flecha blanca apuntando al sudeste"] # 0x2b02 (en: 'south east white arrow', google: 'south east white arrow') + - "⏃": [T: "flecha blanca apuntando al sudoeste"] # 0x2b03 (en: 'south west white arrow', google: 'south west white arrow') + - "⬄": [T: "flecha blanca hacia izquierda y derecha"] # 0x2b04 (en: 'left right white arrow', google: 'flecha blanca derecha izquierda') + - "⬅": [T: "flecha negra hacia la izquierda"] # 0x2b05 (en: 'leftwards black arrow') + - "⬆": [T: "flecha negra hacia arriba"] # 0x2b06 (en: 'upwards black arrow', google: 'arrow negro hacia arriba') + - "⬇": [T: "flecha negra hacia abajo"] # 0x2b07 (en: 'downwards black arrow', google: 'arrow negra hacia abajo') + - "⏈": [T: "flecha negra apuntando al nordeste"] # 0x2b08 (en: 'north east black arrow', google: 'north east black arrow') + - "⬉": [T: "flecha negra apuntando al noroeste"] # 0x2b09 (en: 'north west black arrow', google: 'noroeste de flecha negra') + - "⬊": [T: "flecha negra apuntando al sudeste"] # 0x2b0a (en: 'south east black arrow', google: 'south east black arrow') + - "⬋": [T: "flecha negra apuntando al sudoeste"] # 0x2b0b (en: 'south west black arrow', google: 'south west arrow negro') + - "⬌": [T: "flecha negra hacia izquierda y derecha"] # 0x2b0c (en: 'left right black arrow', google: 'flecha negra derecha izquierda') + - "⬍": [T: "flecha negra hacia arriba y hacia abajo"] # 0x2b0d (en: 'up down black arrow', google: 'arrow black arrow') + - "⬎": [T: "flecha hacia la derecha con la punta hacia abajo"] # 0x2b0e (en: 'rightwards arrow with tip downwards') + - "⬏": [T: "flecha hacia la derecha con la punta hacia arriba"] # 0x2b0f (en: 'rightwards arrow with tip upwards') + - "⏐": [T: "flecha hacia la izquierda con la punta hacia abajo"] # 0x2b10 (en: 'leftwards arrow with tip downwards', google: 'flecha hacia la izquierda con punta hacia abajo') + - "⬑": [T: "flecha hacia la izquierda con la punta hacia arriba"] # 0x2b11 (en: 'leftwards arrow with tip upwards', google: 'flecha hacia la izquierda con punta hacia arriba') + - "⬒": [T: "cuadrado con mitad superior negra"] # 0x2b12 (en: 'square with top half black', google: 'cuadrado con la mitad superior negra') + - "⬓": [T: "cuadrado con mitad inferior negra"] # 0x2b13 (en: 'square with bottom half black', google: 'cuadrado con la mitad inferior negra') + - "⬔": [T: "cuadrado con mitad derecha superior diagonal negra"] # 0x2b14 (en: 'square with upper right diagonal half black', google: 'cuadrado con diagonal superior derecha de la parte superior negra') + - "⬕": [T: "cuadrado con mitad izquierda inferior diagonal negra"] # 0x2b15 (en: 'square with lower left diagonal half black', google: 'cuadrado con diagonal inferior izquierda mitad negra') + - "⬖": [T: "rombo con Mitad Izquierda Negro"] # 0x2b16 (en: 'diamond with left half black', google: 'diamante con la mitad de la izquierda') + - "⬗": [T: "rombo con mitad derecha negra"] # 0x2b17 (en: 'diamond with right half black', google: 'diamante con la mitad derecha negra') + - "⏘": [T: "rombo con mitad superior negra"] # 0x2b18 (en: 'diamond with top half black', google: 'diamante con mitad superior negro') + - "⬙": [T: "rojmbo con mitad inferior negra"] # 0x2b19 (en: 'diamond with bottom half black', google: 'diamante con la mitad de negro') + - "⬚": [T: "cuadrado punteado"] # 0x2b1a (en: 'box', google: 'caja') + - "⬛": [T: "cuadrado grande negro"] # 0x2b1b (en: 'black large square') + - "⬜": [T: "cuadrado grande blanco"] # 0x2b1c (en: 'white large square', google: 'cuadrado grande blanco') + - "⬝": [T: "cuadrado muy pequeño negro"] # 0x2b1d (en: 'black very small square', google: 'negro muy pequeño cuadrado') + - "⬞": [T: "cuadrado muy pequeño blanco"] # 0x2b1e (en: 'white very small square', google: 'blanco muy pequeño cuadrado') + - "⬟": [T: "pentĂĄgono blanco"] # 0x2b20 (en: 'white pentagon') + - "⏥": [T: "hexĂĄgono blanco"] # 0x2b21 (en: 'white hexagon') + - "⏹": [T: "hexĂĄgono negro"] # 0x2b22 (en: 'black hexagon') + - "⏣": [T: "hexĂĄgono hegro horizontal"] # 0x2b23 (en: 'horizontal black hexagon', google: 'hexagon negro horizontal') + - "⏀": [T: "circulo grande negro"] # 0x2b24 (en: 'black large circle', google: 'cĂ­rculo negro negro') + - "⏄": [T: "rombo Mediano Negro"] # 0x2b25 (en: 'black medium diamond', google: 'diamante medio negro') + - "⏊": [T: "rombo mediano blanco"] # 0x2b26 (en: 'white medium diamond', google: 'diamante medio blanco') + - "⏧": [T: "rombo Mediano Negro"] # 0x2b27 (en: 'black medium lozenge', google: 'rombina media negra') + - "⏚": [T: "rombo mediano blanco"] # 0x2b28 (en: 'white medium lozenge', google: 'rombita media blanca') + - "⏩": [T: "rombo pequeño negro"] # 0x2b29 (en: 'black small diamond', google: 'diamante pequeño negro') + - "âŹȘ": [T: "rombo pequeño negro"] # 0x2b2a (en: 'black small lozenge', google: 'pequeña barra negra') + - "⏫": [T: "rombo pequeño blanco"] # 0x2b2b (en: 'white small lozenge', google: 'pequeña barra blanca') + - "⏏": [T: "elipse horizontal negra"] # 0x2b2c (en: 'black horizontal ellipse') + - "⏭": [T: "elipse horizontal blanca"] # 0x2b2d (en: 'white horizontal ellipse') + - "⏟": [T: "elipse Vertical Negra"] # 0x2b2e (en: 'black vertical ellipse', google: 'elipse vertical negro') + - "⏯": [T: "elipse Vertical Blanca"] # 0x2b2f (en: 'white vertical ellipse', google: 'elipse vertical blanco') + - "⏰": [T: "flecha izquierda con cĂ­rculo pequeño"] # 0x2b30 (en: 'left arrow with small circle') + - "⏱": [T: "tres flechas a la izquierda"] # 0x2b31 (en: 'three leftwards arrows', google: 'tres flechas de izquierda') + - "âŹČ": [T: "flecha izquierda con signo mĂĄs en el interior de uncĂ­rculo"] # 0x2b32 (en: 'left arrow with circled plus', google: 'flecha izquierda con cĂ­rculos plus') + - "⏳": [T: "flecha serpenteante larga hacia la izquierda"] # 0x2b33 (en: 'long leftwards squiggle arrow', google: 'larga flecha de tirantes de la izquierda') + - "⏎": [T: "flecha de dos cabezas hacia la izquierda con trazo vertical"] # 0x2b34 (en: 'leftwards two headed arrow with vertical stroke', google: 'a la izquierda, dos flechas con carrera vertical') + - "⏔": [T: "flecha de dos cabezas hacia la izquierda con doble trazo vertical"] # 0x2b35 (en: 'leftwards two headed arrow with double vertical stroke', google: 'a la izquierda, dos flechas con cabeza de carrera vertical doble') + - "⏶": [T: "flecha de dos cabezas hacia la izquierda partiendo de barra"] # 0x2b36 (en: 'leftwards two headed arrow from bar', google: 'a la izquierda, dos flechas de la cabeza del bar') + - "⏷": [T: "flecha de dos cabezas hacia la izquierda con triple barra discontinua"] # 0x2b37 (en: 'leftwards two headed triple dash arrow', google: 'a la izquierda, dos flechas del triple tablero') + - "⏞": [T: "flecha hacia la izquierda con trazo punteado"] # 0x2b38 (en: 'leftwards arrow with dotted stem') + - "âŹč": [T: "flecha hacia la izquierda con cola con trazo vertical"] # 0x2b39 (en: 'leftwards arrow with tail with vertical stroke') + - "âŹș": [T: "flecha hacia la izquierda con cola con doble trazo vertical"] # 0x2b3a (en: 'leftwards arrow with tail with double vertical stroke', google: 'flecha hacia la izquierda con cola con doble carrera vertical') + - "⏻": [T: "flecha de dos cabezas hacia la izquierda con cola"] # 0x2b3b (en: 'leftwards two headed arrow with tail', google: 'a la izquierda, dos flechas con la cola') + - "âŹŒ": [T: "flecha de dos cabezas hacia la izquierda con cola con trazo vertical"] # 0x2b3c (en: 'leftwards two headed arrow with tail with vertical stroke', google: 'a la izquierda, dos flechas con cola con trazo vertical') + - "âŹœ": [T: "flecha de dos cabezas hacia la izquierda con cola con doble trazo vertical"] # 0x2b3d (en: 'leftwards two headed arrow with tail with double vertical stroke', google: 'a la izquierda, dos flechas con cola con trazo vertical doble') + - "âŹŸ": [T: "flecha hacia la izquierda a travĂ©s de X"] # 0x2b3e (en: 'leftwards arrow through x', google: 'flecha hacia la izquierda a travĂ©s de x') + - "⏿": [T: "flecha ondulada apuntando directamente a la izquierda"] # 0x2b3f (en: 'wave arrow pointing directly left', google: 'flecha de onda apuntando directamente a la izquierda') + - "⭀": [T: "signo igual por encima de flecha hacia la izquierda"] # 0x2b40 (en: 'equals sign above leftwards arrow', google: 'igual de la señal de la flecha hacia la izquierda') + - "⭁": [T: "operador de tilde inverso sobre la flecha hacia la izquierda"] # 0x2b41 (en: 'reverse tilde operator above leftwards arrow', google: 'reverse del operador de tilde sobre la flecha de la izquierda') + - "⭂": [T: "flecha hacia la izquierda sobre el reverso de signo casi igual a"] # 0x2b42 (en: 'leftwards arrow above reverse almost equal to') + - "⭃": [T: "flecha hacia la derecha a travĂ©s de signomayor que"] # 0x2b43 (en: 'rightwards arrow through greater than', google: 'flecha hacia la derecha a travĂ©s de mayor que') + - "⭄": [T: "flecha hacia la derecha a travĂ©s de superconjunto"] # 0x2b44 (en: 'rightwards arrow through superset', google: 'arrow hacia la derecha a travĂ©s del superconjunto') + - "⭅": [T: "flecha cuĂĄdruple hacia la izquierda"] # 0x2b45 (en: 'leftwards quadruple arrow', google: 'flecha quadruple hacia la izquierda') + - "⭆": [T: "flecha cuĂĄdruple hacia la derecha"] # 0x2b46 (en: 'rightwards quadruple arrow', google: 'arrow cuĂĄdruple hacia la derecha') + - "⭇": [T: "operador de tilde inverso sobre flecha hacia la derecha"] # 0x2b47 (en: 'reverse tilde operator above rightwards arrow', google: 'reverse el operador de tilde sobre la flecha derecha hacia la derecha') + - "⭈": [T: "flecha hacia la derecha sobre el reverso de signo casi igual a"] # 0x2b48 (en: 'rightwards arrow above reverse almost equal to') + - "⭉": [T: "operador de tilde sobre flecha hacia la izquierda"] # 0x2b49 (en: 'tilde operator above leftwards arrow', google: 'operador de tilde sobre la flecha de la izquierda') + - "⭊": [T: "flecha hacia la izquierda por encima de signo casi igual a"] # 0x2b4a (en: 'leftwards arrow above almost equal to', google: 'flecha hacia la izquierda arriba casi igual a') + - "⭋": [T: "flecha hacia la izquierda sobre operador de tilde inverso"] # 0x2b4b (en: 'leftwards arrow above reverse tilde operator') + - "⭌": [T: "flecha hacia la derecha sobre operador de tilde inverso"] # 0x2b4c (en: 'rightwards arrow above reverse tilde operator') + - "⭐": [T: "estrella media vacĂ­a"] # 0x2b50 (en: 'white medium star') + - "⭑": [T: "estrella pequeña llena"] # 0x2b51 (en: 'black small star') + - "⭒": [T: "estrella pequeña vacĂ­a"] # 0x2b52 (en: 'white small star') + - "⭓": [T: "pentĂĄgono negro apuntando hacia la derecha"] # 0x2b53 (en: 'black right pointing pentagon', google: 'black derecha apuntando al pentĂĄgono') + - "⭔": [T: "pentĂĄgono blanco apuntando hacia la derecha"] # 0x2b54 (en: 'white right pointing pentagon', google: 'pentĂĄgono apuntando a la derecha blanca') + - "⭕": [T: "cĂ­rculo grueso grande"] # 0x2b55 (en: 'heavy large circle', google: 'cĂ­rculo grande y pesado') + - "⭖": [T: "Ăłvalo grueso con Ăłvalo en el interior"] # 0x2b56 (en: 'heavy oval with oval inside', google: 'ovalo pesado con Ăłvalo en el interior') + - "⭗": [T: "cĂ­rculo grueso con cĂ­rculo en el interior"] # 0x2b57 (en: 'heavy circle with circle inside', google: 'cĂ­rculo pesado con cĂ­rculo interior') + - "⭘": [T: "cĂ­rculo grueso"] # 0x2b58 (en: 'heavy circle') + - "⭙": [T: "saltire en cĂ­rculo grueso"] # 0x2b59 (en: 'heavy circled saltire', google: 'saltire con cĂ­rculo pesado') + - "⾀": [T: "marcador de sustituciĂłn en ĂĄngulo recto"] # 0x2e00 (en: 'right angle substitution marker', google translation) + - "➁": [T: "marcador de sustituciĂłn punteado en ĂĄngulo recto"] # 0x2e01 (en: 'right angle dotted substitution marker', google translation) + - "⾂": [T: "soporte de sustituciĂłn izquierdo"] # 0x2e02 (en: 'left substitution bracket', google translation) + - "➃": [T: "soporte de sustituciĂłn derecho"] # 0x2e03 (en: 'right substitution bracket', google translation) + - "⾄": [T: "soporte de sustituciĂłn punteado izquierdo"] # 0x2e04 (en: 'left dotted substitution bracket', google translation) + - "⾅": [T: "soporte de sustituciĂłn punteado derecho"] # 0x2e05 (en: 'right dotted substitution bracket', google translation) + - "⾆": [T: "marcador de interpolaciĂłn elevado"] # 0x2e06 (en: 'raised interpolation marker', google translation) + - "⾇": [T: "marcador de interpolaciĂłn punteado elevado"] # 0x2e07 (en: 'raised dotted interpolation marker', google translation) + - "➈": [T: "marcador de marcador de transposiciĂłn punteado"] # 0x2e08 (en: 'dotted transposition marker marker', google translation) + - "⾉": [T: "soporte de transposiciĂłn izquierdo"] # 0x2e09 (en: 'left transposition bracket', google translation) + - "⾊": [T: "soporte de transposiciĂłn derecho"] # 0x2e0a (en: 'right transposition bracket', google translation) + - "⾋": [T: "cuadrado elevado"] # 0x2e0b (en: 'raised square', google translation) + - "⾌": [T: "soporte de omisiĂłn izquierdo elevado"] # 0x2e0c (en: 'left raised omission bracket', google translation) + - "➍": [T: "soporte de omisiĂłn derecho elevado"] # 0x2e0d (en: 'right raised omission bracket', google translation) + - "⾎": [T: "editorial coronis"] # 0x2e0e (google translation) + - "➏": [T: "pĂĄrrafos"] # 0x2e0f (en: 'paragraphos', google translation) + - "➐": [T: "pĂĄrrafos bifurcados"] # 0x2e10 (en: 'forked paragraphos', google translation) + - "⾑": [T: "pĂĄrrafos invertidos bifurcados"] # 0x2e11 (en: 'reversed forked paragraphos', google translation) + - "⾒": [T: "hipodiastole"] # 0x2e12 (en: 'hypodiastole', google translation) + - "⾓": [T: "Ăłbelos punteados"] # 0x2e13 (en: 'dotted obelos', google translation) + - "⾔": [T: "ĂĄncora hacia abajo"] # 0x2e14 (en: 'downwards ancora', google translation) + - "⾕": [T: "ĂĄncora hacia arriba"] # 0x2e15 (en: 'upwards ancora', google translation) + - "⾖": [T: "ĂĄngulo punteado apuntando hacia la derecha"] # 0x2e16 (en: 'dotted right pointing angle', google translation) + - "⾗": [T: "doble guiĂłn oblicuo"] # 0x2e17 (en: 'double oblique hyphen', google translation) + - "➘": [T: "interrobang invertido"] # 0x2e18 (en: 'inverted interrobang', google translation) + - "⾙": [T: "rama de palma"] # 0x2e19 (en: 'palm branch', google translation) + - "⾚": [T: "guiĂłn con diĂ©resis"] # 0x2e1a (en: 'hyphen with diaeresis', google translation) + - "⾛": [T: "tilde con anillo arriba"] # 0x2e1b (en: 'tilde with ring above', google translation) + - "⾜": [T: "soporte de parĂĄfrasis bajo izquierdo"] # 0x2e1c (en: 'left low paraphrase bracket', google translation) + - "➝": [T: "soporte de parĂĄfrasis bajo derecho"] # 0x2e1d (en: 'right low paraphrase bracket', google translation) + - "⾞": [T: "tilde con punto arriba"] # 0x2e1e (en: 'tilde with dot above', google translation) + - "⾟": [T: "tilde con punto abajo"] # 0x2e1f (en: 'tilde with dot below', google translation) + - "âž ": [T: "barra vertical izquierda con pluma"] # 0x2e20 (en: 'left vertical bar with quill', google translation) + - "➥": [T: "barra vertical derecha con pluma"] # 0x2e21 (en: 'right vertical bar with quill', google translation) + - "âžą": [T: "medio soporte superior izquierdo"] # 0x2e22 (en: 'top left half bracket', google: 'medio soporte superior izquierdo') + - "➣": [T: "medio soporte superior derecho"] # 0x2e23 (en: 'top right half bracket', google: 'arroja superior derecha') + - "➀": [T: "abrazadera inferior izquierda"] # 0x2e24 (en: 'bottom left half bracket', google: 'medio soporte inferior izquierdo') + - "âž„": [T: "medio soporte inferior derecho"] # 0x2e25 (en: 'bottom right half bracket') + - "➊": [T: "soporte U lateral izquierdo"] # 0x2e26 (en: 'left sideways u bracket', google: 'izquierda lateral u soporte') + - "âž§": [T: "soporte U lateral derecho"] # 0x2e27 (en: 'right sideways u bracket', google: 'right sideways u soporte') + - "âžš": [T: "doble parĂ©ntesis izquierdo"] # 0x2e28 (en: 'left double parentheses', google: 'dejĂł doble parĂ©ntesis de tesas') + - "âž©": [T: "doble parĂ©ntesis derecho"] # 0x2e29 (en: 'right double parentheses', google: 'doble parĂ©ntesis derecha') + - "âžȘ": [T: "dos puntos sobre un punto de puntuaciĂłn"] # 0x2e2a (en: 'two dots over one dot punctuation', google translation) + - "âž«": [T: "un punto sobre dos puntos de puntuaciĂłn"] # 0x2e2b (en: 'one dot over two dots punctuation', google translation) + - "➏": [T: "cuatro puntos de puntuaciĂłn al cuadrado"] # 0x2e2c (en: 'squared four dot punctuation', google translation) + - "âž­": [T: "marca de cinco puntos"] # 0x2e2d (en: 'five dot mark', google translation) + - "âžź": [T: "signo de interrogaciĂłn invertido"] # 0x2e2e (en: 'reversed question mark', google translation) + - "➯": [T: "tilde vertical"] # 0x2e2f (en: 'vertical tilde', google translation) + - "âž°": [T: "punta del anillo"] # 0x2e30 (en: 'ring point', google translation) + - "âž±": [T: "punto medio separador de palabras"] # 0x2e31 (en: 'word separator middle dot', google translation) + - "âžČ": [T: "convertido en coma"] # 0x2e32 (en: 'turned comma', google translation) + - "âžł": [T: "punto elevado"] # 0x2e33 (en: 'raised dot', google translation) + - "➎": [T: "coma elevada"] # 0x2e34 (en: 'raised comma', google translation) + - "âž”": [T: "convertido en punto y coma"] # 0x2e35 (en: 'turned semicolon', google translation) + - "âž¶": [T: "obelisco con portaestandarte izquierdo"] # 0x2e36 (en: 'dagger with left guard', google translation) + - "âž·": [T: "obelisco con portaestandarte derecho"] # 0x2e37 (en: 'dagger with right guard', google translation) + - "âžž": [T: "obelisco girado"] # 0x2e38 (en: 'turned dagger', google translation) + - "âžč": [T: "señal de la mitad superior de la secciĂłn"] # 0x2e39 (en: 'top half section sign', google translation) + - "âžș": [T: "dos em lĂ­nea discontinua"] # 0x2e3a (en: 'two em dash', google translation) + - "âž»": [T: "tres em lĂ­nea discontinua"] # 0x2e3b (en: 'three em dash', google translation) + - "〃": [T: "Ă­dem mark"] # 0x3003 (en: 'ditto mark', google translation) + - "〈": [T: "soporte de ĂĄngulo izquierdo"] # 0x3008 (en: 'left angle bracket') + - "〉": [T: "soporte de ĂĄngulo derecho"] # 0x3009 (en: 'right angle bracket') + - "《": [T: "doble parĂ©ntesis angular izquierdo"] # 0x300a (en: 'left double angle bracket') + - "》": [T: "doble parĂ©ntesis angular derecho"] # 0x300b (en: 'right double angle bracket', MathPlayer: 'cierra parĂ©ntesis angular doble', google: 'soporte de doble ĂĄngulo derecho') + - "「": [T: "soporte de esquina izquierda"] # 0x300c (en: 'left corner bracket', google: 'soporte de esquina izquierda') + - "」": [T: "soporte de esquina derecha"] # 0x300d (en: 'right corner bracket') + - "『": [T: "soporte de esquina blanca izquierda"] # 0x300e (en: 'left white corner bracket', google: 'soporte de esquina blanca izquierda') + - "』": [T: "soporte de esquina blanca derecha"] # 0x300f (en: 'right white corner bracket', google: 'soporte de esquina blanca derecha') + - "【": [T: "soporte Lenticular negro izquierdo"] # 0x3010 (en: 'left black lenticular bracket', google: 'soporte lenticular negro izquierdo') + - "】": [T: "soporte Lenticular Negro Derecho"] # 0x3011 (en: 'right black lenticular bracket', google: 'soporte lenticular negro derecho') + - "〔": [T: "soporte de caparazĂłn de tortuga izquierdo"] # 0x3014 + - "〕": [T: "soporte de caparazĂłn de tortuga derecho"] # 0x3015 + - "〖": [T: "soporte lenticular blanco izquierdo"] # 0x3016 (en: 'left white lenticular bracket') + - "〗": [T: "soporte lenticular blanco derecho"] # 0x3017 (en: 'right white lenticular bracket') + - "〘": [T: "soporte de caparazĂłn de tortuga blanco izquierdo"] # 0x3018 (en: 'left white tortoise shell bracket', google: 'soporte de carcasa de tortuga blanca izquierda') + - "〙": [T: "soporte de caparazĂłn de tortuga blanco derecho"] # 0x3019 (en: 'right white tortoise shell bracket', google: 'soporte de carcasa de tortuga blanca derecha') + - "〚": [T: "corchete vacĂ­o izquierdo"] # 0x301a (en: 'left white square bracket') + - "〛": [T: "corchete vacĂ­o derecho"] # 0x301b (en: 'right white square bracket', MathPlayer: 'cierra corchete vacĂ­o', google: 'soporte cuadrado blanco derecho') + - "〜": [T: "lĂ­nea discontinua ondulada"] # 0x301c (en: 'wave dash', google: 'ola de ola') + - "〰": [T: "lĂ­nea discontinua en zigzag"] # 0x3030 (en: 'wavy dash', google: 'dash ondulado') + - "㉈": [T: "nĂșmero diez rodeado por un cĂ­rculo en un cuadrado negro"] # 0x3248 (en: 'circled number ten on black square', google: 'circlado nĂșmero diez en black square') + - "㉉": [T: "nĂșmero veinte rodeado por un cĂ­rculo en un cuadrado negro"] # 0x3249 (en: 'circled number twenty on black square', google: 'nĂșmero de cĂ­rculo veinte en black square') + - "㉊": [T: "nĂșmero treinta rodeado por un cĂ­rculo en un cuadrado negro"] # 0x324a (en: 'circled number thirty on black square', google: 'nĂșmero de cĂ­rculo treinta en black square') + - "㉋": [T: "nĂșmero cuarenta rodeado por un cĂ­rculo en un cuadrado negro"] # 0x324b (en: 'circled number forty on blacks square', google: 'nĂșmero de cĂ­rculo cuarenta en blacks square') + - "㉌": [T: "nĂșmero cincuenta rodeado por un cĂ­rculo en un cuadrado negro"] # 0x324c (en: 'circled number fifty on black square', google: 'nĂșmero de cĂ­rculo cincuenta en black square') + - "㉍": [T: "nĂșmero sesenta rodeado por un cĂ­rculo en un cuadrado negro"] # 0x324d (en: 'circled number sixty on black square', google: 'nĂșmero de cĂ­rculos sesenta en black square') + - "㉎": [T: "nĂșmero setenta rodeado por un cĂ­rculo en un cuadrado negro"] # 0x324e (en: 'circled number seventy on black square', google: 'nĂșmero de cĂ­rculo setenta en black square') + - "㉏": [T: "nĂșmero ochenta rodeado por un cĂ­rculo en un cuadrado negro"] # 0x324f (en: 'circled number eighty on black square', google: 'nĂșmero de cĂ­rculo aty en black square') + - "㉑": [T: "nĂșmero veintiuno rodeado por un cĂ­rculo"] # 0x3251 (en: 'circled number twenty one', google translation) + - "㉒": [T: "nĂșmero veintidĂłs rodeado por un cĂ­rculo"] # 0x3252 (en: 'circled number twenty two', google translation) + - "㉓": [T: "nĂșmero veintitrĂ©s rodeado por un cĂ­rculo"] # 0x3253 (en: 'circled number twenty three', google translation) + - "㉔": [T: "nĂșmero veinticuatro rodeado por un cĂ­rculo"] # 0x3254 (en: 'circled number twenty four', google translation) + - "㉕": [T: "nĂșmero veinticinco rodeado por un cĂ­rculo"] # 0x3255 (en: 'circled number twenty five', google translation) + - "㉖": [T: "nĂșmero veintisĂ©is rodeado por un cĂ­rculo"] # 0x3256 (en: 'circled number twenty six', GPT-5.4 fixed translation) + - "㉗": [T: "nĂșmero veintisiete rodeado por un cĂ­rculo"] # 0x3257 (en: 'circled number twenty seven', google translation) + - "㉘": [T: "nĂșmero veintiocho rodeado por un cĂ­rculo"] # 0x3258 (en: 'circled number twenty eight', google translation) + - "㉙": [T: "nĂșmero veintinueve rodeado por un cĂ­rculo"] # 0x3259 (en: 'circled number twenty nine', GPT-5.4 fixed translation) + - "㉚": [T: "nĂșmero treinta rodeado por un cĂ­rculo"] # 0x325a (en: 'circled number thirty', google translation) + - "㉛": [T: "nĂșmero treinta y uno rodeado por un cĂ­rculo"] # 0x325b (en: 'circled number thirty one', GPT-5.4 fixed translation) + - "㉜": [T: "nĂșmero treinta y dos rodeado por un cĂ­rculo"] # 0x325c (en: 'circled number thirty two', google translation) + - "㉝": [T: "nĂșmero treinta y tres rodeado por un cĂ­rculo"] # 0x325d (en: 'circled number thirty three', google translation) + - "㉞": [T: "nĂșmero treinta y cuatro rodeado por un cĂ­rculo"] # 0x325e (en: 'circled number thirty four', google translation) + - "㉟": [T: "nĂșmero treinta y cinco rodeado por un cĂ­rculo"] # 0x325f (en: 'circled number thirty five', google translation) + - "㊱": [T: "nĂșmero treinta y seis rodeado por un cĂ­rculo"] # 0x32b1 (en: 'circled number thirty six', google translation) + - "ăŠČ": [T: "nĂșmero treinta y siete rodeado por un cĂ­rculo"] # 0x32b2 (en: 'circled number thirty seven', GPT-5.4 translation) + - "㊳": [T: "nĂșmero treinta y ocho rodeado por un cĂ­rculo"] # 0x32b3 (en: 'circled number thirty eight', GPT-5.4 translation) + - "㊮": [T: "nĂșmero treinta y nueve rodeado por un cĂ­rculo"] # 0x32b4 (en: 'circled number thirty nine', GPT-5.4 translation) + - "㊔": [T: "nĂșmero cuarenta rodeado por un cĂ­rculo"] # 0x32b5 (en: 'circled number forty', GPT-5.4 translation) + - "㊶": [T: "nĂșmero cuarenta y uno rodeado por un cĂ­rculo"] # 0x32b6 (en: 'circled number forty one', GPT-5.4 translation) + - "㊷": [T: "nĂșmero cuarenta y dos rodeado por un cĂ­rculo"] # 0x32b7 (en: 'circled number forty two', GPT-5.4 translation) + - "㊾": [T: "nĂșmero cuarenta y tres rodeado por un cĂ­rculo"] # 0x32b8 (en: 'circled number forty three', GPT-5.4 translation) + - "ăŠč": [T: "nĂșmero cuarenta y cuatro rodeado por un cĂ­rculo"] # 0x32b9 (en: 'circled number forty four', GPT-5.4 translation) + - "ăŠș": [T: "nĂșmero cuarenta y cinco rodeado por un cĂ­rculo"] # 0x32ba (en: 'circled number forty five', GPT-5.4 translation) + - "㊻": [T: "nĂșmero cuarenta y seis rodeado por un cĂ­rculo"] # 0x32bb (en: 'circled number forty six', GPT-5.4 translation) + - "ăŠŒ": [T: "nĂșmero cuarenta y siete rodeado por un cĂ­rculo"] # 0x32bc (en: 'circled number forty seven', GPT-5.4 translation) + - "ăŠœ": [T: "nĂșmero cuarenta y ocho rodeado por un cĂ­rculo"] # 0x32bd (en: 'circled number forty eight', GPT-5.4 translation) + - "ăŠŸ": [T: "nĂșmero cuarenta y nueve rodeado por un cĂ­rculo"] # 0x32be (en: 'circled number forty nine', GPT-5.4 translation) + - "㊿": [T: "nĂșmero cincuenta rodeado por un cĂ­rculo"] # 0x32bf (en: 'circled number fifty', GPT-5.4 translation) + - "㋌": [T: "mercurio"] # 0x32cc (en: 'mercury', google translation) + - "㋍": [T: "ergs"] # 0x32cd (google translation) + - "㋎": [T: "electronvoltios"] # 0x32ce (en: 'electron volts', google translation) + - "㋏": [T: "señal de responsabilidad limitada"] # 0x32cf (en: 'limited liability sign', google translation) + - "ă±": [T: "hectopascales"] # 0x3371 (en: 'hectopascals', google translation) + - "ăČ": [T: "daltons"] # 0x3372 (google translation) + - "㍳": [T: "unidades astronĂłmicas"] # 0x3373 (en: 'astronomical units', google translation) + - "㍮": [T: "barras"] # 0x3374 (en: 'bars', google translation) + - "ă”": [T: "o v"] # 0x3375 (google translation) + - "ă¶": [T: "parsecs"] # 0x3376 (google translation) + - "ă·": [T: "decĂ­metros"] # 0x3377 (en: 'decimeters', google translation) + - "㍾": [T: "decĂ­metros al cuadrado"] # 0x3378 (en: 'decimeters squared', google translation) + - "ăč": [T: "decĂ­metros al cubo"] # 0x3379 (en: 'decimeters cubed', google translation) + - "ăș": [T: "unidades instrumentales"] # 0x337a (en: 'instrumental units', google translation) + - "㎀": [T: "picoamperios"] # 0x3380 (google translation) + - "㎁": [T: "nanoamperios"] # 0x3381 (google translation) + - "㎂": [T: "microamperios"] # 0x3382 (google translation) + - "㎃": [T: "miliamperios"] # 0x3383 (en: 'milliamps', google translation) + - "㎄": [T: "kiloamperios"] # 0x3384 (google translation) + - "㎅": [T: "kilobytes"] # 0x3385 (google translation) + - "㎆": [T: "megabytes"] # 0x3386 (google translation) + - "㎇": [T: "gigabytes"] # 0x3387 (google translation) + - "㎈": [T: "calorĂ­as"] # 0x3388 (en: 'calories', google translation) + - "㎉": [T: "kilocalorĂ­as"] # 0x3389 (en: 'kilocalories', google translation) + - "㎊": [T: "picofaradios"] # 0x338a (google translation) + - "㎋": [T: "nanofaradios"] # 0x338b (google translation) + - "㎌": [T: "microfaradios"] # 0x338c (google translation) + - "㎍": [T: "microgramos"] # 0x338d (en: 'micrograms', google translation) + - "㎎": [T: "miligramos"] # 0x338e (en: 'milligrams', google translation) + - "㎏": [T: "kilogramos"] # 0x338f (en: 'kilograms', google translation) + - "㎐": [T: "hercios"] # 0x3390 (google translation) + - "㎑": [T: "kilohercios"] # 0x3391 (en: 'kilohertz', google translation) + - "㎒": [T: "megahercios"] # 0x3392 (en: 'megahertz', google translation) + - "㎓": [T: "gigahercios"] # 0x3393 (google translation) + - "㎔": [T: "terahercios"] # 0x3394 (google translation) + - "㎕": [T: "microlitros"] # 0x3395 (en: 'microliters', google translation) + - "㎖": [T: "mililitros"] # 0x3396 (google translation) + - "㎗": [T: "decilitros"] # 0x3397 (en: 'deciliters', google translation) + - "㎘": [T: "kilolitros"] # 0x3398 (en: 'kiloliters', google translation) + - "㎙": [T: "femtĂłmetros"] # 0x3399 (en: 'femtometers', google translation) + - "㎚": [T: "micrĂłmetros"] # 0x339b (en: 'micrometers', google translation) + - "㎜": [T: "milĂ­metros"] # 0x339c (en: 'millimeters', google translation) + - "㎝": [T: "centĂ­metros"] # 0x339d (en: 'centimeters', google translation) + - "㎞": [T: "kilĂłmetros"] # 0x339e (en: 'kilometers', google translation) + - "㎟": [T: "milĂ­metros cuadrados"] # 0x339f (en: 'millimeters squared', google translation) + - "㎠": [T: "centĂ­metros cuadrados"] # 0x33a0 (en: 'centimeters squared', google translation) + - "㎡": [T: "metros cuadrados"] # 0x33a1 (en: 'meters squared', google translation) + - "㎱": [T: "kilĂłmetros cuadrados"] # 0x33a2 (en: 'kilometers squared', google translation) + - "㎣": [T: "milĂ­metros cĂșbicos"] # 0x33a3 (en: 'millimeters cubed', google translation) + - "㎀": [T: "centĂ­metros cĂșbicos"] # 0x33a4 (en: 'centimeters cubed', google translation) + - "㎄": [T: "metros cĂșbicos"] # 0x33a5 (en: 'meters cubed', google translation) + - "㎩": [T: "kilĂłmetros cĂșbicos"] # 0x33a6 (en: 'kilometers cubed', google translation) + - "㎧": [T: "metros por segundo"] # 0x33a7 (en: 'meters per second', google translation) + - "㎹": [T: "metros por segundo al cuadrado"] # 0x33a8 (en: 'meters per second squared', google translation) + - "㎩": [T: "pascales"] # 0x33a9 (en: 'pascals', google translation) + - "ăŽȘ": [T: "kilopascales"] # 0x33aa (en: 'kilopascals', google translation) + - "㎫": [T: "megapascales"] # 0x33ab (en: 'megapascals', google translation) + - "㎬": [T: "gigapascales"] # 0x33ac (en: 'gigapascals', google translation) + - "㎭": [T: "radiĂĄn"] # 0x33ad (google translation) + - "㎼": [T: "radiĂĄn por segundo"] # 0x33ae (en: 'rads per second', google translation) + - "㎯": [T: "radiĂĄn por segundo al cuadrado"] # 0x33af (en: 'rads per second squared', google translation) + - "㎰": [T: "picosegundos"] # 0x33b0 (en: 'picoseconds', google translation) + - "㎱": [T: "nanosegundos"] # 0x33b1 (en: 'nanoseconds', google translation) + - "ăŽČ": [T: "microsegundos"] # 0x33b2 (en: 'microseconds', google translation) + - "㎳": [T: "milisegundos"] # 0x33b3 (en: 'milliseconds', google translation) + - "㎮": [T: "picovoltios"] # 0x33b4 (google translation) + - "㎔": [T: "nanovoltios"] # 0x33b5 (en: 'nanovolts', google translation) + - "㎶": [T: "microvoltios"] # 0x33b6 (en: 'microvolts', google translation) + - "㎷": [T: "milivoltios"] # 0x33b7 (en: 'millivolts', google translation) + - "㎾": [T: "kilovoltios"] # 0x33b8 (en: 'kilovolts', google translation) + - "ăŽč": [T: "megavoltios"] # 0x33b9 (google translation) + - "ăŽș": [T: "picovatios"] # 0x33ba (google translation) + - "㎻": [T: "nanovatios"] # 0x33bb (google translation) + - "ăŽŒ": [T: "microvatios"] # 0x33bc (google translation) + - "ăŽœ": [T: "milivatios"] # 0x33bd (google translation) + - "ăŽŸ": [T: "kilovatios"] # 0x33be (en: 'kilowatts', google translation) + - "㎿": [T: "megavatios"] # 0x33bf (google translation) + - "㏀": [T: "kiloohmios"] # 0x33c0 (google translation) + - "㏁": [T: "megaohmios"] # 0x33c1 (google translation) + - "㏂": [T: "attĂłmetros"] # 0x33c2 (en: 'attometers', google translation) + - "㏃": [T: "becquerels"] # 0x33c3 (google translation) + - "㏄": [T: "centĂ­metros cubicos"] # 0x33c4 (en: 'cubic centimeters', google translation) + - "㏅": [T: "candelas"] # 0x33c5 (google translation) + - "㏆": [T: "culombios por kilogramos"] # 0x33c6 (en: 'coulombs per kilogram', google translation) + - "㏇": [T: "volumen minuto"] # 0x33c7 (en: 'cardiac output', google translation) + - "㏈": [T: "decibelios"] # 0x33c8 (en: 'decibels', google translation) + - "㏉": [T: "grises"] # 0x33c9 (en: 'grays', google translation) + - "㏊": [T: "hectĂĄreas"] # 0x33ca (en: 'hectares', google translation) + - "㏋": [T: "caballo de fuerza"] # 0x33cb (en: 'horsepower', google translation) + - "㏌": [T: "pulgadas"] # 0x33cc (en: 'inches', google translation) + - "㏍": [T: "kilokelvins"] # 0x33cd (google translation) + - "㏎": [T: "kilĂłmetros"] # 0x33ce (en: 'kilometers', google translation) + - "㏏": [T: "nudos"] # 0x33cf (en: 'knots', google translation) + - "㏐": [T: "lĂșmenes"] # 0x33d0 (en: 'lumens', google translation) + - "㏑": [T: "logaritmo natural"] # 0x33d1 (en: 'natural log', google translation) + - "㏒": [T: "logaritmo"] # 0x33d2 (en: 'logarithm', google translation) + - "㏓": [T: "lux"] # 0x33d3 (google translation) + - "㏔": [T: "milibares"] # 0x33d4 (google translation) + - "㏕": [T: "mills"] # 0x33d5 (en: 'mills', google translation) + - "㏖": [T: "moles"] # 0x33d6 (google translation) + - "㏗": [T: "p h"] # 0x33d7 (google translation) + - "㏘": [T: "picĂłmetros"] # 0x33d8 (en: 'picometers', google translation) + - "㏙": [T: "partes por millĂłn"] # 0x33d9 (en: 'parts per million', google translation) + - "㏚": [T: "roentgens"] # 0x33da (en: 'petaroentgens', google translation) + - "㏛": [T: "estererradiĂĄn"] # 0x33db (en: 'steradians', google translation) + - "㏜": [T: "sieverts"] # 0x33dc (google translation) + - "㏝": [T: "webers"] # 0x33dd (google translation) + - "㏞": [T: "voltios por metro"] # 0x33de (en: 'volts per meter', google translation) + - "㏟": [T: "amperios por metro"] # 0x33df (en: 'amps per meter', google translation) + - "㏿": [T: "galones"] # 0x33ff (en: 'gallons', google translation) + - "": [T: "sino igual a con sombrero debajo"] # 0xe900 (en: 'equals with hat below', google translation) + - "": [T: "es igual a con signo mĂĄs encima"] # 0xe901 (en: 'equals with plus above', google translation) + - "â©Č": [T: "es igual a con signo mĂĄs encima"] # 0x2a72 (en: 'equals with plus above') + - "": [T: "es igual a con signo mĂĄs debajo"] # 0xe902 (en: 'equals with plus below', google translation) + - "⩱": [T: "es igual a con signo mĂĄs debajo"] # 0x2a71 (en: 'equals with plus below') + - "": [T: "tilde con mĂĄs encima"] # 0xe903 (en: 'tilde with plus above', google translation) + - "⚊": [T: "tilde con signo mĂĄs encima"] # 0x2a26 (en: 'tilde with plus above') + - "": [T: "tilde signo mĂĄs debajo"] # 0xe904 (en: 'tilde with plus below', google translation) + - "⚀": [T: "tilde con signo mĂĄs debajo"] # 0x2a24 (en: 'tilde with plus below') + - "": [T: "doble signo igual sobre mayor que"] # 0xe908 (en: 'equal double over greater than', google translation) + - "": [T: "doble signo igual sobre menor que"] # 0xe909 (en: 'equal double over less than', google translation) + - "âȘ™": [T: "doble signo igual sobre menor que"] # 0x2a99 (en: 'equal double over less than') + - "": [T: "contiene o igual a"] # 0xe90a (en: 'contains or equal to', google translation) + - "⋜": [T: "contiene o igual a"] # 0x22fd (en: 'contains or equal to') + - "": [T: "superconjunto de o igual a"] # 0xe90b (en: 'superset of or equal to', google translation) + - "": [T: "subconjunto de o igual a"] # 0xe90c (en: 'subset of or equal to', google translation) + - "": [T: "signo igual sobre signo menor que"] # 0xe90d (en: 'equal over less than', google translation) + - "": [T: "elemento de o igual a"] # 0xe912 (en: 'element of or equal to', google translation) + - "⋷": [T: "elemento de o igual a"] # 0x22f7 (en: 'element of or equal to') + - "": [T: "igual a o mayor que"] # 0xe913 (en: 'equal to or greater than', google translation) + - "âȘš": [T: "mayor que o igual a"] # 0x2a9a (en: 'equal to or greater than') + - "": [T: "superconjunto aproximado de"] # 0xe914 (en: 'approximate superset of', google translation) + - "⫈": [T: "contiene aproximadamente a"] # 0x2ac8 (en: 'approximate superset of') + - "": [T: "subconjunto aproximado de"] # 0xe915 (en: 'approximate subset of', google translation) + - "⫇": [T: "incluido aproximadamente en"] # 0x2ac7 (en: 'approximate subset of') + - "": [T: "superconjunto de con punto incluido como sub-relaciĂłn"] # 0xe916 (en: 'superset of with dot includes as sub relation', google translation) + - "âȘŸ": [T: "contiene como sub-relaciĂłn a"] # 0x2abe (en: 'superset of with dot includes as sub relation') + - "": [T: "el subconjunto de con dot se incluye en una subselecciĂłn"] # 0xe917 (en: 'subset of with dot is included in as sub relation', google translation) + - "âȘœ": [T: "sub-relaciĂłn de"] # 0x2abd (en: 'subset of with dot is included in as sub relation') + - "": [T: "signo igual a con punto debajo"] # 0xe918 (en: 'equal with dot below', google translation) + - "⩊": [T: "signo igual a con punto debajo"] # 0x2a66 (en: 'equal with dot below') + - "": [T: "punto izquierdo sobre signo menos sobre punto derecho"] # 0xe919 (en: 'left dot over minus over right dot', google translation) + - "": [T: "punto derecho sobre signo menos sobre punto izquierdo"] # 0xe91a (en: 'right dot over minus over left dot', google translation) + - "": [T: "casi igual a menos"] # 0xe91f (en: 'almost equal to minus', google translation) + - "": [T: "taza doble cuadrada"] # 0xe920 (en: 'double square cup', google translation) + - "": [T: "doble cuadrado en mayĂșsculas"] # 0xe921 (en: 'double square cap', google translation) + - "": [T: "menor que igual o mayor que"] # 0xe922 (en: 'less than equal to or greater than', google translation) + - "": [T: "tilde con punto"] # 0xe924 (en: 'tilde with dot', google translation) + - "â©Ș": [T: "tilde con punto"] # 0x2a6a (en: 'tilde with dot') + - "": [T: "tilde con dos puntos"] # 0xe925 (en: 'tilde with two dots', google translation) + - "": [T: "menor que mayor o igual a"] # 0xe926 (en: 'less than greater than or equal to', google translation) + - "âȘ‘": [T: "menor que mayor que o igual a"] # 0x2a91 (en: 'less than greater than or equal to') + - "": [T: "mayor que menor que o igual a"] # 0xe927 (en: 'greater than less than or equal to', google translation) + - "âȘ’": [T: "mayor que menor que o igual a"] # 0x2a92 (en: 'greater than less than or equal to') + - "": [T: "equivalente a o menor que"] # 0xe928 (en: 'equivalent to or less than', google translation) + - "âȘ": [T: "equivalente a o menor que"] # 0x2a9d (en: 'equivalent to or less than') + - "": [T: "equivalente a o mayor que"] # 0xe929 (en: 'equivalent to or greater than', google translation) + - "î€Ș": [T: "operador de caja abierta izquierda"] # 0xe92a (en: 'left open box operator', google translation) + - "": [T: "operador de caja abierta derecha"] # 0xe92b (en: 'right open box operator', google translation) + - "": [T: "idĂ©ntico a con punto"] # 0xe92c (en: 'identical to with dot', google translation) + - "": [T: "mayor que igual a o menor que"] # 0xe92d (en: 'greater than equal to or less than', google translation) + - "": [T: "operador de barra"] # 0xe92e (en: 'bar operator', google translation) + - "": [T: "operador de doble barra"] # 0xe92f (en: 'double bar operator', google translation) + - "": [T: "operador de triple barra"] # 0xe930 (en: 'triple bar operator', google translation) + - "î€Č": [T: "menor que o aproximadamente igual a"] # 0xe932 (en: 'less than or approximately equal to', google translation) + - "": [T: "mayor que o aproximadamente igual a"] # 0xe933 (en: 'greater than or approximately equal to', google translation) + - "": [T: "menor que anidado"] # 0xe936 (en: 'nested less than', google translation) + - "âȘĄ": [T: "mucho menor que"] # 0x2aa1 (en: 'nested less than') + - "": [T: "mayor que anidado"] # 0xe937 (en: 'nested greater than', google translation) + - "âȘą": [T: "mucho mayor que"] # 0x2aa2 (en: 'nested greater than') + - "î€ș": [T: "precede o equivalente a"] # 0xe93a (en: 'precedes or equivalent to', google translation) + - "": [T: "sucede o equivalente a"] # 0xe93b (en: 'succeeds or equivalent to', google translation) + - "î„€": [T: "precede sobre signo igual"] # 0xe940 (en: 'precedes over equal', google translation) + - "": [T: "sucede sobre signo igual"] # 0xe941 (en: 'succeeds over equal', google translation) + - "î„‚": [T: "menor igual inclinado mayor"] # 0xe942 (en: 'less equal slanted greater', google translation) + - "": [T: "mayor igual inclinado menor"] # 0xe943 (en: 'greater equal slanted less', google translation) + - "": [T: "satisfecho por"] # 0xe948 (en: 'satisfied by', google translation) + - "": [T: "lazy s"] # 0xe949 (en: 'lazy s', google translation) + - "": [T: "no afirmaciĂłn"] # 0xe94a (en: 'not assertion', google translation) + - "î„‹": [T: "doble igual"] # 0xe94b (en: 'double equal', google translation) + - "â©”": [T: "doble igual"] # 0x2a75 (en: 'double equal') + - "": [T: "triple igual"] # 0xe94c (en: 'triple equal', google translation) + - "": [T: "regla retardada"] # 0xe94d (en: 'rule delayed', google translation) + - "â§Ž": [T: "regla retardada"] # 0x29f4 + - "": [T: "delimitador de alias"] # 0xe94e (en: 'alias delimiter', google translation) + - "": [T: "subgrupo normal de con barra"] # 0xe950 (en: 'normal subgroup of with bar', google translation) + - "⧏": [T: "subgrupo normal o igual a"] # 0x29cf (en: 'normal subgroup of with bar') + - "î„‘": [T: "contiene como subgrupo normal con barra"] # 0xe951 (en: 'contains as normal subgroup with bar', google translation) + - "⧐": [T: "contiene como subgrupo normal o es igual a"] # 0x29d0 (en: 'contains as normal subgroup with bar') + - "î„”": [T: "implica circular"] # 0xe954 (en: 'round implies', google translation) + - "â„°": [T: "implica circular"] # 0x2970 + - "î„•": [T: "emoticono de sonrisa debajo de una barra"] # 0xe955 (en: 'smile under bar', google translation) + - "î„–": [T: "emoticono de ceño fruncido sobe barra"] # 0xe956 (en: 'frown over bar', google translation) + - "î„—": [T: "superconjunto de o casi igual a"] # 0xe957 (en: 'superset of or almost equal to', google translation) + - "": [T: "subconjunto de o casi igual a"] # 0xe958 (en: 'subset of or almost equal to', google translation) + - "î„™": [T: "mayor que casi igual a o menor que"] # 0xe959 (en: 'greater than almost equal to or less than', google translation) + - "": [T: "menor que casi igual a o mayor que"] # 0xe95a (en: 'less than almost equal or greater than', google translation) + - "": [T: "doble o lĂłgica"] # 0xe95c (en: 'double logical or', google translation) + - "⩔": [T: "o"] # 0x2a54 (en: 'double logical or') + - "": [T: "doble y lĂłgica"] # 0xe95d (en: 'double logical and', google translation) + - "⩓": [T: "y"] # 0x2a53 (en: 'double logical and') + - "": [T: "o lĂłgica con doble barra debajo"] # 0xe95e (en: 'logical or with double bar below', google translation) + - "": [T: "o lĂłgica con barra debajo"] # 0xe95f (en: 'logical or with bar below', google translation) + - "": [T: "casi igual sobre igual"] # 0xe962 (en: 'almost equal over equal', google translation) + - "î„€": [T: "triĂĄngulo apuntando a la izquierda con barra bisectriz"] # 0xe964 + - "î„„": [T: "triĂĄngulo apuntando a la derecha con barra bisectriz"] # 0xe965 (en: 'right pointing triangle with bisecting bar', google translation) + - "": [T: "es igual a la lĂ­nea punteada superior"] # 0xe966 (en: 'equals with dotted top line', google translation) + - "î„§": [T: "precede con dos puntos"] # 0xe967 (en: 'precedes with colon', google translation) + - "": [T: "sucede con dos puntos"] # 0xe968 (en: 'succeeds with colon', google translation) + - "î„©": [T: "mĂĄs pequeño o igual inclinado"] # 0xe969 (en: 'smaller than or equal slanted', google translation) + - "î„Ș": [T: "mĂĄs grande o igual inclinado"] # 0xe96a (en: 'larger than or equal slanted', google translation) + - "î„«": [T: "mucho menor que anidado"] # 0xe96b (en: 'nested very much less than', google translation) + - "": [T: "mucho mayor que anidado"] # 0xe96c (en: 'nested very much greater than', google translation) + - "î„­": [T: "diferencia entre variantes"] # 0xe96d (en: 'difference between variant', google translation) + - "âȘź": [T: "diferencia entre"] # 0x2aae (en: 'difference between variant') + - "": [T: "superposiciĂłn de menor que mayor que"] # 0xe96e (en: 'less than greater than overlay', google translation) + - "âȘ€": [T: "superposiciĂłn de menor que mayor que"] # 0x2aa4 (en: 'less than greater than overlay') + - "": [T: "o lĂłgica y lĂłgica superpuestas"] # 0xe96f (en: 'logical or logical and overlay', google translation) + - "î„°": [T: "superconjunto sobre superconjunto"] # 0xe970 (en: 'superset over superset', google translation) + - "⫖": [T: "superconjunto sobre superconjunto"] # 0x2ad6 (en: 'superset over superset') + - "": [T: "subconjunto sobre subconjunto"] # 0xe971 (en: 'subset over subset', google translation) + - "⫕": [T: "subconjunto por encima de subconjunto"] # 0x2ad5 (en: 'subset over subset') + - "î„Č": [T: "superconjunto sobre subconjunto"] # 0xe972 (en: 'superset over subset', google translation) + - "⫔": [T: "contiene o estĂĄ incluido en"] # 0x2ad4 (en: 'superset over subset') + - "": [T: "subconjunto sobre superconjunto"] # 0xe973 (en: 'subset over superset', google translation) + - "⫓": [T: "estĂĄ incluido o contiene a"] # 0x2ad3 (en: 'subset over superset') + - "î„č": [T: "triple barra vertical"] # 0xe979 (en: 'triple vertical bar', google translation) + - "î„ș": [T: "puntos verticales cuĂĄdruples emparejados"] # 0xe97a (en: 'paired quadruple vertical dots', google translation) + - "î„»": [T: "perpendicular sobre barra"] # 0xe97b (en: 'perpendicular over bar', google translation) + - "⫚": [T: "perpendicular sobre barra"] # 0x2ae8 (en: 'perpendicular over bar') + - "": [T: "doble barra vertical con torniquete a la izquierda"] # 0xe97c (en: 'left turnstile double vertical bar', google translation) + - "": [T: "doble barra vertical con doble torniquete a la izquierda"] # 0xe97d (en: 'double left turnstile double vertical bar', google translation) + - "": [T: "perpendicular sobre perpendicular invertida"] # 0xe97e (en: 'perpendicular over inverted perpendicular', google translation) + - "": [T: "barra vertical con doble torniquete a la izquierda"] # 0xe97f (en: 'double left turnstile vertical bar', google translation) + - "â«€": [T: "barra vertical con doble torniquete a la izquierda"] # 0x2ae4 + - "": [T: "apertura de ĂĄngulo esfĂ©rico"] # 0xe980 (en: 'spherical angle opening up', google translation) + - "": [T: "doble barra"] # 0xe981 (en: 'double slash', google translation) + - "": [T: "ĂĄngulo recto con esquina"] # 0xe982 (en: 'right angle with corner', google translation) + - "": [T: "barra vertical rodeada por un cĂ­rculo"] # 0xe984 (en: 'circled vertical bar', google translation) + - "⊶": [T: "barra vertical rodeada por un cĂ­rculo"] # 0x29b6 (en: 'circled vertical bar') + - "": [T: "signo de divisiĂłn rodeado por un cĂ­rculo"] # 0xe985 (en: 'circled division sign', google translation) + - "âšž": [T: "signo de divisiĂłn rodeado por un cĂ­rculo"] # 0x2a38 (en: 'circled division sign') + - "": [T: "solidus discontinuo"] # 0xe986 (en: 'dashed solidus', google translation) + - "": [T: "barra inversa discontinua"] # 0xe987 (en: 'dashed backslash', google translation) + - "": [T: "lĂ­nea media discontinua"] # 0xe988 (en: 'dashed mid line', google translation) + - "": [T: "barra vertical discontinua"] # 0xe989 (en: 'dashed vertical bar', google translation) + - "": [T: "perpendicular con s"] # 0xe98a (en: 'perpendicular with s', google translation) + - "": [T: "ĂĄngulo con s"] # 0xe98b (en: 'angle with s', google translation) + - "": [T: "apertura izquierda en ĂĄngulo esfĂ©rico"] # 0xe98c (en: 'spherical angle opening left', google translation) + - "": [T: "apertura angular izquierda"] # 0xe98d (en: 'angle opening left', google translation) + - "": [T: "barra vertical con doble garfio"] # 0xe98e (en: 'vertical bar with double hook', google translation) + - "℟": [T: "barra vertical con doble garfio"] # 0x297e (en: 'vertical bar with double hook') + - "": [T: "operador de punto medio radical libre"] # 0xe98f (en: 'medium dot operator free radical', google translation) + - "": [T: "blanco apuntando al triĂĄngulo sobre la barra"] # 0xe990 (en: 'white up pointing triangle above bar', google translation) + - "": [T: "idĂ©ntico y paralelo a"] # 0xe991 (en: 'identical and parallel to', google translation) + - "": [T: "smash product"] # 0xe992 (en: 'smash product', google translation) + - "âšł": [T: "smash product"] # 0x2a33 + - "": [T: "operador de triple barra con barra horizontal"] # 0xe993 (en: 'triple bar operator with horizontal bar', google translation) + - "": [T: "idĂ©ntico a con doble barra cortada"] # 0xe994 (en: 'identical to with double slash', google translation) + - "â§„": [T: "idĂ©ntico a con doble barra cortada"] # 0x29e5 (en: 'identical to with double slash') + - "": [T: "barras triples cruzadas"] # 0xe995 (en: 'triple crossed bars', google translation) + - "": [T: "barra vertical sobre cĂ­rculo"] # 0xe996 (en: 'vertical bar over circle', google translation) + - "": [T: "vertical proporcional a"] # 0xe997 (en: 'vertical proportional to', google translation) + - "": [T: "luna en cuarto menguante"] # 0xe998 (google translation) + - "": [T: "cuarto creciente"] # 0xe999 (google translation) + - "": [T: "onda sinusoidal negativa"] # 0xe9a0 (en: 'negative sine wave', google translation) + - "": [T: "punto entre parĂ©ntesis"] # 0xe9a1 (en: 'parenthesized dot', google translation) + - "": [T: "parĂ©ntesis"] # 0xe9a2 (en: 'parens', google translation) + - "": [T: "emoticono de sonrisa blanca"] # 0xe9a3 (en: 'white smile', google translation) + - "": [T: "emoticono de ceño fruncido"] # 0xe9a4 (en: 'white frown', google translation) + - "": [T: "hexĂĄgono"] # 0xe9a5 (en: 'hexagon', google translation) + - "": [T: "equivalente a sobre signo mĂĄs"] # 0xe9a6 (en: 'equivalent to over plus', google translation) + - "": [T: "signo mĂĄs sobre equivalente a"] # 0xe9a7 (en: 'plus over equivalent to', google translation) + - "": [T: "intersecciĂłn serifs"] # 0xe9b0 (en: 'intersection serifs', google translation) + - "": [T: "union serifs"] # 0xe9b1 (google translation) + - "îŠČ": [T: "intersecciĂłn cuadrada serifs"] # 0xe9b2 (en: 'square intersection serifs', google translation) + - "": [T: "uniĂłn cuadrada serifs"] # 0xe9b3 (google translation) + - "î§ ": [T: "precede equivalente a o sucede a"] # 0xe9e0 (en: 'precedes equivalent to or succeeds', google translation) + - "î§Ą": [T: "sucede equivalente a o precede"] # 0xe9e1 (en: 'succeeds equivalent to or precedes', google translation) + - "î§ą": [T: "precede casi igual a o sucede a"] # 0xe9e2 (en: 'precedes almost equal to or succeeds', google translation) + - "î§Ł": [T: "sucede casi igual o precede"] # 0xe9e3 (en: 'succeeds almost equal to or precedes', google translation) + - "î§°": [T: "menor que equivalente a o mayor que"] # 0xe9f0 (en: 'less than equivalent to or greater than', google translation) + - "î§±": [T: "mayor que equivalente a o menor que"] # 0xe9f1 (en: 'greater than equivalent to or less than', google translation) + - "": [T: "no vert mucho menor que"] # 0xea00 (en: 'not vert much less than', google translation) + - "": [T: "no vert mucho mayor que"] # 0xea01 (en: 'not vert much greater than', google translation) + - "": [T: "variante no mucho menor que"] # 0xea02 (en: 'not much less than variant', google translation) + - "": [T: "variante no mucho mayor que"] # 0xea03 (en: 'not much greater than variant', google translation) + - "": [T: "menor que vert no signos igual doble"] # 0xea04 (en: 'less vert not double equals', google translation) + - "": [T: "gt vert no doble signo igual"] # 0xea05 (en: 'gt vert not double equals', google translation) + - "": [T: "no menor que o igual a"] # 0xea06 (en: 'not less than or equal to', google translation) + - "": [T: "no mayor que o igual a"] # 0xea07 (en: 'not greater than or equal to', google translation) + - "": [T: "ni igual a ni menor que"] # 0xea09 (en: 'neither equal to nor less than', google translation) + - "": [T: "no contiene ni igual a"] # 0xea0a (en: 'does not contain or equal to', google translation) + - "": [T: "ni superconjunto ni igual a"] # 0xea0b (en: 'neither superset of nor equal to', google translation) + - "": [T: "ni subconjunto ni igual a"] # 0xea0c (en: 'neither subset of nor equal to', google translation) + - "": [T: "subconjunto con solidus invertido"] # 0xea0d (en: 'reverse solidus subset', google translation) + - "": [T: "ni igual a ni mayor que"] # 0xea0e (en: 'neither equal to nor greater than', google translation) + - "": [T: "no menos operador tilde"] # 0xea0f (en: 'not minus tilde operator', google translation) + - "": [T: "ni igual a ni menor que"] # 0xea10 (en: 'neither equal to nor less than', google translation) + - "": [T: "no operador tilde"] # 0xea11 (en: 'not tilde operator', google translation) + - "": [T: "ni elemento de ni igual a"] # 0xea12 (en: 'not element of or equal to', google translation) + - "": [T: "ni igual ni mayor que"] # 0xea13 (en: 'neither equal to nor greater than', google translation) + - "": [T: "no casi igual"] # 0xea14 (en: 'not almost equal', google translation) + - "": [T: "no sucede similar"] # 0xea15 (en: 'not succeeds similar', google translation) + - "": [T: "menor que o igual a inclinado con barra cortada"] # 0xea16 (en: 'less than or slanted equal to with slash', google translation) + - "": [T: "mayor que o igual a inclinado con barra cortada"] # 0xea17 (en: 'greater than or slanted equal to with slash', google translation) + - "": [T: "superconjunto solidus"] # 0xea1a (google translation) + - "": [T: "no contiene"] # 0xea1b (en: 'does not contain', google translation) + - "": [T: "no menor que o igual a"] # 0xea1d (en: 'not less than or equal to', google translation) + - "": [T: "no mayor que o igual a"] # 0xea1e (en: 'not greater than or equal to', google translation) + - "": [T: "no casi igual a menos"] # 0xea1f (en: 'not almost equal to minus', google translation) + - "îšą": [T: "conjunto negado de afiliaciĂłn con punto encima"] # 0xea22 (en: 'negated set membership dot above', google translation) + - "": [T: "no ĂĄngulo de vert"] # 0xea2c (en: 'not vert angle', google translation) + - "îš­": [T: "no paralelo inclinado"] # 0xea2d (en: 'not parallel slanted', google translation) + - "îšź": [T: "no operador de barra"] # 0xea2e (en: 'not bar operator', google translation) + - "": [T: "no operador de barra doble"] # 0xea2f (en: 'not double bar operator', google translation) + - "îš°": [T: "no operador de triple barra"] # 0xea30 (en: 'not triple bar operator', google translation) + - "îšČ": [T: "menor que pero no aproximadamente igual a"] # 0xea32 (en: 'less than but not approximately equal to', google translation) + - "âȘ‰": [T: "menor que pero no aproximadamente igual a"] # 0x2a89 (en: 'less than but not approximately equal to') + - "îšł": [T: "mayor que pero no aproximadamente igual a"] # 0xea33 (en: 'greater than but not approximately equal to', google translation) + - "âȘŠ": [T: "mayor que pero no aproximadamente igual a"] # 0x2a8a (en: 'greater than but not approximately equal to') + - "": [T: "menor que o no igual a"] # 0xea34 (en: 'less than or not equal to', google translation) + - "îš”": [T: "mayor que o no igual a"] # 0xea35 (en: 'greater than or not equal to', google translation) + - "îš¶": [T: "menor que no anidado"] # 0xea36 (en: 'not nested less than', google translation) + - "îš·": [T: "mayor que no anidado"] # 0xea37 (en: 'not nested greater than', google translation) + - "îšž": [T: "no mucho menor que"] # 0xea38 (en: 'not much less than', google translation) + - "îšč": [T: "no mucho mayor que"] # 0xea39 (en: 'not much greater than', google translation) + - "îšș": [T: "precede pero no equivalente a"] # 0xea3a (en: 'precedes but not equivalent to', google translation) + - "îš»": [T: "sucede pero no equivalente a"] # 0xea3b (en: 'succeeds but not equivalent to', google translation) + - "": [T: "precede pero no es igual a"] # 0xea3c (en: 'precedes but not equal to', google translation) + - "îšœ": [T: "sucede pero no es igual a"] # 0xea3d (en: 'succeeds but not equal to', google translation) + - "": [T: "ni es igual a ni precede"] # 0xea3e (en: 'does not equal or precede', google translation) + - "îšż": [T: "ni es igual a ni sucede"] # 0xea3f (en: 'does not equal or succeed', google translation) + - "": [T: "precede pero no es igual a"] # 0xea40 (en: 'precedes but not equal to', google translation) + - "âȘ”": [T: "precede pero no es igual a"] # 0x2ab5 (en: 'precedes but not equal to') + - "": [T: "sucede pero no es igual a"] # 0xea41 (en: 'succeeds but not equal to', google translation) + - "âȘ¶": [T: "sucede pero no es igual a"] # 0x2ab6 (en: 'succeeds but not equal to') + - "": [T: "ni subconjunto de ni igual a"] # 0xea42 (en: 'not subset of nor equal to', google translation) + - "": [T: "ni superconjunto de ni igual a"] # 0xea43 (en: 'not superset of nor equal to', google translation) + - "": [T: "subconjunto de o no igual a"] # 0xea44 (en: 'subset of or not equal to', google translation) + - "": [T: "superconjunto de o no igual a"] # 0xea45 (en: 'superset of or not equal to', google translation) + - "": [T: "ni subconjunto de ni igual a"] # 0xea46 (en: 'not subset of nor equal to', google translation) + - "": [T: "ni superconjunto de ni igual a"] # 0xea47 (en: 'not superset of nor equal to', google translation) + - "": [T: "no triple menor que"] # 0xea48 (en: 'not triple less than', google translation) + - "": [T: "no triple mayor que"] # 0xea49 (en: 'not triple greater than', google translation) + - "": [T: "no precede a igual"] + - "": [T: "no sucede a igual"] # 0xea4d (en: 'not succeeds equals', google translation) + - "": [T: "no subgrupo normal de con barra"] # 0xea50 (en: 'not normal subgroup of with bar', google translation) + - "": [T: "no contiene como subgrupo normal con barra"] # 0xea51 (en: 'does not contain as normal subgroup with bar', google translation) + - "": [T: "no diferencia entre"] # 0xea52 (en: 'not difference between', google translation) + - "": [T: "no geomĂ©tricamente equivalente a"] # 0xea53 (en: 'not geometrically equivalent to', google translation) + - "": [T: "no vert similar"] # 0xea54 (en: 'not vert similar', google translation) + - "": [T: "no igual o similar"] # 0xea55 (en: 'not equal or similar', google translation) + - "": [T: "no vert aproximado"] # 0xea56 (en: 'not vert approximate', google translation) + - "": [T: "no aproximadamente idĂ©ntico a"] # 0xea57 (en: 'not approximately identical to', google translation) + - "": [T: "no bump igual"] # 0xea58 (en: 'not bumpy equals', google translation) + - "": [T: "ni un solo bumpy igual a"] # 0xea59 (en: 'not bumpy single equals', google translation) + - "": [T: "no punto igual"] # 0xea5a (en: 'not equal dot', google translation) + - "": [T: "inverso no equivalente"] # 0xea5b (en: 'reverse not equivalent', google translation) + - "î© ": [T: "no subconjunto cuadrado"] # 0xea60 (en: 'not square subset', google translation) + - "": [T: "no superconjunto cuadrado"] # 0xea61 (en: 'not square superset', google translation) + - "": [T: "no casi igual sobre igual"] # 0xea62 (en: 'not almost equal over equal', google translation) + - "": [T: "no estrictamente equivalente a"] # 0xea63 (en: 'not strictly equivalent to', google translation) + - "î©€": [T: "no congruente punto"] # 0xea64 (en: 'not congruent dot', google translation) + - "î©„": [T: "reverso no es igual"] # 0xea65 (en: 'reverse not equal', google translation) + - "î©°": [T: "no vert triĂĄngulo izquierdo es igual a"] # 0xea70 (en: 'not vert left triangle equals', google translation) + - "": [T: "no vert triĂĄngulo recto es igual a"] # 0xea71 (en: 'not vert right triangle equals', google translation) + - "îȘ€": [T: "no parcial"] # 0xea80 (en: 'not partial', google translation) + - "": [T: "extensor de adornos de flecha"] # 0xeb00 (en: 'arrow embellishment extender', google translation) + - "": [T: "flecha hacia la derecha sobre flecha hacia la izquierda"] # 0xeb01 (en: 'arrow rightwards over arrow leftwards', google translation) + - "": [T: "flecha hacia la derecha sobre flecha hacia la izquierda"] # 0xeb02 (en: 'arrow rightwards over arrow leftwards', google translation) + - "": [T: "arpĂłn a la derecha sobre arpĂłn a la izquierda"] # 0xeb03 (en: 'harpoon right over harpoon left', google translation) + - "": [T: "arpĂłn a la derecha sobre arpĂłn a la izquierda"] # 0xeb04 (en: 'harpoon right over harpoon left', google translation) + - "": [T: "doble flecha al nordeste desde el sudoeste"] # 0xeb05 (en: 'double arrow northeast southwest', google translation) + - "": [T: "doble flecha al noroeste desde el sudeste"] # 0xeb06 (en: 'double arrow northwest southeast', google translation) + - "": [T: "extensor de arpĂłn horizontal"] # 0xeb07 (en: 'horizontal harpoon extender', google translation) + - "": [T: "arco en sentido contrario a las agujas del reloj a la izquierda de flecha"] # 0xeb08 (en: 'anticlockwise arc leftwards arrow', google translation) + - "": [T: "arco en sentido contrario a las agujas del reloj a la derecha de flecha"] # 0xeb09 (en: 'anticlockwise arc rightwards arrow', google translation) + - "": [T: "acento con flecha grande hacia la derecha"] # 0xeb0b (en: 'large rightwards arrow accent', google translation) + - "": [T: "acento con flecha grande hacia la izquierda"] # 0xeb0c (en: 'large leftwards arrow accent', google translation) + - "": [T: "punta de flecha hacia la izquierda"] # 0xeb0d (en: 'leftwards arrowhead', google translation) + - "": [T: "punta de flecha hacia la derecha"] # 0xeb0e (en: 'rightwards arrowhead', google translation) + - "": [T: "gran flecha derecha izquierda con trazo"] # 0xeb0f (en: 'large left right arrow with stroke', google translation) + - "": [T: "extensor de flecha doble horizontal"] # 0xeb10 (en: 'horizontal double arrow extender', google translation) + - "": [T: "gran flecha doble izquierda derecha con trazo"] # 0xeb11 (en: 'large left right double arrow with stroke', google translation) + - "": [T: "flecha hacia abajo y hacia la izquierda de flecha hacia arriba"] # 0xeb12 (en: 'downwards arrow leftwards of upwards arrow', google translation) + - "⇔": [T: "flecha hacia arriba y a la derecha de flecha hacia abajo"] # 0x21f5 (en: 'downwards arrow leftwards of upwards arrow') + - "": [T: "flecha hacia la izquierda con la esquina hacia abajo"] # 0xeb13 (en: 'leftwards arrow with corner downwards', google translation) + - "": [T: "flecha hacia la derecha con la esquina hacia arriba"] # 0xeb14 (en: 'rightwards arrow with corner upwards', google translation) + - "": [T: "flecha hacia la izquierda con la esquina hacia arriba"] # 0xeb15 (en: 'leftwards arrow with corner upwards', google translation) + - "": [T: "flecha superior semicircular en sentido contrario a las agujas del reloj con signo mĂĄs"] # 0xeb16 (en: 'anticlockwise top semicircle arrow with plus', google translation) + - "“": [T: "flecha superior semicircular en sentido contrario a las agujas del reloj con signo mĂĄs"] # 0x293d (en: 'anticlockwise top semicircle arrow with plus') + - "": [T: "flecha superior semicircular en sentido a las agujas del reloj con signo menos"] # 0xeb17 (en: 'clockwise top semicircle arrow with minus', google translation) + - "‌": [T: "flecha superior semicircular en sentido a las agujas del reloj con signo menos"] # 0x293c (en: 'clockwise top semicircle arrow with minus') + - "": [T: "flecha hacia la derecha con cola con trazo"] # 0xeb18 (en: 'rightwards arrow with tail with stroke', google translation) + - "": [T: "arpĂłn derecho hacia abajo"] # 0xeb19 (en: 'right harpoon down', google translation) + - "": [T: "arpĂłn izquierdo hacia abajo"] # 0xeb1a (en: 'left harpoon down', google translation) + - "": [T: "arpĂłn derecho izquierdo hacia abajo"] # 0xeb1b (en: 'left right harpoon down', google translation) + - "ℐ": [T: "arpĂłn derecho izquierdo hacia abajo"] # 0x2950 (en: 'left right harpoon down', MathPlayer: 'arpĂłn inferior derecha-izquierda', google: 'arpĂłn derecho izquierdo hacia abajo') + - "": [T: "arpĂłn derecho izquierdo hacia arriba"] # 0xeb1c (en: 'left right harpoon up', google translation) + - "ℎ": [T: "arpĂłn izquierdo derecho hacia arriba"] # 0x294e (en: 'left right harpoon up', MathPlayer: 'arpĂłn superior derecha-izquierda', google: 'arpĂłn derecho izquierdo hacia arriba') + - "": [T: "arpĂłn izquierdo arriba y abajo"] # 0xeb1d (en: 'up down harpoon left', google translation) + - "â„‘": [T: "arpĂłn izquierdo arriba y abajo"] # 0x2951 (en: 'up down harpoon left') + - "": [T: "arpĂłn derecho arriba y abajo"] # 0xeb1e (en: 'up down harpoon right', google translation) + - "ℏ": [T: "arpĂłn derecho arriba y abajo"] # 0x294f (en: 'up down harpoon right') + - "": [T: "flecha hacia arriba a la derecha de flecha hacia abajo"] # 0xeb1f (en: 'upwards arrow to the right of downwards arrow', google translation) + - "⇔": [T: "flecha hacia arriba a la derecha de flecha hacia abajo"] # 0x21f5 + - "": [T: "arpĂłn hacia la izquierda a barra con punta hacia arriba"] # 0xeb20 (en: 'leftwards harpoon to bar with barb upwards', google translation) + - "â„’": [T: "arpĂłn hacia la izquierda a barra con punta hacia arriba"] # 0x2952 (en: 'leftwards harpoon to bar with barb upwards', MathPlayer: 'leftwards harpoon to bar with barb upwards', google: 'arpĂłn de la izquierda para bar con barb hacia arriba') + - "": [T: "arpĂłn hacia la derecha a barra con punta hacia arriba"] # 0xeb21 (en: 'rightwards harpoon to bar with barb upwards', google translation) + - "â„“": [T: "arpĂłn hacia la derechaa a barra con punta hacia arriba"] # 0x2953 (en: 'rightwards harpoon to bar with barb upwards', MathPlayer: 'rightwards harpoon to bar with barb upwards', google: 'arpoon a la derecha para bar con barb hacia arriba') + - "": [T: "arpĂłn hacia la izquierda a barra con punta hacia abajo"] # 0xeb22 (en: 'leftwards harpoon to bar with barb downwards', google translation) + - "â„–": [T: "arpĂłn hacia la izquierda a barra con punta hacia abajo"] # 0x2956 (en: 'leftwards harpoon to bar with barb downwards', MathPlayer: 'leftwards harpoon to bar with barb downwards', google: 'arpoon hacia la izquierda para bar con barb hacia abajo') + - "": [T: "arpĂłn hacia la derecha a barra con punta hacia abajo"] # 0xeb23 (en: 'rightwards harpoon to bar with barb downwards', google translation) + - "â„—": [T: "arpĂłn hacia la derecha a barra con punta hacia abajo"] # 0x2957 (en: 'rightwards harpoon to bar with barb downwards', MathPlayer: 'rightwards harpoon to bar with barb downwards', google: 'arpoon a la derecha para bar con barb hacia abajo') + - "": [T: "arpĂłn hacia la izquierda partiendo de barra con punta hacia arriba"] # 0xeb24 (en: 'leftwards harpoon from bar with barb upwards', google translation) + - "ℚ": [T: "arpĂłn hacia la izquierda partiendo d barra con punta hacia arriba"] # 0x295a (en: 'leftwards harpoon from bar with barb upwards', MathPlayer: 'leftwards harpoon from bar with barb upwards', google: 'arpĂłn de la izquierda desde el bar con barb al alza') + - "": [T: "arpĂłn hacia la derecha partiendo de barra con punta hacia arriba"] # 0xeb25 (en: 'rightwards harpoon from bar with barb upwards', google translation) + - "â„›": [T: "arpĂłn hacia la derecha partiendo de barra con punta hacia arriba"] # 0x295b (en: 'rightwards harpoon from bar with barb upwards', MathPlayer: 'rightwards harpoon from bar with barb upwards', google: 'arpoon a la derecha desde el bar con barb al alza') + - "": [T: "arpĂłn hacia la izquierda partiendo de barra con punta hacia abajo"] # 0xeb26 (en: 'leftwards harpoon from bar with barb downwards', google translation) + - "℞": [T: "arpĂłn hacia la izquierda partiendo de barra con punta hacia abajo"] # 0x295e (en: 'leftwards harpoon from bar with barb downwards', MathPlayer: 'leftwards harpoon from bar with barb downwards', google: 'arpĂłn de la izquierda desde el bar con barb hacia abajo') + - "": [T: "arpĂłn hacia la derecha partiendo de barra con punta hacia abajo"] # 0xeb27 (en: 'rightwards harpoon from bar with barb downwards', google translation) + - "℟": [T: "arpĂłn hacia la derecha partiendo de barra con punta hacia abajo"] # 0x295f (en: 'rightwards harpoon from bar with barb downwards', MathPlayer: 'rightwards harpoon from bar with barb downwards', google: 'arpoon a la derecha desde el bar con barb hacia abajo') + - "": [T: "arpĂłn hacia arriba a barra con punta a la izquierda"] # 0xeb28 (en: 'upwards harpoon to bar with barb leftwards', google translation) + - "℘": [T: "arpĂłn hacia arriba a barra con pĂșa a la izquierda"] # 0x2958 (en: 'upwards harpoon to bar with barb leftwards', MathPlayer: 'upwards harpoon to bar with barb leftwards', google: 'hace arriba hacia arriba para bar con barb a la izquierda') + - "": [T: "arpĂłn hacia abajo a barra con punta hacia la izquierda"] # 0xeb29 (en: 'downwards harpoon to bar with barb leftwards', google translation) + - "â„™": [T: "arpĂłn hacia abajo a barra con punta hacia la izquierda"] # 0x2959 (en: 'downwards harpoon to bar with barb leftwards', MathPlayer: 'downwards harpoon to bar with barb leftwards', google: 'harpoon hacia abajo para bar con barb a la izquierda') + - "îŹȘ": [T: "arpĂłn hacia arriba a barra con punta hacia la derecha"] # 0xeb2a (en: 'upwards harpoon to bar with barb rightwards', google translation) + - "â„”": [T: "arpĂłn hacia arriba a barra con punta hacia la derecha"] # 0x2954 (en: 'upwards harpoon to bar with barb rightwards', MathPlayer: 'upwards harpoon to bar with barb rightwards', google: 'hace arriba hacia arriba para bar con barb a la derecha') + - "": [T: "arpĂłn hacia abajo a barra con punta hacia la derecha"] # 0xeb2b (en: 'downwards harpoon to bar with barb rightwards', google translation) + - "â„•": [T: "arpĂłn hacia abajo a barra con punta hacia la derecha"] # 0x2955 (en: 'downwards harpoon to bar with barb rightwards', MathPlayer: 'downwards harpoon to bar with barb rightwards', google: 'harpoon hacia abajo para bar con barb a la derecha') + - "": [T: "arpĂłn hacia harriba partiendo de barra con punta hacia la izquierda"] # 0xeb2c (en: 'upwards harpoon from bar with barb leftwards', google translation) + - "â„ ": [T: "arpĂłn hacia arriba partiendo de barra con punta hacia la izquierda"] # 0x2960 (en: 'upwards harpoon from bar with barb leftwards', MathPlayer: 'upwards harpoon from bar with barb leftwards', google: 'hacia arriba hacia arriba desde el bar con barb a la izquierda') + - "": [T: "arpĂłn hacia abajo partiendo de barra con punta hacia la izquierda"] # 0xeb2d (en: 'downwards harpoon from bar with barb leftwards', google translation) + - "℥": [T: "arpĂłn hacia abajo partiendo de barra con punta hacia la izquierda"] # 0x2961 (en: 'downwards harpoon from bar with barb leftwards', MathPlayer: 'downwards harpoon from bar with barb leftwards', google: 'hosto hacia abajo de bar con barb a la izquierda') + - "": [T: "arpĂłn hacia arriba partiendo de barra con punta hacia la derecha"] # 0xeb2e (en: 'upwards harpoon from bar with barb rightwards', google translation) + - "ℜ": [T: "arpĂłn hacia arriba partiendo de barra con punta hacia la derecha"] # 0x295c (en: 'upwards harpoon from bar with barb rightwards', MathPlayer: 'upwards harpoon from bar with barb rightwards', google: 'hace arriba hacia arriba desde el bar con barb a la derecha') + - "": [T: "arpĂłn hacia abajo partiendo de barra con punta hacia la derecha"] # 0xeb2f (en: 'downwards harpoon from bar with barb rightwards', google translation) + - "ℝ": [T: "arpĂłn hacia abajo partiendo de barra con punta hacia la derecha"] # 0x295d (en: 'downwards harpoon from bar with barb rightwards', MathPlayer: 'downwards harpoon from bar with barb rightwards', google: 'hosto hacia abajo desde el bar con barb a la derecha') + - "": [T: "flecha hacia arriba a barra"] # 0xeb30 (en: 'upwards arrow to bar', google translation) + - "‒": [T: "flecha hacia arriba a barra"] # 0x2912 + - "": [T: "flecha hacia abajo a barra"] # 0xeb31 (en: 'downwards arrow to bar', google translation) + - "–": [T: "flecha hacia abajo a barra"] # 0x2913 + - "îŹČ": [T: "arpĂłn hacia arriba a la izquierda de arpĂłn hacia abajo"] # 0xeb32 (en: 'upwards harpoon to the left of downwards harpoon', google translation) + - "℟": [T: "arpĂłn hacia arriba a la izquierda de arpĂłn hacia abajo"] # 0x296e (en: 'upwards harpoon to the left of downwards harpoon', MathPlayer: 'upwards harpoon to the left of downwards harpoon', google: 'hacia arriba harpoon a la izquierda de la arpĂłn hacia abajo') + - "": [T: "arpĂłn hacia arriba a la derecha de arpĂłn hacia abajo"] # 0xeb33 (en: 'upwards harpoon to the right of downwards harpoon', google translation) + - "ℯ": [T: "arpĂłn hacia arriba a la derecha de arpĂłn hacia abajo"] # 0x296f (en: 'upwards harpoon to the right of downwards harpoon', MathPlayer: 'upwards harpoon to the right of downwards harpoon', google: 'hacia arriba hacia arriba a la derecha de la arpĂłn hacia abajo') + - "": [T: "punta de flecha hacia arriba"] # 0xeb34 (en: 'upwards arrowhead', google translation) + - "": [T: "punta de flecha hacia abajo"] # 0xeb35 (en: 'downwards arrowhead', google translation) + - "": [T: "doble arpĂłn con punta hacia abajo a la izquierda y punta hacia arriba a la derecha"] # 0xeb36 (en: 'double harpoon with leftwards barb down rightwards barb up', google translation) + - "": [T: "doble arpĂłn con punta hacia arriba a la izquierda y con punta hacia abajo a la derecha"] # 0xeb37 (en: 'double harpoon with leftwards barb up rightwards barb down', google translation) + - "": [T: "flecha hacia la izquierda sobre barra"] # 0xeb38 (en: 'leftwards arrow over bar', google translation) + - "îŹč": [T: "flecha hacia la derecha sobre barra"] # 0xeb39 (en: 'rightwards arrow over bar', google translation) + - "îŹș": [T: "flecha hacia la izquierda debajo de barra"] # 0xeb3a (en: 'leftwards arrow under bar', google translation) + - "": [T: "flecha hacia la derecha debajo de barra"] # 0xeb3b (en: 'rightwards arrow under bar', google translation) + - "îŹŒ": [T: "triple flecha derecha e izquierda"] # 0xeb3c (en: 'left right triple arrow', google translation) + - "": [T: "doble flecha nordeste sudeste"] # 0xeb3f (en: 'double arrow northeast southeast', google translation) + - "": [T: "flecha semicircular izquierda en sentido contrario a las agujas del reloj"] # 0xeb40 (en: 'anticlockwise left semicircle arrow', google translation) + - "â€č": [T: "flecha semicircular izquierda en sentido contrario a las agujas del reloj"] # 0x2939 (en: 'anticlockwise left semicircle arrow') + - "": [T: "flecha semicircular izquierda en sentido a las agujas del reloj"] # 0xeb41 (en: 'clockwise left semicircle arrow', google translation) + - "": [T: "cĂ­rculo abierto izquierdo flecha derecha izquierda"] # 0xeb42 (en: 'left open circle left right arrow', google translation) + - "": [T: "flecha hacia la derecha sobre tilde"] # 0xeb44 (en: 'rightwards arrow over tilde', google translation) + - "ℎ": [T: "flecha hacia la derecha sobre tilde"] # 0x2974 (en: 'rightwards arrow over tilde') + - "": [T: "flecha hacia la izquierda sobre tilde"] # 0xeb45 (en: 'leftwards arrow over tilde', google translation) + - "ℳ": [T: "flecha hacia la derecha sobre tilde"] # 0x2973 (en: 'leftwards arrow over tilde') + - "": [T: "arpĂłn hacia la izquierda sobre barra"] # 0xeb48 (en: 'leftwards harpoon over bar', google translation) + - "â„Ș": [T: "arpĂłn hacia la izquierda sobre barra"] # 0x296a (en: 'leftwards harpoon over bar') + - "": [T: "arpĂłn hacia la derecha sobre barra"] # 0xeb49 (en: 'rightwards harpoon over bar', google translation) + - "ℏ": [T: "arpĂłn hacia la derecha sobre barra"] # 0x296c (en: 'rightwards harpoon over bar') + - "": [T: "arpĂłn hacia la izquierda debajo de barra"] # 0xeb4a (en: 'leftwards harpoon under bar', google translation) + - "â„«": [T: "arpĂłn hacia la izquierda debajo de barra"] # 0x296b (en: 'leftwards harpoon under bar') + - "": [T: "arpĂłn hacia la derecha debajo de barra"] # 0xeb4b (en: 'rightwards harpoon under bar', google translation) + - "â„­": [T: "arpĂłn hacia la derecha debajo de barra"] # 0x296d (en: 'rightwards harpoon under bar') + - "": [T: "flecha corta negra hacia la izquierda"] # 0xeb4c (en: 'squat black leftwards arrow', google translation) + - "": [T: "flecha semicircular derecha en sentido a las agujas del reloj"] # 0xeb50 (en: 'clockwise right semicircle arrow', google translation) + - "„": [T: "flecha semicircular derecha en sentido a las agujas del relojt"] # 0x2938 (en: 'clockwise right semicircle arrow') + - "": [T: "flecha semicircular derecha en sentido contrario a las agujas del reloj"] # 0xeb51 (en: 'anticlockwise right semicircle arrow', google translation) + - "": [T: "cĂ­rculo abierto izquierdo arpĂłn izquierdo derecho"] # 0xeb52 (en: 'left open circle left right harpoon', google translation) + - "": [T: "flecha hacia arriba y hacia la izquierda de barra vertical"] # 0xeb58 (en: 'upwards arrow leftwards of vertical bar', google translation) + - "": [T: "flecha hacia abajo hacia la izquierda de barra vertical"] # 0xeb59 (en: 'downwards arrow leftwards of vertical bar', google translation) + - "": [T: "flecha hacia arriba hacia la derecha de barra vertical"] # 0xeb5a (en: 'upwards arrow rightwards of vertical bar', google translation) + - "": [T: "flecha hacia abajo hacia la derecha de barra vertical"] # 0xeb5b (en: 'downwards arrow rightwards of vertical bar', google translation) + - "": [T: "flecha hacia la derecha con garfio hacia abajo extendido"] # 0xeb5c (en: 'rightwards arrow with extended downwards hook', google translation) + - "": [T: "flecha hacia la izquierda con gancho extendido"] # 0xeb5d (en: 'leftwards arrow with extended hook', google translation) + - "": [T: "flecha hacia la izquierda con gancho hacia abajo extendido"] # 0xeb5e (en: 'leftwards arrow with extended downwards hook', google translation) + - "": [T: "flecha hacia la derecha con garfio extendido"] # 0xeb5f (en: 'rightwards arrow with extended hook', google translation) + - "î­ ": [T: "no flecha derecha ondulada"] # 0xeb60 (en: 'not right arrow wavy', google translation) + - "î­Ą": [T: "no flecha derecha curva"] # 0xeb61 (en: 'not right arrow curved', google translation) + - "î­š": [T: "arpĂłn hacia arriba hacia la izquierda de barra vertical"] # 0xeb68 (en: 'upwards harpoon leftwards of vertical bar', google translation) + - "î­©": [T: "arpoon hacia abajo hacia la izquierda de barra vertical"] # 0xeb69 (en: 'downwards harpoon leftwards of vertical bar', google translation) + - "î­Ș": [T: "arpĂłn hacia arriba hacia la derecha de barra vertical"] # 0xeb6a (en: 'upwards harpoon rightwards of vertical bar', google translation) + - "î­«": [T: "arpĂłn hacia abajo hacia la derecha de barra vertical"] # 0xeb6b (en: 'downwards harpoon rightwards of vertical bar', google translation) + - "î­Ź": [T: "extensor de flecha doble vertical"] # 0xeb6c (en: 'vertical double arrow extender', google translation) + - "î­­": [T: "arpĂłn vertical con extensor de punta izquierda"] # 0xeb6d (en: 'vertical harpoon with barb left extender', google translation) + - "î­ź": [T: "arpĂłn vertical con extensor de punta derecha"] # 0xeb6e (en: 'vertical harpoon with barb right extender', google translation) + - "î­Ż": [T: "arpĂłn derecho sobre arpĂłn izquierdo a la derecha"] # 0xeb6f (en: 'right harpoon over left harpoon right', google translation) + - "î­°": [T: "arpĂłn derecho sobre arpĂłn izquierdo a la izquierda"] # 0xeb70 (en: 'right harpoon over left harpoon left', google translation) + - "î­±": [T: "arpĂłn izquierdo sobre arpĂłn derecho a la derecha"] # 0xeb71 (en: 'left harpoon over right harpoon right', google translation) + - "î­Č": [T: "arpĂłn izquierdo sobre arpĂłn derecho a la izquierda"] # 0xeb72 (en: 'left harpoon over right harpoon left', google translation) + - "î­ł": [T: "flecha hacia la izquierda partiendo de punta de flecha de barra"] # 0xeb73 (en: 'leftwards arrow from bar arrowhead', google translation) + - "î­Ž": [T: "flecha hacia la izquierda y derecha partiendo de extensor de barra"] # 0xeb74 (en: 'leftwards rightwards arrow from bar extender', google translation) + - "î­”": [T: "flecha hacia la izquierda partiendo de cola de barra"] # 0xeb75 (en: 'leftwards arrow from bar tail', google translation) + - "î­¶": [T: "flecha hacia la derecha partiendo de cola de barra"] # 0xeb76 (en: 'rightwards arrow from bar tail', google translation) + - "î­·": [T: "flecha hacia la derecha partiendo de punta de flecha de barra"] # 0xeb77 (en: 'rightwards arrow from bar arrowhead', google translation) + - "î­ž": [T: "arpĂłn hacia arriba partiendo de barra punzante con punta de flecha hacia la izquierda"] # 0xeb78 (en: 'upwards harpoon from bar with barb leftwards arrowhead', google translation) + - "î­č": [T: "flecha hacia la derecha sobre flecha derecha hacia la izquierda"] # 0xeb79 (en: 'rightwards arrow over leftwards arrow right', google translation) + - "î­ș": [T: "flecha derecha sobre flecha izquierda hacia la izquierda"] # 0xeb7a (en: 'rightwards arrow over leftwards arrow left', google translation) + - "î­»": [T: "flecha hacia la izquierda sobre flecha derecha hacia la derecha"] # 0xeb7b (en: 'leftwards arrow over rightwards arrow right', google translation) + - "î­Œ": [T: "flecha hacia la izquierda sobre flecha derecha hacia la izquierda"] # 0xeb7c (en: 'leftwards arrow over rightwards arrow left', google translation) + - "î­œ": [T: "flecha hacia arriba partiendo de punta de flecha de barra"] # 0xeb7d (en: 'upwards arrow from bar arrowhead', google translation) + - "î­Ÿ": [T: "flecha hacia arriba partiendo de la cola de la barra"] # 0xeb7e (en: 'upwards arrow from bar tail', google translation) + - "î­ż": [T: "flecha hacia abajo partiendo de la cola de la barra"] # 0xeb7f (en: 'downwards arrow from bar tail', google translation) + - "": [T: "flecha hacia abajo partiendo de la punta de flecha de la barra"] # 0xeb80 (en: 'downwards arrow from bar arrowhead', google translation) + - "": [T: "arpĂłn hacia abajo partiendo de punta de flecha derecha de barra punzante"] # 0xeb81 (en: 'downwards harpoon from bar with barb rightwards arrowhead', google translation) + - "": [T: "arpĂłn hacia arriba a la izquierda del fondo del arpĂłn hacia abajo"] # 0xeb82 (en: 'upwards harpoon to the left of downwards harpoon bottom', google translation) + - "": [T: "arpĂłn hacia arriba a la izquierda de extensor de arpĂłn hacia abajo"] # 0xeb83 (en: 'upwards harpoon to the left of downwards harpoon extender', google translation) + - "": [T: "arpĂłn hacia abajo a la izquierda de parte superior de arpĂłn hacia arriba"] # 0xeb84 (en: 'downwards harpoon to the left of upwards harpoon top', google translation) + - "": [T: "arpĂłn hacia arriba a la izquierda de parte superior de arpĂłn hacia abajo"] # 0xeb85 (en: 'upwards harpoon to the left of downwards harpoon top', google translation) + - "": [T: "arpĂłn hacia abajo a la izquierda de extensor de arpĂłn hacia arriba"] # 0xeb86 (en: 'downwards harpoon to the left of the upwards harpoon extender', google translation) + - "": [T: "arpĂłn hacia arriba a la izquierda de parte inferior d arpĂłn hacia abajo"] # 0xeb87 (en: 'downwards harpoon to the left of the upwards harpoon bottom', google translation) + - "": [T: "flecha hacia arriba hacia la izquierda del fondo de flecha hacia abajo"] # 0xeb88 (en: 'upwards arrow leftwards of downwards arrow bottom', google translation) + - "": [T: "flecha hacia abajo hacia la izquierda de la parte superiorde flecha hacia arriba"] # 0xeb89 (en: 'downwards arrow leftwards of upwards arrow top', google translation) + - "": [T: "flecha hacia arriba hacia la izquierda de la parte superior de flecha hacia abajo"] # 0xeb8a (en: 'upwards arrow leftwards of downwards arrow top', google translation) + - "": [T: "flecha hacia abajo hacia la izquierda de la parte inferior de flecha hacia arriba"] # 0xeb8b (en: 'downwards arrow leftwards of upwards arrow bottom', google translation) + - "": [T: "extensor de flechas hacia izquierda y derecha"] # 0xeb8c (en: 'leftwards rightwards arrows extender', google translation) + - "": [T: "extensor de flecha nordeste"] # 0xeb8d (google translation) + - "": [T: "extensor de flecha noroeste"] # 0xeb8e (google translation) + - "": [T: "parĂ©ntesis izquierdo apuntando hacia abajo"] # 0xec00 (en: 'down pointing brace left', google translation) + - "": [T: "parĂ©ntesis medio apuntando hacia abajo"] # 0xec01 (google translation) + - "": [T: "parĂ©ntesis derecho apuntando hacia abajo"] # 0xec02 (en: 'down pointing brace right', google translation) + - "": [T: "extensor de parĂ©ntesis horizontal"] # 0xec03 (en: 'horizontal brace extender', google translation) + - "": [T: "parĂ©ntesis izquierdo apuntando hacia arriba"] # 0xec04 (en: 'up pointing brace left', google translation) + - "": [T: "parĂ©ntesis medio apuntando hacia arriba"] # 0xec05 (en: 'up pointing brace mid', google translation) + - "": [T: "parĂ©ntesis derecho apuntando hacia arriba"] # 0xec06 (en: 'up-pointing brace right', google translation) + - "": [T: "barra vertical izquierda"] # 0xec07 (en: 'left vertical bar', google translation) + - "": [T: "barra vertical derecha"] # 0xec08 (en: 'right vertical bar', google translation) + - "": [T: "doble barra vertical izquierda"] # 0xec09 (en: 'left double vertical bar', google translation) + - "": [T: "doble barra vertical derecha"] # 0xec0a (en: 'right double vertical bar', google translation) + - "": [T: "extensor de soporte horizontal"] # 0xec0b (en: 'horizontal bracket extender', google translation) + - "": [T: "debajo de corchete"] # 0xec0c (en: 'under square bracket', google translation) + - "⎔": [T: "debajo de corchete"] # 0x23b5 (en: 'under square bracket') + - "": [T: "encima de corchete"] # 0xec0d (en: 'over square bracket', google translation) + - "⎮": [T: "encima de corchete"] # 0x23b4 (en: 'over square bracket') + - "": [T: "debajo de parĂ©ntesis izquierdo"] # 0xec0e (en: 'under bracket left', google translation) + - "": [T: "debajo de parĂ©ntesis derecho"] # 0xec0f (en: 'under bracket right', google translation) + - "": [T: "sobre parĂ©ntesis izquierdo"] # 0xec10 (en: 'over bracket left', google translation) + - "": [T: "encima de parĂ©ntesis derecho"] # 0xec11 (en: 'over bracket right', google translation) + - "": [T: "abrir parĂ©ntesis 1"] # 0xec12 (en: 'left parens 1', google translation) + - "": [T: "abrir parĂ©ntesis 2"] # 0xec13 (en: 'left parens 2', google translation) + - "": [T: "abrir parĂ©ntesis 3"] # 0xec14 (en: 'left parens 3', google translation) + - "": [T: "abrir parĂ©ntesis 4"] # 0xec15 (en: 'left parens 4', google translation) + - "": [T: "cerrar parĂ©ntesis 1"] # 0xec16 (en: 'right parens 1', google translation) + - "": [T: "cerrar parĂ©ntesis 2"] # 0xec17 (en: 'right parens 2', google translation) + - "": [T: "cerrar parĂ©ntesis 3"] # 0xec18 (en: 'right parens 3', google translation) + - "": [T: "cerrar parĂ©ntesis 4"] # 0xec19 (en: 'right parens 4', google translation) + - "": [T: "radical 1"] # 0xec1a (google translation) + - "": [T: "radical 2"] # 0xec1b (google translation) + - "": [T: "radical 3"] # 0xec1c (google translation) + - "": [T: "radical 4"] # 0xec1d (google translation) + - "": [T: "radical 5"] # 0xec1e (google translation) + - "": [T: "radical inferior"] # 0xec1f (en: 'radical bottom', google translation) + - "î° ": [T: "extensor de radical vertical"] # 0xec20 (en: 'radical vertical extender', google translation) + - "î°Ą": [T: "radical superior"] # 0xec21 (en: 'radical top', google translation) + - "î°ą": [T: "soporte blanco izquierdo superior"] # 0xec22 (en: 'left white bracket top', google translation) + - "î°Ł": [T: "extensor de soporte blanco izquierdo"] # 0xec23 (en: 'left white bracket extender', google translation) + - "î°€": [T: "soporte blanco izquierdo inferior"] # 0xec24 (en: 'left white bracket bottom', google translation) + - "î°„": [T: "soporte blanco derecho superior"] # 0xec25 (en: 'right white bracket top', google translation) + - "î°Š": [T: "extensor de soporte blanco derecho"] # 0xec26 (en: 'right white bracket extender', google translation) + - "î°§": [T: "soporte blanco derecho inferior"] # 0xec27 (en: 'right white bracket bottom', google translation) + - "î°°": [T: "soporte blanco izquierdo rotacional"] # 0xec30 (en: 'left white curly bracket', google translation) + - "î°±": [T: "soporte blanco derecho rotacional"] # 0xec31 (en: 'right white curly bracket', google translation) + - "î°Č": [T: "signo de divisiĂłn largo"] # 0xec32 (google translation) + - "î°ł": [T: "extensor de signo de divisiĂłn largo"] # 0xec33 (en: 'long division sign extender', google translation) + - "î°Ž": [T: "divisiĂłn corta"] # 0xec34 (en: 'short division', google translation) + - "": [T: "doble sudoeste al nordeste uniĂłn em"] # 0xec40 (en: 'double southwest to northeast em bond', google translation) + - "": [T: "doble noroeste al sudeste uniĂłn em"] # 0xec41 (en: 'double northwest to southeast em bond', google translation) + - "": [T: "enlace em horizontal Ășnico"] # 0xec42 (en: 'single horizontal em bond', google translation) + - "": [T: "doble enlace em horizontal"] # 0xec43 (en: 'double horizontal em bond', google translation) + - "": [T: "triple enlace em horizontal"] # 0xec44 (en: 'triple horizontal em bond', google translation) + - "": [T: "enlace em Ășnico vertical"] # 0xec45 (en: 'single vertical em bond', google translation) + - "": [T: "doble enlace em vertical"] # 0xec46 (en: 'double vertical em bond', google translation) + - "": [T: "triple enlace em vertical"] # 0xec47 (en: 'triple vertical em bond', google translation) + - "": [T: "menr que enlace em"] # 0xec48 (en: 'less than em bond', google translation) + - "": [T: "mayor que enlace em"] # 0xec49 (en: 'greater than em bond', google translation) + - "": [T: "enlace Ășnico horizontal"] # 0xec4a (en: 'single horizontal en bond', google translation) + - "": [T: "doble enlace horizontal en"] # 0xec4b (en: 'double horizontal en bond', google translation) + - "": [T: "triple enlace horizontal en"] # 0xec4c (en: 'triple horizontal en bond', google translation) + - "îȀ": [T: "rectĂĄngulo superior izquierdo"] # 0xec80 (en: 'top left rectangle', google translation) + - "îȁ": [T: "rectĂĄngulo inferior izquierdo"] # 0xec81 (en: 'bottom left rectangle', google translation) + - "îȐ": [T: "rectĂĄngulo superior derecho"] # 0xec90 (en: 'top right rectangle', google translation) + - "îȑ": [T: "rectĂĄngulo inferior derecho"] # 0xec91 (en: 'bottom right rectangle', google translation) + - "îȒ": [T: "intersecciĂłn de divisiĂłn sintĂ©tica"] # 0xec92 (en: 'synthetic division corner', google translation) + - "îȓ": [T: "extensor horizontal de divisiĂłn sintĂ©tica"] # 0xec93 (en: 'synthetic division horizontal extender', google translation) + - "îȔ": [T: "extensor vertical de divisiĂłn sintĂ©tica"] # 0xec94 (en: 'synthetic division vertical extender', google translation) + - "îȕ": [T: "extensor de lĂ­mite izquierdo del fondo"] # 0xec95 (en: 'left ceiling floor extender', google translation) + - "îȖ": [T: "extensor de lĂ­mite derecho del fondo"] # 0xec96 (en: 'right ceiling floor extender', google translation) + - "îȗ": [T: "por encima de extensor de soporte"] # 0xec97 (en: 'over bracket extender', google translation) + - "îȘ": [T: "extensor de barra vertical"] # 0xec98 (en: 'vertical bar extender', google translation) + - "îș": [T: "extensor de barra vertical doble izquierda"] # 0xec99 (en: 'left double vertical bar extender', google translation) + - "îȚ": [T: "extensor de barra horizontal"] # 0xec9a (en: 'horizontal bar extender', google translation) + - "îȜ": [T: "debajo de extensor de soporte"] # 0xec9c (en: 'under bracket extender', google translation) + - "îȝ": [T: "apuntando hacia abajo de parĂ©ntesis derecho"] # 0xec9d (en: 'down pointing paren right', google translation) + - "îȞ": [T: "apuntando hacia abajo de extensor de parĂ©ntesis"] # 0xec9e (en: 'down pointing paren extender', google translation) + - "îȟ": [T: "apuntando hacia abajo de parĂ©ntesis izquierdo"] # 0xec9f (en: 'down pointing paren left', google translation) + - "îČ ": [T: "apuntando hacia arriba de extensor de parĂ©ntesis"] # 0xeca0 (en: 'up pointing brace extender', google translation) + - "îČĄ": [T: "apuntando hacia arriba de parĂ©ntesis de izquierda"] # 0xeca1 (en: 'up pointing paren left', google translation) + - "îČą": [T: "apuntando hacia arriba de extensor de parĂ©ntesis"] # 0xeca2 (en: 'up pointing paren extender', google translation) + - "îČŁ": [T: "apuntando hacia arriba de parĂ©ntesis derecho"] # 0xeca3 (en: 'up pointing paren right', google translation) + - "îČ€": [T: "apuntando hacia abajo de extensor de parĂ©ntesis"] # 0xeca4 (google translation) + - "": [T: "constante de Planck sobre dos barras pi"] # 0xed00 (en: 'planck constant over two pi bar', google translation) + - "": [T: "espejo g"] # 0xed01 (en: 'mirror g', google translation) + - "": [T: "j sin puntos"] # 0xed02 (google translation) + - "": [T: "digamma"] # 0xed03 (google translation) + - "ϝ": [T: "digamma"] # 0x3dd + - "": [T: "d"] # 0xed10 (en: 'd', google translation) + - "": [T: "e"] # 0xed11 (en: 'e', google translation) + - "": [T: "i"] # 0xed12 (en: 'i', google translation) + - "": [T: "j"] # 0xed13 (en: 'j', google translation) + - "ⅅ": + - spell: "translate('.', 'ⅅ', 'DD')" # 0xed16, 0x2145 + +# The private use chars are efrom MathType + - "": [T: "bucle integral de contorno en sentido contrario a las agujas del reloj"] # 0xee00 (en: 'anticlockwise contour integral loop', google translation) + - "": [T: "bucle integral de contorno en sentido de las agujas del reloj"] # 0xee01 (en: 'clockwise contour integral loop', google translation) + - "": [t: ""] # 0xee04 + - "": [t: ""] # 0xee05 + - "": [t: ""] # 0xee06 + - "": [t: ""] # 0xee07 + - "": [t: ""] # 0xee08 + - "": [t: ""] # 0xee09 + - "": [t: ""] # 0xee0a + - "": [t: ""] # 0xee0b + - "": [t: ""] # 0xee0c + - "": [T: "ornamentaciĂłn de estatus conjunto"] # 0xee0d (en: 'joint status embellishment', google translation) + - "": [T: "ornamentaciĂłn de estatus conjunto"] # 0xee0e (en: 'joint status embellishment left', google translation) + - "": [T: "ornamentaciĂłn derecha de estatus conjunto"] # 0xee0f (en: 'joint status embellishment right', google translation) + - "": [T: "extensiĂłn de ornamentos de estatus conjunto"] # 0xee10 (en: 'joint status embellishment extender', google translation) + - "": [T: "bucle integral"] # 0xee11 (en: 'integral loop', google translation) + - "": [T: "doble bucle integral"] # 0xee12 (en: 'integral loop double', google translation) + - "": [T: "triple bucle integral"] # 0xee13 (en: 'integral loop triple', google translation) + - "": [T: "doble expansiĂłn de bucle integral"] # 0xee15 (en: 'expanding integral loop double', google translation) + - "": [T: "triple expansiĂłn de bucle integral"] # 0xee16 (en: 'expanding integral loop triple', google translation) + - "": [T: "asintĂłticamente igual al acento"] # 0xee17 (en: 'asymptotically equal to accent', google translation) + - "": [T: "signo igual a acetno"] # 0xee18 (en: 'equal sign accent', google translation) + - "": [T: "prima cuĂĄdruple"] # 0xee19 (en: 'quadruple prime', google translation) + - "⁗": [T: "prima cuĂĄdruple"] # 0x2057 (en: 'quadruple prime', MathPlayer: 'cuarta', google: 'prime cuĂĄdruple') + - "": [T: "acento de barra con cĂ­rculo abierto izquierdo"] # 0xee1a (en: 'bar accent with open circle left', google translation) + - "": [T: "acento de barra con cĂ­rculo cerrado izquierdo"] # 0xee1b (en: 'bar accent with closed circle left', google translation) + - "": [T: "acento de barra con cĂ­rculo abierto derecho"] # 0xee1c (en: 'bar accent with open circle right', google translation) + - "": [T: "acento de barra con punto encima"] # 0xee1d (en: 'bar accent with over dot', google translation) + - "": [T: "acento de barra con punto debajo"] # 0xee1e (en: 'bar accent with under dot', google translation) + - "": [T: "acento de barra con doble punto encima"] # 0xee1f (en: 'bar accent with double over dot', google translation) + - "îž ": [T: "acento de barra con doble punto debajo"] # 0xee20 (en: 'bar accent with double under dot', google translation) + - "": [T: "acento de barra con signo de intercalaciĂłn"] # 0xee21 (en: 'bar accent with caret', google translation) + - "îžą": [T: "marcado debajo de acento de barra"] # 0xee22 (en: 'thick under bar accent', google translation) + - "": [T: "acento de barra con cĂ­rculo cerrado a la derecha"] # 0xee23 (en: 'bar accent with closed circle right', google translation) + - "": [T: "gran punto arriba"] # 0xee24 (en: 'large dot above', google translation) + - "": [T: "marca de alineaciĂłn"] # 0xef00 (en: 'alignment mark', google translation) + - "": [t: ""] # 0xef01 + - "​": [t: ""] # 0x200b + - "": [t: ""] # 0xef02 + - " ": [t: ""] # 0x2009 + - "": [t: ""] # 0xef03 + - " ": [t: ""] # 0x205f + - "": [t: ""] # 0xef04 + - "": [t: ""] # 0xef05 + - " ": [t: ""] # 0x2003 + - "": [t: ""] # 0xef06 + - "": [t: ""] # 0xef07 + - "": [t: ""] # 0xef08 + - "": [t: ""] # 0xef09 + - "": [t: ""] # 0xef0a + - " ": [t: ""] # 0x200a + - "îŒą": [t: ""] # 0xef22 + - "îŒŁ": [t: ""] # 0xef23 + - "": [t: ""] # 0xef24 + - "": [t: ""] # 0xef29 + - "": [T: "tĂ©rmino ausente"] # 0xef41 (en: 'missing term', google translation) + - "": [T: "flecha integral de contorno en sentido de las agujas del reloj a la izquierda"] # 0xef80 (en: 'clockwise contour integral arrow on left', google translation) + - "": [T: "integral con cuadrado"] # 0xef81 (en: 'integral with square', google translation) + - "": [T: "integral con barra cortada"] # 0xef82 (en: 'integral with slash', google translation) + - "": [T: "integral invertida"] # 0xef83 (en: 'reversed integral', google translation) + - "": [T: "doble cero sobre doble cero"] # 0xef90 (en: 'double zero over double zero', google translation) + - "": [T: "cero con barra cortada"] # 0xef91 (en: 'zero with slash', google translation) + + # fraktur 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) + - T: "fraktur" # (google translation) + - spell: "translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" + + - "-": # 0xf000 - 0xf018 + - T: "fraktur" # (google translation) + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" + + - "𝔞-đ”·": # 0x1d51e - 0x1d537 + - T: "fraktur" # (google translation) + - spell: "translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz')" + - "-ï€ł": # 0xf01a - 0xf033 + - T: "fraktur" # (google translation) + - spell: "translate('.', 'ï€šï€›ï€œï€ï€žï€Ÿï€ ï€Ąï€ąï€Łï€€ï€„ï€Šï€§ï€šï€©ï€Șï€«ï€Źï€­ï€źï€Żï€°ï€±ï€Čï€ł', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝕬-𝖅": # 0x1D56C - 0x1D585 + - T: "fraktur bold" # (google translation) + - spell: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf040 - 0xf059 + - T: "fraktur bold" # (google translation) + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝖆-𝖟": # 0x1d586 - 0x1d59f + - T: "fraktur bold" # (google translation) + - spell: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" + - "-ïł": # 0xf05a - 0xf073 + - T: "fraktur bold" # (google translation) + - 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) + - test: + if: "$Verbosity!='Terse'" + then: [T: "doble tachadura"] # (en: 'double struck', google translation) + - spell: "translate('.', '𝔾đ”čđ”șđ”»đ”Œđ”œđ”Ÿđ”żđ•€đ•đ•‚đ•ƒđ•„đ•…đ•†đ•‡đ•ˆđ•‰đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf080 - 0xf098 + - test: + if: "$Verbosity!='Terse'" + then: [T: "doble tachadura"] # (en: 'double struck', google translation) + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝕒-đ•«": # 0x1d552 - 0x1d56b + - test: + if: "$Verbosity!='Terse'" + then: [T: "doble tachadura"] # (en: 'double struck', google translation) + - spell: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" + - "-ï‚ł": # 0xf09a - 0xf0b3 + - test: + if: "$Verbosity!='Terse'" + then: [T: "doble tachadura"] # (en: 'double struck', google translation) + - spell: "translate('.', 'ï‚šï‚›ï‚œï‚ï‚žï‚Ÿï‚ ï‚Ąï‚ąï‚Łï‚€ï‚„ï‚Šï‚§ï‚šï‚©ï‚Șï‚«ï‚Źï‚­ï‚źï‚Żï‚°ï‚±ï‚Čï‚ł', 'abcdefghijklmnopqrstuvwxyz')" + - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 + - test: + if: "$Verbosity!='Terse'" + then: [T: "doble tachadura"] # (en: 'double struck', google translation) + - spell: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" + - "-": # 0xf0c0 - 0xf0c9 + - test: + if: "$Verbosity!='Terse'" + then: [T: "doble tachadura"] # (en: 'double struck', google translation) + - spell: "translate('.', '', '0123456789')" + + - "": [T: "doble nabla tachada"] # 0xf0ca (en: 'double struck nabla', google translation) + - "": [T: "doble constante de Euler tachada"] # 0xf0cb (en: 'double struck euler constant', google translation) + + # script chars in math alphabetic block and also MathType private use area + - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 + - T: "guiĂłn" # (en: 'script', google translation) + - spell: "translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf100 - 0xf119 + - T: "guiĂłn" # (en: 'script', google translation) + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf + - T: "guiĂłn" # (en: 'script', google translation) + - spell: "translate('.', 'đ’¶đ’·đ’žđ’čđ’șđ’»đ’Œđ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“„đ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdefghijklmnopqrstuvwxyz')" + - "-ï„ł": # 0xf11a - 0xf133 + - T: "guiĂłn" # (en: 'script', google translation) + - spell: "translate('.', 'ï„šï„›ï„œï„ï„žï„Ÿï„ ï„Ąï„ąï„Łï„€ï„„ï„Šï„§ï„šï„©ï„Șï„«ï„Źï„­ï„źï„Żï„°ï„±ï„Čï„ł', 'abcdefghijklmnopqrstuvwxyz')" + + # bold script chars in math alphabetic block and also MathType private use area + - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 + - T: "guiĂłn en negrita" # (en: 'script bold', google translation) + - spell: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf140 - 0xf159 + - T: "guiĂłn en negrita" # (en: 'script bold', google translation) + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "đ“Ș-𝔃": # 0x1d4ea - 0x1d503 + - T: "guiĂłn en negrita" # (en: 'script bold', google translation) + - spell: "translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz')" + - "-ï…ł": # 0xf15a - 0xf173 + - T: "guiĂłn en negrita" # (en: 'script bold', google translation) + - spell: "translate('.', 'ï…šï…›ï…œï…ï…žï…Ÿï… ï…Ąï…ąï…Łï…€ï…„ï…Šï…§ï…šï…©ï…Șï…«ï…Źï…­ï…źï…Żï…°ï…±ï…Čï…ł', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf180 - 0xf199 + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "": # 0xf19a + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "mayĂșscula"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [T: "ligadura ae"] # (en: 'ligature ae', google translation) + - "": # 0xf19b + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "mayĂșscula"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [T: "s puntiaguda"] # (en: 'sharp s', google translation) + - "": # 0xf19c + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "mayĂșscula"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [T: "o con trazo"] # (en: 'o with stroke', google translation) + + # MathType only has a few of the cap Greek letters in PUA + - "": # 0xf201 - 0xf209 + - test: + if: "$Verbosity!='Terse'" + then: [T: "doble tachadura"] # (en: 'double struck', google translation) + - spell: "translate('.', '', 'Î”ÎšÎ›Î ÎŁÎ˜Î“Î©Î„')" + + - "-": # 0xf220 - 0xf236 + - test: + if: "$Verbosity!='Terse'" + then: [T: "doble tachadura"] # (en: 'double struck', google translation) + - spell: "translate('.', 'ïˆ ïˆĄïˆąïˆŁïˆ€ïˆ„ïˆŠïˆ§ïˆšïˆ©ïˆȘïˆ«ïˆŹïˆ­ïˆźïˆŻïˆ°ïˆ±ïˆČïˆłïˆŽïˆ”ïˆ¶', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "": [T: "doble tachadura en sigma final"] # 0xf237 (en: 'double struck final sigma', google translation) + - "": [T: "doble tachadura en rho"] # 0xf250 (en: 'double struck rho', google translation) + - "": [T: "doble tachadura en phi"] # 0xf251 (en: 'double struck phi', google translation) + - "𝐀-𝐙": # 0x1d400 - 0x1d419 + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-ï‰č": # 0xf260 - 0xf279 + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'ï‰ ï‰Ąï‰ąï‰Łï‰€ï‰„ï‰Šï‰§ï‰šï‰©ï‰Șï‰«ï‰Źï‰­ï‰źï‰Żï‰°ï‰±ï‰Čï‰łï‰Žï‰”ï‰¶ï‰·ï‰žï‰č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝐚-𝐳": # 0x1d41a - 0x1d433 + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" + + - "ï‰ș-": # 0xf27a - 0xf293 + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'ï‰șï‰»ï‰Œï‰œï‰Ÿï‰żïŠ€ïŠïŠ‚ïŠƒïŠ„ïŠ…ïŠ†ïŠ‡ïŠˆïŠ‰ïŠŠïŠ‹ïŠŒïŠïŠŽïŠïŠïŠ‘ïŠ’ïŠ“', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝐮-𝑍": # 0x1d434 - 0x1d44d + - spell: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf294 - 0xf2ad + - spell: "translate('.', 'ïŠ”ïŠ•ïŠ–ïŠ—ïŠ˜ïŠ™ïŠšïŠ›ïŠœïŠïŠžïŠŸïŠ ïŠĄïŠąïŠŁïŠ€ïŠ„ïŠŠïŠ§ïŠšïŠ©ïŠȘïŠ«ïŠŹïŠ­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝑎-𝑧": # 0x1d44e - 0x1d467 + - spell: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”đ‘•đ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" + + - "ïŠź-": # 0xf2ae - 0xf2c7 + - spell: "translate('.', 'ïŠźïŠŻïŠ°ïŠ±ïŠČïŠłïŠŽïŠ”ïŠ¶ïŠ·ïŠžïŠčïŠșïŠ»ïŠŒïŠœïŠŸïŠżï‹€ï‹ï‹‚ï‹ƒï‹„ï‹…ï‹†ï‹‡', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝑹-𝒁": # 0x1d468 - 0x1d481 + # - T: "negrita cursiva" + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-ï‹Ą": # 0xf2c8 - 0xf2e1 + # - T: "negrita cursiva" + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'ï‹ˆï‹‰ï‹Šï‹‹ï‹Œï‹ï‹Žï‹ï‹ï‹‘ï‹’ï‹“ï‹”ï‹•ï‹–ï‹—ï‹˜ï‹™ï‹šï‹›ï‹œï‹ï‹žï‹Ÿï‹ ï‹Ą', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝒂-𝒛": # 0x1d482 - 0x1d49b + # - T: "negrita cursiva" + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" + + - "ï‹ą-": # 0xf2e2 - 0xf2fb + # - T: "negrita cursiva" # (en: 'bold', google translation) + - spell: "translate('.', 'ï‹ąï‹Łï‹€ï‹„ï‹Šï‹§ï‹šï‹©ï‹Șï‹«ï‹Źï‹­ï‹źï‹Żï‹°ï‹±ï‹Čï‹łï‹Žï‹”ï‹¶ï‹·ï‹žï‹čï‹ș', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 + - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf300 - 0xf319 + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 + - spell: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" + + - "-ïŒł": # 0xf31a - 0xf333 + - spell: "translate('.', 'ïŒšïŒ›ïŒœïŒïŒžïŒŸïŒ ïŒĄïŒąïŒŁïŒ€ïŒ„ïŒŠïŒ§ïŒšïŒ©ïŒȘïŒ«ïŒŹïŒ­ïŒźïŒŻïŒ°ïŒ±ïŒČïŒł', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf334 - 0xf34d + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'ïŒčïŒșïŒ»ïŒŒïŒœïŒŸïŒżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒï', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝗼-𝘇": # 0x1d5ee - 0x1d607 + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf34e - 0xf367 + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'ïŽïïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§', 'abcdefghijklmnopqrstuvwxyz')" + - "𝘈-𝘡": # 0x1d608 - 0x1d621 + # - T: "cursiva" + - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "-": # 0xf368 - 0xf381 + # - T: "cursiva" + - spell: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżïŽ€ïŽ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝘱-đ˜»": # 0x1d622 - 0x1d63b + # - T: "cursiva" + - spell: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf382 - 0xf39b + # - T: "cursiva" + - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + + - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 + # - T: "negrita cursiva" + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf39c - 0xf3b5 + # - T: "negrita cursiva" + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'ïŽœïŽïŽžïŽŸïŽ ïŽĄïŽąïŽŁïŽ€ïŽ„ïŽŠïŽ§ïŽšïŽ©ïŽȘïŽ«ïŽŹïŽ­ïŽźïŽŻïŽ°ïŽ±ïŽČïŽłïŽŽïŽ”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝙖-𝙯": # 0x1d656 - 0x1d66f + # - T: "negrita cursiva" + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf3b6 - 0xf3cf + # - T: "negrita cursiva" + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'ïŽčïŽșïŽ»ïŽŒïŽœïŽŸïŽżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒïïŽï', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝙰-𝚉": # 0x1d670 - 0x1d689 + - spell: "translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf3d0 - 0xf3e9 + - spell: "translate('.', 'ïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§ïšï©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝚊-𝚣": # 0x1d68a - 0x1d6a3 + - spell: "translate('.', '𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚱𝚣', 'abcdefghijklmnopqrstuvwxyz')" + + - "ïȘ-": # 0xf3ea - 0xf403 + - spell: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżï€ïï‚ïƒ', 'abcdefghijklmnopqrstuvwxyz')" + + - "": [T: "i sin punto"] # 0xf404 (google translation) + - "đš€": [T: "ci cursiva sin punto"] # 0x1d6a4 (en: 'dotless i', google: 'dotless i') + - "đš„": [T: "j cursiva sin punto"] # 0x1d6a5 (en: 'dotless j', google: 'dotless j') + + - "𝚹-𝛀": # 0x1d6a8 - 0x1d6c0 + - T: "j cursiva sin punto" # (en: 'bold', google: 'atrevido') + - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "-": # 0xf408 - 0xf420 + - T: "j cursiva sin punto" # (en: 'bold', google: 'atrevido') + - spell: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "𝛂-𝛚": # 0x1d6c2 - 0x1d6da + - T: "j cursiva sin punto" # (en: 'bold', google: 'atrevido') + - spell: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙𝛚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "ïą-ïș": # 0xf422 - 0xf43a + - T: "j cursiva sin punto" # (en: 'bold', google: 'atrevido') + - spell: "translate('.', 'ïąïŁï€ï„ïŠï§ïšï©ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïș', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "ïĄ": [T: "nabla en negrita"] # 0xf421 (google translation) + - "𝛁": [T: "nabla en negrita"] # 0x1d6c1 (google translation) + + - "𝛛𝛜𝛝𝛞𝛟𝛠𝛡": # 0x1D6DB - 0x1D6E1 + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', '𝛛𝛜𝛝𝛞𝛟𝛠𝛡', '∂ΔΞÎșφρπ')" + + - "ï»ïŒïœïŸïżï‘€ï‘": # 0xF43C - 0xF441 + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'ï»ïŒïœïŸïżï‘€ï‘', '∂ΔΞÎșφρπ')" + + - "𝛱-đ›ș": # 0x1d6e2 - 0x1d6fa + # - T: "cursiva" + - spell: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›čđ›ș', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "-": # 0xf442 - 0xf45a + # - T: "cursiva" + - spell: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "đ›Œ-𝜔": # 0x1d6fc - 0x1d714 + # - T: "cursiva" + - spell: "translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“đœ”', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-": # 0xf45c - 0xf474 + # - T: "cursiva" + - spell: "translate('.', 'ï‘œï‘ï‘žï‘Ÿï‘ ï‘Ąï‘ąï‘Łï‘€ï‘„ï‘Šï‘§ï‘šï‘©ï‘Șï‘«ï‘Źï‘­ï‘źï‘Żï‘°ï‘±ï‘Čï‘łï‘Ž', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "": [T: "nabla en cursiva"] # 0xf45b (en: 'italic nabla', google translation) + - "đ›»": [T: "nabla en cursiva"] # 0x1d6fb (en: 'italic nabla', google translation) + + - "𝜕𝜖𝜗𝜘𝜙𝜚𝜛": # 0x1d715 - 0x1d71b + # - T: "cursiva" + - spell: "translate('.', '𝜕𝜖𝜗𝜘𝜙𝜚𝜛', '∂ΔΞÎșφρπ')" + + - "ï‘čï‘ș": # 0xf475 - 0xf47b + # - T: "cursiva" + - spell: "translate('.', 'ï‘čï‘ș', '∂ΔΞÎșφρπ')" + + - "𝜜-𝜮": # 0x1d71c - 0x1d734 + # - T: "negrita cursiva" + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳𝜮', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "-": # 0xf47c - 0xf494 + # - T: "negrita cursiva" + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'ï‘Œï‘œï‘Ÿï‘żï’€ï’ï’‚ï’ƒï’„ï’…ï’†ï’‡ï’ˆï’‰ï’Šï’‹ï’Œï’ï’Žï’ï’ï’‘ï’’ï’“ï’”', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "đœ¶-𝝎": # 0x1d736 - 0x1d74e + # - T: "negrita cursiva" + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđđŽ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-ï’ź": # 0xf496 - 0xf4ae + # - T: "negrita cursiva" + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'ï’–ï’—ï’˜ï’™ï’šï’›ï’œï’ï’žï’Ÿï’ ï’Ąï’ąï’Łï’€ï’„ï’Šï’§ï’šï’©ï’Șï’«ï’Źï’­ï’ź', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "𝝏𝝐𝝑𝝒𝝓𝝔𝝕": # 0x1d74f - 0x1d755 + # - T: "negrita cursiva" + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', '𝝏𝝐𝝑𝝒𝝓𝝔𝝕', '∂ΔΞÎșφρπ')" + + - "ï’Żï’°ï’±ï’Čï’łï’Žï’”": # 0xf422 - 0xf43a + # - T: "negrita cursiva" + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'ï’Żï’°ï’±ï’Čï’łï’Žï’”', '∂ΔΞÎșφρπ')" + + - "đœ”": [T: "nabla en cursiva y negrita"] # 0x1d735 (en: 'bold italic nabla', google translation) + - "": [T: "nabla en cursiva y negrita"] # 0xf495 (en: 'bold italic nabla', google translation) + + - "𝝖-𝝼": # 0x1d756 - 0x1d76e + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đź', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + - "-": # 0xf4b6 - 0xf4ce + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'ï’¶ï’·ï’žï’čï’șï’»ï’Œï’œï’Ÿï’żï“€ï“ï“‚ï“ƒï“„ï“…ï“†ï“‡ï“ˆï“‰ï“Šï“‹ï“Œï“ï“Ž', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "𝝰-𝞈": # 0x1d770 - 0x1d788 + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€đžđž‚đžƒđž„đž…đž†đž‡đžˆ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-": # 0xf4d0 - 0xf4e8 + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'ï“ï“‘ï“’ï““ï“”ï“•ï“–ï“—ï“˜ï“™ï“šï“›ï“œï“ï“žï“Ÿï“ ï“Ąï“ąï“Łï“€ï“„ï“Šï“§ï“š', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "𝞉𝞊𝞋𝞌𝞍𝞎𝞏": # 0x1d789 - 0x1d78f + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', '𝞉𝞊𝞋𝞌𝞍𝞎𝞏', '∂ΔΞÎșφρπ')" + + - "ï“Șï“«ï“Źï“­ï“źï“Ż": # 0xf4e9 - 0xf4ef + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'ï“Șï“«ï“Źï“­ï“źï“Ż', '∂ΔΞÎșφρπ')" + + - "": [T: "nabla en negrita"] # 0xf4cf (google translation) + - "𝝯": [T: "nabla en negrita"] # 0x1d76f (google translation) + + - "𝞐-𝞹": # 0x1d790 - 0x1d7a8 + # - T: "negrita cursiva" + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "-": # 0xf4f0 - 0xf508 + # - T: "negrita cursiva" + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'ï“Čï“łï“Žï“”ï“¶ï“·ï“žï“čï“șï“»ï“Œï“œï“Ÿï“żï”€ï”ï”‚ï”ƒï”„ï”…ï”†ï”‡ï”ˆ', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "đžȘ-𝟂": # 0x1d7aa - 0x1d7c2 + # - T: "negrita cursiva" + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸđŸ‚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-ï”ą": # 0xf50a - 0xf522 + # - T: "negrita cursiva" + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'ï”Šï”‹ï”Œï”ï”Žï”ï”ï”‘ï”’ï”“ï””ï”•ï”–ï”—ï”˜ï”™ï”šï”›ï”œï”ï”žï”Ÿï” ï”Ąï”ą', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "𝟃𝟄𝟅𝟆𝟇𝟈𝟉": # 0x1d7c3 - 0x1d7c9 + # - T: "negrita cursiva" + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', '𝟃𝟄𝟅𝟆𝟇𝟈𝟉', '∂ΔΞÎșφρπ')" + + - "ï”Łï”€ï”„ï”Šï”§ï”šï”©": # 0xf523 - 0xf529 + # - T: "negrita cursiva" + - T: "negrita" # (en: 'bold', google translation) + - spell: "translate('.', 'ï”Łï”€ï”„ï”Šï”§ï”šï”©', '∂ΔΞÎșφρπ')" + + - "": [T: "nabla en negrita"] # 0xf509 (google translation) + - "đž©": [T: "nabla en negrita"] # 0x1d7a9 (google translation) + + - "ï”ź": [T: "cero en negrita"] # 0xf52e (en: 'bold zero', google translation) + - "𝟎": [T: "cero en negrita"] # 0x1d7ce (en: 'bold zero', google translation) + - "ï”Ż": [T: "uno en negrita"] # 0xf52f (en: 'bold one', google translation) + - "𝟏": [T: "negrita"] # 0x1d7cf (en: 'bold one', google translation) + - "": [T: "dos en negrita"] # 0xf530 (en: 'bold two', google translation) + - "𝟐": [T: "dos en negrita"] # 0x1d7d0 (en: 'bold two', google translation) + - "": [T: "tres en negrita"] # 0xf531 (en: 'bold three', google translation) + - "𝟑": [T: "tres en negrita"] # 0x1d7d1 (en: 'bold three', google translation) + - "ï”Č": [T: "cuatro en negrita"] # 0xf532 (en: 'bold four', google translation) + - "𝟒": [T: "bold en negrita"] # 0x1d7d2 (en: 'bold four', google translation) + - "ï”ł": [T: "cinco en negrita"] # 0xf533 (en: 'bold five', google translation) + - "𝟓": [T: "cinco en negrita"] # 0x1d7d3 (en: 'bold five', google translation) + - "": [T: "seis en negrita"] # 0xf534 (en: 'bold six', google translation) + - "𝟔": [T: "seis en negrita"] # 0x1d7d4 (en: 'bold six', google translation) + - "ï””": [T: "siete en negrita"] # 0xf535 (en: 'bold seven', google translation) + - "𝟕": [T: "siete en negrita"] # 0x1d7d5 (en: 'bold seven', google translation) + - "": [T: "ocho en negrita"] # 0xf536 (en: 'bold eight', google translation) + - "𝟖": [T: "ocho en negrita"] # 0x1d7d6 (en: 'bold eight', google translation) + - "": [T: "nueve en negrita"] # 0xf537 (en: 'bold nine', google translation) + - "𝟗": [T: "nueve en negrita"] # 0x1d7d7 (en: 'bold nine', google translation) + - "": [T: "cero"] # 0xf542 (en: 'zero', google translation) + - "𝟱": [T: "cero"] # 0x1d7e2 (en: 'zero', google translation) + - "": [T: "uno"] # 0x1d7e3 (en: 'one', google translation) + - "": [T: "dos"] # 0xf544 (en: 'two', google translation) + - "đŸ€": [T: "dos"] # 0x1d7e4 (en: 'two', google translation) + - "": [T: "tres"] # 0xf545 (en: 'three', google translation) + - "đŸ„": [T: "tres"] # 0x1d7e5 (en: 'three', google translation) + - "": [T: "cuatro"] # 0xf546 (en: 'four', google translation) + - "𝟩": [T: "cuatro"] # 0x1d7e6 (en: 'four', google translation) + - "": [T: "cinco"] # 0xf547 (en: 'five', google translation) + - "𝟧": [T: "cinco"] # 0x1d7e7 (en: 'five', google translation) + - "": [T: "seis"] # 0xf548 (en: 'six', google translation) + - "𝟹": [T: "seis"] # 0x1d7e8 (en: 'six', google translation) + - "": [T: "siete"] # 0xf549 (en: 'seven', google translation) + - "đŸ©": [T: "siete"] # 0x1d7e9 (en: 'seven', google translation) + - "": [T: "ocho"] # 0xf54a (en: 'eight', google translation) + - "đŸȘ": [T: "ocho"] # 0x1d7ea (en: 'eight', google translation) + - "": [T: "nueve"] # 0xf54b (en: 'nine', google translation) + - "đŸ«": [T: "nueve"] # 0x1d7eb (en: 'nine', google translation) + - "": [T: "cero en negrita"] # 0xf54c (en: 'bold zero', google translation) + - "𝟬": [T: "cero en negrita"] # 0x1d7ec (en: 'bold zero', google translation) + - "": [T: "uno en negrita"] # 0xf54d (en: 'bold one', google translation) + - "𝟭": [T: "uno en negrita"] # 0x1d7ed (en: 'bold one', google translation) + - "": [T: "dos en negrita"] # 0xf54e (en: 'bold two', google translation) + - "𝟼": [T: "dos en negrita"] # 0x1d7ee (en: 'bold two', google translation) + - "": [T: "tres en negrita"] # 0xf54f (en: 'bold three', google translation) + - "𝟯": [T: "tres en negrita"] # 0x1d7ef (en: 'bold three', google translation) + - "": [T: "cuatro en negrita"] # 0xf550 (en: 'bold four', google translation) + - "𝟰": [T: "bold en negrita"] # 0x1d7f0 (en: 'bold four', google translation) + - "": [T: "cinco en negrita"] # 0xf551 (en: 'bold five', google translation) + - "đŸ±": [T: "bcinco en negrita"] # 0x1d7f1 (en: 'bold five', google translation) + - "": [T: "seis negrita"] # 0xf552 (en: 'bold six', google translation) + - "đŸČ": [T: "seis negrita"] # 0x1d7f2 (en: 'bold six', google translation) + - "": [T: "siete negrita"] # 0xf553 (en: 'bold seven', google translation) + - "𝟳": [T: "siete en negrita"] # 0x1d7f3 (en: 'bold seven', google translation) + - "": [T: "ocho en negrita"] # 0xf554 (en: 'bold eight', google translation) + - "𝟮": [T: "ocho en negrita"] # 0x1d7f4 (en: 'bold eight', google translation) + - "": [T: "nueve en negrita"] # 0xf555 (en: 'bold nine', google translation) + - "đŸ”": [T: "nueve en negrita"] # 0x1d7f5 (en: 'bold nine', google translation) + - "": [T: "cero"] # 0xf556 (en: 'zero', google translation) + - "đŸ¶": [T: "cero"] # 0x1d7f6 (en: 'zero', google translation) + - "": [T: "uno"] # 0xf557 (en: 'one', google translation) + - "đŸ·": [T: "uno"] # 0x1d7f7 (en: 'one', google translation) + - "": [T: "dos"] # 0xf558 (en: 'two', google translation) + - "𝟾": [T: "dos"] # 0x1d7f8 (en: 'two', google translation) + - "": [T: "tres"] # 0xf559 (en: 'three', google translation) + - "đŸč": [T: "tres"] # 0x1d7f9 (en: 'three', google translation) + - "": [T: "cuatro"] # 0xf55a (en: 'four', google translation) + - "đŸș": [T: "cuatro"] # 0x1d7fa (en: 'four', google translation) + - "": [T: "cinco"] # 0xf55b (en: 'five', google translation) + - "đŸ»": [T: "cinco"] # 0x1d7fb (en: 'five', google translation) + - "": [T: "seis"] # 0xf55c (en: 'six', google translation) + - "đŸŒ": [T: "seis"] # 0x1d7fc (en: 'six', google translation) + - "": [T: "siete"] # 0xf55d (en: 'seven', google translation) + - "đŸœ": [T: "siete"] # 0x1d7fd (en: 'seven', google translation) + - "": [T: "ocho"] # 0xf55e (en: 'eight', google translation) + - "đŸŸ": [T: "ocho"] # 0x1d7fe (en: 'eight', google translation) + - "": [T: "nueve"] # 0xf55f (en: 'nine', google translation) + - "𝟿": [T: "nueve"] # 0x1d7ff (en: 'nine', google translation) + - "": [T: "carĂĄcter desconocido"] # 0xf700 (en: 'unknown character', google translation) + - "": [T: "triĂĄngulos inferior derecho e inferior izquierdo"] # 0xf726 (en: 'lower right and lower left triangles', google translation) + - "": [T: "extensor de puntos suspensivos horizontales"] # 0xf72d (en: 'horizontal ellipsis extender', google translation) + - "ïœź": [T: "extensor de puntos suspensivos de lĂ­nea media horizontal"] # 0xf72e (en: 'midline horizontal ellipsis extender', google translation) + - "ïŁ„": [T: "extensor radical"] # 0xf8e5 (en: 'radical extender', google translation) + - "ïŁŠ": [T: "extensor de flecha vertical"] # 0xf8e6 (en: 'vertical arrow extender', google translation) + - "ïŁ§": [T: "extensor de flecha horizontal"] # 0xf8e7 (en: 'horizontal arrow extender', google translation) + - "ïŁš": [T: "señal registrada sans serif"] # 0xf8e8 (en: 'registered sign sans serif', google translation) + - "ïŁ©": [T: "copyright sign sans serif"] # 0xf8e9 (google translation) + - "ïŁȘ": [T: "signo de marca comercial sans serif"] # 0xf8ea (en: 'trade mark sign sans serif', google translation) + - "ïŁ«": [T: "parĂ©ntesis superior izquierdo"] # 0xf8eb (en: 'left paren top', google translation) + - "ïŁŹ": [T: "extensor de parĂ©ntesis izquierdo"] # 0xf8ec (en: 'left paren extender', google translation) + - "ïŁ­": [T: "parĂ©ntesis izquierdo inferior"] # 0xf8ed (en: 'left paren bottom', google translation) + - "ïŁź": [T: "soporte izquierdo superior"] # 0xf8ee (en: 'left bracket top', google translation) + - "ïŁŻ": [T: "extensor de soporte izquierdo"] # 0xf8ef (en: 'left bracket extender', google translation) + - "ïŁ°": [T: "soporte izquierdo inferior"] # 0xf8f0 (en: 'left bracket bottom', google translation) + - "ïŁ±": [T: "soporte izquierdo superior"] # 0xf8f1 (en: 'left brace top', google translation) + - "ïŁČ": [T: "soporte izquierdo medio"] # 0xf8f2 (en: 'left brace mid', google translation) + - "ïŁł": [T: "soporte izquierdo inferior"] # 0xf8f3 (en: 'left brace bottom', google translation) + - "ïŁŽ": [T: "extensor de soporte"] # 0xf8f4 (en: 'brace extender', google translation) + - "ïŁ”": [T: "extensor integral"] # 0xf8f5 (en: 'integral extender', google translation) + - "ïŁ¶": [T: "parĂ©ntesis superior derecho"] # 0xf8f6 (en: 'right paren top', google translation) + - "ïŁ·": [T: "extensor de parĂ©ntesis derecho"] # 0xf8f7 (en: 'right paren extender', google translation) + - "ïŁž": [T: "parĂ©ntesis inferior derecho"] # 0xf8f8 (en: 'right paren bottom', google translation) + - "ïŁč": [T: "soporte derecho superior"] # 0xf8f9 (en: 'right bracket top', google translation) + - "ïŁș": [T: "extensor de soporte derecho"] # 0xf8fa (en: 'right bracket extender', google translation) + - "ïŁ»": [T: "soporte derecho inferior"] # 0xf8fc (en: 'right brace top', google translation) + - "ïŁœ": [T: "soporte derecho medio"] # 0xf8fd (en: 'right brace mid', google translation) + - "ïŁŸ": [T: "soporte derecho inferior"] # 0xf8fe (en: 'right brace bottom', google translation) + - "ïŁż": [T: "logotipo de apple"] # 0xf8ff (en: 'apple logo', google translation) + - "ïŹ€": [T: "ff ligadas"] # 0xfb00 (en: 'ff', google: 'ff') + - "ïŹ": [T: "fi ligadas"] # 0xfb01 (en: 'fi', google: 'f') + - "ïŹ‚": [T: "fl ligadas"] # 0xfb02 (en: 'fl', google: 'florida') + - "ïŹƒ": [T: "ffl ligadas"] # 0xfb04 (en: 'ffl', google: 'ffl') + - "ïŹ…": [T: "pie"] # 0xfb05 (en: 'ft', google translation) + - "ïŹ†": [T: "calle"] # 0xfb06 (en: 'st', google translation) + - "ïž ": [T: "mitad de ornamentaciĂłn izquierda en ligadura"] # 0xfe20 (en: 'ligature left half embellishment', google translation) + - "ïžĄ": [T: "mitad de ornamentaciĂłn derecha en ligadura"] # 0xfe21 (en: 'ligature right half embellishment', google translation) + - "ïžą": [T: "doble tilde con media ornamentaciĂłn izquierda"] # 0xfe22 (en: 'double tilde left half embellishment', google translation) + - "ïžŁ": [T: "doble tilde medio adorno"] # 0xfe23 (en: 'double tilde right half embellishment', google translation) + - "": [T: "macron dejĂł medio adorno"] # 0xfe24 (en: 'macron left half embellishment', google translation) + - "ïž„": [T: "macron medio adorno"] # 0xfe25 (en: 'macron right half embellishment', google translation) + - "": [T: "unir el adorno de macron"] # 0xfe26 (en: 'conjoining macron embellishment', google translation) + - "ïž”": [T: "parĂ©ntesis superior"] # 0xfe35 (en: 'over paren') + - "ïž¶": [T: "parĂ©ntesis inferior"] # 0xfe36 (en: 'under paren') + - "ïž·": [T: "llave superior"] # 0xfe37 (en: 'over brace') + - "ïžž": [T: "llave inferior"] # 0xfe38 (en: 'under brace') + - "ïžż": [T: "parĂ©ntesis angular superior"] # 0xfe3f (en: 'over angle bracket') + - "ïč€": [T: "parĂ©ntesis angular inferior"] # 0xfe40 (en: 'under angle bracket') + - "ïčš": [T: "divisiĂłn entera"] # 0xfe68 (en: 'integer divide') + - "ïżŒ": [T: "objeto desconocido o faltante"] # 0xfffc (en: 'unknown or missing object', google translation) + - "ïżœ": [T: "caracter desconocido o faltante"] # 0xfffd (en: 'unknown or missing character', google: 'personaje desconocido o faltante') + diff --git a/Rules/Languages/es/unicode.yaml b/Rules/Languages/es/unicode.yaml index dd7119ada..545b70516 100644 --- a/Rules/Languages/es/unicode.yaml +++ b/Rules/Languages/es/unicode.yaml @@ -1,466 +1,466 @@ ---- - # Note to translators: - # most languages don't have two ways to pronounce 'a' -- if not need, remove the rules and change "B-Z" to "A-Z" - # some languages say the word for "uppercase" after the letter. Make sure to change that where appropriate by moving some code around - - "a-z": - - test: - if: "$TTS='none'" - then: [T: "."] - else: [spell: "'.'"] - - "A-Z": - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "mayĂșscula"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - # note: processing of ranges converts '.' into the character, so it needs to be in quotes below - replace: [spell: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"] - - - "0-9": [T: "."] # (en: '.') - - - " ": [t: " "] # 0x20 - - - "!": [T: "factorial"] # 0x21 - - "\"": [T: "barra inversa"] # 0x22 (en: 'quotation mark') - - "#": [T: "almohadilla"] # 0x23 (en: 'number', MathPlayer: 'signo de nĂșmero', google: 'nĂșmero') - - "$": [T: "dĂłlar"] # 0x24 (en: 'dollars') - - "%": [T: "porciento"] # 0x25 (en: 'percent') - - "&": [T: "ampersand"] # 0x26 - - "'": [T: "apĂłstrofo"] # 0x27 (en: 'apostrophe', MathPlayer: 'apĂłstrofo', google: 'apĂłstrofe') - - "(": # 0x28 - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then_test: - if: "$Verbosity='Terse'" - then: [T: "abrir parĂ©ntesis"] # (en: 'open', google translation) - else: [T: "se abren parĂ©ntesis"] # (en: 'open paren', MathPlayer: 'parĂ©ntesis', google: 'parĂ©ntesis abierto') - else: [T: "se abren parĂ©ntesis"] # (en: 'left paren', MathPlayer: 'parĂ©ntesis', google: 'parĂ©ntesis dejado') - - ")": # 0x29 - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then_test: - if: "$Verbosity='Terse'" - then: [T: "cerrar parĂ©ntesis"] # (en: 'close', google translation) - else: [T: "se cierran parĂ©ntesis"] # (en: 'close paren', MathPlayer: 'cierra parĂ©ntesis', google: 'parĂ©ntesis cercana') - else: [T: "se cierran parĂ©ntesis"] # (en: 'right paren', MathPlayer: 'cierra parĂ©ntesis') - - - "*": # 0x2a - test: - if: "parent::*[name(.)='msup' or name(.)='msubsup']" - then: [T: "estrella"] # (en: 'star', google translation) - else: [T: "por"] # (en: 'times') - - "+": [T: "mĂĄs"] # 0x2b (en: 'plus') - - ",": # 0x2c - # the following deals with the interaction of "," with "
" which sometimes wants the ',' to be silent - # that this test is here and not with "
" is not ideal, but seems simplest - test: - if: - - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or " - # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' - # speak "comma" when not adjacent to '
' - - "( following-sibling::*[1][text()!= '
'] and preceding-sibling::*[1][text()!='
'] ) or " - # except if expression starts with '
' - - "../*[1][.='
'] " - then: - - T: "coma" # (en: 'comma', google translation) - - test: - if: "$Verbosity != Terse" - then: [pause: short] - # else silent - - - "-": [T: "menos"] # 0x2d (en: 'minus') - - ".": # 0x2e - - test: - if: "parent::*[1][self::m:mn]" - then: [T: "punto"] # (en: 'point', google translation) - else: [T: "punto"] # (en: 'dot') - - "/": [T: "barra oblicua"] # 0x2f (en: 'divided by') - - ":": [T: "dos puntos"] # 0x3a (en: 'colon') - - ";": [T: "punto y coma"] # 0x3b (en: 'semicolon') - - "<": # 0x3c - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "menor que" # (en: 'less than') - - "=": # 0x3d - - test: - if: "$Verbosity!='Terse'" - then: [T: "es igual a"] # (en: 'is equal to', google translation) - else: [T: "igual a"] # (en: 'equals', google: 'iguales') - - - ">": # 0x3e - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "mayor que" # (en: 'greater than') - - "?": [T: "interrogaciĂłn derecha"] # 0x3f (en: 'question mark', MathPlayer: 'cierra interrogaciĂłn', google: 'signo de interrogaciĂłn') - - "@": [T: "arroba"] # 0x40 (en: 'at sign') - - "[": # 0x5b - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "abrir corchetes"] # (en: 'open bracket', google translation) - else: [T: "se abren corchetes"] # (en: 'left bracket', MathPlayer: 'abre corchetes', google: 'soporte izquierdo') - - "\\": [T: "se abren corchetes"] # 0x5c (en: 'back slash', MathPlayer: 'abre corchetes', google: 'back slash') - - "]": # 0x5d - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "cerrar corchetes"] # (en: 'close bracket', google translation) - else: [T: "se cierran corchetes"] # (en: 'right bracket', MathPlayer: 'cierra corchetes', google: 'soporte derecho') - - "^": [T: "acento circunflejo"] # 0x5e (en: 'hat') - - "_": [T: "subrayado"] # 0x5f (en: 'under bar') - - "`": [T: "acento grave"] # 0x60 (en: 'grave') - - "{": # 0x7b - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "abrir llaves"] # (en: 'open brace', google translation) - else: [T: "se abren llaves"] # (en: 'left brace', MathPlayer: 'abre llaves', google: 'abrazadera izquierda') - - "|": # 0x7c - # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' - - test: - - if: "$SpeechStyle != 'ClearSpeak' or not(preceding-sibling::*) or not(following-sibling::*)" - then: [T: "barra vertical"] # (en: 'vertical line', google translation) - - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" - then: [T: "tal que"] # (en: 'such that', google translation) - - else_if: "$ClearSpeak_VerticalLine = 'Given'" - then: [T: "dado"] # (en: 'given', google translation) - - else: [T: "barra vertical"] # (en: 'divides') - - - "}": # 0x7d - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "cerrar llaves"] # (en: 'close brace', google translation) - else: [T: "se cierran llaves"] # (en: 'right brace', MathPlayer: 'cierra llaves', google: 'abrazadera derecha') - - - "~": [T: "tilde"] # 0x7e - - " ": # 0xa0 - - test: - if: "@data-empty-in-2D" - then: [T: "vacĂ­o"] # want to say something for fraction (etc) with empty child (en: 'empty', google translation) - else: [T: ""] - - - "Âą": [T: "centavo"] # 0xa2 (en: 'cents') - - "ÂŁ": [T: "libra esterlina"] # 0xa3 (en: 'pounds') - - "ÂŹ": [T: "no"] # 0xac (en: 'not') - - "°": [T: "grado"] # 0xb0 (en: 'degrees') - - "±": [T: "mĂĄs menos"] # 0xb1 (en: 'plus or minus') - - "ÂŽ": [T: "acento agudo"] # 0xb4 (en: 'acute') - - "·": # 0xB7 - - test: - if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolDot = 'Auto'" - then_test: - if: "$Verbosity = 'Verbose'" - then: [T: "multiplicado por"] # (en: 'times', google translation) - else: [T: "por"] - else: [T: "punto medio"] # (en: 'dot') - - "×": # 0xd7 - - test: - if: "$Verbosity = 'Verbose'" - then: [T: "multiplicado por"] # (en: 'times', google translation) - else: [T: "por"] - - "Ă·": [T: "dividido por"] # 0xf7 (en: 'divided by') - - "̀": [T: "acento grave ornamentado"] # 0x300 (en: 'grave accent embellishment', google: 'embellido de acento grave') - - "́": [T: "acento agudo ornamentado"] # 0x301 (en: 'acute accent embellishment', google: 'embellido de acento agudo') - - "̂": [T: "acento circunflejo ornamentado"] # 0x302 (en: 'circumflex accent embellishment', google: 'embellamiento del acento circunflejo') - - "̃": [T: "tilde ornamentada"] # 0x303 (en: 'tilde embellishment', google: 'tilde adorno') - - "̄": [T: "barra ornamentada"] # 0x304 (en: 'macron embellishment', google: 'embellido de macron') - - "̅": [T: "barra encima con adorno"] # 0x305 (en: 'overbar embellishment', google: 'embellido de overbar') - - "̆": [T: "breve"] # 0x306 - - "̇": [T: "punto encima con adorno"] # 0x307 (en: 'dot above embellishment', google: 'punto por encima del adorno') - - # Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong - - "Α-Ω": - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "mayĂșscula"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - # note: processing of ranges converts '.' into the character, so it needs to be in quotes below - replace: [spell: "translate('.', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')"] - - - "α": [T: "alfa"] # 0x3b1 (en: 'alpha') - - "ÎČ": [T: "beta"] # 0x3b2 - - "Îł": [T: "gamma"] # 0x3b3 (google: 'gama') - - "ÎŽ": [T: "delta"] # 0x3b4 - - "Δ": [T: "Ă©psilon"] # 0x3b5 (en: 'epsilon', google: 'epsilon') - - "ζ": [T: "zeta"] # 0x3b6 - - "η": [T: "eta"] # 0x3b7 - - "Ξ": [T: "theta"] # 0x3b8 - - "Îč": [T: "iota"] # 0x3b9 - - "Îș": [T: "kappa"] # 0x3ba - - "λ": [T: "lambda"] # 0x3bb - - "ÎŒ": [T: "my"] # 0x3bc (en: 'mu', google: 'mu') - - "Μ": [T: "ny"] # 0x3bd (en: 'nu', google: 'nu') - - "Ο": [T: "xi"] # 0x3be (en: 'zai', google: 'zai') - - "Îż": [T: "Ăłmicron"] # 0x3bf (en: 'omicron', google: 'omicron') - - "π": [T: "pi"] # 0x3c0 - - "ρ": [T: "rho"] # 0x3c1 - - "ς": [T: "sigma final"] # 0x3c2 (en: 'final sigma', google: 'final sigma') - - "σ": [T: "sigma"] # 0x3c3 - - "τ": [T: "tau"] # 0x3c4 - - "υ": [T: "Ă­psilon"] # 0x3c5 (en: 'upsilon', google: 'upsilon') - - "φ": [T: "phi"] # 0x3c6 (google: 'fi') - - "χ": [T: "ji"] # 0x3c7 (en: 'chi', google: 'chi') - - "ψ": [T: "psi"] # 0x3c8 - - "ω": [T: "omega"] # 0x3c9 - - "ϕ": [T: "phi recta"] # 0x3d5 (en: 'phi', google: 'fi') - - "ϖ": [T: "variante de pi"] # 0x3d6 (en: 'pi', google: 'pi') - - "Ï”": [T: "variante de Ă©psilon"] # 0x3f5 (en: 'epsilon', google: 'epsilon') - - "϶": [T: "Ă©psilon invertida"] # 0x3f6 (en: 'reversed epsilon') - - - "⁹": [T: ""] # 0x2062 - - "ℂℕℚℝ℀": # here we rely on this running through the table again to speak "cap xxx" - - T: "prima inversa" # (en: 'double-struck', google: 'doble golpe') - - spell: "translate('.', 'ℂℕℚℝ℀', 'CNQRZ')" - - - "℃": [T: "grados Celsius"] # 0x2103 (en: 'degrees celsius', google: 'grados celsius') - - "ℋℛℓ": # 0x210b - - T: "grados Fahrenheit" # (en: 'script', google: 'guion') - - spell: "translate('.', 'ℋℛℓ', 'HRl')" - - "ℜ": # 0x211c - - T: "r mayĂșscula partida" # (en: 'fraktur', google: 'fraktur') - - spell: "'R'" - - - "ⅆⅇⅈⅉ": # 0x2146-9 - - T: "angstrom resaltado" # (en: 'double-struck italic') - - spell: "translate('.', 'ⅆⅇⅈⅉ', 'deij')" - - - "∄": # 0x2225 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "paralelo a" # (en: 'parallel to') - - "∊": # 0x2226 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no paralela a" # (en: 'not parallel to') - - "≀": # 0x2264 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "menor o igual a" - - "≄": # 0x2265 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "mayor o igual a" # (en: 'greater than or equal to') - - # --- restored complex short definitions (prefer over unicode-full) --- - - "
": # 0x2026 - test: - if: - - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" - # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' - # speak '
' as 'and so on...' unless expr starts with '
' - - "../*[1][.='
']" - then: [T: "puntos suspensivos"] # (en: 'dot dot dot', google translation) - else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' - if: "count(following-sibling::*) = 0" - then: [T: "etcĂ©tera"] # (en: 'and so on', google translation) - else: [T: "puntos suspensivos"] # (en: 'and so on up to', MathPlayer: 'punto punteado punteado', google: 'y asĂ­ sucesivamente') - - "⁥": # 0x2061 - - test: - # skip saying "of" when Terse and a trig function, when it is a shape (does this happen?), or we are in :literal mode - if: "not( - ( $Verbosity='Terse' or ($SpeechStyle = 'ClearSpeak' and IsNode(following-sibling::*[1],'simple')) and - preceding-sibling::*[1][IfThenElse($SpeechStyle='ClearSpeak', - IsInDefinition(., 'ClearSpeakTrigFunctionNames'), - IsInDefinition(., 'TrigFunctionNames') )] - ) or - preceding-sibling::*[1][IsInDefinition(., 'GeometryShapes')] or - (@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) - )" - then: [T: "de"] # (en: 'of', google translation) - - "→": # 0x2192 - - test: - if: "ancestor::*[2][self::m:limit]" - then: [T: "aproximaciones"] # (en: 'approaches', google translation) - else: [T: "flecha derecha"] # (en: 'right arrow', MathPlayer: 'flecha', google: 'flecha correcta') - - "∂": # 0x2202 - - test: - if: "$Verbosity='Terse'" - then: [T: "parcial"] # (en: 'partial', google translation) - else: [T: "derivada parcial"] # (en: 'partial derivative') - - "∆": # 0x2206 - - test: - if: "$Verbosity!='Terse'" - then: [T: "el"] # (en: 'the', google translation) - - T: "incremento" # (en: 'laplacian of') - - "∈": # 0x2208 - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: [T: "un elemento de"] # (en: 'an element of', google translation) - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "en"] # (en: 'in', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "miembro de"] # (en: 'member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "elemento de"] # (en: 'element of', google translation) - - else: [T: "pertenece a"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "es miembro de"] # (en: 'is a member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "es un elemento de"] # (en: 'is an element of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "estĂĄ en"] # (en: 'is in', google translation) - - else: [T: "pertenece a"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') - - "∉": # 0x2209 - # rule is identical to 0x2208 - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: [T: "no es un elemento de"] # (en: 'is not an element of', google translation) - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "no estĂĄ en"] # (en: 'not in', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "no es miembro de"] # (en: 'not member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "no es un elemento de"] # (en: 'not element of', google translation) - - else: [T: "no pertenece a"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'not belonging to') - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "no es miembro de"] # (en: 'is not a member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "no es un elemento de"] # (en: 'is not an element of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "no estĂĄ incluido en"] # (en: 'is not in', google translation) - - else: [T: "no pertenece a"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'does not belong to') - - "∊": # 0x220a - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: [T: "es un elemento de"] # (en: 'is an element of', google translation) - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "en"] # (en: 'in', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "miembro de"] # (en: 'member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "elemento de"] # (en: 'element of', google translation) - - else: [T: "pertenece a"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "es miembro de"] # (en: 'is a member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "es un elemento de"] # (en: 'is an element of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "estĂĄ en"] # (en: 'is in', google translation) - - else: [T: "pertenece a"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') - - "√": # 0x221a - - test: - if: "$Verbosity!='Terse'" - then: [T: "el"] # (en: 'the', google translation) - - T: "raĂ­z cuadrada de" # (en: 'square root of') - - "∝": # 0x221d - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "proporcional a" # (en: 'proportional to') - - "∶": # 0x2236 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "a" # (en: 'to') - - "∟": # 0x223e - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "mĂĄs positivo" # (en: 'most positive') - - "≠": # 0x2260 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no es igual a" # (en: 'not equal to', MathPlayer: 'distinto de', google: 'no igual a') - - "≡": # 0x2261 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "idĂ©ntico a" # (en: 'identical to') - - "⊂": # 0x2282 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es un"] # (en: 'is a', google translation) - - T: "subconjunto de" # (en: 'subset of') - - "⊃": # 0x2283 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es un"] # (en: 'is a', google translation) - - T: "superconjunto de" # (en: 'superset of') - - "⊄": # 0x2284 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no es un subconjunto de" # (en: 'not a subset of') - - "⊅": # 0x2285 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es"] # (en: 'is', google translation) - - T: "no esun superconjunto de" # (en: 'not a superset of') - - "⊆": # 0x2286 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es un"] # (en: 'is a', google translation) - - T: "subconjunto o igual a" # (en: 'subset of or equal to') - - "⊇": # 0x2287 - - test: - if: "$Verbosity!='Terse'" - then: [T: "es un"] # (en: 'is a', google translation) - - T: "superconjunto o igual a" # (en: 'superset of or equal to') - - # --- restored short definitions that differ from unicode-full --- - - "–": [T: "ene raya"] # 0x2013 (en: 'en dash') - - "—": [T: "eme raya"] # 0x2014 (en: 'em dash') - - "‖": [T: "barra vertical doble"] # 0x2016 (en: 'double vertical line') - - "″": [T: "segunda"] # 0x2033 (en: 'double prime', MathPlayer: 'segunda', google: 'doble primo') - - "‮": [T: "tercera"] # 0x2034 (en: 'triple prime', MathPlayer: 'tercera', google: 'triple prime') - - "—": [T: "prima inversa"] # 0x2035 (en: 'reversed prime') - - "‶": [T: "segunda inversa"] # 0x2036 (en: 'reversed double prime') - - "‷": [T: "tercera inversa"] # 0x2037 (en: 'reversed triple prime', google: 'triple prime invertido') - - "℉": [T: "grados Fahrenheit"] # 0x2109 (en: 'degrees fahrenheit') - - "ℎ": [T: "constante de Planck"] # 0x210e (en: 'planck constant', MathPlayer: 'constante de Planck', google: 'planck constante') - - "â„Ș": [T: "grados Kelvin"] # 0x212a (en: 'kelvin') - - "←": [T: "flecha izquierda"] # 0x2190 (en: 'leftwards arrow') - - "↑": [T: "flecha arriba"] # 0x2191 (en: 'upwards arrow') - - "↓": [T: "flecha abajo"] # 0x2193 (en: 'downwards arrow') - - "⇒": [T: "flecha doble derecha"] # 0x21d2 (en: 'rightwards double arrow') - - "∘": [T: "compuesto"] # 0x2218 (en: 'composed with') - - "∣": [T: "divisible"] # 0x2223 (en: 'divides') - - "∀": [T: "indivisible"] # 0x2224 (en: 'does not divide') - - "∷": [T: "como"] # 0x2237 (en: 'as') - - "∌": [T: "distinto de"] # 0x223c (en: 'varies with') - - "∜": [T: "tilde inversa"] # 0x223d (en: 'reversed tilde') - - "∿": [T: "onda sinusoidal"] # 0x223f (en: 'sine wave') - - "≩": [T: "menor o igual a"] # 0x2266 (en: 'less than over equal to') - - "≧": [T: "mayor o igual a"] # 0x2267 (en: 'greater than over equal to') +--- + # Note to translators: + # most languages don't have two ways to pronounce 'a' -- if not need, remove the rules and change "B-Z" to "A-Z" + # some languages say the word for "uppercase" after the letter. Make sure to change that where appropriate by moving some code around + - "a-z": + - test: + if: "$TTS='none'" + then: [T: "."] + else: [spell: "'.'"] + - "A-Z": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "mayĂșscula"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + # note: processing of ranges converts '.' into the character, so it needs to be in quotes below + replace: [spell: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"] + + - "0-9": [T: "."] # (en: '.') + + - " ": [t: " "] # 0x20 + + - "!": [T: "factorial"] # 0x21 + - "\"": [T: "barra inversa"] # 0x22 (en: 'quotation mark') + - "#": [T: "almohadilla"] # 0x23 (en: 'number', MathPlayer: 'signo de nĂșmero', google: 'nĂșmero') + - "$": [T: "dĂłlar"] # 0x24 (en: 'dollars') + - "%": [T: "porciento"] # 0x25 (en: 'percent') + - "&": [T: "ampersand"] # 0x26 + - "'": [T: "apĂłstrofo"] # 0x27 (en: 'apostrophe', MathPlayer: 'apĂłstrofo', google: 'apĂłstrofe') + - "(": # 0x28 + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then_test: + if: "$Verbosity='Terse'" + then: [T: "abrir parĂ©ntesis"] # (en: 'open', google translation) + else: [T: "se abren parĂ©ntesis"] # (en: 'open paren', MathPlayer: 'parĂ©ntesis', google: 'parĂ©ntesis abierto') + else: [T: "se abren parĂ©ntesis"] # (en: 'left paren', MathPlayer: 'parĂ©ntesis', google: 'parĂ©ntesis dejado') + - ")": # 0x29 + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then_test: + if: "$Verbosity='Terse'" + then: [T: "cerrar parĂ©ntesis"] # (en: 'close', google translation) + else: [T: "se cierran parĂ©ntesis"] # (en: 'close paren', MathPlayer: 'cierra parĂ©ntesis', google: 'parĂ©ntesis cercana') + else: [T: "se cierran parĂ©ntesis"] # (en: 'right paren', MathPlayer: 'cierra parĂ©ntesis') + + - "*": # 0x2a + test: + if: "parent::*[name(.)='msup' or name(.)='msubsup']" + then: [T: "estrella"] # (en: 'star', google translation) + else: [T: "por"] # (en: 'times') + - "+": [T: "mĂĄs"] # 0x2b (en: 'plus') + - ",": # 0x2c + # the following deals with the interaction of "," with "
" which sometimes wants the ',' to be silent + # that this test is here and not with "
" is not ideal, but seems simplest + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or " + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak "comma" when not adjacent to '
' + - "( following-sibling::*[1][text()!= '
'] and preceding-sibling::*[1][text()!='
'] ) or " + # except if expression starts with '
' + - "../*[1][.='
'] " + then: + - T: "coma" # (en: 'comma', google translation) + - test: + if: "$Verbosity != Terse" + then: [pause: short] + # else silent + + - "-": [T: "menos"] # 0x2d (en: 'minus') + - ".": # 0x2e + - test: + if: "parent::*[1][self::m:mn]" + then: [T: "punto"] # (en: 'point', google translation) + else: [T: "punto"] # (en: 'dot') + - "/": [T: "barra oblicua"] # 0x2f (en: 'divided by') + - ":": [T: "dos puntos"] # 0x3a (en: 'colon') + - ";": [T: "punto y coma"] # 0x3b (en: 'semicolon') + - "<": # 0x3c + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "menor que" # (en: 'less than') + - "=": # 0x3d + - test: + if: "$Verbosity!='Terse'" + then: [T: "es igual a"] # (en: 'is equal to', google translation) + else: [T: "igual a"] # (en: 'equals', google: 'iguales') + + - ">": # 0x3e + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "mayor que" # (en: 'greater than') + - "?": [T: "interrogaciĂłn derecha"] # 0x3f (en: 'question mark', MathPlayer: 'cierra interrogaciĂłn', google: 'signo de interrogaciĂłn') + - "@": [T: "arroba"] # 0x40 (en: 'at sign') + - "[": # 0x5b + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "abrir corchetes"] # (en: 'open bracket', google translation) + else: [T: "se abren corchetes"] # (en: 'left bracket', MathPlayer: 'abre corchetes', google: 'soporte izquierdo') + - "\\": [T: "se abren corchetes"] # 0x5c (en: 'back slash', MathPlayer: 'abre corchetes', google: 'back slash') + - "]": # 0x5d + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "cerrar corchetes"] # (en: 'close bracket', google translation) + else: [T: "se cierran corchetes"] # (en: 'right bracket', MathPlayer: 'cierra corchetes', google: 'soporte derecho') + - "^": [T: "acento circunflejo"] # 0x5e (en: 'hat') + - "_": [T: "subrayado"] # 0x5f (en: 'under bar') + - "`": [T: "acento grave"] # 0x60 (en: 'grave') + - "{": # 0x7b + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "abrir llaves"] # (en: 'open brace', google translation) + else: [T: "se abren llaves"] # (en: 'left brace', MathPlayer: 'abre llaves', google: 'abrazadera izquierda') + - "|": # 0x7c + # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' + - test: + - if: "$SpeechStyle != 'ClearSpeak' or not(preceding-sibling::*) or not(following-sibling::*)" + then: [T: "barra vertical"] # (en: 'vertical line', google translation) + - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" + then: [T: "tal que"] # (en: 'such that', google translation) + - else_if: "$ClearSpeak_VerticalLine = 'Given'" + then: [T: "dado"] # (en: 'given', google translation) + - else: [T: "barra vertical"] # (en: 'divides') + + - "}": # 0x7d + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "cerrar llaves"] # (en: 'close brace', google translation) + else: [T: "se cierran llaves"] # (en: 'right brace', MathPlayer: 'cierra llaves', google: 'abrazadera derecha') + + - "~": [T: "tilde"] # 0x7e + - " ": # 0xa0 + - test: + if: "@data-empty-in-2D" + then: [T: "vacĂ­o"] # want to say something for fraction (etc) with empty child (en: 'empty', google translation) + else: [T: ""] + + - "Âą": [T: "centavo"] # 0xa2 (en: 'cents') + - "ÂŁ": [T: "libra esterlina"] # 0xa3 (en: 'pounds') + - "ÂŹ": [T: "no"] # 0xac (en: 'not') + - "°": [T: "grado"] # 0xb0 (en: 'degrees') + - "±": [T: "mĂĄs menos"] # 0xb1 (en: 'plus or minus') + - "ÂŽ": [T: "acento agudo"] # 0xb4 (en: 'acute') + - "·": # 0xB7 + - test: + if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolDot = 'Auto'" + then_test: + if: "$Verbosity = 'Verbose'" + then: [T: "multiplicado por"] # (en: 'times', google translation) + else: [T: "por"] + else: [T: "punto medio"] # (en: 'dot') + - "×": # 0xd7 + - test: + if: "$Verbosity = 'Verbose'" + then: [T: "multiplicado por"] # (en: 'times', google translation) + else: [T: "por"] + - "Ă·": [T: "dividido por"] # 0xf7 (en: 'divided by') + - "̀": [T: "acento grave ornamentado"] # 0x300 (en: 'grave accent embellishment', google: 'embellido de acento grave') + - "́": [T: "acento agudo ornamentado"] # 0x301 (en: 'acute accent embellishment', google: 'embellido de acento agudo') + - "̂": [T: "acento circunflejo ornamentado"] # 0x302 (en: 'circumflex accent embellishment', google: 'embellamiento del acento circunflejo') + - "̃": [T: "tilde ornamentada"] # 0x303 (en: 'tilde embellishment', google: 'tilde adorno') + - "̄": [T: "barra ornamentada"] # 0x304 (en: 'macron embellishment', google: 'embellido de macron') + - "̅": [T: "barra encima con adorno"] # 0x305 (en: 'overbar embellishment', google: 'embellido de overbar') + - "̆": [T: "breve"] # 0x306 + - "̇": [T: "punto encima con adorno"] # 0x307 (en: 'dot above embellishment', google: 'punto por encima del adorno') + + # Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong + - "Α-Ω": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "mayĂșscula"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + # note: processing of ranges converts '.' into the character, so it needs to be in quotes below + replace: [spell: "translate('.', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')"] + + - "α": [T: "alfa"] # 0x3b1 (en: 'alpha') + - "ÎČ": [T: "beta"] # 0x3b2 + - "Îł": [T: "gamma"] # 0x3b3 (google: 'gama') + - "ÎŽ": [T: "delta"] # 0x3b4 + - "Δ": [T: "Ă©psilon"] # 0x3b5 (en: 'epsilon', google: 'epsilon') + - "ζ": [T: "zeta"] # 0x3b6 + - "η": [T: "eta"] # 0x3b7 + - "Ξ": [T: "theta"] # 0x3b8 + - "Îč": [T: "iota"] # 0x3b9 + - "Îș": [T: "kappa"] # 0x3ba + - "λ": [T: "lambda"] # 0x3bb + - "ÎŒ": [T: "my"] # 0x3bc (en: 'mu', google: 'mu') + - "Μ": [T: "ny"] # 0x3bd (en: 'nu', google: 'nu') + - "Ο": [T: "xi"] # 0x3be (en: 'zai', google: 'zai') + - "Îż": [T: "Ăłmicron"] # 0x3bf (en: 'omicron', google: 'omicron') + - "π": [T: "pi"] # 0x3c0 + - "ρ": [T: "rho"] # 0x3c1 + - "ς": [T: "sigma final"] # 0x3c2 (en: 'final sigma', google: 'final sigma') + - "σ": [T: "sigma"] # 0x3c3 + - "τ": [T: "tau"] # 0x3c4 + - "υ": [T: "Ă­psilon"] # 0x3c5 (en: 'upsilon', google: 'upsilon') + - "φ": [T: "phi"] # 0x3c6 (google: 'fi') + - "χ": [T: "ji"] # 0x3c7 (en: 'chi', google: 'chi') + - "ψ": [T: "psi"] # 0x3c8 + - "ω": [T: "omega"] # 0x3c9 + - "ϕ": [T: "phi recta"] # 0x3d5 (en: 'phi', google: 'fi') + - "ϖ": [T: "variante de pi"] # 0x3d6 (en: 'pi', google: 'pi') + - "Ï”": [T: "variante de Ă©psilon"] # 0x3f5 (en: 'epsilon', google: 'epsilon') + - "϶": [T: "Ă©psilon invertida"] # 0x3f6 (en: 'reversed epsilon') + + - "⁹": [T: ""] # 0x2062 + - "ℂℕℚℝ℀": # here we rely on this running through the table again to speak "cap xxx" + - T: "prima inversa" # (en: 'double-struck', google: 'doble golpe') + - spell: "translate('.', 'ℂℕℚℝ℀', 'CNQRZ')" + + - "℃": [T: "grados Celsius"] # 0x2103 (en: 'degrees celsius', google: 'grados celsius') + - "ℋℛℓ": # 0x210b + - T: "grados Fahrenheit" # (en: 'script', google: 'guion') + - spell: "translate('.', 'ℋℛℓ', 'HRl')" + - "ℜ": # 0x211c + - T: "r mayĂșscula partida" # (en: 'fraktur', google: 'fraktur') + - spell: "'R'" + + - "ⅆⅇⅈⅉ": # 0x2146-9 + - T: "angstrom resaltado" # (en: 'double-struck italic') + - spell: "translate('.', 'ⅆⅇⅈⅉ', 'deij')" + + - "∄": # 0x2225 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "paralelo a" # (en: 'parallel to') + - "∊": # 0x2226 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no paralela a" # (en: 'not parallel to') + - "≀": # 0x2264 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "menor o igual a" + - "≄": # 0x2265 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "mayor o igual a" # (en: 'greater than or equal to') + + # --- restored complex short definitions (prefer over unicode-full) --- + - "
": # 0x2026 + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak '
' as 'and so on...' unless expr starts with '
' + - "../*[1][.='
']" + then: [T: "puntos suspensivos"] # (en: 'dot dot dot', google translation) + else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' + if: "count(following-sibling::*) = 0" + then: [T: "etcĂ©tera"] # (en: 'and so on', google translation) + else: [T: "puntos suspensivos"] # (en: 'and so on up to', MathPlayer: 'punto punteado punteado', google: 'y asĂ­ sucesivamente') + - "⁥": # 0x2061 + - test: + # skip saying "of" when Terse and a trig function, when it is a shape (does this happen?), or we are in :literal mode + if: "not( + ( $Verbosity='Terse' or ($SpeechStyle = 'ClearSpeak' and IsNode(following-sibling::*[1],'simple')) and + preceding-sibling::*[1][IfThenElse($SpeechStyle='ClearSpeak', + IsInDefinition(., 'ClearSpeakTrigFunctionNames'), + IsInDefinition(., 'TrigFunctionNames') )] + ) or + preceding-sibling::*[1][IsInDefinition(., 'GeometryShapes')] or + (@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) + )" + then: [T: "de"] # (en: 'of', google translation) + - "→": # 0x2192 + - test: + if: "ancestor::*[2][self::m:limit]" + then: [T: "aproximaciones"] # (en: 'approaches', google translation) + else: [T: "flecha derecha"] # (en: 'right arrow', MathPlayer: 'flecha', google: 'flecha correcta') + - "∂": # 0x2202 + - test: + if: "$Verbosity='Terse'" + then: [T: "parcial"] # (en: 'partial', google translation) + else: [T: "derivada parcial"] # (en: 'partial derivative') + - "∆": # 0x2206 + - test: + if: "$Verbosity!='Terse'" + then: [T: "el"] # (en: 'the', google translation) + - T: "incremento" # (en: 'laplacian of') + - "∈": # 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: [T: "un elemento de"] # (en: 'an element of', google translation) + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "en"] # (en: 'in', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "miembro de"] # (en: 'member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "elemento de"] # (en: 'element of', google translation) + - else: [T: "pertenece a"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "es miembro de"] # (en: 'is a member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "es un elemento de"] # (en: 'is an element of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "estĂĄ en"] # (en: 'is in', google translation) + - else: [T: "pertenece a"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') + - "∉": # 0x2209 + # rule is identical to 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: [T: "no es un elemento de"] # (en: 'is not an element of', google translation) + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "no estĂĄ en"] # (en: 'not in', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "no es miembro de"] # (en: 'not member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "no es un elemento de"] # (en: 'not element of', google translation) + - else: [T: "no pertenece a"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'not belonging to') + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "no es miembro de"] # (en: 'is not a member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "no es un elemento de"] # (en: 'is not an element of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "no estĂĄ incluido en"] # (en: 'is not in', google translation) + - else: [T: "no pertenece a"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'does not belong to') + - "∊": # 0x220a + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: [T: "es un elemento de"] # (en: 'is an element of', google translation) + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "en"] # (en: 'in', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "miembro de"] # (en: 'member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "elemento de"] # (en: 'element of', google translation) + - else: [T: "pertenece a"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "es miembro de"] # (en: 'is a member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "es un elemento de"] # (en: 'is an element of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "estĂĄ en"] # (en: 'is in', google translation) + - else: [T: "pertenece a"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') + - "√": # 0x221a + - test: + if: "$Verbosity!='Terse'" + then: [T: "el"] # (en: 'the', google translation) + - T: "raĂ­z cuadrada de" # (en: 'square root of') + - "∝": # 0x221d + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "proporcional a" # (en: 'proportional to') + - "∶": # 0x2236 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "a" # (en: 'to') + - "∟": # 0x223e + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "mĂĄs positivo" # (en: 'most positive') + - "≠": # 0x2260 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no es igual a" # (en: 'not equal to', MathPlayer: 'distinto de', google: 'no igual a') + - "≡": # 0x2261 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "idĂ©ntico a" # (en: 'identical to') + - "⊂": # 0x2282 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es un"] # (en: 'is a', google translation) + - T: "subconjunto de" # (en: 'subset of') + - "⊃": # 0x2283 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es un"] # (en: 'is a', google translation) + - T: "superconjunto de" # (en: 'superset of') + - "⊄": # 0x2284 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no es un subconjunto de" # (en: 'not a subset of') + - "⊅": # 0x2285 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es"] # (en: 'is', google translation) + - T: "no esun superconjunto de" # (en: 'not a superset of') + - "⊆": # 0x2286 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es un"] # (en: 'is a', google translation) + - T: "subconjunto o igual a" # (en: 'subset of or equal to') + - "⊇": # 0x2287 + - test: + if: "$Verbosity!='Terse'" + then: [T: "es un"] # (en: 'is a', google translation) + - T: "superconjunto o igual a" # (en: 'superset of or equal to') + + # --- restored short definitions that differ from unicode-full --- + - "–": [T: "ene raya"] # 0x2013 (en: 'en dash') + - "—": [T: "eme raya"] # 0x2014 (en: 'em dash') + - "‖": [T: "barra vertical doble"] # 0x2016 (en: 'double vertical line') + - "″": [T: "segunda"] # 0x2033 (en: 'double prime', MathPlayer: 'segunda', google: 'doble primo') + - "‮": [T: "tercera"] # 0x2034 (en: 'triple prime', MathPlayer: 'tercera', google: 'triple prime') + - "—": [T: "prima inversa"] # 0x2035 (en: 'reversed prime') + - "‶": [T: "segunda inversa"] # 0x2036 (en: 'reversed double prime') + - "‷": [T: "tercera inversa"] # 0x2037 (en: 'reversed triple prime', google: 'triple prime invertido') + - "℉": [T: "grados Fahrenheit"] # 0x2109 (en: 'degrees fahrenheit') + - "ℎ": [T: "constante de Planck"] # 0x210e (en: 'planck constant', MathPlayer: 'constante de Planck', google: 'planck constante') + - "â„Ș": [T: "grados Kelvin"] # 0x212a (en: 'kelvin') + - "←": [T: "flecha izquierda"] # 0x2190 (en: 'leftwards arrow') + - "↑": [T: "flecha arriba"] # 0x2191 (en: 'upwards arrow') + - "↓": [T: "flecha abajo"] # 0x2193 (en: 'downwards arrow') + - "⇒": [T: "flecha doble derecha"] # 0x21d2 (en: 'rightwards double arrow') + - "∘": [T: "compuesto"] # 0x2218 (en: 'composed with') + - "∣": [T: "divisible"] # 0x2223 (en: 'divides') + - "∀": [T: "indivisible"] # 0x2224 (en: 'does not divide') + - "∷": [T: "como"] # 0x2237 (en: 'as') + - "∌": [T: "distinto de"] # 0x223c (en: 'varies with') + - "∜": [T: "tilde inversa"] # 0x223d (en: 'reversed tilde') + - "∿": [T: "onda sinusoidal"] # 0x223f (en: 'sine wave') + - "≩": [T: "menor o igual a"] # 0x2266 (en: 'less than over equal to') + - "≧": [T: "mayor o igual a"] # 0x2267 (en: 'greater than over equal to') diff --git a/Rules/Languages/fi/unicode-full.yaml b/Rules/Languages/fi/unicode-full.yaml index a43408b28..cb48cd1cd 100644 --- a/Rules/Languages/fi/unicode-full.yaml +++ b/Rules/Languages/fi/unicode-full.yaml @@ -1,3435 +1,3435 @@ ---- - -# Translated with the help of https://jkorpela.fi/merkkien-nimet.html - - - "Âą": [T: "senttiĂ€"] # 0xa2 (en: 'cents') - - "ÂŁ": [T: "puntaa"] # 0xa3 (en: 'pounds') - - "€": [T: "valuuttamerkki"] # 0xa4 (en: 'currency sign') - - "„": [T: "jeni"] # 0xa5 (en: 'yen', google: 'jeni') - - "Š": [T: "katkopystyviiva"] # 0xa6 (en: 'broken bar', google: 'rikkoutunut palkki') - - "§": [T: "pykĂ€lĂ€"] # 0xa7 (en: 'section', google: 'osa') - - "š": [T: "piste piste"] # 0xa8 (en: 'double dot', google: 'kaksinkertainen piste') # FI: use case with derivative? - - "©": [T: "tekijĂ€noikeus"] # 0xa9 (en: 'copyright', google: 'tekijĂ€noikeudet') # FI: in NVDA it's written "copyright" - - "ÂȘ": [T: "feminiininen jĂ€rjestysluku"] # 0xaa (en: 'feminine ordinal indicator', google: 'naisellinen ordinaaliindikaattori') - - "«": [T: "vasemmalle osoittava kaksinkertainen kulmalainausmerkki"] # 0xab (en: 'left-pointing double angle quote mark', google: 'vasemman potentiaalinen kaksoiskulma lainausmerkki') - - "ÂŻ": # 0xaf - - test: - if: "ancestor::m:modified-variable and preceding-sibling::*[1][self::m:mi]" - then: [T: "viiva"] # (en: 'bar', google translation) - else: [T: "viiva"] # (en: 'line', google: 'linja') - - "ÂČ": [T: "ylĂ€indeksi kaksi"] # 0xb2 (en: 'two', google: 'kaksi') - - "Âł": [T: "ylĂ€indeksi kolme"] # 0xb3 (en: 'three', google: 'kolme') - - "”": [T: "mikro"] # 0xb5 (en: 'micro') - - "Âč": [T: "ylĂ€indeksi yksi"] # 0xb9 (en: 'one', google: 'yksi') - - "Âș": [T: "maskuliininen jĂ€rjestysluku"] # 0xb9 (en: 'masculine ordinal indicator', google: 'maskuliininen ordinaaliindikaattori') # should be 0xba - - "ʰ": [T: "ylĂ€indeksi h"] # 0x2b0 (en: 'modifier small h', google translation) - - "ʱ": [T: "ylĂ€indeksi h koukulla"] # 0x2b1 (en: 'modifier small h with hook', google translation) - - "ÊČ": [T: "ylĂ€indeksi j"] # 0x2b2 (en: 'modifier small j', google translation) - - "Êł": [T: "ylĂ€indeksi r"] # 0x2b3 (en: 'modifier small r', google translation) - - "ÊŽ": [T: "ylĂ€indeksi kÀÀnnetty r"] # 0x2b4 (en: 'modifier small turned r', google translation) - - "Ê”": [T: "ylĂ€indeksi kÀÀnnetty r koukulla"] # 0x2b5 (en: 'modifier small turned r with hook', google translation) - - "ʶ": # 0x2b6 - - T: "ylĂ€indeksi kÀÀnnetty R" # (en: 'modifier small inverted', google translation) - - SPELL: "translate('R', 'R', 'R')" - - - "Ê·": [T: "ylĂ€indeksi w"] # 0x2b7 (en: 'modifier small w', google translation) - - "Êž": [T: "ylĂ€indeksi y"] # 0x2b8 (en: 'modifier small y', google translation) - - "Êč": [T: "priimi"] # 0x2b9 (en: 'modifier prime', google translation) # FI: derivated once -> "pilkku" - - "Êș": [T: "kaksoispriimi"] # 0x2ba (en: 'modifier double prime', google translation) # FI: derivated twice -> "pilkku pilkku" - - "Ê»": [T: "kÀÀnteispilkku"] # 0x2bb (en: 'modifier turned comma', google translation) - - "ÊŒ": [T: "heitto"] # 0x2bc (en: 'modifier apostrophe', google translation) - - "Êœ": [T: "peilikuvapilkku"] # 0x2bd (en: 'modifier reversed comma', google translation) - - "ÊŸ": [T: "tarke oikea puolikaari"] # 0x2be (en: 'modifier right half ring', google: 'muokkain oikea puolirengas') - - "Êż": [T: "tarke vasen puolikaari"] # 0x2bf (en: 'modifier left half ring', google: 'muokkain vasemmalla puolirengas') - - "ˀ": [T: "glottaaliklusiilitarke"] # 0x2c0 (en: 'modifier glottal stop', google translation) - - "ˁ": [T: "kÀÀnnetty glottaaliklusiilitarke"] # 0x2c1 (en: 'modifier reversed glottal stop', google translation) - - "˂": [T: "tarke vasen nuoli"] # 0x2c2 (en: 'modifier left arrowhead', google translation) - - "˃": [T: "tarke oikea nuoli"] # 0x2c3 (en: 'modifier right arrowhead', google translation) - - "˄": [T: "tarke nuoli ylös"] # 0x2c4 (en: 'modifier up arrowhead', google translation) - - "˅": [T: "tarke nuoli alas"] # 0x2c5 (en: 'modifier down arrowhead', google translation) - - "ˆ": [T: "sirkumfleksi"] # 0x2c6 (en: 'modifier circumflex accent', google: 'modifikaattorin ympĂ€ryssuoja aksentti') # FI: should maybe be "hat", "hattu" - - "ˇ": [T: "ylösalainen sirkumfleksi"] # 0x2c7 (en: 'caron', google: 'caron') # FI: "inverted hat"? "kÀÀnnetty hattu" - - "ˈ": [T: "tarke pystyviiva"] # 0x2c8 (en: 'modifier vertical line', google translation) - - "ˉ": [T: "pituusmerkki"] # 0x2c9 (en: 'modifier macron', google: 'muokkain macron') - - "ˊ": [T: "tarke akuutti"] # 0x2ca (en: 'modifier acute accent', google translation) - - "ˋ": [T: "tarke gravis"] # 0x2cb (en: 'modifier grave accent', google translation) - - "ˌ": [T: "tarke alapystyviiva"] # 0x2cc (en: 'modifier low vertical line', google translation) - - "ˍ": [T: "alapituusmerkki"] # 0x2cd (en: 'modifier low macron', google translation) - - "ˎ": [T: "alagravis"] # 0x2ce (en: 'modifier low grave accent', google translation) - - "ˏ": [T: "ala-akuutti"] # 0x2cf (en: 'modifier low acute accent', google translation) - - "ː": [T: "kolmiokaksoispiste"] # 0x2d0 (en: 'modifier triangular colon', google translation) - - "ˑ": [T: "puolikas kolmiokaksoispiste"] # 0x2d1 (en: 'modifier half triangular colon', google translation) - - "˒": [T: "keskitetty oikea puolirengas"] # 0x2d2 (en: 'modifier centered right half ring', google translation) - - "˓": [T: "keskitetty vasen puolirengas"] # 0x2d3 (en: 'modifier centered left half ring', google translation) - - "˔": [T: "nupi ylöspĂ€in"] # 0x2d4 (en: 'modifier up tadck', google translation) - - "˕": [T: "nupi alaspĂ€in"] # 0x2d5 (en: 'modifier down tack', google translation) - - "˖": [T: "plus"] # 0x2d6 (en: 'modifier plus sign', google translation) - - "˗": [T: "miinus"] # 0x2d7 (en: 'modifier minus sign', google translation) - - "˘": [T: "lyhyysmerkki"] # 0x2d8 (en: 'breve', google: 'breve') - - "˙": [T: "piste"] # 0x2d9 (en: 'dot', google: 'piste') - - "˚": [T: "ylĂ€ympyrĂ€"] # 0x2da (en: 'ring above', google: 'rengas ylĂ€puolella') - - "˛": [T: "ogonek"] # 0x2db - - "˜": [T: "pieni tilde"] # 0x2dc (en: 'small tilde', google: 'pieni tilde') - - "˝": [T: "kaksoisakuutti"] # 0x2dd (en: 'double acute accent', google: 'kaksinkertainen akuutti aksentti') - - "˞": [T: "rhoottinen koukku"] # 0x2de (en: 'modifier rhotic hook', google translation) - - "˟": [T: "risti"] # 0x2df (en: 'modifier cross accent', google translation) - - "Ë ": [T: "pieni gamma"] # 0x2e0 (en: 'modifier small gamma', google translation) # FI: should these be without "pieni" ("small")? - - "ËĄ": [T: "pieni l"] # 0x2e1 (en: 'modifier small l', google translation) - - "Ëą": [T: "pieni s"] # 0x2e2 (en: 'modifier small s', google translation) - - "ËŁ": [T: "pieni x"] # 0x2e3 (en: 'modifier small x', google translation) - - "Ë€": [T: "pieni kÀÀnnetty glottaaliklusiili"] # 0x2e4 (en: 'modifier small reversed glottal stop', google translation) - - "Ë„": [T: "erittĂ€in korkea ÀÀnipalkki"] # 0x2e5 (en: 'modifier extra-high tone bar', google translation) - - "ËŠ": [T: "korkea ÀÀnipalkki"] # 0x2e6 (en: 'modifier high tone bar', google translation) - - "˧": [T: "keskiÀÀnipalkki"] # 0x2e7 (en: 'modifier mid tone bar', google translation) - - "Ëš": [T: "matala ÀÀnipalkki"] # 0x2e8 (en: 'modifier low tone bar', google translation) - - "Ë©": [T: "erittĂ€in matala ÀÀnipalkki"] # 0x2e9 (en: 'modifier extra-low tone bar', google translation) - - "ËȘ": [T: "yin lĂ€htöÀÀnimerkki"] # 0x2ea (en: 'modifier yin departing tone mark', google translation) # FI: unclear - - "Ë«": [T: "yang lĂ€htöÀÀnimerkki"] # 0x2eb (en: 'modifier yang departing tone mark', google translation) # FI: unclear - - "ËŹ": [T: "ÀÀntĂ€mismerkki"] # 0x2ec (en: 'modifier voicing', google translation) - - "Ë­": [T: "aspiroitumattomuusmerkki"] # 0x2ed (en: 'modifier unaspirated', google translation) - - "Ëź": [T: "kaksoisheittomerkki"] # 0x2ee (en: 'modifier double apostrophe', google translation) - - "ËŻ": [T: "alanuolenpÀÀ alas"] # 0x2ef (en: 'modifier low down arrowhead', google translation) - - "˰": [T: "alanuolenpÀÀ ylös"] # 0x2f0 (en: 'modifier low up arrowhead', google translation) - - "˱": [T: "alanuolenpÀÀ vasemmalle"] # 0x2f1 (en: 'modifier low left arrowhead', google translation) - - "ËČ": [T: "alanuolenpÀÀ oikealle"] # 0x2f2 (en: 'modifier low right arrowhead', google translation) - - "Ëł": [T: "alarengas"] # 0x2f3 (en: 'modifier low ring', google translation) - - "ËŽ": [T: "keskitetty gravis"] # 0x2f4 (en: 'modifier middle grave accent', google translation) - - "Ë”": [T: "keskitetty tuplagravis"] # 0x2f5 (en: 'modifier middle double grave accent', google translation) - - "˶": [T: "keskitetty akuutti"] # 0x2f6 (en: 'modifier middle double acute accent', google translation) - - "Ë·": [T: "alatilde"] # 0x2f7 (en: 'modifier low tilde', google translation) - - "Ëž": [T: "nostettu kaksoispiste"] # 0x2f8 (en: 'modifier raised colon', google translation) - - "Ëč": [T: "korkea ÀÀni alku"] # 0x2f9 (en: 'modifier begin high tone', google translation) - - "Ëș": [T: "korkea ÀÀni loppu"] # 0x2fa (en: 'modifier end high tone', google translation) - - "Ë»": [T: "matala ÀÀni alku"] # 0x2fb (en: 'modifier begin low tone', google translation) - - "ËŒ": [T: "matala ÀÀni loppu"] # 0x2fc (en: 'modifier end low tone', google translation) - - "Ëœ": [T: "tarke hylly"] # 0x2fd (en: 'modifier shelf', google translation) - - "ËŸ": [T: "tarke avoin hylly"] # 0x2fe (en: 'modifier open shelf', google translation) - - "Ëż": [T: "vasen alanuoli"] # 0x2ff (en: 'modifier low left arrow', google translation) - - "̈": [T: "treema"] # 0x308 (en: 'diaeresis embellishment', google: 'diaeresis -koriste') - - "̉": [T: "ylĂ€koukku"] # 0x309 (en: 'hook above embellishment', google translation) - - "̊": [T: "ylĂ€ympyrĂ€"] # 0x30a (en: 'ring above embellishment', google: 'rengas koristelun ylĂ€puolella') - - "̋": [T: "kakoisakuutti"] # 0x30b (en: 'double acute accent embellishment', google translation) - - "̌": [T: "hattu"] # 0x30c (en: 'check', google: 'tarkistaa') - - "̍": [T: "ylĂ€puolinen pystyviiva"] # 0x30d (en: 'vertical line above embellishment', google translation) - - "̎": [T: "ylĂ€puolinen kaksoispystyviiva"] # 0x30e (en: 'double vertical line above embellishment', google translation) - - "̏": [T: "kakoisgravis"] # 0x30f (en: 'double grave accent embellishment', google translation) - - "̐": [T: "candrabindu"] # 0x310 (en: 'candrabindu embellishment', google translation) - - "̑": [T: "ylösalainen lyhyysmerkki"] # 0x311 (en: 'inverted breve embellishment', google: 'kÀÀnteinen breve -koriste') - - "̒": [T: "ylĂ€puolinen ylösalainen pilkku"] # 0x312 (en: 'turned comma above embellishment', google translation) - - "̓": [T: "ylĂ€oikealla oleva pilkku"] # 0x313 (en: 'comma above embellishment', google translation) - - "̔": [T: "ylĂ€puolinen peilikuvapilkku"] # 0x314 (en: 'reversed comma above embellishment', google translation) - - "̕": [T: "ylĂ€pilkku"] # 0x315 (en: 'comma above right embellishment', google translation) - - "̖": [T: "alapuolinen gravis"] # 0x316 (en: 'grave accent below embellishment', google translation) - - "̗": [T: "alapuolinen akuutti"] # 0x317 (en: 'acute accent below embellishment', google translation) - - "̘": [T: "alapuolinen vasemmalle osoittava nupi"] # 0x318 (en: 'left tack below embellishment', google translation) - - "̙": [T: "alapuolinen oikealle osoittava nupi"] # 0x319 (en: 'right tack below embellishment', google translation) - - "̚": [T: "ylĂ€puolinen vasen kulma"] # 0x31a (en: 'left angle above embellishment', google translation) - - "̛": [T: "sarvi"] # 0x31b (en: 'horn embellishment', google translation) - - "̜": [T: "alapuolinen vasen ympyrĂ€nkaari"] # 0x31c (en: 'left half ring below embellishment', google translation) - - "̝": [T: "alapuolinen ylös osoittava nupi"] # 0x31d (en: 'up tack below embellishment', google translation) - - "̞": [T: "alapuolinen alas osoittava nupi"] # 0x31e (en: 'down tack below embellishment', google translation) - - "̟": [T: "alapuolinen plusmerkki"] # 0x31f (en: 'plus sign below embellishment', google translation) - - "Ì ": [T: "alapuolinen miinusmerkki"] # 0x320 (en: 'minus sign below embellishment', google translation) - - "ÌĄ": [T: "alapuolinen palataalisuuskoukku"] # 0x321 (en: 'palatalized hook below embellishment', google translation) - - "Ìą": [T: "alapuolinen retrofleksisuuskoukku"] # 0x322 (en: 'retroflex hook below embellishment', google translation) - - "ÌŁ": [T: "alapiste"] # 0x323 (en: 'dot below embellishment', google: 'piste koristelun alapuolella') - - "Ì€": [T: "alatreema"] # 0x324 (en: 'diaeresis below embellishment', google: 'diaeresis koristelun alapuolella') - - "Ì„": [T: "alaympyrĂ€"] # 0x325 (en: 'ring below embellishment', google translation) - - "ÌŠ": [T: "alapilkku"] # 0x326 (en: 'comma below embellishment', google translation) - - "̧": [T: "sedilji"] # 0x327 (en: 'cedilla embellishment', google: 'cedilla -koriste') - - "Ìš": [T: "ogonek"] # 0x328 (en: 'ogonek embellishment', google translation) - - "Ì©": [T: "alapuolinen pystyviiva"] # 0x329 (en: 'vertical line below embellishment', google translation) - - "ÌȘ": [T: "alapuolinen silta"] # 0x32a (en: 'bridge below embellishment', google translation) - - "Ì«": [T: "alapuolinen ylösalainen kaksoiskaari"] # 0x32b (en: 'inverted double arch below embellishment', google translation) - - "ÌŹ": [T: "alapuolinen hattu"] # 0x32c (en: 'caron below embellishment', google translation) - - "Ì­": [T: "alapuolinen sirkumfleksi"] # 0x32d (en: 'circumflex accent below embellishment', google translation) - - "Ìź": [T: "alapuolinen lyhyysmerkki"] # 0x32e (en: 'breve below embellishment', google: 'breve koristelun alapuolella') - - "ÌŻ": [T: "alapuolinen ylösalainen lyhyysmerkki"] # 0x32f (en: 'inverted breve below embellishment', google translation) - - "̰": [T: "alatilde"] # 0x330 (en: 'tilde below embellishment', google: 'tilde koristelun alapuolella') - - "̱": [T: "alapuolinen pituusmerkki"] # 0x331 (en: 'macron below embellishment', google: 'macron koristelun alapuolella') - - "ÌČ": [T: "alaviiva"] # 0x332 (en: 'low line embellishment', google: 'matala linjakoriste') - - "Ìł": [T: "kaksoisalaviiva"] # 0x333 (en: 'double low line embellishment', google translation) - - "ÌŽ": [T: "tilde pÀÀllĂ€"] # 0x334 (en: 'tilde overlay embellishment', google translation) - - "Ì”": [T: "lyhyt yliviivaus"] # 0x335 (en: 'short stroke overlay embellishment', google translation) - - "̶": [T: "pitkĂ€ yliviivaus"] # 0x336 (en: 'long stroke overlay embellishment', google translation) - - "Ì·": [T: "lyhyt yliviivausvinoviiva"] # 0x337 (en: 'short solidus overlay embellishment', google translation) - - "Ìž": [T: "yliviivausvinoviiva"] # 0x338 (en: 'long solidus overlay embellishment', google: 'pitkĂ€ solidus -pÀÀllekkĂ€isyys') - - "Ìč": [T: "oikea puolirengas alapuolella"] # 0x339 (en: 'right half ring below embellishment', google translation) - - "Ìș": [T: "kÀÀnteinen silta alapuolella"] # 0x33a (en: 'inverted bridge below embellishment', google translation) - - "Ì»": [T: "neliö alapuolella"] # 0x33b (en: 'square below embellishment', google translation) - - "ÌŒ": [T: "lokki alapuolella"] # 0x33c (en: 'seagull below embellishment', google translation) - - "Ìœ": [T: "x ylĂ€puolella"] # 0x33d (en: 'x above embellishment', google translation) - - "ÌŸ": [T: "pystysuora tilde"] # 0x33e (en: 'vertical tilde embellishment', google translation) - - "Ìż": [T: "kaksinkertainen yliviivaus"] # 0x33f (en: 'double overline embellishment', google translation) - - "̀": [T: "gravis"] # 0x340 (en: 'grave tone mark embellishment', google translation) - - "́": [T: "akuutti"] # 0x341 (en: 'acute tone mark embellishment', google translation) - - - "ÎȘΫϏ": # 0x3aa, 0x3ab, 0x3cf - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "iso"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [SPELL: "translate('.', 'ÎȘΫϏ', 'Îčυϗ')"] - - T: "dialyytikalla" # (en: 'with dialytika', google translation) - - "ϊ": [T: "treema-ioota"] # 0x3ca (en: 'iota with dialytika', google translation) - - "ϋ": [T: "treema-ypsilon"] # 0x3cb (en: 'upsilon with dialytika', google translation) - - "ό": [T: "akuutti-omikron"] # 0x3cc (en: 'omicron with tonos', google translation) - - "ύ": [T: "akuutti-ypsilon"] # 0x3cd (en: 'upsilon with tonos', google translation) - - "ώ": [T: "akuutti-oomega"] # 0x3ce (en: 'omega with tonos', google translation) - - "ϐ": [T: "beeta"] # 0x3d0 (en: 'beta', google: 'beeta') - - "ϑ": [T: "theeta"] # 0x3d1 (en: 'theta', google: 'theta') - - "ϒ": [T: "ypsilon koukulla"] # 0x3d2 (en: 'upsilon with hook', google: 'upsilon koukkuun') - - "ϓ": [T: "upsilon akuutilla ja koukulla"] # 0x3d3 (en: 'upsilon with acute and hook', google translation) - - "ϔ": [T: "upsilon treemalla ja koukulla"] # 0x3d4 (en: 'upsilon with diaeresis and hook', google translation) - - "ϗ": [T: "kai"] # 0x3d7 (en: 'kai', google: 'kai') - - "А-ĐŻ": # 0x410 - 0x42f - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "iso"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [SPELL: "translate('.', 'ĐĐ‘Đ’Đ“Đ”Đ•Đ–Đ—Đ˜Đ™ĐšĐ›ĐœĐĐžĐŸĐ ĐĄĐąĐŁĐ€Đ„ĐŠĐ§ĐšĐ©ĐȘЫЏЭПЯ', 'абĐČгЎДжзОĐčĐșĐ»ĐŒĐœĐŸĐżŃ€ŃŃ‚ŃƒŃ„Ń…Ń†Ń‡ŃˆŃ‰ŃŠŃ‹ŃŒŃŃŽŃ')"] - - "а": [T: "a"] # 0x430 (google: 'а') - - "б": [T: "bee"] # 0x431 (google: 'olla') - - "ĐČ": [T: "vee"] # 0x432 - - "Đł": [T: "gee"] # 0x433 - - "ĐŽ": [T: "dee"] # 0x434 - - "Đ”": [T: "jee"] # 0x435 (google: 'eli') - - "ж": [T: "tzee"] # 0x436 - - "Đ·": [T: "zee"] # 0x437 - - "Đž": [T: "i"] # 0x438 (google: 'Đž') - - "Đč": [T: "lyhyt i"] # 0x439 (en: 'short i') - - "Đș": [T: "kaa"] # 0x43a - - "Đ»": [T: "el"] # 0x43b - - "ĐŒ": [T: "em"] # 0x43c - - "Đœ": [T: "en"] # 0x43d (google: 'fi') - - "ĐŸ": [T: "o"] # 0x43e (google: 'ĐŸ') - - "Đż": [T: "pee"] # 0x43f - - "р": [T: "er"] # 0x440 - - "с": [T: "es"] # 0x441 - - "т": [T: "tee"] # 0x442 - - "у": [T: "u"] # 0x443 (google: 'у') - - "ф": [T: "ef"] # 0x444 - - "х": [T: "haa"] # 0x445 - - "ц": [T: "tsee"] # 0x446 - - "ч": [T: "tshee"] # 0x447 - - "ш": [T: "shaa"] # 0x448 - - "щ": [T: "shtshaa"] # 0x449 - - "ъ": [T: "kova merkki"] # 0x44a (en: 'hard sign') - - "ы": [T: "jeru"] # 0x44b - - "ь": [T: "pehmeĂ€ merkki"] # 0x44c (en: 'soft sign') - - "э": [T: "kÀÀnteis-e"] # 0x44d (google: 'э') - - "ю": [T: "juu"] # 0x44e - - "я": [T: "jaa"] # 0x44f - - "‐": [T: "tavuviiva"] # 0x2010 (en: 'hyphen', google: 'tavuviiva') - - "‑": [T: "tavuviiva"] # 0x2011 (en: 'hyphen', google translation) - - "‒": [T: "numerotavuviiva"] # 0x2012 (en: 'figure dash', google translation) - - "–": [T: "lyhyt ajatusviiva"] # 0x2013 (en: 'en dash', google: 'fi dash') - - "—": [T: "pitkĂ€ ajatusviiva"] # 0x2014 (en: 'em dash', google: 'em dash') - - "‖": [T: "kaksinkertainen pystyviiva"] # 0x2016 (en: 'double vertical line', google: 'kaksinkertainen pystysuora viiva') - - "†": [T: "risti"] # 0x2020 (en: 'dagger', google: 'tikari') - - "‡": [T: "kaksoisristi"] # 0x2021 (en: 'double dagger', google: 'kaksinkertainen tikari') - - - "‱": # 0x2022 - - test: - if: "@data-chem-formula-op" - then: [T: "piste"] # (en: 'dot', google translation) - else: [T: "luetelmapallo"] # (en: 'bullet', google: 'luoti') - - - "‰": [T: "promille"] # 0x2030 (en: 'per mille', google: 'per milli') - - "‱": [T: "kymmenestuhannesosa"] # 0x2031 (en: 'per ten thousand', google: 'kymmenentuhatta') - - "—": [T: "kÀÀnteinen priimi"] # 0x2035 (en: 'reversed prime', google: 'kÀÀntynyt pÀÀministeri') # FI: "kÀÀnteinen pilkku" and for the next ones - - "‶": [T: "kÀÀnteinen kaskoispriimi"] # 0x2036 (en: 'reversed double prime', google: 'kÀÀntynyt kaksinkertainen prime') - - "‷": [T: "kÀÀnteinen kolmoispriimi"] # 0x2037 (en: 'reversed triple prime', google translation) - - "‾": [T: "lisĂ€ys"] # 0x2038 - - "â€č": [T: "vasemmalle osoittava kulmapuolilainaus"] # 0x2039 (en: 'single left pointing angle quote mark', google: 'yksi vasen piste -kulman lainausmerkki') - - "â€ș": [T: "oikealle osoittava kulmapuolilainaus"] # 0x203a (en: 'single right pointing angle quote mark', google: 'yksi oikea osoituskulma lainausmerkki') - - "‌": [T: "kaksoiskertoma"] # 0x203c (en: 'double factorial', google translation) - - "⁄": [T: "murtoluvun vinoviiva"] # 0x2044 (en: 'divided by', google: 'jaettuna') # FI: check how this works in a sentence - - "⁅": [T: "piikillinen alkuhakasulku"] # 0x2045 (en: 'left square bracket with quill', google translation) - - "⁆": [T: "piikillinen loppuhakasulku"] # 0x2046 (en: 'right square bracket with quill', google translation) - - "⁗": [T: "neloispriimi"] # 0x2057 (en: 'quadruple prime', google: 'neljĂ€nneksen prime') # FI: maybe "pilkku pilkku pilkku pilkku" - - "⁠": [T: "rivinvaihdon esto"] # 0x2060 - - "⁰": [T: "potenssiin nolla"] # 0x2070 (en: 'to the zeroth power', google translation) - - "ⁱ": [T: "potenssiin i"] # 0x2071 (en: 'to the eihth power', google translation) - - "⁎": [T: "potenssiin neljĂ€"] # 0x2074 (en: 'to the fourth power', google translation) - - "⁔": [T: "potenssiin viisi"] # 0x2075 (en: 'to the fifth power', google translation) - - "⁶": [T: "potenssiin kuusi"] # 0x2076 (en: 'to the sixth power', google translation) - - "⁷": [T: "potenssiin seitsemĂ€n"] # 0x2077 (en: 'to the seventh power', google translation) - - "⁞": [T: "potenssiin kahdeksan"] # 0x2078 (en: 'to the eighth power', google translation) - - "âč": [T: "potenssiin yhdeksĂ€n"] # 0x2079 (en: 'to the ninth power', google translation) - - "âș": [T: "ylĂ€indeksi plus"] # 0x207a (en: 'superscript plus sign', google translation) - - "⁻": [T: "ylĂ€indeksi miinus"] # 0x207b (en: 'superscript minus', google translation) - - "⁌": [T: "ylĂ€indeksi on yhtĂ€ suuri kuin"] # 0x207c (en: 'superscript equals sign', google translation) - - "⁜": [T: "ylĂ€indeksi vasen sulku"] # 0x207d (en: 'superscript left parenthesis', google translation) - - " ": [T: "ylĂ€indeksi oikea sulku"] # 0x207e (en: 'superscript right parenthesis', google translation) - - "ⁿ": [T: "potenssiin n"] # 0x207f (en: 'to the ennth power', google translation) - - "₀": [T: "alaindeksi nolla"] # 0x2080 (en: 'sub zero', google translation) - - "₁": [T: "alaindeksi yksi"] # 0x2081 (en: 'sub one', google translation) - - "₂": [T: "alaindeksi kaksi"] # 0x2082 (en: 'sub two', google translation) - - "₃": [T: "alaindeksi kolme"] # 0x2083 (en: 'sub three', google translation) - - "₄": [T: "alaindeksi neljĂ€"] # 0x2084 (en: 'sub four', google translation) - - "₅": [T: "alaindeksi viisi"] # 0x2085 (google translation) - - "₆": [T: "alaindeksi kuusi"] # 0x2086 (google translation) - - "₇": [T: "alaindeksi seitsemĂ€n"] # 0x2087 (en: 'sub seven', google translation) - - "₈": [T: "alaindeksi kahdeksan"] # 0x2088 (en: 'sub eight', google translation) - - "₉": [T: "alaindeksi yhdeksĂ€n"] # 0x2089 (en: 'sub nine', google translation) - - "₊": [T: "alaindeksi plus"] # 0x208a (en: 'subscript plus sign', google translation) - - "₋": [T: "alaindeksi miinus"] # 0x208b (en: 'subscript minus sign', google translation) - - "₌": [T: "alaindeksi on yhtĂ€ suuri kuin"] # 0x208c (en: 'subscript equals sign', google translation) - - "₍": [T: "alaindeksi vasen sulku"] # 0x208d (en: 'subscript left parenthesis', google translation) - - "₎": [T: "alaindeksi oikea sulku"] # 0x208e (en: 'subscript right parenthesis', google translation) - - "ₐ": [T: "alaindeksi a"] # 0x2090 (en: 'sub A', google translation) - - "ₑ": [T: "alaindeksi e"] # 0x2091 (en: 'sub E', google translation) - - "ₒ": [T: "alaindeksi o"] # 0x2092 (en: 'sub O', google translation) - - "ₓ": [T: "alaindeksi x"] # 0x2093 (en: 'sub X', google translation) - - "ₕ": [T: "alaindeksi h"] # 0x2095 (en: 'sub H', google translation) - - "ₖ": [T: "alaindeksi k"] # 0x2096 (en: 'sub K', google translation) - - "ₗ": [T: "alaindeksi l"] # 0x2097 (en: 'sub L', google translation) - - "ₘ": [T: "alaindeksi m"] # 0x2098 (en: 'sub M', google translation) - - "ₙ": [T: "alaindeksi n"] # 0x2099 (en: 'sub N', google translation) - - "ₚ": [T: "alaindeksi p"] # 0x209a (en: 'sub P', google translation) - - "ₛ": [T: "alaindeksi s"] # 0x209b (en: 'sub S', google translation) - - "ₜ": [T: "alaindeksi t"] # 0x209c (en: 'sub T', google translation) - - "₠": [T: "eurooppalaiset valuuttayksiköt"] # 0x20a0 (en: 'european currenty units', google translation) - - "₡": [T: "colonia"] # 0x20a1 (en: 'colons', google: 'colons') - - "₱": [T: "cruzeiroa"] # 0x20a2 (en: 'cruzeiro', google: 'cruzeiro') - - "₣": [T: "frangia"] # 0x20a3 (en: 'franc', google: 'frangi') - - "â‚€": [T: "liiraa"] # 0x20a4 (en: 'lira', google: 'liira') - - "â‚„": [T: "milliĂ€"] # 0x20a5 (en: 'mills', google: 'myllyt') - - "₩": [T: "nairaa"] # 0x20a6 (en: 'naira', google: 'naira') - - "₧": [T: "pesetaa"] # 0x20a7 (en: 'peseta', google: 'peseta') - - "₹": [T: "rupiaa"] # 0x20a8 (en: 'rupees', google: 'rupia') - - "₩": [T: "wonia"] # 0x20a9 (en: 'won', google: 'voitti') - - "â‚Ș": [T: "sekeliĂ€"] # 0x20aa (en: 'new sheqels', google: 'uudet sheqels') - - "₫": [T: "dongia"] # 0x20ab (en: 'dong', google: 'dong') - - "€": [T: "euroa"] # 0x20ac (en: 'euros', google: 'eurot') - - "₭": [T: "kipia"] # 0x20ad (en: 'kip', google: 'kip') - - "₼": [T: "tugrikia"] # 0x20ae (en: 'tugrik', google: 'tugrik') - - "₯": [T: "drakhmaa"] # 0x20af (en: 'drachma', google: 'drachma') - - "₰": [T: "pfennigiĂ€"] # 0x20b0 (en: 'german pennies', google: 'saksalaiset penniĂ€') - - "₱": [T: "pesoa"] # 0x20b1 (en: 'pesos', google: 'pesot') - - "â‚Č": [T: "guarania"] # 0x20b2 (en: 'guaranis', google: 'guaranis') - - "₳": [T: "australia"] # 0x20b3 (en: 'australs', google: 'itĂ€valtait') - - "₮": [T: "hryvniaa"] # 0x20b4 (en: 'hryvnias', google: 'hryvnias') - - "â‚”": [T: "cediĂ€"] # 0x20b5 (en: 'cedis', google: 'cedis') - - "₶": [T: "Toursin livreĂ€"] # 0x20b6 (google translation) - - "₷": [T: "spesmiloa"] # 0x20b7 (google translation) - - "₾": [T: "tengeĂ€"] # 0x20b8 (google translation) - - "â‚č": [T: "intialainen rupiaa"] # 0x20b9 (en: 'indian rupees', google translation) - - "â‚ș": [T: "turkin liiraa"] # 0x20ba (en: 'turkish liras', google translation) - - "⃐": [T: "vasemmalle suuntautuva harppuuna"] # 0x20d0 (en: 'left harpoon above embellishment', google: 'vasen harppuon koristelun ylĂ€puolella') - - "⃑": [T: "oikealle suuntautuva harppuuna"] # 0x20d1 (en: 'right harpoon above embellishment', google: 'oikea harppuuna koristelun ylĂ€puolella') - - "⃒": [T: "pitkĂ€ yliviivauspystyviiva"] # 0x20d2 (en: 'long vertical line overlay embellishment', google translation) - - "⃓": [T: "lyhyt yliviivauspystyviiva"] # 0x20d3 (en: 'short vertical line overlay embellishment', google translation) - - "⃔": [T: "vastapĂ€ivĂ€inen ylĂ€nuoli"] # 0x20d4 (en: 'anticlockwise arrow above embellishment', google translation) - - "⃕": [T: "myötĂ€pĂ€ivĂ€inen ylĂ€nuoli"] # 0x20d5 (en: 'clockwise arrow above embellishment', google translation) - - "⃖": [T: "vasemmalle suuntautuva nuoli"] # 0x20d6 (en: 'left arrow above embellishment', google: 'vasen nuoli koristelun ylĂ€puolella') - - "⃗": [T: "oikealle suuntautuva nuoli"] # 0x20d7 (en: 'right arrow above embellishment', google: 'oikea nuoli koristelun ylĂ€puolella') - - "⃘": [T: "rengas pÀÀllĂ€"] # 0x20d8 (en: 'ring overlay embellishment', google translation) - - "⃙": [T: "rengas myötĂ€pĂ€ivÀÀn pÀÀllĂ€"] # 0x20d9 (en: 'clockwise ring overlay embellishment', google translation) - - "⃚": [T: "rengas vastapĂ€ivÀÀn pÀÀllĂ€"] # 0x20da (en: 'anticlockwise ring overlay embellishment', google translation) - - "⃛": [T: "kolmoispiste"] # 0x20db (en: 'triple dot', google: 'kolminkertainen piste') - - "⃜": [T: "nelinkertainen piste"] # 0x20dc (en: 'quadruple dot', google: 'nelinkertainen piste') - - "⃝": [T: "sulkeva ympyrĂ€"] # 0x20dd (en: 'enclosing circle embellishment', google translation) - - "⃞": [T: "sulkeva neliö"] # 0x20de (en: 'enclosing square embellishment', google translation) - - "⃟": [T: "sulkeva timantti"] # 0x20df (en: 'enclosing diamond embellishment', google translation) - - "⃠": [T: "sulkeva ympyrĂ€ kenoviivalla"] # 0x20e0 (en: 'enclosing circle backslash embellishment', google translation) - - "⃥": [T: "ylĂ€nuoli oikealle ja vasemmalle"] # 0x20e1 (en: 'left right arrow above embellishment', google: 'vasen oikea nuoli koristelun ylĂ€puolella') - - "⃹": [T: "sulkeva ruutu"] # 0x20e2 (en: 'enclosing screen embellishment', google translation) - - "⃣": [T: "sulkeva nĂ€ppĂ€in"] # 0x20e3 (en: 'enclosing keycap embellishment', google translation) - - "⃀": [T: "sulkeva kolmio ylöspĂ€in"] # 0x20e4 (en: 'enclosing upward pointing triangle embellishment', google translation) - - "⃄": [T: "kenoviiva pÀÀllĂ€"] # 0x20e5 (en: 'reverse solidus overlay embellishment', google translation) - - "⃊": [T: "kaksinkertainen vaakaviiva pÀÀllĂ€"] # 0x20e6 (en: 'double verticle stroke embellishment', google translation) - - "⃧": [T: "annuiteettisymboli"] # 0x20e7 (en: 'annuity symbol embellishment', google translation) - - "⃚": [T: "kolminkertainen alapiste"] # 0x20e8 (en: 'triple underdot', google translation) - - "⃩": [T: "leveĂ€ silta ylĂ€puolella"] # 0x20e9 (en: 'wide bridge above embellishment', google translation) - - "âƒȘ": [T: "vasen nuoli pÀÀllĂ€"] # 0x20ea (en: 'leftwards arrow overlay embellishment', google translation) - - "⃫": [T: "pitkĂ€ kaksinkertainen vinoviiva pÀÀllĂ€"] # 0x20eb (en: 'long double solidus overlay embellishment', google translation) - - "⃏": [T: "oikea alaharppuuna piikillĂ€"] # 0x20ec (en: 'rightwards harpoon with barb downwards embellishment', google translation) - - "⃭": [T: "vasen alaharppuuna piikillĂ€"] # 0x20ed (en: 'leftwards harpoon with barb downwards embellishment', google translation) - - "⃟": [T: "vasen alanuoli"] # 0x20ee (en: 'left arrow below embellishment', google translation) - - "⃯": [T: "oikea alanuoli"] # 0x20ef (en: 'right arrow below embellishment', google translation) - - "⃰": [T: "ylĂ€puolinen asteriski"] # 0x20f0 (en: 'asterisk above embellishment', google translation) - - "℄": [T: "keskiviivasymboli"] # 0x2104 (en: 'center line symbol', google translation) - - "℅": [T: "C O"] # 0x2105 (google: 'hoito') - - "℆": [T: "C U"] # 0x2106 (google translation) - - "ℇ": [T: "eulerin vakio"] # 0x2107 (en: 'euler's constant', google: 'eulerin jatkuva') # FI: more German pronunciation? - - "℈": [T: "scruple"] # 0x2108 (en: 'scruples', google translation) - - "℉": [T: "astetta fahrenheitia"] # 0x2109 (en: 'degrees fahrenheit', google: 'fahrenheit-astetta') # FI: more German pronunciation? - - "ℊ": [T: "pieni g"] # 0x210a (en: 'script g', google: 'kĂ€sikirjoitus g') - - "ℌℑℹℭ": # 0x210c, 0x2111, 0x2128, 0x212d - - T: "fraktuura" # (en: 'fraktur', google: 'fraktur') - - SPELL: "translate('.', 'ℌℑℹℭ', 'HIZC')" - - - "â„â„™â„Ÿâ„ż": # 0x210d, 0x2119, 0x213e, 0x213f - - test: - if: "$Verbosity!='Terse'" - then: [T: "kaksiviivainen"] # (en: 'double struck', google translation) - - SPELL: "translate('.', 'â„â„™â„Ÿâ„ż', 'HPΓΠ')" - - - "ℎ": [T: "planckin vakio"] # 0x210e (en: 'planck constant', google: 'planck constant') - - "ℏ": # 0x210f - - test: - if: "($Verbosity='Terse')" - then: [T: "h viiva"] # (google translation) - else: [T: "redusoitu Planckin vakio"] # (en: 'reduced planck constant', google: 'vĂ€hentynyt planck -vakio') - - - "â„â„’â„˜â„Źâ„°â„±â„ł": # 0x2110, 0x2112, 0x2118, 0x2130, 0x2131, 0x2133 - - T: "kauno" # (en: 'script', google: 'kĂ€sikirjoitus') - - SPELL: "translate('.', 'â„â„’â„˜â„Źâ„°â„±â„ł', 'ILPBEFM')" - - - "℔": [T: "paunaa"] # 0x2114 (en: 'pounds', google translation) - - "№": [T: "numero"] # 0x2116 (en: 'number', google: 'mÀÀrĂ€') - - "â„„": [T: "unssia"] # 0x2125 (en: 'ounces', google: 'unssi') - - "℩": [T: "ohmia"] # 0x2126 (en: 'ohms', google: 'ohmit') - - "℧": [T: "kÀÀnnetty ohmi"] # 0x2127 (en: 'mhos', google: 'mhos') - - "℩": [T: "kÀÀnnetty ioota"] # 0x2129 (en: 'turned iota', google: 'kÀÀntyi iota') - - "Å": [T: "Ă„ngströmiĂ€"] # 0x212b (en: 'angstroms', google: 'angstroms') - - "ℯ": [T: "kauno e"] # 0x212f (en: 'script e', google: 'kĂ€sikirjoitus e') - - # coalesced some chars that use cap letters - - "â„Čâ„ș⅁⅂⅃⅄": # 0x2132, 0x213a, 0x2141, 0x2142, 0x2143, 0x2144 - - test: - - if: "'.' = 'â„ș'" - then: [T: "kierretty"] # (en: 'rotated', google translation) - - else_if: "'.' = 'â„Č'" - then: [T: "kÀÀnnetty"] # (en: 'turned', google translation) - - else_if: "'.' = '⅃'" - then: [T: "kÀÀntynyt sans-serif"] # (en: 'reversed sans-serif', google translation) - else: [T: "kÀÀnnetty sans-serif"] # (en: 'turned sans-serif', google: 'kÀÀntyi sans-serif') - - SPELL: "translate('.', 'â„Čâ„ș⅁⅂⅃⅄', 'FQGLLY')" - - - "℮": [T: "kauno o"] # 0x2134 (en: 'script o', google: 'kĂ€sikirjoitus o') - - "â„”": [T: "alef"] # 0x2135 (en: 'first transfinite cardinal', google: 'ensimmĂ€inen transfinite kardinaali') - - "ℶ": [T: "bet"] # 0x2136 (en: 'second transfinite cardinal', google: 'toinen transfinite kardinaali') - - "ℷ": [T: "gimel"] # 0x2137 (en: 'third transfinite cardinal', google: 'kolmas transfinite kardinaali') - - "ℾ": [T: "dalet"] # 0x2138 (en: 'fourth transfinite cardinal', google: 'neljĂ€s transfinite kardinaali') - - "ℌ": [T: "kaksoisviivainen pii"] # 0x213c (en: 'double struck pi', google translation) - - "ℜ": [T: "kaksoisviivainen gamma"] # 0x213d (en: 'double struck gamma', google translation) - - "⅀": [T: "kaksoisviivainen sigma"] # 0x2140 (en: 'double struck n-ary summation', google translation) - - "⅋": [T: "kÀÀnnetty et-merkki"] # 0x214b (en: 'turned ampersand', google translation) - - "⅌": [T: "per"] # 0x214c (google translation) - - "ⅎ": [T: "kÀÀnnetty F"] # 0x214e (en: 'turned F', google translation) - - "⅐": [T: "yksi seitsemĂ€sosa"] # 0x2150 (en: 'one seventh', google translation) - - "⅑": [T: "yksi yhdeksĂ€sosa"] # 0x2151 (en: 'one ninth', google translation) - - "⅒": [T: "yksi kymmenesosa"] # 0x2152 (en: 'one tenth', google translation) - - "⅓": [T: "yksi kolmasosa"] # 0x2153 (en: 'one third', google: 'kolmasosa') - - "⅔": [T: "kaksi kolmasosaa"] # 0x2154 (en: 'two thirds') - - "⅕": [T: "yksi viidesosa"] # 0x2155 (en: 'one fifth', google: 'viidesosa') - - "⅖": [T: "kaksi viidesosaa"] # 0x2156 (en: 'two fifths') - - "⅗": [T: "kolme viidesosaa"] # 0x2157 (en: 'three fifths') - - "⅘": [T: "neljĂ€ viidesosaa"] # 0x2158 (en: 'four fifths') - - "⅙": [T: "yksi kuudesosa"] # 0x2159 (en: 'one sixth', google: 'kuudesosa') - - "⅚": [T: "viisi kuudesosaa"] # 0x215a (en: 'five sixths') - - "⅛": [T: "yksi kahdeksasosa"] # 0x215b (en: 'one eighth', google: 'yksi ath') - - "⅜": [T: "kolme kahdeksasosaa"] # 0x215c (en: 'three eighths', google: 'kolme aths') - - "⅝": [T: "viisi kahdeksasosaa"] # 0x215d (en: 'five eighths', google: 'viisi aths') - - "⅞": [T: "seitsemĂ€n kahdeksasosaa"] # 0x215e (en: 'seven eighths', google: 'seitsemĂ€n aths') - - "⅟": [T: "yksi per"] # 0x215f (en: 'one over', google translation) - - "Ⅰ": [T: "I"] # 0x2160 (en: 'I', google translation) - - "Ⅱ": [T: "I I"] # 0x2161 (en: 'I I', google translation) - - "ⅱ": [T: "I I I"] # 0x2162 (en: 'I I I', google translation) - - "Ⅳ": [T: "I V"] # 0x2163 (en: 'I V', google translation) - - "â…€": [T: "V"] # 0x2164 (en: 'V', google translation) - - "â…„": [T: "V I"] # 0x2165 (en: 'V I', google translation) - - "Ⅹ": [T: "V I I"] # 0x2166 (en: 'V I I', google translation) - - "Ⅷ": [T: "V I I I"] # 0x2167 (en: 'V I I I', google translation) - - "ⅹ": [T: "I X"] # 0x2168 (en: 'I X', google translation) - - "Ⅹ": [T: "X"] # 0x2169 (en: 'X', google translation) - - "â…Ș": [T: "X I"] # 0x216a (en: 'X I', google translation) - - "Ⅻ": [T: "X I I"] # 0x216b (en: 'X I I', google translation) - - "Ⅼ": [T: "L"] # 0x216c (en: 'L', google translation) - - "Ⅽ": [T: "C"] # 0x216d (en: 'C', google translation) - - "ⅼ": [T: "D"] # 0x216e (en: 'D', google translation) - - "Ⅿ": [T: "M"] # 0x216f (en: 'M', google translation) - - "ⅰ": [T: "i"] # 0x2170 (en: 'I', google translation) - - "ⅱ": [T: "i i"] # 0x2171 (en: 'I I', google translation) - - "â…Č": [T: "i i i"] # 0x2172 (en: 'I I I', google translation) - - "ⅳ": [T: "i v"] # 0x2173 (en: 'I V', google translation) - - "Ⅾ": [T: "Ⅾ"] # 0x2174 (en: 'V', google translation) - - "â…”": [T: "v i"] # 0x2175 (en: 'V I', google translation) - - "ⅶ": [T: "v i i"] # 0x2176 (en: 'V I I', google translation) - - "ⅷ": [T: "v i i i"] # 0x2177 (en: 'V I I I', google translation) - - "ⅾ": [T: "i x"] # 0x2178 (en: 'I X', google translation) - - "â…č": [T: "â…č"] # 0x2179 (en: 'X', google translation) - - "â…ș": [T: "x i"] # 0x217a (en: 'X I', google translation) - - "ⅻ": [T: "x i i"] # 0x217b (en: 'X I I', google translation) - - "â…Œ": [T: "â…Œ"] # 0x217c (en: 'L', google translation) - - "â…œ": [T: "â…œ"] # 0x217d (en: 'C', google translation) - - "â…Ÿ": [T: "â…Ÿ"] # 0x217e (en: 'D', google translation) - - "ⅿ": [T: "ⅿ"] # 0x217f (en: 'M', google translation) - - "↉": [T: "nolla kolmasosaa"] # 0x2189 (en: 'zero thirds', google translation) - - "←": [T: "nuoli vasemmalle"] # 0x2190 (en: 'leftwards arrow', google: 'vasen nuoli') - - "↑": [T: "nuoli ylös"] # 0x2191 (en: 'upwards arrow', google: 'ylöspĂ€in nuoli') - - "↓": [T: "nuoli alas"] # 0x2193 (en: 'downwards arrow', google: 'alaspĂ€in nuoli') - - "↔": [T: "nuoli vasemmalle ja oikealle"] # 0x2194 (en: 'left right arrow', google: 'vasen oikea nuoli') - - "↕": [T: "nuoli ylös ja alas"] # 0x2195 (en: 'up down arrow', google: 'ylöspĂ€in nuoli') - - "↖": [T: "luoteeseen osoittava nuoli"] # 0x2196 (en: 'north west arrow', google: 'luoteis -nuoli') - - "↗": # 0x2197 - - test: - if: "ancestor::*[2][self::m:limit]" - then: [T: "lĂ€hestyy alhaalta"] # (en: 'approaches from below', google translation) - else: [T: "koilliseen osoittava nuoli"] # (en: 'north east arrow', google: 'koillis -nuoli') - - - "↘": # 0x2198 - - test: - if: "ancestor::*[2][self::m:limit]" - then: [T: "lĂ€hestyy ylhÀÀltĂ€"] # (en: 'approaches from above', google translation) - else: [T: "kaakkoon osoittava nuoli"] # (en: 'south east arrow', google: 'kaakkois -nuoli') - - - "↙": [T: "lounaaseen osoittava nuoli"] # 0x2199 (en: 'south west arrow', google: 'lounais -nuoli') - - "↚": [T: "nuoli vasemmalle poikkiviivalla"] # 0x219a (en: 'leftwards arrow with stroke', google: 'vasen nuoli aivohalvauksella') - - "↛": [T: "nuoli oikealle poikkiviivalla"] # 0x219b (en: 'rightwards arrow with stroke', google: 'oikealla nuolella aivohalvauksella') - - "↜": [T: "aaltonuoli vasemmalle"] # 0x219c (en: 'leftwards wave arrow', google: 'vasen aalto nuoli') - - "↝": [T: "aaltonuoli oikealle"] # 0x219d (en: 'rightwards wave arrow', google: 'oikealla aalto nuoli') - - "↞": [T: "kaksipĂ€inen nuoli vasemmalle"] # 0x219e (en: 'leftwards two headed arrow', google: 'vasen kaksi pÀÀtĂ€ nuoli') - - "↟": [T: "kaksipĂ€inen nuoli ylös"] # 0x219f (en: 'upwards two headed arrow', google: 'ylöspĂ€in kaksi pÀÀistĂ€ nuolta') - - "↠": [T: "kaksipĂ€inen nuoli oikealle"] # 0x21a0 (en: 'rightwards two headed arrow', google: 'oikealle kaksi pÀÀistĂ€ nuolta') - - "↡": [T: "kaksipĂ€inen nuoli alas"] # 0x21a1 (en: 'downwards two headed arrow', google: 'alaspĂ€in kaksi pÀÀtĂ€ nuolta') - - "↱": [T: "vasen nuoli pyrstöllĂ€"] # 0x21a2 (en: 'leftwards arrow with tail', google: 'vasen nuoli hĂ€nnĂ€n kanssa') - - "↣": [T: "oikea nuoli pyrstöllĂ€"] # 0x21a3 (en: 'rightwards arrow with tail', google: 'oikealla nuolella hĂ€nnĂ€n kanssa') - - "ↀ": [T: "vasen nuoli palkista"] # 0x21a4 (en: 'leftwards arrow from bar', google: 'vasen nuoli baarista') - - "ↄ": [T: "ylöspĂ€in osoittava nuoli palkista"] # 0x21a5 (en: 'upwards arrow from bar', google: 'nuoli ylöspĂ€in baarista') - - "↩": [T: "oikea nuoli palkista"] # 0x21a6 (en: 'rightwards arrow from bar', google: 'oikein nuoli baarista') - - "↧": [T: "alaspĂ€in osoittava nuoli palkista"] # 0x21a7 (en: 'downwards arrow from bar', google: 'alaspĂ€in nuoli baarista') - - "↹": [T: "ylös ja alas osoittava nuoli palkista"] # 0x21a8 (en: 'up down arrow with base', google: 'ylös nuoli pohjassa') - - "↩": [T: "vasen nuoli koukulla"] # 0x21a9 (en: 'leftwards arrow with hook', google: 'vasen nuoli koukussa') - - "â†Ș": [T: "oikea nuoli koukulla"] # 0x21aa (en: 'rightwards arrow with hook', google: 'oikealla nuolella koukkulla') - - "↫": [T: "vasen nuoli silmukalla"] # 0x21ab (en: 'leftwards arrow with loop', google: 'vasen nuoli silmukka') - - "↬": [T: "oikea nuoli silmukalla"] # 0x21ac (en: 'rightwards arrow with loop', google: 'oikea nuoli silmukka') - - "↭": [T: "aaltonuoli oikealle ja vasemmalle"] # 0x21ad (en: 'left right wave arrow', google: 'vasen oikea aalto nuoli') - - "↼": [T: "nuoli oikealle ja vasemmalle poikkiviivalla"] # 0x21ae (en: 'left right arrow with stroke', google: 'vasen oikea nuoli aivohalvauksella') - - "↯": [T: "siksaknuoli alas"] # 0x21af (en: 'downwards zigzag arrow', google: 'alaspĂ€in zigzag -nuoli') - - "↰": [T: "nuoli ylös ja kĂ€rki vasemmalle"] # 0x21b0 (en: 'upwards arrow with tip leftwards', google: 'ylöspĂ€in nuoli vasemmalla kĂ€rkillĂ€') - - "↱": [T: "nuoli ylös ja kĂ€rki oikealle"] # 0x21b1 (en: 'upwards arrow with tip rightwards', google: 'ylöspĂ€in nuoli, joka on kĂ€rki oikealla') - - "â†Č": [T: "nuoli alas ja kĂ€rki vasemmalle"] # 0x21b2 (en: 'downwards arrow with tip leftwards', google: 'alaspĂ€in nuoli vasemmalla kĂ€rkillĂ€') - - "↳": [T: "nuoli alas ja kĂ€rki oikealle"] # 0x21b3 (en: 'downwards arrow with tip rightwards', google: 'alaspĂ€in nuoli kĂ€rjen oikealla puolella') - - "↮": [T: "nuoli oikealle ja kulma alas"] # 0x21b4 (en: 'rightwards arrow with corner downwards', google: 'oikealla nuolella nurkkaan alaspĂ€in') - - "↔": [T: "nuoli alas ja kulma oikealle"] # 0x21b5 (en: 'downwards arrow with corner leftwards', google: 'alaspĂ€in nuoli vasemmalla kulmassa') - - "↶": [T: "ylĂ€puoliympyrĂ€nuoli vastapĂ€ivÀÀn"] # 0x21b6 (en: 'anticlockwise top semicircle arrow', google: 'vastapĂ€ivÀÀn puolipyöriin nuoli') - - "↷": [T: "ylĂ€puoliympyrĂ€nuoli myötĂ€pĂ€ivÀÀn"] # 0x21b7 (en: 'clockwise top semicircle arrow', google: 'myötĂ€pĂ€ivÀÀn puolipyöriin nuoli') - - "↾": [T: "nuoli ylĂ€vasemmalle pitkÀÀn viivaan"] # 0x21b8 (en: 'north west arrow to long bar', google: 'luoteis -nuoli pitkÀÀn baariin') - - "â†č": [T: "nuoli oikealle ja vasemmalle palkkiin"] # 0x21b9 (en: 'leftwards arrow to bar over rightwards arrow to bar', google: 'vasen nuoli baariin oikeanpuoleisen nuolen yli baariin') - - "â†ș": [T: "vastapĂ€ivĂ€inen avoimen ympyrĂ€n nuoli"] # 0x21ba (en: 'anticlockwise open circle arrow', google: 'vastapĂ€ivÀÀn avoin ympyrĂ€ nuoli') - - "↻": [T: "myötĂ€pĂ€ivĂ€inen avoimen ympyrĂ€n nuoli"] # 0x21bb (en: 'clockwise open circle arrow', google: 'myötĂ€pĂ€ivÀÀn avoin ympyrĂ€ nuoli') - - "↌": [T: "puolinuoli vasemmalle vĂ€kĂ€ ylös"] # 0x21bc (en: 'left harpoon up', google: 'vasen harppuon ylös') - - "↜": [T: "puolinuoli vasemmalle vĂ€kĂ€ alas"] # 0x21bd (en: 'left harpoon down', google: 'vasen harppuon alas') - - "↟": [T: "puolinuoli ylös vĂ€kĂ€ oikealle"] # 0x21be (en: 'up harpoon right', google: 'up harpoon oikeassa') - - "↿": [T: "puolinuoli ylös vĂ€kĂ€ vasemmalle"] # 0x21bf (en: 'up harpoon left', google: 'up harpoon vasemmalle') - - "⇀": [T: "puolinuoli oikealle vĂ€kĂ€ ylös"] # 0x21c0 (en: 'right harpoon up', google: 'oikea harppuun') - - "⇁": [T: "puolinuoli oikealle vĂ€kĂ€ alas"] # 0x21c1 (en: 'right harpoon down', google: 'oikea harppuuna alas') - - "⇂": [T: "puolinuoli alas vĂ€kĂ€ oikealle"] # 0x21c2 (en: 'down harpoon right', google: 'alas harppuon oikealla') - - "⇃": [T: "puolinuoli alas vĂ€kĂ€ vasemmalle"] # 0x21c3 (en: 'down harpoon left', google: 'alas harppuun vasemmalle') - - "⇄": [T: "oikealle ja vasemmalle osoittavien nuolien pari"] # 0x21c4 (en: 'rightwards arrow over leftwards arrow', google: 'oikealla nuolella vasemmanpuoleisen nuolen yli') - - "⇅": [T: "ylös ja alas osoittavien nuolien pari"] # 0x21c5 (en: 'upwards arrow leftwards of downwards arrow', google: 'ylöspĂ€in nuoli vasemmalle alaspĂ€in nuolesta') - - "⇆": [T: "vasemmalle ja oikealle osoittavien nuolien pari"] # 0x21c6 (en: 'leftwards arrow over rightwards arrow', google: 'vasen nuoli oikealla nuolella') - - "⇇": [T: "nuolipari vasemmalle"] # 0x21c7 (en: 'leftwards paired arrows', google: 'vasen parit nuolet') - - "⇈": [T: "nuolipari ylös"] # 0x21c8 (en: 'upwards paired arrows', google: 'ylöspĂ€in parilliset nuolet') - - "⇉": [T: "nuolipari oikealle"] # 0x21c9 (en: 'rightwards paired arrows', google: 'oikealla puolella nuolet') - - "⇊": [T: "nuolipari alas"] # 0x21ca (en: 'downwards paired arrows', google: 'alaspĂ€in parit nuolet') - - "⇋": [T: "puolinuolipari vasemmalle ja oikealle"] # 0x21cb (en: 'left harpoon over right harpoon', google: 'vasen harpoon oikean harppuunin yli') - - "⇌": [T: "puolinuolipari oikealle ja vasemmalle"] # 0x21cc (en: 'right harpoon over left harpoon', google: 'oikea harppuuna vasemman harppuunin yli') - - "⇍": [T: "kaksiviivainen nuoli vasemmalle poikkiviivalla"] # 0x21cd (en: 'leftwards double arrow with stroke', google: 'vasen kaksinkertainen nuoli aivohalvauksella') - - "⇎": [T: "kaksiviivainen nuoli vasemmalle ja oikealle poikkiviivalla"] # 0x21ce (en: 'left right double arrow with stroke', google: 'vasen oikea kaksinkertainen nuoli aivohalvauksella') - - "⇏": [T: "kaksiviivainen nuoli oikealle poikkiviivalla"] # 0x21cf (en: 'rightwards double arrow with stroke', google: 'oikeasti kaksinkertainen nuoli aivohalvauksella') - - "⇐": [T: "vasemmalle osoittava kaksoisnuoli"] # 0x21d0 (en: 'leftwards double arrow', google: 'vasen kaksinkertainen nuoli') - - "⇑": [T: "ylös osoittava kaksoisnuoli"] # 0x21d1 (en: 'upwards double arrow', google: 'ylöspĂ€in kaksoisnuoli') - - "⇓": [T: "alas osoittava kaksoisnuoli"] # 0x21d3 (en: 'downwards double arrow', google: 'alaspĂ€in kaksinkertainen nuoli') - - "⇔": [T: "vasemmalle ja oikealle osoittava kaksoisnuoli"] # 0x21d4 (en: 'left right double arrow', google: 'vasen oikea kaksinkertainen nuoli') - - "⇕": [T: "ylös ja alas osoittava kaksoisnuoli"] # 0x21d5 (en: 'up down double arrow', google: 'ylös alas kaksinkertainen nuoli') - - "⇖": [T: "luoteeseen osoittava kaksoisnuoli"] # 0x21d6 (en: 'north west double arrow', google: 'luoteisosan kaksinkertainen nuoli') - - "⇗": [T: "koilliseen osoittava kaksoisnuoli"] # 0x21d7 (en: 'north east double arrow', google: 'koillis -kaksinkertainen nuoli') - - "⇘": [T: "kaakkoon osoittava kaksoisnuoli"] # 0x21d8 (en: 'south east double arrow', google: 'kaakkois -kaksinkertainen nuoli') - - "⇙": [T: "luoteeseen osoittava kaksoisnuoli"] # 0x21d9 (en: 'south west double arrow', google: 'lounais -kaksinkertainen nuoli') - - "⇚": [T: "kolmiviivainen nuoli vasemmalle"] # 0x21da (en: 'leftwards triple arrow', google: 'vasen kolminkertainen nuoli') - - "⇛": [T: "kolmiviivainen nuoli oikealle"] # 0x21db (en: 'rightwards triple arrow', google: 'oikealle kolminkertainen nuoli') - - "⇜": [T: "kiemuranuoli vasemmalle"] # 0x21dc (en: 'leftwards squiggle arrow', google: 'vasen nuoli') - - "⇝": [T: "kiemuranuoli oikealle"] # 0x21dd (en: 'rightwards squiggle arrow', google: 'oikealla puolella nuoli') - - "⇞": [T: "nuoli ylös kaksoispoikkiviivalla"] # 0x21de (en: 'upwards arrow with double stroke', google: 'ylöspĂ€in nuoli kaksinkertaisella iskulla') - - "⇟": [T: "nuoli alas kaksoispoikkiviivalla"] # 0x21df (en: 'downwards arrow with double stroke', google: 'alaspĂ€in nuoli kaksinkertaisella iskulla') - - "⇠": [T: "katkoviivanuoli vasemmalle"] # 0x21e0 (en: 'leftwards dashed arrow', google: 'vasen katkoviiva nuoli') - - "⇡": [T: "katkoviivanuoli ylös"] # 0x21e1 (en: 'upwards dashed arrow', google: 'ylöspĂ€in katkoviiva nuoli') - - "⇱": [T: "katkoviivanuoli oikealle"] # 0x21e2 (en: 'rightwards dashed arrow', google: 'oikealla katkoviivalla nuolella') - - "⇣": [T: "katkoviivanuoli alas"] # 0x21e3 (en: 'downwards dashed arrow', google: 'alaspĂ€in katkoviiva nuoli') - - "⇀": [T: "nuoli vasemmalle viivaan"] # 0x21e4 (en: 'leftwards arrow to bar', google: 'vasen nuoli baariin') - - "⇄": [T: "nuoli oikealle viivaan"] # 0x21e5 (en: 'rightwards arrow to bar', google: 'oikein nuoli baariin') - - "⇩": [T: "vasemmalle osoittava valkea nuoli"] # 0x21e6 (en: 'leftwards white arrow', google: 'vasen valkoinen nuoli') - - "⇧": [T: "ylös osoittava valkea nuoli"] # 0x21e7 (en: 'upwards white arrow', google: 'ylöspĂ€in valkoinen nuoli') - - "⇹": [T: "oikealle osoittava valkea nuoli"] # 0x21e8 (en: 'rightwards white arrow', google: 'oikealle valkoinen nuoli') - - "⇩": [T: "alas osoittava valkea nuoli"] # 0x21e9 (en: 'downwards white arrow', google: 'alaspĂ€in valkoinen nuoli') - - "â‡Ș": [T: "palkista ylös osoittava valkea nuoli"] # 0x21ea (en: 'upwards white arrow from bar', google: 'ylöspĂ€in valkoinen nuoli baarista') - - "⇫": [T: "valkoinen nuoli ylös jalustalla"] # 0x21eb (en: 'upwards white arrow on pedestal', google translation) - - "⇬": [T: "valkoinen nuoli ylös jalustalla ja vaakasuoralla palkilla"] # 0x21ec (en: 'upwards white arrow on pedestal with horizontal bar', google translation) - - "⇭": [T: "valkoinen nuoli ylös jalustalla ja pystysuoralla palkilla"] # 0x21ed (en: 'upwards white arrow on pedestal with vertical bar', google translation) - - "⇼": [T: "valkoinen kaksinkertainen nuoli ylös"] # 0x21ee (en: 'upwards white double arrow', google translation) - - "⇯": [T: "valkoinen kaksinkertainen nuoli ylös jalustalla"] # 0x21ef (en: 'upwards white double arrow on pedestal', google translation) - - "⇰": [T: "valkoinen nuoli oikealle seinĂ€stĂ€"] # 0x21f0 (en: 'rightwards white arrow from wall', google translation) - - "⇱": [T: "ylĂ€vasemmalle osoittava nuoli nurkkaan"] # 0x21f1 (en: 'north west arrow to corner', google translation) - - "â‡Č": [T: "alaoikealle osoittava nuoli nurkkaan"] # 0x21f2 (en: 'south east arrow to corner', google translation) - - "⇳": [T: "ylös ja alas osoittava valkoinen nuoli"] # 0x21f3 (en: 'up down white arrow', google translation) - - "⇮": [T: "oikea nuoli pienellĂ€ ympyrĂ€llĂ€"] # 0x21f4 (en: 'right arrow with small circle', google translation) - - "⇔": [T: "alas ja ylös osoittavat nuolet"] # 0x21f5 (en: 'downwards arrow leftwards of upwards arrow', google: 'alaspĂ€in nuoli ylöspĂ€in ylöspĂ€in nuolesta') - - "⇶": [T: "kolmoisnuoli oikealle"] # 0x21f6 (en: 'three rightwards arrows', google translation) - - "⇷": [T: "vasen nuoli pystysuoralla viivalla"] # 0x21f7 (en: 'leftwards arrow with vertical stroke', google translation) - - "⇾": [T: "oikea nuoli pystysuoralla viivalla"] # 0x21f8 (en: 'rightwards arrow with vertical stroke', google translation) - - "â‡č": [T: "vasemmalle ja oikealle osoittava nuoli pystysuoralla viivalla"] # 0x21f9 (en: 'left right arrow with vertical stroke', google translation) - - "â‡ș": [T: "vasen nuoli kaksinkertaisella pystysuoralla viivalla"] # 0x21fa (en: 'leftwards arrow with double vertical stroke', google translation) - - "⇻": [T: "oikea nuoli kaksinkertaisella pystysuoralla viivalla"] # 0x21fb (en: 'rightwards arrow with double vertical stroke', google translation) - - "⇌": [T: "vasemmalle ja oikealle osoittava nuoli kaksinkertaisella pystysuoralla viivalla"] # 0x21fc (en: 'left right arrow with double vertical stroke', google translation) - - "⇜": [T: "vasen avoin nuoli"] # 0x21fd (en: 'leftwards open headed arrow', google: 'vasen auki pÀÀ nuoli') - - "⇟": [T: "oikea avoin nuoli"] # 0x21fe (en: 'rightwards open headed arrow', google: 'oikea avaa pÀÀn nutrow') - - "⇿": [T: "oikealle ja vasemmalle osoittava avoin nuoli"] # 0x21ff (en: 'left right open headed arrow', google: 'vasen oikeaa auki nuoli') - - "∁": # 0x2201 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (google translation) - - T: "komplementti" # (en: 'complement of', google: 'tĂ€ydennys') - - "∃": [T: "on olemassa"] # 0x2203 (en: 'there exists') - - "∄": [T: "ei ole olemassa"] # 0x2204 (en: 'there does not exist', google: 'ei ole') - - "∅": [T: "tyhjĂ€ joukko"] # 0x2205 (en: 'empty set', google: 'tyhjĂ€ sarja') - - "∇": # 0x2207 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (google translation) - - T: "nabla" # (en: 'gradient of', google: 'gradientti') - - "∋": [T: "sisĂ€ltÀÀ alkion"] # 0x220b (en: 'contains the member', google: 'sisĂ€ltÀÀ jĂ€senen') - - "∌": [T: "ei sisĂ€llĂ€ alkiota"] # 0x220c (en: 'does not contain the member', google: 'ei sisĂ€llĂ€ jĂ€sentĂ€') - - "∍": [T: "sisĂ€ltÀÀ pienen alkion"] # 0x220d (en: 'contains the member', google: 'sisĂ€ltÀÀ jĂ€senen') - - "∎": [T: "todistuksen loppu"] # 0x220e (en: 'end of proof', google: 'todistuksen loppu') - - "∏": [T: "tulo"] # 0x220f (en: 'product', google: 'tuote') - - "∐": [T: "kotulo"] # 0x2210 (google: 'kopiointi') - - "∑": [T: "summa"] # 0x2211 (en: 'sum') - - "−": [T: "miinus"] # 0x2212 (en: 'minus') - - "∓": [T: "miinus-plus"] # 0x2213 (en: 'minus or plus') # FI: check how the hyphen behaves - - "∔": [T: "piste-plus"] # 0x2214 (en: 'dot plus', google: 'dot plus') # FI: check how the hyphen behaves - - "∕": [T: "jakoviiva"] # 0x2215 (en: 'divided by', google: 'jaettuna') - - "∖": [T: "joukkomiinus"] # 0x2216 (en: 'set minus', google: 'aseta miinus') - - "∗": [T: "kertaa"] # 0x2217 (en: 'times', google: 'ajat') - - "∙": # 0x2219 - - test: - if: "@data-chem-formula-op" - then: [T: "piste"] # (en: 'dot', google translation) - else: [T: "kertaa"] # (en: 'times', google: 'ajat') - - - "∛": # 0x221b - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (google translation) - - T: "kuutiojuuri" # (en: 'cube root of') - - "∜": # 0x221c - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (google translation) - - T: "neljĂ€s juuri" # (en: 'fourth root of') - - "∞": [T: "ÀÀretön"] # 0x221e (en: 'infinity') - - "∟": [T: "suora kulma"] # 0x221f (en: 'right angle', google: 'oikea kulma') - - "∠": [T: "kulma"] # 0x2220 (en: 'angle') - - "∥": [T: "mitattu kulma"] # 0x2221 (en: 'measured angle') - - "∹": [T: "kaarellinen kulma"] # 0x2222 (en: 'spherical angle', google: 'pallomainen kulma') - - "∣": [T: "jakaa"] # 0x2223 (en: 'divides') - - "∀": [T: "ei jaa"] # 0x2224 (en: 'does not divide') - - "∩": [T: "leikkaus"] # 0x2229 (en: 'intersection', google: 'risteys') - - "∫": [T: "integraali"] # 0x222b (en: 'integral', google: 'olennainen') - - "∏": [T: "kaksoisintegraali"] # 0x222c (en: 'double integral', google: 'kaksinkertainen integraali') - - "∭": [T: "kolmoisintegraali"] # 0x222d (en: 'triple integral', google: 'kolminkertainen integraali') - - "∯": [T: "pintaintegraali"] # 0x222f (en: 'surface integral', google: 'pinta -integraali') - - "∰": [T: "tilavuusintegraali"] # 0x2230 (en: 'volume integral', google: 'volyymin integraali') - - "∱": [T: "integraali myötĂ€pĂ€ivÀÀn"] # 0x2231 (en: 'clockwise integral', google: 'myötĂ€pĂ€ivÀÀn olennainen') - - "âˆČ": [T: "polkuintegraali myötĂ€pĂ€ivÀÀn"] # 0x2232 (en: 'clockwise contour integral', google: 'myötĂ€pĂ€ivÀÀn ÀÀriviivat') - - "∳": [T: "polkuintegraali vastapĂ€ivÀÀn"] # 0x2233 (en: 'anticlockwise contour integral', google: 'vastapĂ€ivÀÀn ÀÀriviivat') - - "∎": [T: "siis"] # 0x2234 (en: 'therefore', google: 'siksi') - - "∔": [T: "koska"] # 0x2235 (en: 'because') - - "∞": [T: "piste-miinus"] # 0x2238 (en: 'dot minus') - - "âˆč": [T: "ylitys"] # 0x2239 (en: 'has excess compared to', google: 'on ylimÀÀrĂ€inen verrattuna') - - "âˆș": # 0x223a - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "geometrisesti verrannollinen" # (en: 'geometrically proportional to', google: 'geometrisesti verrannollinen') # FI: "geometrisesti verranollinen"? - - "∻": # 0x223b - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "homoteettinen" # (en: 'homothetic to', google: 'homotetiikka') - - "≀": [T: "punostulo"] # 0x2240 (en: 'wreath product', google: 'seppele tuote') - - "≁": [T: "ei tilde"] # 0x2241 (en: 'not tilde') - - "≂": [T: "miinus-tilde"] # 0x2242 (en: 'minus tilde') - - "≃": # 0x2243 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "asymptoottisesti yhtĂ€ suuri kuin" # (en: 'asymptotically equal to', google: 'asymptoottisesti yhtĂ€ suuri kuin') - - "≄": # 0x2244 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei asymptoottisesti yhtĂ€suuri kuin" # (en: 'not asymptotically equal to', google: 'ei asymptoottisesti yhtĂ€ suuri kuin') - - "≅": # 0x2245 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "likimÀÀrin yhtĂ€ suuri kuin" # (en: 'approximately equal to', google: 'suunnilleen yhtĂ€ suuri kuin') - - "≆": # 0x2246 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "likimÀÀrin mutta ei yhtĂ€ suuri kuin" # (en: 'approximately but not actually equal to', google: 'suunnilleen, mutta ei oikeastaan yhtĂ€ suuri kuin') - - "≇": # 0x2247 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei likimÀÀrin eikĂ€ yhtĂ€ suuri kuin" # (en: 'neither approximately nor actually equal to', google: 'ei suunnilleen eikĂ€ oikeastaan yhtĂ€ suuri kuin') - - "≈": # 0x2248 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "likimÀÀrin yhtĂ€ suuri kuin" # (en: 'almost equal to', google: 'melkein yhtĂ€ suuri kuin') - - "≉": # 0x2249 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei likimÀÀrin yhtĂ€ suuri kuin" # (en: 'not almost equal to', google: 'ei melkein yhtĂ€ suuri kuin') - - "≊": # 0x224a - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "lĂ€hes tai tasan yhtĂ€ suuri kuin" # (en: 'almost equal or equal to', google: 'melkein yhtĂ€ suuri tai yhtĂ€ suuri kuin') - - "≋": [T: "kolmoistilde"] # 0x224b (en: 'triple tilde', google: 'kolminkertainen tilde') - - "≌": [T: "kaikki yhtĂ€suuria kuin"] # 0x224c (en: 'are all equal to', google: 'ovat kaikki yhtĂ€ suuret kuin') - - "≍": # 0x224d - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "yhtĂ€pitĂ€vĂ€" # (en: 'equivalent to', google: 'vastaa') - - "≎": # 0x224e - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "geometrisesti yhtĂ€pitĂ€vĂ€" # (en: 'geometrically equivalent to', google: 'geometrisesti vastaavat') - - "≏": # 0x224f - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (google translation) - - T: "ero vĂ€lillĂ€" # (en: 'difference between', google: 'ero vĂ€lillĂ€') - - "≐": [T: "lĂ€hestyy raja-arvoa"] # 0x2250 (en: 'approaches the limit') - - "≑": # 0x2251 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "geometrisesti yhtĂ€ kuin" # (en: 'geometrically equal to', google: 'geometrisesti yhtĂ€ suuri kuin') - - "≒": # 0x2252 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "likimÀÀrin yhtĂ€ suuri kuin tai kohteen kuva" # (google: 'suunnilleen yhtĂ€ suuri tai kuva') - - "≓": # 0x2253 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is the', google translation) - - T: "kohteen kuva tai likimÀÀrin yhtĂ€ suuri kuin" # (google: 'kuva tai suunnilleen yhtĂ€ suuri kuin') - - "≔": [T: "kaksoispiste yhtĂ€ suuri kuin"] # 0x2254 (en: 'colon equals', google: 'colol -eaksi') - - "≕": [T: "yhtĂ€ suuri kuin kaksoispiste"] # 0x2255 (en: 'equals colon', google: 'vastaa kaksoispistettĂ€') - - "≖": [T: "ympyrĂ€n sisĂ€ltĂ€vĂ€ yhtĂ€lĂ€isyys"] # 0x2256 (en: 'ring in equal to', google: 'rengas yhtĂ€ suuri kuin') - - "≗": # 0x2257 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "ympyrĂ€ yhtĂ€ suuri kuin" # (en: 'approximately equal to', google: 'suunnilleen yhtĂ€ suuri kuin') - - "≘": [T: "kaari yhtĂ€ suuri kuin"] # 0x2258 (en: 'corresponds to', google: 'vastaa') - - "≙": [T: "vastaa"] # 0x2259 (en: 'estimates', google: 'arviot') - - "≚": # 0x225a - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "samakulmainen kuin" # (en: 'equiangular to', google: 'tasa -arvoinen') - - "≛": [T: "tĂ€hti yhtĂ€ suuri kuin"] # 0x225b (en: 'star equals', google: 'tĂ€hti on yhtĂ€ suuri kuin') - - "≜": [T: "delta yhtĂ€ suuri kuin"] # 0x225c (en: 'delta equals', google: 'delta on tasa -arvoinen') - - "≝": [T: "mÀÀritelmĂ€n mukaan yhtĂ€ kuin"] # 0x225d (en: 'is defined to be', google: 'on mÀÀritelty olevan') - - "≞": # 0x225e - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "mitatusti yhtĂ€ suuri kuin" # (en: 'measured by', google: 'mitattu') - - "≟": [T: "kyseenalaisesti yhtĂ€ kuin"] # 0x225f (en: 'has an unknown relationship with', google: 'on tuntematon suhde') - - "≱": # 0x2262 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "identtisesti eri kuin" # (en: 'not identical to', google: 'ei identtinen') - - "≣": # 0x2263 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "vahvasti ekvivalentti" # (en: 'strictly equivalent to', google: 'tiukasti vastaa') - - "≹": # 0x2268 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "pienempi mutta ei yhtĂ€ suuri kuin" # (en: 'less than but not equal to', google: 'vĂ€hemmĂ€n kuin, mutta ei yhtĂ€ suuri kuin') - - "≩": # 0x2269 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "suurempi mutta ei yhtĂ€ suuri kuin" # (en: 'greater than but not equal to', google: 'suurempi kuin, mutta ei yhtĂ€ suuri kuin') - - "â‰Ș": # 0x226a - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "paljon pienempi kuin" # (en: 'much less than', google: 'paljon vĂ€hemmĂ€n kuin') - - "≫": # 0x226b - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "paljon suurempi kuin" # (en: 'much greater than') - - "≬": # 0x226c - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "vĂ€lissĂ€" # (en: 'between', google: 'vĂ€lillĂ€') - - "≭": # 0x226d - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei yhtĂ€pitĂ€vĂ€" # (en: 'not equivalent to', google: 'ei vastaa') - - "≼": # 0x226e - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei aidosti pienempi kuin" # (en: 'not less than', google: 'ei vĂ€hempÀÀ kuin') - - "≯": # 0x226f - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei aidosti suurempi kuin" # (en: 'not greater than', google: 'enintÀÀn') - - "≰": # 0x2270 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei pienempi eikĂ€ yhtĂ€suuri kuin" # (en: 'neither less than nor equal to', google: 'ei vĂ€hemmĂ€n kuin yhtĂ€ suuri kuin') - - "≱": # 0x2271 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei suurempi eikĂ€ yhtĂ€suuri kuin" # (en: 'neither greater than nor equal to', google: 'ei suurempi kuin yhtĂ€ suuri kuin') - - "â‰Č": # 0x2272 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "pienempi tai yhtĂ€pitĂ€vĂ€" # (en: 'less than or equivalent to', google: 'vĂ€hemmĂ€n tai vastaavat') - - "≳": # 0x2273 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "suurempi tai yhtĂ€pitĂ€vĂ€" # (en: 'greater than or equivalent to', google: 'suurempi tai vastaa') - - "≮": # 0x2274 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei pienempi eikĂ€ yhtĂ€pitĂ€vĂ€" # (en: 'neither less than nor equivalent to', google: 'ei vĂ€hemmĂ€n kuin vastaa') - - "≔": # 0x2275 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei suurempi eikĂ€ yhtĂ€pitĂ€vĂ€" # (en: 'neither greater than nor equivalent to', google: 'ei suurempi kuin vastaava') - - "≶": # 0x2276 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "aidosti pienempi tai suurempi kuin" # (en: 'less than or greater than', google: 'vĂ€hemmĂ€n tai suurempi kuin') - - "≷": # 0x2277 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "aidosti suurempi tai pienempi kuin" # (en: 'greater than or less than', google: 'suurempi tai vĂ€hemmĂ€n kuin') - - "≾": # 0x2278 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei aidosti pienempi eikĂ€ suurempi kuin" # (en: 'neither less than nor greater than', google: 'ei vĂ€hemmĂ€n kuin suurempi kuin') - - "â‰č": # 0x2279 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei aidosti suurempi eikĂ€ pienempi kuin" # (en: 'neither greater than nor less than', google: 'ei suurempi kuin vĂ€hemmĂ€n kuin') - - "â‰ș": [T: "edeltÀÀ"] # 0x227a (en: 'precedes') - - "≻": [T: "seuraa"] # 0x227b (en: 'succeeds', google: 'onnistuu') - - "≌": [T: "edeltÀÀ tai on yhtĂ€ kuin"] # 0x227c (en: 'precedes or is equal to', google: 'edeltÀÀ tai on yhtĂ€ suuri kuin') - - "≜": [T: "seuraa tai on yhtĂ€ kuin"] # 0x227d (en: 'succeeds or is equal to', google: 'onnistuu tai on yhtĂ€ suuri') - - "≟": [T: "edeltÀÀ tai on yhtĂ€pitĂ€vĂ€"] # 0x227e (en: 'precedes or is equivalent to', google: 'edeltÀÀ tai vastaa') - - "≿": [T: "seuraa tai on yhtĂ€pitĂ€vĂ€"] # 0x227f (en: 'succeeds or is equivalent to', google: 'onnistuu tai vastaa') - - "⊀": [T: "ei edellĂ€"] # 0x2280 (en: 'does not precede', google: 'ei edeltĂ€') - - "⊁": [T: "ei seuraa"] # 0x2281 (en: 'does not succeed', google: 'ei onnistu') - - "⊈": # 0x2288 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei osajoukko eikĂ€ yhtĂ€ kuin" # (en: 'neither a subset of nor equal to', google: 'ei alajoukko eikĂ€ yhtĂ€ suuri kuin') - - "⊉": # 0x2289 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei sisĂ€llĂ€ osajoukkoa eikĂ€ yhtĂ€ kuin" # (en: 'neither a superset of nor equal to', google: 'ei ylenmÀÀrĂ€inen eikĂ€ yhtĂ€ suuri kuin') - - "⊊": [T: "on aito osajoukko"] # 0x228a (en: 'subset of with not equal to', google: 'osajoukko, joka ei ole yhtĂ€ suuri kuin') - - "⊋": [T: "sisĂ€ltÀÀ aidon osajoukon"] # 0x228b (en: 'superset of with not equal to', google: 'superset of with ei ole yhtĂ€ suuri kuin') - - "⊌": [T: "monijoukko"] # 0x228c (en: 'multiset', google: 'multiset') - - "⊍": [T: "monijoukkojen kerto"] # 0x228d (en: 'multiset multiplication', google: 'multiset -kertolasku') - - "⊎": [T: "monijoukkojen unioni"] # 0x228e (en: 'multiset union', google: 'multiset union') - - "⊏": [T: "kulmikas relaatio"] # 0x228f (en: 'square image of', google: 'neliökuva') - - "⊐": [T: "kÀÀnteinen kulmikas relaatio"] # 0x2290 (en: 'square original of', google: 'neliön alkuperĂ€inen') - - "⊑": [T: "kulmikas relaatio tai yhtĂ€ kuin"] # 0x2291 (en: 'square image of or equal to', google: 'neliökuva tai yhtĂ€ suuri kuin') - - "⊒": [T: "kÀÀnteinen kulmikas relaatio tai yhtĂ€ suuri kuin"] # 0x2292 (en: 'square original of or equal to', google: 'neliön alkuperĂ€inen tai yhtĂ€ suuri kuin') - - "⊓": [T: "kulmikas kupu"] # 0x2293 (en: 'square cap', google: 'neliö -isot') - - "⊔": [T: "kulmikas malja"] # 0x2294 (en: 'square cup', google: 'square cup') - - "⊕": [T: "ympyröity plus"] # 0x2295 (en: 'circled plus') - - "⊖": [T: "ympyröity miinus"] # 0x2296 (en: 'circled minus') - - "⊗": [T: "ympyröity kertaa"] # 0x2297 (en: 'circled times', google: 'ympyrĂ€ajat') - - "⊘": [T: "ympyröity jakoviiva"] # 0x2298 (en: 'circled slash', google: 'ympyrĂ€viiva') - - "⊙": [T: "ympyröity piste"] # 0x2299 (en: 'circled dot operator', google: 'ympyrĂ€pisteoperaattori') - - "⊚": [T: "ympyröity pallo"] # 0x229a (en: 'circled ring', google: 'ympyrĂ€ rengas') - - "⊛": [T: "ympyröity tĂ€hti"] # 0x229b (en: 'circled asterisk', google: 'ympyrĂ€ tĂ€hdellĂ€') - - "⊜": [T: "ympyröity yhtĂ€ kuin"] # 0x229c (en: 'circled equals', google: 'ympyröity tasa -arvoinen') - - "⊝": [T: "ympyröity viiva"] # 0x229d (en: 'circled dash') - - "⊞": [T: "neliöity plus"] # 0x229e (en: 'squared plus', google: 'squared plus') - - "⊟": [T: "neliöity miinus"] # 0x229f (en: 'squared minus', google: 'neliö miinus') - - "⊠": [T: "neliöity kertaa"] # 0x22a0 (en: 'squared times', google: 'neliöajat') - - "⊡": [T: "neliöity piste"] # 0x22a1 (en: 'squared dot operator', google: 'squared dot -operaattori') - - "⊱": [T: "oikealle osoittava nupi"] # 0x22a2 (en: 'proves', google: 'todistaa') - - "⊣": [T: "vasemmalle osoittava nupi"] # 0x22a3 (en: 'does not yield', google: 'ei tuota') - - "⊀": [T: "alas osoittava nupi"] # 0x22a4 (google: 'ylhÀÀltĂ€') - - "⊄": # 0x22a5 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "ylös osoittava nupi" # (google: 'pohja') - - "⊩": [T: "assertio"] # 0x22a6 (en: 'reduces to', google: 'vĂ€hentÀÀ') - - "⊧": [T: "toteuttaa mallina"] # 0x22a7 (en: 'models', google: 'malleja') - - "⊹": # 0x22a8 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "tosi" # (en: 'true', google: 'totta') - - "⊩": [T: "pakottaa"] # 0x22a9 (en: 'forces', google: 'voimat') - - "âŠȘ": [T: "kolmoispystyviiva ja oikeanpuoleinen kÀÀntöportti"] # 0x22aa (en: 'triple vertical bar right turnstile', google: 'kolminkertainen pystysuora palkki oikean kÀÀntölaite') - - "⊫": [T: "kaksoispystyviiva ja oikeanpuoleinen kaksoiskÀÀntöportti"] # 0x22ab (en: 'double vertical bar double right turnstile', google: 'kaksois pystysuora palkki kaksinkertainen oikea kÀÀnne') - - "⊬": [T: "ei todista"] # 0x22ac (en: 'does not prove', google: 'ei todista') - - "⊭": # 0x22ad - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "epĂ€tosi" # (en: 'not true', google: 'ei totta') - - "⊼": [T: "ei pakota"] # 0x22ae (en: 'does not force', google: 'ei pakota') - - "⊯": [T: "ei kaksoispystyviiva ja oikeanpuolenen kaksoiskÀÀntöportti"] # 0x22af (en: 'negated double vertical bar double right turnstile', google: 'kielteinen kaksinkertainen pystysuora palkki kaksinkertainen oikea kÀÀnne') - - "⊰": [T: "edeltÀÀ relaatiossa"] # 0x22b0 (en: 'precedes under relation', google: 'edeltÀÀ suhteessa') - - "⊱": [T: "seuraa relaatiossa"] # 0x22b1 (en: 'succeeds under relation', google: 'onnistuu suhteessa') - - "âŠČ": # 0x22b2 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "normaali aliryhmĂ€" # (en: 'a normal subgroup of', google: 'normaali alaryhmĂ€') - - "⊳": [T: "sisĂ€ltÀÀ normaalin aliryhmĂ€n"] # 0x22b3 (en: 'contains as a normal subgroup', google: 'sisĂ€ltÀÀ normaalina alaryhmĂ€nĂ€') - - "⊮": # 0x22b4 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "normaali aliryhmĂ€ tai yhtĂ€ kuin" # (en: 'a normal subgroup of or equal to', google: 'normaali alaryhmĂ€ tai yhtĂ€ suuri') - - "⊔": [T: "sisĂ€ltÀÀ normaalin aliryhmĂ€n tai on yhtĂ€ kuin"] # 0x22b5 (en: 'contains as a normal subgroup or equal to', google: 'sisĂ€ltÀÀ normaalina alaryhmĂ€nĂ€ tai yhtĂ€ suuri kuin') - - "⊶": # 0x22b6 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "alkukuva" # (en: 'the original of', google: 'alkuperĂ€inen') - - "⊷": # 0x22b7 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "kuva" # (en: 'an image of', google: 'kuva') - - "⊾": [T: "monikuvaus"] # 0x22b8 - - "âŠč": [T: "Hermiten konjugaattimatriisi"] # 0x22b9 (en: 'hermitian conjugate matrix', google: 'hermitian konjugaattimatriisi') - - "âŠș": [T: "interkalaatio"] # 0x22ba (google: 'interkalaatti') - - "⊻": [T: "joko tai"] # 0x22bb - - "⊌": [T: "ja ei"] # 0x22bc - - "⊜": [T: "tai ei"] # 0x22bd (google: 'ei myöskÀÀn') - - "⊟": [T: "suora kulma kaarella"] # 0x22be (en: 'right angle with arc', google: 'suorakulma kaarilla') - - "⊿": [T: "oikeanpuoleinen kolmio"] # 0x22bf (en: 'right triangle') - - "⋀": [T: "monikkokonjuktio"] # 0x22c0 (en: 'logical and', google: 'looginen ja') - - "⋁": [T: "monikkodisjunktio"] # 0x22c1 (en: 'logical or', google: 'looginen tai') - - "⋂": [T: "monikkoleikkaus"] # 0x22c2 (en: 'intersection', google: 'risteys') - - "⋃": [T: "monikkounioni"] # 0x22c3 (en: 'union', google: 'liitto') - - "⋄": [T: "timantti"] # 0x22c4 (en: 'diamond operator', google: 'timanttioperaattori') - - "⋅": # 0x22c5 - - test: - if: "@data-chem-formula-op" - then: [T: "piste"] # (en: 'dot', google translation) - else: [T: "kertaa"] # (en: 'times', google: 'ajat') - - - "⋆": [T: "kertaa"] # 0x22c6 (en: 'times', google: 'ajat') - - "⋇": [T: "jako kertaa"] # 0x22c7 (en: 'division times', google: 'jako -ajat') - - "⋈": [T: "rusetti"] # 0x22c8 (en: 'bowtie', google: 'rusetti') - - "⋉": # 0x22c9 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "vasemmanpuoleinen normaalitekijĂ€inen puolisuora tulo" # (en: 'the left normal factor semidirect product of', google: 'vasen normaali tekijĂ€ semidirect -tuote') - - "⋊": # 0x22ca - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "oikeanpuoleinen normaalitekijĂ€inen puolisuora tulo" # (en: 'the right normal factor semidirect product of', google: 'oikea normaali tekijĂ€ semidirect -tuote') - - "⋋": # 0x22cb - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "vasemmanpuoleinen puolisuora tulo" # (en: 'the left semidirect product of', google: 'vasen puolisirektin tuote') - - "⋌": # 0x22cc - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "oikeanpuoleinen puolisuora tulo" # (en: 'the right semidirect product of', google: 'oikea semidirect -tuote') - - "⋍": [T: "kÀÀnteinen tilde yhtĂ€suuruus"] # 0x22cd (en: 'reversed tilde equals', google: 'kÀÀnteinen tilde on tasa -arvoinen') - - "⋎": [T: "kaareva looginen tai"] # 0x22ce (en: 'curly logical or', google: 'kihara looginen tai') - - "⋏": [T: "kaareva looginen ja"] # 0x22cf (en: 'curly logical and', google: 'curly looginen ja') - - "⋐": # 0x22d0 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "kaksoisosajoukko" # (en: 'a double subset of', google: 'kaksinkertainen osajoukko') - - "⋑": # 0x22d1 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "kaksoisylijoukko" # (en: 'a double superset of', google: 'kaksinkertainen superset') - - "⋒": # 0x22d2 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (google translation) - - T: "kaksoisleikkaus" # (en: 'double intersection of', google: 'kaksinkertainen risteys') - - "⋓": # 0x22d3 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (google translation) - - T: "kaksoisunioni" # (en: 'double union of', google: 'kaksinkertainen liitto') - - "⋔": # 0x22d4 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (google translation) - - T: "hanko" # (en: 'proper intersection of', google: 'oikea risteys') - - "⋕": # 0x22d5 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "yhtĂ€suuri ja yhdensuuntainen" # (en: 'equal to and parallel to', google: 'yhtĂ€ suuri kuin sen kanssa ja yhdensuuntainen') - - "⋖": [T: "piste pienempi kuin"] # 0x22d6 (en: 'less than with dot', google: 'vĂ€hemmĂ€n kuin pisteellĂ€') - - "⋗": [T: "piste suurempi kuin"] # 0x22d7 (en: 'greater than with dot', google: 'suurempi kuin pisteellĂ€') - - "⋘": # 0x22d8 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "hyvin paljon pienempi kuin" # (en: 'very much less than', google: 'hyvin vĂ€hemmĂ€n kuin') - - "⋙": # 0x22d9 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "hyvin paljon suurempi kuin" # (en: 'very much greater than', google: 'erittĂ€in suurempi kuin') - - "⋚": # 0x22da - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "pienempi, yhtĂ€suuri tai suurempi kuin" # (en: 'less than equal to or greater than', google: 'vĂ€hemmĂ€n kuin yhtĂ€ suuri tai suurempi kuin') - - "⋛": # 0x22db - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "suurempi, yhtĂ€suuri tai pienempi kuin" # (en: 'greater than equal to or less than', google: 'suurempi kuin yhtĂ€ suuri tai vĂ€hemmĂ€n kuin') - - "⋜": # 0x22dc - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "yhtĂ€suuri tai pienempi kuin" # (en: 'equal to or less than', google: 'yhtĂ€ suuri tai vĂ€hemmĂ€n kuin') - - "⋝": # 0x22dd - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "yhtĂ€suuri tai suurempi kuin" # (en: 'equal to or greater than', google: 'yhtĂ€ suuri tai suurempi kuin') - - "⋞": # 0x22de - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "yhtĂ€ kuin tai edeltÀÀ" # (en: 'equal to or precedes', google: 'yhtĂ€ suuri tai edeltÀÀ') - - "⋟": # 0x22df - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "yhtĂ€ kuin tai seuraa" # (en: 'equal to or succeeds', google: 'yhtĂ€ suuri tai onnistuu') - - "⋠": [T: "ei edellĂ€ eikĂ€ yhtĂ€ kuin"] # 0x22e0 (en: 'does not precede nor is equal to', google: 'ei edeltĂ€ eikĂ€ ole yhtĂ€ suuri kuin') - - "⋡": [T: "ei seuraa eikĂ€ yhtĂ€ kuin"] # 0x22e1 (en: 'does not succeed nor is equal to', google: 'ei onnistu eikĂ€ ole yhtĂ€ suuri kuin') - - "⋱": [T: "ei kulmikas relaatio tai yhtĂ€ suuri kuin"] # 0x22e2 (en: 'not square image of or equal to', google: 'ei neliökuva tai yhtĂ€ suuri kuin') - - "⋣": [T: "ei kÀÀnteinen kulmikas relaatio tai yhtĂ€ suuri kuin"] # 0x22e3 (en: 'not square original of or equal to', google: 'ei neliömĂ€inen alkuperĂ€inen tai yhtĂ€ suuri kuin') - - "â‹€": [T: "kulmikas relaatio ja ei yhtĂ€ suuri kuin"] # 0x22e4 (en: 'square image of or not equal to', google: 'neliökuva tai ei ole yhtĂ€ suuri kuin') - - "â‹„": [T: "kulmikas kÀÀnteinen relaatio ja ei yhtĂ€ suuri kuin"] # 0x22e5 (en: 'square original of or not equal to', google: 'neliön alkuperĂ€inen tai ei ole yhtĂ€ suuri kuin') - - "⋩": # 0x22e6 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "pienempi kuin mutta ei ekvivalentti" # (en: 'less than but not equivalent to', google: 'vĂ€hemmĂ€n kuin, mutta ei vastaava') - - "⋧": # 0x22e7 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "suurempi kuin mutta ei ekvivalentti" # (en: 'greater than but not equivalent to', google: 'suurempi kuin mutta ei vastaa') - - "⋹": [T: "edeltÀÀ mutta ei ole ekvivalentti"] # 0x22e8 (en: 'precedes but is not equivalent to', google: 'edeltÀÀ, mutta ei vastaa') - - "⋩": [T: "seuraa mutta ei ole ekvivalentti"] # 0x22e9 (en: 'succeeds but is not equivalent to', google: 'onnistuu, mutta ei vastaa') - - "â‹Ș": # 0x22ea - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei ole normaali aliryhmĂ€" # (en: 'not a normal subgroup of', google: 'ei normaali alaryhmĂ€') - - "⋫": [T: "ei sisĂ€llĂ€ normaalia aliryhmÀÀ"] # 0x22eb (en: 'does not contain as a normal subgroup', google: 'ei sisĂ€llĂ€ normaalia alaryhmÀÀ') - - "⋬": # 0x22ec - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei ole normaali aliryhmĂ€ tai yhtĂ€ kuin" # (en: 'not a normal subgroup of nor is equal to', google: 'ei normaali alaryhmĂ€, joka ei ole yhtĂ€ suuri') - - "⋭": [T: "ei sisĂ€llĂ€ normaalina aliryhmĂ€nĂ€ tai ole yhtĂ€ kuin"] # 0x22ed (en: 'does not contain as a normal subgroup nor is equal to', google: 'ei sisĂ€llĂ€ normaalia alaryhmÀÀ eikĂ€ ole yhtĂ€ suuri kuin') - - "⋼": [T: "pystyellipsi"] # 0x22ee (en: 'vertical ellipsis', google: 'pystysuora ellipsis') # FI: context? used in matrices? - - "⋯": [T: "piste piste piste"] # 0x22ef (en: 'dot dot dot', google: 'dot dot dot') - - "⋰": [T: "nouseva ellipsi"] # 0x22f0 (en: 'upwards diagonal ellipsis', google: 'ylöspĂ€in diagonaalinen ellipsi') # FI: context? used in matrices? - - "⋱": [T: "laskeva ellipsi"] # 0x22f1 (en: 'diagonal ellipsis', google: 'diagonaalinen ellipsis') # FI: context? used in matrices? - - "â‹Č": [T: "poikkiviivainen kuulumismerkki"] # 0x22f2 (en: 'element of with long horizontal stroke', google: 'elementti pitkĂ€llĂ€ vaakasuoralla iskulla') - - "⋳": [T: "kuulumismerkki pystyviivaan pÀÀttyvĂ€llĂ€ poikkiviivalla"] # 0x22f3 (en: 'element of with vertical bar at end of horizontal stroke', google: 'elementti pystysuoralla tankolla vaakasuoran iskun lopussa') - - "⋮": [T: "pieni kuulumismerkki pystyviivaan pÀÀttyvĂ€llĂ€ poikkiviivalla"] # 0x22f4 (en: 'element of with vertical bar at end of horizontal stroke', google: 'elementti pystysuoralla tankolla vaakasuoran iskun lopussa') - - "â‹”": [T: "kuuluu joukkoon pisteellĂ€"] # 0x22f5 (en: 'element of with dot above', google: 'elementti yllĂ€ olevalla pisteellĂ€') - - "⋶": [T: "kuuluu joukkoon ylĂ€viivalla"] # 0x22f6 (en: 'element of with overbar', google: 'elementti ylikuormituksella') - - "⋷": [T: "pieni kuuluu joukkoon ylĂ€viivalla"] # 0x22f7 (en: 'element of with overbar', google: 'elementti ylikuormituksella') - - "⋾": [T: "kuuluu joukkoon alaviivalla"] # 0x22f8 (en: 'element of with underbar', google: 'elementti alakerroksella') - - "â‹č": [T: "kuuluu joukkoon kaksoispoikkiviivalla"] # 0x22f9 (en: 'element of with two horizontal strokes', google: 'elementti kahdella vaakasuuntaisella iskulla') - - "â‹ș": [T: "kÀÀnteinen kuuluu joukkoon poikkiviivalla"] # 0x22fa (en: 'contains with long horizontal stroke', google: 'sisĂ€ltÀÀ pitkĂ€llĂ€ vaakasuoralla iskulla') - - "⋻": [T: "kÀÀnteinen kuuluu joukkoon pystyviivaan pÀÀttyvĂ€llĂ€ poikkiviivalla"] # 0x22fb (en: 'contains with vertical bar at end of horizontal stroke', google: 'sisĂ€ltÀÀ pystysuoran palkin vaakasuoran iskun lopussa') - - "⋌": [T: "pieni kÀÀnteinen kuuluu joukkoon pystyviivaan pÀÀttyvĂ€llĂ€ poikkiviivalla"] # 0x22fc (en: 'contains with vertical bar at end of horizontal stroke', google: 'sisĂ€ltÀÀ pystysuoran palkin vaakasuoran iskun lopussa') - - "⋜": [T: "sisĂ€ltÀÀ tai on yhtĂ€ suuri kuin"] # 0x22fd (en: 'contains with overbar', google: 'sisĂ€ltÀÀ ylikuormituksen kanssa') - - "⋟": [T: "pieni sisĂ€ltÀÀ tai on yhtĂ€ suuri kuin"] # 0x22fe (en: 'contains with overbar', google: 'sisĂ€ltÀÀ ylikuormituksen kanssa') - - "⋿": [T: "Z-notaation laukkuun kuulumisen merkki"] # 0x22ff (google: 'z -merkintĂ€laukun jĂ€senyys') - - "⌀": [T: "halkaisija"] # 0x2300 (en: 'diameter') - - "⌁": [T: "sĂ€hkönuoli"] # 0x2301 (en: 'electric arrow', google translation) - - "⌂": [T: "talo"] # 0x2302 (en: 'house') - - "⌃": [T: "nuolenpÀÀ ylös"] # 0x2303 (en: 'up arrowhead', google translation) - - "⌄": [T: "nuolenpÀÀ alas"] # 0x2304 (en: 'down arrowhead', google translation) - - "⌅": [T: "projektio"] # 0x2305 (en: 'projective', google: 'projektiivinen') - - "⌆": [T: "perspektiivi"] # 0x2306 (en: 'perspective', google: 'nĂ€kökulma') - - "⌇": [T: "aaltoviiva"] # 0x2307 (en: 'wavy line', google translation) - - "⌈": [T: "vasen katto"] # 0x2308 (en: 'left ceiling') - - "⌉": [T: "oikea katto"] # 0x2309 (en: 'right ceiling') - - "⌊": [T: "vasen lattia"] # 0x230a (en: 'left floor') - - "⌋": [T: "oikea lattia"] # 0x230b (en: 'right floor', google: 'oikea kerros') - - "⌌": [T: "oikea alanurkkarajaus"] # 0x230c (en: 'bottom right crop', google: 'oikea alareuna') - - "⌍": [T: "vasen alanurkkarajaus"] # 0x230d (en: 'bottom left crop', google: 'vasen alakulma') - - "⌎": [T: "oikea ylĂ€nurkkarajaus"] # 0x230e (en: 'top right crop', google: 'oikea ylĂ€osa') - - "⌏": [T: "vasen ylĂ€nurkkarajaus"] # 0x230f (en: 'top left crop', google: 'vasen ylĂ€osa sato') - - "⌐": [T: "kÀÀnnetty negaatio"] # 0x2310 (en: 'reversed not sign', google: 'kÀÀntynyt ei allekirjoitettu') - - "⌑": [T: "tyynysymboli"] # 0x2311 (google translation) - - "⌒": [T: "ylĂ€kaari"] # 0x2312 (en: 'arc', google: 'kaari') - - "⌓": [T: "segmentti"] # 0x2313 (en: 'segment') - - "⌔": [T: "sektori"] # 0x2314 (en: 'sector', google translation) - - "⌕": [T: "suurennuslasi"] # 0x2315 (google: 'puhelintallistin') - - "⌖": [T: "tĂ€htĂ€in"] # 0x2316 (en: 'position indicator crosshairs', google: 'aseman ilmaisimen ristikkĂ€it') - - "⌗": [T: "risuaita"] # 0x2317 (en: 'viewdata square', google translation) - - "⌘": [T: "hannunvaakuna"] # 0x2318 (en: 'place of interest sign', google: 'kiinnostuksen kohteena oleva merkki') - - "⌙": [T: "kÀÀntynyt negaatio"] # 0x2319 (en: 'turned not sign', google translation) - - "⌚": [T: "kello"] # 0x231a (en: 'watch', google: 'katsella') - - "⌛": [T: "tiimalasi"] # 0x231b (en: 'hourglass', google translation) - - "⌜": [T: "vasen ylĂ€nurkka"] # 0x231c (en: 'top left corner', google: 'vasen ylĂ€kulma') - - "⌝": [T: "oikea ylĂ€nurkka"] # 0x231d (en: 'top right corner', google: 'oikea ylĂ€kulma') - - "⌞": [T: "vasen alanurkka"] # 0x231e (en: 'bottom left corner', google: 'vasen alakulma') - - "⌟": [T: "oikea alanurkka"] # 0x231f (en: 'bottom right corner', google: 'oikea alakulma') - - "⌠": [T: "integraalin ylĂ€puoli"] # 0x2320 (en: 'top half integral', google: 'top -puoliksi olennainen') - - "⌡": [T: "integraalin alapuoli"] # 0x2321 (en: 'bottom half integral', google: 'pohjapuoliskon integraali') - - "⌱": [T: "ylĂ€kaari"] # 0x2322 (en: 'frown', google: 'kulma') - - "⌣": [T: "alakaari"] # 0x2323 (en: 'smile', google: 'hymy') - - "⌀": [T: "nuolenpÀÀ ylös kahden vaakasuoran palkin vĂ€lissĂ€"] # 0x2324 (en: 'up arrowhead between two horizontal bars', google translation) - - "⌄": [T: "option"] # 0x2325 (en: 'option key', google translation) - - "〈": [T: "poista oikealle"] # 0x2326 (en: 'erase to the right', google translation) - - "⌧": [T: "suorakulmiossa oleva rasti"] # 0x2327 (en: 'x in a rectangle box', google translation) - - "⌹": [T: "nĂ€ppĂ€imistö"] # 0x2328 (en: 'keyboard', google translation) - - "〈": [T: "vasen kulmasulku"] # 0x2329 (en: 'left pointing angle bracket', google: 'vasen osoituskulmakiinnike') - - "âŒȘ": [T: "oikea kulmasulku"] # 0x232a (en: 'right pointing angle bracket', google: 'oikea osoituskulmakiinnike') - - "⌫": [T: "poista vasemmalle"] # 0x232b (en: 'erase to the left', google translation) - - "⌬": [T: "bentseenirengas"] # 0x232c (en: 'benzene ring', google translation) - - "⌭": [T: "sylinterisyys"] # 0x232d (google: 'sylinteryys') - - "⌼": [T: "profiilin ympĂ€ri"] # 0x232e (en: "all around profile" google: 'ympĂ€ri profiilia') # FI: translation unclear - - "⌯": [T: "symmetria"] # 0x232f (en: 'symmetry', google translation) - - "⌰": [T: "toleranssin yhteissumma"] # 0x2330 (en: 'total runout', google translation) # FI: meaning bit unclear, placeholder for correct - - "⌱": [T: "alkudimensio"] # 0x2331 (en: 'dimension origin', google translation) # FI: translation unclear - - "âŒČ": [T: "kartiovĂ€hentyminen"] # 0x2332 (en: 'conical taper', google translation) # FI: translation unclear - - "⌳": [T: "kaltevuus"] # 0x2333 (en: 'slope', google translation) - - "⌮": [T: "tasoupotin"] # 0x2334 (en: 'counterbore', google translation) - - "⌔": [T: "kĂ€rkiupotin"] # 0x2335 (en: 'countersink', google translation) - - "⍰": [T: "kysymysmerkki laatikossa"] # 0x2370 (en: 'unknown box', google: 'tuntematon laatikko') - - "⎕": [T: "laatikko"] # 0x2395 (en: 'box', google translation) - - "⏞": [T: "ylĂ€aaltosulku"] # 0x23DE (en: 'top brace', google: 'ylĂ€ ahdin') - - "⏟": [T: "ala-aaltosulku"] # 0x23DF (en: 'bottom brace', google: 'pohja ahdin') - - "①-⑹": # 0x2460 - 0x2469 - - T: "ympyröity" # (en: 'circled', google: 'ympyröi') - - SPELL: "translate('.', '①⑥⑹④⑀⑄⑊⑧⑚', '123456789')" - - "⑩": [T: "ympyröity kymmenen"] # 0x2469 (en: 'circled ten', google translation) - - "â‘Ș": [T: "ympyröity yksitoista"] # 0x246a (en: 'circled eleven', google translation) - - "⑫": [T: "ympyröity kaksitoista"] # 0x246b (en: 'circled twelve', google translation) - - "⑬": [T: "ympyröity kolmetoista"] # 0x246c (en: 'circled thirteen', google translation) - - "⑭": [T: "ympyröity neljĂ€toista"] # 0x246d (en: 'circled fourteen', google translation) - - "⑼": [T: "ympyröity viisitoista"] # 0x246e (en: 'circled fifteen', google translation) - - "⑯": [T: "ympyröity kuusitoista"] # 0x246f (en: 'circled sixteen', google translation) - - "⑰": [T: "ympyröity seitsemĂ€ntoista"] # 0x2470 (en: 'circled seventeen', google translation) - - "⑱": [T: "ympyröity kahdeksantoista"] # 0x2471 (en: 'circled eighteen', google translation) - - "⑳": [T: "ympyröity kaksikymmentĂ€"] # 0x2473 (en: 'circled twenty', google translation) - - "⑮-⑌": # 0x2474 - 0x247d - - T: "suluissa" # (en: 'parenthesized', google translation) - - SPELL: "translate('.', '⑎⑔⑶⑷⑞â‘čâ‘ș⑻⑌', '123456789')" - - "⑜": [T: "suluissa kymmenen"] # 0x247d (en: 'parenthesized ten', google translation) - - "⑟": [T: "suluissa yksitoista"] # 0x247e (en: 'parenthesized eleven', google translation) - - "⑿": [T: "suluissa kaksitoista"] # 0x247f (en: 'parenthesized twelve', google translation) - - "⒀": [T: "suluissa kolmetoista"] # 0x2480 (en: 'parenthesized thirteen', google translation) - - "⒁": [T: "suluissa neljĂ€toista"] # 0x2481 (en: 'parenthesized fourteen', google translation) - - "⒂": [T: "suluissa viisitoista"] # 0x2482 (en: 'parenthesized fifteen', google translation) - - "⒃": [T: "suluissa kuusitoista"] # 0x2483 (en: 'parenthesized sixteen', google translation) - - "⒄": [T: "suluissa seitsemĂ€ntoista"] # 0x2484 (en: 'parenthesized seventeen', google translation) - - "⒅": [T: "suluissa kahdeksantoista"] # 0x2485 (en: 'parenthesized eighteen', google translation) - - "⒆": [T: "suluissa yhdeksĂ€ntoista"] # 0x2486 (en: 'parenthesized nineteen', google translation) - - "⒇": [T: "suluissa kaksikymmentĂ€"] # 0x2487 (en: 'parenthesized twenty', google translation) - - "⒈-⒐": # 0x2488 - 0x2491 # FI: should these be ordinals? - - SPELL: "translate('.', '⒈⒉⒊⒋⒌⒍⒎⒏⒐', '123456789')" - - T: "pisteellĂ€" # (en: 'with period', google translation) - - "⒑": [T: "kymmenen pisteellĂ€"] # 0x2491 (en: 'ten with period', google translation) - - "⒒": [T: "yksitoista pisteellĂ€"] # 0x2492 (en: 'eleven with period', google translation) - - "⒓": [T: "kaksitoista pisteellĂ€"] # 0x2493 (en: 'twelve with period', google translation) - - "⒔": [T: "kolmetoista pisteellĂ€"] # 0x2494 (en: 'thirteen with period', google translation) - - "⒕": [T: "neljĂ€toista pisteellĂ€"] # 0x2495 (en: 'fourteen with period', google translation) - - "⒖": [T: "viisitoista pisteellĂ€"] # 0x2496 (en: 'fifteen with period', google translation) - - "⒗": [T: "kuusitoista pisteellĂ€"] # 0x2497 (en: 'sixteen with period', google translation) - - "⒘": [T: "seitsemĂ€ntoista pisteellĂ€"] # 0x2498 (en: 'seventeen with period', google translation) - - "⒙": [T: "kahdeksantoista pisteellĂ€"] # 0x2499 (en: 'eighteen with period', google translation) - - "⒚": [T: "yhdeksĂ€ntoista pisteellĂ€"] # 0x249a (en: 'nineteen with period', google translation) - - "⒛": [T: "kaksikymmentĂ€ pisteellĂ€"] # 0x249b (en: 'twenty with period', google translation) - - "⒜-â’”": # 0x249c - 0x24b5 - - T: "suluissa" # (en: 'parenthesized', google translation) - - SPELL: "translate('.', 'â’œâ’â’žâ’Ÿâ’ â’Ąâ’ąâ’Łâ’€â’„â’Šâ’§â’šâ’©â’Șâ’«â’Źâ’­â’źâ’Żâ’°â’±â’Čâ’łâ’Žâ’”', 'abcdefghijklmnopqrstuvwxyz')" - - - "Ⓐ-Ⓩ": - - T: "ympyröity" # (en: 'circled', google translation) - - SPELL: "translate('.', 'â’¶â’·â’žâ’čâ’șâ’»â’Œâ’œâ’Ÿâ’żâ“€â“â“‚â“ƒâ“„â“…â“†â“‡â“ˆâ“‰â“Šâ“‹â“Œâ“â“Žâ“', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "🅐-đŸ…©": # 0x1f150 - 0x1f169 - - T: "musta ympyröity" # (en: 'black circled', google translation) - - SPELL: "translate('.', 'đŸ…đŸ…‘đŸ…’đŸ…“đŸ…”đŸ…•đŸ…–đŸ…—đŸ…˜đŸ…™đŸ…šđŸ…›đŸ…œđŸ…đŸ…žđŸ…ŸđŸ… đŸ…ĄđŸ…ąđŸ…ŁđŸ…€đŸ…„đŸ…ŠđŸ…§đŸ…šđŸ…©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "ⓐ-ⓩ": # 0x24d0 - 0x24e9 - - T: "ympyröity" # (en: 'circled', google translation) - - SPELL: "translate('.', 'â“â“‘â“’â““â“”â“•â“–â“—â“˜â“™â“šâ“›â“œâ“â“žâ“Ÿâ“ â“Ąâ“ąâ“Łâ“€â“„â“Šâ“§â“šâ“©', 'abcdefghijklmnopqrstuvwxyz')" - - "â“Ș": [T: "ympyröity nolla"] # 0x24ea (en: 'circled zero', google translation) - - "⓫": [T: "musta ympyröity yksitoista"] # 0x24eb (en: 'black circled eleven', google translation) - - "⓬": [T: "musta ympyröity kaksitoista"] # 0x24ec (en: 'black circled twelve', google translation) - - "⓭": [T: "musta ympyröity kolmetoista"] # 0x24ed (en: 'black circled thirteen', google translation) - - "⓼": [T: "musta ympyröity neljĂ€toista"] # 0x24ee (en: 'black circled fourteen', google translation) - - "⓯": [T: "musta ympyröity viisitoista"] # 0x24ef (en: 'black circled fifteen', google translation) - - "⓰": [T: "musta ympyröity kuusitoista"] # 0x24f0 (en: 'black circled sixteen', google translation) - - "⓱": [T: "musta ympyröity seitsemĂ€ntoista"] # 0x24f1 (en: 'black circled seventeen', google translation) - - "â“Č": [T: "musta ympyröity kahdeksantoista"] # 0x24f2 (en: 'black circled eighteen', google translation) - - "⓳": [T: "musta ympyröity yhdeksĂ€ntoista"] # 0x24f3 (en: 'black circled nineteen', google translation) - - "⓮": [T: "musta ympyröity kaksikymmentĂ€"] # 0x24f4 (en: 'black circled twenty', google translation) - - "â“”-ⓜ": # 0x24f5 - 0x24fe - - T: "kaksinkertaisesti ympyröity" # (en: 'double circled', google translation) - - SPELL: "translate('.', 'ⓔ⓶⓷ⓞâ“čâ“ș⓻Ⓦⓜ', '123456789')" - - "ⓟ": [T: "kaksinkertaisesti ympyröity kymmenen"] # 0x24fe (en: 'double circled ten', google translation) - - "⓿": [T: "musta ympyröity nolla"] # 0x24ff (en: 'black circled zero', google translation) - - "■": [T: "musta neliö"] # 0x25a0 (en: 'black square') - - "□": [T: "valkoinen neliö"] # 0x25a1 (en: 'white square') - - "▱": [T: "pyöreĂ€kulmainen valkoinen neliö"] # 0x25a2 (en: 'white square with rounded corners', google translation) - - "▣": [T: "mustan neliön sisĂ€ltĂ€vĂ€ valkoinen neliö"] # 0x25a3 (en: 'white square containing small black square', google translation) - - "â–€": [T: "neliö vaakasuoralla vĂ€rityksellĂ€"] # 0x25a4 (en: 'square with horizontal fill', google translation) - - "â–„": [T: "neliö pystysuoralla vĂ€rityksellĂ€"] # 0x25a5 (en: 'square with vertical fill', google translation) - - "▩": [T: "neliö ruudukkovĂ€rityksellĂ€"] # 0x25a6 (en: 'square with orthogonal crosshatch fill', google translation) - - "▧": [T: "neliö vĂ€rityksellĂ€ ylĂ€vasemmalta alaoikelle"] # 0x25a7 (en: 'square with upper left to lower right fill', google translation) - - "▹": [T: "neliö vĂ€rityksellĂ€ ylĂ€oikealta alavasemmalle"] # 0x25a8 (en: 'square with upper right to lower left fill', google translation) - - "▩": [T: "neliö diagonaalisella ristikkovĂ€rityksellĂ€"] # 0x25a9 (en: 'square with diagonal crosshatch fill', google translation) - - "â–Ș": [T: "pieni musta neliö"] # 0x25aa (en: 'black small square', google: 'musta pieni neliö') - - "▫": [T: "pieni valkoinen neliö"] # 0x25ab (en: 'white small square', google: 'valkoinen pieni neliö') - - "▬": [T: "musta suorakaide"] # 0x25ac (en: 'black rectangle', google translation) - - "▭": [T: "valkoinen suorakaide"] # 0x25ad (en: 'white rectangle', google: 'valkoinen suorakulmio') - - "▼": [T: "musta pysty suorakaide"] # 0x25ae (en: 'black vertical rectangle', google: 'musta pystysuora suorakulmio') - - "▯": [T: "valkoinen pysty suorakaide"] # 0x25af (en: 'white vertical rectangle', google: 'valkoinen pystysuora suorakulmio') - - "▰": [T: "musta suunnikas"] # 0x25b0 (en: 'black parallelogram', google translation) - - "▱": [T: "valkoinen suunnikas"] # 0x25b1 (en: 'white parallelogram', google: 'valkoinen rinnakkainen ohjelma') - - "â–Č": [T: "musta ylös osoittava kolmio"] # 0x25b2 (en: 'black up pointing triangle', google: 'musta ylöspĂ€in osoittava kolmio') - - "△": [T: "valkoinen ylös osoittava kolmio"] # 0x25b3 (en: 'white up pointing triangle', google: 'valkoinen osoitus kolmio') - - "▮": [T: "pieni musta ylös osoittava kolmio"] # 0x25b4 (en: 'black up pointing small triangle', google: 'musta ylös osoittaen pientĂ€ kolmiota') - - "â–”": [T: "pieni valkoinen ylös osoittava kolmio"] # 0x25b5 (en: 'white up pointing small triangle', google: 'valkoinen osoittaen pientĂ€ kolmiota') - - "▶": [T: "musta oikealle osoittava kolmio"] # 0x25b6 (en: 'black right pointing triangle', google: 'musta oikea osoitus kolmio') - - "▷": [T: "valkoinen oikealle osoittava kolmio"] # 0x25b7 (en: 'white right pointing triangle', google: 'valkoinen oikea osoitus kolmio') - - "▾": [T: "pieni musta oikealle osoittava kolmio"] # 0x25b8 (en: 'black right pointing small triangle', google: 'musta oikea osoittaen pieni kolmio') - - "â–č": [T: "pieni valkoinen oikealle osoittava kolmio"] # 0x25b9 (en: 'white right pointing small triangle', google: 'valkoinen oikea osoittaen pieni kolmio') - - "â–ș": [T: "musta oikea osoitin"] # 0x25ba (en: 'black right pointing pointer', google translation) - - "▻": [T: "valkoinen oikea osoitin"] # 0x25bb (en: 'white right pointing pointer', google translation) - - "â–Œ": [T: "musta alas osoittava kolmio"] # 0x25bc (en: 'black down pointing triangle', google: 'musta alaspĂ€in osoittava kolmio') - - "â–œ": [T: "valkoinen alas osoittava kolmio"] # 0x25bd (en: 'white down pointing triangle', google: 'valkoinen alaspĂ€in osoittava kolmio') - - "â–Ÿ": [T: "pieni musta alas osoittava kolmio"] # 0x25be (en: 'black down pointing small triangle', google: 'musta alaspĂ€in osoittaen pieni kolmio') - - "▿": [T: "pieni valkoinen alas osoittava kolmio"] # 0x25bf (en: 'white down pointing small triangle', google: 'valkoinen alas osoittaen pieni kolmio') - - "◀": [T: "musta vasemmalle osoittava kolmio"] # 0x25c0 (en: 'black left pointing triangle', google: 'musta vasen osoitus kolmio') - - "◁": [T: "valkoinen vasemmalle osoittava kolmio"] # 0x25c1 (en: 'white left pointing triangle', google: 'valkoinen vasen osoitus kolmio') - - "◂": [T: "pieni musta vasemmalle osoittava kolmio"] # 0x25c2 (en: 'black left pointing small triangle', google: 'musta vasen osoittaa pieni kolmio') - - "◃": [T: "pieni valkoinen vasemmalle osoittava kolmio"] # 0x25c3 (en: 'white left pointing small triangle', google: 'valkoinen vasen osoitus pieni kolmio') - - "◄": [T: "musta vasemmalle osoittava osoitin"] # 0x25c4 (en: 'black left pointing pointer', google: 'musta vasen osoitin') - - "◅": [T: "valkoinen vasemmalle osoittava osoitin"] # 0x25c5 (en: 'white left pointing pointer', google: 'valkoinen vasen osoitin') - - "◆": [T: "musta timantti"] # 0x25c6 (en: 'black diamond', google: 'musta timantti') - - "◇": [T: "valkoinen timantti"] # 0x25c7 (en: 'white diamond', google: 'valkoinen timantti') - - "◈": [T: "valkoinen timantti jonka sisĂ€llĂ€ musta timantti"] # 0x25c8 (en: 'white diamond containing black small diamond', google: 'valkoinen timantti, joka sisĂ€ltÀÀ mustan pienen timantin') - - "◉": [T: "valkoinen ympyrĂ€ jonka sisĂ€llĂ€ musta ympyrĂ€"] # 0x25c9 (en: 'fisheye', google: 'kalake') - - "◊": [T: "vinoneliö"] # 0x25ca (en: 'lozenge', google: 'pastilli') - - "○": [T: "valkoinen ympyrĂ€"] # 0x25cb (en: 'white circle') - - "◌": [T: "pisteympyrĂ€"] # 0x25cc (en: 'dotted circle', google: 'pisteympyrĂ€') - - "◍": [T: "ympyrĂ€ ja pystysuora viivoitus"] # 0x25cd (en: 'circle with vertical fill', google: 'ympyrĂ€ pystysuoralla tĂ€yttöÀ') - - "◎": [T: "kaksi sisĂ€kkĂ€istĂ€ ympyrÀÀ"] # 0x25ce (en: 'bullseye', google: 'bullseye') - - "●": [T: "musta ympyrĂ€"] # 0x25cf (en: 'black circle') - - "◐": [T: "ympyrĂ€ vasen puoli musta"] # 0x25d0 (en: 'circle with left half black', google: 'ympyrĂ€ vasemmalla puoliksi mustalla') - - "◑": [T: "ympyrĂ€ oikea puoli musta"] # 0x25d1 (en: 'circle with right half black', google: 'ympyrĂ€ oikealla puoliksi mustalla') - - "◒": [T: "ympyrĂ€ alapuoli musta"] # 0x25d2 (en: 'circle with lower half black', google: 'ympyrĂ€, jossa on alaosa musta') - - "◓": [T: "ympyrĂ€ ylĂ€puoli musta"] # 0x25d3 (en: 'circle with upper half black', google: 'ympyrĂ€ ylĂ€puoliskolla mustalla') - - "◔": [T: "ympyrĂ€ ylĂ€oikea neljĂ€nnes musta"] # 0x25d4 (en: 'circle with upper right quadrant black', google: 'ympyrĂ€ oikealla ylĂ€kulmalla kvadrantti musta') - - "◕": [T: "ympyrĂ€ ylĂ€vasen neljĂ€nnes mustaamatta"] # 0x25d5 (en: 'circle with all but upper left quadrant black', google: 'ympyrĂ€ kaikilla paitsi vasemmalla ylĂ€osalla mustaa') - - "◖": [T: "musta vasen puoliympyrĂ€"] # 0x25d6 (en: 'left half black circle', google: 'vasen puoli musta ympyrĂ€') - - "◗": [T: "musta oikea puoliympyrĂ€"] # 0x25d7 (en: 'right half black circle', google: 'oikea puoli musta ympyrĂ€') - - "◘": [T: "luetelmapallon negatiivi"] # 0x25d8 (en: 'inverse bullet', google: 'kÀÀnteinen luoti') - - "◙": [T: "valkoisen ympyrĂ€n negatiivi"] # 0x25d9 (en: 'inverse white circle', google: 'kÀÀnteinen valkoinen ympyrĂ€') - - "◚": [T: "valkoisen ympyrĂ€n negatiivin ylĂ€puoli"] # 0x25da (en: 'upper half inverse white circle', google: 'ylĂ€osa kÀÀnteinen valkoinen ympyrĂ€') - - "◛": [T: "valkoisen ympyrĂ€n negatiivin alapuoli"] # 0x25db (en: 'lower half inverse white circle', google: 'alempi puoli kÀÀnteinen valkoinen ympyrĂ€') - - "◜": [T: "ympyrĂ€n kaaren vasen ylĂ€neljĂ€nnes"] # 0x25dc (en: 'upper left quadrant circular arc', google: 'vasen ylĂ€osa kvadrantti pyöreĂ€ kaari') - - "◝": [T: "ympyrĂ€n kaaren oikea ylĂ€neljĂ€nnes"] # 0x25dd (en: 'upper right quadrant circular arc', google: 'oikea ylĂ€osa kvadrantti pyöreĂ€ kaari') - - "◞": [T: "ympyrĂ€n kaaren oikea alaneljĂ€nnes"] # 0x25de (en: 'lower right quadrant circular arc', google: 'oikea alaosa neljĂ€nneksen pyöreĂ€ kaari') - - "◟": [T: "ympyrĂ€n kaaren vasen alaneljĂ€nnes"] # 0x25df (en: 'lower left quadrant circular arc', google: 'vasen alakulmainen kvadrantti pyöreĂ€ kaari') - - "◠": [T: "ympyrĂ€n kaaren ylĂ€puolikas"] # 0x25e0 (en: 'upper half circle', google: 'ylĂ€osa ympyrĂ€') - - "◡": [T: "ympyrĂ€n kaaren alapuolikas"] # 0x25e1 (en: 'lower half circle', google: 'alempi puoli ympyrĂ€') - - "◱": [T: "musta oikea alakolmio"] # 0x25e2 (en: 'black lower right triangle', google: 'musta alaosa oikea kolmio') - - "◣": [T: "musta vasen alakolmio"] # 0x25e3 (en: 'black lower left triangle', google: 'musta vasen alaosa kolmio') - - "â—€": [T: "musta vasen ylĂ€kolmio"] # 0x25e4 (en: 'black upper left triangle', google: 'musta vasen ylĂ€osa kolmio') - - "â—„": [T: "musta oikea ylĂ€kolmio"] # 0x25e5 (en: 'black upper right triangle', google: 'musta oikea ylĂ€osa kolmio') - - "◩": [T: "valkoinen pallo"] # 0x25e6 (en: 'composition', google: 'sĂ€vellys') - - "◧": [T: "neliö vasen puoli musta"] # 0x25e7 (en: 'square with left half black', google: 'neliö vasemmalla puoliksi mustalla') - - "◹": [T: "neliö oikea puoli musta"] # 0x25e8 (en: 'square with right half black', google: 'neliö oikealla puoliksi mustalla') - - "◩": [T: "neliö vasen ylĂ€diagonaali musta"] # 0x25e9 (en: 'square with upper left half black', google: 'neliö vasemmalla ylĂ€osa mustalla') - - "â—Ș": [T: "neliö oikea aladiagonaali musta"] # 0x25ea (en: 'square with lower right half black', google: 'neliö oikealla alaosa mustalla') - - "◫": [T: "valkoinen neliö pystysuoralla poikkiviivalla"] # 0x25eb (en: 'white square with bisecting line', google: 'valkoinen neliö puolustamisviivalla') - - "◬": [T: "valkoinen ylös osoittava kolmio pisteellĂ€"] # 0x25ec (en: 'white up pointing triangle with dot', google: 'valkoinen osoittava kolmio pisteellĂ€') - - "◭": [T: "valkoinen ylös osoittava kolmio, vasen puoli musta"] # 0x25ed (en: 'up pointing triangle with left half black', google: 'ylöspĂ€in osoittaen kolmio vasemmalla puoliksi mustalla') - - "◼": [T: "valkoinen ylös osoittava kolmio, oikea puoli musta"] # 0x25ee (en: 'up pointing triangle with right half black', google: 'ylös osoittaen kolmio oikealla puoliksi mustalla') - - "◯": [T: "valkoinen ympyrĂ€"] # 0x25ef (en: 'large circle', google: 'suuri ympyrĂ€') - - "◰": [T: "valkoinen neliö josta on erotettu ylĂ€vasen neljĂ€nnes"] # 0x25f0 (en: 'white square with upper left quadrant', google translation) - - "◱": [T: "valkoinen neliö josta on erotettu alavasen neljĂ€nnes"] # 0x25f1 (en: 'white square with lower left quadrant', google translation) - - "â—Č": [T: "valkoinen neliö josta on erotettu alaoikea neljĂ€nnes"] # 0x25f2 (en: 'white square with lower right quadrant', google translation) - - "◳": [T: "valkoinen neliö josta on erotettu ylĂ€oikea neljĂ€nnes"] # 0x25f3 (en: 'white square with upper right quadrant', google translation) - - "◮": [T: "valkoinen ympyrĂ€ josta on erotettu ylĂ€vasen neljĂ€nnes"] # 0x25f4 (en: 'white circle with upper left quadrant', google translation) - - "â—”": [T: "valkoinen ympyrĂ€ josta on erotettu alavasen neljĂ€nnes"] # 0x25f5 (en: 'white circle with lower left quadrant', google translation) - - "◶": [T: "valkoinen ympyrĂ€ josta on erotettu alaoikea neljĂ€nnes"] # 0x25f6 (en: 'white circle with lower right quadrant', google translation) - - "◷": [T: "valkoinen ympyrĂ€ josta on erotettu ylĂ€oikea neljĂ€nnes"] # 0x25f7 (en: 'white circle with upper right quadrant', google translation) - - "◾": [T: "ylĂ€vasen kolmio"] # 0x25f8 (en: 'upper left triangle', google: 'vasen ylĂ€osa kolmio') - - "â—č": [T: "ylĂ€oikea kolmio"] # 0x25f9 (en: 'upper right triangle', google: 'oikea ylĂ€osa kolmio') - - "â—ș": [T: "alavasen kolmio"] # 0x25fa (en: 'lower left triangle', google: 'vasen alaosa kolmio') - - "◻": [T: "keskikokoinen valkoinen neliö"] # 0x25fb (en: 'white medium square', google: 'valkoinen keskipitkĂ€ neliö') - - "â—Œ": [T: "keskikokoinen musta neliö"] # 0x25fc (en: 'black medium square', google: 'musta keskipitkĂ€ neliö') - - "â—œ": [T: "pienehkö valkoinen neliö"] # 0x25fd (en: 'white medium small square', google: 'valkoinen keskipitkĂ€ pieni neliö') - - "â—Ÿ": [T: "pienehkö musta neliö"] # 0x25fe (en: 'black medium small square', google: 'musta keskipitkĂ€ pieni neliö') - - "◿": [T: "alaoikea kolmio"] # 0x25ff (en: 'lower right triangle', google: 'oikea alaosa kolmio') - - "♠": [T: "musta pata"] # 0x2660 (en: 'black spade suit', google: 'musta lapio puku') - - "♡": [T: "valkoinen hertta"] # 0x2661 (en: 'white heart suit', google: 'valkoinen sydĂ€npuku') - - "♱": [T: "valkoinen ruutu"] # 0x2662 (en: 'white diamond suit', google: 'valkoinen timanttipuku') - - "♣": [T: "musta risti"] # 0x2663 (en: 'black club suit', google: 'mustakerhopuku') - - "♀": [T: "valkoinen pata"] # 0x2664 (en: 'white spade suit', google: 'valkoinen lapiopuku') - - "♄": [T: "musta hertta"] # 0x2665 (en: 'black heart suit', google: 'musta sydĂ€npuku') - - "♩": [T: "musta ruutu"] # 0x2666 (en: 'black diamond suit', google: 'musta timanttipuku') - - "♧": [T: "valkoinen risti"] # 0x2667 (en: 'white club suit', google: 'valkoinen klubipuku') - - "❚": [T: "keskikokoinen vasen sulkukoriste"] # 0x2768 (en: 'medium left parentheses ornament', google translation) - - "❩": [T: "keskikokoinen oikea sulkukoriste"] # 0x2769 (en: 'medium right parentheses ornament', google translation) - - "âȘ": [T: "keskikokoinen litistetty vasen sulkukoriste"] # 0x276a (en: 'medium flattened left parentheses ornament', google translation) - - "❫": [T: "keskikokoinen litistetty oikea sulkukoriste"] # 0x276b (en: 'medium flattened right parentheses ornament', google translation) - - "❬": [T: "keskikokoinen vasen kulmasulkukoriste"] # 0x276c (en: 'medium left-pointing angle bracket ornament', google translation) - - "❭": [T: "keskikokoinen oikea kulmasulkukoriste"] # 0x276d (en: 'medium right-pointing angle bracket ornament', google translation) - - "❼": [T: "raskas vasen kulmalainausmerkkikoriste"] # 0x276e (en: 'heavy left-pointing angle quotation mark ornament', google translation) - - "❯": [T: "raskas oikea kulmalainausmerkkikoriste"] # 0x276f (en: 'heavy right-pointing angle quotation mark ornament', google translation) - - "❰": [T: "raskas vasen kulmasulkukoriste"] # 0x2770 (en: 'heavy left-pointing angle bracket ornament', google translation) - - "❱": [T: "raskas oikea kulmasulkukoriste"] # 0x2771 (en: 'heavy right-pointing angle bracket ornament', google translation) - - "âČ": [T: "kevyt vasen kilpikonnankuorisulkukoriste"] # 0x2772 (en: 'light left tortoise shell bracket ornament', google translation) - - "❳": [T: "kevyt oikea kilpikonnankuorisulkukoriste"] # 0x2773 (en: 'light right tortoise shell bracket ornament', google translation) - - "❎": [T: "keskikokoinen vasen aaltosulkukoriste"] # 0x2774 (en: 'medium left brace ornament', google translation) - - "❔": [T: "keskikokoinen oikea aaltosulkukoriste"] # 0x2775 (en: 'medium right brace ornament', google translation) - - "❶": [T: "musta ympyröity yksi"] # 0x2776 (en: 'black circled one', google translation) - - "❷": [T: "musta ympyröity kaksi"] # 0x2777 (en: 'black circled two', google translation) - - "❞": [T: "musta ympyröity kolme"] # 0x2778 (en: 'black circled three', google translation) - - "âč": [T: "musta ympyröity neljĂ€"] # 0x2779 (en: 'black circled four', google translation) - - "âș": [T: "musta ympyröity viisi"] # 0x277a (en: 'black circled five', google translation) - - "❻": [T: "musta ympyröity kuusi"] # 0x277b (en: 'black circled six', google translation) - - "❌": [T: "musta ympyröity seitsemĂ€n"] # 0x277c (en: 'black circled seven', google translation) - - "❜": [T: "musta ympyröity kahdeksan"] # 0x277d (en: 'black circled eight', google translation) - - "❟": [T: "musta ympyröity yhdeksĂ€n"] # 0x277e (en: 'black circled nine', google translation) - - "❿": [T: "musta ympyröity kymmenen"] # 0x277f (en: 'black circled ten', google translation) - - "➀": [T: "ympyröity sans serif yksi"] # 0x2780 (en: 'circled sans serif one', google translation) - - "➁": [T: "ympyröity sans serif kaksi"] # 0x2781 (en: 'circled sans serif two', google translation) - - "➂": [T: "ympyröity sans serif kolme"] # 0x2782 (en: 'circled sans serif three', google translation) - - "➃": [T: "ympyröity sans serif neljĂ€"] # 0x2783 (en: 'circled sans serif four', google translation) - - "➄": [T: "ympyröity sans serif viisi"] # 0x2784 (en: 'circled sans serif five', google translation) - - "➅": [T: "ympyröity sans serif kuusi"] # 0x2785 (en: 'circled sans serif six', google translation) - - "➆": [T: "ympyröity sans serif seitsemĂ€n"] # 0x2786 (en: 'circled sans serif seven', google translation) - - "➇": [T: "ympyröity sans serif kahdeksan"] # 0x2787 (en: 'circled sans serif eight', google translation) - - "➈": [T: "ympyröity sans serif yhdeksĂ€n"] # 0x2788 (en: 'circled sans serif nine', google translation) - - "➉": [T: "ympyröity sans serif kymmenen"] # 0x2789 (en: 'circled sans serif ten', google translation) - - "➊": [T: "musta ympyröity sans serif yksi"] # 0x278a (en: 'black circled sans serif one', google translation) - - "➋": [T: "musta ympyröity sans serif kaksi"] # 0x278b (en: 'black circled sans serif two', google translation) - - "➌": [T: "musta ympyröity sans serif kolme"] # 0x278c (en: 'black circled sans serif three', google translation) - - "➍": [T: "musta ympyröity sans serif neljĂ€"] # 0x278d (en: 'black circled sans serif four', google translation) - - "➎": [T: "musta ympyröity sans serif viisi"] # 0x278e (en: 'black circled sans serif five', google translation) - - "➏": [T: "musta ympyröity sans serif kuusi"] # 0x278f (en: 'black circled sans serif six', google translation) - - "➐": [T: "musta ympyröity sans serif seitsemĂ€n"] # 0x2790 (en: 'black circled sans serif seven', google translation) - - "➑": [T: "musta ympyröity sans serif kahdeksan"] # 0x2791 (en: 'black circled sans serif eight', google translation) - - "➒": [T: "musta ympyröity sans serif yhdeksĂ€n"] # 0x2792 (en: 'black circled sans serif nine', google translation) - - "➓": [T: "musta ympyröity sans serif kymmenen"] # 0x2793 (en: 'black circled sans serif ten', google translation) - - "➔": [T: "raskas leveĂ€pĂ€inen oikea nuoli"] # 0x2794 (en: 'heavy wide-headed rightwards arrow', google translation) - - "➕": [T: "raskas plusmerkki"] # 0x2795 (en: 'heavy plus sign', google translation) - - "➖": [T: "raskas miinusmerkki"] # 0x2796 (en: 'heavy minus sign', google translation) - - "➗": [T: "raskas jakomerkki"] # 0x2797 (en: 'heavy division sign', google translation) - - "➘": [T: "raskas alaoikea nuoli"] # 0x2798 (en: 'heavy south east arrow', google translation) - - "➙": [T: "raskas oikea nuoli"] # 0x2799 (en: 'heavy rightwards arrow', google translation) - - "➚": [T: "raskas ylĂ€oikea nuoli"] # 0x279a (en: 'heavy north east arrow', google translation) - - "➛": [T: "laatimispiste oikealle nuoli"] # 0x279b (en: 'drafting point rightwards arrow', google translation) - - "➜": [T: "raskas pyöristetty oikea nuoli"] # 0x279c (en: 'heavy round-tipped rightwards arrow', google translation) - - "➝": [T: "kolmionpĂ€inen oikea nuoli"] # 0x279d (en: 'triangle-headed rightwards arrow', google translation) - - "➞": [T: "raskas kolmiopĂ€inen oikea nuoli"] # 0x279e (en: 'heavy triangle-headed rightwards arrow', google translation) - - "➟": [T: "kolmiopĂ€inen oikea nuoli katkoviivalla"] # 0x279f (en: 'dashed triangle-headed rightwards arrow', google translation) - - "➠": [T: "raskas kolmiopĂ€inen oikea nuoli katkoviivalla"] # 0x27a0 (en: 'heavy dashed triangle-headed rightwards arrow', google translation) - - "➡": [T: "oikealle osoittava musta nuoli"] # 0x27a1 (en: 'black rightwards arrow', google translation) - - "➱": [T: "ylĂ€puolelta valkea oikealle osoittava nuolenpÀÀ"] # 0x27a2 (en: 'three d top lighted rightwards arrow', google translation) - - "➣": [T: "alapuolelta valkea oikealle osoittava nuolenpÀÀ"] # 0x27a3 (en: 'three d bottom lighted rightwards arrow', google translation) - - "➀": [T: "musta oikea nuolenpÀÀ"] # 0x27a4 (en: 'black rightwards arrowhead', google translation) - - "➄": [T: "raskas musta kaareva alas ja oikealle osoittava nuoli"] # 0x27a5 (en: 'heavy black curved downwards and rightwards arrow', google translation) - - "➊": [T: "raskas musta kaareva ylös ja oikealle osoittava nuoli"] # 0x27a6 (en: 'heavy black curved upwards and rightwards arrow', google translation) - - "➧": [T: "raskas musta lyhyt oikea nuoli"] # 0x27a7 (en: 'squat black rightwards arrow', google translation) - - "➚": [T: "raskas terĂ€vĂ€ musta oikea nuoli"] # 0x27a8 (en: 'heavy concave-pointed black rightwards arrow', google translation) - - "➩": [T: "oikea oikealle varjostettu valkoinen nuoli"] # 0x27a9 (en: 'right-shaded white rightwards arrow', google translation) - - "âžȘ": [T: "oikea vasemmalle varjostettu valkoinen nuoli"] # 0x27aa (en: 'left-shaded white rightwards arrow', google translation) - - "➫": [T: "taaksepĂ€in kallistettu varjostettu valkoinen oikealle osoittava nuoli"] # 0x27ab (en: 'back-tilted shadowed white rightwards arrow', google translation) - - "➬": [T: "eteenpĂ€in kallistettu varjostettu valkoinen oikealle osoittava nuoli"] # 0x27ac (en: 'front-tilted shadowed white rightwards arrow', google translation) - - "➭": [T: "raskas oikea alhaalta varjostettu valkoinen nuoli"] # 0x27ad (en: 'heavy lower right-shadowed white rightwards arrow', google translation) - - "➼": [T: "raskas oikea ylhÀÀltĂ€ varjostettu valkoinen nuoli"] # 0x27ae (en: 'heavy upper right-shadowed white rightwards arrow', google translation) - - "➯": [T: "raskas oikea alhaalta varjostettu valkoinen nuoli lovella"] # 0x27af (en: 'notched lower right-shadowed white rightwards arrow', google translation) - - "➱": [T: "raskas oikea ylhÀÀltĂ€ varjostettu valkoinen nuoli lovella"] # 0x27b1 (en: 'notched upper right-shadowed white rightwards arrow', google translation) - - "âžČ": [T: "ympyröity raskas oikea valkoinen nuoli"] # 0x27b2 (en: 'circled heavy white rightwards arrow', google translation) - - "➳": [T: "oikea nuoli valkoisilla höyhenillĂ€"] # 0x27b3 (en: 'white-feathered rightwards arrow', google translation) - - "➮": [T: "alaoikea nuoli mustilla höyhenillĂ€"] # 0x27b4 (en: 'black-feathered south east arrow', google translation) - - "➔": [T: "oikea nuoli mustilla höyhenillĂ€"] # 0x27b5 (en: 'black-feathered rightwards arrow', google translation) - - "➶": [T: "ylĂ€oikea nuoli mustilla höyhenillĂ€"] # 0x27b6 (en: 'black-feathered north east arrow', google translation) - - "➷": [T: "raskas alaoikea nuoli mustilla höyhenillĂ€"] # 0x27b7 (en: 'heavy black-feathered south east arrow', google translation) - - "➾": [T: "raskas oikea nuoli mustilla höyhenillĂ€"] # 0x27b8 (en: 'heavy black-feathered rightwards arrow', google translation) - - "âžč": [T: "raskas ylĂ€oikea nuoli mustilla höyhenillĂ€"] # 0x27b9 (en: 'heavy black-feathered north east arrow', google translation) - - "âžș": [T: "oikea nuoli kyynelpiikillĂ€"] # 0x27ba (en: 'teradrop-barbed rightwards arrow', google translation) - - "➻": [T: "raskas nuoli kyynelpiikillĂ€"] # 0x27bb (en: 'heavy teardrop-shanked rightwards arrow', google translation) - - "➌": [T: "oikea nuoli kiilalla"] # 0x27bc (en: 'wedge-tailed rightwards arrow', google translation) - - "➜": [T: "raskas oikea nuoli kiilalla"] # 0x27bd (en: 'heavy wedge-tailed rightwards arrow', google translation) - - "➟": [T: "oikea ÀÀriviivanuoli"] # 0x27be (en: 'open-outlined rightwards arrow', google translation) - - "⟀": [T: "kolmiulotteinen kulma"] # 0x27c0 (en: 'three dimensional angle') - - "⟁": [T: "kaksi valkoista kolmiota sisĂ€kkĂ€in"] # 0x27c1 (en: 'white triangle containing small white triangle', google: 'valkoinen kolmio, joka sisĂ€ltÀÀ pientĂ€ valkoista kolmiota') - - "⟂": # 0x27c2 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "kohtisuora" # (en: 'perpendicular to', google: 'kohtisuorassa') - - "⟃": # 0x27c3 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "avoin osajoukko" # (en: 'an open subset of') - - "⟄": # 0x27c4 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "avoin ylĂ€joukko" # (en: 'an open superset of', google: 'avoin superset') - - "⟅": [T: "vasen s-muotoinen laukkuerottaja"] # 0x27c5 (google: 'vasen s-muotoinen laukku') - - "⟆": [T: "oikea s-muotoinen laukkuerottaja"] # 0x27c6 (google: 'oikea s-muotoinen laukku') - - "⟇": [T: "tai pisteellĂ€"] # 0x27c7 (en: 'or with dot inside', google: 'tai pisteellĂ€ sisĂ€llĂ€') - - "⟈": [T: "kenoviiva osajoukko"] # 0x27c8 (en: 'reverse solidus preceding subset', google: 'kÀÀnteinen solidus edeltĂ€vĂ€ alajoukko') - - "⟉": [T: "ylijoukko vinoviiva"] # 0x27c9 (en: 'superset preceding solidus', google: 'superset edeltĂ€vĂ€ solidus') - - "⟊": [T: "pystyviiva vaakasuoralla poikkiviivalla"] # 0x27ca (en: 'vertical bar with horizontal stroke', google: 'pystysuora palkki vaakasuuntaisella iskulla') - - "⟋": [T: "matemaattinen nouseva diagonaali"] # 0x27cb (en: 'mathematical rising diagonal', google translation) - - "⟌": [T: "jakokulma"] # 0x27cc (en: 'long division', google: 'jakolaskutoimitus') - - "⟍": [T: "matemaattinen laskeva diagonaali"] # 0x27cd (en: 'mathematical falling diagonal', google translation) - - "⟎": [T: "looginen ja neliössĂ€"] # 0x27ce (en: 'squared logical and', google translation) - - "⟏": [T: "looginen tai neliössĂ€"] # 0x27cf (en: 'squared logical or', google translation) - - "⟐": [T: "valkoinen timantti keskitetyllĂ€ pisteellĂ€"] # 0x27d0 (en: 'white diamond with centered dot', google translation) - - "⟑": [T: "ja pisteellĂ€"] # 0x27d1 (en: 'and with dot', google: 'ja pisteellĂ€') - - "⟒": [T: "ylös aukeava kuuluu joukkoon"] # 0x27d2 (en: 'element of opening upwards', google: 'elementti avaamisesta ylöspĂ€in') - - "⟓": [T: "oikea alakulma pisteellĂ€"] # 0x27d3 (en: 'lower right corner with dot', google: 'oikea alakulma pisteellĂ€') - - "⟔": [T: "vasen alakulma pisteellĂ€"] # 0x27d4 (en: 'upper left corner with dot', google: 'vasen ylĂ€kulma pisteellĂ€') - - "⟕": [T: "vasen ulkoinen liitos"] # 0x27d5 (google: 'vasen ulkoinen liittyminen') - - "⟖": [T: "oikea ulkoinen liitos"] # 0x27d6 (google: 'oikea ulkoinen liittyminen') - - "⟗": [T: "tĂ€ysi ulkoinen liitos"] # 0x27d7 (google: 'tĂ€ysi ulkoinen liittyminen') - - "⟘": [T: "suuri nupi ylöspĂ€in"] # 0x27d8 (google: 'suuri ylöspĂ€in') - - "⟙": [T: "suuri nupi alaspĂ€in"] # 0x27d9 (google: 'suuri alaspĂ€in') - - "⟚": [T: "tuplaportti vasemmalle ja oikealle"] # 0x27da (google: 'vasen ja oikea kaksoiskivi') - - "⟛": [T: "vasen ja oikea nupi"] # 0x27db (google: 'vasen ja oikea tarttuva') - - "⟜": [T: "vasen monikuvaus"] # 0x27dc (google: 'vasen multimep') # FI: meaning unclear - - "⟝": [T: "pitkĂ€ oikea nupi"] # 0x27dd (google: 'pitkĂ€ oikea tarttuva') - - "⟞": [T: "pitkĂ€ vasen nupi"] # 0x27de (google: 'pitkĂ€ vasen tarttuva') - - "⟟": [T: "nupi ylös ympyrĂ€llĂ€"] # 0x27df (en: 'up tack with circle above', google: 'yllĂ€ oleva ympyrĂ€') - - "⟠": [T: "vinoneliö vaakaviivalla"] # 0x27e0 (google: 'lozenge jaettuna vaakasuunnassa') - - "⟡": [T: "valkoinen terĂ€vĂ€ timantti"] # 0x27e1 (google: 'valkoinen koverapuolinen timantti') - - "⟱": [T: "valkoinen terĂ€vĂ€ timantti vasemmanpuoleisella nupilla"] # 0x27e2 (en: 'white concave sided diamond with leftwards tick', google: 'valkoinen koverapuolinen timantti vasemmalla rastilla') - - "⟣": [T: "valkoinen terĂ€vĂ€ timantti oikeanpuoleisella nupilla"] # 0x27e3 (en: 'white concave sided diamond with rightwards tick', google: 'valkoinen koverapuolinen timantti oikealla puolella') - - "⟀": [T: "valkoinen neliö vasemmanpuoleisella nupilla"] # 0x27e4 (en: 'white square with leftwards tick', google: 'valkoinen neliö vasemmalla rastilla') - - "⟄": [T: "valkoinen neliö oikeanpuoleisella nupilla"] # 0x27e5 (en: 'white square with rightwards tick', google: 'valkoinen neliö oikealla puolella') - - "⟩": [T: "valkoinen vasen hakasulku"] # 0x27e6 (en: 'left white square bracket', google: 'vasen valkoinen neliömĂ€ki') - - "⟧": [T: "valkoinen oikea hakasulku"] # 0x27e7 (en: 'right white square bracket', google: 'oikea valkoinen neliömĂ€ki') - - "⟹": [T: "vasen kulmasulku"] # 0x27e8 (en: 'left angle bracket', google: 'vasemman kulman kiinnike') - - "⟩": [T: "oikea kulmasulku"] # 0x27e9 (en: 'right angle bracket', google: 'suoren kulman kiinnike') - - "âŸȘ": [T: "vasen kaksoiskulmasulku"] # 0x27ea (en: 'left double angle bracket', google: 'vasen kaksoiskulma kiinnike') - - "⟫": [T: "oikea kaksoiskulmasulku"] # 0x27eb (en: 'right double angle bracket', google: 'oikea kaksoiskulma kiinnike') - - "⟬": [T: "vasen valkoinen kilpikonnankuorisulku"] # 0x27ec (google: 'vasen valkoinen kilpikonnakuoren kiinnike') - - "⟭": [T: "oikea valkoinen kilpikonnankuorisulku"] # 0x27ed (google: 'oikea valkoinen kilpikonnakuoren kiinnike') - - "⟼": [T: "vasen litistetty sulku"] # 0x27ee (google: 'vasen litistetty sulkuteesi') - - "⟯": [T: "oikea litistetty sulku"] # 0x27ef (google: 'oikea litistetty sulkuteesi') - - "⟰": [T: "nelinkertainen nuoli ylös"] # 0x27f0 (en: 'upwards quadruple arrow', google translation) - - "⟱": [T: "nelinkertainen nuoli alas"] # 0x27f1 (en: 'downwards quadruple arrow', google translation) - - "âŸČ": [T: "avoin ympyrĂ€nuoli vastapĂ€ivÀÀn"] # 0x27f2 (en: 'anticlockwise gapped circle arrow', google translation) - - "⟳": [T: "avoin ympyrĂ€nuoli myötĂ€pĂ€ivÀÀn"] # 0x27f3 (en: 'clockwise gapped circle arrow', google translation) - - "⟮": [T: "oikea nuoli ympyröidyllĂ€ plus-merkillĂ€"] # 0x27f4 (en: 'right arrow with circled plus', google translation) - - "⟔": [T: "pitkĂ€ nuoli vasemmalle"] # 0x27f5 (en: 'long leftwards arrow', google: 'pitkĂ€ vasen nuoli') - - "⟶": [T: "pitkĂ€ nuoli oikealle"] # 0x27f6 (en: 'long rightwards arrow', google: 'pitkĂ€ oikea nuoli') - - "⟷": [T: "pitkĂ€ nuoli vasemmalle ja oikealle"] # 0x27f7 (en: 'long left right arrow', google: 'pitkĂ€ vasen oikea nuoli') - - "⟾": [T: "pitkĂ€ kaksoisnuoli vasemmalle"] # 0x27f8 (en: 'long leftwards double arrow', google: 'pitkĂ€ vasen kaksinkertainen nuoli') - - "âŸč": [T: "pitkĂ€ kaksoisnuoli oikealle"] # 0x27f9 (en: 'long rightwards double arrow', google: 'pitkĂ€ oikea kaksinkertainen nuoli') - - "âŸș": [T: "pitkĂ€ kaksoisnuoli vasemmalle ja oikealle"] # 0x27fa (en: 'long left right double arrow', google: 'pitkĂ€ vasen oikea kaksinkertainen nuoli') - - "⟻": [T: "pitkĂ€ vasen nuoli pystyviivasta"] # 0x27fb (en: 'long leftwards arrow from bar', google translation) - - "⟌": [T: "pitkĂ€ oikea nuoli pystyviivasta"] # 0x27fc (en: 'long rightwards arrow from bar', google: 'pitkĂ€ oikea nuoli baarista') - - "⟜": [T: "pitkĂ€ vasen kaksinkertainen nuoli pystyviivasta"] # 0x27fd (en: 'long leftwards double arrow from bar', google translation) - - "⟟": [T: "pitkĂ€ oikea kaksinkertainen nuoli pystyviivasta"] # 0x27fe (en: 'long rightwards double arrow from bar', google translation) - - "⟿": [T: "pitkĂ€ kiemuranuoli oikealle"] # 0x27ff (en: 'long rightwards squiggle arrow', google: 'pitkĂ€ oikeassa nuoli') - - " ": [T: "oikea kaksipĂ€inen nuoli pystysuoralla viivalla"] # 0x2900 (en: 'rightwards two headed arrow with vertical stroke', google translation) - - " ": [T: "oikea kaksipĂ€inen nuoli kaksinkertaisella pystysuoralla viivalla"] # 0x2901 (en: 'rightwards two headed arrow with double vertical stroke', google translation) - - " ": [T: "vasen kaksinkertainen nuoli pystysuoralla viivalla"] # 0x2902 (en: 'leftwards double arrow with vertical stroke', google translation) - - " ": [T: "oikea kaksinkertainen nuoli pystysuoralla viivalla"] # 0x2903 (en: 'rightwards double arrow with vertical stroke', google translation) - - " ": [T: "vasemmalle ja oikealle osoittava kaksinkertainen nuoli pystysuoralla viivalla"] # 0x2904 (en: 'left right double arrow with vertical stroke', google translation) - - " ": [T: "oikea kaksipĂ€inen nuoli pystyviivasta"] # 0x2905 (google: 'oikealle kaksi pÀÀtĂ€ nuoli baarista') - - " ": [T: "vasen kaksinkertainen nuoli pystyviivasta"] # 0x2906 (en: 'leftwards double arrow from bar', google translation) - - " ": [T: "oikea kaksinkertainen nuoli pystyviivasta"] # 0x2907 (en: 'rightwards double arrow from bar', google translation) - - " ": [T: "alaspĂ€in osoittava nuoli vaakaviivalla"] # 0x2908 (en: 'downwards arrow with horizontal stroke', google translation) - - " ": [T: "ylöspĂ€in osoittava nuoli vaakaviivalla"] # 0x2909 (en: 'upwards arrow with horizontal stroke', google translation) - - " ": [T: "ylöspĂ€in osoittava kolminkertainen nuoli"] # 0x290a (en: 'upwards triple arrow', google translation) - - "​": [T: "alaspĂ€in osoittava kolminkertainen nuoli"] # 0x290b (en: 'downwards triple arrow', google translation) - - "‌": [T: "vasen kaksoiskatkoviivannuoli"] # 0x290c (google: 'vasen kaksinkertainen viiva nuoli') - - "‍": [T: "oikea kaksoiskatkoviivanuoli"] # 0x290d (google: 'oikealla puolella kaksoisnauhaa') - - "‎": [T: "vasen kolmoiskatkoviivanuoli"] # 0x290e (google: 'vasen kolminkertainen viiva nuoli') - - "‏": [T: "oikea kolmoiskatkoviivanuoli"] # 0x290f (google: 'oikealle kolminkertainen dash -nuoli') - - "‐": [T: "oikea kaksipĂ€inen katkoviivanuoli pyrstöllĂ€"] # 0x2910 (google: 'oikealle kaksi pÀÀtĂ€ kolminkertainen viiva nuoli') - - "‑": [T: "oikea pisteviivanuoli"] # 0x2911 (en: 'rightwards arrow with dotted stem', google: 'oikealla nuolella katkoviivalla') - - "‒": [T: "nuoli ylös vaakaviivaan"] # 0x2912 (google: 'nuoli ylöspĂ€in baariin') - - "–": [T: "nuoli alas vaakaviivaan"] # 0x2913 (google: 'alaspĂ€in nuoli baariin') - - "—": [T: "oikea nuoli pystyviivalla ja pyrstöllĂ€"] # 0x2914 (en: 'rightwards arrow with tail and vertical stroke', google translation) - - "―": [T: "oikea nuoli kaksoispystyviivalla ja pyrstöllĂ€"] # 0x2915 (en: 'rightwards arrow with tail and double vertical stroke', google translation) - - "‖": [T: "oikea kaksipĂ€inen nuoli pyrstöllĂ€"] # 0x2916 (en: 'rightwards two headed arrow with tail', google: 'oikealle kaksi pÀÀtĂ€ nuoli hĂ€nnĂ€n kanssa') - - "‗": [T: "oikea kaksipĂ€inen nuoli pystyviivalla ja pyrstöllĂ€"] # 0x2917 (en: 'rightwards two headed arrow with tail with vertical stroke', google translation) - - "‘": [T: "oikea kaksipĂ€inen nuoli kaksoispystyviivalla ja pyrstöllĂ€"] # 0x2918 (en: 'rightwards two headed arrow with tail with double vertical stroke', google translation) - - "’": [T: "vasemmanpuoleisen nuolen hĂ€ntĂ€"] # 0x2919 (google: 'vasen nuoli hĂ€ntĂ€') - - "‚": [T: "oikeanpuoleisen nuolen hĂ€ntĂ€"] # 0x291a (en: 'rightwards arrow tail', google translation) - - "‛": [T: "vasemmanpuoleisen nuolen tuplahĂ€ntĂ€"] # 0x291b (google: 'vasen kaksinkertainen nuoli hĂ€ntĂ€') - - "“": [T: "oikeanpuoleisen nuolen tuplahĂ€ntĂ€"] # 0x291c (google: 'oikealla kaksoisnuoli') - - "”": [T: "vasen nuoli vĂ€ritettyyn timanttiin"] # 0x291d (google: 'vasen nuoli tĂ€ytetylle timantille') - - "„": [T: "oikea nuoli vĂ€ritettyyn timanttiin"] # 0x291e (google: 'oikealla nuolella tĂ€ytetylle timantille') - - "‟": [T: "vasen nuoli pystyviivasta vĂ€ritettyyn timanttiin"] # 0x291f (google: 'vasen nuoli baarista tĂ€ytetylle timantille') - - "†": [T: "oikea nuoli pystyviivasta vĂ€ritettyyn timanttiin"] # 0x2920 (google: 'suoraan nuoli baarista tĂ€ytetylle timantille') - - "‥": [T: "ylĂ€vasemmalle ja alaoikealle osoittava nuoli"] # 0x2921 (en: 'north west and south east arrow', google translation) - - "‹": [T: "ylĂ€oikealle ja alavasemmalle osoittava nuoli"] # 0x2922 (en: 'north east and south west arrow', google translation) - - "‣": [T: "ylĂ€vasen nuoli koukulla"] # 0x2923 (en: 'north west arrow with hook', google: 'luoteis -nuoli koukulla') - - " ": [T: "ylĂ€oikea nuoli koukulla"] # 0x2924 (en: 'north east arrow with hook', google: 'koillis -nuoli koukulla') - - " ": [T: "alaoikea nuoli koukulla"] # 0x2925 (en: 'south east arrow with hook', google: 'kaakkois -nuoli koukulla') - - " ": [T: "alavasen nuoli koukulla"] # 0x2926 (en: 'south west arrow with hook', google: 'lounais -nuoli koukulla') - - "‧": [T: "nuoli ylĂ€oikealle ja nuoli ylĂ€vasemmalle"] # 0x2927 (google: 'luoteis arrow ja koillis -nuoli') - - "‚": [T: "nuoli ylĂ€oikealle ja nuoli alaoikealle"] # 0x2928 (google: 'koillis -nuoli ja kaakkois -nuoli') - - "
": [T: "nuoli alaoikealle ja nuoli alavasemmalle"] # 0x2929 (google: 'kaakkois arrow ja south west arrow') - - "â€Ș": [T: "nuoli alavasemmalle ja nuoli ylĂ€vasemmalle"] # 0x292a (google: 'south west arrow ja north west arrow') - - "‫": [T: "nouseva diagonaali laskevan diagonaalin pÀÀllĂ€"] # 0x292b (en: 'rising diagonal crossing falling diagonal', google translation) - - "‏": [T: "laskeva diagonaali nousevan diagonaalin pÀÀllĂ€"] # 0x292c (en: 'falling diagonal crossing rising diagonal', google translation) - - "‭": [T: "alaoikealle osoittava nuoli ylĂ€oikealle osoittavan nuolen pÀÀllĂ€"] # 0x292d (en: 'south east arrow crossing north east arrow', google translation) - - "‟": [T: "ylĂ€oikealle osoittava nuoli alaoikealle osoittavan nuolen pÀÀllĂ€"] # 0x292e (en: 'north east arrow crossing south east arrow', google translation) - - " ": [T: "laskeva diagonaali ylĂ€oikealle osoittavan nuolen pÀÀllĂ€"] # 0x292f (en: 'falling diagonal crossing north east arrow', google translation) - - "‰": [T: "nouseva diagonaali alaoikealle osoittavan nuolen pÀÀllĂ€"] # 0x2930 (en: 'rising diagonal crossing south east arrow', google translation) - - "‱": [T: "ylĂ€oikealle osoittava nuoli ylĂ€vasemmalle osoittavan nuolen pÀÀllĂ€"] # 0x2931 (en: 'north east arrow crossing north west arrow', google translation) - - "â€Č": [T: "ylĂ€vasemmalle osoittava nuoli ylĂ€oikealle osoittavan nuolen pÀÀllĂ€"] # 0x2932 (en: 'north west arrow crossing north east arrow', google translation) - - "″": [T: "aaltonuoli oikealle"] # 0x2933 (en: 'wave arrow pointing directly right', google: 'aalto nuoli osoittaa suoraan oikealle') - - "‎": [T: "ylöspĂ€in kaartuva oikea nuoli"] # 0x2934 (en: 'arrow pointing rightwards then curving upwards', google translation) - - "—": [T: "alaspĂ€in kaartuva oikea nuoli"] # 0x2935 (google: 'nuoli osoittaa oikealle ja kaareutuu alaspĂ€in') - - "‶": [T: "vasemmalle kaartuva alavasemmalle osoittava nuoli"] # 0x2936 (google: 'nuoli osoittaa alaspĂ€in ja kaareutuu vasemmalle') - - "‷": [T: "oikealle kaartuva alaoikealle osoittava nuoli"] # 0x2937 (google: 'nuoli osoittaa alaspĂ€in ja kaareutuu oikealle') - - "„": [T: "oikeanpuoleinen kaarinuoli myötĂ€pĂ€ivÀÀn"] # 0x2938 (en: 'right side arc clockwise arrow', google: 'oikea sivukaari myötĂ€pĂ€ivÀÀn nuoli') - - "â€č": [T: "vasemmanpuoleinen kaarinuoli vastapĂ€ivÀÀn"] # 0x2939 (en: 'left side arc anticlockwise arrow', google: 'vasen sivukaari vastapĂ€ivÀÀn') - - "â€ș": [T: "ylĂ€kaarinuoli vastapĂ€ivÀÀn"] # 0x293a (en: 'top arc anticlockwise arrow', google translation) - - "※": [T: "alakaarinuoli vastapĂ€ivÀÀn"] # 0x293b (en: 'bottom arc anticlockwise arrow', google translation) - - "‌": [T: "ylĂ€kaarinuoli myötĂ€pĂ€ivÀÀn miinus-merkillĂ€"] # 0x293c (en: 'top arc clockwise arrow with minus', google: 'ylĂ€kaari myötĂ€pĂ€ivÀÀn nuoli miinus') - - "“": [T: "ylĂ€kaarinuoli vastapĂ€ivÀÀn plus-merkillĂ€"] # 0x293d (en: 'top arc anticlockwise arrow with plus', google: 'ylĂ€kaari vastapĂ€ivÀÀn nuoli plus') - - "‟": [T: "alaoikea kaarinuoli myötĂ€pĂ€ivÀÀn"] # 0x293e (en: 'lower right semicircular clockwise arrow', google translation) - - "‿": [T: "alavasen kaarinuoli vastapĂ€ivÀÀn"] # 0x293f (en: 'lower left semicircular anticlockwise arrow', google translation) - - "â„€": [T: "suljettu ympyrĂ€nuoli vastapĂ€ivÀÀn"] # 0x2940 (en: 'anticlockwise closed circle arrow', google translation) - - "℁": [T: "suljettu ympyrĂ€nuoli myötĂ€pĂ€ivÀÀn"] # 0x2941 (en: 'clockwise closed circle arrow', google translation) - - "â„‚": [T: "oikea nuoli lyhyen vasemman nuolen ylĂ€puolella"] # 0x2942 (en: 'rightwards arrow above short leftwards arrow', google translation) - - "℃": [T: "vasen nuoli lyhyen oikean nuolen ylĂ€puolella"] # 0x2943 (en: 'leftwards arrow above short rightwards arrow', google translation) - - "â„„": [T: "lyhyt oikea nuoli vasemman nuolen ylĂ€puolella"] # 0x2944 (en: 'short rightwards arrow above leftwards arrow', google translation) - - "â„…": [T: "oikea nuoli ja plus-merkki alapuolella"] # 0x2945 (en: 'rightwards arrow with plus below', google: 'oikealla nuolella, jonka alla on plus') - - "℆": [T: "vasen nuoli ja plus-merkki alanpuolella"] # 0x2946 (en: 'leftwards arrow with plus below', google translation) - - "ℇ": [T: "oikea nuoli x:n lĂ€pi"] # 0x2947 (en: 'rightwards arrow through x', google translation) - - "℈": [T: "oikealle ja vasemmalle osoittava nuoli ympyrĂ€n lĂ€pi"] # 0x2948 (google: 'vasen oikea nuoli ympyrĂ€n lĂ€pi') - - "℉": [T: "ylöspĂ€in osoittava kaksipĂ€inen nuoli ympyrĂ€stĂ€"] # 0x2949 (google: 'ylöspĂ€in kaksi pÀÀistĂ€ nuolta ympyrĂ€stĂ€') - - "ℊ": [T: "oikealle ja vasemmalle osoittava puolinuoli oikealla ylĂ€piikillĂ€ ja vasemmalla alapiikillĂ€"] # 0x294a (google: 'vasen barb ylös oikealle barb down harpoon') - - "â„‹": [T: "oikealle ja vasemmalle osoittava puolinuoli oikealla alapiikillĂ€ ja vasemmalle ylĂ€piikillĂ€"] # 0x294b (google: 'vasen barb alas oikealla barb up harpoon') - - "ℌ": [T: "ylös ja alas osoittava puolinuoli oikealla ylĂ€piikillĂ€ ja vasemmalla alapiikillĂ€"] # 0x294c (en: 'up barb right down barb left harpoon', google translation) - - "ℍ": [T: "ylös ja alas osoittava puolinuoli vasemmalla ylĂ€piikillĂ€ ja oikealla alapiikillĂ€"] # 0x294d (en: 'up barb left down barb right harpoon', google translation) - - "ℎ": [T: "oikealle ja vasemmalle osoittava puolinuoli, piikit ylĂ€puolella"] # 0x294e (en: 'left barb up right barb up harpoon', google: 'vasen barb ylös oikealle barb up harpoon') - - "ℏ": [T: "ylös ja alas osoittava puolinuoli, piikit oikealla"] # 0x294f (en: 'up barb right down barb right harpoon', google: 'ylös barb oikealla barbilla oikealla harpoonilla') - - "ℐ": [T: "oikealle ja vasemmalle osoittava puolinuoli, piikit alapuolella"] # 0x2950 (en: 'left barb down right barb down harpoon', google: 'vasen barb alas oikealla barb down harpoon') - - "â„‘": [T: "ylös ja alas osoittava puolinuoli, piikit vasemmalla"] # 0x2951 (en: 'up barb left down barb left harpoon', google: 'ylös barb vasemmalle barb vasen harpooni') - - "â„’": [T: "vasemmalle osoittava puolinuoli pystyviivaan, piikki ylĂ€puolella"] # 0x2952 (en: 'leftwards harpoon with barb up to bar', google: 'vasen harppuuna barbin kanssa baariin') - - "â„“": [T: "oikealle osoittava puolinuoli pystyviivaan, piikki ylĂ€puolella"] # 0x2953 (en: 'rightwards harpoon with barb up to bar', google: 'oikea harpoon barbin kanssa baariin') - - "â„”": [T: "ylös osoittava puolinuoli vaakaviivaan, piikki oikealla"] # 0x2954 (en: 'upwards harpoon with barb right to bar', google: 'ylöspĂ€in harppuun barbin oikealla baarilla') - - "â„•": [T: "alas osoittava puolinuoli vaakaviivaan, piikki oikealla"] # 0x2955 (en: 'downwards harpoon with barb right to bar', google: 'downward harpoon barbin oikealla baarilla') - - "â„–": [T: "vasemmalle osoittava puolinuoli pystyviivaan, piikki alapuolella"] # 0x2956 (en: 'leftwards harpoon with barb down to bar', google: 'vasen harppuuna barbin kanssa baariin') - - "â„—": [T: "oikealle osoittava puolinuoli pystyviivaan, piikki alapuolella"] # 0x2957 (en: 'rightwards harpoon with barb down to bar', google: 'oikea harpoon barbin kanssa baariin') - - "℘": [T: "ylös osoittava puolinuoli vaakaviivaan, piikki vasemmalla"] # 0x2958 (en: 'upwards harpoon with barb left to bar', google: 'ylös harppuon barbin kanssa vasemmalle baariin') - - "â„™": [T: "alas osoittava puolinuoli vaakaviivaan, piikki vasemmalla"] # 0x2959 (en: 'downwards harpoon with barb left to bar', google: 'downward harpoon barbin kanssa vasemmalle baariin') - - "ℚ": [T: "vasemmalle osoittava puolinuoli vaakaviivasta, piikki ylĂ€puolella"] # 0x295a (en: 'leftwards harpoon with barb up from bar', google: 'vasen harppuuna barb ylös baarista') - - "â„›": [T: "oikealle osoittava puolinuoli vaakaviivasta, piikki ylĂ€puolella"] # 0x295b (en: 'rightwards harpoon with barb up from bar', google: 'oikealla harppuuna barbin kanssa baarista') - - "ℜ": [T: "ylöspĂ€in osoittava puolinuoli vaakaviivasta, piikki oikealla"] # 0x295c (en: 'upwards harpoon with barb right from bar', google: 'ylöspĂ€in harppuun barbin kanssa heti baarista') - - "ℝ": [T: "alaspĂ€in osoittava puolinuoli vaakaviivasta, piikki oikealla"] # 0x295d (en: 'downwards harpoon with barb right from bar', google: 'downward harpoon barbin kanssa heti baarista') - - "℞": [T: "vasemmalle osoittava puolinuoli vaakaviivasta, piikki alapuolella"] # 0x295e (en: 'leftwards harpoon with barb down from bar', google: 'vasen harppuuna barbin kanssa baarista') - - "℟": [T: "oikealle osoittava puolinuoli vaakaviivasta, piikki alapuolella"] # 0x295f (en: 'rightwards harpoon with barb down from bar', google: 'oikea harpoon barbin kanssa baarista') - - "â„ ": [T: "ylöspĂ€in osoittava puolinuoli vaakaviivasta, piikki vasemmalla"] # 0x2960 (en: 'upwards harpoon with barb left from bar', google: 'ylös harppuun barbin vasemmalla baarista') - - "℥": [T: "alaspĂ€in osoittava puolinuoli vaakaviivasta, piikki vasemmalla"] # 0x2961 (en: 'downwards harpoon with barb left from bar', google: 'downward harpoon barbin vasemmalla baarista') - - "ℹ": [T: "vasemmalle osoittava puolinuolipari"] # 0x2962 (en: 'leftwards harpoon with barb up above leftwards harpoon with barb down', google: 'vasen harppuuna barb ylös vasemmanpuoleisen harpoonin ylĂ€puolella barb down') - - "℣": [T: "ylöspĂ€in osoittava puolinuolipari"] # 0x2963 (en: 'upwards harpoon with barb left beside upwards harpoon with barb right', google: 'ylĂ€puolella harppuunia vasemmalla vasemmalla harpoon vieressĂ€ barbilla oikealla') - - "â„€": [T: "oikealle osoittava puolinuolipari"] # 0x2964 (en: 'rightwards harpoon with barb up above rightwards harpoon with barb down', google: 'oikealla harpoonilla barb ylös oikeanpuoleisen harpoonin ylĂ€puolella barb down') - - "â„„": [T: "alaspĂ€in osoittava puolinuolipari"] # 0x2965 (en: 'downwards harpoon with barb left beside downwards harpoon with barb right', google: 'downwards harpoon vasemmalla vasemmalla harppuunan vieressĂ€ barbilla oikealla') - - "ℊ": [T: "vasen puolinuoli piikki ylös ja alapuolella oikea puolinuoli piikki ylös"] # 0x2966 (en: 'leftwards harpoon with barb up above rightwards harpoon with barb up', google: 'vasen harppuuna barb ylös oikeanpuoleisen harpoonin ylĂ€puolella barb up') - - "â„§": [T: "vasen puolinuoli piikki alas ja alapuolella oikea puolinuoli piikki ylös"] # 0x2967 (en: 'leftwards harpoon with barb down above rightwards harpoon with barb down', google: 'vasen harppuuna barb alas oikeanpuoleisen harpoonin ylĂ€puolella barb down') - - "ℚ": [T: "oikea puolinuoli piikki ylös ja alapuolella vasen puolinuoli piikki ylös"] # 0x2968 (en: 'rightwards harpoon with barb up above leftwards harpoon with barb up', google: 'oikealla harpounalla barb ylös vasemmanpuoleisen harpoonin ylĂ€puolella barb up') - - "â„©": [T: "oikea puolinuoli piikki alas ja alapuolella vasen puolinuoli piikki alas"] # 0x2969 (en: 'rightwards harpoon with barb down above leftwards harpoon with barb down', google: 'oikealla harpounalla barbin kanssa vasemmanpuoleisen harpoonin ylĂ€puolella barb down') - - "â„Ș": [T: "vasen puolinuoli piikki ylös vaakaviivan ylĂ€puolella"] # 0x296a (en: 'leftwards harpoon with barb up above long dash', google: 'vasen harppuuna barb ylös pitkĂ€n viivan ylĂ€puolella') - - "â„«": [T: "vasen puolinuoli piikki alas vaakaviivan alapuolella"] # 0x296b (en: 'leftwards harpoon with barb down below long dash', google: 'vasen harppuuna barbin alapuolella pitkĂ€n viivan alapuolella') - - "ℏ": [T: "oikea puolinuoli piikki ylös vaakaviivan ylĂ€puolella"] # 0x296c (en: 'rightwards harpoon with barb up above long dash', google: 'oikealla harppuunilla barb up long dashin ylĂ€puolella') - - "â„­": [T: "oikea puolinuoli piikki alas vaakaviivan alapuolella"] # 0x296d (en: 'rightwards harpoon with barb down below long dash', google: 'oikealla harppuuna barbin alapuolella pitkĂ€n viivan alapuolella') - - "℟": [T: "ylös ja alas osoittava puolinuolipari"] # 0x296e (en: 'upwards harpoon with barb left beside downwards harpoon with barb right', google: 'ylös harppuunaa vasemmalla vasemmalla harpoonin vieressĂ€ barbilla oikealla') - - "ℯ": [T: "alas ja ylös osoittava puolinuolipari"] # 0x296f (en: 'downwards harpoon with barb left beside upwards harpoon with barb right', google: 'downwards harpoon vasemmalla vasemmalla harppuunin vieressĂ€ barbilla oikealla') - - "â„°": [T: "oikea tuplanuoli pyöristetyllĂ€ ylĂ€puolella"] # 0x2970 (en: 'right double arrow with rounded head', google: 'oikea kaksinkertainen nuoli pyöristetyllĂ€ pÀÀn kanssa') - - "ℱ": [T: "yhtĂ€ suuri kuin oikean nuolen ylĂ€puolella"] # 0x2971 (google: 'vastaa oikeanpuoleista nuolta') - - "â„Č": [T: "tilde oikean nuolen ylĂ€puolella"] # 0x2972 (google: 'tilde -operaattori oikeanpuoleisen nuolen ylĂ€puolella') - - "ℳ": [T: "vasen nuoli tilden ylĂ€puolella"] # 0x2973 (en: 'leftwards arrow above tilde operator', google: 'vasen nuoli tilde -operaattorin ylĂ€puolella') - - "ℎ": [T: "oikea nuoli tilden ylĂ€puolella"] # 0x2974 (en: 'rightwards arrow above tilde operator', google: 'oikealla nuolella tilde -operaattorin ylĂ€puolella') - - "â„”": [T: "oikea nuoli melkein yhtĂ€ suuri kuin ylĂ€puolella"] # 0x2975 (google: 'oikea nuoli ylĂ€puolelle melkein yhtĂ€ suuri kuin') - - "â„¶": [T: "pienempi kuin vasemman nuolen ylĂ€puolella"] # 0x2976 (google: 'alle kuin vasemmanpuoleinen nuoli') - - "â„·": [T: "vasen nuoli pienempi kuin pÀÀllĂ€"] # 0x2977 (en: 'leftwards arrow through less than', google translation) - - "℞": [T: "suurempi kuin oikean nuolen ylĂ€puolella"] # 0x2978 (google: 'suurempi kuin oikeanpuoleinen nuoli') - - "â„č": [T: "osajoukko oikean nuolen ylĂ€puolella"] # 0x2979 (google: 'oikeanpuoleinen nuolen ylĂ€puolella') - - "â„ș": [T: "vasen nuoli osajoukon pÀÀllĂ€"] # 0x297a (en: 'leftwards arrow through subset', google translation) - - "â„»": [T: "ylijoukko vasemman nuolen ylĂ€puolella"] # 0x297b (google: 'superset vasemmanpuoleisen nuolen ylĂ€puolella') - - "ℌ": [T: "vasen kalanpyrstö"] # 0x297c (google: 'vasen kala hĂ€ntĂ€') - - "ℜ": [T: "oikea kalanpyrstö"] # 0x297d (google: 'oikea kala hĂ€ntĂ€') - - "℟": [T: "ylöspĂ€in osoittava kalanpyrstö"] # 0x297e (en: 'up fish tail', google: 'ylös kalanhĂ€ntĂ€') - - "ℿ": [T: "alaspĂ€in osoittava kalanpyrstö"] # 0x297f (google: 'alas kalan hĂ€nnĂ€') - - "⩀": [T: "kolminkertainen pystysuora palkki"] # 0x2980 (en: 'triple vertical bar delimiter', google translation) - - "⊁": [T: "Z-notaatio piste"] # 0x2981 (en: 'z notation spot', google translation) - - "⩂": [T: "Z-notaatio kaksoispiste"] # 0x2982 (en: 'z notation type colon', google translation) - - "⊃": [T: "vasen valkoinen aaltosulku"] # 0x2983 (en: 'left white brace', google translation) - - "⩄": [T: "oikea valkoinen aaltosulku"] # 0x2984 (en: 'right white brace', google translation) - - "⩅": [T: "vasen valkoinen kaarisulku"] # 0x2985 (en: 'left white parenthesis', google: 'vasen valkoinen sulkuteesi') - - "⩆": [T: "oikea valkoinen kaarisulku"] # 0x2986 (en: 'right white parenthesis', google: 'oikea valkoinen sulkuteesi') - - "⩇": [T: "Z-notaatio vasen kuva sulku"] # 0x2987 (en: 'z notation left image bracket', google translation) - - "⊈": [T: "Z-notaatio oikea kuva sulku"] # 0x2988 (en: 'z notation right image bracket', google translation) - - "⩉": [T: "Z-notaatio vasen sitova sulku"] # 0x2989 (google: 'z -merkintĂ€ jĂ€tti sitovan kiinnikkeen') - - "⩊": [T: "Z-notaatio oikea sitova sulku"] # 0x298a (google: 'z -merkintĂ€ oikea sitova kiinnike') - - "⩋": [T: "vasen hakasulku alaviivalla"] # 0x298b (en: 'left square bracket with underbar', google: 'vasen neliökiinnike alapalkin kanssa') - - "⩌": [T: "oikea hakasulku alaviivalla"] # 0x298c (en: 'right square bracket with underbar', google: 'oikea neliökiinnike alapalkin kanssa') - - "⊍": [T: "vasen hakasulku viivalla ylĂ€nurkassa"] # 0x298d (en: 'left square bracket with tick in top corner', google: 'vasen neliö kiinnike, punkki ylĂ€kulmassa') - - "⊎": [T: "oikea hakasulku viivalla alanurkassa"] # 0x298e (en: 'right square bracket with tick in bottom corner', google: 'oikea neliökiinnike, jossa punkki alakulmassa') - - "⊏": [T: "vasen hakasulku viivalla alanurkassa"] # 0x298f (en: 'left square bracket with tick in bottom corner', google: 'vasen neliö kiinnike, punkki alakulmassa') - - "⊐": [T: "oikea hakasulku viivalla ylĂ€nurkassa"] # 0x2990 (en: 'right square bracket with tick in top corner', google: 'oikea neliö kiinnike, punkki ylĂ€kulmassa') - - "⩑": [T: "vasen kulmasulku pisteellĂ€"] # 0x2991 (en: 'left angle bracket with dot', google: 'vasemman kulman kiinnike pisteellĂ€') - - "⩒": [T: "oikea kulmasulku pisteellĂ€"] # 0x2992 (en: 'right angle bracket with dot', google: 'suoren kulman kiinnike pisteellĂ€') - - "⩓": [T: "vasen kaari pienempi kuin sulku"] # 0x2993 (google: 'vasen kaari vĂ€hemmĂ€n kuin kiinnike') - - "⩔": [T: "oikea kaari suurempi kuin sulku"] # 0x2994 (google: 'oikea kaari suurempi kuin kiinnike') - - "⩕": [T: "vasen kaksoiskaari suurempi kuin sulku"] # 0x2995 (google: 'kaksinkertainen vasen kaari on suurempi kuin kiinnike') - - "⩖": [T: "oikea kaksoiskaari pienempi kuin sulku"] # 0x2996 (google: 'kaksinkertainen oikea kaari vĂ€hemmĂ€n kuin kiinnike') - - "⩗": [T: "vasen musta kilpikonnankuorisulku"] # 0x2997 (en: 'left black tortoise shell bracket', google translation) - - "⊘": [T: "oikea musta kilpikonnakuorisulku"] # 0x2998 (en: 'right black tortoise shell bracket', google translation) - - "⩙": [T: "pistetty aita"] # 0x2999 (en: 'dotted fence', google translation) - - "⩚": [T: "pystysuora siksak-viiva"] # 0x299a (google: 'pystysuora siksak -linja') - - "⩛": [T: "vasemmalle avautuva mitattu kulma"] # 0x299b (en: 'measured angle opening left', google translation) - - "⩜": [T: "neliöllĂ€ merkitty suora kulma"] # 0x299c (en: 'right angle variant with square', google translation) - - "⊝": [T: "kaarella merkitty suora kulma"] # 0x299d (en: 'measured right angle with dot', google: 'mitattu oikea kulma pisteellĂ€') - - "⊞": [T: "kulma, jonka sisĂ€llĂ€ on s"] # 0x299e (en: 'angle with s inside', google translation) - - "⩟": [T: "terĂ€vĂ€ kulma"] # 0x299f (en: 'acute angle', google translation) - - "⊠": [T: "vasemmalle avautuva pallomainen kulma"] # 0x29a0 (en: 'spherical angle opening left', google translation) - - "⊥": [T: "ylös avautuva pallomainen kulma"] # 0x29a1 (en: 'spherical angle opening up', google translation) - - "⊹": [T: "kÀÀnnetty kulma"] # 0x29a2 (en: 'turned angle', google translation) - - "⊣": [T: "kÀÀnteinen kulma"] # 0x29a3 (en: 'reversed angle', google translation) - - "⊀": [T: "kulma alaviivalla"] # 0x29a4 (en: 'angle with underbar', google: 'kulma alapalkin kanssa') - - "⊄": [T: "kÀÀnnetty kulma alaviivalla"] # 0x29a5 (en: 'reversed angle with underbar', google: 'kÀÀnnetty kulma alapalkin kanssa') - - "⊊": [T: "ylöspĂ€in avautuva viisto kulma"] # 0x29a6 (google: 'vino kulma avautuu') - - "⊧": [T: "alaspĂ€in avautuva viisto kulma"] # 0x29a7 (google: 'vino kulma avautuu') - - "⊚": [T: "mitattu kulma, jossa ylĂ€oikealle osoittava nuoli"] # 0x29a8 (en: 'measured angle with open arm ending in arrow pointing up and to the right', google: 'mitattu kulma, kun avoin kĂ€sivarsi pÀÀttyy nuoleen osoittaen ylös ja oikealle') - - "⊩": [T: "mitattu kulma, jossa ylĂ€vasemmalle osoittava nuoli"] # 0x29a9 (en: 'measured angle with open arm ending in arrow pointing up and to the left', google: 'mitattu kulma, jonka avoin kĂ€sivarsi pÀÀttyy nuoleen osoittaen ylös ja vasemmalle') - - "âŠȘ": [T: "mitattu kulma, jossa alaoikealle osoittava nuoli"] # 0x29aa (en: 'measured angle with open arm ending in arrow pointing down and to the right', google: 'mitattu kulma, kun avoin kĂ€sivarsi pÀÀttyy nuolessa alaspĂ€in ja oikealle') - - "⊫": [T: "mitattu kulma, jossa alavasemmalle osoittava nuoli"] # 0x29ab (en: 'measured angle with open arm ending in arrow pointing down and to the left', google: 'mitattu kulma, kun avoin kĂ€sivarsi pÀÀttyy nuolessa alaspĂ€in ja vasemmalle') - - "⊏": [T: "mitattu kulma, jossa oikealle ja ylös osoittava nuoli"] # 0x29ac (en: 'measured angle with open arm ending in arrow pointing right and up', google: 'mitattu kulma, kun avoin kĂ€sivarsi pÀÀttyy nuoleen osoittaen oikealle ja ylöspĂ€in') - - "⊭": [T: "mitattu kulma, jossa vasemmalle ja ylös osoittava nuoli"] # 0x29ad (en: 'measured angle with open arm ending in arrow pointing left and up', google: 'mitattu kulma, jonka avoin kĂ€sivarsi pÀÀttyy nuoleen osoittaen vasemmalle ja ylöspĂ€in') - - "⊟": [T: "mitattu kulma, jossa oikealle ja alas osoittava nuoli"] # 0x29ae (en: 'measured angle with open arm ending in arrow pointing right and down', google: 'mitattu kulma, kun avoin kĂ€sivarsi pÀÀttyy nuoleen osoittaen oikealle ja alas') - - "⊯": [T: "mitattu kulma, jossa vasemmalle ja alas osoittava nuoli"] # 0x29af (en: 'measured angle with open arm ending in arrow pointing left and down', google: 'mitattu kulma, jonka nuolessa pÀÀttyy avoimeen kĂ€sivarteen, osoittaen vasemmalle ja alas') - - "⊰": [T: "kÀÀnnetty tyhjĂ€ joukko"] # 0x29b0 (google: 'kÀÀntynyt tyhjĂ€ sarja') - - "⊱": [T: "tyhjĂ€ joukko ylĂ€viivalla"] # 0x29b1 (en: 'empty set with overbar', google: 'tyhjĂ€ sarja ylikuormituksella') - - "âŠČ": [T: "tyhjĂ€ joukko ja pieni ympyrĂ€ ylĂ€puolella"] # 0x29b2 (en: 'empty set with small circle above', google: 'tyhjĂ€ sarja, jossa on pieni ympyrĂ€ yllĂ€') - - "⊳": [T: "tyhjĂ€ joukko ja oikea nuoli ylĂ€puolella"] # 0x29b3 (en: 'empty set with right arrow above', google: 'tyhjĂ€ sarja oikealla nuolella yllĂ€') - - "⊎": [T: "tyhjĂ€ joukko ja vasen nuoli ylĂ€puolella"] # 0x29b4 (en: 'empty set with left arrow above', google: 'tyhjĂ€ sarja vasemmalla nuolella yllĂ€') - - "⊔": [T: "vaakaviivallinen ympyrĂ€"] # 0x29b5 (en: 'circle with horizontal bar', google: 'ympyrĂ€ vaakasuuntaisella palkilla') - - "⊶": [T: "ympyröity pystyviiva"] # 0x29b6 (google: 'ympyrĂ€ pystysuora palkki') - - "⊷": [T: "ympyröidyt samansuuntaiset pystyviivat"] # 0x29b7 (google: 'ympyröi rinnakkain') - - "⊞": [T: "ympyröity kenoviiva"] # 0x29b8 (en: 'circled reverse solidus', google translation) - - "âŠč": [T: "ympyröity kohtisuoruusmerkki"] # 0x29b9 (google: 'ympyrĂ€si kohtisuorassa') - - "âŠș": [T: "ympyrĂ€, joka on jaettu vaakaviivalla ja ylĂ€puolisko on jaettu pystyviivalla"] # 0x29ba (en: 'circled divided by horizontal bar and top half divided by vertical bar', google translation) - - "⊻": [T: "ympyrĂ€ ja x pÀÀllekkĂ€in"] # 0x29bb (en: 'circle with superimposed x', google: 'ympyrĂ€ pÀÀllekkĂ€in x') - - "⊌": [T: "ympyröity vastapĂ€ivÀÀn kÀÀnnetty jakomerkki"] # 0x29bc (en: 'circled anticlockwise rotated division sign', google: 'ympyröity vastapĂ€ivÀÀn kierretty jakomerkki') - - "⊜": [T: "nuoli ympyrĂ€n lĂ€pi"] # 0x29bd (en: 'up arrow through circle', google translation) - - "⊟": [T: "ympyröity valkoinen pieni ympyrĂ€"] # 0x29be (google: 'ympyrĂ€valkoinen luoti') - - "⊿": [T: "ympyröity pieni ympyrĂ€"] # 0x29bf (google: 'ympyrĂ€ luoti') - - "⧀": [T: "ympyröity pienempi kuin"] # 0x29c0 (google: 'ympyrĂ€si vĂ€hemmĂ€n kuin') - - "⧁": [T: "ympyröity suurempi kuin"] # 0x29c1 (google: 'ympyrĂ€si suurempi kuin') - - "⧂": [T: "ympyrĂ€ ja pieni ympyrĂ€ oikealla"] # 0x29c2 (en: 'circle with small circle to the right', google: 'ympyrĂ€ pienellĂ€ ympyrĂ€llĂ€ oikealla') - - "⧃": [T: "ympyrĂ€ ja kaksi vaakaviivaa oikealla"] # 0x29c3 (en: 'circle with two horizontal strokes to the right', google: 'ympyrĂ€ kahdella vaakasuuntaisella iskulla oikealle') - - "⧄": [T: "neliöity kasvava diagonaalinen viiva"] # 0x29c4 (google: 'neliö nousevat diagonaaliset viiva') - - "⧅": [T: "neliöity laskeva diagonaalinen viiva"] # 0x29c5 (google: 'neliö putoava diagonaalinen viiva') - - "⧆": [T: "neliö tĂ€hdellĂ€"] # 0x29c6 (en: 'squared asterisk', google translation) - - "⧇": [T: "neliöity pieni ympyrĂ€"] # 0x29c7 (en: 'squared small circle', google translation) - - "⧈": [T: "neliöity pieni neliö"] # 0x29c8 (en: 'squared square', google translation) - - "⧉": [T: "kaksi limittĂ€istĂ€ neliötĂ€"] # 0x29c9 (google: 'kaksi liittyi neliötĂ€') - - "⧊": [T: "kolmio ja piste ylĂ€puolella"] # 0x29ca (en: 'triangle with dot above', google translation) - - "⧋": [T: "kolmio ja vaakaviiva alapuolella"] # 0x29cb (en: 'triangle with underbar', google translation) - - "⧌": [T: "s kolmiossa"] # 0x29cc (en: 's in triangle', google translation) - - "⧍": [T: "kolmio, jonka pohjassa serif"] # 0x29cd (en: 'triangle with serifs at bottom', google: 'kolmio alaosassa') - - "⧎": [T: "oikea kolmio vasemman kolmion ylĂ€puolella"] # 0x29ce (google: 'oikea kolmio vasemman kolmion ylĂ€puolella') - - "⧏": [T: "vasen kolmio pystyviivan vieressĂ€"] # 0x29cf (en: 'left triangle beside vertical bar', google: 'vasen kolmio pystysuoran palkin vieressĂ€') - - "⧐": [T: "pystyviiva oikean kolmion vieressĂ€"] # 0x29d0 (en: 'vertical bar beside right triangle', google: 'pystysuora palkki oikean kolmion vieressĂ€') - - "⧑": [T: "rusetti, jonka vasen puoli musta"] # 0x29d1 (en: 'bowtie with left half black', google translation) - - "⧒": [T: "rusetti, jonka oikea puoli musta"] # 0x29d2 (en: 'bowtie with right half black', google translation) - - "⧓": [T: "musta rusetti"] # 0x29d3 (en: 'black bowtie', google translation) - - "⧔": [T: "puolirusetti, jonka vasen puoli musta"] # 0x29d4 (en: 'times with left half black', google translation) - - "⧕": [T: "puolirusetti, jonka oikea puoli musta"] # 0x29d5 (en: 'times with right half black', google translation) - - "⧖": [T: "valkoinen tiimalasi"] # 0x29d6 (en: 'white hourglass', google translation) - - "⧗": [T: "musta tiimalasi"] # 0x29d7 (en: 'black hourglass', google translation) - - "⧘": [T: "vasen kiemurteleva viiva"] # 0x29d8 (en: 'left wiggly fence', google translation) - - "⧙": [T: "oikea kiemurteleva viiva"] # 0x29d9 (en: 'right wiggly fence', google translation) - - "⧚": [T: "vasen kaksinkertainen kiemurteleva viiva"] # 0x29da (en: 'left double wiggly fence', google: 'vasen kaksinkertainen aita') - - "⧛": [T: "oikea kaksinkertainen kiemurteleva viiva"] # 0x29db (en: 'right double wiggly fence', google: 'oikea kaksinkertainen aita') - - "⧜": [T: "epĂ€tĂ€ydellinen ÀÀrettömyys"] # 0x29dc (google: 'epĂ€tĂ€ydellinen ÀÀrettömyys') - - "⧝": [T: "yhdistetty ÀÀrettömyys"] # 0x29dd (en: 'tie over infinity', google translation) - - "⧞": [T: "ÀÀrettömyys negatoitu pystyviivalla"] # 0x29de (en: 'infinity negated with vertical bar', google: 'ÀÀrettömyys kielsi pystysuoralla palkilla') - - "⧟": [T: "kaksipĂ€inen monikuvaus"] # 0x29df (en: 'double-ended multimap', google translation) # FI: "multimap", "monikuvaus" translation questionable - - "â§ ": [T: "neliö korostetuilla ÀÀreviivoilla"] # 0x29e0 (en: 'square with contoured outline', google translation) - - "â§Ą": [T: "kasvaa suhteessa"] # 0x29e1 (en: 'increases as', google translation) - - "â§ą": [T: "sekoitetulo"] # 0x29e2 (en: 'shuffle product', google translation) - - "â§Ł": [T: "on yhtĂ€ suuri kuin kahdella vinolla yliviivalla"] # 0x29e3 (google: 'vastaa merkkiĂ€ ja viistot rinnakkain') - - "â§€": [T: "on yhtĂ€ suuri kuin kahdella vinolla yliviivalla ja tilde ylĂ€puolella"] # 0x29e4 (en: 'equals sign and slanted parallel with tilde above', google: 'vastaa merkkiĂ€ ja viistot yhdensuuntaisen kanssa tilden kanssa yllĂ€') - - "â§„": [T: "identtinen kuin kahdella vinolla yliviivalla"] # 0x29e5 (en: 'identical to and slanted parallel', google: 'identtinen ja vino rinnakkain') - - "â§Š": [T: "tautologisesti ekvivalentti"] # 0x29e6 (google translation) - - "â§§": [T: "termodynaaminen"] # 0x29e7 (en: 'thermodynamic', google translation) - - "â§š": [T: "alaspĂ€in osoittava kolmio ja vasen puoli musta"] # 0x29e8 (en: 'down pointing triangle with left half black', google translation) - - "â§©": [T: "alaspĂ€in osoittava kolmio ja oikea puoli musta"] # 0x29e9 (en: 'down pointing triangle with right half black', google translation) - - "â§Ș": [T: "musta timantti alas osoittavalla nuolella"] # 0x29ea (en: 'black diamond with down arrow', google translation) - - "â§«": [T: "musta vinoneliö"] # 0x29eb (en: 'black lozenge', google: 'musta lozenge') - - "â§Ź": [T: "valkoinen ympyrĂ€ alaspĂ€in osoittavalla nuolella"] # 0x29ec (en: 'white circle with down arrow', google translation) - - "â§­": [T: "musta ympyrĂ€ alaspĂ€in osoittavalla nuolella"] # 0x29ed (en: 'black circle with down arrow', google translation) - - "â§ź": [T: "valkoinen neliö virheviivoilla"] # 0x29ee (en: 'error-barred white square', google translation) - - "â§Ż": [T: "musta neliö virheviivoilla"] # 0x29ef (en: 'error-barred black square', google translation) - - "â§°": [T: "valkoinen timantti virheviivoilla"] # 0x29f0 (en: 'error-barred white diamond', google translation) - - "â§±": [T: "musta timantti virheviivoilla"] # 0x29f1 (en: 'error-barred black diamond', google translation) - - "â§Č": [T: "valkoinen ympyrĂ€ virheviivoilla"] # 0x29f2 (en: 'error-barred white circle', google translation) - - "â§ł": [T: "musta ympyrĂ€ virheviivoilla"] # 0x29f3 (en: 'error-barred black circle', google translation) - - "â§Ž": [T: "viivĂ€stetty sÀÀntö"] # 0x29f4 (en: 'rule-delayed', google: 'sÀÀntöviitettu') - - "â§”": [T: "kenoviiva"] # 0x29f5 (en: 'reverse solidus operator', google translation) - - "â§¶": [T: "vinoviiva ylĂ€viivalla"] # 0x29f6 (en: 'solidus with overbar', google: 'solidus ylikuormituksen kanssa') - - "â§·": [T: "kenoviiva poikkiviivalla"] # 0x29f7 (en: 'reverse solidus with horizontal stroke', google translation) - - "â§ž": [T: "iso vinoviiva"] # 0x29f8 (google translation) - - "â§č": [T: "iso kenoviiva"] # 0x29f9 (en: 'big reverse solidus', google translation) - - "â§ș": [T: "kaksinkertainen plus"] # 0x29fa (en: 'double plus', google translation) - - "â§»": [T: "kolminkertainen plus"] # 0x29fb (google translation) - - "â§Œ": [T: "vasemmalle osoittava kaareva kulmahakasulku"] # 0x29fc (en: 'left pointing curved angle bracket', google translation) - - "â§œ": [T: "oikealle osoittava kaareva kulmahakasulku"] # 0x29fd (en: 'right pointing curved angle bracket', google translation) - - "â§Ÿ": [T: "tiny"] # 0x29fe (en: 'tiny', google translation) - - "â§ż": [T: "miny"] # 0x29ff (google translation) - - "⹀": [T: "monikollinen ympyrĂ€ssĂ€ oleva kertopiste"] # 0x2a00 (en: 'circled dot operator', google translation) - - "⚁": [T: "monikollinen ympyrĂ€ssĂ€ oleva plus"] # 0x2a01 (en: 'circled plus operator', google translation) - - "⹂": [T: "monikollinen ympyrĂ€ssĂ€ oleva kertomerkki"] # 0x2a02 (en: 'circled times operator', google translation) - - "⚃": [T: "pisteellinen monikkounioni"] # 0x2a03 (en: 'union operator with dot', google translation) - - "⹄": [T: "monijoukkojen monikkounioni"] # 0x2a04 (en: 'union operator with plus', google translation) - - "⹅": [T: "kulmikas leikkauksen merkki"] # 0x2a05 (en: 'square intersection operator', google translation) - - "⹆": [T: "kulmikas unionin merkki"] # 0x2a06 (en: 'square union operator', google translation) - - "⹇": [T: "kaksi loogista ja-operaattoria"] # 0x2a07 (en: 'two logical and operator', google translation) - - "⚈": [T: "kaksi loogista tai-operaattoria"] # 0x2a08 (en: 'two logical or operator', google translation) - - "⹉": [T: "kertaa-operaattori"] # 0x2a09 (en: 'times operator', google translation) - - "⹊": [T: "modulo kaksi summaa"] # 0x2a0a (en: 'modulo two sum', google translation) - - "⹋": [T: "summa integraalilla"] # 0x2a0b (en: 'summation with integral', google translation) - - "⹌": [T: "nelinkertainen integraali"] # 0x2a0c (google: 'neljĂ€nneksen kiinteĂ€ operaattori') - - "⚍": [T: "pÀÀarvointegraali"] # 0x2a0d (google: 'ÀÀrellinen osa integraali') - - "⚎": [T: "integraali kaksinkertaisella poikkiviivalla"] # 0x2a0e (en: 'integral with double stroke', google translation) - - "⚏": [T: "integraalikeskiarvo viistolla vaakaviivalla"] # 0x2a0f (en: 'integral average with slash', google translation) - - "⚐": [T: "kiertofunktio"] # 0x2a10 (google: 'kiertotoiminto') - - "⹑": [T: "integraali vastapĂ€ivÀÀn"] # 0x2a11 (google: 'vastapĂ€ivÀÀn integraatio') - - "⹒": [T: "viivaintegraali neliskulmaisella polulla navan ympĂ€ri"] # 0x2a12 (en: 'line integration with rectangular path around pole', google: 'line -integraatio suorakaiteen muotoisella polulla navan ympĂ€rillĂ€') - - "⹓": [T: "viivaintegraali puoliympyrĂ€polulla navan ympĂ€ri"] # 0x2a13 (en: 'line integration with semicircular path around pole', google: 'line -integrointi puolipyöreĂ€llĂ€ polulla navan ympĂ€rillĂ€') - - "⹔": [T: "viivaintegraali ei sisĂ€llĂ€ napaa"] # 0x2a14 (google: 'linjan integrointi ei sisĂ€llĂ€ napaa') - - "⹕": [T: "integraali pisteoperaattorin ympĂ€rillĂ€"] # 0x2a15 (google: 'integroitu pisteen operaattorin ympĂ€rillĂ€') - - "⹖": [T: "kvaternionin integraalioperaattori"] # 0x2a16 en: 'quaternion integral operator' google: 'kvaternionin kiinteĂ€ operaattori' - - "⹗": [T: "integraali ja vasemmalle osoittava nuoli koukulla"] # 0x2a17 (en: 'integral with leftwards arrow with hook', google: 'integraali vasemmanpuoleisella nuolella koukussa') - - "⚘": [T: "integraali kertomerkillĂ€"] # 0x2a18 (en: 'integral with times sign', google translation) - - "⹙": [T: "integraali leikkauksella"] # 0x2a19 (en: 'integral with intersection', google translation) - - "⹚": [T: "integraali unionilla"] # 0x2a1a (en: 'integral with union', google translation) - - "⹛": [T: "integraali ylĂ€viivalla"] # 0x2a1b (en: 'integral with overbar', google translation) - - "⹜": [T: "integraali alaviivalla"] # 0x2a1c (en: 'integral with underbar', google translation) - - "⚝": [T: "liitos"] # 0x2a1d (en: 'join', google translation) - - "⚞": [T: "suuri vasen kolmio -operaattori"] # 0x2a1e (en: 'large left triangle operator', google translation) - - "⹟": [T: "Z-notaatio skeemayhdiste"] # 0x2a1f (en: 'z notation schema composition', google translation) - - "âš ": [T: "Z-notaatio skeemapiping"] # 0x2a20 (en: 'z notation schema piping', google translation) - - "⚥": [T: "Z-notaatio skeemaprojektio"] # 0x2a21 (en: 'z notation schema projection', google translation) - - "âšą": [T: "plus ja ympyrĂ€ ylĂ€puolella"] # 0x2a22 (en: 'plus sign with circle above', google: 'plus -merkki yllĂ€ olevalla ympyrĂ€llĂ€') - - "⚣": [T: "plus ja sirkumfleksi ylĂ€puolella"] # 0x2a23 (en: 'plus sign with circumflex accent above', google: 'plus -merkki yllĂ€ olevalla ympyrĂ€ -aksentilla') # FI: should this be "hat", "hattu"? - - "⚀": [T: "plus ja tilde ylĂ€puolella"] # 0x2a24 (en: 'plus sign with tilde above', google: 'plus -merkki yllĂ€ olevan tilden kanssa') - - "âš„": [T: "plus ja piste alapuolella"] # 0x2a25 (en: 'plus sign with dot below', google: 'plus -merkki alla olevalla pisteellĂ€') - - "⚊": [T: "plus ja tilde alapuolella"] # 0x2a26 (en: 'plus sign with tilde below', google: 'plus -merkki alla olevilla tildeillĂ€') - - "âš§": [T: "plus alaindeksi kaksi"] # 0x2a27 (en: 'plus sign with subscript two', google: 'plus -merkki alaindeksi kaksi') - - "âšš": [T: "plus mustalla kolmiolla"] # 0x2a28 (en: 'plus sign with black triangle', google translation) - - "âš©": [T: "miinus ja piste ylĂ€puolella"] # 0x2a29 (en: 'minus sign with comma above', google: 'miinus merkki yllĂ€ olevalla pilkulla') - - "âšȘ": [T: "miinus ja piste alapuolella"] # 0x2a2a (en: 'minus sign with dot below', google: 'miinusmerkki alla olevalla pisteellĂ€') - - "âš«": [T: "miinus putoavilla pisteillĂ€"] # 0x2a2b (en: 'minus sign with falling dots', google translation) - - "⚏": [T: "miinus nousevilla pisteillĂ€"] # 0x2a2c (en: 'minus sign with rising dots', google translation) - - "âš­": [T: "plus vasemmalla puoliympyrĂ€llĂ€"] # 0x2a2d (google: 'plus kirjaudu vasemmassa puolivĂ€lissĂ€') - - "âšź": [T: "plus oikealla puoliympyrĂ€llĂ€"] # 0x2a2e (google: 'plus kirjaudu oikeaan puolivĂ€liin') - - "⚯": [T: "ristitulo"] # 0x2a2f (en: 'cross product', google: 'ristituote') - - "âš°": [T: "kertomerkki ja piste ylĂ€puolella"] # 0x2a30 (en: 'multiplication sign with dot above', google: 'kertolaskulla olevan pisteen kanssa') - - "âš±": [T: "kertomerkki alaviivalla"] # 0x2a31 (en: 'multiplication sign with underbar', google: 'kertolasku aluskokouksella') - - "âšČ": [T: "puolisuora tulo, jonka pohja suljettu"] # 0x2a32 (en: 'semidirect product with bottom closed', google translation) - - "âšł": [T: "smash tulo"] # 0x2a33 (en: 'smash product' google: 'smash -tuote') # FI: translation unclear - - "⚎": [T: "kertomerkki vasemmalla puoliympyrĂ€llĂ€"] # 0x2a34 (google: 'kertolaskenta vasemmassa puolivĂ€lissĂ€') - - "âš”": [T: "kertomerkki oikealla puoliympyrĂ€llĂ€"] # 0x2a35 (google: 'kertokultaan oikea puoli ympyrĂ€') - - "âš¶": [T: "ympyröity kertomerkki sirkumfleksillĂ€"] # 0x2a36 (en: 'circled multiplication sign with circumflex accent', google: 'ympyrĂ€kerroin merkki kehĂ€kykyt aksentilla') # FI: should this be with "hat", "hattu"? - - "âš·": [T: "kaksoisympyröity kertomerkki"] # 0x2a37 (google: 'kertolaskenta kaksoisympyrĂ€ssĂ€') - - "âšž": [T: "ympyröity jakomerkki"] # 0x2a38 (google: 'ympyrĂ€divisioonan merkki') - - "âšč": [T: "plus kolmiossa"] # 0x2a39 (google: 'plus kirjaudu kolmioon') - - "âšș": [T: "miinus kolmiossa"] # 0x2a3a (google: 'miinus kirjaudu kolmioon') - - "âš»": [T: "kertomerkki kolmiossa"] # 0x2a3b (google: 'kertokultaan kolmiossa') - - "⚌": [T: "sisĂ€inen tulo"] # 0x2a3c (google: 'sisĂ€tuote') - - "âšœ": [T: "oikeanpuoleinen sisĂ€inen tulo"] # 0x2a3d (en: 'righthand interior product', google translation) - - "âšż": [T: "amalgamaatio tai kotulo"] # 0x2a3f (en: "amalgamation or coproduct", google: 'yhdistĂ€minen tai yhteistyö') # FI: translation unclear - - "⩀": [T: "leikkaus pisteellĂ€"] # 0x2a40 (en: 'intersection with dot', google: 'risteys pisteellĂ€') - - "⩁": [T: "unioni miinuksella"] # 0x2a41 (en: 'union with minus sign', google translation) - - "⩂": [T: "unioni ylĂ€viivalla"] # 0x2a42 (en: 'union with overbar', google: 'unioni ylikuormituksen kanssa') - - "⩃": [T: "leikkaus ylĂ€viivalla"] # 0x2a43 (en: 'intersection with overbar', google: 'risteys ylikuormituksen kanssa') - - "⩄": [T: "leikkaus ja looginen ja"] # 0x2a44 (en: 'intersection with logical and', google: 'risteys loogisella ja') - - "⩅": [T: "unioni ja looginen tai"] # 0x2a45 (en: 'union with logical or', google: 'union loogisen tai') - - "⩆": [T: "unioni leikkauksen ylĂ€puolella"] # 0x2a46 (google: 'unioni risteyksen ylĂ€puolella') - - "⩇": [T: "leikkaus unionin ylĂ€puolella"] # 0x2a47 (google: 'risteys liiton ylĂ€puolella') - - "⩈": [T: "unioni alaviivalla leikkauksen ylĂ€puolella"] # 0x2a48 (google: 'unioni ylĂ€puolella risteyksen ylĂ€puolella') - - "⩉": [T: "leikkaus alaviivalla leikkauksen ylĂ€puolella"] # 0x2a49 (google: 'risteys ylĂ€puolella liiton ylĂ€puolella') - - "⩊": [T: "unioni unionin vieressĂ€ yhdistettynĂ€"] # 0x2a4a (en: 'union beside and joined with union', google: 'unionin vieressĂ€ ja liittyi unioniin') - - "⩋": [T: "leikkaus leikkauksen vieressĂ€ yhdistettynĂ€"] # 0x2a4b (en: 'intersection beside and joined with intersection', google: 'risteys risteyksen vieressĂ€ ja liitetty') - - "⩌": [T: "suljettu unioni serifillĂ€"] # 0x2a4c (en: 'closed union with serifs', google: 'suljettu liitto serifien kanssa') - - "⩍": [T: "suljettu leikkaus serifillĂ€"] # 0x2a4d (en: 'closed intersection with serifs', google: 'suljettu risteys serifien kanssa') - - "⩎": [T: "kaksinkertainen neliöleikkus"] # 0x2a4e (en: 'double square intersection', google translation) - - "⩏": [T: "kaksinkertainen neliöunioni"] # 0x2a4f (google translation) - - "⩐": [T: "suljettu unioni serifillĂ€ ja smash tulo"] # 0x2a50 (en: 'closed union with serifs and smash product', google: 'suljettu liitto serifien ja smash -tuotteen kanssa') - - "⩑": [T: "looginen ja ylĂ€pisteellĂ€"] # 0x2a51 (en: 'logical and with dot above', google translation) - - "⩒": [T: "looginen tai ylĂ€pisteellĂ€"] # 0x2a52 (en: 'logical or with dot above', google translation) - - "⩓": [T: "kaksinkertainen looginen ja"] # 0x2a53 (google: 'kaksinkertainen looginen ja') - - "⩔": [T: "kaksinkertainen looginen tai"] # 0x2a54 (google: 'kaksinkertainen looginen tai') - - "⩕": [T: "kaksi limittĂ€istĂ€ loogista ja -merkkiĂ€"] # 0x2a55 (google: 'kaksi risteĂ€vÀÀ loogista ja') - - "⩖": [T: "kaksi limittĂ€istĂ€ loogista tai -merkkiĂ€"] # 0x2a56 (google: 'kaksi risteĂ€vÀÀ loogista tai') - - "⩗": [T: "vino suuri tai"] # 0x2a57 (google: 'kalteva suuri tai') - - "⩘": [T: "vino suuri ja"] # 0x2a58 (google: 'kalteva iso ja') - - "⩙": [T: "looginen tai jonka pÀÀllĂ€ looginen ja"] # 0x2a59 (en: 'logical or overlapping logical and', google translation) - - "⩚": [T: "looginen ja pystyviivalla"] # 0x2a5a (en: 'logical and with middle stem', google: 'looginen ja keskimmĂ€isellĂ€ varrella') - - "⩛": [T: "looginen tai pystyviivalla"] # 0x2a5b (en: 'logical or with middle stem', google: 'looginen tai keskimmĂ€isellĂ€ varrella') - - "⩜": [T: "looginen ja vaakaviivalla"] # 0x2a5c (en: 'logical and with horizontal dash', google: 'looginen ja vaakasuuntaisella viivalla') - - "⩝": [T: "looginen tai vaakaviivalla"] # 0x2a5d (en: 'logical or with horizontal dash', google: 'looginen tai vaakasuuntaisella viivalla') - - "⩞": [T: "looginen ja kaksoisylĂ€viivalla"] # 0x2a5e (en: 'logical and with double overbar', google translation) - - "⩟": [T: "looginen ja alaviivalla"] # 0x2a5f (en: 'logical and with underbar', google: 'looginen ja alikarjan kanssa') - - "â© ": [T: "looginen ja kaksoisalaviivalla"] # 0x2a60 (en: 'logical and with double underbar', google translation) - - "⩥": [T: "pieni vee alaviivalla"] # 0x2a61 (en: 'small vee with underbar', google translation) - - "⩹": [T: "looginen tai kaksoisylĂ€viivalla"] # 0x2a62 (en: 'logical or with double overbar', google translation) - - "⩣": [T: "kaksoisalleviivattu looginen tai"] # 0x2a63 (en: 'logical or with double underbar', google translation) - - "â©€": [T: "Z-notaatio mÀÀrittelyjoukon vastarajoitus"] # 0x2a64 (en: 'z notation domain antirestriction', google translation) # FI: unclear translation - - "â©„": [T: "Z-notaatio kuvajoukon vastarajoitus"] # 0x2a65 (en: 'z notation range antirestriction', google translation) # FI: unclear translation - - "⩊": [T: "on yhtĂ€ suuri kuin alapisteellĂ€"] # 0x2a66 (en: 'equals sign with dot below', google: 'vastaa alla olevaa pistettĂ€') - - "â©§": [T: "identtinen ylĂ€pisteellĂ€"] # 0x2a67 (en: 'identical with dot above', google translation) - - "⩚": [T: "kolminkertainen vaakasuora viiva kaksinkertaisella pystysuoralla viivalla"] # 0x2a68 (en: 'triple horizontal bar with double vertical stroke', google translation) - - "â©©": [T: "kolminkertainen vaakasuora viiva kolminkertaisella pystysuoralla viivalla"] # 0x2a69 (en: 'triple horizontal bar with triple vertical stroke', google translation) - - "â©Ș": [T: "tilde ylĂ€pisteellĂ€"] # 0x2a6a (en: 'tilde operator with dot above', google: 'tilde -operaattori, jossa on pisteen yllĂ€') - - "â©«": [T: "tilde nousevilla pisteillĂ€"] # 0x2a6b (en: 'tilde operator with rising dots', google translation) - - "⩏": [T: "samankaltainen miinus samankaltainen"] # 0x2a6c (en: 'similar minus similar', google translation) - - "â©­": [T: "kongruentti ylĂ€pisteellĂ€"] # 0x2a6d (en: 'congruent with dot above', google: 'yhteydet yllĂ€ olevan dot: n kanssa') - - "⩟": [T: "on yhtĂ€ suuri kuin tĂ€hdellĂ€"] # 0x2a6e (en: 'equals with asterisk', google translation) - - "⩯": [T: "on lĂ€hes yhtĂ€ suuri kuin sirkumfleksillĂ€"] # 0x2a6f (en: 'almost equal to with circumflex accent', google: 'lĂ€hes') - - "â©°": [T: "on suunnilleen yhtĂ€ suuri tai yhtĂ€ suuri kuin"] # 0x2a70 (en: 'approximately equal to or equal to', google translation) - - "⩱": [T: "on yhtĂ€ suuri kuin ja plus alapuolella"] # 0x2a71 (en: 'equals sign above plus sign', google: 'vastaa merkkiĂ€ yllĂ€ plus merkki') - - "â©Č": [T: "on yhtĂ€ suuri kuin ja plus ylĂ€puolella"] # 0x2a72 (en: 'plus sign above equals sign', google: 'plus -merkki yllĂ€ on yhtĂ€ suuri merkki') - - "⩳": [T: "on yhtĂ€ suuri kuin ja tilde alapuolella"] # 0x2a73 (google: 'yhtĂ€ suuri kuin merkki tilde -operaattorin ylĂ€puolella') - - "⩎": [T: "tuplakaksoispiste on yhtĂ€ suuri kuin"] # 0x2a74 (google: 'kaksinkertainen paksusuolen tasainen') - - "â©”": [T: "kaksi perĂ€kkĂ€istĂ€ on yhtĂ€ suuri kuin -merkkiĂ€"] # 0x2a75 (en: 'two consecutive equals signs', google: 'kaksi perĂ€kkĂ€istĂ€ vastaa merkkejĂ€') - - "â©¶": [T: "kolme perĂ€kkĂ€istĂ€ on yhtĂ€ suuri kuin -merkkiĂ€"] # 0x2a76 (en: 'three consecutive equals signs', google translation) - - "â©·": [T: "on yhtĂ€ suuri kuin kahdella ylĂ€pisteellĂ€ ja kahdella alapisteellĂ€"] # 0x2a77 (en: 'equals sign with two dots above and two dots below', google: 'yhtĂ€ suuri kuin kaksi pistettĂ€ yllĂ€ ja kaksi pistettĂ€ alla') - - "⩞": [T: "on yhtĂ€ suuri kuin neljĂ€llĂ€ ylĂ€pisteellĂ€"] # 0x2a78 (en: 'equivalent with four dots above', google: 'vastaa neljĂ€llĂ€ pisteellĂ€ yllĂ€') - - "â©č": [T: "pienempi kuin ja ympyrĂ€ sisĂ€llĂ€"] # 0x2a79 (en: 'less than with circle inside', google: 'vĂ€hemmĂ€n kuin ympyrĂ€llĂ€ sisĂ€llĂ€') - - "â©ș": [T: "suurempi kuin ja ympyrĂ€ sisĂ€llĂ€"] # 0x2a7a (en: 'greater than with circle inside', google: 'suurempi kuin ympyrĂ€llĂ€ sisĂ€llĂ€') - - "â©»": [T: "pienempi kuin ja kysymysmerkki ylĂ€puolella"] # 0x2a7b (en: 'less than with question mark above', google: 'vĂ€hemmĂ€n kuin yllĂ€ oleva kysymys') - - "⩌": [T: "suurempi kuin ja kysymysmerkki ylĂ€puolella"] # 0x2a7c (en: 'greater than with question mark above', google: 'suurempi kuin yllĂ€ oleva kysymys') - - "⩜": [T: "pienempi kuin tai vino on yhtĂ€ suuri kuin"] # 0x2a7d (google: 'vĂ€hemmĂ€n kuin vino kuin') - - "⩟": [T: "suurempi kuin tai vino on yhtĂ€ suuri kuin"] # 0x2a7e (en: 'greater than or slanted equal to', google: 'suurempi kuin vino yhtĂ€ suuri kuin') - - "⩿": [T: "pienempi kuin tai vino on yhtĂ€ suuri kuin ja piste sisĂ€llĂ€"] # 0x2a7f (en: 'less than or slanted equal to with dot inside', google: 'vĂ€hemmĂ€n tai vino yhtĂ€ suuri kuin pisteellĂ€') - - "âȘ€": [T: "suurempi kuin tai vino on yhtĂ€ suuri kuin ja piste sisĂ€llĂ€"] # 0x2a80 (en: 'greater than or slanted equal to with dot inside', google: 'suurempi tai viistot yhtĂ€ suuri kuin pisteellĂ€') - - "âȘ": [T: "pienempi kuin tai vino on yhtĂ€ suuri kuin ja piste ylĂ€puolella"] # 0x2a81 (en: 'less than or slanted equal to with dot above', google: 'vĂ€hemmĂ€n kuin vino yhtĂ€ suuri kuin yllĂ€ olevalla pisteellĂ€') - - "âȘ‚": [T: "suurempi kuin tai vino on yhtĂ€ suuri kuin ja piste ylĂ€puolella"] # 0x2a82 (en: 'greater than or slanted equal to with dot above', google: 'suurempi kuin vino kuin yllĂ€ olevalla pisteellĂ€') - - "âȘƒ": [T: "pienempi kuin tai vino on yhtĂ€ suuri kuin ja piste ylĂ€oikealla"] # 0x2a83 (en: 'less than or slanted equal to with dot above right', google: 'vĂ€hemmĂ€n tai viistot yhtĂ€ suuri kuin oikean ylĂ€puolella') - - "âȘ„": [T: "suurempi kuin tai vino on yhtĂ€ suuri kuin ja piste ylĂ€vasemmalla"] # 0x2a84 (en: 'greater than or slanted equal to with dot above left', google: 'suurempi kuin vino kuin vasemman ylĂ€puolella oleva piste') - - "âȘ…": [T: "vĂ€hemmĂ€n tai likimÀÀrin"] # 0x2a85 (en: 'less than or approximate', google translation) - - "âȘ†": [T: "suurempi tai likimÀÀrin"] # 0x2a86 (en: 'greater than or approximate', google translation) - - "âȘ‡": [T: "pienempi kuin ja yksiviivainen ei yhtĂ€ suuri kuin"] # 0x2a87 (en: 'less than and single line not equal to', google translation) - - "âȘˆ": [T: "suurempi kuin ja yksiviivainen ei yhtĂ€ suuri kuin"] # 0x2a88 (en: 'greater than and single line not equal to', google translation) - - "âȘ‰": [T: "pienempi kuin mutta ei likimÀÀrin"] # 0x2a89 (en: 'less than and not approximate', google: 'vĂ€hemmĂ€n kuin ja ei likimÀÀrĂ€inen') - - "âȘŠ": [T: "suurempi kuin mutta ei likimÀÀrin"] # 0x2a8a (en: 'greater than and not approximate', google: 'suurempi kuin ja ei likimÀÀrĂ€inen') - - "âȘ‹": [T: "pienempi kuin jonka alapuolella vaakaviiva jonka alapuolella suurempi kuin"] # 0x2a8b (en: 'less than above double line equal above greater than', google translation) - - "âȘŒ": [T: "suurempi kuin jonka alapuolella vaakaviiva jonka alapuolella pienempi kuin"] # 0x2a8c (en: 'greater than above double line equal above less than', google translation) - - "âȘ": [T: "pienempi kuin jonka alapuolella yhtĂ€ suuri tai likimÀÀrin yhtĂ€ suuri kuin"] # 0x2a8d (google: 'vĂ€hemmĂ€n kuin samanlainen tai tasainen') - - "âȘŽ": [T: "suurempi kuin jonka alapuolella yhtĂ€ suuri tai limikÀÀrin yhtĂ€ suuri kuin"] # 0x2a8e (google: 'suurempi kuin samanlainen tai tasainen') - - "âȘ": [T: "pienempi kuin jonka alapuolella likimÀÀrin jonka alapuolella suurempi kuin"] # 0x2a8f (google: 'vĂ€hemmĂ€n kuin ylĂ€puolella ylĂ€puolella suurempi kuin') - - "âȘ": [T: "suurempi kuin jonka alapuolella likimÀÀrin jonka alapuolella suurempi kuin"] # 0x2a90 (google: 'suurempi kuin edellĂ€ mainitussa ylĂ€puolella') - - "âȘ‘": [T: "pienempi kuin suurempi kuin tai yhtĂ€ suuri kuin"] # 0x2a91 (en: 'less than above greater than above double line equal', google: 'alle enemmĂ€n kuin yli suurempi kuin kaksoisviiva on yhtĂ€ suuri') - - "âȘ’": [T: "suurempi kuin pienempi kuin tai yhtĂ€ suuri kuin"] # 0x2a92 (en: 'greater than above less than above double line equal', google: 'suurempi kuin ylĂ€puolella vĂ€hemmĂ€n kuin kaksoisviiva on yhtĂ€ suuri') - - "âȘ“": [T: "pienempi kuin tai vino on yhtĂ€ suuri kuin suurempi kuin tai vino on yhtĂ€ suuri kuin"] # 0x2a93 (google: 'vĂ€hemmĂ€n kuin ylĂ€puolella viistot ovat yhtĂ€ suurempia kuin ylĂ€puolella viistot ovat yhtĂ€ suuret') - - "âȘ”": [T: "suurempi kuin tai vino on yhtĂ€ suuri kuin pienempi kuin tai vino on yhtĂ€ suuri kuin"] # 0x2a94 (google: 'suurempi kuin ylĂ€puolella viistot ovat yhtĂ€ suurempia kuin viistojen ylĂ€puolella yhtĂ€ suuret') - - "âȘ•": [T: "vino on yhtĂ€ suuri kuin tai pienempi kuin"] # 0x2a95 (en: 'slanted equal to or less than', google translation) - - "âȘ–": [T: "vino on yhtĂ€ suuri kuin tai suurempi kuin"] # 0x2a96 (en: 'slanted equal to or greater than', google translation) - - "âȘ—": [T: "vino on yhtĂ€ suuri kuin tai pienempi kuin ja piste sisĂ€llĂ€"] # 0x2a97 (en: 'slanted equal to or less than with dot inside', google: 'viisto yhtĂ€ tai vĂ€hemmĂ€n kuin pisteellĂ€ sisĂ€llĂ€') - - "âȘ˜": [T: "vino on yhtĂ€ suuri kuin tai suurempi kuin ja piste sisĂ€llĂ€"] # 0x2a98 (en: 'slanted equal to or greater than with dot inside', google: 'viisto yhtĂ€ tai suurempi kuin pisteellĂ€ sisĂ€llĂ€') - - "âȘ™": [T: "on yhtĂ€ suuri kuin tai pienempi kuin"] # 0x2a99 (en: 'double line equal to or less than', google: 'kaksoisviiva, joka on yhtĂ€ suuri tai vĂ€hemmĂ€n kuin') - - "âȘš": [T: "on yhtĂ€ suuri kuin tai suurempi kuin"] # 0x2a9a (en: 'double line equal to or greater than', google: 'kaksoisviiva, joka on yhtĂ€ suuri tai suurempi') - - "âȘ›": [T: "kaksoisviivainen on yhtĂ€ suuri kuin tai pienempi kuin"] # 0x2a9b (en: 'double line slanted equal to or less than', google translation) - - "âȘœ": [T: "kaksoisviivainen on yhtĂ€ suuri kuin tai suurempi kuin"] # 0x2a9c (en: 'double line slanted equal to or greater than', google translation) - - "âȘ": [T: "likimÀÀrin tai pienempi kuin"] # 0x2a9d (en: 'similar or less than', google: 'samanlainen tai vĂ€hemmĂ€n kuin') - - "âȘž": [T: "likimÀÀrin tai suurempi kuin"] # 0x2a9e (google: 'samanlainen tai suurempi kuin') - - "âȘŸ": [T: "likimÀÀrin jonka alapuolella vĂ€hemmĂ€n kuin jonka alapuolella on yhtĂ€ suuri kuin"] # 0x2a9f (google: 'samanlainen ylĂ€puolella vĂ€hemmĂ€n kuin yllĂ€ oleva merkki') - - "âȘ ": [T: "likimÀÀrin jonka alapuolella suurempi kuin jonka alapuolella on yhtĂ€ suuri kuin"] # 0x2aa0 (google: 'samanlainen ylĂ€puolella suurempi kuin yllĂ€ oleva merkki') - - "âȘĄ": [T: "sisĂ€kkĂ€iset pienempi kuin"] # 0x2aa1 (en: 'double nested less than', google: 'kaksinkertainen sisĂ€kkĂ€in vĂ€hemmĂ€n kuin') - - "âȘą": [T: "sisĂ€kkĂ€iset suurempi kuin"] # 0x2aa2 (en: 'double nested greater than', google: 'kaksinkertainen sisĂ€kkĂ€inen suurempi kuin') - - "âȘŁ": [T: "kaksi sisĂ€llĂ€istĂ€ pienempi kuin alaviivalla"] # 0x2aa3 (en: 'double nested less than with underbar', google translation) - - "âȘ€": [T: "pienempi kuin -merkki suurempi kuin -merkin pÀÀllĂ€"] # 0x2aa4 (en: 'greater than overlapping less than', google: 'suurempi kuin pÀÀllekkĂ€isyys vĂ€hemmĂ€n kuin') - - "âȘ„": [T: "suurempi kuin pienempi kuin"] # 0x2aa5 (google: 'suurempi kuin vĂ€hemmĂ€n kuin') - - "âȘŠ": [T: "pienempi kuin suljettu kĂ€yrĂ€llĂ€"] # 0x2aa6 (google: 'vĂ€hemmĂ€n kuin kĂ€yrĂ€ suljettu') - - "âȘ§": [T: "suurempi kuin suljettu kĂ€yrĂ€llĂ€"] # 0x2aa7 (google: 'suurempi kuin kĂ€yrĂ€ suljettu') - - "âȘš": [T: "pienempi kuin suljettu kĂ€yrĂ€llĂ€ tai yhtĂ€ suuri kuin"] # 0x2aa8 (google: 'vĂ€hemmĂ€n kuin suljettuna kĂ€yrĂ€llĂ€ viistolla tasavertaisesti') - - "âȘ©": [T: "suurempi kuin suljettu kĂ€yrĂ€llĂ€ tai yhtĂ€ suuri kuin"] # 0x2aa9 (google: 'suurempi kuin suljettu kaarulla, joka on viistolla yhtĂ€ suuri') - - "âȘȘ": [T: "pienempi kuin vaakaviivalla"] # 0x2aaa (google: 'pienempi kuin') - - "âȘ«": [T: "suurempi kuin vaakaviivalla"] # 0x2aab (google: 'suurempi kuin') - - "âȘŹ": [T: "pienempi kuin vaakaviivalla tai yhtĂ€ suuri kuin"] # 0x2aac (google: 'pienempi tai yhtĂ€ suuri kuin') - - "âȘ­": [T: "suurempi kuin vaakaviivalla tai yhtĂ€ suuri kuin"] # 0x2aad (google: 'suurempi tai yhtĂ€ suuri kuin') - - "âȘź": [T: "ero vĂ€lillĂ€"] # 0x2aae (en: 'equals sign with bumpy above', google: 'yhtĂ€ suuri kuin kuohuttava yllĂ€') # FI: translation unclear - - "âȘŻ": [T: "edeltÀÀ jonka alapuolella yksiviivainen yhtĂ€ suuri kuin"] # 0x2aaf (google: 'ennen yhden rivin ylĂ€puolella on yhtĂ€ suuri kuin merkki') - - "âȘ°": [T: "seuraa jonka alapuolella yksiviivainen yhtĂ€ suuri kuin"] # 0x2ab0 (en: 'succeeds above single line equals sign', google translation) - - "âȘ±": [T: "edeltÀÀ jonka alapuolella yksiviivainen ei yhtĂ€ suuri kuin"] # 0x2ab1 (en: 'precedes above single line not equal to', google translation) - - "âȘČ": [T: "seuraa jonka alapuolella yksiviivainen ei yhtĂ€ suuri kuin"] # 0x2ab2 (en: 'succeeds above single line not equal to', google translation) - - "âȘł": [T: "edeltÀÀ jonka alapuolella yhtĂ€ suuri kuin"] # 0x2ab3 (en: 'precedes above equals sign', google translation) - - "âȘŽ": [T: "seuraa jonka alapuolella yhtĂ€ suuri kuin"] # 0x2ab4 (en: 'succeeds above equals sign', google translation) - - "âȘ”": [T: "edeltÀÀ mutta ei ole yhtĂ€ suuri kuin"] # 0x2ab5 (en: 'precedes above not equal to', google: 'edellĂ€ on edellĂ€, joka ei ole yhtĂ€ suuri kuin') - - "âȘ¶": [T: "seuraa mutta ei ole yhtĂ€ suuri kuin"] # 0x2ab6 (en: 'succeeds above not equal to', google: 'onnistuu ylĂ€puolella, ei ole yhtĂ€ suuri kuin') - - "âȘ·": [T: "edeltÀÀ ja on likimÀÀrin"] # 0x2ab7 (en: 'precedes above almost equal to', google translation) - - "âȘž": [T: "seuraa ja on likimÀÀrin"] # 0x2ab8 (en: 'succeeds above almost equal to', google translation) - - "âȘč": [T: "edeltÀÀ mutta ei ole likimÀÀrin"] # 0x2ab9 (en: 'precedes above not almost equal to', google translation) - - "âȘș": [T: "seuraa mutta ei ole likimÀÀrin"] # 0x2aba (en: 'succeeds above not almost equal to', google translation) - - "âȘ»": [T: "kaksinkertainen edeltÀÀ"] # 0x2abb (google: 'kaksinkertainen edeltĂ€vĂ€') - - "âȘŒ": [T: "kaksinkertainen seuraa"] # 0x2abc (google: 'double onnistuu') - - "âȘœ": [T: "osajoukko pisteellĂ€"] # 0x2abd (en: 'subset with dot', google: 'alajoukko pisteellĂ€') - - "âȘŸ": [T: "ylijoukko pisteellĂ€"] # 0x2abe (en: 'superset with dot', google: 'superset pisteellĂ€') - - "âȘż": [T: "osajoukko ja alapuolella plus"] # 0x2abf (en: 'subset with plus sign below', google: 'alajoukko plus -merkki alla') - - "⫀": [T: "ylijoukko ja alapuolella plus"] # 0x2ac0 (en: 'superset with plus sign below', google: 'superset alla olevalla merkinnĂ€llĂ€') - - "⫁": [T: "osajoukko ja alapuolella kertomerkki"] # 0x2ac1 (en: 'subset with multiplication sign below', google: 'alajoukko alla olevalla kertolaskulla') - - "⫂": [T: "ylijoukko ja alapuolella kertomerkki"] # 0x2ac2 (en: 'superset with multiplication sign below', google: 'superset alla olevalla kertolaskulla') - - "⫃": [T: "osajoukko tai yhtĂ€ suuri kuin ja ylĂ€puolella piste"] # 0x2ac3 (en: 'subset of or equal to with dot above', google: 'alajoukko tai yhtĂ€ suuri kuin yllĂ€ olevalla pisteellĂ€') - - "⫄": [T: "ylijoukko tai yhtĂ€ suuri kuin ja ylĂ€puolella piste"] # 0x2ac4 (en: 'superset of or equal to with dot above', google: 'superset tai yhtĂ€ suuri kuin yllĂ€ olevalla pisteellĂ€') - - "⫅": [T: "osajoukko tai yhtĂ€ suuri kuin"] # 0x2ac5 (en: 'subset of above equals sign', google translation) - - "⫆": [T: "ylijoukko tai yhtĂ€ suuri kuin"] # 0x2ac6 (en: 'superset of above equals sign', google translation) - - "⫇": [T: "likimÀÀrin osajoukko"] # 0x2ac7 (en: 'subset of above tilde operator', google: 'yllĂ€ olevan tilde -operaattorin osajoukko') - - "⫈": [T: "likimÀÀrin ylijoukko"] # 0x2ac8 (en: 'superset of above tilde operator', google: 'tilde -operaattorin ylĂ€puolella') - - "⫉": [T: "osajoukko jonka alapuolella likimÀÀrin yhtĂ€ suuri kuin"] # 0x2ac9 (en: 'subset of above almost equal to', google translation) - - "⫊": [T: "ylijoukko jonka alapuolella likimÀÀrin yhtĂ€ suuri kuin"] # 0x2aca (en: 'superset of above almost equal to', google translation) - - "⫋": [T: "osajoukko mutta ei yhtĂ€ suuri kuin"] # 0x2acb (en: 'subset above not equal to', google translation) - - "⫌": [T: "ylijoukko mutta ei yhtĂ€ suuri kuin"] # 0x2acc (en: 'superset of above not equal to', google translation) - - "⫍": [T: "laatikko-operaattori jonka vasen puoli avoin"] # 0x2acd (en: 'square left open box operator', google translation) # FI: translation unclear - - "⫎": [T: "laatikko-operaattori jonka oikea puoli avoin"] # 0x2ace (en: 'square right open box operator', google translation) # FI: translation unclear - - "⫏": [T: "suljettu osajoukko"] # 0x2acf (google: 'suljettu alajoukko') - - "⫐": [T: "suljettu ylijoukko"] # 0x2ad0 (google: 'suljettu superset') - - "⫑": [T: "suljettu osajoukko tai yhtĂ€ suuri kuin"] # 0x2ad1 (google: 'suljettu osajoukko tai yhtĂ€ suuri kuin') - - "⫒": [T: "suljettu ylijoukko tai yhtĂ€ suuri kuin"] # 0x2ad2 (google: 'suljettu superset tai yhtĂ€ suuri kuin') - - "⫓": [T: "osajoukko ylijoukon ylĂ€puolella"] # 0x2ad3 (en: 'subset above superset', google: 'supersetin ylĂ€puolella') - - "⫔": [T: "ylijoukko osajoukon ylĂ€puolella"] # 0x2ad4 (en: 'superset above subset', google: 'superset alajoukon ylĂ€puolella') - - "⫕": [T: "osajoukko osajoukon ylĂ€puolella"] # 0x2ad5 (en: 'subset above subset', google: 'alajoukko alajoukossa') - - "⫖": [T: "ylijoukko ylijoukon ylĂ€puolella"] # 0x2ad6 (en: 'superset above superset', google: 'superset supersetin ylĂ€puolella') - - "⫗": [T: "ylijoukko osajoukon vieressĂ€"] # 0x2ad7 (google: 'superset alajoukon vieressĂ€') - - "⫘": [T: "ylijoukko osajoukon vieressĂ€ yhdistettynĂ€ viivalla"] # 0x2ad8 (en: 'superset beside and joined by dash with subset', google: 'superset vieressĂ€ ja liittyi viivalla alajoukkoon') - - "⫙": [T: "alaspĂ€in aukeava kuuluu joukkoon"] # 0x2ad9 (google: 'elementti avautumisesta alaspĂ€in') - - "⫚": [T: "hanko t-ylĂ€osalla"] # 0x2ada (en: 'pitchfork with tee top', google: 'pitchfork tee -top') # FI: translation unclear - - "⫛": [T: "poikittainen leikkaus"] # 0x2adb (google: 'poikittainen risteys') # FI: translation unclear - - "⫝̸": [T: "haarukka"] # 0x2adc (en: 'forking', google translation) # FI: translation unclear - - "⫝": [T: "ei-haarukka"] # 0x2add (en: 'nonforking', google translation) # FI: translation unclear - - "⫞": [T: "lyhyt nasta vasemmalle"] # 0x2ade (en: 'short left tack', google translation) - - "⫟": [T: "lyhyt nasta alaspĂ€in"] # 0x2adf (en: 'short down tack', google translation) - - "â« ": [T: "lyhyt nasta ylöspĂ€in"] # 0x2ae0 (en: 'short up tack', google translation) - - "⫥": [T: "kohtisuora ja s"] # 0x2ae1 (en: 'perpendicular with s', google translation) - - "⫹": [T: "pystysuora palkki ja kolminkertainen oikea kÀÀntöportti"] # 0x2ae2 (en: 'vertical bar triple right turnstile', google translation) - - "⫣": [T: "kaksinkertainen pystysuora viiva ja vasen kÀÀntöportti"] # 0x2ae3 (en: 'double vertical bar left turnstile', google translation) - - "â«€": [T: "pystyviiva ja vasemmanpuoleinen kaksoiskÀÀntöportti"] # 0x2ae4 (en: 'vertical bar double left turnstile', google: 'pystysuora palkki kaksinkertainen vasen kÀÀntölaite') - - "â«„": [T: "kaksoispystyviiva ja vasemmanpuoleinen kaksoiskÀÀntöportti"] # 0x2ae5 (en: 'double vertical bar double left turnstile', google translation) - - "⫊": [T: "pitkĂ€ viiva kahden pystyviivan vasemmanpuoleisesta viivasta"] # 0x2ae6 (google: 'pitkĂ€ viiva double pystysuoran vasemmalta jĂ€seneltĂ€') - - "â«§": [T: "lyhyt nasta alaspĂ€in ylĂ€viivalla"] # 0x2ae7 (en: 'short down tack with overbar', google: 'lyhyt alaspĂ€in tarttuva ylikuormitus') - - "⫚": [T: "lyhyt nasta ylöspĂ€in alaviivalla"] # 0x2ae8 (en: 'short up tack with underbar', google: 'lyhyt up takki alapalkissa') - - "â«©": [T: "lyhyt nasta ylöspĂ€in jonka alapuolella lyhyt nasta alaspĂ€in"] # 0x2ae9 (google: 'lyhyt ylösnopeus lyhyen alaspĂ€in') - - "â«Ș": [T: "kaksinkertainen nasta alaspĂ€in"] # 0x2aea (en: 'double down tack', google translation) - - "â««": [T: "kaksinkertainen nasta ylöspĂ€in"] # 0x2aeb (google: 'kaksinkertainen tarttuva') - - "⫏": [T: "kaksoisviiva ei"] # 0x2aec (en: "double stroke not sign" google: 'kaksinkertainen isku ei allekirjoittaa') - - "â«­": [T: "kÀÀnnetty kaksoisviiva ei"] # 0x2aed (en: "reversed double stroke not sign" google: 'kÀÀnteinen kaksoishalvaus ei allekirjoittaa') - - "⫟": [T: "ei jaa kÀÀnnetyllĂ€ negaatioviivalla"] # 0x2aee (en: 'does not divide with reversed negation slash', google: 'ei jaa kÀÀnnetyn kielteisen viivan kanssa') - - "⫯": [T: "pystyviiva ja ympyrĂ€ ylĂ€puolella"] # 0x2aef (en: 'vertical line with circle above', google: 'pystysuora viiva ympyrĂ€n kanssa') - - "â«°": [T: "pystyviiva ja ympyrĂ€ alapuolella"] # 0x2af0 (en: 'vertical line with circle below', google: 'pystysuora viiva, jossa ympyrĂ€ alla') - - "⫱": [T: "nasta alaspĂ€in ja ympyrĂ€ alapuolella"] # 0x2af1 (en: 'down tack with circle below', google: 'alaspĂ€in ympyrĂ€ alla') - - "â«Č": [T: "yhdensuuntainen poikkiviivalla"] # 0x2af2 (en: 'parallel with horizontal stroke', google: 'yhdensuuntainen vaakasuuntaisen iskun kanssa') - - "⫳": [T: "yhdensuuntainen tildellĂ€"] # 0x2af3 (en: 'parallel with tilde operator', google: 'rinnakkain tilde -operaattorin kanssa') - - "⫎": [T: "kolminkertainen pystysuora viiva binÀÀrirelaatiolla"] # 0x2af4 (en: 'triple vertical bar binary relation', google translation) - - "â«”": [T: "kolminkertainen pystysuora viiva poikkiviivalla"] # 0x2af5 (en: 'triple vertical bar with horizontal stroke', google translation) - - "â«¶": [T: "kolmoispisteoperaattori"] # 0x2af6 (en: 'triple colon operator', google translation) - - "â«·": [T: "kolminkertainen sisĂ€kkĂ€inen vĂ€hemmĂ€n kuin"] # 0x2af7 (en: 'triple nested less than', google translation) - - "⫞": [T: "kolminkertainen sisĂ€kkĂ€inen suurempi kuin"] # 0x2af8 (en: 'triple nested greater than', google translation) - - "â«č": [T: "pienempi kuin tai vino kaksinkertainen on yhtĂ€ suuri kuin"] # 0x2af9 (en: 'double line slanted less than or equal to', google translation) - - "â«ș": [T: "suurempi kuin tai vino kaksinkertainen on yhtĂ€ suuri kuin"] # 0x2afa (en: 'double line slanted greater than or equal to', google translation) - - "â«»": [T: "kolminkertainen vinoviiva binÀÀrirelaatiolla"] # 0x2afb (en: 'triple solidus binary relation', google translation) - - "⫌": [T: "suuri kolminkertainen pystyviiva"] # 0x2afc (en: 'large triple vertical bar operator', google translation) - - "⫝̸": [T: "kaksoisvinoviiva"] # 0x2afd (en: 'double solidus operator', google translation) - - "⫟": [T: "valkoinen pystysuora palkki"] # 0x2afe (en: 'white vertical bar', google translation) - - "⫿": [T: "valkoinen pystysuora palkki"] # 0x2aff (en: 'white vertical bar', google translation) - - "⬀": [T: "ylĂ€oikealle osoittava valkoinen nuoli"] # 0x2b00 (en: 'north east white arrow', google translation) - - "⏁": [T: "ylĂ€vasemmalle osoittava valkoinen nuoli"] # 0x2b01 (en: 'north west white arrow', google translation) - - "⬂": [T: "alaoikealle osoittava valkoinen nuoli"] # 0x2b02 (en: 'south east white arrow', google translation) - - "⏃": [T: "alavasemmalle osoittava valkoinen nuoli"] # 0x2b03 (en: 'south west white arrow', google translation) - - "⬄": [T: "oikealle ja vasemmalle osoittava valkoinen nuoli"] # 0x2b04 (en: 'left right white arrow', google translation) - - "⬅": [T: "vasen musta nuoli"] # 0x2b05 (en: 'leftwards black arrow', google translation) - - "⬆": [T: "ylöspĂ€in osoittava musta nuoli"] # 0x2b06 (en: 'upwards black arrow', google translation) - - "⬇": [T: "alaspĂ€in osoittava musta nuoli"] # 0x2b07 (en: 'downwards black arrow', google translation) - - "⏈": [T: "ylĂ€oikealle osoittava musta nuoli"] # 0x2b08 (en: 'north east black arrow', google translation) - - "⬉": [T: "ylĂ€vasemmalle osoittava musta nuoli"] # 0x2b09 (en: 'north west black arrow', google translation) - - "⬊": [T: "alaoikealle osoittava musta nuoli"] # 0x2b0a (en: 'south east black arrow', google translation) - - "⬋": [T: "alavasemmalle osoittava musta nuoli"] # 0x2b0b (en: 'south west black arrow', google translation) - - "⬌": [T: "vasemmalle ja oikealle osoittava musta nuoli"] # 0x2b0c (en: 'left right black arrow', google translation) - - "⬍": [T: "ylös ja alas osoittava musta nuoli"] # 0x2b0d (en: 'up down black arrow', google translation) - - "⬎": [T: "oikealle ja alas osoittava nuoli"] # 0x2b0e (en: 'rightwards arrow with tip downwards', google translation) - - "⬏": [T: "oikealle ja ylös osoittava nuoli"] # 0x2b0f (en: 'rightwards arrow with tip upwards', google translation) - - "⏐": [T: "vasemmalle ja alas osoittava nuoli"] # 0x2b10 (en: 'leftwards arrow with tip downwards', google translation) - - "⬑": [T: "vasemmalle ja ylös osoittava nuoli"] # 0x2b11 (en: 'leftwards arrow with tip upwards', google translation) - - "⬒": [T: "neliö mustalla ylĂ€puoliskolla"] # 0x2b12 (en: 'square with top half black', google translation) - - "⬓": [T: "neliö mustalla alapuoliskolla"] # 0x2b13 (en: 'square with bottom half black', google translation) - - "⬔": [T: "neliö jonka oikea diagonaali musta"] # 0x2b14 (en: 'square with upper right diagonal half black', google translation) - - "⬕": [T: "neliö jonka vasen diagonaali musta"] # 0x2b15 (en: 'square with lower left diagonal half black', google translation) - - "⬖": [T: "timantti jonka vasen puoli musta"] # 0x2b16 (en: 'diamond with left half black', google translation) - - "⬗": [T: "timantti jonka oikea puoli musta"] # 0x2b17 (en: 'diamond with right half black', google translation) - - "⏘": [T: "timantti mustalla ylĂ€puoliskolla"] # 0x2b18 (en: 'diamond with top half black', google translation) - - "⬙": [T: "timantti mustalla alapuoliskolla"] # 0x2b19 (en: 'diamond with bottom half black', google translation) - - "⬚": [T: "laatikko"] # 0x2b1a (en: 'box', google translation) - - "⬛": [T: "musta iso neliö"] # 0x2b1b (en: 'black large square', google translation) - - "⬜": [T: "valkoinen iso neliö"] # 0x2b1c (en: 'white large square', google translation) - - "⬝": [T: "musta hyvin pieni neliö"] # 0x2b1d (en: 'black very small square', google translation) - - "⬞": [T: "valkoinen hyvin pieni neliö"] # 0x2b1e (en: 'white very small square', google translation) - - "⬟": [T: "musta viisikulmio"] # 0x2b1f (en: 'black pentagon', google translation) - - "⏠": [T: "valkoinen viisikulmio"] # 0x2b20 (en: 'white pentagon', google translation) - - "⏥": [T: "valkoinen kuusikulmio"] # 0x2b21 (en: 'white hexagon', google translation) - - "⏹": [T: "musta kuusikulmio"] # 0x2b22 (en: 'black hexagon', google translation) - - "⏣": [T: "vaaka musta kuusikulmio"] # 0x2b23 (en: 'horizontal black hexagon', google translation) - - "⏀": [T: "musta iso ympyrĂ€"] # 0x2b24 (en: 'black large circle', google translation) - - "⏄": [T: "musta keskisuuri timantti"] # 0x2b25 (en: 'black medium diamond', google translation) - - "⏊": [T: "valkoinen keskisuuri timantti"] # 0x2b26 (en: 'white medium diamond', google translation) - - "⏧": [T: "musta keskipitkĂ€ vinoneliö"] # 0x2b27 (en: 'black medium lozenge', google translation) - - "⏚": [T: "valkoinen keskisuuri vinoneliö"] # 0x2b28 (en: 'white medium lozenge', google translation) - - "⏩": [T: "musta pieni timantti"] # 0x2b29 (en: 'black small diamond', google translation) - - "âŹȘ": [T: "musta pieni vinoneliö"] # 0x2b2a (en: 'black small lozenge', google translation) - - "⏫": [T: "valkoinen pieni vinoneliö"] # 0x2b2b (en: 'white small lozenge', google translation) - - "⏏": [T: "musta vaakasuora ellipsi"] # 0x2b2c (en: 'black horizontal ellipse', google translation) - - "⏭": [T: "valkoinen vaakasuora ellipsi"] # 0x2b2d (en: 'white horizontal ellipse', google translation) - - "⏟": [T: "musta pystysuora ellipsi"] # 0x2b2e (en: 'black vertical ellipse', google translation) - - "⏯": [T: "valkoinen pystysuora ellipsi"] # 0x2b2f (en: 'white vertical ellipse', google translation) - - "⏰": [T: "vasen nuoli pienellĂ€ ympyrĂ€llĂ€"] # 0x2b30 (en: 'left arrow with small circle', google translation) - - "⏱": [T: "kolme vasemmanpuoleista nuolta"] # 0x2b31 (en: 'three leftwards arrows', google translation) - - "âŹČ": [T: "vasen nuoli ympyröidulla plus-merkillĂ€"] # 0x2b32 (en: 'left arrow with circled plus', google translation) - - "⏳": [T: "pitkĂ€ vasen kiemuranuoli"] # 0x2b33 (en: 'long leftwards squiggle arrow', google translation) - - "⏎": [T: "vasen kaksipĂ€inen nuoli pystysuoralla viivalla"] # 0x2b34 (en: 'leftwards two headed arrow with vertical stroke', google translation) - - "⏔": [T: "vasen kaksipĂ€inen nuoli kaksinkertaisella pystysuoralla viivalla"] # 0x2b35 (en: 'leftwards two headed arrow with double vertical stroke', google translation) - - "⏶": [T: "vasen kaksipĂ€inen nuoli pystyviivasta"] # 0x2b36 (en: 'leftwards two headed arrow from bar', google translation) - - "⏷": [T: "vasen kaksipĂ€inen kolmoiskatkoviivanuoli"] # 0x2b37 (en: 'leftwards two headed triple dash arrow', google translation) - - "⏞": [T: "vasen nuoli katkoviivalla"] # 0x2b38 (en: 'leftwards arrow with dotted stem', google translation) - - "âŹč": [T: "vasen nuoli hĂ€nnĂ€llĂ€ ja pystyviivalla"] # 0x2b39 (en: 'leftwards arrow with tail with vertical stroke', google translation) - - "âŹș": [T: "vasen nuoli hĂ€nnĂ€llĂ€ ja kaksinkertaisella pystyviivalla"] # 0x2b3a (en: 'leftwards arrow with tail with double vertical stroke', google translation) - - "⏻": [T: "vasen kaksipĂ€inen nuoli hĂ€nnĂ€llĂ€"] # 0x2b3b (en: 'leftwards two headed arrow with tail', google translation) - - "âŹŒ": [T: "vasen kaksipĂ€inen nuoli hĂ€nnĂ€llĂ€ ja pystysuoralla viivalla"] # 0x2b3c (en: 'leftwards two headed arrow with tail with vertical stroke', google translation) - - "âŹœ": [T: "vasen kaksipĂ€inen nuoli hĂ€nnĂ€llĂ€ ja kaksinkertaisella pystysuoralla viivalla"] # 0x2b3d (en: 'leftwards two headed arrow with tail with double vertical stroke', google translation) - - "âŹŸ": [T: "vasen nuoli x:n lĂ€pi"] # 0x2b3e (en: 'leftwards arrow through x', google translation) - - "⏿": [T: "suoraan vasemmalle osoittava aaltonuoli"] # 0x2b3f (en: 'wave arrow pointing directly left', google translation) - - "⭀": [T: "on yhtĂ€ suuri kuin vasemman nuolen ylĂ€puolella"] # 0x2b40 (en: 'equals sign above leftwards arrow', google translation) - - "⭁": [T: "kÀÀnnetty tilde vasemman nuolen ylĂ€puolella"] # 0x2b41 (en: 'reverse tilde operator above leftwards arrow', google translation) - - "⭂": [T: "likimÀÀrin yhtĂ€ suuri kuin vasemman nuolen alapuolella"] # 0x2b42 (en: 'leftwards arrow above reverse almost equal to', google translation) - - "⭃": [T: "oikea nuoli suurempi kuin lĂ€pi"] # 0x2b43 (en: 'rightwards arrow through greater than', google translation) - - "⭄": [T: "oikea nuoli ylijoukon lĂ€pi"] # 0x2b44 (en: 'rightwards arrow through superset', google translation) - - "⭅": [T: "vasen nelinkertainen nuoli"] # 0x2b45 (en: 'leftwards quadruple arrow', google translation) - - "⭆": [T: "oikea nelinkertainen nuoli"] # 0x2b46 (en: 'rightwards quadruple arrow', google translation) - - "⭇": [T: "kÀÀnnetty tilde oikean nuolen ylĂ€puolella"] # 0x2b47 (en: 'reverse tilde operator above rightwards arrow', google translation) - - "⭈": [T: "kÀÀnnetty likimÀÀrin yhtĂ€ suuri kuin oikean nuolen alapuolella"] # 0x2b48 (en: 'rightwards arrow above reverse almost equal to', google translation) - - "⭉": [T: "tilde vasemman nuolen ylĂ€puolella"] # 0x2b49 (en: 'tilde operator above leftwards arrow', google translation) - - "⭊": [T: "likimÀÀrin yhtĂ€ suuri kuin vasemman nuolen alapuolella"] # 0x2b4a (en: 'leftwards arrow above almost equal to', google translation) - - "⭋": [T: "vasen nuoli kÀÀnnetyn tilden ylĂ€puolella"] # 0x2b4b (en: 'leftwards arrow above reverse tilde operator', google translation) - - "⭌": [T: "oikea nuoli kÀÀnnetyn tilden ylĂ€puolella"] # 0x2b4c (en: 'rightwards arrow above reverse tilde operator', google translation) - - "⭐": [T: "tĂ€hti"] # 0x2b50 (google: 'valkoinen keskisuuri tĂ€hti') - - "⭑": [T: "musta pieni tĂ€hti"] # 0x2b51 (google: 'musta pieni tĂ€hti') - - "⭒": [T: "valkoinen pieni tĂ€hti"] # 0x2b52 (google: 'valkoinen pieni tĂ€hti') - - "⭓": [T: "musta oikealle osoittava viisikulmio"] # 0x2b53 (en: 'black right pointing pentagon', google translation) - - "⭔": [T: "valkoinen oikealle osoittava viisikulmio"] # 0x2b54 (en: 'white right pointing pentagon', google translation) - - "⭕": [T: "raskas iso ympyrĂ€"] # 0x2b55 (en: 'heavy large circle', google translation) - - "⭖": [T: "raskas ovaali jonka sisĂ€llĂ€ ovaali"] # 0x2b56 (en: 'heavy oval with oval inside', google translation) - - "⭗": [T: "raskas ympyrĂ€ jonka sisĂ€llĂ€ ympyrĂ€"] # 0x2b57 (en: 'heavy circle with circle inside', google translation) - - "⭘": [T: "raskas ympyrĂ€"] # 0x2b58 (en: 'heavy circle', google translation) - - "⭙": [T: "raskas ympyröity saltire"] # 0x2b59 (en: 'heavy circled saltire', google translation) - - "⾀": [T: "suoran kulman korvaamismerkki"] # 0x2e00 (en: 'right angle substitution marker', google translation) - - "➁": [T: "suoran kulman korvaamismerkki pisteellĂ€"] # 0x2e01 (en: 'right angle dotted substitution marker', google translation) - - "⾂": [T: "vasen korvaus hakasulku"] # 0x2e02 (en: 'left substitution bracket', google translation) - - "➃": [T: "oikea korvaus hakasulku"] # 0x2e03 (en: 'right substitution bracket', google translation) - - "⾄": [T: "vasen korvaus hakasulku pisteellĂ€"] # 0x2e04 (en: 'left dotted substitution bracket', google translation) - - "⾅": [T: "oikea korvaus hakasulku pisteellĂ€"] # 0x2e05 (en: 'right dotted substitution bracket', google translation) - - "⾆": [T: "korotettu interpolointimerkki"] # 0x2e06 (en: 'raised interpolation marker', google translation) - - "⾇": [T: "korotettu interpolointimerkki pisteellĂ€"] # 0x2e07 (en: 'raised dotted interpolation marker', google translation) - - "➈": [T: "transposointimerkki pisteellĂ€"] # 0x2e08 (en: 'dotted transposition marker marker', google translation) - - "⾉": [T: "vasen transponointi hakasulku"] # 0x2e09 (en: 'left transposition bracket', google translation) - - "⾊": [T: "oikea transponointi hakasulku"] # 0x2e0a (en: 'right transposition bracket', google translation) - - "⾋": [T: "korotettu neliö"] # 0x2e0b (en: 'raised square', google translation) - - "⾌": [T: "vasen korotettu poistosulku"] # 0x2e0c (en: 'left raised omission bracket', google translation) - - "➍": [T: "oikea korotettu poistosulku"] # 0x2e0d (en: 'right raised omission bracket', google translation) - - "⾎": [T: "toimituskoronis"] # 0x2e0e (en: 'editorial coronis', google translation) - - "➏": [T: "kappale"] # 0x2e0f (en: 'paragraphos', google translation) - - "➐": [T: "haarukkakappale"] # 0x2e10 (en: 'forked paragraphos', google translation) - - "⾑": [T: "kÀÀnnetty haarukkakappale"] # 0x2e11 (en: 'reversed forked paragraphos', google translation) - - "⾒": [T: "hypodiastoli"] # 0x2e12 (en: 'hypodiastole', google translation) - - "⾓": [T: "obelos pisteellĂ€"] # 0x2e13 (en: 'dotted obelos', google translation) - - "⾔": [T: "ankkuri alaspĂ€in"] # 0x2e14 (en: 'downwards ancora', google translation) - - "⾕": [T: "ankkuri ylöspĂ€in"] # 0x2e15 (en: 'upwards ancora', google translation) - - "⾖": [T: "oikealle osoittava kulma pisteillĂ€"] # 0x2e16 (en: 'dotted right pointing angle', google translation) - - "⾗": [T: "kaksinkertainen vino tavuviiva"] # 0x2e17 (en: 'double oblique hyphen', google translation) - - "➘": [T: "kÀÀnteinen huutokysymys"] # 0x2e18 (en: 'inverted interrobang', google translation) - - "⾙": [T: "palmun oksa"] # 0x2e19 (en: 'palm branch', google translation) - - "⾚": [T: "tavuviiva treemalla"] # 0x2e1a (en: 'hyphen with diaeresis', google translation) - - "⾛": [T: "tilde ja rengas ylĂ€puolella"] # 0x2e1b (en: 'tilde with ring above', google translation) - - "⾜": [T: "vasen matala parafraasi hakasulku"] # 0x2e1c (en: 'left low paraphrase bracket', google translation) - - "➝": [T: "oikea matala parafraasi hakasulku"] # 0x2e1d (en: 'right low paraphrase bracket', google translation) - - "⾞": [T: "tilde ja piste ylĂ€puolella"] # 0x2e1e (en: 'tilde with dot above', google translation) - - "⾟": [T: "tilde ja piste alapuolella"] # 0x2e1f (en: 'tilde with dot below', google translation) - - "âž ": [T: "vasen pystysuora palkki piikillĂ€"] # 0x2e20 (en: 'left vertical bar with quill', google translation) - - "➥": [T: "oikea pystysuora palkki piikillĂ€"] # 0x2e21 (en: 'right vertical bar with quill', google translation) - - "âžą": [T: "ylĂ€vasen puolihakasulku"] # 0x2e22 (en: 'top left half bracket', google translation) - - "➣": [T: "ylĂ€oikea puolihakasulku"] # 0x2e23 (en: 'top right half bracket', google translation) - - "➀": [T: "alavasen puolihakasulku"] # 0x2e24 (en: 'bottom left half bracket', google translation) - - "âž„": [T: "alaoikea puolihakasulku"] # 0x2e25 (en: 'bottom right half bracket', google translation) - - "➊": [T: "vasen sivusuuntainen u-hakasulku"] # 0x2e26 (en: 'left sideways u bracket', google translation) - - "âž§": [T: "oikea sivusuuntainen u-hakasulku"] # 0x2e27 (en: 'right sideways u bracket', google translation) - - "âžš": [T: "vasen kaksinkertainen sulku"] # 0x2e28 (en: 'left double parentheses', google translation) - - "âž©": [T: "oikea kaksinkertainen sulku"] # 0x2e29 (en: 'right double parentheses', google translation) - - "âžȘ": [T: "kaksi pistettĂ€ yhden pisteen pÀÀllĂ€"] # 0x2e2a (en: 'two dots over one dot punctuation', google translation) - - "âž«": [T: "yksi piste kahden pisteen pÀÀllĂ€"] # 0x2e2b (en: 'one dot over two dots punctuation', google translation) - - "➏": [T: "neljĂ€ pistettĂ€ neliön muodossa"] # 0x2e2c (en: 'squared four dot punctuation', google translation) - - "âž­": [T: "viisi pistettĂ€"] # 0x2e2d (en: 'five dot mark', google translation) - - "âžź": [T: "kÀÀnnetty kysymysmerkki"] # 0x2e2e (en: 'reversed question mark', google translation) - - "➯": [T: "pystysuora tilde"] # 0x2e2f (en: 'vertical tilde', google translation) - - "âž°": [T: "rengaspiste"] # 0x2e30 (en: 'ring point', google translation) - - "âž±": [T: "sanaerotinpiste"] # 0x2e31 (en: 'word separator middle dot', google translation) - - "âžČ": [T: "kÀÀnnetty pilkku"] # 0x2e32 (en: 'turned comma', google translation) - - "âžł": [T: "nostettu piste"] # 0x2e33 (en: 'raised dot', google translation) - - "➎": [T: "nostettu pilkku"] # 0x2e34 (en: 'raised comma', google translation) - - "âž”": [T: "kÀÀnnetty puolipiste"] # 0x2e35 (en: 'turned semicolon', google translation) - - "âž¶": [T: "tikari vasemmalla suojalla"] # 0x2e36 (en: 'dagger with left guard', google translation) - - "âž·": [T: "tikari oikealla suojalla"] # 0x2e37 (en: 'dagger with right guard', google translation) - - "âžž": [T: "kÀÀnnetty tikari"] # 0x2e38 (en: 'turned dagger', google translation) - - "âžč": [T: "ylĂ€puolimerkki"] # 0x2e39 (en: 'top half section sign', google translation) # FI: translation unclear - - "âžș": [T: "kaksoisajatusviiva"] # 0x2e3a (en: 'two em dash', google translation) - - "âž»": [T: "kolmoisajatusviiva"] # 0x2e3b (en: 'three em dash', google translation) - - "〃": [T: "sama sisĂ€ltö -merkki"] # 0x3003 (google translation) - - "〈": [T: "vasen kulmasulku"] # 0x3008 (en: 'left angle bracket', google translation) - - "〉": [T: "oikea kulmasulku"] # 0x3009 (en: 'right angle bracket', google translation) - - "《": [T: "vasen kaksoiskulmasulku"] # 0x300a (google: 'vasen kaksoiskulma kiinnike') - - "》": [T: "oikea kaksoiskulmasulku"] # 0x300b (google: 'oikea kaksoiskulma kiinnike') - - "「": [T: "vasen nurkka hakasulku"] # 0x300c (en: 'left corner bracket', google translation) - - "」": [T: "oikea nurkka hakasulku"] # 0x300d (en: 'right corner bracket', google translation) - - "『": [T: "vasen valkoinen nurkka hakasulku"] # 0x300e (en: 'left white corner bracket', google translation) - - "』": [T: "oikea valkoinen nurkkahakasulku"] # 0x300f (en: 'right white corner bracket', google translation) - - "【": [T: "vasen musta linssimĂ€inen hakasulku"] # 0x3010 (en: 'left black lenticular bracket', google translation) - - "】": [T: "oikea musta linssimĂ€inen hakasulku"] # 0x3011 (en: 'right black lenticular bracket', google translation) - - "〔": [T: "vasen kilpikonnankuori hakasulku"] # 0x3014 (google: 'vasen kilpikonnan kuoren kiinnike') - - "〕": [T: "oikea kilpikonnankuori hakasulku"] # 0x3015 (google: 'oikea kilpikonnakuoren kiinnike') - - "〖": [T: "vasen valkoinen linssimĂ€inen hakasulku"] # 0x3016 (en: 'left white lenticular bracket', google translation) - - "〗": [T: "oikea valkoinen linssimĂ€inen hakasulku"] # 0x3017 (en: 'right white lenticular bracket', google translation) - - "〘": [T: "vasen valkoinen kilpikonnakuori hakasulku"] # 0x3018 (en: 'left white tortoise shell bracket', google translation) - - "〙": [T: "oikea valkoinen kilpikonnakuori hakasulku"] # 0x3019 (en: 'right white tortoise shell bracket', google translation) - - "〚": [T: "vasen valkoinen neliö hakasulku"] # 0x301a (google: 'vasen valkoinen neliömĂ€ki') - - "〛": [T: "oikea valkoinen neliö hakasulku"] # 0x301b (google: 'oikea valkoinen neliömĂ€ki') - - "〜": [T: "aaltomainen viiva"] # 0x301c (en: 'wave dash', google translation) - - "〰": [T: "aaltoileva viiva"] # 0x3030 (en: 'wavy dash', google: 'aaltoileva viiva') - - "㉈": [T: "ympyröity numero kymmenen mustalla neliöllĂ€"] # 0x3248 (en: 'circled number ten on black square', google translation) - - "㉉": [T: "ympyröity numero kaksikymmentĂ€ mustalla neliöllĂ€"] # 0x3249 (en: 'circled number twenty on black square', google translation) - - "㉊": [T: "ympyröity numero kolmekymmentĂ€ mustalla neliöllĂ€"] # 0x324a (en: 'circled number thirty on black square', google translation) - - "㉋": [T: "ympyröity numero neljĂ€kymmentĂ€ mustalla neliöllĂ€"] # 0x324b (en: 'circled number forty on blacks square', google translation) - - "㉌": [T: "ympyröity numero viisikymmentĂ€ mustalla neliöllĂ€"] # 0x324c (en: 'circled number fifty on black square', google translation) - - "㉍": [T: "ympyröity numero kuusikymmentĂ€ mustalla neliöllĂ€"] # 0x324d (en: 'circled number sixty on black square', google translation) - - "㉎": [T: "ympyröity numero seitsemĂ€nkymmentĂ€ mustalla neliöllĂ€"] # 0x324e (en: 'circled number seventy on black square', google translation) - - "㉏": [T: "ympyröity numero kahdeksankymmentĂ€ mustalla neliöllĂ€"] # 0x324f (en: 'circled number eighty on black square', google translation) - - "㉑": [T: "ympyröity numero kaksikymmentĂ€yksi"] # 0x3251 (en: 'circled number twenty one', google translation) - - "㉒": [T: "ympyröity numero kaksikymmentĂ€kaksi"] # 0x3252 (en: 'circled number twenty two', google translation) - - "㉓": [T: "ympyröity numero kaksikymmentĂ€kolme"] # 0x3253 (en: 'circled number twenty three', google translation) - - "㉔": [T: "ympyröity numero kaksikymmentĂ€neljĂ€"] # 0x3254 (en: 'circled number twenty four', google translation) - - "㉕": [T: "ympyröity numero kaksikymmentĂ€viisi"] # 0x3255 (en: 'circled number twenty five', google translation) - - "㉖": [T: "ympyröity numero kaksikymmentĂ€kuusi"] # 0x3256 (en: 'circled number twenty six', google translation) - - "㉗": [T: "ympyröity numero kaksikymmentĂ€seitsemĂ€n"] # 0x3257 (en: 'circled number twenty seven', google translation) - - "㉘": [T: "ympyröity numero kaksikymmentĂ€kahdeksan"] # 0x3258 (en: 'circled number twenty eight', google translation) - - "㉙": [T: "ympyröity numero kaksikymmentĂ€yhdeksĂ€n"] # 0x3259 (en: 'circled number twenty nine', google translation) - - "㉚": [T: "ympyröity numero kolmekymmentĂ€"] # 0x325a (en: 'circled number thirty', google translation) - - "㉛": [T: "ympyröity numero kolmekymmentĂ€yksi"] # 0x325b (en: 'circled number thirty one', google translation) - - "㉜": [T: "ympyröity numero kolmekymmentĂ€kaksi"] # 0x325c (en: 'circled number thirty two', google translation) - - "㉝": [T: "ympyröity numero kolmekymmentĂ€kolme"] # 0x325d (en: 'circled number thirty three', google translation) - - "㉞": [T: "ympyröity numero kolmekymmentĂ€neljĂ€"] # 0x325e (en: 'circled number thirty four', google translation) - - "㉟": [T: "ympyröity numero kolmekymmentĂ€viisi"] # 0x325f (en: 'circled number thirty five', google translation) - - "㊱": [T: "ympyröity numero kolmekymmentĂ€kuusi"] # 0x32b1 (en: 'circled number thirty six', google translation) - - "ăŠČ": [T: "ympyröity numero kolmekymmentĂ€seitsemĂ€n"] # 0x32b2 (en: 'circled number thirty seven', GPT-5.4 translation) - - "㊳": [T: "ympyröity numero kolmekymmentĂ€kahdeksan"] # 0x32b3 (en: 'circled number thirty eight', GPT-5.4 translation) - - "㊮": [T: "ympyröity numero kolmekymmentĂ€yhdeksĂ€n"] # 0x32b4 (en: 'circled number thirty nine', GPT-5.4 translation) - - "㊔": [T: "ympyröity numero neljĂ€kymmentĂ€"] # 0x32b5 (en: 'circled number forty', GPT-5.4 translation) - - "㊶": [T: "ympyröity numero neljĂ€kymmentĂ€yksi"] # 0x32b6 (en: 'circled number forty one', GPT-5.4 translation) - - "㊷": [T: "ympyröity numero neljĂ€kymmentĂ€kaksi"] # 0x32b7 (en: 'circled number forty two', GPT-5.4 translation) - - "㊾": [T: "ympyröity numero neljĂ€kymmentĂ€kolme"] # 0x32b8 (en: 'circled number forty three', GPT-5.4 translation) - - "ăŠč": [T: "ympyröity numero neljĂ€kymmentĂ€neljĂ€"] # 0x32b9 (en: 'circled number forty four', GPT-5.4 translation) - - "ăŠș": [T: "ympyröity numero neljĂ€kymmentĂ€viisi"] # 0x32ba (en: 'circled number forty five', GPT-5.4 translation) - - "㊻": [T: "ympyröity numero neljĂ€kymmentĂ€kuusi"] # 0x32bb (en: 'circled number forty six', GPT-5.4 translation) - - "ăŠŒ": [T: "ympyröity numero neljĂ€kymmentĂ€seitsemĂ€n"] # 0x32bc (en: 'circled number forty seven', GPT-5.4 translation) - - "ăŠœ": [T: "ympyröity numero neljĂ€kymmentĂ€kahdeksan"] # 0x32bd (en: 'circled number forty eight', GPT-5.4 translation) - - "ăŠŸ": [T: "ympyröity numero neljĂ€kymmentĂ€yhdeksĂ€n"] # 0x32be (en: 'circled number forty nine', GPT-5.4 translation) - - "㊿": [T: "ympyröity numero viisikymmentĂ€"] # 0x32bf (en: 'circled number fifty', GPT-5.4 translation) - - "㋌": [T: "elohopea"] # 0x32cc (en: 'mercury', google translation) - - "㋍": [T: "ergiĂ€"] # 0x32cd (google translation) - - "㋎": [T: "elektronivolttia"] # 0x32ce (en: 'electron volts', google translation) - - "㋏": [T: "L T D"] # 0x32cf (en: 'limited liability sign', google translation) - - "ă±": [T: "hehtopascalia"] # 0x3371 (en: 'hectopascals', google translation) - - "ăČ": [T: "daltonia"] # 0x3372 (en: 'daltons', google translation) - - "㍳": [T: "tĂ€htieteellistĂ€ yksikköÀ"] # 0x3373 (en: 'astronomical units', google translation) - - "㍮": [T: "baaria"] # 0x3374 (en: 'bars', google translation) - - "ă”": [T: "o V"] # 0x3375 (google translation) - - "ă¶": [T: "parsekia"] # 0x3376 (google translation) - - "ă·": [T: "desimetriĂ€"] # 0x3377 (en: 'decimeters', google translation) - - "㍾": [T: "neliödesimetriĂ€"] # 0x3378 (en: 'decimeters squared', google translation) - - "ăč": [T: "kuutiodesimetriĂ€"] # 0x3379 (en: 'decimeters cubed', google translation) - - "ăș": [T: "I U"] # 0x337a (en: 'instrumental units', google translation) - - "㎀": [T: "pikoampeeria"] # 0x3380 (google translation) - - "㎁": [T: "nanoampeeria"] # 0x3381 (google translation) - - "㎂": [T: "mikroampeeria"] # 0x3382 (en: 'microamps', google translation) - - "㎃": [T: "milliampeeria"] # 0x3383 (en: 'milliamps', google translation) - - "㎄": [T: "kiloampeeria"] # 0x3384 (google translation) - - "㎅": [T: "KilobittiĂ€"] # 0x3385 (en: 'kilobytes', google translation) - - "㎆": [T: "megatavua"] # 0x3386 (en: 'megabytes', google translation) - - "㎇": [T: "gigatavua"] # 0x3387 (en: 'gigabytes', google translation) - - "㎈": [T: "kaloria"] # 0x3388 (en: 'calories', google translation) - - "㎉": [T: "kilokaloria"] # 0x3389 (en: 'kilocalories', google translation) - - "㎊": [T: "pifaradayta"] # 0x338a (google translation) - - "㎋": [T: "nanofaradayta"] # 0x338b (en: 'nanofarads', google translation) - - "㎌": [T: "mikrofaradayta"] # 0x338c (en: 'microfarads', google translation) - - "㎍": [T: "mikrogrammaa"] # 0x338d (en: 'micrograms', google translation) - - "㎎": [T: "milligrammaa"] # 0x338e (en: 'milligrams', google translation) - - "㎏": [T: "kilogrammaa"] # 0x338f (en: 'kilograms', google translation) - - "㎐": [T: "hertsiĂ€"] # 0x3390 (google translation) - - "㎑": [T: "kilohertsiĂ€"] # 0x3391 (en: 'kilohertz', google translation) - - "㎒": [T: "megahertsiĂ€"] # 0x3392 (en: 'megahertz', google translation) - - "㎓": [T: "gigahertsiĂ€"] # 0x3393 (en: 'gigahertz', google translation) - - "㎔": [T: "terahertsiĂ€"] # 0x3394 (en: 'terahertz', google translation) - - "㎕": [T: "mikrolitraa"] # 0x3395 (en: 'microliters', google translation) - - "㎖": [T: "millilitraa"] # 0x3396 (en: 'milliliters', google translation) - - "㎗": [T: "desilitraa"] # 0x3397 (google translation) - - "㎘": [T: "kilolitraa"] # 0x3398 (en: 'kiloliters', google translation) - - "㎙": [T: "femtometriĂ€"] # 0x3399 (en: 'femtometers', google translation) - - "㎚": [T: "nanometriĂ€"] # 0x339a (en: 'nanometers', google translation) - - "㎛": [T: "mikrometriĂ€"] # 0x339b (en: 'micrometers', google translation) - - "㎜": [T: "millimetriĂ€"] # 0x339c (en: 'millimeters', google translation) - - "㎝": [T: "senttimetriĂ€"] # 0x339d (en: 'centimeters', google translation) - - "㎞": [T: "kilometriĂ€"] # 0x339e (en: 'kilometers', google translation) - - "㎟": [T: "neliömillimetriĂ€"] # 0x339f (en: 'millimeters squared', google translation) - - "㎠": [T: "neliösenttimetriĂ€"] # 0x33a0 (en: 'centimeters squared', google translation) - - "㎡": [T: "neliömetriĂ€"] # 0x33a1 (en: 'meters squared', google translation) - - "㎱": [T: "neliökilometriĂ€"] # 0x33a2 (en: 'kilometers squared', google translation) - - "㎣": [T: "kuutiomillimetriĂ€"] # 0x33a3 (en: 'millimeters cubed', google translation) - - "㎀": [T: "kuutiosenttimetriĂ€"] # 0x33a4 (en: 'centimeters cubed', google translation) - - "㎄": [T: "kuutiometriĂ€"] # 0x33a5 (en: 'meters cubed', google translation) - - "㎩": [T: "kuutiokilometriĂ€"] # 0x33a6 (en: 'kilometers cubed', google translation) - - "㎧": [T: "metriĂ€ sekunnissa"] # 0x33a7 (en: 'meters per second', google translation) - - "㎹": [T: "metriĂ€ per neliösekunti"] # 0x33a8 (en: 'meters per second squared', google translation) - - "㎩": [T: "pascalia"] # 0x33a9 (google translation) - - "ăŽȘ": [T: "kilopascalia"] # 0x33aa (google translation) - - "㎫": [T: "megapascalia"] # 0x33ab (google translation) - - "㎬": [T: "gigapascalia"] # 0x33ac (google translation) - - "㎭": [T: "radiaania"] # 0x33ad (en: 'rads', google translation) - - "㎼": [T: "radiaania sekunnissa"] # 0x33ae (en: 'rads per second', google translation) - - "㎯": [T: "radiaania neliösekunnissa"] # 0x33af (en: 'rads per second squared', google translation) - - "㎰": [T: "pikosekuntia"] # 0x33b0 (en: 'picoseconds', google translation) - - "㎱": [T: "nanosekuntia"] # 0x33b1 (en: 'nanoseconds', google translation) - - "ăŽČ": [T: "mikrosekuntia"] # 0x33b2 (en: 'microseconds', google translation) - - "㎳": [T: "millisekuntia"] # 0x33b3 (en: 'milliseconds', google translation) - - "㎮": [T: "pikovolttia"] # 0x33b4 (google translation) - - "㎔": [T: "nanovolttia"] # 0x33b5 (en: 'nanovolts', google translation) - - "㎶": [T: "mikrovolttia"] # 0x33b6 (en: 'microvolts', google translation) - - "㎷": [T: "millivolttia"] # 0x33b7 (google translation) - - "㎾": [T: "kilovolttia"] # 0x33b8 (en: 'kilovolts', google translation) - - "ăŽč": [T: "megavolttia"] # 0x33b9 (google translation) - - "ăŽș": [T: "pikowattia"] # 0x33ba (google translation) - - "㎻": [T: "nanowattia"] # 0x33bb (en: 'nanowatts', google translation) - - "ăŽŒ": [T: "mikrowattia"] # 0x33bc (en: 'microwatts', google translation) - - "ăŽœ": [T: "milliwattia"] # 0x33bd (google translation) - - "ăŽŸ": [T: "kilowattia"] # 0x33be (en: 'kilowatts', google translation) - - "㎿": [T: "megawattia"] # 0x33bf (google translation) - - "㏀": [T: "kilo-ohmia"] # 0x33c0 (google translation) - - "㏁": [T: "megaohmia"] # 0x33c1 (google translation) - - "㏂": [T: "a m"] # 0x33c2 (en: 'attometers', google translation) - - "㏃": [T: "becquerelia"] # 0x33c3 (google translation) - - "㏄": [T: "kuutiosenttimetriĂ€"] # 0x33c4 (en: 'cubic centimeters', google translation) - - "㏅": [T: "candelaa"] # 0x33c5 (google translation) - - "㏆": [T: "coulombia kilogrammassa"] # 0x33c6 (en: 'coulombs per kilogram', google translation) - - "㏇": [T: "C o piste"] # 0x33c7 (en: 'cardiac output', google translation) - - "㏈": [T: "desibeliĂ€"] # 0x33c8 (en: 'decibels', google translation) - - "㏉": [T: "grayta"] # 0x33c9 (en: 'grays', google translation) - - "㏊": [T: "hehtaaria"] # 0x33ca (en: 'hectares', google translation) - - "㏋": [T: "hevosvoimaa"] # 0x33cb (en: 'horsepower', google translation) - - "㏌": [T: "tuumaa"] # 0x33cc (en: 'inches', google translation) - - "㏍": [T: "kilokelviniĂ€"] # 0x33cd (google translation) - - "㏎": [T: "kilometriĂ€"] # 0x33ce (en: 'kilometers', google translation) - - "㏏": [T: "solmua"] # 0x33cf (en: 'knots', google translation) - - "㏐": [T: "lumenia"] # 0x33d0 (google translation) - - "㏑": [T: "luonnollinen logaritmi"] # 0x33d1 (en: 'natural log', google translation) - - "㏒": [T: "logaritmi"] # 0x33d2 (en: 'logarithm', google translation) - - "㏓": [T: "luxia"] # 0x33d3 (google translation) - - "㏔": [T: "millibarnia"] # 0x33d4 (google translation) - - "㏕": [T: "milliĂ€"] # 0x33d5 (en: 'mills', google translation) - - "㏖": [T: "moolia"] # 0x33d6 (en: 'moles', google translation) - - "㏗": [T: "p H"] # 0x33d7 (google translation) - - "㏘": [T: "pikometriĂ€"] # 0x33d8 (en: 'picometers', google translation) - - "㏙": [T: "miljoonasosaa"] # 0x33d9 (en: 'parts per million', google translation) - - "㏚": [T: "petaröntgeniĂ€"] # 0x33da (google translation) - - "㏛": [T: "steradiaania"] # 0x33db (en: 'steradians', google translation) - - "㏜": [T: "sievertiĂ€"] # 0x33dc (en: 'sieverts', google translation) - - "㏝": [T: "weberiĂ€"] # 0x33dd (google translation) - - "㏞": [T: "volttia per metri"] # 0x33de (en: 'volts per meter', google translation) - - "㏟": [T: "ampeeria per metri"] # 0x33df (en: 'amps per meter', google translation) - - "㏿": [T: "gallonaa"] # 0x33ff (en: 'gallons', google translation) - - "": [T: "on yhtĂ€ suuri kuin ja hattu alapuolella"] # 0xe900 (en: 'equals with hat below', google translation) - - "": [T: "on yhtĂ€ suuri kuin ja plus ylĂ€puolella"] # 0xe901 (en: 'equals with plus above', google translation) - - "": [T: "on yhtĂ€ suuri kuin ja plus alapuolella"] # 0xe902 (en: 'equals with plus below', google translation) - - "": [T: "tilde ja plus ylĂ€puolella"] # 0xe903 (en: 'tilde with plus above', google translation) - - "": [T: "tilde ja plus alapuolella"] # 0xe904 (en: 'tilde with plus below', google translation) - - "": [T: "kaksinkertainen on yhtĂ€ suuri kuin ja alapuolella suurempi kuin"] # 0xe908 (en: 'equal double over greater than', google translation) - - "": [T: "kaksinkertainen on yhtĂ€ suuri kuin ja alapuolella pienempi kuin"] # 0xe909 (en: 'equal double over less than', google translation) - - "": [T: "sisĂ€ltÀÀ tai on yhtĂ€ suuri kuin"] # 0xe90a (en: 'contains or equal to', google translation) - - "": [T: "ylijoukko tai yhtĂ€ suuri kuin"] # 0xe90b (en: 'superset of or equal to', google translation) - - "": [T: "osajoukko tai yhtĂ€ suuri kuin"] # 0xe90c (en: 'subset of or equal to', google translation) - - "": [T: "on yhtĂ€ suuri kuin ja alapuolella pienempi kuin"] # 0xe90d (en: 'equal over less than', google translation) - - "": [T: "kuuluu joukkoon tai on yhtĂ€ kuin"] # 0xe912 (en: 'element of or equal to', google translation) - - "": [T: "yhtĂ€ suuri tai suurempi kuin"] # 0xe913 (en: 'equal to or greater than', google translation) - - "": [T: "likimÀÀrin ylijoukko"] # 0xe914 (en: 'approximate superset of', google translation) - - "": [T: "likimÀÀrin osajoukko"] # 0xe915 (en: 'approximate subset of', google translation) - - "": [T: "ylijoukko pisteellĂ€ sisĂ€ltÀÀ alirelaationa"] # 0xe916 (en: 'superset of with dot includes as sub relation', google translation) # FI: translation unclear - - "": [T: "osajoukko pisteellĂ€ sisĂ€ltyy alirelaationa"] # 0xe917 (en: 'subset of with dot is included in as sub relation', google translation) # FI: translation unclear - - "": [T: "on yhtĂ€ suuri kuin ja piste alapuolella"] # 0xe918 (en: 'equal with dot below', google translation) - - "": [T: "vasen piste jonka alapuolella miinus jonka alapuolella oikea piste"] # 0xe919 (en: 'left dot over minus over right dot', google translation) - - "": [T: "oikea piste jonka alapuolella miinus jonka alapuolella vasen piste"] # 0xe91a (en: 'right dot over minus over left dot', google translation) - - "": [T: "melkein yhtĂ€ suuri kuin miinus"] # 0xe91f (en: 'almost equal to minus', google translation) - - "": [T: "kaksinkertainen kulmikas malja"] # 0xe920 (en: 'double square cup', google translation) - - "": [T: "kaksinkertainen kulmikas kupu"] # 0xe921 (en: 'double square cap', google translation) - - "": [T: "pienempi kuin, yhtĂ€ suuri kuin tai suurempi kuin"] # 0xe922 (en: 'less than equal to or greater than', google translation) - - "": [T: "tilde pisteellĂ€"] # 0xe924 (en: 'tilde with dot', google translation) - - "": [T: "tilde kahdella pisteellĂ€"] # 0xe925 (en: 'tilde with two dots', google translation) - - "": [T: "pienempi kuin, suurempi kuin tai yhtĂ€ suuri kuin"] # 0xe926 (en: 'less than greater than or equal to', google translation) - - "": [T: "suurempi kuin, pienempi kuin tai yhtĂ€ suuri kuin"] # 0xe927 (en: 'greater than less than or equal to', google translation) - - "": [T: "vastaa tai on pienempi kuin"] # 0xe928 (en: 'equivalent to or less than', google translation) - - "": [T: "vastaa tai on suurempi kuin"] # 0xe929 (en: 'equivalent to or greater than', google translation) - - "î€Ș": [T: "vasen avoin laatikkooperaattori"] # 0xe92a (en: 'left open box operator', google translation) - - "": [T: "oikea avoin laatikkooperaattori"] # 0xe92b (en: 'right open box operator', google translation) - - "": [T: "identtinen pisteellĂ€"] # 0xe92c (en: 'identical to with dot', google translation) - - "": [T: "suurempi kuin, yhtĂ€ suuri kuin tai pienempi kuin"] # 0xe92d (en: 'greater than equal to or less than', google translation) - - "": [T: "palkkioperaattori"] # 0xe92e (en: 'bar operator', google translation) - - "": [T: "kaksinkertainen palkkioperaattori"] # 0xe92f (en: 'double bar operator', google translation) - - "": [T: "kolminkertainen palkkioperaattori"] # 0xe930 (en: 'triple bar operator', google translation) - - "î€Č": [T: "pienempi kuin tai likimÀÀrin yhtĂ€ suuri kuin"] # 0xe932 (en: 'less than or approximately equal to', google translation) - - "": [T: "suuremmpi kuin tai likimÀÀrin yhtĂ€ suuri kuin"] # 0xe933 (en: 'greater than or approximately equal to', google translation) - - "": [T: "sisĂ€kkĂ€inen vĂ€hemmĂ€n kuin"] # 0xe936 (en: 'nested less than', google translation) - - "": [T: "sisĂ€kkĂ€inen suurempi kuin"] # 0xe937 (en: 'nested greater than', google translation) - - "î€ș": [T: "edeltÀÀ tai vastaa"] # 0xe93a (en: 'precedes or equivalent to', google translation) - - "": [T: "seuraa tai vastaa"] # 0xe93b (en: 'succeeds or equivalent to', google translation) - - "î„€": [T: "edeltÀÀ ja alapuolella on yhtĂ€ suuri kuin"] # 0xe940 (en: 'precedes over equal', google translation) - - "": [T: "seuraa ja alapuolella on yhtĂ€ suuri kuin"] # 0xe941 (en: 'succeeds over equal', google translation) - - "î„‚": [T: "vĂ€hemmĂ€n kuin, on yhtĂ€ suuri kuin, vino suurempi kuin"] # 0xe942 (en: 'less equal slanted greater', google translation) # FI: translation unclear - - "": [T: "suurempi kuin, on yhtĂ€ suuri kuin, vino pienempi kuin"] # 0xe943 (en: 'greater equal slanted less', google translation) - - "": [T: "tĂ€yttÀÀ ehdon"] # 0xe948 (en: 'satisfied by', google translation) # FI: translation unclear - - "": [T: "laiska s"] # 0xe949 (en: 'lazy s', google translation) - - "": [T: "ei vĂ€ite"] # 0xe94a (en: 'not assertion', google translation) # FI: translation unclear - - "î„‹": [T: "kaksinkertainen on yhtĂ€ suuri kuin"] # 0xe94b (en: 'double equal', google translation) - - "": [T: "kolminkertainen on yhtĂ€ suuri kuin"] # 0xe94c (en: 'triple equal', google translation) - - "": [T: "sÀÀntö viivĂ€stynyt"] # 0xe94d (en: 'rule delayed', google translation) # FI: translation unclear - - "": [T: "alias delimiter"] # 0xe94e (google translation) # FI: translation unclear - - "": [T: "normaali alaryhmĂ€ palkilla"] # 0xe950 (en: 'normal subgroup of with bar', google translation) - - "î„‘": [T: "sisĂ€ltÀÀ normaalina alaryhmĂ€nĂ€ palkilla"] # 0xe951 (en: 'contains as normal subgroup with bar', google translation) - - "î„”": [T: "pyöreĂ€ seuraa"] # 0xe954 (en: 'round implies', google translation) # FI: translation unclear - - "î„•": [T: "hymy palkin alla"] # 0xe955 (en: 'smile under bar', google translation) # FI: translation unclear - - "î„–": [T: "murjotus palkin alla"] # 0xe956 (en: 'frown over bar', google translation) # FI: translation unclear - - "î„—": [T: "ylijoukko tai lĂ€hes yhtĂ€ kuin"] # 0xe957 (en: 'superset of or almost equal to', google translation) - - "": [T: "osajoukko tai lĂ€hes yhtĂ€ kuin"] # 0xe958 (en: 'subset of or almost equal to', google translation) - - "î„™": [T: "suurempi kuin melkein yhtĂ€ suuri kuin tai pienempi kuin"] # 0xe959 (en: 'greater than almost equal to or less than', google translation) - - "": [T: "pienempi kuin melkein yhtĂ€ suuri kuin tai suurempi kuin"] # 0xe95a (en: 'less than almost equal or greater than', google translation) - - "": [T: "kaksinkertainen looginen tai"] # 0xe95c (en: 'double logical or', google translation) - - "": [T: "kaksinkertainen looginen ja"] # 0xe95d (en: 'double logical and', google translation) - - "": [T: "looginen tai ja kaksinkertainen palkki alapuolella"] # 0xe95e (en: 'logical or with double bar below', google translation) - - "": [T: "looginen tai ja palkki alapuolella"] # 0xe95f (en: 'logical or with bar below', google translation) - - "": [T: "melkein yhtĂ€ suuri kuin ja alapuolella yhtĂ€ suuri kuin"] # 0xe962 (en: 'almost equal over equal', google translation) - - "î„€": [T: "vasemmalle osoittava kolmio kahtiajakavalla palkilla"] # 0xe964 (en: 'left pointing triangle with bisecting bar', google translation) - - "î„„": [T: "oikealle osoittava kolmio kahtiajakavalla palkilla"] # 0xe965 (en: 'right pointing triangle with bisecting bar', google translation) - - "": [T: "on yhtĂ€ suuri kuin katkoviivoitetulla ylĂ€viivalla"] # 0xe966 (en: 'equals with dotted top line', google translation) - - "î„§": [T: "edeltÀÀ kaksoispisteellĂ€"] # 0xe967 (en: 'precedes with colon', google translation) - - "": [T: "seuraa kaksoispisteellĂ€"] # 0xe968 (en: 'succeeds with colon', google translation) - - "î„©": [T: "pienempi tai yhtĂ€ suuri kuin vino"] # 0xe969 (en: 'smaller than or equal slanted', google translation) # FI: : translation unclear - - "î„Ș": [T: "suurempi kuin tai yhtĂ€ suuri kuin vino"] # 0xe96a (en: 'larger than or equal slanted', google translation) # FI: : translation unclear - - "î„«": [T: "sisĂ€kkĂ€inen paljon pienempi kuin"] # 0xe96b (en: 'nested very much less than', google translation) - - "": [T: "sisĂ€kkĂ€inen paljon suurempi kuin"] # 0xe96c (en: 'nested very much greater than', google translation) - - "î„­": [T: "ero variantin vĂ€lillĂ€"] # 0xe96d (en: 'difference between variant', google translation) # FI: unclear translation - - "": [T: "pienempi kuin jonka pÀÀllĂ€ suurempi kuin"] # 0xe96e (en: 'less than greater than overlay', google translation) - - "": [T: "looginen tai jonka pÀÀllĂ€ looginen tai"] # 0xe96f (en: 'logical or logical and overlay', google translation) - - "î„°": [T: "ylijoukko ylijoukon ylĂ€puolella"] # 0xe970 (en: 'superset over superset', google translation) - - "": [T: "osajoukko osajoukon ylĂ€puolella"] # 0xe971 (en: 'subset over subset', google translation) - - "î„Č": [T: "ylijoukko osajoukon ylĂ€puolella"] # 0xe972 (en: 'superset over subset', google translation) - - "": [T: "osajoukko ylijoukon ylĂ€puolella"] # 0xe973 (en: 'subset over superset', google translation) - - "î„č": [T: "kolminkertainen pystysuora palkki"] # 0xe979 (en: 'triple vertical bar', google translation) - - "î„ș": [T: "nelinkertainen pystysuora pistepari"] # 0xe97a (en: 'paired quadruple vertical dots', google translation) # FI: translation unclear - - "î„»": [T: "kohtisuorassa ja alapuolella palkki"] # 0xe97b (en: 'perpendicular over bar', google translation) - - "": [T: "vasen kÀÀntöportti kaksinkertainen pystysuora palkki"] # 0xe97c (en: 'left turnstile double vertical bar', google translation) - - "": [T: "kaksinkertainen vasen kÀÀntöportti kaksinkertainen pystysuora palkki"] # 0xe97d (en: 'double left turnstile double vertical bar', google translation) - - "": [T: "kohtisuorassa jonka alapuolella kÀÀnnetty kohtisuorassa"] # 0xe97e (en: 'perpendicular over inverted perpendicular', google translation) - - "": [T: "kaksinkertgainen vasen kÀÀntöportti pystysuora palkki"] # 0xe97f (en: 'double left turnstile vertical bar', google translation) - - "": [T: "pallomainen kulma avautuu"] # 0xe980 (en: 'spherical angle opening up', google translation) - - "": [T: "kaksinkertainen vinoviiva"] # 0xe981 (en: 'double slash', google translation) - - "": [T: "suora kulma nurkalla"] # 0xe982 (en: 'right angle with corner', google translation) - - "": [T: "ympyröity pystysuora palkki"] # 0xe984 (en: 'circled vertical bar', google translation) - - "": [T: "ympyröity jakomerkki"] # 0xe985 (en: 'circled division sign', google translation) - - "": [T: "katkoviivoitettu vinoviiva"] # 0xe986 (en: 'dashed solidus', google translation) - - "": [T: "katkoviivoitettu kenoviiva"] # 0xe987 (en: 'dashed backslash', google translation) - - "": [T: "katkoviivoitettu puolivĂ€liviiva"] # 0xe988 (en: 'dashed mid line', google translation) # FI: : translation unclear - - "": [T: "katkoviivoitettu pystysuora palkki"] # 0xe989 (en: 'dashed vertical bar', google translation) - - "": [T: "kohtisuorassa ja s"] # 0xe98a (en: 'perpendicular with s', google translation) - - "": [T: "kulma ja s"] # 0xe98b (en: 'angle with s', google translation) - - "": [T: "pallomainen kulma avautuu vasemmalle"] # 0xe98c (en: 'spherical angle opening left', google translation) - - "": [T: "vasemmalle avautuva kulma"] # 0xe98d (en: 'angle opening left', google translation) - - "": [T: "pystysuora palkki kaksoiskoukulla"] # 0xe98e (en: 'vertical bar with double hook', google translation) - - "": [T: "keskikokoinen pisteoperaattori vapaa radikaali"] # 0xe98f (en: 'medium dot operator free radical', google translation) - - "": [T: "valkoinen ylöspĂ€in osoittava kolmio palkin ylĂ€puolella"] # 0xe990 (en: 'white up pointing triangle above bar', google translation) - - "": [T: "identtinen ja yhdensuuntainen"] # 0xe991 (en: 'identical and parallel to', google translation) - - "": [T: "smash tulo"] # 0xe992 (en: 'smash product', google translation) # FI: meaning unclear - - "": [T: "kolminkertainen palkkioperaattori vaakasuoralla palkilla"] # 0xe993 (en: 'triple bar operator with horizontal bar', google translation) - - "": [T: "identtinen kaksoisvinoviivalla"] # 0xe994 (en: 'identical to with double slash', google translation) - - "": [T: "kolminkertaiset yliviivatut palkit"] # 0xe995 (en: 'triple crossed bars', google translation) # FI: : translation unclear - - "": [T: "pystysuora palkki ympyrĂ€n ylĂ€puolella"] # 0xe996 (en: 'vertical bar over circle', google translation) - - "": [T: "pystysuora verrannollinen"] # 0xe997 (en: 'vertical proportional to', google translation) - - "": [T: "musta kuun viimeinen neljĂ€nnes"] # 0xe998 (en: 'black last quarter moon', google translation) - - "": [T: "musta kuun ensimmĂ€inen neljĂ€nnes"] # 0xe999 (en: 'black first quarter moon', google translation) - - "": [T: "negatiivinen siniaalto"] # 0xe9a0 (en: 'negative sine wave', google translation) - - "": [T: "piste sulkujen sisĂ€llĂ€"] # 0xe9a1 (en: 'parenthesized dot', google translation) - - "": [T: "sulku"] # 0xe9a2 (en: 'parens', google translation) # FI: translation unclear, "parenthesis"? - - "": [T: "valkoinen hymy"] # 0xe9a3 (en: 'white smile', google translation) - - "": [T: "valkoinen murjotus"] # 0xe9a4 (en: 'white frown', google translation) - - "": [T: "kuusikulmio"] # 0xe9a5 (en: 'hexagon', google translation) - - "": [T: "vastaa ja alapuolella plus"] # 0xe9a6 (en: 'equivalent to over plus', google translation) - - "": [T: "plus ja alapuolella vastaa"] # 0xe9a7 (en: 'plus over equivalent to', google translation) - - "": [T: "leikkaus serifillĂ€"] # 0xe9b0 (en: 'intersection serifs', google translation) - - "": [T: "unioni serifillĂ€"] # 0xe9b1 (google translation) - - "îŠČ": [T: "neliömĂ€inen leikkaus serifillĂ€"] # 0xe9b2 (en: 'square intersection serifs', google translation) - - "": [T: "neliömĂ€inen unioni serifillĂ€"] # 0xe9b3 (google translation) - - "î§ ": [T: "edeltÀÀ, on yhtĂ€ kuin tai seuraa"] # 0xe9e0 (en: 'precedes equivalent to or succeeds', google translation) - - "î§Ą": [T: "seuraa, on yhtĂ€ kuin tai edeltÀÀ"] # 0xe9e1 (en: 'succeeds equivalent to or precedes', google translation) - - "î§ą": [T: "edeltÀÀ, on lĂ€hes yhtĂ€ kuin tai seuraa"] # 0xe9e2 (en: 'precedes almost equal to or succeeds', google translation) - - "î§Ł": [T: "seuraa, on lĂ€hes yhtĂ€ kuin tai edeltÀÀ"] # 0xe9e3 (en: 'succeeds almost equal to or precedes', google translation) - - "î§°": [T: "vĂ€hemmĂ€n kuin, vastaa tai suurempi kuin"] # 0xe9f0 (en: 'less than equivalent to or greater than', google translation) - - "î§±": [T: "suurempi kuin, vastaa tai vĂ€hemmĂ€n kuin"] # 0xe9f1 (en: 'greater than equivalent to or less than', google translation) - - "": [T: "ei hyvin paljon pienempi kuin"] # 0xea00 (en: 'not vert much less than', google translation) # FI: translation unclear, not sure if vert is very or vertical - - "": [T: "ei hyvin paljon suurempi kuin"] # 0xea01 (en: 'not vert much greater than', google translation) # FI: translation unclear, not sure if vert is very or vertical - - "": [T: "ei paljon pienempi kuin variantti"] # 0xea02 (en: 'not much less than variant', google translation) # FI: translation unclear - - "": [T: "ei paljon suurempi kuin variantti"] # 0xea03 (en: 'not much greater than variant', google translation) # FI: translation unclear - - "": [T: "pienempi kuin mutta ei yhtĂ€ suuri kuin"] # 0xea04 (en: 'less vert not double equals', google translation) # FI: translation unclear - - "": [T: "suurempi kuin mutta ei yhtĂ€ suuri kuin"] # 0xea05 (en: 'gt vert not double equals', google translation) # FI: translation unclear - - "": [T: "ei pienempi tai yhtĂ€ suuri kuin"] # 0xea06 (en: 'not less than or equal to', google translation) - - "": [T: "ei suurempi tai yhtĂ€ suuri kuin"] # 0xea07 (en: 'not greater than or equal to', google translation) - - "": [T: "ei yhtĂ€ suuri kuin eikĂ€ pienempi kuin"] # 0xea09 (en: 'neither equal to nor less than', google translation) - - "": [T: "ei sisĂ€llĂ€ tai ole yhtĂ€ suuri kuin"] # 0xea0a (en: 'does not contain or equal to', google translation) - - "": [T: "ei ylijoukko tai yhtĂ€ suuri kuin"] # 0xea0b (en: 'neither superset of nor equal to', google translation) - - "": [T: "ei osajoukko tai yhtĂ€ suuri kuin"] # 0xea0c (en: 'neither subset of nor equal to', google translation) - - "": [T: "kenoviiva osajoukko"] # 0xea0d (en: 'reverse solidus subset', google translation) - - "": [T: "ei yhtĂ€ suuri tai suurempi kuin"] # 0xea0e (en: 'neither equal to nor greater than', google translation) - - "": [T: "ei miinus tilde -operaattori"] # 0xea0f (en: 'not minus tilde operator', google translation) - - "": [T: "ei yhtĂ€ suuri kuin tai pienempi kuin"] # 0xea10 (en: 'neither equal to nor less than', google translation) - - "": [T: "ei tilde -operaattori"] # 0xea11 (en: 'not tilde operator', google translation) - - "": [T: "ei kuulu joukkoon tai ole yhtĂ€ suuri kuin"] # 0xea12 (en: 'not element of or equal to', google translation) - - "": [T: "ei yhtĂ€ suuri kuin tai suurempi kuin"] # 0xea13 (en: 'neither equal to nor greater than', google translation) - - "": [T: "ei melkein yhtĂ€ suuri"] # 0xea14 (en: 'not almost equal', google translation) - - "": [T: "ei seuraa vastaavaa"] # 0xea15 (en: 'not succeeds similar', google translation) # FI: translation unclear - - "": [T: "pienempi kuin tai vino yhtĂ€ suuri kuin vinoviivalla"] # 0xea16 (en: 'less than or slanted equal to with slash', google translation) - - "": [T: "suurempi kuin tai vino yhtĂ€ suuri kuin vinoviivalla"] # 0xea17 (en: 'greater than or slanted equal to with slash', google translation) - - "": [T: "ylijoukko vinoviiva"] # 0xea1a (google translation) - - "": [T: "ei sisĂ€llĂ€"] # 0xea1b (en: 'does not contain', google translation) - - "": [T: "ei pienempi kuin tai yhtĂ€ suuri kuin"] # 0xea1d (en: 'not less than or equal to', google translation) - - "": [T: "ei suurempi kuin tai yhtĂ€ suuri kuin"] # 0xea1e (en: 'not greater than or equal to', google translation) - - "": [T: "ei melkein yhtĂ€ suuri kuin miinus"] # 0xea1f (en: 'not almost equal to minus', google translation) - - "îšą": [T: "ei kuulu joukkoon ylĂ€pisteellĂ€"] # 0xea22 (en: 'negated set membership dot above', google translation) - - "": [T: "ei vert kulma"] # 0xea2c (en: 'not vert angle', google translation) # FI: translation unclear - - "îš­": [T: "ei yhdensuuntainen vino"] # 0xea2d (en: 'not parallel slanted', google translation) - - "îšź": [T: "ei palkkioperaattori"] # 0xea2e (en: 'not bar operator', google translation) - - "": [T: "ei kaksoispalkkioperaattori"] # 0xea2f (en: 'not double bar operator', google translation) - - "îš°": [T: "ei kolminkertainen palkkioperaattori"] # 0xea30 (en: 'not triple bar operator', google translation) - - "îšČ": [T: "vĂ€hemmĂ€n kuin, mutta ei suunnilleen yhtĂ€ suuri kuin"] # 0xea32 (en: 'less than but not approximately equal to', google translation) - - "îšł": [T: "suurempi kuin, mutta ei suunnilleen yhtĂ€ suuri kuin"] # 0xea33 (en: 'greater than but not approximately equal to', google translation) - - "": [T: "vĂ€hemmĂ€n kuin tai ei yhtĂ€ suuri kuin"] # 0xea34 (en: 'less than or not equal to', google translation) - - "îš”": [T: "suurempi kuin tai ei yhtĂ€ suuri kuin"] # 0xea35 (en: 'greater than or not equal to', google translation) - - "îš¶": [T: "ei sisĂ€kkĂ€inen vĂ€hemmĂ€n kuin"] # 0xea36 (en: 'not nested less than', google translation) # FI: translation unclear - - "îš·": [T: "ei sisĂ€kkĂ€inen suurempi kuin"] # 0xea37 (en: 'not nested greater than', google translation) # FI: translation unclear - - "îšž": [T: "ei paljon pienempi kuin"] # 0xea38 (en: 'not much less than', google translation) - - "îšč": [T: "ei paljon suurempi kuin"] # 0xea39 (en: 'not much greater than', google translation) - - "îšș": [T: "edeltÀÀ, mutta ei vastaa"] # 0xea3a (en: 'precedes but not equivalent to', google translation) - - "îš»": [T: "onnistuu, mutta ei vastaa"] # 0xea3b (en: 'succeeds but not equivalent to', google translation) - - "": [T: "edeltÀÀ, mutta ei yhtĂ€ suuri kuin"] # 0xea3c (en: 'precedes but not equal to', google translation) - - "îšœ": [T: "seuraa, mutta ei yhtĂ€ suuri kuin"] # 0xea3d (en: 'succeeds but not equal to', google translation) - - "": [T: "ei ole yhtĂ€ suuri kuin tai edeltÀÀ"] # 0xea3e (en: 'does not equal or precede', google translation) - - "îšż": [T: "ei ole yhtĂ€ suuri kuin tai seuraa"] # 0xea3f (en: 'does not equal or succeed', google translation) - - "": [T: "edeltÀÀ, mutta ei yhtĂ€ suuri kuin"] # 0xea40 (en: 'precedes but not equal to', google translation) - - "": [T: "seuraa, mutta ei yhtĂ€ suuri kuin"] # 0xea41 (en: 'succeeds but not equal to', google translation) - - "": [T: "ei osajoukko tai yhtĂ€ suuri kuin"] # 0xea42 (en: 'not subset of nor equal to', google translation) - - "": [T: "ei ylijoukko tai yhtĂ€ suuri kuin"] # 0xea43 (en: 'not superset of nor equal to', google translation) - - "": [T: "osajoukko tai ei yhtĂ€ suuri kuin"] # 0xea44 (en: 'subset of or not equal to', google translation) - - "": [T: "ylijoukko tai ei yhtĂ€ suuri kuin"] # 0xea45 (en: 'superset of or not equal to', google translation) - - "": [T: "ei osajoukko tai yhtĂ€ suuri kuin"] # 0xea46 (en: 'not subset of nor equal to', google translation) - - "": [T: "ei ylijoukko tai yhtĂ€ suuri kuin"] # 0xea47 (en: 'not superset of nor equal to', google translation) - - "": [T: "ei kolminkertainen pienempi kuin"] # 0xea48 (en: 'not triple less than', google translation) - - "": [T: "ei kolminkertainen suurempi kuin"] # 0xea49 (en: 'not triple greater than', google translation) - - "": [T: "ei edellĂ€ on yhtĂ€ suuri kuin"] # 0xea4c (en: 'not precedes equals', google translation) - - "": [T: "ei seuraa on yhtĂ€ suuri kuin"] # 0xea4d (en: 'not succeeds equals', google translation) - - "": [T: "ei normaali aliryhmĂ€ palkilla"] # 0xea50 (en: 'not normal subgroup of with bar', google translation) - - "": [T: "ei sisĂ€llĂ€ normaalina aliryhmĂ€nĂ€ palkilla"] # 0xea51 (en: 'does not contain as normal subgroup with bar', google translation) - - "": [T: "ei ero vĂ€lillĂ€"] # 0xea52 (en: 'not difference between', google translation) - - "": [T: "ei geometrisesti vastaa"] # 0xea53 (en: 'not geometrically equivalent to', google translation) - - "": [T: "ei vert samanlainen"] # 0xea54 (en: 'not vert similar', google translation) # FI: translation unclear - - "": [T: "ei yhtĂ€ suuri tai samanlainen"] # 0xea55 (en: 'not equal or similar', google translation) - - "": [T: "ei vert likimÀÀrĂ€inen"] # 0xea56 (en: 'not vert approximate', google translation) - - "": [T: "ei likimÀÀrĂ€isesti identtinen"] # 0xea57 (en: 'not approximately identical to', google translation) - - "": [T: "ei kumpu yhtĂ€ suuri kuin"] # 0xea58 (en: 'not bumpy equals', google translation) # FI: translation unclear - - "": [T: "ei kumpu yksiviivainen yhtĂ€ suuri kuin"] # 0xea59 (en: 'not bumpy single equals', google translation) # FI: translation unclear - - "": [T: "ei yhtĂ€ suuri kuin piste"] # 0xea5a (en: 'not equal dot', google translation) - - "": [T: "kÀÀnnetty ei vastaa"] # 0xea5b (en: 'reverse not equivalent', google translation) - - "î© ": [T: "ei neliömĂ€inen osajoukko"] # 0xea60 (en: 'not square subset', google translation) - - "": [T: "ei nelimĂ€inen ylijoukko"] # 0xea61 (en: 'not square superset', google translation) - - "": [T: "ei melkein yhtĂ€ suuri ja alapuolella yhtĂ€ suuri kuin"] # 0xea62 (en: 'not almost equal over equal', google translation) - - "": [T: "ei tiukasti vastaa"] # 0xea63 (en: 'not strictly equivalent to', google translation) - - "î©€": [T: "ei kongruentti piste"] # 0xea64 (en: 'not congruent dot', google translation) - - "î©„": [T: "kÀÀnnetty ei ole yhtĂ€ suuri kuin"] # 0xea65 (en: 'reverse not equal', google translation) - - "î©°": [T: "ei vasen kolmio on yhtĂ€ suuri kuin"] # 0xea70 (en: 'not vert left triangle equals', google translation) # FI: translation unclear - - "": [T: "ei oikea on yhtĂ€ suuri kuin"] # 0xea71 (en: 'not vert right triangle equals', google translation) # FI: translation unclear - - "îȘ€": [T: "ei osittainen"] # 0xea80 (en: 'not partial', google translation) - - "": [T: "nuolen koristeiden pidennys"] # 0xeb00 (en: 'arrow embellishment extender', google translation) # FI: translation unclear - - "": [T: "oikea nuoli vasemman nuolen ylĂ€puolella"] # 0xeb01 (en: 'arrow rightwards over arrow leftwards', google translation) - - "": [T: "oikea nuoli vasemman nuolen ylĂ€puolella"] # 0xeb02 (en: 'arrow rightwards over arrow leftwards', google translation) - - "": [T: "oikea harppuuna vasemman harppuunan ylĂ€puolella"] # 0xeb03 (en: 'harpoon right over harpoon left', google translation) - - "": [T: "oikea harppuuna vasemman harppuunan ylĂ€puolella"] # 0xeb04 (en: 'harpoon right over harpoon left', google translation) - - "": [T: "koillis-lounaskaksoisnuoli"] # 0xeb05 (en: 'double arrow northeast southwest', google translation) - - "": [T: "luoteis-kaakkoiskaksoisnuoli"] # 0xeb06 (en: 'double arrow northwest southeast', google translation) - - "": [T: "vaakasuora harppuunapidennys"] # 0xeb07 (en: 'horizontal harpoon extender', google translation) # FI: translation unclear - - "": [T: "vasen kaarinuoli vastapĂ€ivÀÀn"] # 0xeb08 (en: 'anticlockwise arc leftwards arrow', google translation) - - "": [T: "oikea kaarinuoli vastapĂ€ivÀÀn"] # 0xeb09 (en: 'anticlockwise arc rightwards arrow', google translation) - - "": [T: "suuri oikean nuolen aksentti"] # 0xeb0b (en: 'large rightwards arrow accent', google translation) # FI: translation unclear - - "": [T: "suuri vasen nuolen aksentti"] # 0xeb0c (en: 'large leftwards arrow accent', google translation) # FI: translation unclear - - "": [T: "vasen nuolenpÀÀ"] # 0xeb0d (en: 'leftwards arrowhead', google translation) - - "": [T: "oikea nuolenpÀÀ"] # 0xeb0e (en: 'rightwards arrowhead', google translation) - - "": [T: "suuri vasen-oikea nuoli yliviivauksella"] # 0xeb0f (en: 'large left right arrow with stroke', google translation) - - "": [T: "vaakasuuntainen kaksoisnuolen pidennys"] # 0xeb10 (en: 'horizontal double arrow extender', google translation) # FI: translation unclear - - "": [T: "suuri vasen-oikea kaksinkertainen nuoli yliviivauksella"] # 0xeb11 (en: 'large left right double arrow with stroke', google translation) - - "": [T: "alaspĂ€in osoittava nuoli ylöspĂ€in osoittavan nuolen vasemmalla puolella"] # 0xeb12 (en: 'downwards arrow leftwards of upwards arrow', google translation) - - "": [T: "vasen nuoli kulmalla alaspĂ€in"] # 0xeb13 (en: 'leftwards arrow with corner downwards', google translation) - - "": [T: "oikea nuoli kulmalla ylöspĂ€in"] # 0xeb14 (en: 'rightwards arrow with corner upwards', google translation) - - "": [T: "vasen nuoli kuolmalla ylöspĂ€in"] # 0xeb15 (en: 'leftwards arrow with corner upwards', google translation) - - "": [T: "ympyrĂ€nuolen ylĂ€osa vastapĂ€ivÀÀn ja plus"] # 0xeb16 (en: 'anticlockwise top semicircle arrow with plus', google translation) - - "": [T: "ympyrĂ€nuolen ylĂ€osa myötĂ€pĂ€ivÀÀn ja miinus"] # 0xeb17 (en: 'clockwise top semicircle arrow with minus', google translation) - - "": [T: "oikea nuoli hĂ€nnĂ€llĂ€ ja yliviivauksella"] # 0xeb18 (en: 'rightwards arrow with tail with stroke', google translation) - - "": [T: "oikea harppuuna alas"] # 0xeb19 (en: 'right harpoon down', google translation) - - "": [T: "vasen harppuon alas"] # 0xeb1a (en: 'left harpoon down', google translation) - - "": [T: "vasen-oikea harppuuna alas"] # 0xeb1b (en: 'left right harpoon down', google translation) - - "": [T: "vasen-oikea harppuuna ylös"] # 0xeb1c (en: 'left right harpoon up', google translation) - - "": [T: "ylös-alas harppuuna vasemmalle"] # 0xeb1d (en: 'up down harpoon left', google translation) - - "": [T: "ylös-alas harppuuna oikealle"] # 0xeb1e (en: 'up down harpoon right', google translation) - - "": [T: "ylĂ€nuoli alanuolen vasemmalla puolella"] # 0xeb1f (en: 'upwards arrow to the right of downwards arrow', google translation) - - "": [T: "vasen harppuuna palkkiin piikki ylöpĂ€in"] # 0xeb20 (en: 'leftwards harpoon to bar with barb upwards', google translation) - - "": [T: "oikea harppuuna palkkiin piikki ylöspĂ€in"] # 0xeb21 (en: 'rightwards harpoon to bar with barb upwards', google translation) - - "": [T: "vasen harppuuna palkkiin piikki alaspĂ€in"] # 0xeb22 (en: 'leftwards harpoon to bar with barb downwards', google translation) - - "": [T: "oikea harppuuna palkkiin piikki alaspĂ€in"] # 0xeb23 (en: 'rightwards harpoon to bar with barb downwards', google translation) - - "": [T: "vasen harppuuna palkista piikki ylöspĂ€in"] # 0xeb24 (en: 'leftwards harpoon from bar with barb upwards', google translation) - - "": [T: "oikea harppuuna palkista piikki ylöspĂ€in"] # 0xeb25 (en: 'rightwards harpoon from bar with barb upwards', google translation) - - "": [T: "vasen harppuuna palkista piikki alaspĂ€in"] # 0xeb26 (en: 'leftwards harpoon from bar with barb downwards', google translation) - - "": [T: "oikea harppuuna palkista piikki alaspĂ€in"] # 0xeb27 (en: 'rightwards harpoon from bar with barb downwards', google translation) - - "": [T: "harppuuna ylös palkkiin piikki vasemmalle"] # 0xeb28 (en: 'upwards harpoon to bar with barb leftwards', google translation) - - "": [T: "harppuuna alas palkkiin piikki vasemmalle"] # 0xeb29 (en: 'downwards harpoon to bar with barb leftwards', google translation) - - "îŹȘ": [T: "harppuuna ylös palkkiin piikki oikealle"] # 0xeb2a (en: 'upwards harpoon to bar with barb rightwards', google translation) - - "": [T: "harppuuna alas palkkiin piikki oikealle"] # 0xeb2b (en: 'downwards harpoon to bar with barb rightwards', google translation) - - "": [T: "harppuuna ylös palkista piikki vasemmalle"] # 0xeb2c (en: 'upwards harpoon from bar with barb leftwards', google translation) - - "": [T: "harppuuna alas palkista piikki vasemmalle"] # 0xeb2d (en: 'downwards harpoon from bar with barb leftwards', google translation) - - "": [T: "harppuuna ylös palkista piikki oikealle"] # 0xeb2e (en: 'upwards harpoon from bar with barb rightwards', google translation) - - "": [T: "harppuuna alas palkista piikki oikealle"] # 0xeb2f (en: 'downwards harpoon from bar with barb rightwards', google translation) - - "": [T: "nuoli ylöspĂ€in palkkiin"] # 0xeb30 (en: 'upwards arrow to bar', google translation) - - "": [T: "nuoli alaspĂ€in palkkiin"] # 0xeb31 (en: 'downwards arrow to bar', google translation) - - "îŹČ": [T: "harppuuna ylös ja oikealla puolella harppuuna alas"] # 0xeb32 (en: 'upwards harpoon to the left of downwards harpoon', google translation) - - "": [T: "harppuuna ylös ja vasemmalla puolella harppuuna alas"] # 0xeb33 (en: 'upwards harpoon to the right of downwards harpoon', google translation) - - "": [T: "nuolenpÀÀ ylös"] # 0xeb34 (en: 'upwards arrowhead', google translation) - - "": [T: "nuolenpÀÀ alas"] # 0xeb35 (en: 'downwards arrowhead', google translation) - - "": [T: "kaksinkertainen harppuuna vasen piikki alas ja oikea piikki ylös"] # 0xeb36 (en: 'double harpoon with leftwards barb down rightwards barb up', google translation) - - "": [T: "kaksinkertainen harppuuna vasen piikki ylös ja oikea piikki alas"] # 0xeb37 (en: 'double harpoon with leftwards barb up rightwards barb down', google translation) - - "": [T: "vasen nuoli palkin ylĂ€puolella"] # 0xeb38 (en: 'leftwards arrow over bar', google translation) - - "îŹč": [T: "oikea nuoli palkin ylĂ€puolella"] # 0xeb39 (en: 'rightwards arrow over bar', google translation) - - "îŹș": [T: "vasen nuoli palkin alapuolella"] # 0xeb3a (en: 'leftwards arrow under bar', google translation) - - "": [T: "oikea nuoli palkin alapuolella"] # 0xeb3b (en: 'rightwards arrow under bar', google translation) - - "îŹŒ": [T: "vasen-oikea kolmoisnuoli"] # 0xeb3c (en: 'left right triple arrow', google translation) - - "": [T: "koillis-kaakko kaksoisnuoli"] # 0xeb3f (en: 'double arrow northeast southeast', google translation) - - "": [T: "vasen puoliympyrĂ€nuoli vastapĂ€ivÀÀn"] # 0xeb40 (en: 'anticlockwise left semicircle arrow', google translation) - - "": [T: "vasen puoliympyrĂ€nuoli myötĂ€pĂ€ivÀÀn"] # 0xeb41 (en: 'clockwise left semicircle arrow', google translation) - - "": [T: "vasen avoin ympyrĂ€ vasen-oikea nuoli"] # 0xeb42 (en: 'left open circle left right arrow', google translation) # FI: translation unclear - - "": [T: "oikea nuoli tilden ylĂ€puolella"] # 0xeb44 (en: 'rightwards arrow over tilde', google translation) - - "": [T: "vasen nuoli tilden ylĂ€puolella"] # 0xeb45 (en: 'leftwards arrow over tilde', google translation) - - "": [T: "vasen harppuuna palkin ylĂ€puolella"] # 0xeb48 (en: 'leftwards harpoon over bar', google translation) - - "": [T: "oikea harppuuna palkin ylĂ€puolella"] # 0xeb49 (en: 'rightwards harpoon over bar', google translation) - - "": [T: "vasen harppuuna palkin alapuolella"] # 0xeb4a (en: 'leftwards harpoon under bar', google translation) - - "": [T: "oikea harppuuna palkin alapuolella"] # 0xeb4b (en: 'rightwards harpoon under bar', google translation) - - "": [T: "raskas musta lyhyt vasen nuoli"] # 0xeb4c (en: 'squat black leftwards arrow', google translation) - - "": [T: "oikea puoliympyrĂ€nuoli myötĂ€pĂ€ivÀÀn"] # 0xeb50 (en: 'clockwise right semicircle arrow', google translation) - - "": [T: "oikea puoliympyrĂ€nuoli vastapĂ€ivÀÀn"] # 0xeb51 (en: 'anticlockwise right semicircle arrow', google translation) - - "": [T: "vasen-oikea ympyrĂ€ vasen-oikea harppuuna"] # 0xeb52 (en: 'left open circle left right harpoon', google translation) # FI: translation unclear - - "": [T: "nuoli ylös pystypalkin vasemmalla puolella"] # 0xeb58 (en: 'upwards arrow leftwards of vertical bar', google translation) - - "": [T: "nuoli alas pystypalkin vasemmalla puolella"] # 0xeb59 (en: 'downwards arrow leftwards of vertical bar', google translation) - - "": [T: "nuoli ylös pystypalkin oikealla puolella"] # 0xeb5a (en: 'upwards arrow rightwards of vertical bar', google translation) - - "": [T: "nuoli alas pystypalkin oikealla puolella"] # 0xeb5b (en: 'downwards arrow rightwards of vertical bar', google translation) - - "": [T: "oikea nuoli jatketulla koukulla alas"] # 0xeb5c (en: 'rightwards arrow with extended downwards hook', google translation) - - "": [T: "vasen nuoli jatketulla koukulla"] # 0xeb5d (en: 'leftwards arrow with extended hook', google translation) - - "": [T: "vasen nuoli jatketulla koukulla alas"] # 0xeb5e (en: 'leftwards arrow with extended downwards hook', google translation) - - "": [T: "oikea nuoli jatketulla koukulla"] # 0xeb5f (en: 'rightwards arrow with extended hook', google translation) - - "î­ ": [T: "ei oikea nuoli aaltoileva"] # 0xeb60 (en: 'not right arrow wavy', google translation) # FI: translation unclear - - "î­Ą": [T: "ei oikea nuoli kaareva"] # 0xeb61 (en: 'not right arrow curved', google translation) # FI: translation unclear - - "î­š": [T: "harppuula ylös pystypalkin vasemmalla puolella"] # 0xeb68 (en: 'upwards harpoon leftwards of vertical bar', google translation) - - "î­©": [T: "harppuuna alas pystypalkin vasemmalla puolella"] # 0xeb69 (en: 'downwards harpoon leftwards of vertical bar', google translation) - - "î­Ș": [T: "harppuuna ylös pystypalkin oikealla puolella"] # 0xeb6a (en: 'upwards harpoon rightwards of vertical bar', google translation) - - "î­«": [T: "harppuuna alas pystypalkin oikealla puolella"] # 0xeb6b (en: 'downwards harpoon rightwards of vertical bar', google translation) - - "î­Ź": [T: "pystysuora kaksoisnuolen pidennys"] # 0xeb6c (en: 'vertical double arrow extender', google translation) # FI: translation unclear - - "î­­": [T: "pystysuora harppuuna piikki vasemmalle pidennys"] # 0xeb6d (en: 'vertical harpoon with barb left extender', google translation) - - "î­ź": [T: "pystysuora harppuuna piikki oikealle pidennys"] # 0xeb6e (en: 'vertical harpoon with barb right extender', google translation) - - "î­Ż": [T: "oikea harppuuna vasemman harppuunan ylĂ€puolella oikealla"] # 0xeb6f (en: 'right harpoon over left harpoon right', google translation) # FI: translation unclear - - "î­°": [T: "oikea harppuuna vasemman harppuunan ylĂ€puolella vasemmalla"] # 0xeb70 (en: 'right harpoon over left harpoon left', google translation) # FI: translation unclear - - "î­±": [T: "vasen harppuuna oikean harppuunan ylĂ€puolella oikealla"] # 0xeb71 (en: 'left harpoon over right harpoon right', google translation) # FI: translation unclear - - "î­Č": [T: "vasen harppuuna oikean harppuunan ylĂ€puolella vasemmalla"] # 0xeb72 (en: 'left harpoon over right harpoon left', google translation) # FI: translation unclear - - "î­ł": [T: "vasen nuoli palkista nuolenpÀÀ"] # 0xeb73 (en: 'leftwards arrow from bar arrowhead', google translation) # FI: translation unclear - - "î­Ž": [T: "vasen-oikea nuoli palkista pidennys"] # 0xeb74 (en: 'leftwards rightwards arrow from bar extender', google translation) - - "î­”": [T: "vasen nuoli palkista hĂ€ntĂ€"] # 0xeb75 (en: 'leftwards arrow from bar tail', google translation) # FI: translation unclear - - "î­¶": [T: "oikea nuoli palkista hĂ€ntĂ€"] # 0xeb76 (en: 'rightwards arrow from bar tail', google translation) # FI: translation unclear - - "î­·": [T: "oikea nuoli palkista nuolenpÀÀ"] # 0xeb77 (en: 'rightwards arrow from bar arrowhead', google translation) # FI: translation unclear - - "î­ž": [T: "harppuuna ylös palkista piikki vasemmalle nuolenpÀÀ"] # 0xeb78 (en: 'upwards harpoon from bar with barb leftwards arrowhead', google translation) # FI: translation unclear - - "î­č": [T: "oikea nuoli vasemman nuolen ylĂ€puolella oikealla"] # 0xeb79 (en: 'rightwards arrow over leftwards arrow right', google translation) # FI: translation unclear - - "î­ș": [T: "oikea nuoli vasemman nuolen ylĂ€puolella vasemmalla"] # 0xeb7a (en: 'rightwards arrow over leftwards arrow left', google translation) # FI: translation unclear - - "î­»": [T: "vasen nuoli oikean nuolen ylĂ€puolella oikealla"] # 0xeb7b (en: 'leftwards arrow over rightwards arrow right', google translation) # FI: translation unclear - - "î­Œ": [T: "vasen nuoli oikean nuolen ylĂ€puolella vasemmalla"] # 0xeb7c (en: 'leftwards arrow over rightwards arrow left', google translation) # FI: translation unclear - - "î­œ": [T: "nuoli ylös palkista nuolenpÀÀ"] # 0xeb7d (en: 'upwards arrow from bar arrowhead', google translation) # FI: translation unclear - - "î­Ÿ": [T: "nuoli ylös palkista hĂ€ntĂ€"] # 0xeb7e (en: 'upwards arrow from bar tail', google translation) # FI: translation unclear - - "î­ż": [T: "nuoli alaspĂ€in palkista hĂ€ntĂ€"] # 0xeb7f (en: 'downwards arrow from bar tail', google translation) # FI: translation unclear - - "": [T: "nuoli alaspĂ€in palkista nuolenpÀÀ"] # 0xeb80 (en: 'downwards arrow from bar arrowhead', google translation) # FI: translation unclear - - "": [T: "harppuuna alas palkista piikki oikealle nuolenpÀÀ"] # 0xeb81 (en: 'downwards harpoon from bar with barb rightwards arrowhead', google translation) # FI: translation unclear - - "": [T: "harppuuna ylös ja oikealla puolella harppuuna alas alas"] # 0xeb82 (en: 'upwards harpoon to the left of downwards harpoon bottom', google translation) # FI: translation unclear - - "": [T: "harppuuna ylös ja oikealla harppuuna alas"] # 0xeb83 (en: 'upwards harpoon to the left of downwards harpoon', google translation) - - "": [T: "harppuuna alas ja oikealla harppuuna ylös ylös"] # 0xeb84 (en: 'downwards harpoon to the left of upwards harpoon top', google translation) # FI: translation unclear - - "": [T: "harppuuna ylös ja oikealla harppuuna alas ylös"] # 0xeb85 (en: 'upwards harpoon to the left of downwards harpoon top', google translation) # FI: translation unclear - - "": [T: "harppuuna alas ja oikealla harppuuna ylös pidennys"] # 0xeb86 (en: 'downwards harpoon to the left of the upwards harpoon extender', google translation) - - "": [T: "harppuuna alas ja oikealla harppuuna ylös alas"] # 0xeb87 (en: 'downwards harpoon to the left of the upwards harpoon bottom', google translation) # FI: translation unclear - - "": [T: "harppuuna ylös ja oikealla harppuuna alas alas"] # 0xeb88 (en: 'upwards arrow leftwards of downwards arrow bottom', google translation) # FI: translation unclear - - "": [T: "nuoli alas ja oikealla nuoli ylös ylös"] # 0xeb89 (en: 'downwards arrow leftwards of upwards arrow top', google translation) # FI: translation unclear - - "": [T: "nuoli ylös ja oikealla nuoli alas ylös"] # 0xeb8a (en: 'upwards arrow leftwards of downwards arrow top', google translation) # FI: translation unclear - - "": [T: "nuoli alas ja oikealla nuoli ylös alas"] # 0xeb8b (en: 'downwards arrow leftwards of upwards arrow bottom', google translation) # FI: translation unclear - - "": [T: "vasen-oikeanuolipidennys"] # 0xeb8c (en: 'leftwards rightwards arrows extender', google translation) - - "": [T: "koillisnuolipidennys"] # 0xeb8d (en: 'north east arrow extender', google translation) - - "": [T: "luoteisnuolipidennys"] # 0xeb8e (en: 'north west arrow extender', google translation) - - "": [T: "alas osoittava aaltosulku vasen"] # 0xec00 (en: 'down pointing brace left', google translation) - - "": [T: "alas osoittava aaltosulku keski"] # 0xec01 (en: 'down pointing brace mid', google translation) - - "": [T: "alas osoittava aaltosulku oikea"] # 0xec02 (en: 'down pointing brace right', google translation) - - "": [T: "vaakasuora aaltosulku pidennys"] # 0xec03 (en: 'horizontal brace extender', google translation) - - "": [T: "ylös osoittava aaltosulku vasen"] # 0xec04 (en: 'up pointing brace left', google translation) - - "": [T: "ylös osoittava aaltosulku keski"] # 0xec05 (en: 'up pointing brace mid', google translation) - - "": [T: "ylös osoittava aaltosulku oikea"] # 0xec06 (en: 'up-pointing brace right', google translation) - - "": [T: "vasen pystypalkki"] # 0xec07 (en: 'left vertical bar', google translation) - - "": [T: "oikea pystypalkki"] # 0xec08 (en: 'right vertical bar', google translation) - - "": [T: "vasen kaksinkertainen pystypalkki"] # 0xec09 (en: 'left double vertical bar', google translation) - - "": [T: "oikea kaksinkertainen pystypalkki"] # 0xec0a (en: 'right double vertical bar', google translation) - - "": [T: "vaakasuora hakasulku pidennys"] # 0xec0b (en: 'horizontal bracket extender', google translation) - - "": [T: "neliön alapuoli hakasulku"] # 0xec0c (en: 'under square bracket', google translation) # FI: translation unclear - - "⎔": [T: "neliön alapuoli hakasulku"] # 0x23b5 (google: 'neliön alla') # FI: translation unclear - - "": [T: "neliön ylĂ€puoli hakasulku"] # 0xec0d (en: 'over square bracket', google translation) # FI: translation unclear - - "⎮": [T: "neliön ylĂ€puoli hakasulku"] # 0x23b4 (google: 'neliömĂ€isen kiinnikkeen yli') # FI: translation unclear - - "": [T: "alahakasulku vasen"] # 0xec0e (en: 'under bracket left', google translation) # FI: translation unclear - - "": [T: "alahakasulku oikea"] # 0xec0f (en: 'under bracket right', google translation) # FI: translation unclear - - "": [T: "ylĂ€hakasulku vasen"] # 0xec10 (en: 'over bracket left', google translation) # FI: translation unclear - - "": [T: "alahakasulku oikea"] # 0xec11 (en: 'over bracket right', google translation) # FI: translation unclear - - "": [T: "vasen kaarisulku 1"] # 0xec12 (en: 'left parens 1', google translation) - - "": [T: "vasen kaarisulku 2"] # 0xec13 (en: 'left parens 2', google translation) - - "": [T: "vasen kaarisulku 3"] # 0xec14 (en: 'left parens 3', google translation) - - "": [T: "vasen kaarisulku 4"] # 0xec15 (en: 'left parens 4', google translation) - - "": [T: "oikea kaarisulku 1"] # 0xec16 (en: 'right parens 1', google translation) - - "": [T: "oikea kaarisulku 2"] # 0xec17 (en: 'right parens 2', google translation) - - "": [T: "oikea kaarisulku 3"] # 0xec18 (en: 'right parens 3', google translation) - - "": [T: "oikea kaarisulku 4"] # 0xec19 (en: 'right parens 4', google translation) - - "": [T: "radikaali 1"] # 0xec1a (en: 'radical 1', google translation) # FI: context? Radical as in root sign? - - "": [T: "radikaali 2"] # 0xec1b (en: 'radical 2', google translation) # FI: context? - - "": [T: "radikaali 3"] # 0xec1c (en: 'radical 3', google translation) # FI: context? - - "": [T: "radikaali 4"] # 0xec1d (en: 'radical 4', google translation) # FI: context? - - "": [T: "radikaali 5"] # 0xec1e (en: 'radical 5', google translation) # FI: context? - - "": [T: "radikaali pohja"] # 0xec1f (en: 'radical bottom', google translation) # FI: context? - - "î° ": [T: "radikaali pystysuora pidennys"] # 0xec20 (en: 'radical vertical extender', google translation) # FI: context? - - "î°Ą": [T: "radikaali ylĂ€osa"] # 0xec21 (en: 'radical top', google translation) # FI: context? - - "î°ą": [T: "vasen valkoinen hakasulku ylös"] # 0xec22 (en: 'left white bracket top', google translation) - - "î°Ł": [T: "vasen valkoinen hakasulku pidennys"] # 0xec23 (en: 'left white bracket extender', google translation) - - "î°€": [T: "vasen valkoinen hakasulku alas"] # 0xec24 (en: 'left white bracket bottom', google translation) - - "î°„": [T: "oikea valkoinen hakasulku ylös"] # 0xec25 (en: 'right white bracket top', google translation) - - "î°Š": [T: "oikea valkoinen hakasulku pidennys"] # 0xec26 (en: 'right white bracket extender', google translation) - - "î°§": [T: "oikea valkoinen hakasulku alas"] # 0xec27 (en: 'right white bracket bottom', google translation) - - "î°°": [T: "vasen valkoinen aaltosulku"] # 0xec30 (en: 'left white curly bracket', google translation) - - "î°±": [T: "oikea valkoinen aaltosulku"] # 0xec31 (en: 'right white curly bracket', google translation) - - "î°Č": [T: "jakokulmamerkki"] # 0xec32 (en: 'long division sign', google translation) - - "î°ł": [T: "jakokulmamerkki pidennys"] # 0xec33 (en: 'long division sign extender', google translation) - - "î°Ž": [T: "lyhyt jakokulma"] # 0xec34 (en: 'short division', google translation) - - "": [T: "kaksinkertainen m-sidos lounaasta koilliseen"] # 0xec40 (en: 'double southwest to northeast em bond', google translation) - - "": [T: "kaksinkertainen m-sidos luoteesta kaakkoon"] # 0xec41 (en: 'double northwest to southeast em bond', google translation) - - "": [T: "yksinkertainen vaakasuora m-sidos"] # 0xec42 (en: 'single horizontal em bond', google translation) # FI: not happy with translations - - "": [T: "kaksinkertainen vaakasuora m-sidos"] # 0xec43 (en: 'double horizontal em bond', google translation) - - "": [T: "kolminkertainen vaakasuora m-sidos"] # 0xec44 (en: 'triple horizontal em bond', google translation) - - "": [T: "yksinkertainen pystysuora m-sidos"] # 0xec45 (en: 'single vertical em bond', google translation) - - "": [T: "kaksinkertainen pystysuora m-sidos"] # 0xec46 (en: 'double vertical em bond', google translation) - - "": [T: "kolminkertainen pystysuora m-sidos"] # 0xec47 (en: 'triple vertical em bond', google translation) - - "": [T: "pienempi kuin m-sidos"] # 0xec48 (en: 'less than em bond', google translation) - - "": [T: "suurempi kuin m-sidos"] # 0xec49 (en: 'greater than em bond', google translation) - - "": [T: "yksinkertainen vaakasuora n-sidos"] # 0xec4a (en: 'single horizontal en bond', google translation) - - "": [T: "kaksinkertainen vaakasuora n-sidos"] # 0xec4b (en: 'double horizontal en bond', google translation) - - "": [T: "kolminkertainen vaakasuora n-sidos"] # 0xec4c (en: 'triple horizontal en bond', google translation) - - "îȀ": [T: "ylĂ€vasen suorakulmio"] # 0xec80 (en: 'top left rectangle', google translation) - - "îȁ": [T: "alavasen suorakulmio"] # 0xec81 (en: 'bottom left rectangle', google translation) - - "îȐ": [T: "ylĂ€oikea suorakulmio"] # 0xec90 (en: 'top right rectangle', google translation) - - "îȑ": [T: "alaoikea suorakulmio"] # 0xec91 (en: 'bottom right rectangle', google translation) - - "îȒ": [T: "synteettinen jakokulma"] # 0xec92 (en: 'synthetic division corner', google translation) # FI: translation unclear - - "îȓ": [T: "synteettinen jakokulma vaakasuora pidennys"] # 0xec93 (en: 'synthetic division horizontal extender', google translation) # FI: translation unclear - - "îȔ": [T: "synteettinen jakokulma pystysuora pidennys"] # 0xec94 (en: 'synthetic division vertical extender', google translation) # FI: translation unclear - - "îȕ": [T: "vasen katto lattia pidennys"] # 0xec95 (en: 'left ceiling floor extender', google translation) - - "îȖ": [T: "oikea katto lattia pidennys"] # 0xec96 (en: 'right ceiling floor extender', google translation) - - "îȗ": [T: "yli hakasulku pidennys"] # 0xec97 (en: 'over bracket extender', google translation) # FI: translation unclear - - "îȘ": [T: "pystypalkki pidennys"] # 0xec98 (en: 'vertical bar extender', google translation) - - "îș": [T: "vasen kaksinkertainen pystypalkki pidennys"] # 0xec99 (en: 'left double vertical bar extender', google translation) - - "îȚ": [T: "vaakasuora palkki pidennys"] # 0xec9a (en: 'horizontal bar extender', google translation) - - "îȜ": [T: "ala hakasulku pidennys"] # 0xec9c (en: 'under bracket extender', google translation) # FI: translation unclear - - "îȝ": [T: "alaspĂ€in osoittava kaarisulku oikea"] # 0xec9d (en: 'down pointing paren right', google translation) - - "îȞ": [T: "alaspĂ€in osoittava kaarisulku pidennys"] # 0xec9e (en: 'down pointing paren extender', google translation) - - "îȟ": [T: "alaspĂ€in osoittava kaarisulku vasen"] # 0xec9f (en: 'down pointing paren left', google translation) - - "îČ ": [T: "ylöspĂ€in osoittava hakasulku pidennys"] # 0xeca0 (en: 'up pointing brace extender', google translation) - - "îČĄ": [T: "ylöspĂ€in osoittava kaarisulku vasen"] # 0xeca1 (en: 'up pointing paren left', google translation) - - "îČą": [T: "ylöspĂ€in osoittava kaarisulku pidennys"] # 0xeca2 (en: 'up pointing paren extender', google translation) - - "îČŁ": [T: "ylöspĂ€in osoittava kaarisulku oikea"] # 0xeca3 (en: 'up pointing paren right', google translation) - - "îČ€": [T: "alaspĂ€in osoittava kaarisulku pidennys"] # 0xeca4 (en: 'down pointing brace extender', google translation) - - "": [T: "planckin vakio kahden piin ylĂ€puolella palkki"] # 0xed00 (en: 'planck constant over two pi bar', google translation) # FI: translation unclear - - "": [T: "peili g"] # 0xed01 (en: 'mirror g', google translation) - - "": [T: "pisteetön j"] # 0xed02 (google translation) - - "": [T: "digamma"] # 0xed03 (google translation) # FI: translation unclear - - "ϝ": [T: "digamma"] # 0x3dd # FI: : translation unclear - - "": [T: "d"] # 0xed10 (en: 'd', google translation) - - "": [T: "e"] # 0xed11 (en: 'e', google translation) - - "": [T: "i"] # 0xed12 (en: 'i', google translation) - - "": [T: "j"] # 0xed13 (en: 'j', google translation) - - "ⅅ": - - SPELL: "translate('.', 'ⅅ', 'DD')" # 0xed16, 0x2145 - -# The private use chars are from MathType - - "": [T: "kĂ€yrĂ€integraalisilmukka vastapĂ€ivÀÀn"] # 0xee00 (en: 'anticlockwise contour integral loop', google translation) - - "": [T: "kĂ€yrĂ€integraalisilmukka myötĂ€pĂ€ivÀÀn"] # 0xee01 (en: 'clockwise contour integral loop', google translation) - - "": [T: ""] # 0xee04 - - "": [T: ""] # 0xee05 - - "": [T: ""] # 0xee06 - - "": [T: ""] # 0xee07 - - "": [T: ""] # 0xee08 - - "": [T: ""] # 0xee09 - - "": [T: ""] # 0xee0a - - "": [T: ""] # 0xee0b - - "": [T: ""] # 0xee0c - - "": [T: "yhteinen tila koriste"] # 0xee0d (en: 'joint status embellishment', google translation) # FI: translation unclear, context? - - "": [T: "yhteinen tila korite vasen"] # 0xee0e (en: 'joint status embellishment left', google translation) # FI: translation unclear, context? - - "": [T: "yhteinen tila koriste oikea"] # 0xee0f (en: 'joint status embellishment right', google translation) # FI: translation unclear, context? - - "": [T: "yhteinen tila koriste pidennys"] # 0xee10 (en: 'joint status embellishment extender', google translation) # FI: translation unclear, context? - - "": [T: "integraalisilmukka"] # 0xee11 (en: 'integral loop', google translation) - - "": [T: "kaksinkertainen integraalisilmukka"] # 0xee12 (en: 'integral loop double', google translation) - - "": [T: "kolminkertainen integraalisilmukka"] # 0xee13 (en: 'integral loop triple', google translation) - - "": [T: "laajentuva kaksinkertainen integraalisilmukka"] # 0xee15 (en: 'expanding integral loop double', google translation) - - "": [T: "laajentuva kolminkertainen integraalisilmukka"] # 0xee16 (en: 'expanding integral loop triple', google translation) - - "": [T: "asymptoottisesti yhtĂ€ suuri kuin aksentti"] # 0xee17 (en: 'asymptotically equal to accent', google translation) - - "": [T: "yhtĂ€ suuri kuin -merkki aksentti"] # 0xee18 (en: 'equal sign accent', google translation) - - "": [T: "neljĂ€s derivaatta"] # 0xee19 (en: 'quadruple prime', google translation) # FI: 4th derivative? - - "": [T: "palkkiaksentti avoimella ympyrĂ€llĂ€ vasen"] # 0xee1a (en: 'bar accent with open circle left', google translation) # FI: translation unclear - - "": [T: "palkkiaksentti suljetulla ympyrĂ€llĂ€ vasen"] # 0xee1b (en: 'bar accent with closed circle left', google translation) # FI: translation unclear - - "": [T: "palkkiaksentti avoimella ympyrĂ€llĂ€ oikea"] # 0xee1c (en: 'bar accent with open circle right', google translation) # FI: translation unclear - - "": [T: "palkkiaksentti ja piste ylĂ€puolella"] # 0xee1d (en: 'bar accent with over dot', google translation) # FI: translation unclear - - "": [T: "palkkiaksentti ja piste alapuolella"] # 0xee1e (en: 'bar accent with under dot', google translation) # FI: translation unclear - - "": [T: "palkkiaksentti ja kaksinkertainen piste ylĂ€puolella"] # 0xee1f (en: 'bar accent with double over dot', google translation) # FI: translation unclear - - "îž ": [T: "palkkiaksentti ja kaksinkertainen piste alapuolella"] # 0xee20 (en: 'bar accent with double under dot', google translation) # FI: translation unclear - - "": [T: "palkkiaksentti sirkumfleksillĂ€"] # 0xee21 (en: 'bar accent with caret', google translation) # FI: translation unclear - - "îžą": [T: "paksu alapalkkiaksentti"] # 0xee22 (en: 'thick under bar accent', google translation) # FI: translation unclear - - "": [T: "palkkiaksentti suljetulla ympyrĂ€llĂ€ oikea"] # 0xee23 (en: 'bar accent with closed circle right', google translation) # FI: translation unclear - - "": [T: "suuri piste ylĂ€puolella"] # 0xee24 (en: 'large dot above', google translation) # FI: translation unclear - - "": [T: "kohdistusmerkki"] # 0xef00 (en: 'alignment mark', google translation) # FI: translation unclear - - "": [T: ""] # 0xef01 - - "​": [T: ""] # 0x200b - - "": [T: ""] # 0xef02 - - " ": [T: ""] # 0x2009 - - "": [T: ""] # 0xef03 - - " ": [T: ""] # 0x205f - - "": [T: ""] # 0xef04 - - "": [T: ""] # 0xef05 - - " ": [T: ""] # 0x2003 - - "": [T: ""] # 0xef06 - - "": [T: ""] # 0xef07 - - "": [T: ""] # 0xef08 - - "": [T: ""] # 0xef09 - - "": [T: ""] # 0xef0a - - " ": [T: ""] # 0x200a - - "îŒą": [T: ""] # 0xef22 - - "îŒŁ": [T: ""] # 0xef23 - - "": [T: ""] # 0xef24 - - "": [T: ""] # 0xef29 - - "": [T: "puuttuva termi"] # 0xef41 (en: 'missing term', google translation) - - "": [T: "kĂ€yrĂ€integraalinuoli myötĂ€vĂ€ivÀÀn vasemmalla"] # 0xef80 (en: 'clockwise contour integral arrow on left', google translation) - - "": [T: "integraali neliöllĂ€"] # 0xef81 (en: 'integral with square', google translation) - - "": [T: "integraali vinoviivalla"] # 0xef82 (en: 'integral with slash', google translation) - - "": [T: "kÀÀnnetty integraali"] # 0xef83 (en: 'reversed integral', google translation) - - "": [T: "kaksinkertainen nolla yli kaksinkertaisen nollan"] # 0xef90 (en: 'double zero over double zero', google translation) - - "": [T: "nolla vinoviivalla"] # 0xef91 (en: 'zero with slash', google translation) - - # fraktur 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) - - T: "fraktuura" # (google translation) - - SPELL: "translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" - - - "-": # 0xf000 - 0xf018 - - T: "fraktuura" # (google translation) - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" - - - "𝔞-đ”·": # 0x1d51e - 0x1d537 - - T: "fraktuura" # (google translation) - - SPELL: "translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz')" - - "-ï€ł": # 0xf01a - 0xf033 - - T: "fraktuura" # (google translation) - - SPELL: "translate('.', 'ï€šï€›ï€œï€ï€žï€Ÿï€ ï€Ąï€ąï€Łï€€ï€„ï€Šï€§ï€šï€©ï€Șï€«ï€Źï€­ï€źï€Żï€°ï€±ï€Čï€ł', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝕬-𝖅": # 0x1D56C - 0x1D585 - - T: "fraktuura lihavoitu" # (google translation) - - SPELL: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf040 - 0xf059 - - T: "fraktuura lihavoitu" # (google translation) - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝖆-𝖟": # 0x1d586 - 0x1d59f - - T: "fraktuura lihavoitu" # (google translation) - - SPELL: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" - - "-ïł": # 0xf05a - 0xf073 - - T: "fraktuura lihavoitu" # (google translation) - - 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) - - test: - if: "$Verbosity!='Terse'" - then: [T: "kaksoisviivainen"] # (en: 'double struck', google translation) - - SPELL: "translate('.', '𝔾đ”čđ”șđ”»đ”Œđ”œđ”Ÿđ”żđ•€đ•đ•‚đ•ƒđ•„đ•…đ•†đ•‡đ•ˆđ•‰đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf080 - 0xf098 - - test: - if: "$Verbosity!='Terse'" - then: [T: "kaksoisviivainen"] # (en: 'double struck', google translation) - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝕒-đ•«": # 0x1d552 - 0x1d56b - - test: - if: "$Verbosity!='Terse'" - then: [T: "kaksoisviivainen"] # (en: 'double struck', google translation) - - SPELL: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" - - "-ï‚ł": # 0xf09a - 0xf0b3 - - test: - if: "$Verbosity!='Terse'" - then: [T: "kaksoisviivainen"] # (en: 'double struck', google translation) - - SPELL: "translate('.', 'ï‚šï‚›ï‚œï‚ï‚žï‚Ÿï‚ ï‚Ąï‚ąï‚Łï‚€ï‚„ï‚Šï‚§ï‚šï‚©ï‚Șï‚«ï‚Źï‚­ï‚źï‚Żï‚°ï‚±ï‚Čï‚ł', 'abcdefghijklmnopqrstuvwxyz')" - - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 - - test: - if: "$Verbosity!='Terse'" - then: [T: "kaksoisviivainen"] # (en: 'double struck', google translation) - - SPELL: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" - - "-": # 0xf0c0 - 0xf0c9 - - test: - if: "$Verbosity!='Terse'" - then: [T: "kaksoisviivainen"] # (en: 'double struck', google translation) - - SPELL: "translate('.', '', '0123456789')" - - - "": [T: "kaksoisviivainen nabla"] # 0xf0ca (en: 'double struck nabla', google translation) - - "": [T: "kaksoisviivainen eulerin vakio"] # 0xf0cb (en: 'double struck euler constant', google translation) - - # script chars in math alphabetic block and also MathType private use area - - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 - - T: "kauno" # (en: 'script', google translation) - - SPELL: "translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf100 - 0xf119 - - T: "kauno" # (en: 'script', google translation) - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf - - T: "kauno" # (en: 'script', google translation) - - SPELL: "translate('.', 'đ’¶đ’·đ’žđ’čđ’șđ’»đ’Œđ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“„đ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdefghijklmnopqrstuvwxyz')" - - "-ï„ł": # 0xf11a - 0xf133 - - T: "kauno" # (en: 'script', google translation) - - SPELL: "translate('.', 'ï„šï„›ï„œï„ï„žï„Ÿï„ ï„Ąï„ąï„Łï„€ï„„ï„Šï„§ï„šï„©ï„Șï„«ï„Źï„­ï„źï„Żï„°ï„±ï„Čï„ł', 'abcdefghijklmnopqrstuvwxyz')" - - # bold script chars in math alphabetic block and also MathType private use area - - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 - - T: "lihavoitu kauno" # (en: 'script bold', google translation) - - SPELL: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf140 - 0xf159 - - T: "lihavoitu kauno" # (en: 'script bold', google translation) - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "đ“Ș-𝔃": # 0x1d4ea - 0x1d503 - - T: "lihavoitu kauno" # (en: 'script bold', google translation) - - SPELL: "translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz')" - - "-ï…ł": # 0xf15a - 0xf173 - - T: "lihavoitu kauno" # (en: 'script bold', google translation) - - SPELL: "translate('.', 'ï…šï…›ï…œï…ï…žï…Ÿï… ï…Ąï…ąï…Łï…€ï…„ï…Šï…§ï…šï…©ï…Șï…«ï…Źï…­ï…źï…Żï…°ï…±ï…Čï…ł', 'abcdefghijklmnopqrstuvwxyz')" - - - "-": # 0xf180 - 0xf199 - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "": # 0xf19a - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "iso"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [T: "ligatuuri a e"] # (google translation) - - "": # 0xf19b - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "iso"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [T: "terĂ€vĂ€ s"] # (en: 'sharp s', google translation) # FI: : translation unclear - - "": # 0xf19c - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "iso"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [T: "o yliviivauksella"] # (en: 'o with stroke', google translation) - - # MathType only has a few of the cap Greek letters in PUA - - "": # 0xf201 - 0xf209 - - test: - if: "$Verbosity!='Terse'" - then: [T: "kaksoisviivainen"] # (en: 'double struck', google translation) - - SPELL: "translate('.', '', 'Î”ÎšÎ›Î ÎŁÎ˜Î“Î©Î„')" - - - "-": # 0xf220 - 0xf236 - - test: - if: "$Verbosity!='Terse'" - then: [T: "kaksoisviivainen"] # (en: 'double struck', google translation) - - SPELL: "translate('.', 'ïˆ ïˆĄïˆąïˆŁïˆ€ïˆ„ïˆŠïˆ§ïˆšïˆ©ïˆȘïˆ«ïˆŹïˆ­ïˆźïˆŻïˆ°ïˆ±ïˆČïˆłïˆŽïˆ”ïˆ¶', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "": [T: "kaksoisviivainen viimeinen sigma"] # 0xf237 (en: 'double struck final sigma', google translation) - - "": [T: "kaksoisviivainen rho"] # 0xf250 (en: 'double struck rho', google translation) - - "": [T: "kaksoisviivainen fii"] # 0xf251 (google translation) - - "𝐀-𝐙": # 0x1d400 - 0x1d419 - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-ï‰č": # 0xf260 - 0xf279 - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', 'ï‰ ï‰Ąï‰ąï‰Łï‰€ï‰„ï‰Šï‰§ï‰šï‰©ï‰Șï‰«ï‰Źï‰­ï‰źï‰Żï‰°ï‰±ï‰Čï‰łï‰Žï‰”ï‰¶ï‰·ï‰žï‰č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝐚-𝐳": # 0x1d41a - 0x1d433 - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" - - - "ï‰ș-": # 0xf27a - 0xf293 - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', 'ï‰șï‰»ï‰Œï‰œï‰Ÿï‰żïŠ€ïŠïŠ‚ïŠƒïŠ„ïŠ…ïŠ†ïŠ‡ïŠˆïŠ‰ïŠŠïŠ‹ïŠŒïŠïŠŽïŠïŠïŠ‘ïŠ’ïŠ“', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝐮-𝑍": # 0x1d434 - 0x1d44d - - SPELL: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf294 - 0xf2ad - - SPELL: "translate('.', 'ïŠ”ïŠ•ïŠ–ïŠ—ïŠ˜ïŠ™ïŠšïŠ›ïŠœïŠïŠžïŠŸïŠ ïŠĄïŠąïŠŁïŠ€ïŠ„ïŠŠïŠ§ïŠšïŠ©ïŠȘïŠ«ïŠŹïŠ­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝑎-𝑧": # 0x1d44e - 0x1d467 - - SPELL: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”đ‘•đ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" - - - "ïŠź-": # 0xf2ae - 0xf2c7 - - SPELL: "translate('.', 'ïŠźïŠŻïŠ°ïŠ±ïŠČïŠłïŠŽïŠ”ïŠ¶ïŠ·ïŠžïŠčïŠșïŠ»ïŠŒïŠœïŠŸïŠżï‹€ï‹ï‹‚ï‹ƒï‹„ï‹…ï‹†ï‹‡', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝑹-𝒁": # 0x1d468 - 0x1d481 - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-ï‹Ą": # 0xf2c8 - 0xf2e1 - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', 'ï‹ˆï‹‰ï‹Šï‹‹ï‹Œï‹ï‹Žï‹ï‹ï‹‘ï‹’ï‹“ï‹”ï‹•ï‹–ï‹—ï‹˜ï‹™ï‹šï‹›ï‹œï‹ï‹žï‹Ÿï‹ ï‹Ą', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝒂-𝒛": # 0x1d482 - 0x1d49b - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" - - - "ï‹ą-": # 0xf2e2 - 0xf2fb - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', 'ï‹ąï‹Łï‹€ï‹„ï‹Šï‹§ï‹šï‹©ï‹Șï‹«ï‹Źï‹­ï‹źï‹Żï‹°ï‹±ï‹Čï‹łï‹Žï‹”ï‹¶ï‹·ï‹žï‹čï‹ș', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 - - SPELL: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf300 - 0xf319 - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 - - SPELL: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" - - - "-ïŒł": # 0xf31a - 0xf333 - - SPELL: "translate('.', 'ïŒšïŒ›ïŒœïŒïŒžïŒŸïŒ ïŒĄïŒąïŒŁïŒ€ïŒ„ïŒŠïŒ§ïŒšïŒ©ïŒȘïŒ«ïŒŹïŒ­ïŒźïŒŻïŒ°ïŒ±ïŒČïŒł', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf334 - 0xf34d - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', 'ïŒčïŒșïŒ»ïŒŒïŒœïŒŸïŒżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒï', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝗼-𝘇": # 0x1d5ee - 0x1d607 - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" - - - "-": # 0xf34e - 0xf367 - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', 'ïŽïïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§', 'abcdefghijklmnopqrstuvwxyz')" - - "𝘈-𝘡": # 0x1d608 - 0x1d621 - # - t: "italic" - - SPELL: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - "-": # 0xf368 - 0xf381 - # - t: "italic" - - SPELL: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżïŽ€ïŽ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝘱-đ˜»": # 0x1d622 - 0x1d63b - # - t: "italic" - - SPELL: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" - - - "-": # 0xf382 - 0xf39b - # - t: "italic" - - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - - - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf39c - 0xf3b5 - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', 'ïŽœïŽïŽžïŽŸïŽ ïŽĄïŽąïŽŁïŽ€ïŽ„ïŽŠïŽ§ïŽšïŽ©ïŽȘïŽ«ïŽŹïŽ­ïŽźïŽŻïŽ°ïŽ±ïŽČïŽłïŽŽïŽ”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝙖-𝙯": # 0x1d656 - 0x1d66f - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" - - - "-": # 0xf3b6 - 0xf3cf - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', 'ïŽčïŽșïŽ»ïŽŒïŽœïŽŸïŽżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒïïŽï', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝙰-𝚉": # 0x1d670 - 0x1d689 - - SPELL: "translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf3d0 - 0xf3e9 - - SPELL: "translate('.', 'ïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§ïšï©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝚊-𝚣": # 0x1d68a - 0x1d6a3 - - SPELL: "translate('.', '𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚱𝚣', 'abcdefghijklmnopqrstuvwxyz')" - - - "ïȘ-": # 0xf3ea - 0xf403 - - SPELL: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżï€ïï‚ïƒ', 'abcdefghijklmnopqrstuvwxyz')" - - - "": [T: "pisteetön i"] # 0xf404 (google translation) - - "đš€": [T: "pisteetön i"] # 0x1d6a4 (en: 'dotless i', google: 'dotless i') - - "đš„": [T: "pisteetön j"] # 0x1d6a5 (en: 'dotless j', google: 'dotless j') - - - "𝚹-𝛀": # 0x1d6a8 - 0x1d6c0 - - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') - - SPELL: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "-": # 0xf408 - 0xf420 - - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') - - SPELL: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "𝛂-𝛚": # 0x1d6c2 - 0x1d6da - - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') - - SPELL: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙𝛚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "ïą-ïș": # 0xf422 - 0xf43a - - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') - - SPELL: "translate('.', 'ïąïŁï€ï„ïŠï§ïšï©ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïș', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "ïĄ": [T: "lihavoitu nabla"] # 0xf421 (en: 'bold nabla', google translation) - - "𝛁": [T: "lihavoitu nabla"] # 0x1d6c1 (en: 'bold nabla') - - - "𝛛𝛜𝛝𝛞𝛟𝛠𝛡": # 0x1D6DB - 0x1D6E1 - - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') - - SPELL: "translate('.', '𝛛𝛜𝛝𝛞𝛟𝛠𝛡', '∂ΔΞÎșφρπ')" - - - "ï»ïŒïœïŸïżï‘€ï‘": # 0xF43C - 0xF441 - - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') - - SPELL: "translate('.', 'ï»ïŒïœïŸïżï‘€ï‘', '∂ΔΞÎșφρπ')" - - - "𝛱-đ›ș": # 0x1d6e2 - 0x1d6fa - # - t: "italic" - - SPELL: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›čđ›ș', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "-": # 0xf442 - 0xf45a - # - t: "italic" - - SPELL: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "đ›Œ-𝜔": # 0x1d6fc - 0x1d714 - # - t: "italic" - - SPELL: "translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“đœ”', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "-": # 0xf45c - 0xf474 - # - t: "italic" - - SPELL: "translate('.', 'ï‘œï‘ï‘žï‘Ÿï‘ ï‘Ąï‘ąï‘Łï‘€ï‘„ï‘Šï‘§ï‘šï‘©ï‘Șï‘«ï‘Źï‘­ï‘źï‘Żï‘°ï‘±ï‘Čï‘łï‘Ž', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "": [T: "kursivoitu nabla"] # 0xf45b (en: 'italic nabla', google translation) - - "đ›»": [T: "lihavoitu nabla"] # 0x1d6fb (en: 'italic nabla', google: 'kursivoitu nabla') - - - "𝜕𝜖𝜗𝜘𝜙𝜚𝜛": # 0x1d715 - 0x1d71b - # - t: "italic" - - SPELL: "translate('.', '𝜕𝜖𝜗𝜘𝜙𝜚𝜛', '∂ΔΞÎșφρπ')" - - - "ï‘čï‘ș": # 0xf475 - 0xf47b - # - t: "italic" - - SPELL: "translate('.', 'ï‘čï‘ș', '∂ΔΞÎșφρπ')" - - - "𝜜-𝜮": # 0x1d71c - 0x1d734 - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') - - SPELL: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳𝜮', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "-": # 0xf47c - 0xf494 - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') - - SPELL: "translate('.', 'ï‘Œï‘œï‘Ÿï‘żï’€ï’ï’‚ï’ƒï’„ï’…ï’†ï’‡ï’ˆï’‰ï’Šï’‹ï’Œï’ï’Žï’ï’ï’‘ï’’ï’“ï’”', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "đœ¶-𝝎": # 0x1d736 - 0x1d74e - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') - - SPELL: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđđŽ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "-ï’ź": # 0xf496 - 0xf4ae - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') - - SPELL: "translate('.', 'ï’–ï’—ï’˜ï’™ï’šï’›ï’œï’ï’žï’Ÿï’ ï’Ąï’ąï’Łï’€ï’„ï’Šï’§ï’šï’©ï’Șï’«ï’Źï’­ï’ź', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "𝝏𝝐𝝑𝝒𝝓𝝔𝝕": # 0x1d74f - 0x1d755 - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') - - SPELL: "translate('.', '𝝏𝝐𝝑𝝒𝝓𝝔𝝕', '∂ΔΞÎșφρπ')" - - - "ï’Żï’°ï’±ï’Čï’łï’Žï’”": # 0xf422 - 0xf43a - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') - - SPELL: "translate('.', 'ï’Żï’°ï’±ï’Čï’łï’Žï’”', '∂ΔΞÎșφρπ')" - - - "đœ”": [T: "lihavoitu kursivoitu nabla"] # 0x1d735 (en: 'bold italic nabla', google: 'rohkea kursivoitu nabla') - - "": [T: "lihavoitu kursivoitu nabla"] # 0xf495 (en: 'bold italic nabla', google translation) - - - "𝝖-𝝼": # 0x1d756 - 0x1d76e - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đź', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - "-": # 0xf4b6 - 0xf4ce - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', 'ï’¶ï’·ï’žï’čï’șï’»ï’Œï’œï’Ÿï’żï“€ï“ï“‚ï“ƒï“„ï“…ï“†ï“‡ï“ˆï“‰ï“Šï“‹ï“Œï“ï“Ž', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "𝝰-𝞈": # 0x1d770 - 0x1d788 - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€đžđž‚đžƒđž„đž…đž†đž‡đžˆ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "-": # 0xf4d0 - 0xf4e8 - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', 'ï“ï“‘ï“’ï““ï“”ï“•ï“–ï“—ï“˜ï“™ï“šï“›ï“œï“ï“žï“Ÿï“ ï“Ąï“ąï“Łï“€ï“„ï“Šï“§ï“š', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "𝞉𝞊𝞋𝞌𝞍𝞎𝞏": # 0x1d789 - 0x1d78f - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', '𝞉𝞊𝞋𝞌𝞍𝞎𝞏', '∂ΔΞÎșφρπ')" - - - "ï“Șï“«ï“Źï“­ï“źï“Ż": # 0xf4e9 - 0xf4ef - - T: "lihavoitu" # (en: 'bold', google translation) - - SPELL: "translate('.', 'ï“Șï“«ï“Źï“­ï“źï“Ż', '∂ΔΞÎșφρπ')" - - - "": [T: "lihavoitu nabla"] # 0xf4cf (en: 'bold nabla', google translation) - - "𝝯": [T: "lihavoitu nabla"] # 0x1d76f (en: 'bold nabla') - - - "𝞐-𝞹": # 0x1d790 - 0x1d7a8 - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') - - SPELL: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "-": # 0xf4f0 - 0xf508 - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') - - SPELL: "translate('.', 'ï“Čï“łï“Žï“”ï“¶ï“·ï“žï“čï“șï“»ï“Œï“œï“Ÿï“żï”€ï”ï”‚ï”ƒï”„ï”…ï”†ï”‡ï”ˆ', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "đžȘ-𝟂": # 0x1d7aa - 0x1d7c2 - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') - - SPELL: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸđŸ‚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "-ï”ą": # 0xf50a - 0xf522 - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') - - SPELL: "translate('.', 'ï”Šï”‹ï”Œï”ï”Žï”ï”ï”‘ï”’ï”“ï””ï”•ï”–ï”—ï”˜ï”™ï”šï”›ï”œï”ï”žï”Ÿï” ï”Ąï”ą', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "𝟃𝟄𝟅𝟆𝟇𝟈𝟉": # 0x1d7c3 - 0x1d7c9 - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') - - SPELL: "translate('.', '𝟃𝟄𝟅𝟆𝟇𝟈𝟉', '∂ΔΞÎșφρπ')" - - - "ï”Łï”€ï”„ï”Šï”§ï”šï”©": # 0xf523 - 0xf529 - # - t: "bold italic" - - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') - - SPELL: "translate('.', 'ï”Łï”€ï”„ï”Šï”§ï”šï”©', '∂ΔΞÎșφρπ')" - - - "": [T: "lihavoitu nabla"] # 0xf509 (en: 'bold nabla', google translation) - - "đž©": [T: "lihavoitu nabla"] # 0x1d7a9 (en: 'bold nabla') - - - "ï”ź": [T: "lihavoitu nolla"] # 0xf52e (en: 'bold zero', google translation) - - "𝟎": [T: "lihavoitu nolla"] # 0x1d7ce (en: 'bold zero') - - "ï”Ż": [T: "lihavoitu yksi"] # 0xf52f (en: 'bold one', google translation) - - "𝟏": [T: "lihavoitu yksi"] # 0x1d7cf (en: 'bold one', google: 'lihavoitu') - - "": [T: "lihavoitu kaksi"] # 0xf530 (en: 'bold two', google translation) - - "𝟐": [T: "lihavoitu kaksi"] # 0x1d7d0 (en: 'bold two') - - "": [T: "lihavoitu kolme"] # 0xf531 (en: 'bold three', google translation) - - "𝟑": [T: "lihavoitu kolme"] # 0x1d7d1 (en: 'bold three') - - "ï”Č": [T: "lihavoitu neljĂ€"] # 0xf532 (en: 'bold four', google translation) - - "𝟒": [T: "lihavoitu neljĂ€"] # 0x1d7d2 (en: 'bold four', google: 'bold neljĂ€') - - "ï”ł": [T: "lihavoitu viisi"] # 0xf533 (en: 'bold five', google translation) - - "𝟓": [T: "lihavoitu viisi"] # 0x1d7d3 (en: 'bold five') - - "": [T: "lihavoitu kuusi"] # 0xf534 (en: 'bold six', google translation) - - "𝟔": [T: "lihavoitu kuusi"] # 0x1d7d4 (en: 'bold six') - - "ï””": [T: "lihavoitu seitsemĂ€n"] # 0xf535 (en: 'bold seven', google translation) - - "𝟕": [T: "lihavoitu seitsemĂ€n"] # 0x1d7d5 (en: 'bold seven', google: 'rohkea seitsemĂ€n') - - "": [T: "lihavoitu kahdeksan"] # 0xf536 (en: 'bold eight', google translation) - - "𝟖": [T: "lihavoitu kahdeksan"] # 0x1d7d6 (en: 'bold eight', google: 'lihavoitu') - - "": [T: "lihavoitu yhdeksĂ€n"] # 0xf537 (en: 'bold nine', google translation) - - "𝟗": [T: "lihavoitu yhdeksĂ€n"] # 0x1d7d7 (en: 'bold nine') - - "": [T: "nolla"] # 0xf542 (en: 'zero', google translation) - - "𝟱": [T: "nolla"] # 0x1d7e2 (en: 'zero') - - "": [T: "yksi"] # 0xf543 (en: 'one', google translation) - - "𝟣": [T: "yksi"] # 0x1d7e3 (en: 'one') - - "": [T: "kaksi"] # 0xf544 (en: 'two', google translation) - - "đŸ€": [T: "kaksi"] # 0x1d7e4 (en: 'two') - - "": [T: "kolme"] # 0xf545 (en: 'three', google translation) - - "đŸ„": [T: "kolme"] # 0x1d7e5 (en: 'three') - - "": [T: "neljĂ€"] # 0xf546 (en: 'four', google translation) - - "𝟩": [T: "neljĂ€"] # 0x1d7e6 (en: 'four') - - "": [T: "viisi"] # 0xf547 (en: 'five', google translation) - - "𝟧": [T: "viisi"] # 0x1d7e7 (en: 'five') - - "": [T: "kuusi"] # 0xf548 (en: 'six', google translation) - - "𝟹": [T: "kuusi"] # 0x1d7e8 (en: 'six') - - "": [T: "seitsemĂ€n"] # 0xf549 (en: 'seven', google translation) - - "đŸ©": [T: "seitsemĂ€n"] # 0x1d7e9 (en: 'seven') - - "": [T: "kahdeksan"] # 0xf54a (en: 'eight', google translation) - - "đŸȘ": [T: "kahdeksan"] # 0x1d7ea (en: 'eight', google: 'at') - - "": [T: "yhdeksĂ€n"] # 0xf54b (en: 'nine', google translation) - - "đŸ«": [T: "yhdeksĂ€n"] # 0x1d7eb (en: 'nine') - - "": [T: "lihavoitu nolla"] # 0xf54c (en: 'bold zero', google translation) - - "𝟬": [T: "lihavoitu nolla"] # 0x1d7ec (en: 'bold zero') - - "": [T: "lihavoitu yksi"] # 0xf54d (en: 'bold one', google translation) - - "𝟭": [T: "lihavoitu yksi"] # 0x1d7ed (en: 'bold one', google: 'lihavoitu') - - "": [T: "lihavoitu kaksi"] # 0xf54e (en: 'bold two', google translation) - - "𝟼": [T: "lihavoitu kaksi"] # 0x1d7ee (en: 'bold two') - - "": [T: "lihavoitu kolme"] # 0xf54f (en: 'bold three', google translation) - - "𝟯": [T: "lihavoitu kolme"] # 0x1d7ef (en: 'bold three') - - "": [T: "lihavoitu neljĂ€"] # 0xf550 (en: 'bold four', google translation) - - "𝟰": [T: "lihavoitu neljĂ€"] # 0x1d7f0 (en: 'bold four', google: 'bold neljĂ€') - - "": [T: "lihavoitu viisi"] # 0xf551 (en: 'bold five', google translation) - - "đŸ±": [T: "lihavoitu viisi"] # 0x1d7f1 (en: 'bold five') - - "": [T: "lihavoitu kuusi"] # 0xf552 (en: 'bold six', google translation) - - "đŸČ": [T: "lihavoitu kuusi"] # 0x1d7f2 (en: 'bold six') - - "": [T: "lihavoitu seitsemĂ€n"] # 0xf553 (en: 'bold seven', google translation) - - "𝟳": [T: "lihavoitu seitsemĂ€n"] # 0x1d7f3 (en: 'bold seven', google: 'rohkea seitsemĂ€n') - - "": [T: "lihavoitu kahdeksan"] # 0xf554 (en: 'bold eight', google translation) - - "𝟮": [T: "lihavoitu kahdeksan"] # 0x1d7f4 (en: 'bold eight', google: 'lihavoitu') - - "": [T: "lihavoitu yhdeksĂ€n"] # 0xf555 (en: 'bold nine', google translation) - - "đŸ”": [T: "lihavoitu yhdeksĂ€n"] # 0x1d7f5 (en: 'bold nine') - - "": [T: "nolla"] # 0xf556 (en: 'zero', google translation) - - "đŸ¶": [T: "nolla"] # 0x1d7f6 (en: 'zero') - - "": [T: "yksi"] # 0xf557 (en: 'one', google translation) - - "đŸ·": [T: "yksi"] # 0x1d7f7 (en: 'one') - - "": [T: "kaksi"] # 0xf558 (en: 'two', google translation) - - "𝟾": [T: "kaksi"] # 0x1d7f8 (en: 'two') - - "": [T: "kolme"] # 0xf559 (en: 'three', google translation) - - "đŸč": [T: "kolme"] # 0x1d7f9 (en: 'three') - - "": [T: "neljĂ€"] # 0xf55a (en: 'four', google translation) - - "đŸș": [T: "neljĂ€"] # 0x1d7fa (en: 'four') - - "": [T: "viisi"] # 0xf55b (en: 'five', google translation) - - "đŸ»": [T: "viisi"] # 0x1d7fb (en: 'five') - - "": [T: "kuusi"] # 0xf55c (en: 'six', google translation) - - "đŸŒ": [T: "kuusi"] # 0x1d7fc (en: 'six') - - "": [T: "seitsemĂ€n"] # 0xf55d (en: 'seven', google translation) - - "đŸœ": [T: "seitsemĂ€n"] # 0x1d7fd (en: 'seven') - - "": [T: "kahdeksan"] # 0xf55e (en: 'eight', google translation) - - "đŸŸ": [T: "kahdeksan"] # 0x1d7fe (en: 'eight', google: 'at') - - "": [T: "yhdeksĂ€n"] # 0xf55f (en: 'nine', google translation) - - "𝟿": [T: "yhdeksĂ€n"] # 0x1d7ff (en: 'nine') - - "": [T: "tuntematon merkki"] # 0xf700 (en: 'unknown character', google translation) - - "": [T: "alaoikea ja alavasen kolmio"] # 0xf726 (en: 'lower right and lower left triangles', google translation) - - "": [T: "vaakasuora pistekolmikko pidennys"] # 0xf72d (en: 'horizontal ellipsis extender', google translation) - - "ïœź": [T: "keskiviivan vaakasuora pistekolmikko pidennys"] # 0xf72e (en: 'midline horizontal ellipsis extender', google translation) - - "ïŁ„": [T: "radikaali pidennys"] # 0xf8e5 (en: 'radical extender', google translation) # FI: unclear translation, root? - - "ïŁŠ": [T: "pystysuora nuoli pidennys"] # 0xf8e6 (en: 'vertical arrow extender', google translation) - - "ïŁ§": [T: "vaakasuora nuoli pidennys"] # 0xf8e7 (en: 'horizontal arrow extender', google translation) - - "ïŁš": [T: "rekisteröity merkki sans serif"] # 0xf8e8 (en: 'registered sign sans serif', google translation) - - "ïŁ©": [T: "tekijĂ€noikeusmerkki sans serif"] # 0xf8e9 (en: 'copyright sign sans serif', google translation) - - "ïŁȘ": [T: "trademark -merkki sans serif"] # 0xf8ea (en: 'trade mark sign sans serif', google translation) - - "ïŁ«": [T: "vasen kaarisulku ylĂ€"] # 0xf8eb (en: 'left paren top', google translation) - - "ïŁŹ": [T: "vasen kaarisulku pidennys"] # 0xf8ec (en: 'left paren extender', google translation) - - "ïŁ­": [T: "vasen kaarisulku ala"] # 0xf8ed (en: 'left paren bottom', google translation) - - "ïŁź": [T: "vasen hakasulku ylĂ€"] # 0xf8ee (en: 'left bracket top', google translation) - - "ïŁŻ": [T: "vasen hakasulku pidennys"] # 0xf8ef (en: 'left bracket extender', google translation) - - "ïŁ°": [T: "vasen hakasulku ala"] # 0xf8f0 (en: 'left bracket bottom', google translation) - - "ïŁ±": [T: "vasen hakasulku ylĂ€"] # 0xf8f1 (en: 'left brace top', google translation) - - "ïŁČ": [T: "vasen aaltosulku keski"] # 0xf8f2 (en: 'left brace mid', google translation) - - "ïŁł": [T: "vasen aaltosulku ala"] # 0xf8f3 (en: 'left brace bottom', google translation) - - "ïŁŽ": [T: "aaltosulku pidennys"] # 0xf8f4 (en: 'brace extender', google translation) - - "ïŁ”": [T: "integraali pidennys"] # 0xf8f5 (en: 'integral extender', google translation) - - "ïŁ¶": [T: "oikea kaarisulku ylĂ€"] # 0xf8f6 (en: 'right paren top', google translation) - - "ïŁ·": [T: "oikea kaarisulku pidennys"] # 0xf8f7 (en: 'right paren extender', google translation) - - "ïŁž": [T: "oikea kaarisulku ala"] # 0xf8f8 (en: 'right paren bottom', google translation) - - "ïŁč": [T: "oikea hakasulku ylĂ€"] # 0xf8f9 (en: 'right bracket top', google translation) - - "ïŁș": [T: "oikea hakasulku pidennys"] # 0xf8fa (en: 'right bracket extender', google translation) - - "ïŁ»": [T: "oikea hakasulku ala"] # 0xf8fb (en: 'right bracket bottom', google translation) - - "ïŁŒ": [T: "oikea aaltosulku ylĂ€"] # 0xf8fc (en: 'right brace top', google translation) - - "ïŁœ": [T: "oikea aaltosulku keski"] # 0xf8fd (en: 'right brace mid', google translation) - - "ïŁŸ": [T: "oikea aaltosulku ala"] # 0xf8fe (en: 'right brace bottom', google translation) - - "ïŁż": [T: "apple-logo"] # 0xf8ff (en: 'apple logo', google translation) - - "ïŹ€": [T: "f f"] # 0xfb00 (en: 'ff', google: 'ff') - - "ïŹ": [T: "f i"] # 0xfb01 (en: 'fi', google: 'fi') - - "ïŹ‚": [T: "f l"] # 0xfb02 (en: 'fl', google: 'fl') - - "ïŹƒ": [T: "f f i"] # 0xfb03 (en: 'ffi', google: 'ffi') - - "ïŹ„": [T: "f f l"] # 0xfb04 (en: 'ffl', google: 'ffl') - - "ïŹ…": [T: "f t"] # 0xfb05 (google translation) - - "ïŹ†": [T: "s t"] # 0xfb06 (google translation) - - "ïž ": [T: "ligatuuri vasen puolikas koriste"] # 0xfe20 (en: 'ligature left half embellishment', google translation) # FI: : translation unclear - - "ïžĄ": [T: "ligatuuri oikea puolikas koriste"] # 0xfe21 (en: 'ligature right half embellishment', google translation) # FI: : translation unclear - - "ïžą": [T: "kaksoistilde vasen puolikas koriste"] # 0xfe22 (en: 'double tilde left half embellishment', google translation) # FI: : translation unclear - - "ïžŁ": [T: "kaksoistilde oikea puolikas koriste"] # 0xfe23 (en: 'double tilde right half embellishment', google translation) - - "": [T: "pituusmerkki vasen puolikas koriste"] # 0xfe24 (en: 'macron left half embellishment', google translation) - - "ïž„": [T: "pituusmerkki oikea puolikas koriste"] # 0xfe25 (en: 'macron right half embellishment', google translation) - - "": [T: "yhdistĂ€vĂ€ pituusmerkkikoriste"] # 0xfe26 (en: 'conjoining macron embellishment', google translation) - - "ïž”": [T: "ylĂ€sulku"] # 0xfe35 (google: 'yli sulku') - - "ïž¶": [T: "alasulku"] # 0xfe36 (google: 'suluissa') - - "ïž·": [T: "ylĂ€aaltosulku"] # 0xfe37 (en: 'over brace', google: 'yli ahdin') - - "ïžž": [T: "ala-aaltosulku"] # 0xfe38 (en: 'under brace', google: 'ahdin alla') - - "ïžż": [T: "ylĂ€kulmasulku"] # 0xfe3f (google: 'yli kulmakiinnike') - - "ïč€": [T: "alakulmasulku"] # 0xfe40 (google: 'kulmakiinnikkeessĂ€') - - "ïčš": [T: "kokonaislukujen jakomerkki"] # 0xfe68 (google: 'kokonaislukujako') - - "ïżŒ": [T: "tuntematon tai puuttuva objekti"] # 0xfffc (en: 'unknown or missing object', google translation) - - "ïżœ": [T: "tuntematon tai puuttuva merkki"] # 0xfffd (en: 'unknown or missing character') +--- + +# Translated with the help of https://jkorpela.fi/merkkien-nimet.html + + - "Âą": [T: "senttiĂ€"] # 0xa2 (en: 'cents') + - "ÂŁ": [T: "puntaa"] # 0xa3 (en: 'pounds') + - "€": [T: "valuuttamerkki"] # 0xa4 (en: 'currency sign') + - "„": [T: "jeni"] # 0xa5 (en: 'yen', google: 'jeni') + - "Š": [T: "katkopystyviiva"] # 0xa6 (en: 'broken bar', google: 'rikkoutunut palkki') + - "§": [T: "pykĂ€lĂ€"] # 0xa7 (en: 'section', google: 'osa') + - "š": [T: "piste piste"] # 0xa8 (en: 'double dot', google: 'kaksinkertainen piste') # FI: use case with derivative? + - "©": [T: "tekijĂ€noikeus"] # 0xa9 (en: 'copyright', google: 'tekijĂ€noikeudet') # FI: in NVDA it's written "copyright" + - "ÂȘ": [T: "feminiininen jĂ€rjestysluku"] # 0xaa (en: 'feminine ordinal indicator', google: 'naisellinen ordinaaliindikaattori') + - "«": [T: "vasemmalle osoittava kaksinkertainen kulmalainausmerkki"] # 0xab (en: 'left-pointing double angle quote mark', google: 'vasemman potentiaalinen kaksoiskulma lainausmerkki') + - "ÂŻ": # 0xaf + - test: + if: "ancestor::m:modified-variable and preceding-sibling::*[1][self::m:mi]" + then: [T: "viiva"] # (en: 'bar', google translation) + else: [T: "viiva"] # (en: 'line', google: 'linja') + - "ÂČ": [T: "ylĂ€indeksi kaksi"] # 0xb2 (en: 'two', google: 'kaksi') + - "Âł": [T: "ylĂ€indeksi kolme"] # 0xb3 (en: 'three', google: 'kolme') + - "”": [T: "mikro"] # 0xb5 (en: 'micro') + - "Âč": [T: "ylĂ€indeksi yksi"] # 0xb9 (en: 'one', google: 'yksi') + - "Âș": [T: "maskuliininen jĂ€rjestysluku"] # 0xb9 (en: 'masculine ordinal indicator', google: 'maskuliininen ordinaaliindikaattori') # should be 0xba + - "ʰ": [T: "ylĂ€indeksi h"] # 0x2b0 (en: 'modifier small h', google translation) + - "ʱ": [T: "ylĂ€indeksi h koukulla"] # 0x2b1 (en: 'modifier small h with hook', google translation) + - "ÊČ": [T: "ylĂ€indeksi j"] # 0x2b2 (en: 'modifier small j', google translation) + - "Êł": [T: "ylĂ€indeksi r"] # 0x2b3 (en: 'modifier small r', google translation) + - "ÊŽ": [T: "ylĂ€indeksi kÀÀnnetty r"] # 0x2b4 (en: 'modifier small turned r', google translation) + - "Ê”": [T: "ylĂ€indeksi kÀÀnnetty r koukulla"] # 0x2b5 (en: 'modifier small turned r with hook', google translation) + - "ʶ": # 0x2b6 + - T: "ylĂ€indeksi kÀÀnnetty R" # (en: 'modifier small inverted', google translation) + - SPELL: "translate('R', 'R', 'R')" + + - "Ê·": [T: "ylĂ€indeksi w"] # 0x2b7 (en: 'modifier small w', google translation) + - "Êž": [T: "ylĂ€indeksi y"] # 0x2b8 (en: 'modifier small y', google translation) + - "Êč": [T: "priimi"] # 0x2b9 (en: 'modifier prime', google translation) # FI: derivated once -> "pilkku" + - "Êș": [T: "kaksoispriimi"] # 0x2ba (en: 'modifier double prime', google translation) # FI: derivated twice -> "pilkku pilkku" + - "Ê»": [T: "kÀÀnteispilkku"] # 0x2bb (en: 'modifier turned comma', google translation) + - "ÊŒ": [T: "heitto"] # 0x2bc (en: 'modifier apostrophe', google translation) + - "Êœ": [T: "peilikuvapilkku"] # 0x2bd (en: 'modifier reversed comma', google translation) + - "ÊŸ": [T: "tarke oikea puolikaari"] # 0x2be (en: 'modifier right half ring', google: 'muokkain oikea puolirengas') + - "Êż": [T: "tarke vasen puolikaari"] # 0x2bf (en: 'modifier left half ring', google: 'muokkain vasemmalla puolirengas') + - "ˀ": [T: "glottaaliklusiilitarke"] # 0x2c0 (en: 'modifier glottal stop', google translation) + - "ˁ": [T: "kÀÀnnetty glottaaliklusiilitarke"] # 0x2c1 (en: 'modifier reversed glottal stop', google translation) + - "˂": [T: "tarke vasen nuoli"] # 0x2c2 (en: 'modifier left arrowhead', google translation) + - "˃": [T: "tarke oikea nuoli"] # 0x2c3 (en: 'modifier right arrowhead', google translation) + - "˄": [T: "tarke nuoli ylös"] # 0x2c4 (en: 'modifier up arrowhead', google translation) + - "˅": [T: "tarke nuoli alas"] # 0x2c5 (en: 'modifier down arrowhead', google translation) + - "ˆ": [T: "sirkumfleksi"] # 0x2c6 (en: 'modifier circumflex accent', google: 'modifikaattorin ympĂ€ryssuoja aksentti') # FI: should maybe be "hat", "hattu" + - "ˇ": [T: "ylösalainen sirkumfleksi"] # 0x2c7 (en: 'caron', google: 'caron') # FI: "inverted hat"? "kÀÀnnetty hattu" + - "ˈ": [T: "tarke pystyviiva"] # 0x2c8 (en: 'modifier vertical line', google translation) + - "ˉ": [T: "pituusmerkki"] # 0x2c9 (en: 'modifier macron', google: 'muokkain macron') + - "ˊ": [T: "tarke akuutti"] # 0x2ca (en: 'modifier acute accent', google translation) + - "ˋ": [T: "tarke gravis"] # 0x2cb (en: 'modifier grave accent', google translation) + - "ˌ": [T: "tarke alapystyviiva"] # 0x2cc (en: 'modifier low vertical line', google translation) + - "ˍ": [T: "alapituusmerkki"] # 0x2cd (en: 'modifier low macron', google translation) + - "ˎ": [T: "alagravis"] # 0x2ce (en: 'modifier low grave accent', google translation) + - "ˏ": [T: "ala-akuutti"] # 0x2cf (en: 'modifier low acute accent', google translation) + - "ː": [T: "kolmiokaksoispiste"] # 0x2d0 (en: 'modifier triangular colon', google translation) + - "ˑ": [T: "puolikas kolmiokaksoispiste"] # 0x2d1 (en: 'modifier half triangular colon', google translation) + - "˒": [T: "keskitetty oikea puolirengas"] # 0x2d2 (en: 'modifier centered right half ring', google translation) + - "˓": [T: "keskitetty vasen puolirengas"] # 0x2d3 (en: 'modifier centered left half ring', google translation) + - "˔": [T: "nupi ylöspĂ€in"] # 0x2d4 (en: 'modifier up tadck', google translation) + - "˕": [T: "nupi alaspĂ€in"] # 0x2d5 (en: 'modifier down tack', google translation) + - "˖": [T: "plus"] # 0x2d6 (en: 'modifier plus sign', google translation) + - "˗": [T: "miinus"] # 0x2d7 (en: 'modifier minus sign', google translation) + - "˘": [T: "lyhyysmerkki"] # 0x2d8 (en: 'breve', google: 'breve') + - "˙": [T: "piste"] # 0x2d9 (en: 'dot', google: 'piste') + - "˚": [T: "ylĂ€ympyrĂ€"] # 0x2da (en: 'ring above', google: 'rengas ylĂ€puolella') + - "˛": [T: "ogonek"] # 0x2db + - "˜": [T: "pieni tilde"] # 0x2dc (en: 'small tilde', google: 'pieni tilde') + - "˝": [T: "kaksoisakuutti"] # 0x2dd (en: 'double acute accent', google: 'kaksinkertainen akuutti aksentti') + - "˞": [T: "rhoottinen koukku"] # 0x2de (en: 'modifier rhotic hook', google translation) + - "˟": [T: "risti"] # 0x2df (en: 'modifier cross accent', google translation) + - "Ë ": [T: "pieni gamma"] # 0x2e0 (en: 'modifier small gamma', google translation) # FI: should these be without "pieni" ("small")? + - "ËĄ": [T: "pieni l"] # 0x2e1 (en: 'modifier small l', google translation) + - "Ëą": [T: "pieni s"] # 0x2e2 (en: 'modifier small s', google translation) + - "ËŁ": [T: "pieni x"] # 0x2e3 (en: 'modifier small x', google translation) + - "Ë€": [T: "pieni kÀÀnnetty glottaaliklusiili"] # 0x2e4 (en: 'modifier small reversed glottal stop', google translation) + - "Ë„": [T: "erittĂ€in korkea ÀÀnipalkki"] # 0x2e5 (en: 'modifier extra-high tone bar', google translation) + - "ËŠ": [T: "korkea ÀÀnipalkki"] # 0x2e6 (en: 'modifier high tone bar', google translation) + - "˧": [T: "keskiÀÀnipalkki"] # 0x2e7 (en: 'modifier mid tone bar', google translation) + - "Ëš": [T: "matala ÀÀnipalkki"] # 0x2e8 (en: 'modifier low tone bar', google translation) + - "Ë©": [T: "erittĂ€in matala ÀÀnipalkki"] # 0x2e9 (en: 'modifier extra-low tone bar', google translation) + - "ËȘ": [T: "yin lĂ€htöÀÀnimerkki"] # 0x2ea (en: 'modifier yin departing tone mark', google translation) # FI: unclear + - "Ë«": [T: "yang lĂ€htöÀÀnimerkki"] # 0x2eb (en: 'modifier yang departing tone mark', google translation) # FI: unclear + - "ËŹ": [T: "ÀÀntĂ€mismerkki"] # 0x2ec (en: 'modifier voicing', google translation) + - "Ë­": [T: "aspiroitumattomuusmerkki"] # 0x2ed (en: 'modifier unaspirated', google translation) + - "Ëź": [T: "kaksoisheittomerkki"] # 0x2ee (en: 'modifier double apostrophe', google translation) + - "ËŻ": [T: "alanuolenpÀÀ alas"] # 0x2ef (en: 'modifier low down arrowhead', google translation) + - "˰": [T: "alanuolenpÀÀ ylös"] # 0x2f0 (en: 'modifier low up arrowhead', google translation) + - "˱": [T: "alanuolenpÀÀ vasemmalle"] # 0x2f1 (en: 'modifier low left arrowhead', google translation) + - "ËČ": [T: "alanuolenpÀÀ oikealle"] # 0x2f2 (en: 'modifier low right arrowhead', google translation) + - "Ëł": [T: "alarengas"] # 0x2f3 (en: 'modifier low ring', google translation) + - "ËŽ": [T: "keskitetty gravis"] # 0x2f4 (en: 'modifier middle grave accent', google translation) + - "Ë”": [T: "keskitetty tuplagravis"] # 0x2f5 (en: 'modifier middle double grave accent', google translation) + - "˶": [T: "keskitetty akuutti"] # 0x2f6 (en: 'modifier middle double acute accent', google translation) + - "Ë·": [T: "alatilde"] # 0x2f7 (en: 'modifier low tilde', google translation) + - "Ëž": [T: "nostettu kaksoispiste"] # 0x2f8 (en: 'modifier raised colon', google translation) + - "Ëč": [T: "korkea ÀÀni alku"] # 0x2f9 (en: 'modifier begin high tone', google translation) + - "Ëș": [T: "korkea ÀÀni loppu"] # 0x2fa (en: 'modifier end high tone', google translation) + - "Ë»": [T: "matala ÀÀni alku"] # 0x2fb (en: 'modifier begin low tone', google translation) + - "ËŒ": [T: "matala ÀÀni loppu"] # 0x2fc (en: 'modifier end low tone', google translation) + - "Ëœ": [T: "tarke hylly"] # 0x2fd (en: 'modifier shelf', google translation) + - "ËŸ": [T: "tarke avoin hylly"] # 0x2fe (en: 'modifier open shelf', google translation) + - "Ëż": [T: "vasen alanuoli"] # 0x2ff (en: 'modifier low left arrow', google translation) + - "̈": [T: "treema"] # 0x308 (en: 'diaeresis embellishment', google: 'diaeresis -koriste') + - "̉": [T: "ylĂ€koukku"] # 0x309 (en: 'hook above embellishment', google translation) + - "̊": [T: "ylĂ€ympyrĂ€"] # 0x30a (en: 'ring above embellishment', google: 'rengas koristelun ylĂ€puolella') + - "̋": [T: "kakoisakuutti"] # 0x30b (en: 'double acute accent embellishment', google translation) + - "̌": [T: "hattu"] # 0x30c (en: 'check', google: 'tarkistaa') + - "̍": [T: "ylĂ€puolinen pystyviiva"] # 0x30d (en: 'vertical line above embellishment', google translation) + - "̎": [T: "ylĂ€puolinen kaksoispystyviiva"] # 0x30e (en: 'double vertical line above embellishment', google translation) + - "̏": [T: "kakoisgravis"] # 0x30f (en: 'double grave accent embellishment', google translation) + - "̐": [T: "candrabindu"] # 0x310 (en: 'candrabindu embellishment', google translation) + - "̑": [T: "ylösalainen lyhyysmerkki"] # 0x311 (en: 'inverted breve embellishment', google: 'kÀÀnteinen breve -koriste') + - "̒": [T: "ylĂ€puolinen ylösalainen pilkku"] # 0x312 (en: 'turned comma above embellishment', google translation) + - "̓": [T: "ylĂ€oikealla oleva pilkku"] # 0x313 (en: 'comma above embellishment', google translation) + - "̔": [T: "ylĂ€puolinen peilikuvapilkku"] # 0x314 (en: 'reversed comma above embellishment', google translation) + - "̕": [T: "ylĂ€pilkku"] # 0x315 (en: 'comma above right embellishment', google translation) + - "̖": [T: "alapuolinen gravis"] # 0x316 (en: 'grave accent below embellishment', google translation) + - "̗": [T: "alapuolinen akuutti"] # 0x317 (en: 'acute accent below embellishment', google translation) + - "̘": [T: "alapuolinen vasemmalle osoittava nupi"] # 0x318 (en: 'left tack below embellishment', google translation) + - "̙": [T: "alapuolinen oikealle osoittava nupi"] # 0x319 (en: 'right tack below embellishment', google translation) + - "̚": [T: "ylĂ€puolinen vasen kulma"] # 0x31a (en: 'left angle above embellishment', google translation) + - "̛": [T: "sarvi"] # 0x31b (en: 'horn embellishment', google translation) + - "̜": [T: "alapuolinen vasen ympyrĂ€nkaari"] # 0x31c (en: 'left half ring below embellishment', google translation) + - "̝": [T: "alapuolinen ylös osoittava nupi"] # 0x31d (en: 'up tack below embellishment', google translation) + - "̞": [T: "alapuolinen alas osoittava nupi"] # 0x31e (en: 'down tack below embellishment', google translation) + - "̟": [T: "alapuolinen plusmerkki"] # 0x31f (en: 'plus sign below embellishment', google translation) + - "Ì ": [T: "alapuolinen miinusmerkki"] # 0x320 (en: 'minus sign below embellishment', google translation) + - "ÌĄ": [T: "alapuolinen palataalisuuskoukku"] # 0x321 (en: 'palatalized hook below embellishment', google translation) + - "Ìą": [T: "alapuolinen retrofleksisuuskoukku"] # 0x322 (en: 'retroflex hook below embellishment', google translation) + - "ÌŁ": [T: "alapiste"] # 0x323 (en: 'dot below embellishment', google: 'piste koristelun alapuolella') + - "Ì€": [T: "alatreema"] # 0x324 (en: 'diaeresis below embellishment', google: 'diaeresis koristelun alapuolella') + - "Ì„": [T: "alaympyrĂ€"] # 0x325 (en: 'ring below embellishment', google translation) + - "ÌŠ": [T: "alapilkku"] # 0x326 (en: 'comma below embellishment', google translation) + - "̧": [T: "sedilji"] # 0x327 (en: 'cedilla embellishment', google: 'cedilla -koriste') + - "Ìš": [T: "ogonek"] # 0x328 (en: 'ogonek embellishment', google translation) + - "Ì©": [T: "alapuolinen pystyviiva"] # 0x329 (en: 'vertical line below embellishment', google translation) + - "ÌȘ": [T: "alapuolinen silta"] # 0x32a (en: 'bridge below embellishment', google translation) + - "Ì«": [T: "alapuolinen ylösalainen kaksoiskaari"] # 0x32b (en: 'inverted double arch below embellishment', google translation) + - "ÌŹ": [T: "alapuolinen hattu"] # 0x32c (en: 'caron below embellishment', google translation) + - "Ì­": [T: "alapuolinen sirkumfleksi"] # 0x32d (en: 'circumflex accent below embellishment', google translation) + - "Ìź": [T: "alapuolinen lyhyysmerkki"] # 0x32e (en: 'breve below embellishment', google: 'breve koristelun alapuolella') + - "ÌŻ": [T: "alapuolinen ylösalainen lyhyysmerkki"] # 0x32f (en: 'inverted breve below embellishment', google translation) + - "̰": [T: "alatilde"] # 0x330 (en: 'tilde below embellishment', google: 'tilde koristelun alapuolella') + - "̱": [T: "alapuolinen pituusmerkki"] # 0x331 (en: 'macron below embellishment', google: 'macron koristelun alapuolella') + - "ÌČ": [T: "alaviiva"] # 0x332 (en: 'low line embellishment', google: 'matala linjakoriste') + - "Ìł": [T: "kaksoisalaviiva"] # 0x333 (en: 'double low line embellishment', google translation) + - "ÌŽ": [T: "tilde pÀÀllĂ€"] # 0x334 (en: 'tilde overlay embellishment', google translation) + - "Ì”": [T: "lyhyt yliviivaus"] # 0x335 (en: 'short stroke overlay embellishment', google translation) + - "̶": [T: "pitkĂ€ yliviivaus"] # 0x336 (en: 'long stroke overlay embellishment', google translation) + - "Ì·": [T: "lyhyt yliviivausvinoviiva"] # 0x337 (en: 'short solidus overlay embellishment', google translation) + - "Ìž": [T: "yliviivausvinoviiva"] # 0x338 (en: 'long solidus overlay embellishment', google: 'pitkĂ€ solidus -pÀÀllekkĂ€isyys') + - "Ìč": [T: "oikea puolirengas alapuolella"] # 0x339 (en: 'right half ring below embellishment', google translation) + - "Ìș": [T: "kÀÀnteinen silta alapuolella"] # 0x33a (en: 'inverted bridge below embellishment', google translation) + - "Ì»": [T: "neliö alapuolella"] # 0x33b (en: 'square below embellishment', google translation) + - "ÌŒ": [T: "lokki alapuolella"] # 0x33c (en: 'seagull below embellishment', google translation) + - "Ìœ": [T: "x ylĂ€puolella"] # 0x33d (en: 'x above embellishment', google translation) + - "ÌŸ": [T: "pystysuora tilde"] # 0x33e (en: 'vertical tilde embellishment', google translation) + - "Ìż": [T: "kaksinkertainen yliviivaus"] # 0x33f (en: 'double overline embellishment', google translation) + - "̀": [T: "gravis"] # 0x340 (en: 'grave tone mark embellishment', google translation) + - "́": [T: "akuutti"] # 0x341 (en: 'acute tone mark embellishment', google translation) + + - "ÎȘΫϏ": # 0x3aa, 0x3ab, 0x3cf + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "iso"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [SPELL: "translate('.', 'ÎȘΫϏ', 'Îčυϗ')"] + - T: "dialyytikalla" # (en: 'with dialytika', google translation) + - "ϊ": [T: "treema-ioota"] # 0x3ca (en: 'iota with dialytika', google translation) + - "ϋ": [T: "treema-ypsilon"] # 0x3cb (en: 'upsilon with dialytika', google translation) + - "ό": [T: "akuutti-omikron"] # 0x3cc (en: 'omicron with tonos', google translation) + - "ύ": [T: "akuutti-ypsilon"] # 0x3cd (en: 'upsilon with tonos', google translation) + - "ώ": [T: "akuutti-oomega"] # 0x3ce (en: 'omega with tonos', google translation) + - "ϐ": [T: "beeta"] # 0x3d0 (en: 'beta', google: 'beeta') + - "ϑ": [T: "theeta"] # 0x3d1 (en: 'theta', google: 'theta') + - "ϒ": [T: "ypsilon koukulla"] # 0x3d2 (en: 'upsilon with hook', google: 'upsilon koukkuun') + - "ϓ": [T: "upsilon akuutilla ja koukulla"] # 0x3d3 (en: 'upsilon with acute and hook', google translation) + - "ϔ": [T: "upsilon treemalla ja koukulla"] # 0x3d4 (en: 'upsilon with diaeresis and hook', google translation) + - "ϗ": [T: "kai"] # 0x3d7 (en: 'kai', google: 'kai') + - "А-ĐŻ": # 0x410 - 0x42f + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "iso"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [SPELL: "translate('.', 'ĐĐ‘Đ’Đ“Đ”Đ•Đ–Đ—Đ˜Đ™ĐšĐ›ĐœĐĐžĐŸĐ ĐĄĐąĐŁĐ€Đ„ĐŠĐ§ĐšĐ©ĐȘЫЏЭПЯ', 'абĐČгЎДжзОĐčĐșĐ»ĐŒĐœĐŸĐżŃ€ŃŃ‚ŃƒŃ„Ń…Ń†Ń‡ŃˆŃ‰ŃŠŃ‹ŃŒŃŃŽŃ')"] + - "а": [T: "a"] # 0x430 (google: 'а') + - "б": [T: "bee"] # 0x431 (google: 'olla') + - "ĐČ": [T: "vee"] # 0x432 + - "Đł": [T: "gee"] # 0x433 + - "ĐŽ": [T: "dee"] # 0x434 + - "Đ”": [T: "jee"] # 0x435 (google: 'eli') + - "ж": [T: "tzee"] # 0x436 + - "Đ·": [T: "zee"] # 0x437 + - "Đž": [T: "i"] # 0x438 (google: 'Đž') + - "Đč": [T: "lyhyt i"] # 0x439 (en: 'short i') + - "Đș": [T: "kaa"] # 0x43a + - "Đ»": [T: "el"] # 0x43b + - "ĐŒ": [T: "em"] # 0x43c + - "Đœ": [T: "en"] # 0x43d (google: 'fi') + - "ĐŸ": [T: "o"] # 0x43e (google: 'ĐŸ') + - "Đż": [T: "pee"] # 0x43f + - "р": [T: "er"] # 0x440 + - "с": [T: "es"] # 0x441 + - "т": [T: "tee"] # 0x442 + - "у": [T: "u"] # 0x443 (google: 'у') + - "ф": [T: "ef"] # 0x444 + - "х": [T: "haa"] # 0x445 + - "ц": [T: "tsee"] # 0x446 + - "ч": [T: "tshee"] # 0x447 + - "ш": [T: "shaa"] # 0x448 + - "щ": [T: "shtshaa"] # 0x449 + - "ъ": [T: "kova merkki"] # 0x44a (en: 'hard sign') + - "ы": [T: "jeru"] # 0x44b + - "ь": [T: "pehmeĂ€ merkki"] # 0x44c (en: 'soft sign') + - "э": [T: "kÀÀnteis-e"] # 0x44d (google: 'э') + - "ю": [T: "juu"] # 0x44e + - "я": [T: "jaa"] # 0x44f + - "‐": [T: "tavuviiva"] # 0x2010 (en: 'hyphen', google: 'tavuviiva') + - "‑": [T: "tavuviiva"] # 0x2011 (en: 'hyphen', google translation) + - "‒": [T: "numerotavuviiva"] # 0x2012 (en: 'figure dash', google translation) + - "–": [T: "lyhyt ajatusviiva"] # 0x2013 (en: 'en dash', google: 'fi dash') + - "—": [T: "pitkĂ€ ajatusviiva"] # 0x2014 (en: 'em dash', google: 'em dash') + - "‖": [T: "kaksinkertainen pystyviiva"] # 0x2016 (en: 'double vertical line', google: 'kaksinkertainen pystysuora viiva') + - "†": [T: "risti"] # 0x2020 (en: 'dagger', google: 'tikari') + - "‡": [T: "kaksoisristi"] # 0x2021 (en: 'double dagger', google: 'kaksinkertainen tikari') + + - "‱": # 0x2022 + - test: + if: "@data-chem-formula-op" + then: [T: "piste"] # (en: 'dot', google translation) + else: [T: "luetelmapallo"] # (en: 'bullet', google: 'luoti') + + - "‰": [T: "promille"] # 0x2030 (en: 'per mille', google: 'per milli') + - "‱": [T: "kymmenestuhannesosa"] # 0x2031 (en: 'per ten thousand', google: 'kymmenentuhatta') + - "—": [T: "kÀÀnteinen priimi"] # 0x2035 (en: 'reversed prime', google: 'kÀÀntynyt pÀÀministeri') # FI: "kÀÀnteinen pilkku" and for the next ones + - "‶": [T: "kÀÀnteinen kaskoispriimi"] # 0x2036 (en: 'reversed double prime', google: 'kÀÀntynyt kaksinkertainen prime') + - "‷": [T: "kÀÀnteinen kolmoispriimi"] # 0x2037 (en: 'reversed triple prime', google translation) + - "‾": [T: "lisĂ€ys"] # 0x2038 + - "â€č": [T: "vasemmalle osoittava kulmapuolilainaus"] # 0x2039 (en: 'single left pointing angle quote mark', google: 'yksi vasen piste -kulman lainausmerkki') + - "â€ș": [T: "oikealle osoittava kulmapuolilainaus"] # 0x203a (en: 'single right pointing angle quote mark', google: 'yksi oikea osoituskulma lainausmerkki') + - "‌": [T: "kaksoiskertoma"] # 0x203c (en: 'double factorial', google translation) + - "⁄": [T: "murtoluvun vinoviiva"] # 0x2044 (en: 'divided by', google: 'jaettuna') # FI: check how this works in a sentence + - "⁅": [T: "piikillinen alkuhakasulku"] # 0x2045 (en: 'left square bracket with quill', google translation) + - "⁆": [T: "piikillinen loppuhakasulku"] # 0x2046 (en: 'right square bracket with quill', google translation) + - "⁗": [T: "neloispriimi"] # 0x2057 (en: 'quadruple prime', google: 'neljĂ€nneksen prime') # FI: maybe "pilkku pilkku pilkku pilkku" + - "⁠": [T: "rivinvaihdon esto"] # 0x2060 + - "⁰": [T: "potenssiin nolla"] # 0x2070 (en: 'to the zeroth power', google translation) + - "ⁱ": [T: "potenssiin i"] # 0x2071 (en: 'to the eihth power', google translation) + - "⁎": [T: "potenssiin neljĂ€"] # 0x2074 (en: 'to the fourth power', google translation) + - "⁔": [T: "potenssiin viisi"] # 0x2075 (en: 'to the fifth power', google translation) + - "⁶": [T: "potenssiin kuusi"] # 0x2076 (en: 'to the sixth power', google translation) + - "⁷": [T: "potenssiin seitsemĂ€n"] # 0x2077 (en: 'to the seventh power', google translation) + - "⁞": [T: "potenssiin kahdeksan"] # 0x2078 (en: 'to the eighth power', google translation) + - "âč": [T: "potenssiin yhdeksĂ€n"] # 0x2079 (en: 'to the ninth power', google translation) + - "âș": [T: "ylĂ€indeksi plus"] # 0x207a (en: 'superscript plus sign', google translation) + - "⁻": [T: "ylĂ€indeksi miinus"] # 0x207b (en: 'superscript minus', google translation) + - "⁌": [T: "ylĂ€indeksi on yhtĂ€ suuri kuin"] # 0x207c (en: 'superscript equals sign', google translation) + - "⁜": [T: "ylĂ€indeksi vasen sulku"] # 0x207d (en: 'superscript left parenthesis', google translation) + - " ": [T: "ylĂ€indeksi oikea sulku"] # 0x207e (en: 'superscript right parenthesis', google translation) + - "ⁿ": [T: "potenssiin n"] # 0x207f (en: 'to the ennth power', google translation) + - "₀": [T: "alaindeksi nolla"] # 0x2080 (en: 'sub zero', google translation) + - "₁": [T: "alaindeksi yksi"] # 0x2081 (en: 'sub one', google translation) + - "₂": [T: "alaindeksi kaksi"] # 0x2082 (en: 'sub two', google translation) + - "₃": [T: "alaindeksi kolme"] # 0x2083 (en: 'sub three', google translation) + - "₄": [T: "alaindeksi neljĂ€"] # 0x2084 (en: 'sub four', google translation) + - "₅": [T: "alaindeksi viisi"] # 0x2085 (google translation) + - "₆": [T: "alaindeksi kuusi"] # 0x2086 (google translation) + - "₇": [T: "alaindeksi seitsemĂ€n"] # 0x2087 (en: 'sub seven', google translation) + - "₈": [T: "alaindeksi kahdeksan"] # 0x2088 (en: 'sub eight', google translation) + - "₉": [T: "alaindeksi yhdeksĂ€n"] # 0x2089 (en: 'sub nine', google translation) + - "₊": [T: "alaindeksi plus"] # 0x208a (en: 'subscript plus sign', google translation) + - "₋": [T: "alaindeksi miinus"] # 0x208b (en: 'subscript minus sign', google translation) + - "₌": [T: "alaindeksi on yhtĂ€ suuri kuin"] # 0x208c (en: 'subscript equals sign', google translation) + - "₍": [T: "alaindeksi vasen sulku"] # 0x208d (en: 'subscript left parenthesis', google translation) + - "₎": [T: "alaindeksi oikea sulku"] # 0x208e (en: 'subscript right parenthesis', google translation) + - "ₐ": [T: "alaindeksi a"] # 0x2090 (en: 'sub A', google translation) + - "ₑ": [T: "alaindeksi e"] # 0x2091 (en: 'sub E', google translation) + - "ₒ": [T: "alaindeksi o"] # 0x2092 (en: 'sub O', google translation) + - "ₓ": [T: "alaindeksi x"] # 0x2093 (en: 'sub X', google translation) + - "ₕ": [T: "alaindeksi h"] # 0x2095 (en: 'sub H', google translation) + - "ₖ": [T: "alaindeksi k"] # 0x2096 (en: 'sub K', google translation) + - "ₗ": [T: "alaindeksi l"] # 0x2097 (en: 'sub L', google translation) + - "ₘ": [T: "alaindeksi m"] # 0x2098 (en: 'sub M', google translation) + - "ₙ": [T: "alaindeksi n"] # 0x2099 (en: 'sub N', google translation) + - "ₚ": [T: "alaindeksi p"] # 0x209a (en: 'sub P', google translation) + - "ₛ": [T: "alaindeksi s"] # 0x209b (en: 'sub S', google translation) + - "ₜ": [T: "alaindeksi t"] # 0x209c (en: 'sub T', google translation) + - "₠": [T: "eurooppalaiset valuuttayksiköt"] # 0x20a0 (en: 'european currenty units', google translation) + - "₡": [T: "colonia"] # 0x20a1 (en: 'colons', google: 'colons') + - "₱": [T: "cruzeiroa"] # 0x20a2 (en: 'cruzeiro', google: 'cruzeiro') + - "₣": [T: "frangia"] # 0x20a3 (en: 'franc', google: 'frangi') + - "â‚€": [T: "liiraa"] # 0x20a4 (en: 'lira', google: 'liira') + - "â‚„": [T: "milliĂ€"] # 0x20a5 (en: 'mills', google: 'myllyt') + - "₩": [T: "nairaa"] # 0x20a6 (en: 'naira', google: 'naira') + - "₧": [T: "pesetaa"] # 0x20a7 (en: 'peseta', google: 'peseta') + - "₹": [T: "rupiaa"] # 0x20a8 (en: 'rupees', google: 'rupia') + - "₩": [T: "wonia"] # 0x20a9 (en: 'won', google: 'voitti') + - "â‚Ș": [T: "sekeliĂ€"] # 0x20aa (en: 'new sheqels', google: 'uudet sheqels') + - "₫": [T: "dongia"] # 0x20ab (en: 'dong', google: 'dong') + - "€": [T: "euroa"] # 0x20ac (en: 'euros', google: 'eurot') + - "₭": [T: "kipia"] # 0x20ad (en: 'kip', google: 'kip') + - "₼": [T: "tugrikia"] # 0x20ae (en: 'tugrik', google: 'tugrik') + - "₯": [T: "drakhmaa"] # 0x20af (en: 'drachma', google: 'drachma') + - "₰": [T: "pfennigiĂ€"] # 0x20b0 (en: 'german pennies', google: 'saksalaiset penniĂ€') + - "₱": [T: "pesoa"] # 0x20b1 (en: 'pesos', google: 'pesot') + - "â‚Č": [T: "guarania"] # 0x20b2 (en: 'guaranis', google: 'guaranis') + - "₳": [T: "australia"] # 0x20b3 (en: 'australs', google: 'itĂ€valtait') + - "₮": [T: "hryvniaa"] # 0x20b4 (en: 'hryvnias', google: 'hryvnias') + - "â‚”": [T: "cediĂ€"] # 0x20b5 (en: 'cedis', google: 'cedis') + - "₶": [T: "Toursin livreĂ€"] # 0x20b6 (google translation) + - "₷": [T: "spesmiloa"] # 0x20b7 (google translation) + - "₾": [T: "tengeĂ€"] # 0x20b8 (google translation) + - "â‚č": [T: "intialainen rupiaa"] # 0x20b9 (en: 'indian rupees', google translation) + - "â‚ș": [T: "turkin liiraa"] # 0x20ba (en: 'turkish liras', google translation) + - "⃐": [T: "vasemmalle suuntautuva harppuuna"] # 0x20d0 (en: 'left harpoon above embellishment', google: 'vasen harppuon koristelun ylĂ€puolella') + - "⃑": [T: "oikealle suuntautuva harppuuna"] # 0x20d1 (en: 'right harpoon above embellishment', google: 'oikea harppuuna koristelun ylĂ€puolella') + - "⃒": [T: "pitkĂ€ yliviivauspystyviiva"] # 0x20d2 (en: 'long vertical line overlay embellishment', google translation) + - "⃓": [T: "lyhyt yliviivauspystyviiva"] # 0x20d3 (en: 'short vertical line overlay embellishment', google translation) + - "⃔": [T: "vastapĂ€ivĂ€inen ylĂ€nuoli"] # 0x20d4 (en: 'anticlockwise arrow above embellishment', google translation) + - "⃕": [T: "myötĂ€pĂ€ivĂ€inen ylĂ€nuoli"] # 0x20d5 (en: 'clockwise arrow above embellishment', google translation) + - "⃖": [T: "vasemmalle suuntautuva nuoli"] # 0x20d6 (en: 'left arrow above embellishment', google: 'vasen nuoli koristelun ylĂ€puolella') + - "⃗": [T: "oikealle suuntautuva nuoli"] # 0x20d7 (en: 'right arrow above embellishment', google: 'oikea nuoli koristelun ylĂ€puolella') + - "⃘": [T: "rengas pÀÀllĂ€"] # 0x20d8 (en: 'ring overlay embellishment', google translation) + - "⃙": [T: "rengas myötĂ€pĂ€ivÀÀn pÀÀllĂ€"] # 0x20d9 (en: 'clockwise ring overlay embellishment', google translation) + - "⃚": [T: "rengas vastapĂ€ivÀÀn pÀÀllĂ€"] # 0x20da (en: 'anticlockwise ring overlay embellishment', google translation) + - "⃛": [T: "kolmoispiste"] # 0x20db (en: 'triple dot', google: 'kolminkertainen piste') + - "⃜": [T: "nelinkertainen piste"] # 0x20dc (en: 'quadruple dot', google: 'nelinkertainen piste') + - "⃝": [T: "sulkeva ympyrĂ€"] # 0x20dd (en: 'enclosing circle embellishment', google translation) + - "⃞": [T: "sulkeva neliö"] # 0x20de (en: 'enclosing square embellishment', google translation) + - "⃟": [T: "sulkeva timantti"] # 0x20df (en: 'enclosing diamond embellishment', google translation) + - "⃠": [T: "sulkeva ympyrĂ€ kenoviivalla"] # 0x20e0 (en: 'enclosing circle backslash embellishment', google translation) + - "⃥": [T: "ylĂ€nuoli oikealle ja vasemmalle"] # 0x20e1 (en: 'left right arrow above embellishment', google: 'vasen oikea nuoli koristelun ylĂ€puolella') + - "⃹": [T: "sulkeva ruutu"] # 0x20e2 (en: 'enclosing screen embellishment', google translation) + - "⃣": [T: "sulkeva nĂ€ppĂ€in"] # 0x20e3 (en: 'enclosing keycap embellishment', google translation) + - "⃀": [T: "sulkeva kolmio ylöspĂ€in"] # 0x20e4 (en: 'enclosing upward pointing triangle embellishment', google translation) + - "⃄": [T: "kenoviiva pÀÀllĂ€"] # 0x20e5 (en: 'reverse solidus overlay embellishment', google translation) + - "⃊": [T: "kaksinkertainen vaakaviiva pÀÀllĂ€"] # 0x20e6 (en: 'double verticle stroke embellishment', google translation) + - "⃧": [T: "annuiteettisymboli"] # 0x20e7 (en: 'annuity symbol embellishment', google translation) + - "⃚": [T: "kolminkertainen alapiste"] # 0x20e8 (en: 'triple underdot', google translation) + - "⃩": [T: "leveĂ€ silta ylĂ€puolella"] # 0x20e9 (en: 'wide bridge above embellishment', google translation) + - "âƒȘ": [T: "vasen nuoli pÀÀllĂ€"] # 0x20ea (en: 'leftwards arrow overlay embellishment', google translation) + - "⃫": [T: "pitkĂ€ kaksinkertainen vinoviiva pÀÀllĂ€"] # 0x20eb (en: 'long double solidus overlay embellishment', google translation) + - "⃏": [T: "oikea alaharppuuna piikillĂ€"] # 0x20ec (en: 'rightwards harpoon with barb downwards embellishment', google translation) + - "⃭": [T: "vasen alaharppuuna piikillĂ€"] # 0x20ed (en: 'leftwards harpoon with barb downwards embellishment', google translation) + - "⃟": [T: "vasen alanuoli"] # 0x20ee (en: 'left arrow below embellishment', google translation) + - "⃯": [T: "oikea alanuoli"] # 0x20ef (en: 'right arrow below embellishment', google translation) + - "⃰": [T: "ylĂ€puolinen asteriski"] # 0x20f0 (en: 'asterisk above embellishment', google translation) + - "℄": [T: "keskiviivasymboli"] # 0x2104 (en: 'center line symbol', google translation) + - "℅": [T: "C O"] # 0x2105 (google: 'hoito') + - "℆": [T: "C U"] # 0x2106 (google translation) + - "ℇ": [T: "eulerin vakio"] # 0x2107 (en: 'euler's constant', google: 'eulerin jatkuva') # FI: more German pronunciation? + - "℈": [T: "scruple"] # 0x2108 (en: 'scruples', google translation) + - "℉": [T: "astetta fahrenheitia"] # 0x2109 (en: 'degrees fahrenheit', google: 'fahrenheit-astetta') # FI: more German pronunciation? + - "ℊ": [T: "pieni g"] # 0x210a (en: 'script g', google: 'kĂ€sikirjoitus g') + - "ℌℑℹℭ": # 0x210c, 0x2111, 0x2128, 0x212d + - T: "fraktuura" # (en: 'fraktur', google: 'fraktur') + - SPELL: "translate('.', 'ℌℑℹℭ', 'HIZC')" + + - "â„â„™â„Ÿâ„ż": # 0x210d, 0x2119, 0x213e, 0x213f + - test: + if: "$Verbosity!='Terse'" + then: [T: "kaksiviivainen"] # (en: 'double struck', google translation) + - SPELL: "translate('.', 'â„â„™â„Ÿâ„ż', 'HPΓΠ')" + + - "ℎ": [T: "planckin vakio"] # 0x210e (en: 'planck constant', google: 'planck constant') + - "ℏ": # 0x210f + - test: + if: "($Verbosity='Terse')" + then: [T: "h viiva"] # (google translation) + else: [T: "redusoitu Planckin vakio"] # (en: 'reduced planck constant', google: 'vĂ€hentynyt planck -vakio') + + - "â„â„’â„˜â„Źâ„°â„±â„ł": # 0x2110, 0x2112, 0x2118, 0x2130, 0x2131, 0x2133 + - T: "kauno" # (en: 'script', google: 'kĂ€sikirjoitus') + - SPELL: "translate('.', 'â„â„’â„˜â„Źâ„°â„±â„ł', 'ILPBEFM')" + + - "℔": [T: "paunaa"] # 0x2114 (en: 'pounds', google translation) + - "№": [T: "numero"] # 0x2116 (en: 'number', google: 'mÀÀrĂ€') + - "â„„": [T: "unssia"] # 0x2125 (en: 'ounces', google: 'unssi') + - "℩": [T: "ohmia"] # 0x2126 (en: 'ohms', google: 'ohmit') + - "℧": [T: "kÀÀnnetty ohmi"] # 0x2127 (en: 'mhos', google: 'mhos') + - "℩": [T: "kÀÀnnetty ioota"] # 0x2129 (en: 'turned iota', google: 'kÀÀntyi iota') + - "Å": [T: "Ă„ngströmiĂ€"] # 0x212b (en: 'angstroms', google: 'angstroms') + - "ℯ": [T: "kauno e"] # 0x212f (en: 'script e', google: 'kĂ€sikirjoitus e') + + # coalesced some chars that use cap letters + - "â„Čâ„ș⅁⅂⅃⅄": # 0x2132, 0x213a, 0x2141, 0x2142, 0x2143, 0x2144 + - test: + - if: "'.' = 'â„ș'" + then: [T: "kierretty"] # (en: 'rotated', google translation) + - else_if: "'.' = 'â„Č'" + then: [T: "kÀÀnnetty"] # (en: 'turned', google translation) + - else_if: "'.' = '⅃'" + then: [T: "kÀÀntynyt sans-serif"] # (en: 'reversed sans-serif', google translation) + else: [T: "kÀÀnnetty sans-serif"] # (en: 'turned sans-serif', google: 'kÀÀntyi sans-serif') + - SPELL: "translate('.', 'â„Čâ„ș⅁⅂⅃⅄', 'FQGLLY')" + + - "℮": [T: "kauno o"] # 0x2134 (en: 'script o', google: 'kĂ€sikirjoitus o') + - "â„”": [T: "alef"] # 0x2135 (en: 'first transfinite cardinal', google: 'ensimmĂ€inen transfinite kardinaali') + - "ℶ": [T: "bet"] # 0x2136 (en: 'second transfinite cardinal', google: 'toinen transfinite kardinaali') + - "ℷ": [T: "gimel"] # 0x2137 (en: 'third transfinite cardinal', google: 'kolmas transfinite kardinaali') + - "ℾ": [T: "dalet"] # 0x2138 (en: 'fourth transfinite cardinal', google: 'neljĂ€s transfinite kardinaali') + - "ℌ": [T: "kaksoisviivainen pii"] # 0x213c (en: 'double struck pi', google translation) + - "ℜ": [T: "kaksoisviivainen gamma"] # 0x213d (en: 'double struck gamma', google translation) + - "⅀": [T: "kaksoisviivainen sigma"] # 0x2140 (en: 'double struck n-ary summation', google translation) + - "⅋": [T: "kÀÀnnetty et-merkki"] # 0x214b (en: 'turned ampersand', google translation) + - "⅌": [T: "per"] # 0x214c (google translation) + - "ⅎ": [T: "kÀÀnnetty F"] # 0x214e (en: 'turned F', google translation) + - "⅐": [T: "yksi seitsemĂ€sosa"] # 0x2150 (en: 'one seventh', google translation) + - "⅑": [T: "yksi yhdeksĂ€sosa"] # 0x2151 (en: 'one ninth', google translation) + - "⅒": [T: "yksi kymmenesosa"] # 0x2152 (en: 'one tenth', google translation) + - "⅓": [T: "yksi kolmasosa"] # 0x2153 (en: 'one third', google: 'kolmasosa') + - "⅔": [T: "kaksi kolmasosaa"] # 0x2154 (en: 'two thirds') + - "⅕": [T: "yksi viidesosa"] # 0x2155 (en: 'one fifth', google: 'viidesosa') + - "⅖": [T: "kaksi viidesosaa"] # 0x2156 (en: 'two fifths') + - "⅗": [T: "kolme viidesosaa"] # 0x2157 (en: 'three fifths') + - "⅘": [T: "neljĂ€ viidesosaa"] # 0x2158 (en: 'four fifths') + - "⅙": [T: "yksi kuudesosa"] # 0x2159 (en: 'one sixth', google: 'kuudesosa') + - "⅚": [T: "viisi kuudesosaa"] # 0x215a (en: 'five sixths') + - "⅛": [T: "yksi kahdeksasosa"] # 0x215b (en: 'one eighth', google: 'yksi ath') + - "⅜": [T: "kolme kahdeksasosaa"] # 0x215c (en: 'three eighths', google: 'kolme aths') + - "⅝": [T: "viisi kahdeksasosaa"] # 0x215d (en: 'five eighths', google: 'viisi aths') + - "⅞": [T: "seitsemĂ€n kahdeksasosaa"] # 0x215e (en: 'seven eighths', google: 'seitsemĂ€n aths') + - "⅟": [T: "yksi per"] # 0x215f (en: 'one over', google translation) + - "Ⅰ": [T: "I"] # 0x2160 (en: 'I', google translation) + - "Ⅱ": [T: "I I"] # 0x2161 (en: 'I I', google translation) + - "ⅱ": [T: "I I I"] # 0x2162 (en: 'I I I', google translation) + - "Ⅳ": [T: "I V"] # 0x2163 (en: 'I V', google translation) + - "â…€": [T: "V"] # 0x2164 (en: 'V', google translation) + - "â…„": [T: "V I"] # 0x2165 (en: 'V I', google translation) + - "Ⅹ": [T: "V I I"] # 0x2166 (en: 'V I I', google translation) + - "Ⅷ": [T: "V I I I"] # 0x2167 (en: 'V I I I', google translation) + - "ⅹ": [T: "I X"] # 0x2168 (en: 'I X', google translation) + - "Ⅹ": [T: "X"] # 0x2169 (en: 'X', google translation) + - "â…Ș": [T: "X I"] # 0x216a (en: 'X I', google translation) + - "Ⅻ": [T: "X I I"] # 0x216b (en: 'X I I', google translation) + - "Ⅼ": [T: "L"] # 0x216c (en: 'L', google translation) + - "Ⅽ": [T: "C"] # 0x216d (en: 'C', google translation) + - "ⅼ": [T: "D"] # 0x216e (en: 'D', google translation) + - "Ⅿ": [T: "M"] # 0x216f (en: 'M', google translation) + - "ⅰ": [T: "i"] # 0x2170 (en: 'I', google translation) + - "ⅱ": [T: "i i"] # 0x2171 (en: 'I I', google translation) + - "â…Č": [T: "i i i"] # 0x2172 (en: 'I I I', google translation) + - "ⅳ": [T: "i v"] # 0x2173 (en: 'I V', google translation) + - "Ⅾ": [T: "Ⅾ"] # 0x2174 (en: 'V', google translation) + - "â…”": [T: "v i"] # 0x2175 (en: 'V I', google translation) + - "ⅶ": [T: "v i i"] # 0x2176 (en: 'V I I', google translation) + - "ⅷ": [T: "v i i i"] # 0x2177 (en: 'V I I I', google translation) + - "ⅾ": [T: "i x"] # 0x2178 (en: 'I X', google translation) + - "â…č": [T: "â…č"] # 0x2179 (en: 'X', google translation) + - "â…ș": [T: "x i"] # 0x217a (en: 'X I', google translation) + - "ⅻ": [T: "x i i"] # 0x217b (en: 'X I I', google translation) + - "â…Œ": [T: "â…Œ"] # 0x217c (en: 'L', google translation) + - "â…œ": [T: "â…œ"] # 0x217d (en: 'C', google translation) + - "â…Ÿ": [T: "â…Ÿ"] # 0x217e (en: 'D', google translation) + - "ⅿ": [T: "ⅿ"] # 0x217f (en: 'M', google translation) + - "↉": [T: "nolla kolmasosaa"] # 0x2189 (en: 'zero thirds', google translation) + - "←": [T: "nuoli vasemmalle"] # 0x2190 (en: 'leftwards arrow', google: 'vasen nuoli') + - "↑": [T: "nuoli ylös"] # 0x2191 (en: 'upwards arrow', google: 'ylöspĂ€in nuoli') + - "↓": [T: "nuoli alas"] # 0x2193 (en: 'downwards arrow', google: 'alaspĂ€in nuoli') + - "↔": [T: "nuoli vasemmalle ja oikealle"] # 0x2194 (en: 'left right arrow', google: 'vasen oikea nuoli') + - "↕": [T: "nuoli ylös ja alas"] # 0x2195 (en: 'up down arrow', google: 'ylöspĂ€in nuoli') + - "↖": [T: "luoteeseen osoittava nuoli"] # 0x2196 (en: 'north west arrow', google: 'luoteis -nuoli') + - "↗": # 0x2197 + - test: + if: "ancestor::*[2][self::m:limit]" + then: [T: "lĂ€hestyy alhaalta"] # (en: 'approaches from below', google translation) + else: [T: "koilliseen osoittava nuoli"] # (en: 'north east arrow', google: 'koillis -nuoli') + + - "↘": # 0x2198 + - test: + if: "ancestor::*[2][self::m:limit]" + then: [T: "lĂ€hestyy ylhÀÀltĂ€"] # (en: 'approaches from above', google translation) + else: [T: "kaakkoon osoittava nuoli"] # (en: 'south east arrow', google: 'kaakkois -nuoli') + + - "↙": [T: "lounaaseen osoittava nuoli"] # 0x2199 (en: 'south west arrow', google: 'lounais -nuoli') + - "↚": [T: "nuoli vasemmalle poikkiviivalla"] # 0x219a (en: 'leftwards arrow with stroke', google: 'vasen nuoli aivohalvauksella') + - "↛": [T: "nuoli oikealle poikkiviivalla"] # 0x219b (en: 'rightwards arrow with stroke', google: 'oikealla nuolella aivohalvauksella') + - "↜": [T: "aaltonuoli vasemmalle"] # 0x219c (en: 'leftwards wave arrow', google: 'vasen aalto nuoli') + - "↝": [T: "aaltonuoli oikealle"] # 0x219d (en: 'rightwards wave arrow', google: 'oikealla aalto nuoli') + - "↞": [T: "kaksipĂ€inen nuoli vasemmalle"] # 0x219e (en: 'leftwards two headed arrow', google: 'vasen kaksi pÀÀtĂ€ nuoli') + - "↟": [T: "kaksipĂ€inen nuoli ylös"] # 0x219f (en: 'upwards two headed arrow', google: 'ylöspĂ€in kaksi pÀÀistĂ€ nuolta') + - "↠": [T: "kaksipĂ€inen nuoli oikealle"] # 0x21a0 (en: 'rightwards two headed arrow', google: 'oikealle kaksi pÀÀistĂ€ nuolta') + - "↡": [T: "kaksipĂ€inen nuoli alas"] # 0x21a1 (en: 'downwards two headed arrow', google: 'alaspĂ€in kaksi pÀÀtĂ€ nuolta') + - "↱": [T: "vasen nuoli pyrstöllĂ€"] # 0x21a2 (en: 'leftwards arrow with tail', google: 'vasen nuoli hĂ€nnĂ€n kanssa') + - "↣": [T: "oikea nuoli pyrstöllĂ€"] # 0x21a3 (en: 'rightwards arrow with tail', google: 'oikealla nuolella hĂ€nnĂ€n kanssa') + - "ↀ": [T: "vasen nuoli palkista"] # 0x21a4 (en: 'leftwards arrow from bar', google: 'vasen nuoli baarista') + - "ↄ": [T: "ylöspĂ€in osoittava nuoli palkista"] # 0x21a5 (en: 'upwards arrow from bar', google: 'nuoli ylöspĂ€in baarista') + - "↩": [T: "oikea nuoli palkista"] # 0x21a6 (en: 'rightwards arrow from bar', google: 'oikein nuoli baarista') + - "↧": [T: "alaspĂ€in osoittava nuoli palkista"] # 0x21a7 (en: 'downwards arrow from bar', google: 'alaspĂ€in nuoli baarista') + - "↹": [T: "ylös ja alas osoittava nuoli palkista"] # 0x21a8 (en: 'up down arrow with base', google: 'ylös nuoli pohjassa') + - "↩": [T: "vasen nuoli koukulla"] # 0x21a9 (en: 'leftwards arrow with hook', google: 'vasen nuoli koukussa') + - "â†Ș": [T: "oikea nuoli koukulla"] # 0x21aa (en: 'rightwards arrow with hook', google: 'oikealla nuolella koukkulla') + - "↫": [T: "vasen nuoli silmukalla"] # 0x21ab (en: 'leftwards arrow with loop', google: 'vasen nuoli silmukka') + - "↬": [T: "oikea nuoli silmukalla"] # 0x21ac (en: 'rightwards arrow with loop', google: 'oikea nuoli silmukka') + - "↭": [T: "aaltonuoli oikealle ja vasemmalle"] # 0x21ad (en: 'left right wave arrow', google: 'vasen oikea aalto nuoli') + - "↼": [T: "nuoli oikealle ja vasemmalle poikkiviivalla"] # 0x21ae (en: 'left right arrow with stroke', google: 'vasen oikea nuoli aivohalvauksella') + - "↯": [T: "siksaknuoli alas"] # 0x21af (en: 'downwards zigzag arrow', google: 'alaspĂ€in zigzag -nuoli') + - "↰": [T: "nuoli ylös ja kĂ€rki vasemmalle"] # 0x21b0 (en: 'upwards arrow with tip leftwards', google: 'ylöspĂ€in nuoli vasemmalla kĂ€rkillĂ€') + - "↱": [T: "nuoli ylös ja kĂ€rki oikealle"] # 0x21b1 (en: 'upwards arrow with tip rightwards', google: 'ylöspĂ€in nuoli, joka on kĂ€rki oikealla') + - "â†Č": [T: "nuoli alas ja kĂ€rki vasemmalle"] # 0x21b2 (en: 'downwards arrow with tip leftwards', google: 'alaspĂ€in nuoli vasemmalla kĂ€rkillĂ€') + - "↳": [T: "nuoli alas ja kĂ€rki oikealle"] # 0x21b3 (en: 'downwards arrow with tip rightwards', google: 'alaspĂ€in nuoli kĂ€rjen oikealla puolella') + - "↮": [T: "nuoli oikealle ja kulma alas"] # 0x21b4 (en: 'rightwards arrow with corner downwards', google: 'oikealla nuolella nurkkaan alaspĂ€in') + - "↔": [T: "nuoli alas ja kulma oikealle"] # 0x21b5 (en: 'downwards arrow with corner leftwards', google: 'alaspĂ€in nuoli vasemmalla kulmassa') + - "↶": [T: "ylĂ€puoliympyrĂ€nuoli vastapĂ€ivÀÀn"] # 0x21b6 (en: 'anticlockwise top semicircle arrow', google: 'vastapĂ€ivÀÀn puolipyöriin nuoli') + - "↷": [T: "ylĂ€puoliympyrĂ€nuoli myötĂ€pĂ€ivÀÀn"] # 0x21b7 (en: 'clockwise top semicircle arrow', google: 'myötĂ€pĂ€ivÀÀn puolipyöriin nuoli') + - "↾": [T: "nuoli ylĂ€vasemmalle pitkÀÀn viivaan"] # 0x21b8 (en: 'north west arrow to long bar', google: 'luoteis -nuoli pitkÀÀn baariin') + - "â†č": [T: "nuoli oikealle ja vasemmalle palkkiin"] # 0x21b9 (en: 'leftwards arrow to bar over rightwards arrow to bar', google: 'vasen nuoli baariin oikeanpuoleisen nuolen yli baariin') + - "â†ș": [T: "vastapĂ€ivĂ€inen avoimen ympyrĂ€n nuoli"] # 0x21ba (en: 'anticlockwise open circle arrow', google: 'vastapĂ€ivÀÀn avoin ympyrĂ€ nuoli') + - "↻": [T: "myötĂ€pĂ€ivĂ€inen avoimen ympyrĂ€n nuoli"] # 0x21bb (en: 'clockwise open circle arrow', google: 'myötĂ€pĂ€ivÀÀn avoin ympyrĂ€ nuoli') + - "↌": [T: "puolinuoli vasemmalle vĂ€kĂ€ ylös"] # 0x21bc (en: 'left harpoon up', google: 'vasen harppuon ylös') + - "↜": [T: "puolinuoli vasemmalle vĂ€kĂ€ alas"] # 0x21bd (en: 'left harpoon down', google: 'vasen harppuon alas') + - "↟": [T: "puolinuoli ylös vĂ€kĂ€ oikealle"] # 0x21be (en: 'up harpoon right', google: 'up harpoon oikeassa') + - "↿": [T: "puolinuoli ylös vĂ€kĂ€ vasemmalle"] # 0x21bf (en: 'up harpoon left', google: 'up harpoon vasemmalle') + - "⇀": [T: "puolinuoli oikealle vĂ€kĂ€ ylös"] # 0x21c0 (en: 'right harpoon up', google: 'oikea harppuun') + - "⇁": [T: "puolinuoli oikealle vĂ€kĂ€ alas"] # 0x21c1 (en: 'right harpoon down', google: 'oikea harppuuna alas') + - "⇂": [T: "puolinuoli alas vĂ€kĂ€ oikealle"] # 0x21c2 (en: 'down harpoon right', google: 'alas harppuon oikealla') + - "⇃": [T: "puolinuoli alas vĂ€kĂ€ vasemmalle"] # 0x21c3 (en: 'down harpoon left', google: 'alas harppuun vasemmalle') + - "⇄": [T: "oikealle ja vasemmalle osoittavien nuolien pari"] # 0x21c4 (en: 'rightwards arrow over leftwards arrow', google: 'oikealla nuolella vasemmanpuoleisen nuolen yli') + - "⇅": [T: "ylös ja alas osoittavien nuolien pari"] # 0x21c5 (en: 'upwards arrow leftwards of downwards arrow', google: 'ylöspĂ€in nuoli vasemmalle alaspĂ€in nuolesta') + - "⇆": [T: "vasemmalle ja oikealle osoittavien nuolien pari"] # 0x21c6 (en: 'leftwards arrow over rightwards arrow', google: 'vasen nuoli oikealla nuolella') + - "⇇": [T: "nuolipari vasemmalle"] # 0x21c7 (en: 'leftwards paired arrows', google: 'vasen parit nuolet') + - "⇈": [T: "nuolipari ylös"] # 0x21c8 (en: 'upwards paired arrows', google: 'ylöspĂ€in parilliset nuolet') + - "⇉": [T: "nuolipari oikealle"] # 0x21c9 (en: 'rightwards paired arrows', google: 'oikealla puolella nuolet') + - "⇊": [T: "nuolipari alas"] # 0x21ca (en: 'downwards paired arrows', google: 'alaspĂ€in parit nuolet') + - "⇋": [T: "puolinuolipari vasemmalle ja oikealle"] # 0x21cb (en: 'left harpoon over right harpoon', google: 'vasen harpoon oikean harppuunin yli') + - "⇌": [T: "puolinuolipari oikealle ja vasemmalle"] # 0x21cc (en: 'right harpoon over left harpoon', google: 'oikea harppuuna vasemman harppuunin yli') + - "⇍": [T: "kaksiviivainen nuoli vasemmalle poikkiviivalla"] # 0x21cd (en: 'leftwards double arrow with stroke', google: 'vasen kaksinkertainen nuoli aivohalvauksella') + - "⇎": [T: "kaksiviivainen nuoli vasemmalle ja oikealle poikkiviivalla"] # 0x21ce (en: 'left right double arrow with stroke', google: 'vasen oikea kaksinkertainen nuoli aivohalvauksella') + - "⇏": [T: "kaksiviivainen nuoli oikealle poikkiviivalla"] # 0x21cf (en: 'rightwards double arrow with stroke', google: 'oikeasti kaksinkertainen nuoli aivohalvauksella') + - "⇐": [T: "vasemmalle osoittava kaksoisnuoli"] # 0x21d0 (en: 'leftwards double arrow', google: 'vasen kaksinkertainen nuoli') + - "⇑": [T: "ylös osoittava kaksoisnuoli"] # 0x21d1 (en: 'upwards double arrow', google: 'ylöspĂ€in kaksoisnuoli') + - "⇓": [T: "alas osoittava kaksoisnuoli"] # 0x21d3 (en: 'downwards double arrow', google: 'alaspĂ€in kaksinkertainen nuoli') + - "⇔": [T: "vasemmalle ja oikealle osoittava kaksoisnuoli"] # 0x21d4 (en: 'left right double arrow', google: 'vasen oikea kaksinkertainen nuoli') + - "⇕": [T: "ylös ja alas osoittava kaksoisnuoli"] # 0x21d5 (en: 'up down double arrow', google: 'ylös alas kaksinkertainen nuoli') + - "⇖": [T: "luoteeseen osoittava kaksoisnuoli"] # 0x21d6 (en: 'north west double arrow', google: 'luoteisosan kaksinkertainen nuoli') + - "⇗": [T: "koilliseen osoittava kaksoisnuoli"] # 0x21d7 (en: 'north east double arrow', google: 'koillis -kaksinkertainen nuoli') + - "⇘": [T: "kaakkoon osoittava kaksoisnuoli"] # 0x21d8 (en: 'south east double arrow', google: 'kaakkois -kaksinkertainen nuoli') + - "⇙": [T: "luoteeseen osoittava kaksoisnuoli"] # 0x21d9 (en: 'south west double arrow', google: 'lounais -kaksinkertainen nuoli') + - "⇚": [T: "kolmiviivainen nuoli vasemmalle"] # 0x21da (en: 'leftwards triple arrow', google: 'vasen kolminkertainen nuoli') + - "⇛": [T: "kolmiviivainen nuoli oikealle"] # 0x21db (en: 'rightwards triple arrow', google: 'oikealle kolminkertainen nuoli') + - "⇜": [T: "kiemuranuoli vasemmalle"] # 0x21dc (en: 'leftwards squiggle arrow', google: 'vasen nuoli') + - "⇝": [T: "kiemuranuoli oikealle"] # 0x21dd (en: 'rightwards squiggle arrow', google: 'oikealla puolella nuoli') + - "⇞": [T: "nuoli ylös kaksoispoikkiviivalla"] # 0x21de (en: 'upwards arrow with double stroke', google: 'ylöspĂ€in nuoli kaksinkertaisella iskulla') + - "⇟": [T: "nuoli alas kaksoispoikkiviivalla"] # 0x21df (en: 'downwards arrow with double stroke', google: 'alaspĂ€in nuoli kaksinkertaisella iskulla') + - "⇠": [T: "katkoviivanuoli vasemmalle"] # 0x21e0 (en: 'leftwards dashed arrow', google: 'vasen katkoviiva nuoli') + - "⇡": [T: "katkoviivanuoli ylös"] # 0x21e1 (en: 'upwards dashed arrow', google: 'ylöspĂ€in katkoviiva nuoli') + - "⇱": [T: "katkoviivanuoli oikealle"] # 0x21e2 (en: 'rightwards dashed arrow', google: 'oikealla katkoviivalla nuolella') + - "⇣": [T: "katkoviivanuoli alas"] # 0x21e3 (en: 'downwards dashed arrow', google: 'alaspĂ€in katkoviiva nuoli') + - "⇀": [T: "nuoli vasemmalle viivaan"] # 0x21e4 (en: 'leftwards arrow to bar', google: 'vasen nuoli baariin') + - "⇄": [T: "nuoli oikealle viivaan"] # 0x21e5 (en: 'rightwards arrow to bar', google: 'oikein nuoli baariin') + - "⇩": [T: "vasemmalle osoittava valkea nuoli"] # 0x21e6 (en: 'leftwards white arrow', google: 'vasen valkoinen nuoli') + - "⇧": [T: "ylös osoittava valkea nuoli"] # 0x21e7 (en: 'upwards white arrow', google: 'ylöspĂ€in valkoinen nuoli') + - "⇹": [T: "oikealle osoittava valkea nuoli"] # 0x21e8 (en: 'rightwards white arrow', google: 'oikealle valkoinen nuoli') + - "⇩": [T: "alas osoittava valkea nuoli"] # 0x21e9 (en: 'downwards white arrow', google: 'alaspĂ€in valkoinen nuoli') + - "â‡Ș": [T: "palkista ylös osoittava valkea nuoli"] # 0x21ea (en: 'upwards white arrow from bar', google: 'ylöspĂ€in valkoinen nuoli baarista') + - "⇫": [T: "valkoinen nuoli ylös jalustalla"] # 0x21eb (en: 'upwards white arrow on pedestal', google translation) + - "⇬": [T: "valkoinen nuoli ylös jalustalla ja vaakasuoralla palkilla"] # 0x21ec (en: 'upwards white arrow on pedestal with horizontal bar', google translation) + - "⇭": [T: "valkoinen nuoli ylös jalustalla ja pystysuoralla palkilla"] # 0x21ed (en: 'upwards white arrow on pedestal with vertical bar', google translation) + - "⇼": [T: "valkoinen kaksinkertainen nuoli ylös"] # 0x21ee (en: 'upwards white double arrow', google translation) + - "⇯": [T: "valkoinen kaksinkertainen nuoli ylös jalustalla"] # 0x21ef (en: 'upwards white double arrow on pedestal', google translation) + - "⇰": [T: "valkoinen nuoli oikealle seinĂ€stĂ€"] # 0x21f0 (en: 'rightwards white arrow from wall', google translation) + - "⇱": [T: "ylĂ€vasemmalle osoittava nuoli nurkkaan"] # 0x21f1 (en: 'north west arrow to corner', google translation) + - "â‡Č": [T: "alaoikealle osoittava nuoli nurkkaan"] # 0x21f2 (en: 'south east arrow to corner', google translation) + - "⇳": [T: "ylös ja alas osoittava valkoinen nuoli"] # 0x21f3 (en: 'up down white arrow', google translation) + - "⇮": [T: "oikea nuoli pienellĂ€ ympyrĂ€llĂ€"] # 0x21f4 (en: 'right arrow with small circle', google translation) + - "⇔": [T: "alas ja ylös osoittavat nuolet"] # 0x21f5 (en: 'downwards arrow leftwards of upwards arrow', google: 'alaspĂ€in nuoli ylöspĂ€in ylöspĂ€in nuolesta') + - "⇶": [T: "kolmoisnuoli oikealle"] # 0x21f6 (en: 'three rightwards arrows', google translation) + - "⇷": [T: "vasen nuoli pystysuoralla viivalla"] # 0x21f7 (en: 'leftwards arrow with vertical stroke', google translation) + - "⇾": [T: "oikea nuoli pystysuoralla viivalla"] # 0x21f8 (en: 'rightwards arrow with vertical stroke', google translation) + - "â‡č": [T: "vasemmalle ja oikealle osoittava nuoli pystysuoralla viivalla"] # 0x21f9 (en: 'left right arrow with vertical stroke', google translation) + - "â‡ș": [T: "vasen nuoli kaksinkertaisella pystysuoralla viivalla"] # 0x21fa (en: 'leftwards arrow with double vertical stroke', google translation) + - "⇻": [T: "oikea nuoli kaksinkertaisella pystysuoralla viivalla"] # 0x21fb (en: 'rightwards arrow with double vertical stroke', google translation) + - "⇌": [T: "vasemmalle ja oikealle osoittava nuoli kaksinkertaisella pystysuoralla viivalla"] # 0x21fc (en: 'left right arrow with double vertical stroke', google translation) + - "⇜": [T: "vasen avoin nuoli"] # 0x21fd (en: 'leftwards open headed arrow', google: 'vasen auki pÀÀ nuoli') + - "⇟": [T: "oikea avoin nuoli"] # 0x21fe (en: 'rightwards open headed arrow', google: 'oikea avaa pÀÀn nutrow') + - "⇿": [T: "oikealle ja vasemmalle osoittava avoin nuoli"] # 0x21ff (en: 'left right open headed arrow', google: 'vasen oikeaa auki nuoli') + - "∁": # 0x2201 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (google translation) + - T: "komplementti" # (en: 'complement of', google: 'tĂ€ydennys') + - "∃": [T: "on olemassa"] # 0x2203 (en: 'there exists') + - "∄": [T: "ei ole olemassa"] # 0x2204 (en: 'there does not exist', google: 'ei ole') + - "∅": [T: "tyhjĂ€ joukko"] # 0x2205 (en: 'empty set', google: 'tyhjĂ€ sarja') + - "∇": # 0x2207 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (google translation) + - T: "nabla" # (en: 'gradient of', google: 'gradientti') + - "∋": [T: "sisĂ€ltÀÀ alkion"] # 0x220b (en: 'contains the member', google: 'sisĂ€ltÀÀ jĂ€senen') + - "∌": [T: "ei sisĂ€llĂ€ alkiota"] # 0x220c (en: 'does not contain the member', google: 'ei sisĂ€llĂ€ jĂ€sentĂ€') + - "∍": [T: "sisĂ€ltÀÀ pienen alkion"] # 0x220d (en: 'contains the member', google: 'sisĂ€ltÀÀ jĂ€senen') + - "∎": [T: "todistuksen loppu"] # 0x220e (en: 'end of proof', google: 'todistuksen loppu') + - "∏": [T: "tulo"] # 0x220f (en: 'product', google: 'tuote') + - "∐": [T: "kotulo"] # 0x2210 (google: 'kopiointi') + - "∑": [T: "summa"] # 0x2211 (en: 'sum') + - "−": [T: "miinus"] # 0x2212 (en: 'minus') + - "∓": [T: "miinus-plus"] # 0x2213 (en: 'minus or plus') # FI: check how the hyphen behaves + - "∔": [T: "piste-plus"] # 0x2214 (en: 'dot plus', google: 'dot plus') # FI: check how the hyphen behaves + - "∕": [T: "jakoviiva"] # 0x2215 (en: 'divided by', google: 'jaettuna') + - "∖": [T: "joukkomiinus"] # 0x2216 (en: 'set minus', google: 'aseta miinus') + - "∗": [T: "kertaa"] # 0x2217 (en: 'times', google: 'ajat') + - "∙": # 0x2219 + - test: + if: "@data-chem-formula-op" + then: [T: "piste"] # (en: 'dot', google translation) + else: [T: "kertaa"] # (en: 'times', google: 'ajat') + + - "∛": # 0x221b + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (google translation) + - T: "kuutiojuuri" # (en: 'cube root of') + - "∜": # 0x221c + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (google translation) + - T: "neljĂ€s juuri" # (en: 'fourth root of') + - "∞": [T: "ÀÀretön"] # 0x221e (en: 'infinity') + - "∟": [T: "suora kulma"] # 0x221f (en: 'right angle', google: 'oikea kulma') + - "∠": [T: "kulma"] # 0x2220 (en: 'angle') + - "∥": [T: "mitattu kulma"] # 0x2221 (en: 'measured angle') + - "∹": [T: "kaarellinen kulma"] # 0x2222 (en: 'spherical angle', google: 'pallomainen kulma') + - "∣": [T: "jakaa"] # 0x2223 (en: 'divides') + - "∀": [T: "ei jaa"] # 0x2224 (en: 'does not divide') + - "∩": [T: "leikkaus"] # 0x2229 (en: 'intersection', google: 'risteys') + - "∫": [T: "integraali"] # 0x222b (en: 'integral', google: 'olennainen') + - "∏": [T: "kaksoisintegraali"] # 0x222c (en: 'double integral', google: 'kaksinkertainen integraali') + - "∭": [T: "kolmoisintegraali"] # 0x222d (en: 'triple integral', google: 'kolminkertainen integraali') + - "∯": [T: "pintaintegraali"] # 0x222f (en: 'surface integral', google: 'pinta -integraali') + - "∰": [T: "tilavuusintegraali"] # 0x2230 (en: 'volume integral', google: 'volyymin integraali') + - "∱": [T: "integraali myötĂ€pĂ€ivÀÀn"] # 0x2231 (en: 'clockwise integral', google: 'myötĂ€pĂ€ivÀÀn olennainen') + - "âˆČ": [T: "polkuintegraali myötĂ€pĂ€ivÀÀn"] # 0x2232 (en: 'clockwise contour integral', google: 'myötĂ€pĂ€ivÀÀn ÀÀriviivat') + - "∳": [T: "polkuintegraali vastapĂ€ivÀÀn"] # 0x2233 (en: 'anticlockwise contour integral', google: 'vastapĂ€ivÀÀn ÀÀriviivat') + - "∎": [T: "siis"] # 0x2234 (en: 'therefore', google: 'siksi') + - "∔": [T: "koska"] # 0x2235 (en: 'because') + - "∞": [T: "piste-miinus"] # 0x2238 (en: 'dot minus') + - "âˆč": [T: "ylitys"] # 0x2239 (en: 'has excess compared to', google: 'on ylimÀÀrĂ€inen verrattuna') + - "âˆș": # 0x223a + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "geometrisesti verrannollinen" # (en: 'geometrically proportional to', google: 'geometrisesti verrannollinen') # FI: "geometrisesti verranollinen"? + - "∻": # 0x223b + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "homoteettinen" # (en: 'homothetic to', google: 'homotetiikka') + - "≀": [T: "punostulo"] # 0x2240 (en: 'wreath product', google: 'seppele tuote') + - "≁": [T: "ei tilde"] # 0x2241 (en: 'not tilde') + - "≂": [T: "miinus-tilde"] # 0x2242 (en: 'minus tilde') + - "≃": # 0x2243 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "asymptoottisesti yhtĂ€ suuri kuin" # (en: 'asymptotically equal to', google: 'asymptoottisesti yhtĂ€ suuri kuin') + - "≄": # 0x2244 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei asymptoottisesti yhtĂ€suuri kuin" # (en: 'not asymptotically equal to', google: 'ei asymptoottisesti yhtĂ€ suuri kuin') + - "≅": # 0x2245 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "likimÀÀrin yhtĂ€ suuri kuin" # (en: 'approximately equal to', google: 'suunnilleen yhtĂ€ suuri kuin') + - "≆": # 0x2246 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "likimÀÀrin mutta ei yhtĂ€ suuri kuin" # (en: 'approximately but not actually equal to', google: 'suunnilleen, mutta ei oikeastaan yhtĂ€ suuri kuin') + - "≇": # 0x2247 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei likimÀÀrin eikĂ€ yhtĂ€ suuri kuin" # (en: 'neither approximately nor actually equal to', google: 'ei suunnilleen eikĂ€ oikeastaan yhtĂ€ suuri kuin') + - "≈": # 0x2248 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "likimÀÀrin yhtĂ€ suuri kuin" # (en: 'almost equal to', google: 'melkein yhtĂ€ suuri kuin') + - "≉": # 0x2249 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei likimÀÀrin yhtĂ€ suuri kuin" # (en: 'not almost equal to', google: 'ei melkein yhtĂ€ suuri kuin') + - "≊": # 0x224a + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "lĂ€hes tai tasan yhtĂ€ suuri kuin" # (en: 'almost equal or equal to', google: 'melkein yhtĂ€ suuri tai yhtĂ€ suuri kuin') + - "≋": [T: "kolmoistilde"] # 0x224b (en: 'triple tilde', google: 'kolminkertainen tilde') + - "≌": [T: "kaikki yhtĂ€suuria kuin"] # 0x224c (en: 'are all equal to', google: 'ovat kaikki yhtĂ€ suuret kuin') + - "≍": # 0x224d + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "yhtĂ€pitĂ€vĂ€" # (en: 'equivalent to', google: 'vastaa') + - "≎": # 0x224e + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "geometrisesti yhtĂ€pitĂ€vĂ€" # (en: 'geometrically equivalent to', google: 'geometrisesti vastaavat') + - "≏": # 0x224f + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (google translation) + - T: "ero vĂ€lillĂ€" # (en: 'difference between', google: 'ero vĂ€lillĂ€') + - "≐": [T: "lĂ€hestyy raja-arvoa"] # 0x2250 (en: 'approaches the limit') + - "≑": # 0x2251 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "geometrisesti yhtĂ€ kuin" # (en: 'geometrically equal to', google: 'geometrisesti yhtĂ€ suuri kuin') + - "≒": # 0x2252 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "likimÀÀrin yhtĂ€ suuri kuin tai kohteen kuva" # (google: 'suunnilleen yhtĂ€ suuri tai kuva') + - "≓": # 0x2253 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is the', google translation) + - T: "kohteen kuva tai likimÀÀrin yhtĂ€ suuri kuin" # (google: 'kuva tai suunnilleen yhtĂ€ suuri kuin') + - "≔": [T: "kaksoispiste yhtĂ€ suuri kuin"] # 0x2254 (en: 'colon equals', google: 'colol -eaksi') + - "≕": [T: "yhtĂ€ suuri kuin kaksoispiste"] # 0x2255 (en: 'equals colon', google: 'vastaa kaksoispistettĂ€') + - "≖": [T: "ympyrĂ€n sisĂ€ltĂ€vĂ€ yhtĂ€lĂ€isyys"] # 0x2256 (en: 'ring in equal to', google: 'rengas yhtĂ€ suuri kuin') + - "≗": # 0x2257 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "ympyrĂ€ yhtĂ€ suuri kuin" # (en: 'approximately equal to', google: 'suunnilleen yhtĂ€ suuri kuin') + - "≘": [T: "kaari yhtĂ€ suuri kuin"] # 0x2258 (en: 'corresponds to', google: 'vastaa') + - "≙": [T: "vastaa"] # 0x2259 (en: 'estimates', google: 'arviot') + - "≚": # 0x225a + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "samakulmainen kuin" # (en: 'equiangular to', google: 'tasa -arvoinen') + - "≛": [T: "tĂ€hti yhtĂ€ suuri kuin"] # 0x225b (en: 'star equals', google: 'tĂ€hti on yhtĂ€ suuri kuin') + - "≜": [T: "delta yhtĂ€ suuri kuin"] # 0x225c (en: 'delta equals', google: 'delta on tasa -arvoinen') + - "≝": [T: "mÀÀritelmĂ€n mukaan yhtĂ€ kuin"] # 0x225d (en: 'is defined to be', google: 'on mÀÀritelty olevan') + - "≞": # 0x225e + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "mitatusti yhtĂ€ suuri kuin" # (en: 'measured by', google: 'mitattu') + - "≟": [T: "kyseenalaisesti yhtĂ€ kuin"] # 0x225f (en: 'has an unknown relationship with', google: 'on tuntematon suhde') + - "≱": # 0x2262 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "identtisesti eri kuin" # (en: 'not identical to', google: 'ei identtinen') + - "≣": # 0x2263 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "vahvasti ekvivalentti" # (en: 'strictly equivalent to', google: 'tiukasti vastaa') + - "≹": # 0x2268 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "pienempi mutta ei yhtĂ€ suuri kuin" # (en: 'less than but not equal to', google: 'vĂ€hemmĂ€n kuin, mutta ei yhtĂ€ suuri kuin') + - "≩": # 0x2269 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "suurempi mutta ei yhtĂ€ suuri kuin" # (en: 'greater than but not equal to', google: 'suurempi kuin, mutta ei yhtĂ€ suuri kuin') + - "â‰Ș": # 0x226a + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "paljon pienempi kuin" # (en: 'much less than', google: 'paljon vĂ€hemmĂ€n kuin') + - "≫": # 0x226b + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "paljon suurempi kuin" # (en: 'much greater than') + - "≬": # 0x226c + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "vĂ€lissĂ€" # (en: 'between', google: 'vĂ€lillĂ€') + - "≭": # 0x226d + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei yhtĂ€pitĂ€vĂ€" # (en: 'not equivalent to', google: 'ei vastaa') + - "≼": # 0x226e + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei aidosti pienempi kuin" # (en: 'not less than', google: 'ei vĂ€hempÀÀ kuin') + - "≯": # 0x226f + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei aidosti suurempi kuin" # (en: 'not greater than', google: 'enintÀÀn') + - "≰": # 0x2270 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei pienempi eikĂ€ yhtĂ€suuri kuin" # (en: 'neither less than nor equal to', google: 'ei vĂ€hemmĂ€n kuin yhtĂ€ suuri kuin') + - "≱": # 0x2271 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei suurempi eikĂ€ yhtĂ€suuri kuin" # (en: 'neither greater than nor equal to', google: 'ei suurempi kuin yhtĂ€ suuri kuin') + - "â‰Č": # 0x2272 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "pienempi tai yhtĂ€pitĂ€vĂ€" # (en: 'less than or equivalent to', google: 'vĂ€hemmĂ€n tai vastaavat') + - "≳": # 0x2273 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "suurempi tai yhtĂ€pitĂ€vĂ€" # (en: 'greater than or equivalent to', google: 'suurempi tai vastaa') + - "≮": # 0x2274 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei pienempi eikĂ€ yhtĂ€pitĂ€vĂ€" # (en: 'neither less than nor equivalent to', google: 'ei vĂ€hemmĂ€n kuin vastaa') + - "≔": # 0x2275 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei suurempi eikĂ€ yhtĂ€pitĂ€vĂ€" # (en: 'neither greater than nor equivalent to', google: 'ei suurempi kuin vastaava') + - "≶": # 0x2276 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "aidosti pienempi tai suurempi kuin" # (en: 'less than or greater than', google: 'vĂ€hemmĂ€n tai suurempi kuin') + - "≷": # 0x2277 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "aidosti suurempi tai pienempi kuin" # (en: 'greater than or less than', google: 'suurempi tai vĂ€hemmĂ€n kuin') + - "≾": # 0x2278 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei aidosti pienempi eikĂ€ suurempi kuin" # (en: 'neither less than nor greater than', google: 'ei vĂ€hemmĂ€n kuin suurempi kuin') + - "â‰č": # 0x2279 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei aidosti suurempi eikĂ€ pienempi kuin" # (en: 'neither greater than nor less than', google: 'ei suurempi kuin vĂ€hemmĂ€n kuin') + - "â‰ș": [T: "edeltÀÀ"] # 0x227a (en: 'precedes') + - "≻": [T: "seuraa"] # 0x227b (en: 'succeeds', google: 'onnistuu') + - "≌": [T: "edeltÀÀ tai on yhtĂ€ kuin"] # 0x227c (en: 'precedes or is equal to', google: 'edeltÀÀ tai on yhtĂ€ suuri kuin') + - "≜": [T: "seuraa tai on yhtĂ€ kuin"] # 0x227d (en: 'succeeds or is equal to', google: 'onnistuu tai on yhtĂ€ suuri') + - "≟": [T: "edeltÀÀ tai on yhtĂ€pitĂ€vĂ€"] # 0x227e (en: 'precedes or is equivalent to', google: 'edeltÀÀ tai vastaa') + - "≿": [T: "seuraa tai on yhtĂ€pitĂ€vĂ€"] # 0x227f (en: 'succeeds or is equivalent to', google: 'onnistuu tai vastaa') + - "⊀": [T: "ei edellĂ€"] # 0x2280 (en: 'does not precede', google: 'ei edeltĂ€') + - "⊁": [T: "ei seuraa"] # 0x2281 (en: 'does not succeed', google: 'ei onnistu') + - "⊈": # 0x2288 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei osajoukko eikĂ€ yhtĂ€ kuin" # (en: 'neither a subset of nor equal to', google: 'ei alajoukko eikĂ€ yhtĂ€ suuri kuin') + - "⊉": # 0x2289 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei sisĂ€llĂ€ osajoukkoa eikĂ€ yhtĂ€ kuin" # (en: 'neither a superset of nor equal to', google: 'ei ylenmÀÀrĂ€inen eikĂ€ yhtĂ€ suuri kuin') + - "⊊": [T: "on aito osajoukko"] # 0x228a (en: 'subset of with not equal to', google: 'osajoukko, joka ei ole yhtĂ€ suuri kuin') + - "⊋": [T: "sisĂ€ltÀÀ aidon osajoukon"] # 0x228b (en: 'superset of with not equal to', google: 'superset of with ei ole yhtĂ€ suuri kuin') + - "⊌": [T: "monijoukko"] # 0x228c (en: 'multiset', google: 'multiset') + - "⊍": [T: "monijoukkojen kerto"] # 0x228d (en: 'multiset multiplication', google: 'multiset -kertolasku') + - "⊎": [T: "monijoukkojen unioni"] # 0x228e (en: 'multiset union', google: 'multiset union') + - "⊏": [T: "kulmikas relaatio"] # 0x228f (en: 'square image of', google: 'neliökuva') + - "⊐": [T: "kÀÀnteinen kulmikas relaatio"] # 0x2290 (en: 'square original of', google: 'neliön alkuperĂ€inen') + - "⊑": [T: "kulmikas relaatio tai yhtĂ€ kuin"] # 0x2291 (en: 'square image of or equal to', google: 'neliökuva tai yhtĂ€ suuri kuin') + - "⊒": [T: "kÀÀnteinen kulmikas relaatio tai yhtĂ€ suuri kuin"] # 0x2292 (en: 'square original of or equal to', google: 'neliön alkuperĂ€inen tai yhtĂ€ suuri kuin') + - "⊓": [T: "kulmikas kupu"] # 0x2293 (en: 'square cap', google: 'neliö -isot') + - "⊔": [T: "kulmikas malja"] # 0x2294 (en: 'square cup', google: 'square cup') + - "⊕": [T: "ympyröity plus"] # 0x2295 (en: 'circled plus') + - "⊖": [T: "ympyröity miinus"] # 0x2296 (en: 'circled minus') + - "⊗": [T: "ympyröity kertaa"] # 0x2297 (en: 'circled times', google: 'ympyrĂ€ajat') + - "⊘": [T: "ympyröity jakoviiva"] # 0x2298 (en: 'circled slash', google: 'ympyrĂ€viiva') + - "⊙": [T: "ympyröity piste"] # 0x2299 (en: 'circled dot operator', google: 'ympyrĂ€pisteoperaattori') + - "⊚": [T: "ympyröity pallo"] # 0x229a (en: 'circled ring', google: 'ympyrĂ€ rengas') + - "⊛": [T: "ympyröity tĂ€hti"] # 0x229b (en: 'circled asterisk', google: 'ympyrĂ€ tĂ€hdellĂ€') + - "⊜": [T: "ympyröity yhtĂ€ kuin"] # 0x229c (en: 'circled equals', google: 'ympyröity tasa -arvoinen') + - "⊝": [T: "ympyröity viiva"] # 0x229d (en: 'circled dash') + - "⊞": [T: "neliöity plus"] # 0x229e (en: 'squared plus', google: 'squared plus') + - "⊟": [T: "neliöity miinus"] # 0x229f (en: 'squared minus', google: 'neliö miinus') + - "⊠": [T: "neliöity kertaa"] # 0x22a0 (en: 'squared times', google: 'neliöajat') + - "⊡": [T: "neliöity piste"] # 0x22a1 (en: 'squared dot operator', google: 'squared dot -operaattori') + - "⊱": [T: "oikealle osoittava nupi"] # 0x22a2 (en: 'proves', google: 'todistaa') + - "⊣": [T: "vasemmalle osoittava nupi"] # 0x22a3 (en: 'does not yield', google: 'ei tuota') + - "⊀": [T: "alas osoittava nupi"] # 0x22a4 (google: 'ylhÀÀltĂ€') + - "⊄": # 0x22a5 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "ylös osoittava nupi" # (google: 'pohja') + - "⊩": [T: "assertio"] # 0x22a6 (en: 'reduces to', google: 'vĂ€hentÀÀ') + - "⊧": [T: "toteuttaa mallina"] # 0x22a7 (en: 'models', google: 'malleja') + - "⊹": # 0x22a8 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "tosi" # (en: 'true', google: 'totta') + - "⊩": [T: "pakottaa"] # 0x22a9 (en: 'forces', google: 'voimat') + - "âŠȘ": [T: "kolmoispystyviiva ja oikeanpuoleinen kÀÀntöportti"] # 0x22aa (en: 'triple vertical bar right turnstile', google: 'kolminkertainen pystysuora palkki oikean kÀÀntölaite') + - "⊫": [T: "kaksoispystyviiva ja oikeanpuoleinen kaksoiskÀÀntöportti"] # 0x22ab (en: 'double vertical bar double right turnstile', google: 'kaksois pystysuora palkki kaksinkertainen oikea kÀÀnne') + - "⊬": [T: "ei todista"] # 0x22ac (en: 'does not prove', google: 'ei todista') + - "⊭": # 0x22ad + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "epĂ€tosi" # (en: 'not true', google: 'ei totta') + - "⊼": [T: "ei pakota"] # 0x22ae (en: 'does not force', google: 'ei pakota') + - "⊯": [T: "ei kaksoispystyviiva ja oikeanpuolenen kaksoiskÀÀntöportti"] # 0x22af (en: 'negated double vertical bar double right turnstile', google: 'kielteinen kaksinkertainen pystysuora palkki kaksinkertainen oikea kÀÀnne') + - "⊰": [T: "edeltÀÀ relaatiossa"] # 0x22b0 (en: 'precedes under relation', google: 'edeltÀÀ suhteessa') + - "⊱": [T: "seuraa relaatiossa"] # 0x22b1 (en: 'succeeds under relation', google: 'onnistuu suhteessa') + - "âŠČ": # 0x22b2 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "normaali aliryhmĂ€" # (en: 'a normal subgroup of', google: 'normaali alaryhmĂ€') + - "⊳": [T: "sisĂ€ltÀÀ normaalin aliryhmĂ€n"] # 0x22b3 (en: 'contains as a normal subgroup', google: 'sisĂ€ltÀÀ normaalina alaryhmĂ€nĂ€') + - "⊮": # 0x22b4 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "normaali aliryhmĂ€ tai yhtĂ€ kuin" # (en: 'a normal subgroup of or equal to', google: 'normaali alaryhmĂ€ tai yhtĂ€ suuri') + - "⊔": [T: "sisĂ€ltÀÀ normaalin aliryhmĂ€n tai on yhtĂ€ kuin"] # 0x22b5 (en: 'contains as a normal subgroup or equal to', google: 'sisĂ€ltÀÀ normaalina alaryhmĂ€nĂ€ tai yhtĂ€ suuri kuin') + - "⊶": # 0x22b6 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "alkukuva" # (en: 'the original of', google: 'alkuperĂ€inen') + - "⊷": # 0x22b7 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "kuva" # (en: 'an image of', google: 'kuva') + - "⊾": [T: "monikuvaus"] # 0x22b8 + - "âŠč": [T: "Hermiten konjugaattimatriisi"] # 0x22b9 (en: 'hermitian conjugate matrix', google: 'hermitian konjugaattimatriisi') + - "âŠș": [T: "interkalaatio"] # 0x22ba (google: 'interkalaatti') + - "⊻": [T: "joko tai"] # 0x22bb + - "⊌": [T: "ja ei"] # 0x22bc + - "⊜": [T: "tai ei"] # 0x22bd (google: 'ei myöskÀÀn') + - "⊟": [T: "suora kulma kaarella"] # 0x22be (en: 'right angle with arc', google: 'suorakulma kaarilla') + - "⊿": [T: "oikeanpuoleinen kolmio"] # 0x22bf (en: 'right triangle') + - "⋀": [T: "monikkokonjuktio"] # 0x22c0 (en: 'logical and', google: 'looginen ja') + - "⋁": [T: "monikkodisjunktio"] # 0x22c1 (en: 'logical or', google: 'looginen tai') + - "⋂": [T: "monikkoleikkaus"] # 0x22c2 (en: 'intersection', google: 'risteys') + - "⋃": [T: "monikkounioni"] # 0x22c3 (en: 'union', google: 'liitto') + - "⋄": [T: "timantti"] # 0x22c4 (en: 'diamond operator', google: 'timanttioperaattori') + - "⋅": # 0x22c5 + - test: + if: "@data-chem-formula-op" + then: [T: "piste"] # (en: 'dot', google translation) + else: [T: "kertaa"] # (en: 'times', google: 'ajat') + + - "⋆": [T: "kertaa"] # 0x22c6 (en: 'times', google: 'ajat') + - "⋇": [T: "jako kertaa"] # 0x22c7 (en: 'division times', google: 'jako -ajat') + - "⋈": [T: "rusetti"] # 0x22c8 (en: 'bowtie', google: 'rusetti') + - "⋉": # 0x22c9 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "vasemmanpuoleinen normaalitekijĂ€inen puolisuora tulo" # (en: 'the left normal factor semidirect product of', google: 'vasen normaali tekijĂ€ semidirect -tuote') + - "⋊": # 0x22ca + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "oikeanpuoleinen normaalitekijĂ€inen puolisuora tulo" # (en: 'the right normal factor semidirect product of', google: 'oikea normaali tekijĂ€ semidirect -tuote') + - "⋋": # 0x22cb + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "vasemmanpuoleinen puolisuora tulo" # (en: 'the left semidirect product of', google: 'vasen puolisirektin tuote') + - "⋌": # 0x22cc + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "oikeanpuoleinen puolisuora tulo" # (en: 'the right semidirect product of', google: 'oikea semidirect -tuote') + - "⋍": [T: "kÀÀnteinen tilde yhtĂ€suuruus"] # 0x22cd (en: 'reversed tilde equals', google: 'kÀÀnteinen tilde on tasa -arvoinen') + - "⋎": [T: "kaareva looginen tai"] # 0x22ce (en: 'curly logical or', google: 'kihara looginen tai') + - "⋏": [T: "kaareva looginen ja"] # 0x22cf (en: 'curly logical and', google: 'curly looginen ja') + - "⋐": # 0x22d0 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "kaksoisosajoukko" # (en: 'a double subset of', google: 'kaksinkertainen osajoukko') + - "⋑": # 0x22d1 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "kaksoisylijoukko" # (en: 'a double superset of', google: 'kaksinkertainen superset') + - "⋒": # 0x22d2 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (google translation) + - T: "kaksoisleikkaus" # (en: 'double intersection of', google: 'kaksinkertainen risteys') + - "⋓": # 0x22d3 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (google translation) + - T: "kaksoisunioni" # (en: 'double union of', google: 'kaksinkertainen liitto') + - "⋔": # 0x22d4 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (google translation) + - T: "hanko" # (en: 'proper intersection of', google: 'oikea risteys') + - "⋕": # 0x22d5 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "yhtĂ€suuri ja yhdensuuntainen" # (en: 'equal to and parallel to', google: 'yhtĂ€ suuri kuin sen kanssa ja yhdensuuntainen') + - "⋖": [T: "piste pienempi kuin"] # 0x22d6 (en: 'less than with dot', google: 'vĂ€hemmĂ€n kuin pisteellĂ€') + - "⋗": [T: "piste suurempi kuin"] # 0x22d7 (en: 'greater than with dot', google: 'suurempi kuin pisteellĂ€') + - "⋘": # 0x22d8 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "hyvin paljon pienempi kuin" # (en: 'very much less than', google: 'hyvin vĂ€hemmĂ€n kuin') + - "⋙": # 0x22d9 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "hyvin paljon suurempi kuin" # (en: 'very much greater than', google: 'erittĂ€in suurempi kuin') + - "⋚": # 0x22da + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "pienempi, yhtĂ€suuri tai suurempi kuin" # (en: 'less than equal to or greater than', google: 'vĂ€hemmĂ€n kuin yhtĂ€ suuri tai suurempi kuin') + - "⋛": # 0x22db + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "suurempi, yhtĂ€suuri tai pienempi kuin" # (en: 'greater than equal to or less than', google: 'suurempi kuin yhtĂ€ suuri tai vĂ€hemmĂ€n kuin') + - "⋜": # 0x22dc + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "yhtĂ€suuri tai pienempi kuin" # (en: 'equal to or less than', google: 'yhtĂ€ suuri tai vĂ€hemmĂ€n kuin') + - "⋝": # 0x22dd + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "yhtĂ€suuri tai suurempi kuin" # (en: 'equal to or greater than', google: 'yhtĂ€ suuri tai suurempi kuin') + - "⋞": # 0x22de + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "yhtĂ€ kuin tai edeltÀÀ" # (en: 'equal to or precedes', google: 'yhtĂ€ suuri tai edeltÀÀ') + - "⋟": # 0x22df + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "yhtĂ€ kuin tai seuraa" # (en: 'equal to or succeeds', google: 'yhtĂ€ suuri tai onnistuu') + - "⋠": [T: "ei edellĂ€ eikĂ€ yhtĂ€ kuin"] # 0x22e0 (en: 'does not precede nor is equal to', google: 'ei edeltĂ€ eikĂ€ ole yhtĂ€ suuri kuin') + - "⋡": [T: "ei seuraa eikĂ€ yhtĂ€ kuin"] # 0x22e1 (en: 'does not succeed nor is equal to', google: 'ei onnistu eikĂ€ ole yhtĂ€ suuri kuin') + - "⋱": [T: "ei kulmikas relaatio tai yhtĂ€ suuri kuin"] # 0x22e2 (en: 'not square image of or equal to', google: 'ei neliökuva tai yhtĂ€ suuri kuin') + - "⋣": [T: "ei kÀÀnteinen kulmikas relaatio tai yhtĂ€ suuri kuin"] # 0x22e3 (en: 'not square original of or equal to', google: 'ei neliömĂ€inen alkuperĂ€inen tai yhtĂ€ suuri kuin') + - "â‹€": [T: "kulmikas relaatio ja ei yhtĂ€ suuri kuin"] # 0x22e4 (en: 'square image of or not equal to', google: 'neliökuva tai ei ole yhtĂ€ suuri kuin') + - "â‹„": [T: "kulmikas kÀÀnteinen relaatio ja ei yhtĂ€ suuri kuin"] # 0x22e5 (en: 'square original of or not equal to', google: 'neliön alkuperĂ€inen tai ei ole yhtĂ€ suuri kuin') + - "⋩": # 0x22e6 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "pienempi kuin mutta ei ekvivalentti" # (en: 'less than but not equivalent to', google: 'vĂ€hemmĂ€n kuin, mutta ei vastaava') + - "⋧": # 0x22e7 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "suurempi kuin mutta ei ekvivalentti" # (en: 'greater than but not equivalent to', google: 'suurempi kuin mutta ei vastaa') + - "⋹": [T: "edeltÀÀ mutta ei ole ekvivalentti"] # 0x22e8 (en: 'precedes but is not equivalent to', google: 'edeltÀÀ, mutta ei vastaa') + - "⋩": [T: "seuraa mutta ei ole ekvivalentti"] # 0x22e9 (en: 'succeeds but is not equivalent to', google: 'onnistuu, mutta ei vastaa') + - "â‹Ș": # 0x22ea + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei ole normaali aliryhmĂ€" # (en: 'not a normal subgroup of', google: 'ei normaali alaryhmĂ€') + - "⋫": [T: "ei sisĂ€llĂ€ normaalia aliryhmÀÀ"] # 0x22eb (en: 'does not contain as a normal subgroup', google: 'ei sisĂ€llĂ€ normaalia alaryhmÀÀ') + - "⋬": # 0x22ec + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei ole normaali aliryhmĂ€ tai yhtĂ€ kuin" # (en: 'not a normal subgroup of nor is equal to', google: 'ei normaali alaryhmĂ€, joka ei ole yhtĂ€ suuri') + - "⋭": [T: "ei sisĂ€llĂ€ normaalina aliryhmĂ€nĂ€ tai ole yhtĂ€ kuin"] # 0x22ed (en: 'does not contain as a normal subgroup nor is equal to', google: 'ei sisĂ€llĂ€ normaalia alaryhmÀÀ eikĂ€ ole yhtĂ€ suuri kuin') + - "⋼": [T: "pystyellipsi"] # 0x22ee (en: 'vertical ellipsis', google: 'pystysuora ellipsis') # FI: context? used in matrices? + - "⋯": [T: "piste piste piste"] # 0x22ef (en: 'dot dot dot', google: 'dot dot dot') + - "⋰": [T: "nouseva ellipsi"] # 0x22f0 (en: 'upwards diagonal ellipsis', google: 'ylöspĂ€in diagonaalinen ellipsi') # FI: context? used in matrices? + - "⋱": [T: "laskeva ellipsi"] # 0x22f1 (en: 'diagonal ellipsis', google: 'diagonaalinen ellipsis') # FI: context? used in matrices? + - "â‹Č": [T: "poikkiviivainen kuulumismerkki"] # 0x22f2 (en: 'element of with long horizontal stroke', google: 'elementti pitkĂ€llĂ€ vaakasuoralla iskulla') + - "⋳": [T: "kuulumismerkki pystyviivaan pÀÀttyvĂ€llĂ€ poikkiviivalla"] # 0x22f3 (en: 'element of with vertical bar at end of horizontal stroke', google: 'elementti pystysuoralla tankolla vaakasuoran iskun lopussa') + - "⋮": [T: "pieni kuulumismerkki pystyviivaan pÀÀttyvĂ€llĂ€ poikkiviivalla"] # 0x22f4 (en: 'element of with vertical bar at end of horizontal stroke', google: 'elementti pystysuoralla tankolla vaakasuoran iskun lopussa') + - "â‹”": [T: "kuuluu joukkoon pisteellĂ€"] # 0x22f5 (en: 'element of with dot above', google: 'elementti yllĂ€ olevalla pisteellĂ€') + - "⋶": [T: "kuuluu joukkoon ylĂ€viivalla"] # 0x22f6 (en: 'element of with overbar', google: 'elementti ylikuormituksella') + - "⋷": [T: "pieni kuuluu joukkoon ylĂ€viivalla"] # 0x22f7 (en: 'element of with overbar', google: 'elementti ylikuormituksella') + - "⋾": [T: "kuuluu joukkoon alaviivalla"] # 0x22f8 (en: 'element of with underbar', google: 'elementti alakerroksella') + - "â‹č": [T: "kuuluu joukkoon kaksoispoikkiviivalla"] # 0x22f9 (en: 'element of with two horizontal strokes', google: 'elementti kahdella vaakasuuntaisella iskulla') + - "â‹ș": [T: "kÀÀnteinen kuuluu joukkoon poikkiviivalla"] # 0x22fa (en: 'contains with long horizontal stroke', google: 'sisĂ€ltÀÀ pitkĂ€llĂ€ vaakasuoralla iskulla') + - "⋻": [T: "kÀÀnteinen kuuluu joukkoon pystyviivaan pÀÀttyvĂ€llĂ€ poikkiviivalla"] # 0x22fb (en: 'contains with vertical bar at end of horizontal stroke', google: 'sisĂ€ltÀÀ pystysuoran palkin vaakasuoran iskun lopussa') + - "⋌": [T: "pieni kÀÀnteinen kuuluu joukkoon pystyviivaan pÀÀttyvĂ€llĂ€ poikkiviivalla"] # 0x22fc (en: 'contains with vertical bar at end of horizontal stroke', google: 'sisĂ€ltÀÀ pystysuoran palkin vaakasuoran iskun lopussa') + - "⋜": [T: "sisĂ€ltÀÀ tai on yhtĂ€ suuri kuin"] # 0x22fd (en: 'contains with overbar', google: 'sisĂ€ltÀÀ ylikuormituksen kanssa') + - "⋟": [T: "pieni sisĂ€ltÀÀ tai on yhtĂ€ suuri kuin"] # 0x22fe (en: 'contains with overbar', google: 'sisĂ€ltÀÀ ylikuormituksen kanssa') + - "⋿": [T: "Z-notaation laukkuun kuulumisen merkki"] # 0x22ff (google: 'z -merkintĂ€laukun jĂ€senyys') + - "⌀": [T: "halkaisija"] # 0x2300 (en: 'diameter') + - "⌁": [T: "sĂ€hkönuoli"] # 0x2301 (en: 'electric arrow', google translation) + - "⌂": [T: "talo"] # 0x2302 (en: 'house') + - "⌃": [T: "nuolenpÀÀ ylös"] # 0x2303 (en: 'up arrowhead', google translation) + - "⌄": [T: "nuolenpÀÀ alas"] # 0x2304 (en: 'down arrowhead', google translation) + - "⌅": [T: "projektio"] # 0x2305 (en: 'projective', google: 'projektiivinen') + - "⌆": [T: "perspektiivi"] # 0x2306 (en: 'perspective', google: 'nĂ€kökulma') + - "⌇": [T: "aaltoviiva"] # 0x2307 (en: 'wavy line', google translation) + - "⌈": [T: "vasen katto"] # 0x2308 (en: 'left ceiling') + - "⌉": [T: "oikea katto"] # 0x2309 (en: 'right ceiling') + - "⌊": [T: "vasen lattia"] # 0x230a (en: 'left floor') + - "⌋": [T: "oikea lattia"] # 0x230b (en: 'right floor', google: 'oikea kerros') + - "⌌": [T: "oikea alanurkkarajaus"] # 0x230c (en: 'bottom right crop', google: 'oikea alareuna') + - "⌍": [T: "vasen alanurkkarajaus"] # 0x230d (en: 'bottom left crop', google: 'vasen alakulma') + - "⌎": [T: "oikea ylĂ€nurkkarajaus"] # 0x230e (en: 'top right crop', google: 'oikea ylĂ€osa') + - "⌏": [T: "vasen ylĂ€nurkkarajaus"] # 0x230f (en: 'top left crop', google: 'vasen ylĂ€osa sato') + - "⌐": [T: "kÀÀnnetty negaatio"] # 0x2310 (en: 'reversed not sign', google: 'kÀÀntynyt ei allekirjoitettu') + - "⌑": [T: "tyynysymboli"] # 0x2311 (google translation) + - "⌒": [T: "ylĂ€kaari"] # 0x2312 (en: 'arc', google: 'kaari') + - "⌓": [T: "segmentti"] # 0x2313 (en: 'segment') + - "⌔": [T: "sektori"] # 0x2314 (en: 'sector', google translation) + - "⌕": [T: "suurennuslasi"] # 0x2315 (google: 'puhelintallistin') + - "⌖": [T: "tĂ€htĂ€in"] # 0x2316 (en: 'position indicator crosshairs', google: 'aseman ilmaisimen ristikkĂ€it') + - "⌗": [T: "risuaita"] # 0x2317 (en: 'viewdata square', google translation) + - "⌘": [T: "hannunvaakuna"] # 0x2318 (en: 'place of interest sign', google: 'kiinnostuksen kohteena oleva merkki') + - "⌙": [T: "kÀÀntynyt negaatio"] # 0x2319 (en: 'turned not sign', google translation) + - "⌚": [T: "kello"] # 0x231a (en: 'watch', google: 'katsella') + - "⌛": [T: "tiimalasi"] # 0x231b (en: 'hourglass', google translation) + - "⌜": [T: "vasen ylĂ€nurkka"] # 0x231c (en: 'top left corner', google: 'vasen ylĂ€kulma') + - "⌝": [T: "oikea ylĂ€nurkka"] # 0x231d (en: 'top right corner', google: 'oikea ylĂ€kulma') + - "⌞": [T: "vasen alanurkka"] # 0x231e (en: 'bottom left corner', google: 'vasen alakulma') + - "⌟": [T: "oikea alanurkka"] # 0x231f (en: 'bottom right corner', google: 'oikea alakulma') + - "⌠": [T: "integraalin ylĂ€puoli"] # 0x2320 (en: 'top half integral', google: 'top -puoliksi olennainen') + - "⌡": [T: "integraalin alapuoli"] # 0x2321 (en: 'bottom half integral', google: 'pohjapuoliskon integraali') + - "⌱": [T: "ylĂ€kaari"] # 0x2322 (en: 'frown', google: 'kulma') + - "⌣": [T: "alakaari"] # 0x2323 (en: 'smile', google: 'hymy') + - "⌀": [T: "nuolenpÀÀ ylös kahden vaakasuoran palkin vĂ€lissĂ€"] # 0x2324 (en: 'up arrowhead between two horizontal bars', google translation) + - "⌄": [T: "option"] # 0x2325 (en: 'option key', google translation) + - "〈": [T: "poista oikealle"] # 0x2326 (en: 'erase to the right', google translation) + - "⌧": [T: "suorakulmiossa oleva rasti"] # 0x2327 (en: 'x in a rectangle box', google translation) + - "⌹": [T: "nĂ€ppĂ€imistö"] # 0x2328 (en: 'keyboard', google translation) + - "〈": [T: "vasen kulmasulku"] # 0x2329 (en: 'left pointing angle bracket', google: 'vasen osoituskulmakiinnike') + - "âŒȘ": [T: "oikea kulmasulku"] # 0x232a (en: 'right pointing angle bracket', google: 'oikea osoituskulmakiinnike') + - "⌫": [T: "poista vasemmalle"] # 0x232b (en: 'erase to the left', google translation) + - "⌬": [T: "bentseenirengas"] # 0x232c (en: 'benzene ring', google translation) + - "⌭": [T: "sylinterisyys"] # 0x232d (google: 'sylinteryys') + - "⌼": [T: "profiilin ympĂ€ri"] # 0x232e (en: "all around profile" google: 'ympĂ€ri profiilia') # FI: translation unclear + - "⌯": [T: "symmetria"] # 0x232f (en: 'symmetry', google translation) + - "⌰": [T: "toleranssin yhteissumma"] # 0x2330 (en: 'total runout', google translation) # FI: meaning bit unclear, placeholder for correct + - "⌱": [T: "alkudimensio"] # 0x2331 (en: 'dimension origin', google translation) # FI: translation unclear + - "âŒČ": [T: "kartiovĂ€hentyminen"] # 0x2332 (en: 'conical taper', google translation) # FI: translation unclear + - "⌳": [T: "kaltevuus"] # 0x2333 (en: 'slope', google translation) + - "⌮": [T: "tasoupotin"] # 0x2334 (en: 'counterbore', google translation) + - "⌔": [T: "kĂ€rkiupotin"] # 0x2335 (en: 'countersink', google translation) + - "⍰": [T: "kysymysmerkki laatikossa"] # 0x2370 (en: 'unknown box', google: 'tuntematon laatikko') + - "⎕": [T: "laatikko"] # 0x2395 (en: 'box', google translation) + - "⏞": [T: "ylĂ€aaltosulku"] # 0x23DE (en: 'top brace', google: 'ylĂ€ ahdin') + - "⏟": [T: "ala-aaltosulku"] # 0x23DF (en: 'bottom brace', google: 'pohja ahdin') + - "①-⑹": # 0x2460 - 0x2469 + - T: "ympyröity" # (en: 'circled', google: 'ympyröi') + - SPELL: "translate('.', '①⑥⑹④⑀⑄⑊⑧⑚', '123456789')" + - "⑩": [T: "ympyröity kymmenen"] # 0x2469 (en: 'circled ten', google translation) + - "â‘Ș": [T: "ympyröity yksitoista"] # 0x246a (en: 'circled eleven', google translation) + - "⑫": [T: "ympyröity kaksitoista"] # 0x246b (en: 'circled twelve', google translation) + - "⑬": [T: "ympyröity kolmetoista"] # 0x246c (en: 'circled thirteen', google translation) + - "⑭": [T: "ympyröity neljĂ€toista"] # 0x246d (en: 'circled fourteen', google translation) + - "⑼": [T: "ympyröity viisitoista"] # 0x246e (en: 'circled fifteen', google translation) + - "⑯": [T: "ympyröity kuusitoista"] # 0x246f (en: 'circled sixteen', google translation) + - "⑰": [T: "ympyröity seitsemĂ€ntoista"] # 0x2470 (en: 'circled seventeen', google translation) + - "⑱": [T: "ympyröity kahdeksantoista"] # 0x2471 (en: 'circled eighteen', google translation) + - "⑳": [T: "ympyröity kaksikymmentĂ€"] # 0x2473 (en: 'circled twenty', google translation) + - "⑮-⑌": # 0x2474 - 0x247d + - T: "suluissa" # (en: 'parenthesized', google translation) + - SPELL: "translate('.', '⑎⑔⑶⑷⑞â‘čâ‘ș⑻⑌', '123456789')" + - "⑜": [T: "suluissa kymmenen"] # 0x247d (en: 'parenthesized ten', google translation) + - "⑟": [T: "suluissa yksitoista"] # 0x247e (en: 'parenthesized eleven', google translation) + - "⑿": [T: "suluissa kaksitoista"] # 0x247f (en: 'parenthesized twelve', google translation) + - "⒀": [T: "suluissa kolmetoista"] # 0x2480 (en: 'parenthesized thirteen', google translation) + - "⒁": [T: "suluissa neljĂ€toista"] # 0x2481 (en: 'parenthesized fourteen', google translation) + - "⒂": [T: "suluissa viisitoista"] # 0x2482 (en: 'parenthesized fifteen', google translation) + - "⒃": [T: "suluissa kuusitoista"] # 0x2483 (en: 'parenthesized sixteen', google translation) + - "⒄": [T: "suluissa seitsemĂ€ntoista"] # 0x2484 (en: 'parenthesized seventeen', google translation) + - "⒅": [T: "suluissa kahdeksantoista"] # 0x2485 (en: 'parenthesized eighteen', google translation) + - "⒆": [T: "suluissa yhdeksĂ€ntoista"] # 0x2486 (en: 'parenthesized nineteen', google translation) + - "⒇": [T: "suluissa kaksikymmentĂ€"] # 0x2487 (en: 'parenthesized twenty', google translation) + - "⒈-⒐": # 0x2488 - 0x2491 # FI: should these be ordinals? + - SPELL: "translate('.', '⒈⒉⒊⒋⒌⒍⒎⒏⒐', '123456789')" + - T: "pisteellĂ€" # (en: 'with period', google translation) + - "⒑": [T: "kymmenen pisteellĂ€"] # 0x2491 (en: 'ten with period', google translation) + - "⒒": [T: "yksitoista pisteellĂ€"] # 0x2492 (en: 'eleven with period', google translation) + - "⒓": [T: "kaksitoista pisteellĂ€"] # 0x2493 (en: 'twelve with period', google translation) + - "⒔": [T: "kolmetoista pisteellĂ€"] # 0x2494 (en: 'thirteen with period', google translation) + - "⒕": [T: "neljĂ€toista pisteellĂ€"] # 0x2495 (en: 'fourteen with period', google translation) + - "⒖": [T: "viisitoista pisteellĂ€"] # 0x2496 (en: 'fifteen with period', google translation) + - "⒗": [T: "kuusitoista pisteellĂ€"] # 0x2497 (en: 'sixteen with period', google translation) + - "⒘": [T: "seitsemĂ€ntoista pisteellĂ€"] # 0x2498 (en: 'seventeen with period', google translation) + - "⒙": [T: "kahdeksantoista pisteellĂ€"] # 0x2499 (en: 'eighteen with period', google translation) + - "⒚": [T: "yhdeksĂ€ntoista pisteellĂ€"] # 0x249a (en: 'nineteen with period', google translation) + - "⒛": [T: "kaksikymmentĂ€ pisteellĂ€"] # 0x249b (en: 'twenty with period', google translation) + - "⒜-â’”": # 0x249c - 0x24b5 + - T: "suluissa" # (en: 'parenthesized', google translation) + - SPELL: "translate('.', 'â’œâ’â’žâ’Ÿâ’ â’Ąâ’ąâ’Łâ’€â’„â’Šâ’§â’šâ’©â’Șâ’«â’Źâ’­â’źâ’Żâ’°â’±â’Čâ’łâ’Žâ’”', 'abcdefghijklmnopqrstuvwxyz')" + + - "Ⓐ-Ⓩ": + - T: "ympyröity" # (en: 'circled', google translation) + - SPELL: "translate('.', 'â’¶â’·â’žâ’čâ’șâ’»â’Œâ’œâ’Ÿâ’żâ“€â“â“‚â“ƒâ“„â“…â“†â“‡â“ˆâ“‰â“Šâ“‹â“Œâ“â“Žâ“', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "🅐-đŸ…©": # 0x1f150 - 0x1f169 + - T: "musta ympyröity" # (en: 'black circled', google translation) + - SPELL: "translate('.', 'đŸ…đŸ…‘đŸ…’đŸ…“đŸ…”đŸ…•đŸ…–đŸ…—đŸ…˜đŸ…™đŸ…šđŸ…›đŸ…œđŸ…đŸ…žđŸ…ŸđŸ… đŸ…ĄđŸ…ąđŸ…ŁđŸ…€đŸ…„đŸ…ŠđŸ…§đŸ…šđŸ…©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "ⓐ-ⓩ": # 0x24d0 - 0x24e9 + - T: "ympyröity" # (en: 'circled', google translation) + - SPELL: "translate('.', 'â“â“‘â“’â““â“”â“•â“–â“—â“˜â“™â“šâ“›â“œâ“â“žâ“Ÿâ“ â“Ąâ“ąâ“Łâ“€â“„â“Šâ“§â“šâ“©', 'abcdefghijklmnopqrstuvwxyz')" + - "â“Ș": [T: "ympyröity nolla"] # 0x24ea (en: 'circled zero', google translation) + - "⓫": [T: "musta ympyröity yksitoista"] # 0x24eb (en: 'black circled eleven', google translation) + - "⓬": [T: "musta ympyröity kaksitoista"] # 0x24ec (en: 'black circled twelve', google translation) + - "⓭": [T: "musta ympyröity kolmetoista"] # 0x24ed (en: 'black circled thirteen', google translation) + - "⓼": [T: "musta ympyröity neljĂ€toista"] # 0x24ee (en: 'black circled fourteen', google translation) + - "⓯": [T: "musta ympyröity viisitoista"] # 0x24ef (en: 'black circled fifteen', google translation) + - "⓰": [T: "musta ympyröity kuusitoista"] # 0x24f0 (en: 'black circled sixteen', google translation) + - "⓱": [T: "musta ympyröity seitsemĂ€ntoista"] # 0x24f1 (en: 'black circled seventeen', google translation) + - "â“Č": [T: "musta ympyröity kahdeksantoista"] # 0x24f2 (en: 'black circled eighteen', google translation) + - "⓳": [T: "musta ympyröity yhdeksĂ€ntoista"] # 0x24f3 (en: 'black circled nineteen', google translation) + - "⓮": [T: "musta ympyröity kaksikymmentĂ€"] # 0x24f4 (en: 'black circled twenty', google translation) + - "â“”-ⓜ": # 0x24f5 - 0x24fe + - T: "kaksinkertaisesti ympyröity" # (en: 'double circled', google translation) + - SPELL: "translate('.', 'ⓔ⓶⓷ⓞâ“čâ“ș⓻Ⓦⓜ', '123456789')" + - "ⓟ": [T: "kaksinkertaisesti ympyröity kymmenen"] # 0x24fe (en: 'double circled ten', google translation) + - "⓿": [T: "musta ympyröity nolla"] # 0x24ff (en: 'black circled zero', google translation) + - "■": [T: "musta neliö"] # 0x25a0 (en: 'black square') + - "□": [T: "valkoinen neliö"] # 0x25a1 (en: 'white square') + - "▱": [T: "pyöreĂ€kulmainen valkoinen neliö"] # 0x25a2 (en: 'white square with rounded corners', google translation) + - "▣": [T: "mustan neliön sisĂ€ltĂ€vĂ€ valkoinen neliö"] # 0x25a3 (en: 'white square containing small black square', google translation) + - "â–€": [T: "neliö vaakasuoralla vĂ€rityksellĂ€"] # 0x25a4 (en: 'square with horizontal fill', google translation) + - "â–„": [T: "neliö pystysuoralla vĂ€rityksellĂ€"] # 0x25a5 (en: 'square with vertical fill', google translation) + - "▩": [T: "neliö ruudukkovĂ€rityksellĂ€"] # 0x25a6 (en: 'square with orthogonal crosshatch fill', google translation) + - "▧": [T: "neliö vĂ€rityksellĂ€ ylĂ€vasemmalta alaoikelle"] # 0x25a7 (en: 'square with upper left to lower right fill', google translation) + - "▹": [T: "neliö vĂ€rityksellĂ€ ylĂ€oikealta alavasemmalle"] # 0x25a8 (en: 'square with upper right to lower left fill', google translation) + - "▩": [T: "neliö diagonaalisella ristikkovĂ€rityksellĂ€"] # 0x25a9 (en: 'square with diagonal crosshatch fill', google translation) + - "â–Ș": [T: "pieni musta neliö"] # 0x25aa (en: 'black small square', google: 'musta pieni neliö') + - "▫": [T: "pieni valkoinen neliö"] # 0x25ab (en: 'white small square', google: 'valkoinen pieni neliö') + - "▬": [T: "musta suorakaide"] # 0x25ac (en: 'black rectangle', google translation) + - "▭": [T: "valkoinen suorakaide"] # 0x25ad (en: 'white rectangle', google: 'valkoinen suorakulmio') + - "▼": [T: "musta pysty suorakaide"] # 0x25ae (en: 'black vertical rectangle', google: 'musta pystysuora suorakulmio') + - "▯": [T: "valkoinen pysty suorakaide"] # 0x25af (en: 'white vertical rectangle', google: 'valkoinen pystysuora suorakulmio') + - "▰": [T: "musta suunnikas"] # 0x25b0 (en: 'black parallelogram', google translation) + - "▱": [T: "valkoinen suunnikas"] # 0x25b1 (en: 'white parallelogram', google: 'valkoinen rinnakkainen ohjelma') + - "â–Č": [T: "musta ylös osoittava kolmio"] # 0x25b2 (en: 'black up pointing triangle', google: 'musta ylöspĂ€in osoittava kolmio') + - "△": [T: "valkoinen ylös osoittava kolmio"] # 0x25b3 (en: 'white up pointing triangle', google: 'valkoinen osoitus kolmio') + - "▮": [T: "pieni musta ylös osoittava kolmio"] # 0x25b4 (en: 'black up pointing small triangle', google: 'musta ylös osoittaen pientĂ€ kolmiota') + - "â–”": [T: "pieni valkoinen ylös osoittava kolmio"] # 0x25b5 (en: 'white up pointing small triangle', google: 'valkoinen osoittaen pientĂ€ kolmiota') + - "▶": [T: "musta oikealle osoittava kolmio"] # 0x25b6 (en: 'black right pointing triangle', google: 'musta oikea osoitus kolmio') + - "▷": [T: "valkoinen oikealle osoittava kolmio"] # 0x25b7 (en: 'white right pointing triangle', google: 'valkoinen oikea osoitus kolmio') + - "▾": [T: "pieni musta oikealle osoittava kolmio"] # 0x25b8 (en: 'black right pointing small triangle', google: 'musta oikea osoittaen pieni kolmio') + - "â–č": [T: "pieni valkoinen oikealle osoittava kolmio"] # 0x25b9 (en: 'white right pointing small triangle', google: 'valkoinen oikea osoittaen pieni kolmio') + - "â–ș": [T: "musta oikea osoitin"] # 0x25ba (en: 'black right pointing pointer', google translation) + - "▻": [T: "valkoinen oikea osoitin"] # 0x25bb (en: 'white right pointing pointer', google translation) + - "â–Œ": [T: "musta alas osoittava kolmio"] # 0x25bc (en: 'black down pointing triangle', google: 'musta alaspĂ€in osoittava kolmio') + - "â–œ": [T: "valkoinen alas osoittava kolmio"] # 0x25bd (en: 'white down pointing triangle', google: 'valkoinen alaspĂ€in osoittava kolmio') + - "â–Ÿ": [T: "pieni musta alas osoittava kolmio"] # 0x25be (en: 'black down pointing small triangle', google: 'musta alaspĂ€in osoittaen pieni kolmio') + - "▿": [T: "pieni valkoinen alas osoittava kolmio"] # 0x25bf (en: 'white down pointing small triangle', google: 'valkoinen alas osoittaen pieni kolmio') + - "◀": [T: "musta vasemmalle osoittava kolmio"] # 0x25c0 (en: 'black left pointing triangle', google: 'musta vasen osoitus kolmio') + - "◁": [T: "valkoinen vasemmalle osoittava kolmio"] # 0x25c1 (en: 'white left pointing triangle', google: 'valkoinen vasen osoitus kolmio') + - "◂": [T: "pieni musta vasemmalle osoittava kolmio"] # 0x25c2 (en: 'black left pointing small triangle', google: 'musta vasen osoittaa pieni kolmio') + - "◃": [T: "pieni valkoinen vasemmalle osoittava kolmio"] # 0x25c3 (en: 'white left pointing small triangle', google: 'valkoinen vasen osoitus pieni kolmio') + - "◄": [T: "musta vasemmalle osoittava osoitin"] # 0x25c4 (en: 'black left pointing pointer', google: 'musta vasen osoitin') + - "◅": [T: "valkoinen vasemmalle osoittava osoitin"] # 0x25c5 (en: 'white left pointing pointer', google: 'valkoinen vasen osoitin') + - "◆": [T: "musta timantti"] # 0x25c6 (en: 'black diamond', google: 'musta timantti') + - "◇": [T: "valkoinen timantti"] # 0x25c7 (en: 'white diamond', google: 'valkoinen timantti') + - "◈": [T: "valkoinen timantti jonka sisĂ€llĂ€ musta timantti"] # 0x25c8 (en: 'white diamond containing black small diamond', google: 'valkoinen timantti, joka sisĂ€ltÀÀ mustan pienen timantin') + - "◉": [T: "valkoinen ympyrĂ€ jonka sisĂ€llĂ€ musta ympyrĂ€"] # 0x25c9 (en: 'fisheye', google: 'kalake') + - "◊": [T: "vinoneliö"] # 0x25ca (en: 'lozenge', google: 'pastilli') + - "○": [T: "valkoinen ympyrĂ€"] # 0x25cb (en: 'white circle') + - "◌": [T: "pisteympyrĂ€"] # 0x25cc (en: 'dotted circle', google: 'pisteympyrĂ€') + - "◍": [T: "ympyrĂ€ ja pystysuora viivoitus"] # 0x25cd (en: 'circle with vertical fill', google: 'ympyrĂ€ pystysuoralla tĂ€yttöÀ') + - "◎": [T: "kaksi sisĂ€kkĂ€istĂ€ ympyrÀÀ"] # 0x25ce (en: 'bullseye', google: 'bullseye') + - "●": [T: "musta ympyrĂ€"] # 0x25cf (en: 'black circle') + - "◐": [T: "ympyrĂ€ vasen puoli musta"] # 0x25d0 (en: 'circle with left half black', google: 'ympyrĂ€ vasemmalla puoliksi mustalla') + - "◑": [T: "ympyrĂ€ oikea puoli musta"] # 0x25d1 (en: 'circle with right half black', google: 'ympyrĂ€ oikealla puoliksi mustalla') + - "◒": [T: "ympyrĂ€ alapuoli musta"] # 0x25d2 (en: 'circle with lower half black', google: 'ympyrĂ€, jossa on alaosa musta') + - "◓": [T: "ympyrĂ€ ylĂ€puoli musta"] # 0x25d3 (en: 'circle with upper half black', google: 'ympyrĂ€ ylĂ€puoliskolla mustalla') + - "◔": [T: "ympyrĂ€ ylĂ€oikea neljĂ€nnes musta"] # 0x25d4 (en: 'circle with upper right quadrant black', google: 'ympyrĂ€ oikealla ylĂ€kulmalla kvadrantti musta') + - "◕": [T: "ympyrĂ€ ylĂ€vasen neljĂ€nnes mustaamatta"] # 0x25d5 (en: 'circle with all but upper left quadrant black', google: 'ympyrĂ€ kaikilla paitsi vasemmalla ylĂ€osalla mustaa') + - "◖": [T: "musta vasen puoliympyrĂ€"] # 0x25d6 (en: 'left half black circle', google: 'vasen puoli musta ympyrĂ€') + - "◗": [T: "musta oikea puoliympyrĂ€"] # 0x25d7 (en: 'right half black circle', google: 'oikea puoli musta ympyrĂ€') + - "◘": [T: "luetelmapallon negatiivi"] # 0x25d8 (en: 'inverse bullet', google: 'kÀÀnteinen luoti') + - "◙": [T: "valkoisen ympyrĂ€n negatiivi"] # 0x25d9 (en: 'inverse white circle', google: 'kÀÀnteinen valkoinen ympyrĂ€') + - "◚": [T: "valkoisen ympyrĂ€n negatiivin ylĂ€puoli"] # 0x25da (en: 'upper half inverse white circle', google: 'ylĂ€osa kÀÀnteinen valkoinen ympyrĂ€') + - "◛": [T: "valkoisen ympyrĂ€n negatiivin alapuoli"] # 0x25db (en: 'lower half inverse white circle', google: 'alempi puoli kÀÀnteinen valkoinen ympyrĂ€') + - "◜": [T: "ympyrĂ€n kaaren vasen ylĂ€neljĂ€nnes"] # 0x25dc (en: 'upper left quadrant circular arc', google: 'vasen ylĂ€osa kvadrantti pyöreĂ€ kaari') + - "◝": [T: "ympyrĂ€n kaaren oikea ylĂ€neljĂ€nnes"] # 0x25dd (en: 'upper right quadrant circular arc', google: 'oikea ylĂ€osa kvadrantti pyöreĂ€ kaari') + - "◞": [T: "ympyrĂ€n kaaren oikea alaneljĂ€nnes"] # 0x25de (en: 'lower right quadrant circular arc', google: 'oikea alaosa neljĂ€nneksen pyöreĂ€ kaari') + - "◟": [T: "ympyrĂ€n kaaren vasen alaneljĂ€nnes"] # 0x25df (en: 'lower left quadrant circular arc', google: 'vasen alakulmainen kvadrantti pyöreĂ€ kaari') + - "◠": [T: "ympyrĂ€n kaaren ylĂ€puolikas"] # 0x25e0 (en: 'upper half circle', google: 'ylĂ€osa ympyrĂ€') + - "◡": [T: "ympyrĂ€n kaaren alapuolikas"] # 0x25e1 (en: 'lower half circle', google: 'alempi puoli ympyrĂ€') + - "◱": [T: "musta oikea alakolmio"] # 0x25e2 (en: 'black lower right triangle', google: 'musta alaosa oikea kolmio') + - "◣": [T: "musta vasen alakolmio"] # 0x25e3 (en: 'black lower left triangle', google: 'musta vasen alaosa kolmio') + - "â—€": [T: "musta vasen ylĂ€kolmio"] # 0x25e4 (en: 'black upper left triangle', google: 'musta vasen ylĂ€osa kolmio') + - "â—„": [T: "musta oikea ylĂ€kolmio"] # 0x25e5 (en: 'black upper right triangle', google: 'musta oikea ylĂ€osa kolmio') + - "◩": [T: "valkoinen pallo"] # 0x25e6 (en: 'composition', google: 'sĂ€vellys') + - "◧": [T: "neliö vasen puoli musta"] # 0x25e7 (en: 'square with left half black', google: 'neliö vasemmalla puoliksi mustalla') + - "◹": [T: "neliö oikea puoli musta"] # 0x25e8 (en: 'square with right half black', google: 'neliö oikealla puoliksi mustalla') + - "◩": [T: "neliö vasen ylĂ€diagonaali musta"] # 0x25e9 (en: 'square with upper left half black', google: 'neliö vasemmalla ylĂ€osa mustalla') + - "â—Ș": [T: "neliö oikea aladiagonaali musta"] # 0x25ea (en: 'square with lower right half black', google: 'neliö oikealla alaosa mustalla') + - "◫": [T: "valkoinen neliö pystysuoralla poikkiviivalla"] # 0x25eb (en: 'white square with bisecting line', google: 'valkoinen neliö puolustamisviivalla') + - "◬": [T: "valkoinen ylös osoittava kolmio pisteellĂ€"] # 0x25ec (en: 'white up pointing triangle with dot', google: 'valkoinen osoittava kolmio pisteellĂ€') + - "◭": [T: "valkoinen ylös osoittava kolmio, vasen puoli musta"] # 0x25ed (en: 'up pointing triangle with left half black', google: 'ylöspĂ€in osoittaen kolmio vasemmalla puoliksi mustalla') + - "◼": [T: "valkoinen ylös osoittava kolmio, oikea puoli musta"] # 0x25ee (en: 'up pointing triangle with right half black', google: 'ylös osoittaen kolmio oikealla puoliksi mustalla') + - "◯": [T: "valkoinen ympyrĂ€"] # 0x25ef (en: 'large circle', google: 'suuri ympyrĂ€') + - "◰": [T: "valkoinen neliö josta on erotettu ylĂ€vasen neljĂ€nnes"] # 0x25f0 (en: 'white square with upper left quadrant', google translation) + - "◱": [T: "valkoinen neliö josta on erotettu alavasen neljĂ€nnes"] # 0x25f1 (en: 'white square with lower left quadrant', google translation) + - "â—Č": [T: "valkoinen neliö josta on erotettu alaoikea neljĂ€nnes"] # 0x25f2 (en: 'white square with lower right quadrant', google translation) + - "◳": [T: "valkoinen neliö josta on erotettu ylĂ€oikea neljĂ€nnes"] # 0x25f3 (en: 'white square with upper right quadrant', google translation) + - "◮": [T: "valkoinen ympyrĂ€ josta on erotettu ylĂ€vasen neljĂ€nnes"] # 0x25f4 (en: 'white circle with upper left quadrant', google translation) + - "â—”": [T: "valkoinen ympyrĂ€ josta on erotettu alavasen neljĂ€nnes"] # 0x25f5 (en: 'white circle with lower left quadrant', google translation) + - "◶": [T: "valkoinen ympyrĂ€ josta on erotettu alaoikea neljĂ€nnes"] # 0x25f6 (en: 'white circle with lower right quadrant', google translation) + - "◷": [T: "valkoinen ympyrĂ€ josta on erotettu ylĂ€oikea neljĂ€nnes"] # 0x25f7 (en: 'white circle with upper right quadrant', google translation) + - "◾": [T: "ylĂ€vasen kolmio"] # 0x25f8 (en: 'upper left triangle', google: 'vasen ylĂ€osa kolmio') + - "â—č": [T: "ylĂ€oikea kolmio"] # 0x25f9 (en: 'upper right triangle', google: 'oikea ylĂ€osa kolmio') + - "â—ș": [T: "alavasen kolmio"] # 0x25fa (en: 'lower left triangle', google: 'vasen alaosa kolmio') + - "◻": [T: "keskikokoinen valkoinen neliö"] # 0x25fb (en: 'white medium square', google: 'valkoinen keskipitkĂ€ neliö') + - "â—Œ": [T: "keskikokoinen musta neliö"] # 0x25fc (en: 'black medium square', google: 'musta keskipitkĂ€ neliö') + - "â—œ": [T: "pienehkö valkoinen neliö"] # 0x25fd (en: 'white medium small square', google: 'valkoinen keskipitkĂ€ pieni neliö') + - "â—Ÿ": [T: "pienehkö musta neliö"] # 0x25fe (en: 'black medium small square', google: 'musta keskipitkĂ€ pieni neliö') + - "◿": [T: "alaoikea kolmio"] # 0x25ff (en: 'lower right triangle', google: 'oikea alaosa kolmio') + - "♠": [T: "musta pata"] # 0x2660 (en: 'black spade suit', google: 'musta lapio puku') + - "♡": [T: "valkoinen hertta"] # 0x2661 (en: 'white heart suit', google: 'valkoinen sydĂ€npuku') + - "♱": [T: "valkoinen ruutu"] # 0x2662 (en: 'white diamond suit', google: 'valkoinen timanttipuku') + - "♣": [T: "musta risti"] # 0x2663 (en: 'black club suit', google: 'mustakerhopuku') + - "♀": [T: "valkoinen pata"] # 0x2664 (en: 'white spade suit', google: 'valkoinen lapiopuku') + - "♄": [T: "musta hertta"] # 0x2665 (en: 'black heart suit', google: 'musta sydĂ€npuku') + - "♩": [T: "musta ruutu"] # 0x2666 (en: 'black diamond suit', google: 'musta timanttipuku') + - "♧": [T: "valkoinen risti"] # 0x2667 (en: 'white club suit', google: 'valkoinen klubipuku') + - "❚": [T: "keskikokoinen vasen sulkukoriste"] # 0x2768 (en: 'medium left parentheses ornament', google translation) + - "❩": [T: "keskikokoinen oikea sulkukoriste"] # 0x2769 (en: 'medium right parentheses ornament', google translation) + - "âȘ": [T: "keskikokoinen litistetty vasen sulkukoriste"] # 0x276a (en: 'medium flattened left parentheses ornament', google translation) + - "❫": [T: "keskikokoinen litistetty oikea sulkukoriste"] # 0x276b (en: 'medium flattened right parentheses ornament', google translation) + - "❬": [T: "keskikokoinen vasen kulmasulkukoriste"] # 0x276c (en: 'medium left-pointing angle bracket ornament', google translation) + - "❭": [T: "keskikokoinen oikea kulmasulkukoriste"] # 0x276d (en: 'medium right-pointing angle bracket ornament', google translation) + - "❼": [T: "raskas vasen kulmalainausmerkkikoriste"] # 0x276e (en: 'heavy left-pointing angle quotation mark ornament', google translation) + - "❯": [T: "raskas oikea kulmalainausmerkkikoriste"] # 0x276f (en: 'heavy right-pointing angle quotation mark ornament', google translation) + - "❰": [T: "raskas vasen kulmasulkukoriste"] # 0x2770 (en: 'heavy left-pointing angle bracket ornament', google translation) + - "❱": [T: "raskas oikea kulmasulkukoriste"] # 0x2771 (en: 'heavy right-pointing angle bracket ornament', google translation) + - "âČ": [T: "kevyt vasen kilpikonnankuorisulkukoriste"] # 0x2772 (en: 'light left tortoise shell bracket ornament', google translation) + - "❳": [T: "kevyt oikea kilpikonnankuorisulkukoriste"] # 0x2773 (en: 'light right tortoise shell bracket ornament', google translation) + - "❎": [T: "keskikokoinen vasen aaltosulkukoriste"] # 0x2774 (en: 'medium left brace ornament', google translation) + - "❔": [T: "keskikokoinen oikea aaltosulkukoriste"] # 0x2775 (en: 'medium right brace ornament', google translation) + - "❶": [T: "musta ympyröity yksi"] # 0x2776 (en: 'black circled one', google translation) + - "❷": [T: "musta ympyröity kaksi"] # 0x2777 (en: 'black circled two', google translation) + - "❞": [T: "musta ympyröity kolme"] # 0x2778 (en: 'black circled three', google translation) + - "âč": [T: "musta ympyröity neljĂ€"] # 0x2779 (en: 'black circled four', google translation) + - "âș": [T: "musta ympyröity viisi"] # 0x277a (en: 'black circled five', google translation) + - "❻": [T: "musta ympyröity kuusi"] # 0x277b (en: 'black circled six', google translation) + - "❌": [T: "musta ympyröity seitsemĂ€n"] # 0x277c (en: 'black circled seven', google translation) + - "❜": [T: "musta ympyröity kahdeksan"] # 0x277d (en: 'black circled eight', google translation) + - "❟": [T: "musta ympyröity yhdeksĂ€n"] # 0x277e (en: 'black circled nine', google translation) + - "❿": [T: "musta ympyröity kymmenen"] # 0x277f (en: 'black circled ten', google translation) + - "➀": [T: "ympyröity sans serif yksi"] # 0x2780 (en: 'circled sans serif one', google translation) + - "➁": [T: "ympyröity sans serif kaksi"] # 0x2781 (en: 'circled sans serif two', google translation) + - "➂": [T: "ympyröity sans serif kolme"] # 0x2782 (en: 'circled sans serif three', google translation) + - "➃": [T: "ympyröity sans serif neljĂ€"] # 0x2783 (en: 'circled sans serif four', google translation) + - "➄": [T: "ympyröity sans serif viisi"] # 0x2784 (en: 'circled sans serif five', google translation) + - "➅": [T: "ympyröity sans serif kuusi"] # 0x2785 (en: 'circled sans serif six', google translation) + - "➆": [T: "ympyröity sans serif seitsemĂ€n"] # 0x2786 (en: 'circled sans serif seven', google translation) + - "➇": [T: "ympyröity sans serif kahdeksan"] # 0x2787 (en: 'circled sans serif eight', google translation) + - "➈": [T: "ympyröity sans serif yhdeksĂ€n"] # 0x2788 (en: 'circled sans serif nine', google translation) + - "➉": [T: "ympyröity sans serif kymmenen"] # 0x2789 (en: 'circled sans serif ten', google translation) + - "➊": [T: "musta ympyröity sans serif yksi"] # 0x278a (en: 'black circled sans serif one', google translation) + - "➋": [T: "musta ympyröity sans serif kaksi"] # 0x278b (en: 'black circled sans serif two', google translation) + - "➌": [T: "musta ympyröity sans serif kolme"] # 0x278c (en: 'black circled sans serif three', google translation) + - "➍": [T: "musta ympyröity sans serif neljĂ€"] # 0x278d (en: 'black circled sans serif four', google translation) + - "➎": [T: "musta ympyröity sans serif viisi"] # 0x278e (en: 'black circled sans serif five', google translation) + - "➏": [T: "musta ympyröity sans serif kuusi"] # 0x278f (en: 'black circled sans serif six', google translation) + - "➐": [T: "musta ympyröity sans serif seitsemĂ€n"] # 0x2790 (en: 'black circled sans serif seven', google translation) + - "➑": [T: "musta ympyröity sans serif kahdeksan"] # 0x2791 (en: 'black circled sans serif eight', google translation) + - "➒": [T: "musta ympyröity sans serif yhdeksĂ€n"] # 0x2792 (en: 'black circled sans serif nine', google translation) + - "➓": [T: "musta ympyröity sans serif kymmenen"] # 0x2793 (en: 'black circled sans serif ten', google translation) + - "➔": [T: "raskas leveĂ€pĂ€inen oikea nuoli"] # 0x2794 (en: 'heavy wide-headed rightwards arrow', google translation) + - "➕": [T: "raskas plusmerkki"] # 0x2795 (en: 'heavy plus sign', google translation) + - "➖": [T: "raskas miinusmerkki"] # 0x2796 (en: 'heavy minus sign', google translation) + - "➗": [T: "raskas jakomerkki"] # 0x2797 (en: 'heavy division sign', google translation) + - "➘": [T: "raskas alaoikea nuoli"] # 0x2798 (en: 'heavy south east arrow', google translation) + - "➙": [T: "raskas oikea nuoli"] # 0x2799 (en: 'heavy rightwards arrow', google translation) + - "➚": [T: "raskas ylĂ€oikea nuoli"] # 0x279a (en: 'heavy north east arrow', google translation) + - "➛": [T: "laatimispiste oikealle nuoli"] # 0x279b (en: 'drafting point rightwards arrow', google translation) + - "➜": [T: "raskas pyöristetty oikea nuoli"] # 0x279c (en: 'heavy round-tipped rightwards arrow', google translation) + - "➝": [T: "kolmionpĂ€inen oikea nuoli"] # 0x279d (en: 'triangle-headed rightwards arrow', google translation) + - "➞": [T: "raskas kolmiopĂ€inen oikea nuoli"] # 0x279e (en: 'heavy triangle-headed rightwards arrow', google translation) + - "➟": [T: "kolmiopĂ€inen oikea nuoli katkoviivalla"] # 0x279f (en: 'dashed triangle-headed rightwards arrow', google translation) + - "➠": [T: "raskas kolmiopĂ€inen oikea nuoli katkoviivalla"] # 0x27a0 (en: 'heavy dashed triangle-headed rightwards arrow', google translation) + - "➡": [T: "oikealle osoittava musta nuoli"] # 0x27a1 (en: 'black rightwards arrow', google translation) + - "➱": [T: "ylĂ€puolelta valkea oikealle osoittava nuolenpÀÀ"] # 0x27a2 (en: 'three d top lighted rightwards arrow', google translation) + - "➣": [T: "alapuolelta valkea oikealle osoittava nuolenpÀÀ"] # 0x27a3 (en: 'three d bottom lighted rightwards arrow', google translation) + - "➀": [T: "musta oikea nuolenpÀÀ"] # 0x27a4 (en: 'black rightwards arrowhead', google translation) + - "➄": [T: "raskas musta kaareva alas ja oikealle osoittava nuoli"] # 0x27a5 (en: 'heavy black curved downwards and rightwards arrow', google translation) + - "➊": [T: "raskas musta kaareva ylös ja oikealle osoittava nuoli"] # 0x27a6 (en: 'heavy black curved upwards and rightwards arrow', google translation) + - "➧": [T: "raskas musta lyhyt oikea nuoli"] # 0x27a7 (en: 'squat black rightwards arrow', google translation) + - "➚": [T: "raskas terĂ€vĂ€ musta oikea nuoli"] # 0x27a8 (en: 'heavy concave-pointed black rightwards arrow', google translation) + - "➩": [T: "oikea oikealle varjostettu valkoinen nuoli"] # 0x27a9 (en: 'right-shaded white rightwards arrow', google translation) + - "âžȘ": [T: "oikea vasemmalle varjostettu valkoinen nuoli"] # 0x27aa (en: 'left-shaded white rightwards arrow', google translation) + - "➫": [T: "taaksepĂ€in kallistettu varjostettu valkoinen oikealle osoittava nuoli"] # 0x27ab (en: 'back-tilted shadowed white rightwards arrow', google translation) + - "➬": [T: "eteenpĂ€in kallistettu varjostettu valkoinen oikealle osoittava nuoli"] # 0x27ac (en: 'front-tilted shadowed white rightwards arrow', google translation) + - "➭": [T: "raskas oikea alhaalta varjostettu valkoinen nuoli"] # 0x27ad (en: 'heavy lower right-shadowed white rightwards arrow', google translation) + - "➼": [T: "raskas oikea ylhÀÀltĂ€ varjostettu valkoinen nuoli"] # 0x27ae (en: 'heavy upper right-shadowed white rightwards arrow', google translation) + - "➯": [T: "raskas oikea alhaalta varjostettu valkoinen nuoli lovella"] # 0x27af (en: 'notched lower right-shadowed white rightwards arrow', google translation) + - "➱": [T: "raskas oikea ylhÀÀltĂ€ varjostettu valkoinen nuoli lovella"] # 0x27b1 (en: 'notched upper right-shadowed white rightwards arrow', google translation) + - "âžČ": [T: "ympyröity raskas oikea valkoinen nuoli"] # 0x27b2 (en: 'circled heavy white rightwards arrow', google translation) + - "➳": [T: "oikea nuoli valkoisilla höyhenillĂ€"] # 0x27b3 (en: 'white-feathered rightwards arrow', google translation) + - "➮": [T: "alaoikea nuoli mustilla höyhenillĂ€"] # 0x27b4 (en: 'black-feathered south east arrow', google translation) + - "➔": [T: "oikea nuoli mustilla höyhenillĂ€"] # 0x27b5 (en: 'black-feathered rightwards arrow', google translation) + - "➶": [T: "ylĂ€oikea nuoli mustilla höyhenillĂ€"] # 0x27b6 (en: 'black-feathered north east arrow', google translation) + - "➷": [T: "raskas alaoikea nuoli mustilla höyhenillĂ€"] # 0x27b7 (en: 'heavy black-feathered south east arrow', google translation) + - "➾": [T: "raskas oikea nuoli mustilla höyhenillĂ€"] # 0x27b8 (en: 'heavy black-feathered rightwards arrow', google translation) + - "âžč": [T: "raskas ylĂ€oikea nuoli mustilla höyhenillĂ€"] # 0x27b9 (en: 'heavy black-feathered north east arrow', google translation) + - "âžș": [T: "oikea nuoli kyynelpiikillĂ€"] # 0x27ba (en: 'teradrop-barbed rightwards arrow', google translation) + - "➻": [T: "raskas nuoli kyynelpiikillĂ€"] # 0x27bb (en: 'heavy teardrop-shanked rightwards arrow', google translation) + - "➌": [T: "oikea nuoli kiilalla"] # 0x27bc (en: 'wedge-tailed rightwards arrow', google translation) + - "➜": [T: "raskas oikea nuoli kiilalla"] # 0x27bd (en: 'heavy wedge-tailed rightwards arrow', google translation) + - "➟": [T: "oikea ÀÀriviivanuoli"] # 0x27be (en: 'open-outlined rightwards arrow', google translation) + - "⟀": [T: "kolmiulotteinen kulma"] # 0x27c0 (en: 'three dimensional angle') + - "⟁": [T: "kaksi valkoista kolmiota sisĂ€kkĂ€in"] # 0x27c1 (en: 'white triangle containing small white triangle', google: 'valkoinen kolmio, joka sisĂ€ltÀÀ pientĂ€ valkoista kolmiota') + - "⟂": # 0x27c2 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "kohtisuora" # (en: 'perpendicular to', google: 'kohtisuorassa') + - "⟃": # 0x27c3 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "avoin osajoukko" # (en: 'an open subset of') + - "⟄": # 0x27c4 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "avoin ylĂ€joukko" # (en: 'an open superset of', google: 'avoin superset') + - "⟅": [T: "vasen s-muotoinen laukkuerottaja"] # 0x27c5 (google: 'vasen s-muotoinen laukku') + - "⟆": [T: "oikea s-muotoinen laukkuerottaja"] # 0x27c6 (google: 'oikea s-muotoinen laukku') + - "⟇": [T: "tai pisteellĂ€"] # 0x27c7 (en: 'or with dot inside', google: 'tai pisteellĂ€ sisĂ€llĂ€') + - "⟈": [T: "kenoviiva osajoukko"] # 0x27c8 (en: 'reverse solidus preceding subset', google: 'kÀÀnteinen solidus edeltĂ€vĂ€ alajoukko') + - "⟉": [T: "ylijoukko vinoviiva"] # 0x27c9 (en: 'superset preceding solidus', google: 'superset edeltĂ€vĂ€ solidus') + - "⟊": [T: "pystyviiva vaakasuoralla poikkiviivalla"] # 0x27ca (en: 'vertical bar with horizontal stroke', google: 'pystysuora palkki vaakasuuntaisella iskulla') + - "⟋": [T: "matemaattinen nouseva diagonaali"] # 0x27cb (en: 'mathematical rising diagonal', google translation) + - "⟌": [T: "jakokulma"] # 0x27cc (en: 'long division', google: 'jakolaskutoimitus') + - "⟍": [T: "matemaattinen laskeva diagonaali"] # 0x27cd (en: 'mathematical falling diagonal', google translation) + - "⟎": [T: "looginen ja neliössĂ€"] # 0x27ce (en: 'squared logical and', google translation) + - "⟏": [T: "looginen tai neliössĂ€"] # 0x27cf (en: 'squared logical or', google translation) + - "⟐": [T: "valkoinen timantti keskitetyllĂ€ pisteellĂ€"] # 0x27d0 (en: 'white diamond with centered dot', google translation) + - "⟑": [T: "ja pisteellĂ€"] # 0x27d1 (en: 'and with dot', google: 'ja pisteellĂ€') + - "⟒": [T: "ylös aukeava kuuluu joukkoon"] # 0x27d2 (en: 'element of opening upwards', google: 'elementti avaamisesta ylöspĂ€in') + - "⟓": [T: "oikea alakulma pisteellĂ€"] # 0x27d3 (en: 'lower right corner with dot', google: 'oikea alakulma pisteellĂ€') + - "⟔": [T: "vasen alakulma pisteellĂ€"] # 0x27d4 (en: 'upper left corner with dot', google: 'vasen ylĂ€kulma pisteellĂ€') + - "⟕": [T: "vasen ulkoinen liitos"] # 0x27d5 (google: 'vasen ulkoinen liittyminen') + - "⟖": [T: "oikea ulkoinen liitos"] # 0x27d6 (google: 'oikea ulkoinen liittyminen') + - "⟗": [T: "tĂ€ysi ulkoinen liitos"] # 0x27d7 (google: 'tĂ€ysi ulkoinen liittyminen') + - "⟘": [T: "suuri nupi ylöspĂ€in"] # 0x27d8 (google: 'suuri ylöspĂ€in') + - "⟙": [T: "suuri nupi alaspĂ€in"] # 0x27d9 (google: 'suuri alaspĂ€in') + - "⟚": [T: "tuplaportti vasemmalle ja oikealle"] # 0x27da (google: 'vasen ja oikea kaksoiskivi') + - "⟛": [T: "vasen ja oikea nupi"] # 0x27db (google: 'vasen ja oikea tarttuva') + - "⟜": [T: "vasen monikuvaus"] # 0x27dc (google: 'vasen multimep') # FI: meaning unclear + - "⟝": [T: "pitkĂ€ oikea nupi"] # 0x27dd (google: 'pitkĂ€ oikea tarttuva') + - "⟞": [T: "pitkĂ€ vasen nupi"] # 0x27de (google: 'pitkĂ€ vasen tarttuva') + - "⟟": [T: "nupi ylös ympyrĂ€llĂ€"] # 0x27df (en: 'up tack with circle above', google: 'yllĂ€ oleva ympyrĂ€') + - "⟠": [T: "vinoneliö vaakaviivalla"] # 0x27e0 (google: 'lozenge jaettuna vaakasuunnassa') + - "⟡": [T: "valkoinen terĂ€vĂ€ timantti"] # 0x27e1 (google: 'valkoinen koverapuolinen timantti') + - "⟱": [T: "valkoinen terĂ€vĂ€ timantti vasemmanpuoleisella nupilla"] # 0x27e2 (en: 'white concave sided diamond with leftwards tick', google: 'valkoinen koverapuolinen timantti vasemmalla rastilla') + - "⟣": [T: "valkoinen terĂ€vĂ€ timantti oikeanpuoleisella nupilla"] # 0x27e3 (en: 'white concave sided diamond with rightwards tick', google: 'valkoinen koverapuolinen timantti oikealla puolella') + - "⟀": [T: "valkoinen neliö vasemmanpuoleisella nupilla"] # 0x27e4 (en: 'white square with leftwards tick', google: 'valkoinen neliö vasemmalla rastilla') + - "⟄": [T: "valkoinen neliö oikeanpuoleisella nupilla"] # 0x27e5 (en: 'white square with rightwards tick', google: 'valkoinen neliö oikealla puolella') + - "⟩": [T: "valkoinen vasen hakasulku"] # 0x27e6 (en: 'left white square bracket', google: 'vasen valkoinen neliömĂ€ki') + - "⟧": [T: "valkoinen oikea hakasulku"] # 0x27e7 (en: 'right white square bracket', google: 'oikea valkoinen neliömĂ€ki') + - "⟹": [T: "vasen kulmasulku"] # 0x27e8 (en: 'left angle bracket', google: 'vasemman kulman kiinnike') + - "⟩": [T: "oikea kulmasulku"] # 0x27e9 (en: 'right angle bracket', google: 'suoren kulman kiinnike') + - "âŸȘ": [T: "vasen kaksoiskulmasulku"] # 0x27ea (en: 'left double angle bracket', google: 'vasen kaksoiskulma kiinnike') + - "⟫": [T: "oikea kaksoiskulmasulku"] # 0x27eb (en: 'right double angle bracket', google: 'oikea kaksoiskulma kiinnike') + - "⟬": [T: "vasen valkoinen kilpikonnankuorisulku"] # 0x27ec (google: 'vasen valkoinen kilpikonnakuoren kiinnike') + - "⟭": [T: "oikea valkoinen kilpikonnankuorisulku"] # 0x27ed (google: 'oikea valkoinen kilpikonnakuoren kiinnike') + - "⟼": [T: "vasen litistetty sulku"] # 0x27ee (google: 'vasen litistetty sulkuteesi') + - "⟯": [T: "oikea litistetty sulku"] # 0x27ef (google: 'oikea litistetty sulkuteesi') + - "⟰": [T: "nelinkertainen nuoli ylös"] # 0x27f0 (en: 'upwards quadruple arrow', google translation) + - "⟱": [T: "nelinkertainen nuoli alas"] # 0x27f1 (en: 'downwards quadruple arrow', google translation) + - "âŸČ": [T: "avoin ympyrĂ€nuoli vastapĂ€ivÀÀn"] # 0x27f2 (en: 'anticlockwise gapped circle arrow', google translation) + - "⟳": [T: "avoin ympyrĂ€nuoli myötĂ€pĂ€ivÀÀn"] # 0x27f3 (en: 'clockwise gapped circle arrow', google translation) + - "⟮": [T: "oikea nuoli ympyröidyllĂ€ plus-merkillĂ€"] # 0x27f4 (en: 'right arrow with circled plus', google translation) + - "⟔": [T: "pitkĂ€ nuoli vasemmalle"] # 0x27f5 (en: 'long leftwards arrow', google: 'pitkĂ€ vasen nuoli') + - "⟶": [T: "pitkĂ€ nuoli oikealle"] # 0x27f6 (en: 'long rightwards arrow', google: 'pitkĂ€ oikea nuoli') + - "⟷": [T: "pitkĂ€ nuoli vasemmalle ja oikealle"] # 0x27f7 (en: 'long left right arrow', google: 'pitkĂ€ vasen oikea nuoli') + - "⟾": [T: "pitkĂ€ kaksoisnuoli vasemmalle"] # 0x27f8 (en: 'long leftwards double arrow', google: 'pitkĂ€ vasen kaksinkertainen nuoli') + - "âŸč": [T: "pitkĂ€ kaksoisnuoli oikealle"] # 0x27f9 (en: 'long rightwards double arrow', google: 'pitkĂ€ oikea kaksinkertainen nuoli') + - "âŸș": [T: "pitkĂ€ kaksoisnuoli vasemmalle ja oikealle"] # 0x27fa (en: 'long left right double arrow', google: 'pitkĂ€ vasen oikea kaksinkertainen nuoli') + - "⟻": [T: "pitkĂ€ vasen nuoli pystyviivasta"] # 0x27fb (en: 'long leftwards arrow from bar', google translation) + - "⟌": [T: "pitkĂ€ oikea nuoli pystyviivasta"] # 0x27fc (en: 'long rightwards arrow from bar', google: 'pitkĂ€ oikea nuoli baarista') + - "⟜": [T: "pitkĂ€ vasen kaksinkertainen nuoli pystyviivasta"] # 0x27fd (en: 'long leftwards double arrow from bar', google translation) + - "⟟": [T: "pitkĂ€ oikea kaksinkertainen nuoli pystyviivasta"] # 0x27fe (en: 'long rightwards double arrow from bar', google translation) + - "⟿": [T: "pitkĂ€ kiemuranuoli oikealle"] # 0x27ff (en: 'long rightwards squiggle arrow', google: 'pitkĂ€ oikeassa nuoli') + - " ": [T: "oikea kaksipĂ€inen nuoli pystysuoralla viivalla"] # 0x2900 (en: 'rightwards two headed arrow with vertical stroke', google translation) + - " ": [T: "oikea kaksipĂ€inen nuoli kaksinkertaisella pystysuoralla viivalla"] # 0x2901 (en: 'rightwards two headed arrow with double vertical stroke', google translation) + - " ": [T: "vasen kaksinkertainen nuoli pystysuoralla viivalla"] # 0x2902 (en: 'leftwards double arrow with vertical stroke', google translation) + - " ": [T: "oikea kaksinkertainen nuoli pystysuoralla viivalla"] # 0x2903 (en: 'rightwards double arrow with vertical stroke', google translation) + - " ": [T: "vasemmalle ja oikealle osoittava kaksinkertainen nuoli pystysuoralla viivalla"] # 0x2904 (en: 'left right double arrow with vertical stroke', google translation) + - " ": [T: "oikea kaksipĂ€inen nuoli pystyviivasta"] # 0x2905 (google: 'oikealle kaksi pÀÀtĂ€ nuoli baarista') + - " ": [T: "vasen kaksinkertainen nuoli pystyviivasta"] # 0x2906 (en: 'leftwards double arrow from bar', google translation) + - " ": [T: "oikea kaksinkertainen nuoli pystyviivasta"] # 0x2907 (en: 'rightwards double arrow from bar', google translation) + - " ": [T: "alaspĂ€in osoittava nuoli vaakaviivalla"] # 0x2908 (en: 'downwards arrow with horizontal stroke', google translation) + - " ": [T: "ylöspĂ€in osoittava nuoli vaakaviivalla"] # 0x2909 (en: 'upwards arrow with horizontal stroke', google translation) + - " ": [T: "ylöspĂ€in osoittava kolminkertainen nuoli"] # 0x290a (en: 'upwards triple arrow', google translation) + - "​": [T: "alaspĂ€in osoittava kolminkertainen nuoli"] # 0x290b (en: 'downwards triple arrow', google translation) + - "‌": [T: "vasen kaksoiskatkoviivannuoli"] # 0x290c (google: 'vasen kaksinkertainen viiva nuoli') + - "‍": [T: "oikea kaksoiskatkoviivanuoli"] # 0x290d (google: 'oikealla puolella kaksoisnauhaa') + - "‎": [T: "vasen kolmoiskatkoviivanuoli"] # 0x290e (google: 'vasen kolminkertainen viiva nuoli') + - "‏": [T: "oikea kolmoiskatkoviivanuoli"] # 0x290f (google: 'oikealle kolminkertainen dash -nuoli') + - "‐": [T: "oikea kaksipĂ€inen katkoviivanuoli pyrstöllĂ€"] # 0x2910 (google: 'oikealle kaksi pÀÀtĂ€ kolminkertainen viiva nuoli') + - "‑": [T: "oikea pisteviivanuoli"] # 0x2911 (en: 'rightwards arrow with dotted stem', google: 'oikealla nuolella katkoviivalla') + - "‒": [T: "nuoli ylös vaakaviivaan"] # 0x2912 (google: 'nuoli ylöspĂ€in baariin') + - "–": [T: "nuoli alas vaakaviivaan"] # 0x2913 (google: 'alaspĂ€in nuoli baariin') + - "—": [T: "oikea nuoli pystyviivalla ja pyrstöllĂ€"] # 0x2914 (en: 'rightwards arrow with tail and vertical stroke', google translation) + - "―": [T: "oikea nuoli kaksoispystyviivalla ja pyrstöllĂ€"] # 0x2915 (en: 'rightwards arrow with tail and double vertical stroke', google translation) + - "‖": [T: "oikea kaksipĂ€inen nuoli pyrstöllĂ€"] # 0x2916 (en: 'rightwards two headed arrow with tail', google: 'oikealle kaksi pÀÀtĂ€ nuoli hĂ€nnĂ€n kanssa') + - "‗": [T: "oikea kaksipĂ€inen nuoli pystyviivalla ja pyrstöllĂ€"] # 0x2917 (en: 'rightwards two headed arrow with tail with vertical stroke', google translation) + - "‘": [T: "oikea kaksipĂ€inen nuoli kaksoispystyviivalla ja pyrstöllĂ€"] # 0x2918 (en: 'rightwards two headed arrow with tail with double vertical stroke', google translation) + - "’": [T: "vasemmanpuoleisen nuolen hĂ€ntĂ€"] # 0x2919 (google: 'vasen nuoli hĂ€ntĂ€') + - "‚": [T: "oikeanpuoleisen nuolen hĂ€ntĂ€"] # 0x291a (en: 'rightwards arrow tail', google translation) + - "‛": [T: "vasemmanpuoleisen nuolen tuplahĂ€ntĂ€"] # 0x291b (google: 'vasen kaksinkertainen nuoli hĂ€ntĂ€') + - "“": [T: "oikeanpuoleisen nuolen tuplahĂ€ntĂ€"] # 0x291c (google: 'oikealla kaksoisnuoli') + - "”": [T: "vasen nuoli vĂ€ritettyyn timanttiin"] # 0x291d (google: 'vasen nuoli tĂ€ytetylle timantille') + - "„": [T: "oikea nuoli vĂ€ritettyyn timanttiin"] # 0x291e (google: 'oikealla nuolella tĂ€ytetylle timantille') + - "‟": [T: "vasen nuoli pystyviivasta vĂ€ritettyyn timanttiin"] # 0x291f (google: 'vasen nuoli baarista tĂ€ytetylle timantille') + - "†": [T: "oikea nuoli pystyviivasta vĂ€ritettyyn timanttiin"] # 0x2920 (google: 'suoraan nuoli baarista tĂ€ytetylle timantille') + - "‥": [T: "ylĂ€vasemmalle ja alaoikealle osoittava nuoli"] # 0x2921 (en: 'north west and south east arrow', google translation) + - "‹": [T: "ylĂ€oikealle ja alavasemmalle osoittava nuoli"] # 0x2922 (en: 'north east and south west arrow', google translation) + - "‣": [T: "ylĂ€vasen nuoli koukulla"] # 0x2923 (en: 'north west arrow with hook', google: 'luoteis -nuoli koukulla') + - " ": [T: "ylĂ€oikea nuoli koukulla"] # 0x2924 (en: 'north east arrow with hook', google: 'koillis -nuoli koukulla') + - " ": [T: "alaoikea nuoli koukulla"] # 0x2925 (en: 'south east arrow with hook', google: 'kaakkois -nuoli koukulla') + - " ": [T: "alavasen nuoli koukulla"] # 0x2926 (en: 'south west arrow with hook', google: 'lounais -nuoli koukulla') + - "‧": [T: "nuoli ylĂ€oikealle ja nuoli ylĂ€vasemmalle"] # 0x2927 (google: 'luoteis arrow ja koillis -nuoli') + - "‚": [T: "nuoli ylĂ€oikealle ja nuoli alaoikealle"] # 0x2928 (google: 'koillis -nuoli ja kaakkois -nuoli') + - "
": [T: "nuoli alaoikealle ja nuoli alavasemmalle"] # 0x2929 (google: 'kaakkois arrow ja south west arrow') + - "â€Ș": [T: "nuoli alavasemmalle ja nuoli ylĂ€vasemmalle"] # 0x292a (google: 'south west arrow ja north west arrow') + - "‫": [T: "nouseva diagonaali laskevan diagonaalin pÀÀllĂ€"] # 0x292b (en: 'rising diagonal crossing falling diagonal', google translation) + - "‏": [T: "laskeva diagonaali nousevan diagonaalin pÀÀllĂ€"] # 0x292c (en: 'falling diagonal crossing rising diagonal', google translation) + - "‭": [T: "alaoikealle osoittava nuoli ylĂ€oikealle osoittavan nuolen pÀÀllĂ€"] # 0x292d (en: 'south east arrow crossing north east arrow', google translation) + - "‟": [T: "ylĂ€oikealle osoittava nuoli alaoikealle osoittavan nuolen pÀÀllĂ€"] # 0x292e (en: 'north east arrow crossing south east arrow', google translation) + - " ": [T: "laskeva diagonaali ylĂ€oikealle osoittavan nuolen pÀÀllĂ€"] # 0x292f (en: 'falling diagonal crossing north east arrow', google translation) + - "‰": [T: "nouseva diagonaali alaoikealle osoittavan nuolen pÀÀllĂ€"] # 0x2930 (en: 'rising diagonal crossing south east arrow', google translation) + - "‱": [T: "ylĂ€oikealle osoittava nuoli ylĂ€vasemmalle osoittavan nuolen pÀÀllĂ€"] # 0x2931 (en: 'north east arrow crossing north west arrow', google translation) + - "â€Č": [T: "ylĂ€vasemmalle osoittava nuoli ylĂ€oikealle osoittavan nuolen pÀÀllĂ€"] # 0x2932 (en: 'north west arrow crossing north east arrow', google translation) + - "″": [T: "aaltonuoli oikealle"] # 0x2933 (en: 'wave arrow pointing directly right', google: 'aalto nuoli osoittaa suoraan oikealle') + - "‎": [T: "ylöspĂ€in kaartuva oikea nuoli"] # 0x2934 (en: 'arrow pointing rightwards then curving upwards', google translation) + - "—": [T: "alaspĂ€in kaartuva oikea nuoli"] # 0x2935 (google: 'nuoli osoittaa oikealle ja kaareutuu alaspĂ€in') + - "‶": [T: "vasemmalle kaartuva alavasemmalle osoittava nuoli"] # 0x2936 (google: 'nuoli osoittaa alaspĂ€in ja kaareutuu vasemmalle') + - "‷": [T: "oikealle kaartuva alaoikealle osoittava nuoli"] # 0x2937 (google: 'nuoli osoittaa alaspĂ€in ja kaareutuu oikealle') + - "„": [T: "oikeanpuoleinen kaarinuoli myötĂ€pĂ€ivÀÀn"] # 0x2938 (en: 'right side arc clockwise arrow', google: 'oikea sivukaari myötĂ€pĂ€ivÀÀn nuoli') + - "â€č": [T: "vasemmanpuoleinen kaarinuoli vastapĂ€ivÀÀn"] # 0x2939 (en: 'left side arc anticlockwise arrow', google: 'vasen sivukaari vastapĂ€ivÀÀn') + - "â€ș": [T: "ylĂ€kaarinuoli vastapĂ€ivÀÀn"] # 0x293a (en: 'top arc anticlockwise arrow', google translation) + - "※": [T: "alakaarinuoli vastapĂ€ivÀÀn"] # 0x293b (en: 'bottom arc anticlockwise arrow', google translation) + - "‌": [T: "ylĂ€kaarinuoli myötĂ€pĂ€ivÀÀn miinus-merkillĂ€"] # 0x293c (en: 'top arc clockwise arrow with minus', google: 'ylĂ€kaari myötĂ€pĂ€ivÀÀn nuoli miinus') + - "“": [T: "ylĂ€kaarinuoli vastapĂ€ivÀÀn plus-merkillĂ€"] # 0x293d (en: 'top arc anticlockwise arrow with plus', google: 'ylĂ€kaari vastapĂ€ivÀÀn nuoli plus') + - "‟": [T: "alaoikea kaarinuoli myötĂ€pĂ€ivÀÀn"] # 0x293e (en: 'lower right semicircular clockwise arrow', google translation) + - "‿": [T: "alavasen kaarinuoli vastapĂ€ivÀÀn"] # 0x293f (en: 'lower left semicircular anticlockwise arrow', google translation) + - "â„€": [T: "suljettu ympyrĂ€nuoli vastapĂ€ivÀÀn"] # 0x2940 (en: 'anticlockwise closed circle arrow', google translation) + - "℁": [T: "suljettu ympyrĂ€nuoli myötĂ€pĂ€ivÀÀn"] # 0x2941 (en: 'clockwise closed circle arrow', google translation) + - "â„‚": [T: "oikea nuoli lyhyen vasemman nuolen ylĂ€puolella"] # 0x2942 (en: 'rightwards arrow above short leftwards arrow', google translation) + - "℃": [T: "vasen nuoli lyhyen oikean nuolen ylĂ€puolella"] # 0x2943 (en: 'leftwards arrow above short rightwards arrow', google translation) + - "â„„": [T: "lyhyt oikea nuoli vasemman nuolen ylĂ€puolella"] # 0x2944 (en: 'short rightwards arrow above leftwards arrow', google translation) + - "â„…": [T: "oikea nuoli ja plus-merkki alapuolella"] # 0x2945 (en: 'rightwards arrow with plus below', google: 'oikealla nuolella, jonka alla on plus') + - "℆": [T: "vasen nuoli ja plus-merkki alanpuolella"] # 0x2946 (en: 'leftwards arrow with plus below', google translation) + - "ℇ": [T: "oikea nuoli x:n lĂ€pi"] # 0x2947 (en: 'rightwards arrow through x', google translation) + - "℈": [T: "oikealle ja vasemmalle osoittava nuoli ympyrĂ€n lĂ€pi"] # 0x2948 (google: 'vasen oikea nuoli ympyrĂ€n lĂ€pi') + - "℉": [T: "ylöspĂ€in osoittava kaksipĂ€inen nuoli ympyrĂ€stĂ€"] # 0x2949 (google: 'ylöspĂ€in kaksi pÀÀistĂ€ nuolta ympyrĂ€stĂ€') + - "ℊ": [T: "oikealle ja vasemmalle osoittava puolinuoli oikealla ylĂ€piikillĂ€ ja vasemmalla alapiikillĂ€"] # 0x294a (google: 'vasen barb ylös oikealle barb down harpoon') + - "â„‹": [T: "oikealle ja vasemmalle osoittava puolinuoli oikealla alapiikillĂ€ ja vasemmalle ylĂ€piikillĂ€"] # 0x294b (google: 'vasen barb alas oikealla barb up harpoon') + - "ℌ": [T: "ylös ja alas osoittava puolinuoli oikealla ylĂ€piikillĂ€ ja vasemmalla alapiikillĂ€"] # 0x294c (en: 'up barb right down barb left harpoon', google translation) + - "ℍ": [T: "ylös ja alas osoittava puolinuoli vasemmalla ylĂ€piikillĂ€ ja oikealla alapiikillĂ€"] # 0x294d (en: 'up barb left down barb right harpoon', google translation) + - "ℎ": [T: "oikealle ja vasemmalle osoittava puolinuoli, piikit ylĂ€puolella"] # 0x294e (en: 'left barb up right barb up harpoon', google: 'vasen barb ylös oikealle barb up harpoon') + - "ℏ": [T: "ylös ja alas osoittava puolinuoli, piikit oikealla"] # 0x294f (en: 'up barb right down barb right harpoon', google: 'ylös barb oikealla barbilla oikealla harpoonilla') + - "ℐ": [T: "oikealle ja vasemmalle osoittava puolinuoli, piikit alapuolella"] # 0x2950 (en: 'left barb down right barb down harpoon', google: 'vasen barb alas oikealla barb down harpoon') + - "â„‘": [T: "ylös ja alas osoittava puolinuoli, piikit vasemmalla"] # 0x2951 (en: 'up barb left down barb left harpoon', google: 'ylös barb vasemmalle barb vasen harpooni') + - "â„’": [T: "vasemmalle osoittava puolinuoli pystyviivaan, piikki ylĂ€puolella"] # 0x2952 (en: 'leftwards harpoon with barb up to bar', google: 'vasen harppuuna barbin kanssa baariin') + - "â„“": [T: "oikealle osoittava puolinuoli pystyviivaan, piikki ylĂ€puolella"] # 0x2953 (en: 'rightwards harpoon with barb up to bar', google: 'oikea harpoon barbin kanssa baariin') + - "â„”": [T: "ylös osoittava puolinuoli vaakaviivaan, piikki oikealla"] # 0x2954 (en: 'upwards harpoon with barb right to bar', google: 'ylöspĂ€in harppuun barbin oikealla baarilla') + - "â„•": [T: "alas osoittava puolinuoli vaakaviivaan, piikki oikealla"] # 0x2955 (en: 'downwards harpoon with barb right to bar', google: 'downward harpoon barbin oikealla baarilla') + - "â„–": [T: "vasemmalle osoittava puolinuoli pystyviivaan, piikki alapuolella"] # 0x2956 (en: 'leftwards harpoon with barb down to bar', google: 'vasen harppuuna barbin kanssa baariin') + - "â„—": [T: "oikealle osoittava puolinuoli pystyviivaan, piikki alapuolella"] # 0x2957 (en: 'rightwards harpoon with barb down to bar', google: 'oikea harpoon barbin kanssa baariin') + - "℘": [T: "ylös osoittava puolinuoli vaakaviivaan, piikki vasemmalla"] # 0x2958 (en: 'upwards harpoon with barb left to bar', google: 'ylös harppuon barbin kanssa vasemmalle baariin') + - "â„™": [T: "alas osoittava puolinuoli vaakaviivaan, piikki vasemmalla"] # 0x2959 (en: 'downwards harpoon with barb left to bar', google: 'downward harpoon barbin kanssa vasemmalle baariin') + - "ℚ": [T: "vasemmalle osoittava puolinuoli vaakaviivasta, piikki ylĂ€puolella"] # 0x295a (en: 'leftwards harpoon with barb up from bar', google: 'vasen harppuuna barb ylös baarista') + - "â„›": [T: "oikealle osoittava puolinuoli vaakaviivasta, piikki ylĂ€puolella"] # 0x295b (en: 'rightwards harpoon with barb up from bar', google: 'oikealla harppuuna barbin kanssa baarista') + - "ℜ": [T: "ylöspĂ€in osoittava puolinuoli vaakaviivasta, piikki oikealla"] # 0x295c (en: 'upwards harpoon with barb right from bar', google: 'ylöspĂ€in harppuun barbin kanssa heti baarista') + - "ℝ": [T: "alaspĂ€in osoittava puolinuoli vaakaviivasta, piikki oikealla"] # 0x295d (en: 'downwards harpoon with barb right from bar', google: 'downward harpoon barbin kanssa heti baarista') + - "℞": [T: "vasemmalle osoittava puolinuoli vaakaviivasta, piikki alapuolella"] # 0x295e (en: 'leftwards harpoon with barb down from bar', google: 'vasen harppuuna barbin kanssa baarista') + - "℟": [T: "oikealle osoittava puolinuoli vaakaviivasta, piikki alapuolella"] # 0x295f (en: 'rightwards harpoon with barb down from bar', google: 'oikea harpoon barbin kanssa baarista') + - "â„ ": [T: "ylöspĂ€in osoittava puolinuoli vaakaviivasta, piikki vasemmalla"] # 0x2960 (en: 'upwards harpoon with barb left from bar', google: 'ylös harppuun barbin vasemmalla baarista') + - "℥": [T: "alaspĂ€in osoittava puolinuoli vaakaviivasta, piikki vasemmalla"] # 0x2961 (en: 'downwards harpoon with barb left from bar', google: 'downward harpoon barbin vasemmalla baarista') + - "ℹ": [T: "vasemmalle osoittava puolinuolipari"] # 0x2962 (en: 'leftwards harpoon with barb up above leftwards harpoon with barb down', google: 'vasen harppuuna barb ylös vasemmanpuoleisen harpoonin ylĂ€puolella barb down') + - "℣": [T: "ylöspĂ€in osoittava puolinuolipari"] # 0x2963 (en: 'upwards harpoon with barb left beside upwards harpoon with barb right', google: 'ylĂ€puolella harppuunia vasemmalla vasemmalla harpoon vieressĂ€ barbilla oikealla') + - "â„€": [T: "oikealle osoittava puolinuolipari"] # 0x2964 (en: 'rightwards harpoon with barb up above rightwards harpoon with barb down', google: 'oikealla harpoonilla barb ylös oikeanpuoleisen harpoonin ylĂ€puolella barb down') + - "â„„": [T: "alaspĂ€in osoittava puolinuolipari"] # 0x2965 (en: 'downwards harpoon with barb left beside downwards harpoon with barb right', google: 'downwards harpoon vasemmalla vasemmalla harppuunan vieressĂ€ barbilla oikealla') + - "ℊ": [T: "vasen puolinuoli piikki ylös ja alapuolella oikea puolinuoli piikki ylös"] # 0x2966 (en: 'leftwards harpoon with barb up above rightwards harpoon with barb up', google: 'vasen harppuuna barb ylös oikeanpuoleisen harpoonin ylĂ€puolella barb up') + - "â„§": [T: "vasen puolinuoli piikki alas ja alapuolella oikea puolinuoli piikki ylös"] # 0x2967 (en: 'leftwards harpoon with barb down above rightwards harpoon with barb down', google: 'vasen harppuuna barb alas oikeanpuoleisen harpoonin ylĂ€puolella barb down') + - "ℚ": [T: "oikea puolinuoli piikki ylös ja alapuolella vasen puolinuoli piikki ylös"] # 0x2968 (en: 'rightwards harpoon with barb up above leftwards harpoon with barb up', google: 'oikealla harpounalla barb ylös vasemmanpuoleisen harpoonin ylĂ€puolella barb up') + - "â„©": [T: "oikea puolinuoli piikki alas ja alapuolella vasen puolinuoli piikki alas"] # 0x2969 (en: 'rightwards harpoon with barb down above leftwards harpoon with barb down', google: 'oikealla harpounalla barbin kanssa vasemmanpuoleisen harpoonin ylĂ€puolella barb down') + - "â„Ș": [T: "vasen puolinuoli piikki ylös vaakaviivan ylĂ€puolella"] # 0x296a (en: 'leftwards harpoon with barb up above long dash', google: 'vasen harppuuna barb ylös pitkĂ€n viivan ylĂ€puolella') + - "â„«": [T: "vasen puolinuoli piikki alas vaakaviivan alapuolella"] # 0x296b (en: 'leftwards harpoon with barb down below long dash', google: 'vasen harppuuna barbin alapuolella pitkĂ€n viivan alapuolella') + - "ℏ": [T: "oikea puolinuoli piikki ylös vaakaviivan ylĂ€puolella"] # 0x296c (en: 'rightwards harpoon with barb up above long dash', google: 'oikealla harppuunilla barb up long dashin ylĂ€puolella') + - "â„­": [T: "oikea puolinuoli piikki alas vaakaviivan alapuolella"] # 0x296d (en: 'rightwards harpoon with barb down below long dash', google: 'oikealla harppuuna barbin alapuolella pitkĂ€n viivan alapuolella') + - "℟": [T: "ylös ja alas osoittava puolinuolipari"] # 0x296e (en: 'upwards harpoon with barb left beside downwards harpoon with barb right', google: 'ylös harppuunaa vasemmalla vasemmalla harpoonin vieressĂ€ barbilla oikealla') + - "ℯ": [T: "alas ja ylös osoittava puolinuolipari"] # 0x296f (en: 'downwards harpoon with barb left beside upwards harpoon with barb right', google: 'downwards harpoon vasemmalla vasemmalla harppuunin vieressĂ€ barbilla oikealla') + - "â„°": [T: "oikea tuplanuoli pyöristetyllĂ€ ylĂ€puolella"] # 0x2970 (en: 'right double arrow with rounded head', google: 'oikea kaksinkertainen nuoli pyöristetyllĂ€ pÀÀn kanssa') + - "ℱ": [T: "yhtĂ€ suuri kuin oikean nuolen ylĂ€puolella"] # 0x2971 (google: 'vastaa oikeanpuoleista nuolta') + - "â„Č": [T: "tilde oikean nuolen ylĂ€puolella"] # 0x2972 (google: 'tilde -operaattori oikeanpuoleisen nuolen ylĂ€puolella') + - "ℳ": [T: "vasen nuoli tilden ylĂ€puolella"] # 0x2973 (en: 'leftwards arrow above tilde operator', google: 'vasen nuoli tilde -operaattorin ylĂ€puolella') + - "ℎ": [T: "oikea nuoli tilden ylĂ€puolella"] # 0x2974 (en: 'rightwards arrow above tilde operator', google: 'oikealla nuolella tilde -operaattorin ylĂ€puolella') + - "â„”": [T: "oikea nuoli melkein yhtĂ€ suuri kuin ylĂ€puolella"] # 0x2975 (google: 'oikea nuoli ylĂ€puolelle melkein yhtĂ€ suuri kuin') + - "â„¶": [T: "pienempi kuin vasemman nuolen ylĂ€puolella"] # 0x2976 (google: 'alle kuin vasemmanpuoleinen nuoli') + - "â„·": [T: "vasen nuoli pienempi kuin pÀÀllĂ€"] # 0x2977 (en: 'leftwards arrow through less than', google translation) + - "℞": [T: "suurempi kuin oikean nuolen ylĂ€puolella"] # 0x2978 (google: 'suurempi kuin oikeanpuoleinen nuoli') + - "â„č": [T: "osajoukko oikean nuolen ylĂ€puolella"] # 0x2979 (google: 'oikeanpuoleinen nuolen ylĂ€puolella') + - "â„ș": [T: "vasen nuoli osajoukon pÀÀllĂ€"] # 0x297a (en: 'leftwards arrow through subset', google translation) + - "â„»": [T: "ylijoukko vasemman nuolen ylĂ€puolella"] # 0x297b (google: 'superset vasemmanpuoleisen nuolen ylĂ€puolella') + - "ℌ": [T: "vasen kalanpyrstö"] # 0x297c (google: 'vasen kala hĂ€ntĂ€') + - "ℜ": [T: "oikea kalanpyrstö"] # 0x297d (google: 'oikea kala hĂ€ntĂ€') + - "℟": [T: "ylöspĂ€in osoittava kalanpyrstö"] # 0x297e (en: 'up fish tail', google: 'ylös kalanhĂ€ntĂ€') + - "ℿ": [T: "alaspĂ€in osoittava kalanpyrstö"] # 0x297f (google: 'alas kalan hĂ€nnĂ€') + - "⩀": [T: "kolminkertainen pystysuora palkki"] # 0x2980 (en: 'triple vertical bar delimiter', google translation) + - "⊁": [T: "Z-notaatio piste"] # 0x2981 (en: 'z notation spot', google translation) + - "⩂": [T: "Z-notaatio kaksoispiste"] # 0x2982 (en: 'z notation type colon', google translation) + - "⊃": [T: "vasen valkoinen aaltosulku"] # 0x2983 (en: 'left white brace', google translation) + - "⩄": [T: "oikea valkoinen aaltosulku"] # 0x2984 (en: 'right white brace', google translation) + - "⩅": [T: "vasen valkoinen kaarisulku"] # 0x2985 (en: 'left white parenthesis', google: 'vasen valkoinen sulkuteesi') + - "⩆": [T: "oikea valkoinen kaarisulku"] # 0x2986 (en: 'right white parenthesis', google: 'oikea valkoinen sulkuteesi') + - "⩇": [T: "Z-notaatio vasen kuva sulku"] # 0x2987 (en: 'z notation left image bracket', google translation) + - "⊈": [T: "Z-notaatio oikea kuva sulku"] # 0x2988 (en: 'z notation right image bracket', google translation) + - "⩉": [T: "Z-notaatio vasen sitova sulku"] # 0x2989 (google: 'z -merkintĂ€ jĂ€tti sitovan kiinnikkeen') + - "⩊": [T: "Z-notaatio oikea sitova sulku"] # 0x298a (google: 'z -merkintĂ€ oikea sitova kiinnike') + - "⩋": [T: "vasen hakasulku alaviivalla"] # 0x298b (en: 'left square bracket with underbar', google: 'vasen neliökiinnike alapalkin kanssa') + - "⩌": [T: "oikea hakasulku alaviivalla"] # 0x298c (en: 'right square bracket with underbar', google: 'oikea neliökiinnike alapalkin kanssa') + - "⊍": [T: "vasen hakasulku viivalla ylĂ€nurkassa"] # 0x298d (en: 'left square bracket with tick in top corner', google: 'vasen neliö kiinnike, punkki ylĂ€kulmassa') + - "⊎": [T: "oikea hakasulku viivalla alanurkassa"] # 0x298e (en: 'right square bracket with tick in bottom corner', google: 'oikea neliökiinnike, jossa punkki alakulmassa') + - "⊏": [T: "vasen hakasulku viivalla alanurkassa"] # 0x298f (en: 'left square bracket with tick in bottom corner', google: 'vasen neliö kiinnike, punkki alakulmassa') + - "⊐": [T: "oikea hakasulku viivalla ylĂ€nurkassa"] # 0x2990 (en: 'right square bracket with tick in top corner', google: 'oikea neliö kiinnike, punkki ylĂ€kulmassa') + - "⩑": [T: "vasen kulmasulku pisteellĂ€"] # 0x2991 (en: 'left angle bracket with dot', google: 'vasemman kulman kiinnike pisteellĂ€') + - "⩒": [T: "oikea kulmasulku pisteellĂ€"] # 0x2992 (en: 'right angle bracket with dot', google: 'suoren kulman kiinnike pisteellĂ€') + - "⩓": [T: "vasen kaari pienempi kuin sulku"] # 0x2993 (google: 'vasen kaari vĂ€hemmĂ€n kuin kiinnike') + - "⩔": [T: "oikea kaari suurempi kuin sulku"] # 0x2994 (google: 'oikea kaari suurempi kuin kiinnike') + - "⩕": [T: "vasen kaksoiskaari suurempi kuin sulku"] # 0x2995 (google: 'kaksinkertainen vasen kaari on suurempi kuin kiinnike') + - "⩖": [T: "oikea kaksoiskaari pienempi kuin sulku"] # 0x2996 (google: 'kaksinkertainen oikea kaari vĂ€hemmĂ€n kuin kiinnike') + - "⩗": [T: "vasen musta kilpikonnankuorisulku"] # 0x2997 (en: 'left black tortoise shell bracket', google translation) + - "⊘": [T: "oikea musta kilpikonnakuorisulku"] # 0x2998 (en: 'right black tortoise shell bracket', google translation) + - "⩙": [T: "pistetty aita"] # 0x2999 (en: 'dotted fence', google translation) + - "⩚": [T: "pystysuora siksak-viiva"] # 0x299a (google: 'pystysuora siksak -linja') + - "⩛": [T: "vasemmalle avautuva mitattu kulma"] # 0x299b (en: 'measured angle opening left', google translation) + - "⩜": [T: "neliöllĂ€ merkitty suora kulma"] # 0x299c (en: 'right angle variant with square', google translation) + - "⊝": [T: "kaarella merkitty suora kulma"] # 0x299d (en: 'measured right angle with dot', google: 'mitattu oikea kulma pisteellĂ€') + - "⊞": [T: "kulma, jonka sisĂ€llĂ€ on s"] # 0x299e (en: 'angle with s inside', google translation) + - "⩟": [T: "terĂ€vĂ€ kulma"] # 0x299f (en: 'acute angle', google translation) + - "⊠": [T: "vasemmalle avautuva pallomainen kulma"] # 0x29a0 (en: 'spherical angle opening left', google translation) + - "⊥": [T: "ylös avautuva pallomainen kulma"] # 0x29a1 (en: 'spherical angle opening up', google translation) + - "⊹": [T: "kÀÀnnetty kulma"] # 0x29a2 (en: 'turned angle', google translation) + - "⊣": [T: "kÀÀnteinen kulma"] # 0x29a3 (en: 'reversed angle', google translation) + - "⊀": [T: "kulma alaviivalla"] # 0x29a4 (en: 'angle with underbar', google: 'kulma alapalkin kanssa') + - "⊄": [T: "kÀÀnnetty kulma alaviivalla"] # 0x29a5 (en: 'reversed angle with underbar', google: 'kÀÀnnetty kulma alapalkin kanssa') + - "⊊": [T: "ylöspĂ€in avautuva viisto kulma"] # 0x29a6 (google: 'vino kulma avautuu') + - "⊧": [T: "alaspĂ€in avautuva viisto kulma"] # 0x29a7 (google: 'vino kulma avautuu') + - "⊚": [T: "mitattu kulma, jossa ylĂ€oikealle osoittava nuoli"] # 0x29a8 (en: 'measured angle with open arm ending in arrow pointing up and to the right', google: 'mitattu kulma, kun avoin kĂ€sivarsi pÀÀttyy nuoleen osoittaen ylös ja oikealle') + - "⊩": [T: "mitattu kulma, jossa ylĂ€vasemmalle osoittava nuoli"] # 0x29a9 (en: 'measured angle with open arm ending in arrow pointing up and to the left', google: 'mitattu kulma, jonka avoin kĂ€sivarsi pÀÀttyy nuoleen osoittaen ylös ja vasemmalle') + - "âŠȘ": [T: "mitattu kulma, jossa alaoikealle osoittava nuoli"] # 0x29aa (en: 'measured angle with open arm ending in arrow pointing down and to the right', google: 'mitattu kulma, kun avoin kĂ€sivarsi pÀÀttyy nuolessa alaspĂ€in ja oikealle') + - "⊫": [T: "mitattu kulma, jossa alavasemmalle osoittava nuoli"] # 0x29ab (en: 'measured angle with open arm ending in arrow pointing down and to the left', google: 'mitattu kulma, kun avoin kĂ€sivarsi pÀÀttyy nuolessa alaspĂ€in ja vasemmalle') + - "⊏": [T: "mitattu kulma, jossa oikealle ja ylös osoittava nuoli"] # 0x29ac (en: 'measured angle with open arm ending in arrow pointing right and up', google: 'mitattu kulma, kun avoin kĂ€sivarsi pÀÀttyy nuoleen osoittaen oikealle ja ylöspĂ€in') + - "⊭": [T: "mitattu kulma, jossa vasemmalle ja ylös osoittava nuoli"] # 0x29ad (en: 'measured angle with open arm ending in arrow pointing left and up', google: 'mitattu kulma, jonka avoin kĂ€sivarsi pÀÀttyy nuoleen osoittaen vasemmalle ja ylöspĂ€in') + - "⊟": [T: "mitattu kulma, jossa oikealle ja alas osoittava nuoli"] # 0x29ae (en: 'measured angle with open arm ending in arrow pointing right and down', google: 'mitattu kulma, kun avoin kĂ€sivarsi pÀÀttyy nuoleen osoittaen oikealle ja alas') + - "⊯": [T: "mitattu kulma, jossa vasemmalle ja alas osoittava nuoli"] # 0x29af (en: 'measured angle with open arm ending in arrow pointing left and down', google: 'mitattu kulma, jonka nuolessa pÀÀttyy avoimeen kĂ€sivarteen, osoittaen vasemmalle ja alas') + - "⊰": [T: "kÀÀnnetty tyhjĂ€ joukko"] # 0x29b0 (google: 'kÀÀntynyt tyhjĂ€ sarja') + - "⊱": [T: "tyhjĂ€ joukko ylĂ€viivalla"] # 0x29b1 (en: 'empty set with overbar', google: 'tyhjĂ€ sarja ylikuormituksella') + - "âŠČ": [T: "tyhjĂ€ joukko ja pieni ympyrĂ€ ylĂ€puolella"] # 0x29b2 (en: 'empty set with small circle above', google: 'tyhjĂ€ sarja, jossa on pieni ympyrĂ€ yllĂ€') + - "⊳": [T: "tyhjĂ€ joukko ja oikea nuoli ylĂ€puolella"] # 0x29b3 (en: 'empty set with right arrow above', google: 'tyhjĂ€ sarja oikealla nuolella yllĂ€') + - "⊎": [T: "tyhjĂ€ joukko ja vasen nuoli ylĂ€puolella"] # 0x29b4 (en: 'empty set with left arrow above', google: 'tyhjĂ€ sarja vasemmalla nuolella yllĂ€') + - "⊔": [T: "vaakaviivallinen ympyrĂ€"] # 0x29b5 (en: 'circle with horizontal bar', google: 'ympyrĂ€ vaakasuuntaisella palkilla') + - "⊶": [T: "ympyröity pystyviiva"] # 0x29b6 (google: 'ympyrĂ€ pystysuora palkki') + - "⊷": [T: "ympyröidyt samansuuntaiset pystyviivat"] # 0x29b7 (google: 'ympyröi rinnakkain') + - "⊞": [T: "ympyröity kenoviiva"] # 0x29b8 (en: 'circled reverse solidus', google translation) + - "âŠč": [T: "ympyröity kohtisuoruusmerkki"] # 0x29b9 (google: 'ympyrĂ€si kohtisuorassa') + - "âŠș": [T: "ympyrĂ€, joka on jaettu vaakaviivalla ja ylĂ€puolisko on jaettu pystyviivalla"] # 0x29ba (en: 'circled divided by horizontal bar and top half divided by vertical bar', google translation) + - "⊻": [T: "ympyrĂ€ ja x pÀÀllekkĂ€in"] # 0x29bb (en: 'circle with superimposed x', google: 'ympyrĂ€ pÀÀllekkĂ€in x') + - "⊌": [T: "ympyröity vastapĂ€ivÀÀn kÀÀnnetty jakomerkki"] # 0x29bc (en: 'circled anticlockwise rotated division sign', google: 'ympyröity vastapĂ€ivÀÀn kierretty jakomerkki') + - "⊜": [T: "nuoli ympyrĂ€n lĂ€pi"] # 0x29bd (en: 'up arrow through circle', google translation) + - "⊟": [T: "ympyröity valkoinen pieni ympyrĂ€"] # 0x29be (google: 'ympyrĂ€valkoinen luoti') + - "⊿": [T: "ympyröity pieni ympyrĂ€"] # 0x29bf (google: 'ympyrĂ€ luoti') + - "⧀": [T: "ympyröity pienempi kuin"] # 0x29c0 (google: 'ympyrĂ€si vĂ€hemmĂ€n kuin') + - "⧁": [T: "ympyröity suurempi kuin"] # 0x29c1 (google: 'ympyrĂ€si suurempi kuin') + - "⧂": [T: "ympyrĂ€ ja pieni ympyrĂ€ oikealla"] # 0x29c2 (en: 'circle with small circle to the right', google: 'ympyrĂ€ pienellĂ€ ympyrĂ€llĂ€ oikealla') + - "⧃": [T: "ympyrĂ€ ja kaksi vaakaviivaa oikealla"] # 0x29c3 (en: 'circle with two horizontal strokes to the right', google: 'ympyrĂ€ kahdella vaakasuuntaisella iskulla oikealle') + - "⧄": [T: "neliöity kasvava diagonaalinen viiva"] # 0x29c4 (google: 'neliö nousevat diagonaaliset viiva') + - "⧅": [T: "neliöity laskeva diagonaalinen viiva"] # 0x29c5 (google: 'neliö putoava diagonaalinen viiva') + - "⧆": [T: "neliö tĂ€hdellĂ€"] # 0x29c6 (en: 'squared asterisk', google translation) + - "⧇": [T: "neliöity pieni ympyrĂ€"] # 0x29c7 (en: 'squared small circle', google translation) + - "⧈": [T: "neliöity pieni neliö"] # 0x29c8 (en: 'squared square', google translation) + - "⧉": [T: "kaksi limittĂ€istĂ€ neliötĂ€"] # 0x29c9 (google: 'kaksi liittyi neliötĂ€') + - "⧊": [T: "kolmio ja piste ylĂ€puolella"] # 0x29ca (en: 'triangle with dot above', google translation) + - "⧋": [T: "kolmio ja vaakaviiva alapuolella"] # 0x29cb (en: 'triangle with underbar', google translation) + - "⧌": [T: "s kolmiossa"] # 0x29cc (en: 's in triangle', google translation) + - "⧍": [T: "kolmio, jonka pohjassa serif"] # 0x29cd (en: 'triangle with serifs at bottom', google: 'kolmio alaosassa') + - "⧎": [T: "oikea kolmio vasemman kolmion ylĂ€puolella"] # 0x29ce (google: 'oikea kolmio vasemman kolmion ylĂ€puolella') + - "⧏": [T: "vasen kolmio pystyviivan vieressĂ€"] # 0x29cf (en: 'left triangle beside vertical bar', google: 'vasen kolmio pystysuoran palkin vieressĂ€') + - "⧐": [T: "pystyviiva oikean kolmion vieressĂ€"] # 0x29d0 (en: 'vertical bar beside right triangle', google: 'pystysuora palkki oikean kolmion vieressĂ€') + - "⧑": [T: "rusetti, jonka vasen puoli musta"] # 0x29d1 (en: 'bowtie with left half black', google translation) + - "⧒": [T: "rusetti, jonka oikea puoli musta"] # 0x29d2 (en: 'bowtie with right half black', google translation) + - "⧓": [T: "musta rusetti"] # 0x29d3 (en: 'black bowtie', google translation) + - "⧔": [T: "puolirusetti, jonka vasen puoli musta"] # 0x29d4 (en: 'times with left half black', google translation) + - "⧕": [T: "puolirusetti, jonka oikea puoli musta"] # 0x29d5 (en: 'times with right half black', google translation) + - "⧖": [T: "valkoinen tiimalasi"] # 0x29d6 (en: 'white hourglass', google translation) + - "⧗": [T: "musta tiimalasi"] # 0x29d7 (en: 'black hourglass', google translation) + - "⧘": [T: "vasen kiemurteleva viiva"] # 0x29d8 (en: 'left wiggly fence', google translation) + - "⧙": [T: "oikea kiemurteleva viiva"] # 0x29d9 (en: 'right wiggly fence', google translation) + - "⧚": [T: "vasen kaksinkertainen kiemurteleva viiva"] # 0x29da (en: 'left double wiggly fence', google: 'vasen kaksinkertainen aita') + - "⧛": [T: "oikea kaksinkertainen kiemurteleva viiva"] # 0x29db (en: 'right double wiggly fence', google: 'oikea kaksinkertainen aita') + - "⧜": [T: "epĂ€tĂ€ydellinen ÀÀrettömyys"] # 0x29dc (google: 'epĂ€tĂ€ydellinen ÀÀrettömyys') + - "⧝": [T: "yhdistetty ÀÀrettömyys"] # 0x29dd (en: 'tie over infinity', google translation) + - "⧞": [T: "ÀÀrettömyys negatoitu pystyviivalla"] # 0x29de (en: 'infinity negated with vertical bar', google: 'ÀÀrettömyys kielsi pystysuoralla palkilla') + - "⧟": [T: "kaksipĂ€inen monikuvaus"] # 0x29df (en: 'double-ended multimap', google translation) # FI: "multimap", "monikuvaus" translation questionable + - "â§ ": [T: "neliö korostetuilla ÀÀreviivoilla"] # 0x29e0 (en: 'square with contoured outline', google translation) + - "â§Ą": [T: "kasvaa suhteessa"] # 0x29e1 (en: 'increases as', google translation) + - "â§ą": [T: "sekoitetulo"] # 0x29e2 (en: 'shuffle product', google translation) + - "â§Ł": [T: "on yhtĂ€ suuri kuin kahdella vinolla yliviivalla"] # 0x29e3 (google: 'vastaa merkkiĂ€ ja viistot rinnakkain') + - "â§€": [T: "on yhtĂ€ suuri kuin kahdella vinolla yliviivalla ja tilde ylĂ€puolella"] # 0x29e4 (en: 'equals sign and slanted parallel with tilde above', google: 'vastaa merkkiĂ€ ja viistot yhdensuuntaisen kanssa tilden kanssa yllĂ€') + - "â§„": [T: "identtinen kuin kahdella vinolla yliviivalla"] # 0x29e5 (en: 'identical to and slanted parallel', google: 'identtinen ja vino rinnakkain') + - "â§Š": [T: "tautologisesti ekvivalentti"] # 0x29e6 (google translation) + - "â§§": [T: "termodynaaminen"] # 0x29e7 (en: 'thermodynamic', google translation) + - "â§š": [T: "alaspĂ€in osoittava kolmio ja vasen puoli musta"] # 0x29e8 (en: 'down pointing triangle with left half black', google translation) + - "â§©": [T: "alaspĂ€in osoittava kolmio ja oikea puoli musta"] # 0x29e9 (en: 'down pointing triangle with right half black', google translation) + - "â§Ș": [T: "musta timantti alas osoittavalla nuolella"] # 0x29ea (en: 'black diamond with down arrow', google translation) + - "â§«": [T: "musta vinoneliö"] # 0x29eb (en: 'black lozenge', google: 'musta lozenge') + - "â§Ź": [T: "valkoinen ympyrĂ€ alaspĂ€in osoittavalla nuolella"] # 0x29ec (en: 'white circle with down arrow', google translation) + - "â§­": [T: "musta ympyrĂ€ alaspĂ€in osoittavalla nuolella"] # 0x29ed (en: 'black circle with down arrow', google translation) + - "â§ź": [T: "valkoinen neliö virheviivoilla"] # 0x29ee (en: 'error-barred white square', google translation) + - "â§Ż": [T: "musta neliö virheviivoilla"] # 0x29ef (en: 'error-barred black square', google translation) + - "â§°": [T: "valkoinen timantti virheviivoilla"] # 0x29f0 (en: 'error-barred white diamond', google translation) + - "â§±": [T: "musta timantti virheviivoilla"] # 0x29f1 (en: 'error-barred black diamond', google translation) + - "â§Č": [T: "valkoinen ympyrĂ€ virheviivoilla"] # 0x29f2 (en: 'error-barred white circle', google translation) + - "â§ł": [T: "musta ympyrĂ€ virheviivoilla"] # 0x29f3 (en: 'error-barred black circle', google translation) + - "â§Ž": [T: "viivĂ€stetty sÀÀntö"] # 0x29f4 (en: 'rule-delayed', google: 'sÀÀntöviitettu') + - "â§”": [T: "kenoviiva"] # 0x29f5 (en: 'reverse solidus operator', google translation) + - "â§¶": [T: "vinoviiva ylĂ€viivalla"] # 0x29f6 (en: 'solidus with overbar', google: 'solidus ylikuormituksen kanssa') + - "â§·": [T: "kenoviiva poikkiviivalla"] # 0x29f7 (en: 'reverse solidus with horizontal stroke', google translation) + - "â§ž": [T: "iso vinoviiva"] # 0x29f8 (google translation) + - "â§č": [T: "iso kenoviiva"] # 0x29f9 (en: 'big reverse solidus', google translation) + - "â§ș": [T: "kaksinkertainen plus"] # 0x29fa (en: 'double plus', google translation) + - "â§»": [T: "kolminkertainen plus"] # 0x29fb (google translation) + - "â§Œ": [T: "vasemmalle osoittava kaareva kulmahakasulku"] # 0x29fc (en: 'left pointing curved angle bracket', google translation) + - "â§œ": [T: "oikealle osoittava kaareva kulmahakasulku"] # 0x29fd (en: 'right pointing curved angle bracket', google translation) + - "â§Ÿ": [T: "tiny"] # 0x29fe (en: 'tiny', google translation) + - "â§ż": [T: "miny"] # 0x29ff (google translation) + - "⹀": [T: "monikollinen ympyrĂ€ssĂ€ oleva kertopiste"] # 0x2a00 (en: 'circled dot operator', google translation) + - "⚁": [T: "monikollinen ympyrĂ€ssĂ€ oleva plus"] # 0x2a01 (en: 'circled plus operator', google translation) + - "⹂": [T: "monikollinen ympyrĂ€ssĂ€ oleva kertomerkki"] # 0x2a02 (en: 'circled times operator', google translation) + - "⚃": [T: "pisteellinen monikkounioni"] # 0x2a03 (en: 'union operator with dot', google translation) + - "⹄": [T: "monijoukkojen monikkounioni"] # 0x2a04 (en: 'union operator with plus', google translation) + - "⹅": [T: "kulmikas leikkauksen merkki"] # 0x2a05 (en: 'square intersection operator', google translation) + - "⹆": [T: "kulmikas unionin merkki"] # 0x2a06 (en: 'square union operator', google translation) + - "⹇": [T: "kaksi loogista ja-operaattoria"] # 0x2a07 (en: 'two logical and operator', google translation) + - "⚈": [T: "kaksi loogista tai-operaattoria"] # 0x2a08 (en: 'two logical or operator', google translation) + - "⹉": [T: "kertaa-operaattori"] # 0x2a09 (en: 'times operator', google translation) + - "⹊": [T: "modulo kaksi summaa"] # 0x2a0a (en: 'modulo two sum', google translation) + - "⹋": [T: "summa integraalilla"] # 0x2a0b (en: 'summation with integral', google translation) + - "⹌": [T: "nelinkertainen integraali"] # 0x2a0c (google: 'neljĂ€nneksen kiinteĂ€ operaattori') + - "⚍": [T: "pÀÀarvointegraali"] # 0x2a0d (google: 'ÀÀrellinen osa integraali') + - "⚎": [T: "integraali kaksinkertaisella poikkiviivalla"] # 0x2a0e (en: 'integral with double stroke', google translation) + - "⚏": [T: "integraalikeskiarvo viistolla vaakaviivalla"] # 0x2a0f (en: 'integral average with slash', google translation) + - "⚐": [T: "kiertofunktio"] # 0x2a10 (google: 'kiertotoiminto') + - "⹑": [T: "integraali vastapĂ€ivÀÀn"] # 0x2a11 (google: 'vastapĂ€ivÀÀn integraatio') + - "⹒": [T: "viivaintegraali neliskulmaisella polulla navan ympĂ€ri"] # 0x2a12 (en: 'line integration with rectangular path around pole', google: 'line -integraatio suorakaiteen muotoisella polulla navan ympĂ€rillĂ€') + - "⹓": [T: "viivaintegraali puoliympyrĂ€polulla navan ympĂ€ri"] # 0x2a13 (en: 'line integration with semicircular path around pole', google: 'line -integrointi puolipyöreĂ€llĂ€ polulla navan ympĂ€rillĂ€') + - "⹔": [T: "viivaintegraali ei sisĂ€llĂ€ napaa"] # 0x2a14 (google: 'linjan integrointi ei sisĂ€llĂ€ napaa') + - "⹕": [T: "integraali pisteoperaattorin ympĂ€rillĂ€"] # 0x2a15 (google: 'integroitu pisteen operaattorin ympĂ€rillĂ€') + - "⹖": [T: "kvaternionin integraalioperaattori"] # 0x2a16 en: 'quaternion integral operator' google: 'kvaternionin kiinteĂ€ operaattori' + - "⹗": [T: "integraali ja vasemmalle osoittava nuoli koukulla"] # 0x2a17 (en: 'integral with leftwards arrow with hook', google: 'integraali vasemmanpuoleisella nuolella koukussa') + - "⚘": [T: "integraali kertomerkillĂ€"] # 0x2a18 (en: 'integral with times sign', google translation) + - "⹙": [T: "integraali leikkauksella"] # 0x2a19 (en: 'integral with intersection', google translation) + - "⹚": [T: "integraali unionilla"] # 0x2a1a (en: 'integral with union', google translation) + - "⹛": [T: "integraali ylĂ€viivalla"] # 0x2a1b (en: 'integral with overbar', google translation) + - "⹜": [T: "integraali alaviivalla"] # 0x2a1c (en: 'integral with underbar', google translation) + - "⚝": [T: "liitos"] # 0x2a1d (en: 'join', google translation) + - "⚞": [T: "suuri vasen kolmio -operaattori"] # 0x2a1e (en: 'large left triangle operator', google translation) + - "⹟": [T: "Z-notaatio skeemayhdiste"] # 0x2a1f (en: 'z notation schema composition', google translation) + - "âš ": [T: "Z-notaatio skeemapiping"] # 0x2a20 (en: 'z notation schema piping', google translation) + - "⚥": [T: "Z-notaatio skeemaprojektio"] # 0x2a21 (en: 'z notation schema projection', google translation) + - "âšą": [T: "plus ja ympyrĂ€ ylĂ€puolella"] # 0x2a22 (en: 'plus sign with circle above', google: 'plus -merkki yllĂ€ olevalla ympyrĂ€llĂ€') + - "⚣": [T: "plus ja sirkumfleksi ylĂ€puolella"] # 0x2a23 (en: 'plus sign with circumflex accent above', google: 'plus -merkki yllĂ€ olevalla ympyrĂ€ -aksentilla') # FI: should this be "hat", "hattu"? + - "⚀": [T: "plus ja tilde ylĂ€puolella"] # 0x2a24 (en: 'plus sign with tilde above', google: 'plus -merkki yllĂ€ olevan tilden kanssa') + - "âš„": [T: "plus ja piste alapuolella"] # 0x2a25 (en: 'plus sign with dot below', google: 'plus -merkki alla olevalla pisteellĂ€') + - "⚊": [T: "plus ja tilde alapuolella"] # 0x2a26 (en: 'plus sign with tilde below', google: 'plus -merkki alla olevilla tildeillĂ€') + - "âš§": [T: "plus alaindeksi kaksi"] # 0x2a27 (en: 'plus sign with subscript two', google: 'plus -merkki alaindeksi kaksi') + - "âšš": [T: "plus mustalla kolmiolla"] # 0x2a28 (en: 'plus sign with black triangle', google translation) + - "âš©": [T: "miinus ja piste ylĂ€puolella"] # 0x2a29 (en: 'minus sign with comma above', google: 'miinus merkki yllĂ€ olevalla pilkulla') + - "âšȘ": [T: "miinus ja piste alapuolella"] # 0x2a2a (en: 'minus sign with dot below', google: 'miinusmerkki alla olevalla pisteellĂ€') + - "âš«": [T: "miinus putoavilla pisteillĂ€"] # 0x2a2b (en: 'minus sign with falling dots', google translation) + - "⚏": [T: "miinus nousevilla pisteillĂ€"] # 0x2a2c (en: 'minus sign with rising dots', google translation) + - "âš­": [T: "plus vasemmalla puoliympyrĂ€llĂ€"] # 0x2a2d (google: 'plus kirjaudu vasemmassa puolivĂ€lissĂ€') + - "âšź": [T: "plus oikealla puoliympyrĂ€llĂ€"] # 0x2a2e (google: 'plus kirjaudu oikeaan puolivĂ€liin') + - "⚯": [T: "ristitulo"] # 0x2a2f (en: 'cross product', google: 'ristituote') + - "âš°": [T: "kertomerkki ja piste ylĂ€puolella"] # 0x2a30 (en: 'multiplication sign with dot above', google: 'kertolaskulla olevan pisteen kanssa') + - "âš±": [T: "kertomerkki alaviivalla"] # 0x2a31 (en: 'multiplication sign with underbar', google: 'kertolasku aluskokouksella') + - "âšČ": [T: "puolisuora tulo, jonka pohja suljettu"] # 0x2a32 (en: 'semidirect product with bottom closed', google translation) + - "âšł": [T: "smash tulo"] # 0x2a33 (en: 'smash product' google: 'smash -tuote') # FI: translation unclear + - "⚎": [T: "kertomerkki vasemmalla puoliympyrĂ€llĂ€"] # 0x2a34 (google: 'kertolaskenta vasemmassa puolivĂ€lissĂ€') + - "âš”": [T: "kertomerkki oikealla puoliympyrĂ€llĂ€"] # 0x2a35 (google: 'kertokultaan oikea puoli ympyrĂ€') + - "âš¶": [T: "ympyröity kertomerkki sirkumfleksillĂ€"] # 0x2a36 (en: 'circled multiplication sign with circumflex accent', google: 'ympyrĂ€kerroin merkki kehĂ€kykyt aksentilla') # FI: should this be with "hat", "hattu"? + - "âš·": [T: "kaksoisympyröity kertomerkki"] # 0x2a37 (google: 'kertolaskenta kaksoisympyrĂ€ssĂ€') + - "âšž": [T: "ympyröity jakomerkki"] # 0x2a38 (google: 'ympyrĂ€divisioonan merkki') + - "âšč": [T: "plus kolmiossa"] # 0x2a39 (google: 'plus kirjaudu kolmioon') + - "âšș": [T: "miinus kolmiossa"] # 0x2a3a (google: 'miinus kirjaudu kolmioon') + - "âš»": [T: "kertomerkki kolmiossa"] # 0x2a3b (google: 'kertokultaan kolmiossa') + - "⚌": [T: "sisĂ€inen tulo"] # 0x2a3c (google: 'sisĂ€tuote') + - "âšœ": [T: "oikeanpuoleinen sisĂ€inen tulo"] # 0x2a3d (en: 'righthand interior product', google translation) + - "âšż": [T: "amalgamaatio tai kotulo"] # 0x2a3f (en: "amalgamation or coproduct", google: 'yhdistĂ€minen tai yhteistyö') # FI: translation unclear + - "⩀": [T: "leikkaus pisteellĂ€"] # 0x2a40 (en: 'intersection with dot', google: 'risteys pisteellĂ€') + - "⩁": [T: "unioni miinuksella"] # 0x2a41 (en: 'union with minus sign', google translation) + - "⩂": [T: "unioni ylĂ€viivalla"] # 0x2a42 (en: 'union with overbar', google: 'unioni ylikuormituksen kanssa') + - "⩃": [T: "leikkaus ylĂ€viivalla"] # 0x2a43 (en: 'intersection with overbar', google: 'risteys ylikuormituksen kanssa') + - "⩄": [T: "leikkaus ja looginen ja"] # 0x2a44 (en: 'intersection with logical and', google: 'risteys loogisella ja') + - "⩅": [T: "unioni ja looginen tai"] # 0x2a45 (en: 'union with logical or', google: 'union loogisen tai') + - "⩆": [T: "unioni leikkauksen ylĂ€puolella"] # 0x2a46 (google: 'unioni risteyksen ylĂ€puolella') + - "⩇": [T: "leikkaus unionin ylĂ€puolella"] # 0x2a47 (google: 'risteys liiton ylĂ€puolella') + - "⩈": [T: "unioni alaviivalla leikkauksen ylĂ€puolella"] # 0x2a48 (google: 'unioni ylĂ€puolella risteyksen ylĂ€puolella') + - "⩉": [T: "leikkaus alaviivalla leikkauksen ylĂ€puolella"] # 0x2a49 (google: 'risteys ylĂ€puolella liiton ylĂ€puolella') + - "⩊": [T: "unioni unionin vieressĂ€ yhdistettynĂ€"] # 0x2a4a (en: 'union beside and joined with union', google: 'unionin vieressĂ€ ja liittyi unioniin') + - "⩋": [T: "leikkaus leikkauksen vieressĂ€ yhdistettynĂ€"] # 0x2a4b (en: 'intersection beside and joined with intersection', google: 'risteys risteyksen vieressĂ€ ja liitetty') + - "⩌": [T: "suljettu unioni serifillĂ€"] # 0x2a4c (en: 'closed union with serifs', google: 'suljettu liitto serifien kanssa') + - "⩍": [T: "suljettu leikkaus serifillĂ€"] # 0x2a4d (en: 'closed intersection with serifs', google: 'suljettu risteys serifien kanssa') + - "⩎": [T: "kaksinkertainen neliöleikkus"] # 0x2a4e (en: 'double square intersection', google translation) + - "⩏": [T: "kaksinkertainen neliöunioni"] # 0x2a4f (google translation) + - "⩐": [T: "suljettu unioni serifillĂ€ ja smash tulo"] # 0x2a50 (en: 'closed union with serifs and smash product', google: 'suljettu liitto serifien ja smash -tuotteen kanssa') + - "⩑": [T: "looginen ja ylĂ€pisteellĂ€"] # 0x2a51 (en: 'logical and with dot above', google translation) + - "⩒": [T: "looginen tai ylĂ€pisteellĂ€"] # 0x2a52 (en: 'logical or with dot above', google translation) + - "⩓": [T: "kaksinkertainen looginen ja"] # 0x2a53 (google: 'kaksinkertainen looginen ja') + - "⩔": [T: "kaksinkertainen looginen tai"] # 0x2a54 (google: 'kaksinkertainen looginen tai') + - "⩕": [T: "kaksi limittĂ€istĂ€ loogista ja -merkkiĂ€"] # 0x2a55 (google: 'kaksi risteĂ€vÀÀ loogista ja') + - "⩖": [T: "kaksi limittĂ€istĂ€ loogista tai -merkkiĂ€"] # 0x2a56 (google: 'kaksi risteĂ€vÀÀ loogista tai') + - "⩗": [T: "vino suuri tai"] # 0x2a57 (google: 'kalteva suuri tai') + - "⩘": [T: "vino suuri ja"] # 0x2a58 (google: 'kalteva iso ja') + - "⩙": [T: "looginen tai jonka pÀÀllĂ€ looginen ja"] # 0x2a59 (en: 'logical or overlapping logical and', google translation) + - "⩚": [T: "looginen ja pystyviivalla"] # 0x2a5a (en: 'logical and with middle stem', google: 'looginen ja keskimmĂ€isellĂ€ varrella') + - "⩛": [T: "looginen tai pystyviivalla"] # 0x2a5b (en: 'logical or with middle stem', google: 'looginen tai keskimmĂ€isellĂ€ varrella') + - "⩜": [T: "looginen ja vaakaviivalla"] # 0x2a5c (en: 'logical and with horizontal dash', google: 'looginen ja vaakasuuntaisella viivalla') + - "⩝": [T: "looginen tai vaakaviivalla"] # 0x2a5d (en: 'logical or with horizontal dash', google: 'looginen tai vaakasuuntaisella viivalla') + - "⩞": [T: "looginen ja kaksoisylĂ€viivalla"] # 0x2a5e (en: 'logical and with double overbar', google translation) + - "⩟": [T: "looginen ja alaviivalla"] # 0x2a5f (en: 'logical and with underbar', google: 'looginen ja alikarjan kanssa') + - "â© ": [T: "looginen ja kaksoisalaviivalla"] # 0x2a60 (en: 'logical and with double underbar', google translation) + - "⩥": [T: "pieni vee alaviivalla"] # 0x2a61 (en: 'small vee with underbar', google translation) + - "⩹": [T: "looginen tai kaksoisylĂ€viivalla"] # 0x2a62 (en: 'logical or with double overbar', google translation) + - "⩣": [T: "kaksoisalleviivattu looginen tai"] # 0x2a63 (en: 'logical or with double underbar', google translation) + - "â©€": [T: "Z-notaatio mÀÀrittelyjoukon vastarajoitus"] # 0x2a64 (en: 'z notation domain antirestriction', google translation) # FI: unclear translation + - "â©„": [T: "Z-notaatio kuvajoukon vastarajoitus"] # 0x2a65 (en: 'z notation range antirestriction', google translation) # FI: unclear translation + - "⩊": [T: "on yhtĂ€ suuri kuin alapisteellĂ€"] # 0x2a66 (en: 'equals sign with dot below', google: 'vastaa alla olevaa pistettĂ€') + - "â©§": [T: "identtinen ylĂ€pisteellĂ€"] # 0x2a67 (en: 'identical with dot above', google translation) + - "⩚": [T: "kolminkertainen vaakasuora viiva kaksinkertaisella pystysuoralla viivalla"] # 0x2a68 (en: 'triple horizontal bar with double vertical stroke', google translation) + - "â©©": [T: "kolminkertainen vaakasuora viiva kolminkertaisella pystysuoralla viivalla"] # 0x2a69 (en: 'triple horizontal bar with triple vertical stroke', google translation) + - "â©Ș": [T: "tilde ylĂ€pisteellĂ€"] # 0x2a6a (en: 'tilde operator with dot above', google: 'tilde -operaattori, jossa on pisteen yllĂ€') + - "â©«": [T: "tilde nousevilla pisteillĂ€"] # 0x2a6b (en: 'tilde operator with rising dots', google translation) + - "⩏": [T: "samankaltainen miinus samankaltainen"] # 0x2a6c (en: 'similar minus similar', google translation) + - "â©­": [T: "kongruentti ylĂ€pisteellĂ€"] # 0x2a6d (en: 'congruent with dot above', google: 'yhteydet yllĂ€ olevan dot: n kanssa') + - "⩟": [T: "on yhtĂ€ suuri kuin tĂ€hdellĂ€"] # 0x2a6e (en: 'equals with asterisk', google translation) + - "⩯": [T: "on lĂ€hes yhtĂ€ suuri kuin sirkumfleksillĂ€"] # 0x2a6f (en: 'almost equal to with circumflex accent', google: 'lĂ€hes') + - "â©°": [T: "on suunnilleen yhtĂ€ suuri tai yhtĂ€ suuri kuin"] # 0x2a70 (en: 'approximately equal to or equal to', google translation) + - "⩱": [T: "on yhtĂ€ suuri kuin ja plus alapuolella"] # 0x2a71 (en: 'equals sign above plus sign', google: 'vastaa merkkiĂ€ yllĂ€ plus merkki') + - "â©Č": [T: "on yhtĂ€ suuri kuin ja plus ylĂ€puolella"] # 0x2a72 (en: 'plus sign above equals sign', google: 'plus -merkki yllĂ€ on yhtĂ€ suuri merkki') + - "⩳": [T: "on yhtĂ€ suuri kuin ja tilde alapuolella"] # 0x2a73 (google: 'yhtĂ€ suuri kuin merkki tilde -operaattorin ylĂ€puolella') + - "⩎": [T: "tuplakaksoispiste on yhtĂ€ suuri kuin"] # 0x2a74 (google: 'kaksinkertainen paksusuolen tasainen') + - "â©”": [T: "kaksi perĂ€kkĂ€istĂ€ on yhtĂ€ suuri kuin -merkkiĂ€"] # 0x2a75 (en: 'two consecutive equals signs', google: 'kaksi perĂ€kkĂ€istĂ€ vastaa merkkejĂ€') + - "â©¶": [T: "kolme perĂ€kkĂ€istĂ€ on yhtĂ€ suuri kuin -merkkiĂ€"] # 0x2a76 (en: 'three consecutive equals signs', google translation) + - "â©·": [T: "on yhtĂ€ suuri kuin kahdella ylĂ€pisteellĂ€ ja kahdella alapisteellĂ€"] # 0x2a77 (en: 'equals sign with two dots above and two dots below', google: 'yhtĂ€ suuri kuin kaksi pistettĂ€ yllĂ€ ja kaksi pistettĂ€ alla') + - "⩞": [T: "on yhtĂ€ suuri kuin neljĂ€llĂ€ ylĂ€pisteellĂ€"] # 0x2a78 (en: 'equivalent with four dots above', google: 'vastaa neljĂ€llĂ€ pisteellĂ€ yllĂ€') + - "â©č": [T: "pienempi kuin ja ympyrĂ€ sisĂ€llĂ€"] # 0x2a79 (en: 'less than with circle inside', google: 'vĂ€hemmĂ€n kuin ympyrĂ€llĂ€ sisĂ€llĂ€') + - "â©ș": [T: "suurempi kuin ja ympyrĂ€ sisĂ€llĂ€"] # 0x2a7a (en: 'greater than with circle inside', google: 'suurempi kuin ympyrĂ€llĂ€ sisĂ€llĂ€') + - "â©»": [T: "pienempi kuin ja kysymysmerkki ylĂ€puolella"] # 0x2a7b (en: 'less than with question mark above', google: 'vĂ€hemmĂ€n kuin yllĂ€ oleva kysymys') + - "⩌": [T: "suurempi kuin ja kysymysmerkki ylĂ€puolella"] # 0x2a7c (en: 'greater than with question mark above', google: 'suurempi kuin yllĂ€ oleva kysymys') + - "⩜": [T: "pienempi kuin tai vino on yhtĂ€ suuri kuin"] # 0x2a7d (google: 'vĂ€hemmĂ€n kuin vino kuin') + - "⩟": [T: "suurempi kuin tai vino on yhtĂ€ suuri kuin"] # 0x2a7e (en: 'greater than or slanted equal to', google: 'suurempi kuin vino yhtĂ€ suuri kuin') + - "⩿": [T: "pienempi kuin tai vino on yhtĂ€ suuri kuin ja piste sisĂ€llĂ€"] # 0x2a7f (en: 'less than or slanted equal to with dot inside', google: 'vĂ€hemmĂ€n tai vino yhtĂ€ suuri kuin pisteellĂ€') + - "âȘ€": [T: "suurempi kuin tai vino on yhtĂ€ suuri kuin ja piste sisĂ€llĂ€"] # 0x2a80 (en: 'greater than or slanted equal to with dot inside', google: 'suurempi tai viistot yhtĂ€ suuri kuin pisteellĂ€') + - "âȘ": [T: "pienempi kuin tai vino on yhtĂ€ suuri kuin ja piste ylĂ€puolella"] # 0x2a81 (en: 'less than or slanted equal to with dot above', google: 'vĂ€hemmĂ€n kuin vino yhtĂ€ suuri kuin yllĂ€ olevalla pisteellĂ€') + - "âȘ‚": [T: "suurempi kuin tai vino on yhtĂ€ suuri kuin ja piste ylĂ€puolella"] # 0x2a82 (en: 'greater than or slanted equal to with dot above', google: 'suurempi kuin vino kuin yllĂ€ olevalla pisteellĂ€') + - "âȘƒ": [T: "pienempi kuin tai vino on yhtĂ€ suuri kuin ja piste ylĂ€oikealla"] # 0x2a83 (en: 'less than or slanted equal to with dot above right', google: 'vĂ€hemmĂ€n tai viistot yhtĂ€ suuri kuin oikean ylĂ€puolella') + - "âȘ„": [T: "suurempi kuin tai vino on yhtĂ€ suuri kuin ja piste ylĂ€vasemmalla"] # 0x2a84 (en: 'greater than or slanted equal to with dot above left', google: 'suurempi kuin vino kuin vasemman ylĂ€puolella oleva piste') + - "âȘ…": [T: "vĂ€hemmĂ€n tai likimÀÀrin"] # 0x2a85 (en: 'less than or approximate', google translation) + - "âȘ†": [T: "suurempi tai likimÀÀrin"] # 0x2a86 (en: 'greater than or approximate', google translation) + - "âȘ‡": [T: "pienempi kuin ja yksiviivainen ei yhtĂ€ suuri kuin"] # 0x2a87 (en: 'less than and single line not equal to', google translation) + - "âȘˆ": [T: "suurempi kuin ja yksiviivainen ei yhtĂ€ suuri kuin"] # 0x2a88 (en: 'greater than and single line not equal to', google translation) + - "âȘ‰": [T: "pienempi kuin mutta ei likimÀÀrin"] # 0x2a89 (en: 'less than and not approximate', google: 'vĂ€hemmĂ€n kuin ja ei likimÀÀrĂ€inen') + - "âȘŠ": [T: "suurempi kuin mutta ei likimÀÀrin"] # 0x2a8a (en: 'greater than and not approximate', google: 'suurempi kuin ja ei likimÀÀrĂ€inen') + - "âȘ‹": [T: "pienempi kuin jonka alapuolella vaakaviiva jonka alapuolella suurempi kuin"] # 0x2a8b (en: 'less than above double line equal above greater than', google translation) + - "âȘŒ": [T: "suurempi kuin jonka alapuolella vaakaviiva jonka alapuolella pienempi kuin"] # 0x2a8c (en: 'greater than above double line equal above less than', google translation) + - "âȘ": [T: "pienempi kuin jonka alapuolella yhtĂ€ suuri tai likimÀÀrin yhtĂ€ suuri kuin"] # 0x2a8d (google: 'vĂ€hemmĂ€n kuin samanlainen tai tasainen') + - "âȘŽ": [T: "suurempi kuin jonka alapuolella yhtĂ€ suuri tai limikÀÀrin yhtĂ€ suuri kuin"] # 0x2a8e (google: 'suurempi kuin samanlainen tai tasainen') + - "âȘ": [T: "pienempi kuin jonka alapuolella likimÀÀrin jonka alapuolella suurempi kuin"] # 0x2a8f (google: 'vĂ€hemmĂ€n kuin ylĂ€puolella ylĂ€puolella suurempi kuin') + - "âȘ": [T: "suurempi kuin jonka alapuolella likimÀÀrin jonka alapuolella suurempi kuin"] # 0x2a90 (google: 'suurempi kuin edellĂ€ mainitussa ylĂ€puolella') + - "âȘ‘": [T: "pienempi kuin suurempi kuin tai yhtĂ€ suuri kuin"] # 0x2a91 (en: 'less than above greater than above double line equal', google: 'alle enemmĂ€n kuin yli suurempi kuin kaksoisviiva on yhtĂ€ suuri') + - "âȘ’": [T: "suurempi kuin pienempi kuin tai yhtĂ€ suuri kuin"] # 0x2a92 (en: 'greater than above less than above double line equal', google: 'suurempi kuin ylĂ€puolella vĂ€hemmĂ€n kuin kaksoisviiva on yhtĂ€ suuri') + - "âȘ“": [T: "pienempi kuin tai vino on yhtĂ€ suuri kuin suurempi kuin tai vino on yhtĂ€ suuri kuin"] # 0x2a93 (google: 'vĂ€hemmĂ€n kuin ylĂ€puolella viistot ovat yhtĂ€ suurempia kuin ylĂ€puolella viistot ovat yhtĂ€ suuret') + - "âȘ”": [T: "suurempi kuin tai vino on yhtĂ€ suuri kuin pienempi kuin tai vino on yhtĂ€ suuri kuin"] # 0x2a94 (google: 'suurempi kuin ylĂ€puolella viistot ovat yhtĂ€ suurempia kuin viistojen ylĂ€puolella yhtĂ€ suuret') + - "âȘ•": [T: "vino on yhtĂ€ suuri kuin tai pienempi kuin"] # 0x2a95 (en: 'slanted equal to or less than', google translation) + - "âȘ–": [T: "vino on yhtĂ€ suuri kuin tai suurempi kuin"] # 0x2a96 (en: 'slanted equal to or greater than', google translation) + - "âȘ—": [T: "vino on yhtĂ€ suuri kuin tai pienempi kuin ja piste sisĂ€llĂ€"] # 0x2a97 (en: 'slanted equal to or less than with dot inside', google: 'viisto yhtĂ€ tai vĂ€hemmĂ€n kuin pisteellĂ€ sisĂ€llĂ€') + - "âȘ˜": [T: "vino on yhtĂ€ suuri kuin tai suurempi kuin ja piste sisĂ€llĂ€"] # 0x2a98 (en: 'slanted equal to or greater than with dot inside', google: 'viisto yhtĂ€ tai suurempi kuin pisteellĂ€ sisĂ€llĂ€') + - "âȘ™": [T: "on yhtĂ€ suuri kuin tai pienempi kuin"] # 0x2a99 (en: 'double line equal to or less than', google: 'kaksoisviiva, joka on yhtĂ€ suuri tai vĂ€hemmĂ€n kuin') + - "âȘš": [T: "on yhtĂ€ suuri kuin tai suurempi kuin"] # 0x2a9a (en: 'double line equal to or greater than', google: 'kaksoisviiva, joka on yhtĂ€ suuri tai suurempi') + - "âȘ›": [T: "kaksoisviivainen on yhtĂ€ suuri kuin tai pienempi kuin"] # 0x2a9b (en: 'double line slanted equal to or less than', google translation) + - "âȘœ": [T: "kaksoisviivainen on yhtĂ€ suuri kuin tai suurempi kuin"] # 0x2a9c (en: 'double line slanted equal to or greater than', google translation) + - "âȘ": [T: "likimÀÀrin tai pienempi kuin"] # 0x2a9d (en: 'similar or less than', google: 'samanlainen tai vĂ€hemmĂ€n kuin') + - "âȘž": [T: "likimÀÀrin tai suurempi kuin"] # 0x2a9e (google: 'samanlainen tai suurempi kuin') + - "âȘŸ": [T: "likimÀÀrin jonka alapuolella vĂ€hemmĂ€n kuin jonka alapuolella on yhtĂ€ suuri kuin"] # 0x2a9f (google: 'samanlainen ylĂ€puolella vĂ€hemmĂ€n kuin yllĂ€ oleva merkki') + - "âȘ ": [T: "likimÀÀrin jonka alapuolella suurempi kuin jonka alapuolella on yhtĂ€ suuri kuin"] # 0x2aa0 (google: 'samanlainen ylĂ€puolella suurempi kuin yllĂ€ oleva merkki') + - "âȘĄ": [T: "sisĂ€kkĂ€iset pienempi kuin"] # 0x2aa1 (en: 'double nested less than', google: 'kaksinkertainen sisĂ€kkĂ€in vĂ€hemmĂ€n kuin') + - "âȘą": [T: "sisĂ€kkĂ€iset suurempi kuin"] # 0x2aa2 (en: 'double nested greater than', google: 'kaksinkertainen sisĂ€kkĂ€inen suurempi kuin') + - "âȘŁ": [T: "kaksi sisĂ€llĂ€istĂ€ pienempi kuin alaviivalla"] # 0x2aa3 (en: 'double nested less than with underbar', google translation) + - "âȘ€": [T: "pienempi kuin -merkki suurempi kuin -merkin pÀÀllĂ€"] # 0x2aa4 (en: 'greater than overlapping less than', google: 'suurempi kuin pÀÀllekkĂ€isyys vĂ€hemmĂ€n kuin') + - "âȘ„": [T: "suurempi kuin pienempi kuin"] # 0x2aa5 (google: 'suurempi kuin vĂ€hemmĂ€n kuin') + - "âȘŠ": [T: "pienempi kuin suljettu kĂ€yrĂ€llĂ€"] # 0x2aa6 (google: 'vĂ€hemmĂ€n kuin kĂ€yrĂ€ suljettu') + - "âȘ§": [T: "suurempi kuin suljettu kĂ€yrĂ€llĂ€"] # 0x2aa7 (google: 'suurempi kuin kĂ€yrĂ€ suljettu') + - "âȘš": [T: "pienempi kuin suljettu kĂ€yrĂ€llĂ€ tai yhtĂ€ suuri kuin"] # 0x2aa8 (google: 'vĂ€hemmĂ€n kuin suljettuna kĂ€yrĂ€llĂ€ viistolla tasavertaisesti') + - "âȘ©": [T: "suurempi kuin suljettu kĂ€yrĂ€llĂ€ tai yhtĂ€ suuri kuin"] # 0x2aa9 (google: 'suurempi kuin suljettu kaarulla, joka on viistolla yhtĂ€ suuri') + - "âȘȘ": [T: "pienempi kuin vaakaviivalla"] # 0x2aaa (google: 'pienempi kuin') + - "âȘ«": [T: "suurempi kuin vaakaviivalla"] # 0x2aab (google: 'suurempi kuin') + - "âȘŹ": [T: "pienempi kuin vaakaviivalla tai yhtĂ€ suuri kuin"] # 0x2aac (google: 'pienempi tai yhtĂ€ suuri kuin') + - "âȘ­": [T: "suurempi kuin vaakaviivalla tai yhtĂ€ suuri kuin"] # 0x2aad (google: 'suurempi tai yhtĂ€ suuri kuin') + - "âȘź": [T: "ero vĂ€lillĂ€"] # 0x2aae (en: 'equals sign with bumpy above', google: 'yhtĂ€ suuri kuin kuohuttava yllĂ€') # FI: translation unclear + - "âȘŻ": [T: "edeltÀÀ jonka alapuolella yksiviivainen yhtĂ€ suuri kuin"] # 0x2aaf (google: 'ennen yhden rivin ylĂ€puolella on yhtĂ€ suuri kuin merkki') + - "âȘ°": [T: "seuraa jonka alapuolella yksiviivainen yhtĂ€ suuri kuin"] # 0x2ab0 (en: 'succeeds above single line equals sign', google translation) + - "âȘ±": [T: "edeltÀÀ jonka alapuolella yksiviivainen ei yhtĂ€ suuri kuin"] # 0x2ab1 (en: 'precedes above single line not equal to', google translation) + - "âȘČ": [T: "seuraa jonka alapuolella yksiviivainen ei yhtĂ€ suuri kuin"] # 0x2ab2 (en: 'succeeds above single line not equal to', google translation) + - "âȘł": [T: "edeltÀÀ jonka alapuolella yhtĂ€ suuri kuin"] # 0x2ab3 (en: 'precedes above equals sign', google translation) + - "âȘŽ": [T: "seuraa jonka alapuolella yhtĂ€ suuri kuin"] # 0x2ab4 (en: 'succeeds above equals sign', google translation) + - "âȘ”": [T: "edeltÀÀ mutta ei ole yhtĂ€ suuri kuin"] # 0x2ab5 (en: 'precedes above not equal to', google: 'edellĂ€ on edellĂ€, joka ei ole yhtĂ€ suuri kuin') + - "âȘ¶": [T: "seuraa mutta ei ole yhtĂ€ suuri kuin"] # 0x2ab6 (en: 'succeeds above not equal to', google: 'onnistuu ylĂ€puolella, ei ole yhtĂ€ suuri kuin') + - "âȘ·": [T: "edeltÀÀ ja on likimÀÀrin"] # 0x2ab7 (en: 'precedes above almost equal to', google translation) + - "âȘž": [T: "seuraa ja on likimÀÀrin"] # 0x2ab8 (en: 'succeeds above almost equal to', google translation) + - "âȘč": [T: "edeltÀÀ mutta ei ole likimÀÀrin"] # 0x2ab9 (en: 'precedes above not almost equal to', google translation) + - "âȘș": [T: "seuraa mutta ei ole likimÀÀrin"] # 0x2aba (en: 'succeeds above not almost equal to', google translation) + - "âȘ»": [T: "kaksinkertainen edeltÀÀ"] # 0x2abb (google: 'kaksinkertainen edeltĂ€vĂ€') + - "âȘŒ": [T: "kaksinkertainen seuraa"] # 0x2abc (google: 'double onnistuu') + - "âȘœ": [T: "osajoukko pisteellĂ€"] # 0x2abd (en: 'subset with dot', google: 'alajoukko pisteellĂ€') + - "âȘŸ": [T: "ylijoukko pisteellĂ€"] # 0x2abe (en: 'superset with dot', google: 'superset pisteellĂ€') + - "âȘż": [T: "osajoukko ja alapuolella plus"] # 0x2abf (en: 'subset with plus sign below', google: 'alajoukko plus -merkki alla') + - "⫀": [T: "ylijoukko ja alapuolella plus"] # 0x2ac0 (en: 'superset with plus sign below', google: 'superset alla olevalla merkinnĂ€llĂ€') + - "⫁": [T: "osajoukko ja alapuolella kertomerkki"] # 0x2ac1 (en: 'subset with multiplication sign below', google: 'alajoukko alla olevalla kertolaskulla') + - "⫂": [T: "ylijoukko ja alapuolella kertomerkki"] # 0x2ac2 (en: 'superset with multiplication sign below', google: 'superset alla olevalla kertolaskulla') + - "⫃": [T: "osajoukko tai yhtĂ€ suuri kuin ja ylĂ€puolella piste"] # 0x2ac3 (en: 'subset of or equal to with dot above', google: 'alajoukko tai yhtĂ€ suuri kuin yllĂ€ olevalla pisteellĂ€') + - "⫄": [T: "ylijoukko tai yhtĂ€ suuri kuin ja ylĂ€puolella piste"] # 0x2ac4 (en: 'superset of or equal to with dot above', google: 'superset tai yhtĂ€ suuri kuin yllĂ€ olevalla pisteellĂ€') + - "⫅": [T: "osajoukko tai yhtĂ€ suuri kuin"] # 0x2ac5 (en: 'subset of above equals sign', google translation) + - "⫆": [T: "ylijoukko tai yhtĂ€ suuri kuin"] # 0x2ac6 (en: 'superset of above equals sign', google translation) + - "⫇": [T: "likimÀÀrin osajoukko"] # 0x2ac7 (en: 'subset of above tilde operator', google: 'yllĂ€ olevan tilde -operaattorin osajoukko') + - "⫈": [T: "likimÀÀrin ylijoukko"] # 0x2ac8 (en: 'superset of above tilde operator', google: 'tilde -operaattorin ylĂ€puolella') + - "⫉": [T: "osajoukko jonka alapuolella likimÀÀrin yhtĂ€ suuri kuin"] # 0x2ac9 (en: 'subset of above almost equal to', google translation) + - "⫊": [T: "ylijoukko jonka alapuolella likimÀÀrin yhtĂ€ suuri kuin"] # 0x2aca (en: 'superset of above almost equal to', google translation) + - "⫋": [T: "osajoukko mutta ei yhtĂ€ suuri kuin"] # 0x2acb (en: 'subset above not equal to', google translation) + - "⫌": [T: "ylijoukko mutta ei yhtĂ€ suuri kuin"] # 0x2acc (en: 'superset of above not equal to', google translation) + - "⫍": [T: "laatikko-operaattori jonka vasen puoli avoin"] # 0x2acd (en: 'square left open box operator', google translation) # FI: translation unclear + - "⫎": [T: "laatikko-operaattori jonka oikea puoli avoin"] # 0x2ace (en: 'square right open box operator', google translation) # FI: translation unclear + - "⫏": [T: "suljettu osajoukko"] # 0x2acf (google: 'suljettu alajoukko') + - "⫐": [T: "suljettu ylijoukko"] # 0x2ad0 (google: 'suljettu superset') + - "⫑": [T: "suljettu osajoukko tai yhtĂ€ suuri kuin"] # 0x2ad1 (google: 'suljettu osajoukko tai yhtĂ€ suuri kuin') + - "⫒": [T: "suljettu ylijoukko tai yhtĂ€ suuri kuin"] # 0x2ad2 (google: 'suljettu superset tai yhtĂ€ suuri kuin') + - "⫓": [T: "osajoukko ylijoukon ylĂ€puolella"] # 0x2ad3 (en: 'subset above superset', google: 'supersetin ylĂ€puolella') + - "⫔": [T: "ylijoukko osajoukon ylĂ€puolella"] # 0x2ad4 (en: 'superset above subset', google: 'superset alajoukon ylĂ€puolella') + - "⫕": [T: "osajoukko osajoukon ylĂ€puolella"] # 0x2ad5 (en: 'subset above subset', google: 'alajoukko alajoukossa') + - "⫖": [T: "ylijoukko ylijoukon ylĂ€puolella"] # 0x2ad6 (en: 'superset above superset', google: 'superset supersetin ylĂ€puolella') + - "⫗": [T: "ylijoukko osajoukon vieressĂ€"] # 0x2ad7 (google: 'superset alajoukon vieressĂ€') + - "⫘": [T: "ylijoukko osajoukon vieressĂ€ yhdistettynĂ€ viivalla"] # 0x2ad8 (en: 'superset beside and joined by dash with subset', google: 'superset vieressĂ€ ja liittyi viivalla alajoukkoon') + - "⫙": [T: "alaspĂ€in aukeava kuuluu joukkoon"] # 0x2ad9 (google: 'elementti avautumisesta alaspĂ€in') + - "⫚": [T: "hanko t-ylĂ€osalla"] # 0x2ada (en: 'pitchfork with tee top', google: 'pitchfork tee -top') # FI: translation unclear + - "⫛": [T: "poikittainen leikkaus"] # 0x2adb (google: 'poikittainen risteys') # FI: translation unclear + - "⫝̸": [T: "haarukka"] # 0x2adc (en: 'forking', google translation) # FI: translation unclear + - "⫝": [T: "ei-haarukka"] # 0x2add (en: 'nonforking', google translation) # FI: translation unclear + - "⫞": [T: "lyhyt nasta vasemmalle"] # 0x2ade (en: 'short left tack', google translation) + - "⫟": [T: "lyhyt nasta alaspĂ€in"] # 0x2adf (en: 'short down tack', google translation) + - "â« ": [T: "lyhyt nasta ylöspĂ€in"] # 0x2ae0 (en: 'short up tack', google translation) + - "⫥": [T: "kohtisuora ja s"] # 0x2ae1 (en: 'perpendicular with s', google translation) + - "⫹": [T: "pystysuora palkki ja kolminkertainen oikea kÀÀntöportti"] # 0x2ae2 (en: 'vertical bar triple right turnstile', google translation) + - "⫣": [T: "kaksinkertainen pystysuora viiva ja vasen kÀÀntöportti"] # 0x2ae3 (en: 'double vertical bar left turnstile', google translation) + - "â«€": [T: "pystyviiva ja vasemmanpuoleinen kaksoiskÀÀntöportti"] # 0x2ae4 (en: 'vertical bar double left turnstile', google: 'pystysuora palkki kaksinkertainen vasen kÀÀntölaite') + - "â«„": [T: "kaksoispystyviiva ja vasemmanpuoleinen kaksoiskÀÀntöportti"] # 0x2ae5 (en: 'double vertical bar double left turnstile', google translation) + - "⫊": [T: "pitkĂ€ viiva kahden pystyviivan vasemmanpuoleisesta viivasta"] # 0x2ae6 (google: 'pitkĂ€ viiva double pystysuoran vasemmalta jĂ€seneltĂ€') + - "â«§": [T: "lyhyt nasta alaspĂ€in ylĂ€viivalla"] # 0x2ae7 (en: 'short down tack with overbar', google: 'lyhyt alaspĂ€in tarttuva ylikuormitus') + - "⫚": [T: "lyhyt nasta ylöspĂ€in alaviivalla"] # 0x2ae8 (en: 'short up tack with underbar', google: 'lyhyt up takki alapalkissa') + - "â«©": [T: "lyhyt nasta ylöspĂ€in jonka alapuolella lyhyt nasta alaspĂ€in"] # 0x2ae9 (google: 'lyhyt ylösnopeus lyhyen alaspĂ€in') + - "â«Ș": [T: "kaksinkertainen nasta alaspĂ€in"] # 0x2aea (en: 'double down tack', google translation) + - "â««": [T: "kaksinkertainen nasta ylöspĂ€in"] # 0x2aeb (google: 'kaksinkertainen tarttuva') + - "⫏": [T: "kaksoisviiva ei"] # 0x2aec (en: "double stroke not sign" google: 'kaksinkertainen isku ei allekirjoittaa') + - "â«­": [T: "kÀÀnnetty kaksoisviiva ei"] # 0x2aed (en: "reversed double stroke not sign" google: 'kÀÀnteinen kaksoishalvaus ei allekirjoittaa') + - "⫟": [T: "ei jaa kÀÀnnetyllĂ€ negaatioviivalla"] # 0x2aee (en: 'does not divide with reversed negation slash', google: 'ei jaa kÀÀnnetyn kielteisen viivan kanssa') + - "⫯": [T: "pystyviiva ja ympyrĂ€ ylĂ€puolella"] # 0x2aef (en: 'vertical line with circle above', google: 'pystysuora viiva ympyrĂ€n kanssa') + - "â«°": [T: "pystyviiva ja ympyrĂ€ alapuolella"] # 0x2af0 (en: 'vertical line with circle below', google: 'pystysuora viiva, jossa ympyrĂ€ alla') + - "⫱": [T: "nasta alaspĂ€in ja ympyrĂ€ alapuolella"] # 0x2af1 (en: 'down tack with circle below', google: 'alaspĂ€in ympyrĂ€ alla') + - "â«Č": [T: "yhdensuuntainen poikkiviivalla"] # 0x2af2 (en: 'parallel with horizontal stroke', google: 'yhdensuuntainen vaakasuuntaisen iskun kanssa') + - "⫳": [T: "yhdensuuntainen tildellĂ€"] # 0x2af3 (en: 'parallel with tilde operator', google: 'rinnakkain tilde -operaattorin kanssa') + - "⫎": [T: "kolminkertainen pystysuora viiva binÀÀrirelaatiolla"] # 0x2af4 (en: 'triple vertical bar binary relation', google translation) + - "â«”": [T: "kolminkertainen pystysuora viiva poikkiviivalla"] # 0x2af5 (en: 'triple vertical bar with horizontal stroke', google translation) + - "â«¶": [T: "kolmoispisteoperaattori"] # 0x2af6 (en: 'triple colon operator', google translation) + - "â«·": [T: "kolminkertainen sisĂ€kkĂ€inen vĂ€hemmĂ€n kuin"] # 0x2af7 (en: 'triple nested less than', google translation) + - "⫞": [T: "kolminkertainen sisĂ€kkĂ€inen suurempi kuin"] # 0x2af8 (en: 'triple nested greater than', google translation) + - "â«č": [T: "pienempi kuin tai vino kaksinkertainen on yhtĂ€ suuri kuin"] # 0x2af9 (en: 'double line slanted less than or equal to', google translation) + - "â«ș": [T: "suurempi kuin tai vino kaksinkertainen on yhtĂ€ suuri kuin"] # 0x2afa (en: 'double line slanted greater than or equal to', google translation) + - "â«»": [T: "kolminkertainen vinoviiva binÀÀrirelaatiolla"] # 0x2afb (en: 'triple solidus binary relation', google translation) + - "⫌": [T: "suuri kolminkertainen pystyviiva"] # 0x2afc (en: 'large triple vertical bar operator', google translation) + - "⫝̸": [T: "kaksoisvinoviiva"] # 0x2afd (en: 'double solidus operator', google translation) + - "⫟": [T: "valkoinen pystysuora palkki"] # 0x2afe (en: 'white vertical bar', google translation) + - "⫿": [T: "valkoinen pystysuora palkki"] # 0x2aff (en: 'white vertical bar', google translation) + - "⬀": [T: "ylĂ€oikealle osoittava valkoinen nuoli"] # 0x2b00 (en: 'north east white arrow', google translation) + - "⏁": [T: "ylĂ€vasemmalle osoittava valkoinen nuoli"] # 0x2b01 (en: 'north west white arrow', google translation) + - "⬂": [T: "alaoikealle osoittava valkoinen nuoli"] # 0x2b02 (en: 'south east white arrow', google translation) + - "⏃": [T: "alavasemmalle osoittava valkoinen nuoli"] # 0x2b03 (en: 'south west white arrow', google translation) + - "⬄": [T: "oikealle ja vasemmalle osoittava valkoinen nuoli"] # 0x2b04 (en: 'left right white arrow', google translation) + - "⬅": [T: "vasen musta nuoli"] # 0x2b05 (en: 'leftwards black arrow', google translation) + - "⬆": [T: "ylöspĂ€in osoittava musta nuoli"] # 0x2b06 (en: 'upwards black arrow', google translation) + - "⬇": [T: "alaspĂ€in osoittava musta nuoli"] # 0x2b07 (en: 'downwards black arrow', google translation) + - "⏈": [T: "ylĂ€oikealle osoittava musta nuoli"] # 0x2b08 (en: 'north east black arrow', google translation) + - "⬉": [T: "ylĂ€vasemmalle osoittava musta nuoli"] # 0x2b09 (en: 'north west black arrow', google translation) + - "⬊": [T: "alaoikealle osoittava musta nuoli"] # 0x2b0a (en: 'south east black arrow', google translation) + - "⬋": [T: "alavasemmalle osoittava musta nuoli"] # 0x2b0b (en: 'south west black arrow', google translation) + - "⬌": [T: "vasemmalle ja oikealle osoittava musta nuoli"] # 0x2b0c (en: 'left right black arrow', google translation) + - "⬍": [T: "ylös ja alas osoittava musta nuoli"] # 0x2b0d (en: 'up down black arrow', google translation) + - "⬎": [T: "oikealle ja alas osoittava nuoli"] # 0x2b0e (en: 'rightwards arrow with tip downwards', google translation) + - "⬏": [T: "oikealle ja ylös osoittava nuoli"] # 0x2b0f (en: 'rightwards arrow with tip upwards', google translation) + - "⏐": [T: "vasemmalle ja alas osoittava nuoli"] # 0x2b10 (en: 'leftwards arrow with tip downwards', google translation) + - "⬑": [T: "vasemmalle ja ylös osoittava nuoli"] # 0x2b11 (en: 'leftwards arrow with tip upwards', google translation) + - "⬒": [T: "neliö mustalla ylĂ€puoliskolla"] # 0x2b12 (en: 'square with top half black', google translation) + - "⬓": [T: "neliö mustalla alapuoliskolla"] # 0x2b13 (en: 'square with bottom half black', google translation) + - "⬔": [T: "neliö jonka oikea diagonaali musta"] # 0x2b14 (en: 'square with upper right diagonal half black', google translation) + - "⬕": [T: "neliö jonka vasen diagonaali musta"] # 0x2b15 (en: 'square with lower left diagonal half black', google translation) + - "⬖": [T: "timantti jonka vasen puoli musta"] # 0x2b16 (en: 'diamond with left half black', google translation) + - "⬗": [T: "timantti jonka oikea puoli musta"] # 0x2b17 (en: 'diamond with right half black', google translation) + - "⏘": [T: "timantti mustalla ylĂ€puoliskolla"] # 0x2b18 (en: 'diamond with top half black', google translation) + - "⬙": [T: "timantti mustalla alapuoliskolla"] # 0x2b19 (en: 'diamond with bottom half black', google translation) + - "⬚": [T: "laatikko"] # 0x2b1a (en: 'box', google translation) + - "⬛": [T: "musta iso neliö"] # 0x2b1b (en: 'black large square', google translation) + - "⬜": [T: "valkoinen iso neliö"] # 0x2b1c (en: 'white large square', google translation) + - "⬝": [T: "musta hyvin pieni neliö"] # 0x2b1d (en: 'black very small square', google translation) + - "⬞": [T: "valkoinen hyvin pieni neliö"] # 0x2b1e (en: 'white very small square', google translation) + - "⬟": [T: "musta viisikulmio"] # 0x2b1f (en: 'black pentagon', google translation) + - "⏠": [T: "valkoinen viisikulmio"] # 0x2b20 (en: 'white pentagon', google translation) + - "⏥": [T: "valkoinen kuusikulmio"] # 0x2b21 (en: 'white hexagon', google translation) + - "⏹": [T: "musta kuusikulmio"] # 0x2b22 (en: 'black hexagon', google translation) + - "⏣": [T: "vaaka musta kuusikulmio"] # 0x2b23 (en: 'horizontal black hexagon', google translation) + - "⏀": [T: "musta iso ympyrĂ€"] # 0x2b24 (en: 'black large circle', google translation) + - "⏄": [T: "musta keskisuuri timantti"] # 0x2b25 (en: 'black medium diamond', google translation) + - "⏊": [T: "valkoinen keskisuuri timantti"] # 0x2b26 (en: 'white medium diamond', google translation) + - "⏧": [T: "musta keskipitkĂ€ vinoneliö"] # 0x2b27 (en: 'black medium lozenge', google translation) + - "⏚": [T: "valkoinen keskisuuri vinoneliö"] # 0x2b28 (en: 'white medium lozenge', google translation) + - "⏩": [T: "musta pieni timantti"] # 0x2b29 (en: 'black small diamond', google translation) + - "âŹȘ": [T: "musta pieni vinoneliö"] # 0x2b2a (en: 'black small lozenge', google translation) + - "⏫": [T: "valkoinen pieni vinoneliö"] # 0x2b2b (en: 'white small lozenge', google translation) + - "⏏": [T: "musta vaakasuora ellipsi"] # 0x2b2c (en: 'black horizontal ellipse', google translation) + - "⏭": [T: "valkoinen vaakasuora ellipsi"] # 0x2b2d (en: 'white horizontal ellipse', google translation) + - "⏟": [T: "musta pystysuora ellipsi"] # 0x2b2e (en: 'black vertical ellipse', google translation) + - "⏯": [T: "valkoinen pystysuora ellipsi"] # 0x2b2f (en: 'white vertical ellipse', google translation) + - "⏰": [T: "vasen nuoli pienellĂ€ ympyrĂ€llĂ€"] # 0x2b30 (en: 'left arrow with small circle', google translation) + - "⏱": [T: "kolme vasemmanpuoleista nuolta"] # 0x2b31 (en: 'three leftwards arrows', google translation) + - "âŹČ": [T: "vasen nuoli ympyröidulla plus-merkillĂ€"] # 0x2b32 (en: 'left arrow with circled plus', google translation) + - "⏳": [T: "pitkĂ€ vasen kiemuranuoli"] # 0x2b33 (en: 'long leftwards squiggle arrow', google translation) + - "⏎": [T: "vasen kaksipĂ€inen nuoli pystysuoralla viivalla"] # 0x2b34 (en: 'leftwards two headed arrow with vertical stroke', google translation) + - "⏔": [T: "vasen kaksipĂ€inen nuoli kaksinkertaisella pystysuoralla viivalla"] # 0x2b35 (en: 'leftwards two headed arrow with double vertical stroke', google translation) + - "⏶": [T: "vasen kaksipĂ€inen nuoli pystyviivasta"] # 0x2b36 (en: 'leftwards two headed arrow from bar', google translation) + - "⏷": [T: "vasen kaksipĂ€inen kolmoiskatkoviivanuoli"] # 0x2b37 (en: 'leftwards two headed triple dash arrow', google translation) + - "⏞": [T: "vasen nuoli katkoviivalla"] # 0x2b38 (en: 'leftwards arrow with dotted stem', google translation) + - "âŹč": [T: "vasen nuoli hĂ€nnĂ€llĂ€ ja pystyviivalla"] # 0x2b39 (en: 'leftwards arrow with tail with vertical stroke', google translation) + - "âŹș": [T: "vasen nuoli hĂ€nnĂ€llĂ€ ja kaksinkertaisella pystyviivalla"] # 0x2b3a (en: 'leftwards arrow with tail with double vertical stroke', google translation) + - "⏻": [T: "vasen kaksipĂ€inen nuoli hĂ€nnĂ€llĂ€"] # 0x2b3b (en: 'leftwards two headed arrow with tail', google translation) + - "âŹŒ": [T: "vasen kaksipĂ€inen nuoli hĂ€nnĂ€llĂ€ ja pystysuoralla viivalla"] # 0x2b3c (en: 'leftwards two headed arrow with tail with vertical stroke', google translation) + - "âŹœ": [T: "vasen kaksipĂ€inen nuoli hĂ€nnĂ€llĂ€ ja kaksinkertaisella pystysuoralla viivalla"] # 0x2b3d (en: 'leftwards two headed arrow with tail with double vertical stroke', google translation) + - "âŹŸ": [T: "vasen nuoli x:n lĂ€pi"] # 0x2b3e (en: 'leftwards arrow through x', google translation) + - "⏿": [T: "suoraan vasemmalle osoittava aaltonuoli"] # 0x2b3f (en: 'wave arrow pointing directly left', google translation) + - "⭀": [T: "on yhtĂ€ suuri kuin vasemman nuolen ylĂ€puolella"] # 0x2b40 (en: 'equals sign above leftwards arrow', google translation) + - "⭁": [T: "kÀÀnnetty tilde vasemman nuolen ylĂ€puolella"] # 0x2b41 (en: 'reverse tilde operator above leftwards arrow', google translation) + - "⭂": [T: "likimÀÀrin yhtĂ€ suuri kuin vasemman nuolen alapuolella"] # 0x2b42 (en: 'leftwards arrow above reverse almost equal to', google translation) + - "⭃": [T: "oikea nuoli suurempi kuin lĂ€pi"] # 0x2b43 (en: 'rightwards arrow through greater than', google translation) + - "⭄": [T: "oikea nuoli ylijoukon lĂ€pi"] # 0x2b44 (en: 'rightwards arrow through superset', google translation) + - "⭅": [T: "vasen nelinkertainen nuoli"] # 0x2b45 (en: 'leftwards quadruple arrow', google translation) + - "⭆": [T: "oikea nelinkertainen nuoli"] # 0x2b46 (en: 'rightwards quadruple arrow', google translation) + - "⭇": [T: "kÀÀnnetty tilde oikean nuolen ylĂ€puolella"] # 0x2b47 (en: 'reverse tilde operator above rightwards arrow', google translation) + - "⭈": [T: "kÀÀnnetty likimÀÀrin yhtĂ€ suuri kuin oikean nuolen alapuolella"] # 0x2b48 (en: 'rightwards arrow above reverse almost equal to', google translation) + - "⭉": [T: "tilde vasemman nuolen ylĂ€puolella"] # 0x2b49 (en: 'tilde operator above leftwards arrow', google translation) + - "⭊": [T: "likimÀÀrin yhtĂ€ suuri kuin vasemman nuolen alapuolella"] # 0x2b4a (en: 'leftwards arrow above almost equal to', google translation) + - "⭋": [T: "vasen nuoli kÀÀnnetyn tilden ylĂ€puolella"] # 0x2b4b (en: 'leftwards arrow above reverse tilde operator', google translation) + - "⭌": [T: "oikea nuoli kÀÀnnetyn tilden ylĂ€puolella"] # 0x2b4c (en: 'rightwards arrow above reverse tilde operator', google translation) + - "⭐": [T: "tĂ€hti"] # 0x2b50 (google: 'valkoinen keskisuuri tĂ€hti') + - "⭑": [T: "musta pieni tĂ€hti"] # 0x2b51 (google: 'musta pieni tĂ€hti') + - "⭒": [T: "valkoinen pieni tĂ€hti"] # 0x2b52 (google: 'valkoinen pieni tĂ€hti') + - "⭓": [T: "musta oikealle osoittava viisikulmio"] # 0x2b53 (en: 'black right pointing pentagon', google translation) + - "⭔": [T: "valkoinen oikealle osoittava viisikulmio"] # 0x2b54 (en: 'white right pointing pentagon', google translation) + - "⭕": [T: "raskas iso ympyrĂ€"] # 0x2b55 (en: 'heavy large circle', google translation) + - "⭖": [T: "raskas ovaali jonka sisĂ€llĂ€ ovaali"] # 0x2b56 (en: 'heavy oval with oval inside', google translation) + - "⭗": [T: "raskas ympyrĂ€ jonka sisĂ€llĂ€ ympyrĂ€"] # 0x2b57 (en: 'heavy circle with circle inside', google translation) + - "⭘": [T: "raskas ympyrĂ€"] # 0x2b58 (en: 'heavy circle', google translation) + - "⭙": [T: "raskas ympyröity saltire"] # 0x2b59 (en: 'heavy circled saltire', google translation) + - "⾀": [T: "suoran kulman korvaamismerkki"] # 0x2e00 (en: 'right angle substitution marker', google translation) + - "➁": [T: "suoran kulman korvaamismerkki pisteellĂ€"] # 0x2e01 (en: 'right angle dotted substitution marker', google translation) + - "⾂": [T: "vasen korvaus hakasulku"] # 0x2e02 (en: 'left substitution bracket', google translation) + - "➃": [T: "oikea korvaus hakasulku"] # 0x2e03 (en: 'right substitution bracket', google translation) + - "⾄": [T: "vasen korvaus hakasulku pisteellĂ€"] # 0x2e04 (en: 'left dotted substitution bracket', google translation) + - "⾅": [T: "oikea korvaus hakasulku pisteellĂ€"] # 0x2e05 (en: 'right dotted substitution bracket', google translation) + - "⾆": [T: "korotettu interpolointimerkki"] # 0x2e06 (en: 'raised interpolation marker', google translation) + - "⾇": [T: "korotettu interpolointimerkki pisteellĂ€"] # 0x2e07 (en: 'raised dotted interpolation marker', google translation) + - "➈": [T: "transposointimerkki pisteellĂ€"] # 0x2e08 (en: 'dotted transposition marker marker', google translation) + - "⾉": [T: "vasen transponointi hakasulku"] # 0x2e09 (en: 'left transposition bracket', google translation) + - "⾊": [T: "oikea transponointi hakasulku"] # 0x2e0a (en: 'right transposition bracket', google translation) + - "⾋": [T: "korotettu neliö"] # 0x2e0b (en: 'raised square', google translation) + - "⾌": [T: "vasen korotettu poistosulku"] # 0x2e0c (en: 'left raised omission bracket', google translation) + - "➍": [T: "oikea korotettu poistosulku"] # 0x2e0d (en: 'right raised omission bracket', google translation) + - "⾎": [T: "toimituskoronis"] # 0x2e0e (en: 'editorial coronis', google translation) + - "➏": [T: "kappale"] # 0x2e0f (en: 'paragraphos', google translation) + - "➐": [T: "haarukkakappale"] # 0x2e10 (en: 'forked paragraphos', google translation) + - "⾑": [T: "kÀÀnnetty haarukkakappale"] # 0x2e11 (en: 'reversed forked paragraphos', google translation) + - "⾒": [T: "hypodiastoli"] # 0x2e12 (en: 'hypodiastole', google translation) + - "⾓": [T: "obelos pisteellĂ€"] # 0x2e13 (en: 'dotted obelos', google translation) + - "⾔": [T: "ankkuri alaspĂ€in"] # 0x2e14 (en: 'downwards ancora', google translation) + - "⾕": [T: "ankkuri ylöspĂ€in"] # 0x2e15 (en: 'upwards ancora', google translation) + - "⾖": [T: "oikealle osoittava kulma pisteillĂ€"] # 0x2e16 (en: 'dotted right pointing angle', google translation) + - "⾗": [T: "kaksinkertainen vino tavuviiva"] # 0x2e17 (en: 'double oblique hyphen', google translation) + - "➘": [T: "kÀÀnteinen huutokysymys"] # 0x2e18 (en: 'inverted interrobang', google translation) + - "⾙": [T: "palmun oksa"] # 0x2e19 (en: 'palm branch', google translation) + - "⾚": [T: "tavuviiva treemalla"] # 0x2e1a (en: 'hyphen with diaeresis', google translation) + - "⾛": [T: "tilde ja rengas ylĂ€puolella"] # 0x2e1b (en: 'tilde with ring above', google translation) + - "⾜": [T: "vasen matala parafraasi hakasulku"] # 0x2e1c (en: 'left low paraphrase bracket', google translation) + - "➝": [T: "oikea matala parafraasi hakasulku"] # 0x2e1d (en: 'right low paraphrase bracket', google translation) + - "⾞": [T: "tilde ja piste ylĂ€puolella"] # 0x2e1e (en: 'tilde with dot above', google translation) + - "⾟": [T: "tilde ja piste alapuolella"] # 0x2e1f (en: 'tilde with dot below', google translation) + - "âž ": [T: "vasen pystysuora palkki piikillĂ€"] # 0x2e20 (en: 'left vertical bar with quill', google translation) + - "➥": [T: "oikea pystysuora palkki piikillĂ€"] # 0x2e21 (en: 'right vertical bar with quill', google translation) + - "âžą": [T: "ylĂ€vasen puolihakasulku"] # 0x2e22 (en: 'top left half bracket', google translation) + - "➣": [T: "ylĂ€oikea puolihakasulku"] # 0x2e23 (en: 'top right half bracket', google translation) + - "➀": [T: "alavasen puolihakasulku"] # 0x2e24 (en: 'bottom left half bracket', google translation) + - "âž„": [T: "alaoikea puolihakasulku"] # 0x2e25 (en: 'bottom right half bracket', google translation) + - "➊": [T: "vasen sivusuuntainen u-hakasulku"] # 0x2e26 (en: 'left sideways u bracket', google translation) + - "âž§": [T: "oikea sivusuuntainen u-hakasulku"] # 0x2e27 (en: 'right sideways u bracket', google translation) + - "âžš": [T: "vasen kaksinkertainen sulku"] # 0x2e28 (en: 'left double parentheses', google translation) + - "âž©": [T: "oikea kaksinkertainen sulku"] # 0x2e29 (en: 'right double parentheses', google translation) + - "âžȘ": [T: "kaksi pistettĂ€ yhden pisteen pÀÀllĂ€"] # 0x2e2a (en: 'two dots over one dot punctuation', google translation) + - "âž«": [T: "yksi piste kahden pisteen pÀÀllĂ€"] # 0x2e2b (en: 'one dot over two dots punctuation', google translation) + - "➏": [T: "neljĂ€ pistettĂ€ neliön muodossa"] # 0x2e2c (en: 'squared four dot punctuation', google translation) + - "âž­": [T: "viisi pistettĂ€"] # 0x2e2d (en: 'five dot mark', google translation) + - "âžź": [T: "kÀÀnnetty kysymysmerkki"] # 0x2e2e (en: 'reversed question mark', google translation) + - "➯": [T: "pystysuora tilde"] # 0x2e2f (en: 'vertical tilde', google translation) + - "âž°": [T: "rengaspiste"] # 0x2e30 (en: 'ring point', google translation) + - "âž±": [T: "sanaerotinpiste"] # 0x2e31 (en: 'word separator middle dot', google translation) + - "âžČ": [T: "kÀÀnnetty pilkku"] # 0x2e32 (en: 'turned comma', google translation) + - "âžł": [T: "nostettu piste"] # 0x2e33 (en: 'raised dot', google translation) + - "➎": [T: "nostettu pilkku"] # 0x2e34 (en: 'raised comma', google translation) + - "âž”": [T: "kÀÀnnetty puolipiste"] # 0x2e35 (en: 'turned semicolon', google translation) + - "âž¶": [T: "tikari vasemmalla suojalla"] # 0x2e36 (en: 'dagger with left guard', google translation) + - "âž·": [T: "tikari oikealla suojalla"] # 0x2e37 (en: 'dagger with right guard', google translation) + - "âžž": [T: "kÀÀnnetty tikari"] # 0x2e38 (en: 'turned dagger', google translation) + - "âžč": [T: "ylĂ€puolimerkki"] # 0x2e39 (en: 'top half section sign', google translation) # FI: translation unclear + - "âžș": [T: "kaksoisajatusviiva"] # 0x2e3a (en: 'two em dash', google translation) + - "âž»": [T: "kolmoisajatusviiva"] # 0x2e3b (en: 'three em dash', google translation) + - "〃": [T: "sama sisĂ€ltö -merkki"] # 0x3003 (google translation) + - "〈": [T: "vasen kulmasulku"] # 0x3008 (en: 'left angle bracket', google translation) + - "〉": [T: "oikea kulmasulku"] # 0x3009 (en: 'right angle bracket', google translation) + - "《": [T: "vasen kaksoiskulmasulku"] # 0x300a (google: 'vasen kaksoiskulma kiinnike') + - "》": [T: "oikea kaksoiskulmasulku"] # 0x300b (google: 'oikea kaksoiskulma kiinnike') + - "「": [T: "vasen nurkka hakasulku"] # 0x300c (en: 'left corner bracket', google translation) + - "」": [T: "oikea nurkka hakasulku"] # 0x300d (en: 'right corner bracket', google translation) + - "『": [T: "vasen valkoinen nurkka hakasulku"] # 0x300e (en: 'left white corner bracket', google translation) + - "』": [T: "oikea valkoinen nurkkahakasulku"] # 0x300f (en: 'right white corner bracket', google translation) + - "【": [T: "vasen musta linssimĂ€inen hakasulku"] # 0x3010 (en: 'left black lenticular bracket', google translation) + - "】": [T: "oikea musta linssimĂ€inen hakasulku"] # 0x3011 (en: 'right black lenticular bracket', google translation) + - "〔": [T: "vasen kilpikonnankuori hakasulku"] # 0x3014 (google: 'vasen kilpikonnan kuoren kiinnike') + - "〕": [T: "oikea kilpikonnankuori hakasulku"] # 0x3015 (google: 'oikea kilpikonnakuoren kiinnike') + - "〖": [T: "vasen valkoinen linssimĂ€inen hakasulku"] # 0x3016 (en: 'left white lenticular bracket', google translation) + - "〗": [T: "oikea valkoinen linssimĂ€inen hakasulku"] # 0x3017 (en: 'right white lenticular bracket', google translation) + - "〘": [T: "vasen valkoinen kilpikonnakuori hakasulku"] # 0x3018 (en: 'left white tortoise shell bracket', google translation) + - "〙": [T: "oikea valkoinen kilpikonnakuori hakasulku"] # 0x3019 (en: 'right white tortoise shell bracket', google translation) + - "〚": [T: "vasen valkoinen neliö hakasulku"] # 0x301a (google: 'vasen valkoinen neliömĂ€ki') + - "〛": [T: "oikea valkoinen neliö hakasulku"] # 0x301b (google: 'oikea valkoinen neliömĂ€ki') + - "〜": [T: "aaltomainen viiva"] # 0x301c (en: 'wave dash', google translation) + - "〰": [T: "aaltoileva viiva"] # 0x3030 (en: 'wavy dash', google: 'aaltoileva viiva') + - "㉈": [T: "ympyröity numero kymmenen mustalla neliöllĂ€"] # 0x3248 (en: 'circled number ten on black square', google translation) + - "㉉": [T: "ympyröity numero kaksikymmentĂ€ mustalla neliöllĂ€"] # 0x3249 (en: 'circled number twenty on black square', google translation) + - "㉊": [T: "ympyröity numero kolmekymmentĂ€ mustalla neliöllĂ€"] # 0x324a (en: 'circled number thirty on black square', google translation) + - "㉋": [T: "ympyröity numero neljĂ€kymmentĂ€ mustalla neliöllĂ€"] # 0x324b (en: 'circled number forty on blacks square', google translation) + - "㉌": [T: "ympyröity numero viisikymmentĂ€ mustalla neliöllĂ€"] # 0x324c (en: 'circled number fifty on black square', google translation) + - "㉍": [T: "ympyröity numero kuusikymmentĂ€ mustalla neliöllĂ€"] # 0x324d (en: 'circled number sixty on black square', google translation) + - "㉎": [T: "ympyröity numero seitsemĂ€nkymmentĂ€ mustalla neliöllĂ€"] # 0x324e (en: 'circled number seventy on black square', google translation) + - "㉏": [T: "ympyröity numero kahdeksankymmentĂ€ mustalla neliöllĂ€"] # 0x324f (en: 'circled number eighty on black square', google translation) + - "㉑": [T: "ympyröity numero kaksikymmentĂ€yksi"] # 0x3251 (en: 'circled number twenty one', google translation) + - "㉒": [T: "ympyröity numero kaksikymmentĂ€kaksi"] # 0x3252 (en: 'circled number twenty two', google translation) + - "㉓": [T: "ympyröity numero kaksikymmentĂ€kolme"] # 0x3253 (en: 'circled number twenty three', google translation) + - "㉔": [T: "ympyröity numero kaksikymmentĂ€neljĂ€"] # 0x3254 (en: 'circled number twenty four', google translation) + - "㉕": [T: "ympyröity numero kaksikymmentĂ€viisi"] # 0x3255 (en: 'circled number twenty five', google translation) + - "㉖": [T: "ympyröity numero kaksikymmentĂ€kuusi"] # 0x3256 (en: 'circled number twenty six', google translation) + - "㉗": [T: "ympyröity numero kaksikymmentĂ€seitsemĂ€n"] # 0x3257 (en: 'circled number twenty seven', google translation) + - "㉘": [T: "ympyröity numero kaksikymmentĂ€kahdeksan"] # 0x3258 (en: 'circled number twenty eight', google translation) + - "㉙": [T: "ympyröity numero kaksikymmentĂ€yhdeksĂ€n"] # 0x3259 (en: 'circled number twenty nine', google translation) + - "㉚": [T: "ympyröity numero kolmekymmentĂ€"] # 0x325a (en: 'circled number thirty', google translation) + - "㉛": [T: "ympyröity numero kolmekymmentĂ€yksi"] # 0x325b (en: 'circled number thirty one', google translation) + - "㉜": [T: "ympyröity numero kolmekymmentĂ€kaksi"] # 0x325c (en: 'circled number thirty two', google translation) + - "㉝": [T: "ympyröity numero kolmekymmentĂ€kolme"] # 0x325d (en: 'circled number thirty three', google translation) + - "㉞": [T: "ympyröity numero kolmekymmentĂ€neljĂ€"] # 0x325e (en: 'circled number thirty four', google translation) + - "㉟": [T: "ympyröity numero kolmekymmentĂ€viisi"] # 0x325f (en: 'circled number thirty five', google translation) + - "㊱": [T: "ympyröity numero kolmekymmentĂ€kuusi"] # 0x32b1 (en: 'circled number thirty six', google translation) + - "ăŠČ": [T: "ympyröity numero kolmekymmentĂ€seitsemĂ€n"] # 0x32b2 (en: 'circled number thirty seven', GPT-5.4 translation) + - "㊳": [T: "ympyröity numero kolmekymmentĂ€kahdeksan"] # 0x32b3 (en: 'circled number thirty eight', GPT-5.4 translation) + - "㊮": [T: "ympyröity numero kolmekymmentĂ€yhdeksĂ€n"] # 0x32b4 (en: 'circled number thirty nine', GPT-5.4 translation) + - "㊔": [T: "ympyröity numero neljĂ€kymmentĂ€"] # 0x32b5 (en: 'circled number forty', GPT-5.4 translation) + - "㊶": [T: "ympyröity numero neljĂ€kymmentĂ€yksi"] # 0x32b6 (en: 'circled number forty one', GPT-5.4 translation) + - "㊷": [T: "ympyröity numero neljĂ€kymmentĂ€kaksi"] # 0x32b7 (en: 'circled number forty two', GPT-5.4 translation) + - "㊾": [T: "ympyröity numero neljĂ€kymmentĂ€kolme"] # 0x32b8 (en: 'circled number forty three', GPT-5.4 translation) + - "ăŠč": [T: "ympyröity numero neljĂ€kymmentĂ€neljĂ€"] # 0x32b9 (en: 'circled number forty four', GPT-5.4 translation) + - "ăŠș": [T: "ympyröity numero neljĂ€kymmentĂ€viisi"] # 0x32ba (en: 'circled number forty five', GPT-5.4 translation) + - "㊻": [T: "ympyröity numero neljĂ€kymmentĂ€kuusi"] # 0x32bb (en: 'circled number forty six', GPT-5.4 translation) + - "ăŠŒ": [T: "ympyröity numero neljĂ€kymmentĂ€seitsemĂ€n"] # 0x32bc (en: 'circled number forty seven', GPT-5.4 translation) + - "ăŠœ": [T: "ympyröity numero neljĂ€kymmentĂ€kahdeksan"] # 0x32bd (en: 'circled number forty eight', GPT-5.4 translation) + - "ăŠŸ": [T: "ympyröity numero neljĂ€kymmentĂ€yhdeksĂ€n"] # 0x32be (en: 'circled number forty nine', GPT-5.4 translation) + - "㊿": [T: "ympyröity numero viisikymmentĂ€"] # 0x32bf (en: 'circled number fifty', GPT-5.4 translation) + - "㋌": [T: "elohopea"] # 0x32cc (en: 'mercury', google translation) + - "㋍": [T: "ergiĂ€"] # 0x32cd (google translation) + - "㋎": [T: "elektronivolttia"] # 0x32ce (en: 'electron volts', google translation) + - "㋏": [T: "L T D"] # 0x32cf (en: 'limited liability sign', google translation) + - "ă±": [T: "hehtopascalia"] # 0x3371 (en: 'hectopascals', google translation) + - "ăČ": [T: "daltonia"] # 0x3372 (en: 'daltons', google translation) + - "㍳": [T: "tĂ€htieteellistĂ€ yksikköÀ"] # 0x3373 (en: 'astronomical units', google translation) + - "㍮": [T: "baaria"] # 0x3374 (en: 'bars', google translation) + - "ă”": [T: "o V"] # 0x3375 (google translation) + - "ă¶": [T: "parsekia"] # 0x3376 (google translation) + - "ă·": [T: "desimetriĂ€"] # 0x3377 (en: 'decimeters', google translation) + - "㍾": [T: "neliödesimetriĂ€"] # 0x3378 (en: 'decimeters squared', google translation) + - "ăč": [T: "kuutiodesimetriĂ€"] # 0x3379 (en: 'decimeters cubed', google translation) + - "ăș": [T: "I U"] # 0x337a (en: 'instrumental units', google translation) + - "㎀": [T: "pikoampeeria"] # 0x3380 (google translation) + - "㎁": [T: "nanoampeeria"] # 0x3381 (google translation) + - "㎂": [T: "mikroampeeria"] # 0x3382 (en: 'microamps', google translation) + - "㎃": [T: "milliampeeria"] # 0x3383 (en: 'milliamps', google translation) + - "㎄": [T: "kiloampeeria"] # 0x3384 (google translation) + - "㎅": [T: "KilobittiĂ€"] # 0x3385 (en: 'kilobytes', google translation) + - "㎆": [T: "megatavua"] # 0x3386 (en: 'megabytes', google translation) + - "㎇": [T: "gigatavua"] # 0x3387 (en: 'gigabytes', google translation) + - "㎈": [T: "kaloria"] # 0x3388 (en: 'calories', google translation) + - "㎉": [T: "kilokaloria"] # 0x3389 (en: 'kilocalories', google translation) + - "㎊": [T: "pifaradayta"] # 0x338a (google translation) + - "㎋": [T: "nanofaradayta"] # 0x338b (en: 'nanofarads', google translation) + - "㎌": [T: "mikrofaradayta"] # 0x338c (en: 'microfarads', google translation) + - "㎍": [T: "mikrogrammaa"] # 0x338d (en: 'micrograms', google translation) + - "㎎": [T: "milligrammaa"] # 0x338e (en: 'milligrams', google translation) + - "㎏": [T: "kilogrammaa"] # 0x338f (en: 'kilograms', google translation) + - "㎐": [T: "hertsiĂ€"] # 0x3390 (google translation) + - "㎑": [T: "kilohertsiĂ€"] # 0x3391 (en: 'kilohertz', google translation) + - "㎒": [T: "megahertsiĂ€"] # 0x3392 (en: 'megahertz', google translation) + - "㎓": [T: "gigahertsiĂ€"] # 0x3393 (en: 'gigahertz', google translation) + - "㎔": [T: "terahertsiĂ€"] # 0x3394 (en: 'terahertz', google translation) + - "㎕": [T: "mikrolitraa"] # 0x3395 (en: 'microliters', google translation) + - "㎖": [T: "millilitraa"] # 0x3396 (en: 'milliliters', google translation) + - "㎗": [T: "desilitraa"] # 0x3397 (google translation) + - "㎘": [T: "kilolitraa"] # 0x3398 (en: 'kiloliters', google translation) + - "㎙": [T: "femtometriĂ€"] # 0x3399 (en: 'femtometers', google translation) + - "㎚": [T: "nanometriĂ€"] # 0x339a (en: 'nanometers', google translation) + - "㎛": [T: "mikrometriĂ€"] # 0x339b (en: 'micrometers', google translation) + - "㎜": [T: "millimetriĂ€"] # 0x339c (en: 'millimeters', google translation) + - "㎝": [T: "senttimetriĂ€"] # 0x339d (en: 'centimeters', google translation) + - "㎞": [T: "kilometriĂ€"] # 0x339e (en: 'kilometers', google translation) + - "㎟": [T: "neliömillimetriĂ€"] # 0x339f (en: 'millimeters squared', google translation) + - "㎠": [T: "neliösenttimetriĂ€"] # 0x33a0 (en: 'centimeters squared', google translation) + - "㎡": [T: "neliömetriĂ€"] # 0x33a1 (en: 'meters squared', google translation) + - "㎱": [T: "neliökilometriĂ€"] # 0x33a2 (en: 'kilometers squared', google translation) + - "㎣": [T: "kuutiomillimetriĂ€"] # 0x33a3 (en: 'millimeters cubed', google translation) + - "㎀": [T: "kuutiosenttimetriĂ€"] # 0x33a4 (en: 'centimeters cubed', google translation) + - "㎄": [T: "kuutiometriĂ€"] # 0x33a5 (en: 'meters cubed', google translation) + - "㎩": [T: "kuutiokilometriĂ€"] # 0x33a6 (en: 'kilometers cubed', google translation) + - "㎧": [T: "metriĂ€ sekunnissa"] # 0x33a7 (en: 'meters per second', google translation) + - "㎹": [T: "metriĂ€ per neliösekunti"] # 0x33a8 (en: 'meters per second squared', google translation) + - "㎩": [T: "pascalia"] # 0x33a9 (google translation) + - "ăŽȘ": [T: "kilopascalia"] # 0x33aa (google translation) + - "㎫": [T: "megapascalia"] # 0x33ab (google translation) + - "㎬": [T: "gigapascalia"] # 0x33ac (google translation) + - "㎭": [T: "radiaania"] # 0x33ad (en: 'rads', google translation) + - "㎼": [T: "radiaania sekunnissa"] # 0x33ae (en: 'rads per second', google translation) + - "㎯": [T: "radiaania neliösekunnissa"] # 0x33af (en: 'rads per second squared', google translation) + - "㎰": [T: "pikosekuntia"] # 0x33b0 (en: 'picoseconds', google translation) + - "㎱": [T: "nanosekuntia"] # 0x33b1 (en: 'nanoseconds', google translation) + - "ăŽČ": [T: "mikrosekuntia"] # 0x33b2 (en: 'microseconds', google translation) + - "㎳": [T: "millisekuntia"] # 0x33b3 (en: 'milliseconds', google translation) + - "㎮": [T: "pikovolttia"] # 0x33b4 (google translation) + - "㎔": [T: "nanovolttia"] # 0x33b5 (en: 'nanovolts', google translation) + - "㎶": [T: "mikrovolttia"] # 0x33b6 (en: 'microvolts', google translation) + - "㎷": [T: "millivolttia"] # 0x33b7 (google translation) + - "㎾": [T: "kilovolttia"] # 0x33b8 (en: 'kilovolts', google translation) + - "ăŽč": [T: "megavolttia"] # 0x33b9 (google translation) + - "ăŽș": [T: "pikowattia"] # 0x33ba (google translation) + - "㎻": [T: "nanowattia"] # 0x33bb (en: 'nanowatts', google translation) + - "ăŽŒ": [T: "mikrowattia"] # 0x33bc (en: 'microwatts', google translation) + - "ăŽœ": [T: "milliwattia"] # 0x33bd (google translation) + - "ăŽŸ": [T: "kilowattia"] # 0x33be (en: 'kilowatts', google translation) + - "㎿": [T: "megawattia"] # 0x33bf (google translation) + - "㏀": [T: "kilo-ohmia"] # 0x33c0 (google translation) + - "㏁": [T: "megaohmia"] # 0x33c1 (google translation) + - "㏂": [T: "a m"] # 0x33c2 (en: 'attometers', google translation) + - "㏃": [T: "becquerelia"] # 0x33c3 (google translation) + - "㏄": [T: "kuutiosenttimetriĂ€"] # 0x33c4 (en: 'cubic centimeters', google translation) + - "㏅": [T: "candelaa"] # 0x33c5 (google translation) + - "㏆": [T: "coulombia kilogrammassa"] # 0x33c6 (en: 'coulombs per kilogram', google translation) + - "㏇": [T: "C o piste"] # 0x33c7 (en: 'cardiac output', google translation) + - "㏈": [T: "desibeliĂ€"] # 0x33c8 (en: 'decibels', google translation) + - "㏉": [T: "grayta"] # 0x33c9 (en: 'grays', google translation) + - "㏊": [T: "hehtaaria"] # 0x33ca (en: 'hectares', google translation) + - "㏋": [T: "hevosvoimaa"] # 0x33cb (en: 'horsepower', google translation) + - "㏌": [T: "tuumaa"] # 0x33cc (en: 'inches', google translation) + - "㏍": [T: "kilokelviniĂ€"] # 0x33cd (google translation) + - "㏎": [T: "kilometriĂ€"] # 0x33ce (en: 'kilometers', google translation) + - "㏏": [T: "solmua"] # 0x33cf (en: 'knots', google translation) + - "㏐": [T: "lumenia"] # 0x33d0 (google translation) + - "㏑": [T: "luonnollinen logaritmi"] # 0x33d1 (en: 'natural log', google translation) + - "㏒": [T: "logaritmi"] # 0x33d2 (en: 'logarithm', google translation) + - "㏓": [T: "luxia"] # 0x33d3 (google translation) + - "㏔": [T: "millibarnia"] # 0x33d4 (google translation) + - "㏕": [T: "milliĂ€"] # 0x33d5 (en: 'mills', google translation) + - "㏖": [T: "moolia"] # 0x33d6 (en: 'moles', google translation) + - "㏗": [T: "p H"] # 0x33d7 (google translation) + - "㏘": [T: "pikometriĂ€"] # 0x33d8 (en: 'picometers', google translation) + - "㏙": [T: "miljoonasosaa"] # 0x33d9 (en: 'parts per million', google translation) + - "㏚": [T: "petaröntgeniĂ€"] # 0x33da (google translation) + - "㏛": [T: "steradiaania"] # 0x33db (en: 'steradians', google translation) + - "㏜": [T: "sievertiĂ€"] # 0x33dc (en: 'sieverts', google translation) + - "㏝": [T: "weberiĂ€"] # 0x33dd (google translation) + - "㏞": [T: "volttia per metri"] # 0x33de (en: 'volts per meter', google translation) + - "㏟": [T: "ampeeria per metri"] # 0x33df (en: 'amps per meter', google translation) + - "㏿": [T: "gallonaa"] # 0x33ff (en: 'gallons', google translation) + - "": [T: "on yhtĂ€ suuri kuin ja hattu alapuolella"] # 0xe900 (en: 'equals with hat below', google translation) + - "": [T: "on yhtĂ€ suuri kuin ja plus ylĂ€puolella"] # 0xe901 (en: 'equals with plus above', google translation) + - "": [T: "on yhtĂ€ suuri kuin ja plus alapuolella"] # 0xe902 (en: 'equals with plus below', google translation) + - "": [T: "tilde ja plus ylĂ€puolella"] # 0xe903 (en: 'tilde with plus above', google translation) + - "": [T: "tilde ja plus alapuolella"] # 0xe904 (en: 'tilde with plus below', google translation) + - "": [T: "kaksinkertainen on yhtĂ€ suuri kuin ja alapuolella suurempi kuin"] # 0xe908 (en: 'equal double over greater than', google translation) + - "": [T: "kaksinkertainen on yhtĂ€ suuri kuin ja alapuolella pienempi kuin"] # 0xe909 (en: 'equal double over less than', google translation) + - "": [T: "sisĂ€ltÀÀ tai on yhtĂ€ suuri kuin"] # 0xe90a (en: 'contains or equal to', google translation) + - "": [T: "ylijoukko tai yhtĂ€ suuri kuin"] # 0xe90b (en: 'superset of or equal to', google translation) + - "": [T: "osajoukko tai yhtĂ€ suuri kuin"] # 0xe90c (en: 'subset of or equal to', google translation) + - "": [T: "on yhtĂ€ suuri kuin ja alapuolella pienempi kuin"] # 0xe90d (en: 'equal over less than', google translation) + - "": [T: "kuuluu joukkoon tai on yhtĂ€ kuin"] # 0xe912 (en: 'element of or equal to', google translation) + - "": [T: "yhtĂ€ suuri tai suurempi kuin"] # 0xe913 (en: 'equal to or greater than', google translation) + - "": [T: "likimÀÀrin ylijoukko"] # 0xe914 (en: 'approximate superset of', google translation) + - "": [T: "likimÀÀrin osajoukko"] # 0xe915 (en: 'approximate subset of', google translation) + - "": [T: "ylijoukko pisteellĂ€ sisĂ€ltÀÀ alirelaationa"] # 0xe916 (en: 'superset of with dot includes as sub relation', google translation) # FI: translation unclear + - "": [T: "osajoukko pisteellĂ€ sisĂ€ltyy alirelaationa"] # 0xe917 (en: 'subset of with dot is included in as sub relation', google translation) # FI: translation unclear + - "": [T: "on yhtĂ€ suuri kuin ja piste alapuolella"] # 0xe918 (en: 'equal with dot below', google translation) + - "": [T: "vasen piste jonka alapuolella miinus jonka alapuolella oikea piste"] # 0xe919 (en: 'left dot over minus over right dot', google translation) + - "": [T: "oikea piste jonka alapuolella miinus jonka alapuolella vasen piste"] # 0xe91a (en: 'right dot over minus over left dot', google translation) + - "": [T: "melkein yhtĂ€ suuri kuin miinus"] # 0xe91f (en: 'almost equal to minus', google translation) + - "": [T: "kaksinkertainen kulmikas malja"] # 0xe920 (en: 'double square cup', google translation) + - "": [T: "kaksinkertainen kulmikas kupu"] # 0xe921 (en: 'double square cap', google translation) + - "": [T: "pienempi kuin, yhtĂ€ suuri kuin tai suurempi kuin"] # 0xe922 (en: 'less than equal to or greater than', google translation) + - "": [T: "tilde pisteellĂ€"] # 0xe924 (en: 'tilde with dot', google translation) + - "": [T: "tilde kahdella pisteellĂ€"] # 0xe925 (en: 'tilde with two dots', google translation) + - "": [T: "pienempi kuin, suurempi kuin tai yhtĂ€ suuri kuin"] # 0xe926 (en: 'less than greater than or equal to', google translation) + - "": [T: "suurempi kuin, pienempi kuin tai yhtĂ€ suuri kuin"] # 0xe927 (en: 'greater than less than or equal to', google translation) + - "": [T: "vastaa tai on pienempi kuin"] # 0xe928 (en: 'equivalent to or less than', google translation) + - "": [T: "vastaa tai on suurempi kuin"] # 0xe929 (en: 'equivalent to or greater than', google translation) + - "î€Ș": [T: "vasen avoin laatikkooperaattori"] # 0xe92a (en: 'left open box operator', google translation) + - "": [T: "oikea avoin laatikkooperaattori"] # 0xe92b (en: 'right open box operator', google translation) + - "": [T: "identtinen pisteellĂ€"] # 0xe92c (en: 'identical to with dot', google translation) + - "": [T: "suurempi kuin, yhtĂ€ suuri kuin tai pienempi kuin"] # 0xe92d (en: 'greater than equal to or less than', google translation) + - "": [T: "palkkioperaattori"] # 0xe92e (en: 'bar operator', google translation) + - "": [T: "kaksinkertainen palkkioperaattori"] # 0xe92f (en: 'double bar operator', google translation) + - "": [T: "kolminkertainen palkkioperaattori"] # 0xe930 (en: 'triple bar operator', google translation) + - "î€Č": [T: "pienempi kuin tai likimÀÀrin yhtĂ€ suuri kuin"] # 0xe932 (en: 'less than or approximately equal to', google translation) + - "": [T: "suuremmpi kuin tai likimÀÀrin yhtĂ€ suuri kuin"] # 0xe933 (en: 'greater than or approximately equal to', google translation) + - "": [T: "sisĂ€kkĂ€inen vĂ€hemmĂ€n kuin"] # 0xe936 (en: 'nested less than', google translation) + - "": [T: "sisĂ€kkĂ€inen suurempi kuin"] # 0xe937 (en: 'nested greater than', google translation) + - "î€ș": [T: "edeltÀÀ tai vastaa"] # 0xe93a (en: 'precedes or equivalent to', google translation) + - "": [T: "seuraa tai vastaa"] # 0xe93b (en: 'succeeds or equivalent to', google translation) + - "î„€": [T: "edeltÀÀ ja alapuolella on yhtĂ€ suuri kuin"] # 0xe940 (en: 'precedes over equal', google translation) + - "": [T: "seuraa ja alapuolella on yhtĂ€ suuri kuin"] # 0xe941 (en: 'succeeds over equal', google translation) + - "î„‚": [T: "vĂ€hemmĂ€n kuin, on yhtĂ€ suuri kuin, vino suurempi kuin"] # 0xe942 (en: 'less equal slanted greater', google translation) # FI: translation unclear + - "": [T: "suurempi kuin, on yhtĂ€ suuri kuin, vino pienempi kuin"] # 0xe943 (en: 'greater equal slanted less', google translation) + - "": [T: "tĂ€yttÀÀ ehdon"] # 0xe948 (en: 'satisfied by', google translation) # FI: translation unclear + - "": [T: "laiska s"] # 0xe949 (en: 'lazy s', google translation) + - "": [T: "ei vĂ€ite"] # 0xe94a (en: 'not assertion', google translation) # FI: translation unclear + - "î„‹": [T: "kaksinkertainen on yhtĂ€ suuri kuin"] # 0xe94b (en: 'double equal', google translation) + - "": [T: "kolminkertainen on yhtĂ€ suuri kuin"] # 0xe94c (en: 'triple equal', google translation) + - "": [T: "sÀÀntö viivĂ€stynyt"] # 0xe94d (en: 'rule delayed', google translation) # FI: translation unclear + - "": [T: "alias delimiter"] # 0xe94e (google translation) # FI: translation unclear + - "": [T: "normaali alaryhmĂ€ palkilla"] # 0xe950 (en: 'normal subgroup of with bar', google translation) + - "î„‘": [T: "sisĂ€ltÀÀ normaalina alaryhmĂ€nĂ€ palkilla"] # 0xe951 (en: 'contains as normal subgroup with bar', google translation) + - "î„”": [T: "pyöreĂ€ seuraa"] # 0xe954 (en: 'round implies', google translation) # FI: translation unclear + - "î„•": [T: "hymy palkin alla"] # 0xe955 (en: 'smile under bar', google translation) # FI: translation unclear + - "î„–": [T: "murjotus palkin alla"] # 0xe956 (en: 'frown over bar', google translation) # FI: translation unclear + - "î„—": [T: "ylijoukko tai lĂ€hes yhtĂ€ kuin"] # 0xe957 (en: 'superset of or almost equal to', google translation) + - "": [T: "osajoukko tai lĂ€hes yhtĂ€ kuin"] # 0xe958 (en: 'subset of or almost equal to', google translation) + - "î„™": [T: "suurempi kuin melkein yhtĂ€ suuri kuin tai pienempi kuin"] # 0xe959 (en: 'greater than almost equal to or less than', google translation) + - "": [T: "pienempi kuin melkein yhtĂ€ suuri kuin tai suurempi kuin"] # 0xe95a (en: 'less than almost equal or greater than', google translation) + - "": [T: "kaksinkertainen looginen tai"] # 0xe95c (en: 'double logical or', google translation) + - "": [T: "kaksinkertainen looginen ja"] # 0xe95d (en: 'double logical and', google translation) + - "": [T: "looginen tai ja kaksinkertainen palkki alapuolella"] # 0xe95e (en: 'logical or with double bar below', google translation) + - "": [T: "looginen tai ja palkki alapuolella"] # 0xe95f (en: 'logical or with bar below', google translation) + - "": [T: "melkein yhtĂ€ suuri kuin ja alapuolella yhtĂ€ suuri kuin"] # 0xe962 (en: 'almost equal over equal', google translation) + - "î„€": [T: "vasemmalle osoittava kolmio kahtiajakavalla palkilla"] # 0xe964 (en: 'left pointing triangle with bisecting bar', google translation) + - "î„„": [T: "oikealle osoittava kolmio kahtiajakavalla palkilla"] # 0xe965 (en: 'right pointing triangle with bisecting bar', google translation) + - "": [T: "on yhtĂ€ suuri kuin katkoviivoitetulla ylĂ€viivalla"] # 0xe966 (en: 'equals with dotted top line', google translation) + - "î„§": [T: "edeltÀÀ kaksoispisteellĂ€"] # 0xe967 (en: 'precedes with colon', google translation) + - "": [T: "seuraa kaksoispisteellĂ€"] # 0xe968 (en: 'succeeds with colon', google translation) + - "î„©": [T: "pienempi tai yhtĂ€ suuri kuin vino"] # 0xe969 (en: 'smaller than or equal slanted', google translation) # FI: : translation unclear + - "î„Ș": [T: "suurempi kuin tai yhtĂ€ suuri kuin vino"] # 0xe96a (en: 'larger than or equal slanted', google translation) # FI: : translation unclear + - "î„«": [T: "sisĂ€kkĂ€inen paljon pienempi kuin"] # 0xe96b (en: 'nested very much less than', google translation) + - "": [T: "sisĂ€kkĂ€inen paljon suurempi kuin"] # 0xe96c (en: 'nested very much greater than', google translation) + - "î„­": [T: "ero variantin vĂ€lillĂ€"] # 0xe96d (en: 'difference between variant', google translation) # FI: unclear translation + - "": [T: "pienempi kuin jonka pÀÀllĂ€ suurempi kuin"] # 0xe96e (en: 'less than greater than overlay', google translation) + - "": [T: "looginen tai jonka pÀÀllĂ€ looginen tai"] # 0xe96f (en: 'logical or logical and overlay', google translation) + - "î„°": [T: "ylijoukko ylijoukon ylĂ€puolella"] # 0xe970 (en: 'superset over superset', google translation) + - "": [T: "osajoukko osajoukon ylĂ€puolella"] # 0xe971 (en: 'subset over subset', google translation) + - "î„Č": [T: "ylijoukko osajoukon ylĂ€puolella"] # 0xe972 (en: 'superset over subset', google translation) + - "": [T: "osajoukko ylijoukon ylĂ€puolella"] # 0xe973 (en: 'subset over superset', google translation) + - "î„č": [T: "kolminkertainen pystysuora palkki"] # 0xe979 (en: 'triple vertical bar', google translation) + - "î„ș": [T: "nelinkertainen pystysuora pistepari"] # 0xe97a (en: 'paired quadruple vertical dots', google translation) # FI: translation unclear + - "î„»": [T: "kohtisuorassa ja alapuolella palkki"] # 0xe97b (en: 'perpendicular over bar', google translation) + - "": [T: "vasen kÀÀntöportti kaksinkertainen pystysuora palkki"] # 0xe97c (en: 'left turnstile double vertical bar', google translation) + - "": [T: "kaksinkertainen vasen kÀÀntöportti kaksinkertainen pystysuora palkki"] # 0xe97d (en: 'double left turnstile double vertical bar', google translation) + - "": [T: "kohtisuorassa jonka alapuolella kÀÀnnetty kohtisuorassa"] # 0xe97e (en: 'perpendicular over inverted perpendicular', google translation) + - "": [T: "kaksinkertgainen vasen kÀÀntöportti pystysuora palkki"] # 0xe97f (en: 'double left turnstile vertical bar', google translation) + - "": [T: "pallomainen kulma avautuu"] # 0xe980 (en: 'spherical angle opening up', google translation) + - "": [T: "kaksinkertainen vinoviiva"] # 0xe981 (en: 'double slash', google translation) + - "": [T: "suora kulma nurkalla"] # 0xe982 (en: 'right angle with corner', google translation) + - "": [T: "ympyröity pystysuora palkki"] # 0xe984 (en: 'circled vertical bar', google translation) + - "": [T: "ympyröity jakomerkki"] # 0xe985 (en: 'circled division sign', google translation) + - "": [T: "katkoviivoitettu vinoviiva"] # 0xe986 (en: 'dashed solidus', google translation) + - "": [T: "katkoviivoitettu kenoviiva"] # 0xe987 (en: 'dashed backslash', google translation) + - "": [T: "katkoviivoitettu puolivĂ€liviiva"] # 0xe988 (en: 'dashed mid line', google translation) # FI: : translation unclear + - "": [T: "katkoviivoitettu pystysuora palkki"] # 0xe989 (en: 'dashed vertical bar', google translation) + - "": [T: "kohtisuorassa ja s"] # 0xe98a (en: 'perpendicular with s', google translation) + - "": [T: "kulma ja s"] # 0xe98b (en: 'angle with s', google translation) + - "": [T: "pallomainen kulma avautuu vasemmalle"] # 0xe98c (en: 'spherical angle opening left', google translation) + - "": [T: "vasemmalle avautuva kulma"] # 0xe98d (en: 'angle opening left', google translation) + - "": [T: "pystysuora palkki kaksoiskoukulla"] # 0xe98e (en: 'vertical bar with double hook', google translation) + - "": [T: "keskikokoinen pisteoperaattori vapaa radikaali"] # 0xe98f (en: 'medium dot operator free radical', google translation) + - "": [T: "valkoinen ylöspĂ€in osoittava kolmio palkin ylĂ€puolella"] # 0xe990 (en: 'white up pointing triangle above bar', google translation) + - "": [T: "identtinen ja yhdensuuntainen"] # 0xe991 (en: 'identical and parallel to', google translation) + - "": [T: "smash tulo"] # 0xe992 (en: 'smash product', google translation) # FI: meaning unclear + - "": [T: "kolminkertainen palkkioperaattori vaakasuoralla palkilla"] # 0xe993 (en: 'triple bar operator with horizontal bar', google translation) + - "": [T: "identtinen kaksoisvinoviivalla"] # 0xe994 (en: 'identical to with double slash', google translation) + - "": [T: "kolminkertaiset yliviivatut palkit"] # 0xe995 (en: 'triple crossed bars', google translation) # FI: : translation unclear + - "": [T: "pystysuora palkki ympyrĂ€n ylĂ€puolella"] # 0xe996 (en: 'vertical bar over circle', google translation) + - "": [T: "pystysuora verrannollinen"] # 0xe997 (en: 'vertical proportional to', google translation) + - "": [T: "musta kuun viimeinen neljĂ€nnes"] # 0xe998 (en: 'black last quarter moon', google translation) + - "": [T: "musta kuun ensimmĂ€inen neljĂ€nnes"] # 0xe999 (en: 'black first quarter moon', google translation) + - "": [T: "negatiivinen siniaalto"] # 0xe9a0 (en: 'negative sine wave', google translation) + - "": [T: "piste sulkujen sisĂ€llĂ€"] # 0xe9a1 (en: 'parenthesized dot', google translation) + - "": [T: "sulku"] # 0xe9a2 (en: 'parens', google translation) # FI: translation unclear, "parenthesis"? + - "": [T: "valkoinen hymy"] # 0xe9a3 (en: 'white smile', google translation) + - "": [T: "valkoinen murjotus"] # 0xe9a4 (en: 'white frown', google translation) + - "": [T: "kuusikulmio"] # 0xe9a5 (en: 'hexagon', google translation) + - "": [T: "vastaa ja alapuolella plus"] # 0xe9a6 (en: 'equivalent to over plus', google translation) + - "": [T: "plus ja alapuolella vastaa"] # 0xe9a7 (en: 'plus over equivalent to', google translation) + - "": [T: "leikkaus serifillĂ€"] # 0xe9b0 (en: 'intersection serifs', google translation) + - "": [T: "unioni serifillĂ€"] # 0xe9b1 (google translation) + - "îŠČ": [T: "neliömĂ€inen leikkaus serifillĂ€"] # 0xe9b2 (en: 'square intersection serifs', google translation) + - "": [T: "neliömĂ€inen unioni serifillĂ€"] # 0xe9b3 (google translation) + - "î§ ": [T: "edeltÀÀ, on yhtĂ€ kuin tai seuraa"] # 0xe9e0 (en: 'precedes equivalent to or succeeds', google translation) + - "î§Ą": [T: "seuraa, on yhtĂ€ kuin tai edeltÀÀ"] # 0xe9e1 (en: 'succeeds equivalent to or precedes', google translation) + - "î§ą": [T: "edeltÀÀ, on lĂ€hes yhtĂ€ kuin tai seuraa"] # 0xe9e2 (en: 'precedes almost equal to or succeeds', google translation) + - "î§Ł": [T: "seuraa, on lĂ€hes yhtĂ€ kuin tai edeltÀÀ"] # 0xe9e3 (en: 'succeeds almost equal to or precedes', google translation) + - "î§°": [T: "vĂ€hemmĂ€n kuin, vastaa tai suurempi kuin"] # 0xe9f0 (en: 'less than equivalent to or greater than', google translation) + - "î§±": [T: "suurempi kuin, vastaa tai vĂ€hemmĂ€n kuin"] # 0xe9f1 (en: 'greater than equivalent to or less than', google translation) + - "": [T: "ei hyvin paljon pienempi kuin"] # 0xea00 (en: 'not vert much less than', google translation) # FI: translation unclear, not sure if vert is very or vertical + - "": [T: "ei hyvin paljon suurempi kuin"] # 0xea01 (en: 'not vert much greater than', google translation) # FI: translation unclear, not sure if vert is very or vertical + - "": [T: "ei paljon pienempi kuin variantti"] # 0xea02 (en: 'not much less than variant', google translation) # FI: translation unclear + - "": [T: "ei paljon suurempi kuin variantti"] # 0xea03 (en: 'not much greater than variant', google translation) # FI: translation unclear + - "": [T: "pienempi kuin mutta ei yhtĂ€ suuri kuin"] # 0xea04 (en: 'less vert not double equals', google translation) # FI: translation unclear + - "": [T: "suurempi kuin mutta ei yhtĂ€ suuri kuin"] # 0xea05 (en: 'gt vert not double equals', google translation) # FI: translation unclear + - "": [T: "ei pienempi tai yhtĂ€ suuri kuin"] # 0xea06 (en: 'not less than or equal to', google translation) + - "": [T: "ei suurempi tai yhtĂ€ suuri kuin"] # 0xea07 (en: 'not greater than or equal to', google translation) + - "": [T: "ei yhtĂ€ suuri kuin eikĂ€ pienempi kuin"] # 0xea09 (en: 'neither equal to nor less than', google translation) + - "": [T: "ei sisĂ€llĂ€ tai ole yhtĂ€ suuri kuin"] # 0xea0a (en: 'does not contain or equal to', google translation) + - "": [T: "ei ylijoukko tai yhtĂ€ suuri kuin"] # 0xea0b (en: 'neither superset of nor equal to', google translation) + - "": [T: "ei osajoukko tai yhtĂ€ suuri kuin"] # 0xea0c (en: 'neither subset of nor equal to', google translation) + - "": [T: "kenoviiva osajoukko"] # 0xea0d (en: 'reverse solidus subset', google translation) + - "": [T: "ei yhtĂ€ suuri tai suurempi kuin"] # 0xea0e (en: 'neither equal to nor greater than', google translation) + - "": [T: "ei miinus tilde -operaattori"] # 0xea0f (en: 'not minus tilde operator', google translation) + - "": [T: "ei yhtĂ€ suuri kuin tai pienempi kuin"] # 0xea10 (en: 'neither equal to nor less than', google translation) + - "": [T: "ei tilde -operaattori"] # 0xea11 (en: 'not tilde operator', google translation) + - "": [T: "ei kuulu joukkoon tai ole yhtĂ€ suuri kuin"] # 0xea12 (en: 'not element of or equal to', google translation) + - "": [T: "ei yhtĂ€ suuri kuin tai suurempi kuin"] # 0xea13 (en: 'neither equal to nor greater than', google translation) + - "": [T: "ei melkein yhtĂ€ suuri"] # 0xea14 (en: 'not almost equal', google translation) + - "": [T: "ei seuraa vastaavaa"] # 0xea15 (en: 'not succeeds similar', google translation) # FI: translation unclear + - "": [T: "pienempi kuin tai vino yhtĂ€ suuri kuin vinoviivalla"] # 0xea16 (en: 'less than or slanted equal to with slash', google translation) + - "": [T: "suurempi kuin tai vino yhtĂ€ suuri kuin vinoviivalla"] # 0xea17 (en: 'greater than or slanted equal to with slash', google translation) + - "": [T: "ylijoukko vinoviiva"] # 0xea1a (google translation) + - "": [T: "ei sisĂ€llĂ€"] # 0xea1b (en: 'does not contain', google translation) + - "": [T: "ei pienempi kuin tai yhtĂ€ suuri kuin"] # 0xea1d (en: 'not less than or equal to', google translation) + - "": [T: "ei suurempi kuin tai yhtĂ€ suuri kuin"] # 0xea1e (en: 'not greater than or equal to', google translation) + - "": [T: "ei melkein yhtĂ€ suuri kuin miinus"] # 0xea1f (en: 'not almost equal to minus', google translation) + - "îšą": [T: "ei kuulu joukkoon ylĂ€pisteellĂ€"] # 0xea22 (en: 'negated set membership dot above', google translation) + - "": [T: "ei vert kulma"] # 0xea2c (en: 'not vert angle', google translation) # FI: translation unclear + - "îš­": [T: "ei yhdensuuntainen vino"] # 0xea2d (en: 'not parallel slanted', google translation) + - "îšź": [T: "ei palkkioperaattori"] # 0xea2e (en: 'not bar operator', google translation) + - "": [T: "ei kaksoispalkkioperaattori"] # 0xea2f (en: 'not double bar operator', google translation) + - "îš°": [T: "ei kolminkertainen palkkioperaattori"] # 0xea30 (en: 'not triple bar operator', google translation) + - "îšČ": [T: "vĂ€hemmĂ€n kuin, mutta ei suunnilleen yhtĂ€ suuri kuin"] # 0xea32 (en: 'less than but not approximately equal to', google translation) + - "îšł": [T: "suurempi kuin, mutta ei suunnilleen yhtĂ€ suuri kuin"] # 0xea33 (en: 'greater than but not approximately equal to', google translation) + - "": [T: "vĂ€hemmĂ€n kuin tai ei yhtĂ€ suuri kuin"] # 0xea34 (en: 'less than or not equal to', google translation) + - "îš”": [T: "suurempi kuin tai ei yhtĂ€ suuri kuin"] # 0xea35 (en: 'greater than or not equal to', google translation) + - "îš¶": [T: "ei sisĂ€kkĂ€inen vĂ€hemmĂ€n kuin"] # 0xea36 (en: 'not nested less than', google translation) # FI: translation unclear + - "îš·": [T: "ei sisĂ€kkĂ€inen suurempi kuin"] # 0xea37 (en: 'not nested greater than', google translation) # FI: translation unclear + - "îšž": [T: "ei paljon pienempi kuin"] # 0xea38 (en: 'not much less than', google translation) + - "îšč": [T: "ei paljon suurempi kuin"] # 0xea39 (en: 'not much greater than', google translation) + - "îšș": [T: "edeltÀÀ, mutta ei vastaa"] # 0xea3a (en: 'precedes but not equivalent to', google translation) + - "îš»": [T: "onnistuu, mutta ei vastaa"] # 0xea3b (en: 'succeeds but not equivalent to', google translation) + - "": [T: "edeltÀÀ, mutta ei yhtĂ€ suuri kuin"] # 0xea3c (en: 'precedes but not equal to', google translation) + - "îšœ": [T: "seuraa, mutta ei yhtĂ€ suuri kuin"] # 0xea3d (en: 'succeeds but not equal to', google translation) + - "": [T: "ei ole yhtĂ€ suuri kuin tai edeltÀÀ"] # 0xea3e (en: 'does not equal or precede', google translation) + - "îšż": [T: "ei ole yhtĂ€ suuri kuin tai seuraa"] # 0xea3f (en: 'does not equal or succeed', google translation) + - "": [T: "edeltÀÀ, mutta ei yhtĂ€ suuri kuin"] # 0xea40 (en: 'precedes but not equal to', google translation) + - "": [T: "seuraa, mutta ei yhtĂ€ suuri kuin"] # 0xea41 (en: 'succeeds but not equal to', google translation) + - "": [T: "ei osajoukko tai yhtĂ€ suuri kuin"] # 0xea42 (en: 'not subset of nor equal to', google translation) + - "": [T: "ei ylijoukko tai yhtĂ€ suuri kuin"] # 0xea43 (en: 'not superset of nor equal to', google translation) + - "": [T: "osajoukko tai ei yhtĂ€ suuri kuin"] # 0xea44 (en: 'subset of or not equal to', google translation) + - "": [T: "ylijoukko tai ei yhtĂ€ suuri kuin"] # 0xea45 (en: 'superset of or not equal to', google translation) + - "": [T: "ei osajoukko tai yhtĂ€ suuri kuin"] # 0xea46 (en: 'not subset of nor equal to', google translation) + - "": [T: "ei ylijoukko tai yhtĂ€ suuri kuin"] # 0xea47 (en: 'not superset of nor equal to', google translation) + - "": [T: "ei kolminkertainen pienempi kuin"] # 0xea48 (en: 'not triple less than', google translation) + - "": [T: "ei kolminkertainen suurempi kuin"] # 0xea49 (en: 'not triple greater than', google translation) + - "": [T: "ei edellĂ€ on yhtĂ€ suuri kuin"] # 0xea4c (en: 'not precedes equals', google translation) + - "": [T: "ei seuraa on yhtĂ€ suuri kuin"] # 0xea4d (en: 'not succeeds equals', google translation) + - "": [T: "ei normaali aliryhmĂ€ palkilla"] # 0xea50 (en: 'not normal subgroup of with bar', google translation) + - "": [T: "ei sisĂ€llĂ€ normaalina aliryhmĂ€nĂ€ palkilla"] # 0xea51 (en: 'does not contain as normal subgroup with bar', google translation) + - "": [T: "ei ero vĂ€lillĂ€"] # 0xea52 (en: 'not difference between', google translation) + - "": [T: "ei geometrisesti vastaa"] # 0xea53 (en: 'not geometrically equivalent to', google translation) + - "": [T: "ei vert samanlainen"] # 0xea54 (en: 'not vert similar', google translation) # FI: translation unclear + - "": [T: "ei yhtĂ€ suuri tai samanlainen"] # 0xea55 (en: 'not equal or similar', google translation) + - "": [T: "ei vert likimÀÀrĂ€inen"] # 0xea56 (en: 'not vert approximate', google translation) + - "": [T: "ei likimÀÀrĂ€isesti identtinen"] # 0xea57 (en: 'not approximately identical to', google translation) + - "": [T: "ei kumpu yhtĂ€ suuri kuin"] # 0xea58 (en: 'not bumpy equals', google translation) # FI: translation unclear + - "": [T: "ei kumpu yksiviivainen yhtĂ€ suuri kuin"] # 0xea59 (en: 'not bumpy single equals', google translation) # FI: translation unclear + - "": [T: "ei yhtĂ€ suuri kuin piste"] # 0xea5a (en: 'not equal dot', google translation) + - "": [T: "kÀÀnnetty ei vastaa"] # 0xea5b (en: 'reverse not equivalent', google translation) + - "î© ": [T: "ei neliömĂ€inen osajoukko"] # 0xea60 (en: 'not square subset', google translation) + - "": [T: "ei nelimĂ€inen ylijoukko"] # 0xea61 (en: 'not square superset', google translation) + - "": [T: "ei melkein yhtĂ€ suuri ja alapuolella yhtĂ€ suuri kuin"] # 0xea62 (en: 'not almost equal over equal', google translation) + - "": [T: "ei tiukasti vastaa"] # 0xea63 (en: 'not strictly equivalent to', google translation) + - "î©€": [T: "ei kongruentti piste"] # 0xea64 (en: 'not congruent dot', google translation) + - "î©„": [T: "kÀÀnnetty ei ole yhtĂ€ suuri kuin"] # 0xea65 (en: 'reverse not equal', google translation) + - "î©°": [T: "ei vasen kolmio on yhtĂ€ suuri kuin"] # 0xea70 (en: 'not vert left triangle equals', google translation) # FI: translation unclear + - "": [T: "ei oikea on yhtĂ€ suuri kuin"] # 0xea71 (en: 'not vert right triangle equals', google translation) # FI: translation unclear + - "îȘ€": [T: "ei osittainen"] # 0xea80 (en: 'not partial', google translation) + - "": [T: "nuolen koristeiden pidennys"] # 0xeb00 (en: 'arrow embellishment extender', google translation) # FI: translation unclear + - "": [T: "oikea nuoli vasemman nuolen ylĂ€puolella"] # 0xeb01 (en: 'arrow rightwards over arrow leftwards', google translation) + - "": [T: "oikea nuoli vasemman nuolen ylĂ€puolella"] # 0xeb02 (en: 'arrow rightwards over arrow leftwards', google translation) + - "": [T: "oikea harppuuna vasemman harppuunan ylĂ€puolella"] # 0xeb03 (en: 'harpoon right over harpoon left', google translation) + - "": [T: "oikea harppuuna vasemman harppuunan ylĂ€puolella"] # 0xeb04 (en: 'harpoon right over harpoon left', google translation) + - "": [T: "koillis-lounaskaksoisnuoli"] # 0xeb05 (en: 'double arrow northeast southwest', google translation) + - "": [T: "luoteis-kaakkoiskaksoisnuoli"] # 0xeb06 (en: 'double arrow northwest southeast', google translation) + - "": [T: "vaakasuora harppuunapidennys"] # 0xeb07 (en: 'horizontal harpoon extender', google translation) # FI: translation unclear + - "": [T: "vasen kaarinuoli vastapĂ€ivÀÀn"] # 0xeb08 (en: 'anticlockwise arc leftwards arrow', google translation) + - "": [T: "oikea kaarinuoli vastapĂ€ivÀÀn"] # 0xeb09 (en: 'anticlockwise arc rightwards arrow', google translation) + - "": [T: "suuri oikean nuolen aksentti"] # 0xeb0b (en: 'large rightwards arrow accent', google translation) # FI: translation unclear + - "": [T: "suuri vasen nuolen aksentti"] # 0xeb0c (en: 'large leftwards arrow accent', google translation) # FI: translation unclear + - "": [T: "vasen nuolenpÀÀ"] # 0xeb0d (en: 'leftwards arrowhead', google translation) + - "": [T: "oikea nuolenpÀÀ"] # 0xeb0e (en: 'rightwards arrowhead', google translation) + - "": [T: "suuri vasen-oikea nuoli yliviivauksella"] # 0xeb0f (en: 'large left right arrow with stroke', google translation) + - "": [T: "vaakasuuntainen kaksoisnuolen pidennys"] # 0xeb10 (en: 'horizontal double arrow extender', google translation) # FI: translation unclear + - "": [T: "suuri vasen-oikea kaksinkertainen nuoli yliviivauksella"] # 0xeb11 (en: 'large left right double arrow with stroke', google translation) + - "": [T: "alaspĂ€in osoittava nuoli ylöspĂ€in osoittavan nuolen vasemmalla puolella"] # 0xeb12 (en: 'downwards arrow leftwards of upwards arrow', google translation) + - "": [T: "vasen nuoli kulmalla alaspĂ€in"] # 0xeb13 (en: 'leftwards arrow with corner downwards', google translation) + - "": [T: "oikea nuoli kulmalla ylöspĂ€in"] # 0xeb14 (en: 'rightwards arrow with corner upwards', google translation) + - "": [T: "vasen nuoli kuolmalla ylöspĂ€in"] # 0xeb15 (en: 'leftwards arrow with corner upwards', google translation) + - "": [T: "ympyrĂ€nuolen ylĂ€osa vastapĂ€ivÀÀn ja plus"] # 0xeb16 (en: 'anticlockwise top semicircle arrow with plus', google translation) + - "": [T: "ympyrĂ€nuolen ylĂ€osa myötĂ€pĂ€ivÀÀn ja miinus"] # 0xeb17 (en: 'clockwise top semicircle arrow with minus', google translation) + - "": [T: "oikea nuoli hĂ€nnĂ€llĂ€ ja yliviivauksella"] # 0xeb18 (en: 'rightwards arrow with tail with stroke', google translation) + - "": [T: "oikea harppuuna alas"] # 0xeb19 (en: 'right harpoon down', google translation) + - "": [T: "vasen harppuon alas"] # 0xeb1a (en: 'left harpoon down', google translation) + - "": [T: "vasen-oikea harppuuna alas"] # 0xeb1b (en: 'left right harpoon down', google translation) + - "": [T: "vasen-oikea harppuuna ylös"] # 0xeb1c (en: 'left right harpoon up', google translation) + - "": [T: "ylös-alas harppuuna vasemmalle"] # 0xeb1d (en: 'up down harpoon left', google translation) + - "": [T: "ylös-alas harppuuna oikealle"] # 0xeb1e (en: 'up down harpoon right', google translation) + - "": [T: "ylĂ€nuoli alanuolen vasemmalla puolella"] # 0xeb1f (en: 'upwards arrow to the right of downwards arrow', google translation) + - "": [T: "vasen harppuuna palkkiin piikki ylöpĂ€in"] # 0xeb20 (en: 'leftwards harpoon to bar with barb upwards', google translation) + - "": [T: "oikea harppuuna palkkiin piikki ylöspĂ€in"] # 0xeb21 (en: 'rightwards harpoon to bar with barb upwards', google translation) + - "": [T: "vasen harppuuna palkkiin piikki alaspĂ€in"] # 0xeb22 (en: 'leftwards harpoon to bar with barb downwards', google translation) + - "": [T: "oikea harppuuna palkkiin piikki alaspĂ€in"] # 0xeb23 (en: 'rightwards harpoon to bar with barb downwards', google translation) + - "": [T: "vasen harppuuna palkista piikki ylöspĂ€in"] # 0xeb24 (en: 'leftwards harpoon from bar with barb upwards', google translation) + - "": [T: "oikea harppuuna palkista piikki ylöspĂ€in"] # 0xeb25 (en: 'rightwards harpoon from bar with barb upwards', google translation) + - "": [T: "vasen harppuuna palkista piikki alaspĂ€in"] # 0xeb26 (en: 'leftwards harpoon from bar with barb downwards', google translation) + - "": [T: "oikea harppuuna palkista piikki alaspĂ€in"] # 0xeb27 (en: 'rightwards harpoon from bar with barb downwards', google translation) + - "": [T: "harppuuna ylös palkkiin piikki vasemmalle"] # 0xeb28 (en: 'upwards harpoon to bar with barb leftwards', google translation) + - "": [T: "harppuuna alas palkkiin piikki vasemmalle"] # 0xeb29 (en: 'downwards harpoon to bar with barb leftwards', google translation) + - "îŹȘ": [T: "harppuuna ylös palkkiin piikki oikealle"] # 0xeb2a (en: 'upwards harpoon to bar with barb rightwards', google translation) + - "": [T: "harppuuna alas palkkiin piikki oikealle"] # 0xeb2b (en: 'downwards harpoon to bar with barb rightwards', google translation) + - "": [T: "harppuuna ylös palkista piikki vasemmalle"] # 0xeb2c (en: 'upwards harpoon from bar with barb leftwards', google translation) + - "": [T: "harppuuna alas palkista piikki vasemmalle"] # 0xeb2d (en: 'downwards harpoon from bar with barb leftwards', google translation) + - "": [T: "harppuuna ylös palkista piikki oikealle"] # 0xeb2e (en: 'upwards harpoon from bar with barb rightwards', google translation) + - "": [T: "harppuuna alas palkista piikki oikealle"] # 0xeb2f (en: 'downwards harpoon from bar with barb rightwards', google translation) + - "": [T: "nuoli ylöspĂ€in palkkiin"] # 0xeb30 (en: 'upwards arrow to bar', google translation) + - "": [T: "nuoli alaspĂ€in palkkiin"] # 0xeb31 (en: 'downwards arrow to bar', google translation) + - "îŹČ": [T: "harppuuna ylös ja oikealla puolella harppuuna alas"] # 0xeb32 (en: 'upwards harpoon to the left of downwards harpoon', google translation) + - "": [T: "harppuuna ylös ja vasemmalla puolella harppuuna alas"] # 0xeb33 (en: 'upwards harpoon to the right of downwards harpoon', google translation) + - "": [T: "nuolenpÀÀ ylös"] # 0xeb34 (en: 'upwards arrowhead', google translation) + - "": [T: "nuolenpÀÀ alas"] # 0xeb35 (en: 'downwards arrowhead', google translation) + - "": [T: "kaksinkertainen harppuuna vasen piikki alas ja oikea piikki ylös"] # 0xeb36 (en: 'double harpoon with leftwards barb down rightwards barb up', google translation) + - "": [T: "kaksinkertainen harppuuna vasen piikki ylös ja oikea piikki alas"] # 0xeb37 (en: 'double harpoon with leftwards barb up rightwards barb down', google translation) + - "": [T: "vasen nuoli palkin ylĂ€puolella"] # 0xeb38 (en: 'leftwards arrow over bar', google translation) + - "îŹč": [T: "oikea nuoli palkin ylĂ€puolella"] # 0xeb39 (en: 'rightwards arrow over bar', google translation) + - "îŹș": [T: "vasen nuoli palkin alapuolella"] # 0xeb3a (en: 'leftwards arrow under bar', google translation) + - "": [T: "oikea nuoli palkin alapuolella"] # 0xeb3b (en: 'rightwards arrow under bar', google translation) + - "îŹŒ": [T: "vasen-oikea kolmoisnuoli"] # 0xeb3c (en: 'left right triple arrow', google translation) + - "": [T: "koillis-kaakko kaksoisnuoli"] # 0xeb3f (en: 'double arrow northeast southeast', google translation) + - "": [T: "vasen puoliympyrĂ€nuoli vastapĂ€ivÀÀn"] # 0xeb40 (en: 'anticlockwise left semicircle arrow', google translation) + - "": [T: "vasen puoliympyrĂ€nuoli myötĂ€pĂ€ivÀÀn"] # 0xeb41 (en: 'clockwise left semicircle arrow', google translation) + - "": [T: "vasen avoin ympyrĂ€ vasen-oikea nuoli"] # 0xeb42 (en: 'left open circle left right arrow', google translation) # FI: translation unclear + - "": [T: "oikea nuoli tilden ylĂ€puolella"] # 0xeb44 (en: 'rightwards arrow over tilde', google translation) + - "": [T: "vasen nuoli tilden ylĂ€puolella"] # 0xeb45 (en: 'leftwards arrow over tilde', google translation) + - "": [T: "vasen harppuuna palkin ylĂ€puolella"] # 0xeb48 (en: 'leftwards harpoon over bar', google translation) + - "": [T: "oikea harppuuna palkin ylĂ€puolella"] # 0xeb49 (en: 'rightwards harpoon over bar', google translation) + - "": [T: "vasen harppuuna palkin alapuolella"] # 0xeb4a (en: 'leftwards harpoon under bar', google translation) + - "": [T: "oikea harppuuna palkin alapuolella"] # 0xeb4b (en: 'rightwards harpoon under bar', google translation) + - "": [T: "raskas musta lyhyt vasen nuoli"] # 0xeb4c (en: 'squat black leftwards arrow', google translation) + - "": [T: "oikea puoliympyrĂ€nuoli myötĂ€pĂ€ivÀÀn"] # 0xeb50 (en: 'clockwise right semicircle arrow', google translation) + - "": [T: "oikea puoliympyrĂ€nuoli vastapĂ€ivÀÀn"] # 0xeb51 (en: 'anticlockwise right semicircle arrow', google translation) + - "": [T: "vasen-oikea ympyrĂ€ vasen-oikea harppuuna"] # 0xeb52 (en: 'left open circle left right harpoon', google translation) # FI: translation unclear + - "": [T: "nuoli ylös pystypalkin vasemmalla puolella"] # 0xeb58 (en: 'upwards arrow leftwards of vertical bar', google translation) + - "": [T: "nuoli alas pystypalkin vasemmalla puolella"] # 0xeb59 (en: 'downwards arrow leftwards of vertical bar', google translation) + - "": [T: "nuoli ylös pystypalkin oikealla puolella"] # 0xeb5a (en: 'upwards arrow rightwards of vertical bar', google translation) + - "": [T: "nuoli alas pystypalkin oikealla puolella"] # 0xeb5b (en: 'downwards arrow rightwards of vertical bar', google translation) + - "": [T: "oikea nuoli jatketulla koukulla alas"] # 0xeb5c (en: 'rightwards arrow with extended downwards hook', google translation) + - "": [T: "vasen nuoli jatketulla koukulla"] # 0xeb5d (en: 'leftwards arrow with extended hook', google translation) + - "": [T: "vasen nuoli jatketulla koukulla alas"] # 0xeb5e (en: 'leftwards arrow with extended downwards hook', google translation) + - "": [T: "oikea nuoli jatketulla koukulla"] # 0xeb5f (en: 'rightwards arrow with extended hook', google translation) + - "î­ ": [T: "ei oikea nuoli aaltoileva"] # 0xeb60 (en: 'not right arrow wavy', google translation) # FI: translation unclear + - "î­Ą": [T: "ei oikea nuoli kaareva"] # 0xeb61 (en: 'not right arrow curved', google translation) # FI: translation unclear + - "î­š": [T: "harppuula ylös pystypalkin vasemmalla puolella"] # 0xeb68 (en: 'upwards harpoon leftwards of vertical bar', google translation) + - "î­©": [T: "harppuuna alas pystypalkin vasemmalla puolella"] # 0xeb69 (en: 'downwards harpoon leftwards of vertical bar', google translation) + - "î­Ș": [T: "harppuuna ylös pystypalkin oikealla puolella"] # 0xeb6a (en: 'upwards harpoon rightwards of vertical bar', google translation) + - "î­«": [T: "harppuuna alas pystypalkin oikealla puolella"] # 0xeb6b (en: 'downwards harpoon rightwards of vertical bar', google translation) + - "î­Ź": [T: "pystysuora kaksoisnuolen pidennys"] # 0xeb6c (en: 'vertical double arrow extender', google translation) # FI: translation unclear + - "î­­": [T: "pystysuora harppuuna piikki vasemmalle pidennys"] # 0xeb6d (en: 'vertical harpoon with barb left extender', google translation) + - "î­ź": [T: "pystysuora harppuuna piikki oikealle pidennys"] # 0xeb6e (en: 'vertical harpoon with barb right extender', google translation) + - "î­Ż": [T: "oikea harppuuna vasemman harppuunan ylĂ€puolella oikealla"] # 0xeb6f (en: 'right harpoon over left harpoon right', google translation) # FI: translation unclear + - "î­°": [T: "oikea harppuuna vasemman harppuunan ylĂ€puolella vasemmalla"] # 0xeb70 (en: 'right harpoon over left harpoon left', google translation) # FI: translation unclear + - "î­±": [T: "vasen harppuuna oikean harppuunan ylĂ€puolella oikealla"] # 0xeb71 (en: 'left harpoon over right harpoon right', google translation) # FI: translation unclear + - "î­Č": [T: "vasen harppuuna oikean harppuunan ylĂ€puolella vasemmalla"] # 0xeb72 (en: 'left harpoon over right harpoon left', google translation) # FI: translation unclear + - "î­ł": [T: "vasen nuoli palkista nuolenpÀÀ"] # 0xeb73 (en: 'leftwards arrow from bar arrowhead', google translation) # FI: translation unclear + - "î­Ž": [T: "vasen-oikea nuoli palkista pidennys"] # 0xeb74 (en: 'leftwards rightwards arrow from bar extender', google translation) + - "î­”": [T: "vasen nuoli palkista hĂ€ntĂ€"] # 0xeb75 (en: 'leftwards arrow from bar tail', google translation) # FI: translation unclear + - "î­¶": [T: "oikea nuoli palkista hĂ€ntĂ€"] # 0xeb76 (en: 'rightwards arrow from bar tail', google translation) # FI: translation unclear + - "î­·": [T: "oikea nuoli palkista nuolenpÀÀ"] # 0xeb77 (en: 'rightwards arrow from bar arrowhead', google translation) # FI: translation unclear + - "î­ž": [T: "harppuuna ylös palkista piikki vasemmalle nuolenpÀÀ"] # 0xeb78 (en: 'upwards harpoon from bar with barb leftwards arrowhead', google translation) # FI: translation unclear + - "î­č": [T: "oikea nuoli vasemman nuolen ylĂ€puolella oikealla"] # 0xeb79 (en: 'rightwards arrow over leftwards arrow right', google translation) # FI: translation unclear + - "î­ș": [T: "oikea nuoli vasemman nuolen ylĂ€puolella vasemmalla"] # 0xeb7a (en: 'rightwards arrow over leftwards arrow left', google translation) # FI: translation unclear + - "î­»": [T: "vasen nuoli oikean nuolen ylĂ€puolella oikealla"] # 0xeb7b (en: 'leftwards arrow over rightwards arrow right', google translation) # FI: translation unclear + - "î­Œ": [T: "vasen nuoli oikean nuolen ylĂ€puolella vasemmalla"] # 0xeb7c (en: 'leftwards arrow over rightwards arrow left', google translation) # FI: translation unclear + - "î­œ": [T: "nuoli ylös palkista nuolenpÀÀ"] # 0xeb7d (en: 'upwards arrow from bar arrowhead', google translation) # FI: translation unclear + - "î­Ÿ": [T: "nuoli ylös palkista hĂ€ntĂ€"] # 0xeb7e (en: 'upwards arrow from bar tail', google translation) # FI: translation unclear + - "î­ż": [T: "nuoli alaspĂ€in palkista hĂ€ntĂ€"] # 0xeb7f (en: 'downwards arrow from bar tail', google translation) # FI: translation unclear + - "": [T: "nuoli alaspĂ€in palkista nuolenpÀÀ"] # 0xeb80 (en: 'downwards arrow from bar arrowhead', google translation) # FI: translation unclear + - "": [T: "harppuuna alas palkista piikki oikealle nuolenpÀÀ"] # 0xeb81 (en: 'downwards harpoon from bar with barb rightwards arrowhead', google translation) # FI: translation unclear + - "": [T: "harppuuna ylös ja oikealla puolella harppuuna alas alas"] # 0xeb82 (en: 'upwards harpoon to the left of downwards harpoon bottom', google translation) # FI: translation unclear + - "": [T: "harppuuna ylös ja oikealla harppuuna alas"] # 0xeb83 (en: 'upwards harpoon to the left of downwards harpoon', google translation) + - "": [T: "harppuuna alas ja oikealla harppuuna ylös ylös"] # 0xeb84 (en: 'downwards harpoon to the left of upwards harpoon top', google translation) # FI: translation unclear + - "": [T: "harppuuna ylös ja oikealla harppuuna alas ylös"] # 0xeb85 (en: 'upwards harpoon to the left of downwards harpoon top', google translation) # FI: translation unclear + - "": [T: "harppuuna alas ja oikealla harppuuna ylös pidennys"] # 0xeb86 (en: 'downwards harpoon to the left of the upwards harpoon extender', google translation) + - "": [T: "harppuuna alas ja oikealla harppuuna ylös alas"] # 0xeb87 (en: 'downwards harpoon to the left of the upwards harpoon bottom', google translation) # FI: translation unclear + - "": [T: "harppuuna ylös ja oikealla harppuuna alas alas"] # 0xeb88 (en: 'upwards arrow leftwards of downwards arrow bottom', google translation) # FI: translation unclear + - "": [T: "nuoli alas ja oikealla nuoli ylös ylös"] # 0xeb89 (en: 'downwards arrow leftwards of upwards arrow top', google translation) # FI: translation unclear + - "": [T: "nuoli ylös ja oikealla nuoli alas ylös"] # 0xeb8a (en: 'upwards arrow leftwards of downwards arrow top', google translation) # FI: translation unclear + - "": [T: "nuoli alas ja oikealla nuoli ylös alas"] # 0xeb8b (en: 'downwards arrow leftwards of upwards arrow bottom', google translation) # FI: translation unclear + - "": [T: "vasen-oikeanuolipidennys"] # 0xeb8c (en: 'leftwards rightwards arrows extender', google translation) + - "": [T: "koillisnuolipidennys"] # 0xeb8d (en: 'north east arrow extender', google translation) + - "": [T: "luoteisnuolipidennys"] # 0xeb8e (en: 'north west arrow extender', google translation) + - "": [T: "alas osoittava aaltosulku vasen"] # 0xec00 (en: 'down pointing brace left', google translation) + - "": [T: "alas osoittava aaltosulku keski"] # 0xec01 (en: 'down pointing brace mid', google translation) + - "": [T: "alas osoittava aaltosulku oikea"] # 0xec02 (en: 'down pointing brace right', google translation) + - "": [T: "vaakasuora aaltosulku pidennys"] # 0xec03 (en: 'horizontal brace extender', google translation) + - "": [T: "ylös osoittava aaltosulku vasen"] # 0xec04 (en: 'up pointing brace left', google translation) + - "": [T: "ylös osoittava aaltosulku keski"] # 0xec05 (en: 'up pointing brace mid', google translation) + - "": [T: "ylös osoittava aaltosulku oikea"] # 0xec06 (en: 'up-pointing brace right', google translation) + - "": [T: "vasen pystypalkki"] # 0xec07 (en: 'left vertical bar', google translation) + - "": [T: "oikea pystypalkki"] # 0xec08 (en: 'right vertical bar', google translation) + - "": [T: "vasen kaksinkertainen pystypalkki"] # 0xec09 (en: 'left double vertical bar', google translation) + - "": [T: "oikea kaksinkertainen pystypalkki"] # 0xec0a (en: 'right double vertical bar', google translation) + - "": [T: "vaakasuora hakasulku pidennys"] # 0xec0b (en: 'horizontal bracket extender', google translation) + - "": [T: "neliön alapuoli hakasulku"] # 0xec0c (en: 'under square bracket', google translation) # FI: translation unclear + - "⎔": [T: "neliön alapuoli hakasulku"] # 0x23b5 (google: 'neliön alla') # FI: translation unclear + - "": [T: "neliön ylĂ€puoli hakasulku"] # 0xec0d (en: 'over square bracket', google translation) # FI: translation unclear + - "⎮": [T: "neliön ylĂ€puoli hakasulku"] # 0x23b4 (google: 'neliömĂ€isen kiinnikkeen yli') # FI: translation unclear + - "": [T: "alahakasulku vasen"] # 0xec0e (en: 'under bracket left', google translation) # FI: translation unclear + - "": [T: "alahakasulku oikea"] # 0xec0f (en: 'under bracket right', google translation) # FI: translation unclear + - "": [T: "ylĂ€hakasulku vasen"] # 0xec10 (en: 'over bracket left', google translation) # FI: translation unclear + - "": [T: "alahakasulku oikea"] # 0xec11 (en: 'over bracket right', google translation) # FI: translation unclear + - "": [T: "vasen kaarisulku 1"] # 0xec12 (en: 'left parens 1', google translation) + - "": [T: "vasen kaarisulku 2"] # 0xec13 (en: 'left parens 2', google translation) + - "": [T: "vasen kaarisulku 3"] # 0xec14 (en: 'left parens 3', google translation) + - "": [T: "vasen kaarisulku 4"] # 0xec15 (en: 'left parens 4', google translation) + - "": [T: "oikea kaarisulku 1"] # 0xec16 (en: 'right parens 1', google translation) + - "": [T: "oikea kaarisulku 2"] # 0xec17 (en: 'right parens 2', google translation) + - "": [T: "oikea kaarisulku 3"] # 0xec18 (en: 'right parens 3', google translation) + - "": [T: "oikea kaarisulku 4"] # 0xec19 (en: 'right parens 4', google translation) + - "": [T: "radikaali 1"] # 0xec1a (en: 'radical 1', google translation) # FI: context? Radical as in root sign? + - "": [T: "radikaali 2"] # 0xec1b (en: 'radical 2', google translation) # FI: context? + - "": [T: "radikaali 3"] # 0xec1c (en: 'radical 3', google translation) # FI: context? + - "": [T: "radikaali 4"] # 0xec1d (en: 'radical 4', google translation) # FI: context? + - "": [T: "radikaali 5"] # 0xec1e (en: 'radical 5', google translation) # FI: context? + - "": [T: "radikaali pohja"] # 0xec1f (en: 'radical bottom', google translation) # FI: context? + - "î° ": [T: "radikaali pystysuora pidennys"] # 0xec20 (en: 'radical vertical extender', google translation) # FI: context? + - "î°Ą": [T: "radikaali ylĂ€osa"] # 0xec21 (en: 'radical top', google translation) # FI: context? + - "î°ą": [T: "vasen valkoinen hakasulku ylös"] # 0xec22 (en: 'left white bracket top', google translation) + - "î°Ł": [T: "vasen valkoinen hakasulku pidennys"] # 0xec23 (en: 'left white bracket extender', google translation) + - "î°€": [T: "vasen valkoinen hakasulku alas"] # 0xec24 (en: 'left white bracket bottom', google translation) + - "î°„": [T: "oikea valkoinen hakasulku ylös"] # 0xec25 (en: 'right white bracket top', google translation) + - "î°Š": [T: "oikea valkoinen hakasulku pidennys"] # 0xec26 (en: 'right white bracket extender', google translation) + - "î°§": [T: "oikea valkoinen hakasulku alas"] # 0xec27 (en: 'right white bracket bottom', google translation) + - "î°°": [T: "vasen valkoinen aaltosulku"] # 0xec30 (en: 'left white curly bracket', google translation) + - "î°±": [T: "oikea valkoinen aaltosulku"] # 0xec31 (en: 'right white curly bracket', google translation) + - "î°Č": [T: "jakokulmamerkki"] # 0xec32 (en: 'long division sign', google translation) + - "î°ł": [T: "jakokulmamerkki pidennys"] # 0xec33 (en: 'long division sign extender', google translation) + - "î°Ž": [T: "lyhyt jakokulma"] # 0xec34 (en: 'short division', google translation) + - "": [T: "kaksinkertainen m-sidos lounaasta koilliseen"] # 0xec40 (en: 'double southwest to northeast em bond', google translation) + - "": [T: "kaksinkertainen m-sidos luoteesta kaakkoon"] # 0xec41 (en: 'double northwest to southeast em bond', google translation) + - "": [T: "yksinkertainen vaakasuora m-sidos"] # 0xec42 (en: 'single horizontal em bond', google translation) # FI: not happy with translations + - "": [T: "kaksinkertainen vaakasuora m-sidos"] # 0xec43 (en: 'double horizontal em bond', google translation) + - "": [T: "kolminkertainen vaakasuora m-sidos"] # 0xec44 (en: 'triple horizontal em bond', google translation) + - "": [T: "yksinkertainen pystysuora m-sidos"] # 0xec45 (en: 'single vertical em bond', google translation) + - "": [T: "kaksinkertainen pystysuora m-sidos"] # 0xec46 (en: 'double vertical em bond', google translation) + - "": [T: "kolminkertainen pystysuora m-sidos"] # 0xec47 (en: 'triple vertical em bond', google translation) + - "": [T: "pienempi kuin m-sidos"] # 0xec48 (en: 'less than em bond', google translation) + - "": [T: "suurempi kuin m-sidos"] # 0xec49 (en: 'greater than em bond', google translation) + - "": [T: "yksinkertainen vaakasuora n-sidos"] # 0xec4a (en: 'single horizontal en bond', google translation) + - "": [T: "kaksinkertainen vaakasuora n-sidos"] # 0xec4b (en: 'double horizontal en bond', google translation) + - "": [T: "kolminkertainen vaakasuora n-sidos"] # 0xec4c (en: 'triple horizontal en bond', google translation) + - "îȀ": [T: "ylĂ€vasen suorakulmio"] # 0xec80 (en: 'top left rectangle', google translation) + - "îȁ": [T: "alavasen suorakulmio"] # 0xec81 (en: 'bottom left rectangle', google translation) + - "îȐ": [T: "ylĂ€oikea suorakulmio"] # 0xec90 (en: 'top right rectangle', google translation) + - "îȑ": [T: "alaoikea suorakulmio"] # 0xec91 (en: 'bottom right rectangle', google translation) + - "îȒ": [T: "synteettinen jakokulma"] # 0xec92 (en: 'synthetic division corner', google translation) # FI: translation unclear + - "îȓ": [T: "synteettinen jakokulma vaakasuora pidennys"] # 0xec93 (en: 'synthetic division horizontal extender', google translation) # FI: translation unclear + - "îȔ": [T: "synteettinen jakokulma pystysuora pidennys"] # 0xec94 (en: 'synthetic division vertical extender', google translation) # FI: translation unclear + - "îȕ": [T: "vasen katto lattia pidennys"] # 0xec95 (en: 'left ceiling floor extender', google translation) + - "îȖ": [T: "oikea katto lattia pidennys"] # 0xec96 (en: 'right ceiling floor extender', google translation) + - "îȗ": [T: "yli hakasulku pidennys"] # 0xec97 (en: 'over bracket extender', google translation) # FI: translation unclear + - "îȘ": [T: "pystypalkki pidennys"] # 0xec98 (en: 'vertical bar extender', google translation) + - "îș": [T: "vasen kaksinkertainen pystypalkki pidennys"] # 0xec99 (en: 'left double vertical bar extender', google translation) + - "îȚ": [T: "vaakasuora palkki pidennys"] # 0xec9a (en: 'horizontal bar extender', google translation) + - "îȜ": [T: "ala hakasulku pidennys"] # 0xec9c (en: 'under bracket extender', google translation) # FI: translation unclear + - "îȝ": [T: "alaspĂ€in osoittava kaarisulku oikea"] # 0xec9d (en: 'down pointing paren right', google translation) + - "îȞ": [T: "alaspĂ€in osoittava kaarisulku pidennys"] # 0xec9e (en: 'down pointing paren extender', google translation) + - "îȟ": [T: "alaspĂ€in osoittava kaarisulku vasen"] # 0xec9f (en: 'down pointing paren left', google translation) + - "îČ ": [T: "ylöspĂ€in osoittava hakasulku pidennys"] # 0xeca0 (en: 'up pointing brace extender', google translation) + - "îČĄ": [T: "ylöspĂ€in osoittava kaarisulku vasen"] # 0xeca1 (en: 'up pointing paren left', google translation) + - "îČą": [T: "ylöspĂ€in osoittava kaarisulku pidennys"] # 0xeca2 (en: 'up pointing paren extender', google translation) + - "îČŁ": [T: "ylöspĂ€in osoittava kaarisulku oikea"] # 0xeca3 (en: 'up pointing paren right', google translation) + - "îČ€": [T: "alaspĂ€in osoittava kaarisulku pidennys"] # 0xeca4 (en: 'down pointing brace extender', google translation) + - "": [T: "planckin vakio kahden piin ylĂ€puolella palkki"] # 0xed00 (en: 'planck constant over two pi bar', google translation) # FI: translation unclear + - "": [T: "peili g"] # 0xed01 (en: 'mirror g', google translation) + - "": [T: "pisteetön j"] # 0xed02 (google translation) + - "": [T: "digamma"] # 0xed03 (google translation) # FI: translation unclear + - "ϝ": [T: "digamma"] # 0x3dd # FI: : translation unclear + - "": [T: "d"] # 0xed10 (en: 'd', google translation) + - "": [T: "e"] # 0xed11 (en: 'e', google translation) + - "": [T: "i"] # 0xed12 (en: 'i', google translation) + - "": [T: "j"] # 0xed13 (en: 'j', google translation) + - "ⅅ": + - SPELL: "translate('.', 'ⅅ', 'DD')" # 0xed16, 0x2145 + +# The private use chars are from MathType + - "": [T: "kĂ€yrĂ€integraalisilmukka vastapĂ€ivÀÀn"] # 0xee00 (en: 'anticlockwise contour integral loop', google translation) + - "": [T: "kĂ€yrĂ€integraalisilmukka myötĂ€pĂ€ivÀÀn"] # 0xee01 (en: 'clockwise contour integral loop', google translation) + - "": [T: ""] # 0xee04 + - "": [T: ""] # 0xee05 + - "": [T: ""] # 0xee06 + - "": [T: ""] # 0xee07 + - "": [T: ""] # 0xee08 + - "": [T: ""] # 0xee09 + - "": [T: ""] # 0xee0a + - "": [T: ""] # 0xee0b + - "": [T: ""] # 0xee0c + - "": [T: "yhteinen tila koriste"] # 0xee0d (en: 'joint status embellishment', google translation) # FI: translation unclear, context? + - "": [T: "yhteinen tila korite vasen"] # 0xee0e (en: 'joint status embellishment left', google translation) # FI: translation unclear, context? + - "": [T: "yhteinen tila koriste oikea"] # 0xee0f (en: 'joint status embellishment right', google translation) # FI: translation unclear, context? + - "": [T: "yhteinen tila koriste pidennys"] # 0xee10 (en: 'joint status embellishment extender', google translation) # FI: translation unclear, context? + - "": [T: "integraalisilmukka"] # 0xee11 (en: 'integral loop', google translation) + - "": [T: "kaksinkertainen integraalisilmukka"] # 0xee12 (en: 'integral loop double', google translation) + - "": [T: "kolminkertainen integraalisilmukka"] # 0xee13 (en: 'integral loop triple', google translation) + - "": [T: "laajentuva kaksinkertainen integraalisilmukka"] # 0xee15 (en: 'expanding integral loop double', google translation) + - "": [T: "laajentuva kolminkertainen integraalisilmukka"] # 0xee16 (en: 'expanding integral loop triple', google translation) + - "": [T: "asymptoottisesti yhtĂ€ suuri kuin aksentti"] # 0xee17 (en: 'asymptotically equal to accent', google translation) + - "": [T: "yhtĂ€ suuri kuin -merkki aksentti"] # 0xee18 (en: 'equal sign accent', google translation) + - "": [T: "neljĂ€s derivaatta"] # 0xee19 (en: 'quadruple prime', google translation) # FI: 4th derivative? + - "": [T: "palkkiaksentti avoimella ympyrĂ€llĂ€ vasen"] # 0xee1a (en: 'bar accent with open circle left', google translation) # FI: translation unclear + - "": [T: "palkkiaksentti suljetulla ympyrĂ€llĂ€ vasen"] # 0xee1b (en: 'bar accent with closed circle left', google translation) # FI: translation unclear + - "": [T: "palkkiaksentti avoimella ympyrĂ€llĂ€ oikea"] # 0xee1c (en: 'bar accent with open circle right', google translation) # FI: translation unclear + - "": [T: "palkkiaksentti ja piste ylĂ€puolella"] # 0xee1d (en: 'bar accent with over dot', google translation) # FI: translation unclear + - "": [T: "palkkiaksentti ja piste alapuolella"] # 0xee1e (en: 'bar accent with under dot', google translation) # FI: translation unclear + - "": [T: "palkkiaksentti ja kaksinkertainen piste ylĂ€puolella"] # 0xee1f (en: 'bar accent with double over dot', google translation) # FI: translation unclear + - "îž ": [T: "palkkiaksentti ja kaksinkertainen piste alapuolella"] # 0xee20 (en: 'bar accent with double under dot', google translation) # FI: translation unclear + - "": [T: "palkkiaksentti sirkumfleksillĂ€"] # 0xee21 (en: 'bar accent with caret', google translation) # FI: translation unclear + - "îžą": [T: "paksu alapalkkiaksentti"] # 0xee22 (en: 'thick under bar accent', google translation) # FI: translation unclear + - "": [T: "palkkiaksentti suljetulla ympyrĂ€llĂ€ oikea"] # 0xee23 (en: 'bar accent with closed circle right', google translation) # FI: translation unclear + - "": [T: "suuri piste ylĂ€puolella"] # 0xee24 (en: 'large dot above', google translation) # FI: translation unclear + - "": [T: "kohdistusmerkki"] # 0xef00 (en: 'alignment mark', google translation) # FI: translation unclear + - "": [T: ""] # 0xef01 + - "​": [T: ""] # 0x200b + - "": [T: ""] # 0xef02 + - " ": [T: ""] # 0x2009 + - "": [T: ""] # 0xef03 + - " ": [T: ""] # 0x205f + - "": [T: ""] # 0xef04 + - "": [T: ""] # 0xef05 + - " ": [T: ""] # 0x2003 + - "": [T: ""] # 0xef06 + - "": [T: ""] # 0xef07 + - "": [T: ""] # 0xef08 + - "": [T: ""] # 0xef09 + - "": [T: ""] # 0xef0a + - " ": [T: ""] # 0x200a + - "îŒą": [T: ""] # 0xef22 + - "îŒŁ": [T: ""] # 0xef23 + - "": [T: ""] # 0xef24 + - "": [T: ""] # 0xef29 + - "": [T: "puuttuva termi"] # 0xef41 (en: 'missing term', google translation) + - "": [T: "kĂ€yrĂ€integraalinuoli myötĂ€vĂ€ivÀÀn vasemmalla"] # 0xef80 (en: 'clockwise contour integral arrow on left', google translation) + - "": [T: "integraali neliöllĂ€"] # 0xef81 (en: 'integral with square', google translation) + - "": [T: "integraali vinoviivalla"] # 0xef82 (en: 'integral with slash', google translation) + - "": [T: "kÀÀnnetty integraali"] # 0xef83 (en: 'reversed integral', google translation) + - "": [T: "kaksinkertainen nolla yli kaksinkertaisen nollan"] # 0xef90 (en: 'double zero over double zero', google translation) + - "": [T: "nolla vinoviivalla"] # 0xef91 (en: 'zero with slash', google translation) + + # fraktur 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) + - T: "fraktuura" # (google translation) + - SPELL: "translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" + + - "-": # 0xf000 - 0xf018 + - T: "fraktuura" # (google translation) + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" + + - "𝔞-đ”·": # 0x1d51e - 0x1d537 + - T: "fraktuura" # (google translation) + - SPELL: "translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz')" + - "-ï€ł": # 0xf01a - 0xf033 + - T: "fraktuura" # (google translation) + - SPELL: "translate('.', 'ï€šï€›ï€œï€ï€žï€Ÿï€ ï€Ąï€ąï€Łï€€ï€„ï€Šï€§ï€šï€©ï€Șï€«ï€Źï€­ï€źï€Żï€°ï€±ï€Čï€ł', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝕬-𝖅": # 0x1D56C - 0x1D585 + - T: "fraktuura lihavoitu" # (google translation) + - SPELL: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf040 - 0xf059 + - T: "fraktuura lihavoitu" # (google translation) + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝖆-𝖟": # 0x1d586 - 0x1d59f + - T: "fraktuura lihavoitu" # (google translation) + - SPELL: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" + - "-ïł": # 0xf05a - 0xf073 + - T: "fraktuura lihavoitu" # (google translation) + - 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) + - test: + if: "$Verbosity!='Terse'" + then: [T: "kaksoisviivainen"] # (en: 'double struck', google translation) + - SPELL: "translate('.', '𝔾đ”čđ”șđ”»đ”Œđ”œđ”Ÿđ”żđ•€đ•đ•‚đ•ƒđ•„đ•…đ•†đ•‡đ•ˆđ•‰đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf080 - 0xf098 + - test: + if: "$Verbosity!='Terse'" + then: [T: "kaksoisviivainen"] # (en: 'double struck', google translation) + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝕒-đ•«": # 0x1d552 - 0x1d56b + - test: + if: "$Verbosity!='Terse'" + then: [T: "kaksoisviivainen"] # (en: 'double struck', google translation) + - SPELL: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" + - "-ï‚ł": # 0xf09a - 0xf0b3 + - test: + if: "$Verbosity!='Terse'" + then: [T: "kaksoisviivainen"] # (en: 'double struck', google translation) + - SPELL: "translate('.', 'ï‚šï‚›ï‚œï‚ï‚žï‚Ÿï‚ ï‚Ąï‚ąï‚Łï‚€ï‚„ï‚Šï‚§ï‚šï‚©ï‚Șï‚«ï‚Źï‚­ï‚źï‚Żï‚°ï‚±ï‚Čï‚ł', 'abcdefghijklmnopqrstuvwxyz')" + - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 + - test: + if: "$Verbosity!='Terse'" + then: [T: "kaksoisviivainen"] # (en: 'double struck', google translation) + - SPELL: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" + - "-": # 0xf0c0 - 0xf0c9 + - test: + if: "$Verbosity!='Terse'" + then: [T: "kaksoisviivainen"] # (en: 'double struck', google translation) + - SPELL: "translate('.', '', '0123456789')" + + - "": [T: "kaksoisviivainen nabla"] # 0xf0ca (en: 'double struck nabla', google translation) + - "": [T: "kaksoisviivainen eulerin vakio"] # 0xf0cb (en: 'double struck euler constant', google translation) + + # script chars in math alphabetic block and also MathType private use area + - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 + - T: "kauno" # (en: 'script', google translation) + - SPELL: "translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf100 - 0xf119 + - T: "kauno" # (en: 'script', google translation) + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf + - T: "kauno" # (en: 'script', google translation) + - SPELL: "translate('.', 'đ’¶đ’·đ’žđ’čđ’șđ’»đ’Œđ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“„đ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdefghijklmnopqrstuvwxyz')" + - "-ï„ł": # 0xf11a - 0xf133 + - T: "kauno" # (en: 'script', google translation) + - SPELL: "translate('.', 'ï„šï„›ï„œï„ï„žï„Ÿï„ ï„Ąï„ąï„Łï„€ï„„ï„Šï„§ï„šï„©ï„Șï„«ï„Źï„­ï„źï„Żï„°ï„±ï„Čï„ł', 'abcdefghijklmnopqrstuvwxyz')" + + # bold script chars in math alphabetic block and also MathType private use area + - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 + - T: "lihavoitu kauno" # (en: 'script bold', google translation) + - SPELL: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf140 - 0xf159 + - T: "lihavoitu kauno" # (en: 'script bold', google translation) + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "đ“Ș-𝔃": # 0x1d4ea - 0x1d503 + - T: "lihavoitu kauno" # (en: 'script bold', google translation) + - SPELL: "translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz')" + - "-ï…ł": # 0xf15a - 0xf173 + - T: "lihavoitu kauno" # (en: 'script bold', google translation) + - SPELL: "translate('.', 'ï…šï…›ï…œï…ï…žï…Ÿï… ï…Ąï…ąï…Łï…€ï…„ï…Šï…§ï…šï…©ï…Șï…«ï…Źï…­ï…źï…Żï…°ï…±ï…Čï…ł', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf180 - 0xf199 + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "": # 0xf19a + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "iso"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [T: "ligatuuri a e"] # (google translation) + - "": # 0xf19b + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "iso"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [T: "terĂ€vĂ€ s"] # (en: 'sharp s', google translation) # FI: : translation unclear + - "": # 0xf19c + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "iso"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [T: "o yliviivauksella"] # (en: 'o with stroke', google translation) + + # MathType only has a few of the cap Greek letters in PUA + - "": # 0xf201 - 0xf209 + - test: + if: "$Verbosity!='Terse'" + then: [T: "kaksoisviivainen"] # (en: 'double struck', google translation) + - SPELL: "translate('.', '', 'Î”ÎšÎ›Î ÎŁÎ˜Î“Î©Î„')" + + - "-": # 0xf220 - 0xf236 + - test: + if: "$Verbosity!='Terse'" + then: [T: "kaksoisviivainen"] # (en: 'double struck', google translation) + - SPELL: "translate('.', 'ïˆ ïˆĄïˆąïˆŁïˆ€ïˆ„ïˆŠïˆ§ïˆšïˆ©ïˆȘïˆ«ïˆŹïˆ­ïˆźïˆŻïˆ°ïˆ±ïˆČïˆłïˆŽïˆ”ïˆ¶', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "": [T: "kaksoisviivainen viimeinen sigma"] # 0xf237 (en: 'double struck final sigma', google translation) + - "": [T: "kaksoisviivainen rho"] # 0xf250 (en: 'double struck rho', google translation) + - "": [T: "kaksoisviivainen fii"] # 0xf251 (google translation) + - "𝐀-𝐙": # 0x1d400 - 0x1d419 + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-ï‰č": # 0xf260 - 0xf279 + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', 'ï‰ ï‰Ąï‰ąï‰Łï‰€ï‰„ï‰Šï‰§ï‰šï‰©ï‰Șï‰«ï‰Źï‰­ï‰źï‰Żï‰°ï‰±ï‰Čï‰łï‰Žï‰”ï‰¶ï‰·ï‰žï‰č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝐚-𝐳": # 0x1d41a - 0x1d433 + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" + + - "ï‰ș-": # 0xf27a - 0xf293 + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', 'ï‰șï‰»ï‰Œï‰œï‰Ÿï‰żïŠ€ïŠïŠ‚ïŠƒïŠ„ïŠ…ïŠ†ïŠ‡ïŠˆïŠ‰ïŠŠïŠ‹ïŠŒïŠïŠŽïŠïŠïŠ‘ïŠ’ïŠ“', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝐮-𝑍": # 0x1d434 - 0x1d44d + - SPELL: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf294 - 0xf2ad + - SPELL: "translate('.', 'ïŠ”ïŠ•ïŠ–ïŠ—ïŠ˜ïŠ™ïŠšïŠ›ïŠœïŠïŠžïŠŸïŠ ïŠĄïŠąïŠŁïŠ€ïŠ„ïŠŠïŠ§ïŠšïŠ©ïŠȘïŠ«ïŠŹïŠ­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝑎-𝑧": # 0x1d44e - 0x1d467 + - SPELL: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”đ‘•đ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" + + - "ïŠź-": # 0xf2ae - 0xf2c7 + - SPELL: "translate('.', 'ïŠźïŠŻïŠ°ïŠ±ïŠČïŠłïŠŽïŠ”ïŠ¶ïŠ·ïŠžïŠčïŠșïŠ»ïŠŒïŠœïŠŸïŠżï‹€ï‹ï‹‚ï‹ƒï‹„ï‹…ï‹†ï‹‡', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝑹-𝒁": # 0x1d468 - 0x1d481 + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-ï‹Ą": # 0xf2c8 - 0xf2e1 + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', 'ï‹ˆï‹‰ï‹Šï‹‹ï‹Œï‹ï‹Žï‹ï‹ï‹‘ï‹’ï‹“ï‹”ï‹•ï‹–ï‹—ï‹˜ï‹™ï‹šï‹›ï‹œï‹ï‹žï‹Ÿï‹ ï‹Ą', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝒂-𝒛": # 0x1d482 - 0x1d49b + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" + + - "ï‹ą-": # 0xf2e2 - 0xf2fb + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', 'ï‹ąï‹Łï‹€ï‹„ï‹Šï‹§ï‹šï‹©ï‹Șï‹«ï‹Źï‹­ï‹źï‹Żï‹°ï‹±ï‹Čï‹łï‹Žï‹”ï‹¶ï‹·ï‹žï‹čï‹ș', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 + - SPELL: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf300 - 0xf319 + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 + - SPELL: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" + + - "-ïŒł": # 0xf31a - 0xf333 + - SPELL: "translate('.', 'ïŒšïŒ›ïŒœïŒïŒžïŒŸïŒ ïŒĄïŒąïŒŁïŒ€ïŒ„ïŒŠïŒ§ïŒšïŒ©ïŒȘïŒ«ïŒŹïŒ­ïŒźïŒŻïŒ°ïŒ±ïŒČïŒł', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf334 - 0xf34d + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', 'ïŒčïŒșïŒ»ïŒŒïŒœïŒŸïŒżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒï', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝗼-𝘇": # 0x1d5ee - 0x1d607 + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf34e - 0xf367 + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', 'ïŽïïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§', 'abcdefghijklmnopqrstuvwxyz')" + - "𝘈-𝘡": # 0x1d608 - 0x1d621 + # - t: "italic" + - SPELL: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "-": # 0xf368 - 0xf381 + # - t: "italic" + - SPELL: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżïŽ€ïŽ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝘱-đ˜»": # 0x1d622 - 0x1d63b + # - t: "italic" + - SPELL: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf382 - 0xf39b + # - t: "italic" + - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + + - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf39c - 0xf3b5 + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', 'ïŽœïŽïŽžïŽŸïŽ ïŽĄïŽąïŽŁïŽ€ïŽ„ïŽŠïŽ§ïŽšïŽ©ïŽȘïŽ«ïŽŹïŽ­ïŽźïŽŻïŽ°ïŽ±ïŽČïŽłïŽŽïŽ”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝙖-𝙯": # 0x1d656 - 0x1d66f + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf3b6 - 0xf3cf + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', 'ïŽčïŽșïŽ»ïŽŒïŽœïŽŸïŽżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒïïŽï', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝙰-𝚉": # 0x1d670 - 0x1d689 + - SPELL: "translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf3d0 - 0xf3e9 + - SPELL: "translate('.', 'ïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§ïšï©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝚊-𝚣": # 0x1d68a - 0x1d6a3 + - SPELL: "translate('.', '𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚱𝚣', 'abcdefghijklmnopqrstuvwxyz')" + + - "ïȘ-": # 0xf3ea - 0xf403 + - SPELL: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżï€ïï‚ïƒ', 'abcdefghijklmnopqrstuvwxyz')" + + - "": [T: "pisteetön i"] # 0xf404 (google translation) + - "đš€": [T: "pisteetön i"] # 0x1d6a4 (en: 'dotless i', google: 'dotless i') + - "đš„": [T: "pisteetön j"] # 0x1d6a5 (en: 'dotless j', google: 'dotless j') + + - "𝚹-𝛀": # 0x1d6a8 - 0x1d6c0 + - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') + - SPELL: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "-": # 0xf408 - 0xf420 + - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') + - SPELL: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "𝛂-𝛚": # 0x1d6c2 - 0x1d6da + - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') + - SPELL: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙𝛚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "ïą-ïș": # 0xf422 - 0xf43a + - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') + - SPELL: "translate('.', 'ïąïŁï€ï„ïŠï§ïšï©ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïș', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "ïĄ": [T: "lihavoitu nabla"] # 0xf421 (en: 'bold nabla', google translation) + - "𝛁": [T: "lihavoitu nabla"] # 0x1d6c1 (en: 'bold nabla') + + - "𝛛𝛜𝛝𝛞𝛟𝛠𝛡": # 0x1D6DB - 0x1D6E1 + - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') + - SPELL: "translate('.', '𝛛𝛜𝛝𝛞𝛟𝛠𝛡', '∂ΔΞÎșφρπ')" + + - "ï»ïŒïœïŸïżï‘€ï‘": # 0xF43C - 0xF441 + - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') + - SPELL: "translate('.', 'ï»ïŒïœïŸïżï‘€ï‘', '∂ΔΞÎșφρπ')" + + - "𝛱-đ›ș": # 0x1d6e2 - 0x1d6fa + # - t: "italic" + - SPELL: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›čđ›ș', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "-": # 0xf442 - 0xf45a + # - t: "italic" + - SPELL: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "đ›Œ-𝜔": # 0x1d6fc - 0x1d714 + # - t: "italic" + - SPELL: "translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“đœ”', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-": # 0xf45c - 0xf474 + # - t: "italic" + - SPELL: "translate('.', 'ï‘œï‘ï‘žï‘Ÿï‘ ï‘Ąï‘ąï‘Łï‘€ï‘„ï‘Šï‘§ï‘šï‘©ï‘Șï‘«ï‘Źï‘­ï‘źï‘Żï‘°ï‘±ï‘Čï‘łï‘Ž', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "": [T: "kursivoitu nabla"] # 0xf45b (en: 'italic nabla', google translation) + - "đ›»": [T: "lihavoitu nabla"] # 0x1d6fb (en: 'italic nabla', google: 'kursivoitu nabla') + + - "𝜕𝜖𝜗𝜘𝜙𝜚𝜛": # 0x1d715 - 0x1d71b + # - t: "italic" + - SPELL: "translate('.', '𝜕𝜖𝜗𝜘𝜙𝜚𝜛', '∂ΔΞÎșφρπ')" + + - "ï‘čï‘ș": # 0xf475 - 0xf47b + # - t: "italic" + - SPELL: "translate('.', 'ï‘čï‘ș', '∂ΔΞÎșφρπ')" + + - "𝜜-𝜮": # 0x1d71c - 0x1d734 + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') + - SPELL: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳𝜮', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "-": # 0xf47c - 0xf494 + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') + - SPELL: "translate('.', 'ï‘Œï‘œï‘Ÿï‘żï’€ï’ï’‚ï’ƒï’„ï’…ï’†ï’‡ï’ˆï’‰ï’Šï’‹ï’Œï’ï’Žï’ï’ï’‘ï’’ï’“ï’”', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "đœ¶-𝝎": # 0x1d736 - 0x1d74e + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') + - SPELL: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđđŽ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-ï’ź": # 0xf496 - 0xf4ae + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') + - SPELL: "translate('.', 'ï’–ï’—ï’˜ï’™ï’šï’›ï’œï’ï’žï’Ÿï’ ï’Ąï’ąï’Łï’€ï’„ï’Šï’§ï’šï’©ï’Șï’«ï’Źï’­ï’ź', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "𝝏𝝐𝝑𝝒𝝓𝝔𝝕": # 0x1d74f - 0x1d755 + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') + - SPELL: "translate('.', '𝝏𝝐𝝑𝝒𝝓𝝔𝝕', '∂ΔΞÎșφρπ')" + + - "ï’Żï’°ï’±ï’Čï’łï’Žï’”": # 0xf422 - 0xf43a + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') + - SPELL: "translate('.', 'ï’Żï’°ï’±ï’Čï’łï’Žï’”', '∂ΔΞÎșφρπ')" + + - "đœ”": [T: "lihavoitu kursivoitu nabla"] # 0x1d735 (en: 'bold italic nabla', google: 'rohkea kursivoitu nabla') + - "": [T: "lihavoitu kursivoitu nabla"] # 0xf495 (en: 'bold italic nabla', google translation) + + - "𝝖-𝝼": # 0x1d756 - 0x1d76e + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đź', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + - "-": # 0xf4b6 - 0xf4ce + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', 'ï’¶ï’·ï’žï’čï’șï’»ï’Œï’œï’Ÿï’żï“€ï“ï“‚ï“ƒï“„ï“…ï“†ï“‡ï“ˆï“‰ï“Šï“‹ï“Œï“ï“Ž', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "𝝰-𝞈": # 0x1d770 - 0x1d788 + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€đžđž‚đžƒđž„đž…đž†đž‡đžˆ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-": # 0xf4d0 - 0xf4e8 + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', 'ï“ï“‘ï“’ï““ï“”ï“•ï“–ï“—ï“˜ï“™ï“šï“›ï“œï“ï“žï“Ÿï“ ï“Ąï“ąï“Łï“€ï“„ï“Šï“§ï“š', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "𝞉𝞊𝞋𝞌𝞍𝞎𝞏": # 0x1d789 - 0x1d78f + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', '𝞉𝞊𝞋𝞌𝞍𝞎𝞏', '∂ΔΞÎșφρπ')" + + - "ï“Șï“«ï“Źï“­ï“źï“Ż": # 0xf4e9 - 0xf4ef + - T: "lihavoitu" # (en: 'bold', google translation) + - SPELL: "translate('.', 'ï“Șï“«ï“Źï“­ï“źï“Ż', '∂ΔΞÎșφρπ')" + + - "": [T: "lihavoitu nabla"] # 0xf4cf (en: 'bold nabla', google translation) + - "𝝯": [T: "lihavoitu nabla"] # 0x1d76f (en: 'bold nabla') + + - "𝞐-𝞹": # 0x1d790 - 0x1d7a8 + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') + - SPELL: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "-": # 0xf4f0 - 0xf508 + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') + - SPELL: "translate('.', 'ï“Čï“łï“Žï“”ï“¶ï“·ï“žï“čï“șï“»ï“Œï“œï“Ÿï“żï”€ï”ï”‚ï”ƒï”„ï”…ï”†ï”‡ï”ˆ', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "đžȘ-𝟂": # 0x1d7aa - 0x1d7c2 + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') + - SPELL: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸđŸ‚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-ï”ą": # 0xf50a - 0xf522 + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') + - SPELL: "translate('.', 'ï”Šï”‹ï”Œï”ï”Žï”ï”ï”‘ï”’ï”“ï””ï”•ï”–ï”—ï”˜ï”™ï”šï”›ï”œï”ï”žï”Ÿï” ï”Ąï”ą', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "𝟃𝟄𝟅𝟆𝟇𝟈𝟉": # 0x1d7c3 - 0x1d7c9 + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') + - SPELL: "translate('.', '𝟃𝟄𝟅𝟆𝟇𝟈𝟉', '∂ΔΞÎșφρπ')" + + - "ï”Łï”€ï”„ï”Šï”§ï”šï”©": # 0xf523 - 0xf529 + # - t: "bold italic" + - T: "lihavoitu" # (en: 'bold', google: 'lihavoitu') + - SPELL: "translate('.', 'ï”Łï”€ï”„ï”Šï”§ï”šï”©', '∂ΔΞÎșφρπ')" + + - "": [T: "lihavoitu nabla"] # 0xf509 (en: 'bold nabla', google translation) + - "đž©": [T: "lihavoitu nabla"] # 0x1d7a9 (en: 'bold nabla') + + - "ï”ź": [T: "lihavoitu nolla"] # 0xf52e (en: 'bold zero', google translation) + - "𝟎": [T: "lihavoitu nolla"] # 0x1d7ce (en: 'bold zero') + - "ï”Ż": [T: "lihavoitu yksi"] # 0xf52f (en: 'bold one', google translation) + - "𝟏": [T: "lihavoitu yksi"] # 0x1d7cf (en: 'bold one', google: 'lihavoitu') + - "": [T: "lihavoitu kaksi"] # 0xf530 (en: 'bold two', google translation) + - "𝟐": [T: "lihavoitu kaksi"] # 0x1d7d0 (en: 'bold two') + - "": [T: "lihavoitu kolme"] # 0xf531 (en: 'bold three', google translation) + - "𝟑": [T: "lihavoitu kolme"] # 0x1d7d1 (en: 'bold three') + - "ï”Č": [T: "lihavoitu neljĂ€"] # 0xf532 (en: 'bold four', google translation) + - "𝟒": [T: "lihavoitu neljĂ€"] # 0x1d7d2 (en: 'bold four', google: 'bold neljĂ€') + - "ï”ł": [T: "lihavoitu viisi"] # 0xf533 (en: 'bold five', google translation) + - "𝟓": [T: "lihavoitu viisi"] # 0x1d7d3 (en: 'bold five') + - "": [T: "lihavoitu kuusi"] # 0xf534 (en: 'bold six', google translation) + - "𝟔": [T: "lihavoitu kuusi"] # 0x1d7d4 (en: 'bold six') + - "ï””": [T: "lihavoitu seitsemĂ€n"] # 0xf535 (en: 'bold seven', google translation) + - "𝟕": [T: "lihavoitu seitsemĂ€n"] # 0x1d7d5 (en: 'bold seven', google: 'rohkea seitsemĂ€n') + - "": [T: "lihavoitu kahdeksan"] # 0xf536 (en: 'bold eight', google translation) + - "𝟖": [T: "lihavoitu kahdeksan"] # 0x1d7d6 (en: 'bold eight', google: 'lihavoitu') + - "": [T: "lihavoitu yhdeksĂ€n"] # 0xf537 (en: 'bold nine', google translation) + - "𝟗": [T: "lihavoitu yhdeksĂ€n"] # 0x1d7d7 (en: 'bold nine') + - "": [T: "nolla"] # 0xf542 (en: 'zero', google translation) + - "𝟱": [T: "nolla"] # 0x1d7e2 (en: 'zero') + - "": [T: "yksi"] # 0xf543 (en: 'one', google translation) + - "𝟣": [T: "yksi"] # 0x1d7e3 (en: 'one') + - "": [T: "kaksi"] # 0xf544 (en: 'two', google translation) + - "đŸ€": [T: "kaksi"] # 0x1d7e4 (en: 'two') + - "": [T: "kolme"] # 0xf545 (en: 'three', google translation) + - "đŸ„": [T: "kolme"] # 0x1d7e5 (en: 'three') + - "": [T: "neljĂ€"] # 0xf546 (en: 'four', google translation) + - "𝟩": [T: "neljĂ€"] # 0x1d7e6 (en: 'four') + - "": [T: "viisi"] # 0xf547 (en: 'five', google translation) + - "𝟧": [T: "viisi"] # 0x1d7e7 (en: 'five') + - "": [T: "kuusi"] # 0xf548 (en: 'six', google translation) + - "𝟹": [T: "kuusi"] # 0x1d7e8 (en: 'six') + - "": [T: "seitsemĂ€n"] # 0xf549 (en: 'seven', google translation) + - "đŸ©": [T: "seitsemĂ€n"] # 0x1d7e9 (en: 'seven') + - "": [T: "kahdeksan"] # 0xf54a (en: 'eight', google translation) + - "đŸȘ": [T: "kahdeksan"] # 0x1d7ea (en: 'eight', google: 'at') + - "": [T: "yhdeksĂ€n"] # 0xf54b (en: 'nine', google translation) + - "đŸ«": [T: "yhdeksĂ€n"] # 0x1d7eb (en: 'nine') + - "": [T: "lihavoitu nolla"] # 0xf54c (en: 'bold zero', google translation) + - "𝟬": [T: "lihavoitu nolla"] # 0x1d7ec (en: 'bold zero') + - "": [T: "lihavoitu yksi"] # 0xf54d (en: 'bold one', google translation) + - "𝟭": [T: "lihavoitu yksi"] # 0x1d7ed (en: 'bold one', google: 'lihavoitu') + - "": [T: "lihavoitu kaksi"] # 0xf54e (en: 'bold two', google translation) + - "𝟼": [T: "lihavoitu kaksi"] # 0x1d7ee (en: 'bold two') + - "": [T: "lihavoitu kolme"] # 0xf54f (en: 'bold three', google translation) + - "𝟯": [T: "lihavoitu kolme"] # 0x1d7ef (en: 'bold three') + - "": [T: "lihavoitu neljĂ€"] # 0xf550 (en: 'bold four', google translation) + - "𝟰": [T: "lihavoitu neljĂ€"] # 0x1d7f0 (en: 'bold four', google: 'bold neljĂ€') + - "": [T: "lihavoitu viisi"] # 0xf551 (en: 'bold five', google translation) + - "đŸ±": [T: "lihavoitu viisi"] # 0x1d7f1 (en: 'bold five') + - "": [T: "lihavoitu kuusi"] # 0xf552 (en: 'bold six', google translation) + - "đŸČ": [T: "lihavoitu kuusi"] # 0x1d7f2 (en: 'bold six') + - "": [T: "lihavoitu seitsemĂ€n"] # 0xf553 (en: 'bold seven', google translation) + - "𝟳": [T: "lihavoitu seitsemĂ€n"] # 0x1d7f3 (en: 'bold seven', google: 'rohkea seitsemĂ€n') + - "": [T: "lihavoitu kahdeksan"] # 0xf554 (en: 'bold eight', google translation) + - "𝟮": [T: "lihavoitu kahdeksan"] # 0x1d7f4 (en: 'bold eight', google: 'lihavoitu') + - "": [T: "lihavoitu yhdeksĂ€n"] # 0xf555 (en: 'bold nine', google translation) + - "đŸ”": [T: "lihavoitu yhdeksĂ€n"] # 0x1d7f5 (en: 'bold nine') + - "": [T: "nolla"] # 0xf556 (en: 'zero', google translation) + - "đŸ¶": [T: "nolla"] # 0x1d7f6 (en: 'zero') + - "": [T: "yksi"] # 0xf557 (en: 'one', google translation) + - "đŸ·": [T: "yksi"] # 0x1d7f7 (en: 'one') + - "": [T: "kaksi"] # 0xf558 (en: 'two', google translation) + - "𝟾": [T: "kaksi"] # 0x1d7f8 (en: 'two') + - "": [T: "kolme"] # 0xf559 (en: 'three', google translation) + - "đŸč": [T: "kolme"] # 0x1d7f9 (en: 'three') + - "": [T: "neljĂ€"] # 0xf55a (en: 'four', google translation) + - "đŸș": [T: "neljĂ€"] # 0x1d7fa (en: 'four') + - "": [T: "viisi"] # 0xf55b (en: 'five', google translation) + - "đŸ»": [T: "viisi"] # 0x1d7fb (en: 'five') + - "": [T: "kuusi"] # 0xf55c (en: 'six', google translation) + - "đŸŒ": [T: "kuusi"] # 0x1d7fc (en: 'six') + - "": [T: "seitsemĂ€n"] # 0xf55d (en: 'seven', google translation) + - "đŸœ": [T: "seitsemĂ€n"] # 0x1d7fd (en: 'seven') + - "": [T: "kahdeksan"] # 0xf55e (en: 'eight', google translation) + - "đŸŸ": [T: "kahdeksan"] # 0x1d7fe (en: 'eight', google: 'at') + - "": [T: "yhdeksĂ€n"] # 0xf55f (en: 'nine', google translation) + - "𝟿": [T: "yhdeksĂ€n"] # 0x1d7ff (en: 'nine') + - "": [T: "tuntematon merkki"] # 0xf700 (en: 'unknown character', google translation) + - "": [T: "alaoikea ja alavasen kolmio"] # 0xf726 (en: 'lower right and lower left triangles', google translation) + - "": [T: "vaakasuora pistekolmikko pidennys"] # 0xf72d (en: 'horizontal ellipsis extender', google translation) + - "ïœź": [T: "keskiviivan vaakasuora pistekolmikko pidennys"] # 0xf72e (en: 'midline horizontal ellipsis extender', google translation) + - "ïŁ„": [T: "radikaali pidennys"] # 0xf8e5 (en: 'radical extender', google translation) # FI: unclear translation, root? + - "ïŁŠ": [T: "pystysuora nuoli pidennys"] # 0xf8e6 (en: 'vertical arrow extender', google translation) + - "ïŁ§": [T: "vaakasuora nuoli pidennys"] # 0xf8e7 (en: 'horizontal arrow extender', google translation) + - "ïŁš": [T: "rekisteröity merkki sans serif"] # 0xf8e8 (en: 'registered sign sans serif', google translation) + - "ïŁ©": [T: "tekijĂ€noikeusmerkki sans serif"] # 0xf8e9 (en: 'copyright sign sans serif', google translation) + - "ïŁȘ": [T: "trademark -merkki sans serif"] # 0xf8ea (en: 'trade mark sign sans serif', google translation) + - "ïŁ«": [T: "vasen kaarisulku ylĂ€"] # 0xf8eb (en: 'left paren top', google translation) + - "ïŁŹ": [T: "vasen kaarisulku pidennys"] # 0xf8ec (en: 'left paren extender', google translation) + - "ïŁ­": [T: "vasen kaarisulku ala"] # 0xf8ed (en: 'left paren bottom', google translation) + - "ïŁź": [T: "vasen hakasulku ylĂ€"] # 0xf8ee (en: 'left bracket top', google translation) + - "ïŁŻ": [T: "vasen hakasulku pidennys"] # 0xf8ef (en: 'left bracket extender', google translation) + - "ïŁ°": [T: "vasen hakasulku ala"] # 0xf8f0 (en: 'left bracket bottom', google translation) + - "ïŁ±": [T: "vasen hakasulku ylĂ€"] # 0xf8f1 (en: 'left brace top', google translation) + - "ïŁČ": [T: "vasen aaltosulku keski"] # 0xf8f2 (en: 'left brace mid', google translation) + - "ïŁł": [T: "vasen aaltosulku ala"] # 0xf8f3 (en: 'left brace bottom', google translation) + - "ïŁŽ": [T: "aaltosulku pidennys"] # 0xf8f4 (en: 'brace extender', google translation) + - "ïŁ”": [T: "integraali pidennys"] # 0xf8f5 (en: 'integral extender', google translation) + - "ïŁ¶": [T: "oikea kaarisulku ylĂ€"] # 0xf8f6 (en: 'right paren top', google translation) + - "ïŁ·": [T: "oikea kaarisulku pidennys"] # 0xf8f7 (en: 'right paren extender', google translation) + - "ïŁž": [T: "oikea kaarisulku ala"] # 0xf8f8 (en: 'right paren bottom', google translation) + - "ïŁč": [T: "oikea hakasulku ylĂ€"] # 0xf8f9 (en: 'right bracket top', google translation) + - "ïŁș": [T: "oikea hakasulku pidennys"] # 0xf8fa (en: 'right bracket extender', google translation) + - "ïŁ»": [T: "oikea hakasulku ala"] # 0xf8fb (en: 'right bracket bottom', google translation) + - "ïŁŒ": [T: "oikea aaltosulku ylĂ€"] # 0xf8fc (en: 'right brace top', google translation) + - "ïŁœ": [T: "oikea aaltosulku keski"] # 0xf8fd (en: 'right brace mid', google translation) + - "ïŁŸ": [T: "oikea aaltosulku ala"] # 0xf8fe (en: 'right brace bottom', google translation) + - "ïŁż": [T: "apple-logo"] # 0xf8ff (en: 'apple logo', google translation) + - "ïŹ€": [T: "f f"] # 0xfb00 (en: 'ff', google: 'ff') + - "ïŹ": [T: "f i"] # 0xfb01 (en: 'fi', google: 'fi') + - "ïŹ‚": [T: "f l"] # 0xfb02 (en: 'fl', google: 'fl') + - "ïŹƒ": [T: "f f i"] # 0xfb03 (en: 'ffi', google: 'ffi') + - "ïŹ„": [T: "f f l"] # 0xfb04 (en: 'ffl', google: 'ffl') + - "ïŹ…": [T: "f t"] # 0xfb05 (google translation) + - "ïŹ†": [T: "s t"] # 0xfb06 (google translation) + - "ïž ": [T: "ligatuuri vasen puolikas koriste"] # 0xfe20 (en: 'ligature left half embellishment', google translation) # FI: : translation unclear + - "ïžĄ": [T: "ligatuuri oikea puolikas koriste"] # 0xfe21 (en: 'ligature right half embellishment', google translation) # FI: : translation unclear + - "ïžą": [T: "kaksoistilde vasen puolikas koriste"] # 0xfe22 (en: 'double tilde left half embellishment', google translation) # FI: : translation unclear + - "ïžŁ": [T: "kaksoistilde oikea puolikas koriste"] # 0xfe23 (en: 'double tilde right half embellishment', google translation) + - "": [T: "pituusmerkki vasen puolikas koriste"] # 0xfe24 (en: 'macron left half embellishment', google translation) + - "ïž„": [T: "pituusmerkki oikea puolikas koriste"] # 0xfe25 (en: 'macron right half embellishment', google translation) + - "": [T: "yhdistĂ€vĂ€ pituusmerkkikoriste"] # 0xfe26 (en: 'conjoining macron embellishment', google translation) + - "ïž”": [T: "ylĂ€sulku"] # 0xfe35 (google: 'yli sulku') + - "ïž¶": [T: "alasulku"] # 0xfe36 (google: 'suluissa') + - "ïž·": [T: "ylĂ€aaltosulku"] # 0xfe37 (en: 'over brace', google: 'yli ahdin') + - "ïžž": [T: "ala-aaltosulku"] # 0xfe38 (en: 'under brace', google: 'ahdin alla') + - "ïžż": [T: "ylĂ€kulmasulku"] # 0xfe3f (google: 'yli kulmakiinnike') + - "ïč€": [T: "alakulmasulku"] # 0xfe40 (google: 'kulmakiinnikkeessĂ€') + - "ïčš": [T: "kokonaislukujen jakomerkki"] # 0xfe68 (google: 'kokonaislukujako') + - "ïżŒ": [T: "tuntematon tai puuttuva objekti"] # 0xfffc (en: 'unknown or missing object', google translation) + - "ïżœ": [T: "tuntematon tai puuttuva merkki"] # 0xfffd (en: 'unknown or missing character') diff --git a/Rules/Languages/fi/unicode.yaml b/Rules/Languages/fi/unicode.yaml index f5bfc53c9..8e5d02aa4 100644 --- a/Rules/Languages/fi/unicode.yaml +++ b/Rules/Languages/fi/unicode.yaml @@ -1,482 +1,482 @@ ---- - - "a-z": - - test: - if: "$TTS='none'" - then: [T: "."] # (en: '.', google translation) - else: [SPELL: "'.'"] # Meaning? - - # Capital letters are a little tricky: users can pick their favorite word (something that was requested) and - # screen readers have options to use pitch changes or beeps instead of or in addition to say "cap" - # Also, if a user can see the screen, they probably don't need to hear "cap", but if they specified an override, they must want to hear the override. - - - "A-Z": - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "iso"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - # note: processing of ranges converts '.' into the character, so it needs to be in quotes below - # note: is there a need for Å/Ä/Ö here? - replace: [SPELL: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"] - - - "0-9": [T: "."] # (en: '.', google: 'A') - - - "!": # 0x21 - - test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':structure:')]" - then_test: - if: "$Verbosity = 'Terse'" - then: [T: "huuto"] # 0x21 (en: 'bang', google translation) - else: [T: "huutomerkki"] # 0x21 (en: 'exclamation point', google: 'huutomerkki'); might be obsolete - else: [T: "kertoma"] # 0x21 (en: 'factorial', google: 'tekijĂ€') - - - "\"": [T: "lainaus"] # 0x22 (en: 'quotation mark', google: 'lainausmerkki'); could also be "sitaatti" - - "#": [T: "numero"] # 0x23 (en: 'number', google: 'mÀÀrĂ€'); could also be "ruutu" but "ristikkomerkki" is more clear - - "$": [T: "dollaria"] # 0x24 (en: 'dollars', google: 'dollarit') - - "%": [T: "prosenttia"] # 0x25 (en: 'percent') - - "&": [T: "et-merkki"] # 0x26 (en: 'ampersand', google: 'ampersand') - - "'": [T: "heittomerkki"] # 0x27 (en: 'apostrophe') - - "(": # 0x28 - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then_test: - if: "$Verbosity='Terse'" - then: [T: "auki"] # 0x28 (en: 'open', google translation) - else: [T: "auki sulku"] # 0x28 (en: 'open paren', google: 'avoin sulku') - else: [T: "vasen sulku"] # 0x28 (en: 'left paren', google: 'vasen sulku') - - ")": # 0x29 - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then_test: - if: "$Verbosity='Terse'" - then: [T: "kiinni"] # 0x29 (en: 'close', google translation) - else: [T: "kiinni sulku"] # 0x29 (en: 'close paren', google: 'sulje sulku') - else: [T: "oikea sulku"] # 0x29 (en: 'right paren', google: 'oikea sulku') - - - "*": # 0x2a - test: - if: "parent::*[name(.)='msup' or name(.)='msubsup' or name(.)='skip-super']" - then: [T: "tĂ€hti"] # 0x2a (en: 'star', google translation) - else: [T: "kertaa"] # 0x2a (en: 'times', google: 'ajat') - - "+": [T: "plus"] # 0x2b - - ",": # 0x2c - # the following deals with the interaction of "," with "
" which sometimes wants the ',' to be silent - # that this test is here and not with "
" is not ideal, but seems simplest - test: - if: - - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or " - # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' - # speak "comma" when not adjacent to '
' - - "( following-sibling::*[1][text()!= '
'] and preceding-sibling::*[1][text()!='
'] ) or " - # except if expression starts with '
' - - "../*[1][.='
'] " - then: - - T: "pilkku" # (en: 'comma', google translation) - - test: - if: "$Verbosity != Terse" - then: [pause: short] - # else silent - - - "-": [T: "miinus"] # 0x2d (en: 'minus') - - ".": # 0x2e - - test: - if: "parent::*[1][self::m:mn]" - then: [T: "piste"] # (en: 'point', google translation) - else: [T: "piste"] # (en: 'dot'); possibly obsolete if-else - - "/": [T: "jaettuna"] # 0x2f (en: 'divided by', google: 'jaettuna') - - ":": [T: "kaksoispiste"] # 0x3a (en: 'colon') - - ";": [T: "puolipiste"] # 0x3b (en: 'semicolon') - - "<": # 0x3c - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "pienempi kuin" # (en: 'less than', google: 'vĂ€hemmĂ€n kuin') - - "=": # 0x3d - - test: - if: "$Verbosity!='Terse'" - then: [T: "on yhtĂ€ suuri kuin"] # (en: 'is equal to', google translation) - else: [T: "on"] # (en: 'equals', google: 'yhtĂ€ suuri') - - - ">": # 0x3e - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "suurempi kuin" # (en: 'greater than', google: 'suurempi kuin') - - "?": [T: "kysymysmerkki"] # 0x3f (en: 'question mark') - - "@": [T: "Ă€t-merkki"] # 0x40 (en: 'at sign', google: 'kylttiĂ€') - - "[": # 0x5b - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "auki hakasulku"] # (en: 'open bracket', google translation) - else: [T: "vasen hakasulku"] # (en: 'left bracket', google: 'vasen kiinnike') - - "\\": [T: "kenoviiva"] # 0x5c (en: 'back slash', google: 'takaviiva') - - "]": # 0x5d - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "kiinni hakasulku"] # (en: 'close bracket', google translation) - else: [T: "oikea hakasulku"] # (en: 'right bracket', google: 'oikea kiinnike') - - "^": [T: "hattu"] # 0x5e (en: 'hat', google: 'hattu') - - "_": [T: "alaviiva"] # 0x5f (en: 'under bar', google: 'baarin alla') - - "`": [T: "gravis"] # 0x60 (en: 'grave', google: 'hauta') # FI: not sure - - "{": # 0x7b - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "auki aaltosulku"] # (en: 'open brace', google translation) - else: [T: "vasen aaltosulku"] # (en: 'left brace', google: 'vasen ahdin') - - "|": # 0x7c - # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' - - with: - variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) - replace: - - test: - - if: "$SpeechStyle != 'ClearSpeak'" - then_test: - - if: "$DefaultToGiven" - then: [T: "ehdolla"] - - else_if: "preceding-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))] and - following-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))]" - then: [T: "jakaa"] - else: [T: "pystysuora viiva"] - - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" - then: [T: "pystysuora viiva"] - - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" - then: [T: "siten ettĂ€"] - - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" - then: [T: "ehdolla"] - - else: [T: "jakaa"] - - - "}": # 0x7d - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "kiinni aaltosulku"] # (en: 'close brace', google translation) - else: [T: "oikea aaltosulku"] # (en: 'right brace', google: 'oikea ahdin') - - - "~": [T: "tilde"] # 0x7e - - " ": # 0xa0 - - test: - if: "@data-empty-in-2D and ../../../../*[name(.)!='system-of-equations']" - then: [T: "tyhjĂ€"] # want to say something for fraction (etc) with empty child (en: 'empty', google translation) - else: [T: ""] - - - "ÂŹ": [T: "ei"] # 0xac (en: 'not', google: 'ei') # Terse logic? - - "°": [T: "astetta"] # 0xb0 (en: 'degrees', google: 'asteet') - - "±": [T: "plus-miinus"] # 0xb1 (en: 'plus or minus', google: 'plus tai miinus') - - "ÂŽ": [T: "akuutti"] # 0xb4 (en: 'acute') - - "·": # 0xB7 - - test: - if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolDot = 'Auto'" - then: [T: "kertaa"] # (en: 'times', google translation) - else: [T: "piste"] # (en: 'dot', google: 'piste') - - "×": # 0xd7 - - test: - if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolX = 'Auto'" - then: [T: "kertaa"] # (en: 'times', google translation) - else_test: - if: $ClearSpeak_MultSymbolX = 'By' - then: [T: "kertaa"] # (en: 2 'by' 2 matrice) fi: (2 kertaa 2 matriisi) translator's note - else: [T: "risti"] # (en: 'cross', google: 'ylittÀÀ') - - "Ă·": [T: "jaettuna"] # 0xf7 (en: 'divided by') - - "̀": [T: "gravis korostus"] # 0x300 (en: 'grave accent embellishment', google: 'vakava korostuskoriste') - - "́": [T: "akuutti korostus"] # 0x301 (en: 'acute accent embellishment', google: 'akuutti korostuskoriste') - - "̂": [T: "sirkumfleksi korostus"] # 0x302 (en: 'circumflex accent embellishment', google: 'ympyrĂ€korotuskoriste') - - "̃": [T: "tilde"] # 0x303 (en: 'tilde embellishment', google: 'tilde -koriste') - - "̄": [T: "pituusmerkki"] # 0x304 (en: 'macron embellishment', google: 'macronin koriste') - - "̅": [T: "ylĂ€viiva"] # 0x305 (en: 'overbar embellishment', google: 'ylipalkin koriste') - - "̆": [T: "lyhyysmerkki"] # 0x306 (en: 'breve', google: 'breve') - - "̇": [T: "piste"] # 0x307 (en: 'dot above embellishment', google: 'piste koristelun ylĂ€puolella') - - # Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong - - "Α-Ω": - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "iso"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - # note: processing of ranges converts '.' into the character, so it needs to be in quotes below - replace: [SPELL: "translate('.', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')"] - - - "α": [T: "alfa"] # 0x3b1 (en: 'alpha') - - "ÎČ": [T: "beeta"] # 0x3b2 (en: 'beta') - - "Îł": [T: "gamma"] # 0x3b3 - - "ÎŽ": [T: "delta"] # 0x3b4 - - "Δ": [T: "epsilon"] # 0x3b5 - - "ζ": [T: "zeeta"] # 0x3b6 (en: 'zeta', google: 'zeta') - - "η": [T: "eeta"] # 0x3b7 (en: 'eta', google: 'eta') - - "Ξ": [T: "theeta"] # 0x3b8 (en: 'theta', google: 'theta') - - "Îč": [T: "ioota"] # 0x3b9 (en: 'iota', google: 'iota') - - "Îș": [T: "kappa"] # 0x3ba - - "λ": [T: "lambda"] # 0x3bb - - "ÎŒ": [T: "myy"] # 0x3bc (en: 'mu', google: 'mu') - - "Μ": [T: "nyy"] # 0x3bd (en: 'nu', google: 'nu') - - "Ο": [T: "ksii"] # 0x3be (en: 'zai', google: 'zai') - - "Îż": [T: "omikron"] # 0x3bf (en: 'omicron', google: 'omicron') - - "π": [T: "pii"] # 0x3c0 (en: 'pi', google: 'pi') - - "ρ": [T: "rhoo"] # 0x3c1 (en: 'rho', google: 'rho') - - "ς": [T: "loppu-sigma"] # 0x3c2 (en: 'final sigma', google: 'viimeinen sigma') - - "σ": [T: "sigma"] # 0x3c3 - - "τ": [T: "tau"] # 0x3c4 - - "υ": [T: "ypsilon"] # 0x3c5 (en: 'upsilon', google: 'upsilon') - - "φ": [T: "fii"] # 0x3c6 (en: 'phi', google: 'phi') - - "χ": [T: "khii"] # 0x3c7 (en: 'chi', google: 'chi') - - "ψ": [T: "psii"] # 0x3c8 (en: 'psi', google: 'psi') - - "ω": [T: "oomega"] # 0x3c9 (en: 'omega', google: 'omega') - - "ϕ": [T: "suora fii"] # 0x3d5 (en: 'phi', google: 'phi') - - "ϖ": [T: "kreikkalainen pii"] # 0x3d6 (en: 'pi', google: 'pi') - - "Ï”": [T: "epsilon"] # 0x3f5 - - "϶": [T: "kÀÀnnetty epsilon"] # 0x3f6 (en: 'reversed epsilon', google: 'kÀÀntynyt epsilon') - - - "⁥": # 0x2061 - - test: - # skip saying "of" when Terse and a trig function, when it is a shape (does this happen?), or we are in :literal mode - # log is treated differently than trig functions - # Note: this differs from 'en' because the ClearSpeak and default rules are different from 'en' - if: "not( - ( $Verbosity='Terse' or ($SpeechStyle = 'ClearSpeak' and IsNode(following-sibling::*[1],'simple')) and - preceding-sibling::*[1][IfThenElse($SpeechStyle='ClearSpeak', - IsInDefinition(., 'ClearSpeakTrigFunctionNames'), - IsInDefinition(., 'TrigFunctionNames') )] - ) or - preceding-sibling::*[1][IsInDefinition(., 'GeometryShapes')] or - (@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) - )" - then: [T: "arvolla"] - - "⁹": [T: ""] # 0x2062 # invisible 'times', fi: should this have a value? - - "⁣": [T: ""] # 0x2063 # invisible 'separator', fi: should this have a value? - - "⁀": [T: "ja"] # 0x2064 (en: 'and', google translation) - - "ℂℕℚℝ℀": # here we rely on this running through the table again to speak "cap xxx" - - T: "kaksoisviivainen" # (en: 'double-struck', google: 'kaksinkertainen') # not satisfied - - SPELL: "translate('.', 'ℂℕℚℝ℀', 'CNQRZ')" - - - "℃": [T: "astetta celsiusta"] # 0x2103 (en: 'degrees celsius', google: 'celsius astetta') - - "ℋℛℓ": # 0x210b - - T: "skripti" # (en: 'script', google: 'kĂ€sikirjoitus') # not satisfied - - SPELL: "translate('.', 'ℋℛℓ', 'HRl')" - - "ℜ": # 0x211c - - T: "fraktuura iso r" # (en: 'fraktur', google: 'fraktur') - - SPELL: "'R'" - - - "ⅆⅇⅈⅉ": # 0x2146-9 - - T: "kaksoisviivainen kursiivi" # (en: 'double-struck italic', google: 'kaksinkertainen kursivoitu') - - SPELL: "translate('.', 'ⅆⅇⅈⅉ', 'deij')" - - - "∄": # 0x2225 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "yhdensuuntainen" # (en: 'parallel to', google: 'samansuuntainen') - - "∊": # 0x2226 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei ole yhdensuuntainen" # (en: 'not parallel to', google: 'ei rinnakkain') - - "≀": # 0x2264 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "pienempi tai yhtĂ€ suuri kuin" - - "≄": # 0x2265 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "suurempi tai yhtĂ€ suuri kuin" # (en: 'greater than or equal to', google: 'suurempi tai yhtĂ€ suuri kuin') - - # --- restored complex short definitions (prefer over unicode-full) --- - - "
": # 0x2026 - test: - if: - - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" - # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' - # speak '
' as 'and so on...' unless expr starts with '
' - - "../*[1][.='
']" - then: [T: "piste piste piste"] # (google translation) - else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' - if: "count(following-sibling::*) = 0" - then: [T: "ja niin edelleen"] # (en: 'and so on', google translation) - else: [T: "ja niin edelleen kunnes"] # (en: 'and so on up to', google: 'ja niin edelleen'); possibly obsolete if-else - - "→": # 0x2192 - - test: - if: "ancestor::*[2][self::m:limit]" - then: [T: "lĂ€hestyy"] # (en: 'approaches', google translation) - else: [T: "nuoli oikealle"] # (en: 'right arrow', google: 'oikea nuoli') - - "∂": # 0x2202 - - test: - if: "$Verbosity='Terse'" - then: [T: "osittaisderivaatta"] # (en: 'partial', google translation) # might be other possibilities - else: [T: "osittaisderivaatta"] # (en: 'partial derivative', google: 'osittainen johdannainen') - - "∆": # 0x2206 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (google translation) - - T: "Laplacen operaattori" # (en: 'laplacian of', google: 'laplacian of') - - "∈": # 0x2208 # fi: some elements (pun) of this translation has to be tested - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: [T: "kuuluu"] # (en: 'an element of', google translation) - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "kuuluu"] # (en: 'in', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "kuuluu"] # (en: 'member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "kuuluu"] # (en: 'element of', google translation) - - else: [T: "kuuluu joukkoon"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to', google: 'kuulua') - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "kuuluu"] # (en: 'is a member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "kuuluu"] # (en: 'is an element of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "kuuluu"] # (en: 'is in', google translation) - - else: [T: "kuuluu joukkoon"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to', google: 'kuuluu') - - "∉": # 0x2209 # fi: some elements (pun) of this translation has to be tested - # rule is identical to 0x2208 - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: [T: "ei kuulu"] # (en: 'is not an element of', google translation) - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "ei kuulu"] # (en: 'not in', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "ei kuulu"] # (en: 'not member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "ei kuulu"] # (en: 'not element of', google translation) - - else: [T: "ei kuulu joukkoon"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'not belonging to', google: 'ei kuulu') - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "ei kuulu"] # (en: 'is not a member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "ei kuulu"] # (en: 'is not an element of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "ei ole joukossa"] # (en: 'is not in', google translation) - - else: [T: "ei kuulu joukkoon"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'does not belong to', google: 'ei kuulu') - - "∊": # 0x220a # fi: some elements (pun) of this translation has to be tested - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: [T: "kuuluu"] # (en: 'is an element of', google translation) - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "kuuluu"] # (en: 'in', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "kuuluu"] # (en: 'member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "kuuluu"] # (en: 'element of', google translation) - - else: [T: "kuuluu joukkoon"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to', google: 'kuulua') - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "kuuluu"] # (en: 'is a member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "kuuluu"] # (en: 'is an element of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "kuuluu"] # (en: 'is in', google translation) - - else: [T: "kuuluu joukkoon"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to', google: 'kuuluu') - - "√": # 0x221a - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (google translation) - - T: "neliöjuuri" # (en: 'square root of') - - "∝": # 0x221d - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "verrannollinen" # (en: 'proportional to', google: 'suhteessa') - - "∶": # 0x2236 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "suhde" # (en: 'to', google: 'to') - - "∟": # 0x223e - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "kÀÀnnetty kaatunut S-kirjain" # (en: 'most positive', google: 'positiivisin') # fi: no good translation - - "≠": # 0x2260 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei ole yhtĂ€ suuri kuin" # (en: 'not equal to', google: 'ei yhtĂ€ suuri kuin') - - "≡": # 0x2261 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is', google translation) - - T: "identtinen" # (en: 'identical to', google: 'yhtĂ€lĂ€inen') - - "⊂": # 0x2282 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is a', google translation) - - T: "osajoukko" # (en: 'subset of', google: 'alajoukko') - - "⊃": # 0x2283 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is a', google translation) - - T: "ylijoukko" # (en: 'superset of', google: 'superset of') # fi: not common, source for Finnish: https://fi.wikibooks.org/wiki/Diskreetti_matematiikka/Joukko-oppi - - "⊄": # 0x2284 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei ole osajoukko" # (en: 'not a subset of', google: 'ei osa') - - "⊅": # 0x2285 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', google translation) - - T: "ei ole ylijoukko" # (en: 'not a superset of', google: 'ei ylimÀÀrĂ€istĂ€') # fi: not common, source for Finnish: https://fi.wikibooks.org/wiki/Diskreetti_matematiikka/Joukko-oppi - - "⊆": # 0x2286 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is a', google translation) - - T: "osajoukko tai yhtĂ€ kuin" # (en: 'subset of or equal to', google: 'alajoukko tai yhtĂ€ suuri kuin') - - "⊇": # 0x2287 - - test: - if: "$Verbosity!='Terse'" - then: [T: "on"] # (en: 'is a', google translation) - - T: "ylijoukko tai yhtĂ€ kuin" # (en: 'superset of or equal to', google: 'superset tai yhtĂ€ suuri kuin') - - # --- restored short definitions that differ from unicode-full --- - - "―": [T: "vaakaviiva"] # 0x2015 (en: 'horizontal bar', google: 'vaakasuora viiva') - - "â€Č": [T: "pilkku"] # 0x2032 (en: 'prime', google: 'ensisijainen') - - "″": [T: "pilkku pilkku"] # 0x2033 (en: 'double prime', google: 'kaksinkertainen prime') - - "‮": [T: "pilkku pilkku pilkku"] # 0x2034 (en: 'triple prime', google: 'kolminkertainen') - - "â„Ș": [T: "astetta kelviniĂ€"] # 0x212a (en: 'kelvin', google: 'kelvin') - - "⇒": [T: "kaksiviivainen nuoli oikealle"] # 0x21d2 (en: 'rightwards double arrow', google: 'oikealla kaksinkertaisella nuolella') - - "∀": [T: "kaikille"] # 0x2200 (en: 'for all') - - "∘": [T: "yhdistetty"] # 0x2218 (en: 'composed with', google: 'koostuu') #fi: is this composite function? - - "∧": [T: "looginen ja"] # 0x2227 (en: 'and', google: 'ja') # should there be logic for "logical and" and "logical or"? - - "√": [T: "looginen tai"] # 0x2228 (en: 'or', google: 'tai') - - "âˆȘ": [T: "yhdiste"] # 0x222a (en: 'union', google: 'liitto') - - "∟": [T: "suljettu polkuintegraali"] # 0x222e (en: 'contour integral', google: 'muoto -integraali') - - "∷": [T: "kuten"] # 0x2237 (en: 'as', google: 'kuten') - - "∌": [T: "jakautunut"] # 0x223c (en: 'varies with', google: 'vaihtelee') - - "∜": [T: "kÀÀnnetty tilde"] # 0x223d (en: 'reversed tilde', google: 'kÀÀntynyt tilde') - - "∿": [T: "sinikĂ€yrĂ€"] # 0x223f (en: 'sine wave', google: 'siniaalto') - - "≩": [T: "pienempi tai yhtĂ€ suuri kuin"] # 0x2266 (en: 'less than over equal to', google: 'vĂ€hemmĂ€n kuin yli yhtĂ€ suuri kuin') # based on https://jkorpela.fi/merkkien-nimet.html#, the meaning is the same as with =< - - "≧": [T: "suurempi tai yhtĂ€ suuri kuin"] # 0x2267 (en: 'greater than over equal to', google: 'suurempi kuin yli yhtĂ€ suuri kuin') +--- + - "a-z": + - test: + if: "$TTS='none'" + then: [T: "."] # (en: '.', google translation) + else: [SPELL: "'.'"] # Meaning? + + # Capital letters are a little tricky: users can pick their favorite word (something that was requested) and + # screen readers have options to use pitch changes or beeps instead of or in addition to say "cap" + # Also, if a user can see the screen, they probably don't need to hear "cap", but if they specified an override, they must want to hear the override. + + - "A-Z": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "iso"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + # note: processing of ranges converts '.' into the character, so it needs to be in quotes below + # note: is there a need for Å/Ä/Ö here? + replace: [SPELL: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"] + + - "0-9": [T: "."] # (en: '.', google: 'A') + + - "!": # 0x21 + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':structure:')]" + then_test: + if: "$Verbosity = 'Terse'" + then: [T: "huuto"] # 0x21 (en: 'bang', google translation) + else: [T: "huutomerkki"] # 0x21 (en: 'exclamation point', google: 'huutomerkki'); might be obsolete + else: [T: "kertoma"] # 0x21 (en: 'factorial', google: 'tekijĂ€') + + - "\"": [T: "lainaus"] # 0x22 (en: 'quotation mark', google: 'lainausmerkki'); could also be "sitaatti" + - "#": [T: "numero"] # 0x23 (en: 'number', google: 'mÀÀrĂ€'); could also be "ruutu" but "ristikkomerkki" is more clear + - "$": [T: "dollaria"] # 0x24 (en: 'dollars', google: 'dollarit') + - "%": [T: "prosenttia"] # 0x25 (en: 'percent') + - "&": [T: "et-merkki"] # 0x26 (en: 'ampersand', google: 'ampersand') + - "'": [T: "heittomerkki"] # 0x27 (en: 'apostrophe') + - "(": # 0x28 + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then_test: + if: "$Verbosity='Terse'" + then: [T: "auki"] # 0x28 (en: 'open', google translation) + else: [T: "auki sulku"] # 0x28 (en: 'open paren', google: 'avoin sulku') + else: [T: "vasen sulku"] # 0x28 (en: 'left paren', google: 'vasen sulku') + - ")": # 0x29 + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then_test: + if: "$Verbosity='Terse'" + then: [T: "kiinni"] # 0x29 (en: 'close', google translation) + else: [T: "kiinni sulku"] # 0x29 (en: 'close paren', google: 'sulje sulku') + else: [T: "oikea sulku"] # 0x29 (en: 'right paren', google: 'oikea sulku') + + - "*": # 0x2a + test: + if: "parent::*[name(.)='msup' or name(.)='msubsup' or name(.)='skip-super']" + then: [T: "tĂ€hti"] # 0x2a (en: 'star', google translation) + else: [T: "kertaa"] # 0x2a (en: 'times', google: 'ajat') + - "+": [T: "plus"] # 0x2b + - ",": # 0x2c + # the following deals with the interaction of "," with "
" which sometimes wants the ',' to be silent + # that this test is here and not with "
" is not ideal, but seems simplest + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or " + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak "comma" when not adjacent to '
' + - "( following-sibling::*[1][text()!= '
'] and preceding-sibling::*[1][text()!='
'] ) or " + # except if expression starts with '
' + - "../*[1][.='
'] " + then: + - T: "pilkku" # (en: 'comma', google translation) + - test: + if: "$Verbosity != Terse" + then: [pause: short] + # else silent + + - "-": [T: "miinus"] # 0x2d (en: 'minus') + - ".": # 0x2e + - test: + if: "parent::*[1][self::m:mn]" + then: [T: "piste"] # (en: 'point', google translation) + else: [T: "piste"] # (en: 'dot'); possibly obsolete if-else + - "/": [T: "jaettuna"] # 0x2f (en: 'divided by', google: 'jaettuna') + - ":": [T: "kaksoispiste"] # 0x3a (en: 'colon') + - ";": [T: "puolipiste"] # 0x3b (en: 'semicolon') + - "<": # 0x3c + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "pienempi kuin" # (en: 'less than', google: 'vĂ€hemmĂ€n kuin') + - "=": # 0x3d + - test: + if: "$Verbosity!='Terse'" + then: [T: "on yhtĂ€ suuri kuin"] # (en: 'is equal to', google translation) + else: [T: "on"] # (en: 'equals', google: 'yhtĂ€ suuri') + + - ">": # 0x3e + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "suurempi kuin" # (en: 'greater than', google: 'suurempi kuin') + - "?": [T: "kysymysmerkki"] # 0x3f (en: 'question mark') + - "@": [T: "Ă€t-merkki"] # 0x40 (en: 'at sign', google: 'kylttiĂ€') + - "[": # 0x5b + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "auki hakasulku"] # (en: 'open bracket', google translation) + else: [T: "vasen hakasulku"] # (en: 'left bracket', google: 'vasen kiinnike') + - "\\": [T: "kenoviiva"] # 0x5c (en: 'back slash', google: 'takaviiva') + - "]": # 0x5d + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "kiinni hakasulku"] # (en: 'close bracket', google translation) + else: [T: "oikea hakasulku"] # (en: 'right bracket', google: 'oikea kiinnike') + - "^": [T: "hattu"] # 0x5e (en: 'hat', google: 'hattu') + - "_": [T: "alaviiva"] # 0x5f (en: 'under bar', google: 'baarin alla') + - "`": [T: "gravis"] # 0x60 (en: 'grave', google: 'hauta') # FI: not sure + - "{": # 0x7b + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "auki aaltosulku"] # (en: 'open brace', google translation) + else: [T: "vasen aaltosulku"] # (en: 'left brace', google: 'vasen ahdin') + - "|": # 0x7c + # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' + - with: + variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) + replace: + - test: + - if: "$SpeechStyle != 'ClearSpeak'" + then_test: + - if: "$DefaultToGiven" + then: [T: "ehdolla"] + - else_if: "preceding-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))] and + following-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))]" + then: [T: "jakaa"] + else: [T: "pystysuora viiva"] + - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" + then: [T: "pystysuora viiva"] + - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" + then: [T: "siten ettĂ€"] + - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" + then: [T: "ehdolla"] + - else: [T: "jakaa"] + + - "}": # 0x7d + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "kiinni aaltosulku"] # (en: 'close brace', google translation) + else: [T: "oikea aaltosulku"] # (en: 'right brace', google: 'oikea ahdin') + + - "~": [T: "tilde"] # 0x7e + - " ": # 0xa0 + - test: + if: "@data-empty-in-2D and ../../../../*[name(.)!='system-of-equations']" + then: [T: "tyhjĂ€"] # want to say something for fraction (etc) with empty child (en: 'empty', google translation) + else: [T: ""] + + - "ÂŹ": [T: "ei"] # 0xac (en: 'not', google: 'ei') # Terse logic? + - "°": [T: "astetta"] # 0xb0 (en: 'degrees', google: 'asteet') + - "±": [T: "plus-miinus"] # 0xb1 (en: 'plus or minus', google: 'plus tai miinus') + - "ÂŽ": [T: "akuutti"] # 0xb4 (en: 'acute') + - "·": # 0xB7 + - test: + if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolDot = 'Auto'" + then: [T: "kertaa"] # (en: 'times', google translation) + else: [T: "piste"] # (en: 'dot', google: 'piste') + - "×": # 0xd7 + - test: + if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolX = 'Auto'" + then: [T: "kertaa"] # (en: 'times', google translation) + else_test: + if: $ClearSpeak_MultSymbolX = 'By' + then: [T: "kertaa"] # (en: 2 'by' 2 matrice) fi: (2 kertaa 2 matriisi) translator's note + else: [T: "risti"] # (en: 'cross', google: 'ylittÀÀ') + - "Ă·": [T: "jaettuna"] # 0xf7 (en: 'divided by') + - "̀": [T: "gravis korostus"] # 0x300 (en: 'grave accent embellishment', google: 'vakava korostuskoriste') + - "́": [T: "akuutti korostus"] # 0x301 (en: 'acute accent embellishment', google: 'akuutti korostuskoriste') + - "̂": [T: "sirkumfleksi korostus"] # 0x302 (en: 'circumflex accent embellishment', google: 'ympyrĂ€korotuskoriste') + - "̃": [T: "tilde"] # 0x303 (en: 'tilde embellishment', google: 'tilde -koriste') + - "̄": [T: "pituusmerkki"] # 0x304 (en: 'macron embellishment', google: 'macronin koriste') + - "̅": [T: "ylĂ€viiva"] # 0x305 (en: 'overbar embellishment', google: 'ylipalkin koriste') + - "̆": [T: "lyhyysmerkki"] # 0x306 (en: 'breve', google: 'breve') + - "̇": [T: "piste"] # 0x307 (en: 'dot above embellishment', google: 'piste koristelun ylĂ€puolella') + + # Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong + - "Α-Ω": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "iso"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + # note: processing of ranges converts '.' into the character, so it needs to be in quotes below + replace: [SPELL: "translate('.', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')"] + + - "α": [T: "alfa"] # 0x3b1 (en: 'alpha') + - "ÎČ": [T: "beeta"] # 0x3b2 (en: 'beta') + - "Îł": [T: "gamma"] # 0x3b3 + - "ÎŽ": [T: "delta"] # 0x3b4 + - "Δ": [T: "epsilon"] # 0x3b5 + - "ζ": [T: "zeeta"] # 0x3b6 (en: 'zeta', google: 'zeta') + - "η": [T: "eeta"] # 0x3b7 (en: 'eta', google: 'eta') + - "Ξ": [T: "theeta"] # 0x3b8 (en: 'theta', google: 'theta') + - "Îč": [T: "ioota"] # 0x3b9 (en: 'iota', google: 'iota') + - "Îș": [T: "kappa"] # 0x3ba + - "λ": [T: "lambda"] # 0x3bb + - "ÎŒ": [T: "myy"] # 0x3bc (en: 'mu', google: 'mu') + - "Μ": [T: "nyy"] # 0x3bd (en: 'nu', google: 'nu') + - "Ο": [T: "ksii"] # 0x3be (en: 'zai', google: 'zai') + - "Îż": [T: "omikron"] # 0x3bf (en: 'omicron', google: 'omicron') + - "π": [T: "pii"] # 0x3c0 (en: 'pi', google: 'pi') + - "ρ": [T: "rhoo"] # 0x3c1 (en: 'rho', google: 'rho') + - "ς": [T: "loppu-sigma"] # 0x3c2 (en: 'final sigma', google: 'viimeinen sigma') + - "σ": [T: "sigma"] # 0x3c3 + - "τ": [T: "tau"] # 0x3c4 + - "υ": [T: "ypsilon"] # 0x3c5 (en: 'upsilon', google: 'upsilon') + - "φ": [T: "fii"] # 0x3c6 (en: 'phi', google: 'phi') + - "χ": [T: "khii"] # 0x3c7 (en: 'chi', google: 'chi') + - "ψ": [T: "psii"] # 0x3c8 (en: 'psi', google: 'psi') + - "ω": [T: "oomega"] # 0x3c9 (en: 'omega', google: 'omega') + - "ϕ": [T: "suora fii"] # 0x3d5 (en: 'phi', google: 'phi') + - "ϖ": [T: "kreikkalainen pii"] # 0x3d6 (en: 'pi', google: 'pi') + - "Ï”": [T: "epsilon"] # 0x3f5 + - "϶": [T: "kÀÀnnetty epsilon"] # 0x3f6 (en: 'reversed epsilon', google: 'kÀÀntynyt epsilon') + + - "⁥": # 0x2061 + - test: + # skip saying "of" when Terse and a trig function, when it is a shape (does this happen?), or we are in :literal mode + # log is treated differently than trig functions + # Note: this differs from 'en' because the ClearSpeak and default rules are different from 'en' + if: "not( + ( $Verbosity='Terse' or ($SpeechStyle = 'ClearSpeak' and IsNode(following-sibling::*[1],'simple')) and + preceding-sibling::*[1][IfThenElse($SpeechStyle='ClearSpeak', + IsInDefinition(., 'ClearSpeakTrigFunctionNames'), + IsInDefinition(., 'TrigFunctionNames') )] + ) or + preceding-sibling::*[1][IsInDefinition(., 'GeometryShapes')] or + (@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) + )" + then: [T: "arvolla"] + - "⁹": [T: ""] # 0x2062 # invisible 'times', fi: should this have a value? + - "⁣": [T: ""] # 0x2063 # invisible 'separator', fi: should this have a value? + - "⁀": [T: "ja"] # 0x2064 (en: 'and', google translation) + - "ℂℕℚℝ℀": # here we rely on this running through the table again to speak "cap xxx" + - T: "kaksoisviivainen" # (en: 'double-struck', google: 'kaksinkertainen') # not satisfied + - SPELL: "translate('.', 'ℂℕℚℝ℀', 'CNQRZ')" + + - "℃": [T: "astetta celsiusta"] # 0x2103 (en: 'degrees celsius', google: 'celsius astetta') + - "ℋℛℓ": # 0x210b + - T: "skripti" # (en: 'script', google: 'kĂ€sikirjoitus') # not satisfied + - SPELL: "translate('.', 'ℋℛℓ', 'HRl')" + - "ℜ": # 0x211c + - T: "fraktuura iso r" # (en: 'fraktur', google: 'fraktur') + - SPELL: "'R'" + + - "ⅆⅇⅈⅉ": # 0x2146-9 + - T: "kaksoisviivainen kursiivi" # (en: 'double-struck italic', google: 'kaksinkertainen kursivoitu') + - SPELL: "translate('.', 'ⅆⅇⅈⅉ', 'deij')" + + - "∄": # 0x2225 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "yhdensuuntainen" # (en: 'parallel to', google: 'samansuuntainen') + - "∊": # 0x2226 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei ole yhdensuuntainen" # (en: 'not parallel to', google: 'ei rinnakkain') + - "≀": # 0x2264 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "pienempi tai yhtĂ€ suuri kuin" + - "≄": # 0x2265 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "suurempi tai yhtĂ€ suuri kuin" # (en: 'greater than or equal to', google: 'suurempi tai yhtĂ€ suuri kuin') + + # --- restored complex short definitions (prefer over unicode-full) --- + - "
": # 0x2026 + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak '
' as 'and so on...' unless expr starts with '
' + - "../*[1][.='
']" + then: [T: "piste piste piste"] # (google translation) + else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' + if: "count(following-sibling::*) = 0" + then: [T: "ja niin edelleen"] # (en: 'and so on', google translation) + else: [T: "ja niin edelleen kunnes"] # (en: 'and so on up to', google: 'ja niin edelleen'); possibly obsolete if-else + - "→": # 0x2192 + - test: + if: "ancestor::*[2][self::m:limit]" + then: [T: "lĂ€hestyy"] # (en: 'approaches', google translation) + else: [T: "nuoli oikealle"] # (en: 'right arrow', google: 'oikea nuoli') + - "∂": # 0x2202 + - test: + if: "$Verbosity='Terse'" + then: [T: "osittaisderivaatta"] # (en: 'partial', google translation) # might be other possibilities + else: [T: "osittaisderivaatta"] # (en: 'partial derivative', google: 'osittainen johdannainen') + - "∆": # 0x2206 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (google translation) + - T: "Laplacen operaattori" # (en: 'laplacian of', google: 'laplacian of') + - "∈": # 0x2208 # fi: some elements (pun) of this translation has to be tested + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: [T: "kuuluu"] # (en: 'an element of', google translation) + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "kuuluu"] # (en: 'in', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "kuuluu"] # (en: 'member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "kuuluu"] # (en: 'element of', google translation) + - else: [T: "kuuluu joukkoon"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to', google: 'kuulua') + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "kuuluu"] # (en: 'is a member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "kuuluu"] # (en: 'is an element of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "kuuluu"] # (en: 'is in', google translation) + - else: [T: "kuuluu joukkoon"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to', google: 'kuuluu') + - "∉": # 0x2209 # fi: some elements (pun) of this translation has to be tested + # rule is identical to 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: [T: "ei kuulu"] # (en: 'is not an element of', google translation) + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "ei kuulu"] # (en: 'not in', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "ei kuulu"] # (en: 'not member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "ei kuulu"] # (en: 'not element of', google translation) + - else: [T: "ei kuulu joukkoon"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'not belonging to', google: 'ei kuulu') + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "ei kuulu"] # (en: 'is not a member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "ei kuulu"] # (en: 'is not an element of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "ei ole joukossa"] # (en: 'is not in', google translation) + - else: [T: "ei kuulu joukkoon"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'does not belong to', google: 'ei kuulu') + - "∊": # 0x220a # fi: some elements (pun) of this translation has to be tested + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: [T: "kuuluu"] # (en: 'is an element of', google translation) + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "kuuluu"] # (en: 'in', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "kuuluu"] # (en: 'member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "kuuluu"] # (en: 'element of', google translation) + - else: [T: "kuuluu joukkoon"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to', google: 'kuulua') + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "kuuluu"] # (en: 'is a member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "kuuluu"] # (en: 'is an element of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "kuuluu"] # (en: 'is in', google translation) + - else: [T: "kuuluu joukkoon"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to', google: 'kuuluu') + - "√": # 0x221a + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (google translation) + - T: "neliöjuuri" # (en: 'square root of') + - "∝": # 0x221d + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "verrannollinen" # (en: 'proportional to', google: 'suhteessa') + - "∶": # 0x2236 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "suhde" # (en: 'to', google: 'to') + - "∟": # 0x223e + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "kÀÀnnetty kaatunut S-kirjain" # (en: 'most positive', google: 'positiivisin') # fi: no good translation + - "≠": # 0x2260 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei ole yhtĂ€ suuri kuin" # (en: 'not equal to', google: 'ei yhtĂ€ suuri kuin') + - "≡": # 0x2261 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is', google translation) + - T: "identtinen" # (en: 'identical to', google: 'yhtĂ€lĂ€inen') + - "⊂": # 0x2282 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is a', google translation) + - T: "osajoukko" # (en: 'subset of', google: 'alajoukko') + - "⊃": # 0x2283 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is a', google translation) + - T: "ylijoukko" # (en: 'superset of', google: 'superset of') # fi: not common, source for Finnish: https://fi.wikibooks.org/wiki/Diskreetti_matematiikka/Joukko-oppi + - "⊄": # 0x2284 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei ole osajoukko" # (en: 'not a subset of', google: 'ei osa') + - "⊅": # 0x2285 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', google translation) + - T: "ei ole ylijoukko" # (en: 'not a superset of', google: 'ei ylimÀÀrĂ€istĂ€') # fi: not common, source for Finnish: https://fi.wikibooks.org/wiki/Diskreetti_matematiikka/Joukko-oppi + - "⊆": # 0x2286 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is a', google translation) + - T: "osajoukko tai yhtĂ€ kuin" # (en: 'subset of or equal to', google: 'alajoukko tai yhtĂ€ suuri kuin') + - "⊇": # 0x2287 + - test: + if: "$Verbosity!='Terse'" + then: [T: "on"] # (en: 'is a', google translation) + - T: "ylijoukko tai yhtĂ€ kuin" # (en: 'superset of or equal to', google: 'superset tai yhtĂ€ suuri kuin') + + # --- restored short definitions that differ from unicode-full --- + - "―": [T: "vaakaviiva"] # 0x2015 (en: 'horizontal bar', google: 'vaakasuora viiva') + - "â€Č": [T: "pilkku"] # 0x2032 (en: 'prime', google: 'ensisijainen') + - "″": [T: "pilkku pilkku"] # 0x2033 (en: 'double prime', google: 'kaksinkertainen prime') + - "‮": [T: "pilkku pilkku pilkku"] # 0x2034 (en: 'triple prime', google: 'kolminkertainen') + - "â„Ș": [T: "astetta kelviniĂ€"] # 0x212a (en: 'kelvin', google: 'kelvin') + - "⇒": [T: "kaksiviivainen nuoli oikealle"] # 0x21d2 (en: 'rightwards double arrow', google: 'oikealla kaksinkertaisella nuolella') + - "∀": [T: "kaikille"] # 0x2200 (en: 'for all') + - "∘": [T: "yhdistetty"] # 0x2218 (en: 'composed with', google: 'koostuu') #fi: is this composite function? + - "∧": [T: "looginen ja"] # 0x2227 (en: 'and', google: 'ja') # should there be logic for "logical and" and "logical or"? + - "√": [T: "looginen tai"] # 0x2228 (en: 'or', google: 'tai') + - "âˆȘ": [T: "yhdiste"] # 0x222a (en: 'union', google: 'liitto') + - "∟": [T: "suljettu polkuintegraali"] # 0x222e (en: 'contour integral', google: 'muoto -integraali') + - "∷": [T: "kuten"] # 0x2237 (en: 'as', google: 'kuten') + - "∌": [T: "jakautunut"] # 0x223c (en: 'varies with', google: 'vaihtelee') + - "∜": [T: "kÀÀnnetty tilde"] # 0x223d (en: 'reversed tilde', google: 'kÀÀntynyt tilde') + - "∿": [T: "sinikĂ€yrĂ€"] # 0x223f (en: 'sine wave', google: 'siniaalto') + - "≩": [T: "pienempi tai yhtĂ€ suuri kuin"] # 0x2266 (en: 'less than over equal to', google: 'vĂ€hemmĂ€n kuin yli yhtĂ€ suuri kuin') # based on https://jkorpela.fi/merkkien-nimet.html#, the meaning is the same as with =< + - "≧": [T: "suurempi tai yhtĂ€ suuri kuin"] # 0x2267 (en: 'greater than over equal to', google: 'suurempi kuin yli yhtĂ€ suuri kuin') diff --git a/Rules/Languages/hu/ClearSpeak_Rules.yaml b/Rules/Languages/hu/ClearSpeak_Rules.yaml index 434034698..3e5df3c76 100644 --- a/Rules/Languages/hu/ClearSpeak_Rules.yaml +++ b/Rules/Languages/hu/ClearSpeak_Rules.yaml @@ -1,840 +1,840 @@ ---- -- name: pause - tag: "!*" - match: "not(self::m:math) and not($MatchingPause) and @data-intent-property[contains(., ':pause')]" - replace: - - with: - variables: [MatchingPause: "true()"] - replace: - - test: - - if: "contains(@data-intent-property, ':pause-long')" - then: [pause: long] - - else_if: "contains(@data-intent-property, ':pause-short')" - then: [pause: short] - else: [pause: medium] - - x: "." - -- name: intent-literal-silent - tag: [mi, mo, mn] - match: "contains(@data-intent-property, ':silent:')" - # say nothing - replace: [] - -# handling of negative numbers that come from 'intent' is hard -- we do something that is close to right here -- name: intent-literal-negative-number - tag: mn - match: "starts-with(text(), '-')" - replace: - - T: "mĂ­nusz" # phrase(10 'minus' 4 equals 6) - - x: "translate(text(), '-_', '')" - -- name: default - tag: square-root - match: "." - replace: - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # phrase('the' square root of 25) - - test: - if: "$ClearSpeak_Roots = 'PosNegSqRoot' or $ClearSpeak_Roots = 'PosNegSqRootEnd'" - then: - - bookmark: "*[1]/@id" - - test: - if: "parent::*[self::m:minus and count(*)=1]" - then: [T: "negatĂ­v"] # phrase(minus 4 is a 'negative' number) - else: [T: "pozitĂ­v"] # phrase(10 is a 'positive' number) - - T: "nĂ©gyzetgyök" # phrase(8 is the 'square root' of 64) - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # phrase(the square root 'of' 5) - magyarban nem kell kötƑszĂł - else: [pause: short] - - x: "*[1]" - - test: - - if: "$ClearSpeak_Roots = 'RootEnd' or $ClearSpeak_Roots = 'PosNegSqRootEnd'" - then: - - pause: short - - T: "gyök vĂ©ge" # phrase(the square root of x 'end root') - - pause: medium - - else_if: "IsNode(*[1], 'simple')" - then: [pause: short] - else: [pause: long] - -- name: default - tag: root - match: "." - replace: - - test: - if: "$Verbosity!='Terse'" - then: [T: "a"] # phrase(6 is 'the' square root of 36) - - test: - if: "$ClearSpeak_Roots = 'PosNegSqRoot' or $ClearSpeak_Roots = 'PosNegSqRootEnd'" - then: - - test: - if: "parent::*[(self::m:minus or self::m:plus) and count(*)=1]" - then: [bookmark: "parent/@id"] - - test: - if: "parent::m:minus" - then: [T: "negatĂ­v"] # phrase(minus 6 is a 'negative' number) - else: [T: "pozitĂ­v"] # phrase(10 is a 'positive' number) - - test: - if: "*[2][self::m:mn and not(contains(., '.'))]" - then_test: - - if: "*[2][.='2']" - then: [T: "nĂ©gyzetgyök"] # phrase(5 is the 'square root' of 25) - - else_if: "*[2][.='3']" - then: [T: "köbgyök"] # phrase(5 is the 'cube root' of 625) - - else: [x: "ToOrdinal(*[2])", T: "gyök"] # phrase(the square 'root' of 25) - else: - - test: - if: "*[2][self::m:mi][string-length(.)=1]" - then: - - x: "*[2]" - - pronounce: [text: "-edik", ipa: "ɛdik", sapi5: "edik", eloquence: "edik"] - else: [x: "*[2]"] - - T: "gyök" # phrase(the square 'root' of 36) - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # phrase(the square root 'of' 36) - - x: "*[1]" - - test: - if: "$ClearSpeak_Roots = 'RootEnd' or $ClearSpeak_Roots = 'PosNegSqRootEnd'" - then: - - pause: short - - T: "gyök vĂ©ge" # phrase(start the fifth root of x 'end root') - - pause: medium - else_test: - if: "IsNode(*[1], 'simple')" - then: [pause: short] - else: [pause: long] - -# The 'negative' rule interacts with the msqrt/mroot rules as those might pick off this case ("the negative square root of x") -- name: negative_and_positive - tag: [plus, minus] - match: "count(*)=1 and contains(@data-intent-property, ':prefix:')" - replace: - - test: - if: - - "*[1][self::m:square-root or self::m:root] and" - - "($ClearSpeak_Roots = 'PosNegSqRoot' or $ClearSpeak_Roots = 'PosNegSqRootEnd')" - then: [T: ""] - else: - - bookmark: "@id" - - test: - if: "self::m:minus" - then: [T: "negatĂ­v"] # phrase(minus 5 is a 'negative' number) - else: [T: "pozitĂ­v"] # phrase(7 is a 'positive' number) - - x: "*[1]" - -# Fraction rules -# Mixed numbers mostly "just work" because the invisible char reads as "and" and other parts read properly on their own - -# Units (e.g., meters per second) -- name: per-fraction - tag: fraction - match: - - "$ClearSpeak_Fractions='Per' or" - - "(BaseNode(*[1])[contains(@data-intent-property, ':unit') or" - - " ( self::m:mrow and count(*)=3 and" # maybe a bit paranoid checking the structure... - - " *[1][self::m:mn] and *[2][.='\u2062'] and BaseNode(*[3])[contains(@data-intent-property, ':unit')] ) ] and" - - " BaseNode(*[2])[contains(@data-intent-property, ':unit')] )" - replace: - - x: "*[1]" - - T: "per" # phrase('5 meters 'per' second) - - x: "*[2]" - -- name: common-fraction - tag: fraction - match: - - "($ClearSpeak_Fractions='Auto' or $ClearSpeak_Fractions='Ordinal' or $ClearSpeak_Fractions='EndFrac') and" - - "*[1][self::m:mn][not(contains(., $DecimalSeparators)) and ($ClearSpeak_Fractions='Ordinal' or text()<20)] and" - - "*[2][self::m:mn][not(contains(., $DecimalSeparators)) and ($ClearSpeak_Fractions='Ordinal' or (2<= text() and text()<=10))]" - variables: [IsPlural: "*[1]!=1"] - replace: - - x: "*[1]" - - x: "ToOrdinal(*[2], true(), $IsPlural)" # extra args specify fractional ordinal and whether it is plural - -- 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: - - test: - if: "$Verbosity!='Terse'" - then: [OT: "a"] - - T: "tört" # phrase(the 'fraction' with 3 over 4) - - x: "*[1]" - - T: "per" # phrase(the fraction 3 'over' 4) - magyarban a "per" a leggyakoribb - - 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: "tört vĂ©ge" # phrase(7 over 8 'end fraction') - - pause: short - -- # fraction with text or numbers followed by text in both numerator and denominator - 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 " # fractions with text - - " (*[1][self::m:mrow][count(*)=3][ " - - " *[1][self::m:mn] and " - - " *[2][self::m:mo][.='⁹'] and " # invisible times - - " *[3][self::m:mi or self::m:mtext][string-length(.)>1] ]) ) and" - - " ((*[2][self::m:mi or self::m:mtext][string-length(.)>1]) or " # fractions with text - - " (*[2][self::m:mrow][count(*)=3][ " - - " *[1][self::m:mn] and " - - " *[2][self::m:mo][.='⁹'] and " # invisible times - - " *[3][self::m:mi or self::m:mtext][string-length(.)>1] ]) )" - - ")" - replace: - - x: "*[1]" - - T: "per" # phrase(the fraction 3 'over' 4) - - x: "*[2]" - - test: - if: "$ClearSpeak_Fractions='EndFrac' or $ClearSpeak_Fractions='OverEndFrac'" - then: - - pause: short - - T: "tört vĂ©ge" # phrase(7 over 8 'end fraction') - - pause: short - -- name: default - tag: fraction - match: "." - replace: - - OT: "a" # phrase(5 is 'the' square toot of 25) - - T: "tört, melynek szĂĄmlĂĄlĂłja" # phrase(the 'fraction with numerator' 6) - - test: - if: "not(IsNode(*[1], 'simple'))" - then: [pause: medium] - - x: "*[1]" - - pause: medium - - T: "nevezƑje pedig" # phrase(the fraction with numerator 5 'and denominator' 8) - - x: "*[2]" - - pause: long - - test: - if: "$ClearSpeak_Fractions='EndFrac' or $ClearSpeak_Fractions='GeneralEndFrac'" - then: - - pause: short - - T: "tört vĂ©ge" # phrase(the fraction with 3 over 4 'end fraction') - - pause: short - -# rules for functions raised to a power -# these could have been written on 'mrow' but putting them on msup seems more specific -# to see if it is a function, we look right to see if the following sibling is apply-function -- name: ClearSpeak-function-inverse - tag: inverse-function - match: "." - replace: - - test: - if: "$ClearSpeak_Trig = 'TrigInverse'" - then: [x: "*[1]", bookmark: "*[2]/@id", T: "inverz"] # phrase(8 over 5 is the 'inverse' of 5 over 8) - else_test: - if: "$ClearSpeak_Trig = 'ArcTrig'" - then: [bookmark: "*[2]/@id", T: "arkusz", x: "*[1]"] # phrase(the 'arc' of a circle) - else: [bookmark: "*[2]/@id", T: "inverz", x: "*[1]"] # default/Auto # phrase(8 over 5 is the 'inverse' of 5 over 8) - -# Handles functions squared or cubed, where the base is not a trig function. -- name: function-squared-or-cubed # audit-ignore - tag: power - match: - - "*[2][self::m:mn][.='2' or .='3'] and" # the exponent is 2 or 3 - - "following-sibling::*[1][self::m:mo][.='⁥']" #invisible function apply - replace: - - x: "*[1]" # say the trig function name - - bookmark: "*[2]/@id" - - test: - if: "not(IsInDefinition(*[1], 'TrigFunctionNames')) and *[2][.='2']" # the base is not a trig function - then: [T: "a nĂ©gyzeten"] # say "squared" - else_test: - if: "not(IsInDefinition(*[1], 'TrigFunctionNames'))" # the base is not a trig function - then: [T: "a köbön"] # say "cubed" - else: [T: ""] - -# Handles trig functions with simple arguments (mi or mn), for both 2, 3 and general exponents. -- name: trig-power-argument-before-exponent-general # audit-ignore - tag: [mi, mn] - match: - - "preceding-sibling::*[1][self::m:mo][.='⁥'] and" - - "preceding-sibling::*[2][self::m:power[IsInDefinition(*[1], 'TrigFunctionNames')]]" # if the previous sibling is function-apply and previous previous sibling is trig power - replace: - - test: - - if: "preceding-sibling::*[2]/*[2][self::m:mn][.='2']" # if the exponent is 2 - then: - - x: "text()" # say the argument of the trig function - - T: "a nĂ©gyzeten" - - else_if: "preceding-sibling::*[2]/*[2][self::m:mn][.='3']" # if the exponent is 3 - then: - - x: "text()" # say the argument of the trig function - - T: "a köbön" - else: - - pause: short - - x: "text()" # say the argument of the function - - pause: short - - T: "a(z)" - - test: - if: "preceding-sibling::*[2]/*[2][self::m:mn][not(contains(., '.'))]" # if the exponent is an integer - then: [x: "ToOrdinal(preceding-sibling::*[2]/*[2])"] # say the ordinal form - else: [x: "preceding-sibling::*[2]/*[2]"] # else, say the exponent - - T: "hatvĂĄnyon" - -# Handles trig functions with grouped arguments (parenthesized or bracketed mrow), for both 2, 3 and general exponents. -- name: trig-power-grouped-argument-before-exponent-general # audit-ignore - tag: [mo, mrow] - match: - - "(self::m:mo[.=')'] and preceding-sibling::*[2][self::m:mo][.='⁥'] and preceding-sibling::*[3][self::m:power[IsInDefinition(*[1], 'TrigFunctionNames')]])" - - "or" - - "(self::m:mrow[IsBracketed(., '(', ')')] and preceding-sibling::*[1][self::m:mo][.='⁥'] and preceding-sibling::*[2][self::m:power[IsInDefinition(*[1], 'TrigFunctionNames')]])" - replace: - - test: - if: "self::m:mo" # if the current node is ) - then: - - x: "text()" # say the argument of the function - - test: - - if: "preceding-sibling::*[3]/*[2][self::m:mn][.='2']" # if the exponent is 2 - then: [T: "a nĂ©gyzeten"] - - else_if: "preceding-sibling::*[3]/*[2][self::m:mn][.='3']" # if the exponent is 3 - then: [T: "a köbön"] - else: - - T: "a(z)" - - test: - if: "preceding-sibling::*[3]/*[2][self::m:mn][not(contains(., '.'))]" # if the exponent is an integer - then: [x: "ToOrdinal(preceding-sibling::*[3]/*[2])"] # say the ordinal form - else: [x: "preceding-sibling::*[3]/*[2]"] # else, say the exponent - - T: "hatvĂĄnyon" - else: # if the current node is an with parentheses - - x: "*[1]" - - x: "*[2]" - - x: "*[3]" - - test: - - if: "preceding-sibling::*[2]/*[2][self::m:mn][.='2']" # if the exponent is 2 - then: [T: "a nĂ©gyzeten"] - - else_if: "preceding-sibling::*[2]/*[2][self::m:mn][.='3']" # if the exponent is 3 - then: [T: "a köbön"] - else: - - T: "a(z)" - - test: - if: "preceding-sibling::*[2]/*[2][self::m:mn][not(contains(., '.'))]" # if the exponent is an integer - then: [x: "ToOrdinal(preceding-sibling::*[2]/*[2])"] # say the ordinal form - else: [x: "preceding-sibling::*[2]/*[2]"] # else, say the exponent - - T: "hatvĂĄnyon" - -- name: function-power # audit-ignore - tag: power - match: - - "following-sibling::*[1][self::m:mo][.='⁥'] and" #invisible function apply - - "not(*[1][IsInDefinition(., 'TrigFunctionNames')])" - replace: - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # phrase('the' third power of 2) - - bookmark: "*[2]/@id" - - test: - if: "*[2][self::m:mn][not(contains(., '.'))]" - then: [x: "ToOrdinal(*[2])"] - else: [x: "*[2]"] - - T: "hatvĂĄnyon" # phrase(the third 'power of' 6) - - pause: short - - x: "*[1]" - -# Handles trig function powers (non-2/3) at the base node so generic power rules do not speak the base/exponent too early. -- name: trig-function-power-base-only # audit-ignore - tag: power - match: - - "following-sibling::*[1][self::m:mo][.='⁥'] and" - - "*[1][IsInDefinition(., 'TrigFunctionNames')] and" - - "not(*[2][self::m:mn][.='2' or .='3'])" - replace: - - x: "*[1]" - -- name: AfterPower-nested - tag: power - match: # directly a superscript or an mrow that contains a superscript - - "$ClearSpeak_Exponents = 'AfterPower' and" - - "*[2][self::m:power or self::m:power or self::m:mrow[m:power]]" - replace: - - x: "*[1]" - - T: "a következƑ kitevƑre emelve:" # phrase(5 'raised to the exponent' x plus 1) - - pause: short - - x: "*[2]" - - pause: short - - T: "kitevƑ vĂ©ge" # phrase(5 raised to the exponent x plus 1 'end exponent') - -- name: AfterPower-default - tag: power - match: "$ClearSpeak_Exponents = 'AfterPower'" - replace: - - x: "*[1]" - - T: "a következƑ hatvĂĄnyra emelve:" # phrase(x is 'raised to the power' 4) - - x: "*[2]" - - pause: short - -- name: squared - tag: power - match: "*[2][self::m:mn][.='2'] and $ClearSpeak_Exponents = 'Auto'" - replace: - - x: "*[1]" - - bookmark: "*[2]/@id" - - T: "a nĂ©gyzeten" # phrase(7 'squared' equals 49) - -- name: cubed - tag: power - match: "*[2][self::m:mn][.='3'] and $ClearSpeak_Exponents = 'Auto'" - replace: - - x: "*[1]" - - bookmark: "*[2]/@id" - - T: "a köbön" # phrase(5 'cubed' equals 125) - -- name: simple-integer # audit-ignore - tag: power - match: "*[2][self::m:mn][not(contains(., '.'))]" - replace: - - x: "*[1]" - - T: "a(z)" # phrase(2 raised 'to the' power 7) - - test: - if: "*[2][.>=0]" - then: [x: "ToOrdinal(*[2])"] - else: [x: "*[2]"] - - T: "hatvĂĄnyon" - -- name: simple-negative-integer # audit-ignore - tag: power - match: - - "*[2][self::m:minus and count(*)=1 and " - - " *[1][self::m:mn][not(contains(., '.'))]" - - " ]" - replace: - - x: "*[1]" - - T: "a" # phrase(2 raised 'to the' power 7) - - x: "*[2]" - - T: "hatvĂĄnyon" - -- name: simple-var # audit-ignore - tag: power - match: "*[2][self::m:mi][string-length(.)=1]" - replace: - - x: "*[1]" - - T: "a(z)" # phrase(3 raised 'to the' power 7) - - x: "*[2]" - - pronounce: [text: "-edik", ipa: "ɛdik", sapi5: "edik", eloquence: "edik"] - - T: "hatvĂĄnyon" - -# match nested exponent, where the nested exponent is has the power 2 or 3 (n below) -# [xxx]^n, - [xxx]^n, [xxx] var^n, -[xxx] var^n -# where xxx is a number or common fraction (or a var in the first two forms) -# short of creating a specialized built-in function, I don't see a way to eliminate a lot of repetition in the matches -# also really bad is that the test of a common fraction is replicated here (four times!) -# Note: the ClearSpeak doc doesn't say these only apply when the pref is "Auto", -# but the test cases all fall back to "raised to the exponent" when not "Auto" -# If these are allowed for non-Auto values, then you end up with "...power power...". -- # [xxx]^n - name: nested-squared-or-cubed - tag: power - match: - - "$ClearSpeak_Exponents = 'Auto' and" - - "*[2][self::m:power][" - - " *[2][self::m:mn][.='2' or .='3'] and " # exp is 2 or 3 - # base is mn, mi, common fraction ([xxx] case) - - " *[1][self::m:mn or self::m:mi or " - - " self::m:fraction[*[1][self::m:mn][not(contains(., '.')) and text()<20] and" - - " *[2][self::m:mn][not(contains(., '.')) and 2<= text() and text()<=10]]" - - " ]" - - " ]" - replace: - - x: "*[1]" - - T: "emelve a(z)" # phrase(x 'raised to the' second power) - - x: "*[2]" - - T: "hatvĂĄnyra" # phrase(x raised to the second 'power') - -- # - [xxx]^n - name: nested-negative-squared-or-cubed - tag: power - match: - - "$ClearSpeak_Exponents = 'Auto' and" - - " *[2][self::m:minus and count(*)=1 and " - - " *[1]/*[1][self::m:power][" - - " *[2][self::m:mn][.='2' or .='3'] and " # exp is 2 or 3" - # base is mn, mi, common fraction ([xxx] case) - - " *[1][self::m:mn or self::m:mi or " - - " self::m:fraction[*[1][self::m:mn][not(contains(., '.')) and text()<20] and" - - " *[2][self::m:mn][not(contains(., '.')) and 2<= text() and text()<=10]]" - - " ]" - - " ]" - - " ]" - replace: - - x: "*[1]" - - T: "emelve a(z)" # phrase(x 'raised to the' second power) - - x: "*[2]" - - T: "hatvĂĄnyra" # phrase(x raised to the second 'power') - -- # [xxx] var^n - name: nested-var-squared-or-cubed - tag: power - match: - - "$ClearSpeak_Exponents = 'Auto' and" - - " *[2][self::m:mrow][count(*)=3][ " - - " *[3][self::m:power][" - - " *[2][self::m:mn][.='2' or .='3'] and " # exp is 2 or 3 - - " *[1][self::m:mi]" - - " ] and " - - " *[2][self::m:mo][.='⁹'] and " # invisible times - # base is mn, or common fraction ([xxx] case) - - " *[1][self::m:mn or " - - " self::m:fraction[*[1][self::m:mn][not(contains(., '.')) and text()<20] and" - - " *[2][self::m:mn][not(contains(., '.')) and 2<= text() and text()<=10]]" - - " ]" - - " ]" - replace: - - x: "*[1]" - - T: "emelve a(z)" # phrase(x 'raised to the' second power) - - x: "*[2]" - - T: "hatvĂĄnyra" # phrase(x raised to the second 'power') - -- # -[xxx] var^n - name: nested-negative-var-squared-or-cubed - tag: power - match: - - "$ClearSpeak_Exponents = 'Auto' and" - - " *[2][self::m:mrow][count(*)=3][ " - - " *[3][self::m:power][" - - " *[2][self::m:mn][.='2' or .='3'] and " # exp is 2 or 3 - - " *[1][self::m:mi]" - - " ] and " - - " *[2][self::m:mo][.='⁹'] and " # invisible times - - " *[1][self::m:minus and count(*)=1 and " - # base is mn, or common fraction ([xxx] case) - - " *[1][self::m:mn or " - - " self::m:fraction[*[1][self::m:mn][not(contains(., '.')) and text()<20] and" - - " *[2][self::m:mn][not(contains(., '.')) and 2<= text() and text()<=10]]" - - " ]" - - " ]" - - " ]" - replace: - - x: "*[1]" - - T: "emelve a" # phrase(x 'raised to the' second power) - - x: "*[2]" - - T: "hatvĂĄnyra" # phrase(x raised to the second 'power') - -- name: default-exponent-power - tag: power - match: # directly a superscript or an mrow that contains a superscript - - "*[2][self::m:power or self::m:power or self::m:mrow[m:power]]" - replace: - - x: "*[1]" - - T: "emelve a következƑ kitevƑre:" # phrase(x is 'raised to the exponent') - - pause: short - - x: "*[2]" - - pause: short - - T: "kitevƑ vĂ©ge" # phrase(and now 'end exponent' has been reached) - -- name: default - tag: power - match: "." - replace: - - x: "*[1]" - - T: "a(z)" # phrase(x 'raised to the' second power) - - x: "*[2]" - - T: "hatvĂĄnyon" # phrase(x raised to the second 'power') - -# -# Some rules on mrows -# -- # the inference rules lump absolute value and cardinality together, so those rules are implemented here - name: ClearSpeak-absolute-value - tag: absolute-value - match: "." - variables: [WordToSay: "IfThenElse($ClearSpeak_AbsoluteValue = 'Cardinality', 'szĂĄmossĂĄga', 'abszolĂșt Ă©rtĂ©ke')"] - replace: - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # phrase('the' absolute value of 25) - - x: "*[1]" - - x: "$WordToSay" - - test: - if: "$ClearSpeak_AbsoluteValue = 'AbsEnd'" - then: - - pause: short - - T: "vĂ©ge az" # phrase('end' absolute value) - - T: "abszolĂșt Ă©rtĂ©knek" - - pause: short - -- name: set - tag: set - # Empty set and braced/{set-builder} forms (typically 0–1 child). - # Multi-arg intent set($x,$y,...) and set($x) with @arg fall through to function-intent - # ("the set of 
"). - match: "count(*)=0 or (count(*)=1 and not(*[1][@arg]))" - replace: - - test: - - if: "count(*)=0" - then: [T: "az ĂŒres halmaz"] # phrase('the empty set') - - else_if: "count(*[1]/*)=3 and *[1]/*[2][self::m:mo][.=':' or .='|' or .='∣']" - then: - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # phrase('the' empty set) - - T: "" # phrase(the 'empty set') - - test: - if: "$ClearSpeak_Sets != 'woAll'" - then: [T: "minden"] # phrase(the set of 'all' integers) - - x: "*[1]/*[1]" - - T: "melyekre teljesĂŒl, hogy" # phrase(the set S 'such that' x is less than y) - - x: "*[1]/*[3]" - else: - - test: - if: "$ClearSpeak_Sets != 'SilentBracket'" - then: - - test: - if: "$Verbosity!='Terse'" - then: [T: "a"] # phrase('the' set of integers) - - T: "halmaz" # phrase(this is a 'set' of integers) - - x: "*[1]" - -- # intervals are controlled by a ClearSpeak Preference -- parens/brackets don't have to match, so we avoid IsBracketed - # alternatively, we could have four (or ten) rules, but there is a lot of duplication if we do that - # this one rule handles all ten cases listed as part $ClearSpeak_Paren = 'Interval' - # note that *[2] is an mrow with X, ",", Y, so getting X or Y is a double index - name: ClearSpeak-intervals # audit-ignore # avoid overriding with default "intervals" name - variables: - - is_intervals_start_infinity: "*[1][self::m:minus and count(*)=1 and *[1][.='∞']]" - - T: "elemet" - - is_intervals_end_infinity: "*[2][.='∞'or (self::m:plus and count(*)=1 and *[1][.='∞'])]" - tag: [open-interval, open-closed-interval, closed-interval, closed-open-interval] - match: "." - replace: - - x: "*[1]" - - T: "tƑl" - - x: "*[2]" - - T: "ig terjedƑ intervallum" - - pause: short - - test: - if: "not($is_intervals_start_infinity)" - then: - - test: - if: "starts-with(name(.), 'open')" - then: [T: "nem"] # phrase(the interval from a to b 'not' including b) - - T: "tartalmazza a(z)" # phrase(the interval from a to b not 'including' b) - - x: "*[1]" - - T: "elemet" - # logic to deal with [not] arg #1 - - test: - if: "not($is_intervals_start_infinity or $is_intervals_end_infinity)" - then_test: - - if: "name(.)='open-interval'" - then: [T: "vagy"] # phrase(the interval including a 'or' b ) - - else_if: "name(.)='closed-interval'" - then: [T: "Ă©s"] # phrase(the interval including a 'and' b) - else: [T: "de"] # phrase(the interval including a 'but' not b) - # some ugly logic dealing with connectives: or, but, but, and (cleaner to be part of next clause?) - - test: - if: "not($is_intervals_end_infinity)" - then: - - test: - # there is some asymmetry to the test because of the and/or/but logic above - if: "not( name(.)='open-interval' or name(.)='closed-interval' ) or $is_intervals_start_infinity" - then: - - test: - if: "name(.) = 'open-interval' or name(.) = 'closed-open-interval'" - then: [T: "nem"] # phrase(the interval 'not' including a) - - T: "tartalmazza" # phrase(the interval not 'including' a) - - T: "a(z)" - - x: "*[2]" - - T: "elemet" - # onto the [not] [including]... part - -- name: binomial-frac-vector - tag: matrix - match: - - "$ClearSpeak_Matrix = 'Combinatorics' and " - - "count(*[1]/*)=1 and count(*)=2" - replace: - - x: "*[1]/*[1]/*" # mtable/mtr/mtd - - T: "alatt a" # phrase(the binomial coefficient n 'choose' m) - - x: "*[2]/*[1]/*" - -- name: ClearSpeak-default - tag: [mtr, mlabeledtr] - match: "parent::m:matrix or parent::m:determinant" - variables: [NextLineIsContinuedRow: "following-sibling::*[1][contains(@data-intent-property, ':continued-row:')]"] - replace: - - pause: medium - - x: "count(preceding-sibling::*)+1" - - T: ". sor" # phrase(the first 'row' of a matrix) - - test: - if: ".[self::m:mlabeledtr]" - then: - - T: "cĂ­mkĂ©je:" # phrase(the line 'with label' first equation) - - x: "*[1]/*" - - pause: short - - pause: medium - - test: - if: ".[self::m:mlabeledtr]" - then: [x: "*[position()>1]"] - else: [x: "*"] - -- # handle both log and ln - name: ClearSpeak-log - tag: mi - match: ".='log' or .='ln'" - replace: - - bookmark: "@id" - - test: - if: "$Verbosity!='Terse' and not(IsNode(following-sibling::*[2],'simple'))" - then: [T: "a"] # phrase('the' square root of 25) - - test: - - if: ".='log'" - then: [T: "logaritmus"] - - else_if: "$ClearSpeak_Log = 'LnAsNaturalLog'" - then: [T: "termĂ©szetes alapĂș logaritmus"] # phrase(the 'natural log' of x) - else: [T: "l n"] - -- name: ClearSpeak-multi-line # audit-ignore - tag: [piecewise, system-of-equations, lines] # these are ignored in favor of the ClearSpeak prefs - match: "." - variables: - # Wikipedia has some tables where all the entire first column is empty (e.g., https://en.wikipedia.org/wiki/List_of_trigonometric_identities) - - LineCount: "count(*[not(contains(@data-intent-property, ':continued-row:'))])" - - NextLineIsContinuedRow: "false()" # default value - - IsColumnSilent: true() - replace: - - test: - - if: "$ClearSpeak_MultiLineOverview = 'Auto'" - then: - - x: "$LineCount" - - test: - - if: "($ClearSpeak_MultiLineLabel = 'Auto' and self::m:piecewise) or $ClearSpeak_MultiLineLabel = 'Case'" - then: [T: "eset"] # phrase(this is the first 'case' of three cases) - - else_if: "$ClearSpeak_MultiLineLabel = 'Auto' or $ClearSpeak_MultiLineLabel = 'Line' or $ClearSpeak_MultiLineLabel = 'None'" # already dealt with Auto/Case - then: [T: "sor"] # phrase(this is the first 'line' of three lines) - - else_if: "$ClearSpeak_MultiLineLabel = 'Constraint'" - then: [T: "feltĂ©tel"] # phrase(this is the first 'constraint' of three constraints) - - else_if: "$ClearSpeak_MultiLineLabel = 'Equation'" - then: [T: "egyenlet"] # phrase(this is the first 'equation' of three equations) - - else_if: "$ClearSpeak_MultiLineLabel = 'Row'" - then: [T: "sor"] # phrase(this is the first 'row' of three rows) - - else_if: "$ClearSpeak_MultiLineLabel = 'Step'" - then: [T: "lĂ©pĂ©s"] # phrase(this is the first 'step' of three steps) - # else 'None -- don't say anything' - - pause: short - - x: "*" - - pause: long - -- name: ClearSpeak-default-multiline - tag: [mtr, mlabeledtr] - match: "parent::m:piecewise or parent::m:system-of-equations or parent::m:lines" - variables: [NextLineIsContinuedRow: "following-sibling::*[1][contains(@data-intent-property, ':continued-row:')]"] - replace: - - test: - if: "not($LineCount=1 or $ClearSpeak_MultiLineLabel='None' or contains(@data-intent-property, ':continued-row:'))" - then: - - pause: medium - - x: "count(preceding-sibling::*[not(contains(@data-intent-property, ':continued-row:'))]) + 1" - - test: - - if: "($ClearSpeak_MultiLineLabel = 'Auto' and parent::m:piecewise) or $ClearSpeak_MultiLineLabel = 'Case'" - then: [T: ". eset"] # phrase(in this 'case' x is not equal to y) - - else_if: "$ClearSpeak_MultiLineLabel = 'Auto' or $ClearSpeak_MultiLineLabel = 'Line'" # already dealt with Auto/Case - then: [T: ". sor"] # phrase(the straight 'line' between x and y) - - else_if: "$ClearSpeak_MultiLineLabel = 'Constraint'" - then: [T: ". feltĂ©tel"] # phrase(there is a 'constraint' on possible values) - - else_if: "$ClearSpeak_MultiLineLabel = 'Equation'" - then: [T: ". egyenlet"] # phrase(the 'equation' pi r squared gives the area of a circle) - - else_if: "$ClearSpeak_MultiLineLabel = 'Row'" - then: [T: ". sor"] # phrase(the values on the top 'row' are relevant) - - else_if: "$ClearSpeak_MultiLineLabel = 'Step'" - then: [T: ". lĂ©pĂ©s"] # phrase(this is a 'step' by step process) - # else 'None -- don't say anything' - - test: - if: "self::m:mlabeledtr" - then: - - T: "cĂ­mkĂ©vel:" # phrase(the diagram is complete 'with label') - - x: "*[1]/*" - - test: - - if: "$ClearSpeak_MultiLineLabel='None'" - then: [pause: xlong] # need a very long pause with no line labels - - else_if: "not(contains(@data-intent-property, ':continued-row:'))" - then: [pause: medium] - - test: - if: "self::m:mlabeledtr" - then: [x: "*[position()>1]"] - else: [x: "*"] - -- name: ClearSpeak_Functions_None - tag: mo - match: - - ".='⁥' and $ClearSpeak_Functions = 'None' and" - - "not(preceding-sibling::*[1][IsInDefinition(., 'TrigFunctionNames')])" # Functions=None does not apply to "trig" functions - replace: - test: - if: "$ClearSpeak_ImpliedTimes = 'None'" - then: [T: ""] - else: [T: "szorozva"] # phrase(5 'times' 3 equals 15) - -- name: no-times - tag: mo - match: - # Note: this rule is also part of the paren rule so that the parens speak - - ".='⁹' and $ClearSpeak_ImpliedTimes = 'None'" - replace: - - T: "" - -- name: ClearSpeak-times - tag: mo - match: - # say "times" when invisible times is followed by parens or a superscript that has a base with parens or "|"s - # if we aren't sure if it is times or not, don't say anything - - ".='⁹' and (not(@data-function-guess) or $ClearSpeak_Functions = 'None') and" - - "not(ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) and (" - - " $ClearSpeak_ImpliedTimes = 'MoreImpliedTimes'" - - " or " - - " following-sibling::*[1][" - - " IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|') or " - # most of these aren't mentioned in ClearSpeak spec, but are (I think) expected uses of "times" - - " self::m:matrix or self::m:determinant or self::m:binomial or" # followed by parens - - " self::m:square-root or self::m:msqrt or self::m:root or self::m:mroot or" - - " (self::m:msub or self::m:msubsup or" - - " ((self::m:msup or self::m:power) and not(IsNode(*[1], 'leaf') and *[2][self::m:mn and (.=2 or '.=3')]))) and " # followed by msup, etc. - - " (*[1][self::m:mrow[IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|')] or " - - " self::m:matrix or self::m:determinant] or" # base has parens - - " not(IsNode(*[2], 'simple')) or " - - " (self::m:msubsup and not(IsNode(*[3], 'simple')))" - - " )" - - " ]" - # other possibility is the preceding element has parens (but not the following) - # this is not mentioned in the ClearSpeak rules or examples but seems like it should say "times". E.g, |x| y - - " or " - - " preceding-sibling::*[1][" - - " IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|')]" # followed by parens - - " )" - replace: - - T: "szorozva" # phrase(5 'times' 3 equals 15) - -- name: no-say-parens - tag: mrow - match: - - "parent::*[not(self::m:msup) and not(self::m:msub) and not(self::m:msubsup) and not(self::m:power) and" - - " not(self::m:math) ] and " # rule out [x] standing alone - - "( IsBracketed(., '(', ')') or IsBracketed(., '[', ']') ) and " - - "not( $ClearSpeak_Functions = 'None' and " - - " (preceding-sibling::*[1][.='⁥'] or following-sibling::*[1][.='⁥']) ) and " - - "not( $ClearSpeak_ImpliedTimes = 'None' and " - - " (preceding-sibling::*[1][.='⁹'] or following-sibling::*[1][.='⁹']) ) and " - - "IsNode(*[2], 'simple') and" - - "not(preceding-sibling::*[1][.='\u2062' and @data-function-guess]) and" - - "not(ancestor-or-self::*[contains(@data-intent-property, ':literal:')])" - # missing clause: 'a positive fraction that is spoken as an ordinal - # (either by the Ordinal preference or by the default rules)' - replace: - - x: "*[2]" - -- include: "SharedRules/geometry.yaml" -- include: "SharedRules/linear-algebra.yaml" -- include: "SharedRules/general.yaml" -- include: "SharedRules/default.yaml" +--- +- name: pause + tag: "!*" + match: "not(self::m:math) and not($MatchingPause) and @data-intent-property[contains(., ':pause')]" + replace: + - with: + variables: [MatchingPause: "true()"] + replace: + - test: + - if: "contains(@data-intent-property, ':pause-long')" + then: [pause: long] + - else_if: "contains(@data-intent-property, ':pause-short')" + then: [pause: short] + else: [pause: medium] + - x: "." + +- name: intent-literal-silent + tag: [mi, mo, mn] + match: "contains(@data-intent-property, ':silent:')" + # say nothing + replace: [] + +# handling of negative numbers that come from 'intent' is hard -- we do something that is close to right here +- name: intent-literal-negative-number + tag: mn + match: "starts-with(text(), '-')" + replace: + - T: "mĂ­nusz" # phrase(10 'minus' 4 equals 6) + - x: "translate(text(), '-_', '')" + +- name: default + tag: square-root + match: "." + replace: + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # phrase('the' square root of 25) + - test: + if: "$ClearSpeak_Roots = 'PosNegSqRoot' or $ClearSpeak_Roots = 'PosNegSqRootEnd'" + then: + - bookmark: "*[1]/@id" + - test: + if: "parent::*[self::m:minus and count(*)=1]" + then: [T: "negatĂ­v"] # phrase(minus 4 is a 'negative' number) + else: [T: "pozitĂ­v"] # phrase(10 is a 'positive' number) + - T: "nĂ©gyzetgyök" # phrase(8 is the 'square root' of 64) + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # phrase(the square root 'of' 5) - magyarban nem kell kötƑszĂł + else: [pause: short] + - x: "*[1]" + - test: + - if: "$ClearSpeak_Roots = 'RootEnd' or $ClearSpeak_Roots = 'PosNegSqRootEnd'" + then: + - pause: short + - T: "gyök vĂ©ge" # phrase(the square root of x 'end root') + - pause: medium + - else_if: "IsNode(*[1], 'simple')" + then: [pause: short] + else: [pause: long] + +- name: default + tag: root + match: "." + replace: + - test: + if: "$Verbosity!='Terse'" + then: [T: "a"] # phrase(6 is 'the' square root of 36) + - test: + if: "$ClearSpeak_Roots = 'PosNegSqRoot' or $ClearSpeak_Roots = 'PosNegSqRootEnd'" + then: + - test: + if: "parent::*[(self::m:minus or self::m:plus) and count(*)=1]" + then: [bookmark: "parent/@id"] + - test: + if: "parent::m:minus" + then: [T: "negatĂ­v"] # phrase(minus 6 is a 'negative' number) + else: [T: "pozitĂ­v"] # phrase(10 is a 'positive' number) + - test: + if: "*[2][self::m:mn and not(contains(., '.'))]" + then_test: + - if: "*[2][.='2']" + then: [T: "nĂ©gyzetgyök"] # phrase(5 is the 'square root' of 25) + - else_if: "*[2][.='3']" + then: [T: "köbgyök"] # phrase(5 is the 'cube root' of 625) + - else: [x: "ToOrdinal(*[2])", T: "gyök"] # phrase(the square 'root' of 25) + else: + - test: + if: "*[2][self::m:mi][string-length(.)=1]" + then: + - x: "*[2]" + - pronounce: [text: "-edik", ipa: "ɛdik", sapi5: "edik", eloquence: "edik"] + else: [x: "*[2]"] + - T: "gyök" # phrase(the square 'root' of 36) + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # phrase(the square root 'of' 36) + - x: "*[1]" + - test: + if: "$ClearSpeak_Roots = 'RootEnd' or $ClearSpeak_Roots = 'PosNegSqRootEnd'" + then: + - pause: short + - T: "gyök vĂ©ge" # phrase(start the fifth root of x 'end root') + - pause: medium + else_test: + if: "IsNode(*[1], 'simple')" + then: [pause: short] + else: [pause: long] + +# The 'negative' rule interacts with the msqrt/mroot rules as those might pick off this case ("the negative square root of x") +- name: negative_and_positive + tag: [plus, minus] + match: "count(*)=1 and contains(@data-intent-property, ':prefix:')" + replace: + - test: + if: + - "*[1][self::m:square-root or self::m:root] and" + - "($ClearSpeak_Roots = 'PosNegSqRoot' or $ClearSpeak_Roots = 'PosNegSqRootEnd')" + then: [T: ""] + else: + - bookmark: "@id" + - test: + if: "self::m:minus" + then: [T: "negatĂ­v"] # phrase(minus 5 is a 'negative' number) + else: [T: "pozitĂ­v"] # phrase(7 is a 'positive' number) + - x: "*[1]" + +# Fraction rules +# Mixed numbers mostly "just work" because the invisible char reads as "and" and other parts read properly on their own + +# Units (e.g., meters per second) +- name: per-fraction + tag: fraction + match: + - "$ClearSpeak_Fractions='Per' or" + - "(BaseNode(*[1])[contains(@data-intent-property, ':unit') or" + - " ( self::m:mrow and count(*)=3 and" # maybe a bit paranoid checking the structure... + - " *[1][self::m:mn] and *[2][.='\u2062'] and BaseNode(*[3])[contains(@data-intent-property, ':unit')] ) ] and" + - " BaseNode(*[2])[contains(@data-intent-property, ':unit')] )" + replace: + - x: "*[1]" + - T: "per" # phrase('5 meters 'per' second) + - x: "*[2]" + +- name: common-fraction + tag: fraction + match: + - "($ClearSpeak_Fractions='Auto' or $ClearSpeak_Fractions='Ordinal' or $ClearSpeak_Fractions='EndFrac') and" + - "*[1][self::m:mn][not(contains(., $DecimalSeparators)) and ($ClearSpeak_Fractions='Ordinal' or text()<20)] and" + - "*[2][self::m:mn][not(contains(., $DecimalSeparators)) and ($ClearSpeak_Fractions='Ordinal' or (2<= text() and text()<=10))]" + variables: [IsPlural: "*[1]!=1"] + replace: + - x: "*[1]" + - x: "ToOrdinal(*[2], true(), $IsPlural)" # extra args specify fractional ordinal and whether it is plural + +- 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: + - test: + if: "$Verbosity!='Terse'" + then: [OT: "a"] + - T: "tört" # phrase(the 'fraction' with 3 over 4) + - x: "*[1]" + - T: "per" # phrase(the fraction 3 'over' 4) - magyarban a "per" a leggyakoribb + - 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: "tört vĂ©ge" # phrase(7 over 8 'end fraction') + - pause: short + +- # fraction with text or numbers followed by text in both numerator and denominator + 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 " # fractions with text + - " (*[1][self::m:mrow][count(*)=3][ " + - " *[1][self::m:mn] and " + - " *[2][self::m:mo][.='⁹'] and " # invisible times + - " *[3][self::m:mi or self::m:mtext][string-length(.)>1] ]) ) and" + - " ((*[2][self::m:mi or self::m:mtext][string-length(.)>1]) or " # fractions with text + - " (*[2][self::m:mrow][count(*)=3][ " + - " *[1][self::m:mn] and " + - " *[2][self::m:mo][.='⁹'] and " # invisible times + - " *[3][self::m:mi or self::m:mtext][string-length(.)>1] ]) )" + - ")" + replace: + - x: "*[1]" + - T: "per" # phrase(the fraction 3 'over' 4) + - x: "*[2]" + - test: + if: "$ClearSpeak_Fractions='EndFrac' or $ClearSpeak_Fractions='OverEndFrac'" + then: + - pause: short + - T: "tört vĂ©ge" # phrase(7 over 8 'end fraction') + - pause: short + +- name: default + tag: fraction + match: "." + replace: + - OT: "a" # phrase(5 is 'the' square toot of 25) + - T: "tört, melynek szĂĄmlĂĄlĂłja" # phrase(the 'fraction with numerator' 6) + - test: + if: "not(IsNode(*[1], 'simple'))" + then: [pause: medium] + - x: "*[1]" + - pause: medium + - T: "nevezƑje pedig" # phrase(the fraction with numerator 5 'and denominator' 8) + - x: "*[2]" + - pause: long + - test: + if: "$ClearSpeak_Fractions='EndFrac' or $ClearSpeak_Fractions='GeneralEndFrac'" + then: + - pause: short + - T: "tört vĂ©ge" # phrase(the fraction with 3 over 4 'end fraction') + - pause: short + +# rules for functions raised to a power +# these could have been written on 'mrow' but putting them on msup seems more specific +# to see if it is a function, we look right to see if the following sibling is apply-function +- name: ClearSpeak-function-inverse + tag: inverse-function + match: "." + replace: + - test: + if: "$ClearSpeak_Trig = 'TrigInverse'" + then: [x: "*[1]", bookmark: "*[2]/@id", T: "inverz"] # phrase(8 over 5 is the 'inverse' of 5 over 8) + else_test: + if: "$ClearSpeak_Trig = 'ArcTrig'" + then: [bookmark: "*[2]/@id", T: "arkusz", x: "*[1]"] # phrase(the 'arc' of a circle) + else: [bookmark: "*[2]/@id", T: "inverz", x: "*[1]"] # default/Auto # phrase(8 over 5 is the 'inverse' of 5 over 8) + +# Handles functions squared or cubed, where the base is not a trig function. +- name: function-squared-or-cubed # audit-ignore + tag: power + match: + - "*[2][self::m:mn][.='2' or .='3'] and" # the exponent is 2 or 3 + - "following-sibling::*[1][self::m:mo][.='⁥']" #invisible function apply + replace: + - x: "*[1]" # say the trig function name + - bookmark: "*[2]/@id" + - test: + if: "not(IsInDefinition(*[1], 'TrigFunctionNames')) and *[2][.='2']" # the base is not a trig function + then: [T: "a nĂ©gyzeten"] # say "squared" + else_test: + if: "not(IsInDefinition(*[1], 'TrigFunctionNames'))" # the base is not a trig function + then: [T: "a köbön"] # say "cubed" + else: [T: ""] + +# Handles trig functions with simple arguments (mi or mn), for both 2, 3 and general exponents. +- name: trig-power-argument-before-exponent-general # audit-ignore + tag: [mi, mn] + match: + - "preceding-sibling::*[1][self::m:mo][.='⁥'] and" + - "preceding-sibling::*[2][self::m:power[IsInDefinition(*[1], 'TrigFunctionNames')]]" # if the previous sibling is function-apply and previous previous sibling is trig power + replace: + - test: + - if: "preceding-sibling::*[2]/*[2][self::m:mn][.='2']" # if the exponent is 2 + then: + - x: "text()" # say the argument of the trig function + - T: "a nĂ©gyzeten" + - else_if: "preceding-sibling::*[2]/*[2][self::m:mn][.='3']" # if the exponent is 3 + then: + - x: "text()" # say the argument of the trig function + - T: "a köbön" + else: + - pause: short + - x: "text()" # say the argument of the function + - pause: short + - T: "a(z)" + - test: + if: "preceding-sibling::*[2]/*[2][self::m:mn][not(contains(., '.'))]" # if the exponent is an integer + then: [x: "ToOrdinal(preceding-sibling::*[2]/*[2])"] # say the ordinal form + else: [x: "preceding-sibling::*[2]/*[2]"] # else, say the exponent + - T: "hatvĂĄnyon" + +# Handles trig functions with grouped arguments (parenthesized or bracketed mrow), for both 2, 3 and general exponents. +- name: trig-power-grouped-argument-before-exponent-general # audit-ignore + tag: [mo, mrow] + match: + - "(self::m:mo[.=')'] and preceding-sibling::*[2][self::m:mo][.='⁥'] and preceding-sibling::*[3][self::m:power[IsInDefinition(*[1], 'TrigFunctionNames')]])" + - "or" + - "(self::m:mrow[IsBracketed(., '(', ')')] and preceding-sibling::*[1][self::m:mo][.='⁥'] and preceding-sibling::*[2][self::m:power[IsInDefinition(*[1], 'TrigFunctionNames')]])" + replace: + - test: + if: "self::m:mo" # if the current node is ) + then: + - x: "text()" # say the argument of the function + - test: + - if: "preceding-sibling::*[3]/*[2][self::m:mn][.='2']" # if the exponent is 2 + then: [T: "a nĂ©gyzeten"] + - else_if: "preceding-sibling::*[3]/*[2][self::m:mn][.='3']" # if the exponent is 3 + then: [T: "a köbön"] + else: + - T: "a(z)" + - test: + if: "preceding-sibling::*[3]/*[2][self::m:mn][not(contains(., '.'))]" # if the exponent is an integer + then: [x: "ToOrdinal(preceding-sibling::*[3]/*[2])"] # say the ordinal form + else: [x: "preceding-sibling::*[3]/*[2]"] # else, say the exponent + - T: "hatvĂĄnyon" + else: # if the current node is an with parentheses + - x: "*[1]" + - x: "*[2]" + - x: "*[3]" + - test: + - if: "preceding-sibling::*[2]/*[2][self::m:mn][.='2']" # if the exponent is 2 + then: [T: "a nĂ©gyzeten"] + - else_if: "preceding-sibling::*[2]/*[2][self::m:mn][.='3']" # if the exponent is 3 + then: [T: "a köbön"] + else: + - T: "a(z)" + - test: + if: "preceding-sibling::*[2]/*[2][self::m:mn][not(contains(., '.'))]" # if the exponent is an integer + then: [x: "ToOrdinal(preceding-sibling::*[2]/*[2])"] # say the ordinal form + else: [x: "preceding-sibling::*[2]/*[2]"] # else, say the exponent + - T: "hatvĂĄnyon" + +- name: function-power # audit-ignore + tag: power + match: + - "following-sibling::*[1][self::m:mo][.='⁥'] and" #invisible function apply + - "not(*[1][IsInDefinition(., 'TrigFunctionNames')])" + replace: + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # phrase('the' third power of 2) + - bookmark: "*[2]/@id" + - test: + if: "*[2][self::m:mn][not(contains(., '.'))]" + then: [x: "ToOrdinal(*[2])"] + else: [x: "*[2]"] + - T: "hatvĂĄnyon" # phrase(the third 'power of' 6) + - pause: short + - x: "*[1]" + +# Handles trig function powers (non-2/3) at the base node so generic power rules do not speak the base/exponent too early. +- name: trig-function-power-base-only # audit-ignore + tag: power + match: + - "following-sibling::*[1][self::m:mo][.='⁥'] and" + - "*[1][IsInDefinition(., 'TrigFunctionNames')] and" + - "not(*[2][self::m:mn][.='2' or .='3'])" + replace: + - x: "*[1]" + +- name: AfterPower-nested + tag: power + match: # directly a superscript or an mrow that contains a superscript + - "$ClearSpeak_Exponents = 'AfterPower' and" + - "*[2][self::m:power or self::m:power or self::m:mrow[m:power]]" + replace: + - x: "*[1]" + - T: "a következƑ kitevƑre emelve:" # phrase(5 'raised to the exponent' x plus 1) + - pause: short + - x: "*[2]" + - pause: short + - T: "kitevƑ vĂ©ge" # phrase(5 raised to the exponent x plus 1 'end exponent') + +- name: AfterPower-default + tag: power + match: "$ClearSpeak_Exponents = 'AfterPower'" + replace: + - x: "*[1]" + - T: "a következƑ hatvĂĄnyra emelve:" # phrase(x is 'raised to the power' 4) + - x: "*[2]" + - pause: short + +- name: squared + tag: power + match: "*[2][self::m:mn][.='2'] and $ClearSpeak_Exponents = 'Auto'" + replace: + - x: "*[1]" + - bookmark: "*[2]/@id" + - T: "a nĂ©gyzeten" # phrase(7 'squared' equals 49) + +- name: cubed + tag: power + match: "*[2][self::m:mn][.='3'] and $ClearSpeak_Exponents = 'Auto'" + replace: + - x: "*[1]" + - bookmark: "*[2]/@id" + - T: "a köbön" # phrase(5 'cubed' equals 125) + +- name: simple-integer # audit-ignore + tag: power + match: "*[2][self::m:mn][not(contains(., '.'))]" + replace: + - x: "*[1]" + - T: "a(z)" # phrase(2 raised 'to the' power 7) + - test: + if: "*[2][.>=0]" + then: [x: "ToOrdinal(*[2])"] + else: [x: "*[2]"] + - T: "hatvĂĄnyon" + +- name: simple-negative-integer # audit-ignore + tag: power + match: + - "*[2][self::m:minus and count(*)=1 and " + - " *[1][self::m:mn][not(contains(., '.'))]" + - " ]" + replace: + - x: "*[1]" + - T: "a" # phrase(2 raised 'to the' power 7) + - x: "*[2]" + - T: "hatvĂĄnyon" + +- name: simple-var # audit-ignore + tag: power + match: "*[2][self::m:mi][string-length(.)=1]" + replace: + - x: "*[1]" + - T: "a(z)" # phrase(3 raised 'to the' power 7) + - x: "*[2]" + - pronounce: [text: "-edik", ipa: "ɛdik", sapi5: "edik", eloquence: "edik"] + - T: "hatvĂĄnyon" + +# match nested exponent, where the nested exponent is has the power 2 or 3 (n below) +# [xxx]^n, - [xxx]^n, [xxx] var^n, -[xxx] var^n +# where xxx is a number or common fraction (or a var in the first two forms) +# short of creating a specialized built-in function, I don't see a way to eliminate a lot of repetition in the matches +# also really bad is that the test of a common fraction is replicated here (four times!) +# Note: the ClearSpeak doc doesn't say these only apply when the pref is "Auto", +# but the test cases all fall back to "raised to the exponent" when not "Auto" +# If these are allowed for non-Auto values, then you end up with "...power power...". +- # [xxx]^n + name: nested-squared-or-cubed + tag: power + match: + - "$ClearSpeak_Exponents = 'Auto' and" + - "*[2][self::m:power][" + - " *[2][self::m:mn][.='2' or .='3'] and " # exp is 2 or 3 + # base is mn, mi, common fraction ([xxx] case) + - " *[1][self::m:mn or self::m:mi or " + - " self::m:fraction[*[1][self::m:mn][not(contains(., '.')) and text()<20] and" + - " *[2][self::m:mn][not(contains(., '.')) and 2<= text() and text()<=10]]" + - " ]" + - " ]" + replace: + - x: "*[1]" + - T: "emelve a(z)" # phrase(x 'raised to the' second power) + - x: "*[2]" + - T: "hatvĂĄnyra" # phrase(x raised to the second 'power') + +- # - [xxx]^n + name: nested-negative-squared-or-cubed + tag: power + match: + - "$ClearSpeak_Exponents = 'Auto' and" + - " *[2][self::m:minus and count(*)=1 and " + - " *[1]/*[1][self::m:power][" + - " *[2][self::m:mn][.='2' or .='3'] and " # exp is 2 or 3" + # base is mn, mi, common fraction ([xxx] case) + - " *[1][self::m:mn or self::m:mi or " + - " self::m:fraction[*[1][self::m:mn][not(contains(., '.')) and text()<20] and" + - " *[2][self::m:mn][not(contains(., '.')) and 2<= text() and text()<=10]]" + - " ]" + - " ]" + - " ]" + replace: + - x: "*[1]" + - T: "emelve a(z)" # phrase(x 'raised to the' second power) + - x: "*[2]" + - T: "hatvĂĄnyra" # phrase(x raised to the second 'power') + +- # [xxx] var^n + name: nested-var-squared-or-cubed + tag: power + match: + - "$ClearSpeak_Exponents = 'Auto' and" + - " *[2][self::m:mrow][count(*)=3][ " + - " *[3][self::m:power][" + - " *[2][self::m:mn][.='2' or .='3'] and " # exp is 2 or 3 + - " *[1][self::m:mi]" + - " ] and " + - " *[2][self::m:mo][.='⁹'] and " # invisible times + # base is mn, or common fraction ([xxx] case) + - " *[1][self::m:mn or " + - " self::m:fraction[*[1][self::m:mn][not(contains(., '.')) and text()<20] and" + - " *[2][self::m:mn][not(contains(., '.')) and 2<= text() and text()<=10]]" + - " ]" + - " ]" + replace: + - x: "*[1]" + - T: "emelve a(z)" # phrase(x 'raised to the' second power) + - x: "*[2]" + - T: "hatvĂĄnyra" # phrase(x raised to the second 'power') + +- # -[xxx] var^n + name: nested-negative-var-squared-or-cubed + tag: power + match: + - "$ClearSpeak_Exponents = 'Auto' and" + - " *[2][self::m:mrow][count(*)=3][ " + - " *[3][self::m:power][" + - " *[2][self::m:mn][.='2' or .='3'] and " # exp is 2 or 3 + - " *[1][self::m:mi]" + - " ] and " + - " *[2][self::m:mo][.='⁹'] and " # invisible times + - " *[1][self::m:minus and count(*)=1 and " + # base is mn, or common fraction ([xxx] case) + - " *[1][self::m:mn or " + - " self::m:fraction[*[1][self::m:mn][not(contains(., '.')) and text()<20] and" + - " *[2][self::m:mn][not(contains(., '.')) and 2<= text() and text()<=10]]" + - " ]" + - " ]" + - " ]" + replace: + - x: "*[1]" + - T: "emelve a" # phrase(x 'raised to the' second power) + - x: "*[2]" + - T: "hatvĂĄnyra" # phrase(x raised to the second 'power') + +- name: default-exponent-power + tag: power + match: # directly a superscript or an mrow that contains a superscript + - "*[2][self::m:power or self::m:power or self::m:mrow[m:power]]" + replace: + - x: "*[1]" + - T: "emelve a következƑ kitevƑre:" # phrase(x is 'raised to the exponent') + - pause: short + - x: "*[2]" + - pause: short + - T: "kitevƑ vĂ©ge" # phrase(and now 'end exponent' has been reached) + +- name: default + tag: power + match: "." + replace: + - x: "*[1]" + - T: "a(z)" # phrase(x 'raised to the' second power) + - x: "*[2]" + - T: "hatvĂĄnyon" # phrase(x raised to the second 'power') + +# +# Some rules on mrows +# +- # the inference rules lump absolute value and cardinality together, so those rules are implemented here + name: ClearSpeak-absolute-value + tag: absolute-value + match: "." + variables: [WordToSay: "IfThenElse($ClearSpeak_AbsoluteValue = 'Cardinality', 'szĂĄmossĂĄga', 'abszolĂșt Ă©rtĂ©ke')"] + replace: + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # phrase('the' absolute value of 25) + - x: "*[1]" + - x: "$WordToSay" + - test: + if: "$ClearSpeak_AbsoluteValue = 'AbsEnd'" + then: + - pause: short + - T: "vĂ©ge az" # phrase('end' absolute value) + - T: "abszolĂșt Ă©rtĂ©knek" + - pause: short + +- name: set + tag: set + # Empty set and braced/{set-builder} forms (typically 0–1 child). + # Multi-arg intent set($x,$y,...) and set($x) with @arg fall through to function-intent + # ("the set of 
"). + match: "count(*)=0 or (count(*)=1 and not(*[1][@arg]))" + replace: + - test: + - if: "count(*)=0" + then: [T: "az ĂŒres halmaz"] # phrase('the empty set') + - else_if: "count(*[1]/*)=3 and *[1]/*[2][self::m:mo][.=':' or .='|' or .='∣']" + then: + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # phrase('the' empty set) + - T: "" # phrase(the 'empty set') + - test: + if: "$ClearSpeak_Sets != 'woAll'" + then: [T: "minden"] # phrase(the set of 'all' integers) + - x: "*[1]/*[1]" + - T: "melyekre teljesĂŒl, hogy" # phrase(the set S 'such that' x is less than y) + - x: "*[1]/*[3]" + else: + - test: + if: "$ClearSpeak_Sets != 'SilentBracket'" + then: + - test: + if: "$Verbosity!='Terse'" + then: [T: "a"] # phrase('the' set of integers) + - T: "halmaz" # phrase(this is a 'set' of integers) + - x: "*[1]" + +- # intervals are controlled by a ClearSpeak Preference -- parens/brackets don't have to match, so we avoid IsBracketed + # alternatively, we could have four (or ten) rules, but there is a lot of duplication if we do that + # this one rule handles all ten cases listed as part $ClearSpeak_Paren = 'Interval' + # note that *[2] is an mrow with X, ",", Y, so getting X or Y is a double index + name: ClearSpeak-intervals # audit-ignore # avoid overriding with default "intervals" name + variables: + - is_intervals_start_infinity: "*[1][self::m:minus and count(*)=1 and *[1][.='∞']]" + - T: "elemet" + - is_intervals_end_infinity: "*[2][.='∞'or (self::m:plus and count(*)=1 and *[1][.='∞'])]" + tag: [open-interval, open-closed-interval, closed-interval, closed-open-interval] + match: "." + replace: + - x: "*[1]" + - T: "tƑl" + - x: "*[2]" + - T: "ig terjedƑ intervallum" + - pause: short + - test: + if: "not($is_intervals_start_infinity)" + then: + - test: + if: "starts-with(name(.), 'open')" + then: [T: "nem"] # phrase(the interval from a to b 'not' including b) + - T: "tartalmazza a(z)" # phrase(the interval from a to b not 'including' b) + - x: "*[1]" + - T: "elemet" + # logic to deal with [not] arg #1 + - test: + if: "not($is_intervals_start_infinity or $is_intervals_end_infinity)" + then_test: + - if: "name(.)='open-interval'" + then: [T: "vagy"] # phrase(the interval including a 'or' b ) + - else_if: "name(.)='closed-interval'" + then: [T: "Ă©s"] # phrase(the interval including a 'and' b) + else: [T: "de"] # phrase(the interval including a 'but' not b) + # some ugly logic dealing with connectives: or, but, but, and (cleaner to be part of next clause?) + - test: + if: "not($is_intervals_end_infinity)" + then: + - test: + # there is some asymmetry to the test because of the and/or/but logic above + if: "not( name(.)='open-interval' or name(.)='closed-interval' ) or $is_intervals_start_infinity" + then: + - test: + if: "name(.) = 'open-interval' or name(.) = 'closed-open-interval'" + then: [T: "nem"] # phrase(the interval 'not' including a) + - T: "tartalmazza" # phrase(the interval not 'including' a) + - T: "a(z)" + - x: "*[2]" + - T: "elemet" + # onto the [not] [including]... part + +- name: binomial-frac-vector + tag: matrix + match: + - "$ClearSpeak_Matrix = 'Combinatorics' and " + - "count(*[1]/*)=1 and count(*)=2" + replace: + - x: "*[1]/*[1]/*" # mtable/mtr/mtd + - T: "alatt a" # phrase(the binomial coefficient n 'choose' m) + - x: "*[2]/*[1]/*" + +- name: ClearSpeak-default + tag: [mtr, mlabeledtr] + match: "parent::m:matrix or parent::m:determinant" + variables: [NextLineIsContinuedRow: "following-sibling::*[1][contains(@data-intent-property, ':continued-row:')]"] + replace: + - pause: medium + - x: "count(preceding-sibling::*)+1" + - T: ". sor" # phrase(the first 'row' of a matrix) + - test: + if: ".[self::m:mlabeledtr]" + then: + - T: "cĂ­mkĂ©je:" # phrase(the line 'with label' first equation) + - x: "*[1]/*" + - pause: short + - pause: medium + - test: + if: ".[self::m:mlabeledtr]" + then: [x: "*[position()>1]"] + else: [x: "*"] + +- # handle both log and ln + name: ClearSpeak-log + tag: mi + match: ".='log' or .='ln'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity!='Terse' and not(IsNode(following-sibling::*[2],'simple'))" + then: [T: "a"] # phrase('the' square root of 25) + - test: + - if: ".='log'" + then: [T: "logaritmus"] + - else_if: "$ClearSpeak_Log = 'LnAsNaturalLog'" + then: [T: "termĂ©szetes alapĂș logaritmus"] # phrase(the 'natural log' of x) + else: [T: "l n"] + +- name: ClearSpeak-multi-line # audit-ignore + tag: [piecewise, system-of-equations, lines] # these are ignored in favor of the ClearSpeak prefs + match: "." + variables: + # Wikipedia has some tables where all the entire first column is empty (e.g., https://en.wikipedia.org/wiki/List_of_trigonometric_identities) + - LineCount: "count(*[not(contains(@data-intent-property, ':continued-row:'))])" + - NextLineIsContinuedRow: "false()" # default value + - IsColumnSilent: true() + replace: + - test: + - if: "$ClearSpeak_MultiLineOverview = 'Auto'" + then: + - x: "$LineCount" + - test: + - if: "($ClearSpeak_MultiLineLabel = 'Auto' and self::m:piecewise) or $ClearSpeak_MultiLineLabel = 'Case'" + then: [T: "eset"] # phrase(this is the first 'case' of three cases) + - else_if: "$ClearSpeak_MultiLineLabel = 'Auto' or $ClearSpeak_MultiLineLabel = 'Line' or $ClearSpeak_MultiLineLabel = 'None'" # already dealt with Auto/Case + then: [T: "sor"] # phrase(this is the first 'line' of three lines) + - else_if: "$ClearSpeak_MultiLineLabel = 'Constraint'" + then: [T: "feltĂ©tel"] # phrase(this is the first 'constraint' of three constraints) + - else_if: "$ClearSpeak_MultiLineLabel = 'Equation'" + then: [T: "egyenlet"] # phrase(this is the first 'equation' of three equations) + - else_if: "$ClearSpeak_MultiLineLabel = 'Row'" + then: [T: "sor"] # phrase(this is the first 'row' of three rows) + - else_if: "$ClearSpeak_MultiLineLabel = 'Step'" + then: [T: "lĂ©pĂ©s"] # phrase(this is the first 'step' of three steps) + # else 'None -- don't say anything' + - pause: short + - x: "*" + - pause: long + +- name: ClearSpeak-default-multiline + tag: [mtr, mlabeledtr] + match: "parent::m:piecewise or parent::m:system-of-equations or parent::m:lines" + variables: [NextLineIsContinuedRow: "following-sibling::*[1][contains(@data-intent-property, ':continued-row:')]"] + replace: + - test: + if: "not($LineCount=1 or $ClearSpeak_MultiLineLabel='None' or contains(@data-intent-property, ':continued-row:'))" + then: + - pause: medium + - x: "count(preceding-sibling::*[not(contains(@data-intent-property, ':continued-row:'))]) + 1" + - test: + - if: "($ClearSpeak_MultiLineLabel = 'Auto' and parent::m:piecewise) or $ClearSpeak_MultiLineLabel = 'Case'" + then: [T: ". eset"] # phrase(in this 'case' x is not equal to y) + - else_if: "$ClearSpeak_MultiLineLabel = 'Auto' or $ClearSpeak_MultiLineLabel = 'Line'" # already dealt with Auto/Case + then: [T: ". sor"] # phrase(the straight 'line' between x and y) + - else_if: "$ClearSpeak_MultiLineLabel = 'Constraint'" + then: [T: ". feltĂ©tel"] # phrase(there is a 'constraint' on possible values) + - else_if: "$ClearSpeak_MultiLineLabel = 'Equation'" + then: [T: ". egyenlet"] # phrase(the 'equation' pi r squared gives the area of a circle) + - else_if: "$ClearSpeak_MultiLineLabel = 'Row'" + then: [T: ". sor"] # phrase(the values on the top 'row' are relevant) + - else_if: "$ClearSpeak_MultiLineLabel = 'Step'" + then: [T: ". lĂ©pĂ©s"] # phrase(this is a 'step' by step process) + # else 'None -- don't say anything' + - test: + if: "self::m:mlabeledtr" + then: + - T: "cĂ­mkĂ©vel:" # phrase(the diagram is complete 'with label') + - x: "*[1]/*" + - test: + - if: "$ClearSpeak_MultiLineLabel='None'" + then: [pause: xlong] # need a very long pause with no line labels + - else_if: "not(contains(@data-intent-property, ':continued-row:'))" + then: [pause: medium] + - test: + if: "self::m:mlabeledtr" + then: [x: "*[position()>1]"] + else: [x: "*"] + +- name: ClearSpeak_Functions_None + tag: mo + match: + - ".='⁥' and $ClearSpeak_Functions = 'None' and" + - "not(preceding-sibling::*[1][IsInDefinition(., 'TrigFunctionNames')])" # Functions=None does not apply to "trig" functions + replace: + test: + if: "$ClearSpeak_ImpliedTimes = 'None'" + then: [T: ""] + else: [T: "szorozva"] # phrase(5 'times' 3 equals 15) + +- name: no-times + tag: mo + match: + # Note: this rule is also part of the paren rule so that the parens speak + - ".='⁹' and $ClearSpeak_ImpliedTimes = 'None'" + replace: + - T: "" + +- name: ClearSpeak-times + tag: mo + match: + # say "times" when invisible times is followed by parens or a superscript that has a base with parens or "|"s + # if we aren't sure if it is times or not, don't say anything + - ".='⁹' and (not(@data-function-guess) or $ClearSpeak_Functions = 'None') and" + - "not(ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) and (" + - " $ClearSpeak_ImpliedTimes = 'MoreImpliedTimes'" + - " or " + - " following-sibling::*[1][" + - " IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|') or " + # most of these aren't mentioned in ClearSpeak spec, but are (I think) expected uses of "times" + - " self::m:matrix or self::m:determinant or self::m:binomial or" # followed by parens + - " self::m:square-root or self::m:msqrt or self::m:root or self::m:mroot or" + - " (self::m:msub or self::m:msubsup or" + - " ((self::m:msup or self::m:power) and not(IsNode(*[1], 'leaf') and *[2][self::m:mn and (.=2 or '.=3')]))) and " # followed by msup, etc. + - " (*[1][self::m:mrow[IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|')] or " + - " self::m:matrix or self::m:determinant] or" # base has parens + - " not(IsNode(*[2], 'simple')) or " + - " (self::m:msubsup and not(IsNode(*[3], 'simple')))" + - " )" + - " ]" + # other possibility is the preceding element has parens (but not the following) + # this is not mentioned in the ClearSpeak rules or examples but seems like it should say "times". E.g, |x| y + - " or " + - " preceding-sibling::*[1][" + - " IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|')]" # followed by parens + - " )" + replace: + - T: "szorozva" # phrase(5 'times' 3 equals 15) + +- name: no-say-parens + tag: mrow + match: + - "parent::*[not(self::m:msup) and not(self::m:msub) and not(self::m:msubsup) and not(self::m:power) and" + - " not(self::m:math) ] and " # rule out [x] standing alone + - "( IsBracketed(., '(', ')') or IsBracketed(., '[', ']') ) and " + - "not( $ClearSpeak_Functions = 'None' and " + - " (preceding-sibling::*[1][.='⁥'] or following-sibling::*[1][.='⁥']) ) and " + - "not( $ClearSpeak_ImpliedTimes = 'None' and " + - " (preceding-sibling::*[1][.='⁹'] or following-sibling::*[1][.='⁹']) ) and " + - "IsNode(*[2], 'simple') and" + - "not(preceding-sibling::*[1][.='\u2062' and @data-function-guess]) and" + - "not(ancestor-or-self::*[contains(@data-intent-property, ':literal:')])" + # missing clause: 'a positive fraction that is spoken as an ordinal + # (either by the Ordinal preference or by the default rules)' + replace: + - x: "*[2]" + +- include: "SharedRules/geometry.yaml" +- include: "SharedRules/linear-algebra.yaml" +- include: "SharedRules/general.yaml" +- include: "SharedRules/default.yaml" diff --git a/Rules/Languages/hu/unicode.yaml b/Rules/Languages/hu/unicode.yaml index 16561b733..caf1e9557 100644 --- a/Rules/Languages/hu/unicode.yaml +++ b/Rules/Languages/hu/unicode.yaml @@ -1,508 +1,508 @@ ---- - - "a-z": # audit-ignore - - test: - if: "$TTS='none'" - then: [T: "."] - else: [SPELL: "'.'"] - # Note to translators: - # most languages don't have two ways to pronounce 'a' -- if not need, remove the rules and change "B-Z" to "A-Z" - # some languages say the word for "uppercase" after the letter. Make sure to change that where appropriate by moving some code around - # Capital letters are a little tricky: users can pick their favorite word (something that was requested) and - # screen readers have options to use pitch changes or beeps instead of or in addition to say "cap" - # Also, if a user can see the screen, they probably don't need to hear "cap", but if they specified an override, they must want to hear the override. - # Some languages say the word for "uppercase" after the letter. Make sure to change that where appropriate by moving some code around - - "A-Z": # audit-ignore - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "nagy"] - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - # note: processing of ranges converts '.' into the character, so it needs to be in quotes below - replace: [SPELL: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"] - - - "0-9": [T: "."] # (en: '.', DeepL translation) - - - " ": [T: " "] # 0x20 (DeepL translation) - - - "!": # 0x21 - - test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then_test: - if: "$Verbosity = 'Terse'" - then: [T: "felkiĂĄltĂłjel"] # 0x21 (DeepL translation) - else: [T: "felkiĂĄltĂłjel"] # 0x21 (en: 'exclamation point', DeepL translation) - else: [T: "faktoriĂĄlis"] # 0x21 (en: 'factorial', DeepL translation) - - - "\"": [T: "idĂ©zƑjel"] # 0x22 (en: 'quotation mark', DeepL translation) - - "#": [T: "kettƑskereszt"] # 0x23 (DeepL translation) - - "$": [T: "dollĂĄr"] # 0x24 (en: 'dollars', DeepL translation) - - "%": [T: "szĂĄzalĂ©k"] # 0x25 (en: 'percent', DeepL translation) - - "&": [T: "zĂĄrĂłjel"] # 0x26 (en: 'ampersand', DeepL translation) - - "'": [T: "aposztrĂłf"] # 0x27 (en: 'apostrophe', DeepL translation) - - "(": # 0x28 - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then_test: - if: "$Verbosity='Terse'" - then: [T: "nyitott zĂĄrĂłjel"] # 0x28 (DeepL translation) - else: [T: "nyitott zĂĄrĂłjel"] # 0x28 (en: 'open paren', DeepL translation) - else: [T: "bal zĂĄrĂłjel"] # 0x28 (en: 'left paren', DeepL translation) - - ")": # 0x29 - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then_test: - if: "$Verbosity='Terse'" - then: [T: "zĂĄrt zĂĄrĂłjel"] # 0x29 (en: 'close', DeepL translation) - else: [T: "zĂĄrt zĂĄrĂłjel"] # 0x29 (en: 'close paren', DeepL translation) - else: [T: "jobb zĂĄrĂłjel"] # 0x29 (en: 'right paren', DeepL translation) - - - "*": # 0x2a - test: - if: "parent::*[name(.)='msup' or name(.)='msubsup' or name(.)='skip-super']" - then: [T: "csillag"] # 0x2a (en: 'star', DeepL translation) - else: [T: "szorozva"] # 0x2a (DeepL translation) - - "+": [T: "plusz"] # 0x2b (en: 'plus', DeepL translation) - - ",": # 0x2c - # the following deals with the interaction of "," with "
" which sometimes wants the ',' to be silent - # that this test is here and not with "
" is not ideal, but seems simplest - test: - if: - - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or " - # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' - # speak "comma" when not adjacent to '
' - - "( following-sibling::*[1][text()!= '
'] and preceding-sibling::*[1][text()!='
'] ) or " - # except if expression starts with '
' - - "../*[1][.='
'] " - then: - - T: "vesszƑ" # (en: 'comma', google translation) - - test: - if: "$Verbosity != Terse" - then: [pause: short] - # else silent - - - "-": [T: "mĂ­nusz"] # 0x2d (en: 'minus', DeepL translation) - - ".": # 0x2e - - test: - if: "parent::*[1][self::m:mn]" - then: [T: "pont"] # (en: 'point', DeepL translation) - else: [T: "pont"] # (en: 'dot', DeepL translation) - - "/": # 0x2f - - test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [T: "per"] # 0x2f (DeepL translation) - else: [T: "osztva"] # 0x2f (en: 'divided by', DeepL translation) - - - ":": [T: "kettƑspont"] # 0x3a (en: 'colon', DeepL translation) - - ";": [T: "pontosvesszƑ"] # 0x3b (en: 'semicolon', DeepL translation) - - "<": # 0x3c - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', DeepL translation) - - T: "kisebb, mint" # (en: 'less than', DeepL translation) - - "=": # 0x3d - - test: - if: "$Verbosity!='Terse'" - then: [T: "egyenlƑ"] # (en: 'is equal to', DeepL translation) - else: [T: "egyenlƑ"] # (en: 'equals', DeepL translation) - - - ">": # 0x3e - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', DeepL translation) - - T: "nagyobb, mint" # (en: 'greater than', DeepL translation) - - "?": [T: "kĂ©rdƑjel"] # 0x3f (en: 'question mark', DeepL translation) - - "@": [T: "kukac"] # 0x40 (en: 'at sign', DeepL translation) - - "[": # 0x5b - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "nyitott zĂĄrĂłjel"] # (en: 'open bracket', DeepL translation) - else: [T: "bal oldali zĂĄrĂłjel"] # (en: 'left bracket', DeepL translation) - - "\\": [T: "bexles"] # 0x5c (en: 'back slash', DeepL translation) - - "]": # 0x5d - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "zĂĄrĂłjel"] # (en: 'close bracket', DeepL translation) - else: [T: "jobb oldali zĂĄrĂłjel"] # (en: 'right bracket', DeepL translation) - - "^": # 0x5e - - test: - if: "parent::m:modified-variable or parent::m:mover" - then: [T: "kalap"] # (en: 'hat', DeepL translation) - else: [T: "fölfelĂ©nyĂ­l"] # (DeepL translation) - - "_": [T: "alĂĄhĂșzĂĄs"] # 0x5f (en: 'under bar', DeepL translation) - - "`": [T: "sĂșlyozott"] # 0x60 (en: 'grave', DeepL translation) - - "{": # 0x7b - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "nyitott zĂĄrĂłjel"] # (en: 'open brace', DeepL translation) - else: [T: "bal oldali zĂĄrĂłjel"] # (en: 'left brace', DeepL translation) - - "|": # 0x7c - # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' - - with: - variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) - replace: - - test: - - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [T: "fĂŒggƑleges vonal"] # (en: 'vertical line', DeepL translation) - - else_if: "$SpeechStyle != 'ClearSpeak'" - then_test: - - if: "$DefaultToGiven" - then: [T: "adott"] # (en: 'given', DeepL translation) - - else_if: "preceding-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))] and - following-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))]" - then: [T: "osztja"] # (en: 'divides', DeepL translation) - else: [T: "fĂŒggƑleges vonal"] # (en: 'vertical line', DeepL translation) - - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" - then: [T: "fĂŒggƑleges vonal"] # (en: 'vertical line', DeepL translation) - - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" - then: [T: "olyan, hogy"] # (en: 'such that', DeepL translation) - - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" - then: [T: "adott"] # (en: 'given', DeepL translation) - - else: [T: "osztja"] # (en: 'divides', DeepL translation) - - - "}": # 0x7d - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "zĂĄrt zĂĄrĂłjel"] # (en: 'close brace', DeepL translation) - else: [T: "jobb oldali zĂĄrĂłjel"] # (en: 'right brace', DeepL translation) - - - "~": [T: "tilde"] # 0x7e (DeepL translation) - - " ": # 0xa0 - - test: - # could be mtext in mtd or mtext in an mrow that is a concatenation of mtd's. Is there a better solution? - if: "@data-empty-in-2D and not(ancestor::*[self::m:piecewise or self::m:system-of-equations or self::m:lines])" - then: [T: "ĂŒres"] # want to say something for fraction (etc) with empty child (en: 'empty', DeepL translation) - else: [T: ""] - - - "ÂŹ": [T: "logikai nem"] # 0xac (en: 'not', DeepL translation) - - "°": [T: "fok"] # 0xb0 (en: 'degrees', DeepL translation) - - "±": [T: "plusz vagy mĂ­nusz"] # 0xb1 (en: 'plus or minus', DeepL translation) - - "ÂŽ": [T: "Ă©les Ă©kezet"] # 0xb4 (en: 'acute', DeepL translation) - - "·": # 0xB7 - - test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')] or not($SpeechStyle = 'ClearSpeak' and $ClearSpeak_MultSymbolDot = 'Auto')" - then: [T: "pont"] # (en: 'dot', DeepL translation) - else: [T: "szorozva"] # (DeepL translation) - - "×": # 0xd7 - - test: - if: "$SpeechStyle = 'ClearSpeak'" - then_test: - - if: "$ClearSpeak_MultSymbolX = 'Auto'" - then: [T: "szorozva"] # (DeepL translation) - - else_if: "$ClearSpeak_MultSymbolX = 'By'" - then: [T: "szorozva"] # (DeepL translation) - else: [T: "kereszt"] # (en: 'cross', DeepL translation) - else_test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [T: "kereszt"] # (en: 'cross', DeepL translation) - else: [T: "szorozva"] # (DeepL translation) - - - "Ă·": [T: "osztva"] # 0xf7 (en: 'divided by', DeepL translation) - - "̀": [T: "sĂșlyos Ă©kezet dĂ­szĂ­tĂ©s"] # 0x300 (en: 'grave accent embellishment', DeepL translation) - - "́": [T: "akut Ă©kezet dĂ­szĂ­tĂ©s"] # 0x301 (en: 'acute accent embellishment', DeepL translation) - - "̂": [T: "cirkumflex Ă©kezet dĂ­szĂ­tĂ©s"] # 0x302 (en: 'circumflex accent embellishment', DeepL translation) - - "̃": [T: "tilde"] # 0x303 (en: 'tilde embellishment', DeepL translation) - - "̄": [T: "makron"] # 0x304 (en: 'macron embellishment', DeepL translation) - - "̅": [T: "tĂșlszĂĄrnyalĂł dĂ­szĂ­tĂ©s"] # 0x305 (en: 'overbar embellishment', DeepL translation) - - "̆": [T: "rövid"] # 0x306 (DeepL translation) - - "̇": [T: "pont a dĂ­szĂ­tĂ©s felett"] # 0x307 (en: 'dot above embellishment', DeepL translation) - - # Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong - - "Α-Ω": - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "nagy"] # (en: 'cap', DeepL translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - # note: processing of ranges converts '.' into the character, so it needs to be in quotes below - replace: [SPELL: "translate('.', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')"] - - - "α": [T: "alfa"] # 0x3b1 (en: 'alpha', DeepL translation) - - "ÎČ": [T: "bĂ©ta"] # 0x3b2 (en: 'beta', DeepL translation) - - "Îł": [T: "gamma"] # 0x3b3 (DeepL translation) - - "ÎŽ": [T: "delta"] # 0x3b4 (DeepL translation) - - "Δ": [T: "epszilon"] # 0x3b5 (DeepL translation) - - "ζ": [T: "zĂ©ta"] # 0x3b6 (en: 'zeta', DeepL translation) - - "η": [T: "Ă©ta"] # 0x3b7 (DeepL translation) - - "Ξ": [T: "thĂ©ta"] # 0x3b8 (en: 'theta', DeepL translation) - - "Îč": [T: "iĂłta"] # 0x3b9 (DeepL translation) - - "Îș": [T: "kappa"] # 0x3ba (DeepL translation) - - "λ": [T: "lambda"] # 0x3bb (DeepL translation) - - "ÎŒ": [T: "mƱ"] # 0x3bc (DeepL translation) - - "Μ": [T: "nƱ"] # 0x3bd (DeepL translation) - - "Ο": [T: "kszĂ­"] # 0x3be (DeepL translation) - - "Îż": [T: "omikron"] # 0x3bf (en: 'omicron', DeepL translation) - - "π": [T: "pĂ­"] # 0x3c0 (DeepL translation) - - "ρ": [T: "rĂł"] # 0x3c1 (DeepL translation) - - "ς": [T: "szĂłvĂ©gi szigma"] # 0x3c2 (en: 'final sigma', DeepL translation) - - "σ": [T: "szigma"] # 0x3c3 (DeepL translation) - - "τ": [T: "tau"] # 0x3c4 (DeepL translation) - - "υ": [T: "ĂŒpszilon"] # 0x3c5 (DeepL translation) - - "φ": [T: "fĂ­"] # 0x3c6 (DeepL translation) - - "χ": [T: "khĂ­"] # 0x3c7 (DeepL translation) - - "ψ": [T: "pszĂ­"] # 0x3c8 (DeepL translation) - - "ω": [T: "omega"] # 0x3c9 (DeepL translation) - - "ϕ": [T: "phi"] # 0x3d5 (DeepL translation) - - "ϖ": [T: "pĂ­"] # 0x3d6 (DeepL translation) - - "Ï”": [T: "holdkĂłros epszilon"] # 0x3f5 (DeepL translation) - - "϶": [T: "fĂ©lhold alakĂș tĂŒkrözött görög epszilon"] # 0x3f6 (en: 'reversed epsilon', DeepL translation) - - - "
": # 0x2026 - test: - if: - - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" - # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' - # speak '
' as 'and so on...' unless expr starts with '
' - - "../*[1][.='
']" - then: [T: "pont pont pont"] # (en: 'dot dot dot', DeepL translation) - else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' - if: "count(following-sibling::*) = 0" - then: [T: "Ă©s Ă­gy tovĂĄbb"] # (en: 'and so on', DeepL translation) - else: [T: "Ă©s Ă­gy tovĂĄbb egĂ©szen az alĂĄbbi Ă©rtĂ©kig:"] # (en: 'and so on up to', DeepL translation) - - - "⁥": # 0x2061 - - test: - # skip saying "of" when Terse and a trig function, when it is a shape (does this happen?), or we are in :literal mode - if: "not( - ( $Verbosity='Terse' or ($SpeechStyle = 'ClearSpeak' and IsNode(following-sibling::*[1],'simple')) and - preceding-sibling::*[1][IfThenElse($SpeechStyle='ClearSpeak', - IsInDefinition(., 'ClearSpeakTrigFunctionNames'), - IsInDefinition(., 'TrigFunctionNames') )] - ) or - preceding-sibling::*[1][IsInDefinition(., 'GeometryShapes')] or - (@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) - )" - then: [T: ""] # (DeepL translation) - - "⁹": [T: ""] # 0x2062 - - "⁣": [T: "lĂĄthatatlan elvĂĄlasztĂł"] # 0x2063 - - "⁀": [T: "Ă©s"] # 0x2064 (en: 'and', DeepL translation) - - - "ℂℕℚℝ℀": # here we rely on this running through the table again to speak "cap xxx" - - T: "duplĂĄn leĂŒtött" # (en: 'double-struck', DeepL translation) - - SPELL: "translate('.', 'ℂℕℚℝ℀', 'CNQRZ')" - - - "℃": [T: "celsius fok"] # 0x2103 (en: 'degrees celsius', DeepL translation) - - "ℋℛℓ": # 0x210b - - T: "alsĂł index" # (DeepL translation) - - SPELL: "translate('.', 'ℋℛℓ', 'HRl')" - - "ℜ": # 0x211c - - T: "fraktur" # (DeepL translation) - - SPELL: "'R'" - - - "ⅆⅇⅈⅉ": # 0x2146-9 - - T: "duplĂĄn dƑlt betƱs" # (en: 'double-struck italic', DeepL translation) - - SPELL: "translate('.', 'ⅆⅇⅈⅉ', 'deij')" - - - "←": [T: "balra nyĂ­l"] # 0x2190 (en: 'left arrow', DeepL translation) - - "↑": [T: "felfelĂ© nyĂ­l"] # 0x2191 (en: 'up arrow', DeepL translation) - - "→": # 0x2192 - - test: - if: "ancestor::*[2][self::m:limit]" - then: [T: "megközelĂ­tĂ©sek"] # (en: 'approaches', DeepL translation) - else: [T: "jobbra nyĂ­l"] # (en: 'right arrow', DeepL translation) - - - "↓": [T: "lefelĂ© nyĂ­l"] # 0x2193 (en: 'down arrow', DeepL translation) - - "⇒": [T: "dupla jobbranyĂ­l"] # 0x21d2 (en: 'right double arrow', DeepL translation) - - "∂": # 0x2202 - - test: - if: "$Verbosity='Terse'" - then: [T: "rĂ©szleges"] # (en: 'partial', DeepL translation) - else: [T: "parciĂĄlis derivĂĄlt"] # (en: 'partial derivative', DeepL translation) - - "∆": # 0x2206 - - test: - if: "$Verbosity!='Terse'" - then: [T: "a"] # (en: 'the', DeepL translation) - - T: "növekmĂ©nye" # (en: 'laplacian of', DeepL translation) - - "∈": # 0x2208 - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: - - test: - if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" - then: [T: ""] # (en: 'is', DeepL translation) - - T: "eleme ennek:" # (en: 'an element of', DeepL translation) - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: ""] # (DeepL translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "tagja"] # (en: 'member of', DeepL translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "eleme ennek:"] # (en: 'element of', DeepL translation) - - else: [T: "hozzĂĄtartozĂł eleme ennek:"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to', DeepL translation) - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "tagja az alĂĄbbi halmaznak:"] # (en: 'is a member of', DeepL translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "egy eleme ennek:"] # (en: 'is an element of', DeepL translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "benne van ebben:"] # (en: 'is in', DeepL translation) - - else: [T: "ebbe a halmazba tartozik:"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to', DeepL translation) - - "∉": # 0x2209 - # rule is identical to 0x2208 - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', DeepL translation) - - T: "nem eleme ennek:" # (en: 'not an element of', DeepL translation) - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "nincs benne ebben:"] # (en: 'not in', DeepL translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "nem tagja az alĂĄbbi halmaznak:"] # (en: 'not member of', DeepL translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "nem eleme ennek:"] # (en: 'not element of', DeepL translation) - - else: [T: "nem tartozik ebbe:"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'not belonging to', DeepL translation) - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "nem tagja az alĂĄbbi halmaznak:"] # (en: 'is not a member of', DeepL translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "nem eleme ennek:"] # (en: 'is not an element of', DeepL translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "nincs benne az alĂĄbbi halmazban:"] # (en: 'is not in', DeepL translation) - - else: [T: "nem tartozik ebbe:"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'does not belong to', DeepL translation) - - "∊": # 0x220a - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: - - test: - if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" - then: [T: "van"] # (en: 'is', DeepL translation) - - T: "egy eleme" # (en: 'an element of', DeepL translation) - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: ""] # (DeepL translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "tagja ennek:"] # (en: 'member of', DeepL translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "kisbetƱs eleme ennek:"] # (en: 'element of', DeepL translation) - - else: [T: "hozzĂĄtartozĂł eleme ennek:"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to', DeepL translation) - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "nem tagja az alĂĄbbi halmaznak:"] # (en: 'is a member of', DeepL translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "egy eleme ennek:"] # (en: 'is an element of', DeepL translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "benne van ebben:"] # (en: 'is in', DeepL translation) - - else: [T: "ebbe a halmazba tartozik:"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to', DeepL translation) - - "∐": [T: "diszjunkt uniĂł"] # 0x2210 (en: 'co-product', DeepL translation) - - "√": # 0x221a - - test: - if: "$Verbosity!='Terse'" - then: [T: "a"] # (en: 'the', DeepL translation) - - T: "nĂ©gyzetgyöke" # (en: 'square root of', DeepL translation) - - "∝": # 0x221d - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', DeepL translation) - - T: "arĂĄnyos" # (en: 'proportional to', DeepL translation) - - "∄": # 0x2225 - - test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [T: "dupla fĂŒggƑleges vonal"] # (en: 'double vertical line', DeepL translation) - else: - - test: - if: "$Verbosity!='Terse'" - then: [T: "van"] # (en: 'is', DeepL translation) - - T: "pĂĄrhuzamos" # (en: 'parallel to', DeepL translation) - - "∊": # 0x2226 - - test: - if: "$Verbosity!='Terse'" - then: [T: "van"] # (en: 'is', DeepL translation) - - T: "nem pĂĄrhuzamos" # (en: 'not parallel to', DeepL translation) - - "∶": # 0x2236 - - test: - if: "$Verbosity!='Terse'" - then: [T: "van"] # (en: 'is', DeepL translation) - - T: "hogy" # (DeepL translation) - - "∟": # 0x223e - - test: - if: "$Verbosity!='Terse'" - then: [T: "van"] # (en: 'is', DeepL translation) - - T: "legpozitĂ­vabb" # (en: 'most positive', DeepL translation) - - "≠": # 0x2260 - - test: - if: "$Verbosity!='Terse'" - then: [T: "van"] # (en: 'is', DeepL translation) - - T: "nem egyenlƑ" # (en: 'not equal to', DeepL translation) - - "≡": # 0x2261 - - test: - if: "$Verbosity!='Terse'" - then: [T: "van"] # (en: 'is', DeepL translation) - - T: "azonos" # (en: 'identical to', DeepL translation) - - "≀": # 0x2264 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', DeepL translation) - - T: "kisebb vagy egyenlƑ" # (en: 'less than or equal to', DeepL translation) - - "≄": # 0x2265 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] # (en: 'is', DeepL translation) - - T: "nagyobb vagy egyenlƑ" # (en: 'greater than or equal to', DeepL translation) - - "⊂": # 0x2282 - - test: - if: "$Verbosity!='Terse'" - then: [T: "egy"] # (DeepL translation) - - T: "rĂ©szhalmaza" # (en: 'subset of', DeepL translation) - - "⊃": # 0x2283 - - test: - if: "$Verbosity!='Terse'" - then: [T: "egy"] # (DeepL translation) - - T: "szuperhalmaza ennek:" # (en: 'superset of', DeepL translation) - - "⊄": # 0x2284 - - test: - if: "$Verbosity!='Terse'" - then: [T: "egy"] # (en: 'is', DeepL translation) - - T: "nem rĂ©szhalmaza ennek:" # (en: 'not a subset of', DeepL translation) - - "⊅": # 0x2285 - - test: - if: "$Verbosity!='Terse'" - then: [T: "egy"] # (en: 'is', DeepL translation) - - T: "nem szuperhalmaza ennek:" # (DeepL translation) - - "⊆": # 0x2286 - - test: - if: "$Verbosity!='Terse'" - then: [T: "egy"] # (DeepL translation) - - T: "rĂ©szhalmaza vagy egyenlƑ" # (en: 'subset of or equal to', DeepL translation) - - "⊇": # 0x2287 - - test: - if: "$Verbosity!='Terse'" - then: [T: "egy"] # (DeepL translation) - - T: "szuperhalmaza vagy egyenlƑ" # (en: 'superset of or equal to', DeepL translation) - - # --- restored short definitions that differ from unicode-full --- - - "⇒": [T: "dupla jobbranyĂ­l"] # 0x21d2 (en: 'right double arrow', DeepL translation) - - "∐": [T: "diszjunkt uniĂł"] # 0x2210 (en: 'co-product', DeepL translation) - +--- + - "a-z": # audit-ignore + - test: + if: "$TTS='none'" + then: [T: "."] + else: [SPELL: "'.'"] + # Note to translators: + # most languages don't have two ways to pronounce 'a' -- if not need, remove the rules and change "B-Z" to "A-Z" + # some languages say the word for "uppercase" after the letter. Make sure to change that where appropriate by moving some code around + # Capital letters are a little tricky: users can pick their favorite word (something that was requested) and + # screen readers have options to use pitch changes or beeps instead of or in addition to say "cap" + # Also, if a user can see the screen, they probably don't need to hear "cap", but if they specified an override, they must want to hear the override. + # Some languages say the word for "uppercase" after the letter. Make sure to change that where appropriate by moving some code around + - "A-Z": # audit-ignore + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "nagy"] + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + # note: processing of ranges converts '.' into the character, so it needs to be in quotes below + replace: [SPELL: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"] + + - "0-9": [T: "."] # (en: '.', DeepL translation) + + - " ": [T: " "] # 0x20 (DeepL translation) + + - "!": # 0x21 + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then_test: + if: "$Verbosity = 'Terse'" + then: [T: "felkiĂĄltĂłjel"] # 0x21 (DeepL translation) + else: [T: "felkiĂĄltĂłjel"] # 0x21 (en: 'exclamation point', DeepL translation) + else: [T: "faktoriĂĄlis"] # 0x21 (en: 'factorial', DeepL translation) + + - "\"": [T: "idĂ©zƑjel"] # 0x22 (en: 'quotation mark', DeepL translation) + - "#": [T: "kettƑskereszt"] # 0x23 (DeepL translation) + - "$": [T: "dollĂĄr"] # 0x24 (en: 'dollars', DeepL translation) + - "%": [T: "szĂĄzalĂ©k"] # 0x25 (en: 'percent', DeepL translation) + - "&": [T: "zĂĄrĂłjel"] # 0x26 (en: 'ampersand', DeepL translation) + - "'": [T: "aposztrĂłf"] # 0x27 (en: 'apostrophe', DeepL translation) + - "(": # 0x28 + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then_test: + if: "$Verbosity='Terse'" + then: [T: "nyitott zĂĄrĂłjel"] # 0x28 (DeepL translation) + else: [T: "nyitott zĂĄrĂłjel"] # 0x28 (en: 'open paren', DeepL translation) + else: [T: "bal zĂĄrĂłjel"] # 0x28 (en: 'left paren', DeepL translation) + - ")": # 0x29 + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then_test: + if: "$Verbosity='Terse'" + then: [T: "zĂĄrt zĂĄrĂłjel"] # 0x29 (en: 'close', DeepL translation) + else: [T: "zĂĄrt zĂĄrĂłjel"] # 0x29 (en: 'close paren', DeepL translation) + else: [T: "jobb zĂĄrĂłjel"] # 0x29 (en: 'right paren', DeepL translation) + + - "*": # 0x2a + test: + if: "parent::*[name(.)='msup' or name(.)='msubsup' or name(.)='skip-super']" + then: [T: "csillag"] # 0x2a (en: 'star', DeepL translation) + else: [T: "szorozva"] # 0x2a (DeepL translation) + - "+": [T: "plusz"] # 0x2b (en: 'plus', DeepL translation) + - ",": # 0x2c + # the following deals with the interaction of "," with "
" which sometimes wants the ',' to be silent + # that this test is here and not with "
" is not ideal, but seems simplest + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or " + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak "comma" when not adjacent to '
' + - "( following-sibling::*[1][text()!= '
'] and preceding-sibling::*[1][text()!='
'] ) or " + # except if expression starts with '
' + - "../*[1][.='
'] " + then: + - T: "vesszƑ" # (en: 'comma', google translation) + - test: + if: "$Verbosity != Terse" + then: [pause: short] + # else silent + + - "-": [T: "mĂ­nusz"] # 0x2d (en: 'minus', DeepL translation) + - ".": # 0x2e + - test: + if: "parent::*[1][self::m:mn]" + then: [T: "pont"] # (en: 'point', DeepL translation) + else: [T: "pont"] # (en: 'dot', DeepL translation) + - "/": # 0x2f + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "per"] # 0x2f (DeepL translation) + else: [T: "osztva"] # 0x2f (en: 'divided by', DeepL translation) + + - ":": [T: "kettƑspont"] # 0x3a (en: 'colon', DeepL translation) + - ";": [T: "pontosvesszƑ"] # 0x3b (en: 'semicolon', DeepL translation) + - "<": # 0x3c + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', DeepL translation) + - T: "kisebb, mint" # (en: 'less than', DeepL translation) + - "=": # 0x3d + - test: + if: "$Verbosity!='Terse'" + then: [T: "egyenlƑ"] # (en: 'is equal to', DeepL translation) + else: [T: "egyenlƑ"] # (en: 'equals', DeepL translation) + + - ">": # 0x3e + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', DeepL translation) + - T: "nagyobb, mint" # (en: 'greater than', DeepL translation) + - "?": [T: "kĂ©rdƑjel"] # 0x3f (en: 'question mark', DeepL translation) + - "@": [T: "kukac"] # 0x40 (en: 'at sign', DeepL translation) + - "[": # 0x5b + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "nyitott zĂĄrĂłjel"] # (en: 'open bracket', DeepL translation) + else: [T: "bal oldali zĂĄrĂłjel"] # (en: 'left bracket', DeepL translation) + - "\\": [T: "bexles"] # 0x5c (en: 'back slash', DeepL translation) + - "]": # 0x5d + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "zĂĄrĂłjel"] # (en: 'close bracket', DeepL translation) + else: [T: "jobb oldali zĂĄrĂłjel"] # (en: 'right bracket', DeepL translation) + - "^": # 0x5e + - test: + if: "parent::m:modified-variable or parent::m:mover" + then: [T: "kalap"] # (en: 'hat', DeepL translation) + else: [T: "fölfelĂ©nyĂ­l"] # (DeepL translation) + - "_": [T: "alĂĄhĂșzĂĄs"] # 0x5f (en: 'under bar', DeepL translation) + - "`": [T: "sĂșlyozott"] # 0x60 (en: 'grave', DeepL translation) + - "{": # 0x7b + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "nyitott zĂĄrĂłjel"] # (en: 'open brace', DeepL translation) + else: [T: "bal oldali zĂĄrĂłjel"] # (en: 'left brace', DeepL translation) + - "|": # 0x7c + # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' + - with: + variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) + replace: + - test: + - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "fĂŒggƑleges vonal"] # (en: 'vertical line', DeepL translation) + - else_if: "$SpeechStyle != 'ClearSpeak'" + then_test: + - if: "$DefaultToGiven" + then: [T: "adott"] # (en: 'given', DeepL translation) + - else_if: "preceding-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))] and + following-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))]" + then: [T: "osztja"] # (en: 'divides', DeepL translation) + else: [T: "fĂŒggƑleges vonal"] # (en: 'vertical line', DeepL translation) + - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" + then: [T: "fĂŒggƑleges vonal"] # (en: 'vertical line', DeepL translation) + - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" + then: [T: "olyan, hogy"] # (en: 'such that', DeepL translation) + - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" + then: [T: "adott"] # (en: 'given', DeepL translation) + - else: [T: "osztja"] # (en: 'divides', DeepL translation) + + - "}": # 0x7d + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "zĂĄrt zĂĄrĂłjel"] # (en: 'close brace', DeepL translation) + else: [T: "jobb oldali zĂĄrĂłjel"] # (en: 'right brace', DeepL translation) + + - "~": [T: "tilde"] # 0x7e (DeepL translation) + - " ": # 0xa0 + - test: + # could be mtext in mtd or mtext in an mrow that is a concatenation of mtd's. Is there a better solution? + if: "@data-empty-in-2D and not(ancestor::*[self::m:piecewise or self::m:system-of-equations or self::m:lines])" + then: [T: "ĂŒres"] # want to say something for fraction (etc) with empty child (en: 'empty', DeepL translation) + else: [T: ""] + + - "ÂŹ": [T: "logikai nem"] # 0xac (en: 'not', DeepL translation) + - "°": [T: "fok"] # 0xb0 (en: 'degrees', DeepL translation) + - "±": [T: "plusz vagy mĂ­nusz"] # 0xb1 (en: 'plus or minus', DeepL translation) + - "ÂŽ": [T: "Ă©les Ă©kezet"] # 0xb4 (en: 'acute', DeepL translation) + - "·": # 0xB7 + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')] or not($SpeechStyle = 'ClearSpeak' and $ClearSpeak_MultSymbolDot = 'Auto')" + then: [T: "pont"] # (en: 'dot', DeepL translation) + else: [T: "szorozva"] # (DeepL translation) + - "×": # 0xd7 + - test: + if: "$SpeechStyle = 'ClearSpeak'" + then_test: + - if: "$ClearSpeak_MultSymbolX = 'Auto'" + then: [T: "szorozva"] # (DeepL translation) + - else_if: "$ClearSpeak_MultSymbolX = 'By'" + then: [T: "szorozva"] # (DeepL translation) + else: [T: "kereszt"] # (en: 'cross', DeepL translation) + else_test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "kereszt"] # (en: 'cross', DeepL translation) + else: [T: "szorozva"] # (DeepL translation) + + - "Ă·": [T: "osztva"] # 0xf7 (en: 'divided by', DeepL translation) + - "̀": [T: "sĂșlyos Ă©kezet dĂ­szĂ­tĂ©s"] # 0x300 (en: 'grave accent embellishment', DeepL translation) + - "́": [T: "akut Ă©kezet dĂ­szĂ­tĂ©s"] # 0x301 (en: 'acute accent embellishment', DeepL translation) + - "̂": [T: "cirkumflex Ă©kezet dĂ­szĂ­tĂ©s"] # 0x302 (en: 'circumflex accent embellishment', DeepL translation) + - "̃": [T: "tilde"] # 0x303 (en: 'tilde embellishment', DeepL translation) + - "̄": [T: "makron"] # 0x304 (en: 'macron embellishment', DeepL translation) + - "̅": [T: "tĂșlszĂĄrnyalĂł dĂ­szĂ­tĂ©s"] # 0x305 (en: 'overbar embellishment', DeepL translation) + - "̆": [T: "rövid"] # 0x306 (DeepL translation) + - "̇": [T: "pont a dĂ­szĂ­tĂ©s felett"] # 0x307 (en: 'dot above embellishment', DeepL translation) + + # Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong + - "Α-Ω": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "nagy"] # (en: 'cap', DeepL translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + # note: processing of ranges converts '.' into the character, so it needs to be in quotes below + replace: [SPELL: "translate('.', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')"] + + - "α": [T: "alfa"] # 0x3b1 (en: 'alpha', DeepL translation) + - "ÎČ": [T: "bĂ©ta"] # 0x3b2 (en: 'beta', DeepL translation) + - "Îł": [T: "gamma"] # 0x3b3 (DeepL translation) + - "ÎŽ": [T: "delta"] # 0x3b4 (DeepL translation) + - "Δ": [T: "epszilon"] # 0x3b5 (DeepL translation) + - "ζ": [T: "zĂ©ta"] # 0x3b6 (en: 'zeta', DeepL translation) + - "η": [T: "Ă©ta"] # 0x3b7 (DeepL translation) + - "Ξ": [T: "thĂ©ta"] # 0x3b8 (en: 'theta', DeepL translation) + - "Îč": [T: "iĂłta"] # 0x3b9 (DeepL translation) + - "Îș": [T: "kappa"] # 0x3ba (DeepL translation) + - "λ": [T: "lambda"] # 0x3bb (DeepL translation) + - "ÎŒ": [T: "mƱ"] # 0x3bc (DeepL translation) + - "Μ": [T: "nƱ"] # 0x3bd (DeepL translation) + - "Ο": [T: "kszĂ­"] # 0x3be (DeepL translation) + - "Îż": [T: "omikron"] # 0x3bf (en: 'omicron', DeepL translation) + - "π": [T: "pĂ­"] # 0x3c0 (DeepL translation) + - "ρ": [T: "rĂł"] # 0x3c1 (DeepL translation) + - "ς": [T: "szĂłvĂ©gi szigma"] # 0x3c2 (en: 'final sigma', DeepL translation) + - "σ": [T: "szigma"] # 0x3c3 (DeepL translation) + - "τ": [T: "tau"] # 0x3c4 (DeepL translation) + - "υ": [T: "ĂŒpszilon"] # 0x3c5 (DeepL translation) + - "φ": [T: "fĂ­"] # 0x3c6 (DeepL translation) + - "χ": [T: "khĂ­"] # 0x3c7 (DeepL translation) + - "ψ": [T: "pszĂ­"] # 0x3c8 (DeepL translation) + - "ω": [T: "omega"] # 0x3c9 (DeepL translation) + - "ϕ": [T: "phi"] # 0x3d5 (DeepL translation) + - "ϖ": [T: "pĂ­"] # 0x3d6 (DeepL translation) + - "Ï”": [T: "holdkĂłros epszilon"] # 0x3f5 (DeepL translation) + - "϶": [T: "fĂ©lhold alakĂș tĂŒkrözött görög epszilon"] # 0x3f6 (en: 'reversed epsilon', DeepL translation) + + - "
": # 0x2026 + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak '
' as 'and so on...' unless expr starts with '
' + - "../*[1][.='
']" + then: [T: "pont pont pont"] # (en: 'dot dot dot', DeepL translation) + else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' + if: "count(following-sibling::*) = 0" + then: [T: "Ă©s Ă­gy tovĂĄbb"] # (en: 'and so on', DeepL translation) + else: [T: "Ă©s Ă­gy tovĂĄbb egĂ©szen az alĂĄbbi Ă©rtĂ©kig:"] # (en: 'and so on up to', DeepL translation) + + - "⁥": # 0x2061 + - test: + # skip saying "of" when Terse and a trig function, when it is a shape (does this happen?), or we are in :literal mode + if: "not( + ( $Verbosity='Terse' or ($SpeechStyle = 'ClearSpeak' and IsNode(following-sibling::*[1],'simple')) and + preceding-sibling::*[1][IfThenElse($SpeechStyle='ClearSpeak', + IsInDefinition(., 'ClearSpeakTrigFunctionNames'), + IsInDefinition(., 'TrigFunctionNames') )] + ) or + preceding-sibling::*[1][IsInDefinition(., 'GeometryShapes')] or + (@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) + )" + then: [T: ""] # (DeepL translation) + - "⁹": [T: ""] # 0x2062 + - "⁣": [T: "lĂĄthatatlan elvĂĄlasztĂł"] # 0x2063 + - "⁀": [T: "Ă©s"] # 0x2064 (en: 'and', DeepL translation) + + - "ℂℕℚℝ℀": # here we rely on this running through the table again to speak "cap xxx" + - T: "duplĂĄn leĂŒtött" # (en: 'double-struck', DeepL translation) + - SPELL: "translate('.', 'ℂℕℚℝ℀', 'CNQRZ')" + + - "℃": [T: "celsius fok"] # 0x2103 (en: 'degrees celsius', DeepL translation) + - "ℋℛℓ": # 0x210b + - T: "alsĂł index" # (DeepL translation) + - SPELL: "translate('.', 'ℋℛℓ', 'HRl')" + - "ℜ": # 0x211c + - T: "fraktur" # (DeepL translation) + - SPELL: "'R'" + + - "ⅆⅇⅈⅉ": # 0x2146-9 + - T: "duplĂĄn dƑlt betƱs" # (en: 'double-struck italic', DeepL translation) + - SPELL: "translate('.', 'ⅆⅇⅈⅉ', 'deij')" + + - "←": [T: "balra nyĂ­l"] # 0x2190 (en: 'left arrow', DeepL translation) + - "↑": [T: "felfelĂ© nyĂ­l"] # 0x2191 (en: 'up arrow', DeepL translation) + - "→": # 0x2192 + - test: + if: "ancestor::*[2][self::m:limit]" + then: [T: "megközelĂ­tĂ©sek"] # (en: 'approaches', DeepL translation) + else: [T: "jobbra nyĂ­l"] # (en: 'right arrow', DeepL translation) + + - "↓": [T: "lefelĂ© nyĂ­l"] # 0x2193 (en: 'down arrow', DeepL translation) + - "⇒": [T: "dupla jobbranyĂ­l"] # 0x21d2 (en: 'right double arrow', DeepL translation) + - "∂": # 0x2202 + - test: + if: "$Verbosity='Terse'" + then: [T: "rĂ©szleges"] # (en: 'partial', DeepL translation) + else: [T: "parciĂĄlis derivĂĄlt"] # (en: 'partial derivative', DeepL translation) + - "∆": # 0x2206 + - test: + if: "$Verbosity!='Terse'" + then: [T: "a"] # (en: 'the', DeepL translation) + - T: "növekmĂ©nye" # (en: 'laplacian of', DeepL translation) + - "∈": # 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: + - test: + if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" + then: [T: ""] # (en: 'is', DeepL translation) + - T: "eleme ennek:" # (en: 'an element of', DeepL translation) + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: ""] # (DeepL translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "tagja"] # (en: 'member of', DeepL translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "eleme ennek:"] # (en: 'element of', DeepL translation) + - else: [T: "hozzĂĄtartozĂł eleme ennek:"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to', DeepL translation) + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "tagja az alĂĄbbi halmaznak:"] # (en: 'is a member of', DeepL translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "egy eleme ennek:"] # (en: 'is an element of', DeepL translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "benne van ebben:"] # (en: 'is in', DeepL translation) + - else: [T: "ebbe a halmazba tartozik:"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to', DeepL translation) + - "∉": # 0x2209 + # rule is identical to 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', DeepL translation) + - T: "nem eleme ennek:" # (en: 'not an element of', DeepL translation) + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "nincs benne ebben:"] # (en: 'not in', DeepL translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "nem tagja az alĂĄbbi halmaznak:"] # (en: 'not member of', DeepL translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "nem eleme ennek:"] # (en: 'not element of', DeepL translation) + - else: [T: "nem tartozik ebbe:"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'not belonging to', DeepL translation) + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "nem tagja az alĂĄbbi halmaznak:"] # (en: 'is not a member of', DeepL translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "nem eleme ennek:"] # (en: 'is not an element of', DeepL translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "nincs benne az alĂĄbbi halmazban:"] # (en: 'is not in', DeepL translation) + - else: [T: "nem tartozik ebbe:"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'does not belong to', DeepL translation) + - "∊": # 0x220a + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: + - test: + if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" + then: [T: "van"] # (en: 'is', DeepL translation) + - T: "egy eleme" # (en: 'an element of', DeepL translation) + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: ""] # (DeepL translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "tagja ennek:"] # (en: 'member of', DeepL translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "kisbetƱs eleme ennek:"] # (en: 'element of', DeepL translation) + - else: [T: "hozzĂĄtartozĂł eleme ennek:"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to', DeepL translation) + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: "nem tagja az alĂĄbbi halmaznak:"] # (en: 'is a member of', DeepL translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "egy eleme ennek:"] # (en: 'is an element of', DeepL translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "benne van ebben:"] # (en: 'is in', DeepL translation) + - else: [T: "ebbe a halmazba tartozik:"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to', DeepL translation) + - "∐": [T: "diszjunkt uniĂł"] # 0x2210 (en: 'co-product', DeepL translation) + - "√": # 0x221a + - test: + if: "$Verbosity!='Terse'" + then: [T: "a"] # (en: 'the', DeepL translation) + - T: "nĂ©gyzetgyöke" # (en: 'square root of', DeepL translation) + - "∝": # 0x221d + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', DeepL translation) + - T: "arĂĄnyos" # (en: 'proportional to', DeepL translation) + - "∄": # 0x2225 + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "dupla fĂŒggƑleges vonal"] # (en: 'double vertical line', DeepL translation) + else: + - test: + if: "$Verbosity!='Terse'" + then: [T: "van"] # (en: 'is', DeepL translation) + - T: "pĂĄrhuzamos" # (en: 'parallel to', DeepL translation) + - "∊": # 0x2226 + - test: + if: "$Verbosity!='Terse'" + then: [T: "van"] # (en: 'is', DeepL translation) + - T: "nem pĂĄrhuzamos" # (en: 'not parallel to', DeepL translation) + - "∶": # 0x2236 + - test: + if: "$Verbosity!='Terse'" + then: [T: "van"] # (en: 'is', DeepL translation) + - T: "hogy" # (DeepL translation) + - "∟": # 0x223e + - test: + if: "$Verbosity!='Terse'" + then: [T: "van"] # (en: 'is', DeepL translation) + - T: "legpozitĂ­vabb" # (en: 'most positive', DeepL translation) + - "≠": # 0x2260 + - test: + if: "$Verbosity!='Terse'" + then: [T: "van"] # (en: 'is', DeepL translation) + - T: "nem egyenlƑ" # (en: 'not equal to', DeepL translation) + - "≡": # 0x2261 + - test: + if: "$Verbosity!='Terse'" + then: [T: "van"] # (en: 'is', DeepL translation) + - T: "azonos" # (en: 'identical to', DeepL translation) + - "≀": # 0x2264 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', DeepL translation) + - T: "kisebb vagy egyenlƑ" # (en: 'less than or equal to', DeepL translation) + - "≄": # 0x2265 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] # (en: 'is', DeepL translation) + - T: "nagyobb vagy egyenlƑ" # (en: 'greater than or equal to', DeepL translation) + - "⊂": # 0x2282 + - test: + if: "$Verbosity!='Terse'" + then: [T: "egy"] # (DeepL translation) + - T: "rĂ©szhalmaza" # (en: 'subset of', DeepL translation) + - "⊃": # 0x2283 + - test: + if: "$Verbosity!='Terse'" + then: [T: "egy"] # (DeepL translation) + - T: "szuperhalmaza ennek:" # (en: 'superset of', DeepL translation) + - "⊄": # 0x2284 + - test: + if: "$Verbosity!='Terse'" + then: [T: "egy"] # (en: 'is', DeepL translation) + - T: "nem rĂ©szhalmaza ennek:" # (en: 'not a subset of', DeepL translation) + - "⊅": # 0x2285 + - test: + if: "$Verbosity!='Terse'" + then: [T: "egy"] # (en: 'is', DeepL translation) + - T: "nem szuperhalmaza ennek:" # (DeepL translation) + - "⊆": # 0x2286 + - test: + if: "$Verbosity!='Terse'" + then: [T: "egy"] # (DeepL translation) + - T: "rĂ©szhalmaza vagy egyenlƑ" # (en: 'subset of or equal to', DeepL translation) + - "⊇": # 0x2287 + - test: + if: "$Verbosity!='Terse'" + then: [T: "egy"] # (DeepL translation) + - T: "szuperhalmaza vagy egyenlƑ" # (en: 'superset of or equal to', DeepL translation) + + # --- restored short definitions that differ from unicode-full --- + - "⇒": [T: "dupla jobbranyĂ­l"] # 0x21d2 (en: 'right double arrow', DeepL translation) + - "∐": [T: "diszjunkt uniĂł"] # 0x2210 (en: 'co-product', DeepL translation) + diff --git a/Rules/Languages/nb/unicode-full.yaml b/Rules/Languages/nb/unicode-full.yaml index b4ad93780..b100bd8dc 100644 --- a/Rules/Languages/nb/unicode-full.yaml +++ b/Rules/Languages/nb/unicode-full.yaml @@ -1,3671 +1,3671 @@ ---- - -#C1 Controls and Latin-1 Supplement OK - - "Âą": [T: "cent"] # 0xa2 (en: 'cents') - - "ÂŁ": [T: "pund"] # 0xa3 (en: 'pounds') - - "€": [T: "valutategn"] # 0xa4 (en: 'currency sign') - - "„": [T: "yen"] # 0xa5 - - "Š": [T: "brutt vertikalstrek"] # 0xa6 (en: 'broken bar') - - "§": [T: "paragraf"] # 0xa7 (en: 'section') - - "š": [T: "trema"] # 0xa8 (en: 'double dot', MathPlayer: 'trema', google: 'dubbel prick') - - "©": [T: "opphavsrett"] # 0xa9 (en: 'copyright') - - "ÂȘ": [T: "feminin ordenstallindikator"] # 0xaa (en: 'feminine ordinal indicator', MathPlayer: 'feminine ordinal indicator', google: 'feminin ordinĂ€r indikator') - - "«": [T: "venstre sitattegn"] # 0xab (en: 'left-pointing double angle quote mark') - - "ÂŻ": # 0xaf - - test: - if: "ancestor::m:modified-variable and preceding-sibling::*[1][self::m:mi]" - then: [T: "bar"] # (google translation) - else: [T: "strek"] # (en: 'line') - - "ÂČ": [T: "i andre"] # 0xb2 (en: 'two', MathPlayer: 'exponent tvĂ„', google: 'tvĂ„') - - "Âł": [T: "i tredje"] # 0xb3 (en: 'three', MathPlayer: 'exponent tre', google: 'tre') - - "”": [T: "mikro"] # 0xb5 (en: 'micro') - - "Âč": [T: "eksponent Ă©n"] # 0xb9 (en: 'one', google: 'ett') - - "Âș": [T: "maskulin ordenstallindikator"] # 0xba (en: 'masculine ordinal indicator', MathPlayer: 'masculine ordinal indicator', google: 'maskulina ordinĂ€ra indikatorer') - - "ÂĄ": [T: "omvendt utropstegn"] # 0xa1 - - "¶": [T: "paragraftegn"] # 0xb6 - - "Âż": [T: "omvendt spĂžrsmĂ„lstegn"] # 0xbf - #------------------------------------------------------------------------------------------------------- - # SWEDISH: The Swedish character translations are based on the placement and appearance of the characters rather than their function, as function might be context-dependent. Placement above is used as the baseline, and low characters are translated as "lĂ„g(t)" (eng "low"). In most cases, no difference has been made in the translation between non-combining, modifier (Spacing Modifier Letters), and combining/embellishment characters. However, in the case of alphabetical letters and punctuation marks as modifier characters (such as modifier small h or comma embellishment), the construction "med ...( efter)" (eng "with ...( placed after it)") is used to prevent any possible ambiguity. - # Norwegian: Same as Swedish -#Spacing Modifier Letters -#Latin superscript modifier letters OK - - "ʰ": [T: "med liten h etter"] # 0x2b0 (en: 'modifier small h', google translation) - - "ʱ": [T: "med liten h med krok etter"] # 0x2b1 (en: 'modifier small h with hook', google translation) - - "ÊČ": [T: "med liten j etter"] # 0x2b2 (en: 'modifier small j', google translation) - - "Êł": [T: "med liten r etter"] # 0x2b3 (en: 'modifier small r', google translation) - - "ÊŽ": [T: "med liten rotert r etter"] # 0x2b4 (en: 'modifier small turned r', google translation) - - "Ê”": [T: "med liten rotert r med krok etter"] # 0x2b5 (en: 'modifier small turned r with hook', google translation) - - "ʶ": # 0x2b6 - - T: "med liten rotert" # (en: 'modifier small inverted', google translation) - - SPELL: "translate('R', 'R', 'R')" - - "Ê·": [T: "med liten w etter"] # 0x2b7 (en: 'modifier small w', google translation) - - "Êž": [T: "med liten y etter"] # 0x2b8 (en: 'modifier small y', google translation) - #-------------------------- - #Miscellaneous phonetic modifiers OK - - "Êč": [T: "primtegn"] # 0x2b9 (en: 'modifier prime', google: 'modifier prime') - - "Êș": [T: "dobbelt primtegn"] # 0x2ba (en: 'modifier double prime', google: 'modifier double prime') - - "Ê»": [T: "rotert komma"] # 0x2bb (en: 'modifier turned comma', google translation) - - "ÊŒ": [T: "apostrof"] # 0x2bc (google translation) - - "Êœ": [T: "speilvendt komma"] # 0x2bd (en: 'modifier reversed comma', google translation) - - "ÊŸ": [T: "hĂžyrevendt halv ring"] # 0x2be (en: 'modifier right half ring', google: 'modifierare höger halva ring') - - "Êż": [T: "venstrevendt halv ring"] # 0x2bf (en: 'modifier left half ring', google: 'modifierare lĂ€mnade halva ringen') - - "ˀ": [T: "glottal plosiv"] # 0x2c0 (google translation) - - "ˁ": [T: "speilvendt glottal plosiv"] # 0x2c1 (en: 'modifier reversed glottal stop', google translation) - - "˂": [T: "venstrevendt pilspiss"] # 0x2c2 (en: 'modifier left arrowhead', google translation) - - "˃": [T: "hĂžyrevendt pilspiss"] # 0x2c3 (en: 'modifier right arrowhead', google translation) - - "˄": [T: "oppovervendt pilspiss"] # 0x2c4 (en: 'modifier up arrowhead', google translation) - - "˅": [T: "nedovervendt pilspiss"] # 0x2c5 (en: 'modifier down arrowhead', google translation) - - "ˆ": [T: "cirkumfleks"] # 0x2c6 (en: 'modifier circumflex accent', google: 'modifiercirumflex accent') - - "ˇ": [T: "hake"] # 0x2c7 (en: 'caron', google: 'caron') - - "ˈ": [T: "vertikal strek"] # 0x2c8 (en: 'modifier vertical line', google translation) - - "ˉ": [T: "makron"] # 0x2c9 (google translation) - - "ˊ": [T: "akutt aksent"] # 0x2ca (en: 'modifier acute accent', google translation) - - "ˋ": [T: "grav aksent"] # 0x2cb (en: 'modifier grave accent', google translation) - - "ˌ": [T: "lav vertikal strek"] # 0x2cc (en: 'modifier low vertical line', google translation) - - "ˍ": [T: "lav makron"] # 0x2cd (google translation) - - "ˎ": [T: "lav grav aksent"] # 0x2ce (en: 'modifier low grave accent', google translation) - - "ˏ": [T: "lav akutt aksent"] # 0x2cf (en: 'modifier low acute accent', google translation) - - "ː": [T: "kolon lengdetegn"] # 0x2d0 (en: 'modifier triangular colon', google translation) - - "ˑ": [T: "halvt kolon lengdetegn"] # 0x2d1 (en: 'modifier half triangular colon', google translation) - - "˒": [T: "lav hĂžyrevendt halv ring"] # 0x2d2 (en: 'modifier centered right half ring', google translation) - - "˓": [T: "lav venstrevendt halv ring"] # 0x2d3 (en: 'modifier centered left half ring', google translation) - - "˔": [T: "lavt oppovervendt dreiekors"] # 0x2d4 (en: 'modifier up tadck', google translation) - - "˕": [T: "lavt nedovervendt dreiekors"] # 0x2d5 (en: 'modifier down tack', google translation) - - "˖": [T: "lavt plusstegn"] # 0x2d6 (google translation) - - "˗": [T: "lavt minustegn"] # 0x2d7 (en: 'modifier minus sign', google translation) - #---------------------------- - #Spacing clones of diacritics OK - - "˘": [T: "breve"] # 0x2d8 (en: 'breve') - - "˙": [T: "prikk"] # 0x2d9 (en: 'dot') - - "˚": [T: "ring"] # 0x2da (en: 'ring above') - - "˛": [T: "kvist"] # 0x2db (en: 'ogonek') - - "˜": [T: "liten tilde"] # 0x2dc (en: 'small tilde') - - "˝": [T: "dobbel akutt aksent"] # 0x2dd (en: 'double acute accent') - #----------------------------- - #Additions based on 1989 IPA OK - - "˞": [T: "rotisk hake"] # 0x2de (google translation) - - "˟": [T: "kryssaksent"] # 0x2df (en: 'modifier cross accent', google translation) - - "Ë ": [T: "med liten gamma etter"] # 0x2e0 (en: 'modifier small gamma', google translation) - - "ËĄ": [T: "med liten l etter"] # 0x2e1 (en: 'modifier small l', google translation) - - "Ëą": [T: "med liten s etter"] # 0x2e2 (google translation) - - "ËŁ": [T: "med liten x etter"] # 0x2e3 (en: 'modifier small x', google translation) - - "Ë€": [T: "liten speilvendt glottal plosiv"] # 0x2e4 (google translation) - #----------------------------- - #Tone letters OK - - "Ë„": [T: "ekstra hĂžyt tonetegn"] # 0x2e5 (en: 'modifier extra-high tone bar', google translation) - - "ËŠ": [T: "hĂžyt tonetegn"] # 0x2e6 (google translation) - - "˧": [T: "mellom-tonetegn"] # 0x2e7 (en: 'modifier mid tone bar', google translation) - - "Ëš": [T: "lavt tonetegn"] # 0x2e8 (en: 'modifier low tone bar', google translation) - - "Ë©": [T: "ekstra lavt tonetegn"] # 0x2e9 (en: 'modifier extra-low tone bar', google translation) - #----------------------------- - #Extended Bopomofo tone marks OK - - "ËȘ": [T: "mĂžrkt fallende tonetegn"] # 0x2ea (en: 'modifier yin departing tone mark', google translation) - - "Ë«": [T: "lyst fallende tonetegn"] # 0x2eb (en: 'modifier yang departing tone mark', google translation) - #--------------------------- - #IPA modifiers OK - - "ËŹ": [T: "lavt tonende tegn"] # 0x2ec (en: 'modifier voicing', google translation) - - "Ë­": [T: "ikke aspirert tegn"] # 0x2ed (en: 'modifier unaspirated', google translation) - #------------------------- - #Other modifier letter OK - - "Ëź": [T: "dobbel apostrof"] # 0x2ee (en: 'modifier double apostrophe', google translation) - #---------------------------- - #UPA modifiers OK - - "ËŻ": [T: "lav nedoverpekende pilspiss"] # 0x2ef (en: 'modifier low down arrowhead', google translation) - - "˰": [T: "lav oppoverpekende pilspiss"] # 0x2f0 (google translation) - - "˱": [T: "lav venstrepekende pilspiss"] # 0x2f1 (en: 'modifier low left arrowhead', google translation) - - "ËČ": [T: "lav hĂžyrepekende pilspiss"] # 0x2f2 (en: 'modifier low right arrowhead', google translation) - - "Ëł": [T: "lav ring"] # 0x2f3 (en: 'modifier low ring', google translation) - - "ËŽ": [T: "lav grav aksent"] # 0x2f4 (google translation) - - "Ë”": [T: "lav dobbel grav aksent"] # 0x2f5 (en: 'modifier middle double grave accent', google translation) - - "˶": [T: "lav dobbel akutt aksent"] # 0x2f6 (en: 'modifier middle double acute accent', google translation) - - "Ë·": [T: "lav tilde"] # 0x2f7 (en: 'modifier low tilde', google translation) - - "Ëž": [T: "hevet kolon"] # 0x2f8 (en: 'modifier raised colon', google translation) - - "Ëč": [T: "start hĂžy tone"] # 0x2f9 (en: 'modifier begin high tone', google translation) - - "Ëș": [T: "slutt hĂžy tone"] # 0x2fa (en: 'modifier end high tone', google translation) - - "Ë»": [T: "start lav tone"] # 0x2fb (en: 'modifier begin low tone', google translation) - - "ËŒ": [T: "slutt lav tone"] # 0x2fc (en: 'modifier end low tone', google translation) - - "Ëœ": [T: "lav hylle"] # 0x2fd (en: 'modifier shelf', google translation) - - "ËŸ": [T: "lav Ă„pen hylle"] # 0x2fe (en: 'modifier open shelf', google translation) - - "Ëż": [T: "lav venstrepil"] # 0x2ff (en: 'modifier low left arrow', google translation) - #--------------------------------------------------------------------------------------------------------- - #Combining Diacritical Marks - #Ordinary diacritics OK - - "̈": [T: "trema"] # 0x308 (en: 'diaeresis embellishment', google: 'diaeresis utsmyckning') - - "̉": [T: "krok"] # 0x309 (en: 'hook above embellishment', google translation) - - "̊": [T: "ring"] # 0x30a (en: 'ring above embellishment', google: 'ring över utsmyckning') - - "̋": [T: "dobbel akutt aksent"] # 0x30b (en: 'double acute accent embellishment', google translation) - - "̌": [T: "hake"] # 0x30c (en: 'check', google: 'kolla upp') - - "̍": [T: "vertikal linje"] # 0x30d (en: 'vertical line above embellishment', google translation) - - "̎": [T: "dobbel vertikal linje"] # 0x30e (en: 'double vertical line above embellishment', google translation) - - "̏": [T: "dobbel grav aksent"] # 0x30f (en: 'double grave accent embellishment', google translation) - - "̐": [T: "Chandrabindu"] # 0x310 (en: 'candrabindu embellishment', google translation) - - "̑": [T: "omvendt breve"] # 0x311 (en: 'inverted breve embellishment', google: 'inverterad breve -utsmyckning') - - "̒": [T: "med rotert komma"] # 0x312 (en: 'turned comma above embellishment', google translation) - - "̓": [T: "med komma"] # 0x313 (en: 'comma above embellishment', google translation) - - "̔": [T: "med omvendt komma"] # 0x314 (en: 'reversed comma above embellishment', google translation) - - "̕": [T: "med hĂžyrestilt komma"] # 0x315 (en: 'comma above right embellishment', google translation) - - "̖": [T: "lav grav aksent"] # 0x316 (en: 'grave accent below embellishment', google translation) - - "̗": [T: "lav akutt aksent"] # 0x317 (en: 'acute accent below embellishment', google translation) - - "̘": [T: "lavt venstre dreiekors"] # 0x318 (en: 'left tack below embellishment', google translation) - - "̙": [T: "lavt hĂžyre dreiekors"] # 0x319 (en: 'right tack below embellishment', google translation) - - "̚": [T: "venstrevendt vinkeltegn"] # 0x31a (en: 'left angle above embellishment', google translation) - - "̛": [T: "horn"] # 0x31b (en: 'horn embellishment', google translation) - - "̜": [T: "lav venstrevendt halvring"] # 0x31c (en: 'left half ring below embellishment', google translation) - - "̝": [T: "lavt oppoverrotert dreiekors"] # 0x31d (en: 'up tack below embellishment', google translation) - - "̞": [T: "lavt nedoverrotert dreiekors"] # 0x31e (en: 'down tack below embellishment', google translation) - - "̟": [T: "lav pluss"] # 0x31f (en: 'plus sign below embellishment', google translation) - - "Ì ": [T: "lav minus"] # 0x320 (en: 'minus sign below embellishment', google translation) - - "ÌĄ": [T: "palatal krok"] # 0x321 (en: 'palatalized hook below embellishment', google translation) - - "Ìą": [T: "retrofleks krok"] # 0x322 (en: 'retroflex hook below embellishment', google translation) - - "ÌŁ": [T: "lav prikk"] # 0x323 (google: 'prick under utsmyckningen') - - "Ì€": [T: "lav trema"] # 0x324 (en: 'diaeresis below embellishment', google: 'diaeres under utsmyckning') - - "Ì„": [T: "lav ring"] # 0x325 (en: 'ring below embellishment', google translation) - - "ÌŠ": [T: "lavt komma"] # 0x326 (en: 'comma below embellishment', google translation) - - "̧": [T: "lav cĂ©dille"] # 0x327 (en: 'cedilla embellishment', google: 'cedilla -utsmyckning') - - "Ìš": [T: "lav kvist"] # 0x328 (en: 'ogonek embellishment', google translation) - - "Ì©": [T: "lav vertikal strek"] # 0x329 (en: 'vertical line below embellishment', google translation) - - "ÌȘ": [T: "lav bro"] # 0x32a (en: 'bridge below embellishment', google translation) - - "Ì«": [T: "lav omvendt dobbel bue"] # 0x32b (en: 'inverted double arch below embellishment', google translation) - - "ÌŹ": [T: "lav hake"] # 0x32c (en: 'caron below embellishment', google translation) - - "Ì­": [T: "lav omvendt cirkumfleks"] # 0x32d (en: 'circumflex accent below embellishment', google translation) - - "Ìź": [T: "lav breve"] # 0x32e (en: 'breve below embellishment', google: 'breve under utsmyckning') - - "ÌŻ": [T: "lav omvendt breve"] # 0x32f (en: 'inverted breve below embellishment', google translation) - - "̰": [T: "lav tilde"] # 0x330 (en: 'tilde below embellishment', google: 'tilde under utsmyckning') - - "̱": [T: "lav makron"] # 0x331 (en: 'macron below embellishment', google: 'macron under utsmyckning') - - "ÌČ": [T: "lav strek"] # 0x332 (en: 'low line embellishment', google: 'lĂ„g linje utsmyckning') - - "Ìł": [T: "lav dobbeltstrek"] # 0x333 (en: 'double low line embellishment', google translation) - #------------------------------------------ - #Overstruck diacritics OK - - "ÌŽ": [T: "tilde i midten"] # 0x334 (en: 'tilde overlay embellishment', google translation) - - "Ì”": [T: "strek i midten"] # 0x335 (en: 'short stroke overlay embellishment', google translation) - - "̶": [T: "lang strek i midten"] # 0x336 (en: 'long stroke overlay embellishment', google translation) - - "Ì·": [T: "med kort skrĂ„strek"] # 0x337 (en: 'short solidus overlay embellishment', google translation) - - "Ìž": [T: "med lang skrĂ„strek"] # 0x338 (en: 'long solidus overlay embellishment', google: 'long solidus overlay embelling') - #------------------------------------ - #Miscellaneous additions OK - - "Ìč": [T: "lav hĂžyrevendt halvring"] # 0x339 (en: 'right half ring below embellishment', google translation) - - "Ìș": [T: "lav omvendt bro"] # 0x33a (en: 'inverted bridge below embellishment', google translation) - - "Ì»": [T: "lavt kvadrat"] # 0x33b (en: 'square below embellishment', google translation) - - "ÌŒ": [T: "lavt mĂ„ketegn"] # 0x33c (en: 'seagull below embellishment', google translation) - - "Ìœ": [T: "med x over"] # 0x33d (en: 'x above embellishment', google translation) - - "ÌŸ": [T: "vertikal tilde"] # 0x33e (en: 'vertical tilde embellishment', google translation) - - "Ìż": [T: "dobbel strek"] # 0x33f (en: 'double overline embellishment', google translation) - - "̀": [T: "grav tone"] # 0x340 (en: 'grave tone mark embellishment', google translation) - - "́": [T: "akutt tone"] # 0x341 (en: 'acute tone mark embellishment', google translation) - - "͆": [T: "bro"] # 0x346 -#---------------------------------------------------------------------------------------------------------------- -# Greek and Coptic OK - - "ÎȘΫϏ": # 0x3aa, 0x3ab, 0x3cf - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "stor"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [SPELL: "translate('.', 'ÎȘΫϏ', 'Îčυϗ')"] - - T: "med dialytika" # (en: 'with dialytika', google translation) - - "ϊ": [T: "iota med dialytika"] # 0x3ca (en: 'iota with dialytika', google translation) - - "ϋ": [T: "ypsilon med dialytika"] # 0x3cb (en: 'upsilon with dialytika', google translation) - - "ό": [T: "omikron med tonos"] # 0x3cc (en: 'omicron with tonos', google translation) - - "ύ": [T: "ypsilon med tonos"] # 0x3cd (en: 'upsilon with tonos', google translation) - - "ώ": [T: "omega med tonos"] # 0x3ce (en: 'omega with tonos', google translation) - - "ϐ": [T: "beta"] # 0x3d0 (en: 'beta') - - "ϑ": [T: "theta"] # 0x3d1 (en: 'theta', google: 'theta') - - "ϒ": [T: "ypsilon med krok"] # 0x3d2 (en: 'upsilon with hook', google: 'upsilon med krok') - - "ϓ": [T: "ypsilon med akutt aksent og krok"] # 0x3d3 (en: 'upsilon with acute and hook', google translation) - - "ϔ": [T: "ypsilon med trema og krok"] # 0x3d4 (en: 'upsilon with diaeresis and hook', google translation) - - "ϗ": [T: "kai"] # 0x3d7 (en: 'kai') - - "Ϙ": [T: "stor arkaisk koppa"] # 0x3d8 - - "ϙ": [T: "arkaisk koppa"] # 0x3d9 - - "А-ĐŻ": # 0x410 - 0x42f - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "stor"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [SPELL: "translate('.', 'ĐĐ‘Đ’Đ“Đ”Đ•Đ–Đ—Đ˜Đ™ĐšĐ›ĐœĐĐžĐŸĐ ĐĄĐąĐŁĐ€Đ„ĐŠĐ§ĐšĐ©ĐȘЫЏЭПЯ', 'абĐČгЎДжзОĐčĐșĐ»ĐŒĐœĐŸĐżŃ€ŃŃ‚ŃƒŃ„Ń…Ń†Ń‡ŃˆŃ‰ŃŠŃ‹ŃŒŃŃŽŃ')", pause: short] - - "а": [T: "a"] # 0x430 (google: 'а') - - "б": [T: "be"] # 0x431 (google: 'vara') - - "ĐČ": [T: "ve"] # 0x432 - - "Đł": [T: "ge"] # 0x433 - - "ĐŽ": [T: "de"] # 0x434 - - "Đ”": [T: "je"] # 0x435 (google: 'dvs') - - "ж": [T: "zhe"] # 0x436 - - "Đ·": [T: "ze"] # 0x437 - - "Đž": [T: "i"] # 0x438 (google: 'Đž') - - "Đč": [T: "kort i"] # 0x439 (en: 'short i') - - "Đș": [T: "ka"] # 0x43a - - "Đ»": [T: "el"] # 0x43b - - "ĐŒ": [T: "em"] # 0x43c - - "Đœ": [T: "en"] # 0x43d - - "ĐŸ": [T: "o"] # 0x43e (google: 'ĐŸ') - - "Đż": [T: "pe"] # 0x43f - - "р": [T: "er"] # 0x440 - - "с": [T: "es"] # 0x441 - - "т": [T: "te"] # 0x442 - - "у": [T: "u"] # 0x443 (google: 'у') - - "ф": [T: "ef"] # 0x444 - - "х": [T: "ha"] # 0x445 - - "ц": [T: "tse"] # 0x446 - - "ч": [T: "tsje"] # 0x447 - - "ш": [T: "sja"] # 0x448 - - "щ": [T: "sjtja"] # 0x449 - - "ъ": [T: "hardt tegn"] # 0x44a (en: 'hard sign') - - "ы": [T: "jeru"] # 0x44b - - "ь": [T: "mykt tegn"] # 0x44c (en: 'soft sign', google: 'mjukt skylt') - - "э": [T: "e"] # 0x44d (google: 'э') - - "ю": [T: "ju"] # 0x44e - - "я": [T: "ja"] # 0x44f - - "ۆ": [T: "arabisk-indisk kubikkrot"] # 0x606 - - "ۇ": [T: "arabisk-indisk fjerderot"] # 0x607 - - "ۈ": [T: "arabisk strĂ„le"] # 0x608 - #----------------------------------------------------------------------------------------------------------- - #General punctuation OK - - "‐": [T: "bindestrek"] # 0x2010 (en: 'hyphen') - - "‑": [T: "bindestrek"] # 0x2011 (en: 'hyphen', google: 'bindestrek') - - "‒": [T: "tankestrek"] # 0x2012 (en: 'figure dash', google: 'figurstreck') - - "–": [T: "tankestrek"] # 0x2013 (en: 'en dash') - - "—": [T: "lang tankestrek"] # 0x2014 (en: 'em dash') - - "―": [T: "horisontal strek"] # 0x2015 (en: 'horizontal bar') - - "‖": [T: "dobbel loddrett strek"] # 0x2016 (en: 'double vertical line') - - "†": [T: "kors"] # 0x2020 (en: 'dagger') - - "‡": [T: "dobbelt kors"] # 0x2021 (en: 'double dagger') - - - " - ": [T: " "] # 0x2000 - 0x2007 - - - "‱": # 0x2022 - - test: - if: "@data-chem-formula-op" - then: [T: "ganger"] # (en: 'dot', google translation) - else: [T: "listeelement"] # (en: 'bullet') - - - "‰": [T: "promille"] # 0x2030 (en: 'per mille', MathPlayer: 'promilletecken') - - "‱": [T: "per titusen"] # 0x2031 (en: 'per ten thousand') - - "â€Č": [T: "primtegn"] # 0x2032 (en: 'prime') - - "″": [T: "dobbelt primtegn"] # 0x2033 (en: 'double prime') - - "‮": [T: "trippelt primtegn"] # 0x2034 (en: 'triple prime') - - "—": [T: "omvendt primtegn"] # 0x2035 (en: 'reversed prime') - - "‶": [T: "omvendt dobbelt primtegn"] # 0x2036 (en: 'reversed double prime') - - "‷": [T: "omvendt trippelt primtegn"] # 0x2037 (en: 'reversed triple prime', google: 'omvĂ€nd trippelprime') - - "‾": [T: "innsettingstegn"] # 0x2038 (en: 'to the', google: 'till') - - "â€č": [T: "venstrepekende vinkel-sitattegn"] # 0x2039 (en: 'single left pointing angle quote mark') - - "â€ș": [T: "hĂžyrepekende vinkel-sitattegn"] # 0x203a (en: 'single right pointing angle quote mark') - - "‌": # 0x203c - - test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [T: "dobbelt utropstegn"] # 0x203c - else: [T: "dobbel fakultet"] # 0x203c - - "⁄": # 0x2044 - - test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [T: "stor skrĂ„strek"] # 0x203c - else: [T: "delt pĂ„"] # 0x203c - - "⁅": [T: "venstre piggparentes"] # 0x2045 (en: 'left square bracket with quill', google: 'vĂ€nster fyrkantig konsol med quill') - - "⁆": [T: "hĂžyre piggparentes"] # 0x2046 (en: 'right square bracket with quill', google: 'höger fyrkantig konsol med quill') - - "※": [T: "referansetegn"] # 0x203b - - "‿": [T: "underbinding"] # 0x203F - - "⁀": [T: "bindetegn"] # 0x2040 - - "⁎": [T: "lav asterisk"] # 0x204e - - "⁏": [T: "omvendt semikolon"] # 0x204f - - "⁐": [T: "sammentrekksmerke"] # 0x2050 - - "⁑": [T: "to vertikale asterisk"] # 0x2051 - - "⁒": [T: "kommersielt minustegn"] # 0x2052 - - "⁗": [T: "firedobbelt primtegn"] # 0x2057 (en: 'quadruple prime', MathPlayer: 'quadruple prime', google: 'fyrdubbla prime') - - "⁠": [T: ""] # 0x2060 - #------------------------------------------------------------------------------------------------------------------------- - # Superscripts and subscripts OK - - "⁰": [T: "opphĂžyd i null"] # 0x2070 (en: 'to the zeroth power', google translation) - - "ⁱ": [T: "opphĂžyd i i"] # 0x2071 (en: 'to the eihth power', google: 'till eihth power') - - "⁎": [T: "opphĂžyd i fire"] # 0x2074 (en: 'to the fourth power', google translation) - - "⁔": [T: "opphĂžyd i fem"] # 0x2075 (en: 'to the fifth power', google translation) - - "⁶": [T: "opphĂžyd i seks"] # 0x2076 (en: 'to the sixth power', google translation) - - "⁷": [T: "opphĂžyd i sju"] # 0x2077 (en: 'to the seventh power', google translation) - - "⁞": [T: "opphĂžyd i Ă„tte"] # 0x2078 (en: 'to the eighth power', google translation) - - "âč": [T: "opphĂžyd i ni"] # 0x2079 (en: 'to the ninth power', google translation) - - "âș": [T: "hevet pluss"] # 0x207a (en: 'superscript plus sign', google: 'superscript plus -skylt') - - "⁻": [T: "hevet minus"] # 0x207b (en: 'superscript minus', google: 'superscript minus') - - "⁌": [T: "hevet likhetstegn"] # 0x207c (en: 'superscript equals sign', google: 'superscript Ă€r lika med tecken') - - "⁜": [T: "hevet venstreparentes"] # 0x207d (en: 'superscript left parenthesis', google: 'superscript lĂ€mnade parentesen') - - " ": [T: "hevet hĂžyreparentes"] # 0x207e (en: 'superscript right parenthesis', google: 'superscript höger parentes') - - "ⁿ": [T: "opphĂžyd i n"] # 0x207f (en: 'to the ennth power', google: 'till den ena kraften') - - "₀": [T: "senket null"] # 0x2080 (en: 'sub zero', google translation) - - "₁": [T: "senket Ă©n"] # 0x2081 (en: 'sub one', google translation) - - "₂": [T: "senket to"] # 0x2082 (en: 'sub two', google translation) - - "₃": [T: "senket tre"] # 0x2083 (en: 'sub three', google translation) - - "₄": [T: "senket fire"] # 0x2084 (en: 'sub four', google translation) - - "₅": [T: "senket fem"] # 0x2085 (en: 'sub five', google translation) - - "₆": [T: "senket seks"] # 0x2086 (en: 'sub six', google translation) - - "₇": [T: "senket sju"] # 0x2087 (en: 'sub seven', google translation) - - "₈": [T: "senket Ă„tte"] # 0x2088 (en: 'sub eight', google translation) - - "₉": [T: "senket ni"] # 0x2089 (en: 'sub nine', google translation) - - "₊": [T: "senket pluss"] # 0x208a (en: 'subscript plus sign', google: 'subscript plus -skylt') - - "₋": [T: "senket minus"] # 0x208b (en: 'subscript minus sign', google: 'subscript minus sign') - - "₌": [T: "senket likhetstegn"] # 0x208c (en: 'subscript equals sign', google: 'subscript Ă€r lika med tecken') - - "₍": [T: "senket venstreparentes"] # 0x208d (en: 'subscript left parenthesis', google: 'subscript vĂ€nster-parentes av sig') - - "₎": [T: "senket hĂžyreparentes"] # 0x208e (en: 'subscript right parenthesis', google: 'subscript höger parentes') - - "ₐ": [T: "senket a"] # 0x2090 (en: 'sub A', google: 'sub a') - - "ₑ": [T: "senket e"] # 0x2091 (en: 'sub E', google: 'sub e') - - "ₒ": [T: "senket o"] # 0x2092 (en: 'sub O', google: 'under o') - - "ₓ": [T: "senket x"] # 0x2093 (en: 'sub X', google: 'under x') - - "ₕ": [T: "senket h"] # 0x2095 (en: 'sub H', google: 'under h') - - "ₖ": [T: "senket k"] # 0x2096 (en: 'sub K', google: 'under k') - - "ₗ": [T: "senket l"] # 0x2097 (en: 'sub L', google: 'under l') - - "ₘ": [T: "senket m"] # 0x2098 (en: 'sub M', google: 'sub m') - - "ₙ": [T: "senket n"] # 0x2099 (en: 'sub N', google: 'under n') - - "ₚ": [T: "senket p"] # 0x209a (en: 'sub P', google: 'sub p') - - "ₛ": [T: "senket s"] # 0x209b (en: 'sub S', google: 'sub s') - - "ₜ": [T: "senket t"] # 0x209c (en: 'sub T', google: 'under t') - #-------------------------------------------------------------------------------------------------------------------- - #Currency symbols OK - - "₠": [T: "europeisk valutaenhet"] # 0x20a0 (en: 'european currenty units', google translation) - - "₡": [T: "colĂłn"] # 0x20a1 - - "₱": [T: "cruzeiro"] # 0x20a2 - - "₣": [T: "franc"] # 0x20a3 - - "â‚€": [T: "lira"] # 0x20a4 (google: 'lire') - - "â‚„": [T: "mill"] # 0x20a5 - - "₩": [T: "naira"] # 0x20a6 - - "₧": [T: "peseta"] # 0x20a7 - - "₹": [T: "rupi"] # 0x20a8 (google: 'rupier') - - "₩": [T: "won"] # 0x20a9 (google: 'vann') - - "â‚Ș": [T: "ny shekel"] # 0x20aa (google: 'shekel') - - "₫": [T: "dong"] # 0x20ab - - "€": [T: "euro"] # 0x20ac (en: 'euros') - - "₭": [T: "kip"] # 0x20ad (google: 'slaf') - - "₼": [T: "tugrik"] # 0x20ae - - "₯": [T: "drakmer"] # 0x20af (google: 'drakma') - - "₰": [T: "pfenniger"] # 0x20b0 (google: 'tyska pennies') - - "₱": [T: "peso"] # 0x20b1 - - "â‚Č": [T: "guaranier"] # 0x20b2 - - "₳": [T: "australes"] # 0x20b3 (google: 'österral') - - "₮": [T: "hryvnjaer"] # 0x20b4 - - "â‚”": [T: "cedi"] # 0x20b5 - - "₶": [T: "livre tournois"] # 0x20b6 (google translation) - - "₷": [T: "spesmilo"] # 0x20b7 (google translation) - - "₾": [T: "tenge"] # 0x20b8 (google translation) - - "â‚č": [T: "indiske rupi"] # 0x20b9 (en: 'indian rupees', google translation) - - "â‚ș": [T: "tyrkiske lira"] # 0x20ba (en: 'turkish liras', google translation) - #-------------------------------------------------------------------------------------------------------------- - #Combining Diacritical Marks for Symbols OK - - "⃐": [T: "venstre-harpun"] # 0x20d0 (en: 'left harpoon above embellishment', google: 'vĂ€nster harpoon ovanför utsmyckning') - - "⃑": [T: "hĂžyre-harpun"] # 0x20d1 (en: 'right harpoon above embellishment', google: 'höger harpoon ovanför utsmyckning') - - "⃒": [T: "lang vertikal strek"] # 0x20d2 (en: 'long vertical line overlay embellishment', google translation) - - "⃓": [T: "kort vertikal strek"] # 0x20d3 (en: 'short vertical line overlay embellishment', google translation) - - "⃔": [T: "pil mot klokken"] # 0x20d4 (en: 'anticlockwise arrow above embellishment', google translation) - - "⃕": [T: "pil med klokken"] # 0x20d5 (en: 'clockwise arrow above embellishment', google translation) - - "⃖": [T: "venstrepil"] # 0x20d6 (en: 'left arrow above embellishment', google: 'vĂ€nster pil över utsmyckningen') - - "⃗": [T: "hĂžyrepil"] # 0x20d7 (en: 'right arrow above embellishment', google: 'höger-pil över utsmyckning') - - "⃘": [T: "ring"] # 0x20d8 (en: 'ring overlay embellishment', google translation) - - "⃙": [T: "ring med klokken"] # 0x20d9 (en: 'clockwise ring overlay embellishment', google translation) - - "⃚": [T: "ring mot klokken"] # 0x20da (en: 'anticlockwise ring overlay embellishment', google translation) - - "⃛": [T: "trippel prikk"] # 0x20db (en: 'triple dot', google: 'triple dot') - - "⃜": [T: "fire prikker"] # 0x20dc (en: 'quadruple dot', google: 'fyrdubbla prick') - - "⃝": [T: "i sirkel"] # 0x20dd (en: 'enclosing circle embellishment', google translation) - - "⃞": [T: "i firkant"] # 0x20de (en: 'enclosing square embellishment', google translation) - - "⃟": [T: "i diamant"] # 0x20df (en: 'enclosing diamond embellishment', google translation) - - "⃠": [T: "i sirkel med omvendt skrĂ„strek"] # 0x20e0 (en: 'enclosing circle backslash embellishment', google translation) - - "⃥": [T: "venstre-hĂžyre-pil"] # 0x20e1 (en: 'left right arrow above embellishment', google: 'vĂ€nster höger pil över utsmyckningen') - - "⃹": [T: "omsluttende skjerm"] # 0x20e2 (en: 'enclosing screen embellishment', google translation) - - "⃣": [T: "omsluttende tastehette"] # 0x20e3 (en: 'enclosing keycap embellishment', google translation) - - "⃀": [T: "i oppoverpekende trekant"] # 0x20e4 (en: 'enclosing upward pointing triangle embellishment', google translation) - - "⃄": [T: "omvendt skrĂ„strek"] # 0x20e5 (en: 'reverse solidus overlay embellishment', google translation) - - "⃊": [T: "dobbel loddrett strek"] # 0x20e6 (en: 'double verticle stroke embellishment', google translation) - - "⃧": [T: "livrentesymbol"] # 0x20e7 (en: 'annuity symbol embellishment', google translation) - - "⃚": [T: "trippel prikk"] # 0x20e8 (en: 'triple underdot', google translation) - - "⃩": [T: "bred bro"] # 0x20e9 (en: 'wide bridge above embellishment', google translation) - - "âƒȘ": [T: "venstrepil"] # 0x20ea (en: 'leftwards arrow overlay embellishment', google translation) - - "⃫": [T: "lang dobbel skrĂ„strek"] # 0x20eb (en: 'long double solidus overlay embellishment', google translation) - - "⃏": [T: "hĂžyre-harpun mothake ned"] # 0x20ec (en: 'rightwards harpoon with barb downwards embellishment', google translation) - - "⃭": [T: "venstre-harpun mothake ned"] # 0x20ed (en: 'leftwards harpoon with barb downwards embellishment', google translation) - - "⃟": [T: "venstrepil under"] # 0x20ee (en: 'left arrow below embellishment', google translation) - - "⃯": [T: "hĂžyrepil under"] # 0x20ef (en: 'right arrow below embellishment', google translation) - - "⃰": [T: "asterisk"] # 0x20f0 (en: 'asterisk above embellishment', google translation) - #----------------------------------------------------------------------------------------------------- - #Letterlike Symbols OK - - "℄": [T: "midtlinjesymbol"] # 0x2104 (google translation) - - "℅": [T: "care of"] # 0x2105 (google: 'bry sig om') - - "℆": [T: "cada una"] # 0x2106 (google translation) - - "ℇ": [T: "eulers konstant"] # 0x2107 (en: 'euler's constant', google: 'eulers konstant') - - "℈": [T: "scruple"] # 0x2108 (en: 'scruples', google translation) - - "℉": [T: "grader fahrenheit"] # 0x2109 (en: 'degrees fahrenheit') - - "ℊ": [T: "script font g"] # 0x210a (en: 'script g') - - "ℌℑℹℭ": # 0x210c, 0x2111, 0x2128, 0x212d - - T: "fraktur" # (en: 'fraktur', google: 'fraktur') - - SPELL: "translate('.', 'ℌℑℹℭ', 'HIZC')" - - - "â„â„™â„Ÿâ„ż": # 0x210d, 0x2119, 0x213e, 0x213f - - T: "dobbeltstreket" # (en: 'double struck', google translation) - - SPELL: "translate('.', 'â„â„™â„Ÿâ„ż', 'HPΓΠ')" - - - "ℎ": [T: "plancks konstant"] # 0x210e - - "ℏ": [T: "h strek"] # 0x210f - # SWEDISH: finns bara ett sĂ€tt att sĂ€ga h strek - - - "â„â„’â„˜â„Źâ„°â„±â„ł": # 0x2110, 0x2112, 0x2118, 0x2130, 0x2131, 0x2133 - - T: "script font" # (en: 'script') - - SPELL: "translate('.', 'â„â„’â„˜â„Źâ„°â„±â„ł', 'ILPBEFM')" - - - "℔": [T: "pund"] # 0x2114 (en: 'pounds', google: 'pund') - - "№": [T: "numero"] # 0x2116 (en: 'number') - - "â„„": [T: "ounce"] # 0x2125 (en: 'ounces') - - "℩": [T: "ohm"] # 0x2126 (en: 'ohms') - - "℧": [T: "mho"] # 0x2127 (en: 'mhos') - - "℩": [T: "rotert iota"] # 0x2129 (en: 'turned iota', google: 'vĂ€nde iota') - - "Å": [T: "Ă„ngstrĂžm"] # 0x212b - - "ℯ": [T: "script font e"] # 0x212f (en: 'script e') - - # coalesced some chars that use cap letters - - "â„Čâ„ș⅁⅂⅃⅄": # 0x2132, 0x213a, 0x2141, 0x2142, 0x2143, 0x2144 - - test: - - if: "'.' = 'â„ș'" - then: [T: "rotert"] # (en: 'rotated', google translation) - - else_if: "'.' = 'â„Č'" - then: [T: "rotert"] # (en: 'turned', google translation) - - else_if: "'.' = '⅃'" - then: [T: "omvendt sans-serif"] # (en: 'reversed sans-serif', google translation) - else: [T: "rotert sans-serif"] # (en: 'turned sans-serif', google: 'vĂ€nde sans-serif') - - SPELL: "translate('.', 'â„Čâ„ș⅁⅂⅃⅄', 'FQGLLY')" - - - "℮": [T: "script font o"] # 0x2134 (en: 'script o') - - "â„”": [T: "alef"] # 0x2135 (en: 'first transfinite cardinal') - - "ℶ": [T: "bet"] # 0x2136 (en: 'second transfinite cardinal') - - "ℷ": [T: "gimel"] # 0x2137 (en: 'third transfinite cardinal') - - "ℾ": [T: "dalet"] # 0x2138 (en: 'fourth transfinite cardinal') - - "ℌ": [T: "dobbeltstreket pi"] # 0x213c (en: 'double struck pi', google: 'dobbelslaget pi') - - "ℜ": [T: "dobbeltstreket gamma"] # 0x213d (en: 'double struck gamma', google: 'dobbelslaget gamma') - - "⅀": [T: "dobbeltstreket summetegn"] # 0x2140 (en: 'double struck n-ary summation', google: 'dubbelslaget n-ary-sammanfattning') - - "⅋": [T: "rotert og-tegn"] # 0x214b (en: 'turned ampersand', google: 'vĂ€nde ampersand') - - "⅌": [T: "per"] # 0x214c (en: 'per', google: 'per') - - "ⅎ": [T: "rotert f"] # 0x214e (en: 'turned F', google: 'vĂ€nde f') - #-------------------------------------------------------------------------------------------------------------- - #Number formats OK - - "ÂŒ": [T: "Ă©n fjerdedel"] # 0x00bc - - "œ": [T: "Ă©n halv"] # 0x00bd - - "Ÿ": [T: "tre fjerdedeler"] # 0x00be - - "⅐": [T: "Ă©n sjudel"] # 0x2150 (en: 'one seventh', google: 'en sjunde') - - "⅑": [T: "Ă©n nidel"] # 0x2151 (en: 'one ninth', google: 'en nionde') - - "⅒": [T: "Ă©n tidel"] # 0x2152 (en: 'one tenth') - - "⅓": [T: "Ă©n tredjedel"] # 0x2153 (en: 'one third') - - "⅔": [T: "to tredjedeler"] # 0x2154 (en: 'two thirds') - - "⅕": [T: "Ă©n femtedel"] # 0x2155 (en: 'one fifth') - - "⅖": [T: "to femtedeler"] # 0x2156 (en: 'two fifths') - - "⅗": [T: "tre femtedeler"] # 0x2157 (en: 'three fifths') - - "⅘": [T: "fire femtedeler"] # 0x2158 (en: 'four fifths') - - "⅙": [T: "Ă©n sjettedel"] # 0x2159 (en: 'one sixth') - - "⅚": [T: "fem sjettedeler"] # 0x215a (en: 'five sixths') - - "⅛": [T: "Ă©n Ă„ttedel"] # 0x215b (en: 'one eighth') - - "⅜": [T: "tre Ă„ttedeler"] # 0x215c (en: 'three eighths') - - "⅝": [T: "fem Ă„ttedeler"] # 0x215d (en: 'five eighths') - - "⅞": [T: "sju Ă„ttedeler"] # 0x215e (en: 'seven eighths') - - "⅟": [T: "Ă©n over"] # 0x215f (en: 'one over', google: 'en över') - - "Ⅰ": [T: "i"] # 0x2160 (en: 'I', google translation) - - "Ⅱ": [T: "i i"] # 0x2161 (en: 'I I', google translation) - - "ⅱ": [T: "i i i"] # 0x2162 (en: 'I I I', google translation) - - "Ⅳ": [T: "i v"] # 0x2163 (en: 'I V', google translation) - - "â…€": [T: "v"] # 0x2164 (en: 'V', google translation) - - "â…„": [T: "v i"] # 0x2165 (en: 'V I', google translation) - - "Ⅹ": [T: "v i i"] # 0x2166 (en: 'V I I', google translation) - - "Ⅷ": [T: "v i i i"] # 0x2167 (en: 'V I I I', google translation) - - "ⅹ": [T: "i x"] # 0x2168 (en: 'I X', google translation) - - "Ⅹ": [T: "x"] # 0x2169 (en: 'X', google translation) - - "â…Ș": [T: "x i"] # 0x216a (en: 'X I', google translation) - - "Ⅻ": [T: "x i i"] # 0x216b (en: 'X I I', google translation) - - "Ⅼ": [T: "l"] # 0x216c (en: 'L', google translation) - - "Ⅽ": [T: "c"] # 0x216d (en: 'C', google translation) - - "ⅼ": [T: "d"] # 0x216e (en: 'D', google translation) - - "Ⅿ": [T: "m"] # 0x216f (en: 'M', google translation) - - "ⅰ": [T: "i"] # 0x2170 (en: 'I', google translation) - - "ⅱ": [T: "i i"] # 0x2171 (en: 'I I', google translation) - - "â…Č": [T: "i i i"] # 0x2172 (en: 'I I I', google translation) - - "ⅳ": [T: "i v"] # 0x2173 (en: 'I V', google translation) - - "Ⅾ": [T: "v"] # 0x2174 (en: 'V', google translation) - - "â…”": [T: "v i"] # 0x2175 (en: 'V I', google translation) - - "ⅶ": [T: "v i i"] # 0x2176 (en: 'V I I', google translation) - - "ⅷ": [T: "v i i i"] # 0x2177 (en: 'V I I I', google translation) - - "ⅾ": [T: "i x"] # 0x2178 (en: 'I X', google translation) - - "â…č": [T: "x"] # 0x2179 (en: 'X', google translation) - - "â…ș": [T: "x i"] # 0x217a (en: 'X I', google translation) - - "ⅻ": [T: "x i i"] # 0x217b (en: 'X I I', google translation) - - "â…Œ": [T: "l"] # 0x217c (en: 'L', google translation) - - "â…œ": [T: "c"] # 0x217d (en: 'C', google translation) - - "â…Ÿ": [T: "d"] # 0x217e (en: 'D', google translation) - - "ⅿ": [T: "m"] # 0x217f (en: 'M', google translation) - - "↉": [T: "null tredjedeler"] # 0x2189 (en: 'zero thirds') - #----------------------------------------------------------------------------------------------------- - #Arrows OK - - "←": [T: "venstrepil"] # 0x2190 (en: 'leftwards arrow') - - "↑": [T: "oppoverpil"] # 0x2191 (en: 'upwards arrow') - - "↓": [T: "nedoverpil"] # 0x2193 (en: 'downwards arrow') - - "↔": [T: "venstre-hĂžyre-pil"] # 0x2194 (en: 'left right arrow') - - "↕": [T: "opp-ned-pil"] # 0x2195 (en: 'up down arrow') - - "↖": [T: "nordvest-pil"] # 0x2196 (en: 'north west arrow') - - "↗": # 0x2197 - - test: - if: "ancestor::*[2][self::m:limit]" - then: [T: "gĂ„r fra venstre mot"] # (en: 'approaches from below', google translation) - else: [T: "nordĂžst-pil"] # (en: 'north east arrow') - - - "↘": # 0x2198 - - test: - if: "ancestor::*[2][self::m:limit]" - then: [T: "gĂ„r fra hĂžyre mot"] # (en: 'approaches from above', google translation) - else: [T: "sĂžrĂžst-pil"] # (en: 'south east arrow') - - - "↙": [T: "sĂžrvest-pil"] # 0x2199 (en: 'south west arrow') - - "↚": [T: "overstrĂžket venstrepil"] # 0x219a (en: 'leftwards arrow with stroke') - - "↛": [T: "overstrĂžket hĂžyrepil"] # 0x219b (en: 'rightwards arrow with stroke') - - "↜": [T: "bĂžlget venstrepil"] # 0x219c (en: 'leftwards wave arrow') - - "↝": [T: "bĂžlget hĂžyrepil"] # 0x219d (en: 'rightwards wave arrow') - - "↞": [T: "venstrepil med to spisser"] # 0x219e (en: 'leftwards two headed arrow') - - "↟": [T: "oppoverpil med to spisser"] # 0x219f (en: 'upwards two headed arrow') - - "↠": [T: "hĂžyrepil med to spisser"] # 0x21a0 (en: 'rightwards two headed arrow') - - "↡": [T: "nedoverpil med to spisser"] # 0x21a1 (en: 'downwards two headed arrow') - - "↱": [T: "venstrepil med hale"] # 0x21a2 (en: 'leftwards arrow with tail') - - "↣": [T: "hĂžyrepil med hale"] # 0x21a3 (en: 'rightwards arrow with tail') - - "ↀ": [T: "venstrepil fra strek"] # 0x21a4 (en: 'leftwards arrow from bar') - - "ↄ": [T: "oppoverpil fra strek"] # 0x21a5 (en: 'upwards arrow from bar') - - "↩": [T: "hĂžyrepil fra strek"] # 0x21a6 (en: 'rightwards arrow from bar') - - "↧": [T: "nedoverpil fra strek"] # 0x21a7 (en: 'downwards arrow from bar') - - "↹": [T: "opp-ned-pil med base"] # 0x21a8 (en: 'up down arrow with base') - - "↩": [T: "venstrepil med krok"] # 0x21a9 (en: 'leftwards arrow with hook') - - "â†Ș": [T: "hĂžyrepil med krok"] # 0x21aa (en: 'rightwards arrow with hook') - - "↫": [T: "venstrepil med lĂžkke"] # 0x21ab (en: 'leftwards arrow with loop') - - "↬": [T: "hĂžyrepil med lĂžkke"] # 0x21ac (en: 'rightwards arrow with loop') - - "↭": [T: "bĂžlget venstre-hĂžyre-pil"] # 0x21ad (en: 'left right wave arrow') - - "↼": [T: "overstrĂžket venstre-hĂžyre-pil"] # 0x21ae (en: 'left right arrow with stroke') - - "↯": [T: "sikksakk nedoverpil"] # 0x21af (en: 'downwards zigzag arrow') - - "↰": [T: "oppoverpil med spissen mot venstre"] # 0x21b0 (en: 'upwards arrow with tip leftwards') - - "↱": [T: "oppoverpil med spissen mot hĂžyre"] # 0x21b1 (en: 'upwards arrow with tip rightwards') - - "â†Č": [T: "nedoverpil med spissen mot venstre"] # 0x21b2 (en: 'downwards arrow with tip leftwards') - - "↳": [T: "nedoverpil med spissen mot hĂžyre"] # 0x21b3 (en: 'downwards arrow with tip rightwards') - - "↮": [T: "hĂžyrepil med hjĂžrnet ned"] # 0x21b4 (en: 'rightwards arrow with corner downwards') - - "↔": [T: "nedoverpil med hjĂžrnet mot venstre"] # 0x21b5 (en: 'downwards arrow with corner leftwards') - - "↶": [T: "Ăžvre halvsirkelpil mot klokken"] # 0x21b6 (en: 'anticlockwise top semicircle arrow') - - "↷": [T: "Ăžvre halvsirkelpil med klokken"] # 0x21b7 (en: 'clockwise top semicircle arrow') - - "↾": [T: "nordvest-pil mot strek"] # 0x21b8 (en: 'north west arrow to long bar') - - "â†č": [T: "venstrepil mot strek over hĂžyrepil mot strek"] # 0x21b9 (en: 'leftwards arrow to bar over rightwards arrow to bar') - - "â†ș": [T: "Ă„pen sirkelpil mot klokken"] # 0x21ba (en: 'anticlockwise open circle arrow') - - "↻": [T: "Ă„pen sirkelpil med klokken"] # 0x21bb (en: 'clockwise open circle arrow') - - "↌": [T: "venstre-harpun mothake opp"] # 0x21bc (en: 'left harpoon up') - - "↜": [T: "venstre-harpun mothake ned"] # 0x21bd (en: 'left harpoon down') - - "↟": [T: "opp-harpun mothake hĂžyre"] # 0x21be (en: 'up harpoon right') - - "↿": [T: "opp-harpun mothake venstre"] # 0x21bf (en: 'up harpoon left') - - "⇀": [T: "hĂžyre-harpun mothake opp"] # 0x21c0 (en: 'right harpoon up') - - "⇁": [T: "hĂžyre-harpun mothake ned"] # 0x21c1 (en: 'right harpoon down') - - "⇂": [T: "ned-harpun mothake hĂžyre"] # 0x21c2 (en: 'down harpoon right') - - "⇃": [T: "ned-harpun mothake venstre"] # 0x21c3 (en: 'down harpoon left') - - "⇄": [T: "hĂžyrepil over venstrepil"] # 0x21c4 (en: 'rightwards arrow over leftwards arrow') - - "⇅": [T: "oppoverpil til venstre for nedoverpil"] # 0x21c5 (en: 'upwards arrow leftwards of downwards arrow') - - "⇆": [T: "venstrepil over hĂžyrepil"] # 0x21c6 (en: 'leftwards arrow over rightwards arrow') - - "⇇": [T: "to venstrepiler"] # 0x21c7 (en: 'leftwards paired arrows') - - "⇈": [T: "to oppoverpiler"] # 0x21c8 (en: 'upwards paired arrows') - - "⇉": [T: "to hĂžyrepiler"] # 0x21c9 (en: 'rightwards paired arrows') - - "⇊": [T: "to nedoverpiler"] # 0x21ca (en: 'downwards paired arrows') - - "⇋": [T: "venstre-harpun over hĂžyre-harpun"] # 0x21cb (en: 'left harpoon over right harpoon') - - "⇌": [T: "hĂžyre-harpun over venstre-harpun"] # 0x21cc (en: 'right harpoon over left harpoon') - - "⇍": [T: "overstrĂžket dobbeltstreket venstrepil"] # 0x21cd (en: 'leftwards double arrow with stroke') - - "⇎": [T: "overstrĂžket dobbeltstreket venstre-hĂžyre-pil"] # 0x21ce (en: 'left right double arrow with stroke') - - "⇏": [T: "overstrĂžket dobbeltstreket hĂžyrepil"] # 0x21cf (en: 'rightwards double arrow with stroke') - - "⇐": [T: "dobbeltstreket venstrepil"] # 0x21d0 (en: 'leftwards double arrow') - - "⇑": [T: "dobbeltstreket oppoverpil"] # 0x21d1 (en: 'upwards double arrow') - - "⇒": [T: "impliserer"] # 0x21d2 (en: 'rightwards double arrow') - - "⇓": [T: "dobbeltstreket nedoverpil"] # 0x21d3 (en: 'downwards double arrow') - - "⇔": [T: "er ekvivalent med"] # 0x21d4 (en: 'left right double arrow') - - "⇕": [T: "dobbeltstreket opp-ned-pil"] # 0x21d5 (en: 'up down double arrow') - - "⇖": [T: "dobbeltstreket nordvest-pil"] # 0x21d6 (en: 'north west double arrow') - - "⇗": [T: "dobbeltstreket nordĂžst-pil"] # 0x21d7 (en: 'north east double arrow') - - "⇘": [T: "dobbeltstreket sĂžrĂžst-pil"] # 0x21d8 (en: 'south east double arrow') - - "⇙": [T: "dobbeltstreket sĂžrvest-pil"] # 0x21d9 (en: 'south west double arrow') - - "⇚": [T: "trippelstreket venstrepil"] # 0x21da (en: 'leftwards triple arrow') - - "⇛": [T: "trippelstreket hĂžyrepil"] # 0x21db (en: 'rightwards triple arrow') - - "⇜": [T: "slingrete venstrepil"] # 0x21dc (en: 'leftwards squiggle arrow') - - "⇝": [T: "slingrete hĂžyrepil"] # 0x21dd (en: 'rightwards squiggle arrow') - - "⇞": [T: "oppoverpil med dobbel horisontal strek"] # 0x21de (en: 'upwards arrow with double stroke') - - "⇟": [T: "nedoverpil med dobbel horisontal strek"] # 0x21df (en: 'downwards arrow with double stroke') - - "⇠": [T: "stiplet venstrepil"] # 0x21e0 (en: 'leftwards dashed arrow') - - "⇡": [T: "stiplet oppoverpil"] # 0x21e1 (en: 'upwards dashed arrow') - - "⇱": [T: "stiplet hĂžyrepil"] # 0x21e2 (en: 'rightwards dashed arrow') - - "⇣": [T: "stiplet nedoverpil"] # 0x21e3 (en: 'downwards dashed arrow') - - "⇀": [T: "venstrepil mot strek"] # 0x21e4 (en: 'leftwards arrow to bar') - - "⇄": [T: "hĂžyrepil mot strek"] # 0x21e5 (en: 'rightwards arrow to bar') - - "⇩": [T: "hvit venstrepil"] # 0x21e6 (en: 'leftwards white arrow') - - "⇧": [T: "hvit oppoverpil"] # 0x21e7 (en: 'upwards white arrow') - - "⇹": [T: "hvit hĂžyrepil"] # 0x21e8 (en: 'rightwards white arrow') - - "⇩": [T: "hvit nedoverpil"] # 0x21e9 (en: 'downwards white arrow') - - "â‡Ș": [T: "hvit oppoverpil fra strek"] # 0x21ea (en: 'upwards white arrow from bar') - - "⇫": [T: "hvit oppoverpil pĂ„ sokkel"] # 0x21eb (en: 'upwards white arrow on pedestal', google: 'uppĂ„t vit pil pĂ„ piedestal') - - "⇬": [T: "hvit oppoverpil pĂ„ sokkel med horisontal strek"] # 0x21ec (en: 'upwards white arrow on pedestal with horizontal bar', google: 'uppĂ„t vit pil pĂ„ piedestal med horisontell stĂ„ng') - - "⇭": [T: "hvit oppoverpil pĂ„ sokkel med vertikal strek"] # 0x21ed (en: 'upwards white arrow on pedestal with vertical bar', google: 'uppĂ„t vit pil pĂ„ piedestal med vertikal bar') - - "⇼": [T: "hvit dobbel oppoverpil"] # 0x21ee (en: 'upwards white double arrow', google: 'uppĂ„t vit dubbelpil') - - "⇯": [T: "hvit dobbel oppoverpil pĂ„ sokkel"] # 0x21ef (en: 'upwards white double arrow on pedestal', google: 'uppĂ„t vit dubbelpil pĂ„ piedestal') - - "⇰": [T: "hvit hĂžyrepil fra vegg"] # 0x21f0 (en: 'rightwards white arrow from wall', google: 'Ă„tgĂ€rder vit pil frĂ„n vĂ€gg') - - "⇱": [T: "nordvest-pil mot hjĂžrne"] # 0x21f1 (en: 'north west arrow to corner', google: 'north west arrow till hörnet') - - "â‡Č": [T: "sĂžrĂžst-pil mot hjĂžrne"] # 0x21f2 (en: 'south east arrow to corner', google: 'south east arrow till corner') - - "⇳": [T: "hvit opp-ned-pil"] # 0x21f3 (en: 'up down white arrow', google: 'upp ner white arrow') - - "⇮": [T: "hĂžyrepil med liten sirkel"] # 0x21f4 (en: 'right arrow with small circle') - - "⇔": [T: "nedoverpil til venstre for oppoverpil"] # 0x21f5 (en: 'downwards arrow leftwards of upwards arrow') - - "⇶": [T: "tre hĂžyrepiler"] # 0x21f6 (en: 'three rightwards arrows', google: 'tre pilar med höger') - - "⇷": [T: "venstrepil med vertikal strek"] # 0x21f7 (en: 'leftwards arrow with vertical stroke', google: 'vĂ€nster pil med lodslag') - - "⇾": [T: "hĂžyrepil med vertikal strek"] # 0x21f8 (en: 'rightwards arrow with vertical stroke', google: 'Ă„tgĂ€rdspil med vertikal stroke') - - "â‡č": [T: "venstre-hĂžyre-pil med vertikal strek"] # 0x21f9 (en: 'left right arrow with vertical stroke', google: 'vĂ€nster höger pil med vertikalt slag') - - "â‡ș": [T: "venstrepil med dobbel vertikal strek"] # 0x21fa (en: 'leftwards arrow with double vertical stroke', google: 'vĂ€nster pil med dubbel vertikal stroke') - - "⇻": [T: "hĂžyrepil med dobbel vertikal strek"] # 0x21fb (en: 'rightwards arrow with double vertical stroke', google: 'Ă„tgĂ€rdspil med dubbel vertikal stroke') - - "⇌": [T: "venstre-hĂžyre-pil med dobbel vertikal strek"] # 0x21fc (en: 'left right arrow with double vertical stroke', google: 'vĂ€nster höger pil med dubbel vertikal stroke') - - "⇜": [T: "venstrepil med Ă„pen spiss"] # 0x21fd (en: 'leftwards open headed arrow') - - "⇟": [T: "hĂžyrepil med Ă„pen spiss"] # 0x21fe (en: 'rightwards open headed arrow') - - "⇿": [T: "venstre-hĂžyre-pil med Ă„pen spiss"] # 0x21ff (en: 'left right open headed arrow') - #---------------------------------------------------------------------------------------------------------------- - #Mathematical operators OK - - "∀": [T: "for alle"] # 0x2200 (en: 'for all') - - "∁": # 0x2201 # audit-ignore - - T: "komplementet til" # (en: 'complement of') - - "∃": [T: "det eksisterer"] # 0x2203 (en: 'there exists') - - "∄": [T: "det eksisterer ikke"] # 0x2204 (en: 'there does not exist') - - "∅": [T: "den tomme mengden"] # 0x2205 (en: 'empty set') - - "∇": [T: "nabla"] # 0x2207 (en: 'gradient of', google: 'lutning av') - - "∋": [T: "inneholder elementet"] # 0x220b (en: 'contains the member') - - "∌": [T: "inneholder ikke elementet"] # 0x220c (en: 'does not contain the member') - - "∍": [T: "inneholder elementet"] # 0x220d (en: 'contains the member') - - "∎": [T: "som skulle bevises"] # 0x220e (en: 'end of proof') - - "∏": [T: "produktet"] # 0x220f (en: 'product') - - "∐": [T: "koproduktet"] # 0x2210 (en: 'coproduct', MathPlayer: 'coproduct', google: 'coprodukt') - - "∑": [T: "sum"] # 0x2211 (en: 'sum') - - "−": [T: "minus"] # 0x2212 - - "∓": [T: "minus pluss"] # 0x2213 (en: 'minus or plus') - - "∔": [T: "prikk pluss"] # 0x2214 (en: 'dot plus') - - "∕": [T: "delt pĂ„"] # 0x2215 (en: 'divided by') - - "∖": [T: "minus"] # 0x2216 (en: 'set minus') - - "∗": [T: "ganger"] # 0x2217 (en: 'times') - - "∘": [T: "sammensatt med"] # 0x2218 (en: 'composed with') - - "∙": # 0x2219 - - test: - if: "@data-chem-formula-op" - then: [T: "ganger"] # (en: 'dot', google translation) - else: [T: "ganger"] # (en: 'times') - - - "∛": # 0x221b # audit-ignore - - T: "kubikkroten av" # (en: 'cube root of') - - "∜": # 0x221c # audit-ignore - - T: "fjerderoten av" # (en: 'fourth root of') - - "∞": [T: "uendelig"] # 0x221e (en: 'infinity') - - "∟": [T: "rett vinkel"] # 0x221f (en: 'right angle') - - "∠": [T: "vinkel"] # 0x2220 (en: 'angle') - - "∥": [T: "mĂ„lt vinkel"] # 0x2221 (en: 'measured angle') - - "∹": [T: "sfĂŠrisk vinkel"] # 0x2222 (en: 'spherical angle') - - "∣": [T: "deler"] # 0x2223 (en: 'divides') - - "∀": [T: "deler ikke"] # 0x2224 (en: 'does not divide') - - "∧": [T: "og"] # 0x2227 (en: 'and') - - "√": [T: "eller"] # 0x2228 (en: 'or') - - "∩": [T: "snitt"] # 0x2229 (en: 'intersection') - - "âˆȘ": [T: "union"] # 0x222a - - "∫": [T: "integralet"] # 0x222b - - "∏": [T: "dobbeltintegralet"] # 0x222c (en: 'double integral') - - "∭": [T: "trippelintegralet"] # 0x222d (en: 'triple integral') - - "∟": [T: "kurveintegralet"] # 0x222e (en: 'contour integral') - - "∯": [T: "flateintegralet"] # 0x222f (en: 'surface integral') - - "∰": [T: "volumintegralet"] # 0x2230 (en: 'volume integral') - - "∱": [T: "integralet med klokken"] # 0x2231 (en: 'clockwise integral', MathPlayer: 'clockwise integral', google: 'medurs integrerad') - - "âˆČ": [T: "kurveintegralet med klokken"] # 0x2232 (en: 'clockwise contour integral', MathPlayer: 'clockwise contour integral (arrow on höger)', google: 'medurs konturintegral') - - "∳": [T: "kurveintegralet mot klokken"] # 0x2233 (en: 'anticlockwise contour integral', MathPlayer: 'anticlockwise contour integral', google: 'antikvis konturintegral') - - "∎": [T: "derfor"] # 0x2234 (en: 'therefore') - - "∔": [T: "ettersom"] # 0x2235 (en: 'because') - - "∶": # 0x2236 # audit-ignore - - T: "til" # (en: 'to') - - "∷": [T: "som"] # 0x2237 (en: 'as', MathPlayer: 'proportion', google: 'som') - - "∞": [T: "prikk minus"] # 0x2238 (en: 'dot minus') - - "âˆč": [T: "har overskudd sammenlignet med"] # 0x2239 (en: 'has excess compared to', MathPlayer: 'excess', google: 'har överskott jĂ€mfört med') - - "âˆș": # 0x223a - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "geometrisk proporsjonal med" # (en: 'geometrically proportional to') - - "∻": # 0x223b - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "homotetisk til" # (en: 'homothetic to', MathPlayer: 'homothetic', google: 'homotetisk till') - - "∜": [T: "omvendt tilde"] # 0x223d (en: 'reversed tilde') - - "∟": # 0x223e # audit-ignore - - T: "omvendt langstrakt s" # (en: 'most positive', MathPlayer: 'inverted lazy s', google: 'mest positiva') - - "∿": [T: "sinuskurve"] # 0x223f (en: 'sine wave') - - "≀": [T: "kransprodukt"] # 0x2240 (en: 'wreath product') - - "≁": # 0x2241 (en: 'not tilde') # audit-ignore - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] - - T: "ikke proporsjonal med" - - "≂": [T: "minus tilde"] # 0x2242 (SRE: 'minus och tilde') - - "≃": # 0x2243 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] - - T: "asymptotisk lik" # (en: 'asymptotically equal to', MathPlayer: 'asymptotically lika med', google: 'asymptotisk lik') - - "≄": # 0x2244 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] - - T: "ikke asymptotisk lik" # (en: 'not asymptotically equal to', MathPlayer: 'inte asymptotically lika med', google: 'ikke asymptotisk lik') - - "≅": # 0x2245 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] - - T: "tilnĂŠrmet lik" # (en: 'approximately equal to', MathPlayer: 'approximativt lika med', google: 'omtrent lik') - - "≆": # 0x2246 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] - - T: "tilnĂŠrmet men faktisk ikke lik" # (en: 'approximately but not actually equal to', MathPlayer: 'approximativt men inte faktiskt lika med', google: 'omtrentlig men faktisk ikke lik') - - "≇": # 0x2247 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] - - T: "verken tilnĂŠrmet eller faktisk lik" # (en: 'neither approximately nor actually equal to', MathPlayer: 'varken approximativt eller fakiskt lika med', google: 'varken ungefĂ€r eller faktiskt lika med') - - "≈": # 0x2248 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] - - T: "tilnĂŠrmet lik" # (en: 'almost equal to', SRE: 'Ă€r nĂ€stan lika med') - - "≉": # 0x2249 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] - - T: "ikke tilnĂŠrmet lik" # (en: 'not almost equal to', SRE: 'Ă€r inte nĂ€stan lika med') - - "≊": # 0x224a - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] - - T: "tilnĂŠrmet lik eller lik" # (en: 'almost equal or equal to', SRE: 'Ă€r nĂ€stan lika eller lika med') - - "≋": [T: "trippel tilde"] # 0x224b (en: 'triple tilde') - - "≌": [T: "er alle like med"] # 0x224c (en: 'are all equal to', MathPlayer: 'alla lika med') - - "≍": # 0x224d - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "ekvivalent med" # (en: 'equivalent to') - - "≎": # 0x224e - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "geometrisk ekvivalent med" # (en: 'geometrically equivalent to', MathPlayer: 'geometriskt lika med', google: 'geometriskt motsvarande') - - "≏": # 0x224f # audit-ignore - - T: "differansen mellom" # (en: 'difference between') - - "≐": [T: "nĂŠrmer seg grenseverdien"] # 0x2250 (en: 'approaches the limit') - - "≑": # 0x2251 # audit-ignore - - T: "geometrisk lik" # (en: 'geometrically equal to', SRE: 'Ă€r geometriskt lika med') - - "≒": # 0x2252 # audit-ignore - - T: "tilnĂŠrmet lik" # (en: 'approximately equal to or the image of', MathPlayer: 'uppskattningsvis lika med eller i likhet med', google: 'ungefĂ€r lika med eller bilden av') - - "≓": # 0x2253 # audit-ignore - - T: "tilnĂŠrmet lik" # (en: 'image of or approximately equal to', MathPlayer: 'i likhet med eller uppskattningsvis lika med', google: 'bild av eller ungefĂ€r lika med') - - "≔": [T: "definert som"] # 0x2254 (en: 'colon equals', MathPlayer: 'kolon lika med', google: 'kolon Ă€r lika med') - - "≕": [T: "lik kolon"] # 0x2255 (en: 'equals colon', MathPlayer: 'lika med kolon') - - "≖": [T: "ring i likhetstegn"] # 0x2256 (en: 'ring in equal to', SRE: 'Ă€r ring i lika med') - - "≗": # 0x2257 # audit-ignore - - T: "ring likhetstegn" # (en: 'approximately equal to') - - "≘": [T: "tilsvarer"] # 0x2258 (en: 'corresponds to') - - "≙": [T: "anslĂ„r"] # 0x2259 (en: 'estimates') - - "≚": # 0x225a - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "likevinklet med" # (en: 'equiangular to') - - "≛": [T: "stjerne lik"] # 0x225b (en: 'star equals') - # SWEDISH: misspelled delta to fix pronunciation - - "≜": [T: "delta lik"] # 0x225c (en: 'delta equals') - - "≝": [T: "er per definisjon lik"] # 0x225d (en: 'is defined to be') - - "≞": # 0x225e # audit-ignore - - T: "mĂ„les med" # (en: 'measured by') - - "≟": [T: "spĂžrsmĂ„l ved likhet"] # 0x225f (en: 'has an unknown relationship with') - - "≱": # 0x2262 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "ikke identisk med" # (en: 'not identical to') - - "≣": # 0x2263 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "strengt ekvivalent med" # (en: 'strictly equivalent to') - - "≹": # 0x2268 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "mindre enn men ikke lik" # (en: 'less than but not equal to') - - "≩": # 0x2269 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "stĂžrre enn men ikke lik" # (en: 'greater than but not equal to') - - "â‰Ș": # 0x226a - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "mye mindre enn" # (en: 'much less than') - - "≫": # 0x226b - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "mye stĂžrre enn" # (en: 'much greater than') - - "≬": # 0x226c - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "mellom" # (en: 'between') - - "≭": # 0x226d - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "ikke ekvivalent med" # (en: 'not equivalent to') - - "≼": # 0x226e - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "ikke mindre enn" # (en: 'not less than') - - "≯": # 0x226f - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "ikke stĂžrre enn" # (en: 'not greater than') - - "≰": # 0x2270 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "verken mindre enn eller lik" # (en: 'neither less than nor equal to') - - "≱": # 0x2271 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "verken stĂžrre enn eller lik" # (en: 'neither greater than nor equal to') - - "â‰Č": # 0x2272 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "mindre enn eller tilnĂŠrmet lik" # (en: 'less than or equivalent to') - - "≳": # 0x2273 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "stĂžrre enn eller tilnĂŠrmet lik" # (en: 'greater than or equivalent to') - - "≮": # 0x2274 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "verken mindre enn eller tilnĂŠrmet lik" # (en: 'neither less than nor equivalent to') - - "≔": # 0x2275 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "verken stĂžrre enn eller tilnĂŠrmet lik" # (en: 'neither greater than nor equivalent to') - - "≶": # 0x2276 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "mindre enn eller stĂžrre enn" # (en: 'less than or greater than') - - "≷": # 0x2277 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "stĂžrre enn eller mindre enn" # (en: 'greater than or less than') - - "≾": # 0x2278 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "verken mindre enn eller stĂžrre enn" # (en: 'neither less than nor greater than') - - "â‰č": # 0x2279 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "verken stĂžrre enn eller mindre enn" # (en: 'neither greater than nor less than') - - "â‰ș": [T: "foregĂ„r"] # 0x227a (en: 'precedes') - - "≻": [T: "fĂžlger"] # 0x227b (en: 'succeeds') - - "≌": [T: "foregĂ„r eller er lik"] # 0x227c (en: 'precedes or is equal to') - - "≜": [T: "fĂžlger eller er lik"] # 0x227d (en: 'succeeds or is equal to') - - "≟": [T: "foregĂ„r eller er ekvivalent med"] # 0x227e (en: 'precedes or is equivalent to') - - "≿": [T: "fĂžlger eller er ekvivalent med"] # 0x227f (en: 'succeeds or is equivalent to') - - "⊀": [T: "foregĂ„r ikke"] # 0x2280 (en: 'does not precede') - - "⊁": [T: "fĂžlger ikke"] # 0x2281 (en: 'does not succeed') - - "⊈": # 0x2288 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "verken en delmengde av eller lik" # (en: 'neither a subset of nor equal to') - - "⊉": # 0x2289 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "verken en overmengde av eller lik" # (en: 'neither a superset of nor equal to') - - "⊊": # 0x228a (en: 'subset of with not equal to') # audit-ignore -# SWEDISH: added test - - test: - if: "$Verbosity!='Terse'" - then: [T: "er en"] - - T: "ekte delmengde av" - - "⊋": # 0x228b (en: 'superset of with not equal to') # audit-ignore - # SWEDISH: added test - - test: - if: "$Verbosity!='Terse'" - then: [T: "er en"] - - T: "ekte overmengde av" - - "⊌": [T: "multimengde"] # 0x228c (SRE: 'multimĂ€ngd') - - "⊍": [T: "multimengde multiplikasjon"] # 0x228d (en: 'multiset multiplication') - - "⊎": [T: "multimengde union"] # 0x228e (SRE: 'multimĂ€ngdunion') - - "⊏": [T: "kvadratisk bilde av"] # 0x228f (en: 'square image of', MathPlayer: 'square image of', google: 'fyrkantig bild av') - - "⊐": [T: "kvadratisk original av"] # 0x2290 (en: 'square original of', MathPlayer: 'square original of', google: 'fyrkantig original av') - - "⊑": [T: "kvadratisk bilde av eller lik"] # 0x2291 (en: 'square image of or equal to', MathPlayer: 'square image of or equal to', google: 'fyrkantig bild av eller lika med') - - "⊒": [T: "kvadratisk original av eller lik"] # 0x2292 (en: 'square original of or equal to', MathPlayer: 'square original of or equal to', google: 'fyrkantig original av eller lika med') - # SWEDISH: misspelled to fix pronunciation - - "⊓": [T: "kvadratisk snitt"] # 0x2293 (en: 'square cap') - - "⊔": [T: "kvadratisk union"] # 0x2294 (SRE: 'kvadratisk kopp') - - "⊕": [T: "direkte sum"] # 0x2295 (en: 'circled plus') - - "⊖": [T: "symmetrisk differanse"] # 0x2296 (en: 'circled minus') - - "⊗": [T: "tensorprodukt"] # 0x2297 (en: 'circled times') - - "⊘": [T: "divisjon i sirkel"] # 0x2298 (en: 'circled slash') - - "⊙": [T: "direkte produkt"] # 0x2299 (en: 'circled dot operator') - - "⊚": [T: "ring-operator i sirkel"] # 0x229a (en: 'circled ring') - - "⊛": [T: "asterisk-operator i sirkel"] # 0x229b (en: 'circled asterisk') - - "⊜": [T: "likhetstegn i sirkel"] # 0x229c (en: 'circled equals') - - "⊝": [T: "tankestrek i sirkel"] # 0x229d (en: 'circled dash') - - "⊞": [T: "plusstegn i kvadrat"] # 0x229e (en: 'squared plus') - - "⊟": [T: "minustegn i kvadrat"] # 0x229f (en: 'squared minus') - - "⊠": [T: "multiplikasjonstegn i kvadrat"] # 0x22a0 (en: 'squared times') - - "⊡": [T: "dot-operator i kvadrat"] # 0x22a1 (en: 'squared dot operator') - - "⊱": [T: "beviser"] # 0x22a2 (en: 'proves') - - "⊣": [T: "beviser ikke"] # 0x22a3 (en: 'does not yield') - - "⊀": [T: "topp"] # 0x22a4 (en: 'top') - - "⊄": # 0x22a5 # audit-ignore - - T: "bunn" # (en: 'bottom', MathPlayer: 'up tack', google: 'botten') - - "⊩": [T: "reduseres til"] # 0x22a6 (en: 'reduces to') - - "⊧": [T: "modellerer"] # 0x22a7 (en: 'models', MathPlayer: 'models') - - "⊹": # 0x22a8 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "sant" # (en: 'true') - - "⊩": [T: "tvinger"] # 0x22a9 (en: 'forces') - - "âŠȘ": [T: "tre vertikale streker hĂžyre dreiekors"] # 0x22aa (en: 'triple vertical bar right turnstile') - - "⊫": [T: "dobbel vertikal strek dobbelt hĂžyre dreiekors"] # 0x22ab (en: 'double vertical bar double right turnstile') - - "⊬": [T: "beviser ikke"] # 0x22ac (en: 'does not prove') - - "⊭": # 0x22ad - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "ikke sant" # (en: 'not true') - - "⊼": [T: "tvinger ikke"] # 0x22ae (en: 'does not force') - - "⊯": [T: "overstrĂžket dobbel vertikal strek dobbelt hĂžyre dreiekors"] # 0x22af (en: 'negated double vertical bar double right turnstile') - - "⊰": [T: "foregĂ„r under relasjon"] # 0x22b0 (en: 'precedes under relation', MathPlayer: 'precedes under relation', google: 'gĂ„r foran under relasjon') - - "⊱": [T: "fĂžlger under relasjon"] # 0x22b1 (en: 'succeeds under relation', MathPlayer: 'succeeds under relation', google: 'lyckas under relation') - - "âŠČ": # 0x22b2 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er en"] # (en: 'is', google translation) - - T: "normal undergruppe av" # (en: 'a normal subgroup of') - - "⊳": [T: "inneholder som normal undergruppe"] # 0x22b3 (en: 'contains as a normal subgroup') - - "⊮": # 0x22b4 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er en"] # (en: 'is', google translation) - - T: "normal undergruppe av eller lik" # (en: 'a normal subgroup of or equal to') - - "⊔": [T: "inneholder som normal undergruppe eller lik"] # 0x22b5 (en: 'contains as a normal subgroup or equal to') - - "⊶": # 0x22b6 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "definisjonsmengden til" # (en: 'the original of', MathPlayer: 'original of', google: 'originalet av') - - "⊷": # 0x22b7 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "verdimengden til" # (en: 'an image of', MathPlayer: 'image of', google: 'en bild av') - - "⊾": [T: "multimap"] # 0x22b8 (SRE: 'multimatris') - - "âŠč": [T: "hermitisk matrise"] # 0x22b9 (SRE: 'hermetisk konjugatmatris') - - "âŠș": [T: "innskudd"] # 0x22ba (en: 'intercalate', MathPlayer: 'intercalate', google: 'interkalat') - - "⊻": [T: "eksklusiv eller"] # 0x22bb (en: 'xor') - - "⊌": [T: "ikke-og"] # 0x22bc (en: 'nand') - - "⊜": [T: "ikke-eller"] # 0x22bd (en: 'nor') - - "⊟": [T: "rett vinkel med bue"] # 0x22be (en: 'right angle with arc') - - "⊿": [T: "rettvinklet trekant"] # 0x22bf (en: 'right triangle') - - "⋀": [T: "logisk og"] # 0x22c0 (en: 'logical and') - - "⋁": [T: "logisk eller"] # 0x22c1 (en: 'logical or') - # SWEDISH: misspelled to fix pronunciation - - "⋂": [T: "snitt"] # 0x22c2 (en: 'intersection') - - "⋃": [T: "union"] # 0x22c3 - - "⋄": [T: "diamant-operator"] # 0x22c4 - - "⋅": # 0x22c5 - - test: - if: "@data-chem-formula-op" - then: [T: "ganger"] # (en: 'dot', google translation) - else: [T: "ganger"] # (en: 'times') - - - "⋆": [T: "stjerne"] # 0x22c6 (en: 'times') - - "⋇": [T: "divisjon ganger"] # 0x22c7 (en: 'division times') - - "⋈": [T: "naturlig join"] # 0x22c8 (en: 'bowtie', MathPlayer: 'bowtie') - - "⋉": # 0x22c9 # audit-ignore - - T: "venstre semi-join" # (en: 'the left normal factor semidirect product of') - - "⋊": # 0x22ca # audit-ignore - - T: "hĂžyre semi-join" # (en: 'the right normal factor semidirect product of') - - "⋋": # 0x22cb # audit-ignore - - T: "venstre semi-direkte produkt" # (en: 'the left semidirect product of') - - "⋌": # 0x22cc # audit-ignore - - T: "hĂžyre semi-direkte produkt" # (en: 'the right semidirect product of') - - "⋍": [T: "omvendt tilde likhetstegn"] # 0x22cd (en: 'reversed tilde equals') - - "⋎": [T: "krĂžllete logisk eller"] # 0x22ce - - "⋏": [T: "krĂžllete logisk og"] # 0x22cf (en: 'curly logical and') - - "⋐": # 0x22d0 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er en"] # (en: 'is', google translation) - - T: "dobbel delmengde av" # (en: 'a double subset of') - - "⋑": # 0x22d1 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er en"] # (en: 'is', google translation) - - T: "dobbel overmengde av" # (en: 'a double superset of') - - "⋒": # 0x22d2 # audit-ignore - - T: "det doble snittet av" # (en: 'double intersection of') - - "⋓": # 0x22d3 # audit-ignore - - T: "den doble unionen av" # (en: 'double union of') - - "⋔": # 0x22d4 # audit-ignore - - T: "det ekte snittet av" # (en: 'proper intersection of', MathPlayer: 'pitchfork', google: 'korrekt skĂ€rningspunkt av') - - "⋕": # 0x22d5 # audit-ignore - - T: "lik og parallell med" # (en: 'equal to and parallel to') - - "⋖": [T: "mindre enn med prikk"] # 0x22d6 (en: 'less than with dot') - - "⋗": [T: "stĂžrre enn med prikk"] # 0x22d7 (en: 'greater than with dot') - - "⋘": # 0x22d8 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "veldig mye mindre enn" # (en: 'very much less than') - - "⋙": # 0x22d9 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "veldig mye stĂžrre enn" # (en: 'very much greater than') - - "⋚": # 0x22da - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "mindre enn lik eller stĂžrre enn" # (en: 'less than equal to or greater than') - - "⋛": # 0x22db - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "stĂžrre enn lik eller mindre enn" # (en: 'greater than equal to or less than') - - "⋜": # 0x22dc - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "lik eller mindre enn" # (en: 'equal to or less than') - - "⋝": # 0x22dd - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "lik eller stĂžrre enn" # (en: 'equal to or greater than') - - "⋞": # 0x22de - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "lik eller foregĂ„r" # (en: 'equal to or precedes') - - "⋟": # 0x22df - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "lik eller fĂžlger" # (en: 'equal to or succeeds') - - "⋠": [T: "verken foregĂ„r eller er lik"] # 0x22e0 (en: 'does not precede nor is equal to') - - "⋡": [T: "verken fĂžlger eller er lik"] # 0x22e1 (en: 'does not succeed nor is equal to') - - "⋱": [T: "verken et kvadratisk bilde av eller lik"] # 0x22e2 - - "⋣": [T: "verken kvadratisk original av eller lik"] # 0x22e3 - - "â‹€": [T: "kvadratisk bilde av eller ikke lik"] # 0x22e4 - - "â‹„": [T: "kvadratisk original av eller ikke lik"] # 0x22e5 - - "⋩": # 0x22e6 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "mindre enn men ikke ekvivalent med" # (en: 'less than but not equivalent to') - - "⋧": # 0x22e7 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "stĂžrre enn men ikke ekvivalent med" # (en: 'greater than but not equivalent to') - - "⋹": [T: "foregĂ„r men er ikke ekvivalent med"] # 0x22e8 (en: 'precedes but is not equivalent to') - - "⋩": [T: "fĂžlger men er ikke ekvivalent med"] # 0x22e9 (en: 'succeeds but is not equivalent to') - - "â‹Ș": # 0x22ea - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "ikke en normal undergruppe av" # (en: 'not a normal subgroup of') - - "⋫": [T: "inneholder ikke som normal undergruppe"] # 0x22eb (en: 'does not contain as a normal subgroup') - - "⋬": # 0x22ec - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "verken en normal undergruppe av eller lik" # (en: 'not a normal subgroup of nor is equal to') - - "⋭": [T: "verken inneholder som normal undergruppe eller er lik"] # 0x22ed (en: 'does not contain as a normal subgroup nor is equal to') - - "⋼": [T: "vertikal ellipse"] # 0x22ee (en: 'vertical ellipsis') - - "⋯": [T: "halvhĂžy horisontal ellipse"] # 0x22ef (en: 'dot dot dot') - - "⋰": [T: "diagonal ellipse oppover"] # 0x22f0 (en: 'upwards diagonal ellipsis') - - "⋱": [T: "diagonal ellipse nedover"] # 0x22f1 (en: 'diagonal ellipsis') - - "â‹Č": [T: "tilhĂžrer med lang horisontal strek"] # 0x22f2 (en: 'element of with long horizontal stroke') - - "⋳": [T: "tilhĂžrer med vertikal strek pĂ„ slutten av horisontal strek"] # 0x22f3 (en: 'element of with vertical bar at end of horizontal stroke') - - "⋮": [T: "tilhĂžrer med vertikal strek pĂ„ slutten av horisontal strek"] # 0x22f4 (en: 'element of with vertical bar at end of horizontal stroke') - - "â‹”": [T: "tilhĂžrer med prikk over"] # 0x22f5 (en: 'element of with dot above') - - "⋶": [T: "tilhĂžrer med strek over"] # 0x22f6 (en: 'element of with overbar') - - "⋷": [T: "tilhĂžrer med strek over"] # 0x22f7 (en: 'element of with overbar', MathPlayer: 'element of or equal to', google: 'element av med överbar') - - "⋾": [T: "tilhĂžrer med strek under"] # 0x22f8 (en: 'element of with underbar') - - "â‹č": [T: "tilhĂžrer med to horisontale streker"] # 0x22f9 (en: 'element of with two horizontal strokes') - - "â‹ș": [T: "inneholder med lang horisontal strek"] # 0x22fa (en: 'contains with long horizontal stroke') - - "⋻": [T: "inneholder med vertikal strek pĂ„ slutten av horisontal strek"] # 0x22fb (en: 'contains with vertical bar at end of horizontal stroke') - - "⋌": [T: "inneholder med vertikal strek pĂ„ slutten av horisontal strek"] # 0x22fc (en: 'contains with vertical bar at end of horizontal stroke') - - "⋜": [T: "inneholder med strek over"] # 0x22fd (en: 'contains with overbar', MathPlayer: 'contains or equal to', google: 'innehĂ„ller med overbar') - - "⋟": [T: "inneholder med strek over"] # 0x22fe (en: 'contains with overbar') - - "⋿": [T: "tilhĂžrer ifĂžlge z-notation"] # 0x22ff (en: 'z notation bag membership', MathPlayer: 'z notation bag membership', google: 'z medlemskap för notation bag') - #------------------------------------------------------------------------------------------------------------- - #Miscellaneous Technical OK - - "⌀": [T: "diameter"] # 0x2300 - - "⌁": [T: "elektrisk pil"] # 0x2301 (en: 'electric arrow') - - "⌂": [T: "hus"] # 0x2302 (en: 'house') - - "⌃": [T: "pilspiss opp"] # 0x2303 (en: 'up arrowhead', google: 'upp pilspetsen') - - "⌄": [T: "pilspiss ned"] # 0x2304 (en: 'down arrowhead', google: 'ner pilspetsen') - - "⌅": [T: "projektiv"] # 0x2305 (en: 'projective') - - "⌆": [T: "perspektiv"] # 0x2306 (en: 'perspective') - - "⌇": [T: "bĂžlget linje"] # 0x2307 (en: 'wavy line', google: 'wavy line') - - "⌈": [T: "venstre tak"] # 0x2308 (en: 'left ceiling') - - "⌉": [T: "hĂžyre tak"] # 0x2309 (en: 'right ceiling') - - "⌊": [T: "venstre gulv"] # 0x230a (en: 'left floor') - - "⌋": [T: "hĂžyre gulv"] # 0x230b (en: 'right floor') - - "⌌": [T: "nedre hĂžyre utsnitt"] # 0x230c (en: 'bottom right crop') - - "⌍": [T: "nedre venstre utsnitt"] # 0x230d (en: 'bottom left crop') - - "⌎": [T: "Ăžvre hĂžyre utsnitt"] # 0x230e (en: 'top right crop') - - "⌏": [T: "Ăžvre venstre utsnitt"] # 0x230f (en: 'top left crop') - - "⌐": [T: "omvendt ikke"] # 0x2310 (en: 'reversed not sign') - - "⌑": [T: "kvadratisk rombe"] # 0x2311 (en: 'square lozenge', google: 'square pastill') - - "⌒": [T: "bue"] # 0x2312 (en: 'arc') - - "⌓": [T: "segment"] # 0x2313 - - "⌔": [T: "sektor"] # 0x2314 (en: 'sector') - - "⌕": [T: "telefonopptaker"] # 0x2315 (en: 'telephone recorder', google: 'telefoninspelare') - - "⌖": [T: "trĂ„dkors"] # 0x2316 (en: 'position indicator crosshairs', google: 'positionindikator korsstolar') - - "⌗": [T: "firkant"] # 0x2317 (google translation) - - "⌘": [T: "severdighet"] # 0x2318 (en: 'place of interest sign', google: 'plats för rĂ€ntetecken') - - "⌙": [T: "rotert ikke"] # 0x2319 (en: 'turned not sign', google translation) - - "⌚": [T: "klokke"] # 0x231a (en: 'watch', google: 'kolla pĂ„') - - "⌛": [T: "timeglass"] # 0x231b (en: 'hourglass', google translation) - - "⌜": [T: "Ăžvre venstre hjĂžrne"] # 0x231c (en: 'top left corner') - - "⌝": [T: "Ăžvre hĂžyre hjĂžrne"] # 0x231d (en: 'top right corner') - - "⌞": [T: "nedre venstre hjĂžrne"] # 0x231e (en: 'bottom left corner') - - "⌟": [T: "nedre hĂžyre hjĂžrne"] # 0x231f (en: 'bottom right corner') - - "⌠": [T: "Ăžvre halvdel integral"] # 0x2320 (en: 'top half integral') - - "⌡": [T: "nedre halvdel integral"] # 0x2321 (en: 'bottom half integral') - - "⌱": [T: "rynke"] # 0x2322 (en: 'frown', google: 'rynka pannan') - - "⌣": [T: "smil"] # 0x2323 (en: 'smile') - - "⌀": [T: "enter"] # 0x2324 (en: 'up arrowhead between two horizontal bars', google: 'upp pilspetsen mellan tvĂ„ horisontella staplar') - - "⌄": [T: "option-tast"] # 0x2325 (en: 'option key', google translation) - - "〈": [T: "delete"] # 0x2326 (en: 'erase to the right', google translation) - - "⌧": [T: "clear"] # 0x2327 (en: 'x in a rectangle box', google translation) - - "⌹": [T: "tastatur"] # 0x2328 (en: 'keyboard', google translation) - - "〈": [T: "venstre vinkelparentes"] # 0x2329 (en: 'left pointing angle bracket') - - "âŒȘ": [T: "hĂžyre vinkelparentes"] # 0x232a (en: 'right pointing angle bracket') - - "⌫": [T: "backspace"] # 0x232b (en: 'erase to the left', google translation) - - "⌬": [T: "benzenring"] # 0x232c (en: 'benzene ring', google translation) - - "⌭": [T: "sylindrisitet"] # 0x232d - - "⌼": [T: "all around profile"] # 0x232e (google: 'runt profilen') - - "⌯": [T: "symmetri"] # 0x232f (en: 'symmetry', google translation) - - "⌰": [T: "total runout"] # 0x2330 (google translation) - - "⌱": [T: "dimensjon origo"] # 0x2331 (google translation) - - "âŒČ": [T: "konisk avsmalning"] # 0x2332 (en: 'conical taper', google translation) - - "⌳": [T: "helning"] # 0x2333 (en: 'slope', google translation) - - "⌮": [T: "plansenkning"] # 0x2334 (en: 'counterbore', google translation) - - "⌔": [T: "forsenkning"] # 0x2335 (en: 'countersink', google translation) - - "⌶": [T: "apl i beam"] # 0x2336 - - "⌜": [T: "apl circle stile"] # 0x233d - - "⌿": [T: "apl slash bar"] # 0x233f - - "⍌": [T: "rett vinkel med nedover sikksakk-pil"] # 0x237c - - "⎔": [T: "heksagon"] # 0x2394 - - "⎶": [T: "nedre hakeparentes over Ăžvre hakeparentes"] # 0x23b6 - - "⏜": [T: "Ăžvre parentes"] # 0x23dc - - "⏝": [T: "nedre parentes"] # 0x23dd - - "⍰": [T: "ukjent boks"] # 0x2370 (en: 'unknown box', google: 'okĂ€nd ruta') - - "⎕": [T: "boks"] # 0x2395 (en: 'box', google translation) - - "⏞": [T: "Ăžvre krĂžllparentes"] # 0x23DE (en: 'top brace') - - "⏟": [T: "nedre krĂžllparentes"] # 0x23DF (en: 'bottom brace') - - "⏠": [T: "Ăžvre skilpaddeskall-parentes"] # 0x23e0 - - "⏡": [T: "nedre skilpaddeskall-parentes"] # 0x23e1 - - "⏱": [T: "hvit trapes"] # 0x23e2 - - "⏣": [T: "benzenring med sirkel"] # 0x23e3 - - "⏀": [T: "retthet"] # 0x23e4 - - "⏄": [T: "flathet"] # 0x23e5 - - "⏊": [T: "vekselstrĂžm"] # 0x23e6 - - "⏧": [T: "elektrisk skjĂŠring"] # 0x23e7 - #---------------------------------------------------------------------------------------------------- - #Enclosed Alphanumerics OK - - "①-⑹": # 0x2460 - 0x2469 - # SWEDISH: switched order - - SPELL: "translate('.', '①⑥⑹④⑀⑄⑊⑧⑚', '123456789')" - - T: "i sirkel" # (en: 'circled') - - "⑩": [T: "ti i sirkel"] # 0x2469 (en: 'circled ten', google translation) - - "â‘Ș": [T: "elleve i sirkel"] # 0x246a (en: 'circled eleven', google translation) - - "⑫": [T: "tolv i sirkel"] # 0x246b (en: 'circled twelve', google translation) - - "⑬": [T: "tretten i sirkel"] # 0x246c (en: 'circled thirteen', google translation) - - "⑭": [T: "fjorten i sirkel"] # 0x246d (en: 'circled fourteen', google translation) - - "⑼": [T: "femten i sirkel"] # 0x246e (en: 'circled fifteen', google translation) - - "⑯": [T: "seksten i sirkel"] # 0x246f (en: 'circled sixteen', google translation) - - "⑰": [T: "sytten i sirkel"] # 0x2470 (en: 'circled seventeen', google translation) - - "⑱": [T: "atten i sirkel"] # 0x2471 (en: 'circled eighteen', google translation) - - "⑳": [T: "tjue i sirkel"] # 0x2473 (en: 'circled twenty', google translation) - - "⑮-⑌": # 0x2474 - 0x247d - # SWEDISH: switched order - - SPELL: "translate('.', '⑎⑔⑶⑷⑞â‘čâ‘ș⑻⑌', '123456789')" - - T: "i parentes" # (en: 'parenthesized', google translation) - - "⑜": [T: "ti i parentes"] # 0x247d (en: 'parenthesized ten', google translation) - - "⑟": [T: "elleve i parentes"] # 0x247e (en: 'parenthesized eleven', google translation) - - "⑿": [T: "tolv i parentes"] # 0x247f (en: 'parenthesized twelve', google translation) - - "⒀": [T: "tretten i parentes"] # 0x2480 (en: 'parenthesized thirteen', google translation) - - "⒁": [T: "fjorten i parentes"] # 0x2481 (en: 'parenthesized fourteen', google translation) - - "⒂": [T: "femten i parentes"] # 0x2482 (en: 'parenthesized fifteen', google translation) - - "⒃": [T: "seksten i parentes"] # 0x2483 (en: 'parenthesized sixteen', google translation) - - "⒄": [T: "sytten i parentes"] # 0x2484 (en: 'parenthesized seventeen', google translation) - - "⒅": [T: "atten i parentes"] # 0x2485 (en: 'parenthesized eighteen', google translation) - - "⒆": [T: "nitten i parentes"] # 0x2486 (en: 'parenthesized nineteen', google translation) - - "⒇": [T: "tjue i parentes"] # 0x2487 (en: 'parenthesized twenty', google translation) - - "⒈-⒐": # 0x2488 - 0x2491 - - SPELL: "translate('.', '⒈⒉⒊⒋⒌⒍⒎⒏⒐', '123456789')" - - T: "med punktum" # (en: 'with period', google translation) - - "⒑": [T: "ti med punktum"] # 0x2491 (en: 'ten with period', google translation) - - "⒒": [T: "elleve med punktum"] # 0x2492 (en: 'eleven with period', google translation) - - "⒓": [T: "tolv med punktum"] # 0x2493 (en: 'twelve with period', google translation) - - "⒔": [T: "tretten med punktum"] # 0x2494 (en: 'thirteen with period', google translation) - - "⒕": [T: "fjorten med punktum"] # 0x2495 (en: 'fourteen with period', google translation) - - "⒖": [T: "femten med punktum"] # 0x2496 (en: 'fifteen with period', google translation) - - "⒗": [T: "seksten med punktum"] # 0x2497 (en: 'sixteen with period', google translation) - - "⒘": [T: "sytten med punktum"] # 0x2498 (en: 'seventeen with period', google translation) - - "⒙": [T: "atten med punktum"] # 0x2499 (en: 'eighteen with period', google translation) - - "⒚": [T: "nitten med punktum"] # 0x249a (en: 'nineteen with period', google translation) - - "⒛": [T: "tjue med punktum"] # 0x249b (en: 'twenty with period', google translation) - - "⒜-â’”": # 0x249c - 0x24b5 - # SWEDISH: switched order - - SPELL: "translate('.', 'â’œâ’â’žâ’Ÿâ’ â’Ąâ’ąâ’Łâ’€â’„â’Šâ’§â’šâ’©â’Șâ’«â’Źâ’­â’źâ’Żâ’°â’±â’Čâ’łâ’Žâ’”', 'abcdefghijklmnopqrstuvwxyz')" - - T: "i parentes" # (en: 'parenthesized', google translation) - - - "Ⓐ-Ⓩ": # 0x24b6 - 0x24cf - # SWEDISH: switched order - - SPELL: "translate('.', 'â’¶â’·â’žâ’čâ’șâ’»â’Œâ’œâ’Ÿâ’żâ“€â“â“‚â“ƒâ“„â“…â“†â“‡â“ˆâ“‰â“Šâ“‹â“Œâ“â“Žâ“', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - T: "i sirkel" # (en: 'circled', google translation) - - - "🅐-đŸ…©": # 0x1f150 - 0x1f169 - # switched order - - SPELL: "translate('.', 'đŸ…đŸ…‘đŸ…’đŸ…“đŸ…”đŸ…•đŸ…–đŸ…—đŸ…˜đŸ…™đŸ…šđŸ…›đŸ…œđŸ…đŸ…žđŸ…ŸđŸ… đŸ…ĄđŸ…ąđŸ…ŁđŸ…€đŸ…„đŸ…ŠđŸ…§đŸ…šđŸ…©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - T: "i fylt sirkel" # (en: 'black circled', google translation) - - - "ⓐ-ⓩ": # 0x24d0 - 0x24e9 - # SWEDISH: switched order - - SPELL: "translate('.', 'â“â“‘â“’â““â“”â“•â“–â“—â“˜â“™â“šâ“›â“œâ“â“žâ“Ÿâ“ â“Ąâ“ąâ“Łâ“€â“„â“Šâ“§â“šâ“©', 'abcdefghijklmnopqrstuvwxyz')" - - T: "i sirkel" # (en: 'circled', google translation) - - "â“Ș": [T: "null i sirkel"] # 0x24ea (google translation) - - "⓫": [T: "elleve i fylt sirkel"] # 0x24eb (en: 'black circled eleven', google translation) - - "⓬": [T: "tolv i fylt sirkel"] # 0x24ec (en: 'black circled twelve', google translation) - - "⓭": [T: "tretten i fylt sirkel"] # 0x24ed (en: 'black circled thirteen', google translation) - - "⓼": [T: "fjorten i fylt sirkel"] # 0x24ee (en: 'black circled fourteen', google translation) - - "⓯": [T: "femten i fylt sirkel"] # 0x24ef (en: 'black circled fifteen', google translation) - - "⓰": [T: "seksten i fylt sirkel"] # 0x24f0 (en: 'black circled sixteen', google translation) - - "⓱": [T: "sytten i fylt sirkel"] # 0x24f1 (en: 'black circled seventeen', google translation) - - "â“Č": [T: "atten i fylt sirkel"] # 0x24f2 (en: 'black circled eighteen', google translation) - - "⓳": [T: "nitten i fylt sirkel"] # 0x24f3 (en: 'black circled nineteen', google translation) - - "⓮": [T: "tjue i fylt sirkel"] # 0x24f4 (en: 'black circled twenty', google translation) - - "â“”-ⓜ": # 0x24f5 - 0x24fe - # SWEDISH: switched order - - SPELL: "translate('.', 'ⓔ⓶⓷ⓞâ“čâ“ș⓻Ⓦⓜ', '123456789')" - - T: "i dobbel sirkel" # (en: 'double circled', google translation) - - "ⓟ": [T: "ti i dobbel sirkel"] # 0x24fe (en: 'double circled ten', google translation) - - "⓿": [T: "null i fylt sirkel"] # 0x24ff (en: 'black circled zero', google translation) - #------------------------------------------------------------------------------------------------------------------ - #Geometric shapes OK - - "■": [T: "svart kvadrat"] # 0x25a0 (en: 'black square') - - "□": [T: "hvitt kvadrat"] # 0x25a1 (en: 'white square') - - "▱": [T: "hvitt kvadrat med avrundede hjĂžrner"] # 0x25a2 (en: 'white square with rounded corners', google: 'vit fyrkant med rundade hörn') - - "▣": [T: "lite svart kvadrat i hvitt kvadrat"] # 0x25a3 (en: 'white square containing small black square', google: 'vit fyrkant som innehĂ„ller en liten svart fyrkant') - - "â–€": [T: "kvadrat med horisontalt fyll"] # 0x25a4 (en: 'square with horizontal fill', google: 'fyrkantig med horisontell fyllning') - - "â–„": [T: "kvadrat med vertikalt fyll"] # 0x25a5 (en: 'square with vertical fill', google: 'fyrkantig med vertikal fyllning') - - "▩": [T: "kvadrat med ortogonal skravering"] # 0x25a6 (en: 'square with orthogonal crosshatch fill', google: 'fyrkantig med ortogonal crosshatch -fyllning') - - "▧": [T: "kvadrat med fyll fra Ăžvre venstre til nedre hĂžyre"] # 0x25a7 (en: 'square with upper left to lower right fill', google: 'fyrkantig med övre vĂ€nster till nedre högra fyllning') - - "▹": [T: "kvadrat med fyll fra Ăžvre hĂžyre til nedre venstre"] # 0x25a8 (en: 'square with upper right to lower left fill', google: 'fyrkantig med övre höger till nedre vĂ€nsterfyllning') - - "▩": [T: "kvadrat med diagonal skravering"] # 0x25a9 (en: 'square with diagonal crosshatch fill', google: 'fyrkantig med diagonal korshatchfyllning') - - "â–Ș": [T: "lite svart kvadrat"] # 0x25aa (en: 'black small square') - - "▫": [T: "lite hvitt kvadrat"] # 0x25ab (en: 'white small square') - - "▬": [T: "svart rektangel"] # 0x25ac (en: 'black rectangle') - - "▭": [T: "hvitt rektangel"] # 0x25ad (en: 'white rectangle') - - "▼": [T: "svart vertikalt rektangel"] # 0x25ae (en: 'black vertical rectangle') - - "▯": [T: "hvitt vertikalt rektangel"] # 0x25af (en: 'white vertical rectangle') - - "▰": [T: "svart parallellogram"] # 0x25b0 (en: 'black parallelogram') - - "▱": [T: "hvitt parallellogram"] # 0x25b1 (en: 'white parallelogram') - - "â–Č": [T: "svart oppoverpekende trekant"] # 0x25b2 (en: 'black up pointing triangle') - - "△": [T: "hvit oppoverpekende trekant"] # 0x25b3 (en: 'white up pointing triangle') - - "▮": [T: "liten svart oppoverpekende trekant"] # 0x25b4 (en: 'black up pointing small triangle') - - "â–”": [T: "liten hvit oppoverpekende trekant"] # 0x25b5 (en: 'white up pointing small triangle') - - "▶": [T: "svart hĂžyrepekende trekant"] # 0x25b6 (en: 'black right pointing triangle') - - "▷": [T: "hvit hĂžyrepekende trekant"] # 0x25b7 (en: 'white right pointing triangle') - - "▾": [T: "liten svart hĂžyrepekende trekant"] # 0x25b8 (en: 'black right pointing small triangle') - - "â–č": [T: "liten hvit hĂžyrepekende trekant"] # 0x25b9 (en: 'white right pointing small triangle') - - "â–ș": [T: "svart hĂžyre-peker"] # 0x25ba (en: 'black right pointing pointer', google: 'svart höger pekande pekare') - - "▻": [T: "hvit hĂžyre-peker"] # 0x25bb (en: 'white right pointing pointer', google: 'vit höger pekande pekare') - - "â–Œ": [T: "svart nedoverpekende trekant"] # 0x25bc (en: 'black down pointing triangle', MathPlayer: 'svart triangel med spetsen nerĂ„t', google: 'svart ner pekande triangel') - - "â–œ": [T: "hvit nedoverpekende trekant"] # 0x25bd (en: 'white down pointing triangle', MathPlayer: 'vit triangel med spetsen nerĂ„t', google: 'vit ner pekande triangel') - - "â–Ÿ": [T: "liten svart nedoverpekende trekant"] # 0x25be (en: 'black down pointing small triangle', MathPlayer: 'svart triangel med spetsen nerĂ„t', google: 'svart ner pekande liten triangel') - - "▿": [T: "liten hvit nedoverpekende trekant"] # 0x25bf (en: 'white down pointing small triangle', MathPlayer: 'vit triangel med spetsen nerĂ„t', google: 'vit ner pekande liten triangel') - - "◀": [T: "svart venstrepekende trekant"] # 0x25c0 (en: 'black left pointing triangle') - - "◁": [T: "hvit venstrepekende trekant"] # 0x25c1 (en: 'white left pointing triangle') - - "◂": [T: "liten svart venstrepekende trekant"] # 0x25c2 (en: 'black left pointing small triangle') - - "◃": [T: "liten hvit venstrepekende trekant"] # 0x25c3 (en: 'white left pointing small triangle') - - "◄": [T: "svart venstre-peker"] # 0x25c4 (en: 'black left pointing pointer') - - "◅": [T: "hvit venstre-peker"] # 0x25c5 (en: 'white left pointing pointer') - - "◆": [T: "svart diamant"] # 0x25c6 (en: 'black diamond') - - "◇": [T: "hvit diamant"] # 0x25c7 (en: 'white diamond') - - "◈": [T: "svart diamant i hvit diamant"] # 0x25c8 (en: 'white diamond containing black small diamond') - - "◉": [T: "fiskeĂžye"] # 0x25c9 (en: 'fisheye') - - "◊": [T: "rombe"] # 0x25ca (en: 'lozenge') - - "○": [T: "hvit sirkel"] # 0x25cb (en: 'white circle') - - "◌": [T: "stiplet sirkel"] # 0x25cc (en: 'dotted circle') - - "◍": [T: "sirkel med vertikalt fyll"] # 0x25cd (en: 'circle with vertical fill') - - "◎": [T: "bullseye"] # 0x25ce (SRE: 'mitt-i-prick') - - "●": [T: "svart sirkel"] # 0x25cf (en: 'black circle') - - "◐": [T: "sirkel med venstre halvdel fylt"] # 0x25d0 (en: 'circle with left half black') - - "◑": [T: "sirkel med hĂžyre halvdel fylt"] # 0x25d1 (en: 'circle with right half black') - - "◒": [T: "sirkel med nedre halvdel fylt"] # 0x25d2 (en: 'circle with lower half black') - - "◓": [T: "sirkel med Ăžvre halvdel fylt"] # 0x25d3 (en: 'circle with upper half black') - - "◔": [T: "sirkel med Ăžvre hĂžyre kvadrant fylt"] # 0x25d4 (en: 'circle with upper right quadrant black') - - "◕": [T: "sirkel fylt bortsett fra Ăžvre venstre kvadrant"] # 0x25d5 (en: 'circle with all but upper left quadrant black') - - "◖": [T: "venstre halvsirkel"] # 0x25d6 (en: 'left half black circle') - - "◗": [T: "hĂžyre halvsirkel"] # 0x25d7 (en: 'right half black circle') - - "◘": [T: "invertert punkt"] # 0x25d8 (en: 'inverse bullet') - - "◙": [T: "invertert hvit sirkel"] # 0x25d9 (en: 'inverse white circle') - - "◚": [T: "invertert hvit Ăžvre halvsirkel"] # 0x25da (en: 'upper half inverse white circle') - - "◛": [T: "invertert hvit nedre halvsirkel"] # 0x25db (en: 'lower half inverse white circle') - - "◜": [T: "Ăžvre venstre kvadrant av sirkelbue"] # 0x25dc (en: 'upper left quadrant circular arc') - - "◝": [T: "Ăžvre hĂžyre kvadrant av sirkelbue"] # 0x25dd (en: 'upper right quadrant circular arc') - - "◞": [T: "nedre hĂžyre kvadrant av sirkelbue"] # 0x25de (en: 'lower right quadrant circular arc') - - "◟": [T: "nedre venstre kvadrant av sirkelbue"] # 0x25df (en: 'lower left quadrant circular arc') - - "◠": [T: "Ăžvre halvsirkel"] # 0x25e0 (en: 'upper half circle') - - "◡": [T: "nedre halvsirkel"] # 0x25e1 (en: 'lower half circle') - - "◱": [T: "svart trekant ned til hĂžyre"] # 0x25e2 (en: 'black lower right triangle', MathPlayer: 'svart triangel nerĂ„t höger', google: 'svart nedre höger triangel') - - "◣": [T: "svart trekant ned til venstre"] # 0x25e3 (en: 'black lower left triangle', MathPlayer: 'svart triangel nerĂ„t vĂ€nster', google: 'svart nedre vĂ€nster triangel') - - "â—€": [T: "svart trekant oppe til venstre"] # 0x25e4 (en: 'black upper left triangle') - - "â—„": [T: "svart trekant oppe til hĂžyre"] # 0x25e5 (en: 'black upper right triangle') - - "◩": [T: "hvitt punkt"] # 0x25e6 (en: 'composition') - - "◧": [T: "kvadrat med venstre halvdel fylt"] # 0x25e7 (en: 'square with left half black') - - "◹": [T: "kvadrat med hĂžyre halvdel fylt"] # 0x25e8 (en: 'square with right half black') - - "◩": [T: "kvadrat med Ăžvre venstre halvdel fylt"] # 0x25e9 (en: 'square with upper left half black') - - "â—Ș": [T: "kvadrat med nedre hĂžyre halvdel fylt"] # 0x25ea (en: 'square with lower right half black') - - "◫": [T: "hvitt kvadrat med midtlinje"] # 0x25eb (en: 'white square with bisecting line') - - "◬": [T: "hvit oppoverpekende trekant med prikk"] # 0x25ec (en: 'white up pointing triangle with dot') - - "◭": [T: "oppoverpekende trekant med venstre halvdel fylt"] # 0x25ed (en: 'up pointing triangle with left half black') - - "◼": [T: "oppoverpekende trekant med hĂžyre halvdel fylt"] # 0x25ee (en: 'up pointing triangle with right half black') - - "◯": [T: "stor sirkel"] # 0x25ef (en: 'large circle') - - "◰": [T: "hvitt kvadrat med Ăžvre venstre kvadrant"] # 0x25f0 (en: 'white square with upper left quadrant', google: 'vit fyrkant med övre vĂ€nstra kvadrant') - - "◱": [T: "hvitt kvadrat med nedre venstre kvadrant"] # 0x25f1 (en: 'white square with lower left quadrant', google: 'vit fyrkant med nedre vĂ€nster kvadrant') - - "â—Č": [T: "hvitt kvadrat med nedre hĂžyre kvadrant"] # 0x25f2 (en: 'white square with lower right quadrant', google: 'vit fyrkant med nedre högra kvadrant') - - "◳": [T: "hvitt kvadrat med Ăžvre hĂžyre kvadrant"] # 0x25f3 (en: 'white square with upper right quadrant', google: 'vit fyrkant med övre högra kvadrant') - - "◮": [T: "hvit sirkel med Ăžvre venstre kvadrant"] # 0x25f4 (en: 'white circle with upper left quadrant', google: 'vit cirkel med övre vĂ€nstra kvadrant') - - "â—”": [T: "hvit sirkel med nedre venstre kvadrant"] # 0x25f5 (en: 'white circle with lower left quadrant') - - "◶": [T: "hvit sirkel med nedre hĂžyre kvadrant"] # 0x25f6 (en: 'white circle with lower right quadrant', google: 'vit cirkel med nedre högra kvadrant') - - "◷": [T: "hvit sirkel med Ăžvre hĂžyre kvadrant"] # 0x25f7 (en: 'white circle with upper right quadrant', google: 'vit cirkel med övre högra kvadrant') - - "◾": [T: "trekant oppe til venstre"] # 0x25f8 (en: 'upper left triangle') - - "â—č": [T: "trekant oppe til hĂžyre"] # 0x25f9 (en: 'upper right triangle') - - "â—ș": [T: "trekant ned til venstre"] # 0x25fa (en: 'lower left triangle') - - "◻": [T: "mellomstort hvitt kvadrat"] # 0x25fb (en: 'white medium square') - - "â—Œ": [T: "mellomstort svart kvadrat"] # 0x25fc (en: 'black medium square') - - "â—œ": [T: "hvitt middels lite kvadrat"] # 0x25fd (en: 'white medium small square') - - "â—Ÿ": [T: "svart middels lite kvadrat"] # 0x25fe (en: 'black medium small square') - - "◿": [T: "trekant ned til hĂžyre"] # 0x25ff (en: 'lower right triangle') - #------------------------------------------------------------------------------------------------ - #Miscellaneous symbols OK - - "★": [T: "svart stjerne"] # 0x2605 - - "☆": [T: "hvit stjerne"] # 0x2606 - - "☉": [T: "sol"] # 0x2609 - - "☌": [T: "konjunksjon"] # 0x260c - - "☒": [T: "avkrysningsboks med kryss"] # 0x2612 - - "☜": [T: "tiltagende mĂ„ne"] # 0x263d - - "☟": [T: "avtagende mĂ„ne"] # 0x263e - - "☿": [T: "merkur"] # 0x263f - - "♀": [T: "kvinne"] # 0x2640 - - "♁": [T: "jorda"] # 0x2641 - - "♂": [T: "mann"] # 0x2642 - - "♃": [T: "jupiter"] # 0x2643 - - "♄": [T: "saturn"] # 0x2644 - - "♅": [T: "uranus"] # 0x2645 - - "♆": [T: "neptun"] # 0x2646 - - "♇": [T: "pluto"] # 0x2647 - - "♈": [T: "vĂŠren"] # 0x2648 - - "♉": [T: "tyren"] # 0x2649 - - "♩": [T: "fjerdedelsnote"] # 0x2669 - - "♭": [T: "musikalsk b"] # 0x266d - - "♼": [T: "musikalsk opplĂžsningstegn"] # 0x266e - - "♯": [T: "musikalsk kryss"] # 0x266f - - "♠": [T: "svart spar"] # 0x2660 (en: 'black spade suit', google: 'svart spade kostym') - - "♡": [T: "hvit hjerter"] # 0x2661 (en: 'white heart suit', google: 'vit hjĂ€rtdrĂ€kt') - - "♱": [T: "hvit ruter"] # 0x2662 (en: 'white diamond suit', google: 'vit diamantdrĂ€kt') - - "♣": [T: "svart klĂžver"] # 0x2663 (en: 'black club suit', google: 'svart klubbdrĂ€kt') - - "♀": [T: "hvit spar"] # 0x2664 (en: 'white spade suit', google: 'vit spade kostym') - - "♄": [T: "svart hjerter"] # 0x2665 (en: 'black heart suit', google: 'black heart suit') - - "♩": [T: "svart ruter"] # 0x2666 (en: 'black diamond suit', google: 'svart diamantdrĂ€kt') - - "♧": [T: "hvit klĂžver"] # 0x2667 (en: 'white club suit', google: 'vit klubbdrĂ€kt') - - "⚀": [T: "terningkast 1"] # 0x2680 - - "⚁": [T: "terningkast 2"] # 0x2681 - - "⚂": [T: "terningkast 3"] # 0x2682 - - "⚃": [T: "terningkast 4"] # 0x2683 - - "⚄": [T: "terningkast 5"] # 0x2684 - - "⚅": [T: "terningkast 6"] # 0x2685 - - "⚆": [T: "hvit sirkel med prikk til hĂžyre"] # 0x2686 - - "⚇": [T: "hvit sirkel med to prikker"] # 0x2687 - - "⚈": [T: "svart sirkel med prikk til hĂžyre"] # 0x2688 - - "⚉": [T: "svart sirkel med to prikker"] # 0x2689 - - "âšȘ": [T: "mellomstor hvit sirkel"] # 0x26aa - - "⚫": [T: "mellomstor svart sirkel"] # 0x26ab - - "⚬": [T: "middels liten hvit sirkel"] # 0x26ac - - "âšČ": [T: "nĂžytral"] # 0x26b2 - - #------------------------------------------------------------------------------------------------ - #Dingbats OK - - "✓": [T: "avkrysningshake"] # 0x2713 - - "✠": [T: "malteserkors"] # 0x2720 - - "âœȘ": [T: "sirkel med hvit stjerne"] # 0x272a - - "✶": [T: "svart heksagram"] # 0x2736 - - "❚": [T: "venstreparentes"] # 0x2768 (en: 'medium left parentheses ornament', google: 'medium vĂ€nster-parentesesprydnad') - - "❩": [T: "hĂžyreparentes"] # 0x2769 (en: 'medium right parentheses ornament', google: 'medium höger parentesetheses ornament') - - "âȘ": [T: "avflatet venstreparentes"] # 0x276a (en: 'medium flattened left parentheses ornament', google: 'medium plattad vĂ€nster parentese -prydnad') - - "❫": [T: "avflatet hĂžyreparentes"] # 0x276b (en: 'medium flattened right parentheses ornament', google: 'medium platta höger parentesetheses prydnad') - - "❬": [T: "venstre vinkel-parentes"] # 0x276c (en: 'medium left-pointing angle bracket ornament', google: 'medium vĂ€nsterpekande vinkelfĂ€ste prydnad') - - "❭": [T: "hĂžyre vinkel-parentes"] # 0x276d (en: 'medium right-pointing angle bracket ornament', google: 'medium högerpekande vinkelfĂ€ste prydnad') - - "❼": [T: "fet venstre anfĂžrselstegn"] # 0x276e (en: 'heavy left-pointing angle quotation mark ornament', google: 'tung vĂ€nsterpekande vinkelcitationsmĂ€rke prydnad') - - "❯": [T: "fet hĂžyre anfĂžrselstegn"] # 0x276f (en: 'heavy right-pointing angle quotation mark ornament', google: 'tung högerpekande vinkelcitationsmĂ€rke prydnad') - - "❰": [T: "fet venstre vinkel-parentes"] # 0x2770 (en: 'heavy left-pointing angle bracket ornament', google: 'tung vĂ€nsterpekande vinkelfĂ€ste prydnad') - - "❱": [T: "fet hĂžyre vinkel-parentes"] # 0x2771 (en: 'heavy right-pointing angle bracket ornament', google: 'tung högerpekande vinkelfĂ€ste prydnad') - - "âČ": [T: "venstre skilpaddeskall-parentes"] # 0x2772 (en: 'light left tortoise shell bracket ornament', google: 'ljus vĂ€nster sköldpaddsskalfĂ€ste prydnad') - - "❳": [T: "hĂžyre skilpaddeskall-parentes"] # 0x2773 (en: 'light right tortoise shell bracket ornament', google: 'lĂ€tt höger sköldpaddsskalfĂ€ste prydnad') - - "❎": [T: "fet venstre krĂžllparentes"] # 0x2774 (en: 'medium left brace ornament', google: 'medium vĂ€nster stagprydnad') - - "❔": [T: "fet hĂžyre krĂžllparentes"] # 0x2775 (en: 'medium right brace ornament', google: 'medium höger stagprydnad') - - "❶": [T: "Ă©n i fylt sirkel"] # 0x2776 (en: 'black circled one', google translation) - - "❷": [T: "to i fylt sirkel"] # 0x2777 (en: 'black circled two', google translation) - - "❞": [T: "tre i fylt sirkel"] # 0x2778 (en: 'black circled three', google translation) - - "âč": [T: "fire i fylt sirkel"] # 0x2779 (en: 'black circled four', google translation) - - "âș": [T: "fem i fylt sirkel"] # 0x277a (en: 'black circled five', google translation) - - "❻": [T: "seks i fylt sirkel"] # 0x277b (en: 'black circled six', google translation) - - "❌": [T: "sju i fylt sirkel"] # 0x277c (en: 'black circled seven', google translation) - - "❜": [T: "Ă„tte i fylt sirkel"] # 0x277d (en: 'black circled eight', google translation) - - "❟": [T: "ni i fylt sirkel"] # 0x277e (en: 'black circled nine', google translation) - - "❿": [T: "ti i fylt sirkel"] # 0x277f (en: 'black circled ten', google translation) - - "➀": [T: "sans-serif Ă©n i sirkel"] # 0x2780 (en: 'circled sans serif one', google translation) - - "➁": [T: "sans-serif to i sirkel"] # 0x2781 (en: 'circled sans serif two', google translation) - - "➂": [T: "sans-serif tre i sirkel"] # 0x2782 (en: 'circled sans serif three', google translation) - - "➃": [T: "sans-serif fire i sirkel"] # 0x2783 (en: 'circled sans serif four', google translation) - - "➄": [T: "sans-serif fem i sirkel"] # 0x2784 (en: 'circled sans serif five', google translation) - - "➅": [T: "sans-serif seks i sirkel"] # 0x2785 (google translation) - - "➆": [T: "sans-serif sju i sirkel"] # 0x2786 (en: 'circled sans serif seven', google translation) - - "➇": [T: "sans-serif Ă„tte i sirkel"] # 0x2787 (en: 'circled sans serif eight', google translation) - - "➈": [T: "sans-serif ni i sirkel"] # 0x2788 (en: 'circled sans serif nine', google translation) - - "➉": [T: "sans-serif ti i sirkel"] # 0x2789 (en: 'circled sans serif ten', google translation) - - "➊": [T: "sans-serif Ă©n i fylt sirkel"] # 0x278a (en: 'black circled sans serif one', google translation) - - "➋": [T: "sans-serif to i fylt sirkel"] # 0x278b (en: 'black circled sans serif two', google translation) - - "➌": [T: "sans-serif tre i fylt sirkel"] # 0x278c (en: 'black circled sans serif three', google translation) - - "➍": [T: "sans-serif fire i fylt sirkel"] # 0x278d (google translation) - - "➎": [T: "sans-serif fem i fylt sirkel"] # 0x278e (google translation) - - "➏": [T: "sans-serif seks i fylt sirkel"] # 0x278f (google translation) - - "➐": [T: "sans-serif sju i fylt sirkel"] # 0x2790 (google translation) - - "➑": [T: "sans-serif Ă„tte i fylt sirkel"] # 0x2791 (en: 'black circled sans serif eight', google translation) - - "➒": [T: "sans-serif ni i fylt sirkel"] # 0x2792 (en: 'black circled sans serif nine', google translation) - - "➓": [T: "sans-serif ti i fylt sirkel"] # 0x2793 (google translation) - - "➔": [T: "fet hĂžyrepil"] # 0x2794 (en: 'heavy wide-headed rightwards arrow', google: 'tungt huvud med höger om höger pil') - - "➕": [T: "fet pluss"] # 0x2795 (en: 'heavy plus sign', google: 'tungt plus -tecken') - - "➖": [T: "fet minus"] # 0x2796 (en: 'heavy minus sign', google: 'tung minusskylt') - - "➗": [T: "fet division"] # 0x2797 (en: 'heavy division sign', google: 'tung uppdelningstecken') - - "➘": [T: "fet sĂžrĂžst-pil"] # 0x2798 (en: 'heavy south east arrow', google: 'tung south east arrow') - - "➙": [T: "fet hĂžyrepil"] # 0x2799 (en: 'heavy rightwards arrow', google: 'tung Ă„t höger-pil') - - "➚": [T: "fet nordĂžst-pil"] # 0x279a (en: 'heavy north east arrow', google: 'tung north east arrow') - - "➛": [T: "hĂžyrepil"] # 0x279b (en: 'drafting point rightwards arrow', google: 'utarbetningspunkt Ă„t höger pil') - - "➜": [T: "fet hĂžyrepil med avrundet spiss"] # 0x279c (en: 'heavy round-tipped rightwards arrow', google: 'tung rundtippad höger-pil') - - "➝": [T: "hĂžyrepil"] # 0x279d (en: 'triangle-headed rightwards arrow', google: 'triangelhuvud med höger pil') - - "➞": [T: "fet hĂžyrepil"] # 0x279e (en: 'heavy triangle-headed rightwards arrow', google: 'tung triangelhuvud med höger pil') - - "➟": [T: "stiplet hĂžyrepil"] # 0x279f (en: 'dashed triangle-headed rightwards arrow', google: 'streckad triangelhuvud med höger pil') - - "➠": [T: "fet stiplet hĂžyrepil"] # 0x27a0 (en: 'heavy dashed triangle-headed rightwards arrow', google: 'tung streckad triangelhuvud med höger pil') - - "➡": [T: "hĂžyrepil"] # 0x27a1 (en: 'black rightwards arrow', google: 'black rightwards arrow') - - "➱": [T: "3D-hĂžyrepil med lys Ăžvre del"] # 0x27a2 (en: 'three d top lighted rightwards arrow', google: 'tre d topplyst höger pil') - - "➣": [T: "3D-hĂžyrepil med lys nedre del"] # 0x27a3 (en: 'three d bottom lighted rightwards arrow', google: 'tre d botten tĂ€nde höger pil') - - "➀": [T: "pilspiss til hĂžyre"] # 0x27a4 (en: 'black rightwards arrowhead', google: 'svart höger pilspets') - - "➄": [T: "fet hĂžyrepil med hale oppover"] # 0x27a5 (en: 'heavy black curved downwards and rightwards arrow', google: 'tung svart krökt nedĂ„t och höger-pil') - - "➊": [T: "fet hĂžyrepil med hale nedover"] # 0x27a6 (en: 'heavy black curved upwards and rightwards arrow', google: 'tung svart krökt uppĂ„t och pil med höger') - - "➧": [T: "kompakt hĂžyrepil"] # 0x27a7 (en: 'squat black rightwards arrow', google: 'squat black rightwards arrow') - - "➚": [T: "fet hĂžyrepil med konkav spiss"] # 0x27a8 (en: 'heavy concave-pointed black rightwards arrow', google: 'tung konkavspetsad svart höger-pil') - - "➩": [T: "hĂžyre-skyggelagt hvit hĂžyrepil"] # 0x27a9 (en: 'right-shaded white rightwards arrow', google: 'högerskuggad vit Ă„t höger pil') - - "âžȘ": [T: "venstre-skyggelagt hvit hĂžyrepil"] # 0x27aa (en: 'left-shaded white rightwards arrow', google: 'vĂ€nsterskuggad vit Ă„t höger pil') - - "➫": [T: "bakovervippet skyggelagt hvit hĂžyrepil"] # 0x27ab (en: 'back-tilted shadowed white rightwards arrow', google: 'back-tiled shadowed white rightward arrow') - - "➬": [T: "fremoverlent skyggelagt hvit hĂžyrepil"] # 0x27ac (en: 'front-tilted shadowed white rightwards arrow', google: 'front-lutad skuggad vit höger pil') - - "➭": [T: "hvit hĂžyrepil skyggelagt under"] # 0x27ad (en: 'heavy lower right-shadowed white rightwards arrow', google: 'tung nedre högerskuggad vit höger pil') - - "➼": [T: "hvit hĂžyrepil skyggelagt over"] # 0x27ae (en: 'heavy upper right-shadowed white rightwards arrow', google: 'tung övre högra skuggade vita höger-pil') - - "➯": [T: "hvit hĂžyrepil med hakk skyggelagt under"] # 0x27af (en: 'notched lower right-shadowed white rightwards arrow', google: 'skĂ„pad nedre högerskuggad vit Ă„t höger pil') - - "➱": [T: "hvit hĂžyrepil med hakk skyggelagt over"] # 0x27b1 (en: 'notched upper right-shadowed white rightwards arrow', google: 'skĂ€rmad övre högra skuggade vita höger-pil') - - "âžČ": [T: "fet hvit hĂžyrepil med sirkel"] # 0x27b2 (en: 'circled heavy white rightwards arrow', google: 'circled heavy white rightwards arrow') - - "➳": [T: "hvit hĂžyrepil med fjĂŠr"] # 0x27b3 (en: 'white-feathered rightwards arrow', google: 'vitfödd Ă„t höger pil') - - "➮": [T: "sĂžrĂžst-pil med fjĂŠr"] # 0x27b4 (en: 'black-feathered south east arrow', google: 'svartfödd south east arrow') - - "➔": [T: "hĂžyrepil med fjĂŠr"] # 0x27b5 (en: 'black-feathered rightwards arrow', google: 'black-feeded rightwards arrow') - - "➶": [T: "nordĂžst-pil med fjĂŠr"] # 0x27b6 (en: 'black-feathered north east arrow', google: 'svartfödd nord-ostra pilen') - - "➷": [T: "fet sĂžrĂžst-pil med fjĂŠr"] # 0x27b7 (en: 'heavy black-feathered south east arrow', google: 'tung svartfönad syd-ostpil') - - "➾": [T: "fet hĂžyrepil med fjĂŠr"] # 0x27b8 (en: 'heavy black-feathered rightwards arrow', google: 'tung svartfjĂ€der med höger pil') - - "âžč": [T: "fet nordĂžst-pil med fjĂŠr"] # 0x27b9 (en: 'heavy black-feathered north east arrow', google: 'tung svartfönad nord-ostra pilen') - - "âžș": [T: "hĂžyrepil med mothaker"] # 0x27ba (en: 'teradrop-barbed rightwards arrow', google: 'teradrop-barbed till höger pil') - - "➻": [T: "tĂ„reformet hĂžyrepil"] # 0x27bb (en: 'heavy teardrop-shanked rightwards arrow', google: 'tung teardrop-shanked höger-pil') - - "➌": [T: "hĂžyrepil med kileformet hale"] # 0x27bc (en: 'wedge-tailed rightwards arrow', google: 'wedge-tailed Ă„t höger pil') - - "➜": [T: "fet hĂžyrepil med kileformet hale"] # 0x27bd (en: 'heavy wedge-tailed rightwards arrow', google: 'tung kil-tailed höger-pil') - - "➟": [T: "hĂžyrepil med Ă„pne konturer"] # 0x27be (en: 'open-outlined rightwards arrow', google: 'öppen-outlinerad höger-pil') - #---------------------------------------------------------------------------------------------------------------------------------- - #Miscellaneous mathematical symbols-A OK - - "⟀": [T: "tredimensjonal vinkel"] # 0x27c0 (en: 'three dimensional angle') - - "⟁": [T: "hvit trekant med liten hvit trekant"] # 0x27c1 (en: 'white triangle containing small white triangle') - - "⟂": # 0x27c2 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "vinkelrett pĂ„" # (en: 'perpendicular to') - - "⟃": # 0x27c3 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er en"] # (en: 'is', google translation) - - T: "Ă„pen delmengde av" # (en: 'an open subset of') - - "⟄": # 0x27c4 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er en"] # (en: 'is', google translation) - - T: "Ă„pen overmengde av" # (en: 'an open superset of') - - "⟅": [T: "venstre s-formet bag delimiter"] # 0x27c5 (en: 'left s-shaped bag delimiter') - - "⟆": [T: "hĂžyre s-formet bag delimiter"] # 0x27c6 (en: 'right s-shaped bag delimiter') - - "⟇": [T: "eller med prikk"] # 0x27c7 (en: 'or with dot inside') - - "⟈": [T: "omvendt skrĂ„strek fĂžr delmengde"] # 0x27c8 (en: 'reverse solidus preceding subset') - - "⟉": [T: "overmengde fĂžr skrĂ„strek"] # 0x27c9 (en: 'superset preceding solidus') - - "⟊": [T: "vertikal strek med horisontal strek"] # 0x27ca (en: 'vertical bar with horizontal stroke') - - "⟋": [T: "stigende diagonal"] # 0x27cb (en: 'mathematical rising diagonal', google: 'matematisk stigande diagonal') - - "⟌": [T: "lang divisjon"] # 0x27cc (en: 'long division') - - "⟍": [T: "synkende diagonal"] # 0x27cd (en: 'mathematical falling diagonal', google: 'matematisk fallande diagonal') - - "⟎": [T: "logisk og i kvadrat"] # 0x27ce (en: 'squared logical and', google: 'squared logical och') - - "⟏": [T: "logisk eller i kvadrat"] # 0x27cf (en: 'squared logical or', google: 'kvadratiska logiska eller') - - "⟐": [T: "hvit diamant med prikk i midten"] # 0x27d0 (en: 'white diamond with centered dot', google: 'vit diamant med centrerad prick') - - "⟑": [T: "og med prikk"] # 0x27d1 (en: 'and with dot') - - "⟒": [T: "tilhĂžrer med Ă„pning oppover"] # 0x27d2 (en: 'element of opening upwards') - - "⟓": [T: "nedre hĂžyre hjĂžrne med prikk"] # 0x27d3 (en: 'lower right corner with dot') - - "⟔": [T: "Ăžvre venstre hjĂžrne med prikk"] # 0x27d4 (en: 'upper left corner with dot') - - "⟕": [T: "venstre outer join"] # 0x27d5 (en: 'left outer join') - - "⟖": [T: "hĂžyre outer join"] # 0x27d6 (en: 'right outer join') - - "⟗": [T: "full outer join"] # 0x27d7 (en: 'full outer join') - - "⟘": [T: "stort oppoverrotert dreiekors"] # 0x27d8 (en: 'large up tack') - - "⟙": [T: "stort nedoverrotert dreiekors"] # 0x27d9 (en: 'large down tack') - - "⟚": [T: "venstre og hĂžyre dobbelt dreiekors"] # 0x27da (en: 'left and right double turnstile') - - "⟛": [T: "venstre og hĂžyre dreiekors"] # 0x27db (en: 'left and right tack') - - "⟜": [T: "venstre multimap"] # 0x27dc (en: 'left multimap') - - "⟝": [T: "langt hĂžyre dreiekors"] # 0x27dd (en: 'long right tack') - - "⟞": [T: "langt venstre dreiekors"] # 0x27de (en: 'long left tack') - - "⟟": [T: "oppoverrotert dreiekors med sirkel over"] # 0x27df (en: 'up tack with circle above') - - "⟠": [T: "rombe delt med horisontal strek"] # 0x27e0 (en: 'lozenge divided by horizontal rule') - - "⟡": [T: "hvit konkav-sidet diamant"] # 0x27e1 (en: 'white concave sided diamond') - - "⟱": [T: "hvit konkav-sidet diamant med strek til venstre"] # 0x27e2 (en: 'white concave sided diamond with leftwards tick') - - "⟣": [T: "hvit konkav-sidet diamant med strek til hĂžyre"] # 0x27e3 (en: 'white concave sided diamond with rightwards tick') - - "⟀": [T: "hvitt kvadrat med strek til venstre"] # 0x27e4 (en: 'white square with leftwards tick') - - "⟄": [T: "hvitt kvadrat med strek til hĂžyre"] # 0x27e5 (en: 'white square with rightwards tick') - - "⟩": [T: "hvit venstre hakeparentes"] # 0x27e6 (en: 'left white square bracket') - - "⟧": [T: "hvit hĂžyre hakeparentes"] # 0x27e7 (en: 'right white square bracket') - - "⟹": [T: "venstre vinkel-parentes"] # 0x27e8 (en: 'left angle bracket') - - "⟩": [T: "hĂžyre vinkel-parentes"] # 0x27e9 (en: 'right angle bracket') - - "âŸȘ": [T: "venstre dobbel vinkel-parentes"] # 0x27ea (en: 'left double angle bracket') - - "⟫": [T: "hĂžyre dobbel vinkel-parentes"] # 0x27eb (en: 'right double angle bracket') - - "⟬": [T: "venstre hvit skilpaddeskall-parentes"] # 0x27ec (en: 'left white tortoise shell bracket') - - "⟭": [T: "hĂžyre hvit skilpaddeskall-parentes"] # 0x27ed (en: 'right white tortoise shell bracket') - - "⟼": [T: "avflatet hĂžyreparentes"] # 0x27ee (en: 'left flattened parenthesis') - - "⟯": [T: "avflatet venstreparentes"] # 0x27ef (en: 'right flattened parenthesis') - #-------------------------------------------------------------------------------------------------- - # Supplemental arrows-A OK - - "⟰": [T: "kvadrupel-streket oppoverpil"] # 0x27f0 (en: 'upwards quadruple arrow', google: 'uppĂ„t fyrdubbla pilen') - - "⟱": [T: "kvadrupel-streket nedoverpil"] # 0x27f1 (en: 'downwards quadruple arrow', google: 'nedĂ„t fyrdubbla pilen') - - "âŸČ": [T: "Ă„pen sirkelpil mot klokken"] # 0x27f2 (en: 'anticlockwise gapped circle arrow', google: 'antikvis gappad cirkelpil') - - "⟳": [T: "Ă„pen sirkelpil med klokken"] # 0x27f3 (en: 'clockwise gapped circle arrow', google: 'medurs gappad cirkelpil') - - "⟮": [T: "hĂžyrepil med pluss i sirkel"] # 0x27f4 (en: 'right arrow with circled plus', google: 'höger-pil med circled plus') - - "⟔": [T: "lang venstrepil"] # 0x27f5 (en: 'long leftwards arrow') - - "⟶": [T: "lang hĂžyrepil"] # 0x27f6 (en: 'long rightwards arrow') - - "⟷": [T: "lang venstre-hĂžyre-pil"] # 0x27f7 (en: 'long left right arrow') - - "⟾": [T: "lang dobbeltstreket venstrepil"] # 0x27f8 (en: 'long leftwards double arrow') - - "âŸč": [T: "lang dobbeltstreket hĂžyrepil"] # 0x27f9 (en: 'long rightwards double arrow') - - "âŸș": [T: "lang dobbeltstreket venstre-hĂžyre-pil"] # 0x27fa (en: 'long left right double arrow') - - "⟻": [T: "lang venstrepil fra strek"] # 0x27fb (en: 'long leftwards arrow from bar', google: 'lĂ„ng vĂ€nster pil frĂ„n bar') - - "⟌": [T: "lang hĂžyrepil fra strek"] # 0x27fc (en: 'long rightwards arrow from bar') - - "⟜": [T: "lang dobbeltstreket venstrepil fra strek"] # 0x27fd (en: 'long leftwards double arrow from bar', google: 'lĂ„ng vĂ€nster dubbelpil frĂ„n bar') - - "⟟": [T: "lang dobbeltstreket hĂžyrepil fra strek"] # 0x27fe (en: 'long rightwards double arrow from bar', google: 'lĂ„ngt höger-pil frĂ„n bar') - - "⟿": [T: "lang svingete hĂžyrepil"] # 0x27ff (en: 'long rightwards squiggle arrow') - #------------------------------------------------------------------------------------------------------ - #Supplemental arrows-B OK - - " ": [T: "hĂžyrepil med to spisser og vertikal strek"] # 0x2900 (en: 'rightwards two headed arrow with vertical stroke', google: 'Ă„tgĂ€rd tvĂ„ ledde pil med vertikalt slag') - - " ": [T: "hĂžyrepil med to spisser og dobbel vertikal strek"] # 0x2901 (en: 'rightwards two headed arrow with double vertical stroke', google: 'Ă„tgĂ€rder tvĂ„ pil med dubbel vertikal stroke') - - " ": [T: "dobbeltstreket venstrepil med vertikal strek"] # 0x2902 (en: 'leftwards double arrow with vertical stroke', google: 'vĂ€nster dubbelpil med vertikalt slag') - - " ": [T: "dobbeltstreket hĂžyrepil med vertikal strek"] # 0x2903 (en: 'rightwards double arrow with vertical stroke', google: 'Ă„tgĂ€rd med höger med vertikal stroke') - - " ": [T: "dobbeltstreket venstre-hĂžyre-pil med vertikal strek"] # 0x2904 (en: 'left right double arrow with vertical stroke', google: 'vĂ€nster höger dubbelpil med vertikalt slag') - - " ": [T: "hĂžyrepil fra strek med dobbel spiss"] # 0x2905 (en: 'rightwards two headed arrow from bar') - - " ": [T: "dobbeltstreket venstrepil fra strek"] # 0x2906 (en: 'leftwards double arrow from bar', google: 'vĂ€nster dubbelpil frĂ„n bar') - - " ": [T: "dobbeltstreket hĂžyrepil fra strek"] # 0x2907 (en: 'rightwards double arrow from bar', google: 'Ă„tgĂ€rd med höger pil frĂ„n stĂ„ngen') - - " ": [T: "nedoverpil med horisontal strek"] # 0x2908 (en: 'downwards arrow with horizontal stroke', google: 'nedĂ„t pil med horisontellt slag') - - " ": [T: "oppoverpil med horisontal strek"] # 0x2909 (en: 'upwards arrow with horizontal stroke', google: 'uppĂ„t pil med horisontellt slag') - - " ": [T: "trippel-streket oppoverpil"] # 0x290a (en: 'upwards triple arrow', google: 'uppĂ„t trippelpil') - - "​": [T: "trippel-streket nedoverpil"] # 0x290b (en: 'downwards triple arrow', google: 'nedĂ„t trippelpil') - - "‌": [T: "stiplet venstrepil"] # 0x290c (en: 'leftwards double dash arrow') - - "‍": [T: "stiplet hĂžyrepil"] # 0x290d (en: 'rightwards double dash arrow') - - "‎": [T: "stiplet venstrepil"] # 0x290e (en: 'leftwards triple dash arrow') - - "‏": [T: "stiplet hĂžyrepil"] # 0x290f (en: 'rightwards triple dash arrow') - - "‐": [T: "stiplet hĂžyrepil med to spisser"] # 0x2910 (en: 'rightwards two headed triple dash arrow') - - "‑": [T: "prikket hĂžyrepil"] # 0x2911 (en: 'rightwards arrow with dotted stem') - - "‒": [T: "oppoverpil mot strek"] # 0x2912 - - "–": [T: "nedoverpil mot strek"] # 0x2913 - - "—": [T: "hĂžyrepil med hale og vertikal strek"] # 0x2914 (en: 'rightwards arrow with tail and vertical stroke', google: 'Ă„tgĂ€rdspil med svans och vertikalt slag') - - "―": [T: "hĂžyrepil med hale og dobbel vertikal strek"] # 0x2915 (en: 'rightwards arrow with tail and double vertical stroke', google: 'Ă„tgĂ€rdspil med svans och dubbel vertikal stroke') - - "‖": [T: "hĂžyrepil med dobbel spiss og hale"] # 0x2916 (en: 'rightwards two headed arrow with tail') - - "‗": [T: "hĂžyrepil med dobbel spiss og hale og vertikal strek"] # 0x2917 (en: 'rightwards two headed arrow with tail with vertical stroke', google: 'Ă„t höger tvĂ„ pil med svans med vertikalt stroke') - - "‘": [T: "hĂžyrepil med dobbel spiss og hale og dobbel vertikal strek"] # 0x2918 (en: 'rightwards two headed arrow with tail with double vertical stroke', google: 'Ă„t höger tvĂ„ pil med svans med dubbel vertikal stroke') - - "’": [T: "venstre pil-hale"] # 0x2919 (en: 'leftwards arrow tail') - - "‚": [T: "hĂžyre pil-hale"] # 0x291a (en: 'rightwards arrow tail', google: 'Ă„tgĂ€rder med höger pil') - - "‛": [T: "dobbel venstre pil-hale"] # 0x291b (en: 'leftwards double arrow tail') - - "“": [T: "dobbel hĂžyre pil-hale"] # 0x291c (en: 'rightwards double arrow tail') - - "”": [T: "venstrepil mot fylt diamant"] # 0x291d (en: 'leftwards arrow to filled diamond') - - "„": [T: "hĂžyrepil mot fylt diamant"] # 0x291e (en: 'rightwards arrow to filled diamond') - - "‟": [T: "venstrepil fra strek til fylt diamant"] # 0x291f (en: 'leftwards arrow from bar to filled diamond') - - "†": [T: "hĂžyrepil fra strek til fylt diamant"] # 0x2920 (en: 'rightwards arrow from bar to filled diamond') - - "‥": [T: "nordvest- og sĂžrĂžst-pil"] # 0x2921 (en: 'north west and south east arrow', google: 'north west och south east arrow') - - "‹": [T: "nordĂžst- og sĂžrvest-pil"] # 0x2922 (en: 'north east and south west arrow', google: 'north east and south west arrow') - - "‣": [T: "nordvest-pil med krok"] # 0x2923 (en: 'north west arrow with hook') - - " ": [T: "nordĂžst-pil med krok"] # 0x2924 (en: 'north east arrow with hook') - - " ": [T: "sĂžrĂžst-pil med krok"] # 0x2925 (en: 'south east arrow with hook') - - " ": [T: "sĂžrvest-pil med krok"] # 0x2926 (en: 'south west arrow with hook') - - "‧": [T: "nordvest-pil og nordĂžst-pil"] # 0x2927 (en: 'north west arrow and north east arrow') - - "‚": [T: "nordĂžst-pil og sĂžrĂžst-pil"] # 0x2928 (en: 'north east arrow and south east arrow') - - "
": [T: "sĂžrĂžst-pil og sĂžrvest-pil"] # 0x2929 (en: 'south east arrow and south west arrow') - - "â€Ș": [T: "sĂžrvest-pil og nordvest-pil"] # 0x292a (en: 'south west arrow and north west arrow') - - "‫": [T: "stigende diagonal krysser synkende diagonal"] # 0x292b (en: 'rising diagonal crossing falling diagonal', google: 'stigande diagonal korsning fallande diagonal') - - "‏": [T: "synkende diagonal krysser stigende diagonal"] # 0x292c (en: 'falling diagonal crossing rising diagonal', google: 'fallande diagonal korsning stigande diagonal') - - "‭": [T: "sĂžrĂžst-pil krysser nordĂžst-pil"] # 0x292d (en: 'south east arrow crossing north east arrow', google: 'south east arrow crossing north east arrow') - - "‟": [T: "nordĂžst-pil krysser sĂžrĂžst-pil"] # 0x292e (en: 'north east arrow crossing south east arrow', google: 'north east arrow crossing south east arrow') - - " ": [T: "synkende diagonal krysser nordĂžst-pil"] # 0x292f (en: 'falling diagonal crossing north east arrow', google: 'fallande diagonal korsar nord-ostra pilen') - - "‰": [T: "stigende diagonal krysser sĂžrĂžst-pil"] # 0x2930 (en: 'rising diagonal crossing south east arrow', google: 'rising diagonal crossing south east arrow') - - "‱": [T: "nordĂžst-pil krysser nordvest-pil"] # 0x2931 (en: 'north east arrow crossing north west arrow', google: 'north east arrow crossing north west arrow') - - "â€Č": [T: "nordvest-pil krysser nordĂžst-pil"] # 0x2932 (en: 'north west arrow crossing north east arrow', google: 'north west arrow crossing north east arrow') - - "″": [T: "bĂžlgete hĂžyrepil"] # 0x2933 (en: 'wave arrow pointing directly right') - - "‎": [T: "hĂžyrepil med vinkel oppover"] # 0x2934 (en: 'arrow pointing rightwards then curving upwards', google: 'arrow pekar Ă„t höger och böjer sig sedan uppĂ„t') - - "—": [T: "hĂžyrepil med vinkel nedover"] # 0x2935 (en: 'arrow pointing rightwards then curving downwards') - - "‶": [T: "nedoverpil med vinkel til venstre"] # 0x2936 (en: 'arrow pointing downwards then curving leftwards') - - "‷": [T: "nedoverpil med vinkel til hĂžyre"] # 0x2937 (en: 'arrow pointing downwards then curving rightwards') - - "„": [T: "halvsirkelpil med klokken"] # 0x2938 (en: 'right side arc clockwise arrow') - - "â€č": [T: "halvsirkelpil mot klokken"] # 0x2939 (en: 'left side arc anticlockwise arrow') - - "â€ș": [T: "Ăžvre halvsirkelpil mot klokken"] # 0x293a (en: 'top arc anticlockwise arrow', google: 'toppbĂ„ge moturs pil') - - "※": [T: "nedre halvsirkelpil mot klokken"] # 0x293b (en: 'bottom arc anticlockwise arrow', google: 'nedre bĂ„ge anticurs pil') - - "‌": [T: "Ăžvre halvsirkelpil med klokken med minus"] # 0x293c (en: 'top arc clockwise arrow with minus') - - "“": [T: "Ăžvre halvsirkelpil mot klokken med pluss"] # 0x293d (en: 'top arc anticlockwise arrow with plus') - - "‟": [T: "halvsirkelpil med klokken"] # 0x293e (en: 'lower right semicircular clockwise arrow', google: 'nedre högra halvcirkelformade medurs pil') - - "‿": [T: "halvsirkelpil mot klokken"] # 0x293f (en: 'lower left semicircular anticlockwise arrow', google: 'nedre vĂ€nstra halvcirkelformade pil moturs') - - "â„€": [T: "sirkel-pil mot klokken"] # 0x2940 (en: 'anticlockwise closed circle arrow', google: 'antikvis stĂ€ngd cirkelpil') - - "℁": [T: "sirkel-pil med klokken"] # 0x2941 (en: 'clockwise closed circle arrow', google: 'medurs stĂ€ngd cirkelpil') - - "â„‚": [T: "hĂžyrepil over kort venstrepil"] # 0x2942 (en: 'rightwards arrow above short leftwards arrow', google: 'Ă„tgĂ€rdspil över kort vĂ€nster pil') - - "℃": [T: "venstrepil over kort hĂžyrepil"] # 0x2943 (en: 'leftwards arrow above short rightwards arrow', google: 'vĂ€nster pil ovanför kort höger-pil') - - "â„„": [T: "kort hĂžyrepil over venstrepil"] # 0x2944 (en: 'short rightwards arrow above leftwards arrow', google: 'kort höger-pil ovanför vĂ€nster pil') - - "â„…": [T: "hĂžyrepil med pluss under"] # 0x2945 (en: 'rightwards arrow with plus below') - - "℆": [T: "venstrepil med pluss under"] # 0x2946 (en: 'leftwards arrow with plus below', google: 'vĂ€nster pil med plus nedan') - - "ℇ": [T: "hĂžyrepil gjennom x"] # 0x2947 (en: 'rightwards arrow through x', google: 'Ă„tgĂ€rdspil genom x') - - "℈": [T: "venstre-hĂžyre-pil gjennom sirkel"] # 0x2948 (en: 'left right arrow through circle') - - "℉": [T: "oppoverpil med dobbel spiss fra sirkel"] # 0x2949 (en: 'upwards two headed arrow from circle') - - "ℊ": [T: "toveis harpun venstre mothake opp hĂžyre mothake ned"] # 0x294a (en: 'left barb up right barb down harpoon') - - "â„‹": [T: "toveis harpun venstre mothake ned hĂžyre mothake opp"] # 0x294b (en: 'left barb down right barb up harpoon') - - "ℌ": [T: "toveis vertikal harpun Ăžvre mothake hĂžyre nedre mothake venstre"] # 0x294c (en: 'up barb right down barb left harpoon', google: 'upp barb höger ner barb vĂ€nster harpun') - - "ℍ": [T: "toveis vertikal harpun Ăžvre mothake venstre nedre mothake hĂžyre"] # 0x294d (en: 'up barb left down barb right harpoon', google: 'upp barb vĂ€nster ner barb höger harpoon') - - "ℎ": [T: "toveis harpun mothaker opp"] # 0x294e (en: 'left barb up right barb up harpoon', MathPlayer: 'vĂ€nster höger harpoon up', google: 'vĂ€nster barb upp höger barb upp harpoon') - - "ℏ": [T: "toveis vertikal harpun mothaker hĂžyre"] # 0x294f (en: 'up barb right down barb right harpoon') - - "ℐ": [T: "toveis harpun mothaker ned"] # 0x2950 (en: 'left barb down right barb down harpoon', MathPlayer: 'vĂ€nster höger harpoon ner') - - "â„‘": [T: "toveis vertikal harpun mothaker venstre"] # 0x2951 (en: 'up barb left down barb left harpoon') - - "â„’": [T: "venstre-harpun mot strek mothake opp"] # 0x2952 (en: 'leftwards harpoon with barb up to bar') - - "â„“": [T: "hĂžyre-harpun mot strek mothake opp"] # 0x2953 (en: 'rightwards harpoon with barb up to bar') - - "â„”": [T: "opp-harpun mot strek mothake hĂžyre"] # 0x2954 (en: 'upwards harpoon with barb right to bar') - - "â„•": [T: "ned-harpun mot strek mothake hĂžyre"] # 0x2955 (en: 'downwards harpoon with barb right to bar') - - "â„–": [T: "venstre-harpun mot strek mothake ned"] # 0x2956 (en: 'leftwards harpoon with barb down to bar') - - "â„—": [T: "hĂžyre-harpun mot strek mothake ned"] # 0x2957 (en: 'rightwards harpoon with barb down to bar') - - "℘": [T: "opp-harpun mot strek mothake venstre"] # 0x2958 (en: 'upwards harpoon with barb left to bar') - - "â„™": [T: "ned-harpun mot strek mothake venstre"] # 0x2959 (en: 'downwards harpoon with barb left to bar') - - "ℚ": [T: "venstre-harpun fra strek mothake opp"] # 0x295a (en: 'leftwards harpoon with barb up from bar') - - "â„›": [T: "hĂžyre-harpun fra strek mothake opp"] # 0x295b (en: 'rightwards harpoon with barb up from bar') - - "ℜ": [T: "opp-harpun fra strek mothake hĂžyre"] # 0x295c (en: 'upwards harpoon with barb right from bar') - - "ℝ": [T: "ned-harpun fra strek mothake hĂžyre"] # 0x295d (en: 'downwards harpoon with barb right from bar') - - "℞": [T: "venstre-harpun fra strek mothake ned"] # 0x295e (en: 'leftwards harpoon with barb down from bar') - - "℟": [T: "hĂžyre-harpun fra strek mothake ned"] # 0x295f (en: 'rightwards harpoon with barb down from bar') - - "â„ ": [T: "opp-harpun fra strek mothake venstre"] # 0x2960 (en: 'upwards harpoon with barb left from bar') - - "℥": [T: "ned-harpun fra strek mothake venstre"] # 0x2961 (en: 'downwards harpoon with barb left from bar') - - "ℹ": [T: "venstre-harpun mothake opp over venstre-harpun mothake ned"] # 0x2962 (en: 'leftwards harpoon with barb up above leftwards harpoon with barb down') - - "℣": [T: "opp-harpun mothake venstre ved siden av opp-harpun mothake hĂžyre"] # 0x2963 (en: 'upwards harpoon with barb left beside upwards harpoon with barb right') - - "â„€": [T: "hĂžyre-harpun mothake opp over hĂžyre-harpun mothake ned"] # 0x2964 (en: 'rightwards harpoon with barb up above rightwards harpoon with barb down') - - "â„„": [T: "ned-harpun mothake venstre ved siden av ned-harpun mothake hĂžyre"] # 0x2965 (en: 'downwards harpoon with barb left beside downwards harpoon with barb right') - - "ℊ": [T: "venstre-harpun mothake opp over hĂžyre-harpun mothake opp"] # 0x2966 (en: 'leftwards harpoon with barb up above rightwards harpoon with barb up') - - "â„§": [T: "venstre-harpun mothake ned over hĂžyre-harpun mothake ned"] # 0x2967 (en: 'leftwards harpoon with barb down above rightwards harpoon with barb down') - - "ℚ": [T: "hĂžyre-harpun mothake opp over venstre-harpun mothake opp"] # 0x2968 (en: 'rightwards harpoon with barb up above leftwards harpoon with barb up') - - "â„©": [T: "hĂžyre-harpun mothake ned over venstre-harpun mothake ned"] # 0x2969 (en: 'rightwards harpoon with barb down above leftwards harpoon with barb down') - - "â„Ș": [T: "venstre-harpun mothake opp over strek"] # 0x296a (en: 'leftwards harpoon with barb up above long dash') - - "â„«": [T: "venstre-harpun mothake ned under strek"] # 0x296b (en: 'leftwards harpoon with barb down below long dash') - - "ℏ": [T: "hĂžyre-harpun mothake opp over strek"] # 0x296c (en: 'rightwards harpoon with barb up above long dash') - - "â„­": [T: "hĂžyre-harpun mothake ned under strek"] # 0x296d (en: 'rightwards harpoon with barb down below long dash') - - "℟": [T: "opp-harpun mothake venstre ved siden av ned-harpun mothake hĂžyre"] # 0x296e (en: 'upwards harpoon with barb left beside downwards harpoon with barb right') - - "ℯ": [T: "ned-harpun mothake venstre ved siden av opp-harpun mothake hĂžyre"] # 0x296f (en: 'downwards harpoon with barb left beside upwards harpoon with barb right') - - "â„°": [T: "dobbeltstreket hĂžyrepil med avrundet spiss"] # 0x2970 (en: 'right double arrow with rounded head') - - "ℱ": [T: "lik over hĂžyrepil"] # 0x2971 (en: 'equals above rightwards arrow') - - "â„Č": [T: "tilde over hĂžyrepil"] # 0x2972 (en: 'tilde operator above rightwards arrow') - - "ℳ": [T: "venstrepil over tilde"] # 0x2973 (en: 'leftwards arrow above tilde operator') - - "ℎ": [T: "hĂžyrepil over tilde"] # 0x2974 (en: 'rightwards arrow above tilde operator') - - "â„”": [T: "hĂžyrepil over tilnĂŠrmet lik"] # 0x2975 (en: 'rightwards arrow above almost equal to') - - "â„¶": [T: "mindre enn over venstrepil"] # 0x2976 (en: 'less than above leftwards arrow') - - "â„·": [T: "venstrepil gjennom mindre enn"] # 0x2977 (en: 'leftwards arrow through less than', google: 'vĂ€nster pil genom mindre Ă€n') - - "℞": [T: "stĂžrre enn over hĂžyrepil"] # 0x2978 (en: 'greater than above rightwards arrow') - - "â„č": [T: "delmengde over hĂžyrepil"] # 0x2979 (en: 'subset above rightwards arrow') - - "â„ș": [T: "venstrepil gjennom delmengde"] # 0x297a (en: 'leftwards arrow through subset', google: 'vĂ€nster pil genom undergruppen') - - "â„»": [T: "overmengde over venstrepil"] # 0x297b (en: 'superset above leftwards arrow') - - "ℌ": [T: "fiskehale til venstre"] # 0x297c (en: 'left fish tail') - - "ℜ": [T: "fiskehale til hĂžyre"] # 0x297d (en: 'right fish tail') - - "℟": [T: "fiskehale oppover"] # 0x297e (en: 'up fish tail') - - "ℿ": [T: "fiskehale nedover"] # 0x297f (en: 'down fish tail') - #--------------------------------------------------------------------------------------------- - # Miscellaneous Mathematical symbols-B OK - - "⩀": [T: "trippel loddrett strek"] # 0x2980 (en: 'triple vertical bar delimiter', google: 'trippel vertikal bar avgrĂ€nsare') - - "⊁": [T: "punkt z-notasjon"] # 0x2981 (en: 'z notation spot', google: 'z notation spot') - - "⩂": [T: "kolon z-notasjon"] # 0x2982 (en: 'z notation type colon', google: 'z notationstyp kolon') - - "⊃": [T: "venstre hvit krĂžllparentes"] # 0x2983 (en: 'left white brace', google: 'vĂ€nster vit stag') - - "⩄": [T: "hĂžyre hvit krĂžllparentes"] # 0x2984 (en: 'right white brace', google: 'höger vit stag') - - "⩅": [T: "hvit venstreparentes"] # 0x2985 (en: 'left white parenthesis') - - "⩆": [T: "hvit hĂžyreparentes"] # 0x2986 (en: 'right white parenthesis') - - "⩇": [T: "venstre bilde-parentes z-notasjon"] # 0x2987 (en: 'z notation left image bracket', google: 'z notation vĂ€nster bildfĂ€ste') - - "⊈": [T: "hĂžyre bilde-parentes z-notasjon"] # 0x2988 (en: 'z notation right image bracket', google: 'z notation rĂ€tt bildfĂ€ste') - - "⩉": [T: "venstre bindende parentes z-notasjon"] # 0x2989 (en: 'z notation left binding bracket') - - "⩊": [T: "hĂžyre bindende parentes z-notasjon"] # 0x298a (en: 'z notation right binding bracket') - - "⩋": [T: "venstre hakeparentes med strek under"] # 0x298b (en: 'left square bracket with underbar') - - "⩌": [T: "hĂžyre hakeparentes med strek under"] # 0x298c (en: 'right square bracket with underbar') - - "⊍": [T: "venstre hakeparentes med strek i Ăžvre hjĂžrne"] # 0x298d (en: 'left square bracket with tick in top corner') - - "⊎": [T: "hĂžyre hakeparentes med strek i nedre hjĂžrne"] # 0x298e (en: 'right square bracket with tick in bottom corner') - - "⊏": [T: "venstre hakeparentes med strek i nedre hjĂžrne"] # 0x298f (en: 'left square bracket with tick in bottom corner') - - "⊐": [T: "hĂžyre hakeparentes med strek i Ăžvre hjĂžrne"] # 0x2990 (en: 'right square bracket with tick in top corner') - - "⩑": [T: "venstre vinkelparentes med prikk"] # 0x2991 (en: 'left angle bracket with dot') - - "⩒": [T: "hĂžyre vinkelparentes med prikk"] # 0x2992 (en: 'right angle bracket with dot') - - "⩓": [T: "venstre mindre enn parentes"] # 0x2993 (en: 'left arc less than bracket') - - "⩔": [T: "hĂžyre stĂžrre enn parentes"] # 0x2994 (en: 'right arc greater than bracket') - - "⩕": [T: "venstre dobbel stĂžrre enn parentes"] # 0x2995 (en: 'double left arc greater than bracket') - - "⩖": [T: "hĂžyre dobbel mindre enn parentes"] # 0x2996 (en: 'double right arc less than bracket') - - "⩗": [T: "venstre skilpaddeskall-parentes"] # 0x2997 (en: 'left black tortoise shell bracket', google: 'vĂ€nster svart sköldpaddsskalfĂ€ste') - - "⊘": [T: "hĂžyre skilpaddeskall-parentes"] # 0x2998 (en: 'right black tortoise shell bracket', google: 'höger svart sköldpaddsskalfĂ€ste') - - "⩙": [T: "prikket loddrett strek"] # 0x2999 (en: 'dotted fence', google: 'prickat staket') - - "⩚": [T: "sikksakk loddrett strek"] # 0x299a (en: 'vertical zigzag line') - - "⩛": [T: "mĂ„lt vinkel til venstre"] # 0x299b (en: 'measured angle opening left', google: 'uppmĂ€tt vinkelöppning vĂ€nster') - - "⩜": [T: "rett vinkel"] # 0x299c (en: 'right angle variant with square', google: 'rĂ€tt vinkelvariant med fyrkant') - - "⊝": [T: "mĂ„lt rett vinkel med prikk"] # 0x299d (en: 'measured right angle with dot') - - "⊞": [T: "vinkel med s i"] # 0x299e (en: 'angle with s inside') - - "⩟": [T: "spiss vinkel"] # 0x299f (en: 'acute angle') - - "⊠": [T: "sfĂŠrisk vinkel til venstre"] # 0x29a0 (en: 'spherical angle opening left', google: 'sfĂ€risk vinkelöppning vĂ€nster') - - "⊥": [T: "sfĂŠrisk vinkel oppover"] # 0x29a1 (en: 'spherical angle opening up', google: 'sfĂ€risk vinkel öppnas') - - "⊹": [T: "snudd vinkel"] # 0x29a2 (en: 'turned angle', google: 'vĂ€nde vinkel') - - "⊣": [T: "speilvendt vinkel"] # 0x29a3 (en: 'reversed angle') - - "⊀": [T: "vinkel med strek under"] # 0x29a4 (en: 'angle with underbar') - - "⊄": [T: "speilvendt vinkel med strek under"] # 0x29a5 (en: 'reversed angle with underbar') - - "⊊": [T: "stump vinkel oppover"] # 0x29a6 (en: 'oblique angle opening up') - - "⊧": [T: "stump vinkel nedover"] # 0x29a7 (en: 'oblique angle opening down') - - "⊚": [T: "mĂ„lt vinkel med nordĂžst-pil i enden av Ăžvre vinkelben"] # 0x29a8 (en: 'measured angle with open arm ending in arrow pointing up and to the right') - - "⊩": [T: "mĂ„lt vinkel med nordvest-pil i enden av Ăžvre vinkelben"] # 0x29a9 (en: 'measured angle with open arm ending in arrow pointing up and to the left') - - "âŠȘ": [T: "mĂ„lt vinkel med sĂžrĂžst-pil i enden av nedre vinkelben"] # 0x29aa (en: 'measured angle with open arm ending in arrow pointing down and to the right') - - "⊫": [T: "mĂ„lt vinkel med sĂžrvest-pil i enden av nedre vinkelben"] # 0x29ab (en: 'measured angle with open arm ending in arrow pointing down and to the left') - - "⊏": [T: "mĂ„lt vinkel med nordĂžst-pil i enden av hĂžyre vinkelben"] # 0x29ac (en: 'measured angle with open arm ending in arrow pointing right and up') - - "⊭": [T: "mĂ„lt vinkel med nordvest-pil i enden av venstre vinkelben"] # 0x29ad (en: 'measured angle with open arm ending in arrow pointing left and up') - - "⊟": [T: "mĂ„lt vinkel med sĂžrĂžst-pil i enden av hĂžyre vinkelben"] # 0x29ae (en: 'measured angle with open arm ending in arrow pointing right and down') - - "⊯": [T: "mĂ„lt vinkel med sĂžrvest-pil i enden av venstre vinkelben"] # 0x29af (en: 'measured angle with open arm ending in arrow pointing left and down') - - "⊰": [T: "den tomme mengden speilvendt"] # 0x29b0 (en: 'reversed empty set') - - "⊱": [T: "den tomme mengden med strek over"] # 0x29b1 (en: 'empty set with overbar') - - "âŠČ": [T: "den tomme mengden med sirkel over"] # 0x29b2 (en: 'empty set with small circle above') - - "⊳": [T: "den tomme mengden med hĂžyrepil over"] # 0x29b3 (en: 'empty set with right arrow above') - - "⊎": [T: "den tomme mengden med venstrepil over"] # 0x29b4 (en: 'empty set with left arrow above') - - "⊔": [T: "sirkel med horisontal strek"] # 0x29b5 (en: 'circle with horizontal bar') - - "⊶": [T: "sirkel med vertikal strek"] # 0x29b6 (SRE: 'vertikalt streck i cirkel') - - "⊷": [T: "parallell i sirkel"] # 0x29b7 (en: 'circled parallel') - - "⊞": [T: "sirkel med omvendt skrĂ„strek"] # 0x29b8 (en: 'circled reverse solidus', google: 'circled reverse solidus') - - "âŠč": [T: "vinkelrett i sirkel"] # 0x29b9 (en: 'circled perpendicular') - - "âŠș": [T: "sirkel delt med horisontal strek og Ăžvre del delt med vertikal strek"] # 0x29ba (en: 'circled divided by horizontal bar and top half divided by vertical bar', google: 'cirklade dividerat med horisontell stĂ„ng och den övre halvan dividerad med vertikal stĂ„ng') - - "⊻": [T: "sirkel med x"] # 0x29bb (en: 'circle with superimposed x') - - "⊌": [T: "sirkel med divisjon rotert mot klokken"] # 0x29bc (en: 'circled anticlockwise rotated division sign') - - "⊜": [T: "oppoverpil gjennom sirkel"] # 0x29bd (en: 'up arrow through circle', google: 'upp pilen genom cirkeln') - - "⊟": [T: "hvitt punkt i sirkel"] # 0x29be (en: 'circled white bullet') - - "⊿": [T: "punkt i sirkel"] # 0x29bf (en: 'circled bullet') - - "⧀": [T: "mindre enn i sirkel"] # 0x29c0 (en: 'circled less than') - - "⧁": [T: "stĂžrre enn i sirkel"] # 0x29c1 (en: 'circled greater than') - - "⧂": [T: "sirkel med liten sirkel til hĂžyre"] # 0x29c2 (en: 'circle with small circle to the right') - - "⧃": [T: "sirkel med to horisontale streker til hĂžyre"] # 0x29c3 (en: 'circle with two horizontal strokes to the right') - - "⧄": [T: "kvadrat med diagonal oppover"] # 0x29c4 (en: 'squared rising diagonal slash') - - "⧅": [T: "kvadrat med diagonal nedover"] # 0x29c5 (en: 'squared falling diagonal slash') - - "⧆": [T: "asterisk i kvadrat"] # 0x29c6 (en: 'squared asterisk', google: 'kvadratisk asterisk') - - "⧇": [T: "liten sirkel i kvadrat"] # 0x29c7 (en: 'squared small circle', google: 'kvadrat liten cirkel') - - "⧈": [T: "kvadrat i kvadrat"] # 0x29c8 (en: 'squared square', google: 'squared square') - - "⧉": [T: "to sammenfĂžyde kvadrat"] # 0x29c9 (en: 'two joined squares') - - "⧊": [T: "trekant med prikk over"] # 0x29ca (en: 'triangle with dot above', google: 'triangel med prick ovan') - - "⧋": [T: "trekant med strek under"] # 0x29cb (en: 'triangle with underbar', google: 'triangel med underbar') - - "⧌": [T: "trekant med s"] # 0x29cc (en: 's in triangle') - - "⧍": [T: "trekant med seriffer pĂ„ bunnen"] # 0x29cd (en: 'triangle with serifs at bottom') - - "⧎": [T: "hĂžyre trekant over venstre trekant"] # 0x29ce (en: 'right triangle above left triangle') - - "⧏": [T: "venstre trekant ved siden av vertikal strek"] # 0x29cf (en: 'left triangle beside vertical bar') - - "⧐": [T: "vertikal strek ved siden av hĂžyre trekant"] # 0x29d0 (en: 'vertical bar beside right triangle') - - "⧑": [T: "slĂžyfe med venstre halvdel fylt"] # 0x29d1 (en: 'bowtie with left half black', google: 'bowtie med vĂ€nster halva svart') - - "⧒": [T: "slĂžyfe med hĂžyre halvdel fylt"] # 0x29d2 (en: 'bowtie with right half black', google: 'bowtie med höger halv svart') - - "⧓": [T: "fylt slĂžyfe"] # 0x29d3 (en: 'black bowtie', google: 'svart bowtie') - - "⧔": [T: "slĂžyfe med venstre halvdel fylt og hĂžyre halvdel Ă„pen"] # 0x29d4 (en: 'times with left half black', google: 'gĂ„nger med vĂ€nster halva svart') - - "⧕": [T: "slĂžyfe med venstre halvdel Ă„pen og hĂžyre halvdel fylt"] # 0x29d5 (en: 'times with right half black', google: 'gĂ„nger med höger halv svart') - - "⧖": [T: "hvitt timeglass"] # 0x29d6 (en: 'white hourglass', google: 'vit timglas') - - "⧗": [T: "fylt timeglass"] # 0x29d7 (en: 'black hourglass') - - "⧘": [T: "venstre sikksakk gjerde"] # 0x29d8 (en: 'left wiggly fence', google: 'vĂ€nster wiggly staket') - - "⧙": [T: "hĂžyre sikksakk gjerde"] # 0x29d9 (en: 'right wiggly fence', google: 'höger vinglt staket') - - "⧚": [T: "dobbelt venstre sikksakk gjerde"] # 0x29da (en: 'left double wiggly fence', MathPlayer: 'left double wiggly fence', google: 'vĂ€nster dubbel wiggly staket') - - "⧛": [T: "dobbelt hĂžyre sikksakk gjerde"] # 0x29db (en: 'right double wiggly fence', MathPlayer: 'right double wiggly fence', google: 'höger dubbel wiggly staket') - - "⧜": [T: "ufullstendig uendelig"] # 0x29dc (en: 'incomplete infinity') - - "⧝": [T: "bĂ„nd over uendelighetstegn"] # 0x29dd (en: 'tie over infinity', google: 'bind över oĂ€ndligheten') - - "⧞": [T: "uendelig med vertikal strek"] # 0x29de (en: 'infinity negated with vertical bar') - - "⧟": [T: "tosidig multimap"] # 0x29df (en: 'double-ended multimap', google: 'dubbel-sluten multimap') - - "â§ ": [T: "kvadrat med omriss"] # 0x29e0 (en: 'square with contoured outline', google: 'fyrkantig med konturerad kontur') - - "â§Ą": [T: "Ăžker som"] # 0x29e1 (en: 'increases as') - - "â§ą": [T: "shuffle-produkt"] # 0x29e2 (en: 'shuffle product', google: 'shuffle -produkt') - - "â§Ł": [T: "likhetstegn og skrĂ„stilt parallell"] # 0x29e3 (en: 'equals sign and slanted parallel') - - "â§€": [T: "likhetstegn og skrĂ„stilt parallell med tilde over"] # 0x29e4 (en: 'equals sign and slanted parallel with tilde above') - - "â§„": [T: "identisk med og skrĂ„stilt parallell"] # 0x29e5 (en: 'identical to and slanted parallel') - - "â§Š": [T: "gleich stark"] # 0x29e6 - - "â§§": [T: "termodynamisk"] # 0x29e7 (en: 'thermodynamic', google: 'termodynamisk') - - "â§š": [T: "trekant nedover venstre halvdel fylt"] # 0x29e8 (en: 'down pointing triangle with left half black', google: 'ner pekande triangel med vĂ€nster halvsvart') - - "â§©": [T: "trekant nedover hĂžyre halvdel fylt"] # 0x29e9 (en: 'down pointing triangle with right half black', google: 'ner pekande triangel med höger halvsvart') - - "â§Ș": [T: "fylt diamant med pil ned"] # 0x29ea (en: 'black diamond with down arrow', google: 'svart diamant med nedpil') - - "â§«": [T: "fylt rombe"] # 0x29eb (en: 'black lozenge') - - "â§Ź": [T: "sirkel med pil ned"] # 0x29ec (en: 'white circle with down arrow', google: 'vit cirkel med nedpilen') - - "â§­": [T: "fylt sirkel med pil ned"] # 0x29ed (en: 'black circle with down arrow', google: 'svart cirkel med nedpilen') - - "â§ź": [T: "firkant med utstikkere"] # 0x29ee (en: 'error-barred white square', google: 'fel-spĂ€rrvit fyrkant') - - "â§Ż": [T: "fylt firkant med utstikkere"] # 0x29ef (en: 'error-barred black square', google: 'fel-barred black square') - - "â§°": [T: "diamant med utstikkere"] # 0x29f0 (en: 'error-barred white diamond', google: 'fel-spĂ€rrad vit diamant') - - "â§±": [T: "fylt diamant med utstikkere"] # 0x29f1 (en: 'error-barred black diamond', google: 'fel-barred black diamond') - - "â§Č": [T: "sirkel med utstikkere"] # 0x29f2 (en: 'error-barred white circle', google: 'fel-spĂ€rrad vit cirkel') - - "â§ł": [T: "fylt sirkel med utstikkere"] # 0x29f3 (en: 'error-barred black circle', google: 'fel-barred black circle') - - "â§Ž": [T: "kolon hĂžyrepil"] # 0x29f4 (en: 'rule-delayed', MathPlayer: 'rule delayed', google: 'regelförsenad') - - "â§”": [T: "omvendt skrĂ„strek"] # 0x29f5 (en: 'reverse solidus operator', google: 'omvĂ€nd solidus -operatör') - - "â§¶": [T: "skrĂ„strek med strek over"] # 0x29f6 (en: 'solidus with overbar') - - "â§·": [T: "omvendt skrĂ„strek med horisontal strek"] # 0x29f7 (en: 'reverse solidus with horizontal stroke', google: 'omvĂ€nd solidus med horisontellt slag') - - "â§ž": [T: "stor skrĂ„strek"] # 0x29f8 (en: 'big solidus', google: 'big solidus') - - "â§č": [T: "stor omvendt skrĂ„strek"] # 0x29f9 (en: 'big reverse solidus', google: 'big reverse solidus') - - "â§ș": [T: "dobbel pluss"] # 0x29fa (en: 'double plus', google: 'dubbel plus') - - "â§»": [T: "trippel pluss"] # 0x29fb (en: 'triple plus', google: 'trippel plus') - - "â§Œ": [T: "venstre buet vinkelparentes"] # 0x29fc (en: 'left pointing curved angle bracket', google: 'vĂ€nster pekande krökt vinkelfĂ€ste') - - "â§œ": [T: "hĂžyre buet vinkelparentes"] # 0x29fd (en: 'right pointing curved angle bracket', google: 'höger pekande krökt vinkelfĂ€ste') - # SWEDISH: kept English tiny & miny but changed spelling to get pronunciation right - - "â§Ÿ": [T: "tainy"] # 0x29fe (en: 'tiny', google: 'mycket liten') - - "â§ż": [T: "mainy"] # 0x29ff (en: 'miny', google: 'miny') - #-------------------------------------------------------------------------------------------------------------- - # Supplemental Mathematical operators OK - - "⹀": [T: "dot-operator i sirkel"] # 0x2a00 (en: 'circled dot operator', google: 'circled dot operator') - - "⚁": [T: "pluss i sirkel"] # 0x2a01 (en: 'circled plus operator', google: 'circled plus operator') - - "⹂": [T: "multiplikasjon i sirkel"] # 0x2a02 (en: 'circled times operator', google: 'circled times operator') - - "⚃": [T: "union med prikk"] # 0x2a03 (en: 'union operator with dot', google: 'unionoperatör med dot') - - "⹄": [T: "union med pluss"] # 0x2a04 (en: 'union operator with plus', google: 'unionoperatör med plus') - - "⹅": [T: "kvadratisk snitt-operator"] # 0x2a05 (en: 'square intersection operator', google: 'square -korsningsoperatör') - - "⹆": [T: "kvadratisk union-operator"] # 0x2a06 (en: 'square union operator', google: 'square union operator') - - "⹇": [T: "to logiske og"] # 0x2a07 (en: 'two logical and operator', google: 'tvĂ„ logiska och operatörer') - - "⚈": [T: "to logiske eller"] # 0x2a08 (en: 'two logical or operator', google: 'tvĂ„ logiska eller operatörer') - - "⹉": [T: "ganger"] # 0x2a09 (en: 'times operator', google: 'times operator') - - "⹊": [T: "modulo to sum"] # 0x2a0a (en: 'modulo two sum', google: 'modulo tvĂ„ summa') - - "⹋": [T: "sum med integral"] # 0x2a0b (en: 'summation with integral', google: 'summering med integrerad') - - "⹌": [T: "firedobbelt integral"] # 0x2a0c (en: 'quadruple integral operator') - - "⚍": [T: "integral med horisontal strek"] # 0x2a0d (en: 'finite part integral') - - "⚎": [T: "integral med dobbel horisontal strek"] # 0x2a0e (en: 'integral with double stroke', google: 'integrerad med dubbelslag') - - "⚏": [T: "integral med skrĂ„strek"] # 0x2a0f (en: 'integral average with slash', google: 'integrerat medelvĂ€rde med snedstreck') - - "⚐": [T: "sirkulasjons-funksjon"] # 0x2a10 (en: 'circulation function') - - "⹑": [T: "integrasjon mot klokka"] # 0x2a11 (en: 'anticlockwise integration') - - "⹒": [T: "linjeintegral med rektangulĂŠr vei rundt pol"] # 0x2a12 (en: 'line integration with rectangular path around pole') - - "⹓": [T: "linjeintegral med halvsirkel-vei rundt pol"] # 0x2a13 (en: 'line integration with semicircular path around pole') - - "⹔": [T: "linjeintegral eksklusiv polen"] # 0x2a14 (en: 'line integration not including the pole', MathPlayer: 'line integration not including the pole', google: 'linjeintegration inkluderar inte polen') - - "⹕": [T: "integral rund punkt-operator"] # 0x2a15 - - "⹖": [T: "integral med firkant"] # 0x2a16 - - "⹗": [T: "integral med venstrepil med krok"] # 0x2a17 (en: 'integral with leftwards arrow with hook') - - "⚘": [T: "integral med multiplikasjonstegn"] # 0x2a18 (en: 'integral with times sign', google: 'integrerad med times sign') - - "⹙": [T: "integral med snitt"] # 0x2a19 (en: 'integral with intersection', google: 'integrerad med korsning') - - "⹚": [T: "integral med union"] # 0x2a1a (en: 'integral with union', google: 'integrerad med unionen') - - "⹛": [T: "integral med horisontal strek over"] # 0x2a1b (en: 'integral with overbar', google: 'integrerad med overbar') - - "⹜": [T: "integral med horisontal strek under"] # 0x2a1c (en: 'integral with underbar', google: 'integrerad med underbar') - - "⚝": [T: "join"] # 0x2a1d (en: 'join', google: 'ansluta sig') - - "⚞": [T: "stor venstre trekant"] # 0x2a1e (en: 'large left triangle operator', google: 'stor vĂ€nster triangeloperatör') - - "⹟": [T: "skjema-sammensetning z-notasjon"] # 0x2a1f (en: 'z notation schema composition', google: 'z notationsschema komposition') - - "âš ": [T: "skjema-sluse z-notasjon"] # 0x2a20 (en: 'z notation schema piping', google: 'z notation schema piping') - - "⚥": [T: "skjema-projeksjon z-notasjon"] # 0x2a21 (en: 'z notation schema projection', google: 'z notation schema projection') - - "âšą": [T: "pluss med sirkel over"] # 0x2a22 (en: 'plus sign with circle above', MathPlayer: 'plustecken med ring över', google: 'plus skylt med cirkel ovan') - - "⚣": [T: "pluss med cirkumfleks over"] # 0x2a23 (en: 'plus sign with circumflex accent above', MathPlayer: 'plustecken med cirkumflex accent över', google: 'plus -tecken med circumflex -accent ovan') - - "⚀": [T: "pluss med tilde over"] # 0x2a24 (en: 'plus sign with tilde above') - - "âš„": [T: "pluss med prikk under"] # 0x2a25 (en: 'plus sign with dot below', MathPlayer: 'plustecken med punkt under', google: 'plus skylt med dot nedan') - - "⚊": [T: "pluss med tilde under"] # 0x2a26 (en: 'plus sign with tilde below') - - "âš§": [T: "pluss med nedre indeks to"] # 0x2a27 (en: 'plus sign with subscript two', MathPlayer: 'plustecken med index tvĂ„', google: 'plus skylt med prenumeration tvĂ„') - - "âšš": [T: "pluss med fylt trekant"] # 0x2a28 (en: 'plus sign with black triangle', google: 'plus skylt med svart triangel') - - "âš©": [T: "minus med komma over"] # 0x2a29 (en: 'minus sign with comma above', MathPlayer: 'minustecken med komma över', google: 'minus tecken med komma ovan') - - "âšȘ": [T: "minus med prikk under"] # 0x2a2a (en: 'minus sign with dot below', MathPlayer: 'minustecken med punkt under', google: 'minus tecken med prick nedan') - - "âš«": [T: "minus med fallende prikker"] # 0x2a2b (en: 'minus sign with falling dots', google: 'minus tecken med fallande prickar') - - "⚏": [T: "minus med stigende prikker"] # 0x2a2c (en: 'minus sign with rising dots', google: 'minus tecken med stigande prickar') - - "âš­": [T: "pluss i venstre halvsirkel"] # 0x2a2d (en: 'plus sign in left half circle', MathPlayer: 'plustecken i vĂ€nster halvcirkel', google: 'plus logga in vĂ€nster halva cirkeln') - - "âšź": [T: "pluss i hĂžyre halvsirkel"] # 0x2a2e (en: 'plus sign in right half circle', MathPlayer: 'plustecken i höger halvcirkel', google: 'plus logga in höger halv cirkel') - - "⚯": # 0x2a2f - - test: - if: "$Verbosity='Terse'" - then: [T: "kryss"] - else: [T: "kryssprodukt"] - - "âš°": [T: "multiplikasjon med prikk over"] # 0x2a30 (en: 'multiplication sign with dot above') - - "âš±": [T: "multiplikasjon med strek under"] # 0x2a31 (en: 'multiplication sign with underbar') - - "âšČ": [T: "semi-direkte produkt med lukket bunn"] # 0x2a32 (en: 'semidirect product with bottom closed', google: 'semidirect -produkt med botten stĂ€ngd') - - "âšł": [T: "smash-produkt"] # 0x2a33 (en: 'smash product', MathPlayer: 'smash product', google: 'krossa produkten') - - "⚎": [T: "multiplikasjon i venstre halvsirkel"] # 0x2a34 (en: 'multiplication sign in left half circle') - - "âš”": [T: "multiplikasjon i hĂžyre halvsirkel"] # 0x2a35 (en: 'multiplication sign in right half circle') - - "âš¶": [T: "multiplikasjon i sirkel med cirkumfleks"] # 0x2a36 (en: 'circled multiplication sign with circumflex accent') - - "âš·": [T: "multiplikasjon i dobbel sirkel"] # 0x2a37 (en: 'multiplication sign in double circle') - - "âšž": [T: "divisjon i sirkel"] # 0x2a38 - - "âšč": [T: "pluss i trekant"] # 0x2a39 (en: 'plus sign in triangle', MathPlayer: 'plustecken i triangel', google: 'plus inloggning av triangeln') - - "âšș": [T: "minus i trekant"] # 0x2a3a (en: 'minus sign in triangle', MathPlayer: 'minustecken i triangel', google: 'minus logga in triangel') - - "âš»": [T: "multiplikasjon i trekant"] # 0x2a3b (en: 'multiplication sign in triangle') - - "⚌": [T: "interior product"] # 0x2a3c (en: 'interior product', MathPlayer: 'interior product', google: 'interiörprodukt') - - "âšœ": [T: "invers interior product"] # 0x2a3d (en: 'righthand interior product', google: 'högra interiörprodukt') - - "⚟": [T: "relasjonssammensetning z-notasjon"] # 0x2a3e - - "âšż": [T: "koprodukt"] # 0x2a3f (en: 'amalgamation or coproduct', MathPlayer: 'amalgamation or coproduct', google: 'amalgamation eller coprodukt') - - "⩀": [T: "snitt med prikk"] # 0x2a40 (en: 'intersection with dot') - - "⩁": [T: "union med minus"] # 0x2a41 (en: 'union with minus sign', google: 'union med minus tecken') - - "⩂": [T: "union med horisontal strek over"] # 0x2a42 (en: 'union with overbar') - - "⩃": [T: "snitt med horisontal strek over"] # 0x2a43 (en: 'intersection with overbar') - - "⩄": [T: "snitt med logisk og"] # 0x2a44 (en: 'intersection with logical and') - - "⩅": [T: "union med logisk eller"] # 0x2a45 (en: 'union with logical or') - - "⩆": [T: "union over snitt"] # 0x2a46 (en: 'union above intersection') - - "⩇": [T: "snitt over union"] # 0x2a47 (en: 'intersection above union') - - "⩈": [T: "union over strek over snitt"] # 0x2a48 (en: 'union above bar above intersection') - - "⩉": [T: "snitt over strek over union"] # 0x2a49 (en: 'intersection above bar above union') - - "⩊": [T: "union ved siden av og sammensatt med union"] # 0x2a4a (en: 'union beside and joined with union') - - "⩋": [T: "snitt ved siden av og sammensatt med snitt"] # 0x2a4b (en: 'intersection beside and joined with intersection') - - "⩌": [T: "lukket union med seriffer"] # 0x2a4c (en: 'closed union with serifs') - - "⩍": [T: "lukket snitt med seriffer"] # 0x2a4d (en: 'closed intersection with serifs') - - "⩎": [T: "dobbelt kvadratisk snitt"] # 0x2a4e (en: 'double square intersection', google: 'korsning av dubbel kvadrat') - - "⩏": [T: "dobbel kvadratisk union"] # 0x2a4f (en: 'double square union', google: 'double square union') - - "⩐": [T: "lukket union med seriffer og smash-produkt"] # 0x2a50 (en: 'closed union with serifs and smash product') - - "⩑": [T: "logisk og med prikk over"] # 0x2a51 (en: 'logical and with dot above', google: 'logisk och med punkt ovan') - - "⩒": [T: "logisk eller med prikk over"] # 0x2a52 (en: 'logical or with dot above', google: 'logisk eller med punkt ovan') - - "⩓": [T: "dobbel logisk og"] # 0x2a53 (en: 'double logical and') - - "⩔": [T: "dobbel logisk eller"] # 0x2a54 (en: 'double logical or') - - "⩕": [T: "to kryssende logiske og"] # 0x2a55 (en: 'two intersecting logical and') - - "⩖": [T: "to kryssende logiske eller"] # 0x2a56 (en: 'two intersecting logical or') - - "⩗": [T: "skrĂ„nende eller"] # 0x2a57 (en: 'sloping large or') - - "⩘": [T: "skrĂ„nende og"] # 0x2a58 (en: 'sloping large and') - - "⩙": [T: "logisk eller overlapper logisk og"] # 0x2a59 (en: 'logical or overlapping logical and', google: 'logisk eller överlappande logisk och') - - "⩚": [T: "logisk og med vertikal strek"] # 0x2a5a (en: 'logical and with middle stem') - - "⩛": [T: "logisk eller med vertikal strek"] # 0x2a5b (en: 'logical or with middle stem') - - "⩜": [T: "logisk og med horisontal strek"] # 0x2a5c (en: 'logical and with horizontal dash') - - "⩝": [T: "logisk eller med horisontal strek"] # 0x2a5d (en: 'logical or with horizontal dash') - - "⩞": [T: "logisk og med dobbel horisontal strek over"] # 0x2a5e (en: 'logical and with double overbar', google: 'logiskt och med dubbelt överbar') - - "⩟": [T: "logisk og med understrek"] # 0x2a5f (en: 'logical and with underbar') - - "â© ": [T: "logisk og med dobbel understrek"] # 0x2a60 (en: 'logical and with double underbar', google: 'logisk och med dubbel underbar') - - "⩥": [T: "liten v med understrek"] # 0x2a61 (en: 'small vee with underbar', google: 'liten vee med underbar') - - "⩹": [T: "logisk eller med dobbel horisontal strek over"] # 0x2a62 (en: 'logical or with double overbar', google: 'logisk eller med dubbel överbar') - - "⩣": [T: "logisk eller med dobbel understrek"] # 0x2a63 (en: 'logical or with double underbar', google: 'logisk eller med dubbel underbar') - - "â©€": [T: "definisjonsmengde antibegrensning z-notasjon"] # 0x2a64 (en: 'z notation domain antirestriction', google: 'z notation domain antirestriction') - - "â©„": [T: "verdimengde antibegrensning z-notasjon"] # 0x2a65 (en: 'z notation range antirestriction', google: 'z notation range antirestriction') - - "⩊": [T: "lik med prikk under"] # 0x2a66 (en: 'equals sign with dot below') - - "â©§": [T: "prikk over identisk med"] # 0x2a67 (en: 'identical with dot above', google: 'identisk med prick ovan') - - "⩚": [T: "trippel horisontal strek med dobbel vertikal strek"] # 0x2a68 (en: 'triple horizontal bar with double vertical stroke', google: 'trippel horisontell stĂ„ng med dubbel vertikal stroke') - - "â©©": [T: "trippel horisontal strek med trippel vertikal strek"] # 0x2a69 (en: 'triple horizontal bar with triple vertical stroke', google: 'trippel horisontell stĂ„ng med trippel vertikal stroke') - - "â©Ș": [T: "tilde med prikk over"] # 0x2a6a (en: 'tilde operator with dot above') - - "â©«": [T: "tilde med stigende prikker"] # 0x2a6b (en: 'tilde operator with rising dots', google: 'tilde -operatör med stigande prickar') - - "⩏": [T: "asymptotisk lik over tilde"] # 0x2a6c (en: 'similar minus similar', google: 'liknande minus liknande') - - "â©­": [T: "tilnĂŠrmet lik med prikk over"] # 0x2a6d (en: 'congruent with dot above') - - "⩟": [T: "lik med asterisk over"] # 0x2a6e (en: 'equals with asterisk', google: 'lika med asterisk') - - "⩯": [T: "tilnĂŠrmet lik med cirkumfleks"] # 0x2a6f (en: 'almost equal to with circumflex accent') - - "â©°": [T: "tilnĂŠrmet lik eller lik"] # 0x2a70 (en: 'approximately equal to or equal to', google: 'ungefĂ€r lika med eller lika med') - - "⩱": [T: "lik over pluss"] # 0x2a71 (en: 'equals sign above plus sign') - - "â©Č": [T: "pluss over lik"] # 0x2a72 (en: 'plus sign above equals sign') - - "⩳": [T: "lik over tilde"] # 0x2a73 (en: 'equals sign above tilde operator') - - "⩎": [T: "dobbelt kolon lik"] # 0x2a74 (en: 'double colon equal') - - "â©”": [T: "dobbelt likhetstegn"] # 0x2a75 (en: 'two consecutive equals signs') - - "â©¶": [T: "trippelt likhetstegn"] # 0x2a76 (en: 'three consecutive equals signs', google: 'tre pĂ„ varandra följande tecken') - - "â©·": [T: "lik med to prikker over og to prikker under"] # 0x2a77 (en: 'equals sign with two dots above and two dots below') - - "⩞": [T: "fire prikker over identisk med"] # 0x2a78 (en: 'equivalent with four dots above') - - "â©č": [T: "mindre enn med sirkel i"] # 0x2a79 (en: 'less than with circle inside') - - "â©ș": [T: "stĂžrre enn med sirkel i"] # 0x2a7a (en: 'greater than with circle inside') - - "â©»": [T: "mindre enn med spĂžrsmĂ„lstegn over"] # 0x2a7b (en: 'less than with question mark above') - - "⩌": [T: "stĂžrre enn med spĂžrsmĂ„lstegn over"] # 0x2a7c (en: 'greater than with question mark above') - - "⩜": [T: "mindre enn eller lik"] # 0x2a7d (en: 'less than or slanted equal to') - - "⩟": [T: "stĂžrre enn eller lik"] # 0x2a7e (en: 'greater than or slanted equal to') - - "⩿": [T: "mindre enn eller lik med prikk"] # 0x2a7f (en: 'less than or slanted equal to with dot inside') - - "âȘ€": [T: "stĂžrre enn eller lik med prikk"] # 0x2a80 (en: 'greater than or slanted equal to with dot inside') - - "âȘ": [T: "mindre enn eller lik med prikk over til venstre"] # 0x2a81 (en: 'less than or slanted equal to with dot above') - - "âȘ‚": [T: "stĂžrre enn eller lik med prikk over til hĂžyre"] # 0x2a82 (en: 'greater than or slanted equal to with dot above') - - "âȘƒ": [T: "mindre enn eller lik med prikk over til hĂžyre"] # 0x2a83 (en: 'less than or slanted equal to with dot above right') - - "âȘ„": [T: "stĂžrre enn eller lik med prikk over til venstre"] # 0x2a84 (en: 'greater than or slanted equal to with dot above left') - - "âȘ…": [T: "mindre enn eller tilnĂŠrmet lik"] # 0x2a85 (en: 'less than or approximate', google: 'mindre Ă€n eller ungefĂ€rligt') - - "âȘ†": [T: "stĂžrre enn eller tilnĂŠrmet lik"] # 0x2a86 (en: 'greater than or approximate', google: 'större Ă€n eller ungefĂ€rligt') - - "âȘ‡": [T: "mindre enn men ikke lik"] # 0x2a87 (en: 'less than and single line not equal to', google: 'mindre Ă€n och enstaka linjer inte lika med') - - "âȘˆ": [T: "stĂžrre enn men ikke lik"] # 0x2a88 (en: 'greater than and single line not equal to', google: 'större Ă€n och enstaka linjer inte lika med') - - "âȘ‰": [T: "mindre enn men ikke tilnĂŠrmet lik"] # 0x2a89 (en: 'less than and not approximate') - - "âȘŠ": [T: "stĂžrre enn men ikke tilnĂŠrmet lik"] # 0x2a8a (en: 'greater than and not approximate') - - "âȘ‹": [T: "mindre enn over lik over stĂžrre enn"] # 0x2a8b (en: 'less than above double line equal above greater than', google: 'mindre Ă€n över dubbel linje lika över större Ă€n') - - "âȘŒ": [T: "stĂžrre enn over lik over mindre enn"] # 0x2a8c (en: 'greater than above double line equal above less than', google: 'större Ă€n över dubbel linje lika över mindre Ă€n') - - "âȘ": [T: "mindre enn over asymptotisk lik"] # 0x2a8d (en: 'less than above similar or equal') - - "âȘŽ": [T: "stĂžrre enn over asymptotisk lik"] # 0x2a8e (en: 'greater than above similar or equal') - - "âȘ": [T: "mindre enn over tilde over stĂžrre enn"] # 0x2a8f (en: 'less than above similar above greater than') - - "âȘ": [T: "stĂžrre enn over tilde over mindre enn"] # 0x2a90 (en: 'greater than above similar above less than') - - "âȘ‘": [T: "mindre enn over stĂžrre enn over lik"] # 0x2a91 (en: 'less than above greater than above double line equal') - - "âȘ’": [T: "stĂžrre enn over mindre enn over lik"] # 0x2a92 (en: 'greater than above less than above double line equal') - - "âȘ“": [T: "mindre enn eller lik over stĂžrre enn eller lik"] # 0x2a93 (en: 'less than above slanted equal above greater than above slanted equal') - - "âȘ”": [T: "stĂžrre enn eller lik over mindre enn eller lik"] # 0x2a94 (en: 'greater than above slanted equal above less than above slanted equal') - - "âȘ•": [T: "lik eller mindre enn"] # 0x2a95 (en: 'slanted equal to or less than', google: 'lutt lika med eller mindre Ă€n') - - "âȘ–": [T: "lik eller stĂžrre enn"] # 0x2a96 (en: 'slanted equal to or greater than', google: 'lutt lika med eller större Ă€n') - - "âȘ—": [T: "lik eller mindre enn med prikk"] # 0x2a97 (en: 'slanted equal to or less than with dot inside') - - "âȘ˜": [T: "lik eller stĂžrre enn med prikk"] # 0x2a98 (en: 'slanted equal to or greater than with dot inside') - - "âȘ™": [T: "lik eller mindre enn"] # 0x2a99 (en: 'double line equal to or less than', MathPlayer: 'equal (dubbel) over less than', google: 'dubbel linje lika med eller mindre Ă€n') - - "âȘš": [T: "lik eller stĂžrre enn"] # 0x2a9a (en: 'double line equal to or greater than') - - "âȘ›": [T: "lik eller mindre enn"] # 0x2a9b (en: 'double line slanted equal to or less than', google: 'dubbel linje lutad lika med eller mindre Ă€n') - - "âȘœ": [T: "lik eller stĂžrre enn"] # 0x2a9c (en: 'double line slanted equal to or greater than', google: 'dubbel linje lutad lika med eller större Ă€n') - - "âȘ": [T: "tilnĂŠrmet lik eller mindre enn"] # 0x2a9d (en: 'similar or less than') - - "âȘž": [T: "tilnĂŠrmet lik eller stĂžrre enn"] # 0x2a9e (en: 'similar or greater than') - - "âȘŸ": [T: "tilnĂŠrmet lik over mindre enn over lik"] # 0x2a9f (en: 'similar above less than above equals sign') - - "âȘ ": [T: "tilnĂŠrmet lik over stĂžrre enn over lik"] # 0x2aa0 (en: 'similar above greater than above equals sign') - - "âȘĄ": [T: "dobbel mindre enn"] # 0x2aa1 (en: 'double nested less than') - - "âȘą": [T: "dobbel stĂžrre enn"] # 0x2aa2 (en: 'double nested greater than') - - "âȘŁ": [T: "dobbel mindre enn med strek under"] # 0x2aa3 (en: 'double nested less than with underbar', google: 'dubbel kapslad mindre Ă€n med underbar') - - "âȘ€": [T: "stĂžrre enn overlapper mindre enn"] # 0x2aa4 (en: 'greater than overlapping less than') - - "âȘ„": [T: "stĂžrre enn ved siden av mindre enn"] # 0x2aa5 (en: 'greater than beside less than') - - "âȘŠ": [T: "mindre enn lukket av kurve"] # 0x2aa6 (en: 'less than closed by curve') - - "âȘ§": [T: "stĂžrre enn lukket av kurve"] # 0x2aa7 (en: 'greater than closed by curve') - - "âȘš": [T: "mindre enn lukket av kurve over lik"] # 0x2aa8 (en: 'less than closed by curve above slanted equal') - - "âȘ©": [T: "stĂžrre enn lukket av kurve over lik"] # 0x2aa9 (en: 'greater than closed by curve above slanted equal') - - "âȘȘ": [T: "mindre enn"] # 0x2aaa (en: 'smaller than') - - "âȘ«": [T: "stĂžrre enn"] # 0x2aab (en: 'larger than') - - "âȘŹ": [T: "mindre enn eller lik"] # 0x2aac (en: 'smaller than or equal to') - - "âȘ­": [T: "stĂžrre enn eller lik"] # 0x2aad (en: 'larger than or equal to') - - "âȘź": [T: "lik med hump over"] # 0x2aae (en: 'equals sign with bumpy above', MathPlayer: 'difference between (grav accentnt)', google: 'Ă€r lika med tecken med ojĂ€mn ovan') - - "âȘŻ": [T: "foregĂ„r over likhetsstrek"] # 0x2aaf (en: 'precedes above single line equals sign') - - "âȘ°": [T: "fĂžlger over likhetsstrek"] # 0x2ab0 (en: 'succeeds above single line equals sign', google: 'lyckas över enstaka linjen Ă€r lika med tecken') - - "âȘ±": [T: "foregĂ„r over utstrĂžket likhetsstrek"] # 0x2ab1 (en: 'precedes above single line not equal to', google: 'föregĂ„r över enstaka linjer som inte Ă€r lika med') - - "âȘČ": [T: "fĂžlger over utstrĂžket likhetsstrek"] # 0x2ab2 (en: 'succeeds above single line not equal to', google: 'lyckas över enstaka linjer som inte Ă€r lika med') - - "âȘł": [T: "foregĂ„r over lik"] # 0x2ab3 (en: 'precedes above equals sign', google: 'föregĂ„r över lika tecken') - - "âȘŽ": [T: "fĂžlger over lik"] # 0x2ab4 (en: 'succeeds above equals sign', google: 'lyckas över lika tecken') - - "âȘ”": [T: "foregĂ„r over ikke lik"] # 0x2ab5 (en: 'precedes above not equal to') - - "âȘ¶": [T: "fĂžlger over ikke lik"] # 0x2ab6 (en: 'succeeds above not equal to') - - "âȘ·": [T: "foregĂ„r over tilnĂŠrmet lik"] # 0x2ab7 (en: 'precedes above almost equal to', google: 'föregĂ„r över nĂ€stan lika med') - - "âȘž": [T: "fĂžlger over tilnĂŠrmet lik"] # 0x2ab8 (en: 'succeeds above almost equal to', google: 'lyckas över nĂ€stan lika med') - - "âȘč": [T: "foregĂ„r over ikke tilnĂŠrmet lik"] # 0x2ab9 (en: 'precedes above not almost equal to', google: 'föregĂ„r ovan inte nĂ€stan lika med') - - "âȘș": [T: "fĂžlger over ikke tilnĂŠrmet lik"] # 0x2aba (en: 'succeeds above not almost equal to', google: 'lyckas ovan inte nĂ€stan lika med') - - "âȘ»": [T: "dobbel foregĂ„r"] # 0x2abb (en: 'double precedes') - - "âȘŒ": [T: "dobbel fĂžlger"] # 0x2abc (en: 'double succeeds') - - "âȘœ": [T: "delmengde med prikk"] # 0x2abd (en: 'subset with dot') - - "âȘŸ": [T: "overmengde med prikk"] # 0x2abe (en: 'superset with dot') - - "âȘż": [T: "delmengde med pluss under"] # 0x2abf (en: 'subset with plus sign below', MathPlayer: 'delmĂ€ngd med plustecken under', google: 'delmĂ€ngd med plus -skylt nedan') - - "⫀": [T: "overmengde med pluss under"] # 0x2ac0 (en: 'superset with plus sign below', MathPlayer: 'delmĂ€ngd med plustecken under', google: 'superset med plus -skylt nedan') - - "⫁": [T: "delmengde med multiplikasjon under"] # 0x2ac1 (en: 'subset with multiplication sign below') - - "⫂": [T: "overmengde med multiplikasjon under"] # 0x2ac2 (en: 'superset with multiplication sign below') - - "⫃": [T: "delmengde av eller lik med prikk over"] # 0x2ac3 (en: 'subset of or equal to with dot above') - - "⫄": [T: "overmengde av eller lik med prikk over"] # 0x2ac4 (en: 'superset of or equal to with dot above') - - "⫅": [T: "delmenge av over lik"] # 0x2ac5 (en: 'subset of above equals sign', google: 'undergruppen ovan Ă€r lika med tecken') - - "⫆": [T: "overmengde av over lik"] # 0x2ac6 (en: 'superset of above equals sign', google: 'superset av ovan Ă€r lika med tecken') - - "⫇": [T: "delmengde av over tilde"] # 0x2ac7 (en: 'subset of above tilde operator') - - "⫈": [T: "overmengde av over tilde"] # 0x2ac8 (en: 'superset of above tilde operator') - - "⫉": [T: "delmengde av over tilnĂŠrmet lik"] # 0x2ac9 (en: 'subset of above almost equal to', google: 'delmĂ€ngd över nĂ€stan lika med') - - "⫊": [T: "overmengde av over tilnĂŠrmet lik"] # 0x2aca (en: 'superset of above almost equal to', google: 'superset över nĂ€stan lika med') - - "⫋": [T: "delmengde av over ikke lik"] # 0x2acb (en: 'subset above not equal to', google: 'delmĂ€ngd ovan inte lika med') - - "⫌": [T: "overmengde av over ikke lik"] # 0x2acc (en: 'superset of above not equal to', google: 'superset av ovan inte lika med') - - "⫍": [T: "venstre kvadratisk Ă„pen boks"] # 0x2acd (en: 'square left open box operator', google: 'square left open box operator') - - "⫎": [T: "hĂžyre kvadratisk Ă„pen boks"] # 0x2ace (en: 'square right open box operator', google: 'square right open box operator') - - "⫏": [T: "lukket delmengde"] # 0x2acf (en: 'closed subset') - - "⫐": [T: "lukket overmengde"] # 0x2ad0 (en: 'closed superset') - - "⫑": [T: "lukket delmengde eller lik"] # 0x2ad1 (en: 'closed subset or equal to') - - "⫒": [T: "lukket overmengde eller lik"] # 0x2ad2 (en: 'closed superset or equal to') - - "⫓": [T: "delmengde over overmengde"] # 0x2ad3 (en: 'subset above superset') - - "⫔": [T: "overmengde over delmengde"] # 0x2ad4 (en: 'superset above subset') - - "⫕": [T: "delmengde over delmengde"] # 0x2ad5 (en: 'subset above subset') - - "⫖": [T: "overmengde over overmengde"] # 0x2ad6 (en: 'superset above superset') - - "⫗": [T: "overmengde ved siden av delmengde"] # 0x2ad7 (en: 'superset beside subset') - - "⫘": [T: "overmengde ved siden av og sammenfĂžyd med delmengde"] # 0x2ad8 (en: 'superset beside and joined by dash with subset') - - "⫙": [T: "tilhĂžrer med Ă„pning nedover"] # 0x2ad9 (en: 'element of opening downwards') - - "⫚": [T: "hĂžygaffel med t Ăžverst"] # 0x2ada (en: 'pitchfork with tee top') - - "⫛": [T: "tverrgĂ„ende snitt"] # 0x2adb (en: 'transversal intersection') - - "⫝̸": [T: "avhengig"] # 0x2adc (en: 'forking', google: 'gaffel') - - "⫝": [T: "uavhengig"] # 0x2add (en: 'nonforking', google: 'icke -förflyttning') - - "⫞": [T: "kort venstre dreiekors"] # 0x2ade (en: 'short left tack', google: 'kort vĂ€nster tack') - - "⫟": [T: "kort nedoverrotert dreiekors"] # 0x2adf (en: 'short down tack', google: 'kort ner') - - "â« ": [T: "kort oppoverrotert dreiekors"] # 0x2ae0 (en: 'short up tack', google: 'kort upp tack') - - "⫥": [T: "vinkelrett med s"] # 0x2ae1 (en: 'perpendicular with s', google: 'vinkelrĂ€tt med s') - - "⫹": [T: "vertikal strek trippelt hĂžyre dreiekors"] # 0x2ae2 (en: 'vertical bar triple right turnstile', google: 'vertikal bar trippel höger turnstile') - - "⫣": [T: "dobbel vertikal strek venstre dreiekors"] # 0x2ae3 (en: 'double vertical bar left turnstile', google: 'dubbel vertikal stĂ„ng vĂ€nster turnstile') - - "â«€": [T: "vertikal strek dobbelt venstre dreiekors"] # 0x2ae4 (en: 'vertical bar double left turnstile') - - "â«„": [T: "dobbel vertikal strek dobbelt venstre dreiekors"] # 0x2ae5 (en: 'double vertical bar double left turnstile', google: 'dubbel vertikal stĂ„ng dubbel vĂ€nster vridstil') - - "⫊": [T: "dreiekors med vertikal strek"] # 0x2ae6 (en: 'long dash from left member of double vertical') - - "â«§": [T: "nedoverrotert kort dreiekors med horisontal strek over"] # 0x2ae7 (en: 'short down tack with overbar') - - "⫚": [T: "oppoverrotert kort dreiekors med horisontal strek under"] # 0x2ae8 (en: 'short up tack with underbar') - - "â«©": [T: "oppoverrotert kort dreiekors over nedoverrotert kort dreiekors"] # 0x2ae9 (en: 'short up tack above short down tack') - - "â«Ș": [T: "nedoverrotert dobbelt dreiekors"] # 0x2aea (en: 'double down tack', google: 'dubbel down tack') - - "â««": [T: "oppoverrotert dobbelt dreiekors"] # 0x2aeb (en: 'double up tack') - - "⫏": [T: "dobbeltstreket ikke"] # 0x2aec (en: 'double stroke not sign') - - "â«­": [T: "omvendt dobbeltstreket ikke"] # 0x2aed (en: 'reversed double stroke not sign') - - "⫟": [T: "deler ikke med omvendt skrĂ„strek"] # 0x2aee (en: 'does not divide with reversed negation slash') - - "⫯": [T: "vertikal strek med sirkel over"] # 0x2aef (en: 'vertical line with circle above') - - "â«°": [T: "vertikal strek med sirkel under"] # 0x2af0 (en: 'vertical line with circle below') - - "⫱": [T: "nedoverrotert dreiekors med sirkel under"] # 0x2af1 (en: 'down tack with circle below') - - "â«Č": [T: "parallel med horisontal strek"] # 0x2af2 (en: 'parallel with horizontal stroke') - - "⫳": [T: "parallel med tilde"] # 0x2af3 (en: 'parallel with tilde operator') - - "⫎": [T: "trippel loddrett strek"] # 0x2af4 (en: 'triple vertical bar binary relation', google: 'trippel vertikal bar binĂ€r relation') - - "â«”": [T: "trippel loddrett strek med horisontal strek"] # 0x2af5 (en: 'triple vertical bar with horizontal stroke', google: 'trippel vertikal stĂ„ng med horisontellt slag') - - "â«¶": [T: "trippelkolon"] # 0x2af6 (en: 'triple colon operator', google: 'trippel kolonoperatör') - - "â«·": [T: "trippel mindre enn"] # 0x2af7 (en: 'triple nested less than', google: 'trippel kapslade mindre Ă€n') - - "⫞": [T: "trippel stĂžrre enn"] # 0x2af8 (en: 'triple nested greater than', google: 'trippel kapslad större Ă€n') - - "â«č": [T: "mindre enn eller lik"] # 0x2af9 (en: 'double line slanted less than or equal to', google: 'dubbel linje lutad mindre Ă€n eller lika med') - - "â«ș": [T: "stĂžrre enn eller lik"] # 0x2afa (en: 'double line slanted greater than or equal to', google: 'dubbel linje lutad större Ă€n eller lika med') - - "â«»": [T: "trippel skrĂ„strek"] # 0x2afb (en: 'triple solidus binary relation', google: 'trippel solidus binĂ€r relation') - - "⫌": [T: "stor trippel vertikal strek"] # 0x2afc (en: 'large triple vertical bar operator', google: 'stor trippel vertikal stĂ„ngoperatör') - - "⫝̸": [T: "dobbel skrĂ„strek"] # 0x2afd (en: 'double solidus operator', google: 'dubbel solidus -operatör') - - "⫟": [T: "hvit loddrett strek"] # 0x2afe (en: 'white vertical bar', google: 'vit vertikal stĂ„ng') - - "⫿": [T: "hvit loddrett strek"] # 0x2aff (en: 'white vertical bar', google: 'vit vertikal stĂ„ng') - #-------------------------------------------------------------------------------------------------------------- - # Miscellaneous symbols and arrows OK - - "⬀": [T: "hvit nordĂžst-pil"] # 0x2b00 (en: 'north east white arrow', google: 'north east white arrow') - - "⏁": [T: "hvit nordvest-pil"] # 0x2b01 (en: 'north west white arrow', google: 'north west white arrow') - - "⬂": [T: "hvit sĂžrĂžst-pil"] # 0x2b02 (en: 'south east white arrow', google: 'south east white arrow') - - "⏃": [T: "hvit sĂžrvest-pil"] # 0x2b03 (en: 'south west white arrow', google: 'south west white arrow') - - "⬄": [T: "hvit venstre-hĂžyre-pil"] # 0x2b04 (en: 'left right white arrow', google: 'vĂ€nster höger vit pil') - - "⬅": [T: "fylt venstrepil"] # 0x2b05 (en: 'leftwards black arrow', google: 'vĂ€nster svart pil') - - "⬆": [T: "fylt oppoverpil"] # 0x2b06 (en: 'upwards black arrow', google: 'uppĂ„t svart pil') - - "⬇": [T: "fylt nedoverpil"] # 0x2b07 (en: 'downwards black arrow', google: 'nedĂ„t svart pil') - - "⏈": [T: "fylt nordĂžst-pil"] # 0x2b08 (en: 'north east black arrow', google: 'north east black arrow') - - "⬉": [T: "fylt nordvest-pil"] # 0x2b09 (en: 'north west black arrow', google: 'north west black arrow') - - "⬊": [T: "fylt sĂžrĂžst-pil"] # 0x2b0a (en: 'south east black arrow', google: 'south east black arrow') - - "⬋": [T: "fylt sĂžrvest-pil"] # 0x2b0b (en: 'south west black arrow', google: 'south west black arrow') - - "⬌": [T: "fylt venstre-hĂžyre-pil"] # 0x2b0c (en: 'left right black arrow', google: 'vĂ€nster höger svart pil') - - "⬍": [T: "fylt opp-ned-pil"] # 0x2b0d (en: 'up down black arrow', google: 'upp ner black arrow') - - "⬎": [T: "hĂžyrepil med spiss ned"] # 0x2b0e (en: 'rightwards arrow with tip downwards', google: 'Ă„tgĂ€rdspil med spets nedĂ„t') - - "⬏": [T: "hĂžyrepil med spiss opp"] # 0x2b0f (en: 'rightwards arrow with tip upwards', google: 'Ă„tgĂ€rdspil med spetsen uppĂ„t') - - "⏐": [T: "venstrepil med spiss ned"] # 0x2b10 (en: 'leftwards arrow with tip downwards', google: 'vĂ€nster pil med spetsen nedĂ„t') - - "⬑": [T: "venstrepil med spiss opp"] # 0x2b11 (en: 'leftwards arrow with tip upwards', google: 'vĂ€nster pil med spetsen uppĂ„t') - - "⬒": [T: "kvadrat med Ăžvre halvdel fylt"] # 0x2b12 (en: 'square with top half black', google: 'fyrkantig med topphalva svart') - - "⬓": [T: "kvadrat med nedre halvdel fylt"] # 0x2b13 (en: 'square with bottom half black', google: 'fyrkantig med botten halvsvart') - - "⬔": [T: "kvadrat med Ăžvre hĂžyre diagonal halvfylt"] # 0x2b14 (en: 'square with upper right diagonal half black', google: 'fyrkantig med övre högra diagonala halvsvart') - - "⬕": [T: "kvadrat med nedre venstre diagonal halvfylt"] # 0x2b15 (en: 'square with lower left diagonal half black', google: 'fyrkantig med nedre vĂ€nster diagonal halvsvart') - - "⬖": [T: "diamant med venstre halvdel fylt"] # 0x2b16 (en: 'diamond with left half black', google: 'diamant med vĂ€nster halvsvart') - - "⬗": [T: "diamant med hĂžyre halvdel fylt"] # 0x2b17 (en: 'diamond with right half black', google: 'diamant med höger halv svart') - - "⏘": [T: "diamant med Ăžvre halvdel fylt"] # 0x2b18 (en: 'diamond with top half black', google: 'diamant med topp halva svart') - - "⬙": [T: "diamant med nedre halvdel fylt"] # 0x2b19 (en: 'diamond with bottom half black', google: 'diamant med botten halvsvart') - - "⬚": [T: "prikket kvadrat"] # 0x2b1a (en: 'box', google: 'lĂ„da') - - "⬛": [T: "stort svart kvadrat"] # 0x2b1b (en: 'black large square', google: 'svart stort fyrkant') - - "⬜": [T: "stort hvitt kvadrat"] # 0x2b1c (en: 'white large square', google: 'vit stor fyrkant') - - "⬝": [T: "veldig lite svart kvadrat"] # 0x2b1d (en: 'black very small square', google: 'svart mycket litet fyrkant') - - "⬞": [T: "veldig lite hvitt kvadrat"] # 0x2b1e (en: 'white very small square', google: 'vit mycket liten fyrkant') - - "⬟": [T: "svart femkant"] # 0x2b1f (en: 'black pentagon', google: 'svart pentagon') - - "⏠": [T: "hvit femkant"] # 0x2b20 (en: 'white pentagon', google: 'vit pentagon') - - "⏥": [T: "hvit sekskant"] # 0x2b21 (en: 'white hexagon', google: 'vit hexagon') - - "⏹": [T: "svart sekskant"] # 0x2b22 (en: 'black hexagon', google: 'svart hexagon') - - "⏣": [T: "horisontal svart sekskant"] # 0x2b23 (en: 'horizontal black hexagon', google: 'horisontell svart hexagon') - - "⏀": [T: "stor svart sirkel"] # 0x2b24 (en: 'black large circle', google: 'svart stor cirkel') - - "⏄": [T: "svart diamant"] # 0x2b25 (en: 'black medium diamond', google: 'svart medium diamant') - - "⏊": [T: "hvit diamant"] # 0x2b26 (en: 'white medium diamond', google: 'vit medium diamant') - - "⏧": [T: "svart rombe"] # 0x2b27 (en: 'black medium lozenge', google: 'svart medium pastill') - - "⏚": [T: "hvit rombe"] # 0x2b28 (en: 'white medium lozenge', google: 'vit medium pastill') - - "⏩": [T: "liten svart diamant"] # 0x2b29 (en: 'black small diamond') - - "âŹȘ": [T: "liten svart rombe"] # 0x2b2a (en: 'black small lozenge', google: 'svart liten pastill') - - "⏫": [T: "liten hvit rombe"] # 0x2b2b (en: 'white small lozenge', google: 'vit liten pastill') - - "⏏": [T: "svart horisontal ellipse"] # 0x2b2c (en: 'black horizontal ellipse') - - "⏭": [T: "hvit horisontal ellipse"] # 0x2b2d (en: 'white horizontal ellipse') - - "⏟": [T: "svart vertikal ellipse"] # 0x2b2e (en: 'black vertical ellipse', google: 'svart vertikalt ellips') - - "⏯": [T: "hvit vertikal ellipse"] # 0x2b2f (en: 'white vertical ellipse') - - "⏰": [T: "venstrepil med liten sirkel"] # 0x2b30 (en: 'left arrow with small circle', google: 'vĂ€nster pil med liten cirkel') - - "⏱": [T: "tre venstrepiler"] # 0x2b31 (en: 'three leftwards arrows') - - "âŹČ": [T: "venstrepil med pluss i sirkel"] # 0x2b32 (en: 'left arrow with circled plus', google: 'vĂ€nster pil med circled plus') - - "⏳": [T: "lang sikksakk venstrepil"] # 0x2b33 (en: 'long leftwards squiggle arrow', google: 'lĂ„ngt vĂ€nster squiggle pil') - - "⏎": [T: "venstrepil med dobbel spiss og vertikal strek"] # 0x2b34 (en: 'leftwards two headed arrow with vertical stroke', google: 'vĂ€nster tvĂ„ ledde pil med vertikalt slag') - - "⏔": [T: "venstrepil med dobbel spiss og dobbel vertikal strek"] # 0x2b35 (en: 'leftwards two headed arrow with double vertical stroke', google: 'vĂ€nster tvĂ„ ledde pil med dubbel vertikal stroke') - - "⏶": [T: "venstrepil med dobbel spiss fra strek"] # 0x2b36 (en: 'leftwards two headed arrow from bar', google: 'vĂ€nster tvĂ„ ledde pil frĂ„n bar') - - "⏷": [T: "stiplet venstrepil med dobbel spiss"] # 0x2b37 (en: 'leftwards two headed triple dash arrow', google: 'vĂ€nster tvĂ„ ledde trippelstreckpil') - - "⏞": [T: "stiplet venstrepil"] # 0x2b38 (en: 'leftwards arrow with dotted stem', google: 'vĂ€nster pil med prickad stam') - - "âŹč": [T: "venstrepil med vertikal strek og hale"] # 0x2b39 (en: 'leftwards arrow with tail with vertical stroke', google: 'vĂ€nster pil med svans med vertikalt slag') - - "âŹș": [T: "venstrepil med hale og dobbel vertikal strek"] # 0x2b3a (en: 'leftwards arrow with tail with double vertical stroke', google: 'vĂ€nster pil med svans med dubbel vertikal stroke') - - "⏻": [T: "venstrepil med dobbel spiss og hale"] # 0x2b3b (en: 'leftwards two headed arrow with tail', google: 'vĂ€nster tvĂ„ ledde pil med svans') - - "âŹŒ": [T: "venstrepil med dobbel spiss, hale og vertikal strek"] # 0x2b3c (en: 'leftwards two headed arrow with tail with vertical stroke', google: 'vĂ€nster tvĂ„ ledde pilen med svans med vertikal stroke') - - "âŹœ": [T: "venstrepil med dobbel spiss, hale og dobbel vertikal strek"] # 0x2b3d (en: 'leftwards two headed arrow with tail with double vertical stroke', google: 'vĂ€nster tvĂ„ ledde pilen med svans med dubbel vertikal stroke') - - "âŹŸ": [T: "venstrepil gjennom x"] # 0x2b3e (en: 'leftwards arrow through x', google: 'vĂ€nster pil genom x') - - "⏿": [T: "bĂžlget venstrepil"] # 0x2b3f (en: 'wave arrow pointing directly left', google: 'wave arrow pekade direkt kvar') - - "⭀": [T: "venstrepil med likhetstegn"] # 0x2b40 (en: 'equals sign above leftwards arrow', google: 'Ă€r lika med skylt över vĂ€nster pil') - - "⭁": [T: "venstrepil med speilvendt tilde"] # 0x2b41 (en: 'reverse tilde operator above leftwards arrow', google: 'omvĂ€nd tilde -operatör över vĂ€nster pil') - - "⭂": [T: "venstrepil over speilvendt omtrent lik"] # 0x2b42 (en: 'leftwards arrow above reverse almost equal to', google: 'vĂ€nster pil över omvĂ€nd nĂ€stan lika med') - - "⭃": [T: "hĂžyrepil gjennom stĂžrre enn"] # 0x2b43 (en: 'rightwards arrow through greater than', google: 'Ă„tgĂ€rdspil genom större Ă€n') - - "⭄": [T: "hĂžyrepil gjennom overmengde"] # 0x2b44 (en: 'rightwards arrow through superset', google: 'Ă„tgĂ€rdspil genom superset') - - "⭅": [T: "kvadrupel-streket venstrepil"] # 0x2b45 (en: 'leftwards quadruple arrow', google: 'vĂ€nster fyrdubbla pil') - - "⭆": [T: "kvadrupel-streket hĂžyrepil"] # 0x2b46 (en: 'rightwards quadruple arrow', google: 'Ă„tgĂ€rd med höger fyrdubbla') - - "⭇": [T: "hĂžyrepil med speilvendt tilde"] # 0x2b47 (en: 'reverse tilde operator above rightwards arrow', google: 'omvĂ€nd tilde -operatör ovanför höger-pilen') - - "⭈": [T: "hĂžyrepil over speilvendt omtrent lik"] # 0x2b48 (en: 'rightwards arrow above reverse almost equal to', google: 'Ă„tgĂ€rdspilen över omvĂ€nd nĂ€stan lika med') - - "⭉": [T: "venstrepil med tilde"] # 0x2b49 (en: 'tilde operator above leftwards arrow', google: 'tilde -operatören ovanför vĂ€nster pil') - - "⭊": [T: "venstrepil over omtrent lik"] # 0x2b4a (en: 'leftwards arrow above almost equal to', google: 'vĂ€nster pil över nĂ€stan lika med') - - "⭋": [T: "venstrepil over speilvendt tilde"] # 0x2b4b (en: 'leftwards arrow above reverse tilde operator', google: 'vĂ€nster pil ovanför omvĂ€nd tilde -operatör') - - "⭌": [T: "hĂžyrepil over speilvendt tilde"] # 0x2b4c (en: 'rightwards arrow above reverse tilde operator', google: 'Ă„tgĂ€rdspil över omvĂ€nd tilde -operatör') - - "⭐": [T: "hvit stjerne"] # 0x2b50 (en: 'white medium star') - - "⭑": [T: "liten svart stjerne"] # 0x2b51 (en: 'black small star') - - "⭒": [T: "liten hvit stjerne"] # 0x2b52 (en: 'white small star') - - "⭓": [T: "svart femkant som peker til hĂžyre"] # 0x2b53 (en: 'black right pointing pentagon', google: 'svart höger pekande pentagon') - - "⭔": [T: "hvit femkant som peker til hĂžyre"] # 0x2b54 (en: 'white right pointing pentagon', google: 'vit höger pekande pentagon') - - "⭕": [T: "fet stor sirkel"] # 0x2b55 (en: 'heavy large circle', google: 'tung stor cirkel') - - "⭖": [T: "fet oval med oval i"] # 0x2b56 (en: 'heavy oval with oval inside', google: 'tung oval med oval inuti') - - "⭗": [T: "fet sirkel med sirkel i"] # 0x2b57 (en: 'heavy circle with circle inside', google: 'tung cirkel med cirkel inuti') - - "⭘": [T: "fet sirkel"] # 0x2b58 (en: 'heavy circle', google: 'tung cirkel') - - "⭙": [T: "fet kryss i sirkel"] # 0x2b59 (en: 'heavy circled saltire', google: 'tung cirklad saltire') - #------------------------------------------------------------------------------------------------------------ - # Supplemental punctuation OK - - "⾀": [T: "rett vinkel erstatningsmarkĂžr"] # 0x2e00 (en: 'right angle substitution marker', google translation) - - "➁": [T: "rett vinkel erstatningsmarkĂžr med prikk"] # 0x2e01 (en: 'right angle dotted substitution marker', google translation) - - "⾂": [T: "venstre erstatningsparentes"] # 0x2e02 (en: 'left substitution bracket', google translation) - - "➃": [T: "hĂžyre erstatningsparentes"] # 0x2e03 (en: 'right substitution bracket', google translation) - - "⾄": [T: "venstre erstatningsparentes med prikk"] # 0x2e04 (en: 'left dotted substitution bracket', google translation) - - "⾅": [T: "hĂžyre erstatningsparentes med prikk"] # 0x2e05 (en: 'right dotted substitution bracket', google translation) - - "⾆": [T: "hevet interpolasjonsmarkĂžr"] # 0x2e06 (en: 'raised interpolation marker', google translation) - - "⾇": [T: "hevet interpolasjonsmarkĂžr med prikk"] # 0x2e07 (en: 'raised dotted interpolation marker', google translation) - - "➈": [T: "venstre transposisjonsmarkĂžr med prikk"] # 0x2e08 (en: 'dotted transposition marker marker', google translation) - - "⾉": [T: "venstre transposisjonsparentes"] # 0x2e09 (en: 'left transposition bracket', google translation) - - "⾊": [T: "hĂžyre transposisjonsparentes"] # 0x2e0a (en: 'right transposition bracket', google translation) - - "⾋": [T: "hevet kvadrat"] # 0x2e0b (en: 'raised square', google translation) - - "⾌": [T: "venstre hevet utelatelses-parentes"] # 0x2e0c (en: 'left raised omission bracket', google translation) - - "➍": [T: "hĂžyre hevet utelatelses-parentes"] # 0x2e0d (en: 'right raised omission bracket', google translation) - - "⾎": [T: "redaksjonell coronis"] # 0x2e0e (en: 'editorial coronis', google translation) - - "➏": [T: "paragraphos"] # 0x2e0f (google translation) - - "➐": [T: "forgreinet paragraphos"] # 0x2e10 (en: 'forked paragraphos', google translation) - - "⾑": [T: "speilvendt forgreinet paragraphos"] # 0x2e11 (en: 'reversed forked paragraphos', google translation) - - "⾒": [T: "hypodiastol"] # 0x2e12 (google translation) - - "⾓": [T: "prikket obelus"] # 0x2e13 (en: 'dotted obelos', google translation) - - "⾔": [T: "nedover ancora"] # 0x2e14 (en: 'downwards ancora', google translation) - - "⾕": [T: "oppover ancora"] # 0x2e15 (en: 'upwards ancora', google translation) - - "⾖": [T: "prikket hĂžyrepekende vinkel"] # 0x2e16 (en: 'dotted right pointing angle', google translation) - - "⾗": [T: "dobbel skrĂ„ bindestrek"] # 0x2e17 (en: 'double oblique hyphen', google translation) - - "➘": [T: "omvendt interrobang"] # 0x2e18 (en: 'inverted interrobang', google translation) - - "⾙": [T: "palmegren"] # 0x2e19 (google translation) - - "⾚": [T: "bindestrek med trema"] # 0x2e1a (en: 'hyphen with diaeresis', google translation) - - "⾛": [T: "tilde med ring"] # 0x2e1b (en: 'tilde with ring above', google translation) - - "⾜": [T: "lav venstre parafraseparentes"] # 0x2e1c (en: 'left low paraphrase bracket', google translation) - - "➝": [T: "lav hĂžyre parafraseparentes"] # 0x2e1d (en: 'right low paraphrase bracket', google translation) - - "⾞": [T: "tilde med prikk over"] # 0x2e1e (en: 'tilde with dot above', google translation) - - "⾟": [T: "tilde med prikk under"] # 0x2e1f (en: 'tilde with dot below', google translation) - - "âž ": [T: "vertikal strek med pigg til hĂžyre"] # 0x2e20 (en: 'left vertical bar with quill', google translation) - - "➥": [T: "vertikal strek med pigg til venstre"] # 0x2e21 (en: 'right vertical bar with quill', google translation) - - "âžą": [T: "Ăžvre venstre halv hakeparentes"] # 0x2e22 (en: 'top left half bracket', google: 'överst till vĂ€nster halvfĂ€ste') - - "➣": [T: "Ăžvre hĂžyre halv hakeparentes"] # 0x2e23 (en: 'top right half bracket', google: 'överst till höger halva konsol') - - "➀": [T: "nedre venstre halv hakeparentes"] # 0x2e24 (en: 'bottom left half bracket', google: 'nedre vĂ€nstra halvfĂ€stet') - - "âž„": [T: "nedre hĂžyre halv hakeparentes"] # 0x2e25 (en: 'bottom right half bracket', google: 'nedre högra halvfĂ€stet') - - "➊": [T: "venstre u-parentes"] # 0x2e26 (en: 'left sideways u bracket', google: 'vĂ€nster i sidled u konsol') - - "âž§": [T: "hĂžyre u-parentes"] # 0x2e27 (en: 'right sideways u bracket', google: 'höger i sidled u konsol') - - "âžš": [T: "dobbel venstreparentes"] # 0x2e28 (en: 'left double parentheses', google: 'vĂ€nster dubbla parenteser') - - "âž©": [T: "dobbel hĂžyreparentes"] # 0x2e29 (en: 'right double parentheses', google: 'höger dubbel parentes') - - "âžȘ": [T: "to prikker over Ă©n prikk"] # 0x2e2a (en: 'two dots over one dot punctuation', google translation) - - "âž«": [T: "Ă©n prikk over to prikker"] # 0x2e2b (en: 'one dot over two dots punctuation', google translation) - - "➏": [T: "fire prikker i kvadrat"] # 0x2e2c (en: 'squared four dot punctuation', google translation) - - "âž­": [T: "fem prikker i kryss"] # 0x2e2d (en: 'five dot mark', google translation) - - "âžź": [T: "speilvendt spĂžrsmĂ„lstegn"] # 0x2e2e (en: 'reversed question mark', google translation) - - "➯": [T: "vertikal tilde"] # 0x2e2f (en: 'vertical tilde', google translation) - - "âž°": [T: "ringpunkt"] # 0x2e30 (en: 'ring point', google translation) - - "âž±": [T: "ordskille-punkt"] # 0x2e31 (google translation) - - "âžČ": [T: "rotert komma"] # 0x2e32 (en: 'turned comma', google translation) - - "âžł": [T: "hevet prikk"] # 0x2e33 (en: 'raised dot', google translation) - - "➎": [T: "hevet komma"] # 0x2e34 (en: 'raised comma', google translation) - - "âž”": [T: "rotert semikolon"] # 0x2e35 (en: 'turned semicolon', google translation) - - "âž¶": [T: "dolk med venstre vaktstang"] # 0x2e36 (en: 'dagger with left guard', google translation) - - "âž·": [T: "dolk med hĂžyre vaktstang"] # 0x2e37 (en: 'dagger with right guard', google translation) - - "âžž": [T: "rotert dolk"] # 0x2e38 (en: 'turned dagger', google translation) - - "âžč": [T: "Ăžvre halvt avsnittssymbol"] # 0x2e39 (en: 'top half section sign', google translation) - - "âžș": [T: "dobbel tankestrek"] # 0x2e3a (en: 'two em dash', google translation) - - "âž»": [T: "trippel tankestrek"] # 0x2e3b (en: 'three em dash', google translation) - #------------------------------------------------------------------------------------------------------------------- - # CJK symbols and punctuation OK - - "〃": [T: "gjentategn"] # 0x3003 (google translation) - - "〈": [T: "venstre vinkelparentes"] # 0x3008 (en: 'left angle bracket', google: 'vĂ€nster vinkelfĂ€ste') - - "〉": [T: "hĂžyre vinkelparentes"] # 0x3009 (en: 'right angle bracket', google: 'rĂ€tt vinkelfĂ€ste') - - "《": [T: "dobbel venstre vinkelparentes"] # 0x300a (en: 'left double angle bracket') - - "》": [T: "dobbel hĂžyre vinkelparentes"] # 0x300b (en: 'right double angle bracket') - - "「": [T: "venstre hjĂžrneparentes"] # 0x300c (en: 'left corner bracket', google: 'vĂ€nster hörnfĂ€ste') - - "」": [T: "hĂžyre hjĂžrneparentes"] # 0x300d (en: 'right corner bracket', google: 'höger hörnfĂ€ste') - - "『": [T: "venstre hvit hjĂžrneparentes"] # 0x300e (en: 'left white corner bracket', google: 'vĂ€nster vit hörnfĂ€ste') - - "』": [T: "hĂžyre hvit hjĂžrneparentes"] # 0x300f (en: 'right white corner bracket', google: 'höger vit hörnfĂ€ste') - - "【": [T: "venstre svart linseformet hakeparentes"] # 0x3010 (en: 'left black lenticular bracket', google: 'vĂ€nster svart linsformell konsol') - - "】": [T: "hĂžyre svart linseformet hakeparentes"] # 0x3011 (en: 'right black lenticular bracket', google: 'höger svart linsformell konsol') - - "〔": [T: "venstre skilpaddeskall-parentes"] # 0x3014 (en: 'left tortoise shell bracket') - - "〕": [T: "hĂžyre skilpaddeskall-parentes"] # 0x3015 (en: 'right tortoise shell bracket') - - "〖": [T: "venstre hvit linseformet hakeparentes"] # 0x3016 (en: 'left white lenticular bracket', google: 'vĂ€nster vit linsformad konsol') - - "〗": [T: "hĂžyre hvit linseformet hakeparentes"] # 0x3017 (en: 'right white lenticular bracket', google: 'höger vit linsformad konsol') - - "〘": [T: "venstre hvit skilpaddeskall-parentes"] # 0x3018 (en: 'left white tortoise shell bracket', google: 'vĂ€nster vit sköldpaddsskalfĂ€ste') - - "〙": [T: "hĂžyre hvit skilpaddeskall-parentes"] # 0x3019 (en: 'right white tortoise shell bracket', google: 'höger vit sköldpaddsskalfĂ€ste') - - "〚": [T: "venstre hvit hakeparentes"] # 0x301a (en: 'left white square bracket') - - "〛": [T: "hĂžyre hvit hakeparentes"] # 0x301b (en: 'right white square bracket') - - "〜": [T: "bĂžlgestrek"] # 0x301c (en: 'wave dash', google: 'wave dash') - - "〰": [T: "bĂžlget strek"] # 0x3030 (en: 'wavy dash', google: 'wavy dash') - #---------------------------------------------------------------------------------------------------------------------------------- - # Enclosed CJK letters and months OK - - "㉈": [T: "ti i sirkel pĂ„ fylt kvadrat"] # 0x3248 (en: 'circled number ten on black square', google: 'cirklat nummer tio pĂ„ black square') - - "㉉": [T: "tjue i sirkel pĂ„ fylt kvadrat"] # 0x3249 (en: 'circled number twenty on black square', google: 'cirklat nummer tjugo pĂ„ black square') - - "㉊": [T: "tretti i sirkel pĂ„ fylt kvadrat"] # 0x324a (en: 'circled number thirty on black square', google: 'cirklat nummer trettio pĂ„ black square') - - "㉋": [T: "fĂžrti i sirkel pĂ„ fylt kvadrat"] # 0x324b (en: 'circled number forty on blacks square', google: 'cirklat nummer fyrtio pĂ„ blacks square') - - "㉌": [T: "femti i sirkel pĂ„ fylt kvadrat"] # 0x324c (en: 'circled number fifty on black square', google: 'cirklat nummer femtio pĂ„ black square') - - "㉍": [T: "seksti i sirkel pĂ„ fylt kvadrat"] # 0x324d (en: 'circled number sixty on black square', google: 'cirklat nummer sextio pĂ„ black square') - - "㉎": [T: "sytti i sirkel pĂ„ fylt kvadrat"] # 0x324e (en: 'circled number seventy on black square', google: 'cirklat nummer sjuttio pĂ„ black square') - - "㉏": [T: "Ă„tti i sirkel pĂ„ fylt kvadrat"] # 0x324f (en: 'circled number eighty on black square', google: 'cirklat nummer aty pĂ„ black square') - - "㉑": [T: "tjueen i sirkel"] # 0x3251 (en: 'circled number twenty one', google translation) - - "㉒": [T: "tjueto i sirkel"] # 0x3252 (en: 'circled number twenty two', google translation) - - "㉓": [T: "tjuetre i sirkel"] # 0x3253 (en: 'circled number twenty three', google translation) - - "㉔": [T: "tjuefire i sirkel"] # 0x3254 (en: 'circled number twenty four', google translation) - - "㉕": [T: "tjuefem i sirkel"] # 0x3255 (google translation) - - "㉖": [T: "tjueseks i sirkel"] # 0x3256 (google translation) - - "㉗": [T: "tjuesju i sirkel"] # 0x3257 (en: 'circled number twenty seven', google translation) - - "㉘": [T: "tjueĂ„tte i sirkel"] # 0x3258 (en: 'circled number twenty eight', google translation) - - "㉙": [T: "tjueni i sirkel"] # 0x3259 (en: 'circled number twenty nine', google translation) - - "㉚": [T: "tretti i sirkel"] # 0x325a (en: 'circled number thirty', google translation) - - "㉛": [T: "trettien i sirkel"] # 0x325b (en: 'circled number thirty one', google translation) - - "㉜": [T: "trettito i sirkel"] # 0x325c (en: 'circled number thirty two', google translation) - - "㉝": [T: "trettitre i sirkel"] # 0x325d (google translation) - - "㉞": [T: "trettifire i sirkel"] # 0x325e (en: 'circled number thirty four', google translation) - - "㉟": [T: "trettifem i sirkel"] # 0x325f (en: 'circled number thirty five', google translation) - - "㊱": [T: "trettiseks i sirkel"] # 0x32b1 (en: 'circled number thirty six', google translation) - - "ăŠČ": [T: "trettisju i sirkel"] # 0x32b2 (en: 'circled number thirty seven', GPT-5.4 translation) - - "㊳": [T: "trettiĂ„tte i sirkel"] # 0x32b3 (en: 'circled number thirty eight', GPT-5.4 translation) - - "㊮": [T: "trettini i sirkel"] # 0x32b4 (en: 'circled number thirty nine', GPT-5.4 translation) - - "㊔": [T: "fĂžrti i sirkel"] # 0x32b5 (en: 'circled number forty', GPT-5.4 translation) - - "㊶": [T: "fĂžrtien i sirkel"] # 0x32b6 (en: 'circled number forty one', GPT-5.4 translation) - - "㊷": [T: "fĂžrtito i sirkel"] # 0x32b7 (en: 'circled number forty two', GPT-5.4 translation) - - "㊾": [T: "fĂžrtitre i sirkel"] # 0x32b8 (en: 'circled number forty three', GPT-5.4 translation) - - "ăŠč": [T: "fĂžrtifire i sirkel"] # 0x32b9 (en: 'circled number forty four', GPT-5.4 translation) - - "ăŠș": [T: "fĂžrtifem i sirkel"] # 0x32ba (en: 'circled number forty five', GPT-5.4 translation) - - "㊻": [T: "fĂžrtiseks i sirkel"] # 0x32bb (en: 'circled number forty six', GPT-5.4 translation) - - "ăŠŒ": [T: "fĂžrtisju i sirkel"] # 0x32bc (en: 'circled number forty seven', GPT-5.4 translation) - - "ăŠœ": [T: "fĂžrtiĂ„tte i sirkel"] # 0x32bd (en: 'circled number forty eight', GPT-5.4 translation) - - "ăŠŸ": [T: "fĂžrtini i sirkel"] # 0x32be (en: 'circled number forty nine', GPT-5.4 translation) - - "㊿": [T: "femti i sirkel"] # 0x32bf (en: 'circled number fifty', GPT-5.4 translation) - - "㋌": [T: "kvikksĂžlv"] # 0x32cc (en: 'mercury', google translation) - - "㋍": [T: "erg"] # 0x32cd (google translation) - - "㋎": [T: "elektronvolt"] # 0x32ce (en: 'electron volts', google translation) - - "㋏": [T: "begrenset ansvar"] # 0x32cf (en: 'limited liability sign', google translation) - #----------------------------------------------------------------------------------------------------------------------- - # CJK compatibility OK - - "ă±": [T: "hektopascal"] # 0x3371 (en: 'hectopascals', google translation) - - "ăČ": [T: "dalton"] # 0x3372 (google translation) - - "㍳": [T: "astronomisk enhet"] # 0x3373 (en: 'astronomical units', google translation) - - "㍮": [T: "bar"] # 0x3374 (en: 'bars', google translation) - - "ă”": [T: "o v"] # 0x3375 (google translation) - - "ă¶": [T: "parsec"] # 0x3376 (google translation) - - "ă·": [T: "desimeter"] # 0x3377 (en: 'decimeters', google translation) - - "㍾": [T: "kvadratdesimeter"] # 0x3378 (en: 'decimeters squared', google translation) - - "ăč": [T: "kubikkdesimeter"] # 0x3379 (en: 'decimeters cubed', google translation) - - "ăș": [T: "kvadratisk I U"] # 0x337a (en: 'instrumental units', google translation) - - "㎀": [T: "piko-ampere"] # 0x3380 (google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen - - "㎁": [T: "nanoampere"] # 0x3381 (google translation) - - "㎂": [T: "mikroampere"] # 0x3382 (google translation) - - "㎃": [T: "milliampere"] # 0x3383 (google translation) - - "㎄": [T: "kiloampere"] # 0x3384 (google translation) - - "㎅": [T: "kilobyte"] # 0x3385 (google translation) - - "㎆": [T: "mega-byte"] # 0x3386 (en: 'megabytes', google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen - - "㎇": [T: "gigabyte"] # 0x3387 (en: 'gigabytes', google translation) - - "㎈": [T: "kalorier"] # 0x3388 (en: 'calories', google translation) - - "㎉": [T: "kilokalorier"] # 0x3389 (en: 'kilocalories', google translation) - - "㎊": [T: "piko-farad"] # 0x338a (google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen - - "㎋": [T: "nano-farad"] # 0x338b (google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen - - "㎌": [T: "mikrofarad"] # 0x338c (google translation) - - "㎍": [T: "mikro-gram"] # 0x338d (en: 'micrograms', google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen - - "㎎": [T: "milligram"] # 0x338e (google translation) - - "㎏": [T: "kilogram"] # 0x338f (en: 'kilograms', google translation) - - "㎐": [T: "hertz"] # 0x3390 (google translation) - - "㎑": [T: "kilohertz"] # 0x3391 (google translation) - - "㎒": [T: "megahertz"] # 0x3392 (google translation) - - "㎓": [T: "gigahertz"] # 0x3393 (google translation) - - "㎔": [T: "tera-hertz"] # 0x3394 (google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen - - "㎕": [T: "mikroliter"] # 0x3395 (google translation) - - "㎖": [T: "milliliter"] # 0x3396 (google translation) - - "㎗": [T: "desiliter"] # 0x3397 (google translation) - - "㎘": [T: "kiloliter"] # 0x3398 (en: 'kiloliters', google translation) - - "㎙": [T: "femto-meter"] # 0x3399 (en: 'femtometers', google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen - - "㎚": [T: "nanometer"] # 0x339a (en: 'nanometers', google translation) - - "㎛": [T: "mikro-meter"] # 0x339b (en: 'micrometers', google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen - - "㎜": [T: "millimeter"] # 0x339c (en: 'millimeters', google translation) - - "㎝": [T: "centimeter"] # 0x339d (en: 'centimeters', google translation) - - "㎞": [T: "kilometer"] # 0x339e (en: 'kilometers', google translation) - - "㎟": [T: "kvadratmillimeter"] # 0x339f (en: 'millimeters squared', google translation) - - "㎠": [T: "kvadratcentimeter"] # 0x33a0 (en: 'centimeters squared', google translation) - - "㎡": [T: "kvadratmeter"] # 0x33a1 (en: 'meters squared', google translation) - - "㎱": [T: "kvadratkilometer"] # 0x33a2 (en: 'kilometers squared', google translation) - - "㎣": [T: "kubikkmillimeter"] # 0x33a3 (en: 'millimeters cubed', google translation) - - "㎀": [T: "kubikkcentimeter"] # 0x33a4 (en: 'centimeters cubed', google translation) - - "㎄": [T: "kubikkmeter"] # 0x33a5 (en: 'meters cubed', google translation) - - "㎩": [T: "kubikk-kilometer"] # 0x33a6 (en: 'kilometers cubed', google translation) - - "㎧": [T: "meter per sekund"] # 0x33a7 (en: 'meters per second', google translation) - - "㎹": [T: "meter per sekund i andre"] # 0x33a8 (en: 'meters per second squared', google translation) - - "㎩": [T: "pascal"] # 0x33a9 (google translation) - - "ăŽȘ": [T: "kilopascal"] # 0x33aa (google translation) - - "㎫": [T: "megapascal"] # 0x33ab (google translation) - - "㎬": [T: "giga-pascal"] # 0x33ac (google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen - - "㎭": [T: "radianer"] # 0x33ad (google translation) - - "㎼": [T: "radianer per sekund"] # 0x33ae (en: 'rads per second', google translation) - - "㎯": [T: "radianer per sekund i andre"] # 0x33af (en: 'rads per second squared', google translation) - - "㎰": [T: "piko-sekunder"] # 0x33b0 (en: 'picoseconds', google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen - - "㎱": [T: "nanosekunder"] # 0x33b1 (en: 'nanoseconds', google translation) - - "ăŽČ": [T: "mikrosekunder"] # 0x33b2 (en: 'microseconds', google translation) - - "㎳": [T: "millisekunder"] # 0x33b3 (en: 'milliseconds', google translation) - - "㎮": [T: "piko-volt"] # 0x33b4 (google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen - - "㎔": [T: "nanovolt"] # 0x33b5 (google translation) - - "㎶": [T: "mikrovolt"] # 0x33b6 (google translation) - - "㎷": [T: "millivolt"] # 0x33b7 (google translation) - - "㎾": [T: "kilovolt"] # 0x33b8 (google translation) - - "ăŽč": [T: "megavolt"] # 0x33b9 (google translation) - - "ăŽș": [T: "piko-watt"] # 0x33ba (google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen - - "㎻": [T: "nano-watt"] # 0x33bb (google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen - - "ăŽŒ": [T: "mikrowatt"] # 0x33bc (en: 'microwatts', google translation) - - "ăŽœ": [T: "milliwatt"] # 0x33bd (google translation) - - "ăŽŸ": [T: "kilowatt"] # 0x33be (google translation) - - "㎿": [T: "mega-watt"] # 0x33bf (google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen - - "㏀": [T: "kiloohm"] # 0x33c0 (google translation) - - "㏁": [T: "megaohm"] # 0x33c1 (google translation) - - "㏂": [T: "atto-meter"] # 0x33c2 (en: 'attometers', google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen - - "㏃": [T: "becquerel"] # 0x33c3 (google translation) - - "㏄": [T: "kubikkcentimeter"] # 0x33c4 (en: 'cubic centimeters', google translation) - - "㏅": [T: "candela"] # 0x33c5 (google translation) - - "㏆": [T: "coulomb per kilogram"] # 0x33c6 (en: 'coulombs per kilogram', google translation) - - "㏇": [T: "kvadratisk C O"] # 0x33c7 (en: 'cardiac output', google translation) - - "㏈": [T: "desibel"] # 0x33c8 (en: 'decibels', google translation) - - "㏉": [T: "gray"] # 0x33c9 (en: 'grays', google translation) - - "㏊": [T: "hektar"] # 0x33ca (en: 'hectares', google translation) - - "㏋": [T: "hestekraft"] # 0x33cb (en: 'horsepower', google translation) - - "㏌": [T: "tomme"] # 0x33cc (en: 'inches', google translation) - - "㏍": [T: "kilokelvin"] # 0x33cd (google translation) - - "㏎": [T: "kilometer"] # 0x33ce (en: 'kilometers', google translation) - - "㏏": [T: "knop"] # 0x33cf (en: 'knots', google translation) - - "㏐": [T: "lumen"] # 0x33d0 (en: 'lumens', google translation) - - "㏑": [T: "den naturlige logaritmen"] # 0x33d1 (en: 'natural log', google translation) - - "㏒": [T: "logaritmen"] # 0x33d2 (en: 'logarithm', google translation) - - "㏓": [T: "lux"] # 0x33d3 (google translation) - - "㏔": [T: "millibarn"] # 0x33d4 (en: 'millibarns', google translation) - - "㏕": [T: "mill"] # 0x33d5 (google translation) - - "㏖": [T: "mol"] # 0x33d6 (en: 'moles', google translation) - - "㏗": [T: "p h"] # 0x33d7 (google translation) - - "㏘": [T: "piko-meter"] # 0x33d8 (en: 'picometers', google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen - - "㏙": [T: "milliondeler"] # 0x33d9 (en: 'parts per million', google translation) - - "㏚": [T: "petarĂžntgen"] # 0x33da (google translation) - - "㏛": [T: "steradianer"] # 0x33db (google translation) - - "㏜": [T: "sievert"] # 0x33dc (google translation) - - "㏝": [T: "weber"] # 0x33dd (google translation) - - "㏞": [T: "volt per meter"] # 0x33de (en: 'volts per meter', google translation) - - "㏟": [T: "ampere per meter"] # 0x33df (google translation) - - "㏿": [T: "gallon"] # 0x33ff (en: 'gallons', google translation) - #---------------------------------------------------------------------------------------------------------- - # Private use area OK - - "": [T: "lik med hatt under"] # 0xe900 (en: 'equals with hat below', google translation) - - "": [T: "lik med pluss over"] # 0xe901 (en: 'equals with plus above', google translation) - - "": [T: "lik med pluss under"] # 0xe902 (en: 'equals with plus below', google translation) - - "": [T: "tilde med pluss over"] # 0xe903 (en: 'tilde with plus above', google translation) - - "": [T: "tilde med pluss under"] # 0xe904 (en: 'tilde with plus below', google translation) - - "": [T: "dobbel lik over stĂžrre enn"] # 0xe908 (en: 'equal double over greater than', google translation) - - "": [T: "dobbel lik over mindre enn"] # 0xe909 (en: 'equal double over less than', google translation) - - "": [T: "inneholder eller er lik"] # 0xe90a (en: 'contains or equal to', google translation) - - "": [T: "overmengde av eller lik"] # 0xe90b (en: 'superset of or equal to', google translation) - - "": [T: "delmengde av eller lik"] # 0xe90c (en: 'subset of or equal to', google translation) - - "": [T: "lik over mindre enn"] # 0xe90d (en: 'equal over less than', google translation) - - "": [T: "tilhĂžrer eller lik"] # 0xe912 (en: 'element of or equal to', google translation) - - "": [T: "lik eller stĂžrre enn"] # 0xe913 (en: 'equal to or greater than', google translation) - - "": [T: "tilnĂŠrmet overmengde av"] # 0xe914 (en: 'approximate superset of', google translation) - - "": [T: "tilnĂŠrmet delmengde av"] # 0xe915 (en: 'approximate subset of', google translation) - - "": [T: "overmengde av med prikk inkluderer som underrelasjon"] # 0xe916 (en: 'superset of with dot includes as sub relation', google translation) - - "": [T: "delmengde av med prikk inkluderes i som underrelasjon"] # 0xe917 (en: 'subset of with dot is included in as sub relation', google translation) - - "": [T: "lik med prikk under"] # 0xe918 (en: 'equal with dot below', google translation) - - "": [T: "venstre prikk over minus over hĂžyre prikk"] # 0xe919 (en: 'left dot over minus over right dot', google translation) - - "": [T: "hĂžyre prikk over minus over venstre prikk"] # 0xe91a (en: 'right dot over minus over left dot', google translation) - - "": [T: "nesten lik minus"] # 0xe91f (en: 'almost equal to minus', google translation) - - "": [T: "dobbel kvadratisk union"] # 0xe920 (en: 'double square cup', google translation) - - "": [T: "dobbelt kvadratisk snitt"] # 0xe921 (en: 'double square cap', google translation) - - "": [T: "mindre enn lik eller stĂžrre enn"] # 0xe922 (en: 'less than equal to or greater than', google translation) - - "": [T: "tilde med prikk"] # 0xe924 (en: 'tilde with dot', google translation) - - "": [T: "tilde med to prikker"] # 0xe925 (en: 'tilde with two dots', google translation) - - "": [T: "mindre enn stĂžrre enn eller lik"] #0xe926 (en: 'less than greater than or equal to', google translation) - - "": [T: "stĂžrre enn mindre enn eller lik"] # 0xe927 (en: 'greater than less than or equal to', google translation) - - "": [T: "ekvivalent med eller mindre enn"] # 0xe928 (en: 'equivalent to or less than', google translation) - - "": [T: "ekvivalent med eller stĂžrre enn"] # 0xe929 (en: 'equivalent to or greater than', google translation) - - "î€Ș": [T: "venstre Ă„pen boks"] # 0xe92a (en: 'left open box operator', google translation) - - "": [T: "hĂžyre Ă„pen boks"] # 0xe92b (en: 'right open box operator', google translation) - - "": [T: "identisk med med prikk"] # 0xe92c (en: 'identical to with dot', google translation) - - "": [T: "stĂžrre enn lik eller mindre enn"] # 0xe92d (en: 'greater than equal to or less than', google translation) - - "": [T: "bar"] # 0xe92e (en: 'bar operator', google translation) - - "": [T: "dobbel bar"] # 0xe92f (en: 'double bar operator', google translation) - - "": [T: "trippel bar"] # 0xe930 (google translation) - - "î€Č": [T: "mindre enn eller tilnĂŠrmet lik"] # 0xe932 (en: 'less than or approximately equal to', google translation) - - "": [T: "stĂžrre enn eller tilnĂŠrmet lik"] # 0xe933 (en: 'greater than or approximately equal to', google translation) - - "": [T: "nĂžstet mindre enn"] # 0xe936 (en: 'nested less than', google translation) - - "": [T: "nĂžstet stĂžrre enn"] # 0xe937 (en: 'nested greater than', google translation) - - "î€ș": [T: "foregĂ„r eller ekvivalent med"] # 0xe93a (en: 'precedes or equivalent to', google translation) - - "": [T: "fĂžlger eller ekvivalent med"] # 0xe93b (en: 'succeeds or equivalent to', google translation) - - "î„€": [T: "foregĂ„r over lik"] # 0xe940 (en: 'precedes over equal', google translation) - - "": [T: "fĂžlger over lik"] # 0xe941 (en: 'succeeds over equal', google translation) - - "î„‚": [T: "mindre enn eller lik"] # 0xe942 (en: 'less equal slanted greater', google translation) - - "": [T: "stĂžrre enn eller lik"] # 0xe943 (en: 'greater equal slanted less', google translation) - - "": [T: "oppfylles av"] # 0xe948 (en: 'satisfied by', google translation) - - "": [T: "langstrakt s"] # 0xe949 (en: 'lazy s', google translation) - - "": [T: "ikke pĂ„stand"] # 0xe94a (en: 'not assertion', google translation) - - "î„‹": [T: "dobbel lik"] # 0xe94b (en: 'double equal', google translation) - - "": [T: "trippel lik"] # 0xe94c (en: 'triple equal', google translation) - - "": [T: "regel forsinket"] # 0xe94d (en: 'rule delayed', google translation) - - "": [T: "alias skilletegn"] # 0xe94e (en: 'alias delimiter', google translation) - - "": [T: "normal undergruppe av med strek"] # 0xe950 (en: 'normal subgroup of with bar', google translation) - - "î„‘": [T: "inneholder som normal undergruppe med strek"] # 0xe951 (en: 'contains as normal subgroup with bar', google translation) - - "î„”": [T: "rund impliserer"] # 0xe954 (en: 'round implies', google translation) - - "î„•": [T: "smil under strek"] # 0xe955 (en: 'smile under bar', google translation) - - "î„–": [T: "rynke over strek"] # 0xe956 (en: 'frown over bar', google translation) - - "î„—": [T: "overmengde av eller tilnĂŠrmet lik"] # 0xe957 (en: 'superset of or almost equal to', google translation) - - "": [T: "delmengde av eller tilnĂŠrmet lik"] # 0xe958 (en: 'subset of or almost equal to', google translation) - - "î„™": [T: "stĂžrre enn tilnĂŠrmet lik eller mindre enn"] # 0xe959 (en: 'greater than almost equal to or less than', google translation) - - "": [T: "mindre enn tilnĂŠrmet lik eller stĂžrre enn"] # 0xe95a (en: 'less than almost equal or greater than', google translation) - - "": [T: "dobbel logisk eller"] # 0xe95c (en: 'double logical or', google translation) - - "": [T: "dobbel logisk og"] # 0xe95d (en: 'double logical and', google translation) - - "": [T: "logisk eller med dobbel strek under"] # 0xe95e (en: 'logical or with double bar below', google translation) - - "": [T: "logisk eller med strek under"] # 0xe95f (en: 'logical or with bar below', google translation) - - "": [T: "tilnĂŠrmet lik"] # 0xe962 (en: 'almost equal over equal', google translation) - - "î„€": [T: "venstre trekant med midtstrek"] # 0xe964 (en: 'left pointing triangle with bisecting bar', google translation) - - "î„„": [T: "hĂžyre trekant med midtstrek"] # 0xe965 (en: 'right pointing triangle with bisecting bar', google translation) - - "": [T: "lik med prikket Ăžvre linje"] # 0xe966 (en: 'equals with dotted top line', google translation) - - "î„§": [T: "foregĂ„r med kolon"] # 0xe967 (en: 'precedes with colon', google translation) - - "": [T: "fĂžlger med kolon"] # 0xe968 (en: 'succeeds with colon', google translation) - - "î„©": [T: "mindre enn eller lik"] # 0xe969 (en: 'smaller than or equal slanted', google translation) - - "î„Ș": [T: "stĂžrre enn eller lik"] # 0xe96a (en: 'larger than or equal slanted', google translation) - - "î„«": [T: "nĂžstet veldig mye mindre enn"] # 0xe96b (en: 'nested very much less than', google translation) - - "": [T: "nĂžstet veldig mye stĂžrre enn"] # 0xe96c (en: 'nested very much greater than', google translation) - - "î„­": [T: "forskjell mellom"] # 0xe96d (en: 'difference between variant', google translation) - - "": [T: "mindre enn som overlapper med stĂžrre enn"] # 0xe96e (en: 'less than greater than overlay', google translation) - - "": [T: "logisk eller som overlapper med logisk og"] # 0xe96f (en: 'logical or logical and overlay', google translation) - - "î„°": [T: "overmengde over overmengde"] # 0xe970 (google translation) - - "": [T: "delmengde over delmengde"] # 0xe971 (en: 'subset over subset', google translation) - - "î„Č": [T: "overmengde over delmengde"] # 0xe972 (en: 'superset over subset', google translation) - - "": [T: "delmengde over overmengde"] # 0xe973 (en: 'subset over superset', google translation) - - "î„č": [T: "trippel vertikal strek"] # 0xe979 (google translation) - - "î„ș": [T: "parvise firedoble vertikale prikker"] # 0xe97a (en: 'paired quadruple vertical dots', google translation) - - "î„»": [T: "vinkelrett over strek"] # 0xe97b (en: 'perpendicular over bar', google translation) - - "": [T: "venstre dreiekors dobbel vertikal strek"] # 0xe97c (en: 'left turnstile double vertical bar', google translation) - - "": [T: "dobbelt venstre dreiekors dobbel vertikal strek"] # 0xe97d (en: 'double left turnstile double vertical bar', google translation) - - "": [T: "vinkelrett over rotert vinkelrett"] # 0xe97e (en: 'perpendicular over inverted perpendicular', google translation) - - "": [T: "dobbelt venstre dreiekors vertikal strek"] # 0xe97f (en: 'double left turnstile vertical bar', google translation) - - "": [T: "sfĂŠrisk vinkel oppover"] # 0xe980 (en: 'spherical angle opening up', google translation) - - "": [T: "dobbel skrĂ„strek"] # 0xe981 (en: 'double slash', google translation) - - "": [T: "rett vinkel med hjĂžrne"] # 0xe982 (en: 'right angle with corner', google translation) - - "": [T: "sirkel med vertikal strek"] # 0xe984 (google translation) - - "": [T: "sirkel med divisjon"] # 0xe985 (google translation) - - "": [T: "stiplet skrĂ„strek"] # 0xe986 (en: 'dashed solidus', google translation) - - "": [T: "stiplet omvendt skrĂ„strek"] # 0xe987 (en: 'dashed backslash', google translation) - - "": [T: "stiplet midtlinje"] # 0xe988 (en: 'dashed mid line', google translation) - - "": [T: "stiplet vertikal strek"] # 0xe989 (en: 'dashed vertical bar', google translation) - - "": [T: "vinkelrett med s"] # 0xe98a (en: 'perpendicular with s', google translation) - - "": [T: "vinkel med s"] # 0xe98b (en: 'angle with s', google translation) - - "": [T: "sfĂŠrisk vinkel mot venstre"] # 0xe98c (en: 'spherical angle opening left', google translation) - - "": [T: "vinkel mot venstre"] # 0xe98d (en: 'angle opening left', google translation) - - "": [T: "vertikal strek med dobbel krok"] # 0xe98e (en: 'vertical bar with double hook', google translation) - - "": [T: "medium dot-operator fri radikal"] # 0xe98f (google translation) - - "": [T: "hvit oppoverpekende trekant over strek"] # 0xe990 (en: 'white up pointing triangle above bar', google translation) - - "": [T: "identisk og parallell med"] # 0xe991 (en: 'identical and parallel to', google translation) - - "": [T: "smash-produkt"] # 0xe992 (en: 'smash product', google translation) - - "": [T: "trippel vertikal strek med horisontal strek"] # 0xe993 (en: 'triple bar operator with horizontal bar', google translation) - - "": [T: "identisk med med dobbel skrĂ„strek"] # 0xe994 (en: 'identical to with double slash', google translation) - - "": [T: "triple kryssende streker"] # 0xe995 (en: 'triple crossed bars', google translation) - - "": [T: "sirkel med vertikal strek"] # 0xe996 (en: 'vertical bar over circle', google translation) - - "": [T: "vertikal proporsjonal med"] # 0xe997 (en: 'vertical proportional to', google translation) - - "": [T: "mĂ„ne i siste kvarter"] # 0xe998 (en: 'black last quarter moon', google translation) - - "": [T: "mĂ„ne i fĂžrste kvarter"] # 0xe999 (google translation) - - "": [T: "negativ sinusbĂžlge"] # 0xe9a0 (en: 'negative sine wave', google translation) - - "": [T: "prikk i parentes"] # 0xe9a1 (en: 'parenthesized dot', google translation) - - "": [T: "parenteser"] # 0xe9a2 (en: 'parens', google translation) - - "": [T: "hvitt smil"] # 0xe9a3 (en: 'white smile', google translation) - - "": [T: "hvit rynke"] # 0xe9a4 (en: 'white frown', google translation) - - "": [T: "heksagon"] # 0xe9a5 (en: 'hexagon', google translation) - - "": [T: "ekvivalent med over pluss"] # 0xe9a6 (en: 'equivalent to over plus', google translation) - - "": [T: "pluss over ekvivalent med"] # 0xe9a7 (en: 'plus over equivalent to', google translation) - - "": [T: "snitt"] # 0xe9b0 (en: 'intersection serifs', google translation) - - "": [T: "union"] # 0xe9b1 (google translation) - - "îŠČ": [T: "kvadratisk snitt"] # 0xe9b2 (en: 'square intersection serifs', google translation) - - "": [T: "kvadratisk union"] # 0xe9b3 (google translation) - - "î§ ": [T: "foregĂ„r ekvivalent med eller fĂžlger"] # 0xe9e0 (en: 'precedes equivalent to or succeeds', google translation) - - "î§Ą": [T: "fĂžlger ekvivalent med eller foregĂ„r"] # 0xe9e1 (en: 'succeeds equivalent to or precedes', google translation) - - "î§ą": [T: "foregĂ„r tilnĂŠrmet lik eller fĂžlger"] # 0xe9e2 (en: 'precedes almost equal to or succeeds', google translation) - - "î§Ł": [T: "fĂžlger tilnĂŠrmet lik eller foregĂ„r"] # 0xe9e3 (en: 'succeeds almost equal to or precedes', google translation) - - "î§°": [T: "mindre enn ekvivalent med eller stĂžrre enn"] # 0xe9f0 (en: 'less than equivalent to or greater than', google translation) - - "î§±": [T: "stĂžrre enn ekvivalent med eller mindre enn"] # 0xe9f1 (en: 'greater than equivalent to or less than', google translation) - - "": [T: "ikke mye mindre enn"] # 0xea00 (en: 'not vert much less than', google translation) - - "": [T: "ikke mye stĂžrre enn"] # 0xea01 (en: 'not vert much greater than', google translation) - - "": [T: "ikke mye mindre enn"] # 0xea02 (en: 'not much less than variant', google translation) - - "": [T: "ikke mye stĂžrre enn"] # 0xea03 (en: 'not much greater than variant', google translation) - - "": [T: "mindre enn vertikal ikke dobbel lik"] # 0xea04 (en: 'less vert not double equals', google translation) - - "": [T: "stĂžrre enn vertikal ikke dobbel lik"] # 0xea05 (en: 'gt vert not double equals', google translation) - - "": [T: "ikke mindre enn eller lik"] # 0xea06 (en: 'not less than or equal to', google translation) - - "": [T: "ikke stĂžrre enn eller lik"] # 0xea07 (en: 'not greater than or equal to', google translation) - - "": [T: "verken lik eller mindre enn"] # 0xea09 (en: 'neither equal to nor less than', google translation) - - "": [T: "inneholder ikke eller er lik"] # 0xea0a (en: 'does not contain or equal to', google translation) - - "": [T: "verken overmengde av eller lik"] # 0xea0b (en: 'neither superset of nor equal to', google translation) - - "": [T: "verken delmengde av eller lik"] # 0xea0c (en: 'neither subset of nor equal to', google translation) - - "": [T: "omvendt skrĂ„strek delmengde"] # 0xea0d (en: 'reverse solidus subset', google translation) - - "": [T: "verken lik eller stĂžrre enn"] # 0xea0e (en: 'neither equal to nor greater than', google translation) - - "": [T: "ikke minus tilde"] # 0xea0f (en: 'not minus tilde operator', google translation) - - "": [T: "verken lik eller mindre enn"] # 0xea10 (en: 'neither equal to nor less than', google translation) - - "": [T: "ikke tilde"] # 0xea11 (en: 'not tilde operator', google translation) - - "": [T: "ikke element i eller lik"] # 0xea12 (en: 'not element of or equal to', google translation) - - "": [T: "verken lik eller stĂžrre enn"] # 0xea13 (en: 'neither equal to nor greater than', google translation) - - "": [T: "ikke tilnĂŠrmet lik"] # 0xea14 (en: 'not almost equal', google translation) - - "": [T: "ikke fĂžlger tilnĂŠrmet lik"] # 0xea15 (en: 'not succeeds similar', google translation) - - "": [T: "mindre enn eller lik med skrĂ„strek"] # 0xea16 (en: 'less than or slanted equal to with slash', google translation) - - "": [T: "stĂžrre enn eller lik med skrĂ„strek"] # 0xea17 (en: 'greater than or slanted equal to with slash', google translation) - - "": [T: "overmengde skrĂ„strek"] # 0xea1a (google translation) - - "": [T: "inneholder ikke"] # 0xea1b (en: 'does not contain', google translation) - - "": [T: "ikke mindre enn eller lik"] # 0xea1d (en: 'not less than or equal to', google translation) - - "": [T: "ikke stĂžrre enn eller lik"] # 0xea1e (en: 'not greater than or equal to', google translation) - - "": [T: "ikke nesten lik minus"] # 0xea1f (en: 'not almost equal to minus', google translation) - - "îšą": [T: "tilhĂžrer ikke mengde med prikk"] # 0xea22 (en: 'negated set membership dot above', google translation) - - "": [T: "ikke rett vinkel"] # 0xea2c (en: 'not vert angle', google translation) - - "îš­": [T: "ikke parallell"] # 0xea2d (en: 'not parallel slanted', google translation) - - "îšź": [T: "ikke strek"] # 0xea2e (en: 'not bar operator', google translation) - - "": [T: "ikke dobbel strek"] # 0xea2f (en: 'not double bar operator', google translation) - - "îš°": [T: "ikke trippel strek"] # 0xea30 (en: 'not triple bar operator', google translation) - - "îšČ": [T: "mindre enn men ikke tilnĂŠrmet lik"] # 0xea32 (en: 'less than but not approximately equal to', google translation) - - "îšł": [T: "stĂžrre enn men ikke tilnĂŠrmet lik"] # 0xea33 (en: 'greater than but not approximately equal to', google translation) - - "": [T: "mindre enn eller ikke lik"] # 0xea34 (en: 'less than or not equal to', google translation) - - "îš”": [T: "stĂžrre enn eller ikke lik"] # 0xea35 (en: 'greater than or not equal to', google translation) - - "îš¶": [T: "ikke nĂžstet mindre enn"] # 0xea36 (en: 'not nested less than', google translation) - - "îš·": [T: "ikke nĂžstet stĂžrre enn"] # 0xea37 (en: 'not nested greater than', google translation) - - "îšž": [T: "ikke mye mindre enn"] # 0xea38 (en: 'not much less than', google translation) - - "îšč": [T: "ikke mye stĂžrre enn"] # 0xea39 (en: 'not much greater than', google translation) - - "îšș": [T: "foregĂ„r men ikke ekvivalent med"] # 0xea3a (en: 'precedes but not equivalent to', google translation) - - "îš»": [T: "fĂžlger men ikke ekvivalent med"] # 0xea3b (en: 'succeeds but not equivalent to', google translation) - - "": [T: "foregĂ„r men ikke lik"] # 0xea3c (en: 'precedes but not equal to', google translation) - - "îšœ": [T: "fĂžlger men ikke lik"] # 0xea3d (en: 'succeeds but not equal to', google translation) - - "": [T: "ikke lik eller foregĂ„r"] # 0xea3e (en: 'does not equal or precede', google translation) - - "îšż": [T: "ikke lik eller fĂžlger"] # 0xea3f (en: 'does not equal or succeed', google translation) - - "": [T: "foregĂ„r men ikke lik"] # 0xea40 (en: 'precedes but not equal to', google translation) - - "": [T: "fĂžlger men ikke lik"] # 0xea41 (en: 'succeeds but not equal to', google translation) - - "": [T: "ikke delmengde av eller lik"] # 0xea42 (en: 'not subset of nor equal to', google translation) - - "": [T: "ikke overmengde av eller lik"] # 0xea43 (en: 'not superset of nor equal to', google translation) - - "": [T: "delmengde av eller ikke lik"] # 0xea44 (en: 'subset of or not equal to', google translation) - - "": [T: "overmengde av eller ikke lik"] # 0xea45 (en: 'superset of or not equal to', google translation) - - "": [T: "ikke delmengde av eller lik"] # 0xea46 (en: 'not subset of nor equal to', google translation) - - "": [T: "ikke overmengde av eller lik"] # 0xea47 (en: 'not superset of nor equal to', google translation) - - "": [T: "ikke trippel mindre enn"] # 0xea48 (en: 'not triple less than', google translation) - - "": [T: "ikke trippel stĂžrre enn"] # 0xea49 (en: 'not triple greater than', google translation) - - "": [T: "ikke foregĂ„r lik"] # 0xea4c (en: 'not precedes equals', google translation) - - "": [T: "ikke fĂžlger lik"] # 0xea4d (en: 'not succeeds equals', google translation) - - "": [T: "ikke normal undergruppe av med strek"] # 0xea50 (en: 'not normal subgroup of with bar', google translation) - - "": [T: "inneholder ikke som normal undergruppe med strek"] # 0xea51 (en: 'does not contain as normal subgroup with bar', google translation) - - "": [T: "ikke forskjell mellom"] # 0xea52 (en: 'not difference between', google translation) - - "": [T: "ikke geometrisk ekvivalent med"] # 0xea53 (en: 'not geometrically equivalent to', google translation) - - "": [T: "ikke vertikal tilnĂŠrmet lik"] # 0xea54 (en: 'not vert similar', google translation) - - "": [T: "ikke lik eller tilnĂŠrmet lik"] # 0xea55 (en: 'not equal or similar', google translation) - - "": [T: "ikke vertikal tilnĂŠrmet lik"] # 0xea56 (en: 'not vert approximate', google translation) - - "": [T: "ikke tilnĂŠrmet identisk med"] # 0xea57 (en: 'not approximately identical to', google translation) - - "": [T: "ikke differansen mellom"] # 0xea58 (en: 'not bumpy equals', google translation) - - "": [T: "ikke differansen mellom"] # 0xea59 (en: 'not bumpy single equals', google translation) - - "": [T: "ikke lik prikk"] # 0xea5a (en: 'not equal dot', google translation) - - "": [T: "speilvendt ikke ekvivalent med"] # 0xea5b (en: 'reverse not equivalent', google translation) - - "î© ": [T: "ikke kvadratisk delmengde"] # 0xea60 (en: 'not square subset', google translation) - - "": [T: "ikke kvadratisk overmengde"] # 0xea61 (en: 'not square superset', google translation) - - "": [T: "ikke tilnĂŠrmet lik over lik"] # 0xea62 (en: 'not almost equal over equal', google translation) - - "": [T: "ikke strengt ekvivalent med"] # 0xea63 (en: 'not strictly equivalent to', google translation) - - "î©€": [T: "ikke kongruent prikk"] # 0xea64 (en: 'not congruent dot', google translation) - - "î©„": [T: "speilvendt ikke lik"] # 0xea65 (en: 'reverse not equal', google translation) - - "î©°": [T: "ikke vertikal venstre trekant lik"] # 0xea70 (en: 'not vert left triangle equals', google translation) - - "": [T: "ikke vertikal hĂžyre trekant lik"] # 0xea71 (en: 'not vert right triangle equals', google translation) - - "îȘ€": [T: "ikke partiell"] # 0xea80 (en: 'not partial', google translation) - - "": [T: "pilforlenger"] # 0xeb00 (en: 'arrow embellishment extender', google translation) - - "": [T: "hĂžyrepil over venstrepil"] # 0xeb01 (en: 'arrow rightwards over arrow leftwards', google translation) - - "": [T: "hĂžyrepil over venstrepil"] # 0xeb02 (en: 'arrow rightwards over arrow leftwards', google translation) - - "": [T: "hĂžyre-harpun over venstre-harpun"] # 0xeb03 (en: 'harpoon right over harpoon left', google translation) - - "": [T: "hĂžyre-harpun over venstre-harpun"] # 0xeb04 (en: 'harpoon right over harpoon left', google translation) - - "": [T: "dobbel-pil nordĂžst sĂžrvest"] # 0xeb05 (en: 'double arrow northeast southwest', google translation) - - "": [T: "dobbel-pil nordvest sĂžrĂžst"] # 0xeb06 (en: 'double arrow northwest southeast', google translation) - - "": [T: "horisontal harpun-forlenger"] # 0xeb07 (en: 'horizontal harpoon extender', google translation) - - "": [T: "venstrepil i bue mot klokka"] # 0xeb08 (en: 'anticlockwise arc leftwards arrow', google translation) - - "": [T: "hĂžyrepil i bue mot klokka"] # 0xeb09 (en: 'anticlockwise arc rightwards arrow', google translation) - - "": [T: "stor hĂžyrepil"] # 0xeb0b (en: 'large rightwards arrow accent', google translation) - - "": [T: "stor venstrepil"] # 0xeb0c (en: 'large leftwards arrow accent', google translation) - - "": [T: "venstre pilspiss"] # 0xeb0d (en: 'leftwards arrowhead', google translation) - - "": [T: "hĂžyre pilspiss"] # 0xeb0e (en: 'rightwards arrowhead', google translation) - - "": [T: "stor venstre-hĂžyre-pil med strek"] # 0xeb0f (en: 'large left right arrow with stroke', google translation) - - "": [T: "horisontal dobbel pil-forlenger"] # 0xeb10 (en: 'horizontal double arrow extender', google translation) - - "": [T: "stor venstre-hĂžyre-pil med strek"] # 0xeb11 (en: 'large left right double arrow with stroke', google translation) - - "": [T: "nedoverpil til venstre for oppoverpil"] # 0xeb12 (en: 'downwards arrow leftwards of upwards arrow', google translation) - - "": [T: "venstrepil med hjĂžrne nedover"] # 0xeb13 (en: 'leftwards arrow with corner downwards', google translation) - - "": [T: "hĂžyrepil med hjĂžrne oppover"] # 0xeb14 (en: 'rightwards arrow with corner upwards', google translation) - - "": [T: "venstrepil med hjĂžrne oppover"] # 0xeb15 (en: 'leftwards arrow with corner upwards', google translation) - - "": [T: "Ăžvre halvsirkel-pil mot klokka med pluss"] # 0xeb16 (en: 'anticlockwise top semicircle arrow with plus', google translation) - - "": [T: "Ăžvre halvsirkel-pil med klokka med minus"] # 0xeb17 (en: 'clockwise top semicircle arrow with minus', google translation) - - "": [T: "hĂžyrepil med hale og strek"] # 0xeb18 (en: 'rightwards arrow with tail with stroke', google translation) - - "": [T: "hĂžyre-harpun mothake ned"] # 0xeb19 (en: 'right harpoon down', google translation) - - "": [T: "venstre-harpun mothake ned"] # 0xeb1a (en: 'left harpoon down', google translation) - - "": [T: "venstre-hĂžyre-harpun mothake ned"] # 0xeb1b (en: 'left right harpoon down', google translation) - - "": [T: "venstre-hĂžyre-harpun mothake opp"] # 0xeb1c (en: 'left right harpoon up', google translation) - - "": [T: "opp-ned-harpun mothake venstre"] # 0xeb1d (en: 'up down harpoon left', google translation) - - "": [T: "opp-ned-harpun mothake hĂžyre"] # 0xeb1e (en: 'up down harpoon right', google translation) - - "": [T: "oppoverpil til hĂžyre for nedoverpil"] # 0xeb1f (en: 'upwards arrow to the right of downwards arrow', google translation) - - "": [T: "venstre-harpun mot strek mothake opp"] # 0xeb20 (en: 'leftwards harpoon to bar with barb upwards', google translation) - - "": [T: "hĂžyre-harpun mot strek mothake opp"] # 0xeb21 (en: 'rightwards harpoon to bar with barb upwards', google translation) - - "": [T: "venstre-harpun mot strek mothake ned"] # 0xeb22 (en: 'leftwards harpoon to bar with barb downwards', google translation) - - "": [T: "hĂžyre-harpun mot strek mothake ned"] # 0xeb23 (en: 'rightwards harpoon to bar with barb downwards', google translation) - - "": [T: "venstre-harpun fra strek mothake opp"] # 0xeb24 (en: 'leftwards harpoon from bar with barb upwards', google translation) - - "": [T: "hĂžyre-harpun fra strek mothake opp"] # 0xeb25 (en: 'rightwards harpoon from bar with barb upwards', google translation) - - "": [T: "venstre-harpun fra strek mothake ned"] # 0xeb26 (en: 'leftwards harpoon from bar with barb downwards', google translation) - - "": [T: "hĂžyre-harpun fra strek mothake ned"] # 0xeb27 (en: 'rightwards harpoon from bar with barb downwards', google translation) - - "": [T: "opp-harpun mot strek mothake venstre"] # 0xeb28 (en: 'upwards harpoon to bar with barb leftwards', google translation) - - "": [T: "ned-harpun mot strek mothake venstre"] # 0xeb29 (en: 'downwards harpoon to bar with barb leftwards', google translation) - - "îŹȘ": [T: "opp-harpun mot strek mothake hĂžyre"] # 0xeb2a (en: 'upwards harpoon to bar with barb rightwards', google translation) - - "": [T: "ned-harpun mot strek mothake hĂžyre"] # 0xeb2b (en: 'downwards harpoon to bar with barb rightwards', google translation) - - "": [T: "opp-harpun fra strek mothake venstre"] # 0xeb2c (en: 'upwards harpoon from bar with barb leftwards', google translation) - - "": [T: "ned-harpun fra strek mothake venstre"] # 0xeb2d (en: 'downwards harpoon from bar with barb leftwards', google translation) - - "": [T: "opp-harpun fra strek mothake hĂžyre"] # 0xeb2e (en: 'upwards harpoon from bar with barb rightwards', google translation) - - "": [T: "ned-harpun fra strek mothake hĂžyre"] # 0xeb2f (en: 'downwards harpoon from bar with barb rightwards', google translation) - - "": [T: "oppoverpil mot strek"] # 0xeb30 (en: 'upwards arrow to bar', google translation) - - "": [T: "nedoverpil mot strek"] # 0xeb31 (en: 'downwards arrow to bar', google translation) - - "îŹČ": [T: "opp-harpun til venstre for ned-harpun"] # 0xeb32 (en: 'upwards harpoon to the left of downwards harpoon', google translation) - - "": [T: "opp-harpun til hĂžyre for ned-harpun"] # 0xeb33 (en: 'upwards harpoon to the right of downwards harpoon', google translation) - - "": [T: "pilspiss oppover"] # 0xeb34 (en: 'upwards arrowhead', google translation) - - "": [T: "pilspiss nedover"] # 0xeb35 (en: 'downwards arrowhead', google translation) - - "": [T: "dobbel harpun venstre mothake ned hĂžyre mothake opp"] # 0xeb36 (en: 'double harpoon with leftwards barb down rightwards barb up', google translation) - - "": [T: "dobbel harpun venstre mothake opp hĂžyre mothake ned"] # 0xeb37 (en: 'double harpoon with leftwards barb up rightwards barb down', google translation) - - "": [T: "venstrepil over strek"] # 0xeb38 (en: 'leftwards arrow over bar', google translation) - - "îŹč": [T: "hĂžyrepil over strek"] # 0xeb39 (en: 'rightwards arrow over bar', google translation) - - "îŹș": [T: "venstrepil under strek"] # 0xeb3a (en: 'leftwards arrow under bar', google translation) - - "": [T: "hĂžyrepil under strek"] # 0xeb3b (en: 'rightwards arrow under bar', google translation) - - "îŹŒ": [T: "venstre-hĂžyre trippel pil"] # 0xeb3c (en: 'left right triple arrow', google translation) - - "": [T: "dobbel-pil nordĂžst sĂžrĂžst"] # 0xeb3f (en: 'double arrow northeast southeast', google translation) - - "": [T: "venstre halvsirkel-pil mot klokka"] # 0xeb40 (en: 'anticlockwise left semicircle arrow', google translation) - - "": [T: "venstre halvsirkel-pil med klokka"] # 0xeb41 (en: 'clockwise left semicircle arrow', google translation) - - "": [T: "venstre-hĂžyre-pil i venstre Ă„pen sirkel"] # 0xeb42 (en: 'left open circle left right arrow', google translation) - - "": [T: "hĂžyrepil over tilde"] # 0xeb44 (en: 'rightwards arrow over tilde', google translation) - - "": [T: "venstrepil over tilde"] # 0xeb45 (en: 'leftwards arrow over tilde', google translation) - - "": [T: "venstre-harpun over strek"] # 0xeb48 (en: 'leftwards harpoon over bar', google translation) - - "": [T: "hĂžyre-harpun over strek"] # 0xeb49 (en: 'rightwards harpoon over bar', google translation) - - "": [T: "venstre-harpun under strek"] # 0xeb4a (en: 'leftwards harpoon under bar', google translation) - - "": [T: "hĂžyre-harpun under strek"] # 0xeb4b (en: 'rightwards harpoon under bar', google translation) - - "": [T: "sammenpresset venstrepil"] # 0xeb4c (en: 'squat black leftwards arrow', google translation) - - "": [T: "hĂžyre halvsirkel-pil med klokka"] # 0xeb50 (en: 'clockwise right semicircle arrow', google translation) - - "": [T: "hĂžyre halvsirkel-pil mot klokka"] # 0xeb51 (en: 'anticlockwise right semicircle arrow', google translation) - - "": [T: "venstre-hĂžyre-harpun i venstre Ă„pen sirkel"] # 0xeb52 (en: 'left open circle left right harpoon', google translation) - - "": [T: "oppoverpil til venstre for vertikal strek"] # 0xeb58 (en: 'upwards arrow leftwards of vertical bar', google translation) - - "": [T: "nedoverpil til venstre for vertikal strek"] # 0xeb59 (en: 'downwards arrow leftwards of vertical bar', google translation) - - "": [T: "oppoverpil til hĂžyre for vertikal strek"] # 0xeb5a (en: 'upwards arrow rightwards of vertical bar', google translation) - - "": [T: "nedoverpil til hĂžyre for vertikal strek"] # 0xeb5b (en: 'downwards arrow rightwards of vertical bar', google translation) - - "": [T: "hĂžyrepil med krok ned"] # 0xeb5c (en: 'rightwards arrow with extended downwards hook', google translation) - - "": [T: "venstrepil med krok"] # 0xeb5d (en: 'leftwards arrow with extended hook', google translation) - - "": [T: "venstrepil med krok ned"] # 0xeb5e (en: 'leftwards arrow with extended downwards hook', google translation) - - "": [T: "hĂžyrepil med krok"] # 0xeb5f (en: 'rightwards arrow with extended hook', google translation) - - "î­ ": [T: "ikke bĂžlgete hĂžyrepil"] # 0xeb60 (en: 'not right arrow wavy', google translation) - - "î­Ą": [T: "ikke buet hĂžyrepil"] # 0xeb61 (en: 'not right arrow curved', google translation) - - "î­š": [T: "opp-harpun til venstre for vertikal strek"] # 0xeb68 (en: 'upwards harpoon leftwards of vertical bar', google translation) - - "î­©": [T: "ned-harpun til venstre for vertikal strek"] # 0xeb69 (en: 'downwards harpoon leftwards of vertical bar', google translation) - - "î­Ș": [T: "opp-harpun til hĂžyre for vertikal strek"] # 0xeb6a (en: 'upwards harpoon rightwards of vertical bar', google translation) - - "î­«": [T: "ned-harpun til hĂžyre for vertikal strek"] # 0xeb6b (en: 'downwards harpoon rightwards of vertical bar', google translation) - - "î­Ź": [T: "vertikal dobbel pil-forlenger"] # 0xeb6c (en: 'vertical double arrow extender', google translation) - - "î­­": [T: "vertikal harpun med mothake venstre forlenger"] # 0xeb6d (en: 'vertical harpoon with barb left extender', google translation) - - "î­ź": [T: "vertikal harpun med mothake hĂžyre forlenger"] # 0xeb6e (en: 'vertical harpoon with barb right extender', google translation) - - "î­Ż": [T: "hĂžyre-harpun over venstre-harpun hĂžyre"] # 0xeb6f (en: 'right harpoon over left harpoon right', google translation) - - "î­°": [T: "hĂžyre-harpun over venstre-harpun venstre"] # 0xeb70 (en: 'right harpoon over left harpoon left', google translation) - - "î­±": [T: "venstre-harpun over hĂžyre-harpun hĂžyre"] # 0xeb71 (en: 'left harpoon over right harpoon right', google translation) - - "î­Č": [T: "venstre-harpun over hĂžyre-harpun venstre"] # 0xeb72 (en: 'left harpoon over right harpoon left', google translation) - - "î­ł": [T: "venstrepil fra strek pilspiss"] # 0xeb73 (en: 'leftwards arrow from bar arrowhead', google translation) - - "î­Ž": [T: "venstre-hĂžyre-pil fra strek forlenger"] # 0xeb74 (en: 'leftwards rightwards arrow from bar extender', google translation) - - "î­”": [T: "venstrepil fra strek med hale"] # 0xeb75 (en: 'leftwards arrow from bar tail', google translation) - - "î­¶": [T: "hĂžyrepil fra strek med hale"] # 0xeb76 (en: 'rightwards arrow from bar tail', google translation) - - "î­·": [T: "hĂžyrepil fra strek pilspiss"] # 0xeb77 (en: 'rightwards arrow from bar arrowhead', google translation) - - "î­ž": [T: "opp-harpun fra strek med mothake venstre pilspiss"] # 0xeb78 (en: 'upwards harpoon from bar with barb leftwards arrowhead', google translation) - - "î­č": [T: "hĂžyrepil over venstrepil hĂžyre"] # 0xeb79 (en: 'rightwards arrow over leftwards arrow right', google translation) - - "î­ș": [T: "hĂžyrepil over venstrepil venstre"] # 0xeb7a (en: 'rightwards arrow over leftwards arrow left', google translation) - - "î­»": [T: "venstrepil over hĂžyrepil hĂžyre"] # 0xeb7b (en: 'leftwards arrow over rightwards arrow right', google translation) - - "î­Œ": [T: "venstrepil over hĂžyrepil venstre"] # 0xeb7c (en: 'leftwards arrow over rightwards arrow left', google translation) - - "î­œ": [T: "oppoverpil fra strek pilspiss"] # 0xeb7d (en: 'upwards arrow from bar arrowhead', google translation) - - "î­Ÿ": [T: "oppoverpil fra strek hale"] # 0xeb7e (en: 'upwards arrow from bar tail', google translation) - - "î­ż": [T: "nedoverpil fra strek hale"] # 0xeb7f (en: 'downwards arrow from bar tail', google translation) - - "": [T: "nedoverpil fra strek pilspiss"] # 0xeb80 (en: 'downwards arrow from bar arrowhead', google translation) - - "": [T: "ned-harpun fra strek med mothake hĂžyre pilspiss"] # 0xeb81 (en: 'downwards harpoon from bar with barb rightwards arrowhead', google translation) - - "": [T: "opp-harpun til venstre for ned-harpun bunn"] # 0xeb82 (en: 'upwards harpoon to the left of downwards harpoon bottom', google translation) - - "": [T: "opp-harpun til venstre for ned-harpun forlenger"] # 0xeb83 (en: 'upwards harpoon to the left of downwards harpoon extender', google translation) - - "": [T: "ned-harpun til venstre for opp-harpun topp"] # 0xeb84 (en: 'downwards harpoon to the left of upwards harpoon top', google translation) - - "": [T: "opp-harpun til venstre for ned-harpun topp"] # 0xeb85 (en: 'upwards harpoon to the left of downwards harpoon top', google translation) - - "": [T: "ned-harpun til venstre for opp-harpunens forlenger"] # 0xeb86 (en: 'downwards harpoon to the left of the upwards harpoon extender', google translation) - - "": [T: "ned-harpun til venstre for opp-harpunens bunn"] # 0xeb87 (en: 'downwards harpoon to the left of the upwards harpoon bottom', google translation) - - "": [T: "oppoverpil til venstre for nedoverpil bunn"] # 0xeb88 (en: 'upwards arrow leftwards of downwards arrow bottom', google translation) - - "": [T: "nedoverpil til venstre for oppoverpil topp"] # 0xeb89 (en: 'downwards arrow leftwards of upwards arrow top', google translation) - - "": [T: "oppoverpil til venstre for nedoverpil topp"] # 0xeb8a (en: 'upwards arrow leftwards of downwards arrow top', google translation) - - "": [T: "nedoverpil til venstre for oppoverpil bunn"] # 0xeb8b (en: 'downwards arrow leftwards of upwards arrow bottom', google translation) - - "": [T: "venstre-hĂžyre-pil forlenger"] # 0xeb8c (en: 'leftwards rightwards arrows extender', google translation) - - "": [T: "nordĂžst-pil forlenger"] # 0xeb8d (google translation) - - "": [T: "nordvest-pil forlenger"] # 0xeb8e (google translation) - - "": [T: "nedoverpekende krĂžllparentes venstre"] # 0xec00 (en: 'down pointing brace left', google translation) - - "": [T: "nedoverpekende krĂžllparentes midten"] # 0xec01 (en: 'down pointing brace mid', google translation) - - "": [T: "nedoverpekende krĂžllparentes hĂžyre"] # 0xec02 (en: 'down pointing brace right', google translation) - - "": [T: "horisontal krĂžllparentes forlenger"] # 0xec03 (en: 'horizontal brace extender', google translation) - - "": [T: "oppoverpekende krĂžllparentes venstre"] # 0xec04 (en: 'up pointing brace left', google translation) - - "": [T: "oppoverpekende krĂžllparentes midten"] # 0xec05 (en: 'up pointing brace mid', google translation) - - "": [T: "oppoverpekende krĂžllparentes hĂžyre"] # 0xec06 (en: 'up-pointing brace right', google translation) - - "": [T: "venstre vertikal strek"] # 0xec07 (en: 'left vertical bar', google translation) - - "": [T: "hĂžyre vertikal strek"] # 0xec08 (en: 'right vertical bar', google translation) - - "": [T: "venstre dobbel vertikal strek"] # 0xec09 (en: 'left double vertical bar', google translation) - - "": [T: "hĂžyre dobbel vertikal strek"] # 0xec0a (en: 'right double vertical bar', google translation) - - "": [T: "horisontal hakeparentes forlenger"] # 0xec0b (en: 'horizontal bracket extender', google translation) - - "": [T: "under hakeparentes"] # 0xec0c (en: 'under square bracket', google translation) - - "⎔": [T: "under hakeparentes"] # 0x23b5 - - "": [T: "over hakeparentes"] # 0xec0d (en: 'over square bracket', google translation) - - "⎮": [T: "over hakeparentes"] # 0x23b4 - - "": [T: "under hakeparentes venstre"] # 0xec0e (en: 'under bracket left', google translation) - - "": [T: "under hakeparentes hĂžyre"] # 0xec0f (en: 'under bracket right', google translation) - - "": [T: "over hakeparentes venstre"] # 0xec10 (en: 'over bracket left', google translation) - - "": [T: "over hakeparentes hĂžyre"] # 0xec11 (en: 'over bracket right', google translation) - - "": [T: "venstreparentes 1"] # 0xec12 (en: 'left parens 1', google translation) - - "": [T: "venstreparentes 2"] # 0xec13 (en: 'left parens 2', google translation) - - "": [T: "venstreparentes 3"] # 0xec14 (en: 'left parens 3', google translation) - - "": [T: "venstreparentes 4"] # 0xec15 (en: 'left parens 4', google translation) - - "": [T: "hĂžyreparentes 1"] # 0xec16 (en: 'right parens 1', google translation) - - "": [T: "hĂžyreparentes 2"] # 0xec17 (en: 'right parens 2', google translation) - - "": [T: "hĂžyreparentes 3"] # 0xec18 (en: 'right parens 3', google translation) - - "": [T: "hĂžyreparentes 4"] # 0xec19 (en: 'right parens 4', google translation) - - "": [T: "radikal 1"] # 0xec1a (en: 'radical 1', google translation) - - "": [T: "radikal 2"] # 0xec1b (en: 'radical 2', google translation) - - "": [T: "radikal 3"] # 0xec1c (en: 'radical 3', google translation) - - "": [T: "radikal 4"] # 0xec1d (en: 'radical 4', google translation) - - "": [T: "radikal 5"] # 0xec1e (en: 'radical 5', google translation) - - "": [T: "radikal bunn"] # 0xec1f (en: 'radical bottom', google translation) - - "î° ": [T: "radikal vertikal forlenger"] # 0xec20 (en: 'radical vertical extender', google translation) - - "î°Ą": [T: "radikal topp"] # 0xec21 (en: 'radical top', google translation) - - "î°ą": [T: "venstre hvit hakeparentes topp"] # 0xec22 (en: 'left white bracket top', google translation) - - "î°Ł": [T: "venstre hvit hakeparentes forlenger"] # 0xec23 (en: 'left white bracket extender', google translation) - - "î°€": [T: "venstre hvit hakeparentes bunn"] # 0xec24 (en: 'left white bracket bottom', google translation) - - "î°„": [T: "hĂžyre hvit hakeparentes topp"] # 0xec25 (en: 'right white bracket top', google translation) - - "î°Š": [T: "hĂžyre hvit hakeparentes forlenger"] # 0xec26 (en: 'right white bracket extender', google translation) - - "î°§": [T: "hĂžyre hvit hakeparentes bunn"] # 0xec27 (en: 'right white bracket bottom', google translation) - - "î°°": [T: "venstre hvit krĂžllparentes"] # 0xec30 (en: 'left white curly bracket', google translation) - - "î°±": [T: "hĂžyre hvit krĂžllparentes"] # 0xec31 (en: 'right white curly bracket', google translation) - - "î°Č": [T: "lang divisjon"] # 0xec32 (en: 'long division sign', google translation) - - "î°ł": [T: "lang divisjon forlenger"] # 0xec33 (google translation) - - "î°Ž": [T: "kort divisjon"] # 0xec34 (en: 'short division', google translation) - - "": [T: "dobbel sĂžrvest til nordĂžst em-binding"] # 0xec40 (en: 'double southwest to northeast em bond', google translation) - - "": [T: "dobbel nordvest til sĂžrĂžst em-binding"] # 0xec41 (en: 'double northwest to southeast em bond', google translation) - - "": [T: "enkel horisontal em-binding"] # 0xec42 (en: 'single horizontal em bond', google translation) - - "": [T: "dobbel horisontal em-binding"] # 0xec43 (en: 'double horizontal em bond', google translation) - - "": [T: "trippel horisontal em-binding"] # 0xec44 (en: 'triple horizontal em bond', google translation) - - "": [T: "enkel vertikal em-binding"] # 0xec45 (en: 'single vertical em bond', google translation) - - "": [T: "dobbel vertikal em-binding"] # 0xec46 (en: 'double vertical em bond', google translation) - - "": [T: "trippel vertikal em-binding"] # 0xec47 (google translation) - - "": [T: "mindre enn em-binding"] # 0xec48 (en: 'less than em bond', google translation) - - "": [T: "stĂžrre enn em-binding"] # 0xec49 (en: 'greater than em bond', google translation) - - "": [T: "enkel horisontal en-binding"] # 0xec4a (en: 'single horizontal en bond', google translation) - - "": [T: "dobbel horisontal en-binding"] # 0xec4b (en: 'double horizontal en bond', google translation) - - "": [T: "trippel horisontal en-binding"] # 0xec4c (en: 'triple horizontal en bond', google translation) - - "îȀ": [T: "Ăžvre venstre rektangel"] # 0xec80 (en: 'top left rectangle', google translation) - - "îȁ": [T: "nedre venstre rektangel"] # 0xec81 (en: 'bottom left rectangle', google translation) - - "îȐ": [T: "Ăžvre hĂžyre rektangel"] # 0xec90 (en: 'top right rectangle', google translation) - - "îȑ": [T: "nedre hĂžyre rektangel"] # 0xec91 (en: 'bottom right rectangle', google translation) - - "îȒ": [T: "syntetisk divisjon hjĂžrne"] # 0xec92 (en: 'synthetic division corner', google translation) - - "îȓ": [T: "syntetisk divisjon horisontal forlenger"] # 0xec93 (en: 'synthetic division horizontal extender', google translation) - - "îȔ": [T: "syntetisk divisjon vertikal forlenger"] # 0xec94 (en: 'synthetic division vertical extender', google translation) - - "îȕ": [T: "venstre tak gulv forlenger"] # 0xec95 (en: 'left ceiling floor extender', google translation) - - "îȖ": [T: "hĂžyre tak gulv forlenger"] # 0xec96 (en: 'right ceiling floor extender', google translation) - - "îȗ": [T: "over hakeparentes forlenger"] # 0xec97 (en: 'over bracket extender', google translation) - - "îȘ": [T: "vertikal strek forlenger"] # 0xec98 (en: 'vertical bar extender', google translation) - - "îș": [T: "venstre dobbel vertikal strek forlenger"] # 0xec99 (en: 'left double vertical bar extender', google translation) - - "îȚ": [T: "horisontal strek forlenger"] # 0xec9a (en: 'horizontal bar extender', google translation) - - "îȜ": [T: "under hakeparentes forlenger"] # 0xec9c (en: 'under bracket extender', google translation) - - "îȝ": [T: "nedoverpekende parentes hĂžyre"] # 0xec9d (en: 'down pointing paren right', google translation) - - "îȞ": [T: "nedoverpekende parentes forlenger"] # 0xec9e (en: 'down pointing paren extender', google translation) - - "îȟ": [T: "nedoverpekende parentes venstre"] # 0xec9f (en: 'down pointing paren left', google translation) - - "îČ ": [T: "oppoverpekende krĂžllparentes forlenger"] # 0xeca0 (en: 'up pointing brace extender', google translation) - - "îČĄ": [T: "oppoverpekende parentes venstre"] # 0xeca1 (en: 'up pointing paren left', google translation) - - "îČą": [T: "oppoverpekende parentes forlenger"] # 0xeca2 (en: 'up pointing paren extender', google translation) - - "îČŁ": [T: "oppoverpekende parentes hĂžyre"] # 0xeca3 (en: 'up pointing paren right', google translation) - - "îČ€": [T: "nedoverpekende krĂžllparentes forlenger"] # 0xeca4 (en: 'down pointing brace extender', google translation) - - "": [T: "plancks konstant over to pi strek"] # 0xed00 (en: 'planck constant over two pi bar', google translation) - - "": [T: "speilvendt g"] # 0xed01 (en: 'mirror g', google translation) - - "": [T: "j uten prikk"] # 0xed02 (google translation) - - "": [T: "digamma"] # 0xed03 (google translation) - - "ϝ": [T: "digamma"] # 0x3dd - - "": [t: ""] # 0xed10 (en: 'd', google translation) - - "": [t: ""] # 0xed11 (en: 'e', google translation) - - "": [t: ""] # 0xed12 (en: 'i', google translation) - - "": [T: ""] # 0xed13 (en: 'j', google translation) - - "ⅅ": - - SPELL: "translate('.', 'ⅅ', 'DD')" # 0xed16, 0x2145 - -# The private use chars are from MathType - - "": [T: "kurveintegral-loop mot klokka"] # 0xee00 (en: 'anticlockwise contour integral loop', google translation) - - "": [T: "kurveintegral-loop med klokka"] # 0xee01 (en: 'clockwise contour integral loop', google translation) - - "": [T: ""] # 0xee04 - - "": [T: ""] # 0xee05 - - "": [T: ""] # 0xee06 - - "": [T: ""] # 0xee07 - - "": [T: ""] # 0xee08 - - "": [T: ""] # 0xee09 - - "": [T: ""] # 0xee0a - - "": [T: ""] # 0xee0b - - "": [T: ""] # 0xee0c - - "": [T: "joint status"] # 0xee0d (en: 'joint status embellishment', google translation) - - "": [T: "joint status venstre"] # 0xee0e (en: 'joint status embellishment left', google translation) - - "": [T: "joint status hĂžyre"] # 0xee0f (en: 'joint status embellishment right', google translation) - - "": [T: "joint status forlenger"] # 0xee10 (en: 'joint status embellishment extender', google translation) - - "": [T: "integral-loop"] # 0xee11 (en: 'integral loop', google translation) - - "": [T: "dobbel integral-loop"] # 0xee12 (google translation) - - "": [T: "trippel integral-loop"] # 0xee13 (en: 'integral loop triple', google translation) - - "": [T: "ekspanderende dobbel integral-loop"] # 0xee15 (google translation) - - "": [T: "ekspanderende trippel integral-loop"] # 0xee16 (en: 'expanding integral loop triple', google translation) - - "": [T: "asymptotisk lik"] # 0xee17 (en: 'asymptotically equal to accent', google translation) - - "": [T: "lik"] # 0xee18 (en: 'equal sign accent', google translation) - - "": [T: "kvadrupelt primtegn"] # 0xee19 (en: 'quadruple prime', google translation) - - "": [T: "strek med Ă„pen sirkel venstre"] # 0xee1a (en: 'bar accent with open circle left', google translation) - - "": [T: "strek med lukket sirkel venstre"] # 0xee1b (en: 'bar accent with closed circle left', google translation) - - "": [T: "strek med Ă„pen sirkel hĂžyre"] # 0xee1c (en: 'bar accent with open circle right', google translation) - - "": [T: "strek med prikk"] # 0xee1d (en: 'bar accent with over dot', google translation) - - "": [T: "strek over prikk"] # 0xee1e (en: 'bar accent with under dot', google translation) - - "": [T: "strek med dobbel prikk over"] # 0xee1f (en: 'bar accent with double over dot', google translation) - - "îž ": [T: "strek over dobbel prikk"] # 0xee20 (en: 'bar accent with double under dot', google translation) - - "": [T: "strek med hatt"] # 0xee21 (en: 'bar accent with caret', google translation) - - "îžą": [T: "fet understrek"] # 0xee22 (en: 'thick under bar accent', google translation) - - "": [T: "strek med lukket sirkel hĂžyre"] # 0xee23 (en: 'bar accent with closed circle right', google translation) - - "": [T: "stor prikk"] # 0xee24 (en: 'large dot above', google translation) - - "": [T: "justeringsmerke"] # 0xef00 (en: 'alignment mark', google translation) - - "": [T: ""] # 0xef01 - - "​": [T: ""] # 0x200b - - "": [T: ""] # 0xef02 - - " ": [T: ""] # 0x2009 - - "": [T: ""] # 0xef03 - - " ": [T: ""] # 0x205f - - "": [T: ""] # 0xef04 - - "": [T: ""] # 0xef05 - - "": [T: ""] # 0xef06 - - "": [T: ""] # 0xef07 - - "": [T: ""] # 0xef08 - - "": [T: ""] # 0xef09 - - "": [T: ""] # 0xef0a - - " ": [T: ""] # 0x200a - - "îŒą": [T: ""] # 0xef22 - - "îŒŁ": [T: ""] # 0xef23 - - "": [T: ""] # 0xef24 - - "": [T: ""] # 0xef29 - - "": [T: "savnet begrep"] # 0xef41 (en: 'missing term', google translation) - - "": [T: "kurveintegral med klokka pil til venstre"] # 0xef80 (en: 'clockwise contour integral arrow on left', google translation) - - "": [T: "integral med kvadrat"] # 0xef81 (en: 'integral with square', google translation) - - "": [T: "integral med skrĂ„strek"] # 0xef82 (en: 'integral with slash', google translation) - - "": [T: "speilvendt integral"] # 0xef83 (en: 'reversed integral', google translation) - - "": [T: "dobbel null over dobbel null"] # 0xef90 (en: 'double zero over double zero', google translation) - - "": [T: "null med skrĂ„strek"] # 0xef91 (en: 'zero with slash', google translation) - #------------------------------------------------------------------------------------------------------------- - # fraktur 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) - - T: "fraktur" # (google translation) - - SPELL: "translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" - - "-": # 0xf000 - 0xf018 - - T: "fraktur" # (google translation) - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" - - - "𝔞-đ”·": # 0x1d51e - 0x1d537 - - T: "fraktur" # (google translation) - - SPELL: "translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz')" - - "-ï€ł": # 0xf01a - 0xf033 - - T: "fraktur" # (google translation) - - SPELL: "translate('.', 'ï€šï€›ï€œï€ï€žï€Ÿï€ ï€Ąï€ąï€Łï€€ï€„ï€Šï€§ï€šï€©ï€Șï€«ï€Źï€­ï€źï€Żï€°ï€±ï€Čï€ł', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝕬-𝖅": # 0x1D56C - 0x1D585 - - T: "fraktur" # (google translation) - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf040 - 0xf059 - - T: "fraktur" # (google translation) - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝖆-𝖟": # 0x1d586 - 0x1d59f - - T: "fraktur" # (google translation) - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" - - "-ïł": # 0xf05a - 0xf073 - - T: "fraktur" # (google translation) - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - 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) - - T: "dobbeltstreket" # (en: 'double struck', google translation) - - SPELL: "translate('.', '𝔾đ”čđ”șđ”»đ”Œđ”œđ”Ÿđ”żđ•€đ•đ•‚đ•ƒđ•„đ•…đ•†đ•‡đ•ˆđ•‰đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf080 - 0xf098 - - T: "dobbeltstreket" # (en: 'double struck', google translation) - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝕒-đ•«": # 0x1d552 - 0x1d56b - - T: "dobbeltstreket" # (en: 'double struck', google translation) - - SPELL: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" - - - "-ï‚ł": # 0xf09a - 0xf0b3 - - T: "dobbeltstreket" # (en: 'double struck', google translation) - - SPELL: "translate('.', 'ï‚šï‚›ï‚œï‚ï‚žï‚Ÿï‚ ï‚Ąï‚ąï‚Łï‚€ï‚„ï‚Šï‚§ï‚šï‚©ï‚Șï‚«ï‚Źï‚­ï‚źï‚Żï‚°ï‚±ï‚Čï‚ł', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 - - T: "dobbeltstreket" # (en: 'double struck', google translation) - - SPELL: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" - - "-": # 0xf0c0 - 0xf0c9 - - T: "dobbeltstreket" # (en: 'double struck', google translation) - - SPELL: "translate('.', '', '0123456789')" - - - "": [T: "dobbeltstreket nabla"] # 0xf0ca (en: 'double struck nabla', google translation) - - "": [T: "dobbeltstreket eulerkonstant"] # 0xf0cb (en: 'double struck euler constant', google translation) - - # script chars in math alphabetic block and also MathType private use area - # SWEDISH: We've used "skrivstilt" instead of skript for clarity - # NORWEGIAN: Used "script font" - - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 - - T: "script font" # (en: 'script', google translation) - - SPELL: "translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf100 - 0xf119 - - T: "script font" # (en: 'script', google translation) - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf - - T: "script font" # (en: 'script', google translation) - - SPELL: "translate('.', 'đ’¶đ’·đ’žđ’čđ’șđ’»đ’Œđ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“„đ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdefghijklmnopqrstuvwxyz')" - - - "-ï„ł": # 0xf11a - 0xf133 - - T: "script font" # (en: 'script', google translation) - - SPELL: "translate('.', 'ï„šï„›ï„œï„ï„žï„Ÿï„ ï„Ąï„ąï„Łï„€ï„„ï„Šï„§ï„šï„©ï„Șï„«ï„Źï„­ï„źï„Żï„°ï„±ï„Čï„ł', 'abcdefghijklmnopqrstuvwxyz')" - - # bold script chars in math alphabetic block and also MathType private use area - - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 - - T: "script font" # (en: 'script bold', google translation) - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf140 - 0xf159 - - T: "script font" # (en: 'script bold', google translation) - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "đ“Ș-𝔃": # 0x1d4ea - 0x1d503 - - T: "script font" # (en: 'script bold', google translation) - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz')" - - - "-ï…ł": # 0xf15a - 0xf173 - - T: "script font" # (en: 'script bold', google translation) - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ï…šï…›ï…œï…ï…žï…Ÿï… ï…Ąï…ąï…Łï…€ï…„ï…Šï…§ï…šï…©ï…Șï…«ï…Źï…­ï…źï…Żï…°ï…±ï…Čï…ł', 'abcdefghijklmnopqrstuvwxyz')" - - - "-": # 0xf180 - 0xf199 - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "": # 0xf19a - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "stor"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [T: "ligatur a e"] # (en: 'ligature ae', google translation) - - "": # 0xf19b - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "stor"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [T: "dobbel s"] # (en: 'sharp s', google translation) - - "": # 0xf19c - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "stor"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [T: "Ăž"] # (en: 'o with stroke', google translation) - - # MathType only has a few of the cap Greek letters in PUA - - "": # 0xf201 - 0xf209 - - T: "dobbeltstreket" # (en: 'double struck', google translation) - - SPELL: "translate('.', '', 'Î”ÎšÎ›Î ÎŁÎ˜Î“Î©Î„')" - - - "-": # 0xf220 - 0xf236 - - T: "dobbeltstreket" # (en: 'double struck', google translation) - - SPELL: "translate('.', 'ïˆ ïˆĄïˆąïˆŁïˆ€ïˆ„ïˆŠïˆ§ïˆšïˆ©ïˆȘïˆ«ïˆŹïˆ­ïˆźïˆŻïˆ°ïˆ±ïˆČïˆłïˆŽïˆ”ïˆ¶', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "": [T: "dobbeltstreket sluttsigma"] # 0xf237 (en: 'double struck final sigma', google translation) - - "": [T: "dobbeltstreket rho"] # 0xf250 (en: 'double struck rho', google translation) - - "": [T: "dobbeltstreket fi"] # 0xf251 (en: 'double struck phi', google translation) - - "𝐀-𝐙": # 0x1d400 - 0x1d419 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-ï‰č": # 0xf260 - 0xf279 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ï‰ ï‰Ąï‰ąï‰Łï‰€ï‰„ï‰Šï‰§ï‰šï‰©ï‰Șï‰«ï‰Źï‰­ï‰źï‰Żï‰°ï‰±ï‰Čï‰łï‰Žï‰”ï‰¶ï‰·ï‰žï‰č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝐚-𝐳": # 0x1d41a - 0x1d433 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" - - - "ï‰ș-": # 0xf27a - 0xf293 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ï‰șï‰»ï‰Œï‰œï‰Ÿï‰żïŠ€ïŠïŠ‚ïŠƒïŠ„ïŠ…ïŠ†ïŠ‡ïŠˆïŠ‰ïŠŠïŠ‹ïŠŒïŠïŠŽïŠïŠïŠ‘ïŠ’ïŠ“', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝐮-𝑍": # 0x1d434 - 0x1d44d - - SPELL: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf294 - 0xf2ad - - SPELL: "translate('.', 'ïŠ”ïŠ•ïŠ–ïŠ—ïŠ˜ïŠ™ïŠšïŠ›ïŠœïŠïŠžïŠŸïŠ ïŠĄïŠąïŠŁïŠ€ïŠ„ïŠŠïŠ§ïŠšïŠ©ïŠȘïŠ«ïŠŹïŠ­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝑎-𝑧": # 0x1d44e - 0x1d467 - - SPELL: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”đ‘•đ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" - - - "ïŠź-": # 0xf2ae - 0xf2c7 - - SPELL: "translate('.', 'ïŠźïŠŻïŠ°ïŠ±ïŠČïŠłïŠŽïŠ”ïŠ¶ïŠ·ïŠžïŠčïŠșïŠ»ïŠŒïŠœïŠŸïŠżï‹€ï‹ï‹‚ï‹ƒï‹„ï‹…ï‹†ï‹‡', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝑹-𝒁": # 0x1d468 - 0x1d481 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-ï‹Ą": # 0xf2c8 - 0xf2e1 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ï‹ˆï‹‰ï‹Šï‹‹ï‹Œï‹ï‹Žï‹ï‹ï‹‘ï‹’ï‹“ï‹”ï‹•ï‹–ï‹—ï‹˜ï‹™ï‹šï‹›ï‹œï‹ï‹žï‹Ÿï‹ ï‹Ą', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝒂-𝒛": # 0x1d482 - 0x1d49b - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" - - - "ï‹ą-": # 0xf2e2 - 0xf2fb - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ï‹ąï‹Łï‹€ï‹„ï‹Šï‹§ï‹šï‹©ï‹Șï‹«ï‹Źï‹­ï‹źï‹Żï‹°ï‹±ï‹Čï‹łï‹Žï‹”ï‹¶ï‹·ï‹žï‹čï‹ș', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 - - SPELL: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf300 - 0xf319 - - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 - - SPELL: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" - - - "-ïŒł": # 0xf31a - 0xf333 - - SPELL: "translate('.', 'ïŒšïŒ›ïŒœïŒïŒžïŒŸïŒ ïŒĄïŒąïŒŁïŒ€ïŒ„ïŒŠïŒ§ïŒšïŒ©ïŒȘïŒ«ïŒŹïŒ­ïŒźïŒŻïŒ°ïŒ±ïŒČïŒł', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf334 - 0xf34d - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ïŒčïŒșïŒ»ïŒŒïŒœïŒŸïŒżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒï', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝗼-𝘇": # 0x1d5ee - 0x1d607 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" - - - "-": # 0xf34e - 0xf367 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ïŽïïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§', 'abcdefghijklmnopqrstuvwxyz')" - - "𝘈-𝘡": # 0x1d608 - 0x1d621 - - SPELL: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - "-": # 0xf368 - 0xf381 - - SPELL: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżïŽ€ïŽ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝘱-đ˜»": # 0x1d622 - 0x1d63b - - SPELL: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" - - - "-": # 0xf382 - 0xf39b - - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - - - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf39c - 0xf3b5 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ïŽœïŽïŽžïŽŸïŽ ïŽĄïŽąïŽŁïŽ€ïŽ„ïŽŠïŽ§ïŽšïŽ©ïŽȘïŽ«ïŽŹïŽ­ïŽźïŽŻïŽ°ïŽ±ïŽČïŽłïŽŽïŽ”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝙖-𝙯": # 0x1d656 - 0x1d66f - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" - - - "-": # 0xf3b6 - 0xf3cf - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ïŽčïŽșïŽ»ïŽŒïŽœïŽŸïŽżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒïïŽï', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝙰-𝚉": # 0x1d670 - 0x1d689 - - SPELL: "translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf3d0 - 0xf3e9 - - SPELL: "translate('.', 'ïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§ïšï©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝚊-𝚣": # 0x1d68a - 0x1d6a3 - - SPELL: "translate('.', '𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚱𝚣', 'abcdefghijklmnopqrstuvwxyz')" - - - "ïȘ-": # 0xf3ea - 0xf403 - - SPELL: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżï€ïï‚ïƒ', 'abcdefghijklmnopqrstuvwxyz')" - - - "": [T: "i uten prikk"] # 0xf404 (google translation) - - "đš€": [T: "kursiv i uten prikk"] # 0x1d6a4 (en: 'dotless i', google: 'dotless i') - - "đš„": [T: "kursiv j uten prikk"] # 0x1d6a5 (en: 'dotless j', google: 'dotless j') - - - "𝚹-𝛀": # 0x1d6a8 - 0x1d6c0 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "-": # 0xf408 - 0xf420 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "𝛂-𝛚": # 0x1d6c2 - 0x1d6da - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙𝛚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "ïą-ïș": # 0xf422 - 0xf43a - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ïąïŁï€ï„ïŠï§ïšï©ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïș', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "ïĄ": [T: "fet nabla"] # 0xf421 (en: 'bold nabla', google translation) - - "𝛁": [T: "fet nabla"] # 0x1d6c1 (en: 'bold nabla', google translation) - - - "𝛛𝛜𝛝𝛞𝛟𝛠𝛡": # 0x1D6DB - 0x1D6E1 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', '𝛛𝛜𝛝𝛞𝛟𝛠𝛡', '∂ΔΞÎșφρπ')" - - - "ï»ïŒïœïŸïżï‘€ï‘": # 0xF43C - 0xF441 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ï»ïŒïœïŸïżï‘€ï‘', '∂ΔΞÎșφρπ')" - - - "𝛱-đ›ș": # 0x1d6e2 - 0x1d6fa - - SPELL: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›čđ›ș', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "-": # 0xf442 - 0xf45a - - SPELL: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "đ›Œ-𝜔": # 0x1d6fc - 0x1d714 - - SPELL: "translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“đœ”', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "-": # 0xf45c - 0xf474 - - SPELL: "translate('.', 'ï‘œï‘ï‘žï‘Ÿï‘ ï‘Ąï‘ąï‘Łï‘€ï‘„ï‘Šï‘§ï‘šï‘©ï‘Șï‘«ï‘Źï‘­ï‘źï‘Żï‘°ï‘±ï‘Čï‘łï‘Ž', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "": [T: "kursiv nabla"] # 0xf45b (en: 'italic nabla', google translation) - - "đ›»": [T: "kursiv nabla"] # 0x1d6fb (en: 'italic nabla', google translation) - - - "𝜕𝜖𝜗𝜘𝜙𝜚𝜛": # 0x1d715 - 0x1d71b - - SPELL: "translate('.', '𝜕𝜖𝜗𝜘𝜙𝜚𝜛', '∂ΔΞÎșφρπ')" - - - "ï‘čï‘ș": # 0xf475 - 0xf47b - - SPELL: "translate('.', 'ï‘čï‘ș', '∂ΔΞÎșφρπ')" - - - "𝜜-𝜮": # 0x1d71c - 0x1d734 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳𝜮', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "-": # 0xf47c - 0xf494 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ï‘Œï‘œï‘Ÿï‘żï’€ï’ï’‚ï’ƒï’„ï’…ï’†ï’‡ï’ˆï’‰ï’Šï’‹ï’Œï’ï’Žï’ï’ï’‘ï’’ï’“ï’”', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "đœ¶-𝝎": # 0x1d736 - 0x1d74e - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđđŽ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "-ï’ź": # 0xf496 - 0xf4ae - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ï’–ï’—ï’˜ï’™ï’šï’›ï’œï’ï’žï’Ÿï’ ï’Ąï’ąï’Łï’€ï’„ï’Šï’§ï’šï’©ï’Șï’«ï’Źï’­ï’ź', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "𝝏𝝐𝝑𝝒𝝓𝝔𝝕": # 0x1d74f - 0x1d755 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', '𝝏𝝐𝝑𝝒𝝓𝝔𝝕', '∂ΔΞÎșφρπ')" - - - "ï’Żï’°ï’±ï’Čï’łï’Žï’”": # 0xf422 - 0xf43a - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ï’Żï’°ï’±ï’Čï’łï’Žï’”', '∂ΔΞÎșφρπ')" - - - "đœ”": [T: "fet kursiv nabla"] # 0x1d735 (en: 'bold italic nabla', google translation) - - "": [T: "fet kursiv nabla"] # 0xf495 (en: 'bold italic nabla', google translation) - - - "𝝖-𝝼": # 0x1d756 - 0x1d76e - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đź', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - "-": # 0xf4b6 - 0xf4ce - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ï’¶ï’·ï’žï’čï’șï’»ï’Œï’œï’Ÿï’żï“€ï“ï“‚ï“ƒï“„ï“…ï“†ï“‡ï“ˆï“‰ï“Šï“‹ï“Œï“ï“Ž', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "𝝰-𝞈": # 0x1d770 - 0x1d788 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€đžđž‚đžƒđž„đž…đž†đž‡đžˆ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "-": # 0xf4d0 - 0xf4e8 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ï“ï“‘ï“’ï““ï“”ï“•ï“–ï“—ï“˜ï“™ï“šï“›ï“œï“ï“žï“Ÿï“ ï“Ąï“ąï“Łï“€ï“„ï“Šï“§ï“š', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "𝞉𝞊𝞋𝞌𝞍𝞎𝞏": # 0x1d789 - 0x1d78f - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', '𝞉𝞊𝞋𝞌𝞍𝞎𝞏', '∂ΔΞÎșφρπ')" - - - "ï“Șï“«ï“Źï“­ï“źï“Ż": # 0xf4e9 - 0xf4ef - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ï“Șï“«ï“Źï“­ï“źï“Ż', '∂ΔΞÎșφρπ')" - - - "": [T: "fet nabla"] # 0xf4cf (en: 'bold nabla', google translation) - - "𝝯": [T: "fet nabla"] # 0x1d76f (en: 'bold nabla', google translation) - - - "𝞐-𝞹": # 0x1d790 - 0x1d7a8 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "-": # 0xf4f0 - 0xf508 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ï“Čï“łï“Žï“”ï“¶ï“·ï“žï“čï“șï“»ï“Œï“œï“Ÿï“żï”€ï”ï”‚ï”ƒï”„ï”…ï”†ï”‡ï”ˆ', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "đžȘ-𝟂": # 0x1d7aa - 0x1d7c2 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸđŸ‚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "-ï”ą": # 0xf50a - 0xf522 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ï”Šï”‹ï”Œï”ï”Žï”ï”ï”‘ï”’ï”“ï””ï”•ï”–ï”—ï”˜ï”™ï”šï”›ï”œï”ï”žï”Ÿï” ï”Ąï”ą', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "𝟃𝟄𝟅𝟆𝟇𝟈𝟉": # 0x1d7c3 - 0x1d7c9 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', '𝟃𝟄𝟅𝟆𝟇𝟈𝟉', '∂ΔΞÎșφρπ')" - - - "ï”Łï”€ï”„ï”Šï”§ï”šï”©": # 0xf523 - 0xf529 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ï”Łï”€ï”„ï”Šï”§ï”šï”©', '∂ΔΞÎșφρπ')" - - - "": [T: "fet nabla"] # 0xf509 (en: 'bold nabla', google translation) - - "đž©": [T: "fet nabla"] # 0x1d7a9 (en: 'bold nabla', google translation) - - - "ï”ź-": # 0xf52e - 0xf537 (old MathType) - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'ï”źï”Żï”°ï”±ï”Čï”łï”Žï””ï”¶ï”·', '0123456789')" - - - "𝟎-𝟗": # 0x1d7ce - 0x1d7d7 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', '𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗', '0123456789')" - - - "-": # 0xf542 - 0xf54b (old MathType) - - SPELL: "translate('.', '', '0123456789')" - - - "𝟱-đŸ«": # 0x1d7e2 - 0x1d7eb (old MathType) - - SPELL: "translate('.', 'đŸąđŸŁđŸ€đŸ„đŸŠđŸ§đŸšđŸ©đŸȘđŸ«', '0123456789')" - - - "-": # 0xf54c - 0xf555 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', '', '0123456789')" - - - "𝟬-đŸ”": # 0x1d7ec - 0x1d7f5 - - test: - if: "not($IgnoreBold)" - then: [T: "fet"] - - SPELL: "translate('.', 'đŸŹđŸ­đŸźđŸŻđŸ°đŸ±đŸČđŸłđŸŽđŸ”', '0123456789')" - - - "-": # 0xf556 - 0xf55f (old MathType) - - SPELL: "translate('.', '', '0123456789')" - - - "đŸ¶-𝟿": # 0x1d7f6 - 0x1d7ff - - SPELL: "translate('.', 'đŸ¶đŸ·đŸžđŸčđŸșđŸ»đŸŒđŸœđŸŸđŸż', '0123456789')" - - - "": [T: "ukjent tegn"] # 0xf700 (en: 'unknown character', google translation) - - "": [T: "nedre hĂžyre og nedre venstre trekanter"] # 0xf726 (en: 'lower right and lower left triangles', google translation) - - "": [T: "horisontal ellipse forlenger"] # 0xf72d (en: 'horizontal ellipsis extender', google translation) - - "ïœź": [T: "midtlinje horisontal ellipse forlenger"] # 0xf72e (en: 'midline horizontal ellipsis extender', google translation) - - "ïŁ„": [T: "radikal forlenger"] # 0xf8e5 (en: 'radical extender', google translation) - - "ïŁŠ": [T: "vertikal pil-forlenger"] # 0xf8e6 (en: 'vertical arrow extender', google translation) - - "ïŁ§": [T: "horisontal pil-forlenger"] # 0xf8e7 (en: 'horizontal arrow extender', google translation) - - "ïŁš": [T: "registrert"] # 0xf8e8 (en: 'registered sign sans serif', google translation) - - "ïŁ©": [T: "opphavsrett"] # 0xf8e9 (google translation) - - "ïŁȘ": [T: "varemerke"] # 0xf8ea (google translation) - - "ïŁ«": [T: "venstreparentes topp"] # 0xf8eb (en: 'left paren top', google translation) - - "ïŁŹ": [T: "venstreparentes forlenger"] # 0xf8ec (en: 'left paren extender', google translation) - - "ïŁ­": [T: "venstreparentes bunn"] # 0xf8ed (en: 'left paren bottom', google translation) - - "ïŁź": [T: "venstre hakeparentes topp"] # 0xf8ee (en: 'left bracket top', google translation) - - "ïŁŻ": [T: "venstre hakeparentes forlenger"] # 0xf8ef (en: 'left bracket extender', google translation) - - "ïŁ°": [T: "venstre hakeparentes bunn"] # 0xf8f0 (en: 'left bracket bottom', google translation) - - "ïŁ±": [T: "venstre krĂžllparentes topp"] # 0xf8f1 (en: 'left brace top', google translation) - - "ïŁČ": [T: "venstre krĂžllparentes midten"] # 0xf8f2 (en: 'left brace mid', google translation) - - "ïŁł": [T: "venstre krĂžllparentes bunn"] # 0xf8f3 (en: 'left brace bottom', google translation) - - "ïŁŽ": [T: "krĂžllparentes forlenger"] # 0xf8f4 (en: 'brace extender', google translation) - - "ïŁ”": [T: "integral forlenger"] # 0xf8f5 (en: 'integral extender', google translation) - - "ïŁ¶": [T: "hĂžyreparentes topp"] # 0xf8f6 (en: 'right paren top', google translation) - - "ïŁ·": [T: "hĂžyreparentes forlenger"] # 0xf8f7 (en: 'right paren extender', google translation) - - "ïŁž": [T: "hĂžyreparentes bunn"] # 0xf8f8 (en: 'right paren bottom', google translation) - - "ïŁč": [T: "hĂžyre hakeparentes topp"] # 0xf8f9 (en: 'right bracket top', google translation) - - "ïŁș": [T: "hĂžyre hakeparentes forlenger"] # 0xf8fa (en: 'right bracket extender', google translation) - - "ïŁ»": [T: "hĂžyre hakeparentes bunn"] # 0xf8fb (en: 'right bracket bottom', google translation) - - "ïŁŒ": [T: "hĂžyre krĂžllparentes topp"] # 0xf8fc (en: 'right brace top', google translation) - - "ïŁœ": [T: "hĂžyre krĂžllparentes midten"] # 0xf8fd (en: 'right brace mid', google translation) - - "ïŁŸ": [T: "hĂžyre krĂžllparentes bunn"] # 0xf8fe (en: 'right brace bottom', google translation) - - "ïŁż": [T: "apple logo"] # 0xf8ff (en: 'apple logo', google translation) - #-------------------------------------------------------------------------------------------------------------- - #Alphabetic presentation forms - - "ïŹ€": [T: "f f"] # 0xfb00 (en: 'ff', google: 'ff') - - "ïŹ": [T: "f i"] # 0xfb01 (en: 'fi', google: 'fi') - - "ïŹ‚": [T: "f l"] # 0xfb02 (en: 'fl', google: 'fl') - - "ïŹƒ": [T: "f f i"] # 0xfb03 (en: 'ffi', google: 'ffi') - - "ïŹ„": [T: "f f l"] # 0xfb04 (en: 'ffl', google: 'ffl') - - "ïŹ…": [T: "f t"] # 0xfb05 (en: 'ft', google translation) - - "ïŹ†": [T: "s t"] # 0xfb06 (google translation) - - "ïŹ©": [T: "hebraisk bokstav alternativ pluss"] # 0xfb29 - #------------------------------------------------------------------------------------------------------------------ - # Combining half marks - - "ïž ": [T: "ligatur venstre halvdel"] # 0xfe20 (en: 'ligature left half embellishment', google translation) - - "ïžĄ": [T: "ligatur hĂžyre halvdel"] # 0xfe21 (en: 'ligature right half embellishment', google translation) - - "ïžą": [T: "dobbel tilde venstre halvdel"] # 0xfe22 (en: 'double tilde left half embellishment', google translation) - - "ïžŁ": [T: "dobbel tilde hĂžyre halvdel"] # 0xfe23 (en: 'double tilde right half embellishment', google translation) - - "": [T: "makron venstre halvdel"] # 0xfe24 (en: 'macron left half embellishment', google translation) - - "ïž„": [T: "makron hĂžyre halvdel"] # 0xfe25 (en: 'macron right half embellishment', google translation) - - "": [T: "sammenkoblet makron"] # 0xfe26 (en: 'conjoining macron embellishment', google translation) - #----------------------------------------------------------------------------------------------------------------- - #CJK compatibility forms - - "ïž”": [T: "parentes over"] # 0xfe35 - - "ïž¶": [T: "parentes under"] # 0xfe36 - - "ïž·": [T: "krĂžllparentes over"] # 0xfe37 (en: 'over brace') - - "ïžž": [T: "krĂžllparentes under"] # 0xfe38 (en: 'under brace') - - "ïžż": [T: "vinkelparentes over"] # 0xfe3f - - "ïč€": [T: "vinkelparentes under"] # 0xfe40 -#------------------------------------------------------------------------------------------------------------------ -#Halfwidth and Fullwidth forms - - "ïčĄ": [T: "liten asterisk"] # 0xfe61 - - "ïčą": [T: "liten pluss"] # 0xfe62 - - "ïčŁ": [T: "liten minus"] # 0xfe63 - - "ïč€": [T: "liten mindre enn"] # 0xfe64 - - "ïč„": [T: "liten stĂžrre enn"] # 0xfe65 - - "ïčŠ": [T: "lite likhetstegn"] # 0xfe66 - - "": [T: "pluss"] # 0xff0b - - "": [T: "mindre enn"] # 0xff1c - - "": [T: "lik"] # 0xff1d - - "": [T: "stĂžrre enn"] # 0xff1e - - "": [T: "omvendt skrĂ„strek"] # 0xff3c - - "": [T: "hatt"] # 0xff3e - - "": # 0xff5c - # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' - - with: - variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) - replace: - - test: - - if: "$SpeechStyle != 'ClearSpeak'" - then_test: - if: "$DefaultToGiven" - then: [pause: short, T: "gitt"] - else: [T: "vertikal strek"] - - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" - then: [T: "vertikal strek"] - - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" - then: [T: "slik at"] - - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" - then: [pause: short, T: "gitt"] - - else: [T: "deler"] - - "": [T: "tilde"] # 0xff5e - - "ïżą": [T: "ikke"] # 0xffe2 - - "ïż©": [T: "venstrepil"] # 0xffe9 - - "ïżȘ": [T: "oppoverpil"] # 0xffea - - "ïż«": [T: "hĂžyrepil"] # 0xffeb - - "ïżŹ": [T: "nedoverpil"] # 0xffec - #-------------------------------------------------------------------------------------------------------------------- - #Small form variants - - "ïčš": [T: "liten speilvendt skrĂ„strek"] # 0xfe68 - #--------------------------------------------------------------------------------------------------------------------- - #Specials - - "ïżŒ": [T: "ukjent eller savnet objekt"] # 0xfffc (en: 'unknown or missing object', google translation) - - "ïżœ": [T: "ukjent eller savnet tegn"] # 0xfffd (google: 'okĂ€nd eller saknad karaktĂ€r') - - - "🣑": [T: "er i likevekt med"] # 0x1F8D1 - - "🣒": [T: "er i likevekt, forskjĂžvet mot hĂžyre, med"] # 0x1F8D2 - - "🣓": [T: "er i likevekt, forskjĂžvet mot venstre, med"] # 0x1F8D3 - -# MathJax v4 has adopted these PUA values for some partial chem bonds that aren't in Unicode - - "\uE410": [T: "delvis enkeltbinding"] # 0xe410 - - "\uE411": [T: "delvis dobbeltbinding"] # 0xe411 - - "\uE412": [T: "delvis trippelbinding"] # 0xe412 - -# MathJax v4 also adopted these PUA values for some arrows thar are in Unicode -# Hopefully these will be exported properly in future versions of MathJax - - "\uE428": [SPELL: "'⟔'"] # 0xe428 defer to def of arrow - - "\uE429": [SPELL: "'⟶'"] # 0xe429 defer to def of arrow - - "\uE42A": [SPELL: "'⟷'"] # 0xe42a defer to def of arrow - - "\uE408": [SPELL: "'🣑'"] # 0xe408 defer to def of arrow - - "\uE409": [SPELL: "'🣒'"] # 0xe409 defer to def of arrow - - "\uE40A": [SPELL: "'🣓'"] # 0xe40a defer to def of arrow - - "\uE42B": [SPELL: "'⇄'"] # 0xe42b defer to def of arrow - - "\uE42C": [SPELL: "'←'"] # 0xe42c defer to def of arrow - - "\uE42D": [SPELL: "'→'"] # 0xe42d defer to def of arrow - - "\uE42E": [SPELL: "'⇄'"] # 0xe42e defer to def of arrow +--- + +#C1 Controls and Latin-1 Supplement OK + - "Âą": [T: "cent"] # 0xa2 (en: 'cents') + - "ÂŁ": [T: "pund"] # 0xa3 (en: 'pounds') + - "€": [T: "valutategn"] # 0xa4 (en: 'currency sign') + - "„": [T: "yen"] # 0xa5 + - "Š": [T: "brutt vertikalstrek"] # 0xa6 (en: 'broken bar') + - "§": [T: "paragraf"] # 0xa7 (en: 'section') + - "š": [T: "trema"] # 0xa8 (en: 'double dot', MathPlayer: 'trema', google: 'dubbel prick') + - "©": [T: "opphavsrett"] # 0xa9 (en: 'copyright') + - "ÂȘ": [T: "feminin ordenstallindikator"] # 0xaa (en: 'feminine ordinal indicator', MathPlayer: 'feminine ordinal indicator', google: 'feminin ordinĂ€r indikator') + - "«": [T: "venstre sitattegn"] # 0xab (en: 'left-pointing double angle quote mark') + - "ÂŻ": # 0xaf + - test: + if: "ancestor::m:modified-variable and preceding-sibling::*[1][self::m:mi]" + then: [T: "bar"] # (google translation) + else: [T: "strek"] # (en: 'line') + - "ÂČ": [T: "i andre"] # 0xb2 (en: 'two', MathPlayer: 'exponent tvĂ„', google: 'tvĂ„') + - "Âł": [T: "i tredje"] # 0xb3 (en: 'three', MathPlayer: 'exponent tre', google: 'tre') + - "”": [T: "mikro"] # 0xb5 (en: 'micro') + - "Âč": [T: "eksponent Ă©n"] # 0xb9 (en: 'one', google: 'ett') + - "Âș": [T: "maskulin ordenstallindikator"] # 0xba (en: 'masculine ordinal indicator', MathPlayer: 'masculine ordinal indicator', google: 'maskulina ordinĂ€ra indikatorer') + - "ÂĄ": [T: "omvendt utropstegn"] # 0xa1 + - "¶": [T: "paragraftegn"] # 0xb6 + - "Âż": [T: "omvendt spĂžrsmĂ„lstegn"] # 0xbf + #------------------------------------------------------------------------------------------------------- + # SWEDISH: The Swedish character translations are based on the placement and appearance of the characters rather than their function, as function might be context-dependent. Placement above is used as the baseline, and low characters are translated as "lĂ„g(t)" (eng "low"). In most cases, no difference has been made in the translation between non-combining, modifier (Spacing Modifier Letters), and combining/embellishment characters. However, in the case of alphabetical letters and punctuation marks as modifier characters (such as modifier small h or comma embellishment), the construction "med ...( efter)" (eng "with ...( placed after it)") is used to prevent any possible ambiguity. + # Norwegian: Same as Swedish +#Spacing Modifier Letters +#Latin superscript modifier letters OK + - "ʰ": [T: "med liten h etter"] # 0x2b0 (en: 'modifier small h', google translation) + - "ʱ": [T: "med liten h med krok etter"] # 0x2b1 (en: 'modifier small h with hook', google translation) + - "ÊČ": [T: "med liten j etter"] # 0x2b2 (en: 'modifier small j', google translation) + - "Êł": [T: "med liten r etter"] # 0x2b3 (en: 'modifier small r', google translation) + - "ÊŽ": [T: "med liten rotert r etter"] # 0x2b4 (en: 'modifier small turned r', google translation) + - "Ê”": [T: "med liten rotert r med krok etter"] # 0x2b5 (en: 'modifier small turned r with hook', google translation) + - "ʶ": # 0x2b6 + - T: "med liten rotert" # (en: 'modifier small inverted', google translation) + - SPELL: "translate('R', 'R', 'R')" + - "Ê·": [T: "med liten w etter"] # 0x2b7 (en: 'modifier small w', google translation) + - "Êž": [T: "med liten y etter"] # 0x2b8 (en: 'modifier small y', google translation) + #-------------------------- + #Miscellaneous phonetic modifiers OK + - "Êč": [T: "primtegn"] # 0x2b9 (en: 'modifier prime', google: 'modifier prime') + - "Êș": [T: "dobbelt primtegn"] # 0x2ba (en: 'modifier double prime', google: 'modifier double prime') + - "Ê»": [T: "rotert komma"] # 0x2bb (en: 'modifier turned comma', google translation) + - "ÊŒ": [T: "apostrof"] # 0x2bc (google translation) + - "Êœ": [T: "speilvendt komma"] # 0x2bd (en: 'modifier reversed comma', google translation) + - "ÊŸ": [T: "hĂžyrevendt halv ring"] # 0x2be (en: 'modifier right half ring', google: 'modifierare höger halva ring') + - "Êż": [T: "venstrevendt halv ring"] # 0x2bf (en: 'modifier left half ring', google: 'modifierare lĂ€mnade halva ringen') + - "ˀ": [T: "glottal plosiv"] # 0x2c0 (google translation) + - "ˁ": [T: "speilvendt glottal plosiv"] # 0x2c1 (en: 'modifier reversed glottal stop', google translation) + - "˂": [T: "venstrevendt pilspiss"] # 0x2c2 (en: 'modifier left arrowhead', google translation) + - "˃": [T: "hĂžyrevendt pilspiss"] # 0x2c3 (en: 'modifier right arrowhead', google translation) + - "˄": [T: "oppovervendt pilspiss"] # 0x2c4 (en: 'modifier up arrowhead', google translation) + - "˅": [T: "nedovervendt pilspiss"] # 0x2c5 (en: 'modifier down arrowhead', google translation) + - "ˆ": [T: "cirkumfleks"] # 0x2c6 (en: 'modifier circumflex accent', google: 'modifiercirumflex accent') + - "ˇ": [T: "hake"] # 0x2c7 (en: 'caron', google: 'caron') + - "ˈ": [T: "vertikal strek"] # 0x2c8 (en: 'modifier vertical line', google translation) + - "ˉ": [T: "makron"] # 0x2c9 (google translation) + - "ˊ": [T: "akutt aksent"] # 0x2ca (en: 'modifier acute accent', google translation) + - "ˋ": [T: "grav aksent"] # 0x2cb (en: 'modifier grave accent', google translation) + - "ˌ": [T: "lav vertikal strek"] # 0x2cc (en: 'modifier low vertical line', google translation) + - "ˍ": [T: "lav makron"] # 0x2cd (google translation) + - "ˎ": [T: "lav grav aksent"] # 0x2ce (en: 'modifier low grave accent', google translation) + - "ˏ": [T: "lav akutt aksent"] # 0x2cf (en: 'modifier low acute accent', google translation) + - "ː": [T: "kolon lengdetegn"] # 0x2d0 (en: 'modifier triangular colon', google translation) + - "ˑ": [T: "halvt kolon lengdetegn"] # 0x2d1 (en: 'modifier half triangular colon', google translation) + - "˒": [T: "lav hĂžyrevendt halv ring"] # 0x2d2 (en: 'modifier centered right half ring', google translation) + - "˓": [T: "lav venstrevendt halv ring"] # 0x2d3 (en: 'modifier centered left half ring', google translation) + - "˔": [T: "lavt oppovervendt dreiekors"] # 0x2d4 (en: 'modifier up tadck', google translation) + - "˕": [T: "lavt nedovervendt dreiekors"] # 0x2d5 (en: 'modifier down tack', google translation) + - "˖": [T: "lavt plusstegn"] # 0x2d6 (google translation) + - "˗": [T: "lavt minustegn"] # 0x2d7 (en: 'modifier minus sign', google translation) + #---------------------------- + #Spacing clones of diacritics OK + - "˘": [T: "breve"] # 0x2d8 (en: 'breve') + - "˙": [T: "prikk"] # 0x2d9 (en: 'dot') + - "˚": [T: "ring"] # 0x2da (en: 'ring above') + - "˛": [T: "kvist"] # 0x2db (en: 'ogonek') + - "˜": [T: "liten tilde"] # 0x2dc (en: 'small tilde') + - "˝": [T: "dobbel akutt aksent"] # 0x2dd (en: 'double acute accent') + #----------------------------- + #Additions based on 1989 IPA OK + - "˞": [T: "rotisk hake"] # 0x2de (google translation) + - "˟": [T: "kryssaksent"] # 0x2df (en: 'modifier cross accent', google translation) + - "Ë ": [T: "med liten gamma etter"] # 0x2e0 (en: 'modifier small gamma', google translation) + - "ËĄ": [T: "med liten l etter"] # 0x2e1 (en: 'modifier small l', google translation) + - "Ëą": [T: "med liten s etter"] # 0x2e2 (google translation) + - "ËŁ": [T: "med liten x etter"] # 0x2e3 (en: 'modifier small x', google translation) + - "Ë€": [T: "liten speilvendt glottal plosiv"] # 0x2e4 (google translation) + #----------------------------- + #Tone letters OK + - "Ë„": [T: "ekstra hĂžyt tonetegn"] # 0x2e5 (en: 'modifier extra-high tone bar', google translation) + - "ËŠ": [T: "hĂžyt tonetegn"] # 0x2e6 (google translation) + - "˧": [T: "mellom-tonetegn"] # 0x2e7 (en: 'modifier mid tone bar', google translation) + - "Ëš": [T: "lavt tonetegn"] # 0x2e8 (en: 'modifier low tone bar', google translation) + - "Ë©": [T: "ekstra lavt tonetegn"] # 0x2e9 (en: 'modifier extra-low tone bar', google translation) + #----------------------------- + #Extended Bopomofo tone marks OK + - "ËȘ": [T: "mĂžrkt fallende tonetegn"] # 0x2ea (en: 'modifier yin departing tone mark', google translation) + - "Ë«": [T: "lyst fallende tonetegn"] # 0x2eb (en: 'modifier yang departing tone mark', google translation) + #--------------------------- + #IPA modifiers OK + - "ËŹ": [T: "lavt tonende tegn"] # 0x2ec (en: 'modifier voicing', google translation) + - "Ë­": [T: "ikke aspirert tegn"] # 0x2ed (en: 'modifier unaspirated', google translation) + #------------------------- + #Other modifier letter OK + - "Ëź": [T: "dobbel apostrof"] # 0x2ee (en: 'modifier double apostrophe', google translation) + #---------------------------- + #UPA modifiers OK + - "ËŻ": [T: "lav nedoverpekende pilspiss"] # 0x2ef (en: 'modifier low down arrowhead', google translation) + - "˰": [T: "lav oppoverpekende pilspiss"] # 0x2f0 (google translation) + - "˱": [T: "lav venstrepekende pilspiss"] # 0x2f1 (en: 'modifier low left arrowhead', google translation) + - "ËČ": [T: "lav hĂžyrepekende pilspiss"] # 0x2f2 (en: 'modifier low right arrowhead', google translation) + - "Ëł": [T: "lav ring"] # 0x2f3 (en: 'modifier low ring', google translation) + - "ËŽ": [T: "lav grav aksent"] # 0x2f4 (google translation) + - "Ë”": [T: "lav dobbel grav aksent"] # 0x2f5 (en: 'modifier middle double grave accent', google translation) + - "˶": [T: "lav dobbel akutt aksent"] # 0x2f6 (en: 'modifier middle double acute accent', google translation) + - "Ë·": [T: "lav tilde"] # 0x2f7 (en: 'modifier low tilde', google translation) + - "Ëž": [T: "hevet kolon"] # 0x2f8 (en: 'modifier raised colon', google translation) + - "Ëč": [T: "start hĂžy tone"] # 0x2f9 (en: 'modifier begin high tone', google translation) + - "Ëș": [T: "slutt hĂžy tone"] # 0x2fa (en: 'modifier end high tone', google translation) + - "Ë»": [T: "start lav tone"] # 0x2fb (en: 'modifier begin low tone', google translation) + - "ËŒ": [T: "slutt lav tone"] # 0x2fc (en: 'modifier end low tone', google translation) + - "Ëœ": [T: "lav hylle"] # 0x2fd (en: 'modifier shelf', google translation) + - "ËŸ": [T: "lav Ă„pen hylle"] # 0x2fe (en: 'modifier open shelf', google translation) + - "Ëż": [T: "lav venstrepil"] # 0x2ff (en: 'modifier low left arrow', google translation) + #--------------------------------------------------------------------------------------------------------- + #Combining Diacritical Marks + #Ordinary diacritics OK + - "̈": [T: "trema"] # 0x308 (en: 'diaeresis embellishment', google: 'diaeresis utsmyckning') + - "̉": [T: "krok"] # 0x309 (en: 'hook above embellishment', google translation) + - "̊": [T: "ring"] # 0x30a (en: 'ring above embellishment', google: 'ring över utsmyckning') + - "̋": [T: "dobbel akutt aksent"] # 0x30b (en: 'double acute accent embellishment', google translation) + - "̌": [T: "hake"] # 0x30c (en: 'check', google: 'kolla upp') + - "̍": [T: "vertikal linje"] # 0x30d (en: 'vertical line above embellishment', google translation) + - "̎": [T: "dobbel vertikal linje"] # 0x30e (en: 'double vertical line above embellishment', google translation) + - "̏": [T: "dobbel grav aksent"] # 0x30f (en: 'double grave accent embellishment', google translation) + - "̐": [T: "Chandrabindu"] # 0x310 (en: 'candrabindu embellishment', google translation) + - "̑": [T: "omvendt breve"] # 0x311 (en: 'inverted breve embellishment', google: 'inverterad breve -utsmyckning') + - "̒": [T: "med rotert komma"] # 0x312 (en: 'turned comma above embellishment', google translation) + - "̓": [T: "med komma"] # 0x313 (en: 'comma above embellishment', google translation) + - "̔": [T: "med omvendt komma"] # 0x314 (en: 'reversed comma above embellishment', google translation) + - "̕": [T: "med hĂžyrestilt komma"] # 0x315 (en: 'comma above right embellishment', google translation) + - "̖": [T: "lav grav aksent"] # 0x316 (en: 'grave accent below embellishment', google translation) + - "̗": [T: "lav akutt aksent"] # 0x317 (en: 'acute accent below embellishment', google translation) + - "̘": [T: "lavt venstre dreiekors"] # 0x318 (en: 'left tack below embellishment', google translation) + - "̙": [T: "lavt hĂžyre dreiekors"] # 0x319 (en: 'right tack below embellishment', google translation) + - "̚": [T: "venstrevendt vinkeltegn"] # 0x31a (en: 'left angle above embellishment', google translation) + - "̛": [T: "horn"] # 0x31b (en: 'horn embellishment', google translation) + - "̜": [T: "lav venstrevendt halvring"] # 0x31c (en: 'left half ring below embellishment', google translation) + - "̝": [T: "lavt oppoverrotert dreiekors"] # 0x31d (en: 'up tack below embellishment', google translation) + - "̞": [T: "lavt nedoverrotert dreiekors"] # 0x31e (en: 'down tack below embellishment', google translation) + - "̟": [T: "lav pluss"] # 0x31f (en: 'plus sign below embellishment', google translation) + - "Ì ": [T: "lav minus"] # 0x320 (en: 'minus sign below embellishment', google translation) + - "ÌĄ": [T: "palatal krok"] # 0x321 (en: 'palatalized hook below embellishment', google translation) + - "Ìą": [T: "retrofleks krok"] # 0x322 (en: 'retroflex hook below embellishment', google translation) + - "ÌŁ": [T: "lav prikk"] # 0x323 (google: 'prick under utsmyckningen') + - "Ì€": [T: "lav trema"] # 0x324 (en: 'diaeresis below embellishment', google: 'diaeres under utsmyckning') + - "Ì„": [T: "lav ring"] # 0x325 (en: 'ring below embellishment', google translation) + - "ÌŠ": [T: "lavt komma"] # 0x326 (en: 'comma below embellishment', google translation) + - "̧": [T: "lav cĂ©dille"] # 0x327 (en: 'cedilla embellishment', google: 'cedilla -utsmyckning') + - "Ìš": [T: "lav kvist"] # 0x328 (en: 'ogonek embellishment', google translation) + - "Ì©": [T: "lav vertikal strek"] # 0x329 (en: 'vertical line below embellishment', google translation) + - "ÌȘ": [T: "lav bro"] # 0x32a (en: 'bridge below embellishment', google translation) + - "Ì«": [T: "lav omvendt dobbel bue"] # 0x32b (en: 'inverted double arch below embellishment', google translation) + - "ÌŹ": [T: "lav hake"] # 0x32c (en: 'caron below embellishment', google translation) + - "Ì­": [T: "lav omvendt cirkumfleks"] # 0x32d (en: 'circumflex accent below embellishment', google translation) + - "Ìź": [T: "lav breve"] # 0x32e (en: 'breve below embellishment', google: 'breve under utsmyckning') + - "ÌŻ": [T: "lav omvendt breve"] # 0x32f (en: 'inverted breve below embellishment', google translation) + - "̰": [T: "lav tilde"] # 0x330 (en: 'tilde below embellishment', google: 'tilde under utsmyckning') + - "̱": [T: "lav makron"] # 0x331 (en: 'macron below embellishment', google: 'macron under utsmyckning') + - "ÌČ": [T: "lav strek"] # 0x332 (en: 'low line embellishment', google: 'lĂ„g linje utsmyckning') + - "Ìł": [T: "lav dobbeltstrek"] # 0x333 (en: 'double low line embellishment', google translation) + #------------------------------------------ + #Overstruck diacritics OK + - "ÌŽ": [T: "tilde i midten"] # 0x334 (en: 'tilde overlay embellishment', google translation) + - "Ì”": [T: "strek i midten"] # 0x335 (en: 'short stroke overlay embellishment', google translation) + - "̶": [T: "lang strek i midten"] # 0x336 (en: 'long stroke overlay embellishment', google translation) + - "Ì·": [T: "med kort skrĂ„strek"] # 0x337 (en: 'short solidus overlay embellishment', google translation) + - "Ìž": [T: "med lang skrĂ„strek"] # 0x338 (en: 'long solidus overlay embellishment', google: 'long solidus overlay embelling') + #------------------------------------ + #Miscellaneous additions OK + - "Ìč": [T: "lav hĂžyrevendt halvring"] # 0x339 (en: 'right half ring below embellishment', google translation) + - "Ìș": [T: "lav omvendt bro"] # 0x33a (en: 'inverted bridge below embellishment', google translation) + - "Ì»": [T: "lavt kvadrat"] # 0x33b (en: 'square below embellishment', google translation) + - "ÌŒ": [T: "lavt mĂ„ketegn"] # 0x33c (en: 'seagull below embellishment', google translation) + - "Ìœ": [T: "med x over"] # 0x33d (en: 'x above embellishment', google translation) + - "ÌŸ": [T: "vertikal tilde"] # 0x33e (en: 'vertical tilde embellishment', google translation) + - "Ìż": [T: "dobbel strek"] # 0x33f (en: 'double overline embellishment', google translation) + - "̀": [T: "grav tone"] # 0x340 (en: 'grave tone mark embellishment', google translation) + - "́": [T: "akutt tone"] # 0x341 (en: 'acute tone mark embellishment', google translation) + - "͆": [T: "bro"] # 0x346 +#---------------------------------------------------------------------------------------------------------------- +# Greek and Coptic OK + - "ÎȘΫϏ": # 0x3aa, 0x3ab, 0x3cf + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "stor"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [SPELL: "translate('.', 'ÎȘΫϏ', 'Îčυϗ')"] + - T: "med dialytika" # (en: 'with dialytika', google translation) + - "ϊ": [T: "iota med dialytika"] # 0x3ca (en: 'iota with dialytika', google translation) + - "ϋ": [T: "ypsilon med dialytika"] # 0x3cb (en: 'upsilon with dialytika', google translation) + - "ό": [T: "omikron med tonos"] # 0x3cc (en: 'omicron with tonos', google translation) + - "ύ": [T: "ypsilon med tonos"] # 0x3cd (en: 'upsilon with tonos', google translation) + - "ώ": [T: "omega med tonos"] # 0x3ce (en: 'omega with tonos', google translation) + - "ϐ": [T: "beta"] # 0x3d0 (en: 'beta') + - "ϑ": [T: "theta"] # 0x3d1 (en: 'theta', google: 'theta') + - "ϒ": [T: "ypsilon med krok"] # 0x3d2 (en: 'upsilon with hook', google: 'upsilon med krok') + - "ϓ": [T: "ypsilon med akutt aksent og krok"] # 0x3d3 (en: 'upsilon with acute and hook', google translation) + - "ϔ": [T: "ypsilon med trema og krok"] # 0x3d4 (en: 'upsilon with diaeresis and hook', google translation) + - "ϗ": [T: "kai"] # 0x3d7 (en: 'kai') + - "Ϙ": [T: "stor arkaisk koppa"] # 0x3d8 + - "ϙ": [T: "arkaisk koppa"] # 0x3d9 + - "А-ĐŻ": # 0x410 - 0x42f + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "stor"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [SPELL: "translate('.', 'ĐĐ‘Đ’Đ“Đ”Đ•Đ–Đ—Đ˜Đ™ĐšĐ›ĐœĐĐžĐŸĐ ĐĄĐąĐŁĐ€Đ„ĐŠĐ§ĐšĐ©ĐȘЫЏЭПЯ', 'абĐČгЎДжзОĐčĐșĐ»ĐŒĐœĐŸĐżŃ€ŃŃ‚ŃƒŃ„Ń…Ń†Ń‡ŃˆŃ‰ŃŠŃ‹ŃŒŃŃŽŃ')", pause: short] + - "а": [T: "a"] # 0x430 (google: 'а') + - "б": [T: "be"] # 0x431 (google: 'vara') + - "ĐČ": [T: "ve"] # 0x432 + - "Đł": [T: "ge"] # 0x433 + - "ĐŽ": [T: "de"] # 0x434 + - "Đ”": [T: "je"] # 0x435 (google: 'dvs') + - "ж": [T: "zhe"] # 0x436 + - "Đ·": [T: "ze"] # 0x437 + - "Đž": [T: "i"] # 0x438 (google: 'Đž') + - "Đč": [T: "kort i"] # 0x439 (en: 'short i') + - "Đș": [T: "ka"] # 0x43a + - "Đ»": [T: "el"] # 0x43b + - "ĐŒ": [T: "em"] # 0x43c + - "Đœ": [T: "en"] # 0x43d + - "ĐŸ": [T: "o"] # 0x43e (google: 'ĐŸ') + - "Đż": [T: "pe"] # 0x43f + - "р": [T: "er"] # 0x440 + - "с": [T: "es"] # 0x441 + - "т": [T: "te"] # 0x442 + - "у": [T: "u"] # 0x443 (google: 'у') + - "ф": [T: "ef"] # 0x444 + - "х": [T: "ha"] # 0x445 + - "ц": [T: "tse"] # 0x446 + - "ч": [T: "tsje"] # 0x447 + - "ш": [T: "sja"] # 0x448 + - "щ": [T: "sjtja"] # 0x449 + - "ъ": [T: "hardt tegn"] # 0x44a (en: 'hard sign') + - "ы": [T: "jeru"] # 0x44b + - "ь": [T: "mykt tegn"] # 0x44c (en: 'soft sign', google: 'mjukt skylt') + - "э": [T: "e"] # 0x44d (google: 'э') + - "ю": [T: "ju"] # 0x44e + - "я": [T: "ja"] # 0x44f + - "ۆ": [T: "arabisk-indisk kubikkrot"] # 0x606 + - "ۇ": [T: "arabisk-indisk fjerderot"] # 0x607 + - "ۈ": [T: "arabisk strĂ„le"] # 0x608 + #----------------------------------------------------------------------------------------------------------- + #General punctuation OK + - "‐": [T: "bindestrek"] # 0x2010 (en: 'hyphen') + - "‑": [T: "bindestrek"] # 0x2011 (en: 'hyphen', google: 'bindestrek') + - "‒": [T: "tankestrek"] # 0x2012 (en: 'figure dash', google: 'figurstreck') + - "–": [T: "tankestrek"] # 0x2013 (en: 'en dash') + - "—": [T: "lang tankestrek"] # 0x2014 (en: 'em dash') + - "―": [T: "horisontal strek"] # 0x2015 (en: 'horizontal bar') + - "‖": [T: "dobbel loddrett strek"] # 0x2016 (en: 'double vertical line') + - "†": [T: "kors"] # 0x2020 (en: 'dagger') + - "‡": [T: "dobbelt kors"] # 0x2021 (en: 'double dagger') + + - " - ": [T: " "] # 0x2000 - 0x2007 + + - "‱": # 0x2022 + - test: + if: "@data-chem-formula-op" + then: [T: "ganger"] # (en: 'dot', google translation) + else: [T: "listeelement"] # (en: 'bullet') + + - "‰": [T: "promille"] # 0x2030 (en: 'per mille', MathPlayer: 'promilletecken') + - "‱": [T: "per titusen"] # 0x2031 (en: 'per ten thousand') + - "â€Č": [T: "primtegn"] # 0x2032 (en: 'prime') + - "″": [T: "dobbelt primtegn"] # 0x2033 (en: 'double prime') + - "‮": [T: "trippelt primtegn"] # 0x2034 (en: 'triple prime') + - "—": [T: "omvendt primtegn"] # 0x2035 (en: 'reversed prime') + - "‶": [T: "omvendt dobbelt primtegn"] # 0x2036 (en: 'reversed double prime') + - "‷": [T: "omvendt trippelt primtegn"] # 0x2037 (en: 'reversed triple prime', google: 'omvĂ€nd trippelprime') + - "‾": [T: "innsettingstegn"] # 0x2038 (en: 'to the', google: 'till') + - "â€č": [T: "venstrepekende vinkel-sitattegn"] # 0x2039 (en: 'single left pointing angle quote mark') + - "â€ș": [T: "hĂžyrepekende vinkel-sitattegn"] # 0x203a (en: 'single right pointing angle quote mark') + - "‌": # 0x203c + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "dobbelt utropstegn"] # 0x203c + else: [T: "dobbel fakultet"] # 0x203c + - "⁄": # 0x2044 + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "stor skrĂ„strek"] # 0x203c + else: [T: "delt pĂ„"] # 0x203c + - "⁅": [T: "venstre piggparentes"] # 0x2045 (en: 'left square bracket with quill', google: 'vĂ€nster fyrkantig konsol med quill') + - "⁆": [T: "hĂžyre piggparentes"] # 0x2046 (en: 'right square bracket with quill', google: 'höger fyrkantig konsol med quill') + - "※": [T: "referansetegn"] # 0x203b + - "‿": [T: "underbinding"] # 0x203F + - "⁀": [T: "bindetegn"] # 0x2040 + - "⁎": [T: "lav asterisk"] # 0x204e + - "⁏": [T: "omvendt semikolon"] # 0x204f + - "⁐": [T: "sammentrekksmerke"] # 0x2050 + - "⁑": [T: "to vertikale asterisk"] # 0x2051 + - "⁒": [T: "kommersielt minustegn"] # 0x2052 + - "⁗": [T: "firedobbelt primtegn"] # 0x2057 (en: 'quadruple prime', MathPlayer: 'quadruple prime', google: 'fyrdubbla prime') + - "⁠": [T: ""] # 0x2060 + #------------------------------------------------------------------------------------------------------------------------- + # Superscripts and subscripts OK + - "⁰": [T: "opphĂžyd i null"] # 0x2070 (en: 'to the zeroth power', google translation) + - "ⁱ": [T: "opphĂžyd i i"] # 0x2071 (en: 'to the eihth power', google: 'till eihth power') + - "⁎": [T: "opphĂžyd i fire"] # 0x2074 (en: 'to the fourth power', google translation) + - "⁔": [T: "opphĂžyd i fem"] # 0x2075 (en: 'to the fifth power', google translation) + - "⁶": [T: "opphĂžyd i seks"] # 0x2076 (en: 'to the sixth power', google translation) + - "⁷": [T: "opphĂžyd i sju"] # 0x2077 (en: 'to the seventh power', google translation) + - "⁞": [T: "opphĂžyd i Ă„tte"] # 0x2078 (en: 'to the eighth power', google translation) + - "âč": [T: "opphĂžyd i ni"] # 0x2079 (en: 'to the ninth power', google translation) + - "âș": [T: "hevet pluss"] # 0x207a (en: 'superscript plus sign', google: 'superscript plus -skylt') + - "⁻": [T: "hevet minus"] # 0x207b (en: 'superscript minus', google: 'superscript minus') + - "⁌": [T: "hevet likhetstegn"] # 0x207c (en: 'superscript equals sign', google: 'superscript Ă€r lika med tecken') + - "⁜": [T: "hevet venstreparentes"] # 0x207d (en: 'superscript left parenthesis', google: 'superscript lĂ€mnade parentesen') + - " ": [T: "hevet hĂžyreparentes"] # 0x207e (en: 'superscript right parenthesis', google: 'superscript höger parentes') + - "ⁿ": [T: "opphĂžyd i n"] # 0x207f (en: 'to the ennth power', google: 'till den ena kraften') + - "₀": [T: "senket null"] # 0x2080 (en: 'sub zero', google translation) + - "₁": [T: "senket Ă©n"] # 0x2081 (en: 'sub one', google translation) + - "₂": [T: "senket to"] # 0x2082 (en: 'sub two', google translation) + - "₃": [T: "senket tre"] # 0x2083 (en: 'sub three', google translation) + - "₄": [T: "senket fire"] # 0x2084 (en: 'sub four', google translation) + - "₅": [T: "senket fem"] # 0x2085 (en: 'sub five', google translation) + - "₆": [T: "senket seks"] # 0x2086 (en: 'sub six', google translation) + - "₇": [T: "senket sju"] # 0x2087 (en: 'sub seven', google translation) + - "₈": [T: "senket Ă„tte"] # 0x2088 (en: 'sub eight', google translation) + - "₉": [T: "senket ni"] # 0x2089 (en: 'sub nine', google translation) + - "₊": [T: "senket pluss"] # 0x208a (en: 'subscript plus sign', google: 'subscript plus -skylt') + - "₋": [T: "senket minus"] # 0x208b (en: 'subscript minus sign', google: 'subscript minus sign') + - "₌": [T: "senket likhetstegn"] # 0x208c (en: 'subscript equals sign', google: 'subscript Ă€r lika med tecken') + - "₍": [T: "senket venstreparentes"] # 0x208d (en: 'subscript left parenthesis', google: 'subscript vĂ€nster-parentes av sig') + - "₎": [T: "senket hĂžyreparentes"] # 0x208e (en: 'subscript right parenthesis', google: 'subscript höger parentes') + - "ₐ": [T: "senket a"] # 0x2090 (en: 'sub A', google: 'sub a') + - "ₑ": [T: "senket e"] # 0x2091 (en: 'sub E', google: 'sub e') + - "ₒ": [T: "senket o"] # 0x2092 (en: 'sub O', google: 'under o') + - "ₓ": [T: "senket x"] # 0x2093 (en: 'sub X', google: 'under x') + - "ₕ": [T: "senket h"] # 0x2095 (en: 'sub H', google: 'under h') + - "ₖ": [T: "senket k"] # 0x2096 (en: 'sub K', google: 'under k') + - "ₗ": [T: "senket l"] # 0x2097 (en: 'sub L', google: 'under l') + - "ₘ": [T: "senket m"] # 0x2098 (en: 'sub M', google: 'sub m') + - "ₙ": [T: "senket n"] # 0x2099 (en: 'sub N', google: 'under n') + - "ₚ": [T: "senket p"] # 0x209a (en: 'sub P', google: 'sub p') + - "ₛ": [T: "senket s"] # 0x209b (en: 'sub S', google: 'sub s') + - "ₜ": [T: "senket t"] # 0x209c (en: 'sub T', google: 'under t') + #-------------------------------------------------------------------------------------------------------------------- + #Currency symbols OK + - "₠": [T: "europeisk valutaenhet"] # 0x20a0 (en: 'european currenty units', google translation) + - "₡": [T: "colĂłn"] # 0x20a1 + - "₱": [T: "cruzeiro"] # 0x20a2 + - "₣": [T: "franc"] # 0x20a3 + - "â‚€": [T: "lira"] # 0x20a4 (google: 'lire') + - "â‚„": [T: "mill"] # 0x20a5 + - "₩": [T: "naira"] # 0x20a6 + - "₧": [T: "peseta"] # 0x20a7 + - "₹": [T: "rupi"] # 0x20a8 (google: 'rupier') + - "₩": [T: "won"] # 0x20a9 (google: 'vann') + - "â‚Ș": [T: "ny shekel"] # 0x20aa (google: 'shekel') + - "₫": [T: "dong"] # 0x20ab + - "€": [T: "euro"] # 0x20ac (en: 'euros') + - "₭": [T: "kip"] # 0x20ad (google: 'slaf') + - "₼": [T: "tugrik"] # 0x20ae + - "₯": [T: "drakmer"] # 0x20af (google: 'drakma') + - "₰": [T: "pfenniger"] # 0x20b0 (google: 'tyska pennies') + - "₱": [T: "peso"] # 0x20b1 + - "â‚Č": [T: "guaranier"] # 0x20b2 + - "₳": [T: "australes"] # 0x20b3 (google: 'österral') + - "₮": [T: "hryvnjaer"] # 0x20b4 + - "â‚”": [T: "cedi"] # 0x20b5 + - "₶": [T: "livre tournois"] # 0x20b6 (google translation) + - "₷": [T: "spesmilo"] # 0x20b7 (google translation) + - "₾": [T: "tenge"] # 0x20b8 (google translation) + - "â‚č": [T: "indiske rupi"] # 0x20b9 (en: 'indian rupees', google translation) + - "â‚ș": [T: "tyrkiske lira"] # 0x20ba (en: 'turkish liras', google translation) + #-------------------------------------------------------------------------------------------------------------- + #Combining Diacritical Marks for Symbols OK + - "⃐": [T: "venstre-harpun"] # 0x20d0 (en: 'left harpoon above embellishment', google: 'vĂ€nster harpoon ovanför utsmyckning') + - "⃑": [T: "hĂžyre-harpun"] # 0x20d1 (en: 'right harpoon above embellishment', google: 'höger harpoon ovanför utsmyckning') + - "⃒": [T: "lang vertikal strek"] # 0x20d2 (en: 'long vertical line overlay embellishment', google translation) + - "⃓": [T: "kort vertikal strek"] # 0x20d3 (en: 'short vertical line overlay embellishment', google translation) + - "⃔": [T: "pil mot klokken"] # 0x20d4 (en: 'anticlockwise arrow above embellishment', google translation) + - "⃕": [T: "pil med klokken"] # 0x20d5 (en: 'clockwise arrow above embellishment', google translation) + - "⃖": [T: "venstrepil"] # 0x20d6 (en: 'left arrow above embellishment', google: 'vĂ€nster pil över utsmyckningen') + - "⃗": [T: "hĂžyrepil"] # 0x20d7 (en: 'right arrow above embellishment', google: 'höger-pil över utsmyckning') + - "⃘": [T: "ring"] # 0x20d8 (en: 'ring overlay embellishment', google translation) + - "⃙": [T: "ring med klokken"] # 0x20d9 (en: 'clockwise ring overlay embellishment', google translation) + - "⃚": [T: "ring mot klokken"] # 0x20da (en: 'anticlockwise ring overlay embellishment', google translation) + - "⃛": [T: "trippel prikk"] # 0x20db (en: 'triple dot', google: 'triple dot') + - "⃜": [T: "fire prikker"] # 0x20dc (en: 'quadruple dot', google: 'fyrdubbla prick') + - "⃝": [T: "i sirkel"] # 0x20dd (en: 'enclosing circle embellishment', google translation) + - "⃞": [T: "i firkant"] # 0x20de (en: 'enclosing square embellishment', google translation) + - "⃟": [T: "i diamant"] # 0x20df (en: 'enclosing diamond embellishment', google translation) + - "⃠": [T: "i sirkel med omvendt skrĂ„strek"] # 0x20e0 (en: 'enclosing circle backslash embellishment', google translation) + - "⃥": [T: "venstre-hĂžyre-pil"] # 0x20e1 (en: 'left right arrow above embellishment', google: 'vĂ€nster höger pil över utsmyckningen') + - "⃹": [T: "omsluttende skjerm"] # 0x20e2 (en: 'enclosing screen embellishment', google translation) + - "⃣": [T: "omsluttende tastehette"] # 0x20e3 (en: 'enclosing keycap embellishment', google translation) + - "⃀": [T: "i oppoverpekende trekant"] # 0x20e4 (en: 'enclosing upward pointing triangle embellishment', google translation) + - "⃄": [T: "omvendt skrĂ„strek"] # 0x20e5 (en: 'reverse solidus overlay embellishment', google translation) + - "⃊": [T: "dobbel loddrett strek"] # 0x20e6 (en: 'double verticle stroke embellishment', google translation) + - "⃧": [T: "livrentesymbol"] # 0x20e7 (en: 'annuity symbol embellishment', google translation) + - "⃚": [T: "trippel prikk"] # 0x20e8 (en: 'triple underdot', google translation) + - "⃩": [T: "bred bro"] # 0x20e9 (en: 'wide bridge above embellishment', google translation) + - "âƒȘ": [T: "venstrepil"] # 0x20ea (en: 'leftwards arrow overlay embellishment', google translation) + - "⃫": [T: "lang dobbel skrĂ„strek"] # 0x20eb (en: 'long double solidus overlay embellishment', google translation) + - "⃏": [T: "hĂžyre-harpun mothake ned"] # 0x20ec (en: 'rightwards harpoon with barb downwards embellishment', google translation) + - "⃭": [T: "venstre-harpun mothake ned"] # 0x20ed (en: 'leftwards harpoon with barb downwards embellishment', google translation) + - "⃟": [T: "venstrepil under"] # 0x20ee (en: 'left arrow below embellishment', google translation) + - "⃯": [T: "hĂžyrepil under"] # 0x20ef (en: 'right arrow below embellishment', google translation) + - "⃰": [T: "asterisk"] # 0x20f0 (en: 'asterisk above embellishment', google translation) + #----------------------------------------------------------------------------------------------------- + #Letterlike Symbols OK + - "℄": [T: "midtlinjesymbol"] # 0x2104 (google translation) + - "℅": [T: "care of"] # 0x2105 (google: 'bry sig om') + - "℆": [T: "cada una"] # 0x2106 (google translation) + - "ℇ": [T: "eulers konstant"] # 0x2107 (en: 'euler's constant', google: 'eulers konstant') + - "℈": [T: "scruple"] # 0x2108 (en: 'scruples', google translation) + - "℉": [T: "grader fahrenheit"] # 0x2109 (en: 'degrees fahrenheit') + - "ℊ": [T: "script font g"] # 0x210a (en: 'script g') + - "ℌℑℹℭ": # 0x210c, 0x2111, 0x2128, 0x212d + - T: "fraktur" # (en: 'fraktur', google: 'fraktur') + - SPELL: "translate('.', 'ℌℑℹℭ', 'HIZC')" + + - "â„â„™â„Ÿâ„ż": # 0x210d, 0x2119, 0x213e, 0x213f + - T: "dobbeltstreket" # (en: 'double struck', google translation) + - SPELL: "translate('.', 'â„â„™â„Ÿâ„ż', 'HPΓΠ')" + + - "ℎ": [T: "plancks konstant"] # 0x210e + - "ℏ": [T: "h strek"] # 0x210f + # SWEDISH: finns bara ett sĂ€tt att sĂ€ga h strek + + - "â„â„’â„˜â„Źâ„°â„±â„ł": # 0x2110, 0x2112, 0x2118, 0x2130, 0x2131, 0x2133 + - T: "script font" # (en: 'script') + - SPELL: "translate('.', 'â„â„’â„˜â„Źâ„°â„±â„ł', 'ILPBEFM')" + + - "℔": [T: "pund"] # 0x2114 (en: 'pounds', google: 'pund') + - "№": [T: "numero"] # 0x2116 (en: 'number') + - "â„„": [T: "ounce"] # 0x2125 (en: 'ounces') + - "℩": [T: "ohm"] # 0x2126 (en: 'ohms') + - "℧": [T: "mho"] # 0x2127 (en: 'mhos') + - "℩": [T: "rotert iota"] # 0x2129 (en: 'turned iota', google: 'vĂ€nde iota') + - "Å": [T: "Ă„ngstrĂžm"] # 0x212b + - "ℯ": [T: "script font e"] # 0x212f (en: 'script e') + + # coalesced some chars that use cap letters + - "â„Čâ„ș⅁⅂⅃⅄": # 0x2132, 0x213a, 0x2141, 0x2142, 0x2143, 0x2144 + - test: + - if: "'.' = 'â„ș'" + then: [T: "rotert"] # (en: 'rotated', google translation) + - else_if: "'.' = 'â„Č'" + then: [T: "rotert"] # (en: 'turned', google translation) + - else_if: "'.' = '⅃'" + then: [T: "omvendt sans-serif"] # (en: 'reversed sans-serif', google translation) + else: [T: "rotert sans-serif"] # (en: 'turned sans-serif', google: 'vĂ€nde sans-serif') + - SPELL: "translate('.', 'â„Čâ„ș⅁⅂⅃⅄', 'FQGLLY')" + + - "℮": [T: "script font o"] # 0x2134 (en: 'script o') + - "â„”": [T: "alef"] # 0x2135 (en: 'first transfinite cardinal') + - "ℶ": [T: "bet"] # 0x2136 (en: 'second transfinite cardinal') + - "ℷ": [T: "gimel"] # 0x2137 (en: 'third transfinite cardinal') + - "ℾ": [T: "dalet"] # 0x2138 (en: 'fourth transfinite cardinal') + - "ℌ": [T: "dobbeltstreket pi"] # 0x213c (en: 'double struck pi', google: 'dobbelslaget pi') + - "ℜ": [T: "dobbeltstreket gamma"] # 0x213d (en: 'double struck gamma', google: 'dobbelslaget gamma') + - "⅀": [T: "dobbeltstreket summetegn"] # 0x2140 (en: 'double struck n-ary summation', google: 'dubbelslaget n-ary-sammanfattning') + - "⅋": [T: "rotert og-tegn"] # 0x214b (en: 'turned ampersand', google: 'vĂ€nde ampersand') + - "⅌": [T: "per"] # 0x214c (en: 'per', google: 'per') + - "ⅎ": [T: "rotert f"] # 0x214e (en: 'turned F', google: 'vĂ€nde f') + #-------------------------------------------------------------------------------------------------------------- + #Number formats OK + - "ÂŒ": [T: "Ă©n fjerdedel"] # 0x00bc + - "œ": [T: "Ă©n halv"] # 0x00bd + - "Ÿ": [T: "tre fjerdedeler"] # 0x00be + - "⅐": [T: "Ă©n sjudel"] # 0x2150 (en: 'one seventh', google: 'en sjunde') + - "⅑": [T: "Ă©n nidel"] # 0x2151 (en: 'one ninth', google: 'en nionde') + - "⅒": [T: "Ă©n tidel"] # 0x2152 (en: 'one tenth') + - "⅓": [T: "Ă©n tredjedel"] # 0x2153 (en: 'one third') + - "⅔": [T: "to tredjedeler"] # 0x2154 (en: 'two thirds') + - "⅕": [T: "Ă©n femtedel"] # 0x2155 (en: 'one fifth') + - "⅖": [T: "to femtedeler"] # 0x2156 (en: 'two fifths') + - "⅗": [T: "tre femtedeler"] # 0x2157 (en: 'three fifths') + - "⅘": [T: "fire femtedeler"] # 0x2158 (en: 'four fifths') + - "⅙": [T: "Ă©n sjettedel"] # 0x2159 (en: 'one sixth') + - "⅚": [T: "fem sjettedeler"] # 0x215a (en: 'five sixths') + - "⅛": [T: "Ă©n Ă„ttedel"] # 0x215b (en: 'one eighth') + - "⅜": [T: "tre Ă„ttedeler"] # 0x215c (en: 'three eighths') + - "⅝": [T: "fem Ă„ttedeler"] # 0x215d (en: 'five eighths') + - "⅞": [T: "sju Ă„ttedeler"] # 0x215e (en: 'seven eighths') + - "⅟": [T: "Ă©n over"] # 0x215f (en: 'one over', google: 'en över') + - "Ⅰ": [T: "i"] # 0x2160 (en: 'I', google translation) + - "Ⅱ": [T: "i i"] # 0x2161 (en: 'I I', google translation) + - "ⅱ": [T: "i i i"] # 0x2162 (en: 'I I I', google translation) + - "Ⅳ": [T: "i v"] # 0x2163 (en: 'I V', google translation) + - "â…€": [T: "v"] # 0x2164 (en: 'V', google translation) + - "â…„": [T: "v i"] # 0x2165 (en: 'V I', google translation) + - "Ⅹ": [T: "v i i"] # 0x2166 (en: 'V I I', google translation) + - "Ⅷ": [T: "v i i i"] # 0x2167 (en: 'V I I I', google translation) + - "ⅹ": [T: "i x"] # 0x2168 (en: 'I X', google translation) + - "Ⅹ": [T: "x"] # 0x2169 (en: 'X', google translation) + - "â…Ș": [T: "x i"] # 0x216a (en: 'X I', google translation) + - "Ⅻ": [T: "x i i"] # 0x216b (en: 'X I I', google translation) + - "Ⅼ": [T: "l"] # 0x216c (en: 'L', google translation) + - "Ⅽ": [T: "c"] # 0x216d (en: 'C', google translation) + - "ⅼ": [T: "d"] # 0x216e (en: 'D', google translation) + - "Ⅿ": [T: "m"] # 0x216f (en: 'M', google translation) + - "ⅰ": [T: "i"] # 0x2170 (en: 'I', google translation) + - "ⅱ": [T: "i i"] # 0x2171 (en: 'I I', google translation) + - "â…Č": [T: "i i i"] # 0x2172 (en: 'I I I', google translation) + - "ⅳ": [T: "i v"] # 0x2173 (en: 'I V', google translation) + - "Ⅾ": [T: "v"] # 0x2174 (en: 'V', google translation) + - "â…”": [T: "v i"] # 0x2175 (en: 'V I', google translation) + - "ⅶ": [T: "v i i"] # 0x2176 (en: 'V I I', google translation) + - "ⅷ": [T: "v i i i"] # 0x2177 (en: 'V I I I', google translation) + - "ⅾ": [T: "i x"] # 0x2178 (en: 'I X', google translation) + - "â…č": [T: "x"] # 0x2179 (en: 'X', google translation) + - "â…ș": [T: "x i"] # 0x217a (en: 'X I', google translation) + - "ⅻ": [T: "x i i"] # 0x217b (en: 'X I I', google translation) + - "â…Œ": [T: "l"] # 0x217c (en: 'L', google translation) + - "â…œ": [T: "c"] # 0x217d (en: 'C', google translation) + - "â…Ÿ": [T: "d"] # 0x217e (en: 'D', google translation) + - "ⅿ": [T: "m"] # 0x217f (en: 'M', google translation) + - "↉": [T: "null tredjedeler"] # 0x2189 (en: 'zero thirds') + #----------------------------------------------------------------------------------------------------- + #Arrows OK + - "←": [T: "venstrepil"] # 0x2190 (en: 'leftwards arrow') + - "↑": [T: "oppoverpil"] # 0x2191 (en: 'upwards arrow') + - "↓": [T: "nedoverpil"] # 0x2193 (en: 'downwards arrow') + - "↔": [T: "venstre-hĂžyre-pil"] # 0x2194 (en: 'left right arrow') + - "↕": [T: "opp-ned-pil"] # 0x2195 (en: 'up down arrow') + - "↖": [T: "nordvest-pil"] # 0x2196 (en: 'north west arrow') + - "↗": # 0x2197 + - test: + if: "ancestor::*[2][self::m:limit]" + then: [T: "gĂ„r fra venstre mot"] # (en: 'approaches from below', google translation) + else: [T: "nordĂžst-pil"] # (en: 'north east arrow') + + - "↘": # 0x2198 + - test: + if: "ancestor::*[2][self::m:limit]" + then: [T: "gĂ„r fra hĂžyre mot"] # (en: 'approaches from above', google translation) + else: [T: "sĂžrĂžst-pil"] # (en: 'south east arrow') + + - "↙": [T: "sĂžrvest-pil"] # 0x2199 (en: 'south west arrow') + - "↚": [T: "overstrĂžket venstrepil"] # 0x219a (en: 'leftwards arrow with stroke') + - "↛": [T: "overstrĂžket hĂžyrepil"] # 0x219b (en: 'rightwards arrow with stroke') + - "↜": [T: "bĂžlget venstrepil"] # 0x219c (en: 'leftwards wave arrow') + - "↝": [T: "bĂžlget hĂžyrepil"] # 0x219d (en: 'rightwards wave arrow') + - "↞": [T: "venstrepil med to spisser"] # 0x219e (en: 'leftwards two headed arrow') + - "↟": [T: "oppoverpil med to spisser"] # 0x219f (en: 'upwards two headed arrow') + - "↠": [T: "hĂžyrepil med to spisser"] # 0x21a0 (en: 'rightwards two headed arrow') + - "↡": [T: "nedoverpil med to spisser"] # 0x21a1 (en: 'downwards two headed arrow') + - "↱": [T: "venstrepil med hale"] # 0x21a2 (en: 'leftwards arrow with tail') + - "↣": [T: "hĂžyrepil med hale"] # 0x21a3 (en: 'rightwards arrow with tail') + - "ↀ": [T: "venstrepil fra strek"] # 0x21a4 (en: 'leftwards arrow from bar') + - "ↄ": [T: "oppoverpil fra strek"] # 0x21a5 (en: 'upwards arrow from bar') + - "↩": [T: "hĂžyrepil fra strek"] # 0x21a6 (en: 'rightwards arrow from bar') + - "↧": [T: "nedoverpil fra strek"] # 0x21a7 (en: 'downwards arrow from bar') + - "↹": [T: "opp-ned-pil med base"] # 0x21a8 (en: 'up down arrow with base') + - "↩": [T: "venstrepil med krok"] # 0x21a9 (en: 'leftwards arrow with hook') + - "â†Ș": [T: "hĂžyrepil med krok"] # 0x21aa (en: 'rightwards arrow with hook') + - "↫": [T: "venstrepil med lĂžkke"] # 0x21ab (en: 'leftwards arrow with loop') + - "↬": [T: "hĂžyrepil med lĂžkke"] # 0x21ac (en: 'rightwards arrow with loop') + - "↭": [T: "bĂžlget venstre-hĂžyre-pil"] # 0x21ad (en: 'left right wave arrow') + - "↼": [T: "overstrĂžket venstre-hĂžyre-pil"] # 0x21ae (en: 'left right arrow with stroke') + - "↯": [T: "sikksakk nedoverpil"] # 0x21af (en: 'downwards zigzag arrow') + - "↰": [T: "oppoverpil med spissen mot venstre"] # 0x21b0 (en: 'upwards arrow with tip leftwards') + - "↱": [T: "oppoverpil med spissen mot hĂžyre"] # 0x21b1 (en: 'upwards arrow with tip rightwards') + - "â†Č": [T: "nedoverpil med spissen mot venstre"] # 0x21b2 (en: 'downwards arrow with tip leftwards') + - "↳": [T: "nedoverpil med spissen mot hĂžyre"] # 0x21b3 (en: 'downwards arrow with tip rightwards') + - "↮": [T: "hĂžyrepil med hjĂžrnet ned"] # 0x21b4 (en: 'rightwards arrow with corner downwards') + - "↔": [T: "nedoverpil med hjĂžrnet mot venstre"] # 0x21b5 (en: 'downwards arrow with corner leftwards') + - "↶": [T: "Ăžvre halvsirkelpil mot klokken"] # 0x21b6 (en: 'anticlockwise top semicircle arrow') + - "↷": [T: "Ăžvre halvsirkelpil med klokken"] # 0x21b7 (en: 'clockwise top semicircle arrow') + - "↾": [T: "nordvest-pil mot strek"] # 0x21b8 (en: 'north west arrow to long bar') + - "â†č": [T: "venstrepil mot strek over hĂžyrepil mot strek"] # 0x21b9 (en: 'leftwards arrow to bar over rightwards arrow to bar') + - "â†ș": [T: "Ă„pen sirkelpil mot klokken"] # 0x21ba (en: 'anticlockwise open circle arrow') + - "↻": [T: "Ă„pen sirkelpil med klokken"] # 0x21bb (en: 'clockwise open circle arrow') + - "↌": [T: "venstre-harpun mothake opp"] # 0x21bc (en: 'left harpoon up') + - "↜": [T: "venstre-harpun mothake ned"] # 0x21bd (en: 'left harpoon down') + - "↟": [T: "opp-harpun mothake hĂžyre"] # 0x21be (en: 'up harpoon right') + - "↿": [T: "opp-harpun mothake venstre"] # 0x21bf (en: 'up harpoon left') + - "⇀": [T: "hĂžyre-harpun mothake opp"] # 0x21c0 (en: 'right harpoon up') + - "⇁": [T: "hĂžyre-harpun mothake ned"] # 0x21c1 (en: 'right harpoon down') + - "⇂": [T: "ned-harpun mothake hĂžyre"] # 0x21c2 (en: 'down harpoon right') + - "⇃": [T: "ned-harpun mothake venstre"] # 0x21c3 (en: 'down harpoon left') + - "⇄": [T: "hĂžyrepil over venstrepil"] # 0x21c4 (en: 'rightwards arrow over leftwards arrow') + - "⇅": [T: "oppoverpil til venstre for nedoverpil"] # 0x21c5 (en: 'upwards arrow leftwards of downwards arrow') + - "⇆": [T: "venstrepil over hĂžyrepil"] # 0x21c6 (en: 'leftwards arrow over rightwards arrow') + - "⇇": [T: "to venstrepiler"] # 0x21c7 (en: 'leftwards paired arrows') + - "⇈": [T: "to oppoverpiler"] # 0x21c8 (en: 'upwards paired arrows') + - "⇉": [T: "to hĂžyrepiler"] # 0x21c9 (en: 'rightwards paired arrows') + - "⇊": [T: "to nedoverpiler"] # 0x21ca (en: 'downwards paired arrows') + - "⇋": [T: "venstre-harpun over hĂžyre-harpun"] # 0x21cb (en: 'left harpoon over right harpoon') + - "⇌": [T: "hĂžyre-harpun over venstre-harpun"] # 0x21cc (en: 'right harpoon over left harpoon') + - "⇍": [T: "overstrĂžket dobbeltstreket venstrepil"] # 0x21cd (en: 'leftwards double arrow with stroke') + - "⇎": [T: "overstrĂžket dobbeltstreket venstre-hĂžyre-pil"] # 0x21ce (en: 'left right double arrow with stroke') + - "⇏": [T: "overstrĂžket dobbeltstreket hĂžyrepil"] # 0x21cf (en: 'rightwards double arrow with stroke') + - "⇐": [T: "dobbeltstreket venstrepil"] # 0x21d0 (en: 'leftwards double arrow') + - "⇑": [T: "dobbeltstreket oppoverpil"] # 0x21d1 (en: 'upwards double arrow') + - "⇒": [T: "impliserer"] # 0x21d2 (en: 'rightwards double arrow') + - "⇓": [T: "dobbeltstreket nedoverpil"] # 0x21d3 (en: 'downwards double arrow') + - "⇔": [T: "er ekvivalent med"] # 0x21d4 (en: 'left right double arrow') + - "⇕": [T: "dobbeltstreket opp-ned-pil"] # 0x21d5 (en: 'up down double arrow') + - "⇖": [T: "dobbeltstreket nordvest-pil"] # 0x21d6 (en: 'north west double arrow') + - "⇗": [T: "dobbeltstreket nordĂžst-pil"] # 0x21d7 (en: 'north east double arrow') + - "⇘": [T: "dobbeltstreket sĂžrĂžst-pil"] # 0x21d8 (en: 'south east double arrow') + - "⇙": [T: "dobbeltstreket sĂžrvest-pil"] # 0x21d9 (en: 'south west double arrow') + - "⇚": [T: "trippelstreket venstrepil"] # 0x21da (en: 'leftwards triple arrow') + - "⇛": [T: "trippelstreket hĂžyrepil"] # 0x21db (en: 'rightwards triple arrow') + - "⇜": [T: "slingrete venstrepil"] # 0x21dc (en: 'leftwards squiggle arrow') + - "⇝": [T: "slingrete hĂžyrepil"] # 0x21dd (en: 'rightwards squiggle arrow') + - "⇞": [T: "oppoverpil med dobbel horisontal strek"] # 0x21de (en: 'upwards arrow with double stroke') + - "⇟": [T: "nedoverpil med dobbel horisontal strek"] # 0x21df (en: 'downwards arrow with double stroke') + - "⇠": [T: "stiplet venstrepil"] # 0x21e0 (en: 'leftwards dashed arrow') + - "⇡": [T: "stiplet oppoverpil"] # 0x21e1 (en: 'upwards dashed arrow') + - "⇱": [T: "stiplet hĂžyrepil"] # 0x21e2 (en: 'rightwards dashed arrow') + - "⇣": [T: "stiplet nedoverpil"] # 0x21e3 (en: 'downwards dashed arrow') + - "⇀": [T: "venstrepil mot strek"] # 0x21e4 (en: 'leftwards arrow to bar') + - "⇄": [T: "hĂžyrepil mot strek"] # 0x21e5 (en: 'rightwards arrow to bar') + - "⇩": [T: "hvit venstrepil"] # 0x21e6 (en: 'leftwards white arrow') + - "⇧": [T: "hvit oppoverpil"] # 0x21e7 (en: 'upwards white arrow') + - "⇹": [T: "hvit hĂžyrepil"] # 0x21e8 (en: 'rightwards white arrow') + - "⇩": [T: "hvit nedoverpil"] # 0x21e9 (en: 'downwards white arrow') + - "â‡Ș": [T: "hvit oppoverpil fra strek"] # 0x21ea (en: 'upwards white arrow from bar') + - "⇫": [T: "hvit oppoverpil pĂ„ sokkel"] # 0x21eb (en: 'upwards white arrow on pedestal', google: 'uppĂ„t vit pil pĂ„ piedestal') + - "⇬": [T: "hvit oppoverpil pĂ„ sokkel med horisontal strek"] # 0x21ec (en: 'upwards white arrow on pedestal with horizontal bar', google: 'uppĂ„t vit pil pĂ„ piedestal med horisontell stĂ„ng') + - "⇭": [T: "hvit oppoverpil pĂ„ sokkel med vertikal strek"] # 0x21ed (en: 'upwards white arrow on pedestal with vertical bar', google: 'uppĂ„t vit pil pĂ„ piedestal med vertikal bar') + - "⇼": [T: "hvit dobbel oppoverpil"] # 0x21ee (en: 'upwards white double arrow', google: 'uppĂ„t vit dubbelpil') + - "⇯": [T: "hvit dobbel oppoverpil pĂ„ sokkel"] # 0x21ef (en: 'upwards white double arrow on pedestal', google: 'uppĂ„t vit dubbelpil pĂ„ piedestal') + - "⇰": [T: "hvit hĂžyrepil fra vegg"] # 0x21f0 (en: 'rightwards white arrow from wall', google: 'Ă„tgĂ€rder vit pil frĂ„n vĂ€gg') + - "⇱": [T: "nordvest-pil mot hjĂžrne"] # 0x21f1 (en: 'north west arrow to corner', google: 'north west arrow till hörnet') + - "â‡Č": [T: "sĂžrĂžst-pil mot hjĂžrne"] # 0x21f2 (en: 'south east arrow to corner', google: 'south east arrow till corner') + - "⇳": [T: "hvit opp-ned-pil"] # 0x21f3 (en: 'up down white arrow', google: 'upp ner white arrow') + - "⇮": [T: "hĂžyrepil med liten sirkel"] # 0x21f4 (en: 'right arrow with small circle') + - "⇔": [T: "nedoverpil til venstre for oppoverpil"] # 0x21f5 (en: 'downwards arrow leftwards of upwards arrow') + - "⇶": [T: "tre hĂžyrepiler"] # 0x21f6 (en: 'three rightwards arrows', google: 'tre pilar med höger') + - "⇷": [T: "venstrepil med vertikal strek"] # 0x21f7 (en: 'leftwards arrow with vertical stroke', google: 'vĂ€nster pil med lodslag') + - "⇾": [T: "hĂžyrepil med vertikal strek"] # 0x21f8 (en: 'rightwards arrow with vertical stroke', google: 'Ă„tgĂ€rdspil med vertikal stroke') + - "â‡č": [T: "venstre-hĂžyre-pil med vertikal strek"] # 0x21f9 (en: 'left right arrow with vertical stroke', google: 'vĂ€nster höger pil med vertikalt slag') + - "â‡ș": [T: "venstrepil med dobbel vertikal strek"] # 0x21fa (en: 'leftwards arrow with double vertical stroke', google: 'vĂ€nster pil med dubbel vertikal stroke') + - "⇻": [T: "hĂžyrepil med dobbel vertikal strek"] # 0x21fb (en: 'rightwards arrow with double vertical stroke', google: 'Ă„tgĂ€rdspil med dubbel vertikal stroke') + - "⇌": [T: "venstre-hĂžyre-pil med dobbel vertikal strek"] # 0x21fc (en: 'left right arrow with double vertical stroke', google: 'vĂ€nster höger pil med dubbel vertikal stroke') + - "⇜": [T: "venstrepil med Ă„pen spiss"] # 0x21fd (en: 'leftwards open headed arrow') + - "⇟": [T: "hĂžyrepil med Ă„pen spiss"] # 0x21fe (en: 'rightwards open headed arrow') + - "⇿": [T: "venstre-hĂžyre-pil med Ă„pen spiss"] # 0x21ff (en: 'left right open headed arrow') + #---------------------------------------------------------------------------------------------------------------- + #Mathematical operators OK + - "∀": [T: "for alle"] # 0x2200 (en: 'for all') + - "∁": # 0x2201 # audit-ignore + - T: "komplementet til" # (en: 'complement of') + - "∃": [T: "det eksisterer"] # 0x2203 (en: 'there exists') + - "∄": [T: "det eksisterer ikke"] # 0x2204 (en: 'there does not exist') + - "∅": [T: "den tomme mengden"] # 0x2205 (en: 'empty set') + - "∇": [T: "nabla"] # 0x2207 (en: 'gradient of', google: 'lutning av') + - "∋": [T: "inneholder elementet"] # 0x220b (en: 'contains the member') + - "∌": [T: "inneholder ikke elementet"] # 0x220c (en: 'does not contain the member') + - "∍": [T: "inneholder elementet"] # 0x220d (en: 'contains the member') + - "∎": [T: "som skulle bevises"] # 0x220e (en: 'end of proof') + - "∏": [T: "produktet"] # 0x220f (en: 'product') + - "∐": [T: "koproduktet"] # 0x2210 (en: 'coproduct', MathPlayer: 'coproduct', google: 'coprodukt') + - "∑": [T: "sum"] # 0x2211 (en: 'sum') + - "−": [T: "minus"] # 0x2212 + - "∓": [T: "minus pluss"] # 0x2213 (en: 'minus or plus') + - "∔": [T: "prikk pluss"] # 0x2214 (en: 'dot plus') + - "∕": [T: "delt pĂ„"] # 0x2215 (en: 'divided by') + - "∖": [T: "minus"] # 0x2216 (en: 'set minus') + - "∗": [T: "ganger"] # 0x2217 (en: 'times') + - "∘": [T: "sammensatt med"] # 0x2218 (en: 'composed with') + - "∙": # 0x2219 + - test: + if: "@data-chem-formula-op" + then: [T: "ganger"] # (en: 'dot', google translation) + else: [T: "ganger"] # (en: 'times') + + - "∛": # 0x221b # audit-ignore + - T: "kubikkroten av" # (en: 'cube root of') + - "∜": # 0x221c # audit-ignore + - T: "fjerderoten av" # (en: 'fourth root of') + - "∞": [T: "uendelig"] # 0x221e (en: 'infinity') + - "∟": [T: "rett vinkel"] # 0x221f (en: 'right angle') + - "∠": [T: "vinkel"] # 0x2220 (en: 'angle') + - "∥": [T: "mĂ„lt vinkel"] # 0x2221 (en: 'measured angle') + - "∹": [T: "sfĂŠrisk vinkel"] # 0x2222 (en: 'spherical angle') + - "∣": [T: "deler"] # 0x2223 (en: 'divides') + - "∀": [T: "deler ikke"] # 0x2224 (en: 'does not divide') + - "∧": [T: "og"] # 0x2227 (en: 'and') + - "√": [T: "eller"] # 0x2228 (en: 'or') + - "∩": [T: "snitt"] # 0x2229 (en: 'intersection') + - "âˆȘ": [T: "union"] # 0x222a + - "∫": [T: "integralet"] # 0x222b + - "∏": [T: "dobbeltintegralet"] # 0x222c (en: 'double integral') + - "∭": [T: "trippelintegralet"] # 0x222d (en: 'triple integral') + - "∟": [T: "kurveintegralet"] # 0x222e (en: 'contour integral') + - "∯": [T: "flateintegralet"] # 0x222f (en: 'surface integral') + - "∰": [T: "volumintegralet"] # 0x2230 (en: 'volume integral') + - "∱": [T: "integralet med klokken"] # 0x2231 (en: 'clockwise integral', MathPlayer: 'clockwise integral', google: 'medurs integrerad') + - "âˆČ": [T: "kurveintegralet med klokken"] # 0x2232 (en: 'clockwise contour integral', MathPlayer: 'clockwise contour integral (arrow on höger)', google: 'medurs konturintegral') + - "∳": [T: "kurveintegralet mot klokken"] # 0x2233 (en: 'anticlockwise contour integral', MathPlayer: 'anticlockwise contour integral', google: 'antikvis konturintegral') + - "∎": [T: "derfor"] # 0x2234 (en: 'therefore') + - "∔": [T: "ettersom"] # 0x2235 (en: 'because') + - "∶": # 0x2236 # audit-ignore + - T: "til" # (en: 'to') + - "∷": [T: "som"] # 0x2237 (en: 'as', MathPlayer: 'proportion', google: 'som') + - "∞": [T: "prikk minus"] # 0x2238 (en: 'dot minus') + - "âˆč": [T: "har overskudd sammenlignet med"] # 0x2239 (en: 'has excess compared to', MathPlayer: 'excess', google: 'har överskott jĂ€mfört med') + - "âˆș": # 0x223a + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "geometrisk proporsjonal med" # (en: 'geometrically proportional to') + - "∻": # 0x223b + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "homotetisk til" # (en: 'homothetic to', MathPlayer: 'homothetic', google: 'homotetisk till') + - "∜": [T: "omvendt tilde"] # 0x223d (en: 'reversed tilde') + - "∟": # 0x223e # audit-ignore + - T: "omvendt langstrakt s" # (en: 'most positive', MathPlayer: 'inverted lazy s', google: 'mest positiva') + - "∿": [T: "sinuskurve"] # 0x223f (en: 'sine wave') + - "≀": [T: "kransprodukt"] # 0x2240 (en: 'wreath product') + - "≁": # 0x2241 (en: 'not tilde') # audit-ignore + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] + - T: "ikke proporsjonal med" + - "≂": [T: "minus tilde"] # 0x2242 (SRE: 'minus och tilde') + - "≃": # 0x2243 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] + - T: "asymptotisk lik" # (en: 'asymptotically equal to', MathPlayer: 'asymptotically lika med', google: 'asymptotisk lik') + - "≄": # 0x2244 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] + - T: "ikke asymptotisk lik" # (en: 'not asymptotically equal to', MathPlayer: 'inte asymptotically lika med', google: 'ikke asymptotisk lik') + - "≅": # 0x2245 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] + - T: "tilnĂŠrmet lik" # (en: 'approximately equal to', MathPlayer: 'approximativt lika med', google: 'omtrent lik') + - "≆": # 0x2246 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] + - T: "tilnĂŠrmet men faktisk ikke lik" # (en: 'approximately but not actually equal to', MathPlayer: 'approximativt men inte faktiskt lika med', google: 'omtrentlig men faktisk ikke lik') + - "≇": # 0x2247 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] + - T: "verken tilnĂŠrmet eller faktisk lik" # (en: 'neither approximately nor actually equal to', MathPlayer: 'varken approximativt eller fakiskt lika med', google: 'varken ungefĂ€r eller faktiskt lika med') + - "≈": # 0x2248 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] + - T: "tilnĂŠrmet lik" # (en: 'almost equal to', SRE: 'Ă€r nĂ€stan lika med') + - "≉": # 0x2249 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] + - T: "ikke tilnĂŠrmet lik" # (en: 'not almost equal to', SRE: 'Ă€r inte nĂ€stan lika med') + - "≊": # 0x224a + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] + - T: "tilnĂŠrmet lik eller lik" # (en: 'almost equal or equal to', SRE: 'Ă€r nĂ€stan lika eller lika med') + - "≋": [T: "trippel tilde"] # 0x224b (en: 'triple tilde') + - "≌": [T: "er alle like med"] # 0x224c (en: 'are all equal to', MathPlayer: 'alla lika med') + - "≍": # 0x224d + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "ekvivalent med" # (en: 'equivalent to') + - "≎": # 0x224e + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "geometrisk ekvivalent med" # (en: 'geometrically equivalent to', MathPlayer: 'geometriskt lika med', google: 'geometriskt motsvarande') + - "≏": # 0x224f # audit-ignore + - T: "differansen mellom" # (en: 'difference between') + - "≐": [T: "nĂŠrmer seg grenseverdien"] # 0x2250 (en: 'approaches the limit') + - "≑": # 0x2251 # audit-ignore + - T: "geometrisk lik" # (en: 'geometrically equal to', SRE: 'Ă€r geometriskt lika med') + - "≒": # 0x2252 # audit-ignore + - T: "tilnĂŠrmet lik" # (en: 'approximately equal to or the image of', MathPlayer: 'uppskattningsvis lika med eller i likhet med', google: 'ungefĂ€r lika med eller bilden av') + - "≓": # 0x2253 # audit-ignore + - T: "tilnĂŠrmet lik" # (en: 'image of or approximately equal to', MathPlayer: 'i likhet med eller uppskattningsvis lika med', google: 'bild av eller ungefĂ€r lika med') + - "≔": [T: "definert som"] # 0x2254 (en: 'colon equals', MathPlayer: 'kolon lika med', google: 'kolon Ă€r lika med') + - "≕": [T: "lik kolon"] # 0x2255 (en: 'equals colon', MathPlayer: 'lika med kolon') + - "≖": [T: "ring i likhetstegn"] # 0x2256 (en: 'ring in equal to', SRE: 'Ă€r ring i lika med') + - "≗": # 0x2257 # audit-ignore + - T: "ring likhetstegn" # (en: 'approximately equal to') + - "≘": [T: "tilsvarer"] # 0x2258 (en: 'corresponds to') + - "≙": [T: "anslĂ„r"] # 0x2259 (en: 'estimates') + - "≚": # 0x225a + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "likevinklet med" # (en: 'equiangular to') + - "≛": [T: "stjerne lik"] # 0x225b (en: 'star equals') + # SWEDISH: misspelled delta to fix pronunciation + - "≜": [T: "delta lik"] # 0x225c (en: 'delta equals') + - "≝": [T: "er per definisjon lik"] # 0x225d (en: 'is defined to be') + - "≞": # 0x225e # audit-ignore + - T: "mĂ„les med" # (en: 'measured by') + - "≟": [T: "spĂžrsmĂ„l ved likhet"] # 0x225f (en: 'has an unknown relationship with') + - "≱": # 0x2262 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "ikke identisk med" # (en: 'not identical to') + - "≣": # 0x2263 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "strengt ekvivalent med" # (en: 'strictly equivalent to') + - "≹": # 0x2268 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "mindre enn men ikke lik" # (en: 'less than but not equal to') + - "≩": # 0x2269 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "stĂžrre enn men ikke lik" # (en: 'greater than but not equal to') + - "â‰Ș": # 0x226a + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "mye mindre enn" # (en: 'much less than') + - "≫": # 0x226b + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "mye stĂžrre enn" # (en: 'much greater than') + - "≬": # 0x226c + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "mellom" # (en: 'between') + - "≭": # 0x226d + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "ikke ekvivalent med" # (en: 'not equivalent to') + - "≼": # 0x226e + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "ikke mindre enn" # (en: 'not less than') + - "≯": # 0x226f + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "ikke stĂžrre enn" # (en: 'not greater than') + - "≰": # 0x2270 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "verken mindre enn eller lik" # (en: 'neither less than nor equal to') + - "≱": # 0x2271 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "verken stĂžrre enn eller lik" # (en: 'neither greater than nor equal to') + - "â‰Č": # 0x2272 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "mindre enn eller tilnĂŠrmet lik" # (en: 'less than or equivalent to') + - "≳": # 0x2273 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "stĂžrre enn eller tilnĂŠrmet lik" # (en: 'greater than or equivalent to') + - "≮": # 0x2274 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "verken mindre enn eller tilnĂŠrmet lik" # (en: 'neither less than nor equivalent to') + - "≔": # 0x2275 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "verken stĂžrre enn eller tilnĂŠrmet lik" # (en: 'neither greater than nor equivalent to') + - "≶": # 0x2276 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "mindre enn eller stĂžrre enn" # (en: 'less than or greater than') + - "≷": # 0x2277 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "stĂžrre enn eller mindre enn" # (en: 'greater than or less than') + - "≾": # 0x2278 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "verken mindre enn eller stĂžrre enn" # (en: 'neither less than nor greater than') + - "â‰č": # 0x2279 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "verken stĂžrre enn eller mindre enn" # (en: 'neither greater than nor less than') + - "â‰ș": [T: "foregĂ„r"] # 0x227a (en: 'precedes') + - "≻": [T: "fĂžlger"] # 0x227b (en: 'succeeds') + - "≌": [T: "foregĂ„r eller er lik"] # 0x227c (en: 'precedes or is equal to') + - "≜": [T: "fĂžlger eller er lik"] # 0x227d (en: 'succeeds or is equal to') + - "≟": [T: "foregĂ„r eller er ekvivalent med"] # 0x227e (en: 'precedes or is equivalent to') + - "≿": [T: "fĂžlger eller er ekvivalent med"] # 0x227f (en: 'succeeds or is equivalent to') + - "⊀": [T: "foregĂ„r ikke"] # 0x2280 (en: 'does not precede') + - "⊁": [T: "fĂžlger ikke"] # 0x2281 (en: 'does not succeed') + - "⊈": # 0x2288 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "verken en delmengde av eller lik" # (en: 'neither a subset of nor equal to') + - "⊉": # 0x2289 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "verken en overmengde av eller lik" # (en: 'neither a superset of nor equal to') + - "⊊": # 0x228a (en: 'subset of with not equal to') # audit-ignore +# SWEDISH: added test + - test: + if: "$Verbosity!='Terse'" + then: [T: "er en"] + - T: "ekte delmengde av" + - "⊋": # 0x228b (en: 'superset of with not equal to') # audit-ignore + # SWEDISH: added test + - test: + if: "$Verbosity!='Terse'" + then: [T: "er en"] + - T: "ekte overmengde av" + - "⊌": [T: "multimengde"] # 0x228c (SRE: 'multimĂ€ngd') + - "⊍": [T: "multimengde multiplikasjon"] # 0x228d (en: 'multiset multiplication') + - "⊎": [T: "multimengde union"] # 0x228e (SRE: 'multimĂ€ngdunion') + - "⊏": [T: "kvadratisk bilde av"] # 0x228f (en: 'square image of', MathPlayer: 'square image of', google: 'fyrkantig bild av') + - "⊐": [T: "kvadratisk original av"] # 0x2290 (en: 'square original of', MathPlayer: 'square original of', google: 'fyrkantig original av') + - "⊑": [T: "kvadratisk bilde av eller lik"] # 0x2291 (en: 'square image of or equal to', MathPlayer: 'square image of or equal to', google: 'fyrkantig bild av eller lika med') + - "⊒": [T: "kvadratisk original av eller lik"] # 0x2292 (en: 'square original of or equal to', MathPlayer: 'square original of or equal to', google: 'fyrkantig original av eller lika med') + # SWEDISH: misspelled to fix pronunciation + - "⊓": [T: "kvadratisk snitt"] # 0x2293 (en: 'square cap') + - "⊔": [T: "kvadratisk union"] # 0x2294 (SRE: 'kvadratisk kopp') + - "⊕": [T: "direkte sum"] # 0x2295 (en: 'circled plus') + - "⊖": [T: "symmetrisk differanse"] # 0x2296 (en: 'circled minus') + - "⊗": [T: "tensorprodukt"] # 0x2297 (en: 'circled times') + - "⊘": [T: "divisjon i sirkel"] # 0x2298 (en: 'circled slash') + - "⊙": [T: "direkte produkt"] # 0x2299 (en: 'circled dot operator') + - "⊚": [T: "ring-operator i sirkel"] # 0x229a (en: 'circled ring') + - "⊛": [T: "asterisk-operator i sirkel"] # 0x229b (en: 'circled asterisk') + - "⊜": [T: "likhetstegn i sirkel"] # 0x229c (en: 'circled equals') + - "⊝": [T: "tankestrek i sirkel"] # 0x229d (en: 'circled dash') + - "⊞": [T: "plusstegn i kvadrat"] # 0x229e (en: 'squared plus') + - "⊟": [T: "minustegn i kvadrat"] # 0x229f (en: 'squared minus') + - "⊠": [T: "multiplikasjonstegn i kvadrat"] # 0x22a0 (en: 'squared times') + - "⊡": [T: "dot-operator i kvadrat"] # 0x22a1 (en: 'squared dot operator') + - "⊱": [T: "beviser"] # 0x22a2 (en: 'proves') + - "⊣": [T: "beviser ikke"] # 0x22a3 (en: 'does not yield') + - "⊀": [T: "topp"] # 0x22a4 (en: 'top') + - "⊄": # 0x22a5 # audit-ignore + - T: "bunn" # (en: 'bottom', MathPlayer: 'up tack', google: 'botten') + - "⊩": [T: "reduseres til"] # 0x22a6 (en: 'reduces to') + - "⊧": [T: "modellerer"] # 0x22a7 (en: 'models', MathPlayer: 'models') + - "⊹": # 0x22a8 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "sant" # (en: 'true') + - "⊩": [T: "tvinger"] # 0x22a9 (en: 'forces') + - "âŠȘ": [T: "tre vertikale streker hĂžyre dreiekors"] # 0x22aa (en: 'triple vertical bar right turnstile') + - "⊫": [T: "dobbel vertikal strek dobbelt hĂžyre dreiekors"] # 0x22ab (en: 'double vertical bar double right turnstile') + - "⊬": [T: "beviser ikke"] # 0x22ac (en: 'does not prove') + - "⊭": # 0x22ad + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "ikke sant" # (en: 'not true') + - "⊼": [T: "tvinger ikke"] # 0x22ae (en: 'does not force') + - "⊯": [T: "overstrĂžket dobbel vertikal strek dobbelt hĂžyre dreiekors"] # 0x22af (en: 'negated double vertical bar double right turnstile') + - "⊰": [T: "foregĂ„r under relasjon"] # 0x22b0 (en: 'precedes under relation', MathPlayer: 'precedes under relation', google: 'gĂ„r foran under relasjon') + - "⊱": [T: "fĂžlger under relasjon"] # 0x22b1 (en: 'succeeds under relation', MathPlayer: 'succeeds under relation', google: 'lyckas under relation') + - "âŠČ": # 0x22b2 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er en"] # (en: 'is', google translation) + - T: "normal undergruppe av" # (en: 'a normal subgroup of') + - "⊳": [T: "inneholder som normal undergruppe"] # 0x22b3 (en: 'contains as a normal subgroup') + - "⊮": # 0x22b4 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er en"] # (en: 'is', google translation) + - T: "normal undergruppe av eller lik" # (en: 'a normal subgroup of or equal to') + - "⊔": [T: "inneholder som normal undergruppe eller lik"] # 0x22b5 (en: 'contains as a normal subgroup or equal to') + - "⊶": # 0x22b6 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "definisjonsmengden til" # (en: 'the original of', MathPlayer: 'original of', google: 'originalet av') + - "⊷": # 0x22b7 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "verdimengden til" # (en: 'an image of', MathPlayer: 'image of', google: 'en bild av') + - "⊾": [T: "multimap"] # 0x22b8 (SRE: 'multimatris') + - "âŠč": [T: "hermitisk matrise"] # 0x22b9 (SRE: 'hermetisk konjugatmatris') + - "âŠș": [T: "innskudd"] # 0x22ba (en: 'intercalate', MathPlayer: 'intercalate', google: 'interkalat') + - "⊻": [T: "eksklusiv eller"] # 0x22bb (en: 'xor') + - "⊌": [T: "ikke-og"] # 0x22bc (en: 'nand') + - "⊜": [T: "ikke-eller"] # 0x22bd (en: 'nor') + - "⊟": [T: "rett vinkel med bue"] # 0x22be (en: 'right angle with arc') + - "⊿": [T: "rettvinklet trekant"] # 0x22bf (en: 'right triangle') + - "⋀": [T: "logisk og"] # 0x22c0 (en: 'logical and') + - "⋁": [T: "logisk eller"] # 0x22c1 (en: 'logical or') + # SWEDISH: misspelled to fix pronunciation + - "⋂": [T: "snitt"] # 0x22c2 (en: 'intersection') + - "⋃": [T: "union"] # 0x22c3 + - "⋄": [T: "diamant-operator"] # 0x22c4 + - "⋅": # 0x22c5 + - test: + if: "@data-chem-formula-op" + then: [T: "ganger"] # (en: 'dot', google translation) + else: [T: "ganger"] # (en: 'times') + + - "⋆": [T: "stjerne"] # 0x22c6 (en: 'times') + - "⋇": [T: "divisjon ganger"] # 0x22c7 (en: 'division times') + - "⋈": [T: "naturlig join"] # 0x22c8 (en: 'bowtie', MathPlayer: 'bowtie') + - "⋉": # 0x22c9 # audit-ignore + - T: "venstre semi-join" # (en: 'the left normal factor semidirect product of') + - "⋊": # 0x22ca # audit-ignore + - T: "hĂžyre semi-join" # (en: 'the right normal factor semidirect product of') + - "⋋": # 0x22cb # audit-ignore + - T: "venstre semi-direkte produkt" # (en: 'the left semidirect product of') + - "⋌": # 0x22cc # audit-ignore + - T: "hĂžyre semi-direkte produkt" # (en: 'the right semidirect product of') + - "⋍": [T: "omvendt tilde likhetstegn"] # 0x22cd (en: 'reversed tilde equals') + - "⋎": [T: "krĂžllete logisk eller"] # 0x22ce + - "⋏": [T: "krĂžllete logisk og"] # 0x22cf (en: 'curly logical and') + - "⋐": # 0x22d0 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er en"] # (en: 'is', google translation) + - T: "dobbel delmengde av" # (en: 'a double subset of') + - "⋑": # 0x22d1 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er en"] # (en: 'is', google translation) + - T: "dobbel overmengde av" # (en: 'a double superset of') + - "⋒": # 0x22d2 # audit-ignore + - T: "det doble snittet av" # (en: 'double intersection of') + - "⋓": # 0x22d3 # audit-ignore + - T: "den doble unionen av" # (en: 'double union of') + - "⋔": # 0x22d4 # audit-ignore + - T: "det ekte snittet av" # (en: 'proper intersection of', MathPlayer: 'pitchfork', google: 'korrekt skĂ€rningspunkt av') + - "⋕": # 0x22d5 # audit-ignore + - T: "lik og parallell med" # (en: 'equal to and parallel to') + - "⋖": [T: "mindre enn med prikk"] # 0x22d6 (en: 'less than with dot') + - "⋗": [T: "stĂžrre enn med prikk"] # 0x22d7 (en: 'greater than with dot') + - "⋘": # 0x22d8 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "veldig mye mindre enn" # (en: 'very much less than') + - "⋙": # 0x22d9 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "veldig mye stĂžrre enn" # (en: 'very much greater than') + - "⋚": # 0x22da + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "mindre enn lik eller stĂžrre enn" # (en: 'less than equal to or greater than') + - "⋛": # 0x22db + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "stĂžrre enn lik eller mindre enn" # (en: 'greater than equal to or less than') + - "⋜": # 0x22dc + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "lik eller mindre enn" # (en: 'equal to or less than') + - "⋝": # 0x22dd + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "lik eller stĂžrre enn" # (en: 'equal to or greater than') + - "⋞": # 0x22de + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "lik eller foregĂ„r" # (en: 'equal to or precedes') + - "⋟": # 0x22df + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "lik eller fĂžlger" # (en: 'equal to or succeeds') + - "⋠": [T: "verken foregĂ„r eller er lik"] # 0x22e0 (en: 'does not precede nor is equal to') + - "⋡": [T: "verken fĂžlger eller er lik"] # 0x22e1 (en: 'does not succeed nor is equal to') + - "⋱": [T: "verken et kvadratisk bilde av eller lik"] # 0x22e2 + - "⋣": [T: "verken kvadratisk original av eller lik"] # 0x22e3 + - "â‹€": [T: "kvadratisk bilde av eller ikke lik"] # 0x22e4 + - "â‹„": [T: "kvadratisk original av eller ikke lik"] # 0x22e5 + - "⋩": # 0x22e6 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "mindre enn men ikke ekvivalent med" # (en: 'less than but not equivalent to') + - "⋧": # 0x22e7 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "stĂžrre enn men ikke ekvivalent med" # (en: 'greater than but not equivalent to') + - "⋹": [T: "foregĂ„r men er ikke ekvivalent med"] # 0x22e8 (en: 'precedes but is not equivalent to') + - "⋩": [T: "fĂžlger men er ikke ekvivalent med"] # 0x22e9 (en: 'succeeds but is not equivalent to') + - "â‹Ș": # 0x22ea + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "ikke en normal undergruppe av" # (en: 'not a normal subgroup of') + - "⋫": [T: "inneholder ikke som normal undergruppe"] # 0x22eb (en: 'does not contain as a normal subgroup') + - "⋬": # 0x22ec + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "verken en normal undergruppe av eller lik" # (en: 'not a normal subgroup of nor is equal to') + - "⋭": [T: "verken inneholder som normal undergruppe eller er lik"] # 0x22ed (en: 'does not contain as a normal subgroup nor is equal to') + - "⋼": [T: "vertikal ellipse"] # 0x22ee (en: 'vertical ellipsis') + - "⋯": [T: "halvhĂžy horisontal ellipse"] # 0x22ef (en: 'dot dot dot') + - "⋰": [T: "diagonal ellipse oppover"] # 0x22f0 (en: 'upwards diagonal ellipsis') + - "⋱": [T: "diagonal ellipse nedover"] # 0x22f1 (en: 'diagonal ellipsis') + - "â‹Č": [T: "tilhĂžrer med lang horisontal strek"] # 0x22f2 (en: 'element of with long horizontal stroke') + - "⋳": [T: "tilhĂžrer med vertikal strek pĂ„ slutten av horisontal strek"] # 0x22f3 (en: 'element of with vertical bar at end of horizontal stroke') + - "⋮": [T: "tilhĂžrer med vertikal strek pĂ„ slutten av horisontal strek"] # 0x22f4 (en: 'element of with vertical bar at end of horizontal stroke') + - "â‹”": [T: "tilhĂžrer med prikk over"] # 0x22f5 (en: 'element of with dot above') + - "⋶": [T: "tilhĂžrer med strek over"] # 0x22f6 (en: 'element of with overbar') + - "⋷": [T: "tilhĂžrer med strek over"] # 0x22f7 (en: 'element of with overbar', MathPlayer: 'element of or equal to', google: 'element av med överbar') + - "⋾": [T: "tilhĂžrer med strek under"] # 0x22f8 (en: 'element of with underbar') + - "â‹č": [T: "tilhĂžrer med to horisontale streker"] # 0x22f9 (en: 'element of with two horizontal strokes') + - "â‹ș": [T: "inneholder med lang horisontal strek"] # 0x22fa (en: 'contains with long horizontal stroke') + - "⋻": [T: "inneholder med vertikal strek pĂ„ slutten av horisontal strek"] # 0x22fb (en: 'contains with vertical bar at end of horizontal stroke') + - "⋌": [T: "inneholder med vertikal strek pĂ„ slutten av horisontal strek"] # 0x22fc (en: 'contains with vertical bar at end of horizontal stroke') + - "⋜": [T: "inneholder med strek over"] # 0x22fd (en: 'contains with overbar', MathPlayer: 'contains or equal to', google: 'innehĂ„ller med overbar') + - "⋟": [T: "inneholder med strek over"] # 0x22fe (en: 'contains with overbar') + - "⋿": [T: "tilhĂžrer ifĂžlge z-notation"] # 0x22ff (en: 'z notation bag membership', MathPlayer: 'z notation bag membership', google: 'z medlemskap för notation bag') + #------------------------------------------------------------------------------------------------------------- + #Miscellaneous Technical OK + - "⌀": [T: "diameter"] # 0x2300 + - "⌁": [T: "elektrisk pil"] # 0x2301 (en: 'electric arrow') + - "⌂": [T: "hus"] # 0x2302 (en: 'house') + - "⌃": [T: "pilspiss opp"] # 0x2303 (en: 'up arrowhead', google: 'upp pilspetsen') + - "⌄": [T: "pilspiss ned"] # 0x2304 (en: 'down arrowhead', google: 'ner pilspetsen') + - "⌅": [T: "projektiv"] # 0x2305 (en: 'projective') + - "⌆": [T: "perspektiv"] # 0x2306 (en: 'perspective') + - "⌇": [T: "bĂžlget linje"] # 0x2307 (en: 'wavy line', google: 'wavy line') + - "⌈": [T: "venstre tak"] # 0x2308 (en: 'left ceiling') + - "⌉": [T: "hĂžyre tak"] # 0x2309 (en: 'right ceiling') + - "⌊": [T: "venstre gulv"] # 0x230a (en: 'left floor') + - "⌋": [T: "hĂžyre gulv"] # 0x230b (en: 'right floor') + - "⌌": [T: "nedre hĂžyre utsnitt"] # 0x230c (en: 'bottom right crop') + - "⌍": [T: "nedre venstre utsnitt"] # 0x230d (en: 'bottom left crop') + - "⌎": [T: "Ăžvre hĂžyre utsnitt"] # 0x230e (en: 'top right crop') + - "⌏": [T: "Ăžvre venstre utsnitt"] # 0x230f (en: 'top left crop') + - "⌐": [T: "omvendt ikke"] # 0x2310 (en: 'reversed not sign') + - "⌑": [T: "kvadratisk rombe"] # 0x2311 (en: 'square lozenge', google: 'square pastill') + - "⌒": [T: "bue"] # 0x2312 (en: 'arc') + - "⌓": [T: "segment"] # 0x2313 + - "⌔": [T: "sektor"] # 0x2314 (en: 'sector') + - "⌕": [T: "telefonopptaker"] # 0x2315 (en: 'telephone recorder', google: 'telefoninspelare') + - "⌖": [T: "trĂ„dkors"] # 0x2316 (en: 'position indicator crosshairs', google: 'positionindikator korsstolar') + - "⌗": [T: "firkant"] # 0x2317 (google translation) + - "⌘": [T: "severdighet"] # 0x2318 (en: 'place of interest sign', google: 'plats för rĂ€ntetecken') + - "⌙": [T: "rotert ikke"] # 0x2319 (en: 'turned not sign', google translation) + - "⌚": [T: "klokke"] # 0x231a (en: 'watch', google: 'kolla pĂ„') + - "⌛": [T: "timeglass"] # 0x231b (en: 'hourglass', google translation) + - "⌜": [T: "Ăžvre venstre hjĂžrne"] # 0x231c (en: 'top left corner') + - "⌝": [T: "Ăžvre hĂžyre hjĂžrne"] # 0x231d (en: 'top right corner') + - "⌞": [T: "nedre venstre hjĂžrne"] # 0x231e (en: 'bottom left corner') + - "⌟": [T: "nedre hĂžyre hjĂžrne"] # 0x231f (en: 'bottom right corner') + - "⌠": [T: "Ăžvre halvdel integral"] # 0x2320 (en: 'top half integral') + - "⌡": [T: "nedre halvdel integral"] # 0x2321 (en: 'bottom half integral') + - "⌱": [T: "rynke"] # 0x2322 (en: 'frown', google: 'rynka pannan') + - "⌣": [T: "smil"] # 0x2323 (en: 'smile') + - "⌀": [T: "enter"] # 0x2324 (en: 'up arrowhead between two horizontal bars', google: 'upp pilspetsen mellan tvĂ„ horisontella staplar') + - "⌄": [T: "option-tast"] # 0x2325 (en: 'option key', google translation) + - "〈": [T: "delete"] # 0x2326 (en: 'erase to the right', google translation) + - "⌧": [T: "clear"] # 0x2327 (en: 'x in a rectangle box', google translation) + - "⌹": [T: "tastatur"] # 0x2328 (en: 'keyboard', google translation) + - "〈": [T: "venstre vinkelparentes"] # 0x2329 (en: 'left pointing angle bracket') + - "âŒȘ": [T: "hĂžyre vinkelparentes"] # 0x232a (en: 'right pointing angle bracket') + - "⌫": [T: "backspace"] # 0x232b (en: 'erase to the left', google translation) + - "⌬": [T: "benzenring"] # 0x232c (en: 'benzene ring', google translation) + - "⌭": [T: "sylindrisitet"] # 0x232d + - "⌼": [T: "all around profile"] # 0x232e (google: 'runt profilen') + - "⌯": [T: "symmetri"] # 0x232f (en: 'symmetry', google translation) + - "⌰": [T: "total runout"] # 0x2330 (google translation) + - "⌱": [T: "dimensjon origo"] # 0x2331 (google translation) + - "âŒČ": [T: "konisk avsmalning"] # 0x2332 (en: 'conical taper', google translation) + - "⌳": [T: "helning"] # 0x2333 (en: 'slope', google translation) + - "⌮": [T: "plansenkning"] # 0x2334 (en: 'counterbore', google translation) + - "⌔": [T: "forsenkning"] # 0x2335 (en: 'countersink', google translation) + - "⌶": [T: "apl i beam"] # 0x2336 + - "⌜": [T: "apl circle stile"] # 0x233d + - "⌿": [T: "apl slash bar"] # 0x233f + - "⍌": [T: "rett vinkel med nedover sikksakk-pil"] # 0x237c + - "⎔": [T: "heksagon"] # 0x2394 + - "⎶": [T: "nedre hakeparentes over Ăžvre hakeparentes"] # 0x23b6 + - "⏜": [T: "Ăžvre parentes"] # 0x23dc + - "⏝": [T: "nedre parentes"] # 0x23dd + - "⍰": [T: "ukjent boks"] # 0x2370 (en: 'unknown box', google: 'okĂ€nd ruta') + - "⎕": [T: "boks"] # 0x2395 (en: 'box', google translation) + - "⏞": [T: "Ăžvre krĂžllparentes"] # 0x23DE (en: 'top brace') + - "⏟": [T: "nedre krĂžllparentes"] # 0x23DF (en: 'bottom brace') + - "⏠": [T: "Ăžvre skilpaddeskall-parentes"] # 0x23e0 + - "⏡": [T: "nedre skilpaddeskall-parentes"] # 0x23e1 + - "⏱": [T: "hvit trapes"] # 0x23e2 + - "⏣": [T: "benzenring med sirkel"] # 0x23e3 + - "⏀": [T: "retthet"] # 0x23e4 + - "⏄": [T: "flathet"] # 0x23e5 + - "⏊": [T: "vekselstrĂžm"] # 0x23e6 + - "⏧": [T: "elektrisk skjĂŠring"] # 0x23e7 + #---------------------------------------------------------------------------------------------------- + #Enclosed Alphanumerics OK + - "①-⑹": # 0x2460 - 0x2469 + # SWEDISH: switched order + - SPELL: "translate('.', '①⑥⑹④⑀⑄⑊⑧⑚', '123456789')" + - T: "i sirkel" # (en: 'circled') + - "⑩": [T: "ti i sirkel"] # 0x2469 (en: 'circled ten', google translation) + - "â‘Ș": [T: "elleve i sirkel"] # 0x246a (en: 'circled eleven', google translation) + - "⑫": [T: "tolv i sirkel"] # 0x246b (en: 'circled twelve', google translation) + - "⑬": [T: "tretten i sirkel"] # 0x246c (en: 'circled thirteen', google translation) + - "⑭": [T: "fjorten i sirkel"] # 0x246d (en: 'circled fourteen', google translation) + - "⑼": [T: "femten i sirkel"] # 0x246e (en: 'circled fifteen', google translation) + - "⑯": [T: "seksten i sirkel"] # 0x246f (en: 'circled sixteen', google translation) + - "⑰": [T: "sytten i sirkel"] # 0x2470 (en: 'circled seventeen', google translation) + - "⑱": [T: "atten i sirkel"] # 0x2471 (en: 'circled eighteen', google translation) + - "⑳": [T: "tjue i sirkel"] # 0x2473 (en: 'circled twenty', google translation) + - "⑮-⑌": # 0x2474 - 0x247d + # SWEDISH: switched order + - SPELL: "translate('.', '⑎⑔⑶⑷⑞â‘čâ‘ș⑻⑌', '123456789')" + - T: "i parentes" # (en: 'parenthesized', google translation) + - "⑜": [T: "ti i parentes"] # 0x247d (en: 'parenthesized ten', google translation) + - "⑟": [T: "elleve i parentes"] # 0x247e (en: 'parenthesized eleven', google translation) + - "⑿": [T: "tolv i parentes"] # 0x247f (en: 'parenthesized twelve', google translation) + - "⒀": [T: "tretten i parentes"] # 0x2480 (en: 'parenthesized thirteen', google translation) + - "⒁": [T: "fjorten i parentes"] # 0x2481 (en: 'parenthesized fourteen', google translation) + - "⒂": [T: "femten i parentes"] # 0x2482 (en: 'parenthesized fifteen', google translation) + - "⒃": [T: "seksten i parentes"] # 0x2483 (en: 'parenthesized sixteen', google translation) + - "⒄": [T: "sytten i parentes"] # 0x2484 (en: 'parenthesized seventeen', google translation) + - "⒅": [T: "atten i parentes"] # 0x2485 (en: 'parenthesized eighteen', google translation) + - "⒆": [T: "nitten i parentes"] # 0x2486 (en: 'parenthesized nineteen', google translation) + - "⒇": [T: "tjue i parentes"] # 0x2487 (en: 'parenthesized twenty', google translation) + - "⒈-⒐": # 0x2488 - 0x2491 + - SPELL: "translate('.', '⒈⒉⒊⒋⒌⒍⒎⒏⒐', '123456789')" + - T: "med punktum" # (en: 'with period', google translation) + - "⒑": [T: "ti med punktum"] # 0x2491 (en: 'ten with period', google translation) + - "⒒": [T: "elleve med punktum"] # 0x2492 (en: 'eleven with period', google translation) + - "⒓": [T: "tolv med punktum"] # 0x2493 (en: 'twelve with period', google translation) + - "⒔": [T: "tretten med punktum"] # 0x2494 (en: 'thirteen with period', google translation) + - "⒕": [T: "fjorten med punktum"] # 0x2495 (en: 'fourteen with period', google translation) + - "⒖": [T: "femten med punktum"] # 0x2496 (en: 'fifteen with period', google translation) + - "⒗": [T: "seksten med punktum"] # 0x2497 (en: 'sixteen with period', google translation) + - "⒘": [T: "sytten med punktum"] # 0x2498 (en: 'seventeen with period', google translation) + - "⒙": [T: "atten med punktum"] # 0x2499 (en: 'eighteen with period', google translation) + - "⒚": [T: "nitten med punktum"] # 0x249a (en: 'nineteen with period', google translation) + - "⒛": [T: "tjue med punktum"] # 0x249b (en: 'twenty with period', google translation) + - "⒜-â’”": # 0x249c - 0x24b5 + # SWEDISH: switched order + - SPELL: "translate('.', 'â’œâ’â’žâ’Ÿâ’ â’Ąâ’ąâ’Łâ’€â’„â’Šâ’§â’šâ’©â’Șâ’«â’Źâ’­â’źâ’Żâ’°â’±â’Čâ’łâ’Žâ’”', 'abcdefghijklmnopqrstuvwxyz')" + - T: "i parentes" # (en: 'parenthesized', google translation) + + - "Ⓐ-Ⓩ": # 0x24b6 - 0x24cf + # SWEDISH: switched order + - SPELL: "translate('.', 'â’¶â’·â’žâ’čâ’șâ’»â’Œâ’œâ’Ÿâ’żâ“€â“â“‚â“ƒâ“„â“…â“†â“‡â“ˆâ“‰â“Šâ“‹â“Œâ“â“Žâ“', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - T: "i sirkel" # (en: 'circled', google translation) + + - "🅐-đŸ…©": # 0x1f150 - 0x1f169 + # switched order + - SPELL: "translate('.', 'đŸ…đŸ…‘đŸ…’đŸ…“đŸ…”đŸ…•đŸ…–đŸ…—đŸ…˜đŸ…™đŸ…šđŸ…›đŸ…œđŸ…đŸ…žđŸ…ŸđŸ… đŸ…ĄđŸ…ąđŸ…ŁđŸ…€đŸ…„đŸ…ŠđŸ…§đŸ…šđŸ…©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - T: "i fylt sirkel" # (en: 'black circled', google translation) + + - "ⓐ-ⓩ": # 0x24d0 - 0x24e9 + # SWEDISH: switched order + - SPELL: "translate('.', 'â“â“‘â“’â““â“”â“•â“–â“—â“˜â“™â“šâ“›â“œâ“â“žâ“Ÿâ“ â“Ąâ“ąâ“Łâ“€â“„â“Šâ“§â“šâ“©', 'abcdefghijklmnopqrstuvwxyz')" + - T: "i sirkel" # (en: 'circled', google translation) + - "â“Ș": [T: "null i sirkel"] # 0x24ea (google translation) + - "⓫": [T: "elleve i fylt sirkel"] # 0x24eb (en: 'black circled eleven', google translation) + - "⓬": [T: "tolv i fylt sirkel"] # 0x24ec (en: 'black circled twelve', google translation) + - "⓭": [T: "tretten i fylt sirkel"] # 0x24ed (en: 'black circled thirteen', google translation) + - "⓼": [T: "fjorten i fylt sirkel"] # 0x24ee (en: 'black circled fourteen', google translation) + - "⓯": [T: "femten i fylt sirkel"] # 0x24ef (en: 'black circled fifteen', google translation) + - "⓰": [T: "seksten i fylt sirkel"] # 0x24f0 (en: 'black circled sixteen', google translation) + - "⓱": [T: "sytten i fylt sirkel"] # 0x24f1 (en: 'black circled seventeen', google translation) + - "â“Č": [T: "atten i fylt sirkel"] # 0x24f2 (en: 'black circled eighteen', google translation) + - "⓳": [T: "nitten i fylt sirkel"] # 0x24f3 (en: 'black circled nineteen', google translation) + - "⓮": [T: "tjue i fylt sirkel"] # 0x24f4 (en: 'black circled twenty', google translation) + - "â“”-ⓜ": # 0x24f5 - 0x24fe + # SWEDISH: switched order + - SPELL: "translate('.', 'ⓔ⓶⓷ⓞâ“čâ“ș⓻Ⓦⓜ', '123456789')" + - T: "i dobbel sirkel" # (en: 'double circled', google translation) + - "ⓟ": [T: "ti i dobbel sirkel"] # 0x24fe (en: 'double circled ten', google translation) + - "⓿": [T: "null i fylt sirkel"] # 0x24ff (en: 'black circled zero', google translation) + #------------------------------------------------------------------------------------------------------------------ + #Geometric shapes OK + - "■": [T: "svart kvadrat"] # 0x25a0 (en: 'black square') + - "□": [T: "hvitt kvadrat"] # 0x25a1 (en: 'white square') + - "▱": [T: "hvitt kvadrat med avrundede hjĂžrner"] # 0x25a2 (en: 'white square with rounded corners', google: 'vit fyrkant med rundade hörn') + - "▣": [T: "lite svart kvadrat i hvitt kvadrat"] # 0x25a3 (en: 'white square containing small black square', google: 'vit fyrkant som innehĂ„ller en liten svart fyrkant') + - "â–€": [T: "kvadrat med horisontalt fyll"] # 0x25a4 (en: 'square with horizontal fill', google: 'fyrkantig med horisontell fyllning') + - "â–„": [T: "kvadrat med vertikalt fyll"] # 0x25a5 (en: 'square with vertical fill', google: 'fyrkantig med vertikal fyllning') + - "▩": [T: "kvadrat med ortogonal skravering"] # 0x25a6 (en: 'square with orthogonal crosshatch fill', google: 'fyrkantig med ortogonal crosshatch -fyllning') + - "▧": [T: "kvadrat med fyll fra Ăžvre venstre til nedre hĂžyre"] # 0x25a7 (en: 'square with upper left to lower right fill', google: 'fyrkantig med övre vĂ€nster till nedre högra fyllning') + - "▹": [T: "kvadrat med fyll fra Ăžvre hĂžyre til nedre venstre"] # 0x25a8 (en: 'square with upper right to lower left fill', google: 'fyrkantig med övre höger till nedre vĂ€nsterfyllning') + - "▩": [T: "kvadrat med diagonal skravering"] # 0x25a9 (en: 'square with diagonal crosshatch fill', google: 'fyrkantig med diagonal korshatchfyllning') + - "â–Ș": [T: "lite svart kvadrat"] # 0x25aa (en: 'black small square') + - "▫": [T: "lite hvitt kvadrat"] # 0x25ab (en: 'white small square') + - "▬": [T: "svart rektangel"] # 0x25ac (en: 'black rectangle') + - "▭": [T: "hvitt rektangel"] # 0x25ad (en: 'white rectangle') + - "▼": [T: "svart vertikalt rektangel"] # 0x25ae (en: 'black vertical rectangle') + - "▯": [T: "hvitt vertikalt rektangel"] # 0x25af (en: 'white vertical rectangle') + - "▰": [T: "svart parallellogram"] # 0x25b0 (en: 'black parallelogram') + - "▱": [T: "hvitt parallellogram"] # 0x25b1 (en: 'white parallelogram') + - "â–Č": [T: "svart oppoverpekende trekant"] # 0x25b2 (en: 'black up pointing triangle') + - "△": [T: "hvit oppoverpekende trekant"] # 0x25b3 (en: 'white up pointing triangle') + - "▮": [T: "liten svart oppoverpekende trekant"] # 0x25b4 (en: 'black up pointing small triangle') + - "â–”": [T: "liten hvit oppoverpekende trekant"] # 0x25b5 (en: 'white up pointing small triangle') + - "▶": [T: "svart hĂžyrepekende trekant"] # 0x25b6 (en: 'black right pointing triangle') + - "▷": [T: "hvit hĂžyrepekende trekant"] # 0x25b7 (en: 'white right pointing triangle') + - "▾": [T: "liten svart hĂžyrepekende trekant"] # 0x25b8 (en: 'black right pointing small triangle') + - "â–č": [T: "liten hvit hĂžyrepekende trekant"] # 0x25b9 (en: 'white right pointing small triangle') + - "â–ș": [T: "svart hĂžyre-peker"] # 0x25ba (en: 'black right pointing pointer', google: 'svart höger pekande pekare') + - "▻": [T: "hvit hĂžyre-peker"] # 0x25bb (en: 'white right pointing pointer', google: 'vit höger pekande pekare') + - "â–Œ": [T: "svart nedoverpekende trekant"] # 0x25bc (en: 'black down pointing triangle', MathPlayer: 'svart triangel med spetsen nerĂ„t', google: 'svart ner pekande triangel') + - "â–œ": [T: "hvit nedoverpekende trekant"] # 0x25bd (en: 'white down pointing triangle', MathPlayer: 'vit triangel med spetsen nerĂ„t', google: 'vit ner pekande triangel') + - "â–Ÿ": [T: "liten svart nedoverpekende trekant"] # 0x25be (en: 'black down pointing small triangle', MathPlayer: 'svart triangel med spetsen nerĂ„t', google: 'svart ner pekande liten triangel') + - "▿": [T: "liten hvit nedoverpekende trekant"] # 0x25bf (en: 'white down pointing small triangle', MathPlayer: 'vit triangel med spetsen nerĂ„t', google: 'vit ner pekande liten triangel') + - "◀": [T: "svart venstrepekende trekant"] # 0x25c0 (en: 'black left pointing triangle') + - "◁": [T: "hvit venstrepekende trekant"] # 0x25c1 (en: 'white left pointing triangle') + - "◂": [T: "liten svart venstrepekende trekant"] # 0x25c2 (en: 'black left pointing small triangle') + - "◃": [T: "liten hvit venstrepekende trekant"] # 0x25c3 (en: 'white left pointing small triangle') + - "◄": [T: "svart venstre-peker"] # 0x25c4 (en: 'black left pointing pointer') + - "◅": [T: "hvit venstre-peker"] # 0x25c5 (en: 'white left pointing pointer') + - "◆": [T: "svart diamant"] # 0x25c6 (en: 'black diamond') + - "◇": [T: "hvit diamant"] # 0x25c7 (en: 'white diamond') + - "◈": [T: "svart diamant i hvit diamant"] # 0x25c8 (en: 'white diamond containing black small diamond') + - "◉": [T: "fiskeĂžye"] # 0x25c9 (en: 'fisheye') + - "◊": [T: "rombe"] # 0x25ca (en: 'lozenge') + - "○": [T: "hvit sirkel"] # 0x25cb (en: 'white circle') + - "◌": [T: "stiplet sirkel"] # 0x25cc (en: 'dotted circle') + - "◍": [T: "sirkel med vertikalt fyll"] # 0x25cd (en: 'circle with vertical fill') + - "◎": [T: "bullseye"] # 0x25ce (SRE: 'mitt-i-prick') + - "●": [T: "svart sirkel"] # 0x25cf (en: 'black circle') + - "◐": [T: "sirkel med venstre halvdel fylt"] # 0x25d0 (en: 'circle with left half black') + - "◑": [T: "sirkel med hĂžyre halvdel fylt"] # 0x25d1 (en: 'circle with right half black') + - "◒": [T: "sirkel med nedre halvdel fylt"] # 0x25d2 (en: 'circle with lower half black') + - "◓": [T: "sirkel med Ăžvre halvdel fylt"] # 0x25d3 (en: 'circle with upper half black') + - "◔": [T: "sirkel med Ăžvre hĂžyre kvadrant fylt"] # 0x25d4 (en: 'circle with upper right quadrant black') + - "◕": [T: "sirkel fylt bortsett fra Ăžvre venstre kvadrant"] # 0x25d5 (en: 'circle with all but upper left quadrant black') + - "◖": [T: "venstre halvsirkel"] # 0x25d6 (en: 'left half black circle') + - "◗": [T: "hĂžyre halvsirkel"] # 0x25d7 (en: 'right half black circle') + - "◘": [T: "invertert punkt"] # 0x25d8 (en: 'inverse bullet') + - "◙": [T: "invertert hvit sirkel"] # 0x25d9 (en: 'inverse white circle') + - "◚": [T: "invertert hvit Ăžvre halvsirkel"] # 0x25da (en: 'upper half inverse white circle') + - "◛": [T: "invertert hvit nedre halvsirkel"] # 0x25db (en: 'lower half inverse white circle') + - "◜": [T: "Ăžvre venstre kvadrant av sirkelbue"] # 0x25dc (en: 'upper left quadrant circular arc') + - "◝": [T: "Ăžvre hĂžyre kvadrant av sirkelbue"] # 0x25dd (en: 'upper right quadrant circular arc') + - "◞": [T: "nedre hĂžyre kvadrant av sirkelbue"] # 0x25de (en: 'lower right quadrant circular arc') + - "◟": [T: "nedre venstre kvadrant av sirkelbue"] # 0x25df (en: 'lower left quadrant circular arc') + - "◠": [T: "Ăžvre halvsirkel"] # 0x25e0 (en: 'upper half circle') + - "◡": [T: "nedre halvsirkel"] # 0x25e1 (en: 'lower half circle') + - "◱": [T: "svart trekant ned til hĂžyre"] # 0x25e2 (en: 'black lower right triangle', MathPlayer: 'svart triangel nerĂ„t höger', google: 'svart nedre höger triangel') + - "◣": [T: "svart trekant ned til venstre"] # 0x25e3 (en: 'black lower left triangle', MathPlayer: 'svart triangel nerĂ„t vĂ€nster', google: 'svart nedre vĂ€nster triangel') + - "â—€": [T: "svart trekant oppe til venstre"] # 0x25e4 (en: 'black upper left triangle') + - "â—„": [T: "svart trekant oppe til hĂžyre"] # 0x25e5 (en: 'black upper right triangle') + - "◩": [T: "hvitt punkt"] # 0x25e6 (en: 'composition') + - "◧": [T: "kvadrat med venstre halvdel fylt"] # 0x25e7 (en: 'square with left half black') + - "◹": [T: "kvadrat med hĂžyre halvdel fylt"] # 0x25e8 (en: 'square with right half black') + - "◩": [T: "kvadrat med Ăžvre venstre halvdel fylt"] # 0x25e9 (en: 'square with upper left half black') + - "â—Ș": [T: "kvadrat med nedre hĂžyre halvdel fylt"] # 0x25ea (en: 'square with lower right half black') + - "◫": [T: "hvitt kvadrat med midtlinje"] # 0x25eb (en: 'white square with bisecting line') + - "◬": [T: "hvit oppoverpekende trekant med prikk"] # 0x25ec (en: 'white up pointing triangle with dot') + - "◭": [T: "oppoverpekende trekant med venstre halvdel fylt"] # 0x25ed (en: 'up pointing triangle with left half black') + - "◼": [T: "oppoverpekende trekant med hĂžyre halvdel fylt"] # 0x25ee (en: 'up pointing triangle with right half black') + - "◯": [T: "stor sirkel"] # 0x25ef (en: 'large circle') + - "◰": [T: "hvitt kvadrat med Ăžvre venstre kvadrant"] # 0x25f0 (en: 'white square with upper left quadrant', google: 'vit fyrkant med övre vĂ€nstra kvadrant') + - "◱": [T: "hvitt kvadrat med nedre venstre kvadrant"] # 0x25f1 (en: 'white square with lower left quadrant', google: 'vit fyrkant med nedre vĂ€nster kvadrant') + - "â—Č": [T: "hvitt kvadrat med nedre hĂžyre kvadrant"] # 0x25f2 (en: 'white square with lower right quadrant', google: 'vit fyrkant med nedre högra kvadrant') + - "◳": [T: "hvitt kvadrat med Ăžvre hĂžyre kvadrant"] # 0x25f3 (en: 'white square with upper right quadrant', google: 'vit fyrkant med övre högra kvadrant') + - "◮": [T: "hvit sirkel med Ăžvre venstre kvadrant"] # 0x25f4 (en: 'white circle with upper left quadrant', google: 'vit cirkel med övre vĂ€nstra kvadrant') + - "â—”": [T: "hvit sirkel med nedre venstre kvadrant"] # 0x25f5 (en: 'white circle with lower left quadrant') + - "◶": [T: "hvit sirkel med nedre hĂžyre kvadrant"] # 0x25f6 (en: 'white circle with lower right quadrant', google: 'vit cirkel med nedre högra kvadrant') + - "◷": [T: "hvit sirkel med Ăžvre hĂžyre kvadrant"] # 0x25f7 (en: 'white circle with upper right quadrant', google: 'vit cirkel med övre högra kvadrant') + - "◾": [T: "trekant oppe til venstre"] # 0x25f8 (en: 'upper left triangle') + - "â—č": [T: "trekant oppe til hĂžyre"] # 0x25f9 (en: 'upper right triangle') + - "â—ș": [T: "trekant ned til venstre"] # 0x25fa (en: 'lower left triangle') + - "◻": [T: "mellomstort hvitt kvadrat"] # 0x25fb (en: 'white medium square') + - "â—Œ": [T: "mellomstort svart kvadrat"] # 0x25fc (en: 'black medium square') + - "â—œ": [T: "hvitt middels lite kvadrat"] # 0x25fd (en: 'white medium small square') + - "â—Ÿ": [T: "svart middels lite kvadrat"] # 0x25fe (en: 'black medium small square') + - "◿": [T: "trekant ned til hĂžyre"] # 0x25ff (en: 'lower right triangle') + #------------------------------------------------------------------------------------------------ + #Miscellaneous symbols OK + - "★": [T: "svart stjerne"] # 0x2605 + - "☆": [T: "hvit stjerne"] # 0x2606 + - "☉": [T: "sol"] # 0x2609 + - "☌": [T: "konjunksjon"] # 0x260c + - "☒": [T: "avkrysningsboks med kryss"] # 0x2612 + - "☜": [T: "tiltagende mĂ„ne"] # 0x263d + - "☟": [T: "avtagende mĂ„ne"] # 0x263e + - "☿": [T: "merkur"] # 0x263f + - "♀": [T: "kvinne"] # 0x2640 + - "♁": [T: "jorda"] # 0x2641 + - "♂": [T: "mann"] # 0x2642 + - "♃": [T: "jupiter"] # 0x2643 + - "♄": [T: "saturn"] # 0x2644 + - "♅": [T: "uranus"] # 0x2645 + - "♆": [T: "neptun"] # 0x2646 + - "♇": [T: "pluto"] # 0x2647 + - "♈": [T: "vĂŠren"] # 0x2648 + - "♉": [T: "tyren"] # 0x2649 + - "♩": [T: "fjerdedelsnote"] # 0x2669 + - "♭": [T: "musikalsk b"] # 0x266d + - "♼": [T: "musikalsk opplĂžsningstegn"] # 0x266e + - "♯": [T: "musikalsk kryss"] # 0x266f + - "♠": [T: "svart spar"] # 0x2660 (en: 'black spade suit', google: 'svart spade kostym') + - "♡": [T: "hvit hjerter"] # 0x2661 (en: 'white heart suit', google: 'vit hjĂ€rtdrĂ€kt') + - "♱": [T: "hvit ruter"] # 0x2662 (en: 'white diamond suit', google: 'vit diamantdrĂ€kt') + - "♣": [T: "svart klĂžver"] # 0x2663 (en: 'black club suit', google: 'svart klubbdrĂ€kt') + - "♀": [T: "hvit spar"] # 0x2664 (en: 'white spade suit', google: 'vit spade kostym') + - "♄": [T: "svart hjerter"] # 0x2665 (en: 'black heart suit', google: 'black heart suit') + - "♩": [T: "svart ruter"] # 0x2666 (en: 'black diamond suit', google: 'svart diamantdrĂ€kt') + - "♧": [T: "hvit klĂžver"] # 0x2667 (en: 'white club suit', google: 'vit klubbdrĂ€kt') + - "⚀": [T: "terningkast 1"] # 0x2680 + - "⚁": [T: "terningkast 2"] # 0x2681 + - "⚂": [T: "terningkast 3"] # 0x2682 + - "⚃": [T: "terningkast 4"] # 0x2683 + - "⚄": [T: "terningkast 5"] # 0x2684 + - "⚅": [T: "terningkast 6"] # 0x2685 + - "⚆": [T: "hvit sirkel med prikk til hĂžyre"] # 0x2686 + - "⚇": [T: "hvit sirkel med to prikker"] # 0x2687 + - "⚈": [T: "svart sirkel med prikk til hĂžyre"] # 0x2688 + - "⚉": [T: "svart sirkel med to prikker"] # 0x2689 + - "âšȘ": [T: "mellomstor hvit sirkel"] # 0x26aa + - "⚫": [T: "mellomstor svart sirkel"] # 0x26ab + - "⚬": [T: "middels liten hvit sirkel"] # 0x26ac + - "âšČ": [T: "nĂžytral"] # 0x26b2 + + #------------------------------------------------------------------------------------------------ + #Dingbats OK + - "✓": [T: "avkrysningshake"] # 0x2713 + - "✠": [T: "malteserkors"] # 0x2720 + - "âœȘ": [T: "sirkel med hvit stjerne"] # 0x272a + - "✶": [T: "svart heksagram"] # 0x2736 + - "❚": [T: "venstreparentes"] # 0x2768 (en: 'medium left parentheses ornament', google: 'medium vĂ€nster-parentesesprydnad') + - "❩": [T: "hĂžyreparentes"] # 0x2769 (en: 'medium right parentheses ornament', google: 'medium höger parentesetheses ornament') + - "âȘ": [T: "avflatet venstreparentes"] # 0x276a (en: 'medium flattened left parentheses ornament', google: 'medium plattad vĂ€nster parentese -prydnad') + - "❫": [T: "avflatet hĂžyreparentes"] # 0x276b (en: 'medium flattened right parentheses ornament', google: 'medium platta höger parentesetheses prydnad') + - "❬": [T: "venstre vinkel-parentes"] # 0x276c (en: 'medium left-pointing angle bracket ornament', google: 'medium vĂ€nsterpekande vinkelfĂ€ste prydnad') + - "❭": [T: "hĂžyre vinkel-parentes"] # 0x276d (en: 'medium right-pointing angle bracket ornament', google: 'medium högerpekande vinkelfĂ€ste prydnad') + - "❼": [T: "fet venstre anfĂžrselstegn"] # 0x276e (en: 'heavy left-pointing angle quotation mark ornament', google: 'tung vĂ€nsterpekande vinkelcitationsmĂ€rke prydnad') + - "❯": [T: "fet hĂžyre anfĂžrselstegn"] # 0x276f (en: 'heavy right-pointing angle quotation mark ornament', google: 'tung högerpekande vinkelcitationsmĂ€rke prydnad') + - "❰": [T: "fet venstre vinkel-parentes"] # 0x2770 (en: 'heavy left-pointing angle bracket ornament', google: 'tung vĂ€nsterpekande vinkelfĂ€ste prydnad') + - "❱": [T: "fet hĂžyre vinkel-parentes"] # 0x2771 (en: 'heavy right-pointing angle bracket ornament', google: 'tung högerpekande vinkelfĂ€ste prydnad') + - "âČ": [T: "venstre skilpaddeskall-parentes"] # 0x2772 (en: 'light left tortoise shell bracket ornament', google: 'ljus vĂ€nster sköldpaddsskalfĂ€ste prydnad') + - "❳": [T: "hĂžyre skilpaddeskall-parentes"] # 0x2773 (en: 'light right tortoise shell bracket ornament', google: 'lĂ€tt höger sköldpaddsskalfĂ€ste prydnad') + - "❎": [T: "fet venstre krĂžllparentes"] # 0x2774 (en: 'medium left brace ornament', google: 'medium vĂ€nster stagprydnad') + - "❔": [T: "fet hĂžyre krĂžllparentes"] # 0x2775 (en: 'medium right brace ornament', google: 'medium höger stagprydnad') + - "❶": [T: "Ă©n i fylt sirkel"] # 0x2776 (en: 'black circled one', google translation) + - "❷": [T: "to i fylt sirkel"] # 0x2777 (en: 'black circled two', google translation) + - "❞": [T: "tre i fylt sirkel"] # 0x2778 (en: 'black circled three', google translation) + - "âč": [T: "fire i fylt sirkel"] # 0x2779 (en: 'black circled four', google translation) + - "âș": [T: "fem i fylt sirkel"] # 0x277a (en: 'black circled five', google translation) + - "❻": [T: "seks i fylt sirkel"] # 0x277b (en: 'black circled six', google translation) + - "❌": [T: "sju i fylt sirkel"] # 0x277c (en: 'black circled seven', google translation) + - "❜": [T: "Ă„tte i fylt sirkel"] # 0x277d (en: 'black circled eight', google translation) + - "❟": [T: "ni i fylt sirkel"] # 0x277e (en: 'black circled nine', google translation) + - "❿": [T: "ti i fylt sirkel"] # 0x277f (en: 'black circled ten', google translation) + - "➀": [T: "sans-serif Ă©n i sirkel"] # 0x2780 (en: 'circled sans serif one', google translation) + - "➁": [T: "sans-serif to i sirkel"] # 0x2781 (en: 'circled sans serif two', google translation) + - "➂": [T: "sans-serif tre i sirkel"] # 0x2782 (en: 'circled sans serif three', google translation) + - "➃": [T: "sans-serif fire i sirkel"] # 0x2783 (en: 'circled sans serif four', google translation) + - "➄": [T: "sans-serif fem i sirkel"] # 0x2784 (en: 'circled sans serif five', google translation) + - "➅": [T: "sans-serif seks i sirkel"] # 0x2785 (google translation) + - "➆": [T: "sans-serif sju i sirkel"] # 0x2786 (en: 'circled sans serif seven', google translation) + - "➇": [T: "sans-serif Ă„tte i sirkel"] # 0x2787 (en: 'circled sans serif eight', google translation) + - "➈": [T: "sans-serif ni i sirkel"] # 0x2788 (en: 'circled sans serif nine', google translation) + - "➉": [T: "sans-serif ti i sirkel"] # 0x2789 (en: 'circled sans serif ten', google translation) + - "➊": [T: "sans-serif Ă©n i fylt sirkel"] # 0x278a (en: 'black circled sans serif one', google translation) + - "➋": [T: "sans-serif to i fylt sirkel"] # 0x278b (en: 'black circled sans serif two', google translation) + - "➌": [T: "sans-serif tre i fylt sirkel"] # 0x278c (en: 'black circled sans serif three', google translation) + - "➍": [T: "sans-serif fire i fylt sirkel"] # 0x278d (google translation) + - "➎": [T: "sans-serif fem i fylt sirkel"] # 0x278e (google translation) + - "➏": [T: "sans-serif seks i fylt sirkel"] # 0x278f (google translation) + - "➐": [T: "sans-serif sju i fylt sirkel"] # 0x2790 (google translation) + - "➑": [T: "sans-serif Ă„tte i fylt sirkel"] # 0x2791 (en: 'black circled sans serif eight', google translation) + - "➒": [T: "sans-serif ni i fylt sirkel"] # 0x2792 (en: 'black circled sans serif nine', google translation) + - "➓": [T: "sans-serif ti i fylt sirkel"] # 0x2793 (google translation) + - "➔": [T: "fet hĂžyrepil"] # 0x2794 (en: 'heavy wide-headed rightwards arrow', google: 'tungt huvud med höger om höger pil') + - "➕": [T: "fet pluss"] # 0x2795 (en: 'heavy plus sign', google: 'tungt plus -tecken') + - "➖": [T: "fet minus"] # 0x2796 (en: 'heavy minus sign', google: 'tung minusskylt') + - "➗": [T: "fet division"] # 0x2797 (en: 'heavy division sign', google: 'tung uppdelningstecken') + - "➘": [T: "fet sĂžrĂžst-pil"] # 0x2798 (en: 'heavy south east arrow', google: 'tung south east arrow') + - "➙": [T: "fet hĂžyrepil"] # 0x2799 (en: 'heavy rightwards arrow', google: 'tung Ă„t höger-pil') + - "➚": [T: "fet nordĂžst-pil"] # 0x279a (en: 'heavy north east arrow', google: 'tung north east arrow') + - "➛": [T: "hĂžyrepil"] # 0x279b (en: 'drafting point rightwards arrow', google: 'utarbetningspunkt Ă„t höger pil') + - "➜": [T: "fet hĂžyrepil med avrundet spiss"] # 0x279c (en: 'heavy round-tipped rightwards arrow', google: 'tung rundtippad höger-pil') + - "➝": [T: "hĂžyrepil"] # 0x279d (en: 'triangle-headed rightwards arrow', google: 'triangelhuvud med höger pil') + - "➞": [T: "fet hĂžyrepil"] # 0x279e (en: 'heavy triangle-headed rightwards arrow', google: 'tung triangelhuvud med höger pil') + - "➟": [T: "stiplet hĂžyrepil"] # 0x279f (en: 'dashed triangle-headed rightwards arrow', google: 'streckad triangelhuvud med höger pil') + - "➠": [T: "fet stiplet hĂžyrepil"] # 0x27a0 (en: 'heavy dashed triangle-headed rightwards arrow', google: 'tung streckad triangelhuvud med höger pil') + - "➡": [T: "hĂžyrepil"] # 0x27a1 (en: 'black rightwards arrow', google: 'black rightwards arrow') + - "➱": [T: "3D-hĂžyrepil med lys Ăžvre del"] # 0x27a2 (en: 'three d top lighted rightwards arrow', google: 'tre d topplyst höger pil') + - "➣": [T: "3D-hĂžyrepil med lys nedre del"] # 0x27a3 (en: 'three d bottom lighted rightwards arrow', google: 'tre d botten tĂ€nde höger pil') + - "➀": [T: "pilspiss til hĂžyre"] # 0x27a4 (en: 'black rightwards arrowhead', google: 'svart höger pilspets') + - "➄": [T: "fet hĂžyrepil med hale oppover"] # 0x27a5 (en: 'heavy black curved downwards and rightwards arrow', google: 'tung svart krökt nedĂ„t och höger-pil') + - "➊": [T: "fet hĂžyrepil med hale nedover"] # 0x27a6 (en: 'heavy black curved upwards and rightwards arrow', google: 'tung svart krökt uppĂ„t och pil med höger') + - "➧": [T: "kompakt hĂžyrepil"] # 0x27a7 (en: 'squat black rightwards arrow', google: 'squat black rightwards arrow') + - "➚": [T: "fet hĂžyrepil med konkav spiss"] # 0x27a8 (en: 'heavy concave-pointed black rightwards arrow', google: 'tung konkavspetsad svart höger-pil') + - "➩": [T: "hĂžyre-skyggelagt hvit hĂžyrepil"] # 0x27a9 (en: 'right-shaded white rightwards arrow', google: 'högerskuggad vit Ă„t höger pil') + - "âžȘ": [T: "venstre-skyggelagt hvit hĂžyrepil"] # 0x27aa (en: 'left-shaded white rightwards arrow', google: 'vĂ€nsterskuggad vit Ă„t höger pil') + - "➫": [T: "bakovervippet skyggelagt hvit hĂžyrepil"] # 0x27ab (en: 'back-tilted shadowed white rightwards arrow', google: 'back-tiled shadowed white rightward arrow') + - "➬": [T: "fremoverlent skyggelagt hvit hĂžyrepil"] # 0x27ac (en: 'front-tilted shadowed white rightwards arrow', google: 'front-lutad skuggad vit höger pil') + - "➭": [T: "hvit hĂžyrepil skyggelagt under"] # 0x27ad (en: 'heavy lower right-shadowed white rightwards arrow', google: 'tung nedre högerskuggad vit höger pil') + - "➼": [T: "hvit hĂžyrepil skyggelagt over"] # 0x27ae (en: 'heavy upper right-shadowed white rightwards arrow', google: 'tung övre högra skuggade vita höger-pil') + - "➯": [T: "hvit hĂžyrepil med hakk skyggelagt under"] # 0x27af (en: 'notched lower right-shadowed white rightwards arrow', google: 'skĂ„pad nedre högerskuggad vit Ă„t höger pil') + - "➱": [T: "hvit hĂžyrepil med hakk skyggelagt over"] # 0x27b1 (en: 'notched upper right-shadowed white rightwards arrow', google: 'skĂ€rmad övre högra skuggade vita höger-pil') + - "âžČ": [T: "fet hvit hĂžyrepil med sirkel"] # 0x27b2 (en: 'circled heavy white rightwards arrow', google: 'circled heavy white rightwards arrow') + - "➳": [T: "hvit hĂžyrepil med fjĂŠr"] # 0x27b3 (en: 'white-feathered rightwards arrow', google: 'vitfödd Ă„t höger pil') + - "➮": [T: "sĂžrĂžst-pil med fjĂŠr"] # 0x27b4 (en: 'black-feathered south east arrow', google: 'svartfödd south east arrow') + - "➔": [T: "hĂžyrepil med fjĂŠr"] # 0x27b5 (en: 'black-feathered rightwards arrow', google: 'black-feeded rightwards arrow') + - "➶": [T: "nordĂžst-pil med fjĂŠr"] # 0x27b6 (en: 'black-feathered north east arrow', google: 'svartfödd nord-ostra pilen') + - "➷": [T: "fet sĂžrĂžst-pil med fjĂŠr"] # 0x27b7 (en: 'heavy black-feathered south east arrow', google: 'tung svartfönad syd-ostpil') + - "➾": [T: "fet hĂžyrepil med fjĂŠr"] # 0x27b8 (en: 'heavy black-feathered rightwards arrow', google: 'tung svartfjĂ€der med höger pil') + - "âžč": [T: "fet nordĂžst-pil med fjĂŠr"] # 0x27b9 (en: 'heavy black-feathered north east arrow', google: 'tung svartfönad nord-ostra pilen') + - "âžș": [T: "hĂžyrepil med mothaker"] # 0x27ba (en: 'teradrop-barbed rightwards arrow', google: 'teradrop-barbed till höger pil') + - "➻": [T: "tĂ„reformet hĂžyrepil"] # 0x27bb (en: 'heavy teardrop-shanked rightwards arrow', google: 'tung teardrop-shanked höger-pil') + - "➌": [T: "hĂžyrepil med kileformet hale"] # 0x27bc (en: 'wedge-tailed rightwards arrow', google: 'wedge-tailed Ă„t höger pil') + - "➜": [T: "fet hĂžyrepil med kileformet hale"] # 0x27bd (en: 'heavy wedge-tailed rightwards arrow', google: 'tung kil-tailed höger-pil') + - "➟": [T: "hĂžyrepil med Ă„pne konturer"] # 0x27be (en: 'open-outlined rightwards arrow', google: 'öppen-outlinerad höger-pil') + #---------------------------------------------------------------------------------------------------------------------------------- + #Miscellaneous mathematical symbols-A OK + - "⟀": [T: "tredimensjonal vinkel"] # 0x27c0 (en: 'three dimensional angle') + - "⟁": [T: "hvit trekant med liten hvit trekant"] # 0x27c1 (en: 'white triangle containing small white triangle') + - "⟂": # 0x27c2 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "vinkelrett pĂ„" # (en: 'perpendicular to') + - "⟃": # 0x27c3 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er en"] # (en: 'is', google translation) + - T: "Ă„pen delmengde av" # (en: 'an open subset of') + - "⟄": # 0x27c4 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er en"] # (en: 'is', google translation) + - T: "Ă„pen overmengde av" # (en: 'an open superset of') + - "⟅": [T: "venstre s-formet bag delimiter"] # 0x27c5 (en: 'left s-shaped bag delimiter') + - "⟆": [T: "hĂžyre s-formet bag delimiter"] # 0x27c6 (en: 'right s-shaped bag delimiter') + - "⟇": [T: "eller med prikk"] # 0x27c7 (en: 'or with dot inside') + - "⟈": [T: "omvendt skrĂ„strek fĂžr delmengde"] # 0x27c8 (en: 'reverse solidus preceding subset') + - "⟉": [T: "overmengde fĂžr skrĂ„strek"] # 0x27c9 (en: 'superset preceding solidus') + - "⟊": [T: "vertikal strek med horisontal strek"] # 0x27ca (en: 'vertical bar with horizontal stroke') + - "⟋": [T: "stigende diagonal"] # 0x27cb (en: 'mathematical rising diagonal', google: 'matematisk stigande diagonal') + - "⟌": [T: "lang divisjon"] # 0x27cc (en: 'long division') + - "⟍": [T: "synkende diagonal"] # 0x27cd (en: 'mathematical falling diagonal', google: 'matematisk fallande diagonal') + - "⟎": [T: "logisk og i kvadrat"] # 0x27ce (en: 'squared logical and', google: 'squared logical och') + - "⟏": [T: "logisk eller i kvadrat"] # 0x27cf (en: 'squared logical or', google: 'kvadratiska logiska eller') + - "⟐": [T: "hvit diamant med prikk i midten"] # 0x27d0 (en: 'white diamond with centered dot', google: 'vit diamant med centrerad prick') + - "⟑": [T: "og med prikk"] # 0x27d1 (en: 'and with dot') + - "⟒": [T: "tilhĂžrer med Ă„pning oppover"] # 0x27d2 (en: 'element of opening upwards') + - "⟓": [T: "nedre hĂžyre hjĂžrne med prikk"] # 0x27d3 (en: 'lower right corner with dot') + - "⟔": [T: "Ăžvre venstre hjĂžrne med prikk"] # 0x27d4 (en: 'upper left corner with dot') + - "⟕": [T: "venstre outer join"] # 0x27d5 (en: 'left outer join') + - "⟖": [T: "hĂžyre outer join"] # 0x27d6 (en: 'right outer join') + - "⟗": [T: "full outer join"] # 0x27d7 (en: 'full outer join') + - "⟘": [T: "stort oppoverrotert dreiekors"] # 0x27d8 (en: 'large up tack') + - "⟙": [T: "stort nedoverrotert dreiekors"] # 0x27d9 (en: 'large down tack') + - "⟚": [T: "venstre og hĂžyre dobbelt dreiekors"] # 0x27da (en: 'left and right double turnstile') + - "⟛": [T: "venstre og hĂžyre dreiekors"] # 0x27db (en: 'left and right tack') + - "⟜": [T: "venstre multimap"] # 0x27dc (en: 'left multimap') + - "⟝": [T: "langt hĂžyre dreiekors"] # 0x27dd (en: 'long right tack') + - "⟞": [T: "langt venstre dreiekors"] # 0x27de (en: 'long left tack') + - "⟟": [T: "oppoverrotert dreiekors med sirkel over"] # 0x27df (en: 'up tack with circle above') + - "⟠": [T: "rombe delt med horisontal strek"] # 0x27e0 (en: 'lozenge divided by horizontal rule') + - "⟡": [T: "hvit konkav-sidet diamant"] # 0x27e1 (en: 'white concave sided diamond') + - "⟱": [T: "hvit konkav-sidet diamant med strek til venstre"] # 0x27e2 (en: 'white concave sided diamond with leftwards tick') + - "⟣": [T: "hvit konkav-sidet diamant med strek til hĂžyre"] # 0x27e3 (en: 'white concave sided diamond with rightwards tick') + - "⟀": [T: "hvitt kvadrat med strek til venstre"] # 0x27e4 (en: 'white square with leftwards tick') + - "⟄": [T: "hvitt kvadrat med strek til hĂžyre"] # 0x27e5 (en: 'white square with rightwards tick') + - "⟩": [T: "hvit venstre hakeparentes"] # 0x27e6 (en: 'left white square bracket') + - "⟧": [T: "hvit hĂžyre hakeparentes"] # 0x27e7 (en: 'right white square bracket') + - "⟹": [T: "venstre vinkel-parentes"] # 0x27e8 (en: 'left angle bracket') + - "⟩": [T: "hĂžyre vinkel-parentes"] # 0x27e9 (en: 'right angle bracket') + - "âŸȘ": [T: "venstre dobbel vinkel-parentes"] # 0x27ea (en: 'left double angle bracket') + - "⟫": [T: "hĂžyre dobbel vinkel-parentes"] # 0x27eb (en: 'right double angle bracket') + - "⟬": [T: "venstre hvit skilpaddeskall-parentes"] # 0x27ec (en: 'left white tortoise shell bracket') + - "⟭": [T: "hĂžyre hvit skilpaddeskall-parentes"] # 0x27ed (en: 'right white tortoise shell bracket') + - "⟼": [T: "avflatet hĂžyreparentes"] # 0x27ee (en: 'left flattened parenthesis') + - "⟯": [T: "avflatet venstreparentes"] # 0x27ef (en: 'right flattened parenthesis') + #-------------------------------------------------------------------------------------------------- + # Supplemental arrows-A OK + - "⟰": [T: "kvadrupel-streket oppoverpil"] # 0x27f0 (en: 'upwards quadruple arrow', google: 'uppĂ„t fyrdubbla pilen') + - "⟱": [T: "kvadrupel-streket nedoverpil"] # 0x27f1 (en: 'downwards quadruple arrow', google: 'nedĂ„t fyrdubbla pilen') + - "âŸČ": [T: "Ă„pen sirkelpil mot klokken"] # 0x27f2 (en: 'anticlockwise gapped circle arrow', google: 'antikvis gappad cirkelpil') + - "⟳": [T: "Ă„pen sirkelpil med klokken"] # 0x27f3 (en: 'clockwise gapped circle arrow', google: 'medurs gappad cirkelpil') + - "⟮": [T: "hĂžyrepil med pluss i sirkel"] # 0x27f4 (en: 'right arrow with circled plus', google: 'höger-pil med circled plus') + - "⟔": [T: "lang venstrepil"] # 0x27f5 (en: 'long leftwards arrow') + - "⟶": [T: "lang hĂžyrepil"] # 0x27f6 (en: 'long rightwards arrow') + - "⟷": [T: "lang venstre-hĂžyre-pil"] # 0x27f7 (en: 'long left right arrow') + - "⟾": [T: "lang dobbeltstreket venstrepil"] # 0x27f8 (en: 'long leftwards double arrow') + - "âŸč": [T: "lang dobbeltstreket hĂžyrepil"] # 0x27f9 (en: 'long rightwards double arrow') + - "âŸș": [T: "lang dobbeltstreket venstre-hĂžyre-pil"] # 0x27fa (en: 'long left right double arrow') + - "⟻": [T: "lang venstrepil fra strek"] # 0x27fb (en: 'long leftwards arrow from bar', google: 'lĂ„ng vĂ€nster pil frĂ„n bar') + - "⟌": [T: "lang hĂžyrepil fra strek"] # 0x27fc (en: 'long rightwards arrow from bar') + - "⟜": [T: "lang dobbeltstreket venstrepil fra strek"] # 0x27fd (en: 'long leftwards double arrow from bar', google: 'lĂ„ng vĂ€nster dubbelpil frĂ„n bar') + - "⟟": [T: "lang dobbeltstreket hĂžyrepil fra strek"] # 0x27fe (en: 'long rightwards double arrow from bar', google: 'lĂ„ngt höger-pil frĂ„n bar') + - "⟿": [T: "lang svingete hĂžyrepil"] # 0x27ff (en: 'long rightwards squiggle arrow') + #------------------------------------------------------------------------------------------------------ + #Supplemental arrows-B OK + - " ": [T: "hĂžyrepil med to spisser og vertikal strek"] # 0x2900 (en: 'rightwards two headed arrow with vertical stroke', google: 'Ă„tgĂ€rd tvĂ„ ledde pil med vertikalt slag') + - " ": [T: "hĂžyrepil med to spisser og dobbel vertikal strek"] # 0x2901 (en: 'rightwards two headed arrow with double vertical stroke', google: 'Ă„tgĂ€rder tvĂ„ pil med dubbel vertikal stroke') + - " ": [T: "dobbeltstreket venstrepil med vertikal strek"] # 0x2902 (en: 'leftwards double arrow with vertical stroke', google: 'vĂ€nster dubbelpil med vertikalt slag') + - " ": [T: "dobbeltstreket hĂžyrepil med vertikal strek"] # 0x2903 (en: 'rightwards double arrow with vertical stroke', google: 'Ă„tgĂ€rd med höger med vertikal stroke') + - " ": [T: "dobbeltstreket venstre-hĂžyre-pil med vertikal strek"] # 0x2904 (en: 'left right double arrow with vertical stroke', google: 'vĂ€nster höger dubbelpil med vertikalt slag') + - " ": [T: "hĂžyrepil fra strek med dobbel spiss"] # 0x2905 (en: 'rightwards two headed arrow from bar') + - " ": [T: "dobbeltstreket venstrepil fra strek"] # 0x2906 (en: 'leftwards double arrow from bar', google: 'vĂ€nster dubbelpil frĂ„n bar') + - " ": [T: "dobbeltstreket hĂžyrepil fra strek"] # 0x2907 (en: 'rightwards double arrow from bar', google: 'Ă„tgĂ€rd med höger pil frĂ„n stĂ„ngen') + - " ": [T: "nedoverpil med horisontal strek"] # 0x2908 (en: 'downwards arrow with horizontal stroke', google: 'nedĂ„t pil med horisontellt slag') + - " ": [T: "oppoverpil med horisontal strek"] # 0x2909 (en: 'upwards arrow with horizontal stroke', google: 'uppĂ„t pil med horisontellt slag') + - " ": [T: "trippel-streket oppoverpil"] # 0x290a (en: 'upwards triple arrow', google: 'uppĂ„t trippelpil') + - "​": [T: "trippel-streket nedoverpil"] # 0x290b (en: 'downwards triple arrow', google: 'nedĂ„t trippelpil') + - "‌": [T: "stiplet venstrepil"] # 0x290c (en: 'leftwards double dash arrow') + - "‍": [T: "stiplet hĂžyrepil"] # 0x290d (en: 'rightwards double dash arrow') + - "‎": [T: "stiplet venstrepil"] # 0x290e (en: 'leftwards triple dash arrow') + - "‏": [T: "stiplet hĂžyrepil"] # 0x290f (en: 'rightwards triple dash arrow') + - "‐": [T: "stiplet hĂžyrepil med to spisser"] # 0x2910 (en: 'rightwards two headed triple dash arrow') + - "‑": [T: "prikket hĂžyrepil"] # 0x2911 (en: 'rightwards arrow with dotted stem') + - "‒": [T: "oppoverpil mot strek"] # 0x2912 + - "–": [T: "nedoverpil mot strek"] # 0x2913 + - "—": [T: "hĂžyrepil med hale og vertikal strek"] # 0x2914 (en: 'rightwards arrow with tail and vertical stroke', google: 'Ă„tgĂ€rdspil med svans och vertikalt slag') + - "―": [T: "hĂžyrepil med hale og dobbel vertikal strek"] # 0x2915 (en: 'rightwards arrow with tail and double vertical stroke', google: 'Ă„tgĂ€rdspil med svans och dubbel vertikal stroke') + - "‖": [T: "hĂžyrepil med dobbel spiss og hale"] # 0x2916 (en: 'rightwards two headed arrow with tail') + - "‗": [T: "hĂžyrepil med dobbel spiss og hale og vertikal strek"] # 0x2917 (en: 'rightwards two headed arrow with tail with vertical stroke', google: 'Ă„t höger tvĂ„ pil med svans med vertikalt stroke') + - "‘": [T: "hĂžyrepil med dobbel spiss og hale og dobbel vertikal strek"] # 0x2918 (en: 'rightwards two headed arrow with tail with double vertical stroke', google: 'Ă„t höger tvĂ„ pil med svans med dubbel vertikal stroke') + - "’": [T: "venstre pil-hale"] # 0x2919 (en: 'leftwards arrow tail') + - "‚": [T: "hĂžyre pil-hale"] # 0x291a (en: 'rightwards arrow tail', google: 'Ă„tgĂ€rder med höger pil') + - "‛": [T: "dobbel venstre pil-hale"] # 0x291b (en: 'leftwards double arrow tail') + - "“": [T: "dobbel hĂžyre pil-hale"] # 0x291c (en: 'rightwards double arrow tail') + - "”": [T: "venstrepil mot fylt diamant"] # 0x291d (en: 'leftwards arrow to filled diamond') + - "„": [T: "hĂžyrepil mot fylt diamant"] # 0x291e (en: 'rightwards arrow to filled diamond') + - "‟": [T: "venstrepil fra strek til fylt diamant"] # 0x291f (en: 'leftwards arrow from bar to filled diamond') + - "†": [T: "hĂžyrepil fra strek til fylt diamant"] # 0x2920 (en: 'rightwards arrow from bar to filled diamond') + - "‥": [T: "nordvest- og sĂžrĂžst-pil"] # 0x2921 (en: 'north west and south east arrow', google: 'north west och south east arrow') + - "‹": [T: "nordĂžst- og sĂžrvest-pil"] # 0x2922 (en: 'north east and south west arrow', google: 'north east and south west arrow') + - "‣": [T: "nordvest-pil med krok"] # 0x2923 (en: 'north west arrow with hook') + - " ": [T: "nordĂžst-pil med krok"] # 0x2924 (en: 'north east arrow with hook') + - " ": [T: "sĂžrĂžst-pil med krok"] # 0x2925 (en: 'south east arrow with hook') + - " ": [T: "sĂžrvest-pil med krok"] # 0x2926 (en: 'south west arrow with hook') + - "‧": [T: "nordvest-pil og nordĂžst-pil"] # 0x2927 (en: 'north west arrow and north east arrow') + - "‚": [T: "nordĂžst-pil og sĂžrĂžst-pil"] # 0x2928 (en: 'north east arrow and south east arrow') + - "
": [T: "sĂžrĂžst-pil og sĂžrvest-pil"] # 0x2929 (en: 'south east arrow and south west arrow') + - "â€Ș": [T: "sĂžrvest-pil og nordvest-pil"] # 0x292a (en: 'south west arrow and north west arrow') + - "‫": [T: "stigende diagonal krysser synkende diagonal"] # 0x292b (en: 'rising diagonal crossing falling diagonal', google: 'stigande diagonal korsning fallande diagonal') + - "‏": [T: "synkende diagonal krysser stigende diagonal"] # 0x292c (en: 'falling diagonal crossing rising diagonal', google: 'fallande diagonal korsning stigande diagonal') + - "‭": [T: "sĂžrĂžst-pil krysser nordĂžst-pil"] # 0x292d (en: 'south east arrow crossing north east arrow', google: 'south east arrow crossing north east arrow') + - "‟": [T: "nordĂžst-pil krysser sĂžrĂžst-pil"] # 0x292e (en: 'north east arrow crossing south east arrow', google: 'north east arrow crossing south east arrow') + - " ": [T: "synkende diagonal krysser nordĂžst-pil"] # 0x292f (en: 'falling diagonal crossing north east arrow', google: 'fallande diagonal korsar nord-ostra pilen') + - "‰": [T: "stigende diagonal krysser sĂžrĂžst-pil"] # 0x2930 (en: 'rising diagonal crossing south east arrow', google: 'rising diagonal crossing south east arrow') + - "‱": [T: "nordĂžst-pil krysser nordvest-pil"] # 0x2931 (en: 'north east arrow crossing north west arrow', google: 'north east arrow crossing north west arrow') + - "â€Č": [T: "nordvest-pil krysser nordĂžst-pil"] # 0x2932 (en: 'north west arrow crossing north east arrow', google: 'north west arrow crossing north east arrow') + - "″": [T: "bĂžlgete hĂžyrepil"] # 0x2933 (en: 'wave arrow pointing directly right') + - "‎": [T: "hĂžyrepil med vinkel oppover"] # 0x2934 (en: 'arrow pointing rightwards then curving upwards', google: 'arrow pekar Ă„t höger och böjer sig sedan uppĂ„t') + - "—": [T: "hĂžyrepil med vinkel nedover"] # 0x2935 (en: 'arrow pointing rightwards then curving downwards') + - "‶": [T: "nedoverpil med vinkel til venstre"] # 0x2936 (en: 'arrow pointing downwards then curving leftwards') + - "‷": [T: "nedoverpil med vinkel til hĂžyre"] # 0x2937 (en: 'arrow pointing downwards then curving rightwards') + - "„": [T: "halvsirkelpil med klokken"] # 0x2938 (en: 'right side arc clockwise arrow') + - "â€č": [T: "halvsirkelpil mot klokken"] # 0x2939 (en: 'left side arc anticlockwise arrow') + - "â€ș": [T: "Ăžvre halvsirkelpil mot klokken"] # 0x293a (en: 'top arc anticlockwise arrow', google: 'toppbĂ„ge moturs pil') + - "※": [T: "nedre halvsirkelpil mot klokken"] # 0x293b (en: 'bottom arc anticlockwise arrow', google: 'nedre bĂ„ge anticurs pil') + - "‌": [T: "Ăžvre halvsirkelpil med klokken med minus"] # 0x293c (en: 'top arc clockwise arrow with minus') + - "“": [T: "Ăžvre halvsirkelpil mot klokken med pluss"] # 0x293d (en: 'top arc anticlockwise arrow with plus') + - "‟": [T: "halvsirkelpil med klokken"] # 0x293e (en: 'lower right semicircular clockwise arrow', google: 'nedre högra halvcirkelformade medurs pil') + - "‿": [T: "halvsirkelpil mot klokken"] # 0x293f (en: 'lower left semicircular anticlockwise arrow', google: 'nedre vĂ€nstra halvcirkelformade pil moturs') + - "â„€": [T: "sirkel-pil mot klokken"] # 0x2940 (en: 'anticlockwise closed circle arrow', google: 'antikvis stĂ€ngd cirkelpil') + - "℁": [T: "sirkel-pil med klokken"] # 0x2941 (en: 'clockwise closed circle arrow', google: 'medurs stĂ€ngd cirkelpil') + - "â„‚": [T: "hĂžyrepil over kort venstrepil"] # 0x2942 (en: 'rightwards arrow above short leftwards arrow', google: 'Ă„tgĂ€rdspil över kort vĂ€nster pil') + - "℃": [T: "venstrepil over kort hĂžyrepil"] # 0x2943 (en: 'leftwards arrow above short rightwards arrow', google: 'vĂ€nster pil ovanför kort höger-pil') + - "â„„": [T: "kort hĂžyrepil over venstrepil"] # 0x2944 (en: 'short rightwards arrow above leftwards arrow', google: 'kort höger-pil ovanför vĂ€nster pil') + - "â„…": [T: "hĂžyrepil med pluss under"] # 0x2945 (en: 'rightwards arrow with plus below') + - "℆": [T: "venstrepil med pluss under"] # 0x2946 (en: 'leftwards arrow with plus below', google: 'vĂ€nster pil med plus nedan') + - "ℇ": [T: "hĂžyrepil gjennom x"] # 0x2947 (en: 'rightwards arrow through x', google: 'Ă„tgĂ€rdspil genom x') + - "℈": [T: "venstre-hĂžyre-pil gjennom sirkel"] # 0x2948 (en: 'left right arrow through circle') + - "℉": [T: "oppoverpil med dobbel spiss fra sirkel"] # 0x2949 (en: 'upwards two headed arrow from circle') + - "ℊ": [T: "toveis harpun venstre mothake opp hĂžyre mothake ned"] # 0x294a (en: 'left barb up right barb down harpoon') + - "â„‹": [T: "toveis harpun venstre mothake ned hĂžyre mothake opp"] # 0x294b (en: 'left barb down right barb up harpoon') + - "ℌ": [T: "toveis vertikal harpun Ăžvre mothake hĂžyre nedre mothake venstre"] # 0x294c (en: 'up barb right down barb left harpoon', google: 'upp barb höger ner barb vĂ€nster harpun') + - "ℍ": [T: "toveis vertikal harpun Ăžvre mothake venstre nedre mothake hĂžyre"] # 0x294d (en: 'up barb left down barb right harpoon', google: 'upp barb vĂ€nster ner barb höger harpoon') + - "ℎ": [T: "toveis harpun mothaker opp"] # 0x294e (en: 'left barb up right barb up harpoon', MathPlayer: 'vĂ€nster höger harpoon up', google: 'vĂ€nster barb upp höger barb upp harpoon') + - "ℏ": [T: "toveis vertikal harpun mothaker hĂžyre"] # 0x294f (en: 'up barb right down barb right harpoon') + - "ℐ": [T: "toveis harpun mothaker ned"] # 0x2950 (en: 'left barb down right barb down harpoon', MathPlayer: 'vĂ€nster höger harpoon ner') + - "â„‘": [T: "toveis vertikal harpun mothaker venstre"] # 0x2951 (en: 'up barb left down barb left harpoon') + - "â„’": [T: "venstre-harpun mot strek mothake opp"] # 0x2952 (en: 'leftwards harpoon with barb up to bar') + - "â„“": [T: "hĂžyre-harpun mot strek mothake opp"] # 0x2953 (en: 'rightwards harpoon with barb up to bar') + - "â„”": [T: "opp-harpun mot strek mothake hĂžyre"] # 0x2954 (en: 'upwards harpoon with barb right to bar') + - "â„•": [T: "ned-harpun mot strek mothake hĂžyre"] # 0x2955 (en: 'downwards harpoon with barb right to bar') + - "â„–": [T: "venstre-harpun mot strek mothake ned"] # 0x2956 (en: 'leftwards harpoon with barb down to bar') + - "â„—": [T: "hĂžyre-harpun mot strek mothake ned"] # 0x2957 (en: 'rightwards harpoon with barb down to bar') + - "℘": [T: "opp-harpun mot strek mothake venstre"] # 0x2958 (en: 'upwards harpoon with barb left to bar') + - "â„™": [T: "ned-harpun mot strek mothake venstre"] # 0x2959 (en: 'downwards harpoon with barb left to bar') + - "ℚ": [T: "venstre-harpun fra strek mothake opp"] # 0x295a (en: 'leftwards harpoon with barb up from bar') + - "â„›": [T: "hĂžyre-harpun fra strek mothake opp"] # 0x295b (en: 'rightwards harpoon with barb up from bar') + - "ℜ": [T: "opp-harpun fra strek mothake hĂžyre"] # 0x295c (en: 'upwards harpoon with barb right from bar') + - "ℝ": [T: "ned-harpun fra strek mothake hĂžyre"] # 0x295d (en: 'downwards harpoon with barb right from bar') + - "℞": [T: "venstre-harpun fra strek mothake ned"] # 0x295e (en: 'leftwards harpoon with barb down from bar') + - "℟": [T: "hĂžyre-harpun fra strek mothake ned"] # 0x295f (en: 'rightwards harpoon with barb down from bar') + - "â„ ": [T: "opp-harpun fra strek mothake venstre"] # 0x2960 (en: 'upwards harpoon with barb left from bar') + - "℥": [T: "ned-harpun fra strek mothake venstre"] # 0x2961 (en: 'downwards harpoon with barb left from bar') + - "ℹ": [T: "venstre-harpun mothake opp over venstre-harpun mothake ned"] # 0x2962 (en: 'leftwards harpoon with barb up above leftwards harpoon with barb down') + - "℣": [T: "opp-harpun mothake venstre ved siden av opp-harpun mothake hĂžyre"] # 0x2963 (en: 'upwards harpoon with barb left beside upwards harpoon with barb right') + - "â„€": [T: "hĂžyre-harpun mothake opp over hĂžyre-harpun mothake ned"] # 0x2964 (en: 'rightwards harpoon with barb up above rightwards harpoon with barb down') + - "â„„": [T: "ned-harpun mothake venstre ved siden av ned-harpun mothake hĂžyre"] # 0x2965 (en: 'downwards harpoon with barb left beside downwards harpoon with barb right') + - "ℊ": [T: "venstre-harpun mothake opp over hĂžyre-harpun mothake opp"] # 0x2966 (en: 'leftwards harpoon with barb up above rightwards harpoon with barb up') + - "â„§": [T: "venstre-harpun mothake ned over hĂžyre-harpun mothake ned"] # 0x2967 (en: 'leftwards harpoon with barb down above rightwards harpoon with barb down') + - "ℚ": [T: "hĂžyre-harpun mothake opp over venstre-harpun mothake opp"] # 0x2968 (en: 'rightwards harpoon with barb up above leftwards harpoon with barb up') + - "â„©": [T: "hĂžyre-harpun mothake ned over venstre-harpun mothake ned"] # 0x2969 (en: 'rightwards harpoon with barb down above leftwards harpoon with barb down') + - "â„Ș": [T: "venstre-harpun mothake opp over strek"] # 0x296a (en: 'leftwards harpoon with barb up above long dash') + - "â„«": [T: "venstre-harpun mothake ned under strek"] # 0x296b (en: 'leftwards harpoon with barb down below long dash') + - "ℏ": [T: "hĂžyre-harpun mothake opp over strek"] # 0x296c (en: 'rightwards harpoon with barb up above long dash') + - "â„­": [T: "hĂžyre-harpun mothake ned under strek"] # 0x296d (en: 'rightwards harpoon with barb down below long dash') + - "℟": [T: "opp-harpun mothake venstre ved siden av ned-harpun mothake hĂžyre"] # 0x296e (en: 'upwards harpoon with barb left beside downwards harpoon with barb right') + - "ℯ": [T: "ned-harpun mothake venstre ved siden av opp-harpun mothake hĂžyre"] # 0x296f (en: 'downwards harpoon with barb left beside upwards harpoon with barb right') + - "â„°": [T: "dobbeltstreket hĂžyrepil med avrundet spiss"] # 0x2970 (en: 'right double arrow with rounded head') + - "ℱ": [T: "lik over hĂžyrepil"] # 0x2971 (en: 'equals above rightwards arrow') + - "â„Č": [T: "tilde over hĂžyrepil"] # 0x2972 (en: 'tilde operator above rightwards arrow') + - "ℳ": [T: "venstrepil over tilde"] # 0x2973 (en: 'leftwards arrow above tilde operator') + - "ℎ": [T: "hĂžyrepil over tilde"] # 0x2974 (en: 'rightwards arrow above tilde operator') + - "â„”": [T: "hĂžyrepil over tilnĂŠrmet lik"] # 0x2975 (en: 'rightwards arrow above almost equal to') + - "â„¶": [T: "mindre enn over venstrepil"] # 0x2976 (en: 'less than above leftwards arrow') + - "â„·": [T: "venstrepil gjennom mindre enn"] # 0x2977 (en: 'leftwards arrow through less than', google: 'vĂ€nster pil genom mindre Ă€n') + - "℞": [T: "stĂžrre enn over hĂžyrepil"] # 0x2978 (en: 'greater than above rightwards arrow') + - "â„č": [T: "delmengde over hĂžyrepil"] # 0x2979 (en: 'subset above rightwards arrow') + - "â„ș": [T: "venstrepil gjennom delmengde"] # 0x297a (en: 'leftwards arrow through subset', google: 'vĂ€nster pil genom undergruppen') + - "â„»": [T: "overmengde over venstrepil"] # 0x297b (en: 'superset above leftwards arrow') + - "ℌ": [T: "fiskehale til venstre"] # 0x297c (en: 'left fish tail') + - "ℜ": [T: "fiskehale til hĂžyre"] # 0x297d (en: 'right fish tail') + - "℟": [T: "fiskehale oppover"] # 0x297e (en: 'up fish tail') + - "ℿ": [T: "fiskehale nedover"] # 0x297f (en: 'down fish tail') + #--------------------------------------------------------------------------------------------- + # Miscellaneous Mathematical symbols-B OK + - "⩀": [T: "trippel loddrett strek"] # 0x2980 (en: 'triple vertical bar delimiter', google: 'trippel vertikal bar avgrĂ€nsare') + - "⊁": [T: "punkt z-notasjon"] # 0x2981 (en: 'z notation spot', google: 'z notation spot') + - "⩂": [T: "kolon z-notasjon"] # 0x2982 (en: 'z notation type colon', google: 'z notationstyp kolon') + - "⊃": [T: "venstre hvit krĂžllparentes"] # 0x2983 (en: 'left white brace', google: 'vĂ€nster vit stag') + - "⩄": [T: "hĂžyre hvit krĂžllparentes"] # 0x2984 (en: 'right white brace', google: 'höger vit stag') + - "⩅": [T: "hvit venstreparentes"] # 0x2985 (en: 'left white parenthesis') + - "⩆": [T: "hvit hĂžyreparentes"] # 0x2986 (en: 'right white parenthesis') + - "⩇": [T: "venstre bilde-parentes z-notasjon"] # 0x2987 (en: 'z notation left image bracket', google: 'z notation vĂ€nster bildfĂ€ste') + - "⊈": [T: "hĂžyre bilde-parentes z-notasjon"] # 0x2988 (en: 'z notation right image bracket', google: 'z notation rĂ€tt bildfĂ€ste') + - "⩉": [T: "venstre bindende parentes z-notasjon"] # 0x2989 (en: 'z notation left binding bracket') + - "⩊": [T: "hĂžyre bindende parentes z-notasjon"] # 0x298a (en: 'z notation right binding bracket') + - "⩋": [T: "venstre hakeparentes med strek under"] # 0x298b (en: 'left square bracket with underbar') + - "⩌": [T: "hĂžyre hakeparentes med strek under"] # 0x298c (en: 'right square bracket with underbar') + - "⊍": [T: "venstre hakeparentes med strek i Ăžvre hjĂžrne"] # 0x298d (en: 'left square bracket with tick in top corner') + - "⊎": [T: "hĂžyre hakeparentes med strek i nedre hjĂžrne"] # 0x298e (en: 'right square bracket with tick in bottom corner') + - "⊏": [T: "venstre hakeparentes med strek i nedre hjĂžrne"] # 0x298f (en: 'left square bracket with tick in bottom corner') + - "⊐": [T: "hĂžyre hakeparentes med strek i Ăžvre hjĂžrne"] # 0x2990 (en: 'right square bracket with tick in top corner') + - "⩑": [T: "venstre vinkelparentes med prikk"] # 0x2991 (en: 'left angle bracket with dot') + - "⩒": [T: "hĂžyre vinkelparentes med prikk"] # 0x2992 (en: 'right angle bracket with dot') + - "⩓": [T: "venstre mindre enn parentes"] # 0x2993 (en: 'left arc less than bracket') + - "⩔": [T: "hĂžyre stĂžrre enn parentes"] # 0x2994 (en: 'right arc greater than bracket') + - "⩕": [T: "venstre dobbel stĂžrre enn parentes"] # 0x2995 (en: 'double left arc greater than bracket') + - "⩖": [T: "hĂžyre dobbel mindre enn parentes"] # 0x2996 (en: 'double right arc less than bracket') + - "⩗": [T: "venstre skilpaddeskall-parentes"] # 0x2997 (en: 'left black tortoise shell bracket', google: 'vĂ€nster svart sköldpaddsskalfĂ€ste') + - "⊘": [T: "hĂžyre skilpaddeskall-parentes"] # 0x2998 (en: 'right black tortoise shell bracket', google: 'höger svart sköldpaddsskalfĂ€ste') + - "⩙": [T: "prikket loddrett strek"] # 0x2999 (en: 'dotted fence', google: 'prickat staket') + - "⩚": [T: "sikksakk loddrett strek"] # 0x299a (en: 'vertical zigzag line') + - "⩛": [T: "mĂ„lt vinkel til venstre"] # 0x299b (en: 'measured angle opening left', google: 'uppmĂ€tt vinkelöppning vĂ€nster') + - "⩜": [T: "rett vinkel"] # 0x299c (en: 'right angle variant with square', google: 'rĂ€tt vinkelvariant med fyrkant') + - "⊝": [T: "mĂ„lt rett vinkel med prikk"] # 0x299d (en: 'measured right angle with dot') + - "⊞": [T: "vinkel med s i"] # 0x299e (en: 'angle with s inside') + - "⩟": [T: "spiss vinkel"] # 0x299f (en: 'acute angle') + - "⊠": [T: "sfĂŠrisk vinkel til venstre"] # 0x29a0 (en: 'spherical angle opening left', google: 'sfĂ€risk vinkelöppning vĂ€nster') + - "⊥": [T: "sfĂŠrisk vinkel oppover"] # 0x29a1 (en: 'spherical angle opening up', google: 'sfĂ€risk vinkel öppnas') + - "⊹": [T: "snudd vinkel"] # 0x29a2 (en: 'turned angle', google: 'vĂ€nde vinkel') + - "⊣": [T: "speilvendt vinkel"] # 0x29a3 (en: 'reversed angle') + - "⊀": [T: "vinkel med strek under"] # 0x29a4 (en: 'angle with underbar') + - "⊄": [T: "speilvendt vinkel med strek under"] # 0x29a5 (en: 'reversed angle with underbar') + - "⊊": [T: "stump vinkel oppover"] # 0x29a6 (en: 'oblique angle opening up') + - "⊧": [T: "stump vinkel nedover"] # 0x29a7 (en: 'oblique angle opening down') + - "⊚": [T: "mĂ„lt vinkel med nordĂžst-pil i enden av Ăžvre vinkelben"] # 0x29a8 (en: 'measured angle with open arm ending in arrow pointing up and to the right') + - "⊩": [T: "mĂ„lt vinkel med nordvest-pil i enden av Ăžvre vinkelben"] # 0x29a9 (en: 'measured angle with open arm ending in arrow pointing up and to the left') + - "âŠȘ": [T: "mĂ„lt vinkel med sĂžrĂžst-pil i enden av nedre vinkelben"] # 0x29aa (en: 'measured angle with open arm ending in arrow pointing down and to the right') + - "⊫": [T: "mĂ„lt vinkel med sĂžrvest-pil i enden av nedre vinkelben"] # 0x29ab (en: 'measured angle with open arm ending in arrow pointing down and to the left') + - "⊏": [T: "mĂ„lt vinkel med nordĂžst-pil i enden av hĂžyre vinkelben"] # 0x29ac (en: 'measured angle with open arm ending in arrow pointing right and up') + - "⊭": [T: "mĂ„lt vinkel med nordvest-pil i enden av venstre vinkelben"] # 0x29ad (en: 'measured angle with open arm ending in arrow pointing left and up') + - "⊟": [T: "mĂ„lt vinkel med sĂžrĂžst-pil i enden av hĂžyre vinkelben"] # 0x29ae (en: 'measured angle with open arm ending in arrow pointing right and down') + - "⊯": [T: "mĂ„lt vinkel med sĂžrvest-pil i enden av venstre vinkelben"] # 0x29af (en: 'measured angle with open arm ending in arrow pointing left and down') + - "⊰": [T: "den tomme mengden speilvendt"] # 0x29b0 (en: 'reversed empty set') + - "⊱": [T: "den tomme mengden med strek over"] # 0x29b1 (en: 'empty set with overbar') + - "âŠČ": [T: "den tomme mengden med sirkel over"] # 0x29b2 (en: 'empty set with small circle above') + - "⊳": [T: "den tomme mengden med hĂžyrepil over"] # 0x29b3 (en: 'empty set with right arrow above') + - "⊎": [T: "den tomme mengden med venstrepil over"] # 0x29b4 (en: 'empty set with left arrow above') + - "⊔": [T: "sirkel med horisontal strek"] # 0x29b5 (en: 'circle with horizontal bar') + - "⊶": [T: "sirkel med vertikal strek"] # 0x29b6 (SRE: 'vertikalt streck i cirkel') + - "⊷": [T: "parallell i sirkel"] # 0x29b7 (en: 'circled parallel') + - "⊞": [T: "sirkel med omvendt skrĂ„strek"] # 0x29b8 (en: 'circled reverse solidus', google: 'circled reverse solidus') + - "âŠč": [T: "vinkelrett i sirkel"] # 0x29b9 (en: 'circled perpendicular') + - "âŠș": [T: "sirkel delt med horisontal strek og Ăžvre del delt med vertikal strek"] # 0x29ba (en: 'circled divided by horizontal bar and top half divided by vertical bar', google: 'cirklade dividerat med horisontell stĂ„ng och den övre halvan dividerad med vertikal stĂ„ng') + - "⊻": [T: "sirkel med x"] # 0x29bb (en: 'circle with superimposed x') + - "⊌": [T: "sirkel med divisjon rotert mot klokken"] # 0x29bc (en: 'circled anticlockwise rotated division sign') + - "⊜": [T: "oppoverpil gjennom sirkel"] # 0x29bd (en: 'up arrow through circle', google: 'upp pilen genom cirkeln') + - "⊟": [T: "hvitt punkt i sirkel"] # 0x29be (en: 'circled white bullet') + - "⊿": [T: "punkt i sirkel"] # 0x29bf (en: 'circled bullet') + - "⧀": [T: "mindre enn i sirkel"] # 0x29c0 (en: 'circled less than') + - "⧁": [T: "stĂžrre enn i sirkel"] # 0x29c1 (en: 'circled greater than') + - "⧂": [T: "sirkel med liten sirkel til hĂžyre"] # 0x29c2 (en: 'circle with small circle to the right') + - "⧃": [T: "sirkel med to horisontale streker til hĂžyre"] # 0x29c3 (en: 'circle with two horizontal strokes to the right') + - "⧄": [T: "kvadrat med diagonal oppover"] # 0x29c4 (en: 'squared rising diagonal slash') + - "⧅": [T: "kvadrat med diagonal nedover"] # 0x29c5 (en: 'squared falling diagonal slash') + - "⧆": [T: "asterisk i kvadrat"] # 0x29c6 (en: 'squared asterisk', google: 'kvadratisk asterisk') + - "⧇": [T: "liten sirkel i kvadrat"] # 0x29c7 (en: 'squared small circle', google: 'kvadrat liten cirkel') + - "⧈": [T: "kvadrat i kvadrat"] # 0x29c8 (en: 'squared square', google: 'squared square') + - "⧉": [T: "to sammenfĂžyde kvadrat"] # 0x29c9 (en: 'two joined squares') + - "⧊": [T: "trekant med prikk over"] # 0x29ca (en: 'triangle with dot above', google: 'triangel med prick ovan') + - "⧋": [T: "trekant med strek under"] # 0x29cb (en: 'triangle with underbar', google: 'triangel med underbar') + - "⧌": [T: "trekant med s"] # 0x29cc (en: 's in triangle') + - "⧍": [T: "trekant med seriffer pĂ„ bunnen"] # 0x29cd (en: 'triangle with serifs at bottom') + - "⧎": [T: "hĂžyre trekant over venstre trekant"] # 0x29ce (en: 'right triangle above left triangle') + - "⧏": [T: "venstre trekant ved siden av vertikal strek"] # 0x29cf (en: 'left triangle beside vertical bar') + - "⧐": [T: "vertikal strek ved siden av hĂžyre trekant"] # 0x29d0 (en: 'vertical bar beside right triangle') + - "⧑": [T: "slĂžyfe med venstre halvdel fylt"] # 0x29d1 (en: 'bowtie with left half black', google: 'bowtie med vĂ€nster halva svart') + - "⧒": [T: "slĂžyfe med hĂžyre halvdel fylt"] # 0x29d2 (en: 'bowtie with right half black', google: 'bowtie med höger halv svart') + - "⧓": [T: "fylt slĂžyfe"] # 0x29d3 (en: 'black bowtie', google: 'svart bowtie') + - "⧔": [T: "slĂžyfe med venstre halvdel fylt og hĂžyre halvdel Ă„pen"] # 0x29d4 (en: 'times with left half black', google: 'gĂ„nger med vĂ€nster halva svart') + - "⧕": [T: "slĂžyfe med venstre halvdel Ă„pen og hĂžyre halvdel fylt"] # 0x29d5 (en: 'times with right half black', google: 'gĂ„nger med höger halv svart') + - "⧖": [T: "hvitt timeglass"] # 0x29d6 (en: 'white hourglass', google: 'vit timglas') + - "⧗": [T: "fylt timeglass"] # 0x29d7 (en: 'black hourglass') + - "⧘": [T: "venstre sikksakk gjerde"] # 0x29d8 (en: 'left wiggly fence', google: 'vĂ€nster wiggly staket') + - "⧙": [T: "hĂžyre sikksakk gjerde"] # 0x29d9 (en: 'right wiggly fence', google: 'höger vinglt staket') + - "⧚": [T: "dobbelt venstre sikksakk gjerde"] # 0x29da (en: 'left double wiggly fence', MathPlayer: 'left double wiggly fence', google: 'vĂ€nster dubbel wiggly staket') + - "⧛": [T: "dobbelt hĂžyre sikksakk gjerde"] # 0x29db (en: 'right double wiggly fence', MathPlayer: 'right double wiggly fence', google: 'höger dubbel wiggly staket') + - "⧜": [T: "ufullstendig uendelig"] # 0x29dc (en: 'incomplete infinity') + - "⧝": [T: "bĂ„nd over uendelighetstegn"] # 0x29dd (en: 'tie over infinity', google: 'bind över oĂ€ndligheten') + - "⧞": [T: "uendelig med vertikal strek"] # 0x29de (en: 'infinity negated with vertical bar') + - "⧟": [T: "tosidig multimap"] # 0x29df (en: 'double-ended multimap', google: 'dubbel-sluten multimap') + - "â§ ": [T: "kvadrat med omriss"] # 0x29e0 (en: 'square with contoured outline', google: 'fyrkantig med konturerad kontur') + - "â§Ą": [T: "Ăžker som"] # 0x29e1 (en: 'increases as') + - "â§ą": [T: "shuffle-produkt"] # 0x29e2 (en: 'shuffle product', google: 'shuffle -produkt') + - "â§Ł": [T: "likhetstegn og skrĂ„stilt parallell"] # 0x29e3 (en: 'equals sign and slanted parallel') + - "â§€": [T: "likhetstegn og skrĂ„stilt parallell med tilde over"] # 0x29e4 (en: 'equals sign and slanted parallel with tilde above') + - "â§„": [T: "identisk med og skrĂ„stilt parallell"] # 0x29e5 (en: 'identical to and slanted parallel') + - "â§Š": [T: "gleich stark"] # 0x29e6 + - "â§§": [T: "termodynamisk"] # 0x29e7 (en: 'thermodynamic', google: 'termodynamisk') + - "â§š": [T: "trekant nedover venstre halvdel fylt"] # 0x29e8 (en: 'down pointing triangle with left half black', google: 'ner pekande triangel med vĂ€nster halvsvart') + - "â§©": [T: "trekant nedover hĂžyre halvdel fylt"] # 0x29e9 (en: 'down pointing triangle with right half black', google: 'ner pekande triangel med höger halvsvart') + - "â§Ș": [T: "fylt diamant med pil ned"] # 0x29ea (en: 'black diamond with down arrow', google: 'svart diamant med nedpil') + - "â§«": [T: "fylt rombe"] # 0x29eb (en: 'black lozenge') + - "â§Ź": [T: "sirkel med pil ned"] # 0x29ec (en: 'white circle with down arrow', google: 'vit cirkel med nedpilen') + - "â§­": [T: "fylt sirkel med pil ned"] # 0x29ed (en: 'black circle with down arrow', google: 'svart cirkel med nedpilen') + - "â§ź": [T: "firkant med utstikkere"] # 0x29ee (en: 'error-barred white square', google: 'fel-spĂ€rrvit fyrkant') + - "â§Ż": [T: "fylt firkant med utstikkere"] # 0x29ef (en: 'error-barred black square', google: 'fel-barred black square') + - "â§°": [T: "diamant med utstikkere"] # 0x29f0 (en: 'error-barred white diamond', google: 'fel-spĂ€rrad vit diamant') + - "â§±": [T: "fylt diamant med utstikkere"] # 0x29f1 (en: 'error-barred black diamond', google: 'fel-barred black diamond') + - "â§Č": [T: "sirkel med utstikkere"] # 0x29f2 (en: 'error-barred white circle', google: 'fel-spĂ€rrad vit cirkel') + - "â§ł": [T: "fylt sirkel med utstikkere"] # 0x29f3 (en: 'error-barred black circle', google: 'fel-barred black circle') + - "â§Ž": [T: "kolon hĂžyrepil"] # 0x29f4 (en: 'rule-delayed', MathPlayer: 'rule delayed', google: 'regelförsenad') + - "â§”": [T: "omvendt skrĂ„strek"] # 0x29f5 (en: 'reverse solidus operator', google: 'omvĂ€nd solidus -operatör') + - "â§¶": [T: "skrĂ„strek med strek over"] # 0x29f6 (en: 'solidus with overbar') + - "â§·": [T: "omvendt skrĂ„strek med horisontal strek"] # 0x29f7 (en: 'reverse solidus with horizontal stroke', google: 'omvĂ€nd solidus med horisontellt slag') + - "â§ž": [T: "stor skrĂ„strek"] # 0x29f8 (en: 'big solidus', google: 'big solidus') + - "â§č": [T: "stor omvendt skrĂ„strek"] # 0x29f9 (en: 'big reverse solidus', google: 'big reverse solidus') + - "â§ș": [T: "dobbel pluss"] # 0x29fa (en: 'double plus', google: 'dubbel plus') + - "â§»": [T: "trippel pluss"] # 0x29fb (en: 'triple plus', google: 'trippel plus') + - "â§Œ": [T: "venstre buet vinkelparentes"] # 0x29fc (en: 'left pointing curved angle bracket', google: 'vĂ€nster pekande krökt vinkelfĂ€ste') + - "â§œ": [T: "hĂžyre buet vinkelparentes"] # 0x29fd (en: 'right pointing curved angle bracket', google: 'höger pekande krökt vinkelfĂ€ste') + # SWEDISH: kept English tiny & miny but changed spelling to get pronunciation right + - "â§Ÿ": [T: "tainy"] # 0x29fe (en: 'tiny', google: 'mycket liten') + - "â§ż": [T: "mainy"] # 0x29ff (en: 'miny', google: 'miny') + #-------------------------------------------------------------------------------------------------------------- + # Supplemental Mathematical operators OK + - "⹀": [T: "dot-operator i sirkel"] # 0x2a00 (en: 'circled dot operator', google: 'circled dot operator') + - "⚁": [T: "pluss i sirkel"] # 0x2a01 (en: 'circled plus operator', google: 'circled plus operator') + - "⹂": [T: "multiplikasjon i sirkel"] # 0x2a02 (en: 'circled times operator', google: 'circled times operator') + - "⚃": [T: "union med prikk"] # 0x2a03 (en: 'union operator with dot', google: 'unionoperatör med dot') + - "⹄": [T: "union med pluss"] # 0x2a04 (en: 'union operator with plus', google: 'unionoperatör med plus') + - "⹅": [T: "kvadratisk snitt-operator"] # 0x2a05 (en: 'square intersection operator', google: 'square -korsningsoperatör') + - "⹆": [T: "kvadratisk union-operator"] # 0x2a06 (en: 'square union operator', google: 'square union operator') + - "⹇": [T: "to logiske og"] # 0x2a07 (en: 'two logical and operator', google: 'tvĂ„ logiska och operatörer') + - "⚈": [T: "to logiske eller"] # 0x2a08 (en: 'two logical or operator', google: 'tvĂ„ logiska eller operatörer') + - "⹉": [T: "ganger"] # 0x2a09 (en: 'times operator', google: 'times operator') + - "⹊": [T: "modulo to sum"] # 0x2a0a (en: 'modulo two sum', google: 'modulo tvĂ„ summa') + - "⹋": [T: "sum med integral"] # 0x2a0b (en: 'summation with integral', google: 'summering med integrerad') + - "⹌": [T: "firedobbelt integral"] # 0x2a0c (en: 'quadruple integral operator') + - "⚍": [T: "integral med horisontal strek"] # 0x2a0d (en: 'finite part integral') + - "⚎": [T: "integral med dobbel horisontal strek"] # 0x2a0e (en: 'integral with double stroke', google: 'integrerad med dubbelslag') + - "⚏": [T: "integral med skrĂ„strek"] # 0x2a0f (en: 'integral average with slash', google: 'integrerat medelvĂ€rde med snedstreck') + - "⚐": [T: "sirkulasjons-funksjon"] # 0x2a10 (en: 'circulation function') + - "⹑": [T: "integrasjon mot klokka"] # 0x2a11 (en: 'anticlockwise integration') + - "⹒": [T: "linjeintegral med rektangulĂŠr vei rundt pol"] # 0x2a12 (en: 'line integration with rectangular path around pole') + - "⹓": [T: "linjeintegral med halvsirkel-vei rundt pol"] # 0x2a13 (en: 'line integration with semicircular path around pole') + - "⹔": [T: "linjeintegral eksklusiv polen"] # 0x2a14 (en: 'line integration not including the pole', MathPlayer: 'line integration not including the pole', google: 'linjeintegration inkluderar inte polen') + - "⹕": [T: "integral rund punkt-operator"] # 0x2a15 + - "⹖": [T: "integral med firkant"] # 0x2a16 + - "⹗": [T: "integral med venstrepil med krok"] # 0x2a17 (en: 'integral with leftwards arrow with hook') + - "⚘": [T: "integral med multiplikasjonstegn"] # 0x2a18 (en: 'integral with times sign', google: 'integrerad med times sign') + - "⹙": [T: "integral med snitt"] # 0x2a19 (en: 'integral with intersection', google: 'integrerad med korsning') + - "⹚": [T: "integral med union"] # 0x2a1a (en: 'integral with union', google: 'integrerad med unionen') + - "⹛": [T: "integral med horisontal strek over"] # 0x2a1b (en: 'integral with overbar', google: 'integrerad med overbar') + - "⹜": [T: "integral med horisontal strek under"] # 0x2a1c (en: 'integral with underbar', google: 'integrerad med underbar') + - "⚝": [T: "join"] # 0x2a1d (en: 'join', google: 'ansluta sig') + - "⚞": [T: "stor venstre trekant"] # 0x2a1e (en: 'large left triangle operator', google: 'stor vĂ€nster triangeloperatör') + - "⹟": [T: "skjema-sammensetning z-notasjon"] # 0x2a1f (en: 'z notation schema composition', google: 'z notationsschema komposition') + - "âš ": [T: "skjema-sluse z-notasjon"] # 0x2a20 (en: 'z notation schema piping', google: 'z notation schema piping') + - "⚥": [T: "skjema-projeksjon z-notasjon"] # 0x2a21 (en: 'z notation schema projection', google: 'z notation schema projection') + - "âšą": [T: "pluss med sirkel over"] # 0x2a22 (en: 'plus sign with circle above', MathPlayer: 'plustecken med ring över', google: 'plus skylt med cirkel ovan') + - "⚣": [T: "pluss med cirkumfleks over"] # 0x2a23 (en: 'plus sign with circumflex accent above', MathPlayer: 'plustecken med cirkumflex accent över', google: 'plus -tecken med circumflex -accent ovan') + - "⚀": [T: "pluss med tilde over"] # 0x2a24 (en: 'plus sign with tilde above') + - "âš„": [T: "pluss med prikk under"] # 0x2a25 (en: 'plus sign with dot below', MathPlayer: 'plustecken med punkt under', google: 'plus skylt med dot nedan') + - "⚊": [T: "pluss med tilde under"] # 0x2a26 (en: 'plus sign with tilde below') + - "âš§": [T: "pluss med nedre indeks to"] # 0x2a27 (en: 'plus sign with subscript two', MathPlayer: 'plustecken med index tvĂ„', google: 'plus skylt med prenumeration tvĂ„') + - "âšš": [T: "pluss med fylt trekant"] # 0x2a28 (en: 'plus sign with black triangle', google: 'plus skylt med svart triangel') + - "âš©": [T: "minus med komma over"] # 0x2a29 (en: 'minus sign with comma above', MathPlayer: 'minustecken med komma över', google: 'minus tecken med komma ovan') + - "âšȘ": [T: "minus med prikk under"] # 0x2a2a (en: 'minus sign with dot below', MathPlayer: 'minustecken med punkt under', google: 'minus tecken med prick nedan') + - "âš«": [T: "minus med fallende prikker"] # 0x2a2b (en: 'minus sign with falling dots', google: 'minus tecken med fallande prickar') + - "⚏": [T: "minus med stigende prikker"] # 0x2a2c (en: 'minus sign with rising dots', google: 'minus tecken med stigande prickar') + - "âš­": [T: "pluss i venstre halvsirkel"] # 0x2a2d (en: 'plus sign in left half circle', MathPlayer: 'plustecken i vĂ€nster halvcirkel', google: 'plus logga in vĂ€nster halva cirkeln') + - "âšź": [T: "pluss i hĂžyre halvsirkel"] # 0x2a2e (en: 'plus sign in right half circle', MathPlayer: 'plustecken i höger halvcirkel', google: 'plus logga in höger halv cirkel') + - "⚯": # 0x2a2f + - test: + if: "$Verbosity='Terse'" + then: [T: "kryss"] + else: [T: "kryssprodukt"] + - "âš°": [T: "multiplikasjon med prikk over"] # 0x2a30 (en: 'multiplication sign with dot above') + - "âš±": [T: "multiplikasjon med strek under"] # 0x2a31 (en: 'multiplication sign with underbar') + - "âšČ": [T: "semi-direkte produkt med lukket bunn"] # 0x2a32 (en: 'semidirect product with bottom closed', google: 'semidirect -produkt med botten stĂ€ngd') + - "âšł": [T: "smash-produkt"] # 0x2a33 (en: 'smash product', MathPlayer: 'smash product', google: 'krossa produkten') + - "⚎": [T: "multiplikasjon i venstre halvsirkel"] # 0x2a34 (en: 'multiplication sign in left half circle') + - "âš”": [T: "multiplikasjon i hĂžyre halvsirkel"] # 0x2a35 (en: 'multiplication sign in right half circle') + - "âš¶": [T: "multiplikasjon i sirkel med cirkumfleks"] # 0x2a36 (en: 'circled multiplication sign with circumflex accent') + - "âš·": [T: "multiplikasjon i dobbel sirkel"] # 0x2a37 (en: 'multiplication sign in double circle') + - "âšž": [T: "divisjon i sirkel"] # 0x2a38 + - "âšč": [T: "pluss i trekant"] # 0x2a39 (en: 'plus sign in triangle', MathPlayer: 'plustecken i triangel', google: 'plus inloggning av triangeln') + - "âšș": [T: "minus i trekant"] # 0x2a3a (en: 'minus sign in triangle', MathPlayer: 'minustecken i triangel', google: 'minus logga in triangel') + - "âš»": [T: "multiplikasjon i trekant"] # 0x2a3b (en: 'multiplication sign in triangle') + - "⚌": [T: "interior product"] # 0x2a3c (en: 'interior product', MathPlayer: 'interior product', google: 'interiörprodukt') + - "âšœ": [T: "invers interior product"] # 0x2a3d (en: 'righthand interior product', google: 'högra interiörprodukt') + - "⚟": [T: "relasjonssammensetning z-notasjon"] # 0x2a3e + - "âšż": [T: "koprodukt"] # 0x2a3f (en: 'amalgamation or coproduct', MathPlayer: 'amalgamation or coproduct', google: 'amalgamation eller coprodukt') + - "⩀": [T: "snitt med prikk"] # 0x2a40 (en: 'intersection with dot') + - "⩁": [T: "union med minus"] # 0x2a41 (en: 'union with minus sign', google: 'union med minus tecken') + - "⩂": [T: "union med horisontal strek over"] # 0x2a42 (en: 'union with overbar') + - "⩃": [T: "snitt med horisontal strek over"] # 0x2a43 (en: 'intersection with overbar') + - "⩄": [T: "snitt med logisk og"] # 0x2a44 (en: 'intersection with logical and') + - "⩅": [T: "union med logisk eller"] # 0x2a45 (en: 'union with logical or') + - "⩆": [T: "union over snitt"] # 0x2a46 (en: 'union above intersection') + - "⩇": [T: "snitt over union"] # 0x2a47 (en: 'intersection above union') + - "⩈": [T: "union over strek over snitt"] # 0x2a48 (en: 'union above bar above intersection') + - "⩉": [T: "snitt over strek over union"] # 0x2a49 (en: 'intersection above bar above union') + - "⩊": [T: "union ved siden av og sammensatt med union"] # 0x2a4a (en: 'union beside and joined with union') + - "⩋": [T: "snitt ved siden av og sammensatt med snitt"] # 0x2a4b (en: 'intersection beside and joined with intersection') + - "⩌": [T: "lukket union med seriffer"] # 0x2a4c (en: 'closed union with serifs') + - "⩍": [T: "lukket snitt med seriffer"] # 0x2a4d (en: 'closed intersection with serifs') + - "⩎": [T: "dobbelt kvadratisk snitt"] # 0x2a4e (en: 'double square intersection', google: 'korsning av dubbel kvadrat') + - "⩏": [T: "dobbel kvadratisk union"] # 0x2a4f (en: 'double square union', google: 'double square union') + - "⩐": [T: "lukket union med seriffer og smash-produkt"] # 0x2a50 (en: 'closed union with serifs and smash product') + - "⩑": [T: "logisk og med prikk over"] # 0x2a51 (en: 'logical and with dot above', google: 'logisk och med punkt ovan') + - "⩒": [T: "logisk eller med prikk over"] # 0x2a52 (en: 'logical or with dot above', google: 'logisk eller med punkt ovan') + - "⩓": [T: "dobbel logisk og"] # 0x2a53 (en: 'double logical and') + - "⩔": [T: "dobbel logisk eller"] # 0x2a54 (en: 'double logical or') + - "⩕": [T: "to kryssende logiske og"] # 0x2a55 (en: 'two intersecting logical and') + - "⩖": [T: "to kryssende logiske eller"] # 0x2a56 (en: 'two intersecting logical or') + - "⩗": [T: "skrĂ„nende eller"] # 0x2a57 (en: 'sloping large or') + - "⩘": [T: "skrĂ„nende og"] # 0x2a58 (en: 'sloping large and') + - "⩙": [T: "logisk eller overlapper logisk og"] # 0x2a59 (en: 'logical or overlapping logical and', google: 'logisk eller överlappande logisk och') + - "⩚": [T: "logisk og med vertikal strek"] # 0x2a5a (en: 'logical and with middle stem') + - "⩛": [T: "logisk eller med vertikal strek"] # 0x2a5b (en: 'logical or with middle stem') + - "⩜": [T: "logisk og med horisontal strek"] # 0x2a5c (en: 'logical and with horizontal dash') + - "⩝": [T: "logisk eller med horisontal strek"] # 0x2a5d (en: 'logical or with horizontal dash') + - "⩞": [T: "logisk og med dobbel horisontal strek over"] # 0x2a5e (en: 'logical and with double overbar', google: 'logiskt och med dubbelt överbar') + - "⩟": [T: "logisk og med understrek"] # 0x2a5f (en: 'logical and with underbar') + - "â© ": [T: "logisk og med dobbel understrek"] # 0x2a60 (en: 'logical and with double underbar', google: 'logisk och med dubbel underbar') + - "⩥": [T: "liten v med understrek"] # 0x2a61 (en: 'small vee with underbar', google: 'liten vee med underbar') + - "⩹": [T: "logisk eller med dobbel horisontal strek over"] # 0x2a62 (en: 'logical or with double overbar', google: 'logisk eller med dubbel överbar') + - "⩣": [T: "logisk eller med dobbel understrek"] # 0x2a63 (en: 'logical or with double underbar', google: 'logisk eller med dubbel underbar') + - "â©€": [T: "definisjonsmengde antibegrensning z-notasjon"] # 0x2a64 (en: 'z notation domain antirestriction', google: 'z notation domain antirestriction') + - "â©„": [T: "verdimengde antibegrensning z-notasjon"] # 0x2a65 (en: 'z notation range antirestriction', google: 'z notation range antirestriction') + - "⩊": [T: "lik med prikk under"] # 0x2a66 (en: 'equals sign with dot below') + - "â©§": [T: "prikk over identisk med"] # 0x2a67 (en: 'identical with dot above', google: 'identisk med prick ovan') + - "⩚": [T: "trippel horisontal strek med dobbel vertikal strek"] # 0x2a68 (en: 'triple horizontal bar with double vertical stroke', google: 'trippel horisontell stĂ„ng med dubbel vertikal stroke') + - "â©©": [T: "trippel horisontal strek med trippel vertikal strek"] # 0x2a69 (en: 'triple horizontal bar with triple vertical stroke', google: 'trippel horisontell stĂ„ng med trippel vertikal stroke') + - "â©Ș": [T: "tilde med prikk over"] # 0x2a6a (en: 'tilde operator with dot above') + - "â©«": [T: "tilde med stigende prikker"] # 0x2a6b (en: 'tilde operator with rising dots', google: 'tilde -operatör med stigande prickar') + - "⩏": [T: "asymptotisk lik over tilde"] # 0x2a6c (en: 'similar minus similar', google: 'liknande minus liknande') + - "â©­": [T: "tilnĂŠrmet lik med prikk over"] # 0x2a6d (en: 'congruent with dot above') + - "⩟": [T: "lik med asterisk over"] # 0x2a6e (en: 'equals with asterisk', google: 'lika med asterisk') + - "⩯": [T: "tilnĂŠrmet lik med cirkumfleks"] # 0x2a6f (en: 'almost equal to with circumflex accent') + - "â©°": [T: "tilnĂŠrmet lik eller lik"] # 0x2a70 (en: 'approximately equal to or equal to', google: 'ungefĂ€r lika med eller lika med') + - "⩱": [T: "lik over pluss"] # 0x2a71 (en: 'equals sign above plus sign') + - "â©Č": [T: "pluss over lik"] # 0x2a72 (en: 'plus sign above equals sign') + - "⩳": [T: "lik over tilde"] # 0x2a73 (en: 'equals sign above tilde operator') + - "⩎": [T: "dobbelt kolon lik"] # 0x2a74 (en: 'double colon equal') + - "â©”": [T: "dobbelt likhetstegn"] # 0x2a75 (en: 'two consecutive equals signs') + - "â©¶": [T: "trippelt likhetstegn"] # 0x2a76 (en: 'three consecutive equals signs', google: 'tre pĂ„ varandra följande tecken') + - "â©·": [T: "lik med to prikker over og to prikker under"] # 0x2a77 (en: 'equals sign with two dots above and two dots below') + - "⩞": [T: "fire prikker over identisk med"] # 0x2a78 (en: 'equivalent with four dots above') + - "â©č": [T: "mindre enn med sirkel i"] # 0x2a79 (en: 'less than with circle inside') + - "â©ș": [T: "stĂžrre enn med sirkel i"] # 0x2a7a (en: 'greater than with circle inside') + - "â©»": [T: "mindre enn med spĂžrsmĂ„lstegn over"] # 0x2a7b (en: 'less than with question mark above') + - "⩌": [T: "stĂžrre enn med spĂžrsmĂ„lstegn over"] # 0x2a7c (en: 'greater than with question mark above') + - "⩜": [T: "mindre enn eller lik"] # 0x2a7d (en: 'less than or slanted equal to') + - "⩟": [T: "stĂžrre enn eller lik"] # 0x2a7e (en: 'greater than or slanted equal to') + - "⩿": [T: "mindre enn eller lik med prikk"] # 0x2a7f (en: 'less than or slanted equal to with dot inside') + - "âȘ€": [T: "stĂžrre enn eller lik med prikk"] # 0x2a80 (en: 'greater than or slanted equal to with dot inside') + - "âȘ": [T: "mindre enn eller lik med prikk over til venstre"] # 0x2a81 (en: 'less than or slanted equal to with dot above') + - "âȘ‚": [T: "stĂžrre enn eller lik med prikk over til hĂžyre"] # 0x2a82 (en: 'greater than or slanted equal to with dot above') + - "âȘƒ": [T: "mindre enn eller lik med prikk over til hĂžyre"] # 0x2a83 (en: 'less than or slanted equal to with dot above right') + - "âȘ„": [T: "stĂžrre enn eller lik med prikk over til venstre"] # 0x2a84 (en: 'greater than or slanted equal to with dot above left') + - "âȘ…": [T: "mindre enn eller tilnĂŠrmet lik"] # 0x2a85 (en: 'less than or approximate', google: 'mindre Ă€n eller ungefĂ€rligt') + - "âȘ†": [T: "stĂžrre enn eller tilnĂŠrmet lik"] # 0x2a86 (en: 'greater than or approximate', google: 'större Ă€n eller ungefĂ€rligt') + - "âȘ‡": [T: "mindre enn men ikke lik"] # 0x2a87 (en: 'less than and single line not equal to', google: 'mindre Ă€n och enstaka linjer inte lika med') + - "âȘˆ": [T: "stĂžrre enn men ikke lik"] # 0x2a88 (en: 'greater than and single line not equal to', google: 'större Ă€n och enstaka linjer inte lika med') + - "âȘ‰": [T: "mindre enn men ikke tilnĂŠrmet lik"] # 0x2a89 (en: 'less than and not approximate') + - "âȘŠ": [T: "stĂžrre enn men ikke tilnĂŠrmet lik"] # 0x2a8a (en: 'greater than and not approximate') + - "âȘ‹": [T: "mindre enn over lik over stĂžrre enn"] # 0x2a8b (en: 'less than above double line equal above greater than', google: 'mindre Ă€n över dubbel linje lika över större Ă€n') + - "âȘŒ": [T: "stĂžrre enn over lik over mindre enn"] # 0x2a8c (en: 'greater than above double line equal above less than', google: 'större Ă€n över dubbel linje lika över mindre Ă€n') + - "âȘ": [T: "mindre enn over asymptotisk lik"] # 0x2a8d (en: 'less than above similar or equal') + - "âȘŽ": [T: "stĂžrre enn over asymptotisk lik"] # 0x2a8e (en: 'greater than above similar or equal') + - "âȘ": [T: "mindre enn over tilde over stĂžrre enn"] # 0x2a8f (en: 'less than above similar above greater than') + - "âȘ": [T: "stĂžrre enn over tilde over mindre enn"] # 0x2a90 (en: 'greater than above similar above less than') + - "âȘ‘": [T: "mindre enn over stĂžrre enn over lik"] # 0x2a91 (en: 'less than above greater than above double line equal') + - "âȘ’": [T: "stĂžrre enn over mindre enn over lik"] # 0x2a92 (en: 'greater than above less than above double line equal') + - "âȘ“": [T: "mindre enn eller lik over stĂžrre enn eller lik"] # 0x2a93 (en: 'less than above slanted equal above greater than above slanted equal') + - "âȘ”": [T: "stĂžrre enn eller lik over mindre enn eller lik"] # 0x2a94 (en: 'greater than above slanted equal above less than above slanted equal') + - "âȘ•": [T: "lik eller mindre enn"] # 0x2a95 (en: 'slanted equal to or less than', google: 'lutt lika med eller mindre Ă€n') + - "âȘ–": [T: "lik eller stĂžrre enn"] # 0x2a96 (en: 'slanted equal to or greater than', google: 'lutt lika med eller större Ă€n') + - "âȘ—": [T: "lik eller mindre enn med prikk"] # 0x2a97 (en: 'slanted equal to or less than with dot inside') + - "âȘ˜": [T: "lik eller stĂžrre enn med prikk"] # 0x2a98 (en: 'slanted equal to or greater than with dot inside') + - "âȘ™": [T: "lik eller mindre enn"] # 0x2a99 (en: 'double line equal to or less than', MathPlayer: 'equal (dubbel) over less than', google: 'dubbel linje lika med eller mindre Ă€n') + - "âȘš": [T: "lik eller stĂžrre enn"] # 0x2a9a (en: 'double line equal to or greater than') + - "âȘ›": [T: "lik eller mindre enn"] # 0x2a9b (en: 'double line slanted equal to or less than', google: 'dubbel linje lutad lika med eller mindre Ă€n') + - "âȘœ": [T: "lik eller stĂžrre enn"] # 0x2a9c (en: 'double line slanted equal to or greater than', google: 'dubbel linje lutad lika med eller större Ă€n') + - "âȘ": [T: "tilnĂŠrmet lik eller mindre enn"] # 0x2a9d (en: 'similar or less than') + - "âȘž": [T: "tilnĂŠrmet lik eller stĂžrre enn"] # 0x2a9e (en: 'similar or greater than') + - "âȘŸ": [T: "tilnĂŠrmet lik over mindre enn over lik"] # 0x2a9f (en: 'similar above less than above equals sign') + - "âȘ ": [T: "tilnĂŠrmet lik over stĂžrre enn over lik"] # 0x2aa0 (en: 'similar above greater than above equals sign') + - "âȘĄ": [T: "dobbel mindre enn"] # 0x2aa1 (en: 'double nested less than') + - "âȘą": [T: "dobbel stĂžrre enn"] # 0x2aa2 (en: 'double nested greater than') + - "âȘŁ": [T: "dobbel mindre enn med strek under"] # 0x2aa3 (en: 'double nested less than with underbar', google: 'dubbel kapslad mindre Ă€n med underbar') + - "âȘ€": [T: "stĂžrre enn overlapper mindre enn"] # 0x2aa4 (en: 'greater than overlapping less than') + - "âȘ„": [T: "stĂžrre enn ved siden av mindre enn"] # 0x2aa5 (en: 'greater than beside less than') + - "âȘŠ": [T: "mindre enn lukket av kurve"] # 0x2aa6 (en: 'less than closed by curve') + - "âȘ§": [T: "stĂžrre enn lukket av kurve"] # 0x2aa7 (en: 'greater than closed by curve') + - "âȘš": [T: "mindre enn lukket av kurve over lik"] # 0x2aa8 (en: 'less than closed by curve above slanted equal') + - "âȘ©": [T: "stĂžrre enn lukket av kurve over lik"] # 0x2aa9 (en: 'greater than closed by curve above slanted equal') + - "âȘȘ": [T: "mindre enn"] # 0x2aaa (en: 'smaller than') + - "âȘ«": [T: "stĂžrre enn"] # 0x2aab (en: 'larger than') + - "âȘŹ": [T: "mindre enn eller lik"] # 0x2aac (en: 'smaller than or equal to') + - "âȘ­": [T: "stĂžrre enn eller lik"] # 0x2aad (en: 'larger than or equal to') + - "âȘź": [T: "lik med hump over"] # 0x2aae (en: 'equals sign with bumpy above', MathPlayer: 'difference between (grav accentnt)', google: 'Ă€r lika med tecken med ojĂ€mn ovan') + - "âȘŻ": [T: "foregĂ„r over likhetsstrek"] # 0x2aaf (en: 'precedes above single line equals sign') + - "âȘ°": [T: "fĂžlger over likhetsstrek"] # 0x2ab0 (en: 'succeeds above single line equals sign', google: 'lyckas över enstaka linjen Ă€r lika med tecken') + - "âȘ±": [T: "foregĂ„r over utstrĂžket likhetsstrek"] # 0x2ab1 (en: 'precedes above single line not equal to', google: 'föregĂ„r över enstaka linjer som inte Ă€r lika med') + - "âȘČ": [T: "fĂžlger over utstrĂžket likhetsstrek"] # 0x2ab2 (en: 'succeeds above single line not equal to', google: 'lyckas över enstaka linjer som inte Ă€r lika med') + - "âȘł": [T: "foregĂ„r over lik"] # 0x2ab3 (en: 'precedes above equals sign', google: 'föregĂ„r över lika tecken') + - "âȘŽ": [T: "fĂžlger over lik"] # 0x2ab4 (en: 'succeeds above equals sign', google: 'lyckas över lika tecken') + - "âȘ”": [T: "foregĂ„r over ikke lik"] # 0x2ab5 (en: 'precedes above not equal to') + - "âȘ¶": [T: "fĂžlger over ikke lik"] # 0x2ab6 (en: 'succeeds above not equal to') + - "âȘ·": [T: "foregĂ„r over tilnĂŠrmet lik"] # 0x2ab7 (en: 'precedes above almost equal to', google: 'föregĂ„r över nĂ€stan lika med') + - "âȘž": [T: "fĂžlger over tilnĂŠrmet lik"] # 0x2ab8 (en: 'succeeds above almost equal to', google: 'lyckas över nĂ€stan lika med') + - "âȘč": [T: "foregĂ„r over ikke tilnĂŠrmet lik"] # 0x2ab9 (en: 'precedes above not almost equal to', google: 'föregĂ„r ovan inte nĂ€stan lika med') + - "âȘș": [T: "fĂžlger over ikke tilnĂŠrmet lik"] # 0x2aba (en: 'succeeds above not almost equal to', google: 'lyckas ovan inte nĂ€stan lika med') + - "âȘ»": [T: "dobbel foregĂ„r"] # 0x2abb (en: 'double precedes') + - "âȘŒ": [T: "dobbel fĂžlger"] # 0x2abc (en: 'double succeeds') + - "âȘœ": [T: "delmengde med prikk"] # 0x2abd (en: 'subset with dot') + - "âȘŸ": [T: "overmengde med prikk"] # 0x2abe (en: 'superset with dot') + - "âȘż": [T: "delmengde med pluss under"] # 0x2abf (en: 'subset with plus sign below', MathPlayer: 'delmĂ€ngd med plustecken under', google: 'delmĂ€ngd med plus -skylt nedan') + - "⫀": [T: "overmengde med pluss under"] # 0x2ac0 (en: 'superset with plus sign below', MathPlayer: 'delmĂ€ngd med plustecken under', google: 'superset med plus -skylt nedan') + - "⫁": [T: "delmengde med multiplikasjon under"] # 0x2ac1 (en: 'subset with multiplication sign below') + - "⫂": [T: "overmengde med multiplikasjon under"] # 0x2ac2 (en: 'superset with multiplication sign below') + - "⫃": [T: "delmengde av eller lik med prikk over"] # 0x2ac3 (en: 'subset of or equal to with dot above') + - "⫄": [T: "overmengde av eller lik med prikk over"] # 0x2ac4 (en: 'superset of or equal to with dot above') + - "⫅": [T: "delmenge av over lik"] # 0x2ac5 (en: 'subset of above equals sign', google: 'undergruppen ovan Ă€r lika med tecken') + - "⫆": [T: "overmengde av over lik"] # 0x2ac6 (en: 'superset of above equals sign', google: 'superset av ovan Ă€r lika med tecken') + - "⫇": [T: "delmengde av over tilde"] # 0x2ac7 (en: 'subset of above tilde operator') + - "⫈": [T: "overmengde av over tilde"] # 0x2ac8 (en: 'superset of above tilde operator') + - "⫉": [T: "delmengde av over tilnĂŠrmet lik"] # 0x2ac9 (en: 'subset of above almost equal to', google: 'delmĂ€ngd över nĂ€stan lika med') + - "⫊": [T: "overmengde av over tilnĂŠrmet lik"] # 0x2aca (en: 'superset of above almost equal to', google: 'superset över nĂ€stan lika med') + - "⫋": [T: "delmengde av over ikke lik"] # 0x2acb (en: 'subset above not equal to', google: 'delmĂ€ngd ovan inte lika med') + - "⫌": [T: "overmengde av over ikke lik"] # 0x2acc (en: 'superset of above not equal to', google: 'superset av ovan inte lika med') + - "⫍": [T: "venstre kvadratisk Ă„pen boks"] # 0x2acd (en: 'square left open box operator', google: 'square left open box operator') + - "⫎": [T: "hĂžyre kvadratisk Ă„pen boks"] # 0x2ace (en: 'square right open box operator', google: 'square right open box operator') + - "⫏": [T: "lukket delmengde"] # 0x2acf (en: 'closed subset') + - "⫐": [T: "lukket overmengde"] # 0x2ad0 (en: 'closed superset') + - "⫑": [T: "lukket delmengde eller lik"] # 0x2ad1 (en: 'closed subset or equal to') + - "⫒": [T: "lukket overmengde eller lik"] # 0x2ad2 (en: 'closed superset or equal to') + - "⫓": [T: "delmengde over overmengde"] # 0x2ad3 (en: 'subset above superset') + - "⫔": [T: "overmengde over delmengde"] # 0x2ad4 (en: 'superset above subset') + - "⫕": [T: "delmengde over delmengde"] # 0x2ad5 (en: 'subset above subset') + - "⫖": [T: "overmengde over overmengde"] # 0x2ad6 (en: 'superset above superset') + - "⫗": [T: "overmengde ved siden av delmengde"] # 0x2ad7 (en: 'superset beside subset') + - "⫘": [T: "overmengde ved siden av og sammenfĂžyd med delmengde"] # 0x2ad8 (en: 'superset beside and joined by dash with subset') + - "⫙": [T: "tilhĂžrer med Ă„pning nedover"] # 0x2ad9 (en: 'element of opening downwards') + - "⫚": [T: "hĂžygaffel med t Ăžverst"] # 0x2ada (en: 'pitchfork with tee top') + - "⫛": [T: "tverrgĂ„ende snitt"] # 0x2adb (en: 'transversal intersection') + - "⫝̸": [T: "avhengig"] # 0x2adc (en: 'forking', google: 'gaffel') + - "⫝": [T: "uavhengig"] # 0x2add (en: 'nonforking', google: 'icke -förflyttning') + - "⫞": [T: "kort venstre dreiekors"] # 0x2ade (en: 'short left tack', google: 'kort vĂ€nster tack') + - "⫟": [T: "kort nedoverrotert dreiekors"] # 0x2adf (en: 'short down tack', google: 'kort ner') + - "â« ": [T: "kort oppoverrotert dreiekors"] # 0x2ae0 (en: 'short up tack', google: 'kort upp tack') + - "⫥": [T: "vinkelrett med s"] # 0x2ae1 (en: 'perpendicular with s', google: 'vinkelrĂ€tt med s') + - "⫹": [T: "vertikal strek trippelt hĂžyre dreiekors"] # 0x2ae2 (en: 'vertical bar triple right turnstile', google: 'vertikal bar trippel höger turnstile') + - "⫣": [T: "dobbel vertikal strek venstre dreiekors"] # 0x2ae3 (en: 'double vertical bar left turnstile', google: 'dubbel vertikal stĂ„ng vĂ€nster turnstile') + - "â«€": [T: "vertikal strek dobbelt venstre dreiekors"] # 0x2ae4 (en: 'vertical bar double left turnstile') + - "â«„": [T: "dobbel vertikal strek dobbelt venstre dreiekors"] # 0x2ae5 (en: 'double vertical bar double left turnstile', google: 'dubbel vertikal stĂ„ng dubbel vĂ€nster vridstil') + - "⫊": [T: "dreiekors med vertikal strek"] # 0x2ae6 (en: 'long dash from left member of double vertical') + - "â«§": [T: "nedoverrotert kort dreiekors med horisontal strek over"] # 0x2ae7 (en: 'short down tack with overbar') + - "⫚": [T: "oppoverrotert kort dreiekors med horisontal strek under"] # 0x2ae8 (en: 'short up tack with underbar') + - "â«©": [T: "oppoverrotert kort dreiekors over nedoverrotert kort dreiekors"] # 0x2ae9 (en: 'short up tack above short down tack') + - "â«Ș": [T: "nedoverrotert dobbelt dreiekors"] # 0x2aea (en: 'double down tack', google: 'dubbel down tack') + - "â««": [T: "oppoverrotert dobbelt dreiekors"] # 0x2aeb (en: 'double up tack') + - "⫏": [T: "dobbeltstreket ikke"] # 0x2aec (en: 'double stroke not sign') + - "â«­": [T: "omvendt dobbeltstreket ikke"] # 0x2aed (en: 'reversed double stroke not sign') + - "⫟": [T: "deler ikke med omvendt skrĂ„strek"] # 0x2aee (en: 'does not divide with reversed negation slash') + - "⫯": [T: "vertikal strek med sirkel over"] # 0x2aef (en: 'vertical line with circle above') + - "â«°": [T: "vertikal strek med sirkel under"] # 0x2af0 (en: 'vertical line with circle below') + - "⫱": [T: "nedoverrotert dreiekors med sirkel under"] # 0x2af1 (en: 'down tack with circle below') + - "â«Č": [T: "parallel med horisontal strek"] # 0x2af2 (en: 'parallel with horizontal stroke') + - "⫳": [T: "parallel med tilde"] # 0x2af3 (en: 'parallel with tilde operator') + - "⫎": [T: "trippel loddrett strek"] # 0x2af4 (en: 'triple vertical bar binary relation', google: 'trippel vertikal bar binĂ€r relation') + - "â«”": [T: "trippel loddrett strek med horisontal strek"] # 0x2af5 (en: 'triple vertical bar with horizontal stroke', google: 'trippel vertikal stĂ„ng med horisontellt slag') + - "â«¶": [T: "trippelkolon"] # 0x2af6 (en: 'triple colon operator', google: 'trippel kolonoperatör') + - "â«·": [T: "trippel mindre enn"] # 0x2af7 (en: 'triple nested less than', google: 'trippel kapslade mindre Ă€n') + - "⫞": [T: "trippel stĂžrre enn"] # 0x2af8 (en: 'triple nested greater than', google: 'trippel kapslad större Ă€n') + - "â«č": [T: "mindre enn eller lik"] # 0x2af9 (en: 'double line slanted less than or equal to', google: 'dubbel linje lutad mindre Ă€n eller lika med') + - "â«ș": [T: "stĂžrre enn eller lik"] # 0x2afa (en: 'double line slanted greater than or equal to', google: 'dubbel linje lutad större Ă€n eller lika med') + - "â«»": [T: "trippel skrĂ„strek"] # 0x2afb (en: 'triple solidus binary relation', google: 'trippel solidus binĂ€r relation') + - "⫌": [T: "stor trippel vertikal strek"] # 0x2afc (en: 'large triple vertical bar operator', google: 'stor trippel vertikal stĂ„ngoperatör') + - "⫝̸": [T: "dobbel skrĂ„strek"] # 0x2afd (en: 'double solidus operator', google: 'dubbel solidus -operatör') + - "⫟": [T: "hvit loddrett strek"] # 0x2afe (en: 'white vertical bar', google: 'vit vertikal stĂ„ng') + - "⫿": [T: "hvit loddrett strek"] # 0x2aff (en: 'white vertical bar', google: 'vit vertikal stĂ„ng') + #-------------------------------------------------------------------------------------------------------------- + # Miscellaneous symbols and arrows OK + - "⬀": [T: "hvit nordĂžst-pil"] # 0x2b00 (en: 'north east white arrow', google: 'north east white arrow') + - "⏁": [T: "hvit nordvest-pil"] # 0x2b01 (en: 'north west white arrow', google: 'north west white arrow') + - "⬂": [T: "hvit sĂžrĂžst-pil"] # 0x2b02 (en: 'south east white arrow', google: 'south east white arrow') + - "⏃": [T: "hvit sĂžrvest-pil"] # 0x2b03 (en: 'south west white arrow', google: 'south west white arrow') + - "⬄": [T: "hvit venstre-hĂžyre-pil"] # 0x2b04 (en: 'left right white arrow', google: 'vĂ€nster höger vit pil') + - "⬅": [T: "fylt venstrepil"] # 0x2b05 (en: 'leftwards black arrow', google: 'vĂ€nster svart pil') + - "⬆": [T: "fylt oppoverpil"] # 0x2b06 (en: 'upwards black arrow', google: 'uppĂ„t svart pil') + - "⬇": [T: "fylt nedoverpil"] # 0x2b07 (en: 'downwards black arrow', google: 'nedĂ„t svart pil') + - "⏈": [T: "fylt nordĂžst-pil"] # 0x2b08 (en: 'north east black arrow', google: 'north east black arrow') + - "⬉": [T: "fylt nordvest-pil"] # 0x2b09 (en: 'north west black arrow', google: 'north west black arrow') + - "⬊": [T: "fylt sĂžrĂžst-pil"] # 0x2b0a (en: 'south east black arrow', google: 'south east black arrow') + - "⬋": [T: "fylt sĂžrvest-pil"] # 0x2b0b (en: 'south west black arrow', google: 'south west black arrow') + - "⬌": [T: "fylt venstre-hĂžyre-pil"] # 0x2b0c (en: 'left right black arrow', google: 'vĂ€nster höger svart pil') + - "⬍": [T: "fylt opp-ned-pil"] # 0x2b0d (en: 'up down black arrow', google: 'upp ner black arrow') + - "⬎": [T: "hĂžyrepil med spiss ned"] # 0x2b0e (en: 'rightwards arrow with tip downwards', google: 'Ă„tgĂ€rdspil med spets nedĂ„t') + - "⬏": [T: "hĂžyrepil med spiss opp"] # 0x2b0f (en: 'rightwards arrow with tip upwards', google: 'Ă„tgĂ€rdspil med spetsen uppĂ„t') + - "⏐": [T: "venstrepil med spiss ned"] # 0x2b10 (en: 'leftwards arrow with tip downwards', google: 'vĂ€nster pil med spetsen nedĂ„t') + - "⬑": [T: "venstrepil med spiss opp"] # 0x2b11 (en: 'leftwards arrow with tip upwards', google: 'vĂ€nster pil med spetsen uppĂ„t') + - "⬒": [T: "kvadrat med Ăžvre halvdel fylt"] # 0x2b12 (en: 'square with top half black', google: 'fyrkantig med topphalva svart') + - "⬓": [T: "kvadrat med nedre halvdel fylt"] # 0x2b13 (en: 'square with bottom half black', google: 'fyrkantig med botten halvsvart') + - "⬔": [T: "kvadrat med Ăžvre hĂžyre diagonal halvfylt"] # 0x2b14 (en: 'square with upper right diagonal half black', google: 'fyrkantig med övre högra diagonala halvsvart') + - "⬕": [T: "kvadrat med nedre venstre diagonal halvfylt"] # 0x2b15 (en: 'square with lower left diagonal half black', google: 'fyrkantig med nedre vĂ€nster diagonal halvsvart') + - "⬖": [T: "diamant med venstre halvdel fylt"] # 0x2b16 (en: 'diamond with left half black', google: 'diamant med vĂ€nster halvsvart') + - "⬗": [T: "diamant med hĂžyre halvdel fylt"] # 0x2b17 (en: 'diamond with right half black', google: 'diamant med höger halv svart') + - "⏘": [T: "diamant med Ăžvre halvdel fylt"] # 0x2b18 (en: 'diamond with top half black', google: 'diamant med topp halva svart') + - "⬙": [T: "diamant med nedre halvdel fylt"] # 0x2b19 (en: 'diamond with bottom half black', google: 'diamant med botten halvsvart') + - "⬚": [T: "prikket kvadrat"] # 0x2b1a (en: 'box', google: 'lĂ„da') + - "⬛": [T: "stort svart kvadrat"] # 0x2b1b (en: 'black large square', google: 'svart stort fyrkant') + - "⬜": [T: "stort hvitt kvadrat"] # 0x2b1c (en: 'white large square', google: 'vit stor fyrkant') + - "⬝": [T: "veldig lite svart kvadrat"] # 0x2b1d (en: 'black very small square', google: 'svart mycket litet fyrkant') + - "⬞": [T: "veldig lite hvitt kvadrat"] # 0x2b1e (en: 'white very small square', google: 'vit mycket liten fyrkant') + - "⬟": [T: "svart femkant"] # 0x2b1f (en: 'black pentagon', google: 'svart pentagon') + - "⏠": [T: "hvit femkant"] # 0x2b20 (en: 'white pentagon', google: 'vit pentagon') + - "⏥": [T: "hvit sekskant"] # 0x2b21 (en: 'white hexagon', google: 'vit hexagon') + - "⏹": [T: "svart sekskant"] # 0x2b22 (en: 'black hexagon', google: 'svart hexagon') + - "⏣": [T: "horisontal svart sekskant"] # 0x2b23 (en: 'horizontal black hexagon', google: 'horisontell svart hexagon') + - "⏀": [T: "stor svart sirkel"] # 0x2b24 (en: 'black large circle', google: 'svart stor cirkel') + - "⏄": [T: "svart diamant"] # 0x2b25 (en: 'black medium diamond', google: 'svart medium diamant') + - "⏊": [T: "hvit diamant"] # 0x2b26 (en: 'white medium diamond', google: 'vit medium diamant') + - "⏧": [T: "svart rombe"] # 0x2b27 (en: 'black medium lozenge', google: 'svart medium pastill') + - "⏚": [T: "hvit rombe"] # 0x2b28 (en: 'white medium lozenge', google: 'vit medium pastill') + - "⏩": [T: "liten svart diamant"] # 0x2b29 (en: 'black small diamond') + - "âŹȘ": [T: "liten svart rombe"] # 0x2b2a (en: 'black small lozenge', google: 'svart liten pastill') + - "⏫": [T: "liten hvit rombe"] # 0x2b2b (en: 'white small lozenge', google: 'vit liten pastill') + - "⏏": [T: "svart horisontal ellipse"] # 0x2b2c (en: 'black horizontal ellipse') + - "⏭": [T: "hvit horisontal ellipse"] # 0x2b2d (en: 'white horizontal ellipse') + - "⏟": [T: "svart vertikal ellipse"] # 0x2b2e (en: 'black vertical ellipse', google: 'svart vertikalt ellips') + - "⏯": [T: "hvit vertikal ellipse"] # 0x2b2f (en: 'white vertical ellipse') + - "⏰": [T: "venstrepil med liten sirkel"] # 0x2b30 (en: 'left arrow with small circle', google: 'vĂ€nster pil med liten cirkel') + - "⏱": [T: "tre venstrepiler"] # 0x2b31 (en: 'three leftwards arrows') + - "âŹČ": [T: "venstrepil med pluss i sirkel"] # 0x2b32 (en: 'left arrow with circled plus', google: 'vĂ€nster pil med circled plus') + - "⏳": [T: "lang sikksakk venstrepil"] # 0x2b33 (en: 'long leftwards squiggle arrow', google: 'lĂ„ngt vĂ€nster squiggle pil') + - "⏎": [T: "venstrepil med dobbel spiss og vertikal strek"] # 0x2b34 (en: 'leftwards two headed arrow with vertical stroke', google: 'vĂ€nster tvĂ„ ledde pil med vertikalt slag') + - "⏔": [T: "venstrepil med dobbel spiss og dobbel vertikal strek"] # 0x2b35 (en: 'leftwards two headed arrow with double vertical stroke', google: 'vĂ€nster tvĂ„ ledde pil med dubbel vertikal stroke') + - "⏶": [T: "venstrepil med dobbel spiss fra strek"] # 0x2b36 (en: 'leftwards two headed arrow from bar', google: 'vĂ€nster tvĂ„ ledde pil frĂ„n bar') + - "⏷": [T: "stiplet venstrepil med dobbel spiss"] # 0x2b37 (en: 'leftwards two headed triple dash arrow', google: 'vĂ€nster tvĂ„ ledde trippelstreckpil') + - "⏞": [T: "stiplet venstrepil"] # 0x2b38 (en: 'leftwards arrow with dotted stem', google: 'vĂ€nster pil med prickad stam') + - "âŹč": [T: "venstrepil med vertikal strek og hale"] # 0x2b39 (en: 'leftwards arrow with tail with vertical stroke', google: 'vĂ€nster pil med svans med vertikalt slag') + - "âŹș": [T: "venstrepil med hale og dobbel vertikal strek"] # 0x2b3a (en: 'leftwards arrow with tail with double vertical stroke', google: 'vĂ€nster pil med svans med dubbel vertikal stroke') + - "⏻": [T: "venstrepil med dobbel spiss og hale"] # 0x2b3b (en: 'leftwards two headed arrow with tail', google: 'vĂ€nster tvĂ„ ledde pil med svans') + - "âŹŒ": [T: "venstrepil med dobbel spiss, hale og vertikal strek"] # 0x2b3c (en: 'leftwards two headed arrow with tail with vertical stroke', google: 'vĂ€nster tvĂ„ ledde pilen med svans med vertikal stroke') + - "âŹœ": [T: "venstrepil med dobbel spiss, hale og dobbel vertikal strek"] # 0x2b3d (en: 'leftwards two headed arrow with tail with double vertical stroke', google: 'vĂ€nster tvĂ„ ledde pilen med svans med dubbel vertikal stroke') + - "âŹŸ": [T: "venstrepil gjennom x"] # 0x2b3e (en: 'leftwards arrow through x', google: 'vĂ€nster pil genom x') + - "⏿": [T: "bĂžlget venstrepil"] # 0x2b3f (en: 'wave arrow pointing directly left', google: 'wave arrow pekade direkt kvar') + - "⭀": [T: "venstrepil med likhetstegn"] # 0x2b40 (en: 'equals sign above leftwards arrow', google: 'Ă€r lika med skylt över vĂ€nster pil') + - "⭁": [T: "venstrepil med speilvendt tilde"] # 0x2b41 (en: 'reverse tilde operator above leftwards arrow', google: 'omvĂ€nd tilde -operatör över vĂ€nster pil') + - "⭂": [T: "venstrepil over speilvendt omtrent lik"] # 0x2b42 (en: 'leftwards arrow above reverse almost equal to', google: 'vĂ€nster pil över omvĂ€nd nĂ€stan lika med') + - "⭃": [T: "hĂžyrepil gjennom stĂžrre enn"] # 0x2b43 (en: 'rightwards arrow through greater than', google: 'Ă„tgĂ€rdspil genom större Ă€n') + - "⭄": [T: "hĂžyrepil gjennom overmengde"] # 0x2b44 (en: 'rightwards arrow through superset', google: 'Ă„tgĂ€rdspil genom superset') + - "⭅": [T: "kvadrupel-streket venstrepil"] # 0x2b45 (en: 'leftwards quadruple arrow', google: 'vĂ€nster fyrdubbla pil') + - "⭆": [T: "kvadrupel-streket hĂžyrepil"] # 0x2b46 (en: 'rightwards quadruple arrow', google: 'Ă„tgĂ€rd med höger fyrdubbla') + - "⭇": [T: "hĂžyrepil med speilvendt tilde"] # 0x2b47 (en: 'reverse tilde operator above rightwards arrow', google: 'omvĂ€nd tilde -operatör ovanför höger-pilen') + - "⭈": [T: "hĂžyrepil over speilvendt omtrent lik"] # 0x2b48 (en: 'rightwards arrow above reverse almost equal to', google: 'Ă„tgĂ€rdspilen över omvĂ€nd nĂ€stan lika med') + - "⭉": [T: "venstrepil med tilde"] # 0x2b49 (en: 'tilde operator above leftwards arrow', google: 'tilde -operatören ovanför vĂ€nster pil') + - "⭊": [T: "venstrepil over omtrent lik"] # 0x2b4a (en: 'leftwards arrow above almost equal to', google: 'vĂ€nster pil över nĂ€stan lika med') + - "⭋": [T: "venstrepil over speilvendt tilde"] # 0x2b4b (en: 'leftwards arrow above reverse tilde operator', google: 'vĂ€nster pil ovanför omvĂ€nd tilde -operatör') + - "⭌": [T: "hĂžyrepil over speilvendt tilde"] # 0x2b4c (en: 'rightwards arrow above reverse tilde operator', google: 'Ă„tgĂ€rdspil över omvĂ€nd tilde -operatör') + - "⭐": [T: "hvit stjerne"] # 0x2b50 (en: 'white medium star') + - "⭑": [T: "liten svart stjerne"] # 0x2b51 (en: 'black small star') + - "⭒": [T: "liten hvit stjerne"] # 0x2b52 (en: 'white small star') + - "⭓": [T: "svart femkant som peker til hĂžyre"] # 0x2b53 (en: 'black right pointing pentagon', google: 'svart höger pekande pentagon') + - "⭔": [T: "hvit femkant som peker til hĂžyre"] # 0x2b54 (en: 'white right pointing pentagon', google: 'vit höger pekande pentagon') + - "⭕": [T: "fet stor sirkel"] # 0x2b55 (en: 'heavy large circle', google: 'tung stor cirkel') + - "⭖": [T: "fet oval med oval i"] # 0x2b56 (en: 'heavy oval with oval inside', google: 'tung oval med oval inuti') + - "⭗": [T: "fet sirkel med sirkel i"] # 0x2b57 (en: 'heavy circle with circle inside', google: 'tung cirkel med cirkel inuti') + - "⭘": [T: "fet sirkel"] # 0x2b58 (en: 'heavy circle', google: 'tung cirkel') + - "⭙": [T: "fet kryss i sirkel"] # 0x2b59 (en: 'heavy circled saltire', google: 'tung cirklad saltire') + #------------------------------------------------------------------------------------------------------------ + # Supplemental punctuation OK + - "⾀": [T: "rett vinkel erstatningsmarkĂžr"] # 0x2e00 (en: 'right angle substitution marker', google translation) + - "➁": [T: "rett vinkel erstatningsmarkĂžr med prikk"] # 0x2e01 (en: 'right angle dotted substitution marker', google translation) + - "⾂": [T: "venstre erstatningsparentes"] # 0x2e02 (en: 'left substitution bracket', google translation) + - "➃": [T: "hĂžyre erstatningsparentes"] # 0x2e03 (en: 'right substitution bracket', google translation) + - "⾄": [T: "venstre erstatningsparentes med prikk"] # 0x2e04 (en: 'left dotted substitution bracket', google translation) + - "⾅": [T: "hĂžyre erstatningsparentes med prikk"] # 0x2e05 (en: 'right dotted substitution bracket', google translation) + - "⾆": [T: "hevet interpolasjonsmarkĂžr"] # 0x2e06 (en: 'raised interpolation marker', google translation) + - "⾇": [T: "hevet interpolasjonsmarkĂžr med prikk"] # 0x2e07 (en: 'raised dotted interpolation marker', google translation) + - "➈": [T: "venstre transposisjonsmarkĂžr med prikk"] # 0x2e08 (en: 'dotted transposition marker marker', google translation) + - "⾉": [T: "venstre transposisjonsparentes"] # 0x2e09 (en: 'left transposition bracket', google translation) + - "⾊": [T: "hĂžyre transposisjonsparentes"] # 0x2e0a (en: 'right transposition bracket', google translation) + - "⾋": [T: "hevet kvadrat"] # 0x2e0b (en: 'raised square', google translation) + - "⾌": [T: "venstre hevet utelatelses-parentes"] # 0x2e0c (en: 'left raised omission bracket', google translation) + - "➍": [T: "hĂžyre hevet utelatelses-parentes"] # 0x2e0d (en: 'right raised omission bracket', google translation) + - "⾎": [T: "redaksjonell coronis"] # 0x2e0e (en: 'editorial coronis', google translation) + - "➏": [T: "paragraphos"] # 0x2e0f (google translation) + - "➐": [T: "forgreinet paragraphos"] # 0x2e10 (en: 'forked paragraphos', google translation) + - "⾑": [T: "speilvendt forgreinet paragraphos"] # 0x2e11 (en: 'reversed forked paragraphos', google translation) + - "⾒": [T: "hypodiastol"] # 0x2e12 (google translation) + - "⾓": [T: "prikket obelus"] # 0x2e13 (en: 'dotted obelos', google translation) + - "⾔": [T: "nedover ancora"] # 0x2e14 (en: 'downwards ancora', google translation) + - "⾕": [T: "oppover ancora"] # 0x2e15 (en: 'upwards ancora', google translation) + - "⾖": [T: "prikket hĂžyrepekende vinkel"] # 0x2e16 (en: 'dotted right pointing angle', google translation) + - "⾗": [T: "dobbel skrĂ„ bindestrek"] # 0x2e17 (en: 'double oblique hyphen', google translation) + - "➘": [T: "omvendt interrobang"] # 0x2e18 (en: 'inverted interrobang', google translation) + - "⾙": [T: "palmegren"] # 0x2e19 (google translation) + - "⾚": [T: "bindestrek med trema"] # 0x2e1a (en: 'hyphen with diaeresis', google translation) + - "⾛": [T: "tilde med ring"] # 0x2e1b (en: 'tilde with ring above', google translation) + - "⾜": [T: "lav venstre parafraseparentes"] # 0x2e1c (en: 'left low paraphrase bracket', google translation) + - "➝": [T: "lav hĂžyre parafraseparentes"] # 0x2e1d (en: 'right low paraphrase bracket', google translation) + - "⾞": [T: "tilde med prikk over"] # 0x2e1e (en: 'tilde with dot above', google translation) + - "⾟": [T: "tilde med prikk under"] # 0x2e1f (en: 'tilde with dot below', google translation) + - "âž ": [T: "vertikal strek med pigg til hĂžyre"] # 0x2e20 (en: 'left vertical bar with quill', google translation) + - "➥": [T: "vertikal strek med pigg til venstre"] # 0x2e21 (en: 'right vertical bar with quill', google translation) + - "âžą": [T: "Ăžvre venstre halv hakeparentes"] # 0x2e22 (en: 'top left half bracket', google: 'överst till vĂ€nster halvfĂ€ste') + - "➣": [T: "Ăžvre hĂžyre halv hakeparentes"] # 0x2e23 (en: 'top right half bracket', google: 'överst till höger halva konsol') + - "➀": [T: "nedre venstre halv hakeparentes"] # 0x2e24 (en: 'bottom left half bracket', google: 'nedre vĂ€nstra halvfĂ€stet') + - "âž„": [T: "nedre hĂžyre halv hakeparentes"] # 0x2e25 (en: 'bottom right half bracket', google: 'nedre högra halvfĂ€stet') + - "➊": [T: "venstre u-parentes"] # 0x2e26 (en: 'left sideways u bracket', google: 'vĂ€nster i sidled u konsol') + - "âž§": [T: "hĂžyre u-parentes"] # 0x2e27 (en: 'right sideways u bracket', google: 'höger i sidled u konsol') + - "âžš": [T: "dobbel venstreparentes"] # 0x2e28 (en: 'left double parentheses', google: 'vĂ€nster dubbla parenteser') + - "âž©": [T: "dobbel hĂžyreparentes"] # 0x2e29 (en: 'right double parentheses', google: 'höger dubbel parentes') + - "âžȘ": [T: "to prikker over Ă©n prikk"] # 0x2e2a (en: 'two dots over one dot punctuation', google translation) + - "âž«": [T: "Ă©n prikk over to prikker"] # 0x2e2b (en: 'one dot over two dots punctuation', google translation) + - "➏": [T: "fire prikker i kvadrat"] # 0x2e2c (en: 'squared four dot punctuation', google translation) + - "âž­": [T: "fem prikker i kryss"] # 0x2e2d (en: 'five dot mark', google translation) + - "âžź": [T: "speilvendt spĂžrsmĂ„lstegn"] # 0x2e2e (en: 'reversed question mark', google translation) + - "➯": [T: "vertikal tilde"] # 0x2e2f (en: 'vertical tilde', google translation) + - "âž°": [T: "ringpunkt"] # 0x2e30 (en: 'ring point', google translation) + - "âž±": [T: "ordskille-punkt"] # 0x2e31 (google translation) + - "âžČ": [T: "rotert komma"] # 0x2e32 (en: 'turned comma', google translation) + - "âžł": [T: "hevet prikk"] # 0x2e33 (en: 'raised dot', google translation) + - "➎": [T: "hevet komma"] # 0x2e34 (en: 'raised comma', google translation) + - "âž”": [T: "rotert semikolon"] # 0x2e35 (en: 'turned semicolon', google translation) + - "âž¶": [T: "dolk med venstre vaktstang"] # 0x2e36 (en: 'dagger with left guard', google translation) + - "âž·": [T: "dolk med hĂžyre vaktstang"] # 0x2e37 (en: 'dagger with right guard', google translation) + - "âžž": [T: "rotert dolk"] # 0x2e38 (en: 'turned dagger', google translation) + - "âžč": [T: "Ăžvre halvt avsnittssymbol"] # 0x2e39 (en: 'top half section sign', google translation) + - "âžș": [T: "dobbel tankestrek"] # 0x2e3a (en: 'two em dash', google translation) + - "âž»": [T: "trippel tankestrek"] # 0x2e3b (en: 'three em dash', google translation) + #------------------------------------------------------------------------------------------------------------------- + # CJK symbols and punctuation OK + - "〃": [T: "gjentategn"] # 0x3003 (google translation) + - "〈": [T: "venstre vinkelparentes"] # 0x3008 (en: 'left angle bracket', google: 'vĂ€nster vinkelfĂ€ste') + - "〉": [T: "hĂžyre vinkelparentes"] # 0x3009 (en: 'right angle bracket', google: 'rĂ€tt vinkelfĂ€ste') + - "《": [T: "dobbel venstre vinkelparentes"] # 0x300a (en: 'left double angle bracket') + - "》": [T: "dobbel hĂžyre vinkelparentes"] # 0x300b (en: 'right double angle bracket') + - "「": [T: "venstre hjĂžrneparentes"] # 0x300c (en: 'left corner bracket', google: 'vĂ€nster hörnfĂ€ste') + - "」": [T: "hĂžyre hjĂžrneparentes"] # 0x300d (en: 'right corner bracket', google: 'höger hörnfĂ€ste') + - "『": [T: "venstre hvit hjĂžrneparentes"] # 0x300e (en: 'left white corner bracket', google: 'vĂ€nster vit hörnfĂ€ste') + - "』": [T: "hĂžyre hvit hjĂžrneparentes"] # 0x300f (en: 'right white corner bracket', google: 'höger vit hörnfĂ€ste') + - "【": [T: "venstre svart linseformet hakeparentes"] # 0x3010 (en: 'left black lenticular bracket', google: 'vĂ€nster svart linsformell konsol') + - "】": [T: "hĂžyre svart linseformet hakeparentes"] # 0x3011 (en: 'right black lenticular bracket', google: 'höger svart linsformell konsol') + - "〔": [T: "venstre skilpaddeskall-parentes"] # 0x3014 (en: 'left tortoise shell bracket') + - "〕": [T: "hĂžyre skilpaddeskall-parentes"] # 0x3015 (en: 'right tortoise shell bracket') + - "〖": [T: "venstre hvit linseformet hakeparentes"] # 0x3016 (en: 'left white lenticular bracket', google: 'vĂ€nster vit linsformad konsol') + - "〗": [T: "hĂžyre hvit linseformet hakeparentes"] # 0x3017 (en: 'right white lenticular bracket', google: 'höger vit linsformad konsol') + - "〘": [T: "venstre hvit skilpaddeskall-parentes"] # 0x3018 (en: 'left white tortoise shell bracket', google: 'vĂ€nster vit sköldpaddsskalfĂ€ste') + - "〙": [T: "hĂžyre hvit skilpaddeskall-parentes"] # 0x3019 (en: 'right white tortoise shell bracket', google: 'höger vit sköldpaddsskalfĂ€ste') + - "〚": [T: "venstre hvit hakeparentes"] # 0x301a (en: 'left white square bracket') + - "〛": [T: "hĂžyre hvit hakeparentes"] # 0x301b (en: 'right white square bracket') + - "〜": [T: "bĂžlgestrek"] # 0x301c (en: 'wave dash', google: 'wave dash') + - "〰": [T: "bĂžlget strek"] # 0x3030 (en: 'wavy dash', google: 'wavy dash') + #---------------------------------------------------------------------------------------------------------------------------------- + # Enclosed CJK letters and months OK + - "㉈": [T: "ti i sirkel pĂ„ fylt kvadrat"] # 0x3248 (en: 'circled number ten on black square', google: 'cirklat nummer tio pĂ„ black square') + - "㉉": [T: "tjue i sirkel pĂ„ fylt kvadrat"] # 0x3249 (en: 'circled number twenty on black square', google: 'cirklat nummer tjugo pĂ„ black square') + - "㉊": [T: "tretti i sirkel pĂ„ fylt kvadrat"] # 0x324a (en: 'circled number thirty on black square', google: 'cirklat nummer trettio pĂ„ black square') + - "㉋": [T: "fĂžrti i sirkel pĂ„ fylt kvadrat"] # 0x324b (en: 'circled number forty on blacks square', google: 'cirklat nummer fyrtio pĂ„ blacks square') + - "㉌": [T: "femti i sirkel pĂ„ fylt kvadrat"] # 0x324c (en: 'circled number fifty on black square', google: 'cirklat nummer femtio pĂ„ black square') + - "㉍": [T: "seksti i sirkel pĂ„ fylt kvadrat"] # 0x324d (en: 'circled number sixty on black square', google: 'cirklat nummer sextio pĂ„ black square') + - "㉎": [T: "sytti i sirkel pĂ„ fylt kvadrat"] # 0x324e (en: 'circled number seventy on black square', google: 'cirklat nummer sjuttio pĂ„ black square') + - "㉏": [T: "Ă„tti i sirkel pĂ„ fylt kvadrat"] # 0x324f (en: 'circled number eighty on black square', google: 'cirklat nummer aty pĂ„ black square') + - "㉑": [T: "tjueen i sirkel"] # 0x3251 (en: 'circled number twenty one', google translation) + - "㉒": [T: "tjueto i sirkel"] # 0x3252 (en: 'circled number twenty two', google translation) + - "㉓": [T: "tjuetre i sirkel"] # 0x3253 (en: 'circled number twenty three', google translation) + - "㉔": [T: "tjuefire i sirkel"] # 0x3254 (en: 'circled number twenty four', google translation) + - "㉕": [T: "tjuefem i sirkel"] # 0x3255 (google translation) + - "㉖": [T: "tjueseks i sirkel"] # 0x3256 (google translation) + - "㉗": [T: "tjuesju i sirkel"] # 0x3257 (en: 'circled number twenty seven', google translation) + - "㉘": [T: "tjueĂ„tte i sirkel"] # 0x3258 (en: 'circled number twenty eight', google translation) + - "㉙": [T: "tjueni i sirkel"] # 0x3259 (en: 'circled number twenty nine', google translation) + - "㉚": [T: "tretti i sirkel"] # 0x325a (en: 'circled number thirty', google translation) + - "㉛": [T: "trettien i sirkel"] # 0x325b (en: 'circled number thirty one', google translation) + - "㉜": [T: "trettito i sirkel"] # 0x325c (en: 'circled number thirty two', google translation) + - "㉝": [T: "trettitre i sirkel"] # 0x325d (google translation) + - "㉞": [T: "trettifire i sirkel"] # 0x325e (en: 'circled number thirty four', google translation) + - "㉟": [T: "trettifem i sirkel"] # 0x325f (en: 'circled number thirty five', google translation) + - "㊱": [T: "trettiseks i sirkel"] # 0x32b1 (en: 'circled number thirty six', google translation) + - "ăŠČ": [T: "trettisju i sirkel"] # 0x32b2 (en: 'circled number thirty seven', GPT-5.4 translation) + - "㊳": [T: "trettiĂ„tte i sirkel"] # 0x32b3 (en: 'circled number thirty eight', GPT-5.4 translation) + - "㊮": [T: "trettini i sirkel"] # 0x32b4 (en: 'circled number thirty nine', GPT-5.4 translation) + - "㊔": [T: "fĂžrti i sirkel"] # 0x32b5 (en: 'circled number forty', GPT-5.4 translation) + - "㊶": [T: "fĂžrtien i sirkel"] # 0x32b6 (en: 'circled number forty one', GPT-5.4 translation) + - "㊷": [T: "fĂžrtito i sirkel"] # 0x32b7 (en: 'circled number forty two', GPT-5.4 translation) + - "㊾": [T: "fĂžrtitre i sirkel"] # 0x32b8 (en: 'circled number forty three', GPT-5.4 translation) + - "ăŠč": [T: "fĂžrtifire i sirkel"] # 0x32b9 (en: 'circled number forty four', GPT-5.4 translation) + - "ăŠș": [T: "fĂžrtifem i sirkel"] # 0x32ba (en: 'circled number forty five', GPT-5.4 translation) + - "㊻": [T: "fĂžrtiseks i sirkel"] # 0x32bb (en: 'circled number forty six', GPT-5.4 translation) + - "ăŠŒ": [T: "fĂžrtisju i sirkel"] # 0x32bc (en: 'circled number forty seven', GPT-5.4 translation) + - "ăŠœ": [T: "fĂžrtiĂ„tte i sirkel"] # 0x32bd (en: 'circled number forty eight', GPT-5.4 translation) + - "ăŠŸ": [T: "fĂžrtini i sirkel"] # 0x32be (en: 'circled number forty nine', GPT-5.4 translation) + - "㊿": [T: "femti i sirkel"] # 0x32bf (en: 'circled number fifty', GPT-5.4 translation) + - "㋌": [T: "kvikksĂžlv"] # 0x32cc (en: 'mercury', google translation) + - "㋍": [T: "erg"] # 0x32cd (google translation) + - "㋎": [T: "elektronvolt"] # 0x32ce (en: 'electron volts', google translation) + - "㋏": [T: "begrenset ansvar"] # 0x32cf (en: 'limited liability sign', google translation) + #----------------------------------------------------------------------------------------------------------------------- + # CJK compatibility OK + - "ă±": [T: "hektopascal"] # 0x3371 (en: 'hectopascals', google translation) + - "ăČ": [T: "dalton"] # 0x3372 (google translation) + - "㍳": [T: "astronomisk enhet"] # 0x3373 (en: 'astronomical units', google translation) + - "㍮": [T: "bar"] # 0x3374 (en: 'bars', google translation) + - "ă”": [T: "o v"] # 0x3375 (google translation) + - "ă¶": [T: "parsec"] # 0x3376 (google translation) + - "ă·": [T: "desimeter"] # 0x3377 (en: 'decimeters', google translation) + - "㍾": [T: "kvadratdesimeter"] # 0x3378 (en: 'decimeters squared', google translation) + - "ăč": [T: "kubikkdesimeter"] # 0x3379 (en: 'decimeters cubed', google translation) + - "ăș": [T: "kvadratisk I U"] # 0x337a (en: 'instrumental units', google translation) + - "㎀": [T: "piko-ampere"] # 0x3380 (google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen + - "㎁": [T: "nanoampere"] # 0x3381 (google translation) + - "㎂": [T: "mikroampere"] # 0x3382 (google translation) + - "㎃": [T: "milliampere"] # 0x3383 (google translation) + - "㎄": [T: "kiloampere"] # 0x3384 (google translation) + - "㎅": [T: "kilobyte"] # 0x3385 (google translation) + - "㎆": [T: "mega-byte"] # 0x3386 (en: 'megabytes', google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen + - "㎇": [T: "gigabyte"] # 0x3387 (en: 'gigabytes', google translation) + - "㎈": [T: "kalorier"] # 0x3388 (en: 'calories', google translation) + - "㎉": [T: "kilokalorier"] # 0x3389 (en: 'kilocalories', google translation) + - "㎊": [T: "piko-farad"] # 0x338a (google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen + - "㎋": [T: "nano-farad"] # 0x338b (google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen + - "㎌": [T: "mikrofarad"] # 0x338c (google translation) + - "㎍": [T: "mikro-gram"] # 0x338d (en: 'micrograms', google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen + - "㎎": [T: "milligram"] # 0x338e (google translation) + - "㎏": [T: "kilogram"] # 0x338f (en: 'kilograms', google translation) + - "㎐": [T: "hertz"] # 0x3390 (google translation) + - "㎑": [T: "kilohertz"] # 0x3391 (google translation) + - "㎒": [T: "megahertz"] # 0x3392 (google translation) + - "㎓": [T: "gigahertz"] # 0x3393 (google translation) + - "㎔": [T: "tera-hertz"] # 0x3394 (google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen + - "㎕": [T: "mikroliter"] # 0x3395 (google translation) + - "㎖": [T: "milliliter"] # 0x3396 (google translation) + - "㎗": [T: "desiliter"] # 0x3397 (google translation) + - "㎘": [T: "kiloliter"] # 0x3398 (en: 'kiloliters', google translation) + - "㎙": [T: "femto-meter"] # 0x3399 (en: 'femtometers', google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen + - "㎚": [T: "nanometer"] # 0x339a (en: 'nanometers', google translation) + - "㎛": [T: "mikro-meter"] # 0x339b (en: 'micrometers', google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen + - "㎜": [T: "millimeter"] # 0x339c (en: 'millimeters', google translation) + - "㎝": [T: "centimeter"] # 0x339d (en: 'centimeters', google translation) + - "㎞": [T: "kilometer"] # 0x339e (en: 'kilometers', google translation) + - "㎟": [T: "kvadratmillimeter"] # 0x339f (en: 'millimeters squared', google translation) + - "㎠": [T: "kvadratcentimeter"] # 0x33a0 (en: 'centimeters squared', google translation) + - "㎡": [T: "kvadratmeter"] # 0x33a1 (en: 'meters squared', google translation) + - "㎱": [T: "kvadratkilometer"] # 0x33a2 (en: 'kilometers squared', google translation) + - "㎣": [T: "kubikkmillimeter"] # 0x33a3 (en: 'millimeters cubed', google translation) + - "㎀": [T: "kubikkcentimeter"] # 0x33a4 (en: 'centimeters cubed', google translation) + - "㎄": [T: "kubikkmeter"] # 0x33a5 (en: 'meters cubed', google translation) + - "㎩": [T: "kubikk-kilometer"] # 0x33a6 (en: 'kilometers cubed', google translation) + - "㎧": [T: "meter per sekund"] # 0x33a7 (en: 'meters per second', google translation) + - "㎹": [T: "meter per sekund i andre"] # 0x33a8 (en: 'meters per second squared', google translation) + - "㎩": [T: "pascal"] # 0x33a9 (google translation) + - "ăŽȘ": [T: "kilopascal"] # 0x33aa (google translation) + - "㎫": [T: "megapascal"] # 0x33ab (google translation) + - "㎬": [T: "giga-pascal"] # 0x33ac (google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen + - "㎭": [T: "radianer"] # 0x33ad (google translation) + - "㎼": [T: "radianer per sekund"] # 0x33ae (en: 'rads per second', google translation) + - "㎯": [T: "radianer per sekund i andre"] # 0x33af (en: 'rads per second squared', google translation) + - "㎰": [T: "piko-sekunder"] # 0x33b0 (en: 'picoseconds', google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen + - "㎱": [T: "nanosekunder"] # 0x33b1 (en: 'nanoseconds', google translation) + - "ăŽČ": [T: "mikrosekunder"] # 0x33b2 (en: 'microseconds', google translation) + - "㎳": [T: "millisekunder"] # 0x33b3 (en: 'milliseconds', google translation) + - "㎮": [T: "piko-volt"] # 0x33b4 (google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen + - "㎔": [T: "nanovolt"] # 0x33b5 (google translation) + - "㎶": [T: "mikrovolt"] # 0x33b6 (google translation) + - "㎷": [T: "millivolt"] # 0x33b7 (google translation) + - "㎾": [T: "kilovolt"] # 0x33b8 (google translation) + - "ăŽč": [T: "megavolt"] # 0x33b9 (google translation) + - "ăŽș": [T: "piko-watt"] # 0x33ba (google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen + - "㎻": [T: "nano-watt"] # 0x33bb (google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen + - "ăŽŒ": [T: "mikrowatt"] # 0x33bc (en: 'microwatts', google translation) + - "ăŽœ": [T: "milliwatt"] # 0x33bd (google translation) + - "ăŽŸ": [T: "kilowatt"] # 0x33be (google translation) + - "㎿": [T: "mega-watt"] # 0x33bf (google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen + - "㏀": [T: "kiloohm"] # 0x33c0 (google translation) + - "㏁": [T: "megaohm"] # 0x33c1 (google translation) + - "㏂": [T: "atto-meter"] # 0x33c2 (en: 'attometers', google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen + - "㏃": [T: "becquerel"] # 0x33c3 (google translation) + - "㏄": [T: "kubikkcentimeter"] # 0x33c4 (en: 'cubic centimeters', google translation) + - "㏅": [T: "candela"] # 0x33c5 (google translation) + - "㏆": [T: "coulomb per kilogram"] # 0x33c6 (en: 'coulombs per kilogram', google translation) + - "㏇": [T: "kvadratisk C O"] # 0x33c7 (en: 'cardiac output', google translation) + - "㏈": [T: "desibel"] # 0x33c8 (en: 'decibels', google translation) + - "㏉": [T: "gray"] # 0x33c9 (en: 'grays', google translation) + - "㏊": [T: "hektar"] # 0x33ca (en: 'hectares', google translation) + - "㏋": [T: "hestekraft"] # 0x33cb (en: 'horsepower', google translation) + - "㏌": [T: "tomme"] # 0x33cc (en: 'inches', google translation) + - "㏍": [T: "kilokelvin"] # 0x33cd (google translation) + - "㏎": [T: "kilometer"] # 0x33ce (en: 'kilometers', google translation) + - "㏏": [T: "knop"] # 0x33cf (en: 'knots', google translation) + - "㏐": [T: "lumen"] # 0x33d0 (en: 'lumens', google translation) + - "㏑": [T: "den naturlige logaritmen"] # 0x33d1 (en: 'natural log', google translation) + - "㏒": [T: "logaritmen"] # 0x33d2 (en: 'logarithm', google translation) + - "㏓": [T: "lux"] # 0x33d3 (google translation) + - "㏔": [T: "millibarn"] # 0x33d4 (en: 'millibarns', google translation) + - "㏕": [T: "mill"] # 0x33d5 (google translation) + - "㏖": [T: "mol"] # 0x33d6 (en: 'moles', google translation) + - "㏗": [T: "p h"] # 0x33d7 (google translation) + - "㏘": [T: "piko-meter"] # 0x33d8 (en: 'picometers', google translation) #NORWEGIAN: More likely to be pronounced correctly with a hyphen + - "㏙": [T: "milliondeler"] # 0x33d9 (en: 'parts per million', google translation) + - "㏚": [T: "petarĂžntgen"] # 0x33da (google translation) + - "㏛": [T: "steradianer"] # 0x33db (google translation) + - "㏜": [T: "sievert"] # 0x33dc (google translation) + - "㏝": [T: "weber"] # 0x33dd (google translation) + - "㏞": [T: "volt per meter"] # 0x33de (en: 'volts per meter', google translation) + - "㏟": [T: "ampere per meter"] # 0x33df (google translation) + - "㏿": [T: "gallon"] # 0x33ff (en: 'gallons', google translation) + #---------------------------------------------------------------------------------------------------------- + # Private use area OK + - "": [T: "lik med hatt under"] # 0xe900 (en: 'equals with hat below', google translation) + - "": [T: "lik med pluss over"] # 0xe901 (en: 'equals with plus above', google translation) + - "": [T: "lik med pluss under"] # 0xe902 (en: 'equals with plus below', google translation) + - "": [T: "tilde med pluss over"] # 0xe903 (en: 'tilde with plus above', google translation) + - "": [T: "tilde med pluss under"] # 0xe904 (en: 'tilde with plus below', google translation) + - "": [T: "dobbel lik over stĂžrre enn"] # 0xe908 (en: 'equal double over greater than', google translation) + - "": [T: "dobbel lik over mindre enn"] # 0xe909 (en: 'equal double over less than', google translation) + - "": [T: "inneholder eller er lik"] # 0xe90a (en: 'contains or equal to', google translation) + - "": [T: "overmengde av eller lik"] # 0xe90b (en: 'superset of or equal to', google translation) + - "": [T: "delmengde av eller lik"] # 0xe90c (en: 'subset of or equal to', google translation) + - "": [T: "lik over mindre enn"] # 0xe90d (en: 'equal over less than', google translation) + - "": [T: "tilhĂžrer eller lik"] # 0xe912 (en: 'element of or equal to', google translation) + - "": [T: "lik eller stĂžrre enn"] # 0xe913 (en: 'equal to or greater than', google translation) + - "": [T: "tilnĂŠrmet overmengde av"] # 0xe914 (en: 'approximate superset of', google translation) + - "": [T: "tilnĂŠrmet delmengde av"] # 0xe915 (en: 'approximate subset of', google translation) + - "": [T: "overmengde av med prikk inkluderer som underrelasjon"] # 0xe916 (en: 'superset of with dot includes as sub relation', google translation) + - "": [T: "delmengde av med prikk inkluderes i som underrelasjon"] # 0xe917 (en: 'subset of with dot is included in as sub relation', google translation) + - "": [T: "lik med prikk under"] # 0xe918 (en: 'equal with dot below', google translation) + - "": [T: "venstre prikk over minus over hĂžyre prikk"] # 0xe919 (en: 'left dot over minus over right dot', google translation) + - "": [T: "hĂžyre prikk over minus over venstre prikk"] # 0xe91a (en: 'right dot over minus over left dot', google translation) + - "": [T: "nesten lik minus"] # 0xe91f (en: 'almost equal to minus', google translation) + - "": [T: "dobbel kvadratisk union"] # 0xe920 (en: 'double square cup', google translation) + - "": [T: "dobbelt kvadratisk snitt"] # 0xe921 (en: 'double square cap', google translation) + - "": [T: "mindre enn lik eller stĂžrre enn"] # 0xe922 (en: 'less than equal to or greater than', google translation) + - "": [T: "tilde med prikk"] # 0xe924 (en: 'tilde with dot', google translation) + - "": [T: "tilde med to prikker"] # 0xe925 (en: 'tilde with two dots', google translation) + - "": [T: "mindre enn stĂžrre enn eller lik"] #0xe926 (en: 'less than greater than or equal to', google translation) + - "": [T: "stĂžrre enn mindre enn eller lik"] # 0xe927 (en: 'greater than less than or equal to', google translation) + - "": [T: "ekvivalent med eller mindre enn"] # 0xe928 (en: 'equivalent to or less than', google translation) + - "": [T: "ekvivalent med eller stĂžrre enn"] # 0xe929 (en: 'equivalent to or greater than', google translation) + - "î€Ș": [T: "venstre Ă„pen boks"] # 0xe92a (en: 'left open box operator', google translation) + - "": [T: "hĂžyre Ă„pen boks"] # 0xe92b (en: 'right open box operator', google translation) + - "": [T: "identisk med med prikk"] # 0xe92c (en: 'identical to with dot', google translation) + - "": [T: "stĂžrre enn lik eller mindre enn"] # 0xe92d (en: 'greater than equal to or less than', google translation) + - "": [T: "bar"] # 0xe92e (en: 'bar operator', google translation) + - "": [T: "dobbel bar"] # 0xe92f (en: 'double bar operator', google translation) + - "": [T: "trippel bar"] # 0xe930 (google translation) + - "î€Č": [T: "mindre enn eller tilnĂŠrmet lik"] # 0xe932 (en: 'less than or approximately equal to', google translation) + - "": [T: "stĂžrre enn eller tilnĂŠrmet lik"] # 0xe933 (en: 'greater than or approximately equal to', google translation) + - "": [T: "nĂžstet mindre enn"] # 0xe936 (en: 'nested less than', google translation) + - "": [T: "nĂžstet stĂžrre enn"] # 0xe937 (en: 'nested greater than', google translation) + - "î€ș": [T: "foregĂ„r eller ekvivalent med"] # 0xe93a (en: 'precedes or equivalent to', google translation) + - "": [T: "fĂžlger eller ekvivalent med"] # 0xe93b (en: 'succeeds or equivalent to', google translation) + - "î„€": [T: "foregĂ„r over lik"] # 0xe940 (en: 'precedes over equal', google translation) + - "": [T: "fĂžlger over lik"] # 0xe941 (en: 'succeeds over equal', google translation) + - "î„‚": [T: "mindre enn eller lik"] # 0xe942 (en: 'less equal slanted greater', google translation) + - "": [T: "stĂžrre enn eller lik"] # 0xe943 (en: 'greater equal slanted less', google translation) + - "": [T: "oppfylles av"] # 0xe948 (en: 'satisfied by', google translation) + - "": [T: "langstrakt s"] # 0xe949 (en: 'lazy s', google translation) + - "": [T: "ikke pĂ„stand"] # 0xe94a (en: 'not assertion', google translation) + - "î„‹": [T: "dobbel lik"] # 0xe94b (en: 'double equal', google translation) + - "": [T: "trippel lik"] # 0xe94c (en: 'triple equal', google translation) + - "": [T: "regel forsinket"] # 0xe94d (en: 'rule delayed', google translation) + - "": [T: "alias skilletegn"] # 0xe94e (en: 'alias delimiter', google translation) + - "": [T: "normal undergruppe av med strek"] # 0xe950 (en: 'normal subgroup of with bar', google translation) + - "î„‘": [T: "inneholder som normal undergruppe med strek"] # 0xe951 (en: 'contains as normal subgroup with bar', google translation) + - "î„”": [T: "rund impliserer"] # 0xe954 (en: 'round implies', google translation) + - "î„•": [T: "smil under strek"] # 0xe955 (en: 'smile under bar', google translation) + - "î„–": [T: "rynke over strek"] # 0xe956 (en: 'frown over bar', google translation) + - "î„—": [T: "overmengde av eller tilnĂŠrmet lik"] # 0xe957 (en: 'superset of or almost equal to', google translation) + - "": [T: "delmengde av eller tilnĂŠrmet lik"] # 0xe958 (en: 'subset of or almost equal to', google translation) + - "î„™": [T: "stĂžrre enn tilnĂŠrmet lik eller mindre enn"] # 0xe959 (en: 'greater than almost equal to or less than', google translation) + - "": [T: "mindre enn tilnĂŠrmet lik eller stĂžrre enn"] # 0xe95a (en: 'less than almost equal or greater than', google translation) + - "": [T: "dobbel logisk eller"] # 0xe95c (en: 'double logical or', google translation) + - "": [T: "dobbel logisk og"] # 0xe95d (en: 'double logical and', google translation) + - "": [T: "logisk eller med dobbel strek under"] # 0xe95e (en: 'logical or with double bar below', google translation) + - "": [T: "logisk eller med strek under"] # 0xe95f (en: 'logical or with bar below', google translation) + - "": [T: "tilnĂŠrmet lik"] # 0xe962 (en: 'almost equal over equal', google translation) + - "î„€": [T: "venstre trekant med midtstrek"] # 0xe964 (en: 'left pointing triangle with bisecting bar', google translation) + - "î„„": [T: "hĂžyre trekant med midtstrek"] # 0xe965 (en: 'right pointing triangle with bisecting bar', google translation) + - "": [T: "lik med prikket Ăžvre linje"] # 0xe966 (en: 'equals with dotted top line', google translation) + - "î„§": [T: "foregĂ„r med kolon"] # 0xe967 (en: 'precedes with colon', google translation) + - "": [T: "fĂžlger med kolon"] # 0xe968 (en: 'succeeds with colon', google translation) + - "î„©": [T: "mindre enn eller lik"] # 0xe969 (en: 'smaller than or equal slanted', google translation) + - "î„Ș": [T: "stĂžrre enn eller lik"] # 0xe96a (en: 'larger than or equal slanted', google translation) + - "î„«": [T: "nĂžstet veldig mye mindre enn"] # 0xe96b (en: 'nested very much less than', google translation) + - "": [T: "nĂžstet veldig mye stĂžrre enn"] # 0xe96c (en: 'nested very much greater than', google translation) + - "î„­": [T: "forskjell mellom"] # 0xe96d (en: 'difference between variant', google translation) + - "": [T: "mindre enn som overlapper med stĂžrre enn"] # 0xe96e (en: 'less than greater than overlay', google translation) + - "": [T: "logisk eller som overlapper med logisk og"] # 0xe96f (en: 'logical or logical and overlay', google translation) + - "î„°": [T: "overmengde over overmengde"] # 0xe970 (google translation) + - "": [T: "delmengde over delmengde"] # 0xe971 (en: 'subset over subset', google translation) + - "î„Č": [T: "overmengde over delmengde"] # 0xe972 (en: 'superset over subset', google translation) + - "": [T: "delmengde over overmengde"] # 0xe973 (en: 'subset over superset', google translation) + - "î„č": [T: "trippel vertikal strek"] # 0xe979 (google translation) + - "î„ș": [T: "parvise firedoble vertikale prikker"] # 0xe97a (en: 'paired quadruple vertical dots', google translation) + - "î„»": [T: "vinkelrett over strek"] # 0xe97b (en: 'perpendicular over bar', google translation) + - "": [T: "venstre dreiekors dobbel vertikal strek"] # 0xe97c (en: 'left turnstile double vertical bar', google translation) + - "": [T: "dobbelt venstre dreiekors dobbel vertikal strek"] # 0xe97d (en: 'double left turnstile double vertical bar', google translation) + - "": [T: "vinkelrett over rotert vinkelrett"] # 0xe97e (en: 'perpendicular over inverted perpendicular', google translation) + - "": [T: "dobbelt venstre dreiekors vertikal strek"] # 0xe97f (en: 'double left turnstile vertical bar', google translation) + - "": [T: "sfĂŠrisk vinkel oppover"] # 0xe980 (en: 'spherical angle opening up', google translation) + - "": [T: "dobbel skrĂ„strek"] # 0xe981 (en: 'double slash', google translation) + - "": [T: "rett vinkel med hjĂžrne"] # 0xe982 (en: 'right angle with corner', google translation) + - "": [T: "sirkel med vertikal strek"] # 0xe984 (google translation) + - "": [T: "sirkel med divisjon"] # 0xe985 (google translation) + - "": [T: "stiplet skrĂ„strek"] # 0xe986 (en: 'dashed solidus', google translation) + - "": [T: "stiplet omvendt skrĂ„strek"] # 0xe987 (en: 'dashed backslash', google translation) + - "": [T: "stiplet midtlinje"] # 0xe988 (en: 'dashed mid line', google translation) + - "": [T: "stiplet vertikal strek"] # 0xe989 (en: 'dashed vertical bar', google translation) + - "": [T: "vinkelrett med s"] # 0xe98a (en: 'perpendicular with s', google translation) + - "": [T: "vinkel med s"] # 0xe98b (en: 'angle with s', google translation) + - "": [T: "sfĂŠrisk vinkel mot venstre"] # 0xe98c (en: 'spherical angle opening left', google translation) + - "": [T: "vinkel mot venstre"] # 0xe98d (en: 'angle opening left', google translation) + - "": [T: "vertikal strek med dobbel krok"] # 0xe98e (en: 'vertical bar with double hook', google translation) + - "": [T: "medium dot-operator fri radikal"] # 0xe98f (google translation) + - "": [T: "hvit oppoverpekende trekant over strek"] # 0xe990 (en: 'white up pointing triangle above bar', google translation) + - "": [T: "identisk og parallell med"] # 0xe991 (en: 'identical and parallel to', google translation) + - "": [T: "smash-produkt"] # 0xe992 (en: 'smash product', google translation) + - "": [T: "trippel vertikal strek med horisontal strek"] # 0xe993 (en: 'triple bar operator with horizontal bar', google translation) + - "": [T: "identisk med med dobbel skrĂ„strek"] # 0xe994 (en: 'identical to with double slash', google translation) + - "": [T: "triple kryssende streker"] # 0xe995 (en: 'triple crossed bars', google translation) + - "": [T: "sirkel med vertikal strek"] # 0xe996 (en: 'vertical bar over circle', google translation) + - "": [T: "vertikal proporsjonal med"] # 0xe997 (en: 'vertical proportional to', google translation) + - "": [T: "mĂ„ne i siste kvarter"] # 0xe998 (en: 'black last quarter moon', google translation) + - "": [T: "mĂ„ne i fĂžrste kvarter"] # 0xe999 (google translation) + - "": [T: "negativ sinusbĂžlge"] # 0xe9a0 (en: 'negative sine wave', google translation) + - "": [T: "prikk i parentes"] # 0xe9a1 (en: 'parenthesized dot', google translation) + - "": [T: "parenteser"] # 0xe9a2 (en: 'parens', google translation) + - "": [T: "hvitt smil"] # 0xe9a3 (en: 'white smile', google translation) + - "": [T: "hvit rynke"] # 0xe9a4 (en: 'white frown', google translation) + - "": [T: "heksagon"] # 0xe9a5 (en: 'hexagon', google translation) + - "": [T: "ekvivalent med over pluss"] # 0xe9a6 (en: 'equivalent to over plus', google translation) + - "": [T: "pluss over ekvivalent med"] # 0xe9a7 (en: 'plus over equivalent to', google translation) + - "": [T: "snitt"] # 0xe9b0 (en: 'intersection serifs', google translation) + - "": [T: "union"] # 0xe9b1 (google translation) + - "îŠČ": [T: "kvadratisk snitt"] # 0xe9b2 (en: 'square intersection serifs', google translation) + - "": [T: "kvadratisk union"] # 0xe9b3 (google translation) + - "î§ ": [T: "foregĂ„r ekvivalent med eller fĂžlger"] # 0xe9e0 (en: 'precedes equivalent to or succeeds', google translation) + - "î§Ą": [T: "fĂžlger ekvivalent med eller foregĂ„r"] # 0xe9e1 (en: 'succeeds equivalent to or precedes', google translation) + - "î§ą": [T: "foregĂ„r tilnĂŠrmet lik eller fĂžlger"] # 0xe9e2 (en: 'precedes almost equal to or succeeds', google translation) + - "î§Ł": [T: "fĂžlger tilnĂŠrmet lik eller foregĂ„r"] # 0xe9e3 (en: 'succeeds almost equal to or precedes', google translation) + - "î§°": [T: "mindre enn ekvivalent med eller stĂžrre enn"] # 0xe9f0 (en: 'less than equivalent to or greater than', google translation) + - "î§±": [T: "stĂžrre enn ekvivalent med eller mindre enn"] # 0xe9f1 (en: 'greater than equivalent to or less than', google translation) + - "": [T: "ikke mye mindre enn"] # 0xea00 (en: 'not vert much less than', google translation) + - "": [T: "ikke mye stĂžrre enn"] # 0xea01 (en: 'not vert much greater than', google translation) + - "": [T: "ikke mye mindre enn"] # 0xea02 (en: 'not much less than variant', google translation) + - "": [T: "ikke mye stĂžrre enn"] # 0xea03 (en: 'not much greater than variant', google translation) + - "": [T: "mindre enn vertikal ikke dobbel lik"] # 0xea04 (en: 'less vert not double equals', google translation) + - "": [T: "stĂžrre enn vertikal ikke dobbel lik"] # 0xea05 (en: 'gt vert not double equals', google translation) + - "": [T: "ikke mindre enn eller lik"] # 0xea06 (en: 'not less than or equal to', google translation) + - "": [T: "ikke stĂžrre enn eller lik"] # 0xea07 (en: 'not greater than or equal to', google translation) + - "": [T: "verken lik eller mindre enn"] # 0xea09 (en: 'neither equal to nor less than', google translation) + - "": [T: "inneholder ikke eller er lik"] # 0xea0a (en: 'does not contain or equal to', google translation) + - "": [T: "verken overmengde av eller lik"] # 0xea0b (en: 'neither superset of nor equal to', google translation) + - "": [T: "verken delmengde av eller lik"] # 0xea0c (en: 'neither subset of nor equal to', google translation) + - "": [T: "omvendt skrĂ„strek delmengde"] # 0xea0d (en: 'reverse solidus subset', google translation) + - "": [T: "verken lik eller stĂžrre enn"] # 0xea0e (en: 'neither equal to nor greater than', google translation) + - "": [T: "ikke minus tilde"] # 0xea0f (en: 'not minus tilde operator', google translation) + - "": [T: "verken lik eller mindre enn"] # 0xea10 (en: 'neither equal to nor less than', google translation) + - "": [T: "ikke tilde"] # 0xea11 (en: 'not tilde operator', google translation) + - "": [T: "ikke element i eller lik"] # 0xea12 (en: 'not element of or equal to', google translation) + - "": [T: "verken lik eller stĂžrre enn"] # 0xea13 (en: 'neither equal to nor greater than', google translation) + - "": [T: "ikke tilnĂŠrmet lik"] # 0xea14 (en: 'not almost equal', google translation) + - "": [T: "ikke fĂžlger tilnĂŠrmet lik"] # 0xea15 (en: 'not succeeds similar', google translation) + - "": [T: "mindre enn eller lik med skrĂ„strek"] # 0xea16 (en: 'less than or slanted equal to with slash', google translation) + - "": [T: "stĂžrre enn eller lik med skrĂ„strek"] # 0xea17 (en: 'greater than or slanted equal to with slash', google translation) + - "": [T: "overmengde skrĂ„strek"] # 0xea1a (google translation) + - "": [T: "inneholder ikke"] # 0xea1b (en: 'does not contain', google translation) + - "": [T: "ikke mindre enn eller lik"] # 0xea1d (en: 'not less than or equal to', google translation) + - "": [T: "ikke stĂžrre enn eller lik"] # 0xea1e (en: 'not greater than or equal to', google translation) + - "": [T: "ikke nesten lik minus"] # 0xea1f (en: 'not almost equal to minus', google translation) + - "îšą": [T: "tilhĂžrer ikke mengde med prikk"] # 0xea22 (en: 'negated set membership dot above', google translation) + - "": [T: "ikke rett vinkel"] # 0xea2c (en: 'not vert angle', google translation) + - "îš­": [T: "ikke parallell"] # 0xea2d (en: 'not parallel slanted', google translation) + - "îšź": [T: "ikke strek"] # 0xea2e (en: 'not bar operator', google translation) + - "": [T: "ikke dobbel strek"] # 0xea2f (en: 'not double bar operator', google translation) + - "îš°": [T: "ikke trippel strek"] # 0xea30 (en: 'not triple bar operator', google translation) + - "îšČ": [T: "mindre enn men ikke tilnĂŠrmet lik"] # 0xea32 (en: 'less than but not approximately equal to', google translation) + - "îšł": [T: "stĂžrre enn men ikke tilnĂŠrmet lik"] # 0xea33 (en: 'greater than but not approximately equal to', google translation) + - "": [T: "mindre enn eller ikke lik"] # 0xea34 (en: 'less than or not equal to', google translation) + - "îš”": [T: "stĂžrre enn eller ikke lik"] # 0xea35 (en: 'greater than or not equal to', google translation) + - "îš¶": [T: "ikke nĂžstet mindre enn"] # 0xea36 (en: 'not nested less than', google translation) + - "îš·": [T: "ikke nĂžstet stĂžrre enn"] # 0xea37 (en: 'not nested greater than', google translation) + - "îšž": [T: "ikke mye mindre enn"] # 0xea38 (en: 'not much less than', google translation) + - "îšč": [T: "ikke mye stĂžrre enn"] # 0xea39 (en: 'not much greater than', google translation) + - "îšș": [T: "foregĂ„r men ikke ekvivalent med"] # 0xea3a (en: 'precedes but not equivalent to', google translation) + - "îš»": [T: "fĂžlger men ikke ekvivalent med"] # 0xea3b (en: 'succeeds but not equivalent to', google translation) + - "": [T: "foregĂ„r men ikke lik"] # 0xea3c (en: 'precedes but not equal to', google translation) + - "îšœ": [T: "fĂžlger men ikke lik"] # 0xea3d (en: 'succeeds but not equal to', google translation) + - "": [T: "ikke lik eller foregĂ„r"] # 0xea3e (en: 'does not equal or precede', google translation) + - "îšż": [T: "ikke lik eller fĂžlger"] # 0xea3f (en: 'does not equal or succeed', google translation) + - "": [T: "foregĂ„r men ikke lik"] # 0xea40 (en: 'precedes but not equal to', google translation) + - "": [T: "fĂžlger men ikke lik"] # 0xea41 (en: 'succeeds but not equal to', google translation) + - "": [T: "ikke delmengde av eller lik"] # 0xea42 (en: 'not subset of nor equal to', google translation) + - "": [T: "ikke overmengde av eller lik"] # 0xea43 (en: 'not superset of nor equal to', google translation) + - "": [T: "delmengde av eller ikke lik"] # 0xea44 (en: 'subset of or not equal to', google translation) + - "": [T: "overmengde av eller ikke lik"] # 0xea45 (en: 'superset of or not equal to', google translation) + - "": [T: "ikke delmengde av eller lik"] # 0xea46 (en: 'not subset of nor equal to', google translation) + - "": [T: "ikke overmengde av eller lik"] # 0xea47 (en: 'not superset of nor equal to', google translation) + - "": [T: "ikke trippel mindre enn"] # 0xea48 (en: 'not triple less than', google translation) + - "": [T: "ikke trippel stĂžrre enn"] # 0xea49 (en: 'not triple greater than', google translation) + - "": [T: "ikke foregĂ„r lik"] # 0xea4c (en: 'not precedes equals', google translation) + - "": [T: "ikke fĂžlger lik"] # 0xea4d (en: 'not succeeds equals', google translation) + - "": [T: "ikke normal undergruppe av med strek"] # 0xea50 (en: 'not normal subgroup of with bar', google translation) + - "": [T: "inneholder ikke som normal undergruppe med strek"] # 0xea51 (en: 'does not contain as normal subgroup with bar', google translation) + - "": [T: "ikke forskjell mellom"] # 0xea52 (en: 'not difference between', google translation) + - "": [T: "ikke geometrisk ekvivalent med"] # 0xea53 (en: 'not geometrically equivalent to', google translation) + - "": [T: "ikke vertikal tilnĂŠrmet lik"] # 0xea54 (en: 'not vert similar', google translation) + - "": [T: "ikke lik eller tilnĂŠrmet lik"] # 0xea55 (en: 'not equal or similar', google translation) + - "": [T: "ikke vertikal tilnĂŠrmet lik"] # 0xea56 (en: 'not vert approximate', google translation) + - "": [T: "ikke tilnĂŠrmet identisk med"] # 0xea57 (en: 'not approximately identical to', google translation) + - "": [T: "ikke differansen mellom"] # 0xea58 (en: 'not bumpy equals', google translation) + - "": [T: "ikke differansen mellom"] # 0xea59 (en: 'not bumpy single equals', google translation) + - "": [T: "ikke lik prikk"] # 0xea5a (en: 'not equal dot', google translation) + - "": [T: "speilvendt ikke ekvivalent med"] # 0xea5b (en: 'reverse not equivalent', google translation) + - "î© ": [T: "ikke kvadratisk delmengde"] # 0xea60 (en: 'not square subset', google translation) + - "": [T: "ikke kvadratisk overmengde"] # 0xea61 (en: 'not square superset', google translation) + - "": [T: "ikke tilnĂŠrmet lik over lik"] # 0xea62 (en: 'not almost equal over equal', google translation) + - "": [T: "ikke strengt ekvivalent med"] # 0xea63 (en: 'not strictly equivalent to', google translation) + - "î©€": [T: "ikke kongruent prikk"] # 0xea64 (en: 'not congruent dot', google translation) + - "î©„": [T: "speilvendt ikke lik"] # 0xea65 (en: 'reverse not equal', google translation) + - "î©°": [T: "ikke vertikal venstre trekant lik"] # 0xea70 (en: 'not vert left triangle equals', google translation) + - "": [T: "ikke vertikal hĂžyre trekant lik"] # 0xea71 (en: 'not vert right triangle equals', google translation) + - "îȘ€": [T: "ikke partiell"] # 0xea80 (en: 'not partial', google translation) + - "": [T: "pilforlenger"] # 0xeb00 (en: 'arrow embellishment extender', google translation) + - "": [T: "hĂžyrepil over venstrepil"] # 0xeb01 (en: 'arrow rightwards over arrow leftwards', google translation) + - "": [T: "hĂžyrepil over venstrepil"] # 0xeb02 (en: 'arrow rightwards over arrow leftwards', google translation) + - "": [T: "hĂžyre-harpun over venstre-harpun"] # 0xeb03 (en: 'harpoon right over harpoon left', google translation) + - "": [T: "hĂžyre-harpun over venstre-harpun"] # 0xeb04 (en: 'harpoon right over harpoon left', google translation) + - "": [T: "dobbel-pil nordĂžst sĂžrvest"] # 0xeb05 (en: 'double arrow northeast southwest', google translation) + - "": [T: "dobbel-pil nordvest sĂžrĂžst"] # 0xeb06 (en: 'double arrow northwest southeast', google translation) + - "": [T: "horisontal harpun-forlenger"] # 0xeb07 (en: 'horizontal harpoon extender', google translation) + - "": [T: "venstrepil i bue mot klokka"] # 0xeb08 (en: 'anticlockwise arc leftwards arrow', google translation) + - "": [T: "hĂžyrepil i bue mot klokka"] # 0xeb09 (en: 'anticlockwise arc rightwards arrow', google translation) + - "": [T: "stor hĂžyrepil"] # 0xeb0b (en: 'large rightwards arrow accent', google translation) + - "": [T: "stor venstrepil"] # 0xeb0c (en: 'large leftwards arrow accent', google translation) + - "": [T: "venstre pilspiss"] # 0xeb0d (en: 'leftwards arrowhead', google translation) + - "": [T: "hĂžyre pilspiss"] # 0xeb0e (en: 'rightwards arrowhead', google translation) + - "": [T: "stor venstre-hĂžyre-pil med strek"] # 0xeb0f (en: 'large left right arrow with stroke', google translation) + - "": [T: "horisontal dobbel pil-forlenger"] # 0xeb10 (en: 'horizontal double arrow extender', google translation) + - "": [T: "stor venstre-hĂžyre-pil med strek"] # 0xeb11 (en: 'large left right double arrow with stroke', google translation) + - "": [T: "nedoverpil til venstre for oppoverpil"] # 0xeb12 (en: 'downwards arrow leftwards of upwards arrow', google translation) + - "": [T: "venstrepil med hjĂžrne nedover"] # 0xeb13 (en: 'leftwards arrow with corner downwards', google translation) + - "": [T: "hĂžyrepil med hjĂžrne oppover"] # 0xeb14 (en: 'rightwards arrow with corner upwards', google translation) + - "": [T: "venstrepil med hjĂžrne oppover"] # 0xeb15 (en: 'leftwards arrow with corner upwards', google translation) + - "": [T: "Ăžvre halvsirkel-pil mot klokka med pluss"] # 0xeb16 (en: 'anticlockwise top semicircle arrow with plus', google translation) + - "": [T: "Ăžvre halvsirkel-pil med klokka med minus"] # 0xeb17 (en: 'clockwise top semicircle arrow with minus', google translation) + - "": [T: "hĂžyrepil med hale og strek"] # 0xeb18 (en: 'rightwards arrow with tail with stroke', google translation) + - "": [T: "hĂžyre-harpun mothake ned"] # 0xeb19 (en: 'right harpoon down', google translation) + - "": [T: "venstre-harpun mothake ned"] # 0xeb1a (en: 'left harpoon down', google translation) + - "": [T: "venstre-hĂžyre-harpun mothake ned"] # 0xeb1b (en: 'left right harpoon down', google translation) + - "": [T: "venstre-hĂžyre-harpun mothake opp"] # 0xeb1c (en: 'left right harpoon up', google translation) + - "": [T: "opp-ned-harpun mothake venstre"] # 0xeb1d (en: 'up down harpoon left', google translation) + - "": [T: "opp-ned-harpun mothake hĂžyre"] # 0xeb1e (en: 'up down harpoon right', google translation) + - "": [T: "oppoverpil til hĂžyre for nedoverpil"] # 0xeb1f (en: 'upwards arrow to the right of downwards arrow', google translation) + - "": [T: "venstre-harpun mot strek mothake opp"] # 0xeb20 (en: 'leftwards harpoon to bar with barb upwards', google translation) + - "": [T: "hĂžyre-harpun mot strek mothake opp"] # 0xeb21 (en: 'rightwards harpoon to bar with barb upwards', google translation) + - "": [T: "venstre-harpun mot strek mothake ned"] # 0xeb22 (en: 'leftwards harpoon to bar with barb downwards', google translation) + - "": [T: "hĂžyre-harpun mot strek mothake ned"] # 0xeb23 (en: 'rightwards harpoon to bar with barb downwards', google translation) + - "": [T: "venstre-harpun fra strek mothake opp"] # 0xeb24 (en: 'leftwards harpoon from bar with barb upwards', google translation) + - "": [T: "hĂžyre-harpun fra strek mothake opp"] # 0xeb25 (en: 'rightwards harpoon from bar with barb upwards', google translation) + - "": [T: "venstre-harpun fra strek mothake ned"] # 0xeb26 (en: 'leftwards harpoon from bar with barb downwards', google translation) + - "": [T: "hĂžyre-harpun fra strek mothake ned"] # 0xeb27 (en: 'rightwards harpoon from bar with barb downwards', google translation) + - "": [T: "opp-harpun mot strek mothake venstre"] # 0xeb28 (en: 'upwards harpoon to bar with barb leftwards', google translation) + - "": [T: "ned-harpun mot strek mothake venstre"] # 0xeb29 (en: 'downwards harpoon to bar with barb leftwards', google translation) + - "îŹȘ": [T: "opp-harpun mot strek mothake hĂžyre"] # 0xeb2a (en: 'upwards harpoon to bar with barb rightwards', google translation) + - "": [T: "ned-harpun mot strek mothake hĂžyre"] # 0xeb2b (en: 'downwards harpoon to bar with barb rightwards', google translation) + - "": [T: "opp-harpun fra strek mothake venstre"] # 0xeb2c (en: 'upwards harpoon from bar with barb leftwards', google translation) + - "": [T: "ned-harpun fra strek mothake venstre"] # 0xeb2d (en: 'downwards harpoon from bar with barb leftwards', google translation) + - "": [T: "opp-harpun fra strek mothake hĂžyre"] # 0xeb2e (en: 'upwards harpoon from bar with barb rightwards', google translation) + - "": [T: "ned-harpun fra strek mothake hĂžyre"] # 0xeb2f (en: 'downwards harpoon from bar with barb rightwards', google translation) + - "": [T: "oppoverpil mot strek"] # 0xeb30 (en: 'upwards arrow to bar', google translation) + - "": [T: "nedoverpil mot strek"] # 0xeb31 (en: 'downwards arrow to bar', google translation) + - "îŹČ": [T: "opp-harpun til venstre for ned-harpun"] # 0xeb32 (en: 'upwards harpoon to the left of downwards harpoon', google translation) + - "": [T: "opp-harpun til hĂžyre for ned-harpun"] # 0xeb33 (en: 'upwards harpoon to the right of downwards harpoon', google translation) + - "": [T: "pilspiss oppover"] # 0xeb34 (en: 'upwards arrowhead', google translation) + - "": [T: "pilspiss nedover"] # 0xeb35 (en: 'downwards arrowhead', google translation) + - "": [T: "dobbel harpun venstre mothake ned hĂžyre mothake opp"] # 0xeb36 (en: 'double harpoon with leftwards barb down rightwards barb up', google translation) + - "": [T: "dobbel harpun venstre mothake opp hĂžyre mothake ned"] # 0xeb37 (en: 'double harpoon with leftwards barb up rightwards barb down', google translation) + - "": [T: "venstrepil over strek"] # 0xeb38 (en: 'leftwards arrow over bar', google translation) + - "îŹč": [T: "hĂžyrepil over strek"] # 0xeb39 (en: 'rightwards arrow over bar', google translation) + - "îŹș": [T: "venstrepil under strek"] # 0xeb3a (en: 'leftwards arrow under bar', google translation) + - "": [T: "hĂžyrepil under strek"] # 0xeb3b (en: 'rightwards arrow under bar', google translation) + - "îŹŒ": [T: "venstre-hĂžyre trippel pil"] # 0xeb3c (en: 'left right triple arrow', google translation) + - "": [T: "dobbel-pil nordĂžst sĂžrĂžst"] # 0xeb3f (en: 'double arrow northeast southeast', google translation) + - "": [T: "venstre halvsirkel-pil mot klokka"] # 0xeb40 (en: 'anticlockwise left semicircle arrow', google translation) + - "": [T: "venstre halvsirkel-pil med klokka"] # 0xeb41 (en: 'clockwise left semicircle arrow', google translation) + - "": [T: "venstre-hĂžyre-pil i venstre Ă„pen sirkel"] # 0xeb42 (en: 'left open circle left right arrow', google translation) + - "": [T: "hĂžyrepil over tilde"] # 0xeb44 (en: 'rightwards arrow over tilde', google translation) + - "": [T: "venstrepil over tilde"] # 0xeb45 (en: 'leftwards arrow over tilde', google translation) + - "": [T: "venstre-harpun over strek"] # 0xeb48 (en: 'leftwards harpoon over bar', google translation) + - "": [T: "hĂžyre-harpun over strek"] # 0xeb49 (en: 'rightwards harpoon over bar', google translation) + - "": [T: "venstre-harpun under strek"] # 0xeb4a (en: 'leftwards harpoon under bar', google translation) + - "": [T: "hĂžyre-harpun under strek"] # 0xeb4b (en: 'rightwards harpoon under bar', google translation) + - "": [T: "sammenpresset venstrepil"] # 0xeb4c (en: 'squat black leftwards arrow', google translation) + - "": [T: "hĂžyre halvsirkel-pil med klokka"] # 0xeb50 (en: 'clockwise right semicircle arrow', google translation) + - "": [T: "hĂžyre halvsirkel-pil mot klokka"] # 0xeb51 (en: 'anticlockwise right semicircle arrow', google translation) + - "": [T: "venstre-hĂžyre-harpun i venstre Ă„pen sirkel"] # 0xeb52 (en: 'left open circle left right harpoon', google translation) + - "": [T: "oppoverpil til venstre for vertikal strek"] # 0xeb58 (en: 'upwards arrow leftwards of vertical bar', google translation) + - "": [T: "nedoverpil til venstre for vertikal strek"] # 0xeb59 (en: 'downwards arrow leftwards of vertical bar', google translation) + - "": [T: "oppoverpil til hĂžyre for vertikal strek"] # 0xeb5a (en: 'upwards arrow rightwards of vertical bar', google translation) + - "": [T: "nedoverpil til hĂžyre for vertikal strek"] # 0xeb5b (en: 'downwards arrow rightwards of vertical bar', google translation) + - "": [T: "hĂžyrepil med krok ned"] # 0xeb5c (en: 'rightwards arrow with extended downwards hook', google translation) + - "": [T: "venstrepil med krok"] # 0xeb5d (en: 'leftwards arrow with extended hook', google translation) + - "": [T: "venstrepil med krok ned"] # 0xeb5e (en: 'leftwards arrow with extended downwards hook', google translation) + - "": [T: "hĂžyrepil med krok"] # 0xeb5f (en: 'rightwards arrow with extended hook', google translation) + - "î­ ": [T: "ikke bĂžlgete hĂžyrepil"] # 0xeb60 (en: 'not right arrow wavy', google translation) + - "î­Ą": [T: "ikke buet hĂžyrepil"] # 0xeb61 (en: 'not right arrow curved', google translation) + - "î­š": [T: "opp-harpun til venstre for vertikal strek"] # 0xeb68 (en: 'upwards harpoon leftwards of vertical bar', google translation) + - "î­©": [T: "ned-harpun til venstre for vertikal strek"] # 0xeb69 (en: 'downwards harpoon leftwards of vertical bar', google translation) + - "î­Ș": [T: "opp-harpun til hĂžyre for vertikal strek"] # 0xeb6a (en: 'upwards harpoon rightwards of vertical bar', google translation) + - "î­«": [T: "ned-harpun til hĂžyre for vertikal strek"] # 0xeb6b (en: 'downwards harpoon rightwards of vertical bar', google translation) + - "î­Ź": [T: "vertikal dobbel pil-forlenger"] # 0xeb6c (en: 'vertical double arrow extender', google translation) + - "î­­": [T: "vertikal harpun med mothake venstre forlenger"] # 0xeb6d (en: 'vertical harpoon with barb left extender', google translation) + - "î­ź": [T: "vertikal harpun med mothake hĂžyre forlenger"] # 0xeb6e (en: 'vertical harpoon with barb right extender', google translation) + - "î­Ż": [T: "hĂžyre-harpun over venstre-harpun hĂžyre"] # 0xeb6f (en: 'right harpoon over left harpoon right', google translation) + - "î­°": [T: "hĂžyre-harpun over venstre-harpun venstre"] # 0xeb70 (en: 'right harpoon over left harpoon left', google translation) + - "î­±": [T: "venstre-harpun over hĂžyre-harpun hĂžyre"] # 0xeb71 (en: 'left harpoon over right harpoon right', google translation) + - "î­Č": [T: "venstre-harpun over hĂžyre-harpun venstre"] # 0xeb72 (en: 'left harpoon over right harpoon left', google translation) + - "î­ł": [T: "venstrepil fra strek pilspiss"] # 0xeb73 (en: 'leftwards arrow from bar arrowhead', google translation) + - "î­Ž": [T: "venstre-hĂžyre-pil fra strek forlenger"] # 0xeb74 (en: 'leftwards rightwards arrow from bar extender', google translation) + - "î­”": [T: "venstrepil fra strek med hale"] # 0xeb75 (en: 'leftwards arrow from bar tail', google translation) + - "î­¶": [T: "hĂžyrepil fra strek med hale"] # 0xeb76 (en: 'rightwards arrow from bar tail', google translation) + - "î­·": [T: "hĂžyrepil fra strek pilspiss"] # 0xeb77 (en: 'rightwards arrow from bar arrowhead', google translation) + - "î­ž": [T: "opp-harpun fra strek med mothake venstre pilspiss"] # 0xeb78 (en: 'upwards harpoon from bar with barb leftwards arrowhead', google translation) + - "î­č": [T: "hĂžyrepil over venstrepil hĂžyre"] # 0xeb79 (en: 'rightwards arrow over leftwards arrow right', google translation) + - "î­ș": [T: "hĂžyrepil over venstrepil venstre"] # 0xeb7a (en: 'rightwards arrow over leftwards arrow left', google translation) + - "î­»": [T: "venstrepil over hĂžyrepil hĂžyre"] # 0xeb7b (en: 'leftwards arrow over rightwards arrow right', google translation) + - "î­Œ": [T: "venstrepil over hĂžyrepil venstre"] # 0xeb7c (en: 'leftwards arrow over rightwards arrow left', google translation) + - "î­œ": [T: "oppoverpil fra strek pilspiss"] # 0xeb7d (en: 'upwards arrow from bar arrowhead', google translation) + - "î­Ÿ": [T: "oppoverpil fra strek hale"] # 0xeb7e (en: 'upwards arrow from bar tail', google translation) + - "î­ż": [T: "nedoverpil fra strek hale"] # 0xeb7f (en: 'downwards arrow from bar tail', google translation) + - "": [T: "nedoverpil fra strek pilspiss"] # 0xeb80 (en: 'downwards arrow from bar arrowhead', google translation) + - "": [T: "ned-harpun fra strek med mothake hĂžyre pilspiss"] # 0xeb81 (en: 'downwards harpoon from bar with barb rightwards arrowhead', google translation) + - "": [T: "opp-harpun til venstre for ned-harpun bunn"] # 0xeb82 (en: 'upwards harpoon to the left of downwards harpoon bottom', google translation) + - "": [T: "opp-harpun til venstre for ned-harpun forlenger"] # 0xeb83 (en: 'upwards harpoon to the left of downwards harpoon extender', google translation) + - "": [T: "ned-harpun til venstre for opp-harpun topp"] # 0xeb84 (en: 'downwards harpoon to the left of upwards harpoon top', google translation) + - "": [T: "opp-harpun til venstre for ned-harpun topp"] # 0xeb85 (en: 'upwards harpoon to the left of downwards harpoon top', google translation) + - "": [T: "ned-harpun til venstre for opp-harpunens forlenger"] # 0xeb86 (en: 'downwards harpoon to the left of the upwards harpoon extender', google translation) + - "": [T: "ned-harpun til venstre for opp-harpunens bunn"] # 0xeb87 (en: 'downwards harpoon to the left of the upwards harpoon bottom', google translation) + - "": [T: "oppoverpil til venstre for nedoverpil bunn"] # 0xeb88 (en: 'upwards arrow leftwards of downwards arrow bottom', google translation) + - "": [T: "nedoverpil til venstre for oppoverpil topp"] # 0xeb89 (en: 'downwards arrow leftwards of upwards arrow top', google translation) + - "": [T: "oppoverpil til venstre for nedoverpil topp"] # 0xeb8a (en: 'upwards arrow leftwards of downwards arrow top', google translation) + - "": [T: "nedoverpil til venstre for oppoverpil bunn"] # 0xeb8b (en: 'downwards arrow leftwards of upwards arrow bottom', google translation) + - "": [T: "venstre-hĂžyre-pil forlenger"] # 0xeb8c (en: 'leftwards rightwards arrows extender', google translation) + - "": [T: "nordĂžst-pil forlenger"] # 0xeb8d (google translation) + - "": [T: "nordvest-pil forlenger"] # 0xeb8e (google translation) + - "": [T: "nedoverpekende krĂžllparentes venstre"] # 0xec00 (en: 'down pointing brace left', google translation) + - "": [T: "nedoverpekende krĂžllparentes midten"] # 0xec01 (en: 'down pointing brace mid', google translation) + - "": [T: "nedoverpekende krĂžllparentes hĂžyre"] # 0xec02 (en: 'down pointing brace right', google translation) + - "": [T: "horisontal krĂžllparentes forlenger"] # 0xec03 (en: 'horizontal brace extender', google translation) + - "": [T: "oppoverpekende krĂžllparentes venstre"] # 0xec04 (en: 'up pointing brace left', google translation) + - "": [T: "oppoverpekende krĂžllparentes midten"] # 0xec05 (en: 'up pointing brace mid', google translation) + - "": [T: "oppoverpekende krĂžllparentes hĂžyre"] # 0xec06 (en: 'up-pointing brace right', google translation) + - "": [T: "venstre vertikal strek"] # 0xec07 (en: 'left vertical bar', google translation) + - "": [T: "hĂžyre vertikal strek"] # 0xec08 (en: 'right vertical bar', google translation) + - "": [T: "venstre dobbel vertikal strek"] # 0xec09 (en: 'left double vertical bar', google translation) + - "": [T: "hĂžyre dobbel vertikal strek"] # 0xec0a (en: 'right double vertical bar', google translation) + - "": [T: "horisontal hakeparentes forlenger"] # 0xec0b (en: 'horizontal bracket extender', google translation) + - "": [T: "under hakeparentes"] # 0xec0c (en: 'under square bracket', google translation) + - "⎔": [T: "under hakeparentes"] # 0x23b5 + - "": [T: "over hakeparentes"] # 0xec0d (en: 'over square bracket', google translation) + - "⎮": [T: "over hakeparentes"] # 0x23b4 + - "": [T: "under hakeparentes venstre"] # 0xec0e (en: 'under bracket left', google translation) + - "": [T: "under hakeparentes hĂžyre"] # 0xec0f (en: 'under bracket right', google translation) + - "": [T: "over hakeparentes venstre"] # 0xec10 (en: 'over bracket left', google translation) + - "": [T: "over hakeparentes hĂžyre"] # 0xec11 (en: 'over bracket right', google translation) + - "": [T: "venstreparentes 1"] # 0xec12 (en: 'left parens 1', google translation) + - "": [T: "venstreparentes 2"] # 0xec13 (en: 'left parens 2', google translation) + - "": [T: "venstreparentes 3"] # 0xec14 (en: 'left parens 3', google translation) + - "": [T: "venstreparentes 4"] # 0xec15 (en: 'left parens 4', google translation) + - "": [T: "hĂžyreparentes 1"] # 0xec16 (en: 'right parens 1', google translation) + - "": [T: "hĂžyreparentes 2"] # 0xec17 (en: 'right parens 2', google translation) + - "": [T: "hĂžyreparentes 3"] # 0xec18 (en: 'right parens 3', google translation) + - "": [T: "hĂžyreparentes 4"] # 0xec19 (en: 'right parens 4', google translation) + - "": [T: "radikal 1"] # 0xec1a (en: 'radical 1', google translation) + - "": [T: "radikal 2"] # 0xec1b (en: 'radical 2', google translation) + - "": [T: "radikal 3"] # 0xec1c (en: 'radical 3', google translation) + - "": [T: "radikal 4"] # 0xec1d (en: 'radical 4', google translation) + - "": [T: "radikal 5"] # 0xec1e (en: 'radical 5', google translation) + - "": [T: "radikal bunn"] # 0xec1f (en: 'radical bottom', google translation) + - "î° ": [T: "radikal vertikal forlenger"] # 0xec20 (en: 'radical vertical extender', google translation) + - "î°Ą": [T: "radikal topp"] # 0xec21 (en: 'radical top', google translation) + - "î°ą": [T: "venstre hvit hakeparentes topp"] # 0xec22 (en: 'left white bracket top', google translation) + - "î°Ł": [T: "venstre hvit hakeparentes forlenger"] # 0xec23 (en: 'left white bracket extender', google translation) + - "î°€": [T: "venstre hvit hakeparentes bunn"] # 0xec24 (en: 'left white bracket bottom', google translation) + - "î°„": [T: "hĂžyre hvit hakeparentes topp"] # 0xec25 (en: 'right white bracket top', google translation) + - "î°Š": [T: "hĂžyre hvit hakeparentes forlenger"] # 0xec26 (en: 'right white bracket extender', google translation) + - "î°§": [T: "hĂžyre hvit hakeparentes bunn"] # 0xec27 (en: 'right white bracket bottom', google translation) + - "î°°": [T: "venstre hvit krĂžllparentes"] # 0xec30 (en: 'left white curly bracket', google translation) + - "î°±": [T: "hĂžyre hvit krĂžllparentes"] # 0xec31 (en: 'right white curly bracket', google translation) + - "î°Č": [T: "lang divisjon"] # 0xec32 (en: 'long division sign', google translation) + - "î°ł": [T: "lang divisjon forlenger"] # 0xec33 (google translation) + - "î°Ž": [T: "kort divisjon"] # 0xec34 (en: 'short division', google translation) + - "": [T: "dobbel sĂžrvest til nordĂžst em-binding"] # 0xec40 (en: 'double southwest to northeast em bond', google translation) + - "": [T: "dobbel nordvest til sĂžrĂžst em-binding"] # 0xec41 (en: 'double northwest to southeast em bond', google translation) + - "": [T: "enkel horisontal em-binding"] # 0xec42 (en: 'single horizontal em bond', google translation) + - "": [T: "dobbel horisontal em-binding"] # 0xec43 (en: 'double horizontal em bond', google translation) + - "": [T: "trippel horisontal em-binding"] # 0xec44 (en: 'triple horizontal em bond', google translation) + - "": [T: "enkel vertikal em-binding"] # 0xec45 (en: 'single vertical em bond', google translation) + - "": [T: "dobbel vertikal em-binding"] # 0xec46 (en: 'double vertical em bond', google translation) + - "": [T: "trippel vertikal em-binding"] # 0xec47 (google translation) + - "": [T: "mindre enn em-binding"] # 0xec48 (en: 'less than em bond', google translation) + - "": [T: "stĂžrre enn em-binding"] # 0xec49 (en: 'greater than em bond', google translation) + - "": [T: "enkel horisontal en-binding"] # 0xec4a (en: 'single horizontal en bond', google translation) + - "": [T: "dobbel horisontal en-binding"] # 0xec4b (en: 'double horizontal en bond', google translation) + - "": [T: "trippel horisontal en-binding"] # 0xec4c (en: 'triple horizontal en bond', google translation) + - "îȀ": [T: "Ăžvre venstre rektangel"] # 0xec80 (en: 'top left rectangle', google translation) + - "îȁ": [T: "nedre venstre rektangel"] # 0xec81 (en: 'bottom left rectangle', google translation) + - "îȐ": [T: "Ăžvre hĂžyre rektangel"] # 0xec90 (en: 'top right rectangle', google translation) + - "îȑ": [T: "nedre hĂžyre rektangel"] # 0xec91 (en: 'bottom right rectangle', google translation) + - "îȒ": [T: "syntetisk divisjon hjĂžrne"] # 0xec92 (en: 'synthetic division corner', google translation) + - "îȓ": [T: "syntetisk divisjon horisontal forlenger"] # 0xec93 (en: 'synthetic division horizontal extender', google translation) + - "îȔ": [T: "syntetisk divisjon vertikal forlenger"] # 0xec94 (en: 'synthetic division vertical extender', google translation) + - "îȕ": [T: "venstre tak gulv forlenger"] # 0xec95 (en: 'left ceiling floor extender', google translation) + - "îȖ": [T: "hĂžyre tak gulv forlenger"] # 0xec96 (en: 'right ceiling floor extender', google translation) + - "îȗ": [T: "over hakeparentes forlenger"] # 0xec97 (en: 'over bracket extender', google translation) + - "îȘ": [T: "vertikal strek forlenger"] # 0xec98 (en: 'vertical bar extender', google translation) + - "îș": [T: "venstre dobbel vertikal strek forlenger"] # 0xec99 (en: 'left double vertical bar extender', google translation) + - "îȚ": [T: "horisontal strek forlenger"] # 0xec9a (en: 'horizontal bar extender', google translation) + - "îȜ": [T: "under hakeparentes forlenger"] # 0xec9c (en: 'under bracket extender', google translation) + - "îȝ": [T: "nedoverpekende parentes hĂžyre"] # 0xec9d (en: 'down pointing paren right', google translation) + - "îȞ": [T: "nedoverpekende parentes forlenger"] # 0xec9e (en: 'down pointing paren extender', google translation) + - "îȟ": [T: "nedoverpekende parentes venstre"] # 0xec9f (en: 'down pointing paren left', google translation) + - "îČ ": [T: "oppoverpekende krĂžllparentes forlenger"] # 0xeca0 (en: 'up pointing brace extender', google translation) + - "îČĄ": [T: "oppoverpekende parentes venstre"] # 0xeca1 (en: 'up pointing paren left', google translation) + - "îČą": [T: "oppoverpekende parentes forlenger"] # 0xeca2 (en: 'up pointing paren extender', google translation) + - "îČŁ": [T: "oppoverpekende parentes hĂžyre"] # 0xeca3 (en: 'up pointing paren right', google translation) + - "îČ€": [T: "nedoverpekende krĂžllparentes forlenger"] # 0xeca4 (en: 'down pointing brace extender', google translation) + - "": [T: "plancks konstant over to pi strek"] # 0xed00 (en: 'planck constant over two pi bar', google translation) + - "": [T: "speilvendt g"] # 0xed01 (en: 'mirror g', google translation) + - "": [T: "j uten prikk"] # 0xed02 (google translation) + - "": [T: "digamma"] # 0xed03 (google translation) + - "ϝ": [T: "digamma"] # 0x3dd + - "": [t: ""] # 0xed10 (en: 'd', google translation) + - "": [t: ""] # 0xed11 (en: 'e', google translation) + - "": [t: ""] # 0xed12 (en: 'i', google translation) + - "": [T: ""] # 0xed13 (en: 'j', google translation) + - "ⅅ": + - SPELL: "translate('.', 'ⅅ', 'DD')" # 0xed16, 0x2145 + +# The private use chars are from MathType + - "": [T: "kurveintegral-loop mot klokka"] # 0xee00 (en: 'anticlockwise contour integral loop', google translation) + - "": [T: "kurveintegral-loop med klokka"] # 0xee01 (en: 'clockwise contour integral loop', google translation) + - "": [T: ""] # 0xee04 + - "": [T: ""] # 0xee05 + - "": [T: ""] # 0xee06 + - "": [T: ""] # 0xee07 + - "": [T: ""] # 0xee08 + - "": [T: ""] # 0xee09 + - "": [T: ""] # 0xee0a + - "": [T: ""] # 0xee0b + - "": [T: ""] # 0xee0c + - "": [T: "joint status"] # 0xee0d (en: 'joint status embellishment', google translation) + - "": [T: "joint status venstre"] # 0xee0e (en: 'joint status embellishment left', google translation) + - "": [T: "joint status hĂžyre"] # 0xee0f (en: 'joint status embellishment right', google translation) + - "": [T: "joint status forlenger"] # 0xee10 (en: 'joint status embellishment extender', google translation) + - "": [T: "integral-loop"] # 0xee11 (en: 'integral loop', google translation) + - "": [T: "dobbel integral-loop"] # 0xee12 (google translation) + - "": [T: "trippel integral-loop"] # 0xee13 (en: 'integral loop triple', google translation) + - "": [T: "ekspanderende dobbel integral-loop"] # 0xee15 (google translation) + - "": [T: "ekspanderende trippel integral-loop"] # 0xee16 (en: 'expanding integral loop triple', google translation) + - "": [T: "asymptotisk lik"] # 0xee17 (en: 'asymptotically equal to accent', google translation) + - "": [T: "lik"] # 0xee18 (en: 'equal sign accent', google translation) + - "": [T: "kvadrupelt primtegn"] # 0xee19 (en: 'quadruple prime', google translation) + - "": [T: "strek med Ă„pen sirkel venstre"] # 0xee1a (en: 'bar accent with open circle left', google translation) + - "": [T: "strek med lukket sirkel venstre"] # 0xee1b (en: 'bar accent with closed circle left', google translation) + - "": [T: "strek med Ă„pen sirkel hĂžyre"] # 0xee1c (en: 'bar accent with open circle right', google translation) + - "": [T: "strek med prikk"] # 0xee1d (en: 'bar accent with over dot', google translation) + - "": [T: "strek over prikk"] # 0xee1e (en: 'bar accent with under dot', google translation) + - "": [T: "strek med dobbel prikk over"] # 0xee1f (en: 'bar accent with double over dot', google translation) + - "îž ": [T: "strek over dobbel prikk"] # 0xee20 (en: 'bar accent with double under dot', google translation) + - "": [T: "strek med hatt"] # 0xee21 (en: 'bar accent with caret', google translation) + - "îžą": [T: "fet understrek"] # 0xee22 (en: 'thick under bar accent', google translation) + - "": [T: "strek med lukket sirkel hĂžyre"] # 0xee23 (en: 'bar accent with closed circle right', google translation) + - "": [T: "stor prikk"] # 0xee24 (en: 'large dot above', google translation) + - "": [T: "justeringsmerke"] # 0xef00 (en: 'alignment mark', google translation) + - "": [T: ""] # 0xef01 + - "​": [T: ""] # 0x200b + - "": [T: ""] # 0xef02 + - " ": [T: ""] # 0x2009 + - "": [T: ""] # 0xef03 + - " ": [T: ""] # 0x205f + - "": [T: ""] # 0xef04 + - "": [T: ""] # 0xef05 + - "": [T: ""] # 0xef06 + - "": [T: ""] # 0xef07 + - "": [T: ""] # 0xef08 + - "": [T: ""] # 0xef09 + - "": [T: ""] # 0xef0a + - " ": [T: ""] # 0x200a + - "îŒą": [T: ""] # 0xef22 + - "îŒŁ": [T: ""] # 0xef23 + - "": [T: ""] # 0xef24 + - "": [T: ""] # 0xef29 + - "": [T: "savnet begrep"] # 0xef41 (en: 'missing term', google translation) + - "": [T: "kurveintegral med klokka pil til venstre"] # 0xef80 (en: 'clockwise contour integral arrow on left', google translation) + - "": [T: "integral med kvadrat"] # 0xef81 (en: 'integral with square', google translation) + - "": [T: "integral med skrĂ„strek"] # 0xef82 (en: 'integral with slash', google translation) + - "": [T: "speilvendt integral"] # 0xef83 (en: 'reversed integral', google translation) + - "": [T: "dobbel null over dobbel null"] # 0xef90 (en: 'double zero over double zero', google translation) + - "": [T: "null med skrĂ„strek"] # 0xef91 (en: 'zero with slash', google translation) + #------------------------------------------------------------------------------------------------------------- + # fraktur 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) + - T: "fraktur" # (google translation) + - SPELL: "translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" + - "-": # 0xf000 - 0xf018 + - T: "fraktur" # (google translation) + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" + + - "𝔞-đ”·": # 0x1d51e - 0x1d537 + - T: "fraktur" # (google translation) + - SPELL: "translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz')" + - "-ï€ł": # 0xf01a - 0xf033 + - T: "fraktur" # (google translation) + - SPELL: "translate('.', 'ï€šï€›ï€œï€ï€žï€Ÿï€ ï€Ąï€ąï€Łï€€ï€„ï€Šï€§ï€šï€©ï€Șï€«ï€Źï€­ï€źï€Żï€°ï€±ï€Čï€ł', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝕬-𝖅": # 0x1D56C - 0x1D585 + - T: "fraktur" # (google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf040 - 0xf059 + - T: "fraktur" # (google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝖆-𝖟": # 0x1d586 - 0x1d59f + - T: "fraktur" # (google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" + - "-ïł": # 0xf05a - 0xf073 + - T: "fraktur" # (google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - 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) + - T: "dobbeltstreket" # (en: 'double struck', google translation) + - SPELL: "translate('.', '𝔾đ”čđ”șđ”»đ”Œđ”œđ”Ÿđ”żđ•€đ•đ•‚đ•ƒđ•„đ•…đ•†đ•‡đ•ˆđ•‰đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf080 - 0xf098 + - T: "dobbeltstreket" # (en: 'double struck', google translation) + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝕒-đ•«": # 0x1d552 - 0x1d56b + - T: "dobbeltstreket" # (en: 'double struck', google translation) + - SPELL: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" + + - "-ï‚ł": # 0xf09a - 0xf0b3 + - T: "dobbeltstreket" # (en: 'double struck', google translation) + - SPELL: "translate('.', 'ï‚šï‚›ï‚œï‚ï‚žï‚Ÿï‚ ï‚Ąï‚ąï‚Łï‚€ï‚„ï‚Šï‚§ï‚šï‚©ï‚Șï‚«ï‚Źï‚­ï‚źï‚Żï‚°ï‚±ï‚Čï‚ł', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 + - T: "dobbeltstreket" # (en: 'double struck', google translation) + - SPELL: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" + - "-": # 0xf0c0 - 0xf0c9 + - T: "dobbeltstreket" # (en: 'double struck', google translation) + - SPELL: "translate('.', '', '0123456789')" + + - "": [T: "dobbeltstreket nabla"] # 0xf0ca (en: 'double struck nabla', google translation) + - "": [T: "dobbeltstreket eulerkonstant"] # 0xf0cb (en: 'double struck euler constant', google translation) + + # script chars in math alphabetic block and also MathType private use area + # SWEDISH: We've used "skrivstilt" instead of skript for clarity + # NORWEGIAN: Used "script font" + - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 + - T: "script font" # (en: 'script', google translation) + - SPELL: "translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf100 - 0xf119 + - T: "script font" # (en: 'script', google translation) + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf + - T: "script font" # (en: 'script', google translation) + - SPELL: "translate('.', 'đ’¶đ’·đ’žđ’čđ’șđ’»đ’Œđ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“„đ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdefghijklmnopqrstuvwxyz')" + + - "-ï„ł": # 0xf11a - 0xf133 + - T: "script font" # (en: 'script', google translation) + - SPELL: "translate('.', 'ï„šï„›ï„œï„ï„žï„Ÿï„ ï„Ąï„ąï„Łï„€ï„„ï„Šï„§ï„šï„©ï„Șï„«ï„Źï„­ï„źï„Żï„°ï„±ï„Čï„ł', 'abcdefghijklmnopqrstuvwxyz')" + + # bold script chars in math alphabetic block and also MathType private use area + - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 + - T: "script font" # (en: 'script bold', google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf140 - 0xf159 + - T: "script font" # (en: 'script bold', google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "đ“Ș-𝔃": # 0x1d4ea - 0x1d503 + - T: "script font" # (en: 'script bold', google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz')" + + - "-ï…ł": # 0xf15a - 0xf173 + - T: "script font" # (en: 'script bold', google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ï…šï…›ï…œï…ï…žï…Ÿï… ï…Ąï…ąï…Łï…€ï…„ï…Šï…§ï…šï…©ï…Șï…«ï…Źï…­ï…źï…Żï…°ï…±ï…Čï…ł', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf180 - 0xf199 + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "": # 0xf19a + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "stor"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [T: "ligatur a e"] # (en: 'ligature ae', google translation) + - "": # 0xf19b + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "stor"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [T: "dobbel s"] # (en: 'sharp s', google translation) + - "": # 0xf19c + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "stor"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [T: "Ăž"] # (en: 'o with stroke', google translation) + + # MathType only has a few of the cap Greek letters in PUA + - "": # 0xf201 - 0xf209 + - T: "dobbeltstreket" # (en: 'double struck', google translation) + - SPELL: "translate('.', '', 'Î”ÎšÎ›Î ÎŁÎ˜Î“Î©Î„')" + + - "-": # 0xf220 - 0xf236 + - T: "dobbeltstreket" # (en: 'double struck', google translation) + - SPELL: "translate('.', 'ïˆ ïˆĄïˆąïˆŁïˆ€ïˆ„ïˆŠïˆ§ïˆšïˆ©ïˆȘïˆ«ïˆŹïˆ­ïˆźïˆŻïˆ°ïˆ±ïˆČïˆłïˆŽïˆ”ïˆ¶', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "": [T: "dobbeltstreket sluttsigma"] # 0xf237 (en: 'double struck final sigma', google translation) + - "": [T: "dobbeltstreket rho"] # 0xf250 (en: 'double struck rho', google translation) + - "": [T: "dobbeltstreket fi"] # 0xf251 (en: 'double struck phi', google translation) + - "𝐀-𝐙": # 0x1d400 - 0x1d419 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-ï‰č": # 0xf260 - 0xf279 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ï‰ ï‰Ąï‰ąï‰Łï‰€ï‰„ï‰Šï‰§ï‰šï‰©ï‰Șï‰«ï‰Źï‰­ï‰źï‰Żï‰°ï‰±ï‰Čï‰łï‰Žï‰”ï‰¶ï‰·ï‰žï‰č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝐚-𝐳": # 0x1d41a - 0x1d433 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" + + - "ï‰ș-": # 0xf27a - 0xf293 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ï‰șï‰»ï‰Œï‰œï‰Ÿï‰żïŠ€ïŠïŠ‚ïŠƒïŠ„ïŠ…ïŠ†ïŠ‡ïŠˆïŠ‰ïŠŠïŠ‹ïŠŒïŠïŠŽïŠïŠïŠ‘ïŠ’ïŠ“', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝐮-𝑍": # 0x1d434 - 0x1d44d + - SPELL: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf294 - 0xf2ad + - SPELL: "translate('.', 'ïŠ”ïŠ•ïŠ–ïŠ—ïŠ˜ïŠ™ïŠšïŠ›ïŠœïŠïŠžïŠŸïŠ ïŠĄïŠąïŠŁïŠ€ïŠ„ïŠŠïŠ§ïŠšïŠ©ïŠȘïŠ«ïŠŹïŠ­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝑎-𝑧": # 0x1d44e - 0x1d467 + - SPELL: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”đ‘•đ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" + + - "ïŠź-": # 0xf2ae - 0xf2c7 + - SPELL: "translate('.', 'ïŠźïŠŻïŠ°ïŠ±ïŠČïŠłïŠŽïŠ”ïŠ¶ïŠ·ïŠžïŠčïŠșïŠ»ïŠŒïŠœïŠŸïŠżï‹€ï‹ï‹‚ï‹ƒï‹„ï‹…ï‹†ï‹‡', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝑹-𝒁": # 0x1d468 - 0x1d481 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-ï‹Ą": # 0xf2c8 - 0xf2e1 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ï‹ˆï‹‰ï‹Šï‹‹ï‹Œï‹ï‹Žï‹ï‹ï‹‘ï‹’ï‹“ï‹”ï‹•ï‹–ï‹—ï‹˜ï‹™ï‹šï‹›ï‹œï‹ï‹žï‹Ÿï‹ ï‹Ą', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝒂-𝒛": # 0x1d482 - 0x1d49b + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" + + - "ï‹ą-": # 0xf2e2 - 0xf2fb + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ï‹ąï‹Łï‹€ï‹„ï‹Šï‹§ï‹šï‹©ï‹Șï‹«ï‹Źï‹­ï‹źï‹Żï‹°ï‹±ï‹Čï‹łï‹Žï‹”ï‹¶ï‹·ï‹žï‹čï‹ș', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 + - SPELL: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf300 - 0xf319 + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 + - SPELL: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" + + - "-ïŒł": # 0xf31a - 0xf333 + - SPELL: "translate('.', 'ïŒšïŒ›ïŒœïŒïŒžïŒŸïŒ ïŒĄïŒąïŒŁïŒ€ïŒ„ïŒŠïŒ§ïŒšïŒ©ïŒȘïŒ«ïŒŹïŒ­ïŒźïŒŻïŒ°ïŒ±ïŒČïŒł', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf334 - 0xf34d + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ïŒčïŒșïŒ»ïŒŒïŒœïŒŸïŒżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒï', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝗼-𝘇": # 0x1d5ee - 0x1d607 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf34e - 0xf367 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ïŽïïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§', 'abcdefghijklmnopqrstuvwxyz')" + - "𝘈-𝘡": # 0x1d608 - 0x1d621 + - SPELL: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "-": # 0xf368 - 0xf381 + - SPELL: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżïŽ€ïŽ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝘱-đ˜»": # 0x1d622 - 0x1d63b + - SPELL: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf382 - 0xf39b + - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + + - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf39c - 0xf3b5 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ïŽœïŽïŽžïŽŸïŽ ïŽĄïŽąïŽŁïŽ€ïŽ„ïŽŠïŽ§ïŽšïŽ©ïŽȘïŽ«ïŽŹïŽ­ïŽźïŽŻïŽ°ïŽ±ïŽČïŽłïŽŽïŽ”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝙖-𝙯": # 0x1d656 - 0x1d66f + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf3b6 - 0xf3cf + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ïŽčïŽșïŽ»ïŽŒïŽœïŽŸïŽżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒïïŽï', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝙰-𝚉": # 0x1d670 - 0x1d689 + - SPELL: "translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf3d0 - 0xf3e9 + - SPELL: "translate('.', 'ïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§ïšï©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝚊-𝚣": # 0x1d68a - 0x1d6a3 + - SPELL: "translate('.', '𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚱𝚣', 'abcdefghijklmnopqrstuvwxyz')" + + - "ïȘ-": # 0xf3ea - 0xf403 + - SPELL: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżï€ïï‚ïƒ', 'abcdefghijklmnopqrstuvwxyz')" + + - "": [T: "i uten prikk"] # 0xf404 (google translation) + - "đš€": [T: "kursiv i uten prikk"] # 0x1d6a4 (en: 'dotless i', google: 'dotless i') + - "đš„": [T: "kursiv j uten prikk"] # 0x1d6a5 (en: 'dotless j', google: 'dotless j') + + - "𝚹-𝛀": # 0x1d6a8 - 0x1d6c0 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "-": # 0xf408 - 0xf420 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "𝛂-𝛚": # 0x1d6c2 - 0x1d6da + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙𝛚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "ïą-ïș": # 0xf422 - 0xf43a + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ïąïŁï€ï„ïŠï§ïšï©ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïș', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "ïĄ": [T: "fet nabla"] # 0xf421 (en: 'bold nabla', google translation) + - "𝛁": [T: "fet nabla"] # 0x1d6c1 (en: 'bold nabla', google translation) + + - "𝛛𝛜𝛝𝛞𝛟𝛠𝛡": # 0x1D6DB - 0x1D6E1 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', '𝛛𝛜𝛝𝛞𝛟𝛠𝛡', '∂ΔΞÎșφρπ')" + + - "ï»ïŒïœïŸïżï‘€ï‘": # 0xF43C - 0xF441 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ï»ïŒïœïŸïżï‘€ï‘', '∂ΔΞÎșφρπ')" + + - "𝛱-đ›ș": # 0x1d6e2 - 0x1d6fa + - SPELL: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›čđ›ș', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "-": # 0xf442 - 0xf45a + - SPELL: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "đ›Œ-𝜔": # 0x1d6fc - 0x1d714 + - SPELL: "translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“đœ”', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-": # 0xf45c - 0xf474 + - SPELL: "translate('.', 'ï‘œï‘ï‘žï‘Ÿï‘ ï‘Ąï‘ąï‘Łï‘€ï‘„ï‘Šï‘§ï‘šï‘©ï‘Șï‘«ï‘Źï‘­ï‘źï‘Żï‘°ï‘±ï‘Čï‘łï‘Ž', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "": [T: "kursiv nabla"] # 0xf45b (en: 'italic nabla', google translation) + - "đ›»": [T: "kursiv nabla"] # 0x1d6fb (en: 'italic nabla', google translation) + + - "𝜕𝜖𝜗𝜘𝜙𝜚𝜛": # 0x1d715 - 0x1d71b + - SPELL: "translate('.', '𝜕𝜖𝜗𝜘𝜙𝜚𝜛', '∂ΔΞÎșφρπ')" + + - "ï‘čï‘ș": # 0xf475 - 0xf47b + - SPELL: "translate('.', 'ï‘čï‘ș', '∂ΔΞÎșφρπ')" + + - "𝜜-𝜮": # 0x1d71c - 0x1d734 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳𝜮', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "-": # 0xf47c - 0xf494 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ï‘Œï‘œï‘Ÿï‘żï’€ï’ï’‚ï’ƒï’„ï’…ï’†ï’‡ï’ˆï’‰ï’Šï’‹ï’Œï’ï’Žï’ï’ï’‘ï’’ï’“ï’”', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "đœ¶-𝝎": # 0x1d736 - 0x1d74e + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđđŽ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-ï’ź": # 0xf496 - 0xf4ae + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ï’–ï’—ï’˜ï’™ï’šï’›ï’œï’ï’žï’Ÿï’ ï’Ąï’ąï’Łï’€ï’„ï’Šï’§ï’šï’©ï’Șï’«ï’Źï’­ï’ź', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "𝝏𝝐𝝑𝝒𝝓𝝔𝝕": # 0x1d74f - 0x1d755 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', '𝝏𝝐𝝑𝝒𝝓𝝔𝝕', '∂ΔΞÎșφρπ')" + + - "ï’Żï’°ï’±ï’Čï’łï’Žï’”": # 0xf422 - 0xf43a + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ï’Żï’°ï’±ï’Čï’łï’Žï’”', '∂ΔΞÎșφρπ')" + + - "đœ”": [T: "fet kursiv nabla"] # 0x1d735 (en: 'bold italic nabla', google translation) + - "": [T: "fet kursiv nabla"] # 0xf495 (en: 'bold italic nabla', google translation) + + - "𝝖-𝝼": # 0x1d756 - 0x1d76e + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đź', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + - "-": # 0xf4b6 - 0xf4ce + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ï’¶ï’·ï’žï’čï’șï’»ï’Œï’œï’Ÿï’żï“€ï“ï“‚ï“ƒï“„ï“…ï“†ï“‡ï“ˆï“‰ï“Šï“‹ï“Œï“ï“Ž', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "𝝰-𝞈": # 0x1d770 - 0x1d788 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€đžđž‚đžƒđž„đž…đž†đž‡đžˆ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-": # 0xf4d0 - 0xf4e8 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ï“ï“‘ï“’ï““ï“”ï“•ï“–ï“—ï“˜ï“™ï“šï“›ï“œï“ï“žï“Ÿï“ ï“Ąï“ąï“Łï“€ï“„ï“Šï“§ï“š', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "𝞉𝞊𝞋𝞌𝞍𝞎𝞏": # 0x1d789 - 0x1d78f + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', '𝞉𝞊𝞋𝞌𝞍𝞎𝞏', '∂ΔΞÎșφρπ')" + + - "ï“Șï“«ï“Źï“­ï“źï“Ż": # 0xf4e9 - 0xf4ef + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ï“Șï“«ï“Źï“­ï“źï“Ż', '∂ΔΞÎșφρπ')" + + - "": [T: "fet nabla"] # 0xf4cf (en: 'bold nabla', google translation) + - "𝝯": [T: "fet nabla"] # 0x1d76f (en: 'bold nabla', google translation) + + - "𝞐-𝞹": # 0x1d790 - 0x1d7a8 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "-": # 0xf4f0 - 0xf508 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ï“Čï“łï“Žï“”ï“¶ï“·ï“žï“čï“șï“»ï“Œï“œï“Ÿï“żï”€ï”ï”‚ï”ƒï”„ï”…ï”†ï”‡ï”ˆ', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "đžȘ-𝟂": # 0x1d7aa - 0x1d7c2 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸđŸ‚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-ï”ą": # 0xf50a - 0xf522 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ï”Šï”‹ï”Œï”ï”Žï”ï”ï”‘ï”’ï”“ï””ï”•ï”–ï”—ï”˜ï”™ï”šï”›ï”œï”ï”žï”Ÿï” ï”Ąï”ą', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "𝟃𝟄𝟅𝟆𝟇𝟈𝟉": # 0x1d7c3 - 0x1d7c9 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', '𝟃𝟄𝟅𝟆𝟇𝟈𝟉', '∂ΔΞÎșφρπ')" + + - "ï”Łï”€ï”„ï”Šï”§ï”šï”©": # 0xf523 - 0xf529 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ï”Łï”€ï”„ï”Šï”§ï”šï”©', '∂ΔΞÎșφρπ')" + + - "": [T: "fet nabla"] # 0xf509 (en: 'bold nabla', google translation) + - "đž©": [T: "fet nabla"] # 0x1d7a9 (en: 'bold nabla', google translation) + + - "ï”ź-": # 0xf52e - 0xf537 (old MathType) + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'ï”źï”Żï”°ï”±ï”Čï”łï”Žï””ï”¶ï”·', '0123456789')" + + - "𝟎-𝟗": # 0x1d7ce - 0x1d7d7 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', '𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗', '0123456789')" + + - "-": # 0xf542 - 0xf54b (old MathType) + - SPELL: "translate('.', '', '0123456789')" + + - "𝟱-đŸ«": # 0x1d7e2 - 0x1d7eb (old MathType) + - SPELL: "translate('.', 'đŸąđŸŁđŸ€đŸ„đŸŠđŸ§đŸšđŸ©đŸȘđŸ«', '0123456789')" + + - "-": # 0xf54c - 0xf555 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', '', '0123456789')" + + - "𝟬-đŸ”": # 0x1d7ec - 0x1d7f5 + - test: + if: "not($IgnoreBold)" + then: [T: "fet"] + - SPELL: "translate('.', 'đŸŹđŸ­đŸźđŸŻđŸ°đŸ±đŸČđŸłđŸŽđŸ”', '0123456789')" + + - "-": # 0xf556 - 0xf55f (old MathType) + - SPELL: "translate('.', '', '0123456789')" + + - "đŸ¶-𝟿": # 0x1d7f6 - 0x1d7ff + - SPELL: "translate('.', 'đŸ¶đŸ·đŸžđŸčđŸșđŸ»đŸŒđŸœđŸŸđŸż', '0123456789')" + + - "": [T: "ukjent tegn"] # 0xf700 (en: 'unknown character', google translation) + - "": [T: "nedre hĂžyre og nedre venstre trekanter"] # 0xf726 (en: 'lower right and lower left triangles', google translation) + - "": [T: "horisontal ellipse forlenger"] # 0xf72d (en: 'horizontal ellipsis extender', google translation) + - "ïœź": [T: "midtlinje horisontal ellipse forlenger"] # 0xf72e (en: 'midline horizontal ellipsis extender', google translation) + - "ïŁ„": [T: "radikal forlenger"] # 0xf8e5 (en: 'radical extender', google translation) + - "ïŁŠ": [T: "vertikal pil-forlenger"] # 0xf8e6 (en: 'vertical arrow extender', google translation) + - "ïŁ§": [T: "horisontal pil-forlenger"] # 0xf8e7 (en: 'horizontal arrow extender', google translation) + - "ïŁš": [T: "registrert"] # 0xf8e8 (en: 'registered sign sans serif', google translation) + - "ïŁ©": [T: "opphavsrett"] # 0xf8e9 (google translation) + - "ïŁȘ": [T: "varemerke"] # 0xf8ea (google translation) + - "ïŁ«": [T: "venstreparentes topp"] # 0xf8eb (en: 'left paren top', google translation) + - "ïŁŹ": [T: "venstreparentes forlenger"] # 0xf8ec (en: 'left paren extender', google translation) + - "ïŁ­": [T: "venstreparentes bunn"] # 0xf8ed (en: 'left paren bottom', google translation) + - "ïŁź": [T: "venstre hakeparentes topp"] # 0xf8ee (en: 'left bracket top', google translation) + - "ïŁŻ": [T: "venstre hakeparentes forlenger"] # 0xf8ef (en: 'left bracket extender', google translation) + - "ïŁ°": [T: "venstre hakeparentes bunn"] # 0xf8f0 (en: 'left bracket bottom', google translation) + - "ïŁ±": [T: "venstre krĂžllparentes topp"] # 0xf8f1 (en: 'left brace top', google translation) + - "ïŁČ": [T: "venstre krĂžllparentes midten"] # 0xf8f2 (en: 'left brace mid', google translation) + - "ïŁł": [T: "venstre krĂžllparentes bunn"] # 0xf8f3 (en: 'left brace bottom', google translation) + - "ïŁŽ": [T: "krĂžllparentes forlenger"] # 0xf8f4 (en: 'brace extender', google translation) + - "ïŁ”": [T: "integral forlenger"] # 0xf8f5 (en: 'integral extender', google translation) + - "ïŁ¶": [T: "hĂžyreparentes topp"] # 0xf8f6 (en: 'right paren top', google translation) + - "ïŁ·": [T: "hĂžyreparentes forlenger"] # 0xf8f7 (en: 'right paren extender', google translation) + - "ïŁž": [T: "hĂžyreparentes bunn"] # 0xf8f8 (en: 'right paren bottom', google translation) + - "ïŁč": [T: "hĂžyre hakeparentes topp"] # 0xf8f9 (en: 'right bracket top', google translation) + - "ïŁș": [T: "hĂžyre hakeparentes forlenger"] # 0xf8fa (en: 'right bracket extender', google translation) + - "ïŁ»": [T: "hĂžyre hakeparentes bunn"] # 0xf8fb (en: 'right bracket bottom', google translation) + - "ïŁŒ": [T: "hĂžyre krĂžllparentes topp"] # 0xf8fc (en: 'right brace top', google translation) + - "ïŁœ": [T: "hĂžyre krĂžllparentes midten"] # 0xf8fd (en: 'right brace mid', google translation) + - "ïŁŸ": [T: "hĂžyre krĂžllparentes bunn"] # 0xf8fe (en: 'right brace bottom', google translation) + - "ïŁż": [T: "apple logo"] # 0xf8ff (en: 'apple logo', google translation) + #-------------------------------------------------------------------------------------------------------------- + #Alphabetic presentation forms + - "ïŹ€": [T: "f f"] # 0xfb00 (en: 'ff', google: 'ff') + - "ïŹ": [T: "f i"] # 0xfb01 (en: 'fi', google: 'fi') + - "ïŹ‚": [T: "f l"] # 0xfb02 (en: 'fl', google: 'fl') + - "ïŹƒ": [T: "f f i"] # 0xfb03 (en: 'ffi', google: 'ffi') + - "ïŹ„": [T: "f f l"] # 0xfb04 (en: 'ffl', google: 'ffl') + - "ïŹ…": [T: "f t"] # 0xfb05 (en: 'ft', google translation) + - "ïŹ†": [T: "s t"] # 0xfb06 (google translation) + - "ïŹ©": [T: "hebraisk bokstav alternativ pluss"] # 0xfb29 + #------------------------------------------------------------------------------------------------------------------ + # Combining half marks + - "ïž ": [T: "ligatur venstre halvdel"] # 0xfe20 (en: 'ligature left half embellishment', google translation) + - "ïžĄ": [T: "ligatur hĂžyre halvdel"] # 0xfe21 (en: 'ligature right half embellishment', google translation) + - "ïžą": [T: "dobbel tilde venstre halvdel"] # 0xfe22 (en: 'double tilde left half embellishment', google translation) + - "ïžŁ": [T: "dobbel tilde hĂžyre halvdel"] # 0xfe23 (en: 'double tilde right half embellishment', google translation) + - "": [T: "makron venstre halvdel"] # 0xfe24 (en: 'macron left half embellishment', google translation) + - "ïž„": [T: "makron hĂžyre halvdel"] # 0xfe25 (en: 'macron right half embellishment', google translation) + - "": [T: "sammenkoblet makron"] # 0xfe26 (en: 'conjoining macron embellishment', google translation) + #----------------------------------------------------------------------------------------------------------------- + #CJK compatibility forms + - "ïž”": [T: "parentes over"] # 0xfe35 + - "ïž¶": [T: "parentes under"] # 0xfe36 + - "ïž·": [T: "krĂžllparentes over"] # 0xfe37 (en: 'over brace') + - "ïžž": [T: "krĂžllparentes under"] # 0xfe38 (en: 'under brace') + - "ïžż": [T: "vinkelparentes over"] # 0xfe3f + - "ïč€": [T: "vinkelparentes under"] # 0xfe40 +#------------------------------------------------------------------------------------------------------------------ +#Halfwidth and Fullwidth forms + - "ïčĄ": [T: "liten asterisk"] # 0xfe61 + - "ïčą": [T: "liten pluss"] # 0xfe62 + - "ïčŁ": [T: "liten minus"] # 0xfe63 + - "ïč€": [T: "liten mindre enn"] # 0xfe64 + - "ïč„": [T: "liten stĂžrre enn"] # 0xfe65 + - "ïčŠ": [T: "lite likhetstegn"] # 0xfe66 + - "": [T: "pluss"] # 0xff0b + - "": [T: "mindre enn"] # 0xff1c + - "": [T: "lik"] # 0xff1d + - "": [T: "stĂžrre enn"] # 0xff1e + - "": [T: "omvendt skrĂ„strek"] # 0xff3c + - "": [T: "hatt"] # 0xff3e + - "": # 0xff5c + # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' + - with: + variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) + replace: + - test: + - if: "$SpeechStyle != 'ClearSpeak'" + then_test: + if: "$DefaultToGiven" + then: [pause: short, T: "gitt"] + else: [T: "vertikal strek"] + - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" + then: [T: "vertikal strek"] + - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" + then: [T: "slik at"] + - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" + then: [pause: short, T: "gitt"] + - else: [T: "deler"] + - "": [T: "tilde"] # 0xff5e + - "ïżą": [T: "ikke"] # 0xffe2 + - "ïż©": [T: "venstrepil"] # 0xffe9 + - "ïżȘ": [T: "oppoverpil"] # 0xffea + - "ïż«": [T: "hĂžyrepil"] # 0xffeb + - "ïżŹ": [T: "nedoverpil"] # 0xffec + #-------------------------------------------------------------------------------------------------------------------- + #Small form variants + - "ïčš": [T: "liten speilvendt skrĂ„strek"] # 0xfe68 + #--------------------------------------------------------------------------------------------------------------------- + #Specials + - "ïżŒ": [T: "ukjent eller savnet objekt"] # 0xfffc (en: 'unknown or missing object', google translation) + - "ïżœ": [T: "ukjent eller savnet tegn"] # 0xfffd (google: 'okĂ€nd eller saknad karaktĂ€r') + + - "🣑": [T: "er i likevekt med"] # 0x1F8D1 + - "🣒": [T: "er i likevekt, forskjĂžvet mot hĂžyre, med"] # 0x1F8D2 + - "🣓": [T: "er i likevekt, forskjĂžvet mot venstre, med"] # 0x1F8D3 + +# MathJax v4 has adopted these PUA values for some partial chem bonds that aren't in Unicode + - "\uE410": [T: "delvis enkeltbinding"] # 0xe410 + - "\uE411": [T: "delvis dobbeltbinding"] # 0xe411 + - "\uE412": [T: "delvis trippelbinding"] # 0xe412 + +# MathJax v4 also adopted these PUA values for some arrows thar are in Unicode +# Hopefully these will be exported properly in future versions of MathJax + - "\uE428": [SPELL: "'⟔'"] # 0xe428 defer to def of arrow + - "\uE429": [SPELL: "'⟶'"] # 0xe429 defer to def of arrow + - "\uE42A": [SPELL: "'⟷'"] # 0xe42a defer to def of arrow + - "\uE408": [SPELL: "'🣑'"] # 0xe408 defer to def of arrow + - "\uE409": [SPELL: "'🣒'"] # 0xe409 defer to def of arrow + - "\uE40A": [SPELL: "'🣓'"] # 0xe40a defer to def of arrow + - "\uE42B": [SPELL: "'⇄'"] # 0xe42b defer to def of arrow + - "\uE42C": [SPELL: "'←'"] # 0xe42c defer to def of arrow + - "\uE42D": [SPELL: "'→'"] # 0xe42d defer to def of arrow + - "\uE42E": [SPELL: "'⇄'"] # 0xe42e defer to def of arrow diff --git a/Rules/Languages/nb/unicode.yaml b/Rules/Languages/nb/unicode.yaml index c14cfa759..ee5c5a931 100644 --- a/Rules/Languages/nb/unicode.yaml +++ b/Rules/Languages/nb/unicode.yaml @@ -1,486 +1,486 @@ ---- - - "a-z": - - test: - if: "$TTS='none'" - then: [T: "."] # (en: '.', google translation) - else: [SPELL: "'.'"] - - # Capital letters are a little tricky: users can pick their favorite word (something that was requested) and - # screen readers have options to use pitch changes or beeps instead of or in addition to say "cap" - # Also, if a user can see the screen, they probably don't need to hear "cap", but if they specified an override, they must want to hear the override. - - - "A-Z": - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "stor"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - # note: processing of ranges converts '.' into the character, so it needs to be in quotes below - replace: [SPELL: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"] - - - "0-9": [T: "."] # (en: '.', google: 'A') - - - " ": [T: " "] # 0x20 #NORWEGIAN: Added from English version. Not in Swedish version. - - - "!": # 0x21 - - test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" #NORWEGIAN: Changed from ":structure" to be equal to English translation - then_test: - if: "$Verbosity = 'Terse'" - then: [T: "utropstegn"] # 0x21 (en: 'bang', google translation) - else: [T: "utropstegn"] # 0x21 (en: 'exclamation point') - else: [T: "fakultet"] # 0x21 (en: 'factorial') - - - "\"": [T: "anfĂžrselstegn"] # 0x22 (en: 'quotation mark') - - "#": [T: "nummertegn"] # 0x23 (en: 'number', MathPlayer: 'numeriskt tecken', google: 'siffra') - - "$": [T: "dollar"] # 0x24 (en: 'dollars') - - "%": [T: "prosent"] # 0x25 (en: 'percent') - - "&": [T: "og-tegn"] # 0x26 (en: 'ampersand') - - "'": [T: "apostrof"] # 0x27 (en: 'apostrophe') - - "(": # 0x28 - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then_test: - if: "$Verbosity='Terse'" - then: [pause: short, T: "startparentes"] # 0x28 (en: 'open', google translation) - else: [pause: short, T: "startparentes"] # 0x28 (en: 'open paren') - else: [T: "venstreparentes"] # 0x28 (en: 'left paren') - - pause: short - - ")": # 0x29 - - pause: short - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then_test: - if: "$Verbosity='Terse'" - then: [T: "sluttparentes"] # 0x29 (en: 'close', google translation) - else: [T: "sluttparentes"] # 0x29 (en: 'close paren') - else: [T: "hĂžyreparentes"] # 0x29 (en: 'right paren') - - - "*": # 0x2a - test: - if: "parent::*[name(.)='msup' or name(.)='msubsup' or name(.)='skip-super']" - then: [T: "stjerne"] # 0x2a (en: 'star', google translation) - else: [T: "ganger"] # 0x2a (en: 'times') - - "+": [T: "pluss"] # 0x2b - - ",": # 0x2c - # the following deals with the interaction of "," with "
" which sometimes wants the ',' to be silent - # that this test is here and not with "
" is not ideal, but seems simplest - test: - if: - - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or " - # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' - # speak "comma" when not adjacent to '
' - - "( following-sibling::*[1][text()!= '
'] and preceding-sibling::*[1][text()!='
'] ) or " - # except if expression starts with '
' - - "../*[1][.='
'] " - then: - - T: "komma" # (en: 'comma', google translation) - - test: - if: "$Verbosity != Terse" - then: [pause: short] - # else silent - - - "-": [T: "minus"] # 0x2d - - ".": # 0x2e - - test: - if: "parent::*[1][self::m:mn]" - then: [T: "punktum"] # (en: 'point', google translation) - else: [T: "prikk"] # (en: 'dot') - - "/": # 0x2f (en: 'divided by') - - test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [T: "skrĂ„strek"] # 0x2f - else: [T: "delt pĂ„"] # 0x2f - - ":": [T: "kolon"] # 0x3a (en: 'colon') - - ";": [T: "semikolon"] # 0x3b (en: 'semicolon') - - "<": # 0x3c - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "mindre enn" # (en: 'less than') - - "=": # 0x3d # audit-ignore - # SWEDISH: We remove "Ă€r" from all occurrences of = after consulting our mathematician advisor. - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] - - T: "lik" # (en: 'equals', MathPlayer: 'lik', google: 'lika') - - - ">": # 0x3e - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "stĂžrre enn" # (en: 'greater than') - - "?": [T: "spĂžrsmĂ„lstegn"] # 0x3f (en: 'question mark') - - "@": [T: "krĂžllalfa"] # 0x40 (en: 'at sign') - - "[": # 0x5b - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "start hakeparentes"] # (en: 'open bracket', google translation) - else: [T: "venstre hakeparentes"] # (en: 'left bracket') - - pause: short - - "\\": [T: "omvendt skrĂ„strek"] # 0x5c (en: 'back slash') - - "]": # 0x5d - - pause: short - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "slutt hakeparentes"] # (en: 'close bracket', google translation) - else: [T: "hĂžyre hakeparentes"] # (en: 'right bracket') - - "^": [T: "hatt"] # 0x5e (en: 'hat') # audit-ignore - - "_": [T: "understrek"] # 0x5f (en: 'under bar', MathPlayer: 'streck under', google: 'under bar') - - "`": [T: "grav aksent"] # 0x60 (en: 'grave') - - "{": # 0x7b - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "start krĂžllparentes"] # (en: 'open brace', google translation) - else: [T: "venstre krĂžllparentes"] # (en: 'left brace') - - pause: short - - "|": # 0x7c - # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' - - with: - variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) - replace: - - test: - - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [T: "vertikal strek"] - - else_if: "$SpeechStyle != 'ClearSpeak'" - then_test: - - if: "$DefaultToGiven" - then: [pause: short, T: "gitt"] - - else_if: "preceding-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))] and - following-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))]" - then: [T: "deler"] - else: [T: "vertikal strek"] - - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" - then: [T: "vertikal strek"] - - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" - then: [T: "slik at"] - - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" - then: [pause: short, T: "gitt"] - - else: [T: "deler"] - - - "}": # 0x7d - - pause: short - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: "slutt krĂžllparentes"] # (en: 'close brace', google translation) - else: [T: "hĂžyre krĂžllparentes"] # (en: 'right brace') - - - "~": [T: "tilde"] # 0x7e - - " ": # 0xa0 - - test: - if: "@data-empty-in-2D and not(ancestor::*[self::m:piecewise or self::m:system-of-equations or self::m:lines])" #NORWEGIAN: Changed to English version. Now it doesn't speak "tom tom" for continued_row - then: [T: "tom"] # want to say something for fraction (etc) with empty child (en: 'empty', google translation) - else: [T: ""] - - - "ÂŹ": [T: "ikke"] # 0xac (en: 'not') - - "°": [T: "grader"] # 0xb0 (en: 'degrees') - - "±": [T: "pluss minus"] # 0xb1 (en: 'plus or minus') - - "ÂŽ": [T: "akutt aksent"] # 0xb4 (en: 'acute') - - "·": # 0xB7 - - test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')] or not($SpeechStyle = 'ClearSpeak' and $ClearSpeak_MultSymbolDot = 'Auto')" - then: [T: "midtstilt prikk"] # (en: 'times', google translation) - else: [T: "ganger"] # (en: 'dot', MathPlayer: 'mellanpunkt', google: 'punkt') - - "×": # 0xd7 - - test: - if: "$SpeechStyle = 'ClearSpeak'" - then_test: - - if: "$ClearSpeak_MultSymbolX = 'Auto'" - then: [T: "ganger"] - - else_if: "$ClearSpeak_MultSymbolX = 'By'" - then: [T: "ganger"] - else: [T: "kryss"] - else_test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [T: "kryss"] - else: [T: "ganger"] - - "Ă·": [T: "delt pĂ„"] # 0xf7 (en: 'divided by') - - "̀": [T: "grav aksent"] # 0x300 (en: 'grave accent embellishment', google: 'allvarlig accentutsmyckning') - - "́": [T: "akutt aksent"] # 0x301 (en: 'acute accent embellishment', google: 'akut accentutsmyckning') - - "̂": [T: "cirkumfleks"] # 0x302 (en: 'circumflex accent embellishment', google: 'circumflex accent utsmyckning') - - "̃": [T: "tilde"] # 0x303 (google: 'tilde utsmyckning') - - "̄": [T: "makron"] # 0x304 (en: 'macron embellishment', google: 'macron -utsmyckning') - - "̅": [T: "strek"] # 0x305 (google: 'överbar utsmyckning') - - "̆": [T: "breve"] # 0x306 (en: 'breve', google: 'breve') - - "̇": [T: "prikk"] # 0x307 (google: 'prick ovanför utsmyckning') - - # Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong - - "Α-Ω": - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [T: "stor"] # (en: 'cap', google translation) - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - # note: processing of ranges converts '.' into the character, so it needs to be in quotes below - replace: [SPELL: "translate('.', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')"] - - - "α": [T: "alfa"] # 0x3b1 (en: 'alpha') - - "ÎČ": [T: "beta"] # 0x3b2 - - "Îł": [T: "gamma"] # 0x3b3 - - "ÎŽ": [T: "delta"] # 0x3b4 - - "Δ": [T: "epsilon"] # 0x3b5 - - "ζ": [T: "zeta"] # 0x3b6 - - "η": [T: "eta"] # 0x3b7 - - "Ξ": [T: "theta"] # 0x3b8 - - "Îč": [T: "jota"] # 0x3b9 (en: 'iota', google: 'iota') - - "Îș": [T: "kappa"] # 0x3ba - - "λ": [T: "lambda"] # 0x3bb (en: 'lambda', google: 'lambda') - - "ÎŒ": [T: "my"] # 0x3bc (en: 'mu', google: 'mu') - - "Μ": [T: "ny"] # 0x3bd (en: 'nu', google: 'nu') - - "Ο": [T: "ksi"] # 0x3be (en: 'zai', google: 'zai') - - "Îż": [T: "omikron"] # 0x3bf (en: 'omicron', google: 'omicron') - - "π": [T: "pi"] # 0x3c0 - - "ρ": [T: "rho"] # 0x3c1 - - "ς": [T: "sluttsigma"] # 0x3c2 (en: 'final sigma', google: 'slutlig sigma') - - "σ": [T: "sigma"] # 0x3c3 - - "τ": [T: "tau"] # 0x3c4 - - "υ": [T: "ypsilon"] # 0x3c5 (en: 'upsilon', google: 'upsilon') - - "φ": [T: "fi"] # 0x3c6 (en: 'phi', google: 'phi') - - "χ": [T: "khi"] # 0x3c7 - - "ψ": [T: "psi"] # 0x3c8 - - "ω": [T: "omega"] # 0x3c9 - - "ϕ": [T: "fi"] # 0x3d5 (en: 'phi', google: 'phi') - - "ϖ": [T: "pi"] # 0x3d6 (en: 'pi', google: 'pi') - - "Ï”": [T: "epsilon"] # 0x3f5 - - "϶": [T: "omvendt epsilon"] # 0x3f6 (en: 'reversed epsilon') - - - "⁥": # 0x2061 # audit-ignore - - test: - if: "preceding-sibling::*[1][.='log' or .='ln' or .='lg' or .='exp'] or - not( - ( $Verbosity='Terse' or ($SpeechStyle = 'ClearSpeak' and IsNode(following-sibling::*[1],'simple')) and - preceding-sibling::*[1][IfThenElse($SpeechStyle='ClearSpeak', - IsInDefinition(., 'Speech', 'ClearSpeakTrigFunctionNames'), - IsInDefinition(., 'Speech', 'TrigFunctionNames') )] - ) or - preceding-sibling::*[1][IsInDefinition(., 'Speech', 'GeometryShapes')] or - (@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) - )" - then: [T: "av"] # (en: 'of', google translation) - - - "⁹": [T: ""] # 0x2062 - - "⁣": [T: ""] # 0x2063 - - "⁀": [T: "og"] # 0x2064 (en: 'and', google: 'og') - - "ℂℕℚℝ℀": # here we rely on this running through the table again to speak "cap xxx" - - T: "dobbeltstreket" # (en: 'double-struck') - - SPELL: "translate('.', 'ℂℕℚℝ℀', 'CNQRZ')" - - - "℃": [T: "grader celsius"] # 0x2103 (en: 'degrees celsius') - - "ℋℛℓ": # 0x210b - - T: "script font" # (en: 'script', google: 'manus') - - SPELL: "translate('.', 'ℋℛℓ', 'HRl')" - - "ℜ": # 0x211c - - T: "fraktur" # (en: 'fraktur', google: 'fraktur') - - SPELL: "'R'" - - - "ⅆⅇⅈⅉ": # 0x2146-9 - - T: "dobbeltstreket kursiv" # (en: 'double-struck italic') - - SPELL: "translate('.', 'ⅆⅇⅈⅉ', 'deij')" - - - "∄": # 0x2225 - - test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [T: "dobbel vertikal linje"] - else: - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] - - T: "parallell med" - - "∊": # 0x2226 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "ikke parallell med" # (en: 'not parallel to') - - "≀": # 0x2264 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] - - T: "mindre enn eller lik" - - - "≄": # 0x2265 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] - - T: "stĂžrre enn eller lik" - - - # --- restored complex short definitions (prefer over unicode-full) --- - - "
": # 0x2026 - test: - if: - - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" - # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' - # speak '
' as 'and so on...' unless expr starts with '
' - - "../*[1][.='
']" - then: [T: "prikk prikk prikk"] # (en: 'dot dot dot', google translation) - else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' - if: "count(following-sibling::*) = 0" - then: [T: "og sĂ„ videre"] # (en: 'and so on', google translation) - else: [T: "og sĂ„ videre opp til"] # (en: 'and so on up to') - - "→": # 0x2192 - - test: - if: "ancestor::*[2][self::m:limit]" - then: [T: "gĂ„r mot"] # (en: 'approaches', google translation) - else: [T: "hĂžyrepil"] # (en: 'right arrow') - - "∆": # 0x2206 - - test: - if: "following-sibling::*" - then: [T: "laplas av"] # (en: 'laplacian of') # Norwegian: "laplace" is not pronounced correctly - else: [T: "laplas"] - - "∈": # 0x2208 # audit-ignore - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: - - T: "i" #(en: "is an element of") - # NORWEGIAN: "i" sounds best in all cases for the non-ClearSpeak case - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - # SWEDISH/NORWEGIAN: The word "medlem" is not commonly used in set theory, so we removed that rule. If the parsing has set the parameter to "Member" it will fall under the "else" case. - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "i"] # (en: 'in', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "element i"] # (en: 'element of', google translation) - - else: [T: "tilhĂžrende"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "i"] # NORWEGIAN: Set the "auto" case to be "i" - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "er et element i"] # (en: 'is in', google translation) - - else: [T: "tilhĂžrer"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') - - "∉": # 0x2209 # audit-ignore - # rule is identical to 0x2208 - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: - - test: - if: "not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" - then: [T: "er"] - - T: "ikke et element i" - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - # SWEDISH/NORWEGIAN: The word "medlem" is not commonly used in set theory, so we removed that rule. If the parsing has set the parameter to "Member" it will fall under the "else" case. - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "ikke i"] # (en: 'not in', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "ikke element i"] # (en: 'not element of', google translation) - - else: [T: "ikke tilhĂžrende"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'not belonging to') - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "er ikke et element i"] # (en: 'is not an element of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "er ikke i"] # (en: 'is not in', google translation) - - else: [T: "tilhĂžrer ikke"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'does not belong to') - - "∊": # 0x220a # audit-ignore - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: - - T: "i" #(en: "is an element of") - # NORWEGIAN: "i" sounds best in all cases for the non-ClearSpeak case - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - # SWEDISH/NORWEGIAN: The word "medlem" is not commonly used in set theory, so we removed that rule. If the parsing has set the parameter to "Member" it will fall under the "else" case. - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "i"] # (en: 'in', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "element i"] # (en: 'element of', google translation) - - else: [T: "tilhĂžrende"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "i"] # (en: 'is an element of', google translation) #NORWEGIAN: Set the "auto" case to be "i" - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: "er et element i"] # (en: 'is in', google translation) - - else: [T: "tilhĂžrer"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') - - "∝": # 0x221d - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "proporsjonal med" # (en: 'proportional to') - - "∌": # 0x223c (en: 'varies with') # audit-ignore - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] - - T: "proporsjonal med" - - "≠": # 0x2260 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] - - T: "ikke lik" # (en: 'not equal to') - - "≡": # 0x2261 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] - - T: "identisk med" # (en: 'identical to') - - "≩": # 0x2266 (en: 'less than over equal to') # audit-ignore - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] - - T: "mindre enn eller lik" - - "≧": # 0x2267 (en: 'greater than over equal to') # audit-ignore - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] - - T: "stĂžrre enn eller lik" - - "⊂": # 0x2282 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er en"] # (en: 'is a', google translation) - - T: "ekte delmengde av" - - "⊃": # 0x2283 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er en"] # (en: 'is a', google translation) - - T: "ekte overmengde av" - - "⊄": # 0x2284 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "ikke en ekte delmengde av" - - "⊅": # 0x2285 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er"] # (en: 'is', google translation) - - T: "ikke en ekte overmengde av" - - "⊆": # 0x2286 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er en"] # (en: 'is a', google translation) - - T: "delmengde av" - - "⊇": # 0x2287 - - test: - if: "$Verbosity!='Terse'" - then: [T: "er en"] # (en: 'is a', google translation) - - T: "overmengde av" - - # --- restored short definitions that differ from unicode-full --- - - "â„Ș": [T: "kelvin"] # 0x212a (en: 'kelvin') - - "∂": [T: "partiell derivert"] # 0x2202 # audit-ignore - # SWEDISH: This is only refered to as "del" in Swedish, but we write "dell" for correct pronounciation. - - "√": [T: "kvadratroten av"] # 0x221a (en: 'square root of') # audit-ignore +--- + - "a-z": + - test: + if: "$TTS='none'" + then: [T: "."] # (en: '.', google translation) + else: [SPELL: "'.'"] + + # Capital letters are a little tricky: users can pick their favorite word (something that was requested) and + # screen readers have options to use pitch changes or beeps instead of or in addition to say "cap" + # Also, if a user can see the screen, they probably don't need to hear "cap", but if they specified an override, they must want to hear the override. + + - "A-Z": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "stor"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + # note: processing of ranges converts '.' into the character, so it needs to be in quotes below + replace: [SPELL: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"] + + - "0-9": [T: "."] # (en: '.', google: 'A') + + - " ": [T: " "] # 0x20 #NORWEGIAN: Added from English version. Not in Swedish version. + + - "!": # 0x21 + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" #NORWEGIAN: Changed from ":structure" to be equal to English translation + then_test: + if: "$Verbosity = 'Terse'" + then: [T: "utropstegn"] # 0x21 (en: 'bang', google translation) + else: [T: "utropstegn"] # 0x21 (en: 'exclamation point') + else: [T: "fakultet"] # 0x21 (en: 'factorial') + + - "\"": [T: "anfĂžrselstegn"] # 0x22 (en: 'quotation mark') + - "#": [T: "nummertegn"] # 0x23 (en: 'number', MathPlayer: 'numeriskt tecken', google: 'siffra') + - "$": [T: "dollar"] # 0x24 (en: 'dollars') + - "%": [T: "prosent"] # 0x25 (en: 'percent') + - "&": [T: "og-tegn"] # 0x26 (en: 'ampersand') + - "'": [T: "apostrof"] # 0x27 (en: 'apostrophe') + - "(": # 0x28 + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then_test: + if: "$Verbosity='Terse'" + then: [pause: short, T: "startparentes"] # 0x28 (en: 'open', google translation) + else: [pause: short, T: "startparentes"] # 0x28 (en: 'open paren') + else: [T: "venstreparentes"] # 0x28 (en: 'left paren') + - pause: short + - ")": # 0x29 + - pause: short + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then_test: + if: "$Verbosity='Terse'" + then: [T: "sluttparentes"] # 0x29 (en: 'close', google translation) + else: [T: "sluttparentes"] # 0x29 (en: 'close paren') + else: [T: "hĂžyreparentes"] # 0x29 (en: 'right paren') + + - "*": # 0x2a + test: + if: "parent::*[name(.)='msup' or name(.)='msubsup' or name(.)='skip-super']" + then: [T: "stjerne"] # 0x2a (en: 'star', google translation) + else: [T: "ganger"] # 0x2a (en: 'times') + - "+": [T: "pluss"] # 0x2b + - ",": # 0x2c + # the following deals with the interaction of "," with "
" which sometimes wants the ',' to be silent + # that this test is here and not with "
" is not ideal, but seems simplest + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or " + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak "comma" when not adjacent to '
' + - "( following-sibling::*[1][text()!= '
'] and preceding-sibling::*[1][text()!='
'] ) or " + # except if expression starts with '
' + - "../*[1][.='
'] " + then: + - T: "komma" # (en: 'comma', google translation) + - test: + if: "$Verbosity != Terse" + then: [pause: short] + # else silent + + - "-": [T: "minus"] # 0x2d + - ".": # 0x2e + - test: + if: "parent::*[1][self::m:mn]" + then: [T: "punktum"] # (en: 'point', google translation) + else: [T: "prikk"] # (en: 'dot') + - "/": # 0x2f (en: 'divided by') + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "skrĂ„strek"] # 0x2f + else: [T: "delt pĂ„"] # 0x2f + - ":": [T: "kolon"] # 0x3a (en: 'colon') + - ";": [T: "semikolon"] # 0x3b (en: 'semicolon') + - "<": # 0x3c + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "mindre enn" # (en: 'less than') + - "=": # 0x3d # audit-ignore + # SWEDISH: We remove "Ă€r" from all occurrences of = after consulting our mathematician advisor. + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] + - T: "lik" # (en: 'equals', MathPlayer: 'lik', google: 'lika') + + - ">": # 0x3e + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "stĂžrre enn" # (en: 'greater than') + - "?": [T: "spĂžrsmĂ„lstegn"] # 0x3f (en: 'question mark') + - "@": [T: "krĂžllalfa"] # 0x40 (en: 'at sign') + - "[": # 0x5b + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "start hakeparentes"] # (en: 'open bracket', google translation) + else: [T: "venstre hakeparentes"] # (en: 'left bracket') + - pause: short + - "\\": [T: "omvendt skrĂ„strek"] # 0x5c (en: 'back slash') + - "]": # 0x5d + - pause: short + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "slutt hakeparentes"] # (en: 'close bracket', google translation) + else: [T: "hĂžyre hakeparentes"] # (en: 'right bracket') + - "^": [T: "hatt"] # 0x5e (en: 'hat') # audit-ignore + - "_": [T: "understrek"] # 0x5f (en: 'under bar', MathPlayer: 'streck under', google: 'under bar') + - "`": [T: "grav aksent"] # 0x60 (en: 'grave') + - "{": # 0x7b + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "start krĂžllparentes"] # (en: 'open brace', google translation) + else: [T: "venstre krĂžllparentes"] # (en: 'left brace') + - pause: short + - "|": # 0x7c + # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' + - with: + variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) + replace: + - test: + - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "vertikal strek"] + - else_if: "$SpeechStyle != 'ClearSpeak'" + then_test: + - if: "$DefaultToGiven" + then: [pause: short, T: "gitt"] + - else_if: "preceding-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))] and + following-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))]" + then: [T: "deler"] + else: [T: "vertikal strek"] + - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" + then: [T: "vertikal strek"] + - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" + then: [T: "slik at"] + - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" + then: [pause: short, T: "gitt"] + - else: [T: "deler"] + + - "}": # 0x7d + - pause: short + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: "slutt krĂžllparentes"] # (en: 'close brace', google translation) + else: [T: "hĂžyre krĂžllparentes"] # (en: 'right brace') + + - "~": [T: "tilde"] # 0x7e + - " ": # 0xa0 + - test: + if: "@data-empty-in-2D and not(ancestor::*[self::m:piecewise or self::m:system-of-equations or self::m:lines])" #NORWEGIAN: Changed to English version. Now it doesn't speak "tom tom" for continued_row + then: [T: "tom"] # want to say something for fraction (etc) with empty child (en: 'empty', google translation) + else: [T: ""] + + - "ÂŹ": [T: "ikke"] # 0xac (en: 'not') + - "°": [T: "grader"] # 0xb0 (en: 'degrees') + - "±": [T: "pluss minus"] # 0xb1 (en: 'plus or minus') + - "ÂŽ": [T: "akutt aksent"] # 0xb4 (en: 'acute') + - "·": # 0xB7 + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')] or not($SpeechStyle = 'ClearSpeak' and $ClearSpeak_MultSymbolDot = 'Auto')" + then: [T: "midtstilt prikk"] # (en: 'times', google translation) + else: [T: "ganger"] # (en: 'dot', MathPlayer: 'mellanpunkt', google: 'punkt') + - "×": # 0xd7 + - test: + if: "$SpeechStyle = 'ClearSpeak'" + then_test: + - if: "$ClearSpeak_MultSymbolX = 'Auto'" + then: [T: "ganger"] + - else_if: "$ClearSpeak_MultSymbolX = 'By'" + then: [T: "ganger"] + else: [T: "kryss"] + else_test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "kryss"] + else: [T: "ganger"] + - "Ă·": [T: "delt pĂ„"] # 0xf7 (en: 'divided by') + - "̀": [T: "grav aksent"] # 0x300 (en: 'grave accent embellishment', google: 'allvarlig accentutsmyckning') + - "́": [T: "akutt aksent"] # 0x301 (en: 'acute accent embellishment', google: 'akut accentutsmyckning') + - "̂": [T: "cirkumfleks"] # 0x302 (en: 'circumflex accent embellishment', google: 'circumflex accent utsmyckning') + - "̃": [T: "tilde"] # 0x303 (google: 'tilde utsmyckning') + - "̄": [T: "makron"] # 0x304 (en: 'macron embellishment', google: 'macron -utsmyckning') + - "̅": [T: "strek"] # 0x305 (google: 'överbar utsmyckning') + - "̆": [T: "breve"] # 0x306 (en: 'breve', google: 'breve') + - "̇": [T: "prikk"] # 0x307 (google: 'prick ovanför utsmyckning') + + # Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong + - "Α-Ω": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [T: "stor"] # (en: 'cap', google translation) + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + # note: processing of ranges converts '.' into the character, so it needs to be in quotes below + replace: [SPELL: "translate('.', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')"] + + - "α": [T: "alfa"] # 0x3b1 (en: 'alpha') + - "ÎČ": [T: "beta"] # 0x3b2 + - "Îł": [T: "gamma"] # 0x3b3 + - "ÎŽ": [T: "delta"] # 0x3b4 + - "Δ": [T: "epsilon"] # 0x3b5 + - "ζ": [T: "zeta"] # 0x3b6 + - "η": [T: "eta"] # 0x3b7 + - "Ξ": [T: "theta"] # 0x3b8 + - "Îč": [T: "jota"] # 0x3b9 (en: 'iota', google: 'iota') + - "Îș": [T: "kappa"] # 0x3ba + - "λ": [T: "lambda"] # 0x3bb (en: 'lambda', google: 'lambda') + - "ÎŒ": [T: "my"] # 0x3bc (en: 'mu', google: 'mu') + - "Μ": [T: "ny"] # 0x3bd (en: 'nu', google: 'nu') + - "Ο": [T: "ksi"] # 0x3be (en: 'zai', google: 'zai') + - "Îż": [T: "omikron"] # 0x3bf (en: 'omicron', google: 'omicron') + - "π": [T: "pi"] # 0x3c0 + - "ρ": [T: "rho"] # 0x3c1 + - "ς": [T: "sluttsigma"] # 0x3c2 (en: 'final sigma', google: 'slutlig sigma') + - "σ": [T: "sigma"] # 0x3c3 + - "τ": [T: "tau"] # 0x3c4 + - "υ": [T: "ypsilon"] # 0x3c5 (en: 'upsilon', google: 'upsilon') + - "φ": [T: "fi"] # 0x3c6 (en: 'phi', google: 'phi') + - "χ": [T: "khi"] # 0x3c7 + - "ψ": [T: "psi"] # 0x3c8 + - "ω": [T: "omega"] # 0x3c9 + - "ϕ": [T: "fi"] # 0x3d5 (en: 'phi', google: 'phi') + - "ϖ": [T: "pi"] # 0x3d6 (en: 'pi', google: 'pi') + - "Ï”": [T: "epsilon"] # 0x3f5 + - "϶": [T: "omvendt epsilon"] # 0x3f6 (en: 'reversed epsilon') + + - "⁥": # 0x2061 # audit-ignore + - test: + if: "preceding-sibling::*[1][.='log' or .='ln' or .='lg' or .='exp'] or + not( + ( $Verbosity='Terse' or ($SpeechStyle = 'ClearSpeak' and IsNode(following-sibling::*[1],'simple')) and + preceding-sibling::*[1][IfThenElse($SpeechStyle='ClearSpeak', + IsInDefinition(., 'Speech', 'ClearSpeakTrigFunctionNames'), + IsInDefinition(., 'Speech', 'TrigFunctionNames') )] + ) or + preceding-sibling::*[1][IsInDefinition(., 'Speech', 'GeometryShapes')] or + (@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) + )" + then: [T: "av"] # (en: 'of', google translation) + + - "⁹": [T: ""] # 0x2062 + - "⁣": [T: ""] # 0x2063 + - "⁀": [T: "og"] # 0x2064 (en: 'and', google: 'og') + - "ℂℕℚℝ℀": # here we rely on this running through the table again to speak "cap xxx" + - T: "dobbeltstreket" # (en: 'double-struck') + - SPELL: "translate('.', 'ℂℕℚℝ℀', 'CNQRZ')" + + - "℃": [T: "grader celsius"] # 0x2103 (en: 'degrees celsius') + - "ℋℛℓ": # 0x210b + - T: "script font" # (en: 'script', google: 'manus') + - SPELL: "translate('.', 'ℋℛℓ', 'HRl')" + - "ℜ": # 0x211c + - T: "fraktur" # (en: 'fraktur', google: 'fraktur') + - SPELL: "'R'" + + - "ⅆⅇⅈⅉ": # 0x2146-9 + - T: "dobbeltstreket kursiv" # (en: 'double-struck italic') + - SPELL: "translate('.', 'ⅆⅇⅈⅉ', 'deij')" + + - "∄": # 0x2225 + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "dobbel vertikal linje"] + else: + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] + - T: "parallell med" + - "∊": # 0x2226 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "ikke parallell med" # (en: 'not parallel to') + - "≀": # 0x2264 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] + - T: "mindre enn eller lik" + + - "≄": # 0x2265 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] + - T: "stĂžrre enn eller lik" + + + # --- restored complex short definitions (prefer over unicode-full) --- + - "
": # 0x2026 + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak '
' as 'and so on...' unless expr starts with '
' + - "../*[1][.='
']" + then: [T: "prikk prikk prikk"] # (en: 'dot dot dot', google translation) + else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' + if: "count(following-sibling::*) = 0" + then: [T: "og sĂ„ videre"] # (en: 'and so on', google translation) + else: [T: "og sĂ„ videre opp til"] # (en: 'and so on up to') + - "→": # 0x2192 + - test: + if: "ancestor::*[2][self::m:limit]" + then: [T: "gĂ„r mot"] # (en: 'approaches', google translation) + else: [T: "hĂžyrepil"] # (en: 'right arrow') + - "∆": # 0x2206 + - test: + if: "following-sibling::*" + then: [T: "laplas av"] # (en: 'laplacian of') # Norwegian: "laplace" is not pronounced correctly + else: [T: "laplas"] + - "∈": # 0x2208 # audit-ignore + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: + - T: "i" #(en: "is an element of") + # NORWEGIAN: "i" sounds best in all cases for the non-ClearSpeak case + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + # SWEDISH/NORWEGIAN: The word "medlem" is not commonly used in set theory, so we removed that rule. If the parsing has set the parameter to "Member" it will fall under the "else" case. + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "i"] # (en: 'in', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "element i"] # (en: 'element of', google translation) + - else: [T: "tilhĂžrende"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "i"] # NORWEGIAN: Set the "auto" case to be "i" + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "er et element i"] # (en: 'is in', google translation) + - else: [T: "tilhĂžrer"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') + - "∉": # 0x2209 # audit-ignore + # rule is identical to 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: + - test: + if: "not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" + then: [T: "er"] + - T: "ikke et element i" + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + # SWEDISH/NORWEGIAN: The word "medlem" is not commonly used in set theory, so we removed that rule. If the parsing has set the parameter to "Member" it will fall under the "else" case. + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "ikke i"] # (en: 'not in', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "ikke element i"] # (en: 'not element of', google translation) + - else: [T: "ikke tilhĂžrende"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'not belonging to') + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "er ikke et element i"] # (en: 'is not an element of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "er ikke i"] # (en: 'is not in', google translation) + - else: [T: "tilhĂžrer ikke"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'does not belong to') + - "∊": # 0x220a # audit-ignore + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: + - T: "i" #(en: "is an element of") + # NORWEGIAN: "i" sounds best in all cases for the non-ClearSpeak case + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + # SWEDISH/NORWEGIAN: The word "medlem" is not commonly used in set theory, so we removed that rule. If the parsing has set the parameter to "Member" it will fall under the "else" case. + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "i"] # (en: 'in', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "element i"] # (en: 'element of', google translation) + - else: [T: "tilhĂžrende"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: "i"] # (en: 'is an element of', google translation) #NORWEGIAN: Set the "auto" case to be "i" + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "er et element i"] # (en: 'is in', google translation) + - else: [T: "tilhĂžrer"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') + - "∝": # 0x221d + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "proporsjonal med" # (en: 'proportional to') + - "∌": # 0x223c (en: 'varies with') # audit-ignore + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] + - T: "proporsjonal med" + - "≠": # 0x2260 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] + - T: "ikke lik" # (en: 'not equal to') + - "≡": # 0x2261 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] + - T: "identisk med" # (en: 'identical to') + - "≩": # 0x2266 (en: 'less than over equal to') # audit-ignore + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] + - T: "mindre enn eller lik" + - "≧": # 0x2267 (en: 'greater than over equal to') # audit-ignore + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] + - T: "stĂžrre enn eller lik" + - "⊂": # 0x2282 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er en"] # (en: 'is a', google translation) + - T: "ekte delmengde av" + - "⊃": # 0x2283 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er en"] # (en: 'is a', google translation) + - T: "ekte overmengde av" + - "⊄": # 0x2284 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "ikke en ekte delmengde av" + - "⊅": # 0x2285 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er"] # (en: 'is', google translation) + - T: "ikke en ekte overmengde av" + - "⊆": # 0x2286 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er en"] # (en: 'is a', google translation) + - T: "delmengde av" + - "⊇": # 0x2287 + - test: + if: "$Verbosity!='Terse'" + then: [T: "er en"] # (en: 'is a', google translation) + - T: "overmengde av" + + # --- restored short definitions that differ from unicode-full --- + - "â„Ș": [T: "kelvin"] # 0x212a (en: 'kelvin') + - "∂": [T: "partiell derivert"] # 0x2202 # audit-ignore + # SWEDISH: This is only refered to as "del" in Swedish, but we write "dell" for correct pronounciation. + - "√": [T: "kvadratroten av"] # 0x221a (en: 'square root of') # audit-ignore diff --git a/Rules/Languages/ru/unicode.yaml b/Rules/Languages/ru/unicode.yaml index 66401b086..a1a38bcce 100644 --- a/Rules/Languages/ru/unicode.yaml +++ b/Rules/Languages/ru/unicode.yaml @@ -1,548 +1,548 @@ ---- - # Note to translators: - # most languages don't have two ways to pronounce 'a' -- if not need, remove the rules and change "B-Z" to "A-Z" - # some languages say the word for "uppercase" after the letter. Make sure to change that where appropriate by moving some code around - - "a": [t: "а"] - - "b": [t: "Đ±Ń"] - - "c": [t: "цэ"] - - "d": [t: "Юэ"] - - "e": [t: "Đ”"] - - "f": [t: "эф"] - - "g": [t: "ЎжО"] - - "h": [t: "аш"] - - "i": [t: "Đž"] - - "j": [t: "ЎжДĐč"] - - "k": [t: "Đșа"] - - "l": [t: "ŃĐ»ŃŒ"] - - "m": [t: "ŃĐŒ"] - - "n": [t: "ŃĐœ"] - - "o": [t: "ĐŸ"] - - "p": [t: "пэ"] - - "q": [t: "Đșу"] - - "r": [t: "эр"] - - "s": [t: "эс"] - - "t": [t: "тэ"] - - "u": [t: "у"] - - "v": [t: "ĐČэ"] - - "w": [t: "Ўабл-ю"] - - "x": [t: "ĐžĐșс"] - - "y": [t: "ОгрДĐș"] - - "z": [t: "Đ·ŃŃ‚"] - - # Capital letters are a little tricky: users can pick their favorite word (something that was requested) and - # screen readers have options to use pitch changes or beeps instead of or in addition to say "cap" - # Also, if a user can see the screen, they probably don't need to hear "cap", but if they specified an override, they must want to hear the override. - - - - "A-Z": - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [t: "заглаĐČĐœĐ°Ń"] # (en: 'cap') - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - # note: processing of ranges converts '.' into the character, so it needs to be in quotes below - replace: [x: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"] - - - "0-9": [t: "."] # (en: '.', google translation) - - - " ": [t: " "] # 0x20 (google translation) - - - "!": # 0x21 - - test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then_test: - if: "$Verbosity = 'Terse'" - then: [t: "ĐČĐŸŃĐșĐ»ĐžŃ†Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹Đč Đ·ĐœĐ°Đș"] # 0x21 (en: 'bang', google translation) - else: [t: "ĐČĐŸŃĐșĐ»ĐžŃ†Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹Đč Đ·ĐœĐ°Đș"] # 0x21 (en: 'exclamation point', google translation) - else: [t: "фаĐșŃ‚ĐŸŃ€ĐžĐ°Đ»"] # 0x21 (en: 'factorial', google translation) - - - "\"": [t: "ĐșаĐČычĐșа"] # 0x22 (en: 'quotation mark', google translation) - - "#": [t: "ĐœĐŸĐŒĐ”Ń€"] # 0x23 (en: 'number', google translation) - - "$": [t: "ĐŽĐŸĐ»Đ»Đ°Ń€"] # 0x24 (en: 'dollars', google translation) - - "%": [t: "ĐżŃ€ĐŸŃ†Đ”ĐœŃ‚"] # 0x25 (en: 'percent') - - "&": [t: "Đ°ĐŒĐżĐ”Ń€ŃĐ°ĐœĐŽ"] # 0x26 (google translation) - - "'": [t: "штрох"] # 0x27 (en: 'apostrophe') - - "(": # 0x28 - - test: - - if: "$SpeechStyle='LiteralSpeak' or ancestor-or-self::*[contains(@data-intent-property, ':literal:')] or @data-changed='added' or ancestor::*[@data-changed='added'] or preceding-sibling::*[1][.='P'] or following-sibling::*[.='|' or .='∩' or contains(., 'and')]" - then: [t: "ĐŸŃ‚ĐșрыĐČающая ĐșŃ€ŃƒĐłĐ»Đ°Ń сĐșĐŸĐ±Đșа"] - else_test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then_test: - if: "$Verbosity='Terse'" - then: [t: "сĐșĐŸĐ±Đșа ĐŸŃ‚ĐșрыĐČĐ°Đ”Ń‚ŃŃ"] # 0x28 (en: 'open', google translation) - else: [t: "ĐŸŃ‚ĐșрыĐČающая ĐșŃ€ŃƒĐłĐ»Đ°Ń сĐșĐŸĐ±Đșа"] # 0x28 (en: 'open paren', google translation) - else: [t: "лДĐČая ĐșŃ€ŃƒĐłĐ»Đ°Ń сĐșĐŸĐ±Đșа"] # 0x28 (en: 'left paren', google translation) - - ")": # 0x29 - - test: - - if: "$SpeechStyle='LiteralSpeak' or ancestor-or-self::*[contains(@data-intent-property, ':literal:')] or @data-changed='added' or ancestor::*[@data-changed='added'] or preceding-sibling::*[.='P' or .='|' or .='∩' or contains(., 'and')]" - then: [t: "заĐșрыĐČающая ĐșŃ€ŃƒĐłĐ»Đ°Ń сĐșĐŸĐ±Đșа"] - else_test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then_test: - if: "$Verbosity='Terse'" - then: [t: "сĐșĐŸĐ±Đșа заĐșрыĐČĐ°Đ”Ń‚ŃŃ"] # 0x29 (en: 'close', google translation) - else: [t: "заĐșрыĐČающая ĐșŃ€ŃƒĐłĐ»Đ°Ń сĐșĐŸĐ±Đșа"] # 0x29 (en: 'close paren', google translation) - else: [t: "праĐČая ĐșŃ€ŃƒĐłĐ»Đ°Ń сĐșĐŸĐ±Đșа"] # 0x29 (en: 'right paren', google translation) - - - "*": # 0x2a - test: - if: "parent::*[name(.)='msup' or name(.)='msubsup' or name(.)='skip-super']" - then: [t: "Đ·ĐČŃ‘Đ·ĐŽĐŸŃ‡Đșа"] # 0x2a (en: 'star', google translation) - else: [t: "ŃƒĐŒĐœĐŸĐ¶ĐžŃ‚ŃŒ"] # 0x2a (en: 'times', google translation) - - "+": # 0x2b - - test: - if: "preceding-sibling::*[1][name(.)='mover' or name(.)='modified-variable'] and - following-sibling::*[1][name(.)='mover' or name(.)='modified-variable'] and - not(following-sibling::*[1][name(.)='mover' and *[2][.='→']])" - then: [pause: medium] - - t: "плюс" # (en: 'plus') - - test: - if: "$ClearSpeak_Functions='None' and following-sibling::*[1][self::m:mi] and not(ancestor::*[IsBracketed(., '(', ')')])" - then: [pause: short] - - ",": # 0x2c - # the following deals with the interaction of "," with "
" which sometimes wants the ',' to be silent - # that this test is here and not with "
" is not ideal, but seems simplest - test: - if: - - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or " - # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' - # speak "comma" when not adjacent to '
' - - "( following-sibling::*[1][text()!= '
'] and preceding-sibling::*[1][text()!='
'] ) or " - # except if expression starts with '
' - - "../*[1][.='
'] " - then: - - test: - - if: "preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]" - then: [pause: short] - else: - - T: "Đ·Đ°ĐżŃŃ‚Đ°Ń" # (en: 'comma', google translation) - - test: - if: "$Verbosity != Terse" - then: [pause: short] - # else silent - - - "-": [t: "ĐŒĐžĐœŃƒŃ"] # 0x2d (en: 'minus') - - ".": # 0x2e - - test: - if: "parent::*[1][self::m:mn]" - then: [t: "Ń‚ĐŸŃ‡Đșа"] # (en: 'point', google translation) - else: [t: "Ń‚ĐŸŃ‡Đșа"] # (en: 'dot', google translation) - - "/": [t: "Ń€Đ°Đ·ĐŽĐ”Đ»ĐžŃ‚ŃŒ ĐœĐ°"] # 0x2f (en: 'divided by') - - ":": [t: "ĐŽĐČĐŸĐ”Ń‚ĐŸŃ‡ĐžĐ”"] # 0x3a (en: 'colon') - - ";": [t: "Ń‚ĐŸŃ‡Đșа с Đ·Đ°ĐżŃŃ‚ĐŸĐč"] # 0x3b (en: 'semicolon', google translation) - - "<": # 0x3c - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'is', google translation) - - t: "ĐŒĐ”ĐœŃŒŃˆĐ”" # (en: 'less than') - - "=": # 0x3d - - test: - if: "$Verbosity!='Terse'" - then: [t: "раĐČĐœĐŸ"] # (en: 'is equal to', google translation) - else: [t: "раĐČĐœĐŸ"] # (en: 'equals') - - test: - - if: "(following-sibling::*[1][.='c'] and following-sibling::*[2][.='\u2062']) or - (following-sibling::*[1][.='P'] and following-sibling::*[2][IsBracketed(., '(', ')')] and following-sibling::*[3][.='='])" - then: [pause: medium] - - else_if: "following-sibling::*[1][.='P'] and following-sibling::*[2][IsBracketed(., '(', ')')]" - then: [pause: short] - - - ">": # 0x3e - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'is', google translation) - - t: "Đ±ĐŸĐ»ŃŒŃˆĐ”" # (en: 'greater than') - - "?": [t: "ĐČĐŸĐżŃ€ĐŸŃĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Đč Đ·ĐœĐ°Đș"] # 0x3f (en: 'question mark', google translation) - - "@": [t: "ŃĐŸĐ±Đ°Đșа"] # 0x40 (en: 'at sign', google translation) - - "[": # 0x5b - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [t: "ĐŸŃ‚ĐșрыĐČающая ĐșĐČĐ°ĐŽŃ€Đ°Ń‚ĐœĐ°Ń сĐșĐŸĐ±Đșа"] # (en: 'open bracket', google translation) - else: [t: "лДĐČая ĐșĐČĐ°ĐŽŃ€Đ°Ń‚ĐœĐ°Ń сĐșĐŸĐ±Đșа"] # (en: 'left bracket', google translation) - - "\\": [t: "ĐŸĐ±Ń€Đ°Ń‚ĐœĐ°Ń ĐșĐŸŃĐ°Ń чДрта"] # 0x5c (en: 'back slash', google translation) - - "]": # 0x5d - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [t: "заĐșрыĐČающая ĐșĐČĐ°ĐŽŃ€Đ°Ń‚ĐœĐ°Ń сĐșĐŸĐ±Đșа"] # (en: 'close bracket', google translation) - else: [t: "праĐČая ĐșĐČĐ°ĐŽŃ€Đ°Ń‚ĐœĐ°Ń сĐșĐŸĐ±Đșа"] # (en: 'right bracket', google translation) - - "^": # 0x5e - - test: - if: "parent::m:modified-variable or parent::m:mover" - then: [t: "цорĐșŃƒĐŒŃ„Đ»Đ”Đșс"] # (en: 'hat', google translation) - else: [t: "ĐșрышĐșа"] # (en: 'caret', google translation) - - "_": [t: "ĐżĐŸĐŽŃ‡Ń‘Ń€ĐșĐžĐČĐ°ĐœĐžĐ”"] # 0x5f (en: 'under bar', google translation) - - "`": [t: "граĐČОс"] # 0x60 (en: 'grave', google translation) - - "{": # 0x7b - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [t: "ĐŸŃ‚ĐșрыĐČающая Ń„ĐžĐłŃƒŃ€ĐœĐ°Ń сĐșĐŸĐ±Đșа"] # (en: 'open brace', google translation) - else: [t: "лДĐČая Ń„ĐžĐłŃƒŃ€ĐœĐ°Ń сĐșĐŸĐ±Đșа"] # (en: 'left brace', google translation) - - "|": # 0x7c - # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' - - with: - variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) - replace: - - test: - - if: "$SpeechStyle != 'ClearSpeak'" - then_test: - if: "$DefaultToGiven" - then: [t: "про ŃƒŃĐ»ĐŸĐČОО"] # (en: 'given', google translation) - else: [t: "ĐČДртОĐșĐ°Đ»ŃŒĐœĐ°Ń чДрта"] # (en: 'vertical line') - - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" - then: [t: "ĐČДртОĐșĐ°Đ»ŃŒĐœĐ°Ń чДрта"] # (en: 'vertical line', google translation) - - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" - then: [t: "таĐșĐŸĐč, Ń‡Ń‚ĐŸ"] # (en: 'such that', google translation) - - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" - then: [t: "про ŃƒŃĐ»ĐŸĐČОО"] # (en: 'given', google translation) - - else: [t: "ЎДлОт"] # (en: 'divides') - - - "}": # 0x7d - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [t: "заĐșрыĐČающая Ń„ĐžĐłŃƒŃ€ĐœĐ°Ń сĐșĐŸĐ±Đșа"] # (en: 'close brace', google translation) - else: [t: "праĐČая Ń„ĐžĐłŃƒŃ€ĐœĐ°Ń сĐșĐŸĐ±Đșа"] # (en: 'right brace', google translation) - - - "~": [t: "Ń‚ĐžĐ»ŃŒĐŽĐ°"] # 0x7e (en: 'tilde', google translation) - - " ": # 0xa0 - - test: - # could be mtext in mtd or mtext in an mrow that is a concatenation of mtd's. Is there a better solution? - if: "@data-empty-in-2D and not(ancestor::*[self::m:piecewise or self::m:system-of-equations or self::m:lines])" - then: [t: "ĐżŃƒŃŃ‚ĐŸĐč"] # want to say something for fraction (etc) with empty child (en: 'empty', google translation) - else: [t: ""] - - - "ÂŹ": [t: "ĐœĐ”"] # 0xac (en: 'not', google translation) - - "°": [t: "граЮусы"] # 0xb0 (en: 'degrees', google translation) - - "±": [t: "плюс ĐŒĐžĐœŃƒŃ"] # 0xb1 (en: 'plus or minus') - - "ÂŽ": [t: "аĐșут"] # 0xb4 (en: 'acute', google translation) - - "·": # 0xB7 - - test: - if: "$SpeechStyle = 'LiteralSpeak' or not($SpeechStyle = 'ClearSpeak' and $ClearSpeak_MultSymbolDot = 'Auto')" - then: [t: "Ń‚ĐŸŃ‡Đșа"] # (en: 'dot', google translation) - else: [t: "ŃƒĐŒĐœĐŸĐ¶ĐžŃ‚ŃŒ"] # (en: 'times') - - "×": # 0xd7 - - test: - if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolX = 'Auto'" - then: [t: "ŃƒĐŒĐœĐŸĐ¶ĐžŃ‚ŃŒ ĐœĐ°"] # (en: 'times', google translation) - else_test: - if: $ClearSpeak_MultSymbolX = 'By' - then: [t: "ŃƒĐŒĐœĐŸĐ¶ĐžŃ‚ŃŒ ĐœĐ°"] # (en: 'by') - else: [t: "ĐČĐ”ĐșŃ‚ĐŸŃ€ĐœĐŸĐ” ĐżŃ€ĐŸĐžĐ·ĐČĐ”ĐŽĐ”ĐœĐžĐ”"] # (en: 'cross') - - "Ă·": [t: "Ń€Đ°Đ·ĐŽĐ”Đ»ĐžŃ‚ŃŒ ĐœĐ°"] # 0xf7 (en: 'divided by') - - "̀": [t: "Đ·ĐœĐ°Đș граĐČОса"] # 0x300 (en: 'grave accent embellishment', google translation) - - "́": [t: "аĐșут"] # 0x301 (en: 'acute accent embellishment', google translation) - - "̂": [t: "цорĐșŃƒĐŒŃ„Đ»Đ”Đșс"] # 0x302 (en: 'circumflex accent embellishment', google translation) - - "̃": [t: "Ń‚ĐžĐ»ŃŒĐŽĐ°"] # 0x303 (en: 'tilde embellishment', google translation) - - "̄": [t: "ĐŒĐ°ĐșŃ€ĐŸĐœ"] # 0x304 (en: 'macron embellishment', google translation) - - "̅": [t: "ĐœĐ°ĐŽŃ‡Ń‘Ń€ĐșĐžĐČĐ°ĐœĐžĐ”"] # 0x305 (en: 'overbar embellishment', google translation) - - "̆": [t: "Đ±Ń€ŃĐČэ"] # 0x306 (en: 'breve', google translation) - - "̇": [t: "Ń‚ĐŸŃ‡Đșа сĐČĐ”Ń€Ń…Ńƒ"] # 0x307 (en: 'dot above embellishment', google translation) - - # Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong - - "Α-Ω": - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [t: "заглаĐČĐœĐ°Ń"] # (en: 'cap') - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - # note: processing of ranges converts '.' into the character, so it needs to be in quotes below - replace: [x: "translate('.', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')"] - - - "α": [t: "Đ°Đ»ŃŒŃ„Đ°"] # 0x3b1 (en: 'alpha') - - "ÎČ": [t: "бДта"] # 0x3b2 (en: 'beta') - - "Îł": [t: "ĐłĐ°ĐŒĐŒĐ°"] # 0x3b3 (en: 'gamma') - - "ÎŽ": [t: "ĐŽĐ”Đ»ŃŒŃ‚Đ°"] # 0x3b4 (en: 'delta') - - "Δ": [t: "ŃĐżŃĐžĐ»ĐŸĐœ"] # 0x3b5 (en: 'epsilon') - - "ζ": [t: "ЎзДта"] # 0x3b6 (en: 'zeta') - - "η": [t: "эта"] # 0x3b7 (en: 'eta') - - "Ξ": [t: "тДта"] # 0x3b8 (en: 'theta') - - "Îč": [t: "ĐčĐŸŃ‚Đ°"] # 0x3b9 (en: 'iota') - - "Îș": [t: "Đșаппа"] # 0x3ba (en: 'kappa') - - "λ": [t: "Đ»ŃĐŒĐ±ĐŽĐ°"] # 0x3bb (en: 'lambda') - - "ÎŒ": [t: "ĐŒŃŽ"] # 0x3bc (en: 'mu') - - "Μ": [t: "ĐœŃŽ"] # 0x3bd (en: 'nu') - - "Ο": [t: "ĐșсО"] # 0x3be (en: 'zai') - - "Îż": [t: "ĐŸĐŒĐžĐșŃ€ĐŸĐœ"] # 0x3bf (en: 'omicron') - - "π": [t: "пО"] # 0x3c0 (en: 'pi') - - "ρ": [t: "Ń€ĐŸ"] # 0x3c1 (en: 'rho') - - "ς": [t: "Ń„ĐžĐœĐ°Đ»ŃŒĐœĐ°Ń ŃĐžĐłĐŒĐ°"] # 0x3c2 (en: 'final sigma') - - "σ": [t: "ŃĐžĐłĐŒĐ°"] # 0x3c3 (en: 'sigma') - - "τ": [t: "тау"] # 0x3c4 (en: 'tau') - - "υ": [t: "ĐžĐżŃĐžĐ»ĐŸĐœ"] # 0x3c5 (en: 'upsilon') - - "φ": [t: "фо"] # 0x3c6 (en: 'phi') - - "χ": [t: "хо"] # 0x3c7 (en: 'chi') - - "ψ": [t: "псО"] # 0x3c8 (en: 'psi') - - "ω": [t: "ĐŸĐŒĐ”ĐłĐ°"] # 0x3c9 (en: 'omega') - - "ϕ": [t: "фо"] # 0x3d5 (en: 'phi') - - "ϖ": [t: "пО"] # 0x3d6 (en: 'pi') - - "Ï”": [t: "ŃĐżŃĐžĐ»ĐŸĐœ"] # 0x3f5 (en: 'epsilon') - - "϶": [t: "ĐŸĐ±Ń€Đ°Ń‚ĐœŃ‹Đč ŃĐżŃĐžĐ»ĐŸĐœ"] # 0x3f6 (en: 'reversed epsilon') - - - "⁥": # 0x2061 - - test: - # skip saying "of" after trig functions, geometry shapes, or in :literal mode - if: "not(preceding-sibling::*[1][IsInDefinition(., 'TrigFunctionNames') or self::m:inverse-function or (self::m:power and IsInDefinition(*[1], 'TrigFunctionNames'))]) and not(preceding-sibling::*[1][IsInDefinition(., 'GeometryShapes')]) and - not(@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')])" - then: [t: "ĐŸŃ‚"] # (en: 'of', google translation) - - "⁹": # 0x2062 - - test: - if: "@data-function-guess and following-sibling::*[1][self::m:mrow and IsBracketed(., '(', ')')] and $ClearSpeak_Functions!='None'" - then: [pause: short] - - "⁣": [t: ""] # 0x2063 - - "⁀": [t: "Đž"] # 0x2064 (en: 'and', google translation) - - "ℂℕℚℝ℀": # here we rely on this running through the table again to speak "cap xxx" - - t: "ĐŽĐČĐŸĐčĐœĐŸĐ”" # (en: 'double-struck') - - spell: "translate('.', 'ℂℕℚℝ℀', 'CNQRZ')" - - - "℃": [t: "граЮусы Ń†Đ”Đ»ŃŒŃĐžŃ"] # 0x2103 (en: 'degrees celsius', google translation) - - "ℋℛℓ": # 0x210b - - t: "руĐșĐŸĐżĐžŃĐœĐŸĐ”" # (en: 'script', google translation) - - spell: "translate('.', 'ℋℛℓ', 'HRl')" - - "ℜ": # 0x211c - - t: "ĐłĐŸŃ‚ĐžŃ‡Đ”ŃĐșая" # (en: 'fraktur', google translation) - - spell: "'R'" - - - "ⅆⅇⅈⅉ": # 0x2146-9 - - t: "ĐŽĐČĐŸĐčĐœĐŸĐč ĐșурсоĐČ" # (en: 'double-struck italic', google translation) - - spell: "translate('.', 'ⅆⅇⅈⅉ', 'deij')" - - - "←": [t: "стрДлĐșа ĐČлДĐČĐŸ"] # 0x2190 (en: 'leftwards arrow', google translation) - - "↑": [t: "стрДлĐșа ĐČĐČДрх"] # 0x2191 (en: 'upwards arrow', google translation) - - "→": # 0x2192 - - test: - if: "(parent::m:mover or parent::m:modified-variable) and ($SpeechStyle='LiteralSpeak' or ancestor-or-self::*[contains(@data-intent-property, ':literal:')])" - then: [t: "ŃĐŸ стрДлĐșĐŸĐč"] - else_test: - if: "ancestor::*[2][self::m:limit]" - then: [t: "ŃŃ‚Ń€Đ”ĐŒŃŃ‰Đ”ĐŒŃŃ Đș"] # (en: 'approaches', google translation) - else: [t: "стрДлĐșа ĐČпраĐČĐŸ"] # (en: 'right arrow', google translation) - - - "↓": [t: "стрДлĐșа ĐČĐœĐžĐ·"] # 0x2193 (en: 'downwards arrow', google translation) - - "∈": # 0x2208 - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: - - test: - if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" - then: [t: ""] # (en: 'is', google translation) - - t: "ĐżŃ€ĐžĐœĐ°ĐŽĐ»Đ”Đ¶ĐžŃ‚" # (en: 'an element of') - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "ĐČ"] # (en: 'in', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "Ń‡Đ»Đ”Đœ"] # (en: 'member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "ŃĐ»Đ”ĐŒĐ”ĐœŃ‚"] # (en: 'element of', google translation) - - else: [t: "ĐżŃ€ĐžĐœĐ°ĐŽĐ»Đ”Đ¶ĐžŃ‚"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "Ń‡Đ»Đ”Đœ"] # (en: 'is a member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "ŃĐ»Đ”ĐŒĐ”ĐœŃ‚"] # (en: 'is an element of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "ĐœĐ°Ń…ĐŸĐŽĐžŃ‚ŃŃ ĐČ"] # (en: 'is in', google translation) - - else: [t: "ĐżŃ€ĐžĐœĐ°ĐŽĐ»Đ”Đ¶ĐžŃ‚"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') - - "∄": # 0x2225 - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'is', google translation) - - t: "ĐżĐ°Ń€Đ°Đ»Đ»Đ”Đ»ŃŒĐœĐŸ" # (en: 'parallel to') - - "∊": # 0x2226 - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'is', google translation) - - t: "ĐœĐ” ĐżĐ°Ń€Đ°Đ»Đ»Đ”Đ»ŃŒĐœĐŸ" # (en: 'not parallel to') - - "≀": # 0x2264 - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'is', google translation) - - t: "ĐŒĐ”ĐœŃŒŃˆĐ” ОлО раĐČĐœĐŸ" - - "≄": # 0x2265 - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'is', google translation) - - t: "Đ±ĐŸĐ»ŃŒŃˆĐ” ОлО раĐČĐœĐŸ" # (en: 'greater than or equal to') - - # --- restored complex short definitions (prefer over unicode-full) --- - - "
": # 0x2026 - test: - if: - - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" - # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' - # speak '
' as 'and so on...' unless expr starts with '
' - - "../*[1][.='
']" - then: [t: "ĐŒĐœĐŸĐłĐŸŃ‚ĐŸŃ‡ĐžĐ”"] # (en: 'dot dot dot') - else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' - if: "count(following-sibling::*) = 0" - then: [t: "Đž таĐș ЎалДД"] # (en: 'and so on', google translation) - else: [t: "Đž таĐș ЎалДД ĐŽĐŸ"] # (en: 'and so on up to', google translation) - - "∂": # 0x2202 - - test: - if: "$Verbosity='Terse'" - then: [t: "Ń‡Đ°ŃŃ‚ĐœĐ°Ń ĐżŃ€ĐŸĐžĐ·ĐČĐŸĐŽĐœĐ°Ń"] # (en: 'partial', google translation) - else: [t: "Ń‡Đ°ŃŃ‚ĐœĐ°Ń ĐżŃ€ĐŸĐžĐ·ĐČĐŸĐŽĐœĐ°Ń"] # (en: 'partial derivative') - - "∆": # 0x2206 - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'the', google translation) - - t: "ĐžĐœĐșŃ€Đ”ĐŒĐ”ĐœŃ‚" # (en: 'laplacian of') - - "∉": # 0x2209 - # rule is identical to 0x2208 - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'is', google translation) - - t: "ĐœĐ” ĐżŃ€ĐžĐœĐ°ĐŽĐ»Đ”Đ¶ĐžŃ‚" # (en: 'not an element of') - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "ĐœĐ” ĐČ"] # (en: 'not in', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "ĐœĐ” Ń‡Đ»Đ”Đœ"] # (en: 'not member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "ĐœĐ” ŃĐ»Đ”ĐŒĐ”ĐœŃ‚"] # (en: 'not element of', google translation) - - else: [t: "ĐœĐ” ĐżŃ€ĐžĐœĐ°ĐŽĐ»Đ”Đ¶ĐžŃ‚"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'not belonging to') - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "ĐœĐ” Ń‡Đ»Đ”Đœ"] # (en: 'is not a member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "ĐœĐ” ŃĐ»Đ”ĐŒĐ”ĐœŃ‚"] # (en: 'is not an element of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "ĐœĐ” ĐČ"] # (en: 'is not in', google translation) - - else: [t: "ĐœĐ” ĐżŃ€ĐžĐœĐ°ĐŽĐ»Đ”Đ¶ĐžŃ‚"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'does not belong to') - - "∊": # 0x220a - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: - - test: - if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" - then: [t: ""] # (en: 'is', google translation) - - t: "ĐŒĐ°Đ»ĐŸĐ” ĐżŃ€ĐžĐœĐ°ĐŽĐ»Đ”Đ¶ĐžŃ‚" # (en: 'an element of') - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "ĐČ"] # (en: 'in', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "Ń‡Đ»Đ”Đœ"] # (en: 'member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "ŃĐ»Đ”ĐŒĐ”ĐœŃ‚"] # (en: 'element of', google translation) - - else: [t: "ĐŒĐ°Đ»ĐŸĐ” ĐżŃ€ĐžĐœĐ°ĐŽĐ»Đ”Đ¶ĐžŃ‚"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "Ń‡Đ»Đ”Đœ"] # (en: 'is a member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "ŃĐ»Đ”ĐŒĐ”ĐœŃ‚"] # (en: 'is an element of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "ĐœĐ°Ń…ĐŸĐŽĐžŃ‚ŃŃ ĐČ"] # (en: 'is in', google translation) - - else: [t: "ĐŒĐ°Đ»ĐŸĐ” ĐżŃ€ĐžĐœĐ°ĐŽĐ»Đ”Đ¶ĐžŃ‚"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') - - "√": # 0x221a - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'the', google translation) - - t: "ĐșĐČĐ°ĐŽŃ€Đ°Ń‚ĐœŃ‹Đč ĐșĐŸŃ€Đ”ĐœŃŒ" # (en: 'square root of') - - "∝": # 0x221d - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'is', google translation) - - t: "ĐżŃ€ĐŸĐżĐŸŃ€Ń†ĐžĐŸĐœĐ°Đ»ŃŒĐœĐŸ" # (en: 'proportional to') - - "∶": # 0x2236 - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'is', google translation) - - t: "ĐŸŃ‚ĐœĐŸŃˆĐ”ĐœĐžĐ”" # (en: 'to') - - "∟": # 0x223e - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'is', google translation) - - t: "ĐžĐ·ĐŸĐłĐœŃƒŃ‚Đ°Ń эс" # (en: 'most positive') - - "≠": # 0x2260 - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'is', google translation) - - t: "ĐœĐ” раĐČĐœĐŸ" # (en: 'not equal to') - - "≡": # 0x2261 - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'is', google translation) - - t: "Ń‚ĐŸĐ¶ĐŽĐ”ŃŃ‚ĐČĐ”ĐœĐœĐŸ раĐČĐœĐŸ" # (en: 'identical to') - - "⊂": # 0x2282 - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'is a', google translation) - - t: "ĐżĐŸĐŽĐŒĐœĐŸĐ¶Đ”ŃŃ‚ĐČĐŸ" # (en: 'subset of') - - "⊃": # 0x2283 - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'is a', google translation) - - t: "ĐœĐ°ĐŽĐŒĐœĐŸĐ¶Đ”ŃŃ‚ĐČĐŸ" # (en: 'superset of') - - "⊄": # 0x2284 - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'is', google translation) - - t: "ĐœĐ” ĐżĐŸĐŽĐŒĐœĐŸĐ¶Đ”ŃŃ‚ĐČĐŸ" # (en: 'not a subset of') - - "⊅": # 0x2285 - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'is', google translation) - - t: "ĐœĐ” ĐœĐ°ĐŽĐŒĐœĐŸĐ¶Đ”ŃŃ‚ĐČĐŸ" # (en: 'not a superset of') - - "⊆": # 0x2286 - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'is a', google translation) - - t: "ĐżĐŸĐŽĐŒĐœĐŸĐ¶Đ”ŃŃ‚ĐČĐŸ ОлО раĐČĐœĐŸ" # (en: 'subset of or equal to') - - "⊇": # 0x2287 - - test: - if: "$Verbosity!='Terse'" - then: [t: ""] # (en: 'is a', google translation) - - t: "ĐœĐ°ĐŽĐŒĐœĐŸĐ¶Đ”ŃŃ‚ĐČĐŸ ОлО раĐČĐœĐŸ" # (en: 'superset of or equal to') - - # --- restored short definitions that differ from unicode-full --- - - "‖": [t: "ĐŽĐČĐŸĐčĐœĐ°Ń ĐČДртОĐșĐ°Đ»ŃŒĐœĐ°Ń чДрта"] # 0x2016 (en: 'double vertical line', google translation) - - "℉": [t: "граЮусы Ń„Đ°Ń€Đ”ĐœĐłĐ”Đčта"] # 0x2109 (en: 'degrees fahrenheit', google translation) - - "℩": [t: "ĐŸĐŒ"] # 0x2126 (en: 'ohms', google translation) - - "Å": [t: "Đ°ĐœĐłŃŃ‚Ń€Đ”ĐŒ"] # 0x212b (en: 'angstroms', google translation) - - "⇒": [t: "ĐŽĐČĐŸĐčĐœĐ°Ń стрДлĐșа ĐČпраĐČĐŸ"] # 0x21d2 (en: 'rightwards double arrow', google translation) - - "∐": [t: "ŃĐœ-Đ°Ń€ĐœŃ‹Đč ŃĐŸĐŒĐœĐŸĐ¶ĐžŃ‚Đ”Đ»ŃŒ"] # 0x2210 (en: 'co-product') - - "∓": [t: "ĐŒĐžĐœŃƒŃ плюс"] # 0x2213 (en: 'minus or plus') - - "∗": [t: "Đ·ĐČŃ‘Đ·ĐŽĐŸŃ‡Đșа"] # 0x2217 (en: 'times') - - "∘": [t: "ĐșĐŸĐŒĐżĐŸĐ·ĐžŃ†ĐžŃ"] # 0x2218 (en: 'composed with') - - "∧": [t: "Đ»ĐŸĐłĐžŃ‡Đ”ŃĐșĐŸĐ” Đž"] # 0x2227 (en: 'and') - - "√": [t: "Đ»ĐŸĐłĐžŃ‡Đ”ŃĐșĐŸĐ” ОлО"] # 0x2228 (en: 'or') - - "∟": [t: "ĐžĐœŃ‚Đ”ĐłŃ€Đ°Đ» ĐżĐŸ ĐșĐŸĐœŃ‚ŃƒŃ€Ńƒ"] # 0x222e (en: 'contour integral') - - "∷": [t: "ĐżŃ€ĐŸĐżĐŸŃ€Ń†ĐžŃ"] # 0x2237 (en: 'as') - - "∌": [t: "Ń‚ĐžĐ»ŃŒĐŽĐ°"] # 0x223c (en: 'varies with') - - "∿": [t: "ŃĐžĐœŃƒŃĐŸĐžĐŽĐ°Đ»ŃŒĐœĐ°Ń ĐČĐŸĐ»ĐœĐ°"] # 0x223f (en: 'sine wave') - - "≩": [t: "ĐŒĐ”ĐœŃŒŃˆĐ” ĐœĐ°ĐŽ раĐČĐœĐŸ"] # 0x2266 (en: 'less than over equal to') - - "≧": [t: "Đ±ĐŸĐ»ŃŒŃˆĐ” ĐœĐ°ĐŽ раĐČĐœĐŸ"] # 0x2267 (en: 'greater than over equal to') - - "≻": [t: "ŃĐ»Đ”ĐŽŃƒĐ”Ń‚ за"] # 0x227b (en: 'succeeds') +--- + # Note to translators: + # most languages don't have two ways to pronounce 'a' -- if not need, remove the rules and change "B-Z" to "A-Z" + # some languages say the word for "uppercase" after the letter. Make sure to change that where appropriate by moving some code around + - "a": [t: "а"] + - "b": [t: "Đ±Ń"] + - "c": [t: "цэ"] + - "d": [t: "Юэ"] + - "e": [t: "Đ”"] + - "f": [t: "эф"] + - "g": [t: "ЎжО"] + - "h": [t: "аш"] + - "i": [t: "Đž"] + - "j": [t: "ЎжДĐč"] + - "k": [t: "Đșа"] + - "l": [t: "ŃĐ»ŃŒ"] + - "m": [t: "ŃĐŒ"] + - "n": [t: "ŃĐœ"] + - "o": [t: "ĐŸ"] + - "p": [t: "пэ"] + - "q": [t: "Đșу"] + - "r": [t: "эр"] + - "s": [t: "эс"] + - "t": [t: "тэ"] + - "u": [t: "у"] + - "v": [t: "ĐČэ"] + - "w": [t: "Ўабл-ю"] + - "x": [t: "ĐžĐșс"] + - "y": [t: "ОгрДĐș"] + - "z": [t: "Đ·ŃŃ‚"] + + # Capital letters are a little tricky: users can pick their favorite word (something that was requested) and + # screen readers have options to use pitch changes or beeps instead of or in addition to say "cap" + # Also, if a user can see the screen, they probably don't need to hear "cap", but if they specified an override, they must want to hear the override. + + + - "A-Z": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [t: "заглаĐČĐœĐ°Ń"] # (en: 'cap') + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + # note: processing of ranges converts '.' into the character, so it needs to be in quotes below + replace: [x: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"] + + - "0-9": [t: "."] # (en: '.', google translation) + + - " ": [t: " "] # 0x20 (google translation) + + - "!": # 0x21 + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then_test: + if: "$Verbosity = 'Terse'" + then: [t: "ĐČĐŸŃĐșĐ»ĐžŃ†Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹Đč Đ·ĐœĐ°Đș"] # 0x21 (en: 'bang', google translation) + else: [t: "ĐČĐŸŃĐșĐ»ĐžŃ†Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹Đč Đ·ĐœĐ°Đș"] # 0x21 (en: 'exclamation point', google translation) + else: [t: "фаĐșŃ‚ĐŸŃ€ĐžĐ°Đ»"] # 0x21 (en: 'factorial', google translation) + + - "\"": [t: "ĐșаĐČычĐșа"] # 0x22 (en: 'quotation mark', google translation) + - "#": [t: "ĐœĐŸĐŒĐ”Ń€"] # 0x23 (en: 'number', google translation) + - "$": [t: "ĐŽĐŸĐ»Đ»Đ°Ń€"] # 0x24 (en: 'dollars', google translation) + - "%": [t: "ĐżŃ€ĐŸŃ†Đ”ĐœŃ‚"] # 0x25 (en: 'percent') + - "&": [t: "Đ°ĐŒĐżĐ”Ń€ŃĐ°ĐœĐŽ"] # 0x26 (google translation) + - "'": [t: "штрох"] # 0x27 (en: 'apostrophe') + - "(": # 0x28 + - test: + - if: "$SpeechStyle='LiteralSpeak' or ancestor-or-self::*[contains(@data-intent-property, ':literal:')] or @data-changed='added' or ancestor::*[@data-changed='added'] or preceding-sibling::*[1][.='P'] or following-sibling::*[.='|' or .='∩' or contains(., 'and')]" + then: [t: "ĐŸŃ‚ĐșрыĐČающая ĐșŃ€ŃƒĐłĐ»Đ°Ń сĐșĐŸĐ±Đșа"] + else_test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then_test: + if: "$Verbosity='Terse'" + then: [t: "сĐșĐŸĐ±Đșа ĐŸŃ‚ĐșрыĐČĐ°Đ”Ń‚ŃŃ"] # 0x28 (en: 'open', google translation) + else: [t: "ĐŸŃ‚ĐșрыĐČающая ĐșŃ€ŃƒĐłĐ»Đ°Ń сĐșĐŸĐ±Đșа"] # 0x28 (en: 'open paren', google translation) + else: [t: "лДĐČая ĐșŃ€ŃƒĐłĐ»Đ°Ń сĐșĐŸĐ±Đșа"] # 0x28 (en: 'left paren', google translation) + - ")": # 0x29 + - test: + - if: "$SpeechStyle='LiteralSpeak' or ancestor-or-self::*[contains(@data-intent-property, ':literal:')] or @data-changed='added' or ancestor::*[@data-changed='added'] or preceding-sibling::*[.='P' or .='|' or .='∩' or contains(., 'and')]" + then: [t: "заĐșрыĐČающая ĐșŃ€ŃƒĐłĐ»Đ°Ń сĐșĐŸĐ±Đșа"] + else_test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then_test: + if: "$Verbosity='Terse'" + then: [t: "сĐșĐŸĐ±Đșа заĐșрыĐČĐ°Đ”Ń‚ŃŃ"] # 0x29 (en: 'close', google translation) + else: [t: "заĐșрыĐČающая ĐșŃ€ŃƒĐłĐ»Đ°Ń сĐșĐŸĐ±Đșа"] # 0x29 (en: 'close paren', google translation) + else: [t: "праĐČая ĐșŃ€ŃƒĐłĐ»Đ°Ń сĐșĐŸĐ±Đșа"] # 0x29 (en: 'right paren', google translation) + + - "*": # 0x2a + test: + if: "parent::*[name(.)='msup' or name(.)='msubsup' or name(.)='skip-super']" + then: [t: "Đ·ĐČŃ‘Đ·ĐŽĐŸŃ‡Đșа"] # 0x2a (en: 'star', google translation) + else: [t: "ŃƒĐŒĐœĐŸĐ¶ĐžŃ‚ŃŒ"] # 0x2a (en: 'times', google translation) + - "+": # 0x2b + - test: + if: "preceding-sibling::*[1][name(.)='mover' or name(.)='modified-variable'] and + following-sibling::*[1][name(.)='mover' or name(.)='modified-variable'] and + not(following-sibling::*[1][name(.)='mover' and *[2][.='→']])" + then: [pause: medium] + - t: "плюс" # (en: 'plus') + - test: + if: "$ClearSpeak_Functions='None' and following-sibling::*[1][self::m:mi] and not(ancestor::*[IsBracketed(., '(', ')')])" + then: [pause: short] + - ",": # 0x2c + # the following deals with the interaction of "," with "
" which sometimes wants the ',' to be silent + # that this test is here and not with "
" is not ideal, but seems simplest + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or " + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak "comma" when not adjacent to '
' + - "( following-sibling::*[1][text()!= '
'] and preceding-sibling::*[1][text()!='
'] ) or " + # except if expression starts with '
' + - "../*[1][.='
'] " + then: + - test: + - if: "preceding-sibling::*[1][self::m:mi] and following-sibling::*[1][self::m:mi]" + then: [pause: short] + else: + - T: "Đ·Đ°ĐżŃŃ‚Đ°Ń" # (en: 'comma', google translation) + - test: + if: "$Verbosity != Terse" + then: [pause: short] + # else silent + + - "-": [t: "ĐŒĐžĐœŃƒŃ"] # 0x2d (en: 'minus') + - ".": # 0x2e + - test: + if: "parent::*[1][self::m:mn]" + then: [t: "Ń‚ĐŸŃ‡Đșа"] # (en: 'point', google translation) + else: [t: "Ń‚ĐŸŃ‡Đșа"] # (en: 'dot', google translation) + - "/": [t: "Ń€Đ°Đ·ĐŽĐ”Đ»ĐžŃ‚ŃŒ ĐœĐ°"] # 0x2f (en: 'divided by') + - ":": [t: "ĐŽĐČĐŸĐ”Ń‚ĐŸŃ‡ĐžĐ”"] # 0x3a (en: 'colon') + - ";": [t: "Ń‚ĐŸŃ‡Đșа с Đ·Đ°ĐżŃŃ‚ĐŸĐč"] # 0x3b (en: 'semicolon', google translation) + - "<": # 0x3c + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'is', google translation) + - t: "ĐŒĐ”ĐœŃŒŃˆĐ”" # (en: 'less than') + - "=": # 0x3d + - test: + if: "$Verbosity!='Terse'" + then: [t: "раĐČĐœĐŸ"] # (en: 'is equal to', google translation) + else: [t: "раĐČĐœĐŸ"] # (en: 'equals') + - test: + - if: "(following-sibling::*[1][.='c'] and following-sibling::*[2][.='\u2062']) or + (following-sibling::*[1][.='P'] and following-sibling::*[2][IsBracketed(., '(', ')')] and following-sibling::*[3][.='='])" + then: [pause: medium] + - else_if: "following-sibling::*[1][.='P'] and following-sibling::*[2][IsBracketed(., '(', ')')]" + then: [pause: short] + + - ">": # 0x3e + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'is', google translation) + - t: "Đ±ĐŸĐ»ŃŒŃˆĐ”" # (en: 'greater than') + - "?": [t: "ĐČĐŸĐżŃ€ĐŸŃĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Đč Đ·ĐœĐ°Đș"] # 0x3f (en: 'question mark', google translation) + - "@": [t: "ŃĐŸĐ±Đ°Đșа"] # 0x40 (en: 'at sign', google translation) + - "[": # 0x5b + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [t: "ĐŸŃ‚ĐșрыĐČающая ĐșĐČĐ°ĐŽŃ€Đ°Ń‚ĐœĐ°Ń сĐșĐŸĐ±Đșа"] # (en: 'open bracket', google translation) + else: [t: "лДĐČая ĐșĐČĐ°ĐŽŃ€Đ°Ń‚ĐœĐ°Ń сĐșĐŸĐ±Đșа"] # (en: 'left bracket', google translation) + - "\\": [t: "ĐŸĐ±Ń€Đ°Ń‚ĐœĐ°Ń ĐșĐŸŃĐ°Ń чДрта"] # 0x5c (en: 'back slash', google translation) + - "]": # 0x5d + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [t: "заĐșрыĐČающая ĐșĐČĐ°ĐŽŃ€Đ°Ń‚ĐœĐ°Ń сĐșĐŸĐ±Đșа"] # (en: 'close bracket', google translation) + else: [t: "праĐČая ĐșĐČĐ°ĐŽŃ€Đ°Ń‚ĐœĐ°Ń сĐșĐŸĐ±Đșа"] # (en: 'right bracket', google translation) + - "^": # 0x5e + - test: + if: "parent::m:modified-variable or parent::m:mover" + then: [t: "цорĐșŃƒĐŒŃ„Đ»Đ”Đșс"] # (en: 'hat', google translation) + else: [t: "ĐșрышĐșа"] # (en: 'caret', google translation) + - "_": [t: "ĐżĐŸĐŽŃ‡Ń‘Ń€ĐșĐžĐČĐ°ĐœĐžĐ”"] # 0x5f (en: 'under bar', google translation) + - "`": [t: "граĐČОс"] # 0x60 (en: 'grave', google translation) + - "{": # 0x7b + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [t: "ĐŸŃ‚ĐșрыĐČающая Ń„ĐžĐłŃƒŃ€ĐœĐ°Ń сĐșĐŸĐ±Đșа"] # (en: 'open brace', google translation) + else: [t: "лДĐČая Ń„ĐžĐłŃƒŃ€ĐœĐ°Ń сĐșĐŸĐ±Đșа"] # (en: 'left brace', google translation) + - "|": # 0x7c + # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' + - with: + variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) + replace: + - test: + - if: "$SpeechStyle != 'ClearSpeak'" + then_test: + if: "$DefaultToGiven" + then: [t: "про ŃƒŃĐ»ĐŸĐČОО"] # (en: 'given', google translation) + else: [t: "ĐČДртОĐșĐ°Đ»ŃŒĐœĐ°Ń чДрта"] # (en: 'vertical line') + - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" + then: [t: "ĐČДртОĐșĐ°Đ»ŃŒĐœĐ°Ń чДрта"] # (en: 'vertical line', google translation) + - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" + then: [t: "таĐșĐŸĐč, Ń‡Ń‚ĐŸ"] # (en: 'such that', google translation) + - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" + then: [t: "про ŃƒŃĐ»ĐŸĐČОО"] # (en: 'given', google translation) + - else: [t: "ЎДлОт"] # (en: 'divides') + + - "}": # 0x7d + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [t: "заĐșрыĐČающая Ń„ĐžĐłŃƒŃ€ĐœĐ°Ń сĐșĐŸĐ±Đșа"] # (en: 'close brace', google translation) + else: [t: "праĐČая Ń„ĐžĐłŃƒŃ€ĐœĐ°Ń сĐșĐŸĐ±Đșа"] # (en: 'right brace', google translation) + + - "~": [t: "Ń‚ĐžĐ»ŃŒĐŽĐ°"] # 0x7e (en: 'tilde', google translation) + - " ": # 0xa0 + - test: + # could be mtext in mtd or mtext in an mrow that is a concatenation of mtd's. Is there a better solution? + if: "@data-empty-in-2D and not(ancestor::*[self::m:piecewise or self::m:system-of-equations or self::m:lines])" + then: [t: "ĐżŃƒŃŃ‚ĐŸĐč"] # want to say something for fraction (etc) with empty child (en: 'empty', google translation) + else: [t: ""] + + - "ÂŹ": [t: "ĐœĐ”"] # 0xac (en: 'not', google translation) + - "°": [t: "граЮусы"] # 0xb0 (en: 'degrees', google translation) + - "±": [t: "плюс ĐŒĐžĐœŃƒŃ"] # 0xb1 (en: 'plus or minus') + - "ÂŽ": [t: "аĐșут"] # 0xb4 (en: 'acute', google translation) + - "·": # 0xB7 + - test: + if: "$SpeechStyle = 'LiteralSpeak' or not($SpeechStyle = 'ClearSpeak' and $ClearSpeak_MultSymbolDot = 'Auto')" + then: [t: "Ń‚ĐŸŃ‡Đșа"] # (en: 'dot', google translation) + else: [t: "ŃƒĐŒĐœĐŸĐ¶ĐžŃ‚ŃŒ"] # (en: 'times') + - "×": # 0xd7 + - test: + if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolX = 'Auto'" + then: [t: "ŃƒĐŒĐœĐŸĐ¶ĐžŃ‚ŃŒ ĐœĐ°"] # (en: 'times', google translation) + else_test: + if: $ClearSpeak_MultSymbolX = 'By' + then: [t: "ŃƒĐŒĐœĐŸĐ¶ĐžŃ‚ŃŒ ĐœĐ°"] # (en: 'by') + else: [t: "ĐČĐ”ĐșŃ‚ĐŸŃ€ĐœĐŸĐ” ĐżŃ€ĐŸĐžĐ·ĐČĐ”ĐŽĐ”ĐœĐžĐ”"] # (en: 'cross') + - "Ă·": [t: "Ń€Đ°Đ·ĐŽĐ”Đ»ĐžŃ‚ŃŒ ĐœĐ°"] # 0xf7 (en: 'divided by') + - "̀": [t: "Đ·ĐœĐ°Đș граĐČОса"] # 0x300 (en: 'grave accent embellishment', google translation) + - "́": [t: "аĐșут"] # 0x301 (en: 'acute accent embellishment', google translation) + - "̂": [t: "цорĐșŃƒĐŒŃ„Đ»Đ”Đșс"] # 0x302 (en: 'circumflex accent embellishment', google translation) + - "̃": [t: "Ń‚ĐžĐ»ŃŒĐŽĐ°"] # 0x303 (en: 'tilde embellishment', google translation) + - "̄": [t: "ĐŒĐ°ĐșŃ€ĐŸĐœ"] # 0x304 (en: 'macron embellishment', google translation) + - "̅": [t: "ĐœĐ°ĐŽŃ‡Ń‘Ń€ĐșĐžĐČĐ°ĐœĐžĐ”"] # 0x305 (en: 'overbar embellishment', google translation) + - "̆": [t: "Đ±Ń€ŃĐČэ"] # 0x306 (en: 'breve', google translation) + - "̇": [t: "Ń‚ĐŸŃ‡Đșа сĐČĐ”Ń€Ń…Ńƒ"] # 0x307 (en: 'dot above embellishment', google translation) + + # Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong + - "Α-Ω": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [t: "заглаĐČĐœĐ°Ń"] # (en: 'cap') + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + # note: processing of ranges converts '.' into the character, so it needs to be in quotes below + replace: [x: "translate('.', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')"] + + - "α": [t: "Đ°Đ»ŃŒŃ„Đ°"] # 0x3b1 (en: 'alpha') + - "ÎČ": [t: "бДта"] # 0x3b2 (en: 'beta') + - "Îł": [t: "ĐłĐ°ĐŒĐŒĐ°"] # 0x3b3 (en: 'gamma') + - "ÎŽ": [t: "ĐŽĐ”Đ»ŃŒŃ‚Đ°"] # 0x3b4 (en: 'delta') + - "Δ": [t: "ŃĐżŃĐžĐ»ĐŸĐœ"] # 0x3b5 (en: 'epsilon') + - "ζ": [t: "ЎзДта"] # 0x3b6 (en: 'zeta') + - "η": [t: "эта"] # 0x3b7 (en: 'eta') + - "Ξ": [t: "тДта"] # 0x3b8 (en: 'theta') + - "Îč": [t: "ĐčĐŸŃ‚Đ°"] # 0x3b9 (en: 'iota') + - "Îș": [t: "Đșаппа"] # 0x3ba (en: 'kappa') + - "λ": [t: "Đ»ŃĐŒĐ±ĐŽĐ°"] # 0x3bb (en: 'lambda') + - "ÎŒ": [t: "ĐŒŃŽ"] # 0x3bc (en: 'mu') + - "Μ": [t: "ĐœŃŽ"] # 0x3bd (en: 'nu') + - "Ο": [t: "ĐșсО"] # 0x3be (en: 'zai') + - "Îż": [t: "ĐŸĐŒĐžĐșŃ€ĐŸĐœ"] # 0x3bf (en: 'omicron') + - "π": [t: "пО"] # 0x3c0 (en: 'pi') + - "ρ": [t: "Ń€ĐŸ"] # 0x3c1 (en: 'rho') + - "ς": [t: "Ń„ĐžĐœĐ°Đ»ŃŒĐœĐ°Ń ŃĐžĐłĐŒĐ°"] # 0x3c2 (en: 'final sigma') + - "σ": [t: "ŃĐžĐłĐŒĐ°"] # 0x3c3 (en: 'sigma') + - "τ": [t: "тау"] # 0x3c4 (en: 'tau') + - "υ": [t: "ĐžĐżŃĐžĐ»ĐŸĐœ"] # 0x3c5 (en: 'upsilon') + - "φ": [t: "фо"] # 0x3c6 (en: 'phi') + - "χ": [t: "хо"] # 0x3c7 (en: 'chi') + - "ψ": [t: "псО"] # 0x3c8 (en: 'psi') + - "ω": [t: "ĐŸĐŒĐ”ĐłĐ°"] # 0x3c9 (en: 'omega') + - "ϕ": [t: "фо"] # 0x3d5 (en: 'phi') + - "ϖ": [t: "пО"] # 0x3d6 (en: 'pi') + - "Ï”": [t: "ŃĐżŃĐžĐ»ĐŸĐœ"] # 0x3f5 (en: 'epsilon') + - "϶": [t: "ĐŸĐ±Ń€Đ°Ń‚ĐœŃ‹Đč ŃĐżŃĐžĐ»ĐŸĐœ"] # 0x3f6 (en: 'reversed epsilon') + + - "⁥": # 0x2061 + - test: + # skip saying "of" after trig functions, geometry shapes, or in :literal mode + if: "not(preceding-sibling::*[1][IsInDefinition(., 'TrigFunctionNames') or self::m:inverse-function or (self::m:power and IsInDefinition(*[1], 'TrigFunctionNames'))]) and not(preceding-sibling::*[1][IsInDefinition(., 'GeometryShapes')]) and + not(@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')])" + then: [t: "ĐŸŃ‚"] # (en: 'of', google translation) + - "⁹": # 0x2062 + - test: + if: "@data-function-guess and following-sibling::*[1][self::m:mrow and IsBracketed(., '(', ')')] and $ClearSpeak_Functions!='None'" + then: [pause: short] + - "⁣": [t: ""] # 0x2063 + - "⁀": [t: "Đž"] # 0x2064 (en: 'and', google translation) + - "ℂℕℚℝ℀": # here we rely on this running through the table again to speak "cap xxx" + - t: "ĐŽĐČĐŸĐčĐœĐŸĐ”" # (en: 'double-struck') + - spell: "translate('.', 'ℂℕℚℝ℀', 'CNQRZ')" + + - "℃": [t: "граЮусы Ń†Đ”Đ»ŃŒŃĐžŃ"] # 0x2103 (en: 'degrees celsius', google translation) + - "ℋℛℓ": # 0x210b + - t: "руĐșĐŸĐżĐžŃĐœĐŸĐ”" # (en: 'script', google translation) + - spell: "translate('.', 'ℋℛℓ', 'HRl')" + - "ℜ": # 0x211c + - t: "ĐłĐŸŃ‚ĐžŃ‡Đ”ŃĐșая" # (en: 'fraktur', google translation) + - spell: "'R'" + + - "ⅆⅇⅈⅉ": # 0x2146-9 + - t: "ĐŽĐČĐŸĐčĐœĐŸĐč ĐșурсоĐČ" # (en: 'double-struck italic', google translation) + - spell: "translate('.', 'ⅆⅇⅈⅉ', 'deij')" + + - "←": [t: "стрДлĐșа ĐČлДĐČĐŸ"] # 0x2190 (en: 'leftwards arrow', google translation) + - "↑": [t: "стрДлĐșа ĐČĐČДрх"] # 0x2191 (en: 'upwards arrow', google translation) + - "→": # 0x2192 + - test: + if: "(parent::m:mover or parent::m:modified-variable) and ($SpeechStyle='LiteralSpeak' or ancestor-or-self::*[contains(@data-intent-property, ':literal:')])" + then: [t: "ŃĐŸ стрДлĐșĐŸĐč"] + else_test: + if: "ancestor::*[2][self::m:limit]" + then: [t: "ŃŃ‚Ń€Đ”ĐŒŃŃ‰Đ”ĐŒŃŃ Đș"] # (en: 'approaches', google translation) + else: [t: "стрДлĐșа ĐČпраĐČĐŸ"] # (en: 'right arrow', google translation) + + - "↓": [t: "стрДлĐșа ĐČĐœĐžĐ·"] # 0x2193 (en: 'downwards arrow', google translation) + - "∈": # 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: + - test: + if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" + then: [t: ""] # (en: 'is', google translation) + - t: "ĐżŃ€ĐžĐœĐ°ĐŽĐ»Đ”Đ¶ĐžŃ‚" # (en: 'an element of') + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [t: "ĐČ"] # (en: 'in', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [t: "Ń‡Đ»Đ”Đœ"] # (en: 'member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [t: "ŃĐ»Đ”ĐŒĐ”ĐœŃ‚"] # (en: 'element of', google translation) + - else: [t: "ĐżŃ€ĐžĐœĐ°ĐŽĐ»Đ”Đ¶ĐžŃ‚"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [t: "Ń‡Đ»Đ”Đœ"] # (en: 'is a member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [t: "ŃĐ»Đ”ĐŒĐ”ĐœŃ‚"] # (en: 'is an element of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [t: "ĐœĐ°Ń…ĐŸĐŽĐžŃ‚ŃŃ ĐČ"] # (en: 'is in', google translation) + - else: [t: "ĐżŃ€ĐžĐœĐ°ĐŽĐ»Đ”Đ¶ĐžŃ‚"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') + - "∄": # 0x2225 + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'is', google translation) + - t: "ĐżĐ°Ń€Đ°Đ»Đ»Đ”Đ»ŃŒĐœĐŸ" # (en: 'parallel to') + - "∊": # 0x2226 + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'is', google translation) + - t: "ĐœĐ” ĐżĐ°Ń€Đ°Đ»Đ»Đ”Đ»ŃŒĐœĐŸ" # (en: 'not parallel to') + - "≀": # 0x2264 + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'is', google translation) + - t: "ĐŒĐ”ĐœŃŒŃˆĐ” ОлО раĐČĐœĐŸ" + - "≄": # 0x2265 + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'is', google translation) + - t: "Đ±ĐŸĐ»ŃŒŃˆĐ” ОлО раĐČĐœĐŸ" # (en: 'greater than or equal to') + + # --- restored complex short definitions (prefer over unicode-full) --- + - "
": # 0x2026 + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak '
' as 'and so on...' unless expr starts with '
' + - "../*[1][.='
']" + then: [t: "ĐŒĐœĐŸĐłĐŸŃ‚ĐŸŃ‡ĐžĐ”"] # (en: 'dot dot dot') + else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' + if: "count(following-sibling::*) = 0" + then: [t: "Đž таĐș ЎалДД"] # (en: 'and so on', google translation) + else: [t: "Đž таĐș ЎалДД ĐŽĐŸ"] # (en: 'and so on up to', google translation) + - "∂": # 0x2202 + - test: + if: "$Verbosity='Terse'" + then: [t: "Ń‡Đ°ŃŃ‚ĐœĐ°Ń ĐżŃ€ĐŸĐžĐ·ĐČĐŸĐŽĐœĐ°Ń"] # (en: 'partial', google translation) + else: [t: "Ń‡Đ°ŃŃ‚ĐœĐ°Ń ĐżŃ€ĐŸĐžĐ·ĐČĐŸĐŽĐœĐ°Ń"] # (en: 'partial derivative') + - "∆": # 0x2206 + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'the', google translation) + - t: "ĐžĐœĐșŃ€Đ”ĐŒĐ”ĐœŃ‚" # (en: 'laplacian of') + - "∉": # 0x2209 + # rule is identical to 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'is', google translation) + - t: "ĐœĐ” ĐżŃ€ĐžĐœĐ°ĐŽĐ»Đ”Đ¶ĐžŃ‚" # (en: 'not an element of') + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [t: "ĐœĐ” ĐČ"] # (en: 'not in', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [t: "ĐœĐ” Ń‡Đ»Đ”Đœ"] # (en: 'not member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [t: "ĐœĐ” ŃĐ»Đ”ĐŒĐ”ĐœŃ‚"] # (en: 'not element of', google translation) + - else: [t: "ĐœĐ” ĐżŃ€ĐžĐœĐ°ĐŽĐ»Đ”Đ¶ĐžŃ‚"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'not belonging to') + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [t: "ĐœĐ” Ń‡Đ»Đ”Đœ"] # (en: 'is not a member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [t: "ĐœĐ” ŃĐ»Đ”ĐŒĐ”ĐœŃ‚"] # (en: 'is not an element of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [t: "ĐœĐ” ĐČ"] # (en: 'is not in', google translation) + - else: [t: "ĐœĐ” ĐżŃ€ĐžĐœĐ°ĐŽĐ»Đ”Đ¶ĐžŃ‚"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'does not belong to') + - "∊": # 0x220a + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: + - test: + if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" + then: [t: ""] # (en: 'is', google translation) + - t: "ĐŒĐ°Đ»ĐŸĐ” ĐżŃ€ĐžĐœĐ°ĐŽĐ»Đ”Đ¶ĐžŃ‚" # (en: 'an element of') + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [t: "ĐČ"] # (en: 'in', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [t: "Ń‡Đ»Đ”Đœ"] # (en: 'member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [t: "ŃĐ»Đ”ĐŒĐ”ĐœŃ‚"] # (en: 'element of', google translation) + - else: [t: "ĐŒĐ°Đ»ĐŸĐ” ĐżŃ€ĐžĐœĐ°ĐŽĐ»Đ”Đ¶ĐžŃ‚"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [t: "Ń‡Đ»Đ”Đœ"] # (en: 'is a member of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [t: "ŃĐ»Đ”ĐŒĐ”ĐœŃ‚"] # (en: 'is an element of', google translation) + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [t: "ĐœĐ°Ń…ĐŸĐŽĐžŃ‚ŃŃ ĐČ"] # (en: 'is in', google translation) + - else: [t: "ĐŒĐ°Đ»ĐŸĐ” ĐżŃ€ĐžĐœĐ°ĐŽĐ»Đ”Đ¶ĐžŃ‚"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') + - "√": # 0x221a + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'the', google translation) + - t: "ĐșĐČĐ°ĐŽŃ€Đ°Ń‚ĐœŃ‹Đč ĐșĐŸŃ€Đ”ĐœŃŒ" # (en: 'square root of') + - "∝": # 0x221d + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'is', google translation) + - t: "ĐżŃ€ĐŸĐżĐŸŃ€Ń†ĐžĐŸĐœĐ°Đ»ŃŒĐœĐŸ" # (en: 'proportional to') + - "∶": # 0x2236 + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'is', google translation) + - t: "ĐŸŃ‚ĐœĐŸŃˆĐ”ĐœĐžĐ”" # (en: 'to') + - "∟": # 0x223e + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'is', google translation) + - t: "ĐžĐ·ĐŸĐłĐœŃƒŃ‚Đ°Ń эс" # (en: 'most positive') + - "≠": # 0x2260 + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'is', google translation) + - t: "ĐœĐ” раĐČĐœĐŸ" # (en: 'not equal to') + - "≡": # 0x2261 + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'is', google translation) + - t: "Ń‚ĐŸĐ¶ĐŽĐ”ŃŃ‚ĐČĐ”ĐœĐœĐŸ раĐČĐœĐŸ" # (en: 'identical to') + - "⊂": # 0x2282 + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'is a', google translation) + - t: "ĐżĐŸĐŽĐŒĐœĐŸĐ¶Đ”ŃŃ‚ĐČĐŸ" # (en: 'subset of') + - "⊃": # 0x2283 + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'is a', google translation) + - t: "ĐœĐ°ĐŽĐŒĐœĐŸĐ¶Đ”ŃŃ‚ĐČĐŸ" # (en: 'superset of') + - "⊄": # 0x2284 + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'is', google translation) + - t: "ĐœĐ” ĐżĐŸĐŽĐŒĐœĐŸĐ¶Đ”ŃŃ‚ĐČĐŸ" # (en: 'not a subset of') + - "⊅": # 0x2285 + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'is', google translation) + - t: "ĐœĐ” ĐœĐ°ĐŽĐŒĐœĐŸĐ¶Đ”ŃŃ‚ĐČĐŸ" # (en: 'not a superset of') + - "⊆": # 0x2286 + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'is a', google translation) + - t: "ĐżĐŸĐŽĐŒĐœĐŸĐ¶Đ”ŃŃ‚ĐČĐŸ ОлО раĐČĐœĐŸ" # (en: 'subset of or equal to') + - "⊇": # 0x2287 + - test: + if: "$Verbosity!='Terse'" + then: [t: ""] # (en: 'is a', google translation) + - t: "ĐœĐ°ĐŽĐŒĐœĐŸĐ¶Đ”ŃŃ‚ĐČĐŸ ОлО раĐČĐœĐŸ" # (en: 'superset of or equal to') + + # --- restored short definitions that differ from unicode-full --- + - "‖": [t: "ĐŽĐČĐŸĐčĐœĐ°Ń ĐČДртОĐșĐ°Đ»ŃŒĐœĐ°Ń чДрта"] # 0x2016 (en: 'double vertical line', google translation) + - "℉": [t: "граЮусы Ń„Đ°Ń€Đ”ĐœĐłĐ”Đčта"] # 0x2109 (en: 'degrees fahrenheit', google translation) + - "℩": [t: "ĐŸĐŒ"] # 0x2126 (en: 'ohms', google translation) + - "Å": [t: "Đ°ĐœĐłŃŃ‚Ń€Đ”ĐŒ"] # 0x212b (en: 'angstroms', google translation) + - "⇒": [t: "ĐŽĐČĐŸĐčĐœĐ°Ń стрДлĐșа ĐČпраĐČĐŸ"] # 0x21d2 (en: 'rightwards double arrow', google translation) + - "∐": [t: "ŃĐœ-Đ°Ń€ĐœŃ‹Đč ŃĐŸĐŒĐœĐŸĐ¶ĐžŃ‚Đ”Đ»ŃŒ"] # 0x2210 (en: 'co-product') + - "∓": [t: "ĐŒĐžĐœŃƒŃ плюс"] # 0x2213 (en: 'minus or plus') + - "∗": [t: "Đ·ĐČŃ‘Đ·ĐŽĐŸŃ‡Đșа"] # 0x2217 (en: 'times') + - "∘": [t: "ĐșĐŸĐŒĐżĐŸĐ·ĐžŃ†ĐžŃ"] # 0x2218 (en: 'composed with') + - "∧": [t: "Đ»ĐŸĐłĐžŃ‡Đ”ŃĐșĐŸĐ” Đž"] # 0x2227 (en: 'and') + - "√": [t: "Đ»ĐŸĐłĐžŃ‡Đ”ŃĐșĐŸĐ” ОлО"] # 0x2228 (en: 'or') + - "∟": [t: "ĐžĐœŃ‚Đ”ĐłŃ€Đ°Đ» ĐżĐŸ ĐșĐŸĐœŃ‚ŃƒŃ€Ńƒ"] # 0x222e (en: 'contour integral') + - "∷": [t: "ĐżŃ€ĐŸĐżĐŸŃ€Ń†ĐžŃ"] # 0x2237 (en: 'as') + - "∌": [t: "Ń‚ĐžĐ»ŃŒĐŽĐ°"] # 0x223c (en: 'varies with') + - "∿": [t: "ŃĐžĐœŃƒŃĐŸĐžĐŽĐ°Đ»ŃŒĐœĐ°Ń ĐČĐŸĐ»ĐœĐ°"] # 0x223f (en: 'sine wave') + - "≩": [t: "ĐŒĐ”ĐœŃŒŃˆĐ” ĐœĐ°ĐŽ раĐČĐœĐŸ"] # 0x2266 (en: 'less than over equal to') + - "≧": [t: "Đ±ĐŸĐ»ŃŒŃˆĐ” ĐœĐ°ĐŽ раĐČĐœĐŸ"] # 0x2267 (en: 'greater than over equal to') + - "≻": [t: "ŃĐ»Đ”ĐŽŃƒĐ”Ń‚ за"] # 0x227b (en: 'succeeds') diff --git a/Rules/Languages/vi/unicode-full.yaml b/Rules/Languages/vi/unicode-full.yaml index f79caf2cf..7d3d53b59 100644 --- a/Rules/Languages/vi/unicode-full.yaml +++ b/Rules/Languages/vi/unicode-full.yaml @@ -1,3382 +1,3382 @@ ---- - - - - "€": [t: "dáș„u hiệu tiền tệ"] # 0xa4 (en: 'currency sign') - - "„": [t: "yĂȘn"] # 0xa5 (en: 'yen') - - "Š": [t: "thanh bị hỏng"] # 0xa6 (en: 'broken bar') - - "§": [t: "tiáșżt diện"] # 0xa7 (en: 'section') - - "š": [t: "cháș„m đîi"] # 0xa8 (en: 'double dot') - - "©": [t: "báșŁn quyền"] # 0xa9 (en: 'copyright') - - "ÂȘ": [t: "chỉ số thứ tá»± nữ tĂ­nh"] # 0xaa (en: 'feminine ordinal indicator') - - "«": [t: "dáș„u Ăœ nghÄ©a gĂłc cáșĄnh trĂĄi"] # 0xab (en: 'left-pointing double angle quote mark') - - "ÂŻ": # 0xaf - - test: - if: "ancestor::m:modified-variable and preceding-sibling::*[1][self::m:mi]" - then: [T: "ngang"] # (en: 'bar') -- as in "x bar", a shorthand way to speak this - else: [t: "dĂČng"] # (en: 'line') - - "ÂČ": [t: "hai"] # 0xb2 (en: 'two') - - "Âł": [t: "số ba"] # 0xb3 (en: 'three') - - "”": [t: "vi mĂŽ"] # 0xb5 (en: 'micro') - - "Âč": [t: "một"] # 0xb9 (en: 'one') - - "Âș": [t: "chỉ số thứ tá»± nam tĂ­nh"] # 0xb9 (en: 'masculine ordinal indicator') - - "ʰ": [t: "cĂŽng cỄ sá»­a đổi nhỏ h"] # 0x2b0 (en: 'modifier small h') - - "ʱ": [t: "cĂŽng cỄ sá»­a đổi h nhỏ với mĂłc"] # 0x2b1 (en: 'modifier small h with hook') - - "ÊČ": [t: "sá»­a đổi nhỏ j"] # 0x2b2 (en: 'modifier small j') - - "Êł": [t: "cĂŽng cỄ sá»­a đổi nhỏ r"] # 0x2b3 (en: 'modifier small r') - - "ÊŽ": [t: "cĂŽng cỄ sá»­a đổi nhỏ quay r"] # 0x2b4 (en: 'modifier small turned r') - - "Ê”": [t: "cĂŽng cỄ sá»­a đổi nhỏ quay r với mĂłc"] # 0x2b5 (en: 'modifier small turned r with hook') - - "ʶ": # 0x2b6 - - t: "sá»­a đổi nhỏ đáșŁo ngÆ°á»Łc" # (en: 'modifier small inverted') - - spell: "translate('R', 'R', 'R')" - - - "Ê·": [t: "sá»­a đổi nhỏ w"] # 0x2b7 (en: 'modifier small w') - - "Êž": [t: "cĂŽng cỄ sá»­a đổi nhỏ y"] # 0x2b8 (en: 'modifier small y') - - "Êč": [t: "cĂŽng cỄ sá»­a đổi prime"] # 0x2b9 (en: 'modifier prime') - - "Êș": [t: "cĂŽng cỄ sá»­a đổi double prime"] # 0x2ba (en: 'modifier double prime') - - "Ê»": [t: "cĂŽng cỄ sá»­a đổi đã trở thĂ nh dáș„u pháș©y"] # 0x2bb (en: 'modifier turned comma') - - "ÊŒ": [t: "ăn dĂąy sá»­a đổi"] # 0x2bc (en: 'modifier apostrophe') - - "Êœ": [t: "cĂŽng cỄ sá»­a đổi đáșŁo ngÆ°á»Łc dáș„u pháș©y"] # 0x2bd (en: 'modifier reversed comma') - - "ÊŸ": [t: "cĂŽng cỄ sá»­a đổi một ná»­a vĂČng"] # 0x2be (en: 'modifier right half ring') - - "Êż": [t: "cĂŽng cỄ sá»­a đổi một ná»­a vĂČng"] # 0x2bf (en: 'modifier left half ring') - - "ˀ": [t: "cĂŽng cỄ sá»­a đổi glottal stop"] # 0x2c0 (en: 'modifier glottal stop') - - "ˁ": [t: "cĂŽng cỄ sá»­a đổi đáșŁo ngÆ°á»Łc điểm dừng glottal"] # 0x2c1 (en: 'modifier reversed glottal stop') - - "˂": [t: "cĂŽng cỄ sá»­a đổi mĆ©i tĂȘn trĂĄi"] # 0x2c2 (en: 'modifier left arrowhead') - - "˃": [t: "cĂŽng cỄ sá»­a đổi mĆ©i tĂȘn pháșŁi"] # 0x2c3 (en: 'modifier right arrowhead') - - "˄": [t: "cĂŽng cỄ sá»­a đổi lĂȘn đáș§u mĆ©i tĂȘn"] # 0x2c4 (en: 'modifier up arrowhead') - - "˅": [t: "cĂŽng cỄ sá»­a đổi xuống mĆ©i tĂȘn"] # 0x2c5 (en: 'modifier down arrowhead') - - "ˆ": [t: "điểm nháș„n cá»§a circleflex"] # 0x2c6 (en: 'modifier circumflex accent') - - "ˇ": [t: "caron"] # 0x2c7 - - "ˈ": [t: "cĂŽng cỄ sá»­a đổi đường tháșłng đứng"] # 0x2c8 (en: 'modifier vertical line') - - "ˉ": [t: "macron cĂŽng cỄ sá»­a đổi"] # 0x2c9 (en: 'modifier macron') - - "ˊ": [t: "modifier điểm nháș„n cáș„p tĂ­nh"] # 0x2ca (en: 'modifier acute accent') - - "ˋ": [t: "điểm nháș„n nghiĂȘm trọng cá»§a cĂŽng cỄ sá»­a đổi"] # 0x2cb (en: 'modifier grave accent') - - "ˌ": [t: "cĂŽng cỄ sá»­a đổi đường tháșłng đứng tháș„p"] # 0x2cc (en: 'modifier low vertical line') - - "ˍ": [t: "cĂŽng cỄ sá»­a đổi macron tháș„p"] # 0x2cd (en: 'modifier low macron') - - "ˎ": [t: "cĂŽng cỄ sá»­a đổi giọng mộ tháș„p"] # 0x2ce (en: 'modifier low grave accent') - - "ˏ": [t: "cĂŽng cỄ sá»­a đổi điểm nháș„n cáș„p tĂ­nh tháș„p"] # 0x2cf (en: 'modifier low acute accent') - - "ː": [t: "cĂŽng cỄ sá»­a đổi đáșĄi trĂ ng hĂŹnh tam giĂĄc"] # 0x2d0 (en: 'modifier triangular colon') - - "ˑ": [t: "cĂŽng cỄ sá»­a đổi một ná»­a đáșĄi trĂ ng hĂŹnh tam giĂĄc"] # 0x2d1 (en: 'modifier half triangular colon') - - "˒": [t: "cĂŽng cỄ sá»­a đổi táș­p trung ná»­a vĂČng"] # 0x2d2 (en: 'modifier centered right half ring') - - "˓": [t: "cĂŽng cỄ sá»­a đổi táș­p trung ná»­a vĂČng trĂĄi"] # 0x2d3 (en: 'modifier centered left half ring') - - "˔": [t: "cĂŽng cỄ sá»­a đổi lĂȘn tadck"] # 0x2d4 (en: 'modifier up tadck') - - "˕": [t: "cĂŽng cỄ sá»­a đổi xuống"] # 0x2d5 (en: 'modifier down tack') - - "˖": [t: "cĂŽng cỄ sá»­a đổi cộng với dáș„u hiệu"] # 0x2d6 (en: 'modifier plus sign') - - "˗": [t: "cĂŽng cỄ sá»­a đổi trừ dáș„u hiệu"] # 0x2d7 (en: 'modifier minus sign') - - "˘": [t: "breve"] # 0x2d8 - - "˙": [t: "cháș„m"] # 0x2d9 (en: 'dot') - - "˚": [t: "nháș«n ở trĂȘn"] # 0x2da (en: 'ring above') - - "˛": [t: "ogonek"] # 0x2db - - "˜": [t: "tilde nhỏ"] # 0x2dc (en: 'small tilde') - - "˝": [t: "giọng cáș„p tĂ­nh gáș„p đîi"] # 0x2dd (en: 'double acute accent') - - "˞": [t: "mod soditoter mood"] # 0x2de (en: 'modifier rhotic hook') - - "˟": [t: "mĂĄy điều chỉnh điểm nháș„n chĂ©o"] # 0x2df (en: 'modifier cross accent') - - "Ë ": [t: "cĂŽng cỄ sá»­a đổi gamma nhỏ"] # 0x2e0 (en: 'modifier small gamma') - - "ËĄ": [t: "sá»­a đổi nhỏ l"] # 0x2e1 (en: 'modifier small l') - - "Ëą": [t: "sá»­a đổi nhỏ s"] # 0x2e2 (en: 'modifier small s') - - "ËŁ": [t: "cĂŽng cỄ sá»­a đổi nhỏ x"] # 0x2e3 (en: 'modifier small x') - - "Ë€": [t: "cĂŽng cỄ sá»­a đổi điểm dừng glottal đáșŁo ngÆ°á»Łc nhỏ"] # 0x2e4 (en: 'modifier small reversed glottal stop') - - "Ë„": [t: "cĂŽng cỄ sá»­a đổi thanh Ăąm cá»±c cao"] # 0x2e5 (en: 'modifier extra-high tone bar') - - "ËŠ": [t: "cĂŽng cỄ sá»­a đổi thanh Ăąm cao"] # 0x2e6 (en: 'modifier high tone bar') - - "˧": [t: "cĂŽng cỄ sá»­a đổi thanh giữa giai điệu"] # 0x2e7 (en: 'modifier mid tone bar') - - "Ëš": [t: "cĂŽng cỄ sá»­a đổi thanh Ăąm tháș„p"] # 0x2e8 (en: 'modifier low tone bar') - - "Ë©": [t: "cĂŽng cỄ sá»­a đổi thanh Ăąm tháș„p"] # 0x2e9 (en: 'modifier extra-low tone bar') - - "ËȘ": [t: "cĂŽng cỄ sá»­a đổi yin khởi hĂ nh dáș„u áș„n"] # 0x2ea (en: 'modifier yin departing tone mark') - - "Ë«": [t: "cĂŽng cỄ sá»­a đổi yang khởi hĂ nh dáș„u áș„n"] # 0x2eb (en: 'modifier yang departing tone mark') - - "ËŹ": [t: "cĂŽng cỄ sá»­a đổi lồng tiáșżng"] # 0x2ec (en: 'modifier voicing') - - "Ë­": [t: "người sá»­a đổi khĂŽng Ä‘Æ°á»Łc khĂĄm phĂĄ"] # 0x2ed (en: 'modifier unaspirated') - - "Ëź": [t: "báșŁn mĂŽ tĂ­n hiệu nhĂąn đîi"] # 0x2ee (en: 'modifier double apostrophe') - - "ËŻ": [t: "cĂŽng cỄ sá»­a đổi mĆ©i tĂȘn tháș„p xuống"] # 0x2ef (en: 'modifier low down arrowhead') - - "˰": [t: "cĂŽng cỄ sá»­a đổi mĆ©i tĂȘn tháș„p"] # 0x2f0 (en: 'modifier low up arrowhead') - - "˱": [t: "cĂŽng cỄ sá»­a đổi mĆ©i tĂȘn tháș„p bĂȘn trĂĄi"] # 0x2f1 (en: 'modifier low left arrowhead') - - "ËČ": [t: "cĂŽng cỄ sá»­a đổi mĆ©i tĂȘn tháș„p pháșŁi"] # 0x2f2 (en: 'modifier low right arrowhead') - - "Ëł": [t: "cĂŽng cỄ sá»­a đổi vĂČng tháș„p"] # 0x2f3 (en: 'modifier low ring') - - "ËŽ": [t: "mĂĄy điều chỉnh giọng giới thiệu giữa"] # 0x2f4 (en: 'modifier middle grave accent') - - "Ë”": [t: "modifier middle double grave accent"] # 0x2f5 - - "˶": [t: "cĂŽng cỄ sá»­a đổi trung tĂąm cáș„p tĂ­nh cáș„p tĂ­nh"] # 0x2f6 (en: 'modifier middle double acute accent') - - "Ë·": [t: "cĂŽng cỄ sá»­a đổi tilde tháș„p"] # 0x2f7 (en: 'modifier low tilde') - - "Ëž": [t: "cĂŽng cỄ sá»­a đổi nĂąng đáșĄi trĂ ng"] # 0x2f8 (en: 'modifier raised colon') - - "Ëč": [t: "cĂŽng cỄ sá»­a đổi báșŻt đáș§u Ăąm cao"] # 0x2f9 (en: 'modifier begin high tone') - - "Ëș": [t: "cĂŽng cỄ sá»­a đổi káșżt thĂșc Ăąm cao"] # 0x2fa (en: 'modifier end high tone') - - "Ë»": [t: "cĂŽng cỄ sá»­a đổi báșŻt đáș§u Ăąm tháș„p"] # 0x2fb (en: 'modifier begin low tone') - - "ËŒ": [t: "cĂŽng cỄ sá»­a đổi káșżt thĂșc Ăąm tháș„p"] # 0x2fc (en: 'modifier end low tone') - - "Ëœ": [t: "kệ điều chỉnh"] # 0x2fd (en: 'modifier shelf') - - "ËŸ": [t: "cĂŽng cỄ sá»­a đổi kệ mở"] # 0x2fe (en: 'modifier open shelf') - - "Ëż": [t: "cĂŽng cỄ sá»­a đổi mĆ©i tĂȘn tháș„p bĂȘn trĂĄi"] # 0x2ff (en: 'modifier low left arrow') - - "̈": [t: "tinh chỉnh diaeresis"] # 0x308 (en: 'diaeresis embellishment') - - "̉": [t: "mĂłc trĂȘn tĂŽ điểm"] # 0x309 (en: 'hook above embellishment') - - "̊": [t: "ring trĂȘn tĂŽn táșĄo"] # 0x30a (en: 'ring above embellishment') - - "̋": [t: "double cáș„p tĂ­nh tĂŽ điểm"] # 0x30b (en: 'double acute accent embellishment') - - "̌": [t: "kiểm tra"] # 0x30c (en: 'check') - - "̍": [t: "đường tháșłng đứng trĂȘn tĂŽ điểm"] # 0x30d (en: 'vertical line above embellishment') - - "̎": [t: "double dĂČng tháșłng đứng trĂȘn tĂŽ điểm"] # 0x30e (en: 'double vertical line above embellishment') - - "̏": [t: "double grave ecrent song sá»±"] # 0x30f (en: 'double grave accent embellishment') - - "̐": [t: "tinh chỉnh candrabindu"] # 0x310 (en: 'candrabindu embellishment') - - "̑": [t: "đáșŁo ngÆ°á»Łc sá»± tĂŽ điểm breve"] # 0x311 (en: 'inverted breve embellishment') - - "̒": [t: "biáșżn dáș„u pháș©y trĂȘn tĂŽn táșĄo"] # 0x312 (en: 'turned comma above embellishment') - - "̓": [t: "dáș„u pháș©y trĂȘn tĂŽn táșĄo"] # 0x313 (en: 'comma above embellishment') - - "̔": [t: "phĂĄo đáșŁo dáș„u pháș©y trĂȘn tĂŽn táșĄo"] # 0x314 (en: 'reversed comma above embellishment') - - "̕": [t: "dáș„u pháș©y ở trĂȘn chỉnh trang bĂȘn pháșŁi"] # 0x315 (en: 'comma above right embellishment') - - "̖": [t: "điểm nháș„n nghiĂȘm trọng dưới sá»± tĂŽn táșĄo"] # 0x316 (en: 'grave accent below embellishment') - - "̗": [t: "điểm nháș„n cáș„p tĂ­nh dưới sá»± tĂŽ điểm"] # 0x317 (en: 'acute accent below embellishment') - - "̘": [t: "trĂĄi bĂȘn dưới sá»± tĂŽn táșĄo"] # 0x318 (en: 'left tack below embellishment') - - "̙": [t: "pháșŁi tad dưới sá»± tĂŽn táșĄo"] # 0x319 (en: 'right tack below embellishment') - - "̚": [t: "gĂłc trĂĄi phĂ­a trĂȘn sá»± tĂŽ điểm"] # 0x31a (en: 'left angle above embellishment') - - "̛": [t: "sừng tĂŽ điểm"] # 0x31b (en: 'horn embellishment') - - "̜": [t: "một ná»­a vĂČng trĂĄi bĂȘn dưới sá»± tĂŽ điểm"] # 0x31c (en: 'left half ring below embellishment') - - "̝": [t: "up tack bĂȘn dưới sá»± tĂŽ điểm"] # 0x31d (en: 'up tack below embellishment') - - "̞": [t: "xuống dưới sá»± tĂŽn táșĄo"] # 0x31e (en: 'down tack below embellishment') - - "̟": [t: "cộng với dáș„u hiệu dưới đñy tĂŽ điểm"] # 0x31f (en: 'plus sign below embellishment') - - "Ì ": [t: "trừ dáș„u hiệu dưới đñy tĂŽ điểm"] # 0x320 (en: 'minus sign below embellishment') - - "ÌĄ": [t: "mĂłc vĂČm miệng bĂȘn dưới sá»± tĂŽ điểm"] # 0x321 (en: 'palatalized hook below embellishment') - - "Ìą": [t: "retroflex hook dưới sá»± tĂŽ điểm"] # 0x322 (en: 'retroflex hook below embellishment') - - "ÌŁ": [t: "dot dưới sá»± tĂŽ điểm"] # 0x323 (en: 'dot below embellishment') - - "Ì€": [t: "diaeresis dưới sá»± tĂŽ điểm"] # 0x324 (en: 'diaeresis below embellishment') - - "Ì„": [t: "nháș«n dưới sá»± tĂŽ điểm"] # 0x325 (en: 'ring below embellishment') - - "ÌŠ": [t: "dáș„u pháș©y dưới sá»± tĂŽn táșĄo"] # 0x326 (en: 'comma below embellishment') - - "̧": [t: "tinh chỉnh cedilla"] # 0x327 (en: 'cedilla embellishment') - - "Ìš": [t: "ogonek tĂŽ điểm"] # 0x328 (en: 'ogonek embellishment') - - "Ì©": [t: "đường tháșłng đứng dưới sá»± tĂŽ điểm"] # 0x329 (en: 'vertical line below embellishment') - - "ÌȘ": [t: "cáș§u dưới sá»± tĂŽ điểm"] # 0x32a (en: 'bridge below embellishment') - - "Ì«": [t: "đáșŁo ngÆ°á»Łc đîi vĂČm dưới sá»± tĂŽ điểm"] # 0x32b (en: 'inverted double arch below embellishment') - - "ÌŹ": [t: "caron dưới sá»± tĂŽn táșĄo"] # 0x32c (en: 'caron below embellishment') - - "Ì­": [t: "vĂČng trĂČn Ăąm thanh dưới sá»± tĂŽ điểm"] # 0x32d (en: 'circumflex accent below embellishment') - - "Ìź": [t: "breve dưới sá»± tĂŽn táșĄo"] # 0x32e (en: 'breve below embellishment') - - "ÌŻ": [t: "đáșŁo ngÆ°á»Łc breve dưới sá»± tĂŽ điểm"] # 0x32f (en: 'inverted breve below embellishment') - - "̰": [t: "tilde dưới sá»± tĂŽn táșĄo"] # 0x330 (en: 'tilde below embellishment') - - "̱": [t: "macron dưới sá»± tĂŽ điểm"] # 0x331 (en: 'macron below embellishment') - - "ÌČ": [t: "tinh chỉnh dĂČng tháș„p"] # 0x332 (en: 'low line embellishment') - - "Ìł": [t: "double line dĂČng tĂŽ điểm"] # 0x333 (en: 'double low line embellishment') - - "ÌŽ": [t: "tinh chỉnh lớp phá»§ tilde"] # 0x334 (en: 'tilde overlay embellishment') - - "Ì”": [t: "tiáșżng gáșĄch ngáșŻn tĂŽ điểm"] # 0x335 (en: 'short stroke overlay embellishment') - - "̶": [t: "tinh chỉnh lớp phá»§ dĂ i"] # 0x336 (en: 'long stroke overlay embellishment') - - "Ì·": [t: "slidus lớp phá»§ ngáșŻn gọn"] # 0x337 (en: 'short solidus overlay embellishment') - - "Ìž": [t: "tinh chỉnh lớp phá»§ solidus dĂ i"] # 0x338 (en: 'long solidus overlay embellishment') - - "Ìč": [t: "một ná»­a vĂČng bĂȘn pháșŁi bĂȘn dưới sá»± tĂŽ điểm"] # 0x339 (en: 'right half ring below embellishment') - - "Ìș": [t: "cáș§u đáșŁo dưới sá»± tĂŽn táșĄo"] # 0x33a (en: 'inverted bridge below embellishment') - - "Ì»": [t: "hĂŹnh vuĂŽng dưới sá»± tĂŽ điểm"] # 0x33b (en: 'square below embellishment') - - "ÌŒ": [t: "seagull dưới sá»± tĂŽn táșĄo"] # 0x33c (en: 'seagull below embellishment') - - "Ìœ": [t: "x trĂȘn tĂŽ điểm"] # 0x33d (en: 'x above embellishment') - - "ÌŸ": [t: "tinh chỉnh tilde dọc"] # 0x33e (en: 'vertical tilde embellishment') - - "Ìż": [t: "double overline tĂŽ điểm"] # 0x33f (en: 'double overline embellishment') - - "̀": [t: "grave tone đánh dáș„u dáș„u áș„n"] # 0x340 (en: 'grave tone mark embellishment') - - "́": [t: "giai điệu cáș„p tĂ­nh đánh dáș„u dáș„u áș„n"] # 0x341 (en: 'acute tone mark embellishment') - - - "ÎȘΫϏ": # 0x3aa, 0x3ab, 0x3cf - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [t: "háș­u quáșŁ"] # (en: 'cap') - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [spell: "translate('.', 'ÎȘΫϏ', 'Îčυϗ')"] - - t: "với dialytika" # (en: 'with dialytika') - - "ϊ": [t: "iota với dialytika"] # 0x3ca (en: 'iota with dialytika') - - "ϋ": [t: "upsilon với dialytika"] # 0x3cb (en: 'upsilon with dialytika') - - "ό": [t: "omicron với tonos"] # 0x3cc (en: 'omicron with tonos') - - "ύ": [t: "upsilon với tonos"] # 0x3cd (en: 'upsilon with tonos') - - "ώ": [t: "omega với tonos"] # 0x3ce (en: 'omega with tonos') - - "ϐ": [t: "beta"] # 0x3d0 - - "ϑ": [t: "theta"] # 0x3d1 - - "ϒ": [t: "upsilon với mĂłc"] # 0x3d2 (en: 'upsilon with hook') - - "ϓ": [t: "upsilon với cáș„p tĂ­nh vĂ  mĂłc"] # 0x3d3 (en: 'upsilon with acute and hook') - - "ϔ": [t: "upsilon với dieresis vĂ  hook"] # 0x3d4 (en: 'upsilon with diaeresis and hook') - - "ϗ": [t: "kai"] # 0x3d7 - - "А-ĐŻ": # 0x410 - 0x42f - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [t: "háș­u quáșŁ"] # (en: 'cap') - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [spell: "translate('.', 'ĐĐ‘Đ’Đ“Đ”Đ•Đ–Đ—Đ˜Đ™ĐšĐ›ĐœĐĐžĐŸĐ ĐĄĐąĐŁĐ€Đ„ĐŠĐ§ĐšĐ©ĐȘЫЏЭПЯ', 'абĐČгЎДжзОĐčĐșĐ»ĐŒĐœĐŸĐżŃ€ŃŃ‚ŃƒŃ„Ń…Ń†Ń‡ŃˆŃ‰ŃŠŃ‹ŃŒŃŃŽŃ')"] - - "а": [t: "а"] # 0x430 (en: 'a') - - "б": [t: "thĂŹ lĂ  ở"] # 0x431 (en: 'be') - - "ĐČ": [t: "đã"] # 0x432 (en: 've') - - "Đł": [t: "ghe"] # 0x433 - - "ĐŽ": [t: "de"] # 0x434 - - "Đ”": [t: "i e"] # 0x435 (en: 'ie') - - "ж": [t: "zhe"] # 0x436 - - "Đ·": [t: "ze"] # 0x437 - - "Đž": [t: "Đž"] # 0x438 (en: 'i') - - "Đč": [t: "ngáșŻn i"] # 0x439 (en: 'short i') - - "Đș": [t: "ka"] # 0x43a - - "Đ»": [t: "el"] # 0x43b - - "ĐŒ": [t: "em"] # 0x43c - - "Đœ": [t: "en"] # 0x43d - - "ĐŸ": [t: "ĐŸ"] # 0x43e (en: 'o') - - "Đż": [t: "thể dỄc"] # 0x43f (en: 'pe') - - "р": [t: "er"] # 0x440 - - "с": [t: "es"] # 0x441 - - "т": [t: "te"] # 0x442 - - "у": [t: "у"] # 0x443 (en: 'u') - - "ф": [t: "ef"] # 0x444 - - "х": [t: "ha"] # 0x445 - - "ц": [t: "tse"] # 0x446 - - "ч": [t: "che"] # 0x447 - - "ш": [t: "sha"] # 0x448 - - "щ": [t: "shcha"] # 0x449 - - "ъ": [t: "dáș„u hiệu khĂł"] # 0x44a (en: 'hard sign') - - "ы": [t: "yeru"] # 0x44b - - "ь": [t: "dáș„u hiệu mềm"] # 0x44c (en: 'soft sign') - - "э": [t: "э"] # 0x44d (en: 'e') - - "ю": [t: "yu"] # 0x44e - - "я": [t: "ya"] # 0x44f - - "‐": [t: "báșŻt gáșĄch"] # 0x2010 (en: 'hyphen') - - "‑": [t: "báșŻt gáșĄch"] # 0x2011 (en: 'hyphen') - - "‒": [t: "hĂŹnh dash"] # 0x2012 (en: 'figure dash') - - "‱": [t: "đáșĄn"] # 0x2022 (en: 'bullet') - - "‰": [t: "mỗi mille"] # 0x2030 (en: 'per mille') - - "‱": [t: "mỗi mười nghĂŹn"] # 0x2031 (en: 'per ten thousand') - - "‾": [t: "đáșżn"] # 0x2038 (en: 'to the') - - "â€č": [t: "một bĂȘn trĂĄi chỉ gĂłc trĂ­ch dáș«n dáș„u hiệu"] # 0x2039 (en: 'single left pointing angle quote mark') - - "â€ș": [t: "độc thĂąn chỉ gĂłc trĂ­ch dáș«n dáș„u hiệu"] # 0x203a (en: 'single right pointing angle quote mark') - - "‌": [t: "nhĂąn đîi nhĂąn đîi"] # 0x203c (en: 'double factorial') - - "⁄": [T: "trĂȘn"] # 0x2044 - - "⁅": [t: "khung vuĂŽng bĂȘn trĂĄi với quill"] # 0x2045 (en: 'left square bracket with quill') - - "⁆": [t: "khung vuĂŽng bĂȘn pháșŁi với quill"] # 0x2046 (en: 'right square bracket with quill') - - "⁗": [t: "quadruple prime"] # 0x2057 - - "⁠": [t: ""] # 0x2060 - - "⁰": [T: "mĆ© khĂŽng"] # 0x2070 (en: 'to the zeroth power') - - "ⁱ": [T: "mĆ© tĂĄm"] # 0x2071 (en: 'to the eihth power') - - "⁎": [T: "mĆ© bốn"] # 0x2074 (en: 'to the fourth power') - - "⁔": [T: "mĆ© năm"] # 0x2075 (en: 'to the fifth power') - - "⁶": [T: "mĆ© sĂĄu"] # 0x2076 (en: 'to the sixth power') - - "⁷": [T: "mĆ© báșŁy"] # 0x2077 (en: 'to the seventh power') - - "⁞": [T: "mĆ© tĂĄm"] # 0x2078 (en: 'to the eighth power') - - "âč": [T: "mĆ© chĂ­n"] # 0x2079 (en: 'to the ninth power') - - "âș": [t: "superscript plus dáș„u hiệu"] # 0x207a (en: 'superscript plus sign') - - "⁻": [t: "superscript trừ"] # 0x207b (en: 'superscript minus') - - "⁌": [t: "superscript báș±ng dáș„u hiệu"] # 0x207c (en: 'superscript equals sign') - - "⁜": [t: "superscript trĂĄi dáș„u ngoáș·c Ä‘ÆĄn"] # 0x207d (en: 'superscript left parenthesis') - - " ": [t: "superscript bĂȘn pháșŁi dáș„u ngoáș·c Ä‘ÆĄn"] # 0x207e (en: 'superscript right parenthesis') - - "ⁿ": [t: "đáșżn sức máșĄnh ennth"] # 0x207f (en: 'to the ennth power') - - "₀": [t: "Ăąm độ"] # 0x2080 (en: 'sub zero') - - "₁": [t: "phỄ một"] # 0x2081 (en: 'sub one') - - "₂": [t: "phỄ hai"] # 0x2082 (en: 'sub two') - - "₃": [t: "phỄ ba"] # 0x2083 (en: 'sub three') - - "₄": [t: "phỄ bốn"] # 0x2084 (en: 'sub four') - - "₅": [t: "phỄ năm"] # 0x2085 (en: 'sub five') - - "₆": [t: "sub six"] # 0x2086 - - "₇": [t: "phỄ báșŁy"] # 0x2087 (en: 'sub seven') - - "₈": [t: "phỄ táșĄi"] # 0x2088 (en: 'sub eight') - - "₉": [t: "sub nine"] # 0x2089 - - "₊": [t: "scorstcript plus dáș„u hiệu"] # 0x208a (en: 'subscript plus sign') - - "₋": [t: "scorstript minu dáș„u hiệu"] # 0x208b (en: 'subscript minus sign') - - "₌": [t: "chỉ số báș±ng dáș„u hiệu"] # 0x208c (en: 'subscript equals sign') - - "₍": [t: "chỉ số bĂȘn trĂĄi dáș„u ngoáș·c Ä‘ÆĄn"] # 0x208d (en: 'subscript left parenthesis') - - "₎": [t: "scorstist quyền quyền"] # 0x208e (en: 'subscript right parenthesis') - - "ₐ": [t: "sub a"] # 0x2090 (en: 'sub A') - - "ₑ": [t: "sub e"] # 0x2091 (en: 'sub E') - - "ₒ": [t: "sub o"] # 0x2092 (en: 'sub O') - - "ₓ": [t: "sub x"] # 0x2093 (en: 'sub X') - - "ₕ": [t: "sub h"] # 0x2095 (en: 'sub H') - - "ₖ": [t: "sub k"] # 0x2096 (en: 'sub K') - - "ₗ": [t: "sub l"] # 0x2097 (en: 'sub L') - - "ₘ": [t: "sub m"] # 0x2098 (en: 'sub M') - - "ₙ": [t: "sub n"] # 0x2099 (en: 'sub N') - - "ₚ": [t: "sub p"] # 0x209a (en: 'sub P') - - "ₛ": [t: "sub s"] # 0x209b (en: 'sub S') - - "ₜ": [t: "sub t"] # 0x209c (en: 'sub T') - - "₠": [t: "cĂĄc Ä‘ÆĄn vị hiện táșĄi cá»§a chĂąu Ăąu"] # 0x20a0 (en: 'european currenty units') - - "₡": [t: "phối tá»­"] # 0x20a1 (en: 'colons') - - "₱": [t: "cruzeiro"] # 0x20a2 - - "₣": [t: "franc"] # 0x20a3 - - "â‚€": [t: "lira"] # 0x20a4 - - "â‚„": [t: "nhĂ  mĂĄy"] # 0x20a5 (en: 'mills') - - "₩": [t: "naira"] # 0x20a6 - - "₧": [t: "peseta"] # 0x20a7 - - "₹": [t: "rupee"] # 0x20a8 (en: 'rupees') - - "₩": [t: "tháșŻng"] # 0x20a9 (en: 'won') - - "â‚Ș": [t: "sheqels mới"] # 0x20aa (en: 'new sheqels') - - "₫": [t: "dong"] # 0x20ab - - "€": [t: "euro"] # 0x20ac (en: 'euros') - - "₭": [t: "kip"] # 0x20ad - - "₼": [t: "tugrik"] # 0x20ae - - "₯": [t: "drachma"] # 0x20af - - "₰": [t: "đồng xu đức"] # 0x20b0 (en: 'german pennies') - - "₱": [t: "peso"] # 0x20b1 (en: 'pesos') - - "â‚Č": [t: "guaranis"] # 0x20b2 - - "₳": [t: "austral"] # 0x20b3 (en: 'australs') - - "₮": [t: "hryvnias"] # 0x20b4 - - "â‚”": [t: "cedis"] # 0x20b5 - - "₶": [t: "livre tournois"] # 0x20b6 - - "₷": [t: "spesmilos"] # 0x20b7 - - "₾": [t: "tenges"] # 0x20b8 - - "â‚č": [t: "đồng rupee áș„n độ"] # 0x20b9 (en: 'indian rupees') - - "â‚ș": [t: "liras thổ nhÄ© kỳ"] # 0x20ba (en: 'turkish liras') - - "⃐": [t: "trĂĄi harpoon phĂ­a trĂȘn sá»± tĂŽn táșĄo"] # 0x20d0 (en: 'left harpoon above embellishment') - - "⃑": [t: "harpoon bĂȘn pháșŁi trĂȘn tĂŽn táșĄo"] # 0x20d1 (en: 'right harpoon above embellishment') - - "⃒": [t: "tinh chỉnh lớp phá»§ dọc dĂ i"] # 0x20d2 (en: 'long vertical line overlay embellishment') - - "⃓": [t: "tinh chỉnh lớp phá»§ tháșłng đứng ngáșŻn"] # 0x20d3 (en: 'short vertical line overlay embellishment') - - "⃔": [t: "mĆ©i tĂȘn ngÆ°á»Łc chiều kim đồng hồ phĂ­a trĂȘn sá»± tĂŽ điểm"] # 0x20d4 (en: 'anticlockwise arrow above embellishment') - - "⃕": [t: "mĆ©i tĂȘn theo chiều kim đồng hồ phĂ­a trĂȘn sá»± tĂŽ điểm"] # 0x20d5 (en: 'clockwise arrow above embellishment') - - "⃖": [t: "mĆ©i tĂȘn trĂĄi phĂ­a trĂȘn sá»± tĂŽ điểm"] # 0x20d6 (en: 'left arrow above embellishment') - - "⃗": [t: "mĆ©i tĂȘn bĂȘn pháșŁi trĂȘn tĂŽn táșĄo"] # 0x20d7 (en: 'right arrow above embellishment') - - "⃘": [t: "đoáșĄn lĂȘn lớp trang phỄc"] # 0x20d8 (en: 'ring overlay embellishment') - - "⃙": [t: "đoĂ n chiều theo chiều kim đồng hồ tĂŽ điểm"] # 0x20d9 (en: 'clockwise ring overlay embellishment') - - "⃚": [t: "tinh chỉnh lớp phá»§ vĂČng ngÆ°á»Łc chiều kim đồng hồ"] # 0x20da (en: 'anticlockwise ring overlay embellishment') - - "⃛": [t: "ba cháș„m"] # 0x20db (en: 'triple dot') - - "⃜": [t: "cháș„m bốn"] # 0x20dc (en: 'quadruple dot') - - "⃝": [t: "bao quanh tĂŽ điểm vĂČng trĂČn"] # 0x20dd (en: 'enclosing circle embellishment') - - "⃞": [t: "kĂšm theo tĂŽ điểm vuĂŽng"] # 0x20de (en: 'enclosing square embellishment') - - "⃟": [t: "kĂšm theo tĂŽ điểm kim cÆ°ÆĄng"] # 0x20df (en: 'enclosing diamond embellishment') - - "⃠": [t: "kĂšm theo hĂŹnh áșŁnh chao đáșŁo"] # 0x20e0 (en: 'enclosing circle backslash embellishment') - - "⃥": [t: "mĆ©i tĂȘn trĂĄi bĂȘn pháșŁi phĂ­a trĂȘn sá»± tĂŽ điểm"] # 0x20e1 (en: 'left right arrow above embellishment') - - "⃹": [t: "kĂšm theo tĂŽ điểm mĂ n hĂŹnh"] # 0x20e2 (en: 'enclosing screen embellishment') - - "⃣": [t: "kĂšm theo tĂŽ điểm khĂła"] # 0x20e3 (en: 'enclosing keycap embellishment') - - "⃀": [t: "kĂšm theo tĂŽ điểm hĂŹnh tam giĂĄc hướng lĂȘn"] # 0x20e4 (en: 'enclosing upward pointing triangle embellishment') - - "⃄": [t: "đáșŁo ngÆ°á»Łc solidus overlay tĂŽ điểm"] # 0x20e5 (en: 'reverse solidus overlay embellishment') - - "⃊": [t: "tinh chỉnh gáșĄch đîi"] # 0x20e6 (en: 'double verticle stroke embellishment') - - "⃧": [t: "tổ chức biểu tÆ°á»Łng niĂȘn kim"] # 0x20e7 (en: 'annuity symbol embellishment') - - "⃚": [t: "triple underdot"] # 0x20e8 - - "⃩": [t: "cáș§u rộng phĂ­a trĂȘn sá»± tĂŽ điểm"] # 0x20e9 (en: 'wide bridge above embellishment') - - "âƒȘ": [t: "bĂȘn trĂĄi mĆ©i tĂȘn phá»§ lĂȘn sá»± tĂŽ điểm"] # 0x20ea (en: 'leftwards arrow overlay embellishment') - - "⃫": [t: "double solidus overlay overlay tĂŽ điểm"] # 0x20eb (en: 'long double solidus overlay embellishment') - - "⃏": [t: "quyền harpoon với barb downwards tallingation"] # 0x20ec (en: 'rightwards harpoon with barb downwards embellishment') - - "⃭": [t: "harpoon bĂȘn trĂĄi với barb downwwards song sá»±"] # 0x20ed (en: 'leftwards harpoon with barb downwards embellishment') - - "⃟": [t: "mĆ©i tĂȘn trĂĄi bĂȘn dưới sá»± tĂŽ điểm"] # 0x20ee (en: 'left arrow below embellishment') - - "⃯": [t: "mĆ©i tĂȘn pháșŁi dưới sá»± tĂŽn táșĄo"] # 0x20ef (en: 'right arrow below embellishment') - - "⃰": [t: "astersik trĂȘn tĂŽn táșĄo"] # 0x20f0 (en: 'astersik above embellishment') - - "℄": [t: "biểu tÆ°á»Łng đường trung tĂąm"] # 0x2104 (en: 'center line symbol') - - "℅": [t: "quan tĂąm"] # 0x2105 (en: 'care of') - - "℆": [t: "cada una"] # 0x2106 - - "ℇ": [t: "háș±ng số cá»§a euler"] # 0x2107 (en: 'euler's constant') - - "℈": [t: "scruples"] # 0x2108 - - "ℊ": [t: "kịch báșŁn g"] # 0x210a (en: 'script g') - - "ℌℑℹℭ": # 0x210c, 0x2111, 0x2128, 0x212d - - t: "fraktur" - - spell: "translate('.', 'ℌℑℹℭ', 'HIZC')" - - - "â„â„™â„Ÿâ„ż": # 0x210d, 0x2119, 0x213e, 0x213f - - test: - if: "$Verbosity!='Terse'" - then: [t: "cĂș đĂșp"] # (en: 'double struck') - - spell: "translate('.', 'â„â„™â„Ÿâ„ż', 'HPΓΠ')" - - - "ℏ": # 0x210f - - test: - if: "($Verbosity='Terse')" - then: [t: "h bar"] - else: [t: "giáșŁm planck háș±ng số"] # (en: 'reduced planck constant') - - - "â„â„’â„˜â„Źâ„°â„±â„ł": # 0x2110, 0x2112, 0x2118, 0x2130, 0x2131, 0x2133 - - t: "script" - - spell: "translate('.', 'â„â„’â„˜â„Źâ„°â„±â„ł', 'ILPBEFM')" - - - "℔": [t: "báșŁng"] # 0x2114 (en: 'pounds') - - "№": [t: "số"] # 0x2116 (en: 'number') - - "â„„": [t: "ounce"] # 0x2125 (en: 'ounces') - - "℧": [t: "mhos"] # 0x2127 - - "℩": [t: "đã quay iota"] # 0x2129 (en: 'turned iota') - - "ℯ": [t: "kịch báșŁn e"] # 0x212f (en: 'script e') - - # coalesced some chars that use cap letters - - "â„Čâ„ș⅁⅂⅃⅄": # 0x2132, 0x213a, 0x2141, 0x2142, 0x2143, 0x2144 - - test: - - if: "'.' = 'â„ș'" - then: [t: "xoay"] # (en: 'rotated') - - else_if: "'.' = 'â„Č'" - then: [t: "quay"] # (en: 'turned') - - else_if: "'.' = '⅃'" - then: [t: "đáșŁo ngÆ°á»Łc sans-serif"] # (en: 'reversed sans-serif') - else: [t: "biáșżn sans-serif"] # (en: 'turned sans-serif') - - spell: "translate('.', 'â„Čâ„ș⅁⅂⅃⅄', 'FQGLLY')" - - - "℮": [t: "kịch báșŁn o"] # 0x2134 (en: 'script o') - - "â„”": [t: "hồng y chuyển tiáșżp đáș§u tiĂȘn"] # 0x2135 (en: 'first transfinite cardinal') - - "ℶ": [t: "hồng y chuyển tiáșżp thứ hai"] # 0x2136 (en: 'second transfinite cardinal') - - "ℷ": [t: "hồng y transfinite thứ ba"] # 0x2137 (en: 'third transfinite cardinal') - - "ℾ": [t: "hồng y chuyển tiáșżp thứ tư"] # 0x2138 (en: 'fourth transfinite cardinal') - - "ℌ": [t: "double táș„n cĂŽng pi"] # 0x213c (en: 'double struck pi') - - "ℜ": [t: "double táș„n cĂŽng gamma"] # 0x213d (en: 'double struck gamma') - - "⅀": [t: "double táș„n cĂŽng tổng n-ary"] # 0x2140 (en: 'double struck n-ary summation') - - "⅋": [t: "quay ampersand"] # 0x214b (en: 'turned ampersand') - - "⅌": [t: "mỗi"] # 0x214c (en: 'per') - - "ⅎ": [t: "báș­t f"] # 0x214e (en: 'turned F') - - "⅐": [T: "một pháș§n báșŁy"] # 0x2150 (en: 'one seventh') - - "⅑": [T: "một pháș§n chĂ­n"] # 0x2151 (en: 'one ninth') - - "⅒": [T: "một pháș§n mười"] # 0x2152 (en: 'one tenth') - - "⅓": [T: "một pháș§n ba"] # 0x2153 (en: 'one third') - - "⅔": [T: "hai pháș§n ba"] # 0x2154 (en: 'two thirds') - - "⅕": [T: "một pháș§n năm"] # 0x2155 (en: 'one fifth') - - "⅖": [T: "hai pháș§n năm"] # 0x2156 (en: 'two fifths') - - "⅗": [T: "ba pháș§n năm"] # 0x2157 (en: 'three fifths') - - "⅘": [T: "bốn pháș§n năm"] # 0x2158 (en: 'four fifths') - - "⅙": [T: "một pháș§n sĂĄu"] # 0x2159 (en: 'one sixth') - - "⅚": [T: "năm pháș§n sĂĄu"] # 0x215a (en: 'five sixths') - - "⅛": [T: "một pháș§n tĂĄm"] # 0x215b (en: 'one eighth') - - "⅜": [T: "ba pháș§n tĂĄm"] # 0x215c (en: 'three eighths') - - "⅝": [T: "năm pháș§n tĂĄm"] # 0x215d (en: 'five eighths') - - "⅞": [T: "báșŁy pháș§n tĂĄm"] # 0x215e (en: 'seven eighths') - - "⅟": [T: "một trĂȘn"] # 0x215f (en: 'one over') - - "Ⅰ": [t: "Ⅰ"] # 0x2160 (en: 'I') - - "Ⅱ": [t: "tĂŽi i"] # 0x2161 (en: 'I I') - - "ⅱ": [t: "tĂŽi i i"] # 0x2162 (en: 'I I I') - - "Ⅳ": [t: "tĂŽi v"] # 0x2163 (en: 'I V') - - "â…€": [t: "â…€"] # 0x2164 (en: 'V') - - "â…„": [t: "v i"] # 0x2165 (en: 'V I') - - "Ⅹ": [t: "v i i"] # 0x2166 (en: 'V I I') - - "Ⅷ": [t: "v i i i"] # 0x2167 (en: 'V I I I') - - "ⅹ": [t: "tĂŽi x"] # 0x2168 (en: 'I X') - - "Ⅹ": [t: "Ⅹ"] # 0x2169 (en: 'X') - - "â…Ș": [t: "x i"] # 0x216a (en: 'X I') - - "Ⅻ": [t: "x i i"] # 0x216b (en: 'X I I') - - "Ⅼ": [t: "Ⅼ"] # 0x216c (en: 'L') - - "Ⅽ": [t: "Ⅽ"] # 0x216d (en: 'C') - - "ⅼ": [t: "ⅼ"] # 0x216e (en: 'D') - - "Ⅿ": [t: "Ⅿ"] # 0x216f (en: 'M') - - "ⅰ": [t: "ⅰ"] # 0x2170 (en: 'I') - - "ⅱ": [t: "tĂŽi i"] # 0x2171 (en: 'I I') - - "â…Č": [t: "tĂŽi i i"] # 0x2172 (en: 'I I I') - - "ⅳ": [t: "tĂŽi v"] # 0x2173 (en: 'I V') - - "Ⅾ": [t: "Ⅾ"] # 0x2174 (en: 'V') - - "â…”": [t: "v i"] # 0x2175 (en: 'V I') - - "ⅶ": [t: "v i i"] # 0x2176 (en: 'V I I') - - "ⅷ": [t: "v i i i"] # 0x2177 (en: 'V I I I') - - "ⅾ": [t: "tĂŽi x"] # 0x2178 (en: 'I X') - - "â…č": [t: "â…č"] # 0x2179 (en: 'X') - - "â…ș": [t: "x i"] # 0x217a (en: 'X I') - - "ⅻ": [t: "x i i"] # 0x217b (en: 'X I I') - - "â…Œ": [t: "â…Œ"] # 0x217c (en: 'L') - - "â…œ": [t: "â…œ"] # 0x217d (en: 'C') - - "â…Ÿ": [t: "â…Ÿ"] # 0x217e (en: 'D') - - "ⅿ": [t: "ⅿ"] # 0x217f (en: 'M') - - "↉": [t: "khĂŽng cĂł một pháș§n ba"] # 0x2189 (en: 'zero thirds') - - "↔": [t: "tÆ°ÆĄng Ä‘Æ°ÆĄng"] # 0x2194 (en: 'left right arrow') - - "↕": [t: "lĂȘn mĆ©i tĂȘn xuống"] # 0x2195 (en: 'up down arrow') - - "↖": [t: "mĆ©i tĂȘn tĂąy báșŻc"] # 0x2196 (en: 'north west arrow') - - "↗": # 0x2197 - - test: - if: "ancestor::*[2][self::m:limit]" - then: [t: "cĂĄch tiáșżp cáș­n từ bĂȘn dưới"] # (en: 'approaches from below') - else: [t: "mĆ©i tĂȘn đîng báșŻc"] # (en: 'north east arrow') - - - "↘": # 0x2198 - - test: - if: "ancestor::*[2][self::m:limit]" - then: [t: "cĂĄch tiáșżp cáș­n từ trĂȘn cao"] # (en: 'approaches from above') - else: [t: "mĆ©i tĂȘn đîng nam"] # (en: 'south east arrow') - - - "↙": [t: "mĆ©i tĂȘn tĂąy nam"] # 0x2199 (en: 'south west arrow') - - "↚": [t: "mĆ©i tĂȘn trĂĄi với gáșĄch"] # 0x219a (en: 'leftwards arrow with stroke') - - "↛": [t: "mĆ©i tĂȘn pháșŁi với gáșĄch"] # 0x219b (en: 'rightwards arrow with stroke') - - "↜": [t: "mĆ©i tĂȘn sĂłng trĂĄi"] # 0x219c (en: 'leftwards wave arrow') - - "↝": [t: "mĆ©i tĂȘn sĂłng bĂȘn pháșŁi"] # 0x219d (en: 'rightwards wave arrow') - - "↞": [t: "bĂȘn trĂĄi hai mĆ©i tĂȘn đáș§u"] # 0x219e (en: 'leftwards two headed arrow') - - "↟": [t: "lĂȘn tới hai mĆ©i tĂȘn đáș§u"] # 0x219f (en: 'upwards two headed arrow') - - "↠": [t: "pháșŁi hai mĆ©i tĂȘn hai đáș§u"] # 0x21a0 (en: 'rightwards two headed arrow') - - "↡": [t: "xuống hai mĆ©i tĂȘn đáș§u"] # 0x21a1 (en: 'downwards two headed arrow') - - "↱": [t: "mĆ©i tĂȘn trĂĄi cĂł đuĂŽi"] # 0x21a2 (en: 'leftwards arrow with tail') - - "↣": [t: "mĆ©i tĂȘn pháșŁi cĂł đuĂŽi"] # 0x21a3 (en: 'rightwards arrow with tail') - - "ↀ": [t: "mĆ©i tĂȘn trĂĄi từ thanh"] # 0x21a4 (en: 'leftwards arrow from bar') - - "ↄ": [t: "mĆ©i tĂȘn hướng lĂȘn từ thanh"] # 0x21a5 (en: 'upwards arrow from bar') - - "↩": [t: "mĆ©i tĂȘn bĂȘn pháșŁi từ thanh"] # 0x21a6 (en: 'rightwards arrow from bar') - - "↧": [t: "mĆ©i tĂȘn xuống từ thanh"] # 0x21a7 (en: 'downwards arrow from bar') - - "↹": [t: "lĂȘn mĆ©i tĂȘn xuống với cÆĄ sở"] # 0x21a8 (en: 'up down arrow with base') - - "↩": [t: "mĆ©i tĂȘn trĂĄi với mĂłc"] # 0x21a9 (en: 'leftwards arrow with hook') - - "â†Ș": [t: "mĆ©i tĂȘn bĂȘn pháșŁi với mĂłc"] # 0x21aa (en: 'rightwards arrow with hook') - - "↫": [t: "mĆ©i tĂȘn trĂĄi với vĂČng láș·p"] # 0x21ab (en: 'leftwards arrow with loop') - - "↬": [t: "mĆ©i tĂȘn pháșŁi với vĂČng láș·p"] # 0x21ac (en: 'rightwards arrow with loop') - - "↭": [t: "mĆ©i tĂȘn bĂȘn trĂĄi bĂȘn pháșŁi"] # 0x21ad (en: 'left right wave arrow') - - "↼": [t: "mĆ©i tĂȘn trĂĄi bĂȘn pháșŁi với gáșĄch"] # 0x21ae (en: 'left right arrow with stroke') - - "↯": [t: "mĆ©i tĂȘn ngoáș±n ngoĂšo xuống"] # 0x21af (en: 'downwards zigzag arrow') - - "↰": [t: "mĆ©i tĂȘn hướng lĂȘn với đáș§u trĂĄi"] # 0x21b0 (en: 'upwards arrow with tip leftwards') - - "↱": [t: "mĆ©i tĂȘn hướng lĂȘn với đáș§u bĂȘn pháșŁi"] # 0x21b1 (en: 'upwards arrow with tip rightwards') - - "â†Č": [t: "mĆ©i tĂȘn xuống với đáș§u trĂĄi"] # 0x21b2 (en: 'downwards arrow with tip leftwards') - - "↳": [t: "mĆ©i tĂȘn xuống với đáș§u bĂȘn pháșŁi"] # 0x21b3 (en: 'downwards arrow with tip rightwards') - - "↮": [t: "mĆ©i tĂȘn bĂȘn pháșŁi với gĂłc xuống"] # 0x21b4 (en: 'rightwards arrow with corner downwards') - - "↔": [t: "mĆ©i tĂȘn xuống với gĂłc trĂĄi"] # 0x21b5 (en: 'downwards arrow with corner leftwards') - - "↶": [t: "mĆ©i tĂȘn bĂĄn nguyệt trĂȘn cĂčng theo chiều kim đồng hồ"] # 0x21b6 (en: 'anticlockwise top semicircle arrow') - - "↷": [t: "mĆ©i tĂȘn bĂĄn nguyệt trĂȘn cĂčng theo chiều kim đồng hồ"] # 0x21b7 (en: 'clockwise top semicircle arrow') - - "↾": [t: "mĆ©i tĂȘn tĂąy báșŻc đáșżn long bar"] # 0x21b8 (en: 'north west arrow to long bar') - - "â†č": [t: "mĆ©i tĂȘn trĂĄi để thanh trĂȘn mĆ©i tĂȘn pháșŁi vĂ o thanh"] # 0x21b9 (en: 'leftwards arrow to bar over rightwards arrow to bar') - - "â†ș": [t: "mĆ©i tĂȘn vĂČng trĂČn mở theo chiều kim đồng hồ"] # 0x21ba (en: 'anticlockwise open circle arrow') - - "↻": [t: "mĆ©i tĂȘn vĂČng trĂČn mở theo chiều kim đồng hồ"] # 0x21bb (en: 'clockwise open circle arrow') - - "↌": [t: "trĂĄi harpoon lĂȘn"] # 0x21bc (en: 'left harpoon up') - - "↜": [t: "rời harpoon xuống"] # 0x21bd (en: 'left harpoon down') - - "↟": [t: "up harpoon pháșŁi"] # 0x21be (en: 'up harpoon right') - - "↿": [t: "lĂȘn harpoon trĂĄi"] # 0x21bf (en: 'up harpoon left') - - "⇀": [t: "quyền harpoon lĂȘn"] # 0x21c0 (en: 'right harpoon up') - - "⇁": [t: "harpoon pháșŁi xuống"] # 0x21c1 (en: 'right harpoon down') - - "⇂": [t: "xuống harpoon pháșŁi"] # 0x21c2 (en: 'down harpoon right') - - "⇃": [t: "xuống harpoon trĂĄi"] # 0x21c3 (en: 'down harpoon left') - - "⇄": [t: "mĆ©i tĂȘn pháșŁi qua mĆ©i tĂȘn trĂĄi"] # 0x21c4 (en: 'rightwards arrow over leftwards arrow') - - "⇅": [t: "mĆ©i tĂȘn hướng lĂȘn bĂȘn trĂĄi cá»§a mĆ©i tĂȘn xuống"] # 0x21c5 (en: 'upwards arrow leftwards of downwards arrow') - - "⇆": [t: "mĆ©i tĂȘn trĂĄi qua mĆ©i tĂȘn pháșŁi"] # 0x21c6 (en: 'leftwards arrow over rightwards arrow') - - "⇇": [t: "mĆ©i tĂȘn Ä‘Æ°á»Łc ghĂ©p nối trĂĄi"] # 0x21c7 (en: 'leftwards paired arrows') - - "⇈": [t: "mĆ©i tĂȘn đi lĂȘn trĂȘn"] # 0x21c8 (en: 'upwards paired arrows') - - "⇉": [t: "mĆ©i tĂȘn Ä‘Æ°á»Łc ghĂ©p ngay"] # 0x21c9 (en: 'rightwards paired arrows') - - "⇊": [t: "mĆ©i tĂȘn đi xuống"] # 0x21ca (en: 'downwards paired arrows') - - "⇋": [t: "trĂĄi harpoon qua harpoon pháșŁi"] # 0x21cb (en: 'left harpoon over right harpoon') - - "⇌": [t: "harpoon pháșŁi qua harpoon trĂĄi"] # 0x21cc (en: 'right harpoon over left harpoon') - - "⇍": [t: "mĆ©i tĂȘn đîi bĂȘn trĂĄi với gáșĄch"] # 0x21cd (en: 'leftwards double arrow with stroke') - - "⇎": [t: "mĆ©i tĂȘn kĂ©p bĂȘn trĂĄi với gáșĄch"] # 0x21ce (en: 'left right double arrow with stroke') - - "⇏": [t: "mĆ©i tĂȘn kĂ©p pháșŁi với gáșĄch"] # 0x21cf (en: 'rightwards double arrow with stroke') - - "⇐": [t: "mĆ©i tĂȘn đîi trĂĄi"] # 0x21d0 (en: 'leftwards double arrow') - - "⇑": [t: "mĆ©i tĂȘn tăng gáș„p đîi"] # 0x21d1 (en: 'upwards double arrow') - - "⇓": [t: "xuống mĆ©i tĂȘn đîi"] # 0x21d3 (en: 'downwards double arrow') - - "⇔": [t: "tÆ°ÆĄng Ä‘Æ°ÆĄng"] # 0x21d4 (en: 'left right double arrow') - - "⇕": [t: "lĂȘn xuống mĆ©i tĂȘn đîi"] # 0x21d5 (en: 'up down double arrow') - - "⇖": [t: "mĆ©i tĂȘn đîi tĂąy báșŻc"] # 0x21d6 (en: 'north west double arrow') - - "⇗": [t: "mĆ©i tĂȘn đîi đîng báșŻc"] # 0x21d7 (en: 'north east double arrow') - - "⇘": [t: "mĆ©i tĂȘn đîi đîng nam"] # 0x21d8 (en: 'south east double arrow') - - "⇙": [t: "mĆ©i tĂȘn đîi tĂąy nam"] # 0x21d9 (en: 'south west double arrow') - - "⇚": [t: "mĆ©i tĂȘn ba bĂȘn trĂĄi"] # 0x21da (en: 'leftwards triple arrow') - - "⇛": [t: "mĆ©i tĂȘn ba bĂȘn pháșŁi"] # 0x21db (en: 'rightwards triple arrow') - - "⇜": [t: "mĆ©i tĂȘn bĂȘn trĂĄi"] # 0x21dc (en: 'leftwards squiggle arrow') - - "⇝": [t: "mĆ©i tĂȘn squiggle pháșŁi"] # 0x21dd (en: 'rightwards squiggle arrow') - - "⇞": [t: "mĆ©i tĂȘn hướng lĂȘn với cĂș đánh đîi"] # 0x21de (en: 'upwards arrow with double stroke') - - "⇟": [t: "mĆ©i tĂȘn xuống với cĂș đánh đîi"] # 0x21df (en: 'downwards arrow with double stroke') - - "⇠": [t: "mĆ©i tĂȘn bĂȘn trĂĄi lao"] # 0x21e0 (en: 'leftwards dashed arrow') - - "⇡": [t: "mĆ©i tĂȘn đi xuống"] # 0x21e1 (en: 'upwards dashed arrow') - - "⇱": [t: "mĆ©i tĂȘn đứt pháșŁi bĂȘn pháșŁi"] # 0x21e2 (en: 'rightwards dashed arrow') - - "⇣": [t: "mĆ©i tĂȘn xuống xuống"] # 0x21e3 (en: 'downwards dashed arrow') - - "⇀": [t: "mĆ©i tĂȘn trĂĄi vĂ o thanh"] # 0x21e4 (en: 'leftwards arrow to bar') - - "⇄": [t: "mĆ©i tĂȘn pháșŁi vĂ o thanh"] # 0x21e5 (en: 'rightwards arrow to bar') - - "⇩": [t: "mĆ©i tĂȘn tráșŻng bĂȘn trĂĄi"] # 0x21e6 (en: 'leftwards white arrow') - - "⇧": [t: "mĆ©i tĂȘn tráșŻng hướng lĂȘn trĂȘn"] # 0x21e7 (en: 'upwards white arrow') - - "⇹": [t: "mĆ©i tĂȘn tráșŻng bĂȘn pháșŁi"] # 0x21e8 (en: 'rightwards white arrow') - - "⇩": [t: "mĆ©i tĂȘn tráșŻng xuống"] # 0x21e9 (en: 'downwards white arrow') - - "â‡Ș": [t: "mĆ©i tĂȘn tráșŻng hướng lĂȘn từ thanh"] # 0x21ea (en: 'upwards white arrow from bar') - - "⇫": [t: "mĆ©i tĂȘn mĂ u tráșŻng lĂȘn trĂȘn bệ"] # 0x21eb (en: 'upwards white arrow on pedestal') - - "⇬": [t: "mĆ©i tĂȘn mĂ u tráșŻng lĂȘn trĂȘn bệ với thanh ngang"] # 0x21ec (en: 'upwards white arrow on pedestal with horizontal bar') - - "⇭": [t: "mĆ©i tĂȘn mĂ u tráșŻng lĂȘn trĂȘn bệ với thanh dọc"] # 0x21ed (en: 'upwards white arrow on pedestal with vertical bar') - - "⇼": [t: "mĆ©i tĂȘn đîi mĂ u tráșŻng"] # 0x21ee (en: 'upwards white double arrow') - - "⇯": [t: "mĆ©i tĂȘn đîi mĂ u tráșŻng lĂȘn trĂȘn bệ"] # 0x21ef (en: 'upwards white double arrow on pedestal') - - "⇰": [t: "mĆ©i tĂȘn tráșŻng bĂȘn pháșŁi từ tường"] # 0x21f0 (en: 'rightwards white arrow from wall') - - "⇱": [t: "mĆ©i tĂȘn tĂąy báșŻc đáșżn gĂłc"] # 0x21f1 (en: 'north west arrow to corner') - - "â‡Č": [t: "mĆ©i phĂ­a đîng mĆ©i tĂȘn đáșżn gĂłc"] # 0x21f2 (en: 'south east arrow to corner') - - "⇳": [t: "lĂȘn mĆ©i tĂȘn tráșŻng"] # 0x21f3 (en: 'up down white arrow') - - "⇮": [t: "mĆ©i tĂȘn pháșŁi với vĂČng trĂČn nhỏ"] # 0x21f4 (en: 'right arrow with small circle') - - "⇔": [t: "mĆ©i tĂȘn xuống bĂȘn trĂĄi cá»§a mĆ©i tĂȘn hướng lĂȘn"] # 0x21f5 (en: 'downwards arrow leftwards of upwards arrow') - - "⇶": [t: "ba mĆ©i tĂȘn pháșŁi"] # 0x21f6 (en: 'three rightwards arrows') - - "⇷": [t: "mĆ©i tĂȘn trĂĄi với gáșĄch dọc"] # 0x21f7 (en: 'leftwards arrow with vertical stroke') - - "⇾": [t: "mĆ©i tĂȘn pháșŁi với gáșĄch dọc"] # 0x21f8 (en: 'rightwards arrow with vertical stroke') - - "â‡č": [t: "mĆ©i tĂȘn trĂĄi bĂȘn trĂĄi với gáșĄch dọc"] # 0x21f9 (en: 'left right arrow with vertical stroke') - - "â‡ș": [t: "mĆ©i tĂȘn trĂĄi với gáșĄch dọc"] # 0x21fa (en: 'leftwards arrow with double vertical stroke') - - "⇻": [t: "mĆ©i tĂȘn pháșŁi với gáșĄch dọc"] # 0x21fb (en: 'rightwards arrow with double vertical stroke') - - "⇌": [t: "mĆ©i tĂȘn trĂĄi bĂȘn trĂĄi với gáșĄch dọc"] # 0x21fc (en: 'left right arrow with double vertical stroke') - - "⇜": [t: "mĆ©i tĂȘn mở bĂȘn trĂĄi"] # 0x21fd (en: 'leftwards open headed arrow') - - "⇟": [t: "mĆ©i tĂȘn mở bĂȘn pháșŁi"] # 0x21fe (en: 'rightwards open headed arrow') - - "⇿": [t: "bĂȘn trĂĄi mĆ©i tĂȘn mở đáș§u"] # 0x21ff (en: 'left right open headed arrow') - - "∁": # 0x2201 - - test: - if: "$Verbosity!='Terse'" - then: [t: "cĂĄc"] # (en: 'the') - - t: "bổ sung" # (en: 'complement of') - - "∋": [t: "chứa thĂ nh viĂȘn"] # 0x220b (en: 'contains the member') - - "∌": [t: "khĂŽng chứa thĂ nh viĂȘn"] # 0x220c (en: 'does not contain the member') - - "∍": [t: "chứa thĂ nh viĂȘn"] # 0x220d (en: 'contains the member') - - "∎": [t: "káșżt thĂșc báș±ng chứng"] # 0x220e (en: 'end of proof') - - "∔": [t: "dot plus"] # 0x2214 - - "∕": [T: "chia"] # 0x2215 - - "∖": [t: "hiệu"] # 0x2216 (en: 'set minus') - - "∙": [T: "nhĂąn"] # 0x2219 - - "∛": # 0x221b - - test: - if: "$Verbosity!='Terse'" - then: [t: "cĂĄc"] # (en: 'the') - - t: "rễ khối cá»§a" # (en: 'cube root of') - - "∜": # 0x221c - - test: - if: "$Verbosity!='Terse'" - then: [t: "cĂĄc"] # (en: 'the') - - t: "gốc thứ tư cá»§a" # (en: 'fourth root of') - - "∹": [t: "gĂłc hĂŹnh cáș§u"] # 0x2222 (en: 'spherical angle') - - "∯": [t: "tĂ­ch hợp bề máș·t"] # 0x222f (en: 'surface integral') - - "∰": [t: "khối lÆ°á»Łng tĂ­ch phĂąn"] # 0x2230 (en: 'volume integral') - - "∱": [t: "tĂ­ch hợp theo chiều kim đồng hồ"] # 0x2231 (en: 'clockwise integral') - - "âˆČ": [t: "tĂ­ch hợp đường viền theo chiều kim đồng hồ"] # 0x2232 (en: 'clockwise contour integral') - - "∳": [t: "tĂ­ch hợp đường viền ngÆ°á»Łc chiều kim đồng hồ"] # 0x2233 (en: 'anticlockwise contour integral') - - "∎": [t: "vĂŹ tháșż"] # 0x2234 (en: 'therefore') - - "∔": [t: "táșĄi vĂŹ"] # 0x2235 (en: 'because') - - "∞": [t: "cháș„m trừ"] # 0x2238 (en: 'dot minus') - - "âˆč": [t: "cĂł dư thừa so với"] # 0x2239 (en: 'has excess compared to') - - "âˆș": # 0x223a - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ  thuáș­n lợi về máș·t hĂŹnh học"] # (en: 'is geometrically proportinal to') - - "∻": # 0x223b - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ  homothetic để"] # (en: 'is homothetic to') - - "≀": [t: "sáșŁn pháș©m vĂČng hoa"] # 0x2240 (en: 'wreath product') - - "≁": [t: "khĂŽng pháșŁi tilde"] # 0x2241 (en: 'not tilde') - - "≂": [t: "trừ tilde"] # 0x2242 (en: 'minus tilde') - - "≃": # 0x2243 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ  khĂŽng cĂł triệu chứng báș±ng"] # (en: 'is asymptotically equal to') - - "≄": # 0x2244 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "khĂŽng cĂł triệu chứng báș±ng" # (en: 'not asymptotically equal to') - - "≅": # 0x2245 - - test: - if: "$Verbosity!='Terse'" - then: [t: "xáș„p xỉ báș±ng"] # (en: 'is approximately equal to') - - "≆": # 0x2246 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "xáș„p xỉ nhưng khĂŽng thá»±c sá»± báș±ng" # (en: 'approximately but not actually equal to') - - "≇": # 0x2247 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "khĂŽng xáș„p xỉ cĆ©ng khĂŽng thá»±c sá»± báș±ng" # (en: 'neither approximately nor actually equal to') - - "≈": # 0x2248 - - test: - if: "$Verbosity!='Terse'" - then: [t: "xáș„p xỉ"] # (en: 'is almost equal to') - - "≉": # 0x2249 - - test: - if: "$Verbosity!='Terse'" - then: [t: " "] # (en: 'is') - - t: "khĂŽng gáș§n báș±ng" # (en: 'not almost equal to') - - "≊": # 0x224a - - test: - if: "$Verbosity!='Terse'" - then: [t: "xáș„p xỉ hoáș·c báș±ng"] # (en: 'is almost equal or equal to') - - "≋": [t: "triple tilde"] # 0x224b - - "≌": [t: "đều báș±ng"] # 0x224c (en: 'are all equal to') - - "≍": # 0x224d - - test: - if: "$Verbosity!='Terse'" - then: [t: "tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # (en: 'is equivalent to') - - "≎": # 0x224e - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ  tÆ°ÆĄng Ä‘Æ°ÆĄng về máș·t hĂŹnh học"] # (en: 'is geometrically equivalent to') - - "≏": # 0x224f - - test: - if: "$Verbosity!='Terse'" - then: [t: "cĂĄc"] # (en: 'the') - - t: "sá»± khĂĄc biệt giữa" # (en: 'difference between') - - "≐": [t: "tiáșżp cáș­n giới háșĄn"] # 0x2250 (en: 'approaches the limit') - - "≑": # 0x2251 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ  báș±ng hĂŹnh học báș±ng"] # (en: 'is geometrically equal to') - - "≒": # 0x2252 - - test: - if: "$Verbosity!='Terse'" - then: [t: "xáș„p xỉ báș±ng hoáș·c hĂŹnh áșŁnh cá»§a"] # (en: 'is approximately equal to or the image of') - - "≓": # 0x2253 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ  hĂŹnh áșŁnh hoáș·c xáș„p xỉ báș±ng"] # (en: 'is the image of or approximately equal to') - - "≔": [t: "đáșĄi tĂĄ báș±ng"] # 0x2254 (en: 'colon equals') - - "≕": [t: "báș±ng đáșĄi trĂ ng"] # 0x2255 (en: 'equals colon') - - "≖": [t: "nháș«n báș±ng"] # 0x2256 (en: 'ring in equal to') - - "≗": # 0x2257 - - test: - if: "$Verbosity!='Terse'" - then: [t: "xáș„p xỉ báș±ng"] # (en: 'is approximately equal to') - - "≘": [t: "tÆ°ÆĄng ứng với"] # 0x2258 (en: 'corresponds to') - - "≙": [t: "ước tĂ­nh"] # 0x2259 (en: 'estimates') - - "≚": # 0x225a - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ  tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # (en: 'is equiangular to') - - "≛": [t: "ngĂŽi sao báș±ng"] # 0x225b (en: 'star equals') - - "≜": [t: "đen ta báș±ng"] # 0x225c (en: 'delta equals') - - "≝": [t: "Ä‘Æ°á»Łc xĂĄc định lĂ  Ä‘Æ°á»Łc"] # 0x225d (en: 'is defined to be') - - "≞": # 0x225e - - test: - if: "$Verbosity!='Terse'" - then: [t: "Ä‘Æ°á»Łc đo báș±ng"] # (en: 'is measured by') - - "≟": [t: "cĂł một mối quan hệ khĂŽng xĂĄc định với"] # 0x225f (en: 'has an unknown relationship with') - - "≱": # 0x2262 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "khĂŽng giống hệt nhau" # (en: 'not identical to') - - "≣": # 0x2263 - - test: - if: "$Verbosity!='Terse'" - then: [t: "hoĂ n toĂ n tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # (en: 'is strictly equivalent to') - - "≹": # 0x2268 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ  Ă­t hÆĄn nhưng khĂŽng báș±ng"] # (en: 'is less than but not equal to') - - "≩": # 0x2269 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lớn hÆĄn nhưng khĂŽng báș±ng"] # (en: 'is greater than but not equal to') - - "â‰Ș": # 0x226a - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ  Ă­t hÆĄn nhiều"] # (en: 'is much less than') - - "≫": # 0x226b - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ  lớn hÆĄn nhiều so với"] # (en: 'is much greater than') - - "≬": # 0x226c - - test: - if: "$Verbosity!='Terse'" - then: [t: "ở giữa"] # (en: 'is between') - - "≭": # 0x226d - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với" # (en: 'not equivalent to') - - "≼": # 0x226e - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "khĂŽng Ă­t hÆĄn" # (en: 'not less than') - - "≯": # 0x226f - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "khĂŽng lớn hÆĄn" # (en: 'not greater than') - - "≰": # 0x2270 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "khĂŽng Ă­t hÆĄn cĆ©ng khĂŽng báș±ng" # (en: 'neither less than nor equal to') - - "≱": # 0x2271 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "khĂŽng lớn hÆĄn cĆ©ng khĂŽng báș±ng" # (en: 'neither greater than nor equal to') - - "â‰Č": # 0x2272 - - test: - if: "$Verbosity!='Terse'" - then: [t: "Ă­t hÆĄn hoáș·c tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # (en: 'is less than or equivalent to') - - "≳": # 0x2273 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lớn hÆĄn hoáș·c tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # (en: 'is greater than or equivalent to') - - "≮": # 0x2274 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "khĂŽng Ă­t hÆĄn cĆ©ng khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với" # (en: 'neither less than nor equivalent to') - - "≔": # 0x2275 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "khĂŽng lớn hÆĄn cĆ©ng khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với" # (en: 'neither greater than nor equivalent to') - - "≶": # 0x2276 - - test: - if: "$Verbosity!='Terse'" - then: [t: "nhỏ hÆĄn hoáș·c lớn hÆĄn"] # (en: 'is less than or greater than') - - "≷": # 0x2277 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lớn hÆĄn hoáș·c Ă­t hÆĄn"] # (en: 'is greater than or less than') - - "≾": # 0x2278 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "khĂŽng Ă­t hÆĄn cĆ©ng khĂŽng lớn hÆĄn" # (en: 'neither less than nor greater than') - - "â‰č": # 0x2279 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "khĂŽng lớn hÆĄn cĆ©ng khĂŽng Ă­t hÆĄn" # (en: 'neither greater than nor less than') - - "≌": [t: "trước hoáș·c báș±ng"] # 0x227c (en: 'precedes or is equal to') - - "≜": [t: "thĂ nh cĂŽng hoáș·c báș±ng"] # 0x227d (en: 'succeeds or is equal to') - - "≟": [t: "trước hoáș·c tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0x227e (en: 'precedes or is equivalent to') - - "≿": [t: "thĂ nh cĂŽng hoáș·c tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0x227f (en: 'succeeds or is equivalent to') - - "⊀": [t: "khĂŽng đi trước"] # 0x2280 (en: 'does not precede') - - "⊁": [t: "khĂŽng thĂ nh cĂŽng"] # 0x2281 (en: 'does not succeed') - - "⊈": # 0x2288 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "khĂŽng pháșŁi lĂ  một táș­p hợp con cĆ©ng khĂŽng báș±ng" # (en: 'neither a subset of nor equal to') - - "⊉": # 0x2289 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "khĂŽng pháșŁi lĂ  một siĂȘu sao cĆ©ng khĂŽng báș±ng" # (en: 'neither a superset of nor equal to') - - "⊊": [t: "táș­p hợp con khĂŽng báș±ng"] # 0x228a (en: 'subset of with not equal to') - - "⊋": [t: "superset cá»§a khĂŽng báș±ng"] # 0x228b (en: 'superset of with not equal to') - - "⊌": [t: "multiset"] # 0x228c - - "⊍": [t: "nhĂąn đa nhĂąn"] # 0x228d (en: 'multiset multiplication') - - "⊎": [t: "liĂȘn minh multiset"] # 0x228e (en: 'multiset union') - - "⊏": [t: "hĂŹnh áșŁnh vuĂŽng cá»§a"] # 0x228f (en: 'square image of') - - "⊐": [t: "báșŁn gốc vuĂŽng cá»§a"] # 0x2290 (en: 'square original of') - - "⊑": [t: "hĂŹnh áșŁnh vuĂŽng hoáș·c báș±ng"] # 0x2291 (en: 'square image of or equal to') - - "⊒": [t: "báșŁn gốc vuĂŽng hoáș·c báș±ng"] # 0x2292 (en: 'square original of or equal to') - - "⊓": [t: "square flowase"] # 0x2293 (en: 'square cap') - - "⊔": [t: "cốc vuĂŽng"] # 0x2294 (en: 'square cup') - - "⊕": [t: "bao quanh cộng"] # 0x2295 (en: 'circled plus') - - "⊖": [t: "khoanh trĂČn trừ đi"] # 0x2296 (en: 'circled minus') - - "⊗": [t: "thời gian khoanh trĂČn"] # 0x2297 (en: 'circled times') - - "⊘": [t: "chia"] # 0x2298 (en: 'circled slash') - - "⊙": [t: "toĂĄn tá»­ cháș„m Ä‘Æ°á»Łc khoanh trĂČn"] # 0x2299 (en: 'circled dot operator') - - "⊚": [t: "vĂČng trĂČn"] # 0x229a (en: 'circled ring') - - "⊛": [t: "asterisk bao quanh"] # 0x229b (en: 'circled asterisk') - - "⊜": [t: "Ä‘Æ°á»Łc khoanh trĂČn báș±ng"] # 0x229c (en: 'circled equals') - - "⊝": [t: "dash Ä‘Æ°á»Łc khoanh trĂČn"] # 0x229d (en: 'circled dash') - - "⊞": [t: "bĂŹnh phÆ°ÆĄng cộng"] # 0x229e (en: 'squared plus') - - "⊟": [t: "bĂŹnh phÆ°ÆĄng trừ"] # 0x229f (en: 'squared minus') - - "⊠": [t: "thời gian bĂŹnh phÆ°ÆĄng"] # 0x22a0 (en: 'squared times') - - "⊡": [t: "toĂĄn tá»­ dot squared"] # 0x22a1 (en: 'squared dot operator') - - "⊱": [t: "chứng minh"] # 0x22a2 (en: 'proves') - - "⊣": [t: "khĂŽng mang láșĄi"] # 0x22a3 (en: 'does not yield') - - "⊀": [t: "đứng đáș§u"] # 0x22a4 (en: 'top') - - "⊄": # 0x22a5 - - test: - if: "$Verbosity!='Terse'" - then: [t: "đáy"] # (en: 'is bottom') - - "⊩": [t: "giáșŁm xuống"] # 0x22a6 (en: 'reduces to') - - "⊧": [t: "mĂŽ hĂŹnh"] # 0x22a7 (en: 'models') - - "⊹": # 0x22a8 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "đĂșng váș­y" # (en: 'true') - - "⊩": [t: "lá»±c lÆ°á»Łng"] # 0x22a9 (en: 'forces') - - "âŠȘ": [t: "thanh ba tháșłng đứng phĂ­a bĂȘn pháșŁi"] # 0x22aa (en: 'triple vertical bar right turnstile') - - "⊫": [t: "thanh dọc theo kĂ©p ráșœ pháșŁi"] # 0x22ab (en: 'double vertical bar double right turnstile') - - "⊬": [t: "khĂŽng chứng minh"] # 0x22ac (en: 'does not prove') - - "⊭": # 0x22ad - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "khĂŽng đĂșng" # (en: 'not true') - - "⊼": [t: "khĂŽng Ă©p buộc"] # 0x22ae (en: 'does not force') - - "⊯": [t: "thanh dọc Ä‘Æ°á»Łc phá»§ định đîi bĂȘn pháșŁi turnstile"] # 0x22af (en: 'negated double vertical bar double right turnstile') - - "⊰": [t: "trước mối quan hệ"] # 0x22b0 (en: 'precedes under relation') - - "⊱": [t: "thĂ nh cĂŽng dưới sá»± quan hệ"] # 0x22b1 (en: 'succeeds under relation') - - "âŠČ": # 0x22b2 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "một nhĂłm con bĂŹnh thường cá»§a" # (en: 'a normal subgroup of') - - "⊳": [t: "chứa như một nhĂłm con bĂŹnh thường"] # 0x22b3 (en: 'contains as a normal subgroup') - - "⊮": # 0x22b4 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "một nhĂłm con bĂŹnh thường hoáș·c báș±ng" # (en: 'a normal subgroup of or equal to') - - "⊔": [t: "chứa một nhĂłm con bĂŹnh thường hoáș·c báș±ng"] # 0x22b5 (en: 'contains as a normal subgroup or equal to') - - "⊶": # 0x22b6 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "báșŁn gốc cá»§a" # (en: 'the original of') - - "⊷": # 0x22b7 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "một hĂŹnh áșŁnh cá»§a" # (en: 'an image of') - - "⊾": [t: "multimap"] # 0x22b8 - - "âŠč": [t: "ma tráș­n liĂȘn hợp hermitian"] # 0x22b9 (en: 'hermitian conjugate matrix') - - "âŠș": [t: "xen káșœ"] # 0x22ba (en: 'intercalate') - - "⊻": [t: "xor"] # 0x22bb - - "⊌": [t: "nand"] # 0x22bc - - "⊜": [t: "cĆ©ng khĂŽng"] # 0x22bd (en: 'nor') - - "⊟": [t: "gĂłc vuĂŽng với hồ quang"] # 0x22be (en: 'right angle with arc') - - "⊿": [t: "tam giĂĄc vuĂŽng"] # 0x22bf (en: 'right triangle') - - "⋀": [t: "hợp lĂœ vĂ "] # 0x22c0 (en: 'logical and') - - "⋁": [t: "hợp lĂœ hoáș·c"] # 0x22c1 (en: 'logical or') - - "⋂": [t: "ngĂŁ tư"] # 0x22c2 (en: 'intersection') - - "⋃": [t: "liĂȘn hiệp"] # 0x22c3 (en: 'union') - - "⋄": [t: "người váș­n hĂ nh kim cÆ°ÆĄng"] # 0x22c4 (en: 'diamond operator') - - "⋅": [T: "nhĂąn"] # 0x22c5 - - "⋆": [T: "nhĂąn"] # 0x22c6 - - "⋇": [T: "nhĂąn chia"] # 0x22c7 (en: 'division times') - - "⋈": [t: "bowtie"] # 0x22c8 - - "⋉": # 0x22c9 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "cĂĄc yáșżu tố bĂŹnh thường bĂȘn trĂĄi sáșŁn pháș©m cá»§a" # (en: 'the left normal factor semidirect product of') - - "⋊": # 0x22ca - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "cĂĄc yáșżu tố bĂŹnh thường đĂșng sáșŁn pháș©m cá»§a" # (en: 'the right normal factor semidirect product of') - - "⋋": # 0x22cb - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "sáșŁn pháș©m bĂĄn káșżt trĂĄi cá»§a" # (en: 'the left semidirect product of') - - "⋌": # 0x22cc - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "sáșŁn pháș©m bĂĄn káșżt đĂșng cá»§a" # (en: 'the right semidirect product of') - - "⋍": [t: "tilde đáșŁo ngÆ°á»Łc báș±ng"] # 0x22cd (en: 'reversed tilde equals') - - "⋎": [t: "xoăn logic hoáș·c"] # 0x22ce (en: 'curly logical or') - - "⋏": [t: "xoăn logic vĂ "] # 0x22cf (en: 'curly logical and') - - "⋐": # 0x22d0 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "một táș­p hợp con kĂ©p cá»§a" # (en: 'a double subset of') - - "⋑": # 0x22d1 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "một siĂȘu siĂȘu nhĂąn cá»§a" # (en: 'a double superset of') - - "⋒": # 0x22d2 - - test: - if: "$Verbosity!='Terse'" - then: [t: "cĂĄc"] # (en: 'the') - - t: "giao lộ kĂ©p cá»§a" # (en: 'double intersection of') - - "⋓": # 0x22d3 - - test: - if: "$Verbosity!='Terse'" - then: [t: "cĂĄc"] # (en: 'the') - - t: "liĂȘn minh kĂ©p cá»§a" # (en: 'double union of') - - "⋔": # 0x22d4 - - test: - if: "$Verbosity!='Terse'" - then: [t: "cĂĄc"] # (en: 'the') - - t: "giao lộ thĂ­ch hợp cá»§a" # (en: 'proper intersection of') - - "⋕": # 0x22d5 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "báș±ng vĂ  song song với" # (en: 'equal to and parallel to') - - "⋖": [t: "Ă­t hÆĄn với dáș„u cháș„m"] # 0x22d6 (en: 'less than with dot') - - "⋗": [t: "lớn hÆĄn với dáș„u cháș„m"] # 0x22d7 (en: 'greater than with dot') - - "⋘": # 0x22d8 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "ráș„t Ă­t hÆĄn nhiều" # (en: 'very much less than') - - "⋙": # 0x22d9 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "ráș„t lớn hÆĄn nhiều so với" # (en: 'very much greater than') - - "⋚": # 0x22da - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "Ă­t hÆĄn báș±ng hoáș·c lớn hÆĄn" # (en: 'less than equal to or greater than') - - "⋛": # 0x22db - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "lớn hÆĄn báș±ng hoáș·c nhỏ hÆĄn" # (en: 'greater than equal to or less than') - - "⋜": # 0x22dc - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "báș±ng hoáș·c nhỏ hÆĄn" # (en: 'equal to or less than') - - "⋝": # 0x22dd - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "báș±ng hoáș·c lớn hÆĄn" # (en: 'equal to or greater than') - - "⋞": # 0x22de - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "báș±ng hoáș·c trước" # (en: 'equal to or precedes') - - "⋟": # 0x22df - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "báș±ng hoáș·c thĂ nh cĂŽng" # (en: 'equal to or succeeds') - - "⋠": [t: "khĂŽng đi trước cĆ©ng như khĂŽng báș±ng"] # 0x22e0 (en: 'does not precede nor is equal to') - - "⋡": [t: "khĂŽng thĂ nh cĂŽng cĆ©ng như khĂŽng báș±ng"] # 0x22e1 (en: 'does not succeed nor is equal to') - - "⋱": [t: "khĂŽng pháșŁi hĂŹnh áșŁnh vuĂŽng hoáș·c báș±ng"] # 0x22e2 (en: 'not square image of or equal to') - - "⋣": [t: "khĂŽng pháșŁi báșŁn gốc vuĂŽng hoáș·c báș±ng"] # 0x22e3 (en: 'not square original of or equal to') - - "â‹€": [t: "hĂŹnh áșŁnh vuĂŽng hoáș·c khĂŽng báș±ng"] # 0x22e4 (en: 'square image of or not equal to') - - "â‹„": [t: "báșŁn gốc vuĂŽng hoáș·c khĂŽng báș±ng"] # 0x22e5 (en: 'square original of or not equal to') - - "⋩": # 0x22e6 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "Ă­t hÆĄn nhưng khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với" # (en: 'less than but not equivalent to') - - "⋧": # 0x22e7 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "lớn hÆĄn nhưng khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với" # (en: 'greater than but not equivalent to') - - "⋹": [t: "đi trước nhưng khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0x22e8 (en: 'precedes but is not equivalent to') - - "⋩": [t: "thĂ nh cĂŽng nhưng khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0x22e9 (en: 'succeeds but is not equivalent to') - - "â‹Ș": # 0x22ea - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "khĂŽng pháșŁi lĂ  một nhĂłm con bĂŹnh thường cá»§a" # (en: 'not a normal subgroup of') - - "⋫": [t: "khĂŽng chứa như một nhĂłm con bĂŹnh thường"] # 0x22eb (en: 'does not contain as a normal subgroup') - - "⋬": # 0x22ec - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "khĂŽng pháșŁi lĂ  một nhĂłm con bĂŹnh thường cĆ©ng khĂŽng báș±ng" # (en: 'not a normal subgroup of nor is equal to') - - "⋭": [t: "khĂŽng chứa như một nhĂłm con bĂŹnh thường cĆ©ng như khĂŽng báș±ng"] # 0x22ed (en: 'does not contain as a normal subgroup nor is equal to') - - "⋼": [T: "chia háșżt cho"] # 0x22ee (en: 'vertical ellipsis') - - "⋯": [t: "cháș„m cháș„m cháș„m"] # 0x22ef (en: 'dot dot dot') - - "⋰": [t: "elip chĂ©o lĂȘn trĂȘn"] # 0x22f0 (en: 'upwards diagonal ellipsis') - - "⋱": [t: "dáș„u cháș„m lá»­ng chĂ©o"] # 0x22f1 (en: 'diagonal ellipsis') - - "â‹Č": [t: "yáșżu tố cá»§a với gáșĄch ngang dĂ i"] # 0x22f2 (en: 'element of with long horizontal stroke') - - "⋳": [t: "yáșżu tố cá»§a thanh dọc ở cuối gáșĄch ngang"] # 0x22f3 (en: 'element of with vertical bar at end of horizontal stroke') - - "⋮": [t: "yáșżu tố cá»§a thanh dọc ở cuối gáșĄch ngang"] # 0x22f4 (en: 'element of with vertical bar at end of horizontal stroke') - - "â‹”": [t: "pháș§n tá»­ cá»§a với dáș„u cháș„m ở trĂȘn"] # 0x22f5 (en: 'element of with dot above') - - "⋶": [t: "yáșżu tố cá»§a với overbar"] # 0x22f6 (en: 'element of with overbar') - - "⋷": [t: "yáșżu tố cá»§a với overbar"] # 0x22f7 (en: 'element of with overbar') - - "⋾": [t: "yáșżu tố cá»§a với atarbar"] # 0x22f8 (en: 'element of with underbar') - - "â‹č": [t: "yáșżu tố cá»§a hai nĂ©t ngang"] # 0x22f9 (en: 'element of with two horizontal strokes') - - "â‹ș": [t: "chứa với gáșĄch ngang dĂ i"] # 0x22fa (en: 'contains with long horizontal stroke') - - "⋻": [t: "chứa với thanh dọc ở cuối gáșĄch ngang"] # 0x22fb (en: 'contains with vertical bar at end of horizontal stroke') - - "⋌": [t: "chứa với thanh dọc ở cuối gáșĄch ngang"] # 0x22fc (en: 'contains with vertical bar at end of horizontal stroke') - - "⋜": [t: "chứa với overbar"] # 0x22fd (en: 'contains with overbar') - - "⋟": [t: "chứa với overbar"] # 0x22fe (en: 'contains with overbar') - - "⋿": [t: "z kĂœ hiệu thĂ nh viĂȘn tĂși"] # 0x22ff (en: 'z notation bag membership') - - "⌀": [t: "đường kĂ­nh"] # 0x2300 (en: 'diameter') - - "⌁": [t: "mĆ©i tĂȘn điện"] # 0x2301 (en: 'electric arrow') - - "⌂": [t: "nhĂ  ở"] # 0x2302 (en: 'house') - - "⌃": [t: "lĂȘn đáș§u mĆ©i tĂȘn"] # 0x2303 (en: 'up arrowhead') - - "⌄": [t: "xuống đáș§u mĆ©i tĂȘn"] # 0x2304 (en: 'down arrowhead') - - "⌅": [t: "phĂłng chiáșżu"] # 0x2305 (en: 'projective') - - "⌆": [t: "luáș­t xa gáș§n"] # 0x2306 (en: 'perspective') - - "⌇": [t: "đường lÆ°á»Łn sĂłng"] # 0x2307 (en: 'wavy line') - - "⌈": [t: "tráș§n trĂĄi"] # 0x2308 (en: 'left ceiling') - - "⌉": [t: "tráș§n pháșŁi"] # 0x2309 (en: 'right ceiling') - - "⌊": [t: "táș§ng trĂĄi"] # 0x230a (en: 'left floor') - - "⌋": [t: "táș§ng pháșŁi"] # 0x230b (en: 'right floor') - - "⌌": [t: "đáy bĂȘn pháșŁi"] # 0x230c (en: 'bottom right crop') - - "⌍": [t: "cĂąy trồng phĂ­a dưới bĂȘn trĂĄi"] # 0x230d (en: 'bottom left crop') - - "⌎": [t: "cĂąy trồng trĂȘn cĂčng bĂȘn pháșŁi"] # 0x230e (en: 'top right crop') - - "⌏": [t: "cĂąy trồng trĂȘn cĂčng bĂȘn trĂĄi"] # 0x230f (en: 'top left crop') - - "⌐": [t: "đáșŁo ngÆ°á»Łc khĂŽng kĂœ"] # 0x2310 (en: 'reversed not sign') - - "⌑": [t: "hĂŹnh vuĂŽng"] # 0x2311 (en: 'square lozenge') - - "⌒": [t: "cung"] # 0x2312 (en: 'arc') - - "⌓": [t: "bộ pháș­n"] # 0x2313 (en: 'segment') - - "⌔": [t: "khu vá»±c"] # 0x2314 (en: 'sector') - - "⌕": [t: "mĂĄy ghi Ăąm điện thoáșĄi"] # 0x2315 (en: 'telephone recorder') - - "⌖": [t: "chỉ số vị trĂ­ crosshairs"] # 0x2316 (en: 'position indicator crosshairs') - - "⌗": [t: "quáșŁng trường viewdata"] # 0x2317 (en: 'viewdata square') - - "⌘": [t: "nÆĄi cĂł dáș„u hiệu quan tĂąm"] # 0x2318 (en: 'place of interest sign') - - "⌙": [t: "biáșżn khĂŽng kĂœ"] # 0x2319 (en: 'turned not sign') - - "⌚": [t: "đồng hồ"] # 0x231a (en: 'watch') - - "⌛": [t: "đồng hồ cĂĄt"] # 0x231b (en: 'hourglass') - - "⌜": [t: "gĂłc trĂȘn bĂȘn trĂĄi"] # 0x231c (en: 'top left corner') - - "⌝": [t: "gĂłc trĂȘn bĂȘn pháșŁi"] # 0x231d (en: 'top right corner') - - "⌞": [t: "gĂłc dưới bĂȘn trĂĄi"] # 0x231e (en: 'bottom left corner') - - "⌟": [t: "gĂłc dưới bĂȘn pháșŁi"] # 0x231f (en: 'bottom right corner') - - "⌠": [t: "ná»­a đáș§u tĂ­ch phĂąn"] # 0x2320 (en: 'top half integral') - - "⌡": [t: "ná»­a dưới tĂ­ch phĂąn"] # 0x2321 (en: 'bottom half integral') - - "⌱": [t: "nhăn máș·t"] # 0x2322 (en: 'frown') - - "⌣": [t: "nỄ cười"] # 0x2323 (en: 'smile') - - "⌀": [t: "lĂȘn đáș§u mĆ©i tĂȘn giữa hai thanh ngang"] # 0x2324 (en: 'up arrowhead between two horizontal bars') - - "⌄": [t: "khĂła tĂčy chọn"] # 0x2325 (en: 'option key') - - "〈": [t: "xĂła sang pháșŁi"] # 0x2326 (en: 'erase to the right') - - "⌧": [t: "x trong một hộp hĂŹnh chữ nháș­t"] # 0x2327 (en: 'x in a rectangle box') - - "⌹": [t: "bĂ n phĂ­m"] # 0x2328 (en: 'keyboard') - - "〈": [t: "bĂȘn trĂĄi chỉ khung gĂłc"] # 0x2329 (en: 'left pointing angle bracket') - - "âŒȘ": [t: "bĂȘn pháșŁi gĂłc khung"] # 0x232a (en: 'right pointing angle bracket') - - "⌫": [t: "xĂła sang trĂĄi"] # 0x232b (en: 'erase to the left') - - "⌬": [t: "vĂČng benzen"] # 0x232c (en: 'benzene ring') - - "⌭": [t: "hĂŹnh trỄ"] # 0x232d (en: 'cylindricity') - - "⌼": [t: "táș„t cáșŁ xung quanh hồ sÆĄ"] # 0x232e (en: 'all around profile') - - "⌯": [t: "đối diện"] # 0x232f (en: 'symmetry') - - "⌰": [t: "tổng số cháșĄy"] # 0x2330 (en: 'total runout') - - "⌱": [t: "nguồn gốc kĂ­ch thước"] # 0x2331 (en: 'dimension origin') - - "âŒČ": [t: "hĂŹnh nĂłn cĂŽn"] # 0x2332 (en: 'conical taper') - - "⌳": [t: "dốc"] # 0x2333 (en: 'slope') - - "⌮": [t: "đối trọng"] # 0x2334 (en: 'counterbore') - - "⌔": [t: "cáș„m"] # 0x2335 (en: 'countersink') - - "⍰": [t: "hộp khĂŽng xĂĄc định"] # 0x2370 (en: 'unknown box') - - "⎕": [t: "hộp"] # 0x2395 (en: 'box') - - "⏜": [t: "cung"] # 0x23DC (en: 'top paren') - - "⏞": [t: "náșčp trĂȘn cĂčng"] # 0x23DE (en: 'top brace') - - "⏟": [t: "niềng răng dưới cĂčng"] # 0x23DF (en: 'bottom brace') - - "①-⑹": # 0x2460 - 0x2469 - - t: "khoanh trĂČn" # (en: 'circled') - - spell: "translate('.', '①⑥⑹④⑀⑄⑊⑧⑚', '123456789')" - - "⑩": [t: "bao quanh mười"] # 0x2469 (en: 'circled ten') - - "â‘Ș": [t: "vĂČng mười một"] # 0x246a (en: 'circled eleven') - - "⑫": [t: "bao quanh mười hai"] # 0x246b (en: 'circled twelve') - - "⑬": [t: "bao quanh mười ba"] # 0x246c (en: 'circled thirteen') - - "⑭": [t: "vĂČng mười bốn"] # 0x246d (en: 'circled fourteen') - - "⑼": [t: "bao quanh mười lăm"] # 0x246e (en: 'circled fifteen') - - "⑯": [t: "vĂČng mười sĂĄu"] # 0x246f (en: 'circled sixteen') - - "⑰": [t: "vĂČng mười báșŁy"] # 0x2470 (en: 'circled seventeen') - - "⑱": [t: "khoanh trĂČn ateen"] # 0x2471 (en: 'circled eighteen') - - "⑱": [t: "vĂČng mười chĂ­n"] # 0x2471 (en: 'circled nineteen') - - "⑳": [t: "bao quanh hai mÆ°ÆĄi"] # 0x2473 (en: 'circled twenty') - - "⑮-⑌": # 0x2474 - 0x247d - - t: "dáș„u ngoáș·c Ä‘ÆĄn" # (en: 'parenthesized') - - spell: "translate('.', '⑎⑔⑶⑷⑞â‘čâ‘ș⑻⑌', '123456789')" - - "⑜": [t: "dáș„u ngoáș·c Ä‘ÆĄn mười"] # 0x247d (en: 'parenthesized ten') - - "⑟": [t: "dáș„u ngoáș·c Ä‘ÆĄn mười một"] # 0x247e (en: 'parenthesized eleven') - - "⑿": [t: "dáș„u ngoáș·c Ä‘ÆĄn mười hai"] # 0x247f (en: 'parenthesized twelve') - - "⒀": [t: "ngoáș·c Ä‘ÆĄn mười ba"] # 0x2480 (en: 'parenthesized thirteen') - - "⒁": [t: "dáș„u ngoáș·c Ä‘ÆĄn mười bốn"] # 0x2481 (en: 'parenthesized fourteen') - - "⒂": [t: "dáș„u ngoáș·c Ä‘ÆĄn mười lăm"] # 0x2482 (en: 'parenthesized fifteen') - - "⒃": [t: "dáș„u ngoáș·c Ä‘ÆĄn mười sĂĄu"] # 0x2483 (en: 'parenthesized sixteen') - - "⒄": [t: "dáș„u ngoáș·c Ä‘ÆĄn mười báșŁy"] # 0x2484 (en: 'parenthesized seventeen') - - "⒅": [t: "dáș„u ngoáș·c Ä‘ÆĄn ateen"] # 0x2485 (en: 'parenthesized eighteen') - - "⒆": [t: "dáș„u ngoáș·c Ä‘ÆĄn mười chĂ­n"] # 0x2486 (en: 'parenthesized nineteen') - - "⒇": [t: "ngoáș·c Ä‘ÆĄn hai mÆ°ÆĄi"] # 0x2487 (en: 'parenthesized twenty') - - "⒈-⒐": # 0x2488 - 0x2491 - - spell: "translate('.', '⒈⒉⒊⒋⒌⒍⒎⒏⒐', '123456789')" - - t: "với thời gian" # (en: 'with period') - - "⒑": [t: "mười với thời gian"] # 0x2491 (en: 'ten with period') - - "⒒": [t: "mười một với thời gian"] # 0x2492 (en: 'eleven with period') - - "⒓": [t: "mười hai với thời gian"] # 0x2493 (en: 'twelve with period') - - "⒔": [t: "mười ba với thời gian"] # 0x2494 (en: 'thirteen with period') - - "⒕": [t: "mười bốn với thời gian"] # 0x2495 (en: 'fourteen with period') - - "⒖": [t: "mười lăm với thời gian"] # 0x2496 (en: 'fifteen with period') - - "⒗": [t: "mười sĂĄu thời gian"] # 0x2497 (en: 'sixteen with period') - - "⒘": [t: "mười báșŁy với thời gian"] # 0x2498 (en: 'seventeen with period') - - "⒙": [t: "ateen cĂł thời gian"] # 0x2499 (en: 'eighteen with period') - - "⒚": [t: "mười chĂ­n với thời gian"] # 0x249a (en: 'nineteen with period') - - "⒛": [t: "hai mÆ°ÆĄi với thời gian"] # 0x249b (en: 'twenty with period') - - "⒜-â’”": # 0x249c - 0x24b5 - - t: "dáș„u ngoáș·c Ä‘ÆĄn" # (en: 'parenthesized') - - spell: "translate('.', 'â’œâ’â’žâ’Ÿâ’ â’Ąâ’ąâ’Łâ’€â’„â’Šâ’§â’šâ’©â’Șâ’«â’Źâ’­â’źâ’Żâ’°â’±â’Čâ’łâ’Žâ’”', 'abcdefghijklmnopqrstuvwxyz')" - - - "Ⓐ-Ⓩ": - - t: "khoanh trĂČn" # (en: 'circled') - - spell: "translate('.', 'â’¶â’·â’žâ’čâ’șâ’»â’Œâ’œâ’Ÿâ’żâ“€â“â“‚â“ƒâ“„â“…â“†â“‡â“ˆâ“‰â“Šâ“‹â“Œâ“â“Žâ“', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "🅐-đŸ…©": # 0x1f150 - 0x1f169 - - t: "khoanh trĂČn đen" # (en: 'black circled') - - spell: "translate('.', 'đŸ…đŸ…‘đŸ…’đŸ…“đŸ…”đŸ…•đŸ…–đŸ…—đŸ…˜đŸ…™đŸ…šđŸ…›đŸ…œđŸ…đŸ…žđŸ…ŸđŸ… đŸ…ĄđŸ…ąđŸ…ŁđŸ…€đŸ…„đŸ…ŠđŸ…§đŸ…šđŸ…©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "ⓐ-ⓩ": # 0x24d0 - 0x24e9 - - t: "khoanh trĂČn" # (en: 'circled') - - spell: "translate('.', 'â“â“‘â“’â““â“”â“•â“–â“—â“˜â“™â“šâ“›â“œâ“â“žâ“Ÿâ“ â“Ąâ“ąâ“Łâ“€â“„â“Šâ“§â“šâ“©', 'abcdefghijklmnopqrstuvwxyz')" - - "â“Ș": [t: "vĂČng trĂČn số khĂŽng"] # 0x24ea (en: 'circled zero') - - "⓫": [t: "mĂ u đen vĂČng mười một"] # 0x24eb (en: 'black circled eleven') - - "⓬": [t: "mười hai vĂČng mĂ u đen"] # 0x24ec (en: 'black circled twelve') - - "⓭": [t: "mười ba vĂČng mĂ u đen"] # 0x24ed (en: 'black circled thirteen') - - "⓼": [t: "mười bốn vĂČng mĂ u đen"] # 0x24ee (en: 'black circled fourteen') - - "⓯": [t: "mười lăm vĂČng mĂ u đen"] # 0x24ef (en: 'black circled fifteen') - - "⓰": [t: "mười sĂĄu vĂČng mĂ u đen"] # 0x24f0 (en: 'black circled sixteen') - - "⓱": [t: "mười báșŁy vĂČng mĂ u đen"] # 0x24f1 (en: 'black circled seventeen') - - "â“Č": [t: "mĂ u đen khoanh trĂČn ateen"] # 0x24f2 (en: 'black circled eighteen') - - "⓳": [t: "mười chĂ­n vĂČng mĂ u đen"] # 0x24f3 (en: 'black circled nineteen') - - "⓮": [t: "đen vĂČng hai mÆ°ÆĄi"] # 0x24f4 (en: 'black circled twenty') - - "â“”-ⓜ": # 0x24f5 - 0x24fe - - t: "gáș„p đîi khoanh trĂČn" # (en: 'double circled') - - spell: "translate('.', 'ⓔ⓶⓷ⓞâ“čâ“ș⓻Ⓦⓜ', '123456789')" - - "ⓟ": [t: "gáș„p đîi vĂČng mười"] # 0x24fe (en: 'double circled ten') - - "⓿": [t: "mĂ u đen vĂČng khĂŽng"] # 0x24ff (en: 'black circled zero') - - "■": [t: "quáșŁng trường đen"] # 0x25a0 (en: 'black square') - - "□": [t: "quáșŁng trường tráșŻng"] # 0x25a1 (en: 'white square') - - "▱": [t: "quáșŁng trường tráșŻng với cĂĄc gĂłc trĂČn"] # 0x25a2 (en: 'white square with rounded corners') - - "▣": [t: "quáșŁng trường tráșŻng chứa hĂŹnh vuĂŽng nhỏ mĂ u đen"] # 0x25a3 (en: 'white square containing small black square') - - "â–€": [t: "hĂŹnh vuĂŽng với láș„p đáș§y ngang"] # 0x25a4 (en: 'square with horizontal fill') - - "â–„": [t: "hĂŹnh vuĂŽng với điền vĂ o đỉnh"] # 0x25a5 (en: 'square with verticle fill') - - "▩": [t: "hĂŹnh vuĂŽng với láș„p đáș§y hĂŹnh chữ tháș­p trá»±c giao"] # 0x25a6 (en: 'square with orthogonal crosshatch fill') - - "▧": [t: "hĂŹnh vuĂŽng với pháș§n trĂȘn bĂȘn trĂĄi đáșżn dưới bĂȘn pháșŁi"] # 0x25a7 (en: 'square with upper left to lower right fill') - - "▹": [t: "hĂŹnh vuĂŽng với pháș§n trĂȘn bĂȘn pháșŁi đáșżn tháș„p hÆĄn bĂȘn trĂĄi"] # 0x25a8 (en: 'square with upper right to lower left fill') - - "▩": [t: "hĂŹnh vuĂŽng với hĂŹnh chữ tháș­p chĂ©o"] # 0x25a9 (en: 'square with diagonal crosshatch fill') - - "â–Ș": [t: "quáșŁng trường nhỏ mĂ u đen"] # 0x25aa (en: 'black small square') - - "▫": [t: "quáșŁng trường nhỏ mĂ u tráșŻng"] # 0x25ab (en: 'white small square') - - "▬": [t: "hĂŹnh chữ nháș­t mĂ u đen"] # 0x25ac (en: 'black rectangle') - - "▭": [t: "hĂŹnh chữ nháș­t mĂ u tráșŻng"] # 0x25ad (en: 'white rectangle') - - "▼": [t: "hĂŹnh chữ nháș­t tháșłng đứng mĂ u đen"] # 0x25ae (en: 'black vertical rectangle') - - "▯": [t: "hĂŹnh chữ nháș­t tháșłng đứng mĂ u tráșŻng"] # 0x25af (en: 'white vertical rectangle') - - "▰": [t: "hĂŹnh bĂŹnh hĂ nh đen"] # 0x25b0 (en: 'black parallelogram') - - "▱": [t: "hĂŹnh bĂŹnh hĂ nh"] # 0x25b1 (en: 'white parallelogram') - - "â–Č": [t: "mĂ u đen lĂȘn tam giĂĄc"] # 0x25b2 (en: 'black up pointing triangle') - - "△": [t: "tam giĂĄc"] # 0x25b3 (en: 'white up pointing triangle') - - "▮": [t: "mĂ u đen lĂȘn hĂŹnh tam giĂĄc nhỏ"] # 0x25b4 (en: 'black up pointing small triangle') - - "â–”": [t: "tráșŻng lĂȘn hĂŹnh tam giĂĄc nhỏ"] # 0x25b5 (en: 'white up pointing small triangle') - - "▶": [t: "triangle chĂąn pháșŁi mĂ u đen"] # 0x25b6 (en: 'black right pointing triangle') - - "▷": [t: "tráșŻng pháșŁi hĂŹnh tam giĂĄc"] # 0x25b7 (en: 'white right pointing triangle') - - "▾": [t: "đen pháșŁi chỉ hĂŹnh tam giĂĄc nhỏ"] # 0x25b8 (en: 'black right pointing small triangle') - - "â–č": [t: "tráșŻng pháșŁi chỉ hĂŹnh tam giĂĄc nhỏ"] # 0x25b9 (en: 'white right pointing small triangle') - - "â–ș": [t: "đen bĂȘn pháșŁi trỏ trỏ"] # 0x25ba (en: 'black right pointing pointer') - - "▻": [t: "trao mĂ u tráșŻng trỏ"] # 0x25bb (en: 'white right pointing pointer') - - "â–Œ": [t: "mĂ u đen xuống hĂŹnh tam giĂĄc"] # 0x25bc (en: 'black down pointing triangle') - - "â–œ": [t: "tráșŻng xuống hĂŹnh tam giĂĄc"] # 0x25bd (en: 'white down pointing triangle') - - "â–Ÿ": [t: "đen xuống chỉ hĂŹnh tam giĂĄc nhỏ"] # 0x25be (en: 'black down pointing small triangle') - - "▿": [t: "tráșŻng xuống chỉ hĂŹnh tam giĂĄc nhỏ"] # 0x25bf (en: 'white down pointing small triangle') - - "◀": [t: "tam giĂĄc phĂ­a bĂȘn trĂĄi mĂ u đen"] # 0x25c0 (en: 'black left pointing triangle') - - "◁": [t: "tráșŻng bĂȘn trĂĄi hĂŹnh tam giĂĄc"] # 0x25c1 (en: 'white left pointing triangle') - - "◂": [t: "đen bĂȘn trĂĄi trỏ tam giĂĄc nhỏ"] # 0x25c2 (en: 'black left pointing small triangle') - - "◃": [t: "tráșŻng bĂȘn trĂĄi trỏ tam giĂĄc nhỏ"] # 0x25c3 (en: 'white left pointing small triangle') - - "◄": [t: "đen bĂȘn trĂĄi trỏ trỏ"] # 0x25c4 (en: 'black left pointing pointer') - - "◅": [t: "trao mĂ u tráșŻng trỏ"] # 0x25c5 (en: 'white left pointing pointer') - - "◆": [t: "kim cÆ°ÆĄng đen"] # 0x25c6 (en: 'black diamond') - - "◇": [t: "kim cÆ°ÆĄng tráșŻng"] # 0x25c7 (en: 'white diamond') - - "◈": [t: "kim cÆ°ÆĄng tráșŻng chứa kim cÆ°ÆĄng nhỏ mĂ u đen"] # 0x25c8 (en: 'white diamond containing black small diamond') - - "◉": [t: "cĂĄ"] # 0x25c9 (en: 'fisheye') - - "◊": [t: "hĂŹnh thoi"] # 0x25ca (en: 'lozenge') - - "○": [t: "vĂČng trĂČn mĂ u tráșŻng"] # 0x25cb (en: 'white circle') - - "◌": [t: "vĂČng trĂČn cháș„m"] # 0x25cc (en: 'dotted circle') - - "◍": [t: "vĂČng trĂČn với điền dọc"] # 0x25cd (en: 'circle with vertical fill') - - "◎": [t: "bullseye"] # 0x25ce - - "●": [t: "vĂČng trĂČn mĂ u đen"] # 0x25cf (en: 'black circle') - - "◐": [t: "vĂČng trĂČn với ná»­a mĂ u đen"] # 0x25d0 (en: 'circle with left half black') - - "◑": [t: "vĂČng trĂČn với ná»­a mĂ u đen bĂȘn pháșŁi"] # 0x25d1 (en: 'circle with right half black') - - "◒": [t: "vĂČng trĂČn với ná»­a mĂ u đen"] # 0x25d2 (en: 'circle with lower half black') - - "◓": [t: "vĂČng trĂČn với ná»­a mĂ u đen"] # 0x25d3 (en: 'circle with upper half black') - - "◔": [t: "vĂČng trĂČn với pháș§n tư phĂ­a trĂȘn bĂȘn pháșŁi mĂ u đen"] # 0x25d4 (en: 'circle with upper right quadrant black') - - "◕": [t: "vĂČng trĂČn với táș„t cáșŁ trừ pháș§n tư phĂ­a trĂȘn bĂȘn trĂĄi mĂ u đen"] # 0x25d5 (en: 'circle with all but upper left quadrant black') - - "◖": [t: "một ná»­a vĂČng trĂČn mĂ u đen"] # 0x25d6 (en: 'left half black circle') - - "◗": [t: "một ná»­a vĂČng trĂČn mĂ u đen"] # 0x25d7 (en: 'right half black circle') - - "◘": [t: "bullet nghịch đáșŁo"] # 0x25d8 (en: 'inverse bullet') - - "◙": [t: "vĂČng trĂČn tráșŻng nghịch đáșŁo"] # 0x25d9 (en: 'inverse white circle') - - "◚": [t: "vĂČng trĂČn mĂ u tráșŻng nghịch đáșŁo trĂȘn"] # 0x25da (en: 'upper half inverse white circle') - - "◛": [t: "vĂČng trĂČn tráșŻng ná»­a dưới"] # 0x25db (en: 'lower half inverse white circle') - - "◜": [t: "vĂČng cung vĂČng trĂČn phĂ­a trĂȘn bĂȘn trĂĄi"] # 0x25dc (en: 'upper left quadrant circular arc') - - "◝": [t: "vĂČng cung trĂČn gĂłc pháș§n tư phĂ­a trĂȘn bĂȘn pháșŁi"] # 0x25dd (en: 'upper right quadrant circular arc') - - "◞": [t: "hồ quang hĂŹnh trĂČn gĂłc pháș§n tư dưới bĂȘn pháșŁi"] # 0x25de (en: 'lower right quadrant circular arc') - - "◟": [t: "vĂČng cung trĂČn gĂłc dưới bĂȘn trĂĄi"] # 0x25df (en: 'lower left quadrant circular arc') - - "◠": [t: "vĂČng trĂČn trĂȘn"] # 0x25e0 (en: 'upper half circle') - - "◡": [t: "vĂČng trĂČn tháș„p hÆĄn"] # 0x25e1 (en: 'lower half circle') - - "◱": [t: "tam giĂĄc bĂȘn pháșŁi mĂ u đen"] # 0x25e2 (en: 'black lower right triangle') - - "◣": [t: "tam giĂĄc bĂȘn trĂĄi mĂ u đen"] # 0x25e3 (en: 'black lower left triangle') - - "â—€": [t: "tam giĂĄc mĂ u đen bĂȘn trĂĄi"] # 0x25e4 (en: 'black upper left triangle') - - "â—„": [t: "tam giĂĄc phĂ­a trĂȘn bĂȘn pháșŁi mĂ u đen"] # 0x25e5 (en: 'black upper right triangle') - - "◩": [t: "thĂ nh pháș§n"] # 0x25e6 (en: 'composition') - - "◧": [t: "hĂŹnh vuĂŽng với ná»­a mĂ u đen"] # 0x25e7 (en: 'square with left half black') - - "◹": [t: "hĂŹnh vuĂŽng với ná»­a mĂ u đen bĂȘn pháșŁi"] # 0x25e8 (en: 'square with right half black') - - "◩": [t: "hĂŹnh vuĂŽng với ná»­a mĂ u đen bĂȘn trĂĄi"] # 0x25e9 (en: 'square with upper left half black') - - "â—Ș": [t: "hĂŹnh vuĂŽng với ná»­a bĂȘn pháșŁi mĂ u đen"] # 0x25ea (en: 'square with lower right half black') - - "◫": [t: "quáșŁng trường tráșŻng với đường chia đîi"] # 0x25eb (en: 'white square with bisecting line') - - "◬": [t: "tráșŻng lĂȘn tam giĂĄc với dáș„u cháș„m"] # 0x25ec (en: 'white up pointing triangle with dot') - - "◭": [t: "lĂȘn tam giĂĄc chỉ với ná»­a mĂ u đen trĂĄi"] # 0x25ed (en: 'up pointing triangle with left half black') - - "◼": [t: "lĂȘn tam giĂĄc chỉ với ná»­a mĂ u đen bĂȘn pháșŁi"] # 0x25ee (en: 'up pointing triangle with right half black') - - "◯": [t: "vĂČng trĂČn lớn"] # 0x25ef (en: 'large circle') - - "◰": [t: "quáșŁng trường tráșŻng với gĂłc pháș§n tư phĂ­a trĂȘn bĂȘn trĂĄi"] # 0x25f0 (en: 'white square with upper left quadrant') - - "◱": [t: "quáșŁng trường tráșŻng với gĂłc pháș§n tư phĂ­a dưới bĂȘn trĂĄi"] # 0x25f1 (en: 'white square with lower left quadrant') - - "â—Č": [t: "quáșŁng trường tráșŻng với gĂłc pháș§n tư phĂ­a dưới bĂȘn pháșŁi"] # 0x25f2 (en: 'white square with lower right quadrant') - - "◳": [t: "quáșŁng trường tráșŻng với gĂłc pháș§n tư phĂ­a trĂȘn bĂȘn pháșŁi"] # 0x25f3 (en: 'white square with upper right quadrant') - - "◮": [t: "vĂČng trĂČn mĂ u tráșŻng với gĂłc pháș§n tư phĂ­a trĂȘn bĂȘn trĂĄi"] # 0x25f4 (en: 'white circle with upper left quadrant') - - "â—”": [t: "vĂČng trĂČn mĂ u tráșŻng với gĂłc pháș§n tư phĂ­a dưới bĂȘn trĂĄi"] # 0x25f5 (en: 'white circle with lower left quadrant') - - "◶": [t: "vĂČng trĂČn mĂ u tráșŻng với gĂłc pháș§n tư phĂ­a dưới bĂȘn pháșŁi"] # 0x25f6 (en: 'white circle with lower right quadrant') - - "◷": [t: "vĂČng trĂČn mĂ u tráșŻng với gĂłc pháș§n tư phĂ­a trĂȘn bĂȘn pháșŁi"] # 0x25f7 (en: 'white circle with upper right quadrant') - - "◾": [t: "tam giĂĄc phĂ­a trĂȘn bĂȘn trĂĄi"] # 0x25f8 (en: 'upper left triangle') - - "â—č": [t: "tam giĂĄc phĂ­a trĂȘn bĂȘn pháșŁi"] # 0x25f9 (en: 'upper right triangle') - - "â—ș": [t: "tam giĂĄc dưới bĂȘn trĂĄi"] # 0x25fa (en: 'lower left triangle') - - "◻": [t: "quáșŁng trường trung bĂŹnh mĂ u tráșŻng"] # 0x25fb (en: 'white medium square') - - "â—Œ": [t: "quáșŁng trường trung bĂŹnh mĂ u đen"] # 0x25fc (en: 'black medium square') - - "â—œ": [t: "quáșŁng trường nhỏ vừa"] # 0x25fd (en: 'white medium small square') - - "â—Ÿ": [t: "quáșŁng trường nhỏ mĂ u đen"] # 0x25fe (en: 'black medium small square') - - "◿": [t: "tam giĂĄc dưới bĂȘn pháșŁi"] # 0x25ff (en: 'lower right triangle') - - "♠": [t: "bộ đồ thuổng đen"] # 0x2660 (en: 'black spade suit') - - "♡": [t: "bộ đồ trĂĄi tim tráșŻng"] # 0x2661 (en: 'white heart suit') - - "♱": [t: "bộ đồ kim cÆ°ÆĄng tráșŻng"] # 0x2662 (en: 'white diamond suit') - - "♣": [t: "bộ đồ cĂąu láșĄc bộ mĂ u đen"] # 0x2663 (en: 'black club suit') - - "♀": [t: "bộ đồ thuổng tráșŻng"] # 0x2664 (en: 'white spade suit') - - "♄": [t: "bộ đồ trĂĄi tim đen"] # 0x2665 (en: 'black heart suit') - - "♩": [t: "bộ đồ kim cÆ°ÆĄng đen"] # 0x2666 (en: 'black diamond suit') - - "♧": [t: "bộ đồ cĂąu láșĄc bộ tráșŻng"] # 0x2667 (en: 'white club suit') - - "❚": [t: "trung bĂŹnh bĂȘn trĂĄi dáș„u ngoáș·c Ä‘ÆĄn trang trĂ­"] # 0x2768 (en: 'medium left parentheses ornament') - - "❩": [t: "dáș„u ngoáș·c Ä‘ÆĄn trung bĂŹnh trang trĂ­"] # 0x2769 (en: 'medium right parentheses ornament') - - "âȘ": [t: "trung bĂŹnh pháșłng bĂȘn trĂĄi dáș„u ngoáș·c Ä‘ÆĄn trang trĂ­"] # 0x276a (en: 'medium flattened left parentheses ornament') - - "❫": [t: "trung bĂŹnh pháșłng bĂȘn pháșŁi trang trĂ­"] # 0x276b (en: 'medium flattened right parentheses ornament') - - "❬": [t: "trung bĂŹnh bĂȘn trĂĄi giĂĄ trang trĂ­ khung gĂłc"] # 0x276c (en: 'medium left-pointing angle bracket ornament') - - "❭": [t: "trung bĂŹnh bĂȘn pháșŁi-gĂłc chỉ trang trĂ­"] # 0x276d (en: 'medium right--pointing angle bracked ornament') - - "❼": [t: "độ náș·ng gĂłc bĂȘn trĂĄi dáș„u ngoáș·c kĂ©p trang trĂ­"] # 0x276e (en: 'heavy left-pointing angle quotation mark ornament') - - "❯": [t: "độ náș·ng gĂłc pháșŁi gĂłc trĂ­ch dáș«n trang trĂ­ trang trĂ­"] # 0x276f (en: 'heavy right-pointing angle quotation mark ornament') - - "❰": [t: "giĂĄ trang trĂ­ gĂłc cá»±c lớn bĂȘn trĂĄi"] # 0x2770 (en: 'heavy left-pointing angle bracket ornament') - - "❱": [t: "giĂĄ trang trĂ­ gĂłc pháșŁi náș·ng bĂȘn pháșŁi"] # 0x2771 (en: 'heavy right-pointing angle bracket ornament') - - "âČ": [t: "ĂĄnh sĂĄng bĂȘn trĂĄi chĂąn váș­t trang trĂ­ vỏ rĂča"] # 0x2772 (en: 'light left tortoise shell bracket ornament') - - "❳": [t: "ĂĄnh sĂĄng bĂȘn pháșŁi vỏ sĂČ trang trĂ­"] # 0x2773 (en: 'light right tortoise shell bracket ornament') - - "❎": [t: "trung bĂŹnh bĂȘn trĂĄi trang trĂ­"] # 0x2774 (en: 'medium left brace ornament') - - "❔": [t: "trang trĂ­ náșčp trung bĂŹnh bĂȘn pháșŁi"] # 0x2775 (en: 'medium right brace ornament') - - "❶": [t: "mĂ u đen khoanh trĂČn một"] # 0x2776 (en: 'black circled one') - - "❷": [t: "đen vĂČng hai"] # 0x2777 (en: 'black circled two') - - "❞": [t: "đen vĂČng ba"] # 0x2778 (en: 'black circled three') - - "âč": [t: "đen vĂČng bốn"] # 0x2779 (en: 'black circled four') - - "âș": [t: "đen khoanh trĂČn năm"] # 0x277a (en: 'black circled five') - - "❻": [t: "đen vĂČng sĂĄu"] # 0x277b (en: 'black circled six') - - "❌": [t: "đen bao quanh báșŁy"] # 0x277c (en: 'black circled seven') - - "❜": [t: "mĂ u đen khoanh trĂČn táșĄi"] # 0x277d (en: 'black circled eight') - - "❟": [t: "đen vĂČng chĂ­n"] # 0x277e (en: 'black circled nine') - - "❿": [t: "mười vĂČng mĂ u đen"] # 0x277f (en: 'black circled ten') - - "➀": [t: "khoanh trĂČn sans serif một"] # 0x2780 (en: 'circled sans serif one') - - "➁": [t: "bao quanh sans serif hai"] # 0x2781 (en: 'circled sans serif two') - - "➂": [t: "bao quanh sans serif ba"] # 0x2782 (en: 'circled sans serif three') - - "➃": [t: "bao quanh sans serif bốn"] # 0x2783 (en: 'circled sans serif four') - - "➄": [t: "bao quanh sans serif năm"] # 0x2784 (en: 'circled sans serif five') - - "➅": [t: "bao quanh sans serif sĂĄu"] # 0x2785 (en: 'circled sans serif six') - - "➆": [t: "bao quanh sans serif báșŁy"] # 0x2786 (en: 'circled sans serif seven') - - "➇": [t: "bao quanh sans serif táșĄi"] # 0x2787 (en: 'circled sans serif eight') - - "➈": [t: "bao quanh sans serif chĂ­n"] # 0x2788 (en: 'circled sans serif nine') - - "➉": [t: "bao quanh sans serif mười"] # 0x2789 (en: 'circled sans serif ten') - - "➊": [t: "mĂ u đen khoanh trĂČn sans serif một"] # 0x278a (en: 'black circled sans serif one') - - "➋": [t: "đen khoanh trĂČn sans serif hai"] # 0x278b (en: 'black circled sans serif two') - - "➌": [t: "đen kho trĂČn sans serif ba"] # 0x278c (en: 'black circled sans serif three') - - "➍": [t: "đen kho trĂČn sans serif bốn"] # 0x278d (en: 'black circled sans serif four') - - "➎": [t: "đen kho trĂČn sans serif năm"] # 0x278e (en: 'black circled sans serif five') - - "➏": [t: "đen kho trĂČn sans serif sĂĄu"] # 0x278f (en: 'black circled sans serif six') - - "➐": [t: "đen khoanh trĂČn sans serif seven"] # 0x2790 (en: 'black circled sans serif seven') - - "➑": [t: "mĂ u đen khoanh trĂČn sans serif táșĄi"] # 0x2791 (en: 'black circled sans serif eight') - - "➒": [t: "đen kho trĂČn sans serif chĂ­n"] # 0x2792 (en: 'black circled sans serif nine') - - "➓": [t: "mĂ u đen khoanh trĂČn sans serif ten"] # 0x2793 (en: 'black circled sans serif ten') - - "➔": [t: "mĆ©i tĂȘn bĂȘn pháșŁi náș·ng"] # 0x2794 (en: 'heavy wide-headed rightwards arrow') - - "➕": [t: "dáș„u hiệu cộng náș·ng"] # 0x2795 (en: 'heavy plus sign') - - "➖": [t: "dáș„u hiệu náș·ng"] # 0x2796 (en: 'heavy minus sign') - - "➗": [t: "dáș„u hiệu divison náș·ng"] # 0x2797 (en: 'heavy divison sign') - - "➘": [t: "mĆ©i tĂȘn đîng nam náș·ng"] # 0x2798 (en: 'heavy south east arrow') - - "➙": [t: "mĆ©i tĂȘn náș·ng"] # 0x2799 (en: 'heavy rightwards arrow') - - "➚": [t: "mĆ©i tĂȘn đîng báșŻc náș·ng"] # 0x279a (en: 'heavy north east arrow') - - "➛": [t: "báșŁn tháșŁo điểm bĂȘn pháșŁi mĆ©i tĂȘn"] # 0x279b (en: 'drafting point rightwards arrow') - - "➜": [t: "mĆ©i tĂȘn trĂČn náș·ng"] # 0x279c (en: 'heavy round-tipped rightwards arrow') - - "➝": [t: "mĆ©i tĂȘn pháșŁi đáș§u tam giĂĄc"] # 0x279d (en: 'triangle-headed rightwards arrow') - - "➞": [t: "mĆ©i tĂȘn đáș§u pháșŁi hĂŹnh tam giĂĄc náș·ng"] # 0x279e (en: 'heavy triangle-headed rightwards arrow') - - "➟": [t: "mĆ©i tĂȘn đáș§u cÆĄ hĂŹnh tam giĂĄc đứt"] # 0x279f (en: 'dashed triangle-headed rightwards arrow') - - "➠": [t: "mĆ©i tĂȘn đáș§u cÆĄ hĂŹnh tam giĂĄc náș·ng nề"] # 0x27a0 (en: 'heavy dashed triangle-headed rightwards arrow') - - "➡": [t: "mĆ©i tĂȘn bĂȘn pháșŁi mĂ u đen"] # 0x27a1 (en: 'black rightwards arrow') - - "➱": [t: "ba d trĂȘn cĂčng tháșŻp sĂĄng mĆ©i tĂȘn bĂȘn pháșŁi"] # 0x27a2 (en: 'three d top lighted rightwards arrow') - - "➣": [t: "ba d dưới cĂčng ĂĄnh sĂĄng mĆ©i tĂȘn bĂȘn pháșŁi"] # 0x27a3 (en: 'three d bottom lighted rightwards arrow') - - "➀": [t: "mĆ©i tĂȘn bĂȘn pháșŁi mĂ u đen"] # 0x27a4 (en: 'black rightwards arrowhead') - - "➄": [t: "đen náș·ng cong xuống vĂ  mĆ©i tĂȘn pháșŁi"] # 0x27a5 (en: 'heavy black curved downwards and rightwards arrow') - - "➊": [t: "đen náș·ng cong lĂȘn trĂȘn vĂ  mĆ©i tĂȘn pháșŁi"] # 0x27a6 (en: 'heavy black curved upwards and rightwards arrow') - - "➧": [t: "squat mĂ u đen mĆ©i tĂȘn bĂȘn pháșŁi"] # 0x27a7 (en: 'squat black rightwards arrow') - - "➚": [t: "mĆ©i tĂȘn bĂȘn pháșŁi bĂȘn lĂ”m náș·ng"] # 0x27a8 (en: 'heavy concave-pointed black rightwards arrow') - - "➩": [t: "mĆ©i tĂȘn bĂȘn pháșŁi mĂ u tráșŻng bĂłng pháșŁi"] # 0x27a9 (en: 'right-shaded white rightwards arrow') - - "âžȘ": [t: "mĆ©i tĂȘn bĂȘn pháșŁi mĂ u tráșŻng bĂȘn trĂĄi"] # 0x27aa (en: 'left-shaded white rightwards arrow') - - "➫": [t: "mĆ©i tĂȘn bĂȘn pháșŁi bị nghiĂȘng máș·t về phĂ­a sau"] # 0x27ab (en: 'back-tilted shadowed white rightwards arrow') - - "➬": [t: "mĆ©i tĂȘn bĂȘn pháșŁi bĂłng tối nghiĂȘng trước"] # 0x27ac (en: 'front-tilted shadowed white rightwards arrow') - - "➭": [t: "mĆ©i tĂȘn bĂȘn pháșŁi bĂłng bĂȘn pháșŁi tháș„p"] # 0x27ad (en: 'heavy lower right-shadowed white rightwards arrow') - - "➼": [t: "mĆ©i tĂȘn bĂȘn pháșŁi bĂłng bĂȘn pháșŁi náș·ng"] # 0x27ae (en: 'heavy upper right-shadowed white rightwards arrow') - - "➯": [t: "nổi lĂȘn mĆ©i tĂȘn bĂȘn pháșŁi bĂłng pháșŁi dưới bĂȘn pháșŁi"] # 0x27af (en: 'notched lower right-shadowed white rightwards arrow') - - "➱": [t: "nổi báș­t trĂȘn mĆ©i tĂȘn bĂȘn pháșŁi bĂłng bĂȘn pháșŁi"] # 0x27b1 (en: 'notched upper right-shadowed white rightwards arrow') - - "âžČ": [t: "khoanh trĂČn mĆ©i tĂȘn bĂȘn pháșŁi mĂ u tráșŻng náș·ng"] # 0x27b2 (en: 'circled heavy white rightwards arrow') - - "➳": [t: "mĆ©i tĂȘn bĂȘn pháșŁi mĂ u tráșŻng"] # 0x27b3 (en: 'white-feathered rightwards arrow') - - "➮": [t: "mĆ©i tĂȘn phĂ­a đîng nam lĂŽng đen"] # 0x27b4 (en: 'black-feathered south east arrow') - - "➔": [t: "mĆ©i tĂȘn bĂȘn pháșŁi mĂ u đen"] # 0x27b5 (en: 'black-feathered rightwards arrow') - - "➶": [t: "mĆ©i tĂȘn đîng báșŻc lĂŽng đen"] # 0x27b6 (en: 'black-feathered north east arrow') - - "➷": [t: "mĆ©i tĂȘn đîng nam háșĄng náș·ng"] # 0x27b7 (en: 'heavy black-feathered south east arrow') - - "➾": [t: "mĆ©i tĂȘn bĂȘn pháșŁi mĂ u đen náș·ng"] # 0x27b8 (en: 'heavy black-feathered rightwards arrow') - - "âžč": [t: "mĆ©i tĂȘn đîng báșŻc háșĄng náș·ng"] # 0x27b9 (en: 'heavy black-feathered north east arrow') - - "âžș": [t: "teradrop-barbed mĆ©i tĂȘn pháșŁi"] # 0x27ba (en: 'teradrop-barbed rightwards arrow') - - "➻": [t: "mĆ©i tĂȘn bĂȘn pháșŁi náș·ng"] # 0x27bb (en: 'heavy teardrop-shanked rightwards arrow') - - "➌": [t: "mĆ©i tĂȘn đuĂŽi nĂȘm"] # 0x27bc (en: 'wedge-tailed rightwards arrow') - - "➜": [t: "mĆ©i tĂȘn bĂȘn pháșŁi náș·ng"] # 0x27bd (en: 'heavy wedge-tailed rightwards arrow') - - "➟": [t: "mở mĆ©i tĂȘn bĂȘn pháșŁi"] # 0x27be (en: 'open-outlined rightwards arrow') - - "⟀": [t: "gĂłc ba chiều"] # 0x27c0 (en: 'three dimensional angle') - - "⟁": [t: "tam giĂĄc tráșŻng chứa tam giĂĄc nhỏ mĂ u tráșŻng"] # 0x27c1 (en: 'white triangle containing small white triangle') - - "⟂": # 0x27c2 - - test: - if: "$Verbosity!='Terse'" - then: [t: "vuĂŽng gĂłc với"] # (en: 'is perpendicular to') - - "⟃": # 0x27c3 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "một táș­p hợp con mở cá»§a" # (en: 'an open subset of') - - "⟄": # 0x27c4 - - test: - if: "$Verbosity!='Terse'" - then: [t: "lĂ "] # (en: 'is') - - t: "một siĂȘu sao mở cá»§a" # (en: 'an open superset of') - - "⟅": [t: "phĂąn dáș„u tĂși hĂŹnh chữ s"] # 0x27c5 (en: 'left s-shaped bag delimiter') - - "⟆": [t: "phĂąn dáș„u tĂși hĂŹnh chữ s pháșŁi"] # 0x27c6 (en: 'right s-shaped bag delimiter') - - "⟇": [t: "hoáș·c với dáș„u cháș„m bĂȘn trong"] # 0x27c7 (en: 'or with dot inside') - - "⟈": [t: "đáșŁo ngÆ°á»Łc solidus preeding táș­p hợp con"] # 0x27c8 (en: 'reverse solidus preceeding subset') - - "⟉": [t: "superset preceding solidus"] # 0x27c9 (en: 'superset preceeding solidus') - - "⟊": [t: "thanh dọc với gáșĄch ngang"] # 0x27ca (en: 'vertical bar with horizontal stroke') - - "⟋": [t: "đường chĂ©o tăng toĂĄn"] # 0x27cb (en: 'mathematical rising diagonal') - - "⟌": [t: "phĂąn chia dĂ i"] # 0x27cc (en: 'long division') - - "⟍": [t: "đường chĂ©o giáșŁm toĂĄn"] # 0x27cd (en: 'mathematical falling diagonal') - - "⟎": [t: "bĂŹnh phÆ°ÆĄng logic vĂ "] # 0x27ce (en: 'squared logical and') - - "⟏": [t: "bĂŹnh phÆ°ÆĄng logic hoáș·c"] # 0x27cf (en: 'squared logical or') - - "⟐": [t: "kim cÆ°ÆĄng tráșŻng với cháș„m giữa"] # 0x27d0 (en: 'white diamond with centered dot') - - "⟑": [t: "vĂ  với dáș„u cháș„m"] # 0x27d1 (en: 'and with dot') - - "⟒": [t: "yáșżu tố mở lĂȘn trĂȘn"] # 0x27d2 (en: 'element of openning upwards') - - "⟓": [t: "gĂłc dưới bĂȘn pháșŁi với dáș„u cháș„m"] # 0x27d3 (en: 'lower right corner with dot') - - "⟔": [t: "gĂłc trĂȘn bĂȘn trĂĄi với dáș„u cháș„m"] # 0x27d4 (en: 'upper left corner with dot') - - "⟕": [t: "bĂȘn ngoĂ i tham gia"] # 0x27d5 (en: 'left outer join') - - "⟖": [t: "bĂȘn ngoĂ i tham gia"] # 0x27d6 (en: 'right outer join') - - "⟗": [t: "tham gia đáș§y đủ bĂȘn ngoĂ i"] # 0x27d7 (en: 'full outer join') - - "⟘": [t: "lớn lĂȘn tack"] # 0x27d8 (en: 'large up tack') - - "⟙": [t: "lớn xuống tack"] # 0x27d9 (en: 'large down tack') - - "⟚": [t: "trĂĄi vĂ  bĂȘn pháșŁi turnstile"] # 0x27da (en: 'left and right double turnstile') - - "⟛": [t: "bĂȘn trĂĄi vĂ  bĂȘn pháșŁi"] # 0x27db (en: 'left and right tack') - - "⟜": [t: "multimap trĂĄi"] # 0x27dc (en: 'left multimap') - - "⟝": [t: "long pháșŁi tack"] # 0x27dd (en: 'long right tack') - - "⟞": [t: "long trĂĄi tack"] # 0x27de (en: 'long left tack') - - "⟟": [t: "lĂȘn tack với vĂČng trĂČn ở trĂȘn"] # 0x27df (en: 'up tack with circle above') - - "⟠": [t: "lozenge chia cho quy táșŻc ngang"] # 0x27e0 (en: 'lozenge divided by horizontal rule') - - "⟡": [t: "kim cÆ°ÆĄng máș·t lĂ”m mĂ u tráșŻng"] # 0x27e1 (en: 'white concave sided diamond') - - "⟱": [t: "kim cÆ°ÆĄng máș·t lĂ”m mĂ u tráșŻng với tick trĂĄi"] # 0x27e2 (en: 'white concave sided diamond with leftwards tick') - - "⟣": [t: "kim cÆ°ÆĄng máș·t lĂ”m mĂ u tráșŻng với tick bĂȘn pháșŁi"] # 0x27e3 (en: 'white concave sided diamond with rightwards tick') - - "⟀": [t: "quáșŁng trường tráșŻng với đánh dáș„u trĂĄi"] # 0x27e4 (en: 'white square with leftwards tick') - - "⟄": [t: "quáșŁng trường tráșŻng với đánh dáș„u pháșŁi"] # 0x27e5 (en: 'white square with rightwards tick') - - "⟩": [t: "khung vuĂŽng mĂ u tráșŻng"] # 0x27e6 (en: 'left white square bracket') - - "⟧": [t: "khung vuĂŽng tráșŻng bĂȘn pháșŁi"] # 0x27e7 (en: 'right white square bracket') - - "⟹": [t: "khung gĂłc trĂĄi"] # 0x27e8 (en: 'left angle bracket') - - "⟩": [t: "khung gĂłc pháșŁi"] # 0x27e9 (en: 'right angle bracket') - - "âŸȘ": [t: "khung gĂłc hai gĂłc"] # 0x27ea (en: 'left double angle bracket') - - "⟫": [t: "khung gĂłc gáș„p đîi"] # 0x27eb (en: 'right double angle bracket') - - "⟬": [t: "bĂȘn trĂĄi khung vỏ rĂča tráșŻng"] # 0x27ec (en: 'left white tortoise shell bracket') - - "⟭": [t: "bĂȘn pháșŁi khung vỏ rĂča tráșŻng"] # 0x27ed (en: 'right white tortoise shell bracket') - - "⟼": [t: "bĂȘn trĂĄi pháșłng dáș„u ngoáș·c Ä‘ÆĄn"] # 0x27ee (en: 'left flattened parenthesis') - - "⟯": [t: "bĂȘn pháșŁi pháșłng ngoáș·c Ä‘ÆĄn"] # 0x27ef (en: 'right flattened parenthesis') - - "⟰": [t: "mĆ©i tĂȘn tăng bốn láș§n"] # 0x27f0 (en: 'upwards quadruple arrow') - - "⟱": [t: "mĆ©i tĂȘn bốn láș§n xuống"] # 0x27f1 (en: 'downwards quadruple arrow') - - "âŸČ": [t: "mĆ©i tĂȘn vĂČng trĂČn ngÆ°á»Łc chiều kim đồng hồ"] # 0x27f2 (en: 'anticlockwise gapped circle arrow') - - "⟳": [t: "mĆ©i tĂȘn vĂČng trĂČn theo chiều kim đồng hồ"] # 0x27f3 (en: 'clockwise gapped circle arrow') - - "⟮": [t: "mĆ©i tĂȘn pháșŁi với vĂČng trĂČn"] # 0x27f4 (en: 'right arrow with circled plus') - - "⟔": [t: "mĆ©i tĂȘn dĂ i trĂĄi"] # 0x27f5 (en: 'long leftwards arrow') - - "⟶": [t: "mĆ©i tĂȘn dĂ i pháșŁi"] # 0x27f6 (en: 'long rightwards arrow') - - "⟷": [t: "mĆ©i tĂȘn dĂ i bĂȘn trĂĄi"] # 0x27f7 (en: 'long left right arrow') - - "⟾": [t: "mĆ©i tĂȘn đîi dĂ i trĂĄi"] # 0x27f8 (en: 'long leftwards double arrow') - - "âŸč": [t: "mĆ©i tĂȘn đîi dĂ i pháșŁi"] # 0x27f9 (en: 'long rightwards double arrow') - - "âŸș": [t: "mĆ©i tĂȘn đîi dĂ i trĂĄi bĂȘn trĂĄi"] # 0x27fa (en: 'long left right double arrow') - - "⟻": [t: "mĆ©i tĂȘn dĂ i trĂĄi từ thanh"] # 0x27fb (en: 'long leftwards arrow from bar') - - "⟌": [t: "mĆ©i tĂȘn dĂ i pháșŁi từ thanh"] # 0x27fc (en: 'long rightwards arrow from bar') - - "⟜": [t: "mĆ©i tĂȘn đîi dĂ i trĂĄi từ thanh"] # 0x27fd (en: 'long leftwards double arrow from bar') - - "⟟": [t: "mĆ©i tĂȘn dĂ i gáș„p đîi từ thanh"] # 0x27fe (en: 'long rightwards double arrow from bar') - - "⟿": [t: "mĆ©i tĂȘn squiggle dĂ i pháșŁi"] # 0x27ff (en: 'long rightwards squiggle arrow') - - " ": [t: "pháșŁi hai mĆ©i tĂȘn hai đáș§u với gáșĄch tháșłng đứng"] # 0x2900 (en: 'rightwards two headed arrow with vertical stroke') - - " ": [t: "pháșŁi hai mĆ©i tĂȘn hai đáș§u với gáșĄch tháșłng đứng"] # 0x2901 (en: 'rightwards two headed arrow with double vertical stroke') - - " ": [t: "mĆ©i tĂȘn đîi bĂȘn trĂĄi với gáșĄch dọc"] # 0x2902 (en: 'leftwards double arrow with vertical stroke') - - " ": [t: "mĆ©i tĂȘn kĂ©p pháșŁi với gáșĄch dọc"] # 0x2903 (en: 'rightwards double arrow with vertical stroke') - - " ": [t: "mĆ©i tĂȘn kĂ©p bĂȘn trĂĄi với gáșĄch dọc"] # 0x2904 (en: 'left right double arrow with vertical stroke') - - " ": [t: "pháșŁi hai mĆ©i tĂȘn hai đáș§u từ thanh"] # 0x2905 (en: 'rightwards two headed arrow from bar') - - " ": [t: "mĆ©i tĂȘn đîi bĂȘn trĂĄi từ thanh"] # 0x2906 (en: 'leftwards double arrow from bar') - - " ": [t: "mĆ©i tĂȘn kĂ©p bĂȘn pháșŁi từ thanh"] # 0x2907 (en: 'rightwards double arrow from bar') - - " ": [t: "mĆ©i tĂȘn xuống với gáșĄch ngang"] # 0x2908 (en: 'downwards arrow with horizontal stroke') - - " ": [t: "mĆ©i tĂȘn hướng lĂȘn với gáșĄch ngang"] # 0x2909 (en: 'upwards arrow with horizontal stroke') - - " ": [t: "mĆ©i tĂȘn tăng ba"] # 0x290a (en: 'upwards triple arrow') - - "​": [t: "mĆ©i tĂȘn ba xuống xuống"] # 0x290b (en: 'downwards triple arrow') - - "‌": [t: "mĆ©i tĂȘn double double bĂȘn trĂĄi"] # 0x290c (en: 'leftwards double dash arrow') - - "‍": [t: "mĆ©i tĂȘn double double bĂȘn pháșŁi"] # 0x290d (en: 'rightwards double dash arrow') - - "‎": [t: "mĆ©i tĂȘn ba dash bĂȘn trĂĄi"] # 0x290e (en: 'leftwards triple dash arrow') - - "‏": [t: "mĆ©i tĂȘn ba bĂȘn pháșŁi"] # 0x290f (en: 'rightwards triple dash arrow') - - "‐": [t: "pháșŁi hai mĆ©i tĂȘn ba đáș§u"] # 0x2910 (en: 'rightwards two headed triple dash arrow') - - "‑": [t: "mĆ©i tĂȘn pháșŁi với thĂąn cháș„m cháș„m"] # 0x2911 (en: 'rightwards arrow with dotted stem') - - "‒": [t: "mĆ©i tĂȘn hướng lĂȘn đáșżn thanh"] # 0x2912 (en: 'upwards arrow to bar') - - "–": [t: "mĆ©i tĂȘn xuống thanh"] # 0x2913 (en: 'downwards arrow to bar') - - "—": [t: "mĆ©i tĂȘn pháșŁi với đuĂŽi vĂ  gáșĄch dọc"] # 0x2914 (en: 'rightwards arrow with tail and vertical stroke') - - "―": [t: "mĆ©i tĂȘn pháșŁi với đuĂŽi vĂ  gáșĄch dọc"] # 0x2915 (en: 'rightwards arrow with tail and double vertical stroke') - - "‖": [t: "pháșŁi hai mĆ©i tĂȘn hai đáș§u với đuĂŽi"] # 0x2916 (en: 'rightwards two headed arrow with tail') - - "‗": [t: "pháșŁi hai mĆ©i tĂȘn hai đáș§u với đuĂŽi với gáșĄch tháșłng đứng"] # 0x2917 (en: 'rightwards two headed arrow with tail with vertical stroke') - - "‘": [t: "pháșŁi hai mĆ©i tĂȘn hai đáș§u với đuĂŽi với gáșĄch tháșłng đứng"] # 0x2918 (en: 'rightwards two headed arrow with tail with double vertical stroke') - - "’": [t: "đuĂŽi mĆ©i tĂȘn trĂĄi"] # 0x2919 (en: 'leftwards arrow tail') - - "‚": [t: "đuĂŽi mĆ©i tĂȘn pháșŁi"] # 0x291a (en: 'rightwards arrow tail') - - "‛": [t: "đuĂŽi hai mĆ©i tĂȘn trĂĄi"] # 0x291b (en: 'leftwards double arrow tail') - - "“": [t: "đuĂŽi mĆ©i tĂȘn kĂ©p pháșŁi"] # 0x291c (en: 'rightwards double arrow tail') - - "”": [t: "mĆ©i tĂȘn trĂĄi vĂ o kim cÆ°ÆĄng đáș§y"] # 0x291d (en: 'leftwards arrow to filled diamond') - - "„": [t: "mĆ©i tĂȘn bĂȘn pháșŁi vĂ o kim cÆ°ÆĄng đáș§y"] # 0x291e (en: 'rightwards arrow to filled diamond') - - "‟": [t: "mĆ©i tĂȘn trĂĄi từ thanh đáșżn kim cÆ°ÆĄng đáș§y"] # 0x291f (en: 'leftwards arrow from bar to filled diamond') - - "†": [t: "mĆ©i tĂȘn bĂȘn pháșŁi từ thanh đáșżn kim cÆ°ÆĄng đáș§y"] # 0x2920 (en: 'rightwards arrow from bar to filled diamond') - - "‥": [t: "mĆ©i tĂȘn tĂąy báșŻc vĂ  đîng nam"] # 0x2921 (en: 'north west and south east arrow') - - "‹": [t: "mĆ©i tĂȘn đîng báșŻc vĂ  tĂąy nam"] # 0x2922 (en: 'north east and south west arrow') - - "‣": [t: "mĆ©i tĂȘn tĂąy báșŻc với mĂłc"] # 0x2923 (en: 'north west arrow with hook') - - " ": [t: "mĆ©i tĂȘn đîng báșŻc với mĂłc"] # 0x2924 (en: 'north east arrow with hook') - - " ": [t: "mĆ©i tĂȘn đîng nam với mĂłc"] # 0x2925 (en: 'south east arrow with hook') - - " ": [t: "mĆ©i tĂȘn tĂąy nam với mĂłc"] # 0x2926 (en: 'south west arrow with hook') - - "‧": [t: "mĆ©i tĂȘn tĂąy báșŻc vĂ  mĆ©i tĂȘn đîng báșŻc"] # 0x2927 (en: 'north west arrow and north east arrow') - - "‚": [t: "mĆ©i tĂȘn đîng báșŻc vĂ  mĆ©i tĂȘn đîng nam"] # 0x2928 (en: 'north east arrow and south east arrow') - - "
": [t: "mĆ©i tĂȘn đîng nam vĂ  mĆ©i tĂȘn tĂąy nam"] # 0x2929 (en: 'south east arrow and south west arrow') - - "â€Ș": [t: "mĆ©i tĂȘn tĂąy nam vĂ  mĆ©i tĂȘn tĂąy báșŻc"] # 0x292a (en: 'south west arrow and north west arrow') - - "‫": [t: "vÆ°á»Łt qua đường chĂ©o đi chĂ©o"] # 0x292b (en: 'rising diagonal crossing falling diagonal') - - "‏": [t: "ngĂŁ đường chĂ©o chĂ©o chĂ©o"] # 0x292c (en: 'falling diagonal crossing rising diagonal') - - "‭": [t: "mĆ©i tĂȘn đîng nam băng qua mĆ©i tĂȘn đîng báșŻc"] # 0x292d (en: 'south east arrow crossing north east arrow') - - "‟": [t: "mĆ©i tĂȘn đîng báșŻc băng qua mĆ©i tĂȘn đîng nam"] # 0x292e (en: 'north east arrow crossing south east arrow') - - " ": [t: "ngĂŁ đường chĂ©o băng qua mĆ©i tĂȘn đîng báșŻc"] # 0x292f (en: 'falling diagonal crossing north east arrow') - - "‰": [t: "tăng đường chĂ©o băng qua mĆ©i tĂȘn đîng nam"] # 0x2930 (en: 'rising diagonal crossing south east arrow') - - "‱": [t: "mĆ©i tĂȘn đîng báșŻc băng qua mĆ©i tĂȘn tĂąy báșŻc"] # 0x2931 (en: 'north east arrow crossing north west arrow') - - "â€Č": [t: "mĆ©i tĂȘn tĂąy báșŻc băng qua mĆ©i tĂȘn đîng báșŻc"] # 0x2932 (en: 'north west arrow crossing north east arrow') - - "″": [t: "mĆ©i tĂȘn sĂłng chỉ trá»±c tiáșżp bĂȘn pháșŁi"] # 0x2933 (en: 'wave arrow pointing directly right') - - "‎": [t: "mĆ©i tĂȘn chỉ ngay sau đó cong lĂȘn trĂȘn"] # 0x2934 (en: 'arrow pointing rightwards then curving upwards') - - "—": [t: "mĆ©i tĂȘn chỉ ngay sau đó cong xuống"] # 0x2935 (en: 'arrow pointing rightwards then curving downwards') - - "‶": [t: "mĆ©i tĂȘn hướng xuống dưới rồi cong trĂĄi"] # 0x2936 (en: 'arrow pointing downwards then curving leftwards') - - "‷": [t: "mĆ©i tĂȘn chỉ xuống dưới rồi cong pháșŁi"] # 0x2937 (en: 'arrow pointing downwards then curving rightwards') - - "„": [t: "bĂȘn bĂȘn pháșŁi arc mĆ©i tĂȘn theo chiều kim đồng hồ"] # 0x2938 (en: 'right side arc clockwise arrow') - - "â€č": [t: "bĂȘn bĂȘn trĂĄi arc mĆ©i tĂȘn ngÆ°á»Łc chiều kim đồng hồ"] # 0x2939 (en: 'left side arc anticlockwise arrow') - - "â€ș": [t: "vĂČng cung hĂ ng đáș§u mĆ©i tĂȘn chống theo chiều kim đồng hồ"] # 0x293a (en: 'top arc anticlockwise arrow') - - "※": [t: "vĂČng cung dưới cĂčng mĆ©i tĂȘn chống theo chiều kim đồng hồ"] # 0x293b (en: 'bottom arc anticlockwise arrow') - - "‌": [t: "mĆ©i tĂȘn vĂČng cung trĂȘn cĂčng theo chiều kim đồng hồ với điểm trừ"] # 0x293c (en: 'top arc clockwise arrow with minus') - - "“": [t: "mĆ©i tĂȘn pháșŁn khĂĄng hĂ ng đáș§u với plus"] # 0x293d (en: 'top arc anticlockwise arrow with plus') - - "‟": [t: "háșĄ mĆ©i tĂȘn bĂĄn nguyệt bĂȘn pháșŁi"] # 0x293e (en: 'lower right semicircular clockwise arrow') - - "‿": [t: "mĆ©i tĂȘn pháșŁn khĂĄng dưới hĂŹnh bĂĄn nguyệt bĂȘn trĂĄi"] # 0x293f (en: 'lower left semicircular anticlockwise arrow') - - "â„€": [t: "mĆ©i tĂȘn vĂČng trĂČn kĂ­n ngÆ°á»Łc chiều kim đồng hồ"] # 0x2940 (en: 'anticlockwise closed circle arrow') - - "℁": [t: "mĆ©i tĂȘn vĂČng trĂČn kĂ­n theo chiều kim đồng hồ"] # 0x2941 (en: 'clockwise closed circle arrow') - - "â„‚": [t: "mĆ©i tĂȘn bĂȘn pháșŁi phĂ­a trĂȘn mĆ©i tĂȘn ngáșŻn trĂĄi"] # 0x2942 (en: 'rightwards arrow above short leftwards arrow') - - "℃": [t: "mĆ©i tĂȘn trĂĄi phĂ­a trĂȘn mĆ©i tĂȘn ngáșŻn pháșŁi"] # 0x2943 (en: 'leftwards arrow above short rightwards arrow') - - "â„„": [t: "mĆ©i tĂȘn ngáșŻn bĂȘn pháșŁi phĂ­a trĂȘn mĆ©i tĂȘn trĂĄi"] # 0x2944 (en: 'short rightwards arrow above leftwards arrow') - - "â„…": [t: "mĆ©i tĂȘn bĂȘn pháșŁi với cộng với bĂȘn dưới"] # 0x2945 (en: 'rightwards arrow with plus below') - - "℆": [t: "mĆ©i tĂȘn trĂĄi với cộng với bĂȘn dưới"] # 0x2946 (en: 'leftwards arrow with plus below') - - "ℇ": [t: "mĆ©i tĂȘn pháșŁi qua x"] # 0x2947 (en: 'rightwards arrow through x') - - "℈": [t: "mĆ©i tĂȘn trĂĄi qua vĂČng trĂČn"] # 0x2948 (en: 'left right arrow through circle') - - "℉": [t: "lĂȘn tới hai mĆ©i tĂȘn đáș§u từ circle"] # 0x2949 (en: 'upwards two headed arrow from circle') - - "ℊ": [t: "bĂȘn trĂĄi barb lĂȘn bĂȘn pháșŁi barb xuống harpoon"] # 0x294a (en: 'left barb up right barb down harpoon') - - "â„‹": [t: "bĂȘn trĂĄi barb xuống bĂȘn pháșŁi barb up harpoon"] # 0x294b (en: 'left barb down right barb up harpoon') - - "ℌ": [t: "lĂȘn barb pháșŁi xuống barb trĂĄi harpoon"] # 0x294c (en: 'up barb right down barb left harpoon') - - "ℍ": [t: "lĂȘn barb trĂĄi xuống barb pháșŁi harpoon"] # 0x294d (en: 'up barb left down barb right harpoon') - - "ℎ": [t: "bĂȘn trĂĄi barb lĂȘn bĂȘn pháșŁi barb lĂȘn harpoon"] # 0x294e (en: 'left barb up right barb up harpoon') - - "ℏ": [t: "lĂȘn barb ngay xuống barb pháșŁi harpoon"] # 0x294f (en: 'up barb right down barb right harpoon') - - "ℐ": [t: "bĂȘn trĂĄi barb xuống bĂȘn pháșŁi barb xuống harpoon"] # 0x2950 (en: 'left barb down right barb down harpoon') - - "â„‘": [t: "lĂȘn barb trĂĄi xuống barb trĂĄi harpoon"] # 0x2951 (en: 'up barb left down barb left harpoon') - - "â„’": [t: "harpoon trĂĄi với barb lĂȘn đáșżn bar"] # 0x2952 (en: 'leftwards harpoon with barb up to bar') - - "â„“": [t: "harpoon pháșŁi với barb lĂȘn đáșżn bar"] # 0x2953 (en: 'rightwards harpoon with barb up to bar') - - "â„”": [t: "harpoon hướng lĂȘn với barb ngay để thanh"] # 0x2954 (en: 'upwards harpoon with barb right to bar') - - "â„•": [t: "downwards harpoon với barb ngay để thanh"] # 0x2955 (en: 'downwards harpoon with barb right to bar') - - "â„–": [t: "harpoon trĂĄi với barb xuống bar"] # 0x2956 (en: 'leftwards harpoon with barb down to bar') - - "â„—": [t: "harpoon pháșŁi với barb xuống bar"] # 0x2957 (en: 'rightwards harpoon with barb down to bar') - - "℘": [t: "harpoon đi lĂȘn với barb trĂĄi để thanh"] # 0x2958 (en: 'upwards harpoon with barb left to bar') - - "â„™": [t: "downwards harpoon với barb rời khỏi quĂĄn bar"] # 0x2959 (en: 'downwards harpoon with barb left to bar') - - "ℚ": [t: "harpoon trĂĄi với barb lĂȘn từ quĂĄn bar"] # 0x295a (en: 'leftwards harpoon with barb up from bar') - - "â„›": [t: "harpoon pháșŁi với barb lĂȘn từ bar"] # 0x295b (en: 'rightwards harpoon with barb up from bar') - - "ℜ": [t: "harpoon đi lĂȘn với barb ngay từ quĂĄn bar"] # 0x295c (en: 'upwards harpoon with barb right from bar') - - "ℝ": [t: "downwards harpoon với barb ngay từ quĂĄn bar"] # 0x295d (en: 'downwards harpoon with barb right from bar') - - "℞": [t: "harpoon trĂĄi với barb xuống từ bar"] # 0x295e (en: 'leftwards harpoon with barb down from bar') - - "℟": [t: "harpoon pháșŁi với barb xuống từ bar"] # 0x295f (en: 'rightwards harpoon with barb down from bar') - - "â„ ": [t: "harpoon đi lĂȘn với barb cĂČn láșĄi từ quĂĄn bar"] # 0x2960 (en: 'upwards harpoon with barb left from bar') - - "℥": [t: "downwards harpoon với barb rời khỏi quĂĄn bar"] # 0x2961 (en: 'downwards harpoon with barb left from bar') - - "ℹ": [t: "harpoon bĂȘn trĂĄi với barb lĂȘn trĂȘn harpoon bĂȘn trĂĄi với barb down"] # 0x2962 (en: 'leftwards harpoon with barb up above leftwards harpoon with barb down') - - "℣": [t: "harpoon đi lĂȘn với barb bĂȘn trĂĄi bĂȘn cáșĄnh harpoon với barb pháșŁi"] # 0x2963 (en: 'upwards harpoon with barb left beside upwards harpoon with barb right') - - "â„€": [t: "harpoon pháșŁi với barb lĂȘn trĂȘn harpoon bĂȘn pháșŁi với barb down"] # 0x2964 (en: 'rightwards harpoon with barb up above rightwards harpoon with barb down') - - "â„„": [t: "downwards harpoon với barb bĂȘn trĂĄi bĂȘn cáșĄnh harpoon với barb pháșŁi"] # 0x2965 (en: 'downwards harpoon with barb left beside downwards harpoon with barb right') - - "ℊ": [t: "harpoon bĂȘn trĂĄi với barb lĂȘn trĂȘn harpoon bĂȘn pháșŁi với barb up"] # 0x2966 (en: 'leftwards harpoon with barb up above rightwards harpoon with barb up') - - "â„§": [t: "harpoon bĂȘn trĂĄi với barb xuống phĂ­a trĂȘn harpoon bĂȘn pháșŁi với barb down"] # 0x2967 (en: 'leftwards harpoon with barb down above rightwards harpoon with barb down') - - "ℚ": [t: "harpoon pháșŁi với barb lĂȘn trĂȘn harpoon bĂȘn trĂĄi với barb up"] # 0x2968 (en: 'rightwards harpoon with barb up above leftwards harpoon with barb up') - - "â„©": [t: "harpoon pháșŁi với barb xuống phĂ­a trĂȘn harpoon bĂȘn trĂĄi với barb down"] # 0x2969 (en: 'rightwards harpoon with barb down above leftwards harpoon with barb down') - - "â„Ș": [t: "harpoon bĂȘn trĂĄi với barb lĂȘn trĂȘn dash dĂ i"] # 0x296a (en: 'leftwards harpoon with barb up above long dash') - - "â„«": [t: "harpoon bĂȘn trĂĄi với barb xuống bĂȘn dưới dáș„u gáșĄch ngang dĂ i"] # 0x296b (en: 'leftwards harpoon with barb down below long dash') - - "ℏ": [t: "harpoon bĂȘn pháșŁi với barb lĂȘn trĂȘn dash dĂ i"] # 0x296c (en: 'rightwards harpoon with barb up above long dash') - - "â„­": [t: "harpoon bĂȘn pháșŁi với barb xuống bĂȘn dưới dash dĂ i"] # 0x296d (en: 'rightwards harpoon with barb down below long dash') - - "℟": [t: "harpoon đi lĂȘn với barb bĂȘn trĂĄi bĂȘn cáșĄnh harpoon với barb pháșŁi"] # 0x296e (en: 'upwards harpoon with barb left beside downwards harpoon with barb right') - - "ℯ": [t: "downwards harpoon với barb bĂȘn trĂĄi bĂȘn cáșĄnh harpoon với barb pháșŁi"] # 0x296f (en: 'downwards harpoon with barb left beside upwards harpoon with barb right') - - "â„°": [t: "mĆ©i tĂȘn đîi pháșŁi với đáș§u trĂČn"] # 0x2970 (en: 'right double arrow with rounded head') - - "ℱ": [t: "báș±ng với mĆ©i tĂȘn bĂȘn pháșŁi"] # 0x2971 (en: 'equals above rightwards arrow') - - "â„Č": [t: "toĂĄn tá»­ tilde phĂ­a trĂȘn mĆ©i tĂȘn bĂȘn pháșŁi"] # 0x2972 (en: 'tilde operator above rightwards arrow') - - "ℳ": [t: "mĆ©i tĂȘn trĂĄi phĂ­a trĂȘn toĂĄn tá»­ tilde"] # 0x2973 (en: 'leftwards arrow above tilde operator') - - "ℎ": [t: "mĆ©i tĂȘn bĂȘn pháșŁi phĂ­a trĂȘn toĂĄn tá»­ tilde"] # 0x2974 (en: 'rightwards arrow above tilde operator') - - "â„”": [t: "mĆ©i tĂȘn bĂȘn pháșŁi trĂȘn gáș§n như báș±ng"] # 0x2975 (en: 'rightwards arrow above almost equal to') - - "â„¶": [t: "Ă­t hÆĄn mĆ©i tĂȘn bĂȘn trĂĄi"] # 0x2976 (en: 'less than above leftwards arrow') - - "â„·": [t: "mĆ©i tĂȘn trĂĄi qua Ă­t hÆĄn"] # 0x2977 (en: 'leftwards arrow through less than') - - "℞": [t: "lớn hÆĄn mĆ©i tĂȘn bĂȘn pháșŁi trĂȘn"] # 0x2978 (en: 'greater than above rightwards arrow') - - "â„č": [t: "táș­p hợp con trĂȘn mĆ©i tĂȘn pháșŁi"] # 0x2979 (en: 'subset above rightwards arrow') - - "â„ș": [t: "mĆ©i tĂȘn trĂĄi qua táș­p hợp con"] # 0x297a (en: 'leftwards arrow through subset') - - "â„»": [t: "superset phĂ­a trĂȘn mĆ©i tĂȘn trĂĄi"] # 0x297b (en: 'superset above leftwards arrow') - - "ℌ": [t: "đuĂŽi cĂĄ trĂĄi"] # 0x297c (en: 'left fish tail') - - "ℜ": [t: "đuĂŽi cĂĄ pháșŁi"] # 0x297d (en: 'right fish tail') - - "℟": [t: "lĂȘn đuĂŽi cĂĄ"] # 0x297e (en: 'up fish tail') - - "ℿ": [t: "xuống đuĂŽi cĂĄ"] # 0x297f (en: 'down fish tail') - - "⩀": [t: "triple dọc thanh phĂąn định"] # 0x2980 (en: 'triple vertical bar delimiter') - - "⊁": [t: "z kĂœ hiệu kĂœ hiệu"] # 0x2981 (en: 'z notation spot') - - "⩂": [t: "z kĂœ hiệu loáșĄi đáșĄi trĂ ng"] # 0x2982 (en: 'z notation type colon') - - "⊃": [t: "náșčp tráșŻng"] # 0x2983 (en: 'left white brace') - - "⩄": [t: "niềng răng tráșŻng pháșŁi"] # 0x2984 (en: 'right white brace') - - "⩅": [t: "dáș„u ngoáș·c Ä‘ÆĄn tráșŻng"] # 0x2985 (en: 'left white parenthesis') - - "⩆": [t: "dáș„u ngoáș·c Ä‘ÆĄn tráșŻng bĂȘn pháșŁi"] # 0x2986 (en: 'right white parenthesis') - - "⩇": [t: "z kĂœ hiệu bĂȘn trĂĄi khung hĂŹnh áșŁnh"] # 0x2987 (en: 'z notation left image bracket') - - "⊈": [t: "z kĂœ hiệu bĂȘn pháșŁi khung hĂŹnh áșŁnh"] # 0x2988 (en: 'z notation right image bracket') - - "⩉": [t: "z kĂœ hiệu bĂȘn trĂĄi khung liĂȘn káșżt"] # 0x2989 (en: 'z notation left binding bracket') - - "⩊": [t: "z kĂœ hiệu bĂȘn pháșŁi khung liĂȘn káșżt"] # 0x298a (en: 'z notation right binding bracket') - - "⩋": [t: "khung vuĂŽng bĂȘn trĂĄi với unterbar"] # 0x298b (en: 'left square bracket with underbar') - - "⩌": [t: "khung vuĂŽng bĂȘn pháșŁi với atarbar"] # 0x298c (en: 'right square bracket with underbar') - - "⊍": [t: "khung vuĂŽng bĂȘn trĂĄi với tĂ­ch táșŻc ở gĂłc trĂȘn cĂčng"] # 0x298d (en: 'left square bracket with tick in top corner') - - "⊎": [t: "khung vuĂŽng bĂȘn pháșŁi với tĂ­ch táșŻc ở gĂłc dưới cĂčng"] # 0x298e (en: 'right square bracket with tick in bottom corner') - - "⊏": [t: "khung vuĂŽng bĂȘn trĂĄi với tĂ­ch táșŻc ở gĂłc dưới cĂčng"] # 0x298f (en: 'left square bracket with tick in bottom corner') - - "⊐": [t: "khung vuĂŽng bĂȘn pháșŁi với tĂ­ch táșŻc ở gĂłc trĂȘn cĂčng"] # 0x2990 (en: 'right square bracket with tick in top corner') - - "⩑": [t: "khung gĂłc trĂĄi với dáș„u cháș„m"] # 0x2991 (en: 'left angle bracket with dot') - - "⩒": [t: "khung gĂłc pháșŁi với dáș„u cháș„m"] # 0x2992 (en: 'right angle bracket with dot') - - "⩓": [t: "vĂČng cung trĂĄi Ă­t hÆĄn khung"] # 0x2993 (en: 'left arc less than bracket') - - "⩔": [t: "arc bĂȘn pháșŁi lớn hÆĄn giĂĄ đụ"] # 0x2994 (en: 'right arc greater than bracket') - - "⩕": [t: "double left arc lớn hÆĄn giĂĄ đụ"] # 0x2995 (en: 'double left arc greater than bracket') - - "⩖": [t: "double bĂȘn pháșŁi vĂČng cung Ă­t hÆĄn khung"] # 0x2996 (en: 'double right arc less than bracket') - - "⩗": [t: "để láșĄi khung vỏ rĂča đen"] # 0x2997 (en: 'left black tortoise shell bracket') - - "⊘": [t: "bĂȘn pháșŁi khung vỏ rĂča đen"] # 0x2998 (en: 'right black tortoise shell bracket') - - "⩙": [t: "hĂ ng rĂ o cháș„m"] # 0x2999 (en: 'dotted fence') - - "⩚": [t: "đường ngoáș±n ngoĂšo dọc"] # 0x299a (en: 'vertical zigzag line') - - "⩛": [t: "đo gĂłc mở bĂȘn trĂĄi"] # 0x299b (en: 'measured angle opening left') - - "⩜": [t: "biáșżn gĂłc bĂȘn pháșŁi với hĂŹnh vuĂŽng"] # 0x299c (en: 'right angle varient with square') - - "⊝": [t: "đo gĂłc bĂȘn pháșŁi với dáș„u cháș„m"] # 0x299d (en: 'measured right angle with dot') - - "⊞": [t: "gĂłc với s bĂȘn trong"] # 0x299e (en: 'angle with s inside') - - "⩟": [t: "gĂłc nhọn"] # 0x299f (en: 'acute angle') - - "⊠": [t: "gĂłc spehrical mở bĂȘn trĂĄi"] # 0x29a0 (en: 'spehrical angle opening left') - - "⊥": [t: "gĂłc spehrical mở ra"] # 0x29a1 (en: 'spehrical angle opening up') - - "⊹": [t: "quay gĂłc"] # 0x29a2 (en: 'turned angle') - - "⊣": [t: "gĂłc đáșŁo ngÆ°á»Łc"] # 0x29a3 (en: 'reversed angle') - - "⊀": [t: "gĂłc với atarbar"] # 0x29a4 (en: 'angle with underbar') - - "⊄": [t: "gĂłc đáșŁo ngÆ°á»Łc với unterbar"] # 0x29a5 (en: 'reversed angle with underbar') - - "⊊": [t: "gĂłc xiĂȘn mở ra"] # 0x29a6 (en: 'oblique angle opening up') - - "⊧": [t: "gĂłc xiĂȘn mở xuống"] # 0x29a7 (en: 'oblique angle opening down') - - "⊚": [t: "đo gĂłc với đáș§u cĂĄnh tay mở trong mĆ©i tĂȘn chỉ lĂȘn vĂ  sang pháșŁi"] # 0x29a8 (en: 'measured angle with open arm ending in arrow pointing up and to the right') - - "⊩": [t: "đo gĂłc với đáș§u cĂĄnh tay mở trong mĆ©i tĂȘn hướng lĂȘn vĂ  bĂȘn trĂĄi"] # 0x29a9 (en: 'measured angle with open arm ending in arrow pointing up and to the left') - - "âŠȘ": [t: "đo gĂłc với đáș§u cĂĄnh tay mở trong mĆ©i tĂȘn chỉ xuống vĂ  bĂȘn pháșŁi"] # 0x29aa (en: 'measured angle with open arm ending in arrow pointing down and to the right') - - "⊫": [t: "đo gĂłc với đáș§u cĂĄnh tay mở trong mĆ©i tĂȘn chỉ xuống vĂ  bĂȘn trĂĄi"] # 0x29ab (en: 'measured angle with open arm ending in arrow pointing down and to the left') - - "⊏": [t: "đo gĂłc với đáș§u cĂĄnh tay mở trong mĆ©i tĂȘn hướng tháșłng vĂ  lĂȘn"] # 0x29ac (en: 'measured angle with open arm ending in arrow pointing right and up') - - "⊭": [t: "đo gĂłc với đáș§u cĂĄnh tay mở trong mĆ©i tĂȘn hướng sang trĂĄi vĂ  lĂȘn"] # 0x29ad (en: 'measured angle with open arm ending in arrow pointing left and up') - - "⊟": [t: "đo gĂłc với đáș§u cĂĄnh tay mở trong mĆ©i tĂȘn chỉ tháșłng vĂ  xuống"] # 0x29ae (en: 'measured angle with open arm ending in arrow pointing right and down') - - "⊯": [t: "đo gĂłc với đáș§u cĂĄnh tay mở trong mĆ©i tĂȘn hướng sang trĂĄi vĂ  xuống"] # 0x29af (en: 'measured angle with open arm ending in arrow pointing left and down') - - "⊰": [t: "đáșŁo ngÆ°á»Łc bộ trống"] # 0x29b0 (en: 'reversed empty set') - - "⊱": [t: "bộ trống với thanh toĂĄn quĂĄ mức"] # 0x29b1 (en: 'empty set with overbar') - - "âŠČ": [t: "bộ trống với vĂČng trĂČn nhỏ ở trĂȘn"] # 0x29b2 (en: 'empty set with small circle above') - - "⊳": [t: "bộ trống với mĆ©i tĂȘn pháșŁi ở trĂȘn"] # 0x29b3 (en: 'empty set with right arrow above') - - "⊎": [t: "bộ trống với mĆ©i tĂȘn trĂĄi ở trĂȘn"] # 0x29b4 (en: 'empty set with left arrow above') - - "⊔": [t: "vĂČng trĂČn với thanh ngang"] # 0x29b5 (en: 'circle with horizontal bar') - - "⊶": [t: "bao quanh thanh dọc"] # 0x29b6 (en: 'circled vertical bar') - - "⊷": [t: "bao quanh song song"] # 0x29b7 (en: 'circled parallel') - - "⊞": [t: "khoanh trĂČn đáșŁo ngÆ°á»Łc solidus"] # 0x29b8 (en: 'circled reverse solidus') - - "âŠč": [t: "khoanh trĂČn vuĂŽng gĂłc"] # 0x29b9 (en: 'circled perpendicular') - - "âŠș": [t: "Ä‘Æ°á»Łc khoanh trĂČn chia cho thanh ngang vĂ  ná»­a trĂȘn chia cho thanh dọc"] # 0x29ba (en: 'circled divided by horizontal bar and top half divided by vertical bar') - - "⊻": [t: "vĂČng trĂČn với x chồng cháș„t x"] # 0x29bb (en: 'circle with superimposed x') - - "⊌": [t: "bao quanh dáș„u hiệu phĂąn chia quay ngÆ°á»Łc chiều kim đồng hồ"] # 0x29bc (en: 'circled anticlockwise rotated division sign') - - "⊜": [t: "lĂȘn mĆ©i tĂȘn qua vĂČng trĂČn"] # 0x29bd (en: 'up arrow through circle') - - "⊟": [t: "vĂČng đáșĄn tráșŻng bao quanh"] # 0x29be (en: 'circled white bullet') - - "⊿": [t: "vĂČng đáșĄn khoanh trĂČn"] # 0x29bf (en: 'circled bullet') - - "⧀": [t: "khoanh trĂČn Ă­t hÆĄn"] # 0x29c0 (en: 'circled less than') - - "⧁": [t: "bao quanh lớn hÆĄn"] # 0x29c1 (en: 'circled greater than') - - "⧂": [t: "vĂČng trĂČn với vĂČng trĂČn nhỏ ở bĂȘn pháșŁi"] # 0x29c2 (en: 'circle with small circle to the right') - - "⧃": [t: "vĂČng trĂČn với hai nĂ©t ngang ở bĂȘn pháșŁi"] # 0x29c3 (en: 'circle with two horizontal strokes to the right') - - "⧄": [t: "squared tăng chĂ©o chĂ©o"] # 0x29c4 (en: 'squared rising diagonal slash') - - "⧅": [t: "squared rÆĄi chĂ©o chĂ©o"] # 0x29c5 (en: 'squared falling diagonal slash') - - "⧆": [t: "dáș„u hoa thị bĂŹnh phÆ°ÆĄng"] # 0x29c6 (en: 'squared asterisk') - - "⧇": [t: "vĂČng trĂČn nhỏ bĂŹnh phÆ°ÆĄng"] # 0x29c7 (en: 'squared small circle') - - "⧈": [t: "quáșŁng trường bĂŹnh phÆ°ÆĄng"] # 0x29c8 (en: 'squared square') - - "⧉": [t: "hai người tham gia quáșŁng trường"] # 0x29c9 (en: 'two joined squares') - - "⧊": [t: "tam giĂĄc với dáș„u cháș„m ở trĂȘn"] # 0x29ca (en: 'triangle with dot above') - - "⧋": [t: "tam giĂĄc với atarbar"] # 0x29cb (en: 'triangle with underbar') - - "⧌": [t: "s trong tam giĂĄc"] # 0x29cc (en: 's in triangle') - - "⧍": [t: "tam giĂĄc với serifs ở dưới cĂčng"] # 0x29cd (en: 'triangle with serifs at bottom') - - "⧎": [t: "tam giĂĄc pháșŁi phĂ­a trĂȘn tam giĂĄc trĂĄi"] # 0x29ce (en: 'right triangle above left triangle') - - "⧏": [t: "trĂĄi timgle bĂȘn cáșĄnh thanh dọc"] # 0x29cf (en: 'left triangle beside vertical bar') - - "⧐": [t: "thanh dọc bĂȘn cáșĄnh tam giĂĄc pháșŁi"] # 0x29d0 (en: 'vertical bar beside right triangle') - - "⧑": [t: "bowtie với một ná»­a mĂ u đen"] # 0x29d1 (en: 'bowtie with left half black') - - "⧒": [t: "bowtie với ná»­a đen pháșŁi"] # 0x29d2 (en: 'bowtie with right half black') - - "⧓": [t: "bowtie đen"] # 0x29d3 (en: 'black bowtie') - - "⧔": [t: "láș§n với một ná»­a mĂ u đen"] # 0x29d4 (en: 'times with left half black') - - "⧕": [t: "láș§n với ná»­a mĂ u đen bĂȘn pháșŁi"] # 0x29d5 (en: 'times with right half black') - - "⧖": [t: "đồng hồ cĂĄt tráșŻng"] # 0x29d6 (en: 'white hourglass') - - "⧗": [t: "đồng hồ cĂĄt đen"] # 0x29d7 (en: 'black hourglass') - - "⧘": [t: "để láșĄi hĂ ng rĂ o đau khổ"] # 0x29d8 (en: 'left wiggly fence') - - "⧙": [t: "hĂ ng rĂ o pháșŁi"] # 0x29d9 (en: 'right wiggly fence') - - "⧚": [t: "để láșĄi đîi hĂ ng rĂ o"] # 0x29da (en: 'left double wiggly fence') - - "⧛": [t: "pháșŁi đîi hĂ ng rĂ o wiggly"] # 0x29db (en: 'right double wiggly fence') - - "⧜": [t: "infinity khĂŽng đáș§y đủ"] # 0x29dc (en: 'incomplete infinity') - - "⧝": [t: "buộc vĂŽ cá»±c"] # 0x29dd (en: 'tie over infinity') - - "⧞": [t: "infinity phá»§ định với thanh tháșłng đứng"] # 0x29de (en: 'infinity negated with vertical bar') - - "⧟": [t: "multimap káșżt thĂșc hai láș§n"] # 0x29df (en: 'double-ended multimap') - - "â§ ": [t: "hĂŹnh vuĂŽng với đường viền đường viền"] # 0x29e0 (en: 'square with contoured outline') - - "â§Ą": [t: "tăng như"] # 0x29e1 (en: 'increases as') - - "â§ą": [t: "sáșŁn pháș©m xĂĄo trộn"] # 0x29e2 (en: 'shuffle product') - - "â§Ł": [t: "báș±ng dáș„u hiệu vĂ  song song nghiĂȘng"] # 0x29e3 (en: 'equals sign and slanted parallel') - - "â§€": [t: "báș±ng dáș„u hiệu vĂ  song song nghiĂȘng với tilde ở trĂȘn"] # 0x29e4 (en: 'equals sign and slanted parallel with tilde above') - - "â§„": [t: "giống hệt vĂ  nghiĂȘng song song"] # 0x29e5 (en: 'identical to and slanted parallel') - - "â§Š": [t: "gleich stark"] # 0x29e6 - - "â§§": [t: "đo nhiệt"] # 0x29e7 (en: 'thermydynamic') - - "â§š": [t: "xuống hĂŹnh tam giĂĄc với ná»­a mĂ u đen trĂĄi"] # 0x29e8 (en: 'down pointing triangle with left half black') - - "â§©": [t: "xuống hĂŹnh tam giĂĄc với ná»­a mĂ u đen bĂȘn pháșŁi"] # 0x29e9 (en: 'down pointing triangle with right half black') - - "â§Ș": [t: "kim cÆ°ÆĄng đen với mĆ©i tĂȘn xuống"] # 0x29ea (en: 'black diamond with down arrow') - - "â§«": [t: "black lozenge"] # 0x29eb - - "â§Ź": [t: "vĂČng trĂČn mĂ u tráșŻng với mĆ©i tĂȘn xuống"] # 0x29ec (en: 'white circle with down arrow') - - "â§­": [t: "vĂČng trĂČn mĂ u đen với mĆ©i tĂȘn xuống"] # 0x29ed (en: 'black circle with down arrow') - - "â§ź": [t: "quáșŁng trường tráșŻng lỗi"] # 0x29ee (en: 'error-barred white square') - - "â§Ż": [t: "quáșŁng trường đen lỗi lỗi"] # 0x29ef (en: 'error-barred black square') - - "â§°": [t: "kim cÆ°ÆĄng tráșŻng lỗi lỗi"] # 0x29f0 (en: 'error-barred white diamond') - - "â§±": [t: "kim cÆ°ÆĄng đen lỗi lỗi"] # 0x29f1 (en: 'error-barred black diamond') - - "â§Č": [t: "vĂČng trĂČn tráșŻng lỗi"] # 0x29f2 (en: 'error-barred white circle') - - "â§ł": [t: "vĂČng trĂČn đen lỗi"] # 0x29f3 (en: 'error-barred black circle') - - "â§Ž": [t: "sá»± triệt tiĂȘu quy táșŻc"] # 0x29f4 (en: 'rule-delayed') - - "â§”": [t: "hiệu"] # 0x29f5 (en: 'reverse solidus operator') - - "â§¶": [t: "solidus với overbar"] # 0x29f6 (en: 'solidus with overbar') - - "â§·": [t: "đáșŁo ngÆ°á»Łc solidus với gáșĄch ngang"] # 0x29f7 (en: 'reverse solidus with horizontal stroke') - - "â§ž": [t: "solidus lớn"] # 0x29f8 (en: 'big solidus') - - "â§č": [t: "solidus đáșŁo ngÆ°á»Łc lớn"] # 0x29f9 (en: 'big reverse solidus') - - "â§ș": [t: "double plus"] # 0x29fa - - "â§»": [t: "triple plus"] # 0x29fb - - "â§Œ": [t: "bĂȘn trĂĄi, giĂĄ đụ gĂłc cong"] # 0x29fc (en: 'left pointing curved angle bracket') - - "â§œ": [t: "chĂąn pháșŁi cong khung gĂłc cong"] # 0x29fd (en: 'right pointing curved angle bracket') - - "â§Ÿ": [t: "nhỏ bĂ©"] # 0x29fe (en: 'tiny') - - "â§ż": [t: "miny"] # 0x29ff - - "⹀": [t: "toĂĄn tá»­ cháș„m Ä‘Æ°á»Łc khoanh trĂČn"] # 0x2a00 (en: 'circled dot operator') - - "⚁": [t: "tuyáșżn đường cộng với toĂĄn tá»­ cộng với"] # 0x2a01 (en: 'circled plus operator') - - "⹂": [t: "nhĂ  điều hĂ nh thời gian Ä‘Æ°á»Łc khoanh trĂČn"] # 0x2a02 (en: 'circled times operator') - - "⚃": [t: "nhĂ  điều hĂ nh cĂŽng đoĂ n với dot"] # 0x2a03 (en: 'union operator with dot') - - "⹄": [t: "nhĂ  điều hĂ nh cĂŽng đoĂ n với plus"] # 0x2a04 (en: 'union operator with plus') - - "⹅": [t: "toĂĄn tá»­ giao lộ vuĂŽng"] # 0x2a05 (en: 'square intersection operator') - - "⹆": [t: "nhĂ  điều hĂ nh liĂȘn minh vuĂŽng"] # 0x2a06 (en: 'square union operator') - - "⹇": [t: "hai logic vĂ  toĂĄn tá»­"] # 0x2a07 (en: 'two logical and operator') - - "⚈": [t: "hai logic hoáș·c toĂĄn tá»­"] # 0x2a08 (en: 'two logical or operator') - - "⹉": [t: "nhĂ  điều hĂ nh láș§n"] # 0x2a09 (en: 'times operator') - - "⹊": [t: "modulo hai tổng"] # 0x2a0a (en: 'modulo two sum') - - "⹋": [t: "tổng hợp với tĂ­ch phĂąn"] # 0x2a0b (en: 'summation with integral') - - "⹌": [t: "toĂĄn tá»­ tĂ­ch phĂąn tứ giĂĄc"] # 0x2a0c (en: 'quadruple integral operator') - - "⚍": [t: "tĂ­ch hợp pháș§n hữu háșĄn"] # 0x2a0d (en: 'finite part integral') - - "⚎": [t: "tĂ­ch hợp với gáșĄch đîi"] # 0x2a0e (en: 'integral with double stroke') - - "⚏": [t: "tĂ­ch hợp trung bĂŹnh với chĂ©m"] # 0x2a0f (en: 'integral average with slash') - - "⚐": [t: "chức năng lưu thĂŽng"] # 0x2a10 (en: 'circulation function') - - "⹑": [t: "tĂ­ch hợp ngÆ°á»Łc chiều kim đồng hồ"] # 0x2a11 (en: 'anticlockwise integration') - - "⹒": [t: "tĂ­ch hợp đường với đường hĂŹnh chữ nháș­t xung quanh cá»±c"] # 0x2a12 (en: 'line integration with rectangular path around pole') - - "⹓": [t: "tĂ­ch hợp dĂČng với đường dáș«n hĂŹnh bĂĄn nguyệt xung quanh cá»±c"] # 0x2a13 (en: 'line integration with semicircular path around pole') - - "⹔": [t: "tĂ­ch hợp dĂČng khĂŽng bao gồm cá»±c"] # 0x2a14 (en: 'line integration not including the pole') - - "⹕": [t: "tĂ­ch hợp xung quanh một toĂĄn tá»­ điểm"] # 0x2a15 (en: 'integral around a point operator') - - "⹖": [t: "toĂĄn tá»­ tĂ­ch phĂąn quarternion"] # 0x2a16 (en: 'quaternion integral operator') - - "⹗": [t: "tĂ­ch hợp với mĆ©i tĂȘn trĂĄi với mĂłc"] # 0x2a17 (en: 'integral with leftwards arrow with hook') - - "⚘": [t: "tĂ­ch hợp với dáș„u hiệu thời gian"] # 0x2a18 (en: 'integral with times sign') - - "⹙": [t: "tĂ­ch hợp với giao điểm"] # 0x2a19 (en: 'integral with intersection') - - "⹚": [t: "tĂ­ch hợp với liĂȘn minh"] # 0x2a1a (en: 'integral with union') - - "⹛": [t: "tĂ­ch hợp với overbar"] # 0x2a1b (en: 'integral with overbar') - - "⹜": [t: "tĂ­ch hợp với underbar"] # 0x2a1c (en: 'integral with underbar') - - "⚝": [t: "tham gia"] # 0x2a1d (en: 'join') - - "⚞": [t: "người váș­n hĂ nh tam giĂĄc lớn bĂȘn trĂĄi"] # 0x2a1e (en: 'large left triangle operator') - - "⹟": [t: "thĂ nh pháș§n lÆ°á»Łc đồ kĂœ hiệu z"] # 0x2a1f (en: 'z notation schema composition') - - "âš ": [t: "z kĂœ hiệu kĂœ đồ đường ống"] # 0x2a20 (en: 'z notation schema piping') - - "⚥": [t: "z kĂœ đồ kĂœ đồ"] # 0x2a21 (en: 'z notation schema projection') - - "âšą": [t: "cộng với dáș„u hiệu với vĂČng trĂČn ở trĂȘn"] # 0x2a22 (en: 'plus sign with circle above') - - "⚣": [t: "cộng với dáș„u hiệu với giọng nĂłi ở trĂȘn"] # 0x2a23 (en: 'plus sign with circumflex accent above') - - "⚀": [t: "cộng với dáș„u hiệu với tilde ở trĂȘn"] # 0x2a24 (en: 'plus sign with tilde above') - - "âš„": [t: "cộng với dáș„u hiệu với dáș„u cháș„m dưới đñy"] # 0x2a25 (en: 'plus sign with dot below') - - "⚊": [t: "cộng với dáș„u hiệu với tilde dưới đñy"] # 0x2a26 (en: 'plus sign with tilde below') - - "âš§": [t: "cộng với dáș„u hiệu với chỉ số hai"] # 0x2a27 (en: 'plus sign with subscript two') - - "âšš": [t: "cộng với dáș„u hiệu với tam giĂĄc đen"] # 0x2a28 (en: 'plus sign with black triangle') - - "âš©": [t: "điểm trừ dáș„u hiệu với dáș„u pháș©y ở trĂȘn"] # 0x2a29 (en: 'minus sign with comma above') - - "âšȘ": [t: "điểm trừ với dáș„u cháș„m dưới đñy"] # 0x2a2a (en: 'minus sign with dot below') - - "âš«": [t: "điểm trừ với dáș„u cháș„m rÆĄi"] # 0x2a2b (en: 'minus sign with falling dots') - - "⚏": [t: "điểm trừ với dáș„u hiệu tăng"] # 0x2a2c (en: 'minus sign with rising dots') - - "âš­": [t: "cộng với dáș„u hiệu trong ná»­a vĂČng trĂČn trĂĄi"] # 0x2a2d (en: 'plus sign in left half circle') - - "âšź": [t: "cộng với đăng nháș­p vĂ o ná»­a vĂČng trĂČn bĂȘn pháșŁi"] # 0x2a2e (en: 'plus sign in right half circle') - - "⚯": [t: "sáșŁn pháș©m chĂ©o"] # 0x2a2f (en: 'cross product') - - "âš°": [t: "dáș„u hiệu nhĂąn với dáș„u cháș„m ở trĂȘn"] # 0x2a30 (en: 'multiplication sign with dot above') - - "âš±": [t: "dáș„u hiệu nhĂąn với inderbar"] # 0x2a31 (en: 'multiplication sign with underbar') - - "âšČ": [t: "sáșŁn pháș©m bĂĄn káșżt với đóng đáy đóng"] # 0x2a32 (en: 'semidirect product with bottom closed') - - "âšł": [t: "smash sáșŁn pháș©m"] # 0x2a33 (en: 'smash product') - - "⚎": [t: "dáș„u nhĂąn trong ná»­a vĂČng trĂČn trĂĄi"] # 0x2a34 (en: 'multiplication sign in left half circle') - - "âš”": [t: "đăng nháș­p nhĂąn trong ná»­a vĂČng trĂČn bĂȘn pháșŁi"] # 0x2a35 (en: 'multiplication sign in right half circle') - - "âš¶": [t: "dáș„u hiệu nhĂąn Ä‘Æ°á»Łc khoanh trĂČn với giọng nĂłi chu vi"] # 0x2a36 (en: 'circled multiplication sign with circumflex accent') - - "âš·": [t: "hiệu số nhĂąn trong vĂČng trĂČn đîi"] # 0x2a37 (en: 'multiplication sign in double circle') - - "âšž": [t: "dáș„u hiệu phĂąn chia vĂČng trĂČn"] # 0x2a38 (en: 'circled division sign') - - "âšč": [t: "cộng với dáș„u hiệu trong tam giĂĄc"] # 0x2a39 (en: 'plus sign in triangle') - - "âšș": [t: "trừ dáș„u hiệu trong tam giĂĄc"] # 0x2a3a (en: 'minus sign in triangle') - - "âš»": [t: "dáș„u hiệu nhĂąn trong tam giĂĄc"] # 0x2a3b (en: 'multiplication sign in triangle') - - "⚌": [t: "sáșŁn pháș©m nội tháș„t"] # 0x2a3c (en: 'interior product') - - "âšœ": [t: "sáșŁn pháș©m nội tháș„t bĂȘn tay"] # 0x2a3d (en: 'righthand interior product') - - "âšź": [t: "z kĂœ hiệu thĂ nh pháș§n quan hệ"] # 0x2a2e (en: 'z notation relational composition') - - "âšż": [t: "hợp nháș„t hoáș·c coproduct"] # 0x2a3f (en: 'amalgamation or coproduct') - - "⩀": [t: "giao lộ với dáș„u cháș„m"] # 0x2a40 (en: 'intersection with dot') - - "⩁": [t: "liĂȘn minh với dáș„u hiệu trừ"] # 0x2a41 (en: 'union with minus sign') - - "⩂": [t: "liĂȘn minh với overbar"] # 0x2a42 (en: 'union with overbar') - - "⩃": [t: "giao lộ với overbar"] # 0x2a43 (en: 'intersection with overbar') - - "⩄": [t: "giao lộ với logic vĂ "] # 0x2a44 (en: 'intersection with logical and') - - "⩅": [t: "liĂȘn káșżt với logic hoáș·c"] # 0x2a45 (en: 'union with logical or') - - "⩆": [t: "liĂȘn minh trĂȘn giao lộ"] # 0x2a46 (en: 'union above intersection') - - "⩇": [t: "giao lộ trĂȘn liĂȘn minh"] # 0x2a47 (en: 'intersection above union') - - "⩈": [t: "liĂȘn minh trĂȘn thanh trĂȘn giao lộ"] # 0x2a48 (en: 'union above bar above intersection') - - "⩉": [t: "giao lộ trĂȘn thanh trĂȘn liĂȘn minh"] # 0x2a49 (en: 'intersection above bar above union') - - "⩊": [t: "liĂȘn minh bĂȘn cáșĄnh vĂ  tham gia với liĂȘn minh"] # 0x2a4a (en: 'union beside and joined with union') - - "⩋": [t: "giao lộ bĂȘn cáșĄnh vĂ  tham gia với giao lộ"] # 0x2a4b (en: 'intersection beside and joined with intersection') - - "⩌": [t: "đóng káșżt hợp với serifs"] # 0x2a4c (en: 'closed union with serifs') - - "⩍": [t: "giao lộ đóng với serifs"] # 0x2a4d (en: 'closed intersection with serifs') - - "⩎": [t: "giao lộ kĂ©p vuĂŽng"] # 0x2a4e (en: 'double square intersection') - - "⩏": [t: "double square union"] # 0x2a4f - - "⩐": [t: "đóng liĂȘn minh với serifs vĂ  smash sáșŁn pháș©m"] # 0x2a50 (en: 'closed union with serifs and smash product') - - "⩑": [t: "logic vĂ  với dáș„u cháș„m ở trĂȘn"] # 0x2a51 (en: 'logical and with dot above') - - "⩒": [t: "logic hoáș·c với dáș„u cháș„m ở trĂȘn"] # 0x2a52 (en: 'logical or with dot above') - - "⩓": [t: "gáș„p đîi logic vĂ "] # 0x2a53 (en: 'double logical and') - - "⩔": [t: "gáș„p đîi logic hoáș·c"] # 0x2a54 (en: 'double logical or') - - "⩕": [t: "hai giao nhau logic vĂ "] # 0x2a55 (en: 'two intersecting logical and') - - "⩖": [t: "hai giao nhau logic hoáș·c"] # 0x2a56 (en: 'two intersecting logical or') - - "⩗": [t: "dốc lớn hoáș·c"] # 0x2a57 (en: 'sloping large or') - - "⩘": [t: "dốc lớn vĂ "] # 0x2a58 (en: 'sloping large and') - - "⩙": [t: "logic hoáș·c chồng chĂ©o logic vĂ "] # 0x2a59 (en: 'logical or overlapping logical and') - - "⩚": [t: "logic vĂ  với thĂąn giữa"] # 0x2a5a (en: 'logical and with middle stem') - - "⩛": [t: "logic hoáș·c với thĂąn giữa"] # 0x2a5b (en: 'logical or with middle stem') - - "⩜": [t: "logic vĂ  với dáș„u gáșĄch ngang ngang"] # 0x2a5c (en: 'logical and with horizontal dash') - - "⩝": [t: "logic hoáș·c với dáș„u gáșĄch ngang ngang"] # 0x2a5d (en: 'logical or with horizontal dash') - - "⩞": [t: "logic vĂ  với gáș„p đîi obbar"] # 0x2a5e (en: 'logical and with double overbar') - - "⩟": [t: "logic vĂ  với unterbar"] # 0x2a5f (en: 'logical and with underbar') - - "â© ": [t: "logic vĂ  với đîi bĂȘn dưới"] # 0x2a60 (en: 'logical and with double underbar') - - "⩥": [t: "vee nhỏ với atarbar"] # 0x2a61 (en: 'small vee with underbar') - - "⩹": [t: "logic hoáș·c với gáș„p đîi obbar"] # 0x2a62 (en: 'logical or with double overbar') - - "⩣": [t: "logic hoáș·c với đîi bĂȘn dưới"] # 0x2a63 (en: 'logical or with double underbar') - - "â©€": [t: "z kĂœ hiệu khĂĄng thể"] # 0x2a64 (en: 'z notation domain antirestriction') - - "â©„": [t: "z kĂœ hiệu pháșĄm vi chống trọng yáșżu"] # 0x2a65 (en: 'z notation range antirestriction') - - "⩊": [t: "báș±ng dáș„u hiệu với dáș„u cháș„m dưới đñy"] # 0x2a66 (en: 'equals sign with dot below') - - "â©§": [t: "giống hệt với dáș„u cháș„m trĂȘn"] # 0x2a67 (en: 'identical with dot above') - - "⩚": [t: "thanh ba ngang với gáșĄch dọc"] # 0x2a68 (en: 'triple horizontal bar with double vertical stroke') - - "â©©": [t: "thanh ba ngang với cĂș đánh tháșłng đứng ba"] # 0x2a69 (en: 'triple horizontal bar with triple vertical stroke') - - "â©Ș": [t: "toĂĄn tá»­ tilde với dáș„u cháș„m ở trĂȘn"] # 0x2a6a (en: 'tilde operator with dot above') - - "â©«": [t: "nhĂ  điều hĂ nh tilde với cĂĄc cháș„m tăng"] # 0x2a6b (en: 'tilde operator with rising dots') - - "⩏": [t: "tÆ°ÆĄng tá»± trừ tÆ°ÆĄng tá»±"] # 0x2a6c (en: 'similar minus similar') - - "â©­": [t: "đồng dáșĄng với dáș„u cháș„m ở trĂȘn"] # 0x2a6d (en: 'congruent with dot above') - - "⩟": [t: "báș±ng với dáș„u hoa thị"] # 0x2a6e (en: 'equals with asterisk') - - "⩯": [t: "gáș§n như báș±ng với giọng nĂłi chu vi"] # 0x2a6f (en: 'almost equal to with circumflex accent') - - "â©°": [t: "xáș„p xỉ báș±ng hoáș·c báș±ng"] # 0x2a70 (en: 'approximately equal to or equal to') - - "⩱": [t: "báș±ng dáș„u hiệu trĂȘn cộng với dáș„u hiệu"] # 0x2a71 (en: 'equals sign above plus sign') - - "â©Č": [t: "cộng với dáș„u hiệu trĂȘn báș±ng dáș„u hiệu"] # 0x2a72 (en: 'plus sign above equals sign') - - "⩳": [t: "báș±ng dáș„u hiệu trĂȘn toĂĄn tá»­ tilde"] # 0x2a73 (en: 'equals sign above tilde operator') - - "⩎": [t: "đáșĄi trĂ ng gáș„p đîi báș±ng nhau"] # 0x2a74 (en: 'double colon equal') - - "â©”": [t: "hai dáș„u hiệu liĂȘn tiáșżp"] # 0x2a75 (en: 'two consecutive equals signs') - - "â©¶": [t: "ba dáș„u hiệu liĂȘn tiáșżp"] # 0x2a76 (en: 'three consecutive equals signs') - - "â©·": [t: "báș±ng dáș„u hiệu với hai cháș„m trĂȘn vĂ  hai dáș„u cháș„m bĂȘn dưới"] # 0x2a77 (en: 'equals sign with two dots above and two dots below') - - "⩞": [t: "tÆ°ÆĄng Ä‘Æ°ÆĄng với bốn cháș„m trĂȘn"] # 0x2a78 (en: 'equivalent with four dots above') - - "â©č": [t: "Ă­t hÆĄn với vĂČng trĂČn bĂȘn trong"] # 0x2a79 (en: 'less than with circle inside') - - "â©ș": [t: "lớn hÆĄn với vĂČng trĂČn bĂȘn trong"] # 0x2a7a (en: 'greater than with circle inside') - - "â©»": [t: "Ă­t hÆĄn với dáș„u hỏi ở trĂȘn"] # 0x2a7b (en: 'less than with question mark above') - - "⩌": [t: "lớn hÆĄn với dáș„u hỏi ở trĂȘn"] # 0x2a7c (en: 'greater than with question mark above') - - "⩜": [t: "nhỏ hÆĄn hoáș·c nghiĂȘng báș±ng"] # 0x2a7d (en: 'less than or slanted equal to') - - "⩟": [t: "lớn hÆĄn hoáș·c nghiĂȘng báș±ng"] # 0x2a7e (en: 'greater than or slanted equal to') - - "⩿": [t: "nhỏ hÆĄn hoáș·c nghiĂȘng báș±ng với dáș„u cháș„m bĂȘn trong"] # 0x2a7f (en: 'less than or slanted equal to with dot inside') - - "âȘ€": [t: "lớn hÆĄn hoáș·c nghiĂȘng báș±ng với dáș„u cháș„m bĂȘn trong"] # 0x2a80 (en: 'greater than or slanted equal to with dot inside') - - "âȘ": [t: "nhỏ hÆĄn hoáș·c nghiĂȘng báș±ng với dáș„u cháș„m trĂȘn"] # 0x2a81 (en: 'less than or slanted equal to with dot above') - - "âȘ‚": [t: "lớn hÆĄn hoáș·c nghiĂȘng báș±ng với dáș„u cháș„m trĂȘn"] # 0x2a82 (en: 'greater than or slanted equal to with dot above') - - "âȘƒ": [t: "nhỏ hÆĄn hoáș·c nghiĂȘng báș±ng với dáș„u cháș„m phĂ­a trĂȘn bĂȘn pháșŁi"] # 0x2a83 (en: 'less than or slanted equal to with dot above right') - - "âȘ„": [t: "lớn hÆĄn hoáș·c nghiĂȘng báș±ng với dáș„u cháș„m phĂ­a trĂȘn bĂȘn trĂĄi"] # 0x2a84 (en: 'greater than or slanted equal to with dot above left') - - "âȘ…": [t: "Ă­t hÆĄn hoáș·c gáș§n đĂșng"] # 0x2a85 (en: 'less than or approximate') - - "âȘ†": [t: "lớn hÆĄn hoáș·c gáș§n đĂșng"] # 0x2a86 (en: 'greater than or approximate') - - "âȘ‡": [t: "nhỏ hÆĄn vĂ  dĂČng Ä‘ÆĄn khĂŽng báș±ng"] # 0x2a87 (en: 'less than and single line not equal to') - - "âȘˆ": [t: "lớn hÆĄn vĂ  dĂČng Ä‘ÆĄn khĂŽng báș±ng"] # 0x2a88 (en: 'greater than and single line not equal to') - - "âȘ‰": [t: "Ă­t hÆĄn vĂ  khĂŽng gáș§n đĂșng"] # 0x2a89 (en: 'less than and not approximate') - - "âȘŠ": [t: "lớn hÆĄn vĂ  khĂŽng gáș§n đĂșng"] # 0x2a8a (en: 'greater than and not approximate') - - "âȘ‹": [t: "Ă­t hÆĄn so với dĂČng gáș„p đîi báș±ng nhau trĂȘn lớn hÆĄn"] # 0x2a8b (en: 'less than above double line equal above greater than') - - "âȘŒ": [t: "lớn hÆĄn dĂČng gáș„p đîi trĂȘn báș±ng tháș„p hÆĄn"] # 0x2a8c (en: 'greater than above double line equal above less than') - - "âȘ": [t: "Ă­t hÆĄn trĂȘn tÆ°ÆĄng tá»± hoáș·c báș±ng nhau"] # 0x2a8d (en: 'less than above similar or equal') - - "âȘŽ": [t: "lớn hÆĄn trĂȘn tÆ°ÆĄng tá»± hoáș·c báș±ng nhau"] # 0x2a8e (en: 'greater than above similar or equal') - - "âȘ": [t: "Ă­t hÆĄn trĂȘn tÆ°ÆĄng tá»± ở trĂȘn lớn hÆĄn"] # 0x2a8f (en: 'less than above similar above greater than') - - "âȘ": [t: "lớn hÆĄn ở trĂȘn tÆ°ÆĄng tá»± ở trĂȘn nhỏ hÆĄn"] # 0x2a90 (en: 'greater than above similar above less than') - - "âȘ‘": [t: "Ă­t hÆĄn trĂȘn lớn hÆĄn so với dĂČng kĂ©p trĂȘn báș±ng nhau"] # 0x2a91 (en: 'less than above greater than above double line equal') - - "âȘ’": [t: "lớn hÆĄn trĂȘn nhỏ hÆĄn so với dĂČng gáș„p đîi báș±ng nhau"] # 0x2a92 (en: 'greater than above less than above double line equal') - - "âȘ“": [t: "Ă­t hÆĄn trĂȘn nghiĂȘng báș±ng nhau trĂȘn lớn hÆĄn so với trĂȘn nghiĂȘng báș±ng nhau"] # 0x2a93 (en: 'less than above slanted equal above greater than above slanted equal') - - "âȘ”": [t: "lớn hÆĄn trĂȘn nghiĂȘng báș±ng nhau trĂȘn tháș„p hÆĄn trĂȘn nghiĂȘng báș±ng nhau"] # 0x2a94 (en: 'greater than above slanted equal above less than above slanted equal') - - "âȘ•": [t: "nghiĂȘng báș±ng hoáș·c nhỏ hÆĄn"] # 0x2a95 (en: 'slanted equal to or less than') - - "âȘ–": [t: "nghiĂȘng báș±ng hoáș·c lớn hÆĄn"] # 0x2a96 (en: 'slanted equal to or greater than') - - "âȘ—": [t: "nghiĂȘng báș±ng hoáș·c Ă­t hÆĄn với dáș„u cháș„m bĂȘn trong"] # 0x2a97 (en: 'slanted equal to or less than with dot inside') - - "âȘ˜": [t: "nghiĂȘng báș±ng hoáș·c lớn hÆĄn với dáș„u cháș„m bĂȘn trong"] # 0x2a98 (en: 'slanted equal to or greater than with dot inside') - - "âȘ™": [t: "dĂČng hai báș±ng hoáș·c nhỏ hÆĄn"] # 0x2a99 (en: 'double line equal to or less than') - - "âȘš": [t: "double dĂČng báș±ng hoáș·c lớn hÆĄn"] # 0x2a9a (en: 'double line equal to or greater than') - - "âȘ›": [t: "đường đîi nghiĂȘng báș±ng hoáș·c nhỏ hÆĄn"] # 0x2a9b (en: 'double line slanted equal to or less than') - - "âȘœ": [t: "đường đîi nghiĂȘng báș±ng hoáș·c lớn hÆĄn"] # 0x2a9c (en: 'double line slanted equal to or greater than') - - "âȘ": [t: "tÆ°ÆĄng tá»± hoáș·c Ă­t hÆĄn"] # 0x2a9d (en: 'similar or less than') - - "âȘž": [t: "tÆ°ÆĄng tá»± hoáș·c lớn hÆĄn"] # 0x2a9e (en: 'similar or greater than') - - "âȘŸ": [t: "tÆ°ÆĄng tá»± ở trĂȘn nhỏ hÆĄn trĂȘn báș±ng dáș„u hiệu"] # 0x2a9f (en: 'similar above less than above equals sign') - - "âȘ ": [t: "tÆ°ÆĄng tá»± ở trĂȘn lớn hÆĄn trĂȘn báș±ng dáș„u hiệu"] # 0x2aa0 (en: 'similar above greater than above equals sign') - - "âȘĄ": [t: "kĂ©p lồng Ă­t hÆĄn"] # 0x2aa1 (en: 'double nested less than') - - "âȘą": [t: "kĂ©p lồng nhau lớn hÆĄn"] # 0x2aa2 (en: 'double nested greater than') - - "âȘŁ": [t: "kĂ©p lồng Ă­t hÆĄn với atarbar"] # 0x2aa3 (en: 'double nested less than with underbar') - - "âȘ€": [t: "lớn hÆĄn chồng chĂ©o Ă­t hÆĄn"] # 0x2aa4 (en: 'greater than overlapping less than') - - "âȘ„": [t: "lớn hÆĄn bĂȘn cáșĄnh Ă­t hÆĄn"] # 0x2aa5 (en: 'greater than beside less than') - - "âȘŠ": [t: "Ă­t hÆĄn đóng bởi đường cong"] # 0x2aa6 (en: 'less than closed by curve') - - "âȘ§": [t: "lớn hÆĄn đóng bởi đường cong"] # 0x2aa7 (en: 'greater than closed by curve') - - "âȘš": [t: "Ă­t hÆĄn đóng bởi đường cong trĂȘn nghiĂȘng báș±ng nhau"] # 0x2aa8 (en: 'less than closed by curve above slanted equal') - - "âȘ©": [t: "lớn hÆĄn đóng bởi đường cong trĂȘn nghiĂȘng báș±ng nhau"] # 0x2aa9 (en: 'greater than closed by curve above slanted equal') - - "âȘȘ": [t: "nhỏ hÆĄn"] # 0x2aaa (en: 'smaller than') - - "âȘ«": [t: "to hÆĄn"] # 0x2aab (en: 'larger than') - - "âȘŹ": [t: "nhỏ hÆĄn hoáș·c báș±ng"] # 0x2aac (en: 'smaller than or equal to') - - "âȘ­": [t: "lớn hÆĄn hoáș·c báș±ng"] # 0x2aad (en: 'larger than or equal to') - - "âȘź": [t: "báș±ng dáș„u hiệu với gáș­p ghềnh ở trĂȘn"] # 0x2aae (en: 'equals sign with bumpy above') - - "âȘŻ": [t: "trước dĂČng Ä‘ÆĄn báș±ng dáș„u hiệu"] # 0x2aaf (en: 'precedes above single line equals sign') - - "âȘ°": [t: "thĂ nh cĂŽng trĂȘn một dĂČng tÆ°ÆĄng Ä‘Æ°ÆĄng với dáș„u hiệu"] # 0x2ab0 (en: 'succeeds above single line equals sign') - - "âȘ±": [t: "tiền định trĂȘn dĂČng Ä‘ÆĄn khĂŽng báș±ng"] # 0x2ab1 (en: 'prededes above single line not equal to') - - "âȘČ": [t: "thĂ nh cĂŽng trĂȘn dĂČng Ä‘ÆĄn khĂŽng báș±ng"] # 0x2ab2 (en: 'succeeds above single line not equal to') - - "âȘł": [t: "trước dáș„u hiệu tÆ°ÆĄng Ä‘Æ°ÆĄng"] # 0x2ab3 (en: 'precedes above equals sign') - - "âȘŽ": [t: "thĂ nh cĂŽng trĂȘn dáș„u báș±ng"] # 0x2ab4 (en: 'succeeds above equals sign') - - "âȘ”": [t: "tiền định ở trĂȘn khĂŽng báș±ng"] # 0x2ab5 (en: 'prededes above not equal to') - - "âȘ¶": [t: "thĂ nh cĂŽng ở trĂȘn khĂŽng báș±ng"] # 0x2ab6 (en: 'succeeds above not equal to') - - "âȘ·": [t: "tiền định trĂȘn gáș§n như báș±ng"] # 0x2ab7 (en: 'prededes above almost equal to') - - "âȘž": [t: "thĂ nh cĂŽng trĂȘn gáș§n như báș±ng"] # 0x2ab8 (en: 'succeeds above almost equal to') - - "âȘč": [t: "trước ở trĂȘn khĂŽng gáș§n như báș±ng"] # 0x2ab9 (en: 'precedes above not almost equal to') - - "âȘș": [t: "thĂ nh cĂŽng ở trĂȘn khĂŽng gáș§n như báș±ng"] # 0x2aba (en: 'succeeds above not almost equal to') - - "âȘ»": [t: "gáș„p đîi trước"] # 0x2abb (en: 'double precedes') - - "âȘŒ": [t: "gáș„p đîi thĂ nh cĂŽng"] # 0x2abc (en: 'double succeeds') - - "âȘœ": [t: "táș­p hợp con với dáș„u cháș„m"] # 0x2abd (en: 'subset with dot') - - "âȘŸ": [t: "superset với dáș„u cháș„m"] # 0x2abe (en: 'superset with dot') - - "âȘż": [t: "táș­p hợp con với dáș„u cộng dưới đñy"] # 0x2abf (en: 'subset with plus sign below') - - "⫀": [t: "superset với dáș„u cộng dưới đñy"] # 0x2ac0 (en: 'superset with plus sign below') - - "⫁": [t: "táș­p hợp con với dáș„u hiệu nhĂąn dưới đñy"] # 0x2ac1 (en: 'subset with multiplication sign below') - - "⫂": [t: "superset với dáș„u hiệu nhĂąn dưới đñy"] # 0x2ac2 (en: 'superset with multiplication sign below') - - "⫃": [t: "táș­p hợp con hoáș·c báș±ng với dáș„u cháș„m trĂȘn"] # 0x2ac3 (en: 'subset of or equal to with dot above') - - "⫄": [t: "superset cá»§a hoáș·c báș±ng với dáș„u cháș„m trĂȘn"] # 0x2ac4 (en: 'superset of or equal to with dot above') - - "⫅": [t: "táș­p hợp con trĂȘn báș±ng dáș„u hiệu"] # 0x2ac5 (en: 'subset of above equals sign') - - "⫆": [t: "superset cá»§a dáș„u hiệu trĂȘn báș±ng"] # 0x2ac6 (en: 'superset of above equals sign') - - "⫇": [t: "táș­p hợp con cá»§a toĂĄn tá»­ tilde trĂȘn"] # 0x2ac7 (en: 'subset of above tilde operator') - - "⫈": [t: "superset cá»§a toĂĄn tá»­ tilde trĂȘn"] # 0x2ac8 (en: 'superset of above tilde operator') - - "⫉": [t: "táș­p hợp con trĂȘn gáș§n như báș±ng"] # 0x2ac9 (en: 'subset of above almost equal to') - - "⫊": [t: "superset cá»§a trĂȘn gáș§n như báș±ng"] # 0x2aca (en: 'superset of above almost equal to') - - "⫋": [t: "táș­p hợp con trĂȘn khĂŽng báș±ng"] # 0x2acb (en: 'subset above not equal to') - - "⫌": [t: "superset cá»§a ở trĂȘn khĂŽng báș±ng"] # 0x2acc (en: 'superset of above not equal to') - - "⫍": [t: "khối lÆ°á»Łng váș­n hĂ nh hộp mở bĂȘn trĂĄi"] # 0x2acd (en: 'square left open box operator') - - "⫎": [t: "thao tĂĄc hộp mở bĂȘn pháșŁi"] # 0x2ace (en: 'square right open box operator') - - "⫏": [t: "táș­p hợp con đóng"] # 0x2acf (en: 'closed subset') - - "⫐": [t: "superset khĂ©p kĂ­n"] # 0x2ad0 (en: 'closed superset') - - "⫑": [t: "táș­p hợp con đóng hoáș·c báș±ng"] # 0x2ad1 (en: 'closed subset or equal to') - - "⫒": [t: "superset đóng hoáș·c báș±ng"] # 0x2ad2 (en: 'closed superset or equal to') - - "⫓": [t: "táș­p hợp con trĂȘn superset"] # 0x2ad3 (en: 'subset above superset') - - "⫔": [t: "superset trĂȘn táș­p hợp con"] # 0x2ad4 (en: 'superset above subset') - - "⫕": [t: "táș­p hợp con trĂȘn táș­p hợp con"] # 0x2ad5 (en: 'subset above subset') - - "⫖": [t: "superset trĂȘn superset"] # 0x2ad6 (en: 'superset above superset') - - "⫗": [t: "superset bĂȘn cáșĄnh táș­p hợp con"] # 0x2ad7 (en: 'superset beside subset') - - "⫘": [t: "superset bĂȘn cáșĄnh vĂ  tham gia bởi dash với táș­p hợp con"] # 0x2ad8 (en: 'superset beside and joined by dash with subset') - - "⫙": [t: "yáșżu tố mở xuống dưới"] # 0x2ad9 (en: 'element of opening downwards') - - "⫚": [t: "pitchfork với tee top"] # 0x2ada (en: 'pitchfork with tee top') - - "⫛": [t: "giao lộ ngang"] # 0x2adb (en: 'transversal intersection') - - "⫝̸": [t: "đi"] # 0x2adc (en: 'forking') - - "⫝": [t: "khĂŽng hợp lệ"] # 0x2add (en: 'nonforking') - - "⫞": [t: "shrot rời khỏi tack"] # 0x2ade (en: 'shrot left tack') - - "⫟": [t: "ngáșŻn xuống tack"] # 0x2adf (en: 'short down tack') - - "â« ": [t: "ngáșŻn lĂȘn tack"] # 0x2ae0 (en: 'short up tack') - - "⫥": [t: "vuĂŽng gĂłc với s"] # 0x2ae1 (en: 'perpendicular with s') - - "⫹": [t: "thanh dọc ba vĂČng pháșŁi"] # 0x2ae2 (en: 'vertical bar triple right turnstile') - - "⫣": [t: "thanh gáș„p đîi ráșœ trĂĄi"] # 0x2ae3 (en: 'double vertical bar left turnstile') - - "â«€": [t: "thanh dọc gáș„p đîi ráșœ trĂĄi"] # 0x2ae4 (en: 'vertical bar double left turnstile') - - "â«„": [t: "thanh dọc theo kĂ©p ráșœ trĂĄi"] # 0x2ae5 (en: 'double vertical bar double left turnstile') - - "⫊": [t: "dash dĂ i từ thĂ nh viĂȘn bĂȘn trĂĄi cá»§a double dọc"] # 0x2ae6 (en: 'long dash from left member of double vertical') - - "â«§": [t: "tĂłm láșĄi ngáșŻn với overbar"] # 0x2ae7 (en: 'short down tack with overbar') - - "⫚": [t: "short up tack với underbar"] # 0x2ae8 (en: 'short up tack with underbar') - - "â«©": [t: "short up tack trĂȘn ngáșŻn xuống tack"] # 0x2ae9 (en: 'short up tack above short down tack') - - "â«Ș": [t: "nhĂąn đîi tack xuống"] # 0x2aea (en: 'double down tack') - - "â««": [t: "nhĂąn đîi tack"] # 0x2aeb (en: 'double up tack') - - "⫏": [t: "cĂș đánh đîi khĂŽng kĂœ"] # 0x2aec (en: 'double stroke not sign') - - "â«­": [t: "đáșŁo ngÆ°á»Łc gáșĄch đîi khĂŽng kĂœ"] # 0x2aed (en: 'reversed double stroke not sign') - - "⫟": [t: "khĂŽng phĂąn chia với sá»± phá»§ định đáșŁo ngÆ°á»Łc"] # 0x2aee (en: 'does not divide with reversed negation slash') - - "⫯": [t: "đường tháșłng đứng với vĂČng trĂČn ở trĂȘn"] # 0x2aef (en: 'vertical line with circle above') - - "â«°": [t: "đường tháșłng đứng với vĂČng trĂČn dưới đñy"] # 0x2af0 (en: 'vertical line with circle below') - - "⫱": [t: "xuống tack với vĂČng trĂČn bĂȘn dưới"] # 0x2af1 (en: 'down tack with circle below') - - "â«Č": [t: "song song với gáșĄch ngang"] # 0x2af2 (en: 'parallel with horizontal stroke') - - "⫳": [t: "song song với toĂĄn tá»­ tilde"] # 0x2af3 (en: 'parallel with tilde operator') - - "⫎": [t: "triple dọc quan hệ nhị phĂąn thanh dọc"] # 0x2af4 (en: 'triple vertical bar binary relation') - - "â«”": [t: "thanh ba dọc với gáșĄch ngang"] # 0x2af5 (en: 'triple vertical bar with horizontal stroke') - - "â«¶": [t: "triple colon toĂĄn tá»­"] # 0x2af6 (en: 'triple colon operator') - - "â«·": [t: "triple lồng Ă­t hÆĄn"] # 0x2af7 (en: 'triple nested less than') - - "⫞": [t: "triple lồng nhau lớn hÆĄn"] # 0x2af8 (en: 'triple nested greater than') - - "â«č": [t: "đường đîi nghiĂȘng Ă­t hÆĄn hoáș·c báș±ng"] # 0x2af9 (en: 'double line slanted less than or equal to') - - "â«ș": [t: "đường đîi nghiĂȘng lớn hÆĄn hoáș·c báș±ng"] # 0x2afa (en: 'double line slanted greater than or equal to') - - "â«»": [t: "triple solidus quan hệ nhị phĂąn"] # 0x2afb (en: 'triple solidus binary relation') - - "⫌": [t: "toĂĄn tá»­ thanh dọc lớn"] # 0x2afc (en: 'large triple vertical bar operator') - - "⫝̸": [t: "toĂĄn tá»­ đîi solidus"] # 0x2afd (en: 'double solidus operator') - - "⫟": [t: "thanh dọc tráșŻng"] # 0x2afe (en: 'white vertical bar') - - "⫿": [t: "thanh dọc tráșŻng"] # 0x2aff (en: 'white vertical bar') - - "⬀": [t: "mĆ©i tĂȘn tráșŻng đîng báșŻc"] # 0x2b00 (en: 'north east white arrow') - - "⏁": [t: "mĆ©i tĂȘn tĂąy báșŻc"] # 0x2b01 (en: 'north west white arrow') - - "⬂": [t: "mĆ©i tĂȘn tráșŻng đîng nam"] # 0x2b02 (en: 'south east white arrow') - - "⏃": [t: "mĆ©i tĂȘn tĂąy nam tráșŻng"] # 0x2b03 (en: 'south west white arrow') - - "⬄": [t: "mĆ©i tĂȘn tráșŻng bĂȘn trĂĄi"] # 0x2b04 (en: 'left right white arrow') - - "⬅": [t: "mĆ©i tĂȘn đen trĂĄi"] # 0x2b05 (en: 'leftwards black arrow') - - "⬆": [t: "mĆ©i tĂȘn mĂ u đen hướng lĂȘn trĂȘn"] # 0x2b06 (en: 'upwards black arrow') - - "⬇": [t: "mĆ©i tĂȘn đen xuống"] # 0x2b07 (en: 'downwards black arrow') - - "⏈": [t: "mĆ©i tĂȘn đen đîng báșŻc"] # 0x2b08 (en: 'north east black arrow') - - "⬉": [t: "mĆ©i tĂȘn đen tĂąy báșŻc"] # 0x2b09 (en: 'north west black arrow') - - "⬊": [t: "mĆ©i tĂȘn đen đîng nam"] # 0x2b0a (en: 'south east black arrow') - - "⬋": [t: "mĆ©i tĂȘn đen tĂąy nam"] # 0x2b0b (en: 'south west black arrow') - - "⬌": [t: "mĆ©i tĂȘn đen trĂĄi bĂȘn trĂĄi"] # 0x2b0c (en: 'left right black arrow') - - "⬍": [t: "lĂȘn xuống mĆ©i tĂȘn đen"] # 0x2b0d (en: 'up down black arrow') - - "⬎": [t: "mĆ©i tĂȘn bĂȘn pháșŁi với đáș§u xuống"] # 0x2b0e (en: 'rightwards arrow with tip downwards') - - "⬏": [t: "mĆ©i tĂȘn bĂȘn pháșŁi với đáș§u hướng lĂȘn"] # 0x2b0f (en: 'rightwards arrow with tip upwards') - - "⏐": [t: "mĆ©i tĂȘn trĂĄi với đáș§u xuống"] # 0x2b10 (en: 'leftwards arrow with tip downwards') - - "⬑": [t: "mĆ©i tĂȘn trĂĄi với đáș§u hướng lĂȘn"] # 0x2b11 (en: 'leftwards arrow with tip upwards') - - "⬒": [t: "hĂŹnh vuĂŽng với ná»­a mĂ u đen"] # 0x2b12 (en: 'square with top half black') - - "⬓": [t: "hĂŹnh vuĂŽng với ná»­a mĂ u đen"] # 0x2b13 (en: 'square with bottom half black') - - "⬔": [t: "hĂŹnh vuĂŽng với đường chĂ©o phĂ­a trĂȘn bĂȘn pháșŁi mĂ u đen"] # 0x2b14 (en: 'square with upper right diagonal half black') - - "⬕": [t: "hĂŹnh vuĂŽng với một ná»­a đường chĂ©o bĂȘn trĂĄi mĂ u đen"] # 0x2b15 (en: 'square with lower left diagonal half black') - - "⬖": [t: "kim cÆ°ÆĄng với ná»­a mĂ u đen"] # 0x2b16 (en: 'diamond with left half black') - - "⬗": [t: "kim cÆ°ÆĄng với ná»­a mĂ u đen"] # 0x2b17 (en: 'diamond with right half black') - - "⏘": [t: "kim cÆ°ÆĄng với ná»­a mĂ u đen"] # 0x2b18 (en: 'diamond with top half black') - - "⬙": [t: "kim cÆ°ÆĄng với ná»­a mĂ u đen"] # 0x2b19 (en: 'diamond with bottom half black') - - "⬚": [t: "hộp"] # 0x2b1a (en: 'box') - - "⬛": [t: "quáșŁng trường lớn mĂ u đen"] # 0x2b1b (en: 'black large square') - - "⬜": [t: "quáșŁng trường lớn mĂ u tráșŻng"] # 0x2b1c (en: 'white large square') - - "⬝": [t: "quáșŁng trường ráș„t nhỏ"] # 0x2b1d (en: 'black very small square') - - "⬞": [t: "quáșŁng trường mĂ u tráșŻng ráș„t nhỏ"] # 0x2b1e (en: 'white very small square') - - "⬟": [t: "láș§u năm gĂłc đen"] # 0x2b1f (en: 'black pentagon') - - "⏠": [t: "láș§u năm gĂłc tráșŻng"] # 0x2b20 (en: 'white pentagon') - - "⏥": [t: "hĂŹnh lỄc giĂĄc tráșŻng"] # 0x2b21 (en: 'white hexagon') - - "⏹": [t: "hĂŹnh lỄc giĂĄc đen"] # 0x2b22 (en: 'black hexagon') - - "⏣": [t: "hĂŹnh lỄc giĂĄc đen ngang"] # 0x2b23 (en: 'horizontal black hexagon') - - "⏀": [t: "vĂČng trĂČn lớn mĂ u đen"] # 0x2b24 (en: 'black large circle') - - "⏄": [t: "kim cÆ°ÆĄng trung bĂŹnh mĂ u đen"] # 0x2b25 (en: 'black medium diamond') - - "⏊": [t: "kim cÆ°ÆĄng trung bĂŹnh mĂ u tráșŻng"] # 0x2b26 (en: 'white medium diamond') - - "⏧": [t: "black medium lozenge"] # 0x2b27 - - "⏚": [t: "tráșŻng trung bĂŹnh vĂŽ hĂŹnh"] # 0x2b28 (en: 'white medium lozenge') - - "⏩": [t: "kim cÆ°ÆĄng nhỏ mĂ u đen"] # 0x2b29 (en: 'black small diamond') - - "âŹȘ": [t: "black small lozenge"] # 0x2b2a - - "⏫": [t: "mĂ u tráșŻng hĂŹnh thoi"] # 0x2b2b (en: 'white small lozenge') - - "⏏": [t: "hĂŹnh elip ngang mĂ u đen"] # 0x2b2c (en: 'black horizontal ellipse') - - "⏭": [t: "hĂŹnh elip ngang mĂ u tráșŻng"] # 0x2b2d (en: 'white horizontal ellipse') - - "⏟": [t: "hĂŹnh elip dọc mĂ u đen"] # 0x2b2e (en: 'black vertical ellipse') - - "⏯": [t: "hĂŹnh elip dọc tráșŻng"] # 0x2b2f (en: 'white vertical ellipse') - - "⏰": [t: "mĆ©i tĂȘn trĂĄi với vĂČng trĂČn nhỏ"] # 0x2b30 (en: 'left arrow with small circle') - - "⏱": [t: "ba mĆ©i tĂȘn trĂĄi"] # 0x2b31 (en: 'three leftwards arrows') - - "âŹČ": [t: "mĆ©i tĂȘn trĂĄi với circled plus"] # 0x2b32 (en: 'left arrow with circled plus') - - "⏳": [t: "mĆ©i tĂȘn vỗ tay dĂ i sang trĂĄi"] # 0x2b33 (en: 'long leftwards squiggle arrow') - - "⏎": [t: "bĂȘn trĂĄi hai mĆ©i tĂȘn đáș§u với gáșĄch tháșłng đứng"] # 0x2b34 (en: 'leftwards two headed arrow with vertical stroke') - - "⏔": [t: "lettwards hai mĆ©i tĂȘn đáș§u với gáșĄch dọc"] # 0x2b35 (en: 'lettwards two headed arrow with double vertical stroke') - - "⏶": [t: "bĂȘn trĂĄi hai mĆ©i tĂȘn đáș§u từ thanh"] # 0x2b36 (en: 'leftwards two headed arrow from bar') - - "⏷": [t: "bĂȘn trĂĄi hai mĆ©i tĂȘn ba đáș§u"] # 0x2b37 (en: 'leftwards two headed triple dash arrow') - - "⏞": [t: "mĆ©i tĂȘn trĂĄi với thĂąn cháș„m cháș„m"] # 0x2b38 (en: 'leftwards arrow with dotted stem') - - "âŹč": [t: "mĆ©i tĂȘn trĂĄi với đuĂŽi với gáșĄch dọc"] # 0x2b39 (en: 'leftwards arrow with tail with vertical stroke') - - "âŹș": [t: "mĆ©i tĂȘn trĂĄi với đuĂŽi với gáșĄch dọc"] # 0x2b3a (en: 'leftwards arrow with tail with double vertical stroke') - - "⏻": [t: "bĂȘn trĂĄi hai mĆ©i tĂȘn đáș§u với đuĂŽi"] # 0x2b3b (en: 'leftwards two headed arrow with tail') - - "âŹŒ": [t: "bĂȘn trĂĄi hai mĆ©i tĂȘn đáș§u với đuĂŽi với gáșĄch tháșłng đứng"] # 0x2b3c (en: 'leftwards two headed arrow with tail with vertical stroke') - - "âŹœ": [t: "bĂȘn trĂĄi hai mĆ©i tĂȘn đáș§u với đuĂŽi với gáșĄch tháșłng đứng"] # 0x2b3d (en: 'leftwards two headed arrow with tail with double vertical stroke') - - "âŹŸ": [t: "mĆ©i tĂȘn trĂĄi qua x"] # 0x2b3e (en: 'leftwards arrow through x') - - "⏿": [t: "mĆ©i tĂȘn sĂłng hướng trá»±c tiáșżp bĂȘn trĂĄi"] # 0x2b3f (en: 'wave arrow pointing directly left') - - "⭀": [t: "báș±ng dáș„u hiệu phĂ­a trĂȘn mĆ©i tĂȘn trĂĄi"] # 0x2b40 (en: 'equals sign above leftwards arrow') - - "⭁": [t: "toĂĄn tá»­ tilde đáșŁo ngÆ°á»Łc phĂ­a trĂȘn mĆ©i tĂȘn trĂĄi"] # 0x2b41 (en: 'reverse tilde operator above leftwards arrow') - - "⭂": [t: "mĆ©i tĂȘn trĂĄi phĂ­a trĂȘn đáșŁo ngÆ°á»Łc gáș§n như báș±ng"] # 0x2b42 (en: 'leftwards arrow above reverse almost equal to') - - "⭃": [t: "mĆ©i tĂȘn pháșŁi qua lớn hÆĄn"] # 0x2b43 (en: 'rightwards arrow through greater than') - - "⭄": [t: "mĆ©i tĂȘn pháșŁi qua superret"] # 0x2b44 (en: 'rightwards arrow through superret') - - "⭅": [t: "mĆ©i tĂȘn quadurple trĂĄi"] # 0x2b45 (en: 'leftwards quadurple arrow') - - "⭆": [t: "mĆ©i tĂȘn tăng gáș„p bốn láș§n"] # 0x2b46 (en: 'rightwards quadruple arrow') - - "⭇": [t: "toĂĄn tá»­ tilde đáșŁo ngÆ°á»Łc phĂ­a trĂȘn mĆ©i tĂȘn bĂȘn pháșŁi"] # 0x2b47 (en: 'reverse tilde operator above rightwards arrow') - - "⭈": [t: "mĆ©i tĂȘn bĂȘn pháșŁi phĂ­a trĂȘn rerverse gáș§n như báș±ng"] # 0x2b48 (en: 'rightwards arrow above rerverse almost equal to') - - "⭉": [t: "toĂĄn tá»­ tilde phĂ­a trĂȘn mĆ©i tĂȘn trĂĄi"] # 0x2b49 (en: 'tilde operator above leftwards arrow') - - "⭊": [t: "mĆ©i tĂȘn trĂĄi trĂȘn gáș§n như báș±ng"] # 0x2b4a (en: 'leftwards arrow above almost equal to') - - "⭋": [t: "mĆ©i tĂȘn trĂĄi phĂ­a trĂȘn toĂĄn tá»­ tilde ngÆ°á»Łc"] # 0x2b4b (en: 'leftwards arrow above reverse tilde operator') - - "⭌": [t: "mĆ©i tĂȘn bĂȘn pháșŁi phĂ­a trĂȘn toĂĄn tá»­ tilde ngÆ°á»Łc"] # 0x2b4c (en: 'rightwards arrow above reverse tilde operator') - - "⭐": [t: "ngĂŽi sao trung bĂŹnh mĂ u tráșŻng"] # 0x2b50 (en: 'white medium star') - - "⭑": [t: "ngĂŽi sao nhỏ mĂ u đen"] # 0x2b51 (en: 'black small star') - - "⭒": [t: "ngĂŽi sao nhỏ mĂ u tráșŻng"] # 0x2b52 (en: 'white small star') - - "⭓": [t: "đen bĂȘn pháșŁi chỉ hĂŹnh láș§u năm gĂłc"] # 0x2b53 (en: 'black right pointing pentagon') - - "⭔": [t: "láș§u năm gĂłc bĂȘn pháșŁi mĂ u tráșŻng"] # 0x2b54 (en: 'white right pointing pentagon') - - "⭕": [t: "vĂČng trĂČn lớn náș·ng"] # 0x2b55 (en: 'heavy large circle') - - "⭖": [t: "oval náș·ng với hĂŹnh báș§u dỄc bĂȘn trong"] # 0x2b56 (en: 'heavy oval with oval inside') - - "⭗": [t: "vĂČng trĂČn náș·ng với vĂČng trĂČn bĂȘn trong"] # 0x2b57 (en: 'heavy circle with circle inside') - - "⭘": [t: "vĂČng trĂČn náș·ng"] # 0x2b58 (en: 'heavy circle') - - "⭙": [t: "muối náș·ng"] # 0x2b59 (en: 'heavy circled saltire') - - "⾀": [t: "điểm thay tháșż gĂłc pháșŁi"] # 0x2e00 (en: 'right angle substitution marker') - - "➁": [t: "gĂłc bĂȘn pháșŁi cháș„m đánh dáș„u thay tháșż"] # 0x2e01 (en: 'right angle dotted substitution marker') - - "⾂": [t: "khung thay tháșż trĂĄi"] # 0x2e02 (en: 'left substitution bracket') - - "➃": [t: "khung thay tháșż đĂșng"] # 0x2e03 (en: 'right substitution bracket') - - "⾄": [t: "khung thay tháșż cháș„m trĂĄi"] # 0x2e04 (en: 'left dotted substitution bracket') - - "⾅": [t: "khung thay tháșż cháș„m bĂȘn pháșŁi"] # 0x2e05 (en: 'right dotted substitution bracket') - - "⾆": [t: "nĂąng cao điểm đánh dáș„u nội suy"] # 0x2e06 (en: 'raised interpolation marker') - - "⾇": [t: "nĂąng cao điểm nội suy cháș„m"] # 0x2e07 (en: 'raised dotted interpolation marker') - - "➈": [t: "điểm đánh dáș„u chuyển vị cháș„m cháș„m"] # 0x2e08 (en: 'dotted transposition marker marker') - - "⾉": [t: "khung chuyển vị trĂĄi"] # 0x2e09 (en: 'left transposition bracket') - - "⾊": [t: "khung chuyển vị bĂȘn pháșŁi"] # 0x2e0a (en: 'right transposition bracket') - - "⾋": [t: "quáșŁng trường nĂąng lĂȘn"] # 0x2e0b (en: 'raised square') - - "⾌": [t: "bĂȘn trĂĄi nĂąng cao khung thiáșżu sĂłt"] # 0x2e0c (en: 'left raised omission bracket') - - "➍": [t: "quyền nĂąng cao khung thiáșżu sĂłt"] # 0x2e0d (en: 'right raised omission bracket') - - "⾎": [t: "biĂȘn táș­p coronis"] # 0x2e0e (en: 'editorial coronis') - - "➏": [t: "đoáșĄn văn"] # 0x2e0f (en: 'paragraphos') - - "➐": [t: "phĂąn đoáșĄn đoáșĄn văn"] # 0x2e10 (en: 'forked paragraphos') - - "⾑": [t: "đáșŁo ngÆ°á»Łc cĂĄc đoáșĄn bĂĄo"] # 0x2e11 (en: 'reversed forked paragraphos') - - "⾒": [t: "hypodiastole"] # 0x2e12 - - "⾓": [t: "obelos cháș„m"] # 0x2e13 (en: 'dotted obelos') - - "⾔": [t: "xuống ở ancora"] # 0x2e14 (en: 'downwards ancora') - - "⾕": [t: "lĂȘn cao hÆĄn ancora"] # 0x2e15 (en: 'upwards ancora') - - "⾖": [t: "cháș„m bĂȘn pháșŁi gĂłc chỉ"] # 0x2e16 (en: 'dotted right pointing angle') - - "⾗": [t: "double xiĂȘn dáș„u gáșĄch nối"] # 0x2e17 (en: 'double oblique hyphen') - - "➘": [t: "đáșŁo ngÆ°á»Łc interrobang"] # 0x2e18 (en: 'inverted interrobang') - - "⾙": [t: "nhĂĄnh cọ"] # 0x2e19 (en: 'palm branch') - - "⾚": [t: "hyphen với dieresis"] # 0x2e1a (en: 'hyphen with diaeresis') - - "⾛": [t: "tilde với vĂČng trĂȘn"] # 0x2e1b (en: 'tilde with ring above') - - "⾜": [t: "để láșĄi giĂĄ tháș„p"] # 0x2e1c (en: 'left low paraphrase bracket') - - "➝": [t: "đóng giĂĄ trị tháș„p pháșŁi"] # 0x2e1d (en: 'right low paraphrase bracket') - - "⾞": [t: "tilde với dáș„u cháș„m ở trĂȘn"] # 0x2e1e (en: 'tilde with dot above') - - "⾟": [t: "tilde với dáș„u cháș„m dưới đñy"] # 0x2e1f (en: 'tilde with dot below') - - "âž ": [t: "thanh tháșłng đứng trĂĄi với quill"] # 0x2e20 (en: 'left vertical bar with quill') - - "➥": [t: "thanh tháșłng đứng bĂȘn pháșŁi với quill"] # 0x2e21 (en: 'right vertical bar with quill') - - "âžą": [t: "đỉnh trĂĄi giĂĄ đụ"] # 0x2e22 (en: 'top left half bracket') - - "➣": [t: "đáș§u tiĂȘn báșŻt đáș§u báșŻt đáș§u"] # 0x2e23 (en: 'top right half bracket') - - "➀": [t: "dưới cĂčng bĂȘn trĂĄi giĂĄ đụ"] # 0x2e24 (en: 'bottom left half bracket') - - "âž„": [t: "dưới cĂčng bĂȘn pháșŁi giĂĄ đụ"] # 0x2e25 (en: 'bottom right half bracket') - - "➊": [t: "bĂȘn trĂĄi phĂ­a bĂȘn báșĄn khung"] # 0x2e26 (en: 'left sideways u bracket') - - "âž§": [t: "bĂȘn pháșŁi bĂȘn báșĄn khung"] # 0x2e27 (en: 'right sideways u bracket') - - "âžš": [t: "dáș„u ngoáș·c Ä‘ÆĄn trĂĄi"] # 0x2e28 (en: 'left double parentheses') - - "âž©": [t: "dáș„u ngoáș·c Ä‘ÆĄn bĂȘn pháșŁi"] # 0x2e29 (en: 'right double parentheses') - - "âžȘ": [t: "hai cháș„m trĂȘn một dáș„u cháș„m cháș„m"] # 0x2e2a (en: 'two dots over one dot punctuation') - - "âž«": [t: "một cháș„m trĂȘn hai dáș„u cháș„m cĂąu"] # 0x2e2b (en: 'one dot over two dots punctuation') - - "➏": [t: "bĂŹnh phÆ°ÆĄng bốn dáș„u cháș„m cháș„m"] # 0x2e2c (en: 'squared four dot punctuation') - - "âž­": [t: "năm dáș„u cháș„m"] # 0x2e2d (en: 'five dot mark') - - "âžź": [t: "dáș„u áș„n cĂąu hỏi"] # 0x2e2e (en: 'reversed question mark') - - "➯": [t: "tilde dọc"] # 0x2e2f (en: 'vertical tilde') - - "âž°": [t: "điểm nháș«n"] # 0x2e30 (en: 'ring point') - - "âž±": [t: "từ cháș„m tĂĄch giữa cháș„m"] # 0x2e31 (en: 'word seperator middle dot') - - "âžČ": [t: "biáșżn dáș„u pháș©y"] # 0x2e32 (en: 'turned comma') - - "âžł": [t: "nĂąng cao cháș„m"] # 0x2e33 (en: 'raised dot') - - "➎": [t: "dáș„u pháș©y lớn lĂȘn"] # 0x2e34 (en: 'raised comma') - - "âž”": [t: "biáșżn bĂĄn nguyệt"] # 0x2e35 (en: 'turned semicolon') - - "âž¶": [t: "dao găm với báșŁo vệ bĂȘn trĂĄi"] # 0x2e36 (en: 'dagger with left guard') - - "âž·": [t: "dao găm với báșŁo vệ bĂȘn pháșŁi"] # 0x2e37 (en: 'dagger with right guard') - - "âžž": [t: "biáșżn dao găm"] # 0x2e38 (en: 'turned dagger') - - "âžč": [t: "dáș„u hiệu ná»­a đáș§u"] # 0x2e39 (en: 'top half section sign') - - "âžș": [t: "hai em đáș­p"] # 0x2e3a (en: 'two em dash') - - "âž»": [t: "ba em đáș­p"] # 0x2e3b (en: 'three em dash') - - "〃": [t: "ditto mark"] # 0x3003 - - "〈": [t: "khung gĂłc trĂĄi"] # 0x3008 (en: 'left angle bracket') - - "〉": [t: "khung gĂłc pháșŁi"] # 0x3009 (en: 'right angle bracket') - - "《": [t: "khung gĂłc hai gĂłc"] # 0x300a (en: 'left double angle bracket') - - "》": [t: "khung gĂłc gáș„p đîi"] # 0x300b (en: 'right double angle bracket') - - "「": [t: "khung gĂłc trĂĄi"] # 0x300c (en: 'left corner bracket') - - "」": [t: "khung gĂłc pháșŁi"] # 0x300d (en: 'right corner bracket') - - "『": [t: "khung gĂłc tráșŻng"] # 0x300e (en: 'left white corner bracket') - - "』": [t: "khung gĂłc tráșŻng bĂȘn pháșŁi"] # 0x300f (en: 'right white corner bracket') - - "【": [t: "khung mĂ u đen trĂĄi"] # 0x3010 (en: 'left black lenticular bracket') - - "】": [t: "bĂȘn pháșŁi khung hĂŹnh dáșĄng tháș„u kĂ­nh mĂ u đen"] # 0x3011 (en: 'right black lenticular bracket') - - "〔": [t: "khung vỏ rĂča trĂĄi"] # 0x3014 (en: 'left tortoise shell bracket') - - "〕": [t: "chĂąn sáșŻc con rĂča pháșŁi"] # 0x3015 (en: 'right tortoise shell bracket') - - "〖": [t: "khung mĂ u tráșŻng trĂĄi"] # 0x3016 (en: 'left white lenticular bracket') - - "〗": [t: "quyền tráșŻng tráșŻng tráșŻng"] # 0x3017 (en: 'right white lenticular bracket') - - "〘": [t: "bĂȘn trĂĄi khung vỏ rĂča tráșŻng"] # 0x3018 (en: 'left white tortoise shell bracket') - - "〙": [t: "bĂȘn pháșŁi khung vỏ rĂča tráșŻng"] # 0x3019 (en: 'right white tortoise shell bracket') - - "〚": [t: "khung vuĂŽng mĂ u tráșŻng"] # 0x301a (en: 'left white square bracket') - - "〛": [t: "khung vuĂŽng tráșŻng bĂȘn pháșŁi"] # 0x301b (en: 'right white square bracket') - - "〜": [t: "dash sĂłng"] # 0x301c (en: 'wave dash') - - "〰": [t: "dáș„u gáșĄch ngang"] # 0x3030 (en: 'wavy dash') - - "㉈": [t: "số mười vĂČng trĂȘn quáșŁng trường đen"] # 0x3248 (en: 'circled number ten on black square') - - "㉉": [t: "số vĂČng trĂČn hai mÆ°ÆĄi trĂȘn quáșŁng trường đen"] # 0x3249 (en: 'circled number twenty on black square') - - "㉊": [t: "số vĂČng trĂČn ba mÆ°ÆĄi trĂȘn quáșŁng trường đen"] # 0x324a (en: 'circled number thirty on black square') - - "㉋": [t: "số vĂČng trĂČn bốn mÆ°ÆĄi trĂȘn quare blacks"] # 0x324b (en: 'circled number forty on blacks quare') - - "㉌": [t: "số lÆ°á»Łng số năm mÆ°ÆĄi trĂȘn quáșŁng trường đen"] # 0x324c (en: 'circled number fifty on black square') - - "㉍": [t: "manh số sĂĄu mÆ°ÆĄi trĂȘn quáșŁng trường đen"] # 0x324d (en: 'circled number sixty on black square') - - "㉎": [t: "số vĂČng trĂČn báșŁy mÆ°ÆĄi trĂȘn quáșŁng trường đen"] # 0x324e (en: 'circled number seventy on black square') - - "㉏": [t: "số Ä‘Æ°á»Łc khoanh trĂČn aty trĂȘn quáșŁng trường đen"] # 0x324f (en: 'circled number eighty on black square') - - "㉑": [t: "Ä‘Æ°á»Łc khoanh trĂČn số hai mÆ°ÆĄi mốt"] # 0x3251 (en: 'circled number twenty one') - - "㉒": [t: "Ä‘Æ°á»Łc khoanh trĂČn số hai mÆ°ÆĄi hai"] # 0x3252 (en: 'circled number twenty two') - - "㉓": [t: "Ä‘Æ°á»Łc khoanh trĂČn số hai mÆ°ÆĄi ba"] # 0x3253 (en: 'circled number twenty three') - - "㉔": [t: "Ä‘Æ°á»Łc khoanh trĂČn số hai mÆ°ÆĄi bốn"] # 0x3254 (en: 'circled number twenty four') - - "㉕": [t: "Ä‘Æ°á»Łc khoanh trĂČn số hai mÆ°ÆĄi lăm"] # 0x3255 (en: 'circled number twenty five') - - "㉖": [t: "Ä‘Æ°á»Łc khoanh trĂČn số hai mÆ°ÆĄi sĂĄu"] # 0x3256 (en: 'circled number twenty six') - - "㉗": [t: "Ä‘Æ°á»Łc khoanh trĂČn số hai mÆ°ÆĄi báșŁy"] # 0x3257 (en: 'circled number twenty seven') - - "㉘": [t: "Ä‘Æ°á»Łc khoanh trĂČn số hai mÆ°ÆĄi tĂĄm"] # 0x3258 (en: 'circled number twenty eight' GPT-5.4 fixed translation) - - "㉙": [t: "Ä‘Æ°á»Łc khoanh trĂČn số hai mÆ°ÆĄi chĂ­n"] # 0x3259 (en: 'circled number twenty nine') - - "㉚": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi"] # 0x325a (en: 'circled number thirty' GPT-5.4 fixed translation) - - "㉛": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi mốt"] # 0x325b (en: 'circled number thirty one' GPT-5.4 fixed translation) - - "㉜": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi hai"] # 0x325c (en: 'circled number thirty two' GPT-5.4 fixed translation) - - "㉝": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi ba"] # 0x325d (en: 'circled number thirty three' GPT-5.4 fixed translation) - - "㉞": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi bốn"] # 0x325e (en: 'circled number thirty four') - - "㉟": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi lăm"] # 0x325f (en: 'circled number thirty five' GPT-5.4 fixed translation) - - "㊱": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi sĂĄu"] # 0x32b1 (en: 'circled number thirty six' GPT-5.4 fixed translation) - - "ăŠČ": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi báșŁy"] # 0x32b2 (en: 'circled number thirty seven', GPT-5.4 fixed translation) - - "㊳": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi tĂĄm"] # 0x32b3 (en: 'circled number thirty eight', GPT-5.4 fixed translation) - - "㊮": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi chĂ­n"] # 0x32b4 (en: 'circled number thirty nine', GPT-5.4 fixed translation) - - "㊔": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi"] # 0x32b5 (en: 'circled number forty', GPT-5.4 fixed translation) - - "㊶": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi mốt"] # 0x32b6 (en: 'circled number forty one', GPT-5.4 fixed translation) - - "㊷": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi hai"] # 0x32b7 (en: 'circled number forty two', GPT-5.4 fixed translation) - - "㊾": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi ba"] # 0x32b8 (en: 'circled number forty three', GPT-5.4 fixed translation) - - "ăŠč": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi bốn"] # 0x32b9 (en: 'circled number forty four', GPT-5.4 fixed translation) - - "ăŠș": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi lăm"] # 0x32ba (en: 'circled number forty five', GPT-5.4 fixed translation) - - "㊻": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi sĂĄu"] # 0x32bb (en: 'circled number forty six', GPT-5.4 fixed translation) - - "ăŠŒ": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi báșŁy"] # 0x32bc (en: 'circled number forty seven', GPT-5.4 fixed translation) - - "ăŠœ": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi tĂĄm"] # 0x32bd (en: 'circled number forty eight', GPT-5.4 fixed translation) - - "ăŠŸ": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi chĂ­n"] # 0x32be (en: 'circled number forty nine', GPT-5.4 fixed translation) - - "㊿": [t: "Ä‘Æ°á»Łc khoanh trĂČn số năm mÆ°ÆĄi"] # 0x32bf (en: 'circled number fifty', GPT-5.4 fixed translation) - - "㋌": [t: "thá»§y ngĂąn"] # 0x32cc (en: 'mercury') - - "㋍": [t: "ergs"] # 0x32cd - - "㋎": [t: "volt điện tá»­"] # 0x32ce (en: 'electron volts') - - "㋏": [t: "dáș„u hiệu trĂĄch nhiệm hữu háșĄn"] # 0x32cf (en: 'limited liability sign') - - "ă±": [t: "hectopascals"] # 0x3371 - - "ăČ": [t: "daltons"] # 0x3372 - - "㍳": [t: "cĂĄc Ä‘ÆĄn vị thiĂȘn văn"] # 0x3373 (en: 'astronomical units') - - "㍮": [t: "thanh"] # 0x3374 (en: 'bars') - - "ă”": [t: "o v"] # 0x3375 - - "ă¶": [t: "parsecs"] # 0x3376 - - "ă·": [t: "tháș­p phĂąn"] # 0x3377 (en: 'decimeters') - - "㍾": [t: "decimeter bĂŹnh phÆ°ÆĄng"] # 0x3378 (en: 'decimeters squared') - - "ăč": [t: "decimeter khối"] # 0x3379 (en: 'decimeters cubed') - - "ăș": [t: "Ä‘ÆĄn vị cĂŽng cỄ"] # 0x337a (en: 'instrumental units') - - "㎀": [t: "picoamp"] # 0x3380 (en: 'picoamps') - - "㎁": [t: "nanoamp"] # 0x3381 (en: 'nanoamps') - - "㎂": [t: "microamp"] # 0x3382 (en: 'microamps') - - "㎃": [t: "milliamps"] # 0x3383 - - "㎄": [t: "kiloamp"] # 0x3384 (en: 'kiloamps') - - "㎅": [t: "kilobyte"] # 0x3385 (en: 'kilobytes') - - "㎆": [t: "megabyte"] # 0x3386 (en: 'megabytes') - - "㎇": [t: "gigabyte"] # 0x3387 (en: 'gigabytes') - - "㎈": [t: "calo"] # 0x3388 (en: 'calories') - - "㎉": [t: "kilocalories"] # 0x3389 - - "㎊": [t: "picofarads"] # 0x338a - - "㎋": [t: "nanofarads"] # 0x338b - - "㎌": [t: "microfarads"] # 0x338c - - "㎍": [t: "micrograms"] # 0x338d - - "㎎": [t: "miligam"] # 0x338e (en: 'milligrams') - - "㎏": [t: "kilĂŽgam"] # 0x338f (en: 'kilograms') - - "㎐": [t: "hertz"] # 0x3390 - - "㎑": [t: "kilohertz"] # 0x3391 - - "㎒": [t: "megahertz"] # 0x3392 - - "㎓": [t: "gigahertz"] # 0x3393 - - "㎔": [t: "terahertz"] # 0x3394 - - "㎕": [t: "microliter"] # 0x3395 (en: 'microliters') - - "㎖": [t: "millileter"] # 0x3396 (en: 'millileters') - - "㎗": [t: "deciliter"] # 0x3397 (en: 'deciliters') - - "㎘": [t: "kiloliter"] # 0x3398 (en: 'kiloliters') - - "㎙": [t: "femtometer"] # 0x3399 (en: 'femtometers') - - "㎚": [t: "nanomet"] # 0x339a (en: 'nanometers') - - "㎛": [t: "micromet"] # 0x339b (en: 'micrometers') - - "㎜": [t: "milimet"] # 0x339c (en: 'millimeters') - - "㎝": [t: "centimet"] # 0x339d (en: 'centimeters') - - "㎞": [t: "km"] # 0x339e (en: 'kilometers') - - "㎟": [t: "bĂŹnh phÆ°ÆĄng milimet"] # 0x339f (en: 'millimeters squared') - - "㎠": [t: "centimet bĂŹnh phÆ°ÆĄng"] # 0x33a0 (en: 'centimeters squared') - - "㎡": [t: "mĂ©t bĂŹnh phÆ°ÆĄng"] # 0x33a1 (en: 'meters squared') - - "㎱": [t: "km bĂŹnh phÆ°ÆĄng"] # 0x33a2 (en: 'kilometers squared') - - "㎣": [t: "milimet khối"] # 0x33a3 (en: 'millimeters cubed') - - "㎀": [t: "centimet hĂŹnh khối"] # 0x33a4 (en: 'centimeters cubed') - - "㎄": [t: "mĂ©t khối"] # 0x33a5 (en: 'meters cubed') - - "㎩": [t: "km khối"] # 0x33a6 (en: 'kilometers cubed') - - "㎧": [t: "mĂ©t mỗi giĂąy"] # 0x33a7 (en: 'meters per second') - - "㎹": [t: "mĂ©t mỗi giĂąy bĂŹnh phÆ°ÆĄng"] # 0x33a8 (en: 'meters per second squared') - - "㎩": [t: "pascals"] # 0x33a9 - - "ăŽȘ": [t: "kilopascals"] # 0x33aa - - "㎫": [t: "megapascals"] # 0x33ab - - "㎬": [t: "gigapascals"] # 0x33ac - - "㎭": [t: "rads"] # 0x33ad - - "㎼": [t: "rads mỗi giĂąy"] # 0x33ae (en: 'rads per second') - - "㎯": [t: "rads trĂȘn bĂŹnh phÆ°ÆĄng thứ hai"] # 0x33af (en: 'rads per second squared') - - "㎰": [t: "picoseconds"] # 0x33b0 - - "㎱": [t: "nanoseconds"] # 0x33b1 - - "ăŽČ": [t: "micro giĂąy"] # 0x33b2 (en: 'microseconds') - - "㎳": [t: "mili giĂąy"] # 0x33b3 (en: 'milliseconds') - - "㎮": [t: "picovolts"] # 0x33b4 - - "㎔": [t: "nanovolts"] # 0x33b5 - - "㎶": [t: "microvolts"] # 0x33b6 - - "㎷": [t: "millivolts"] # 0x33b7 - - "㎾": [t: "kilovolts"] # 0x33b8 - - "ăŽč": [t: "megavolts"] # 0x33b9 - - "ăŽș": [t: "picowatt"] # 0x33ba (en: 'picowatts') - - "㎻": [t: "nanowatt"] # 0x33bb (en: 'nanowatts') - - "ăŽŒ": [t: "microwatt"] # 0x33bc (en: 'microwatts') - - "ăŽœ": [t: "milliwatts"] # 0x33bd - - "ăŽŸ": [t: "kilowatt"] # 0x33be (en: 'kilowatts') - - "㎿": [t: "megawatt"] # 0x33bf (en: 'megawatts') - - "㏀": [t: "kilo-ohms"] # 0x33c0 - - "㏁": [t: "megaohms"] # 0x33c1 - - "㏂": [t: "attometer"] # 0x33c2 (en: 'attometers') - - "㏃": [t: "becquerels"] # 0x33c3 - - "㏄": [t: "centimet khối"] # 0x33c4 (en: 'cubic centimeters') - - "㏅": [t: "náșżn"] # 0x33c5 (en: 'candelas') - - "㏆": [t: "coulomb mỗi kg"] # 0x33c6 (en: 'coulombs per kilogram') - - "㏇": [t: "lÆ°á»Łng mĂĄu tim bÆĄm ra"] # 0x33c7 (en: 'cardiac output') - - "㏈": [t: "decibel"] # 0x33c8 (en: 'decibels') - - "㏉": [t: "grays"] # 0x33c9 - - "㏊": [t: "ha"] # 0x33ca (en: 'hectares') - - "㏋": [t: "mĂŁ lá»±c"] # 0x33cb (en: 'horsepower') - - "㏌": [t: "inch"] # 0x33cc (en: 'inches') - - "㏍": [t: "kilokelvins"] # 0x33cd - - "㏎": [t: "km"] # 0x33ce (en: 'kilometers') - - "㏏": [t: "nĂșt tháșŻt"] # 0x33cf (en: 'knots') - - "㏐": [t: "lumens"] # 0x33d0 - - "㏑": [t: "nháș­t kĂœ tá»± nhiĂȘn"] # 0x33d1 (en: 'natural log') - - "㏒": [t: "logarit"] # 0x33d2 (en: 'logarithm') - - "㏓": [t: "lux"] # 0x33d3 - - "㏔": [t: "millibarns"] # 0x33d4 - - "㏕": [t: "nhĂ  mĂĄy"] # 0x33d5 (en: 'mills') - - "㏖": [t: "nốt ruồi"] # 0x33d6 (en: 'moles') - - "㏗": [t: "p h"] # 0x33d7 - - "㏘": [t: "buĂŽng điện"] # 0x33d8 (en: 'picometers') - - "㏙": [t: "pháș§n triệu"] # 0x33d9 (en: 'parts per million') - - "㏚": [t: "petaroentgens"] # 0x33da - - "㏛": [t: "steradians"] # 0x33db - - "㏜": [t: "sieverts"] # 0x33dc - - "㏝": [t: "webers"] # 0x33dd - - "㏞": [t: "volt mỗi mĂ©t"] # 0x33de (en: 'volts per meter') - - "㏟": [t: "amps mỗi mĂ©t"] # 0x33df (en: 'amps per meter') - - "㏿": [t: "gallon"] # 0x33ff (en: 'gallons') - - "": [t: "báș±ng với mĆ© bĂȘn dưới"] # 0xe900 (en: 'equals with hat below') - - "": [t: "báș±ng với cộng với ở trĂȘn"] # 0xe901 (en: 'equals with plus above') - - "â©Č": [t: "báș±ng với cộng với ở trĂȘn"] # 0x2a72 (en: 'equals with plus above') - - "": [t: "báș±ng với cộng với bĂȘn dưới"] # 0xe902 (en: 'equals with plus below') - - "⩱": [t: "báș±ng với cộng với bĂȘn dưới"] # 0x2a71 (en: 'equals with plus below') - - "": [t: "tilde với cộng với ở trĂȘn"] # 0xe903 (en: 'tilde with plus above') - - "⚊": [t: "tilde với cộng với ở trĂȘn"] # 0x2a26 (en: 'tilde with plus above') - - "": [t: "tilde với cộng với bĂȘn dưới"] # 0xe904 (en: 'tilde with plus below') - - "⚀": [t: "tilde với cộng với bĂȘn dưới"] # 0x2a24 (en: 'tilde with plus below') - - "": [t: "báș±ng gáș„p đîi trĂȘn lớn hÆĄn"] # 0xe908 (en: 'equal double over greater than') - - "": [t: "báș±ng gáș„p đîi so với Ă­t hÆĄn"] # 0xe909 (en: 'equal double over less than') - - "âȘ™": [t: "báș±ng gáș„p đîi so với Ă­t hÆĄn"] # 0x2a99 (en: 'equal double over less than') - - "": [t: "chứa hoáș·c báș±ng"] # 0xe90a (en: 'contains or equal to') - - "⋜": [t: "chứa hoáș·c báș±ng"] # 0x22fd (en: 'contains or equal to') - - "": [t: "superset cá»§a hoáș·c báș±ng"] # 0xe90b (en: 'superset of or equal to') - - "": [t: "táș­p hợp con hoáș·c báș±ng"] # 0xe90c (en: 'subset of or equal to') - - "": [t: "báș±ng nhau hÆĄn Ă­t hÆĄn"] # 0xe90d (en: 'equal over less than') - - "": [t: "yáșżu tố hoáș·c báș±ng"] # 0xe912 (en: 'element of or equal to') - - "⋷": [t: "yáșżu tố hoáș·c báș±ng"] # 0x22f7 (en: 'element of or equal to') - - "": [t: "báș±ng hoáș·c lớn hÆĄn"] # 0xe913 (en: 'equal to or greater than') - - "âȘš": [t: "báș±ng hoáș·c lớn hÆĄn"] # 0x2a9a (en: 'equal to or greater than') - - "": [t: "superset gáș§n đĂșng cá»§a"] # 0xe914 (en: 'approximate superset of') - - "⫈": [t: "superset gáș§n đĂșng cá»§a"] # 0x2ac8 (en: 'approximate superset of') - - "": [t: "táș­p hợp con gáș§n đĂșng cá»§a"] # 0xe915 (en: 'approximate subset of') - - "⫇": [t: "táș­p hợp con gáș§n đĂșng cá»§a"] # 0x2ac7 (en: 'approximate subset of') - - "": [t: "superset cá»§a với dot bao gồm như mối quan hệ phỄ"] # 0xe916 (en: 'superset of with dot includes as sub relation') - - "âȘŸ": [t: "superset cá»§a với dot bao gồm như mối quan hệ phỄ"] # 0x2abe (en: 'superset of with dot includes as sub relation') - - "": [t: "táș­p hợp con với dot Ä‘Æ°á»Łc bao gồm trong mối quan hệ phỄ"] # 0xe917 (en: 'subset of with dot is included in as sub relation') - - "âȘœ": [t: "táș­p hợp con với dot Ä‘Æ°á»Łc bao gồm trong mối quan hệ phỄ"] # 0x2abd (en: 'subset of with dot is included in as sub relation') - - "": [t: "báș±ng với dáș„u cháș„m bĂȘn dưới"] # 0xe918 (en: 'equal with dot below') - - "⩊": [t: "báș±ng với dáș„u cháș„m bĂȘn dưới"] # 0x2a66 (en: 'equal with dot below') - - "": [t: "bĂȘn trĂĄi cháș„m trĂȘn trừ cháș„m bĂȘn pháșŁi"] # 0xe919 (en: 'left dot over minus over right dot') - - "": [t: "dáș„u cháș„m bĂȘn pháșŁi trĂȘn trừ cháș„m bĂȘn trĂĄi"] # 0xe91a (en: 'right dot over minus over left dot') - - "": [t: "gáș§n như báș±ng trừ"] # 0xe91f (en: 'almost equal to minus') - - "": [t: "cĂșp vuĂŽng đîi"] # 0xe920 (en: 'double square cup') - - "": [t: "double square squalase"] # 0xe921 (en: 'double square cap') - - "": [t: "Ă­t hÆĄn báș±ng hoáș·c lớn hÆĄn"] # 0xe922 (en: 'less than equal to or greater than') - - "": [t: "tilde với dáș„u cháș„m"] # 0xe924 (en: 'tilde with dot') - - "â©Ș": [t: "tilde với dáș„u cháș„m"] # 0x2a6a (en: 'tilde with dot') - - "": [t: "tilde với hai cháș„m"] # 0xe925 (en: 'tilde with two dots') - - "": [t: "nhỏ hÆĄn lớn hÆĄn hoáș·c báș±ng"] # 0xe926 (en: 'less than greater than or equal to') - - "âȘ‘": [t: "nhỏ hÆĄn lớn hÆĄn hoáș·c báș±ng"] # 0x2a91 (en: 'less than greater than or equal to') - - "": [t: "lớn hÆĄn Ă­t hÆĄn hoáș·c báș±ng"] # 0xe927 (en: 'greater than less than or equal to') - - "âȘ’": [t: "lớn hÆĄn Ă­t hÆĄn hoáș·c báș±ng"] # 0x2a92 (en: 'greater than less than or equal to') - - "": [t: "tÆ°ÆĄng Ä‘Æ°ÆĄng hoáș·c Ă­t hÆĄn"] # 0xe928 (en: 'equivalent to or less than') - - "âȘ": [t: "tÆ°ÆĄng Ä‘Æ°ÆĄng hoáș·c Ă­t hÆĄn"] # 0x2a9d (en: 'equivalent to or less than') - - "": [t: "tÆ°ÆĄng Ä‘Æ°ÆĄng hoáș·c lớn hÆĄn"] # 0xe929 (en: 'equivalent to or greater than') - - "î€Ș": [t: "toĂĄn tá»­ hộp mở"] # 0xe92a (en: 'left open box operator') - - "": [t: "toĂĄn tá»­ hộp mở bĂȘn pháșŁi"] # 0xe92b (en: 'right open box operator') - - "": [t: "giống hệt với dáș„u cháș„m"] # 0xe92c (en: 'identical to with dot') - - "": [t: "lớn hÆĄn báș±ng hoáș·c nhỏ hÆĄn"] # 0xe92d (en: 'greater than equal to or less than') - - "": [t: "nhĂ  điều hĂ nh thanh"] # 0xe92e (en: 'bar operator') - - "": [t: "nhĂ  điều hĂ nh thanh đîi"] # 0xe92f (en: 'double bar operator') - - "": [t: "nhĂ  điều hĂ nh ba thanh"] # 0xe930 (en: 'triple bar operator') - - "î€Č": [t: "nhỏ hÆĄn hoáș·c xáș„p xỉ báș±ng"] # 0xe932 (en: 'less than or approximately equal to') - - "": [t: "lớn hÆĄn hoáș·c xáș„p xỉ báș±ng"] # 0xe933 (en: 'greater than or approximately equal to') - - "": [t: "lồng Ă­t hÆĄn"] # 0xe936 (en: 'nested less than') - - "âȘĄ": [t: "lồng Ă­t hÆĄn"] # 0x2aa1 (en: 'nested less than') - - "": [t: "lồng nhau lớn hÆĄn"] # 0xe937 (en: 'nested greater than') - - "âȘą": [t: "lồng nhau lớn hÆĄn"] # 0x2aa2 (en: 'nested greater than') - - "î€ș": [t: "trước hoáș·c tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0xe93a (en: 'precedes or equivalent to') - - "": [t: "thĂ nh cĂŽng hoáș·c tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0xe93b (en: 'succeeds or equivalent to') - - "î„€": [t: "đi trước báș±ng báș±ng nhau"] # 0xe940 (en: 'precedes over equal') - - "": [t: "thĂ nh cĂŽng quĂĄ bĂŹnh đáșłng"] # 0xe941 (en: 'succeeds over equal') - - "î„‚": [t: "Ă­t báș±ng nhau hÆĄn nghiĂȘng lớn hÆĄn"] # 0xe942 (en: 'less equal slanted greater') - - "": [t: "lớn hÆĄn báș±ng Ă­t hÆĄn"] # 0xe943 (en: 'greater equal slanted less') - - "": [t: "hĂ i lĂČng bởi"] # 0xe948 (en: 'satisfied by') - - "": [t: "lười biáșżng s"] # 0xe949 (en: 'lazy s') - - "": [t: "khĂŽng kháșłng định"] # 0xe94a (en: 'not assertion') - - "î„‹": [t: "gáș„p đîi báș±ng nhau"] # 0xe94b (en: 'double equal') - - "â©”": [t: "gáș„p đîi báș±ng nhau"] # 0x2a75 (en: 'double equal') - - "": [t: "triple báș±ng nhau"] # 0xe94c (en: 'triple equal') - - "": [t: "quy táșŻc bị trĂŹ hoĂŁn"] # 0xe94d (en: 'rule delayed') - - "â§Ž": [t: "quy táșŻc bị trĂŹ hoĂŁn"] # 0x29f4 (en: 'rule delayed') - - "": [t: "phĂąn định bĂ­ danh"] # 0xe94e (en: 'alias delimiter') - - "": [t: "nhĂłm con bĂŹnh thường cá»§a thanh"] # 0xe950 (en: 'normal subgroup of with bar') - - "⧏": [t: "nhĂłm con bĂŹnh thường cá»§a thanh"] # 0x29cf (en: 'normal subgroup of with bar') - - "î„‘": [t: "chứa như phĂąn nhĂłm bĂŹnh thường với thanh"] # 0xe951 (en: 'contains as normal subgroup with bar') - - "⧐": [t: "chứa như phĂąn nhĂłm bĂŹnh thường với thanh"] # 0x29d0 (en: 'contains as normal subgroup with bar') - - "î„”": [t: "vĂČng ngỄ Ăœ"] # 0xe954 (en: 'round implies') - - "â„°": [t: "vĂČng ngỄ Ăœ"] # 0x2970 (en: 'round implies') - - "î„•": [t: "nỄ cười dưới quĂĄn bar"] # 0xe955 (en: 'smile under bar') - - "î„–": [t: "cau mĂ y trĂȘn quĂĄn bar"] # 0xe956 (en: 'frown over bar') - - "î„—": [t: "superset cá»§a hoáș·c gáș§n như báș±ng"] # 0xe957 (en: 'superset of or almost equal to') - - "": [t: "táș­p hợp con hoáș·c gáș§n như báș±ng"] # 0xe958 (en: 'subset of or almost equal to') - - "î„™": [t: "lớn hÆĄn gáș§n như báș±ng hoáș·c Ă­t hÆĄn"] # 0xe959 (en: 'greater than almost equal to or less than') - - "": [t: "Ă­t hÆĄn gáș§n như báș±ng hoáș·c lớn hÆĄn"] # 0xe95a (en: 'less than almost equal or greater than') - - "": [t: "gáș„p đîi logic hoáș·c"] # 0xe95c (en: 'double logical or') - - "⩔": [t: "gáș„p đîi logic hoáș·c"] # 0x2a54 (en: 'double logical or') - - "": [t: "gáș„p đîi logic vĂ "] # 0xe95d (en: 'double logical and') - - "⩓": [t: "gáș„p đîi logic vĂ "] # 0x2a53 (en: 'double logical and') - - "": [t: "logic hoáș·c với thanh đîi dưới đñy"] # 0xe95e (en: 'logical or with double bar below') - - "": [t: "logic hoáș·c với thanh dưới đñy"] # 0xe95f (en: 'logical or with bar below') - - "": [t: "gáș§n như báș±ng nhau trĂȘn"] # 0xe962 (en: 'almost equal over equal') - - "î„€": [t: "hĂŹnh tam giĂĄc trỏ trĂĄi với thanh chia đîi"] # 0xe964 (en: 'left pointing triangle with bisecting bar') - - "î„„": [t: "tam giĂĄc chỉ bĂȘn pháșŁi với thanh chia đîi"] # 0xe965 (en: 'right pointing triangle with bisecting bar') - - "": [t: "báș±ng với dĂČng trĂȘn cĂčng cháș„m"] # 0xe966 (en: 'equals with dotted top line') - - "î„§": [t: "đi trước với đáșĄi trĂ ng"] # 0xe967 (en: 'precedes with colon') - - "": [t: "thĂ nh cĂŽng với đáșĄi trĂ ng"] # 0xe968 (en: 'succeeds with colon') - - "î„©": [t: "nhỏ hÆĄn hoáș·c báș±ng nghiĂȘng"] # 0xe969 (en: 'smaller than or equal slanted') - - "î„Ș": [t: "lớn hÆĄn hoáș·c báș±ng nghiĂȘng"] # 0xe96a (en: 'larger than or equal slanted') - - "î„«": [t: "lồng nhau ráș„t Ă­t hÆĄn"] # 0xe96b (en: 'nested very much less than') - - "": [t: "lồng nhau ráș„t lớn hÆĄn nhiều so với"] # 0xe96c (en: 'nested very much greater than') - - "î„­": [t: "sá»± khĂĄc biệt giữa biáșżn thể"] # 0xe96d (en: 'difference between variant') - - "âȘź": [t: "sá»± khĂĄc biệt giữa biáșżn thể"] # 0x2aae (en: 'difference between variant') - - "": [t: "Ă­t hÆĄn so với lớp phá»§"] # 0xe96e (en: 'less than greater than overlay') - - "âȘ€": [t: "Ă­t hÆĄn so với lớp phá»§"] # 0x2aa4 (en: 'less than greater than overlay') - - "": [t: "logic hoáș·c logic vĂ  lớp phá»§"] # 0xe96f (en: 'logical or logical and overlay') - - "î„°": [t: "superset trĂȘn superset"] # 0xe970 (en: 'superset over superset') - - "⫖": [t: "superset trĂȘn superset"] # 0x2ad6 (en: 'superset over superset') - - "": [t: "táș­p hợp con qua táș­p hợp con"] # 0xe971 (en: 'subset over subset') - - "⫕": [t: "táș­p hợp con qua táș­p hợp con"] # 0x2ad5 (en: 'subset over subset') - - "î„Č": [t: "superset trĂȘn táș­p hợp con"] # 0xe972 (en: 'superset over subset') - - "⫔": [t: "superset trĂȘn táș­p hợp con"] # 0x2ad4 (en: 'superset over subset') - - "": [t: "táș­p hợp con trĂȘn superset"] # 0xe973 (en: 'subset over superset') - - "⫓": [t: "táș­p hợp con trĂȘn superset"] # 0x2ad3 (en: 'subset over superset') - - "î„č": [t: "thanh ba tháșłng đứng"] # 0xe979 (en: 'triple vertical bar') - - "î„ș": [t: "ghĂ©p cĂĄc cháș„m dọc"] # 0xe97a (en: 'paired quadruple vertical dots') - - "î„»": [t: "vuĂŽng gĂłc trĂȘn thanh"] # 0xe97b (en: 'perpendicular over bar') - - "⫚": [t: "vuĂŽng gĂłc trĂȘn thanh"] # 0x2ae8 (en: 'perpendicular over bar') - - "": [t: "bar let -bretstile bar du trường"] # 0xe97c (en: 'left turnstile double vertical bar') - - "": [t: "double bĂȘn trĂĄi thanh dọc kĂ©p"] # 0xe97d (en: 'double left turnstile double vertical bar') - - "": [t: "vuĂŽng gĂłc trĂȘn đáșŁo ngÆ°á»Łc vuĂŽng gĂłc"] # 0xe97e (en: 'perpendicular over inverted perpendicular') - - "": [t: "double bĂȘn trĂĄi thanh dọc"] # 0xe97f (en: 'double left turnstile vertical bar') - - "â«€": [t: "double bĂȘn trĂĄi thanh dọc"] # 0x2ae4 (en: 'double left turnstile vertical bar') - - "": [t: "gĂłc hĂŹnh cáș§u mở ra"] # 0xe980 (en: 'spherical angle opening up') - - "": [t: "chĂ©m đîi"] # 0xe981 (en: 'double slash') - - "": [t: "gĂłc vuĂŽng với gĂłc"] # 0xe982 (en: 'right angle with corner') - - "": [t: "bao quanh thanh dọc"] # 0xe984 (en: 'circled vertical bar') - - "⊶": [t: "bao quanh thanh dọc"] # 0x29b6 (en: 'circled vertical bar') - - "": [t: "dáș„u hiệu phĂąn chia vĂČng trĂČn"] # 0xe985 (en: 'circled division sign') - - "âšž": [t: "dáș„u hiệu phĂąn chia vĂČng trĂČn"] # 0x2a38 (en: 'circled division sign') - - "": [t: "solidus đứt nĂ©t"] # 0xe986 (en: 'dashed solidus') - - "": [t: "backslash bị đứt nĂ©t"] # 0xe987 (en: 'dashed backslash') - - "": [t: "đường giữa đứt"] # 0xe988 (en: 'dashed mid line') - - "": [t: "thanh dọc đứt"] # 0xe989 (en: 'dashed vertical bar') - - "": [t: "vuĂŽng gĂłc với s"] # 0xe98a (en: 'perpendicular with s') - - "": [t: "gĂłc với s"] # 0xe98b (en: 'angle with s') - - "": [t: "gĂłc hĂŹnh cáș§u mở bĂȘn trĂĄi"] # 0xe98c (en: 'spherical angle opening left') - - "": [t: "gĂłc mở bĂȘn trĂĄi"] # 0xe98d (en: 'angle opening left') - - "": [t: "thanh dọc với mĂłc đîi"] # 0xe98e (en: 'vertical bar with double hook') - - "℟": [t: "thanh dọc với mĂłc đîi"] # 0x297e (en: 'vertical bar with double hook') - - "": [t: "toĂĄn tá»­ cháș„m trung bĂŹnh gốc tá»± do"] # 0xe98f (en: 'medium dot operator free radical') - - "": [t: "tráșŻng lĂȘn hĂŹnh tam giĂĄc phĂ­a trĂȘn thanh"] # 0xe990 (en: 'white up pointing triangle above bar') - - "": [t: "giống hệt nhau vĂ  song song với"] # 0xe991 (en: 'identical and parallel to') - - "": [t: "smash sáșŁn pháș©m"] # 0xe992 (en: 'smash product') - - "âšł": [t: "smash sáșŁn pháș©m"] # 0x2a33 (en: 'smash product') - - "": [t: "toĂĄn tá»­ ba thanh với thanh ngang"] # 0xe993 (en: 'triple bar operator with horizontal bar') - - "": [t: "giống hệt với cáșŻt đîi"] # 0xe994 (en: 'identical to with double slash') - - "â§„": [t: "giống hệt với cáșŻt đîi"] # 0x29e5 (en: 'identical to with double slash') - - "": [t: "triple crossed bars"] # 0xe995 - - "": [t: "thanh dọc trĂȘn vĂČng trĂČn"] # 0xe996 (en: 'vertical bar over circle') - - "": [t: "tá»· lệ dọc so với"] # 0xe997 (en: 'vertical proportional to') - - "": [t: "đen quĂœ trước máș·t trăng"] # 0xe998 (en: 'black last quarter moon') - - "": [t: "máș·t trăng quĂœ đáș§u tiĂȘn mĂ u đen"] # 0xe999 (en: 'black first quarter moon') - - "": [t: "sĂłng sin Ăąm"] # 0xe9a0 (en: 'negative sine wave') - - "": [t: "dáș„u ngoáș·c Ä‘ÆĄn"] # 0xe9a1 (en: 'parenthesized dot') - - "": [t: "dáș„u ngoáș·c Ä‘ÆĄn"] # 0xe9a2 (en: 'parens') - - "": [t: "nỄ cười tráșŻng"] # 0xe9a3 (en: 'white smile') - - "": [t: "tráșŻng cau mĂ y"] # 0xe9a4 (en: 'white frown') - - "": [t: "hĂŹnh lỄc giĂĄc"] # 0xe9a5 (en: 'hexagon') - - "": [t: "tÆ°ÆĄng Ä‘Æ°ÆĄng với hÆĄn cộng"] # 0xe9a6 (en: 'equivalent to over plus') - - "": [t: "cộng với quĂĄ mức tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0xe9a7 (en: 'plus over equivalent to') - - "": [t: "giao lộ serifs"] # 0xe9b0 (en: 'intersection serifs') - - "": [t: "liĂȘn minh serifs"] # 0xe9b1 (en: 'union serifs') - - "îŠČ": [t: "giao lộ vuĂŽng serifs"] # 0xe9b2 (en: 'square intersection serifs') - - "": [t: "square union serifs"] # 0xe9b3 - - "î§ ": [t: "trước tÆ°ÆĄng Ä‘Æ°ÆĄng hoáș·c thĂ nh cĂŽng"] # 0xe9e0 (en: 'precedes equivalent to or succeeds') - - "î§Ą": [t: "thĂ nh cĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với hoáș·c trước"] # 0xe9e1 (en: 'succeeds equivalent to or precedes') - - "î§ą": [t: "đi trước gáș§n như báș±ng hoáș·c thĂ nh cĂŽng"] # 0xe9e2 (en: 'precedes almost equal to or succeeds') - - "î§Ł": [t: "thĂ nh cĂŽng gáș§n như báș±ng hoáș·c trước"] # 0xe9e3 (en: 'succeeds almost equal to or precedes') - - "î§°": [t: "Ă­t hÆĄn tÆ°ÆĄng Ä‘Æ°ÆĄng với hoáș·c lớn hÆĄn"] # 0xe9f0 (en: 'less than equivalent to or greater than') - - "î§±": [t: "lớn hÆĄn tÆ°ÆĄng Ä‘Æ°ÆĄng với hoáș·c Ă­t hÆĄn"] # 0xe9f1 (en: 'greater than equivalent to or less than') - - "": [t: "khĂŽng pháșŁi lĂ  Ă­t hÆĄn nhiều"] # 0xea00 (en: 'not vert much less than') - - "": [t: "khĂŽng pháșŁi lĂ  lớn hÆĄn nhiều so với"] # 0xea01 (en: 'not vert much greater than') - - "": [t: "khĂŽng Ă­t hÆĄn nhiều biáșżn thể"] # 0xea02 (en: 'not much less than variant') - - "": [t: "khĂŽng lớn hÆĄn nhiều so với biáșżn thể"] # 0xea03 (en: 'not much greater than variant') - - "": [t: "Ă­t vert khĂŽng báș±ng kĂ©p báș±ng"] # 0xea04 (en: 'less vert not double equals') - - "": [t: "gt vert khĂŽng báș±ng kĂ©p"] # 0xea05 (en: 'gt vert not double equals') - - "": [t: "khĂŽng Ă­t hÆĄn hoáș·c báș±ng"] # 0xea06 (en: 'not less than or equal to') - - "": [t: "khĂŽng lớn hÆĄn hoáș·c báș±ng"] # 0xea07 (en: 'not greater than or equal to') - - "": [t: "khĂŽng báș±ng cĆ©ng khĂŽng Ă­t hÆĄn"] # 0xea09 (en: 'neither equal to nor less than') - - "": [t: "khĂŽng chứa hoáș·c báș±ng"] # 0xea0a (en: 'does not contain or equal to') - - "": [t: "khĂŽng pháșŁi siĂȘu sao cĆ©ng khĂŽng báș±ng"] # 0xea0b (en: 'neither superset of nor equal to') - - "": [t: "khĂŽng pháșŁi táș­p hợp con cĆ©ng khĂŽng báș±ng"] # 0xea0c (en: 'neither subset of nor equal to') - - "": [t: "đáșŁo ngÆ°á»Łc solidus táș­p hợp con"] # 0xea0d (en: 'reverse solidus subset') - - "": [t: "khĂŽng báș±ng cĆ©ng khĂŽng lớn hÆĄn"] # 0xea0e (en: 'neither equal to nor greater than') - - "": [t: "khĂŽng trừ đi toĂĄn tá»­ tilde"] # 0xea0f (en: 'not minus tilde operator') - - "": [t: "khĂŽng báș±ng cĆ©ng khĂŽng Ă­t hÆĄn"] # 0xea10 (en: 'neither equal to nor less than') - - "": [t: "khĂŽng pháșŁi nhĂ  điều hĂ nh tilde"] # 0xea11 (en: 'not tilde operator') - - "": [t: "khĂŽng pháșŁi lĂ  yáșżu tố hoáș·c báș±ng"] # 0xea12 (en: 'not element of or equal to') - - "": [t: "khĂŽng báș±ng cĆ©ng khĂŽng lớn hÆĄn"] # 0xea13 (en: 'neither equal to nor greater than') - - "": [t: "khĂŽng gáș§n như báș±ng nhau"] # 0xea14 (en: 'not almost equal') - - "": [t: "khĂŽng thĂ nh cĂŽng tÆ°ÆĄng tá»±"] # 0xea15 (en: 'not succeeds similar') - - "": [t: "Ă­t hÆĄn hoáș·c nghiĂȘng báș±ng với dáș„u gáșĄch chĂ©o"] # 0xea16 (en: 'less than or slanted equal to with slash') - - "": [t: "lớn hÆĄn hoáș·c nghiĂȘng báș±ng với dáș„u gáșĄch chĂ©o"] # 0xea17 (en: 'greater than or slanted equal to with slash') - - "": [t: "superset solidus"] # 0xea1a - - "": [t: "khĂŽng chứa"] # 0xea1b (en: 'does not contain') - - "": [t: "khĂŽng Ă­t hÆĄn hoáș·c báș±ng"] # 0xea1d (en: 'not less than or equal to') - - "": [t: "khĂŽng lớn hÆĄn hoáș·c báș±ng"] # 0xea1e (en: 'not greater than or equal to') - - "": [t: "khĂŽng gáș§n như báș±ng trừ"] # 0xea1f (en: 'not almost equal to minus') - - "îšą": [t: "tiĂȘu cá»±c đáș·t thĂ nh viĂȘn cháș„m ở trĂȘn"] # 0xea22 (en: 'negated set membership dot above') - - "": [t: "khĂŽng gĂłc gĂłc"] # 0xea2c (en: 'not vert angle') - - "îš­": [t: "khĂŽng song song nghiĂȘng"] # 0xea2d (en: 'not parallel slanted') - - "îšź": [t: "khĂŽng pháșŁi nhĂ  điều hĂ nh thanh"] # 0xea2e (en: 'not bar operator') - - "": [t: "khĂŽng pháșŁi nhĂ  điều hĂ nh thanh đîi"] # 0xea2f (en: 'not double bar operator') - - "îš°": [t: "khĂŽng pháșŁi nhĂ  điều hĂ nh ba thanh"] # 0xea30 (en: 'not triple bar operator') - - "îšČ": [t: "Ă­t hÆĄn nhưng khĂŽng xáș„p xỉ báș±ng"] # 0xea32 (en: 'less than but not approximately equal to') - - "âȘ‰": [t: "Ă­t hÆĄn nhưng khĂŽng xáș„p xỉ báș±ng"] # 0x2a89 (en: 'less than but not approximately equal to') - - "îšł": [t: "lớn hÆĄn nhưng khĂŽng xáș„p xỉ báș±ng"] # 0xea33 (en: 'greater than but not approximately equal to') - - "âȘŠ": [t: "lớn hÆĄn nhưng khĂŽng xáș„p xỉ báș±ng"] # 0x2a8a (en: 'greater than but not approximately equal to') - - "": [t: "nhỏ hÆĄn hoáș·c khĂŽng báș±ng"] # 0xea34 (en: 'less than or not equal to') - - "îš”": [t: "lớn hÆĄn hoáș·c khĂŽng báș±ng"] # 0xea35 (en: 'greater than or not equal to') - - "îš¶": [t: "khĂŽng lồng nhau Ă­t hÆĄn"] # 0xea36 (en: 'not nested less than') - - "îš·": [t: "khĂŽng lồng nhau lớn hÆĄn"] # 0xea37 (en: 'not nested greater than') - - "îšž": [t: "khĂŽng Ă­t hÆĄn nhiều"] # 0xea38 (en: 'not much less than') - - "îšč": [t: "khĂŽng lớn hÆĄn nhiều so với"] # 0xea39 (en: 'not much greater than') - - "îšș": [t: "đi trước nhưng khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0xea3a (en: 'precedes but not equivalent to') - - "îš»": [t: "thĂ nh cĂŽng nhưng khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0xea3b (en: 'succeeds but not equivalent to') - - "": [t: "đi trước nhưng khĂŽng báș±ng"] # 0xea3c (en: 'precedes but not equal to') - - "îšœ": [t: "thĂ nh cĂŽng nhưng khĂŽng báș±ng"] # 0xea3d (en: 'succeeds but not equal to') - - "": [t: "khĂŽng báș±ng hoáș·c trước"] # 0xea3e (en: 'does not equal or precede') - - "îšż": [t: "khĂŽng báș±ng hoáș·c thĂ nh cĂŽng"] # 0xea3f (en: 'does not equal or succeed') - - "": [t: "đi trước nhưng khĂŽng báș±ng"] # 0xea40 (en: 'precedes but not equal to') - - "âȘ”": [t: "đi trước nhưng khĂŽng báș±ng"] # 0x2ab5 (en: 'precedes but not equal to') - - "": [t: "thĂ nh cĂŽng nhưng khĂŽng báș±ng"] # 0xea41 (en: 'succeeds but not equal to') - - "âȘ¶": [t: "thĂ nh cĂŽng nhưng khĂŽng báș±ng"] # 0x2ab6 (en: 'succeeds but not equal to') - - "": [t: "khĂŽng pháșŁi lĂ  táș­p hợp con cĆ©ng khĂŽng báș±ng"] # 0xea42 (en: 'not subset of nor equal to') - - "": [t: "khĂŽng pháșŁi siĂȘu sao cĆ©ng khĂŽng báș±ng"] # 0xea43 (en: 'not superset of nor equal to') - - "": [t: "táș­p hợp con hoáș·c khĂŽng báș±ng"] # 0xea44 (en: 'subset of or not equal to') - - "": [t: "superset cá»§a hoáș·c khĂŽng báș±ng"] # 0xea45 (en: 'superset of or not equal to') - - "": [t: "khĂŽng pháșŁi lĂ  táș­p hợp con cĆ©ng khĂŽng báș±ng"] # 0xea46 (en: 'not subset of nor equal to') - - "": [t: "khĂŽng pháșŁi siĂȘu sao cĆ©ng khĂŽng báș±ng"] # 0xea47 (en: 'not superset of nor equal to') - - "": [t: "khĂŽng nhỏ hÆĄn ba"] # 0xea48 (en: 'not triple less than') - - "": [t: "khĂŽng lớn hÆĄn gáș„p ba láș§n"] # 0xea49 (en: 'not triple greater than') - - "": [t: "khĂŽng đi trước báș±ng"] # 0xea4c (en: 'not precedes equals') - - "": [t: "khĂŽng thĂ nh cĂŽng báș±ng nhau"] # 0xea4d (en: 'not succeeds equals') - - "": [t: "khĂŽng pháșŁi nhĂłm con bĂŹnh thường cá»§a thanh"] # 0xea50 (en: 'not normal subgroup of with bar') - - "": [t: "khĂŽng chứa như phĂąn nhĂłm bĂŹnh thường với thanh"] # 0xea51 (en: 'does not contain as normal subgroup with bar') - - "": [t: "khĂŽng pháșŁi lĂ  sá»± khĂĄc biệt giữa"] # 0xea52 (en: 'not difference between') - - "": [t: "khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng về máș·t hĂŹnh học"] # 0xea53 (en: 'not geometrically equivalent to') - - "": [t: "khĂŽng pháșŁi lĂ  tÆ°ÆĄng tá»±"] # 0xea54 (en: 'not vert similar') - - "": [t: "khĂŽng báș±ng hoáș·c tÆ°ÆĄng tá»±"] # 0xea55 (en: 'not equal or similar') - - "": [t: "khĂŽng gáș§n đĂșng"] # 0xea56 (en: 'not vert approximate') - - "": [t: "khĂŽng xáș„p xỉ giống hệt nhau"] # 0xea57 (en: 'not approximately identical to') - - "": [t: "khĂŽng gáș­p ghềnh báș±ng nhau"] # 0xea58 (en: 'not bumpy equals') - - "": [t: "khĂŽng gáș­p ghềnh báș±ng nhau"] # 0xea59 (en: 'not bumpy single equals') - - "": [t: "khĂŽng pháșŁi dáș„u cháș„m báș±ng nhau"] # 0xea5a (en: 'not equal dot') - - "": [t: "đáșŁo ngÆ°á»Łc khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng"] # 0xea5b (en: 'reverse not equivalent') - - "î© ": [t: "khĂŽng pháșŁi táș­p hợp con vuĂŽng"] # 0xea60 (en: 'not square subset') - - "": [t: "khĂŽng pháșŁi lĂ  siĂȘu siĂȘu hĂŹnh"] # 0xea61 (en: 'not square superset') - - "": [t: "khĂŽng gáș§n như báș±ng nhau"] # 0xea62 (en: 'not almost equal over equal') - - "": [t: "khĂŽng hoĂ n toĂ n tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0xea63 (en: 'not strictly equivalent to') - - "î©€": [t: "khĂŽng đồng dáșĄng cháș„m"] # 0xea64 (en: 'not congruent dot') - - "î©„": [t: "đáșŁo ngÆ°á»Łc khĂŽng báș±ng nhau"] # 0xea65 (en: 'reverse not equal') - - "î©°": [t: "khĂŽng pháșŁi đỉnh bĂȘn trĂĄi báș±ng nhau"] # 0xea70 (en: 'not vert left triangle equals') - - "": [t: "khĂŽng pháșŁi hĂŹnh tam giĂĄc bĂȘn pháșŁi báș±ng"] # 0xea71 (en: 'not vert right triangle equals') - - "îȘ€": [t: "khĂŽng một pháș§n"] # 0xea80 (en: 'not partial') - - "": [t: "mĆ©i tĂȘn extender"] # 0xeb00 (en: 'arrow embellishment extender') - - "": [t: "mĆ©i tĂȘn pháșŁi qua mĆ©i tĂȘn trĂĄi"] # 0xeb01 (en: 'arrow rightwards over arrow leftwards') - - "": [t: "mĆ©i tĂȘn pháșŁi qua mĆ©i tĂȘn trĂĄi"] # 0xeb02 (en: 'arrow rightwards over arrow leftwards') - - "": [t: "harpoon ngay trĂȘn harpoon trĂĄi"] # 0xeb03 (en: 'harpoon right over harpoon left') - - "": [t: "harpoon ngay trĂȘn harpoon trĂĄi"] # 0xeb04 (en: 'harpoon right over harpoon left') - - "": [t: "mĆ©i tĂȘn kĂ©p đîng nam tĂąy nam"] # 0xeb05 (en: 'double arrow northeast southwest') - - "": [t: "mĆ©i tĂȘn kĂ©p phĂ­a tĂąy báșŻc đîng nam"] # 0xeb06 (en: 'double arrow northwest southeast') - - "": [t: "bộ mở rộng harpoon ngang"] # 0xeb07 (en: 'horizontal harpoon extender') - - "": [t: "mĆ©i tĂȘn trĂĄi ngÆ°á»Łc chiều kim đồng hồ"] # 0xeb08 (en: 'anticlockwise arc leftwards arrow') - - "": [t: "vĂČng cung ngÆ°á»Łc chiều kim đồng hồ mĆ©i tĂȘn bĂȘn pháșŁi"] # 0xeb09 (en: 'anticlockwise arc rightwards arrow') - - "": [t: "giọng mĆ©i pháșŁi lớn"] # 0xeb0b (en: 'large rightwards arrow accent') - - "": [t: "điểm nháș„n mĆ©i tĂȘn lớn bĂȘn trĂĄi"] # 0xeb0c (en: 'large leftwards arrow accent') - - "": [t: "đáș§u mĆ©i tĂȘn trĂĄi"] # 0xeb0d (en: 'leftwards arrowhead') - - "": [t: "đáș§u mĆ©i tĂȘn pháșŁi"] # 0xeb0e (en: 'rightwards arrowhead') - - "": [t: "mĆ©i tĂȘn lớn bĂȘn trĂĄi với gáșĄch"] # 0xeb0f (en: 'large left right arrow with stroke') - - "": [t: "bộ mở rộng mĆ©i tĂȘn kĂ©p ngang"] # 0xeb10 (en: 'horizontal double arrow extender') - - "": [t: "mĆ©i tĂȘn đîi bĂȘn trĂĄi lớn bĂȘn trĂĄi với gáșĄch"] # 0xeb11 (en: 'large left right double arrow with stroke') - - "": [t: "mĆ©i tĂȘn xuống bĂȘn trĂĄi cá»§a mĆ©i tĂȘn hướng lĂȘn"] # 0xeb12 (en: 'downwards arrow leftwards of upwards arrow') - - "⇔": [t: "mĆ©i tĂȘn xuống bĂȘn trĂĄi cá»§a mĆ©i tĂȘn hướng lĂȘn"] # 0x21f5 (en: 'downwards arrow leftwards of upwards arrow') - - "": [t: "mĆ©i tĂȘn trĂĄi với gĂłc xuống"] # 0xeb13 (en: 'leftwards arrow with corner downwards') - - "": [t: "mĆ©i tĂȘn bĂȘn pháșŁi với gĂłc hướng lĂȘn trĂȘn"] # 0xeb14 (en: 'rightwards arrow with corner upwards') - - "": [t: "mĆ©i tĂȘn trĂĄi với gĂłc hướng lĂȘn trĂȘn"] # 0xeb15 (en: 'leftwards arrow with corner upwards') - - "": [t: "mĆ©i tĂȘn bĂĄn nguyệt trĂȘn cĂčng theo chiều kim đồng hồ với plus"] # 0xeb16 (en: 'anticlockwise top semicircle arrow with plus') - - "“": [t: "mĆ©i tĂȘn bĂĄn nguyệt trĂȘn cĂčng theo chiều kim đồng hồ với plus"] # 0x293d (en: 'anticlockwise top semicircle arrow with plus') - - "": [t: "mĆ©i tĂȘn bĂĄn nguyệt trĂȘn cĂčng theo chiều kim đồng hồ với điểm trừ"] # 0xeb17 (en: 'clockwise top semicircle arrow with minus') - - "‌": [t: "mĆ©i tĂȘn bĂĄn nguyệt trĂȘn cĂčng theo chiều kim đồng hồ với điểm trừ"] # 0x293c (en: 'clockwise top semicircle arrow with minus') - - "": [t: "mĆ©i tĂȘn bĂȘn pháșŁi với đuĂŽi với gáșĄch"] # 0xeb18 (en: 'rightwards arrow with tail with stroke') - - "": [t: "harpoon pháșŁi xuống"] # 0xeb19 (en: 'right harpoon down') - - "": [t: "rời harpoon xuống"] # 0xeb1a (en: 'left harpoon down') - - "": [t: "bĂȘn trĂĄi harpoon xuống"] # 0xeb1b (en: 'left right harpoon down') - - "ℐ": [t: "bĂȘn trĂĄi harpoon xuống"] # 0x2950 (en: 'left right harpoon down') - - "": [t: "bĂȘn trĂĄi harpoon lĂȘn"] # 0xeb1c (en: 'left right harpoon up') - - "ℎ": [t: "bĂȘn trĂĄi harpoon lĂȘn"] # 0x294e (en: 'left right harpoon up') - - "": [t: "lĂȘn xuống harpoon trĂĄi"] # 0xeb1d (en: 'up down harpoon left') - - "â„‘": [t: "lĂȘn xuống harpoon trĂĄi"] # 0x2951 (en: 'up down harpoon left') - - "": [t: "lĂȘn xuống harpoon pháșŁi"] # 0xeb1e (en: 'up down harpoon right') - - "ℏ": [t: "lĂȘn xuống harpoon pháșŁi"] # 0x294f (en: 'up down harpoon right') - - "": [t: "mĆ©i tĂȘn hướng lĂȘn bĂȘn pháșŁi cá»§a mĆ©i tĂȘn xuống"] # 0xeb1f (en: 'upwards arrow to the right of downwards arrow') - - "⇔": [t: "mĆ©i tĂȘn hướng lĂȘn bĂȘn pháșŁi cá»§a mĆ©i tĂȘn xuống"] # 0x21f5 (en: 'upwards arrow to the right of downwards arrow') - - "": [t: "harpoon trĂĄi để bar với barb lĂȘn trĂȘn"] # 0xeb20 (en: 'leftwards harpoon to bar with barb upwards') - - "â„’": [t: "harpoon trĂĄi để bar với barb lĂȘn trĂȘn"] # 0x2952 (en: 'leftwards harpoon to bar with barb upwards') - - "": [t: "quyền harpoon đáșżn bar với barb lĂȘn trĂȘn"] # 0xeb21 (en: 'rightwards harpoon to bar with barb upwards') - - "â„“": [t: "quyền harpoon đáșżn bar với barb lĂȘn trĂȘn"] # 0x2953 (en: 'rightwards harpoon to bar with barb upwards') - - "": [t: "harpoon bĂȘn trĂĄi để bar với barb xuống dưới"] # 0xeb22 (en: 'leftwards harpoon to bar with barb downwards') - - "â„–": [t: "harpoon bĂȘn trĂĄi để bar với barb xuống dưới"] # 0x2956 (en: 'leftwards harpoon to bar with barb downwards') - - "": [t: "quyền harpoon đáșżn bar với barb xuống dưới"] # 0xeb23 (en: 'rightwards harpoon to bar with barb downwards') - - "â„—": [t: "quyền harpoon đáșżn bar với barb xuống dưới"] # 0x2957 (en: 'rightwards harpoon to bar with barb downwards') - - "": [t: "harpoon trĂĄi từ quĂĄn bar với barb trở lĂȘn"] # 0xeb24 (en: 'leftwards harpoon from bar with barb upwards') - - "ℚ": [t: "harpoon trĂĄi từ quĂĄn bar với barb trở lĂȘn"] # 0x295a (en: 'leftwards harpoon from bar with barb upwards') - - "": [t: "harpoon ngay từ quĂĄn bar với barb trở lĂȘn"] # 0xeb25 (en: 'rightwards harpoon from bar with barb upwards') - - "â„›": [t: "harpoon ngay từ quĂĄn bar với barb trở lĂȘn"] # 0x295b (en: 'rightwards harpoon from bar with barb upwards') - - "": [t: "harpoon bĂȘn trĂĄi từ quĂĄn bar với barb trở xuống"] # 0xeb26 (en: 'leftwards harpoon from bar with barb downwards') - - "℞": [t: "harpoon bĂȘn trĂĄi từ quĂĄn bar với barb trở xuống"] # 0x295e (en: 'leftwards harpoon from bar with barb downwards') - - "": [t: "harpoon bĂȘn pháșŁi từ quĂĄn bar với barb trở xuống"] # 0xeb27 (en: 'rightwards harpoon from bar with barb downwards') - - "℟": [t: "harpoon bĂȘn pháșŁi từ quĂĄn bar với barb trở xuống"] # 0x295f (en: 'rightwards harpoon from bar with barb downwards') - - "": [t: "hướng lĂȘn trĂȘn harpoon để bar với barb trĂĄi"] # 0xeb28 (en: 'upwards harpoon to bar with barb leftwards') - - "℘": [t: "hướng lĂȘn trĂȘn harpoon để bar với barb trĂĄi"] # 0x2958 (en: 'upwards harpoon to bar with barb leftwards') - - "": [t: "downwards harpoon đáșżn bar với barb leftwards"] # 0xeb29 (en: 'downwards harpoon to bar with barb leftwards') - - "â„™": [t: "downwards harpoon đáșżn bar với barb leftwards"] # 0x2959 (en: 'downwards harpoon to bar with barb leftwards') - - "îŹȘ": [t: "hướng lĂȘn trĂȘn harpoon để bar với barb pháșŁi"] # 0xeb2a (en: 'upwards harpoon to bar with barb rightwards') - - "â„”": [t: "hướng lĂȘn trĂȘn harpoon để bar với barb pháșŁi"] # 0x2954 (en: 'upwards harpoon to bar with barb rightwards') - - "": [t: "xuống harpoon để bar với barb ngay"] # 0xeb2b (en: 'downwards harpoon to bar with barb rightwards') - - "â„•": [t: "xuống harpoon để bar với barb ngay"] # 0x2955 (en: 'downwards harpoon to bar with barb rightwards') - - "": [t: "harpoon đi lĂȘn từ quĂĄn bar với barb trĂĄi"] # 0xeb2c (en: 'upwards harpoon from bar with barb leftwards') - - "â„ ": [t: "harpoon đi lĂȘn từ quĂĄn bar với barb trĂĄi"] # 0x2960 (en: 'upwards harpoon from bar with barb leftwards') - - "": [t: "downwards harpoon từ quĂĄn bar với barb trĂĄi"] # 0xeb2d (en: 'downwards harpoon from bar with barb leftwards') - - "℥": [t: "downwards harpoon từ quĂĄn bar với barb trĂĄi"] # 0x2961 (en: 'downwards harpoon from bar with barb leftwards') - - "": [t: "harpoon đi lĂȘn từ quĂĄn bar với barb pháșŁi"] # 0xeb2e (en: 'upwards harpoon from bar with barb rightwards') - - "ℜ": [t: "harpoon đi lĂȘn từ quĂĄn bar với barb pháșŁi"] # 0x295c (en: 'upwards harpoon from bar with barb rightwards') - - "": [t: "downwards harpoon từ bar với barb pháșŁi"] # 0xeb2f (en: 'downwards harpoon from bar with barb rightwards') - - "ℝ": [t: "downwards harpoon từ bar với barb pháșŁi"] # 0x295d (en: 'downwards harpoon from bar with barb rightwards') - - "": [t: "mĆ©i tĂȘn hướng lĂȘn đáșżn thanh"] # 0xeb30 (en: 'upwards arrow to bar') - - "‒": [t: "mĆ©i tĂȘn hướng lĂȘn đáșżn thanh"] # 0x2912 (en: 'upwards arrow to bar') - - "": [t: "mĆ©i tĂȘn xuống thanh"] # 0xeb31 (en: 'downwards arrow to bar') - - "–": [t: "mĆ©i tĂȘn xuống thanh"] # 0x2913 (en: 'downwards arrow to bar') - - "îŹČ": [t: "harpoon hướng lĂȘn bĂȘn trĂĄi cá»§a harpoon xuống"] # 0xeb32 (en: 'upwards harpoon to the left of downwards harpoon') - - "℟": [t: "harpoon hướng lĂȘn bĂȘn trĂĄi cá»§a harpoon xuống"] # 0x296e (en: 'upwards harpoon to the left of downwards harpoon') - - "": [t: "harpoon hướng lĂȘn bĂȘn pháșŁi cá»§a harpoon xuống"] # 0xeb33 (en: 'upwards harpoon to the right of downwards harpoon') - - "ℯ": [t: "harpoon hướng lĂȘn bĂȘn pháșŁi cá»§a harpoon xuống"] # 0x296f (en: 'upwards harpoon to the right of downwards harpoon') - - "": [t: "đáș§u mĆ©i tĂȘn hướng lĂȘn"] # 0xeb34 (en: 'upwards arrowhead') - - "": [t: "đáș§u mĆ©i tĂȘn xuống"] # 0xeb35 (en: 'downwards arrowhead') - - "": [t: "double harpoon với barb bĂȘn trĂĄi xuống bĂȘn pháșŁi barb lĂȘn"] # 0xeb36 (en: 'double harpoon with leftwards barb down rightwards barb up') - - "": [t: "double harpoon với barb bĂȘn trĂĄi lĂȘn bĂȘn pháșŁi barb xuống"] # 0xeb37 (en: 'double harpoon with leftwards barb up rightwards barb down') - - "": [t: "mĆ©i tĂȘn trĂĄi trĂȘn thanh"] # 0xeb38 (en: 'leftwards arrow over bar') - - "îŹč": [t: "mĆ©i tĂȘn bĂȘn pháșŁi trĂȘn thanh"] # 0xeb39 (en: 'rightwards arrow over bar') - - "îŹș": [t: "mĆ©i tĂȘn trĂĄi dưới thanh"] # 0xeb3a (en: 'leftwards arrow under bar') - - "": [t: "mĆ©i tĂȘn bĂȘn pháșŁi dưới thanh"] # 0xeb3b (en: 'rightwards arrow under bar') - - "îŹŒ": [t: "mĆ©i tĂȘn ba bĂȘn trĂĄi"] # 0xeb3c (en: 'left right triple arrow') - - "": [t: "mĆ©i tĂȘn kĂ©p đîng nam đîng nam"] # 0xeb3f (en: 'double arrow northeast southeast') - - "": [t: "mĆ©i tĂȘn bĂĄn nguyệt trĂĄi ngÆ°á»Łc chiều kim đồng hồ"] # 0xeb40 (en: 'anticlockwise left semicircle arrow') - - "â€č": [t: "mĆ©i tĂȘn bĂĄn nguyệt trĂĄi ngÆ°á»Łc chiều kim đồng hồ"] # 0x2939 (en: 'anticlockwise left semicircle arrow') - - "": [t: "mĆ©i tĂȘn bĂĄn nguyệt trĂĄi theo chiều kim đồng hồ"] # 0xeb41 (en: 'clockwise left semicircle arrow') - - "": [t: "bĂȘn trĂĄi vĂČng trĂČn bĂȘn trĂĄi mĆ©i tĂȘn pháșŁi"] # 0xeb42 (en: 'left open circle left right arrow') - - "": [t: "mĆ©i tĂȘn bĂȘn pháșŁi trĂȘn tilde"] # 0xeb44 (en: 'rightwards arrow over tilde') - - "ℎ": [t: "mĆ©i tĂȘn bĂȘn pháșŁi trĂȘn tilde"] # 0x2974 (en: 'rightwards arrow over tilde') - - "": [t: "mĆ©i tĂȘn trĂĄi trĂȘn tilde"] # 0xeb45 (en: 'leftwards arrow over tilde') - - "ℳ": [t: "mĆ©i tĂȘn trĂĄi trĂȘn tilde"] # 0x2973 (en: 'leftwards arrow over tilde') - - "": [t: "harpoon trĂĄi qua thanh"] # 0xeb48 (en: 'leftwards harpoon over bar') - - "â„Ș": [t: "harpoon trĂĄi qua thanh"] # 0x296a (en: 'leftwards harpoon over bar') - - "": [t: "quyền harpoon trĂȘn quĂĄn bar"] # 0xeb49 (en: 'rightwards harpoon over bar') - - "ℏ": [t: "quyền harpoon trĂȘn quĂĄn bar"] # 0x296c (en: 'rightwards harpoon over bar') - - "": [t: "harpoon bĂȘn trĂĄi dưới quĂĄn bar"] # 0xeb4a (en: 'leftwards harpoon under bar') - - "â„«": [t: "harpoon bĂȘn trĂĄi dưới quĂĄn bar"] # 0x296b (en: 'leftwards harpoon under bar') - - "": [t: "quyền harpoon dưới quĂĄn bar"] # 0xeb4b (en: 'rightwards harpoon under bar') - - "â„­": [t: "quyền harpoon dưới quĂĄn bar"] # 0x296d (en: 'rightwards harpoon under bar') - - "": [t: "squat mĆ©i tĂȘn trĂĄi mĂ u đen"] # 0xeb4c (en: 'squat black leftwards arrow') - - "": [t: "mĆ©i tĂȘn bĂĄn nguyệt pháșŁi theo chiều kim đồng hồ"] # 0xeb50 (en: 'clockwise right semicircle arrow') - - "„": [t: "mĆ©i tĂȘn bĂĄn nguyệt pháșŁi theo chiều kim đồng hồ"] # 0x2938 (en: 'clockwise right semicircle arrow') - - "": [t: "mĆ©i tĂȘn bĂĄn nguyệt pháșŁi ngÆ°á»Łc chiều kim đồng hồ"] # 0xeb51 (en: 'anticlockwise right semicircle arrow') - - "": [t: "vĂČng trĂČn bĂȘn trĂĄi bĂȘn trĂĄi harpoon"] # 0xeb52 (en: 'left open circle left right harpoon') - - "": [t: "mĆ©i tĂȘn hướng lĂȘn bĂȘn trĂĄi cá»§a thanh dọc"] # 0xeb58 (en: 'upwards arrow leftwards of vertical bar') - - "": [t: "mĆ©i tĂȘn xuống bĂȘn trĂĄi cá»§a thanh dọc"] # 0xeb59 (en: 'downwards arrow leftwards of vertical bar') - - "": [t: "mĆ©i tĂȘn hướng lĂȘn bĂȘn pháșŁi cá»§a thanh dọc"] # 0xeb5a (en: 'upwards arrow rightwards of vertical bar') - - "": [t: "mĆ©i tĂȘn xuống bĂȘn pháșŁi cá»§a thanh dọc"] # 0xeb5b (en: 'downwards arrow rightwards of vertical bar') - - "": [t: "mĆ©i tĂȘn bĂȘn pháșŁi với mĂłc mở rộng xuống"] # 0xeb5c (en: 'rightwards arrow with extended downwards hook') - - "": [t: "mĆ©i tĂȘn trĂĄi với mĂłc mở rộng"] # 0xeb5d (en: 'leftwards arrow with extended hook') - - "": [t: "mĆ©i tĂȘn trĂĄi với mĂłc mở rộng xuống"] # 0xeb5e (en: 'leftwards arrow with extended downwards hook') - - "": [t: "mĆ©i tĂȘn bĂȘn pháșŁi với mĂłc mở rộng"] # 0xeb5f (en: 'rightwards arrow with extended hook') - - "î­ ": [t: "khĂŽng đĂșng mĆ©i tĂȘn lÆ°á»Łn sĂłng"] # 0xeb60 (en: 'not right arrow wavy') - - "î­Ą": [t: "khĂŽng đĂșng mĆ©i tĂȘn cong"] # 0xeb61 (en: 'not right arrow curved') - - "î­š": [t: "hướng lĂȘn trĂȘn harpoon bĂȘn trĂĄi cá»§a thanh dọc"] # 0xeb68 (en: 'upwards harpoon leftwards of vertical bar') - - "î­©": [t: "xuống harpoon trĂĄi cá»§a thanh dọc"] # 0xeb69 (en: 'downwards harpoon leftwards of vertical bar') - - "î­Ș": [t: "hướng lĂȘn trĂȘn harpoon ngay cá»§a thanh dọc"] # 0xeb6a (en: 'upwards harpoon rightwards of vertical bar') - - "î­«": [t: "xuống harpoon ngay bĂȘn pháșŁi cá»§a thanh dọc"] # 0xeb6b (en: 'downwards harpoon rightwards of vertical bar') - - "î­Ź": [t: "bộ mở rộng mĆ©i tĂȘn đîi dọc"] # 0xeb6c (en: 'vertical double arrow extender') - - "î­­": [t: "harpoon tháșłng đứng với barb left extender"] # 0xeb6d (en: 'vertical harpoon with barb left extender') - - "î­ź": [t: "harpoon tháșłng đứng với barb bĂȘn pháșŁi extender"] # 0xeb6e (en: 'vertical harpoon with barb right extender') - - "î­Ż": [t: "harpoon bĂȘn pháșŁi bĂȘn trĂĄi harpoon pháșŁi"] # 0xeb6f (en: 'right harpoon over left harpoon right') - - "î­°": [t: "harpoon bĂȘn trĂĄi bĂȘn trĂĄi harpoon trĂĄi"] # 0xeb70 (en: 'right harpoon over left harpoon left') - - "î­±": [t: "bĂȘn trĂĄi harpoon trĂȘn bĂȘn pháșŁi harpoon pháșŁi"] # 0xeb71 (en: 'left harpoon over right harpoon right') - - "î­Č": [t: "bĂȘn trĂĄi harpoon qua harpoon pháșŁi trĂĄi"] # 0xeb72 (en: 'left harpoon over right harpoon left') - - "î­ł": [t: "mĆ©i tĂȘn trĂĄi từ đáș§u mĆ©i tĂȘn"] # 0xeb73 (en: 'leftwards arrow from bar arrowhead') - - "î­Ž": [t: "mĆ©i tĂȘn trĂĄi từ bĂȘn pháșŁi từ thanh mở rộng"] # 0xeb74 (en: 'leftwards rightwards arrow from bar extender') - - "î­”": [t: "mĆ©i tĂȘn trĂĄi từ đuĂŽi thanh"] # 0xeb75 (en: 'leftwards arrow from bar tail') - - "î­¶": [t: "mĆ©i tĂȘn bĂȘn pháșŁi từ đuĂŽi thanh"] # 0xeb76 (en: 'rightwards arrow from bar tail') - - "î­·": [t: "mĆ©i tĂȘn bĂȘn pháșŁi từ đáș§u arrowhead"] # 0xeb77 (en: 'rightwards arrow from bar arrowhead') - - "î­ž": [t: "harpoon đi lĂȘn từ quĂĄn bar với đáș§u mĆ©i tĂȘn trĂĄi"] # 0xeb78 (en: 'upwards harpoon from bar with barb leftwards arrowhead') - - "î­č": [t: "mĆ©i tĂȘn pháșŁi qua mĆ©i tĂȘn trĂĄi bĂȘn pháșŁi"] # 0xeb79 (en: 'rightwards arrow over leftwards arrow right') - - "î­ș": [t: "mĆ©i tĂȘn pháșŁi qua mĆ©i tĂȘn trĂĄi bĂȘn trĂĄi"] # 0xeb7a (en: 'rightwards arrow over leftwards arrow left') - - "î­»": [t: "mĆ©i tĂȘn trĂĄi qua mĆ©i tĂȘn pháșŁi bĂȘn pháșŁi"] # 0xeb7b (en: 'leftwards arrow over rightwards arrow right') - - "î­Œ": [t: "mĆ©i tĂȘn trĂĄi qua mĆ©i tĂȘn bĂȘn pháșŁi"] # 0xeb7c (en: 'leftwards arrow over rightwards arrow leftt') - - "î­œ": [t: "mĆ©i tĂȘn hướng lĂȘn từ đáș§u mĆ©i tĂȘn"] # 0xeb7d (en: 'upwards arrow from bar arrowhead') - - "î­Ÿ": [t: "mĆ©i tĂȘn hướng lĂȘn từ đuĂŽi thanh"] # 0xeb7e (en: 'upwards arrow from bar tail') - - "î­ż": [t: "mĆ©i tĂȘn xuống từ đuĂŽi thanh"] # 0xeb7f (en: 'downwards arrow from bar tail') - - "": [t: "mĆ©i tĂȘn xuống từ đáș§u mĆ©i tĂȘn"] # 0xeb80 (en: 'downwards arrow from bar arrowhead') - - "": [t: "downwards harpoon từ quĂĄn bar với đáș§u mĆ©i tĂȘn bĂȘn pháșŁi"] # 0xeb81 (en: 'downwards harpoon from bar with barb rightwards arrowhead') - - "": [t: "harpoon hướng lĂȘn bĂȘn trĂĄi cá»§a đáy harpoon"] # 0xeb82 (en: 'upwards harpoon to the left of downwards harpoon bottom') - - "": [t: "harpoon hướng lĂȘn bĂȘn trĂĄi cá»§a downwards harpoon extender"] # 0xeb83 (en: 'upwards harpoon to the left of downwards harpoon extender') - - "": [t: "downwards harpoon ở bĂȘn trĂĄi cá»§a harpoon top"] # 0xeb84 (en: 'downwards harpoon to the left of upwards harpoon top') - - "": [t: "lĂȘn trĂȘn harppoon ở bĂȘn trĂĄi cá»§a harpoon xuống trĂȘn"] # 0xeb85 (en: 'upwards harppoon to the left of downwards harpoon top') - - "": [t: "xuống harpoon bĂȘn trĂĄi cá»§a bộ mở rộng harpoon lĂȘn trĂȘn"] # 0xeb86 (en: 'downwards harpoon to the left of the upwards harpoon extender') - - "": [t: "downwards harpoon ở bĂȘn trĂĄi cá»§a đáy harpoon hướng lĂȘn"] # 0xeb87 (en: 'downwards harpoon to the left of the upwards harpoon bottom') - - "": [t: "mĆ©i tĂȘn hướng lĂȘn bĂȘn trĂĄi cá»§a phĂ­a dưới mĆ©i tĂȘn xuống"] # 0xeb88 (en: 'upwards arrow leftwards of downwards arrow bottom') - - "": [t: "mĆ©i tĂȘn xuống bĂȘn trĂĄi cá»§a đáș§u mĆ©i tĂȘn lĂȘn trĂȘn"] # 0xeb89 (en: 'downwards arrow leftwards of upwards arrow top') - - "": [t: "mĆ©i tĂȘn hướng lĂȘn bĂȘn trĂĄi cá»§a đáș§u mĆ©i tĂȘn xuống"] # 0xeb8a (en: 'upwards arrow leftwards of downwards arrow top') - - "": [t: "mĆ©i tĂȘn xuống bĂȘn trĂĄi cá»§a phĂ­a dưới mĆ©i tĂȘn hướng lĂȘn"] # 0xeb8b (en: 'downwards arrow leftwards of upwards arrow bottom') - - "": [t: "bĂȘn trĂĄi mĆ©i tĂȘn pháșŁi mở rộng"] # 0xeb8c (en: 'leftwards rightwards arrows extender') - - "": [t: "east east arrow extender"] # 0xeb8d (en: 'north east arrow extender') - - "": [t: "nội thu mĆ©i tĂȘn tĂąy báșŻc"] # 0xeb8e (en: 'north west arrow extender') - - "": [t: "xuống niềng răng trĂĄi"] # 0xec00 (en: 'down pointing brace left') - - "": [t: "xuống chỉ náșčp giữa"] # 0xec01 (en: 'down pointing brace mid') - - "": [t: "xuống chỉ náșčp đĂșng"] # 0xec02 (en: 'down pointing brace right') - - "": [t: "mĂĄy mở rộng náșčp ngang"] # 0xec03 (en: 'horizontal brace extender') - - "": [t: "lĂȘn niềng răng trĂĄi"] # 0xec04 (en: 'up pointing brace left') - - "": [t: "lĂȘn niềng răng giữa"] # 0xec05 (en: 'up pointing brace mid') - - "": [t: "náșčp lĂȘn chỉ đĂșng"] # 0xec06 (en: 'up-pointing brace right') - - "": [t: "thanh tháșłng đứng trĂĄi"] # 0xec07 (en: 'left vertical bar') - - "": [t: "thanh dọc bĂȘn pháșŁi"] # 0xec08 (en: 'right vertical bar') - - "": [t: "thanh dọc trĂĄi"] # 0xec09 (en: 'left double vertical bar') - - "": [t: "thanh dọc bĂȘn pháșŁi"] # 0xec0a (en: 'right double vertical bar') - - "": [t: "bộ mở rộng khung ngang"] # 0xec0b (en: 'horizontal bracket extender') - - "": [t: "dưới khung vuĂŽng"] # 0xec0c (en: 'under square bracket') - - "⎔": [t: "dưới khung vuĂŽng"] # 0x23b5 (en: 'under square bracket') - - "": [t: "trĂȘn khung vuĂŽng"] # 0xec0d (en: 'over square bracket') - - "⎮": [t: "trĂȘn khung vuĂŽng"] # 0x23b4 (en: 'over square bracket') - - "": [t: "dưới khung trĂĄi"] # 0xec0e (en: 'under bracket left') - - "": [t: "dưới khung đĂșng"] # 0xec0f (en: 'under bracket right') - - "": [t: "qua giĂĄ đụ trĂĄi"] # 0xec10 (en: 'over bracket left') - - "": [t: "trĂȘn khung đĂșng"] # 0xec11 (en: 'over bracket right') - - "": [t: "dáș„u ngoáș·c trĂĄi 1"] # 0xec12 (en: 'left parens 1') - - "": [t: "dáș„u ngoáș·c trĂĄi 2"] # 0xec13 (en: 'left parens 2') - - "": [t: "dáș„u ngoáș·c Ä‘ÆĄn 3"] # 0xec14 (en: 'left parens 3') - - "": [t: "dáș„u ngoáș·c trĂĄi 4"] # 0xec15 (en: 'left parens 4') - - "": [t: "dáș„u ngoáș·c Ä‘ÆĄn pháșŁi 1"] # 0xec16 (en: 'right parens 1') - - "": [t: "dáș„u ngoáș·c Ä‘ÆĄn pháșŁi 2"] # 0xec17 (en: 'right parens 2') - - "": [t: "dáș„u ngoáș·c Ä‘ÆĄn 3"] # 0xec18 (en: 'right parens 3') - - "": [t: "dáș„u ngoáș·c Ä‘ÆĄn pháșŁi 4"] # 0xec19 (en: 'right parens 4') - - "": [t: "triệt để 1"] # 0xec1a (en: 'radical 1') - - "": [t: "triệt để 2"] # 0xec1b (en: 'radical 2') - - "": [t: "triệt để 3"] # 0xec1c (en: 'radical 3') - - "": [t: "triệt để 4"] # 0xec1d (en: 'radical 4') - - "": [t: "triệt để 5"] # 0xec1e (en: 'radical 5') - - "": [t: "đáy triệt để"] # 0xec1f (en: 'radical bottom') - - "î° ": [t: "bộ mở rộng tháșłng đứng triệt để"] # 0xec20 (en: 'radical vertical extender') - - "î°Ą": [t: "top cáș„p tiáșżn"] # 0xec21 (en: 'radical top') - - "î°ą": [t: "máș·t trĂĄi giĂĄ đụ đáș§u tráșŻng"] # 0xec22 (en: 'left white bracket top') - - "î°Ł": [t: "dĂąy mở rộng khung mĂ u tráșŻng"] # 0xec23 (en: 'left white bracket extender') - - "î°€": [t: "máș·t trĂĄi phĂ­a dưới khung mĂ u tráșŻng"] # 0xec24 (en: 'left white bracket bottom') - - "î°„": [t: "bĂȘn pháșŁi khung mĂ u tráșŻng"] # 0xec25 (en: 'right white bracket top') - - "î°Š": [t: "bĂȘn pháșŁi bộ mở rộng khung tráșŻng"] # 0xec26 (en: 'right white bracket extender') - - "î°§": [t: "đáy khung tráșŻng bĂȘn pháșŁi"] # 0xec27 (en: 'right white bracket bottom') - - "î°°": [t: "khung mĂ u tráșŻng trĂĄi"] # 0xec30 (en: 'left white curly bracket') - - "î°±": [t: "quyền tráșŻng tráșŻng tráșŻng"] # 0xec31 (en: 'right white curly bracket') - - "î°Č": [t: "dáș„u hiệu phĂąn chia dĂ i"] # 0xec32 (en: 'long division sign') - - "î°ł": [t: "bộ mở rộng dáș„u hiệu phĂąn chia dĂ i"] # 0xec33 (en: 'long division sign extender') - - "î°Ž": [t: "phĂąn chia ngáșŻn"] # 0xec34 (en: 'short division') - - "": [t: "double tĂąy nam đáșżn đîng báșŻc em bond"] # 0xec40 (en: 'double southwest to northeast em bond') - - "": [t: "double tĂąy báșŻc đáșżn đîng nam bond bond"] # 0xec41 (en: 'double northwest to southeast em bond') - - "": [t: "liĂȘn káșżt em ngang Ä‘ÆĄn"] # 0xec42 (en: 'single horizontal em bond') - - "": [t: "double ngang liĂȘn káșżt em"] # 0xec43 (en: 'double horizontal em bond') - - "": [t: "triple ngang liĂȘn káșżt em"] # 0xec44 (en: 'triple horizontal em bond') - - "": [t: "liĂȘn káșżt em tháșłng đứng"] # 0xec45 (en: 'single vertical em bond') - - "": [t: "double dọc liĂȘn káșżt em"] # 0xec46 (en: 'double vertical em bond') - - "": [t: "triple tháșłng đứng liĂȘn káșżt em"] # 0xec47 (en: 'triple vertical em bond') - - "": [t: "Ă­t hÆĄn trĂĄi phiáșżu em"] # 0xec48 (en: 'less than em bond') - - "": [t: "lớn hÆĄn liĂȘn káșżt em"] # 0xec49 (en: 'greater than em bond') - - "": [t: "liĂȘn káșżt en ngang Ä‘ÆĄn"] # 0xec4a (en: 'single horizontal en bond') - - "": [t: "double ngang liĂȘn káșżt en"] # 0xec4b (en: 'double horizontal en bond') - - "": [t: "triple hormanontal en liĂȘn káșżt"] # 0xec4c (en: 'triple horizontal en bond') - - "îȀ": [t: "trĂȘn cĂčng bĂȘn trĂĄi hĂŹnh chữ nháș­t"] # 0xec80 (en: 'top left rectangle') - - "îȁ": [t: "hĂŹnh chữ nháș­t phĂ­a dưới bĂȘn trĂĄi"] # 0xec81 (en: 'bottom left rectangle') - - "îȐ": [t: "trĂȘn cĂčng bĂȘn pháșŁi hĂŹnh chữ nháș­t"] # 0xec90 (en: 'top right rectangle') - - "îȑ": [t: "dưới cĂčng bĂȘn pháșŁi hĂŹnh chữ nháș­t"] # 0xec91 (en: 'bottom right rectangle') - - "îȒ": [t: "phĂąn chia tổng hợp gĂłc"] # 0xec92 (en: 'synthetic division corner') - - "îȓ": [t: "phĂąn chia tổng hợp mở rộng ngang"] # 0xec93 (en: 'synthetic division horizontal extender') - - "îȔ": [t: "phĂąn chia tổng hợp mở rộng dọc"] # 0xec94 (en: 'synthetic division vertical extender') - - "îȕ": [t: "bĂȘn trĂĄi sĂ n mở rộng"] # 0xec95 (en: 'left ceiling floor extender') - - "îȖ": [t: "bĂȘn pháșŁi sĂ n mở rộng"] # 0xec96 (en: 'right ceiling floor extender') - - "îȗ": [t: "qua bộ mở rộng khung"] # 0xec97 (en: 'over bracket extender') - - "îȘ": [t: "mĂĄy mở rộng thanh dọc"] # 0xec98 (en: 'vertical bar extender') - - "îș": [t: "bĂȘn trĂĄi đîi mở rộng thanh dọc"] # 0xec99 (en: 'left double vertical bar extender') - - "îȚ": [t: "mĂĄy mở rộng thanh ngang"] # 0xec9a (en: 'horizontal bar extender') - - "îȜ": [t: "dưới pháș§n mở rộng khung"] # 0xec9c (en: 'under bracket extender') - - "îȝ": [t: "xuống dáș„u ngoáș·c Ä‘ÆĄn đĂșng"] # 0xec9d (en: 'down pointing paren right') - - "îȞ": [t: "xuống chỉ dáș„u ngoáș·c Ä‘ÆĄn"] # 0xec9e (en: 'down pointing paren extender') - - "îȟ": [t: "down chỉ dáș„u ngoáș·c Ä‘ÆĄn trĂĄi"] # 0xec9f (en: 'down pointing paren left') - - "îČ ": [t: "lĂȘn chỉ dĂąy mở rộng náșčp"] # 0xeca0 (en: 'up pointing brace extender') - - "îČĄ": [t: "lĂȘn dáș„u ngoáș·c Ä‘ÆĄn cĂČn láșĄi"] # 0xeca1 (en: 'up pointing paren left') - - "îČą": [t: "lĂȘn dáș„u ngoáș·c Ä‘ÆĄn"] # 0xeca2 (en: 'up pointing paren extender') - - "îČŁ": [t: "lĂȘn dáș„u ngoáș·c Ä‘ÆĄn đĂșng"] # 0xeca3 (en: 'up pointing paren right') - - "îČ€": [t: "xuống chỉ dĂąy mở rộng náșčp"] # 0xeca4 (en: 'down pointing brace extender') - - "": [t: "planck háș±ng số trĂȘn hai thanh pi"] # 0xed00 (en: 'planck constant over two pi bar') - - "": [t: "gÆ°ÆĄng g"] # 0xed01 (en: 'mirror g') - - "": [t: "dotless j"] # 0xed02 - - "": [t: "digamma"] # 0xed03 - - "ϝ": [t: "digamma"] # 0x3dd - - "": [t: ""] # 0xed10 (en: 'd') - - "": [t: ""] # 0xed11 (en: 'e') - - "": [t: ""] # 0xed12 (en: 'i') - - "": [t: ""] # 0xed13 (en: 'j') - - "ⅅ": - - spell: "translate('.', 'ⅅ', 'DD')" # 0xed16, 0x2145 - -# The private use chars are from MathType - - "": [t: "vĂČng láș·p tĂ­ch hợp đường viền ngÆ°á»Łc chiều kim đồng hồ"] # 0xee00 (en: 'anticlockwise contour integral loop') - - "": [t: "vĂČng láș·p tĂ­ch phĂąn theo chiều kim đồng hồ"] # 0xee01 (en: 'clockwise contour integral loop') - - "": [t: ""] # 0xee04 - - "": [t: ""] # 0xee05 - - "": [t: ""] # 0xee06 - - "": [t: ""] # 0xee07 - - "": [t: ""] # 0xee08 - - "": [t: ""] # 0xee09 - - "": [t: ""] # 0xee0a - - "": [t: ""] # 0xee0b - - "": [t: ""] # 0xee0c - - "": [t: "tinh chỉnh tráșĄng thĂĄi chung"] # 0xee0d (en: 'joint status embellishment') - - "": [t: "tinh chỉnh tráșĄng thĂĄi chung trĂĄi"] # 0xee0e (en: 'joint status embellishment left') - - "": [t: "tinh chỉnh tráșĄng thĂĄi chung quyền"] # 0xee0f (en: 'joint status embellishment right') - - "": [t: "tráșĄng thĂĄi chung extender"] # 0xee10 (en: 'joint status embellishment extender') - - "": [t: "vĂČng láș·p tĂ­ch hợp"] # 0xee11 (en: 'integral loop') - - "": [t: "vĂČng láș·p tĂ­ch phĂąn đîi"] # 0xee12 (en: 'integral loop double') - - "": [t: "tĂ­ch hợp vĂČng ba"] # 0xee13 (en: 'integral loop triple') - - "": [t: "mở rộng đîi vĂČng láș·p tĂ­ch phĂąn"] # 0xee15 (en: 'expanding integral loop double') - - "": [t: "mở rộng ba vĂČng láș·p tĂ­ch phĂąn"] # 0xee16 (en: 'expanding integral loop triple') - - "": [t: "khĂŽng cĂł triệu chứng báș±ng giọng"] # 0xee17 (en: 'asymptotically equal to accent') - - "": [t: "dáș„u hiệu báș±ng giọng"] # 0xee18 (en: 'equal sign accent') - - "": [T: "đáșĄo hĂ m cáș„p bốn"] # 0xee19 - - "⁗": [T: "đáșĄo hĂ m cáș„p bốn"] # 0x2057 - - "": [t: "tăng điểm số với vĂČng trĂČn mở bĂȘn trĂĄi"] # 0xee1a (en: 'bar accent with open circle left') - - "": [t: "điểm nháș„n thanh với vĂČng trĂČn kĂ­n trĂĄi"] # 0xee1b (en: 'bar accent with closed circle left') - - "": [t: "tăng điểm số với vĂČng trĂČn mở pháșŁi"] # 0xee1c (en: 'bar accent with open circle right') - - "": [t: "tăng điểm số với dot"] # 0xee1d (en: 'bar accent with over dot') - - "": [t: "tăng điểm số với dưới cháș„m"] # 0xee1e (en: 'bar accent with under dot') - - "": [t: "tăng điểm số với gáș„p đîi so với cháș„m"] # 0xee1f (en: 'bar accent with double over dot') - - "îž ": [t: "tăng điểm số với gáș„p đîi dưới dáș„u cháș„m"] # 0xee20 (en: 'bar accent with double under dot') - - "": [t: "giọng nĂłi với caret"] # 0xee21 (en: 'bar accent with caret') - - "îžą": [t: "dĂ y dưới điểm nháș„n thanh"] # 0xee22 (en: 'thick under bar accent') - - "": [t: "tăng điểm số với vĂČng trĂČn kĂ­n pháșŁi"] # 0xee23 (en: 'bar accent with closed circle right') - - "": [t: "cháș„m lớn ở trĂȘn"] # 0xee24 (en: 'large dot above') - - "": [t: "đánh dáș„u căn chỉnh"] # 0xef00 (en: 'alignment mark') - - "": [t: ""] # 0xef01 - - "​": [t: ""] # 0x200b - - "": [t: ""] # 0xef02 - - " ": [t: ""] # 0x2009 - - "": [t: ""] # 0xef03 - - " ": [t: ""] # 0x205f - - "": [t: ""] # 0xef04 - - "": [t: ""] # 0xef05 - - " ": [t: ""] # 0x2003 - - "": [t: ""] # 0xef06 - - "": [t: ""] # 0xef07 - - "": [t: ""] # 0xef08 - - "": [t: ""] # 0xef09 - - "": [t: ""] # 0xef0a - - " ": [t: ""] # 0x200a - - "îŒą": [t: ""] # 0xef22 - - "îŒŁ": [t: ""] # 0xef23 - - "": [t: ""] # 0xef24 - - "": [t: ""] # 0xef29 - - "": [t: "thiáșżu nhiệm kỳ"] # 0xef41 (en: 'missing term') - - "": [t: "mĆ©i tĂȘn tĂ­ch phĂąn đường theo chiều kim đồng hồ bĂȘn trĂĄi"] # 0xef80 (en: 'clockwise contour integral arrow on left') - - "": [t: "tĂ­ch hợp với hĂŹnh vuĂŽng"] # 0xef81 (en: 'integral with square') - - "": [t: "tĂ­ch hợp với chĂ©m"] # 0xef82 (en: 'integral with slash') - - "": [t: "đáșŁo ngÆ°á»Łc tĂ­ch phĂąn"] # 0xef83 (en: 'reversed integral') - - "": [t: "double zero trĂȘn gáș„p đîi 0"] # 0xef90 (en: 'double zero over double zero') - - "": [t: "zero với chĂ©m"] # 0xef91 (en: 'zero with slash') - - # fraktur 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) - - t: "fraktur" - - spell: "translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" - - - "-": # 0xf000 - 0xf018 - - t: "fraktur" - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" - - - "𝔞-đ”·": # 0x1d51e - 0x1d537 - - t: "fraktur" - - spell: "translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz')" - - "-ï€ł": # 0xf01a - 0xf033 - - t: "fraktur" - - spell: "translate('.', 'ï€šï€›ï€œï€ï€žï€Ÿï€ ï€Ąï€ąï€Łï€€ï€„ï€Šï€§ï€šï€©ï€Șï€«ï€Źï€­ï€źï€Żï€°ï€±ï€Čï€ł', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝕬-𝖅": # 0x1D56C - 0x1D585 - - t: "fraktur tĂĄo báșĄo" # (en: 'fraktur bold') - - spell: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf040 - 0xf059 - - t: "fraktur tĂĄo báșĄo" # (en: 'fraktur bold') - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝖆-𝖟": # 0x1d586 - 0x1d59f - - t: "fraktur tĂĄo báșĄo" # (en: 'fraktur bold') - - spell: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" - - "-ïł": # 0xf05a - 0xf073 - - t: "fraktur tĂĄo báșĄo" # (en: 'fraktur bold') - - 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) - - test: - if: "$Verbosity!='Terse'" - then: [t: "cĂș đĂșp"] # (en: 'double struck') - - spell: "translate('.', '𝔾đ”čđ”șđ”»đ”Œđ”œđ”Ÿđ”żđ•€đ•đ•‚đ•ƒđ•„đ•…đ•†đ•‡đ•ˆđ•‰đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf080 - 0xf098 - - test: - if: "$Verbosity!='Terse'" - then: [t: "cĂș đĂșp"] # (en: 'double struck') - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝕒-đ•«": # 0x1d552 - 0x1d56b - - test: - if: "$Verbosity!='Terse'" - then: [t: "cĂș đĂșp"] # (en: 'double struck') - - spell: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" - - "-ï‚ł": # 0xf09a - 0xf0b3 - - test: - if: "$Verbosity!='Terse'" - then: [t: "cĂș đĂșp"] # (en: 'double struck') - - spell: "translate('.', 'ï‚šï‚›ï‚œï‚ï‚žï‚Ÿï‚ ï‚Ąï‚ąï‚Łï‚€ï‚„ï‚Šï‚§ï‚šï‚©ï‚Șï‚«ï‚Źï‚­ï‚źï‚Żï‚°ï‚±ï‚Čï‚ł', 'abcdefghijklmnopqrstuvwxyz')" - - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 - - test: - if: "$Verbosity!='Terse'" - then: [t: "cĂș đĂșp"] # (en: 'double struck') - - spell: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" - - "-": # 0xf0c0 - 0xf0c9 - - test: - if: "$Verbosity!='Terse'" - then: [t: "cĂș đĂșp"] # (en: 'double struck') - - spell: "translate('.', '', '0123456789')" - - - "": [t: "double táș„n cĂŽng nabla"] # 0xf0ca (en: 'double struck nabla') - - "": [t: "double táș„n cĂŽng háș±ng số euler"] # 0xf0cb (en: 'double struck euler constant') - - # script chars in math alphabetic block and also MathType private use area - - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 - - t: "script" - - spell: "translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf100 - 0xf119 - - t: "script" - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf - - t: "script" - - spell: "translate('.', 'đ’¶đ’·đ’žđ’čđ’șđ’»đ’Œđ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“„đ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdefghijklmnopqrstuvwxyz')" - - "-ï„ł": # 0xf11a - 0xf133 - - t: "script" - - spell: "translate('.', 'ï„šï„›ï„œï„ï„žï„Ÿï„ ï„Ąï„ąï„Łï„€ï„„ï„Šï„§ï„šï„©ï„Șï„«ï„Źï„­ï„źï„Żï„°ï„±ï„Čï„ł', 'abcdefghijklmnopqrstuvwxyz')" - - # bold script chars in math alphabetic block and also MathType private use area - - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 - - t: "kịch báșŁn in đáș­m" # (en: 'script bold') - - spell: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf140 - 0xf159 - - t: "kịch báșŁn in đáș­m" # (en: 'script bold') - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "đ“Ș-𝔃": # 0x1d4ea - 0x1d503 - - t: "kịch báșŁn in đáș­m" # (en: 'script bold') - - spell: "translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz')" - - "-ï…ł": # 0xf15a - 0xf173 - - t: "kịch báșŁn in đáș­m" # (en: 'script bold') - - spell: "translate('.', 'ï…šï…›ï…œï…ï…žï…Ÿï… ï…Ąï…ąï…Łï…€ï…„ï…Šï…§ï…šï…©ï…Șï…«ï…Źï…­ï…źï…Żï…°ï…±ï…Čï…ł', 'abcdefghijklmnopqrstuvwxyz')" - - - "-": # 0xf180 - 0xf199 - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "": # 0xf19a - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [t: "háș­u quáșŁ"] # (en: 'cap') - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [t: "ligature ae"] - - "": # 0xf19b - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [t: "háș­u quáșŁ"] # (en: 'cap') - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [t: "sáșŻc s"] # (en: 'sharp s') - - "": # 0xf19c - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [t: "háș­u quáșŁ"] # (en: 'cap') - else: [x: "$SpeechOverrides_CapitalLetters"] - - pitch: - value: "$CapitalLetters_Pitch" - replace: [t: "o với gáșĄch"] # (en: 'o with stroke') - - # MathType only has a few of the cap Greek letters in PUA - - "": # 0xf201 - 0xf209 - - test: - if: "$Verbosity!='Terse'" - then: [t: "cĂș đĂșp"] # (en: 'double struck') - - spell: "translate('.', '', 'Î”ÎšÎ›Î ÎŁÎ˜Î“Î©Î„')" - - - "-": # 0xf220 - 0xf236 - - test: - if: "$Verbosity!='Terse'" - then: [t: "cĂș đĂșp"] # (en: 'double struck') - - spell: "translate('.', 'ïˆ ïˆĄïˆąïˆŁïˆ€ïˆ„ïˆŠïˆ§ïˆšïˆ©ïˆȘïˆ«ïˆŹïˆ­ïˆźïˆŻïˆ°ïˆ±ïˆČïˆłïˆŽïˆ”ïˆ¶', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "": [t: "double táș„n cĂŽng sigma cuối cĂčng"] # 0xf237 (en: 'double struck final sigma') - - "": [t: "double táș„n cĂŽng rho"] # 0xf250 (en: 'double struck rho') - - "": [t: "double táș„n cĂŽng phi"] # 0xf251 (en: 'double struck phi') - - "𝐀-𝐙": # 0x1d400 - 0x1d419 - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-ï‰č": # 0xf260 - 0xf279 - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', 'ï‰ ï‰Ąï‰ąï‰Łï‰€ï‰„ï‰Šï‰§ï‰šï‰©ï‰Șï‰«ï‰Źï‰­ï‰źï‰Żï‰°ï‰±ï‰Čï‰łï‰Žï‰”ï‰¶ï‰·ï‰žï‰č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝐚-𝐳": # 0x1d41a - 0x1d433 - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" - - - "ï‰ș-": # 0xf27a - 0xf293 - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', 'ï‰șï‰»ï‰Œï‰œï‰Ÿï‰żïŠ€ïŠïŠ‚ïŠƒïŠ„ïŠ…ïŠ†ïŠ‡ïŠˆïŠ‰ïŠŠïŠ‹ïŠŒïŠïŠŽïŠïŠïŠ‘ïŠ’ïŠ“', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝐮-𝑍": # 0x1d434 - 0x1d44d - - spell: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf294 - 0xf2ad - - spell: "translate('.', 'ïŠ”ïŠ•ïŠ–ïŠ—ïŠ˜ïŠ™ïŠšïŠ›ïŠœïŠïŠžïŠŸïŠ ïŠĄïŠąïŠŁïŠ€ïŠ„ïŠŠïŠ§ïŠšïŠ©ïŠȘïŠ«ïŠŹïŠ­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝑎-𝑧": # 0x1d44e - 0x1d467 - - spell: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”đ‘•đ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" - - - "ïŠź-": # 0xf2ae - 0xf2c7 - - spell: "translate('.', 'ïŠźïŠŻïŠ°ïŠ±ïŠČïŠłïŠŽïŠ”ïŠ¶ïŠ·ïŠžïŠčïŠșïŠ»ïŠŒïŠœïŠŸïŠżï‹€ï‹ï‹‚ï‹ƒï‹„ï‹…ï‹†ï‹‡', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝑹-𝒁": # 0x1d468 - 0x1d481 - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-ï‹Ą": # 0xf2c8 - 0xf2e1 - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', 'ï‹ˆï‹‰ï‹Šï‹‹ï‹Œï‹ï‹Žï‹ï‹ï‹‘ï‹’ï‹“ï‹”ï‹•ï‹–ï‹—ï‹˜ï‹™ï‹šï‹›ï‹œï‹ï‹žï‹Ÿï‹ ï‹Ą', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝒂-𝒛": # 0x1d482 - 0x1d49b - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" - - - "ï‹ą-": # 0xf2e2 - 0xf2fb - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', 'ï‹ąï‹Łï‹€ï‹„ï‹Šï‹§ï‹šï‹©ï‹Șï‹«ï‹Źï‹­ï‹źï‹Żï‹°ï‹±ï‹Čï‹łï‹Žï‹”ï‹¶ï‹·ï‹žï‹čï‹ș', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 - - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf300 - 0xf319 - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 - - spell: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" - - - "-ïŒł": # 0xf31a - 0xf333 - - spell: "translate('.', 'ïŒšïŒ›ïŒœïŒïŒžïŒŸïŒ ïŒĄïŒąïŒŁïŒ€ïŒ„ïŒŠïŒ§ïŒšïŒ©ïŒȘïŒ«ïŒŹïŒ­ïŒźïŒŻïŒ°ïŒ±ïŒČïŒł', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf334 - 0xf34d - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', 'ïŒčïŒșïŒ»ïŒŒïŒœïŒŸïŒżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒï', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝗼-𝘇": # 0x1d5ee - 0x1d607 - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" - - - "-": # 0xf34e - 0xf367 - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', 'ïŽïïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§', 'abcdefghijklmnopqrstuvwxyz')" - - "𝘈-𝘡": # 0x1d608 - 0x1d621 - # - t: "chữ in nghiĂȘng" # (en: 'italic') - - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - "-": # 0xf368 - 0xf381 - # - t: "chữ in nghiĂȘng" # (en: 'italic') - - spell: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżïŽ€ïŽ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝘱-đ˜»": # 0x1d622 - 0x1d63b - # - t: "chữ in nghiĂȘng" # (en: 'italic') - - spell: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" - - - "-": # 0xf382 - 0xf39b - # - t: "chữ in nghiĂȘng" # (en: 'italic') - - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - - - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf39c - 0xf3b5 - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', 'ïŽœïŽïŽžïŽŸïŽ ïŽĄïŽąïŽŁïŽ€ïŽ„ïŽŠïŽ§ïŽšïŽ©ïŽȘïŽ«ïŽŹïŽ­ïŽźïŽŻïŽ°ïŽ±ïŽČïŽłïŽŽïŽ”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝙖-𝙯": # 0x1d656 - 0x1d66f - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" - - - "-": # 0xf3b6 - 0xf3cf - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', 'ïŽčïŽșïŽ»ïŽŒïŽœïŽŸïŽżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒïïŽï', 'abcdefghijklmnopqrstuvwxyz')" - - - "𝙰-𝚉": # 0x1d670 - 0x1d689 - - spell: "translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "-": # 0xf3d0 - 0xf3e9 - - spell: "translate('.', 'ïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§ïšï©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - - "𝚊-𝚣": # 0x1d68a - 0x1d6a3 - - spell: "translate('.', '𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚱𝚣', 'abcdefghijklmnopqrstuvwxyz')" - - - "ïȘ-": # 0xf3ea - 0xf403 - - spell: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżï€ïï‚ïƒ', 'abcdefghijklmnopqrstuvwxyz')" - - - "": [t: "dotless i"] # 0xf404 - - "đš€": [t: "dotless i"] # 0x1d6a4 - - "đš„": [t: "dotless j"] # 0x1d6a5 - - - "𝚹-𝛀": # 0x1d6a8 - 0x1d6c0 - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "-": # 0xf408 - 0xf420 - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "𝛂-𝛚": # 0x1d6c2 - 0x1d6da - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙𝛚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "ïą-ïș": # 0xf422 - 0xf43a - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', 'ïąïŁï€ï„ïŠï§ïšï©ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïș', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "ïĄ": [t: "nabla tĂĄo báșĄo"] # 0xf421 (en: 'bold nabla') - - "𝛁": [t: "nabla tĂĄo báșĄo"] # 0x1d6c1 (en: 'bold nabla') - - - "𝛛𝛜𝛝𝛞𝛟𝛠𝛡": # 0x1D6DB - 0x1D6E1 - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', '𝛛𝛜𝛝𝛞𝛟𝛠𝛡', '∂ΔΞÎșφρπ')" - - - "ï»ïŒïœïŸïżï‘€ï‘": # 0xF43C - 0xF441 - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', 'ï»ïŒïœïŸïżï‘€ï‘', '∂ΔΞÎșφρπ')" - - - "𝛱-đ›ș": # 0x1d6e2 - 0x1d6fa - # - t: "chữ in nghiĂȘng" # (en: 'italic') - - spell: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›čđ›ș', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "-": # 0xf442 - 0xf45a - # - t: "chữ in nghiĂȘng" # (en: 'italic') - - spell: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "đ›Œ-𝜔": # 0x1d6fc - 0x1d714 - # - t: "chữ in nghiĂȘng" # (en: 'italic') - - spell: "translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“đœ”', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "-": # 0xf45c - 0xf474 - # - t: "chữ in nghiĂȘng" # (en: 'italic') - - spell: "translate('.', 'ï‘œï‘ï‘žï‘Ÿï‘ ï‘Ąï‘ąï‘Łï‘€ï‘„ï‘Šï‘§ï‘šï‘©ï‘Șï‘«ï‘Źï‘­ï‘źï‘Żï‘°ï‘±ï‘Čï‘łï‘Ž', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "": [t: "nabla in nghiĂȘng"] # 0xf45b (en: 'italic nabla') - - "đ›»": [t: "nabla in nghiĂȘng"] # 0x1d6fb (en: 'italic nabla') - - - "𝜕𝜖𝜗𝜘𝜙𝜚𝜛": # 0x1d715 - 0x1d71b - # - t: "chữ in nghiĂȘng" # (en: 'italic') - - spell: "translate('.', '𝜕𝜖𝜗𝜘𝜙𝜚𝜛', '∂ΔΞÎșφρπ')" - - - "ï‘čï‘ș": # 0xf475 - 0xf47b - # - t: "chữ in nghiĂȘng" # (en: 'italic') - - spell: "translate('.', 'ï‘čï‘ș', '∂ΔΞÎșφρπ')" - - - "𝜜-𝜮": # 0x1d71c - 0x1d734 - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳𝜮', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "-": # 0xf47c - 0xf494 - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', 'ï‘Œï‘œï‘Ÿï‘żï’€ï’ï’‚ï’ƒï’„ï’…ï’†ï’‡ï’ˆï’‰ï’Šï’‹ï’Œï’ï’Žï’ï’ï’‘ï’’ï’“ï’”', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "đœ¶-𝝎": # 0x1d736 - 0x1d74e - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđđŽ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "-ï’ź": # 0xf496 - 0xf4ae - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', 'ï’–ï’—ï’˜ï’™ï’šï’›ï’œï’ï’žï’Ÿï’ ï’Ąï’ąï’Łï’€ï’„ï’Šï’§ï’šï’©ï’Șï’«ï’Źï’­ï’ź', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "𝝏𝝐𝝑𝝒𝝓𝝔𝝕": # 0x1d74f - 0x1d755 - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', '𝝏𝝐𝝑𝝒𝝓𝝔𝝕', '∂ΔΞÎșφρπ')" - - - "ï’Żï’°ï’±ï’Čï’łï’Žï’”": # 0xf422 - 0xf43a - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', 'ï’Żï’°ï’±ï’Čï’łï’Žï’”', '∂ΔΞÎșφρπ')" - - - "đœ”": [t: "nabla italic in đáș­m"] # 0x1d735 (en: 'bold italic nabla') - - "": [t: "nabla italic in đáș­m"] # 0xf495 (en: 'bold italic nabla') - - - "𝝖-𝝼": # 0x1d756 - 0x1d76e - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đź', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - "-": # 0xf4b6 - 0xf4ce - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', 'ï’¶ï’·ï’žï’čï’șï’»ï’Œï’œï’Ÿï’żï“€ï“ï“‚ï“ƒï“„ï“…ï“†ï“‡ï“ˆï“‰ï“Šï“‹ï“Œï“ï“Ž', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "𝝰-𝞈": # 0x1d770 - 0x1d788 - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€đžđž‚đžƒđž„đž…đž†đž‡đžˆ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "-": # 0xf4d0 - 0xf4e8 - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', 'ï“ï“‘ï“’ï““ï“”ï“•ï“–ï“—ï“˜ï“™ï“šï“›ï“œï“ï“žï“Ÿï“ ï“Ąï“ąï“Łï“€ï“„ï“Šï“§ï“š', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "𝞉𝞊𝞋𝞌𝞍𝞎𝞏": # 0x1d789 - 0x1d78f - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', '𝞉𝞊𝞋𝞌𝞍𝞎𝞏', '∂ΔΞÎșφρπ')" - - - "ï“Șï“«ï“Źï“­ï“źï“Ż": # 0xf4e9 - 0xf4ef - - t: "dĆ©ng cáșŁm" # (en: 'bold') - - spell: "translate('.', 'ï“Șï“«ï“Źï“­ï“źï“Ż', '∂ΔΞÎșφρπ')" - - - "": [t: "nabla tĂĄo báșĄo"] # 0xf4cf (en: 'bold nabla') - - "𝝯": [t: "nabla tĂĄo báșĄo"] # 0x1d76f (en: 'bold nabla') - - - "𝞐-𝞹": # 0x1d790 - 0x1d7a8 - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "-": # 0xf4f0 - 0xf508 - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', 'ï“Čï“łï“Žï“”ï“¶ï“·ï“žï“čï“șï“»ï“Œï“œï“Ÿï“żï”€ï”ï”‚ï”ƒï”„ï”…ï”†ï”‡ï”ˆ', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" - - - "đžȘ-𝟂": # 0x1d7aa - 0x1d7c2 - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸđŸ‚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "-ï”ą": # 0xf50a - 0xf522 - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', 'ï”Šï”‹ï”Œï”ï”Žï”ï”ï”‘ï”’ï”“ï””ï”•ï”–ï”—ï”˜ï”™ï”šï”›ï”œï”ï”žï”Ÿï” ï”Ąï”ą', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" - - - "𝟃𝟄𝟅𝟆𝟇𝟈𝟉": # 0x1d7c3 - 0x1d7c9 - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', '𝟃𝟄𝟅𝟆𝟇𝟈𝟉', '∂ΔΞÎșφρπ')" - - - "ï”Łï”€ï”„ï”Šï”§ï”šï”©": # 0xf523 - 0xf529 - - t: "in nghiĂȘng" # (en: 'bold italic') - - spell: "translate('.', 'ï”Łï”€ï”„ï”Šï”§ï”šï”©', '∂ΔΞÎșφρπ')" - - - "": [t: "nabla tĂĄo báșĄo"] # 0xf509 (en: 'bold nabla') - - "đž©": [t: "nabla tĂĄo báșĄo"] # 0x1d7a9 (en: 'bold nabla') - - - "ï”ź": [t: "bold zero"] # 0xf52e - - "𝟎": [t: "bold zero"] # 0x1d7ce - - "ï”Ż": [t: "tĂĄo báșĄo"] # 0xf52f (en: 'bold one') - - "𝟏": [t: "tĂĄo báșĄo"] # 0x1d7cf (en: 'bold one') - - "": [t: "tĂĄo báșĄo hai"] # 0xf530 (en: 'bold two') - - "𝟐": [t: "tĂĄo báșĄo hai"] # 0x1d7d0 (en: 'bold two') - - "": [t: "bold ba"] # 0xf531 (en: 'bold three') - - "𝟑": [t: "bold ba"] # 0x1d7d1 (en: 'bold three') - - "ï”Č": [t: "bold bốn"] # 0xf532 (en: 'bold four') - - "𝟒": [t: "bold bốn"] # 0x1d7d2 (en: 'bold four') - - "ï”ł": [t: "bold năm"] # 0xf533 (en: 'bold five') - - "𝟓": [t: "bold năm"] # 0x1d7d3 (en: 'bold five') - - "": [t: "thứ sĂĄu"] # 0xf534 (en: 'bold six') - - "𝟔": [t: "thứ sĂĄu"] # 0x1d7d4 (en: 'bold six') - - "ï””": [t: "bold seven"] # 0xf535 - - "𝟕": [t: "bold seven"] # 0x1d7d5 - - "": [t: "in đáș­m táșĄi"] # 0xf536 (en: 'bold eight') - - "𝟖": [t: "in đáș­m táșĄi"] # 0x1d7d6 (en: 'bold eight') - - "": [t: "bold nine"] # 0xf537 - - "𝟗": [t: "bold nine"] # 0x1d7d7 - - "": [t: "số khĂŽng"] # 0xf542 (en: 'zero') - - "𝟱": [t: "số khĂŽng"] # 0x1d7e2 (en: 'zero') - - "": [t: "một"] # 0xf543 (en: 'one') - - "𝟣": [t: "một"] # 0x1d7e3 (en: 'one') - - "": [t: "hai"] # 0xf544 (en: 'two') - - "đŸ€": [t: "hai"] # 0x1d7e4 (en: 'two') - - "": [t: "số ba"] # 0xf545 (en: 'three') - - "đŸ„": [t: "số ba"] # 0x1d7e5 (en: 'three') - - "": [t: "bốn"] # 0xf546 (en: 'four') - - "𝟩": [t: "bốn"] # 0x1d7e6 (en: 'four') - - "": [t: "số năm"] # 0xf547 (en: 'five') - - "𝟧": [t: "số năm"] # 0x1d7e7 (en: 'five') - - "": [t: "sĂĄu"] # 0xf548 (en: 'six') - - "𝟹": [t: "sĂĄu"] # 0x1d7e8 (en: 'six') - - "": [t: "báșŁy"] # 0xf549 (en: 'seven') - - "đŸ©": [t: "báșŁy"] # 0x1d7e9 (en: 'seven') - - "": [t: "táșĄi"] # 0xf54a (en: 'eight') - - "đŸȘ": [t: "táșĄi"] # 0x1d7ea (en: 'eight') - - "": [t: "chĂ­n"] # 0xf54b (en: 'nine') - - "đŸ«": [t: "chĂ­n"] # 0x1d7eb (en: 'nine') - - "": [t: "bold zero"] # 0xf54c - - "𝟬": [t: "bold zero"] # 0x1d7ec - - "": [t: "tĂĄo báșĄo"] # 0xf54d (en: 'bold one') - - "𝟭": [t: "tĂĄo báșĄo"] # 0x1d7ed (en: 'bold one') - - "": [t: "tĂĄo báșĄo hai"] # 0xf54e (en: 'bold two') - - "𝟼": [t: "tĂĄo báșĄo hai"] # 0x1d7ee (en: 'bold two') - - "": [t: "bold ba"] # 0xf54f (en: 'bold three') - - "𝟯": [t: "bold ba"] # 0x1d7ef (en: 'bold three') - - "": [t: "bold bốn"] # 0xf550 (en: 'bold four') - - "𝟰": [t: "bold bốn"] # 0x1d7f0 (en: 'bold four') - - "": [t: "bold năm"] # 0xf551 (en: 'bold five') - - "đŸ±": [t: "bold năm"] # 0x1d7f1 (en: 'bold five') - - "": [t: "thứ sĂĄu"] # 0xf552 (en: 'bold six') - - "đŸČ": [t: "thứ sĂĄu"] # 0x1d7f2 (en: 'bold six') - - "": [t: "bold seven"] # 0xf553 - - "𝟳": [t: "bold seven"] # 0x1d7f3 - - "": [t: "in đáș­m táșĄi"] # 0xf554 (en: 'bold eight') - - "𝟮": [t: "in đáș­m táșĄi"] # 0x1d7f4 (en: 'bold eight') - - "": [t: "bold nine"] # 0xf555 - - "đŸ”": [t: "bold nine"] # 0x1d7f5 - - "": [t: "số khĂŽng"] # 0xf556 (en: 'zero') - - "đŸ¶": [t: "số khĂŽng"] # 0x1d7f6 (en: 'zero') - - "": [t: "một"] # 0xf557 (en: 'one') - - "đŸ·": [t: "một"] # 0x1d7f7 (en: 'one') - - "": [t: "hai"] # 0xf558 (en: 'two') - - "𝟾": [t: "hai"] # 0x1d7f8 (en: 'two') - - "": [t: "số ba"] # 0xf559 (en: 'three') - - "đŸč": [t: "số ba"] # 0x1d7f9 (en: 'three') - - "": [t: "bốn"] # 0xf55a (en: 'four') - - "đŸș": [t: "bốn"] # 0x1d7fa (en: 'four') - - "": [t: "số năm"] # 0xf55b (en: 'five') - - "đŸ»": [t: "số năm"] # 0x1d7fb (en: 'five') - - "": [t: "sĂĄu"] # 0xf55c (en: 'six') - - "đŸŒ": [t: "sĂĄu"] # 0x1d7fc (en: 'six') - - "": [t: "báșŁy"] # 0xf55d (en: 'seven') - - "đŸœ": [t: "báșŁy"] # 0x1d7fd (en: 'seven') - - "": [t: "táșĄi"] # 0xf55e (en: 'eight') - - "đŸŸ": [t: "táșĄi"] # 0x1d7fe (en: 'eight') - - "": [t: "chĂ­n"] # 0xf55f (en: 'nine') - - "𝟿": [t: "chĂ­n"] # 0x1d7ff (en: 'nine') - - "": [t: "nhĂąn váș­t chưa biáșżt"] # 0xf700 (en: 'unknown character') - - "": [t: "hĂŹnh tam giĂĄc dưới bĂȘn pháșŁi vĂ  dưới bĂȘn trĂĄi"] # 0xf726 (en: 'lower right and lower left triangles') - - "": [t: "bộ mở rộng hĂŹnh elip ngang"] # 0xf72d (en: 'horizontal ellipsis extender') - - "ïœź": [t: "midline ngang elipsis mở rộng"] # 0xf72e (en: 'midline horizontal ellipsis extender') - - "ïŁ„": [t: "bộ mở rộng triệt để"] # 0xf8e5 (en: 'radical extender') - - "ïŁŠ": [t: "mĂĄy mở rộng mĆ©i tĂȘn dọc"] # 0xf8e6 (en: 'vertical arrow extender') - - "ïŁ§": [t: "mĂĄy mở rộng mĆ©i tĂȘn ngang"] # 0xf8e7 (en: 'horizontal arrow extender') - - "ïŁš": [t: "đăng kĂœ kĂœ sans serif"] # 0xf8e8 (en: 'registered sign sans serif') - - "ïŁ©": [t: "dáș„u hiệu báșŁn quyền sans serif"] # 0xf8e9 (en: 'copyright sign sans serif') - - "ïŁȘ": [t: "dáș„u thÆ°ÆĄng máșĄi dáș„u hiệu sans serif"] # 0xf8ea (en: 'trade mark sign sans serif') - - "ïŁ«": [t: "dáș„u ngoáș·c Ä‘ÆĄn hĂ ng đáș§u"] # 0xf8eb (en: 'left paren top') - - "ïŁŹ": [t: "pháș§n mở rộng dáș„u ngoáș·c Ä‘ÆĄn"] # 0xf8ec (en: 'left paren extender') - - "ïŁ­": [t: "dáș„u ngoáș·c Ä‘ÆĄn phĂ­a dưới"] # 0xf8ed (en: 'left paren bottom') - - "ïŁź": [t: "chĂąn trĂĄi trĂȘn cĂčng"] # 0xf8ee (en: 'left bracket top') - - "ïŁŻ": [t: "bộ mở rộng khung trĂĄi"] # 0xf8ef (en: 'left bracket extender') - - "ïŁ°": [t: "đáy khung trĂĄi"] # 0xf8f0 (en: 'left bracket bottom') - - "ïŁ±": [t: "bĂȘn trĂĄi náșčp trĂȘn cĂčng"] # 0xf8f1 (en: 'left brace top') - - "ïŁČ": [t: "náșčp trĂĄi giữa"] # 0xf8f2 (en: 'left brace mid') - - "ïŁł": [t: "máș·t trĂĄi phĂ­a dưới"] # 0xf8f3 (en: 'left brace bottom') - - "ïŁŽ": [t: "niềng mở rộng"] # 0xf8f4 (en: 'brace extender') - - "ïŁ”": [t: "tĂ­ch hợp mở rộng"] # 0xf8f5 (en: 'integral extender') - - "ïŁ¶": [t: "dáș„u ngoáș·c Ä‘ÆĄn bĂȘn pháșŁi"] # 0xf8f6 (en: 'right paren top') - - "ïŁ·": [t: "dáș„u ngoáș·c Ä‘ÆĄn bĂȘn pháșŁi"] # 0xf8f7 (en: 'right paren extender') - - "ïŁž": [t: "dáș„u ngoáș·c Ä‘ÆĄn bĂȘn dưới"] # 0xf8f8 (en: 'right paren bottom') - - "ïŁč": [t: "giĂĄ đụ bĂȘn pháșŁi"] # 0xf8f9 (en: 'right bracket top') - - "ïŁș": [t: "bộ mở rộng khung pháșŁi"] # 0xf8fa (en: 'right bracket extender') - - "ïŁ»": [t: "đáy khung bĂȘn pháșŁi"] # 0xf8fb (en: 'right bracket bottom') - - "ïŁŒ": [t: "đóng tay pháșŁi"] # 0xf8fc (en: 'right brace top') - - "ïŁœ": [t: "náșčp pháșŁi giữa"] # 0xf8fd (en: 'right brace mid') - - "ïŁŸ": [t: "đáy giáș±ng bĂȘn pháșŁi"] # 0xf8fe (en: 'right brace bottom') - - "ïŁż": [t: "logo apple"] # 0xf8ff (en: 'apple logo') - - "ïŹ€": [t: "ff"] # 0xfb00 - - "ïŹ": [t: "fi"] # 0xfb01 - - "ïŹ‚": [t: "fl"] # 0xfb02 - - "ïŹƒ": [t: "ffi"] # 0xfb03 - - "ïŹ„": [t: "ffl"] # 0xfb04 - - "ïŹ…": [t: "ft"] # 0xfb05 - - "ïŹ†": [t: "st"] # 0xfb06 - - "ïž ": [t: "ligature trĂĄi một ná»­a tĂŽ điểm"] # 0xfe20 (en: 'ligature left half embellishment') - - "ïžĄ": [t: "ligature bĂȘn pháșŁi một ná»­a tĂŽ điểm"] # 0xfe21 (en: 'ligature right half embellishment') - - "ïžą": [t: "double tilde để láșĄi một ná»­a tĂŽ điểm"] # 0xfe22 (en: 'double tilde left half embellishment') - - "ïžŁ": [t: "double tilde pháșŁi ná»­a chỉnh trang"] # 0xfe23 (en: 'double tilde right half embellishment') - - "": [t: "macron để láșĄi một ná»­a tĂŽ điểm"] # 0xfe24 (en: 'macron left half embellishment') - - "ïž„": [t: "macron pháșŁi ná»­a chỉnh trang"] # 0xfe25 (en: 'macron right half embellishment') - - "": [t: "tinh chỉnh macron liĂȘn káșżt"] # 0xfe26 (en: 'conjoining macron embellishment') - - "ïž”": [t: "trĂȘn dáș„u ngoáș·c Ä‘ÆĄn"] # 0xfe35 (en: 'over paren') - - "ïž¶": [t: "dưới dáș„u ngoáș·c Ä‘ÆĄn"] # 0xfe36 (en: 'under paren') - - "ïž·": [t: "qua náșčp"] # 0xfe37 (en: 'over brace') - - "ïžž": [t: "dưới náșčp"] # 0xfe38 (en: 'under brace') - - "ïžż": [t: "trĂȘn khung gĂłc"] # 0xfe3f (en: 'over angle bracket') - - "ïč€": [t: "dưới khung gĂłc"] # 0xfe40 (en: 'under angle bracket') - - "ïčš": [t: "phĂąn chia số nguyĂȘn"] # 0xfe68 (en: 'integer divide') - - "ïżŒ": [t: "đối tÆ°á»Łng khĂŽng xĂĄc định hoáș·c thiáșżu"] # 0xfffc (en: 'unknown or missing object') - - "ïżœ": [t: "nhĂąn váș­t khĂŽng rĂ” hoáș·c thiáșżu"] # 0xfffd (en: 'unknown or missing character') +--- + + + - "€": [t: "dáș„u hiệu tiền tệ"] # 0xa4 (en: 'currency sign') + - "„": [t: "yĂȘn"] # 0xa5 (en: 'yen') + - "Š": [t: "thanh bị hỏng"] # 0xa6 (en: 'broken bar') + - "§": [t: "tiáșżt diện"] # 0xa7 (en: 'section') + - "š": [t: "cháș„m đîi"] # 0xa8 (en: 'double dot') + - "©": [t: "báșŁn quyền"] # 0xa9 (en: 'copyright') + - "ÂȘ": [t: "chỉ số thứ tá»± nữ tĂ­nh"] # 0xaa (en: 'feminine ordinal indicator') + - "«": [t: "dáș„u Ăœ nghÄ©a gĂłc cáșĄnh trĂĄi"] # 0xab (en: 'left-pointing double angle quote mark') + - "ÂŻ": # 0xaf + - test: + if: "ancestor::m:modified-variable and preceding-sibling::*[1][self::m:mi]" + then: [T: "ngang"] # (en: 'bar') -- as in "x bar", a shorthand way to speak this + else: [t: "dĂČng"] # (en: 'line') + - "ÂČ": [t: "hai"] # 0xb2 (en: 'two') + - "Âł": [t: "số ba"] # 0xb3 (en: 'three') + - "”": [t: "vi mĂŽ"] # 0xb5 (en: 'micro') + - "Âč": [t: "một"] # 0xb9 (en: 'one') + - "Âș": [t: "chỉ số thứ tá»± nam tĂ­nh"] # 0xb9 (en: 'masculine ordinal indicator') + - "ʰ": [t: "cĂŽng cỄ sá»­a đổi nhỏ h"] # 0x2b0 (en: 'modifier small h') + - "ʱ": [t: "cĂŽng cỄ sá»­a đổi h nhỏ với mĂłc"] # 0x2b1 (en: 'modifier small h with hook') + - "ÊČ": [t: "sá»­a đổi nhỏ j"] # 0x2b2 (en: 'modifier small j') + - "Êł": [t: "cĂŽng cỄ sá»­a đổi nhỏ r"] # 0x2b3 (en: 'modifier small r') + - "ÊŽ": [t: "cĂŽng cỄ sá»­a đổi nhỏ quay r"] # 0x2b4 (en: 'modifier small turned r') + - "Ê”": [t: "cĂŽng cỄ sá»­a đổi nhỏ quay r với mĂłc"] # 0x2b5 (en: 'modifier small turned r with hook') + - "ʶ": # 0x2b6 + - t: "sá»­a đổi nhỏ đáșŁo ngÆ°á»Łc" # (en: 'modifier small inverted') + - spell: "translate('R', 'R', 'R')" + + - "Ê·": [t: "sá»­a đổi nhỏ w"] # 0x2b7 (en: 'modifier small w') + - "Êž": [t: "cĂŽng cỄ sá»­a đổi nhỏ y"] # 0x2b8 (en: 'modifier small y') + - "Êč": [t: "cĂŽng cỄ sá»­a đổi prime"] # 0x2b9 (en: 'modifier prime') + - "Êș": [t: "cĂŽng cỄ sá»­a đổi double prime"] # 0x2ba (en: 'modifier double prime') + - "Ê»": [t: "cĂŽng cỄ sá»­a đổi đã trở thĂ nh dáș„u pháș©y"] # 0x2bb (en: 'modifier turned comma') + - "ÊŒ": [t: "ăn dĂąy sá»­a đổi"] # 0x2bc (en: 'modifier apostrophe') + - "Êœ": [t: "cĂŽng cỄ sá»­a đổi đáșŁo ngÆ°á»Łc dáș„u pháș©y"] # 0x2bd (en: 'modifier reversed comma') + - "ÊŸ": [t: "cĂŽng cỄ sá»­a đổi một ná»­a vĂČng"] # 0x2be (en: 'modifier right half ring') + - "Êż": [t: "cĂŽng cỄ sá»­a đổi một ná»­a vĂČng"] # 0x2bf (en: 'modifier left half ring') + - "ˀ": [t: "cĂŽng cỄ sá»­a đổi glottal stop"] # 0x2c0 (en: 'modifier glottal stop') + - "ˁ": [t: "cĂŽng cỄ sá»­a đổi đáșŁo ngÆ°á»Łc điểm dừng glottal"] # 0x2c1 (en: 'modifier reversed glottal stop') + - "˂": [t: "cĂŽng cỄ sá»­a đổi mĆ©i tĂȘn trĂĄi"] # 0x2c2 (en: 'modifier left arrowhead') + - "˃": [t: "cĂŽng cỄ sá»­a đổi mĆ©i tĂȘn pháșŁi"] # 0x2c3 (en: 'modifier right arrowhead') + - "˄": [t: "cĂŽng cỄ sá»­a đổi lĂȘn đáș§u mĆ©i tĂȘn"] # 0x2c4 (en: 'modifier up arrowhead') + - "˅": [t: "cĂŽng cỄ sá»­a đổi xuống mĆ©i tĂȘn"] # 0x2c5 (en: 'modifier down arrowhead') + - "ˆ": [t: "điểm nháș„n cá»§a circleflex"] # 0x2c6 (en: 'modifier circumflex accent') + - "ˇ": [t: "caron"] # 0x2c7 + - "ˈ": [t: "cĂŽng cỄ sá»­a đổi đường tháșłng đứng"] # 0x2c8 (en: 'modifier vertical line') + - "ˉ": [t: "macron cĂŽng cỄ sá»­a đổi"] # 0x2c9 (en: 'modifier macron') + - "ˊ": [t: "modifier điểm nháș„n cáș„p tĂ­nh"] # 0x2ca (en: 'modifier acute accent') + - "ˋ": [t: "điểm nháș„n nghiĂȘm trọng cá»§a cĂŽng cỄ sá»­a đổi"] # 0x2cb (en: 'modifier grave accent') + - "ˌ": [t: "cĂŽng cỄ sá»­a đổi đường tháșłng đứng tháș„p"] # 0x2cc (en: 'modifier low vertical line') + - "ˍ": [t: "cĂŽng cỄ sá»­a đổi macron tháș„p"] # 0x2cd (en: 'modifier low macron') + - "ˎ": [t: "cĂŽng cỄ sá»­a đổi giọng mộ tháș„p"] # 0x2ce (en: 'modifier low grave accent') + - "ˏ": [t: "cĂŽng cỄ sá»­a đổi điểm nháș„n cáș„p tĂ­nh tháș„p"] # 0x2cf (en: 'modifier low acute accent') + - "ː": [t: "cĂŽng cỄ sá»­a đổi đáșĄi trĂ ng hĂŹnh tam giĂĄc"] # 0x2d0 (en: 'modifier triangular colon') + - "ˑ": [t: "cĂŽng cỄ sá»­a đổi một ná»­a đáșĄi trĂ ng hĂŹnh tam giĂĄc"] # 0x2d1 (en: 'modifier half triangular colon') + - "˒": [t: "cĂŽng cỄ sá»­a đổi táș­p trung ná»­a vĂČng"] # 0x2d2 (en: 'modifier centered right half ring') + - "˓": [t: "cĂŽng cỄ sá»­a đổi táș­p trung ná»­a vĂČng trĂĄi"] # 0x2d3 (en: 'modifier centered left half ring') + - "˔": [t: "cĂŽng cỄ sá»­a đổi lĂȘn tadck"] # 0x2d4 (en: 'modifier up tadck') + - "˕": [t: "cĂŽng cỄ sá»­a đổi xuống"] # 0x2d5 (en: 'modifier down tack') + - "˖": [t: "cĂŽng cỄ sá»­a đổi cộng với dáș„u hiệu"] # 0x2d6 (en: 'modifier plus sign') + - "˗": [t: "cĂŽng cỄ sá»­a đổi trừ dáș„u hiệu"] # 0x2d7 (en: 'modifier minus sign') + - "˘": [t: "breve"] # 0x2d8 + - "˙": [t: "cháș„m"] # 0x2d9 (en: 'dot') + - "˚": [t: "nháș«n ở trĂȘn"] # 0x2da (en: 'ring above') + - "˛": [t: "ogonek"] # 0x2db + - "˜": [t: "tilde nhỏ"] # 0x2dc (en: 'small tilde') + - "˝": [t: "giọng cáș„p tĂ­nh gáș„p đîi"] # 0x2dd (en: 'double acute accent') + - "˞": [t: "mod soditoter mood"] # 0x2de (en: 'modifier rhotic hook') + - "˟": [t: "mĂĄy điều chỉnh điểm nháș„n chĂ©o"] # 0x2df (en: 'modifier cross accent') + - "Ë ": [t: "cĂŽng cỄ sá»­a đổi gamma nhỏ"] # 0x2e0 (en: 'modifier small gamma') + - "ËĄ": [t: "sá»­a đổi nhỏ l"] # 0x2e1 (en: 'modifier small l') + - "Ëą": [t: "sá»­a đổi nhỏ s"] # 0x2e2 (en: 'modifier small s') + - "ËŁ": [t: "cĂŽng cỄ sá»­a đổi nhỏ x"] # 0x2e3 (en: 'modifier small x') + - "Ë€": [t: "cĂŽng cỄ sá»­a đổi điểm dừng glottal đáșŁo ngÆ°á»Łc nhỏ"] # 0x2e4 (en: 'modifier small reversed glottal stop') + - "Ë„": [t: "cĂŽng cỄ sá»­a đổi thanh Ăąm cá»±c cao"] # 0x2e5 (en: 'modifier extra-high tone bar') + - "ËŠ": [t: "cĂŽng cỄ sá»­a đổi thanh Ăąm cao"] # 0x2e6 (en: 'modifier high tone bar') + - "˧": [t: "cĂŽng cỄ sá»­a đổi thanh giữa giai điệu"] # 0x2e7 (en: 'modifier mid tone bar') + - "Ëš": [t: "cĂŽng cỄ sá»­a đổi thanh Ăąm tháș„p"] # 0x2e8 (en: 'modifier low tone bar') + - "Ë©": [t: "cĂŽng cỄ sá»­a đổi thanh Ăąm tháș„p"] # 0x2e9 (en: 'modifier extra-low tone bar') + - "ËȘ": [t: "cĂŽng cỄ sá»­a đổi yin khởi hĂ nh dáș„u áș„n"] # 0x2ea (en: 'modifier yin departing tone mark') + - "Ë«": [t: "cĂŽng cỄ sá»­a đổi yang khởi hĂ nh dáș„u áș„n"] # 0x2eb (en: 'modifier yang departing tone mark') + - "ËŹ": [t: "cĂŽng cỄ sá»­a đổi lồng tiáșżng"] # 0x2ec (en: 'modifier voicing') + - "Ë­": [t: "người sá»­a đổi khĂŽng Ä‘Æ°á»Łc khĂĄm phĂĄ"] # 0x2ed (en: 'modifier unaspirated') + - "Ëź": [t: "báșŁn mĂŽ tĂ­n hiệu nhĂąn đîi"] # 0x2ee (en: 'modifier double apostrophe') + - "ËŻ": [t: "cĂŽng cỄ sá»­a đổi mĆ©i tĂȘn tháș„p xuống"] # 0x2ef (en: 'modifier low down arrowhead') + - "˰": [t: "cĂŽng cỄ sá»­a đổi mĆ©i tĂȘn tháș„p"] # 0x2f0 (en: 'modifier low up arrowhead') + - "˱": [t: "cĂŽng cỄ sá»­a đổi mĆ©i tĂȘn tháș„p bĂȘn trĂĄi"] # 0x2f1 (en: 'modifier low left arrowhead') + - "ËČ": [t: "cĂŽng cỄ sá»­a đổi mĆ©i tĂȘn tháș„p pháșŁi"] # 0x2f2 (en: 'modifier low right arrowhead') + - "Ëł": [t: "cĂŽng cỄ sá»­a đổi vĂČng tháș„p"] # 0x2f3 (en: 'modifier low ring') + - "ËŽ": [t: "mĂĄy điều chỉnh giọng giới thiệu giữa"] # 0x2f4 (en: 'modifier middle grave accent') + - "Ë”": [t: "modifier middle double grave accent"] # 0x2f5 + - "˶": [t: "cĂŽng cỄ sá»­a đổi trung tĂąm cáș„p tĂ­nh cáș„p tĂ­nh"] # 0x2f6 (en: 'modifier middle double acute accent') + - "Ë·": [t: "cĂŽng cỄ sá»­a đổi tilde tháș„p"] # 0x2f7 (en: 'modifier low tilde') + - "Ëž": [t: "cĂŽng cỄ sá»­a đổi nĂąng đáșĄi trĂ ng"] # 0x2f8 (en: 'modifier raised colon') + - "Ëč": [t: "cĂŽng cỄ sá»­a đổi báșŻt đáș§u Ăąm cao"] # 0x2f9 (en: 'modifier begin high tone') + - "Ëș": [t: "cĂŽng cỄ sá»­a đổi káșżt thĂșc Ăąm cao"] # 0x2fa (en: 'modifier end high tone') + - "Ë»": [t: "cĂŽng cỄ sá»­a đổi báșŻt đáș§u Ăąm tháș„p"] # 0x2fb (en: 'modifier begin low tone') + - "ËŒ": [t: "cĂŽng cỄ sá»­a đổi káșżt thĂșc Ăąm tháș„p"] # 0x2fc (en: 'modifier end low tone') + - "Ëœ": [t: "kệ điều chỉnh"] # 0x2fd (en: 'modifier shelf') + - "ËŸ": [t: "cĂŽng cỄ sá»­a đổi kệ mở"] # 0x2fe (en: 'modifier open shelf') + - "Ëż": [t: "cĂŽng cỄ sá»­a đổi mĆ©i tĂȘn tháș„p bĂȘn trĂĄi"] # 0x2ff (en: 'modifier low left arrow') + - "̈": [t: "tinh chỉnh diaeresis"] # 0x308 (en: 'diaeresis embellishment') + - "̉": [t: "mĂłc trĂȘn tĂŽ điểm"] # 0x309 (en: 'hook above embellishment') + - "̊": [t: "ring trĂȘn tĂŽn táșĄo"] # 0x30a (en: 'ring above embellishment') + - "̋": [t: "double cáș„p tĂ­nh tĂŽ điểm"] # 0x30b (en: 'double acute accent embellishment') + - "̌": [t: "kiểm tra"] # 0x30c (en: 'check') + - "̍": [t: "đường tháșłng đứng trĂȘn tĂŽ điểm"] # 0x30d (en: 'vertical line above embellishment') + - "̎": [t: "double dĂČng tháșłng đứng trĂȘn tĂŽ điểm"] # 0x30e (en: 'double vertical line above embellishment') + - "̏": [t: "double grave ecrent song sá»±"] # 0x30f (en: 'double grave accent embellishment') + - "̐": [t: "tinh chỉnh candrabindu"] # 0x310 (en: 'candrabindu embellishment') + - "̑": [t: "đáșŁo ngÆ°á»Łc sá»± tĂŽ điểm breve"] # 0x311 (en: 'inverted breve embellishment') + - "̒": [t: "biáșżn dáș„u pháș©y trĂȘn tĂŽn táșĄo"] # 0x312 (en: 'turned comma above embellishment') + - "̓": [t: "dáș„u pháș©y trĂȘn tĂŽn táșĄo"] # 0x313 (en: 'comma above embellishment') + - "̔": [t: "phĂĄo đáșŁo dáș„u pháș©y trĂȘn tĂŽn táșĄo"] # 0x314 (en: 'reversed comma above embellishment') + - "̕": [t: "dáș„u pháș©y ở trĂȘn chỉnh trang bĂȘn pháșŁi"] # 0x315 (en: 'comma above right embellishment') + - "̖": [t: "điểm nháș„n nghiĂȘm trọng dưới sá»± tĂŽn táșĄo"] # 0x316 (en: 'grave accent below embellishment') + - "̗": [t: "điểm nháș„n cáș„p tĂ­nh dưới sá»± tĂŽ điểm"] # 0x317 (en: 'acute accent below embellishment') + - "̘": [t: "trĂĄi bĂȘn dưới sá»± tĂŽn táșĄo"] # 0x318 (en: 'left tack below embellishment') + - "̙": [t: "pháșŁi tad dưới sá»± tĂŽn táșĄo"] # 0x319 (en: 'right tack below embellishment') + - "̚": [t: "gĂłc trĂĄi phĂ­a trĂȘn sá»± tĂŽ điểm"] # 0x31a (en: 'left angle above embellishment') + - "̛": [t: "sừng tĂŽ điểm"] # 0x31b (en: 'horn embellishment') + - "̜": [t: "một ná»­a vĂČng trĂĄi bĂȘn dưới sá»± tĂŽ điểm"] # 0x31c (en: 'left half ring below embellishment') + - "̝": [t: "up tack bĂȘn dưới sá»± tĂŽ điểm"] # 0x31d (en: 'up tack below embellishment') + - "̞": [t: "xuống dưới sá»± tĂŽn táșĄo"] # 0x31e (en: 'down tack below embellishment') + - "̟": [t: "cộng với dáș„u hiệu dưới đñy tĂŽ điểm"] # 0x31f (en: 'plus sign below embellishment') + - "Ì ": [t: "trừ dáș„u hiệu dưới đñy tĂŽ điểm"] # 0x320 (en: 'minus sign below embellishment') + - "ÌĄ": [t: "mĂłc vĂČm miệng bĂȘn dưới sá»± tĂŽ điểm"] # 0x321 (en: 'palatalized hook below embellishment') + - "Ìą": [t: "retroflex hook dưới sá»± tĂŽ điểm"] # 0x322 (en: 'retroflex hook below embellishment') + - "ÌŁ": [t: "dot dưới sá»± tĂŽ điểm"] # 0x323 (en: 'dot below embellishment') + - "Ì€": [t: "diaeresis dưới sá»± tĂŽ điểm"] # 0x324 (en: 'diaeresis below embellishment') + - "Ì„": [t: "nháș«n dưới sá»± tĂŽ điểm"] # 0x325 (en: 'ring below embellishment') + - "ÌŠ": [t: "dáș„u pháș©y dưới sá»± tĂŽn táșĄo"] # 0x326 (en: 'comma below embellishment') + - "̧": [t: "tinh chỉnh cedilla"] # 0x327 (en: 'cedilla embellishment') + - "Ìš": [t: "ogonek tĂŽ điểm"] # 0x328 (en: 'ogonek embellishment') + - "Ì©": [t: "đường tháșłng đứng dưới sá»± tĂŽ điểm"] # 0x329 (en: 'vertical line below embellishment') + - "ÌȘ": [t: "cáș§u dưới sá»± tĂŽ điểm"] # 0x32a (en: 'bridge below embellishment') + - "Ì«": [t: "đáșŁo ngÆ°á»Łc đîi vĂČm dưới sá»± tĂŽ điểm"] # 0x32b (en: 'inverted double arch below embellishment') + - "ÌŹ": [t: "caron dưới sá»± tĂŽn táșĄo"] # 0x32c (en: 'caron below embellishment') + - "Ì­": [t: "vĂČng trĂČn Ăąm thanh dưới sá»± tĂŽ điểm"] # 0x32d (en: 'circumflex accent below embellishment') + - "Ìź": [t: "breve dưới sá»± tĂŽn táșĄo"] # 0x32e (en: 'breve below embellishment') + - "ÌŻ": [t: "đáșŁo ngÆ°á»Łc breve dưới sá»± tĂŽ điểm"] # 0x32f (en: 'inverted breve below embellishment') + - "̰": [t: "tilde dưới sá»± tĂŽn táșĄo"] # 0x330 (en: 'tilde below embellishment') + - "̱": [t: "macron dưới sá»± tĂŽ điểm"] # 0x331 (en: 'macron below embellishment') + - "ÌČ": [t: "tinh chỉnh dĂČng tháș„p"] # 0x332 (en: 'low line embellishment') + - "Ìł": [t: "double line dĂČng tĂŽ điểm"] # 0x333 (en: 'double low line embellishment') + - "ÌŽ": [t: "tinh chỉnh lớp phá»§ tilde"] # 0x334 (en: 'tilde overlay embellishment') + - "Ì”": [t: "tiáșżng gáșĄch ngáșŻn tĂŽ điểm"] # 0x335 (en: 'short stroke overlay embellishment') + - "̶": [t: "tinh chỉnh lớp phá»§ dĂ i"] # 0x336 (en: 'long stroke overlay embellishment') + - "Ì·": [t: "slidus lớp phá»§ ngáșŻn gọn"] # 0x337 (en: 'short solidus overlay embellishment') + - "Ìž": [t: "tinh chỉnh lớp phá»§ solidus dĂ i"] # 0x338 (en: 'long solidus overlay embellishment') + - "Ìč": [t: "một ná»­a vĂČng bĂȘn pháșŁi bĂȘn dưới sá»± tĂŽ điểm"] # 0x339 (en: 'right half ring below embellishment') + - "Ìș": [t: "cáș§u đáșŁo dưới sá»± tĂŽn táșĄo"] # 0x33a (en: 'inverted bridge below embellishment') + - "Ì»": [t: "hĂŹnh vuĂŽng dưới sá»± tĂŽ điểm"] # 0x33b (en: 'square below embellishment') + - "ÌŒ": [t: "seagull dưới sá»± tĂŽn táșĄo"] # 0x33c (en: 'seagull below embellishment') + - "Ìœ": [t: "x trĂȘn tĂŽ điểm"] # 0x33d (en: 'x above embellishment') + - "ÌŸ": [t: "tinh chỉnh tilde dọc"] # 0x33e (en: 'vertical tilde embellishment') + - "Ìż": [t: "double overline tĂŽ điểm"] # 0x33f (en: 'double overline embellishment') + - "̀": [t: "grave tone đánh dáș„u dáș„u áș„n"] # 0x340 (en: 'grave tone mark embellishment') + - "́": [t: "giai điệu cáș„p tĂ­nh đánh dáș„u dáș„u áș„n"] # 0x341 (en: 'acute tone mark embellishment') + + - "ÎȘΫϏ": # 0x3aa, 0x3ab, 0x3cf + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [t: "háș­u quáșŁ"] # (en: 'cap') + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [spell: "translate('.', 'ÎȘΫϏ', 'Îčυϗ')"] + - t: "với dialytika" # (en: 'with dialytika') + - "ϊ": [t: "iota với dialytika"] # 0x3ca (en: 'iota with dialytika') + - "ϋ": [t: "upsilon với dialytika"] # 0x3cb (en: 'upsilon with dialytika') + - "ό": [t: "omicron với tonos"] # 0x3cc (en: 'omicron with tonos') + - "ύ": [t: "upsilon với tonos"] # 0x3cd (en: 'upsilon with tonos') + - "ώ": [t: "omega với tonos"] # 0x3ce (en: 'omega with tonos') + - "ϐ": [t: "beta"] # 0x3d0 + - "ϑ": [t: "theta"] # 0x3d1 + - "ϒ": [t: "upsilon với mĂłc"] # 0x3d2 (en: 'upsilon with hook') + - "ϓ": [t: "upsilon với cáș„p tĂ­nh vĂ  mĂłc"] # 0x3d3 (en: 'upsilon with acute and hook') + - "ϔ": [t: "upsilon với dieresis vĂ  hook"] # 0x3d4 (en: 'upsilon with diaeresis and hook') + - "ϗ": [t: "kai"] # 0x3d7 + - "А-ĐŻ": # 0x410 - 0x42f + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [t: "háș­u quáșŁ"] # (en: 'cap') + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [spell: "translate('.', 'ĐĐ‘Đ’Đ“Đ”Đ•Đ–Đ—Đ˜Đ™ĐšĐ›ĐœĐĐžĐŸĐ ĐĄĐąĐŁĐ€Đ„ĐŠĐ§ĐšĐ©ĐȘЫЏЭПЯ', 'абĐČгЎДжзОĐčĐșĐ»ĐŒĐœĐŸĐżŃ€ŃŃ‚ŃƒŃ„Ń…Ń†Ń‡ŃˆŃ‰ŃŠŃ‹ŃŒŃŃŽŃ')"] + - "а": [t: "а"] # 0x430 (en: 'a') + - "б": [t: "thĂŹ lĂ  ở"] # 0x431 (en: 'be') + - "ĐČ": [t: "đã"] # 0x432 (en: 've') + - "Đł": [t: "ghe"] # 0x433 + - "ĐŽ": [t: "de"] # 0x434 + - "Đ”": [t: "i e"] # 0x435 (en: 'ie') + - "ж": [t: "zhe"] # 0x436 + - "Đ·": [t: "ze"] # 0x437 + - "Đž": [t: "Đž"] # 0x438 (en: 'i') + - "Đč": [t: "ngáșŻn i"] # 0x439 (en: 'short i') + - "Đș": [t: "ka"] # 0x43a + - "Đ»": [t: "el"] # 0x43b + - "ĐŒ": [t: "em"] # 0x43c + - "Đœ": [t: "en"] # 0x43d + - "ĐŸ": [t: "ĐŸ"] # 0x43e (en: 'o') + - "Đż": [t: "thể dỄc"] # 0x43f (en: 'pe') + - "р": [t: "er"] # 0x440 + - "с": [t: "es"] # 0x441 + - "т": [t: "te"] # 0x442 + - "у": [t: "у"] # 0x443 (en: 'u') + - "ф": [t: "ef"] # 0x444 + - "х": [t: "ha"] # 0x445 + - "ц": [t: "tse"] # 0x446 + - "ч": [t: "che"] # 0x447 + - "ш": [t: "sha"] # 0x448 + - "щ": [t: "shcha"] # 0x449 + - "ъ": [t: "dáș„u hiệu khĂł"] # 0x44a (en: 'hard sign') + - "ы": [t: "yeru"] # 0x44b + - "ь": [t: "dáș„u hiệu mềm"] # 0x44c (en: 'soft sign') + - "э": [t: "э"] # 0x44d (en: 'e') + - "ю": [t: "yu"] # 0x44e + - "я": [t: "ya"] # 0x44f + - "‐": [t: "báșŻt gáșĄch"] # 0x2010 (en: 'hyphen') + - "‑": [t: "báșŻt gáșĄch"] # 0x2011 (en: 'hyphen') + - "‒": [t: "hĂŹnh dash"] # 0x2012 (en: 'figure dash') + - "‱": [t: "đáșĄn"] # 0x2022 (en: 'bullet') + - "‰": [t: "mỗi mille"] # 0x2030 (en: 'per mille') + - "‱": [t: "mỗi mười nghĂŹn"] # 0x2031 (en: 'per ten thousand') + - "‾": [t: "đáșżn"] # 0x2038 (en: 'to the') + - "â€č": [t: "một bĂȘn trĂĄi chỉ gĂłc trĂ­ch dáș«n dáș„u hiệu"] # 0x2039 (en: 'single left pointing angle quote mark') + - "â€ș": [t: "độc thĂąn chỉ gĂłc trĂ­ch dáș«n dáș„u hiệu"] # 0x203a (en: 'single right pointing angle quote mark') + - "‌": [t: "nhĂąn đîi nhĂąn đîi"] # 0x203c (en: 'double factorial') + - "⁄": [T: "trĂȘn"] # 0x2044 + - "⁅": [t: "khung vuĂŽng bĂȘn trĂĄi với quill"] # 0x2045 (en: 'left square bracket with quill') + - "⁆": [t: "khung vuĂŽng bĂȘn pháșŁi với quill"] # 0x2046 (en: 'right square bracket with quill') + - "⁗": [t: "quadruple prime"] # 0x2057 + - "⁠": [t: ""] # 0x2060 + - "⁰": [T: "mĆ© khĂŽng"] # 0x2070 (en: 'to the zeroth power') + - "ⁱ": [T: "mĆ© tĂĄm"] # 0x2071 (en: 'to the eihth power') + - "⁎": [T: "mĆ© bốn"] # 0x2074 (en: 'to the fourth power') + - "⁔": [T: "mĆ© năm"] # 0x2075 (en: 'to the fifth power') + - "⁶": [T: "mĆ© sĂĄu"] # 0x2076 (en: 'to the sixth power') + - "⁷": [T: "mĆ© báșŁy"] # 0x2077 (en: 'to the seventh power') + - "⁞": [T: "mĆ© tĂĄm"] # 0x2078 (en: 'to the eighth power') + - "âč": [T: "mĆ© chĂ­n"] # 0x2079 (en: 'to the ninth power') + - "âș": [t: "superscript plus dáș„u hiệu"] # 0x207a (en: 'superscript plus sign') + - "⁻": [t: "superscript trừ"] # 0x207b (en: 'superscript minus') + - "⁌": [t: "superscript báș±ng dáș„u hiệu"] # 0x207c (en: 'superscript equals sign') + - "⁜": [t: "superscript trĂĄi dáș„u ngoáș·c Ä‘ÆĄn"] # 0x207d (en: 'superscript left parenthesis') + - " ": [t: "superscript bĂȘn pháșŁi dáș„u ngoáș·c Ä‘ÆĄn"] # 0x207e (en: 'superscript right parenthesis') + - "ⁿ": [t: "đáșżn sức máșĄnh ennth"] # 0x207f (en: 'to the ennth power') + - "₀": [t: "Ăąm độ"] # 0x2080 (en: 'sub zero') + - "₁": [t: "phỄ một"] # 0x2081 (en: 'sub one') + - "₂": [t: "phỄ hai"] # 0x2082 (en: 'sub two') + - "₃": [t: "phỄ ba"] # 0x2083 (en: 'sub three') + - "₄": [t: "phỄ bốn"] # 0x2084 (en: 'sub four') + - "₅": [t: "phỄ năm"] # 0x2085 (en: 'sub five') + - "₆": [t: "sub six"] # 0x2086 + - "₇": [t: "phỄ báșŁy"] # 0x2087 (en: 'sub seven') + - "₈": [t: "phỄ táșĄi"] # 0x2088 (en: 'sub eight') + - "₉": [t: "sub nine"] # 0x2089 + - "₊": [t: "scorstcript plus dáș„u hiệu"] # 0x208a (en: 'subscript plus sign') + - "₋": [t: "scorstript minu dáș„u hiệu"] # 0x208b (en: 'subscript minus sign') + - "₌": [t: "chỉ số báș±ng dáș„u hiệu"] # 0x208c (en: 'subscript equals sign') + - "₍": [t: "chỉ số bĂȘn trĂĄi dáș„u ngoáș·c Ä‘ÆĄn"] # 0x208d (en: 'subscript left parenthesis') + - "₎": [t: "scorstist quyền quyền"] # 0x208e (en: 'subscript right parenthesis') + - "ₐ": [t: "sub a"] # 0x2090 (en: 'sub A') + - "ₑ": [t: "sub e"] # 0x2091 (en: 'sub E') + - "ₒ": [t: "sub o"] # 0x2092 (en: 'sub O') + - "ₓ": [t: "sub x"] # 0x2093 (en: 'sub X') + - "ₕ": [t: "sub h"] # 0x2095 (en: 'sub H') + - "ₖ": [t: "sub k"] # 0x2096 (en: 'sub K') + - "ₗ": [t: "sub l"] # 0x2097 (en: 'sub L') + - "ₘ": [t: "sub m"] # 0x2098 (en: 'sub M') + - "ₙ": [t: "sub n"] # 0x2099 (en: 'sub N') + - "ₚ": [t: "sub p"] # 0x209a (en: 'sub P') + - "ₛ": [t: "sub s"] # 0x209b (en: 'sub S') + - "ₜ": [t: "sub t"] # 0x209c (en: 'sub T') + - "₠": [t: "cĂĄc Ä‘ÆĄn vị hiện táșĄi cá»§a chĂąu Ăąu"] # 0x20a0 (en: 'european currenty units') + - "₡": [t: "phối tá»­"] # 0x20a1 (en: 'colons') + - "₱": [t: "cruzeiro"] # 0x20a2 + - "₣": [t: "franc"] # 0x20a3 + - "â‚€": [t: "lira"] # 0x20a4 + - "â‚„": [t: "nhĂ  mĂĄy"] # 0x20a5 (en: 'mills') + - "₩": [t: "naira"] # 0x20a6 + - "₧": [t: "peseta"] # 0x20a7 + - "₹": [t: "rupee"] # 0x20a8 (en: 'rupees') + - "₩": [t: "tháșŻng"] # 0x20a9 (en: 'won') + - "â‚Ș": [t: "sheqels mới"] # 0x20aa (en: 'new sheqels') + - "₫": [t: "dong"] # 0x20ab + - "€": [t: "euro"] # 0x20ac (en: 'euros') + - "₭": [t: "kip"] # 0x20ad + - "₼": [t: "tugrik"] # 0x20ae + - "₯": [t: "drachma"] # 0x20af + - "₰": [t: "đồng xu đức"] # 0x20b0 (en: 'german pennies') + - "₱": [t: "peso"] # 0x20b1 (en: 'pesos') + - "â‚Č": [t: "guaranis"] # 0x20b2 + - "₳": [t: "austral"] # 0x20b3 (en: 'australs') + - "₮": [t: "hryvnias"] # 0x20b4 + - "â‚”": [t: "cedis"] # 0x20b5 + - "₶": [t: "livre tournois"] # 0x20b6 + - "₷": [t: "spesmilos"] # 0x20b7 + - "₾": [t: "tenges"] # 0x20b8 + - "â‚č": [t: "đồng rupee áș„n độ"] # 0x20b9 (en: 'indian rupees') + - "â‚ș": [t: "liras thổ nhÄ© kỳ"] # 0x20ba (en: 'turkish liras') + - "⃐": [t: "trĂĄi harpoon phĂ­a trĂȘn sá»± tĂŽn táșĄo"] # 0x20d0 (en: 'left harpoon above embellishment') + - "⃑": [t: "harpoon bĂȘn pháșŁi trĂȘn tĂŽn táșĄo"] # 0x20d1 (en: 'right harpoon above embellishment') + - "⃒": [t: "tinh chỉnh lớp phá»§ dọc dĂ i"] # 0x20d2 (en: 'long vertical line overlay embellishment') + - "⃓": [t: "tinh chỉnh lớp phá»§ tháșłng đứng ngáșŻn"] # 0x20d3 (en: 'short vertical line overlay embellishment') + - "⃔": [t: "mĆ©i tĂȘn ngÆ°á»Łc chiều kim đồng hồ phĂ­a trĂȘn sá»± tĂŽ điểm"] # 0x20d4 (en: 'anticlockwise arrow above embellishment') + - "⃕": [t: "mĆ©i tĂȘn theo chiều kim đồng hồ phĂ­a trĂȘn sá»± tĂŽ điểm"] # 0x20d5 (en: 'clockwise arrow above embellishment') + - "⃖": [t: "mĆ©i tĂȘn trĂĄi phĂ­a trĂȘn sá»± tĂŽ điểm"] # 0x20d6 (en: 'left arrow above embellishment') + - "⃗": [t: "mĆ©i tĂȘn bĂȘn pháșŁi trĂȘn tĂŽn táșĄo"] # 0x20d7 (en: 'right arrow above embellishment') + - "⃘": [t: "đoáșĄn lĂȘn lớp trang phỄc"] # 0x20d8 (en: 'ring overlay embellishment') + - "⃙": [t: "đoĂ n chiều theo chiều kim đồng hồ tĂŽ điểm"] # 0x20d9 (en: 'clockwise ring overlay embellishment') + - "⃚": [t: "tinh chỉnh lớp phá»§ vĂČng ngÆ°á»Łc chiều kim đồng hồ"] # 0x20da (en: 'anticlockwise ring overlay embellishment') + - "⃛": [t: "ba cháș„m"] # 0x20db (en: 'triple dot') + - "⃜": [t: "cháș„m bốn"] # 0x20dc (en: 'quadruple dot') + - "⃝": [t: "bao quanh tĂŽ điểm vĂČng trĂČn"] # 0x20dd (en: 'enclosing circle embellishment') + - "⃞": [t: "kĂšm theo tĂŽ điểm vuĂŽng"] # 0x20de (en: 'enclosing square embellishment') + - "⃟": [t: "kĂšm theo tĂŽ điểm kim cÆ°ÆĄng"] # 0x20df (en: 'enclosing diamond embellishment') + - "⃠": [t: "kĂšm theo hĂŹnh áșŁnh chao đáșŁo"] # 0x20e0 (en: 'enclosing circle backslash embellishment') + - "⃥": [t: "mĆ©i tĂȘn trĂĄi bĂȘn pháșŁi phĂ­a trĂȘn sá»± tĂŽ điểm"] # 0x20e1 (en: 'left right arrow above embellishment') + - "⃹": [t: "kĂšm theo tĂŽ điểm mĂ n hĂŹnh"] # 0x20e2 (en: 'enclosing screen embellishment') + - "⃣": [t: "kĂšm theo tĂŽ điểm khĂła"] # 0x20e3 (en: 'enclosing keycap embellishment') + - "⃀": [t: "kĂšm theo tĂŽ điểm hĂŹnh tam giĂĄc hướng lĂȘn"] # 0x20e4 (en: 'enclosing upward pointing triangle embellishment') + - "⃄": [t: "đáșŁo ngÆ°á»Łc solidus overlay tĂŽ điểm"] # 0x20e5 (en: 'reverse solidus overlay embellishment') + - "⃊": [t: "tinh chỉnh gáșĄch đîi"] # 0x20e6 (en: 'double verticle stroke embellishment') + - "⃧": [t: "tổ chức biểu tÆ°á»Łng niĂȘn kim"] # 0x20e7 (en: 'annuity symbol embellishment') + - "⃚": [t: "triple underdot"] # 0x20e8 + - "⃩": [t: "cáș§u rộng phĂ­a trĂȘn sá»± tĂŽ điểm"] # 0x20e9 (en: 'wide bridge above embellishment') + - "âƒȘ": [t: "bĂȘn trĂĄi mĆ©i tĂȘn phá»§ lĂȘn sá»± tĂŽ điểm"] # 0x20ea (en: 'leftwards arrow overlay embellishment') + - "⃫": [t: "double solidus overlay overlay tĂŽ điểm"] # 0x20eb (en: 'long double solidus overlay embellishment') + - "⃏": [t: "quyền harpoon với barb downwards tallingation"] # 0x20ec (en: 'rightwards harpoon with barb downwards embellishment') + - "⃭": [t: "harpoon bĂȘn trĂĄi với barb downwwards song sá»±"] # 0x20ed (en: 'leftwards harpoon with barb downwards embellishment') + - "⃟": [t: "mĆ©i tĂȘn trĂĄi bĂȘn dưới sá»± tĂŽ điểm"] # 0x20ee (en: 'left arrow below embellishment') + - "⃯": [t: "mĆ©i tĂȘn pháșŁi dưới sá»± tĂŽn táșĄo"] # 0x20ef (en: 'right arrow below embellishment') + - "⃰": [t: "astersik trĂȘn tĂŽn táșĄo"] # 0x20f0 (en: 'astersik above embellishment') + - "℄": [t: "biểu tÆ°á»Łng đường trung tĂąm"] # 0x2104 (en: 'center line symbol') + - "℅": [t: "quan tĂąm"] # 0x2105 (en: 'care of') + - "℆": [t: "cada una"] # 0x2106 + - "ℇ": [t: "háș±ng số cá»§a euler"] # 0x2107 (en: 'euler's constant') + - "℈": [t: "scruples"] # 0x2108 + - "ℊ": [t: "kịch báșŁn g"] # 0x210a (en: 'script g') + - "ℌℑℹℭ": # 0x210c, 0x2111, 0x2128, 0x212d + - t: "fraktur" + - spell: "translate('.', 'ℌℑℹℭ', 'HIZC')" + + - "â„â„™â„Ÿâ„ż": # 0x210d, 0x2119, 0x213e, 0x213f + - test: + if: "$Verbosity!='Terse'" + then: [t: "cĂș đĂșp"] # (en: 'double struck') + - spell: "translate('.', 'â„â„™â„Ÿâ„ż', 'HPΓΠ')" + + - "ℏ": # 0x210f + - test: + if: "($Verbosity='Terse')" + then: [t: "h bar"] + else: [t: "giáșŁm planck háș±ng số"] # (en: 'reduced planck constant') + + - "â„â„’â„˜â„Źâ„°â„±â„ł": # 0x2110, 0x2112, 0x2118, 0x2130, 0x2131, 0x2133 + - t: "script" + - spell: "translate('.', 'â„â„’â„˜â„Źâ„°â„±â„ł', 'ILPBEFM')" + + - "℔": [t: "báșŁng"] # 0x2114 (en: 'pounds') + - "№": [t: "số"] # 0x2116 (en: 'number') + - "â„„": [t: "ounce"] # 0x2125 (en: 'ounces') + - "℧": [t: "mhos"] # 0x2127 + - "℩": [t: "đã quay iota"] # 0x2129 (en: 'turned iota') + - "ℯ": [t: "kịch báșŁn e"] # 0x212f (en: 'script e') + + # coalesced some chars that use cap letters + - "â„Čâ„ș⅁⅂⅃⅄": # 0x2132, 0x213a, 0x2141, 0x2142, 0x2143, 0x2144 + - test: + - if: "'.' = 'â„ș'" + then: [t: "xoay"] # (en: 'rotated') + - else_if: "'.' = 'â„Č'" + then: [t: "quay"] # (en: 'turned') + - else_if: "'.' = '⅃'" + then: [t: "đáșŁo ngÆ°á»Łc sans-serif"] # (en: 'reversed sans-serif') + else: [t: "biáșżn sans-serif"] # (en: 'turned sans-serif') + - spell: "translate('.', 'â„Čâ„ș⅁⅂⅃⅄', 'FQGLLY')" + + - "℮": [t: "kịch báșŁn o"] # 0x2134 (en: 'script o') + - "â„”": [t: "hồng y chuyển tiáșżp đáș§u tiĂȘn"] # 0x2135 (en: 'first transfinite cardinal') + - "ℶ": [t: "hồng y chuyển tiáșżp thứ hai"] # 0x2136 (en: 'second transfinite cardinal') + - "ℷ": [t: "hồng y transfinite thứ ba"] # 0x2137 (en: 'third transfinite cardinal') + - "ℾ": [t: "hồng y chuyển tiáșżp thứ tư"] # 0x2138 (en: 'fourth transfinite cardinal') + - "ℌ": [t: "double táș„n cĂŽng pi"] # 0x213c (en: 'double struck pi') + - "ℜ": [t: "double táș„n cĂŽng gamma"] # 0x213d (en: 'double struck gamma') + - "⅀": [t: "double táș„n cĂŽng tổng n-ary"] # 0x2140 (en: 'double struck n-ary summation') + - "⅋": [t: "quay ampersand"] # 0x214b (en: 'turned ampersand') + - "⅌": [t: "mỗi"] # 0x214c (en: 'per') + - "ⅎ": [t: "báș­t f"] # 0x214e (en: 'turned F') + - "⅐": [T: "một pháș§n báșŁy"] # 0x2150 (en: 'one seventh') + - "⅑": [T: "một pháș§n chĂ­n"] # 0x2151 (en: 'one ninth') + - "⅒": [T: "một pháș§n mười"] # 0x2152 (en: 'one tenth') + - "⅓": [T: "một pháș§n ba"] # 0x2153 (en: 'one third') + - "⅔": [T: "hai pháș§n ba"] # 0x2154 (en: 'two thirds') + - "⅕": [T: "một pháș§n năm"] # 0x2155 (en: 'one fifth') + - "⅖": [T: "hai pháș§n năm"] # 0x2156 (en: 'two fifths') + - "⅗": [T: "ba pháș§n năm"] # 0x2157 (en: 'three fifths') + - "⅘": [T: "bốn pháș§n năm"] # 0x2158 (en: 'four fifths') + - "⅙": [T: "một pháș§n sĂĄu"] # 0x2159 (en: 'one sixth') + - "⅚": [T: "năm pháș§n sĂĄu"] # 0x215a (en: 'five sixths') + - "⅛": [T: "một pháș§n tĂĄm"] # 0x215b (en: 'one eighth') + - "⅜": [T: "ba pháș§n tĂĄm"] # 0x215c (en: 'three eighths') + - "⅝": [T: "năm pháș§n tĂĄm"] # 0x215d (en: 'five eighths') + - "⅞": [T: "báșŁy pháș§n tĂĄm"] # 0x215e (en: 'seven eighths') + - "⅟": [T: "một trĂȘn"] # 0x215f (en: 'one over') + - "Ⅰ": [t: "Ⅰ"] # 0x2160 (en: 'I') + - "Ⅱ": [t: "tĂŽi i"] # 0x2161 (en: 'I I') + - "ⅱ": [t: "tĂŽi i i"] # 0x2162 (en: 'I I I') + - "Ⅳ": [t: "tĂŽi v"] # 0x2163 (en: 'I V') + - "â…€": [t: "â…€"] # 0x2164 (en: 'V') + - "â…„": [t: "v i"] # 0x2165 (en: 'V I') + - "Ⅹ": [t: "v i i"] # 0x2166 (en: 'V I I') + - "Ⅷ": [t: "v i i i"] # 0x2167 (en: 'V I I I') + - "ⅹ": [t: "tĂŽi x"] # 0x2168 (en: 'I X') + - "Ⅹ": [t: "Ⅹ"] # 0x2169 (en: 'X') + - "â…Ș": [t: "x i"] # 0x216a (en: 'X I') + - "Ⅻ": [t: "x i i"] # 0x216b (en: 'X I I') + - "Ⅼ": [t: "Ⅼ"] # 0x216c (en: 'L') + - "Ⅽ": [t: "Ⅽ"] # 0x216d (en: 'C') + - "ⅼ": [t: "ⅼ"] # 0x216e (en: 'D') + - "Ⅿ": [t: "Ⅿ"] # 0x216f (en: 'M') + - "ⅰ": [t: "ⅰ"] # 0x2170 (en: 'I') + - "ⅱ": [t: "tĂŽi i"] # 0x2171 (en: 'I I') + - "â…Č": [t: "tĂŽi i i"] # 0x2172 (en: 'I I I') + - "ⅳ": [t: "tĂŽi v"] # 0x2173 (en: 'I V') + - "Ⅾ": [t: "Ⅾ"] # 0x2174 (en: 'V') + - "â…”": [t: "v i"] # 0x2175 (en: 'V I') + - "ⅶ": [t: "v i i"] # 0x2176 (en: 'V I I') + - "ⅷ": [t: "v i i i"] # 0x2177 (en: 'V I I I') + - "ⅾ": [t: "tĂŽi x"] # 0x2178 (en: 'I X') + - "â…č": [t: "â…č"] # 0x2179 (en: 'X') + - "â…ș": [t: "x i"] # 0x217a (en: 'X I') + - "ⅻ": [t: "x i i"] # 0x217b (en: 'X I I') + - "â…Œ": [t: "â…Œ"] # 0x217c (en: 'L') + - "â…œ": [t: "â…œ"] # 0x217d (en: 'C') + - "â…Ÿ": [t: "â…Ÿ"] # 0x217e (en: 'D') + - "ⅿ": [t: "ⅿ"] # 0x217f (en: 'M') + - "↉": [t: "khĂŽng cĂł một pháș§n ba"] # 0x2189 (en: 'zero thirds') + - "↔": [t: "tÆ°ÆĄng Ä‘Æ°ÆĄng"] # 0x2194 (en: 'left right arrow') + - "↕": [t: "lĂȘn mĆ©i tĂȘn xuống"] # 0x2195 (en: 'up down arrow') + - "↖": [t: "mĆ©i tĂȘn tĂąy báșŻc"] # 0x2196 (en: 'north west arrow') + - "↗": # 0x2197 + - test: + if: "ancestor::*[2][self::m:limit]" + then: [t: "cĂĄch tiáșżp cáș­n từ bĂȘn dưới"] # (en: 'approaches from below') + else: [t: "mĆ©i tĂȘn đîng báșŻc"] # (en: 'north east arrow') + + - "↘": # 0x2198 + - test: + if: "ancestor::*[2][self::m:limit]" + then: [t: "cĂĄch tiáșżp cáș­n từ trĂȘn cao"] # (en: 'approaches from above') + else: [t: "mĆ©i tĂȘn đîng nam"] # (en: 'south east arrow') + + - "↙": [t: "mĆ©i tĂȘn tĂąy nam"] # 0x2199 (en: 'south west arrow') + - "↚": [t: "mĆ©i tĂȘn trĂĄi với gáșĄch"] # 0x219a (en: 'leftwards arrow with stroke') + - "↛": [t: "mĆ©i tĂȘn pháșŁi với gáșĄch"] # 0x219b (en: 'rightwards arrow with stroke') + - "↜": [t: "mĆ©i tĂȘn sĂłng trĂĄi"] # 0x219c (en: 'leftwards wave arrow') + - "↝": [t: "mĆ©i tĂȘn sĂłng bĂȘn pháșŁi"] # 0x219d (en: 'rightwards wave arrow') + - "↞": [t: "bĂȘn trĂĄi hai mĆ©i tĂȘn đáș§u"] # 0x219e (en: 'leftwards two headed arrow') + - "↟": [t: "lĂȘn tới hai mĆ©i tĂȘn đáș§u"] # 0x219f (en: 'upwards two headed arrow') + - "↠": [t: "pháșŁi hai mĆ©i tĂȘn hai đáș§u"] # 0x21a0 (en: 'rightwards two headed arrow') + - "↡": [t: "xuống hai mĆ©i tĂȘn đáș§u"] # 0x21a1 (en: 'downwards two headed arrow') + - "↱": [t: "mĆ©i tĂȘn trĂĄi cĂł đuĂŽi"] # 0x21a2 (en: 'leftwards arrow with tail') + - "↣": [t: "mĆ©i tĂȘn pháșŁi cĂł đuĂŽi"] # 0x21a3 (en: 'rightwards arrow with tail') + - "ↀ": [t: "mĆ©i tĂȘn trĂĄi từ thanh"] # 0x21a4 (en: 'leftwards arrow from bar') + - "ↄ": [t: "mĆ©i tĂȘn hướng lĂȘn từ thanh"] # 0x21a5 (en: 'upwards arrow from bar') + - "↩": [t: "mĆ©i tĂȘn bĂȘn pháșŁi từ thanh"] # 0x21a6 (en: 'rightwards arrow from bar') + - "↧": [t: "mĆ©i tĂȘn xuống từ thanh"] # 0x21a7 (en: 'downwards arrow from bar') + - "↹": [t: "lĂȘn mĆ©i tĂȘn xuống với cÆĄ sở"] # 0x21a8 (en: 'up down arrow with base') + - "↩": [t: "mĆ©i tĂȘn trĂĄi với mĂłc"] # 0x21a9 (en: 'leftwards arrow with hook') + - "â†Ș": [t: "mĆ©i tĂȘn bĂȘn pháșŁi với mĂłc"] # 0x21aa (en: 'rightwards arrow with hook') + - "↫": [t: "mĆ©i tĂȘn trĂĄi với vĂČng láș·p"] # 0x21ab (en: 'leftwards arrow with loop') + - "↬": [t: "mĆ©i tĂȘn pháșŁi với vĂČng láș·p"] # 0x21ac (en: 'rightwards arrow with loop') + - "↭": [t: "mĆ©i tĂȘn bĂȘn trĂĄi bĂȘn pháșŁi"] # 0x21ad (en: 'left right wave arrow') + - "↼": [t: "mĆ©i tĂȘn trĂĄi bĂȘn pháșŁi với gáșĄch"] # 0x21ae (en: 'left right arrow with stroke') + - "↯": [t: "mĆ©i tĂȘn ngoáș±n ngoĂšo xuống"] # 0x21af (en: 'downwards zigzag arrow') + - "↰": [t: "mĆ©i tĂȘn hướng lĂȘn với đáș§u trĂĄi"] # 0x21b0 (en: 'upwards arrow with tip leftwards') + - "↱": [t: "mĆ©i tĂȘn hướng lĂȘn với đáș§u bĂȘn pháșŁi"] # 0x21b1 (en: 'upwards arrow with tip rightwards') + - "â†Č": [t: "mĆ©i tĂȘn xuống với đáș§u trĂĄi"] # 0x21b2 (en: 'downwards arrow with tip leftwards') + - "↳": [t: "mĆ©i tĂȘn xuống với đáș§u bĂȘn pháșŁi"] # 0x21b3 (en: 'downwards arrow with tip rightwards') + - "↮": [t: "mĆ©i tĂȘn bĂȘn pháșŁi với gĂłc xuống"] # 0x21b4 (en: 'rightwards arrow with corner downwards') + - "↔": [t: "mĆ©i tĂȘn xuống với gĂłc trĂĄi"] # 0x21b5 (en: 'downwards arrow with corner leftwards') + - "↶": [t: "mĆ©i tĂȘn bĂĄn nguyệt trĂȘn cĂčng theo chiều kim đồng hồ"] # 0x21b6 (en: 'anticlockwise top semicircle arrow') + - "↷": [t: "mĆ©i tĂȘn bĂĄn nguyệt trĂȘn cĂčng theo chiều kim đồng hồ"] # 0x21b7 (en: 'clockwise top semicircle arrow') + - "↾": [t: "mĆ©i tĂȘn tĂąy báșŻc đáșżn long bar"] # 0x21b8 (en: 'north west arrow to long bar') + - "â†č": [t: "mĆ©i tĂȘn trĂĄi để thanh trĂȘn mĆ©i tĂȘn pháșŁi vĂ o thanh"] # 0x21b9 (en: 'leftwards arrow to bar over rightwards arrow to bar') + - "â†ș": [t: "mĆ©i tĂȘn vĂČng trĂČn mở theo chiều kim đồng hồ"] # 0x21ba (en: 'anticlockwise open circle arrow') + - "↻": [t: "mĆ©i tĂȘn vĂČng trĂČn mở theo chiều kim đồng hồ"] # 0x21bb (en: 'clockwise open circle arrow') + - "↌": [t: "trĂĄi harpoon lĂȘn"] # 0x21bc (en: 'left harpoon up') + - "↜": [t: "rời harpoon xuống"] # 0x21bd (en: 'left harpoon down') + - "↟": [t: "up harpoon pháșŁi"] # 0x21be (en: 'up harpoon right') + - "↿": [t: "lĂȘn harpoon trĂĄi"] # 0x21bf (en: 'up harpoon left') + - "⇀": [t: "quyền harpoon lĂȘn"] # 0x21c0 (en: 'right harpoon up') + - "⇁": [t: "harpoon pháșŁi xuống"] # 0x21c1 (en: 'right harpoon down') + - "⇂": [t: "xuống harpoon pháșŁi"] # 0x21c2 (en: 'down harpoon right') + - "⇃": [t: "xuống harpoon trĂĄi"] # 0x21c3 (en: 'down harpoon left') + - "⇄": [t: "mĆ©i tĂȘn pháșŁi qua mĆ©i tĂȘn trĂĄi"] # 0x21c4 (en: 'rightwards arrow over leftwards arrow') + - "⇅": [t: "mĆ©i tĂȘn hướng lĂȘn bĂȘn trĂĄi cá»§a mĆ©i tĂȘn xuống"] # 0x21c5 (en: 'upwards arrow leftwards of downwards arrow') + - "⇆": [t: "mĆ©i tĂȘn trĂĄi qua mĆ©i tĂȘn pháșŁi"] # 0x21c6 (en: 'leftwards arrow over rightwards arrow') + - "⇇": [t: "mĆ©i tĂȘn Ä‘Æ°á»Łc ghĂ©p nối trĂĄi"] # 0x21c7 (en: 'leftwards paired arrows') + - "⇈": [t: "mĆ©i tĂȘn đi lĂȘn trĂȘn"] # 0x21c8 (en: 'upwards paired arrows') + - "⇉": [t: "mĆ©i tĂȘn Ä‘Æ°á»Łc ghĂ©p ngay"] # 0x21c9 (en: 'rightwards paired arrows') + - "⇊": [t: "mĆ©i tĂȘn đi xuống"] # 0x21ca (en: 'downwards paired arrows') + - "⇋": [t: "trĂĄi harpoon qua harpoon pháșŁi"] # 0x21cb (en: 'left harpoon over right harpoon') + - "⇌": [t: "harpoon pháșŁi qua harpoon trĂĄi"] # 0x21cc (en: 'right harpoon over left harpoon') + - "⇍": [t: "mĆ©i tĂȘn đîi bĂȘn trĂĄi với gáșĄch"] # 0x21cd (en: 'leftwards double arrow with stroke') + - "⇎": [t: "mĆ©i tĂȘn kĂ©p bĂȘn trĂĄi với gáșĄch"] # 0x21ce (en: 'left right double arrow with stroke') + - "⇏": [t: "mĆ©i tĂȘn kĂ©p pháșŁi với gáșĄch"] # 0x21cf (en: 'rightwards double arrow with stroke') + - "⇐": [t: "mĆ©i tĂȘn đîi trĂĄi"] # 0x21d0 (en: 'leftwards double arrow') + - "⇑": [t: "mĆ©i tĂȘn tăng gáș„p đîi"] # 0x21d1 (en: 'upwards double arrow') + - "⇓": [t: "xuống mĆ©i tĂȘn đîi"] # 0x21d3 (en: 'downwards double arrow') + - "⇔": [t: "tÆ°ÆĄng Ä‘Æ°ÆĄng"] # 0x21d4 (en: 'left right double arrow') + - "⇕": [t: "lĂȘn xuống mĆ©i tĂȘn đîi"] # 0x21d5 (en: 'up down double arrow') + - "⇖": [t: "mĆ©i tĂȘn đîi tĂąy báșŻc"] # 0x21d6 (en: 'north west double arrow') + - "⇗": [t: "mĆ©i tĂȘn đîi đîng báșŻc"] # 0x21d7 (en: 'north east double arrow') + - "⇘": [t: "mĆ©i tĂȘn đîi đîng nam"] # 0x21d8 (en: 'south east double arrow') + - "⇙": [t: "mĆ©i tĂȘn đîi tĂąy nam"] # 0x21d9 (en: 'south west double arrow') + - "⇚": [t: "mĆ©i tĂȘn ba bĂȘn trĂĄi"] # 0x21da (en: 'leftwards triple arrow') + - "⇛": [t: "mĆ©i tĂȘn ba bĂȘn pháșŁi"] # 0x21db (en: 'rightwards triple arrow') + - "⇜": [t: "mĆ©i tĂȘn bĂȘn trĂĄi"] # 0x21dc (en: 'leftwards squiggle arrow') + - "⇝": [t: "mĆ©i tĂȘn squiggle pháșŁi"] # 0x21dd (en: 'rightwards squiggle arrow') + - "⇞": [t: "mĆ©i tĂȘn hướng lĂȘn với cĂș đánh đîi"] # 0x21de (en: 'upwards arrow with double stroke') + - "⇟": [t: "mĆ©i tĂȘn xuống với cĂș đánh đîi"] # 0x21df (en: 'downwards arrow with double stroke') + - "⇠": [t: "mĆ©i tĂȘn bĂȘn trĂĄi lao"] # 0x21e0 (en: 'leftwards dashed arrow') + - "⇡": [t: "mĆ©i tĂȘn đi xuống"] # 0x21e1 (en: 'upwards dashed arrow') + - "⇱": [t: "mĆ©i tĂȘn đứt pháșŁi bĂȘn pháșŁi"] # 0x21e2 (en: 'rightwards dashed arrow') + - "⇣": [t: "mĆ©i tĂȘn xuống xuống"] # 0x21e3 (en: 'downwards dashed arrow') + - "⇀": [t: "mĆ©i tĂȘn trĂĄi vĂ o thanh"] # 0x21e4 (en: 'leftwards arrow to bar') + - "⇄": [t: "mĆ©i tĂȘn pháșŁi vĂ o thanh"] # 0x21e5 (en: 'rightwards arrow to bar') + - "⇩": [t: "mĆ©i tĂȘn tráșŻng bĂȘn trĂĄi"] # 0x21e6 (en: 'leftwards white arrow') + - "⇧": [t: "mĆ©i tĂȘn tráșŻng hướng lĂȘn trĂȘn"] # 0x21e7 (en: 'upwards white arrow') + - "⇹": [t: "mĆ©i tĂȘn tráșŻng bĂȘn pháșŁi"] # 0x21e8 (en: 'rightwards white arrow') + - "⇩": [t: "mĆ©i tĂȘn tráșŻng xuống"] # 0x21e9 (en: 'downwards white arrow') + - "â‡Ș": [t: "mĆ©i tĂȘn tráșŻng hướng lĂȘn từ thanh"] # 0x21ea (en: 'upwards white arrow from bar') + - "⇫": [t: "mĆ©i tĂȘn mĂ u tráșŻng lĂȘn trĂȘn bệ"] # 0x21eb (en: 'upwards white arrow on pedestal') + - "⇬": [t: "mĆ©i tĂȘn mĂ u tráșŻng lĂȘn trĂȘn bệ với thanh ngang"] # 0x21ec (en: 'upwards white arrow on pedestal with horizontal bar') + - "⇭": [t: "mĆ©i tĂȘn mĂ u tráșŻng lĂȘn trĂȘn bệ với thanh dọc"] # 0x21ed (en: 'upwards white arrow on pedestal with vertical bar') + - "⇼": [t: "mĆ©i tĂȘn đîi mĂ u tráșŻng"] # 0x21ee (en: 'upwards white double arrow') + - "⇯": [t: "mĆ©i tĂȘn đîi mĂ u tráșŻng lĂȘn trĂȘn bệ"] # 0x21ef (en: 'upwards white double arrow on pedestal') + - "⇰": [t: "mĆ©i tĂȘn tráșŻng bĂȘn pháșŁi từ tường"] # 0x21f0 (en: 'rightwards white arrow from wall') + - "⇱": [t: "mĆ©i tĂȘn tĂąy báșŻc đáșżn gĂłc"] # 0x21f1 (en: 'north west arrow to corner') + - "â‡Č": [t: "mĆ©i phĂ­a đîng mĆ©i tĂȘn đáșżn gĂłc"] # 0x21f2 (en: 'south east arrow to corner') + - "⇳": [t: "lĂȘn mĆ©i tĂȘn tráșŻng"] # 0x21f3 (en: 'up down white arrow') + - "⇮": [t: "mĆ©i tĂȘn pháșŁi với vĂČng trĂČn nhỏ"] # 0x21f4 (en: 'right arrow with small circle') + - "⇔": [t: "mĆ©i tĂȘn xuống bĂȘn trĂĄi cá»§a mĆ©i tĂȘn hướng lĂȘn"] # 0x21f5 (en: 'downwards arrow leftwards of upwards arrow') + - "⇶": [t: "ba mĆ©i tĂȘn pháșŁi"] # 0x21f6 (en: 'three rightwards arrows') + - "⇷": [t: "mĆ©i tĂȘn trĂĄi với gáșĄch dọc"] # 0x21f7 (en: 'leftwards arrow with vertical stroke') + - "⇾": [t: "mĆ©i tĂȘn pháșŁi với gáșĄch dọc"] # 0x21f8 (en: 'rightwards arrow with vertical stroke') + - "â‡č": [t: "mĆ©i tĂȘn trĂĄi bĂȘn trĂĄi với gáșĄch dọc"] # 0x21f9 (en: 'left right arrow with vertical stroke') + - "â‡ș": [t: "mĆ©i tĂȘn trĂĄi với gáșĄch dọc"] # 0x21fa (en: 'leftwards arrow with double vertical stroke') + - "⇻": [t: "mĆ©i tĂȘn pháșŁi với gáșĄch dọc"] # 0x21fb (en: 'rightwards arrow with double vertical stroke') + - "⇌": [t: "mĆ©i tĂȘn trĂĄi bĂȘn trĂĄi với gáșĄch dọc"] # 0x21fc (en: 'left right arrow with double vertical stroke') + - "⇜": [t: "mĆ©i tĂȘn mở bĂȘn trĂĄi"] # 0x21fd (en: 'leftwards open headed arrow') + - "⇟": [t: "mĆ©i tĂȘn mở bĂȘn pháșŁi"] # 0x21fe (en: 'rightwards open headed arrow') + - "⇿": [t: "bĂȘn trĂĄi mĆ©i tĂȘn mở đáș§u"] # 0x21ff (en: 'left right open headed arrow') + - "∁": # 0x2201 + - test: + if: "$Verbosity!='Terse'" + then: [t: "cĂĄc"] # (en: 'the') + - t: "bổ sung" # (en: 'complement of') + - "∋": [t: "chứa thĂ nh viĂȘn"] # 0x220b (en: 'contains the member') + - "∌": [t: "khĂŽng chứa thĂ nh viĂȘn"] # 0x220c (en: 'does not contain the member') + - "∍": [t: "chứa thĂ nh viĂȘn"] # 0x220d (en: 'contains the member') + - "∎": [t: "káșżt thĂșc báș±ng chứng"] # 0x220e (en: 'end of proof') + - "∔": [t: "dot plus"] # 0x2214 + - "∕": [T: "chia"] # 0x2215 + - "∖": [t: "hiệu"] # 0x2216 (en: 'set minus') + - "∙": [T: "nhĂąn"] # 0x2219 + - "∛": # 0x221b + - test: + if: "$Verbosity!='Terse'" + then: [t: "cĂĄc"] # (en: 'the') + - t: "rễ khối cá»§a" # (en: 'cube root of') + - "∜": # 0x221c + - test: + if: "$Verbosity!='Terse'" + then: [t: "cĂĄc"] # (en: 'the') + - t: "gốc thứ tư cá»§a" # (en: 'fourth root of') + - "∹": [t: "gĂłc hĂŹnh cáș§u"] # 0x2222 (en: 'spherical angle') + - "∯": [t: "tĂ­ch hợp bề máș·t"] # 0x222f (en: 'surface integral') + - "∰": [t: "khối lÆ°á»Łng tĂ­ch phĂąn"] # 0x2230 (en: 'volume integral') + - "∱": [t: "tĂ­ch hợp theo chiều kim đồng hồ"] # 0x2231 (en: 'clockwise integral') + - "âˆČ": [t: "tĂ­ch hợp đường viền theo chiều kim đồng hồ"] # 0x2232 (en: 'clockwise contour integral') + - "∳": [t: "tĂ­ch hợp đường viền ngÆ°á»Łc chiều kim đồng hồ"] # 0x2233 (en: 'anticlockwise contour integral') + - "∎": [t: "vĂŹ tháșż"] # 0x2234 (en: 'therefore') + - "∔": [t: "táșĄi vĂŹ"] # 0x2235 (en: 'because') + - "∞": [t: "cháș„m trừ"] # 0x2238 (en: 'dot minus') + - "âˆč": [t: "cĂł dư thừa so với"] # 0x2239 (en: 'has excess compared to') + - "âˆș": # 0x223a + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ  thuáș­n lợi về máș·t hĂŹnh học"] # (en: 'is geometrically proportinal to') + - "∻": # 0x223b + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ  homothetic để"] # (en: 'is homothetic to') + - "≀": [t: "sáșŁn pháș©m vĂČng hoa"] # 0x2240 (en: 'wreath product') + - "≁": [t: "khĂŽng pháșŁi tilde"] # 0x2241 (en: 'not tilde') + - "≂": [t: "trừ tilde"] # 0x2242 (en: 'minus tilde') + - "≃": # 0x2243 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ  khĂŽng cĂł triệu chứng báș±ng"] # (en: 'is asymptotically equal to') + - "≄": # 0x2244 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "khĂŽng cĂł triệu chứng báș±ng" # (en: 'not asymptotically equal to') + - "≅": # 0x2245 + - test: + if: "$Verbosity!='Terse'" + then: [t: "xáș„p xỉ báș±ng"] # (en: 'is approximately equal to') + - "≆": # 0x2246 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "xáș„p xỉ nhưng khĂŽng thá»±c sá»± báș±ng" # (en: 'approximately but not actually equal to') + - "≇": # 0x2247 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "khĂŽng xáș„p xỉ cĆ©ng khĂŽng thá»±c sá»± báș±ng" # (en: 'neither approximately nor actually equal to') + - "≈": # 0x2248 + - test: + if: "$Verbosity!='Terse'" + then: [t: "xáș„p xỉ"] # (en: 'is almost equal to') + - "≉": # 0x2249 + - test: + if: "$Verbosity!='Terse'" + then: [t: " "] # (en: 'is') + - t: "khĂŽng gáș§n báș±ng" # (en: 'not almost equal to') + - "≊": # 0x224a + - test: + if: "$Verbosity!='Terse'" + then: [t: "xáș„p xỉ hoáș·c báș±ng"] # (en: 'is almost equal or equal to') + - "≋": [t: "triple tilde"] # 0x224b + - "≌": [t: "đều báș±ng"] # 0x224c (en: 'are all equal to') + - "≍": # 0x224d + - test: + if: "$Verbosity!='Terse'" + then: [t: "tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # (en: 'is equivalent to') + - "≎": # 0x224e + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ  tÆ°ÆĄng Ä‘Æ°ÆĄng về máș·t hĂŹnh học"] # (en: 'is geometrically equivalent to') + - "≏": # 0x224f + - test: + if: "$Verbosity!='Terse'" + then: [t: "cĂĄc"] # (en: 'the') + - t: "sá»± khĂĄc biệt giữa" # (en: 'difference between') + - "≐": [t: "tiáșżp cáș­n giới háșĄn"] # 0x2250 (en: 'approaches the limit') + - "≑": # 0x2251 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ  báș±ng hĂŹnh học báș±ng"] # (en: 'is geometrically equal to') + - "≒": # 0x2252 + - test: + if: "$Verbosity!='Terse'" + then: [t: "xáș„p xỉ báș±ng hoáș·c hĂŹnh áșŁnh cá»§a"] # (en: 'is approximately equal to or the image of') + - "≓": # 0x2253 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ  hĂŹnh áșŁnh hoáș·c xáș„p xỉ báș±ng"] # (en: 'is the image of or approximately equal to') + - "≔": [t: "đáșĄi tĂĄ báș±ng"] # 0x2254 (en: 'colon equals') + - "≕": [t: "báș±ng đáșĄi trĂ ng"] # 0x2255 (en: 'equals colon') + - "≖": [t: "nháș«n báș±ng"] # 0x2256 (en: 'ring in equal to') + - "≗": # 0x2257 + - test: + if: "$Verbosity!='Terse'" + then: [t: "xáș„p xỉ báș±ng"] # (en: 'is approximately equal to') + - "≘": [t: "tÆ°ÆĄng ứng với"] # 0x2258 (en: 'corresponds to') + - "≙": [t: "ước tĂ­nh"] # 0x2259 (en: 'estimates') + - "≚": # 0x225a + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ  tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # (en: 'is equiangular to') + - "≛": [t: "ngĂŽi sao báș±ng"] # 0x225b (en: 'star equals') + - "≜": [t: "đen ta báș±ng"] # 0x225c (en: 'delta equals') + - "≝": [t: "Ä‘Æ°á»Łc xĂĄc định lĂ  Ä‘Æ°á»Łc"] # 0x225d (en: 'is defined to be') + - "≞": # 0x225e + - test: + if: "$Verbosity!='Terse'" + then: [t: "Ä‘Æ°á»Łc đo báș±ng"] # (en: 'is measured by') + - "≟": [t: "cĂł một mối quan hệ khĂŽng xĂĄc định với"] # 0x225f (en: 'has an unknown relationship with') + - "≱": # 0x2262 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "khĂŽng giống hệt nhau" # (en: 'not identical to') + - "≣": # 0x2263 + - test: + if: "$Verbosity!='Terse'" + then: [t: "hoĂ n toĂ n tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # (en: 'is strictly equivalent to') + - "≹": # 0x2268 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ  Ă­t hÆĄn nhưng khĂŽng báș±ng"] # (en: 'is less than but not equal to') + - "≩": # 0x2269 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lớn hÆĄn nhưng khĂŽng báș±ng"] # (en: 'is greater than but not equal to') + - "â‰Ș": # 0x226a + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ  Ă­t hÆĄn nhiều"] # (en: 'is much less than') + - "≫": # 0x226b + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ  lớn hÆĄn nhiều so với"] # (en: 'is much greater than') + - "≬": # 0x226c + - test: + if: "$Verbosity!='Terse'" + then: [t: "ở giữa"] # (en: 'is between') + - "≭": # 0x226d + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với" # (en: 'not equivalent to') + - "≼": # 0x226e + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "khĂŽng Ă­t hÆĄn" # (en: 'not less than') + - "≯": # 0x226f + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "khĂŽng lớn hÆĄn" # (en: 'not greater than') + - "≰": # 0x2270 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "khĂŽng Ă­t hÆĄn cĆ©ng khĂŽng báș±ng" # (en: 'neither less than nor equal to') + - "≱": # 0x2271 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "khĂŽng lớn hÆĄn cĆ©ng khĂŽng báș±ng" # (en: 'neither greater than nor equal to') + - "â‰Č": # 0x2272 + - test: + if: "$Verbosity!='Terse'" + then: [t: "Ă­t hÆĄn hoáș·c tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # (en: 'is less than or equivalent to') + - "≳": # 0x2273 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lớn hÆĄn hoáș·c tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # (en: 'is greater than or equivalent to') + - "≮": # 0x2274 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "khĂŽng Ă­t hÆĄn cĆ©ng khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với" # (en: 'neither less than nor equivalent to') + - "≔": # 0x2275 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "khĂŽng lớn hÆĄn cĆ©ng khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với" # (en: 'neither greater than nor equivalent to') + - "≶": # 0x2276 + - test: + if: "$Verbosity!='Terse'" + then: [t: "nhỏ hÆĄn hoáș·c lớn hÆĄn"] # (en: 'is less than or greater than') + - "≷": # 0x2277 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lớn hÆĄn hoáș·c Ă­t hÆĄn"] # (en: 'is greater than or less than') + - "≾": # 0x2278 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "khĂŽng Ă­t hÆĄn cĆ©ng khĂŽng lớn hÆĄn" # (en: 'neither less than nor greater than') + - "â‰č": # 0x2279 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "khĂŽng lớn hÆĄn cĆ©ng khĂŽng Ă­t hÆĄn" # (en: 'neither greater than nor less than') + - "≌": [t: "trước hoáș·c báș±ng"] # 0x227c (en: 'precedes or is equal to') + - "≜": [t: "thĂ nh cĂŽng hoáș·c báș±ng"] # 0x227d (en: 'succeeds or is equal to') + - "≟": [t: "trước hoáș·c tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0x227e (en: 'precedes or is equivalent to') + - "≿": [t: "thĂ nh cĂŽng hoáș·c tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0x227f (en: 'succeeds or is equivalent to') + - "⊀": [t: "khĂŽng đi trước"] # 0x2280 (en: 'does not precede') + - "⊁": [t: "khĂŽng thĂ nh cĂŽng"] # 0x2281 (en: 'does not succeed') + - "⊈": # 0x2288 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "khĂŽng pháșŁi lĂ  một táș­p hợp con cĆ©ng khĂŽng báș±ng" # (en: 'neither a subset of nor equal to') + - "⊉": # 0x2289 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "khĂŽng pháșŁi lĂ  một siĂȘu sao cĆ©ng khĂŽng báș±ng" # (en: 'neither a superset of nor equal to') + - "⊊": [t: "táș­p hợp con khĂŽng báș±ng"] # 0x228a (en: 'subset of with not equal to') + - "⊋": [t: "superset cá»§a khĂŽng báș±ng"] # 0x228b (en: 'superset of with not equal to') + - "⊌": [t: "multiset"] # 0x228c + - "⊍": [t: "nhĂąn đa nhĂąn"] # 0x228d (en: 'multiset multiplication') + - "⊎": [t: "liĂȘn minh multiset"] # 0x228e (en: 'multiset union') + - "⊏": [t: "hĂŹnh áșŁnh vuĂŽng cá»§a"] # 0x228f (en: 'square image of') + - "⊐": [t: "báșŁn gốc vuĂŽng cá»§a"] # 0x2290 (en: 'square original of') + - "⊑": [t: "hĂŹnh áșŁnh vuĂŽng hoáș·c báș±ng"] # 0x2291 (en: 'square image of or equal to') + - "⊒": [t: "báșŁn gốc vuĂŽng hoáș·c báș±ng"] # 0x2292 (en: 'square original of or equal to') + - "⊓": [t: "square flowase"] # 0x2293 (en: 'square cap') + - "⊔": [t: "cốc vuĂŽng"] # 0x2294 (en: 'square cup') + - "⊕": [t: "bao quanh cộng"] # 0x2295 (en: 'circled plus') + - "⊖": [t: "khoanh trĂČn trừ đi"] # 0x2296 (en: 'circled minus') + - "⊗": [t: "thời gian khoanh trĂČn"] # 0x2297 (en: 'circled times') + - "⊘": [t: "chia"] # 0x2298 (en: 'circled slash') + - "⊙": [t: "toĂĄn tá»­ cháș„m Ä‘Æ°á»Łc khoanh trĂČn"] # 0x2299 (en: 'circled dot operator') + - "⊚": [t: "vĂČng trĂČn"] # 0x229a (en: 'circled ring') + - "⊛": [t: "asterisk bao quanh"] # 0x229b (en: 'circled asterisk') + - "⊜": [t: "Ä‘Æ°á»Łc khoanh trĂČn báș±ng"] # 0x229c (en: 'circled equals') + - "⊝": [t: "dash Ä‘Æ°á»Łc khoanh trĂČn"] # 0x229d (en: 'circled dash') + - "⊞": [t: "bĂŹnh phÆ°ÆĄng cộng"] # 0x229e (en: 'squared plus') + - "⊟": [t: "bĂŹnh phÆ°ÆĄng trừ"] # 0x229f (en: 'squared minus') + - "⊠": [t: "thời gian bĂŹnh phÆ°ÆĄng"] # 0x22a0 (en: 'squared times') + - "⊡": [t: "toĂĄn tá»­ dot squared"] # 0x22a1 (en: 'squared dot operator') + - "⊱": [t: "chứng minh"] # 0x22a2 (en: 'proves') + - "⊣": [t: "khĂŽng mang láșĄi"] # 0x22a3 (en: 'does not yield') + - "⊀": [t: "đứng đáș§u"] # 0x22a4 (en: 'top') + - "⊄": # 0x22a5 + - test: + if: "$Verbosity!='Terse'" + then: [t: "đáy"] # (en: 'is bottom') + - "⊩": [t: "giáșŁm xuống"] # 0x22a6 (en: 'reduces to') + - "⊧": [t: "mĂŽ hĂŹnh"] # 0x22a7 (en: 'models') + - "⊹": # 0x22a8 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "đĂșng váș­y" # (en: 'true') + - "⊩": [t: "lá»±c lÆ°á»Łng"] # 0x22a9 (en: 'forces') + - "âŠȘ": [t: "thanh ba tháșłng đứng phĂ­a bĂȘn pháșŁi"] # 0x22aa (en: 'triple vertical bar right turnstile') + - "⊫": [t: "thanh dọc theo kĂ©p ráșœ pháșŁi"] # 0x22ab (en: 'double vertical bar double right turnstile') + - "⊬": [t: "khĂŽng chứng minh"] # 0x22ac (en: 'does not prove') + - "⊭": # 0x22ad + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "khĂŽng đĂșng" # (en: 'not true') + - "⊼": [t: "khĂŽng Ă©p buộc"] # 0x22ae (en: 'does not force') + - "⊯": [t: "thanh dọc Ä‘Æ°á»Łc phá»§ định đîi bĂȘn pháșŁi turnstile"] # 0x22af (en: 'negated double vertical bar double right turnstile') + - "⊰": [t: "trước mối quan hệ"] # 0x22b0 (en: 'precedes under relation') + - "⊱": [t: "thĂ nh cĂŽng dưới sá»± quan hệ"] # 0x22b1 (en: 'succeeds under relation') + - "âŠČ": # 0x22b2 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "một nhĂłm con bĂŹnh thường cá»§a" # (en: 'a normal subgroup of') + - "⊳": [t: "chứa như một nhĂłm con bĂŹnh thường"] # 0x22b3 (en: 'contains as a normal subgroup') + - "⊮": # 0x22b4 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "một nhĂłm con bĂŹnh thường hoáș·c báș±ng" # (en: 'a normal subgroup of or equal to') + - "⊔": [t: "chứa một nhĂłm con bĂŹnh thường hoáș·c báș±ng"] # 0x22b5 (en: 'contains as a normal subgroup or equal to') + - "⊶": # 0x22b6 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "báșŁn gốc cá»§a" # (en: 'the original of') + - "⊷": # 0x22b7 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "một hĂŹnh áșŁnh cá»§a" # (en: 'an image of') + - "⊾": [t: "multimap"] # 0x22b8 + - "âŠč": [t: "ma tráș­n liĂȘn hợp hermitian"] # 0x22b9 (en: 'hermitian conjugate matrix') + - "âŠș": [t: "xen káșœ"] # 0x22ba (en: 'intercalate') + - "⊻": [t: "xor"] # 0x22bb + - "⊌": [t: "nand"] # 0x22bc + - "⊜": [t: "cĆ©ng khĂŽng"] # 0x22bd (en: 'nor') + - "⊟": [t: "gĂłc vuĂŽng với hồ quang"] # 0x22be (en: 'right angle with arc') + - "⊿": [t: "tam giĂĄc vuĂŽng"] # 0x22bf (en: 'right triangle') + - "⋀": [t: "hợp lĂœ vĂ "] # 0x22c0 (en: 'logical and') + - "⋁": [t: "hợp lĂœ hoáș·c"] # 0x22c1 (en: 'logical or') + - "⋂": [t: "ngĂŁ tư"] # 0x22c2 (en: 'intersection') + - "⋃": [t: "liĂȘn hiệp"] # 0x22c3 (en: 'union') + - "⋄": [t: "người váș­n hĂ nh kim cÆ°ÆĄng"] # 0x22c4 (en: 'diamond operator') + - "⋅": [T: "nhĂąn"] # 0x22c5 + - "⋆": [T: "nhĂąn"] # 0x22c6 + - "⋇": [T: "nhĂąn chia"] # 0x22c7 (en: 'division times') + - "⋈": [t: "bowtie"] # 0x22c8 + - "⋉": # 0x22c9 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "cĂĄc yáșżu tố bĂŹnh thường bĂȘn trĂĄi sáșŁn pháș©m cá»§a" # (en: 'the left normal factor semidirect product of') + - "⋊": # 0x22ca + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "cĂĄc yáșżu tố bĂŹnh thường đĂșng sáșŁn pháș©m cá»§a" # (en: 'the right normal factor semidirect product of') + - "⋋": # 0x22cb + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "sáșŁn pháș©m bĂĄn káșżt trĂĄi cá»§a" # (en: 'the left semidirect product of') + - "⋌": # 0x22cc + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "sáșŁn pháș©m bĂĄn káșżt đĂșng cá»§a" # (en: 'the right semidirect product of') + - "⋍": [t: "tilde đáșŁo ngÆ°á»Łc báș±ng"] # 0x22cd (en: 'reversed tilde equals') + - "⋎": [t: "xoăn logic hoáș·c"] # 0x22ce (en: 'curly logical or') + - "⋏": [t: "xoăn logic vĂ "] # 0x22cf (en: 'curly logical and') + - "⋐": # 0x22d0 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "một táș­p hợp con kĂ©p cá»§a" # (en: 'a double subset of') + - "⋑": # 0x22d1 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "một siĂȘu siĂȘu nhĂąn cá»§a" # (en: 'a double superset of') + - "⋒": # 0x22d2 + - test: + if: "$Verbosity!='Terse'" + then: [t: "cĂĄc"] # (en: 'the') + - t: "giao lộ kĂ©p cá»§a" # (en: 'double intersection of') + - "⋓": # 0x22d3 + - test: + if: "$Verbosity!='Terse'" + then: [t: "cĂĄc"] # (en: 'the') + - t: "liĂȘn minh kĂ©p cá»§a" # (en: 'double union of') + - "⋔": # 0x22d4 + - test: + if: "$Verbosity!='Terse'" + then: [t: "cĂĄc"] # (en: 'the') + - t: "giao lộ thĂ­ch hợp cá»§a" # (en: 'proper intersection of') + - "⋕": # 0x22d5 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "báș±ng vĂ  song song với" # (en: 'equal to and parallel to') + - "⋖": [t: "Ă­t hÆĄn với dáș„u cháș„m"] # 0x22d6 (en: 'less than with dot') + - "⋗": [t: "lớn hÆĄn với dáș„u cháș„m"] # 0x22d7 (en: 'greater than with dot') + - "⋘": # 0x22d8 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "ráș„t Ă­t hÆĄn nhiều" # (en: 'very much less than') + - "⋙": # 0x22d9 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "ráș„t lớn hÆĄn nhiều so với" # (en: 'very much greater than') + - "⋚": # 0x22da + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "Ă­t hÆĄn báș±ng hoáș·c lớn hÆĄn" # (en: 'less than equal to or greater than') + - "⋛": # 0x22db + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "lớn hÆĄn báș±ng hoáș·c nhỏ hÆĄn" # (en: 'greater than equal to or less than') + - "⋜": # 0x22dc + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "báș±ng hoáș·c nhỏ hÆĄn" # (en: 'equal to or less than') + - "⋝": # 0x22dd + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "báș±ng hoáș·c lớn hÆĄn" # (en: 'equal to or greater than') + - "⋞": # 0x22de + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "báș±ng hoáș·c trước" # (en: 'equal to or precedes') + - "⋟": # 0x22df + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "báș±ng hoáș·c thĂ nh cĂŽng" # (en: 'equal to or succeeds') + - "⋠": [t: "khĂŽng đi trước cĆ©ng như khĂŽng báș±ng"] # 0x22e0 (en: 'does not precede nor is equal to') + - "⋡": [t: "khĂŽng thĂ nh cĂŽng cĆ©ng như khĂŽng báș±ng"] # 0x22e1 (en: 'does not succeed nor is equal to') + - "⋱": [t: "khĂŽng pháșŁi hĂŹnh áșŁnh vuĂŽng hoáș·c báș±ng"] # 0x22e2 (en: 'not square image of or equal to') + - "⋣": [t: "khĂŽng pháșŁi báșŁn gốc vuĂŽng hoáș·c báș±ng"] # 0x22e3 (en: 'not square original of or equal to') + - "â‹€": [t: "hĂŹnh áșŁnh vuĂŽng hoáș·c khĂŽng báș±ng"] # 0x22e4 (en: 'square image of or not equal to') + - "â‹„": [t: "báșŁn gốc vuĂŽng hoáș·c khĂŽng báș±ng"] # 0x22e5 (en: 'square original of or not equal to') + - "⋩": # 0x22e6 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "Ă­t hÆĄn nhưng khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với" # (en: 'less than but not equivalent to') + - "⋧": # 0x22e7 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "lớn hÆĄn nhưng khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với" # (en: 'greater than but not equivalent to') + - "⋹": [t: "đi trước nhưng khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0x22e8 (en: 'precedes but is not equivalent to') + - "⋩": [t: "thĂ nh cĂŽng nhưng khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0x22e9 (en: 'succeeds but is not equivalent to') + - "â‹Ș": # 0x22ea + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "khĂŽng pháșŁi lĂ  một nhĂłm con bĂŹnh thường cá»§a" # (en: 'not a normal subgroup of') + - "⋫": [t: "khĂŽng chứa như một nhĂłm con bĂŹnh thường"] # 0x22eb (en: 'does not contain as a normal subgroup') + - "⋬": # 0x22ec + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "khĂŽng pháșŁi lĂ  một nhĂłm con bĂŹnh thường cĆ©ng khĂŽng báș±ng" # (en: 'not a normal subgroup of nor is equal to') + - "⋭": [t: "khĂŽng chứa như một nhĂłm con bĂŹnh thường cĆ©ng như khĂŽng báș±ng"] # 0x22ed (en: 'does not contain as a normal subgroup nor is equal to') + - "⋼": [T: "chia háșżt cho"] # 0x22ee (en: 'vertical ellipsis') + - "⋯": [t: "cháș„m cháș„m cháș„m"] # 0x22ef (en: 'dot dot dot') + - "⋰": [t: "elip chĂ©o lĂȘn trĂȘn"] # 0x22f0 (en: 'upwards diagonal ellipsis') + - "⋱": [t: "dáș„u cháș„m lá»­ng chĂ©o"] # 0x22f1 (en: 'diagonal ellipsis') + - "â‹Č": [t: "yáșżu tố cá»§a với gáșĄch ngang dĂ i"] # 0x22f2 (en: 'element of with long horizontal stroke') + - "⋳": [t: "yáșżu tố cá»§a thanh dọc ở cuối gáșĄch ngang"] # 0x22f3 (en: 'element of with vertical bar at end of horizontal stroke') + - "⋮": [t: "yáșżu tố cá»§a thanh dọc ở cuối gáșĄch ngang"] # 0x22f4 (en: 'element of with vertical bar at end of horizontal stroke') + - "â‹”": [t: "pháș§n tá»­ cá»§a với dáș„u cháș„m ở trĂȘn"] # 0x22f5 (en: 'element of with dot above') + - "⋶": [t: "yáșżu tố cá»§a với overbar"] # 0x22f6 (en: 'element of with overbar') + - "⋷": [t: "yáșżu tố cá»§a với overbar"] # 0x22f7 (en: 'element of with overbar') + - "⋾": [t: "yáșżu tố cá»§a với atarbar"] # 0x22f8 (en: 'element of with underbar') + - "â‹č": [t: "yáșżu tố cá»§a hai nĂ©t ngang"] # 0x22f9 (en: 'element of with two horizontal strokes') + - "â‹ș": [t: "chứa với gáșĄch ngang dĂ i"] # 0x22fa (en: 'contains with long horizontal stroke') + - "⋻": [t: "chứa với thanh dọc ở cuối gáșĄch ngang"] # 0x22fb (en: 'contains with vertical bar at end of horizontal stroke') + - "⋌": [t: "chứa với thanh dọc ở cuối gáșĄch ngang"] # 0x22fc (en: 'contains with vertical bar at end of horizontal stroke') + - "⋜": [t: "chứa với overbar"] # 0x22fd (en: 'contains with overbar') + - "⋟": [t: "chứa với overbar"] # 0x22fe (en: 'contains with overbar') + - "⋿": [t: "z kĂœ hiệu thĂ nh viĂȘn tĂși"] # 0x22ff (en: 'z notation bag membership') + - "⌀": [t: "đường kĂ­nh"] # 0x2300 (en: 'diameter') + - "⌁": [t: "mĆ©i tĂȘn điện"] # 0x2301 (en: 'electric arrow') + - "⌂": [t: "nhĂ  ở"] # 0x2302 (en: 'house') + - "⌃": [t: "lĂȘn đáș§u mĆ©i tĂȘn"] # 0x2303 (en: 'up arrowhead') + - "⌄": [t: "xuống đáș§u mĆ©i tĂȘn"] # 0x2304 (en: 'down arrowhead') + - "⌅": [t: "phĂłng chiáșżu"] # 0x2305 (en: 'projective') + - "⌆": [t: "luáș­t xa gáș§n"] # 0x2306 (en: 'perspective') + - "⌇": [t: "đường lÆ°á»Łn sĂłng"] # 0x2307 (en: 'wavy line') + - "⌈": [t: "tráș§n trĂĄi"] # 0x2308 (en: 'left ceiling') + - "⌉": [t: "tráș§n pháșŁi"] # 0x2309 (en: 'right ceiling') + - "⌊": [t: "táș§ng trĂĄi"] # 0x230a (en: 'left floor') + - "⌋": [t: "táș§ng pháșŁi"] # 0x230b (en: 'right floor') + - "⌌": [t: "đáy bĂȘn pháșŁi"] # 0x230c (en: 'bottom right crop') + - "⌍": [t: "cĂąy trồng phĂ­a dưới bĂȘn trĂĄi"] # 0x230d (en: 'bottom left crop') + - "⌎": [t: "cĂąy trồng trĂȘn cĂčng bĂȘn pháșŁi"] # 0x230e (en: 'top right crop') + - "⌏": [t: "cĂąy trồng trĂȘn cĂčng bĂȘn trĂĄi"] # 0x230f (en: 'top left crop') + - "⌐": [t: "đáșŁo ngÆ°á»Łc khĂŽng kĂœ"] # 0x2310 (en: 'reversed not sign') + - "⌑": [t: "hĂŹnh vuĂŽng"] # 0x2311 (en: 'square lozenge') + - "⌒": [t: "cung"] # 0x2312 (en: 'arc') + - "⌓": [t: "bộ pháș­n"] # 0x2313 (en: 'segment') + - "⌔": [t: "khu vá»±c"] # 0x2314 (en: 'sector') + - "⌕": [t: "mĂĄy ghi Ăąm điện thoáșĄi"] # 0x2315 (en: 'telephone recorder') + - "⌖": [t: "chỉ số vị trĂ­ crosshairs"] # 0x2316 (en: 'position indicator crosshairs') + - "⌗": [t: "quáșŁng trường viewdata"] # 0x2317 (en: 'viewdata square') + - "⌘": [t: "nÆĄi cĂł dáș„u hiệu quan tĂąm"] # 0x2318 (en: 'place of interest sign') + - "⌙": [t: "biáșżn khĂŽng kĂœ"] # 0x2319 (en: 'turned not sign') + - "⌚": [t: "đồng hồ"] # 0x231a (en: 'watch') + - "⌛": [t: "đồng hồ cĂĄt"] # 0x231b (en: 'hourglass') + - "⌜": [t: "gĂłc trĂȘn bĂȘn trĂĄi"] # 0x231c (en: 'top left corner') + - "⌝": [t: "gĂłc trĂȘn bĂȘn pháșŁi"] # 0x231d (en: 'top right corner') + - "⌞": [t: "gĂłc dưới bĂȘn trĂĄi"] # 0x231e (en: 'bottom left corner') + - "⌟": [t: "gĂłc dưới bĂȘn pháșŁi"] # 0x231f (en: 'bottom right corner') + - "⌠": [t: "ná»­a đáș§u tĂ­ch phĂąn"] # 0x2320 (en: 'top half integral') + - "⌡": [t: "ná»­a dưới tĂ­ch phĂąn"] # 0x2321 (en: 'bottom half integral') + - "⌱": [t: "nhăn máș·t"] # 0x2322 (en: 'frown') + - "⌣": [t: "nỄ cười"] # 0x2323 (en: 'smile') + - "⌀": [t: "lĂȘn đáș§u mĆ©i tĂȘn giữa hai thanh ngang"] # 0x2324 (en: 'up arrowhead between two horizontal bars') + - "⌄": [t: "khĂła tĂčy chọn"] # 0x2325 (en: 'option key') + - "〈": [t: "xĂła sang pháșŁi"] # 0x2326 (en: 'erase to the right') + - "⌧": [t: "x trong một hộp hĂŹnh chữ nháș­t"] # 0x2327 (en: 'x in a rectangle box') + - "⌹": [t: "bĂ n phĂ­m"] # 0x2328 (en: 'keyboard') + - "〈": [t: "bĂȘn trĂĄi chỉ khung gĂłc"] # 0x2329 (en: 'left pointing angle bracket') + - "âŒȘ": [t: "bĂȘn pháșŁi gĂłc khung"] # 0x232a (en: 'right pointing angle bracket') + - "⌫": [t: "xĂła sang trĂĄi"] # 0x232b (en: 'erase to the left') + - "⌬": [t: "vĂČng benzen"] # 0x232c (en: 'benzene ring') + - "⌭": [t: "hĂŹnh trỄ"] # 0x232d (en: 'cylindricity') + - "⌼": [t: "táș„t cáșŁ xung quanh hồ sÆĄ"] # 0x232e (en: 'all around profile') + - "⌯": [t: "đối diện"] # 0x232f (en: 'symmetry') + - "⌰": [t: "tổng số cháșĄy"] # 0x2330 (en: 'total runout') + - "⌱": [t: "nguồn gốc kĂ­ch thước"] # 0x2331 (en: 'dimension origin') + - "âŒČ": [t: "hĂŹnh nĂłn cĂŽn"] # 0x2332 (en: 'conical taper') + - "⌳": [t: "dốc"] # 0x2333 (en: 'slope') + - "⌮": [t: "đối trọng"] # 0x2334 (en: 'counterbore') + - "⌔": [t: "cáș„m"] # 0x2335 (en: 'countersink') + - "⍰": [t: "hộp khĂŽng xĂĄc định"] # 0x2370 (en: 'unknown box') + - "⎕": [t: "hộp"] # 0x2395 (en: 'box') + - "⏜": [t: "cung"] # 0x23DC (en: 'top paren') + - "⏞": [t: "náșčp trĂȘn cĂčng"] # 0x23DE (en: 'top brace') + - "⏟": [t: "niềng răng dưới cĂčng"] # 0x23DF (en: 'bottom brace') + - "①-⑹": # 0x2460 - 0x2469 + - t: "khoanh trĂČn" # (en: 'circled') + - spell: "translate('.', '①⑥⑹④⑀⑄⑊⑧⑚', '123456789')" + - "⑩": [t: "bao quanh mười"] # 0x2469 (en: 'circled ten') + - "â‘Ș": [t: "vĂČng mười một"] # 0x246a (en: 'circled eleven') + - "⑫": [t: "bao quanh mười hai"] # 0x246b (en: 'circled twelve') + - "⑬": [t: "bao quanh mười ba"] # 0x246c (en: 'circled thirteen') + - "⑭": [t: "vĂČng mười bốn"] # 0x246d (en: 'circled fourteen') + - "⑼": [t: "bao quanh mười lăm"] # 0x246e (en: 'circled fifteen') + - "⑯": [t: "vĂČng mười sĂĄu"] # 0x246f (en: 'circled sixteen') + - "⑰": [t: "vĂČng mười báșŁy"] # 0x2470 (en: 'circled seventeen') + - "⑱": [t: "khoanh trĂČn ateen"] # 0x2471 (en: 'circled eighteen') + - "⑱": [t: "vĂČng mười chĂ­n"] # 0x2471 (en: 'circled nineteen') + - "⑳": [t: "bao quanh hai mÆ°ÆĄi"] # 0x2473 (en: 'circled twenty') + - "⑮-⑌": # 0x2474 - 0x247d + - t: "dáș„u ngoáș·c Ä‘ÆĄn" # (en: 'parenthesized') + - spell: "translate('.', '⑎⑔⑶⑷⑞â‘čâ‘ș⑻⑌', '123456789')" + - "⑜": [t: "dáș„u ngoáș·c Ä‘ÆĄn mười"] # 0x247d (en: 'parenthesized ten') + - "⑟": [t: "dáș„u ngoáș·c Ä‘ÆĄn mười một"] # 0x247e (en: 'parenthesized eleven') + - "⑿": [t: "dáș„u ngoáș·c Ä‘ÆĄn mười hai"] # 0x247f (en: 'parenthesized twelve') + - "⒀": [t: "ngoáș·c Ä‘ÆĄn mười ba"] # 0x2480 (en: 'parenthesized thirteen') + - "⒁": [t: "dáș„u ngoáș·c Ä‘ÆĄn mười bốn"] # 0x2481 (en: 'parenthesized fourteen') + - "⒂": [t: "dáș„u ngoáș·c Ä‘ÆĄn mười lăm"] # 0x2482 (en: 'parenthesized fifteen') + - "⒃": [t: "dáș„u ngoáș·c Ä‘ÆĄn mười sĂĄu"] # 0x2483 (en: 'parenthesized sixteen') + - "⒄": [t: "dáș„u ngoáș·c Ä‘ÆĄn mười báșŁy"] # 0x2484 (en: 'parenthesized seventeen') + - "⒅": [t: "dáș„u ngoáș·c Ä‘ÆĄn ateen"] # 0x2485 (en: 'parenthesized eighteen') + - "⒆": [t: "dáș„u ngoáș·c Ä‘ÆĄn mười chĂ­n"] # 0x2486 (en: 'parenthesized nineteen') + - "⒇": [t: "ngoáș·c Ä‘ÆĄn hai mÆ°ÆĄi"] # 0x2487 (en: 'parenthesized twenty') + - "⒈-⒐": # 0x2488 - 0x2491 + - spell: "translate('.', '⒈⒉⒊⒋⒌⒍⒎⒏⒐', '123456789')" + - t: "với thời gian" # (en: 'with period') + - "⒑": [t: "mười với thời gian"] # 0x2491 (en: 'ten with period') + - "⒒": [t: "mười một với thời gian"] # 0x2492 (en: 'eleven with period') + - "⒓": [t: "mười hai với thời gian"] # 0x2493 (en: 'twelve with period') + - "⒔": [t: "mười ba với thời gian"] # 0x2494 (en: 'thirteen with period') + - "⒕": [t: "mười bốn với thời gian"] # 0x2495 (en: 'fourteen with period') + - "⒖": [t: "mười lăm với thời gian"] # 0x2496 (en: 'fifteen with period') + - "⒗": [t: "mười sĂĄu thời gian"] # 0x2497 (en: 'sixteen with period') + - "⒘": [t: "mười báșŁy với thời gian"] # 0x2498 (en: 'seventeen with period') + - "⒙": [t: "ateen cĂł thời gian"] # 0x2499 (en: 'eighteen with period') + - "⒚": [t: "mười chĂ­n với thời gian"] # 0x249a (en: 'nineteen with period') + - "⒛": [t: "hai mÆ°ÆĄi với thời gian"] # 0x249b (en: 'twenty with period') + - "⒜-â’”": # 0x249c - 0x24b5 + - t: "dáș„u ngoáș·c Ä‘ÆĄn" # (en: 'parenthesized') + - spell: "translate('.', 'â’œâ’â’žâ’Ÿâ’ â’Ąâ’ąâ’Łâ’€â’„â’Šâ’§â’šâ’©â’Șâ’«â’Źâ’­â’źâ’Żâ’°â’±â’Čâ’łâ’Žâ’”', 'abcdefghijklmnopqrstuvwxyz')" + + - "Ⓐ-Ⓩ": + - t: "khoanh trĂČn" # (en: 'circled') + - spell: "translate('.', 'â’¶â’·â’žâ’čâ’șâ’»â’Œâ’œâ’Ÿâ’żâ“€â“â“‚â“ƒâ“„â“…â“†â“‡â“ˆâ“‰â“Šâ“‹â“Œâ“â“Žâ“', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "🅐-đŸ…©": # 0x1f150 - 0x1f169 + - t: "khoanh trĂČn đen" # (en: 'black circled') + - spell: "translate('.', 'đŸ…đŸ…‘đŸ…’đŸ…“đŸ…”đŸ…•đŸ…–đŸ…—đŸ…˜đŸ…™đŸ…šđŸ…›đŸ…œđŸ…đŸ…žđŸ…ŸđŸ… đŸ…ĄđŸ…ąđŸ…ŁđŸ…€đŸ…„đŸ…ŠđŸ…§đŸ…šđŸ…©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "ⓐ-ⓩ": # 0x24d0 - 0x24e9 + - t: "khoanh trĂČn" # (en: 'circled') + - spell: "translate('.', 'â“â“‘â“’â““â“”â“•â“–â“—â“˜â“™â“šâ“›â“œâ“â“žâ“Ÿâ“ â“Ąâ“ąâ“Łâ“€â“„â“Šâ“§â“šâ“©', 'abcdefghijklmnopqrstuvwxyz')" + - "â“Ș": [t: "vĂČng trĂČn số khĂŽng"] # 0x24ea (en: 'circled zero') + - "⓫": [t: "mĂ u đen vĂČng mười một"] # 0x24eb (en: 'black circled eleven') + - "⓬": [t: "mười hai vĂČng mĂ u đen"] # 0x24ec (en: 'black circled twelve') + - "⓭": [t: "mười ba vĂČng mĂ u đen"] # 0x24ed (en: 'black circled thirteen') + - "⓼": [t: "mười bốn vĂČng mĂ u đen"] # 0x24ee (en: 'black circled fourteen') + - "⓯": [t: "mười lăm vĂČng mĂ u đen"] # 0x24ef (en: 'black circled fifteen') + - "⓰": [t: "mười sĂĄu vĂČng mĂ u đen"] # 0x24f0 (en: 'black circled sixteen') + - "⓱": [t: "mười báșŁy vĂČng mĂ u đen"] # 0x24f1 (en: 'black circled seventeen') + - "â“Č": [t: "mĂ u đen khoanh trĂČn ateen"] # 0x24f2 (en: 'black circled eighteen') + - "⓳": [t: "mười chĂ­n vĂČng mĂ u đen"] # 0x24f3 (en: 'black circled nineteen') + - "⓮": [t: "đen vĂČng hai mÆ°ÆĄi"] # 0x24f4 (en: 'black circled twenty') + - "â“”-ⓜ": # 0x24f5 - 0x24fe + - t: "gáș„p đîi khoanh trĂČn" # (en: 'double circled') + - spell: "translate('.', 'ⓔ⓶⓷ⓞâ“čâ“ș⓻Ⓦⓜ', '123456789')" + - "ⓟ": [t: "gáș„p đîi vĂČng mười"] # 0x24fe (en: 'double circled ten') + - "⓿": [t: "mĂ u đen vĂČng khĂŽng"] # 0x24ff (en: 'black circled zero') + - "■": [t: "quáșŁng trường đen"] # 0x25a0 (en: 'black square') + - "□": [t: "quáșŁng trường tráșŻng"] # 0x25a1 (en: 'white square') + - "▱": [t: "quáșŁng trường tráșŻng với cĂĄc gĂłc trĂČn"] # 0x25a2 (en: 'white square with rounded corners') + - "▣": [t: "quáșŁng trường tráșŻng chứa hĂŹnh vuĂŽng nhỏ mĂ u đen"] # 0x25a3 (en: 'white square containing small black square') + - "â–€": [t: "hĂŹnh vuĂŽng với láș„p đáș§y ngang"] # 0x25a4 (en: 'square with horizontal fill') + - "â–„": [t: "hĂŹnh vuĂŽng với điền vĂ o đỉnh"] # 0x25a5 (en: 'square with verticle fill') + - "▩": [t: "hĂŹnh vuĂŽng với láș„p đáș§y hĂŹnh chữ tháș­p trá»±c giao"] # 0x25a6 (en: 'square with orthogonal crosshatch fill') + - "▧": [t: "hĂŹnh vuĂŽng với pháș§n trĂȘn bĂȘn trĂĄi đáșżn dưới bĂȘn pháșŁi"] # 0x25a7 (en: 'square with upper left to lower right fill') + - "▹": [t: "hĂŹnh vuĂŽng với pháș§n trĂȘn bĂȘn pháșŁi đáșżn tháș„p hÆĄn bĂȘn trĂĄi"] # 0x25a8 (en: 'square with upper right to lower left fill') + - "▩": [t: "hĂŹnh vuĂŽng với hĂŹnh chữ tháș­p chĂ©o"] # 0x25a9 (en: 'square with diagonal crosshatch fill') + - "â–Ș": [t: "quáșŁng trường nhỏ mĂ u đen"] # 0x25aa (en: 'black small square') + - "▫": [t: "quáșŁng trường nhỏ mĂ u tráșŻng"] # 0x25ab (en: 'white small square') + - "▬": [t: "hĂŹnh chữ nháș­t mĂ u đen"] # 0x25ac (en: 'black rectangle') + - "▭": [t: "hĂŹnh chữ nháș­t mĂ u tráșŻng"] # 0x25ad (en: 'white rectangle') + - "▼": [t: "hĂŹnh chữ nháș­t tháșłng đứng mĂ u đen"] # 0x25ae (en: 'black vertical rectangle') + - "▯": [t: "hĂŹnh chữ nháș­t tháșłng đứng mĂ u tráșŻng"] # 0x25af (en: 'white vertical rectangle') + - "▰": [t: "hĂŹnh bĂŹnh hĂ nh đen"] # 0x25b0 (en: 'black parallelogram') + - "▱": [t: "hĂŹnh bĂŹnh hĂ nh"] # 0x25b1 (en: 'white parallelogram') + - "â–Č": [t: "mĂ u đen lĂȘn tam giĂĄc"] # 0x25b2 (en: 'black up pointing triangle') + - "△": [t: "tam giĂĄc"] # 0x25b3 (en: 'white up pointing triangle') + - "▮": [t: "mĂ u đen lĂȘn hĂŹnh tam giĂĄc nhỏ"] # 0x25b4 (en: 'black up pointing small triangle') + - "â–”": [t: "tráșŻng lĂȘn hĂŹnh tam giĂĄc nhỏ"] # 0x25b5 (en: 'white up pointing small triangle') + - "▶": [t: "triangle chĂąn pháșŁi mĂ u đen"] # 0x25b6 (en: 'black right pointing triangle') + - "▷": [t: "tráșŻng pháșŁi hĂŹnh tam giĂĄc"] # 0x25b7 (en: 'white right pointing triangle') + - "▾": [t: "đen pháșŁi chỉ hĂŹnh tam giĂĄc nhỏ"] # 0x25b8 (en: 'black right pointing small triangle') + - "â–č": [t: "tráșŻng pháșŁi chỉ hĂŹnh tam giĂĄc nhỏ"] # 0x25b9 (en: 'white right pointing small triangle') + - "â–ș": [t: "đen bĂȘn pháșŁi trỏ trỏ"] # 0x25ba (en: 'black right pointing pointer') + - "▻": [t: "trao mĂ u tráșŻng trỏ"] # 0x25bb (en: 'white right pointing pointer') + - "â–Œ": [t: "mĂ u đen xuống hĂŹnh tam giĂĄc"] # 0x25bc (en: 'black down pointing triangle') + - "â–œ": [t: "tráșŻng xuống hĂŹnh tam giĂĄc"] # 0x25bd (en: 'white down pointing triangle') + - "â–Ÿ": [t: "đen xuống chỉ hĂŹnh tam giĂĄc nhỏ"] # 0x25be (en: 'black down pointing small triangle') + - "▿": [t: "tráșŻng xuống chỉ hĂŹnh tam giĂĄc nhỏ"] # 0x25bf (en: 'white down pointing small triangle') + - "◀": [t: "tam giĂĄc phĂ­a bĂȘn trĂĄi mĂ u đen"] # 0x25c0 (en: 'black left pointing triangle') + - "◁": [t: "tráșŻng bĂȘn trĂĄi hĂŹnh tam giĂĄc"] # 0x25c1 (en: 'white left pointing triangle') + - "◂": [t: "đen bĂȘn trĂĄi trỏ tam giĂĄc nhỏ"] # 0x25c2 (en: 'black left pointing small triangle') + - "◃": [t: "tráșŻng bĂȘn trĂĄi trỏ tam giĂĄc nhỏ"] # 0x25c3 (en: 'white left pointing small triangle') + - "◄": [t: "đen bĂȘn trĂĄi trỏ trỏ"] # 0x25c4 (en: 'black left pointing pointer') + - "◅": [t: "trao mĂ u tráșŻng trỏ"] # 0x25c5 (en: 'white left pointing pointer') + - "◆": [t: "kim cÆ°ÆĄng đen"] # 0x25c6 (en: 'black diamond') + - "◇": [t: "kim cÆ°ÆĄng tráșŻng"] # 0x25c7 (en: 'white diamond') + - "◈": [t: "kim cÆ°ÆĄng tráșŻng chứa kim cÆ°ÆĄng nhỏ mĂ u đen"] # 0x25c8 (en: 'white diamond containing black small diamond') + - "◉": [t: "cĂĄ"] # 0x25c9 (en: 'fisheye') + - "◊": [t: "hĂŹnh thoi"] # 0x25ca (en: 'lozenge') + - "○": [t: "vĂČng trĂČn mĂ u tráșŻng"] # 0x25cb (en: 'white circle') + - "◌": [t: "vĂČng trĂČn cháș„m"] # 0x25cc (en: 'dotted circle') + - "◍": [t: "vĂČng trĂČn với điền dọc"] # 0x25cd (en: 'circle with vertical fill') + - "◎": [t: "bullseye"] # 0x25ce + - "●": [t: "vĂČng trĂČn mĂ u đen"] # 0x25cf (en: 'black circle') + - "◐": [t: "vĂČng trĂČn với ná»­a mĂ u đen"] # 0x25d0 (en: 'circle with left half black') + - "◑": [t: "vĂČng trĂČn với ná»­a mĂ u đen bĂȘn pháșŁi"] # 0x25d1 (en: 'circle with right half black') + - "◒": [t: "vĂČng trĂČn với ná»­a mĂ u đen"] # 0x25d2 (en: 'circle with lower half black') + - "◓": [t: "vĂČng trĂČn với ná»­a mĂ u đen"] # 0x25d3 (en: 'circle with upper half black') + - "◔": [t: "vĂČng trĂČn với pháș§n tư phĂ­a trĂȘn bĂȘn pháșŁi mĂ u đen"] # 0x25d4 (en: 'circle with upper right quadrant black') + - "◕": [t: "vĂČng trĂČn với táș„t cáșŁ trừ pháș§n tư phĂ­a trĂȘn bĂȘn trĂĄi mĂ u đen"] # 0x25d5 (en: 'circle with all but upper left quadrant black') + - "◖": [t: "một ná»­a vĂČng trĂČn mĂ u đen"] # 0x25d6 (en: 'left half black circle') + - "◗": [t: "một ná»­a vĂČng trĂČn mĂ u đen"] # 0x25d7 (en: 'right half black circle') + - "◘": [t: "bullet nghịch đáșŁo"] # 0x25d8 (en: 'inverse bullet') + - "◙": [t: "vĂČng trĂČn tráșŻng nghịch đáșŁo"] # 0x25d9 (en: 'inverse white circle') + - "◚": [t: "vĂČng trĂČn mĂ u tráșŻng nghịch đáșŁo trĂȘn"] # 0x25da (en: 'upper half inverse white circle') + - "◛": [t: "vĂČng trĂČn tráșŻng ná»­a dưới"] # 0x25db (en: 'lower half inverse white circle') + - "◜": [t: "vĂČng cung vĂČng trĂČn phĂ­a trĂȘn bĂȘn trĂĄi"] # 0x25dc (en: 'upper left quadrant circular arc') + - "◝": [t: "vĂČng cung trĂČn gĂłc pháș§n tư phĂ­a trĂȘn bĂȘn pháșŁi"] # 0x25dd (en: 'upper right quadrant circular arc') + - "◞": [t: "hồ quang hĂŹnh trĂČn gĂłc pháș§n tư dưới bĂȘn pháșŁi"] # 0x25de (en: 'lower right quadrant circular arc') + - "◟": [t: "vĂČng cung trĂČn gĂłc dưới bĂȘn trĂĄi"] # 0x25df (en: 'lower left quadrant circular arc') + - "◠": [t: "vĂČng trĂČn trĂȘn"] # 0x25e0 (en: 'upper half circle') + - "◡": [t: "vĂČng trĂČn tháș„p hÆĄn"] # 0x25e1 (en: 'lower half circle') + - "◱": [t: "tam giĂĄc bĂȘn pháșŁi mĂ u đen"] # 0x25e2 (en: 'black lower right triangle') + - "◣": [t: "tam giĂĄc bĂȘn trĂĄi mĂ u đen"] # 0x25e3 (en: 'black lower left triangle') + - "â—€": [t: "tam giĂĄc mĂ u đen bĂȘn trĂĄi"] # 0x25e4 (en: 'black upper left triangle') + - "â—„": [t: "tam giĂĄc phĂ­a trĂȘn bĂȘn pháșŁi mĂ u đen"] # 0x25e5 (en: 'black upper right triangle') + - "◩": [t: "thĂ nh pháș§n"] # 0x25e6 (en: 'composition') + - "◧": [t: "hĂŹnh vuĂŽng với ná»­a mĂ u đen"] # 0x25e7 (en: 'square with left half black') + - "◹": [t: "hĂŹnh vuĂŽng với ná»­a mĂ u đen bĂȘn pháșŁi"] # 0x25e8 (en: 'square with right half black') + - "◩": [t: "hĂŹnh vuĂŽng với ná»­a mĂ u đen bĂȘn trĂĄi"] # 0x25e9 (en: 'square with upper left half black') + - "â—Ș": [t: "hĂŹnh vuĂŽng với ná»­a bĂȘn pháșŁi mĂ u đen"] # 0x25ea (en: 'square with lower right half black') + - "◫": [t: "quáșŁng trường tráșŻng với đường chia đîi"] # 0x25eb (en: 'white square with bisecting line') + - "◬": [t: "tráșŻng lĂȘn tam giĂĄc với dáș„u cháș„m"] # 0x25ec (en: 'white up pointing triangle with dot') + - "◭": [t: "lĂȘn tam giĂĄc chỉ với ná»­a mĂ u đen trĂĄi"] # 0x25ed (en: 'up pointing triangle with left half black') + - "◼": [t: "lĂȘn tam giĂĄc chỉ với ná»­a mĂ u đen bĂȘn pháșŁi"] # 0x25ee (en: 'up pointing triangle with right half black') + - "◯": [t: "vĂČng trĂČn lớn"] # 0x25ef (en: 'large circle') + - "◰": [t: "quáșŁng trường tráșŻng với gĂłc pháș§n tư phĂ­a trĂȘn bĂȘn trĂĄi"] # 0x25f0 (en: 'white square with upper left quadrant') + - "◱": [t: "quáșŁng trường tráșŻng với gĂłc pháș§n tư phĂ­a dưới bĂȘn trĂĄi"] # 0x25f1 (en: 'white square with lower left quadrant') + - "â—Č": [t: "quáșŁng trường tráșŻng với gĂłc pháș§n tư phĂ­a dưới bĂȘn pháșŁi"] # 0x25f2 (en: 'white square with lower right quadrant') + - "◳": [t: "quáșŁng trường tráșŻng với gĂłc pháș§n tư phĂ­a trĂȘn bĂȘn pháșŁi"] # 0x25f3 (en: 'white square with upper right quadrant') + - "◮": [t: "vĂČng trĂČn mĂ u tráșŻng với gĂłc pháș§n tư phĂ­a trĂȘn bĂȘn trĂĄi"] # 0x25f4 (en: 'white circle with upper left quadrant') + - "â—”": [t: "vĂČng trĂČn mĂ u tráșŻng với gĂłc pháș§n tư phĂ­a dưới bĂȘn trĂĄi"] # 0x25f5 (en: 'white circle with lower left quadrant') + - "◶": [t: "vĂČng trĂČn mĂ u tráșŻng với gĂłc pháș§n tư phĂ­a dưới bĂȘn pháșŁi"] # 0x25f6 (en: 'white circle with lower right quadrant') + - "◷": [t: "vĂČng trĂČn mĂ u tráșŻng với gĂłc pháș§n tư phĂ­a trĂȘn bĂȘn pháșŁi"] # 0x25f7 (en: 'white circle with upper right quadrant') + - "◾": [t: "tam giĂĄc phĂ­a trĂȘn bĂȘn trĂĄi"] # 0x25f8 (en: 'upper left triangle') + - "â—č": [t: "tam giĂĄc phĂ­a trĂȘn bĂȘn pháșŁi"] # 0x25f9 (en: 'upper right triangle') + - "â—ș": [t: "tam giĂĄc dưới bĂȘn trĂĄi"] # 0x25fa (en: 'lower left triangle') + - "◻": [t: "quáșŁng trường trung bĂŹnh mĂ u tráșŻng"] # 0x25fb (en: 'white medium square') + - "â—Œ": [t: "quáșŁng trường trung bĂŹnh mĂ u đen"] # 0x25fc (en: 'black medium square') + - "â—œ": [t: "quáșŁng trường nhỏ vừa"] # 0x25fd (en: 'white medium small square') + - "â—Ÿ": [t: "quáșŁng trường nhỏ mĂ u đen"] # 0x25fe (en: 'black medium small square') + - "◿": [t: "tam giĂĄc dưới bĂȘn pháșŁi"] # 0x25ff (en: 'lower right triangle') + - "♠": [t: "bộ đồ thuổng đen"] # 0x2660 (en: 'black spade suit') + - "♡": [t: "bộ đồ trĂĄi tim tráșŻng"] # 0x2661 (en: 'white heart suit') + - "♱": [t: "bộ đồ kim cÆ°ÆĄng tráșŻng"] # 0x2662 (en: 'white diamond suit') + - "♣": [t: "bộ đồ cĂąu láșĄc bộ mĂ u đen"] # 0x2663 (en: 'black club suit') + - "♀": [t: "bộ đồ thuổng tráșŻng"] # 0x2664 (en: 'white spade suit') + - "♄": [t: "bộ đồ trĂĄi tim đen"] # 0x2665 (en: 'black heart suit') + - "♩": [t: "bộ đồ kim cÆ°ÆĄng đen"] # 0x2666 (en: 'black diamond suit') + - "♧": [t: "bộ đồ cĂąu láșĄc bộ tráșŻng"] # 0x2667 (en: 'white club suit') + - "❚": [t: "trung bĂŹnh bĂȘn trĂĄi dáș„u ngoáș·c Ä‘ÆĄn trang trĂ­"] # 0x2768 (en: 'medium left parentheses ornament') + - "❩": [t: "dáș„u ngoáș·c Ä‘ÆĄn trung bĂŹnh trang trĂ­"] # 0x2769 (en: 'medium right parentheses ornament') + - "âȘ": [t: "trung bĂŹnh pháșłng bĂȘn trĂĄi dáș„u ngoáș·c Ä‘ÆĄn trang trĂ­"] # 0x276a (en: 'medium flattened left parentheses ornament') + - "❫": [t: "trung bĂŹnh pháșłng bĂȘn pháșŁi trang trĂ­"] # 0x276b (en: 'medium flattened right parentheses ornament') + - "❬": [t: "trung bĂŹnh bĂȘn trĂĄi giĂĄ trang trĂ­ khung gĂłc"] # 0x276c (en: 'medium left-pointing angle bracket ornament') + - "❭": [t: "trung bĂŹnh bĂȘn pháșŁi-gĂłc chỉ trang trĂ­"] # 0x276d (en: 'medium right--pointing angle bracked ornament') + - "❼": [t: "độ náș·ng gĂłc bĂȘn trĂĄi dáș„u ngoáș·c kĂ©p trang trĂ­"] # 0x276e (en: 'heavy left-pointing angle quotation mark ornament') + - "❯": [t: "độ náș·ng gĂłc pháșŁi gĂłc trĂ­ch dáș«n trang trĂ­ trang trĂ­"] # 0x276f (en: 'heavy right-pointing angle quotation mark ornament') + - "❰": [t: "giĂĄ trang trĂ­ gĂłc cá»±c lớn bĂȘn trĂĄi"] # 0x2770 (en: 'heavy left-pointing angle bracket ornament') + - "❱": [t: "giĂĄ trang trĂ­ gĂłc pháșŁi náș·ng bĂȘn pháșŁi"] # 0x2771 (en: 'heavy right-pointing angle bracket ornament') + - "âČ": [t: "ĂĄnh sĂĄng bĂȘn trĂĄi chĂąn váș­t trang trĂ­ vỏ rĂča"] # 0x2772 (en: 'light left tortoise shell bracket ornament') + - "❳": [t: "ĂĄnh sĂĄng bĂȘn pháșŁi vỏ sĂČ trang trĂ­"] # 0x2773 (en: 'light right tortoise shell bracket ornament') + - "❎": [t: "trung bĂŹnh bĂȘn trĂĄi trang trĂ­"] # 0x2774 (en: 'medium left brace ornament') + - "❔": [t: "trang trĂ­ náșčp trung bĂŹnh bĂȘn pháșŁi"] # 0x2775 (en: 'medium right brace ornament') + - "❶": [t: "mĂ u đen khoanh trĂČn một"] # 0x2776 (en: 'black circled one') + - "❷": [t: "đen vĂČng hai"] # 0x2777 (en: 'black circled two') + - "❞": [t: "đen vĂČng ba"] # 0x2778 (en: 'black circled three') + - "âč": [t: "đen vĂČng bốn"] # 0x2779 (en: 'black circled four') + - "âș": [t: "đen khoanh trĂČn năm"] # 0x277a (en: 'black circled five') + - "❻": [t: "đen vĂČng sĂĄu"] # 0x277b (en: 'black circled six') + - "❌": [t: "đen bao quanh báșŁy"] # 0x277c (en: 'black circled seven') + - "❜": [t: "mĂ u đen khoanh trĂČn táșĄi"] # 0x277d (en: 'black circled eight') + - "❟": [t: "đen vĂČng chĂ­n"] # 0x277e (en: 'black circled nine') + - "❿": [t: "mười vĂČng mĂ u đen"] # 0x277f (en: 'black circled ten') + - "➀": [t: "khoanh trĂČn sans serif một"] # 0x2780 (en: 'circled sans serif one') + - "➁": [t: "bao quanh sans serif hai"] # 0x2781 (en: 'circled sans serif two') + - "➂": [t: "bao quanh sans serif ba"] # 0x2782 (en: 'circled sans serif three') + - "➃": [t: "bao quanh sans serif bốn"] # 0x2783 (en: 'circled sans serif four') + - "➄": [t: "bao quanh sans serif năm"] # 0x2784 (en: 'circled sans serif five') + - "➅": [t: "bao quanh sans serif sĂĄu"] # 0x2785 (en: 'circled sans serif six') + - "➆": [t: "bao quanh sans serif báșŁy"] # 0x2786 (en: 'circled sans serif seven') + - "➇": [t: "bao quanh sans serif táșĄi"] # 0x2787 (en: 'circled sans serif eight') + - "➈": [t: "bao quanh sans serif chĂ­n"] # 0x2788 (en: 'circled sans serif nine') + - "➉": [t: "bao quanh sans serif mười"] # 0x2789 (en: 'circled sans serif ten') + - "➊": [t: "mĂ u đen khoanh trĂČn sans serif một"] # 0x278a (en: 'black circled sans serif one') + - "➋": [t: "đen khoanh trĂČn sans serif hai"] # 0x278b (en: 'black circled sans serif two') + - "➌": [t: "đen kho trĂČn sans serif ba"] # 0x278c (en: 'black circled sans serif three') + - "➍": [t: "đen kho trĂČn sans serif bốn"] # 0x278d (en: 'black circled sans serif four') + - "➎": [t: "đen kho trĂČn sans serif năm"] # 0x278e (en: 'black circled sans serif five') + - "➏": [t: "đen kho trĂČn sans serif sĂĄu"] # 0x278f (en: 'black circled sans serif six') + - "➐": [t: "đen khoanh trĂČn sans serif seven"] # 0x2790 (en: 'black circled sans serif seven') + - "➑": [t: "mĂ u đen khoanh trĂČn sans serif táșĄi"] # 0x2791 (en: 'black circled sans serif eight') + - "➒": [t: "đen kho trĂČn sans serif chĂ­n"] # 0x2792 (en: 'black circled sans serif nine') + - "➓": [t: "mĂ u đen khoanh trĂČn sans serif ten"] # 0x2793 (en: 'black circled sans serif ten') + - "➔": [t: "mĆ©i tĂȘn bĂȘn pháșŁi náș·ng"] # 0x2794 (en: 'heavy wide-headed rightwards arrow') + - "➕": [t: "dáș„u hiệu cộng náș·ng"] # 0x2795 (en: 'heavy plus sign') + - "➖": [t: "dáș„u hiệu náș·ng"] # 0x2796 (en: 'heavy minus sign') + - "➗": [t: "dáș„u hiệu divison náș·ng"] # 0x2797 (en: 'heavy divison sign') + - "➘": [t: "mĆ©i tĂȘn đîng nam náș·ng"] # 0x2798 (en: 'heavy south east arrow') + - "➙": [t: "mĆ©i tĂȘn náș·ng"] # 0x2799 (en: 'heavy rightwards arrow') + - "➚": [t: "mĆ©i tĂȘn đîng báșŻc náș·ng"] # 0x279a (en: 'heavy north east arrow') + - "➛": [t: "báșŁn tháșŁo điểm bĂȘn pháșŁi mĆ©i tĂȘn"] # 0x279b (en: 'drafting point rightwards arrow') + - "➜": [t: "mĆ©i tĂȘn trĂČn náș·ng"] # 0x279c (en: 'heavy round-tipped rightwards arrow') + - "➝": [t: "mĆ©i tĂȘn pháșŁi đáș§u tam giĂĄc"] # 0x279d (en: 'triangle-headed rightwards arrow') + - "➞": [t: "mĆ©i tĂȘn đáș§u pháșŁi hĂŹnh tam giĂĄc náș·ng"] # 0x279e (en: 'heavy triangle-headed rightwards arrow') + - "➟": [t: "mĆ©i tĂȘn đáș§u cÆĄ hĂŹnh tam giĂĄc đứt"] # 0x279f (en: 'dashed triangle-headed rightwards arrow') + - "➠": [t: "mĆ©i tĂȘn đáș§u cÆĄ hĂŹnh tam giĂĄc náș·ng nề"] # 0x27a0 (en: 'heavy dashed triangle-headed rightwards arrow') + - "➡": [t: "mĆ©i tĂȘn bĂȘn pháșŁi mĂ u đen"] # 0x27a1 (en: 'black rightwards arrow') + - "➱": [t: "ba d trĂȘn cĂčng tháșŻp sĂĄng mĆ©i tĂȘn bĂȘn pháșŁi"] # 0x27a2 (en: 'three d top lighted rightwards arrow') + - "➣": [t: "ba d dưới cĂčng ĂĄnh sĂĄng mĆ©i tĂȘn bĂȘn pháșŁi"] # 0x27a3 (en: 'three d bottom lighted rightwards arrow') + - "➀": [t: "mĆ©i tĂȘn bĂȘn pháșŁi mĂ u đen"] # 0x27a4 (en: 'black rightwards arrowhead') + - "➄": [t: "đen náș·ng cong xuống vĂ  mĆ©i tĂȘn pháșŁi"] # 0x27a5 (en: 'heavy black curved downwards and rightwards arrow') + - "➊": [t: "đen náș·ng cong lĂȘn trĂȘn vĂ  mĆ©i tĂȘn pháșŁi"] # 0x27a6 (en: 'heavy black curved upwards and rightwards arrow') + - "➧": [t: "squat mĂ u đen mĆ©i tĂȘn bĂȘn pháșŁi"] # 0x27a7 (en: 'squat black rightwards arrow') + - "➚": [t: "mĆ©i tĂȘn bĂȘn pháșŁi bĂȘn lĂ”m náș·ng"] # 0x27a8 (en: 'heavy concave-pointed black rightwards arrow') + - "➩": [t: "mĆ©i tĂȘn bĂȘn pháșŁi mĂ u tráșŻng bĂłng pháșŁi"] # 0x27a9 (en: 'right-shaded white rightwards arrow') + - "âžȘ": [t: "mĆ©i tĂȘn bĂȘn pháșŁi mĂ u tráșŻng bĂȘn trĂĄi"] # 0x27aa (en: 'left-shaded white rightwards arrow') + - "➫": [t: "mĆ©i tĂȘn bĂȘn pháșŁi bị nghiĂȘng máș·t về phĂ­a sau"] # 0x27ab (en: 'back-tilted shadowed white rightwards arrow') + - "➬": [t: "mĆ©i tĂȘn bĂȘn pháșŁi bĂłng tối nghiĂȘng trước"] # 0x27ac (en: 'front-tilted shadowed white rightwards arrow') + - "➭": [t: "mĆ©i tĂȘn bĂȘn pháșŁi bĂłng bĂȘn pháșŁi tháș„p"] # 0x27ad (en: 'heavy lower right-shadowed white rightwards arrow') + - "➼": [t: "mĆ©i tĂȘn bĂȘn pháșŁi bĂłng bĂȘn pháșŁi náș·ng"] # 0x27ae (en: 'heavy upper right-shadowed white rightwards arrow') + - "➯": [t: "nổi lĂȘn mĆ©i tĂȘn bĂȘn pháșŁi bĂłng pháșŁi dưới bĂȘn pháșŁi"] # 0x27af (en: 'notched lower right-shadowed white rightwards arrow') + - "➱": [t: "nổi báș­t trĂȘn mĆ©i tĂȘn bĂȘn pháșŁi bĂłng bĂȘn pháșŁi"] # 0x27b1 (en: 'notched upper right-shadowed white rightwards arrow') + - "âžČ": [t: "khoanh trĂČn mĆ©i tĂȘn bĂȘn pháșŁi mĂ u tráșŻng náș·ng"] # 0x27b2 (en: 'circled heavy white rightwards arrow') + - "➳": [t: "mĆ©i tĂȘn bĂȘn pháșŁi mĂ u tráșŻng"] # 0x27b3 (en: 'white-feathered rightwards arrow') + - "➮": [t: "mĆ©i tĂȘn phĂ­a đîng nam lĂŽng đen"] # 0x27b4 (en: 'black-feathered south east arrow') + - "➔": [t: "mĆ©i tĂȘn bĂȘn pháșŁi mĂ u đen"] # 0x27b5 (en: 'black-feathered rightwards arrow') + - "➶": [t: "mĆ©i tĂȘn đîng báșŻc lĂŽng đen"] # 0x27b6 (en: 'black-feathered north east arrow') + - "➷": [t: "mĆ©i tĂȘn đîng nam háșĄng náș·ng"] # 0x27b7 (en: 'heavy black-feathered south east arrow') + - "➾": [t: "mĆ©i tĂȘn bĂȘn pháșŁi mĂ u đen náș·ng"] # 0x27b8 (en: 'heavy black-feathered rightwards arrow') + - "âžč": [t: "mĆ©i tĂȘn đîng báșŻc háșĄng náș·ng"] # 0x27b9 (en: 'heavy black-feathered north east arrow') + - "âžș": [t: "teradrop-barbed mĆ©i tĂȘn pháșŁi"] # 0x27ba (en: 'teradrop-barbed rightwards arrow') + - "➻": [t: "mĆ©i tĂȘn bĂȘn pháșŁi náș·ng"] # 0x27bb (en: 'heavy teardrop-shanked rightwards arrow') + - "➌": [t: "mĆ©i tĂȘn đuĂŽi nĂȘm"] # 0x27bc (en: 'wedge-tailed rightwards arrow') + - "➜": [t: "mĆ©i tĂȘn bĂȘn pháșŁi náș·ng"] # 0x27bd (en: 'heavy wedge-tailed rightwards arrow') + - "➟": [t: "mở mĆ©i tĂȘn bĂȘn pháșŁi"] # 0x27be (en: 'open-outlined rightwards arrow') + - "⟀": [t: "gĂłc ba chiều"] # 0x27c0 (en: 'three dimensional angle') + - "⟁": [t: "tam giĂĄc tráșŻng chứa tam giĂĄc nhỏ mĂ u tráșŻng"] # 0x27c1 (en: 'white triangle containing small white triangle') + - "⟂": # 0x27c2 + - test: + if: "$Verbosity!='Terse'" + then: [t: "vuĂŽng gĂłc với"] # (en: 'is perpendicular to') + - "⟃": # 0x27c3 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "một táș­p hợp con mở cá»§a" # (en: 'an open subset of') + - "⟄": # 0x27c4 + - test: + if: "$Verbosity!='Terse'" + then: [t: "lĂ "] # (en: 'is') + - t: "một siĂȘu sao mở cá»§a" # (en: 'an open superset of') + - "⟅": [t: "phĂąn dáș„u tĂși hĂŹnh chữ s"] # 0x27c5 (en: 'left s-shaped bag delimiter') + - "⟆": [t: "phĂąn dáș„u tĂși hĂŹnh chữ s pháșŁi"] # 0x27c6 (en: 'right s-shaped bag delimiter') + - "⟇": [t: "hoáș·c với dáș„u cháș„m bĂȘn trong"] # 0x27c7 (en: 'or with dot inside') + - "⟈": [t: "đáșŁo ngÆ°á»Łc solidus preeding táș­p hợp con"] # 0x27c8 (en: 'reverse solidus preceeding subset') + - "⟉": [t: "superset preceding solidus"] # 0x27c9 (en: 'superset preceeding solidus') + - "⟊": [t: "thanh dọc với gáșĄch ngang"] # 0x27ca (en: 'vertical bar with horizontal stroke') + - "⟋": [t: "đường chĂ©o tăng toĂĄn"] # 0x27cb (en: 'mathematical rising diagonal') + - "⟌": [t: "phĂąn chia dĂ i"] # 0x27cc (en: 'long division') + - "⟍": [t: "đường chĂ©o giáșŁm toĂĄn"] # 0x27cd (en: 'mathematical falling diagonal') + - "⟎": [t: "bĂŹnh phÆ°ÆĄng logic vĂ "] # 0x27ce (en: 'squared logical and') + - "⟏": [t: "bĂŹnh phÆ°ÆĄng logic hoáș·c"] # 0x27cf (en: 'squared logical or') + - "⟐": [t: "kim cÆ°ÆĄng tráșŻng với cháș„m giữa"] # 0x27d0 (en: 'white diamond with centered dot') + - "⟑": [t: "vĂ  với dáș„u cháș„m"] # 0x27d1 (en: 'and with dot') + - "⟒": [t: "yáșżu tố mở lĂȘn trĂȘn"] # 0x27d2 (en: 'element of openning upwards') + - "⟓": [t: "gĂłc dưới bĂȘn pháșŁi với dáș„u cháș„m"] # 0x27d3 (en: 'lower right corner with dot') + - "⟔": [t: "gĂłc trĂȘn bĂȘn trĂĄi với dáș„u cháș„m"] # 0x27d4 (en: 'upper left corner with dot') + - "⟕": [t: "bĂȘn ngoĂ i tham gia"] # 0x27d5 (en: 'left outer join') + - "⟖": [t: "bĂȘn ngoĂ i tham gia"] # 0x27d6 (en: 'right outer join') + - "⟗": [t: "tham gia đáș§y đủ bĂȘn ngoĂ i"] # 0x27d7 (en: 'full outer join') + - "⟘": [t: "lớn lĂȘn tack"] # 0x27d8 (en: 'large up tack') + - "⟙": [t: "lớn xuống tack"] # 0x27d9 (en: 'large down tack') + - "⟚": [t: "trĂĄi vĂ  bĂȘn pháșŁi turnstile"] # 0x27da (en: 'left and right double turnstile') + - "⟛": [t: "bĂȘn trĂĄi vĂ  bĂȘn pháșŁi"] # 0x27db (en: 'left and right tack') + - "⟜": [t: "multimap trĂĄi"] # 0x27dc (en: 'left multimap') + - "⟝": [t: "long pháșŁi tack"] # 0x27dd (en: 'long right tack') + - "⟞": [t: "long trĂĄi tack"] # 0x27de (en: 'long left tack') + - "⟟": [t: "lĂȘn tack với vĂČng trĂČn ở trĂȘn"] # 0x27df (en: 'up tack with circle above') + - "⟠": [t: "lozenge chia cho quy táșŻc ngang"] # 0x27e0 (en: 'lozenge divided by horizontal rule') + - "⟡": [t: "kim cÆ°ÆĄng máș·t lĂ”m mĂ u tráșŻng"] # 0x27e1 (en: 'white concave sided diamond') + - "⟱": [t: "kim cÆ°ÆĄng máș·t lĂ”m mĂ u tráșŻng với tick trĂĄi"] # 0x27e2 (en: 'white concave sided diamond with leftwards tick') + - "⟣": [t: "kim cÆ°ÆĄng máș·t lĂ”m mĂ u tráșŻng với tick bĂȘn pháșŁi"] # 0x27e3 (en: 'white concave sided diamond with rightwards tick') + - "⟀": [t: "quáșŁng trường tráșŻng với đánh dáș„u trĂĄi"] # 0x27e4 (en: 'white square with leftwards tick') + - "⟄": [t: "quáșŁng trường tráșŻng với đánh dáș„u pháșŁi"] # 0x27e5 (en: 'white square with rightwards tick') + - "⟩": [t: "khung vuĂŽng mĂ u tráșŻng"] # 0x27e6 (en: 'left white square bracket') + - "⟧": [t: "khung vuĂŽng tráșŻng bĂȘn pháșŁi"] # 0x27e7 (en: 'right white square bracket') + - "⟹": [t: "khung gĂłc trĂĄi"] # 0x27e8 (en: 'left angle bracket') + - "⟩": [t: "khung gĂłc pháșŁi"] # 0x27e9 (en: 'right angle bracket') + - "âŸȘ": [t: "khung gĂłc hai gĂłc"] # 0x27ea (en: 'left double angle bracket') + - "⟫": [t: "khung gĂłc gáș„p đîi"] # 0x27eb (en: 'right double angle bracket') + - "⟬": [t: "bĂȘn trĂĄi khung vỏ rĂča tráșŻng"] # 0x27ec (en: 'left white tortoise shell bracket') + - "⟭": [t: "bĂȘn pháșŁi khung vỏ rĂča tráșŻng"] # 0x27ed (en: 'right white tortoise shell bracket') + - "⟼": [t: "bĂȘn trĂĄi pháșłng dáș„u ngoáș·c Ä‘ÆĄn"] # 0x27ee (en: 'left flattened parenthesis') + - "⟯": [t: "bĂȘn pháșŁi pháșłng ngoáș·c Ä‘ÆĄn"] # 0x27ef (en: 'right flattened parenthesis') + - "⟰": [t: "mĆ©i tĂȘn tăng bốn láș§n"] # 0x27f0 (en: 'upwards quadruple arrow') + - "⟱": [t: "mĆ©i tĂȘn bốn láș§n xuống"] # 0x27f1 (en: 'downwards quadruple arrow') + - "âŸČ": [t: "mĆ©i tĂȘn vĂČng trĂČn ngÆ°á»Łc chiều kim đồng hồ"] # 0x27f2 (en: 'anticlockwise gapped circle arrow') + - "⟳": [t: "mĆ©i tĂȘn vĂČng trĂČn theo chiều kim đồng hồ"] # 0x27f3 (en: 'clockwise gapped circle arrow') + - "⟮": [t: "mĆ©i tĂȘn pháșŁi với vĂČng trĂČn"] # 0x27f4 (en: 'right arrow with circled plus') + - "⟔": [t: "mĆ©i tĂȘn dĂ i trĂĄi"] # 0x27f5 (en: 'long leftwards arrow') + - "⟶": [t: "mĆ©i tĂȘn dĂ i pháșŁi"] # 0x27f6 (en: 'long rightwards arrow') + - "⟷": [t: "mĆ©i tĂȘn dĂ i bĂȘn trĂĄi"] # 0x27f7 (en: 'long left right arrow') + - "⟾": [t: "mĆ©i tĂȘn đîi dĂ i trĂĄi"] # 0x27f8 (en: 'long leftwards double arrow') + - "âŸč": [t: "mĆ©i tĂȘn đîi dĂ i pháșŁi"] # 0x27f9 (en: 'long rightwards double arrow') + - "âŸș": [t: "mĆ©i tĂȘn đîi dĂ i trĂĄi bĂȘn trĂĄi"] # 0x27fa (en: 'long left right double arrow') + - "⟻": [t: "mĆ©i tĂȘn dĂ i trĂĄi từ thanh"] # 0x27fb (en: 'long leftwards arrow from bar') + - "⟌": [t: "mĆ©i tĂȘn dĂ i pháșŁi từ thanh"] # 0x27fc (en: 'long rightwards arrow from bar') + - "⟜": [t: "mĆ©i tĂȘn đîi dĂ i trĂĄi từ thanh"] # 0x27fd (en: 'long leftwards double arrow from bar') + - "⟟": [t: "mĆ©i tĂȘn dĂ i gáș„p đîi từ thanh"] # 0x27fe (en: 'long rightwards double arrow from bar') + - "⟿": [t: "mĆ©i tĂȘn squiggle dĂ i pháșŁi"] # 0x27ff (en: 'long rightwards squiggle arrow') + - " ": [t: "pháșŁi hai mĆ©i tĂȘn hai đáș§u với gáșĄch tháșłng đứng"] # 0x2900 (en: 'rightwards two headed arrow with vertical stroke') + - " ": [t: "pháșŁi hai mĆ©i tĂȘn hai đáș§u với gáșĄch tháșłng đứng"] # 0x2901 (en: 'rightwards two headed arrow with double vertical stroke') + - " ": [t: "mĆ©i tĂȘn đîi bĂȘn trĂĄi với gáșĄch dọc"] # 0x2902 (en: 'leftwards double arrow with vertical stroke') + - " ": [t: "mĆ©i tĂȘn kĂ©p pháșŁi với gáșĄch dọc"] # 0x2903 (en: 'rightwards double arrow with vertical stroke') + - " ": [t: "mĆ©i tĂȘn kĂ©p bĂȘn trĂĄi với gáșĄch dọc"] # 0x2904 (en: 'left right double arrow with vertical stroke') + - " ": [t: "pháșŁi hai mĆ©i tĂȘn hai đáș§u từ thanh"] # 0x2905 (en: 'rightwards two headed arrow from bar') + - " ": [t: "mĆ©i tĂȘn đîi bĂȘn trĂĄi từ thanh"] # 0x2906 (en: 'leftwards double arrow from bar') + - " ": [t: "mĆ©i tĂȘn kĂ©p bĂȘn pháșŁi từ thanh"] # 0x2907 (en: 'rightwards double arrow from bar') + - " ": [t: "mĆ©i tĂȘn xuống với gáșĄch ngang"] # 0x2908 (en: 'downwards arrow with horizontal stroke') + - " ": [t: "mĆ©i tĂȘn hướng lĂȘn với gáșĄch ngang"] # 0x2909 (en: 'upwards arrow with horizontal stroke') + - " ": [t: "mĆ©i tĂȘn tăng ba"] # 0x290a (en: 'upwards triple arrow') + - "​": [t: "mĆ©i tĂȘn ba xuống xuống"] # 0x290b (en: 'downwards triple arrow') + - "‌": [t: "mĆ©i tĂȘn double double bĂȘn trĂĄi"] # 0x290c (en: 'leftwards double dash arrow') + - "‍": [t: "mĆ©i tĂȘn double double bĂȘn pháșŁi"] # 0x290d (en: 'rightwards double dash arrow') + - "‎": [t: "mĆ©i tĂȘn ba dash bĂȘn trĂĄi"] # 0x290e (en: 'leftwards triple dash arrow') + - "‏": [t: "mĆ©i tĂȘn ba bĂȘn pháșŁi"] # 0x290f (en: 'rightwards triple dash arrow') + - "‐": [t: "pháșŁi hai mĆ©i tĂȘn ba đáș§u"] # 0x2910 (en: 'rightwards two headed triple dash arrow') + - "‑": [t: "mĆ©i tĂȘn pháșŁi với thĂąn cháș„m cháș„m"] # 0x2911 (en: 'rightwards arrow with dotted stem') + - "‒": [t: "mĆ©i tĂȘn hướng lĂȘn đáșżn thanh"] # 0x2912 (en: 'upwards arrow to bar') + - "–": [t: "mĆ©i tĂȘn xuống thanh"] # 0x2913 (en: 'downwards arrow to bar') + - "—": [t: "mĆ©i tĂȘn pháșŁi với đuĂŽi vĂ  gáșĄch dọc"] # 0x2914 (en: 'rightwards arrow with tail and vertical stroke') + - "―": [t: "mĆ©i tĂȘn pháșŁi với đuĂŽi vĂ  gáșĄch dọc"] # 0x2915 (en: 'rightwards arrow with tail and double vertical stroke') + - "‖": [t: "pháșŁi hai mĆ©i tĂȘn hai đáș§u với đuĂŽi"] # 0x2916 (en: 'rightwards two headed arrow with tail') + - "‗": [t: "pháșŁi hai mĆ©i tĂȘn hai đáș§u với đuĂŽi với gáșĄch tháșłng đứng"] # 0x2917 (en: 'rightwards two headed arrow with tail with vertical stroke') + - "‘": [t: "pháșŁi hai mĆ©i tĂȘn hai đáș§u với đuĂŽi với gáșĄch tháșłng đứng"] # 0x2918 (en: 'rightwards two headed arrow with tail with double vertical stroke') + - "’": [t: "đuĂŽi mĆ©i tĂȘn trĂĄi"] # 0x2919 (en: 'leftwards arrow tail') + - "‚": [t: "đuĂŽi mĆ©i tĂȘn pháșŁi"] # 0x291a (en: 'rightwards arrow tail') + - "‛": [t: "đuĂŽi hai mĆ©i tĂȘn trĂĄi"] # 0x291b (en: 'leftwards double arrow tail') + - "“": [t: "đuĂŽi mĆ©i tĂȘn kĂ©p pháșŁi"] # 0x291c (en: 'rightwards double arrow tail') + - "”": [t: "mĆ©i tĂȘn trĂĄi vĂ o kim cÆ°ÆĄng đáș§y"] # 0x291d (en: 'leftwards arrow to filled diamond') + - "„": [t: "mĆ©i tĂȘn bĂȘn pháșŁi vĂ o kim cÆ°ÆĄng đáș§y"] # 0x291e (en: 'rightwards arrow to filled diamond') + - "‟": [t: "mĆ©i tĂȘn trĂĄi từ thanh đáșżn kim cÆ°ÆĄng đáș§y"] # 0x291f (en: 'leftwards arrow from bar to filled diamond') + - "†": [t: "mĆ©i tĂȘn bĂȘn pháșŁi từ thanh đáșżn kim cÆ°ÆĄng đáș§y"] # 0x2920 (en: 'rightwards arrow from bar to filled diamond') + - "‥": [t: "mĆ©i tĂȘn tĂąy báșŻc vĂ  đîng nam"] # 0x2921 (en: 'north west and south east arrow') + - "‹": [t: "mĆ©i tĂȘn đîng báșŻc vĂ  tĂąy nam"] # 0x2922 (en: 'north east and south west arrow') + - "‣": [t: "mĆ©i tĂȘn tĂąy báșŻc với mĂłc"] # 0x2923 (en: 'north west arrow with hook') + - " ": [t: "mĆ©i tĂȘn đîng báșŻc với mĂłc"] # 0x2924 (en: 'north east arrow with hook') + - " ": [t: "mĆ©i tĂȘn đîng nam với mĂłc"] # 0x2925 (en: 'south east arrow with hook') + - " ": [t: "mĆ©i tĂȘn tĂąy nam với mĂłc"] # 0x2926 (en: 'south west arrow with hook') + - "‧": [t: "mĆ©i tĂȘn tĂąy báșŻc vĂ  mĆ©i tĂȘn đîng báșŻc"] # 0x2927 (en: 'north west arrow and north east arrow') + - "‚": [t: "mĆ©i tĂȘn đîng báșŻc vĂ  mĆ©i tĂȘn đîng nam"] # 0x2928 (en: 'north east arrow and south east arrow') + - "
": [t: "mĆ©i tĂȘn đîng nam vĂ  mĆ©i tĂȘn tĂąy nam"] # 0x2929 (en: 'south east arrow and south west arrow') + - "â€Ș": [t: "mĆ©i tĂȘn tĂąy nam vĂ  mĆ©i tĂȘn tĂąy báșŻc"] # 0x292a (en: 'south west arrow and north west arrow') + - "‫": [t: "vÆ°á»Łt qua đường chĂ©o đi chĂ©o"] # 0x292b (en: 'rising diagonal crossing falling diagonal') + - "‏": [t: "ngĂŁ đường chĂ©o chĂ©o chĂ©o"] # 0x292c (en: 'falling diagonal crossing rising diagonal') + - "‭": [t: "mĆ©i tĂȘn đîng nam băng qua mĆ©i tĂȘn đîng báșŻc"] # 0x292d (en: 'south east arrow crossing north east arrow') + - "‟": [t: "mĆ©i tĂȘn đîng báșŻc băng qua mĆ©i tĂȘn đîng nam"] # 0x292e (en: 'north east arrow crossing south east arrow') + - " ": [t: "ngĂŁ đường chĂ©o băng qua mĆ©i tĂȘn đîng báșŻc"] # 0x292f (en: 'falling diagonal crossing north east arrow') + - "‰": [t: "tăng đường chĂ©o băng qua mĆ©i tĂȘn đîng nam"] # 0x2930 (en: 'rising diagonal crossing south east arrow') + - "‱": [t: "mĆ©i tĂȘn đîng báșŻc băng qua mĆ©i tĂȘn tĂąy báșŻc"] # 0x2931 (en: 'north east arrow crossing north west arrow') + - "â€Č": [t: "mĆ©i tĂȘn tĂąy báșŻc băng qua mĆ©i tĂȘn đîng báșŻc"] # 0x2932 (en: 'north west arrow crossing north east arrow') + - "″": [t: "mĆ©i tĂȘn sĂłng chỉ trá»±c tiáșżp bĂȘn pháșŁi"] # 0x2933 (en: 'wave arrow pointing directly right') + - "‎": [t: "mĆ©i tĂȘn chỉ ngay sau đó cong lĂȘn trĂȘn"] # 0x2934 (en: 'arrow pointing rightwards then curving upwards') + - "—": [t: "mĆ©i tĂȘn chỉ ngay sau đó cong xuống"] # 0x2935 (en: 'arrow pointing rightwards then curving downwards') + - "‶": [t: "mĆ©i tĂȘn hướng xuống dưới rồi cong trĂĄi"] # 0x2936 (en: 'arrow pointing downwards then curving leftwards') + - "‷": [t: "mĆ©i tĂȘn chỉ xuống dưới rồi cong pháșŁi"] # 0x2937 (en: 'arrow pointing downwards then curving rightwards') + - "„": [t: "bĂȘn bĂȘn pháșŁi arc mĆ©i tĂȘn theo chiều kim đồng hồ"] # 0x2938 (en: 'right side arc clockwise arrow') + - "â€č": [t: "bĂȘn bĂȘn trĂĄi arc mĆ©i tĂȘn ngÆ°á»Łc chiều kim đồng hồ"] # 0x2939 (en: 'left side arc anticlockwise arrow') + - "â€ș": [t: "vĂČng cung hĂ ng đáș§u mĆ©i tĂȘn chống theo chiều kim đồng hồ"] # 0x293a (en: 'top arc anticlockwise arrow') + - "※": [t: "vĂČng cung dưới cĂčng mĆ©i tĂȘn chống theo chiều kim đồng hồ"] # 0x293b (en: 'bottom arc anticlockwise arrow') + - "‌": [t: "mĆ©i tĂȘn vĂČng cung trĂȘn cĂčng theo chiều kim đồng hồ với điểm trừ"] # 0x293c (en: 'top arc clockwise arrow with minus') + - "“": [t: "mĆ©i tĂȘn pháșŁn khĂĄng hĂ ng đáș§u với plus"] # 0x293d (en: 'top arc anticlockwise arrow with plus') + - "‟": [t: "háșĄ mĆ©i tĂȘn bĂĄn nguyệt bĂȘn pháșŁi"] # 0x293e (en: 'lower right semicircular clockwise arrow') + - "‿": [t: "mĆ©i tĂȘn pháșŁn khĂĄng dưới hĂŹnh bĂĄn nguyệt bĂȘn trĂĄi"] # 0x293f (en: 'lower left semicircular anticlockwise arrow') + - "â„€": [t: "mĆ©i tĂȘn vĂČng trĂČn kĂ­n ngÆ°á»Łc chiều kim đồng hồ"] # 0x2940 (en: 'anticlockwise closed circle arrow') + - "℁": [t: "mĆ©i tĂȘn vĂČng trĂČn kĂ­n theo chiều kim đồng hồ"] # 0x2941 (en: 'clockwise closed circle arrow') + - "â„‚": [t: "mĆ©i tĂȘn bĂȘn pháșŁi phĂ­a trĂȘn mĆ©i tĂȘn ngáșŻn trĂĄi"] # 0x2942 (en: 'rightwards arrow above short leftwards arrow') + - "℃": [t: "mĆ©i tĂȘn trĂĄi phĂ­a trĂȘn mĆ©i tĂȘn ngáșŻn pháșŁi"] # 0x2943 (en: 'leftwards arrow above short rightwards arrow') + - "â„„": [t: "mĆ©i tĂȘn ngáșŻn bĂȘn pháșŁi phĂ­a trĂȘn mĆ©i tĂȘn trĂĄi"] # 0x2944 (en: 'short rightwards arrow above leftwards arrow') + - "â„…": [t: "mĆ©i tĂȘn bĂȘn pháșŁi với cộng với bĂȘn dưới"] # 0x2945 (en: 'rightwards arrow with plus below') + - "℆": [t: "mĆ©i tĂȘn trĂĄi với cộng với bĂȘn dưới"] # 0x2946 (en: 'leftwards arrow with plus below') + - "ℇ": [t: "mĆ©i tĂȘn pháșŁi qua x"] # 0x2947 (en: 'rightwards arrow through x') + - "℈": [t: "mĆ©i tĂȘn trĂĄi qua vĂČng trĂČn"] # 0x2948 (en: 'left right arrow through circle') + - "℉": [t: "lĂȘn tới hai mĆ©i tĂȘn đáș§u từ circle"] # 0x2949 (en: 'upwards two headed arrow from circle') + - "ℊ": [t: "bĂȘn trĂĄi barb lĂȘn bĂȘn pháșŁi barb xuống harpoon"] # 0x294a (en: 'left barb up right barb down harpoon') + - "â„‹": [t: "bĂȘn trĂĄi barb xuống bĂȘn pháșŁi barb up harpoon"] # 0x294b (en: 'left barb down right barb up harpoon') + - "ℌ": [t: "lĂȘn barb pháșŁi xuống barb trĂĄi harpoon"] # 0x294c (en: 'up barb right down barb left harpoon') + - "ℍ": [t: "lĂȘn barb trĂĄi xuống barb pháșŁi harpoon"] # 0x294d (en: 'up barb left down barb right harpoon') + - "ℎ": [t: "bĂȘn trĂĄi barb lĂȘn bĂȘn pháșŁi barb lĂȘn harpoon"] # 0x294e (en: 'left barb up right barb up harpoon') + - "ℏ": [t: "lĂȘn barb ngay xuống barb pháșŁi harpoon"] # 0x294f (en: 'up barb right down barb right harpoon') + - "ℐ": [t: "bĂȘn trĂĄi barb xuống bĂȘn pháșŁi barb xuống harpoon"] # 0x2950 (en: 'left barb down right barb down harpoon') + - "â„‘": [t: "lĂȘn barb trĂĄi xuống barb trĂĄi harpoon"] # 0x2951 (en: 'up barb left down barb left harpoon') + - "â„’": [t: "harpoon trĂĄi với barb lĂȘn đáșżn bar"] # 0x2952 (en: 'leftwards harpoon with barb up to bar') + - "â„“": [t: "harpoon pháșŁi với barb lĂȘn đáșżn bar"] # 0x2953 (en: 'rightwards harpoon with barb up to bar') + - "â„”": [t: "harpoon hướng lĂȘn với barb ngay để thanh"] # 0x2954 (en: 'upwards harpoon with barb right to bar') + - "â„•": [t: "downwards harpoon với barb ngay để thanh"] # 0x2955 (en: 'downwards harpoon with barb right to bar') + - "â„–": [t: "harpoon trĂĄi với barb xuống bar"] # 0x2956 (en: 'leftwards harpoon with barb down to bar') + - "â„—": [t: "harpoon pháșŁi với barb xuống bar"] # 0x2957 (en: 'rightwards harpoon with barb down to bar') + - "℘": [t: "harpoon đi lĂȘn với barb trĂĄi để thanh"] # 0x2958 (en: 'upwards harpoon with barb left to bar') + - "â„™": [t: "downwards harpoon với barb rời khỏi quĂĄn bar"] # 0x2959 (en: 'downwards harpoon with barb left to bar') + - "ℚ": [t: "harpoon trĂĄi với barb lĂȘn từ quĂĄn bar"] # 0x295a (en: 'leftwards harpoon with barb up from bar') + - "â„›": [t: "harpoon pháșŁi với barb lĂȘn từ bar"] # 0x295b (en: 'rightwards harpoon with barb up from bar') + - "ℜ": [t: "harpoon đi lĂȘn với barb ngay từ quĂĄn bar"] # 0x295c (en: 'upwards harpoon with barb right from bar') + - "ℝ": [t: "downwards harpoon với barb ngay từ quĂĄn bar"] # 0x295d (en: 'downwards harpoon with barb right from bar') + - "℞": [t: "harpoon trĂĄi với barb xuống từ bar"] # 0x295e (en: 'leftwards harpoon with barb down from bar') + - "℟": [t: "harpoon pháșŁi với barb xuống từ bar"] # 0x295f (en: 'rightwards harpoon with barb down from bar') + - "â„ ": [t: "harpoon đi lĂȘn với barb cĂČn láșĄi từ quĂĄn bar"] # 0x2960 (en: 'upwards harpoon with barb left from bar') + - "℥": [t: "downwards harpoon với barb rời khỏi quĂĄn bar"] # 0x2961 (en: 'downwards harpoon with barb left from bar') + - "ℹ": [t: "harpoon bĂȘn trĂĄi với barb lĂȘn trĂȘn harpoon bĂȘn trĂĄi với barb down"] # 0x2962 (en: 'leftwards harpoon with barb up above leftwards harpoon with barb down') + - "℣": [t: "harpoon đi lĂȘn với barb bĂȘn trĂĄi bĂȘn cáșĄnh harpoon với barb pháșŁi"] # 0x2963 (en: 'upwards harpoon with barb left beside upwards harpoon with barb right') + - "â„€": [t: "harpoon pháșŁi với barb lĂȘn trĂȘn harpoon bĂȘn pháșŁi với barb down"] # 0x2964 (en: 'rightwards harpoon with barb up above rightwards harpoon with barb down') + - "â„„": [t: "downwards harpoon với barb bĂȘn trĂĄi bĂȘn cáșĄnh harpoon với barb pháșŁi"] # 0x2965 (en: 'downwards harpoon with barb left beside downwards harpoon with barb right') + - "ℊ": [t: "harpoon bĂȘn trĂĄi với barb lĂȘn trĂȘn harpoon bĂȘn pháșŁi với barb up"] # 0x2966 (en: 'leftwards harpoon with barb up above rightwards harpoon with barb up') + - "â„§": [t: "harpoon bĂȘn trĂĄi với barb xuống phĂ­a trĂȘn harpoon bĂȘn pháșŁi với barb down"] # 0x2967 (en: 'leftwards harpoon with barb down above rightwards harpoon with barb down') + - "ℚ": [t: "harpoon pháșŁi với barb lĂȘn trĂȘn harpoon bĂȘn trĂĄi với barb up"] # 0x2968 (en: 'rightwards harpoon with barb up above leftwards harpoon with barb up') + - "â„©": [t: "harpoon pháșŁi với barb xuống phĂ­a trĂȘn harpoon bĂȘn trĂĄi với barb down"] # 0x2969 (en: 'rightwards harpoon with barb down above leftwards harpoon with barb down') + - "â„Ș": [t: "harpoon bĂȘn trĂĄi với barb lĂȘn trĂȘn dash dĂ i"] # 0x296a (en: 'leftwards harpoon with barb up above long dash') + - "â„«": [t: "harpoon bĂȘn trĂĄi với barb xuống bĂȘn dưới dáș„u gáșĄch ngang dĂ i"] # 0x296b (en: 'leftwards harpoon with barb down below long dash') + - "ℏ": [t: "harpoon bĂȘn pháșŁi với barb lĂȘn trĂȘn dash dĂ i"] # 0x296c (en: 'rightwards harpoon with barb up above long dash') + - "â„­": [t: "harpoon bĂȘn pháșŁi với barb xuống bĂȘn dưới dash dĂ i"] # 0x296d (en: 'rightwards harpoon with barb down below long dash') + - "℟": [t: "harpoon đi lĂȘn với barb bĂȘn trĂĄi bĂȘn cáșĄnh harpoon với barb pháșŁi"] # 0x296e (en: 'upwards harpoon with barb left beside downwards harpoon with barb right') + - "ℯ": [t: "downwards harpoon với barb bĂȘn trĂĄi bĂȘn cáșĄnh harpoon với barb pháșŁi"] # 0x296f (en: 'downwards harpoon with barb left beside upwards harpoon with barb right') + - "â„°": [t: "mĆ©i tĂȘn đîi pháșŁi với đáș§u trĂČn"] # 0x2970 (en: 'right double arrow with rounded head') + - "ℱ": [t: "báș±ng với mĆ©i tĂȘn bĂȘn pháșŁi"] # 0x2971 (en: 'equals above rightwards arrow') + - "â„Č": [t: "toĂĄn tá»­ tilde phĂ­a trĂȘn mĆ©i tĂȘn bĂȘn pháșŁi"] # 0x2972 (en: 'tilde operator above rightwards arrow') + - "ℳ": [t: "mĆ©i tĂȘn trĂĄi phĂ­a trĂȘn toĂĄn tá»­ tilde"] # 0x2973 (en: 'leftwards arrow above tilde operator') + - "ℎ": [t: "mĆ©i tĂȘn bĂȘn pháșŁi phĂ­a trĂȘn toĂĄn tá»­ tilde"] # 0x2974 (en: 'rightwards arrow above tilde operator') + - "â„”": [t: "mĆ©i tĂȘn bĂȘn pháșŁi trĂȘn gáș§n như báș±ng"] # 0x2975 (en: 'rightwards arrow above almost equal to') + - "â„¶": [t: "Ă­t hÆĄn mĆ©i tĂȘn bĂȘn trĂĄi"] # 0x2976 (en: 'less than above leftwards arrow') + - "â„·": [t: "mĆ©i tĂȘn trĂĄi qua Ă­t hÆĄn"] # 0x2977 (en: 'leftwards arrow through less than') + - "℞": [t: "lớn hÆĄn mĆ©i tĂȘn bĂȘn pháșŁi trĂȘn"] # 0x2978 (en: 'greater than above rightwards arrow') + - "â„č": [t: "táș­p hợp con trĂȘn mĆ©i tĂȘn pháșŁi"] # 0x2979 (en: 'subset above rightwards arrow') + - "â„ș": [t: "mĆ©i tĂȘn trĂĄi qua táș­p hợp con"] # 0x297a (en: 'leftwards arrow through subset') + - "â„»": [t: "superset phĂ­a trĂȘn mĆ©i tĂȘn trĂĄi"] # 0x297b (en: 'superset above leftwards arrow') + - "ℌ": [t: "đuĂŽi cĂĄ trĂĄi"] # 0x297c (en: 'left fish tail') + - "ℜ": [t: "đuĂŽi cĂĄ pháșŁi"] # 0x297d (en: 'right fish tail') + - "℟": [t: "lĂȘn đuĂŽi cĂĄ"] # 0x297e (en: 'up fish tail') + - "ℿ": [t: "xuống đuĂŽi cĂĄ"] # 0x297f (en: 'down fish tail') + - "⩀": [t: "triple dọc thanh phĂąn định"] # 0x2980 (en: 'triple vertical bar delimiter') + - "⊁": [t: "z kĂœ hiệu kĂœ hiệu"] # 0x2981 (en: 'z notation spot') + - "⩂": [t: "z kĂœ hiệu loáșĄi đáșĄi trĂ ng"] # 0x2982 (en: 'z notation type colon') + - "⊃": [t: "náșčp tráșŻng"] # 0x2983 (en: 'left white brace') + - "⩄": [t: "niềng răng tráșŻng pháșŁi"] # 0x2984 (en: 'right white brace') + - "⩅": [t: "dáș„u ngoáș·c Ä‘ÆĄn tráșŻng"] # 0x2985 (en: 'left white parenthesis') + - "⩆": [t: "dáș„u ngoáș·c Ä‘ÆĄn tráșŻng bĂȘn pháșŁi"] # 0x2986 (en: 'right white parenthesis') + - "⩇": [t: "z kĂœ hiệu bĂȘn trĂĄi khung hĂŹnh áșŁnh"] # 0x2987 (en: 'z notation left image bracket') + - "⊈": [t: "z kĂœ hiệu bĂȘn pháșŁi khung hĂŹnh áșŁnh"] # 0x2988 (en: 'z notation right image bracket') + - "⩉": [t: "z kĂœ hiệu bĂȘn trĂĄi khung liĂȘn káșżt"] # 0x2989 (en: 'z notation left binding bracket') + - "⩊": [t: "z kĂœ hiệu bĂȘn pháșŁi khung liĂȘn káșżt"] # 0x298a (en: 'z notation right binding bracket') + - "⩋": [t: "khung vuĂŽng bĂȘn trĂĄi với unterbar"] # 0x298b (en: 'left square bracket with underbar') + - "⩌": [t: "khung vuĂŽng bĂȘn pháșŁi với atarbar"] # 0x298c (en: 'right square bracket with underbar') + - "⊍": [t: "khung vuĂŽng bĂȘn trĂĄi với tĂ­ch táșŻc ở gĂłc trĂȘn cĂčng"] # 0x298d (en: 'left square bracket with tick in top corner') + - "⊎": [t: "khung vuĂŽng bĂȘn pháșŁi với tĂ­ch táșŻc ở gĂłc dưới cĂčng"] # 0x298e (en: 'right square bracket with tick in bottom corner') + - "⊏": [t: "khung vuĂŽng bĂȘn trĂĄi với tĂ­ch táșŻc ở gĂłc dưới cĂčng"] # 0x298f (en: 'left square bracket with tick in bottom corner') + - "⊐": [t: "khung vuĂŽng bĂȘn pháșŁi với tĂ­ch táșŻc ở gĂłc trĂȘn cĂčng"] # 0x2990 (en: 'right square bracket with tick in top corner') + - "⩑": [t: "khung gĂłc trĂĄi với dáș„u cháș„m"] # 0x2991 (en: 'left angle bracket with dot') + - "⩒": [t: "khung gĂłc pháșŁi với dáș„u cháș„m"] # 0x2992 (en: 'right angle bracket with dot') + - "⩓": [t: "vĂČng cung trĂĄi Ă­t hÆĄn khung"] # 0x2993 (en: 'left arc less than bracket') + - "⩔": [t: "arc bĂȘn pháșŁi lớn hÆĄn giĂĄ đụ"] # 0x2994 (en: 'right arc greater than bracket') + - "⩕": [t: "double left arc lớn hÆĄn giĂĄ đụ"] # 0x2995 (en: 'double left arc greater than bracket') + - "⩖": [t: "double bĂȘn pháșŁi vĂČng cung Ă­t hÆĄn khung"] # 0x2996 (en: 'double right arc less than bracket') + - "⩗": [t: "để láșĄi khung vỏ rĂča đen"] # 0x2997 (en: 'left black tortoise shell bracket') + - "⊘": [t: "bĂȘn pháșŁi khung vỏ rĂča đen"] # 0x2998 (en: 'right black tortoise shell bracket') + - "⩙": [t: "hĂ ng rĂ o cháș„m"] # 0x2999 (en: 'dotted fence') + - "⩚": [t: "đường ngoáș±n ngoĂšo dọc"] # 0x299a (en: 'vertical zigzag line') + - "⩛": [t: "đo gĂłc mở bĂȘn trĂĄi"] # 0x299b (en: 'measured angle opening left') + - "⩜": [t: "biáșżn gĂłc bĂȘn pháșŁi với hĂŹnh vuĂŽng"] # 0x299c (en: 'right angle varient with square') + - "⊝": [t: "đo gĂłc bĂȘn pháșŁi với dáș„u cháș„m"] # 0x299d (en: 'measured right angle with dot') + - "⊞": [t: "gĂłc với s bĂȘn trong"] # 0x299e (en: 'angle with s inside') + - "⩟": [t: "gĂłc nhọn"] # 0x299f (en: 'acute angle') + - "⊠": [t: "gĂłc spehrical mở bĂȘn trĂĄi"] # 0x29a0 (en: 'spehrical angle opening left') + - "⊥": [t: "gĂłc spehrical mở ra"] # 0x29a1 (en: 'spehrical angle opening up') + - "⊹": [t: "quay gĂłc"] # 0x29a2 (en: 'turned angle') + - "⊣": [t: "gĂłc đáșŁo ngÆ°á»Łc"] # 0x29a3 (en: 'reversed angle') + - "⊀": [t: "gĂłc với atarbar"] # 0x29a4 (en: 'angle with underbar') + - "⊄": [t: "gĂłc đáșŁo ngÆ°á»Łc với unterbar"] # 0x29a5 (en: 'reversed angle with underbar') + - "⊊": [t: "gĂłc xiĂȘn mở ra"] # 0x29a6 (en: 'oblique angle opening up') + - "⊧": [t: "gĂłc xiĂȘn mở xuống"] # 0x29a7 (en: 'oblique angle opening down') + - "⊚": [t: "đo gĂłc với đáș§u cĂĄnh tay mở trong mĆ©i tĂȘn chỉ lĂȘn vĂ  sang pháșŁi"] # 0x29a8 (en: 'measured angle with open arm ending in arrow pointing up and to the right') + - "⊩": [t: "đo gĂłc với đáș§u cĂĄnh tay mở trong mĆ©i tĂȘn hướng lĂȘn vĂ  bĂȘn trĂĄi"] # 0x29a9 (en: 'measured angle with open arm ending in arrow pointing up and to the left') + - "âŠȘ": [t: "đo gĂłc với đáș§u cĂĄnh tay mở trong mĆ©i tĂȘn chỉ xuống vĂ  bĂȘn pháșŁi"] # 0x29aa (en: 'measured angle with open arm ending in arrow pointing down and to the right') + - "⊫": [t: "đo gĂłc với đáș§u cĂĄnh tay mở trong mĆ©i tĂȘn chỉ xuống vĂ  bĂȘn trĂĄi"] # 0x29ab (en: 'measured angle with open arm ending in arrow pointing down and to the left') + - "⊏": [t: "đo gĂłc với đáș§u cĂĄnh tay mở trong mĆ©i tĂȘn hướng tháșłng vĂ  lĂȘn"] # 0x29ac (en: 'measured angle with open arm ending in arrow pointing right and up') + - "⊭": [t: "đo gĂłc với đáș§u cĂĄnh tay mở trong mĆ©i tĂȘn hướng sang trĂĄi vĂ  lĂȘn"] # 0x29ad (en: 'measured angle with open arm ending in arrow pointing left and up') + - "⊟": [t: "đo gĂłc với đáș§u cĂĄnh tay mở trong mĆ©i tĂȘn chỉ tháșłng vĂ  xuống"] # 0x29ae (en: 'measured angle with open arm ending in arrow pointing right and down') + - "⊯": [t: "đo gĂłc với đáș§u cĂĄnh tay mở trong mĆ©i tĂȘn hướng sang trĂĄi vĂ  xuống"] # 0x29af (en: 'measured angle with open arm ending in arrow pointing left and down') + - "⊰": [t: "đáșŁo ngÆ°á»Łc bộ trống"] # 0x29b0 (en: 'reversed empty set') + - "⊱": [t: "bộ trống với thanh toĂĄn quĂĄ mức"] # 0x29b1 (en: 'empty set with overbar') + - "âŠČ": [t: "bộ trống với vĂČng trĂČn nhỏ ở trĂȘn"] # 0x29b2 (en: 'empty set with small circle above') + - "⊳": [t: "bộ trống với mĆ©i tĂȘn pháșŁi ở trĂȘn"] # 0x29b3 (en: 'empty set with right arrow above') + - "⊎": [t: "bộ trống với mĆ©i tĂȘn trĂĄi ở trĂȘn"] # 0x29b4 (en: 'empty set with left arrow above') + - "⊔": [t: "vĂČng trĂČn với thanh ngang"] # 0x29b5 (en: 'circle with horizontal bar') + - "⊶": [t: "bao quanh thanh dọc"] # 0x29b6 (en: 'circled vertical bar') + - "⊷": [t: "bao quanh song song"] # 0x29b7 (en: 'circled parallel') + - "⊞": [t: "khoanh trĂČn đáșŁo ngÆ°á»Łc solidus"] # 0x29b8 (en: 'circled reverse solidus') + - "âŠč": [t: "khoanh trĂČn vuĂŽng gĂłc"] # 0x29b9 (en: 'circled perpendicular') + - "âŠș": [t: "Ä‘Æ°á»Łc khoanh trĂČn chia cho thanh ngang vĂ  ná»­a trĂȘn chia cho thanh dọc"] # 0x29ba (en: 'circled divided by horizontal bar and top half divided by vertical bar') + - "⊻": [t: "vĂČng trĂČn với x chồng cháș„t x"] # 0x29bb (en: 'circle with superimposed x') + - "⊌": [t: "bao quanh dáș„u hiệu phĂąn chia quay ngÆ°á»Łc chiều kim đồng hồ"] # 0x29bc (en: 'circled anticlockwise rotated division sign') + - "⊜": [t: "lĂȘn mĆ©i tĂȘn qua vĂČng trĂČn"] # 0x29bd (en: 'up arrow through circle') + - "⊟": [t: "vĂČng đáșĄn tráșŻng bao quanh"] # 0x29be (en: 'circled white bullet') + - "⊿": [t: "vĂČng đáșĄn khoanh trĂČn"] # 0x29bf (en: 'circled bullet') + - "⧀": [t: "khoanh trĂČn Ă­t hÆĄn"] # 0x29c0 (en: 'circled less than') + - "⧁": [t: "bao quanh lớn hÆĄn"] # 0x29c1 (en: 'circled greater than') + - "⧂": [t: "vĂČng trĂČn với vĂČng trĂČn nhỏ ở bĂȘn pháșŁi"] # 0x29c2 (en: 'circle with small circle to the right') + - "⧃": [t: "vĂČng trĂČn với hai nĂ©t ngang ở bĂȘn pháșŁi"] # 0x29c3 (en: 'circle with two horizontal strokes to the right') + - "⧄": [t: "squared tăng chĂ©o chĂ©o"] # 0x29c4 (en: 'squared rising diagonal slash') + - "⧅": [t: "squared rÆĄi chĂ©o chĂ©o"] # 0x29c5 (en: 'squared falling diagonal slash') + - "⧆": [t: "dáș„u hoa thị bĂŹnh phÆ°ÆĄng"] # 0x29c6 (en: 'squared asterisk') + - "⧇": [t: "vĂČng trĂČn nhỏ bĂŹnh phÆ°ÆĄng"] # 0x29c7 (en: 'squared small circle') + - "⧈": [t: "quáșŁng trường bĂŹnh phÆ°ÆĄng"] # 0x29c8 (en: 'squared square') + - "⧉": [t: "hai người tham gia quáșŁng trường"] # 0x29c9 (en: 'two joined squares') + - "⧊": [t: "tam giĂĄc với dáș„u cháș„m ở trĂȘn"] # 0x29ca (en: 'triangle with dot above') + - "⧋": [t: "tam giĂĄc với atarbar"] # 0x29cb (en: 'triangle with underbar') + - "⧌": [t: "s trong tam giĂĄc"] # 0x29cc (en: 's in triangle') + - "⧍": [t: "tam giĂĄc với serifs ở dưới cĂčng"] # 0x29cd (en: 'triangle with serifs at bottom') + - "⧎": [t: "tam giĂĄc pháșŁi phĂ­a trĂȘn tam giĂĄc trĂĄi"] # 0x29ce (en: 'right triangle above left triangle') + - "⧏": [t: "trĂĄi timgle bĂȘn cáșĄnh thanh dọc"] # 0x29cf (en: 'left triangle beside vertical bar') + - "⧐": [t: "thanh dọc bĂȘn cáșĄnh tam giĂĄc pháșŁi"] # 0x29d0 (en: 'vertical bar beside right triangle') + - "⧑": [t: "bowtie với một ná»­a mĂ u đen"] # 0x29d1 (en: 'bowtie with left half black') + - "⧒": [t: "bowtie với ná»­a đen pháșŁi"] # 0x29d2 (en: 'bowtie with right half black') + - "⧓": [t: "bowtie đen"] # 0x29d3 (en: 'black bowtie') + - "⧔": [t: "láș§n với một ná»­a mĂ u đen"] # 0x29d4 (en: 'times with left half black') + - "⧕": [t: "láș§n với ná»­a mĂ u đen bĂȘn pháșŁi"] # 0x29d5 (en: 'times with right half black') + - "⧖": [t: "đồng hồ cĂĄt tráșŻng"] # 0x29d6 (en: 'white hourglass') + - "⧗": [t: "đồng hồ cĂĄt đen"] # 0x29d7 (en: 'black hourglass') + - "⧘": [t: "để láșĄi hĂ ng rĂ o đau khổ"] # 0x29d8 (en: 'left wiggly fence') + - "⧙": [t: "hĂ ng rĂ o pháșŁi"] # 0x29d9 (en: 'right wiggly fence') + - "⧚": [t: "để láșĄi đîi hĂ ng rĂ o"] # 0x29da (en: 'left double wiggly fence') + - "⧛": [t: "pháșŁi đîi hĂ ng rĂ o wiggly"] # 0x29db (en: 'right double wiggly fence') + - "⧜": [t: "infinity khĂŽng đáș§y đủ"] # 0x29dc (en: 'incomplete infinity') + - "⧝": [t: "buộc vĂŽ cá»±c"] # 0x29dd (en: 'tie over infinity') + - "⧞": [t: "infinity phá»§ định với thanh tháșłng đứng"] # 0x29de (en: 'infinity negated with vertical bar') + - "⧟": [t: "multimap káșżt thĂșc hai láș§n"] # 0x29df (en: 'double-ended multimap') + - "â§ ": [t: "hĂŹnh vuĂŽng với đường viền đường viền"] # 0x29e0 (en: 'square with contoured outline') + - "â§Ą": [t: "tăng như"] # 0x29e1 (en: 'increases as') + - "â§ą": [t: "sáșŁn pháș©m xĂĄo trộn"] # 0x29e2 (en: 'shuffle product') + - "â§Ł": [t: "báș±ng dáș„u hiệu vĂ  song song nghiĂȘng"] # 0x29e3 (en: 'equals sign and slanted parallel') + - "â§€": [t: "báș±ng dáș„u hiệu vĂ  song song nghiĂȘng với tilde ở trĂȘn"] # 0x29e4 (en: 'equals sign and slanted parallel with tilde above') + - "â§„": [t: "giống hệt vĂ  nghiĂȘng song song"] # 0x29e5 (en: 'identical to and slanted parallel') + - "â§Š": [t: "gleich stark"] # 0x29e6 + - "â§§": [t: "đo nhiệt"] # 0x29e7 (en: 'thermydynamic') + - "â§š": [t: "xuống hĂŹnh tam giĂĄc với ná»­a mĂ u đen trĂĄi"] # 0x29e8 (en: 'down pointing triangle with left half black') + - "â§©": [t: "xuống hĂŹnh tam giĂĄc với ná»­a mĂ u đen bĂȘn pháșŁi"] # 0x29e9 (en: 'down pointing triangle with right half black') + - "â§Ș": [t: "kim cÆ°ÆĄng đen với mĆ©i tĂȘn xuống"] # 0x29ea (en: 'black diamond with down arrow') + - "â§«": [t: "black lozenge"] # 0x29eb + - "â§Ź": [t: "vĂČng trĂČn mĂ u tráșŻng với mĆ©i tĂȘn xuống"] # 0x29ec (en: 'white circle with down arrow') + - "â§­": [t: "vĂČng trĂČn mĂ u đen với mĆ©i tĂȘn xuống"] # 0x29ed (en: 'black circle with down arrow') + - "â§ź": [t: "quáșŁng trường tráșŻng lỗi"] # 0x29ee (en: 'error-barred white square') + - "â§Ż": [t: "quáșŁng trường đen lỗi lỗi"] # 0x29ef (en: 'error-barred black square') + - "â§°": [t: "kim cÆ°ÆĄng tráșŻng lỗi lỗi"] # 0x29f0 (en: 'error-barred white diamond') + - "â§±": [t: "kim cÆ°ÆĄng đen lỗi lỗi"] # 0x29f1 (en: 'error-barred black diamond') + - "â§Č": [t: "vĂČng trĂČn tráșŻng lỗi"] # 0x29f2 (en: 'error-barred white circle') + - "â§ł": [t: "vĂČng trĂČn đen lỗi"] # 0x29f3 (en: 'error-barred black circle') + - "â§Ž": [t: "sá»± triệt tiĂȘu quy táșŻc"] # 0x29f4 (en: 'rule-delayed') + - "â§”": [t: "hiệu"] # 0x29f5 (en: 'reverse solidus operator') + - "â§¶": [t: "solidus với overbar"] # 0x29f6 (en: 'solidus with overbar') + - "â§·": [t: "đáșŁo ngÆ°á»Łc solidus với gáșĄch ngang"] # 0x29f7 (en: 'reverse solidus with horizontal stroke') + - "â§ž": [t: "solidus lớn"] # 0x29f8 (en: 'big solidus') + - "â§č": [t: "solidus đáșŁo ngÆ°á»Łc lớn"] # 0x29f9 (en: 'big reverse solidus') + - "â§ș": [t: "double plus"] # 0x29fa + - "â§»": [t: "triple plus"] # 0x29fb + - "â§Œ": [t: "bĂȘn trĂĄi, giĂĄ đụ gĂłc cong"] # 0x29fc (en: 'left pointing curved angle bracket') + - "â§œ": [t: "chĂąn pháșŁi cong khung gĂłc cong"] # 0x29fd (en: 'right pointing curved angle bracket') + - "â§Ÿ": [t: "nhỏ bĂ©"] # 0x29fe (en: 'tiny') + - "â§ż": [t: "miny"] # 0x29ff + - "⹀": [t: "toĂĄn tá»­ cháș„m Ä‘Æ°á»Łc khoanh trĂČn"] # 0x2a00 (en: 'circled dot operator') + - "⚁": [t: "tuyáșżn đường cộng với toĂĄn tá»­ cộng với"] # 0x2a01 (en: 'circled plus operator') + - "⹂": [t: "nhĂ  điều hĂ nh thời gian Ä‘Æ°á»Łc khoanh trĂČn"] # 0x2a02 (en: 'circled times operator') + - "⚃": [t: "nhĂ  điều hĂ nh cĂŽng đoĂ n với dot"] # 0x2a03 (en: 'union operator with dot') + - "⹄": [t: "nhĂ  điều hĂ nh cĂŽng đoĂ n với plus"] # 0x2a04 (en: 'union operator with plus') + - "⹅": [t: "toĂĄn tá»­ giao lộ vuĂŽng"] # 0x2a05 (en: 'square intersection operator') + - "⹆": [t: "nhĂ  điều hĂ nh liĂȘn minh vuĂŽng"] # 0x2a06 (en: 'square union operator') + - "⹇": [t: "hai logic vĂ  toĂĄn tá»­"] # 0x2a07 (en: 'two logical and operator') + - "⚈": [t: "hai logic hoáș·c toĂĄn tá»­"] # 0x2a08 (en: 'two logical or operator') + - "⹉": [t: "nhĂ  điều hĂ nh láș§n"] # 0x2a09 (en: 'times operator') + - "⹊": [t: "modulo hai tổng"] # 0x2a0a (en: 'modulo two sum') + - "⹋": [t: "tổng hợp với tĂ­ch phĂąn"] # 0x2a0b (en: 'summation with integral') + - "⹌": [t: "toĂĄn tá»­ tĂ­ch phĂąn tứ giĂĄc"] # 0x2a0c (en: 'quadruple integral operator') + - "⚍": [t: "tĂ­ch hợp pháș§n hữu háșĄn"] # 0x2a0d (en: 'finite part integral') + - "⚎": [t: "tĂ­ch hợp với gáșĄch đîi"] # 0x2a0e (en: 'integral with double stroke') + - "⚏": [t: "tĂ­ch hợp trung bĂŹnh với chĂ©m"] # 0x2a0f (en: 'integral average with slash') + - "⚐": [t: "chức năng lưu thĂŽng"] # 0x2a10 (en: 'circulation function') + - "⹑": [t: "tĂ­ch hợp ngÆ°á»Łc chiều kim đồng hồ"] # 0x2a11 (en: 'anticlockwise integration') + - "⹒": [t: "tĂ­ch hợp đường với đường hĂŹnh chữ nháș­t xung quanh cá»±c"] # 0x2a12 (en: 'line integration with rectangular path around pole') + - "⹓": [t: "tĂ­ch hợp dĂČng với đường dáș«n hĂŹnh bĂĄn nguyệt xung quanh cá»±c"] # 0x2a13 (en: 'line integration with semicircular path around pole') + - "⹔": [t: "tĂ­ch hợp dĂČng khĂŽng bao gồm cá»±c"] # 0x2a14 (en: 'line integration not including the pole') + - "⹕": [t: "tĂ­ch hợp xung quanh một toĂĄn tá»­ điểm"] # 0x2a15 (en: 'integral around a point operator') + - "⹖": [t: "toĂĄn tá»­ tĂ­ch phĂąn quarternion"] # 0x2a16 (en: 'quaternion integral operator') + - "⹗": [t: "tĂ­ch hợp với mĆ©i tĂȘn trĂĄi với mĂłc"] # 0x2a17 (en: 'integral with leftwards arrow with hook') + - "⚘": [t: "tĂ­ch hợp với dáș„u hiệu thời gian"] # 0x2a18 (en: 'integral with times sign') + - "⹙": [t: "tĂ­ch hợp với giao điểm"] # 0x2a19 (en: 'integral with intersection') + - "⹚": [t: "tĂ­ch hợp với liĂȘn minh"] # 0x2a1a (en: 'integral with union') + - "⹛": [t: "tĂ­ch hợp với overbar"] # 0x2a1b (en: 'integral with overbar') + - "⹜": [t: "tĂ­ch hợp với underbar"] # 0x2a1c (en: 'integral with underbar') + - "⚝": [t: "tham gia"] # 0x2a1d (en: 'join') + - "⚞": [t: "người váș­n hĂ nh tam giĂĄc lớn bĂȘn trĂĄi"] # 0x2a1e (en: 'large left triangle operator') + - "⹟": [t: "thĂ nh pháș§n lÆ°á»Łc đồ kĂœ hiệu z"] # 0x2a1f (en: 'z notation schema composition') + - "âš ": [t: "z kĂœ hiệu kĂœ đồ đường ống"] # 0x2a20 (en: 'z notation schema piping') + - "⚥": [t: "z kĂœ đồ kĂœ đồ"] # 0x2a21 (en: 'z notation schema projection') + - "âšą": [t: "cộng với dáș„u hiệu với vĂČng trĂČn ở trĂȘn"] # 0x2a22 (en: 'plus sign with circle above') + - "⚣": [t: "cộng với dáș„u hiệu với giọng nĂłi ở trĂȘn"] # 0x2a23 (en: 'plus sign with circumflex accent above') + - "⚀": [t: "cộng với dáș„u hiệu với tilde ở trĂȘn"] # 0x2a24 (en: 'plus sign with tilde above') + - "âš„": [t: "cộng với dáș„u hiệu với dáș„u cháș„m dưới đñy"] # 0x2a25 (en: 'plus sign with dot below') + - "⚊": [t: "cộng với dáș„u hiệu với tilde dưới đñy"] # 0x2a26 (en: 'plus sign with tilde below') + - "âš§": [t: "cộng với dáș„u hiệu với chỉ số hai"] # 0x2a27 (en: 'plus sign with subscript two') + - "âšš": [t: "cộng với dáș„u hiệu với tam giĂĄc đen"] # 0x2a28 (en: 'plus sign with black triangle') + - "âš©": [t: "điểm trừ dáș„u hiệu với dáș„u pháș©y ở trĂȘn"] # 0x2a29 (en: 'minus sign with comma above') + - "âšȘ": [t: "điểm trừ với dáș„u cháș„m dưới đñy"] # 0x2a2a (en: 'minus sign with dot below') + - "âš«": [t: "điểm trừ với dáș„u cháș„m rÆĄi"] # 0x2a2b (en: 'minus sign with falling dots') + - "⚏": [t: "điểm trừ với dáș„u hiệu tăng"] # 0x2a2c (en: 'minus sign with rising dots') + - "âš­": [t: "cộng với dáș„u hiệu trong ná»­a vĂČng trĂČn trĂĄi"] # 0x2a2d (en: 'plus sign in left half circle') + - "âšź": [t: "cộng với đăng nháș­p vĂ o ná»­a vĂČng trĂČn bĂȘn pháșŁi"] # 0x2a2e (en: 'plus sign in right half circle') + - "⚯": [t: "sáșŁn pháș©m chĂ©o"] # 0x2a2f (en: 'cross product') + - "âš°": [t: "dáș„u hiệu nhĂąn với dáș„u cháș„m ở trĂȘn"] # 0x2a30 (en: 'multiplication sign with dot above') + - "âš±": [t: "dáș„u hiệu nhĂąn với inderbar"] # 0x2a31 (en: 'multiplication sign with underbar') + - "âšČ": [t: "sáșŁn pháș©m bĂĄn káșżt với đóng đáy đóng"] # 0x2a32 (en: 'semidirect product with bottom closed') + - "âšł": [t: "smash sáșŁn pháș©m"] # 0x2a33 (en: 'smash product') + - "⚎": [t: "dáș„u nhĂąn trong ná»­a vĂČng trĂČn trĂĄi"] # 0x2a34 (en: 'multiplication sign in left half circle') + - "âš”": [t: "đăng nháș­p nhĂąn trong ná»­a vĂČng trĂČn bĂȘn pháșŁi"] # 0x2a35 (en: 'multiplication sign in right half circle') + - "âš¶": [t: "dáș„u hiệu nhĂąn Ä‘Æ°á»Łc khoanh trĂČn với giọng nĂłi chu vi"] # 0x2a36 (en: 'circled multiplication sign with circumflex accent') + - "âš·": [t: "hiệu số nhĂąn trong vĂČng trĂČn đîi"] # 0x2a37 (en: 'multiplication sign in double circle') + - "âšž": [t: "dáș„u hiệu phĂąn chia vĂČng trĂČn"] # 0x2a38 (en: 'circled division sign') + - "âšč": [t: "cộng với dáș„u hiệu trong tam giĂĄc"] # 0x2a39 (en: 'plus sign in triangle') + - "âšș": [t: "trừ dáș„u hiệu trong tam giĂĄc"] # 0x2a3a (en: 'minus sign in triangle') + - "âš»": [t: "dáș„u hiệu nhĂąn trong tam giĂĄc"] # 0x2a3b (en: 'multiplication sign in triangle') + - "⚌": [t: "sáșŁn pháș©m nội tháș„t"] # 0x2a3c (en: 'interior product') + - "âšœ": [t: "sáșŁn pháș©m nội tháș„t bĂȘn tay"] # 0x2a3d (en: 'righthand interior product') + - "âšź": [t: "z kĂœ hiệu thĂ nh pháș§n quan hệ"] # 0x2a2e (en: 'z notation relational composition') + - "âšż": [t: "hợp nháș„t hoáș·c coproduct"] # 0x2a3f (en: 'amalgamation or coproduct') + - "⩀": [t: "giao lộ với dáș„u cháș„m"] # 0x2a40 (en: 'intersection with dot') + - "⩁": [t: "liĂȘn minh với dáș„u hiệu trừ"] # 0x2a41 (en: 'union with minus sign') + - "⩂": [t: "liĂȘn minh với overbar"] # 0x2a42 (en: 'union with overbar') + - "⩃": [t: "giao lộ với overbar"] # 0x2a43 (en: 'intersection with overbar') + - "⩄": [t: "giao lộ với logic vĂ "] # 0x2a44 (en: 'intersection with logical and') + - "⩅": [t: "liĂȘn káșżt với logic hoáș·c"] # 0x2a45 (en: 'union with logical or') + - "⩆": [t: "liĂȘn minh trĂȘn giao lộ"] # 0x2a46 (en: 'union above intersection') + - "⩇": [t: "giao lộ trĂȘn liĂȘn minh"] # 0x2a47 (en: 'intersection above union') + - "⩈": [t: "liĂȘn minh trĂȘn thanh trĂȘn giao lộ"] # 0x2a48 (en: 'union above bar above intersection') + - "⩉": [t: "giao lộ trĂȘn thanh trĂȘn liĂȘn minh"] # 0x2a49 (en: 'intersection above bar above union') + - "⩊": [t: "liĂȘn minh bĂȘn cáșĄnh vĂ  tham gia với liĂȘn minh"] # 0x2a4a (en: 'union beside and joined with union') + - "⩋": [t: "giao lộ bĂȘn cáșĄnh vĂ  tham gia với giao lộ"] # 0x2a4b (en: 'intersection beside and joined with intersection') + - "⩌": [t: "đóng káșżt hợp với serifs"] # 0x2a4c (en: 'closed union with serifs') + - "⩍": [t: "giao lộ đóng với serifs"] # 0x2a4d (en: 'closed intersection with serifs') + - "⩎": [t: "giao lộ kĂ©p vuĂŽng"] # 0x2a4e (en: 'double square intersection') + - "⩏": [t: "double square union"] # 0x2a4f + - "⩐": [t: "đóng liĂȘn minh với serifs vĂ  smash sáșŁn pháș©m"] # 0x2a50 (en: 'closed union with serifs and smash product') + - "⩑": [t: "logic vĂ  với dáș„u cháș„m ở trĂȘn"] # 0x2a51 (en: 'logical and with dot above') + - "⩒": [t: "logic hoáș·c với dáș„u cháș„m ở trĂȘn"] # 0x2a52 (en: 'logical or with dot above') + - "⩓": [t: "gáș„p đîi logic vĂ "] # 0x2a53 (en: 'double logical and') + - "⩔": [t: "gáș„p đîi logic hoáș·c"] # 0x2a54 (en: 'double logical or') + - "⩕": [t: "hai giao nhau logic vĂ "] # 0x2a55 (en: 'two intersecting logical and') + - "⩖": [t: "hai giao nhau logic hoáș·c"] # 0x2a56 (en: 'two intersecting logical or') + - "⩗": [t: "dốc lớn hoáș·c"] # 0x2a57 (en: 'sloping large or') + - "⩘": [t: "dốc lớn vĂ "] # 0x2a58 (en: 'sloping large and') + - "⩙": [t: "logic hoáș·c chồng chĂ©o logic vĂ "] # 0x2a59 (en: 'logical or overlapping logical and') + - "⩚": [t: "logic vĂ  với thĂąn giữa"] # 0x2a5a (en: 'logical and with middle stem') + - "⩛": [t: "logic hoáș·c với thĂąn giữa"] # 0x2a5b (en: 'logical or with middle stem') + - "⩜": [t: "logic vĂ  với dáș„u gáșĄch ngang ngang"] # 0x2a5c (en: 'logical and with horizontal dash') + - "⩝": [t: "logic hoáș·c với dáș„u gáșĄch ngang ngang"] # 0x2a5d (en: 'logical or with horizontal dash') + - "⩞": [t: "logic vĂ  với gáș„p đîi obbar"] # 0x2a5e (en: 'logical and with double overbar') + - "⩟": [t: "logic vĂ  với unterbar"] # 0x2a5f (en: 'logical and with underbar') + - "â© ": [t: "logic vĂ  với đîi bĂȘn dưới"] # 0x2a60 (en: 'logical and with double underbar') + - "⩥": [t: "vee nhỏ với atarbar"] # 0x2a61 (en: 'small vee with underbar') + - "⩹": [t: "logic hoáș·c với gáș„p đîi obbar"] # 0x2a62 (en: 'logical or with double overbar') + - "⩣": [t: "logic hoáș·c với đîi bĂȘn dưới"] # 0x2a63 (en: 'logical or with double underbar') + - "â©€": [t: "z kĂœ hiệu khĂĄng thể"] # 0x2a64 (en: 'z notation domain antirestriction') + - "â©„": [t: "z kĂœ hiệu pháșĄm vi chống trọng yáșżu"] # 0x2a65 (en: 'z notation range antirestriction') + - "⩊": [t: "báș±ng dáș„u hiệu với dáș„u cháș„m dưới đñy"] # 0x2a66 (en: 'equals sign with dot below') + - "â©§": [t: "giống hệt với dáș„u cháș„m trĂȘn"] # 0x2a67 (en: 'identical with dot above') + - "⩚": [t: "thanh ba ngang với gáșĄch dọc"] # 0x2a68 (en: 'triple horizontal bar with double vertical stroke') + - "â©©": [t: "thanh ba ngang với cĂș đánh tháșłng đứng ba"] # 0x2a69 (en: 'triple horizontal bar with triple vertical stroke') + - "â©Ș": [t: "toĂĄn tá»­ tilde với dáș„u cháș„m ở trĂȘn"] # 0x2a6a (en: 'tilde operator with dot above') + - "â©«": [t: "nhĂ  điều hĂ nh tilde với cĂĄc cháș„m tăng"] # 0x2a6b (en: 'tilde operator with rising dots') + - "⩏": [t: "tÆ°ÆĄng tá»± trừ tÆ°ÆĄng tá»±"] # 0x2a6c (en: 'similar minus similar') + - "â©­": [t: "đồng dáșĄng với dáș„u cháș„m ở trĂȘn"] # 0x2a6d (en: 'congruent with dot above') + - "⩟": [t: "báș±ng với dáș„u hoa thị"] # 0x2a6e (en: 'equals with asterisk') + - "⩯": [t: "gáș§n như báș±ng với giọng nĂłi chu vi"] # 0x2a6f (en: 'almost equal to with circumflex accent') + - "â©°": [t: "xáș„p xỉ báș±ng hoáș·c báș±ng"] # 0x2a70 (en: 'approximately equal to or equal to') + - "⩱": [t: "báș±ng dáș„u hiệu trĂȘn cộng với dáș„u hiệu"] # 0x2a71 (en: 'equals sign above plus sign') + - "â©Č": [t: "cộng với dáș„u hiệu trĂȘn báș±ng dáș„u hiệu"] # 0x2a72 (en: 'plus sign above equals sign') + - "⩳": [t: "báș±ng dáș„u hiệu trĂȘn toĂĄn tá»­ tilde"] # 0x2a73 (en: 'equals sign above tilde operator') + - "⩎": [t: "đáșĄi trĂ ng gáș„p đîi báș±ng nhau"] # 0x2a74 (en: 'double colon equal') + - "â©”": [t: "hai dáș„u hiệu liĂȘn tiáșżp"] # 0x2a75 (en: 'two consecutive equals signs') + - "â©¶": [t: "ba dáș„u hiệu liĂȘn tiáșżp"] # 0x2a76 (en: 'three consecutive equals signs') + - "â©·": [t: "báș±ng dáș„u hiệu với hai cháș„m trĂȘn vĂ  hai dáș„u cháș„m bĂȘn dưới"] # 0x2a77 (en: 'equals sign with two dots above and two dots below') + - "⩞": [t: "tÆ°ÆĄng Ä‘Æ°ÆĄng với bốn cháș„m trĂȘn"] # 0x2a78 (en: 'equivalent with four dots above') + - "â©č": [t: "Ă­t hÆĄn với vĂČng trĂČn bĂȘn trong"] # 0x2a79 (en: 'less than with circle inside') + - "â©ș": [t: "lớn hÆĄn với vĂČng trĂČn bĂȘn trong"] # 0x2a7a (en: 'greater than with circle inside') + - "â©»": [t: "Ă­t hÆĄn với dáș„u hỏi ở trĂȘn"] # 0x2a7b (en: 'less than with question mark above') + - "⩌": [t: "lớn hÆĄn với dáș„u hỏi ở trĂȘn"] # 0x2a7c (en: 'greater than with question mark above') + - "⩜": [t: "nhỏ hÆĄn hoáș·c nghiĂȘng báș±ng"] # 0x2a7d (en: 'less than or slanted equal to') + - "⩟": [t: "lớn hÆĄn hoáș·c nghiĂȘng báș±ng"] # 0x2a7e (en: 'greater than or slanted equal to') + - "⩿": [t: "nhỏ hÆĄn hoáș·c nghiĂȘng báș±ng với dáș„u cháș„m bĂȘn trong"] # 0x2a7f (en: 'less than or slanted equal to with dot inside') + - "âȘ€": [t: "lớn hÆĄn hoáș·c nghiĂȘng báș±ng với dáș„u cháș„m bĂȘn trong"] # 0x2a80 (en: 'greater than or slanted equal to with dot inside') + - "âȘ": [t: "nhỏ hÆĄn hoáș·c nghiĂȘng báș±ng với dáș„u cháș„m trĂȘn"] # 0x2a81 (en: 'less than or slanted equal to with dot above') + - "âȘ‚": [t: "lớn hÆĄn hoáș·c nghiĂȘng báș±ng với dáș„u cháș„m trĂȘn"] # 0x2a82 (en: 'greater than or slanted equal to with dot above') + - "âȘƒ": [t: "nhỏ hÆĄn hoáș·c nghiĂȘng báș±ng với dáș„u cháș„m phĂ­a trĂȘn bĂȘn pháșŁi"] # 0x2a83 (en: 'less than or slanted equal to with dot above right') + - "âȘ„": [t: "lớn hÆĄn hoáș·c nghiĂȘng báș±ng với dáș„u cháș„m phĂ­a trĂȘn bĂȘn trĂĄi"] # 0x2a84 (en: 'greater than or slanted equal to with dot above left') + - "âȘ…": [t: "Ă­t hÆĄn hoáș·c gáș§n đĂșng"] # 0x2a85 (en: 'less than or approximate') + - "âȘ†": [t: "lớn hÆĄn hoáș·c gáș§n đĂșng"] # 0x2a86 (en: 'greater than or approximate') + - "âȘ‡": [t: "nhỏ hÆĄn vĂ  dĂČng Ä‘ÆĄn khĂŽng báș±ng"] # 0x2a87 (en: 'less than and single line not equal to') + - "âȘˆ": [t: "lớn hÆĄn vĂ  dĂČng Ä‘ÆĄn khĂŽng báș±ng"] # 0x2a88 (en: 'greater than and single line not equal to') + - "âȘ‰": [t: "Ă­t hÆĄn vĂ  khĂŽng gáș§n đĂșng"] # 0x2a89 (en: 'less than and not approximate') + - "âȘŠ": [t: "lớn hÆĄn vĂ  khĂŽng gáș§n đĂșng"] # 0x2a8a (en: 'greater than and not approximate') + - "âȘ‹": [t: "Ă­t hÆĄn so với dĂČng gáș„p đîi báș±ng nhau trĂȘn lớn hÆĄn"] # 0x2a8b (en: 'less than above double line equal above greater than') + - "âȘŒ": [t: "lớn hÆĄn dĂČng gáș„p đîi trĂȘn báș±ng tháș„p hÆĄn"] # 0x2a8c (en: 'greater than above double line equal above less than') + - "âȘ": [t: "Ă­t hÆĄn trĂȘn tÆ°ÆĄng tá»± hoáș·c báș±ng nhau"] # 0x2a8d (en: 'less than above similar or equal') + - "âȘŽ": [t: "lớn hÆĄn trĂȘn tÆ°ÆĄng tá»± hoáș·c báș±ng nhau"] # 0x2a8e (en: 'greater than above similar or equal') + - "âȘ": [t: "Ă­t hÆĄn trĂȘn tÆ°ÆĄng tá»± ở trĂȘn lớn hÆĄn"] # 0x2a8f (en: 'less than above similar above greater than') + - "âȘ": [t: "lớn hÆĄn ở trĂȘn tÆ°ÆĄng tá»± ở trĂȘn nhỏ hÆĄn"] # 0x2a90 (en: 'greater than above similar above less than') + - "âȘ‘": [t: "Ă­t hÆĄn trĂȘn lớn hÆĄn so với dĂČng kĂ©p trĂȘn báș±ng nhau"] # 0x2a91 (en: 'less than above greater than above double line equal') + - "âȘ’": [t: "lớn hÆĄn trĂȘn nhỏ hÆĄn so với dĂČng gáș„p đîi báș±ng nhau"] # 0x2a92 (en: 'greater than above less than above double line equal') + - "âȘ“": [t: "Ă­t hÆĄn trĂȘn nghiĂȘng báș±ng nhau trĂȘn lớn hÆĄn so với trĂȘn nghiĂȘng báș±ng nhau"] # 0x2a93 (en: 'less than above slanted equal above greater than above slanted equal') + - "âȘ”": [t: "lớn hÆĄn trĂȘn nghiĂȘng báș±ng nhau trĂȘn tháș„p hÆĄn trĂȘn nghiĂȘng báș±ng nhau"] # 0x2a94 (en: 'greater than above slanted equal above less than above slanted equal') + - "âȘ•": [t: "nghiĂȘng báș±ng hoáș·c nhỏ hÆĄn"] # 0x2a95 (en: 'slanted equal to or less than') + - "âȘ–": [t: "nghiĂȘng báș±ng hoáș·c lớn hÆĄn"] # 0x2a96 (en: 'slanted equal to or greater than') + - "âȘ—": [t: "nghiĂȘng báș±ng hoáș·c Ă­t hÆĄn với dáș„u cháș„m bĂȘn trong"] # 0x2a97 (en: 'slanted equal to or less than with dot inside') + - "âȘ˜": [t: "nghiĂȘng báș±ng hoáș·c lớn hÆĄn với dáș„u cháș„m bĂȘn trong"] # 0x2a98 (en: 'slanted equal to or greater than with dot inside') + - "âȘ™": [t: "dĂČng hai báș±ng hoáș·c nhỏ hÆĄn"] # 0x2a99 (en: 'double line equal to or less than') + - "âȘš": [t: "double dĂČng báș±ng hoáș·c lớn hÆĄn"] # 0x2a9a (en: 'double line equal to or greater than') + - "âȘ›": [t: "đường đîi nghiĂȘng báș±ng hoáș·c nhỏ hÆĄn"] # 0x2a9b (en: 'double line slanted equal to or less than') + - "âȘœ": [t: "đường đîi nghiĂȘng báș±ng hoáș·c lớn hÆĄn"] # 0x2a9c (en: 'double line slanted equal to or greater than') + - "âȘ": [t: "tÆ°ÆĄng tá»± hoáș·c Ă­t hÆĄn"] # 0x2a9d (en: 'similar or less than') + - "âȘž": [t: "tÆ°ÆĄng tá»± hoáș·c lớn hÆĄn"] # 0x2a9e (en: 'similar or greater than') + - "âȘŸ": [t: "tÆ°ÆĄng tá»± ở trĂȘn nhỏ hÆĄn trĂȘn báș±ng dáș„u hiệu"] # 0x2a9f (en: 'similar above less than above equals sign') + - "âȘ ": [t: "tÆ°ÆĄng tá»± ở trĂȘn lớn hÆĄn trĂȘn báș±ng dáș„u hiệu"] # 0x2aa0 (en: 'similar above greater than above equals sign') + - "âȘĄ": [t: "kĂ©p lồng Ă­t hÆĄn"] # 0x2aa1 (en: 'double nested less than') + - "âȘą": [t: "kĂ©p lồng nhau lớn hÆĄn"] # 0x2aa2 (en: 'double nested greater than') + - "âȘŁ": [t: "kĂ©p lồng Ă­t hÆĄn với atarbar"] # 0x2aa3 (en: 'double nested less than with underbar') + - "âȘ€": [t: "lớn hÆĄn chồng chĂ©o Ă­t hÆĄn"] # 0x2aa4 (en: 'greater than overlapping less than') + - "âȘ„": [t: "lớn hÆĄn bĂȘn cáșĄnh Ă­t hÆĄn"] # 0x2aa5 (en: 'greater than beside less than') + - "âȘŠ": [t: "Ă­t hÆĄn đóng bởi đường cong"] # 0x2aa6 (en: 'less than closed by curve') + - "âȘ§": [t: "lớn hÆĄn đóng bởi đường cong"] # 0x2aa7 (en: 'greater than closed by curve') + - "âȘš": [t: "Ă­t hÆĄn đóng bởi đường cong trĂȘn nghiĂȘng báș±ng nhau"] # 0x2aa8 (en: 'less than closed by curve above slanted equal') + - "âȘ©": [t: "lớn hÆĄn đóng bởi đường cong trĂȘn nghiĂȘng báș±ng nhau"] # 0x2aa9 (en: 'greater than closed by curve above slanted equal') + - "âȘȘ": [t: "nhỏ hÆĄn"] # 0x2aaa (en: 'smaller than') + - "âȘ«": [t: "to hÆĄn"] # 0x2aab (en: 'larger than') + - "âȘŹ": [t: "nhỏ hÆĄn hoáș·c báș±ng"] # 0x2aac (en: 'smaller than or equal to') + - "âȘ­": [t: "lớn hÆĄn hoáș·c báș±ng"] # 0x2aad (en: 'larger than or equal to') + - "âȘź": [t: "báș±ng dáș„u hiệu với gáș­p ghềnh ở trĂȘn"] # 0x2aae (en: 'equals sign with bumpy above') + - "âȘŻ": [t: "trước dĂČng Ä‘ÆĄn báș±ng dáș„u hiệu"] # 0x2aaf (en: 'precedes above single line equals sign') + - "âȘ°": [t: "thĂ nh cĂŽng trĂȘn một dĂČng tÆ°ÆĄng Ä‘Æ°ÆĄng với dáș„u hiệu"] # 0x2ab0 (en: 'succeeds above single line equals sign') + - "âȘ±": [t: "tiền định trĂȘn dĂČng Ä‘ÆĄn khĂŽng báș±ng"] # 0x2ab1 (en: 'prededes above single line not equal to') + - "âȘČ": [t: "thĂ nh cĂŽng trĂȘn dĂČng Ä‘ÆĄn khĂŽng báș±ng"] # 0x2ab2 (en: 'succeeds above single line not equal to') + - "âȘł": [t: "trước dáș„u hiệu tÆ°ÆĄng Ä‘Æ°ÆĄng"] # 0x2ab3 (en: 'precedes above equals sign') + - "âȘŽ": [t: "thĂ nh cĂŽng trĂȘn dáș„u báș±ng"] # 0x2ab4 (en: 'succeeds above equals sign') + - "âȘ”": [t: "tiền định ở trĂȘn khĂŽng báș±ng"] # 0x2ab5 (en: 'prededes above not equal to') + - "âȘ¶": [t: "thĂ nh cĂŽng ở trĂȘn khĂŽng báș±ng"] # 0x2ab6 (en: 'succeeds above not equal to') + - "âȘ·": [t: "tiền định trĂȘn gáș§n như báș±ng"] # 0x2ab7 (en: 'prededes above almost equal to') + - "âȘž": [t: "thĂ nh cĂŽng trĂȘn gáș§n như báș±ng"] # 0x2ab8 (en: 'succeeds above almost equal to') + - "âȘč": [t: "trước ở trĂȘn khĂŽng gáș§n như báș±ng"] # 0x2ab9 (en: 'precedes above not almost equal to') + - "âȘș": [t: "thĂ nh cĂŽng ở trĂȘn khĂŽng gáș§n như báș±ng"] # 0x2aba (en: 'succeeds above not almost equal to') + - "âȘ»": [t: "gáș„p đîi trước"] # 0x2abb (en: 'double precedes') + - "âȘŒ": [t: "gáș„p đîi thĂ nh cĂŽng"] # 0x2abc (en: 'double succeeds') + - "âȘœ": [t: "táș­p hợp con với dáș„u cháș„m"] # 0x2abd (en: 'subset with dot') + - "âȘŸ": [t: "superset với dáș„u cháș„m"] # 0x2abe (en: 'superset with dot') + - "âȘż": [t: "táș­p hợp con với dáș„u cộng dưới đñy"] # 0x2abf (en: 'subset with plus sign below') + - "⫀": [t: "superset với dáș„u cộng dưới đñy"] # 0x2ac0 (en: 'superset with plus sign below') + - "⫁": [t: "táș­p hợp con với dáș„u hiệu nhĂąn dưới đñy"] # 0x2ac1 (en: 'subset with multiplication sign below') + - "⫂": [t: "superset với dáș„u hiệu nhĂąn dưới đñy"] # 0x2ac2 (en: 'superset with multiplication sign below') + - "⫃": [t: "táș­p hợp con hoáș·c báș±ng với dáș„u cháș„m trĂȘn"] # 0x2ac3 (en: 'subset of or equal to with dot above') + - "⫄": [t: "superset cá»§a hoáș·c báș±ng với dáș„u cháș„m trĂȘn"] # 0x2ac4 (en: 'superset of or equal to with dot above') + - "⫅": [t: "táș­p hợp con trĂȘn báș±ng dáș„u hiệu"] # 0x2ac5 (en: 'subset of above equals sign') + - "⫆": [t: "superset cá»§a dáș„u hiệu trĂȘn báș±ng"] # 0x2ac6 (en: 'superset of above equals sign') + - "⫇": [t: "táș­p hợp con cá»§a toĂĄn tá»­ tilde trĂȘn"] # 0x2ac7 (en: 'subset of above tilde operator') + - "⫈": [t: "superset cá»§a toĂĄn tá»­ tilde trĂȘn"] # 0x2ac8 (en: 'superset of above tilde operator') + - "⫉": [t: "táș­p hợp con trĂȘn gáș§n như báș±ng"] # 0x2ac9 (en: 'subset of above almost equal to') + - "⫊": [t: "superset cá»§a trĂȘn gáș§n như báș±ng"] # 0x2aca (en: 'superset of above almost equal to') + - "⫋": [t: "táș­p hợp con trĂȘn khĂŽng báș±ng"] # 0x2acb (en: 'subset above not equal to') + - "⫌": [t: "superset cá»§a ở trĂȘn khĂŽng báș±ng"] # 0x2acc (en: 'superset of above not equal to') + - "⫍": [t: "khối lÆ°á»Łng váș­n hĂ nh hộp mở bĂȘn trĂĄi"] # 0x2acd (en: 'square left open box operator') + - "⫎": [t: "thao tĂĄc hộp mở bĂȘn pháșŁi"] # 0x2ace (en: 'square right open box operator') + - "⫏": [t: "táș­p hợp con đóng"] # 0x2acf (en: 'closed subset') + - "⫐": [t: "superset khĂ©p kĂ­n"] # 0x2ad0 (en: 'closed superset') + - "⫑": [t: "táș­p hợp con đóng hoáș·c báș±ng"] # 0x2ad1 (en: 'closed subset or equal to') + - "⫒": [t: "superset đóng hoáș·c báș±ng"] # 0x2ad2 (en: 'closed superset or equal to') + - "⫓": [t: "táș­p hợp con trĂȘn superset"] # 0x2ad3 (en: 'subset above superset') + - "⫔": [t: "superset trĂȘn táș­p hợp con"] # 0x2ad4 (en: 'superset above subset') + - "⫕": [t: "táș­p hợp con trĂȘn táș­p hợp con"] # 0x2ad5 (en: 'subset above subset') + - "⫖": [t: "superset trĂȘn superset"] # 0x2ad6 (en: 'superset above superset') + - "⫗": [t: "superset bĂȘn cáșĄnh táș­p hợp con"] # 0x2ad7 (en: 'superset beside subset') + - "⫘": [t: "superset bĂȘn cáșĄnh vĂ  tham gia bởi dash với táș­p hợp con"] # 0x2ad8 (en: 'superset beside and joined by dash with subset') + - "⫙": [t: "yáșżu tố mở xuống dưới"] # 0x2ad9 (en: 'element of opening downwards') + - "⫚": [t: "pitchfork với tee top"] # 0x2ada (en: 'pitchfork with tee top') + - "⫛": [t: "giao lộ ngang"] # 0x2adb (en: 'transversal intersection') + - "⫝̸": [t: "đi"] # 0x2adc (en: 'forking') + - "⫝": [t: "khĂŽng hợp lệ"] # 0x2add (en: 'nonforking') + - "⫞": [t: "shrot rời khỏi tack"] # 0x2ade (en: 'shrot left tack') + - "⫟": [t: "ngáșŻn xuống tack"] # 0x2adf (en: 'short down tack') + - "â« ": [t: "ngáșŻn lĂȘn tack"] # 0x2ae0 (en: 'short up tack') + - "⫥": [t: "vuĂŽng gĂłc với s"] # 0x2ae1 (en: 'perpendicular with s') + - "⫹": [t: "thanh dọc ba vĂČng pháșŁi"] # 0x2ae2 (en: 'vertical bar triple right turnstile') + - "⫣": [t: "thanh gáș„p đîi ráșœ trĂĄi"] # 0x2ae3 (en: 'double vertical bar left turnstile') + - "â«€": [t: "thanh dọc gáș„p đîi ráșœ trĂĄi"] # 0x2ae4 (en: 'vertical bar double left turnstile') + - "â«„": [t: "thanh dọc theo kĂ©p ráșœ trĂĄi"] # 0x2ae5 (en: 'double vertical bar double left turnstile') + - "⫊": [t: "dash dĂ i từ thĂ nh viĂȘn bĂȘn trĂĄi cá»§a double dọc"] # 0x2ae6 (en: 'long dash from left member of double vertical') + - "â«§": [t: "tĂłm láșĄi ngáșŻn với overbar"] # 0x2ae7 (en: 'short down tack with overbar') + - "⫚": [t: "short up tack với underbar"] # 0x2ae8 (en: 'short up tack with underbar') + - "â«©": [t: "short up tack trĂȘn ngáșŻn xuống tack"] # 0x2ae9 (en: 'short up tack above short down tack') + - "â«Ș": [t: "nhĂąn đîi tack xuống"] # 0x2aea (en: 'double down tack') + - "â««": [t: "nhĂąn đîi tack"] # 0x2aeb (en: 'double up tack') + - "⫏": [t: "cĂș đánh đîi khĂŽng kĂœ"] # 0x2aec (en: 'double stroke not sign') + - "â«­": [t: "đáșŁo ngÆ°á»Łc gáșĄch đîi khĂŽng kĂœ"] # 0x2aed (en: 'reversed double stroke not sign') + - "⫟": [t: "khĂŽng phĂąn chia với sá»± phá»§ định đáșŁo ngÆ°á»Łc"] # 0x2aee (en: 'does not divide with reversed negation slash') + - "⫯": [t: "đường tháșłng đứng với vĂČng trĂČn ở trĂȘn"] # 0x2aef (en: 'vertical line with circle above') + - "â«°": [t: "đường tháșłng đứng với vĂČng trĂČn dưới đñy"] # 0x2af0 (en: 'vertical line with circle below') + - "⫱": [t: "xuống tack với vĂČng trĂČn bĂȘn dưới"] # 0x2af1 (en: 'down tack with circle below') + - "â«Č": [t: "song song với gáșĄch ngang"] # 0x2af2 (en: 'parallel with horizontal stroke') + - "⫳": [t: "song song với toĂĄn tá»­ tilde"] # 0x2af3 (en: 'parallel with tilde operator') + - "⫎": [t: "triple dọc quan hệ nhị phĂąn thanh dọc"] # 0x2af4 (en: 'triple vertical bar binary relation') + - "â«”": [t: "thanh ba dọc với gáșĄch ngang"] # 0x2af5 (en: 'triple vertical bar with horizontal stroke') + - "â«¶": [t: "triple colon toĂĄn tá»­"] # 0x2af6 (en: 'triple colon operator') + - "â«·": [t: "triple lồng Ă­t hÆĄn"] # 0x2af7 (en: 'triple nested less than') + - "⫞": [t: "triple lồng nhau lớn hÆĄn"] # 0x2af8 (en: 'triple nested greater than') + - "â«č": [t: "đường đîi nghiĂȘng Ă­t hÆĄn hoáș·c báș±ng"] # 0x2af9 (en: 'double line slanted less than or equal to') + - "â«ș": [t: "đường đîi nghiĂȘng lớn hÆĄn hoáș·c báș±ng"] # 0x2afa (en: 'double line slanted greater than or equal to') + - "â«»": [t: "triple solidus quan hệ nhị phĂąn"] # 0x2afb (en: 'triple solidus binary relation') + - "⫌": [t: "toĂĄn tá»­ thanh dọc lớn"] # 0x2afc (en: 'large triple vertical bar operator') + - "⫝̸": [t: "toĂĄn tá»­ đîi solidus"] # 0x2afd (en: 'double solidus operator') + - "⫟": [t: "thanh dọc tráșŻng"] # 0x2afe (en: 'white vertical bar') + - "⫿": [t: "thanh dọc tráșŻng"] # 0x2aff (en: 'white vertical bar') + - "⬀": [t: "mĆ©i tĂȘn tráșŻng đîng báșŻc"] # 0x2b00 (en: 'north east white arrow') + - "⏁": [t: "mĆ©i tĂȘn tĂąy báșŻc"] # 0x2b01 (en: 'north west white arrow') + - "⬂": [t: "mĆ©i tĂȘn tráșŻng đîng nam"] # 0x2b02 (en: 'south east white arrow') + - "⏃": [t: "mĆ©i tĂȘn tĂąy nam tráșŻng"] # 0x2b03 (en: 'south west white arrow') + - "⬄": [t: "mĆ©i tĂȘn tráșŻng bĂȘn trĂĄi"] # 0x2b04 (en: 'left right white arrow') + - "⬅": [t: "mĆ©i tĂȘn đen trĂĄi"] # 0x2b05 (en: 'leftwards black arrow') + - "⬆": [t: "mĆ©i tĂȘn mĂ u đen hướng lĂȘn trĂȘn"] # 0x2b06 (en: 'upwards black arrow') + - "⬇": [t: "mĆ©i tĂȘn đen xuống"] # 0x2b07 (en: 'downwards black arrow') + - "⏈": [t: "mĆ©i tĂȘn đen đîng báșŻc"] # 0x2b08 (en: 'north east black arrow') + - "⬉": [t: "mĆ©i tĂȘn đen tĂąy báșŻc"] # 0x2b09 (en: 'north west black arrow') + - "⬊": [t: "mĆ©i tĂȘn đen đîng nam"] # 0x2b0a (en: 'south east black arrow') + - "⬋": [t: "mĆ©i tĂȘn đen tĂąy nam"] # 0x2b0b (en: 'south west black arrow') + - "⬌": [t: "mĆ©i tĂȘn đen trĂĄi bĂȘn trĂĄi"] # 0x2b0c (en: 'left right black arrow') + - "⬍": [t: "lĂȘn xuống mĆ©i tĂȘn đen"] # 0x2b0d (en: 'up down black arrow') + - "⬎": [t: "mĆ©i tĂȘn bĂȘn pháșŁi với đáș§u xuống"] # 0x2b0e (en: 'rightwards arrow with tip downwards') + - "⬏": [t: "mĆ©i tĂȘn bĂȘn pháșŁi với đáș§u hướng lĂȘn"] # 0x2b0f (en: 'rightwards arrow with tip upwards') + - "⏐": [t: "mĆ©i tĂȘn trĂĄi với đáș§u xuống"] # 0x2b10 (en: 'leftwards arrow with tip downwards') + - "⬑": [t: "mĆ©i tĂȘn trĂĄi với đáș§u hướng lĂȘn"] # 0x2b11 (en: 'leftwards arrow with tip upwards') + - "⬒": [t: "hĂŹnh vuĂŽng với ná»­a mĂ u đen"] # 0x2b12 (en: 'square with top half black') + - "⬓": [t: "hĂŹnh vuĂŽng với ná»­a mĂ u đen"] # 0x2b13 (en: 'square with bottom half black') + - "⬔": [t: "hĂŹnh vuĂŽng với đường chĂ©o phĂ­a trĂȘn bĂȘn pháșŁi mĂ u đen"] # 0x2b14 (en: 'square with upper right diagonal half black') + - "⬕": [t: "hĂŹnh vuĂŽng với một ná»­a đường chĂ©o bĂȘn trĂĄi mĂ u đen"] # 0x2b15 (en: 'square with lower left diagonal half black') + - "⬖": [t: "kim cÆ°ÆĄng với ná»­a mĂ u đen"] # 0x2b16 (en: 'diamond with left half black') + - "⬗": [t: "kim cÆ°ÆĄng với ná»­a mĂ u đen"] # 0x2b17 (en: 'diamond with right half black') + - "⏘": [t: "kim cÆ°ÆĄng với ná»­a mĂ u đen"] # 0x2b18 (en: 'diamond with top half black') + - "⬙": [t: "kim cÆ°ÆĄng với ná»­a mĂ u đen"] # 0x2b19 (en: 'diamond with bottom half black') + - "⬚": [t: "hộp"] # 0x2b1a (en: 'box') + - "⬛": [t: "quáșŁng trường lớn mĂ u đen"] # 0x2b1b (en: 'black large square') + - "⬜": [t: "quáșŁng trường lớn mĂ u tráșŻng"] # 0x2b1c (en: 'white large square') + - "⬝": [t: "quáșŁng trường ráș„t nhỏ"] # 0x2b1d (en: 'black very small square') + - "⬞": [t: "quáșŁng trường mĂ u tráșŻng ráș„t nhỏ"] # 0x2b1e (en: 'white very small square') + - "⬟": [t: "láș§u năm gĂłc đen"] # 0x2b1f (en: 'black pentagon') + - "⏠": [t: "láș§u năm gĂłc tráșŻng"] # 0x2b20 (en: 'white pentagon') + - "⏥": [t: "hĂŹnh lỄc giĂĄc tráșŻng"] # 0x2b21 (en: 'white hexagon') + - "⏹": [t: "hĂŹnh lỄc giĂĄc đen"] # 0x2b22 (en: 'black hexagon') + - "⏣": [t: "hĂŹnh lỄc giĂĄc đen ngang"] # 0x2b23 (en: 'horizontal black hexagon') + - "⏀": [t: "vĂČng trĂČn lớn mĂ u đen"] # 0x2b24 (en: 'black large circle') + - "⏄": [t: "kim cÆ°ÆĄng trung bĂŹnh mĂ u đen"] # 0x2b25 (en: 'black medium diamond') + - "⏊": [t: "kim cÆ°ÆĄng trung bĂŹnh mĂ u tráșŻng"] # 0x2b26 (en: 'white medium diamond') + - "⏧": [t: "black medium lozenge"] # 0x2b27 + - "⏚": [t: "tráșŻng trung bĂŹnh vĂŽ hĂŹnh"] # 0x2b28 (en: 'white medium lozenge') + - "⏩": [t: "kim cÆ°ÆĄng nhỏ mĂ u đen"] # 0x2b29 (en: 'black small diamond') + - "âŹȘ": [t: "black small lozenge"] # 0x2b2a + - "⏫": [t: "mĂ u tráșŻng hĂŹnh thoi"] # 0x2b2b (en: 'white small lozenge') + - "⏏": [t: "hĂŹnh elip ngang mĂ u đen"] # 0x2b2c (en: 'black horizontal ellipse') + - "⏭": [t: "hĂŹnh elip ngang mĂ u tráșŻng"] # 0x2b2d (en: 'white horizontal ellipse') + - "⏟": [t: "hĂŹnh elip dọc mĂ u đen"] # 0x2b2e (en: 'black vertical ellipse') + - "⏯": [t: "hĂŹnh elip dọc tráșŻng"] # 0x2b2f (en: 'white vertical ellipse') + - "⏰": [t: "mĆ©i tĂȘn trĂĄi với vĂČng trĂČn nhỏ"] # 0x2b30 (en: 'left arrow with small circle') + - "⏱": [t: "ba mĆ©i tĂȘn trĂĄi"] # 0x2b31 (en: 'three leftwards arrows') + - "âŹČ": [t: "mĆ©i tĂȘn trĂĄi với circled plus"] # 0x2b32 (en: 'left arrow with circled plus') + - "⏳": [t: "mĆ©i tĂȘn vỗ tay dĂ i sang trĂĄi"] # 0x2b33 (en: 'long leftwards squiggle arrow') + - "⏎": [t: "bĂȘn trĂĄi hai mĆ©i tĂȘn đáș§u với gáșĄch tháșłng đứng"] # 0x2b34 (en: 'leftwards two headed arrow with vertical stroke') + - "⏔": [t: "lettwards hai mĆ©i tĂȘn đáș§u với gáșĄch dọc"] # 0x2b35 (en: 'lettwards two headed arrow with double vertical stroke') + - "⏶": [t: "bĂȘn trĂĄi hai mĆ©i tĂȘn đáș§u từ thanh"] # 0x2b36 (en: 'leftwards two headed arrow from bar') + - "⏷": [t: "bĂȘn trĂĄi hai mĆ©i tĂȘn ba đáș§u"] # 0x2b37 (en: 'leftwards two headed triple dash arrow') + - "⏞": [t: "mĆ©i tĂȘn trĂĄi với thĂąn cháș„m cháș„m"] # 0x2b38 (en: 'leftwards arrow with dotted stem') + - "âŹč": [t: "mĆ©i tĂȘn trĂĄi với đuĂŽi với gáșĄch dọc"] # 0x2b39 (en: 'leftwards arrow with tail with vertical stroke') + - "âŹș": [t: "mĆ©i tĂȘn trĂĄi với đuĂŽi với gáșĄch dọc"] # 0x2b3a (en: 'leftwards arrow with tail with double vertical stroke') + - "⏻": [t: "bĂȘn trĂĄi hai mĆ©i tĂȘn đáș§u với đuĂŽi"] # 0x2b3b (en: 'leftwards two headed arrow with tail') + - "âŹŒ": [t: "bĂȘn trĂĄi hai mĆ©i tĂȘn đáș§u với đuĂŽi với gáșĄch tháșłng đứng"] # 0x2b3c (en: 'leftwards two headed arrow with tail with vertical stroke') + - "âŹœ": [t: "bĂȘn trĂĄi hai mĆ©i tĂȘn đáș§u với đuĂŽi với gáșĄch tháșłng đứng"] # 0x2b3d (en: 'leftwards two headed arrow with tail with double vertical stroke') + - "âŹŸ": [t: "mĆ©i tĂȘn trĂĄi qua x"] # 0x2b3e (en: 'leftwards arrow through x') + - "⏿": [t: "mĆ©i tĂȘn sĂłng hướng trá»±c tiáșżp bĂȘn trĂĄi"] # 0x2b3f (en: 'wave arrow pointing directly left') + - "⭀": [t: "báș±ng dáș„u hiệu phĂ­a trĂȘn mĆ©i tĂȘn trĂĄi"] # 0x2b40 (en: 'equals sign above leftwards arrow') + - "⭁": [t: "toĂĄn tá»­ tilde đáșŁo ngÆ°á»Łc phĂ­a trĂȘn mĆ©i tĂȘn trĂĄi"] # 0x2b41 (en: 'reverse tilde operator above leftwards arrow') + - "⭂": [t: "mĆ©i tĂȘn trĂĄi phĂ­a trĂȘn đáșŁo ngÆ°á»Łc gáș§n như báș±ng"] # 0x2b42 (en: 'leftwards arrow above reverse almost equal to') + - "⭃": [t: "mĆ©i tĂȘn pháșŁi qua lớn hÆĄn"] # 0x2b43 (en: 'rightwards arrow through greater than') + - "⭄": [t: "mĆ©i tĂȘn pháșŁi qua superret"] # 0x2b44 (en: 'rightwards arrow through superret') + - "⭅": [t: "mĆ©i tĂȘn quadurple trĂĄi"] # 0x2b45 (en: 'leftwards quadurple arrow') + - "⭆": [t: "mĆ©i tĂȘn tăng gáș„p bốn láș§n"] # 0x2b46 (en: 'rightwards quadruple arrow') + - "⭇": [t: "toĂĄn tá»­ tilde đáșŁo ngÆ°á»Łc phĂ­a trĂȘn mĆ©i tĂȘn bĂȘn pháșŁi"] # 0x2b47 (en: 'reverse tilde operator above rightwards arrow') + - "⭈": [t: "mĆ©i tĂȘn bĂȘn pháșŁi phĂ­a trĂȘn rerverse gáș§n như báș±ng"] # 0x2b48 (en: 'rightwards arrow above rerverse almost equal to') + - "⭉": [t: "toĂĄn tá»­ tilde phĂ­a trĂȘn mĆ©i tĂȘn trĂĄi"] # 0x2b49 (en: 'tilde operator above leftwards arrow') + - "⭊": [t: "mĆ©i tĂȘn trĂĄi trĂȘn gáș§n như báș±ng"] # 0x2b4a (en: 'leftwards arrow above almost equal to') + - "⭋": [t: "mĆ©i tĂȘn trĂĄi phĂ­a trĂȘn toĂĄn tá»­ tilde ngÆ°á»Łc"] # 0x2b4b (en: 'leftwards arrow above reverse tilde operator') + - "⭌": [t: "mĆ©i tĂȘn bĂȘn pháșŁi phĂ­a trĂȘn toĂĄn tá»­ tilde ngÆ°á»Łc"] # 0x2b4c (en: 'rightwards arrow above reverse tilde operator') + - "⭐": [t: "ngĂŽi sao trung bĂŹnh mĂ u tráșŻng"] # 0x2b50 (en: 'white medium star') + - "⭑": [t: "ngĂŽi sao nhỏ mĂ u đen"] # 0x2b51 (en: 'black small star') + - "⭒": [t: "ngĂŽi sao nhỏ mĂ u tráșŻng"] # 0x2b52 (en: 'white small star') + - "⭓": [t: "đen bĂȘn pháșŁi chỉ hĂŹnh láș§u năm gĂłc"] # 0x2b53 (en: 'black right pointing pentagon') + - "⭔": [t: "láș§u năm gĂłc bĂȘn pháșŁi mĂ u tráșŻng"] # 0x2b54 (en: 'white right pointing pentagon') + - "⭕": [t: "vĂČng trĂČn lớn náș·ng"] # 0x2b55 (en: 'heavy large circle') + - "⭖": [t: "oval náș·ng với hĂŹnh báș§u dỄc bĂȘn trong"] # 0x2b56 (en: 'heavy oval with oval inside') + - "⭗": [t: "vĂČng trĂČn náș·ng với vĂČng trĂČn bĂȘn trong"] # 0x2b57 (en: 'heavy circle with circle inside') + - "⭘": [t: "vĂČng trĂČn náș·ng"] # 0x2b58 (en: 'heavy circle') + - "⭙": [t: "muối náș·ng"] # 0x2b59 (en: 'heavy circled saltire') + - "⾀": [t: "điểm thay tháșż gĂłc pháșŁi"] # 0x2e00 (en: 'right angle substitution marker') + - "➁": [t: "gĂłc bĂȘn pháșŁi cháș„m đánh dáș„u thay tháșż"] # 0x2e01 (en: 'right angle dotted substitution marker') + - "⾂": [t: "khung thay tháșż trĂĄi"] # 0x2e02 (en: 'left substitution bracket') + - "➃": [t: "khung thay tháșż đĂșng"] # 0x2e03 (en: 'right substitution bracket') + - "⾄": [t: "khung thay tháșż cháș„m trĂĄi"] # 0x2e04 (en: 'left dotted substitution bracket') + - "⾅": [t: "khung thay tháșż cháș„m bĂȘn pháșŁi"] # 0x2e05 (en: 'right dotted substitution bracket') + - "⾆": [t: "nĂąng cao điểm đánh dáș„u nội suy"] # 0x2e06 (en: 'raised interpolation marker') + - "⾇": [t: "nĂąng cao điểm nội suy cháș„m"] # 0x2e07 (en: 'raised dotted interpolation marker') + - "➈": [t: "điểm đánh dáș„u chuyển vị cháș„m cháș„m"] # 0x2e08 (en: 'dotted transposition marker marker') + - "⾉": [t: "khung chuyển vị trĂĄi"] # 0x2e09 (en: 'left transposition bracket') + - "⾊": [t: "khung chuyển vị bĂȘn pháșŁi"] # 0x2e0a (en: 'right transposition bracket') + - "⾋": [t: "quáșŁng trường nĂąng lĂȘn"] # 0x2e0b (en: 'raised square') + - "⾌": [t: "bĂȘn trĂĄi nĂąng cao khung thiáșżu sĂłt"] # 0x2e0c (en: 'left raised omission bracket') + - "➍": [t: "quyền nĂąng cao khung thiáșżu sĂłt"] # 0x2e0d (en: 'right raised omission bracket') + - "⾎": [t: "biĂȘn táș­p coronis"] # 0x2e0e (en: 'editorial coronis') + - "➏": [t: "đoáșĄn văn"] # 0x2e0f (en: 'paragraphos') + - "➐": [t: "phĂąn đoáșĄn đoáșĄn văn"] # 0x2e10 (en: 'forked paragraphos') + - "⾑": [t: "đáșŁo ngÆ°á»Łc cĂĄc đoáșĄn bĂĄo"] # 0x2e11 (en: 'reversed forked paragraphos') + - "⾒": [t: "hypodiastole"] # 0x2e12 + - "⾓": [t: "obelos cháș„m"] # 0x2e13 (en: 'dotted obelos') + - "⾔": [t: "xuống ở ancora"] # 0x2e14 (en: 'downwards ancora') + - "⾕": [t: "lĂȘn cao hÆĄn ancora"] # 0x2e15 (en: 'upwards ancora') + - "⾖": [t: "cháș„m bĂȘn pháșŁi gĂłc chỉ"] # 0x2e16 (en: 'dotted right pointing angle') + - "⾗": [t: "double xiĂȘn dáș„u gáșĄch nối"] # 0x2e17 (en: 'double oblique hyphen') + - "➘": [t: "đáșŁo ngÆ°á»Łc interrobang"] # 0x2e18 (en: 'inverted interrobang') + - "⾙": [t: "nhĂĄnh cọ"] # 0x2e19 (en: 'palm branch') + - "⾚": [t: "hyphen với dieresis"] # 0x2e1a (en: 'hyphen with diaeresis') + - "⾛": [t: "tilde với vĂČng trĂȘn"] # 0x2e1b (en: 'tilde with ring above') + - "⾜": [t: "để láșĄi giĂĄ tháș„p"] # 0x2e1c (en: 'left low paraphrase bracket') + - "➝": [t: "đóng giĂĄ trị tháș„p pháșŁi"] # 0x2e1d (en: 'right low paraphrase bracket') + - "⾞": [t: "tilde với dáș„u cháș„m ở trĂȘn"] # 0x2e1e (en: 'tilde with dot above') + - "⾟": [t: "tilde với dáș„u cháș„m dưới đñy"] # 0x2e1f (en: 'tilde with dot below') + - "âž ": [t: "thanh tháșłng đứng trĂĄi với quill"] # 0x2e20 (en: 'left vertical bar with quill') + - "➥": [t: "thanh tháșłng đứng bĂȘn pháșŁi với quill"] # 0x2e21 (en: 'right vertical bar with quill') + - "âžą": [t: "đỉnh trĂĄi giĂĄ đụ"] # 0x2e22 (en: 'top left half bracket') + - "➣": [t: "đáș§u tiĂȘn báșŻt đáș§u báșŻt đáș§u"] # 0x2e23 (en: 'top right half bracket') + - "➀": [t: "dưới cĂčng bĂȘn trĂĄi giĂĄ đụ"] # 0x2e24 (en: 'bottom left half bracket') + - "âž„": [t: "dưới cĂčng bĂȘn pháșŁi giĂĄ đụ"] # 0x2e25 (en: 'bottom right half bracket') + - "➊": [t: "bĂȘn trĂĄi phĂ­a bĂȘn báșĄn khung"] # 0x2e26 (en: 'left sideways u bracket') + - "âž§": [t: "bĂȘn pháșŁi bĂȘn báșĄn khung"] # 0x2e27 (en: 'right sideways u bracket') + - "âžš": [t: "dáș„u ngoáș·c Ä‘ÆĄn trĂĄi"] # 0x2e28 (en: 'left double parentheses') + - "âž©": [t: "dáș„u ngoáș·c Ä‘ÆĄn bĂȘn pháșŁi"] # 0x2e29 (en: 'right double parentheses') + - "âžȘ": [t: "hai cháș„m trĂȘn một dáș„u cháș„m cháș„m"] # 0x2e2a (en: 'two dots over one dot punctuation') + - "âž«": [t: "một cháș„m trĂȘn hai dáș„u cháș„m cĂąu"] # 0x2e2b (en: 'one dot over two dots punctuation') + - "➏": [t: "bĂŹnh phÆ°ÆĄng bốn dáș„u cháș„m cháș„m"] # 0x2e2c (en: 'squared four dot punctuation') + - "âž­": [t: "năm dáș„u cháș„m"] # 0x2e2d (en: 'five dot mark') + - "âžź": [t: "dáș„u áș„n cĂąu hỏi"] # 0x2e2e (en: 'reversed question mark') + - "➯": [t: "tilde dọc"] # 0x2e2f (en: 'vertical tilde') + - "âž°": [t: "điểm nháș«n"] # 0x2e30 (en: 'ring point') + - "âž±": [t: "từ cháș„m tĂĄch giữa cháș„m"] # 0x2e31 (en: 'word seperator middle dot') + - "âžČ": [t: "biáșżn dáș„u pháș©y"] # 0x2e32 (en: 'turned comma') + - "âžł": [t: "nĂąng cao cháș„m"] # 0x2e33 (en: 'raised dot') + - "➎": [t: "dáș„u pháș©y lớn lĂȘn"] # 0x2e34 (en: 'raised comma') + - "âž”": [t: "biáșżn bĂĄn nguyệt"] # 0x2e35 (en: 'turned semicolon') + - "âž¶": [t: "dao găm với báșŁo vệ bĂȘn trĂĄi"] # 0x2e36 (en: 'dagger with left guard') + - "âž·": [t: "dao găm với báșŁo vệ bĂȘn pháșŁi"] # 0x2e37 (en: 'dagger with right guard') + - "âžž": [t: "biáșżn dao găm"] # 0x2e38 (en: 'turned dagger') + - "âžč": [t: "dáș„u hiệu ná»­a đáș§u"] # 0x2e39 (en: 'top half section sign') + - "âžș": [t: "hai em đáș­p"] # 0x2e3a (en: 'two em dash') + - "âž»": [t: "ba em đáș­p"] # 0x2e3b (en: 'three em dash') + - "〃": [t: "ditto mark"] # 0x3003 + - "〈": [t: "khung gĂłc trĂĄi"] # 0x3008 (en: 'left angle bracket') + - "〉": [t: "khung gĂłc pháșŁi"] # 0x3009 (en: 'right angle bracket') + - "《": [t: "khung gĂłc hai gĂłc"] # 0x300a (en: 'left double angle bracket') + - "》": [t: "khung gĂłc gáș„p đîi"] # 0x300b (en: 'right double angle bracket') + - "「": [t: "khung gĂłc trĂĄi"] # 0x300c (en: 'left corner bracket') + - "」": [t: "khung gĂłc pháșŁi"] # 0x300d (en: 'right corner bracket') + - "『": [t: "khung gĂłc tráșŻng"] # 0x300e (en: 'left white corner bracket') + - "』": [t: "khung gĂłc tráșŻng bĂȘn pháșŁi"] # 0x300f (en: 'right white corner bracket') + - "【": [t: "khung mĂ u đen trĂĄi"] # 0x3010 (en: 'left black lenticular bracket') + - "】": [t: "bĂȘn pháșŁi khung hĂŹnh dáșĄng tháș„u kĂ­nh mĂ u đen"] # 0x3011 (en: 'right black lenticular bracket') + - "〔": [t: "khung vỏ rĂča trĂĄi"] # 0x3014 (en: 'left tortoise shell bracket') + - "〕": [t: "chĂąn sáșŻc con rĂča pháșŁi"] # 0x3015 (en: 'right tortoise shell bracket') + - "〖": [t: "khung mĂ u tráșŻng trĂĄi"] # 0x3016 (en: 'left white lenticular bracket') + - "〗": [t: "quyền tráșŻng tráșŻng tráșŻng"] # 0x3017 (en: 'right white lenticular bracket') + - "〘": [t: "bĂȘn trĂĄi khung vỏ rĂča tráșŻng"] # 0x3018 (en: 'left white tortoise shell bracket') + - "〙": [t: "bĂȘn pháșŁi khung vỏ rĂča tráșŻng"] # 0x3019 (en: 'right white tortoise shell bracket') + - "〚": [t: "khung vuĂŽng mĂ u tráșŻng"] # 0x301a (en: 'left white square bracket') + - "〛": [t: "khung vuĂŽng tráșŻng bĂȘn pháșŁi"] # 0x301b (en: 'right white square bracket') + - "〜": [t: "dash sĂłng"] # 0x301c (en: 'wave dash') + - "〰": [t: "dáș„u gáșĄch ngang"] # 0x3030 (en: 'wavy dash') + - "㉈": [t: "số mười vĂČng trĂȘn quáșŁng trường đen"] # 0x3248 (en: 'circled number ten on black square') + - "㉉": [t: "số vĂČng trĂČn hai mÆ°ÆĄi trĂȘn quáșŁng trường đen"] # 0x3249 (en: 'circled number twenty on black square') + - "㉊": [t: "số vĂČng trĂČn ba mÆ°ÆĄi trĂȘn quáșŁng trường đen"] # 0x324a (en: 'circled number thirty on black square') + - "㉋": [t: "số vĂČng trĂČn bốn mÆ°ÆĄi trĂȘn quare blacks"] # 0x324b (en: 'circled number forty on blacks quare') + - "㉌": [t: "số lÆ°á»Łng số năm mÆ°ÆĄi trĂȘn quáșŁng trường đen"] # 0x324c (en: 'circled number fifty on black square') + - "㉍": [t: "manh số sĂĄu mÆ°ÆĄi trĂȘn quáșŁng trường đen"] # 0x324d (en: 'circled number sixty on black square') + - "㉎": [t: "số vĂČng trĂČn báșŁy mÆ°ÆĄi trĂȘn quáșŁng trường đen"] # 0x324e (en: 'circled number seventy on black square') + - "㉏": [t: "số Ä‘Æ°á»Łc khoanh trĂČn aty trĂȘn quáșŁng trường đen"] # 0x324f (en: 'circled number eighty on black square') + - "㉑": [t: "Ä‘Æ°á»Łc khoanh trĂČn số hai mÆ°ÆĄi mốt"] # 0x3251 (en: 'circled number twenty one') + - "㉒": [t: "Ä‘Æ°á»Łc khoanh trĂČn số hai mÆ°ÆĄi hai"] # 0x3252 (en: 'circled number twenty two') + - "㉓": [t: "Ä‘Æ°á»Łc khoanh trĂČn số hai mÆ°ÆĄi ba"] # 0x3253 (en: 'circled number twenty three') + - "㉔": [t: "Ä‘Æ°á»Łc khoanh trĂČn số hai mÆ°ÆĄi bốn"] # 0x3254 (en: 'circled number twenty four') + - "㉕": [t: "Ä‘Æ°á»Łc khoanh trĂČn số hai mÆ°ÆĄi lăm"] # 0x3255 (en: 'circled number twenty five') + - "㉖": [t: "Ä‘Æ°á»Łc khoanh trĂČn số hai mÆ°ÆĄi sĂĄu"] # 0x3256 (en: 'circled number twenty six') + - "㉗": [t: "Ä‘Æ°á»Łc khoanh trĂČn số hai mÆ°ÆĄi báșŁy"] # 0x3257 (en: 'circled number twenty seven') + - "㉘": [t: "Ä‘Æ°á»Łc khoanh trĂČn số hai mÆ°ÆĄi tĂĄm"] # 0x3258 (en: 'circled number twenty eight' GPT-5.4 fixed translation) + - "㉙": [t: "Ä‘Æ°á»Łc khoanh trĂČn số hai mÆ°ÆĄi chĂ­n"] # 0x3259 (en: 'circled number twenty nine') + - "㉚": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi"] # 0x325a (en: 'circled number thirty' GPT-5.4 fixed translation) + - "㉛": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi mốt"] # 0x325b (en: 'circled number thirty one' GPT-5.4 fixed translation) + - "㉜": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi hai"] # 0x325c (en: 'circled number thirty two' GPT-5.4 fixed translation) + - "㉝": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi ba"] # 0x325d (en: 'circled number thirty three' GPT-5.4 fixed translation) + - "㉞": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi bốn"] # 0x325e (en: 'circled number thirty four') + - "㉟": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi lăm"] # 0x325f (en: 'circled number thirty five' GPT-5.4 fixed translation) + - "㊱": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi sĂĄu"] # 0x32b1 (en: 'circled number thirty six' GPT-5.4 fixed translation) + - "ăŠČ": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi báșŁy"] # 0x32b2 (en: 'circled number thirty seven', GPT-5.4 fixed translation) + - "㊳": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi tĂĄm"] # 0x32b3 (en: 'circled number thirty eight', GPT-5.4 fixed translation) + - "㊮": [t: "Ä‘Æ°á»Łc khoanh trĂČn số ba mÆ°ÆĄi chĂ­n"] # 0x32b4 (en: 'circled number thirty nine', GPT-5.4 fixed translation) + - "㊔": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi"] # 0x32b5 (en: 'circled number forty', GPT-5.4 fixed translation) + - "㊶": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi mốt"] # 0x32b6 (en: 'circled number forty one', GPT-5.4 fixed translation) + - "㊷": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi hai"] # 0x32b7 (en: 'circled number forty two', GPT-5.4 fixed translation) + - "㊾": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi ba"] # 0x32b8 (en: 'circled number forty three', GPT-5.4 fixed translation) + - "ăŠč": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi bốn"] # 0x32b9 (en: 'circled number forty four', GPT-5.4 fixed translation) + - "ăŠș": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi lăm"] # 0x32ba (en: 'circled number forty five', GPT-5.4 fixed translation) + - "㊻": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi sĂĄu"] # 0x32bb (en: 'circled number forty six', GPT-5.4 fixed translation) + - "ăŠŒ": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi báșŁy"] # 0x32bc (en: 'circled number forty seven', GPT-5.4 fixed translation) + - "ăŠœ": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi tĂĄm"] # 0x32bd (en: 'circled number forty eight', GPT-5.4 fixed translation) + - "ăŠŸ": [t: "Ä‘Æ°á»Łc khoanh trĂČn số bốn mÆ°ÆĄi chĂ­n"] # 0x32be (en: 'circled number forty nine', GPT-5.4 fixed translation) + - "㊿": [t: "Ä‘Æ°á»Łc khoanh trĂČn số năm mÆ°ÆĄi"] # 0x32bf (en: 'circled number fifty', GPT-5.4 fixed translation) + - "㋌": [t: "thá»§y ngĂąn"] # 0x32cc (en: 'mercury') + - "㋍": [t: "ergs"] # 0x32cd + - "㋎": [t: "volt điện tá»­"] # 0x32ce (en: 'electron volts') + - "㋏": [t: "dáș„u hiệu trĂĄch nhiệm hữu háșĄn"] # 0x32cf (en: 'limited liability sign') + - "ă±": [t: "hectopascals"] # 0x3371 + - "ăČ": [t: "daltons"] # 0x3372 + - "㍳": [t: "cĂĄc Ä‘ÆĄn vị thiĂȘn văn"] # 0x3373 (en: 'astronomical units') + - "㍮": [t: "thanh"] # 0x3374 (en: 'bars') + - "ă”": [t: "o v"] # 0x3375 + - "ă¶": [t: "parsecs"] # 0x3376 + - "ă·": [t: "tháș­p phĂąn"] # 0x3377 (en: 'decimeters') + - "㍾": [t: "decimeter bĂŹnh phÆ°ÆĄng"] # 0x3378 (en: 'decimeters squared') + - "ăč": [t: "decimeter khối"] # 0x3379 (en: 'decimeters cubed') + - "ăș": [t: "Ä‘ÆĄn vị cĂŽng cỄ"] # 0x337a (en: 'instrumental units') + - "㎀": [t: "picoamp"] # 0x3380 (en: 'picoamps') + - "㎁": [t: "nanoamp"] # 0x3381 (en: 'nanoamps') + - "㎂": [t: "microamp"] # 0x3382 (en: 'microamps') + - "㎃": [t: "milliamps"] # 0x3383 + - "㎄": [t: "kiloamp"] # 0x3384 (en: 'kiloamps') + - "㎅": [t: "kilobyte"] # 0x3385 (en: 'kilobytes') + - "㎆": [t: "megabyte"] # 0x3386 (en: 'megabytes') + - "㎇": [t: "gigabyte"] # 0x3387 (en: 'gigabytes') + - "㎈": [t: "calo"] # 0x3388 (en: 'calories') + - "㎉": [t: "kilocalories"] # 0x3389 + - "㎊": [t: "picofarads"] # 0x338a + - "㎋": [t: "nanofarads"] # 0x338b + - "㎌": [t: "microfarads"] # 0x338c + - "㎍": [t: "micrograms"] # 0x338d + - "㎎": [t: "miligam"] # 0x338e (en: 'milligrams') + - "㎏": [t: "kilĂŽgam"] # 0x338f (en: 'kilograms') + - "㎐": [t: "hertz"] # 0x3390 + - "㎑": [t: "kilohertz"] # 0x3391 + - "㎒": [t: "megahertz"] # 0x3392 + - "㎓": [t: "gigahertz"] # 0x3393 + - "㎔": [t: "terahertz"] # 0x3394 + - "㎕": [t: "microliter"] # 0x3395 (en: 'microliters') + - "㎖": [t: "millileter"] # 0x3396 (en: 'millileters') + - "㎗": [t: "deciliter"] # 0x3397 (en: 'deciliters') + - "㎘": [t: "kiloliter"] # 0x3398 (en: 'kiloliters') + - "㎙": [t: "femtometer"] # 0x3399 (en: 'femtometers') + - "㎚": [t: "nanomet"] # 0x339a (en: 'nanometers') + - "㎛": [t: "micromet"] # 0x339b (en: 'micrometers') + - "㎜": [t: "milimet"] # 0x339c (en: 'millimeters') + - "㎝": [t: "centimet"] # 0x339d (en: 'centimeters') + - "㎞": [t: "km"] # 0x339e (en: 'kilometers') + - "㎟": [t: "bĂŹnh phÆ°ÆĄng milimet"] # 0x339f (en: 'millimeters squared') + - "㎠": [t: "centimet bĂŹnh phÆ°ÆĄng"] # 0x33a0 (en: 'centimeters squared') + - "㎡": [t: "mĂ©t bĂŹnh phÆ°ÆĄng"] # 0x33a1 (en: 'meters squared') + - "㎱": [t: "km bĂŹnh phÆ°ÆĄng"] # 0x33a2 (en: 'kilometers squared') + - "㎣": [t: "milimet khối"] # 0x33a3 (en: 'millimeters cubed') + - "㎀": [t: "centimet hĂŹnh khối"] # 0x33a4 (en: 'centimeters cubed') + - "㎄": [t: "mĂ©t khối"] # 0x33a5 (en: 'meters cubed') + - "㎩": [t: "km khối"] # 0x33a6 (en: 'kilometers cubed') + - "㎧": [t: "mĂ©t mỗi giĂąy"] # 0x33a7 (en: 'meters per second') + - "㎹": [t: "mĂ©t mỗi giĂąy bĂŹnh phÆ°ÆĄng"] # 0x33a8 (en: 'meters per second squared') + - "㎩": [t: "pascals"] # 0x33a9 + - "ăŽȘ": [t: "kilopascals"] # 0x33aa + - "㎫": [t: "megapascals"] # 0x33ab + - "㎬": [t: "gigapascals"] # 0x33ac + - "㎭": [t: "rads"] # 0x33ad + - "㎼": [t: "rads mỗi giĂąy"] # 0x33ae (en: 'rads per second') + - "㎯": [t: "rads trĂȘn bĂŹnh phÆ°ÆĄng thứ hai"] # 0x33af (en: 'rads per second squared') + - "㎰": [t: "picoseconds"] # 0x33b0 + - "㎱": [t: "nanoseconds"] # 0x33b1 + - "ăŽČ": [t: "micro giĂąy"] # 0x33b2 (en: 'microseconds') + - "㎳": [t: "mili giĂąy"] # 0x33b3 (en: 'milliseconds') + - "㎮": [t: "picovolts"] # 0x33b4 + - "㎔": [t: "nanovolts"] # 0x33b5 + - "㎶": [t: "microvolts"] # 0x33b6 + - "㎷": [t: "millivolts"] # 0x33b7 + - "㎾": [t: "kilovolts"] # 0x33b8 + - "ăŽč": [t: "megavolts"] # 0x33b9 + - "ăŽș": [t: "picowatt"] # 0x33ba (en: 'picowatts') + - "㎻": [t: "nanowatt"] # 0x33bb (en: 'nanowatts') + - "ăŽŒ": [t: "microwatt"] # 0x33bc (en: 'microwatts') + - "ăŽœ": [t: "milliwatts"] # 0x33bd + - "ăŽŸ": [t: "kilowatt"] # 0x33be (en: 'kilowatts') + - "㎿": [t: "megawatt"] # 0x33bf (en: 'megawatts') + - "㏀": [t: "kilo-ohms"] # 0x33c0 + - "㏁": [t: "megaohms"] # 0x33c1 + - "㏂": [t: "attometer"] # 0x33c2 (en: 'attometers') + - "㏃": [t: "becquerels"] # 0x33c3 + - "㏄": [t: "centimet khối"] # 0x33c4 (en: 'cubic centimeters') + - "㏅": [t: "náșżn"] # 0x33c5 (en: 'candelas') + - "㏆": [t: "coulomb mỗi kg"] # 0x33c6 (en: 'coulombs per kilogram') + - "㏇": [t: "lÆ°á»Łng mĂĄu tim bÆĄm ra"] # 0x33c7 (en: 'cardiac output') + - "㏈": [t: "decibel"] # 0x33c8 (en: 'decibels') + - "㏉": [t: "grays"] # 0x33c9 + - "㏊": [t: "ha"] # 0x33ca (en: 'hectares') + - "㏋": [t: "mĂŁ lá»±c"] # 0x33cb (en: 'horsepower') + - "㏌": [t: "inch"] # 0x33cc (en: 'inches') + - "㏍": [t: "kilokelvins"] # 0x33cd + - "㏎": [t: "km"] # 0x33ce (en: 'kilometers') + - "㏏": [t: "nĂșt tháșŻt"] # 0x33cf (en: 'knots') + - "㏐": [t: "lumens"] # 0x33d0 + - "㏑": [t: "nháș­t kĂœ tá»± nhiĂȘn"] # 0x33d1 (en: 'natural log') + - "㏒": [t: "logarit"] # 0x33d2 (en: 'logarithm') + - "㏓": [t: "lux"] # 0x33d3 + - "㏔": [t: "millibarns"] # 0x33d4 + - "㏕": [t: "nhĂ  mĂĄy"] # 0x33d5 (en: 'mills') + - "㏖": [t: "nốt ruồi"] # 0x33d6 (en: 'moles') + - "㏗": [t: "p h"] # 0x33d7 + - "㏘": [t: "buĂŽng điện"] # 0x33d8 (en: 'picometers') + - "㏙": [t: "pháș§n triệu"] # 0x33d9 (en: 'parts per million') + - "㏚": [t: "petaroentgens"] # 0x33da + - "㏛": [t: "steradians"] # 0x33db + - "㏜": [t: "sieverts"] # 0x33dc + - "㏝": [t: "webers"] # 0x33dd + - "㏞": [t: "volt mỗi mĂ©t"] # 0x33de (en: 'volts per meter') + - "㏟": [t: "amps mỗi mĂ©t"] # 0x33df (en: 'amps per meter') + - "㏿": [t: "gallon"] # 0x33ff (en: 'gallons') + - "": [t: "báș±ng với mĆ© bĂȘn dưới"] # 0xe900 (en: 'equals with hat below') + - "": [t: "báș±ng với cộng với ở trĂȘn"] # 0xe901 (en: 'equals with plus above') + - "â©Č": [t: "báș±ng với cộng với ở trĂȘn"] # 0x2a72 (en: 'equals with plus above') + - "": [t: "báș±ng với cộng với bĂȘn dưới"] # 0xe902 (en: 'equals with plus below') + - "⩱": [t: "báș±ng với cộng với bĂȘn dưới"] # 0x2a71 (en: 'equals with plus below') + - "": [t: "tilde với cộng với ở trĂȘn"] # 0xe903 (en: 'tilde with plus above') + - "⚊": [t: "tilde với cộng với ở trĂȘn"] # 0x2a26 (en: 'tilde with plus above') + - "": [t: "tilde với cộng với bĂȘn dưới"] # 0xe904 (en: 'tilde with plus below') + - "⚀": [t: "tilde với cộng với bĂȘn dưới"] # 0x2a24 (en: 'tilde with plus below') + - "": [t: "báș±ng gáș„p đîi trĂȘn lớn hÆĄn"] # 0xe908 (en: 'equal double over greater than') + - "": [t: "báș±ng gáș„p đîi so với Ă­t hÆĄn"] # 0xe909 (en: 'equal double over less than') + - "âȘ™": [t: "báș±ng gáș„p đîi so với Ă­t hÆĄn"] # 0x2a99 (en: 'equal double over less than') + - "": [t: "chứa hoáș·c báș±ng"] # 0xe90a (en: 'contains or equal to') + - "⋜": [t: "chứa hoáș·c báș±ng"] # 0x22fd (en: 'contains or equal to') + - "": [t: "superset cá»§a hoáș·c báș±ng"] # 0xe90b (en: 'superset of or equal to') + - "": [t: "táș­p hợp con hoáș·c báș±ng"] # 0xe90c (en: 'subset of or equal to') + - "": [t: "báș±ng nhau hÆĄn Ă­t hÆĄn"] # 0xe90d (en: 'equal over less than') + - "": [t: "yáșżu tố hoáș·c báș±ng"] # 0xe912 (en: 'element of or equal to') + - "⋷": [t: "yáșżu tố hoáș·c báș±ng"] # 0x22f7 (en: 'element of or equal to') + - "": [t: "báș±ng hoáș·c lớn hÆĄn"] # 0xe913 (en: 'equal to or greater than') + - "âȘš": [t: "báș±ng hoáș·c lớn hÆĄn"] # 0x2a9a (en: 'equal to or greater than') + - "": [t: "superset gáș§n đĂșng cá»§a"] # 0xe914 (en: 'approximate superset of') + - "⫈": [t: "superset gáș§n đĂșng cá»§a"] # 0x2ac8 (en: 'approximate superset of') + - "": [t: "táș­p hợp con gáș§n đĂșng cá»§a"] # 0xe915 (en: 'approximate subset of') + - "⫇": [t: "táș­p hợp con gáș§n đĂșng cá»§a"] # 0x2ac7 (en: 'approximate subset of') + - "": [t: "superset cá»§a với dot bao gồm như mối quan hệ phỄ"] # 0xe916 (en: 'superset of with dot includes as sub relation') + - "âȘŸ": [t: "superset cá»§a với dot bao gồm như mối quan hệ phỄ"] # 0x2abe (en: 'superset of with dot includes as sub relation') + - "": [t: "táș­p hợp con với dot Ä‘Æ°á»Łc bao gồm trong mối quan hệ phỄ"] # 0xe917 (en: 'subset of with dot is included in as sub relation') + - "âȘœ": [t: "táș­p hợp con với dot Ä‘Æ°á»Łc bao gồm trong mối quan hệ phỄ"] # 0x2abd (en: 'subset of with dot is included in as sub relation') + - "": [t: "báș±ng với dáș„u cháș„m bĂȘn dưới"] # 0xe918 (en: 'equal with dot below') + - "⩊": [t: "báș±ng với dáș„u cháș„m bĂȘn dưới"] # 0x2a66 (en: 'equal with dot below') + - "": [t: "bĂȘn trĂĄi cháș„m trĂȘn trừ cháș„m bĂȘn pháșŁi"] # 0xe919 (en: 'left dot over minus over right dot') + - "": [t: "dáș„u cháș„m bĂȘn pháșŁi trĂȘn trừ cháș„m bĂȘn trĂĄi"] # 0xe91a (en: 'right dot over minus over left dot') + - "": [t: "gáș§n như báș±ng trừ"] # 0xe91f (en: 'almost equal to minus') + - "": [t: "cĂșp vuĂŽng đîi"] # 0xe920 (en: 'double square cup') + - "": [t: "double square squalase"] # 0xe921 (en: 'double square cap') + - "": [t: "Ă­t hÆĄn báș±ng hoáș·c lớn hÆĄn"] # 0xe922 (en: 'less than equal to or greater than') + - "": [t: "tilde với dáș„u cháș„m"] # 0xe924 (en: 'tilde with dot') + - "â©Ș": [t: "tilde với dáș„u cháș„m"] # 0x2a6a (en: 'tilde with dot') + - "": [t: "tilde với hai cháș„m"] # 0xe925 (en: 'tilde with two dots') + - "": [t: "nhỏ hÆĄn lớn hÆĄn hoáș·c báș±ng"] # 0xe926 (en: 'less than greater than or equal to') + - "âȘ‘": [t: "nhỏ hÆĄn lớn hÆĄn hoáș·c báș±ng"] # 0x2a91 (en: 'less than greater than or equal to') + - "": [t: "lớn hÆĄn Ă­t hÆĄn hoáș·c báș±ng"] # 0xe927 (en: 'greater than less than or equal to') + - "âȘ’": [t: "lớn hÆĄn Ă­t hÆĄn hoáș·c báș±ng"] # 0x2a92 (en: 'greater than less than or equal to') + - "": [t: "tÆ°ÆĄng Ä‘Æ°ÆĄng hoáș·c Ă­t hÆĄn"] # 0xe928 (en: 'equivalent to or less than') + - "âȘ": [t: "tÆ°ÆĄng Ä‘Æ°ÆĄng hoáș·c Ă­t hÆĄn"] # 0x2a9d (en: 'equivalent to or less than') + - "": [t: "tÆ°ÆĄng Ä‘Æ°ÆĄng hoáș·c lớn hÆĄn"] # 0xe929 (en: 'equivalent to or greater than') + - "î€Ș": [t: "toĂĄn tá»­ hộp mở"] # 0xe92a (en: 'left open box operator') + - "": [t: "toĂĄn tá»­ hộp mở bĂȘn pháșŁi"] # 0xe92b (en: 'right open box operator') + - "": [t: "giống hệt với dáș„u cháș„m"] # 0xe92c (en: 'identical to with dot') + - "": [t: "lớn hÆĄn báș±ng hoáș·c nhỏ hÆĄn"] # 0xe92d (en: 'greater than equal to or less than') + - "": [t: "nhĂ  điều hĂ nh thanh"] # 0xe92e (en: 'bar operator') + - "": [t: "nhĂ  điều hĂ nh thanh đîi"] # 0xe92f (en: 'double bar operator') + - "": [t: "nhĂ  điều hĂ nh ba thanh"] # 0xe930 (en: 'triple bar operator') + - "î€Č": [t: "nhỏ hÆĄn hoáș·c xáș„p xỉ báș±ng"] # 0xe932 (en: 'less than or approximately equal to') + - "": [t: "lớn hÆĄn hoáș·c xáș„p xỉ báș±ng"] # 0xe933 (en: 'greater than or approximately equal to') + - "": [t: "lồng Ă­t hÆĄn"] # 0xe936 (en: 'nested less than') + - "âȘĄ": [t: "lồng Ă­t hÆĄn"] # 0x2aa1 (en: 'nested less than') + - "": [t: "lồng nhau lớn hÆĄn"] # 0xe937 (en: 'nested greater than') + - "âȘą": [t: "lồng nhau lớn hÆĄn"] # 0x2aa2 (en: 'nested greater than') + - "î€ș": [t: "trước hoáș·c tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0xe93a (en: 'precedes or equivalent to') + - "": [t: "thĂ nh cĂŽng hoáș·c tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0xe93b (en: 'succeeds or equivalent to') + - "î„€": [t: "đi trước báș±ng báș±ng nhau"] # 0xe940 (en: 'precedes over equal') + - "": [t: "thĂ nh cĂŽng quĂĄ bĂŹnh đáșłng"] # 0xe941 (en: 'succeeds over equal') + - "î„‚": [t: "Ă­t báș±ng nhau hÆĄn nghiĂȘng lớn hÆĄn"] # 0xe942 (en: 'less equal slanted greater') + - "": [t: "lớn hÆĄn báș±ng Ă­t hÆĄn"] # 0xe943 (en: 'greater equal slanted less') + - "": [t: "hĂ i lĂČng bởi"] # 0xe948 (en: 'satisfied by') + - "": [t: "lười biáșżng s"] # 0xe949 (en: 'lazy s') + - "": [t: "khĂŽng kháșłng định"] # 0xe94a (en: 'not assertion') + - "î„‹": [t: "gáș„p đîi báș±ng nhau"] # 0xe94b (en: 'double equal') + - "â©”": [t: "gáș„p đîi báș±ng nhau"] # 0x2a75 (en: 'double equal') + - "": [t: "triple báș±ng nhau"] # 0xe94c (en: 'triple equal') + - "": [t: "quy táșŻc bị trĂŹ hoĂŁn"] # 0xe94d (en: 'rule delayed') + - "â§Ž": [t: "quy táșŻc bị trĂŹ hoĂŁn"] # 0x29f4 (en: 'rule delayed') + - "": [t: "phĂąn định bĂ­ danh"] # 0xe94e (en: 'alias delimiter') + - "": [t: "nhĂłm con bĂŹnh thường cá»§a thanh"] # 0xe950 (en: 'normal subgroup of with bar') + - "⧏": [t: "nhĂłm con bĂŹnh thường cá»§a thanh"] # 0x29cf (en: 'normal subgroup of with bar') + - "î„‘": [t: "chứa như phĂąn nhĂłm bĂŹnh thường với thanh"] # 0xe951 (en: 'contains as normal subgroup with bar') + - "⧐": [t: "chứa như phĂąn nhĂłm bĂŹnh thường với thanh"] # 0x29d0 (en: 'contains as normal subgroup with bar') + - "î„”": [t: "vĂČng ngỄ Ăœ"] # 0xe954 (en: 'round implies') + - "â„°": [t: "vĂČng ngỄ Ăœ"] # 0x2970 (en: 'round implies') + - "î„•": [t: "nỄ cười dưới quĂĄn bar"] # 0xe955 (en: 'smile under bar') + - "î„–": [t: "cau mĂ y trĂȘn quĂĄn bar"] # 0xe956 (en: 'frown over bar') + - "î„—": [t: "superset cá»§a hoáș·c gáș§n như báș±ng"] # 0xe957 (en: 'superset of or almost equal to') + - "": [t: "táș­p hợp con hoáș·c gáș§n như báș±ng"] # 0xe958 (en: 'subset of or almost equal to') + - "î„™": [t: "lớn hÆĄn gáș§n như báș±ng hoáș·c Ă­t hÆĄn"] # 0xe959 (en: 'greater than almost equal to or less than') + - "": [t: "Ă­t hÆĄn gáș§n như báș±ng hoáș·c lớn hÆĄn"] # 0xe95a (en: 'less than almost equal or greater than') + - "": [t: "gáș„p đîi logic hoáș·c"] # 0xe95c (en: 'double logical or') + - "⩔": [t: "gáș„p đîi logic hoáș·c"] # 0x2a54 (en: 'double logical or') + - "": [t: "gáș„p đîi logic vĂ "] # 0xe95d (en: 'double logical and') + - "⩓": [t: "gáș„p đîi logic vĂ "] # 0x2a53 (en: 'double logical and') + - "": [t: "logic hoáș·c với thanh đîi dưới đñy"] # 0xe95e (en: 'logical or with double bar below') + - "": [t: "logic hoáș·c với thanh dưới đñy"] # 0xe95f (en: 'logical or with bar below') + - "": [t: "gáș§n như báș±ng nhau trĂȘn"] # 0xe962 (en: 'almost equal over equal') + - "î„€": [t: "hĂŹnh tam giĂĄc trỏ trĂĄi với thanh chia đîi"] # 0xe964 (en: 'left pointing triangle with bisecting bar') + - "î„„": [t: "tam giĂĄc chỉ bĂȘn pháșŁi với thanh chia đîi"] # 0xe965 (en: 'right pointing triangle with bisecting bar') + - "": [t: "báș±ng với dĂČng trĂȘn cĂčng cháș„m"] # 0xe966 (en: 'equals with dotted top line') + - "î„§": [t: "đi trước với đáșĄi trĂ ng"] # 0xe967 (en: 'precedes with colon') + - "": [t: "thĂ nh cĂŽng với đáșĄi trĂ ng"] # 0xe968 (en: 'succeeds with colon') + - "î„©": [t: "nhỏ hÆĄn hoáș·c báș±ng nghiĂȘng"] # 0xe969 (en: 'smaller than or equal slanted') + - "î„Ș": [t: "lớn hÆĄn hoáș·c báș±ng nghiĂȘng"] # 0xe96a (en: 'larger than or equal slanted') + - "î„«": [t: "lồng nhau ráș„t Ă­t hÆĄn"] # 0xe96b (en: 'nested very much less than') + - "": [t: "lồng nhau ráș„t lớn hÆĄn nhiều so với"] # 0xe96c (en: 'nested very much greater than') + - "î„­": [t: "sá»± khĂĄc biệt giữa biáșżn thể"] # 0xe96d (en: 'difference between variant') + - "âȘź": [t: "sá»± khĂĄc biệt giữa biáșżn thể"] # 0x2aae (en: 'difference between variant') + - "": [t: "Ă­t hÆĄn so với lớp phá»§"] # 0xe96e (en: 'less than greater than overlay') + - "âȘ€": [t: "Ă­t hÆĄn so với lớp phá»§"] # 0x2aa4 (en: 'less than greater than overlay') + - "": [t: "logic hoáș·c logic vĂ  lớp phá»§"] # 0xe96f (en: 'logical or logical and overlay') + - "î„°": [t: "superset trĂȘn superset"] # 0xe970 (en: 'superset over superset') + - "⫖": [t: "superset trĂȘn superset"] # 0x2ad6 (en: 'superset over superset') + - "": [t: "táș­p hợp con qua táș­p hợp con"] # 0xe971 (en: 'subset over subset') + - "⫕": [t: "táș­p hợp con qua táș­p hợp con"] # 0x2ad5 (en: 'subset over subset') + - "î„Č": [t: "superset trĂȘn táș­p hợp con"] # 0xe972 (en: 'superset over subset') + - "⫔": [t: "superset trĂȘn táș­p hợp con"] # 0x2ad4 (en: 'superset over subset') + - "": [t: "táș­p hợp con trĂȘn superset"] # 0xe973 (en: 'subset over superset') + - "⫓": [t: "táș­p hợp con trĂȘn superset"] # 0x2ad3 (en: 'subset over superset') + - "î„č": [t: "thanh ba tháșłng đứng"] # 0xe979 (en: 'triple vertical bar') + - "î„ș": [t: "ghĂ©p cĂĄc cháș„m dọc"] # 0xe97a (en: 'paired quadruple vertical dots') + - "î„»": [t: "vuĂŽng gĂłc trĂȘn thanh"] # 0xe97b (en: 'perpendicular over bar') + - "⫚": [t: "vuĂŽng gĂłc trĂȘn thanh"] # 0x2ae8 (en: 'perpendicular over bar') + - "": [t: "bar let -bretstile bar du trường"] # 0xe97c (en: 'left turnstile double vertical bar') + - "": [t: "double bĂȘn trĂĄi thanh dọc kĂ©p"] # 0xe97d (en: 'double left turnstile double vertical bar') + - "": [t: "vuĂŽng gĂłc trĂȘn đáșŁo ngÆ°á»Łc vuĂŽng gĂłc"] # 0xe97e (en: 'perpendicular over inverted perpendicular') + - "": [t: "double bĂȘn trĂĄi thanh dọc"] # 0xe97f (en: 'double left turnstile vertical bar') + - "â«€": [t: "double bĂȘn trĂĄi thanh dọc"] # 0x2ae4 (en: 'double left turnstile vertical bar') + - "": [t: "gĂłc hĂŹnh cáș§u mở ra"] # 0xe980 (en: 'spherical angle opening up') + - "": [t: "chĂ©m đîi"] # 0xe981 (en: 'double slash') + - "": [t: "gĂłc vuĂŽng với gĂłc"] # 0xe982 (en: 'right angle with corner') + - "": [t: "bao quanh thanh dọc"] # 0xe984 (en: 'circled vertical bar') + - "⊶": [t: "bao quanh thanh dọc"] # 0x29b6 (en: 'circled vertical bar') + - "": [t: "dáș„u hiệu phĂąn chia vĂČng trĂČn"] # 0xe985 (en: 'circled division sign') + - "âšž": [t: "dáș„u hiệu phĂąn chia vĂČng trĂČn"] # 0x2a38 (en: 'circled division sign') + - "": [t: "solidus đứt nĂ©t"] # 0xe986 (en: 'dashed solidus') + - "": [t: "backslash bị đứt nĂ©t"] # 0xe987 (en: 'dashed backslash') + - "": [t: "đường giữa đứt"] # 0xe988 (en: 'dashed mid line') + - "": [t: "thanh dọc đứt"] # 0xe989 (en: 'dashed vertical bar') + - "": [t: "vuĂŽng gĂłc với s"] # 0xe98a (en: 'perpendicular with s') + - "": [t: "gĂłc với s"] # 0xe98b (en: 'angle with s') + - "": [t: "gĂłc hĂŹnh cáș§u mở bĂȘn trĂĄi"] # 0xe98c (en: 'spherical angle opening left') + - "": [t: "gĂłc mở bĂȘn trĂĄi"] # 0xe98d (en: 'angle opening left') + - "": [t: "thanh dọc với mĂłc đîi"] # 0xe98e (en: 'vertical bar with double hook') + - "℟": [t: "thanh dọc với mĂłc đîi"] # 0x297e (en: 'vertical bar with double hook') + - "": [t: "toĂĄn tá»­ cháș„m trung bĂŹnh gốc tá»± do"] # 0xe98f (en: 'medium dot operator free radical') + - "": [t: "tráșŻng lĂȘn hĂŹnh tam giĂĄc phĂ­a trĂȘn thanh"] # 0xe990 (en: 'white up pointing triangle above bar') + - "": [t: "giống hệt nhau vĂ  song song với"] # 0xe991 (en: 'identical and parallel to') + - "": [t: "smash sáșŁn pháș©m"] # 0xe992 (en: 'smash product') + - "âšł": [t: "smash sáșŁn pháș©m"] # 0x2a33 (en: 'smash product') + - "": [t: "toĂĄn tá»­ ba thanh với thanh ngang"] # 0xe993 (en: 'triple bar operator with horizontal bar') + - "": [t: "giống hệt với cáșŻt đîi"] # 0xe994 (en: 'identical to with double slash') + - "â§„": [t: "giống hệt với cáșŻt đîi"] # 0x29e5 (en: 'identical to with double slash') + - "": [t: "triple crossed bars"] # 0xe995 + - "": [t: "thanh dọc trĂȘn vĂČng trĂČn"] # 0xe996 (en: 'vertical bar over circle') + - "": [t: "tá»· lệ dọc so với"] # 0xe997 (en: 'vertical proportional to') + - "": [t: "đen quĂœ trước máș·t trăng"] # 0xe998 (en: 'black last quarter moon') + - "": [t: "máș·t trăng quĂœ đáș§u tiĂȘn mĂ u đen"] # 0xe999 (en: 'black first quarter moon') + - "": [t: "sĂłng sin Ăąm"] # 0xe9a0 (en: 'negative sine wave') + - "": [t: "dáș„u ngoáș·c Ä‘ÆĄn"] # 0xe9a1 (en: 'parenthesized dot') + - "": [t: "dáș„u ngoáș·c Ä‘ÆĄn"] # 0xe9a2 (en: 'parens') + - "": [t: "nỄ cười tráșŻng"] # 0xe9a3 (en: 'white smile') + - "": [t: "tráșŻng cau mĂ y"] # 0xe9a4 (en: 'white frown') + - "": [t: "hĂŹnh lỄc giĂĄc"] # 0xe9a5 (en: 'hexagon') + - "": [t: "tÆ°ÆĄng Ä‘Æ°ÆĄng với hÆĄn cộng"] # 0xe9a6 (en: 'equivalent to over plus') + - "": [t: "cộng với quĂĄ mức tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0xe9a7 (en: 'plus over equivalent to') + - "": [t: "giao lộ serifs"] # 0xe9b0 (en: 'intersection serifs') + - "": [t: "liĂȘn minh serifs"] # 0xe9b1 (en: 'union serifs') + - "îŠČ": [t: "giao lộ vuĂŽng serifs"] # 0xe9b2 (en: 'square intersection serifs') + - "": [t: "square union serifs"] # 0xe9b3 + - "î§ ": [t: "trước tÆ°ÆĄng Ä‘Æ°ÆĄng hoáș·c thĂ nh cĂŽng"] # 0xe9e0 (en: 'precedes equivalent to or succeeds') + - "î§Ą": [t: "thĂ nh cĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với hoáș·c trước"] # 0xe9e1 (en: 'succeeds equivalent to or precedes') + - "î§ą": [t: "đi trước gáș§n như báș±ng hoáș·c thĂ nh cĂŽng"] # 0xe9e2 (en: 'precedes almost equal to or succeeds') + - "î§Ł": [t: "thĂ nh cĂŽng gáș§n như báș±ng hoáș·c trước"] # 0xe9e3 (en: 'succeeds almost equal to or precedes') + - "î§°": [t: "Ă­t hÆĄn tÆ°ÆĄng Ä‘Æ°ÆĄng với hoáș·c lớn hÆĄn"] # 0xe9f0 (en: 'less than equivalent to or greater than') + - "î§±": [t: "lớn hÆĄn tÆ°ÆĄng Ä‘Æ°ÆĄng với hoáș·c Ă­t hÆĄn"] # 0xe9f1 (en: 'greater than equivalent to or less than') + - "": [t: "khĂŽng pháșŁi lĂ  Ă­t hÆĄn nhiều"] # 0xea00 (en: 'not vert much less than') + - "": [t: "khĂŽng pháșŁi lĂ  lớn hÆĄn nhiều so với"] # 0xea01 (en: 'not vert much greater than') + - "": [t: "khĂŽng Ă­t hÆĄn nhiều biáșżn thể"] # 0xea02 (en: 'not much less than variant') + - "": [t: "khĂŽng lớn hÆĄn nhiều so với biáșżn thể"] # 0xea03 (en: 'not much greater than variant') + - "": [t: "Ă­t vert khĂŽng báș±ng kĂ©p báș±ng"] # 0xea04 (en: 'less vert not double equals') + - "": [t: "gt vert khĂŽng báș±ng kĂ©p"] # 0xea05 (en: 'gt vert not double equals') + - "": [t: "khĂŽng Ă­t hÆĄn hoáș·c báș±ng"] # 0xea06 (en: 'not less than or equal to') + - "": [t: "khĂŽng lớn hÆĄn hoáș·c báș±ng"] # 0xea07 (en: 'not greater than or equal to') + - "": [t: "khĂŽng báș±ng cĆ©ng khĂŽng Ă­t hÆĄn"] # 0xea09 (en: 'neither equal to nor less than') + - "": [t: "khĂŽng chứa hoáș·c báș±ng"] # 0xea0a (en: 'does not contain or equal to') + - "": [t: "khĂŽng pháșŁi siĂȘu sao cĆ©ng khĂŽng báș±ng"] # 0xea0b (en: 'neither superset of nor equal to') + - "": [t: "khĂŽng pháșŁi táș­p hợp con cĆ©ng khĂŽng báș±ng"] # 0xea0c (en: 'neither subset of nor equal to') + - "": [t: "đáșŁo ngÆ°á»Łc solidus táș­p hợp con"] # 0xea0d (en: 'reverse solidus subset') + - "": [t: "khĂŽng báș±ng cĆ©ng khĂŽng lớn hÆĄn"] # 0xea0e (en: 'neither equal to nor greater than') + - "": [t: "khĂŽng trừ đi toĂĄn tá»­ tilde"] # 0xea0f (en: 'not minus tilde operator') + - "": [t: "khĂŽng báș±ng cĆ©ng khĂŽng Ă­t hÆĄn"] # 0xea10 (en: 'neither equal to nor less than') + - "": [t: "khĂŽng pháșŁi nhĂ  điều hĂ nh tilde"] # 0xea11 (en: 'not tilde operator') + - "": [t: "khĂŽng pháșŁi lĂ  yáșżu tố hoáș·c báș±ng"] # 0xea12 (en: 'not element of or equal to') + - "": [t: "khĂŽng báș±ng cĆ©ng khĂŽng lớn hÆĄn"] # 0xea13 (en: 'neither equal to nor greater than') + - "": [t: "khĂŽng gáș§n như báș±ng nhau"] # 0xea14 (en: 'not almost equal') + - "": [t: "khĂŽng thĂ nh cĂŽng tÆ°ÆĄng tá»±"] # 0xea15 (en: 'not succeeds similar') + - "": [t: "Ă­t hÆĄn hoáș·c nghiĂȘng báș±ng với dáș„u gáșĄch chĂ©o"] # 0xea16 (en: 'less than or slanted equal to with slash') + - "": [t: "lớn hÆĄn hoáș·c nghiĂȘng báș±ng với dáș„u gáșĄch chĂ©o"] # 0xea17 (en: 'greater than or slanted equal to with slash') + - "": [t: "superset solidus"] # 0xea1a + - "": [t: "khĂŽng chứa"] # 0xea1b (en: 'does not contain') + - "": [t: "khĂŽng Ă­t hÆĄn hoáș·c báș±ng"] # 0xea1d (en: 'not less than or equal to') + - "": [t: "khĂŽng lớn hÆĄn hoáș·c báș±ng"] # 0xea1e (en: 'not greater than or equal to') + - "": [t: "khĂŽng gáș§n như báș±ng trừ"] # 0xea1f (en: 'not almost equal to minus') + - "îšą": [t: "tiĂȘu cá»±c đáș·t thĂ nh viĂȘn cháș„m ở trĂȘn"] # 0xea22 (en: 'negated set membership dot above') + - "": [t: "khĂŽng gĂłc gĂłc"] # 0xea2c (en: 'not vert angle') + - "îš­": [t: "khĂŽng song song nghiĂȘng"] # 0xea2d (en: 'not parallel slanted') + - "îšź": [t: "khĂŽng pháșŁi nhĂ  điều hĂ nh thanh"] # 0xea2e (en: 'not bar operator') + - "": [t: "khĂŽng pháșŁi nhĂ  điều hĂ nh thanh đîi"] # 0xea2f (en: 'not double bar operator') + - "îš°": [t: "khĂŽng pháșŁi nhĂ  điều hĂ nh ba thanh"] # 0xea30 (en: 'not triple bar operator') + - "îšČ": [t: "Ă­t hÆĄn nhưng khĂŽng xáș„p xỉ báș±ng"] # 0xea32 (en: 'less than but not approximately equal to') + - "âȘ‰": [t: "Ă­t hÆĄn nhưng khĂŽng xáș„p xỉ báș±ng"] # 0x2a89 (en: 'less than but not approximately equal to') + - "îšł": [t: "lớn hÆĄn nhưng khĂŽng xáș„p xỉ báș±ng"] # 0xea33 (en: 'greater than but not approximately equal to') + - "âȘŠ": [t: "lớn hÆĄn nhưng khĂŽng xáș„p xỉ báș±ng"] # 0x2a8a (en: 'greater than but not approximately equal to') + - "": [t: "nhỏ hÆĄn hoáș·c khĂŽng báș±ng"] # 0xea34 (en: 'less than or not equal to') + - "îš”": [t: "lớn hÆĄn hoáș·c khĂŽng báș±ng"] # 0xea35 (en: 'greater than or not equal to') + - "îš¶": [t: "khĂŽng lồng nhau Ă­t hÆĄn"] # 0xea36 (en: 'not nested less than') + - "îš·": [t: "khĂŽng lồng nhau lớn hÆĄn"] # 0xea37 (en: 'not nested greater than') + - "îšž": [t: "khĂŽng Ă­t hÆĄn nhiều"] # 0xea38 (en: 'not much less than') + - "îšč": [t: "khĂŽng lớn hÆĄn nhiều so với"] # 0xea39 (en: 'not much greater than') + - "îšș": [t: "đi trước nhưng khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0xea3a (en: 'precedes but not equivalent to') + - "îš»": [t: "thĂ nh cĂŽng nhưng khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0xea3b (en: 'succeeds but not equivalent to') + - "": [t: "đi trước nhưng khĂŽng báș±ng"] # 0xea3c (en: 'precedes but not equal to') + - "îšœ": [t: "thĂ nh cĂŽng nhưng khĂŽng báș±ng"] # 0xea3d (en: 'succeeds but not equal to') + - "": [t: "khĂŽng báș±ng hoáș·c trước"] # 0xea3e (en: 'does not equal or precede') + - "îšż": [t: "khĂŽng báș±ng hoáș·c thĂ nh cĂŽng"] # 0xea3f (en: 'does not equal or succeed') + - "": [t: "đi trước nhưng khĂŽng báș±ng"] # 0xea40 (en: 'precedes but not equal to') + - "âȘ”": [t: "đi trước nhưng khĂŽng báș±ng"] # 0x2ab5 (en: 'precedes but not equal to') + - "": [t: "thĂ nh cĂŽng nhưng khĂŽng báș±ng"] # 0xea41 (en: 'succeeds but not equal to') + - "âȘ¶": [t: "thĂ nh cĂŽng nhưng khĂŽng báș±ng"] # 0x2ab6 (en: 'succeeds but not equal to') + - "": [t: "khĂŽng pháșŁi lĂ  táș­p hợp con cĆ©ng khĂŽng báș±ng"] # 0xea42 (en: 'not subset of nor equal to') + - "": [t: "khĂŽng pháșŁi siĂȘu sao cĆ©ng khĂŽng báș±ng"] # 0xea43 (en: 'not superset of nor equal to') + - "": [t: "táș­p hợp con hoáș·c khĂŽng báș±ng"] # 0xea44 (en: 'subset of or not equal to') + - "": [t: "superset cá»§a hoáș·c khĂŽng báș±ng"] # 0xea45 (en: 'superset of or not equal to') + - "": [t: "khĂŽng pháșŁi lĂ  táș­p hợp con cĆ©ng khĂŽng báș±ng"] # 0xea46 (en: 'not subset of nor equal to') + - "": [t: "khĂŽng pháșŁi siĂȘu sao cĆ©ng khĂŽng báș±ng"] # 0xea47 (en: 'not superset of nor equal to') + - "": [t: "khĂŽng nhỏ hÆĄn ba"] # 0xea48 (en: 'not triple less than') + - "": [t: "khĂŽng lớn hÆĄn gáș„p ba láș§n"] # 0xea49 (en: 'not triple greater than') + - "": [t: "khĂŽng đi trước báș±ng"] # 0xea4c (en: 'not precedes equals') + - "": [t: "khĂŽng thĂ nh cĂŽng báș±ng nhau"] # 0xea4d (en: 'not succeeds equals') + - "": [t: "khĂŽng pháșŁi nhĂłm con bĂŹnh thường cá»§a thanh"] # 0xea50 (en: 'not normal subgroup of with bar') + - "": [t: "khĂŽng chứa như phĂąn nhĂłm bĂŹnh thường với thanh"] # 0xea51 (en: 'does not contain as normal subgroup with bar') + - "": [t: "khĂŽng pháșŁi lĂ  sá»± khĂĄc biệt giữa"] # 0xea52 (en: 'not difference between') + - "": [t: "khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng về máș·t hĂŹnh học"] # 0xea53 (en: 'not geometrically equivalent to') + - "": [t: "khĂŽng pháșŁi lĂ  tÆ°ÆĄng tá»±"] # 0xea54 (en: 'not vert similar') + - "": [t: "khĂŽng báș±ng hoáș·c tÆ°ÆĄng tá»±"] # 0xea55 (en: 'not equal or similar') + - "": [t: "khĂŽng gáș§n đĂșng"] # 0xea56 (en: 'not vert approximate') + - "": [t: "khĂŽng xáș„p xỉ giống hệt nhau"] # 0xea57 (en: 'not approximately identical to') + - "": [t: "khĂŽng gáș­p ghềnh báș±ng nhau"] # 0xea58 (en: 'not bumpy equals') + - "": [t: "khĂŽng gáș­p ghềnh báș±ng nhau"] # 0xea59 (en: 'not bumpy single equals') + - "": [t: "khĂŽng pháșŁi dáș„u cháș„m báș±ng nhau"] # 0xea5a (en: 'not equal dot') + - "": [t: "đáșŁo ngÆ°á»Łc khĂŽng tÆ°ÆĄng Ä‘Æ°ÆĄng"] # 0xea5b (en: 'reverse not equivalent') + - "î© ": [t: "khĂŽng pháșŁi táș­p hợp con vuĂŽng"] # 0xea60 (en: 'not square subset') + - "": [t: "khĂŽng pháșŁi lĂ  siĂȘu siĂȘu hĂŹnh"] # 0xea61 (en: 'not square superset') + - "": [t: "khĂŽng gáș§n như báș±ng nhau"] # 0xea62 (en: 'not almost equal over equal') + - "": [t: "khĂŽng hoĂ n toĂ n tÆ°ÆĄng Ä‘Æ°ÆĄng với"] # 0xea63 (en: 'not strictly equivalent to') + - "î©€": [t: "khĂŽng đồng dáșĄng cháș„m"] # 0xea64 (en: 'not congruent dot') + - "î©„": [t: "đáșŁo ngÆ°á»Łc khĂŽng báș±ng nhau"] # 0xea65 (en: 'reverse not equal') + - "î©°": [t: "khĂŽng pháșŁi đỉnh bĂȘn trĂĄi báș±ng nhau"] # 0xea70 (en: 'not vert left triangle equals') + - "": [t: "khĂŽng pháșŁi hĂŹnh tam giĂĄc bĂȘn pháșŁi báș±ng"] # 0xea71 (en: 'not vert right triangle equals') + - "îȘ€": [t: "khĂŽng một pháș§n"] # 0xea80 (en: 'not partial') + - "": [t: "mĆ©i tĂȘn extender"] # 0xeb00 (en: 'arrow embellishment extender') + - "": [t: "mĆ©i tĂȘn pháșŁi qua mĆ©i tĂȘn trĂĄi"] # 0xeb01 (en: 'arrow rightwards over arrow leftwards') + - "": [t: "mĆ©i tĂȘn pháșŁi qua mĆ©i tĂȘn trĂĄi"] # 0xeb02 (en: 'arrow rightwards over arrow leftwards') + - "": [t: "harpoon ngay trĂȘn harpoon trĂĄi"] # 0xeb03 (en: 'harpoon right over harpoon left') + - "": [t: "harpoon ngay trĂȘn harpoon trĂĄi"] # 0xeb04 (en: 'harpoon right over harpoon left') + - "": [t: "mĆ©i tĂȘn kĂ©p đîng nam tĂąy nam"] # 0xeb05 (en: 'double arrow northeast southwest') + - "": [t: "mĆ©i tĂȘn kĂ©p phĂ­a tĂąy báșŻc đîng nam"] # 0xeb06 (en: 'double arrow northwest southeast') + - "": [t: "bộ mở rộng harpoon ngang"] # 0xeb07 (en: 'horizontal harpoon extender') + - "": [t: "mĆ©i tĂȘn trĂĄi ngÆ°á»Łc chiều kim đồng hồ"] # 0xeb08 (en: 'anticlockwise arc leftwards arrow') + - "": [t: "vĂČng cung ngÆ°á»Łc chiều kim đồng hồ mĆ©i tĂȘn bĂȘn pháșŁi"] # 0xeb09 (en: 'anticlockwise arc rightwards arrow') + - "": [t: "giọng mĆ©i pháșŁi lớn"] # 0xeb0b (en: 'large rightwards arrow accent') + - "": [t: "điểm nháș„n mĆ©i tĂȘn lớn bĂȘn trĂĄi"] # 0xeb0c (en: 'large leftwards arrow accent') + - "": [t: "đáș§u mĆ©i tĂȘn trĂĄi"] # 0xeb0d (en: 'leftwards arrowhead') + - "": [t: "đáș§u mĆ©i tĂȘn pháșŁi"] # 0xeb0e (en: 'rightwards arrowhead') + - "": [t: "mĆ©i tĂȘn lớn bĂȘn trĂĄi với gáșĄch"] # 0xeb0f (en: 'large left right arrow with stroke') + - "": [t: "bộ mở rộng mĆ©i tĂȘn kĂ©p ngang"] # 0xeb10 (en: 'horizontal double arrow extender') + - "": [t: "mĆ©i tĂȘn đîi bĂȘn trĂĄi lớn bĂȘn trĂĄi với gáșĄch"] # 0xeb11 (en: 'large left right double arrow with stroke') + - "": [t: "mĆ©i tĂȘn xuống bĂȘn trĂĄi cá»§a mĆ©i tĂȘn hướng lĂȘn"] # 0xeb12 (en: 'downwards arrow leftwards of upwards arrow') + - "⇔": [t: "mĆ©i tĂȘn xuống bĂȘn trĂĄi cá»§a mĆ©i tĂȘn hướng lĂȘn"] # 0x21f5 (en: 'downwards arrow leftwards of upwards arrow') + - "": [t: "mĆ©i tĂȘn trĂĄi với gĂłc xuống"] # 0xeb13 (en: 'leftwards arrow with corner downwards') + - "": [t: "mĆ©i tĂȘn bĂȘn pháșŁi với gĂłc hướng lĂȘn trĂȘn"] # 0xeb14 (en: 'rightwards arrow with corner upwards') + - "": [t: "mĆ©i tĂȘn trĂĄi với gĂłc hướng lĂȘn trĂȘn"] # 0xeb15 (en: 'leftwards arrow with corner upwards') + - "": [t: "mĆ©i tĂȘn bĂĄn nguyệt trĂȘn cĂčng theo chiều kim đồng hồ với plus"] # 0xeb16 (en: 'anticlockwise top semicircle arrow with plus') + - "“": [t: "mĆ©i tĂȘn bĂĄn nguyệt trĂȘn cĂčng theo chiều kim đồng hồ với plus"] # 0x293d (en: 'anticlockwise top semicircle arrow with plus') + - "": [t: "mĆ©i tĂȘn bĂĄn nguyệt trĂȘn cĂčng theo chiều kim đồng hồ với điểm trừ"] # 0xeb17 (en: 'clockwise top semicircle arrow with minus') + - "‌": [t: "mĆ©i tĂȘn bĂĄn nguyệt trĂȘn cĂčng theo chiều kim đồng hồ với điểm trừ"] # 0x293c (en: 'clockwise top semicircle arrow with minus') + - "": [t: "mĆ©i tĂȘn bĂȘn pháșŁi với đuĂŽi với gáșĄch"] # 0xeb18 (en: 'rightwards arrow with tail with stroke') + - "": [t: "harpoon pháșŁi xuống"] # 0xeb19 (en: 'right harpoon down') + - "": [t: "rời harpoon xuống"] # 0xeb1a (en: 'left harpoon down') + - "": [t: "bĂȘn trĂĄi harpoon xuống"] # 0xeb1b (en: 'left right harpoon down') + - "ℐ": [t: "bĂȘn trĂĄi harpoon xuống"] # 0x2950 (en: 'left right harpoon down') + - "": [t: "bĂȘn trĂĄi harpoon lĂȘn"] # 0xeb1c (en: 'left right harpoon up') + - "ℎ": [t: "bĂȘn trĂĄi harpoon lĂȘn"] # 0x294e (en: 'left right harpoon up') + - "": [t: "lĂȘn xuống harpoon trĂĄi"] # 0xeb1d (en: 'up down harpoon left') + - "â„‘": [t: "lĂȘn xuống harpoon trĂĄi"] # 0x2951 (en: 'up down harpoon left') + - "": [t: "lĂȘn xuống harpoon pháșŁi"] # 0xeb1e (en: 'up down harpoon right') + - "ℏ": [t: "lĂȘn xuống harpoon pháșŁi"] # 0x294f (en: 'up down harpoon right') + - "": [t: "mĆ©i tĂȘn hướng lĂȘn bĂȘn pháșŁi cá»§a mĆ©i tĂȘn xuống"] # 0xeb1f (en: 'upwards arrow to the right of downwards arrow') + - "⇔": [t: "mĆ©i tĂȘn hướng lĂȘn bĂȘn pháșŁi cá»§a mĆ©i tĂȘn xuống"] # 0x21f5 (en: 'upwards arrow to the right of downwards arrow') + - "": [t: "harpoon trĂĄi để bar với barb lĂȘn trĂȘn"] # 0xeb20 (en: 'leftwards harpoon to bar with barb upwards') + - "â„’": [t: "harpoon trĂĄi để bar với barb lĂȘn trĂȘn"] # 0x2952 (en: 'leftwards harpoon to bar with barb upwards') + - "": [t: "quyền harpoon đáșżn bar với barb lĂȘn trĂȘn"] # 0xeb21 (en: 'rightwards harpoon to bar with barb upwards') + - "â„“": [t: "quyền harpoon đáșżn bar với barb lĂȘn trĂȘn"] # 0x2953 (en: 'rightwards harpoon to bar with barb upwards') + - "": [t: "harpoon bĂȘn trĂĄi để bar với barb xuống dưới"] # 0xeb22 (en: 'leftwards harpoon to bar with barb downwards') + - "â„–": [t: "harpoon bĂȘn trĂĄi để bar với barb xuống dưới"] # 0x2956 (en: 'leftwards harpoon to bar with barb downwards') + - "": [t: "quyền harpoon đáșżn bar với barb xuống dưới"] # 0xeb23 (en: 'rightwards harpoon to bar with barb downwards') + - "â„—": [t: "quyền harpoon đáșżn bar với barb xuống dưới"] # 0x2957 (en: 'rightwards harpoon to bar with barb downwards') + - "": [t: "harpoon trĂĄi từ quĂĄn bar với barb trở lĂȘn"] # 0xeb24 (en: 'leftwards harpoon from bar with barb upwards') + - "ℚ": [t: "harpoon trĂĄi từ quĂĄn bar với barb trở lĂȘn"] # 0x295a (en: 'leftwards harpoon from bar with barb upwards') + - "": [t: "harpoon ngay từ quĂĄn bar với barb trở lĂȘn"] # 0xeb25 (en: 'rightwards harpoon from bar with barb upwards') + - "â„›": [t: "harpoon ngay từ quĂĄn bar với barb trở lĂȘn"] # 0x295b (en: 'rightwards harpoon from bar with barb upwards') + - "": [t: "harpoon bĂȘn trĂĄi từ quĂĄn bar với barb trở xuống"] # 0xeb26 (en: 'leftwards harpoon from bar with barb downwards') + - "℞": [t: "harpoon bĂȘn trĂĄi từ quĂĄn bar với barb trở xuống"] # 0x295e (en: 'leftwards harpoon from bar with barb downwards') + - "": [t: "harpoon bĂȘn pháșŁi từ quĂĄn bar với barb trở xuống"] # 0xeb27 (en: 'rightwards harpoon from bar with barb downwards') + - "℟": [t: "harpoon bĂȘn pháșŁi từ quĂĄn bar với barb trở xuống"] # 0x295f (en: 'rightwards harpoon from bar with barb downwards') + - "": [t: "hướng lĂȘn trĂȘn harpoon để bar với barb trĂĄi"] # 0xeb28 (en: 'upwards harpoon to bar with barb leftwards') + - "℘": [t: "hướng lĂȘn trĂȘn harpoon để bar với barb trĂĄi"] # 0x2958 (en: 'upwards harpoon to bar with barb leftwards') + - "": [t: "downwards harpoon đáșżn bar với barb leftwards"] # 0xeb29 (en: 'downwards harpoon to bar with barb leftwards') + - "â„™": [t: "downwards harpoon đáșżn bar với barb leftwards"] # 0x2959 (en: 'downwards harpoon to bar with barb leftwards') + - "îŹȘ": [t: "hướng lĂȘn trĂȘn harpoon để bar với barb pháșŁi"] # 0xeb2a (en: 'upwards harpoon to bar with barb rightwards') + - "â„”": [t: "hướng lĂȘn trĂȘn harpoon để bar với barb pháșŁi"] # 0x2954 (en: 'upwards harpoon to bar with barb rightwards') + - "": [t: "xuống harpoon để bar với barb ngay"] # 0xeb2b (en: 'downwards harpoon to bar with barb rightwards') + - "â„•": [t: "xuống harpoon để bar với barb ngay"] # 0x2955 (en: 'downwards harpoon to bar with barb rightwards') + - "": [t: "harpoon đi lĂȘn từ quĂĄn bar với barb trĂĄi"] # 0xeb2c (en: 'upwards harpoon from bar with barb leftwards') + - "â„ ": [t: "harpoon đi lĂȘn từ quĂĄn bar với barb trĂĄi"] # 0x2960 (en: 'upwards harpoon from bar with barb leftwards') + - "": [t: "downwards harpoon từ quĂĄn bar với barb trĂĄi"] # 0xeb2d (en: 'downwards harpoon from bar with barb leftwards') + - "℥": [t: "downwards harpoon từ quĂĄn bar với barb trĂĄi"] # 0x2961 (en: 'downwards harpoon from bar with barb leftwards') + - "": [t: "harpoon đi lĂȘn từ quĂĄn bar với barb pháșŁi"] # 0xeb2e (en: 'upwards harpoon from bar with barb rightwards') + - "ℜ": [t: "harpoon đi lĂȘn từ quĂĄn bar với barb pháșŁi"] # 0x295c (en: 'upwards harpoon from bar with barb rightwards') + - "": [t: "downwards harpoon từ bar với barb pháșŁi"] # 0xeb2f (en: 'downwards harpoon from bar with barb rightwards') + - "ℝ": [t: "downwards harpoon từ bar với barb pháșŁi"] # 0x295d (en: 'downwards harpoon from bar with barb rightwards') + - "": [t: "mĆ©i tĂȘn hướng lĂȘn đáșżn thanh"] # 0xeb30 (en: 'upwards arrow to bar') + - "‒": [t: "mĆ©i tĂȘn hướng lĂȘn đáșżn thanh"] # 0x2912 (en: 'upwards arrow to bar') + - "": [t: "mĆ©i tĂȘn xuống thanh"] # 0xeb31 (en: 'downwards arrow to bar') + - "–": [t: "mĆ©i tĂȘn xuống thanh"] # 0x2913 (en: 'downwards arrow to bar') + - "îŹČ": [t: "harpoon hướng lĂȘn bĂȘn trĂĄi cá»§a harpoon xuống"] # 0xeb32 (en: 'upwards harpoon to the left of downwards harpoon') + - "℟": [t: "harpoon hướng lĂȘn bĂȘn trĂĄi cá»§a harpoon xuống"] # 0x296e (en: 'upwards harpoon to the left of downwards harpoon') + - "": [t: "harpoon hướng lĂȘn bĂȘn pháșŁi cá»§a harpoon xuống"] # 0xeb33 (en: 'upwards harpoon to the right of downwards harpoon') + - "ℯ": [t: "harpoon hướng lĂȘn bĂȘn pháșŁi cá»§a harpoon xuống"] # 0x296f (en: 'upwards harpoon to the right of downwards harpoon') + - "": [t: "đáș§u mĆ©i tĂȘn hướng lĂȘn"] # 0xeb34 (en: 'upwards arrowhead') + - "": [t: "đáș§u mĆ©i tĂȘn xuống"] # 0xeb35 (en: 'downwards arrowhead') + - "": [t: "double harpoon với barb bĂȘn trĂĄi xuống bĂȘn pháșŁi barb lĂȘn"] # 0xeb36 (en: 'double harpoon with leftwards barb down rightwards barb up') + - "": [t: "double harpoon với barb bĂȘn trĂĄi lĂȘn bĂȘn pháșŁi barb xuống"] # 0xeb37 (en: 'double harpoon with leftwards barb up rightwards barb down') + - "": [t: "mĆ©i tĂȘn trĂĄi trĂȘn thanh"] # 0xeb38 (en: 'leftwards arrow over bar') + - "îŹč": [t: "mĆ©i tĂȘn bĂȘn pháșŁi trĂȘn thanh"] # 0xeb39 (en: 'rightwards arrow over bar') + - "îŹș": [t: "mĆ©i tĂȘn trĂĄi dưới thanh"] # 0xeb3a (en: 'leftwards arrow under bar') + - "": [t: "mĆ©i tĂȘn bĂȘn pháșŁi dưới thanh"] # 0xeb3b (en: 'rightwards arrow under bar') + - "îŹŒ": [t: "mĆ©i tĂȘn ba bĂȘn trĂĄi"] # 0xeb3c (en: 'left right triple arrow') + - "": [t: "mĆ©i tĂȘn kĂ©p đîng nam đîng nam"] # 0xeb3f (en: 'double arrow northeast southeast') + - "": [t: "mĆ©i tĂȘn bĂĄn nguyệt trĂĄi ngÆ°á»Łc chiều kim đồng hồ"] # 0xeb40 (en: 'anticlockwise left semicircle arrow') + - "â€č": [t: "mĆ©i tĂȘn bĂĄn nguyệt trĂĄi ngÆ°á»Łc chiều kim đồng hồ"] # 0x2939 (en: 'anticlockwise left semicircle arrow') + - "": [t: "mĆ©i tĂȘn bĂĄn nguyệt trĂĄi theo chiều kim đồng hồ"] # 0xeb41 (en: 'clockwise left semicircle arrow') + - "": [t: "bĂȘn trĂĄi vĂČng trĂČn bĂȘn trĂĄi mĆ©i tĂȘn pháșŁi"] # 0xeb42 (en: 'left open circle left right arrow') + - "": [t: "mĆ©i tĂȘn bĂȘn pháșŁi trĂȘn tilde"] # 0xeb44 (en: 'rightwards arrow over tilde') + - "ℎ": [t: "mĆ©i tĂȘn bĂȘn pháșŁi trĂȘn tilde"] # 0x2974 (en: 'rightwards arrow over tilde') + - "": [t: "mĆ©i tĂȘn trĂĄi trĂȘn tilde"] # 0xeb45 (en: 'leftwards arrow over tilde') + - "ℳ": [t: "mĆ©i tĂȘn trĂĄi trĂȘn tilde"] # 0x2973 (en: 'leftwards arrow over tilde') + - "": [t: "harpoon trĂĄi qua thanh"] # 0xeb48 (en: 'leftwards harpoon over bar') + - "â„Ș": [t: "harpoon trĂĄi qua thanh"] # 0x296a (en: 'leftwards harpoon over bar') + - "": [t: "quyền harpoon trĂȘn quĂĄn bar"] # 0xeb49 (en: 'rightwards harpoon over bar') + - "ℏ": [t: "quyền harpoon trĂȘn quĂĄn bar"] # 0x296c (en: 'rightwards harpoon over bar') + - "": [t: "harpoon bĂȘn trĂĄi dưới quĂĄn bar"] # 0xeb4a (en: 'leftwards harpoon under bar') + - "â„«": [t: "harpoon bĂȘn trĂĄi dưới quĂĄn bar"] # 0x296b (en: 'leftwards harpoon under bar') + - "": [t: "quyền harpoon dưới quĂĄn bar"] # 0xeb4b (en: 'rightwards harpoon under bar') + - "â„­": [t: "quyền harpoon dưới quĂĄn bar"] # 0x296d (en: 'rightwards harpoon under bar') + - "": [t: "squat mĆ©i tĂȘn trĂĄi mĂ u đen"] # 0xeb4c (en: 'squat black leftwards arrow') + - "": [t: "mĆ©i tĂȘn bĂĄn nguyệt pháșŁi theo chiều kim đồng hồ"] # 0xeb50 (en: 'clockwise right semicircle arrow') + - "„": [t: "mĆ©i tĂȘn bĂĄn nguyệt pháșŁi theo chiều kim đồng hồ"] # 0x2938 (en: 'clockwise right semicircle arrow') + - "": [t: "mĆ©i tĂȘn bĂĄn nguyệt pháșŁi ngÆ°á»Łc chiều kim đồng hồ"] # 0xeb51 (en: 'anticlockwise right semicircle arrow') + - "": [t: "vĂČng trĂČn bĂȘn trĂĄi bĂȘn trĂĄi harpoon"] # 0xeb52 (en: 'left open circle left right harpoon') + - "": [t: "mĆ©i tĂȘn hướng lĂȘn bĂȘn trĂĄi cá»§a thanh dọc"] # 0xeb58 (en: 'upwards arrow leftwards of vertical bar') + - "": [t: "mĆ©i tĂȘn xuống bĂȘn trĂĄi cá»§a thanh dọc"] # 0xeb59 (en: 'downwards arrow leftwards of vertical bar') + - "": [t: "mĆ©i tĂȘn hướng lĂȘn bĂȘn pháșŁi cá»§a thanh dọc"] # 0xeb5a (en: 'upwards arrow rightwards of vertical bar') + - "": [t: "mĆ©i tĂȘn xuống bĂȘn pháșŁi cá»§a thanh dọc"] # 0xeb5b (en: 'downwards arrow rightwards of vertical bar') + - "": [t: "mĆ©i tĂȘn bĂȘn pháșŁi với mĂłc mở rộng xuống"] # 0xeb5c (en: 'rightwards arrow with extended downwards hook') + - "": [t: "mĆ©i tĂȘn trĂĄi với mĂłc mở rộng"] # 0xeb5d (en: 'leftwards arrow with extended hook') + - "": [t: "mĆ©i tĂȘn trĂĄi với mĂłc mở rộng xuống"] # 0xeb5e (en: 'leftwards arrow with extended downwards hook') + - "": [t: "mĆ©i tĂȘn bĂȘn pháșŁi với mĂłc mở rộng"] # 0xeb5f (en: 'rightwards arrow with extended hook') + - "î­ ": [t: "khĂŽng đĂșng mĆ©i tĂȘn lÆ°á»Łn sĂłng"] # 0xeb60 (en: 'not right arrow wavy') + - "î­Ą": [t: "khĂŽng đĂșng mĆ©i tĂȘn cong"] # 0xeb61 (en: 'not right arrow curved') + - "î­š": [t: "hướng lĂȘn trĂȘn harpoon bĂȘn trĂĄi cá»§a thanh dọc"] # 0xeb68 (en: 'upwards harpoon leftwards of vertical bar') + - "î­©": [t: "xuống harpoon trĂĄi cá»§a thanh dọc"] # 0xeb69 (en: 'downwards harpoon leftwards of vertical bar') + - "î­Ș": [t: "hướng lĂȘn trĂȘn harpoon ngay cá»§a thanh dọc"] # 0xeb6a (en: 'upwards harpoon rightwards of vertical bar') + - "î­«": [t: "xuống harpoon ngay bĂȘn pháșŁi cá»§a thanh dọc"] # 0xeb6b (en: 'downwards harpoon rightwards of vertical bar') + - "î­Ź": [t: "bộ mở rộng mĆ©i tĂȘn đîi dọc"] # 0xeb6c (en: 'vertical double arrow extender') + - "î­­": [t: "harpoon tháșłng đứng với barb left extender"] # 0xeb6d (en: 'vertical harpoon with barb left extender') + - "î­ź": [t: "harpoon tháșłng đứng với barb bĂȘn pháșŁi extender"] # 0xeb6e (en: 'vertical harpoon with barb right extender') + - "î­Ż": [t: "harpoon bĂȘn pháșŁi bĂȘn trĂĄi harpoon pháșŁi"] # 0xeb6f (en: 'right harpoon over left harpoon right') + - "î­°": [t: "harpoon bĂȘn trĂĄi bĂȘn trĂĄi harpoon trĂĄi"] # 0xeb70 (en: 'right harpoon over left harpoon left') + - "î­±": [t: "bĂȘn trĂĄi harpoon trĂȘn bĂȘn pháșŁi harpoon pháșŁi"] # 0xeb71 (en: 'left harpoon over right harpoon right') + - "î­Č": [t: "bĂȘn trĂĄi harpoon qua harpoon pháșŁi trĂĄi"] # 0xeb72 (en: 'left harpoon over right harpoon left') + - "î­ł": [t: "mĆ©i tĂȘn trĂĄi từ đáș§u mĆ©i tĂȘn"] # 0xeb73 (en: 'leftwards arrow from bar arrowhead') + - "î­Ž": [t: "mĆ©i tĂȘn trĂĄi từ bĂȘn pháșŁi từ thanh mở rộng"] # 0xeb74 (en: 'leftwards rightwards arrow from bar extender') + - "î­”": [t: "mĆ©i tĂȘn trĂĄi từ đuĂŽi thanh"] # 0xeb75 (en: 'leftwards arrow from bar tail') + - "î­¶": [t: "mĆ©i tĂȘn bĂȘn pháșŁi từ đuĂŽi thanh"] # 0xeb76 (en: 'rightwards arrow from bar tail') + - "î­·": [t: "mĆ©i tĂȘn bĂȘn pháșŁi từ đáș§u arrowhead"] # 0xeb77 (en: 'rightwards arrow from bar arrowhead') + - "î­ž": [t: "harpoon đi lĂȘn từ quĂĄn bar với đáș§u mĆ©i tĂȘn trĂĄi"] # 0xeb78 (en: 'upwards harpoon from bar with barb leftwards arrowhead') + - "î­č": [t: "mĆ©i tĂȘn pháșŁi qua mĆ©i tĂȘn trĂĄi bĂȘn pháșŁi"] # 0xeb79 (en: 'rightwards arrow over leftwards arrow right') + - "î­ș": [t: "mĆ©i tĂȘn pháșŁi qua mĆ©i tĂȘn trĂĄi bĂȘn trĂĄi"] # 0xeb7a (en: 'rightwards arrow over leftwards arrow left') + - "î­»": [t: "mĆ©i tĂȘn trĂĄi qua mĆ©i tĂȘn pháșŁi bĂȘn pháșŁi"] # 0xeb7b (en: 'leftwards arrow over rightwards arrow right') + - "î­Œ": [t: "mĆ©i tĂȘn trĂĄi qua mĆ©i tĂȘn bĂȘn pháșŁi"] # 0xeb7c (en: 'leftwards arrow over rightwards arrow leftt') + - "î­œ": [t: "mĆ©i tĂȘn hướng lĂȘn từ đáș§u mĆ©i tĂȘn"] # 0xeb7d (en: 'upwards arrow from bar arrowhead') + - "î­Ÿ": [t: "mĆ©i tĂȘn hướng lĂȘn từ đuĂŽi thanh"] # 0xeb7e (en: 'upwards arrow from bar tail') + - "î­ż": [t: "mĆ©i tĂȘn xuống từ đuĂŽi thanh"] # 0xeb7f (en: 'downwards arrow from bar tail') + - "": [t: "mĆ©i tĂȘn xuống từ đáș§u mĆ©i tĂȘn"] # 0xeb80 (en: 'downwards arrow from bar arrowhead') + - "": [t: "downwards harpoon từ quĂĄn bar với đáș§u mĆ©i tĂȘn bĂȘn pháșŁi"] # 0xeb81 (en: 'downwards harpoon from bar with barb rightwards arrowhead') + - "": [t: "harpoon hướng lĂȘn bĂȘn trĂĄi cá»§a đáy harpoon"] # 0xeb82 (en: 'upwards harpoon to the left of downwards harpoon bottom') + - "": [t: "harpoon hướng lĂȘn bĂȘn trĂĄi cá»§a downwards harpoon extender"] # 0xeb83 (en: 'upwards harpoon to the left of downwards harpoon extender') + - "": [t: "downwards harpoon ở bĂȘn trĂĄi cá»§a harpoon top"] # 0xeb84 (en: 'downwards harpoon to the left of upwards harpoon top') + - "": [t: "lĂȘn trĂȘn harppoon ở bĂȘn trĂĄi cá»§a harpoon xuống trĂȘn"] # 0xeb85 (en: 'upwards harppoon to the left of downwards harpoon top') + - "": [t: "xuống harpoon bĂȘn trĂĄi cá»§a bộ mở rộng harpoon lĂȘn trĂȘn"] # 0xeb86 (en: 'downwards harpoon to the left of the upwards harpoon extender') + - "": [t: "downwards harpoon ở bĂȘn trĂĄi cá»§a đáy harpoon hướng lĂȘn"] # 0xeb87 (en: 'downwards harpoon to the left of the upwards harpoon bottom') + - "": [t: "mĆ©i tĂȘn hướng lĂȘn bĂȘn trĂĄi cá»§a phĂ­a dưới mĆ©i tĂȘn xuống"] # 0xeb88 (en: 'upwards arrow leftwards of downwards arrow bottom') + - "": [t: "mĆ©i tĂȘn xuống bĂȘn trĂĄi cá»§a đáș§u mĆ©i tĂȘn lĂȘn trĂȘn"] # 0xeb89 (en: 'downwards arrow leftwards of upwards arrow top') + - "": [t: "mĆ©i tĂȘn hướng lĂȘn bĂȘn trĂĄi cá»§a đáș§u mĆ©i tĂȘn xuống"] # 0xeb8a (en: 'upwards arrow leftwards of downwards arrow top') + - "": [t: "mĆ©i tĂȘn xuống bĂȘn trĂĄi cá»§a phĂ­a dưới mĆ©i tĂȘn hướng lĂȘn"] # 0xeb8b (en: 'downwards arrow leftwards of upwards arrow bottom') + - "": [t: "bĂȘn trĂĄi mĆ©i tĂȘn pháșŁi mở rộng"] # 0xeb8c (en: 'leftwards rightwards arrows extender') + - "": [t: "east east arrow extender"] # 0xeb8d (en: 'north east arrow extender') + - "": [t: "nội thu mĆ©i tĂȘn tĂąy báșŻc"] # 0xeb8e (en: 'north west arrow extender') + - "": [t: "xuống niềng răng trĂĄi"] # 0xec00 (en: 'down pointing brace left') + - "": [t: "xuống chỉ náșčp giữa"] # 0xec01 (en: 'down pointing brace mid') + - "": [t: "xuống chỉ náșčp đĂșng"] # 0xec02 (en: 'down pointing brace right') + - "": [t: "mĂĄy mở rộng náșčp ngang"] # 0xec03 (en: 'horizontal brace extender') + - "": [t: "lĂȘn niềng răng trĂĄi"] # 0xec04 (en: 'up pointing brace left') + - "": [t: "lĂȘn niềng răng giữa"] # 0xec05 (en: 'up pointing brace mid') + - "": [t: "náșčp lĂȘn chỉ đĂșng"] # 0xec06 (en: 'up-pointing brace right') + - "": [t: "thanh tháșłng đứng trĂĄi"] # 0xec07 (en: 'left vertical bar') + - "": [t: "thanh dọc bĂȘn pháșŁi"] # 0xec08 (en: 'right vertical bar') + - "": [t: "thanh dọc trĂĄi"] # 0xec09 (en: 'left double vertical bar') + - "": [t: "thanh dọc bĂȘn pháșŁi"] # 0xec0a (en: 'right double vertical bar') + - "": [t: "bộ mở rộng khung ngang"] # 0xec0b (en: 'horizontal bracket extender') + - "": [t: "dưới khung vuĂŽng"] # 0xec0c (en: 'under square bracket') + - "⎔": [t: "dưới khung vuĂŽng"] # 0x23b5 (en: 'under square bracket') + - "": [t: "trĂȘn khung vuĂŽng"] # 0xec0d (en: 'over square bracket') + - "⎮": [t: "trĂȘn khung vuĂŽng"] # 0x23b4 (en: 'over square bracket') + - "": [t: "dưới khung trĂĄi"] # 0xec0e (en: 'under bracket left') + - "": [t: "dưới khung đĂșng"] # 0xec0f (en: 'under bracket right') + - "": [t: "qua giĂĄ đụ trĂĄi"] # 0xec10 (en: 'over bracket left') + - "": [t: "trĂȘn khung đĂșng"] # 0xec11 (en: 'over bracket right') + - "": [t: "dáș„u ngoáș·c trĂĄi 1"] # 0xec12 (en: 'left parens 1') + - "": [t: "dáș„u ngoáș·c trĂĄi 2"] # 0xec13 (en: 'left parens 2') + - "": [t: "dáș„u ngoáș·c Ä‘ÆĄn 3"] # 0xec14 (en: 'left parens 3') + - "": [t: "dáș„u ngoáș·c trĂĄi 4"] # 0xec15 (en: 'left parens 4') + - "": [t: "dáș„u ngoáș·c Ä‘ÆĄn pháșŁi 1"] # 0xec16 (en: 'right parens 1') + - "": [t: "dáș„u ngoáș·c Ä‘ÆĄn pháșŁi 2"] # 0xec17 (en: 'right parens 2') + - "": [t: "dáș„u ngoáș·c Ä‘ÆĄn 3"] # 0xec18 (en: 'right parens 3') + - "": [t: "dáș„u ngoáș·c Ä‘ÆĄn pháșŁi 4"] # 0xec19 (en: 'right parens 4') + - "": [t: "triệt để 1"] # 0xec1a (en: 'radical 1') + - "": [t: "triệt để 2"] # 0xec1b (en: 'radical 2') + - "": [t: "triệt để 3"] # 0xec1c (en: 'radical 3') + - "": [t: "triệt để 4"] # 0xec1d (en: 'radical 4') + - "": [t: "triệt để 5"] # 0xec1e (en: 'radical 5') + - "": [t: "đáy triệt để"] # 0xec1f (en: 'radical bottom') + - "î° ": [t: "bộ mở rộng tháșłng đứng triệt để"] # 0xec20 (en: 'radical vertical extender') + - "î°Ą": [t: "top cáș„p tiáșżn"] # 0xec21 (en: 'radical top') + - "î°ą": [t: "máș·t trĂĄi giĂĄ đụ đáș§u tráșŻng"] # 0xec22 (en: 'left white bracket top') + - "î°Ł": [t: "dĂąy mở rộng khung mĂ u tráșŻng"] # 0xec23 (en: 'left white bracket extender') + - "î°€": [t: "máș·t trĂĄi phĂ­a dưới khung mĂ u tráșŻng"] # 0xec24 (en: 'left white bracket bottom') + - "î°„": [t: "bĂȘn pháșŁi khung mĂ u tráșŻng"] # 0xec25 (en: 'right white bracket top') + - "î°Š": [t: "bĂȘn pháșŁi bộ mở rộng khung tráșŻng"] # 0xec26 (en: 'right white bracket extender') + - "î°§": [t: "đáy khung tráșŻng bĂȘn pháșŁi"] # 0xec27 (en: 'right white bracket bottom') + - "î°°": [t: "khung mĂ u tráșŻng trĂĄi"] # 0xec30 (en: 'left white curly bracket') + - "î°±": [t: "quyền tráșŻng tráșŻng tráșŻng"] # 0xec31 (en: 'right white curly bracket') + - "î°Č": [t: "dáș„u hiệu phĂąn chia dĂ i"] # 0xec32 (en: 'long division sign') + - "î°ł": [t: "bộ mở rộng dáș„u hiệu phĂąn chia dĂ i"] # 0xec33 (en: 'long division sign extender') + - "î°Ž": [t: "phĂąn chia ngáșŻn"] # 0xec34 (en: 'short division') + - "": [t: "double tĂąy nam đáșżn đîng báșŻc em bond"] # 0xec40 (en: 'double southwest to northeast em bond') + - "": [t: "double tĂąy báșŻc đáșżn đîng nam bond bond"] # 0xec41 (en: 'double northwest to southeast em bond') + - "": [t: "liĂȘn káșżt em ngang Ä‘ÆĄn"] # 0xec42 (en: 'single horizontal em bond') + - "": [t: "double ngang liĂȘn káșżt em"] # 0xec43 (en: 'double horizontal em bond') + - "": [t: "triple ngang liĂȘn káșżt em"] # 0xec44 (en: 'triple horizontal em bond') + - "": [t: "liĂȘn káșżt em tháșłng đứng"] # 0xec45 (en: 'single vertical em bond') + - "": [t: "double dọc liĂȘn káșżt em"] # 0xec46 (en: 'double vertical em bond') + - "": [t: "triple tháșłng đứng liĂȘn káșżt em"] # 0xec47 (en: 'triple vertical em bond') + - "": [t: "Ă­t hÆĄn trĂĄi phiáșżu em"] # 0xec48 (en: 'less than em bond') + - "": [t: "lớn hÆĄn liĂȘn káșżt em"] # 0xec49 (en: 'greater than em bond') + - "": [t: "liĂȘn káșżt en ngang Ä‘ÆĄn"] # 0xec4a (en: 'single horizontal en bond') + - "": [t: "double ngang liĂȘn káșżt en"] # 0xec4b (en: 'double horizontal en bond') + - "": [t: "triple hormanontal en liĂȘn káșżt"] # 0xec4c (en: 'triple horizontal en bond') + - "îȀ": [t: "trĂȘn cĂčng bĂȘn trĂĄi hĂŹnh chữ nháș­t"] # 0xec80 (en: 'top left rectangle') + - "îȁ": [t: "hĂŹnh chữ nháș­t phĂ­a dưới bĂȘn trĂĄi"] # 0xec81 (en: 'bottom left rectangle') + - "îȐ": [t: "trĂȘn cĂčng bĂȘn pháșŁi hĂŹnh chữ nháș­t"] # 0xec90 (en: 'top right rectangle') + - "îȑ": [t: "dưới cĂčng bĂȘn pháșŁi hĂŹnh chữ nháș­t"] # 0xec91 (en: 'bottom right rectangle') + - "îȒ": [t: "phĂąn chia tổng hợp gĂłc"] # 0xec92 (en: 'synthetic division corner') + - "îȓ": [t: "phĂąn chia tổng hợp mở rộng ngang"] # 0xec93 (en: 'synthetic division horizontal extender') + - "îȔ": [t: "phĂąn chia tổng hợp mở rộng dọc"] # 0xec94 (en: 'synthetic division vertical extender') + - "îȕ": [t: "bĂȘn trĂĄi sĂ n mở rộng"] # 0xec95 (en: 'left ceiling floor extender') + - "îȖ": [t: "bĂȘn pháșŁi sĂ n mở rộng"] # 0xec96 (en: 'right ceiling floor extender') + - "îȗ": [t: "qua bộ mở rộng khung"] # 0xec97 (en: 'over bracket extender') + - "îȘ": [t: "mĂĄy mở rộng thanh dọc"] # 0xec98 (en: 'vertical bar extender') + - "îș": [t: "bĂȘn trĂĄi đîi mở rộng thanh dọc"] # 0xec99 (en: 'left double vertical bar extender') + - "îȚ": [t: "mĂĄy mở rộng thanh ngang"] # 0xec9a (en: 'horizontal bar extender') + - "îȜ": [t: "dưới pháș§n mở rộng khung"] # 0xec9c (en: 'under bracket extender') + - "îȝ": [t: "xuống dáș„u ngoáș·c Ä‘ÆĄn đĂșng"] # 0xec9d (en: 'down pointing paren right') + - "îȞ": [t: "xuống chỉ dáș„u ngoáș·c Ä‘ÆĄn"] # 0xec9e (en: 'down pointing paren extender') + - "îȟ": [t: "down chỉ dáș„u ngoáș·c Ä‘ÆĄn trĂĄi"] # 0xec9f (en: 'down pointing paren left') + - "îČ ": [t: "lĂȘn chỉ dĂąy mở rộng náșčp"] # 0xeca0 (en: 'up pointing brace extender') + - "îČĄ": [t: "lĂȘn dáș„u ngoáș·c Ä‘ÆĄn cĂČn láșĄi"] # 0xeca1 (en: 'up pointing paren left') + - "îČą": [t: "lĂȘn dáș„u ngoáș·c Ä‘ÆĄn"] # 0xeca2 (en: 'up pointing paren extender') + - "îČŁ": [t: "lĂȘn dáș„u ngoáș·c Ä‘ÆĄn đĂșng"] # 0xeca3 (en: 'up pointing paren right') + - "îČ€": [t: "xuống chỉ dĂąy mở rộng náșčp"] # 0xeca4 (en: 'down pointing brace extender') + - "": [t: "planck háș±ng số trĂȘn hai thanh pi"] # 0xed00 (en: 'planck constant over two pi bar') + - "": [t: "gÆ°ÆĄng g"] # 0xed01 (en: 'mirror g') + - "": [t: "dotless j"] # 0xed02 + - "": [t: "digamma"] # 0xed03 + - "ϝ": [t: "digamma"] # 0x3dd + - "": [t: ""] # 0xed10 (en: 'd') + - "": [t: ""] # 0xed11 (en: 'e') + - "": [t: ""] # 0xed12 (en: 'i') + - "": [t: ""] # 0xed13 (en: 'j') + - "ⅅ": + - spell: "translate('.', 'ⅅ', 'DD')" # 0xed16, 0x2145 + +# The private use chars are from MathType + - "": [t: "vĂČng láș·p tĂ­ch hợp đường viền ngÆ°á»Łc chiều kim đồng hồ"] # 0xee00 (en: 'anticlockwise contour integral loop') + - "": [t: "vĂČng láș·p tĂ­ch phĂąn theo chiều kim đồng hồ"] # 0xee01 (en: 'clockwise contour integral loop') + - "": [t: ""] # 0xee04 + - "": [t: ""] # 0xee05 + - "": [t: ""] # 0xee06 + - "": [t: ""] # 0xee07 + - "": [t: ""] # 0xee08 + - "": [t: ""] # 0xee09 + - "": [t: ""] # 0xee0a + - "": [t: ""] # 0xee0b + - "": [t: ""] # 0xee0c + - "": [t: "tinh chỉnh tráșĄng thĂĄi chung"] # 0xee0d (en: 'joint status embellishment') + - "": [t: "tinh chỉnh tráșĄng thĂĄi chung trĂĄi"] # 0xee0e (en: 'joint status embellishment left') + - "": [t: "tinh chỉnh tráșĄng thĂĄi chung quyền"] # 0xee0f (en: 'joint status embellishment right') + - "": [t: "tráșĄng thĂĄi chung extender"] # 0xee10 (en: 'joint status embellishment extender') + - "": [t: "vĂČng láș·p tĂ­ch hợp"] # 0xee11 (en: 'integral loop') + - "": [t: "vĂČng láș·p tĂ­ch phĂąn đîi"] # 0xee12 (en: 'integral loop double') + - "": [t: "tĂ­ch hợp vĂČng ba"] # 0xee13 (en: 'integral loop triple') + - "": [t: "mở rộng đîi vĂČng láș·p tĂ­ch phĂąn"] # 0xee15 (en: 'expanding integral loop double') + - "": [t: "mở rộng ba vĂČng láș·p tĂ­ch phĂąn"] # 0xee16 (en: 'expanding integral loop triple') + - "": [t: "khĂŽng cĂł triệu chứng báș±ng giọng"] # 0xee17 (en: 'asymptotically equal to accent') + - "": [t: "dáș„u hiệu báș±ng giọng"] # 0xee18 (en: 'equal sign accent') + - "": [T: "đáșĄo hĂ m cáș„p bốn"] # 0xee19 + - "⁗": [T: "đáșĄo hĂ m cáș„p bốn"] # 0x2057 + - "": [t: "tăng điểm số với vĂČng trĂČn mở bĂȘn trĂĄi"] # 0xee1a (en: 'bar accent with open circle left') + - "": [t: "điểm nháș„n thanh với vĂČng trĂČn kĂ­n trĂĄi"] # 0xee1b (en: 'bar accent with closed circle left') + - "": [t: "tăng điểm số với vĂČng trĂČn mở pháșŁi"] # 0xee1c (en: 'bar accent with open circle right') + - "": [t: "tăng điểm số với dot"] # 0xee1d (en: 'bar accent with over dot') + - "": [t: "tăng điểm số với dưới cháș„m"] # 0xee1e (en: 'bar accent with under dot') + - "": [t: "tăng điểm số với gáș„p đîi so với cháș„m"] # 0xee1f (en: 'bar accent with double over dot') + - "îž ": [t: "tăng điểm số với gáș„p đîi dưới dáș„u cháș„m"] # 0xee20 (en: 'bar accent with double under dot') + - "": [t: "giọng nĂłi với caret"] # 0xee21 (en: 'bar accent with caret') + - "îžą": [t: "dĂ y dưới điểm nháș„n thanh"] # 0xee22 (en: 'thick under bar accent') + - "": [t: "tăng điểm số với vĂČng trĂČn kĂ­n pháșŁi"] # 0xee23 (en: 'bar accent with closed circle right') + - "": [t: "cháș„m lớn ở trĂȘn"] # 0xee24 (en: 'large dot above') + - "": [t: "đánh dáș„u căn chỉnh"] # 0xef00 (en: 'alignment mark') + - "": [t: ""] # 0xef01 + - "​": [t: ""] # 0x200b + - "": [t: ""] # 0xef02 + - " ": [t: ""] # 0x2009 + - "": [t: ""] # 0xef03 + - " ": [t: ""] # 0x205f + - "": [t: ""] # 0xef04 + - "": [t: ""] # 0xef05 + - " ": [t: ""] # 0x2003 + - "": [t: ""] # 0xef06 + - "": [t: ""] # 0xef07 + - "": [t: ""] # 0xef08 + - "": [t: ""] # 0xef09 + - "": [t: ""] # 0xef0a + - " ": [t: ""] # 0x200a + - "îŒą": [t: ""] # 0xef22 + - "îŒŁ": [t: ""] # 0xef23 + - "": [t: ""] # 0xef24 + - "": [t: ""] # 0xef29 + - "": [t: "thiáșżu nhiệm kỳ"] # 0xef41 (en: 'missing term') + - "": [t: "mĆ©i tĂȘn tĂ­ch phĂąn đường theo chiều kim đồng hồ bĂȘn trĂĄi"] # 0xef80 (en: 'clockwise contour integral arrow on left') + - "": [t: "tĂ­ch hợp với hĂŹnh vuĂŽng"] # 0xef81 (en: 'integral with square') + - "": [t: "tĂ­ch hợp với chĂ©m"] # 0xef82 (en: 'integral with slash') + - "": [t: "đáșŁo ngÆ°á»Łc tĂ­ch phĂąn"] # 0xef83 (en: 'reversed integral') + - "": [t: "double zero trĂȘn gáș„p đîi 0"] # 0xef90 (en: 'double zero over double zero') + - "": [t: "zero với chĂ©m"] # 0xef91 (en: 'zero with slash') + + # fraktur 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) + - t: "fraktur" + - spell: "translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" + + - "-": # 0xf000 - 0xf018 + - t: "fraktur" + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" + + - "𝔞-đ”·": # 0x1d51e - 0x1d537 + - t: "fraktur" + - spell: "translate('.', 'đ”žđ”Ÿđ” đ”Ąđ”ąđ”Łđ”€đ”„đ”Šđ”§đ”šđ”©đ”Șđ”«đ”Źđ”­đ”źđ”Żđ”°đ”±đ”Čđ”łđ”Žđ””đ”¶đ”·', 'abcdefghijklmnopqrstuvwxyz')" + - "-ï€ł": # 0xf01a - 0xf033 + - t: "fraktur" + - spell: "translate('.', 'ï€šï€›ï€œï€ï€žï€Ÿï€ ï€Ąï€ąï€Łï€€ï€„ï€Šï€§ï€šï€©ï€Șï€«ï€Źï€­ï€źï€Żï€°ï€±ï€Čï€ł', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝕬-𝖅": # 0x1D56C - 0x1D585 + - t: "fraktur tĂĄo báșĄo" # (en: 'fraktur bold') + - spell: "translate('.', 'đ•Źđ•­đ•źđ•Żđ•°đ•±đ•Čđ•łđ•Žđ•”đ•¶đ•·đ•žđ•čđ•șđ•»đ•Œđ•œđ•Ÿđ•żđ–€đ–đ–‚đ–ƒđ–„đ–…', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf040 - 0xf059 + - t: "fraktur tĂĄo báșĄo" # (en: 'fraktur bold') + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝖆-𝖟": # 0x1d586 - 0x1d59f + - t: "fraktur tĂĄo báșĄo" # (en: 'fraktur bold') + - spell: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" + - "-ïł": # 0xf05a - 0xf073 + - t: "fraktur tĂĄo báșĄo" # (en: 'fraktur bold') + - 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) + - test: + if: "$Verbosity!='Terse'" + then: [t: "cĂș đĂșp"] # (en: 'double struck') + - spell: "translate('.', '𝔾đ”čđ”șđ”»đ”Œđ”œđ”Ÿđ”żđ•€đ•đ•‚đ•ƒđ•„đ•…đ•†đ•‡đ•ˆđ•‰đ•Šđ•‹đ•Œđ•đ•Žđ•đ•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf080 - 0xf098 + - test: + if: "$Verbosity!='Terse'" + then: [t: "cĂș đĂșp"] # (en: 'double struck') + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝕒-đ•«": # 0x1d552 - 0x1d56b + - test: + if: "$Verbosity!='Terse'" + then: [t: "cĂș đĂșp"] # (en: 'double struck') + - spell: "translate('.', 'đ•’đ•“đ•”đ••đ•–đ•—đ•˜đ•™đ•šđ•›đ•œđ•đ•žđ•Ÿđ• đ•Ąđ•ąđ•Łđ•€đ•„đ•Šđ•§đ•šđ•©đ•Șđ•«', 'abcdefghijklmnopqrstuvwxyz')" + - "-ï‚ł": # 0xf09a - 0xf0b3 + - test: + if: "$Verbosity!='Terse'" + then: [t: "cĂș đĂșp"] # (en: 'double struck') + - spell: "translate('.', 'ï‚šï‚›ï‚œï‚ï‚žï‚Ÿï‚ ï‚Ąï‚ąï‚Łï‚€ï‚„ï‚Šï‚§ï‚šï‚©ï‚Șï‚«ï‚Źï‚­ï‚źï‚Żï‚°ï‚±ï‚Čï‚ł', 'abcdefghijklmnopqrstuvwxyz')" + - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 + - test: + if: "$Verbosity!='Terse'" + then: [t: "cĂș đĂșp"] # (en: 'double struck') + - spell: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" + - "-": # 0xf0c0 - 0xf0c9 + - test: + if: "$Verbosity!='Terse'" + then: [t: "cĂș đĂșp"] # (en: 'double struck') + - spell: "translate('.', '', '0123456789')" + + - "": [t: "double táș„n cĂŽng nabla"] # 0xf0ca (en: 'double struck nabla') + - "": [t: "double táș„n cĂŽng háș±ng số euler"] # 0xf0cb (en: 'double struck euler constant') + + # script chars in math alphabetic block and also MathType private use area + - "𝒜-đ’”": # 0x1d49c - 0x1d4b5 + - t: "script" + - spell: "translate('.', 'đ’œđ’đ’žđ’Ÿđ’ đ’Ąđ’ąđ’Łđ’€đ’„đ’Šđ’§đ’šđ’©đ’Șđ’«đ’Źđ’­đ’źđ’Żđ’°đ’±đ’Čđ’łđ’Žđ’”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf100 - 0xf119 + - t: "script" + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "đ’¶-𝓏": # 0x1d4b6 - 0x1d4cf + - t: "script" + - spell: "translate('.', 'đ’¶đ’·đ’žđ’čđ’șđ’»đ’Œđ’œđ’Ÿđ’żđ“€đ“đ“‚đ“ƒđ“„đ“…đ“†đ“‡đ“ˆđ“‰đ“Šđ“‹đ“Œđ“đ“Žđ“', 'abcdefghijklmnopqrstuvwxyz')" + - "-ï„ł": # 0xf11a - 0xf133 + - t: "script" + - spell: "translate('.', 'ï„šï„›ï„œï„ï„žï„Ÿï„ ï„Ąï„ąï„Łï„€ï„„ï„Šï„§ï„šï„©ï„Șï„«ï„Źï„­ï„źï„Żï„°ï„±ï„Čï„ł', 'abcdefghijklmnopqrstuvwxyz')" + + # bold script chars in math alphabetic block and also MathType private use area + - "𝓐-đ“©": # 0x1d4d0 - 0x1d4e9 + - t: "kịch báșŁn in đáș­m" # (en: 'script bold') + - spell: "translate('.', 'đ“đ“‘đ“’đ““đ“”đ“•đ“–đ“—đ“˜đ“™đ“šđ“›đ“œđ“đ“žđ“Ÿđ“ đ“Ąđ“ąđ“Łđ“€đ“„đ“Šđ“§đ“šđ“©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf140 - 0xf159 + - t: "kịch báșŁn in đáș­m" # (en: 'script bold') + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "đ“Ș-𝔃": # 0x1d4ea - 0x1d503 + - t: "kịch báșŁn in đáș­m" # (en: 'script bold') + - spell: "translate('.', 'đ“Șđ“«đ“Źđ“­đ“źđ“Żđ“°đ“±đ“Čđ“łđ“Žđ“”đ“¶đ“·đ“žđ“čđ“șđ“»đ“Œđ“œđ“Ÿđ“żđ”€đ”đ”‚đ”ƒ', 'abcdefghijklmnopqrstuvwxyz')" + - "-ï…ł": # 0xf15a - 0xf173 + - t: "kịch báșŁn in đáș­m" # (en: 'script bold') + - spell: "translate('.', 'ï…šï…›ï…œï…ï…žï…Ÿï… ï…Ąï…ąï…Łï…€ï…„ï…Šï…§ï…šï…©ï…Șï…«ï…Źï…­ï…źï…Żï…°ï…±ï…Čï…ł', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf180 - 0xf199 + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "": # 0xf19a + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [t: "háș­u quáșŁ"] # (en: 'cap') + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [t: "ligature ae"] + - "": # 0xf19b + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [t: "háș­u quáșŁ"] # (en: 'cap') + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [t: "sáșŻc s"] # (en: 'sharp s') + - "": # 0xf19c + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [t: "háș­u quáșŁ"] # (en: 'cap') + else: [x: "$SpeechOverrides_CapitalLetters"] + - pitch: + value: "$CapitalLetters_Pitch" + replace: [t: "o với gáșĄch"] # (en: 'o with stroke') + + # MathType only has a few of the cap Greek letters in PUA + - "": # 0xf201 - 0xf209 + - test: + if: "$Verbosity!='Terse'" + then: [t: "cĂș đĂșp"] # (en: 'double struck') + - spell: "translate('.', '', 'Î”ÎšÎ›Î ÎŁÎ˜Î“Î©Î„')" + + - "-": # 0xf220 - 0xf236 + - test: + if: "$Verbosity!='Terse'" + then: [t: "cĂș đĂșp"] # (en: 'double struck') + - spell: "translate('.', 'ïˆ ïˆĄïˆąïˆŁïˆ€ïˆ„ïˆŠïˆ§ïˆšïˆ©ïˆȘïˆ«ïˆŹïˆ­ïˆźïˆŻïˆ°ïˆ±ïˆČïˆłïˆŽïˆ”ïˆ¶', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "": [t: "double táș„n cĂŽng sigma cuối cĂčng"] # 0xf237 (en: 'double struck final sigma') + - "": [t: "double táș„n cĂŽng rho"] # 0xf250 (en: 'double struck rho') + - "": [t: "double táș„n cĂŽng phi"] # 0xf251 (en: 'double struck phi') + - "𝐀-𝐙": # 0x1d400 - 0x1d419 + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-ï‰č": # 0xf260 - 0xf279 + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', 'ï‰ ï‰Ąï‰ąï‰Łï‰€ï‰„ï‰Šï‰§ï‰šï‰©ï‰Șï‰«ï‰Źï‰­ï‰źï‰Żï‰°ï‰±ï‰Čï‰łï‰Žï‰”ï‰¶ï‰·ï‰žï‰č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝐚-𝐳": # 0x1d41a - 0x1d433 + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', 'đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đźđŻđ°đ±đČ𝐳', 'abcdefghijklmnopqrstuvwxyz')" + + - "ï‰ș-": # 0xf27a - 0xf293 + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', 'ï‰șï‰»ï‰Œï‰œï‰Ÿï‰żïŠ€ïŠïŠ‚ïŠƒïŠ„ïŠ…ïŠ†ïŠ‡ïŠˆïŠ‰ïŠŠïŠ‹ïŠŒïŠïŠŽïŠïŠïŠ‘ïŠ’ïŠ“', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝐮-𝑍": # 0x1d434 - 0x1d44d + - spell: "translate('.', 'đŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđ‘€đ‘đ‘‚đ‘ƒđ‘„đ‘…đ‘†đ‘‡đ‘ˆđ‘‰đ‘Šđ‘‹đ‘Œđ‘', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf294 - 0xf2ad + - spell: "translate('.', 'ïŠ”ïŠ•ïŠ–ïŠ—ïŠ˜ïŠ™ïŠšïŠ›ïŠœïŠïŠžïŠŸïŠ ïŠĄïŠąïŠŁïŠ€ïŠ„ïŠŠïŠ§ïŠšïŠ©ïŠȘïŠ«ïŠŹïŠ­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝑎-𝑧": # 0x1d44e - 0x1d467 + - spell: "translate('.', 'đ‘Žđ‘đ‘đ‘‘đ‘’đ‘“đ‘”đ‘•đ‘–đ‘—đ‘˜đ‘™đ‘šđ‘›đ‘œđ‘đ‘žđ‘Ÿđ‘ đ‘Ąđ‘ąđ‘Łđ‘€đ‘„đ‘Šđ‘§', 'abcdefghijklmnopqrstuvwxyz')" + + - "ïŠź-": # 0xf2ae - 0xf2c7 + - spell: "translate('.', 'ïŠźïŠŻïŠ°ïŠ±ïŠČïŠłïŠŽïŠ”ïŠ¶ïŠ·ïŠžïŠčïŠșïŠ»ïŠŒïŠœïŠŸïŠżï‹€ï‹ï‹‚ï‹ƒï‹„ï‹…ï‹†ï‹‡', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝑹-𝒁": # 0x1d468 - 0x1d481 + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', 'đ‘šđ‘©đ‘Șđ‘«đ‘Źđ‘­đ‘źđ‘Żđ‘°đ‘±đ‘Čđ‘łđ‘Žđ‘”đ‘¶đ‘·đ‘žđ‘čđ‘șđ‘»đ‘Œđ‘œđ‘Ÿđ‘żđ’€đ’', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-ï‹Ą": # 0xf2c8 - 0xf2e1 + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', 'ï‹ˆï‹‰ï‹Šï‹‹ï‹Œï‹ï‹Žï‹ï‹ï‹‘ï‹’ï‹“ï‹”ï‹•ï‹–ï‹—ï‹˜ï‹™ï‹šï‹›ï‹œï‹ï‹žï‹Ÿï‹ ï‹Ą', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝒂-𝒛": # 0x1d482 - 0x1d49b + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" + + - "ï‹ą-": # 0xf2e2 - 0xf2fb + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', 'ï‹ąï‹Łï‹€ï‹„ï‹Šï‹§ï‹šï‹©ï‹Șï‹«ï‹Źï‹­ï‹źï‹Żï‹°ï‹±ï‹Čï‹łï‹Žï‹”ï‹¶ï‹·ï‹žï‹čï‹ș', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝖠-đ–č": # 0x1d5a0 - 0x1d5b9 + - spell: "translate('.', 'đ– đ–Ąđ–ąđ–Łđ–€đ–„đ–Šđ–§đ–šđ–©đ–Șđ–«đ–Źđ–­đ–źđ–Żđ–°đ–±đ–Čđ–łđ–Žđ–”đ–¶đ–·đ–žđ–č', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf300 - 0xf319 + - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "đ–ș-𝗓": # 0x1d5ba - 0x1d5d3 + - spell: "translate('.', 'đ–șđ–»đ–Œđ–œđ–Ÿđ–żđ—€đ—đ—‚đ—ƒđ—„đ—…đ—†đ—‡đ—ˆđ—‰đ—Šđ—‹đ—Œđ—đ—Žđ—đ—đ—‘đ—’đ—“', 'abcdefghijklmnopqrstuvwxyz')" + + - "-ïŒł": # 0xf31a - 0xf333 + - spell: "translate('.', 'ïŒšïŒ›ïŒœïŒïŒžïŒŸïŒ ïŒĄïŒąïŒŁïŒ€ïŒ„ïŒŠïŒ§ïŒšïŒ©ïŒȘïŒ«ïŒŹïŒ­ïŒźïŒŻïŒ°ïŒ±ïŒČïŒł', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', 'đ—”đ—•đ—–đ——đ—˜đ—™đ—šđ—›đ—œđ—đ—žđ—Ÿđ— đ—Ąđ—ąđ—Łđ—€đ—„đ—Šđ—§đ—šđ—©đ—Șđ—«đ—Źđ—­', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf334 - 0xf34d + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', 'ïŒčïŒșïŒ»ïŒŒïŒœïŒŸïŒżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒï', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝗼-𝘇": # 0x1d5ee - 0x1d607 + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', 'đ—źđ—Żđ—°đ—±đ—Čđ—łđ—Žđ—”đ—¶đ—·đ—žđ—čđ—șđ—»đ—Œđ—œđ—Ÿđ—żđ˜€đ˜đ˜‚đ˜ƒđ˜„đ˜…đ˜†đ˜‡', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf34e - 0xf367 + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', 'ïŽïïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§', 'abcdefghijklmnopqrstuvwxyz')" + - "𝘈-𝘡": # 0x1d608 - 0x1d621 + # - t: "chữ in nghiĂȘng" # (en: 'italic') + - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - "-": # 0xf368 - 0xf381 + # - t: "chữ in nghiĂȘng" # (en: 'italic') + - spell: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżïŽ€ïŽ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝘱-đ˜»": # 0x1d622 - 0x1d63b + # - t: "chữ in nghiĂȘng" # (en: 'italic') + - spell: "translate('.', 'đ˜ąđ˜Łđ˜€đ˜„đ˜Šđ˜§đ˜šđ˜©đ˜Șđ˜«đ˜Źđ˜­đ˜źđ˜Żđ˜°đ˜±đ˜Čđ˜łđ˜Žđ˜”đ˜¶đ˜·đ˜žđ˜čđ˜șđ˜»', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf382 - 0xf39b + # - t: "chữ in nghiĂȘng" # (en: 'italic') + - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + + - "đ˜Œ-𝙕": # 0x1d63c - 0x1d655 + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', 'đ˜Œđ˜œđ˜Ÿđ˜żđ™€đ™đ™‚đ™ƒđ™„đ™…đ™†đ™‡đ™ˆđ™‰đ™Šđ™‹đ™Œđ™đ™Žđ™đ™đ™‘đ™’đ™“đ™”đ™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf39c - 0xf3b5 + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', 'ïŽœïŽïŽžïŽŸïŽ ïŽĄïŽąïŽŁïŽ€ïŽ„ïŽŠïŽ§ïŽšïŽ©ïŽȘïŽ«ïŽŹïŽ­ïŽźïŽŻïŽ°ïŽ±ïŽČïŽłïŽŽïŽ”', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝙖-𝙯": # 0x1d656 - 0x1d66f + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', 'đ™–đ™—đ™˜đ™™đ™šđ™›đ™œđ™đ™žđ™Ÿđ™ đ™Ąđ™ąđ™Łđ™€đ™„đ™Šđ™§đ™šđ™©đ™Șđ™«đ™Źđ™­đ™źđ™Ż', 'abcdefghijklmnopqrstuvwxyz')" + + - "-": # 0xf3b6 - 0xf3cf + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', 'ïŽčïŽșïŽ»ïŽŒïŽœïŽŸïŽżï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒïïŽï', 'abcdefghijklmnopqrstuvwxyz')" + + - "𝙰-𝚉": # 0x1d670 - 0x1d689 + - spell: "translate('.', 'đ™°đ™±đ™Čđ™łđ™Žđ™”đ™¶đ™·đ™žđ™čđ™șđ™»đ™Œđ™œđ™Ÿđ™żđš€đšđš‚đšƒđš„đš…đš†đš‡đšˆđš‰', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "-": # 0xf3d0 - 0xf3e9 + - spell: "translate('.', 'ïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ïĄïąïŁï€ï„ïŠï§ïšï©', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "𝚊-𝚣": # 0x1d68a - 0x1d6a3 + - spell: "translate('.', '𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚱𝚣', 'abcdefghijklmnopqrstuvwxyz')" + + - "ïȘ-": # 0xf3ea - 0xf403 + - spell: "translate('.', 'ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïșï»ïŒïœïŸïżï€ïï‚ïƒ', 'abcdefghijklmnopqrstuvwxyz')" + + - "": [t: "dotless i"] # 0xf404 + - "đš€": [t: "dotless i"] # 0x1d6a4 + - "đš„": [t: "dotless j"] # 0x1d6a5 + + - "𝚹-𝛀": # 0x1d6a8 - 0x1d6c0 + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', 'đššđš©đšȘđš«đšŹđš­đšźđšŻđš°đš±đšČđšłđšŽđš”đš¶đš·đšžđščđšșđš»đšŒđšœđšŸđšżđ›€', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "-": # 0xf408 - 0xf420 + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "𝛂-𝛚": # 0x1d6c2 - 0x1d6da + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙𝛚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "ïą-ïș": # 0xf422 - 0xf43a + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', 'ïąïŁï€ï„ïŠï§ïšï©ïȘï«ïŹï­ïźïŻï°ï±ïČïłïŽï”ï¶ï·ïžïčïș', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "ïĄ": [t: "nabla tĂĄo báșĄo"] # 0xf421 (en: 'bold nabla') + - "𝛁": [t: "nabla tĂĄo báșĄo"] # 0x1d6c1 (en: 'bold nabla') + + - "𝛛𝛜𝛝𝛞𝛟𝛠𝛡": # 0x1D6DB - 0x1D6E1 + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', '𝛛𝛜𝛝𝛞𝛟𝛠𝛡', '∂ΔΞÎșφρπ')" + + - "ï»ïŒïœïŸïżï‘€ï‘": # 0xF43C - 0xF441 + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', 'ï»ïŒïœïŸïżï‘€ï‘', '∂ΔΞÎșφρπ')" + + - "𝛱-đ›ș": # 0x1d6e2 - 0x1d6fa + # - t: "chữ in nghiĂȘng" # (en: 'italic') + - spell: "translate('.', 'đ›ąđ›Łđ›€đ›„đ›Šđ›§đ›šđ›©đ›Șđ›«đ›Źđ›­đ›źđ›Żđ›°đ›±đ›Čđ›łđ›Žđ›”đ›¶đ›·đ›žđ›čđ›ș', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "-": # 0xf442 - 0xf45a + # - t: "chữ in nghiĂȘng" # (en: 'italic') + - spell: "translate('.', '', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "đ›Œ-𝜔": # 0x1d6fc - 0x1d714 + # - t: "chữ in nghiĂȘng" # (en: 'italic') + - spell: "translate('.', 'đ›Œđ›œđ›Ÿđ›żđœ€đœđœ‚đœƒđœ„đœ…đœ†đœ‡đœˆđœ‰đœŠđœ‹đœŒđœđœŽđœđœđœ‘đœ’đœ“đœ”', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-": # 0xf45c - 0xf474 + # - t: "chữ in nghiĂȘng" # (en: 'italic') + - spell: "translate('.', 'ï‘œï‘ï‘žï‘Ÿï‘ ï‘Ąï‘ąï‘Łï‘€ï‘„ï‘Šï‘§ï‘šï‘©ï‘Șï‘«ï‘Źï‘­ï‘źï‘Żï‘°ï‘±ï‘Čï‘łï‘Ž', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "": [t: "nabla in nghiĂȘng"] # 0xf45b (en: 'italic nabla') + - "đ›»": [t: "nabla in nghiĂȘng"] # 0x1d6fb (en: 'italic nabla') + + - "𝜕𝜖𝜗𝜘𝜙𝜚𝜛": # 0x1d715 - 0x1d71b + # - t: "chữ in nghiĂȘng" # (en: 'italic') + - spell: "translate('.', '𝜕𝜖𝜗𝜘𝜙𝜚𝜛', '∂ΔΞÎșφρπ')" + + - "ï‘čï‘ș": # 0xf475 - 0xf47b + # - t: "chữ in nghiĂȘng" # (en: 'italic') + - spell: "translate('.', 'ï‘čï‘ș', '∂ΔΞÎșφρπ')" + + - "𝜜-𝜮": # 0x1d71c - 0x1d734 + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', 'đœœđœđœžđœŸđœ đœĄđœąđœŁđœ€đœ„đœŠđœ§đœšđœ©đœȘđœ«đœŹđœ­đœźđœŻđœ°đœ±đœČ𝜳𝜮', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "-": # 0xf47c - 0xf494 + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', 'ï‘Œï‘œï‘Ÿï‘żï’€ï’ï’‚ï’ƒï’„ï’…ï’†ï’‡ï’ˆï’‰ï’Šï’‹ï’Œï’ï’Žï’ï’ï’‘ï’’ï’“ï’”', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "đœ¶-𝝎": # 0x1d736 - 0x1d74e + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', 'đœ¶đœ·đœžđœčđœșđœ»đœŒđœœđœŸđœżđ€đđ‚đƒđ„đ…đ†đ‡đˆđ‰đŠđ‹đŒđđŽ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-ï’ź": # 0xf496 - 0xf4ae + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', 'ï’–ï’—ï’˜ï’™ï’šï’›ï’œï’ï’žï’Ÿï’ ï’Ąï’ąï’Łï’€ï’„ï’Šï’§ï’šï’©ï’Șï’«ï’Źï’­ï’ź', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "𝝏𝝐𝝑𝝒𝝓𝝔𝝕": # 0x1d74f - 0x1d755 + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', '𝝏𝝐𝝑𝝒𝝓𝝔𝝕', '∂ΔΞÎșφρπ')" + + - "ï’Żï’°ï’±ï’Čï’łï’Žï’”": # 0xf422 - 0xf43a + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', 'ï’Żï’°ï’±ï’Čï’łï’Žï’”', '∂ΔΞÎșφρπ')" + + - "đœ”": [t: "nabla italic in đáș­m"] # 0x1d735 (en: 'bold italic nabla') + - "": [t: "nabla italic in đáș­m"] # 0xf495 (en: 'bold italic nabla') + + - "𝝖-𝝼": # 0x1d756 - 0x1d76e + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', 'đ–đ—đ˜đ™đšđ›đœđđžđŸđ đĄđąđŁđ€đ„đŠđ§đšđ©đȘđ«đŹđ­đź', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + - "-": # 0xf4b6 - 0xf4ce + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', 'ï’¶ï’·ï’žï’čï’șï’»ï’Œï’œï’Ÿï’żï“€ï“ï“‚ï“ƒï“„ï“…ï“†ï“‡ï“ˆï“‰ï“Šï“‹ï“Œï“ï“Ž', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "𝝰-𝞈": # 0x1d770 - 0x1d788 + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', 'đ°đ±đČđłđŽđ”đ¶đ·đžđčđșđ»đŒđœđŸđżđž€đžđž‚đžƒđž„đž…đž†đž‡đžˆ', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-": # 0xf4d0 - 0xf4e8 + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', 'ï“ï“‘ï“’ï““ï“”ï“•ï“–ï“—ï“˜ï“™ï“šï“›ï“œï“ï“žï“Ÿï“ ï“Ąï“ąï“Łï“€ï“„ï“Šï“§ï“š', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "𝞉𝞊𝞋𝞌𝞍𝞎𝞏": # 0x1d789 - 0x1d78f + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', '𝞉𝞊𝞋𝞌𝞍𝞎𝞏', '∂ΔΞÎșφρπ')" + + - "ï“Șï“«ï“Źï“­ï“źï“Ż": # 0xf4e9 - 0xf4ef + - t: "dĆ©ng cáșŁm" # (en: 'bold') + - spell: "translate('.', 'ï“Șï“«ï“Źï“­ï“źï“Ż', '∂ΔΞÎșφρπ')" + + - "": [t: "nabla tĂĄo báșĄo"] # 0xf4cf (en: 'bold nabla') + - "𝝯": [t: "nabla tĂĄo báșĄo"] # 0x1d76f (en: 'bold nabla') + + - "𝞐-𝞹": # 0x1d790 - 0x1d7a8 + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', 'đžđž‘đž’đž“đž”đž•đž–đž—đž˜đž™đžšđž›đžœđžđžžđžŸđž đžĄđžąđžŁđž€đž„đžŠđž§đžš', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "-": # 0xf4f0 - 0xf508 + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', 'ï“Čï“łï“Žï“”ï“¶ï“·ï“žï“čï“șï“»ï“Œï“œï“Ÿï“żï”€ï”ï”‚ï”ƒï”„ï”…ï”†ï”‡ï”ˆ', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©')" + + - "đžȘ-𝟂": # 0x1d7aa - 0x1d7c2 + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', 'đžȘđž«đžŹđž­đžźđžŻđž°đž±đžČđžłđžŽđž”đž¶đž·đžžđžčđžșđž»đžŒđžœđžŸđžżđŸ€đŸđŸ‚', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "-ï”ą": # 0xf50a - 0xf522 + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', 'ï”Šï”‹ï”Œï”ï”Žï”ï”ï”‘ï”’ï”“ï””ï”•ï”–ï”—ï”˜ï”™ï”šï”›ï”œï”ï”žï”Ÿï” ï”Ąï”ą', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')" + + - "𝟃𝟄𝟅𝟆𝟇𝟈𝟉": # 0x1d7c3 - 0x1d7c9 + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', '𝟃𝟄𝟅𝟆𝟇𝟈𝟉', '∂ΔΞÎșφρπ')" + + - "ï”Łï”€ï”„ï”Šï”§ï”šï”©": # 0xf523 - 0xf529 + - t: "in nghiĂȘng" # (en: 'bold italic') + - spell: "translate('.', 'ï”Łï”€ï”„ï”Šï”§ï”šï”©', '∂ΔΞÎșφρπ')" + + - "": [t: "nabla tĂĄo báșĄo"] # 0xf509 (en: 'bold nabla') + - "đž©": [t: "nabla tĂĄo báșĄo"] # 0x1d7a9 (en: 'bold nabla') + + - "ï”ź": [t: "bold zero"] # 0xf52e + - "𝟎": [t: "bold zero"] # 0x1d7ce + - "ï”Ż": [t: "tĂĄo báșĄo"] # 0xf52f (en: 'bold one') + - "𝟏": [t: "tĂĄo báșĄo"] # 0x1d7cf (en: 'bold one') + - "": [t: "tĂĄo báșĄo hai"] # 0xf530 (en: 'bold two') + - "𝟐": [t: "tĂĄo báșĄo hai"] # 0x1d7d0 (en: 'bold two') + - "": [t: "bold ba"] # 0xf531 (en: 'bold three') + - "𝟑": [t: "bold ba"] # 0x1d7d1 (en: 'bold three') + - "ï”Č": [t: "bold bốn"] # 0xf532 (en: 'bold four') + - "𝟒": [t: "bold bốn"] # 0x1d7d2 (en: 'bold four') + - "ï”ł": [t: "bold năm"] # 0xf533 (en: 'bold five') + - "𝟓": [t: "bold năm"] # 0x1d7d3 (en: 'bold five') + - "": [t: "thứ sĂĄu"] # 0xf534 (en: 'bold six') + - "𝟔": [t: "thứ sĂĄu"] # 0x1d7d4 (en: 'bold six') + - "ï””": [t: "bold seven"] # 0xf535 + - "𝟕": [t: "bold seven"] # 0x1d7d5 + - "": [t: "in đáș­m táșĄi"] # 0xf536 (en: 'bold eight') + - "𝟖": [t: "in đáș­m táșĄi"] # 0x1d7d6 (en: 'bold eight') + - "": [t: "bold nine"] # 0xf537 + - "𝟗": [t: "bold nine"] # 0x1d7d7 + - "": [t: "số khĂŽng"] # 0xf542 (en: 'zero') + - "𝟱": [t: "số khĂŽng"] # 0x1d7e2 (en: 'zero') + - "": [t: "một"] # 0xf543 (en: 'one') + - "𝟣": [t: "một"] # 0x1d7e3 (en: 'one') + - "": [t: "hai"] # 0xf544 (en: 'two') + - "đŸ€": [t: "hai"] # 0x1d7e4 (en: 'two') + - "": [t: "số ba"] # 0xf545 (en: 'three') + - "đŸ„": [t: "số ba"] # 0x1d7e5 (en: 'three') + - "": [t: "bốn"] # 0xf546 (en: 'four') + - "𝟩": [t: "bốn"] # 0x1d7e6 (en: 'four') + - "": [t: "số năm"] # 0xf547 (en: 'five') + - "𝟧": [t: "số năm"] # 0x1d7e7 (en: 'five') + - "": [t: "sĂĄu"] # 0xf548 (en: 'six') + - "𝟹": [t: "sĂĄu"] # 0x1d7e8 (en: 'six') + - "": [t: "báșŁy"] # 0xf549 (en: 'seven') + - "đŸ©": [t: "báșŁy"] # 0x1d7e9 (en: 'seven') + - "": [t: "táșĄi"] # 0xf54a (en: 'eight') + - "đŸȘ": [t: "táșĄi"] # 0x1d7ea (en: 'eight') + - "": [t: "chĂ­n"] # 0xf54b (en: 'nine') + - "đŸ«": [t: "chĂ­n"] # 0x1d7eb (en: 'nine') + - "": [t: "bold zero"] # 0xf54c + - "𝟬": [t: "bold zero"] # 0x1d7ec + - "": [t: "tĂĄo báșĄo"] # 0xf54d (en: 'bold one') + - "𝟭": [t: "tĂĄo báșĄo"] # 0x1d7ed (en: 'bold one') + - "": [t: "tĂĄo báșĄo hai"] # 0xf54e (en: 'bold two') + - "𝟼": [t: "tĂĄo báșĄo hai"] # 0x1d7ee (en: 'bold two') + - "": [t: "bold ba"] # 0xf54f (en: 'bold three') + - "𝟯": [t: "bold ba"] # 0x1d7ef (en: 'bold three') + - "": [t: "bold bốn"] # 0xf550 (en: 'bold four') + - "𝟰": [t: "bold bốn"] # 0x1d7f0 (en: 'bold four') + - "": [t: "bold năm"] # 0xf551 (en: 'bold five') + - "đŸ±": [t: "bold năm"] # 0x1d7f1 (en: 'bold five') + - "": [t: "thứ sĂĄu"] # 0xf552 (en: 'bold six') + - "đŸČ": [t: "thứ sĂĄu"] # 0x1d7f2 (en: 'bold six') + - "": [t: "bold seven"] # 0xf553 + - "𝟳": [t: "bold seven"] # 0x1d7f3 + - "": [t: "in đáș­m táșĄi"] # 0xf554 (en: 'bold eight') + - "𝟮": [t: "in đáș­m táșĄi"] # 0x1d7f4 (en: 'bold eight') + - "": [t: "bold nine"] # 0xf555 + - "đŸ”": [t: "bold nine"] # 0x1d7f5 + - "": [t: "số khĂŽng"] # 0xf556 (en: 'zero') + - "đŸ¶": [t: "số khĂŽng"] # 0x1d7f6 (en: 'zero') + - "": [t: "một"] # 0xf557 (en: 'one') + - "đŸ·": [t: "một"] # 0x1d7f7 (en: 'one') + - "": [t: "hai"] # 0xf558 (en: 'two') + - "𝟾": [t: "hai"] # 0x1d7f8 (en: 'two') + - "": [t: "số ba"] # 0xf559 (en: 'three') + - "đŸč": [t: "số ba"] # 0x1d7f9 (en: 'three') + - "": [t: "bốn"] # 0xf55a (en: 'four') + - "đŸș": [t: "bốn"] # 0x1d7fa (en: 'four') + - "": [t: "số năm"] # 0xf55b (en: 'five') + - "đŸ»": [t: "số năm"] # 0x1d7fb (en: 'five') + - "": [t: "sĂĄu"] # 0xf55c (en: 'six') + - "đŸŒ": [t: "sĂĄu"] # 0x1d7fc (en: 'six') + - "": [t: "báșŁy"] # 0xf55d (en: 'seven') + - "đŸœ": [t: "báșŁy"] # 0x1d7fd (en: 'seven') + - "": [t: "táșĄi"] # 0xf55e (en: 'eight') + - "đŸŸ": [t: "táșĄi"] # 0x1d7fe (en: 'eight') + - "": [t: "chĂ­n"] # 0xf55f (en: 'nine') + - "𝟿": [t: "chĂ­n"] # 0x1d7ff (en: 'nine') + - "": [t: "nhĂąn váș­t chưa biáșżt"] # 0xf700 (en: 'unknown character') + - "": [t: "hĂŹnh tam giĂĄc dưới bĂȘn pháșŁi vĂ  dưới bĂȘn trĂĄi"] # 0xf726 (en: 'lower right and lower left triangles') + - "": [t: "bộ mở rộng hĂŹnh elip ngang"] # 0xf72d (en: 'horizontal ellipsis extender') + - "ïœź": [t: "midline ngang elipsis mở rộng"] # 0xf72e (en: 'midline horizontal ellipsis extender') + - "ïŁ„": [t: "bộ mở rộng triệt để"] # 0xf8e5 (en: 'radical extender') + - "ïŁŠ": [t: "mĂĄy mở rộng mĆ©i tĂȘn dọc"] # 0xf8e6 (en: 'vertical arrow extender') + - "ïŁ§": [t: "mĂĄy mở rộng mĆ©i tĂȘn ngang"] # 0xf8e7 (en: 'horizontal arrow extender') + - "ïŁš": [t: "đăng kĂœ kĂœ sans serif"] # 0xf8e8 (en: 'registered sign sans serif') + - "ïŁ©": [t: "dáș„u hiệu báșŁn quyền sans serif"] # 0xf8e9 (en: 'copyright sign sans serif') + - "ïŁȘ": [t: "dáș„u thÆ°ÆĄng máșĄi dáș„u hiệu sans serif"] # 0xf8ea (en: 'trade mark sign sans serif') + - "ïŁ«": [t: "dáș„u ngoáș·c Ä‘ÆĄn hĂ ng đáș§u"] # 0xf8eb (en: 'left paren top') + - "ïŁŹ": [t: "pháș§n mở rộng dáș„u ngoáș·c Ä‘ÆĄn"] # 0xf8ec (en: 'left paren extender') + - "ïŁ­": [t: "dáș„u ngoáș·c Ä‘ÆĄn phĂ­a dưới"] # 0xf8ed (en: 'left paren bottom') + - "ïŁź": [t: "chĂąn trĂĄi trĂȘn cĂčng"] # 0xf8ee (en: 'left bracket top') + - "ïŁŻ": [t: "bộ mở rộng khung trĂĄi"] # 0xf8ef (en: 'left bracket extender') + - "ïŁ°": [t: "đáy khung trĂĄi"] # 0xf8f0 (en: 'left bracket bottom') + - "ïŁ±": [t: "bĂȘn trĂĄi náșčp trĂȘn cĂčng"] # 0xf8f1 (en: 'left brace top') + - "ïŁČ": [t: "náșčp trĂĄi giữa"] # 0xf8f2 (en: 'left brace mid') + - "ïŁł": [t: "máș·t trĂĄi phĂ­a dưới"] # 0xf8f3 (en: 'left brace bottom') + - "ïŁŽ": [t: "niềng mở rộng"] # 0xf8f4 (en: 'brace extender') + - "ïŁ”": [t: "tĂ­ch hợp mở rộng"] # 0xf8f5 (en: 'integral extender') + - "ïŁ¶": [t: "dáș„u ngoáș·c Ä‘ÆĄn bĂȘn pháșŁi"] # 0xf8f6 (en: 'right paren top') + - "ïŁ·": [t: "dáș„u ngoáș·c Ä‘ÆĄn bĂȘn pháșŁi"] # 0xf8f7 (en: 'right paren extender') + - "ïŁž": [t: "dáș„u ngoáș·c Ä‘ÆĄn bĂȘn dưới"] # 0xf8f8 (en: 'right paren bottom') + - "ïŁč": [t: "giĂĄ đụ bĂȘn pháșŁi"] # 0xf8f9 (en: 'right bracket top') + - "ïŁș": [t: "bộ mở rộng khung pháșŁi"] # 0xf8fa (en: 'right bracket extender') + - "ïŁ»": [t: "đáy khung bĂȘn pháșŁi"] # 0xf8fb (en: 'right bracket bottom') + - "ïŁŒ": [t: "đóng tay pháșŁi"] # 0xf8fc (en: 'right brace top') + - "ïŁœ": [t: "náșčp pháșŁi giữa"] # 0xf8fd (en: 'right brace mid') + - "ïŁŸ": [t: "đáy giáș±ng bĂȘn pháșŁi"] # 0xf8fe (en: 'right brace bottom') + - "ïŁż": [t: "logo apple"] # 0xf8ff (en: 'apple logo') + - "ïŹ€": [t: "ff"] # 0xfb00 + - "ïŹ": [t: "fi"] # 0xfb01 + - "ïŹ‚": [t: "fl"] # 0xfb02 + - "ïŹƒ": [t: "ffi"] # 0xfb03 + - "ïŹ„": [t: "ffl"] # 0xfb04 + - "ïŹ…": [t: "ft"] # 0xfb05 + - "ïŹ†": [t: "st"] # 0xfb06 + - "ïž ": [t: "ligature trĂĄi một ná»­a tĂŽ điểm"] # 0xfe20 (en: 'ligature left half embellishment') + - "ïžĄ": [t: "ligature bĂȘn pháșŁi một ná»­a tĂŽ điểm"] # 0xfe21 (en: 'ligature right half embellishment') + - "ïžą": [t: "double tilde để láșĄi một ná»­a tĂŽ điểm"] # 0xfe22 (en: 'double tilde left half embellishment') + - "ïžŁ": [t: "double tilde pháșŁi ná»­a chỉnh trang"] # 0xfe23 (en: 'double tilde right half embellishment') + - "": [t: "macron để láșĄi một ná»­a tĂŽ điểm"] # 0xfe24 (en: 'macron left half embellishment') + - "ïž„": [t: "macron pháșŁi ná»­a chỉnh trang"] # 0xfe25 (en: 'macron right half embellishment') + - "": [t: "tinh chỉnh macron liĂȘn káșżt"] # 0xfe26 (en: 'conjoining macron embellishment') + - "ïž”": [t: "trĂȘn dáș„u ngoáș·c Ä‘ÆĄn"] # 0xfe35 (en: 'over paren') + - "ïž¶": [t: "dưới dáș„u ngoáș·c Ä‘ÆĄn"] # 0xfe36 (en: 'under paren') + - "ïž·": [t: "qua náșčp"] # 0xfe37 (en: 'over brace') + - "ïžž": [t: "dưới náșčp"] # 0xfe38 (en: 'under brace') + - "ïžż": [t: "trĂȘn khung gĂłc"] # 0xfe3f (en: 'over angle bracket') + - "ïč€": [t: "dưới khung gĂłc"] # 0xfe40 (en: 'under angle bracket') + - "ïčš": [t: "phĂąn chia số nguyĂȘn"] # 0xfe68 (en: 'integer divide') + - "ïżŒ": [t: "đối tÆ°á»Łng khĂŽng xĂĄc định hoáș·c thiáșżu"] # 0xfffc (en: 'unknown or missing object') + - "ïżœ": [t: "nhĂąn váș­t khĂŽng rĂ” hoáș·c thiáșżu"] # 0xfffd (en: 'unknown or missing character') diff --git a/Rules/Languages/vi/unicode.yaml b/Rules/Languages/vi/unicode.yaml index 95835bec3..6dfa9184e 100644 --- a/Rules/Languages/vi/unicode.yaml +++ b/Rules/Languages/vi/unicode.yaml @@ -1,518 +1,518 @@ ---- - - "a-z": [T: "."] - - - "A-Z": - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - pitch: - value: "$CapitalLetters_Pitch" - # note: processing of ranges converts '.' into the character, so it needs to be in quotes below - replace: [spell: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness' and $Verbosity='Verbose'" - then: [t: "hoa"] - else: [x: "$SpeechOverrides_CapitalLetters"] - - - "0-9": [T: "."] - - - " ": [t: " "] # 0x20 - - - "!": [T: giai thừa] # 0x21 - - "\"": [T: nhĂĄy kĂ©p] # 0x22 - - "#": [T: bĂĄo số] # 0x23 - - "$": [T: đî-la] # 0x24 - - "%": [T: pháș§n trăm] # 0x25 - - "&": [T: vĂ ] # 0x26 - - "'": [T: nhĂĄy Ä‘ÆĄn] # 0x27 - - "(": # 0x28 - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [test: {if: "$Verbosity='Terse'", then: [T: mở ngoáș·c], else: [T: mở ngoáș·c Ä‘ÆĄn]}] - else: [T: mở ngoáș·c Ä‘ÆĄn] - - ")": # 0x29 - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [test: {if: "$Verbosity='Terse'", then: [T: đóng ngoáș·c], else: [T: đóng ngoáș·c Ä‘ÆĄn]}] - else: [T: đóng ngoáș·c Ä‘ÆĄn] - - - "*": [T: nhĂąn] # 0x2a - - "+": [T: cộng] # 0x2b - - ",": # 0x2c - # the following deals with the interaction of "," with "
" which sometimes wants the ',' to be silent - # that this test is here and not with "
" is not ideal, but seems simplest - test: - if: - - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or " - # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' - # speak "comma" when not adjacent to '
' - - "( following-sibling::*[1][text()!= '
'] and preceding-sibling::*[1][text()!='
'] ) or " - # except if expression starts with '
' - - " ../*[1][.='
'] " - then: [T: pháș©y] - # else silent - - - "-": [T: trừ] # 0x2d - - ".": # 0x2e - - test: - if: "parent::*[1][self::m:mn]" - then: [T: "cháș„m"] - else: [T: "cháș„m"] - - "/": [T: chia] # 0x2f - - ":": [T: hai cháș„m] # 0x3a - - ";": [T: cháș„m pháș©y] # 0x3b - - "<": # 0x3c - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] - - T: nhỏ hÆĄn - - "=": [T: báș±ng] # 0x3d - - ">": # 0x3e - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] - - T: lớn hÆĄn - - "?": [T: cháș„m hỏi] # 0x3f - - "@": [T: a mĂłc] # 0x40 - - "[": # 0x5b - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: mở ngoáș·c vuĂŽng] - else: [T: ngoáș·c vuĂŽng trĂĄi] - - "\\": [T: hiệu] # 0x5c - - "]": # 0x5d - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: đóng ngoáș·c vuĂŽng] - else: [T: ngoáș·c vuĂŽng pháșŁi] - - "^": [T: mĆ©] # 0x5e - - "_": [T: gáșĄch dưới] # 0x5f - - "`": [T: dáș„u huyền] # 0x60 - - "{": # 0x7b - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: mở ngoáș·c nhọn] - else: [T: ngoáș·c nhọn trĂĄi] - - "|": # 0x7c - # note: for ClearSpeak and SimpleSpeak, "|" in side of sets is handled at the mrow level, same for 'sets' - - with: - variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) - replace: - - test: - - if: "$SpeechStyle != 'ClearSpeak'" - then_test: - - if: "$DefaultToGiven" - then: [T: sao cho] # given - - else_if: "preceding-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))] and - following-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))]" - then: [T: sao cho] # divides - else: [T: gáșĄch đứng] # vertical line - - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" - then: [T: gáșĄch đứng] - - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" - then: [T: sao cho] # such that - - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" - then: [T: sao cho] # given - - else: [T: sao cho] # divides - - - "}": # 0x7d - - test: - if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' - then: [T: đóng ngoáș·c nhọn] - else: [T: ngoáș·c nhọn pháșŁi] - - - "~": [T: dáș„u ngĂŁ] # 0x7e - - " ": [T: ""] # 0xa0 - - "Âą": [T: cents] # 0xa2 - - "ÂŁ": [T: báșŁng Anh] # 0xa3 - - "ÂŹ": [T: khĂŽng] # 0xac - - "°": [T: "độ"] # 0xb0 - - "±": [T: cộng trừ] # 0xb1 - - "ÂŽ": [T: "dáș„u nhĂĄy Ä‘ÆĄn"] # 0xb4 - - "·": - - test: - if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolDot = 'Auto'" - then: [T: nhĂąn] - else: [T: cháș„m] - - "×": # 0xd7 - - test: - if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolX = 'Auto'" - then: [T: nhĂąn] - else_test: - if: $ClearSpeak_MultSymbolX = 'By' - then: [T: cho] - else: [T: nhĂąn] - - "Ă·": [T: chia] # 0xf7 - - "̀": [T: dáș„u huyền] # 0x300 - - "́": [T: dáș„u sáșŻc embellishment] # 0x301 - - "̂": [T: dáș„u mĆ© embellishment] # 0x302 - - "̃": [T: dáș„u ngĂŁ] # 0x303 - - "̄": [T: dáș„u nháș„n] # 0x304 - - "̅": [T: thanh ngang] # 0x305 - - "̆": [T: mĆ© ngÆ°á»Łc] # 0x306 - - "̇": [T: dot above embellishment] # 0x307 - - # Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong - - "Α-Ω": - - test: - if: "$CapitalLetters_Beep" - then: - - audio: - value: "beep.mp4" - replace: [] - - pitch: - value: "$CapitalLetters_Pitch" - # note: processing of ranges converts '.' into the character, so it needs to be in quotes below - replace: [spell: "translate('.', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')"] - - test: - if: "$CapitalLetters_UseWord" - then_test: - if: "$SpeechOverrides_CapitalLetters = ''" - then_test: - if: "$Impairment = 'Blindness'" - then: [t: "hoa"] - else: [x: "$SpeechOverrides_CapitalLetters"] - - - "α": [T: an pha] # 0x3b1 - - "ÎČ": [T: bĂȘ ta] # 0x3b2 - - "Îł": [T: gam ma] # 0x3b3 - - "ÎŽ": [T: đen ta] # 0x3b4 - - "Δ": [T: Ă©p si lon] # 0x3b5 - - "ζ": [T: dĂȘ ta] # 0x3b6 - - "η": [T: ĂȘ ta] # 0x3b7 - - "Ξ": [T: tĂȘ ta] # 0x3b8 - - "Îč": [T: i ĂŽ ta] # 0x3b9 - - "Îș": [T: k pa] # 0x3ba - - "λ": [T: lam đa] # 0x3bb - - "ÎŒ": [T: mu] # 0x3bc - - "Μ": [T: nu] # 0x3bd - - "Ο": [T: xi] # 0x3be - - "Îż": [T: o mi rong] # 0x3bf - - "π": [T: pi] # 0x3c0 - - "ρ": [T: rĂŽ] # 0x3c1 - - "ς": [T: xĂ­ch ma cuối] # 0x3c2 - - "σ": [T: xĂ­ch ma] # 0x3c3 - - "τ": [T: tĂŽ] # 0x3c4 - - "υ": [T: áș„p si lon] # 0x3c5 - - "φ": [T: phi] # 0x3c6 - - "χ": [T: cai] # 0x3c7 - - "ψ": [T: bờ si] # 0x3c8 - - "ω": [T: ĂŽ mĂȘ ga] # 0x3c9 - - "ϕ": [T: phi] # 0x3d5 - - "ϖ": [T: pi] # 0x3d6 - - "Ï”": [T: Ă©p si lon] # 0x3f5 - - "϶": [T: Ă©p si lon đáșŁo ngÆ°á»Łc] # 0x3f6 - - "ℂ": # 0x2102 - - T: C - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: "hoa"] - - T: gáșĄch đîi - - "℃": [T: độ C] # 0x2103 - - "ℋ": # 0x210b - - T: h - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: "hoa"] - - T: viáșżt tay - - - "ℕ": # 0x2115 - - T: n - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: "hoa"] - - T: gáșĄch đîi - - "ℚ": # 0x211a - - T: q - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: "hoa"] - - T: gáșĄch đîi - - "ℛ": # 0x211b - - T: r - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: "hoa"] - - T: viáșżt tay - - "ℜ": # 0x211c - - T: r - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: "hoa"] - - T: kiểu chữ tiáșżng Đức - - "ℝ": # 0x211d - - T: r - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: "hoa"] - - T: gáșĄch đîi - - "â„€": # 0x2124 - - T: z - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: "hoa"] - - T: gáșĄch đîi - - "ⅉ": [T: J nghiĂȘng gáșĄch đîi] # 0x2149 - - "∇": # 0x2207 - - test: - if: "$Verbosity!='Terse'" - then: [t: "cĂĄc"] # (en: 'the') - - t: "độ dốc cá»§a" # (en: 'gradient of') - - # --- restored complex short definitions (prefer over unicode-full) --- - - "А": # 0x410 - - T: a - - test: - if: "($Blind or $Verbosity!='Terse')" - then: [T: "hoa"] - - "
": # 0x2026 - test: - if: - - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" - # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' - # speak '
' as 'and so on...' unless expr starts with '
' - - "../*[1][.='
']" - then: [T: cháș„m cháș„m cháș„m] - else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' - if: "count(following-sibling::*) = 0" - then: [T: vĂ  như tháșż] - else: [T: vĂ  như váș­y cho đáșżn] - - "⁥": # 0x2061 - - test: - # skip saying "of" when Terse and a trig function, when it is a shape (does this happen?), or we are in :literal mode - if: "not( - ( $Verbosity='Terse' or ($SpeechStyle = 'ClearSpeak' and IsNode(following-sibling::*[1],'simple')) and - preceding-sibling::*[1][IfThenElse($SpeechStyle='ClearSpeak', - IsInDefinition(., 'ClearSpeakTrigFunctionNames'), - IsInDefinition(., 'TrigFunctionNames') )] - ) or - preceding-sibling::*[1][IsInDefinition(., 'GeometryShapes')] or - (@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) - )" - then: [T: "cá»§a"] - - "→": # 0x2192 - - test: - if: "ancestor::*[2][self::m:limit]" - then: [T: "tiáșżn đáșżn"] - else: [T: "mĆ©i tĂȘn pháșŁi"] - - "∂": # 0x2202 - - test: - if: "$Verbosity='Terse'" - then: [T: pháș§n] - else: [T: đáșĄo hĂ m riĂȘng] - - "∆": # 0x2206 - # - test: - # if: "$Verbosity!='Terse'" - # then: [T: "the"] - - T: đen ta - - "∈": # 0x2208 - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: [T: lĂ  pháș§n tá»­ cá»§a] - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: thuộc] - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: pháș§n tá»­ cá»§a] - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: pháș§n tá»­ cá»§a] - - else: [T: thuộc về] # $ClearSpeak_SetMemberSymbol = 'Belongs' - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: thuộc] - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: thuộc] - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [T: thuộc] - - else: [T: thuộc] # $ClearSpeak_SetMemberSymbol = 'Belongs' - - "∉": # 0x2209 - # rule is identical to 0x2208 - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: [T: khĂŽng thuộc] - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: khĂŽng thuộc] - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: khĂŽng thuộc] - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: khĂŽng thuộc] - - else: [T: khĂŽng thuộc về] # $ClearSpeak_SetMemberSymbol = 'Belongs' - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: khĂŽng thuộc] - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: khĂŽng thuộc] - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [T: khĂŽng thuộc] - - else: [T: khĂŽng thuộc] # $ClearSpeak_SetMemberSymbol = 'Belongs' - - "∊": # 0x220a - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: [T: thuộc] - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: thuộc] - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: thuộc] - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: thuộc] - - else: [T: thuộc] # $ClearSpeak_SetMemberSymbol = 'Belongs' - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: thuộc] - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [T: thuộc] - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [T: thuộc] - - else: [T: thuộc] # $ClearSpeak_SetMemberSymbol = 'Belongs' - - "√": # 0x221a - # - test: - # if: "$Verbosity!='Terse'" - # then: [T: ""] - - T: căn báș­c 2 cá»§a - - "∝": # 0x221d - # - test: - # if: "$Verbosity!='Terse'" - # then: [T: is] - - T: tỉ lệ với - - "∄": # 0x2225 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] - - T: song song với - - "∊": # 0x2226 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] - - T: khĂŽng song song với - - "∶": # 0x2236 - #- test: - # if: "$Verbosity!='Terse'" - # then: [T: is] - - T: tỉ suáș„t - - "∟": # 0x223e - # - test: - # if: "$Verbosity!='Terse'" - # then: [T: is] - - T: đồng dáșĄng - - "≠": # 0x2260 - - test: - if: "$Verbosity!='Terse'" - then: [T: ""] - - T: khĂĄc - - "≡": # 0x2261 - - test: - if: "$Verbosity!='Terse'" - then: [T: trĂčng với] - - "≀": [T: nhỏ hÆĄn hoáș·c báș±ng] # 0x2264 - #- test: - #if: "$Verbosity!='Terse'" - #then: [T: nhỏ hÆĄn hoáș·c báș±ng] - - "≄": [T: lớn hÆĄn hoáș·c báș±ng] # 0x2265 - #- test: - #if: "$Verbosity!='Terse'" - #then: [T: lớn hÆĄn hoáș·c báș±ng] - - "⊂": [T: chứa trong] # 0x2282 - #- test: - #if: "$Verbosity!='Terse'" - #then: [T: chứa trong] - - "⊃": [T: chứa] # 0x2283 - #- test: - #if: "$Verbosity!='Terse'" - #then: [T: chứa] - - "⊄": # 0x2284 - # - test: - # if: "$Verbosity!='Terse'" - # then: [T: is] - - T: khĂŽng chứa trong - - "⊅": # 0x2285 - # - test: - # if: "$Verbosity!='Terse'" - # then: [T: is] - - T: khĂŽng chứa - - "⊆": [T: chứa trong hoáș·c báș±ng] # 0x2286 - #- test: - #if: "$Verbosity!='Terse'" - #then: [T: chứa trong] - - "⊇": [T: chứa hoáș·c báș±ng] # 0x2287 - #- test: - #if: "$Verbosity!='Terse'" - #then: [T: chứa] - - # --- restored short definitions that differ from unicode-full --- - - "–": [T: gáșĄch nối] # 0x2013 - - "—": [T: gáșĄch ngang] # 0x2014 - - "―": [T: gáșĄch ngang dĂ i] # 0x2015 - - "‖": [T: đường tháșłng đứng kĂ©p] # 0x2016 - - "⁹": [T: ""] # 0x2062 - - "⁣": [T: ""] # 0x2063 - - "⁀": [T: "vĂ "] # 0x2064 - - "â€Č": [T: pháș©y] # 0x2032 - - "″": [T: đáșĄo hĂ m cáș„p hai] # 0x2033 - - "‮": [T: đáșĄo hĂ m cáș„p ba] # 0x2034 - - "—": [T: nguyĂȘn hĂ m] # 0x2035 - - "‶": [T: nguyĂȘn hĂ m cáș„p hai] # 0x2036 - - "‷": [T: nguyĂȘn hĂ m cáș„p ba] # 0x2037 - - "℉": [T: độ F] # 0x2109 - - "ℎ": [T: háș±ng số plankc] # 0x210e - - "ℓ": [T: l viáșżt tay] # 0x2113 - - "℩": [T: ohms] # 0x2126 - - "â„Ș": [T: kelvin] # 0x212a - - "Å": [T: angstroms] # 0x212b - - "ⅆ": [T: D nghiĂȘng gáșĄch đîi] # 0x2146 - - "ⅇ": [T: E nghiĂȘng gáșĄch đîi] # 0x2147 - - "ⅈ": [T: I nghiĂȘng gáșĄch đîi] # 0x2148 - - "←": [T: mĆ©i tĂȘn trĂĄi] # 0x2190 - - "↑": [T: mĆ©i tĂȘn lĂȘn] # 0x2191 - - "↓": [T: mĆ©i tĂȘn xuống] # 0x2193 - - "⇒": [T: suy ra] # 0x21d2 - - "∀": [T: với mọi] # 0x2200 - - "∃": [T: tồn táșĄi Ă­t nháș„t] # 0x2203 - - "∄": [T: khĂŽng tồn táșĄi] # 0x2204 - - "∅": [T: táș­p hợp rỗng] # 0x2205 - - "∏": [T: pi] # 0x220f - - "∐": [T: pi ngÆ°á»Łc] # 0x2210 - - "∑": [T: tổng] # 0x2211 - - "−": [T: trừ] # 0x2212 - - "∓": [T: trừ cộng] # 0x2213 - - "∗": [T: nhĂąn] # 0x2217 - - "∘": [T: hĂ m hợp] # 0x2218 - - "∞": [T: "vĂŽ cá»±c"] # 0x221e - - "∟": [T: gĂłc vuĂŽng] # 0x221f - - "∠": [T: gĂłc] # 0x2220 - - "∥": [T: gĂłc Ä‘Æ°á»Łc đo] # 0x2221 - - "∣": [T: chia háșżt] # 0x2223 - - "∀": [T: khĂŽng chia háșżt] # 0x2224 - - "∧": [T: vĂ ] # 0x2227 - - "√": [T: hoáș·c] # 0x2228 - - "∩": [T: giao] # 0x2229 - - "âˆȘ": [T: hợp] # 0x222a - - "∫": [T: tĂ­ch phĂąn] # 0x222b - - "∏": [T: tĂ­ch phĂąn 2 lớp] # 0x222c - - "∭": [T: tĂ­ch phĂąn 3 lớp] # 0x222d - - "∟": [T: tĂ­ch phĂąn vĂČng] # 0x222e - - "∷": [T: tỉ lệ] # 0x2237 - - "∌": [T: tÆ°ÆĄng tá»± với] # 0x223c - - "∜": [T: dáș„u ngĂŁ ngÆ°á»Łc] # 0x223d - - "∿": [T: hĂŹnh sin] # 0x223f - - "≩": [T: nhỏ hÆĄn hoáș·c báș±ng] # 0x2266 - - "≧": [T: lớn hÆĄn hoáș·c báș±ng] # 0x2267 - - "â‰ș": [T: precedes] # 0x227a - - "≻": [T: succeeds] # 0x227b +--- + - "a-z": [T: "."] + + - "A-Z": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - pitch: + value: "$CapitalLetters_Pitch" + # note: processing of ranges converts '.' into the character, so it needs to be in quotes below + replace: [spell: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness' and $Verbosity='Verbose'" + then: [t: "hoa"] + else: [x: "$SpeechOverrides_CapitalLetters"] + + - "0-9": [T: "."] + + - " ": [t: " "] # 0x20 + + - "!": [T: giai thừa] # 0x21 + - "\"": [T: nhĂĄy kĂ©p] # 0x22 + - "#": [T: bĂĄo số] # 0x23 + - "$": [T: đî-la] # 0x24 + - "%": [T: pháș§n trăm] # 0x25 + - "&": [T: vĂ ] # 0x26 + - "'": [T: nhĂĄy Ä‘ÆĄn] # 0x27 + - "(": # 0x28 + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [test: {if: "$Verbosity='Terse'", then: [T: mở ngoáș·c], else: [T: mở ngoáș·c Ä‘ÆĄn]}] + else: [T: mở ngoáș·c Ä‘ÆĄn] + - ")": # 0x29 + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [test: {if: "$Verbosity='Terse'", then: [T: đóng ngoáș·c], else: [T: đóng ngoáș·c Ä‘ÆĄn]}] + else: [T: đóng ngoáș·c Ä‘ÆĄn] + + - "*": [T: nhĂąn] # 0x2a + - "+": [T: cộng] # 0x2b + - ",": # 0x2c + # the following deals with the interaction of "," with "
" which sometimes wants the ',' to be silent + # that this test is here and not with "
" is not ideal, but seems simplest + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or " + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak "comma" when not adjacent to '
' + - "( following-sibling::*[1][text()!= '
'] and preceding-sibling::*[1][text()!='
'] ) or " + # except if expression starts with '
' + - " ../*[1][.='
'] " + then: [T: pháș©y] + # else silent + + - "-": [T: trừ] # 0x2d + - ".": # 0x2e + - test: + if: "parent::*[1][self::m:mn]" + then: [T: "cháș„m"] + else: [T: "cháș„m"] + - "/": [T: chia] # 0x2f + - ":": [T: hai cháș„m] # 0x3a + - ";": [T: cháș„m pháș©y] # 0x3b + - "<": # 0x3c + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] + - T: nhỏ hÆĄn + - "=": [T: báș±ng] # 0x3d + - ">": # 0x3e + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] + - T: lớn hÆĄn + - "?": [T: cháș„m hỏi] # 0x3f + - "@": [T: a mĂłc] # 0x40 + - "[": # 0x5b + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: mở ngoáș·c vuĂŽng] + else: [T: ngoáș·c vuĂŽng trĂĄi] + - "\\": [T: hiệu] # 0x5c + - "]": # 0x5d + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: đóng ngoáș·c vuĂŽng] + else: [T: ngoáș·c vuĂŽng pháșŁi] + - "^": [T: mĆ©] # 0x5e + - "_": [T: gáșĄch dưới] # 0x5f + - "`": [T: dáș„u huyền] # 0x60 + - "{": # 0x7b + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: mở ngoáș·c nhọn] + else: [T: ngoáș·c nhọn trĂĄi] + - "|": # 0x7c + # note: for ClearSpeak and SimpleSpeak, "|" in side of sets is handled at the mrow level, same for 'sets' + - with: + variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) + replace: + - test: + - if: "$SpeechStyle != 'ClearSpeak'" + then_test: + - if: "$DefaultToGiven" + then: [T: sao cho] # given + - else_if: "preceding-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))] and + following-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))]" + then: [T: sao cho] # divides + else: [T: gáșĄch đứng] # vertical line + - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" + then: [T: gáșĄch đứng] + - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" + then: [T: sao cho] # such that + - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" + then: [T: sao cho] # given + - else: [T: sao cho] # divides + + - "}": # 0x7d + - test: + if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' + then: [T: đóng ngoáș·c nhọn] + else: [T: ngoáș·c nhọn pháșŁi] + + - "~": [T: dáș„u ngĂŁ] # 0x7e + - " ": [T: ""] # 0xa0 + - "Âą": [T: cents] # 0xa2 + - "ÂŁ": [T: báșŁng Anh] # 0xa3 + - "ÂŹ": [T: khĂŽng] # 0xac + - "°": [T: "độ"] # 0xb0 + - "±": [T: cộng trừ] # 0xb1 + - "ÂŽ": [T: "dáș„u nhĂĄy Ä‘ÆĄn"] # 0xb4 + - "·": + - test: + if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolDot = 'Auto'" + then: [T: nhĂąn] + else: [T: cháș„m] + - "×": # 0xd7 + - test: + if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolX = 'Auto'" + then: [T: nhĂąn] + else_test: + if: $ClearSpeak_MultSymbolX = 'By' + then: [T: cho] + else: [T: nhĂąn] + - "Ă·": [T: chia] # 0xf7 + - "̀": [T: dáș„u huyền] # 0x300 + - "́": [T: dáș„u sáșŻc embellishment] # 0x301 + - "̂": [T: dáș„u mĆ© embellishment] # 0x302 + - "̃": [T: dáș„u ngĂŁ] # 0x303 + - "̄": [T: dáș„u nháș„n] # 0x304 + - "̅": [T: thanh ngang] # 0x305 + - "̆": [T: mĆ© ngÆ°á»Łc] # 0x306 + - "̇": [T: dot above embellishment] # 0x307 + + # Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong + - "Α-Ω": + - test: + if: "$CapitalLetters_Beep" + then: + - audio: + value: "beep.mp4" + replace: [] + - pitch: + value: "$CapitalLetters_Pitch" + # note: processing of ranges converts '.' into the character, so it needs to be in quotes below + replace: [spell: "translate('.', 'Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎÎžÎŸÎ ÎĄÎąÎŁÎ€Î„ÎŠÎ§ÎšÎ©', 'αÎČγΎΔζηΞÎčÎșÎ»ÎŒÎœÎŸÎżÏ€ÏÏ‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰')"] + - test: + if: "$CapitalLetters_UseWord" + then_test: + if: "$SpeechOverrides_CapitalLetters = ''" + then_test: + if: "$Impairment = 'Blindness'" + then: [t: "hoa"] + else: [x: "$SpeechOverrides_CapitalLetters"] + + - "α": [T: an pha] # 0x3b1 + - "ÎČ": [T: bĂȘ ta] # 0x3b2 + - "Îł": [T: gam ma] # 0x3b3 + - "ÎŽ": [T: đen ta] # 0x3b4 + - "Δ": [T: Ă©p si lon] # 0x3b5 + - "ζ": [T: dĂȘ ta] # 0x3b6 + - "η": [T: ĂȘ ta] # 0x3b7 + - "Ξ": [T: tĂȘ ta] # 0x3b8 + - "Îč": [T: i ĂŽ ta] # 0x3b9 + - "Îș": [T: k pa] # 0x3ba + - "λ": [T: lam đa] # 0x3bb + - "ÎŒ": [T: mu] # 0x3bc + - "Μ": [T: nu] # 0x3bd + - "Ο": [T: xi] # 0x3be + - "Îż": [T: o mi rong] # 0x3bf + - "π": [T: pi] # 0x3c0 + - "ρ": [T: rĂŽ] # 0x3c1 + - "ς": [T: xĂ­ch ma cuối] # 0x3c2 + - "σ": [T: xĂ­ch ma] # 0x3c3 + - "τ": [T: tĂŽ] # 0x3c4 + - "υ": [T: áș„p si lon] # 0x3c5 + - "φ": [T: phi] # 0x3c6 + - "χ": [T: cai] # 0x3c7 + - "ψ": [T: bờ si] # 0x3c8 + - "ω": [T: ĂŽ mĂȘ ga] # 0x3c9 + - "ϕ": [T: phi] # 0x3d5 + - "ϖ": [T: pi] # 0x3d6 + - "Ï”": [T: Ă©p si lon] # 0x3f5 + - "϶": [T: Ă©p si lon đáșŁo ngÆ°á»Łc] # 0x3f6 + - "ℂ": # 0x2102 + - T: C + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: "hoa"] + - T: gáșĄch đîi + - "℃": [T: độ C] # 0x2103 + - "ℋ": # 0x210b + - T: h + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: "hoa"] + - T: viáșżt tay + + - "ℕ": # 0x2115 + - T: n + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: "hoa"] + - T: gáșĄch đîi + - "ℚ": # 0x211a + - T: q + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: "hoa"] + - T: gáșĄch đîi + - "ℛ": # 0x211b + - T: r + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: "hoa"] + - T: viáșżt tay + - "ℜ": # 0x211c + - T: r + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: "hoa"] + - T: kiểu chữ tiáșżng Đức + - "ℝ": # 0x211d + - T: r + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: "hoa"] + - T: gáșĄch đîi + - "â„€": # 0x2124 + - T: z + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: "hoa"] + - T: gáșĄch đîi + - "ⅉ": [T: J nghiĂȘng gáșĄch đîi] # 0x2149 + - "∇": # 0x2207 + - test: + if: "$Verbosity!='Terse'" + then: [t: "cĂĄc"] # (en: 'the') + - t: "độ dốc cá»§a" # (en: 'gradient of') + + # --- restored complex short definitions (prefer over unicode-full) --- + - "А": # 0x410 + - T: a + - test: + if: "($Blind or $Verbosity!='Terse')" + then: [T: "hoa"] + - "
": # 0x2026 + test: + if: + - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or" + # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' + # speak '
' as 'and so on...' unless expr starts with '
' + - "../*[1][.='
']" + then: [T: cháș„m cháș„m cháș„m] + else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' + if: "count(following-sibling::*) = 0" + then: [T: vĂ  như tháșż] + else: [T: vĂ  như váș­y cho đáșżn] + - "⁥": # 0x2061 + - test: + # skip saying "of" when Terse and a trig function, when it is a shape (does this happen?), or we are in :literal mode + if: "not( + ( $Verbosity='Terse' or ($SpeechStyle = 'ClearSpeak' and IsNode(following-sibling::*[1],'simple')) and + preceding-sibling::*[1][IfThenElse($SpeechStyle='ClearSpeak', + IsInDefinition(., 'ClearSpeakTrigFunctionNames'), + IsInDefinition(., 'TrigFunctionNames') )] + ) or + preceding-sibling::*[1][IsInDefinition(., 'GeometryShapes')] or + (@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) + )" + then: [T: "cá»§a"] + - "→": # 0x2192 + - test: + if: "ancestor::*[2][self::m:limit]" + then: [T: "tiáșżn đáșżn"] + else: [T: "mĆ©i tĂȘn pháșŁi"] + - "∂": # 0x2202 + - test: + if: "$Verbosity='Terse'" + then: [T: pháș§n] + else: [T: đáșĄo hĂ m riĂȘng] + - "∆": # 0x2206 + # - test: + # if: "$Verbosity!='Terse'" + # then: [T: "the"] + - T: đen ta + - "∈": # 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: [T: lĂ  pháș§n tá»­ cá»§a] + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: thuộc] + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: pháș§n tá»­ cá»§a] + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: pháș§n tá»­ cá»§a] + - else: [T: thuộc về] # $ClearSpeak_SetMemberSymbol = 'Belongs' + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: thuộc] + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: thuộc] + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: thuộc] + - else: [T: thuộc] # $ClearSpeak_SetMemberSymbol = 'Belongs' + - "∉": # 0x2209 + # rule is identical to 0x2208 + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: [T: khĂŽng thuộc] + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: khĂŽng thuộc] + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: khĂŽng thuộc] + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: khĂŽng thuộc] + - else: [T: khĂŽng thuộc về] # $ClearSpeak_SetMemberSymbol = 'Belongs' + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: khĂŽng thuộc] + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: khĂŽng thuộc] + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: khĂŽng thuộc] + - else: [T: khĂŽng thuộc] # $ClearSpeak_SetMemberSymbol = 'Belongs' + - "∊": # 0x220a + - test: + if: "$SpeechStyle != 'ClearSpeak'" + then: [T: thuộc] + # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + else_test: + if: "../../self::m:set or ../../../self::m:set" # inside a set + then_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' + then: [T: thuộc] + - else_if: $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: thuộc] + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: thuộc] + - else: [T: thuộc] # $ClearSpeak_SetMemberSymbol = 'Belongs' + else_test: + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' + then: [T: thuộc] + - else_if: $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: thuộc] + - else_if: $ClearSpeak_SetMemberSymbol = 'In' + then: [T: thuộc] + - else: [T: thuộc] # $ClearSpeak_SetMemberSymbol = 'Belongs' + - "√": # 0x221a + # - test: + # if: "$Verbosity!='Terse'" + # then: [T: ""] + - T: căn báș­c 2 cá»§a + - "∝": # 0x221d + # - test: + # if: "$Verbosity!='Terse'" + # then: [T: is] + - T: tỉ lệ với + - "∄": # 0x2225 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] + - T: song song với + - "∊": # 0x2226 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] + - T: khĂŽng song song với + - "∶": # 0x2236 + #- test: + # if: "$Verbosity!='Terse'" + # then: [T: is] + - T: tỉ suáș„t + - "∟": # 0x223e + # - test: + # if: "$Verbosity!='Terse'" + # then: [T: is] + - T: đồng dáșĄng + - "≠": # 0x2260 + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] + - T: khĂĄc + - "≡": # 0x2261 + - test: + if: "$Verbosity!='Terse'" + then: [T: trĂčng với] + - "≀": [T: nhỏ hÆĄn hoáș·c báș±ng] # 0x2264 + #- test: + #if: "$Verbosity!='Terse'" + #then: [T: nhỏ hÆĄn hoáș·c báș±ng] + - "≄": [T: lớn hÆĄn hoáș·c báș±ng] # 0x2265 + #- test: + #if: "$Verbosity!='Terse'" + #then: [T: lớn hÆĄn hoáș·c báș±ng] + - "⊂": [T: chứa trong] # 0x2282 + #- test: + #if: "$Verbosity!='Terse'" + #then: [T: chứa trong] + - "⊃": [T: chứa] # 0x2283 + #- test: + #if: "$Verbosity!='Terse'" + #then: [T: chứa] + - "⊄": # 0x2284 + # - test: + # if: "$Verbosity!='Terse'" + # then: [T: is] + - T: khĂŽng chứa trong + - "⊅": # 0x2285 + # - test: + # if: "$Verbosity!='Terse'" + # then: [T: is] + - T: khĂŽng chứa + - "⊆": [T: chứa trong hoáș·c báș±ng] # 0x2286 + #- test: + #if: "$Verbosity!='Terse'" + #then: [T: chứa trong] + - "⊇": [T: chứa hoáș·c báș±ng] # 0x2287 + #- test: + #if: "$Verbosity!='Terse'" + #then: [T: chứa] + + # --- restored short definitions that differ from unicode-full --- + - "–": [T: gáșĄch nối] # 0x2013 + - "—": [T: gáșĄch ngang] # 0x2014 + - "―": [T: gáșĄch ngang dĂ i] # 0x2015 + - "‖": [T: đường tháșłng đứng kĂ©p] # 0x2016 + - "⁹": [T: ""] # 0x2062 + - "⁣": [T: ""] # 0x2063 + - "⁀": [T: "vĂ "] # 0x2064 + - "â€Č": [T: pháș©y] # 0x2032 + - "″": [T: đáșĄo hĂ m cáș„p hai] # 0x2033 + - "‮": [T: đáșĄo hĂ m cáș„p ba] # 0x2034 + - "—": [T: nguyĂȘn hĂ m] # 0x2035 + - "‶": [T: nguyĂȘn hĂ m cáș„p hai] # 0x2036 + - "‷": [T: nguyĂȘn hĂ m cáș„p ba] # 0x2037 + - "℉": [T: độ F] # 0x2109 + - "ℎ": [T: háș±ng số plankc] # 0x210e + - "ℓ": [T: l viáșżt tay] # 0x2113 + - "℩": [T: ohms] # 0x2126 + - "â„Ș": [T: kelvin] # 0x212a + - "Å": [T: angstroms] # 0x212b + - "ⅆ": [T: D nghiĂȘng gáșĄch đîi] # 0x2146 + - "ⅇ": [T: E nghiĂȘng gáșĄch đîi] # 0x2147 + - "ⅈ": [T: I nghiĂȘng gáșĄch đîi] # 0x2148 + - "←": [T: mĆ©i tĂȘn trĂĄi] # 0x2190 + - "↑": [T: mĆ©i tĂȘn lĂȘn] # 0x2191 + - "↓": [T: mĆ©i tĂȘn xuống] # 0x2193 + - "⇒": [T: suy ra] # 0x21d2 + - "∀": [T: với mọi] # 0x2200 + - "∃": [T: tồn táșĄi Ă­t nháș„t] # 0x2203 + - "∄": [T: khĂŽng tồn táșĄi] # 0x2204 + - "∅": [T: táș­p hợp rỗng] # 0x2205 + - "∏": [T: pi] # 0x220f + - "∐": [T: pi ngÆ°á»Łc] # 0x2210 + - "∑": [T: tổng] # 0x2211 + - "−": [T: trừ] # 0x2212 + - "∓": [T: trừ cộng] # 0x2213 + - "∗": [T: nhĂąn] # 0x2217 + - "∘": [T: hĂ m hợp] # 0x2218 + - "∞": [T: "vĂŽ cá»±c"] # 0x221e + - "∟": [T: gĂłc vuĂŽng] # 0x221f + - "∠": [T: gĂłc] # 0x2220 + - "∥": [T: gĂłc Ä‘Æ°á»Łc đo] # 0x2221 + - "∣": [T: chia háșżt] # 0x2223 + - "∀": [T: khĂŽng chia háșżt] # 0x2224 + - "∧": [T: vĂ ] # 0x2227 + - "√": [T: hoáș·c] # 0x2228 + - "∩": [T: giao] # 0x2229 + - "âˆȘ": [T: hợp] # 0x222a + - "∫": [T: tĂ­ch phĂąn] # 0x222b + - "∏": [T: tĂ­ch phĂąn 2 lớp] # 0x222c + - "∭": [T: tĂ­ch phĂąn 3 lớp] # 0x222d + - "∟": [T: tĂ­ch phĂąn vĂČng] # 0x222e + - "∷": [T: tỉ lệ] # 0x2237 + - "∌": [T: tÆ°ÆĄng tá»± với] # 0x223c + - "∜": [T: dáș„u ngĂŁ ngÆ°á»Łc] # 0x223d + - "∿": [T: hĂŹnh sin] # 0x223f + - "≩": [T: nhỏ hÆĄn hoáș·c báș±ng] # 0x2266 + - "≧": [T: lớn hÆĄn hoáș·c báș±ng] # 0x2267 + - "â‰ș": [T: precedes] # 0x227a + - "≻": [T: succeeds] # 0x227b From 18f1cf960e0b1b0d77fb0ce4d4d757060288d317 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Thu, 1 Oct 2026 18:35:19 +0200 Subject: [PATCH 152/162] Create rule coverage functionality (#834) (#845) * v1 of rule coverage report * Add Python script to generate Markdown and HTML rule coverage reports * clarify name of logfiles * Switch rule coverage events to JSONL format * switch to jinja2 templates * Exclude Unicode mapping files from rule coverage report and improve report generation * Exclude definition files from rule coverage report and update related documentation * Add hit counts and test details to rule coverage report Enhance the rule coverage report to include hit counts, test details, and hoverable tooltips for matched rules. Improve report formatting and coverage fraction calculation. Update related tests and documentation to reflect these changes. * fix title * Simplify rule coverage event recording * Stream rule coverage events and trim unused report fields * Suppress unused variable warning when `rule-coverage` feature is disabled * Migrate `rule_coverage` implementation to a dedicated `rulecoverage` package, separating logic, templates, and CLI. * uv run ruff format * simplify dataclasses in Python * remove "loaded" as statistic for rule coverage * remove MD report and only keep HTML. simplify rest accordingly. * uv ruff format --- Cargo.lock | 26 +++ Cargo.toml | 2 + PythonScripts/README.md | 9 + PythonScripts/audit_translations/README.md | 3 + PythonScripts/audit_translations/cli.py | 13 +- .../rulecoverage/__init__.py | 1 + .../rulecoverage/rule_coverage.html | 93 +++++++++++ .../rulecoverage/rule_coverage.py | 116 +++++++++++++ .../rulecoverage/rule_coverage_report.py | 66 ++++++++ .../tests/test_rule_coverage_cli.py | 156 ++++++++++++++++++ PythonScripts/pyproject.toml | 1 + PythonScripts/uv.lock | 44 +++++ src/lib.rs | 2 + src/rule_coverage.rs | 58 +++++++ src/speech.rs | 12 ++ 15 files changed, 600 insertions(+), 2 deletions(-) create mode 100644 PythonScripts/audit_translations/rulecoverage/__init__.py create mode 100644 PythonScripts/audit_translations/rulecoverage/rule_coverage.html create mode 100644 PythonScripts/audit_translations/rulecoverage/rule_coverage.py create mode 100644 PythonScripts/audit_translations/rulecoverage/rule_coverage_report.py create mode 100644 PythonScripts/audit_translations/tests/test_rule_coverage_cli.py create mode 100644 src/rule_coverage.rs diff --git a/Cargo.lock b/Cargo.lock index 529029471..66743aed7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -651,6 +651,12 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + [[package]] name = "jiff" version = "0.2.20" @@ -805,6 +811,7 @@ dependencies = [ "radix_fmt", "regex", "roman-numerals-rs", + "serde_json", "strum", "sxd-document-no-unsafe", "sxd-xpath-no-unsafe", @@ -1362,6 +1369,19 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + [[package]] name = "shlex" version = "2.0.1" @@ -2074,6 +2094,12 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7948af682ccbc3342b6e9420e8c51c1fe5d7bf7756002b4a3c6cabfe96a7e3c" +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + [[package]] name = "zopfli" version = "0.8.3" diff --git a/Cargo.toml b/Cargo.toml index e07193031..a51507536 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ exclude = ["src/main.rs", "docs", "BrailleDocs", "PythonScripts"] # should ha [features] +"rule-coverage" = ["dep:serde_json"] "include-zip" = [] "enable-logs" = ["android_logger"] "tts" = [ "natural-tts" ] @@ -38,6 +39,7 @@ cfg-if = "1.0.1" fastrand = { version = "2.3.0" } clap = { version = "4.5.60", features = ["derive"] } html-escape = "0.2.13" +serde_json = { version = "1.0", optional = true } elements_rs = { version = "0.2.8", default-features = false } # Runtime extracts inner language/braille zips (BZIP2). The package-rules binary also diff --git a/PythonScripts/README.md b/PythonScripts/README.md index 9eb6ed44e..d79d97dca 100644 --- a/PythonScripts/README.md +++ b/PythonScripts/README.md @@ -9,3 +9,12 @@ If you run from the repo root instead of inside `PythonScripts`, point uv at the uv sync --project PythonScripts uv run --project PythonScripts audit-translations de ``` + +To run rule YAML coverage from the repo root, use the audit tool: + +```bash +uv run --project PythonScripts audit-translations --rule-coverage +``` + +The tool opens `target/rule-coverage/index.html` in a browser when the run finishes. Expand a YAML file to see each active rule's name, tag, hit count, and match status. Hover over a rule to see which tests hit it. Coverage fractions include percentages. +The Rust test output remains at `target/rule-coverage/test.log`. diff --git a/PythonScripts/audit_translations/README.md b/PythonScripts/audit_translations/README.md index 5ebf83203..3e6d67add 100644 --- a/PythonScripts/audit_translations/README.md +++ b/PythonScripts/audit_translations/README.md @@ -67,11 +67,13 @@ The tool automatically adjusts its matching logic based on the file type: uv run audit-translations [--file ] uv run audit-translations --source uv run audit-translations --list +uv run audit-translations --rule-coverage # 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 +uv run --project PythonScripts audit-translations --rule-coverage ``` **Convenience Features:** @@ -82,6 +84,7 @@ uv run --project PythonScripts audit-translations --list * `--rules-dir`: Override the Rules/Languages directory path. * `--only`: Filter issue types (comma-separated): `missing`, `untranslated`, `extra`, `diffs`, `all`. * `--verbose`: Show detailed output including source/target snippets for rule differences. +* `--rule-coverage`: Run the full Rust test suite, generate file- and rule-level pattern coverage under `target/rule-coverage/`, and open the HTML report. File coverage includes files with active rules; empty and include-only files are not separate coverage targets. Expand a file to inspect matched and unmatched rules by name and tag, their hit counts, and hover over a rule to see the tests that matched it. Coverage fractions include percentages. This runs independently of a language audit. * **Summary Stats:** Provides a statistical summary after every run. **Examples:** diff --git a/PythonScripts/audit_translations/cli.py b/PythonScripts/audit_translations/cli.py index 6916a636e..81cac0dd0 100644 --- a/PythonScripts/audit_translations/cli.py +++ b/PythonScripts/audit_translations/cli.py @@ -10,6 +10,7 @@ from .auditor import audit_language, list_languages from .errors import AuditError from .renderer import console +from .rulecoverage.rule_coverage import run as run_rule_coverage def main() -> None: @@ -17,7 +18,7 @@ def main() -> None: sys.stdout.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser( - description="Audit MathCAT translation files against a source language", + description="Audit MathCAT translations or report rule YAML test coverage", formatter_class=argparse.RawDescriptionHelpFormatter, epilog=""" Examples: @@ -25,6 +26,7 @@ def main() -> None: uv run audit-translations nb --source sv uv run audit-translations de --file SharedRules/default.yaml uv run audit-translations --list + uv run audit-translations --rule-coverage """, ) @@ -32,6 +34,9 @@ def main() -> None: 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( + "--rule-coverage", action="store_true", help="Run the full Rust tests and open the rule YAML coverage report" + ) parser.add_argument("--rules-dir", help="Override Rules/Languages directory path") parser.add_argument( "--only", @@ -45,7 +50,11 @@ def main() -> None: args = parser.parse_args() - if args.list: + if args.rule_coverage: + if args.language or args.list or args.specific_file or args.rules_dir or args.only or args.verbose or args.source != "en": + parser.error("--rule-coverage cannot be combined with translation audit options") + sys.exit(run_rule_coverage()) + elif args.list: list_languages(args.rules_dir) elif not args.language: parser.print_help() diff --git a/PythonScripts/audit_translations/rulecoverage/__init__.py b/PythonScripts/audit_translations/rulecoverage/__init__.py new file mode 100644 index 000000000..f9de05fe7 --- /dev/null +++ b/PythonScripts/audit_translations/rulecoverage/__init__.py @@ -0,0 +1 @@ +"""Rule coverage collection and report generation.""" diff --git a/PythonScripts/audit_translations/rulecoverage/rule_coverage.html b/PythonScripts/audit_translations/rulecoverage/rule_coverage.html new file mode 100644 index 000000000..c5235df79 --- /dev/null +++ b/PythonScripts/audit_translations/rulecoverage/rule_coverage.html @@ -0,0 +1,93 @@ + + + + + +Rule YAML coverage + + + +

Rule YAML coverage

+

Status: {{ status }}

+
{{ rule_file_count }} files with active rules{{ file_coverage }} rule files matched +{{ rule_coverage }} active rules matched
+

Paths are relative to Rules/. Files with active rules are coverage targets; +a file is matched when a rule from it completes its replacement successfully.

+{% if errors %} +

Problems

    +{% for error in errors %}
  • {{ error }}
  • {% endfor %} +
+{% endif %} +
+
+
+{% for file in files %} +
+{{ 'Matched' if file.matched else 'No match' }} +{{ file.path }} {{ file.coverage }} rules +

{{ file.coverage }} active rules matched

    +{% set file_index = loop.index0 %} +{% for rule in file.rules %} +
  • +{{ 'Matched' if rule.matched else 'No match' }} +{{ rule.name }} {{ rule.tag }} {{ rule.hits }} {{ 'hit' if rule.hits == 1 else 'hits' }} +{{ rule.tooltip }}
  • +{% endfor %} +
+
+{% endfor %} +
+ + + + diff --git a/PythonScripts/audit_translations/rulecoverage/rule_coverage.py b/PythonScripts/audit_translations/rulecoverage/rule_coverage.py new file mode 100644 index 000000000..a06178336 --- /dev/null +++ b/PythonScripts/audit_translations/rulecoverage/rule_coverage.py @@ -0,0 +1,116 @@ +"""Run the full Rust test suite and report which rule YAML files it exercises.""" + +import json +import shutil +import subprocess +import sys +import webbrowser +from collections import Counter, defaultdict +from pathlib import Path, PurePosixPath + +from .rule_coverage_report import RuleKey, coverage, render_html + +ROOT = Path(__file__).resolve().parents[3] +OUTPUT = ROOT / "target" / "rule-coverage" +EVENTS = OUTPUT / "events" + + +def read_events() -> tuple[set[RuleKey], dict[RuleKey, Counter[str]], list[str]]: + defined_rules: set[RuleKey] = set() + hits_by_test: dict[RuleKey, Counter[str]] = defaultdict(Counter) + errors: list[str] = [] + for event_file in sorted(EVENTS.glob("*.jsonl")): + for number, line in enumerate(event_file.read_text(encoding="utf-8").splitlines(), 1): + try: + event = json.loads(line) + except json.JSONDecodeError: + errors.append(f"Invalid JSON in {event_file.name}:{number}") + continue + if not isinstance(event, dict): + errors.append(f"Invalid event in {event_file.name}:{number}") + continue + kind = event.get("kind") + path = event.get("path") + if not isinstance(path, str): + errors.append(f"Invalid event in {event_file.name}:{number}") + continue + path = path.replace("\\", "/") + parts = PurePosixPath(path).parts + if ( + not parts + or PurePosixPath(path).is_absolute() + or ".." in parts + or PurePosixPath(path).suffix not in (".yaml", ".yml") + ): + errors.append(f"Invalid event in {event_file.name}:{number}") + elif kind in ("defined-rule", "matched-rule") and {"name", "tag"} <= event.keys(): + name, tag = event["name"], event["tag"] + if not isinstance(name, str) or not isinstance(tag, str) or not name or not tag: + errors.append(f"Empty rule identity in {event_file.name}:{number}") + elif kind == "defined-rule" and event.keys() == {"kind", "path", "name", "tag"}: + defined_rules.add((path, name, tag)) + elif ( + kind == "matched-rule" + and event.keys() == {"kind", "path", "name", "tag", "test"} + and isinstance(event["test"], str) + and event["test"] + ): + key = (path, name, tag) + hits_by_test[key][event["test"]] += 1 + else: + errors.append(f"Invalid event in {event_file.name}:{number}") + else: + errors.append(f"Invalid event in {event_file.name}:{number}") + return defined_rules, dict(hits_by_test), errors + + +def run() -> int: + """Generate the HTML report and open it when the run finishes.""" + OUTPUT.mkdir(parents=True, exist_ok=True) + (OUTPUT / "report.md").unlink(missing_ok=True) + if EVENTS.exists(): + shutil.rmtree(EVENTS) + EVENTS.mkdir() + + command = ["cargo", "test", "--features", "rule-coverage"] + log_path = OUTPUT / "test.log" + print(f"Running {' '.join(command)}; saving output to {log_path.relative_to(ROOT)}", flush=True) + with log_path.open("w", encoding="utf-8") as log: + try: + result = subprocess.run(command, cwd=ROOT, stdout=log, stderr=subprocess.STDOUT, check=False) + test_status = result.returncode + except OSError as error: + log.write(f"Could not run cargo: {error}\n") + test_status = 1 + + defined_rules, hits_by_test, errors = read_events() + matched_rules = set(hits_by_test) + rule_files = {path for path, _, _ in defined_rules} + matched_files = {path for path, _, _ in matched_rules} + if test_status: + errors.insert(0, f"cargo test failed (exit status {test_status}); see test.log") + if not defined_rules: + errors.append("No active rule definitions found") + if not matched_rules: + errors.append("No matched rule events found") + if matched_rules - defined_rules: + errors.append("Matched rules lack definition events") + + status = "Incomplete" if errors else "Complete" + html_path = OUTPUT / "index.html" + html_path.write_text(render_html(defined_rules, hits_by_test, errors), encoding="utf-8") + print( + f"{status}: {coverage(len(matched_files), len(rule_files))} rule files matched; " + f"{coverage(len(matched_rules), len(defined_rules))} rules matched; report: {html_path}" + ) + try: + opened = webbrowser.open(html_path.resolve().as_uri()) + except OSError, webbrowser.Error: + opened = False + if not opened: + print(f"Browser unavailable; open {html_path} manually") + return 1 if errors else 0 + + +if __name__ == "__main__": + sys.exit(run()) diff --git a/PythonScripts/audit_translations/rulecoverage/rule_coverage_report.py b/PythonScripts/audit_translations/rulecoverage/rule_coverage_report.py new file mode 100644 index 000000000..e266a9cee --- /dev/null +++ b/PythonScripts/audit_translations/rulecoverage/rule_coverage_report.py @@ -0,0 +1,66 @@ +"""Format file and rule coverage events as an interactive HTML report.""" + +from collections import Counter, defaultdict +from pathlib import Path + +from jinja2 import Environment, FileSystemLoader, select_autoescape + +type RuleKey = tuple[str, str, str] + +TEMPLATE = Environment( + loader=FileSystemLoader(Path(__file__).parent), + autoescape=select_autoescape(("html",)), +).get_template("rule_coverage.html") + + +def coverage(count: int, total: int) -> str: + """Show the matched fraction and its percentage, including empty groups.""" + return f"{count}/{total} ({100 * count / total:.0f}%)" if total else "0/0 (0%)" + + +def render_html( + defined_rules: set[RuleKey], + hits_by_test: dict[RuleKey, Counter[str]], + errors: list[str], +) -> str: + """Show file coverage and searchable rule details in a standalone page.""" + rule_files = {path for path, _, _ in defined_rules} + matched_files = {path for path, _, _ in hits_by_test} + rules_by_path: dict[str, list[dict]] = defaultdict(list) + for path, name, tag in defined_rules: + key = (path, name, tag) + tests = hits_by_test.get(key, {}) + total_hits = sum(tests.values()) + rules_by_path[path].append( + { + "name": name, + "tag": tag, + "matched": key in hits_by_test, + "hits": total_hits, + "tooltip": "Tests:\n" + + "\n".join(f"{test} ({count} {'hit' if count == 1 else 'hits'})" for test, count in sorted(tests.items())) + if total_hits + else "No test hits", + } + ) + + files = [] + for path in sorted(rule_files): + rules = sorted(rules_by_path.get(path, []), key=lambda rule: (rule["name"], rule["tag"])) + files.append( + { + "path": path, + "matched": path in matched_files, + "coverage": coverage(sum(rule["matched"] for rule in rules), len(rules)), + "rules": rules, + } + ) + + return TEMPLATE.render( + status="Incomplete" if errors else "Complete", + rule_file_count=len(rule_files), + file_coverage=coverage(len(matched_files), len(rule_files)), + rule_coverage=coverage(len(hits_by_test), len(defined_rules)), + errors=errors, + files=files, + ) diff --git a/PythonScripts/audit_translations/tests/test_rule_coverage_cli.py b/PythonScripts/audit_translations/tests/test_rule_coverage_cli.py new file mode 100644 index 000000000..33709d1e6 --- /dev/null +++ b/PythonScripts/audit_translations/tests/test_rule_coverage_cli.py @@ -0,0 +1,156 @@ +"""Checks the rule coverage command without rerunning the Rust test suite.""" + +import json +import subprocess +import sys +from pathlib import Path + +import pytest + +from .. import cli +from ..rulecoverage import rule_coverage + + +def test_coverage_command_generates_html_and_opens_browser(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + """The CLI writes only the HTML report, removes an old Markdown report, and opens the page.""" + output = tmp_path / "target" / "rule-coverage" + output.mkdir(parents=True) + (output / "report.md").write_text("old report", encoding="utf-8") + monkeypatch.setattr(rule_coverage, "ROOT", tmp_path) + monkeypatch.setattr(rule_coverage, "OUTPUT", output) + monkeypatch.setattr(rule_coverage, "EVENTS", output / "events") + + def fake_cargo(command: list[str], **kwargs: object) -> subprocess.CompletedProcess[str]: + assert command == ["cargo", "test", "--features", "rule-coverage"] + assert kwargs["cwd"] == tmp_path + events = [ + {"kind": "defined-rule", "path": "Languages/en/SimpleSpeak_Rules.yaml", "name": "simple", "tag": "mi"}, + {"kind": "defined-rule", "path": "Languages/en/SimpleSpeak_Rules.yaml", "name": "default", "tag": "mi"}, + {"kind": "defined-rule", "path": "Languages/en/Z_Rules.yaml", "name": "unused", "tag": "mn"}, + { + "kind": "matched-rule", + "path": "Languages/en/SimpleSpeak_Rules.yaml", + "name": "simple", + "tag": "mi", + "test": "test_alpha", + }, + { + "kind": "matched-rule", + "path": "Languages/en/SimpleSpeak_Rules.yaml", + "name": "simple", + "tag": "mi", + "test": "test_alpha", + }, + { + "kind": "matched-rule", + "path": "Languages/en/SimpleSpeak_Rules.yaml", + "name": "simple", + "tag": "mi", + "test": "test_beta", + }, + ] + (output / "events" / "pid-123.jsonl").write_text( + "\n".join(json.dumps(event) for event in events) + "\n", + encoding="utf-8", + ) + return subprocess.CompletedProcess(command, 0) + + opened: list[str] = [] + monkeypatch.setattr(rule_coverage.subprocess, "run", fake_cargo) + monkeypatch.setattr(rule_coverage.webbrowser, "open", lambda url: opened.append(url) or True) + monkeypatch.setattr(sys, "argv", ["audit-translations", "--rule-coverage"]) + + with pytest.raises(SystemExit) as result: + cli.main() + + assert result.value.code == 0 + assert opened == [(output / "index.html").as_uri()] + assert not (output / "report.md").exists() + html = (output / "index.html").read_text(encoding="utf-8") + assert "Status: Complete" in html + assert "1/2 (50%) rule files matched" in html + assert "Languages/en/Z_Rules.yaml" in html + assert 'data-rule-search="simple mi" data-status="matched"' in html + assert 'data-rule-search="default mi" data-status="unmatched"' in html + assert "1/3 (33%) active rules matched" in html + assert "1/2 (50%) rules" in html + assert 'role="tooltip">Tests:\ntest_alpha (2 hits)\ntest_beta (1 hit)' in html + assert ".rules li:hover .rule-tooltip, .rules li:focus .rule-tooltip { display: block; }" in html + assert 'aria-describedby="rule-tooltip-0-1"' in html + assert "3 hits" in html + assert "0 hits" in html + assert "2 files with active rules" in html + assert (output / "test.log").is_file() + + +def test_failed_coverage_run_opens_incomplete_report(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + """A failed test run remains unsuccessful but still produces and opens a useful report.""" + output = tmp_path / "target" / "rule-coverage" + monkeypatch.setattr(rule_coverage, "ROOT", tmp_path) + monkeypatch.setattr(rule_coverage, "OUTPUT", output) + monkeypatch.setattr(rule_coverage, "EVENTS", output / "events") + monkeypatch.setattr( + rule_coverage.subprocess, + "run", + lambda command, **kwargs: subprocess.CompletedProcess(command, 1), + ) + opened: list[str] = [] + monkeypatch.setattr(rule_coverage.webbrowser, "open", lambda url: opened.append(url) or True) + + assert rule_coverage.run() == 1 + assert opened == [(output / "index.html").as_uri()] + html = (output / "index.html").read_text(encoding="utf-8") + assert "Status: Incomplete" in html + assert "No active rule definitions found" in html + assert not (output / "report.md").exists() + + +def test_jsonl_rule_identity_preserves_separators_and_unicode(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + """JSONL rule names survive tabs, newlines, and Unicode without splitting events.""" + events = tmp_path / "events" + events.mkdir() + monkeypatch.setattr(rule_coverage, "EVENTS", events) + name = "fraction\tname\nĂŒber" + path = "Languages/en/SimpleSpeak_Rules.yaml" + (events / "pid-123.jsonl").write_text( + json.dumps({"kind": "defined-rule", "path": path, "name": name, "tag": "mfrac"}) + "\n", + encoding="utf-8", + ) + + defined, hits_by_test, errors = rule_coverage.read_events() + + assert hits_by_test == {} + assert defined == {(path, name, "mfrac")} + assert errors == [] + + +def test_invalid_and_unknown_rule_events_make_report_incomplete(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + """Malformed events and hits without definitions must keep the report incomplete.""" + output = tmp_path / "target" / "rule-coverage" + monkeypatch.setattr(rule_coverage, "ROOT", tmp_path) + monkeypatch.setattr(rule_coverage, "OUTPUT", output) + monkeypatch.setattr(rule_coverage, "EVENTS", output / "events") + path = "Languages/en/SimpleSpeak_Rules.yaml" + + def fake_cargo(command: list[str], **kwargs: object) -> subprocess.CompletedProcess[str]: + events = [ + {"kind": "loaded", "path": path}, + {"kind": "defined-rule", "path": path, "name": "known", "tag": "mi"}, + {"kind": "matched-rule", "path": path, "name": "unknown", "tag": "mi", "test": "test_alpha"}, + ] + (output / "events" / "pid-123.jsonl").write_text( + "\n".join(json.dumps(event) for event in events) + "\n{bad json\n", + encoding="utf-8", + ) + return subprocess.CompletedProcess(command, 0) + + monkeypatch.setattr(rule_coverage.subprocess, "run", fake_cargo) + monkeypatch.setattr(rule_coverage.webbrowser, "open", lambda url: True) + + assert rule_coverage.run() == 1 + html = (output / "index.html").read_text(encoding="utf-8") + assert "Status: Incomplete" in html + assert "Invalid event in pid-123.jsonl:1" in html + assert "Invalid JSON in pid-123.jsonl:4" in html + assert "Matched rules lack definition events" in html + assert not (output / "report.md").exists() diff --git a/PythonScripts/pyproject.toml b/PythonScripts/pyproject.toml index 7b9adf68d..e1f579a31 100644 --- a/PythonScripts/pyproject.toml +++ b/PythonScripts/pyproject.toml @@ -14,6 +14,7 @@ dependencies = [ "deepl", "googletrans", "html-table-extractor", + "jinja2>=3.1.6", "jsonpath-ng>=1.8.0", "pyyaml", "rich", diff --git a/PythonScripts/uv.lock b/PythonScripts/uv.lock index 81e0404c4..d2323646c 100644 --- a/PythonScripts/uv.lock +++ b/PythonScripts/uv.lock @@ -200,6 +200,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + [[package]] name = "jsonpath-ng" version = "1.8.0" @@ -221,6 +233,36 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, ] +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + [[package]] name = "mdurl" version = "0.1.2" @@ -282,6 +324,7 @@ dependencies = [ { name = "deepl" }, { name = "googletrans" }, { name = "html-table-extractor" }, + { name = "jinja2" }, { name = "jsonpath-ng" }, { name = "pyyaml" }, { name = "rich" }, @@ -300,6 +343,7 @@ requires-dist = [ { name = "deepl" }, { name = "googletrans" }, { name = "html-table-extractor" }, + { name = "jinja2", specifier = ">=3.1.6" }, { name = "jsonpath-ng", specifier = ">=1.8.0" }, { name = "pyyaml" }, { name = "rich" }, diff --git a/src/lib.rs b/src/lib.rs index ac577a47f..97cf10d08 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -38,6 +38,8 @@ mod prefs; mod tts; mod xpath_functions; mod definitions; +#[cfg(feature = "rule-coverage")] +mod rule_coverage; pub mod pretty_print; mod chemistry; diff --git a/src/rule_coverage.rs b/src/rule_coverage.rs new file mode 100644 index 000000000..f0277d5ca --- /dev/null +++ b/src/rule_coverage.rs @@ -0,0 +1,58 @@ +//! Per-process YAML rule coverage events, enabled only by `rule-coverage`. + +use std::collections::HashSet; +use std::fs::{self, File, OpenOptions}; +use std::io::Write; +use std::path::{Path, PathBuf}; +use std::sync::{Mutex, OnceLock}; + +struct Recorder { + output: File, + recorded: HashSet<(PathBuf, String, String)>, +} + +static RECORDER: OnceLock> = OnceLock::new(); + +fn recorder() -> &'static Mutex { + RECORDER.get_or_init(|| { + let event_dir = Path::new(env!("CARGO_MANIFEST_DIR")) + .join("target/rule-coverage/events"); + fs::create_dir_all(&event_dir).expect("cannot create rule coverage event directory"); + let event_file = event_dir.join(format!("pid-{}.jsonl", std::process::id())); + let output = OpenOptions::new().create(true).append(true).open(event_file) + .expect("cannot open rule coverage event file"); + Mutex::new(Recorder { output, recorded: HashSet::new() }) + }) +} + +fn rule_relative_path(path: &Path) -> Option { + let rules_dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("Rules"); + let relative = path.strip_prefix(&rules_dir) + .or_else(|_| path.strip_prefix("Rules")) + .ok()?; + if relative.as_os_str().is_empty() || !matches!(relative.extension().and_then(|s| s.to_str()), Some("yaml" | "yml")) { + return None; + } + Some(relative.to_path_buf()) +} + +pub(crate) fn defined_rule(path: &Path, name: &str, tag: &str) { + let Some(relative) = rule_relative_path(path) else { return }; + let mut recorder = recorder().lock().unwrap_or_else(|poisoned| poisoned.into_inner()); + if !recorder.recorded.insert((relative.clone(), name.to_string(), tag.to_string())) { + return; + } + let path = relative.to_string_lossy(); + let event = serde_json::json!({"kind": "defined-rule", "path": path, "name": name, "tag": tag}); + writeln!(recorder.output, "{event}").expect("cannot write rule coverage event"); +} + +pub(crate) fn matched_rule(path: &Path, name: &str, tag: &str) { + let Some(relative) = rule_relative_path(path) else { return }; + let mut recorder = recorder().lock().unwrap_or_else(|poisoned| poisoned.into_inner()); + let event = serde_json::json!({ + "kind": "matched-rule", "path": relative.to_string_lossy(), "name": name, "tag": tag, + "test": std::thread::current().name().unwrap_or("(unnamed thread)"), + }); + writeln!(recorder.output, "{event}").expect("cannot write rule coverage event"); +} diff --git a/src/speech.rs b/src/speech.rs index 4b6691bec..b667cb612 100644 --- a/src/speech.rs +++ b/src/speech.rs @@ -2291,6 +2291,14 @@ impl SpeechRules { if self.rules.is_empty() || !self.rule_files.is_file_up_to_date(&rule_file, should_ignore_file_time) { self.rules.clear(); let files_read = self.read_patterns(&rule_file)?; + #[cfg(feature = "rule-coverage")] + for patterns in self.rules.values() { + for pattern in patterns { + crate::rule_coverage::defined_rule( + Path::new(&pattern.file_name), &pattern.pattern_name, &pattern.tag_name + ); + } + } self.rule_files.set_files_and_times(files_read); } @@ -2511,6 +2519,10 @@ impl<'c, 's:'c, 'r, 'm:'c> SpeechRulesWithContext<'c, 's,'m> { } return match result { Ok(s) => { + #[cfg(feature = "rule-coverage")] + crate::rule_coverage::matched_rule( + Path::new(&pattern.file_name), &pattern.pattern_name, &pattern.tag_name + ); // for all except braille and navigation, nav_node_id will be an empty string and will not match if self.nav_node_id.is_empty() { Ok( Some(s) ) From 7aa6b6fb1dd02f33bfd4d7acb72d3a8c1462450d Mon Sep 17 00:00:00 2001 From: hammera Date: Tue, 6 Oct 2026 14:13:40 +0200 Subject: [PATCH 153/162] =?UTF-8?q?Rules/Languages/hu/definitions.yaml:=20?= =?UTF-8?q?add=20a=20new=20rule,=20based=20the=20english=20new=20definitio?= =?UTF-8?q?ns.yaml=20rule=20(the=20of=20word=20related)=E2=80=A6=20(#842)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Rules/Languages/hu/definitions.yaml: add a new rule, based the english new definitions rule Signed-off-by: Attila Hammer * Update tests, add navigation test and table separator test Signed-off-by: Attila Hammer * Rules/Languages/hu/definitions.yaml: added missign navigation related fixes with not merged to the main branch Signed-off-by: Attila Hammer * tests/Languages/hu/mtable.rs: added a not merged table separator tests related modification Signed-off-by: Attila Hammer * convert tests/Languages/hu/navigate.rs with crlf format Signed-off-by: Attila Hammer * Rules/Languages/hu/navigate.yaml: remove unneed in suffix after hungarian zoom part translation (the nagyĂ­tĂĄs word related test) Signed-off-by: Attila Hammer * tests/Languages/hu/navigate.rs: adapt the nagyĂ­tĂĄs (zoom in) related changes to the test file to get correct translation Signed-off-by: Attila Hammer * Rules/Languages/hu/navigate.yaml: fixed few translations, based with experiences Signed-off-by: Attila Hammer * Rules/Languages/hu/navigate.yaml: added audit-ignore with required places Signed-off-by: Attila Hammer * tests/Languages/hu/navigate.rs: add new navigation tests, based with last hungarian navigation translations Signed-off-by: Attila Hammer --------- Signed-off-by: Attila Hammer --- Rules/Languages/hu/definitions.yaml | 38 +- Rules/Languages/hu/navigate.yaml | 96 +++-- tests/Languages/hu.rs | 2 +- tests/Languages/hu/mtable.rs | 133 ++++++ tests/Languages/hu/navigate.rs | 599 ++++++++++++++++++++++++++++ 5 files changed, 815 insertions(+), 53 deletions(-) create mode 100644 tests/Languages/hu/navigate.rs diff --git a/Rules/Languages/hu/definitions.yaml b/Rules/Languages/hu/definitions.yaml index f070f72fc..c72e0facc 100644 --- a/Rules/Languages/hu/definitions.yaml +++ b/Rules/Languages/hu/definitions.yaml @@ -351,6 +351,10 @@ ## Other : Not tested, don't appear in https://w3c.github.io/mathml-docs/intent-core-concepts/ "modified-variable": "silent= " } + # The connector word to say for functional 'IntentMappings' (in English, "of") + # This is likely the word used for U+2061 in unicode.yaml, but for technical reasons needs to be defined here + # vector of length=1 because scalars not supported +- FunctionApplicationWord: ["a(z)"] # Names of functions that in terse mode don't say "of" (or it's equivalent in other languages) - TerseFunctionNames: { @@ -359,30 +363,30 @@ - NavigationParts: { # These are the parts of a formula that can be navigated to - "large-op": "base; lower limit; upper limit", - "mfrac": "numerator; denominator", + "large-op": "alap; alsĂł hatĂĄr; felsƑ hatĂĄr", + "mfrac": "szĂĄmlĂĄlĂł; nevezƑ", "fraction": "szĂĄmlĂĄlĂł; nevezƑ", "msqrt": "gyök", "square-root": "gyök", - "mroot": "root; root index", + "mroot": "gyök; gyök index", "root": "gyök; gyök index", - "msub": "base; subscript", - "sub": "base; subscript", - "logarithm-with-base": "base", - "indexed-by": "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", + "msub": "alap; alsĂł index", + "sub": "alap; alsĂł index", + "logarithm-with-base": "alap logaritmus", + "indexed-by": "alap; alsĂł index", + "msup": "alap; felsƑ index", + "say-super": "alap; felsƑ index", + "skip-super": "alap; felsƑ index", + "power": "alap; kitevƑ", + "msubsup": "alap; alsĂł index; felsƑ index", + "munder": "alap; hatĂĄrĂ©rtĂ©k alatt", + "mover": "alap; hatĂĄrĂ©rtĂ©k felett", + "munderover": "alap; hatĂĄrĂ©rtĂ©k alatt; hatĂĄrĂ©rtĂ©k felett", # 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": "ban/ben", + "out": "ki", } - KnownWords: { diff --git a/Rules/Languages/hu/navigate.yaml b/Rules/Languages/hu/navigate.yaml index 475e1f625..5a7636d9d 100644 --- a/Rules/Languages/hu/navigate.yaml +++ b/Rules/Languages/hu/navigate.yaml @@ -39,7 +39,7 @@ # as they would likely be much more efficient and also cleaner. # Rules for announcing the command -- name: say-command +- name: say-command #audit-ignore tag: "!*" match: "$SayCommand != ''" # value should be '', 'true', or 'false' variables: [Prefix: "''"] @@ -48,7 +48,7 @@ - if: "$MatchCounter = 0 and $SayCommand = 'true'" then_test: - if: "self::m:math and starts-with($NavCommand, 'ZoomOut')" - then: [T: "teljesen kinagyĂ­tva", pause: "medium"] + then: [T: "teljesen kicsinyĂ­tve", pause: "medium"] # phrase('zoomed out all of the way') - else_if: "IsNode(., 'leaf') and starts-with($NavCommand, 'ZoomIn')" then: - test: @@ -56,41 +56,51 @@ then: [T: "teljesen rĂĄközelĂ­tett"] # phrase('zoomed in all of the way') - else_if: "$NavNodeOffset = 0" then: [T: "rĂĄközelĂ­tett az elsƑ karakterre"] # phrase('zoomed in to first character') - else: [T: "karakterre nagyĂ­tva"] # phrase('zoomed in to character') + else: [T: "rĂĄközelĂ­tett a karakterre"] # phrase('zoomed in to character') - pause: "medium" else: - test: # CommandOffset is 1 + length of the English NavCommand stem (Zoom/Move/Read/Describe), # not the spoken Prefix length — so translations can use a different Prefix word. - if: "starts-with($NavCommand, 'Zoom')" - then: [set_variables: [Prefix: "'zoom'", CommandOffset: "5"]] # phrase('zoom' in to see more details) + then: + # the whole phrase is chosen here ("kicsinyĂ­tĂ©s" is the Hungarian for "zoom out"), so no suffix word is needed below + - test: + - if: "$NavCommand = 'ZoomOut'" + then: [set_variables: [Prefix: "'kicsinyĂ­tĂ©s'", CommandOffset: "5"]] # phrase('zoom out') + - else_if: "$NavCommand = 'ZoomOutAll'" + then: [set_variables: [Prefix: "'teljes kicsinyĂ­tĂ©s'", CommandOffset: "5"]] # phrase('zoom out all of the way') + - else_if: "$NavCommand = 'ZoomInAll'" + then: [set_variables: [Prefix: "'teljes nagyĂ­tĂĄs'", CommandOffset: "5"]] # phrase('zoom in all of the way') + - else: [set_variables: [Prefix: "'nagyĂ­tĂĄs'", CommandOffset: "5"]] # phrase('zoom' in to see more details) - else_if: "starts-with($NavCommand, 'Move')" - then: [set_variables: [Prefix: "'move'", CommandOffset: "5"]] # phrase('move' to next entry in table) + then: [set_variables: [Prefix: "'ugrĂĄs'", CommandOffset: "5"]] # phrase('move' to next entry in table) - else_if: "starts-with($NavCommand, 'Read')" - then: [set_variables: [Prefix: "'read'", CommandOffset: "5"]] # phrase('read' to next entry in table) + then: + # "olvasĂĄs jelenlegi" is not Hungarian; the whole phrase is chosen here (no suffix word needed for 'Current') + - test: + - if: "$NavCommand = 'ReadCurrent'" + then: [set_variables: [Prefix: "'az aktuĂĄlis elem felolvasĂĄsa'", CommandOffset: "5"]] # phrase('read current') + - else: [set_variables: [Prefix: "'olvasĂĄs'", CommandOffset: "5"]] # phrase('read' to next entry in table) - else_if: "starts-with($NavCommand, 'Describe')" - then: [set_variables: [Prefix: "'describe'", CommandOffset: "9"]] # phrase('describe' to next entry in table) + then: + - test: + - if: "$NavCommand = 'DescribeCurrent'" + then: [set_variables: [Prefix: "'az aktuĂĄlis elem leĂ­rĂĄsa'", CommandOffset: "9"]] # phrase('describe current') + - else: [set_variables: [Prefix: "'leĂ­rĂĄs'", CommandOffset: "9"]] # phrase('describe' to next entry in table) - test: if: "$Prefix != ''" then: - x: "$Prefix" - test: - if: "substring($NavCommand, $CommandOffset) = 'In'" - then: [T: "ban"] # phrase(zoom 'in' to see more details) - - else_if: "substring($NavCommand, $CommandOffset) = 'InAll'" - # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets "ed" concatenated to "zoom" - then: [T: "Teljesen kinagyĂ­tva"] # phrase(zoom 'out all of the way' to see more details) - - else_if: "substring($NavCommand, $CommandOffset) = 'Out'" - then: [T: "ki"] # phrase(zoom 'out' to see more details) - - else_if: "substring($NavCommand, $CommandOffset) = 'OutAll'" - # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets "ed" concatenated to "zoom" - then: [T: "teljes tĂĄblĂĄzat kinagyĂ­tĂĄsa"] # phrase(zoom 'out all of the way' to see more details) + then: [T: ""] # phrase(zoom 'in' to see more details) + # 'InAll', 'Out' and 'OutAll' are covered by the Prefix chosen above (nothing more to say) - else_if: "substring($NavCommand, $CommandOffset) = 'Next'" then: [T: "jobbra"] # phrase(move to the 'right') - else_if: "substring($NavCommand, $CommandOffset) = 'Previous'" then: [T: "balra"] # phrase(move to the 'left') - - else_if: "substring($NavCommand, $CommandOffset) = 'Current'" - then: [T: "jelenlegi"] # phrase(who is the 'current' president) + # 'Current' is covered by the Prefix chosen above (ReadCurrent / DescribeCurrent) - else_if: "substring($NavCommand, $CommandOffset) = 'LineStart'" then: [T: "a sor elejĂ©re"] # phrase(move 'to start of line') - else_if: "substring($NavCommand, $CommandOffset) = 'LineEnd'" @@ -122,7 +132,7 @@ - x: "count($Child2D/preceding-sibling::*)+1" - pause: "medium" -- name: into-or-out-of-mmultiscripts +- name: into-or-out-of-mmultiscripts #audit-ignore tag: "*" match: "$Move2D != '' and (@data-from-mathml='mmultiscripts' or self::m:mmultiscripts)" replace: @@ -133,25 +143,34 @@ variables: - NumPrecedingSiblings: "count($Child2D/preceding-sibling::*)" replace: - - x: "$Move2D" - test: - if: "$NumPrecedingSiblings=0" - then: [T: "alapja"] # phrase(the 'base' of the power) + then: [T: "alap"] # 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: "alsĂł index kezdete"] # phrase(x with 'subscript' 2) - else: [T: "FelsƑ index kezdete"] # phrase(x with 'superscript' 2) + then: [T: "bal alsĂł index"] # phrase(x with 'pre-subscript' 2) + else: [T: "bal felsƑ index"] # phrase(x with 'pre-superscript' 2) else: - test: if: "$NumPrecedingSiblings mod 2 = 0" - then: [T: "felsƑ index"] # phrase(x with 'pre-superscript' 2) - else: [T: "alsĂł index"] # phrase(x with 'pre-subscript' 2) + then: [T: "felsƑ index"] # phrase(x with 'superscript' 2) + else: [T: "alsĂł index"] # phrase(x with 'subscript' 2) + # Hungarian puts the case suffix on the part name ("a szĂĄmlĂĄlĂłban"), which cannot be built for arbitrary part names. + # So "in" is silent (the command word already says it) and the other words follow the part name as a + # possessive/genitive noun phrase that works for any name: "szĂĄmlĂĄlĂł elhagyĂĄsa", "nevezƑ eleje", "alsĂł index vĂ©ge". + - test: + - if: "$Move2D = 'out of'" + then: [T: "elhagyĂĄsa"] # phrase('out of' the denominator) + - else_if: "$Move2D = 'start of'" + then: [T: "eleje"] # phrase('start of' the denominator) + - else_if: "$Move2D = 'end of'" + then: [T: "vĂ©ge"] # phrase('end of' the denominator) - pause: "medium" # Rules for speaking what happens when moving into or out of a notation -- name: into-or-out-of-default +- name: into-or-out-of-default #audit-ignore 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'" @@ -162,7 +181,6 @@ - PartNumber: "count($Child2D/preceding-sibling::*)" - PartName: "GetNavigationPartName(name(.), $PartNumber)" replace: - - x: "$Move2D" - test: - if: "$PartName != ''" then: [x: "$PartName"] @@ -185,8 +203,18 @@ then: [x: "SpeakIntentName(name(.), $Verbosity, 'silent')"] - else: [x: "SpeakIntentName(name(.), $Verbosity, 'other')"] else: - - T: "rĂ©sze" # phrase(the 'part' of the expression) + - T: "rĂ©sz" # phrase(the 'part' of the expression) - x: "count($Child2D/preceding-sibling::*) + 1" + # Hungarian puts the case suffix on the part name ("a szĂĄmlĂĄlĂłban"), which cannot be built for arbitrary part names. + # So "in" is silent (the command word already says it) and the other words follow the part name as a + # possessive/genitive noun phrase that works for any name: "szĂĄmlĂĄlĂł elhagyĂĄsa", "nevezƑ eleje", "alsĂł index vĂ©ge". + - test: + - if: "$Move2D = 'out of'" + then: [T: "elhagyĂĄsa"] # phrase('out of' the denominator) + - else_if: "$Move2D = 'start of'" + then: [T: "eleje"] # phrase('start of' the denominator) + - else_if: "$Move2D = 'end of'" + then: [T: "vĂ©ge"] # phrase('end of' the denominator) - pause: "medium" - name: default-move @@ -1205,16 +1233,15 @@ - test: if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" then: - - T: "nem tud" # phrase('cannot' move right in expression) + - T: "nem tud jobbra" # phrase('cannot' move 'right' in expression) - test: - if: "$NavCommand = 'MoveNext'" then: [T: "mozogni"] # phrase('move' to next entry in table) - else_if: "$NavCommand = 'ReadNext'" then: [T: "olvasni"] # phrase('read' next entry in table) else: [T: "leĂ­rni"] # phrase('describe' next entry in table) - - T: "jobbra" # phrase(move 'right') - pause: short - - T: "matematematikai blokk vĂ©ge" # phrase(move 'end of math') + - T: "matematikai blokk vĂ©ge" # phrase(move 'end of math') - pause: long - set_variables: [SpeakExpression: "'false'"] @@ -1406,7 +1433,7 @@ - pause: medium - with: variables: - - Move2D: "'end of'" + - Move2D: "'start of'" - Child2D: "$EdgeNode/*[1]" - MatchCounter: $MatchCounter + 1 replace: [x: "$EdgeNode"] @@ -1680,9 +1707,8 @@ then: - test: - if: "$NavCommand = 'ReadCurrent'" - then: [T: "olvassa"] # phrase('read' next entry in table) - else: [T: "Ă­rja le"] # phrase('describe' next entry in table) - - T: "jelenlegi" # phrase('current' entry in table) + then: [T: "az aktuĂĄlis elem felolvasĂĄsa"] # phrase('read current' entry in table) + else: [T: "az aktuĂĄlis elem leĂ­rĂĄsa"] # phrase('describe current' entry in table) - pause: long - set_variables: [NavNode: "@id"] diff --git a/tests/Languages/hu.rs b/tests/Languages/hu.rs index ac24dd22e..b15d27050 100644 --- a/tests/Languages/hu.rs +++ b/tests/Languages/hu.rs @@ -32,4 +32,4 @@ mod alphabets; mod definitions; mod intent; mod mtable; - +mod navigate; diff --git a/tests/Languages/hu/mtable.rs b/tests/Languages/hu/mtable.rs index f02050e47..8f33d176e 100644 --- a/tests/Languages/hu/mtable.rs +++ b/tests/Languages/hu/mtable.rs @@ -240,6 +240,105 @@ fn matrix_2x3() -> Result<()> { } +#[test] +fn augmented_matrix_2x3() -> Result<()> { + let expr = " + + + [ + + + + 3 + + + 1 + + + 4 + + + + + 0 + + + 2 + + + 6 + + + + ] + + "; + test("hu", "ClearSpeak", expr, "a(z) 2 x 3 mĂĄtrix; 1 . sor; 3, 1, elvĂĄlasztĂł, 4; 2 . sor; 0, 2, elvĂĄlasztĂł, 6")?; + test("hu", "SimpleSpeak", expr, "a(z) 2 x 3 mĂĄtrix; 1 . sor; 3, 1, elvĂĄlasztĂł, 4; 2 . sor; 0, 2, elvĂĄlasztĂł, 6")?; + Ok(()) +} + +#[test] +fn dashed_augmented_matrix_separator() -> Result<()> { + let expr = " + + [ + + 123 + + ] + "; + test("hu", "ClearSpeak", expr, "az 1-szer 3 -es sor mĂĄtrix; 1, elvĂĄlasztĂł, 2, elvĂĄlasztĂł, 3")?; + test("hu", "SimpleSpeak", expr, "az 1-szer 3 -es sor mĂĄtrix; 1, elvĂĄlasztĂł, 2, elvĂĄlasztĂł, 3")?; + Ok(()) +} + +/// A horizontal line is announced once, after the row it separates from the next row. +#[test] +fn matrix_row_separator() -> Result<()> { + let expr = " + + [ + + + 1 + 2 + + + 3 + 4 + + + ] + "; + test("hu", "ClearSpeak", expr, "a(z) 2 x 2 mĂĄtrix; 1 . sor; 1, 2, sorelvĂĄlasztĂł; 2 . sor; 3, 4")?; + test("hu", "SimpleSpeak", expr, "a(z) 2 x 2 mĂĄtrix; 1 . sor; 1, 2, sorelvĂĄlasztĂł; 2 . sor; 3, 4")?; + Ok(()) +} + +/// Horizontal and vertical lines use distinct announcements at their respective boundaries. +#[test] +fn matrix_row_and_column_separators() -> Result<()> { + let expr = " + + [ + + + 1 + 2 + + + 3 + 4 + + + ] + "; + test("hu", "ClearSpeak", expr, "a(z) 2 x 2 mĂĄtrix; 1 . sor; 1, elvĂĄlasztĂł, 2, sorelvĂĄlasztĂł; 2 . sor; 3, elvĂĄlasztĂł, 4")?; + test("hu", "SimpleSpeak", expr, "a(z) 2 x 2 mĂĄtrix; 1 . sor; 1, elvĂĄlasztĂł, 2, sorelvĂĄlasztĂł; 2 . sor; 3, elvĂĄlasztĂł, 4")?; + Ok(()) +} + // AI generated #[test] fn matrix_2x3_labeled() -> Result<()> { @@ -860,6 +959,40 @@ test_ClearSpeak("hu", "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("hu", "ClearSpeak_Matrix", "EndMatrix", + expr, "a(z) 3 x 4 mĂĄtrix; 1 . sor; oszlop 1; 1, oszlop 2; 2, oszlop 3; negatĂ­v 1, elvĂĄlasztĂł, oszlop 4; 3; 2 . sor; oszlop 1; negatĂ­v 3, oszlop 2; 3, oszlop 3; negatĂ­v 1, elvĂĄlasztĂł, oszlop 4; 2; 3 . sor; oszlop 1; 2, oszlop 2; 3, oszlop 3; 2, elvĂĄlasztĂł, oszlop 4; negatĂ­v 1; vĂ©ge a mĂĄtrixnak")?; + test("hu", "SimpleSpeak", + expr, "a(z) 3 x 4 mĂĄtrix; 1 . sor; oszlop 1; 1, oszlop 2; 2, oszlop 3; negatĂ­v 1, elvĂĄlasztĂł, oszlop 4; 3; 2 . sor; oszlop 1; negatĂ­v 3, oszlop 2; 3, oszlop 3; negatĂ­v 1, elvĂĄlasztĂł, oszlop 4; 2; 3 . sor; oszlop 1; 2, oszlop 2; 3, oszlop 3; 2, elvĂĄlasztĂł, oszlop 4; negatĂ­v 1; vĂ©ge a mĂĄtrixnak")?; + Ok(()) + } // AI generated #[test] diff --git a/tests/Languages/hu/navigate.rs b/tests/Languages/hu/navigate.rs new file mode 100644 index 000000000..892d69481 --- /dev/null +++ b/tests/Languages/hu/navigate.rs @@ -0,0 +1,599 @@ +//! Navigation ZoomIn speech vs NavigationParts and intent fixity. +//! +//! Uses only real intents / MathML from `definitions.yaml` and `Rules/Intent/*.yaml` +//! (same shapes as other en language tests). Fixities covered are those that actually +//! appear there: prefix, infix, postfix, function, silent, nofix. + +use crate::common::*; +use anyhow::Result; +use std::panic::{catch_unwind, AssertUnwindSafe}; + +fn init_nav(mathml: &str) -> Result<()> { + init_nav_with_auto_zoom_out(mathml, false) +} + +/// Same setup as `init_nav`, but lets a test choose the "AutoZoomOut" preference. +/// +/// With AutoZoomOut == "False" the navigation rules stop at the edge of a notation and announce it +/// ("nem tud jobbra mozogni" + the part). With "True" they leave the notation automatically and announce +/// that with the "elhagyĂĄsa" fragment ("nevezƑ elhagyĂĄsa"). +fn init_nav_with_auto_zoom_out(mathml: &str, auto_zoom_out: bool) -> Result<()> { + set_rules_dir(abs_rules_dir_path())?; + set_preference("Language", "hu")?; + set_preference("SpeechStyle", "SimpleSpeak")?; + set_preference("Verbosity", "Medium")?; + set_preference("NavMode", "Enhanced")?; + set_preference("NavVerbosity", "Verbose")?; + set_preference("AutoZoomOut", if auto_zoom_out { "True" } else { "False" })?; + set_preference("Overview", "False")?; + set_mathml(mathml)?; + Ok(()) +} + +fn assert_zoom_in(command: &str, mathml: &str, expected: &str) -> Result<()> { + init_panic_handler(); + let result = catch_unwind(AssertUnwindSafe(|| { + init_nav(mathml)?; + let speech = do_navigate_command(command)?; + let trimmed_speech = speech.trim_end_matches([' ', ',', ';']).to_string(); + assert_eq!(expected, trimmed_speech); + Ok(()) + })); + report_any_panic(result) +} + +// --- Intents in NavigationParts (prefix, infix, function, silent; no postfix/nofix) --- + +#[test] +fn parts_prefix_logarithm_with_base() -> Result<()> { + // Intent/general.yaml log-with-base → logarithm-with-base:prefix; parts "base" + let expr = r#" + + + log + b + + + "#; + assert_zoom_in("ZoomIn", expr, "nagyĂ­tĂĄs; alap logaritmus; b") +} + +#[test] +fn parts_infix_power() -> Result<()> { + // power:infix; parts "base; exponent" + let expr = r#" + + + x + 2 + + + "#; + assert_zoom_in("ZoomIn", expr, "nagyĂ­tĂĄs; alap; x") +} + +#[test] +fn parts_infix_indexed_by() -> Result<()> { + // indexed-by:infix; parts "base; subscript" + let expr = r#" + + + x + 1 + + + "#; + assert_zoom_in("ZoomIn", expr, "nagyĂ­tĂĄs; alap; x") +} + +#[test] +fn parts_function_fraction() -> Result<()> { + // fraction (from mfrac); parts "numerator; denominator" + let expr = r#" + + + 1 + 2 + + + "#; + assert_zoom_in("ZoomIn", expr, "nagyĂ­tĂĄs; szĂĄmlĂĄlĂł; 1") +} + +#[test] +fn parts_function_square_root() -> Result<()> { + // square-root:function; parts "root" + let expr = r#" + + + x + + + "#; + assert_zoom_in("ZoomIn", expr, "nagyĂ­tĂĄs; gyök; x") +} + +#[test] +fn parts_silent_skip_super() -> Result<()> { + // skip-super:silent (degree); parts "base; superscript" + let expr = r#" + + + x + ° + + + "#; + assert_zoom_in("ZoomIn", expr, "nagyĂ­tĂĄs; alap; x") +} + +// --- Intents not in NavigationParts --- + +#[test] +fn no_parts_prefix_unary_minus() -> Result<()> { + // minus:prefix (Intent/general.yaml positive-or-negative) — silent "in" + let expr = r#" + + + - + b + + + "#; + assert_zoom_in("ZoomIn", expr, "nagyĂ­tĂĄs; b") +} + +#[test] +fn no_parts_prefix_limit() -> Result<()> { + // limit:prefix — silent "in" + let expr = r#" + + + x + + + "#; + assert_zoom_in("ZoomIn", expr, "nagyĂ­tĂĄs; x") +} + +#[test] +fn no_parts_prefix_vector() -> Result<()> { + // vector:prefix from mover + arrow + let expr = r#" + + + v + → + + + "#; + assert_zoom_in("ZoomIn", expr, "nagyĂ­tĂĄs; v") +} + +#[test] +fn no_parts_infix_binomial() -> Result<()> { + // binomial:infix (choose); no NavigationParts → "part 1" + let expr = r#" + + + ( + + 7 + 3 + + ) + + + "#; + assert_zoom_in("ZoomIn", expr, "nagyĂ­tĂĄs; rĂ©sz 1; 7") +} + +#[test] +fn no_parts_postfix_transpose() -> Result<()> { + // transpose:postfix — not prefix, so still announces its name + let expr = r#" + + + M + T + + + "#; + assert_zoom_in("ZoomIn", expr, "nagyĂ­tĂĄs; transzponĂĄlt; nagy m") +} + +#[test] +fn no_parts_function_absolute_value() -> Result<()> { + // absolute-value:function + let expr = r#" + + + | + x + | + + + "#; + assert_zoom_in("ZoomIn", expr, "nagyĂ­tĂĄs; az abszolĂșt Ă©rtĂ©k; x") +} + +#[test] +fn no_parts_silent_modified_variable() -> Result<()> { + // modified-variable:silent (x-hat) — no NavigationParts → silent + let expr = r#" + + + x + ^ + + + "#; + assert_zoom_in("ZoomIn", expr, "nagyĂ­tĂĄs; x") +} + +#[test] +fn no_parts_nofix_set_of_reals() -> Result<()> { + // set-of-reals:nofix — leaf + let expr = r#" + + R + + "#; + assert_zoom_in("ZoomIn", expr, "teljesen rĂĄközelĂ­tett; az összes valĂłs szĂĄm halmaza") +} + +// --- No intent= attribute (native MathML only; may still be inferred) --- + +#[test] +fn no_intent_sum_mrow() -> Result<()> { + let expr = r#" + + + x + + + y + + + "#; + assert_zoom_in("ZoomIn", expr, "nagyĂ­tĂĄs; x") +} + +#[test] +fn no_intent_times_mrow() -> Result<()> { + let expr = r#" + + + 2 + ⁢ + a + + + "#; + assert_zoom_in("ZoomIn", expr, "nagyĂ­tĂĄs; 2") +} + +#[test] +fn no_intent_mi() -> Result<()> { + let expr = r#" + + x + + "#; + assert_zoom_in("ZoomIn", expr, "teljesen rĂĄközelĂ­tett; x") +} + +// --- Move2D words (out of / start of / end of) and the zoom out / zoom in all commands --- +// +// Hungarian puts a case suffix on the part name ("a szĂĄmlĂĄlĂłban"), which cannot be built for arbitrary +// part names. So "in" is silent and the other words follow the part name: "szĂĄmlĂĄlĂł elhagyĂĄsa", +// "nevezƑ vĂ©ge", "szĂĄmlĂĄlĂł eleje". These tests check the fragments in order (not the exact separators +// or the speech of the node that is landed on) and that no English navigation word is left over. + +fn nav_speech(commands: &[&str], mathml: &str, auto_zoom_out: bool) -> Result { + init_nav_with_auto_zoom_out(mathml, auto_zoom_out)?; + let mut speech = String::new(); + for command in commands { + speech = do_navigate_command(command)?; + } + Ok(speech) +} + +/// Runs `commands` one after the other and checks the speech of the LAST one: every fragment must occur, +/// in the given order, and no English navigation word may be left over (AutoZoomOut is off). +fn assert_nav_fragments(commands: &[&str], mathml: &str, fragments: &[&str]) -> Result<()> { + assert_nav_fragments_with(commands, mathml, false, fragments) +} + +/// Like `assert_nav_fragments`, but with AutoZoomOut switched on. +fn assert_nav_fragments_auto_zoom_out(commands: &[&str], mathml: &str, fragments: &[&str]) -> Result<()> { + assert_nav_fragments_with(commands, mathml, true, fragments) +} + +fn assert_nav_fragments_with(commands: &[&str], mathml: &str, auto_zoom_out: bool, fragments: &[&str]) -> Result<()> { + init_panic_handler(); + let result = catch_unwind(AssertUnwindSafe(|| { + let speech = nav_speech(commands, mathml, auto_zoom_out)?; + let mut rest = speech.as_str(); + for fragment in fragments { + match rest.find(fragment) { + Some(pos) => rest = &rest[pos + fragment.len()..], + None => panic!("'{}' not found (in this order) in speech '{}'", fragment, speech), + } + } + let english = ["in", "out", "of", "start", "end", "zoom", "move", "cannot", "read", "describe", "current"]; + for word in speech.split(|c: char| !c.is_alphanumeric()) { + assert!(!english.contains(&word), "English word '{}' left in speech '{}'", word, speech); + } + Ok(()) + })); + report_any_panic(result) +} + +/// Runs `commands` and compares the speech of the LAST one exactly (trailing separators are ignored). +fn assert_nav_exact(commands: &[&str], mathml: &str, auto_zoom_out: bool, expected: &str) -> Result<()> { + init_panic_handler(); + let result = catch_unwind(AssertUnwindSafe(|| { + let speech = nav_speech(commands, mathml, auto_zoom_out)?; + assert_eq!(expected, speech.trim_end_matches([' ', ',', ';'])); + Ok(()) + })); + report_any_panic(result) +} + +const FRACTION: &str = r#" + + + 1 + 2 + + + "#; + +const POWER: &str = r#" + + + x + 2 + + + "#; + +/// 1/2 + y: the fraction has material to its right, so it is not at the edge of the math. +const FRACTION_PLUS_Y: &str = r#" + + + + 1 + 2 + + + + y + + + "#; + +/// y + 1/2: the fraction has material to its left. +const Y_PLUS_FRACTION: &str = r#" + + + y + + + + 1 + 2 + + + + "#; + +/// Native mmultiscripts: base x, postscripts (subscript 1, superscript 2), prescripts (subscript 3, superscript 4). +/// Children are: x, 1, 2, , 3, 4. Numbers are used for the scripts so the test does not depend +/// on how single letters are spoken. +const MULTISCRIPTS: &str = r#" + + + x + 1 + 2 + + 3 + 4 + + + "#; + +// --- ZoomOut / ZoomOutAll / ZoomInAll command phrases --- + +#[test] +fn zoom_out_of_numerator() -> Result<()> { + assert_nav_fragments(&["ZoomIn", "ZoomOut"], FRACTION, &["kicsinyĂ­tĂ©s", "szĂĄmlĂĄlĂł elhagyĂĄsa"]) +} + +#[test] +fn zoom_out_of_power_base() -> Result<()> { + assert_nav_fragments(&["ZoomIn", "ZoomOut"], POWER, &["kicsinyĂ­tĂ©s", "alap elhagyĂĄsa"]) +} + +#[test] +fn zoom_out_all_of_numerator() -> Result<()> { + // ZoomOutAll leaves every notation on the way up: the command phrase comes first, then the part that was left + assert_nav_fragments(&["ZoomIn", "ZoomOutAll"], FRACTION, &["teljes kicsinyĂ­tĂ©s", "szĂĄmlĂĄlĂł elhagyĂĄsa"]) +} + +#[test] +fn zoom_out_all_of_power_base() -> Result<()> { + assert_nav_fragments(&["ZoomIn", "ZoomOutAll"], POWER, &["teljes kicsinyĂ­tĂ©s", "alap elhagyĂĄsa"]) +} + +#[test] +fn zoom_out_at_top_of_math() -> Result<()> { + // first ZoomOut leaves the numerator, the second one reaches the top: "zoomed out all of the way" + assert_nav_fragments(&["ZoomIn", "ZoomOut", "ZoomOut"], FRACTION, &["teljesen kicsinyĂ­tve"]) +} + +#[test] +fn zoom_in_all_command_phrase() -> Result<()> { + assert_nav_fragments(&["ZoomInAll"], FRACTION, &["teljes nagyĂ­tĂĄs"]) +} + +// --- MoveNext / MovePrevious inside a notation and at its edges (AutoZoomOut off) --- + +#[test] +fn move_right_into_denominator() -> Result<()> { + assert_nav_fragments(&["ZoomIn", "MoveNext"], FRACTION, &["ugrĂĄs jobbra", "nevezƑ", "2"]) +} + +#[test] +fn move_right_at_end_of_denominator() -> Result<()> { + assert_nav_fragments(&["ZoomIn", "MoveNext", "MoveNext"], FRACTION, &["nem tud jobbra mozogni", "nevezƑ vĂ©ge"]) +} + +#[test] +fn move_left_at_start_of_numerator() -> Result<()> { + assert_nav_fragments(&["ZoomIn", "MovePrevious"], FRACTION, &["nem tud balra mozogni", "szĂĄmlĂĄlĂł eleje"]) +} + +#[test] +fn move_right_at_end_of_math_without_auto_zoom_out() -> Result<()> { + // With AutoZoomOut off, the "edge of the notation" rule fires first, even at the right end of the whole + // math: it says only "nem tud jobbra mozogni" (no part name, no "matematikai blokk vĂ©ge"). + let expr = r#" + + x + + "#; + assert_nav_exact(&["ZoomIn", "MoveNext"], expr, false, "nem tud jobbra mozogni") +} + +#[test] +fn move_left_at_start_of_math_without_auto_zoom_out() -> Result<()> { + let expr = r#" + + x + + "#; + assert_nav_fragments(&["ZoomIn", "MovePrevious"], expr, &["nem tud balra mozogni"]) +} + +// --- AutoZoomOut on: leaving a notation automatically ("out of" -> "elhagyĂĄsa") --- +// +// With AutoZoomOut == "True" the edge-of-notation rule is skipped. If there is more math beyond the notation, +// MoveNext/MovePrevious leave it automatically and say which part was left. Only at the very end of the math +// the "cannot move" announcement is made, followed by "matematikai blokk vĂ©ge" / "matematikai blokk kezdete". +// Expected walk through 1/2 + y: ZoomIn (fraction), ZoomIn (numerator), MoveNext (denominator), +// MoveNext (leaves the denominator, lands on "+"). + +#[test] +fn auto_zoom_out_move_right_leaves_denominator() -> Result<()> { + assert_nav_fragments_auto_zoom_out( + &["ZoomIn", "ZoomIn", "MoveNext", "MoveNext"], + FRACTION_PLUS_Y, + &["ugrĂĄs jobbra", "nevezƑ elhagyĂĄsa"], + ) +} + +#[test] +fn auto_zoom_out_move_left_leaves_numerator() -> Result<()> { + // y + 1/2: ZoomIn (y), MoveNext (+), MoveNext (fraction), ZoomIn (numerator), MovePrevious (leaves it) + assert_nav_fragments_auto_zoom_out( + &["ZoomIn", "MoveNext", "MoveNext", "ZoomIn", "MovePrevious"], + Y_PLUS_FRACTION, + &["ugrĂĄs balra", "szĂĄmlĂĄlĂł elhagyĂĄsa"], + ) +} + +#[test] +fn auto_zoom_out_move_right_at_end_of_math() -> Result<()> { + let expr = r#" + + x + + "#; + assert_nav_fragments_auto_zoom_out(&["ZoomIn", "MoveNext"], expr, &["nem tud jobbra mozogni", "matematikai blokk vĂ©ge"]) +} + +#[test] +fn auto_zoom_out_read_and_describe_right_at_end_of_math() -> Result<()> { + let expr = r#" + + x + + "#; + assert_nav_fragments_auto_zoom_out(&["ZoomIn", "ReadNext"], expr, &["nem tud jobbra olvasni", "matematikai blokk vĂ©ge"])?; + assert_nav_fragments_auto_zoom_out(&["ZoomIn", "DescribeNext"], expr, &["nem tud jobbra leĂ­rni", "matematikai blokk vĂ©ge"]) +} + +#[test] +fn auto_zoom_out_move_left_at_start_of_math() -> Result<()> { + let expr = r#" + + x + + "#; + assert_nav_fragments_auto_zoom_out(&["ZoomIn", "MovePrevious"], expr, &["matematikai blokk kezdete"]) +} + +// --- mmultiscripts part names --- +// +// Children of the mmultiscripts: base, subscript, superscript, , pre-subscript, pre-superscript. +// The names are "alap", "alsĂł index", "felsƑ index", "bal alsĂł index" and "bal felsƑ index". + +#[test] +fn multiscripts_zoom_in_base() -> Result<()> { + assert_nav_fragments(&["ZoomIn"], MULTISCRIPTS, &["nagyĂ­tĂĄs", "alap", "x"]) +} + +#[test] +fn multiscripts_move_right_to_subscript() -> Result<()> { + assert_nav_fragments(&["ZoomIn", "MoveNext"], MULTISCRIPTS, &["ugrĂĄs jobbra", "alsĂł index", "1"]) +} + +#[test] +fn multiscripts_move_right_to_superscript() -> Result<()> { + assert_nav_fragments(&["ZoomIn", "MoveNext", "MoveNext"], MULTISCRIPTS, &["ugrĂĄs jobbra", "felsƑ index", "2"]) +} + +#[test] +fn multiscripts_move_right_to_pre_subscript() -> Result<()> { + assert_nav_fragments(&["ZoomIn", "MoveNext", "MoveNext", "MoveNext"], MULTISCRIPTS, &["ugrĂĄs jobbra", "bal alsĂł index", "3"]) +} + +#[test] +fn multiscripts_move_right_to_pre_superscript() -> Result<()> { + assert_nav_fragments( + &["ZoomIn", "MoveNext", "MoveNext", "MoveNext", "MoveNext"], + MULTISCRIPTS, + &["ugrĂĄs jobbra", "bal felsƑ index", "4"], + ) +} + +#[test] +fn multiscripts_move_left_to_base() -> Result<()> { + assert_nav_fragments(&["ZoomIn", "MoveNext", "MovePrevious"], MULTISCRIPTS, &["ugrĂĄs balra", "alap", "x"]) +} + +#[test] +fn multiscripts_zoom_out_of_base() -> Result<()> { + assert_nav_fragments(&["ZoomIn", "ZoomOut"], MULTISCRIPTS, &["kicsinyĂ­tĂ©s", "alap elhagyĂĄsa"]) +} + +#[test] +fn multiscripts_zoom_out_of_pre_superscript() -> Result<()> { + assert_nav_fragments( + &["ZoomIn", "MoveNext", "MoveNext", "MoveNext", "MoveNext", "ZoomOut"], + MULTISCRIPTS, + &["kicsinyĂ­tĂ©s", "bal felsƑ index elhagyĂĄsa"], + ) +} + +// --- ReadCurrent / DescribeCurrent --- + +#[test] +fn read_current() -> Result<()> { + assert_nav_fragments(&["ZoomIn", "ReadCurrent"], FRACTION, &["az aktuĂĄlis elem felolvasĂĄsa"]) +} + +#[test] +fn describe_current() -> Result<()> { + assert_nav_fragments(&["ZoomIn", "DescribeCurrent"], FRACTION, &["az aktuĂĄlis elem leĂ­rĂĄsa"]) +} From afe0f25489ffcb6e994643b8b68f06260d1ea72b Mon Sep 17 00:00:00 2001 From: hammera Date: Wed, 7 Oct 2026 02:37:51 +0200 Subject: [PATCH 154/162] src/canonicalize.rs: apply clippy fixes with two places (#850) Signed-off-by: Attila Hammer --- src/canonicalize.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/canonicalize.rs b/src/canonicalize.rs index 0e0a81447..0ccf108fa 100644 --- a/src/canonicalize.rs +++ b/src/canonicalize.rs @@ -1684,12 +1684,12 @@ impl CanonicalizeContext { return mathml; } else if has_subscript { set_mathml_name(mathml, "msub"); - let children = vec!(children[0], children[1]); + let children = vec![children[0], children[1]]; mathml.replace_children(children); return mathml; } else if has_superscript { set_mathml_name(mathml, "msup"); - let children = vec!(children[0], children[2]); + let children = vec![children[0], children[2]]; mathml.replace_children(children); return mathml; } else { From 9b176b97e754b57a0ee9d2ce6ca3b2bbd7899594 Mon Sep 17 00:00:00 2001 From: Danil <81031453+Kostenkov-2021@users.noreply.github.com> Date: Wed, 7 Oct 2026 03:51:02 +0300 Subject: [PATCH 155/162] Fix intent detection for limits and norms (#840) This commit improves intent recognition for several TeX-derived patterns: it ignores the invisible function-application character when matching limit expressions, treats TeX's gathered environments as lines, and recognizes subscripted norms from TeX4ht and canonicalized MathML shapes. These fixes keep speech and navigation output consistent for common display math cases. --- Rules/Intent/general.yaml | 18 ++++++++++++- Rules/Intent/linear-algebra.yaml | 43 ++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/Rules/Intent/general.yaml b/Rules/Intent/general.yaml index 54303de79..e16521589 100644 --- a/Rules/Intent/general.yaml +++ b/Rules/Intent/general.yaml @@ -347,7 +347,7 @@ - name: limit tag: [msub, munder] - variables: [NoSpacesBase: "translate(*[1], ' \u00A0\u2004\u2005\u2006\u2007\u2008\u2009\u200A','')"] # Sometimes these have (weird) spaces in them + variables: [NoSpacesBase: "translate(*[1], ' \u00A0\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2061','')"] # Sometimes these have spaces or an invisible function-application character in them match: "*[1][$NoSpacesBase='lim' or $NoSpacesBase='limsup' or $NoSpacesBase='liminf']" replace: - intent: @@ -809,6 +809,22 @@ variables: [TableProperty: "'determinant'"] replace: [x: "*[2]"] +- + # TeX's gathered environment is one derivation split across display lines, + # not a system whose rows are independent equations. + name: mtable-gathered-property + tag: mtable + match: "contains(concat(' ', normalize-space(@class), ' '), ' gathered ')" + replace: + - with: + variables: + - TableProperty: "'lines'" + replace: + - intent: + name: "lines" + children: + - x: "*" + - name: mtable-equations-property tag: mtable diff --git a/Rules/Intent/linear-algebra.yaml b/Rules/Intent/linear-algebra.yaml index f8c8fd7bf..4b7afe816 100644 --- a/Rules/Intent/linear-algebra.yaml +++ b/Rules/Intent/linear-algebra.yaml @@ -39,6 +39,49 @@ - x: "*[1]/*[2]" # grab the contents of the bracketed expr - x: "*[2]" +- + # TeX4ht commonly attaches the norm's subscript to the closing bar only: + # ∄...∄p. + name: norm-with-subscripted-closing-bar + tag: mrow + match: + - "count(*) >= 3 and *[1][.='∄'] and *[last()][self::m:msub and *[1][.='∄']]" + replace: + - intent: + name: "subscripted-norm" + attrs: "data-intent-property='concat(data-intent-property, \":function:\")'" + children: + - x: "*[position() > 1 and position() < last()]" + - x: "*[last()]/*[2]" + +- + # The same TeX4ht shape can use two ordinary vertical bars for each double bar. + name: norm-with-doubled-bars-and-subscripted-closing-bar + tag: mrow + match: + - "count(*) >= 5 and *[1][.='|'] and *[2][.='|'] and *[last()-1][.='|'] and *[last()][self::m:msub and *[1][.='|']]" + replace: + - intent: + name: "subscripted-norm" + attrs: "data-intent-property='concat(data-intent-property, \":function:\")'" + children: + - x: "*[position() > 2 and position() < last()-1]" + - x: "*[last()]/*[2]" + +- + # Canonicalization groups ||x||_p as an indexed row containing a nested |x|. + name: norm-with-canonicalized-doubled-bars + tag: msub + match: + - "*[1][self::m:mrow and count(*)=3 and *[1][.='|'] and *[2][self::m:mrow and IsBracketed(., '|', '|')] and *[3][.='|']]" + replace: + - intent: + name: "subscripted-norm" + attrs: "data-intent-property='concat(data-intent-property, \":function:\")'" + children: + - x: "*[1]/*[2]/*[2]" + - x: "*[2]" + - name: vector-magnitude tag: mrow From 85c89a37073d6efdb08efba5765dd69c7efddaf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Wed, 7 Oct 2026 23:40:22 +0200 Subject: [PATCH 156/162] Improve translator alert workflow by including file links in notifications (#852) --- .github/workflows/translator-alert.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/translator-alert.yml b/.github/workflows/translator-alert.yml index 0ceacbae1..3a1ecd60a 100644 --- a/.github/workflows/translator-alert.yml +++ b/.github/workflows/translator-alert.yml @@ -136,11 +136,16 @@ jobs: ? Array.from(shaSet).map(sha => `- https://github.com/${context.repo.owner}/${context.repo.repo}/commit/${sha}`).join("\n") : "(No commits specifically touched monitored files)"; + const fileLinks = matchedList.map(file => { + const encodedPath = file.split("/").map(encodeURIComponent).join("/"); + return `- [${file}](https://github.com/${context.repo.owner}/${context.repo.repo}/blob/${context.sha}/${encodedPath})`; + }).join("\n"); + const body = ` Changes detected in english files. Changed files: - ${JSON.stringify(matchedList, null, 2)} + ${fileLinks} See changes in the commits affecting monitored files: ${commitUrls} From 72e41baf2e18c7ea501c8ae58791a3409c87eae8 Mon Sep 17 00:00:00 2001 From: Angelo <129183227+AnGabSS@users.noreply.github.com> Date: Fri, 16 Oct 2026 20:35:45 -0300 Subject: [PATCH 157/162] docs: create the CONTRIBUTING.md file for newcomers (#860) --- CONTRIBUTING.md | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..ad245cc67 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,56 @@ +# Contributing to MathCAT + +Thanks for your interest in MathCAT! This is a short intro to get you started. +For more detail, see the [full documentation](https://daisy.github.io/MathCAT/). + +## Ways to help + +- **Report bugs / suggest features:** open an [issue](https://github.com/daisy/MathCAT/issues). + Include the MathML input, the output you got, and the output you expected + (the [MathCAT Demo](https://daisy.github.io/MathCATDemo/) is handy for this). +- **Code:** fixes and improvements to the Rust library (`src/`) or the rules (`Rules/`). +- **Translations:** translators have their own guide. Start with + [information for translators/rule writers](https://daisy.github.io/MathCAT/helpers.html). + If you want to add a new language, please open an issue first. + +## Getting set up + +1. Install [Rust](https://www.rust-lang.org/tools/install). +2. Fork and clone the repo. +3. Build and run the tests: + ```bash + cargo build + cargo test + ``` +4. For the Python tooling (e.g. translation audits), use [uv](https://docs.astral.sh/uv/). + See [`PythonScripts/README.md`](PythonScripts/README.md). + +The [Developer Guide](docs/developers.md) has more on testing and coverage. + +## Pull requests + +- Keep PRs focused: one fix or feature per PR. +- **Add relevant unit tests whenever it makes sense.** A bug fix should usually include + a test that would have caught it. Trivial changes (e.g. fixing a typo in a comment) + don't need one. +- Make sure `cargo test` and `cargo clippy` pass. CI runs both and treats warnings as errors. +- Don't change expected outputs (speech/braille/navigation strings) in existing tests + unless that change is the point of your PR. If so, explain why in the description. +- Link the issue your PR addresses, if there is one. + +## Using AI tools + +Using AI to help write code is fine. You are still responsible for what you submit: +review it, understand it, and test it. + +Issues, PR descriptions, and comments should be **written by a human**. If you want to +include AI-generated text, put it in a clearly labeled block at the end, for example: + +> **AI summary:** . + +Nobody should have to read through walls of generated text to find out what you mean. + +## Questions? + +Open an issue or ask in the relevant issue/PR thread. We're happy to help. + From 4ad434d98810405e7d0d07360c605338c884dada Mon Sep 17 00:00:00 2001 From: Lexo Liu Date: Sun, 18 Oct 2026 16:46:17 -0400 Subject: [PATCH 158/162] deps: upgrade zip to 9.x (#861) --- Cargo.lock | 27 +++++++++++++++++++++++---- Cargo.toml | 6 +++--- src/bin/package_rules.rs | 2 +- src/rules_archive.rs | 2 +- src/shim_filesystem.rs | 2 +- 5 files changed, 29 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 66743aed7..f1468ae2d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -233,6 +233,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + [[package]] name = "clap" version = "4.6.1" @@ -750,9 +756,9 @@ checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" [[package]] name = "libc" -version = "0.2.182" +version = "0.2.191" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" +checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" [[package]] name = "libredox" @@ -892,6 +898,18 @@ dependencies = [ "jni-sys 0.3.1", ] +[[package]] +name = "nix" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "cfg_aliases", + "libc", +] + [[package]] name = "num-bigint" version = "0.4.6" @@ -2075,15 +2093,16 @@ dependencies = [ [[package]] name = "zip" -version = "8.6.0" +version = "9.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d04a6b5381502aa6087c94c669499eb1602eb9c5e8198e534de571f7154809b" +checksum = "a954114b47a54df49f83d2722814e86b23d4bb1b54a1b90fb7d92b41619ddc22" dependencies = [ "bzip2", "crc32fast", "flate2", "indexmap", "memchr", + "nix", "typed-path", "zopfli", ] diff --git a/Cargo.toml b/Cargo.toml index a51507536..86f7606b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,8 +44,8 @@ elements_rs = { version = "0.2.8", default-features = false } # Runtime extracts inner language/braille zips (BZIP2). The package-rules binary also # writes DEFLATE outer archives for Windows/unzip-compatible Rules.zip downloads. -# wasm uses the same features: zip 8.x bzip2 is pure Rust (libbz2-rs-sys), not clang C. -zip = { version = "8.2", default-features = false, features = ["deflate", "bzip2"] } +# wasm uses the same features: zip 9.x bzip2 is pure Rust (libbz2-rs-sys), not clang C. +zip = { version = "9.0", default-features = false, features = ["deflate", "bzip2"] } android_logger = {version = "0.15.1", optional = true} natural-tts = { version = "0.3.1", optional = true } @@ -53,7 +53,7 @@ natural-tts = { version = "0.3.1", optional = true } [build-dependencies] bitflags = "2.6" yaml-rust = "0.4" -zip = { version = "8.2", default-features = false, features = ["deflate", "bzip2"] } +zip = { version = "9.0", default-features = false, features = ["deflate", "bzip2"] } [dev-dependencies] tempfile = "3.23" diff --git a/src/bin/package_rules.rs b/src/bin/package_rules.rs index 971e95175..d14bfe659 100644 --- a/src/bin/package_rules.rs +++ b/src/bin/package_rules.rs @@ -87,7 +87,7 @@ mod tests { fn outer_names(bytes: &[u8]) -> Vec { let mut archive = ZipArchive::new(Cursor::new(bytes)).unwrap(); let mut names: Vec = (0..archive.len()) - .map(|i| archive.by_index(i).unwrap().name().replace('\\', "/")) + .map(|i| archive.by_index(i).unwrap().name().unwrap().replace('\\', "/")) .collect(); names.sort(); return names; diff --git a/src/rules_archive.rs b/src/rules_archive.rs index 938937683..e76dc1597 100644 --- a/src/rules_archive.rs +++ b/src/rules_archive.rs @@ -7,7 +7,7 @@ // // Inner language/braille zips always use BZIP2. Downloadable `Rules.zip` uses DEFLATE for the // outer archive so Windows Explorer / `unzip` can open it. The include-zip embed uses BZIP2 -// for both layers (MathCAT's `zip` crate reads it; zip 8.x bzip2 is pure Rust and works on wasm). +// for both layers (MathCAT's `zip` crate reads it; zip 9.x bzip2 is pure Rust and works on wasm). use std::fs::{self, File, read_dir}; use std::io::{self, Cursor, Read, Seek, Write}; diff --git a/src/shim_filesystem.rs b/src/shim_filesystem.rs index d539a6300..ce5159c5c 100644 --- a/src/shim_filesystem.rs +++ b/src/shim_filesystem.rs @@ -108,7 +108,7 @@ cfg_if! { let path = match file.enclosed_name() { Some(path) => PathBuf::from(containing_dir).join(path), None => { - bail!("Entry {} has a suspicious path (outside of archive)", file.name()); + bail!("Entry {} has a suspicious path (outside of archive)", String::from_utf8_lossy(file.name_raw())); } }; // debug!("read_zip_file: file path='{}'", path.display()); From 793fcb77633d550e5ca77f339744bf571e5d5b25 Mon Sep 17 00:00:00 2001 From: Quin Gillespie Date: Sun, 18 Oct 2026 17:52:51 -0600 Subject: [PATCH 159/162] Add lang-* and braille-* features to choose which rules include-zip embeds (#816) Every language and braille code has a feature, all on by default through rules-all, so existing builds embed exactly the same rules.zip. A build that turns off default features and names a subset embeds only those directories. en is always kept because the library falls back to it, a subset with no braille code keeps UEB so set_rules_dir still succeeds, and the staged prefs.yaml BrailleCode default is pointed at a kept code when Nemeth was pruned. build.rs fails if a Rules directory has no feature in lang-all or braille-all, so the lists cannot silently fall behind. Co-authored-by: NSoiffer --- AGENTS.md | 2 +- Cargo.toml | 37 ++++++++++++ build.rs | 63 +++++++++++++++++++- src/rules_archive.rs | 136 +++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 231 insertions(+), 7 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 7093cf698..d752728e2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -12,7 +12,7 @@ but add common mistakes of AI agents here instead. - Common per-language files: - `ClearSpeak_Rules.yaml`, `SimpleSpeak_Rules.yaml` - `SharedRules/`, `unicode.yaml`, `unicode-full.yaml`, `definitions.yaml`, `navigate.yaml` -- `build.rs` can bundle rules into `rules.zip` when `include-zip` is enabled (always the minimized tree). Shared zipper: `src/rules_archive.rs`, invoked as `cargo run --bin package-rules -- Rules [--minimize]`. +- `build.rs` can bundle rules into `rules.zip` when `include-zip` is enabled (always the minimized tree). The `lang-*` / `braille-*` features (all on by default via `rules-all`) choose which `Languages/` and `Braille/` directories it embeds; every rules directory needs a feature listed in `lang-all` / `braille-all`, and `build.rs` fails without one. Shared zipper: `src/rules_archive.rs`, invoked as `cargo run --bin package-rules -- Rules [--minimize]`. - CI packages `Rules.zip` (verbatim) and `Rules-minimized.zip` (comments stripped from `Languages/**/unicode.yaml` and `unicode-full.yaml` only). Each language/braille subdir is stored as `/.zip`; top-level and `Intent/` YAML stay loose. Inner language zips use BZIP2; the outer downloadable archive uses DEFLATE so `unzip` works. Both omit `Languages/zz`; the `test-rules-package` job restores `zz` from git after unzip so unit tests still run against release-like archives. ## Translation Conventions diff --git a/Cargo.toml b/Cargo.toml index 86f7606b6..f479aeb2c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,12 +12,49 @@ exclude = ["src/main.rs", "docs", "BrailleDocs", "PythonScripts"] # should ha [features] +default = ["rules-all"] "rule-coverage" = ["dep:serde_json"] "include-zip" = [] "enable-logs" = ["android_logger"] "tts" = [ "natural-tts" ] "no-unsafe" = ["sxd-document-no-unsafe/no-unsafe", "sxd-xpath-no-unsafe/no-unsafe"] +# Which Rules/Languages and Rules/Braille directories `include-zip` embeds. Every one is on by default. +# To embed fewer, turn off default features and name the ones you want, for example +# `default-features = false, features = ["include-zip", "lang-en", "braille-ueb"]`. +# `en` is always embedded because the library falls back to it, and `build.rs` fails if a rules +# directory has no feature here or is missing from `lang-all` / `braille-all`. +# MathCAT itself never asks for ASCIIMath or LaTeX, but an application that copies math in those +# notations does so through the braille API, so it needs `braille-asciimath` / `braille-latex`. +# These only change what is embedded: without `include-zip`, the Rules directory is read from disk. +rules-all = ["lang-all", "braille-all"] +lang-all = ["lang-de", "lang-el", "lang-en", "lang-es", "lang-fi", "lang-fr", "lang-hu", "lang-id", "lang-nb", "lang-pl", "lang-pt", "lang-ru", "lang-sv", "lang-vi", "lang-zh"] +braille-all = ["braille-asciimath", "braille-cmu", "braille-french", "braille-latex", "braille-nemeth", "braille-russian", "braille-swedish", "braille-ueb", "braille-vietnam"] +lang-de = [] +lang-el = [] +lang-en = [] +lang-es = [] +lang-fi = [] +lang-fr = [] +lang-hu = [] +lang-id = [] +lang-nb = [] +lang-pl = [] +lang-pt = [] +lang-ru = [] +lang-sv = [] +lang-vi = [] +lang-zh = [] +braille-asciimath = [] +braille-cmu = [] +braille-french = [] +braille-latex = [] +braille-nemeth = [] +braille-russian = [] +braille-swedish = [] +braille-ueb = [] +braille-vietnam = [] + [dependencies] sxd-document-no-unsafe = "0.4.2" diff --git a/build.rs b/build.rs index e5a07cd8d..f2f2862fd 100644 --- a/build.rs +++ b/build.rs @@ -6,21 +6,80 @@ include!("src/rules_archive.rs"); +/// The `Rules/` directories whose `-` feature is on, or `None` when all of them +/// are, so a default build stages exactly what it always has. +/// +/// Panics if a directory is missing from `-all` in Cargo.toml. Otherwise a newly added +/// language or braille code would quietly drop out of every build, since nothing would turn it on. +fn subset_from_features(rules_dir: &Path, kind: &str, prefix: &str, manifest: &str) -> Option> { + let all_feature = format!("{}-all", prefix); + // The list can span lines: `cargo publish` rewrites Cargo.toml with one entry per line. + let all_list = manifest + .split(&format!(" +{} = [", all_feature)) + .nth(1) + .and_then(|rest| rest.split(']').next()) + .unwrap_or_else(|| panic!("Cargo.toml has no `{}` feature", all_feature)); + let mut kept = Vec::new(); + let mut everything = true; + for entry in read_dir(rules_dir.join(kind)).unwrap() { + let path = entry.unwrap().path(); + let name = path.file_name().unwrap().to_string_lossy().to_string(); + if !path.is_dir() || (kind == LANGUAGES_DIR && name == SKIP_LANGUAGE_DIR) { + continue; + } + let feature = format!("{}-{}", prefix, name.to_ascii_lowercase()); + if !all_list.contains(&format!("\"{}\"", feature)) { + panic!( + "Rules/{}/{} has no feature: add `{} = []` to Cargo.toml and list it in `{}`", + kind, name, feature, all_feature + ); + } + let env_var = format!("CARGO_FEATURE_{}", feature.to_ascii_uppercase().replace('-', "_")); + if std::env::var_os(env_var).is_some() { + kept.push(name); + } else { + everything = false; + } + } + kept.sort(); + return if everything { None } else { Some(kept) }; +} + fn main() { println!("cargo::rerun-if-changed=build.rs"); println!("cargo::rerun-if-changed=src/rules_archive.rs"); println!("cargo::rerun-if-changed=Rules"); + println!("cargo::rerun-if-changed=Cargo.toml"); + + let rules_dir = std::env::current_dir().unwrap().join("Rules"); + let manifest = fs::read_to_string("Cargo.toml").unwrap(); + // Checked on every build, not only include-zip ones, so a rules directory added without a + // feature is caught by whoever adds it. + let languages = subset_from_features(&rules_dir, LANGUAGES_DIR, "lang", &manifest); + let braille_codes = subset_from_features(&rules_dir, BRAILLE_DIR, "braille", &manifest); // This doesn't work because the build claims OUT_DIR is not defined(?) // let archive = PathBuf::from(concat!(env!("OUT_DIR"),"/rules.zip")); if std::env::var("CARGO_FEATURE_INCLUDE_ZIP").is_ok() { let out_dir = PathBuf::from(std::env::var_os("OUT_DIR").unwrap()); - let rules_dir = std::env::current_dir().unwrap().join("Rules"); let staging = out_dir.join("rules_src"); if staging.exists() { let _ = std::fs::remove_dir_all(&staging); } - if let Err(e) = copy_rules_tree(&rules_dir, &staging, true) { + let subset = RulesSubset { languages, braille_codes }; + if let Some(langs) = &subset.languages { + let mut langs = langs.clone(); + if !langs.iter().any(|l| l.eq_ignore_ascii_case("en")) { + langs.push("en (the fallback)".to_string()); + } + println!("cargo::warning=MathCAT rules limited to languages: {}", langs.join(", ")); + } + if let Some(codes) = &subset.braille_codes { + let codes = if codes.is_empty() { "UEB (the fallback)".to_string() } else { codes.join(", ") }; + println!("cargo::warning=MathCAT rules limited to braille codes: {}", codes); + } + if let Err(e) = copy_rules_subset(&rules_dir, &staging, true, &subset) { panic!("build.rs failed to stage minimized Rules: {}", e); } let archive_path = out_dir.join("rules.zip"); diff --git a/src/rules_archive.rs b/src/rules_archive.rs index e76dc1597..e12dd9d55 100644 --- a/src/rules_archive.rs +++ b/src/rules_archive.rs @@ -20,6 +20,56 @@ use zip::CompressionMethod; const YAML_SUFFIXES: [&str; 2] = ["yaml", "yml"]; const SKIP_LANGUAGE_DIR: &str = "zz"; const ARCHIVE_ROOT: &str = "Rules"; +const LANGUAGES_DIR: &str = "Languages"; +const BRAILLE_DIR: &str = "Braille"; +const PREFS_FILE: &str = "prefs.yaml"; +const BRAILLE_CODE_PREF: &str = "BrailleCode"; +/// `find_file` falls back to this language by name, so it cannot be pruned away. +const FALLBACK_LANGUAGE: &str = "en"; +/// `set_rules_dir` fails unless the default braille code's directory exists, even for a caller that +/// never asks for braille, so a subset that keeps no braille code keeps this one. +const FALLBACK_BRAILLE_CODE: &str = "UEB"; + +/// Which `Languages/` and `Braille/` directories to keep, by directory name. +/// +/// The full Rules tree is about 10 MB, and a caller that only ever asks for one language and one +/// braille code pays for all of it: `include-zip` embeds every directory in the binary. `None` +/// means keep everything, which is what every existing caller gets. `build.rs` fills this in from +/// the `lang-*` and `braille-*` features. +#[derive(Clone, Default)] +pub struct RulesSubset { + pub languages: Option>, + pub braille_codes: Option>, +} + +impl RulesSubset { + /// Keeps everything, the behaviour before this existed. + pub fn all() -> Self { + return RulesSubset::default(); + } + + /// Regional variants such as `en/gb` and `zh/tw` live inside their language's directory, so + /// keeping a language keeps them too. + fn keeps(wanted: &Option>, name: &str) -> bool { + let Some(wanted) = wanted else { + return true; + }; + return wanted.iter().any(|w| w.eq_ignore_ascii_case(name)); + } + + fn keeps_language(&self, name: &str) -> bool { + // `find_file` falls back to "en" by name from inside the library, so a subset without it + // cannot resolve anything. + return name.eq_ignore_ascii_case(FALLBACK_LANGUAGE) || RulesSubset::keeps(&self.languages, name); + } + + fn keeps_braille_code(&self, name: &str) -> bool { + if self.braille_codes.as_ref().is_some_and(|codes| codes.is_empty()) { + return name.eq_ignore_ascii_case(FALLBACK_BRAILLE_CODE); + } + return RulesSubset::keeps(&self.braille_codes, name); + } +} /// Compression methods for nested language zips vs the outer archive. #[derive(Clone, Copy)] @@ -249,17 +299,95 @@ fn minimize_yaml_file(src: &Path, dst: &Path) -> Result<(), String> { /// Copy a Rules tree. When `minify` is true, rewrite every YAML file as comment-free flow YAML. /// `Languages/zz` is omitted. Returns the number of files successfully minimized. pub fn copy_rules_tree(src: &Path, dst: &Path, minify: bool) -> io::Result { + return copy_rules_subset(src, dst, minify, &RulesSubset::all()); +} + +/// As [`copy_rules_tree`], keeping only the languages and braille codes `subset` asks for. +pub fn copy_rules_subset(src: &Path, dst: &Path, minify: bool, subset: &RulesSubset) -> io::Result { fs::create_dir_all(dst)?; - return copy_dir(src, dst, minify, false); + let minimized = copy_dir(src, dst, minify, None, subset)?; + if let Some(codes) = &subset.braille_codes { + set_default_braille_code(&dst.join(PREFS_FILE), codes)?; + } + return Ok(minimized); } -fn copy_dir(src: &Path, dst: &Path, minify: bool, parent_is_languages: bool) -> io::Result { +/// Points the `BrailleCode` default in a staged `prefs.yaml` at the first of `kept` (or at +/// [`FALLBACK_BRAILLE_CODE`] when it is empty) when the default was pruned, and leaves it alone when +/// it was kept. +/// +/// Without this, the default (Nemeth) and the library's own fallback (UEB) are both missing from a +/// subset that asked for neither, and `set_rules_dir` reports that it could not read the braille +/// directory. Keeping Nemeth and UEB instead would cost about 50 KB for rules nothing asks for. +fn set_default_braille_code(prefs: &Path, kept: &[String]) -> io::Result<()> { + let text = fs::read_to_string(prefs)?; + let docs = YamlLoader::load_from_str(&text).map_err(io::Error::other)?; + let current = docs.iter().find_map(|doc| find_value(doc, BRAILLE_CODE_PREF)); + if current.is_some_and(|current| kept.iter().any(|code| code.eq_ignore_ascii_case(current))) { + return Ok(()); + } + let code = kept.first().map_or(FALLBACK_BRAILLE_CODE, |code| code.as_str()); + let mut out = String::new(); + for (i, doc) in docs.iter().enumerate() { + if i > 0 { + out.push_str("\n---\n"); + } + emit_flow(&mut out, &with_replaced_value(doc, BRAILLE_CODE_PREF, code)).map_err(io::Error::other)?; + } + out.push('\n'); + fs::write(prefs, out)?; + return Ok(()); +} + +/// The string value of the first `key` entry in `yaml`, at any depth. +fn find_value<'a>(yaml: &'a Yaml, key: &str) -> Option<&'a str> { + match yaml { + Yaml::Hash(hash) => { + return hash.iter().find_map(|(k, v)| match (k, v) { + (Yaml::String(name), Yaml::String(value)) if name == key => Some(value.as_str()), + _ => find_value(v, key), + }); + } + Yaml::Array(items) => return items.iter().find_map(|item| find_value(item, key)), + _ => return None, + } +} + +/// `yaml` with the value of every `key` entry, at any depth, replaced by `value`. +fn with_replaced_value(yaml: &Yaml, key: &str, value: &str) -> Yaml { + match yaml { + Yaml::Hash(hash) => { + let mut out = yaml_rust::yaml::Hash::new(); + for (k, v) in hash { + let replace = matches!(k, Yaml::String(name) if name == key); + let v = if replace { Yaml::String(value.to_string()) } else { with_replaced_value(v, key, value) }; + out.insert(k.clone(), v); + } + return Yaml::Hash(out); + } + Yaml::Array(items) => { + return Yaml::Array(items.iter().map(|item| with_replaced_value(item, key, value)).collect()); + } + other => return other.clone(), + } +} + +fn copy_dir( + src: &Path, + dst: &Path, + minify: bool, + parent: Option<&str>, + subset: &RulesSubset, +) -> io::Result { let mut minimized = 0usize; for entry in read_dir(src)? { let entry = entry?; let src_path = entry.path(); let name = file_name_str(&src_path)?; - if parent_is_languages && name == SKIP_LANGUAGE_DIR { + if parent == Some(LANGUAGES_DIR) && (name == SKIP_LANGUAGE_DIR || !subset.keeps_language(&name)) { + continue; + } + if parent == Some(BRAILLE_DIR) && src_path.is_dir() && !subset.keeps_braille_code(&name) { continue; } if is_zip_file(&src_path) { @@ -268,7 +396,7 @@ fn copy_dir(src: &Path, dst: &Path, minify: bool, parent_is_languages: bool) -> let dst_path = dst.join(&name); if src_path.is_dir() { fs::create_dir_all(&dst_path)?; - minimized += copy_dir(&src_path, &dst_path, minify, name == "Languages")?; + minimized += copy_dir(&src_path, &dst_path, minify, Some(name.as_str()), subset)?; } else if minify && is_yaml_file(&src_path) { match minimize_yaml_file(&src_path, &dst_path) { Ok(()) => minimized += 1, From a0c9761c917708210c2de5b12e2fd83b2d4604c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Mon, 19 Oct 2026 02:02:12 +0200 Subject: [PATCH 160/162] Simplify `is_leaf_any_name` (#829) --- src/xpath_functions.rs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/xpath_functions.rs b/src/xpath_functions.rs index d4b174adf..65e651ff2 100644 --- a/src/xpath_functions.rs +++ b/src/xpath_functions.rs @@ -392,13 +392,7 @@ impl Function for IsNode { fn is_leaf_any_name(e: Element) -> bool { let children = e.children(); - if children.is_empty() { - return true; - } else if children.len() == 1 && - let ChildOfElement::Text(_) = children[0] { - return true; - } - return false + return children.is_empty() || (children.len() == 1 && children[0].text().is_some()); } } } From 7e2df541923aa2fe50156d412817e3a707875c7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Mon, 19 Oct 2026 02:48:07 +0200 Subject: [PATCH 161/162] simplify some Vector handling (#828) * simplify some Vector handling * undo changes in `is_structural` --- src/braille.rs | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/braille.rs b/src/braille.rs index 4f0ac0ec7..b202dc62c 100644 --- a/src/braille.rs +++ b/src/braille.rs @@ -2289,19 +2289,14 @@ fn handle_contractions(full_chars: &[char], start: usize, end: usize, mut result } fn init_patterns(contractions: &[Replacement]) -> RegexSet { - let mut vec: Vec<&str> = Vec::with_capacity(contractions.len()); - for contraction in contractions { - vec.push(&contraction.pattern); - } - return RegexSet::new(&vec).unwrap(); + let patterns = contractions.iter().map(|c| c.pattern.as_str()); + return RegexSet::new(patterns).unwrap(); } fn init_regex(contractions: &[Replacement]) -> Vec { - let mut vec = Vec::with_capacity(contractions.len()); - for contraction in contractions { - vec.push(Regex::new(&contraction.pattern).unwrap()); - } - return vec; + return contractions.iter() + .map(|c| Regex::new(&c.pattern).unwrap()) + .collect(); } } From 95892aba39d1660f41794dd0579f154da960bcf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Mon, 19 Oct 2026 02:52:03 +0200 Subject: [PATCH 162/162] Refactor comma-check logic in `is_leaf_any_name` (#830) --- src/xpath_functions.rs | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/xpath_functions.rs b/src/xpath_functions.rs index 65e651ff2..dd7def12a 100644 --- a/src/xpath_functions.rs +++ b/src/xpath_functions.rs @@ -858,24 +858,17 @@ impl IsBracketed { return false; } - if requires_comma { - if let ChildOfElement::Element(contents) = children[1] { - let children = contents.children(); - if !is_tag(contents, "mrow") || children.len() <= 1 { - return false; - } - // finally, we can check for a comma -- we might not have operands, so we to check first and second entry - if get_text_from_COE(&children[0]).as_str() == "," { - return true; - } - if children.len() > 1 && get_text_from_COE(&children[1]).as_str() == "," { - return true; - } - } - return false; - } else { + if !requires_comma { return true; } + let Some(contents) = children[1].element() else { + return false; + }; + let children = contents.children(); + // The comma can be the first or second child when operands are absent. + return is_tag(contents, "mrow") + && children.len() > 1 + && (get_text_from_COE(&children[0]) == "," || get_text_from_COE(&children[1]) == ","); } }