diff --git a/Rules/Braille/Swedish/Swedish_Rules.yaml b/Rules/Braille/Swedish/Swedish_Rules.yaml index bdd4031f6..028574914 100644 --- a/Rules/Braille/Swedish/Swedish_Rules.yaml +++ b/Rules/Braille/Swedish/Swedish_Rules.yaml @@ -4,7 +4,7 @@ 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: + - with: variables: [MatchingWhitespace: "true()"] replace: - test: @@ -24,25 +24,25 @@ then: [t: "W"] - - name: omission-intent - tag: "!*" - match: "contains(@intent, ':blank')" - replace: - - t: "⠬" + name: omission-intent + tag: "!*" + match: "contains(@intent, ':blank')" + replace: + - t: "⠬" - - name: unicode-override - tag: "*" - match: "@data-unicode" - replace: - - x: "@data-unicode" + name: unicode-override + tag: "*" + match: "@data-unicode" + replace: + - x: "@data-unicode" - - name: default - tag: msqrt - match: . - replace: - - test: + name: default + tag: msqrt + match: . + replace: + - test: if: "NeedsToBeGrouped(*[1], 'Swedish', true())" then: - t: "⠘⠩" @@ -79,76 +79,76 @@ # 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][.='\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: "⠳" - - x: "*[2]" - -- - name: nested-fraction - tag: mfrac - match: "*[self::m:mfrac or (self::m:mrow and *[2]='/')] or */*[self::m:mfrac]" - replace: - - t: "⠿⠦" - - x: "*[1]" - - t: "⠳⠳" - - x: "*[2]" - - t: "⠿⠴" + # 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][.='\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: "⠳" + - x: "*[2]" + +- + name: nested-fraction + tag: mfrac + match: "*[self::m:mfrac or (self::m:mrow and *[2]='/')] or */*[self::m:mfrac]" + replace: + - t: "⠿⠦" + - x: "*[1]" + - t: "⠳⠳" + - x: "*[2]" + - t: "⠿⠴" - # needs to be after nested-fraction rule as long as this rule uses the NeedsToBeGrouped test - name: simple-fraction - tag: mfrac - # first clause due to Ex. 6.8 - match: "not(preceding-sibling::*[1][. ='\u2061' and IsInDefinition(preceding-sibling::*[1], 'Braille', 'TrigFunctionNames')]) and - not(NeedsToBeGrouped(*[1], 'Swedish', true()) or NeedsToBeGrouped(*[2], 'Swedish', true()))" - replace: - - x: "*[1]" - - t: "⠳" - - x: "*[2]" - -- - name: nested-linear-fraction - tag: mrow - match: "*[2][.='/'] and (*[1][self::m:mfrac] or *[3][self::m:mfrac])" - replace: - - x: "*[1]" - - t: "⠌⠌" - - x: "*[3]" + name: simple-fraction + tag: mfrac + # first clause due to Ex. 6.8 + match: "not(preceding-sibling::*[1][. ='\u2061' and IsInDefinition(preceding-sibling::*[1], 'Braille', 'TrigFunctionNames')]) and + not(NeedsToBeGrouped(*[1], 'Swedish', true()) or NeedsToBeGrouped(*[2], 'Swedish', true()))" + replace: + - x: "*[1]" + - t: "⠳" + - x: "*[2]" - - name: default - tag: mfrac - match: "." - replace: - - t: "⠿⠦" - - x: "*[1]" - - t: "⠳" - - x: "*[2]" - - t: "⠿⠴" - -- - # 6.5 - 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: nested-linear-fraction + tag: mrow + match: "*[2][.='/'] and (*[1][self::m:mfrac] or *[3][self::m:mfrac])" + replace: + - x: "*[1]" + - t: "⠌⠌" + - x: "*[3]" + +- + name: default + tag: mfrac + match: "." + replace: + - t: "⠿⠦" + - x: "*[1]" + - t: "⠳" + - x: "*[2]" + - t: "⠿⠴" + +- + # 6.5 + 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 @@ -250,55 +250,55 @@ 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 + 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 - - 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 + name: default + tag: mrow + match: "." + replace: [x: "*"] - - name: default - tag: mo - # add spaces around comparison operators unless they are in a script position, - variables: # ratio not spaced in UEB - - AddSpaces: "$UseSpacesAroundAllOperators or - ( parent::*[self::m:mrow] and $NewScriptContext='' and - .!='∶' and not(ancestor::*[self::m:mfrac]) and - (IsInDefinition(., 'Braille', 'NemethComparisonOperators') or IsInDefinition(., 'Braille', 'BinaryOperators')))" - match: "." - replace: - - test: - if: "$AddSpaces" - then: - - test: - if: "preceding-sibling::*" - then: [t: "W"] - # can't call BrailleChars() for U+2061 because that needs the appropriate context. But need to do it for bold/italic, so we have the following hack - - test: - if: "@mathvariant" - then: [x: "BrailleChars(., 'Swedish')"] - else: [x: "text()"] - - test: - if: "$AddSpaces and following-sibling::*" - then: [t: "W"] + # 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 + +- + name: default + tag: mo + # add spaces around comparison operators unless they are in a script position, + variables: # ratio not spaced in UEB + - AddSpaces: "$UseSpacesAroundAllOperators or + ( parent::*[self::m:mrow] and $NewScriptContext='' and + .!='∶' and not(ancestor::*[self::m:mfrac]) and + (IsInDefinition(., 'Braille', 'NemethComparisonOperators') or IsInDefinition(., 'Braille', 'BinaryOperators')))" + match: "." + replace: + - test: + if: "$AddSpaces" + then: + - test: + if: "preceding-sibling::*" + then: [t: "W"] + # can't call BrailleChars() for U+2061 because that needs the appropriate context. But need to do it for bold/italic, so we have the following hack + - test: + if: "@mathvariant" + then: [x: "BrailleChars(., 'Swedish')"] + else: [x: "text()"] + - test: + if: "$AddSpaces and following-sibling::*" + then: [t: "W"] - @@ -317,11 +317,11 @@ - x: "BrailleChars(., 'Swedish')" - - name: default - tag: mstyle - match: "." - replace: - - test: + name: default + tag: mstyle + match: "." + replace: + - test: if: "*" then: [x: "*"] # else do nothing -- no content @@ -366,12 +366,12 @@ match: "*[2][self::m:mo and count(.)=1 and translate(., '¯~^→⟶', '')='']" replace: - test: - if: "NeedsToBeGrouped(*[1], 'Swedish', true())" - then: - - t: "⠘" - - x: "*[1]" - - t: "⠱" - else: [x: "*[1]"] + if: "NeedsToBeGrouped(*[1], 'Swedish', true())" + then: + - t: "⠘" + - x: "*[1]" + - t: "⠱" + else: [x: "*[1]"] - t: "⠬⠬" - test: - if: "*[2][.='¯']" @@ -441,12 +441,12 @@ match: "." replace: - test: - if: "(self::m:munder or self::m:mover) and NeedsToBeGrouped(*[1], 'Swedish', true())" - then: - - t: "⠘" - - x: "*[1]" - - t: "⠱" - else: [x: "*[1]"] + if: "(self::m:munder or self::m:mover) and NeedsToBeGrouped(*[1], 'Swedish', true())" + 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 @@ -541,211 +541,211 @@ then: [t: "W"] - - 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: + 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], 'Swedish', 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], 'Swedish', 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], 'Swedish', false())" + 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], 'Swedish', true())" then: - - t: "⠘" - - x: "$Prescripts[3]" + - t: "⠣" + - x: "$Prescripts[1]" - 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], 'Swedish', false())" + 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], 'Swedish', false())" then: - t: "⠘" - - x: "$Prescripts[4]" + - x: "$Prescripts[2]" - 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]"] + 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], 'Swedish', 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], 'Swedish', 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: + - 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], 'Swedish', 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], 'Swedish', 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], 'Swedish', false())" + 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], 'Swedish', false())" then: - t: "⠘" - - x: "$Postscripts[3]" + - x: "$Postscripts[1]" - 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], 'Swedish', false())" + 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], 'Swedish', false())" then: - t: "⠘" - - x: "$Postscripts[4]" + - x: "$Postscripts[2]" - t: "⠱" - else: [x: "$Postscripts[4]"] - - test: - if: "count($Postscripts)>4" - then: - - test: - if: "not($Postscripts[5][self::m:none])" - then: - - with: + 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[5], 'Swedish', false())" + if: "NeedsToBeGrouped($Postscripts[3], 'Swedish', false())" then: - t: "⠘" - - x: "$Postscripts[5]" + - x: "$Postscripts[3]" - t: "⠱" - else: [x: "$Postscripts[5]"] - - test: - if: "not($Postscripts[6][self::m:none])" - then: - - with: + 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[6], 'Swedish', false())" + if: "NeedsToBeGrouped($Postscripts[4], 'Swedish', false())" then: - t: "⠘" - - x: "$Postscripts[6]" + - x: "$Postscripts[4]" - t: "⠱" - else: [x: "$Postscripts[6]"] - - test: - if: "count($Postscripts)>6" - then: - - test: - if: "not($Postscripts[7][self::m:none])" + 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[7], 'Swedish', false())" - then: - - t: "⠘" - - x: "$Postscripts[7]" - - t: "⠱" - else: [x: "$Postscripts[7]"] - - test: - if: "not($Postscripts[8][self::m:none])" + variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string + replace: + - t: "⠣" + - test: + if: "NeedsToBeGrouped($Postscripts[5], 'Swedish', 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[8], 'Swedish', 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 + variables: [NewScriptContext: "in"] # value doesn't matter -- just can't be empty string + replace: + - t: "⠬" + - test: + if: "NeedsToBeGrouped($Postscripts[6], 'Swedish', false())" + then: + - t: "⠘" + - x: "$Postscripts[6]" + - t: "⠱" + else: [x: "$Postscripts[6]"] + - test: + if: "count($Postscripts)>6" then: - - x: "$Postscripts[position() > 8]" - - t: "#" # signal end script/numeric mode + - 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], 'Swedish', 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], 'Swedish', 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 - @@ -766,23 +766,23 @@ # 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: + 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: + - test: if: "contains(@notation,'box')" # box and roundedbox then: # - test: # if: "$AddSpaces" # then: [t: " "] - t: "1⠫⠼⠙" # square (no rectangle in UEB) - - test: + - test: if: "contains(@notation,'circle')" then: # - test: @@ -838,7 +838,7 @@ # if: ".[contains(@notation,'radical')]" # then: [t: square root, pause: short] - - test: + - test: if: "NeedsToBeGrouped(*[1], 'Swedish', false())" then: - t: "⠘" @@ -849,7 +849,7 @@ # - test: # if: "contains(@notation,'phasorangle')" #FIX: what should this be??? # then: [t: "⠫⠪⠸⠫"] - - test: + - test: if: "contains(@notation,'arrow')" # all the arrows then: - test: @@ -877,18 +877,18 @@ then: [t: "1⠳⠺⠗⠎"] - else_if: "contains(@notation,'northwestsoutheastarrow')" then: [t: "1⠳⠺⠗⠣"] - - test: + - test: if: "contains(@notation,'top')" then: [t: "⠱"] - - test: + - test: if: "contains(@notation,'bottom')" then: [t: "⠠⠱"] - - test: + - test: if: "contains(@notation,'updiagonalstrike') or contains(@notation,'downdiagonalstrike') or contains(@notation,'verticalstrike') or contains(@notation,'horizontalstrike')" then: - t: "1⠈⠱" # cancellation - - test: + - test: if: - "not($AddSpaces) and contains(@notation,'box') or contains(@notation,'circle') or" - "contains(@notation,'arrow') or contains(@notation,'phasorangle')" @@ -897,57 +897,57 @@ # - test: # if: "$AddSpaces" # then: [t: " "] - - test: + - 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(., 'Swedish')" - - test: - if: "string(@rquote)!=''" - then: [x: "@rquote"] - else: [t: "⠄⠄"] + name: default + tag: ms + match: "." + replace: + - test: + if: "string(@lquote)!=''" + then: [x: "@lquote"] + else: [t: "⠄⠄"] + - x: "BrailleChars(., 'Swedish')" + - 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 + 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: - - x: "BrailleChars('unknown math m l element', 'Swedish')" - - x: "name(.)" - - x: "*" + name: default-children + tag: "*" + match: "*" # make sure there are children + replace: + - x: "BrailleChars('unknown math m l element', 'Swedish')" + - x: "name(.)" + - x: "*" - - # at this point, we know there are no children -- might be no text - name: default-no-children - tag: "*" - match: "text()" - replace: - - x: "BrailleChars('unknown math m l element', 'Swedish')" - - x: "name(.)" - - x: "text()" + # at this point, we know there are no children -- might be no text + name: default-no-children + tag: "*" + match: "text()" + replace: + - x: "BrailleChars('unknown math m l element', 'Swedish')" + - x: "name(.)" + - x: "text()" - - name: default-no-text - tag: "*" - match: "." - replace: - - x: "BrailleChars('empty unknown math m l element', 'Swedish')" - - x: "name(.)" + name: default-no-text + tag: "*" + match: "." + replace: + - x: "BrailleChars('empty unknown math m l element', 'Swedish')" + - x: "name(.)" diff --git a/Rules/Languages/hu/unicode-full.yaml b/Rules/Languages/hu/unicode-full.yaml index c45035bff..46a96b9a9 100644 --- a/Rules/Languages/hu/unicode-full.yaml +++ b/Rules/Languages/hu/unicode-full.yaml @@ -101,96 +101,96 @@ - "˦": [T: "módosító magas hangsáv"] # 0x2e6 (en: 'modifier high tone bar', DeepL translation) - "˧": [T: "módosító középtónusú sáv"] # 0x2e7 (en: 'modifier mid tone bar', DeepL translation) - "˨": [T: "módosító alacsony hangsáv"] # 0x2e8 (en: 'modifier low tone bar', DeepL translation) - - "˩": [t: "módosító extra alacsony tónusú sáv"] # 0x2e9 (en: 'modifier extra-low tone bar', DeepL translation) - - "˪": [t: "módosító yin távozó hangjelzés"] # 0x2ea (en: 'modifier yin departing tone mark', DeepL translation) - - "˫": [t: "módosító jang távozó hangjelzés"] # 0x2eb (en: 'modifier yang departing tone mark', DeepL translation) - - "ˬ": [t: "módosító hangképzés"] # 0x2ec (en: 'modifier voicing', DeepL translation) - - "˭": [t: "modifikátor unaspirated"] # 0x2ed (en: 'modifier unaspirated', DeepL translation) - - "ˮ": [t: "módosító kettős aposztróf"] # 0x2ee (en: 'modifier double apostrophe', DeepL translation) - - "˯": [t: "módosító alacsonyan lefelé mutató nyílvessző"] # 0x2ef (en: 'modifier low down arrowhead', DeepL translation) - - "˰": [t: "módosító alacsony felfelé nyílhegy"] # 0x2f0 (en: 'modifier low up arrowhead', DeepL translation) - - "˱": [t: "módosító alacsony bal oldali nyílhegy"] # 0x2f1 (en: 'modifier low left arrowhead', DeepL translation) - - "˲": [t: "módosító alacsony jobb oldali nyílhegy"] # 0x2f2 (en: 'modifier low right arrowhead', DeepL translation) - - "˳": [t: "módosító alacsony gyűrű"] # 0x2f3 (en: 'modifier low ring', DeepL translation) - - "˴": [t: "módosító középső síró ékezet"] # 0x2f4 (en: 'modifier middle grave accent', DeepL translation) - - "˵": [t: "módosító középső kettős sír ékezet"] # 0x2f5 (en: 'modifier middle double grave accent', DeepL translation) - - "˶": [t: "módosító középső kettős hegyes ékezet"] # 0x2f6 (en: 'modifier middle double acute accent', DeepL translation) - - "˷": [t: "módosító alacsony tilde"] # 0x2f7 (en: 'modifier low tilde', DeepL translation) - - "˸": [t: "módosító emelt kettőspont"] # 0x2f8 (en: 'modifier raised colon', DeepL translation) - - "˹": [t: "módosító kezdődik magas hang"] # 0x2f9 (en: 'modifier begin high tone', DeepL translation) - - "˺": [t: "módosító végén magas hang"] # 0x2fa (en: 'modifier end high tone', DeepL translation) - - "˻": [t: "módosító kezdődik alacsony hanggal"] # 0x2fb (en: 'modifier begin low tone', DeepL translation) - - "˼": [t: "módosító vége mély hang"] # 0x2fc (en: 'modifier end low tone', DeepL translation) - - "˽": [t: "módosító polc"] # 0x2fd (en: 'modifier shelf', DeepL translation) - - "˾": [t: "módosító nyitott polc"] # 0x2fe (en: 'modifier open shelf', DeepL translation) - - "˿": [t: "módosító bal alsó bal nyíl"] # 0x2ff (en: 'modifier low left arrow', DeepL translation) - - "̀": [t: "súlyos ékezetes díszítés"] # 0x300 (en: 'grave accent embellishment', DeepL translation) - - "́": [t: "akut ékezetes díszítés"] # 0x301 (en: 'acute accent embellishment', DeepL translation) - - "̂": [t: "körkörös ékezetes díszítés"] # 0x302 (en: 'circumflex accent embellishment', DeepL translation) - - "̃": [t: "tilde díszítés"] # 0x303 (en: 'tilde embellishment', DeepL translation) - - "̄": [t: "makron díszítés"] # 0x304 (en: 'macron embellishment', DeepL translation) - - "̅": [t: "túlnyúló díszítés"] # 0x305 (en: 'overbar embellishment', DeepL translation) - - "̆": [t: "breve díszítés"] # 0x306 (en: 'breve embellishment', DeepL translation) - - "̇": [t: "pont a díszítés felett"] # 0x307 (en: 'dot above embellishment', DeepL translation) - - "̈": [t: "diaerézis díszítés"] # 0x308 (en: 'diaeresis embellishment', DeepL translation) - - "̉": [t: "horog a díszítés felett"] # 0x309 (en: 'hook above embellishment', DeepL translation) - - "̊": [t: "gyűrű a díszítés felett"] # 0x30a (en: 'ring above embellishment', DeepL translation) - - "̋": [t: "dupla hegyes ékezetű ékezet díszítés"] # 0x30b (en: 'double acute accent embellishment', DeepL translation) - - "̌": [t: "ellenőrzés"] # 0x30c (en: 'check', DeepL translation) - - "̍": [t: "függőleges vonal a díszítés felett"] # 0x30d (en: 'vertical line above embellishment', DeepL translation) - - "̎": [t: "dupla függőleges vonal a díszítés felett"] # 0x30e (en: 'double vertical line above embellishment', DeepL translation) - - "̏": [t: "dupla sír ékezet díszítés"] # 0x30f (en: 'double grave accent embellishment', DeepL translation) - - "̐": [t: "candrabindu díszítés"] # 0x310 (en: 'candrabindu embellishment', DeepL translation) - - "̑": [t: "fordított breviális díszítés"] # 0x311 (en: 'inverted breve embellishment', DeepL translation) - - "̒": [t: "fordított vessző felett díszítés"] # 0x312 (en: 'turned comma above embellishment', DeepL translation) - - "̓": [t: "vessző a díszítés felett"] # 0x313 (en: 'comma above embellishment', DeepL translation) - - "̔": [t: "fordított vessző a díszítés felett"] # 0x314 (en: 'reversed comma above embellishment', DeepL translation) - - "̕": [t: "vessző felett jobbra díszítés"] # 0x315 (en: 'comma above right embellishment', DeepL translation) - - "̖": [t: "súlyos ékezet alatti díszítés"] # 0x316 (en: 'grave accent below embellishment', DeepL translation) - - "̗": [t: "éles ékezet alatt díszítés"] # 0x317 (en: 'acute accent below embellishment', DeepL translation) - - "̘": [t: "bal szögletes zárójel alul díszítés"] # 0x318 (en: 'left tack below embellishment', DeepL translation) - - "̙": [t: "jobb oldali szegecs a díszítés alatt"] # 0x319 (en: 'right tack below embellishment', DeepL translation) - - "̚": [t: "bal szög a díszítés felett"] # 0x31a (en: 'left angle above embellishment', DeepL translation) - - "̛": [t: "szarv díszítés"] # 0x31b (en: 'horn embellishment', DeepL translation) - - "̜": [t: "bal félgyűrű alatti díszítés"] # 0x31c (en: 'left half ring below embellishment', DeepL translation) - - "̝": [t: "felszög alul díszítés"] # 0x31d (en: 'up tack below embellishment', DeepL translation) - - "̞": [t: "lefelé fordulás a díszítés alatt"] # 0x31e (en: 'down tack below embellishment', DeepL translation) - - "̟": [t: "pluszjel a díszítés alatt"] # 0x31f (en: 'plus sign below embellishment', DeepL translation) - - "̠": [t: "mínusz jel alatti díszítés"] # 0x320 (en: 'minus sign below embellishment', DeepL translation) - - "̡": [t: "palatalizált horog alatti díszítés"] # 0x321 (en: 'palatalized hook below embellishment', DeepL translation) - - "̢": [t: "retroflex horog alatti díszítés"] # 0x322 (en: 'retroflex hook below embellishment', DeepL translation) - - "̣": [t: "pont alatt díszítés"] # 0x323 (en: 'dot below embellishment', DeepL translation) - - "̤": [t: "diaerézis a díszítés alatt"] # 0x324 (en: 'diaeresis below embellishment', DeepL translation) - - "̥": [t: "gyűrű a díszítés alatt"] # 0x325 (en: 'ring below embellishment', DeepL translation) - - "̦": [t: "vessző a díszítés alatt"] # 0x326 (en: 'comma below embellishment', DeepL translation) - - "̧": [t: "cedilla díszítés"] # 0x327 (en: 'cedilla embellishment', DeepL translation) - - "̨": [t: "ogonek díszítés"] # 0x328 (en: 'ogonek embellishment', DeepL translation) - - "̩": [t: "függőleges vonal a díszítés alatt"] # 0x329 (en: 'vertical line below embellishment', DeepL translation) - - "̪": [t: "híd alatti díszítés"] # 0x32a (en: 'bridge below embellishment', DeepL translation) - - "̫": [t: "fordított kettős ív a díszítés alatt"] # 0x32b (en: 'inverted double arch below embellishment', DeepL translation) - - "̬": [t: "caron alatti díszítés"] # 0x32c (en: 'caron below embellishment', DeepL translation) - - "̭": [t: "körkörös ékezet a díszítés alatt"] # 0x32d (en: 'circumflex accent below embellishment', DeepL translation) - - "̮": [t: "breve alatti díszítés"] # 0x32e (en: 'breve below embellishment', DeepL translation) - - "̯": [t: "fordított breve alatti díszítés"] # 0x32f (en: 'inverted breve below embellishment', DeepL translation) - - "̰": [t: "tilde alul díszítés"] # 0x330 (en: 'tilde below embellishment', DeepL translation) - - "̱": [t: "makron alatti díszítés"] # 0x331 (en: 'macron below embellishment', DeepL translation) - - "̲": [t: "alacsony vonal díszítés"] # 0x332 (en: 'low line embellishment', DeepL translation) - - "̳": [t: "kettős alacsony vonalú díszítés"] # 0x333 (en: 'double low line embellishment', DeepL translation) - - "̴": [t: "tilde feletti díszítés"] # 0x334 (en: 'tilde overlay embellishment', DeepL translation) - - "̵": [t: "rövid vonallal felrakott díszítés"] # 0x335 (en: 'short stroke overlay embellishment', DeepL translation) - - "̶": [t: "hosszú vonás overlay díszítés"] # 0x336 (en: 'long stroke overlay embellishment', DeepL translation) - - "̷": [t: "rövid solidus feletti díszítés"] # 0x337 (en: 'short solidus overlay embellishment', DeepL translation) - - "̸": [t: "hosszú solidus feletti díszítés"] # 0x338 (en: 'long solidus overlay embellishment', DeepL translation) - - "̹": [t: "jobb oldali félgyűrű alatt díszítés"] # 0x339 (en: 'right half ring below embellishment', DeepL translation) - - "̺": [t: "fordított híd alatti díszítés"] # 0x33a (en: 'inverted bridge below embellishment', DeepL translation) - - "̻": [t: "négyzet alatti díszítéssel"] # 0x33b (en: 'square below embellishment', DeepL translation) - - "̼": [t: "sirály alul díszítés"] # 0x33c (en: 'seagull below embellishment', DeepL translation) - - "̽": [t: "x feletti díszítés"] # 0x33d (en: 'x above embellishment', DeepL translation) - - "̾": [t: "függőleges tilde díszítés"] # 0x33e (en: 'vertical tilde embellishment', DeepL translation) - - "̿": [t: "dupla felülvonali díszítés"] # 0x33f (en: 'double overline embellishment', DeepL translation) - - "̀": [t: "súlyos hangjelzés díszítés"] # 0x340 (en: 'grave tone mark embellishment', DeepL translation) - - "́": [t: "hegyes tónusjel díszítés"] # 0x341 (en: 'acute tone mark embellishment', DeepL translation) - - "͆": [t: "híd felett"] # 0x346 (en: 'bridge above', DeepL translation) + - "˩": [T: "módosító extra alacsony tónusú sáv"] # 0x2e9 (en: 'modifier extra-low tone bar', DeepL translation) + - "˪": [T: "módosító yin távozó hangjelzés"] # 0x2ea (en: 'modifier yin departing tone mark', DeepL translation) + - "˫": [T: "módosító jang távozó hangjelzés"] # 0x2eb (en: 'modifier yang departing tone mark', DeepL translation) + - "ˬ": [T: "módosító hangképzés"] # 0x2ec (en: 'modifier voicing', DeepL translation) + - "˭": [T: "nem aspirált módosító"] # 0x2ed (en: 'modifier unaspirated', DeepL translation) + - "ˮ": [T: "módosító kettős aposztróf"] # 0x2ee (en: 'modifier double apostrophe', DeepL translation) + - "˯": [T: "módosító alacsonyan lefelé mutató nyílhegy"] # 0x2ef (en: 'modifier low down arrowhead', DeepL translation) + - "˰": [T: "módosító alacsonyan felfelé mutató nyílhegy"] # 0x2f0 (en: 'modifier low up arrowhead', DeepL translation) + - "˱": [T: "módosító bal alsó nyílhegy"] # 0x2f1 (en: 'modifier low left arrowhead', DeepL translation) + - "˲": [T: "módosító alsó jobbra mutató nyílhegy"] # 0x2f2 (en: 'modifier low right arrowhead', DeepL translation) + - "˳": [T: "módosító alacsony gyűrű"] # 0x2f3 (en: 'modifier low ring', DeepL translation) + - "˴": [T: "módosító középső sír ékezet"] # 0x2f4 (en: 'modifier middle grave accent', DeepL translation) + - "˵": [T: "módosító középső kettős sír ékezet"] # 0x2f5 (en: 'modifier middle double grave accent', DeepL translation) + - "˶": [T: "módosító középső kettős hegyes ékezet"] # 0x2f6 (en: 'modifier middle double acute accent', DeepL translation) + - "˷": [T: "módosító alacsony tilde"] # 0x2f7 (en: 'modifier low tilde', DeepL translation) + - "˸": [T: "módosító emelt kettőspont"] # 0x2f8 (en: 'modifier raised colon', DeepL translation) + - "˹": [T: "módosító magas hangjelzés kezdete"] # 0x2f9 (en: 'modifier begin high tone', DeepL translation) + - "˺": [T: "módosító magas hangjelzés vége"] # 0x2fa (en: 'modifier end high tone', DeepL translation) + - "˻": [T: "módosító alacsony hangjelzés kezdete"] # 0x2fb (en: 'modifier begin low tone', DeepL translation) + - "˼": [T: "módosító alacsony hangjelzés vége"] # 0x2fc (en: 'modifier end low tone', DeepL translation) + - "˽": [T: "módosító polc"] # 0x2fd (en: 'modifier shelf', DeepL translation) + - "˾": [T: "módosító nyitott polc"] # 0x2fe (en: 'modifier open shelf', DeepL translation) + - "˿": [T: "módosító bal alsó bal nyíl"] # 0x2ff (en: 'modifier low left arrow', DeepL translation) + - "̀": [T: "súlyos ékezetes díszítés"] # 0x300 (en: 'grave accent embellishment', DeepL translation) + - "́": [T: "akut ékezetes díszítés"] # 0x301 (en: 'acute accent embellishment', DeepL translation) + - "̂": [T: "körkörös ékezetes díszítés"] # 0x302 (en: 'circumflex accent embellishment', DeepL translation) + - "̃": [T: "tilde díszítés"] # 0x303 (en: 'tilde embellishment', DeepL translation) + - "̄": [T: "makron díszítés"] # 0x304 (en: 'macron embellishment', DeepL translation) + - "̅": [T: "túlnyúló díszítés"] # 0x305 (en: 'overbar embellishment', DeepL translation) + - "̆": [T: "breve díszítés"] # 0x306 (en: 'breve embellishment', DeepL translation) + - "̇": [T: "pont a díszítés felett"] # 0x307 (en: 'dot above embellishment', DeepL translation) + - "̈": [T: "diaerézis díszítés"] # 0x308 (en: 'diaeresis embellishment', DeepL translation) + - "̉": [T: "horog a díszítés felett"] # 0x309 (en: 'hook above embellishment', DeepL translation) + - "̊": [T: "gyűrű a díszítés felett"] # 0x30a (en: 'ring above embellishment', DeepL translation) + - "̋": [T: "dupla hegyes ékezetű ékezet díszítés"] # 0x30b (en: 'double acute accent embellishment', DeepL translation) + - "̌": [T: "ellenőrzés"] # 0x30c (en: 'check', DeepL translation) + - "̍": [T: "függőleges vonal a díszítés felett"] # 0x30d (en: 'vertical line above embellishment', DeepL translation) + - "̎": [T: "dupla függőleges vonal a díszítés felett"] # 0x30e (en: 'double vertical line above embellishment', DeepL translation) + - "̏": [T: "dupla sír ékezet díszítés"] # 0x30f (en: 'double grave accent embellishment', DeepL translation) + - "̐": [T: "candrabindu díszítés"] # 0x310 (en: 'candrabindu embellishment', DeepL translation) + - "̑": [T: "fordított breviális díszítés"] # 0x311 (en: 'inverted breve embellishment', DeepL translation) + - "̒": [T: "fordított vessző felett díszítés"] # 0x312 (en: 'turned comma above embellishment', DeepL translation) + - "̓": [T: "vessző a díszítés felett"] # 0x313 (en: 'comma above embellishment', DeepL translation) + - "̔": [T: "fordított vessző a díszítés felett"] # 0x314 (en: 'reversed comma above embellishment', DeepL translation) + - "̕": [T: "vessző a jobb oldali díszítés felett"] # 0x315 (en: 'comma above right embellishment', DeepL translation) + - "̖": [T: "súlyos ékezet alatti díszítés"] # 0x316 (en: 'grave accent below embellishment', DeepL translation) + - "̗": [T: "éles ékezet alatt díszítés"] # 0x317 (en: 'acute accent below embellishment', DeepL translation) + - "̘": [T: "bal szögletes zárójel alatti díszítés"] # 0x318 (en: 'left tack below embellishment', DeepL translation) + - "̙": [T: "jobb szögletes zárójel alatti díszítés"] # 0x319 (en: 'right tack below embellishment', DeepL translation) + - "̚": [T: "bal szög a díszítés felett"] # 0x31a (en: 'left angle above embellishment', DeepL translation) + - "̛": [T: "szarv díszítés"] # 0x31b (en: 'horn embellishment', DeepL translation) + - "̜": [T: "bal félgyűrű alatti díszítés"] # 0x31c (en: 'left half ring below embellishment', DeepL translation) + - "̝": [T: "díszítés alatti felvarrás"] # 0x31d (en: 'up tack below embellishment', DeepL translation) + - "̞": [T: "lefelé forduló díszítés alatt"] # 0x31e (en: 'down tack below embellishment', DeepL translation) + - "̟": [T: "pluszjel a díszítés alatt"] # 0x31f (en: 'plus sign below embellishment', DeepL translation) + - "̠": [T: "mínusz jel alatti díszítés"] # 0x320 (en: 'minus sign below embellishment', DeepL translation) + - "̡": [T: "palatalizált horog alatti díszítés"] # 0x321 (en: 'palatalized hook below embellishment', DeepL translation) + - "̢": [T: "retroflex horog alatti díszítés"] # 0x322 (en: 'retroflex hook below embellishment', DeepL translation) + - "̣": [T: "pont a díszítés alatt"] # 0x323 (en: 'dot below embellishment', DeepL translation) + - "̤": [T: "diaerézis a díszítés alatt"] # 0x324 (en: 'diaeresis below embellishment', DeepL translation) + - "̥": [T: "gyűrű a díszítés alatt"] # 0x325 (en: 'ring below embellishment', DeepL translation) + - "̦": [T: "vessző a díszítés alatt"] # 0x326 (en: 'comma below embellishment', DeepL translation) + - "̧": [T: "cedilla díszítés"] # 0x327 (en: 'cedilla embellishment', DeepL translation) + - "̨": [T: "ogonek díszítés"] # 0x328 (en: 'ogonek embellishment', DeepL translation) + - "̩": [T: "függőleges vonal a díszítés alatt"] # 0x329 (en: 'vertical line below embellishment', DeepL translation) + - "̪": [T: "híd alatti díszítés"] # 0x32a (en: 'bridge below embellishment', DeepL translation) + - "̫": [T: "fordított kettős ív a díszítés alatt"] # 0x32b (en: 'inverted double arch below embellishment', DeepL translation) + - "̬": [T: "caron alatti díszítés"] # 0x32c (en: 'caron below embellishment', DeepL translation) + - "̭": [T: "körkörös ékezet a díszítés alatt"] # 0x32d (en: 'circumflex accent below embellishment', DeepL translation) + - "̮": [T: "breve alatti díszítés"] # 0x32e (en: 'breve below embellishment', DeepL translation) + - "̯": [T: "fordított breve alatti díszítés"] # 0x32f (en: 'inverted breve below embellishment', DeepL translation) + - "̰": [T: "tilde a díszítés alatt"] # 0x330 (en: 'tilde below embellishment', DeepL translation) + - "̱": [T: "makron alatti díszítés"] # 0x331 (en: 'macron below embellishment', DeepL translation) + - "̲": [T: "alacsony vonalú díszítés"] # 0x332 (en: 'low line embellishment', DeepL translation) + - "̳": [T: "kettős alacsony vonalú díszítés"] # 0x333 (en: 'double low line embellishment', DeepL translation) + - "̴": [T: "tilde a díszítés felett"] # 0x334 (en: 'tilde overlay embellishment', DeepL translation) + - "̵": [T: "rövid vonallal felrakott díszítés"] # 0x335 (en: 'short stroke overlay embellishment', DeepL translation) + - "̶": [T: "hosszú vonallal felrakott díszítés"] # 0x336 (en: 'long stroke overlay embellishment', DeepL translation) + - "̷": [T: "rövid solidus feletti díszítés"] # 0x337 (en: 'short solidus overlay embellishment', DeepL translation) + - "̸": [T: "hosszú solidus feletti díszítés"] # 0x338 (en: 'long solidus overlay embellishment', DeepL translation) + - "̹": [T: "jobb oldali félgyűrű alatti díszítés"] # 0x339 (en: 'right half ring below embellishment', DeepL translation) + - "̺": [T: "fordított híd alatti díszítés"] # 0x33a (en: 'inverted bridge below embellishment', DeepL translation) + - "̻": [T: "négyzet alatti díszítés"] # 0x33b (en: 'square below embellishment', DeepL translation) + - "̼": [T: "sirály alatta díszítés"] # 0x33c (en: 'seagull below embellishment', DeepL translation) + - "̽": [T: "x feletti díszítés"] # 0x33d (en: 'x above embellishment', DeepL translation) + - "̾": [T: "függőleges tilde díszítés"] # 0x33e (en: 'vertical tilde embellishment', DeepL translation) + - "̿": [T: "dupla felülvonalas díszítés"] # 0x33f (en: 'double overline embellishment', DeepL translation) + - "̀": [T: "súlyos hangjelzés díszítés"] # 0x340 (en: 'grave tone mark embellishment', DeepL translation) + - "́": [T: "hegyes tónusú díszítés"] # 0x341 (en: 'acute tone mark embellishment', DeepL translation) + - "͆": [T: "híd felett"] # 0x346 (en: 'bridge above', DeepL translation) - "ΪΫϏ": # 0x3aa, 0x3ab, 0x3cf - test: @@ -205,29 +205,29 @@ if: "$SpeechOverrides_CapitalLetters = ''" then_test: if: "$Impairment = 'Blindness'" - then: [t: "nagybetű"] # (en: 'cap', DeepL translation) + then: [T: "nagy"] # (en: 'cap', DeepL translation) else: [x: "$SpeechOverrides_CapitalLetters"] - pitch: value: "$CapitalLetters_Pitch" - replace: [spell: "translate('.', 'ΪΫϏ', 'ιυϗ')"] - - t: "dialitikával" # (en: 'with dialytika', DeepL translation) - - "ϊ": [t: "jota dialitikával"] # 0x3ca (en: 'iota with dialytika', DeepL translation) - - "ϋ": [t: "felszilon dialitikával"] # 0x3cb (en: 'upsilon with dialytika', DeepL translation) - - "ό": [t: "omikron tonossal"] # 0x3cc (en: 'omicron with tonos', DeepL translation) - - "ύ": [t: "upsilon tonossal"] # 0x3cd (en: 'upsilon with tonos', DeepL translation) - - "ώ": [t: "omega tonossal"] # 0x3ce (en: 'omega with tonos', DeepL translation) - - "ϐ": [t: "béta"] # 0x3d0 (en: 'beta', DeepL translation) - - "ϑ": [t: "théta"] # 0x3d1 (en: 'theta', DeepL translation) - - "ϒ": [t: "felfelé mutató horoggal"] # 0x3d2 (en: 'upsilon with hook', DeepL translation) - - "ϓ": [t: "felfelé mutató hegyes és kampós szög"] # 0x3d3 (en: 'upsilon with acute and hook', DeepL translation) - - "ϔ": [t: "upsilon diaerézissel és horoggal"] # 0x3d4 (en: 'upsilon with diaeresis and hook', DeepL translation) - - "ϕ": [t: "phi"] # 0x3d5 (DeepL translation) - - "ϖ": [t: "pi"] # 0x3d6 (DeepL translation) - - "ϗ": [t: "kai"] # 0x3d7 (DeepL translation) - - "Ϙ": [t: "nagybetűs archaikus koppa"] # 0x3d8 (en: 'cap archaic koppa', DeepL translation) - - "ϙ": [t: "archaikus koppa"] # 0x3d9 (en: 'archaic koppa', DeepL translation) - - "ϵ": [t: "epsilon"] # 0x3f5 (DeepL translation) - - "϶": [t: "fordított epsilon"] # 0x3f6 (en: 'reversed epsilon', DeepL translation) + replace: [SPELL: "translate('.', 'ΪΫϏ', 'ιυϗ')"] + - T: "dialitikával" # (en: 'with dialytika', DeepL translation) + - "ϊ": [T: "jota dialitikával"] # 0x3ca (en: 'iota with dialytika', DeepL translation) + - "ϋ": [T: "upsilon dialitikával"] # 0x3cb (en: 'upsilon with dialytika', DeepL translation) + - "ό": [T: "omikron tonoszokkal"] # 0x3cc (en: 'omicron with tonos', DeepL translation) + - "ύ": [T: "upsilon tonoszokkal"] # 0x3cd (en: 'upsilon with tonos', DeepL translation) + - "ώ": [T: "omega tonoszokkal"] # 0x3ce (en: 'omega with tonos', DeepL translation) + - "ϐ": [T: "béta"] # 0x3d0 (en: 'beta', DeepL translation) + - "ϑ": [T: "théta"] # 0x3d1 (en: 'theta', DeepL translation) + - "ϒ": [T: "upsilon horoggal"] # 0x3d2 (en: 'upsilon with hook', DeepL translation) + - "ϓ": [T: "upsilon hegyes és kampós horoggal"] # 0x3d3 (en: 'upsilon with acute and hook', DeepL translation) + - "ϔ": [T: "upsilon diaerézissel és horoggal"] # 0x3d4 (en: 'upsilon with diaeresis and hook', DeepL translation) + - "ϕ": [T: "phi"] # 0x3d5 (DeepL translation) + - "ϖ": [T: "pi"] # 0x3d6 (DeepL translation) + - "ϗ": [T: "kai"] # 0x3d7 (DeepL translation) + - "Ϙ": [T: "nagy archaikus koppa"] # 0x3d8 (en: 'cap archaic koppa', DeepL translation) + - "ϙ": [T: "archaikus koppa"] # 0x3d9 (en: 'archaic koppa', DeepL translation) + - "ϵ": [T: "epsilon"] # 0x3f5 (DeepL translation) + - "϶": [T: "fordított epsilon"] # 0x3f6 (en: 'reversed epsilon', DeepL translation) - "А-Я": # 0x410 - 0x42f - test: if: "$CapitalLetters_Beep" @@ -241,63 +241,63 @@ if: "$SpeechOverrides_CapitalLetters = ''" then_test: if: "$Impairment = 'Blindness'" - then: [t: "nagybetű"] # (en: 'cap', DeepL translation) + then: [T: "nagy"] # (en: 'cap', DeepL translation) else: [x: "$SpeechOverrides_CapitalLetters"] - pitch: value: "$CapitalLetters_Pitch" - replace: [spell: "translate('.', 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ', 'абвгдежзийклмнопрстуфхцчшщъыьэюя')"] - - "а": [t: "а"] # 0x430 (en: 'a', DeepL translation) - - "б": [t: "be"] # 0x431 (DeepL translation) - - "в": [t: "ve"] # 0x432 (DeepL translation) - - "г": [t: "ghe"] # 0x433 (DeepL translation) - - "д": [t: "de"] # 0x434 (DeepL translation) - - "е": [t: "azaz"] # 0x435 (en: 'ie', DeepL translation) - - "ж": [t: "zhe"] # 0x436 (DeepL translation) - - "з": [t: "ze"] # 0x437 (DeepL translation) - - "и": [t: "и"] # 0x438 (en: 'i', DeepL translation) - - "й": [t: "rövid i"] # 0x439 (en: 'short i', DeepL translation) - - "к": [t: "ka"] # 0x43a (DeepL translation) - - "л": [t: "el"] # 0x43b (DeepL translation) - - "м": [t: "em"] # 0x43c (DeepL translation) - - "н": [t: "en"] # 0x43d (DeepL translation) - - "о": [t: "о"] # 0x43e (en: 'o', DeepL translation) - - "п": [t: "pe"] # 0x43f (DeepL translation) - - "р": [t: "er"] # 0x440 (DeepL translation) - - "с": [t: "es"] # 0x441 (DeepL translation) - - "т": [t: "te"] # 0x442 (DeepL translation) - - "у": [t: "у"] # 0x443 (en: 'u', DeepL translation) - - "ф": [t: "ef"] # 0x444 (DeepL translation) - - "х": [t: "ha"] # 0x445 (DeepL translation) - - "ц": [t: "tse"] # 0x446 (DeepL translation) - - "ч": [t: "che"] # 0x447 (DeepL translation) - - "ш": [t: "sha"] # 0x448 (DeepL translation) - - "щ": [t: "shcha"] # 0x449 (DeepL translation) - - "ъ": [t: "kemény jel"] # 0x44a (en: 'hard sign', DeepL translation) - - "ы": [t: "yeru"] # 0x44b (DeepL translation) - - "ь": [t: "lágy jel"] # 0x44c (en: 'soft sign', DeepL translation) - - "э": [t: "э"] # 0x44d (en: 'e', DeepL translation) - - "ю": [t: "yu"] # 0x44e (DeepL translation) - - "я": [t: "ya"] # 0x44f (DeepL translation) - - "؆": [t: "arab-indikus köbgyök"] # 0x606 (en: 'Arabic-Indic cube root', DeepL translation) - - "؇": [t: "arab-indiai negyedik gyök"] # 0x607 (en: 'Arabic-Indic fourth root', DeepL translation) - - "؈": [t: "arab sugár"] # 0x608 (en: 'Arabic ray', DeepL translation) - - "‐": [t: "kötőjel"] # 0x2010 (en: 'hyphen', DeepL translation) - - "‑": [t: "kötőjel"] # 0x2011 (en: 'hyphen', DeepL translation) - - "‒": [t: "számjeles kötőjel"] # 0x2012 (en: 'figure dash', DeepL translation) - - "–": [t: "en kötőjel"] # 0x2013 (en: 'en dash', DeepL translation) - - "—": [t: "em kötőjel"] # 0x2014 (en: 'em dash', DeepL translation) - - "―": [t: "vízszintes sáv"] # 0x2015 (en: 'horizontal bar', DeepL translation) - - "‖": [t: "dupla függőleges vonal"] # 0x2016 (en: 'double vertical line', DeepL translation) - - "†": [t: "tőr"] # 0x2020 (en: 'dagger', DeepL translation) - - "‡": [t: "dupla tőr"] # 0x2021 (en: 'double dagger', DeepL translation) - - - " - ": [t: "‡"] # 0x2000 - 0x2007 (en: ' ', DeepL translation) + replace: [SPELL: "translate('.', 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ', 'абвгдежзийклмнопрстуфхцчшщъыьэюя')"] + - "а": [T: "а"] # 0x430 (en: 'a', DeepL translation) + - "б": [T: "ciril be"] # 0x431 (DeepL translation) + - "в": [T: "ciril ve"] # 0x432 (DeepL translation) + - "г": [T: "ciril ge"] # 0x433 (DeepL translation) + - "д": [T: "ciril de"] # 0x434 (DeepL translation) + - "е": [T: "ciril je"] # 0x435 (en: 'ie', DeepL translation) + - "ж": [T: "ciril zse"] # 0x436 (DeepL translation) + - "з": [T: "ciril ze"] # 0x437 (DeepL translation) + - "и": [T: "и"] # 0x438 (en: 'i', DeepL translation) + - "й": [T: "rövid i"] # 0x439 (en: 'short i', DeepL translation) + - "к": [T: "ciril k"] # 0x43a (DeepL translation) + - "л": [T: "el"] # 0x43b (DeepL translation) + - "м": [T: "ciril em"] # 0x43c (DeepL translation) + - "н": [T: "ciril en"] # 0x43d (DeepL translation) + - "о": [T: "о"] # 0x43e (en: 'o', DeepL translation) + - "п": [T: "pe"] # 0x43f (DeepL translation) + - "р": [T: "er"] # 0x440 (DeepL translation) + - "с": [T: "ciril esz"] # 0x441 (DeepL translation) + - "т": [T: "ciril te"] # 0x442 (DeepL translation) + - "у": [T: "у"] # 0x443 (en: 'u', DeepL translation) + - "ф": [T: "ciril ef"] # 0x444 (DeepL translation) + - "х": [T: "ciril ha"] # 0x445 (DeepL translation) + - "ц": [T: "ciril tse"] # 0x446 (DeepL translation) + - "ч": [T: "ciril che"] # 0x447 (DeepL translation) + - "ш": [T: "ciril sha"] # 0x448 (DeepL translation) + - "щ": [T: "ciril shcha"] # 0x449 (DeepL translation) + - "ъ": [T: "kemény jel"] # 0x44a (en: 'hard sign', DeepL translation) + - "ы": [T: "ciril yeru"] # 0x44b (DeepL translation) + - "ь": [T: "lágy jel"] # 0x44c (en: 'soft sign', DeepL translation) + - "э": [T: "э"] # 0x44d (en: 'e', DeepL translation) + - "ю": [T: "ciril yu"] # 0x44e (DeepL translation) + - "я": [T: "ciril ya"] # 0x44f (DeepL translation) + - "؆": [T: "arab-indikus köbgyök"] # 0x606 (en: 'Arabic-Indic cube root', DeepL translation) + - "؇": [T: "arab-indiai negyedik gyök"] # 0x607 (en: 'Arabic-Indic fourth root', DeepL translation) + - "؈": [T: "arab sugár"] # 0x608 (en: 'Arabic ray', DeepL translation) + - "‐": [T: "kötőjel"] # 0x2010 (en: 'hyphen', DeepL translation) + - "‑": [T: "kötőjel"] # 0x2011 (en: 'hyphen', DeepL translation) + - "‒": [T: "számjeles kötőjel"] # 0x2012 (en: 'figure dash', DeepL translation) + - "–": [T: "en kötőjel"] # 0x2013 (en: 'en dash', DeepL translation) + - "—": [T: "em kötőjel"] # 0x2014 (en: 'em dash', DeepL translation) + - "―": [T: "vízszintes sáv"] # 0x2015 (en: 'horizontal bar', DeepL translation) + - "‖": [T: "dupla függőleges vonal"] # 0x2016 (en: 'double vertical line', DeepL translation) + - "†": [T: "tőr"] # 0x2020 (en: 'dagger', DeepL translation) + - "‡": [T: "dupla tőr"] # 0x2021 (en: 'double dagger', DeepL translation) + + - " - ": [T: "‡"] # 0x2000 - 0x2007 (en: ' ', DeepL translation) - "•": # 0x2022 - test: if: "@data-chem-formula-op" - then: [t: "pont"] # (en: 'dot', DeepL translation) - else: [t: "golyó"] # (en: 'bullet', DeepL translation) + then: [T: "pont"] # (en: 'dot', DeepL translation) + else: [T: "golyó"] # (en: 'bullet', DeepL translation) - "…": # 0x2026 test: @@ -306,882 +306,882 @@ # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' # speak '…' as 'and so on...' unless expr starts with '…' - "../*[1][.='…']" - then: [t: "pont pont pont pont"] # (en: 'dot dot dot', DeepL translation) + 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: "per mille"] # 0x2030 (DeepL translation) - - "‱": [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 prím"] # 0x2034 (en: 'triple prime', DeepL translation) - - "‵": [t: "fordított prím"] # 0x2035 (en: 'reversed prime', DeepL translation) - - "‶": [t: "fordított dupla prímszám"] # 0x2036 (en: 'reversed double prime', DeepL translation) - - "‷": [t: "fordított hármas prím"] # 0x2037 (en: 'reversed triple prime', DeepL translation) - - "‸": [t: "a"] # 0x2038 (en: 'to the', DeepL translation) - - "‹": [t: "egyetlen balra mutató szögletes idézőjel"] # 0x2039 (en: 'single left pointing angle quote mark', DeepL translation) - - "›": [t: "egyszerű jobbra mutató szögletes idézőjel"] # 0x203a (en: 'single right pointing angle quote mark', DeepL translation) + - "‰": [T: "ezrelék"] # 0x2030 (DeepL translation) + - "‱": [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: "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) + - "‸": [T: "a(z)"] # 0x2038 (en: 'to the', DeepL translation) + - "‹": [T: "egyetlen balra mutató szögletes idézőjel"] # 0x2039 (en: 'single left pointing angle quote mark', DeepL translation) + - "›": [T: "egyszerű jobbra mutató szögletes idézőjel"] # 0x203a (en: 'single right pointing angle quote mark', DeepL translation) - "‼": # 0x203c - test: if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [t: "dupla felkiáltójel"] # 0x203c (en: 'double exclamation point', DeepL translation) - else: [t: "dupla faktoriális"] # 0x203c (en: 'double factorial', DeepL translation) + then: [T: "dupla felkiáltójel"] # 0x203c (en: 'double exclamation point', DeepL translation) + else: [T: "dupla faktoriális"] # 0x203c (en: 'double factorial', DeepL translation) - "⁄": # 0x2044 - test: if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" - then: [t: "nagy átlós vonal"] # 0x203c (en: 'large slash', DeepL translation) - else: [t: "osztva"] # 0x203c (en: 'divided by', DeepL translation) - - "⁅": [t: "bal szögletes zárójel tollal"] # 0x2045 (en: 'left square bracket with quill', DeepL translation) - - "⁆": [t: "jobb oldali szögletes zárójel tollal"] # 0x2046 (en: 'right square bracket with quill', DeepL translation) - - "※": [t: "referenciajel"] # 0x203b (en: 'reference mark', DeepL translation) - - "‿": [t: "alá kötés"] # 0x203F (en: 'under tie', DeepL translation) - - "⁀": [t: "nyakkendő"] # 0x2040 (en: 'tie', DeepL translation) - - "⁎": [t: "alacsony csillaggal"] # 0x204e (en: 'low asterisk', DeepL translation) - - "⁏": [t: "fordított pontosvessző"] # 0x204f (en: 'reversed semicolon', DeepL translation) - - "⁐": [t: "közelről"] # 0x2050 (en: 'close up', DeepL translation) - - "⁑": [t: "két függőleges csillag"] # 0x2051 (en: 'two vertical asterisks', DeepL translation) - - "⁒": [t: "kereskedelmi mínusz jel"] # 0x2052 (en: 'commercial minus sign', DeepL translation) - - "⁗": [t: "négyszeres prím"] # 0x2057 (en: 'quadruple prime', DeepL translation) - - "⁠": [t: ""] # 0x2060 - - "⁰": [t: "a nulladik hatványig"] # 0x2070 (en: 'to the zeroth power', DeepL translation) - - "ⁱ": [t: "i-edik hatványig"] # 0x2071 (en: 'to the i-th power', DeepL translation) - - "⁴": [t: "a negyedik hatványig"] # 0x2074 (en: 'to the fourth power', DeepL translation) - - "⁵": [t: "ötödik hatványra"] # 0x2075 (en: 'to the fifth power', DeepL translation) - - "⁶": [t: "hatodik hatványra"] # 0x2076 (en: 'to the sixth power', DeepL translation) - - "⁷": [t: "hetedik hatványra"] # 0x2077 (en: 'to the seventh power', DeepL translation) - - "⁸": [t: "az ath hatványra"] # 0x2078 (en: 'to the eighth power', DeepL translation) - - "⁹": [t: "a kilencedik hatványra"] # 0x2079 (en: 'to the ninth power', DeepL translation) - - "⁺": [t: "felsőbbrendű plusz jel"] # 0x207a (en: 'superscript plus sign', DeepL translation) - - "⁻": [t: "feliratos mínusz"] # 0x207b (en: 'superscript minus', DeepL translation) - - "⁼": [t: "feljebb írt egyenlőségjel"] # 0x207c (en: 'superscript equals sign', DeepL translation) - - "⁽": [t: "feliratos bal oldali zárójel"] # 0x207d (en: 'superscript left parenthesis', DeepL translation) - - "⁾": [t: "feliratos jobb oldali zárójel"] # 0x207e (en: 'superscript right parenthesis', DeepL translation) - - "ⁿ": [t: "a legnagyobb erővel"] # 0x207f (en: 'to the ennth power', DeepL translation) - - "₀": [t: "sub nulla"] # 0x2080 (en: 'sub zero', DeepL translation) - - "₁": [t: "egyes alosztály"] # 0x2081 (en: 'sub one', DeepL translation) - - "₂": [t: "sub kettő"] # 0x2082 (en: 'sub two', DeepL translation) - - "₃": [t: "sub három"] # 0x2083 (en: 'sub three', DeepL translation) - - "₄": [t: "alnégyes"] # 0x2084 (en: 'sub four', DeepL translation) - - "₅": [t: "sub five"] # 0x2085 (DeepL translation) - - "₆": [t: "sub hat"] # 0x2086 (en: 'sub six', DeepL translation) - - "₇": [t: "sub seven"] # 0x2087 (DeepL translation) - - "₈": [t: "sub at"] # 0x2088 (en: 'sub eight', DeepL translation) - - "₉": [t: "sub nine"] # 0x2089 (DeepL translation) - - "₊": [t: "alulírott plusz jel"] # 0x208a (en: 'subscript plus sign', DeepL translation) - - "₋": [t: "alárendelő mínusz jel"] # 0x208b (en: 'subscript minus sign', DeepL translation) - - "₌": [t: "indexált egyenlőségjel"] # 0x208c (en: 'subscript equals sign', DeepL translation) - - "₍": [t: "index balra zárójelben"] # 0x208d (en: 'subscript left parenthesis', DeepL translation) - - "₎": [t: "subscript jobb oldali zárójel"] # 0x208e (en: 'subscript right parenthesis', DeepL translation) - - "ₐ": [t: "a. al"] # 0x2090 (en: 'sub A', DeepL translation) - - "ₑ": [t: "sub e"] # 0x2091 (en: 'sub E', DeepL translation) - - "ₒ": [t: "sub o"] # 0x2092 (en: 'sub O', DeepL translation) - - "ₓ": [t: "sub x"] # 0x2093 (en: 'sub X', DeepL translation) - - "ₕ": [t: "h részhalmaz"] # 0x2095 (en: 'sub H', DeepL translation) - - "ₖ": [t: "sub k"] # 0x2096 (en: 'sub K', DeepL translation) - - "ₗ": [t: "alul l"] # 0x2097 (en: 'sub L', DeepL translation) - - "ₘ": [t: "sub m"] # 0x2098 (en: 'sub M', DeepL translation) - - "ₙ": [t: "n alatti n"] # 0x2099 (en: 'sub N', DeepL translation) - - "ₚ": [t: "sub p"] # 0x209a (en: 'sub P', DeepL translation) - - "ₛ": [t: "sub s"] # 0x209b (en: 'sub S', DeepL translation) - - "ₜ": [t: "sub t"] # 0x209c (en: 'sub T', DeepL translation) - - "₠": [t: "európai áramegységek"] # 0x20a0 (en: 'european currenty units', DeepL translation) - - "₡": [t: "kettőspontok"] # 0x20a1 (en: 'colons', DeepL translation) - - "₢": [t: "cruzeiro"] # 0x20a2 (DeepL translation) - - "₣": [t: "frank"] # 0x20a3 (en: 'franc', DeepL translation) - - "₤": [t: "líra"] # 0x20a4 (en: 'lira', DeepL translation) - - "₥": [t: "malmok"] # 0x20a5 (en: 'mills', DeepL translation) - - "₦": [t: "naira"] # 0x20a6 (DeepL translation) - - "₧": [t: "peseta"] # 0x20a7 (DeepL translation) - - "₨": [t: "rúpiák"] # 0x20a8 (en: 'rupees', DeepL translation) - - "₩": [t: "nyert"] # 0x20a9 (en: 'won', DeepL translation) - - "₪": [t: "új sheqel"] # 0x20aa (en: 'new sheqels', DeepL translation) - - "₫": [t: "dong"] # 0x20ab (DeepL translation) - - "€": [t: "euró"] # 0x20ac (en: 'euros', DeepL translation) - - "₭": [t: "kip"] # 0x20ad (DeepL translation) - - "₮": [t: "tugrik"] # 0x20ae (DeepL translation) - - "₯": [t: "drachma"] # 0x20af (DeepL translation) - - "₰": [t: "német fillér"] # 0x20b0 (en: 'german pennies', DeepL translation) - - "₱": [t: "peso"] # 0x20b1 (en: 'pesos', DeepL translation) - - "₲": [t: "guaranis"] # 0x20b2 (DeepL translation) - - "₳": [t: "ausztrálok"] # 0x20b3 (en: 'australs', DeepL translation) - - "₴": [t: "hrivnyák"] # 0x20b4 (en: 'hryvnias', DeepL translation) - - "₵": [t: "cedi"] # 0x20b5 (en: 'cedis', DeepL translation) - - "₶": [t: "livre tournois"] # 0x20b6 (DeepL translation) - - "₷": [t: "spesmilos"] # 0x20b7 (DeepL translation) - - "₸": [t: "tenges"] # 0x20b8 (DeepL translation) - - "₹": [t: "indiai rúpia"] # 0x20b9 (en: 'indian rupees', DeepL translation) - - "₺": [t: "török líra"] # 0x20ba (en: 'turkish liras', DeepL translation) - - "⃐": [t: "bal szigony felett díszítés"] # 0x20d0 (en: 'left harpoon above embellishment', DeepL translation) - - "⃑": [t: "jobb szigony a díszítés felett"] # 0x20d1 (en: 'right harpoon above embellishment', DeepL translation) - - "⃒": [t: "hosszú függőleges vonal feletti díszítés"] # 0x20d2 (en: 'long vertical line overlay embellishment', DeepL translation) - - "⃓": [t: "rövid függőleges vonallal fedett díszítés"] # 0x20d3 (en: 'short vertical line overlay embellishment', DeepL translation) - - "⃔": [t: "az óramutató járásával ellentétes irányú nyíl a díszítés felett"] # 0x20d4 (en: 'anticlockwise arrow above embellishment', DeepL translation) - - "⃕": [t: "óramutató járásával megegyező irányú nyíl a díszítés felett"] # 0x20d5 (en: 'clockwise arrow above embellishment', DeepL translation) - - "⃖": [t: "bal nyíl a díszítés felett"] # 0x20d6 (en: 'left arrow above embellishment', DeepL translation) - - "⃗": [t: "jobbra nyíl fölött díszítés"] # 0x20d7 (en: 'right arrow above embellishment', DeepL translation) - - "⃘": [t: "gyűrű feletti díszítés"] # 0x20d8 (en: 'ring overlay embellishment', DeepL translation) - - "⃙": [t: "óramutató járásával megegyező gyűrűs feliratú díszítés"] # 0x20d9 (en: 'clockwise ring overlay embellishment', DeepL translation) - - "⃚": [t: "óramutató járásával ellentétes irányú gyűrű feletti díszítés"] # 0x20da (en: 'anticlockwise ring overlay embellishment', DeepL translation) - - "⃛": [t: "hármas pont"] # 0x20db (en: 'triple dot', DeepL translation) - - "⃜": [t: "négyes pont"] # 0x20dc (en: 'quadruple dot', DeepL translation) - - "⃝": [t: "bezáró kör díszítés"] # 0x20dd (en: 'enclosing circle embellishment', DeepL translation) - - "⃞": [t: "záró négyzet alakú díszítés"] # 0x20de (en: 'enclosing square embellishment', DeepL translation) - - "⃟": [t: "zárt gyémánt díszítés"] # 0x20df (en: 'enclosing diamond embellishment', DeepL translation) - - "⃠": [t: "bezáró kör visszafelé irányuló díszítés"] # 0x20e0 (en: 'enclosing circle backslash embellishment', DeepL translation) - - "⃡": [t: "balra jobbra nyíl a díszítés felett"] # 0x20e1 (en: 'left right arrow above embellishment', DeepL translation) - - "⃢": [t: "körülzáró képernyő díszítés"] # 0x20e2 (en: 'enclosing screen embellishment', DeepL translation) - - "⃣": [t: "zárt kulcsosházas díszítés"] # 0x20e3 (en: 'enclosing keycap embellishment', DeepL translation) - - "⃤": [t: "zárt felfelé mutató háromszög díszítés"] # 0x20e4 (en: 'enclosing upward pointing triangle embellishment', DeepL translation) - - "⃥": [t: "fordított solidus feletti díszítés"] # 0x20e5 (en: 'reverse solidus overlay embellishment', DeepL translation) - - "⃦": [t: "kettős függőleges vonás díszítés"] # 0x20e6 (en: 'double verticle stroke embellishment', DeepL translation) - - "⃧": [t: "járadékszimbólum díszítés"] # 0x20e7 (en: 'annuity symbol embellishment', DeepL translation) - - "⃨": [t: "háromszoros aláhúzás"] # 0x20e8 (en: 'triple underdot', DeepL translation) - - "⃩": [t: "széles híd a díszítés felett"] # 0x20e9 (en: 'wide bridge above embellishment', DeepL translation) - - "⃪": [t: "bal nyíl feletti díszítés"] # 0x20ea (en: 'left arrow overlay embellishment', DeepL translation) - - "⃫": [t: "hosszú kettős szolidus feliratú feliratos díszítés"] # 0x20eb (en: 'long double solidus overlay embellishment', DeepL translation) - - "⃬": [t: "jobb szigony lefelé szúrós díszítéssel"] # 0x20ec (en: 'right harpoon with barb down embellishment', DeepL translation) - - "⃭": [t: "bal szigony lefelé szúrós díszítéssel"] # 0x20ed (en: 'left harpoon with barb down embellishment', DeepL translation) - - "⃮": [t: "balra nyíl alatti díszítés"] # 0x20ee (en: 'left arrow below embellishment', DeepL translation) - - "⃯": [t: "jobbra mutató nyíl alatt díszítés"] # 0x20ef (en: 'right arrow below embellishment', DeepL translation) - - "⃰": [t: "csillag a díszítés felett"] # 0x20f0 (en: 'asterisk above embellishment', DeepL translation) - - "℄": [t: "középvonal szimbólum"] # 0x2104 (en: 'center line symbol', DeepL translation) - - "℅": [t: "care of"] # 0x2105 (DeepL translation) - - "℆": [t: "cada una"] # 0x2106 (DeepL translation) - - "ℇ": [t: "euler-állandó"] # 0x2107 (en: 'euler's constant', DeepL translation) - - "℈": [t: "skrupulusok"] # 0x2108 (en: 'scruples', DeepL translation) - - "℉": [t: "fok fahrenheit"] # 0x2109 (en: 'degrees fahrenheit', DeepL translation) - - "ℊ": [t: "írás g"] # 0x210a (en: 'script g', DeepL translation) + then: [T: "nagy átlós vonal"] # 0x203c (en: 'large slash', DeepL translation) + else: [T: "osztva"] # 0x203c (en: 'divided by', DeepL translation) + - "⁅": [T: "bal szögletes zárójel tollal"] # 0x2045 (en: 'left square bracket with quill', DeepL translation) + - "⁆": [T: "jobb szögletes zárójel tollal"] # 0x2046 (en: 'right square bracket with quill', DeepL translation) + - "※": [T: "referenciajel"] # 0x203b (en: 'reference mark', DeepL translation) + - "‿": [T: "alá kötés"] # 0x203F (en: 'under tie', DeepL translation) + - "⁀": [T: "nyakkendő"] # 0x2040 (en: 'tie', DeepL translation) + - "⁎": [T: "alacsony csillag"] # 0x204e (en: 'low asterisk', DeepL translation) + - "⁏": [T: "fordított pontosvessző"] # 0x204f (en: 'reversed semicolon', DeepL translation) + - "⁐": [T: "közelről"] # 0x2050 (en: 'close up', DeepL translation) + - "⁑": [T: "két függőleges csillag"] # 0x2051 (en: 'two vertical asterisks', DeepL translation) + - "⁒": [T: "kereskedelmi mínusz jel"] # 0x2052 (en: 'commercial minus sign', DeepL translation) + - "⁗": [T: "négyszeres prím"] # 0x2057 (en: 'quadruple prime', DeepL translation) + - "⁠": [T: ""] # 0x2060 + - "⁰": [T: "a nulladik hatványon"] # 0x2070 (en: 'to the zeroth power', DeepL translation) + - "ⁱ": [T: "i-edik hatványig"] # 0x2071 (en: 'to the i-th power', DeepL translation) + - "⁴": [T: "a negyedik hatványon"] # 0x2074 (en: 'to the fourth power', DeepL translation) + - "⁵": [T: "az ötödik hatványon"] # 0x2075 (en: 'to the fifth power', DeepL translation) + - "⁶": [T: "a hatodik hatványon"] # 0x2076 (en: 'to the sixth power', DeepL translation) + - "⁷": [T: "a hetedik hatványon"] # 0x2077 (en: 'to the seventh power', DeepL translation) + - "⁸": [T: "a nyolcadik hatványon"] # 0x2078 (en: 'to the eighth power', DeepL translation) + - "⁹": [T: "a kilencedik hatványon"] # 0x2079 (en: 'to the ninth power', DeepL translation) + - "⁺": [T: "felső index plusz"] # 0x207a (en: 'superscript plus sign', DeepL translation) + - "⁻": [T: "felső index mínusz"] # 0x207b (en: 'superscript minus', DeepL translation) + - "⁼": [T: "felső index egyenlő"] # 0x207c (en: 'superscript equals sign', DeepL translation) + - "⁽": [T: "felső index bal zárójel"] # 0x207d (en: 'superscript left parenthesis', DeepL translation) + - "⁾": [T: "felső index jobb zárójel"] # 0x207e (en: 'superscript right parenthesis', DeepL translation) + - "ⁿ": [T: "az n-edik hatványon"] # 0x207f (en: 'to the ennth power', DeepL translation) + - "₀": [T: "alsó index nulla"] # 0x2080 (en: 'sub zero', DeepL translation) + - "₁": [T: "alsó index egy"] # 0x2081 (en: 'sub one', DeepL translation) + - "₂": [T: "alsó index kettő"] # 0x2082 (en: 'sub two', DeepL translation) + - "₃": [T: "alsó index három"] # 0x2083 (en: 'sub three', DeepL translation) + - "₄": [T: "alsó index négy"] # 0x2084 (en: 'sub four', DeepL translation) + - "₅": [T: "alsó index öt"] # 0x2085 (DeepL translation) + - "₆": [T: "alsó index hat"] # 0x2086 (en: 'sub six', DeepL translation) + - "₇": [T: "alsó index hét"] # 0x2087 (DeepL translation) + - "₈": [T: "alsó index nyolc"] # 0x2088 (en: 'sub eight', DeepL translation) + - "₉": [T: "alsó index kilenc"] # 0x2089 (DeepL translation) + - "₊": [T: "alsó index plusz"] # 0x208a (en: 'subscript plus sign', DeepL translation) + - "₋": [T: "alsó index mínusz"] # 0x208b (en: 'subscript minus sign', DeepL translation) + - "₌": [T: "alsó index egyenlő"] # 0x208c (en: 'subscript equals sign', DeepL translation) + - "₍": [T: "alsó index balzárójel"] # 0x208d (en: 'subscript left parenthesis', DeepL translation) + - "₎": [T: "alsó index jobbzárójel"] # 0x208e (en: 'subscript right parenthesis', DeepL translation) + - "ₐ": [T: "alsó index a"] # 0x2090 (en: 'sub A', DeepL translation) + - "ₑ": [T: "alsó index e"] # 0x2091 (en: 'sub E', DeepL translation) + - "ₒ": [T: "alsó index o"] # 0x2092 (en: 'sub O', DeepL translation) + - "ₓ": [T: "alsó index x"] # 0x2093 (en: 'sub X', DeepL translation) + - "ₕ": [T: "alsó index h"] # 0x2095 (en: 'sub H', DeepL translation) + - "ₖ": [T: "alsó index k"] # 0x2096 (en: 'sub K', DeepL translation) + - "ₗ": [T: "alsó index l"] # 0x2097 (en: 'sub L', DeepL translation) + - "ₘ": [T: "alsó index m"] # 0x2098 (en: 'sub M', DeepL translation) + - "ₙ": [T: "alsó index n"] # 0x2099 (en: 'sub N', DeepL translation) + - "ₚ": [T: "alsó index p"] # 0x209a (en: 'sub P', DeepL translation) + - "ₛ": [T: "alsó index s"] # 0x209b (en: 'sub S', DeepL translation) + - "ₜ": [T: "alsó index t"] # 0x209c (en: 'sub T', DeepL translation) + - "₠": [T: "európai áramegységek"] # 0x20a0 (en: 'european currenty units', DeepL translation) + - "₡": [T: "kettőspontok"] # 0x20a1 (en: 'colons', DeepL translation) + - "₢": [T: "cruzeiro"] # 0x20a2 (DeepL translation) + - "₣": [T: "frank"] # 0x20a3 (en: 'franc', DeepL translation) + - "₤": [T: "líra"] # 0x20a4 (en: 'lira', DeepL translation) + - "₥": [T: "malmok"] # 0x20a5 (en: 'mills', DeepL translation) + - "₦": [T: "naira"] # 0x20a6 (DeepL translation) + - "₧": [T: "peseta"] # 0x20a7 (DeepL translation) + - "₨": [T: "rúpiák"] # 0x20a8 (en: 'rupees', DeepL translation) + - "₩": [T: "won"] # 0x20a9 (en: 'won', DeepL translation) + - "₪": [T: "új sheqel"] # 0x20aa (en: 'new sheqels', DeepL translation) + - "₫": [T: "dong"] # 0x20ab (DeepL translation) + - "€": [T: "euró"] # 0x20ac (en: 'euros', DeepL translation) + - "₭": [T: "kip"] # 0x20ad (DeepL translation) + - "₮": [T: "tugrik"] # 0x20ae (DeepL translation) + - "₯": [T: "drachma"] # 0x20af (DeepL translation) + - "₰": [T: "német fillér"] # 0x20b0 (en: 'german pennies', DeepL translation) + - "₱": [T: "peso"] # 0x20b1 (en: 'pesos', DeepL translation) + - "₲": [T: "guaranis"] # 0x20b2 (DeepL translation) + - "₳": [T: "ausztrálok"] # 0x20b3 (en: 'australs', DeepL translation) + - "₴": [T: "hrivnyák"] # 0x20b4 (en: 'hryvnias', DeepL translation) + - "₵": [T: "cedi"] # 0x20b5 (en: 'cedis', DeepL translation) + - "₶": [T: "torinói livre"] # 0x20b6 (DeepL translation) + - "₷": [T: "spesmilos"] # 0x20b7 (DeepL translation) + - "₸": [T: "tenges"] # 0x20b8 (DeepL translation) + - "₹": [T: "indiai rúpia"] # 0x20b9 (en: 'indian rupees', DeepL translation) + - "₺": [T: "török líra"] # 0x20ba (en: 'turkish liras', DeepL translation) + - "⃐": [T: "bal szigony felett díszítés"] # 0x20d0 (en: 'left harpoon above embellishment', DeepL translation) + - "⃑": [T: "jobb szigony a díszítés felett"] # 0x20d1 (en: 'right harpoon above embellishment', DeepL translation) + - "⃒": [T: "hosszú függőleges vonal feletti díszítés"] # 0x20d2 (en: 'long vertical line overlay embellishment', DeepL translation) + - "⃓": [T: "rövid függőleges vonallal fedett díszítés"] # 0x20d3 (en: 'short vertical line overlay embellishment', DeepL translation) + - "⃔": [T: "az óramutató járásával ellentétes irányú nyíl a díszítés felett"] # 0x20d4 (en: 'anticlockwise arrow above embellishment', DeepL translation) + - "⃕": [T: "az óramutató járásával megegyező irányú nyíl a díszítés felett"] # 0x20d5 (en: 'clockwise arrow above embellishment', DeepL translation) + - "⃖": [T: "bal nyíl a díszítés felett"] # 0x20d6 (en: 'left arrow above embellishment', DeepL translation) + - "⃗": [T: "jobb nyíl a díszítés fölött"] # 0x20d7 (en: 'right arrow above embellishment', DeepL translation) + - "⃘": [T: "gyűrű feletti díszítés"] # 0x20d8 (en: 'ring overlay embellishment', DeepL translation) + - "⃙": [T: "óramutató járásával megegyező gyűrűs feliratú díszítés"] # 0x20d9 (en: 'clockwise ring overlay embellishment', DeepL translation) + - "⃚": [T: "óramutató járásával ellentétes irányú gyűrű feletti díszítés"] # 0x20da (en: 'anticlockwise ring overlay embellishment', DeepL translation) + - "⃛": [T: "hármas pont"] # 0x20db (en: 'triple dot', DeepL translation) + - "⃜": [T: "négyes pont"] # 0x20dc (en: 'quadruple dot', DeepL translation) + - "⃝": [T: "bezáró kör díszítés"] # 0x20dd (en: 'enclosing circle embellishment', DeepL translation) + - "⃞": [T: "záró négyzet alakú díszítés"] # 0x20de (en: 'enclosing square embellishment', DeepL translation) + - "⃟": [T: "zárt gyémánt díszítés"] # 0x20df (en: 'enclosing diamond embellishment', DeepL translation) + - "⃠": [T: "bezáró kör, visszafelé irányuló díszítéssel"] # 0x20e0 (en: 'enclosing circle backslash embellishment', DeepL translation) + - "⃡": [T: "balra jobbra nyíl a díszítés felett"] # 0x20e1 (en: 'left right arrow above embellishment', DeepL translation) + - "⃢": [T: "körülzáró képernyő díszítés"] # 0x20e2 (en: 'enclosing screen embellishment', DeepL translation) + - "⃣": [T: "zárt kulcsosházas díszítés"] # 0x20e3 (en: 'enclosing keycap embellishment', DeepL translation) + - "⃤": [T: "zárt felfelé mutató háromszög díszítés"] # 0x20e4 (en: 'enclosing upward pointing triangle embellishment', DeepL translation) + - "⃥": [T: "fordított solidus feletti díszítés"] # 0x20e5 (en: 'reverse solidus overlay embellishment', DeepL translation) + - "⃦": [T: "dupla függőleges ecsetvonás díszítés"] # 0x20e6 (en: 'double verticle stroke embellishment', DeepL translation) + - "⃧": [T: "járadékszimbólum díszítés"] # 0x20e7 (en: 'annuity symbol embellishment', DeepL translation) + - "⃨": [T: "háromszoros aláhúzás"] # 0x20e8 (en: 'triple underdot', DeepL translation) + - "⃩": [T: "széles híd a díszítés felett"] # 0x20e9 (en: 'wide bridge above embellishment', DeepL translation) + - "⃪": [T: "bal nyíl feletti díszítés"] # 0x20ea (en: 'left arrow overlay embellishment', DeepL translation) + - "⃫": [T: "hosszú dupla szolidus feliratú díszítés"] # 0x20eb (en: 'long double solidus overlay embellishment', DeepL translation) + - "⃬": [T: "jobb szigony kampós díszítéssel"] # 0x20ec (en: 'right harpoon with barb down embellishment', DeepL translation) + - "⃭": [T: "bal szigony kampós díszítéssel"] # 0x20ed (en: 'left harpoon with barb down embellishment', DeepL translation) + - "⃮": [T: "balra nyíl alatti díszítés"] # 0x20ee (en: 'left arrow below embellishment', DeepL translation) + - "⃯": [T: "jobbra nyíl alatti díszítés"] # 0x20ef (en: 'right arrow below embellishment', DeepL translation) + - "⃰": [T: "csillag a díszítés felett"] # 0x20f0 (en: 'asterisk above embellishment', DeepL translation) + - "℄": [T: "középvonal szimbólum"] # 0x2104 (en: 'center line symbol', DeepL translation) + - "℅": [T: "gondoskodik valamiről"] # 0x2105 (DeepL translation) + - "℆": [T: "egyből"] # 0x2106 (DeepL translation) + - "ℇ": [T: "euler-állandó"] # 0x2107 (en: 'euler's constant', DeepL translation) + - "℈": [T: "skrupulusok"] # 0x2108 (en: 'scruples', DeepL translation) + - "℉": [T: "fahrenheit fok"] # 0x2109 (en: 'degrees fahrenheit', DeepL translation) + - "ℊ": [T: "alsó index g"] # 0x210a (en: 'script g', DeepL translation) - "ℌℑℨℭ": # 0x210c, 0x2111, 0x2128, 0x212d - - t: "fraktur" # (DeepL translation) - - spell: "translate('.', 'ℌℑℨℭ', 'HIZC')" + - T: "fraktur" # (DeepL translation) + - SPELL: "translate('.', 'ℌℑℨℭ', 'HIZC')" - "ℍℙℾℿ": # 0x210d, 0x2119, 0x213e, 0x213f - T: "dupla leütésű" # (en: 'double struck', DeepL translation) - - spell: "translate('.', 'ℍℙℾℿ', 'HPΓΠ')" + - SPELL: "translate('.', 'ℍℙℾℿ', 'HPΓΠ')" - - "ℎ": [t: "planck-állandó"] # 0x210e (en: 'planck constant', DeepL translation) - - "ℏ": [t: "h bar"] # 0x210f (DeepL translation) + - "ℎ": [T: "planck-állandó"] # 0x210e (en: 'planck constant', DeepL translation) + - "ℏ": [T: "h bar"] # 0x210f (DeepL translation) - "ℐℒ℘ℬℰℱℳ": # 0x2110, 0x2112, 0x2118, 0x2130, 0x2131, 0x2133 - - t: "script" # (DeepL translation) - - spell: "translate('.', 'ℐℒ℘ℬℰℱℳ', 'ILPBEFM')" - - - "ℓ": [t: "írás l"] # 0x2113 (en: 'script l', DeepL translation) - - "℔": [t: "font"] # 0x2114 (en: 'pounds', DeepL translation) - - "№": [t: "szám"] # 0x2116 (en: 'number', DeepL translation) - - "℥": [t: "unciák"] # 0x2125 (en: 'ounces', DeepL translation) - - "Ω": [t: "ohm"] # 0x2126 (en: 'ohms', DeepL translation) - - "℧": [t: "mhos"] # 0x2127 (DeepL translation) - - "℩": [t: "fordított jota"] # 0x2129 (en: 'turned iota', DeepL translation) - - "K": [t: "kelvin"] # 0x212a (DeepL translation) - - "Å": [t: "angström"] # 0x212b (en: 'angstroms', DeepL translation) - - "ℯ": [t: "írás e"] # 0x212f (en: 'script e', DeepL translation) + - T: "alsó index" # (DeepL translation) + - SPELL: "translate('.', 'ℐℒ℘ℬℰℱℳ', 'ILPBEFM')" + + - "ℓ": [T: "alsó index l"] # 0x2113 (en: 'script l', DeepL translation) + - "℔": [T: "font"] # 0x2114 (en: 'pounds', DeepL translation) + - "№": [T: "szám"] # 0x2116 (en: 'number', DeepL translation) + - "℥": [T: "unciák"] # 0x2125 (en: 'ounces', DeepL translation) + - "Ω": [T: "ohm"] # 0x2126 (en: 'ohms', DeepL translation) + - "℧": [T: "mhos"] # 0x2127 (DeepL translation) + - "℩": [T: "fordított jota"] # 0x2129 (en: 'turned iota', DeepL translation) + - "K": [T: "kelvin"] # 0x212a (DeepL translation) + - "Å": [T: "angström"] # 0x212b (en: 'angstroms', DeepL translation) + - "ℯ": [T: "alsó index e"] # 0x212f (en: 'script e', DeepL translation) # coalesced some chars that use cap letters - "Ⅎ℺⅁⅂⅃⅄": # 0x2132, 0x213a, 0x2141, 0x2142, 0x2143, 0x2144 - test: - if: "'.' = '℺'" - then: [t: "forgatott"] # (en: 'rotated', DeepL translation) + then: [T: "forgatott"] # (en: 'rotated', DeepL translation) - else_if: "'.' = 'Ⅎ'" then: [T: "fordított"] # (en: 'turned', DeepL translation) - else_if: "'.' = '⅃'" then: [T: "fordított talpatlan"] # (en: 'reversed sans-serif', DeepL translation) else: [T: "fordított talpatlan"] # (en: 'turned sans-serif', DeepL translation) - - spell: "translate('.', 'Ⅎ℺⅁⅂⅃⅄', 'FQGLLY')" - - - "ℴ": [t: "írás o"] # 0x2134 (en: 'script o', DeepL translation) - - "ℵ": [t: "első transzfinit kardinális"] # 0x2135 (en: 'first transfinite cardinal', DeepL translation) - - "ℶ": [t: "második transzfinit kardinális"] # 0x2136 (en: 'second transfinite cardinal', DeepL translation) - - "ℷ": [t: "harmadik transzfinit kardinális"] # 0x2137 (en: 'third transfinite cardinal', DeepL translation) - - "ℸ": [t: "negyedik transzfinit kardinális"] # 0x2138 (en: 'fourth transfinite cardinal', DeepL translation) - - "ℼ": [t: "dupla leütött pi"] # 0x213c (en: 'double struck pi', DeepL translation) - - "ℽ": [t: "dupla csapott gamma"] # 0x213d (en: 'double struck gamma', DeepL translation) - - "⅀": [t: "kettős leütött n-es összegzés"] # 0x2140 (en: 'double struck n-ary summation', DeepL translation) - - "⅋": [t: "fordított erősítőjel"] # 0x214b (en: 'turned ampersand', DeepL translation) - - "⅌": [t: "per"] # 0x214c (DeepL translation) - - "ⅎ": [t: "fordított f"] # 0x214e (en: 'turned F', DeepL translation) - - "¼": [t: "egy negyed"] # 0x00bc (en: 'one quarter', DeepL translation) - - "½": [t: "egy fél"] # 0x00bd (en: 'one half', DeepL translation) - - "¾": [t: "háromnegyedes zárójel"] # 0x00be (en: 'three quarters', DeepL translation) - - "⅐": [t: "egy hetedik"] # 0x2150 (en: 'one seventh', DeepL translation) - - "⅑": [t: "egy kilencedik"] # 0x2151 (en: 'one ninth', DeepL translation) - - "⅒": [t: "egy tized"] # 0x2152 (en: 'one tenth', DeepL translation) - - "⅓": [t: "egyharmad"] # 0x2153 (en: 'one third', DeepL translation) - - "⅔": [t: "két harmad"] # 0x2154 (en: 'two thirds', DeepL translation) - - "⅕": [t: "egy ötödik"] # 0x2155 (en: 'one fifth', DeepL translation) - - "⅖": [t: "két ötöd"] # 0x2156 (en: 'two fifths', DeepL translation) - - "⅗": [t: "három ötödik"] # 0x2157 (en: 'three fifths', DeepL translation) - - "⅘": [t: "négy ötöd"] # 0x2158 (en: 'four fifths', DeepL translation) - - "⅙": [t: "egy hatod"] # 0x2159 (en: 'one sixth', DeepL translation) - - "⅚": [t: "öt hatod"] # 0x215a (en: 'five sixths', DeepL translation) - - "⅛": [t: "egy ath"] # 0x215b (en: 'one eighth', DeepL translation) - - "⅜": [t: "három aths"] # 0x215c (en: 'three eighths', DeepL translation) - - "⅝": [t: "öt at"] # 0x215d (en: 'five eighths', DeepL translation) - - "⅞": [t: "hét atlasz"] # 0x215e (en: 'seven eighths', DeepL translation) - - "⅟": [t: "egy fölött"] # 0x215f (en: 'one over', DeepL translation) - - "Ⅰ": [t: "Ⅰ"] # 0x2160 (en: 'I', DeepL translation) - - "Ⅱ": [t: "i i"] # 0x2161 (en: 'I I', DeepL translation) - - "Ⅲ": [t: "i i i i"] # 0x2162 (en: 'I I I', DeepL translation) - - "Ⅳ": [t: "i v"] # 0x2163 (en: 'I V', DeepL translation) - - "Ⅴ": [t: "Ⅴ"] # 0x2164 (en: 'V', DeepL translation) - - "Ⅵ": [t: "v i"] # 0x2165 (en: 'V I', DeepL translation) - - "Ⅶ": [t: "v i i"] # 0x2166 (en: 'V I I', DeepL translation) - - "Ⅷ": [t: "v i i i i"] # 0x2167 (en: 'V I I I', DeepL translation) - - "Ⅸ": [t: "i x"] # 0x2168 (en: 'I X', DeepL translation) - - "Ⅹ": [t: "Ⅹ"] # 0x2169 (en: 'X', DeepL translation) - - "Ⅺ": [t: "x i"] # 0x216a (en: 'X I', DeepL translation) - - "Ⅻ": [t: "x i i"] # 0x216b (en: 'X I I', DeepL translation) - - "Ⅼ": [t: "Ⅼ"] # 0x216c (en: 'L', DeepL translation) - - "Ⅽ": [t: "Ⅽ"] # 0x216d (en: 'C', DeepL translation) - - "Ⅾ": [t: "Ⅾ"] # 0x216e (en: 'D', DeepL translation) - - "Ⅿ": [t: "Ⅿ"] # 0x216f (en: 'M', DeepL translation) - - "ⅰ": [t: "ⅰ"] # 0x2170 (en: 'I', DeepL translation) - - "ⅱ": [t: "i i"] # 0x2171 (en: 'I I', DeepL translation) - - "ⅲ": [t: "i i i i"] # 0x2172 (en: 'I I I', DeepL translation) - - "ⅳ": [t: "i v"] # 0x2173 (en: 'I V', DeepL translation) - - "ⅴ": [t: "ⅴ"] # 0x2174 (en: 'V', DeepL translation) - - "ⅵ": [t: "v i"] # 0x2175 (en: 'V I', DeepL translation) - - "ⅶ": [t: "v i i"] # 0x2176 (en: 'V I I', DeepL translation) - - "ⅷ": [t: "v i i i i"] # 0x2177 (en: 'V I I I', DeepL translation) - - "ⅸ": [t: "i x"] # 0x2178 (en: 'I X', DeepL translation) - - "ⅹ": [t: "ⅹ"] # 0x2179 (en: 'X', DeepL translation) - - "ⅺ": [t: "x i"] # 0x217a (en: 'X I', DeepL translation) - - "ⅻ": [t: "x i i"] # 0x217b (en: 'X I I', DeepL translation) - - "ⅼ": [t: "ⅼ"] # 0x217c (en: 'L', DeepL translation) - - "ⅽ": [t: "ⅽ"] # 0x217d (en: 'C', DeepL translation) - - "ⅾ": [t: "ⅾ"] # 0x217e (en: 'D', DeepL translation) - - "ⅿ": [t: "ⅿ"] # 0x217f (en: 'M', DeepL translation) - - "↉": [t: "nulla harmadok"] # 0x2189 (en: 'zero thirds', DeepL translation) - - "↔": [t: "balra jobbra nyíl"] # 0x2194 (en: 'left right arrow', DeepL translation) - - "↕": [t: "felfelé lefelé mutató nyíl"] # 0x2195 (en: 'up down arrow', DeepL translation) - - "↖": [t: "északnyugati nyíl"] # 0x2196 (en: 'north west arrow', DeepL translation) + - SPELL: "translate('.', 'Ⅎ℺⅁⅂⅃⅄', 'FQGLLY')" + + - "ℴ": [T: "alsó index o"] # 0x2134 (en: 'script o', DeepL translation) + - "ℵ": [T: "első transzfinit kardinális"] # 0x2135 (en: 'first transfinite cardinal', DeepL translation) + - "ℶ": [T: "második transzfinit kardinális"] # 0x2136 (en: 'second transfinite cardinal', DeepL translation) + - "ℷ": [T: "harmadik transzfinit kardinális"] # 0x2137 (en: 'third transfinite cardinal', DeepL translation) + - "ℸ": [T: "negyedik transzfinit kardinális"] # 0x2138 (en: 'fourth transfinite cardinal', DeepL translation) + - "ℼ": [T: "dupla leütött pi"] # 0x213c (en: 'double struck pi', DeepL translation) + - "ℽ": [T: "dupla leütött gamma"] # 0x213d (en: 'double struck gamma', DeepL translation) + - "⅀": [T: "kettős leütött n-es összegzés"] # 0x2140 (en: 'double struck n-ary summation', DeepL translation) + - "⅋": [T: "fordított erősítőjel"] # 0x214b (en: 'turned ampersand', DeepL translation) + - "⅌": [T: "per"] # 0x214c (DeepL translation) + - "ⅎ": [T: "fordított f"] # 0x214e (en: 'turned F', DeepL translation) + - "¼": [T: "egy negyed"] # 0x00bc (en: 'one quarter', DeepL translation) + - "½": [T: "egy fél"] # 0x00bd (en: 'one half', DeepL translation) + - "¾": [T: "három negyed"] # 0x00be (en: 'three quarters', DeepL translation) + - "⅐": [T: "egy heted"] # 0x2150 (en: 'one seventh', DeepL translation) + - "⅑": [T: "egy kilenced"] # 0x2151 (en: 'one ninth', DeepL translation) + - "⅒": [T: "egy tized"] # 0x2152 (en: 'one tenth', DeepL translation) + - "⅓": [T: "egyharmad"] # 0x2153 (en: 'one third', DeepL translation) + - "⅔": [T: "két harmad"] # 0x2154 (en: 'two thirds', DeepL translation) + - "⅕": [T: "egy ötöd"] # 0x2155 (en: 'one fifth', DeepL translation) + - "⅖": [T: "két ötöd"] # 0x2156 (en: 'two fifths', DeepL translation) + - "⅗": [T: "három ötöd"] # 0x2157 (en: 'three fifths', DeepL translation) + - "⅘": [T: "négy ötöd"] # 0x2158 (en: 'four fifths', DeepL translation) + - "⅙": [T: "egy hatod"] # 0x2159 (en: 'one sixth', DeepL translation) + - "⅚": [T: "öt hatod"] # 0x215a (en: 'five sixths', DeepL translation) + - "⅛": [T: "egy nyolcad"] # 0x215b (en: 'one eighth', DeepL translation) + - "⅜": [T: "három nyolcad"] # 0x215c (en: 'three eighths', DeepL translation) + - "⅝": [T: "öt nyolcad"] # 0x215d (en: 'five eighths', DeepL translation) + - "⅞": [T: "hét nyolcad"] # 0x215e (en: 'seven eighths', DeepL translation) + - "⅟": [T: "egy fölött"] # 0x215f (en: 'one over', DeepL translation) + - "Ⅰ": [T: "I"] # 0x2160 (en: 'I', DeepL translation) + - "Ⅱ": [T: "I I"] # 0x2161 (en: 'I I', DeepL translation) + - "Ⅲ": [T: "Ii I I"] # 0x2162 (en: 'I I I', DeepL translation) + - "Ⅳ": [T: "I V"] # 0x2163 (en: 'I V', DeepL translation) + - "Ⅴ": [T: "V"] # 0x2164 (en: 'V', DeepL translation) + - "Ⅵ": [T: "V I"] # 0x2165 (en: 'V I', DeepL translation) + - "Ⅶ": [T: "V I I"] # 0x2166 (en: 'V I I', DeepL translation) + - "Ⅷ": [T: "V I I I"] # 0x2167 (en: 'V I I I', DeepL translation) + - "Ⅸ": [T: "I X"] # 0x2168 (en: 'I X', DeepL translation) + - "Ⅹ": [T: "X"] # 0x2169 (en: 'X', DeepL translation) + - "Ⅺ": [T: "X I"] # 0x216a (en: 'X I', DeepL translation) + - "Ⅻ": [T: "X I I"] # 0x216b (en: 'X I I', DeepL translation) + - "Ⅼ": [T: "L"] # 0x216c (en: 'L', DeepL translation) + - "Ⅽ": [T: "C"] # 0x216d (en: 'C', DeepL translation) + - "Ⅾ": [T: "D"] # 0x216e (en: 'D', DeepL translation) + - "Ⅿ": [T: "M"] # 0x216f (en: 'M', DeepL translation) + - "ⅰ": [T: "I"] # 0x2170 (en: 'I', DeepL translation) + - "ⅱ": [T: "I I"] # 0x2171 (en: 'I I', DeepL translation) + - "ⅲ": [T: "I I I"] # 0x2172 (en: 'I I I', DeepL translation) + - "ⅳ": [T: "I V"] # 0x2173 (en: 'I V', DeepL translation) + - "ⅴ": [T: "V"] # 0x2174 (en: 'V', DeepL translation) + - "ⅵ": [T: "V I"] # 0x2175 (en: 'V I', DeepL translation) + - "ⅶ": [T: "V I I"] # 0x2176 (en: 'V I I', DeepL translation) + - "ⅷ": [T: "V I I I"] # 0x2177 (en: 'V I I I', DeepL translation) + - "ⅸ": [T: "I X"] # 0x2178 (en: 'I X', DeepL translation) + - "ⅹ": [T: "X"] # 0x2179 (en: 'X', DeepL translation) + - "ⅺ": [T: "X I"] # 0x217a (en: 'X I', DeepL translation) + - "ⅻ": [T: "X I I"] # 0x217b (en: 'X I I', DeepL translation) + - "ⅼ": [T: "L"] # 0x217c (en: 'L', DeepL translation) + - "ⅽ": [T: "C"] # 0x217d (en: 'C', DeepL translation) + - "ⅾ": [T: "D"] # 0x217e (en: 'D', DeepL translation) + - "ⅿ": [T: "M"] # 0x217f (en: 'M', DeepL translation) + - "↉": [T: "nulla harmad"] # 0x2189 (en: 'zero thirds', DeepL translation) + - "↔": [T: "balra jobbra nyíl"] # 0x2194 (en: 'left right arrow', DeepL translation) + - "↕": [T: "felfelé lefelé mutató nyíl"] # 0x2195 (en: 'up down arrow', DeepL translation) + - "↖": [T: "északnyugati nyíl"] # 0x2196 (en: 'north west arrow', DeepL translation) - "↗": # 0x2197 - test: if: "ancestor::*[2][self::m:limit]" - then: [t: "alulról közelít"] # (en: 'approaches from below', DeepL translation) - else: [t: "északkeleti nyíl"] # (en: 'north east arrow', DeepL translation) + then: [T: "alulról közelít"] # (en: 'approaches from below', DeepL translation) + else: [T: "északkeleti nyíl"] # (en: 'north east arrow', DeepL translation) - "↘": # 0x2198 - test: if: "ancestor::*[2][self::m:limit]" - then: [t: "felülről közelít"] # (en: 'approaches from above', DeepL translation) - else: [t: "délkeleti nyíl"] # (en: 'south east arrow', DeepL translation) - - - "↙": [t: "délnyugati nyíl"] # 0x2199 (en: 'south west arrow', DeepL translation) - - "↚": [t: "balra nyíl vonallal"] # 0x219a (en: 'left arrow with stroke', DeepL translation) - - "↛": [t: "jobbra mutató nyíl vonallal"] # 0x219b (en: 'right arrow with stroke', DeepL translation) - - "↜": [t: "bal oldali hullámos nyíl"] # 0x219c (en: 'left wave arrow', DeepL translation) - - "↝": [t: "jobb oldali hullámos nyíl"] # 0x219d (en: 'right wave arrow', DeepL translation) - - "↞": [t: "bal kétfejű nyíl"] # 0x219e (en: 'left two headed arrow', DeepL translation) - - "↟": [t: "felfelé kétfejű nyíl"] # 0x219f (en: 'up two headed arrow', DeepL translation) - - "↠": [t: "jobb kétfejű nyíl"] # 0x21a0 (en: 'right two headed arrow', DeepL translation) - - "↡": [t: "lefelé kétfejű nyíl"] # 0x21a1 (en: 'down two headed arrow', DeepL translation) - - "↢": [t: "balra mutató nyíl farokkal"] # 0x21a2 (en: 'left arrow with tail', DeepL translation) - - "↣": [t: "jobbra mutató nyíl farokkal"] # 0x21a3 (en: 'right arrow with tail', DeepL translation) - - "↤": [t: "bal nyíl a sávból"] # 0x21a4 (en: 'left arrow from bar', DeepL translation) - - "↥": [t: "felfelé mutató nyíl vonaltól"] # 0x21a5 (en: 'up arrow from bar', DeepL translation) - - "↦": [t: "jobbra mutató nyíl a sávból"] # 0x21a6 (en: 'right arrow from bar', DeepL translation) - - "↧": [t: "lefelé mutató nyíl a sávból"] # 0x21a7 (en: 'down arrow from bar', DeepL translation) - - "↨": [t: "fel-le nyíl alappal"] # 0x21a8 (en: 'up down arrow with base', DeepL translation) - - "↩": [t: "bal nyíl horoggal"] # 0x21a9 (en: 'left arrow with hook', DeepL translation) - - "↪": [t: "jobbra mutató nyíl horoggal"] # 0x21aa (en: 'right arrow with hook', DeepL translation) - - "↫": [t: "bal nyíl hurokkal"] # 0x21ab (en: 'left arrow with loop', DeepL translation) - - "↬": [t: "jobbra mutató nyíl hurokkal"] # 0x21ac (en: 'right arrow with loop', DeepL translation) - - "↭": [t: "balra jobbra hullámzó nyíl"] # 0x21ad (en: 'left right wave arrow', DeepL translation) - - "↮": [t: "balra jobbra nyíl függőleges vonallal"] # 0x21ae (en: 'left right arrow with stroke', DeepL translation) - - "↯": [t: "lefelé cikkcakkos nyíl"] # 0x21af (en: 'down zigzag arrow', DeepL translation) - - "↰": [t: "felfelé mutató nyíl hegyével balra"] # 0x21b0 (en: 'up arrow with tip left', DeepL translation) - - "↱": [t: "felfelé mutató nyíl jobbra mutató hegyével"] # 0x21b1 (en: 'up arrow with tip right', DeepL translation) - - "↲": [t: "lefelé mutató nyíl bal csúccsal"] # 0x21b2 (en: 'down arrow with tip left', DeepL translation) - - "↳": [t: "lefelé mutató nyíl hegyével jobbra"] # 0x21b3 (en: 'down arrow with tip right', DeepL translation) - - "↴": [t: "jobbra nyíl sarokkal lefelé"] # 0x21b4 (en: 'right arrow with corner down', DeepL translation) - - "↵": [t: "lefelé mutató nyíl bal oldali sarokkal"] # 0x21b5 (en: 'down arrow with corner left', DeepL translation) - - "↶": [t: "az óramutató járásával ellentétes irányú felső félköríves nyíl"] # 0x21b6 (en: 'anticlockwise top semicircle arrow', DeepL translation) - - "↷": [t: "óramutató járásával megegyezően felső félköríves nyíl"] # 0x21b7 (en: 'clockwise top semicircle arrow', DeepL translation) - - "↸": [t: "északnyugati nyíl a hosszú sávra"] # 0x21b8 (en: 'north west arrow to long bar', DeepL translation) - - "↹": [t: "bal nyíl a sáv fölé jobb nyíl a sáv fölé"] # 0x21b9 (en: 'left arrow to bar over right arrow to bar', DeepL translation) - - "↺": [t: "az óramutató járásával ellentétes irányban nyitott kör alakú nyíl"] # 0x21ba (en: 'anticlockwise open circle arrow', DeepL translation) - - "↻": [t: "az óramutató járásával megegyező irányban nyitott kör nyíl"] # 0x21bb (en: 'clockwise open circle arrow', DeepL translation) - - "↼": [t: "bal oldali szigony felfelé"] # 0x21bc (en: 'left harpoon up', DeepL translation) - - "↽": [t: "bal szigony lefelé"] # 0x21bd (en: 'left harpoon down', DeepL translation) - - "↾": [t: "felfelé szigony jobbra"] # 0x21be (en: 'up harpoon right', DeepL translation) - - "↿": [t: "fel szigony balra"] # 0x21bf (en: 'up harpoon left', DeepL translation) - - "⇀": [t: "jobb szigony felfelé"] # 0x21c0 (en: 'right harpoon up', DeepL translation) - - "⇁": [t: "jobb szigony lefelé"] # 0x21c1 (en: 'right harpoon down', DeepL translation) - - "⇂": [t: "lefelé szigony jobbra"] # 0x21c2 (en: 'down harpoon right', DeepL translation) - - "⇃": [t: "lefelé mutató szigony balra"] # 0x21c3 (en: 'down harpoon left', DeepL translation) - - "⇄": [t: "jobb nyíl bal nyíl fölött"] # 0x21c4 (en: 'right arrow over left arrow', DeepL translation) - - "⇅": [t: "felfelé nyíl balra a lefelé nyílból"] # 0x21c5 (en: 'up arrow left of down arrow', DeepL translation) - - "⇆": [t: "bal nyíl jobb nyíl felett"] # 0x21c6 (en: 'left arrow over right arrow', DeepL translation) - - "⇇": [t: "bal párosított nyilak"] # 0x21c7 (en: 'left paired arrows', DeepL translation) - - "⇈": [t: "felfelé párosított nyilak"] # 0x21c8 (en: 'up paired arrows', DeepL translation) - - "⇉": [t: "jobb oldali párosított nyilak"] # 0x21c9 (en: 'right paired arrows', DeepL translation) - - "⇊": [t: "lefelé párosított nyilak"] # 0x21ca (en: 'down paired arrows', DeepL translation) - - "⇋": [t: "bal szigony a jobb szigony felett"] # 0x21cb (en: 'left harpoon over right harpoon', DeepL translation) - - "⇌": [t: "jobb szigony a bal szigony felett"] # 0x21cc (en: 'right harpoon over left harpoon', DeepL translation) - - "⇍": [t: "bal kettős nyíl függőleges vonallal"] # 0x21cd (en: 'left double arrow with stroke', DeepL translation) - - "⇎": [t: "balra jobbra dupla nyíl függőleges vonallal"] # 0x21ce (en: 'left right double arrow with stroke', DeepL translation) - - "⇏": [t: "jobb oldali kettős nyíl vonallal"] # 0x21cf (en: 'right double arrow with stroke', DeepL translation) - - "⇐": [t: "bal dupla nyíl"] # 0x21d0 (en: 'left double arrow', DeepL translation) - - "⇑": [t: "felfelé mutató kettős nyíl"] # 0x21d1 (en: 'up double arrow', DeepL translation) - - "⇒": [t: "implikálja"] # 0x21d2 (en: 'implies', DeepL translation) - - "⇓": [t: "lefelé dupla nyíl"] # 0x21d3 (en: 'down double arrow', DeepL translation) - - "⇔": [t: "ha és csak ha"] # 0x21d4 (en: 'if and only if', DeepL translation) - - "⇕": [t: "fel le dupla nyíl"] # 0x21d5 (en: 'up down double arrow', DeepL translation) - - "⇖": [t: "északnyugat kettős nyíl"] # 0x21d6 (en: 'north west double arrow', DeepL translation) - - "⇗": [t: "északkelet kettős nyíl"] # 0x21d7 (en: 'north east double arrow', DeepL translation) - - "⇘": [t: "délkeleti kettős nyíl"] # 0x21d8 (en: 'south east double arrow', DeepL translation) - - "⇙": [t: "délnyugati kettős nyíl"] # 0x21d9 (en: 'south west double arrow', DeepL translation) - - "⇚": [t: "bal hármas nyíl"] # 0x21da (en: 'left triple arrow', DeepL translation) - - "⇛": [t: "jobbra mutató hármas nyíl"] # 0x21db (en: 'right triple arrow', DeepL translation) - - "⇜": [t: "bal szögletes nyíl"] # 0x21dc (en: 'left squiggle arrow', DeepL translation) - - "⇝": [t: "jobb oldali szögletes nyíl"] # 0x21dd (en: 'right squiggle arrow', DeepL translation) - - "⇞": [t: "felfelé mutató nyíl dupla vonallal"] # 0x21de (en: 'up arrow with double stroke', DeepL translation) - - "⇟": [t: "lefelé nyíl dupla vonallal"] # 0x21df (en: 'down arrow with double stroke', DeepL translation) - - "⇠": [t: "balra szaggatott nyíl"] # 0x21e0 (en: 'left dashed arrow', DeepL translation) - - "⇡": [t: "felfelé szaggatott nyíl"] # 0x21e1 (en: 'up dashed arrow', DeepL translation) - - "⇢": [t: "jobbra szaggatott nyíl"] # 0x21e2 (en: 'right dashed arrow', DeepL translation) - - "⇣": [t: "lefelé szaggatott nyíl"] # 0x21e3 (en: 'down dashed arrow', DeepL translation) - - "⇤": [t: "balra mutató nyíl a sávhoz"] # 0x21e4 (en: 'left arrow to bar', DeepL translation) - - "⇥": [t: "jobbra nyíl a sávra"] # 0x21e5 (en: 'right arrow to bar', DeepL translation) - - "⇦": [t: "bal fehér nyíl"] # 0x21e6 (en: 'left white arrow', DeepL translation) - - "⇧": [t: "felfelé mutató fehér nyíl"] # 0x21e7 (en: 'up white arrow', DeepL translation) - - "⇨": [t: "jobb oldali fehér nyíl"] # 0x21e8 (en: 'right white arrow', DeepL translation) - - "⇩": [t: "lefelé mutató fehér nyíl"] # 0x21e9 (en: 'down white arrow', DeepL translation) - - "⇪": [t: "felfelé fehér nyíl a sávból"] # 0x21ea (en: 'up white arrow from bar', DeepL translation) - - "⇫": [t: "felfelé mutató fehér nyíl a talapzaton"] # 0x21eb (en: 'up white arrow on pedestal', DeepL translation) - - "⇬": [t: "felfelé mutató fehér nyíl talapzaton vízszintes sávval"] # 0x21ec (en: 'up white arrow on pedestal with horizontal bar', DeepL translation) - - "⇭": [t: "felfelé mutató fehér nyíl talapzaton függőleges sávval"] # 0x21ed (en: 'up white arrow on pedestal with vertical bar', DeepL translation) - - "⇮": [t: "felfelé fehér kettős nyíl"] # 0x21ee (en: 'up white double arrow', DeepL translation) - - "⇯": [t: "felfelé fehér kettős nyíl talapzaton"] # 0x21ef (en: 'up white double arrow on pedestal', DeepL translation) - - "⇰": [t: "jobb oldali fehér nyíl a falról"] # 0x21f0 (en: 'right white arrow from wall', DeepL translation) - - "⇱": [t: "északnyugati nyíl a sarokba"] # 0x21f1 (en: 'north west arrow to corner', DeepL translation) - - "⇲": [t: "délkeleti nyíl a sarokba"] # 0x21f2 (en: 'south east arrow to corner', DeepL translation) - - "⇳": [t: "fel lefelé fehér nyíl"] # 0x21f3 (en: 'up down white arrow', DeepL translation) - - "⇴": [t: "jobbra mutató nyíl kis körrel"] # 0x21f4 (en: 'right arrow with small circle', DeepL translation) - - "⇵": [t: "lefelé mutató nyíl balra a felfelé mutató nyílból"] # 0x21f5 (en: 'down arrow left of up arrow', DeepL translation) - - "⇶": [t: "három jobbra mutató nyíl"] # 0x21f6 (en: 'three right arrows', DeepL translation) - - "⇷": [t: "bal nyíl függőleges vonallal"] # 0x21f7 (en: 'left arrow with vertical stroke', DeepL translation) - - "⇸": [t: "jobb oldali nyíl függőleges vonallal"] # 0x21f8 (en: 'right arrow with vertical stroke', DeepL translation) - - "⇹": [t: "balra jobbra nyíl függőleges vonallal"] # 0x21f9 (en: 'left right arrow with vertical stroke', DeepL translation) - - "⇺": [t: "bal nyíl dupla függőleges vonallal"] # 0x21fa (en: 'left arrow with double vertical stroke', DeepL translation) - - "⇻": [t: "jobb nyíl dupla függőleges vonallal"] # 0x21fb (en: 'right arrow with double vertical stroke', DeepL translation) - - "⇼": [t: "bal jobb nyíl dupla függőleges vonallal"] # 0x21fc (en: 'left right arrow with double vertical stroke', DeepL translation) - - "⇽": [t: "bal nyitott fejű nyíl"] # 0x21fd (en: 'left open headed arrow', DeepL translation) - - "⇾": [t: "jobbra nyitott fejű nyíl"] # 0x21fe (en: 'right open headed arrow', DeepL translation) - - "⇿": [t: "bal jobb nyitott fejű nyílvessző"] # 0x21ff (en: 'left right open headed arrow', DeepL translation) - - "∀": [t: "mindenki számára"] # 0x2200 (en: 'for all', DeepL translation) + then: [T: "felülről közelít"] # (en: 'approaches from above', DeepL translation) + else: [T: "délkeleti nyíl"] # (en: 'south east arrow', DeepL translation) + + - "↙": [T: "délnyugati nyíl"] # 0x2199 (en: 'south west arrow', DeepL translation) + - "↚": [T: "balra nyíl vonallal"] # 0x219a (en: 'left arrow with stroke', DeepL translation) + - "↛": [T: "jobbra nyíl vonallal"] # 0x219b (en: 'right arrow with stroke', DeepL translation) + - "↜": [T: "bal oldali hullámos nyíl"] # 0x219c (en: 'left wave arrow', DeepL translation) + - "↝": [T: "jobb oldali hullámos nyíl"] # 0x219d (en: 'right wave arrow', DeepL translation) + - "↞": [T: "bal kétfejű nyíl"] # 0x219e (en: 'left two headed arrow', DeepL translation) + - "↟": [T: "felfelé kétfejű nyíl"] # 0x219f (en: 'up two headed arrow', DeepL translation) + - "↠": [T: "jobb kétfejű nyíl"] # 0x21a0 (en: 'right two headed arrow', DeepL translation) + - "↡": [T: "lefelé kétfejű nyíl"] # 0x21a1 (en: 'down two headed arrow', DeepL translation) + - "↢": [T: "balra mutató nyíl farokkal"] # 0x21a2 (en: 'left arrow with tail', DeepL translation) + - "↣": [T: "jobbra mutató nyíl farokkal"] # 0x21a3 (en: 'right arrow with tail', DeepL translation) + - "↤": [T: "bal nyíl a sávból"] # 0x21a4 (en: 'left arrow from bar', DeepL translation) + - "↥": [T: "vonaltól induló felfelé mutató nyíl"] # 0x21a5 (en: 'up arrow from bar', DeepL translation) + - "↦": [T: "jobbra mutató nyíl a sávból"] # 0x21a6 (en: 'right arrow from bar', DeepL translation) + - "↧": [T: "lefelé mutató nyíl a sávból"] # 0x21a7 (en: 'down arrow from bar', DeepL translation) + - "↨": [T: "fel-le nyíl alappal"] # 0x21a8 (en: 'up down arrow with base', DeepL translation) + - "↩": [T: "bal nyíl horoggal"] # 0x21a9 (en: 'left arrow with hook', DeepL translation) + - "↪": [T: "jobbra mutató nyíl horoggal"] # 0x21aa (en: 'right arrow with hook', DeepL translation) + - "↫": [T: "bal nyíl hurokkal"] # 0x21ab (en: 'left arrow with loop', DeepL translation) + - "↬": [T: "jobbra mutató nyíl hurokkal"] # 0x21ac (en: 'right arrow with loop', DeepL translation) + - "↭": [T: "balra jobbra hullámzó nyíl"] # 0x21ad (en: 'left right wave arrow', DeepL translation) + - "↮": [T: "balra jobbra nyíl függőleges vonallal"] # 0x21ae (en: 'left right arrow with stroke', DeepL translation) + - "↯": [T: "lefelé cikkcakkos nyíl"] # 0x21af (en: 'down zigzag arrow', DeepL translation) + - "↰": [T: "felfelé nyíl balra mutató heggyel"] # 0x21b0 (en: 'up arrow with tip left', DeepL translation) + - "↱": [T: "felfelé nyíl jobbra mutató heggyel"] # 0x21b1 (en: 'up arrow with tip right', DeepL translation) + - "↲": [T: "lefelé mutató nyíl hegyével balra"] # 0x21b2 (en: 'down arrow with tip left', DeepL translation) + - "↳": [T: "lefelé mutató nyíl hegyével jobbra"] # 0x21b3 (en: 'down arrow with tip right', DeepL translation) + - "↴": [T: "jobbra nyíl sarokkal lefelé"] # 0x21b4 (en: 'right arrow with corner down', DeepL translation) + - "↵": [T: "lefelé mutató nyíl bal oldali sarokkal"] # 0x21b5 (en: 'down arrow with corner left', DeepL translation) + - "↶": [T: "az óramutató járásával ellentétes irányú felső félköríves nyíl"] # 0x21b6 (en: 'anticlockwise top semicircle arrow', DeepL translation) + - "↷": [T: "az óramutató járásával megegyezően felső félköríves nyíl"] # 0x21b7 (en: 'clockwise top semicircle arrow', DeepL translation) + - "↸": [T: "északnyugati nyíl a hosszú sávra"] # 0x21b8 (en: 'north west arrow to long bar', DeepL translation) + - "↹": [T: "bal nyíl a sáv fölé jobb nyíl a sáv fölé"] # 0x21b9 (en: 'left arrow to bar over right arrow to bar', DeepL translation) + - "↺": [T: "az óramutató járásával ellentétes irányban nyitott kör alakú nyíl"] # 0x21ba (en: 'anticlockwise open circle arrow', DeepL translation) + - "↻": [T: "az óramutató járásával megegyező irányban nyitott kör alakú nyíl"] # 0x21bb (en: 'clockwise open circle arrow', DeepL translation) + - "↼": [T: "bal oldali szigony felfelé"] # 0x21bc (en: 'left harpoon up', DeepL translation) + - "↽": [T: "bal szigony lefelé"] # 0x21bd (en: 'left harpoon down', DeepL translation) + - "↾": [T: "felfelé szigony jobbra"] # 0x21be (en: 'up harpoon right', DeepL translation) + - "↿": [T: "fel szigony balra"] # 0x21bf (en: 'up harpoon left', DeepL translation) + - "⇀": [T: "jobb szigony felfelé"] # 0x21c0 (en: 'right harpoon up', DeepL translation) + - "⇁": [T: "jobb szigony lefelé"] # 0x21c1 (en: 'right harpoon down', DeepL translation) + - "⇂": [T: "lefelé szigony jobbra"] # 0x21c2 (en: 'down harpoon right', DeepL translation) + - "⇃": [T: "lefelé mutató szigony balra"] # 0x21c3 (en: 'down harpoon left', DeepL translation) + - "⇄": [T: "jobbra mutató nyíl a balra mutató nyíl felett"] # 0x21c4 (en: 'right arrow over left arrow', DeepL translation) + - "⇅": [T: "felfelé mutató nyíl a lefelé mutató nyíltól balra"] # 0x21c5 (en: 'up arrow left of down arrow', DeepL translation) + - "⇆": [T: "balra mutató nyíl a jobbra mutató nyíl felett"] # 0x21c6 (en: 'left arrow over right arrow', DeepL translation) + - "⇇": [T: "bal párosított nyilak"] # 0x21c7 (en: 'left paired arrows', DeepL translation) + - "⇈": [T: "felfelé párosított nyilak"] # 0x21c8 (en: 'up paired arrows', DeepL translation) + - "⇉": [T: "jobb oldali párosított nyilak"] # 0x21c9 (en: 'right paired arrows', DeepL translation) + - "⇊": [T: "lefelé párosított nyilak"] # 0x21ca (en: 'down paired arrows', DeepL translation) + - "⇋": [T: "bal szigony a jobb szigony felett"] # 0x21cb (en: 'left harpoon over right harpoon', DeepL translation) + - "⇌": [T: "jobb szigony a bal szigony felett"] # 0x21cc (en: 'right harpoon over left harpoon', DeepL translation) + - "⇍": [T: "bal kettős nyíl függőleges vonallal"] # 0x21cd (en: 'left double arrow with stroke', DeepL translation) + - "⇎": [T: "balra jobbra dupla nyíl függőleges vonallal"] # 0x21ce (en: 'left right double arrow with stroke', DeepL translation) + - "⇏": [T: "jobb oldali kettős nyíl vonallal"] # 0x21cf (en: 'right double arrow with stroke', DeepL translation) + - "⇐": [T: "bal dupla nyíl"] # 0x21d0 (en: 'left double arrow', DeepL translation) + - "⇑": [T: "felfelé mutató kettős nyíl"] # 0x21d1 (en: 'up double arrow', DeepL translation) + - "⇒": [T: "implikálja"] # 0x21d2 (en: 'implies', DeepL translation) + - "⇓": [T: "lefelé dupla nyíl"] # 0x21d3 (en: 'down double arrow', DeepL translation) + - "⇔": [T: "ha, és csak ha"] # 0x21d4 (en: 'if and only if', DeepL translation) + - "⇕": [T: "fel le dupla nyíl"] # 0x21d5 (en: 'up down double arrow', DeepL translation) + - "⇖": [T: "északnyugati dupla nyíl"] # 0x21d6 (en: 'north west double arrow', DeepL translation) + - "⇗": [T: "északkeleti dupla nyíl"] # 0x21d7 (en: 'north east double arrow', DeepL translation) + - "⇘": [T: "délkeleti dupla nyíl"] # 0x21d8 (en: 'south east double arrow', DeepL translation) + - "⇙": [T: "délnyugati dupla nyíl"] # 0x21d9 (en: 'south west double arrow', DeepL translation) + - "⇚": [T: "balra mutató hármas nyíl"] # 0x21da (en: 'left triple arrow', DeepL translation) + - "⇛": [T: "jobbra mutató hármas nyíl"] # 0x21db (en: 'right triple arrow', DeepL translation) + - "⇜": [T: "bal szögletes nyíl"] # 0x21dc (en: 'left squiggle arrow', DeepL translation) + - "⇝": [T: "jobb szögletes nyíl"] # 0x21dd (en: 'right squiggle arrow', DeepL translation) + - "⇞": [T: "felfelé mutató nyíl dupla vonallal"] # 0x21de (en: 'up arrow with double stroke', DeepL translation) + - "⇟": [T: "lefelé nyíl dupla vonallal"] # 0x21df (en: 'down arrow with double stroke', DeepL translation) + - "⇠": [T: "balra szaggatott nyíl"] # 0x21e0 (en: 'left dashed arrow', DeepL translation) + - "⇡": [T: "felfelé szaggatott nyíl"] # 0x21e1 (en: 'up dashed arrow', DeepL translation) + - "⇢": [T: "jobbra szaggatott nyíl"] # 0x21e2 (en: 'right dashed arrow', DeepL translation) + - "⇣": [T: "lefelé szaggatott nyíl"] # 0x21e3 (en: 'down dashed arrow', DeepL translation) + - "⇤": [T: "balra mutató nyíl a sávhoz"] # 0x21e4 (en: 'left arrow to bar', DeepL translation) + - "⇥": [T: "jobbra mutató nyíl a sávhoz"] # 0x21e5 (en: 'right arrow to bar', DeepL translation) + - "⇦": [T: "bal fehér nyíl"] # 0x21e6 (en: 'left white arrow', DeepL translation) + - "⇧": [T: "felfelé mutató fehér nyíl"] # 0x21e7 (en: 'up white arrow', DeepL translation) + - "⇨": [T: "jobb oldali fehér nyíl"] # 0x21e8 (en: 'right white arrow', DeepL translation) + - "⇩": [T: "lefelé mutató fehér nyíl"] # 0x21e9 (en: 'down white arrow', DeepL translation) + - "⇪": [T: "felfelé fehér nyíl a sávból"] # 0x21ea (en: 'up white arrow from bar', DeepL translation) + - "⇫": [T: "felfelé mutató fehér nyíl a talapzaton"] # 0x21eb (en: 'up white arrow on pedestal', DeepL translation) + - "⇬": [T: "felfelé mutató fehér nyíl talapzaton vízszintes sávval"] # 0x21ec (en: 'up white arrow on pedestal with horizontal bar', DeepL translation) + - "⇭": [T: "felfelé mutató fehér nyíl talapzaton függőleges sávval"] # 0x21ed (en: 'up white arrow on pedestal with vertical bar', DeepL translation) + - "⇮": [T: "felfelé fehér kettős nyíl"] # 0x21ee (en: 'up white double arrow', DeepL translation) + - "⇯": [T: "felfelé fehér kettős nyíl talapzaton"] # 0x21ef (en: 'up white double arrow on pedestal', DeepL translation) + - "⇰": [T: "jobb oldali fehér nyíl a falról"] # 0x21f0 (en: 'right white arrow from wall', DeepL translation) + - "⇱": [T: "északnyugati nyíl a sarokhoz"] # 0x21f1 (en: 'north west arrow to corner', DeepL translation) + - "⇲": [T: "délkeleti nyíl a sarokhoz"] # 0x21f2 (en: 'south east arrow to corner', DeepL translation) + - "⇳": [T: "fel le fehér nyíl"] # 0x21f3 (en: 'up down white arrow', DeepL translation) + - "⇴": [T: "jobbra mutató nyíl kis körrel"] # 0x21f4 (en: 'right arrow with small circle', DeepL translation) + - "⇵": [T: "lefelé mutató nyíl balra a felfelé mutató nyílból"] # 0x21f5 (en: 'down arrow left of up arrow', DeepL translation) + - "⇶": [T: "három jobbra mutató nyíl"] # 0x21f6 (en: 'three right arrows', DeepL translation) + - "⇷": [T: "bal nyíl függőleges vonallal"] # 0x21f7 (en: 'left arrow with vertical stroke', DeepL translation) + - "⇸": [T: "jobb oldali nyíl függőleges vonallal"] # 0x21f8 (en: 'right arrow with vertical stroke', DeepL translation) + - "⇹": [T: "balra jobbra nyíl függőleges vonallal"] # 0x21f9 (en: 'left right arrow with vertical stroke', DeepL translation) + - "⇺": [T: "bal nyíl dupla függőleges vonallal"] # 0x21fa (en: 'left arrow with double vertical stroke', DeepL translation) + - "⇻": [T: "jobb nyíl dupla függőleges vonallal"] # 0x21fb (en: 'right arrow with double vertical stroke', DeepL translation) + - "⇼": [T: "bal jobb nyíl dupla függőleges vonallal"] # 0x21fc (en: 'left right arrow with double vertical stroke', DeepL translation) + - "⇽": [T: "bal nyitott fejű nyíl"] # 0x21fd (en: 'left open headed arrow', DeepL translation) + - "⇾": [T: "jobbra nyitott fejű nyíl"] # 0x21fe (en: 'right open headed arrow', DeepL translation) + - "⇿": [T: "bal jobb nyitott fejű nyíl"] # 0x21ff (en: 'left right open headed arrow', DeepL translation) + - "∀": [T: "mindenki számára"] # 0x2200 (en: 'for all', DeepL translation) - "∁": # 0x2201 - test: if: "$Verbosity!='Terse'" - then: [t: "a"] # (en: 'the', DeepL translation) - - t: "kiegészítése" # (en: 'complement of', DeepL translation) + then: [T: "a(z)"] # (en: 'the', DeepL translation) + - T: "kiegészítése" # (en: 'complement of', DeepL translation) - "∂": # 0x2202 - test: if: "$Verbosity='Terse'" - then: [t: "részleges"] # (en: 'partial', DeepL translation) - else: [t: "részleges derivált"] # (en: 'partial derivative', DeepL translation) - - "∃": [t: "létezik"] # 0x2203 (en: 'there exists', DeepL translation) - - "∄": [t: "nem létezik"] # 0x2204 (en: 'there does not exist', DeepL translation) - - "∅": [t: "üres készlet"] # 0x2205 (en: 'empty set', DeepL translation) + then: [T: "részleges derivált"] # (en: 'partial', DeepL translation) + else: [T: "részleges derivált"] # (en: 'partial derivative', DeepL translation) + - "∃": [T: "létezik"] # 0x2203 (en: 'there exists', DeepL translation) + - "∄": [T: "nem létezik"] # 0x2204 (en: 'there does not exist', DeepL translation) + - "∅": [T: "üres halmaz"] # 0x2205 (en: 'empty set', DeepL translation) - "∆": # 0x2206 - test: if: "following-sibling::*" then_test: if: "$Verbosity!='Terse'" - then: [t: "a lahplahsian of"] # "LahPlahsian" sounds better than "laplacian" in speech engines tested (en: 'the LahPlahsian of', DeepL translation) - else: [t: "lahplahsian"] # (en: 'LahPlahsian', DeepL translation) - else: [t: "lahplahsian"] # (en: 'LahPlahsian', DeepL translation) + then: [T: "egy laplaciánus"] # "LahPlahsian" sounds better than "laplacian" in speech engines tested (en: 'the LahPlahsian of', DeepL translation) + else: [T: "laplaciánus"] # (en: 'LahPlahsian', DeepL translation) + else: [T: "laplaciánus"] # (en: 'LahPlahsian', DeepL translation) - - "∇": [t: "nahblah"] # 0x2207 (DeepL translation) + - "∇": [T: "nahblah"] # 0x2207 (DeepL translation) - "∉": # 0x2209 # rule is identical to 0x2208 - test: if: "$SpeechStyle != 'ClearSpeak'" - then: [t: "nem eleme"] # (en: 'is not an element of', DeepL translation) + then: [T: "nem eleme"] # (en: 'is 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: "not in"] # (DeepL translation) + then: [T: "nincs benne"] # (DeepL translation) - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "nem tagja"] # (en: 'not member of', DeepL translation) + then: [T: "nem tagja ennek:"] # (en: 'not member of', DeepL translation) - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "nem eleme"] # (en: 'not element of', DeepL translation) - - else: [t: "nem tartozik hozzá"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'not belonging to', DeepL translation) + then: [T: "nem eleme ennek:"] # (en: 'not element of', DeepL translation) + - else: [T: "nem tartozik hozzá"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'not belonging to', DeepL translation) else_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "nem tagja"] # (en: 'is not a member of', DeepL translation) + then: [T: "nem tagja ennek:"] # (en: 'is not a member of', DeepL translation) - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "nem eleme"] # (en: 'is not an element of', DeepL translation) + then: [T: "nem eleme ennek:"] # (en: 'is not an element of', DeepL translation) - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "nincs benne"] # (en: 'is not in', DeepL translation) - - else: [t: "nem tartozik hozzá"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'does not belong to', DeepL translation) + then: [T: "nincs benne"] # (en: 'is not in', DeepL translation) + - else: [T: "nem tartozik hozzá"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'does not belong to', DeepL translation) - "∊": # 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: "az"] # (en: 'is', DeepL translation) - - t: "egy elem" # (en: 'an element of', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "egy 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: "in"] # (DeepL translation) + then: [T: "benne van"] # (DeepL translation) - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "tagja"] # (en: 'member of', DeepL translation) + then: [T: "tagja ennek:"] # (en: 'member of', DeepL translation) - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "eleme"] # (en: 'element of', DeepL translation) - - else: [t: "hozzátartozó"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to', DeepL translation) + then: [T: "eleme ennek:"] # (en: 'element of', DeepL translation) + - else: [T: "hozzátartozó"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to', DeepL translation) else_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "tagja a"] # (en: 'is a member of', DeepL translation) + then: [T: "tagja ennek:"] # (en: 'is a member of', DeepL translation) - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "egy elem a"] # (en: 'is an element of', DeepL translation) + then: [T: "egy eleme ennek:"] # (en: 'is an element of', DeepL translation) - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "van benne"] # (en: 'is in', DeepL translation) - - else: [t: "tartozik"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to', DeepL translation) - - "∋": [t: "tartalmazza a tagot"] # 0x220b (en: 'contains the member', DeepL translation) - - "∌": [t: "nem tartalmazza a tagot"] # 0x220c (en: 'does not contain the member', DeepL translation) - - "∍": [t: "tartalmazza a tagot"] # 0x220d (en: 'contains the member', DeepL translation) - - "∎": [t: "a bizonyítás vége"] # 0x220e (en: 'end of proof', DeepL translation) - - "∏": [t: "termék"] # 0x220f (en: 'product', DeepL translation) - - "∐": [t: "koprodukció"] # 0x2210 (en: 'coproduct', DeepL translation) - - "∑": [t: "sum"] # 0x2211 (DeepL translation) - - "−": [t: "mínusz"] # 0x2212 (en: 'minus', DeepL translation) - - "∓": [t: "mínusz vagy plusz"] # 0x2213 (en: 'minus or plus', DeepL translation) - - "∔": [t: "pont plusz"] # 0x2214 (en: 'dot plus', DeepL translation) - - "∕": [t: "osztva"] # 0x2215 (en: 'divided by', DeepL translation) - - "∖": [t: "beállított mínusz"] # 0x2216 (en: 'set minus', DeepL translation) - - "∗": [t: "idők"] # 0x2217 (en: 'times', DeepL translation) - - "∘": [t: "összeállítva"] # 0x2218 (en: 'composed with', DeepL translation) + then: [T: "benne van"] # (en: 'is in', DeepL translation) + - else: [T: "tartozik"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to', DeepL translation) + - "∋": [T: "tagként tartalmazza"] # 0x220b (en: 'contains the member', DeepL translation) + - "∌": [T: "tagként nem tartalmazza"] # 0x220c (en: 'does not contain the member', DeepL translation) + - "∍": [T: "részben tagként tartalmazza"] # 0x220d (en: 'contains the member', DeepL translation) + - "∎": [T: "bizonyítás vége"] # 0x220e (en: 'end of proof', DeepL translation) + - "∏": [T: "produktum"] # 0x220f (en: 'product', DeepL translation) + - "∐": [T: "koproduktum"] # 0x2210 (en: 'coproduct', DeepL translation) + - "∑": [T: "összeg"] # 0x2211 (DeepL translation) + - "−": [T: "mínusz"] # 0x2212 (en: 'minus', DeepL translation) + - "∓": [T: "mínusz vagy plusz"] # 0x2213 (en: 'minus or plus', DeepL translation) + - "∔": [T: "pontozott plusz"] # 0x2214 (en: 'dot plus', DeepL translation) + - "∕": [T: "osztva"] # 0x2215 (en: 'divided by', DeepL translation) + - "∖": [T: "halmaz mínusz"] # 0x2216 (en: 'set minus', DeepL translation) + - "∗": [T: "csillag operátor"] # 0x2217 (en: 'times', DeepL translation) + - "∘": [T: "gyűrű operátor"] # 0x2218 (en: 'composed with', DeepL translation) - "∙": # 0x2219 - test: if: "@data-chem-formula-op" - then: [t: "pont"] # (en: 'dot', DeepL translation) - else: [t: "idők"] # (en: 'times', DeepL translation) + then: [T: "pont"] # (en: 'dot', DeepL translation) + else: [T: "szorozva"] # (en: 'times', DeepL translation) - "√": # 0x221a - test: if: "$Verbosity!='Terse'" - then: [t: "a"] # (en: 'the', DeepL translation) - - t: "négyzetgyök" # (en: 'square root of', DeepL translation) + then: [T: "a(z)"] # (en: 'the', DeepL translation) + - T: "négyzetgyöke" # (en: 'square root of', DeepL translation) - "∛": # 0x221b - test: if: "$Verbosity!='Terse'" - then: [t: "a"] # (en: 'the', DeepL translation) - - t: "kockagyökér" # (en: 'cube root of', DeepL translation) + then: [T: "a(z)"] # (en: 'the', DeepL translation) + - T: "köbgyöke" # (en: 'cube root of', DeepL translation) - "∜": # 0x221c - test: if: "$Verbosity!='Terse'" - then: [t: "a"] # (en: 'the', DeepL translation) - - t: "negyedik gyöke" # (en: 'fourth root of', DeepL translation) + then: [T: "a(z)"] # (en: 'the', DeepL translation) + - T: "negyedik gyöke" # (en: 'fourth root of', DeepL translation) - "∝": # 0x221d - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "arányos" # (en: 'proportional to', DeepL translation) - - "∞": [t: "végtelen"] # 0x221e (en: 'infinity', DeepL translation) - - "∟": [t: "derékszög"] # 0x221f (en: 'right angle', DeepL translation) - - "∠": [t: "szög"] # 0x2220 (en: 'angle', DeepL translation) - - "∡": [t: "mért szög"] # 0x2221 (en: 'measured angle', DeepL translation) - - "∢": [t: "gömbszög"] # 0x2222 (en: 'spherical angle', DeepL translation) - - "∣": [t: "osztja"] # 0x2223 (en: 'divides', DeepL translation) - - "∤": [t: "nem osztja"] # 0x2224 (en: 'does not divide', DeepL translation) - - "∧": [t: "és"] # 0x2227 (en: 'and', DeepL translation) - - "∨": [t: "vagy"] # 0x2228 (en: 'or', DeepL translation) - - "∩": [t: "kereszteződés"] # 0x2229 (en: 'intersection', DeepL translation) - - "∪": [t: "unió"] # 0x222a (en: 'union', DeepL translation) - - "∫": [t: "integrált"] # 0x222b (en: 'integral', DeepL translation) - - "∬": [t: "kettős integrál"] # 0x222c (en: 'double integral', DeepL translation) - - "∭": [t: "hármas integrál"] # 0x222d (en: 'triple integral', DeepL translation) - - "∮": [t: "kontúrintegrál"] # 0x222e (en: 'contour integral', DeepL translation) - - "∯": [t: "felszíni integrál"] # 0x222f (en: 'surface integral', DeepL translation) - - "∰": [t: "térfogati integrál"] # 0x2230 (en: 'volume integral', DeepL translation) - - "∱": [t: "az óramutató járásával megegyezően integrált"] # 0x2231 (en: 'clockwise integral', DeepL translation) - - "∲": [t: "az óramutató járásával megegyező irányú kontúrintegrál"] # 0x2232 (en: 'clockwise contour integral', DeepL translation) - - "∳": [t: "az óramutató járásával ellentétes irányú kontúrintegrál"] # 0x2233 (en: 'anticlockwise contour integral', DeepL translation) - - "∴": [t: "ezért"] # 0x2234 (en: 'therefore', DeepL translation) - - "∵": [t: "mert"] # 0x2235 (en: 'because', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "arányos" # (en: 'proportional to', DeepL translation) + - "∞": [T: "végtelen"] # 0x221e (en: 'infinity', DeepL translation) + - "∟": [T: "derékszög"] # 0x221f (en: 'right angle', DeepL translation) + - "∠": [T: "szög"] # 0x2220 (en: 'angle', DeepL translation) + - "∡": [T: "mért szög"] # 0x2221 (en: 'measured angle', DeepL translation) + - "∢": [T: "gömbszög"] # 0x2222 (en: 'spherical angle', DeepL translation) + - "∣": [T: "osztója"] # 0x2223 (en: 'divides', DeepL translation) + - "∤": [T: "nem osztója"] # 0x2224 (en: 'does not divide', DeepL translation) + - "∧": [T: "logikai és"] # 0x2227 (en: 'and', DeepL translation) + - "∨": [T: "logikai vagy"] # 0x2228 (en: 'or', DeepL translation) + - "∩": [T: "metszéspont"] # 0x2229 (en: 'intersection', DeepL translation) + - "∪": [T: "unió"] # 0x222a (en: 'union', DeepL translation) + - "∫": [T: "integrált"] # 0x222b (en: 'integral', DeepL translation) + - "∬": [T: "kettős integrál"] # 0x222c (en: 'double integral', DeepL translation) + - "∭": [T: "hármas integrál"] # 0x222d (en: 'triple integral', DeepL translation) + - "∮": [T: "kontúr integrál"] # 0x222e (en: 'contour integral', DeepL translation) + - "∯": [T: "felszíni integrál"] # 0x222f (en: 'surface integral', DeepL translation) + - "∰": [T: "térfogati integrál"] # 0x2230 (en: 'volume integral', DeepL translation) + - "∱": [T: "az óramutató járásával megegyező integrál"] # 0x2231 (en: 'clockwise integral', DeepL translation) + - "∲": [T: "az óramutató járásával megegyező irányú kontúr integrál"] # 0x2232 (en: 'clockwise contour integral', DeepL translation) + - "∳": [T: "az óramutató járásával ellentétes irányú kontúr integrál"] # 0x2233 (en: 'anticlockwise contour integral', DeepL translation) + - "∴": [T: "azért"] # 0x2234 (en: 'therefore', DeepL translation) + - "∵": [T: "mert"] # 0x2235 (en: 'because', DeepL translation) - "∶": # 0x2236 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "to" # (DeepL translation) - - "∷": [t: "mint"] # 0x2237 (en: 'as', DeepL translation) - - "∸": [t: "pont mínusz"] # 0x2238 (en: 'dot minus', DeepL translation) - - "∹": [t: "többlet van a többlethez képest"] # 0x2239 (en: 'has excess compared to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "arány" # (DeepL translation) + - "∷": [T: "mint"] # 0x2237 (en: 'as', DeepL translation) + - "∸": [T: "pontozott mínusz"] # 0x2238 (en: 'dot minus', DeepL translation) + - "∹": [T: "többletet tartalmaz ahhoz képest,"] # 0x2239 (en: 'has excess compared to', DeepL translation) - "∺": # 0x223a - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "geometriailag arányos" # (en: 'geometrically proportional to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "geometriailag arányos" # (en: 'geometrically proportional to', DeepL translation) - "∻": # 0x223b - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "homotetikus a" # (en: 'homothetic to', DeepL translation) - - "∼": [t: "változik"] # 0x223c (en: 'varies with', DeepL translation) - - "∽": [t: "fordított tilde"] # 0x223d (en: 'reversed tilde', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "homotetikus" # (en: 'homothetic to', DeepL translation) + - "∼": [T: "változik"] # 0x223c (en: 'varies with', DeepL translation) + - "∽": [T: "fordított tilde"] # 0x223d (en: 'reversed tilde', DeepL translation) - "∾": # 0x223e - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "legpozitívabb" # (en: 'most positive', DeepL translation) - - "∿": [t: "szinuszhullám"] # 0x223f (en: 'sine wave', DeepL translation) - - "≀": [t: "koszorú termék"] # 0x2240 (en: 'wreath product', DeepL translation) - - "≁": [t: "nem tilde"] # 0x2241 (en: 'not tilde', DeepL translation) - - "≂": [t: "mínusz tilde"] # 0x2242 (en: 'minus tilde', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "legpozitívabb" # (en: 'most positive', DeepL translation) + - "∿": [T: "szinuszhullám"] # 0x223f (en: 'sine wave', DeepL translation) + - "≀": [T: "koszorú szorzat"] # 0x2240 (en: 'wreath product', DeepL translation) + - "≁": [T: "nem tilde"] # 0x2241 (en: 'not tilde', DeepL translation) + - "≂": [T: "mínusz tilde"] # 0x2242 (en: 'minus tilde', DeepL translation) - "≃": # 0x2243 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "aszimptotikusan egyenlő" # (en: 'asymptotically equal to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "aszimptotikusan egyenlő" # (en: 'asymptotically equal to', DeepL translation) - "≄": # 0x2244 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "nem aszimptotikusan egyenlő" # (en: 'not asymptotically equal to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "nem aszimptotikusan egyenlő" # (en: 'not asymptotically equal to', DeepL translation) - "≅": # 0x2245 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "kongruens a" # (en: 'congruent to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "nagyjából egyenlő" # (en: 'congruent to', DeepL translation) - "≆": # 0x2246 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "megközelítőleg, de valójában nem egyenlő" # (en: 'approximately but not actually equal to', DeepL translation) + then: [T: "az"] # (en: 'is', DeepL translation) + - T: "megközelítőleg, de valójában nem egyenlő" # (en: 'approximately but not actually equal to', DeepL translation) - "≇": # 0x2247 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "nem kongruens" # (en: 'not congruent to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "sem megközelítőleg, sem ténylegesen nem egyenlő" # (en: 'not congruent to', DeepL translation) - "≈": # 0x2248 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "megközelítőleg egyenlő" # (en: 'approximately equal to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "megközelítőleg egyenlő" # (en: 'approximately equal to', DeepL translation) - "≉": # 0x2249 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "nem megközelítőleg egyenlő" # (en: 'not approximately equal to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "megközelítőleg sem egyenlő" # (en: 'not approximately equal to', DeepL translation) - "≊": # 0x224a - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "megközelítőleg egyenlő vagy egyenlő" # (en: 'approximately equal or equal to', DeepL translation) - - "≋": [t: "hármas tilde"] # 0x224b (en: 'triple tilde', DeepL translation) - - "≌": [t: "mind egyenlőek"] # 0x224c (en: 'are all equal to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "megközelítőleg egyenlő vagy egyenlő" # (en: 'approximately equal or equal to', DeepL translation) + - "≋": [T: "hármas tilde"] # 0x224b (en: 'triple tilde', DeepL translation) + - "≌": [T: "mind egyenlőek"] # 0x224c (en: 'are all equal to', DeepL translation) - "≍": # 0x224d - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "egyenértékű" # (en: 'equivalent to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "egyenértékű" # (en: 'equivalent to', DeepL translation) - "≎": # 0x224e - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "geometriailag egyenértékű" # (en: 'geometrically equivalent to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "geometriailag egyenértékű" # (en: 'geometrically equivalent to', DeepL translation) - "≏": # 0x224f - test: if: "$Verbosity!='Terse'" - then: [t: "a"] # (en: 'the', DeepL translation) - - t: "különbség" # (en: 'difference between', DeepL translation) - - "≐": [t: "közelít a határhoz"] # 0x2250 (en: 'approaches the limit', DeepL translation) + then: [T: "a(z)"] # (en: 'the', DeepL translation) + - T: "közötti különbség" # (en: 'difference between', DeepL translation) + - "≐": [T: "megközelíti a határértéket"] # 0x2250 (en: 'approaches the limit', DeepL translation) - "≑": # 0x2251 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "geometriailag egyenlő" # (en: 'geometrically equal to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "geometriailag egyenlő" # (en: 'geometrically equal to', DeepL translation) - "≒": # 0x2252 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "megközelítőleg egyenlő vagy a képe" # (en: 'approximately equal to or the image of', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "a kép megközelítőleg egyenlő" # (en: 'approximately equal to or the image of', DeepL translation) - "≓": # 0x2253 - test: if: "$Verbosity!='Terse'" - then: [t: "a"] # (en: 'is the', DeepL translation) - - t: "képe vagy megközelítőleg egyenlő" # (en: 'image of or approximately equal to', DeepL translation) - - "≔": [t: "kettőspont egyenlő"] # 0x2254 (en: 'colon equals', DeepL translation) - - "≕": [t: "egyenlőségjel kettőspont"] # 0x2255 (en: 'equals colon', DeepL translation) - - "≖": [t: "gyűrűvel egyenlő"] # 0x2256 (en: 'ring in equal to', DeepL translation) + then: [T: "a(z)"] # (en: 'is the', DeepL translation) + - T: "kép nagyjából azonos" # (en: 'image of or approximately equal to', DeepL translation) + - "≔": [T: "kettőspont egyenlő"] # 0x2254 (en: 'colon equals', DeepL translation) + - "≕": [T: "egyenlő kettőspont"] # 0x2255 (en: 'equals colon', DeepL translation) + - "≖": [T: "gyűrű egyenlő"] # 0x2256 (en: 'ring in equal to', DeepL translation) - "≗": # 0x2257 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "megközelítőleg egyenlő" # (en: 'approximately equal to', DeepL translation) - - "≘": [t: "megfelel"] # 0x2258 (en: 'corresponds to', DeepL translation) - - "≙": [t: "becslések"] # 0x2259 (en: 'estimates', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "megközelítőleg egyenlő" # (en: 'approximately equal to', DeepL translation) + - "≘": [T: "megfelel"] # 0x2258 (en: 'corresponds to', DeepL translation) + - "≙": [T: "becslés"] # 0x2259 (en: 'estimates', DeepL translation) - "≚": # 0x225a - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "egyenlőségjel" # (en: 'equiangular to', DeepL translation) - - "≛": [t: "csillag egyenlő"] # 0x225b (en: 'star equals', DeepL translation) - - "≜": [t: "delta egyenlő"] # 0x225c (en: 'delta equals', DeepL translation) - - "≝": [t: "a következőképpen van definiálva"] # 0x225d (en: 'is defined to be', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "egyenlő szögű" # (en: 'equiangular to', DeepL translation) + - "≛": [T: "csillag egyenlő"] # 0x225b (en: 'star equals', DeepL translation) + - "≜": [T: "delta egyenlő"] # 0x225c (en: 'delta equals', DeepL translation) + - "≝": [T: "a következőképpen van definiálva"] # 0x225d (en: 'is defined to be', DeepL translation) - "≞": # 0x225e - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "mért" # (en: 'measured by', DeepL translation) - - "≟": [t: "ismeretlen kapcsolatban áll"] # 0x225f (en: 'has an unknown relationship with', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "mért" # (en: 'measured by', DeepL translation) + - "≟": [T: "ismeretlen kapcsolatban áll"] # 0x225f (en: 'has an unknown relationship with', DeepL translation) - "≠": # 0x2260 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "nem egyenlő" # (en: 'not equal to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "nem egyenlő" # (en: 'not equal to', DeepL translation) - "≡": # 0x2261 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "azonos" # (en: 'identical to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "azonos" # (en: 'identical to', DeepL translation) - "≢": # 0x2262 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "nem azonos" # (en: 'not identical to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "nem azonos" # (en: 'not identical to', DeepL translation) - "≣": # 0x2263 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "szigorúan egyenértékű" # (en: 'strictly equivalent to', DeepL translation) - - "≦": [t: "kisebb mint egyenlő felett egyenlő"] # 0x2266 (en: 'less than over equal to', DeepL translation) - - "≧": [t: "nagyobb, mint egyenlő"] # 0x2267 (en: 'greater than over equal to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "szigorúan egyenértékű" # (en: 'strictly equivalent to', DeepL translation) + - "≦": [T: "kisebb az egyenlőségjel fölött"] # 0x2266 (en: 'less than over equal to', DeepL translation) + - "≧": [T: "nagyobb, mint egyenlő"] # 0x2267 (en: 'greater than over equal to', DeepL translation) - "≨": # 0x2268 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "kisebb, mint, de nem egyenlő" # (en: 'less than but not equal to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "kisebb, de nem egyenlő" # (en: 'less than but not equal to', DeepL translation) - "≩": # 0x2269 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "nagyobb, mint, de nem egyenlő" # (en: 'greater than but not equal to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "nagyobb, de nem egyenlő" # (en: 'greater than but not equal to', DeepL translation) - "≪": # 0x226a - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "sokkal kisebb, mint" # (en: 'much less than', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "sokkal kisebb, mint" # (en: 'much less than', DeepL translation) - "≫": # 0x226b - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "sokkal nagyobb, mint" # (en: 'much greater than', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "sokkal nagyobb, mint" # (en: 'much greater than', DeepL translation) - "≬": # 0x226c - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "között" # (en: 'between', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "között" # (en: 'between', DeepL translation) - "≭": # 0x226d - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "nem egyenértékű" # (en: 'not equivalent to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "nem egyenértékű" # (en: 'not equivalent to', DeepL translation) - "≮": # 0x226e - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "nem kisebb, mint" # (en: 'not less than', DeepL translation) + then: [T: "az"] # (en: 'is', DeepL translation) + - T: "nem kisebb, mint" # (en: 'not less than', DeepL translation) - "≯": # 0x226f - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "nem nagyobb, mint" # (en: 'not greater than', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "nem nagyobb, mint" # (en: 'not greater than', DeepL translation) - "≰": # 0x2270 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "sem kisebb, mint vagy egyenlő" # (en: 'neither less than nor equal to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "se nem kisebb, se nem egyenlő" # (en: 'neither less than nor equal to', DeepL translation) - "≱": # 0x2271 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "sem nagyobb, sem egyenlő" # (en: 'neither greater than nor equal to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "se nem nagyobb, se nem egyenlő" # (en: 'neither greater than nor equal to', DeepL translation) - "≲": # 0x2272 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "kevesebb, mint vagy azzal egyenértékű" # (en: 'less than or equivalent to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "kisebb, vagy azzal egyenértékű" # (en: 'less than or equivalent to', DeepL translation) - "≳": # 0x2273 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "nagyobb vagy egyenlő, mint" # (en: 'greater than or equivalent to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "nagyobb, vagy egyenértékű" # (en: 'greater than or equivalent to', DeepL translation) - "≴": # 0x2274 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "sem kisebb, sem egyenlő" # (en: 'neither less than nor equivalent to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "sem kisebb, sem egyenlő" # (en: 'neither less than nor equivalent to', DeepL translation) - "≵": # 0x2275 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "se nem nagyobb, se nem egyenlő" # (en: 'neither greater than nor equivalent to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "se nem nagyobb, se nem egyenlő" # (en: 'neither greater than nor equivalent to', DeepL translation) - "≶": # 0x2276 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "kisebb vagy nagyobb, mint" # (en: 'less than or greater than', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "kisebb vagy nagyobb, mint" # (en: 'less than or greater than', DeepL translation) - "≷": # 0x2277 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "nagyobb, mint vagy kisebb, mint" # (en: 'greater than or less than', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "nagyobb vagy kisebb, mint" # (en: 'greater than or less than', DeepL translation) - "≸": # 0x2278 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "sem kisebb, sem nagyobb, mint" # (en: 'neither less than nor greater than', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "sem kisebb, sem nagyobb, mint" # (en: 'neither less than nor greater than', DeepL translation) - "≹": # 0x2279 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "se nem nagyobb, se nem kisebb" # (en: 'neither greater than nor less than', DeepL translation) - - "≺": [t: "megelőzi"] # 0x227a (en: 'precedes', DeepL translation) - - "≻": [t: "sikerül"] # 0x227b (en: 'succeeds', DeepL translation) - - "≼": [t: "megelőzi vagy egyenlő"] # 0x227c (en: 'precedes or is equal to', DeepL translation) - - "≽": [t: "sikerül vagy egyenlő"] # 0x227d (en: 'succeeds or is equal to', DeepL translation) - - "≾": [t: "megelőzi vagy egyenértékű"] # 0x227e (en: 'precedes or is equivalent to', DeepL translation) - - "≿": [t: "sikerül vagy egyenértékű"] # 0x227f (en: 'succeeds or is equivalent to', DeepL translation) - - "⊀": [t: "nem előzi meg"] # 0x2280 (en: 'does not precede', DeepL translation) - - "⊁": [t: "nem sikerül"] # 0x2281 (en: 'does not succeed', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "se nem nagyobb, se nem kisebb" # (en: 'neither greater than nor less than', DeepL translation) + - "≺": [T: "megelőzi"] # 0x227a (en: 'precedes', DeepL translation) + - "≻": [T: "követi"] # 0x227b (en: 'succeeds', DeepL translation) + - "≼": [T: "megelőzi vagy egyenlő"] # 0x227c (en: 'precedes or is equal to', DeepL translation) + - "≽": [T: "követi vagy egyenlő"] # 0x227d (en: 'succeeds or is equal to', DeepL translation) + - "≾": [T: "megelőzi vagy egyenértékű"] # 0x227e (en: 'precedes or is equivalent to', DeepL translation) + - "≿": [T: "követi vagy egyenértékű"] # 0x227f (en: 'succeeds or is equivalent to', DeepL translation) + - "⊀": [T: "nem előzi meg"] # 0x2280 (en: 'does not precede', DeepL translation) + - "⊁": [T: "nem követi"] # 0x2281 (en: 'does not succeed', DeepL translation) - "⊂": # 0x2282 - test: if: "$Verbosity!='Terse'" - then: [t: "egy"] # (en: 'is a', DeepL translation) - - t: "részhalmaza" # (en: 'subset of', DeepL translation) + then: [T: "egy"] # (en: 'is a', DeepL translation) + - T: "részhalmaza ennek:" # (en: 'subset of', DeepL translation) - "⊃": # 0x2283 - test: if: "$Verbosity!='Terse'" - then: [t: "egy"] # (en: 'is a', DeepL translation) - - t: "szuperhalmaza" # (en: 'superset of', DeepL translation) + then: [T: "egy"] # (en: 'is a', DeepL translation) + - T: "szuperhalmaza" # (en: 'superset of', DeepL translation) - "⊄": # 0x2284 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "nem részhalmaza" # (en: 'not a subset of', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "nem részhalmaza" # (en: 'not a subset of', DeepL translation) - "⊅": # 0x2285 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "not a superset of" # (DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "nem egy szuperhalmaza ennek:" # (DeepL translation) - "⊆": # 0x2286 - test: if: "$Verbosity!='Terse'" - then: [t: "egy"] # (en: 'is a', DeepL translation) - - t: "részhalmaza vagy egyenlő" # (en: 'subset of or equal to', DeepL translation) + then: [T: "egy"] # (en: 'is a', DeepL translation) + - T: "részhalmaza vagy egyenlő" # (en: 'subset of or equal to', DeepL translation) - "⊇": # 0x2287 - test: if: "$Verbosity!='Terse'" - then: [t: "egy"] # (en: 'is a', DeepL translation) - - t: "szuperhalmaza vagy egyenlő" # (en: 'superset of or equal to', DeepL translation) + then: [T: "egy"] # (en: 'is a', DeepL translation) + - T: "szuperhalmaza vagy egyenlő" # (en: 'superset of or equal to', DeepL translation) - "⊈": # 0x2288 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "se nem részhalmaza, se nem egyenlő" # (en: 'neither a subset of nor equal to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "se nem részhalmaza, se nem egyenlő" # (en: 'neither a subset of nor equal to', DeepL translation) - "⊉": # 0x2289 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "sem nem szuperhalmaza, sem nem egyenlő" # (en: 'neither a superset of nor equal to', DeepL translation) - - "⊊": [t: "részhalmaza a nem egyenlő"] # 0x228a (en: 'subset of with not equal to', DeepL translation) - - "⊋": [t: "superset of with nem egyenlő"] # 0x228b (en: 'superset of with not equal to', DeepL translation) - - "⊌": [t: "multiset"] # 0x228c (DeepL translation) - - "⊍": [t: "multiset szorzás"] # 0x228d (en: 'multiset multiplication', DeepL translation) - - "⊎": [t: "multiset unió"] # 0x228e (en: 'multiset union', DeepL translation) - - "⊏": [t: "négyzet képe"] # 0x228f (en: 'square image of', DeepL translation) - - "⊐": [t: "négyzet eredeti"] # 0x2290 (en: 'square original of', DeepL translation) - - "⊑": [t: "négyzet képe vagy azzal egyenlő"] # 0x2291 (en: 'square image of or equal to', DeepL translation) - - "⊒": [t: "négyzet eredeti vagy egyenlő"] # 0x2292 (en: 'square original of or equal to', DeepL translation) - - "⊓": [t: "négyzet nagybetűs"] # 0x2293 (en: 'square cap', DeepL translation) - - "⊔": [t: "négyzetes csésze"] # 0x2294 (en: 'square cup', DeepL translation) - - "⊕": [t: "kör alakú plusz"] # 0x2295 (en: 'circled plus', DeepL translation) - - "⊖": [t: "bekarikázott mínusz"] # 0x2296 (en: 'circled minus', DeepL translation) - - "⊗": [t: "bekarikázott idők"] # 0x2297 (en: 'circled times', DeepL translation) - - "⊘": [t: "bekarikázott írásjel"] # 0x2298 (en: 'circled slash', DeepL translation) - - "⊙": [t: "bekarikázott pontoperátor"] # 0x2299 (en: 'circled dot operator', DeepL translation) - - "⊚": [t: "bekarikázott gyűrű"] # 0x229a (en: 'circled ring', DeepL translation) - - "⊛": [t: "bekarikázott csillag"] # 0x229b (en: 'circled asterisk', DeepL translation) - - "⊜": [t: "bekarikázott egyenlőségjel"] # 0x229c (en: 'circled equals', DeepL translation) - - "⊝": [t: "bekarikázott kötőjel"] # 0x229d (en: 'circled dash', DeepL translation) - - "⊞": [t: "négyzet plusz"] # 0x229e (en: 'squared plus', DeepL translation) - - "⊟": [t: "négyzet mínusz"] # 0x229f (en: 'squared minus', DeepL translation) - - "⊠": [t: "négyzetes idő"] # 0x22a0 (en: 'squared times', DeepL translation) - - "⊡": [t: "négyzetes pontoperátor"] # 0x22a1 (en: 'squared dot operator', DeepL translation) - - "⊢": [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) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "nem szuperhalmaza és nem egyenlő" # (en: 'neither a superset of nor equal to', DeepL translation) + - "⊊": [T: "részhalmaza, nem egyenlő jellel"] # 0x228a (en: 'subset of with not equal to', DeepL translation) + - "⊋": [T: "szuperhalmaza, nem egyenlő jellel"] # 0x228b (en: 'superset of with not equal to', DeepL translation) + - "⊌": [T: "többszörös halmaz"] # 0x228c (DeepL translation) + - "⊍": [T: "többszörös szorzás"] # 0x228d (en: 'multiset multiplication', DeepL translation) + - "⊎": [T: "többszörös unió"] # 0x228e (en: 'multiset union', DeepL translation) + - "⊏": [T: "négyzet képe"] # 0x228f (en: 'square image of', DeepL translation) + - "⊐": [T: "négyzet eredetije"] # 0x2290 (en: 'square original of', DeepL translation) + - "⊑": [T: "négyzet képe vagy egyenlő ezzel:"] # 0x2291 (en: 'square image of or equal to', DeepL translation) + - "⊒": [T: "négyzet eredetije vagy egyenlő ezzel:"] # 0x2292 (en: 'square original of or equal to', DeepL translation) + - "⊓": [T: "négyzet alakú sapka"] # 0x2293 (en: 'square cap', DeepL translation) + - "⊔": [T: "négyzet alakú csésze"] # 0x2294 (en: 'square cup', DeepL translation) + - "⊕": [T: "bekarikázott plusz"] # 0x2295 (en: 'circled plus', DeepL translation) + - "⊖": [T: "bekarikázott mínusz"] # 0x2296 (en: 'circled minus', DeepL translation) + - "⊗": [T: "bekarikázott szorzás"] # 0x2297 (en: 'circled times', DeepL translation) + - "⊘": [T: "bekarikázott osztás"] # 0x2298 (en: 'circled slash', DeepL translation) + - "⊙": [T: "bekarikázott pontoperátor"] # 0x2299 (en: 'circled dot operator', DeepL translation) + - "⊚": [T: "bekarikázott gyűrű operátor"] # 0x229a (en: 'circled ring', DeepL translation) + - "⊛": [T: "bekarikázott csillag operátor"] # 0x229b (en: 'circled asterisk', DeepL translation) + - "⊜": [T: "bekarikázott egyenlőségjel"] # 0x229c (en: 'circled equals', DeepL translation) + - "⊝": [T: "bekarikázott kötőjel"] # 0x229d (en: 'circled dash', DeepL translation) + - "⊞": [T: "pluszjel négyzetben"] # 0x229e (en: 'squared plus', DeepL translation) + - "⊟": [T: "mínuszjel négyzetben"] # 0x229f (en: 'squared minus', DeepL translation) + - "⊠": [T: "szorzásjel négyzetben"] # 0x22a0 (en: 'squared times', DeepL translation) + - "⊡": [T: "négyzetes pont operátor"] # 0x22a1 (en: 'squared dot operator', DeepL translation) + - "⊢": [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: "az"] # (en: 'is', DeepL translation) - - t: "alul" # (en: 'bottom', DeepL translation) - - "⊦": [t: "redukálódik"] # 0x22a6 (en: 'reduces to', DeepL translation) - - "⊧": [t: "modellek"] # 0x22a7 (en: 'models', DeepL translation) + 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 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "igaz" # (en: 'true', DeepL translation) - - "⊩": [t: "erők"] # 0x22a9 (en: 'forces', DeepL translation) - - "⊪": [t: "háromszoros függőleges sáv jobbra forduló"] # 0x22aa (en: 'triple vertical bar right turnstile', DeepL translation) - - "⊫": [t: "dupla függőleges sáv dupla jobbra forduló csavarkulcs"] # 0x22ab (en: 'double vertical bar double right turnstile', DeepL translation) - - "⊬": [t: "nem bizonyítja"] # 0x22ac (en: 'does not prove', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "igaz" # (en: 'true', DeepL translation) + - "⊩": [T: "kényszeríti"] # 0x22a9 (en: 'forces', DeepL translation) + - "⊪": [T: "háromszoros függőleges vonal jobboldali forgókereszttel"] # 0x22aa (en: 'triple vertical bar right turnstile', DeepL translation) + - "⊫": [T: "kettős függőlegesvonal dupla jobboldali forgókereszttel"] # 0x22ab (en: 'double vertical bar double right turnstile', DeepL translation) + - "⊬": [T: "nem bizonyítja"] # 0x22ac (en: 'does not prove', DeepL translation) - "⊭": # 0x22ad - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "nem igaz" # (en: 'not true', DeepL translation) - - "⊮": [t: "nem kényszerít"] # 0x22ae (en: 'does not force', DeepL translation) - - "⊯": [t: "negált kettős függőleges sáv kettős jobbra forduló"] # 0x22af (en: 'negated double vertical bar double right turnstile', DeepL translation) - - "⊰": [t: "előzi meg a reláció alatt"] # 0x22b0 (en: 'precedes under relation', DeepL translation) - - "⊱": [t: "sikerül reláció alatt"] # 0x22b1 (en: 'succeeds under relation', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "nem igaz" # (en: 'not true', DeepL translation) + - "⊮": [T: "nem kényszeríti"] # 0x22ae (en: 'does not force', DeepL translation) + - "⊯": [T: "negált kettős függőleges vonal dupla jobboldali forgókereszttel"] # 0x22af (en: 'negated double vertical bar double right turnstile', DeepL translation) + - "⊰": [T: "megelőzi az alatta lévő relációt"] # 0x22b0 (en: 'precedes under relation', DeepL translation) + - "⊱": [T: "követi az alatta lévő relációt"] # 0x22b1 (en: 'succeeds under relation', DeepL translation) - "⊲": # 0x22b2 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "egy normális alcsoportja" # (en: 'a normal subgroup of', DeepL translation) - - "⊳": [t: "tartalmaz, mint normál alcsoport"] # 0x22b3 (en: 'contains as a normal subgroup', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "egy normális alcsoportja" # (en: 'a normal subgroup of', DeepL translation) + - "⊳": [T: "normál alcsoportként tartalmazza"] # 0x22b3 (en: 'contains as a normal subgroup', DeepL translation) - "⊴": # 0x22b4 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "normális alcsoportja vagy egyenlő" # (en: 'a normal subgroup of or equal to', DeepL translation) - - "⊵": [t: "tartalmaz, mint normál alcsoport vagy egyenlő"] # 0x22b5 (en: 'contains as a normal subgroup or equal to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "normál alcsoportja vagy egyenlő" # (en: 'a normal subgroup of or equal to', DeepL translation) + - "⊵": [T: "normál alcsoportként tartalmazza vagy egyenlő"] # 0x22b5 (en: 'contains as a normal subgroup or equal to', DeepL translation) - "⊶": # 0x22b6 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "az eredeti" # (en: 'the original of', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "az eredeti" # (en: 'the original of', DeepL translation) - "⊷": # 0x22b7 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "egy kép" # (en: 'an image of', DeepL translation) - - "⊸": [t: "multitérkép"] # 0x22b8 (en: 'multimap', DeepL translation) - - "⊹": [t: "hermitikus konjugált mátrix"] # 0x22b9 (en: 'hermitian conjugate matrix', DeepL translation) - - "⊺": [t: "interkaláció"] # 0x22ba (en: 'intercalate', DeepL translation) - - "⊻": [t: "xor"] # 0x22bb (DeepL translation) - - "⊼": [t: "nand"] # 0x22bc (DeepL translation) - - "⊽": [t: "sem"] # 0x22bd (en: 'nor', DeepL translation) - - "⊾": [t: "derékszög ívvel"] # 0x22be (en: 'right angle with arc', DeepL translation) - - "⊿": [t: "jobb oldali háromszög"] # 0x22bf (en: 'right triangle', DeepL translation) - - "⋀": [t: "logikai és"] # 0x22c0 (en: 'logical and', DeepL translation) - - "⋁": [t: "logikai vagy"] # 0x22c1 (en: 'logical or', DeepL translation) - - "⋂": [t: "kereszteződés"] # 0x22c2 (en: 'intersection', DeepL translation) - - "⋃": [t: "unió"] # 0x22c3 (en: 'union', DeepL translation) - - "⋄": [t: "rombuszos operátor"] # 0x22c4 (en: 'diamond operator', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "egy kép" # (en: 'an image of', DeepL translation) + - "⊸": [T: "többértékű leképezés"] # 0x22b8 (en: 'multimap', DeepL translation) + - "⊹": [T: "hermite-féle konjugált mátrix"] # 0x22b9 (en: 'hermitian conjugate matrix', DeepL translation) + - "⊺": [T: "interkaláció"] # 0x22ba (en: 'intercalate', DeepL translation) + - "⊻": [T: "xor"] # 0x22bb (DeepL translation) + - "⊼": [T: "nand"] # 0x22bc (DeepL translation) + - "⊽": [T: "nor"] # 0x22bd (en: 'nor', DeepL translation) + - "⊾": [T: "derékszög ívvel"] # 0x22be (en: 'right angle with arc', DeepL translation) + - "⊿": [T: "jobb oldali háromszög"] # 0x22bf (en: 'right triangle', DeepL translation) + - "⋀": [T: "logikai és"] # 0x22c0 (en: 'logical and', DeepL translation) + - "⋁": [T: "logikai vagy"] # 0x22c1 (en: 'logical or', DeepL translation) + - "⋂": [T: "metszet"] # 0x22c2 (en: 'intersection', DeepL translation) + - "⋃": [T: "unió"] # 0x22c3 (en: 'union', DeepL translation) + - "⋄": [T: "gyémánt operátor"] # 0x22c4 (en: 'diamond operator', DeepL translation) - "⋅": # 0x22c5 - test: if: "@data-chem-formula-op" @@ -1189,284 +1189,284 @@ else: [T: "szorozva"] # (en: 'times', DeepL translation) - "⋆": [T: "szorozva"] # 0x22c6 (en: 'times', DeepL translation) - - "⋇": [t: "osztás idő"] # 0x22c7 (en: 'division times', DeepL translation) - - "⋈": [t: "masni"] # 0x22c8 (en: 'bowtie', DeepL translation) + - "⋇": [T: "osztás szorzás"] # 0x22c7 (en: 'division times', DeepL translation) + - "⋈": [T: "természetes összekapcsolás"] # 0x22c8 (en: 'bowtie', DeepL translation) - "⋉": # 0x22c9 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "bal oldali normális tényező félközvetett szorzata" # (en: 'the left normal factor semidirect product of', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "bal oldali normális faktor szemidirekt szorzata" # (en: 'the left normal factor semidirect product of', DeepL translation) - "⋊": # 0x22ca - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "a jobb oldali normális tényező félközvetett szorzata" # (en: 'the right normal factor semidirect product of', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "a jobb oldali normális tényező félközvetett szorzata" # (en: 'the right normal factor semidirect product of', DeepL translation) - "⋋": # 0x22cb - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "bal oldali félközvetett szorzata" # (en: 'the left semidirect product of', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "bal oldali féldirekt szorzat" # (en: 'the left semidirect product of', DeepL translation) - "⋌": # 0x22cc - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "a jobb oldali félközvetett szorzata" # (en: 'the right semidirect product of', DeepL translation) - - "⋍": [t: "fordított tilde egyenlő"] # 0x22cd (en: 'reversed tilde equals', DeepL translation) - - "⋎": [t: "görbe logikai vagy"] # 0x22ce (en: 'curly logical or', DeepL translation) - - "⋏": [t: "görbe logikai és"] # 0x22cf (en: 'curly logical and', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "a jobb oldali féldirekt szorzata" # (en: 'the right semidirect product of', DeepL translation) + - "⋍": [T: "fordított tilde egyenlő"] # 0x22cd (en: 'reversed tilde equals', DeepL translation) + - "⋎": [T: "ívelt logikai vagy"] # 0x22ce (en: 'curly logical or', DeepL translation) + - "⋏": [T: "ívelt logikai és"] # 0x22cf (en: 'curly logical and', DeepL translation) - "⋐": # 0x22d0 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "kettős részhalmaza" # (en: 'a double subset of', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "kettős részhalmaza ennek:" # (en: 'a double subset of', DeepL translation) - "⋑": # 0x22d1 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "egy kettős szuperhalmaza" # (en: 'a double superset of', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "egy kettős szuperhalmaza ennek:" # (en: 'a double superset of', DeepL translation) - "⋒": # 0x22d2 - test: if: "$Verbosity!='Terse'" - then: [t: "a"] # (en: 'the', DeepL translation) - - t: "kettős metszéspontja" # (en: 'double intersection of', DeepL translation) + then: [T: "a(z)"] # (en: 'the', DeepL translation) + - T: "kettős metszéspontja ennek:" # (en: 'double intersection of', DeepL translation) - "⋓": # 0x22d3 - test: if: "$Verbosity!='Terse'" - then: [t: "a"] # (en: 'the', DeepL translation) - - t: "kettős kötés" # (en: 'double union of', DeepL translation) + then: [T: "a(z)"] # (en: 'the', DeepL translation) + - T: "dupla uniója ennek:" # (en: 'double union of', DeepL translation) - "⋔": # 0x22d4 - test: if: "$Verbosity!='Terse'" - then: [t: "a"] # (en: 'the', DeepL translation) - - t: "megfelelő metszéspontja" # (en: 'proper intersection of', DeepL translation) + then: [T: "a(z)"] # (en: 'the', DeepL translation) + - T: "megfelelő metszéspontja" # (en: 'proper intersection of', DeepL translation) - "⋕": # 0x22d5 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "egyenlő és párhuzamos" # (en: 'equal to and parallel to', DeepL translation) - - "⋖": [t: "kisebb, mint pontokkal"] # 0x22d6 (en: 'less than with dot', DeepL translation) - - "⋗": [t: "nagyobb, mint ponttal"] # 0x22d7 (en: 'greater than with dot', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "egyenlő és párhuzamos ezzel:" # (en: 'equal to and parallel to', DeepL translation) + - "⋖": [T: "kisebb, mint ponttal"] # 0x22d6 (en: 'less than with dot', DeepL translation) + - "⋗": [T: "nagyobb, mint ponttal"] # 0x22d7 (en: 'greater than with dot', DeepL translation) - "⋘": # 0x22d8 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "nagyon sokkal kisebb, mint" # (en: 'very much less than', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "nagyon sokkal kisebb, mint" # (en: 'very much less than', DeepL translation) - "⋙": # 0x22d9 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "nagyon sokkal nagyobb, mint" # (en: 'very much greater than', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "nagyon sokkal nagyobb, mint" # (en: 'very much greater than', DeepL translation) - "⋚": # 0x22da - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "kisebb, mint egyenlő vagy nagyobb, mint" # (en: 'less than equal to or greater than', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "kisebb, mint egyenlő vagy nagyobb, mint" # (en: 'less than equal to or greater than', DeepL translation) - "⋛": # 0x22db - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "nagyobb, mint egyenlő vagy kisebb, mint" # (en: 'greater than equal to or less than', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "nagyobb, mint egyenlő vagy kisebb, mint" # (en: 'greater than equal to or less than', DeepL translation) - "⋜": # 0x22dc - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "egyenlő vagy kisebb, mint" # (en: 'equal to or less than', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "egyenlő vagy kisebb, mint" # (en: 'equal to or less than', DeepL translation) - "⋝": # 0x22dd - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "egyenlő vagy nagyobb, mint" # (en: 'equal to or greater than', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "egyenlő vagy nagyobb, mint" # (en: 'equal to or greater than', DeepL translation) - "⋞": # 0x22de - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "egyenlő vagy megelőzi" # (en: 'equal to or precedes', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "egyenlő vagy megelőzi" # (en: 'equal to or precedes', DeepL translation) - "⋟": # 0x22df - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "egyenlő vagy sikerül" # (en: 'equal to or succeeds', DeepL translation) - - "⋠": [t: "nem előzi meg és nem egyenlő"] # 0x22e0 (en: 'does not precede nor is equal to', DeepL translation) - - "⋡": [t: "nem sikerül sem nem egyenlő"] # 0x22e1 (en: 'does not succeed nor is equal to', DeepL translation) - - "⋢": [t: "nem négyzetképe vagy egyenlő"] # 0x22e2 (en: 'not square image of or equal to', DeepL translation) - - "⋣": [t: "nem négyzet eredeti vagy egyenlő"] # 0x22e3 (en: 'not square original of or equal to', DeepL translation) - - "⋤": [t: "négyzetes képe vagy nem egyenlő"] # 0x22e4 (en: 'square image of or not equal to', DeepL translation) - - "⋥": [t: "négyzet eredeti vagy nem egyenlő"] # 0x22e5 (en: 'square original of or not equal to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "egyenlő, vagy követi" # (en: 'equal to or succeeds', DeepL translation) + - "⋠": [T: "nem előzi meg és nem egyenlő"] # 0x22e0 (en: 'does not precede nor is equal to', DeepL translation) + - "⋡": [T: "nem követi és nem egyenlő"] # 0x22e1 (en: 'does not succeed nor is equal to', DeepL translation) + - "⋢": [T: "nem négyzetképe vagy egyenlő"] # 0x22e2 (en: 'not square image of or equal to', DeepL translation) + - "⋣": [T: "nem négyzetes eredetije vagy egyenlő"] # 0x22e3 (en: 'not square original of or equal to', DeepL translation) + - "⋤": [T: "négyzetes képe vagy nem egyenlő"] # 0x22e4 (en: 'square image of or not equal to', DeepL translation) + - "⋥": [T: "négyzetes eredetije vagy nem egyenlő"] # 0x22e5 (en: 'square original of or not equal to', DeepL translation) - "⋦": # 0x22e6 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "kevesebb, mint, de nem egyenlő" # (en: 'less than but not equivalent to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "kevesebb, mint, de nem egyenlő" # (en: 'less than but not equivalent to', DeepL translation) - "⋧": # 0x22e7 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "nagyobb, mint, de nem egyenértékű" # (en: 'greater than but not equivalent to', DeepL translation) - - "⋨": [t: "megelőzi, de nem egyenértékű vele"] # 0x22e8 (en: 'precedes but is not equivalent to', DeepL translation) - - "⋩": [t: "sikerül, de nem egyenértékű"] # 0x22e9 (en: 'succeeds but is not equivalent to', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "nagyobb, mint, de nem egyenértékű" # (en: 'greater than but not equivalent to', DeepL translation) + - "⋨": [T: "megelőzi, de nem egyenértékű vele"] # 0x22e8 (en: 'precedes but is not equivalent to', DeepL translation) + - "⋩": [T: "követi, de nem egyenértékű"] # 0x22e9 (en: 'succeeds but is not equivalent to', DeepL translation) - "⋪": # 0x22ea - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "nem normális alcsoportja" # (en: 'not a normal subgroup of', DeepL translation) - - "⋫": [t: "nem tartalmaz normál alcsoportként"] # 0x22eb (en: 'does not contain as a normal subgroup', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "nem normális alcsoportja" # (en: 'not a normal subgroup of', DeepL translation) + - "⋫": [T: "nem tartalmazza normál alcsoportként"] # 0x22eb (en: 'does not contain as a normal subgroup', DeepL translation) - "⋬": # 0x22ec - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) - - t: "nem normális alcsoportja sem egyenlő" # (en: 'not a normal subgroup of nor is equal to', DeepL translation) - - "⋭": [t: "nem tartalmazza normál alcsoportként sem egyenlő"] # 0x22ed (en: 'does not contain as a normal subgroup nor is equal to', DeepL translation) - - "⋮": [t: "függőleges ellipszis"] # 0x22ee (en: 'vertical ellipsis', DeepL translation) - - "⋯": [t: "pont pont pont pont"] # 0x22ef (en: 'dot dot dot', DeepL translation) - - "⋰": [t: "felfelé átlós ellipszis"] # 0x22f0 (en: 'up diagonal ellipsis', DeepL translation) - - "⋱": [t: "átlós ellipszis"] # 0x22f1 (en: 'diagonal ellipsis', DeepL translation) - - "⋲": [t: "eleme hosszú vízszintes vonallal"] # 0x22f2 (en: 'element of with long horizontal stroke', DeepL translation) - - "⋳": [t: "elem függőleges vonallal a vízszintes vonás végén"] # 0x22f3 (en: 'element of with vertical bar at end of horizontal stroke', DeepL translation) - - "⋴": [t: "elem függőleges vonallal a vízszintes vonás végén"] # 0x22f4 (en: 'element of with vertical bar at end of horizontal stroke', DeepL translation) - - "⋵": [t: "elem a pont fölött"] # 0x22f5 (en: 'element of with dot above', DeepL translation) - - "⋶": [t: "elem a fölött vonallal"] # 0x22f6 (en: 'element of with overbar', DeepL translation) - - "⋷": [t: "elem a fölött vonallal"] # 0x22f7 (en: 'element of with overbar', DeepL translation) - - "⋸": [t: "eleme alulvonallal"] # 0x22f8 (en: 'element of with underbar', DeepL translation) - - "⋹": [t: "eleme két vízszintes vonallal"] # 0x22f9 (en: 'element of with two horizontal strokes', DeepL translation) - - "⋺": [t: "hosszú vízszintes vonallal tartalmazza"] # 0x22fa (en: 'contains with long horizontal stroke', DeepL translation) - - "⋻": [t: "tartalmaz függőleges sávval a vízszintes vonás végén"] # 0x22fb (en: 'contains with vertical bar at end of horizontal stroke', DeepL translation) - - "⋼": [t: "tartalmaz függőleges sávval a vízszintes vonás végén"] # 0x22fc (en: 'contains with vertical bar at end of horizontal stroke', DeepL translation) - - "⋽": [t: "tartalmazza a túlsó sávot"] # 0x22fd (en: 'contains with overbar', DeepL translation) - - "⋾": [t: "tartalmazza a túlsó sávot"] # 0x22fe (en: 'contains with overbar', DeepL translation) - - "⋿": [t: "z jelölés táska tagság"] # 0x22ff (en: 'z notation bag membership', DeepL translation) - - "⌀": [t: "átmérő"] # 0x2300 (en: 'diameter', DeepL translation) - - "⌁": [t: "elektromos nyíl"] # 0x2301 (en: 'electric arrow', DeepL translation) - - "⌂": [t: "ház"] # 0x2302 (en: 'house', DeepL translation) - - "⌃": [t: "felfelé mutató nyílhegy"] # 0x2303 (en: 'up arrowhead', DeepL translation) - - "⌄": [t: "lefelé mutató nyílhegy"] # 0x2304 (en: 'down arrowhead', DeepL translation) - - "⌅": [t: "projekciós"] # 0x2305 (en: 'projective', DeepL translation) - - "⌆": [t: "perspektíva"] # 0x2306 (en: 'perspective', DeepL translation) - - "⌇": [t: "hullámvonal"] # 0x2307 (en: 'wavy line', DeepL translation) - - "⌈": [t: "bal felső határ"] # 0x2308 (en: 'left ceiling', DeepL translation) - - "⌉": [t: "jobb oldali mennyezet"] # 0x2309 (en: 'right ceiling', DeepL translation) - - "⌊": [t: "bal padló"] # 0x230a (en: 'left floor', DeepL translation) - - "⌋": [t: "jobb oldali padló"] # 0x230b (en: 'right floor', DeepL translation) - - "⌌": [t: "jobb alsó vágás"] # 0x230c (en: 'bottom right crop', DeepL translation) - - "⌍": [t: "bal alsó vágás"] # 0x230d (en: 'bottom left crop', DeepL translation) - - "⌎": [t: "jobb felső vágás"] # 0x230e (en: 'top right crop', DeepL translation) - - "⌏": [t: "balra fent vágás"] # 0x230f (en: 'top left crop', DeepL translation) - - "⌐": [t: "fordított nem jel"] # 0x2310 (en: 'reversed not sign', DeepL translation) - - "⌑": [t: "négyzet rozettás"] # 0x2311 (en: 'square lozenge', DeepL translation) - - "⌒": [t: "ív"] # 0x2312 (en: 'arc', DeepL translation) - - "⌓": [t: "szegmens"] # 0x2313 (en: 'segment', DeepL translation) - - "⌔": [t: "szektor"] # 0x2314 (en: 'sector', DeepL translation) - - "⌕": [t: "telefonos diktafon"] # 0x2315 (en: 'telephone recorder', DeepL translation) - - "⌖": [t: "helyzetjelző szálkereszt"] # 0x2316 (en: 'position indicator crosshairs', DeepL translation) - - "⌗": [t: "viewdata négyzet"] # 0x2317 (en: 'viewdata square', DeepL translation) - - "⌘": [t: "érdekesség helye jel"] # 0x2318 (en: 'place of interest sign', DeepL translation) - - "⌙": [t: "fordított nem jel"] # 0x2319 (en: 'turned not sign', DeepL translation) - - "⌚": [t: "óra"] # 0x231a (en: 'watch', DeepL translation) - - "⌛": [t: "homokóra"] # 0x231b (en: 'hourglass', DeepL translation) - - "⌜": [t: "bal felső sarok"] # 0x231c (en: 'top left corner', DeepL translation) - - "⌝": [t: "jobb felső sarok"] # 0x231d (en: 'top right corner', DeepL translation) - - "⌞": [t: "bal alsó sarok"] # 0x231e (en: 'bottom left corner', DeepL translation) - - "⌟": [t: "jobb alsó sarok"] # 0x231f (en: 'bottom right corner', DeepL translation) - - "⌠": [t: "felső fél egész"] # 0x2320 (en: 'top half integral', DeepL translation) - - "⌡": [t: "alsó fele integrált"] # 0x2321 (en: 'bottom half integral', DeepL translation) - - "⌢": [t: "homlokráncolás"] # 0x2322 (en: 'frown', DeepL translation) - - "⌣": [t: "mosoly"] # 0x2323 (en: 'smile', DeepL translation) - - "⌤": [t: "felfelé nyílhegy két vízszintes sáv között"] # 0x2324 (en: 'up arrowhead between two horizontal bars', DeepL translation) - - "⌥": [t: "opciós billentyű"] # 0x2325 (en: 'option key', DeepL translation) - - "⌦": [t: "törlés jobbra"] # 0x2326 (en: 'erase to the right', DeepL translation) - - "⌧": [t: "x téglalap alakú négyzetben"] # 0x2327 (en: 'x in a rectangle box', DeepL translation) - - "⌨": [t: "billentyűzet"] # 0x2328 (en: 'keyboard', DeepL translation) - - "〈": [t: "balra mutató szögletes zárójel"] # 0x2329 (en: 'left pointing angle bracket', DeepL translation) - - "〉": [t: "jobbra mutató szögletes zárójel"] # 0x232a (en: 'right pointing angle bracket', DeepL translation) - - "⌫": [t: "törlés balra"] # 0x232b (en: 'erase to the left', DeepL translation) - - "⌬": [t: "benzolgyűrű"] # 0x232c (en: 'benzene ring', DeepL translation) - - "⌭": [t: "hengeresség"] # 0x232d (en: 'cylindricity', DeepL translation) - - "⌮": [t: "körkörös profil"] # 0x232e (en: 'all around profile', DeepL translation) - - "⌯": [t: "szimmetria"] # 0x232f (en: 'symmetry', DeepL translation) - - "⌰": [t: "teljes kifutás"] # 0x2330 (en: 'total runout', DeepL translation) - - "⌱": [t: "dimenzió eredete"] # 0x2331 (en: 'dimension origin', DeepL translation) - - "⌲": [t: "kúpos kúp"] # 0x2332 (en: 'conical taper', DeepL translation) - - "⌳": [t: "ferde"] # 0x2333 (en: 'slope', DeepL translation) - - "⌴": [t: "ellenző"] # 0x2334 (en: 'counterbore', DeepL translation) - - "⌵": [t: "süllyesztett"] # 0x2335 (en: 'countersink', DeepL translation) - - "⌶": [t: "apl i gerenda"] # 0x2336 (en: 'apl i beam', DeepL translation) - - "⌽": [t: "apl kör stile"] # 0x233d (en: 'apl circle stile', DeepL translation) - - "⌿": [t: "apl slash bar"] # 0x233f (DeepL translation) - - "⍰": [t: "ismeretlen doboz"] # 0x2370 (en: 'unknown box', DeepL translation) - - "⍼": [t: "derékszög lefelé cikcakkos nyíllal"] # 0x237c (en: 'right angle with down zigzag arrow', DeepL translation) - - "⎔": [t: "hatszög"] # 0x2394 (en: 'hexagon', DeepL translation) - - "⎕": [t: "doboz"] # 0x2395 (en: 'box', DeepL translation) - - "⎶": [t: "alsó szögletes zárójel felett felső szögletes zárójel"] # 0x23b6 (en: 'bottom square bracket over top square bracket', DeepL translation) - - "⏜": [t: "felső zárójel"] # 0x23dc (en: 'top paren', DeepL translation) - - "⏝": [t: "alsó zárójel"] # 0x23dd (en: 'bottom paren', DeepL translation) - - "⏞": [t: "felső zárójel"] # 0x23de (en: 'top brace', DeepL translation) - - "⏟": [t: "alsó zárójel"] # 0x23df (en: 'bottom brace', DeepL translation) - - "⏠": [t: "felső teknőspáncélos konzol"] # 0x23e0 (en: 'top tortoise shell bracket', DeepL translation) - - "⏡": [t: "alsó teknőspáncélos zárójel"] # 0x23e1 (en: 'bottom tortoise shell bracket', DeepL translation) - - "⏢": [t: "fehér trapéz"] # 0x23e2 (en: 'white trapezium', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) + - T: "nem normál alcsoportja, és nem egyenlő vele" # (en: 'not a normal subgroup of nor is equal to', DeepL translation) + - "⋭": [T: "nem tartalmazza normál alcsoportként és nem egyenlő vele"] # 0x22ed (en: 'does not contain as a normal subgroup nor is equal to', DeepL translation) + - "⋮": [T: "függőleges ellipszis"] # 0x22ee (en: 'vertical ellipsis', DeepL translation) + - "⋯": [T: "pont pont pont"] # 0x22ef (en: 'dot dot dot', DeepL translation) + - "⋰": [T: "felfelé átlós ellipszis"] # 0x22f0 (en: 'up diagonal ellipsis', DeepL translation) + - "⋱": [T: "átlós ellipszis"] # 0x22f1 (en: 'diagonal ellipsis', DeepL translation) + - "⋲": [T: "eleme, hosszú vízszintes vonallal"] # 0x22f2 (en: 'element of with long horizontal stroke', DeepL translation) + - "⋳": [T: "eleme, függőleges vonallal a vízszintes vonal végén"] # 0x22f3 (en: 'element of with vertical bar at end of horizontal stroke', DeepL translation) + - "⋴": [T: "kis eleme, függőleges vonallal a vízszintes vonal végén"] # 0x22f4 (en: 'element of with vertical bar at end of horizontal stroke', DeepL translation) + - "⋵": [T: "eleme, fölötte ponttal"] # 0x22f5 (en: 'element of with dot above', DeepL translation) + - "⋶": [T: "eleme, felülvonással"] # 0x22f6 (en: 'element of with overbar', DeepL translation) + - "⋷": [T: "kis eleme, felülvonással"] # 0x22f7 (en: 'element of with overbar', DeepL translation) + - "⋸": [T: "eleme, aláhúzással"] # 0x22f8 (en: 'element of with underbar', DeepL translation) + - "⋹": [T: "eleme két vízszintes vonallal"] # 0x22f9 (en: 'element of with two horizontal strokes', DeepL translation) + - "⋺": [T: "tartalmazza, hosszú vízszintes vonallal"] # 0x22fa (en: 'contains with long horizontal stroke', DeepL translation) + - "⋻": [T: "tartalmazza, függőleges vonallal a vízszintes vonal végén"] # 0x22fb (en: 'contains with vertical bar at end of horizontal stroke', DeepL translation) + - "⋼": [T: "kis tartalmazza, függőleges vonallal a vízszintes vonal végén"] # 0x22fc (en: 'contains with vertical bar at end of horizontal stroke', DeepL translation) + - "⋽": [T: "tartalmazza, felülvonással"] # 0x22fd (en: 'contains with overbar', DeepL translation) + - "⋾": [T: "kis tartalmazza, felülvonással"] # 0x22fe (en: 'contains with overbar', DeepL translation) + - "⋿": [T: "z jelölési csoport tagság"] # 0x22ff (en: 'z notation bag membership', DeepL translation) + - "⌀": [T: "átmérő"] # 0x2300 (en: 'diameter', DeepL translation) + - "⌁": [T: "elektromos nyíl"] # 0x2301 (en: 'electric arrow', DeepL translation) + - "⌂": [T: "ház"] # 0x2302 (en: 'house', DeepL translation) + - "⌃": [T: "felfelé mutató nyílhegy"] # 0x2303 (en: 'up arrowhead', DeepL translation) + - "⌄": [T: "lefelé mutató nyílhegy"] # 0x2304 (en: 'down arrowhead', DeepL translation) + - "⌅": [T: "projektív"] # 0x2305 (en: 'projective', DeepL translation) + - "⌆": [T: "perspektíva"] # 0x2306 (en: 'perspective', DeepL translation) + - "⌇": [T: "hullámvonal"] # 0x2307 (en: 'wavy line', DeepL translation) + - "⌈": [T: "bal felső egész rész"] # 0x2308 (en: 'left ceiling', DeepL translation) + - "⌉": [T: "jobb felső egész rész"] # 0x2309 (en: 'right ceiling', DeepL translation) + - "⌊": [T: "bal alsó egész rész"] # 0x230a (en: 'left floor', DeepL translation) + - "⌋": [T: "jobb alsó egész rész"] # 0x230b (en: 'right floor', DeepL translation) + - "⌌": [T: "jobb alsó vágás"] # 0x230c (en: 'bottom right crop', DeepL translation) + - "⌍": [T: "bal alsó vágás"] # 0x230d (en: 'bottom left crop', DeepL translation) + - "⌎": [T: "jobb felső vágás"] # 0x230e (en: 'top right crop', DeepL translation) + - "⌏": [T: "balra fent vágás"] # 0x230f (en: 'top left crop', DeepL translation) + - "⌐": [T: "fordított nem jel"] # 0x2310 (en: 'reversed not sign', DeepL translation) + - "⌑": [T: "négyzet alakú rombusz"] # 0x2311 (en: 'square lozenge', DeepL translation) + - "⌒": [T: "ív"] # 0x2312 (en: 'arc', DeepL translation) + - "⌓": [T: "szegmens"] # 0x2313 (en: 'segment', DeepL translation) + - "⌔": [T: "szektor"] # 0x2314 (en: 'sector', DeepL translation) + - "⌕": [T: "telefonrögzítő"] # 0x2315 (en: 'telephone recorder', DeepL translation) + - "⌖": [T: "helyzetjelző szálkereszt"] # 0x2316 (en: 'position indicator crosshairs', DeepL translation) + - "⌗": [T: "viewdata négyzet"] # 0x2317 (en: 'viewdata square', DeepL translation) + - "⌘": [T: "érdekes hely jel"] # 0x2318 (en: 'place of interest sign', DeepL translation) + - "⌙": [T: "fordított nem jel"] # 0x2319 (en: 'turned not sign', DeepL translation) + - "⌚": [T: "óra"] # 0x231a (en: 'watch', DeepL translation) + - "⌛": [T: "homokóra"] # 0x231b (en: 'hourglass', DeepL translation) + - "⌜": [T: "bal felső sarok"] # 0x231c (en: 'top left corner', DeepL translation) + - "⌝": [T: "jobb felső sarok"] # 0x231d (en: 'top right corner', DeepL translation) + - "⌞": [T: "bal alsó sarok"] # 0x231e (en: 'bottom left corner', DeepL translation) + - "⌟": [T: "jobb alsó sarok"] # 0x231f (en: 'bottom right corner', DeepL translation) + - "⌠": [T: "felső félintegrál"] # 0x2320 (en: 'top half integral', DeepL translation) + - "⌡": [T: "alsó félintegrál"] # 0x2321 (en: 'bottom half integral', DeepL translation) + - "⌢": [T: "homlokráncolás"] # 0x2322 (en: 'frown', DeepL translation) + - "⌣": [T: "mosoly"] # 0x2323 (en: 'smile', DeepL translation) + - "⌤": [T: "felfelé mutató nyílhegy két vízszintes sáv között"] # 0x2324 (en: 'up arrowhead between two horizontal bars', DeepL translation) + - "⌥": [T: "opciós billentyű"] # 0x2325 (en: 'option key', DeepL translation) + - "⌦": [T: "törlés jobbra"] # 0x2326 (en: 'erase to the right', DeepL translation) + - "⌧": [T: "x egy téglalap alakú négyzetben"] # 0x2327 (en: 'x in a rectangle box', DeepL translation) + - "⌨": [T: "billentyűzet"] # 0x2328 (en: 'keyboard', DeepL translation) + - "〈": [T: "balra mutató szögletes zárójel"] # 0x2329 (en: 'left pointing angle bracket', DeepL translation) + - "〉": [T: "jobbra mutató szögletes zárójel"] # 0x232a (en: 'right pointing angle bracket', DeepL translation) + - "⌫": [T: "törlés balra"] # 0x232b (en: 'erase to the left', DeepL translation) + - "⌬": [T: "benzolgyűrű"] # 0x232c (en: 'benzene ring', DeepL translation) + - "⌭": [T: "hengeresség"] # 0x232d (en: 'cylindricity', DeepL translation) + - "⌮": [T: "körkörös profil"] # 0x232e (en: 'all around profile', DeepL translation) + - "⌯": [T: "szimmetria"] # 0x232f (en: 'symmetry', DeepL translation) + - "⌰": [T: "teljes kifutás"] # 0x2330 (en: 'total runout', DeepL translation) + - "⌱": [T: "dimenzió eredete"] # 0x2331 (en: 'dimension origin', DeepL translation) + - "⌲": [T: "kúpos kúp"] # 0x2332 (en: 'conical taper', DeepL translation) + - "⌳": [T: "ferde"] # 0x2333 (en: 'slope', DeepL translation) + - "⌴": [T: "ellenző"] # 0x2334 (en: 'counterbore', DeepL translation) + - "⌵": [T: "süllyesztett"] # 0x2335 (en: 'countersink', DeepL translation) + - "⌶": [T: "apl i gerenda"] # 0x2336 (en: 'apl i beam', DeepL translation) + - "⌽": [T: "apl kör alakú keret"] # 0x233d (en: 'apl circle stile', DeepL translation) + - "⌿": [T: "apl perjel"] # 0x233f (DeepL translation) + - "⍰": [T: "ismeretlen doboz"] # 0x2370 (en: 'unknown box', DeepL translation) + - "⍼": [T: "derékszög lefelé cikcakkos nyíllal"] # 0x237c (en: 'right angle with down zigzag arrow', DeepL translation) + - "⎔": [T: "hatszög"] # 0x2394 (en: 'hexagon', DeepL translation) + - "⎕": [T: "doboz"] # 0x2395 (en: 'box', DeepL translation) + - "⎶": [T: "alsó szögletes zárójel felett felső szögletes zárójel"] # 0x23b6 (en: 'bottom square bracket over top square bracket', DeepL translation) + - "⏜": [T: "felső zárójel"] # 0x23dc (en: 'top paren', DeepL translation) + - "⏝": [T: "alsó zárójel"] # 0x23dd (en: 'bottom paren', DeepL translation) + - "⏞": [T: "felső zárójel"] # 0x23de (en: 'top brace', DeepL translation) + - "⏟": [T: "alsó zárójel"] # 0x23df (en: 'bottom brace', DeepL translation) + - "⏠": [T: "felső teknőspáncélos zárójel"] # 0x23e0 (en: 'top tortoise shell bracket', DeepL translation) + - "⏡": [T: "alsó teknőspáncélos zárójel"] # 0x23e1 (en: 'bottom tortoise shell bracket', DeepL translation) + - "⏢": [T: "fehér trapéz"] # 0x23e2 (en: 'white trapezium', DeepL translation) - "⏣": [T: "benzolgyűrű körrel"] # 0x23e3 (en: 'benzene right with circle', DeepL translation) - - "⏤": [t: "egyenesség"] # 0x23e4 (en: 'straightness', DeepL translation) - - "⏥": [t: "laposság"] # 0x23e5 (en: 'flatness', DeepL translation) + - "⏤": [T: "egyenesség"] # 0x23e4 (en: 'straightness', DeepL translation) + - "⏥": [T: "laposság"] # 0x23e5 (en: 'flatness', DeepL translation) - "⏦": # 0x23e6 - - spell: "ac" - - t: "jelenlegi" # (en: 'current', DeepL translation) - - "⏧": [t: "elektromos kereszteződés"] # 0x23e7 (en: 'electrical intersection', DeepL translation) + - SPELL: "ac" + - T: "jelenlegi" # (en: 'current', DeepL translation) + - "⏧": [T: "elektromos kereszteződés"] # 0x23e7 (en: 'electrical intersection', DeepL translation) - "①-⑨": # 0x2460 - 0x2469 - T: "bekarikázott" # (en: 'circled', DeepL translation) - - spell: "translate('.', '①②③④⑤⑥⑦⑧⑨', '123456789')" + - SPELL: "translate('.', '①②③④⑤⑥⑦⑧⑨', '123456789')" - "⑩": [T: "bekarikázott tízes"] # 0x2469 (en: 'circled ten', DeepL translation) - - "⑪": [t: "bekarikázott tizenegy"] # 0x246a (en: 'circled eleven', DeepL translation) - - "⑫": [t: "bekarikázott tizenkettő"] # 0x246b (en: 'circled twelve', DeepL translation) - - "⑬": [t: "bekarikázott tizenhármas"] # 0x246c (en: 'circled thirteen', DeepL translation) - - "⑭": [t: "bekarikázott tizennégy"] # 0x246d (en: 'circled fourteen', DeepL translation) - - "⑮": [t: "bekarikázott tizenöt"] # 0x246e (en: 'circled fifteen', DeepL translation) - - "⑯": [t: "bekarikázott tizenhatos"] # 0x246f (en: 'circled sixteen', DeepL translation) - - "⑰": [t: "bekarikázott tizenhét"] # 0x2470 (en: 'circled seventeen', DeepL translation) - - "⑱": [t: "bekarikázott tizenegy"] # 0x2471 (en: 'circled eighteen', DeepL translation) - - "⑳": [t: "bekarikázott húsz"] # 0x2473 (en: 'circled twenty', DeepL translation) + - "⑪": [T: "bekarikázott tizenegyes"] # 0x246a (en: 'circled eleven', DeepL translation) + - "⑫": [T: "bekarikázott tizenkettes"] # 0x246b (en: 'circled twelve', DeepL translation) + - "⑬": [T: "bekarikázott tizenhármas"] # 0x246c (en: 'circled thirteen', DeepL translation) + - "⑭": [T: "bekarikázott tizennégyes"] # 0x246d (en: 'circled fourteen', DeepL translation) + - "⑮": [T: "bekarikázott tizenötös"] # 0x246e (en: 'circled fifteen', DeepL translation) + - "⑯": [T: "bekarikázott tizenhatos"] # 0x246f (en: 'circled sixteen', DeepL translation) + - "⑰": [T: "bekarikázott tizenhetes"] # 0x2470 (en: 'circled seventeen', DeepL translation) + - "⑱": [T: "bekarikázott tizenegyes"] # 0x2471 (en: 'circled eighteen', DeepL translation) + - "⑳": [T: "bekarikázott húszas"] # 0x2473 (en: 'circled twenty', DeepL translation) - "⑴-⑼": # 0x2474 - 0x247d - - t: "zárójeles" # (en: 'parenthesized', DeepL translation) - - spell: "translate('.', '⑴⑵⑶⑷⑸⑹⑺⑻⑼', '123456789')" - - "⑽": [t: "zárójeles tízes"] # 0x247d (en: 'parenthesized ten', DeepL translation) - - "⑾": [t: "zárójeles tizenegyes"] # 0x247e (en: 'parenthesized eleven', DeepL translation) - - "⑿": [t: "zárójeles zárójeles tizenkettő"] # 0x247f (en: 'parenthesized twelve', DeepL translation) - - "⒀": [t: "zárójeles tizenhárom"] # 0x2480 (en: 'parenthesized thirteen', DeepL translation) - - "⒁": [t: "zárójeles tizennégyes"] # 0x2481 (en: 'parenthesized fourteen', DeepL translation) - - "⒂": [t: "zárójeles zárójeles tizenötös"] # 0x2482 (en: 'parenthesized fifteen', DeepL translation) - - "⒃": [t: "zárójeles tizenhatos"] # 0x2483 (en: 'parenthesized sixteen', DeepL translation) - - "⒄": [t: "zárójeles zárójeles tizenhét"] # 0x2484 (en: 'parenthesized seventeen', DeepL translation) - - "⒅": [t: "zárójeles zárójeles tizenegyes"] # 0x2485 (en: 'parenthesized eighteen', DeepL translation) - - "⒆": [t: "zárójeles zárójeles tizenkilenc"] # 0x2486 (en: 'parenthesized nineteen', DeepL translation) - - "⒇": [t: "zárójeles zárójeles húszas"] # 0x2487 (en: 'parenthesized twenty', DeepL translation) + - T: "zárójeles" # (en: 'parenthesized', DeepL translation) + - SPELL: "translate('.', '⑴⑵⑶⑷⑸⑹⑺⑻⑼', '123456789')" + - "⑽": [T: "zárójeles tízes"] # 0x247d (en: 'parenthesized ten', DeepL translation) + - "⑾": [T: "zárójeles tizenegyes"] # 0x247e (en: 'parenthesized eleven', DeepL translation) + - "⑿": [T: "zárójeles tizenkettes"] # 0x247f (en: 'parenthesized twelve', DeepL translation) + - "⒀": [T: "zárójeles tizenhármas"] # 0x2480 (en: 'parenthesized thirteen', DeepL translation) + - "⒁": [T: "zárójeles tizennégyes"] # 0x2481 (en: 'parenthesized fourteen', DeepL translation) + - "⒂": [T: "zárójeles tizenötös"] # 0x2482 (en: 'parenthesized fifteen', DeepL translation) + - "⒃": [T: "zárójeles tizenhatos"] # 0x2483 (en: 'parenthesized sixteen', DeepL translation) + - "⒄": [T: "zárójeles tizenhetes"] # 0x2484 (en: 'parenthesized seventeen', DeepL translation) + - "⒅": [T: "zárójeles tizennyolcas"] # 0x2485 (en: 'parenthesized eighteen', DeepL translation) + - "⒆": [T: "zárójeles tizenkilences"] # 0x2486 (en: 'parenthesized nineteen', DeepL translation) + - "⒇": [T: "zárójeles húszas"] # 0x2487 (en: 'parenthesized twenty', DeepL translation) - "⒈-⒐": # 0x2488 - 0x2491 - - spell: "translate('.', '⒈⒉⒊⒋⒌⒍⒎⒏⒐', '123456789')" - - t: "ponttal" # (en: 'with period', DeepL translation) - - "⒑": [t: "tízes pontokkal"] # 0x2491 (en: 'ten with period', DeepL translation) - - "⒒": [t: "tizenegyes pontokkal"] # 0x2492 (en: 'eleven with period', DeepL translation) - - "⒓": [t: "tizenkettő ponttal"] # 0x2493 (en: 'twelve with period', DeepL translation) - - "⒔": [t: "tizenhármas pont"] # 0x2494 (en: 'thirteen with period', DeepL translation) - - "⒕": [t: "tizennégy ponttal"] # 0x2495 (en: 'fourteen with period', DeepL translation) - - "⒖": [t: "tizenöt pont"] # 0x2496 (en: 'fifteen with period', DeepL translation) - - "⒗": [t: "tizenhatos pont"] # 0x2497 (en: 'sixteen with period', DeepL translation) - - "⒘": [t: "tizenhét pont"] # 0x2498 (en: 'seventeen with period', DeepL translation) - - "⒙": [t: "tizennégy ponttal"] # 0x2499 (en: 'eighteen with period', DeepL translation) - - "⒚": [t: "tizenkilenc ponttal"] # 0x249a (en: 'nineteen with period', DeepL translation) - - "⒛": [t: "húsz ponttal"] # 0x249b (en: 'twenty with period', DeepL translation) + - SPELL: "translate('.', '⒈⒉⒊⒋⒌⒍⒎⒏⒐', '123456789')" + - T: "ponttal" # (en: 'with period', DeepL translation) + - "⒑": [T: "tíz ponttal"] # 0x2491 (en: 'ten with period', DeepL translation) + - "⒒": [T: "tizenegy ponttal"] # 0x2492 (en: 'eleven with period', DeepL translation) + - "⒓": [T: "tizenkettő ponttal"] # 0x2493 (en: 'twelve with period', DeepL translation) + - "⒔": [T: "tizenhárom ponttal"] # 0x2494 (en: 'thirteen with period', DeepL translation) + - "⒕": [T: "tizennégy ponttal"] # 0x2495 (en: 'fourteen with period', DeepL translation) + - "⒖": [T: "tizenöt ponttal"] # 0x2496 (en: 'fifteen with period', DeepL translation) + - "⒗": [T: "tizenhat ponttal"] # 0x2497 (en: 'sixteen with period', DeepL translation) + - "⒘": [T: "tizenhét ponttal"] # 0x2498 (en: 'seventeen with period', DeepL translation) + - "⒙": [T: "tizennyolc ponttal"] # 0x2499 (en: 'eighteen with period', DeepL translation) + - "⒚": [T: "tizenkilenc ponttal"] # 0x249a (en: 'nineteen with period', DeepL translation) + - "⒛": [T: "húsz ponttal"] # 0x249b (en: 'twenty with period', DeepL translation) - "⒜-⒵": # 0x249c - 0x24b5 - - t: "zárójeles" # (en: 'parenthesized', DeepL translation) - - spell: "translate('.', '⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵', 'abcdefghijklmnopqrstuvwxyz')" + - T: "zárójeles" # (en: 'parenthesized', DeepL translation) + - SPELL: "translate('.', '⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵', 'abcdefghijklmnopqrstuvwxyz')" - "Ⓐ-ⓩ": # 0x24b6 - 0x24cf - T: "bekarikázott" # (en: 'circled', DeepL translation) - - spell: "translate('.', 'ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - SPELL: "translate('.', 'ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "🅐-🅩": # 0x1f150 - 0x1f169 - T: "fekete körrel jelölt" # (en: 'black circled', DeepL translation) - - spell: "translate('.', '🅐🅑🅒🅓🅔🅕🅖🅗🅘🅙🅚🅛🅜🅝🅞🅟🅠🅡🅢🅣🅤🅥🅦🅧🅨🅩', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - 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) + - 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) - "⓭": [T: "fekete bekarikázott tizenhárom"] # 0x24ed (en: 'black circled thirteen', DeepL translation) @@ -1476,62 +1476,62 @@ - "⓱": [T: "fekete bekarikázott tizenhét"] # 0x24f1 (en: 'black circled seventeen', DeepL translation) - "⓲": [T: "fekete karikázott tizenegyes"] # 0x24f2 (en: 'black circled eighteen', DeepL translation) - "⓳": [T: "fekete bekarikázott tizenkilenc"] # 0x24f3 (en: 'black circled nineteen', DeepL translation) - - "⓴": [t: "fekete bekarikázott húszas"] # 0x24f4 (en: 'black circled twenty', DeepL translation) + - "⓴": [T: "fekete bekarikázott húszas"] # 0x24f4 (en: 'black circled twenty', DeepL translation) - "⓵-⓽": # 0x24f5 - 0x24fe - T: "dupla bekarikázott" # (en: 'double circled', DeepL translation) - - spell: "translate('.', '⓵⓶⓷⓸⓹⓺⓻⓼⓽', '123456789')" + - SPELL: "translate('.', '⓵⓶⓷⓸⓹⓺⓻⓼⓽', '123456789')" - "⓾": [T: "dupla bekarikázott tízes"] # 0x24fe (en: 'double circled ten', DeepL translation) - "⓿": [T: "fekete bekarikázott nulla"] # 0x24ff (en: 'black circled zero', DeepL translation) - "■": [T: "fekete négyzet"] # 0x25a0 (en: 'black square', DeepL translation) - "□": [T: "fehér négyzet"] # 0x25a1 (en: 'white square', DeepL translation) - "▢": [T: "fehér négyzet lekerekített sarkokkal"] # 0x25a2 (en: 'white square with rounded corners', DeepL translation) - "▣": [T: "fehér négyzet, amely kis fekete négyzetet tartalmaz"] # 0x25a3 (en: 'white square containing small black square', DeepL translation) - - "▤": [t: "négyzet vízszintes kitöltéssel"] # 0x25a4 (en: 'square with horizontal fill', DeepL translation) - - "▥": [t: "négyzet függőleges kitöltéssel"] # 0x25a5 (en: 'square with vertical fill', DeepL translation) - - "▦": [t: "négyzet ortogonális kereszthúzással kitöltve"] # 0x25a6 (en: 'square with orthogonal crosshatch fill', DeepL translation) - - "▧": [t: "négyzet bal felső és jobb alsó kitöltéssel"] # 0x25a7 (en: 'square with upper left to lower right fill', DeepL translation) - - "▨": [t: "négyzet jobb felsővel bal alsó kitöltés"] # 0x25a8 (en: 'square with upper right to lower left fill', DeepL translation) - - "▩": [t: "négyzet átlós kereszthúzással kitöltve"] # 0x25a9 (en: 'square with diagonal crosshatch fill', DeepL translation) - - "▪": [t: "fekete kis négyzet"] # 0x25aa (en: 'black small square', DeepL translation) - - "▫": [t: "fehér kis négyzet"] # 0x25ab (en: 'white small square', DeepL translation) - - "▬": [t: "fekete téglalap"] # 0x25ac (en: 'black rectangle', DeepL translation) - - "▭": [t: "fehér téglalap"] # 0x25ad (en: 'white rectangle', DeepL translation) - - "▮": [t: "fekete függőleges téglalap"] # 0x25ae (en: 'black vertical rectangle', DeepL translation) - - "▯": [t: "fehér függőleges téglalap"] # 0x25af (en: 'white vertical rectangle', DeepL translation) - - "▰": [t: "fekete párhuzamos"] # 0x25b0 (en: 'black parallelogram', DeepL translation) - - "▱": [t: "fehér párhuzamos"] # 0x25b1 (en: 'white parallelogram', DeepL translation) - - "▲": [t: "fekete felfelé mutató háromszög"] # 0x25b2 (en: 'black up pointing triangle', DeepL translation) - - "△": [t: "háromszög"] # 0x25b3 (en: 'triangle', DeepL translation) - - "▴": [t: "fekete felfelé mutató kis háromszög"] # 0x25b4 (en: 'black up pointing small triangle', DeepL translation) - - "▵": [t: "fehér felfelé mutató kis háromszög"] # 0x25b5 (en: 'white up pointing small triangle', DeepL translation) - - "▶": [t: "fekete jobbra mutató háromszög"] # 0x25b6 (en: 'black right pointing triangle', DeepL translation) - - "▷": [t: "fehér jobbra mutató háromszög"] # 0x25b7 (en: 'white right pointing triangle', DeepL translation) - - "▸": [t: "fekete jobbra mutató kis háromszög"] # 0x25b8 (en: 'black right pointing small triangle', DeepL translation) - - "▹": [t: "fehér jobbra mutató kis háromszög"] # 0x25b9 (en: 'white right pointing small triangle', DeepL translation) - - "►": [t: "fekete jobbra mutató mutató"] # 0x25ba (en: 'black right pointing pointer', DeepL translation) - - "▻": [t: "fehér jobbra mutató mutató"] # 0x25bb (en: 'white right pointing pointer', DeepL translation) - - "▼": [t: "fekete lefelé mutató háromszög"] # 0x25bc (en: 'black down pointing triangle', DeepL translation) - - "▽": [t: "fehér lefelé mutató háromszög"] # 0x25bd (en: 'white down pointing triangle', DeepL translation) - - "▾": [t: "fekete lefelé mutató kis háromszög"] # 0x25be (en: 'black down pointing small triangle', DeepL translation) - - "▿": [t: "fehér lefelé mutató kis háromszög"] # 0x25bf (en: 'white down pointing small triangle', DeepL translation) - - "◀": [t: "fekete balra mutató háromszög"] # 0x25c0 (en: 'black left pointing triangle', DeepL translation) - - "◁": [t: "fehér balra mutató kis háromszög"] # 0x25c1 (en: 'white left pointing triangle', DeepL translation) - - "◂": [t: "fekete balra mutató kis háromszög"] # 0x25c2 (en: 'black left pointing small triangle', DeepL translation) - - "◃": [t: "fehér balra mutató kis háromszög"] # 0x25c3 (en: 'white left pointing small triangle', DeepL translation) - - "◄": [t: "fekete balra mutató mutató"] # 0x25c4 (en: 'black left pointing pointer', DeepL translation) - - "◅": [t: "fehér balra mutató mutató mutató"] # 0x25c5 (en: 'white left pointing pointer', DeepL translation) - - "◆": [t: "fekete gyémánt"] # 0x25c6 (en: 'black diamond', DeepL translation) - - "◇": [t: "fehér rombusz"] # 0x25c7 (en: 'white diamond', DeepL translation) - - "◈": [t: "fehér rombusz, benne fekete kis rombusz"] # 0x25c8 (en: 'white diamond containing black small diamond', DeepL translation) - - "◉": [t: "halszem"] # 0x25c9 (en: 'fisheye', DeepL translation) - - "◊": [t: "rozettás"] # 0x25ca (en: 'lozenge', DeepL translation) - - "○": [t: "fehér kör"] # 0x25cb (en: 'white circle', DeepL translation) - - "◌": [t: "pontozott kör"] # 0x25cc (en: 'dotted circle', DeepL translation) - - "◍": [t: "kör függőleges kitöltéssel"] # 0x25cd (en: 'circle with vertical fill', DeepL translation) - - "◎": [t: "bullseye"] # 0x25ce (DeepL translation) - - "●": [t: "fekete kör"] # 0x25cf (en: 'black circle', DeepL translation) - - "◐": [t: "kör bal oldali felével fekete"] # 0x25d0 (en: 'circle with left half black', DeepL translation) - - "◑": [t: "kör jobb oldali fél feketével"] # 0x25d1 (en: 'circle with right half black', DeepL translation) + - "▤": [T: "négyzet vízszintes kitöltéssel"] # 0x25a4 (en: 'square with horizontal fill', DeepL translation) + - "▥": [T: "négyzet függőleges kitöltéssel"] # 0x25a5 (en: 'square with vertical fill', DeepL translation) + - "▦": [T: "négyzet merőleges keresztsraffozással"] # 0x25a6 (en: 'square with orthogonal crosshatch fill', DeepL translation) + - "▧": [T: "négyzet bal felső és jobb alsó kitöltéssel"] # 0x25a7 (en: 'square with upper left to lower right fill', DeepL translation) + - "▨": [T: "négyzet, jobb felső és bal alsó kitöltéssel"] # 0x25a8 (en: 'square with upper right to lower left fill', DeepL translation) + - "▩": [T: "négyzet átlós kereszthúzással kitöltve"] # 0x25a9 (en: 'square with diagonal crosshatch fill', DeepL translation) + - "▪": [T: "fekete kis négyzet"] # 0x25aa (en: 'black small square', DeepL translation) + - "▫": [T: "fehér kis négyzet"] # 0x25ab (en: 'white small square', DeepL translation) + - "▬": [T: "fekete téglalap"] # 0x25ac (en: 'black rectangle', DeepL translation) + - "▭": [T: "fehér téglalap"] # 0x25ad (en: 'white rectangle', DeepL translation) + - "▮": [T: "fekete függőleges téglalap"] # 0x25ae (en: 'black vertical rectangle', DeepL translation) + - "▯": [T: "fehér függőleges téglalap"] # 0x25af (en: 'white vertical rectangle', DeepL translation) + - "▰": [T: "fekete paralelogramma"] # 0x25b0 (en: 'black parallelogram', DeepL translation) + - "▱": [T: "fehér paralelogramma"] # 0x25b1 (en: 'white parallelogram', DeepL translation) + - "▲": [T: "fekete felfelé mutató háromszög"] # 0x25b2 (en: 'black up pointing triangle', DeepL translation) + - "△": [T: "háromszög"] # 0x25b3 (en: 'triangle', DeepL translation) + - "▴": [T: "fekete felfelé mutató kis háromszög"] # 0x25b4 (en: 'black up pointing small triangle', DeepL translation) + - "▵": [T: "fehér felfelé mutató kis háromszög"] # 0x25b5 (en: 'white up pointing small triangle', DeepL translation) + - "▶": [T: "fekete jobbra mutató háromszög"] # 0x25b6 (en: 'black right pointing triangle', DeepL translation) + - "▷": [T: "fehér jobbra mutató háromszög"] # 0x25b7 (en: 'white right pointing triangle', DeepL translation) + - "▸": [T: "fekete jobbra mutató kis háromszög"] # 0x25b8 (en: 'black right pointing small triangle', DeepL translation) + - "▹": [T: "fehér jobbra mutató kis háromszög"] # 0x25b9 (en: 'white right pointing small triangle', DeepL translation) + - "►": [T: "fekete jobbra mutató mutató"] # 0x25ba (en: 'black right pointing pointer', DeepL translation) + - "▻": [T: "fehér jobbra mutató mutató"] # 0x25bb (en: 'white right pointing pointer', DeepL translation) + - "▼": [T: "fekete lefelé mutató háromszög"] # 0x25bc (en: 'black down pointing triangle', DeepL translation) + - "▽": [T: "fehér lefelé mutató háromszög"] # 0x25bd (en: 'white down pointing triangle', DeepL translation) + - "▾": [T: "fekete lefelé mutató kis háromszög"] # 0x25be (en: 'black down pointing small triangle', DeepL translation) + - "▿": [T: "fehér lefelé mutató kis háromszög"] # 0x25bf (en: 'white down pointing small triangle', DeepL translation) + - "◀": [T: "fekete balra mutató háromszög"] # 0x25c0 (en: 'black left pointing triangle', DeepL translation) + - "◁": [T: "fehér balra mutató kis háromszög"] # 0x25c1 (en: 'white left pointing triangle', DeepL translation) + - "◂": [T: "fekete balra mutató kis háromszög"] # 0x25c2 (en: 'black left pointing small triangle', DeepL translation) + - "◃": [T: "fehér balra mutató kis háromszög"] # 0x25c3 (en: 'white left pointing small triangle', DeepL translation) + - "◄": [T: "fekete balra mutató mutató"] # 0x25c4 (en: 'black left pointing pointer', DeepL translation) + - "◅": [T: "fehér balra mutató mutató"] # 0x25c5 (en: 'white left pointing pointer', DeepL translation) + - "◆": [T: "fekete gyémánt"] # 0x25c6 (en: 'black diamond', DeepL translation) + - "◇": [T: "fehér rombusz"] # 0x25c7 (en: 'white diamond', DeepL translation) + - "◈": [T: "fehér rombusz, benne fekete kis rombusz"] # 0x25c8 (en: 'white diamond containing black small diamond', DeepL translation) + - "◉": [T: "halszem"] # 0x25c9 (en: 'fisheye', DeepL translation) + - "◊": [T: "rombusz"] # 0x25ca (en: 'lozenge', DeepL translation) + - "○": [T: "fehér kör"] # 0x25cb (en: 'white circle', DeepL translation) + - "◌": [T: "pontozott kör"] # 0x25cc (en: 'dotted circle', DeepL translation) + - "◍": [T: "kör függőleges kitöltéssel"] # 0x25cd (en: 'circle with vertical fill', DeepL translation) + - "◎": [T: "célpont"] # 0x25ce (DeepL translation) + - "●": [T: "fekete kör"] # 0x25cf (en: 'black circle', DeepL translation) + - "◐": [T: "kör, amelynek bal fele fekete"] # 0x25d0 (en: 'circle with left half black', DeepL translation) + - "◑": [T: "kör, amelynek jobb fele fekete"] # 0x25d1 (en: 'circle with right half black', DeepL translation) - "◒": [t: "kör alsó felével fekete"] # 0x25d2 (en: 'circle with lower half black', DeepL translation) - "◓": [t: "kör felső fele fekete"] # 0x25d3 (en: 'circle with upper half black', DeepL translation) - "◔": [t: "kör jobb felső kvadráns fekete"] # 0x25d4 (en: 'circle with upper right quadrant black', DeepL translation) @@ -1717,17 +1717,17 @@ - "⟂": # 0x27c2 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) - t: "merőleges" # (en: 'perpendicular to', DeepL translation) - "⟃": # 0x27c3 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) - t: "nyitott részhalmaza" # (en: 'an open subset of', DeepL translation) - "⟄": # 0x27c4 - test: if: "$Verbosity!='Terse'" - then: [t: "az"] # (en: 'is', DeepL translation) + then: [T: "a(z)"] # (en: 'is', DeepL translation) - t: "egy nyitott szuperszett" # (en: 'an open superset of', DeepL translation) - "⟅": [t: "bal oldali s alakú zsákhatároló"] # 0x27c5 (en: 'left s-shaped bag delimiter', DeepL translation) - "⟆": [t: "jobb oldali s alakú zsákhatár"] # 0x27c6 (en: 'right s-shaped bag delimiter', DeepL translation) @@ -3190,50 +3190,50 @@ # script chars in math alphabetic block and also MathType private use area - "𝒜-𝒵": # 0x1d49c - 0x1d4b5 - - t: "script" # (DeepL translation) - - spell: "translate('.', '𝒜𝒝𝒞𝒟𝒠𝒡𝒢𝒣𝒤𝒥𝒦𝒧𝒨𝒩𝒪𝒫𝒬𝒭𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - T: "alsó index" # (DeepL translation) + - SPELL: "translate('.', '𝒜𝒝𝒞𝒟𝒠𝒡𝒢𝒣𝒤𝒥𝒦𝒧𝒨𝒩𝒪𝒫𝒬𝒭𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf100 - 0xf119 - - t: "script" # (DeepL translation) - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - T: "alsó index" # (DeepL translation) + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝒶-𝓏": # 0x1d4b6 - 0x1d4cf - - t: "script" # (DeepL translation) - - spell: "translate('.', '𝒶𝒷𝒸𝒹𝒺𝒻𝒼𝒽𝒾𝒿𝓀𝓁𝓂𝓃𝓄𝓅𝓆𝓇𝓈𝓉𝓊𝓋𝓌𝓍𝓎𝓏', 'abcdefghijklmnopqrstuvwxyz')" + - T: "alsó index" # (DeepL translation) + - SPELL: "translate('.', '𝒶𝒷𝒸𝒹𝒺𝒻𝒼𝒽𝒾𝒿𝓀𝓁𝓂𝓃𝓄𝓅𝓆𝓇𝓈𝓉𝓊𝓋𝓌𝓍𝓎𝓏', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf11a - 0xf133 - - t: "script" # (DeepL translation) - - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - T: "alsó index" # (DeepL translation) + - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" # bold script chars in math alphabetic block and also MathType private use area - "𝓐-𝓩": # 0x1d4d0 - 0x1d4e9 - - t: "script" # (DeepL translation) + - T: "alsó index" # (DeepL translation) - test: if: "not($IgnoreBold)" - then: [t: "félkövér"] # (en: 'bold', DeepL translation) - - spell: "translate('.', '𝓐𝓑𝓒𝓓𝓔𝓕𝓖𝓗𝓘𝓙𝓚𝓛𝓜𝓝𝓞𝓟𝓠𝓡𝓢𝓣𝓤𝓥𝓦𝓧𝓨𝓩', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + then: [T: "félkövér"] # (en: 'bold', DeepL translation) + - SPELL: "translate('.', '𝓐𝓑𝓒𝓓𝓔𝓕𝓖𝓗𝓘𝓙𝓚𝓛𝓜𝓝𝓞𝓟𝓠𝓡𝓢𝓣𝓤𝓥𝓦𝓧𝓨𝓩', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf140 - 0xf159 - - t: "script" # (DeepL translation) + - T: "alsó index" # (DeepL translation) - test: if: "not($IgnoreBold)" - then: [t: "félkövér"] # (en: 'bold', DeepL translation) - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + then: [T: "félkövér"] # (en: 'bold', DeepL translation) + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝓪-𝔃": # 0x1d4ea - 0x1d503 - - t: "script" # (DeepL translation) + - T: "alsó index" # (DeepL translation) - test: if: "not($IgnoreBold)" - then: [t: "félkövér"] # (en: 'bold', DeepL translation) - - spell: "translate('.', '𝓪𝓫𝓬𝓭𝓮𝓯𝓰𝓱𝓲𝓳𝓴𝓵𝓶𝓷𝓸𝓹𝓺𝓻𝓼𝓽𝓾𝓿𝔀𝔁𝔂𝔃', 'abcdefghijklmnopqrstuvwxyz')" + then: [T: "félkövér"] # (en: 'bold', DeepL translation) + - SPELL: "translate('.', '𝓪𝓫𝓬𝓭𝓮𝓯𝓰𝓱𝓲𝓳𝓴𝓵𝓶𝓷𝓸𝓹𝓺𝓻𝓼𝓽𝓾𝓿𝔀𝔁𝔂𝔃', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf15a - 0xf173 - - t: "script" # (DeepL translation) + - T: "alsó index" # (DeepL translation) - test: if: "not($IgnoreBold)" - then: [t: "félkövér"] # (en: 'bold', DeepL translation) - - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + then: [T: "félkövér"] # (en: 'bold', DeepL translation) + - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf180 - 0xf199 - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "": # 0xf19a - test: @@ -3248,7 +3248,7 @@ if: "$SpeechOverrides_CapitalLetters = ''" then_test: if: "$Impairment = 'Blindness'" - then: [t: "nagybetű"] # (en: 'cap', DeepL translation) + then: [T: "nagy"] # (en: 'cap', DeepL translation) else: [x: "$SpeechOverrides_CapitalLetters"] - pitch: value: "$CapitalLetters_Pitch" @@ -3266,7 +3266,7 @@ if: "$SpeechOverrides_CapitalLetters = ''" then_test: if: "$Impairment = 'Blindness'" - then: [t: "nagybetű"] # (en: 'cap', DeepL translation) + then: [T: "nagy"] # (en: 'cap', DeepL translation) else: [x: "$SpeechOverrides_CapitalLetters"] - pitch: value: "$CapitalLetters_Pitch" @@ -3284,7 +3284,7 @@ if: "$SpeechOverrides_CapitalLetters = ''" then_test: if: "$Impairment = 'Blindness'" - then: [t: "nagybetű"] # (en: 'cap', DeepL translation) + then: [T: "nagy"] # (en: 'cap', DeepL translation) else: [x: "$SpeechOverrides_CapitalLetters"] - pitch: value: "$CapitalLetters_Pitch" diff --git a/src/braille.rs b/src/braille.rs index 497678732..fddda2c8f 100644 --- a/src/braille.rs +++ b/src/braille.rs @@ -3132,8 +3132,30 @@ mod tests { use crate::interface::*; use log::debug; + fn braille_test(f: F) -> Result<()> + where + F: FnOnce() -> Result<()> + std::panic::UnwindSafe, + { + use std::panic::{catch_unwind, AssertUnwindSafe}; + init_panic_handler(); + let result = catch_unwind(AssertUnwindSafe(f)); + return report_any_panic(result); + } + + fn init_braille_mathml(mathml: &str) -> Result<()> { + use std::panic::{catch_unwind, AssertUnwindSafe}; + init_panic_handler(); + let result = catch_unwind(AssertUnwindSafe(|| { + set_rules_dir(super::super::abs_rules_dir_path())?; + set_mathml(mathml)?; + return Ok( () ); + })); + return report_any_panic(result); + } + #[test] fn ueb_highlight_24() -> Result<()> { // issue 24 + return braille_test(|| { let mathml_str = " 4 @@ -3143,10 +3165,9 @@ mod tests { c "; - crate::interface::set_rules_dir(super::super::abs_rules_dir_path()).unwrap(); - set_mathml(mathml_str).unwrap(); - set_preference("BrailleCode", "UEB").unwrap(); - set_preference("BrailleNavHighlight", "All").unwrap(); + init_braille_mathml(mathml_str)?; + set_preference("BrailleCode", "UEB")?; + set_preference("BrailleNavHighlight", "All")?; let braille = get_braille("id-2")?; assert_eq!("⣼⣙⠰⠁⠉", braille); set_navigation_node("id-2", 0)?; @@ -3157,11 +3178,13 @@ mod tests { set_navigation_node("id-4", 0)?; assert_eq!( get_braille_position()?, (2,4)); 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<()> { + return braille_test(|| { use std::time::Instant; let mathml_str = " @@ -3199,11 +3222,10 @@ mod tests { "; - crate::interface::set_rules_dir(super::super::abs_rules_dir_path()).unwrap(); - set_mathml(mathml_str).unwrap(); - set_preference("BrailleNavHighlight", "Off").unwrap(); + init_braille_mathml(mathml_str)?; + set_preference("BrailleNavHighlight", "Off")?; - set_preference("BrailleCode", "Nemeth").unwrap(); + set_preference("BrailleCode", "Nemeth")?; let _braille = get_braille("")?; let answers= &[2, 3, 3, 3, 3, 4, 7, 8, 9, 9, 10, 13, 12, 14, 12, 15, 17, 19, 21, 10, 4, 23, 25, 4]; let answers = answers.map(|num| format!("id-{}", num)); @@ -3217,7 +3239,7 @@ mod tests { assert_eq!(*answer, id, "\nNemeth test ith position={}", i); } - set_preference("BrailleCode", "UEB").unwrap(); + 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 = answers.map(|num| format!("id-{}", num)); @@ -3230,7 +3252,7 @@ mod tests { debug!("Time taken: {}ms", instant.elapsed().as_millis()); assert_eq!(*answer, id, "\nUEB test ith position={}", i); } - set_preference("BrailleCode", "CMU").unwrap(); + set_preference("BrailleCode", "CMU")?; let braille = get_braille("")?; let answers= &[2, 3, 5, 7, 8, 9, 9, 9, 10, 10, 11, 13, 12, 14, 14, 15, 17, 17, 19, 19, 21, 11, 5, 4, 22, 23, 23, 25, 25, 22,]; let answers = answers.map(|num| format!("id-{}", num)); @@ -3245,21 +3267,23 @@ mod tests { assert_eq!(*answer, id, "\nCMU test ith position={}", i); } return Ok( () ); + }); } #[test] #[allow(non_snake_case)] fn test_UEB_start_mode() -> Result<()> { + return braille_test(|| { let mathml_str = "xn"; - crate::interface::set_rules_dir(super::super::abs_rules_dir_path()).unwrap(); - set_mathml(mathml_str).unwrap(); - set_preference("BrailleCode", "UEB").unwrap(); - set_preference("UEB_START_MODE", "Grade2").unwrap(); + init_braille_mathml(mathml_str)?; + set_preference("BrailleCode", "UEB")?; + set_preference("UEB_START_MODE", "Grade2")?; let braille = get_braille("")?; assert_eq!("⠭⠰⠔⠝", braille, "Grade2"); - set_preference("UEB_START_MODE", "Grade1").unwrap(); + set_preference("UEB_START_MODE", "Grade1")?; let braille = get_braille("")?; assert_eq!("⠭⠔⠝", braille, "Grade1"); return Ok( () ); + }); } } diff --git a/src/chemistry.rs b/src/chemistry.rs index 3890e3ffe..742b1ba1a 100644 --- a/src/chemistry.rs +++ b/src/chemistry.rs @@ -1878,71 +1878,133 @@ mod chem_tests { #[allow(unused_imports)] use super::super::init_logger; - use super::super::are_strs_canonically_equal; + use crate::errors::{bail, Result}; + use super::super::are_strs_canonically_equal_result; + use crate::interface::{get_element, init_panic_handler, report_any_panic, trim_element}; + use sxd_document::parser; + use std::panic::{catch_unwind, AssertUnwindSafe}; use super::*; - fn parse_mathml_string(test: &str, test_mathml: F) -> bool - where F: Fn(Element) -> bool { - use sxd_document::parser; - use crate::interface::{get_element, trim_element}; - - - let test = if test.starts_with("{}", test)}; - let new_package = parser::parse(test); - if let Err(e) = new_package { - panic!("Invalid MathML input:\n{}\nError is: {}", &test, &e.to_string()); - } - - let new_package = new_package.unwrap(); + fn chem_test(f: F) -> Result<()> + where + F: FnOnce() -> Result<()> + std::panic::UnwindSafe, + { + init_panic_handler(); + let result = catch_unwind(AssertUnwindSafe(f)); + return report_any_panic(result); + } + + fn with_parsed_mrow(test: &str, f: F) -> Result + where + F: FnOnce(Element) -> Result, + { + let wrapped; + let math_str = if test.starts_with("{}", test); + &wrapped + }; + let new_package = parser::parse(math_str) + .map_err(|e| anyhow::anyhow!("Invalid MathML input:\n{math_str}\nError is: {e}"))?; let mut mathml = get_element(&new_package); trim_element(mathml, false); mathml = as_element(mathml.children()[0]); - return test_mathml(mathml); + return f(mathml); + } + + fn collect_elements_or_err<'a>(mrow: Element<'a>, test: &str) -> Result> { + collect_elements(mrow).ok_or_else(|| { + anyhow::anyhow!("collect_elements returned None for test input:\n{test}") + }) + } + + fn assert_chem_elements(test: &str, expected: bool, check: impl Fn(&[&str]) -> bool) -> Result<()> { + let actual = with_parsed_mrow(test, |mrow| { + let elements = collect_elements_or_err(mrow, test)?; + return Ok(check(&elements)); + })?; + if actual != expected { + bail!("chemistry check failed for:\n{test}\nexpected: {expected}, got: {actual}"); + } + return Ok( () ); + } + + fn assert_chem_elements_on_child( + test: &str, + child_index: usize, + expected: bool, + check: impl Fn(&[&str]) -> bool, + ) -> Result<()> { + let actual = with_parsed_mrow(test, |mrow| { + let child = as_element(mrow.children()[child_index]); + let elements = collect_elements_or_err(child, test)?; + return Ok(check(&elements)); + })?; + if actual != expected { + bail!("chemistry check failed for:\n{test}\nexpected: {expected}, got: {actual}"); + } + return Ok( () ); + } + + fn assert_chem_property(test: &str, expected: bool, check: impl Fn(Element) -> bool) -> Result<()> { + let actual = with_parsed_mrow(test, |mrow| Ok(check(mrow)))?; + if actual != expected { + bail!("chemistry check failed for:\n{test}\nexpected: {expected}, got: {actual}"); + } + return Ok( () ); } #[test] - fn test_noble_element() { + fn test_noble_element() -> Result<()> { + return chem_test(|| { // mathml test strings need to be canonical MathML since we aren't testing canonicalize() - let test = " Na Cl "; // - assert!( !parse_mathml_string(test, |mathml| has_noble_element( &collect_elements(mathml).unwrap() )) ); - let test = " Ar Cl "; // - assert!( parse_mathml_string(test, |mathml| has_noble_element( &collect_elements(mathml).unwrap() )) ); - let test = " Ne "; // - assert!( parse_mathml_string(test, |mathml| has_noble_element( &collect_elements(mathml).unwrap() )) ); + let test = " Na Cl "; + assert_chem_elements(test, false, has_noble_element)?; + let test = " Ar Cl "; + assert_chem_elements(test, true, has_noble_element)?; + let test = " Ne "; + assert_chem_elements(test, true, has_noble_element)?; + return Ok( () ); + }); } #[test] - fn test_alphabetical_order() { + fn test_alphabetical_order() -> Result<()> { + return chem_test(|| { // mathml test strings need to be canonical MathML since we aren't testing canonicalize() let test = r#" C6 H14 "#; - assert!( parse_mathml_string(test, |mathml| is_alphabetical( &collect_elements(mathml).unwrap() )) ); + assert_chem_elements(test, true, is_alphabetical)?; let test = r#" C6 H12 O6 "#; - assert!( parse_mathml_string(test, |mathml| is_alphabetical( &collect_elements(mathml).unwrap() )) ); + assert_chem_elements(test, true, is_alphabetical)?; let test = " B C O"; // "C" should be first - assert!( !parse_mathml_string(test, |mathml| is_alphabetical( &collect_elements(mathml).unwrap() )) ); + assert_chem_elements(test, false, is_alphabetical)?; let test = " P B O"; // not alphabetical - assert!( !parse_mathml_string(test, |mathml| is_alphabetical( &collect_elements(mathml).unwrap() )) ); + assert_chem_elements(test, false, is_alphabetical)?; + return Ok( () ); + }); } #[test] - fn test_is_structural() { + fn test_is_structural() -> Result<()> { + return chem_test(|| { // mathml test strings need to be canonical MathML since we aren't testing canonicalize() let test = r#" C6 H14 "#; - assert!( !parse_mathml_string(test, |mathml| is_structural( &collect_elements(mathml).unwrap() )) ); + assert_chem_elements(test, false, is_structural)?; let test = " B C O"; - assert!( !parse_mathml_string(test, |mathml| is_structural( &collect_elements(mathml).unwrap() )) ); + assert_chem_elements(test, false, is_structural)?; let test = " H O H"; - assert!( parse_mathml_string(test, |mathml| is_structural( &collect_elements(mathml).unwrap() )) ); + assert_chem_elements(test, true, is_structural)?; let test = " H @@ -1960,28 +2022,31 @@ mod chem_tests { "; - assert!( parse_mathml_string(test, |mathml| is_structural( &collect_elements(mathml).unwrap() )) ); + assert_chem_elements(test, true, is_structural)?; + return Ok( () ); + }); } #[test] - fn test_electronegativity_order() { + fn test_electronegativity_order() -> Result<()> { + return chem_test(|| { // mathml test strings need to be canonical MathML since we aren't testing canonicalize() let test = r#" N H3 "#; - assert!( parse_mathml_string(test, |mathml| is_ordered_by_electronegativity( &collect_elements(mathml).unwrap() )) ); + assert_chem_elements(test, true, is_ordered_by_electronegativity)?; let test = r#" O F2 "#; - assert!( parse_mathml_string(test, |mathml| is_ordered_by_electronegativity( &collect_elements(mathml).unwrap() )) ); + assert_chem_elements(test, true, is_ordered_by_electronegativity)?; let test = r#" Rb15 Hg16 "#; - assert!( parse_mathml_string(test, |mathml| is_ordered_by_electronegativity( &collect_elements(mathml).unwrap() )) ); + assert_chem_elements(test, true, is_ordered_by_electronegativity)?; let test = r#" [ @@ -1990,108 +2055,123 @@ mod chem_tests { ] 8- "#; - assert!( parse_mathml_string(test, |mathml| is_ordered_by_electronegativity( &collect_elements(as_element(mathml.children()[0])).unwrap() )) ); + assert_chem_elements_on_child(test, 0, true, is_ordered_by_electronegativity)?; let test = r#" Si H2 Br Cl "#; - assert!( parse_mathml_string(test, |mathml| is_ordered_by_electronegativity( &collect_elements(mathml).unwrap() )) ); + assert_chem_elements(test, true, is_ordered_by_electronegativity)?; + return Ok( () ); + }); } #[test] - fn test_order() { + fn test_order() -> Result<()> { + return chem_test(|| { let test = r#" C2 H4 (N H 2 ) 2 "#; - assert!( parse_mathml_string(test, is_order_ok) ); + assert_chem_property(test, true, is_order_ok)?; let test = r#" Fe O (O H ) "#; - assert!( parse_mathml_string(test, is_order_ok) ); + assert_chem_property(test, true, is_order_ok)?; let test = r#" // R-4.4.3.3 -- Chain compound doesn't fit rules but should be accepted Br S C N "#; - assert!( parse_mathml_string(test, |mathml| likely_chem_formula(mathml)==5) ); + assert_chem_property(test, true, |mathml| likely_chem_formula(mathml) == 5)?; + return Ok( () ); + }); } #[test] - fn test_simple_double_bond() { + fn test_simple_double_bond() -> Result<()> { + return chem_test(|| { let test1 = r#"C=C"#; - assert!( parse_mathml_string(test1, |mathml| likely_chem_formula(mathml) < CHEMISTRY_THRESHOLD) ); // just under threshold + assert_chem_property(test1, true, |mathml| likely_chem_formula(mathml) < CHEMISTRY_THRESHOLD)?; // just under threshold let test2 = r#"CO"#; - assert!( parse_mathml_string(test2, |mathml| likely_chem_formula(mathml)==CHEMISTRY_THRESHOLD) ); + assert_chem_property(test2, true, |mathml| likely_chem_formula(mathml) == CHEMISTRY_THRESHOLD)?; let test3 = r#"N=N"#; - assert!( parse_mathml_string(test3, |mathml| likely_chem_formula(mathml) < CHEMISTRY_THRESHOLD) ); // just under threshold + assert_chem_property(test3, true, |mathml| likely_chem_formula(mathml) < CHEMISTRY_THRESHOLD)?; // just under threshold let test4 = r#"Sn=Sn"#; - assert!( parse_mathml_string(test4, |mathml| likely_chem_formula(mathml) == 8) ); + assert_chem_property(test4, true, |mathml| likely_chem_formula(mathml) == 8)?; let test5 = r#"O=S"#; - assert!( parse_mathml_string(test5, |mathml| likely_chem_formula(mathml) < CHEMISTRY_THRESHOLD) ); // just under threshold + assert_chem_property(test5, true, |mathml| likely_chem_formula(mathml) < CHEMISTRY_THRESHOLD)?; // just under threshold let test10 = r#"K=K"#; - assert!( parse_mathml_string(test10, |mathml| likely_chem_formula(mathml) == NOT_CHEMISTRY) ); + assert_chem_property(test10, true, |mathml| likely_chem_formula(mathml) == NOT_CHEMISTRY)?; let test11 = r#"C=K"#; - assert!( parse_mathml_string(test11, |mathml| likely_chem_formula(mathml) == NOT_CHEMISTRY) ); + assert_chem_property(test11, true, |mathml| likely_chem_formula(mathml) == NOT_CHEMISTRY)?; + return Ok( () ); + }); } #[test] - fn test_double_bond() { + fn test_double_bond() -> Result<()> { + return chem_test(|| { let test1 = r#"CH2=C"#; - assert!( parse_mathml_string(test1, |mathml| likely_chem_formula(mathml)==8) ); + assert_chem_property(test1, true, |mathml| likely_chem_formula(mathml) == 8)?; let test2 = r#"CH2= CHR"#; - assert!( parse_mathml_string(test2, |mathml| likely_chem_formula(mathml)==12) ); + assert_chem_property(test2, true, |mathml| likely_chem_formula(mathml) == 12)?; let test3 = r#"H2C= CH2"#; - assert!( parse_mathml_string(test3, |mathml| likely_chem_formula(mathml)==11) ); + assert_chem_property(test3, true, |mathml| likely_chem_formula(mathml) == 11)?; let test4 = r#"H-N=N-H"#; - assert!( parse_mathml_string(test4, |mathml| likely_chem_formula(mathml)==10) ); + assert_chem_property(test4, true, |mathml| likely_chem_formula(mathml) == 10)?; let test10 = r#"CH3=C"#; - assert!( parse_mathml_string(test10, |mathml| likely_chem_formula(mathml)==NOT_CHEMISTRY) ); + assert_chem_property(test10, true, |mathml| likely_chem_formula(mathml) == NOT_CHEMISTRY)?; + return Ok( () ); + }); } #[test] #[ignore] // It would be good to say "not chemistry" for this, but there aren't rules for that at the moment - fn test_water_bond() { + fn test_water_bond() -> Result<()> { + return chem_test(|| { let test11 = r#"H2O=O"#; - assert!( parse_mathml_string(test11, |mathml| {println!("val={}", likely_chem_formula(mathml)); likely_chem_formula(mathml)==8}) ); - // assert!( parse_mathml_string(test11, |mathml| likely_chem_formula(mathml)==NOT_CHEMISTRY) ); + assert_chem_property(test11, true, |mathml| likely_chem_formula(mathml) == 8)?; + return Ok( () ); + }); } #[test] - fn test_triple_bond() { + fn test_triple_bond() -> Result<()> { + return chem_test(|| { let test1 = r#"CC"#; - assert!( parse_mathml_string(test1, |mathml| likely_chem_formula(mathml) < CHEMISTRY_THRESHOLD) ); + assert_chem_property(test1, true, |mathml| likely_chem_formula(mathml) < CHEMISTRY_THRESHOLD)?; let test2 = r#"C:::O"#; - assert!( parse_mathml_string(test2, |mathml| likely_chem_formula(mathml)==CHEMISTRY_THRESHOLD) ); + assert_chem_property(test2, true, |mathml| likely_chem_formula(mathml) == CHEMISTRY_THRESHOLD)?; let test3 = r#"H-CC-H"#; - assert!( parse_mathml_string(test3, |mathml| likely_chem_formula(mathml)==10) ); + assert_chem_property(test3, true, |mathml| likely_chem_formula(mathml) == 10)?; let test4 = r#"H-CC-H"#; - assert!( parse_mathml_string(test4, |mathml| likely_chem_formula(mathml)==10) ); + assert_chem_property(test4, true, |mathml| likely_chem_formula(mathml) == 10)?; let test5 = r#"N-CC-N"#; - assert!( parse_mathml_string(test5, |mathml| likely_chem_formula(mathml)==10) ); + assert_chem_property(test5, true, |mathml| likely_chem_formula(mathml) == 10)?; let test6 = r#"H-C C-CH3"#; // 1-Propyne - assert!( parse_mathml_string(test6, |mathml| likely_chem_formula(mathml)==14) ); - // assert!( parse_mathml_string(test6, |mathml| {println!("val={}", likely_chem_formula(mathml)); likely_chem_formula(mathml)==10}) ); + assert_chem_property(test6, true, |mathml| likely_chem_formula(mathml) == 14)?; let test10 = r#"O:::S"#; - assert!( parse_mathml_string(test10, |mathml| likely_chem_formula(mathml)==NOT_CHEMISTRY) ); + assert_chem_property(test10, true, |mathml| likely_chem_formula(mathml) == NOT_CHEMISTRY)?; let test11 = r#"PbPb"#; - assert!( parse_mathml_string(test11, |mathml| likely_chem_formula(mathml)==NOT_CHEMISTRY) ); + assert_chem_property(test11, true, |mathml| likely_chem_formula(mathml) == NOT_CHEMISTRY)?; let test12 = r#"CK"#; - assert!( parse_mathml_string(test12, |mathml| likely_chem_formula(mathml)==NOT_CHEMISTRY) ); + assert_chem_property(test12, true, |mathml| likely_chem_formula(mathml) == NOT_CHEMISTRY)?; + return Ok( () ); + }); } #[test] - fn split_mi() { + fn split_mi() -> Result<()> { let test = "LiF"; let target = " @@ -2100,20 +2180,20 @@ mod chem_tests { F "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn no_split_mi() { + fn no_split_mi() -> Result<()> { let test = "HC"; let target = " HC "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn combine_mi() { + fn combine_mi() -> Result<()> { let test = "HCl"; let target = " @@ -2122,11 +2202,11 @@ mod chem_tests { Cl "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn no_combine() { + fn no_combine() -> Result<()> { let test = "Cl"; let target = " @@ -2135,11 +2215,11 @@ mod chem_tests { l "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn add_script() { + fn add_script() -> Result<()> { let test = " SO 2 "; let target = " @@ -2152,11 +2232,11 @@ mod chem_tests { "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn add_script_bug_287() { + fn add_script_bug_287() -> Result<()> { let test = r#" SO @@ -2175,11 +2255,11 @@ mod chem_tests { "#; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn salt() { + fn salt() -> Result<()> { let test = "NaCl"; let target = " @@ -2188,11 +2268,11 @@ mod chem_tests { Cl "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn water() { + fn water() -> Result<()> { let test = "H2O"; let target = " @@ -2204,11 +2284,11 @@ mod chem_tests { O "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn mhchem_water() { + fn mhchem_water() -> Result<()> { let test = " @@ -2248,20 +2328,20 @@ mod chem_tests { O "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn carbon() { + fn carbon() -> Result<()> { let test = "C"; // not enough to trigger recognition let target = " C "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn sulfate() { + fn sulfate() -> Result<()> { let test = " [SO4] 2 @@ -2286,11 +2366,11 @@ mod chem_tests { "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn aluminum_sulfate() { + fn aluminum_sulfate() -> Result<()> { let test = "Al2 (SO4)3"; let target = " @@ -2317,11 +2397,11 @@ mod chem_tests { "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn ethanol_bonds() { + fn ethanol_bonds() -> Result<()> { let test = " C @@ -2355,11 +2435,11 @@ mod chem_tests { H "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn dichlorine_hexoxide() { + fn dichlorine_hexoxide() -> Result<()> { // init_logger(); let test = " @@ -2406,11 +2486,11 @@ mod chem_tests { "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn ethylene_with_bond() { + fn ethylene_with_bond() -> Result<()> { let test = " H2C = @@ -2433,11 +2513,11 @@ mod chem_tests { "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn ferric_chloride_aq() { + fn ferric_chloride_aq() -> Result<()> { let test = " Fe Cl3 @@ -2459,11 +2539,11 @@ mod chem_tests { "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn ferric_chloride_aq_as_mi() { + fn ferric_chloride_aq_as_mi() -> Result<()> { let test = " Fe Cl3 @@ -2485,11 +2565,11 @@ mod chem_tests { "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn chemtype_ammonia() { + fn chemtype_ammonia() -> Result<()> { let test = r#"NH3"#; let target = " @@ -2501,11 +2581,11 @@ mod chem_tests { "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn mhchem_ammonia() { + fn mhchem_ammonia() -> Result<()> { let test = r#" NH @@ -2532,11 +2612,11 @@ mod chem_tests { "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn mhchem_so4() { + fn mhchem_so4() -> Result<()> { let test = " SO @@ -2579,11 +2659,11 @@ mod chem_tests { "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn mhchem_short_ion() { + fn mhchem_short_ion() -> Result<()> { let test = " H @@ -2613,11 +2693,11 @@ mod chem_tests { "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn mhchem_ions_and_state() { + fn mhchem_ions_and_state() -> Result<()> { let test = " @@ -2694,11 +2774,11 @@ mod chem_tests { "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn ethylene_with_colon_bond() { + fn ethylene_with_colon_bond() -> Result<()> { let test = " H2C :: @@ -2721,11 +2801,11 @@ mod chem_tests { "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn mhchem_u238() { + fn mhchem_u238() -> Result<()> { let test = " @@ -2814,11 +2894,11 @@ mod chem_tests { 238 "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn mhchem_hcl_aq() { + fn mhchem_hcl_aq() -> Result<()> { let test = " 2 @@ -2853,11 +2933,11 @@ mod chem_tests { "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn mhchem_nested_sub() { + fn mhchem_nested_sub() -> Result<()> { // from \ce{(CH3)3} let test = " @@ -2923,11 +3003,11 @@ mod chem_tests { "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn mhchem_isotopes() { + fn mhchem_isotopes() -> Result<()> { // from \ce{^{18}O{}^{16}O} let test = " @@ -3043,12 +3123,12 @@ mod chem_tests { "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn merge_bug_274() { + fn merge_bug_274() -> Result<()> { let test = r#" @@ -3188,11 +3268,11 @@ mod chem_tests { "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn merge_bug_303() { + fn merge_bug_303() -> Result<()> { let test = r#" 2 @@ -3230,11 +3310,11 @@ mod chem_tests { "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } #[test] - fn mtd_assert_bug_393() { + fn mtd_assert_bug_393() -> Result<()> { let test = r#" @@ -3293,7 +3373,7 @@ mod chem_tests { "; - assert!(are_strs_canonically_equal(test, target, &[])); + are_strs_canonically_equal_result(test, target, &[]) } } diff --git a/src/interface.rs b/src/interface.rs index 55fe74698..9c1e53b2d 100644 --- a/src/interface.rs +++ b/src/interface.rs @@ -1137,6 +1137,16 @@ mod tests { use super::super::init_logger; use super::*; + fn interface_test(f: F) -> Result<()> + where + F: FnOnce() -> Result<()> + std::panic::UnwindSafe, + { + use std::panic::{catch_unwind, AssertUnwindSafe}; + init_panic_handler(); + let result = catch_unwind(AssertUnwindSafe(f)); + return report_any_panic(result); + } + fn are_parsed_strs_equal(test: &str, target: &str) -> bool { let test_package = &parser::parse(test).expect("Failed to parse input"); let test_doc = test_package.as_document(); @@ -1228,13 +1238,13 @@ mod tests { } #[test] - fn test_entities() { - // this forces initialization - set_rules_dir(super::super::abs_rules_dir_path()).unwrap(); + fn test_entities() -> Result<()> { + return interface_test(|| { + set_rules_dir(super::super::abs_rules_dir_path())?; - let entity_str = set_mathml("𝕞").unwrap(); + let entity_str = set_mathml("𝕞")?; let converted_str = - set_mathml("𝕞").unwrap(); + set_mathml("𝕞")?; // need to remove unique ids static ID_MATCH: LazyLock = LazyLock::new(|| Regex::new(r#"id='.+?' "#).unwrap()); @@ -1244,26 +1254,27 @@ mod tests { let entity_str = set_mathml( "XXX", - ) - .unwrap(); + )?; let converted_str = - set_mathml("XXX").unwrap(); + set_mathml("XXX")?; let entity_str = ID_MATCH.replace_all(&entity_str, ""); let converted_str = ID_MATCH.replace_all(&converted_str, ""); assert_eq!(entity_str, converted_str, "special entities quote test failed"); let entity_str = - set_mathml("<>&lt;").unwrap(); + set_mathml("<>&lt;")?; let converted_str = - set_mathml("<>&lt;") - .unwrap(); + set_mathml("<>&lt;")?; let entity_str = ID_MATCH.replace_all(&entity_str, ""); let converted_str = ID_MATCH.replace_all(&converted_str, ""); assert_eq!(entity_str, converted_str, "special entities <,>,& test failed"); + return Ok( () ); + }); } #[test] - fn can_recover_from_invalid_set_rules_dir() { + fn can_recover_from_invalid_set_rules_dir() -> Result<()> { + return interface_test(|| { use std::env; // MathCAT will check the env var "MathCATRulesDir" as an override, so the following test might succeed if we don't override the env var unsafe { env::set_var("MathCATRulesDir", "MathCATRulesDir"); } // safe because we are single threaded @@ -1274,6 +1285,8 @@ mod tests { super::super::abs_rules_dir_path() ); assert!(set_mathml("1").is_ok()); + return Ok( () ); + }); } #[test] @@ -1312,8 +1325,9 @@ mod tests { } #[test] - fn stack_overflow_protection() { - set_rules_dir(super::super::abs_rules_dir_path()).unwrap(); + fn stack_overflow_protection() -> Result<()> { + return interface_test(|| { + set_rules_dir(super::super::abs_rules_dir_path())?; let mut bad_mathml = String::from(""); for _ in 0..MAX_DEPTH+1 { bad_mathml.push_str("n"); @@ -1323,36 +1337,43 @@ mod tests { } bad_mathml.push_str(""); assert_eq!(set_mathml(bad_mathml).unwrap_err().to_string(), "MathML is too deeply nested to process"); + return Ok( () ); + }); } #[test] - fn old_mathml_cleared_on_error() { - set_rules_dir(super::super::abs_rules_dir_path()).unwrap(); + fn old_mathml_cleared_on_error() -> Result<()> { + return interface_test(|| { + set_rules_dir(super::super::abs_rules_dir_path())?; let good_mathml = "3"; - set_mathml(good_mathml).unwrap(); + set_mathml(good_mathml)?; let bad_mathml = "&xabc;"; assert!(set_mathml(bad_mathml).is_err()); - assert!(get_spoken_text().unwrap() == ""); - set_mathml(good_mathml).unwrap(); + assert!(get_spoken_text()? == ""); + set_mathml(good_mathml)?; let bad_mathml = "garbage"; assert!(set_mathml(bad_mathml).is_err()); - assert!(get_spoken_text().unwrap() == ""); + assert!(get_spoken_text()? == ""); + return Ok( () ); + }); } - fn setup_speech_ssml() { - set_rules_dir(super::super::abs_rules_dir_path()).unwrap(); - set_preference("Language", "en").unwrap(); - set_preference("TTS", "SSML").unwrap(); - set_preference("MathRate", "80").unwrap(); - set_preference("SpeechStyle", "SimpleSpeak").unwrap(); - set_preference("Verbosity", "Medium").unwrap(); + fn setup_speech_ssml() -> Result<()> { + set_rules_dir(super::super::abs_rules_dir_path())?; + set_preference("Language", "en")?; + set_preference("TTS", "SSML")?; + set_preference("MathRate", "80")?; + set_preference("SpeechStyle", "SimpleSpeak")?; + set_preference("Verbosity", "Medium")?; + return Ok( () ); } #[test] fn test_no_escaping() -> Result<()> { - setup_speech_ssml(); + return interface_test(|| { + setup_speech_ssml()?; let expr = " x+y @@ -1366,6 +1387,7 @@ mod tests { assert!(!speech.contains(">")); assert!(!speech.contains("&lt;")); return Ok(()); + }); } /// The attack payload must not pass through verbatim (rule-generated SSML may contain ` Result<()> { - setup_speech_ssml(); + return interface_test(|| { + setup_speech_ssml()?; // Entity-encoded payload: valid XML through set_mathml (no CDATA), decodes to PAYLOAD + "note". let mathml = format!( r#"{PAYLOAD_LEAF_XML}+ @@ -1410,14 +1433,16 @@ mod tests { assert_ssml_attack_neutralized(&speech, PAYLOAD); assert!(speech.contains("note") || speech.contains("<")); return Ok(()); + }); } #[test] /// Attribute values read via xpath must not inject SSML when TTS is SSML. fn attribute_ssml_attack_neutralized_in_speech() -> Result<()> { + return interface_test(|| { use crate::speech::{SpeechRulesWithContext, SPEECH_RULES}; - setup_speech_ssml(); + setup_speech_ssml()?; let mathml = format!( r#"x"# ); @@ -1446,5 +1471,6 @@ mod tests { Ok::<(), Error>(()) })?; return Ok(()); + }); } } diff --git a/src/navigate.rs b/src/navigate.rs index 1c08fde86..4a301de9e 100644 --- a/src/navigate.rs +++ b/src/navigate.rs @@ -998,42 +998,53 @@ mod tests { #[cfg(test)] /// Assert if result_id != '' and it doesn't match the id of the result of the move /// Returns the speech from the command - fn test_command(command: &'static str, mathml: Element, result_id: &str) -> String { + fn test_command(command: &'static str, mathml: Element, result_id: &str) -> Result { + use std::panic::{catch_unwind, AssertUnwindSafe}; + init_panic_handler(); + let result = catch_unwind(AssertUnwindSafe(|| { // debug!("\nCommand: {}", command); - NAVIGATION_STATE.with(|nav_stack| { - let (start_id, _) = nav_stack.borrow().get_navigation_mathml_id(mathml); - match do_navigate_command_string(mathml, command) { - Err(e) => { - panic!("\nStarting at '{}', '{} failed.\n{}", - start_id, command, &crate::interface::errors_to_string(&e)) - }, - Ok(nav_speech) => { - 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); - assert_eq!(result_id, id, "\nStarting at '{}', '{} failed.", start_id, command); + NAVIGATION_STATE.with(|nav_stack| { + let (start_id, _) = nav_stack.borrow().get_navigation_mathml_id(mathml); + match do_navigate_command_string(mathml, command) { + Err(e) => { + panic!("\nStarting at '{}', '{} failed.\n{}", + start_id, command, &crate::interface::errors_to_string(&e)) + }, + Ok(nav_speech) => { + 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); + assert_eq!(result_id, id, "\nStarting at '{}', '{} failed.", start_id, command); + } + return Ok(nav_speech.to_string()); } - return nav_speech.to_string(); - } - }; - }) - } - - fn init_default_prefs(mathml: &str, nav_mode_default: &str) { - init_prefs(mathml, nav_mode_default, "en"); - } - - fn init_prefs(mathml: &str, nav_mode_default: &str, language: &str) { - set_rules_dir(super::super::abs_rules_dir_path()).unwrap(); - set_preference("NavMode", nav_mode_default).unwrap(); - set_preference("NavVerbosity", "Verbose").unwrap(); - set_preference("AutoZoomOut", "True").unwrap(); - set_preference("Language", language).unwrap(); - set_preference("SpeechStyle", "SimpleSpeak").unwrap(); - set_preference("Verbosity", "Medium").unwrap(); - set_preference("Overview", "False").unwrap(); - set_mathml(mathml).unwrap(); + }; + }) + })); + return report_any_panic(result); + } + + fn init_default_prefs(mathml: &str, nav_mode_default: &str) -> Result<()> { + return init_prefs(mathml, nav_mode_default, "en"); + } + + fn init_prefs(mathml: &str, nav_mode_default: &str, language: &str) -> Result<()> { + use std::panic::{catch_unwind, AssertUnwindSafe}; + 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_mathml(mathml)?; + return Ok( () ); + })); + return report_any_panic(result); } #[test] @@ -1042,13 +1053,13 @@ mod tests { b2 d "; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomIn", mathml, "msup"); - test_command("ZoomIn", mathml, "base"); - test_command("ZoomIn", mathml, "base"); + test_command("ZoomIn", mathml, "msup")?; + test_command("ZoomIn", mathml, "base")?; + test_command("ZoomIn", mathml, "base")?; return Ok( () ); }); } @@ -1067,32 +1078,35 @@ mod tests { "; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; debug!("--- Enhanced ---"); - MATHML_INSTANCE.with(|package_instance| { + MATHML_INSTANCE.with(|package_instance| -> Result<()> { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomIn", mathml, "msup"); - test_command("MoveNext", mathml, "id-3"); - }); + test_command("ZoomIn", mathml, "msup")?; + test_command("MoveNext", mathml, "id-3")?; + return Ok( () ); + })?; - init_default_prefs(mathml_str, "Simple"); + init_default_prefs(mathml_str, "Simple")?; debug!("--- Simple ---"); - MATHML_INSTANCE.with(|package_instance: &RefCell| { + MATHML_INSTANCE.with(|package_instance: &RefCell| -> Result<()> { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomIn", mathml, "msup"); - test_command("MoveNext", mathml, "id-3"); - }); + test_command("ZoomIn", mathml, "msup")?; + test_command("MoveNext", mathml, "id-3")?; + return Ok( () ); + })?; - init_default_prefs(mathml_str, "Character"); + init_default_prefs(mathml_str, "Character")?; debug!("--- Character ---"); - MATHML_INSTANCE.with(|package_instance| { + MATHML_INSTANCE.with(|package_instance| -> Result<()> { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomIn", mathml, "base"); - test_command("MoveNext", mathml, "exp"); - }); + test_command("ZoomIn", mathml, "base")?; + test_command("MoveNext", mathml, "exp")?; + return Ok( () ); + })?; return Ok( () ); } @@ -1126,22 +1140,22 @@ mod tests { 1 "; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); set_preference("NavMode", "Enhanced")?; debug!("\n------EnhancedMode----------"); - test_command("ZoomIn", mathml, "id-2"); - test_command("ZoomIn", mathml, "id-5"); - test_command("ZoomIn", mathml, "id-6"); + test_command("ZoomIn", mathml, "id-2")?; + test_command("ZoomIn", mathml, "id-5")?; + test_command("ZoomIn", mathml, "id-6")?; // repeat, but this time with "Simple set_preference("NavMode", "Simple")?; debug!("\n------SimpleMode----------"); - test_command("ZoomOutAll", mathml, "id-1"); - test_command("ZoomIn", mathml, "id-4"); - test_command("ZoomIn", mathml, "id-4"); + test_command("ZoomOutAll", mathml, "id-1")?; + test_command("ZoomIn", mathml, "id-4")?; + test_command("ZoomIn", mathml, "id-4")?; return Ok( () ); }); } @@ -1152,11 +1166,11 @@ mod tests { b2 d "; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomInAll", mathml, "base"); + test_command("ZoomInAll", mathml, "base")?; return Ok( () ); }); } @@ -1167,23 +1181,23 @@ mod tests { b2 d "; - init_prefs(mathml_str, "Enhanced", "ru"); + init_prefs(mathml_str, "Enhanced", "ru")?; 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"); + let speech = test_command("ZoomIn", mathml, "msup")?; assert_eq!("переход внутрь; в числитель; бэ в квадрате", speech); - let speech = test_command("ZoomIn", mathml, "base"); + let speech = test_command("ZoomIn", mathml, "base")?; assert_eq!("переход внутрь; в основание; бэ", speech); - let speech = test_command("ZoomIn", mathml, "base"); + let speech = test_command("ZoomIn", mathml, "base")?; assert_eq!("достигнута максимальная детализация; бэ", speech); - let speech = test_command("ZoomOut", mathml, "msup"); + let speech = test_command("ZoomOut", mathml, "msup")?; assert_eq!("переход наружу; из основания; бэ в квадрате", speech); - let speech = test_command("ZoomInAll", mathml, "base"); + let speech = test_command("ZoomInAll", mathml, "base")?; assert_eq!("переход к максимальной детализации; в основание; бэ", speech); - let speech = test_command("ZoomOutAll", mathml, "mfrac"); + let speech = test_command("ZoomOutAll", mathml, "mfrac")?; assert_eq!("переход к выражению целиком; из основания; из числителя; дробь, числитель: бэ в квадрате, знаменатель: дэ, конец дроби", speech); - let speech = test_command("ZoomOutAll", mathml, "mfrac"); + let speech = test_command("ZoomOutAll", mathml, "mfrac")?; assert_eq!("выражение уже показано целиком; дробь, числитель: бэ в квадрате, знаменатель: дэ, конец дроби", speech); return Ok( () ); }); @@ -1196,7 +1210,7 @@ mod tests { b2 d "; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); @@ -1206,13 +1220,8 @@ mod tests { current_node_offset: 0 }, "None") }); - test_command("ZoomOut", mathml, "msup"); - - let _nav_speech = do_navigate_command_and_param(mathml, NavigationCommand::Zoom, NavigationParam::Previous)?; - NAVIGATION_STATE.with(|nav_stack| { - let (id, _) = nav_stack.borrow().get_navigation_mathml_id(mathml); - assert_eq!(id, "mfrac"); - }); + test_command("ZoomOut", mathml, "msup")?; + test_command("ZoomOut", mathml, "mfrac")?; return Ok( () ); }); } @@ -1223,7 +1232,7 @@ mod tests { b2 d "; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); @@ -1234,7 +1243,7 @@ mod tests { }, "None") }); - test_command("ZoomOutAll", mathml, "mfrac"); + test_command("ZoomOutAll", mathml, "mfrac")?; return Ok( () ); }); } @@ -1252,7 +1261,7 @@ mod tests { "; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); @@ -1264,16 +1273,16 @@ mod tests { }); set_preference("NavMode", "Character")?; - test_command("MoveStart", mathml, "id-2"); - test_command("MoveEnd", mathml, "id-7"); + test_command("MoveStart", mathml, "id-2")?; + test_command("MoveEnd", mathml, "id-7")?; set_preference("NavMode", "Simple")?; - test_command("MoveStart", mathml, "id-2"); - test_command("MoveEnd", mathml, "id-7"); + test_command("MoveStart", mathml, "id-2")?; + test_command("MoveEnd", mathml, "id-7")?; set_preference("NavMode", "Enhanced")?; - test_command("MoveStart", mathml, "id-2"); - test_command("MovePrevious", mathml, "id-2"); - test_command("MoveEnd", mathml, "id-4"); - test_command("MoveNext", mathml, "id-4"); + test_command("MoveStart", mathml, "id-2")?; + test_command("MovePrevious", mathml, "id-2")?; + test_command("MoveEnd", mathml, "id-4")?; + test_command("MoveNext", mathml, "id-4")?; return Ok( () ); }); } @@ -1293,7 +1302,7 @@ mod tests { "; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); @@ -1305,15 +1314,15 @@ mod tests { }); set_preference("NavMode", "Character")?; - test_command("MoveLineStart", mathml, "id-5"); - test_command("MoveLineEnd", mathml, "id-8"); + test_command("MoveLineStart", mathml, "id-5")?; + test_command("MoveLineEnd", mathml, "id-8")?; set_preference("NavMode", "Simple")?; - test_command("MoveLineStart", mathml, "id-4"); - test_command("MoveLineEnd", mathml, "id-8"); + test_command("MoveLineStart", mathml, "id-4")?; + test_command("MoveLineEnd", mathml, "id-8")?; set_preference("NavMode", "Enhanced")?; - test_command("MoveLineStart", mathml, "id-4"); - test_command("MoveLineEnd", mathml, "id-8"); - test_command("MoveEnd", mathml, "id-3"); + test_command("MoveLineStart", mathml, "id-4")?; + test_command("MoveLineEnd", mathml, "id-8")?; + test_command("MoveEnd", mathml, "id-3")?; return Ok( () ); }); } @@ -1324,7 +1333,7 @@ mod tests { b2 d "; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); @@ -1335,14 +1344,14 @@ mod tests { }, "None") }); - test_command("ZoomOutAll", mathml, "mfrac"); - test_command("ZoomOut", mathml, "mfrac"); - test_command("MoveLastLocation", mathml, "base"); // second zoom out should do nothing + test_command("ZoomOutAll", mathml, "mfrac")?; + test_command("ZoomOut", mathml, "mfrac")?; + test_command("MoveLastLocation", mathml, "base")?; // second zoom out should do nothing - test_command("ZoomOut", mathml, "msup"); - test_command("ZoomInAll", mathml, "base"); - test_command("ZoomIn", mathml, "base"); - test_command("MoveLastLocation", mathml, "msup"); // second zoom in should do nothing + test_command("ZoomOut", mathml, "msup")?; + test_command("ZoomInAll", mathml, "base")?; + test_command("ZoomIn", mathml, "base")?; + test_command("MoveLastLocation", mathml, "msup")?; // second zoom in should do nothing return Ok( () ); }); @@ -1354,7 +1363,7 @@ mod tests { b2! d "; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); @@ -1364,7 +1373,7 @@ mod tests { current_node_offset: 0 }, "None") }); - test_command("MoveLineStart", mathml, "denom"); + test_command("MoveLineStart", mathml, "denom")?; NAVIGATION_STATE.with(|nav_stack| { nav_stack.borrow_mut().push(NavigationPosition{ @@ -1372,13 +1381,8 @@ mod tests { current_node_offset: 0 }, "None") }); - test_command("MoveLineStart", mathml, "msup"); - - let _nav_speech = do_navigate_command_and_param(mathml, NavigationCommand::Move, NavigationParam::Start)?; - NAVIGATION_STATE.with(|nav_stack| { - let (id, _) = nav_stack.borrow().get_navigation_mathml_id(mathml); - assert_eq!(id, "num"); - }); + test_command("MoveLineStart", mathml, "msup")?; + test_command("MoveStart", mathml, "num")?; return Ok( () ); }); } @@ -1395,7 +1399,7 @@ mod tests { x "; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); @@ -1406,7 +1410,7 @@ mod tests { }, "None") }); set_preference("NavMode", "Enhanced")?; - test_command("MoveNext", mathml, "id-5"); + test_command("MoveNext", mathml, "id-5")?; // reset start and test Simple NAVIGATION_STATE.with(|nav_stack| { @@ -1416,7 +1420,7 @@ mod tests { }, "None") }); set_preference("NavMode", "Simple")?; - test_command("MoveNext", mathml, "id-5"); + test_command("MoveNext", mathml, "id-5")?; // reset start and test Character NAVIGATION_STATE.with(|nav_stack| { @@ -1426,8 +1430,8 @@ mod tests { }, "None") }); set_preference("NavMode", "Character")?; - test_command("MoveNext", mathml, "id-4"); - test_command("MoveNext", mathml, "id-5"); + test_command("MoveNext", mathml, "id-4")?; + test_command("MoveNext", mathml, "id-5")?; return Ok( () ); }); } @@ -1448,20 +1452,20 @@ mod tests { 4 "; - init_default_prefs(mathml_str, "Character"); + init_default_prefs(mathml_str, "Character")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - assert_eq!("zoomed in all of the way; 1", test_command("ZoomInAll", mathml, "id-2")); - assert_eq!("move right; plus", test_command("MoveNext", mathml, "id-3")); - assert_eq!("move right; in base; x", test_command("MoveNext", mathml, "id-5")); - assert_eq!("move right; in subscript; 2", test_command("MoveNext", mathml, "id-6")); - assert_eq!("move right; in superscript; 3", test_command("MoveNext", mathml, "id-7")); - assert_eq!("move right; out of superscript; plus", test_command("MoveNext", mathml, "id-8")); - assert_eq!("move left; in superscript; 3", test_command("MovePrevious", mathml, "id-7")); - assert_eq!("move left; in subscript; 2", test_command("MovePrevious", mathml, "id-6")); - assert_eq!("move left; in base; x", test_command("MovePrevious", mathml, "id-5")); - assert_eq!("move left; out of base; plus", test_command("MovePrevious", mathml, "id-3")); + assert_eq!("zoomed in all of the way; 1", test_command("ZoomInAll", mathml, "id-2")?); + assert_eq!("move right; plus", test_command("MoveNext", mathml, "id-3")?); + assert_eq!("move right; in base; x", test_command("MoveNext", mathml, "id-5")?); + assert_eq!("move right; in subscript; 2", test_command("MoveNext", mathml, "id-6")?); + assert_eq!("move right; in superscript; 3", test_command("MoveNext", mathml, "id-7")?); + assert_eq!("move right; out of superscript; plus", test_command("MoveNext", mathml, "id-8")?); + assert_eq!("move left; in superscript; 3", test_command("MovePrevious", mathml, "id-7")?); + assert_eq!("move left; in subscript; 2", test_command("MovePrevious", mathml, "id-6")?); + assert_eq!("move left; in base; x", test_command("MovePrevious", mathml, "id-5")?); + assert_eq!("move left; out of base; plus", test_command("MovePrevious", mathml, "id-3")?); return Ok( () ); }); @@ -1479,17 +1483,17 @@ mod tests { xa "; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - assert_eq!("zoom in; the log base 2", test_command("ZoomIn", mathml, "id-2")); - assert_eq!("zoom in; in base; 2", test_command("ZoomIn", mathml, "id-4")); - assert_eq!("zoomed in all of the way; 2", test_command("ZoomIn", mathml, "id-4")); + assert_eq!("zoom in; the log base 2", test_command("ZoomIn", mathml, "id-2")?); + assert_eq!("zoom in; in base; 2", test_command("ZoomIn", mathml, "id-4")?); + assert_eq!("zoomed in all of the way; 2", test_command("ZoomIn", mathml, "id-4")?); debug!("Now zooming out"); - assert_eq!("zoom out; out of base; the log base 2", test_command("ZoomOut", mathml, "id-2")); - assert_eq!("zoom out; the log base 2, of x", test_command("ZoomOut", mathml, "id-1")); - assert_eq!("zoomed out all of the way; the log base 2, of x", test_command("ZoomOut", mathml, "id-1")); + assert_eq!("zoom out; out of base; the log base 2", test_command("ZoomOut", mathml, "id-2")?); + assert_eq!("zoom out; the log base 2, of x", test_command("ZoomOut", mathml, "id-1")?); + assert_eq!("zoomed out all of the way; the log base 2, of x", test_command("ZoomOut", mathml, "id-1")?); return Ok( () ); }); } @@ -1507,19 +1511,19 @@ mod tests { x "; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - assert_eq!("zoom in; the log base 2, cubed", test_command("ZoomIn", mathml, "id-2")); - assert_eq!("zoom in; in base; the log base 2", test_command("ZoomIn", mathml, "id-2-log-base")); - assert_eq!("zoom in; in base; 2", test_command("ZoomIn", mathml, "id-4")); - assert_eq!("zoomed in all of the way; 2", test_command("ZoomIn", mathml, "id-4")); + assert_eq!("zoom in; the log base 2, cubed", test_command("ZoomIn", mathml, "id-2")?); + assert_eq!("zoom in; in base; the log base 2", test_command("ZoomIn", mathml, "id-2-log-base")?); + assert_eq!("zoom in; in base; 2", test_command("ZoomIn", mathml, "id-4")?); + assert_eq!("zoomed in all of the way; 2", test_command("ZoomIn", mathml, "id-4")?); debug!("Now zooming out"); - assert_eq!("zoom out; out of base; the log base 2", test_command("ZoomOut", mathml, "id-2-log-base")); - assert_eq!("zoom out; out of base; the log base 2, cubed", test_command("ZoomOut", mathml, "id-2")); - assert_eq!("zoom out; the log base 2, cubed of x", test_command("ZoomOut", mathml, "id-1")); - assert_eq!("zoomed out all of the way; the log base 2, cubed of x", test_command("ZoomOut", mathml, "id-1")); + assert_eq!("zoom out; out of base; the log base 2", test_command("ZoomOut", mathml, "id-2-log-base")?); + assert_eq!("zoom out; out of base; the log base 2, cubed", test_command("ZoomOut", mathml, "id-2")?); + assert_eq!("zoom out; the log base 2, cubed of x", test_command("ZoomOut", mathml, "id-1")?); + assert_eq!("zoomed out all of the way; the log base 2, cubed of x", test_command("ZoomOut", mathml, "id-1")?); return Ok( () ); }); } @@ -1528,31 +1532,31 @@ mod tests { fn zoom_msubsup() -> Result<()> { // msubsup is trickier because it creates an intent within an intent, so offsets need to be handled properly let mathml_str = "𝑥12"; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - set_preference("NavMode", "Enhanced").unwrap(); + set_preference("NavMode", "Enhanced")?; debug!("Enhanced mode"); do_commands(mathml)?; - set_preference("NavMode", "Simple").unwrap(); + set_preference("NavMode", "Simple")?; debug!("Simple mode"); do_commands(mathml)?; - set_preference("NavMode", "Character").unwrap(); + set_preference("NavMode", "Character")?; debug!("Character mode"); - assert_eq!("zoom in; in base; x", test_command("ZoomIn", mathml, "base")); - assert_eq!("zoom out; out of base; x sub 1 super 2 end super", test_command("ZoomOut", mathml, "msubsup")); + assert_eq!("zoom in; in base; x", test_command("ZoomIn", mathml, "base")?); + assert_eq!("zoom out; out of base; x sub 1 super 2 end super", test_command("ZoomOut", mathml, "msubsup")?); return Ok( () ); /// Enhanced and Simple mode should behave the same fn do_commands(mathml: Element) -> Result<()> { - assert_eq!("zoom in; in base; x sub 1", test_command("ZoomIn", mathml, "msubsup-indexed-by")); - assert_eq!("zoom in; in base; x", test_command("ZoomIn", mathml, "base")); - assert_eq!("zoomed in all of the way; x", test_command("ZoomIn", mathml, "base")); + assert_eq!("zoom in; in base; x sub 1", test_command("ZoomIn", mathml, "msubsup-indexed-by")?); + assert_eq!("zoom in; in base; x", test_command("ZoomIn", mathml, "base")?); + assert_eq!("zoomed in all of the way; x", test_command("ZoomIn", mathml, "base")?); debug!("Now zooming out"); - assert_eq!("zoom out; out of base; x sub 1", test_command("ZoomOut", mathml, "msubsup-indexed-by")); - assert_eq!("zoom out; out of base; x sub 1, squared", test_command("ZoomOut", mathml, "msubsup")); - assert_eq!("zoomed out all of the way; x sub 1, squared", test_command("ZoomOut", mathml, "msubsup")); + assert_eq!("zoom out; out of base; x sub 1", test_command("ZoomOut", mathml, "msubsup-indexed-by")?); + assert_eq!("zoom out; out of base; x sub 1, squared", test_command("ZoomOut", mathml, "msubsup")?); + assert_eq!("zoomed out all of the way; x sub 1, squared", test_command("ZoomOut", mathml, "msubsup")?); return Ok( () ); } }); @@ -1578,22 +1582,22 @@ mod tests { "; - init_default_prefs(mathml_str, "Character"); + init_default_prefs(mathml_str, "Character")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - assert_eq!("zoomed in all of the way; in base; open bracket", test_command("ZoomInAll", mathml, "id-3")); - assert_eq!("move right; in base; cap c o", test_command("MoveNext", mathml, "id-5")); - assert_eq!("move right; in subscript; 6", test_command("MoveNext", mathml, "id-6")); - assert_eq!("move right; out of subscript; close bracket", test_command("MoveNext", mathml, "id-8")); - assert_eq!("move right; in superscript; 3", test_command("MoveNext", mathml, "id-11")); - assert_eq!("move right; plus", test_command("MoveNext", mathml, "id-12")); - assert_eq!("cannot move right, end of math", test_command("MoveNext", mathml, "id-12")); - assert_eq!("move left; 3", test_command("MovePrevious", mathml, "id-11")); - assert_eq!("move left; in base; close bracket", test_command("MovePrevious", mathml, "id-8")); - assert_eq!("move left; in subscript; 6", test_command("MovePrevious", mathml, "id-6")); - assert_eq!("move left; in base; cap c o", test_command("MovePrevious", mathml, "id-5")); - assert_eq!("move left; out of base; open bracket", test_command("MovePrevious", mathml, "id-3")); + assert_eq!("zoomed in all of the way; in base; open bracket", test_command("ZoomInAll", mathml, "id-3")?); + assert_eq!("move right; in base; cap c o", test_command("MoveNext", mathml, "id-5")?); + assert_eq!("move right; in subscript; 6", test_command("MoveNext", mathml, "id-6")?); + assert_eq!("move right; out of subscript; close bracket", test_command("MoveNext", mathml, "id-8")?); + assert_eq!("move right; in superscript; 3", test_command("MoveNext", mathml, "id-11")?); + assert_eq!("move right; plus", test_command("MoveNext", mathml, "id-12")?); + assert_eq!("cannot move right, end of math", test_command("MoveNext", mathml, "id-12")?); + assert_eq!("move left; 3", test_command("MovePrevious", mathml, "id-11")?); + assert_eq!("move left; in base; close bracket", test_command("MovePrevious", mathml, "id-8")?); + assert_eq!("move left; in subscript; 6", test_command("MovePrevious", mathml, "id-6")?); + assert_eq!("move left; in base; cap c o", test_command("MovePrevious", mathml, "id-5")?); + assert_eq!("move left; out of base; open bracket", test_command("MovePrevious", mathml, "id-3")?); return Ok( () ); }); @@ -1623,20 +1627,20 @@ mod tests { "; - init_default_prefs(mathml_str, "Character"); + init_default_prefs(mathml_str, "Character")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomInAll", mathml, "id-2"); - test_command("MoveNext", mathml, "id-3"); - test_command("MoveNext", mathml, "id-6"); - test_command("MoveNext", mathml, "id-8"); - test_command("MoveNext", mathml, "id-9"); - test_command("MoveNext", mathml, "id-10"); - test_command("MoveNext", mathml, "id-11"); - test_command("MoveNext", mathml, "id-13"); - test_command("MoveNext", mathml, "id-15"); - test_command("MoveNext", mathml, "id-15"); + test_command("ZoomInAll", mathml, "id-2")?; + test_command("MoveNext", mathml, "id-3")?; + test_command("MoveNext", mathml, "id-6")?; + test_command("MoveNext", mathml, "id-8")?; + test_command("MoveNext", mathml, "id-9")?; + test_command("MoveNext", mathml, "id-10")?; + test_command("MoveNext", mathml, "id-11")?; + test_command("MoveNext", mathml, "id-13")?; + test_command("MoveNext", mathml, "id-15")?; + test_command("MoveNext", mathml, "id-15")?; return Ok( () ); }); @@ -1659,39 +1663,39 @@ mod tests { "; - init_default_prefs(mathml_str, "Character"); + init_default_prefs(mathml_str, "Character")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); debug!("Character mode"); do_commands(mathml)?; - set_preference("NavMode", "Simple").unwrap(); + set_preference("NavMode", "Simple")?; debug!("Simple mode"); - test_command("ZoomIn", mathml, "id-3"); // zooms to the first parenthesis + test_command("ZoomIn", mathml, "id-3")?; // zooms to the first parenthesis do_commands(mathml)?; - set_preference("NavMode", "Enhanced").unwrap(); + set_preference("NavMode", "Enhanced")?; debug!("Enhanced mode"); - test_command("ZoomIn", mathml, "id-4"); - test_command("MoveNext", mathml, "id-6"); - test_command("MoveNext", mathml, "id-9"); - test_command("MovePrevious", mathml, "id-6"); - test_command("MovePrevious", mathml, "id-4"); + test_command("ZoomIn", mathml, "id-4")?; + test_command("MoveNext", mathml, "id-6")?; + test_command("MoveNext", mathml, "id-9")?; + test_command("MovePrevious", mathml, "id-6")?; + test_command("MovePrevious", mathml, "id-4")?; return Ok( () ); }); /// Simple and Character mode should behave the same fn do_commands(mathml: Element) -> Result<()> { - test_command("ZoomIn", mathml, "id-3"); - test_command("MoveNext", mathml, "id-4"); - test_command("MoveNext", mathml, "id-5"); - test_command("MoveNext", mathml, "id-8"); - test_command("MoveNext", mathml, "id-9"); - test_command("MoveNext", mathml, "id-10"); - test_command("MovePrevious", mathml, "id-9"); - test_command("MovePrevious", mathml, "id-8"); - test_command("MovePrevious", mathml, "id-5"); - test_command("ZoomOutAll", mathml, "id-1"); + test_command("ZoomIn", mathml, "id-3")?; + test_command("MoveNext", mathml, "id-4")?; + test_command("MoveNext", mathml, "id-5")?; + test_command("MoveNext", mathml, "id-8")?; + test_command("MoveNext", mathml, "id-9")?; + test_command("MoveNext", mathml, "id-10")?; + test_command("MovePrevious", mathml, "id-9")?; + test_command("MovePrevious", mathml, "id-8")?; + test_command("MovePrevious", mathml, "id-5")?; + test_command("ZoomOutAll", mathml, "id-1")?; return Ok( () ); } } @@ -1709,17 +1713,17 @@ mod tests { "; - init_default_prefs(mathml_str, "Simple"); + init_default_prefs(mathml_str, "Simple")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); do_commands(mathml)?; - set_preference("NavMode", "Simple").unwrap(); + set_preference("NavMode", "Simple")?; do_commands(mathml)?; - set_preference("NavMode", "Enhanced").unwrap(); - test_command("ZoomIn", mathml, "id-2"); - test_command("MoveNext", mathml, "id-6"); - test_command("MovePrevious", mathml, "id-2"); + set_preference("NavMode", "Enhanced")?; + test_command("ZoomIn", mathml, "id-2")?; + test_command("MoveNext", mathml, "id-6")?; + test_command("MovePrevious", mathml, "id-2")?; return Ok( () ); }); @@ -1727,14 +1731,14 @@ mod tests { /// Simple and Character mode should behave the same fn do_commands(mathml: Element) -> Result<()> { - test_command("ZoomIn", mathml, "id-2"); - test_command("MoveNext", mathml, "id-5"); - test_command("MoveNext", mathml, "id-6"); - test_command("MoveNext", mathml, "id-7"); - test_command("MovePrevious", mathml, "id-6"); - test_command("MovePrevious", mathml, "id-5"); - test_command("MovePrevious", mathml, "id-2"); - test_command("ZoomOutAll", mathml, "id-1"); + test_command("ZoomIn", mathml, "id-2")?; + test_command("MoveNext", mathml, "id-5")?; + test_command("MoveNext", mathml, "id-6")?; + test_command("MoveNext", mathml, "id-7")?; + test_command("MovePrevious", mathml, "id-6")?; + test_command("MovePrevious", mathml, "id-5")?; + test_command("MovePrevious", mathml, "id-2")?; + test_command("ZoomOutAll", mathml, "id-1")?; return Ok( () ); } } @@ -1751,15 +1755,15 @@ mod tests { z "; - init_default_prefs(mathml_str, "Character"); + init_default_prefs(mathml_str, "Character")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomInAll", mathml, "id-3"); - assert_eq!("move right; in denominator; y", test_command("MoveNext", mathml, "id-4")); - assert_eq!("move right; out of denominator; z", test_command("MoveNext", mathml, "id-6")); - assert_eq!("move left; in denominator; y", test_command("MovePrevious", mathml, "id-4")); - assert_eq!("move left; in numerator; x", test_command("MovePrevious", mathml, "id-3")); + test_command("ZoomInAll", mathml, "id-3")?; + assert_eq!("move right; in denominator; y", test_command("MoveNext", mathml, "id-4")?); + assert_eq!("move right; out of denominator; z", test_command("MoveNext", mathml, "id-6")?); + assert_eq!("move left; in denominator; y", test_command("MovePrevious", mathml, "id-4")?); + assert_eq!("move left; in numerator; x", test_command("MovePrevious", mathml, "id-3")?); return Ok( () ); }); @@ -1777,18 +1781,18 @@ mod tests { z "; - init_prefs(mathml_str, "Character", "ru"); + init_prefs(mathml_str, "Character", "ru")?; 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"); + test_command("ZoomInAll", mathml, "id-3")?; + let speech = test_command("MoveNext", mathml, "id-4")?; assert_eq!("перемещение вправо; в знаменатель; игрек", speech); - let speech = test_command("MoveNext", mathml, "id-7"); + let speech = test_command("MoveNext", mathml, "id-7")?; assert_eq!("перемещение вправо; из знаменателя; в подкоренное выражение; зэт", speech); - let speech = test_command("MovePrevious", mathml, "id-4"); + let speech = test_command("MovePrevious", mathml, "id-4")?; assert_eq!("перемещение влево; из подкоренного выражения; в знаменатель; игрек", speech); - let speech = test_command("MovePrevious", mathml, "id-3"); + let speech = test_command("MovePrevious", mathml, "id-3")?; assert_eq!("перемещение влево; в числитель; икс", speech); return Ok( () ); }); @@ -1804,21 +1808,21 @@ mod tests { "; - init_default_prefs(mathml_str, "Character"); + init_default_prefs(mathml_str, "Character")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomInAll", mathml, "id-3"); - assert_eq!("zoomed in to first character; t", test_command("ZoomIn", mathml, "id-3")); - assert_eq!("move right; o", test_command("MoveNext", mathml, "id-3")); - assert_eq!("move right; p", test_command("MoveNext", mathml, "id-3")); - assert_eq!("move right; in denominator; αβγ", test_command("MoveNext", mathml, "id-4")); - assert_eq!("zoomed in to first character; alpha", test_command("ZoomIn", mathml, "id-4")); - assert_eq!("move right; beta", test_command("MoveNext", mathml, "id-4")); - assert_eq!("move right; gamma", test_command("MoveNext", mathml, "id-4")); - assert_eq!("cannot move right, end of math", test_command("MoveNext", mathml, "id-4")); - assert_eq!("move left; beta", test_command("MovePrevious", mathml, "id-4")); - assert_eq!("zoom out; αβγ", test_command("ZoomOut", mathml, "id-4")); + test_command("ZoomInAll", mathml, "id-3")?; + assert_eq!("zoomed in to first character; t", test_command("ZoomIn", mathml, "id-3")?); + assert_eq!("move right; o", test_command("MoveNext", mathml, "id-3")?); + assert_eq!("move right; p", test_command("MoveNext", mathml, "id-3")?); + assert_eq!("move right; in denominator; αβγ", test_command("MoveNext", mathml, "id-4")?); + assert_eq!("zoomed in to first character; alpha", test_command("ZoomIn", mathml, "id-4")?); + assert_eq!("move right; beta", test_command("MoveNext", mathml, "id-4")?); + assert_eq!("move right; gamma", test_command("MoveNext", mathml, "id-4")?); + assert_eq!("cannot move right, end of math", test_command("MoveNext", mathml, "id-4")?); + assert_eq!("move left; beta", test_command("MovePrevious", mathml, "id-4")?); + assert_eq!("zoom out; αβγ", test_command("ZoomOut", mathml, "id-4")?); return Ok( () ); }); @@ -1841,15 +1845,15 @@ mod tests { "; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomIn", mathml, "id-2"); - assert_eq!("move right; times", test_command("MoveNext", mathml, "id-3")); - assert_eq!("move right; 1 minus x", test_command("MoveNext", mathml, "id-6")); - assert_eq!("move left; times", test_command("MovePrevious", mathml, "id-3")); - assert_eq!("move left; 2", test_command("MovePrevious", mathml, "id-2")); + test_command("ZoomIn", mathml, "id-2")?; + assert_eq!("move right; times", test_command("MoveNext", mathml, "id-3")?); + assert_eq!("move right; 1 minus x", test_command("MoveNext", mathml, "id-6")?); + assert_eq!("move left; times", test_command("MovePrevious", mathml, "id-3")?); + assert_eq!("move left; 2", test_command("MovePrevious", mathml, "id-2")?); return Ok( () ); }); @@ -1872,16 +1876,16 @@ mod tests { "; - init_default_prefs(mathml_str, "Simple"); - set_preference("SpeechStyle", "ClearSpeak").unwrap(); + init_default_prefs(mathml_str, "Simple")?; + set_preference("SpeechStyle", "ClearSpeak")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomIn", mathml, "id-2"); - assert_eq!("move right; open paren", test_command("MoveNext", mathml, "id-5")); - assert_eq!("move right; 1", test_command("MoveNext", mathml, "id-7")); - assert_eq!("move left; open paren", test_command("MovePrevious", mathml, "id-5")); - assert_eq!("move left; 2", test_command("MovePrevious", mathml, "id-2")); + test_command("ZoomIn", mathml, "id-2")?; + assert_eq!("move right; open paren", test_command("MoveNext", mathml, "id-5")?); + assert_eq!("move right; 1", test_command("MoveNext", mathml, "id-7")?); + assert_eq!("move left; open paren", test_command("MovePrevious", mathml, "id-5")?); + assert_eq!("move left; 2", test_command("MovePrevious", mathml, "id-2")?); return Ok( () ); }); @@ -1944,26 +1948,26 @@ mod tests { "; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomInAll", mathml, "nav-4"); - test_command("MoveCellNext", mathml, "nav-6"); - test_command("MoveCellNext", mathml, "nav-8"); - test_command("MoveCellNext", mathml, "nav-8"); - test_command("MoveCellDown", mathml, "nav-20"); - test_command("MoveCellDown", mathml, "nav-27"); - let speech = test_command("MoveCellDown", mathml, "nav-39"); + test_command("ZoomInAll", mathml, "nav-4")?; + test_command("MoveCellNext", mathml, "nav-6")?; + test_command("MoveCellNext", mathml, "nav-8")?; + test_command("MoveCellNext", mathml, "nav-8")?; + test_command("MoveCellDown", mathml, "nav-20")?; + test_command("MoveCellDown", mathml, "nav-27")?; + let speech = test_command("MoveCellDown", mathml, "nav-39")?; assert_eq!(speech, "move down, row 4, column 3; 2 minus y"); - let speech = test_command("MoveCellDown", mathml, "nav-39"); + let speech = test_command("MoveCellDown", mathml, "nav-39")?; assert_eq!(speech, "no next row"); - test_command("MoveCellPrevious", mathml, "nav-35"); - test_command("ZoomIn", mathml, "nav-36"); - test_command("MoveCellUp", mathml, "nav-25"); - test_command("MoveCellUp", mathml, "nav-16"); - test_command("MoveCellUp", mathml, "nav-6"); - test_command("MoveCellUp", mathml, "nav-6"); + test_command("MoveCellPrevious", mathml, "nav-35")?; + test_command("ZoomIn", mathml, "nav-36")?; + test_command("MoveCellUp", mathml, "nav-25")?; + test_command("MoveCellUp", mathml, "nav-16")?; + test_command("MoveCellUp", mathml, "nav-6")?; + test_command("MoveCellUp", mathml, "nav-6")?; return Ok( () ); }); @@ -2025,7 +2029,7 @@ mod tests { "; - init_default_prefs(mathml_str, "Character"); + init_default_prefs(mathml_str, "Character")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); @@ -2035,23 +2039,23 @@ mod tests { current_node_offset: 0 }, "None") }); - test_command("MoveNext", mathml, "nav-12"); - test_command("MoveNext", mathml, "nav-13"); - test_command("MoveNext", mathml, "nav-14"); - test_command("MoveNext", mathml, "nav-17"); - test_command("MovePrevious", mathml, "nav-14"); - test_command("MoveCellNext", mathml, "nav-17"); - test_command("MoveCellPrevious", mathml, "nav-14"); - test_command("MovePrevious", mathml, "nav-13"); - test_command("MovePrevious", mathml, "nav-12"); - test_command("MoveCellPrevious", mathml, "nav-12"); - test_command("MovePrevious", mathml, "nav-8"); - test_command("MoveCellDown", mathml, "nav-20"); - test_command("MoveCellDown", mathml, "nav-27"); - test_command("MoveCellDown", mathml, "nav-40"); - test_command("MoveCellDown", mathml, "nav-40"); - test_command("MoveCellPrevious", mathml, "nav-37"); - test_command("MoveCellUp", mathml, "nav-25"); + test_command("MoveNext", mathml, "nav-12")?; + test_command("MoveNext", mathml, "nav-13")?; + test_command("MoveNext", mathml, "nav-14")?; + test_command("MoveNext", mathml, "nav-17")?; + test_command("MovePrevious", mathml, "nav-14")?; + test_command("MoveCellNext", mathml, "nav-17")?; + test_command("MoveCellPrevious", mathml, "nav-14")?; + test_command("MovePrevious", mathml, "nav-13")?; + test_command("MovePrevious", mathml, "nav-12")?; + test_command("MoveCellPrevious", mathml, "nav-12")?; + test_command("MovePrevious", mathml, "nav-8")?; + test_command("MoveCellDown", mathml, "nav-20")?; + test_command("MoveCellDown", mathml, "nav-27")?; + test_command("MoveCellDown", mathml, "nav-40")?; + test_command("MoveCellDown", mathml, "nav-40")?; + test_command("MoveCellPrevious", mathml, "nav-37")?; + test_command("MoveCellUp", mathml, "nav-25")?; return Ok( () ); }); @@ -2068,19 +2072,19 @@ mod tests { c "; - init_default_prefs(mathml_str, "Character"); + init_default_prefs(mathml_str, "Character")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("MoveStart", mathml, "a"); - test_command("SetPlacemarker0", mathml, "a"); - test_command("MoveEnd", mathml, "c"); - test_command("Read0", mathml, "c"); - test_command("Describe0", mathml, "c"); - test_command("SetPlacemarker1", mathml, "c"); - test_command("MoveTo0", mathml, "a"); - test_command("MoveTo1", mathml, "c"); - test_command("MoveLastLocation", mathml, "a"); + test_command("MoveStart", mathml, "a")?; + test_command("SetPlacemarker0", mathml, "a")?; + test_command("MoveEnd", mathml, "c")?; + test_command("Read0", mathml, "c")?; + test_command("Describe0", mathml, "c")?; + test_command("SetPlacemarker1", mathml, "c")?; + test_command("MoveTo0", mathml, "a")?; + test_command("MoveTo1", mathml, "c")?; + test_command("MoveLastLocation", mathml, "a")?; return Ok( () ); }); @@ -2092,8 +2096,8 @@ mod tests { b2 d "; - init_default_prefs(mathml_str, "Enhanced"); - set_preference("SpeechStyle", "ClearSpeak").unwrap(); + init_default_prefs(mathml_str, "Enhanced")?; + set_preference("SpeechStyle", "ClearSpeak")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); @@ -2104,7 +2108,7 @@ mod tests { }, "None") }); // WhereAmIAll doesn't change the stack - let speech =test_command("WhereAmIAll", mathml, "exp"); + let speech =test_command("WhereAmIAll", mathml, "exp")?; // should be 2 "inside" strings corresponding to steps to the root assert_eq!(speech, "2; inside; b squared; inside; the fraction with numerator; b squared; and denominator d"); return Ok( () ); @@ -2130,16 +2134,16 @@ mod tests { 10 "; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; set_preference("AutoZoomOut", "False")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomInAll", mathml, "2"); - test_command("MoveNext", mathml, "a"); - test_command("MoveNext", mathml, "x"); - test_command("MoveNext", mathml, "plus"); - test_command("MovePrevious", mathml, "2ax"); + test_command("ZoomInAll", mathml, "2")?; + test_command("MoveNext", mathml, "a")?; + test_command("MoveNext", mathml, "x")?; + test_command("MoveNext", mathml, "plus")?; + test_command("MovePrevious", mathml, "2ax")?; return Ok( () ); }); } @@ -2156,19 +2160,19 @@ mod tests { 3 "; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; set_preference("AutoZoomOut", "False")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomIn", mathml, "frac"); - test_command("ZoomIn", mathml, "num"); - test_command("MoveNext", mathml, "denom"); - test_command("MoveNext", mathml, "denom"); - test_command("MovePrevious", mathml, "num"); - test_command("MovePrevious", mathml, "num"); - test_command("ZoomOut", mathml, "frac"); - test_command("MoveNext", mathml, "minus"); + test_command("ZoomIn", mathml, "frac")?; + test_command("ZoomIn", mathml, "num")?; + test_command("MoveNext", mathml, "denom")?; + test_command("MoveNext", mathml, "denom")?; + test_command("MovePrevious", mathml, "num")?; + test_command("MovePrevious", mathml, "num")?; + test_command("ZoomOut", mathml, "frac")?; + test_command("MoveNext", mathml, "minus")?; return Ok( () ); }); } @@ -2194,43 +2198,43 @@ mod tests { return Ok( () ); fn test_mode(mathml_str: &str, mode: &str) -> Result<()> { - init_default_prefs(mathml_str, mode); + init_default_prefs(mathml_str, mode)?; set_preference("AutoZoomOut", "False")?; return MATHML_INSTANCE.with(|package_instance| { debug!("--- Testing mode {mode} ---"); let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomIn", mathml, "id-9"); + test_command("ZoomIn", mathml, "id-9")?; debug!("\nStart zoom in"); match mode { "Enhanced" => { - test_command("MoveNext", mathml, "id-10"); - let speech = test_command("ZoomIn", mathml, "id-11"); + test_command("MoveNext", mathml, "id-10")?; + let speech = test_command("ZoomIn", mathml, "id-11")?; assert_eq!(speech, "zoom in; in root; b squared minus 4"); // only one arg, so don't say "in root" - let speech = test_command("ZoomIn", mathml, "id-12"); + let speech = test_command("ZoomIn", mathml, "id-12")?; assert_eq!(speech, "zoom in; b squared"); // only one arg, so don't say "in root" - let speech = test_command("ZoomIn", mathml, "id-13"); + let speech = test_command("ZoomIn", mathml, "id-13")?; assert_eq!(speech, "zoom in; in base; b"); }, "Simple" => { - test_command("MoveNext", mathml, "id-10"); - let speech = test_command("ZoomIn", mathml, "id-12"); + test_command("MoveNext", mathml, "id-10")?; + let speech = test_command("ZoomIn", mathml, "id-12")?; assert_eq!(speech, "zoom in; in root; b squared"); - let speech = test_command("ZoomIn", mathml, "id-13"); + let speech = test_command("ZoomIn", mathml, "id-13")?; assert_eq!(speech, "zoom in; in base; b"); }, _ => { // "Character" - let speech = test_command("MoveNext", mathml, "id-13"); + let speech = test_command("MoveNext", mathml, "id-13")?; assert_eq!(speech, "move right; in root; in base; b"); } } let squared_speech = if mode == "Character" {"b super 2 end super"} else {"b squared"}; let sqrt_speech = if mode == "Character" {"root"} else {"square root"}; - let speech = test_command("ZoomOut", mathml, "id-12"); + let speech = test_command("ZoomOut", mathml, "id-12")?; assert_eq!(speech, format!("zoom out; out of base; {squared_speech}")); - let speech = test_command("ZoomOut", mathml, "id-11"); + let speech = test_command("ZoomOut", mathml, "id-11")?; assert_eq!(speech, format!("zoom out; {squared_speech} minus 4")); - let speech = test_command("ZoomOut", mathml, "id-10"); + let speech = test_command("ZoomOut", mathml, "id-10")?; assert_eq!(speech, format!("zoom out; out of root; the {sqrt_speech} of {squared_speech} minus 4, end root",)); return Ok( () ); }); @@ -2255,18 +2259,18 @@ mod tests { ] "#; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomIn", mathml, "row-1"); - let speech = test_command("MoveNext", mathml, "row-2"); + test_command("ZoomIn", mathml, "row-1")?; + let speech = test_command("MoveNext", mathml, "row-2")?; assert_eq!(speech, "move right; row 2; 5, negative 6"); - let speech = test_command("ZoomIn", mathml, "id-13"); + let speech = test_command("ZoomIn", mathml, "id-13")?; assert_eq!(speech, "zoom in; column 1; 5"); - let speech = test_command("ZoomOut", mathml, "row-2"); + let speech = test_command("ZoomOut", mathml, "row-2")?; assert_eq!(speech, "zoom out; row 2; 5, negative 6"); - let speech = test_command("ZoomOut", mathml, "table"); + let speech = test_command("ZoomOut", mathml, "table")?; assert_eq!(speech, "zoom out; the 2 by 2 matrix; row 1; 9, negative 13; row 2; 5, negative 6"); return Ok( () ); }); @@ -2290,12 +2294,12 @@ mod tests { "; - init_default_prefs(mathml_str, "Enhanced"); + init_default_prefs(mathml_str, "Enhanced")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomIn", mathml, "id-2"); - let speech = test_command("MoveNext", mathml, "id-6"); + test_command("ZoomIn", mathml, "id-2")?; + let speech = test_command("MoveNext", mathml, "id-6")?; // tables need to check their parent for proper speech assert_eq!(speech, "move right; cap s"); return Ok( () ); @@ -2320,22 +2324,22 @@ mod tests { | "; - init_default_prefs(mathml_str, "Enhanced"); - set_preference("SpeechStyle", "ClearSpeak").unwrap(); + init_default_prefs(mathml_str, "Enhanced")?; + set_preference("SpeechStyle", "ClearSpeak")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - let speech = test_command("ZoomIn", mathml, "row-1"); + let speech = test_command("ZoomIn", mathml, "row-1")?; assert_eq!(speech, "zoom in; row 1; 9, negative 13"); - let speech = test_command("MoveNext", mathml, "row-2"); + let speech = test_command("MoveNext", mathml, "row-2")?; assert_eq!(speech, "move right; row 2; 5, negative 6"); - let speech = test_command("MoveNext", mathml, "row-2"); + let speech = test_command("MoveNext", mathml, "row-2")?; assert_eq!(speech, "cannot move right, end of math"); - let speech = test_command("ZoomIn", mathml, "id-13"); + let speech = test_command("ZoomIn", mathml, "id-13")?; assert_eq!(speech, "zoom in; column 1; 5"); - let speech = test_command("MoveNext", mathml, "row2-negative"); + let speech = test_command("MoveNext", mathml, "row2-negative")?; assert_eq!(speech, "move right; column 2, negative 6"); - let speech = test_command("ZoomOutAll", mathml, "table"); + let speech = test_command("ZoomOutAll", mathml, "table")?; assert_eq!(speech, "zoomed out all of the way; the 2 by 2 determinant; row 1; 9, negative 13; row 2; 5, negative 6"); return Ok( () ); }); @@ -2358,22 +2362,22 @@ mod tests { "; - init_default_prefs(mathml_str, "Enhanced"); - set_preference("SpeechStyle", "ClearSpeak").unwrap(); + init_default_prefs(mathml_str, "Enhanced")?; + set_preference("SpeechStyle", "ClearSpeak")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomIn", mathml, "row-1"); - let speech = test_command("MovePrevious", mathml, "row-1"); + test_command("ZoomIn", mathml, "row-1")?; + let speech = test_command("MovePrevious", mathml, "row-1")?; assert_eq!(speech, "move left; start of math"); - let speech = test_command("MoveNext", mathml, "row-2"); + let speech = test_command("MoveNext", mathml, "row-2")?; assert_eq!(speech, "move right; case 2; positive x comma; if x, is greater than or equal to 0"); - let speech = test_command("ZoomOut", mathml, "table"); + let speech = test_command("ZoomOut", mathml, "table")?; assert_eq!(speech, "zoom out; 2 cases; case 1; negative x comma; if x is less than 0; case 2; positive x comma; if x, is greater than or equal to 0"); - let speech = test_command("ZoomIn", mathml, "row-1"); + let speech = test_command("ZoomIn", mathml, "row-1")?; assert_eq!(speech, "zoom in; case 1; negative x comma; if x is less than 0"); - set_preference("NavMode", "Character").unwrap(); - let speech = test_command("MovePrevious", mathml, "open"); + set_preference("NavMode", "Character")?; + let speech = test_command("MovePrevious", mathml, "open")?; assert_eq!(speech, "move left; open brace"); return Ok( () ); }); @@ -2396,14 +2400,14 @@ mod tests { 2 "; - init_default_prefs(mathml_str, "Enhanced"); - set_preference("SpeechStyle", "ClearSpeak").unwrap(); + init_default_prefs(mathml_str, "Enhanced")?; + set_preference("SpeechStyle", "ClearSpeak")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - let speech = test_command("ZoomIn", mathml, "id-4"); + let speech = test_command("ZoomIn", mathml, "id-4")?; assert_eq!(speech, "zoom in; in base; 2 x"); - let speech = test_command("MoveNext", mathml, "id-9"); + let speech = test_command("MoveNext", mathml, "id-9")?; assert_eq!(speech, "move right; in exponent; 2"); return Ok( () ); }); @@ -2421,45 +2425,45 @@ mod tests { ) "; - init_default_prefs(mathml_str, "Character"); - set_preference("SpeechStyle", "ClearSpeak").unwrap(); + init_default_prefs(mathml_str, "Character")?; + set_preference("SpeechStyle", "ClearSpeak")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); debug!("Character mode"); - let speech = test_command("MoveStart", mathml, "id-2"); + let speech = test_command("MoveStart", mathml, "id-2")?; assert_eq!(speech, "move to start of math; open paren"); - let speech = test_command("MoveNext", mathml, "id-4"); + let speech = test_command("MoveNext", mathml, "id-4")?; // I'm not keen on the use of numerator/denominator here, but character mode turns off intent assert_eq!(speech, "move right; in numerator; n"); - let speech = test_command("MoveNext", mathml, "id-5"); + let speech = test_command("MoveNext", mathml, "id-5")?; assert_eq!(speech, "move right; in denominator; k"); debug!("before zoom out"); - let speech = test_command("ZoomOut", mathml, "id-3"); + let speech = test_command("ZoomOut", mathml, "id-3")?; assert_eq!(speech, "zoom out; out of denominator; n over k"); - // let speech = test_command("ZoomOut", mathml, "id-1"); + // let speech = test_command("ZoomOut", mathml, "id-1")?; // assert_eq!(speech, "zoom out; open paren n over k, close paren"); - set_preference("NavMode", "Simple").unwrap(); + set_preference("NavMode", "Simple")?; debug!("Simple mode"); - let speech = test_command("ZoomIn", mathml, "id-4"); + let speech = test_command("ZoomIn", mathml, "id-4")?; assert_eq!(speech, "zoom in; in part 1; n"); - let speech = test_command("MoveNext", mathml, "id-5"); + let speech = test_command("MoveNext", mathml, "id-5")?; assert_eq!(speech, "move right; in part 2; k"); - let speech = test_command("MoveNext", mathml, "id-5"); + let speech = test_command("MoveNext", mathml, "id-5")?; assert_eq!(speech, "cannot move right, end of math"); - let speech = test_command("ZoomOut", mathml, "id-1-literal-0"); + let speech = test_command("ZoomOut", mathml, "id-1-literal-0")?; assert_eq!(speech, "zoom out; out of part 2; n choose k"); - set_preference("NavMode", "Enhanced").unwrap(); + set_preference("NavMode", "Enhanced")?; debug!("Enhanced mode"); - let speech = test_command("ZoomIn", mathml, "id-4"); + let speech = test_command("ZoomIn", mathml, "id-4")?; assert_eq!(speech, "zoom in; in part 1; n"); - let speech = test_command("MoveNext", mathml, "id-5"); + let speech = test_command("MoveNext", mathml, "id-5")?; assert_eq!(speech, "move right; in part 2; k"); - let speech = test_command("MoveNext", mathml, "id-5"); + let speech = test_command("MoveNext", mathml, "id-5")?; assert_eq!(speech, "cannot move right, end of math"); - let speech = test_command("ZoomOut", mathml, "id-1-literal-0"); + let speech = test_command("ZoomOut", mathml, "id-1-literal-0")?; assert_eq!(speech, "zoom out; out of part 2; n choose k"); return Ok( () ); @@ -2491,19 +2495,19 @@ mod tests { ) "#; - init_default_prefs(mathml_str, "Simple"); + init_default_prefs(mathml_str, "Simple")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - let speech = test_command("ZoomIn", mathml, "id-3-literal-1"); + let speech = test_command("ZoomIn", mathml, "id-3-literal-1")?; assert_eq!(speech, "zoom in; 1"); - let speech = test_command("MoveNext", mathml, "id-3-literal-2"); + let speech = test_command("MoveNext", mathml, "id-3-literal-2")?; assert_eq!(speech, "move right; 2"); - let speech = test_command("MoveNext", mathml, "id-3-literal-3"); + let speech = test_command("MoveNext", mathml, "id-3-literal-3")?; assert_eq!(speech, "move right; 3"); - let speech = test_command("MoveNext", mathml, "id-3-literal-3"); + let speech = test_command("MoveNext", mathml, "id-3-literal-3")?; assert_eq!(speech, "cannot move right, end of math"); - let speech = test_command("ZoomOut", mathml, "id-3-literal-0"); + let speech = test_command("ZoomOut", mathml, "id-3-literal-0")?; assert_eq!(speech, "zoom out; diagonal 1 2 3"); return Ok( () ); @@ -2522,25 +2526,25 @@ mod tests { "; - init_default_prefs(mathml_str, "Enhanced"); - set_preference("SpeechStyle", "ClearSpeak").unwrap(); + init_default_prefs(mathml_str, "Enhanced")?; + set_preference("SpeechStyle", "ClearSpeak")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - let speech = test_command("ZoomIn", mathml, "2"); + let speech = test_command("ZoomIn", mathml, "2")?; assert_eq!(speech, "zoom in; 2"); - let speech = test_command("MoveNext", mathml, "abs"); + let speech = test_command("MoveNext", mathml, "abs")?; assert_eq!(speech, "move right; the absolute value of x"); - let speech = test_command("ZoomIn", mathml, "x"); + let speech = test_command("ZoomIn", mathml, "x")?; assert_eq!(speech, "zoom in; in absolute value; x"); - let speech = test_command("MoveNext", mathml, "x"); + let speech = test_command("MoveNext", mathml, "x")?; assert_eq!(speech, "cannot move right, end of math"); - set_preference("NavMode", "Character").unwrap(); - let speech = test_command("MoveNext", mathml, "end"); + set_preference("NavMode", "Character")?; + let speech = test_command("MoveNext", mathml, "end")?; assert_eq!(speech, "move right; vertical line"); - let speech = test_command("MoveLineStart", mathml, "2"); + let speech = test_command("MoveLineStart", mathml, "2")?; assert_eq!(speech, "move to start of line; 2"); - let speech = test_command("MoveNext", mathml, "start"); + let speech = test_command("MoveNext", mathml, "start")?; assert_eq!(speech, "move right; vertical line"); return Ok( () ); }); @@ -2558,15 +2562,15 @@ mod tests { 3 "; - init_default_prefs(mathml_str, "Enhanced"); - set_preference("SpeechStyle", "SimpleSpeak").unwrap(); + init_default_prefs(mathml_str, "Enhanced")?; + set_preference("SpeechStyle", "SimpleSpeak")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomIn", mathml, "frac"); - let speech = test_command("ReadCurrent", mathml, "frac"); + test_command("ZoomIn", mathml, "frac")?; + let speech = test_command("ReadCurrent", mathml, "frac")?; assert_eq!(speech, "read current; fraction, b plus 1, over 3, end fraction"); - let speech = test_command("DescribeCurrent", mathml, "frac"); + let speech = test_command("DescribeCurrent", mathml, "frac")?; assert_eq!(speech, "describe current; fraction"); return Ok( () ); }); @@ -2593,21 +2597,14 @@ mod tests { "; - init_prefs(mathml_str, "Enhanced", "ru"); + init_prefs(mathml_str, "Enhanced", "ru")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - let speech = test_command("ZoomIn", mathml, ""); + let speech = test_command("ZoomIn", mathml, "")?; assert_eq!("переход внутрь; в числитель; икс плюс, квадратный корень из 1 разделить на игрек, конец корня", speech); - match do_navigate_command_string(mathml, "DescribeCurrent") { - Ok(speech) => { - let speech = speech.trim_end_matches(&[' ', ',', ';']).to_string(); - assert_eq!("описать текущее; икс плюс, квадратный корень из 1 разделить на игрек", speech); - }, - Err(e) => { - panic!("DescribeCurrent failed: {}", crate::interface::errors_to_string(&e)); - }, - }; + let speech = test_command("DescribeCurrent", mathml, "")?; + assert_eq!("описать текущее; икс плюс, квадратный корень из 1 разделить на игрек", speech); return Ok( () ); }); } @@ -2626,16 +2623,16 @@ mod tests { 7 "; - init_default_prefs(mathml_str, "Enhanced"); - set_preference("SpeechStyle", "SimpleSpeak").unwrap(); + init_default_prefs(mathml_str, "Enhanced")?; + set_preference("SpeechStyle", "SimpleSpeak")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - let speech = test_command("ZoomOutAll", mathml, "mrow"); + let speech = test_command("ZoomOutAll", mathml, "mrow")?; assert_eq!(speech, "zoomed out all of the way; 1 plus 2 plus 3 plus 4 plus 5 plus 6 plus 7"); - let speech = test_command("ReadCurrent", mathml, "mrow"); + let speech = test_command("ReadCurrent", mathml, "mrow")?; assert_eq!(speech, "read current; 1 plus 2 plus 3 plus 4 plus 5 plus 6 plus 7"); - let speech = test_command("DescribeCurrent", mathml, "mrow"); + let speech = test_command("DescribeCurrent", mathml, "mrow")?; assert_eq!(speech, "describe current; 1 plus 2 plus 3 and so on"); return Ok( () ); }); @@ -2651,16 +2648,16 @@ mod tests { y "; - init_default_prefs(mathml_str, "Simple"); - set_preference("SpeechStyle", "SimpleSpeak").unwrap(); + init_default_prefs(mathml_str, "Simple")?; + set_preference("SpeechStyle", "SimpleSpeak")?; return MATHML_INSTANCE.with(|package_instance| { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - let speech = test_command("ZoomIn", mathml, "id-2"); + let speech = test_command("ZoomIn", mathml, "id-2")?; assert_eq!(speech, "zoom in; x"); - let speech = test_command("ToggleZoomLockUp", mathml, "id-2"); + let speech = test_command("ToggleZoomLockUp", mathml, "id-2")?; assert_eq!(speech, "enhanced mode; x"); - let speech = test_command("ReadNext", mathml, "id-2"); + let speech = test_command("ReadNext", mathml, "id-2")?; assert_eq!(speech, "read right; y"); return Ok( () ); }); @@ -2690,63 +2687,68 @@ mod tests { "; - set_rules_dir(super::super::abs_rules_dir_path()).unwrap(); + set_rules_dir(super::super::abs_rules_dir_path())?; for lang in get_supported_languages().unwrap_or_default() { - test_language(&lang, mathml_str); + test_language(&lang, mathml_str)?; } return Ok( () ); - fn test_language(lang: &str, mathml_str: &str) { - init_default_prefs(mathml_str, "Enhanced"); - set_preference("Language", lang).unwrap(); + fn test_language(lang: &str, mathml_str: &str) -> Result<()> { + init_default_prefs(mathml_str, "Enhanced")?; + set_preference("Language", lang)?; - set_preference("NavMode", "Enhanced").unwrap(); - MATHML_INSTANCE.with(|package_instance| { + set_preference("NavMode", "Enhanced")?; + MATHML_INSTANCE.with(|package_instance| -> Result<()> { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomInAll", mathml, "2"); - test_command("MoveNext", mathml, "msup"); - test_command("MoveNext", mathml, "plus"); - test_command("MovePrevious", mathml, "term"); - test_command("MovePrevious", mathml, "term"); - test_command("ZoomOutAll", mathml, "contents"); - }); + test_command("ZoomInAll", mathml, "2")?; + test_command("MoveNext", mathml, "msup")?; + test_command("MoveNext", mathml, "plus")?; + test_command("MovePrevious", mathml, "term")?; + test_command("MovePrevious", mathml, "term")?; + test_command("ZoomOutAll", mathml, "contents")?; + return Ok( () ); + })?; - set_preference("NavMode", "Simple").unwrap(); - MATHML_INSTANCE.with(|package_instance: &RefCell| { + set_preference("NavMode", "Simple")?; + MATHML_INSTANCE.with(|package_instance: &RefCell| -> Result<()> { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomInAll", mathml, "2"); - test_command("MoveNext", mathml, "msup"); - test_command("MoveNext", mathml, "plus"); - test_command("MovePrevious", mathml, "msup"); - test_command("MovePrevious", mathml, "2"); - test_command("MovePrevious", mathml, "2"); - test_command("ZoomOutAll", mathml, "contents"); - }); + test_command("ZoomInAll", mathml, "2")?; + test_command("MoveNext", mathml, "msup")?; + test_command("MoveNext", mathml, "plus")?; + test_command("MovePrevious", mathml, "msup")?; + test_command("MovePrevious", mathml, "2")?; + test_command("MovePrevious", mathml, "2")?; + test_command("ZoomOutAll", mathml, "contents")?; + return Ok( () ); + })?; - set_preference("NavMode", "Character").unwrap(); - MATHML_INSTANCE.with(|package_instance| { + set_preference("NavMode", "Character")?; + MATHML_INSTANCE.with(|package_instance| -> Result<()> { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomIn", mathml, "2"); - test_command("MoveNext", mathml, "x"); - test_command("MoveNext", mathml, "3"); - test_command("MoveNext", mathml, "plus"); - test_command("MovePrevious", mathml, "3"); - test_command("MovePrevious", mathml, "x"); - test_command("MovePrevious", mathml, "2"); - test_command("MovePrevious", mathml, "2"); - }); + test_command("ZoomIn", mathml, "2")?; + test_command("MoveNext", mathml, "x")?; + test_command("MoveNext", mathml, "3")?; + test_command("MoveNext", mathml, "plus")?; + test_command("MovePrevious", mathml, "3")?; + test_command("MovePrevious", mathml, "x")?; + test_command("MovePrevious", mathml, "2")?; + test_command("MovePrevious", mathml, "2")?; + return Ok( () ); + })?; // simple sanity check that "overview.yaml" doesn't have a syntax error - set_preference("Overview", "True").unwrap(); - set_preference("NavMode", "Character").unwrap(); - MATHML_INSTANCE.with(|package_instance| { + set_preference("Overview", "True")?; + set_preference("NavMode", "Character")?; + MATHML_INSTANCE.with(|package_instance| -> Result<()> { let package_instance = package_instance.borrow(); let mathml = get_element(&package_instance); - test_command("ZoomIn", mathml, "2"); - }); + test_command("ZoomIn", mathml, "2")?; + return Ok( () ); + })?; + return Ok( () ); } } } diff --git a/src/speech.rs b/src/speech.rs index e2b42bead..43743a16c 100644 --- a/src/speech.rs +++ b/src/speech.rs @@ -945,7 +945,7 @@ impl ReplacementArray { let after = if i+1 == replacement_strings.len() {""} else {&replacement_strings[i+1]}; replacement_strings[i] = replacement_strings[i].replace( PAUSE_AUTO_STR, - &rules_with_context.speech_rules.pref_manager.borrow().get_tts().compute_auto_pause(&rules_with_context.speech_rules.pref_manager.borrow(), before, after)); + &rules_with_context.speech_rules.pref_manager.borrow().get_tts().compute_auto_pause(&rules_with_context.speech_rules.pref_manager.borrow(), before, after)?); } } @@ -2825,7 +2825,7 @@ impl<'c, 's:'c, 'r, 'm:'c> SpeechRulesWithContext<'c, 's,'m> { let unicode_full = rules.unicode_full.borrow(); for ch in unicode.keys() { if unicode_full.get(ch).is_some() { - error!("*** Character '{}' (0x{:X}) is repeated in both short and full unicode tables", char::from_u32(*ch).unwrap(), *ch as u32); + error!("*** Character '{}' (0x{:X}) is repeated in both short and full unicode tables", *ch, *ch); } } } diff --git a/src/tts.rs b/src/tts.rs index 0144a17dd..a6a3c4b5b 100644 --- a/src/tts.rs +++ b/src/tts.rs @@ -196,26 +196,25 @@ pub enum TTSCommandValue { } impl TTSCommandValue { - fn get_num(&self) -> f64 { + fn get_num(&self) -> Result { match self { - TTSCommandValue::Number(n) => return *n, - _ => panic!("Internal error: TTSCommandValue is not a number"), + TTSCommandValue::Number(n) => Ok(*n), + _ => bail!("Internal error: TTSCommandValue is not a number"), } } - fn get_string(&self) -> &String { + fn get_string(&self) -> Result<&String> { match self { - TTSCommandValue::String(s) => return s, - _ => panic!("Internal error: TTSCommandValue is not a string"), + TTSCommandValue::String(s) => Ok(s), + _ => bail!("Internal error: TTSCommandValue is not a string"), } } - fn get_pronounce(&self) -> &Pronounce { + fn get_pronounce(&self) -> Result<&Pronounce> { match self { - TTSCommandValue::Pronounce(p) => return p, - _ => panic!("Internal error: TTSCommandValue is not a 'pronounce' command'"), + TTSCommandValue::Pronounce(p) => Ok(p), + _ => bail!("Internal error: TTSCommandValue is not a 'pronounce' command"), } - } } @@ -456,16 +455,16 @@ impl TTS { // small optimization to avoid generating tags that do nothing - if ((command.command == TTSCommand::Pitch || command.command == TTSCommand::Volume || command.command == TTSCommand::Pause) && command.value.get_num() == 0.0) || - (command.command == TTSCommand::Rate && command.value.get_num() == 100.0) { + if ((command.command == TTSCommand::Pitch || command.command == TTSCommand::Volume || command.command == TTSCommand::Pause) && command.value.get_num()? == 0.0) || + (command.command == TTSCommand::Rate && command.value.get_num()? == 100.0) { return command.replacements.replace::(rules_with_context, mathml); } let mut result = String::with_capacity(255); result += &match self { - TTS::None => self.get_string_none(&command, prefs, true), - TTS::SSML => self.get_string_ssml(&command, prefs, true), - TTS::SAPI5 => self.get_string_sapi5(&command, prefs, true), + TTS::None => self.get_string_none(&command, prefs, true)?, + TTS::SSML => self.get_string_ssml(&command, prefs, true)?, + TTS::SAPI5 => self.get_string_sapi5(&command, prefs, true)?, }; @@ -478,9 +477,9 @@ impl TTS { } let end_tag = match self { - TTS::None => self.get_string_none(&command, prefs, false), - TTS::SSML => self.get_string_ssml(&command, prefs, false), - TTS::SAPI5 => self.get_string_sapi5(&command, prefs, false), + TTS::None => self.get_string_none(&command, prefs, false)?, + TTS::SSML => self.get_string_ssml(&command, prefs, false)?, + TTS::SAPI5 => self.get_string_sapi5(&command, prefs, false)?, }; if end_tag.is_empty() { @@ -504,13 +503,13 @@ impl TTS { // auto pausing can't be known until neighboring strings are computed // we create a unique string in this case and compute the real value later - fn get_string_none(&self, command: &TTSCommandRule, prefs: &PreferenceManager, is_start_tag: bool) -> String { + fn get_string_none(&self, command: &TTSCommandRule, prefs: &PreferenceManager, is_start_tag: bool) -> Result { // they only thing to do is handle "pause" with some punctuation hacks along with 'spell' if is_start_tag { if command.command == TTSCommand::Pause { - let amount = command.value.get_num(); + let amount = command.value.get_num()?; // only ',' and ';' are used as '.' didn't seem to reliably generate pauses in tests - return crate::speech::CONCAT_INDICATOR.to_string() + ( + return Ok(crate::speech::CONCAT_INDICATOR.to_string() + ( if amount == PAUSE_AUTO { PAUSE_AUTO_STR } else { @@ -523,22 +522,22 @@ impl TTS { ";" } } - ); + )); } else if command.command == TTSCommand::Spell { // debug!("spell rule: {}", command.value.get_string()); - return command.value.get_string().to_string(); + return Ok(command.value.get_string()?.to_string()); } else if let TTSCommandValue::Pronounce(p) = &command.value { - return crate::speech::CONCAT_INDICATOR.to_string() + &p.text; + return Ok(crate::speech::CONCAT_INDICATOR.to_string() + &p.text); } }; - return "".to_string(); + return Ok("".to_string()); } - fn get_string_sapi5(&self, command: &TTSCommandRule, prefs: &PreferenceManager, is_start_tag: bool) -> String { + fn get_string_sapi5(&self, command: &TTSCommandRule, prefs: &PreferenceManager, is_start_tag: bool) -> Result { return match &command.command { TTSCommand::Pause => if is_start_tag { - let amount = command.value.get_num(); - if amount == PAUSE_AUTO { + let amount = command.value.get_num()?; + Ok(if amount == PAUSE_AUTO { PAUSE_AUTO_STR.to_string() } else { let amount = amount * TTS::get_pause_multiplier(prefs); @@ -547,35 +546,60 @@ impl TTS { } else { "".to_string() } - } + }) } else { - "".to_string() + Ok("".to_string()) }, // pitch must be in [-10, 10], logarithmic based on octaves // note MathPlayer uses 'absmiddle' (requires keeping a stack) -- could be 'middle' is not well supported - TTSCommand::Pitch => if is_start_tag {format!("", (24.0*(1.0+command.value.get_num()/100.0).log2()).round())} else {String::from("")}, + TTSCommand::Pitch => if is_start_tag { + Ok(format!("", (24.0*(1.0+command.value.get_num()?/100.0).log2()).round())) + } else { + Ok(String::from("")) + }, // rate must be in [-10, 10], but we get relative %s. 300% => 10 (see comments at top of file) - TTSCommand::Rate => if is_start_tag {format!("", 10.0*(0.01*command.value.get_num()).log(3.0))} else {String::from("")}, - TTSCommand::Volume =>if is_start_tag {format!("", command.value.get_num())} else {String::from("")}, - TTSCommand::Audio => "".to_string(), // SAPI5 doesn't support audio - TTSCommand::Gender =>if is_start_tag {format!("", command.value.get_string())} else {String::from("")}, - TTSCommand::Voice =>if is_start_tag {format!("", command.value.get_string())} else {String::from("")}, - TTSCommand::Spell =>if is_start_tag {format!("{}", command.value.get_string())} else {String::from("")}, - TTSCommand::Pronounce =>if is_start_tag { - format!("{}", &command.value.get_pronounce().sapi5, &command.value.get_pronounce().text) - } else { - String::from("") - }, - TTSCommand::Bookmark => panic!("Internal error: bookmarks should have been handled earlier"), + TTSCommand::Rate => if is_start_tag { + Ok(format!("", 10.0*(0.01*command.value.get_num()?).log(3.0))) + } else { + Ok(String::from("")) + }, + TTSCommand::Volume => if is_start_tag { + Ok(format!("", command.value.get_num()?)) + } else { + Ok(String::from("")) + }, + TTSCommand::Audio => Ok("".to_string()), // SAPI5 doesn't support audio + TTSCommand::Gender => if is_start_tag { + Ok(format!("", command.value.get_string()?)) + } else { + Ok(String::from("")) + }, + TTSCommand::Voice => if is_start_tag { + Ok(format!("", command.value.get_string()?)) + } else { + Ok(String::from("")) + }, + TTSCommand::Spell => if is_start_tag { + Ok(format!("{}", command.value.get_string()?)) + } else { + Ok(String::from("")) + }, + TTSCommand::Pronounce => if is_start_tag { + let pronounce = command.value.get_pronounce()?; + Ok(format!("{}", &pronounce.sapi5, &pronounce.text)) + } else { + Ok(String::from("")) + }, + TTSCommand::Bookmark => bail!("Internal error: bookmarks should have been handled earlier"), }; } - fn get_string_ssml(&self, command: &TTSCommandRule, prefs: &PreferenceManager, is_start_tag: bool) -> String { + fn get_string_ssml(&self, command: &TTSCommandRule, prefs: &PreferenceManager, is_start_tag: bool) -> Result { return match &command.command { TTSCommand::Pause => { if is_start_tag { - let amount = command.value.get_num(); - if amount == PAUSE_AUTO { + let amount = command.value.get_num()?; + Ok(if amount == PAUSE_AUTO { PAUSE_AUTO_STR.to_string() } else { let amount = amount * TTS::get_pause_multiplier(prefs); @@ -584,25 +608,54 @@ impl TTS { } else { "".to_string() } - } + }) } else { - "".to_string() + Ok("".to_string()) } }, - TTSCommand::Pitch => if is_start_tag {format!("", command.value.get_num())} else {String::from("")}, - TTSCommand::Rate => if is_start_tag {format!("", command.value.get_num())} else {String::from("")}, - TTSCommand::Volume =>if is_start_tag {format!("", command.value.get_num())} else {String::from("")}, - TTSCommand::Audio =>if is_start_tag {format!("")}, // only 'beep' is supported for now - TTSCommand::Gender =>if is_start_tag {format!("", command.value.get_string())} else {String::from("")}, - TTSCommand::Voice =>if is_start_tag {format!("", command.value.get_string())} else {String::from("")}, - TTSCommand::Spell =>if is_start_tag {format!("{}", command.value.get_string())} else {String::from("")}, - TTSCommand::Pronounce =>if is_start_tag { - format!("{}", &command.value.get_pronounce().ipa, &command.value.get_pronounce().text) + TTSCommand::Pitch => if is_start_tag { + Ok(format!("", command.value.get_num()?)) } else { - String::from("") + Ok(String::from("")) }, - TTSCommand::Bookmark => panic!("Internal error: bookmarks should have been handled earlier"), - } + TTSCommand::Rate => if is_start_tag { + Ok(format!("", command.value.get_num()?)) + } else { + Ok(String::from("")) + }, + TTSCommand::Volume => if is_start_tag { + Ok(format!("", command.value.get_num()?)) + } else { + Ok(String::from("")) + }, + TTSCommand::Audio => if is_start_tag { + Ok(format!("")) + }, // only 'beep' is supported for now + TTSCommand::Gender => if is_start_tag { + Ok(format!("", command.value.get_string()?)) + } else { + Ok(String::from("")) + }, + TTSCommand::Voice => if is_start_tag { + Ok(format!("", command.value.get_string()?)) + } else { + Ok(String::from("")) + }, + TTSCommand::Spell => if is_start_tag { + Ok(format!("{}", command.value.get_string()?)) + } else { + Ok(String::from("")) + }, + TTSCommand::Pronounce => if is_start_tag { + let pronounce = command.value.get_pronounce()?; + Ok(format!("{}", &pronounce.ipa, &pronounce.text)) + } else { + Ok(String::from("")) + }, + TTSCommand::Bookmark => bail!("Internal error: bookmarks should have been handled earlier"), + }; } fn get_pause_multiplier(prefs: &PreferenceManager) -> f64 { @@ -613,7 +666,7 @@ impl TTS { /// /// The computation is based on the length of the speech strings (after removing tagging). /// There is a bias towards pausing more _after_ longer strings. - pub fn compute_auto_pause(&self, prefs: &PreferenceManager, before: &str, after: &str) -> String { + 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; @@ -635,7 +688,7 @@ impl TTS { if after_len < 3 { // hack to prevent pausing before "of" in exprs like "the fourth power of secant, of x" // if it should pause anywhere, it should be after the "of" - return "".to_string(); + return Ok("".to_string()); } let pause = std::cmp::min(3000, ((2 * before_len + after_len)/48) * 128); // create a TTSCommandRule so we reuse code diff --git a/src/xpath_functions.rs b/src/xpath_functions.rs index 3ee936dfc..944e505f8 100644 --- a/src/xpath_functions.rs +++ b/src/xpath_functions.rs @@ -1609,22 +1609,31 @@ pub fn add_builtin_functions(context: &mut Context) { #[cfg(test)] mod tests { use super::*; + use crate::errors::Result; + use crate::interface::{get_element, init_panic_handler, report_any_panic, trim_element}; use sxd_document::parser; - use crate::interface::{trim_element, get_element}; + use std::panic::{catch_unwind, AssertUnwindSafe}; + fn xpath_test(f: F) -> Result<()> + where + F: FnOnce() -> Result<()> + std::panic::UnwindSafe, + { + init_panic_handler(); + let result = catch_unwind(AssertUnwindSafe(f)); + return report_any_panic(result); + } - fn init_word_list() { - crate::interface::set_rules_dir(super::super::abs_rules_dir_path()).unwrap(); - crate::interface::set_preference("Language", "en").unwrap(); - let result = crate::definitions::read_definitions_file(true); - if let Err(e) = result { - panic!("unable to read 'Rules/Languages/en/definitions.yaml\n{e}"); - } + fn init_word_list() -> Result<()> { + crate::interface::set_rules_dir(super::super::abs_rules_dir_path())?; + crate::interface::set_preference("Language", "en")?; + crate::definitions::read_definitions_file(true)?; + return Ok( () ); } #[test] - fn ordinal_one_digit() { - init_word_list(); + fn ordinal_one_digit() -> Result<()> { + return xpath_test(|| { + init_word_list()?; assert_eq!("zeroth", ToOrdinal::convert("0", false, false).unwrap()); assert_eq!("second", ToOrdinal::convert("2", false, false).unwrap()); assert_eq!("ninth", ToOrdinal::convert("9", false, false).unwrap()); @@ -1641,11 +1650,14 @@ mod tests { assert_eq!("halves", ToOrdinal::convert("2", true, true).unwrap()); assert_eq!("halves", ToOrdinal::convert("002", true, true).unwrap()); assert_eq!("ninths", ToOrdinal::convert("9", true, true).unwrap()); + return Ok( () ); + }); } #[test] - fn ordinal_two_digit() { - init_word_list(); + fn ordinal_two_digit() -> Result<()> { + return xpath_test(|| { + init_word_list()?; assert_eq!("tenth", ToOrdinal::convert("10", false, false).unwrap()); assert_eq!("seventeenth", ToOrdinal::convert("17", false, false).unwrap()); assert_eq!("thirty second", ToOrdinal::convert("32", false, false).unwrap()); @@ -1668,11 +1680,14 @@ mod tests { assert_eq!("nineteenths", ToOrdinal::convert("19", true, true).unwrap()); assert_eq!("twentieths", ToOrdinal::convert("20", true, true).unwrap()); assert_eq!("nineteenths", ToOrdinal::convert("𝟏𝟗", true, true).unwrap()); + return Ok( () ); + }); } #[test] - fn ordinal_three_digit() { - init_word_list(); + fn ordinal_three_digit() -> Result<()> { + return xpath_test(|| { + init_word_list()?; assert_eq!("one hundred first", ToOrdinal::convert("101", false, false).unwrap()); assert_eq!("two hundred tenth", ToOrdinal::convert("210", false, false).unwrap()); assert_eq!("four hundred thirty second", ToOrdinal::convert("432", false, false).unwrap()); @@ -1691,10 +1706,13 @@ mod tests { assert_eq!("seven hundredths", ToOrdinal::convert("700", true, true).unwrap()); assert_eq!("one hundredths", ToOrdinal::convert("100", true, true).unwrap()); assert_eq!("eight hundred seventeenths", ToOrdinal::convert("817", true, true).unwrap()); + return Ok( () ); + }); } #[test] - fn ordinal_large() { - init_word_list(); + fn ordinal_large() -> Result<()> { + return xpath_test(|| { + init_word_list()?; assert_eq!("one thousandth", ToOrdinal::convert("1000", false, false).unwrap()); assert_eq!("two thousand one hundredth", ToOrdinal::convert("2100", false, false).unwrap()); assert_eq!("thirty thousandth", ToOrdinal::convert("30000", false, false).unwrap()); @@ -1713,89 +1731,101 @@ mod tests { assert_eq!("nine billion eight hundred seventy six million five hundred forty three thousand two hundred tenths", ToOrdinal::convert("9876543210", true, true).unwrap()); assert_eq!("nine billion five hundred forty three thousand two hundred tenths", ToOrdinal::convert("9000543210", true, true).unwrap()); assert_eq!("zeroth", ToOrdinal::convert("00000", false, false).unwrap()); + return Ok( () ); + }); } - fn test_is_simple(message: &'static str, mathml_str: &'static str) { + fn test_is_simple(message: &'static str, mathml_str: &'static str) -> Result<()> { // this forces initialization crate::speech::SPEECH_RULES.with(|_| true); let package = parser::parse(mathml_str) - .expect("failed to parse XML"); + .map_err(|e| anyhow::anyhow!("failed to parse XML: {e}"))?; let mathml = get_element(&package); trim_element(mathml, false); assert!(IsNode::is_simple(mathml), "{}", message); + return Ok( () ); } - fn test_is_not_simple(message: &'static str, mathml_str: &'static str) { + fn test_is_not_simple(message: &'static str, mathml_str: &'static str) -> Result<()> { // this forces initialization crate::speech::SPEECH_RULES.with(|_| true); let package = parser::parse(mathml_str) - .expect("failed to parse XML"); + .map_err(|e| anyhow::anyhow!("failed to parse XML: {e}"))?; let mathml = get_element(&package); trim_element(mathml, false); assert!(!IsNode::is_simple(mathml), "{}", message); + return Ok( () ); } #[test] - fn is_simple() { - test_is_simple("single variable", "x"); - test_is_simple("single number", "1.2"); - test_is_simple("negative number", "-10"); - test_is_simple("negative variable", "-x"); - test_is_simple("ordinal fraction", "34"); - test_is_simple("x y", "xy"); + fn is_simple() -> Result<()> { + return xpath_test(|| { + test_is_simple("single variable", "x")?; + test_is_simple("single number", "1.2")?; + test_is_simple("negative number", "-10")?; + test_is_simple("negative variable", "-x")?; + test_is_simple("ordinal fraction", "34")?; + test_is_simple("x y", "xy")?; test_is_simple("negative two vars", - "-xy"); + "-xy")?; test_is_simple("-2 x y", "-2 - xz"); - test_is_simple("sin x", "sinx"); - test_is_simple("f(x)", "f(x)"); + xz")?; + test_is_simple("sin x", "sinx")?; + test_is_simple("f(x)", "f(x)")?; test_is_simple("f(x+y)", "f\ - (x+y)"); - + (x+y)")?; + return Ok( () ); + }); } #[test] - fn is_not_simple() { - test_is_not_simple("multi-char variable", "rise"); - test_is_not_simple("large ordinal fraction", "304"); - test_is_not_simple("fraction with var in numerator", "x4"); - test_is_not_simple("square root", "x"); - test_is_not_simple("subscript", "x4"); + fn is_not_simple() -> Result<()> { + return xpath_test(|| { + test_is_not_simple("multi-char variable", "rise")?; + test_is_not_simple("large ordinal fraction", "304")?; + test_is_not_simple("fraction with var in numerator", "x4")?; + test_is_not_simple("square root", "x")?; + test_is_not_simple("subscript", "x4")?; test_is_not_simple("-x y z", "-x - yz"); + yz")?; test_is_not_simple("C(-2,1,4)", // github.com/NSoiffer/MathCAT/issues/199 - "C(2,1,4)"); - + "C(2,1,4)")?; + return Ok( () ); + }); } - fn check_table_dims(mathml: &str, dims: (usize, usize)) { - let package = parser::parse(mathml).expect("failed to parse XML"); + fn check_table_dims(mathml: &str, dims: (usize, usize)) -> Result<()> { + 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)))); + return Ok( () ); } #[test] - fn table_dim() { - check_table_dims("a", (1, 1)); - check_table_dims("ab", (2, 4)); + fn table_dim() -> Result<()> { + return xpath_test(|| { + check_table_dims("a", (1, 1))?; + check_table_dims("ab", (2, 4))?; - check_table_dims("labelabcd", (2, 2)); + check_table_dims("labelabcd", (2, 2))?; // extended rows beyond the `mtr`s do *not* count towards the row count. - check_table_dims("a", (1, 1)); + check_table_dims("a", (1, 1))?; check_table_dims("a -b", (2, 3)); - +b", (2, 3))?; + return Ok( () ); + }); } #[test] - fn at_left_edge() { + fn at_left_edge() -> Result<()> { + return xpath_test(|| { let mathml = "30x4"; - let package = parser::parse(mathml).expect("failed to parse XML"); + let package = parser::parse(mathml).map_err(|e| anyhow::anyhow!("failed to parse XML: {e}"))?; let mathml = get_element(&package); trim_element(mathml, false); let fraction = as_element(mathml.children()[0]); @@ -1805,12 +1835,15 @@ mod tests { let mi = as_element(as_element(fraction.children()[0]).children()[1]); assert_eq!(EdgeNode::edge_node(mi, true, "2D"), None); + return Ok( () ); + }); } #[test] - fn at_right_edge() { + fn at_right_edge() -> Result<()> { + return xpath_test(|| { let mathml = "430x."; - let package = parser::parse(mathml).expect("failed to parse XML"); + let package = parser::parse(mathml).map_err(|e| anyhow::anyhow!("failed to parse XML: {e}"))?; let mathml = get_element(&package); trim_element(mathml, false); let fraction = as_element(as_element(mathml.children()[0]).children()[0]); @@ -1821,5 +1854,7 @@ mod tests { let mn = as_element(as_element(fraction.children()[1]).children()[0]); assert_eq!(EdgeNode::edge_node(mn, true, "2D"), None); + return Ok( () ); + }); } } diff --git a/tests/Languages/hu/ClearSpeak/large_ops.rs b/tests/Languages/hu/ClearSpeak/large_ops.rs index 994dafff6..c50d483b4 100644 --- a/tests/Languages/hu/ClearSpeak/large_ops.rs +++ b/tests/Languages/hu/ClearSpeak/large_ops.rs @@ -128,7 +128,7 @@ fn intersection_both() -> Result<()> { Si "; - test("hu", "ClearSpeak", expr, "kereszteződés ettől: i egyenlő 1, eddig: 10 értéke:; nagy s alsó index i")?; + test("hu", "ClearSpeak", expr, "metszet ettől: i egyenlő 1, eddig: 10 értéke:; nagy s alsó index i")?; return Ok(()); } @@ -143,7 +143,7 @@ fn intersection_under() -> Result<()> { Si "; - test("hu", "ClearSpeak", expr, "kereszteződés alatta nagy c, nagy s alsó index i")?; + test("hu", "ClearSpeak", expr, "metszet alatta nagy c, nagy s alsó index i")?; return Ok(()); } @@ -155,7 +155,7 @@ fn intersection() -> Result<()> { Si "; - test("hu", "ClearSpeak", expr, "kereszteződés nagy s alsó index i")?; + test("hu", "ClearSpeak", expr, "metszet nagy s alsó index i")?; return Ok(()); } diff --git a/tests/Languages/hu/SimpleSpeak/large_ops.rs b/tests/Languages/hu/SimpleSpeak/large_ops.rs index 1d798202c..09e30e109 100644 --- a/tests/Languages/hu/SimpleSpeak/large_ops.rs +++ b/tests/Languages/hu/SimpleSpeak/large_ops.rs @@ -128,7 +128,7 @@ fn intersection_both() -> Result<()> { Si "; - test("hu", "SimpleSpeak", expr, "kereszteződés ettől: i egyenlő 1, eddig: 10 értéke:; nagy s alsó index i")?; + test("hu", "SimpleSpeak", expr, "metszet ettől: i egyenlő 1, eddig: 10 értéke:; nagy s alsó index i")?; return Ok(()); } @@ -143,7 +143,7 @@ fn intersection_under() -> Result<()> { Si "; - test("hu", "SimpleSpeak", expr, "kereszteződés alatta nagy c, nagy s alsó index i")?; + test("hu", "SimpleSpeak", expr, "metszet alatta nagy c, nagy s alsó index i")?; return Ok(()); } @@ -155,7 +155,7 @@ fn intersection() -> Result<()> { Si "; - test("hu", "SimpleSpeak", expr, "kereszteződés nagy s alsó index i")?; + test("hu", "SimpleSpeak", expr, "metszet nagy s alsó index i")?; return Ok(()); } diff --git a/tests/Languages/hu/alphabets.rs b/tests/Languages/hu/alphabets.rs index 7fcdecbda..3c582e79f 100644 --- a/tests/Languages/hu/alphabets.rs +++ b/tests/Languages/hu/alphabets.rs @@ -12,7 +12,7 @@ fn special_alphabet_chars() -> Result<()> { let expr = " ,"; test("hu", "SimpleSpeak", expr, "dupla leütésű nagy h, vessző; dupla leütésű nagy pí")?; let expr = " ,"; - test("hu", "SimpleSpeak", expr, "script nagy i vessző, script nagy m")?; + test("hu", "SimpleSpeak", expr, "alsó index nagy i, vessző, alsó index nagy m")?; return Ok(()); } @@ -37,7 +37,7 @@ fn greek() -> Result<()> { #[test] fn cap_cyrillic() -> Result<()> { let expr = " А,Я"; - test("hu", "SimpleSpeak", expr, "nagybetű а vessző, nagybetű ya")?; + test("hu", "SimpleSpeak", expr, "nagy а vessző, nagy ciril ya")?; return Ok(()); } @@ -120,14 +120,14 @@ fn double_struck() -> Result<()> { #[test] fn script() -> Result<()> { let expr = " 𝒜,𝒵"; - test("hu", "SimpleSpeak", expr, "script nagy a vessző, script nagy z")?; + test("hu", "SimpleSpeak", expr, "alsó index nagy a, vessző, alsó index nagy z")?; let expr = " 𝒶,𝓏"; - test("hu", "SimpleSpeak", expr, "script a vessző, script z")?; + test("hu", "SimpleSpeak", expr, "alsó index a vessző, alsó index z")?; // MathType private space versions let expr = " ,"; - test("hu", "SimpleSpeak", expr, "script nagy a vessző, script nagy z")?; + test("hu", "SimpleSpeak", expr, "alsó index nagy a, vessző, alsó index nagy z")?; let expr = " ,"; - test("hu", "SimpleSpeak", expr, "script a vessző, script z")?; + test("hu", "SimpleSpeak", expr, "alsó index a vessző, alsó index z")?; return Ok(()); } @@ -136,14 +136,14 @@ fn script() -> Result<()> { #[test] fn bold_script() -> Result<()> { let expr = " 𝓐,𝓩"; - test("hu", "SimpleSpeak", expr, "script félkövér nagy a, vessző; script félkövér nagy z")?; + test("hu", "SimpleSpeak", expr, "alsó index félkövér nagy a, vessző; alsó index félkövér nagy z")?; let expr = " 𝓪,𝔃"; - test("hu", "SimpleSpeak", expr, "script félkövér a, vessző, script félkövér z")?; + test("hu", "SimpleSpeak", expr, "alsó index félkövér a, vessző; alsó index félkövér z")?; // MathType private space versions let expr = " ,"; - test("hu", "SimpleSpeak", expr, "script félkövér nagy a, vessző; script félkövér nagy z")?; + test("hu", "SimpleSpeak", expr, "alsó index félkövér nagy a, vessző; alsó index félkövér nagy z")?; let expr = " ,"; - test("hu", "SimpleSpeak", expr, "script félkövér a, vessző, script félkövér z")?; + test("hu", "SimpleSpeak", expr, "alsó index félkövér a, vessző; alsó index félkövér z")?; return Ok(()); } diff --git a/tests/Languages/hu/intent.rs b/tests/Languages/hu/intent.rs index c5c2fa3ec..659936680 100644 --- a/tests/Languages/hu/intent.rs +++ b/tests/Languages/hu/intent.rs @@ -7,18 +7,44 @@ use anyhow::Result; // AI generated #[test] fn silent_intent() -> Result<()> { - let expr = " 2 x "; + let expr = " 2 x "; test("hu", "SimpleSpeak", expr, "2 x")?; test("hu", "LiteralSpeak", expr, "2 x")?; return Ok(()); } +#[test] +fn silent_intent_underscore() -> Result<()> { + let expr = " + + H + 2 + "; + test("hu", "SimpleSpeak", expr, "nagy h vessző, 2")?; + test("hu", "ClearSpeak", expr, "nagy h vessző, 2")?; + return Ok(()); + +} + +#[test] +fn intent_prob_x() -> Result<()> { + //init_logger(); + let expr = " + + x + P + "; + test("hu", "ClearSpeak", expr, "valószínűség x")?; + return Ok(()); + +} + // AI generated #[test] fn prefix_intent() -> Result<()> { - let expr = r#" x T "#; - test("hu", "SimpleSpeak", expr, "testing x")?; + let expr = r#" x T "#; + test("hu", "SimpleSpeak", expr, "tesztelés x")?; return Ok(()); } @@ -26,8 +52,8 @@ fn prefix_intent() -> Result<()> { // AI generated #[test] fn postfix_intent() -> Result<()> { - let expr = r#" x T "#; - test("hu", "SimpleSpeak", expr, "x testing")?; + let expr = r#" x T "#; + test("hu", "SimpleSpeak", expr, "x tesztelése")?; return Ok(()); } @@ -35,12 +61,12 @@ fn postfix_intent() -> Result<()> { // AI generated #[test] fn infix_intent() -> Result<()> { - let expr = r#" + let expr = r#" x y z "#; - test("hu", "SimpleSpeak", expr, "x testing y testing z testing 2")?; + test("hu", "SimpleSpeak", expr, "x tesztelés y tesztelés z tesztelés 2")?; return Ok(()); } @@ -49,7 +75,7 @@ fn infix_intent() -> Result<()> { #[test] fn infix_intent_no_args() -> Result<()> { // this is illegal intent, so it is just an mrow with one child - let expr = r#" + let expr = r#" x "#; test("hu", "SimpleSpeak", expr, "x")?; @@ -60,11 +86,11 @@ fn infix_intent_no_args() -> Result<()> { // AI generated #[test] fn infix_intent_one_arg() -> Result<()> { - let expr = r#" + let expr = r#" x "#; // Note: we say the intent name because there are infix plus/minus with a single arg due to continued rows or combined columns - test("hu", "SimpleSpeak", expr, "testing x")?; + test("hu", "SimpleSpeak", expr, "teszteljük x")?; return Ok(()); } @@ -72,12 +98,12 @@ fn infix_intent_one_arg() -> Result<()> { // AI generated #[test] fn function_intent() -> Result<()> { - let expr = r#" + let expr = r#" x y z "#; - test("hu", "SimpleSpeak", expr, "testing x vessző, y vessző, z vessző, 2")?; + test("hu", "SimpleSpeak", expr, "teszteljük x vessző, y vessző, z vessző, 2")?; return Ok(()); } @@ -86,7 +112,7 @@ fn function_intent() -> Result<()> { #[test] fn function_no_args_intent() -> Result<()> { // this is illegal intent, so it is just an mrow with one child - let expr = r#" + let expr = r#" x "#; test("hu", "SimpleSpeak", expr, "x")?; @@ -97,10 +123,10 @@ fn function_no_args_intent() -> Result<()> { // AI generated #[test] fn function_one_arg_intent() -> Result<()> { - let expr = r#" + let expr = r#" x "#; - test("hu", "SimpleSpeak", expr, "testing x")?; + test("hu", "SimpleSpeak", expr, "teszteljük x")?; return Ok(()); } diff --git a/tests/Languages/hu/shared.rs b/tests/Languages/hu/shared.rs index 1d47de7fe..c3278cc99 100644 --- a/tests/Languages/hu/shared.rs +++ b/tests/Languages/hu/shared.rs @@ -477,14 +477,14 @@ fn literal_speak_perpendicular() -> Result<()> { A - + B "#; - test("hu", "LiteralSpeak", expr, "nagy a jobbra nyíl, perpendicular to, nagy b jobbra nyíl")?; + test("hu", "LiteralSpeak", expr, "nagy a jobbra nyíl, merőleges nagy b jobbra nyíl")?; return Ok(()); } @@ -513,7 +513,7 @@ fn literal_speak_chars() -> Result<()> { // AI generated #[test] fn literal_speak_with_name() -> Result<()> { - let expr = r#" + let expr = r#" f @@ -527,7 +527,7 @@ fn literal_speak_with_name() -> Result<()> { "#; - test("hu", "LiteralSpeak", expr, "forced f, bal zárójel, x felkiáltójel, jobb zárójel")?; + test("hu", "LiteralSpeak", expr, "kényszerített f, bal zárójel, x felkiáltójel, jobb zárójel")?; return Ok(()); } @@ -563,14 +563,14 @@ fn literal_intent_property() -> Result<()> { A - + B "#; - test("hu", "SimpleSpeak", expr, "nagy a jobbra nyíl, perpendicular to, nagy b jobbra nyíl")?; + test("hu", "SimpleSpeak", expr, "nagy a jobbra nyíl, merőleges nagy b jobbra nyíl")?; return Ok(()); } @@ -578,7 +578,7 @@ fn literal_intent_property() -> Result<()> { // AI generated #[test] fn literal_intent_property_with_name() -> Result<()> { - let expr = r#" + let expr = r#" f @@ -592,7 +592,7 @@ fn literal_intent_property_with_name() -> Result<()> { "#; - test("hu", "SimpleSpeak", expr, "forced f, nyitott zárójel, x felkiáltójel, zárt zárójel")?; + test("hu", "SimpleSpeak", expr, "kényszerített f, nyitott zárójel, x felkiáltójel, zárt zárójel")?; return Ok(()); } diff --git a/tests/braille/Nemeth/other.rs b/tests/braille/Nemeth/other.rs index 26435c1ba..27cb3b9c7 100644 --- a/tests/braille/Nemeth/other.rs +++ b/tests/braille/Nemeth/other.rs @@ -78,9 +78,7 @@ fn extra_indicators_bug_343() -> Result<()> { #[test] fn find_baseline_indicator_bug_364() -> Result<()> { - use libmathcat::interface::*; - - // https://github.com/NSoiffer/MathCAT/issues/343 -- extra indicators before baseline indicator due to -x^2, not there for x^2 + // https://github.com/NSoiffer/MathCAT/issues/364 let expr = r#" π @@ -91,19 +89,7 @@ fn find_baseline_indicator_bug_364() -> Result<()> { "#; - set_rules_dir(abs_rules_dir_path()).unwrap(); - set_preference("BrailleNavHighlight", "Off").unwrap(); - set_preference("BrailleCode", "Nemeth").unwrap(); - if let Err(e) = set_mathml(expr) { - panic!("{}", errors_to_string(&e)); - }; - match get_navigation_node_from_braille_position(4) { - Ok((node_id, offset)) => { - assert_eq!(&node_id, "id-6"); - assert_eq!(offset, 0); - } - Err(e) => panic!("{}", errors_to_string(&e)), - }; + test_braille_nav_position("Nemeth", expr, 4, "id-6", 0)?; return Ok(()); } diff --git a/tests/braille/Swedish/swedish.rs b/tests/braille/Swedish/swedish.rs index a66bbffe3..beff82b95 100644 --- a/tests/braille/Swedish/swedish.rs +++ b/tests/braille/Swedish/swedish.rs @@ -273,6 +273,7 @@ fn ex_6_14() -> Result<()> { } #[test] +#[ignore] // need to figure out rationale for why a doubled "⠳⠳" is not used here fn ex_6_15() -> Result<()> { let expr= r#"b0+a1 b1+a2 @@ -284,6 +285,7 @@ fn ex_6_15() -> Result<()> { } #[test] +#[ignore] // need to figure out rationale for why a doubled "⠿⠦" and close ""⠿⠴" is not used here fn ex_6_16() -> Result<()> { let expr= r#"z=7x6y 5x+8y7x6y @@ -294,6 +296,7 @@ fn ex_6_16() -> Result<()> { } #[test] +#[ignore] // need to figure out rationale for why a doubled "⠳⠳" is not used here fn ex_6_17() -> Result<()> { let expr= r#"z=1+7x6y 5x+8y7x6y @@ -314,6 +317,7 @@ fn ex_6_18() -> Result<()> { } #[test] +#[ignore] // need to figure out rationale for why "⠿⠴" is used in one place fn ex_6_19() -> Result<()> { // FIXED: Added non-breaking spaces around the text let expr= r#"963,96 diff --git a/tests/common/mod.rs b/tests/common/mod.rs index 13dfbeb45..5a51fff09 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -126,6 +126,24 @@ pub fn test_ClearSpeak_prefs(language: &str, prefs: Vec<(&str, &str)>, mathml: & test_prefs(language, "ClearSpeak", prefs, mathml, speech) } +/// Speech language to use when testing a given `BrailleCode`. +/// Nemeth, UEB, LaTeX, and ASCIIMath use English; other codes use their natural language pack. +fn language_for_braille_code(code: &str) -> &'static str { + match code { + "Vietnam" => "vi", + "CMU" => "es", + "Swedish" => "sv", + "Finnish" => "fi", + "French" => "fr", + "Russian" => "ru", + _ => "en", + } +} + +fn set_language_for_braille_code(code: &str) { + set_preference("Language", language_for_braille_code(code)).unwrap(); +} + // Compare the result of brailling the mathml input to the output (Unicode) 'braille' #[allow(dead_code)] // used in testing #[allow(non_snake_case)] @@ -138,13 +156,7 @@ pub fn test_braille(code: &str, mathml: &str, braille: &str) -> Result<()> { set_preference("BrailleNavHighlight", "Off").unwrap(); set_preference("BrailleCode", code).unwrap(); set_preference("LaTeX_UseShortName", "false").unwrap(); - // FIX: this shouldn't need to be done -- need to figure out how to get definitions set automatically - // log::debug!("\nsetting Language"); - match code { - "Vietnam" => set_preference("Language", "vi").unwrap(), - "CMU" => set_preference("Language", "es").unwrap(), - _ => set_preference("Language", "en").unwrap(), - } + set_language_for_braille_code(code); if let Err(e) = set_mathml(mathml) { panic!("{}", errors_to_string(&e)); }; @@ -165,13 +177,7 @@ pub fn test_braille_prefs(code: &str, test_prefs: Vec<(&str, &str)>, mathml: &st set_preference("DecimalSeparator", "Auto").unwrap(); set_preference("BrailleCode", code).unwrap(); - // FIX: this shouldn't need to be done -- need to figure out how to get definitions set automatically - // log::debug!("\nsetting Language"); - match code { - "Vietnam" => set_preference("Language", "vi").unwrap(), - "CMU" => set_preference("Language", "es").unwrap(), - _ => set_preference("Language", "en").unwrap(), - } + set_language_for_braille_code(code); set_preference("UseSpacesAroundAllOperators", "false").unwrap(); // makes testing simpler for &(pref_name, pref_value) in &test_prefs { @@ -190,6 +196,38 @@ pub fn test_braille_prefs(code: &str, test_prefs: Vec<(&str, &str)>, mathml: &st report_any_panic(result) } +/// Setup braille and assert `get_navigation_node_from_braille_position` result. +#[allow(dead_code)] // used in testing +pub fn test_braille_nav_position( + code: &str, + mathml: &str, + braille_position: usize, + expected_node_id: &str, + expected_offset: usize, +) -> Result<()> { + init_panic_handler(); + let result = catch_unwind(AssertUnwindSafe(|| { + set_rules_dir(abs_rules_dir_path()).unwrap(); + set_preference("DecimalSeparator", "Auto").unwrap(); + set_preference("BrailleNavHighlight", "Off").unwrap(); + set_preference("BrailleCode", code).unwrap(); + set_preference("LaTeX_UseShortName", "false").unwrap(); + set_language_for_braille_code(code); + if let Err(e) = set_mathml(mathml) { + panic!("{}", errors_to_string(&e)); + }; + match get_navigation_node_from_braille_position(braille_position) { + Ok((node_id, offset)) => { + assert_eq!(node_id, expected_node_id); + assert_eq!(offset, expected_offset); + } + Err(e) => panic!("{}", errors_to_string(&e)), + }; + Ok(()) + })); + report_any_panic(result) +} + #[allow(dead_code)] pub fn test_intent(mathml: &str, target: &str, test_prefs: Vec<(&str, &str)>) -> Result<()> { use sxd_document::{dom::Element, parser}; @@ -269,13 +307,7 @@ pub fn test_from_braille(code: &str, mathml: &str, braille: &str) -> Result<()> set_preference("BrailleNavHighlight", "Off").unwrap(); set_preference("BrailleCode", code).unwrap(); set_preference("LaTeX_UseShortName", "false").unwrap(); - // FIX: this shouldn't need to be done -- need to figure out how to get definitions set automatically - // log::debug!("\nsetting Language"); - match code { - "Vietnam" => set_preference("Language", "vi").unwrap(), - "CMU" => set_preference("Language", "es").unwrap(), - _ => set_preference("Language", "en").unwrap(), - } + set_language_for_braille_code(code); if let Err(e) = set_mathml(mathml) { panic!("{}", errors_to_string(&e)); };