From 89f8d651cbb080e746a5bc7cefef4bb19ad73e63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Arborealis=20L=C3=B6tberg?= <143188129+TimArborealis@users.noreply.github.com> Date: Thu, 23 Apr 2026 14:41:08 +0200 Subject: [PATCH 01/27] first updates unicode, general and part of default --- Rules/Languages/sv/SharedRules/default.yaml | 49 +++-- Rules/Languages/sv/SharedRules/general.yaml | 219 +++++++++++++++----- Rules/Languages/sv/unicode.yaml | 119 ++++++----- 3 files changed, 261 insertions(+), 126 deletions(-) diff --git a/Rules/Languages/sv/SharedRules/default.yaml b/Rules/Languages/sv/SharedRules/default.yaml index 8e0b825b3..17c0a9c3c 100644 --- a/Rules/Languages/sv/SharedRules/default.yaml +++ b/Rules/Languages/sv/SharedRules/default.yaml @@ -72,8 +72,7 @@ match: "." replace: [x: "*"] - -- name: structure-simple +- name: literal-simple # don't include nested fractions. E.g, fraction a plus b over c + 1 end fraction" is ambiguous # by simplistic SimpleSpeak's rules "b over c" is a fraction, but if we say nested fractions # are never simple, then any 'over' applies only to enclosing "fraction...end fraction" pair. @@ -87,7 +86,7 @@ - x: "*[2]" - pause: short -- name: structure-default +- name: literal-default tag: mfrac match: "." replace: @@ -103,44 +102,37 @@ then: [pause: short] - x: "*[2]" - pause: short - - T: "slut division" # phrase("start of fraction x over y 'end over'") + - test: + if: "$Impairment = 'Blindness'" + then: [T: "slut"] # phrase("start of fraction x over y 'end over'") - pause: medium - # not sure what really should be said for these since we should not assume they are square roots -- name: structure-default +- name: literal-default tag: msqrt match: "." replace: - - T: "rotsymbolen" - - test: - if: "$Verbosity!='Terse'" - then: [T: "ur"] # phrase("the root 'of' x") + - T: "roten ur" - x: "*[1]" - pause: short - test: - if: "not(IsNode(*[1],'leaf'))" - then: [T: "slut rotsymbol"] # phrase("root of x 'end root symbol'") + if: "not(IsNode(*[1],'leaf')) or $Impairment = 'Blindness'" + then: [T: "slut rot", pause: medium] # phrase("root of x 'end root symbol'") # not sure what really should be said for these since we should not assume they are square roots -- name: structure-default +- name: literal-default tag: mroot match: "." replace: - - T: "rotsymbolen" - - T: "med index" # phrase("the root of x 'with index' 5") + - T: "rot med index" # phrase("the 'root with index' 3 of 5") - x: "*[1]" - # SWEDISH: Check if the order of base and index is correct! - pause: short - - test: - if: "$Verbosity!='Terse'" - then: [T: "ur"] # phrase("the root 'of' x") + - T: "ur" # phrase("the root 'of' x") - x: "*[2]" - pause: short - test: if: "not(IsNode(*[2],'leaf'))" - then: [T: "slut rotsymbol"] # phrase("root of x 'end root symbol'") - + then: [T: "slut rot"] # phrase("root of x 'end root symbol'") - name: simple-sub tag: indexed-by @@ -162,12 +154,23 @@ then: [T: "nedsänkt"] # phrase(x 'sub' 2) - x: "*[2]" -- name: structure +- name: power-indexed-by + tag: power-indexed-by + match: "." + replace: + - x: "*[1]" + - T: "nedsänkt" # phrase(x 'sub' 2) + - x: "*[2]" + - pause: short + +- name: literal tag: msub match: "." replace: - x: "*[1]" - - T: "nedsänkt" # phrase(x 'sub' 2) + - test: + if: "not($Verbosity='Terse' and *[2][self::m:mn and not(translate(., '.,', '')!=.)])" # just say "x 1" for terse vs "x sub 1" + then: [T: "nedsänkt"] # phrase(x 'sub' 2) - x: "*[2]" - name: structure diff --git a/Rules/Languages/sv/SharedRules/general.yaml b/Rules/Languages/sv/SharedRules/general.yaml index 6f23a1625..4a20180b8 100644 --- a/Rules/Languages/sv/SharedRules/general.yaml +++ b/Rules/Languages/sv/SharedRules/general.yaml @@ -1,6 +1,6 @@ --- # SWEDISH: This code preserves points in mtext elements. Only the first point, if there are more than one, is currently preserved. -- name: intercept-comma +- name: intercept-comma # audit-ignore tag: mtext match: "contains(., '.')" replace: @@ -90,7 +90,7 @@ - T: "den imaginära delen" # phrase('the imaginary part' is part of a complex number) # rules on scripted vertical bars ('evaluated at') -- name: evaluated-at-2 +- name: evaluated-at-2 # audit-ignore tag: evaluate match: "count(*)=2" replace: @@ -104,7 +104,7 @@ - pause: auto - x: "*[2]" -- name: evaluated-at-3 +- name: evaluated-at-3 # audit-ignore tag: evaluate match: "count(*)=3" replace: @@ -129,14 +129,14 @@ - name: permutation tag: pochhammer - match: "count(*)=2" + match: "count(*)=2 and contains(@data-intent-property, ':infix:')" replace: - T: "antalet permutationer av" - x: "*[2]" - T: "element ur" # phrase(the solution involves several 'permutations of' values) - x: "*[1]" -- name: intervals +- name: intervals # audit-ignore tag: [open-interval, open-closed-interval, closed-interval, closed-open-interval] match: "count(*)=2" replace: @@ -169,7 +169,7 @@ # - T: "komma" # phrase(use a 'comma' to divide large numbers or as a decimal point) # - x: "*[2]" -- name: default-point +- name: default-point # audit-ignore tag: point match: "count(*)=2" replace: @@ -178,7 +178,7 @@ - T: "komma" # phrase(use a 'comma' to divide large numbers or as a decimal point) - x: "*[2]" -- name: bigop-both +- name: bigop-both # audit-ignore tag: large-op match: "count(*) = 3" replace: @@ -193,7 +193,7 @@ if: "following-sibling::*" then: [T: "av"] # phrase(the square root 'of' 25 equals 5) -- name: bigop-under +- name: bigop-under # audit-ignore tag: large-op match: "count(*)=2" replace: @@ -205,7 +205,7 @@ if: "following-sibling::*" then: [T: "av"] # phrase(the square root 'of' 25 equals 5) -- name: largeop +- name: largeop # audit-ignore tag: mrow match: "count(*)=2 and IsInDefinition(*[1], 'LargeOperators')" replace: @@ -213,6 +213,14 @@ - T: "av" # phrase(the square root 'of' 25 equals 5) - x: "*[2]" +- name: repeating-decimal + tag: repeating-decimal + match: "." + replace: + - x: "*[1]" + - T: "med periodisk decimalutveckling" # phrase('with repeating digits') + - SPELL: "*[2]" + - name: msubsup-skip-super # handles single, double, etc., prime tag: [skip-super, say-super] @@ -225,7 +233,7 @@ else: [T: "nedsänkt"] # phrase(the result is 'sub' optimal) - x: "*[2]" - test: - if: "not(IsNode(*[2],'leaf'))" + if: "not(IsNode(*[2],'leaf') and $Impairment = 'Blindness')" then: - test: if: "$Verbosity='Verbose'" @@ -244,11 +252,18 @@ - x: "*[3]" - pause: short +# in terse mode, we just say "m" or "s", etc., not meters or seconds +- name: unit-terse + tag: unit + match: "$Verbosity = 'Terse' and string-length(.)=1" + replace: + - bookmark: "@id" + - SPELL: "text()" -# need to say "ett" for '1' in front of a neuter unit +# SWEDISH: need to say "ett" for '1' in front of a neuter unit # this is extra complicated because we need to allow do it for a 1 in front of a mixed fraction # note: bias ha->hektar and Pa->Pascal, not si-prefix "a" (annum) -- name: one-for-unit +- name: one-for-unit # audit-ignore tag: mn match: ".=1" variables: @@ -376,8 +391,25 @@ then: [x: "concat('\uF8FE', DefinitionValue($Word, 'Speech', 'PluralForms'))"] else: [x: "concat('\uF8FE', $Word)"] +# need to reverse the order of speech: $ 3 -> 3 dollars +- name: currency + tag: mrow + match: "count(*)=3 and DefinitionValue(*[1], 'Speech', 'CurrencySymbols') != ''" + variables: + # If the amount is singular, we don't add the plural ending. + - IsSingular: "*[3][self::m:mn and .=1] and *[2]='\u2062'" + replace: + - bookmark: "*[3]/@id" + - x: "*[3]" + - test: + - if: "$IsSingular" + then: [x: "DefinitionValue(*[1], 'Speech', 'CurrencySymbols')"] + - else_if: "DefinitionValue(*[1], 'Speech', 'PluralForms') != ''" + then: [x: "DefinitionValue(*[1], 'Speech', 'PluralForms')"] + else: [x: "DefinitionValue(*[1], 'Speech', 'CurrencySymbols')"] # SWEDISH: removed s from plural because it should not be added -- name: sin + +- name: sin # audit-ignore tag: mi match: ".='sin'" replace: @@ -498,8 +530,27 @@ then: [T: "cotan hype"] # phrase('cotanch' is shorthand for hyperbolic cotangent) else: [T: "cotangens hyperbolicus"] # phrase(the 'hyperbolic cotangent' is a mathematical function) -- # handle both log and ln - name: log +- name: exponential + tag: mi + match: ".='exp'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity='Terse'" + then: [T: "exp"] # phrase('exp' means exponential function) + else: [T: "exponentialen"] # phrase('exponential' function) + +- name: covariance + tag: mi + match: ".='Cov'" + replace: + - bookmark: "@id" + - test: + if: "$Verbosity='Terse'" + then: [T: "kov"] # phrase('Cov' is shorthand for the covariance function) + else: [T: "kovariansen"] # phrase('covariance' function) + +- name: log # audit-ignore handle log, lg and ln tag: mi match: ".='log' or .='ln' or .='lg'" # FI: added 'lg' variables: [log_is_simple: "IsNode(following-sibling::*[2],'simple')"] @@ -513,23 +564,23 @@ - else_if: ".='lg'" then_test: if: "$Verbosity!='Verbose'" - then: [spell: "'lg'"] # phrase(the 'lg' of x) + then: [SPELL: "'lg'"] # phrase(the 'lg' of x) else: [T: "tio-logaritmen"] # SWEDISH: We have added the term "lg" for the logarithm with base 10. Also added a verbosity test for long and short form. - else_if: "$Verbosity!='Verbose'" - then: [spell: "'ln'"] + then: [SPELL: "'ln'"] else: [T: "naturliga logaritmen"] # phrase(the 'natural log' function is used in mathematics) else: - test: - if: ".='log'" then: [T: "logg"] # phrase(the 'log' function is used in mathematics) - else_if: ".='lg'" - then: [spell: "'lg'"] # phrase(the 'lg' of x) + then: [SPELL: "'lg'"] # phrase(the 'lg' of x) - else_if: "$Verbosity='Terse'" - then: [spell: "'ln'"] + then: [SPELL: "'ln'"] else: [T: "naturliga logaritmen"] # phrase(the 'natural log' function is used in mathematics) -- name: multi-line +- name: multi-line # audit-ignore # that eliminates the need for the if: else_if: ... # IDEA: set a variable with the word to say for the row (e.g., RowLabel = Row/Case/Line/...) tag: [piecewise, system-of-equations, lines] @@ -565,31 +616,29 @@ - name: default-multiline tag: [mtr, mlabeledtr] match: "parent::m:piecewise or parent::m:system-of-equations or parent::m:lines" + variables: [NextLineIsContinuedRow: "following-sibling::*[1][contains(@data-intent-property, ':continued-row:')]"] replace: - - pause: medium - test: - if: "parent::m:system-of-equations and *[1][count(*)=1 and *[1][@data-added='missing-content']] and - count(*/*[1][count(*)=1 and *[1][@data-added!='missing-content']]) != 0" + if: "not($LineCount=1 or contains(@data-intent-property, ':continued-row:'))" then: - - T: "nästa rad" - else_test: - if: "$LineCount != 1" - then: - - test: - - if: "parent::m:piecewise" - then: [T: "fall"] # phrase('case' 1 of 10 cases) - - else_if: "parent::m:system-of-equations" - then: [T: "ekvation"] # phrase('equation' 1 of 10 equations) - else: [T: "rad"] # phrase('line 1 of 10 lines) - - x: "count(preceding-sibling::*)+1" - - test: - if: .[self::m:mlabeledtr] + - pause: medium + - test: + - if: "parent::m:piecewise" + then: [T: "fall"] # phrase('case' 1 of 10 cases) + - else_if: "parent::m:system-of-equations" + then: [T: "ekvation"] # phrase('equation' 1 of 10 equations) + else: [T: "rad"] # phrase('line 1 of 10 lines) + - x: "count(preceding-sibling::*[not(contains(@data-intent-property, ':continued-row:'))]) + 1" + - test: + if: "self::m:mlabeledtr" then: - T: "med etiketten" # phrase(the diagram is complete 'with label') - x: "*[1]/*" - - pause: medium - test: - if: .[self::m:mlabeledtr] + if: "not(contains(@data-intent-property, ':continued-row:'))" + then: [pause: medium] + - test: + if: "self::m:mlabeledtr" then: [x: "*[position()>1]"] else: [x: "*"] @@ -598,20 +647,25 @@ match: "parent::*[parent::m:piecewise or parent::m:system-of-equations or parent::m:lines]" variables: [LongPause: "$SpeechStyle = 'ClearSpeak' and $ClearSpeak_MultiLinePausesBetweenColumns = 'Long'"] replace: - - x: "*" - test: - # short pause after each element; medium pause if last element in a row; long pause for last element in matrix unless ClearSpeak override - - if: "count(following-sibling::*) > 0" - then_test: - if: "$LongPause" - then: [pause: medium] - else: [pause: short] - - else_if: "count(../following-sibling::*) > 0" + if: "IsInDefinition(*[1], 'ComparisonOperators')" + then: [pause: short] + - test: + if: "*[1][@data-added!='missing-content']" + then: [x: "*"] + - test: + # no pause after each element; medium pause if last element in a row; long pause for last element in matrix unless ClearSpeak override + - if: "count(following-sibling::*) = 0 and not($NextLineIsContinuedRow)" then_test: - if: "$LongPause" - then: [pause: long] - else: [pause: medium] - else: [pause: long] + if: "count(../following-sibling::*) > 0" + then_test: + if: "$LongPause" + then: [pause: long] + else: [pause: medium] + else_test: + if: "IsInDefinition(*[1], 'ComparisonOperators')" + then: [pause: short] + else: [pause: auto] # Matrix/Determinant rules # matrix and determinant are the same other than "matrix"/"determinant" based on the bracketing chars @@ -631,6 +685,59 @@ - T: "med element" # phrase(the 2 by 2 matrix 'with entry' x) - x: "*[1]/*" +# simpler reading methods for special case matrices +# SWEDISH: changed order of speaking +- name: zero-matrix + tag: matrix + # select all the non-zero entries -- if there are none of them, then it is a zero matrix + match: "not( */*/*[not(self::m:mn and .= 0)] )" + replace: + - T: "nollmatris" # phrase(the 2 by 2 'zero matrix') + - pause: short + - x: count(*) + - T: "gånger" # phrase(the 1 'by' 2 matrix) + - x: count(*[self::m:mtr][1]/*) + - pause: long + +- name: identity-matrix + tag: matrix + # every diagonal entry must be a literal 1, and every off-diagonal entry must be a literal 0 + match: + - "count(*) = count(*[1]/*) and " # matrix is square + - "not( */*[count(preceding-sibling::*) = count(../preceding-sibling::*)]/*[not(self::m:mn and .= 1)] ) and " # on-diagonal + - "not( */*[count(preceding-sibling::*) != count(../preceding-sibling::*)]/*[not(self::m:mn and .= 0)] )" # off-diagonal + replace: + - T: "identitetsmatris" # phrase(the 2 by 2 'zero matrix') + - pause: short + - x: count(*) + - T: "gånger" # phrase(the 1 'by' 2 matrix) + - x: count(*[self::m:mtr][1]/*) + - pause: long + +- name: diagonal-matrix + tag: matrix + # select all the non-zero entries...if they are not on the diagonal + # if there are any of them, then this isn't an identity matrix + match: + - "count(*) = count(*[1]/*) and " + - "not( */*/*[not(self::m:mn and .= 0)]" + - " [count(../preceding-sibling::*)!=count(../../preceding-sibling::*)]" + - " )" + replace: + - T: "diagonalmatris" # phrase(the 2 by 2 'zero matrix') + - pause: short + - x: count(*) + - T: "gånger" # phrase(the 1 'by' 2 matrix) + - x: count(*[self::m:mtr][1]/*) + - pause: long + - insert: + # this lists the diagonal 'mtd's to be read, and they say "column nnn" before reading the contents + # there seems to be an xpath bug -- without the parens, the match fails for the + # test Languages::en::mtable::diagonal_matrix due to match failure (the third matching element seems to be missing) + nodes: "(*/*/*[not(self::m:mn and .= 0)]/..)" + replace: [pause: auto] + - pause: long + # simpler reading methods for smaller matrices if the entries are simple - name: 2-or-3x1-matrix tag: matrix @@ -658,7 +765,7 @@ then: [T: "vektor"] # phrase(the 2 column 'vector') else: [T: "matris"] # phrase(the 2 by 2 'matrix') -- name: default-column-matrix +- name: default-column-matrix # audit-ignore tag: matrix variables: [IsColumnSilent: true()] match: "*[self::m:mtr][count(*) = 1]" @@ -791,6 +898,14 @@ then: [T: "nedsänkt"] # phrase(H 'sub' 2) - x: "*[3]" +- name: dimension-by + tag: mrow + match: dimension-product + replace: + - insert: + nodes: "*" + replace: [T: "gånger", pause: auto] # phrase(3 'by' 5 matrix) + - name: chemistry-msup tag: [chemical-formula] match: "count(*)=3 and *[1][.='msup']" @@ -987,7 +1102,7 @@ match: "." replace: - bookmark: "@id" - - spell: text() + - SPELL: text() - pause: short - name: chemical-state diff --git a/Rules/Languages/sv/unicode.yaml b/Rules/Languages/sv/unicode.yaml index 6f3ebeab3..3266d0860 100644 --- a/Rules/Languages/sv/unicode.yaml +++ b/Rules/Languages/sv/unicode.yaml @@ -1,15 +1,16 @@ --- - - "a-z": + # Separate rule for "a" not needed in Swedish + - "a-z": # audit-ignore - test: if: "$TTS='none'" then: [T: "."] # (en: '.', google translation) - else: [spell: "'.'"] + else: [SPELL: "'.'"] # Capital letters are a little tricky: users can pick their favorite word (something that was requested) and # screen readers have options to use pitch changes or beeps instead of or in addition to say "cap" # Also, if a user can see the screen, they probably don't need to hear "cap", but if they specified an override, they must want to hear the override. - - "A-Z": + - "A-Z": # audit-ignore - test: if: "$CapitalLetters_Beep" then: @@ -27,14 +28,16 @@ - pitch: value: "$CapitalLetters_Pitch" # note: processing of ranges converts '.' into the character, so it needs to be in quotes below - replace: [spell: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"] + replace: [SPELL: "translate('.', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"] - "0-9": [T: "."] # (en: '.', google: 'A') + - " ": [T: " "] # 0x20 + - "!": # 0x21 - test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':structure:')]" - then_test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then_test: if: "$Verbosity = 'Terse'" then: [T: "utropstecken"] # 0x21 (en: 'bang', google translation) else: [T: "utropstecken"] # 0x21 (en: 'exclamation point') @@ -95,7 +98,11 @@ if: "parent::*[1][self::m:mn]" then: [T: "punkt"] # (en: 'point', google translation) else: [T: "prick"] # (en: 'dot') - - "/": [T: "delat med"] # 0x2f (en: 'divided by') + - "/": # 0x2f (en: 'divided by') + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "snedstreck"] # 0x2f + else: [T: "delat med"] # 0x2f - ":": [T: "kolon"] # 0x3a (en: 'colon') - ";": [T: "semikolon"] # 0x3b (en: 'semicolon') - "<": # 0x3c @@ -103,7 +110,7 @@ if: "$Verbosity!='Terse'" then: [T: "är"] # (en: 'is', google translation) - T: "mindre än" # (en: 'less than') - - "=": # 0x3d + - "=": # audit-ignore 0x3d # SWEDISH: We remove "är" from all occurrences of = after consulting our mathematician advisor. - T: "lika med" # (en: 'equals', MathPlayer: 'lika med', google: 'lika') @@ -127,7 +134,11 @@ if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' then: [T: "slut hak-parentes"] # (en: 'close bracket', google translation) else: [T: "höger hak-parentes"] # (en: 'right bracket') - - "^": [T: "hatt"] # 0x5e (en: 'hat') + - "^": # 0x5e (en: 'hat') + - test: + if: "parent::m:modified-variable or parent::m:mover" + then: [T: "hatt"] + else: [T: "cirkumflex"] - "_": [T: "understreck"] # 0x5f (en: 'under bar', MathPlayer: 'streck under', google: 'under bar') - "`": [T: "grav accent"] # 0x60 (en: 'grave') - "{": # 0x7b @@ -142,16 +153,18 @@ variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) replace: - test: - - if: "$SpeechStyle != 'ClearSpeak'" + - if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "lodstreck"] + - else_if: "$SpeechStyle != 'ClearSpeak'" then_test: - if: "$DefaultToGiven" then: [T: "givet"] # given - else_if: "preceding-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))] and following-sibling::*[1][self::m:mn and not(contains(., $DecimalSeparators))]" then: [T: "delar"] # divides - else: [T: "lodstreckl"] # vertical line + else: [T: "lodstreck"] # vertical line - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" - then: [T: "lodstreckl"] # vertical line + then: [T: "lodstreck"] # vertical line - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" then: [T: "sådana att"] # such that - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" @@ -168,7 +181,8 @@ - "~": [T: "tilde"] # 0x7e - " ": # 0xa0 - test: - if: "@data-empty-in-2D and ../../../../*[name(.)!='equations']" + # could be mtext in mtd or mtext in an mrow that is a concatenation of mtd's. Is there a better solution? + if: "@data-empty-in-2D and not(ancestor::*[self::m:piecewise or self::m:system-of-equations or self::m:lines])" then: [T: "tom"] # want to say something for fraction (etc) with empty child (en: 'empty', google translation) else: [T: ""] @@ -178,17 +192,22 @@ - "´": [T: "akut accent"] # 0xb4 (en: 'acute') - "·": # 0xB7 - test: - if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolDot = 'Auto'" - then: [T: "gånger"] # (en: 'times', google translation) - else: [T: "halvhög punkt"] # (en: 'dot', MathPlayer: 'mellanpunkt', google: 'punkt') - - "×": # 0xd7 + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')] or not($SpeechStyle = 'ClearSpeak' and $ClearSpeak_MultSymbolDot = 'Auto')" + then: [T: "halvhög punkt"] + else: [T: "gånger"] + - "×": # 0xd7 - test: - if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolX = 'Auto'" - then: [T: "gånger"] # (en: 'times', google translation) + if: "$SpeechStyle = 'ClearSpeak'" + then_test: + - if: "$ClearSpeak_MultSymbolX = 'Auto'" + then: [T: "gånger"] + - else_if: "$ClearSpeak_MultSymbolX = 'By'" + then: [T: "gånger"] + else: [T: "kryss"] else_test: - if: $ClearSpeak_MultSymbolX = 'By' - then: [T: "gånger"] # (en: 'by', google translation) - else: [T: "kryss"] # (en: 'cross') + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "kryss"] + else: [T: "gånger"] - "÷": [T: "delat med"] # 0xf7 (en: 'divided by') - "̀": [T: "grav accent"] # 0x300 (en: 'grave accent embellishment', google: 'allvarlig accentutsmyckning') - "́": [T: "akut accent"] # 0x301 (en: 'acute accent embellishment', google: 'akut accentutsmyckning') @@ -218,7 +237,7 @@ - pitch: value: "$CapitalLetters_Pitch" # note: processing of ranges converts '.' into the character, so it needs to be in quotes below - replace: [spell: "translate('.', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ', 'αβγδεζηθικλμνξοπρςστυφχψω')"] + replace: [SPELL: "translate('.', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ', 'αβγδεζηθικλμνξοπρςστυφχψω')"] - "α": [T: "alfa"] # 0x3b1 (en: 'alpha') - "β": [T: "beta"] # 0x3b2 @@ -270,14 +289,8 @@ - "⁡": # 0x2061 - test: # skip saying "of" when Terse and a trig function, when it is a shape (does this happen?), or we are in :literal mode - # log is treated differently than trig functions - # Note: this differs from 'en' because the ClearSpeak and default rules are different from 'en' if: "not( - ( ( $SpeechStyle='ClearSpeak' or preceding-sibling::*[1][.='log' or .='ln' or .='lg'] and - IfThenElse(IsNode(following-sibling::*[1],'simple'), - true(), - $SpeechStyle='ClearSpeak' and $Verbosity!='Verbose') - ) and + ( $Verbosity='Terse' or ($SpeechStyle = 'ClearSpeak' and IsNode(following-sibling::*[1],'simple')) and preceding-sibling::*[1][IfThenElse($SpeechStyle='ClearSpeak', IsInDefinition(., 'ClearSpeakTrigFunctionNames'), IsInDefinition(., 'TrigFunctionNames') )] @@ -285,7 +298,7 @@ preceding-sibling::*[1][IsInDefinition(., 'GeometryShapes')] or (@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) )" - then: [T: "av"] # (en: 'of', google translation) + then: [T: "av"] - "⁢": [T: ""] # 0x2062 - "⁣": [T: ""] # 0x2063 - "⁤": [T: "och"] # 0x2064 (en: 'and', google: 'och') @@ -294,7 +307,7 @@ - "‴": [T: "tris"] # 0x2034 (en: 'triple prime') - "ℂℕℚℝℤ": # here we rely on this running through the table again to speak "cap xxx" - - spell: "translate('.', 'ℂℕℚℝℤ', 'CNQRZ')" + - SPELL: "translate('.', 'ℂℕℚℝℤ', 'CNQRZ')" - T: "med dubbelstreck" # (en: 'double-struck') # SWEDISH: Changed the order of words. @@ -302,17 +315,17 @@ - "℉": [T: "grader fahrenheit"] # 0x2109 (en: 'degrees fahrenheit') - "ℋℛℓ": # 0x210b - T: "skrivstilt" # (en: 'script', google: 'manus') - - spell: "translate('.', 'ℋℛℓ', 'HRl')" + - SPELL: "translate('.', 'ℋℛℓ', 'HRl')" - "ℎ": [T: "plancks konstant"] # 0x210e - "ℜ": # 0x211c - T: "fraktur" # (en: 'fraktur', google: 'fraktur') - - spell: "'R'" + - SPELL: "'R'" - "Ω": [T: "ohm"] # 0x2126 (en: 'ohms') - "K": [T: "grader kelvin"] # 0x212a (en: 'kelvin') - "Å": [T: "ångström"] # 0x212b - "ⅆⅇⅈⅉ": # 0x2146-9 - - spell: "translate('.', 'ⅆⅇⅈⅉ', 'deij')" + - SPELL: "translate('.', 'ⅆⅇⅈⅉ', 'deij')" - T: "med dubbelstreck kursiv" # (en: 'double-struck italic') - "←": [T: "vänster-pil"] # 0x2190 (en: 'leftwards arrow') @@ -326,13 +339,13 @@ - "↓": [T: "nedåt-pil"] # 0x2193 (en: 'downwards arrow') - "⇒": [T: "medför"] # 0x21d2 (en: 'rightwards double arrow') - "∀": [T: "för alla"] # 0x2200 (en: 'for all') - - "∂": [T: "dell"] # 0x2202 + - "∂": [T: "dell"] # audit-ignore 0x2202 # SWEDISH: This is only refered to as "del" in Swedish, but we write "dell" for correct pronounciation. - "∃": [T: "det finns"] # 0x2203 (en: 'there exists') - "∄": [T: "det finns inte"] # 0x2204 (en: 'there does not exist') - "∅": [T: "tomma mängden"] # 0x2205 (en: 'empty set') - - "∆": [T: "laplacianen av"] # 0x2206 (en: 'laplacian of') - - "∈": # 0x2208 + - "∆": [T: "laplacianen av"] # audit-ignore 0x2206 (en: 'laplacian of') + - "∈": # audit-ignore 0x2208 - test: if: "$SpeechStyle != 'ClearSpeak'" then: [T: "tillhörande"] # (en: 'an element of', google translation) @@ -353,7 +366,7 @@ - else_if: $ClearSpeak_SetMemberSymbol = 'In' then: [T: "är i"] # (en: 'is in', google translation) - else: [T: "tillhör"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') - - "∉": # 0x2209 + - "∉": # audit-ignore 0x2209 # rule is identical to 0x2208 - test: if: "$SpeechStyle != 'ClearSpeak'" @@ -375,7 +388,7 @@ - else_if: $ClearSpeak_SetMemberSymbol = 'In' then: [T: "är inte i"] # (en: 'is not in', google translation) - else: [T: "tillhör inte"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'does not belong to') - - "∊": # 0x220a + - "∊": # audit-ignore 0x220a - test: if: "$SpeechStyle != 'ClearSpeak'" then: [T: "tillhörande"] # (en: 'is an element of', google translation) @@ -403,7 +416,7 @@ - "∓": [T: "minus plus"] # 0x2213 (en: 'minus or plus') - "∗": [T: "gånger"] # 0x2217 (en: 'times') - "∘": [T: "och"] # 0x2218 (en: 'composed with') - - "√": [T: "kvadratroten ur"] # 0x221a (en: 'square root of') + - "√": [T: "kvadratroten ur"] # audit-ignore 0x221a (en: 'square root of') - "∝": # 0x221d - test: if: "$Verbosity!='Terse'" @@ -416,10 +429,14 @@ - "∣": [T: "delar"] # 0x2223 (en: 'divides') - "∤": [T: "delar inte"] # 0x2224 (en: 'does not divide') - "∥": # 0x2225 - - test: - if: "$Verbosity!='Terse'" - then: [T: "är"] # (en: 'is', google translation) - - T: "parallell med" # (en: 'parallel to') + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "dubbelt lodstreck"] + else: + - test: + if: "$Verbosity!='Terse'" + then: [T: "är"] + - T: "parallell med" - "∦": # 0x2226 - test: if: "$Verbosity!='Terse'" @@ -433,19 +450,19 @@ - "∬": [T: "dubbel-integralen"] # 0x222c (en: 'double integral') - "∭": [T: "trippel-integralen"] # 0x222d (en: 'triple integral') - "∮": [T: "kurvintegralen"] # 0x222e (en: 'contour integral') - - "∶": # 0x2236 + - "∶": # audit-ignore 0x2236 - T: "till" # (en: 'to') - "∷": [T: "som"] # 0x2237 (en: 'as', MathPlayer: 'proportion', google: 'som') - "∼": [T: "är proportionell mot"] # 0x223c (en: 'varies with') - "∽": [T: "spegelvänd tilde"] # 0x223d (en: 'reversed tilde') - - "∾": # 0x223e + - "∾": # audit-ignore 0x223e # SWEDISH: Could not find any examples of how this character is used and what specific meaning it has. In ClearSpeak rules, it is # translated as "omvänt långdraget s". - T: "omvänt långdraget s" # (en: 'most positive', MathPlayer: 'inverted lazy s', google: 'mest positiva') - "∿": [T: "sinuskurva"] # 0x223f (en: 'sine wave') - - "≠": # 0x2260 + - "≠": # audit-ignore 0x2260 - T: "inte lika med" # (en: 'not equal to') - - "≡": # 0x2261 + - "≡": # audit-ignore 0x2261 - T: "identisk med" # (en: 'identical to') - "≤": # 0x2264 - test: @@ -457,12 +474,12 @@ if: "$Verbosity!='Terse'" then: [T: "är"] # (en: 'is', google translation) - T: "större än eller lika med" # (en: 'greater than or equal to') - - "≦": # [t: "mindre än över lika med"] # 0x2266 (en: 'less than over equal to') + - "≦": # audit-ignore 0x2266 (en: 'less than over equal to') - test: if: "$Verbosity!='Terse'" then: [T: "är"] # (en: 'is', google translation) - T: "mindre än eller lika med" - - "≧": # [t: "större än över lika med"] # 0x2267 (en: 'greater than over equal to') + - "≧": # audit-ignore 0x2267 (en: 'greater than over equal to') - test: if: "$Verbosity!='Terse'" then: [T: "är"] # (en: 'is', google translation) From e58f5a173a2b94583f50a4ad87aaeb88025d17e8 Mon Sep 17 00:00:00 2001 From: AndersEkl Date: Thu, 23 Apr 2026 14:55:52 +0200 Subject: [PATCH 02/27] Test update --- Rules/Languages/sv/overview.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rules/Languages/sv/overview.yaml b/Rules/Languages/sv/overview.yaml index 27c65e618..eae919caa 100644 --- a/Rules/Languages/sv/overview.yaml +++ b/Rules/Languages/sv/overview.yaml @@ -1,5 +1,5 @@ --- -# Provide an overview/outline/description of the math +# Provide an overview/outline/description of the math expression # MathPlayer just tried to shorten things like "mfrac" by just saying "fraction" # For mrow, it say up to 5 operands and just say "and n more things" for the rest # This results in strings of varying length. Given human memory is about 7 words long, From 2b319c918819a47e5ee91f4ac5e9c951d80d0de3 Mon Sep 17 00:00:00 2001 From: AndersEkl Date: Thu, 23 Apr 2026 15:17:35 +0200 Subject: [PATCH 03/27] Updated geometry.yaml #2 --- Rules/Languages/sv/SharedRules/geometry.yaml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Rules/Languages/sv/SharedRules/geometry.yaml b/Rules/Languages/sv/SharedRules/geometry.yaml index b6393d37f..843e97ebe 100644 --- a/Rules/Languages/sv/SharedRules/geometry.yaml +++ b/Rules/Languages/sv/SharedRules/geometry.yaml @@ -32,7 +32,7 @@ - x: "*[1]" - x: "*[2]" -- name: geometry-arc +- name: geometry-arc # audit-ignore tag: arc match: "count(*)=2" replace: @@ -54,3 +54,19 @@ - x: "*[2]" - x: "*[3]" +- name: coordinate # audit-ignore + tag: coordinate + match: "." + replace: + - T: "punkten" # phrase(the 'point' at 1, 2) + - test: + if: "$Verbosity='Verbose'" + then: [T: "vid"] # phrase('the' point at 1, 2) + - pause: short + - insert: + nodes: "*" + replace: [T: "komma", pause: auto] # phrase(f of x 'comma' y) + - pause: short + - test: + if: "($SpeechStyle='ClearSpeak' and $Verbosity='Verbose') or not(IsNode(*[last()],'leaf'))" + then: [T: "slut punkt"] # phrase(start point, 'end point') \ No newline at end of file From 150188513fc1804166b597c762e434966d68c766 Mon Sep 17 00:00:00 2001 From: AndersEkl Date: Mon, 27 Apr 2026 11:18:30 +0200 Subject: [PATCH 04/27] Updated linear-algebra and calculus #3 #4 --- Rules/Languages/sv/SharedRules/calculus.yaml | 28 +++++++++--- .../sv/SharedRules/linear-algebra.yaml | 43 ++----------------- 2 files changed, 25 insertions(+), 46 deletions(-) diff --git a/Rules/Languages/sv/SharedRules/calculus.yaml b/Rules/Languages/sv/SharedRules/calculus.yaml index 20fcd91c9..62bd04eec 100644 --- a/Rules/Languages/sv/SharedRules/calculus.yaml +++ b/Rules/Languages/sv/SharedRules/calculus.yaml @@ -1,14 +1,30 @@ --- +- name: laplacian + tag: laplacian + match: "count(*) <= 1" # can be on ∇^2 or on enclosing mrow + replace: + - T: "laplacianen" # phrase('laplacian' of x) -- "LahPlahsian" sounds better with speech engines tested + - test: + if: "count(*) = 1" + then: + - test: + if: "$Verbosity!='Terse'" + then: [T: "av"] # phrase(function 'of' one variable) -- note OneCore voices spell out "div" + - test: + if: "not(IsNode(*[1], 'leaf'))" + then: [pause: short] + - x: "*[1]" + - name: divergence tag: divergence match: "." replace: - test: if: "$Verbosity='Verbose'" - then: [t: "divergence"] # phrase('divergence' from the mean) - else: [t: "div"] # phrase('divergence' from the mean) - - t: "of" # phrase(systems 'of' linear equations) + then: [T: "divergensen"] # phrase('divergence' from the mean) + else: [T: "div"] # phrase('divergence' from the mean) + - T: "av" # phrase(systems 'of' linear equations) - test: if: "not(IsNode(*[1], 'leaf'))" then: [pause: short] @@ -18,7 +34,7 @@ tag: curl match: "." replace: - - t: "curl of" # phrase(the 'curl of' a field) + - T: "rotationen av" # phrase(the 'curl of' a field) - test: if: "not(IsNode(*[1], 'leaf'))" then: [pause: short] @@ -30,8 +46,8 @@ replace: - test: if: "$Verbosity!='Terse'" - then: [t: "gradient of"] # phrase('divergence' from the mean) - else: [t: "del"] # phrase('divergence' from the mean) + then: [T: "gradienten av"] # phrase('divergence' from the mean) + else: [T: "dell"] # phrase('divergence' from the mean) - test: if: "not(IsNode(*[1], 'leaf'))" then: [pause: short] diff --git a/Rules/Languages/sv/SharedRules/linear-algebra.yaml b/Rules/Languages/sv/SharedRules/linear-algebra.yaml index df4f7e60f..02d346b8e 100644 --- a/Rules/Languages/sv/SharedRules/linear-algebra.yaml +++ b/Rules/Languages/sv/SharedRules/linear-algebra.yaml @@ -1,6 +1,6 @@ --- -- name: scalar-determinant +- name: scalar-determinant # audit-ignore tag: determinant match: "count(*)=1 and not(*[1][self::m:mtr])" replace: @@ -14,7 +14,7 @@ if: "not(IsNode(*[1], 'simple'))" then: [T: "slut determinant"] # phrase('end determinant' of a matrix) -- name: subscripted-norm +- name: subscripted-norm # audit-ignore tag: subscripted-norm match: "count(*)=2" replace: @@ -24,41 +24,4 @@ if: "$Verbosity!='Terse'" then: - T: "av" # phrase(systems 'of' linear equations) - - x: "*[1]" - -- name: homomorphism - # can't use IntentMappings because this doesn't fit the function pattern - tag: homomorphism - match: "count(*)=1" - replace: - - test: - if: "$Verbosity!='Terse'" - then: [T: "mängden av endomorfismer på"] - else: [T: "endomorfismerna på"] - - x: "*[1]" - - test: - if: "$Impairment = 'Blindness' and not(*[last()][IsBracketed(., '', '') or IsNode(., 'simple')] )" - then: [T: "slut endomorfismerna"] - - test: - if: "IsNode(., '2D')" - then: [pause: short] - else: [pause: auto] - -- name: kernel - # can't use IntentMappings because this doesn't fit the function pattern - tag: kernel - match: "count(*)=1" - replace: - - T: "noll-rummet" # phrase(this is the 'kernel' of the function) - - test: - if: "$Verbosity!='Terse'" - then: - - T: "till" # phrase(systems 'of' linear equations) - - x: "*[1]" - - test: - if: "$Impairment = 'Blindness' and not(*[last()][IsBracketed(., '', '') or IsNode(., 'simple')] )" - then: [T: "slut noll-rummet"] - - test: - if: "IsNode(., '2D')" - then: [pause: short] - else: [pause: auto] + - x: "*[1]" \ No newline at end of file From ffa747fb651bb921df093601e02472d8f004c853 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Arborealis=20L=C3=B6tberg?= <143188129+TimArborealis@users.noreply.github.com> Date: Wed, 13 May 2026 14:06:36 +0200 Subject: [PATCH 05/27] ClearSpeak_rules.yaml updated --- Rules/Languages/sv/ClearSpeak_Rules.yaml | 159 ++++++++++++++--------- 1 file changed, 94 insertions(+), 65 deletions(-) diff --git a/Rules/Languages/sv/ClearSpeak_Rules.yaml b/Rules/Languages/sv/ClearSpeak_Rules.yaml index 91c986cf6..0a9a32687 100644 --- a/Rules/Languages/sv/ClearSpeak_Rules.yaml +++ b/Rules/Languages/sv/ClearSpeak_Rules.yaml @@ -1,4 +1,19 @@ --- +- name: pause + tag: "!*" + match: "not(self::m:math) and not($MatchingPause) and @data-intent-property[contains(., ':pause')]" + replace: + - with: + variables: [MatchingPause: "true()"] + replace: + - test: + - if: "contains(@data-intent-property, ':pause-long')" + then: [pause: long] + - else_if: "contains(@data-intent-property, ':pause-short')" + then: [pause: short] + else: [pause: medium] + - x: "." + - name: intent-literal-silent tag: [mi, mo, mn] match: "contains(@data-intent-property, ':silent:')" @@ -13,7 +28,7 @@ - T: "minus" # phrase(10 'minus' 4 equals 6) - x: "translate(text(), '-_', '')" -- name: default +- name: default # audit-ignore tag: square-root match: "." replace: @@ -40,7 +55,7 @@ then: [pause: short] else: [pause: long] -- name: default +- name: default # audit-ignore tag: root match: "." replace: @@ -55,7 +70,7 @@ then: [T: "negativa"] # phrase(minus 6 is a 'negative' number) else: [T: "positiva"] # phrase(10 is a 'positive' number) - test: - if: "*[2][self::m:mn]" + if: "*[2][self::m:mn and not(contains(., '.'))]" then_test: - if: "*[2][.='2']" then: [T: "kvadratroten"] # phrase(5 is the 'square root' of 25) @@ -102,8 +117,8 @@ # Mixed numbers mostly "just work" because the invisible char reads as "and" and other parts read properly on their own # Units (e.g., meters per second) -# SWEDISH: Added rule for t="time" -- name: per-fraction +# SWEDISH: Added rule for t="timme" +- name: per-fraction # audit-ignore tag: fraction match: - "$ClearSpeak_Fractions='Per' or" @@ -121,7 +136,8 @@ - x: "*[2]" # Note: if the bounds change for what is a common fraction, change them in general.yaml for units -- name: common-fraction +# SWEDISH: changes made to accomodate fractions followed by neuter units (e.g. say "en tredjedels meter" instead of "ett tredjedels meter") +- name: common-fraction # audit-ignore tag: fraction match: - "($ClearSpeak_Fractions='Auto' or $ClearSpeak_Fractions='Ordinal' or $ClearSpeak_Fractions='EndFrac') and" @@ -179,7 +195,7 @@ else: [x: "*[2]", CT: "dels"] # this is wrong but shouldn't occur normally -- need to write a function to compute cardinal numbers as words -- name: fraction-over-simple +- name: fraction-over-simple # audit-ignore tag: fraction match: - "($ClearSpeak_Fractions='Over' or $ClearSpeak_Fractions='FracOver' or $ClearSpeak_Fractions='OverEndFrac') or" @@ -193,7 +209,7 @@ then: - test: if: "$Verbosity!='Terse'" - then: [T: "bråk"] # [ot: "the"] + then: [T: "bråk"] - pause: short else: - test: @@ -249,7 +265,7 @@ - T: "slut division" # phrase(7 over 8 'end fraction') - pause: short -- name: default +- name: default # audit-ignore tag: fraction match: "." replace: @@ -307,7 +323,7 @@ then: [T: "kvadrat"] # phrase(25 equals 5 'squared') else: [T: "kubik"] # phrase(625 equals 5 'cubed') -- name: function-power +- name: function-power # audit-ignore tag: power match: - "following-sibling::*[1][self::m:mo][.='⁡']" #invisible function apply @@ -356,7 +372,7 @@ - bookmark: "*[2]/@id" - T: "kubik" # phrase(5 'cubed' equals 125) -- name: simple-integer +- name: simple-integer # audit-ignore tag: power match: "*[2][self::m:mn][not(contains(., ','))]" replace: @@ -366,7 +382,7 @@ - x: "*[2]" - pause: short -- name: simple-negative-integer +- name: simple-negative-integer # audit-ignore tag: power match: - "*[2][self::m:minus and count(*)=1 and" @@ -379,7 +395,7 @@ - x: "*[2]" - pause: short -- name: simple-var +- name: simple-var # audit-ignore tag: power match: "*[2][self::m:mi][string-length(.)=1]" replace: @@ -398,7 +414,7 @@ # but the test cases all fall back to "raised to the exponent" when not "Auto" # If these are allowed for non-Auto values, then you end up with "...power power...". - # [xxx]^n - name: nested-squared-or-cubed + name: nested-squared-or-cubed # audit-ignore tag: power match: - "$ClearSpeak_Exponents = 'Auto' and" @@ -416,7 +432,7 @@ - x: "*[2]" - # - [xxx]^n - name: nested-negative-squared-or-cubed + name: nested-negative-squared-or-cubed # audit-ignore tag: power match: - "$ClearSpeak_Exponents = 'Auto' and" @@ -436,7 +452,7 @@ - x: "*[2]" - # [xxx] var^n - name: nested-var-squared-or-cubed + name: nested-var-squared-or-cubed # audit-ignore tag: power match: - "$ClearSpeak_Exponents = 'Auto' and" @@ -458,7 +474,7 @@ - x: "*[2]" - # -[xxx] var^n - name: nested-negative-var-squared-or-cubed + name: nested-negative-var-squared-or-cubed # audit-ignore tag: power match: - "$ClearSpeak_Exponents = 'Auto' and" @@ -505,13 +521,13 @@ # Some rules on mrows # - # the inference rules lump absolute value and cardinality together, so those rules are implemented here - name: ClearSpeak-absolute-value + name: ClearSpeak-absolute-value # audit-ignore tag: absolute-value match: "." # SWEDISH: Differentiate between the initial and ending declaration of the terms. variables: - - WordToSay: "IFTHENELSE($ClearSpeak_AbsoluteValue = 'Cardinality', 'kardinaliteten', 'absolutbeloppet')" - - EndToSay: "IFTHENELSE($ClearSpeak_AbsoluteValue = 'Cardinality', 'kardinalitet', 'absolutbelopp')" + - WordToSay: "IFTHENELSE($ClearSpeak_AbsoluteValue = 'Kardinaliteten', 'kardinaliteten', 'absolutbeloppet')" + - EndToSay: "IFTHENELSE($ClearSpeak_AbsoluteValue = 'Kardinalitet', 'kardinalitet', 'absolutbelopp')" replace: - x: "$WordToSay" - T: "av" # phrase(the absolute value 'of' 25) @@ -524,7 +540,7 @@ - x: "$EndToSay" - pause: short -- name: set +- name: set # audit-ignore tag: set match: "." replace: @@ -560,7 +576,7 @@ # onto the [not] [including]... part # SWEDISH: rewrote the intervals function to better deal with Swedish convention of speaking intervals -- name: ClearSpeak-intervals # avoid overriding with default "intervals" name +- name: ClearSpeak-intervals # audit-ignore variables: - is_intervals_start_infinity: "*[1][self::m:minus and count(*)=1 and *[1][.='∞']]" - is_intervals_end_infinity: "*[2][.='∞'or (self::m:plus and count(*)=1 and *[1][.='∞'])]" @@ -602,6 +618,7 @@ - name: ClearSpeak-default tag: [mtr, mlabeledtr] match: "parent::m:matrix or parent::m:determinant" + variables: [NextLineIsContinuedRow: "following-sibling::*[1][contains(@data-intent-property, ':continued-row:')]"] replace: - pause: medium - T: "rad" # phrase(the first 'row' of a matrix) @@ -614,12 +631,12 @@ - pause: short - pause: medium - test: - if: .[self::m:mlabeledtr] + if: ".[self::m:mlabeledtr]" then: [x: "*[position()>1]"] else: [x: "*"] -- # handle both log and ln - name: ClearSpeak-log +- # handle both log and ln | SWEDISH: also handle lg + name: ClearSpeak-log # audit-ignore tag: mi match: ".='log' or .='lg' or .='ln'" variables: [log_is_simple: "IsNode(following-sibling::*[2],'simple')"] @@ -630,10 +647,10 @@ - if: ".='log'" then: [T: "logg"] # phrase(the 'log' of x) - else_if: ".='lg'" - then: [spell: "'lg'"] # phrase(the 'lg' of x) + then: [SPELL: "'lg'"] # phrase(the 'lg' of x) - else_if: $ClearSpeak_Log = 'LnAsNaturalLog' then: [T: "naturliga logaritmen"] # phrase(the 'natural log' of the product of 2 numbers) - else: [spell: "'ln'"] + else: [SPELL: "'ln'"] else: - test: - if: ".='log'" @@ -647,20 +664,24 @@ - test: - if: "$Verbosity='Verbose'" then: [T: "tio-logaritmen"] - else: [spell: "'lg'"] # phrase(the 'lg' of x) + else: [SPELL: "'lg'"] # phrase(the 'lg' of x) - else_if: $ClearSpeak_Log = 'LnAsNaturalLog' or $Verbosity='Verbose' then: [T: "naturliga logaritmen"] # phrase(the 'natural log' of x) - else: [spell: "'ln'"] + else: [SPELL: "'ln'"] -- name: ClearSpeak-multi-line +- name: ClearSpeak-multi-line # audit-ignore tag: [piecewise, system-of-equations, lines] # these are ignored in favor of the ClearSpeak prefs match: "." - variables: [IsColumnSilent: true()] + variables: + # Wikipedia has some tables where all the entire first column is empty (e.g., https://en.wikipedia.org/wiki/List_of_trigonometric_identities) + - LineCount: "count(*[not(contains(@data-intent-property, ':continued-row:'))])" + - NextLineIsContinuedRow: "false()" # default value + - IsColumnSilent: true() replace: - - x: "count(*)" - test: - if: $ClearSpeak_MultiLineOverview = 'Auto' then: + - x: "$LineCount" - test: - if: "($ClearSpeak_MultiLineLabel = 'Auto' and self::m:piecewise) or $ClearSpeak_MultiLineLabel = 'Case'" then: @@ -668,7 +689,7 @@ - if: "count(*) > 1 and $ClearSpeak_MultiLineLabel != 'None'" then: [T: "fall"] else: [T: "fall"] # phrase(this is the first 'case' of three cases) - - else_if: "$ClearSpeak_MultiLineLabel = 'Auto' or $ClearSpeak_MultiLineLabel = 'Line'" # already dealt with Auto/Case + - else_if: "$ClearSpeak_MultiLineLabel = 'Auto' or $ClearSpeak_MultiLineLabel = 'Line' or $ClearSpeak_MultiLineLabel = 'None'" # already dealt with Auto/Case then: - test: - if: "count(*) > 1 and $ClearSpeak_MultiLineLabel != 'None'" @@ -705,39 +726,41 @@ - name: ClearSpeak-default-multiline tag: [mtr, mlabeledtr] match: "parent::m:piecewise or parent::m:system-of-equations or parent::m:lines" + variables: [NextLineIsContinuedRow: "following-sibling::*[1][contains(@data-intent-property, ':continued-row:')]"] replace: - - pause: medium - test: - - if: "($ClearSpeak_MultiLineLabel = 'Auto' and parent::m:piecewise) or $ClearSpeak_MultiLineLabel = 'Case'" - then: [T: "fall"] # phrase(in this 'case' x is not equal to y) - - else_if: "$ClearSpeak_MultiLineLabel = 'Auto' or $ClearSpeak_MultiLineLabel = 'Line'" # already dealt with Auto/Case - then: [T: "rad"] # phrase(the straight 'line' between x and y) - - else_if: "$ClearSpeak_MultiLineLabel = 'Constraint'" - then: [T: "avgränsning"] # phrase(there is a 'constraint' on possible values) - - else_if: "$ClearSpeak_MultiLineLabel = 'Equation'" - then: [T: "ekvation"] # phrase(the 'equation' pi r squared gives the area of a circle) - - else_if: "$ClearSpeak_MultiLineLabel = 'Row'" - then: [T: "rad"] # phrase(the values on the top 'row' are relevant) - - else_if: "$ClearSpeak_MultiLineLabel = 'Step'" - then: [T: "steg"] # phrase(this is a 'step' by step process) - # else 'None -- don't say anything' - - test: - if: "$ClearSpeak_MultiLineLabel != 'None'" + if: "not($LineCount=1 or $ClearSpeak_MultiLineLabel='None' or contains(@data-intent-property, ':continued-row:'))" then: - - x: "count(preceding-sibling::*)+1" - - test: - if: .[self::m:mlabeledtr] - then: - - T: "med etiketten" # phrase(the item 'with label' complete) - - x: "*[1]/*" - pause: medium + - test: + - if: "($ClearSpeak_MultiLineLabel = 'Auto' and parent::m:piecewise) or $ClearSpeak_MultiLineLabel = 'Case'" + then: [T: "fall"] # phrase(in this 'case' x is not equal to y) + - else_if: "$ClearSpeak_MultiLineLabel = 'Auto' or $ClearSpeak_MultiLineLabel = 'Line'" # already dealt with Auto/Case + then: [T: "rad"] # phrase(the straight 'line' between x and y) + - else_if: "$ClearSpeak_MultiLineLabel = 'Constraint'" + then: [T: "avgränsning"] # phrase(there is a 'constraint' on possible values) + - else_if: "$ClearSpeak_MultiLineLabel = 'Equation'" + then: [T: "ekvation"] # phrase(the 'equation' pi r squared gives the area of a circle) + - else_if: "$ClearSpeak_MultiLineLabel = 'Row'" + then: [T: "rad"] # phrase(the values on the top 'row' are relevant) + - else_if: "$ClearSpeak_MultiLineLabel = 'Step'" + then: [T: "steg"] # phrase(this is a 'step' by step process) + # else 'None -- don't say anything' + - x: "count(preceding-sibling::*[not(contains(@data-intent-property, ':continued-row:'))]) + 1" - test: - if: .[self::m:mlabeledtr] + if: "self::m:mlabeledtr" + then: + - T: "med etiketten" # phrase(the diagram is complete 'with label') + - x: "*[1]/*" + - test: + - if: "$ClearSpeak_MultiLineLabel='None'" + then: [pause: xlong] # need a very long pause with no line labels + - else_if: "not(contains(@data-intent-property, ':continued-row:'))" + then: [pause: medium] + - test: + if: "self::m:mlabeledtr" then: [x: "*[position()>1]"] else: [x: "*"] - - test: - if: "$ClearSpeak_MultiLineLabel != 'None'" - then: [pause: long] - name: ClearSpeak_Functions_None tag: mo @@ -764,16 +787,21 @@ # say "times" when invisible times is followed by parens or a superscript that has a base with parens or "|"s # if we aren't sure if it is times or not, don't say anything - ".='⁢' and (not(@data-function-guess) or $ClearSpeak_Functions = 'None') and" - - "not(ancestor-or-self::*[contains(@data-intent-property, ':structure:')]) and (" + - "not(ancestor-or-self::*[contains(@data-intent-property, ':literal:')]) and (" - " $ClearSpeak_ImpliedTimes = 'MoreImpliedTimes'" - " or " - " following-sibling::*[1][" - " IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|') or " + # most of these aren't mentioned in ClearSpeak spec, but are (I think) expected uses of "times" - " self::m:matrix or self::m:determinant or self::m:binomial or" # followed by parens - - " ( (self::m:msup or self::m:msub or self::m:msubsup or self::m:power) and " # followed by msup, etc. - - " *[1][self::m:mrow[IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|')] or " - - " self::m:matrix or self::m:determinant]" # base has parens - - " )" + - " self::m:square-root or self::m:msqrt or self::m:root or self::m:mroot or" + - " (self::m:msub or self::m:msubsup or" + - " ((self::m:msup or self::m:power) and not(IsNode(*[1], 'leaf') and *[2][self::m:mn and (.=2 or '.=3')]))) and " # followed by msup, etc. + - " (*[1][self::m:mrow[IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|')] or " + - " self::m:matrix or self::m:determinant] or" # base has parens + - " not(IsNode(*[2], 'simple')) or " + - " (self::m:msubsup and not(IsNode(*[3], 'simple')))" + - " )" - " ]" # other possibility is the preceding element has parens (but not the following) # this is not mentioned in the ClearSpeak rules or examples but seems like it should say "times". E.g, |x| y @@ -795,7 +823,8 @@ - "not( $ClearSpeak_ImpliedTimes = 'None' and " - " (preceding-sibling::*[1][.='⁢'] or following-sibling::*[1][.='⁢']) ) and " - "IsNode(*[2], 'simple') and" - - "not(ancestor-or-self::*[contains(@data-intent-property, ':structure:')])" + - "not(preceding-sibling::*[1][.='\u2062' and @data-function-guess]) and" + - "not(ancestor-or-self::*[contains(@data-intent-property, ':literal:')])" # missing clause: 'a positive fraction that is spoken as an ordinal # (either by the Ordinal preference or by the default rules)' replace: From add00a910a8d01d5b25e9660226657fbe85d1b8c Mon Sep 17 00:00:00 2001 From: AndersEkl Date: Wed, 20 May 2026 11:08:11 +0200 Subject: [PATCH 06/27] Update overview.yaml Close #10 --- Rules/Languages/sv/overview.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Rules/Languages/sv/overview.yaml b/Rules/Languages/sv/overview.yaml index eae919caa..47bd04d30 100644 --- a/Rules/Languages/sv/overview.yaml +++ b/Rules/Languages/sv/overview.yaml @@ -13,7 +13,7 @@ # That might mean that at the top level, we may want to allow the first few children to expand - name: overview-default - tag: mfrac + tag: [mfrac, fraction] match: "." replace: - test: @@ -26,7 +26,7 @@ - T: "bråk" - name: overview-default - tag: msqrt + tag: [msqrt, "square-root"] match: "." replace: - T: "roten" @@ -38,8 +38,8 @@ then: [T: "ur"] - x: "*[1]" -- name: overview-default - tag: mroot +- name: overview-default # audit-ignore + tag: [mroot, root] match: "." replace: - test: From 568b4362f4c3ad844320a8f5474f1335e332b44e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Arborealis=20L=C3=B6tberg?= <143188129+TimArborealis@users.noreply.github.com> Date: Wed, 27 May 2026 11:57:05 +0200 Subject: [PATCH 07/27] Update navigate.yaml --- Rules/Languages/sv/navigate.yaml | 3088 ++++++++++++++++++++++-------- 1 file changed, 2286 insertions(+), 802 deletions(-) diff --git a/Rules/Languages/sv/navigate.yaml b/Rules/Languages/sv/navigate.yaml index 4d37c5eea..7fcaf960e 100644 --- a/Rules/Languages/sv/navigate.yaml +++ b/Rules/Languages/sv/navigate.yaml @@ -33,152 +33,131 @@ # ReadZoomLevel -- -1 for Enhanced, otherwise the distance from leaf the rules should maintain # PlaceMarkerIndex - -# Rules for speaking what happens when moving into or out of a notation -- name: into-or-out-of - tag: mfrac - match: "$Move2D != ''" - replace: - - x: "$Move2D" - - test: - if: "count($Child2D/preceding-sibling::*)=0" - then: [T: "täljaren"] # phrase(the 'numerator' of a fraction) - else: [T: "nämnaren"] # phrase(the 'denominator' of a fraction) - - pause: "medium" - -- name: into-or-out-of - tag: msqrt - match: "$Move2D != ''" - replace: - - x: "$Move2D" - - T: "kvadratroten" # phrase(the 'square root' of x) - - pause: "medium" - -- name: into-or-out-of - tag: mroot - match: "$Move2D != ''" - replace: - - x: "$Move2D" - - test: - if: "count($Child2D/preceding-sibling::*)=0" - then: [T: "roten"] # phrase(the cube 'root' of x) - else: [T: "rotindexet"] # phrase(the 'root index' of x is 3) - - pause: "medium" - -- name: into-or-out-of - tag: msub - match: "$Move2D != ''" - replace: - - x: "$Move2D" - - test: - if: "count($Child2D/preceding-sibling::*)=0" - then: [T: "basen"] # phrase(the 'base' of the power) - else: [T: "nedre index"] # phrase(x with 'subscript' 2) - - pause: "medium" - -- name: into-or-out-of - tag: msup - match: "$Move2D != ''" - replace: - - x: "$Move2D" - - test: - if: "count($Child2D/preceding-sibling::*)=0" - then: [T: "basen"] # phrase(the 'base' of the power) - else: [T: "övre index"] # phrase(x with 'superscript' 2) # FIX: it would be better to use the word used when reading (power, exponent, ...) - - pause: "medium" - -- name: into-or-out-of - tag: msubsup - match: "$Move2D != ''" - replace: - - x: "$Move2D" - - test: - - if: "count($Child2D/preceding-sibling::*)=0" - then: [T: "basen"] # phrase(the 'base' of the power) - - else_if: "count($Child2D/preceding-sibling::*)=1" - then: [T: "nedre index"] # phrase(x with 'subscript' 2) - else: [T: "övre index"] # phrase(x with 'superscript' 2) # FIX: it would be better to use the word used when reading (power, exponent, ...) - - pause: "medium" - -- name: into-or-out-of - tag: munder - match: "$Move2D != ''" +# Rules for announcing the command +- name: say-command + tag: "!*" + match: "$SayCommand != ''" # value should be '', 'true', or 'false' + variables: [Prefix: "''"] replace: - - x: "$Move2D" - test: - if: "count($Child2D/preceding-sibling::*)=0" - then: [T: "basen"] # phrase(the 'base' of the power) - else: [T: "nedre index"] # phrase(the 'lower limit' of the function is zero) - - pause: "medium" - -- name: into-or-out-of - tag: mover - match: "$Move2D != ''" - replace: - - x: "$Move2D" - - test: - if: "count($Child2D/preceding-sibling::*)=0" - then: [T: "basen"] # phrase(the 'base' of the power) - else: [T: "övre index"] # phrase(the 'upper limit' of the function is zero) - - pause: "medium" + - if: "$MatchCounter = 0 and $SayCommand = 'true'" + then_test: + - if: "self::m:math and starts-with($NavCommand, 'ZoomOut')" + then: [T: "zoomat helt ut", pause: "medium"] + - else_if: "IsNode(., 'leaf') and starts-with($NavCommand, 'ZoomIn')" + then: + - test: + - if: "string-length(.) = 1" + then: [T: "zoomat helt in"] # phrase('zoomed in all of the way') + - else_if: "$NavNodeOffset = 0" + then: [T: "zoomat in till första tecknet"] # phrase('zoomed in to first character') + else: [T: "zoomat in till tecken"] # phrase('zoomed in to character') + - pause: "medium" + else: + - test: + - if: "starts-with($NavCommand, 'Zoom')" + then: [set_variables: [Prefix: "'zooma'"]] # phrase('zoom' in to see more details) + - else_if: "starts-with($NavCommand, 'Move')" + then: [set_variables: [Prefix: "'gå'"]] # phrase('move' to next entry in table) + - else_if: "starts-with($NavCommand, 'Read')" + then: [set_variables: [Prefix: "'läs'"]] # phrase('read' to next entry in table) + - else_if: "starts-with($NavCommand, 'Describe')" + then: [set_variables: [Prefix: "'beskriv'"]] # phrase('describe' to next entry in table) + - test: + if: "$Prefix != ''" + then: + - x: "$Prefix" + - test: + - if: "substring($NavCommand, string-length($Prefix)+1) = 'In'" + then: [T: "in"] # phrase(zoom 'in' to see more details) + - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'InAll'" + # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets "ed" concatenated to "zoom" + then: [T: "\uF8FEat helt in"] # phrase(zoom 'out all of the way' to see more details) + - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Out'" + then: [T: "ut"] # phrase(zoom 'out' to see more details) + - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'OutAll'" + # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets "ed" concatenated to "zoom" + then: [T: "\uF8FEat helt ut"] # phrase(zoom 'out all of the way' to see more details) + - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Next'" + then: [T: "höger"] # phrase(move to the 'right') + - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Previous'" + then: [T: "vänster"] # phrase(move to the 'left') + - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Current'" + then: [T: "nuvarande"] # phrase(who is the 'current' president) + - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'LineStart'" + then: [T: "till början av raden"] # phrase(move 'to start of line') + - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'LineEnd'" + then: [T: "till slutet av raden"] # phrase(move 'to end of line') + - pause: "medium" + - set_variables: [MatchCounter: "$MatchCounter + 1"] + +- name: into-or-out-of-silent + tag: "*" + # saying "out of row n" is not very useful, so skip it + match: "$Move2D != '' and (not(@data-from-mathml) or @data-from-mathml = name(.)) and + (name(.)='mrow' or name(.) = 'mtr' or name(.) = 'mlabeledtr' or @data-from-mathml = 'mtable')" + replace: [] -- name: into-or-out-of - tag: munderover - match: "$Move2D != ''" +- name: into-or-out-of-mtr + tag: [mtr, mlabeledtr] + match: "$Move2D = 'i'" # Navigate into a 2D structure. replace: - - x: "$Move2D" - - test: - - if: "count($Child2D/preceding-sibling::*)=0" - then: [T: "basen"] # phrase(the 'base' of the power) - - else_if: "count($Child2D/preceding-sibling::*)=1" - then: [T: "nedre index"] # phrase(the 'lower limit' of the function is zero) - else: [T: "övre index"] # phrase(the 'upper limit' of the function is zero) + - T: "kolumn" + - x: "count($Child2D/preceding-sibling::*)+1" # Count number of sibling nodes before Child2D (the node being navigated into) and add 1 to get the column number. - pause: "medium" -- name: into-or-out-of - tag: mmultiscripts - match: "$Move2D != ''" +- name: into-or-out-of-mmultiscripts + tag: "*" + match: "$Move2D != '' and (@data-from-mathml='mmultiscripts' or self::m:mmultiscripts)" # Navigate into a 2D structure that is a mmultiscripts. replace: - test: - if: "name($Child2D)!='none'" + if: "name($Child2D)!='none'" # Check that the child being navigated into is not empty. then: - with: variables: - - NumPrecedingSiblings: "count($Child2D/preceding-sibling::*)" + - NumPrecedingSiblings: "count($Child2D/preceding-sibling::*)" # Store the number of siblings before the target node. replace: - - x: "$Move2D" + - x: "$Move2D" # Say the direction (into/out of) - test: - - if: "$NumPrecedingSiblings=0" - then: [T: "basen"] # phrase(the 'base' of the power) - - else_if: "$Child2D/preceding-sibling::*[self::m:mprescripts]" # are we before mprescripts and hence are postscripts + - if: "$NumPrecedingSiblings=0" # No siblings before the target node + then: [T: "bas"] # phrase(the 'base' of the power) + - else_if: "$Child2D/preceding-sibling::*[self::m:mprescripts]" # Are we after the tag? If so, we are in the prescripts. then: - test: # in postscripts -- base shifts by one - if: "$NumPrecedingSiblings mod 2 = 0" - then: [T: "nedre index"] # phrase(x with 'subscript' 2) - else: [T: "övre index"] # phrase(x with 'superscript' 2) + if: "$NumPrecedingSiblings mod 2 = 0" + then: [T: "nedre vänstra index"] # phrase(x with 'subscript' 2) + else: [T: "övre vänstra index"] # phrase(x with 'superscript' 2) else: - test: if: "$NumPrecedingSiblings mod 2 = 0" - then: [T: "övre index"] # phrase(x with 'superscript' 2) - else: [T: "nedre index"] # phrase(x with 'subscript' 2) + then: [T: "övre index"] # phrase(x with 'pre-superscript' 2) + else: [T: "nedre index"] # phrase(x with 'pre-subscript' 2) - pause: "medium" -- name: into-or-out-of - tag: mtd - match: "$Move2D = 'into'" - replace: - - x: "$Move2D" - - T: "kolumn" # phrase(the first 'column' in the table) - - x: "count($Child2D/preceding-sibling::*)+1" - - pause: "medium" - -- name: into-or-out-of - tag: [mtr, mlabeledtr] - match: "$Move2D = 'into'" +# Rules for speaking what happens when moving into or out of a notation +- name: into-or-out-of-default + tag: "*" + # saying "out of row n" is not very useful, so skip it + # match: "$Move2D != '' and @data-from-mathml and @data-from-mathml != name(.) and count(*)>1 and @data-from-mathml != 'mtable'" + match: "$Move2D != '' and not(self::m:math or @data-from-mathml = 'mtable' or @data-from-mathml = 'mtd') " replace: - - x: "$Move2D" - - x: "count($Child2D/preceding-sibling::*)+1" - - pause: "medium" + - with: + variables: + - PartNumber: "count($Child2D/preceding-sibling::*)" # Count the number of siblings before the target node + - PartName: "GetNavigationPartName(name(.), $PartNumber)" # Find the name of the part. E.g., numerator/denominator, base/exponent + replace: + - x: "$Move2D" # into/out of + - test: + - if: "$PartName != ''" # if a name for the part exists + then: [x: "$PartName"] + - else_if: "count(*) = 1" # if the node has one child + then_test: + if: "$NavVerbosity = 'Verbose'" + then: [x: "translate(name(.), '-_', ' ')"] # e.g., "in absolute value" + else: + - T: "del" # phrase(the 'part' of the expression) + - x: "count($Child2D/preceding-sibling::*) + 1" + - pause: "medium" - name: default-move # nothing to do (not 2D) -- need to catch $Move2D though so rules based on NavCommand don't trigger @@ -203,16 +182,16 @@ - else_if: "$PreviousNavCommand = 'ZoomOut'" then: [T: "ångra utzoomning"] # phrase('undo zoom out') - else_if: "$PreviousNavCommand = 'ZoomInAll'" - then: [T: "ångra inzoomning hela vägen"] # phrase('undo zooming in all the way') + then: [T: "ångra inzoomning hela vägen"] # phrase('undo zooming in all of the way') - else_if: "$PreviousNavCommand = 'ZoomOutAll'" - then: [T: "ångra utzoomning hela vägen"] # phrase('undo zooming out all the way') + then: [T: "ångra utzoomning hela vägen"] # phrase('undo zooming out all of the way') - else_if: "$PreviousNavCommand = 'MovePrevious' or $PreviousNavCommand = 'MovePreviousZoom'" then: [T: "ångra gå vänster"] # phrase('undo move left') - else_if: "$PreviousNavCommand = 'MoveNext' or $PreviousNavCommand = 'MoveNextZoom'" then: [T: "ångra gå höger"] # phrase('undo move right') - else_if: "$PreviousNavCommand = 'None'" then: [T: "inget tidigare kommando"] # phrase('no previous command') - - pause: "long" + - pause: "medium" - set_variables: [NavNode: "@id"] # many times, for typographic reasons, people include punctuation at the end of a math expr @@ -228,46 +207,34 @@ # ********* ZoomIn *************** - name: zoom-in-leaf - tag: "*" match: "($NavCommand = 'ZoomIn' or $NavCommand = 'ZoomInAll') and IsNode(., 'leaf')" replace: + - with: + variables: [SayCommand: "string($NavVerbosity != 'Terse')"] + replace: [x: "."] - test: - if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" - then: [T: "inzoomat hela vägen", pause: "long"] # phrase('zoomed in all of the way') - - test: - if: "$ReadZoomLevel!=-1" + if: "$ReadZoomLevel !=-1" then: - set_variables: [ReadZoomLevel: "0"] - - set_variables: [NavNode: "@id"] + - set_variables: + - NavNode: "@id" + - NavNodeOffset: "IfThenElse(string-length(.) > 1 and $MatchCounter = 1 and $NavNodeOffset = 0, '1', '0')" -# special case of zooming into a matrix or determinant -- move to the first row -- name: zoom-in-matrix - - tag: mrow - match: - - "$NavCommand = 'ZoomIn' and count(*)=3 and " - - "*[2][self::m:mtable and (IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|'))]" - replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: [T: "zooma in", pause: "long"] # phrase('zoom in') - - set_variables: [NavNode: "*[2]/*[1]/@id"] - -# special case of zooming into a table -- move to the first row +# special case of zooming into a table -- move to the first row (if only one row, first column) - name: zoom-in-table - tag: mtable - match: "$NavCommand = 'ZoomIn'" + tag: "*" + match: "$NavCommand = 'ZoomIn' and (name(.) = 'mtable' or (count(*)=1 and *[1][@data-from-mathml='mtable']))" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: [T: "zooma in", pause: "long"] # phrase('zoom in') - - set_variables: [NavNode: "*[1]/@id"] + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - set_variables: [NavNode: "IfThenElse(count(*)=1, (*[1]/*[1]/@id), (*[1]/@id))"] - name: zoom-in-mrow-in-math - # Moving to first or last is meaningless the 'math' has only an 'mrow' inside -- dig inside and do it again + # zooming in only once is meaningless because 'math' has only a single child and it was spoken at the math level -- dig inside and do it again tag: math - match: "count(*)=1 and ($NavCommand = 'ZoomIn' or $NavCommand = 'MoveNextZoom' or $NavCommand = 'MovePreviousZoom')" + match: "$NavCommand = 'ZoomIn' or $NavCommand = 'MoveNextZoom' or $NavCommand = 'MovePreviousZoom'" replace: - test: if: "$NavCommand = 'MovePreviousZoom'" @@ -275,33 +242,39 @@ else: [x: "*[1]"] - # For msqrt and menclose, if the single child isn't an mrow, don't zoom in + # Norwegian: Not sure if the word "in" should be translated or not. name: zoom-in-again - # If there is only one child, this isn't an interesting move -- zoom in again tag: "*" match: - "($NavCommand = 'ZoomIn' or " - " ($NavCommand = 'MoveNextZoom' or $NavCommand = 'MovePreviousZoom') and $NavMode='Enhanced') and " - - "count(*)=1 and (*[1][self::m:mrow] and not(self::m:msqrt or self::m:menclose))" + - "count(*)=1 and + (*[1][self::m:mrow or @data-from-mathml='mrow'] and + not(@data-from-mathml='msqrt' or self::m:msqrt or @data-from-mathml='menclose' or self::m:menclose))" # current node has one child that is an . The current node is not msqrt or menclose. replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: [T: "zooma in", pause: "long"] # phrase('zoom in') - with: - variables: [MatchCounter: "$MatchCounter + 1"] - replace: - - test: - if: "$NavCommand = 'MovePreviousZoom'" - then: [x: "*[last()]"] - else: [x: "*[1]"] + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] # if verbosity is verbose, SayCommand is set to true, otherwise false + replace: [x: "."] # continue with the current node + - test: + if: "not(*[1][self::m:mrow or @data-from-mathml='mrow'])" + then: + - with: + # Set Move2D to "i". + # Set Child2D to the last child if the command is "MovePreviousZoom", otherwise the first child. + variables: [Move2D: "'i'", Child2D: "IfThenElse($NavCommand = 'MovePreviousZoom', (*[last()]), (*[1]))"] # phrase('in' the denominator) + replace: [x: "IfThenElse($NavCommand = 'MovePreviousZoom', 1, $Child2D)"] + - test: + if: "$NavCommand = 'MovePreviousZoom'" + then: [x: "*[last()]"] + else: [x: "*[1]"] - name: zoom-in-enhanced - tag: "*" match: "$NavCommand = 'ZoomIn' and $NavMode='Enhanced'" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: [T: "zooma in", pause: "long"] # phrase('zoom in') + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: - if: "self::m:mtr or self::m:mlabeledtr" then: @@ -309,89 +282,91 @@ variables: [Move2D: "'i'", Child2D: "*[1]/*[1]"] # phrase('in' the denominator) replace: [x: "."] - set_variables: [NavNode: "*[1]/*[1]/@id"] # skip mtd - - else_if: "*[1][self::m:mrow and IsBracketed(., '(', ')', false) or IsBracketed(., '[', ']', false)]" # auto zoom + - else_if: "*[1][self::m:mrow and (IsBracketed(., '(', ')', false) or IsBracketed(., '[', ']', false))]" # auto zoom then: - with: - variables: [Move2D: "'i'", Child2D: "*[1]/*[2]"] # phrase('in' the denominator) + variables: [Move2D: "'i'", Child2D: "*[1]"] # phrase('in' the denominator) replace: [x: "."] - - set_variables: [NavNode: "*[1]/*[2]/@id"] # skip mtd + - set_variables: [NavNode: "*[1]/*[2]/@id"] # skip parens/brackets else: - with: variables: [Move2D: "'i'", Child2D: "*[1]"] # phrase('in' the denominator) replace: [x: "."] - - set_variables: [NavNode: "*[1]/@id"] + # "(...)" to get around some weird parse bug" + - set_variables: + - NavNode: "*[1]/@id" + - NavNodeOffset: "IfThenElse(*[1]/@data-id-offset, (*[1]/@data-id-offset), '0')" -- name: zoom-in-2D-not-enhanced +- name: zoom-in-simple tag: "*" - match: "$NavCommand = 'ZoomIn' and $NavMode!='Enhanced' and IsNode(., '2D')" + match: "$NavCommand = 'ZoomIn' and $NavMode='Simple'" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: [T: "zooma in", pause: "long"] # phrase('zoom in') - with: - variables: [Move2D: "'i'", Child2D: "*[1]"] # phrase('in' the denominator) + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] replace: [x: "."] - - with: - variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MoveNextZoom'"] - replace: [x: "*[1]"] + - test: + if: "$MatchCounter > 1 and IsNode(., '2D')" + then: + - set_variables: # time to stop, not going "in" to next thing, so before "Move2D" + - NavNode: "@id" + - NavNodeOffset: "IfThenElse(@data-id-offset, @data-id-offset, '0')" + else: + - with: + variables: [Move2D: "'i'", Child2D: "*[1]"] # phrase('in' the denominator) + replace: [x: "."] + - x: "*[1]" -- name: zoom-in-default + # At this point, we are zooming in on a non-2D element, non-leaf in Character mode +- name: zoom-in-2D-character tag: "*" - match: "$NavCommand = 'ZoomIn'" + match: "$NavCommand = 'ZoomIn' and (IsNode(., '2D') or not(IsNode(., 'mathml')))" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: [T: "zooma in", pause: "long"] # phrase('zoom in') - with: - variables: [Move2D: "'i'", Child2D: "*[1]"] # phrase('in' the denominator) + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - with: + variables: [Move2D: "'i'", Child2D: "*[1]"] # phrase('in' the denominator) replace: [x: "."] - test: - if: "$NavMode='Character'" + if: "$NavMode = 'Simple'" then: + - set_variables: [NavNode: "*[1]/@id"] + else: - with: - variables: [MatchCounter: "$MatchCounter + 1"] + variables: [NavCommand: "'MoveNextZoom'"] replace: [x: "*[1]"] - else_test: - if: "self::m:mtd" - then: [x: "*[1]"] - else: - - test: - if: "$ReadZoomLevel!=-1" - then: - - set_variables: [ReadZoomLevel: "DistanceFromLeaf(*[1], true, $NavMode!='Character')"] - - set_variables: [NavNode: "*[1]/@id"] + + # At this point, we are zooming in on a non-2D element, non-leaf in Character mode +- name: zoom-in-default + tag: "*" + match: "$NavCommand = 'ZoomIn'" + replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - x: "*[1]" - name: zoom-in-all-default tag: "*" match: "$NavCommand = 'ZoomInAll'" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: [T: "zooma in hela vägen", pause: "medium"] # phrase('zoom in all the way') - with: - variables: [Move2D: "'i'", Child2D: "*[1]"] # phrase('in' the denominator) + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] replace: [x: "."] - with: - variables: [MatchCounter: "$MatchCounter + 1"] - replace: [x: "*[1]"] + variables: [Move2D: "'i'", Child2D: "*[1]"] # phrase('in' the denominator) + replace: [x: "."] + - x: "*[1]" - name: zoom-out tag: math match: "$NavCommand = 'ZoomOut' or $NavCommand = 'ZoomOutAll'" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" - then: [T: "utzoomat hela vägen", pause: "long"] # phrase('zoomed out all the the way') + - with: + variables: [SayCommand: "string($NavVerbosity != 'Terse')"] + replace: [x: "."] - set_variables: [NavNode: "*[1]/@id"] # no-op for $NavCommand = 'ZoomOut' -- name: zoom-out-top - tag: "*" - match: - - "($NavCommand = 'ZoomOut' or $NavCommand = 'ZoomOutAll') and" - - "parent::m:math " - replace: - - x: ".." # let math rule deal with it - - name: skip-punct-at-end-zoom-out tag: mrow match: @@ -401,19 +376,25 @@ replace: - x: ".." +- name: zoom-out-top + tag: "*" + match: + - "($NavCommand = 'ZoomOut' or $NavCommand = 'ZoomOutAll') and" + - "parent::m:math" + replace: + - x: ".." # let math rule deal with it + - name: zoom-out-all-default tag: "*" match: "$NavCommand = 'ZoomOutAll'" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" - then: [T: "utzoomat hela vägen", pause: "medium"] # phrase('zoomed out all the the way') - with: - variables: [Move2D: "'lämnar'", Child2D: "."] - replace: [x: ".."] + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - with: - variables: [MatchCounter: "$MatchCounter + 1"] + variables: [Move2D: "'ut av'", Child2D: "."] replace: [x: ".."] + - x: ".." # deal with internal zooming: MoveNextZoom and MovePreviousZoom @@ -424,13 +405,16 @@ - "($NavCommand = 'MoveNextZoom' or $NavCommand = 'MovePreviousZoom') and " - "$NavMode = 'Enhanced'" replace: - # don't bother with MatchCounter since we only get here if > 1 - with: variables: [Move2D: "'i'", Child2D: "*[1]"] # phrase('in' the denominator) replace: [x: "."] - test: - - if: "count(*)> 1 or IsNode(., 'leaf') or self::m:msqrt or self::m:menclose" - then: [set_variables: [NavNode: "@id"]] + - if: "count(*)> 1 or IsNode(., 'leaf') or + @data-from-mathml='msqrt' or self::m:msqrt or @data-from-mathml='menclose' or self::m:menclose" + then: + - set_variables: + - NavNode: "@id" + - NavNodeOffset: "IfThenElse(@data-id-offset, @data-id-offset, '0')" else: [x: "*[1]"] - name: move-next-zoom-not-enhanced @@ -440,12 +424,14 @@ replace: #don't bother with MatchCounter since we only get here if > 1 - test: - if: "$ReadZoomLevel >= DistanceFromLeaf(., false, $NavMode!='Character')" + if: "IsNode(., 'leaf') or $ReadZoomLevel >= DistanceFromLeaf(., false, $NavMode!='Character')" then: # - with: # variables: [Move2D: "'i'", Child2D: "following-sibling::*[1]"] # phrase('in' the denominator) # replace: [x: ".."] - - set_variables: [NavNode: "@id"] + - set_variables: + - NavNode: "@id" + - NavNodeOffset: "IfThenElse(@data-id-offset, @data-id-offset, '0')" else: - with: variables: [Move2D: "'i'", Child2D: "*[1]"] # phrase('in' the denominator) @@ -462,9 +448,11 @@ if: "$ReadZoomLevel >= DistanceFromLeaf(., true, $NavMode!='Character')" then: # - with: - # variables: [Move2D: "'i'", Child2D: "preceding-sibling::*[1]"] # phrase('in' the denominator) + # variables: [Move2D: "'in'", Child2D: "preceding-sibling::*[1]"] # phrase('in' the denominator) # replace: [x: ".."] - - set_variables: [NavNode: "@id"] + - set_variables: + - NavNode: "@id" + - NavNodeOffset: "IfThenElse(@data-id-offset, @data-id-offset, '0')" else: - with: variables: [Move2D: "'i'", Child2D: "*[last()]"] # phrase('in' the denominator) @@ -473,20 +461,20 @@ # ********* ZoomOut *************** - name: zoom-out-default - - tag: mtd match: "$Move2D = '' and ($NavCommand = 'ZoomOut')" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: [T: "zooma ut", pause: "medium"] # phrase('zoom out' of expression) + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] # we need to speak it here - - T: "rad" # phrase(the first 'row' of the matrix) - # if we let the speech rules speak the row, it is given just the MathML for the row, so the row # will always be '1' - - x: "count(../preceding-sibling::*)+1" - - pause: medium - - set_variables: [NavNode: "../@id"] + # - t: "row" # phrase(the first 'row' of the matrix) + # # if we let the speech rules speak the row, it is given just the MathML for the row, so the row # will always be '1' + # - x: "count(../preceding-sibling::*)+1" + # - pause: medium + - set_variables: + - NavNode: "../@id" + - NavNodeOffset: "IfThenElse(../@data-id-offset, ../@data-id-offset, '0')" - name: zoom-out # a row around a single element -- these might duplicate the position/offset, so we jump an extra level here @@ -494,26 +482,29 @@ match: "$NavCommand = 'ZoomOut'" replace: - with: - variables: [MatchCounter: "$MatchCounter + 1"] - replace: - - test: - if: "$MatchCounter = 1 and $NavVerbosity = 'Verbose'" - then: [T: "zooma ut", pause: "medium"] # phrase('zoom out' of the expression) + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - test: + - if: "$NavNodeOffset > 0 and IsNode(., 'leaf')" # Inside leaf -- just reset offset, intent offset doesn't change + then: + - set_variables: [NavNodeOffset: "0"] + # NavNode remains the same + - else_if: "$NavMode='Enhanced' and parent::*[self::m:mrow and (IsBracketed(., '(', ')', false) or IsBracketed(., '[', ']', false))]" + then: [x: ".."] # auto-zoom: move out a level and retry + else: + - with: + variables: [Move2D: "'ut av'", Child2D: "."] # phrase('out of' the denominator) + replace: [x: ".."] - test: - if: "$NavMode='Enhanced' and parent::*[self::m:mrow and IsBracketed(., '(', ')', false) or IsBracketed(., '[', ']', false)]" - then: [x: ".."] # auto-zoom: move out a level and retry + if: "parent::m:mtd" + then: [x: ".."] else: - - with: - variables: [Move2D: "'lämnar'", Child2D: "."] - replace: [x: ".."] - test: - if: "parent::m:mtd" - then: [x: ".."] - else: - - test: - if: "$ReadZoomLevel!=-1" - then: [set_variables: [ReadZoomLevel: "DistanceFromLeaf(.., true, $NavMode!='Character')"]] - - set_variables: [NavNode: "../@id"] + if: "DEBUG($ReadZoomLevel)!=-1" + then: [set_variables: [ReadZoomLevel: "DistanceFromLeaf(.., true, $NavMode!='Character')"]] + - set_variables: + - NavNode: "../@id" + - NavNodeOffset: "IfThenElse(../@data-id-offset, ../@data-id-offset, '0')" # ********* MoveStart/End *************** - name: math-move-to-start-or-end @@ -528,31 +519,45 @@ then: - test: - if: "$NavCommand = 'MoveStart'" - then: [T: "gå till start matematik"] # phrase('move to start of math') + then: [T: "gå till början av uttrycket"] # phrase('move to start of math') - else_if: "$NavCommand = 'MoveLineStart'" then: [T: "gå till början av raden"] # phrase('move to start of line') - else_if: "$NavCommand = 'MoveEnd'" - then: [T: "gå till slut matematik"] # phrase('move to end of math') + then: [T: "gå till slutet av uttrycket"] # phrase('move to end of math') else: [T: "gå till slutet av raden"] # "$NavCommand = 'MoveLineEnd'" # phrase('move to end of line') - pause: "medium" - test: if: "$NavCommand = 'MoveStart' or $NavCommand = 'MoveLineStart'" then: # move inside of the mrow inside of 'math' or inside the fraction, etc (hence two levels down) + # Note: an apparent bug in the xpath code doesn't let me use IfThenElse for the 2 if: then: below - with: variables: [NavCommand: "'MoveNextZoom'"] - replace: [x: "*[1]/*[1]"] + replace: + - test: + if: "*[1]/*[1]" # could be a x, so no grandchild + then: [x: "*[1]/*[1]"] + else: [x: "*[1]"] else: - with: variables: [NavCommand: "'MovePreviousZoom'"] - replace: [x: "*[last()]/*[last()]"] + replace: + - test: + if: "*[last()]/*[last()]" # could be a x, so no grandchild + then: [x: "*[last()]/*[last()]"] + else: [x: "*[last()]"] # We stop when the parent is 2d (e.g., frac), but not if in leaf base of msub/msup/msubsup/mmultiscripts because that's really on the same line - name: move-to-start-or-end-2d tag: "*" match: - "($NavCommand = 'MoveLineStart' or $NavCommand = 'MoveLineEnd') and IsNode(.., '2D') and" - - "not( IsNode(., 'leaf') and (parent::m:msub or parent::m:msup or parent::m:msubsup or parent::m:mmultiscripts) )" + - "not( IsNode(., 'leaf') and" + - " parent::*[1][self::m:msub or self::m:msup or self::m:msubsup or self::m:mmultiscripts or" + - " @data-from-mathml and" + - " (@data-from-mathml='msub' or @data-from-mathml='msup' or" + - " @data-from-mathml='msubsup' or @data-from-mathml='mmultiscripts')" + - " ] )" replace: - test: if: "$NavVerbosity = 'Verbose'" @@ -563,7 +568,7 @@ else: [T: "gå till slutet av raden"] # "$NavCommand = 'MoveLineEnd'" # phrase('move to end of line') - pause: "medium" - test: - if: "self::m:mrow" + if: "self::m:mrow or @data-from-mathml = 'mrow'" then_test: if: "$NavCommand = 'MoveLineStart'" then: @@ -596,7 +601,7 @@ - "$NavCommand='MoveColumnStart' or $NavCommand='MoveColumnEnd' or" - "$NavCommand='ReadCellCurrent'" replace: - - T: "inte i tabellen" # phrase('not in table') + - T: "inte i tabell" # phrase('not in table') - pause: long - set_variables: [SpeakExpression: "'false'"] @@ -627,7 +632,7 @@ else: - set_variables: [NavNode: "preceding-sibling::*[1]/*[1]/@id"] else: - - T: "ingen föregående kolumn" # phrase('no previous column' in the table) + - T: "inga föregående kolumner" # phrase('no previous column' in the table) - set_variables: [SpeakExpression: "'false'"] - name: move-cell-next @@ -657,7 +662,7 @@ else: - set_variables: [NavNode: "following-sibling::*[1]/*[1]/@id"] else: - - T: "ingen följande kolumn" # phrase('no next column' in the table) + - T: "inga fler kolumner" # phrase('no next column' in the table) - set_variables: [SpeakExpression: "'false'"] - name: move-cell-up @@ -693,7 +698,7 @@ else: - set_variables: [NavNode: "../preceding-sibling::*[1]/*[$Column]/*[1]/@id"] else: - - T: "ingen föregående rad" # phrase('no previous row' in the table) + - T: "inga föregående rader" # phrase('no previous row' in the table) - set_variables: [SpeakExpression: "'false'"] - name: move-cell-down @@ -709,7 +714,7 @@ - test: if: "$NavVerbosity = 'Verbose'" then: - - T: "gå ner" # phrase('move down to the next row in the table) + - T: "gå ned" # phrase('move down' to the next row in the table) - pause: short - test: if: "$NavVerbosity != 'Terse'" @@ -729,27 +734,21 @@ else: - set_variables: [NavNode: "../following-sibling::*[1]/*[$Column]/*[1]/@id"] else: - - T: "ingen följande rad" # phrase('no next row' in the table) + - T: "inga fler rader" # phrase('no next row' in the table) - set_variables: [SpeakExpression: "'false'"] - name: move-cell-up tag: [mtr, mlabeledtr] match: "$NavCommand='MoveCellUp'" replace: + - test: + if: "$NavVerbosity = 'Verbose'" + then: + - T: "gå till föregående rad" # phrase('move to previous row' in the table) + - pause: medium - test: if: "preceding-sibling::*" then: - - test: - if: "$NavVerbosity = 'Verbose'" - then: - - T: "gå upp" # phrase('move up' to the previous row in the table) - - pause: medium - - test: - if: "$NavVerbosity != 'Terse'" - then: - - T: "rad" # phrase(the previous 'row' in the table) - - x: "count(preceding-sibling::*)" - - pause: medium - test: if: "$NavMode='Character'" then: @@ -759,27 +758,21 @@ else: - set_variables: [NavNode: "preceding-sibling::*[1]/@id"] else: - - T: "ingen föregående rad" # phrase('no previous row' in the table) + - T: "inga föregående rader" # phrase('no previous row' in the table) - set_variables: [SpeakExpression: "'false'"] - name: move-cell-down tag: [mtr, mlabeledtr] match: "$NavCommand='MoveCellDown'" replace: + - test: + if: "$NavVerbosity = 'Verbose'" + then: + - T: "gå till nästa rad" # phrase('move to next row' in the table) + - pause: medium - test: if: "following-sibling::*" then: - - test: - if: "$NavVerbosity = 'Verbose'" - then: - - T: "gå ner" # phrase('move down' to the next row in the table) - - pause: medium - - test: - if: "$NavVerbosity != 'Terse'" - then: - - T: "rad" # phrase(the previous 'row' in the table) - - x: "count(preceding-sibling::*)+2" - - pause: medium - test: if: "$NavMode='Character'" then: @@ -789,9 +782,35 @@ else: - set_variables: [NavNode: "following-sibling::*[1]/@id"] else: - - T: "ingen följande rad" # phrase('no next row' in the table) + - T: "inga flera rader" # phrase('no next row' in the table) - set_variables: [SpeakExpression: "'false'"] +- name: move-cell-previous + # if a row is selected, there is no previous/next column, so this is trivial + tag: [mtr, mlabeledtr] + match: "$NavCommand='MoveCellPrevious'" + replace: + - test: + if: "$NavVerbosity = 'Verbose'" + then: + - T: "gå till föregående kolumn" # phrase('move to previous column' in the table) + - pause: medium + - T: "inga föregående kolumner" # phrase('no previous column' in the table) + - set_variables: [SpeakExpression: "'false'"] + +- name: move-cell-next + # if a row is selected, there is no previous/next column, so this is trivial + tag: [mtr, mlabeledtr] + match: "$NavCommand='MoveCellNext'" + replace: + - test: + if: "$NavVerbosity = 'Verbose'" + then: + - T: "gå till nästa kolumn" # phrase('move to next column' in the table) + - pause: medium + - T: "inga flera kolumner" # phrase('no next row' in the table) + - set_variables: [SpeakExpression: "'false'"] + - name: default-read-cell tag: "*" match: "$NavCommand='ReadCellCurrent'" @@ -805,244 +824,23 @@ - test: if: "$NavVerbosity = 'Verbose'" then: - - T: "läs aktuellt värde" # phrase('read current entry' in the table) + - T: "läs nuvarande cell" # phrase('read current entry' in the table) - pause: medium - test: if: "$NavVerbosity != 'Terse'" then: - T: "rad" # phrase(the previous 'row' in the table) - x: "count($MTD[1]/../preceding-sibling::*)+1" + - pause: short - T: "kolumn" # phrase(the previous 'column' in the table) - x: "count($MTD[1]/preceding-sibling::*)+1" - pause: short - set_variables: [NavNode: "$MTD[1]/*[1]/@id"] else: - - T: "inte i tabellen" # phrase('not in table' or matrix) + - T: "inte i tabell" # phrase('not in table' or matrix) - pause: long - set_variables: [SpeakExpression: "'false'"] -# mtd ? ( $NavCommand='MoveColumnStart' ) -# => MoveColStart { -# ruleRef = name(^^match); -# column = index(match); -# ::StartPosition = ^^match[0][index(match)][0].dfs; -# ::EndPosition = ^^match[0][index(match)][0].offset; -# }; - -# mtd ? ( $NavCommand='MoveColumnEnd' ) -# => MoveColEnd { -# ruleRef = name(^^match); -# column = index(match); -# ::StartPosition = ^^match[count(^^match)-1][index(match)][0].dfs; -# ::EndPosition = ^^match[count(^^match)-1][index(match)][0].offset; -# }; - - - -# # Rules for columnar math (mstack and mlongdiv) -- each row is an msrow or mscarries except for the start of mlongdiv -# # FIX: not dealing with different number of digits on different lines -# # FIX: not dealing with + (etc) on same line if they are on the right side (Dutch, others) -# # FIX: not dealing with intervening msline (say it and move on??) -# # FIX: not dealing with carries well -# # FIX: not dealing with navigation of first three children of mlongdiv -# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && -# ($NavCommand="MovePrevious" || $NavCommand='MoveCellPrevious') && has_previous(match) ) -# => MoveCell { -# ruleRef = name(^^match); -# wordRef = "previous"; -# ::StartPosition = previous(match).dfs; -# ::EndPosition = previous(match).offset; -# }; - -# # no previous child -- in first column -- don't move -# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && -# ($NavCommand="MovePrevious" || $NavCommand='MoveCellPrevious' ) ) -# => MoveCell { -# ruleRef = name(^^match); -# wordRef = "previous"; -# childIndex = -1; # key to know what to say for each notation -# ::SpeakAfterMove = false; -# }; - -# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && -# ($NavCommand="MoveNext" || $NavCommand='MoveCellNext') && has_next(match) ) -# => MoveCell { -# ruleRef = name(^^match); -# wordRef = "next"; -# ::StartPosition = next(match).dfs; -# ::EndPosition = next(match).offset; -# }; - -# # no next child -- in first column -- don't move -# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && -# ($NavCommand="MoveNext" || $NavCommand='MoveCellNext' ) ) -# => MoveCell { -# ruleRef = name(^^match); -# wordRef = "next"; -# childIndex = -1; # key to know what to say for each notation -# ::SpeakAfterMove = false; -# }; - -# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && -# $NavCommand='MoveCellUp' && has_previous(^^match) ) -# => MoveCell { -# ruleRef = name(^^match); -# wordRef = "up"; -# ::StartPosition = ^^^match[index(^^match)-1][-1][index(match)-count(^match)].dfs; -# ::EndPosition = ^^^match[index(^^match)-1][-1][index(match)-count(^match)].offset; -# }; - -# # no previous child -- in first column -- don't move -# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && -# $NavCommand='MoveCellUp' ) -# => MoveCell { -# ruleRef = name(^^match); -# wordRef = "up"; -# childIndex = -1; # key to know what to say for each notation -# ::SpeakAfterMove = false; -# }; - -# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && -# $NavCommand='MoveCellDown' && has_next(^^match) ) -# => MoveCell { -# ruleRef = name(^^match); -# wordRef = "down"; -# ::StartPosition = ^^^match[index(^^match)+1][-1][index(match)-count(^match)].dfs; -# ::EndPosition = ^^^match[index(^^match)+1][-1][index(match)-count(^match)].offset; -# }; - -# # no previous child -- in first column -- don't move -# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && -# $NavCommand='MoveCellDown' ) -# => MoveCell { -# ruleRef = name(^^match); -# wordRef = "down"; -# childIndex = -1; # key to know what to say for each notation -# ::SpeakAfterMove = false; -# }; - -# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && -# $NavCommand='MoveColumnStart' ) -# => MoveColStart { -# ruleRef = name(^^match); -# column = index(match); -# ::StartPosition = ^^^match[0][-1][index(match)-count(^match)].dfs; -# ::EndPosition = ^^^match[0][-1][index(match)-count(^match)].offset; -# }; - -# char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && -# $NavCommand='MoveColumnEnd' ) -# => MoveColEnd { -# ruleRef = name(^^match); -# column = index(match); -# ::StartPosition = ^^^match[count(^^^match)-1][-1][index(match)-count(^match)].dfs; -# ::EndPosition = ^^^match[count(^^^match)-1][-1][index(match)-count(^match)].offset; -# }; - -# any ? ( (name(match)=="mn" || name(match)=="none") && -# has_parent(match) && name(^match)=="mscarries" && -# ($NavCommand="MovePrevious" || $NavCommand='MoveCellPrevious') && has_previous(match) ) -# => MoveCell { -# ruleRef = name(^match); -# wordRef = "previous"; -# ::StartPosition = previous(match).dfs; -# ::EndPosition = previous(match).offset; -# }; - -# # no previous child -- in first column -- don't move -# any ? ( (name(match)=="mn" || name(match)=="none") && -# has_parent(match) && name(^match)=="mscarries" && -# ($NavCommand="MovePrevious" || $NavCommand='MoveCellPrevious') ) -# => MoveCell { -# ruleRef = name(^match); -# wordRef = "previous"; -# childIndex = -1; # key to know what to say for each notation -# ::SpeakAfterMove = false; -# }; - -# any ? ( (name(match)=="mn" || name(match)=="none") && -# has_parent(match) && name(^match)=="mscarries" && -# ($NavCommand="MoveNext" || $NavCommand='MoveCellNext') && has_next(match) ) -# => MoveCell { -# ruleRef = name(^match); -# wordRef = "next"; -# ::StartPosition = next(match).dfs; -# ::EndPosition = next(match).offset; -# }; - -# # no next child -- in last column -- don't move -# any ? ( (name(match)=="mn" || name(match)=="none") && -# has_parent(match) && name(^match)=="mscarries" && -# ($NavCommand="MoveNext" || $NavCommand='MoveCellNext') ) -# => MoveCell { -# ruleRef = name(^match); -# wordRef = "next"; -# childIndex = -1; # key to know what to say for each notation -# ::SpeakAfterMove = false; -# }; - -# any ? ( (name(match)=="mn" || name(match)=="none") && -# has_parent(match) && name(^match)=="mscarries" && -# $NavCommand='MoveCellUp' && has_previous(^match) ) -# => MoveCell { -# ruleRef = name(^match); -# wordRef = "up"; -# ::StartPosition = ^^match[index(^match)-1][index(match)-count(^match)].dfs; -# ::EndPosition = ^^match[index(^match)-1][index(match)-count(^match)].offset; -# }; - -# # no previous child -- in first row -- don't move -# any ? ( (name(match)=="mn" || name(match)=="none") && -# has_parent(match) && name(^match)=="mscarries" && -# $NavCommand='MoveCellUp' ) -# => MoveCell { -# ruleRef = name(^match); -# wordRef = "up"; -# childIndex = -1; # key to know what to say for each notation -# ::SpeakAfterMove = false; -# }; - -# any ? ( (name(match)=="mn" || name(match)=="none") && -# has_parent(match) && name(^match)=="mscarries" && -# $NavCommand='MoveCellDown' && has_next(^match) ) -# => MoveCell { -# ruleRef = name(^match); -# wordRef = "down"; -# ::StartPosition = ^^match[index(^match)+1][-1][index(match)-count(^match)].dfs; -# ::EndPosition = ^^match[index(^match)+1][-1][index(match)-count(^match)].offset; -# }; - -# # no next child -- in last row -- don't move -# any ? ( (name(match)=="mn" || name(match)=="none") && -# has_parent(match) && name(^match)=="mscarries" && -# $NavCommand='MoveCellDown' ) -# => MoveCell { -# ruleRef = name(^match); -# wordRef = "down"; -# childIndex = -1; # key to know what to say for each notation -# ::SpeakAfterMove = false; -# }; - -# mn ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && -# $NavCommand='MoveColumnStart' ) -# => MoveColStart { -# ruleRef = name(^^match); -# column = index(match); -# ::StartPosition = ^^^match[0][-1][index(match)-count(^match)].dfs; -# ::EndPosition = ^^^match[0][-1][index(match)-count(^match)].offset; -# }; - -# mn ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && -# $NavCommand='MoveColumnEnd' ) -# => MoveColEnd { -# ruleRef = name(^^match); -# column = index(match); -# ::StartPosition = ^^^match[count(^^^match)-1][-1][index(match)-count(^match)].dfs; -# ::EndPosition = ^^^match[count(^^^match)-1][-1][index(match)-count(^match)].offset; -# }; - - - - name: default-cell-move tag: "*" @@ -1057,11 +855,30 @@ then: - x: "ancestor::m:mtd[1]" # try again on an mtd node else: - - T: "inte i tabellen" # phrase('not in table' or matrix) + - T: "inte i tabell" # phrase('not in table' or matrix) - pause: long - set_variables: [SpeakExpression: "'false'"] -# ======== Move/Read/Describe Next rules ================= +- name: move-next-character + tag: [mn, mi, mtext] + match: + - "($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext' or $NavCommand = 'MoveNextZoom') and" + - "$NavNodeOffset > 0 and" + - "($NavNodeOffset < string-length(.) or name(EdgeNode(., 'right', 'math'))!='math')" # not at edge of math + replace: + - test: + if: "$NavNodeOffset < string-length(.)" + then: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - set_variables: [NavNodeOffset: "$NavNodeOffset + 1"] + else: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - set_variables: [NavNodeOffset: "0"] + - x: "." # skip 'none' - name: move-next-none @@ -1085,30 +902,6 @@ variables: [NavCommand: "'MoveNextZoom'"] replace: [x: "$Following"] -# skip 'none' -- name: move-previous-none - tag: [none, mprescripts] - match: - - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious' or $NavCommand = 'MovePreviousZoom') and" - - "parent::*[1][name(.)='mmultiscripts'] and preceding-sibling::*" - replace: - - with: - variables: [Preceding: "preceding-sibling::*[1]"] - replace: - # two 'none's in a row -- move over and try again; one 'none', zoom in on preceding - - test: - if: "$Preceding[name(.)='none']" - then: [x: "$Preceding"] - else: - - with: - variables: [Move2D: "'i'", Child2D: "$Preceding"] # phrase('in' the denominator) - replace: [x: ".."] - - with: - variables: [NavCommand: "'MovePreviousZoom'"] - replace: [x: "$Preceding"] - - - # skip invisible chars except for Enhanced mode when "times" should be read - name: move-next-invisible tag: "*" @@ -1116,24 +909,14 @@ - "($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext') and" - "following-sibling::*[1][name(.)='mo' and translate(., '\u2061\u2062\u2063\u2064', '')='']" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: - - test: - - if: "$NavCommand = 'MoveNext'" - then: [T: "gå"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadNext'" - then: [T: "läs"] # phrase('read' next entry in table) - else: [T: "beskriv"] # phrase('describe' next entry in table) - - T: "höger" # phrase(move 'right') # phrase(move 'right') - - pause: short - with: - variables: [MatchCounter: "$MatchCounter + 1"] - replace: - - test: - if: "following-sibling::*[1][.='\u2062' or .='\u2064'] and $NavMode='Enhanced'" # invisible times and plus - then: [set_variables: [NavNode: "following-sibling::*[1]/@id"]] - else: [x: "following-sibling::*[1]"] + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - test: + if: "following-sibling::*[1][.='\u2062' or .='\u2064'] and + ($NavMode='Enhanced' or ($NavMode='Simple' and following-sibling::*[2][not(IsNode(., 'mathml'))]))" # invisible times and plus + then: [set_variables: [NavNode: "following-sibling::*[1]/@id"]] + else: [x: "following-sibling::*[1]"] - name: move-next-no-auto-zoom-at-edge # at edge of 2D and in a mode where moving right isn't an option @@ -1142,11 +925,15 @@ match: "$NavCommand = 'MoveNext' and $NavMode!='Character' and not($AutoZoomOut) and $EdgeNode/@id!=@id" replace: - test: - if: "$MatchCounter = 0 and $NavVerbosity != 'Terse' and $NavCommand = 'MoveNext'" + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" then: - T: "kan inte gå höger" # phrase('cannot move right') + - pause: medium - with: - variables: [Move2D: "'end of'", Child2D: "$EdgeNode/*[last()]"] + variables: + - Move2D: "'slutt på'" + - Child2D: "$EdgeNode/*[last()]" + - MatchCounter: $MatchCounter + 1 replace: [x: "$EdgeNode"] - pause: long - set_variables: [SpeakExpression: "'false'"] @@ -1159,17 +946,19 @@ - "(self::m:math or name(EdgeNode(., 'right', 'math'))='math')" # at edge of math replace: - test: - if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" then: - T: "kan inte" # phrase('cannot' move right in expression) - test: - if: "$NavCommand = 'MoveNext'" then: [T: "gå"] # phrase('move' to next entry in table) - else_if: "$NavCommand = 'ReadNext'" - then: [T: "läs"] # phrase('read' next entry in table) - else: [T: "beskriv"] # phrase('describe' next entry in table) - - T: "höger, slut matematik" # phrase(move 'right, end of math') - - pause: long + then: [T: "läsa"] # phrase('read' next entry in table) + else: [T: "beskriva"] # phrase('describe' next entry in table) + - T: "höger" # phrase(move 'right') + - pause: short + - T: "slut matematik" # phrase(move 'end of math') + - pause: long - set_variables: [SpeakExpression: "'false'"] - name: move-next-auto-zoom-up-one-level @@ -1184,48 +973,34 @@ - " )" - ")" replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" + if: "following-sibling::*" then: - - test: - - if: "$NavCommand = 'MoveNext'" - then: [T: "gå"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadNext'" - then: [T: "läs"] # phrase('read' next entry in table) - else: [T: "beskriv"] # phrase('describe' next entry in table) - - T: "höger" # phrase(move 'right') # phrase(move 'right') - - pause: short - - with: - variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MoveNext'"] - replace: - - test: - if: "following-sibling::*" - then: - - with: - variables: [Move2D: "'i'", Child2D: "."] # phrase('in' the denominator) - replace: [x: ".."] - else: - - with: - variables: [Move2D: "'lämnar'", Child2D: "."] - replace: [x: ".."] - - test: - if: "following-sibling::*" - then: - - x: ".." # move out of parens - else: - - x: ".." + - with: + variables: [Move2D: "'i'", Child2D: "."] # phrase('in' the denominator) + replace: [x: ".."] + else: + - with: + variables: [Move2D: "'ut av'", Child2D: "."] + replace: [x: ".."] + - x: ".." # At this point, if XXXNext, then we know there is must be a right sibling - name: move-next-default tag: mtd match: "$Move2D = '' and ($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext')" replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: - # can't get here with MatchCounter=0, so no need to echo command if: "following-sibling::*" then: - test: - if: "$NavVerbosity != 'Terse'" + if: "$NavVerbosity = 'Verbose'" then: - T: "kolumn" # phrase(the previous 'column' in the table) - x: "count(preceding-sibling::*)+2" @@ -1242,25 +1017,21 @@ - name: move-next-default tag: [mtr, mlabeledtr] - match: "$Move2D = '' and ($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext')" + match: "$Move2D = '' and + ($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext') and + following-sibling::*" replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: - # can't get here with MatchCounter=0, so no need to echo command - if: "following-sibling::*" + if: "$NavMode = 'Character'" then: - - T: "rad" # phrase(the previous 'row' in the table) - - x: "count(preceding-sibling::*)+2" - - T: "kolumn 1" # phrase('column 1' in the table) - - pause: medium - - test: - if: "$NavMode = 'Character'" - then: - - with: - variables: [NavCommand: "'MoveNextZoom'"] - replace: [x: "following-sibling::*[1]"] - else: - - set_variables: [NavNode: "following-sibling::*[1]/*[1]/*[1]/@id"] - else: [x: ".."] # try again for after + - with: + variables: [NavCommand: "'MoveNextZoom'"] + replace: [x: "following-sibling::*[1]"] + else: + - set_variables: [NavNode: "following-sibling::*[1]/@id"] - name: move-next-auto-zoom-parens # auto-zoom into next child if next child is parenthesized expr @@ -1270,20 +1041,12 @@ - "$NavMode='Enhanced' and" - "parent::m:mrow and following-sibling::* and" - "following-sibling::*[1][self::m:mrow and count(*)=3 and " #exclude empty parens - - " (IsBracketed(., '(', ')') or IsBracketed(., '[', ']'))" - - " ]" + - " (IsBracketed(., '(', ')') or IsBracketed(., '[', ']'))" + - " ]" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: - - test: - - if: "$NavCommand = 'MoveNext'" - then: [T: "gå"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadNext'" - then: [T: "läs"] # phrase('read' next entry in table) - else: [T: "beskriv"] # phrase('describe' next entry in table) - - T: "höger" # phrase(move 'right') # phrase(move 'right') - - pause: short + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - set_variables: [NavNode: "following-sibling::*[1]/*[2]/@id"] # normal cases for MoveNext @@ -1294,60 +1057,68 @@ - "($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext') and" - "$ReadZoomLevel>=0" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: - - test: - - if: "$NavCommand = 'MoveNext'" - then: [T: "gå"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadNext'" - then: [T: "läs"] # phrase('read' next entry in table) - else: [T: "beskriv"] # phrase('describe' next entry in table) - - T: "höger" # phrase(move 'right') # phrase(move 'right') - - pause: short + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: # if in base (nothing before), we must be moving to a script, so "in" will be said if: "preceding-sibling::* and following-sibling::*[1][name(.)='none']" then: - with: - variables: [Move2D: "'lämnar'", Child2D: "."] + variables: [Move2D: "'ut av'", Child2D: "."] replace: [x: ".."] - - with: - variables: [MatchCounter: "$MatchCounter + 1"] - replace: [x: "following-sibling::*[1]"] # skip over 'none' + - x: "following-sibling::*[1]" else: - with: variables: [Move2D: "'i'", Child2D: "following-sibling::*[1]"] # phrase('in' the denominator) replace: [x: ".."] - with: - variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MoveNextZoom'"] + variables: [NavCommand: "'MoveNextZoom'"] replace: [x: "following-sibling::*[1]"] - name: move-next-default tag: "*" match: "$NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext'" replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: + if: "following-sibling::*[1][@data-from-mathml='none' or @data-from-mathml='mprescripts']" + then: [x: "following-sibling::*[1]"] + else: - test: - - if: "$NavCommand = 'MoveNext'" - then: [T: "gå"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadNext'" - then: [T: "läs"] # phrase('read' next entry in table) - else: [T: "beskriv"] # phrase('describe' next entry in table) - - T: "höger" # phrase(move 'right') # phrase(move 'right') - - pause: short - - test: - if: "IsNode(.., '2D')" - then: - - with: - variables: [Move2D: "'i'", Child2D: "following-sibling::*[1]"] # phrase('in' the denominator) - replace: [x: ".."] - - set_variables: [NavNode: "following-sibling::*[1]/@id"] + if: "IsNode(.., '2D') or not(IsNode(.., 'mathml'))" + then: + - with: + variables: [Move2D: "'i'", Child2D: "following-sibling::*[1]"] # phrase('in' the denominator) + replace: [x: ".."] + - set_variables: [NavNode: "following-sibling::*[1]/@id"] # ======== Move/Read/Describe Previous rules ================= +# skip 'none' +- name: move-previous-none + tag: [none, mprescripts] + match: + - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious' or $NavCommand = 'MovePreviousZoom') and" + - "parent::*[1][name(.)='mmultiscripts'] and preceding-sibling::*" + replace: + - with: + variables: [Preceding: "preceding-sibling::*[1]"] + replace: + # two 'none's in a row -- move over and try again; one 'none', zoom in on preceding + - test: + if: "$Preceding[name(.)='none']" + then: [x: "$Preceding"] + else: + - with: + variables: [Move2D: "'i'", Child2D: "$Preceding"] # phrase('in' the denominator) + replace: [x: ".."] + - with: + variables: [NavCommand: "'MovePreviousZoom'"] + replace: [x: "$Preceding"] + # skip invisible chars except for Enhanced mode when "times" should be read - name: move-previous-invisible tag: "*" @@ -1355,41 +1126,34 @@ - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious') and" - "preceding-sibling::*[1][name(.)='mo' and translate(., '\u2061\u2062\u2063\u2064', '')='']" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: - - test: - - if: "$NavCommand = 'MovePrevious'" - then: [T: "gå"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadPrevious'" - then: [T: "läs"] # phrase('read' next entry in table) - else: [T: "beskriv"] # phrase('describe' next entry in table) - - T: "vänster" # phrase(move 'left') - - pause: short - with: - variables: [MatchCounter: "$MatchCounter + 1"] - replace: - - test: - if: "preceding-sibling::*[1][.='\u2062' or .='\u2064'] and $NavMode='Enhanced'" # invisible times and plus - then: [set_variables: [NavNode: "preceding-sibling::*[1]/@id"]] - else: [x: "preceding-sibling::*[1]"] + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - test: + if: "preceding-sibling::*[1][.='\u2062' or .='\u2064'] and $NavMode='Enhanced'" # invisible times and plus + then: [set_variables: [NavNode: "preceding-sibling::*[1]/@id"]] + else: [x: "preceding-sibling::*[1]"] -# two rules for when can't move right +# two rules for when can't move left - name: move-previous-no-auto-zoom-at-edge - # at edge of 2D and in a mode where moving right isn't an option + # at edge of 2D and in a mode where moving left isn't an option tag: "*" variables: [EdgeNode: "EdgeNode(., 'left', '2D')"] match: "$NavCommand = 'MovePrevious' and $NavMode!='Character' and not($AutoZoomOut) and $EdgeNode/@id!=@id" replace: - test: - if: "$MatchCounter = 0 and $NavVerbosity != 'Terse' and $NavCommand = 'MovePrevious'" + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose' and $NavCommand = 'MovePrevious'" then: - T: "kan inte gå vänster" # phrase('cannot move left' in expression) + - pause: medium - with: - variables: [Move2D: "'end of'", Child2D: "$EdgeNode/*[1]"] + variables: + - Move2D: "'slut på'" + - Child2D: "$EdgeNode/*[1]" + - MatchCounter: $MatchCounter + 1 replace: [x: "$EdgeNode"] - pause: long - + - name: move-previous-no-auto-zoom-at-edge-of-math # at edge of math -- no where to go (must be after we rule out being at the edge of 2D) because we want to speak that tag: "*" @@ -1408,12 +1172,37 @@ - "name(EdgeNode(., 'left', 'math'))='math'" # at edge of math replace: - test: - if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" then: - - T: "kan inte gå vänster, start matematik" # phrase('cannot move left, start of math') - - pause: long + - T: "kan inte gå vänster" # phrase('cannot move left') + - pause: short + - with: + variables: [Move2D: "'början av'", Child2D: "."] + replace: [x: "."] + - pause: long - set_variables: [SpeakExpression: "'false'"] +- name: move-prev-character + tag: [mn, mi, mtext] + match: + - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious' or $NavCommand = 'MovePreviousZoom') and" + - "$NavNodeOffset > 0 and" + - "($NavNodeOffset > 1 or name(EdgeNode(., 'left', 'math'))!='math')" # not at edge of math + replace: + - test: + if: "$NavNodeOffset > 1" + then: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - set_variables: [NavNodeOffset: "$NavNodeOffset - 1"] + else: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - set_variables: [NavNodeOffset: "0"] + - x: "." + - name: move-previous-auto-zoom-up-one-level # Last child or in auto-zoom'd in-- move up a level and try again # Note: we've already checked the for the case where we are at an edge and should not AutoZoomOut @@ -1426,36 +1215,20 @@ - " )" - ")" replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" + if: "preceding-sibling::*" then: - - test: - - if: "$NavCommand = 'MovePrevious'" - then: [T: "gå"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadPrevious'" - then: [T: "läs"] # phrase('read' next entry in table) - else: [T: "beskriv"] # phrase('describe' next entry in table) - - T: "vänster" # phrase(move 'left') - - pause: short - - with: - variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MovePrevious'"] - replace: - - test: - if: "preceding-sibling::*" - then: - - with: - variables: [Move2D: "'i'", Child2D: "."] # phrase('in' the denominator) - replace: [x: ".."] - else: - - with: - variables: [Move2D: "'lämnar'", Child2D: "."] - replace: [x: ".."] - - test: - if: "preceding-sibling::*" - then: - - x: .. # move out of parens - else: - - x: ".." + - with: + variables: [Move2D: "'i'", Child2D: "."] # phrase('in' the denominator) + replace: [x: ".."] + else: + - with: + variables: [Move2D: "'ut av'", Child2D: "."] + replace: [x: ".."] + - x: ".." - name: move-previous-auto-zoom-parens # auto-zoom into previous child if previous child is parenthesized expr @@ -1472,17 +1245,9 @@ - " (IsBracketed(., '(', ')') or IsBracketed(., '[', ']'))" - " ]" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: - - test: - - if: "$NavCommand = 'MovePrevious'" - then: [T: "gå"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadPrevious'" - then: [T: "läs"] # phrase('read' next entry in table) - else: [T: "beskriv"] # phrase('describe' next entry in table) - - T: "vänster" # phrase(move 'left') - - pause: short + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: if: "not(parent::m:mrow)" then: @@ -1495,44 +1260,37 @@ - name: move-previous-default tag: mtd - match: "$Move2D = '' and ($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious')" + match: "$Move2D = '' and + ($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious') and + preceding-sibling::*" replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: - # can't get here with MatchCounter=0, so no need to echo command - if: "preceding-sibling::*" + if: "$NavVerbosity = 'Verbose'" then: - - test: - if: "$NavVerbosity != 'Terse'" - then: - - T: "kolumn" # phrase(the first 'column' in the table) - - x: "count(preceding-sibling::*)" - - pause: short - - test: - if: "$NavMode = 'Character'" - then: - - with: - variables: [NavCommand: "'MovePreviousZoom'"] - replace: [x: "preceding-sibling::*[1]"] - else: [set_variables: [NavNode: "preceding-sibling::*[1]/*[last()]/@id"]] - else: - - x: ".." # try again at the row level + - T: "kolumn" # phrase(the first 'column' in the table) + - x: "count(preceding-sibling::*)" + - pause: short + - test: + if: "$NavMode = 'Character'" + then: + - with: + variables: [NavCommand: "'MovePreviousZoom'"] + replace: [x: "preceding-sibling::*[1]"] + else: [set_variables: [NavNode: "preceding-sibling::*[1]/*[last()]/@id"]] - name: move-previous-default tag: [mtr, mlabeledtr] match: "$Move2D = '' and ($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious')" replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: - # can't get here with MatchCounter=0, so no need to echo command if: "preceding-sibling::*" then: - - test: - if: "$NavVerbosity != 'Terse'" - then: - - T: "rad" # phrase('row' five in table) - - x: "count(preceding-sibling::*)" - - T: "kolumn" # phrase('column' five in table) - - x: "count(*)" - - pause: medium - test: if: "$NavMode = 'Character'" then: @@ -1540,7 +1298,7 @@ variables: [NavCommand: "'MovePreviousZoom'"] replace: [x: "preceding-sibling::*[1]"] else: - - set_variables: [NavNode: "preceding-sibling::*[1]/*[last()]/*[last()]/@id"] + - set_variables: [NavNode: "preceding-sibling::*[1]/@id"] else: [x: ".."] # try again for after - name: move-previous-locked-zoom-level @@ -1550,57 +1308,43 @@ - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious') and" - "$ReadZoomLevel>=0" replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: # if moving into base (nothing before), we must be moving to the base, so "in" will be said if: "count(preceding-sibling::*) > 2 and preceding-sibling::*[1][name(.)='none']" then: - with: - variables: [Move2D: "'lämnar'", Child2D: "."] + variables: [Move2D: "'ut av'", Child2D: "."] replace: [x: ".."] - - with: - variables: [MatchCounter: "$MatchCounter + 1"] - replace: [x: "preceding-sibling::*[1]"] # skip over 'none' + - x: "preceding-sibling::*[1]" # skip over 'none' else: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: - - test: - - if: "$NavCommand = 'MovePrevious'" - then: [T: "gå"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadPrevious'" - then: [T: "läs"] # phrase('read' next entry in table) - else: [T: "beskriv"] # phrase('describe' next entry in table) - - T: "vänster" # phrase(move 'left') - - pause: short - with: variables: [Move2D: "'i'", Child2D: "preceding-sibling::*[1]"] # phrase('in' the denominator) replace: [x: ".."] - with: - variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MovePreviousZoom'"] + variables: [NavCommand: "'MovePreviousZoom'"] replace: [x: "preceding-sibling::*[1]"] - name: move-previous-default tag: "*" match: "$NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious'" replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: + if: "preceding-sibling::*[1][@data-from-mathml='none' or @data-from-mathml='mprescripts']" + then: [x: "preceding-sibling::*[1]"] + else: - test: - - if: "$NavCommand = 'MovePrevious'" - then: [T: "gå"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadPrevious'" - then: [T: "läs"] # phrase('read' next entry in table) - else: [T: "beskriv"] # phrase('describe' next entry in table) - - T: "vänster" # phrase(move 'left') - - pause: short - - test: - if: "IsNode(.., '2D')" - then: - - with: - variables: [Move2D: "'i'", Child2D: "preceding-sibling::*[1]"] # phrase('in' the denominator) - replace: [x: ".."] - - set_variables: [NavNode: "preceding-sibling::*[1]/@id"] + if: "IsNode(.., '2D') or not(IsNode(.., 'mathml'))" + then: + - with: + variables: [Move2D: "'i'", Child2D: "preceding-sibling::*[1]"] # phrase('in' the denominator) + replace: [x: ".."] + - set_variables: [NavNode: "preceding-sibling::*[1]/@id"] # ********* ReadZoomLevel toggle *************** # These set ::NavMode @@ -1616,13 +1360,11 @@ - set_variables: [NavMode: "'Character'", ReadZoomLevel: "1"] - else_if: "$NavMode = 'Character'" then: - - T: "förenklat läge" # phrase(a 'simple' way to do something) + - T: "enkelt läge" # phrase(a 'simple' way to do something) - set_variables: [NavMode: "'Simple'", ReadZoomLevel: "1"] - else: - - T: "utökat läge" # phrase(an 'enhanced' way to do something) + - T: "översiktligt läge" # phrase(an 'enhanced' way to do something) - set_variables: [NavMode: "'Enhanced'", ReadZoomLevel: "-1"] - # - T: "läge" # phrase(a simple 'mode' of use) - # SWEDISH: Removed the ending "mode" string and added "läge" to the previous strings, for grammatical purposes. - pause: long - test: - if: "$NavMode != 'Enhanced'" # potentially need to zoom to the sibling @@ -1638,17 +1380,15 @@ - test: - if: "$NavMode = 'Enhanced'" then: - - T: "förenklat läge" # phrase(an 'simple' way to do something) + - T: "enkelt läge" # phrase(a 'simple' way to do something) - set_variables: [NavMode: "'Simple'", ReadZoomLevel: "1"] - else_if: "$NavMode = 'Character'" then: - - T: "utökat läge" # phrase(an 'enhanced' way to do something) + - T: "översiktligt läge" # phrase(an 'enhanced' way to do something) - set_variables: [NavMode: "'Enhanced'", ReadZoomLevel: "-1"] - else: - T: "teckenläge" # phrase(a mathematical 'character') - set_variables: [NavMode: "'Character'", ReadZoomLevel: "1"] - # - T: "användningsläge" # phrase(a simple 'mode' of use) - # SWEDISH: Removed the ending "mode" string and added "läge" to the previous strings, for grammatical purposes. - pause: long - test: - if: "$NavMode != 'Enhanced'" # potentially need to zoom to the sibling @@ -1664,12 +1404,13 @@ - test: if: "$Overview = 'true'" then: - - T: "läs upp uttryck efter navigering" # phrase('speak expression after move') + - T: "läs uttryck efter navigering" # phrase('speak expression after move') + - pause: long - set_variables: [Overview: "'false'"] else: - T: "översikt över uttryck efter navigering" # phrase('overview of expression after move') + - pause: long - set_variables: [Overview: "'true'"] - - pause: long - name: current tag: "*" @@ -1682,9 +1423,9 @@ - if: "$NavCommand = 'ReadCurrent'" then: [T: "läs"] # phrase('read' next entry in table) else: [T: "beskriv"] # phrase('describe' next entry in table) - - T: "aktuellt" # phrase('current' entry in table) + - T: "nuvarande" # phrase('current' entry in table) + - pause: long - set_variables: [NavNode: "@id"] - - pause: long # this needs to be near the end because we only test for 'Describe', "Read", etc., and we don't want to get 'DescribeNext', etc. - name: placemarker @@ -1705,8 +1446,8 @@ then: [T: "beskriv"] # phrase('describe' next entry in table) - else_if: "starts-with($NavCommand, 'MoveTo')" then: [T: "gå till"] # phrase('move to' the next entry in table) - else: [T: "ange"] # phrase('set' the value of the next entry in table) - - T: "platshållare" # phrase('placeholder' for the value) + else: [T: "placera"] # phrase('set' the value of the next entry in table) + - T: "markör" # phrase('placeholder' for the value) - x: "$PlaceMarkerIndex" - pause: long - set_variables: [NavNode: "$PlaceMarker"] @@ -1718,7 +1459,7 @@ - test: if: "$NavVerbosity != 'Terse'" then: - - T: "ange platshållare" # phrase('set placeholder' to the value) + - T: "placera markör" # phrase('set placeholder' to the value) - x: "$PlaceMarkerIndex" - pause: long - set_variables: [NavNode: "@id"] @@ -1729,8 +1470,6 @@ # Alternatively, it could insert a special token that Rust code does a "replace" on with the speech (e.g. SPEECH_AT{id}) # or a new command "speak" which takes a node id - name: where-am-i-start - - tag: "*" match: "($NavCommand = 'WhereAmI' or $NavCommand = 'WhereAmIAll') and $MatchCounter = 0" replace: @@ -1740,6 +1479,7 @@ variables: [MatchCounter: "$MatchCounter + 1"] replace: [x: ".."] +# Marthe - name: where-am-i-stop tag: "*" match: @@ -1752,7 +1492,7 @@ - test: if: "$NavCommand = 'WhereAmI'" then: - - T: "inget mer" # phrase('inside of nothing more') + - T: "inne i inget mer" # phrase('inside of nothing more') - pause: long - set_variables: [SpeakExpression: "'false'"] else: @@ -1767,7 +1507,7 @@ - T: "inne i" # phrase('inside' a big expression) - pause: medium - test: - - if: "$NavMode='Enhanced' and parent::*[self::m:mrow and IsBracketed(., '(', ')', false) or IsBracketed(., '[', ']', false)]" + - if: "$NavMode='Enhanced' and parent::*[self::m:mrow and (IsBracketed(., '(', ')', false) or IsBracketed(., '[', ']', false))]" then: [x: ".."] # auto-zoom up - else_if: "$NavCommand = 'WhereAmI'" then: [set_variables: [NavNode: "@id"]] @@ -1775,3 +1515,1747 @@ - translate: "@id" - pause: long - x: '..' + +# ********* Rules below are from old navigation file *************** + +# # Rules for speaking what happens when moving into or out of a notation +# - name: into-or-out-of +# tag: mfrac +# match: "$Move2D != ''" +# replace: +# - x: "$Move2D" +# - test: +# if: "count($Child2D/preceding-sibling::*)=0" +# then: [T: "täljaren"] # phrase(the 'numerator' of a fraction) +# else: [T: "nämnaren"] # phrase(the 'denominator' of a fraction) +# - pause: "medium" + +# - name: into-or-out-of +# tag: msqrt +# match: "$Move2D != ''" +# replace: +# - x: "$Move2D" +# - T: "kvadratroten" # phrase(the 'square root' of x) +# - pause: "medium" + +# - name: into-or-out-of +# tag: mroot +# match: "$Move2D != ''" +# replace: +# - x: "$Move2D" +# - test: +# if: "count($Child2D/preceding-sibling::*)=0" +# then: [T: "roten"] # phrase(the cube 'root' of x) +# else: [T: "rotindexet"] # phrase(the 'root index' of x is 3) +# - pause: "medium" + +# - name: into-or-out-of +# tag: msub +# match: "$Move2D != ''" +# replace: +# - x: "$Move2D" +# - test: +# if: "count($Child2D/preceding-sibling::*)=0" +# then: [T: "basen"] # phrase(the 'base' of the power) +# else: [T: "nedre index"] # phrase(x with 'subscript' 2) +# - pause: "medium" + +# - name: into-or-out-of +# tag: msup +# match: "$Move2D != ''" +# replace: +# - x: "$Move2D" +# - test: +# if: "count($Child2D/preceding-sibling::*)=0" +# then: [T: "basen"] # phrase(the 'base' of the power) +# else: [T: "övre index"] # phrase(x with 'superscript' 2) # FIX: it would be better to use the word used when reading (power, exponent, ...) +# - pause: "medium" + +# - name: into-or-out-of +# tag: msubsup +# match: "$Move2D != ''" +# replace: +# - x: "$Move2D" +# - test: +# - if: "count($Child2D/preceding-sibling::*)=0" +# then: [T: "basen"] # phrase(the 'base' of the power) +# - else_if: "count($Child2D/preceding-sibling::*)=1" +# then: [T: "nedre index"] # phrase(x with 'subscript' 2) +# else: [T: "övre index"] # phrase(x with 'superscript' 2) # FIX: it would be better to use the word used when reading (power, exponent, ...) +# - pause: "medium" + +# - name: into-or-out-of +# tag: munder +# match: "$Move2D != ''" +# replace: +# - x: "$Move2D" +# - test: +# if: "count($Child2D/preceding-sibling::*)=0" +# then: [T: "basen"] # phrase(the 'base' of the power) +# else: [T: "nedre index"] # phrase(the 'lower limit' of the function is zero) +# - pause: "medium" + +# - name: into-or-out-of +# tag: mover +# match: "$Move2D != ''" +# replace: +# - x: "$Move2D" +# - test: +# if: "count($Child2D/preceding-sibling::*)=0" +# then: [T: "basen"] # phrase(the 'base' of the power) +# else: [T: "övre index"] # phrase(the 'upper limit' of the function is zero) +# - pause: "medium" + +# - name: into-or-out-of +# tag: munderover +# match: "$Move2D != ''" +# replace: +# - x: "$Move2D" +# - test: +# - if: "count($Child2D/preceding-sibling::*)=0" +# then: [T: "basen"] # phrase(the 'base' of the power) +# - else_if: "count($Child2D/preceding-sibling::*)=1" +# then: [T: "nedre index"] # phrase(the 'lower limit' of the function is zero) +# else: [T: "övre index"] # phrase(the 'upper limit' of the function is zero) +# - pause: "medium" + +# - name: into-or-out-of +# tag: mmultiscripts +# match: "$Move2D != ''" +# replace: +# - test: +# if: "name($Child2D)!='none'" +# then: +# - with: +# variables: +# - NumPrecedingSiblings: "count($Child2D/preceding-sibling::*)" +# replace: +# - x: "$Move2D" +# - test: +# - if: "$NumPrecedingSiblings=0" +# then: [T: "basen"] # phrase(the 'base' of the power) +# - else_if: "$Child2D/preceding-sibling::*[self::m:mprescripts]" # are we before mprescripts and hence are postscripts +# then: +# - test: # in postscripts -- base shifts by one +# if: "$NumPrecedingSiblings mod 2 = 0" +# then: [T: "nedre index"] # phrase(x with 'subscript' 2) +# else: [T: "övre index"] # phrase(x with 'superscript' 2) +# else: +# - test: +# if: "$NumPrecedingSiblings mod 2 = 0" +# then: [T: "övre index"] # phrase(x with 'superscript' 2) +# else: [T: "nedre index"] # phrase(x with 'subscript' 2) +# - pause: "medium" + +# - name: into-or-out-of +# tag: mtd +# match: "$Move2D = 'into'" +# replace: +# - x: "$Move2D" +# - T: "kolumn" # phrase(the first 'column' in the table) +# - x: "count($Child2D/preceding-sibling::*)+1" +# - pause: "medium" + +# - name: into-or-out-of +# tag: [mtr, mlabeledtr] +# match: "$Move2D = 'into'" +# replace: +# - x: "$Move2D" +# - x: "count($Child2D/preceding-sibling::*)+1" +# - pause: "medium" + +# - name: default-move +# # nothing to do (not 2D) -- need to catch $Move2D though so rules based on NavCommand don't trigger +# tag: "*" +# match: "$Move2D != ''" +# replace: [] + +# # ********* Go back to last position *************** +# # This is first since start/end position shouldn't matter +# - name: move-last-location + + +# tag: "*" +# match: "$NavCommand = 'MoveLastLocation'" +# replace: +# - test: +# if: "$NavVerbosity != 'Terse'" +# then: +# - test: +# - if: "$PreviousNavCommand = 'ZoomIn'" +# then: [T: "ångra inzoomning"] # phrase('undo zoom in') +# - else_if: "$PreviousNavCommand = 'ZoomOut'" +# then: [T: "ångra utzoomning"] # phrase('undo zoom out') +# - else_if: "$PreviousNavCommand = 'ZoomInAll'" +# then: [T: "ångra inzoomning hela vägen"] # phrase('undo zooming in all the way') +# - else_if: "$PreviousNavCommand = 'ZoomOutAll'" +# then: [T: "ångra utzoomning hela vägen"] # phrase('undo zooming out all the way') +# - else_if: "$PreviousNavCommand = 'MovePrevious' or $PreviousNavCommand = 'MovePreviousZoom'" +# then: [T: "ångra gå vänster"] # phrase('undo move left') +# - else_if: "$PreviousNavCommand = 'MoveNext' or $PreviousNavCommand = 'MoveNextZoom'" +# then: [T: "ångra gå höger"] # phrase('undo move right') +# - else_if: "$PreviousNavCommand = 'None'" +# then: [T: "inget tidigare kommando"] # phrase('no previous command') +# - pause: "long" +# - set_variables: [NavNode: "@id"] + +# # many times, for typographic reasons, people include punctuation at the end of a math expr +# # these rules detect that and skip speaking it (should be similar regular rule) +# - name: skip-punct-at-end-zoom-in +# tag: mrow +# match: +# - "($NavCommand = 'ZoomIn' or $NavCommand = 'ZoomInAll' or $NavCommand = 'MoveNextZoom' or $NavCommand = 'MovePreviousZoom') and" +# - " parent::m:math and count(*)=2 and" +# - " *[2][translate(.,'.,;:?', '')='']" +# replace: +# - x: "*[1]" + +# # ********* ZoomIn *************** +# - name: zoom-in-leaf + +# tag: "*" +# match: "($NavCommand = 'ZoomIn' or $NavCommand = 'ZoomInAll') and IsNode(., 'leaf')" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" +# then: [T: "inzoomat hela vägen", pause: "long"] # phrase('zoomed in all of the way') +# - test: +# if: "$ReadZoomLevel!=-1" +# then: +# - set_variables: [ReadZoomLevel: "0"] +# - set_variables: [NavNode: "@id"] + +# # special case of zooming into a matrix or determinant -- move to the first row +# - name: zoom-in-matrix + +# tag: mrow +# match: +# - "$NavCommand = 'ZoomIn' and count(*)=3 and " +# - "*[2][self::m:mtable and (IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|'))]" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" +# then: [T: "zooma in", pause: "long"] # phrase('zoom in') +# - set_variables: [NavNode: "*[2]/*[1]/@id"] + +# # special case of zooming into a table -- move to the first row +# - name: zoom-in-table +# tag: mtable +# match: "$NavCommand = 'ZoomIn'" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" +# then: [T: "zooma in", pause: "long"] # phrase('zoom in') +# - set_variables: [NavNode: "*[1]/@id"] + +# - name: zoom-in-mrow-in-math +# # Moving to first or last is meaningless the 'math' has only an 'mrow' inside -- dig inside and do it again +# tag: math +# match: "count(*)=1 and ($NavCommand = 'ZoomIn' or $NavCommand = 'MoveNextZoom' or $NavCommand = 'MovePreviousZoom')" +# replace: +# - test: +# if: "$NavCommand = 'MovePreviousZoom'" +# then: [x: "*[last()]"] +# else: [x: "*[1]"] + +# - # For msqrt and menclose, if the single child isn't an mrow, don't zoom in +# name: zoom-in-again +# # If there is only one child, this isn't an interesting move -- zoom in again +# tag: "*" +# match: +# - "($NavCommand = 'ZoomIn' or " +# - " ($NavCommand = 'MoveNextZoom' or $NavCommand = 'MovePreviousZoom') and $NavMode='Enhanced') and " +# - "count(*)=1 and (*[1][self::m:mrow] and not(self::m:msqrt or self::m:menclose))" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" +# then: [T: "zooma in", pause: "long"] # phrase('zoom in') +# - with: +# variables: [MatchCounter: "$MatchCounter + 1"] +# replace: +# - test: +# if: "$NavCommand = 'MovePreviousZoom'" +# then: [x: "*[last()]"] +# else: [x: "*[1]"] + +# - name: zoom-in-enhanced + +# tag: "*" +# match: "$NavCommand = 'ZoomIn' and $NavMode='Enhanced'" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" +# then: [T: "zooma in", pause: "long"] # phrase('zoom in') +# - test: +# - if: "self::m:mtr or self::m:mlabeledtr" +# then: +# - with: +# variables: [Move2D: "'i'", Child2D: "*[1]/*[1]"] # phrase('in' the denominator) +# replace: [x: "."] +# - set_variables: [NavNode: "*[1]/*[1]/@id"] # skip mtd +# - else_if: "*[1][self::m:mrow and IsBracketed(., '(', ')', false) or IsBracketed(., '[', ']', false)]" # auto zoom +# then: +# - with: +# variables: [Move2D: "'i'", Child2D: "*[1]/*[2]"] # phrase('in' the denominator) +# replace: [x: "."] +# - set_variables: [NavNode: "*[1]/*[2]/@id"] # skip mtd +# else: +# - with: +# variables: [Move2D: "'i'", Child2D: "*[1]"] # phrase('in' the denominator) +# replace: [x: "."] +# - set_variables: [NavNode: "*[1]/@id"] + +# - name: zoom-in-2D-not-enhanced +# tag: "*" +# match: "$NavCommand = 'ZoomIn' and $NavMode!='Enhanced' and IsNode(., '2D')" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" +# then: [T: "zooma in", pause: "long"] # phrase('zoom in') +# - with: +# variables: [Move2D: "'i'", Child2D: "*[1]"] # phrase('in' the denominator) +# replace: [x: "."] +# - with: +# variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MoveNextZoom'"] +# replace: [x: "*[1]"] + +# - name: zoom-in-default +# tag: "*" +# match: "$NavCommand = 'ZoomIn'" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" +# then: [T: "zooma in", pause: "long"] # phrase('zoom in') +# - with: +# variables: [Move2D: "'i'", Child2D: "*[1]"] # phrase('in' the denominator) +# replace: [x: "."] +# - test: +# if: "$NavMode='Character'" +# then: +# - with: +# variables: [MatchCounter: "$MatchCounter + 1"] +# replace: [x: "*[1]"] +# else_test: +# if: "self::m:mtd" +# then: [x: "*[1]"] +# else: +# - test: +# if: "$ReadZoomLevel!=-1" +# then: +# - set_variables: [ReadZoomLevel: "DistanceFromLeaf(*[1], true, $NavMode!='Character')"] +# - set_variables: [NavNode: "*[1]/@id"] + +# - name: zoom-in-all-default +# tag: "*" +# match: "$NavCommand = 'ZoomInAll'" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" +# then: [T: "zooma in hela vägen", pause: "medium"] # phrase('zoom in all the way') +# - with: +# variables: [Move2D: "'i'", Child2D: "*[1]"] # phrase('in' the denominator) +# replace: [x: "."] +# - with: +# variables: [MatchCounter: "$MatchCounter + 1"] +# replace: [x: "*[1]"] + +# - name: zoom-out +# tag: math +# match: "$NavCommand = 'ZoomOut' or $NavCommand = 'ZoomOutAll'" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" +# then: [T: "utzoomat hela vägen", pause: "long"] # phrase('zoomed out all the the way') +# - set_variables: [NavNode: "*[1]/@id"] # no-op for $NavCommand = 'ZoomOut' + +# - name: zoom-out-top +# tag: "*" +# match: +# - "($NavCommand = 'ZoomOut' or $NavCommand = 'ZoomOutAll') and" +# - "parent::m:math " +# replace: +# - x: ".." # let math rule deal with it + +# - name: skip-punct-at-end-zoom-out +# tag: mrow +# match: +# - "($NavCommand = 'ZoomOut' or $NavCommand = 'ZoomOutAll') and" +# - " parent::m:math and count(*)=2 and" +# - " *[2][translate(.,'.,;:?', '')='']" +# replace: +# - x: ".." + +# - name: zoom-out-all-default +# tag: "*" +# match: "$NavCommand = 'ZoomOutAll'" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" +# then: [T: "utzoomat hela vägen", pause: "medium"] # phrase('zoomed out all the the way') +# - with: +# variables: [Move2D: "'lämnar'", Child2D: "."] +# replace: [x: ".."] +# - with: +# variables: [MatchCounter: "$MatchCounter + 1"] +# replace: [x: ".."] + +# # deal with internal zooming: MoveNextZoom and MovePreviousZoom + +# # start with Enhanced mode +# - name: move-zoom-enhanced +# tag: "*" +# match: +# - "($NavCommand = 'MoveNextZoom' or $NavCommand = 'MovePreviousZoom') and " +# - "$NavMode = 'Enhanced'" +# replace: +# # don't bother with MatchCounter since we only get here if > 1 +# - with: +# variables: [Move2D: "'i'", Child2D: "*[1]"] # phrase('in' the denominator) +# replace: [x: "."] +# - test: +# - if: "count(*)> 1 or IsNode(., 'leaf') or self::m:msqrt or self::m:menclose" +# then: [set_variables: [NavNode: "@id"]] +# else: [x: "*[1]"] + +# - name: move-next-zoom-not-enhanced +# # $ReadZoomLevel must be >= 0 +# tag: "*" +# match: "$NavCommand = 'MoveNextZoom'" +# replace: +# #don't bother with MatchCounter since we only get here if > 1 +# - test: +# if: "$ReadZoomLevel >= DistanceFromLeaf(., false, $NavMode!='Character')" +# then: +# # - with: +# # variables: [Move2D: "'i'", Child2D: "following-sibling::*[1]"] # phrase('in' the denominator) +# # replace: [x: ".."] +# - set_variables: [NavNode: "@id"] +# else: +# - with: +# variables: [Move2D: "'i'", Child2D: "*[1]"] # phrase('in' the denominator) +# replace: [x: "."] +# - x: "*[1]" + +# - name: move-previous-zoom-not-enhanced +# # $ReadZoomLevel must be >= 0 +# tag: "*" +# match: "$NavCommand = 'MovePreviousZoom'" +# replace: +# #don't bother with MatchCounter since we only get here if > 1 +# - test: +# if: "$ReadZoomLevel >= DistanceFromLeaf(., true, $NavMode!='Character')" +# then: +# # - with: +# # variables: [Move2D: "'i'", Child2D: "preceding-sibling::*[1]"] # phrase('in' the denominator) +# # replace: [x: ".."] +# - set_variables: [NavNode: "@id"] +# else: +# - with: +# variables: [Move2D: "'i'", Child2D: "*[last()]"] # phrase('in' the denominator) +# replace: [x: "."] +# - x: "*[last()]" + +# # ********* ZoomOut *************** +# - name: zoom-out-default + + +# tag: mtd +# match: "$Move2D = '' and ($NavCommand = 'ZoomOut')" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" +# then: [T: "zooma ut", pause: "medium"] # phrase('zoom out' of expression) +# # we need to speak it here +# - T: "rad" # phrase(the first 'row' of the matrix) +# # if we let the speech rules speak the row, it is given just the MathML for the row, so the row # will always be '1' +# - x: "count(../preceding-sibling::*)+1" +# - pause: medium +# - set_variables: [NavNode: "../@id"] + +# - name: zoom-out +# # a row around a single element -- these might duplicate the position/offset, so we jump an extra level here +# tag: "*" +# match: "$NavCommand = 'ZoomOut'" +# replace: +# - with: +# variables: [MatchCounter: "$MatchCounter + 1"] +# replace: +# - test: +# if: "$MatchCounter = 1 and $NavVerbosity = 'Verbose'" +# then: [T: "zooma ut", pause: "medium"] # phrase('zoom out' of the expression) +# - test: +# if: "$NavMode='Enhanced' and parent::*[self::m:mrow and IsBracketed(., '(', ')', false) or IsBracketed(., '[', ']', false)]" +# then: [x: ".."] # auto-zoom: move out a level and retry +# else: +# - with: +# variables: [Move2D: "'lämnar'", Child2D: "."] +# replace: [x: ".."] +# - test: +# if: "parent::m:mtd" +# then: [x: ".."] +# else: +# - test: +# if: "$ReadZoomLevel!=-1" +# then: [set_variables: [ReadZoomLevel: "DistanceFromLeaf(.., true, $NavMode!='Character')"]] +# - set_variables: [NavNode: "../@id"] + +# # ********* MoveStart/End *************** +# - name: math-move-to-start-or-end +# tag: math +# match: "$NavCommand = 'MoveStart' or $NavCommand = 'MoveLineStart' or $NavCommand = 'MoveEnd' or $NavCommand = 'MoveLineEnd'" +# replace: +# - with: +# variables: [MatchCounter: "$MatchCounter + 1"] +# replace: +# - test: +# if: "$NavVerbosity = 'Verbose'" +# then: +# - test: +# - if: "$NavCommand = 'MoveStart'" +# then: [T: "gå till start matematik"] # phrase('move to start of math') +# - else_if: "$NavCommand = 'MoveLineStart'" +# then: [T: "gå till början av raden"] # phrase('move to start of line') +# - else_if: "$NavCommand = 'MoveEnd'" +# then: [T: "gå till slut matematik"] # phrase('move to end of math') +# else: [T: "gå till slutet av raden"] # "$NavCommand = 'MoveLineEnd'" # phrase('move to end of line') +# - pause: "medium" +# - test: +# if: "$NavCommand = 'MoveStart' or $NavCommand = 'MoveLineStart'" +# then: +# # move inside of the mrow inside of 'math' or inside the fraction, etc (hence two levels down) +# - with: +# variables: [NavCommand: "'MoveNextZoom'"] +# replace: [x: "*[1]/*[1]"] +# else: +# - with: +# variables: [NavCommand: "'MovePreviousZoom'"] +# replace: [x: "*[last()]/*[last()]"] + +# # We stop when the parent is 2d (e.g., frac), but not if in leaf base of msub/msup/msubsup/mmultiscripts because that's really on the same line +# - name: move-to-start-or-end-2d +# tag: "*" +# match: +# - "($NavCommand = 'MoveLineStart' or $NavCommand = 'MoveLineEnd') and IsNode(.., '2D') and" +# - "not( IsNode(., 'leaf') and (parent::m:msub or parent::m:msup or parent::m:msubsup or parent::m:mmultiscripts) )" +# replace: +# - test: +# if: "$NavVerbosity = 'Verbose'" +# then: +# - test: +# if: "$NavCommand = 'MoveLineStart'" +# then: [T: "gå till början av raden"] # phrase('move to start of line') +# else: [T: "gå till slutet av raden"] # "$NavCommand = 'MoveLineEnd'" # phrase('move to end of line') +# - pause: "medium" +# - test: +# if: "self::m:mrow" +# then_test: +# if: "$NavCommand = 'MoveLineStart'" +# then: +# - with: +# variables: [NavCommand: "'MoveNextZoom'"] +# replace: [x: "*[1]"] +# else: +# - with: +# variables: [NavCommand: "'MovePreviousZoom'"] +# replace: [x: "*[last()]"] +# else: [set_variables: [NavNode: "@id"]] + +# - name: move-to-start-or-end-default +# tag: "*" +# match: "$NavCommand = 'MoveStart' or $NavCommand = 'MoveLineStart' or $NavCommand = 'MoveEnd' or $NavCommand = 'MoveLineEnd'" +# replace: +# - with: +# variables: [MatchCounter: "$MatchCounter + 1"] +# replace: [x: ".."] + +# # Table-related movement +# # Typically, we need to zoom out to the mtd level, then we move the appropriate direction +# - name: not-in-table + + +# tag: math +# match: +# - "$NavCommand='MoveCellPrevious' or $NavCommand='MoveCellNext' or" +# - "$NavCommand='MoveCellUp' or $NavCommand='MoveCellDown' or" +# - "$NavCommand='MoveColumnStart' or $NavCommand='MoveColumnEnd' or" +# - "$NavCommand='ReadCellCurrent'" +# replace: +# - T: "inte i tabellen" # phrase('not in table') +# - pause: long +# - set_variables: [SpeakExpression: "'false'"] + +# - name: move-cell-previous +# tag: mtd +# match: "$NavCommand='MoveCellPrevious'" +# replace: +# - test: +# if: "preceding-sibling::*" +# then: +# - test: +# if: "$NavVerbosity = 'Verbose'" +# then: +# - T: "gå vänster" # phrase('move left') +# - pause: short +# - test: +# if: "$NavVerbosity != 'Terse'" +# then: +# - T: "kolumn" # phrase(the first 'column' of the table) +# - x: "count(preceding-sibling::*)" +# - pause: medium +# - test: +# if: "$NavMode='Character'" +# then: +# - with: +# variables: [NavCommand: "'MovePreviousZoom'"] +# replace: [x: "preceding-sibling::*[1]"] +# else: +# - set_variables: [NavNode: "preceding-sibling::*[1]/*[1]/@id"] +# else: +# - T: "ingen föregående kolumn" # phrase('no previous column' in the table) +# - set_variables: [SpeakExpression: "'false'"] + +# - name: move-cell-next +# tag: mtd +# match: "$NavCommand='MoveCellNext'" +# replace: +# - test: +# if: "following-sibling::*" +# then: +# - test: +# if: "$NavVerbosity = 'Verbose'" +# then: +# - T: "gå höger" # phrase('move right') +# - pause: short +# - test: +# if: "$NavVerbosity != 'Terse'" +# then: +# - T: "kolumn" # phrase(the first 'column' in the table) +# - x: "count(preceding-sibling::*)+2" +# - pause: medium +# - test: +# if: "$NavMode='Character'" +# then: +# - with: +# variables: [NavCommand: "'MoveNextZoom'"] +# replace: [x: "following-sibling::*[1]"] +# else: +# - set_variables: [NavNode: "following-sibling::*[1]/*[1]/@id"] +# else: +# - T: "ingen följande kolumn" # phrase('no next column' in the table) +# - set_variables: [SpeakExpression: "'false'"] + +# - name: move-cell-up +# tag: mtd +# match: "$NavCommand='MoveCellUp'" +# replace: +# - test: +# if: "../preceding-sibling::*" +# then: +# - with: +# variables: [Column: "count(preceding-sibling::*)+1"] # store this because otherwise the value is used in the wrong context below +# replace: +# - test: +# if: "$NavVerbosity = 'Verbose'" +# then: +# - T: "gå upp" # phrase('move up' to previous row in the table) +# - pause: short +# - test: +# if: "$NavVerbosity != 'Terse'" +# then: +# - T: "rad" # phrase(the previous 'row' in the table) +# - x: "count(../preceding-sibling::*)" +# - pause: short +# - T: "kolumn" # phrase(the previous 'column' in the table) +# - x: "count(preceding-sibling::*)+1" +# - pause: medium +# - test: +# if: "$NavMode='Character'" +# then: +# - with: +# variables: [NavCommand: "'MoveNextZoom'"] +# replace: [x: "../preceding-sibling::*[1]/*[$Column]"] +# else: +# - set_variables: [NavNode: "../preceding-sibling::*[1]/*[$Column]/*[1]/@id"] +# else: +# - T: "ingen föregående rad" # phrase('no previous row' in the table) +# - set_variables: [SpeakExpression: "'false'"] + +# - name: move-cell-down +# tag: mtd +# match: "$NavCommand='MoveCellDown'" +# replace: +# - test: +# if: "../following-sibling::*" +# then: +# - with: +# variables: [Column: "count(preceding-sibling::*)+1"] # store this because otherwise the value is used in the wrong context below +# replace: +# - test: +# if: "$NavVerbosity = 'Verbose'" +# then: +# - T: "gå ner" # phrase('move down to the next row in the table) +# - pause: short +# - test: +# if: "$NavVerbosity != 'Terse'" +# then: +# - T: "rad" # phrase(the next 'row' in the table) +# - x: "count(../preceding-sibling::*)+2" +# - pause: short +# - T: "kolumn" # phrase(the next 'column' in the table) +# - x: "count(preceding-sibling::*)+1" +# - pause: medium +# - test: +# if: "$NavMode='Character'" +# then: +# - with: +# variables: [NavCommand: "'MoveNextZoom'"] +# replace: [x: "../following-sibling::*[1]/*[$Column]"] +# else: +# - set_variables: [NavNode: "../following-sibling::*[1]/*[$Column]/*[1]/@id"] +# else: +# - T: "ingen följande rad" # phrase('no next row' in the table) +# - set_variables: [SpeakExpression: "'false'"] + +# - name: move-cell-up +# tag: [mtr, mlabeledtr] +# match: "$NavCommand='MoveCellUp'" +# replace: +# - test: +# if: "preceding-sibling::*" +# then: +# - test: +# if: "$NavVerbosity = 'Verbose'" +# then: +# - T: "gå upp" # phrase('move up' to the previous row in the table) +# - pause: medium +# - test: +# if: "$NavVerbosity != 'Terse'" +# then: +# - T: "rad" # phrase(the previous 'row' in the table) +# - x: "count(preceding-sibling::*)" +# - pause: medium +# - test: +# if: "$NavMode='Character'" +# then: +# - with: +# variables: [NavCommand: "'MoveNextZoom'"] +# replace: [x: "preceding-sibling::*[1]"] +# else: +# - set_variables: [NavNode: "preceding-sibling::*[1]/@id"] +# else: +# - T: "ingen föregående rad" # phrase('no previous row' in the table) +# - set_variables: [SpeakExpression: "'false'"] + +# - name: move-cell-down +# tag: [mtr, mlabeledtr] +# match: "$NavCommand='MoveCellDown'" +# replace: +# - test: +# if: "following-sibling::*" +# then: +# - test: +# if: "$NavVerbosity = 'Verbose'" +# then: +# - T: "gå ner" # phrase('move down' to the next row in the table) +# - pause: medium +# - test: +# if: "$NavVerbosity != 'Terse'" +# then: +# - T: "rad" # phrase(the previous 'row' in the table) +# - x: "count(preceding-sibling::*)+2" +# - pause: medium +# - test: +# if: "$NavMode='Character'" +# then: +# - with: +# variables: [NavCommand: "'MoveNextZoom'"] +# replace: [x: "following-sibling::*[1]"] +# else: +# - set_variables: [NavNode: "following-sibling::*[1]/@id"] +# else: +# - T: "ingen följande rad" # phrase('no next row' in the table) +# - set_variables: [SpeakExpression: "'false'"] + +# - name: default-read-cell +# tag: "*" +# match: "$NavCommand='ReadCellCurrent'" +# replace: +# - with: +# variables: [MTD: "ancestor::m:mtd"] +# replace: +# - test: +# if: "$MTD" +# then: +# - test: +# if: "$NavVerbosity = 'Verbose'" +# then: +# - T: "läs aktuellt värde" # phrase('read current entry' in the table) +# - pause: medium +# - test: +# if: "$NavVerbosity != 'Terse'" +# then: +# - T: "rad" # phrase(the previous 'row' in the table) +# - x: "count($MTD[1]/../preceding-sibling::*)+1" +# - T: "kolumn" # phrase(the previous 'column' in the table) +# - x: "count($MTD[1]/preceding-sibling::*)+1" +# - pause: short +# - set_variables: [NavNode: "$MTD[1]/*[1]/@id"] +# else: +# - T: "inte i tabellen" # phrase('not in table' or matrix) +# - pause: long +# - set_variables: [SpeakExpression: "'false'"] + +# # mtd ? ( $NavCommand='MoveColumnStart' ) +# # => MoveColStart { +# # ruleRef = name(^^match); +# # column = index(match); +# # ::StartPosition = ^^match[0][index(match)][0].dfs; +# # ::EndPosition = ^^match[0][index(match)][0].offset; +# # }; + +# # mtd ? ( $NavCommand='MoveColumnEnd' ) +# # => MoveColEnd { +# # ruleRef = name(^^match); +# # column = index(match); +# # ::StartPosition = ^^match[count(^^match)-1][index(match)][0].dfs; +# # ::EndPosition = ^^match[count(^^match)-1][index(match)][0].offset; +# # }; + + + +# # # Rules for columnar math (mstack and mlongdiv) -- each row is an msrow or mscarries except for the start of mlongdiv +# # # FIX: not dealing with different number of digits on different lines +# # # FIX: not dealing with + (etc) on same line if they are on the right side (Dutch, others) +# # # FIX: not dealing with intervening msline (say it and move on??) +# # # FIX: not dealing with carries well +# # # FIX: not dealing with navigation of first three children of mlongdiv +# # char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# # ($NavCommand="MovePrevious" || $NavCommand='MoveCellPrevious') && has_previous(match) ) +# # => MoveCell { +# # ruleRef = name(^^match); +# # wordRef = "previous"; +# # ::StartPosition = previous(match).dfs; +# # ::EndPosition = previous(match).offset; +# # }; + +# # # no previous child -- in first column -- don't move +# # char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# # ($NavCommand="MovePrevious" || $NavCommand='MoveCellPrevious' ) ) +# # => MoveCell { +# # ruleRef = name(^^match); +# # wordRef = "previous"; +# # childIndex = -1; # key to know what to say for each notation +# # ::SpeakAfterMove = false; +# # }; + +# # char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# # ($NavCommand="MoveNext" || $NavCommand='MoveCellNext') && has_next(match) ) +# # => MoveCell { +# # ruleRef = name(^^match); +# # wordRef = "next"; +# # ::StartPosition = next(match).dfs; +# # ::EndPosition = next(match).offset; +# # }; + +# # # no next child -- in first column -- don't move +# # char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# # ($NavCommand="MoveNext" || $NavCommand='MoveCellNext' ) ) +# # => MoveCell { +# # ruleRef = name(^^match); +# # wordRef = "next"; +# # childIndex = -1; # key to know what to say for each notation +# # ::SpeakAfterMove = false; +# # }; + +# # char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# # $NavCommand='MoveCellUp' && has_previous(^^match) ) +# # => MoveCell { +# # ruleRef = name(^^match); +# # wordRef = "up"; +# # ::StartPosition = ^^^match[index(^^match)-1][-1][index(match)-count(^match)].dfs; +# # ::EndPosition = ^^^match[index(^^match)-1][-1][index(match)-count(^match)].offset; +# # }; + +# # # no previous child -- in first column -- don't move +# # char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# # $NavCommand='MoveCellUp' ) +# # => MoveCell { +# # ruleRef = name(^^match); +# # wordRef = "up"; +# # childIndex = -1; # key to know what to say for each notation +# # ::SpeakAfterMove = false; +# # }; + +# # char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# # $NavCommand='MoveCellDown' && has_next(^^match) ) +# # => MoveCell { +# # ruleRef = name(^^match); +# # wordRef = "down"; +# # ::StartPosition = ^^^match[index(^^match)+1][-1][index(match)-count(^match)].dfs; +# # ::EndPosition = ^^^match[index(^^match)+1][-1][index(match)-count(^match)].offset; +# # }; + +# # # no previous child -- in first column -- don't move +# # char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# # $NavCommand='MoveCellDown' ) +# # => MoveCell { +# # ruleRef = name(^^match); +# # wordRef = "down"; +# # childIndex = -1; # key to know what to say for each notation +# # ::SpeakAfterMove = false; +# # }; + +# # char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# # $NavCommand='MoveColumnStart' ) +# # => MoveColStart { +# # ruleRef = name(^^match); +# # column = index(match); +# # ::StartPosition = ^^^match[0][-1][index(match)-count(^match)].dfs; +# # ::EndPosition = ^^^match[0][-1][index(match)-count(^match)].offset; +# # }; + +# # char ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# # $NavCommand='MoveColumnEnd' ) +# # => MoveColEnd { +# # ruleRef = name(^^match); +# # column = index(match); +# # ::StartPosition = ^^^match[count(^^^match)-1][-1][index(match)-count(^match)].dfs; +# # ::EndPosition = ^^^match[count(^^^match)-1][-1][index(match)-count(^match)].offset; +# # }; + +# # any ? ( (name(match)=="mn" || name(match)=="none") && +# # has_parent(match) && name(^match)=="mscarries" && +# # ($NavCommand="MovePrevious" || $NavCommand='MoveCellPrevious') && has_previous(match) ) +# # => MoveCell { +# # ruleRef = name(^match); +# # wordRef = "previous"; +# # ::StartPosition = previous(match).dfs; +# # ::EndPosition = previous(match).offset; +# # }; + +# # # no previous child -- in first column -- don't move +# # any ? ( (name(match)=="mn" || name(match)=="none") && +# # has_parent(match) && name(^match)=="mscarries" && +# # ($NavCommand="MovePrevious" || $NavCommand='MoveCellPrevious') ) +# # => MoveCell { +# # ruleRef = name(^match); +# # wordRef = "previous"; +# # childIndex = -1; # key to know what to say for each notation +# # ::SpeakAfterMove = false; +# # }; + +# # any ? ( (name(match)=="mn" || name(match)=="none") && +# # has_parent(match) && name(^match)=="mscarries" && +# # ($NavCommand="MoveNext" || $NavCommand='MoveCellNext') && has_next(match) ) +# # => MoveCell { +# # ruleRef = name(^match); +# # wordRef = "next"; +# # ::StartPosition = next(match).dfs; +# # ::EndPosition = next(match).offset; +# # }; + +# # # no next child -- in last column -- don't move +# # any ? ( (name(match)=="mn" || name(match)=="none") && +# # has_parent(match) && name(^match)=="mscarries" && +# # ($NavCommand="MoveNext" || $NavCommand='MoveCellNext') ) +# # => MoveCell { +# # ruleRef = name(^match); +# # wordRef = "next"; +# # childIndex = -1; # key to know what to say for each notation +# # ::SpeakAfterMove = false; +# # }; + +# # any ? ( (name(match)=="mn" || name(match)=="none") && +# # has_parent(match) && name(^match)=="mscarries" && +# # $NavCommand='MoveCellUp' && has_previous(^match) ) +# # => MoveCell { +# # ruleRef = name(^match); +# # wordRef = "up"; +# # ::StartPosition = ^^match[index(^match)-1][index(match)-count(^match)].dfs; +# # ::EndPosition = ^^match[index(^match)-1][index(match)-count(^match)].offset; +# # }; + +# # # no previous child -- in first row -- don't move +# # any ? ( (name(match)=="mn" || name(match)=="none") && +# # has_parent(match) && name(^match)=="mscarries" && +# # $NavCommand='MoveCellUp' ) +# # => MoveCell { +# # ruleRef = name(^match); +# # wordRef = "up"; +# # childIndex = -1; # key to know what to say for each notation +# # ::SpeakAfterMove = false; +# # }; + +# # any ? ( (name(match)=="mn" || name(match)=="none") && +# # has_parent(match) && name(^match)=="mscarries" && +# # $NavCommand='MoveCellDown' && has_next(^match) ) +# # => MoveCell { +# # ruleRef = name(^match); +# # wordRef = "down"; +# # ::StartPosition = ^^match[index(^match)+1][-1][index(match)-count(^match)].dfs; +# # ::EndPosition = ^^match[index(^match)+1][-1][index(match)-count(^match)].offset; +# # }; + +# # # no next child -- in last row -- don't move +# # any ? ( (name(match)=="mn" || name(match)=="none") && +# # has_parent(match) && name(^match)=="mscarries" && +# # $NavCommand='MoveCellDown' ) +# # => MoveCell { +# # ruleRef = name(^match); +# # wordRef = "down"; +# # childIndex = -1; # key to know what to say for each notation +# # ::SpeakAfterMove = false; +# # }; + +# # mn ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# # $NavCommand='MoveColumnStart' ) +# # => MoveColStart { +# # ruleRef = name(^^match); +# # column = index(match); +# # ::StartPosition = ^^^match[0][-1][index(match)-count(^match)].dfs; +# # ::EndPosition = ^^^match[0][-1][index(match)-count(^match)].offset; +# # }; + +# # mn ? ( has_parent(match, 2) && name(^match)=="mn" && name(^^match)=="msrow" && +# # $NavCommand='MoveColumnEnd' ) +# # => MoveColEnd { +# # ruleRef = name(^^match); +# # column = index(match); +# # ::StartPosition = ^^^match[count(^^^match)-1][-1][index(match)-count(^match)].dfs; +# # ::EndPosition = ^^^match[count(^^^match)-1][-1][index(match)-count(^match)].offset; +# # }; + + + +# - name: default-cell-move + +# tag: "*" +# match: +# - "$NavCommand='MoveCellPrevious' or $NavCommand='MoveCellNext' or" +# - "$NavCommand='MoveCellUp' or $NavCommand='MoveCellDown' or" +# - "$NavCommand='MoveColumnStart' or $NavCommand='MoveColumnEnd' or" +# - "$NavCommand='ReadCellCurrent'" +# replace: +# - test: +# if: "ancestor::m:mtd" +# then: +# - x: "ancestor::m:mtd[1]" # try again on an mtd node +# else: +# - T: "inte i tabellen" # phrase('not in table' or matrix) +# - pause: long +# - set_variables: [SpeakExpression: "'false'"] + +# # ======== Move/Read/Describe Next rules ================= + +# # skip 'none' +# - name: move-next-none +# tag: [none, mprescripts] +# match: +# - "($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext' or $NavCommand = 'DescribePrevious' or $NavCommand = 'MoveNextZoom') and" +# - "parent::*[1][name(.)='mmultiscripts'] and following-sibling::*" +# replace: +# - with: +# variables: [Following: "following-sibling::*[1]"] +# replace: +# # two 'none's in a row -- move over and try again; one 'none', zoom in on next +# - test: +# if: "$Following[name(.)='none']" +# then: [x: "$Following"] +# else: +# - with: +# variables: [Move2D: "'i'", Child2D: "$Following"] # phrase('in' the denominator) +# replace: [x: ".."] +# - with: +# variables: [NavCommand: "'MoveNextZoom'"] +# replace: [x: "$Following"] + +# # skip 'none' +# - name: move-previous-none +# tag: [none, mprescripts] +# match: +# - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious' or $NavCommand = 'MovePreviousZoom') and" +# - "parent::*[1][name(.)='mmultiscripts'] and preceding-sibling::*" +# replace: +# - with: +# variables: [Preceding: "preceding-sibling::*[1]"] +# replace: +# # two 'none's in a row -- move over and try again; one 'none', zoom in on preceding +# - test: +# if: "$Preceding[name(.)='none']" +# then: [x: "$Preceding"] +# else: +# - with: +# variables: [Move2D: "'i'", Child2D: "$Preceding"] # phrase('in' the denominator) +# replace: [x: ".."] +# - with: +# variables: [NavCommand: "'MovePreviousZoom'"] +# replace: [x: "$Preceding"] + + + +# # skip invisible chars except for Enhanced mode when "times" should be read +# - name: move-next-invisible +# tag: "*" +# match: +# - "($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext') and" +# - "following-sibling::*[1][name(.)='mo' and translate(., '\u2061\u2062\u2063\u2064', '')='']" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" +# then: +# - test: +# - if: "$NavCommand = 'MoveNext'" +# then: [T: "gå"] # phrase('move' to next entry in table) +# - else_if: "$NavCommand = 'ReadNext'" +# then: [T: "läs"] # phrase('read' next entry in table) +# else: [T: "beskriv"] # phrase('describe' next entry in table) +# - T: "höger" # phrase(move 'right') # phrase(move 'right') +# - pause: short +# - with: +# variables: [MatchCounter: "$MatchCounter + 1"] +# replace: +# - test: +# if: "following-sibling::*[1][.='\u2062' or .='\u2064'] and $NavMode='Enhanced'" # invisible times and plus +# then: [set_variables: [NavNode: "following-sibling::*[1]/@id"]] +# else: [x: "following-sibling::*[1]"] + +# - name: move-next-no-auto-zoom-at-edge +# # at edge of 2D and in a mode where moving right isn't an option +# tag: "*" +# variables: [EdgeNode: "EdgeNode(., 'right', '2D')"] +# match: "$NavCommand = 'MoveNext' and $NavMode!='Character' and not($AutoZoomOut) and $EdgeNode/@id!=@id" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity != 'Terse' and $NavCommand = 'MoveNext'" +# then: +# - T: "kan inte gå höger" # phrase('cannot move right') +# - with: +# variables: [Move2D: "'end of'", Child2D: "$EdgeNode/*[last()]"] +# replace: [x: "$EdgeNode"] +# - pause: long +# - set_variables: [SpeakExpression: "'false'"] + +# - name: move-next-no-auto-zoom-at-edge-math +# # at edge of math -- no where to go (must be after we rule out being at the edge of 2D) because we want to speak that +# tag: "*" +# match: +# - "($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext') and" +# - "(self::m:math or name(EdgeNode(., 'right', 'math'))='math')" # at edge of math +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" +# then: +# - T: "kan inte" # phrase('cannot' move right in expression) +# - test: +# - if: "$NavCommand = 'MoveNext'" +# then: [T: "gå"] # phrase('move' to next entry in table) +# - else_if: "$NavCommand = 'ReadNext'" +# then: [T: "läs"] # phrase('read' next entry in table) +# else: [T: "beskriv"] # phrase('describe' next entry in table) +# - T: "höger, slut matematik" # phrase(move 'right, end of math') +# - pause: long +# - set_variables: [SpeakExpression: "'false'"] + +# - name: move-next-auto-zoom-up-one-level +# # Last child or in auto-zoom'd in-- move up a level and try again +# # Note: we've already checked the for the case where we are at an edge and should not AutoZoomOut +# tag: "*" +# match: +# - "($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext') and" +# - "( not(following-sibling::*) or" +# - " ( $NavMode='Enhanced' and " +# - " count(following-sibling::*)=1 and (IsBracketed(.., '(', ')') or IsBracketed(.., '[', ']'))" +# - " )" +# - ")" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" +# then: +# - test: +# - if: "$NavCommand = 'MoveNext'" +# then: [T: "gå"] # phrase('move' to next entry in table) +# - else_if: "$NavCommand = 'ReadNext'" +# then: [T: "läs"] # phrase('read' next entry in table) +# else: [T: "beskriv"] # phrase('describe' next entry in table) +# - T: "höger" # phrase(move 'right') # phrase(move 'right') +# - pause: short +# - with: +# variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MoveNext'"] +# replace: +# - test: +# if: "following-sibling::*" +# then: +# - with: +# variables: [Move2D: "'i'", Child2D: "."] # phrase('in' the denominator) +# replace: [x: ".."] +# else: +# - with: +# variables: [Move2D: "'lämnar'", Child2D: "."] +# replace: [x: ".."] +# - test: +# if: "following-sibling::*" +# then: +# - x: ".." # move out of parens +# else: +# - x: ".." + +# # At this point, if XXXNext, then we know there is must be a right sibling +# - name: move-next-default +# tag: mtd +# match: "$Move2D = '' and ($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext')" +# replace: +# - test: +# # can't get here with MatchCounter=0, so no need to echo command +# if: "following-sibling::*" +# then: +# - test: +# if: "$NavVerbosity != 'Terse'" +# then: +# - T: "kolumn" # phrase(the previous 'column' in the table) +# - x: "count(preceding-sibling::*)+2" +# - pause: short +# - test: +# if: "$NavMode = 'Character'" +# then: +# - with: +# variables: [NavCommand: "'MoveNextZoom'"] +# replace: [x: "following-sibling::*[1]"] +# else: [set_variables: [NavNode: "following-sibling::*[1]/*[1]/@id"]] +# else: +# - x: ".." # try again at the row level + +# - name: move-next-default +# tag: [mtr, mlabeledtr] +# match: "$Move2D = '' and ($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext')" +# replace: +# - test: +# # can't get here with MatchCounter=0, so no need to echo command +# if: "following-sibling::*" +# then: +# - T: "rad" # phrase(the previous 'row' in the table) +# - x: "count(preceding-sibling::*)+2" +# - T: "kolumn 1" # phrase('column 1' in the table) +# - pause: medium +# - test: +# if: "$NavMode = 'Character'" +# then: +# - with: +# variables: [NavCommand: "'MoveNextZoom'"] +# replace: [x: "following-sibling::*[1]"] +# else: +# - set_variables: [NavNode: "following-sibling::*[1]/*[1]/*[1]/@id"] +# else: [x: ".."] # try again for after + +# - name: move-next-auto-zoom-parens +# # auto-zoom into next child if next child is parenthesized expr +# tag: "*" +# match: +# - "($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext') and" +# - "$NavMode='Enhanced' and" +# - "parent::m:mrow and following-sibling::* and" +# - "following-sibling::*[1][self::m:mrow and count(*)=3 and " #exclude empty parens +# - " (IsBracketed(., '(', ')') or IsBracketed(., '[', ']'))" +# - " ]" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" +# then: +# - test: +# - if: "$NavCommand = 'MoveNext'" +# then: [T: "gå"] # phrase('move' to next entry in table) +# - else_if: "$NavCommand = 'ReadNext'" +# then: [T: "läs"] # phrase('read' next entry in table) +# else: [T: "beskriv"] # phrase('describe' next entry in table) +# - T: "höger" # phrase(move 'right') # phrase(move 'right') +# - pause: short +# - set_variables: [NavNode: "following-sibling::*[1]/*[2]/@id"] + +# # normal cases for MoveNext +# - name: move-next-locked-zoom-level +# # locked zoom level +# tag: "*" +# match: +# - "($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext') and" +# - "$ReadZoomLevel>=0" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" +# then: +# - test: +# - if: "$NavCommand = 'MoveNext'" +# then: [T: "gå"] # phrase('move' to next entry in table) +# - else_if: "$NavCommand = 'ReadNext'" +# then: [T: "läs"] # phrase('read' next entry in table) +# else: [T: "beskriv"] # phrase('describe' next entry in table) +# - T: "höger" # phrase(move 'right') # phrase(move 'right') +# - pause: short +# - test: +# # if in base (nothing before), we must be moving to a script, so "in" will be said +# if: "preceding-sibling::* and following-sibling::*[1][name(.)='none']" +# then: +# - with: +# variables: [Move2D: "'lämnar'", Child2D: "."] +# replace: [x: ".."] +# - with: +# variables: [MatchCounter: "$MatchCounter + 1"] +# replace: [x: "following-sibling::*[1]"] # skip over 'none' +# else: +# - with: +# variables: [Move2D: "'i'", Child2D: "following-sibling::*[1]"] # phrase('in' the denominator) +# replace: [x: ".."] +# - with: +# variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MoveNextZoom'"] +# replace: [x: "following-sibling::*[1]"] + +# - name: move-next-default +# tag: "*" +# match: "$NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext'" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" +# then: +# - test: +# - if: "$NavCommand = 'MoveNext'" +# then: [T: "gå"] # phrase('move' to next entry in table) +# - else_if: "$NavCommand = 'ReadNext'" +# then: [T: "läs"] # phrase('read' next entry in table) +# else: [T: "beskriv"] # phrase('describe' next entry in table) +# - T: "höger" # phrase(move 'right') # phrase(move 'right') +# - pause: short +# - test: +# if: "IsNode(.., '2D')" +# then: +# - with: +# variables: [Move2D: "'i'", Child2D: "following-sibling::*[1]"] # phrase('in' the denominator) +# replace: [x: ".."] +# - set_variables: [NavNode: "following-sibling::*[1]/@id"] + +# # ======== Move/Read/Describe Previous rules ================= + +# # skip invisible chars except for Enhanced mode when "times" should be read +# - name: move-previous-invisible +# tag: "*" +# match: +# - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious') and" +# - "preceding-sibling::*[1][name(.)='mo' and translate(., '\u2061\u2062\u2063\u2064', '')='']" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" +# then: +# - test: +# - if: "$NavCommand = 'MovePrevious'" +# then: [T: "gå"] # phrase('move' to next entry in table) +# - else_if: "$NavCommand = 'ReadPrevious'" +# then: [T: "läs"] # phrase('read' next entry in table) +# else: [T: "beskriv"] # phrase('describe' next entry in table) +# - T: "vänster" # phrase(move 'left') +# - pause: short +# - with: +# variables: [MatchCounter: "$MatchCounter + 1"] +# replace: +# - test: +# if: "preceding-sibling::*[1][.='\u2062' or .='\u2064'] and $NavMode='Enhanced'" # invisible times and plus +# then: [set_variables: [NavNode: "preceding-sibling::*[1]/@id"]] +# else: [x: "preceding-sibling::*[1]"] + +# # two rules for when can't move right +# - name: move-previous-no-auto-zoom-at-edge +# # at edge of 2D and in a mode where moving right isn't an option +# tag: "*" +# variables: [EdgeNode: "EdgeNode(., 'left', '2D')"] +# match: "$NavCommand = 'MovePrevious' and $NavMode!='Character' and not($AutoZoomOut) and $EdgeNode/@id!=@id" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity != 'Terse' and $NavCommand = 'MovePrevious'" +# then: +# - T: "kan inte gå vänster" # phrase('cannot move left' in expression) +# - with: +# variables: [Move2D: "'end of'", Child2D: "$EdgeNode/*[1]"] +# replace: [x: "$EdgeNode"] +# - pause: long + +# - name: move-previous-no-auto-zoom-at-edge-of-math +# # at edge of math -- no where to go (must be after we rule out being at the edge of 2D) because we want to speak that +# tag: "*" +# match: +# - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious') and" +# - "(self::m:math or name(EdgeNode(., 'left', 'math'))='math')" +# replace: +# - T: "start matematik" # phrase('start of math') +# - pause: long +# - set_variables: [SpeakExpression: "'false'"] + +# - name: move-previous-at-end +# tag: "*" +# match: +# - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious') and" +# - "name(EdgeNode(., 'left', 'math'))='math'" # at edge of math +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" +# then: +# - T: "kan inte gå vänster, start matematik" # phrase('cannot move left, start of math') +# - pause: long +# - set_variables: [SpeakExpression: "'false'"] + +# - name: move-previous-auto-zoom-up-one-level +# # Last child or in auto-zoom'd in-- move up a level and try again +# # Note: we've already checked the for the case where we are at an edge and should not AutoZoomOut +# tag: "*" +# match: +# - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious') and" +# - "( not(preceding-sibling::*) or" +# - " ( $NavMode='Enhanced' and " +# - " count(preceding-sibling::*)=1 and (IsBracketed(.., '(', ')') or IsBracketed(.., '[', ']'))" +# - " )" +# - ")" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" +# then: +# - test: +# - if: "$NavCommand = 'MovePrevious'" +# then: [T: "gå"] # phrase('move' to next entry in table) +# - else_if: "$NavCommand = 'ReadPrevious'" +# then: [T: "läs"] # phrase('read' next entry in table) +# else: [T: "beskriv"] # phrase('describe' next entry in table) +# - T: "vänster" # phrase(move 'left') +# - pause: short +# - with: +# variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MovePrevious'"] +# replace: +# - test: +# if: "preceding-sibling::*" +# then: +# - with: +# variables: [Move2D: "'i'", Child2D: "."] # phrase('in' the denominator) +# replace: [x: ".."] +# else: +# - with: +# variables: [Move2D: "'lämnar'", Child2D: "."] +# replace: [x: ".."] +# - test: +# if: "preceding-sibling::*" +# then: +# - x: .. # move out of parens +# else: +# - x: ".." + +# - name: move-previous-auto-zoom-parens +# # auto-zoom into previous child if previous child is parenthesized expr +# # Note: there is an asymmetry here from MoveNext because the base of a scripted might have parens for grouping, but not true for the script +# tag: "*" +# match: +# - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious') and" +# - "$NavMode='Enhanced' and" +# - "preceding-sibling::* and" +# - "(parent::m:mrow or parent::m:msub or parent::m:msup or" +# - " (count(preceding-sibling::*)=1 and (parent::m:msubsup or parent::m:mmultiscripts))" # make sure moving into base +# - ") and" +# - "preceding-sibling::*[1][self::m:mrow and count(*)=3 and " #exclude empty parens +# - " (IsBracketed(., '(', ')') or IsBracketed(., '[', ']'))" +# - " ]" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" +# then: +# - test: +# - if: "$NavCommand = 'MovePrevious'" +# then: [T: "gå"] # phrase('move' to next entry in table) +# - else_if: "$NavCommand = 'ReadPrevious'" +# then: [T: "läs"] # phrase('read' next entry in table) +# else: [T: "beskriv"] # phrase('describe' next entry in table) +# - T: "vänster" # phrase(move 'left') +# - pause: short +# - test: +# if: "not(parent::m:mrow)" +# then: +# - with: +# variables: [Move2D: "'i'", Child2D: "preceding-sibling::*[1]"] # phrase('in' the denominator) +# replace: [x: ".."] +# - set_variables: [NavNode: "preceding-sibling::*[1]/*[2]/@id"] + +# # normal cases for MovePrevious + +# - name: move-previous-default +# tag: mtd +# match: "$Move2D = '' and ($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious')" +# replace: +# - test: +# # can't get here with MatchCounter=0, so no need to echo command +# if: "preceding-sibling::*" +# then: +# - test: +# if: "$NavVerbosity != 'Terse'" +# then: +# - T: "kolumn" # phrase(the first 'column' in the table) +# - x: "count(preceding-sibling::*)" +# - pause: short +# - test: +# if: "$NavMode = 'Character'" +# then: +# - with: +# variables: [NavCommand: "'MovePreviousZoom'"] +# replace: [x: "preceding-sibling::*[1]"] +# else: [set_variables: [NavNode: "preceding-sibling::*[1]/*[last()]/@id"]] +# else: +# - x: ".." # try again at the row level + +# - name: move-previous-default +# tag: [mtr, mlabeledtr] +# match: "$Move2D = '' and ($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious')" +# replace: +# - test: +# # can't get here with MatchCounter=0, so no need to echo command +# if: "preceding-sibling::*" +# then: +# - test: +# if: "$NavVerbosity != 'Terse'" +# then: +# - T: "rad" # phrase('row' five in table) +# - x: "count(preceding-sibling::*)" +# - T: "kolumn" # phrase('column' five in table) +# - x: "count(*)" +# - pause: medium +# - test: +# if: "$NavMode = 'Character'" +# then: +# - with: +# variables: [NavCommand: "'MovePreviousZoom'"] +# replace: [x: "preceding-sibling::*[1]"] +# else: +# - set_variables: [NavNode: "preceding-sibling::*[1]/*[last()]/*[last()]/@id"] +# else: [x: ".."] # try again for after + +# - name: move-previous-locked-zoom-level +# # locked zoom level +# tag: "*" +# match: +# - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious') and" +# - "$ReadZoomLevel>=0" +# replace: +# - test: +# # if moving into base (nothing before), we must be moving to the base, so "in" will be said +# if: "count(preceding-sibling::*) > 2 and preceding-sibling::*[1][name(.)='none']" +# then: +# - with: +# variables: [Move2D: "'lämnar'", Child2D: "."] +# replace: [x: ".."] +# - with: +# variables: [MatchCounter: "$MatchCounter + 1"] +# replace: [x: "preceding-sibling::*[1]"] # skip over 'none' +# else: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" +# then: +# - test: +# - if: "$NavCommand = 'MovePrevious'" +# then: [T: "gå"] # phrase('move' to next entry in table) +# - else_if: "$NavCommand = 'ReadPrevious'" +# then: [T: "läs"] # phrase('read' next entry in table) +# else: [T: "beskriv"] # phrase('describe' next entry in table) +# - T: "vänster" # phrase(move 'left') +# - pause: short +# - with: +# variables: [Move2D: "'i'", Child2D: "preceding-sibling::*[1]"] # phrase('in' the denominator) +# replace: [x: ".."] +# - with: +# variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MovePreviousZoom'"] +# replace: [x: "preceding-sibling::*[1]"] + +# - name: move-previous-default +# tag: "*" +# match: "$NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious'" +# replace: +# - test: +# if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" +# then: +# - test: +# - if: "$NavCommand = 'MovePrevious'" +# then: [T: "gå"] # phrase('move' to next entry in table) +# - else_if: "$NavCommand = 'ReadPrevious'" +# then: [T: "läs"] # phrase('read' next entry in table) +# else: [T: "beskriv"] # phrase('describe' next entry in table) +# - T: "vänster" # phrase(move 'left') +# - pause: short +# - test: +# if: "IsNode(.., '2D')" +# then: +# - with: +# variables: [Move2D: "'i'", Child2D: "preceding-sibling::*[1]"] # phrase('in' the denominator) +# replace: [x: ".."] +# - set_variables: [NavNode: "preceding-sibling::*[1]/@id"] + +# # ********* ReadZoomLevel toggle *************** +# # These set ::NavMode + +# - name: toggle-mode-up +# tag: "*" +# match: "$NavCommand = 'ToggleZoomLockUp'" +# replace: +# - test: +# - if: "$NavMode = 'Enhanced'" +# then: +# - T: "teckenläge" # phrase(a mathematical 'character') +# - set_variables: [NavMode: "'Character'", ReadZoomLevel: "1"] +# - else_if: "$NavMode = 'Character'" +# then: +# - T: "förenklat läge" # phrase(a 'simple' way to do something) +# - set_variables: [NavMode: "'Simple'", ReadZoomLevel: "1"] +# - else: +# - T: "utökat läge" # phrase(an 'enhanced' way to do something) +# - set_variables: [NavMode: "'Enhanced'", ReadZoomLevel: "-1"] +# # - T: "läge" # phrase(a simple 'mode' of use) +# # SWEDISH: Removed the ending "mode" string and added "läge" to the previous strings, for grammatical purposes. +# - pause: long +# - test: +# - if: "$NavMode != 'Enhanced'" # potentially need to zoom to the sibling +# then: +# - with: +# variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MoveNextZoom'"] +# replace: [x: "."] + +# - name: toggle-mode-down +# tag: "*" +# match: "$NavCommand = 'ToggleZoomLockDown'" +# replace: +# - test: +# - if: "$NavMode = 'Enhanced'" +# then: +# - T: "förenklat läge" # phrase(an 'simple' way to do something) +# - set_variables: [NavMode: "'Simple'", ReadZoomLevel: "1"] +# - else_if: "$NavMode = 'Character'" +# then: +# - T: "utökat läge" # phrase(an 'enhanced' way to do something) +# - set_variables: [NavMode: "'Enhanced'", ReadZoomLevel: "-1"] +# - else: +# - T: "teckenläge" # phrase(a mathematical 'character') +# - set_variables: [NavMode: "'Character'", ReadZoomLevel: "1"] +# # - T: "användningsläge" # phrase(a simple 'mode' of use) +# # SWEDISH: Removed the ending "mode" string and added "läge" to the previous strings, for grammatical purposes. +# - pause: long +# - test: +# - if: "$NavMode != 'Enhanced'" # potentially need to zoom to the sibling +# then: +# - with: +# variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MoveNextZoom'"] +# replace: [x: "."] + +# - name: toggle-speech-describe +# tag: "*" +# match: "$NavCommand = 'ToggleSpeakMode'" +# replace: +# - test: +# if: "$Overview = 'true'" +# then: +# - T: "läs upp uttryck efter navigering" # phrase('speak expression after move') +# - set_variables: [Overview: "'false'"] +# else: +# - T: "översikt över uttryck efter navigering" # phrase('overview of expression after move') +# - set_variables: [Overview: "'true'"] +# - pause: long + +# - name: current +# tag: "*" +# match: "$NavCommand = 'ReadCurrent' or $NavCommand = 'DescribeCurrent'" +# replace: +# - test: +# if: "$NavVerbosity = 'Verbose'" +# then: +# - test: +# - if: "$NavCommand = 'ReadCurrent'" +# then: [T: "läs"] # phrase('read' next entry in table) +# else: [T: "beskriv"] # phrase('describe' next entry in table) +# - T: "aktuellt" # phrase('current' entry in table) +# - set_variables: [NavNode: "@id"] +# - pause: long + +# # this needs to be near the end because we only test for 'Describe', "Read", etc., and we don't want to get 'DescribeNext', etc. +# - name: placemarker + +# tag: "*" +# match: +# - "starts-with($NavCommand, 'Read') or " +# - "starts-with($NavCommand, 'Describe') or " +# - "starts-with($NavCommand, 'MoveTo')" +# replace: +# - test: +# if: "$NavVerbosity != 'Terse'" +# then: +# - test: +# - if: "starts-with($NavCommand, 'Read')" +# then: [T: "läs"] # phrase('read' next entry in table) +# - else_if: "starts-with($NavCommand, 'Describe')" +# then: [T: "beskriv"] # phrase('describe' next entry in table) +# - else_if: "starts-with($NavCommand, 'MoveTo')" +# then: [T: "gå till"] # phrase('move to' the next entry in table) +# else: [T: "ange"] # phrase('set' the value of the next entry in table) +# - T: "platshållare" # phrase('placeholder' for the value) +# - x: "$PlaceMarkerIndex" +# - pause: long +# - set_variables: [NavNode: "$PlaceMarker"] + +# - name: set-placemarker +# tag: "*" +# match: "starts-with($NavCommand, 'SetPlacemarker')" +# replace: +# - test: +# if: "$NavVerbosity != 'Terse'" +# then: +# - T: "ange platshållare" # phrase('set placeholder' to the value) +# - x: "$PlaceMarkerIndex" +# - pause: long +# - set_variables: [NavNode: "@id"] + +# # ********* WhereAmI *************** + +# # FIX: WhereAmI needs support from the Rust code to loop around and do speech at each iteration. +# # Alternatively, it could insert a special token that Rust code does a "replace" on with the speech (e.g. SPEECH_AT{id}) +# # or a new command "speak" which takes a node id +# - name: where-am-i-start + + +# tag: "*" +# match: "($NavCommand = 'WhereAmI' or $NavCommand = 'WhereAmIAll') and $MatchCounter = 0" +# replace: +# - translate: "@id" +# - pause: long +# - with: +# variables: [MatchCounter: "$MatchCounter + 1"] +# replace: [x: ".."] + +# - name: where-am-i-stop +# tag: "*" +# match: +# - "($NavCommand = 'WhereAmI' or $NavCommand = 'WhereAmIAll') and $MatchCounter > 0 and" +# # stopping conditions +# - "(self::m:math or " +# - " parent::*[self::m:math and (count(*)=1 or (count(*)=2 and *[2][.=',' or .='.' or .=';' or .='?']) ) ] " +# - ")" +# replace: +# - test: +# if: "$NavCommand = 'WhereAmI'" +# then: +# - T: "inget mer" # phrase('inside of nothing more') +# - pause: long +# - set_variables: [SpeakExpression: "'false'"] +# else: +# - T: "inne i" # phrase('inside' a big expression) +# - pause: medium +# - set_variables: [NavNode: "@id"] + +# - name: where-am-i-middle +# tag: "*" +# match: "$NavCommand = 'WhereAmI' or $NavCommand = 'WhereAmIAll'" +# replace: +# - T: "inne i" # phrase('inside' a big expression) +# - pause: medium +# - test: +# - if: "$NavMode='Enhanced' and parent::*[self::m:mrow and IsBracketed(., '(', ')', false) or IsBracketed(., '[', ']', false)]" +# then: [x: ".."] # auto-zoom up +# - else_if: "$NavCommand = 'WhereAmI'" +# then: [set_variables: [NavNode: "@id"]] +# else: +# - translate: "@id" +# - pause: long +# - x: '..' From cb2df0d72c7f9bcd1f9bc5f269720be397623c92 Mon Sep 17 00:00:00 2001 From: AndersEkl Date: Thu, 28 May 2026 13:49:08 +0200 Subject: [PATCH 08/27] Update SimpleSpeak_Rules.yaml --- Rules/Languages/sv/SimpleSpeak_Rules.yaml | 48 +++++++++++++++++------ 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/Rules/Languages/sv/SimpleSpeak_Rules.yaml b/Rules/Languages/sv/SimpleSpeak_Rules.yaml index d4a04d9cf..455a4f536 100644 --- a/Rules/Languages/sv/SimpleSpeak_Rules.yaml +++ b/Rules/Languages/sv/SimpleSpeak_Rules.yaml @@ -1,4 +1,18 @@ --- +- name: pause + tag: "!*" + match: "not(self::m:math) and not($MatchingPause) and @data-intent-property[contains(., ':pause')]" + replace: + - with: + variables: [MatchingPause: "true()"] + replace: + - test: + - if: "contains(@data-intent-property, ':pause-long')" + then: [pause: long] + - else_if: "contains(@data-intent-property, ':pause-short')" + then: [pause: short] + else: [pause: medium] + - x: "." - name: intent-literal-silent tag: [mi, mo, mn] @@ -14,7 +28,7 @@ - T: "minus" # phrase(x 'minus' y) - x: "translate(text(), '-_', '')" -- name: default +- name: default # audit-ignore tag: square-root match: "." replace: @@ -29,7 +43,7 @@ then: [pause: short] else: [T: "slut rot", pause: short] # phrase(start the square root of x 'end of root') -- name: default +- name: default # audit-ignore tag: root match: "." replace: @@ -56,7 +70,7 @@ # Fraction rules # Mixed numbers mostly "just work" because the invisible char reads as "and" and other parts read properly on their own # Note: if the bounds change for what is a common fraction, change them in general.yaml for units -- name: common-fraction +- name: common-fraction # audit-ignore tag: fraction match: - "($ClearSpeak_Fractions='Auto' or $ClearSpeak_Fractions='Ordinal' or $ClearSpeak_Fractions='EndFrac') and" @@ -116,7 +130,7 @@ # Units (e.g., meters per second, m^2/s^2, (3m^2)/s) #NORWEGIAN: Added rule for t="time" -- name: per-fraction +- name: per-fraction # audit-ignore tag: fraction match: - "BaseNode(*[1])[contains(@data-intent-property, ':unit') or" @@ -128,7 +142,7 @@ - T: "per" # phrase('5 meters 'per' second) - test: if: "*[2]='t'" - then: [T: "time"] + then: [T: "timme"] else: - x: "*[2]" @@ -150,7 +164,9 @@ tag: fraction match: "." replace: - - T: "division" # phrase(the 'fraction' 3 over 4) + - test: + if: "$Impairment = 'Blindness'" + then: [T: "division"] # phrase(the 'fraction' 3 over 4) - pause: short - x: "*[1]" - test: @@ -162,7 +178,9 @@ then: [pause: short] - x: "*[2]" - pause: short - - T: "slut division" # phrase(start 7 over 8 'end of fraction') + - test: + if: "$Impairment = 'Blindness'" + then: [T: "slut division"] # phrase(start 7 over 8 'end of fraction') - pause: medium # rules for functions raised to a power @@ -188,7 +206,7 @@ then: [T: "kvadrat"] # phrase(5 'squared' equals 25) else: [T: "kubik"] # phrase(5 'cubed' equals 125) -- name: function-power +- name: function-power # audit-ignore tag: power match: - "following-sibling::*[1][self::m:mo][.='⁡']" #invisible function apply @@ -211,7 +229,7 @@ then: [T: "kvadrat"] # phrase(5 'squared' equals 25) else: [T: "kubik"] # phrase(5 'cubed' equals 125) -- name: simple-integer +- name: simple-integer # audit-ignore tag: power match: "*[2][self::m:mn][not(contains(., '.'))]" replace: @@ -231,7 +249,7 @@ - x: "*[2]" - pause: short -- name: simple-var +- name: simple-var # audit-ignore tag: power match: "*[2][self::m:mi][string-length(.)=1]" replace: @@ -264,7 +282,13 @@ - T: "upphöjt till" # phrase(15 'raised to the' second power equals 225) - x: "*[2]" - pause: short - - T: "slut exponent" # phrase(start 2 raised to the exponent 4 'end of exponent') + - test: + if: "$Impairment = 'Blindness'" + then: + - T: "slut exponent" # phrase(start 2 raised to the exponent 4 'end of exponent') + - pause: short + else: + - pause: medium - name: default tag: power @@ -277,7 +301,7 @@ # # Some rules on mrows # -- name: set +- name: set # audit-ignore tag: set match: "." replace: From 05992e7bdd5b351f1c795f25674b8992bedb33b3 Mon Sep 17 00:00:00 2001 From: AndersEkl Date: Fri, 29 May 2026 11:34:53 +0200 Subject: [PATCH 09/27] Update definitions.yaml Closes #14 --- Rules/Languages/sv/definitions.yaml | 33 ++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/Rules/Languages/sv/definitions.yaml b/Rules/Languages/sv/definitions.yaml index 17db0fa5e..e5d5125c6 100644 --- a/Rules/Languages/sv/definitions.yaml +++ b/Rules/Languages/sv/definitions.yaml @@ -21,19 +21,27 @@ "absolute-value": "function= ; absolutbeloppet; slut absolutbelopp", "binomial": "infix=binomial; över; slut binomial", + "dimension-product": "infix=gånger", + # "closed-interval": "other=closed-interval; from,to; end closed-interval", + "greatest-common-divisor": "function=sgd: sgd: största gemensamma delaren", + "imaginary-part": "function=imaginär del: den imaginära delen: den imaginära delen", + "least-common-multiple": "function=mgm: mgm: den minsta gemensamma multipeln", + # "large-op": "infix=over || other=from,to", "limit": "prefix=gränsvärdet då", "lim-sup": "prefix=lim sup då: övre gränsvärdet då: det övre gränsvärdet då", "lim-inf": "prefix=lim inf då: undre gränsvärdet då : det undre gränsvärdet då", "logarithm-with-base": "prefix=logg bas: logaritmen med bas: logaritmen med bas", "minus": "infix=minus || prefix=minus", "plus": "infix=plus || prefix=positivt", + # "pochhammer": "infix=permutations of", # arguments are in reverse order, so can't work here + "real-part": "function=den reella delen", "transpose": "postfix=transponat || function=transponat", "norm": "function=; normen; slut norm", "trace": "function=;spåret; slut spår", "dimension": "function=; dimensionen; slut dimension", - # "homomorphism": "function= ; homomorfism; slut homomorfism", # doesn't fit function pattern - # "kernel": "function= ; noll-rummet : noll-rummet till: noll-rummet till; slut noll-rummet", # doesn't fit function pattern + "homomorphism": "function= ; homomorfism; slut homomorfism", # doesn't fit function pattern + "kernel": "function= ; noll-rummet : noll-rummet till: noll-rummet till; slut noll-rummet", # doesn't fit function pattern "vector": "function= ; vektor: vektorn: vektorn || prefix=vektor: vektorn: vektorn", "cross-product": "infix=kryss: kryssprodukt: kryssprodukt", "dot-product": "infix=skalärt: skalärprodukt: skalärprodukt", @@ -42,7 +50,9 @@ "curl": "function= ; rotation; slut rotation", "gradient": "function= ; grad: gradient: gradient; slut gradient", "laplacian": "function=laplacian", # speech engines don't do a good job with "laplacian" (swedish ones might) - } + + "chemistry-concentration": "function= ; koncentration: koncentrationen av: koncentrationen av; slut koncentration", +} - NavigationParts: { "large-op": "bas; undre gräns; övre gräns", @@ -54,6 +64,8 @@ "root": "rot;rot index", "msub": "bas;nedre index", "sub": "bas;nedre index", + "logarithm-with-base": "bas", + "indexed-by": "bas; med index", "msup": "bas;övre index", "say-super": "bas;upphöjt", "skip-super": "bas;upphöjt", @@ -69,6 +81,15 @@ "out": "ut ur", } +- KnownWords: { + # MathCAT will put together some runs of three or more mi's (a common mistake), but skips those in alphabetical order. + # This is a list of exceptions so that they do get put together. Don't list words with repeated letters. + + # I asked bard and chatgpt for formula words that are alphabetical, and they failed. + # Here are the words I managed to find, but it almost certainly not complete. Change the list for other languages. + "Abel", "aery", "ails", "airy", "amps", "ceil", "cents", "chop", "flux", "flow", "knot", "most" + } + - SIPrefixes: { "Q": "quetta", "R": "ronna", "Y": "yotta", "Z": "zetta", "E": "exa", "P": "peta", "T": "tera", "G": "giga", "M": "mega", "k": "kilo", "h": "hekto", "da": "deka", "d": "deci", "c": "centi", "m": "milli", "µ": "mikro", "n": "nano", "p": "piko", "f": "femto", "a": "atto", "z": "zepto", "y": "yokto", "r": "ronto", "q": "quekto" @@ -237,6 +258,12 @@ "mpg": "mile per gallon", } +- CurrencySymbols: { + "$": "dollar", "¢": "cent", "€": "euro", "£": "pund", "₡": "colón", "₤": "lira", "₨": "rupee", + "₩": "won", "₪": "shekel", "₱": "peso", "₹": "rupee", "₺": "lira", "₿": "bitcoin", + # could add more currencies... + } + - PluralForms: { # SWEDISH: this should be complete. Units not listed here are not modified when pluralised. /Tim "sekund": "sekunder", From 0421576ffa7f4db3f2d1891e781227880ae07fee Mon Sep 17 00:00:00 2001 From: AndersEkl Date: Fri, 29 May 2026 13:55:34 +0200 Subject: [PATCH 10/27] Updated SimpleSpeakl and ClearSpeak Finished the update of SimpleSpeak and corrected a rule in both SimpleSpeak and ClearSpeak that made mixed numbers be spoken incorrectly. --- Rules/Languages/sv/ClearSpeak_Rules.yaml | 8 ++++---- Rules/Languages/sv/SimpleSpeak_Rules.yaml | 11 ++++++----- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Rules/Languages/sv/ClearSpeak_Rules.yaml b/Rules/Languages/sv/ClearSpeak_Rules.yaml index 0a9a32687..36b6f15e3 100644 --- a/Rules/Languages/sv/ClearSpeak_Rules.yaml +++ b/Rules/Languages/sv/ClearSpeak_Rules.yaml @@ -141,12 +141,12 @@ tag: fraction match: - "($ClearSpeak_Fractions='Auto' or $ClearSpeak_Fractions='Ordinal' or $ClearSpeak_Fractions='EndFrac') and" - - "*[1][self::m:mn][not(contains(., $DecimalSeparators)) and ($ClearSpeak_Fractions='Ordinal' or text()<20)] and" #NORWEGIAN: Changed decimal point to $DecimalSeparators - - "*[2][self::m:mn][not(contains(., $DecimalSeparators)) and (2<= text() and text()<=10)]" #NORWEGIAN: Removed $ClearSpeak_Fractions='Ordinal', cause the pattern for ordinal fractions is not right. + - "*[1][self::m:mn][not(contains(., $DecimalSeparators)) and ($ClearSpeak_Fractions='Ordinal' or text()<20)] and" #SWEDISH: Changed decimal point to $DecimalSeparators + - "*[2][self::m:mn][not(contains(., $DecimalSeparators)) and (2<= text() and text()<=10)]" #SWEDISH: Removed $ClearSpeak_Fractions='Ordinal', cause the pattern for ordinal fractions is not right. variables: - - IsPlural: "DEBUG(not(*[1]=1 or preceding-sibling::*[1][self::m:mo and .='\u2064']))" # '\u2064' is invisible plus and is used in mixed fractions + - IsPlural: "*[1]!=1" # "DEBUG(not(*[1]=1 or preceding-sibling::*[1][self::m:mo and .='\u2064']))" '\u2064' is invisible plus and is used in mixed fractions # set right level for the location of the common fraction/mixed fraction - - IsMixedFraction: "preceding-sibling::*[1][.='\u2064']" + - IsMixedFraction: "preceding-sibling::*[1][self::m:mo][.='\u2064']" - UnitSibling: "IfThenElse($IsMixedFraction, .., .)" # set the potential unit node -- otherwise set it to a empty node set (use a made up name) - UnitNodeLocation: "IfThenElse($UnitSibling/..[self::m:mrow and count(*)=3 and *[2][.='\u2062']], diff --git a/Rules/Languages/sv/SimpleSpeak_Rules.yaml b/Rules/Languages/sv/SimpleSpeak_Rules.yaml index 455a4f536..8b184a30d 100644 --- a/Rules/Languages/sv/SimpleSpeak_Rules.yaml +++ b/Rules/Languages/sv/SimpleSpeak_Rules.yaml @@ -74,12 +74,12 @@ tag: fraction match: - "($ClearSpeak_Fractions='Auto' or $ClearSpeak_Fractions='Ordinal' or $ClearSpeak_Fractions='EndFrac') and" - - "*[1][self::m:mn][not(contains(., $DecimalSeparators)) and ($ClearSpeak_Fractions='Ordinal' or text()<20)] and" #NORWEGIAN: Changed decimal point to $DecimalSeparators - - "*[2][self::m:mn][not(contains(., $DecimalSeparators)) and (2<= text() and text()<=10)]" #NORWEGIAN: Removed $ClearSpeak_Fractions='Ordinal', cause the pattern for ordinal fractions is not right. + - "*[1][self::m:mn][not(contains(., $DecimalSeparators)) and ($ClearSpeak_Fractions='Ordinal' or text()<20)] and" #SWEDISH: Changed decimal point to $DecimalSeparators + - "*[2][self::m:mn][not(contains(., $DecimalSeparators)) and (2<= text() and text()<=10)]" #SWEDISH: Removed $ClearSpeak_Fractions='Ordinal', cause the pattern for ordinal fractions is not right. variables: - - IsPlural: "DEBUG(not(*[1]=1 or preceding-sibling::*[1][self::m:mo and .='\u2064']))" # '\u2064' is invisible plus and is used in mixed fractions + - IsPlural: "*[1]!=1" # "DEBUG(not(*[1]=1 or preceding-sibling::*[1][self::m:mo and .='\u2064']))" '\u2064' is invisible plus and is used in mixed fractions # set right level for the location of the common fraction/mixed fraction - - IsMixedFraction: "preceding-sibling::*[1][.='\u2064']" + - IsMixedFraction: "preceding-sibling::*[1][self::m:mo][.='\u2064']" - UnitSibling: "IfThenElse($IsMixedFraction, .., .)" # set the potential unit node -- otherwise set it to a empty node set (use a made up name) - UnitNodeLocation: "IfThenElse($UnitSibling/..[self::m:mrow and count(*)=3 and *[2][.='\u2062']], @@ -127,9 +127,10 @@ then: [x: "DefinitionValue(*[2], 'Speech', 'OrdinalFractionalDenominatorsForUnits')"] else: [x: "*[2]", CT: "dels"] # this is wrong but shouldn't occur normally -- need to write a function to compute cardinal numbers as words +#SWEDISH: The common-fraction-mixed-number rule that is in the English rules is covered by our common-fraction rule. # Units (e.g., meters per second, m^2/s^2, (3m^2)/s) -#NORWEGIAN: Added rule for t="time" +#SWEDISH: Added rule for t="time" - name: per-fraction # audit-ignore tag: fraction match: From 5a733e0707f94f900bde65b8daf717820d9422ce Mon Sep 17 00:00:00 2001 From: AndersEkl Date: Mon, 1 Jun 2026 11:22:49 +0200 Subject: [PATCH 11/27] Bug fix in SimpleSpeak and ClearSpeak Fixed a bug concerning common fractions used in mixed numbers. --- Rules/Languages/sv/ClearSpeak_Rules.yaml | 2 +- Rules/Languages/sv/SimpleSpeak_Rules.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Rules/Languages/sv/ClearSpeak_Rules.yaml b/Rules/Languages/sv/ClearSpeak_Rules.yaml index 36b6f15e3..75bcee6f9 100644 --- a/Rules/Languages/sv/ClearSpeak_Rules.yaml +++ b/Rules/Languages/sv/ClearSpeak_Rules.yaml @@ -177,7 +177,7 @@ # unit follows the fraction -- special cases - else: - test: - - if: "*[1]=1 or ($IsMixedFraction and preceding-sibling::*[2][.=1])" + - if: "*[1]=1" # or ($IsMixedFraction and preceding-sibling::*[2][.=1])" then: - test: if: "$NeuterUnitFollows" diff --git a/Rules/Languages/sv/SimpleSpeak_Rules.yaml b/Rules/Languages/sv/SimpleSpeak_Rules.yaml index 8b184a30d..7a6e71dd3 100644 --- a/Rules/Languages/sv/SimpleSpeak_Rules.yaml +++ b/Rules/Languages/sv/SimpleSpeak_Rules.yaml @@ -110,7 +110,7 @@ # unit follows the fraction -- special cases - else: - test: - - if: "*[1]=1 or ($IsMixedFraction and preceding-sibling::*[2][.=1])" + - if: "*[1]=1" # or ($IsMixedFraction and preceding-sibling::*[2][.=1])" then: - test: if: "$NeuterUnitFollows" From ec7d5fbb8b3325e77e0664ca3f4b6d1d2f207089 Mon Sep 17 00:00:00 2001 From: AndersEkl Date: Mon, 1 Jun 2026 14:18:59 +0200 Subject: [PATCH 12/27] Fixed a bug in general.yaml Fixed a bug concerning how one is spoken in combination with a unit. --- Rules/Languages/sv/SharedRules/general.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rules/Languages/sv/SharedRules/general.yaml b/Rules/Languages/sv/SharedRules/general.yaml index 4a20180b8..093c3a269 100644 --- a/Rules/Languages/sv/SharedRules/general.yaml +++ b/Rules/Languages/sv/SharedRules/general.yaml @@ -288,7 +288,7 @@ IsInDefinition(substring(., 2), 'Speech', 'NeuterUnits') != '' ) ]" replace: - - x: "IfThenElse($NeuterUnitFollows, 'ett', 1)" + - x: "IfThenElse($NeuterUnitFollows, 'ett', 'en')" # the order of matching is # 1. does it match the base of an SI unit From 30fbacd5f6d3b891516d94059dc251239f557d63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Arborealis=20L=C3=B6tberg?= <143188129+TimArborealis@users.noreply.github.com> Date: Tue, 2 Jun 2026 11:36:17 +0200 Subject: [PATCH 13/27] Unicode-full & navigate Updated unicode-full and navigate, plus fixed a couple of typos in the english unicode-full. --- Rules/Languages/en/unicode-full.yaml | 8 +- Rules/Languages/sv/navigate.yaml | 2 +- Rules/Languages/sv/unicode-full.yaml | 2228 ++++++++++++++------------ 3 files changed, 1200 insertions(+), 1038 deletions(-) diff --git a/Rules/Languages/en/unicode-full.yaml b/Rules/Languages/en/unicode-full.yaml index eb4a6cbe4..ea58393c6 100644 --- a/Rules/Languages/en/unicode-full.yaml +++ b/Rules/Languages/en/unicode-full.yaml @@ -1403,7 +1403,7 @@ - "⏠": [t: "top tortoise shell bracket"] # 0x23e0 - "⏡": [t: "bottom tortoise shell bracket"] # 0x23e1 - "⏢": [t: "white trapezium"] # 0x23e2 - - "⏣": [t: "benzene right with circle"] # 0x23e3 + - "⏣": [t: "benzene ring with circle"] # 0x23e3 - "⏤": [t: "straightness"] # 0x23e4 - "⏥": [t: "flatness"] # 0x23e5 - "⏦": # 0x23e6 @@ -1455,7 +1455,7 @@ - t: "parenthesized" - spell: "translate('.', '⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵', 'abcdefghijklmnopqrstuvwxyz')" - - "Ⓐ-ⓩ": # 0x24b6 - 0x24cf + - "Ⓐ-Ⓩ": # 0x24b6 - 0x24cf - t: "circled" - spell: "translate('.', 'ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" @@ -1617,7 +1617,7 @@ - "⚆": [t: "white circle with dot right"] # 0x2686 - "⚇": [t: "white circle wiht two dots"] # 0x2687 - "⚈": [t: "black circle with dot right"] # 0x2688 - - "⚉": [t: "black circle wiht two dots"] # 0x2689 + - "⚉": [t: "black circle with two dots"] # 0x2689 - "⚪": [t: "medium white circle"] # 0x26aa - "⚫": [t: "medium black circle"] # 0x26ab - "⚬": [t: "medium small white circle"] # 0x26ac @@ -1625,7 +1625,7 @@ - "✓": [t: "check mark"] # 0x2713 - "✠": [t: "maltese cross"] # 0x2720 - "✪": [t: "circled white star"] # 0x272a - - "✶": [t: "six pionted black star"] # 0x2736 + - "✶": [t: "six pointed black star"] # 0x2736 - "❨": [t: "medium left parentheses ornament"] # 0x2768 - "❩": [t: "medium right parentheses ornament"] # 0x2769 - "❪": [t: "medium flattened left parentheses ornament"] # 0x276a diff --git a/Rules/Languages/sv/navigate.yaml b/Rules/Languages/sv/navigate.yaml index 7fcaf960e..e66c10605 100644 --- a/Rules/Languages/sv/navigate.yaml +++ b/Rules/Languages/sv/navigate.yaml @@ -98,7 +98,7 @@ (name(.)='mrow' or name(.) = 'mtr' or name(.) = 'mlabeledtr' or @data-from-mathml = 'mtable')" replace: [] -- name: into-or-out-of-mtr +- name: into-or-out-of-mtr # audit-ignore tag: [mtr, mlabeledtr] match: "$Move2D = 'i'" # Navigate into a 2D structure. replace: diff --git a/Rules/Languages/sv/unicode-full.yaml b/Rules/Languages/sv/unicode-full.yaml index 4eac75c6a..7a615e397 100644 --- a/Rules/Languages/sv/unicode-full.yaml +++ b/Rules/Languages/sv/unicode-full.yaml @@ -1,5 +1,5 @@ --- - +# SWEDISH: We have chosen to focus on meaning rather than typography to a greater extent than the English. Furthermore, many of these characters don't have an official name in Swedish, and some won't even render. In these cases, a more or less direct translation from English has been made. In case of a complaint from a Swedish user, feel free to go ahead and change. - "¢": [T: "cent"] # 0xa2 (en: 'cents') - "£": [T: "pund"] # 0xa3 (en: 'pounds') @@ -37,6 +37,9 @@ then: [T: "gånger"] # (en: 'by', google translation) else: [T: "kryss"] # (en: 'cross') - "÷": [T: "delat med"] # 0xf7 (en: 'divided by') + - "¡": [T: "uppochnedvänt utropstecken"] # 0xa1 + - "¶": [T: "paragraftecken"] # 0xb6 + - "¿": [T: "uppochnedvänt frågetecken"] # 0xbf # SWEDISH: The Swedish character translations are based on the placement and appearance of the characters rather than their function, as function might be context-dependent. Placement above is used as the baseline, and low characters are translated as "låg(t)" (eng "low"). In most cases, no difference has been made in the translation between non-combining, modifier (Spacing Modifier Letters), and combining/embellishment characters. However, in the case of alphabetical letters and punctuation marks as modifier characters (such as modifier small h or comma embellishment), the construction "med ...( efter)" (eng "with ...( placed after it)") is used to prevent any possible ambiguity. - "ʰ": [T: "med litet h efter"] # 0x2b0 (en: 'modifier small h', google translation) @@ -47,7 +50,7 @@ - "ʵ": [T: "med litet roterat r med krok efter"] # 0x2b5 (en: 'modifier small turned r with hook', google translation) - "ʶ": # 0x2b6 - T: "med litet roterat R efter" # (en: 'modifier small inverted', google translation) - - spell: "translate('R', 'R', 'R')" + - SPELL: "translate('R', 'R', 'R')" - "ʷ": [T: "med litet w efter"] # 0x2b7 (en: 'modifier small w', google translation) - "ʸ": [T: "med litet y efter"] # 0x2b8 (en: 'modifier small y', google translation) - "ʹ": [T: "prim"] # 0x2b9 (en: 'modifier prime', google: 'modifier prime') @@ -118,8 +121,8 @@ - "˺": [T: "slut hög ton"] # 0x2fa (en: 'modifier end high tone', google translation) - "˻": [T: "start låg ton"] # 0x2fb (en: 'modifier begin low tone', google translation) - "˼": [T: "slut låg ton"] # 0x2fc (en: 'modifier end low tone', google translation) - - "˽": [t: "låg hylla"] # 0x2fd (en: 'modifier shelf', google translation) - - "˾": [t: "låg öppen hylla"] # 0x2fe (en: 'modifier open shelf', google translation) + - "˽": [T: "låg hylla"] # 0x2fd (en: 'modifier shelf', google translation) + - "˾": [T: "låg öppen hylla"] # 0x2fe (en: 'modifier open shelf', google translation) - "˿": [T: "låg vänster-pil"] # 0x2ff (en: 'modifier low left arrow', google translation) - "̀": [T: "grav accent"] # 0x300 (en: 'grave accent embellishment', google: 'allvarlig accentutsmyckning') - "́": [T: "akut accent"] # 0x301 (en: 'acute accent embellishment', google: 'akut accentutsmyckning') @@ -163,7 +166,7 @@ - "̧": [T: "låg cedilj"] # 0x327 (en: 'cedilla embellishment', google: 'cedilla -utsmyckning') - "̨": [T: "låg svans"] # 0x328 (en: 'ogonek embellishment', google translation) - "̩": [T: "låg vertikal linje"] # 0x329 (en: 'vertical line below embellishment', google translation) - - "̪": [t: "låg bro"] # 0x32a (en: 'bridge below embellishment', google translation) + - "̪": [T: "låg bro"] # 0x32a (en: 'bridge below embellishment', google translation) - "̫": [T: "låg omvänd dubbelbåge"] # 0x32b (en: 'inverted double arch below embellishment', google translation) - "̬": [T: "låg hake"] # 0x32c (en: 'caron below embellishment', google translation) - "̭": [T: "låg omvänd hake"] # 0x32d (en: 'circumflex accent below embellishment', google translation) @@ -176,17 +179,18 @@ - "̴": [T: "tilde mitt på"] # 0x334 (en: 'tilde overlay embellishment', google translation) - "̵": [T: "streck mitt på"] # 0x335 (en: 'short stroke overlay embellishment', google translation) - "̶": [T: "linje mitt på"] # 0x336 (en: 'long stroke overlay embellishment', google translation) - - "̷": [t: "med kort solidus på"] # 0x337 (en: 'short solidus overlay embellishment', google translation) - - "̸": [t: "med lång solidus på"] # 0x338 (en: 'long solidus overlay embellishment', google: 'long solidus overlay embelling') + - "̷": [T: "med kort solidus på"] # 0x337 (en: 'short solidus overlay embellishment', google translation) + - "̸": [T: "med lång solidus på"] # 0x338 (en: 'long solidus overlay embellishment', google: 'long solidus overlay embelling') - "̹": [T: "låg högervänd halvring"] # 0x339 (en: 'right half ring below embellishment', google translation) - - "̺": [t: "låg roterad bro"] # 0x33a (en: 'inverted bridge below embellishment', google translation) + - "̺": [T: "låg roterad bro"] # 0x33a (en: 'inverted bridge below embellishment', google translation) - "̻": [T: "låg fyrkant"] # 0x33b (en: 'square below embellishment', google translation) - - "̼": [t: "lågt måstecken"] # 0x33c (en: 'seagull below embellishment', google translation) + - "̼": [T: "lågt måstecken"] # 0x33c (en: 'seagull below embellishment', google translation) - "̽": [T: "med x över"] # 0x33d (en: 'x above embellishment', google translation) - "̾": [T: "vertikal tilde"] # 0x33e (en: 'vertical tilde embellishment', google translation) - "̿": [T: "dubbelstreck"] # 0x33f (en: 'double overline embellishment', google translation) - "̀": [T: "grav ton"] # 0x340 (en: 'grave tone mark embellishment', google translation) - "́": [T: "akut ton"] # 0x341 (en: 'acute tone mark embellishment', google translation) + - "͆": [T: "bro"] # 0x346 - "ΪΫϏ": # 0x3aa, 0x3ab, 0x3cf - test: @@ -205,13 +209,13 @@ else: [x: "$SpeechOverrides_CapitalLetters"] - pitch: value: "$CapitalLetters_Pitch" - replace: [spell: "translate('.', 'ΪΫϏ', 'ιυϗ')"] + replace: [SPELL: "translate('.', 'ΪΫϏ', 'ιυϗ')"] - T: "med dialytika" # (en: 'with dialytika', google translation) - "ϊ": [T: "iota med dialytika"] # 0x3ca (en: 'iota with dialytika', google translation) - "ϋ": [T: "ypsilon med dialytika"] # 0x3cb (en: 'upsilon with dialytika', google translation) - - "ό": [t: "omikron med tonos"] # 0x3cc (en: 'omicron with tonos', google translation) - - "ύ": [t: "ypsilon med tonos"] # 0x3cd (en: 'upsilon with tonos', google translation) - - "ώ": [t: "omega med tonos"] # 0x3ce (en: 'omega with tonos', google translation) + - "ό": [T: "omikron med tonos"] # 0x3cc (en: 'omicron with tonos', google translation) + - "ύ": [T: "ypsilon med tonos"] # 0x3cd (en: 'upsilon with tonos', google translation) + - "ώ": [T: "omega med tonos"] # 0x3ce (en: 'omega with tonos', google translation) - "ϐ": [T: "grekiskt beta"] # 0x3d0 (en: 'beta') - "ϑ": [T: "theta"] # 0x3d1 (en: 'theta', google: 'theta') - "ϒ": [T: "ypsilon med krok"] # 0x3d2 (en: 'upsilon with hook', google: 'upsilon med krok') @@ -220,6 +224,8 @@ - "ϕ": [T: "fi"] # 0x3d5 (en: 'phi', google: 'phi') - "ϖ": [T: "pi"] # 0x3d6 (en: 'pi', google: 'pi') - "ϗ": [T: "kai"] # 0x3d7 (en: 'kai') + - "Ϙ": [T: "versalt koppa"] # 0x3d8 + - "ϙ": [T: "koppa"] # 0x3d9 - "ϵ": [T: "epsilon"] # 0x3f5 - "϶": [T: "bakvänt epsilon"] # 0x3f6 (en: 'reversed epsilon') - "А-Я": # 0x410 - 0x42f @@ -239,7 +245,7 @@ else: [x: "$SpeechOverrides_CapitalLetters"] - pitch: value: "$CapitalLetters_Pitch" - replace: [spell: "translate('.', 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ', 'абвгдежзийклмнопрстуфхцчшщъыьэюя')"] + replace: [SPELL: "translate('.', 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ', 'абвгдежзийклмнопрстуфхцчшщъыьэюя')"] - "а": [T: "a"] # 0x430 (google: 'а') - "б": [T: "be"] # 0x431 (google: 'vara') - "в": [T: "ve"] # 0x432 @@ -272,6 +278,9 @@ - "э": [T: "e"] # 0x44d (google: 'э') - "ю": [T: "ju"] # 0x44e - "я": [T: "ja"] # 0x44f + - "؆": [T: "arabisk-indisk kubikrot"] # 0x606 + - "؇": [T: "arabisk-indisk fjärderot"] # 0x607 + - "؈": [T: "arabisk halvlinje"] # 0x608 - "‐": [T: "bindestreck"] # 0x2010 (en: 'hyphen') - "‑": [T: "bindestreck"] # 0x2011 (en: 'hyphen', google: 'bindestreck') - "‒": [T: "tankstreck"] # 0x2012 (en: 'figure dash', google: 'figurstreck') @@ -282,6 +291,8 @@ - "†": [T: "kors"] # 0x2020 (en: 'dagger') - "‡": [T: "dubbelkors"] # 0x2021 (en: 'double dagger') + - " - ": [T: " "] # 0x2000 - 0x2007 + - "•": # 0x2022 - test: if: "@data-chem-formula-op" @@ -310,14 +321,30 @@ - "‶": [T: "omvänt biss"] # 0x2036 (en: 'reversed double prime') - "‷": [T: "omvänt triss"] # 0x2037 (en: 'reversed triple prime', google: 'omvänd trippelprime') - "‸": [T: "insättningstecken"] # 0x2038 (en: 'to the', google: 'till') - - "‹": [t: "vänsterriktat vinkelcitattecken"] # 0x2039 (en: 'single left pointing angle quote mark') - - "›": [t: "högerriktat vinkelcitattecken"] # 0x203a (en: 'single right pointing angle quote mark') - - "‼": [T: "semifakultet"] # 0x203c (en: 'double factorial', google: 'dubbel faktorie') - - "⁄": [T: "delat med"] # 0x2044 (en: 'divided by') + - "‹": [T: "vänsterriktat vinkelcitattecken"] # 0x2039 (en: 'single left pointing angle quote mark') + - "›": [T: "högerriktat vinkelcitattecken"] # 0x203a (en: 'single right pointing angle quote mark') + - "‼": # 0x203c + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "dubbelt utropstecken"] # 0x203c + else: [T: "semifakultet"] # 0x203c + - "⁄": # 0x2044 + - test: + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" + then: [T: "slash"] # 0x203c + else: [T: "delat med"] # 0x203c - "⁅": [T: "vänster piggparentes"] # 0x2045 (en: 'left square bracket with quill', google: 'vänster fyrkantig konsol med quill') - "⁆": [T: "höger piggparentes"] # 0x2046 (en: 'right square bracket with quill', google: 'höger fyrkantig konsol med quill') + - "※": [T: "referensmärke"] # 0x203b + - "‿": [T: "bindebåge under"] # 0x203F + - "⁀": [T: "bindebåge"] # 0x2040 + - "⁎": [T: "låg asterisk"] # 0x204e + - "⁏": [T: "omvänt semicolon"] # 0x204f + - "⁐": [T: "ta bort mellanrum"] # 0x2050 + - "⁑": [T: "två vertikala asterisker"] # 0x2051 + - "⁒": [T: "kommersiellt minus"] # 0x2052 - "⁗": [T: "kvadrupelt prim"] # 0x2057 (en: 'quadruple prime', MathPlayer: 'quadruple prime', google: 'fyrdubbla prime') - - "⁠": [t: ""] # 0x2060 + - "⁠": [T: ""] # 0x2060 - "⁰": [T: "upphöjt till noll"] # 0x2070 (en: 'to the zeroth power', google translation) - "ⁱ": [T: "upphöjt till i"] # 0x2071 (en: 'to the eihth power', google: 'till eihth power') - "⁴": [T: "upphöjt till fyra"] # 0x2074 (en: 'to the fourth power', google translation) @@ -377,13 +404,13 @@ - "₯": [T: "drakmer"] # 0x20af (google: 'drakma') - "₰": [T: "pfennig"] # 0x20b0 (google: 'tyska pennies') - "₱": [T: "pesos"] # 0x20b1 - - "₲": [t: "guaranis"] # 0x20b2 - - "₳": [t: "australs"] # 0x20b3 (google: 'österral') - - "₴": [t: "hryvnja"] # 0x20b4 - - "₵": [t: "cedi"] # 0x20b5 + - "₲": [T: "guaranis"] # 0x20b2 + - "₳": [T: "australs"] # 0x20b3 (google: 'österral') + - "₴": [T: "hryvnja"] # 0x20b4 + - "₵": [T: "cedi"] # 0x20b5 - "₶": [T: "livre tournois"] # 0x20b6 (google translation) - "₷": [T: "spesmiloj"] # 0x20b7 (google translation) - - "₸": [t: "tenge"] # 0x20b8 (google translation) + - "₸": [T: "tenge"] # 0x20b8 (google translation) - "₹": [T: "indiska rupier"] # 0x20b9 (en: 'indian rupees', google translation) - "₺": [T: "turkiska lire"] # 0x20ba (en: 'turkish liras', google translation) - "⃐": [T: "vänster harpun"] # 0x20d0 (en: 'left harpoon above embellishment', google: 'vänster harpoon ovanför utsmyckning') @@ -404,18 +431,18 @@ - "⃟": [T: "i diamant"] # 0x20df (en: 'enclosing diamond embellishment', google translation) - "⃠": [T: "i cirkel med omvänt snedstreck"] # 0x20e0 (en: 'enclosing circle backslash embellishment', google translation) - "⃡": [T: "dubbel-riktad pil"] # 0x20e1 (en: 'left right arrow above embellishment', google: 'vänster höger pil över utsmyckningen') - - "⃢": [t: "i skärm"] # 0x20e2 (en: 'enclosing screen embellishment', google translation) - - "⃣": [t: "i tangent"] # 0x20e3 (en: 'enclosing keycap embellishment', google translation) - - "⃤": [t: "i uppåtpekande triangel"] # 0x20e4 (en: 'enclosing upward pointing triangle embellishment', google translation) - - "⃥": [t: "omvänd solidus"] # 0x20e5 (en: 'reverse solidus overlay embellishment', google translation) + - "⃢": [T: "i skärm"] # 0x20e2 (en: 'enclosing screen embellishment', google translation) + - "⃣": [T: "i tangent"] # 0x20e3 (en: 'enclosing keycap embellishment', google translation) + - "⃤": [T: "i uppåtpekande triangel"] # 0x20e4 (en: 'enclosing upward pointing triangle embellishment', google translation) + - "⃥": [T: "omvänd solidus"] # 0x20e5 (en: 'reverse solidus overlay embellishment', google translation) - "⃦": [T: "dubbelt lodstreck"] # 0x20e6 (en: 'double verticle stroke embellishment', google translation) - - "⃧": [t: "livräntasymbol"] # 0x20e7 (en: 'annuity symbol embellishment', google translation) - - "⃨": [t: "tre punkter"] # 0x20e8 (en: 'triple underdot', google translation) - - "⃩": [t: "bred bro"] # 0x20e9 (en: 'wide bridge above embellishment', google translation) + - "⃧": [T: "livräntasymbol"] # 0x20e7 (en: 'annuity symbol embellishment', google translation) + - "⃨": [T: "tre punkter"] # 0x20e8 (en: 'triple underdot', google translation) + - "⃩": [T: "bred bro"] # 0x20e9 (en: 'wide bridge above embellishment', google translation) - "⃪": [T: "vänster-pil"] # 0x20ea (en: 'leftwards arrow overlay embellishment', google translation) - - "⃫": [t: "lång dubbel solidus"] # 0x20eb (en: 'long double solidus overlay embellishment', google translation) - - "⃬": [t: "höger harpun med hulling nedåt"] # 0x20ec (en: 'rightwards harpoon with barb downwards embellishment', google translation) - - "⃭": [t: "vänster harpun med hulling nedåt"] # 0x20ed (en: 'leftwards harpoon with barb downwards embellishment', google translation) + - "⃫": [T: "lång dubbel solidus"] # 0x20eb (en: 'long double solidus overlay embellishment', google translation) + - "⃬": [T: "höger harpun med hulling nedåt"] # 0x20ec (en: 'rightwards harpoon with barb downwards embellishment', google translation) + - "⃭": [T: "vänster harpun med hulling nedåt"] # 0x20ed (en: 'leftwards harpoon with barb downwards embellishment', google translation) - "⃮": [T: "vänster-pil under"] # 0x20ee (en: 'left arrow below embellishment', google translation) - "⃯": [T: "höger-pil under"] # 0x20ef (en: 'right arrow below embellishment', google translation) - "⃰": [T: "asterisk"] # 0x20f0 (en: 'asterisk above embellishment', google translation) @@ -428,13 +455,13 @@ - "ℊ": [T: "skrivstilt g"] # 0x210a (en: 'script g') - "ℌℑℨℭ": # 0x210c, 0x2111, 0x2128, 0x212d - T: "fraktur" # (en: 'fraktur', google: 'fraktur') - - spell: "translate('.', 'ℌℑℨℭ', 'HIZC')" + - SPELL: "translate('.', 'ℌℑℨℭ', 'HIZC')" - - "ℍℙℾℿ": # 0x210d, 0x2119, 0x213e, 0x213f + - "ℍℙℾℿ": # audit-ignore 0x210d, 0x2119, 0x213e, 0x213f - test: if: "$Verbosity!='Terse'" then: [T: "dubbelslaget"] # (en: 'double struck', google translation) - - spell: "translate('.', 'ℍℙℾℿ', 'HPΓΠ')" + - SPELL: "translate('.', 'ℍℙℾℿ', 'HPΓΠ')" - "ℎ": [T: "plancks constant"] # 0x210e - "ℏ": [T: "h streck"] # 0x210f @@ -442,7 +469,7 @@ - "ℐℒ℘ℬℰℱℳ": # 0x2110, 0x2112, 0x2118, 0x2130, 0x2131, 0x2133 - T: "skrivstilt" # (en: 'script') - - spell: "translate('.', 'ℐℒ℘ℬℰℱℳ', 'ILPBEFM')" + - SPELL: "translate('.', 'ℐℒ℘ℬℰℱℳ', 'ILPBEFM')" - "ℓ": [T: "skrivstilt l"] # 0x2113 (en: 'script l') - "℔": [T: "pund"] # 0x2114 (en: 'pounds', google: 'pund') @@ -465,19 +492,22 @@ - else_if: "'.' = '⅃'" then: [T: "roterat sans-serif"] # (en: 'reversed sans-serif', google translation) else: [T: "roterat sans-serif"] # (en: 'turned sans-serif', google: 'vände sans-serif') - - spell: "translate('.', 'Ⅎ℺⅁⅂⅃⅄', 'FQGLLY')" + - SPELL: "translate('.', 'Ⅎ℺⅁⅂⅃⅄', 'FQGLLY')" - "ℴ": [T: "skrivstilt o"] # 0x2134 (en: 'script o') - - "ℵ": [t: "alef"] # 0x2135 (en: 'first transfinite cardinal') - - "ℶ": [t: "bet"] # 0x2136 (en: 'second transfinite cardinal') - - "ℷ": [t: "gimel"] # 0x2137 (en: 'third transfinite cardinal') - - "ℸ": [t: "dalet"] # 0x2138 (en: 'fourth transfinite cardinal') + - "ℵ": [T: "alef"] # 0x2135 (en: 'first transfinite cardinal') + - "ℶ": [T: "bet"] # 0x2136 (en: 'second transfinite cardinal') + - "ℷ": [T: "gimel"] # 0x2137 (en: 'third transfinite cardinal') + - "ℸ": [T: "dalet"] # 0x2138 (en: 'fourth transfinite cardinal') - "ℼ": [T: "dubbelslaget pi"] # 0x213c (en: 'double struck pi', google: 'dubbelslaget pi') - "ℽ": [T: "dubbelslaget gamma"] # 0x213d (en: 'double struck gamma', google: 'dubbelslaget gamma') - "⅀": [T: "dubbelslaget summatecken"] # 0x2140 (en: 'double struck n-ary summation', google: 'dubbelslaget n-ary-sammanfattning') - "⅋": [T: "roterat och-tecken"] # 0x214b (en: 'turned ampersand', google: 'vände ampersand') - "⅌": [T: "per"] # 0x214c (en: 'per', google: 'per') - "ⅎ": [T: "roterat f"] # 0x214e (en: 'turned F', google: 'vände f') + - "¼": [T: "en fjärdedel"] # 0x00bc + - "½": [T: "en halv"] # 0x00bd + - "¾": [T: "tre fjärdedelar"] # 0x00be - "⅐": [T: "en sjundedel"] # 0x2150 (en: 'one seventh', google: 'en sjunde') - "⅑": [T: "en niondel"] # 0x2151 (en: 'one ninth', google: 'en nionde') - "⅒": [T: "en tiondel"] # 0x2152 (en: 'one tenth') @@ -527,10 +557,6 @@ - "ⅾ": [T: "d"] # 0x217e (en: 'D', google translation) - "ⅿ": [T: "ⅿ"] # 0x217f (en: 'M', google translation) - "↉": [T: "noll tredjedelar"] # 0x2189 (en: 'zero thirds') - - "←": [T: "vänster-pil"] # 0x2190 (en: 'leftwards arrow') - - "↑": [T: "uppåt-pil"] # 0x2191 (en: 'upwards arrow') - - "→": [T: "höger-pil"] # 0x2192 (en: 'rightwards arrow') - - "↓": [T: "nedåt-pil"] # 0x2193 (en: 'downwards arrow') - "↔": [T: "dubbel-riktad pil"] # 0x2194 (en: 'left right arrow') - "↕": [T: "dubbel-riktad vertikal pil"] # 0x2195 (en: 'up down arrow') - "↖": [T: "nord-väst-pil"] # 0x2196 (en: 'north west arrow') @@ -650,8 +676,7 @@ - "⇾": [T: "höger-pil med öppen spets"] # 0x21fe (en: 'rightwards open headed arrow') - "⇿": [T: "dubbel-riktad pil med öppen spets"] # 0x21ff (en: 'left right open headed arrow') - "∀": [T: "för alla"] # 0x2200 (en: 'for all') - - "∁": # 0x2201 - - T: "komplementet av" # (en: 'complement of') + - "∁": [T: "komplementet av"] # audit-ignore 0x2201 - "∂": # 0x2202 - test: if: "$Verbosity='Terse'" @@ -660,79 +685,51 @@ - "∃": [T: "det finns"] # 0x2203 (en: 'there exists') - "∄": [T: "det finns inte"] # 0x2204 (en: 'there does not exist') - "∅": [T: "tomma mängden"] # 0x2205 (en: 'empty set') - - "∆": # 0x2206 - - T: "laplacianen av" # (en: 'laplacian of') + - "∆": [T: "laplacianen av"] # audit-ignore 0x2206 - "∇": [T: "gradienten av"] # 0x2207 (en: 'gradient of', google: 'lutning av') - - "∈": # 0x2208 + - "∊": # audit-ignore 0x220a - test: if: "$SpeechStyle != 'ClearSpeak'" - then: [T: "tillhör"] # (en: 'an element of', google translation) + then: [T: "tillhörande"] # (en: 'an element of', google translation) # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + # SWEDISH: Changed the non-ClearSpeak option to "tillhör", as that makes more sense in Swedish. + # SWEDISH: The word "medlem" is not commonly used in set theory, so we removed that rule. If the parsing has set the parameter to "Member" it will fall under the "else" case. else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set + if: "../../self::m:set or ../../../self::m:set" # inside a set then_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "i"] # (en: 'in', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [t: "ingår i"] # (en: 'member of', google translation) + then: [T: "i"] # (en: 'in', google translation) - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "element av"] # (en: 'element of', google translation) - - else: [T: "tillhör"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') + then: [T: "element i"] # (en: 'element of', google translation) + - else: [T: "tillhörande"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "ingår i"] # (en: 'is a member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "är ett element av"] # (en: 'is an element of', google translation) + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "i"] # SWEDISH: using this construction instead for more correct grammar in many cases - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "ingår i"] # (en: 'is in', google translation) - - else: [T: "tillhör"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') - - "∉": # 0x2209 + then: [T: "är i"] # (en: 'is in', google translation) + - else: [T: "tillhör"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') + - "∉": # audit-ignore 0x2209 # rule is identical to 0x2208 - test: if: "$SpeechStyle != 'ClearSpeak'" - then: [T: "tillhör inte"] # (en: 'is not an element of', google translation) - # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option - else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set - then_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "inte i"] # (en: 'not in', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "ingår inte i"] # (en: 'not member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "inte element av"] # (en: 'not element of', google translation) - - else: [T: "tillhör inte"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'not belonging to') - else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "ingår inte i"] # (en: 'is not a member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "är inte ett element av"] # (en: 'is not an element of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "ingår inte i"] # (en: 'is not in', google translation) - - else: [T: "tillhör inte"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'does not belong to') - - "∊": # 0x220a - - test: - if: "$SpeechStyle != 'ClearSpeak'" - then: [T: "tillhör"] # (en: 'is an element of', google translation) + then: [T: "inte tillhörande"] # (en: 'is not an element of', google translation) # Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option + # SWEDISH: Changed the non-ClearSpeak option to "tillhör", as that makes more sense in Swedish. + # SWEDISH: The word "medlem" is not commonly used in set theory, so we removed that rule. If the parsing has set the parameter to "Member" it will fall under the "else" case. else_test: - if: "../../self::m:set or ../../../self::m:set" # inside a set + if: "../../self::m:set or ../../../self::m:set" # inside a set then_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' - then: [T: "i"] # (en: 'in', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "ingår i"] # (en: 'member of', google translation) + then: [T: "inte i"] # (en: 'not in', google translation) - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "element av"] # (en: 'element of', google translation) - - else: [T: "tillhör"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to') + then: [T: "inte element i"] # (en: 'not element of', google translation) + - else: [T: "inte tillhörande"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'not belonging to') else_test: - - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' - then: [T: "ingår i"] # (en: 'is a member of', google translation) - - else_if: $ClearSpeak_SetMemberSymbol = 'Element' - then: [t: "är ett element av"] # (en: 'is an element of', google translation) + - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Element' + then: [T: "är inte ett element i"] # (en: 'is not an element of', google translation) - else_if: $ClearSpeak_SetMemberSymbol = 'In' - then: [t: "är i"] # (en: 'is in', google translation) - - else: [T: "tillhör"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belongs to') + then: [T: "är inte i"] # (en: 'is not in', google translation) + - else: [T: "tillhör inte"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'does not belong to') - "∋": [T: "innehåller som element"] # 0x220b (en: 'contains the member') - "∌": [T: "innehåller inte som element"] # 0x220c (en: 'does not contain the member') - "∍": [T: "innehåller som element"] # 0x220d (en: 'contains the member') @@ -744,21 +741,18 @@ - "∓": [T: "minus plus"] # 0x2213 (en: 'minus or plus') - "∔": [T: "punkt plus"] # 0x2214 (en: 'dot plus') - "∕": [T: "delat med"] # 0x2215 (en: 'divided by') - - "∖": [t: "minus"] # 0x2216 (en: 'set minus') - - "∗": [t: "gånger"] # 0x2217 (en: 'times') - - "∘": [t: "och"] # 0x2218 (en: 'composed with') + - "∖": [T: "minus"] # 0x2216 (en: 'set minus') + - "∗": [T: "gånger"] # 0x2217 (en: 'times') + - "∘": [T: "och"] # 0x2218 (en: 'composed with') - "∙": # 0x2219 - test: if: "@data-chem-formula-op" - then: [t: "punkt"] # (en: 'dot', google translation) + then: [T: "punkt"] # (en: 'dot', google translation) else: [T: "gånger"] # (en: 'times') - - "√": # 0x221a - - T: "kvadratroten ur" # (en: 'square root of') - - "∛": # 0x221b - - T: "kubikroten ur" # (en: 'cube root of') - - "∜": # 0x221c - - T: "fjärderoten ur" # (en: 'fourth root of') + - "√": [T: "kvadratroten ur"] # audit-ignore 0x221a + - "∛": [T: "kubikroten ur"] # audit-ignore 0x221b + - "∜": [T: "fjärderoten ur"] # audit-ignore 0x221c - "∝": # 0x221d - test: if: "$Verbosity!='Terse'" @@ -786,46 +780,36 @@ - "∳": [T: "moturs-kurv-integralen"] # 0x2233 (en: 'anticlockwise contour integral', MathPlayer: 'anticlockwise contour integral', google: 'antikvis konturintegral') - "∴": [T: "alltså"] # 0x2234 (en: 'therefore') - "∵": [T: "eftersom"] # 0x2235 (en: 'because') - - "∶": # 0x2236 - - T: "till" # (en: 'to') + - "∶": [T: "till"] # audit-ignore 0x2236 - "∷": [T: "som"] # 0x2237 (en: 'as', MathPlayer: 'proportion', google: 'som') - - "∸": [t: "punkt minus"] # 0x2238 (en: 'dot minus') - - "∹": [t: "har överskott jämfört med"] # 0x2239 (en: 'has excess compared to', MathPlayer: 'excess', google: 'har överskott jämfört med') + - "∸": [T: "punkt minus"] # 0x2238 (en: 'dot minus') + - "∹": [T: "har överskott jämfört med"] # 0x2239 (en: 'has excess compared to', MathPlayer: 'excess', google: 'har överskott jämfört med') - "∺": # 0x223a - test: if: "$Verbosity!='Terse'" - then: [t: "är"] # (en: 'is', google translation) - - t: "geometriskt proportionell mot" # (en: 'geometrically proportional to') + then: [T: "är"] # (en: 'is', google translation) + - T: "geometriskt proportionell mot" # (en: 'geometrically proportional to') - "∻": # 0x223b - test: if: "$Verbosity!='Terse'" - then: [t: "är"] # (en: 'is', google translation) - - t: "homotetisk till" # (en: 'homothetic to', MathPlayer: 'homothetic', google: 'homotetisk till') + then: [T: "är"] # (en: 'is', google translation) + - T: "homotetisk till" # (en: 'homothetic to', MathPlayer: 'homothetic', google: 'homotetisk till') - "∼": [T: "är proportionell mot"] # 0x223c (en: 'varies with') - - "∽": [T: "är proportionell mot"] # 0x223d (en: 'reversed tilde') - - "∾": # 0x223e - - t: "omvänt långdraget s" # (en: 'most positive', MathPlayer: 'inverted lazy s', google: 'mest positiva') + - "∽": [T: "likformig med"] # 0x223d (en: 'reversed tilde') + - "∾": [T: "omvänt långdraget s"] # audit-ignore 0x223e - "∿": [T: "sinuskurva"] # 0x223f (en: 'sine wave') - "≀": [T: "kransprodukt"] # 0x2240 (en: 'wreath product') - "≁": [T: "inte proportionell mot"] # 0x2241 (en: 'not tilde') - "≂": [T: "minus tilde"] # 0x2242 (SRE: 'minus och tilde') - - "≃": # 0x2243 - - T: "asymptotiskt lika med" # (en: 'asymptotically equal to', MathPlayer: 'asymptotically lika med', google: 'asymptotiskt lika med') - - "≄": # 0x2244 - - T: "inte asymptotiskt lika med" # (en: 'not asymptotically equal to', MathPlayer: 'inte asymptotically lika med', google: 'inte asymptotiskt lika med') - - "≅": # 0x2245 - - T: "ungefär lika med" # (en: 'approximately equal to', MathPlayer: 'approximativt lika med', google: 'ungefär lika med') - - "≆": # 0x2246 - - T: "ungefär men inte faktiskt lika med" # (en: 'approximately but not actually equal to', MathPlayer: 'approximativt men inte faktiskt lika med', google: 'ungefär men inte faktiskt lika med') - - "≇": # 0x2247 - - T: "varken ungefär eller fakiskt lika med" # (en: 'neither approximately nor actually equal to', MathPlayer: 'varken approximativt eller fakiskt lika med', google: 'varken ungefär eller faktiskt lika med') - - "≈": # 0x2248 - - T: "ungefär lika med" # (en: 'almost equal to', SRE: 'är nästan lika med') - - "≉": # 0x2249 - - T: "inte ungefär lika med" # (en: 'not almost equal to', SRE: 'är inte nästan lika med') - - "≊": # 0x224a - - T: "ungefär lika med eller lika med" # (en: 'almost equal or equal to', SRE: 'är nästan lika eller lika med') - - "≋": [t: "trippla tilde"] # 0x224b (en: 'triple tilde') + - "≃": [T: "asymptotiskt lika med"] # audit-ignore 0x2243 + - "≄": [T: "inte asymptotiskt lika med"] # audit-ignore 0x2244 + - "≅": [T: "ungefär lika med"] # audit-ignore 0x2245 + - "≆": [T: "ungefär men inte faktiskt lika med"] # audit-ignore 0x2246 + - "≇": [T: "varken ungefär eller fakiskt lika med"] # audit-ignore 0x2247 + - "≈": [T: "ungefär lika med"] # audit-ignore 0x2248 + - "≉": [T: "inte ungefär lika med"] # audit-ignore 0x2249 + - "≊": [T: "ungefär lika med eller lika med"] # audit-ignore 0x224a + - "≋": [T: "trippla tilde"] # 0x224b (en: 'triple tilde') - "≌": [T: "är alla lika med"] # 0x224c (en: 'are all equal to', MathPlayer: 'alla lika med') - "≍": # 0x224d - test: @@ -837,22 +821,17 @@ if: "$Verbosity!='Terse'" then: [T: "är"] # (en: 'is', google translation) - T: "geometriskt ekvivalent med" # (en: 'geometrically equivalent to', MathPlayer: 'geometriskt lika med', google: 'geometriskt motsvarande') - - "≏": # 0x224f - - t: "differensen mellan" # (en: 'difference between') + - "≏": [T: "differensen mellan"] # audit-ignore 0x224f - "≐": [T: "närmar sig gränsvärdet"] # 0x2250 (en: 'approaches the limit') - - "≑": # 0x2251 - - T: "geometriskt lika med" # (en: 'geometrically equal to', SRE: 'är geometriskt lika med') - - "≒": # 0x2252 - - T: "ungefär lika med" # (en: 'approximately equal to or the image of', MathPlayer: 'uppskattningsvis lika med eller i likhet med', google: 'ungefär lika med eller bilden av') - - "≓": # 0x2253 - - T: "ungefär lika med" # (en: 'image of or approximately equal to', MathPlayer: 'i likhet med eller uppskattningsvis lika med', google: 'bild av eller ungefär lika med') + - "≑": [T: "geometriskt lika med"] # audit-ignore 0x2251 + - "≒": [T: "ungefär lika med"] # audit-ignore 0x2252 + - "≓": [T: "ungefär lika med"] # audit-ignore 0x2253 - "≔": [T: "definieras som"] # 0x2254 (en: 'colon equals', MathPlayer: 'kolon lika med', google: 'kolon är lika med') - - "≕": [t: "lika med kolon"] # 0x2255 (en: 'equals colon', MathPlayer: 'lika med kolon') + - "≕": [T: "lika med kolon"] # 0x2255 (en: 'equals colon', MathPlayer: 'lika med kolon') - "≖": [T: "ring i lika med"] # 0x2256 (en: 'ring in equal to', SRE: 'är ring i lika med') - - "≗": # 0x2257 - - t: "ring lika med" # (en: 'approximately equal to') + - "≗": [T: "ring lika med"] # audit-ignore 0x2257 - "≘": [T: "motsvarar"] # 0x2258 (en: 'corresponds to') - - "≙": [t: "skattar"] # 0x2259 (en: 'estimates') + - "≙": [T: "skattar"] # 0x2259 (en: 'estimates') - "≚": # 0x225a - test: if: "$Verbosity!='Terse'" @@ -862,11 +841,9 @@ # SWEDISH: misspelled delta to fix pronunciation - "≜": [T: "dellta lika med"] # 0x225c (en: 'delta equals') - "≝": [T: "per definition lika med"] # 0x225d (en: 'is defined to be') - - "≞": # 0x225e - - T: "mäts med" # (en: 'measured by') + - "≞": [T: "mäts med"] # audit-ignore 0x225e - "≟": [T: "ifrågasatt likhet"] # 0x225f (en: 'has an unknown relationship with') - - "≠": # 0x2260 - - T: "inte lika med" # (en: 'not equal to') + - "≠": [T: "inte lika med"] # audit-ignore 0x2260 - "≡": # 0x2261 # SWEDISH: This symbol can mean different things. Can MathML differ between them? If so, build a test? - test: @@ -1023,13 +1000,13 @@ if: "$Verbosity!='Terse'" then: [T: "är"] # (en: 'is', google translation) - T: "varken övermängd till eller lika med" # (en: 'neither a superset of nor equal to') - - "⊊": # 0x228a (en: 'subset of with not equal to') + - "⊊": # audit-ignore 0x228a (en: 'subset of with not equal to') # SWEDISH: added test - test: if: "$Verbosity!='Terse'" then: [T: "är en"] - T: "äkta delmängd av" - - "⊋": # 0x228b (en: 'superset of with not equal to') + - "⊋": # audit-ignore 0x228b (en: 'superset of with not equal to') # SWEDISH: added test - test: if: "$Verbosity!='Terse'" @@ -1048,21 +1025,20 @@ - "⊕": [T: "direkt summa"] # 0x2295 (en: 'circled plus') - "⊖": [T: "symmetrisk differens"] # 0x2296 (en: 'circled minus') - "⊗": [T: "tensorprodukt"] # 0x2297 (en: 'circled times') - - "⊘": [t: "division i cirkel"] # 0x2298 (en: 'circled slash') - - "⊙": [t: "XNOR"] # 0x2299 (en: 'circled dot operator') + - "⊘": [T: "division i cirkel"] # 0x2298 (en: 'circled slash') + - "⊙": [T: "XNOR"] # 0x2299 (en: 'circled dot operator') - "⊚": [T: "ring-operator i cirkel"] # 0x229a (en: 'circled ring') - - "⊛": [t: "asteriskoperator i cirkel"] # 0x229b (en: 'circled asterisk') - - "⊜": [t: "likhetstecken i cirkel"] # 0x229c (en: 'circled equals') + - "⊛": [T: "asteriskoperator i cirkel"] # 0x229b (en: 'circled asterisk') + - "⊜": [T: "likhetstecken i cirkel"] # 0x229c (en: 'circled equals') - "⊝": [T: "symmetrisk differens"] # 0x229d (en: 'circled dash') - - "⊞": [t: "plustecken i kvadrat"] # 0x229e (en: 'squared plus') - - "⊟": [t: "minustecken i kvadrat"] # 0x229f (en: 'squared minus') - - "⊠": [t: "multiplikationstecken i kvadrat"] # 0x22a0 (en: 'squared times') - - "⊡": [t: "punkt-operator i kvadrat"] # 0x22a1 (en: 'squared dot operator') + - "⊞": [T: "plustecken i kvadrat"] # 0x229e (en: 'squared plus') + - "⊟": [T: "minustecken i kvadrat"] # 0x229f (en: 'squared minus') + - "⊠": [T: "multiplikationstecken i kvadrat"] # 0x22a0 (en: 'squared times') + - "⊡": [T: "punkt-operator i kvadrat"] # 0x22a1 (en: 'squared dot operator') - "⊢": [T: "bevisar"] # 0x22a2 (en: 'proves') - "⊣": [T: "bevisar inte"] # 0x22a3 (en: 'does not yield') - - "⊤": [t: "sanning"] # 0x22a4 (en: 'top') - - "⊥": # 0x22a5 - - T: "motsägelse" # (en: 'bottom', MathPlayer: 'up tack', google: 'botten') + - "⊤": [T: "sanning"] # 0x22a4 (en: 'top') + - "⊥": [T: "motsägelse"] # audit-ignore 0x22a5 - "⊦": [T: "reduceras till"] # 0x22a6 (en: 'reduces to') - "⊧": [T: "innebär"] # 0x22a7 (en: 'models', MathPlayer: 'models') - "⊨": # 0x22a8 @@ -1105,9 +1081,9 @@ if: "$Verbosity!='Terse'" then: [T: "är"] # (en: 'is', google translation) - T: "värdemängden av" # (en: 'an image of', MathPlayer: 'image of', google: 'en bild av') - - "⊸": [t: "linjär implikation"] # 0x22b8 (SRE: 'multimatris') + - "⊸": [T: "linjär implikation"] # 0x22b8 (SRE: 'multimatris') - "⊹": [T: "hermetisk matris"] # 0x22b9 (SRE: 'hermetisk konjugatmatris') - - "⊺": [t: "inskjutning"] # 0x22ba (en: 'intercalate', MathPlayer: 'intercalate', google: 'interkalat') + - "⊺": [T: "inskjutning"] # 0x22ba (en: 'intercalate', MathPlayer: 'intercalate', google: 'interkalat') - "⊻": [T: "exklusiv disjunktion"] # 0x22bb (en: 'xor') - "⊼": [T: "sheffers streck"] # 0x22bc (en: 'nand') - "⊽": [T: "varken eller"] # 0x22bd (en: 'nor') @@ -1128,14 +1104,10 @@ - "⋆": [T: "stjärna"] # 0x22c6 (en: 'times') - "⋇": [T: "delat med gånger"] # 0x22c7 (en: 'division times') - "⋈": [T: "naturlig join"] # 0x22c8 (en: 'bowtie', MathPlayer: 'bowtie') - - "⋉": # 0x22c9 - - T: "vänster semi-join" # (en: 'the left normal factor semidirect product of') - - "⋊": # 0x22ca - - T: "höger semi-join" # (en: 'the right normal factor semidirect product of') - - "⋋": # 0x22cb - - T: "vänster semi-direkt produkt" # (en: 'the left semidirect product of') - - "⋌": # 0x22cc - - T: "höger semi-direkt produkt" # (en: 'the right semidirect product of') + - "⋉": [T: "vänster semi-join"] # audit-ignore 0x22c9 + - "⋊": [T: "höger semi-join"] # audit-ignore 0x22ca + - "⋋": [T: "vänster semi-direkt produkt"] # audit-ignore 0x22cb + - "⋌": [T: "höger semi-direkt produkt"] # audit-ignore 0x22cc - "⋍": [T: "asymptotiskt lika med"] # 0x22cd (en: 'reversed tilde equals') - "⋎": [T: "disjunktion"] # 0x22ce - "⋏": [T: "konjunktion"] # 0x22cf (en: 'curly logical and') @@ -1149,14 +1121,10 @@ if: "$Verbosity!='Terse'" then: [T: "är en"] # (en: 'is', google translation) - T: "dubbel övermängd till" # (en: 'a double superset of') - - "⋒": # 0x22d2 - - T: "dubbla snittet" # (en: 'double intersection of') - - "⋓": # 0x22d3 - - T: "dubbla unionen" # (en: 'double union of') - - "⋔": # 0x22d4 - - T: "äkta snittet" # (en: 'proper intersection of', MathPlayer: 'pitchfork', google: 'korrekt skärningspunkt av') - - "⋕": # 0x22d5 - - T: "lika med och parallell med" # (en: 'equal to and parallel to') + - "⋒": [T: "dubbla snittet"] # audit-ignore 0x22d2 + - "⋓": [T: "dubbla unionen"] # audit-ignore 0x22d3 + - "⋔": [T: "äkta snittet"] # audit-ignore 0x22d4 + - "⋕": [T: "lika med och parallell med"] # audit-ignore 0x22d5 - "⋖": [T: "mindre än med punkt"] # 0x22d6 (en: 'less than with dot') - "⋗": [T: "större än med punkt"] # 0x22d7 (en: 'greater than with dot') - "⋘": # 0x22d8 @@ -1247,9 +1215,9 @@ - "⋼": [T: "innehåller med vertikalt streck i slutet av horisontellt streck"] # 0x22fc (en: 'contains with vertical bar at end of horizontal stroke') - "⋽": [T: "innehåller med streck över"] # 0x22fd (en: 'contains with overbar', MathPlayer: 'contains or equal to', google: 'innehåller med overbar') - "⋾": [T: "innehåller med streck över"] # 0x22fe (en: 'contains with overbar') - - "⋿": [t: "tillhör enligt z-notation"] # 0x22ff (en: 'z notation bag membership', MathPlayer: 'z notation bag membership', google: 'z medlemskap för notation bag') + - "⋿": [T: "tillhör enligt z-notation"] # 0x22ff (en: 'z notation bag membership', MathPlayer: 'z notation bag membership', google: 'z medlemskap för notation bag') - "⌀": [T: "diameter"] # 0x2300 - - "⌁": [t: "elektrisk pil"] # 0x2301 (en: 'electric arrow') + - "⌁": [T: "elektrisk pil"] # 0x2301 (en: 'electric arrow') - "⌂": [T: "hus"] # 0x2302 (en: 'house') - "⌃": [T: "pilspets uppåt"] # 0x2303 (en: 'up arrowhead', google: 'upp pilspetsen') - "⌄": [T: "pilspets nedåt"] # 0x2304 (en: 'down arrowhead', google: 'ner pilspetsen') @@ -1269,9 +1237,9 @@ - "⌒": [T: "båge"] # 0x2312 (en: 'arc') - "⌓": [T: "segment"] # 0x2313 - "⌔": [T: "sektor"] # 0x2314 (en: 'sector') - - "⌕": [t: "telefon"] # 0x2315 (en: 'telephone recorder', google: 'telefoninspelare') - - "⌖": [t: "hårkors"] # 0x2316 (en: 'position indicator crosshairs', google: 'positionindikator korsstolar') - - "⌗": [t: "fyrkant"] # 0x2317 (google translation) + - "⌕": [T: "telefon"] # 0x2315 (en: 'telephone recorder', google: 'telefoninspelare') + - "⌖": [T: "hårkors"] # 0x2316 (en: 'position indicator crosshairs', google: 'positionindikator korsstolar') + - "⌗": [T: "fyrkant"] # 0x2317 (google translation) - "⌘": [T: "sevärdhet"] # 0x2318 (en: 'place of interest sign', google: 'plats för räntetecken') - "⌙": [T: "roterat icke"] # 0x2319 (en: 'turned not sign', google translation) - "⌚": [T: "klocka"] # 0x231a (en: 'watch', google: 'kolla på') @@ -1280,8 +1248,8 @@ - "⌝": [T: "övre höger hörn"] # 0x231d (en: 'top right corner') - "⌞": [T: "nedre vänster hörn"] # 0x231e (en: 'bottom left corner') - "⌟": [T: "nedre höger hörn"] # 0x231f (en: 'bottom right corner') - - "⌠": [t: "övre halvans integral"] # 0x2320 (en: 'top half integral') - - "⌡": [t: "nedre halvans integral"] # 0x2321 (en: 'bottom half integral') + - "⌠": [T: "övre halvans integral"] # 0x2320 (en: 'top half integral') + - "⌡": [T: "nedre halvans integral"] # 0x2321 (en: 'bottom half integral') - "⌢": [T: "rynkar pannan"] # 0x2322 (en: 'frown', google: 'rynka pannan') - "⌣": [T: "leende"] # 0x2323 (en: 'smile') - "⌤": [T: "enter"] # 0x2324 (en: 'up arrowhead between two horizontal bars', google: 'upp pilspetsen mellan två horisontella staplar') @@ -1294,21 +1262,37 @@ - "⌫": [T: "backspace"] # 0x232b (en: 'erase to the left', google translation) - "⌬": [T: "bensenring"] # 0x232c (en: 'benzene ring', google translation) - "⌭": [T: "cylindricitet"] # 0x232d - - "⌮": [t: "profil"] # 0x232e (google: 'runt profilen') + - "⌮": [T: "profil"] # 0x232e (google: 'runt profilen') - "⌯": [T: "symmetri"] # 0x232f (en: 'symmetry', google translation) - - "⌰": [t: "total runout"] # 0x2330 (google translation) + - "⌰": [T: "total runout"] # 0x2330 (google translation) - "⌱": [T: "origo"] # 0x2331 (google translation) - "⌲": [T: "konisk avsmalning"] # 0x2332 (en: 'conical taper', google translation) - "⌳": [T: "sluttning"] # 0x2333 (en: 'slope', google translation) - "⌴": [T: "plansänkning"] # 0x2334 (en: 'counterbore', google translation) - "⌵": [T: "försänkning"] # 0x2335 (en: 'countersink', google translation) - - "⍰": [t: "okänd"] # 0x2370 (en: 'unknown box', google: 'okänd ruta') - - "⎕": [t: "låda"] # 0x2395 (en: 'box', google translation) + - "⌶": [T: "i-balk"] # 0x2336 + - "⌽": [T: "cirkelstile"] # 0x233d + - "⌿": [T: "slash-bar"] # 0x233f + - "⍰": [T: "okänd"] # 0x2370 (en: 'unknown box', google: 'okänd ruta') + - "⍼": [T: "rät vinkel med sicksack-pil nedåt"] # 0x237c + - "⎔": [T: "hexagon"] # 0x2394 + - "⎕": [T: "låda"] # 0x2395 (en: 'box', google translation) + - "⎶": [T: "undre hak-parentes över övre hak-parentes"] # 0x23b6 + - "⏜": [T: "övre parentes"] # 0x23dc + - "⏝": [T: "nedre parentes"] # 0x23dd - "⏞": [T: "övre klammer"] # 0x23DE (en: 'top brace') - "⏟": [T: "nedre klammer"] # 0x23DF (en: 'bottom brace') + - "⏠": [T: "övre sköldpadds-skal hak-parentes"] # 0x23e0 + - "⏡": [T: "undre sköldpadds-skal hak-parentes"] # 0x23e1 + - "⏢": [T: "vit trapets"] # 0x23e2 + - "⏣": [T: "bensenring"] # 0x23e3 + - "⏤": [T: "rakhet"] # 0x23e4 + - "⏥": [T: "planhet"] # 0x23e5 + - "⏦": [T: "växelström"] # 0x23e6 + - "⏧": [T: "elektrisk korsning"] # 0x23e7 - "①-⑨": # 0x2460 - 0x2469 # SWEDISH: switched order - - spell: "translate('.', '①②③④⑤⑥⑦⑧⑨', '123456789')" + - SPELL: "translate('.', '①②③④⑤⑥⑦⑧⑨', '123456789')" - T: "i cirkel" # (en: 'circled') - "⑩": [T: "tio i cirkel"] # 0x2469 (en: 'circled ten', google translation) - "⑪": [T: "elva i cirkel"] # 0x246a (en: 'circled eleven', google translation) @@ -1322,7 +1306,7 @@ - "⑳": [T: "tjugo i cirkel"] # 0x2473 (en: 'circled twenty', google translation) - "⑴-⑼": # 0x2474 - 0x247d # SWEDISH: switched order - - spell: "translate('.', '⑴⑵⑶⑷⑸⑹⑺⑻⑼', '123456789')" + - SPELL: "translate('.', '⑴⑵⑶⑷⑸⑹⑺⑻⑼', '123456789')" - T: "inom parentes" # (en: 'parenthesized', google translation) - "⑽": [T: "tio inom parentes"] # 0x247d (en: 'parenthesized ten', google translation) - "⑾": [T: "elva inom parentes"] # 0x247e (en: 'parenthesized eleven', google translation) @@ -1336,7 +1320,7 @@ - "⒆": [T: "nitton inom parentes"] # 0x2486 (en: 'parenthesized nineteen', google translation) - "⒇": [T: "tjugo inom parentes"] # 0x2487 (en: 'parenthesized twenty', google translation) - "⒈-⒐": # 0x2488 - 0x2491 - - spell: "translate('.', '⒈⒉⒊⒋⒌⒍⒎⒏⒐', '123456789')" + - SPELL: "translate('.', '⒈⒉⒊⒋⒌⒍⒎⒏⒐', '123456789')" - T: "med punkt" # (en: 'with period', google translation) - "⒑": [T: "tio med punkt"] # 0x2491 (en: 'ten with period', google translation) - "⒒": [T: "elva med punkt"] # 0x2492 (en: 'eleven with period', google translation) @@ -1351,22 +1335,22 @@ - "⒛": [T: "tjugo med punkt"] # 0x249b (en: 'twenty with period', google translation) - "⒜-⒵": # 0x249c - 0x24b5 # SWEDISH: switched order - - spell: "translate('.', '⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵', 'abcdefghijklmnopqrstuvwxyz')" + - SPELL: "translate('.', '⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵', 'abcdefghijklmnopqrstuvwxyz')" - T: "inom parentes" # (en: 'parenthesized', google translation) - "Ⓐ-Ⓩ": # SWEDISH: switched order - - spell: "translate('.', 'ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - SPELL: "translate('.', 'ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - T: "i cirkel" # (en: 'circled', google translation) - "🅐-🅩": # 0x1f150 - 0x1f169 # SWEDISH: switched order - - spell: "translate('.', '🅐🅑🅒🅓🅔🅕🅖🅗🅘🅙🅚🅛🅜🅝🅞🅟🅠🅡🅢🅣🅤🅥🅦🅧🅨🅩', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - SPELL: "translate('.', '🅐🅑🅒🅓🅔🅕🅖🅗🅘🅙🅚🅛🅜🅝🅞🅟🅠🅡🅢🅣🅤🅥🅦🅧🅨🅩', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - T: "i fylld cirkel" # (en: 'black circled', google translation) - "ⓐ-ⓩ": # 0x24d0 - 0x24e9 # SWEDISH: switched order - - spell: "translate('.', 'ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ', 'abcdefghijklmnopqrstuvwxyz')" + - SPELL: "translate('.', 'ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ', 'abcdefghijklmnopqrstuvwxyz')" - T: "i cirkel" # (en: 'circled', google translation) - "⓪": [T: "noll i cirkel"] # 0x24ea (google translation) - "⓫": [T: "elva i fylld cirkel"] # 0x24eb (en: 'black circled eleven', google translation) @@ -1381,7 +1365,7 @@ - "⓴": [T: "tjugo i fylld cirkel"] # 0x24f4 (en: 'black circled twenty', google translation) - "⓵-⓽": # 0x24f5 - 0x24fe # SWEDISH: switched order - - spell: "translate('.', '⓵⓶⓷⓸⓹⓺⓻⓼⓽', '123456789')" + - SPELL: "translate('.', '⓵⓶⓷⓸⓹⓺⓻⓼⓽', '123456789')" - T: "i dubbel cirkel" # (en: 'double circled', google translation) - "⓾": [T: "tio i dubbel cirkel"] # 0x24fe (en: 'double circled ten', google translation) - "⓿": [T: "noll i fylld cirkel"] # 0x24ff (en: 'black circled zero', google translation) @@ -1426,12 +1410,12 @@ - "◆": [T: "svart diamant"] # 0x25c6 (en: 'black diamond') - "◇": [T: "vit diamant"] # 0x25c7 (en: 'white diamond') - "◈": [T: "svart diamant i vit diamant"] # 0x25c8 (en: 'white diamond containing black small diamond') - - "◉": [t: "fisköga"] # 0x25c9 (en: 'fisheye') + - "◉": [T: "fisköga"] # 0x25c9 (en: 'fisheye') - "◊": [T: "romb"] # 0x25ca (en: 'lozenge') - "○": [T: "vit cirkel"] # 0x25cb (en: 'white circle') - "◌": [T: "prickad cirkel"] # 0x25cc (en: 'dotted circle') - "◍": [T: "cirkel med vertikal ifyllning"] # 0x25cd (en: 'circle with vertical fill') - - "◎": [t: "bullseye"] # 0x25ce (SRE: 'mitt-i-prick') + - "◎": [T: "bullseye"] # 0x25ce (SRE: 'mitt-i-prick') - "●": [T: "svart cirkel"] # 0x25cf (en: 'black circle') - "◐": [T: "cirkel med vänster halva fylld"] # 0x25d0 (en: 'circle with left half black') - "◑": [T: "cirkel med höger halva fylld"] # 0x25d1 (en: 'circle with right half black') @@ -1481,14 +1465,54 @@ - "◽": [T: "liden hvid kanin"] # 0x25fd (en: 'white medium small square') - "◾": [T: "liten svart kvadrat"] # 0x25fe (en: 'black medium small square') - "◿": [T: "triangel nedåt höger"] # 0x25ff (en: 'lower right triangle') - - "♠": [T: "svart spader"] # 0x2660 (en: 'black spade suit', google: 'svart spade kostym') + - "★": [T: "svart stjärna"] # 0x2605 + - "☆": [T: "vit stjärna"] # 0x2606 + - "☉": [T: "sol"] # 0x2609 + - "☌": [T: "konjunktion"] # 0x260c + - "☒": [T: "kryssad ruta"] # 0x2612 + - "☽": [T: "nymåne"] # 0x263d + - "☾": [T: "måne i nedan"] # 0x263e + - "☿": [T: "merkurius"] # 0x263f + - "♀": [T: "kvinna"] # 0x2640 + - "♁": [T: "jorden"] # 0x2641 + - "♂": [T: "man"] # 0x2642 + - "♃": [T: "jupiter"] # 0x2643 + - "♄": [T: "saturnus"] # 0x2644 + - "♅": [T: "uranus"] # 0x2645 + - "♆": [T: "neptunus"] # 0x2646 + - "♇": [T: "pluto"] # 0x2647 + - "♈": [T: "väduren"] # 0x2648 + - "♉": [T: "oxen"] # 0x2649 + - "♩": [T: "fjärdedelsnot"] # 0x2669 + - "♭": [T: "b-förtecken"] # 0x266d + - "♮": [T: "återställningstecken"] # 0x266e + - "♯": [T: "korsförtecken"] # 0x266f + - "♠": [T: "spader"] # 0x2660 (en: 'black spade suit', google: 'svart spade kostym') - "♡": [T: "vit hjärter"] # 0x2661 (en: 'white heart suit', google: 'vit hjärtdräkt') - "♢": [T: "vit ruter"] # 0x2662 (en: 'white diamond suit', google: 'vit diamantdräkt') - - "♣": [T: "svart klöver"] # 0x2663 (en: 'black club suit', google: 'svart klubbdräkt') + - "♣": [T: "klöver"] # 0x2663 (en: 'black club suit', google: 'svart klubbdräkt') - "♤": [T: "vit spader"] # 0x2664 (en: 'white spade suit', google: 'vit spade kostym') - - "♥": [T: "svart hjärter"] # 0x2665 (en: 'black heart suit', google: 'black heart suit') - - "♦": [T: "svart ruter"] # 0x2666 (en: 'black diamond suit', google: 'svart diamantdräkt') + - "♥": [T: "hjärter"] # 0x2665 (en: 'black heart suit', google: 'black heart suit') + - "♦": [T: "ruter"] # 0x2666 (en: 'black diamond suit', google: 'svart diamantdräkt') - "♧": [T: "vit klöver"] # 0x2667 (en: 'white club suit', google: 'vit klubbdräkt') + - "⚀": [T: "tärningssida 1"] # 0x2680 + - "⚁": [T: "tärningssida 2"] # 0x2681 + - "⚂": [T: "tärningssida 3"] # 0x2682 + - "⚃": [T: "tärningssida 4"] # 0x2683 + - "⚄": [T: "tärningssida 5"] # 0x2684 + - "⚅": [T: "tärningssida 6"] # 0x2685 + - "⚆": [T: "vit cirkel med prick höger"] # 0x2686 + - "⚇": [T: "vit cirkel med två prickar"] # 0x2687 + - "⚈": [T: "cirkel med prick höger"] # 0x2688 + - "⚉": [T: "cirkel med två prickar"] # 0x2689 + - "⚪": [T: "vit cirkel"] # 0x26aa + - "⚫": [T: "svart cirkel"] # 0x26ab + - "⚬": [T: "liten vit cirkel"] # 0x26ac + - "⚲": [T: "neutrumsymbol"] # 0x26b2 + - "✓": [T: "bock"] # 0x2713 + - "✠": [T: "malteserkors"] # 0x2720 + - "✪": [T: "vit stjärna i cirkel"] # 0x272a + - "✶": [T: "sexuddig stjärna"] # 0x2736 - "❨": [T: "vänster-parentes"] # 0x2768 (en: 'medium left parentheses ornament', google: 'medium vänster-parentesesprydnad') - "❩": [T: "höger-parentes"] # 0x2769 (en: 'medium right parentheses ornament', google: 'medium höger parentesetheses ornament') - "❪": [T: "tillplattad vänster-parentes"] # 0x276a (en: 'medium flattened left parentheses ornament', google: 'medium plattad vänster parentese -prydnad') @@ -1499,8 +1523,8 @@ - "❯": [T: "fetstilt höger vinkel-parentes"] # 0x276f (en: 'heavy right-pointing angle quotation mark ornament', google: 'tung högerpekande vinkelcitationsmärke prydnad') - "❰": [T: "fetstilt vänster vinkel-parentes"] # 0x2770 (en: 'heavy left-pointing angle bracket ornament', google: 'tung vänsterpekande vinkelfäste prydnad') - "❱": [T: "fetstilt höger vinkel-parentes"] # 0x2771 (en: 'heavy right-pointing angle bracket ornament', google: 'tung högerpekande vinkelfäste prydnad') - - "❲": [t: "vänster sköldpadds-skal hak-parentes"] # 0x2772 (en: 'light left tortoise shell bracket ornament', google: 'ljus vänster sköldpaddsskalfäste prydnad') - - "❳": [t: "höger sköldpadds-skal hak-parentes"] # 0x2773 (en: 'light right tortoise shell bracket ornament', google: 'lätt höger sköldpaddsskalfäste prydnad') + - "❲": [T: "vänster sköldpadds-skal hak-parentes"] # 0x2772 (en: 'light left tortoise shell bracket ornament', google: 'ljus vänster sköldpaddsskalfäste prydnad') + - "❳": [T: "höger sköldpadds-skal hak-parentes"] # 0x2773 (en: 'light right tortoise shell bracket ornament', google: 'lätt höger sköldpaddsskalfäste prydnad') - "❴": [T: "fetstilt vänster klammer-parentes"] # 0x2774 (en: 'medium left brace ornament', google: 'medium vänster stagprydnad') - "❵": [T: "fetstilt höger klammer-parentes"] # 0x2775 (en: 'medium right brace ornament', google: 'medium höger stagprydnad') - "❶": [T: "ett i fylld cirkel"] # 0x2776 (en: 'black circled one', google translation) @@ -1592,17 +1616,17 @@ if: "$Verbosity!='Terse'" then: [T: "är en"] # (en: 'is', google translation) - T: "öppen övermängd till" # (en: 'an open superset of') - - "⟅": [t: "vänster s-formad bag delimiter"] # 0x27c5 (en: 'left s-shaped bag delimiter') - - "⟆": [t: "höger s-formad bag delimiter"] # 0x27c6 (en: 'right s-shaped bag delimiter') - - "⟇": [t: "eller med prick i"] # 0x27c7 (en: 'or with dot inside') + - "⟅": [T: "vänster s-formad bag delimiter"] # 0x27c5 (en: 'left s-shaped bag delimiter') + - "⟆": [T: "höger s-formad bag delimiter"] # 0x27c6 (en: 'right s-shaped bag delimiter') + - "⟇": [T: "eller med prick i"] # 0x27c7 (en: 'or with dot inside') - "⟈": [T: "omvänt snedstreck före delmängd"] # 0x27c8 (en: 'reverse solidus preceding subset') - "⟉": [T: "övermängd före snedstreck"] # 0x27c9 (en: 'superset preceding solidus') - "⟊": [T: "lodstreck med horisontellt streck"] # 0x27ca (en: 'vertical bar with horizontal stroke') - "⟋": [T: "stigande diagonal"] # 0x27cb (en: 'mathematical rising diagonal', google: 'matematisk stigande diagonal') - "⟌": [T: "liggande stolen"] # 0x27cc (en: 'long division') - "⟍": [T: "fallande diagonal"] # 0x27cd (en: 'mathematical falling diagonal', google: 'matematisk fallande diagonal') - - "⟎": [t: "och-tecken i kvadrat"] # 0x27ce (en: 'squared logical and', google: 'squared logical och') - - "⟏": [t: "eller-tecken i kvadrat"] # 0x27cf (en: 'squared logical or', google: 'kvadratiska logiska eller') + - "⟎": [T: "och-tecken i kvadrat"] # 0x27ce (en: 'squared logical and', google: 'squared logical och') + - "⟏": [T: "eller-tecken i kvadrat"] # 0x27cf (en: 'squared logical or', google: 'kvadratiska logiska eller') - "⟐": [T: "vit diamant med prick i mitten"] # 0x27d0 (en: 'white diamond with centered dot', google: 'vit diamant med centrerad prick') - "⟑": [T: "och med prick i"] # 0x27d1 (en: 'and with dot') - "⟒": [T: "tillhör med öppning uppåt"] # 0x27d2 (en: 'element of opening upwards') @@ -1615,7 +1639,7 @@ - "⟙": [T: "nedåtroterat vändkors"] # 0x27d9 (en: 'large down tack') - "⟚": [T: "vänster och höger dubbelt vändkors"] # 0x27da (en: 'left and right double turnstile') - "⟛": [T: "vänster och höger vändkors"] # 0x27db (en: 'left and right tack') - - "⟜": [t: "vänster multimap"] # 0x27dc (en: 'left multimap') + - "⟜": [T: "vänster multimap"] # 0x27dc (en: 'left multimap') - "⟝": [T: "långt vändkors"] # 0x27dd (en: 'long right tack') - "⟞": [T: "långt spegelvänt vändkors"] # 0x27de (en: 'long left tack') - "⟟": [T: "uppåtroterat vändkors med cirkel över"] # 0x27df (en: 'up tack with circle above') @@ -1763,7 +1787,7 @@ - "⥭": [T: "höger-harpun hulling ner över streck"] # 0x296d (en: 'rightwards harpoon with barb down below long dash') - "⥮": [T: "uppåt-harpun hulling vänster bredvid nedåt-harpun hulling höger"] # 0x296e (en: 'upwards harpoon with barb left beside downwards harpoon with barb right') - "⥯": [T: "nedåt-harpun hulling vänster bredvid uppåt-harpun hulling höger"] # 0x296f (en: 'downwards harpoon with barb left beside upwards harpoon with barb right') - - "⥰": [t: "höger roterat u parentes"] # 0x2970 (en: 'right double arrow with rounded head') + - "⥰": [T: "höger roterat u parentes"] # 0x2970 (en: 'right double arrow with rounded head') - "⥱": [T: "lika med över höger-pil"] # 0x2971 (en: 'equals above rightwards arrow') - "⥲": [T: "tilde över höger-pil"] # 0x2972 (en: 'tilde operator above rightwards arrow') - "⥳": [T: "vänster-pil över tilde"] # 0x2973 (en: 'leftwards arrow above tilde operator') @@ -1788,8 +1812,8 @@ - "⦆": [T: "höger-parentes vit"] # 0x2986 (en: 'right white parenthesis') - "⦇": [T: "vänster banan-parentes"] # 0x2987 (en: 'z notation left image bracket', google: 'z notation vänster bildfäste') - "⦈": [T: "höger banan-parentes"] # 0x2988 (en: 'z notation right image bracket', google: 'z notation rätt bildfäste') - - "⦉": [t: "vänster bindande parentes z-notation"] # 0x2989 (en: 'z notation left binding bracket') - - "⦊": [t: "höger bindande parentes z-notation"] # 0x298a (en: 'z notation right binding bracket') + - "⦉": [T: "vänster bindande parentes z-notation"] # 0x2989 (en: 'z notation left binding bracket') + - "⦊": [T: "höger bindande parentes z-notation"] # 0x298a (en: 'z notation right binding bracket') - "⦋": [T: "vänster hak-parentes med streck under"] # 0x298b (en: 'left square bracket with underbar') - "⦌": [T: "höger hak-parentes med streck under"] # 0x298c (en: 'right square bracket with underbar') - "⦍": [T: "vänster hak-parentes med streck i övre hörnet"] # 0x298d (en: 'left square bracket with tick in top corner') @@ -1802,8 +1826,8 @@ - "⦔": [T: "höger större än parentes"] # 0x2994 (en: 'right arc greater than bracket') - "⦕": [T: "vänster dubbel större än parentes"] # 0x2995 (en: 'double left arc greater than bracket') - "⦖": [T: "höger dubbel mindre än parentes"] # 0x2996 (en: 'double right arc less than bracket') - - "⦗": [t: "vänster sköldpadds-skal hak-parentes"] # 0x2997 (en: 'left black tortoise shell bracket', google: 'vänster svart sköldpaddsskalfäste') - - "⦘": [t: "höger sköldpadds-skal hak-parentes"] # 0x2998 (en: 'right black tortoise shell bracket', google: 'höger svart sköldpaddsskalfäste') + - "⦗": [T: "vänster sköldpadds-skal hak-parentes"] # 0x2997 (en: 'left black tortoise shell bracket', google: 'vänster svart sköldpaddsskalfäste') + - "⦘": [T: "höger sköldpadds-skal hak-parentes"] # 0x2998 (en: 'right black tortoise shell bracket', google: 'höger svart sköldpaddsskalfäste') - "⦙": [T: "prickat lodstreck"] # 0x2999 (en: 'dotted fence', google: 'prickat staket') - "⦚": [T: "sicksack lodstreck"] # 0x299a (en: 'vertical zigzag line') - "⦛": [T: "uppmätt vinkel åt vänster"] # 0x299b (en: 'measured angle opening left', google: 'uppmätt vinkelöppning vänster') @@ -1874,15 +1898,15 @@ - "⧜": [T: "ofullständig oändlighet"] # 0x29dc (en: 'incomplete infinity') - "⧝": [T: "bindebåge över oändlighetstecken"] # 0x29dd (en: 'tie over infinity', google: 'bind över oändligheten') - "⧞": [T: "oändlighetstecken med vertikalt streck"] # 0x29de (en: 'infinity negated with vertical bar') - - "⧟": [t: "dubbeländad multimap"] # 0x29df (en: 'double-ended multimap', google: 'dubbel-sluten multimap') + - "⧟": [T: "dubbeländad multimap"] # 0x29df (en: 'double-ended multimap', google: 'dubbel-sluten multimap') - "⧠": [T: "kvadrat med kontur"] # 0x29e0 (en: 'square with contoured outline', google: 'fyrkantig med konturerad kontur') - - "⧡": [t: "ökar med"] # 0x29e1 (en: 'increases as') - - "⧢": [t: "shuffle-produkt"] # 0x29e2 (en: 'shuffle product', google: 'shuffle -produkt') - - "⧣": [t: "lika med och lutande parallell"] # 0x29e3 (en: 'equals sign and slanted parallel') - - "⧤": [t: "lika med och lutande parallel med tilde över"] # 0x29e4 (en: 'equals sign and slanted parallel with tilde above') - - "⧥": [t: "identisk med och lutande parallell"] # 0x29e5 (en: 'identical to and slanted parallel') - - "⧦": [t: "lika med med vertikala streck vid ändarna"] # 0x29e6 - - "⧧": [t: "termodynamisk"] # 0x29e7 (en: 'thermodynamic', google: 'termodynamisk') + - "⧡": [T: "ökar med"] # 0x29e1 (en: 'increases as') + - "⧢": [T: "shuffle-produkt"] # 0x29e2 (en: 'shuffle product', google: 'shuffle -produkt') + - "⧣": [T: "lika med och lutande parallell"] # 0x29e3 (en: 'equals sign and slanted parallel') + - "⧤": [T: "lika med och lutande parallel med tilde över"] # 0x29e4 (en: 'equals sign and slanted parallel with tilde above') + - "⧥": [T: "identisk med och lutande parallell"] # 0x29e5 (en: 'identical to and slanted parallel') + - "⧦": [T: "lika med med vertikala streck vid ändarna"] # 0x29e6 + - "⧧": [T: "termodynamisk"] # 0x29e7 (en: 'thermodynamic', google: 'termodynamisk') - "⧨": [T: "triangel nedåt vänster halva fylld"] # 0x29e8 (en: 'down pointing triangle with left half black', google: 'ner pekande triangel med vänster halvsvart') - "⧩": [T: "triangel nedåt höger halva fylld"] # 0x29e9 (en: 'down pointing triangle with right half black', google: 'ner pekande triangel med höger halvsvart') - "⧪": [T: "fylld diamant med nedåt-pil"] # 0x29ea (en: 'black diamond with down arrow', google: 'svart diamant med nedpil') @@ -1918,30 +1942,30 @@ - "⨇": [T: "två och-tecken"] # 0x2a07 (en: 'two logical and operator', google: 'två logiska och operatörer') - "⨈": [T: "två eller-tecken"] # 0x2a08 (en: 'two logical or operator', google: 'två logiska eller operatörer') - "⨉": [T: "gånger"] # 0x2a09 (en: 'times operator', google: 'times operator') - - "⨊": [t: "modulo två summa"] # 0x2a0a (en: 'modulo two sum', google: 'modulo två summa') + - "⨊": [T: "modulo två summa"] # 0x2a0a (en: 'modulo two sum', google: 'modulo två summa') - "⨋": [T: "summa med integral"] # 0x2a0b (en: 'summation with integral', google: 'summering med integrerad') - "⨌": [T: "fyrdubbla integralen"] # 0x2a0c (en: 'quadruple integral operator') - - "⨍": [t: "integral med horisontellt streck"] # 0x2a0d (en: 'finite part integral') - - "⨎": [t: "integral med dubbelt horisontellt streck"] # 0x2a0e (en: 'integral with double stroke', google: 'integrerad med dubbelslag') - - "⨏": [t: "integral med streck mot nord-ost"] # 0x2a0f (en: 'integral average with slash', google: 'integrerat medelvärde med snedstreck') - - "⨐": [t: "cirkulations-funktion"] # 0x2a10 (en: 'circulation function') - - "⨑": [t: "moturs integration"] # 0x2a11 (en: 'anticlockwise integration') - - "⨒": [t: "kurv-integral med rektangulär väg runt pol"] # 0x2a12 (en: 'line integration with rectangular path around pole') - - "⨓": [t: "linje-integral med halvcirkel-väg runt pol"] # 0x2a13 (en: 'line integration with semicircular path around pole') - - "⨔": [t: "kurv-integral exklusive polen"] # 0x2a14 (en: 'line integration not including the pole', MathPlayer: 'line integration not including the pole', google: 'linjeintegration inkluderar inte polen') + - "⨍": [T: "integral med horisontellt streck"] # 0x2a0d (en: 'finite part integral') + - "⨎": [T: "integral med dubbelt horisontellt streck"] # 0x2a0e (en: 'integral with double stroke', google: 'integrerad med dubbelslag') + - "⨏": [T: "integral med streck mot nord-ost"] # 0x2a0f (en: 'integral average with slash', google: 'integrerat medelvärde med snedstreck') + - "⨐": [T: "cirkulations-funktion"] # 0x2a10 (en: 'circulation function') + - "⨑": [T: "moturs integration"] # 0x2a11 (en: 'anticlockwise integration') + - "⨒": [T: "kurv-integral med rektangulär väg runt pol"] # 0x2a12 (en: 'line integration with rectangular path around pole') + - "⨓": [T: "linje-integral med halvcirkel-väg runt pol"] # 0x2a13 (en: 'line integration with semicircular path around pole') + - "⨔": [T: "kurv-integral exklusive polen"] # 0x2a14 (en: 'line integration not including the pole', MathPlayer: 'line integration not including the pole', google: 'linjeintegration inkluderar inte polen') - "⨕": [T: "integral runt punkt-operator"] # 0x2a15 - - "⨖": [t: "integral med fyrkant"] # 0x2a16 - - "⨗": [t: "integral med vänster-pil med krok"] # 0x2a17 (en: 'integral with leftwards arrow with hook') - - "⨘": [t: "integral med multiplikationstecken"] # 0x2a18 (en: 'integral with times sign', google: 'integrerad med times sign') - - "⨙": [t: "integral med snitt"] # 0x2a19 (en: 'integral with intersection', google: 'integrerad med korsning') - - "⨚": [t: "integral med union"] # 0x2a1a (en: 'integral with union', google: 'integrerad med unionen') - - "⨛": [t: "integral med horisontellt streck över"] # 0x2a1b (en: 'integral with overbar', google: 'integrerad med overbar') - - "⨜": [t: "integral med horisontellt streck under"] # 0x2a1c (en: 'integral with underbar', google: 'integrerad med underbar') + - "⨖": [T: "integral med fyrkant"] # 0x2a16 + - "⨗": [T: "integral med vänster-pil med krok"] # 0x2a17 (en: 'integral with leftwards arrow with hook') + - "⨘": [T: "integral med multiplikationstecken"] # 0x2a18 (en: 'integral with times sign', google: 'integrerad med times sign') + - "⨙": [T: "integral med snitt"] # 0x2a19 (en: 'integral with intersection', google: 'integrerad med korsning') + - "⨚": [T: "integral med union"] # 0x2a1a (en: 'integral with union', google: 'integrerad med unionen') + - "⨛": [T: "integral med horisontellt streck över"] # 0x2a1b (en: 'integral with overbar', google: 'integrerad med overbar') + - "⨜": [T: "integral med horisontellt streck under"] # 0x2a1c (en: 'integral with underbar', google: 'integrerad med underbar') - "⨝": [T: "join"] # 0x2a1d (en: 'join', google: 'ansluta sig') - - "⨞": [t: "vänster triangel"] # 0x2a1e (en: 'large left triangle operator', google: 'stor vänster triangeloperatör') - - "⨟": [t: "schema-sammansättning z-notation"] # 0x2a1f (en: 'z notation schema composition', google: 'z notationsschema komposition') - - "⨠": [t: "schema-slussning z-notation"] # 0x2a20 (en: 'z notation schema piping', google: 'z notation schema piping') - - "⨡": [t: "schema-projektion z-notation"] # 0x2a21 (en: 'z notation schema projection', google: 'z notation schema projection') + - "⨞": [T: "vänster triangel"] # 0x2a1e (en: 'large left triangle operator', google: 'stor vänster triangeloperatör') + - "⨟": [T: "schema-sammansättning z-notation"] # 0x2a1f (en: 'z notation schema composition', google: 'z notationsschema komposition') + - "⨠": [T: "schema-slussning z-notation"] # 0x2a20 (en: 'z notation schema piping', google: 'z notation schema piping') + - "⨡": [T: "schema-projektion z-notation"] # 0x2a21 (en: 'z notation schema projection', google: 'z notation schema projection') - "⨢": [T: "plus med ring över"] # 0x2a22 (en: 'plus sign with circle above', MathPlayer: 'plustecken med ring över', google: 'plus skylt med cirkel ovan') - "⨣": [T: "plus med cirkumflex över"] # 0x2a23 (en: 'plus sign with circumflex accent above', MathPlayer: 'plustecken med cirkumflex accent över', google: 'plus -tecken med circumflex -accent ovan') - "⨤": [T: "plus med tilde över"] # 0x2a24 (en: 'plus sign with tilde above') @@ -1949,29 +1973,34 @@ - "⨦": [T: "plus med tilde under"] # 0x2a26 (en: 'plus sign with tilde below') - "⨧": [T: "plus med nedre index två"] # 0x2a27 (en: 'plus sign with subscript two', MathPlayer: 'plustecken med index två', google: 'plus skylt med prenumeration två') - "⨨": [T: "plus med fylld triangel"] # 0x2a28 (en: 'plus sign with black triangle', google: 'plus skylt med svart triangel') - - "⨩": [t: "minus med komma över"] # 0x2a29 (en: 'minus sign with comma above', MathPlayer: 'minustecken med komma över', google: 'minus tecken med komma ovan') - - "⨪": [t: "minus med punkt under"] # 0x2a2a (en: 'minus sign with dot below', MathPlayer: 'minustecken med punkt under', google: 'minus tecken med prick nedan') - - "⨫": [t: "minus med fallande punkter"] # 0x2a2b (en: 'minus sign with falling dots', google: 'minus tecken med fallande prickar') - - "⨬": [t: "minus med stigande prickar"] # 0x2a2c (en: 'minus sign with rising dots', google: 'minus tecken med stigande prickar') - - "⨭": [t: "plus i vänster halvcirkel"] # 0x2a2d (en: 'plus sign in left half circle', MathPlayer: 'plustecken i vänster halvcirkel', google: 'plus logga in vänster halva cirkeln') - - "⨮": [t: "plus i höger halvcirkel"] # 0x2a2e (en: 'plus sign in right half circle', MathPlayer: 'plustecken i höger halvcirkel', google: 'plus logga in höger halv cirkel') - - "⨯": [T: "kryssprodukt"] # 0x2a2f (en: 'cross product') - - "⨰": [t: "kryss med punkt över"] # 0x2a30 (en: 'multiplication sign with dot above') - - "⨱": [t: "kryss med horisontellt streck under"] # 0x2a31 (en: 'multiplication sign with underbar') - - "⨲": [t: "kryss med horisontellt streck direkt under"] # 0x2a32 (en: 'semidirect product with bottom closed', google: 'semidirect -produkt med botten stängd') + - "⨩": [T: "minus med komma över"] # 0x2a29 (en: 'minus sign with comma above', MathPlayer: 'minustecken med komma över', google: 'minus tecken med komma ovan') + - "⨪": [T: "minus med punkt under"] # 0x2a2a (en: 'minus sign with dot below', MathPlayer: 'minustecken med punkt under', google: 'minus tecken med prick nedan') + - "⨫": [T: "minus med fallande punkter"] # 0x2a2b (en: 'minus sign with falling dots', google: 'minus tecken med fallande prickar') + - "⨬": [T: "minus med stigande prickar"] # 0x2a2c (en: 'minus sign with rising dots', google: 'minus tecken med stigande prickar') + - "⨭": [T: "plus i vänster halvcirkel"] # 0x2a2d (en: 'plus sign in left half circle', MathPlayer: 'plustecken i vänster halvcirkel', google: 'plus logga in vänster halva cirkeln') + - "⨮": [T: "plus i höger halvcirkel"] # 0x2a2e (en: 'plus sign in right half circle', MathPlayer: 'plustecken i höger halvcirkel', google: 'plus logga in höger halv cirkel') + - "⨯": # 0x2a2f + - test: + if: "$Verbosity='Terse'" + then: [T: "kryss"] + else: [T: "kryssprodukt"] + - "⨰": [T: "kryss med punkt över"] # 0x2a30 (en: 'multiplication sign with dot above') + - "⨱": [T: "kryss med horisontellt streck under"] # 0x2a31 (en: 'multiplication sign with underbar') + - "⨲": [T: "kryss med horisontellt streck direkt under"] # 0x2a32 (en: 'semidirect product with bottom closed', google: 'semidirect -produkt med botten stängd') - "⨳": [T: "smash-produkt"] # 0x2a33 (en: 'smash product', MathPlayer: 'smash product', google: 'krossa produkten') - - "⨴": [t: "kryss i vänster halvcirkel"] # 0x2a34 (en: 'multiplication sign in left half circle') - - "⨵": [t: "kryss i höger halvcirkel"] # 0x2a35 (en: 'multiplication sign in right half circle') - - "⨶": [t: "kryss i cirkel med cirkumflex"] # 0x2a36 (en: 'circled multiplication sign with circumflex accent') - - "⨷": [t: "kryss i dubbel cirkel"] # 0x2a37 (en: 'multiplication sign in double circle') + - "⨴": [T: "kryss i vänster halvcirkel"] # 0x2a34 (en: 'multiplication sign in left half circle') + - "⨵": [T: "kryss i höger halvcirkel"] # 0x2a35 (en: 'multiplication sign in right half circle') + - "⨶": [T: "kryss i cirkel med cirkumflex"] # 0x2a36 (en: 'circled multiplication sign with circumflex accent') + - "⨷": [T: "kryss i dubbel cirkel"] # 0x2a37 (en: 'multiplication sign in double circle') - "⨸": [T: "division i cirkel"] # 0x2a38 - "⨹": [T: "plus i triangel"] # 0x2a39 (en: 'plus sign in triangle', MathPlayer: 'plustecken i triangel', google: 'plus inloggning av triangeln') - "⨺": [T: "minus i triangel"] # 0x2a3a (en: 'minus sign in triangle', MathPlayer: 'minustecken i triangel', google: 'minus logga in triangel') - - "⨻": [t: "kryss i triangel"] # 0x2a3b (en: 'multiplication sign in triangle') + - "⨻": [T: "kryss i triangel"] # 0x2a3b (en: 'multiplication sign in triangle') - "⨼": [T: "inre produkt"] # 0x2a3c (en: 'interior product', MathPlayer: 'interior product', google: 'interiörprodukt') - - "⨽": [t: "inversen av inre produkten"] # 0x2a3d (en: 'righthand interior product', google: 'högra interiörprodukt') + - "⨽": [T: "inversen av inre produkten"] # 0x2a3d (en: 'righthand interior product', google: 'högra interiörprodukt') + - "⨾": [T: "relationskomposition"] # 0x2a3e - "⨿": [T: "koprodukt"] # 0x2a3f (en: 'amalgamation or coproduct', MathPlayer: 'amalgamation or coproduct', google: 'amalgamation eller coprodukt') - - "⩀": [t: "snitt med punkt"] # 0x2a40 (en: 'intersection with dot') + - "⩀": [T: "snitt med punkt"] # 0x2a40 (en: 'intersection with dot') - "⩁": [T: "multi-mängds-subtraktion"] # 0x2a41 (en: 'union with minus sign', google: 'union med minus tecken') - "⩂": [T: "union med horisontellt streck över"] # 0x2a42 (en: 'union with overbar') - "⩃": [T: "snitt med horisontellt streck över"] # 0x2a43 (en: 'intersection with overbar') @@ -1987,7 +2016,7 @@ - "⩍": [T: "stängt snitt med serifer"] # 0x2a4d (en: 'closed intersection with serifs') - "⩎": [T: "dubbla snitt"] # 0x2a4e (en: 'double square intersection', google: 'korsning av dubbel kvadrat') - "⩏": [T: "dubbla unionen"] # 0x2a4f (en: 'double square union', google: 'double square union') - - "⩐": [t: "stängd union med serifer och smash-produkt"] # 0x2a50 (en: 'closed union with serifs and smash product') + - "⩐": [T: "stängd union med serifer och smash-produkt"] # 0x2a50 (en: 'closed union with serifs and smash product') - "⩑": [T: "och med prick över"] # 0x2a51 (en: 'logical and with dot above', google: 'logisk och med punkt ovan') - "⩒": [T: "eller med prick över"] # 0x2a52 (en: 'logical or with dot above', google: 'logisk eller med punkt ovan') - "⩓": [T: "dubbla och"] # 0x2a53 (en: 'double logical and') @@ -2007,8 +2036,8 @@ - "⩡": [T: "litet v med under-streck"] # 0x2a61 (en: 'small vee with underbar', google: 'liten vee med underbar') - "⩢": [T: "eller med dubbelt horisontellt streck över"] # 0x2a62 (en: 'logical or with double overbar', google: 'logisk eller med dubbel överbar') - "⩣": [T: "eller med dubbla under-streck"] # 0x2a63 (en: 'logical or with double underbar', google: 'logisk eller med dubbel underbar') - - "⩤": [t: "definitionsmängd z-notation"] # 0x2a64 (en: 'z notation domain antirestriction', google: 'z notation domain antirestriction') - - "⩥": [t: "värdemängd z-notation"] # 0x2a65 (en: 'z notation range antirestriction', google: 'z notation range antirestriction') + - "⩤": [T: "definitionsmängd z-notation"] # 0x2a64 (en: 'z notation domain antirestriction', google: 'z notation domain antirestriction') + - "⩥": [T: "värdemängd z-notation"] # 0x2a65 (en: 'z notation range antirestriction', google: 'z notation range antirestriction') - "⩦": [T: "lika med över punkt"] # 0x2a66 (en: 'equals sign with dot below') - "⩧": [T: "punkt över identisk med"] # 0x2a67 (en: 'identical with dot above', google: 'identisk med prick ovan') - "⩨": [T: "trippla horisontella streck med dubbla vertikala streck"] # 0x2a68 (en: 'triple horizontal bar with double vertical stroke', google: 'trippel horisontell stång med dubbel vertikal stroke') @@ -2046,8 +2075,8 @@ - "⪈": [T: "större än men inte lika med"] # 0x2a88 (en: 'greater than and single line not equal to', google: 'större än och enstaka linjer inte lika med') - "⪉": [T: "mindre än men inte ungefär lika med"] # 0x2a89 (en: 'less than and not approximate') - "⪊": [T: "större än men inte ungefär lika med"] # 0x2a8a (en: 'greater than and not approximate') - - "⪋": [t: "mindre än, lika med eller större än"] # 0x2a8b (en: 'less than above double line equal above greater than', google: 'mindre än över dubbel linje lika över större än') - - "⪌": [t: "större än, lika med eller mindre än"] # 0x2a8c (en: 'greater than above double line equal above less than', google: 'större än över dubbel linje lika över mindre än') + - "⪋": [T: "mindre än, lika med eller större än"] # 0x2a8b (en: 'less than above double line equal above greater than', google: 'mindre än över dubbel linje lika över större än') + - "⪌": [T: "större än, lika med eller mindre än"] # 0x2a8c (en: 'greater than above double line equal above less than', google: 'större än över dubbel linje lika över mindre än') - "⪍": [T: "mindre än eller asymptotiskt lika med"] # 0x2a8d (en: 'less than above similar or equal') - "⪎": [T: "större än eller asymptotiskt lika med"] # 0x2a8e (en: 'greater than above similar or equal') - "⪏": [T: "mindre än över tilde över större än"] # 0x2a8f (en: 'less than above similar above greater than') @@ -2106,14 +2135,14 @@ - "⫄": [T: "övermängd till eller lika med med punkt över"] # 0x2ac4 (en: 'superset of or equal to with dot above') - "⫅": [T: "delmängd av eller lika med"] # 0x2ac5 (en: 'subset of above equals sign', google: 'undergruppen ovan är lika med tecken') - "⫆": [T: "övermängd till eller lika med"] # 0x2ac6 (en: 'superset of above equals sign', google: 'superset av ovan är lika med tecken') - - "⫇": [t: "ungefärlig delmängd av"] # 0x2ac7 (en: 'subset of above tilde operator') - - "⫈": [t: "ungefärlig övermängd till"] # 0x2ac8 (en: 'superset of above tilde operator') + - "⫇": [T: "ungefärlig delmängd av"] # 0x2ac7 (en: 'subset of above tilde operator') + - "⫈": [T: "ungefärlig övermängd till"] # 0x2ac8 (en: 'superset of above tilde operator') - "⫉": [T: "delmängd av eller ungefär lika med"] # 0x2ac9 (en: 'subset of above almost equal to', google: 'delmängd över nästan lika med') - "⫊": [T: "övermängd till eller ungefär lika med"] # 0x2aca (en: 'superset of above almost equal to', google: 'superset över nästan lika med') - "⫋": [T: "delmängd av men inte lika med"] # 0x2acb (en: 'subset above not equal to', google: 'delmängd ovan inte lika med') - "⫌": [T: "övermängd till men inte lika med"] # 0x2acc (en: 'superset of above not equal to', google: 'superset av ovan inte lika med') - - "⫍": [t: "låda öppen åt höger"] # 0x2acd (en: 'square left open box operator', google: 'square left open box operator') - - "⫎": [t: "låda öppen åt vänster"] # 0x2ace (en: 'square right open box operator', google: 'square right open box operator') + - "⫍": [T: "låda öppen åt höger"] # 0x2acd (en: 'square left open box operator', google: 'square left open box operator') + - "⫎": [T: "låda öppen åt vänster"] # 0x2ace (en: 'square right open box operator', google: 'square right open box operator') - "⫏": [T: "sluten delmängd"] # 0x2acf (en: 'closed subset') - "⫐": [T: "sluten övermängd"] # 0x2ad0 (en: 'closed superset') - "⫑": [T: "sluten delmängd eller lika med"] # 0x2ad1 (en: 'closed subset or equal to') @@ -2123,7 +2152,7 @@ - "⫕": [T: "delmängd över delmängd"] # 0x2ad5 (en: 'subset above subset') - "⫖": [T: "övermängd över övermängd"] # 0x2ad6 (en: 'superset above superset') - "⫗": [T: "övermängd bredvid delmängd"] # 0x2ad7 (en: 'superset beside subset') - - "⫘": [t: "övermängd bredvid delmängd med horisontellt streck på mitten"] # 0x2ad8 (en: 'superset beside and joined by dash with subset') + - "⫘": [T: "övermängd bredvid delmängd med horisontellt streck på mitten"] # 0x2ad8 (en: 'superset beside and joined by dash with subset') - "⫙": [T: "tillhör med öppning nedåt"] # 0x2ad9 (en: 'element of opening downwards') - "⫚": [T: "äkta snittet av med t överst"] # 0x2ada (en: 'pitchfork with tee top') - "⫛": [T: "tvärgående snitt"] # 0x2adb (en: 'transversal intersection') @@ -2272,7 +2301,7 @@ - "⸓": [T: "prickad obelus"] # 0x2e13 (en: 'dotted obelos', google translation) - "⸔": [T: "nedåt ancora"] # 0x2e14 (en: 'downwards ancora', google translation) - "⸕": [T: "uppåt ancora"] # 0x2e15 (en: 'upwards ancora', google translation) - - "⸖": [t: "höger pekvinkel med prickar"] # 0x2e16 (en: 'dotted right pointing angle', google translation) + - "⸖": [T: "höger pekvinkel med prickar"] # 0x2e16 (en: 'dotted right pointing angle', google translation) - "⸗": [T: "dubbelt snett bindestreck"] # 0x2e17 (en: 'double oblique hyphen', google translation) - "⸘": [T: "omvänd interrobang"] # 0x2e18 (en: 'inverted interrobang', google translation) - "⸙": [T: "palm-gren"] # 0x2e19 (google translation) @@ -2372,7 +2401,7 @@ - "㋌": [T: "kvicksilver"] # 0x32cc (en: 'mercury', google translation) - "㋍": [T: "erg"] # 0x32cd (google translation) - "㋎": [T: "elektron-volt"] # 0x32ce (en: 'electron volts', google translation) - - "㋏": [t: "begränsat ansvar"] # 0x32cf (en: 'limited liability sign', google translation) + - "㋏": [T: "begränsat ansvar"] # 0x32cf (en: 'limited liability sign', google translation) - "㍱": [T: "hektopascal"] # 0x3371 (en: 'hectopascals', google translation) - "㍲": [T: "dalton"] # 0x3372 (google translation) - "㍳": [T: "astronomiska enheter"] # 0x3373 (en: 'astronomical units', google translation) @@ -2382,7 +2411,7 @@ - "㍷": [T: "decimeter"] # 0x3377 (en: 'decimeters', google translation) - "㍸": [T: "kvadratdecimeter"] # 0x3378 (en: 'decimeters squared', google translation) - "㍹": [T: "kubikdecimeter"] # 0x3379 (en: 'decimeters cubed', google translation) - - "㍺": [t: "internationella enheter"] # 0x337a (en: 'instrumental units', google translation) + - "㍺": [T: "internationella enheter"] # 0x337a (en: 'instrumental units', google translation) - "㎀": [T: "picoampere"] # 0x3380 (google translation) - "㎁": [T: "nanoampere"] # 0x3381 (google translation) - "㎂": [T: "mikroampere"] # 0x3382 (google translation) @@ -2480,570 +2509,582 @@ - "㏞": [T: "volt per meter"] # 0x33de (en: 'volts per meter', google translation) - "㏟": [T: "ampere per meter"] # 0x33df (google translation) - "㏿": [T: "gallon"] # 0x33ff (en: 'gallons', google translation) - - "": [t: "lika med över hatt"] # 0xe900 (en: 'equals with hat below', google translation) - - "": [t: "lika med med plus"] # 0xe901 (en: 'equals with plus above', google translation) - - "": [t: "lika med över plus"] # 0xe902 (en: 'equals with plus below', google translation) - - "": [t: "tilde med plus"] # 0xe903 (en: 'tilde with plus above', google translation) - - "": [t: "tilde över plus"] # 0xe904 (en: 'tilde with plus below', google translation) - - "": [t: "dubbel lika med över större än"] # 0xe908 (en: 'equal double over greater than', google translation) - - "": [t: "dubbel lika med över mindre än"] # 0xe909 (en: 'equal double over less than', google translation) - - "": [t: "innehåller eller lika med"] # 0xe90a (en: 'contains or equal to', google translation) - - "": [t: "övermängd till eller lika med"] # 0xe90b (en: 'superset of or equal to', google translation) - - "": [t: "delmängd av eller lika med"] # 0xe90c (en: 'subset of or equal to', google translation) - - "": [t: "lika med eller mindre än"] # 0xe90d (en: 'equal over less than', google translation) - - "": [t: "tillhör eller lika med"] # 0xe912 (en: 'element of or equal to', google translation) - - "": [t: "lika med eller större än"] # 0xe913 (en: 'equal to or greater than', google translation) - - "": [t: "ungefärlig övermängd till"] # 0xe914 (en: 'approximate superset of', google translation) - - "": [t: "ungefärlig delmängd av"] # 0xe915 (en: 'approximate subset of', google translation) - - "": [t: "övermängd till med punkt inkluderar som underrelation"] # 0xe916 (en: 'superset of with dot includes as sub relation', google translation) - - "": [t: "delmängd av med punkt inkluderas i som underrelation"] # 0xe917 (en: 'subset of with dot is included in as sub relation', google translation) - - "": [t: "lika med över punkt"] # 0xe918 (en: 'equal with dot below', google translation) - - "": [t: "vänster punkt över minus över höger punkt"] # 0xe919 (en: 'left dot over minus over right dot', google translation) - - "": [t: "höger punkt över minus över vänster punkt"] # 0xe91a (en: 'right dot over minus over left dot', google translation) - - "": [t: "nästan lika med minus"] # 0xe91f (en: 'almost equal to minus', google translation) - - "": [t: "dubbel fyrkantig union"] # 0xe920 (en: 'double square cup', google translation) - - "": [t: "dubbel fyrkantig snitt"] # 0xe921 (en: 'double square cap', google translation) - - "": [t: "mindre än lika med eller större än"] # 0xe922 (en: 'less than equal to or greater than', google translation) - - "": [t: "tilde med prick"] # 0xe924 (en: 'tilde with dot', google translation) - - "": [t: "tilde med två prickar"] # 0xe925 (en: 'tilde with two dots', google translation) - - "": [t: "mindre än större än eller lika med"] # 0xe926 (en: 'less than greater than or equal to', google translation) - - "": [t: "större än mindre än eller lika med"] # 0xe927 (en: 'greater than less than or equal to', google translation) - - "": [t: "ekvivalent med eller mindre än"] # 0xe928 (en: 'equivalent to or less than', google translation) - - "": [t: "ekvivalent med eller större än"] # 0xe929 (en: 'equivalent to or greater than', google translation) - - "": [t: "låda öppning vänster"] # 0xe92a (en: 'left open box operator', google translation) - - "": [t: "låda öppen höger"] # 0xe92b (en: 'right open box operator', google translation) - - "": [t: "identisk med med prick"] # 0xe92c (en: 'identical to with dot', google translation) - - "": [t: "större än lika med eller mindre än"] # 0xe92d (en: 'greater than equal to or less than', google translation) - - "": [t: "streck"] # 0xe92e (en: 'bar operator', google translation) - - "": [t: "dubbel-streck"] # 0xe92f (en: 'double bar operator', google translation) - - "": [t: "trippel-streck"] # 0xe930 (google translation) - - "": [t: "mindre än eller ungefär lika med"] # 0xe932 (en: 'less than or approximately equal to', google translation) - - "": [t: "större än eller ungefär lika med"] # 0xe933 (en: 'greater than or approximately equal to', google translation) - - "": [t: "mycket mindre än"] # 0xe936 (en: 'nested less than', google translation) - - "": [t: "mycket större än"] # 0xe937 (en: 'nested greater than', google translation) - - "": [t: "föregår eller ekvivalent med"] # 0xe93a (en: 'precedes or equivalent to', google translation) - - "": [t: "följer eller ekvivalent med"] # 0xe93b (en: 'succeeds or equivalent to', google translation) - - "": [t: "föregår eller lika med"] # 0xe940 (en: 'precedes over equal', google translation) - - "": [t: "följer eller lika med"] # 0xe941 (en: 'succeeds over equal', google translation) - - "": [t: "mindre än eller lika med"] # 0xe942 (en: 'less equal slanted greater', google translation) - - "": [t: "större än eller lika med"] # 0xe943 (en: 'greater equal slanted less', google translation) - - "": [t: "uppfylls av"] # 0xe948 (en: 'satisfied by', google translation) - - "": [t: "långdraget s"] # 0xe949 (en: 'lazy s', google translation) - - "": [t: "inte påstående"] # 0xe94a (en: 'not assertion', google translation) - - "": [t: "dubbel lika med"] # 0xe94b (en: 'double equal', google translation) - - "": [t: "trippel lika med"] # 0xe94c (en: 'triple equal', google translation) - - "": [t: "regel försenad"] # 0xe94d (en: 'rule delayed', google translation) - - "": [t: "alias avgränsare"] # 0xe94e (en: 'alias delimiter', google translation) - - "": [t: "normal undergrupp till med streck"] # 0xe950 (en: 'normal subgroup of with bar', google translation) - - "": [t: "innehåller som normal undergrupp med streck"] # 0xe951 (en: 'contains as normal subgroup with bar', google translation) - - "": [t: "rund implicerar"] # 0xe954 (en: 'round implies', google translation) - - "": [t: "leende under streck"] # 0xe955 (en: 'smile under bar', google translation) - - "": [t: "rynkad panna över streck"] # 0xe956 (en: 'frown over bar', google translation) - - "": [t: "övermängd till eller nästan lika med"] # 0xe957 (en: 'superset of or almost equal to', google translation) - - "": [t: "delmängd av eller nästan lika med"] # 0xe958 (en: 'subset of or almost equal to', google translation) - - "": [t: "större än nästan lika med eller mindre än"] # 0xe959 (en: 'greater than almost equal to or less than', google translation) - - "": [t: "mindre än nästan lika eller större än"] # 0xe95a (en: 'less than almost equal or greater than', google translation) - - "": [t: "dubbelt eller"] # 0xe95c (en: 'double logical or', google translation) - - "": [t: "dubbelt och"] # 0xe95d (en: 'double logical and', google translation) - - "": [t: "eller med dubbla streck under"] # 0xe95e (en: 'logical or with double bar below', google translation) - - "": [t: "eller med streck under"] # 0xe95f (en: 'logical or with bar below', google translation) - - "": [t: "ungefär lika med"] # 0xe962 (en: 'almost equal over equal', google translation) - - "": [t: "vänster triangel med mittstreck"] # 0xe964 (en: 'left pointing triangle with bisecting bar', google translation) - - "": [t: "höger triangel med mittstreck"] # 0xe965 (en: 'right pointing triangle with bisecting bar', google translation) - - "": [t: "lika med med prickad övre linje"] # 0xe966 (en: 'equals with dotted top line', google translation) - - "": [t: "föregår med kolon"] # 0xe967 (en: 'precedes with colon', google translation) - - "": [t: "följer med kolon"] # 0xe968 (en: 'succeeds with colon', google translation) - - "": [t: "mindre än eller lika med"] # 0xe969 (en: 'smaller than or equal slanted', google translation) - - "": [t: "större än eller lika med"] # 0xe96a (en: 'larger than or equal slanted', google translation) - - "": [t: "väldigt mycket mindre än"] # 0xe96b (en: 'nested very much less than', google translation) - - "": [t: "väldigt mycket större än"] # 0xe96c (en: 'nested very much greater than', google translation) - - "": [t: "skillnad mellan"] # 0xe96d (en: 'difference between variant', google translation) - - "": [t: "mindre än som överlppar med större än"] # 0xe96e (en: 'less than greater than overlay', google translation) - - "": [t: "eller som överlappar med och"] # 0xe96f (en: 'logical or logical and overlay', google translation) - - "": [t: "övermängd över övermängd"] # 0xe970 (google translation) - - "": [t: "delmängd över delmängd"] # 0xe971 (en: 'subset over subset', google translation) - - "": [t: "övermängd över delmängd"] # 0xe972 (en: 'superset over subset', google translation) - - "": [t: "delmängd över övermängd"] # 0xe973 (en: 'subset over superset', google translation) - - "": [t: "trippla vertikala streck"] # 0xe979 (google translation) - - "": [t: "kvadrupla vertikala punkter i par"] # 0xe97a (en: 'paired quadruple vertical dots', google translation) - - "": [t: "vinkelrät över streck"] # 0xe97b (en: 'perpendicular over bar', google translation) - - "": [t: "spegelvänt vändkors med dubbelt vertikalt streck"] # 0xe97c (en: 'left turnstile double vertical bar', google translation) - - "": [t: "dubbelt spegelvänt vändkors"] # 0xe97d (en: 'double left turnstile double vertical bar', google translation) - - "": [t: "vinkelrät över roterat vinkelrät"] # 0xe97e (en: 'perpendicular over inverted perpendicular', google translation) - - "": [t: "dubbelt vänster vändkors med vertikalt streck"] # 0xe97f (en: 'double left turnstile vertical bar', google translation) - - "": [t: "sfärisk vinkel uppåt"] # 0xe980 (en: 'spherical angle opening up', google translation) - - "": [t: "dubbelt snedstreck"] # 0xe981 (en: 'double slash', google translation) - - "": [t: "rät vinkel med hörn"] # 0xe982 (en: 'right angle with corner', google translation) - - "": [t: "cirkel med vertikalt streck"] # 0xe984 (google translation) - - "": [t: "cirkel med division"] # 0xe985 (google translation) - - "": [t: "streckat snedstreck"] # 0xe986 (en: 'dashed solidus', google translation) - - "": [t: "streckat omvänt snedstreck"] # 0xe987 (en: 'dashed backslash', google translation) - - "": [t: "streckad mittlinje"] # 0xe988 (en: 'dashed mid line', google translation) - - "": [t: "streckad vertikalt streck"] # 0xe989 (en: 'dashed vertical bar', google translation) - - "": [t: "vinkelrät med s"] # 0xe98a (en: 'perpendicular with s', google translation) - - "": [t: "vinkel med s"] # 0xe98b (en: 'angle with s', google translation) - - "": [t: "sfärisk vinkel åt vänster"] # 0xe98c (en: 'spherical angle opening left', google translation) - - "": [t: "vinkel åt vänster"] # 0xe98d (en: 'angle opening left', google translation) - - "": [t: "vertikalt streck med dubbel krok"] # 0xe98e (en: 'vertical bar with double hook', google translation) - - "": [t: "medium punkt-operator fri radikal"] # 0xe98f (google translation) - - "": [t: "uppåt-triangel vid över streck"] # 0xe990 (en: 'white up pointing triangle above bar', google translation) - - "": [t: "identisk och parallell med"] # 0xe991 (en: 'identical and parallel to', google translation) - - "": [t: "smash-produkt"] # 0xe992 (en: 'smash product', google translation) - - "": [t: "trippla vertikala streck med horisontella streck"] # 0xe993 (en: 'triple bar operator with horizontal bar', google translation) - - "": [t: "identisk med med dubbla snedstreck"] # 0xe994 (en: 'identical to with double slash', google translation) - - "": [t: "trippla korsade streck"] # 0xe995 (en: 'triple crossed bars', google translation) - - "": [t: "cirkel med vertikalt streck"] # 0xe996 (en: 'vertical bar over circle', google translation) - - "": [t: "vertikal proportionell mot"] # 0xe997 (en: 'vertical proportional to', google translation) - - "": [t: "måne i nedan"] # 0xe998 (en: 'black last quarter moon', google translation) - - "": [t: "nymåne"] # 0xe999 (google translation) - - "": [t: "negativ sinusvåg"] # 0xe9a0 (en: 'negative sine wave', google translation) - - "": [t: "punkt inom parentes"] # 0xe9a1 (en: 'parenthesized dot', google translation) - - "": [t: "parenteser"] # 0xe9a2 (en: 'parens', google translation) - - "": [t: "vitt leende"] # 0xe9a3 (en: 'white smile', google translation) - - "": [t: "vit rynkad panna"] # 0xe9a4 (en: 'white frown', google translation) - - "": [t: "sexhörning"] # 0xe9a5 (en: 'hexagon', google translation) - - "": [t: "ekvivalent med över plus"] # 0xe9a6 (en: 'equivalent to over plus', google translation) - - "": [t: "plus över ekvivalent med"] # 0xe9a7 (en: 'plus over equivalent to', google translation) - - "": [t: "snittet"] # 0xe9b0 (en: 'intersection serifs', google translation) - - "": [t: "unionen"] # 0xe9b1 (google translation) - - "": [t: "snittet"] # 0xe9b2 (en: 'square intersection serifs', google translation) - - "": [t: "unionen"] # 0xe9b3 (google translation) - - "": [t: "föregår ekvivalent med eller följer"] # 0xe9e0 (en: 'precedes equivalent to or succeeds', google translation) - - "": [t: "följer ekvivalent med eller föregår"] # 0xe9e1 (en: 'succeeds equivalent to or precedes', google translation) - - "": [t: "föregår nästan lika med eller lyckas"] # 0xe9e2 (en: 'precedes almost equal to or succeeds', google translation) - - "": [t: "lyckas nästan lika med eller föregås"] # 0xe9e3 (en: 'succeeds almost equal to or precedes', google translation) - - "": [t: "mindre än motsvarande eller större än"] # 0xe9f0 (en: 'less than equivalent to or greater than', google translation) - - "": [t: "större än motsvarande eller mindre än"] # 0xe9f1 (en: 'greater than equivalent to or less than', google translation) - - "": [t: "inte mycket mindre än"] # 0xea00 (en: 'not vert much less than', google translation) - - "": [t: "inte mycket större än"] # 0xea01 (en: 'not vert much greater than', google translation) - - "": [t: "inte mycket mindre än"] # 0xea02 (en: 'not much less than variant', google translation) - - "": [t: "inte mycket större än"] # 0xea03 (en: 'not much greater than variant', google translation) - - "": [t: "mindre än dubbla lika med"] # 0xea04 (en: 'less vert not double equals', google translation) - - "": [t: "större än dubbla lika med"] # 0xea05 (en: 'gt vert not double equals', google translation) - - "": [t: "inte mindre än eller lika med"] # 0xea06 (en: 'not less than or equal to', google translation) - - "": [t: "inte större än eller lika med"] # 0xea07 (en: 'not greater than or equal to', google translation) - - "": [t: "varken lika med eller mindre än"] # 0xea09 (en: 'neither equal to nor less than', google translation) - - "": [t: "innehåller inte eller lika med"] # 0xea0a (en: 'does not contain or equal to', google translation) - - "": [t: "varken övermängd till eller lika med"] # 0xea0b (en: 'neither superset of nor equal to', google translation) - - "": [t: "varken delmängd av eller lika med"] # 0xea0c (en: 'neither subset of nor equal to', google translation) - - "": [t: "omvänt snedstreck delmängd"] # 0xea0d (en: 'reverse solidus subset', google translation) - - "": [t: "varken lika med eller större än"] # 0xea0e (en: 'neither equal to nor greater than', google translation) - - "": [t: "inte minus tilde"] # 0xea0f (en: 'not minus tilde operator', google translation) - - "": [t: "varken lika med eller mindre än"] # 0xea10 (en: 'neither equal to nor less than', google translation) - - "": [t: "inte tilde"] # 0xea11 (en: 'not tilde operator', google translation) - - "": [t: "inte tillhör eller lika med"] # 0xea12 (en: 'not element of or equal to', google translation) - - "": [t: "varken lika med eller större än"] # 0xea13 (en: 'neither equal to nor greater than', google translation) - - "": [t: "inte ungefär lika med"] # 0xea14 (en: 'not almost equal', google translation) - - "": [t: "inte följer ungefär lika med"] # 0xea15 (en: 'not succeeds similar', google translation) - - "": [t: "mindre än eller lika med med snedstreck"] # 0xea16 (en: 'less than or slanted equal to with slash', google translation) - - "": [t: "större än eller lika med med snedstreck"] # 0xea17 (en: 'greater than or slanted equal to with slash', google translation) - - "": [t: "övermängd snedstreck"] # 0xea1a (google translation) - - "": [t: "innehåller inte"] # 0xea1b (en: 'does not contain', google translation) - - "": [t: "inte mindre än eller lika med"] # 0xea1d (en: 'not less than or equal to', google translation) - - "": [t: "inte större än eller lika med"] # 0xea1e (en: 'not greater than or equal to', google translation) - - "": [t: "inte nästan lika med minus"] # 0xea1f (en: 'not almost equal to minus', google translation) - - "": [t: "tillhör inte set med punkt"] # 0xea22 (en: 'negated set membership dot above', google translation) - - "": [t: "inte rät vinkel"] # 0xea2c (en: 'not vert angle', google translation) - - "": [t: "inte parallell"] # 0xea2d (en: 'not parallel slanted', google translation) - - "": [t: "inte streck"] # 0xea2e (en: 'not bar operator', google translation) - - "": [t: "inte dubbelt streck"] # 0xea2f (en: 'not double bar operator', google translation) - - "": [t: "inte trippelt streck"] # 0xea30 (en: 'not triple bar operator', google translation) - - "": [t: "mindre än men inte ungefär lika med"] # 0xea32 (en: 'less than but not approximately equal to', google translation) - - "": [t: "större än men inte ungefär lika med"] # 0xea33 (en: 'greater than but not approximately equal to', google translation) - - "": [t: "mindre än eller inte lika med"] # 0xea34 (en: 'less than or not equal to', google translation) - - "": [t: "större än eller inte lika med"] # 0xea35 (en: 'greater than or not equal to', google translation) - - "": [t: "inte mycket mindre än"] # 0xea36 (en: 'not nested less than', google translation) - - "": [t: "inte mycket större än"] # 0xea37 (en: 'not nested greater than', google translation) - - "": [t: "inte mycket mindre än"] # 0xea38 (en: 'not much less than', google translation) - - "": [t: "inte mycket större än"] # 0xea39 (en: 'not much greater than', google translation) - - "": [t: "föregår men inte ekvivalent med"] # 0xea3a (en: 'precedes but not equivalent to', google translation) - - "": [t: "följer men inte ekvivalent med"] # 0xea3b (en: 'succeeds but not equivalent to', google translation) - - "": [t: "föregår men inte lika med"] # 0xea3c (en: 'precedes but not equal to', google translation) - - "": [t: "följer men inte lika med"] # 0xea3d (en: 'succeeds but not equal to', google translation) - - "": [t: "inte lika eller föregår"] # 0xea3e (en: 'does not equal or precede', google translation) - - "": [t: "inte lika eller följer"] # 0xea3f (en: 'does not equal or succeed', google translation) - - "": [t: "föregår men inte lika med"] # 0xea40 (en: 'precedes but not equal to', google translation) - - "": [t: "följer men inte lika med"] # 0xea41 (en: 'succeeds but not equal to', google translation) - - "": [t: "inte delmängd av eller lika med"] # 0xea42 (en: 'not subset of nor equal to', google translation) - - "": [t: "inte övermängd till eller lika med"] # 0xea43 (en: 'not superset of nor equal to', google translation) - - "": [t: "delmängd av eller inte lika med"] # 0xea44 (en: 'subset of or not equal to', google translation) - - "": [t: "övermängd till eller inte lika med"] # 0xea45 (en: 'superset of or not equal to', google translation) - - "": [t: "inte delmängd av eller lika med"] # 0xea46 (en: 'not subset of nor equal to', google translation) - - "": [t: "inte övermängd till eller lika med"] # 0xea47 (en: 'not superset of nor equal to', google translation) - - "": [t: "inte väldigt mycket mindre än"] # 0xea48 (en: 'not triple less than', google translation) - - "": [t: "inte väldigt mycket större än"] # 0xea49 (en: 'not triple greater than', google translation) - - "": [t: "inte föregår lika med"] # 0xea4c (en: 'not precedes equals', google translation) - - "": [t: "inte följer lika med"] # 0xea4d (en: 'not succeeds equals', google translation) - - "": [t: "inte normal undergrupp av med streck"] # 0xea50 (en: 'not normal subgroup of with bar', google translation) - - "": [t: "innehåller inte som normal undergrupp med streck"] # 0xea51 (en: 'does not contain as normal subgroup with bar', google translation) - - "": [t: "inte differensen"] # 0xea52 (en: 'not difference between', google translation) - - "": [t: "inte geometriskt ekvivalent med"] # 0xea53 (en: 'not geometrically equivalent to', google translation) - - "": [t: "inte vertikalvinkel ungefär lika med"] # 0xea54 (en: 'not vert similar', google translation) - - "": [t: "inte lika med eller ungefär lika med"] # 0xea55 (en: 'not equal or similar', google translation) - - "": [t: "inte vertikalvinkel ungefär lika med"] # 0xea56 (en: 'not vert approximate', google translation) - - "": [t: "inte ungefär identiskt med"] # 0xea57 (en: 'not approximately identical to', google translation) - - "": [t: "inte differensen mellan"] # 0xea58 (en: 'not bumpy equals', google translation) - - "": [t: "inte differensen mellan"] # 0xea59 (en: 'not bumpy single equals', google translation) - - "": [t: "inte lika med med punkt"] # 0xea5a (en: 'not equal dot', google translation) - - "": [t: "spegelvänd inte ekvivalent med"] # 0xea5b (en: 'reverse not equivalent', google translation) - - "": [t: "inte delmängd"] # 0xea60 (en: 'not square subset', google translation) - - "": [t: "inte övermängd"] # 0xea61 (en: 'not square superset', google translation) - - "": [t: "inte ungefär lika med över lika med"] # 0xea62 (en: 'not almost equal over equal', google translation) - - "": [t: "inte strikt ekvivalent med"] # 0xea63 (en: 'not strictly equivalent to', google translation) - - "": [t: "inte kongruent med punkt"] # 0xea64 (en: 'not congruent dot', google translation) - - "": [t: "spegelvänd inte lika med"] # 0xea65 (en: 'reverse not equal', google translation) - - "": [t: "inte vertikalvinkel vänster triangel lika med"] # 0xea70 (en: 'not vert left triangle equals', google translation) - - "": [t: "inte vertikalvinkel höger triangel lika med"] # 0xea71 (en: 'not vert right triangle equals', google translation) - - "": [t: "inte partiell"] # 0xea80 (en: 'not partial', google translation) - - "": [t: "pil förlängare"] # 0xeb00 (en: 'arrow embellishment extender', google translation) - - "": [t: "höger-pil över vänster-pil"] # 0xeb01 (en: 'arrow rightwards over arrow leftwards', google translation) - - "": [t: "höger-pil över vänster-pil"] # 0xeb02 (en: 'arrow rightwards over arrow leftwards', google translation) - - "": [t: "höger harpun över vänster harpun"] # 0xeb03 (en: 'harpoon right over harpoon left', google translation) - - "": [t: "höger harpun över vänster harpun"] # 0xeb04 (en: 'harpoon right over harpoon left', google translation) - - "": [t: "dubbel-riktad pil nord-väst syd-ost"] # 0xeb05 (en: 'double arrow northeast southwest', google translation) - - "": [t: "dubbel-riktad pil nord-väst syd-ost"] # 0xeb06 (en: 'double arrow northwest southeast', google translation) - - "": [t: "horisontell harpun förlängare"] # 0xeb07 (en: 'horizontal harpoon extender', google translation) - - "": [t: "vänster-pil i båge moturs"] # 0xeb08 (en: 'anticlockwise arc leftwards arrow', google translation) - - "": [t: "höger-pil i båge moturs"] # 0xeb09 (en: 'anticlockwise arc rightwards arrow', google translation) - - "": [t: "stor höger-pil"] # 0xeb0b (en: 'large rightwards arrow accent', google translation) - - "": [t: "stor vänster-pil"] # 0xeb0c (en: 'large leftwards arrow accent', google translation) - - "": [t: "vänster pil-spets"] # 0xeb0d (en: 'leftwards arrowhead', google translation) - - "": [t: "höger pil-spets"] # 0xeb0e (en: 'rightwards arrowhead', google translation) - - "": [t: "stor dubbel-riktad pil med streck"] # 0xeb0f (en: 'large left right arrow with stroke', google translation) - - "": [t: "dubbel-riktad pil förlängare"] # 0xeb10 (en: 'horizontal double arrow extender', google translation) - - "": [t: "stor dubbel-riktad pil med streck"] # 0xeb11 (en: 'large left right double arrow with stroke', google translation) - - "": [t: "nedåt-pil till vänster om uppåt-pil"] # 0xeb12 (en: 'downwards arrow leftwards of upwards arrow', google translation) - - "": [t: "vänster-pil med hörn nedåt"] # 0xeb13 (en: 'leftwards arrow with corner downwards', google translation) - - "": [t: "höger-pil med hörn uppåt"] # 0xeb14 (en: 'rightwards arrow with corner upwards', google translation) - - "": [t: "vänster-pil med hörn uppåt"] # 0xeb15 (en: 'leftwards arrow with corner upwards', google translation) - - "": [t: "moturs pil övre halv-cirkel med plus"] # 0xeb16 (en: 'anticlockwise top semicircle arrow with plus', google translation) - - "": [t: "medurs pil övre halv-cirkel med minus"] # 0xeb17 (en: 'clockwise top semicircle arrow with minus', google translation) - - "": [t: "höger-pil med streck och svans"] # 0xeb18 (en: 'rightwards arrow with tail with stroke', google translation) - - "": [t: "höger harpun hulling nedåt"] # 0xeb19 (en: 'right harpoon down', google translation) - - "": [t: "vänster harpun hulling nedåt"] # 0xeb1a (en: 'left harpoon down', google translation) - - "": [t: "dubbel-riktad harpun hullingar nedåt"] # 0xeb1b (en: 'left right harpoon down', google translation) - - "": [t: "dubbel-riktad harpun hullingar uppåt"] # 0xeb1c (en: 'left right harpoon up', google translation) - - "": [t: "dubbel-riktad vertikal harpun hullingar vänster"] # 0xeb1d (en: 'up down harpoon left', google translation) - - "": [t: "dubbel-riktad vertikal harpun hullingar höger"] # 0xeb1e (en: 'up down harpoon right', google translation) - - "": [t: "nedåt-pil till vänster om uppåt-pil"] # 0xeb1f (en: 'upwards arrow to the right of downwards arrow', google translation) - - "": [t: "vänster harpun mot streck hulling uppåt"] # 0xeb20 (en: 'leftwards harpoon to bar with barb upwards', google translation) - - "": [t: "höger harpun mot streck hulling uppåt"] # 0xeb21 (en: 'rightwards harpoon to bar with barb upwards', google translation) - - "": [t: "vänster harpun mot streck hulling nedåt"] # 0xeb22 (en: 'leftwards harpoon to bar with barb downwards', google translation) - - "": [t: "höger harpun mot streck hulling nedåt"] # 0xeb23 (en: 'rightwards harpoon to bar with barb downwards', google translation) - - "": [t: "vänster harpun från streck hulling uppåt"] # 0xeb24 (en: 'leftwards harpoon from bar with barb upwards', google translation) - - "": [t: "höger harpun från streck hulling uppåt"] # 0xeb25 (en: 'rightwards harpoon from bar with barb upwards', google translation) - - "": [t: "vänster harpun från streck hulling nedåt"] # 0xeb26 (en: 'leftwards harpoon from bar with barb downwards', google translation) - - "": [t: "höger harpun från streck hulling nedåt"] # 0xeb27 (en: 'rightwards harpoon from bar with barb downwards', google translation) - - "": [t: "uppåt harpun mot streck hulling vänster"] # 0xeb28 (en: 'upwards harpoon to bar with barb leftwards', google translation) - - "": [t: "nedåt harpun mot streck hulling vänster"] # 0xeb29 (en: 'downwards harpoon to bar with barb leftwards', google translation) - - "": [t: "uppåt harpun mot streck hulling höger"] # 0xeb2a (en: 'upwards harpoon to bar with barb rightwards', google translation) - - "": [t: "nedåt harpun mot streck hulling höger"] # 0xeb2b (en: 'downwards harpoon to bar with barb rightwards', google translation) - - "": [t: "uppåt harpun från streck hulling vänster"] # 0xeb2c (en: 'upwards harpoon from bar with barb leftwards', google translation) - - "": [t: "nedåt harpun från streck hulling vänster"] # 0xeb2d (en: 'downwards harpoon from bar with barb leftwards', google translation) - - "": [t: "uppåt harpun från streck hulling höger"] # 0xeb2e (en: 'upwards harpoon from bar with barb rightwards', google translation) - - "": [t: "nedåt harpun från streck hulling höger"] # 0xeb2f (en: 'downwards harpoon from bar with barb rightwards', google translation) - - "": [t: "uppåt-pil mot streck"] # 0xeb30 (en: 'upwards arrow to bar', google translation) - - "": [t: "nedåt-pil mot streck"] # 0xeb31 (en: 'downwards arrow to bar', google translation) - - "": [t: "uppåt harpun till vänster om nedåt harpun"] # 0xeb32 (en: 'upwards harpoon to the left of downwards harpoon', google translation) - - "": [t: "uppåt harpun till höger om nedåt harpun"] # 0xeb33 (en: 'upwards harpoon to the right of downwards harpoon', google translation) - - "": [t: "uppåt pilspets"] # 0xeb34 (en: 'upwards arrowhead', google translation) - - "": [t: "nedåt pilspets"] # 0xeb35 (en: 'downwards arrowhead', google translation) - - "": [t: "dubbel harpun vänster hulling nedåt höger hulling uppåt"] # 0xeb36 (en: 'double harpoon with leftwards barb down rightwards barb up', google translation) - - "": [t: "dubbel harpun vänster hulling uppåt höger hulling nedåt"] # 0xeb37 (en: 'double harpoon with leftwards barb up rightwards barb down', google translation) - - "": [t: "vänster-pil över strecl"] # 0xeb38 (en: 'leftwards arrow over bar', google translation) - - "": [t: "höger-pil över streck"] # 0xeb39 (en: 'rightwards arrow over bar', google translation) - - "": [t: "vänster-pil under streck"] # 0xeb3a (en: 'leftwards arrow under bar', google translation) - - "": [t: "höger-pil under streck"] # 0xeb3b (en: 'rightwards arrow under bar', google translation) - - "": [t: "trippel dubbel-riktad pil"] # 0xeb3c (en: 'left right triple arrow', google translation) - - "": [t: "dubbel-pil nord-ost syd-ost"] # 0xeb3f (en: 'double arrow northeast southeast', google translation) - - "": [t: "moturs pil i halvcircel åt vänster"] # 0xeb40 (en: 'anticlockwise left semicircle arrow', google translation) - - "": [t: "medurs pil i halvcirkel åt vänster"] # 0xeb41 (en: 'clockwise left semicircle arrow', google translation) - - "": [t: "dubbel-riktad pil i vänster öppen cirkel"] # 0xeb42 (en: 'left open circle left right arrow', google translation) - - "": [t: "höger-pil över tilde"] # 0xeb44 (en: 'rightwards arrow over tilde', google translation) - - "": [t: "vänster-pil över tilde"] # 0xeb45 (en: 'leftwards arrow over tilde', google translation) - - "": [t: "vänster harpun över streck"] # 0xeb48 (en: 'leftwards harpoon over bar', google translation) - - "": [t: "höger harpun över streck"] # 0xeb49 (en: 'rightwards harpoon over bar', google translation) - - "": [t: "vänster harpun under streck"] # 0xeb4a (en: 'leftwards harpoon under bar', google translation) - - "": [t: "höger harpun under streck"] # 0xeb4b (en: 'rightwards harpoon under bar', google translation) - - "": [t: "ihoptryckt vänster-pil"] # 0xeb4c (en: 'squat black leftwards arrow', google translation) - - "": [t: "medurs höger halvcirkel-pil"] # 0xeb50 (en: 'clockwise right semicircle arrow', google translation) - - "": [t: "moturs höger halvcirkel-pil"] # 0xeb51 (en: 'anticlockwise right semicircle arrow', google translation) - - "": [t: "dubbel-riktad pil i vänster öppen cirkel"] # 0xeb52 (en: 'left open circle left right harpoon', google translation) - - "": [t: "uppåt-pil till vänster om vertikalt streck"] # 0xeb58 (en: 'upwards arrow leftwards of vertical bar', google translation) - - "": [t: "nedåt-pil till vänster om vertikalt streck"] # 0xeb59 (en: 'downwards arrow leftwards of vertical bar', google translation) - - "": [t: "uppåt-pil till höger om vertikalt streck"] # 0xeb5a (en: 'upwards arrow rightwards of vertical bar', google translation) - - "": [t: "uppåt-pil till höger om vertikalt streck"] # 0xeb5b (en: 'downwards arrow rightwards of vertical bar', google translation) - - "": [t: "höger-pil med krok nedåt"] # 0xeb5c (en: 'rightwards arrow with extended downwards hook', google translation) - - "": [t: "vänster-pil med krok"] # 0xeb5d (en: 'leftwards arrow with extended hook', google translation) - - "": [t: "vänster-pil med krok nedåt"] # 0xeb5e (en: 'leftwards arrow with extended downwards hook', google translation) - - "": [t: "höger-pil med krok"] # 0xeb5f (en: 'rightwards arrow with extended hook', google translation) - - "": [t: "inte vågig höger-pil"] # 0xeb60 (en: 'not right arrow wavy', google translation) - - "": [t: "inte krökt höger-pil"] # 0xeb61 (en: 'not right arrow curved', google translation) - - "": [t: "uppåt harpun till vänster om vertikalt streck"] # 0xeb68 (en: 'upwards harpoon leftwards of vertical bar', google translation) - - "": [t: "nedåt harpun till vänster om vertikalt streck"] # 0xeb69 (en: 'downwards harpoon leftwards of vertical bar', google translation) - - "": [t: "uppåt harpun till höger om vertikalt streck"] # 0xeb6a (en: 'upwards harpoon rightwards of vertical bar', google translation) - - "": [t: "nedåt harpun till höger om vertikalt streck"] # 0xeb6b (en: 'downwards harpoon rightwards of vertical bar', google translation) - - "": [t: "vertikal dubbel-riktad pil förlängare"] # 0xeb6c (en: 'vertical double arrow extender', google translation) - - "": [t: "vertikal harpun med hulling vänster förlängare"] # 0xeb6d (en: 'vertical harpoon with barb left extender', google translation) - - "": [t: "vertikal harpun med hulling höger förlängare"] # 0xeb6e (en: 'vertical harpoon with barb right extender', google translation) - - "": [t: "höger harpun över vänster harpun höger"] # 0xeb6f (en: 'right harpoon over left harpoon right', google translation) - - "": [t: "höger harpun över vänster harpun vänster"] # 0xeb70 (en: 'right harpoon over left harpoon left', google translation) - - "": [t: "vänster harpun över höger harpun höger"] # 0xeb71 (en: 'left harpoon over right harpoon right', google translation) - - "": [t: "vänster harpun över höger harpun vänster"] # 0xeb72 (en: 'left harpoon over right harpoon left', google translation) - - "": [t: "vänster-pil från streck pilspets"] # 0xeb73 (en: 'leftwards arrow from bar arrowhead', google translation) - - "": [t: "dubbel-riktad pil från streck förlängare"] # 0xeb74 (en: 'leftwards rightwards arrow from bar extender', google translation) - - "": [t: "vänster-pil från streck med svans"] # 0xeb75 (en: 'leftwards arrow from bar tail', google translation) - - "": [t: "höger-pil från streck med svans"] # 0xeb76 (en: 'rightwards arrow from bar tail', google translation) - - "": [t: "höger-pil från streck pilspets"] # 0xeb77 (en: 'rightwards arrow from bar arrowhead', google translation) - - "": [t: "uppåt harpun från streck med hulling vänster pilspets"] # 0xeb78 (en: 'upwards harpoon from bar with barb leftwards arrowhead', google translation) - - "": [t: "höger-pil över vänster-pil höger"] # 0xeb79 (en: 'rightwards arrow over leftwards arrow right', google translation) - - "": [t: "höger-pil över vänster-pil vänster"] # 0xeb7a (en: 'rightwards arrow over leftwards arrow left', google translation) - - "": [t: "vänster-pil över höger-pil höger"] # 0xeb7b (en: 'leftwards arrow over rightwards arrow right', google translation) - - "": [t: "vänster-pil över höger-pil vänster"] # 0xeb7c (en: 'leftwards arrow over rightwards arrow left', google translation) - - "": [t: "uppåt-pil från barpilspetsen"] # 0xeb7d (en: 'upwards arrow from bar arrowhead', google translation) - - "": [t: "uppåt-pil från bar svans"] # 0xeb7e (en: 'upwards arrow from bar tail', google translation) - - "": [t: "nedåt pil från bar tail"] # 0xeb7f (en: 'downwards arrow from bar tail', google translation) - - "": [t: "nedåt pil från barpilspetsen"] # 0xeb80 (en: 'downwards arrow from bar arrowhead', google translation) - - "": [t: "nedåt harpun från bar med barb höger pilspets"] # 0xeb81 (en: 'downwards harpoon from bar with barb rightwards arrowhead', google translation) - - "": [t: "uppåt harpun till vänster om nedåt harpunens botten"] # 0xeb82 (en: 'upwards harpoon to the left of downwards harpoon bottom', google translation) - - "": [t: "uppåt harpoon till vänster om nedåt harpoon extender"] # 0xeb83 (en: 'upwards harpoon to the left of downwards harpoon extender', google translation) - - "": [t: "nedåt harpun till vänster om uppåt harpoon top"] # 0xeb84 (en: 'downwards harpoon to the left of upwards harpoon top', google translation) - - "": [t: "uppåt harpun till vänster om nedåt harpunens topp"] # 0xeb85 (en: 'upwards harpoon to the left of downwards harpoon top', google translation) - - "": [t: "nedåt harpun till vänster om den uppåt harpunförlängaren"] # 0xeb86 (en: 'downwards harpoon to the left of the upwards harpoon extender', google translation) - - "": [t: "nedåt harpun till vänster om den uppåt harpunens botten"] # 0xeb87 (en: 'downwards harpoon to the left of the upwards harpoon bottom', google translation) - - "": [t: "uppåt-pil till vänster om pilspets nedåt"] # 0xeb88 (en: 'upwards arrow leftwards of downwards arrow bottom', google translation) - - "": [t: "nedåt-pil till vänster om pilspets uppåt"] # 0xeb89 (en: 'downwards arrow leftwards of upwards arrow top', google translation) - - "": [t: "uppåt-pil till vänster om pilspets nedåt"] # 0xeb8a (en: 'upwards arrow leftwards of downwards arrow top', google translation) - - "": [t: "nedåt-pil till vänster om pilspets uppåt"] # 0xeb8b (en: 'downwards arrow leftwards of upwards arrow bottom', google translation) - - "": [t: "dubbel-riktad pil förlängare"] # 0xeb8c (en: 'leftwards rightwards arrows extender', google translation) - - "": [t: "nord-ost-pil förlängare"] # 0xeb8d (google translation) - - "": [t: "nord-väst-pil förlängare"] # 0xeb8e (google translation) - - "": [t: "nedåt-pekande klammer-parentes vänster"] # 0xec00 (en: 'down pointing brace left', google translation) - - "": [t: "nedåt-pekande klammer-parentes mitten"] # 0xec01 (en: 'down pointing brace mid', google translation) - - "": [t: "nedåt-pekande klammer-parentes höger"] # 0xec02 (en: 'down pointing brace right', google translation) - - "": [t: "horisontell klammer-parentes förlängare"] # 0xec03 (en: 'horizontal brace extender', google translation) - - "": [t: "uppåt-pekande klammer-parentes vänster"] # 0xec04 (en: 'up pointing brace left', google translation) - - "": [t: "uppåt-pekande klammer-parentes mitten"] # 0xec05 (en: 'up pointing brace mid', google translation) - - "": [t: "uppåt-pekande klammer-parentes höger"] # 0xec06 (en: 'up-pointing brace right', google translation) - - "": [t: "vänster vertikalt streck"] # 0xec07 (en: 'left vertical bar', google translation) - - "": [t: "höger vertikalt streck"] # 0xec08 (en: 'right vertical bar', google translation) - - "": [t: "vänster dubbla vertikala streck"] # 0xec09 (en: 'left double vertical bar', google translation) - - "": [t: "höger dubbla vertikala streck"] # 0xec0a (en: 'right double vertical bar', google translation) - - "": [t: "horisontell hak-parentes förlängare"] # 0xec0b (en: 'horizontal bracket extender', google translation) - - "": [t: "under hak-parentes"] # 0xec0c (en: 'under square bracket', google translation) - - "⎵": [t: "under hak-parentes"] # 0x23b5 - - "": [t: "över hak-parentes"] # 0xec0d (en: 'over square bracket', google translation) - - "⎴": [t: "över hak-parentes"] # 0x23b4 - - "": [t: "under hak-parentes vänster"] # 0xec0e (en: 'under bracket left', google translation) - - "": [t: "under hak-parentes höger"] # 0xec0f (en: 'under bracket right', google translation) - - "": [t: "över hak-parentes vänster"] # 0xec10 (en: 'over bracket left', google translation) - - "": [t: "över konsolen höger"] # 0xec11 (en: 'over bracket right', google translation) - - "": [t: "vänster-parentes 1"] # 0xec12 (en: 'left parens 1', google translation) - - "": [t: "vänster-parentes 2"] # 0xec13 (en: 'left parens 2', google translation) - - "": [t: "vänster-parentes 3"] # 0xec14 (en: 'left parens 3', google translation) - - "": [t: "vänster-parentes 4"] # 0xec15 (en: 'left parens 4', google translation) - - "": [t: "höger-parentes 1"] # 0xec16 (en: 'right parens 1', google translation) - - "": [t: "höger-parentes 2"] # 0xec17 (en: 'right parens 2', google translation) - - "": [t: "höger-parentes 3"] # 0xec18 (en: 'right parens 3', google translation) - - "": [t: "höger-parentes 4"] # 0xec19 (en: 'right parens 4', google translation) - - "": [t: "radikal 1"] # 0xec1a (en: 'radical 1', google translation) - - "": [t: "radikal 2"] # 0xec1b (en: 'radical 2', google translation) - - "": [t: "radikal 3"] # 0xec1c (en: 'radical 3', google translation) - - "": [t: "radikal 4"] # 0xec1d (en: 'radical 4', google translation) - - "": [t: "radikal 5"] # 0xec1e (en: 'radical 5', google translation) - - "": [t: "radikal botten"] # 0xec1f (en: 'radical bottom', google translation) - - "": [t: "radikal vertikal förlängare"] # 0xec20 (en: 'radical vertical extender', google translation) - - "": [t: "radikal topp"] # 0xec21 (en: 'radical top', google translation) - - "": [t: "vänster vit hak-parentes topp"] # 0xec22 (en: 'left white bracket top', google translation) - - "": [t: "vänster vit hak-parentes botten"] # 0xec23 (en: 'left white bracket extender', google translation) - - "": [t: "vänster vit hak-parentes botten"] # 0xec24 (en: 'left white bracket bottom', google translation) - - "": [t: "höger vit hak-parentes topp"] # 0xec25 (en: 'right white bracket top', google translation) - - "": [t: "höger vit hak-parentes förlängare"] # 0xec26 (en: 'right white bracket extender', google translation) - - "": [t: "höger vit hak-parentes förlängare"] # 0xec27 (en: 'right white bracket bottom', google translation) - - "": [t: "vänster vit klammer-parentes"] # 0xec30 (en: 'left white curly bracket', google translation) - - "": [t: "höger vit klammer-parentes"] # 0xec31 (en: 'right white curly bracket', google translation) - - "": [t: "liggande stolen"] # 0xec32 (en: 'long division sign', google translation) - - "": [t: "liggande stolen förlängare"] # 0xec33 (google translation) - - "": [t: "kort division"] # 0xec34 (en: 'short division', google translation) - - "": [t: "dubbel syd-väst till nord-ost em-bindning"] # 0xec40 (en: 'double southwest to northeast em bond', google translation) - - "": [t: "dubbel nord-väst till syd-ost em-bindning"] # 0xec41 (en: 'double northwest to southeast em bond', google translation) - - "": [t: "enkel horisontell em-bindning"] # 0xec42 (en: 'single horizontal em bond', google translation) - - "": [t: "dubbel horisontell em-bindning"] # 0xec43 (en: 'double horizontal em bond', google translation) - - "": [t: "trippel horisontell em-bindning"] # 0xec44 (en: 'triple horizontal em bond', google translation) - - "": [t: "enkel vertikal em-bindning"] # 0xec45 (en: 'single vertical em bond', google translation) - - "": [t: "dubbel vertikal em-bindning"] # 0xec46 (en: 'double vertical em bond', google translation) - - "": [t: "trippel vertikal em-bindning"] # 0xec47 (google translation) - - "": [t: "mindre än em-bindning"] # 0xec48 (en: 'less than em bond', google translation) - - "": [t: "större än em-bindning"] # 0xec49 (en: 'greater than em bond', google translation) - - "": [t: "enkel horisontell en-bindning"] # 0xec4a (en: 'single horizontal en bond', google translation) - - "": [t: "dubbel horisontell en-bindning"] # 0xec4b (en: 'double horizontal en bond', google translation) - - "": [t: "trippel horisontell en-bindning"] # 0xec4c (en: 'triple horizontal en bond', google translation) - - "": [t: "övre vänster rektangel"] # 0xec80 (en: 'top left rectangle', google translation) - - "": [t: "nedre vänster rektangel"] # 0xec81 (en: 'bottom left rectangle', google translation) - - "": [t: "övre höger rektangel"] # 0xec90 (en: 'top right rectangle', google translation) - - "": [t: "nedre höger rektangel"] # 0xec91 (en: 'bottom right rectangle', google translation) - - "": [t: "syntetisk division hörn"] # 0xec92 (en: 'synthetic division corner', google translation) - - "": [t: "syntetisk division horisontell förlängare"] # 0xec93 (en: 'synthetic division horizontal extender', google translation) - - "": [t: "syntetisk division vertikal förlängare"] # 0xec94 (en: 'synthetic division vertical extender', google translation) - - "": [t: "vänster tak golv förlängare"] # 0xec95 (en: 'left ceiling floor extender', google translation) - - "": [t: "höger tak golv förlängare"] # 0xec96 (en: 'right ceiling floor extender', google translation) - - "": [t: "över hak-parentes förlängare"] # 0xec97 (en: 'over bracket extender', google translation) - - "": [t: "vertikalt streck förlängare"] # 0xec98 (en: 'vertical bar extender', google translation) - - "": [t: "vänster dubbla vertikala streck förlängare"] # 0xec99 (en: 'left double vertical bar extender', google translation) - - "": [t: "horisontellt streck förlängare"] # 0xec9a (en: 'horizontal bar extender', google translation) - - "": [t: "under hak-parentes förlängare"] # 0xec9c (en: 'under bracket extender', google translation) - - "": [t: "nedåt parentes höger"] # 0xec9d (en: 'down pointing paren right', google translation) - - "": [t: "nedåt parentes förlängare"] # 0xec9e (en: 'down pointing paren extender', google translation) - - "": [t: "nedåt parentes vänster"] # 0xec9f (en: 'down pointing paren left', google translation) - - "": [t: "uppåt parentes förlängare"] # 0xeca0 (en: 'up pointing brace extender', google translation) - - "": [t: "uppåt parentes vänster"] # 0xeca1 (en: 'up pointing paren left', google translation) - - "": [t: "uppåt parentes förlängare"] # 0xeca2 (en: 'up pointing paren extender', google translation) - - "": [t: "uppåt parentes höger"] # 0xeca3 (en: 'up pointing paren right', google translation) - - "": [t: "nedåt klammer-parentes"] # 0xeca4 (en: 'down pointing brace extender', google translation) - - "": [t: "plancks konstant över två pi streck"] # 0xed00 (en: 'planck constant over two pi bar', google translation) - - "": [t: "spegelvänt g"] # 0xed01 (en: 'mirror g', google translation) - - "": [t: "j utan prick"] # 0xed02 (google translation) - - "": [t: "digamma"] # 0xed03 (google translation) + - "": [T: "lika med över hatt"] # 0xe900 (en: 'equals with hat below', google translation) + - "": [T: "lika med med plus"] # 0xe901 (en: 'equals with plus above', google translation) + - "": [T: "lika med över plus"] # 0xe902 (en: 'equals with plus below', google translation) + - "": [T: "tilde med plus"] # 0xe903 (en: 'tilde with plus above', google translation) + - "": [T: "tilde över plus"] # 0xe904 (en: 'tilde with plus below', google translation) + - "": [T: "dubbel lika med över större än"] # 0xe908 (en: 'equal double over greater than', google translation) + - "": [T: "dubbel lika med över mindre än"] # 0xe909 (en: 'equal double over less than', google translation) + - "": [T: "innehåller eller lika med"] # 0xe90a (en: 'contains or equal to', google translation) + - "": [T: "övermängd till eller lika med"] # 0xe90b (en: 'superset of or equal to', google translation) + - "": [T: "delmängd av eller lika med"] # 0xe90c (en: 'subset of or equal to', google translation) + - "": [T: "lika med eller mindre än"] # 0xe90d (en: 'equal over less than', google translation) + - "": [T: "tillhör eller lika med"] # 0xe912 (en: 'element of or equal to', google translation) + - "": [T: "lika med eller större än"] # 0xe913 (en: 'equal to or greater than', google translation) + - "": [T: "ungefärlig övermängd till"] # 0xe914 (en: 'approximate superset of', google translation) + - "": [T: "ungefärlig delmängd av"] # 0xe915 (en: 'approximate subset of', google translation) + - "": [T: "övermängd till med punkt inkluderar som underrelation"] # 0xe916 (en: 'superset of with dot includes as sub relation', google translation) + - "": [T: "delmängd av med punkt inkluderas i som underrelation"] # 0xe917 (en: 'subset of with dot is included in as sub relation', google translation) + - "": [T: "lika med över punkt"] # 0xe918 (en: 'equal with dot below', google translation) + - "": [T: "vänster punkt över minus över höger punkt"] # 0xe919 (en: 'left dot over minus over right dot', google translation) + - "": [T: "höger punkt över minus över vänster punkt"] # 0xe91a (en: 'right dot over minus over left dot', google translation) + - "": [T: "nästan lika med minus"] # 0xe91f (en: 'almost equal to minus', google translation) + - "": [T: "dubbel fyrkantig union"] # 0xe920 (en: 'double square cup', google translation) + - "": [T: "dubbel fyrkantig snitt"] # 0xe921 (en: 'double square cap', google translation) + - "": [T: "mindre än lika med eller större än"] # 0xe922 (en: 'less than equal to or greater than', google translation) + - "": [T: "tilde med prick"] # 0xe924 (en: 'tilde with dot', google translation) + - "": [T: "tilde med två prickar"] # 0xe925 (en: 'tilde with two dots', google translation) + - "": [T: "mindre än större än eller lika med"] # 0xe926 (en: 'less than greater than or equal to', google translation) + - "": [T: "större än mindre än eller lika med"] # 0xe927 (en: 'greater than less than or equal to', google translation) + - "": [T: "ekvivalent med eller mindre än"] # 0xe928 (en: 'equivalent to or less than', google translation) + - "": [T: "ekvivalent med eller större än"] # 0xe929 (en: 'equivalent to or greater than', google translation) + - "": [T: "låda öppning vänster"] # 0xe92a (en: 'left open box operator', google translation) + - "": [T: "låda öppen höger"] # 0xe92b (en: 'right open box operator', google translation) + - "": [T: "identisk med med prick"] # 0xe92c (en: 'identical to with dot', google translation) + - "": [T: "större än lika med eller mindre än"] # 0xe92d (en: 'greater than equal to or less than', google translation) + - "": [T: "streck"] # 0xe92e (en: 'bar operator', google translation) + - "": [T: "dubbel-streck"] # 0xe92f (en: 'double bar operator', google translation) + - "": [T: "trippel-streck"] # 0xe930 (google translation) + - "": [T: "mindre än eller ungefär lika med"] # 0xe932 (en: 'less than or approximately equal to', google translation) + - "": [T: "större än eller ungefär lika med"] # 0xe933 (en: 'greater than or approximately equal to', google translation) + - "": [T: "mycket mindre än"] # 0xe936 (en: 'nested less than', google translation) + - "": [T: "mycket större än"] # 0xe937 (en: 'nested greater than', google translation) + - "": [T: "föregår eller ekvivalent med"] # 0xe93a (en: 'precedes or equivalent to', google translation) + - "": [T: "följer eller ekvivalent med"] # 0xe93b (en: 'succeeds or equivalent to', google translation) + - "": [T: "föregår eller lika med"] # 0xe940 (en: 'precedes over equal', google translation) + - "": [T: "följer eller lika med"] # 0xe941 (en: 'succeeds over equal', google translation) + - "": [T: "mindre än eller lika med"] # 0xe942 (en: 'less equal slanted greater', google translation) + - "": [T: "större än eller lika med"] # 0xe943 (en: 'greater equal slanted less', google translation) + - "": [T: "uppfylls av"] # 0xe948 (en: 'satisfied by', google translation) + - "": [T: "långdraget s"] # 0xe949 (en: 'lazy s', google translation) + - "": [T: "inte påstående"] # 0xe94a (en: 'not assertion', google translation) + - "": [T: "dubbel lika med"] # 0xe94b (en: 'double equal', google translation) + - "": [T: "trippel lika med"] # 0xe94c (en: 'triple equal', google translation) + - "": [T: "regel försenad"] # 0xe94d (en: 'rule delayed', google translation) + - "": [T: "alias avgränsare"] # 0xe94e (en: 'alias delimiter', google translation) + - "": [T: "normal undergrupp till med streck"] # 0xe950 (en: 'normal subgroup of with bar', google translation) + - "": [T: "innehåller som normal undergrupp med streck"] # 0xe951 (en: 'contains as normal subgroup with bar', google translation) + - "": [T: "rund implicerar"] # 0xe954 (en: 'round implies', google translation) + - "": [T: "leende under streck"] # 0xe955 (en: 'smile under bar', google translation) + - "": [T: "rynkad panna över streck"] # 0xe956 (en: 'frown over bar', google translation) + - "": [T: "övermängd till eller nästan lika med"] # 0xe957 (en: 'superset of or almost equal to', google translation) + - "": [T: "delmängd av eller nästan lika med"] # 0xe958 (en: 'subset of or almost equal to', google translation) + - "": [T: "större än nästan lika med eller mindre än"] # 0xe959 (en: 'greater than almost equal to or less than', google translation) + - "": [T: "mindre än nästan lika eller större än"] # 0xe95a (en: 'less than almost equal or greater than', google translation) + - "": [T: "dubbelt eller"] # 0xe95c (en: 'double logical or', google translation) + - "": [T: "dubbelt och"] # 0xe95d (en: 'double logical and', google translation) + - "": [T: "eller med dubbla streck under"] # 0xe95e (en: 'logical or with double bar below', google translation) + - "": [T: "eller med streck under"] # 0xe95f (en: 'logical or with bar below', google translation) + - "": [T: "ungefär lika med"] # 0xe962 (en: 'almost equal over equal', google translation) + - "": [T: "vänster triangel med mittstreck"] # 0xe964 (en: 'left pointing triangle with bisecting bar', google translation) + - "": [T: "höger triangel med mittstreck"] # 0xe965 (en: 'right pointing triangle with bisecting bar', google translation) + - "": [T: "lika med med prickad övre linje"] # 0xe966 (en: 'equals with dotted top line', google translation) + - "": [T: "föregår med kolon"] # 0xe967 (en: 'precedes with colon', google translation) + - "": [T: "följer med kolon"] # 0xe968 (en: 'succeeds with colon', google translation) + - "": [T: "mindre än eller lika med"] # 0xe969 (en: 'smaller than or equal slanted', google translation) + - "": [T: "större än eller lika med"] # 0xe96a (en: 'larger than or equal slanted', google translation) + - "": [T: "väldigt mycket mindre än"] # 0xe96b (en: 'nested very much less than', google translation) + - "": [T: "väldigt mycket större än"] # 0xe96c (en: 'nested very much greater than', google translation) + - "": [T: "skillnad mellan"] # 0xe96d (en: 'difference between variant', google translation) + - "": [T: "mindre än som överlppar med större än"] # 0xe96e (en: 'less than greater than overlay', google translation) + - "": [T: "eller som överlappar med och"] # 0xe96f (en: 'logical or logical and overlay', google translation) + - "": [T: "övermängd över övermängd"] # 0xe970 (google translation) + - "": [T: "delmängd över delmängd"] # 0xe971 (en: 'subset over subset', google translation) + - "": [T: "övermängd över delmängd"] # 0xe972 (en: 'superset over subset', google translation) + - "": [T: "delmängd över övermängd"] # 0xe973 (en: 'subset over superset', google translation) + - "": [T: "trippla vertikala streck"] # 0xe979 (google translation) + - "": [T: "kvadrupla vertikala punkter i par"] # 0xe97a (en: 'paired quadruple vertical dots', google translation) + - "": [T: "vinkelrät över streck"] # 0xe97b (en: 'perpendicular over bar', google translation) + - "": [T: "spegelvänt vändkors med dubbelt vertikalt streck"] # 0xe97c (en: 'left turnstile double vertical bar', google translation) + - "": [T: "dubbelt spegelvänt vändkors"] # 0xe97d (en: 'double left turnstile double vertical bar', google translation) + - "": [T: "vinkelrät över roterat vinkelrät"] # 0xe97e (en: 'perpendicular over inverted perpendicular', google translation) + - "": [T: "dubbelt vänster vändkors med vertikalt streck"] # 0xe97f (en: 'double left turnstile vertical bar', google translation) + - "": [T: "sfärisk vinkel uppåt"] # 0xe980 (en: 'spherical angle opening up', google translation) + - "": [T: "dubbelt snedstreck"] # 0xe981 (en: 'double slash', google translation) + - "": [T: "rät vinkel med hörn"] # 0xe982 (en: 'right angle with corner', google translation) + - "": [T: "cirkel med vertikalt streck"] # 0xe984 (google translation) + - "": [T: "cirkel med division"] # 0xe985 (google translation) + - "": [T: "streckat snedstreck"] # 0xe986 (en: 'dashed solidus', google translation) + - "": [T: "streckat omvänt snedstreck"] # 0xe987 (en: 'dashed backslash', google translation) + - "": [T: "streckad mittlinje"] # 0xe988 (en: 'dashed mid line', google translation) + - "": [T: "streckad vertikalt streck"] # 0xe989 (en: 'dashed vertical bar', google translation) + - "": [T: "vinkelrät med s"] # 0xe98a (en: 'perpendicular with s', google translation) + - "": [T: "vinkel med s"] # 0xe98b (en: 'angle with s', google translation) + - "": [T: "sfärisk vinkel åt vänster"] # 0xe98c (en: 'spherical angle opening left', google translation) + - "": [T: "vinkel åt vänster"] # 0xe98d (en: 'angle opening left', google translation) + - "": [T: "vertikalt streck med dubbel krok"] # 0xe98e (en: 'vertical bar with double hook', google translation) + - "": [T: "medium punkt-operator fri radikal"] # 0xe98f (google translation) + - "": [T: "uppåt-triangel vid över streck"] # 0xe990 (en: 'white up pointing triangle above bar', google translation) + - "": [T: "identisk och parallell med"] # 0xe991 (en: 'identical and parallel to', google translation) + - "": [T: "smash-produkt"] # 0xe992 (en: 'smash product', google translation) + - "": [T: "trippla vertikala streck med horisontella streck"] # 0xe993 (en: 'triple bar operator with horizontal bar', google translation) + - "": [T: "identisk med med dubbla snedstreck"] # 0xe994 (en: 'identical to with double slash', google translation) + - "": [T: "trippla korsade streck"] # 0xe995 (en: 'triple crossed bars', google translation) + - "": [T: "cirkel med vertikalt streck"] # 0xe996 (en: 'vertical bar over circle', google translation) + - "": [T: "vertikal proportionell mot"] # 0xe997 (en: 'vertical proportional to', google translation) + - "": [T: "måne i nedan"] # 0xe998 (en: 'black last quarter moon', google translation) + - "": [T: "nymåne"] # 0xe999 (google translation) + - "": [T: "negativ sinusvåg"] # 0xe9a0 (en: 'negative sine wave', google translation) + - "": [T: "punkt inom parentes"] # 0xe9a1 (en: 'parenthesized dot', google translation) + - "": [T: "parenteser"] # 0xe9a2 (en: 'parens', google translation) + - "": [T: "vitt leende"] # 0xe9a3 (en: 'white smile', google translation) + - "": [T: "vit rynkad panna"] # 0xe9a4 (en: 'white frown', google translation) + - "": [T: "sexhörning"] # 0xe9a5 (en: 'hexagon', google translation) + - "": [T: "ekvivalent med över plus"] # 0xe9a6 (en: 'equivalent to over plus', google translation) + - "": [T: "plus över ekvivalent med"] # 0xe9a7 (en: 'plus over equivalent to', google translation) + - "": [T: "snittet"] # 0xe9b0 (en: 'intersection serifs', google translation) + - "": [T: "unionen"] # 0xe9b1 (google translation) + - "": [T: "snittet"] # 0xe9b2 (en: 'square intersection serifs', google translation) + - "": [T: "unionen"] # 0xe9b3 (google translation) + - "": [T: "föregår ekvivalent med eller följer"] # 0xe9e0 (en: 'precedes equivalent to or succeeds', google translation) + - "": [T: "följer ekvivalent med eller föregår"] # 0xe9e1 (en: 'succeeds equivalent to or precedes', google translation) + - "": [T: "föregår nästan lika med eller lyckas"] # 0xe9e2 (en: 'precedes almost equal to or succeeds', google translation) + - "": [T: "lyckas nästan lika med eller föregås"] # 0xe9e3 (en: 'succeeds almost equal to or precedes', google translation) + - "": [T: "mindre än motsvarande eller större än"] # 0xe9f0 (en: 'less than equivalent to or greater than', google translation) + - "": [T: "större än motsvarande eller mindre än"] # 0xe9f1 (en: 'greater than equivalent to or less than', google translation) + - "": [T: "inte mycket mindre än"] # 0xea00 (en: 'not vert much less than', google translation) + - "": [T: "inte mycket större än"] # 0xea01 (en: 'not vert much greater than', google translation) + - "": [T: "inte mycket mindre än"] # 0xea02 (en: 'not much less than variant', google translation) + - "": [T: "inte mycket större än"] # 0xea03 (en: 'not much greater than variant', google translation) + - "": [T: "mindre än dubbla lika med"] # 0xea04 (en: 'less vert not double equals', google translation) + - "": [T: "större än dubbla lika med"] # 0xea05 (en: 'gt vert not double equals', google translation) + - "": [T: "inte mindre än eller lika med"] # 0xea06 (en: 'not less than or equal to', google translation) + - "": [T: "inte större än eller lika med"] # 0xea07 (en: 'not greater than or equal to', google translation) + - "": [T: "varken lika med eller mindre än"] # 0xea09 (en: 'neither equal to nor less than', google translation) + - "": [T: "innehåller inte eller lika med"] # 0xea0a (en: 'does not contain or equal to', google translation) + - "": [T: "varken övermängd till eller lika med"] # 0xea0b (en: 'neither superset of nor equal to', google translation) + - "": [T: "varken delmängd av eller lika med"] # 0xea0c (en: 'neither subset of nor equal to', google translation) + - "": [T: "omvänt snedstreck delmängd"] # 0xea0d (en: 'reverse solidus subset', google translation) + - "": [T: "varken lika med eller större än"] # 0xea0e (en: 'neither equal to nor greater than', google translation) + - "": [T: "inte minus tilde"] # 0xea0f (en: 'not minus tilde operator', google translation) + - "": [T: "varken lika med eller mindre än"] # 0xea10 (en: 'neither equal to nor less than', google translation) + - "": [T: "inte tilde"] # 0xea11 (en: 'not tilde operator', google translation) + - "": [T: "inte tillhör eller lika med"] # 0xea12 (en: 'not element of or equal to', google translation) + - "": [T: "varken lika med eller större än"] # 0xea13 (en: 'neither equal to nor greater than', google translation) + - "": [T: "inte ungefär lika med"] # 0xea14 (en: 'not almost equal', google translation) + - "": [T: "inte följer ungefär lika med"] # 0xea15 (en: 'not succeeds similar', google translation) + - "": [T: "mindre än eller lika med med snedstreck"] # 0xea16 (en: 'less than or slanted equal to with slash', google translation) + - "": [T: "större än eller lika med med snedstreck"] # 0xea17 (en: 'greater than or slanted equal to with slash', google translation) + - "": [T: "övermängd snedstreck"] # 0xea1a (google translation) + - "": [T: "innehåller inte"] # 0xea1b (en: 'does not contain', google translation) + - "": [T: "inte mindre än eller lika med"] # 0xea1d (en: 'not less than or equal to', google translation) + - "": [T: "inte större än eller lika med"] # 0xea1e (en: 'not greater than or equal to', google translation) + - "": [T: "inte nästan lika med minus"] # 0xea1f (en: 'not almost equal to minus', google translation) + - "": [T: "tillhör inte set med punkt"] # 0xea22 (en: 'negated set membership dot above', google translation) + - "": [T: "inte rät vinkel"] # 0xea2c (en: 'not vert angle', google translation) + - "": [T: "inte parallell"] # 0xea2d (en: 'not parallel slanted', google translation) + - "": [T: "inte streck"] # 0xea2e (en: 'not bar operator', google translation) + - "": [T: "inte dubbelt streck"] # 0xea2f (en: 'not double bar operator', google translation) + - "": [T: "inte trippelt streck"] # 0xea30 (en: 'not triple bar operator', google translation) + - "": [T: "mindre än men inte ungefär lika med"] # 0xea32 (en: 'less than but not approximately equal to', google translation) + - "": [T: "större än men inte ungefär lika med"] # 0xea33 (en: 'greater than but not approximately equal to', google translation) + - "": [T: "mindre än eller inte lika med"] # 0xea34 (en: 'less than or not equal to', google translation) + - "": [T: "större än eller inte lika med"] # 0xea35 (en: 'greater than or not equal to', google translation) + - "": [T: "inte mycket mindre än"] # 0xea36 (en: 'not nested less than', google translation) + - "": [T: "inte mycket större än"] # 0xea37 (en: 'not nested greater than', google translation) + - "": [T: "inte mycket mindre än"] # 0xea38 (en: 'not much less than', google translation) + - "": [T: "inte mycket större än"] # 0xea39 (en: 'not much greater than', google translation) + - "": [T: "föregår men inte ekvivalent med"] # 0xea3a (en: 'precedes but not equivalent to', google translation) + - "": [T: "följer men inte ekvivalent med"] # 0xea3b (en: 'succeeds but not equivalent to', google translation) + - "": [T: "föregår men inte lika med"] # 0xea3c (en: 'precedes but not equal to', google translation) + - "": [T: "följer men inte lika med"] # 0xea3d (en: 'succeeds but not equal to', google translation) + - "": [T: "inte lika eller föregår"] # 0xea3e (en: 'does not equal or precede', google translation) + - "": [T: "inte lika eller följer"] # 0xea3f (en: 'does not equal or succeed', google translation) + - "": [T: "föregår men inte lika med"] # 0xea40 (en: 'precedes but not equal to', google translation) + - "": [T: "följer men inte lika med"] # 0xea41 (en: 'succeeds but not equal to', google translation) + - "": [T: "inte delmängd av eller lika med"] # 0xea42 (en: 'not subset of nor equal to', google translation) + - "": [T: "inte övermängd till eller lika med"] # 0xea43 (en: 'not superset of nor equal to', google translation) + - "": [T: "delmängd av eller inte lika med"] # 0xea44 (en: 'subset of or not equal to', google translation) + - "": [T: "övermängd till eller inte lika med"] # 0xea45 (en: 'superset of or not equal to', google translation) + - "": [T: "inte delmängd av eller lika med"] # 0xea46 (en: 'not subset of nor equal to', google translation) + - "": [T: "inte övermängd till eller lika med"] # 0xea47 (en: 'not superset of nor equal to', google translation) + - "": [T: "inte väldigt mycket mindre än"] # 0xea48 (en: 'not triple less than', google translation) + - "": [T: "inte väldigt mycket större än"] # 0xea49 (en: 'not triple greater than', google translation) + - "": [T: "inte föregår lika med"] # 0xea4c (en: 'not precedes equals', google translation) + - "": [T: "inte följer lika med"] # 0xea4d (en: 'not succeeds equals', google translation) + - "": [T: "inte normal undergrupp av med streck"] # 0xea50 (en: 'not normal subgroup of with bar', google translation) + - "": [T: "innehåller inte som normal undergrupp med streck"] # 0xea51 (en: 'does not contain as normal subgroup with bar', google translation) + - "": [T: "inte differensen"] # 0xea52 (en: 'not difference between', google translation) + - "": [T: "inte geometriskt ekvivalent med"] # 0xea53 (en: 'not geometrically equivalent to', google translation) + - "": [T: "inte vertikalvinkel ungefär lika med"] # 0xea54 (en: 'not vert similar', google translation) + - "": [T: "inte lika med eller ungefär lika med"] # 0xea55 (en: 'not equal or similar', google translation) + - "": [T: "inte vertikalvinkel ungefär lika med"] # 0xea56 (en: 'not vert approximate', google translation) + - "": [T: "inte ungefär identiskt med"] # 0xea57 (en: 'not approximately identical to', google translation) + - "": [T: "inte differensen mellan"] # 0xea58 (en: 'not bumpy equals', google translation) + - "": [T: "inte differensen mellan"] # 0xea59 (en: 'not bumpy single equals', google translation) + - "": [T: "inte lika med med punkt"] # 0xea5a (en: 'not equal dot', google translation) + - "": [T: "spegelvänd inte ekvivalent med"] # 0xea5b (en: 'reverse not equivalent', google translation) + - "": [T: "inte delmängd"] # 0xea60 (en: 'not square subset', google translation) + - "": [T: "inte övermängd"] # 0xea61 (en: 'not square superset', google translation) + - "": [T: "inte ungefär lika med över lika med"] # 0xea62 (en: 'not almost equal over equal', google translation) + - "": [T: "inte strikt ekvivalent med"] # 0xea63 (en: 'not strictly equivalent to', google translation) + - "": [T: "inte kongruent med punkt"] # 0xea64 (en: 'not congruent dot', google translation) + - "": [T: "spegelvänd inte lika med"] # 0xea65 (en: 'reverse not equal', google translation) + - "": [T: "inte vertikalvinkel vänster triangel lika med"] # 0xea70 (en: 'not vert left triangle equals', google translation) + - "": [T: "inte vertikalvinkel höger triangel lika med"] # 0xea71 (en: 'not vert right triangle equals', google translation) + - "": [T: "inte partiell"] # 0xea80 (en: 'not partial', google translation) + - "": [T: "pil förlängare"] # 0xeb00 (en: 'arrow embellishment extender', google translation) + - "": [T: "höger-pil över vänster-pil"] # 0xeb01 (en: 'arrow rightwards over arrow leftwards', google translation) + - "": [T: "höger-pil över vänster-pil"] # 0xeb02 (en: 'arrow rightwards over arrow leftwards', google translation) + - "": [T: "höger harpun över vänster harpun"] # 0xeb03 (en: 'harpoon right over harpoon left', google translation) + - "": [T: "höger harpun över vänster harpun"] # 0xeb04 (en: 'harpoon right over harpoon left', google translation) + - "": [T: "dubbel-riktad pil nord-väst syd-ost"] # 0xeb05 (en: 'double arrow northeast southwest', google translation) + - "": [T: "dubbel-riktad pil nord-väst syd-ost"] # 0xeb06 (en: 'double arrow northwest southeast', google translation) + - "": [T: "horisontell harpun förlängare"] # 0xeb07 (en: 'horizontal harpoon extender', google translation) + - "": [T: "vänster-pil i båge moturs"] # 0xeb08 (en: 'anticlockwise arc leftwards arrow', google translation) + - "": [T: "höger-pil i båge moturs"] # 0xeb09 (en: 'anticlockwise arc rightwards arrow', google translation) + - "": [T: "stor höger-pil"] # 0xeb0b (en: 'large rightwards arrow accent', google translation) + - "": [T: "stor vänster-pil"] # 0xeb0c (en: 'large leftwards arrow accent', google translation) + - "": [T: "vänster pil-spets"] # 0xeb0d (en: 'leftwards arrowhead', google translation) + - "": [T: "höger pil-spets"] # 0xeb0e (en: 'rightwards arrowhead', google translation) + - "": [T: "stor dubbel-riktad pil med streck"] # 0xeb0f (en: 'large left right arrow with stroke', google translation) + - "": [T: "dubbel-riktad pil förlängare"] # 0xeb10 (en: 'horizontal double arrow extender', google translation) + - "": [T: "stor dubbel-riktad pil med streck"] # 0xeb11 (en: 'large left right double arrow with stroke', google translation) + - "": [T: "nedåt-pil till vänster om uppåt-pil"] # 0xeb12 (en: 'downwards arrow leftwards of upwards arrow', google translation) + - "": [T: "vänster-pil med hörn nedåt"] # 0xeb13 (en: 'leftwards arrow with corner downwards', google translation) + - "": [T: "höger-pil med hörn uppåt"] # 0xeb14 (en: 'rightwards arrow with corner upwards', google translation) + - "": [T: "vänster-pil med hörn uppåt"] # 0xeb15 (en: 'leftwards arrow with corner upwards', google translation) + - "": [T: "moturs pil övre halv-cirkel med plus"] # 0xeb16 (en: 'anticlockwise top semicircle arrow with plus', google translation) + - "": [T: "medurs pil övre halv-cirkel med minus"] # 0xeb17 (en: 'clockwise top semicircle arrow with minus', google translation) + - "": [T: "höger-pil med streck och svans"] # 0xeb18 (en: 'rightwards arrow with tail with stroke', google translation) + - "": [T: "höger harpun hulling nedåt"] # 0xeb19 (en: 'right harpoon down', google translation) + - "": [T: "vänster harpun hulling nedåt"] # 0xeb1a (en: 'left harpoon down', google translation) + - "": [T: "dubbel-riktad harpun hullingar nedåt"] # 0xeb1b (en: 'left right harpoon down', google translation) + - "": [T: "dubbel-riktad harpun hullingar uppåt"] # 0xeb1c (en: 'left right harpoon up', google translation) + - "": [T: "dubbel-riktad vertikal harpun hullingar vänster"] # 0xeb1d (en: 'up down harpoon left', google translation) + - "": [T: "dubbel-riktad vertikal harpun hullingar höger"] # 0xeb1e (en: 'up down harpoon right', google translation) + - "": [T: "nedåt-pil till vänster om uppåt-pil"] # 0xeb1f (en: 'upwards arrow to the right of downwards arrow', google translation) + - "": [T: "vänster harpun mot streck hulling uppåt"] # 0xeb20 (en: 'leftwards harpoon to bar with barb upwards', google translation) + - "": [T: "höger harpun mot streck hulling uppåt"] # 0xeb21 (en: 'rightwards harpoon to bar with barb upwards', google translation) + - "": [T: "vänster harpun mot streck hulling nedåt"] # 0xeb22 (en: 'leftwards harpoon to bar with barb downwards', google translation) + - "": [T: "höger harpun mot streck hulling nedåt"] # 0xeb23 (en: 'rightwards harpoon to bar with barb downwards', google translation) + - "": [T: "vänster harpun från streck hulling uppåt"] # 0xeb24 (en: 'leftwards harpoon from bar with barb upwards', google translation) + - "": [T: "höger harpun från streck hulling uppåt"] # 0xeb25 (en: 'rightwards harpoon from bar with barb upwards', google translation) + - "": [T: "vänster harpun från streck hulling nedåt"] # 0xeb26 (en: 'leftwards harpoon from bar with barb downwards', google translation) + - "": [T: "höger harpun från streck hulling nedåt"] # 0xeb27 (en: 'rightwards harpoon from bar with barb downwards', google translation) + - "": [T: "uppåt harpun mot streck hulling vänster"] # 0xeb28 (en: 'upwards harpoon to bar with barb leftwards', google translation) + - "": [T: "nedåt harpun mot streck hulling vänster"] # 0xeb29 (en: 'downwards harpoon to bar with barb leftwards', google translation) + - "": [T: "uppåt harpun mot streck hulling höger"] # 0xeb2a (en: 'upwards harpoon to bar with barb rightwards', google translation) + - "": [T: "nedåt harpun mot streck hulling höger"] # 0xeb2b (en: 'downwards harpoon to bar with barb rightwards', google translation) + - "": [T: "uppåt harpun från streck hulling vänster"] # 0xeb2c (en: 'upwards harpoon from bar with barb leftwards', google translation) + - "": [T: "nedåt harpun från streck hulling vänster"] # 0xeb2d (en: 'downwards harpoon from bar with barb leftwards', google translation) + - "": [T: "uppåt harpun från streck hulling höger"] # 0xeb2e (en: 'upwards harpoon from bar with barb rightwards', google translation) + - "": [T: "nedåt harpun från streck hulling höger"] # 0xeb2f (en: 'downwards harpoon from bar with barb rightwards', google translation) + - "": [T: "uppåt-pil mot streck"] # 0xeb30 (en: 'upwards arrow to bar', google translation) + - "": [T: "nedåt-pil mot streck"] # 0xeb31 (en: 'downwards arrow to bar', google translation) + - "": [T: "uppåt harpun till vänster om nedåt harpun"] # 0xeb32 (en: 'upwards harpoon to the left of downwards harpoon', google translation) + - "": [T: "uppåt harpun till höger om nedåt harpun"] # 0xeb33 (en: 'upwards harpoon to the right of downwards harpoon', google translation) + - "": [T: "uppåt pilspets"] # 0xeb34 (en: 'upwards arrowhead', google translation) + - "": [T: "nedåt pilspets"] # 0xeb35 (en: 'downwards arrowhead', google translation) + - "": [T: "dubbel harpun vänster hulling nedåt höger hulling uppåt"] # 0xeb36 (en: 'double harpoon with leftwards barb down rightwards barb up', google translation) + - "": [T: "dubbel harpun vänster hulling uppåt höger hulling nedåt"] # 0xeb37 (en: 'double harpoon with leftwards barb up rightwards barb down', google translation) + - "": [T: "vänster-pil över strecl"] # 0xeb38 (en: 'leftwards arrow over bar', google translation) + - "": [T: "höger-pil över streck"] # 0xeb39 (en: 'rightwards arrow over bar', google translation) + - "": [T: "vänster-pil under streck"] # 0xeb3a (en: 'leftwards arrow under bar', google translation) + - "": [T: "höger-pil under streck"] # 0xeb3b (en: 'rightwards arrow under bar', google translation) + - "": [T: "trippel dubbel-riktad pil"] # 0xeb3c (en: 'left right triple arrow', google translation) + - "": [T: "dubbel-pil nord-ost syd-ost"] # 0xeb3f (en: 'double arrow northeast southeast', google translation) + - "": [T: "moturs pil i halvcircel åt vänster"] # 0xeb40 (en: 'anticlockwise left semicircle arrow', google translation) + - "": [T: "medurs pil i halvcirkel åt vänster"] # 0xeb41 (en: 'clockwise left semicircle arrow', google translation) + - "": [T: "dubbel-riktad pil i vänster öppen cirkel"] # 0xeb42 (en: 'left open circle left right arrow', google translation) + - "": [T: "höger-pil över tilde"] # 0xeb44 (en: 'rightwards arrow over tilde', google translation) + - "": [T: "vänster-pil över tilde"] # 0xeb45 (en: 'leftwards arrow over tilde', google translation) + - "": [T: "vänster harpun över streck"] # 0xeb48 (en: 'leftwards harpoon over bar', google translation) + - "": [T: "höger harpun över streck"] # 0xeb49 (en: 'rightwards harpoon over bar', google translation) + - "": [T: "vänster harpun under streck"] # 0xeb4a (en: 'leftwards harpoon under bar', google translation) + - "": [T: "höger harpun under streck"] # 0xeb4b (en: 'rightwards harpoon under bar', google translation) + - "": [T: "ihoptryckt vänster-pil"] # 0xeb4c (en: 'squat black leftwards arrow', google translation) + - "": [T: "medurs höger halvcirkel-pil"] # 0xeb50 (en: 'clockwise right semicircle arrow', google translation) + - "": [T: "moturs höger halvcirkel-pil"] # 0xeb51 (en: 'anticlockwise right semicircle arrow', google translation) + - "": [T: "dubbel-riktad pil i vänster öppen cirkel"] # 0xeb52 (en: 'left open circle left right harpoon', google translation) + - "": [T: "uppåt-pil till vänster om vertikalt streck"] # 0xeb58 (en: 'upwards arrow leftwards of vertical bar', google translation) + - "": [T: "nedåt-pil till vänster om vertikalt streck"] # 0xeb59 (en: 'downwards arrow leftwards of vertical bar', google translation) + - "": [T: "uppåt-pil till höger om vertikalt streck"] # 0xeb5a (en: 'upwards arrow rightwards of vertical bar', google translation) + - "": [T: "uppåt-pil till höger om vertikalt streck"] # 0xeb5b (en: 'downwards arrow rightwards of vertical bar', google translation) + - "": [T: "höger-pil med krok nedåt"] # 0xeb5c (en: 'rightwards arrow with extended downwards hook', google translation) + - "": [T: "vänster-pil med krok"] # 0xeb5d (en: 'leftwards arrow with extended hook', google translation) + - "": [T: "vänster-pil med krok nedåt"] # 0xeb5e (en: 'leftwards arrow with extended downwards hook', google translation) + - "": [T: "höger-pil med krok"] # 0xeb5f (en: 'rightwards arrow with extended hook', google translation) + - "": [T: "inte vågig höger-pil"] # 0xeb60 (en: 'not right arrow wavy', google translation) + - "": [T: "inte krökt höger-pil"] # 0xeb61 (en: 'not right arrow curved', google translation) + - "": [T: "uppåt harpun till vänster om vertikalt streck"] # 0xeb68 (en: 'upwards harpoon leftwards of vertical bar', google translation) + - "": [T: "nedåt harpun till vänster om vertikalt streck"] # 0xeb69 (en: 'downwards harpoon leftwards of vertical bar', google translation) + - "": [T: "uppåt harpun till höger om vertikalt streck"] # 0xeb6a (en: 'upwards harpoon rightwards of vertical bar', google translation) + - "": [T: "nedåt harpun till höger om vertikalt streck"] # 0xeb6b (en: 'downwards harpoon rightwards of vertical bar', google translation) + - "": [T: "vertikal dubbel-riktad pil förlängare"] # 0xeb6c (en: 'vertical double arrow extender', google translation) + - "": [T: "vertikal harpun med hulling vänster förlängare"] # 0xeb6d (en: 'vertical harpoon with barb left extender', google translation) + - "": [T: "vertikal harpun med hulling höger förlängare"] # 0xeb6e (en: 'vertical harpoon with barb right extender', google translation) + - "": [T: "höger harpun över vänster harpun höger"] # 0xeb6f (en: 'right harpoon over left harpoon right', google translation) + - "": [T: "höger harpun över vänster harpun vänster"] # 0xeb70 (en: 'right harpoon over left harpoon left', google translation) + - "": [T: "vänster harpun över höger harpun höger"] # 0xeb71 (en: 'left harpoon over right harpoon right', google translation) + - "": [T: "vänster harpun över höger harpun vänster"] # 0xeb72 (en: 'left harpoon over right harpoon left', google translation) + - "": [T: "vänster-pil från streck pilspets"] # 0xeb73 (en: 'leftwards arrow from bar arrowhead', google translation) + - "": [T: "dubbel-riktad pil från streck förlängare"] # 0xeb74 (en: 'leftwards rightwards arrow from bar extender', google translation) + - "": [T: "vänster-pil från streck med svans"] # 0xeb75 (en: 'leftwards arrow from bar tail', google translation) + - "": [T: "höger-pil från streck med svans"] # 0xeb76 (en: 'rightwards arrow from bar tail', google translation) + - "": [T: "höger-pil från streck pilspets"] # 0xeb77 (en: 'rightwards arrow from bar arrowhead', google translation) + - "": [T: "uppåt harpun från streck med hulling vänster pilspets"] # 0xeb78 (en: 'upwards harpoon from bar with barb leftwards arrowhead', google translation) + - "": [T: "höger-pil över vänster-pil höger"] # 0xeb79 (en: 'rightwards arrow over leftwards arrow right', google translation) + - "": [T: "höger-pil över vänster-pil vänster"] # 0xeb7a (en: 'rightwards arrow over leftwards arrow left', google translation) + - "": [T: "vänster-pil över höger-pil höger"] # 0xeb7b (en: 'leftwards arrow over rightwards arrow right', google translation) + - "": [T: "vänster-pil över höger-pil vänster"] # 0xeb7c (en: 'leftwards arrow over rightwards arrow left', google translation) + - "": [T: "uppåt-pil från barpilspetsen"] # 0xeb7d (en: 'upwards arrow from bar arrowhead', google translation) + - "": [T: "uppåt-pil från bar svans"] # 0xeb7e (en: 'upwards arrow from bar tail', google translation) + - "": [T: "nedåt pil från bar tail"] # 0xeb7f (en: 'downwards arrow from bar tail', google translation) + - "": [T: "nedåt pil från barpilspetsen"] # 0xeb80 (en: 'downwards arrow from bar arrowhead', google translation) + - "": [T: "nedåt harpun från bar med barb höger pilspets"] # 0xeb81 (en: 'downwards harpoon from bar with barb rightwards arrowhead', google translation) + - "": [T: "uppåt harpun till vänster om nedåt harpunens botten"] # 0xeb82 (en: 'upwards harpoon to the left of downwards harpoon bottom', google translation) + - "": [T: "uppåt harpoon till vänster om nedåt harpoon extender"] # 0xeb83 (en: 'upwards harpoon to the left of downwards harpoon extender', google translation) + - "": [T: "nedåt harpun till vänster om uppåt harpoon top"] # 0xeb84 (en: 'downwards harpoon to the left of upwards harpoon top', google translation) + - "": [T: "uppåt harpun till vänster om nedåt harpunens topp"] # 0xeb85 (en: 'upwards harpoon to the left of downwards harpoon top', google translation) + - "": [T: "nedåt harpun till vänster om den uppåt harpunförlängaren"] # 0xeb86 (en: 'downwards harpoon to the left of the upwards harpoon extender', google translation) + - "": [T: "nedåt harpun till vänster om den uppåt harpunens botten"] # 0xeb87 (en: 'downwards harpoon to the left of the upwards harpoon bottom', google translation) + - "": [T: "uppåt-pil till vänster om pilspets nedåt"] # 0xeb88 (en: 'upwards arrow leftwards of downwards arrow bottom', google translation) + - "": [T: "nedåt-pil till vänster om pilspets uppåt"] # 0xeb89 (en: 'downwards arrow leftwards of upwards arrow top', google translation) + - "": [T: "uppåt-pil till vänster om pilspets nedåt"] # 0xeb8a (en: 'upwards arrow leftwards of downwards arrow top', google translation) + - "": [T: "nedåt-pil till vänster om pilspets uppåt"] # 0xeb8b (en: 'downwards arrow leftwards of upwards arrow bottom', google translation) + - "": [T: "dubbel-riktad pil förlängare"] # 0xeb8c (en: 'leftwards rightwards arrows extender', google translation) + - "": [T: "nord-ost-pil förlängare"] # 0xeb8d (google translation) + - "": [T: "nord-väst-pil förlängare"] # 0xeb8e (google translation) + - "": [T: "nedåt-pekande klammer-parentes vänster"] # 0xec00 (en: 'down pointing brace left', google translation) + - "": [T: "nedåt-pekande klammer-parentes mitten"] # 0xec01 (en: 'down pointing brace mid', google translation) + - "": [T: "nedåt-pekande klammer-parentes höger"] # 0xec02 (en: 'down pointing brace right', google translation) + - "": [T: "horisontell klammer-parentes förlängare"] # 0xec03 (en: 'horizontal brace extender', google translation) + - "": [T: "uppåt-pekande klammer-parentes vänster"] # 0xec04 (en: 'up pointing brace left', google translation) + - "": [T: "uppåt-pekande klammer-parentes mitten"] # 0xec05 (en: 'up pointing brace mid', google translation) + - "": [T: "uppåt-pekande klammer-parentes höger"] # 0xec06 (en: 'up-pointing brace right', google translation) + - "": [T: "vänster vertikalt streck"] # 0xec07 (en: 'left vertical bar', google translation) + - "": [T: "höger vertikalt streck"] # 0xec08 (en: 'right vertical bar', google translation) + - "": [T: "vänster dubbla vertikala streck"] # 0xec09 (en: 'left double vertical bar', google translation) + - "": [T: "höger dubbla vertikala streck"] # 0xec0a (en: 'right double vertical bar', google translation) + - "": [T: "horisontell hak-parentes förlängare"] # 0xec0b (en: 'horizontal bracket extender', google translation) + - "": [T: "under hak-parentes"] # 0xec0c (en: 'under square bracket', google translation) + - "⎵": [T: "under hak-parentes"] # 0x23b5 + - "": [T: "över hak-parentes"] # 0xec0d (en: 'over square bracket', google translation) + - "⎴": [T: "över hak-parentes"] # 0x23b4 + - "": [T: "under hak-parentes vänster"] # 0xec0e (en: 'under bracket left', google translation) + - "": [T: "under hak-parentes höger"] # 0xec0f (en: 'under bracket right', google translation) + - "": [T: "över hak-parentes vänster"] # 0xec10 (en: 'over bracket left', google translation) + - "": [T: "över konsolen höger"] # 0xec11 (en: 'over bracket right', google translation) + - "": [T: "vänster-parentes 1"] # 0xec12 (en: 'left parens 1', google translation) + - "": [T: "vänster-parentes 2"] # 0xec13 (en: 'left parens 2', google translation) + - "": [T: "vänster-parentes 3"] # 0xec14 (en: 'left parens 3', google translation) + - "": [T: "vänster-parentes 4"] # 0xec15 (en: 'left parens 4', google translation) + - "": [T: "höger-parentes 1"] # 0xec16 (en: 'right parens 1', google translation) + - "": [T: "höger-parentes 2"] # 0xec17 (en: 'right parens 2', google translation) + - "": [T: "höger-parentes 3"] # 0xec18 (en: 'right parens 3', google translation) + - "": [T: "höger-parentes 4"] # 0xec19 (en: 'right parens 4', google translation) + - "": [T: "radikal 1"] # 0xec1a (en: 'radical 1', google translation) + - "": [T: "radikal 2"] # 0xec1b (en: 'radical 2', google translation) + - "": [T: "radikal 3"] # 0xec1c (en: 'radical 3', google translation) + - "": [T: "radikal 4"] # 0xec1d (en: 'radical 4', google translation) + - "": [T: "radikal 5"] # 0xec1e (en: 'radical 5', google translation) + - "": [T: "radikal botten"] # 0xec1f (en: 'radical bottom', google translation) + - "": [T: "radikal vertikal förlängare"] # 0xec20 (en: 'radical vertical extender', google translation) + - "": [T: "radikal topp"] # 0xec21 (en: 'radical top', google translation) + - "": [T: "vänster vit hak-parentes topp"] # 0xec22 (en: 'left white bracket top', google translation) + - "": [T: "vänster vit hak-parentes botten"] # 0xec23 (en: 'left white bracket extender', google translation) + - "": [T: "vänster vit hak-parentes botten"] # 0xec24 (en: 'left white bracket bottom', google translation) + - "": [T: "höger vit hak-parentes topp"] # 0xec25 (en: 'right white bracket top', google translation) + - "": [T: "höger vit hak-parentes förlängare"] # 0xec26 (en: 'right white bracket extender', google translation) + - "": [T: "höger vit hak-parentes förlängare"] # 0xec27 (en: 'right white bracket bottom', google translation) + - "": [T: "vänster vit klammer-parentes"] # 0xec30 (en: 'left white curly bracket', google translation) + - "": [T: "höger vit klammer-parentes"] # 0xec31 (en: 'right white curly bracket', google translation) + - "": [T: "liggande stolen"] # 0xec32 (en: 'long division sign', google translation) + - "": [T: "liggande stolen förlängare"] # 0xec33 (google translation) + - "": [T: "kort division"] # 0xec34 (en: 'short division', google translation) + - "": [T: "dubbel syd-väst till nord-ost em-bindning"] # 0xec40 (en: 'double southwest to northeast em bond', google translation) + - "": [T: "dubbel nord-väst till syd-ost em-bindning"] # 0xec41 (en: 'double northwest to southeast em bond', google translation) + - "": [T: "enkel horisontell em-bindning"] # 0xec42 (en: 'single horizontal em bond', google translation) + - "": [T: "dubbel horisontell em-bindning"] # 0xec43 (en: 'double horizontal em bond', google translation) + - "": [T: "trippel horisontell em-bindning"] # 0xec44 (en: 'triple horizontal em bond', google translation) + - "": [T: "enkel vertikal em-bindning"] # 0xec45 (en: 'single vertical em bond', google translation) + - "": [T: "dubbel vertikal em-bindning"] # 0xec46 (en: 'double vertical em bond', google translation) + - "": [T: "trippel vertikal em-bindning"] # 0xec47 (google translation) + - "": [T: "mindre än em-bindning"] # 0xec48 (en: 'less than em bond', google translation) + - "": [T: "större än em-bindning"] # 0xec49 (en: 'greater than em bond', google translation) + - "": [T: "enkel horisontell en-bindning"] # 0xec4a (en: 'single horizontal en bond', google translation) + - "": [T: "dubbel horisontell en-bindning"] # 0xec4b (en: 'double horizontal en bond', google translation) + - "": [T: "trippel horisontell en-bindning"] # 0xec4c (en: 'triple horizontal en bond', google translation) + - "": [T: "övre vänster rektangel"] # 0xec80 (en: 'top left rectangle', google translation) + - "": [T: "nedre vänster rektangel"] # 0xec81 (en: 'bottom left rectangle', google translation) + - "": [T: "övre höger rektangel"] # 0xec90 (en: 'top right rectangle', google translation) + - "": [T: "nedre höger rektangel"] # 0xec91 (en: 'bottom right rectangle', google translation) + - "": [T: "syntetisk division hörn"] # 0xec92 (en: 'synthetic division corner', google translation) + - "": [T: "syntetisk division horisontell förlängare"] # 0xec93 (en: 'synthetic division horizontal extender', google translation) + - "": [T: "syntetisk division vertikal förlängare"] # 0xec94 (en: 'synthetic division vertical extender', google translation) + - "": [T: "vänster tak golv förlängare"] # 0xec95 (en: 'left ceiling floor extender', google translation) + - "": [T: "höger tak golv förlängare"] # 0xec96 (en: 'right ceiling floor extender', google translation) + - "": [T: "över hak-parentes förlängare"] # 0xec97 (en: 'over bracket extender', google translation) + - "": [T: "vertikalt streck förlängare"] # 0xec98 (en: 'vertical bar extender', google translation) + - "": [T: "vänster dubbla vertikala streck förlängare"] # 0xec99 (en: 'left double vertical bar extender', google translation) + - "": [T: "horisontellt streck förlängare"] # 0xec9a (en: 'horizontal bar extender', google translation) + - "": [T: "under hak-parentes förlängare"] # 0xec9c (en: 'under bracket extender', google translation) + - "": [T: "nedåt parentes höger"] # 0xec9d (en: 'down pointing paren right', google translation) + - "": [T: "nedåt parentes förlängare"] # 0xec9e (en: 'down pointing paren extender', google translation) + - "": [T: "nedåt parentes vänster"] # 0xec9f (en: 'down pointing paren left', google translation) + - "": [T: "uppåt parentes förlängare"] # 0xeca0 (en: 'up pointing brace extender', google translation) + - "": [T: "uppåt parentes vänster"] # 0xeca1 (en: 'up pointing paren left', google translation) + - "": [T: "uppåt parentes förlängare"] # 0xeca2 (en: 'up pointing paren extender', google translation) + - "": [T: "uppåt parentes höger"] # 0xeca3 (en: 'up pointing paren right', google translation) + - "": [T: "nedåt klammer-parentes"] # 0xeca4 (en: 'down pointing brace extender', google translation) + - "": [T: "plancks konstant över två pi streck"] # 0xed00 (en: 'planck constant over two pi bar', google translation) + - "": [T: "spegelvänt g"] # 0xed01 (en: 'mirror g', google translation) + - "": [T: "j utan prick"] # 0xed02 (google translation) + - "": [T: "digamma"] # 0xed03 (google translation) - "ϝ": [T: "digamma"] # 0x3dd - - "": [t: ""] # 0xed10 (en: 'd', google translation) + - "": [T: ""] # 0xed10 (en: 'd', google translation) - "ⅆ": [T: "d"] # 0x2146 - - "": [t: ""] # 0xed11 (en: 'e', google translation) + - "": [T: ""] # 0xed11 (en: 'e', google translation) - "ⅇ": [T: "e"] # 0x2147 - - "": [t: ""] # 0xed12 (en: 'i', google translation) + - "": [T: ""] # 0xed12 (en: 'i', google translation) - "ⅈ": [T: "i"] # 0x2148 - - "": [t: ""] # 0xed13 (en: 'j', google translation) + - "": [T: ""] # 0xed13 (en: 'j', google translation) - "ⅅ": - - spell: "translate('.', 'ⅅ', 'DD')" # 0xed16, 0x2145 + - SPELL: "translate('.', 'ⅅ', 'DD')" # 0xed16, 0x2145 # The private use chars are from MathType - - "": [t: "kontur-integral motsols slinga"] # 0xee00 (en: 'anticlockwise contour integral loop', google translation) - - "": [t: "kontur-integral medurs slinga"] # 0xee01 (en: 'clockwise contour integral loop', google translation) - - "": [t: ""] # 0xee04 - - "": [t: ""] # 0xee05 - - "": [t: ""] # 0xee06 - - "": [t: ""] # 0xee07 - - "": [t: ""] # 0xee08 - - "": [t: ""] # 0xee09 - - "": [t: ""] # 0xee0a - - "": [t: ""] # 0xee0b - - "": [t: ""] # 0xee0c - - "": [t: "joint status"] # 0xee0d (en: 'joint status embellishment', google translation) - - "": [t: "joint status vänster"] # 0xee0e (en: 'joint status embellishment left', google translation) - - "": [t: "joint status höger"] # 0xee0f (en: 'joint status embellishment right', google translation) - - "": [t: "joint status förlängare"] # 0xee10 (en: 'joint status embellishment extender', google translation) - - "": [t: "integrerad slinga"] # 0xee11 (en: 'integral loop', google translation) - - "": [t: "integrerad dubbel slinga"] # 0xee12 (google translation) - - "": [t: "integrerad trippel slinga"] # 0xee13 (en: 'integral loop triple', google translation) - - "": [t: "expanderande integrerad dubbel slinga"] # 0xee15 (google translation) - - "": [t: "expanderande integrerad trippel slinga"] # 0xee16 (en: 'expanding integral loop triple', google translation) - - "": [t: "asymptotiskt lika med"] # 0xee17 (en: 'asymptotically equal to accent', google translation) - - "": [t: "lika med"] # 0xee18 (en: 'equal sign accent', google translation) - - "": [t: "kvadrupelt prim"] # 0xee19 (en: 'quadruple prime', google translation) - - "": [t: "streck med öppen cirkel vänster"] # 0xee1a (en: 'bar accent with open circle left', google translation) - - "": [t: "streck med sluten cirkel höger"] # 0xee1b (en: 'bar accent with closed circle left', google translation) - - "": [t: "streck med öppen cirkel höger"] # 0xee1c (en: 'bar accent with open circle right', google translation) - - "": [t: "streck med prick"] # 0xee1d (en: 'bar accent with over dot', google translation) - - "": [t: "streck över prick"] # 0xee1e (en: 'bar accent with under dot', google translation) - - "": [t: "streck med dubbel prick över"] # 0xee1f (en: 'bar accent with double over dot', google translation) - - "": [t: "streck över dubbel prick"] # 0xee20 (en: 'bar accent with double under dot', google translation) - - "": [t: "streck med hatt"] # 0xee21 (en: 'bar accent with caret', google translation) - - "": [t: "fetstilt under-streck"] # 0xee22 (en: 'thick under bar accent', google translation) - - "": [t: "streck med sluten cirkel höger"] # 0xee23 (en: 'bar accent with closed circle right', google translation) - - "": [t: "stor prick"] # 0xee24 (en: 'large dot above', google translation) - - "": [t: "inriktningsmärke"] # 0xef00 (en: 'alignment mark', google translation) - - "": [t: ""] # 0xef01 - - "​": [t: ""] # 0x200b - - "": [t: ""] # 0xef02 - - " ": [t: ""] # 0x2009 - - "": [t: ""] # 0xef03 - - " ": [t: ""] # 0x205f - - "": [t: ""] # 0xef04 - - "": [t: ""] # 0xef05 - - " ": [t: ""] # 0x2003 - - "": [t: ""] # 0xef06 - - "": [t: ""] # 0xef07 - - "": [t: ""] # 0xef08 - - "": [t: ""] # 0xef09 - - "": [t: ""] # 0xef0a - - " ": [t: ""] # 0x200a - - "": [t: ""] # 0xef22 - - "": [t: ""] # 0xef23 - - "": [t: ""] # 0xef24 - - "": [t: ""] # 0xef29 - - "": [t: "saknad term"] # 0xef41 (en: 'missing term', google translation) - - "": [t: "medurs konturintegral pil till vänster"] # 0xef80 (en: 'clockwise contour integral arrow on left', google translation) - - "": [t: "integral med fyrkant"] # 0xef81 (en: 'integral with square', google translation) - - "": [t: "integral med snedstreck"] # 0xef82 (en: 'integral with slash', google translation) - - "": [t: "spegelvänd integral"] # 0xef83 (en: 'reversed integral', google translation) - - "": [t: "dubbel nolla över dubbel nolla"] # 0xef90 (en: 'double zero over double zero', google translation) - - "": [t: "noll med snedstreck"] # 0xef91 (en: 'zero with slash', google translation) + - "": [T: "kontur-integral motsols slinga"] # 0xee00 (en: 'anticlockwise contour integral loop', google translation) + - "": [T: "kontur-integral medurs slinga"] # 0xee01 (en: 'clockwise contour integral loop', google translation) + - "": [T: ""] # 0xee04 + - "": [T: ""] # 0xee05 + - "": [T: ""] # 0xee06 + - "": [T: ""] # 0xee07 + - "": [T: ""] # 0xee08 + - "": [T: ""] # 0xee09 + - "": [T: ""] # 0xee0a + - "": [T: ""] # 0xee0b + - "": [T: ""] # 0xee0c + - "": [T: "joint status"] # 0xee0d (en: 'joint status embellishment', google translation) + - "": [T: "joint status vänster"] # 0xee0e (en: 'joint status embellishment left', google translation) + - "": [T: "joint status höger"] # 0xee0f (en: 'joint status embellishment right', google translation) + - "": [T: "joint status förlängare"] # 0xee10 (en: 'joint status embellishment extender', google translation) + - "": [T: "integrerad slinga"] # 0xee11 (en: 'integral loop', google translation) + - "": [T: "integrerad dubbel slinga"] # 0xee12 (google translation) + - "": [T: "integrerad trippel slinga"] # 0xee13 (en: 'integral loop triple', google translation) + - "": [T: "expanderande integrerad dubbel slinga"] # 0xee15 (google translation) + - "": [T: "expanderande integrerad trippel slinga"] # 0xee16 (en: 'expanding integral loop triple', google translation) + - "": [T: "asymptotiskt lika med"] # 0xee17 (en: 'asymptotically equal to accent', google translation) + - "": [T: "lika med"] # 0xee18 (en: 'equal sign accent', google translation) + - "": [T: "kvadrupelt prim"] # 0xee19 (en: 'quadruple prime', google translation) + - "": [T: "streck med öppen cirkel vänster"] # 0xee1a (en: 'bar accent with open circle left', google translation) + - "": [T: "streck med sluten cirkel höger"] # 0xee1b (en: 'bar accent with closed circle left', google translation) + - "": [T: "streck med öppen cirkel höger"] # 0xee1c (en: 'bar accent with open circle right', google translation) + - "": [T: "streck med prick"] # 0xee1d (en: 'bar accent with over dot', google translation) + - "": [T: "streck över prick"] # 0xee1e (en: 'bar accent with under dot', google translation) + - "": [T: "streck med dubbel prick över"] # 0xee1f (en: 'bar accent with double over dot', google translation) + - "": [T: "streck över dubbel prick"] # 0xee20 (en: 'bar accent with double under dot', google translation) + - "": [T: "streck med hatt"] # 0xee21 (en: 'bar accent with caret', google translation) + - "": [T: "fetstilt under-streck"] # 0xee22 (en: 'thick under bar accent', google translation) + - "": [T: "streck med sluten cirkel höger"] # 0xee23 (en: 'bar accent with closed circle right', google translation) + - "": [T: "stor prick"] # 0xee24 (en: 'large dot above', google translation) + - "": [T: "inriktningsmärke"] # 0xef00 (en: 'alignment mark', google translation) + - "": [T: ""] # 0xef01 + - "​": [T: ""] # 0x200b + - "": [T: ""] # 0xef02 + - " ": [T: ""] # 0x2009 + - "": [T: ""] # 0xef03 + - " ": [T: ""] # 0x205f + - "": [T: ""] # 0xef04 + - "": [T: ""] # 0xef05 + - " ": [T: ""] # audit-ignore 0x2003 + - "": [T: ""] # 0xef06 + - "": [T: ""] # 0xef07 + - "": [T: ""] # 0xef08 + - "": [T: ""] # 0xef09 + - "": [T: ""] # 0xef0a + - " ": [T: ""] # 0x200a + - "": [T: ""] # 0xef22 + - "": [T: ""] # 0xef23 + - "": [T: ""] # 0xef24 + - "": [T: ""] # 0xef29 + - "": [T: "saknad term"] # 0xef41 (en: 'missing term', google translation) + - "": [T: "medurs konturintegral pil till vänster"] # 0xef80 (en: 'clockwise contour integral arrow on left', google translation) + - "": [T: "integral med fyrkant"] # 0xef81 (en: 'integral with square', google translation) + - "": [T: "integral med snedstreck"] # 0xef82 (en: 'integral with slash', google translation) + - "": [T: "spegelvänd integral"] # 0xef83 (en: 'reversed integral', google translation) + - "": [T: "dubbel nolla över dubbel nolla"] # 0xef90 (en: 'double zero over double zero', google translation) + - "": [T: "noll med snedstreck"] # 0xef91 (en: 'zero with slash', google translation) # fraktur chars in math alphabetic block and also MathType private use area # Some of these are reserved because they were used in Plane 0 -- that shouldn't be an issue other than causing the other chars to not display - "𝔄-𝔜": # 0x1d504 - 0x1d51d ('z' version is reserved) - T: "fraktur" # (google translation) - - spell: "translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" + - SPELL: "translate('.', '𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" - "-": # 0xf000 - 0xf018 - T: "fraktur" # (google translation) - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXY')" - "𝔞-𝔷": # 0x1d51e - 0x1d537 - T: "fraktur" # (google translation) - - spell: "translate('.', '𝔞𝔟𝔠𝔡𝔢𝔣𝔤𝔥𝔦𝔧𝔨𝔩𝔪𝔫𝔬𝔭𝔮𝔯𝔰𝔱𝔲𝔳𝔴𝔵𝔶𝔷', 'abcdefghijklmnopqrstuvwxyz')" + - SPELL: "translate('.', '𝔞𝔟𝔠𝔡𝔢𝔣𝔤𝔥𝔦𝔧𝔨𝔩𝔪𝔫𝔬𝔭𝔮𝔯𝔰𝔱𝔲𝔳𝔴𝔵𝔶𝔷', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf01a - 0xf033 - T: "fraktur" # (google translation) - - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - "𝕬-𝖅": # 0x1D56C - 0x1D585 - - T: "fraktur fetstilt" # (google translation) - - spell: "translate('.', '𝕬𝕭𝕮𝕯𝕰𝕱𝕲𝕳𝕴𝕵𝕶𝕷𝕸𝕹𝕺𝕻𝕼𝕽𝕾𝕿𝖀𝖁𝖂𝖃𝖄𝖅', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - T: "fraktur" # (google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝕬𝕭𝕮𝕯𝕰𝕱𝕲𝕳𝕴𝕵𝕶𝕷𝕸𝕹𝕺𝕻𝕼𝕽𝕾𝕿𝖀𝖁𝖂𝖃𝖄𝖅', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf040 - 0xf059 - - T: "fraktur fetstilt" # (google translation) - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - T: "fraktur" # (google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝖆-𝖟": # 0x1d586 - 0x1d59f - - T: "fraktur fetstilt" # (google translation) - - spell: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" + - T: "fraktur" # (google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf05a - 0xf073 - - T: "fraktur fetstilt" # (google translation) - - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - T: "fraktur" # (google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" # double struck (blackboard bold) chars in math alphabetic block and also MathType private use area # Some of these are reserved because they were used in Plane 0 -- that shouldn't be an issue other than causing the other chars to not display - - "𝔸-𝕐": # 0x1d504 - 0x1d51d ('z' version is reserved) + - "𝔸-𝕐": # audit-ignore 0x1d504 - 0x1d51d ('z' version is reserved) - test: if: "$Verbosity!='Terse'" then: [T: "dubbelslaget"] # (en: 'double struck', google translation) - - spell: "translate('.', '𝔸𝔹𝔺𝔻𝔼𝔽𝔾𝔿𝕀𝕁𝕂𝕃𝕄𝕅𝕆𝕇𝕈𝕉𝕊𝕋𝕌𝕍𝕎𝕏𝕐', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - SPELL: "translate('.', '𝔸𝔹𝔺𝔻𝔼𝔽𝔾𝔿𝕀𝕁𝕂𝕃𝕄𝕅𝕆𝕇𝕈𝕉𝕊𝕋𝕌𝕍𝕎𝕏𝕐', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - "-": # 0xf080 - 0xf098 + - "-": # audit-ignore 0xf080 - 0xf098 - test: if: "$Verbosity!='Terse'" then: [T: "dubbelslaget"] # (en: 'double struck', google translation) - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - - "𝕒-𝕫": # 0x1d552 - 0x1d56b + - "𝕒-𝕫": # audit-ignore 0x1d552 - 0x1d56b - test: if: "$Verbosity!='Terse'" then: [T: "dubbelslaget"] # (en: 'double struck', google translation) - - spell: "translate('.', '𝕒𝕓𝕔𝕕𝕖𝕗𝕘𝕙𝕚𝕛𝕜𝕝𝕞𝕟𝕠𝕡𝕢𝕣𝕤𝕥𝕦𝕧𝕨𝕩𝕪𝕫', 'abcdefghijklmnopqrstuvwxyz')" - - "-": # 0xf09a - 0xf0b3 + - SPELL: "translate('.', '𝕒𝕓𝕔𝕕𝕖𝕗𝕘𝕙𝕚𝕛𝕜𝕝𝕞𝕟𝕠𝕡𝕢𝕣𝕤𝕥𝕦𝕧𝕨𝕩𝕪𝕫', 'abcdefghijklmnopqrstuvwxyz')" + - "-": # audit-ignore 0xf09a - 0xf0b3 - test: if: "$Verbosity!='Terse'" then: [T: "dubbelslaget"] # (en: 'double struck', google translation) - - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - - "𝟘-𝟡": # 0x1d7d8 - 0x1d7e1 + - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - "𝟘-𝟡": # audit-ignore 0x1d7d8 - 0x1d7e1 - test: if: "$Verbosity!='Terse'" then: [T: "dubbelslaget"] # (en: 'double struck', google translation) - - spell: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" - - "-": # 0xf0c0 - 0xf0c9 + - SPELL: "translate('.', '𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡', '0123456789')" + - "-": # audit-ignore 0xf0c0 - 0xf0c9 - test: if: "$Verbosity!='Terse'" then: [T: "dubbelslaget"] # (en: 'double struck', google translation) - - spell: "translate('.', '', '0123456789')" + - SPELL: "translate('.', '', '0123456789')" - "": [T: "dubbelslaget nabla"] # 0xf0ca (en: 'double struck nabla', google translation) - "": [T: "dubbelslagen eulerkonstant"] # 0xf0cb (en: 'double struck euler constant', google translation) @@ -3052,37 +3093,49 @@ # SWEDISH: We've used "skrivstilt" instead of skript for clarity - "𝒜-𝒵": # 0x1d49c - 0x1d4b5 - T: "skrivstilt" # (en: 'script', google translation) - - spell: "translate('.', '𝒜𝒝𝒞𝒟𝒠𝒡𝒢𝒣𝒤𝒥𝒦𝒧𝒨𝒩𝒪𝒫𝒬𝒭𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - SPELL: "translate('.', '𝒜𝒝𝒞𝒟𝒠𝒡𝒢𝒣𝒤𝒥𝒦𝒧𝒨𝒩𝒪𝒫𝒬𝒭𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf100 - 0xf119 - T: "skrivstilt" # (en: 'script', google translation) - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝒶-𝓏": # 0x1d4b6 - 0x1d4cf - T: "skrivstilt" # (en: 'script', google translation) - - spell: "translate('.', '𝒶𝒷𝒸𝒹𝒺𝒻𝒼𝒽𝒾𝒿𝓀𝓁𝓂𝓃𝓄𝓅𝓆𝓇𝓈𝓉𝓊𝓋𝓌𝓍𝓎𝓏', 'abcdefghijklmnopqrstuvwxyz')" + - SPELL: "translate('.', '𝒶𝒷𝒸𝒹𝒺𝒻𝒼𝒽𝒾𝒿𝓀𝓁𝓂𝓃𝓄𝓅𝓆𝓇𝓈𝓉𝓊𝓋𝓌𝓍𝓎𝓏', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf11a - 0xf133 - T: "skrivstilt" # (en: 'script', google translation) - - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" # bold script chars in math alphabetic block and also MathType private use area - "𝓐-𝓩": # 0x1d4d0 - 0x1d4e9 - - T: "skrivstilt fetstilt" # (en: 'script bold', google translation) - - spell: "translate('.', '𝓐𝓑𝓒𝓓𝓔𝓕𝓖𝓗𝓘𝓙𝓚𝓛𝓜𝓝𝓞𝓟𝓠𝓡𝓢𝓣𝓤𝓥𝓦𝓧𝓨𝓩', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - T: "skrivstilt" # (en: 'script bold', google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝓐𝓑𝓒𝓓𝓔𝓕𝓖𝓗𝓘𝓙𝓚𝓛𝓜𝓝𝓞𝓟𝓠𝓡𝓢𝓣𝓤𝓥𝓦𝓧𝓨𝓩', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf140 - 0xf159 - - T: "skrivstilt fetstilt" # (en: 'script bold', google translation) - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - T: "skrivstilt" # (en: 'script bold', google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝓪-𝔃": # 0x1d4ea - 0x1d503 - - T: "skrivstilt fetstilt" # (en: 'script bold', google translation) - - spell: "translate('.', '𝓪𝓫𝓬𝓭𝓮𝓯𝓰𝓱𝓲𝓳𝓴𝓵𝓶𝓷𝓸𝓹𝓺𝓻𝓼𝓽𝓾𝓿𝔀𝔁𝔂𝔃', 'abcdefghijklmnopqrstuvwxyz')" + - T: "skrivstilt" # (en: 'script bold', google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝓪𝓫𝓬𝓭𝓮𝓯𝓰𝓱𝓲𝓳𝓴𝓵𝓶𝓷𝓸𝓹𝓺𝓻𝓼𝓽𝓾𝓿𝔀𝔁𝔂𝔃', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf15a - 0xf173 - - T: "skrivstilt fetstilt" # (en: 'script bold', google translation) - - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - T: "skrivstilt" # (en: 'script bold', google translation) + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf180 - 0xf199 - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "": # 0xf19a - test: @@ -3137,377 +3190,411 @@ else: [x: "$SpeechOverrides_CapitalLetters"] - pitch: value: "$CapitalLetters_Pitch" - replace: [t: "danskt ö"] # (en: 'o with stroke', google translation) + replace: [T: "danskt ö"] # (en: 'o with stroke', google translation) # MathType only has a few of the cap Greek letters in PUA - - "": # 0xf201 - 0xf209 + - "": # audit-ignore 0xf201 - 0xf209 - test: if: "$Verbosity!='Terse'" then: [T: "dubbelslaget"] # (en: 'double struck', google translation) - - spell: "translate('.', '', 'ΔΨΛΠΣΘΓΩΥ')" + - SPELL: "translate('.', '', 'ΔΨΛΠΣΘΓΩΥ')" - - "-": # 0xf220 - 0xf236 + - "-": # audit-ignore 0xf220 - 0xf236 - test: if: "$Verbosity!='Terse'" then: [T: "dubbelslaget"] # (en: 'double struck', google translation) - - spell: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - SPELL: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - "": [T: "dubbelslaget slutsigma"] # 0xf237 (en: 'double struck final sigma', google translation) - "": [T: "dubbelslaget rho"] # 0xf250 (en: 'double struck rho', google translation) - "": [T: "dubbelslaget fi"] # 0xf251 (en: 'double struck phi', google translation) - "𝐀-𝐙": # 0x1d400 - 0x1d419 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf260 - 0xf279 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝐚-𝐳": # 0x1d41a - 0x1d433 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '𝐚𝐛𝐜𝐝𝐞𝐟𝐠𝐡𝐢𝐣𝐤𝐥𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐭𝐮𝐯𝐰𝐱𝐲𝐳', 'abcdefghijklmnopqrstuvwxyz')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝐚𝐛𝐜𝐝𝐞𝐟𝐠𝐡𝐢𝐣𝐤𝐥𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐭𝐮𝐯𝐰𝐱𝐲𝐳', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf27a - 0xf293 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - "𝐴-𝑍": # 0x1d434 - 0x1d44d - - spell: "translate('.', '𝐴𝐵𝐶𝐷𝐸𝐹𝐺𝐻𝐼𝐽𝐾𝐿𝑀𝑁𝑂𝑃𝑄𝑅𝑆𝑇𝑈𝑉𝑊𝑋𝑌𝑍', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - SPELL: "translate('.', '𝐴𝐵𝐶𝐷𝐸𝐹𝐺𝐻𝐼𝐽𝐾𝐿𝑀𝑁𝑂𝑃𝑄𝑅𝑆𝑇𝑈𝑉𝑊𝑋𝑌𝑍', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf294 - 0xf2ad - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝑎-𝑧": # 0x1d44e - 0x1d467 - - spell: "translate('.', '𝑎𝑏𝑐𝑑𝑒𝑓𝑔𝑕𝑖𝑗𝑘𝑙𝑚𝑛𝑜𝑝𝑞𝑟𝑠𝑡𝑢𝑣𝑤𝑥𝑦𝑧', 'abcdefghijklmnopqrstuvwxyz')" + - SPELL: "translate('.', '𝑎𝑏𝑐𝑑𝑒𝑓𝑔𝑕𝑖𝑗𝑘𝑙𝑚𝑛𝑜𝑝𝑞𝑟𝑠𝑡𝑢𝑣𝑤𝑥𝑦𝑧', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf2ae - 0xf2c7 - - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - "𝑨-𝒁": # 0x1d468 - 0x1d481 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '𝑨𝑩𝑪𝑫𝑬𝑭𝑮𝑯𝑰𝑱𝑲𝑳𝑴𝑵𝑶𝑷𝑸𝑹𝑺𝑻𝑼𝑽𝑾𝑿𝒀𝒁', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝑨𝑩𝑪𝑫𝑬𝑭𝑮𝑯𝑰𝑱𝑲𝑳𝑴𝑵𝑶𝑷𝑸𝑹𝑺𝑻𝑼𝑽𝑾𝑿𝒀𝒁', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf2c8 - 0xf2e1 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝒂-𝒛": # 0x1d482 - 0x1d49b - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf2e2 - 0xf2fb - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - "𝖠-𝖹": # 0x1d5a0 - 0x1d5b9 - - spell: "translate('.', '𝖠𝖡𝖢𝖣𝖤𝖥𝖦𝖧𝖨𝖩𝖪𝖫𝖬𝖭𝖮𝖯𝖰𝖱𝖲𝖳𝖴𝖵𝖶𝖷𝖸𝖹', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - SPELL: "translate('.', '𝖠𝖡𝖢𝖣𝖤𝖥𝖦𝖧𝖨𝖩𝖪𝖫𝖬𝖭𝖮𝖯𝖰𝖱𝖲𝖳𝖴𝖵𝖶𝖷𝖸𝖹', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf300 - 0xf319 - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝖺-𝗓": # 0x1d5ba - 0x1d5d3 - - spell: "translate('.', '𝖺𝖻𝖼𝖽𝖾𝖿𝗀𝗁𝗂𝗃𝗄𝗅𝗆𝗇𝗈𝗉𝗊𝗋𝗌𝗍𝗎𝗏𝗐𝗑𝗒𝗓', 'abcdefghijklmnopqrstuvwxyz')" + - SPELL: "translate('.', '𝖺𝖻𝖼𝖽𝖾𝖿𝗀𝗁𝗂𝗃𝗄𝗅𝗆𝗇𝗈𝗉𝗊𝗋𝗌𝗍𝗎𝗏𝗐𝗑𝗒𝗓', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf31a - 0xf333 - - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - "𝗔-𝗭": # 0x1d5d4 - 0x1d5ed - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '𝗔𝗕𝗖𝗗𝗘𝗙𝗚𝗛𝗜𝗝𝗞𝗟𝗠𝗡𝗢𝗣𝗤𝗥𝗦𝗧𝗨𝗩𝗪𝗫𝗬𝗭', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝗔𝗕𝗖𝗗𝗘𝗙𝗚𝗛𝗜𝗝𝗞𝗟𝗠𝗡𝗢𝗣𝗤𝗥𝗦𝗧𝗨𝗩𝗪𝗫𝗬𝗭', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf334 - 0xf34d - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝗮-𝘇": # 0x1d5ee - 0x1d607 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '𝗮𝗯𝗰𝗱𝗲𝗳𝗴𝗵𝗶𝗷𝗸𝗹𝗺𝗻𝗼𝗽𝗾𝗿𝘀𝘁𝘂𝘃𝘄𝘅𝘆𝘇', 'abcdefghijklmnopqrstuvwxyz')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝗮𝗯𝗰𝗱𝗲𝗳𝗴𝗵𝗶𝗷𝗸𝗹𝗺𝗻𝗼𝗽𝗾𝗿𝘀𝘁𝘂𝘃𝘄𝘅𝘆𝘇', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf34e - 0xf367 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - "𝘈-𝘡": # 0x1d608 - 0x1d621 - - spell: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - SPELL: "translate('.', '𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf368 - 0xf381 - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝘢-𝘻": # 0x1d622 - 0x1d63b - - spell: "translate('.', '𝘢𝘣𝘤𝘥𝘦𝘧𝘨𝘩𝘪𝘫𝘬𝘭𝘮𝘯𝘰𝘱𝘲𝘳𝘴𝘵𝘶𝘷𝘸𝘹𝘺𝘻', 'abcdefghijklmnopqrstuvwxyz')" + - SPELL: "translate('.', '𝘢𝘣𝘤𝘥𝘦𝘧𝘨𝘩𝘪𝘫𝘬𝘭𝘮𝘯𝘰𝘱𝘲𝘳𝘴𝘵𝘶𝘷𝘸𝘹𝘺𝘻', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf382 - 0xf39b - - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - "𝘼-𝙕": # 0x1d63c - 0x1d655 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '𝘼𝘽𝘾𝘿𝙀𝙁𝙂𝙃𝙄𝙅𝙆𝙇𝙈𝙉𝙊𝙋𝙌𝙍𝙎𝙏𝙐𝙑𝙒𝙓𝙔𝙕', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝘼𝘽𝘾𝘿𝙀𝙁𝙂𝙃𝙄𝙅𝙆𝙇𝙈𝙉𝙊𝙋𝙌𝙍𝙎𝙏𝙐𝙑𝙒𝙓𝙔𝙕', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf39c - 0xf3b5 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝙖-𝙯": # 0x1d656 - 0x1d66f - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '𝙖𝙗𝙘𝙙𝙚𝙛𝙜𝙝𝙞𝙟𝙠𝙡𝙢𝙣𝙤𝙥𝙦𝙧𝙨𝙩𝙪𝙫𝙬𝙭𝙮𝙯', 'abcdefghijklmnopqrstuvwxyz')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝙖𝙗𝙘𝙙𝙚𝙛𝙜𝙝𝙞𝙟𝙠𝙡𝙢𝙣𝙤𝙥𝙦𝙧𝙨𝙩𝙪𝙫𝙬𝙭𝙮𝙯', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf3b6 - 0xf3cf - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - "𝙰-𝚉": # 0x1d670 - 0x1d689 - - spell: "translate('.', '𝙰𝙱𝙲𝙳𝙴𝙵𝙶𝙷𝙸𝙹𝙺𝙻𝙼𝙽𝙾𝙿𝚀𝚁𝚂𝚃𝚄𝚅𝚆𝚇𝚈𝚉', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - SPELL: "translate('.', '𝙰𝙱𝙲𝙳𝙴𝙵𝙶𝙷𝙸𝙹𝙺𝙻𝙼𝙽𝙾𝙿𝚀𝚁𝚂𝚃𝚄𝚅𝚆𝚇𝚈𝚉', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "-": # 0xf3d0 - 0xf3e9 - - spell: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + - SPELL: "translate('.', '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" - "𝚊-𝚣": # 0x1d68a - 0x1d6a3 - - spell: "translate('.', '𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚢𝚣', 'abcdefghijklmnopqrstuvwxyz')" + - SPELL: "translate('.', '𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚢𝚣', 'abcdefghijklmnopqrstuvwxyz')" - "-": # 0xf3ea - 0xf403 - - spell: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" + - SPELL: "translate('.', '', 'abcdefghijklmnopqrstuvwxyz')" - - "": [t: "i utan prick"] # 0xf404 (google translation) + - "": [T: "i utan prick"] # 0xf404 (google translation) - "𝚤": [T: "kursivt i utan prick"] # 0x1d6a4 (en: 'dotless i', google: 'dotless i') - "𝚥": [T: "kursivt j utan prick"] # 0x1d6a5 (en: 'dotless j', google: 'dotless j') - "𝚨-𝛀": # 0x1d6a8 - 0x1d6c0 - - T: "fetstilt" # (en: 'bold', google: 'djärv') - - spell: "translate('.', '𝚨𝚩𝚪𝚫𝚬𝚭𝚮𝚯𝚰𝚱𝚲𝚳𝚴𝚵𝚶𝚷𝚸𝚹𝚺𝚻𝚼𝚽𝚾𝚿𝛀', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝚨𝚩𝚪𝚫𝚬𝚭𝚮𝚯𝚰𝚱𝚲𝚳𝚴𝚵𝚶𝚷𝚸𝚹𝚺𝚻𝚼𝚽𝚾𝚿𝛀', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - "-": # 0xf408 - 0xf420 - - T: "fetstilt" # (en: 'bold', google: 'djärv') - - spell: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - "𝛂-𝛚": # 0x1d6c2 - 0x1d6da - - T: "fetstilt" # (en: 'bold', google: 'djärv') - - spell: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙𝛚', 'αβγδεζηθικλμνξοπρςστυφχψω')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝛂𝛃𝛄𝛅𝛆𝛇𝛈𝛉𝛊𝛋𝛌𝛍𝛎𝛏𝛐𝛑𝛒𝛓𝛔𝛕𝛖𝛗𝛘𝛙𝛚', 'αβγδεζηθικλμνξοπρςστυφχψω')" - "-": # 0xf422 - 0xf43a - - T: "fetstilt" # (en: 'bold', google: 'djärv') - - spell: "translate('.', '', 'αβγδεζηθικλμνξοπρςστυφχψω')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'αβγδεζηθικλμνξοπρςστυφχψω')" - "": [T: "fetstilt nabla"] # 0xf421 (en: 'bold nabla', google translation) - "𝛁": [T: "fetstilt nabla"] # 0x1d6c1 (en: 'bold nabla', google translation) - "𝛛𝛜𝛝𝛞𝛟𝛠𝛡": # 0x1D6DB - 0x1D6E1 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '𝛛𝛜𝛝𝛞𝛟𝛠𝛡', '∂εθκφρπ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝛛𝛜𝛝𝛞𝛟𝛠𝛡', '∂εθκφρπ')" - "": # 0xF43C - 0xF441 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '', '∂εθκφρπ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', '∂εθκφρπ')" - "𝛢-𝛺": # 0x1d6e2 - 0x1d6fa - - spell: "translate('.', '𝛢𝛣𝛤𝛥𝛦𝛧𝛨𝛩𝛪𝛫𝛬𝛭𝛮𝛯𝛰𝛱𝛲𝛳𝛴𝛵𝛶𝛷𝛸𝛹𝛺', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - SPELL: "translate('.', '𝛢𝛣𝛤𝛥𝛦𝛧𝛨𝛩𝛪𝛫𝛬𝛭𝛮𝛯𝛰𝛱𝛲𝛳𝛴𝛵𝛶𝛷𝛸𝛹𝛺', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - "-": # 0xf442 - 0xf45a - - spell: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - SPELL: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - "𝛼-𝜔": # 0x1d6fc - 0x1d714 - - spell: "translate('.', '𝛼𝛽𝛾𝛿𝜀𝜁𝜂𝜃𝜄𝜅𝜆𝜇𝜈𝜉𝜊𝜋𝜌𝜍𝜎𝜏𝜐𝜑𝜒𝜓𝜔', 'αβγδεζηθικλμνξοπρςστυφχψω')" + - SPELL: "translate('.', '𝛼𝛽𝛾𝛿𝜀𝜁𝜂𝜃𝜄𝜅𝜆𝜇𝜈𝜉𝜊𝜋𝜌𝜍𝜎𝜏𝜐𝜑𝜒𝜓𝜔', 'αβγδεζηθικλμνξοπρςστυφχψω')" - "-": # 0xf45c - 0xf474 - - spell: "translate('.', '', 'αβγδεζηθικλμνξοπρςστυφχψω')" + - SPELL: "translate('.', '', 'αβγδεζηθικλμνξοπρςστυφχψω')" - "": [T: "kursivt nabla"] # 0xf45b (en: 'italic nabla', google translation) - "𝛻": [T: "kursivt nabla"] # 0x1d6fb (en: 'italic nabla', google translation) - "𝜕𝜖𝜗𝜘𝜙𝜚𝜛": # 0x1d715 - 0x1d71b - - spell: "translate('.', '𝜕𝜖𝜗𝜘𝜙𝜚𝜛', '∂εθκφρπ')" + - SPELL: "translate('.', '𝜕𝜖𝜗𝜘𝜙𝜚𝜛', '∂εθκφρπ')" - "": # 0xf475 - 0xf47b - - spell: "translate('.', '', '∂εθκφρπ')" + - SPELL: "translate('.', '', '∂εθκφρπ')" - "𝜜-𝜴": # 0x1d71c - 0x1d734 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '𝜜𝜝𝜞𝜟𝜠𝜡𝜢𝜣𝜤𝜥𝜦𝜧𝜨𝜩𝜪𝜫𝜬𝜭𝜮𝜯𝜰𝜱𝜲𝜳𝜴', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝜜𝜝𝜞𝜟𝜠𝜡𝜢𝜣𝜤𝜥𝜦𝜧𝜨𝜩𝜪𝜫𝜬𝜭𝜮𝜯𝜰𝜱𝜲𝜳𝜴', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - "-": # 0xf47c - 0xf494 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - "𝜶-𝝎": # 0x1d736 - 0x1d74e - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '𝜶𝜷𝜸𝜹𝜺𝜻𝜼𝜽𝜾𝜿𝝀𝝁𝝂𝝃𝝄𝝅𝝆𝝇𝝈𝝉𝝊𝝋𝝌𝝍𝝎', 'αβγδεζηθικλμνξοπρςστυφχψω')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝜶𝜷𝜸𝜹𝜺𝜻𝜼𝜽𝜾𝜿𝝀𝝁𝝂𝝃𝝄𝝅𝝆𝝇𝝈𝝉𝝊𝝋𝝌𝝍𝝎', 'αβγδεζηθικλμνξοπρςστυφχψω')" - "-": # 0xf496 - 0xf4ae - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '', 'αβγδεζηθικλμνξοπρςστυφχψω')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'αβγδεζηθικλμνξοπρςστυφχψω')" - "𝝏𝝐𝝑𝝒𝝓𝝔𝝕": # 0x1d74f - 0x1d755 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '𝝏𝝐𝝑𝝒𝝓𝝔𝝕', '∂εθκφρπ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝝏𝝐𝝑𝝒𝝓𝝔𝝕', '∂εθκφρπ')" - "": # 0xf422 - 0xf43a - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '', '∂εθκφρπ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', '∂εθκφρπ')" - "𝜵": [T: "fetstilt kursivt nabla"] # 0x1d735 (en: 'bold italic nabla', google translation) - "": [T: "fetstilt kursivt nabla"] # 0xf495 (en: 'bold italic nabla', google translation) - "𝝖-𝝮": # 0x1d756 - 0x1d76e - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '𝝖𝝗𝝘𝝙𝝚𝝛𝝜𝝝𝝞𝝟𝝠𝝡𝝢𝝣𝝤𝝥𝝦𝝧𝝨𝝩𝝪𝝫𝝬𝝭𝝮', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝝖𝝗𝝘𝝙𝝚𝝛𝝜𝝝𝝞𝝟𝝠𝝡𝝢𝝣𝝤𝝥𝝦𝝧𝝨𝝩𝝪𝝫𝝬𝝭𝝮', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - "-": # 0xf4b6 - 0xf4ce - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - "𝝰-𝞈": # 0x1d770 - 0x1d788 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '𝝰𝝱𝝲𝝳𝝴𝝵𝝶𝝷𝝸𝝹𝝺𝝻𝝼𝝽𝝾𝝿𝞀𝞁𝞂𝞃𝞄𝞅𝞆𝞇𝞈', 'αβγδεζηθικλμνξοπρςστυφχψω')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝝰𝝱𝝲𝝳𝝴𝝵𝝶𝝷𝝸𝝹𝝺𝝻𝝼𝝽𝝾𝝿𝞀𝞁𝞂𝞃𝞄𝞅𝞆𝞇𝞈', 'αβγδεζηθικλμνξοπρςστυφχψω')" - "-": # 0xf4d0 - 0xf4e8 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '', 'αβγδεζηθικλμνξοπρςστυφχψω')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'αβγδεζηθικλμνξοπρςστυφχψω')" - "𝞉𝞊𝞋𝞌𝞍𝞎𝞏": # 0x1d789 - 0x1d78f - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '𝞉𝞊𝞋𝞌𝞍𝞎𝞏', '∂εθκφρπ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝞉𝞊𝞋𝞌𝞍𝞎𝞏', '∂εθκφρπ')" - "": # 0xf4e9 - 0xf4ef - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '', '∂εθκφρπ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', '∂εθκφρπ')" - "": [T: "fetstilt nabla"] # 0xf4cf (en: 'bold nabla', google translation) - "𝝯": [T: "fetstilt nabla"] # 0x1d76f (en: 'bold nabla', google translation) - "𝞐-𝞨": # 0x1d790 - 0x1d7a8 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '𝞐𝞑𝞒𝞓𝞔𝞕𝞖𝞗𝞘𝞙𝞚𝞛𝞜𝞝𝞞𝞟𝞠𝞡𝞢𝞣𝞤𝞥𝞦𝞧𝞨', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝞐𝞑𝞒𝞓𝞔𝞕𝞖𝞗𝞘𝞙𝞚𝞛𝞜𝞝𝞞𝞟𝞠𝞡𝞢𝞣𝞤𝞥𝞦𝞧𝞨', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - "-": # 0xf4f0 - 0xf508 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ')" - "𝞪-𝟂": # 0x1d7aa - 0x1d7c2 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '𝞪𝞫𝞬𝞭𝞮𝞯𝞰𝞱𝞲𝞳𝞴𝞵𝞶𝞷𝞸𝞹𝞺𝞻𝞼𝞽𝞾𝞿𝟀𝟁𝟂', 'αβγδεζηθικλμνξοπρςστυφχψω')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝞪𝞫𝞬𝞭𝞮𝞯𝞰𝞱𝞲𝞳𝞴𝞵𝞶𝞷𝞸𝞹𝞺𝞻𝞼𝞽𝞾𝞿𝟀𝟁𝟂', 'αβγδεζηθικλμνξοπρςστυφχψω')" - "-": # 0xf50a - 0xf522 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '', 'αβγδεζηθικλμνξοπρςστυφχψω')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', 'αβγδεζηθικλμνξοπρςστυφχψω')" - "𝟃𝟄𝟅𝟆𝟇𝟈𝟉": # 0x1d7c3 - 0x1d7c9 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '𝟃𝟄𝟅𝟆𝟇𝟈𝟉', '∂εθκφρπ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝟃𝟄𝟅𝟆𝟇𝟈𝟉', '∂εθκφρπ')" - "": # 0xf523 - 0xf529 - - T: "fetstilt" # (en: 'bold', google translation) - - spell: "translate('.', '', '∂εθκφρπ')" + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', '∂εθκφρπ')" - "": [T: "fetstilt nabla"] # 0xf509 (en: 'bold nabla', google translation) - "𝞩": [T: "fetstilt nabla"] # 0x1d7a9 (en: 'bold nabla', google translation) - - "": [T: "fetstilt noll"] # 0xf52e (en: 'bold zero', google translation) - - "𝟎": [T: "fetstilt noll"] # 0x1d7ce (en: 'bold zero', google translation) - - "": [T: "fetstilt ett"] # 0xf52f (en: 'bold one', google translation) - - "𝟏": [T: "fetstilt ett"] # 0x1d7cf (en: 'bold one', google translation) - - "": [T: "fetstilt två"] # 0xf530 (en: 'bold two', google translation) - - "𝟐": [T: "fetstilt två"] # 0x1d7d0 (en: 'bold two', google translation) - - "": [T: "fetstilt tre"] # 0xf531 (en: 'bold three', google translation) - - "𝟑": [T: "fetstilt tre"] # 0x1d7d1 (en: 'bold three', google translation) - - "": [T: "fetstilt fyra"] # 0xf532 (en: 'bold four', google translation) - - "𝟒": [T: "fetstilt fyra"] # 0x1d7d2 (en: 'bold four', google translation) - - "": [T: "fetstilt fem"] # 0xf533 (en: 'bold five', google translation) - - "𝟓": [T: "fetstilt fem"] # 0x1d7d3 (en: 'bold five', google translation) - - "": [T: "fetstilt sex"] # 0xf534 (en: 'bold six', google translation) - - "𝟔": [T: "fetstilt sex"] # 0x1d7d4 (en: 'bold six', google translation) - - "": [T: "fetstilt sju"] # 0xf535 (en: 'bold seven', google translation) - - "𝟕": [T: "fetstilt sju"] # 0x1d7d5 (en: 'bold seven', google translation) - - "": [T: "fetstilt åtta"] # 0xf536 (en: 'bold eight', google translation) - - "𝟖": [T: "fetstilt åtta"] # 0x1d7d6 (en: 'bold eight', google translation) - - "": [T: "fetstilt nio"] # 0xf537 (en: 'bold nine', google translation) - - "𝟗": [T: "fetstilt nio"] # 0x1d7d7 (en: 'bold nine', google translation) - - "": [T: "noll"] # 0xf542 (en: 'zero', google translation) - - "𝟢": [T: "noll"] # 0x1d7e2 (en: 'zero', google translation) - - "": [T: "ett"] # 0xf543 (en: 'one', google translation) - - "𝟣": [T: "ett"] # 0x1d7e3 (en: 'one', google translation) - - "": [T: "två"] # 0xf544 (en: 'two', google translation) - - "𝟤": [T: "två"] # 0x1d7e4 (en: 'two', google translation) - - "": [T: "tre"] # 0xf545 (en: 'three', google translation) - - "𝟥": [T: "tre"] # 0x1d7e5 (en: 'three', google translation) - - "": [T: "fyra"] # 0xf546 (en: 'four', google translation) - - "𝟦": [T: "fyra"] # 0x1d7e6 (en: 'four', google translation) - - "": [T: "fem"] # 0xf547 (en: 'five', google translation) - - "𝟧": [T: "fem"] # 0x1d7e7 (en: 'five', google translation) - - "": [T: "sex"] # 0xf548 (en: 'six', google translation) - - "𝟨": [T: "sex"] # 0x1d7e8 (en: 'six', google translation) - - "": [T: "sju"] # 0xf549 (en: 'seven', google translation) - - "𝟩": [T: "sju"] # 0x1d7e9 (en: 'seven', google translation) - - "": [T: "åtta"] # 0xf54a (en: 'eight', google translation) - - "𝟪": [T: "åtta"] # 0x1d7ea (en: 'eight', google translation) - - "": [T: "nio"] # 0xf54b (en: 'nine', google translation) - - "𝟫": [T: "nio"] # 0x1d7eb (en: 'nine', google translation) - - "": [T: "fetstilt noll"] # 0xf54c (en: 'bold zero', google translation) - - "𝟬": [T: "fetstilt noll"] # 0x1d7ec (en: 'bold zero', google translation) - - "": [T: "fetstilt ett"] # 0xf54d (en: 'bold one', google translation) - - "𝟭": [T: "fetstilt ett"] # 0x1d7ed (en: 'bold one', google translation) - - "": [T: "fetstilt två"] # 0xf54e (en: 'bold two', google translation) - - "𝟮": [T: "fetstilt två"] # 0x1d7ee (en: 'bold two', google translation) - - "": [T: "fetstilt tre"] # 0xf54f (en: 'bold three', google translation) - - "𝟯": [T: "fetstilt tre"] # 0x1d7ef (en: 'bold three', google translation) - - "": [T: "fetstilt fyra"] # 0xf550 (en: 'bold four', google translation) - - "𝟰": [T: "fetstilt fyra"] # 0x1d7f0 (en: 'bold four', google translation) - - "": [T: "fetstilt fem"] # 0xf551 (en: 'bold five', google translation) - - "𝟱": [T: "fetstilt fem"] # 0x1d7f1 (en: 'bold five', google translation) - - "": [T: "fetstilt sex"] # 0xf552 (en: 'bold six', google translation) - - "𝟲": [T: "fetstilt sex"] # 0x1d7f2 (en: 'bold six', google translation) - - "": [T: "fetstilt sju"] # 0xf553 (en: 'bold seven', google translation) - - "𝟳": [T: "fetstilt sju"] # 0x1d7f3 (en: 'bold seven', google translation) - - "": [T: "fetstilt åtta"] # 0xf554 (en: 'bold eight', google translation) - - "𝟴": [T: "fetstilt åtta"] # 0x1d7f4 (en: 'bold eight', google translation) - - "": [T: "fetstilt nio"] # 0xf555 (en: 'bold nine', google translation) - - "𝟵": [T: "fetstilt nio"] # 0x1d7f5 (en: 'bold nine', google translation) - - "": [T: "noll"] # 0xf556 (en: 'zero', google translation) - - "𝟶": [T: "noll"] # 0x1d7f6 (en: 'zero', google translation) - - "": [T: "ett"] # 0xf557 (en: 'one', google translation) - - "𝟷": [T: "ett"] # 0x1d7f7 (en: 'one', google translation) - - "": [T: "två"] # 0xf558 (en: 'two', google translation) - - "𝟸": [T: "två"] # 0x1d7f8 (en: 'two', google translation) - - "": [T: "tre"] # 0xf559 (en: 'three', google translation) - - "𝟹": [T: "tre"] # 0x1d7f9 (en: 'three', google translation) - - "": [T: "fyra"] # 0xf55a (en: 'four', google translation) - - "𝟺": [T: "fyra"] # 0x1d7fa (en: 'four', google translation) - - "": [T: "fem"] # 0xf55b (en: 'five', google translation) - - "𝟻": [T: "fem"] # 0x1d7fb (en: 'five', google translation) - - "": [T: "sex"] # 0xf55c (en: 'six', google translation) - - "𝟼": [T: "sex"] # 0x1d7fc (en: 'six', google translation) - - "": [T: "sju"] # 0xf55d (en: 'seven', google translation) - - "𝟽": [T: "sju"] # 0x1d7fd (en: 'seven', google translation) - - "": [T: "åtta"] # 0xf55e (en: 'eight', google translation) - - "𝟾": [T: "åtta"] # 0x1d7fe (en: 'eight', google translation) - - "": [T: "nio"] # 0xf55f (en: 'nine', google translation) - - "𝟿": [T: "nio"] # 0x1d7ff (en: 'nine', google translation) + - "-": # 0xf52e - 0xf537 (old MathType) + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', '0123456789')" + + - "𝟎-𝟗": # 0x1d7ce - 0x1d7d7 + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗', '0123456789')" + + - "-": # 0xf52e - 0xf537 (old MathType) + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '', '0123456789')" + + - "𝟬-𝟵": # 0x1D7EC - 0x1D7F5 + - test: + if: "not($IgnoreBold)" + then: [T: "fetstilt"] + - SPELL: "translate('.', '𝟬𝟭𝟮𝟯𝟰𝟱𝟲𝟳𝟴𝟵', '0123456789')" + + - "-": # 0xf556 - 0xf55f (old MathType) + - SPELL: "translate('.', '', '0123456789')" + + - "𝟢-𝟫": # 0x1d7e2 - 0x1d7eb + - SPELL: "translate('.', '𝟶𝟷𝟸𝟹𝟺𝟻𝟼𝟽𝟾𝟿', '0123456789')" + + - "𝟶-𝟿": # 0x1d7f6 - 0x1d7ff + - SPELL: "translate('.', '𝟶𝟷𝟸𝟹𝟺𝟻𝟼𝟽𝟾𝟿', '0123456789')" + + - "": [T: "okänt tecken"] # 0xf700 (en: 'unknown character', google translation) - - "": [t: "nedre högra och nedre vänstra trianglar"] # 0xf726 (en: 'lower right and lower left triangles', google translation) - - "": [t: "horisontell ellips förlängare"] # 0xf72d (en: 'horizontal ellipsis extender', google translation) - - "": [t: "mittlinje horisontell ellipsisförlängare"] # 0xf72e (en: 'midline horizontal ellipsis extender', google translation) - - "": [t: "radikal förlängare"] # 0xf8e5 (en: 'radical extender', google translation) - - "": [t: "vertikal pil förlängare"] # 0xf8e6 (en: 'vertical arrow extender', google translation) - - "": [t: "horisontell pil förlängare"] # 0xf8e7 (en: 'horizontal arrow extender', google translation) - - "": [t: "registrerad"] # 0xf8e8 (en: 'registered sign sans serif', google translation) - - "": [t: "copyright"] # 0xf8e9 (google translation) - - "": [t: "trade mark"] # 0xf8ea (google translation) - - "": [t: "vänster-parentes topp"] # 0xf8eb (en: 'left paren top', google translation) - - "": [t: "vänster-parentes förlängare"] # 0xf8ec (en: 'left paren extender', google translation) - - "": [t: "vänster-parentes botten"] # 0xf8ed (en: 'left paren bottom', google translation) - - "": [t: "vänster hak-parentes"] # 0xf8ee (en: 'left bracket top', google translation) - - "": [t: "vänster hak-parentes förlängare"] # 0xf8ef (en: 'left bracket extender', google translation) - - "": [t: "vänster hak-parentes botten"] # 0xf8f0 (en: 'left bracket bottom', google translation) - - "": [t: "vänster hak-parentes topp"] # 0xf8f1 (en: 'left brace top', google translation) - - "": [t: "lämnade hak-parentes mitten"] # 0xf8f2 (en: 'left brace mid', google translation) - - "": [t: "vänster klammer-parentes botten"] # 0xf8f3 (en: 'left brace bottom', google translation) - - "": [t: "klammer-parentes förlängare"] # 0xf8f4 (en: 'brace extender', google translation) - - "": [t: "integral förlängare"] # 0xf8f5 (en: 'integral extender', google translation) - - "": [t: "höger-parentes topp"] # 0xf8f6 (en: 'right paren top', google translation) - - "": [t: "höger-parentes förlängare"] # 0xf8f7 (en: 'right paren extender', google translation) - - "": [t: "höger-parentes botten"] # 0xf8f8 (en: 'right paren bottom', google translation) - - "": [t: "höger hak-parentes"] # 0xf8f9 (en: 'right bracket top', google translation) - - "": [t: "höger hak-parentes förlängare"] # 0xf8fa (en: 'right bracket extender', google translation) - - "": [t: "höger hak-parentes botten"] # 0xf8fb (en: 'right bracket bottom', google translation) - - "": [t: "höger klammer-parentes topp"] # 0xf8fc (en: 'right brace top', google translation) - - "": [t: "höger klammer-parentes mitten"] # 0xf8fd (en: 'right brace mid', google translation) - - "": [t: "höger klammer-parentes botten"] # 0xf8fe (en: 'right brace bottom', google translation) - - "": [t: "apple-logotyp"] # 0xf8ff (en: 'apple logo', google translation) + - "": [T: "nedre högra och nedre vänstra trianglar"] # 0xf726 (en: 'lower right and lower left triangles', google translation) + - "": [T: "horisontell ellips förlängare"] # 0xf72d (en: 'horizontal ellipsis extender', google translation) + - "": [T: "mittlinje horisontell ellipsisförlängare"] # 0xf72e (en: 'midline horizontal ellipsis extender', google translation) + - "": [T: "radikal förlängare"] # 0xf8e5 (en: 'radical extender', google translation) + - "": [T: "vertikal pil förlängare"] # 0xf8e6 (en: 'vertical arrow extender', google translation) + - "": [T: "horisontell pil förlängare"] # 0xf8e7 (en: 'horizontal arrow extender', google translation) + - "": [T: "registrerad"] # 0xf8e8 (en: 'registered sign sans serif', google translation) + - "": [T: "copyright"] # 0xf8e9 (google translation) + - "": [T: "trade mark"] # 0xf8ea (google translation) + - "": [T: "vänster-parentes topp"] # 0xf8eb (en: 'left paren top', google translation) + - "": [T: "vänster-parentes förlängare"] # 0xf8ec (en: 'left paren extender', google translation) + - "": [T: "vänster-parentes botten"] # 0xf8ed (en: 'left paren bottom', google translation) + - "": [T: "vänster hak-parentes"] # 0xf8ee (en: 'left bracket top', google translation) + - "": [T: "vänster hak-parentes förlängare"] # 0xf8ef (en: 'left bracket extender', google translation) + - "": [T: "vänster hak-parentes botten"] # 0xf8f0 (en: 'left bracket bottom', google translation) + - "": [T: "vänster hak-parentes topp"] # 0xf8f1 (en: 'left brace top', google translation) + - "": [T: "lämnade hak-parentes mitten"] # 0xf8f2 (en: 'left brace mid', google translation) + - "": [T: "vänster klammer-parentes botten"] # 0xf8f3 (en: 'left brace bottom', google translation) + - "": [T: "klammer-parentes förlängare"] # 0xf8f4 (en: 'brace extender', google translation) + - "": [T: "integral förlängare"] # 0xf8f5 (en: 'integral extender', google translation) + - "": [T: "höger-parentes topp"] # 0xf8f6 (en: 'right paren top', google translation) + - "": [T: "höger-parentes förlängare"] # 0xf8f7 (en: 'right paren extender', google translation) + - "": [T: "höger-parentes botten"] # 0xf8f8 (en: 'right paren bottom', google translation) + - "": [T: "höger hak-parentes"] # 0xf8f9 (en: 'right bracket top', google translation) + - "": [T: "höger hak-parentes förlängare"] # 0xf8fa (en: 'right bracket extender', google translation) + - "": [T: "höger hak-parentes botten"] # 0xf8fb (en: 'right bracket bottom', google translation) + - "": [T: "höger klammer-parentes topp"] # 0xf8fc (en: 'right brace top', google translation) + - "": [T: "höger klammer-parentes mitten"] # 0xf8fd (en: 'right brace mid', google translation) + - "": [T: "höger klammer-parentes botten"] # 0xf8fe (en: 'right brace bottom', google translation) + - "": [T: "apple-logotyp"] # 0xf8ff (en: 'apple logo', google translation) - "ff": [T: "f f"] # 0xfb00 (en: 'ff', google: 'ff') - "fi": [T: "f i"] # 0xfb01 (en: 'fi', google: 'fi') - "fl": [T: "f l"] # 0xfb02 (en: 'fl', google: 'fl') @@ -3515,19 +3602,94 @@ - "ffl": [T: "f f l"] # 0xfb04 (en: 'ffl', google: 'ffl') - "ſt": [T: "f t"] # 0xfb05 (en: 'ft', google translation) - "st": [T: "s t"] # 0xfb06 (google translation) + - "﬩": [T: "plus"] # 0xfb29 - "︠": [T: "ligatur vänster halva"] # 0xfe20 (en: 'ligature left half embellishment', google translation) - "︡": [T: "ligatur höger halva"] # 0xfe21 (en: 'ligature right half embellishment', google translation) - "︢": [T: "dubbel tilde vänster halva"] # 0xfe22 (en: 'double tilde left half embellishment', google translation) - "︣": [T: "dubbel tilde höger halva"] # 0xfe23 (en: 'double tilde right half embellishment', google translation) - - "︤": [t: "makron vänster halva"] # 0xfe24 (en: 'macron left half embellishment', google translation) - - "︥": [t: "makron höger halva"] # 0xfe25 (en: 'macron right half embellishment', google translation) - - "︦": [t: "makron"] # 0xfe26 (en: 'conjoining macron embellishment', google translation) + - "︤": [T: "makron vänster halva"] # 0xfe24 (en: 'macron left half embellishment', google translation) + - "︥": [T: "makron höger halva"] # 0xfe25 (en: 'macron right half embellishment', google translation) + - "︦": [T: "makron"] # 0xfe26 (en: 'conjoining macron embellishment', google translation) - "︵": [T: "parentes över"] # 0xfe35 - "︶": [T: "parentes under"] # 0xfe36 - "︷": [T: "klammer-parentes över"] # 0xfe37 (en: 'over brace') - "︸": [T: "klammer-parentes under"] # 0xfe38 (en: 'under brace') - "︿": [T: "vinkel-parentes över"] # 0xfe3f - "﹀": [T: "vinkel-parentes under"] # 0xfe40 - - "﹨": [t: "mängd-differens"] # 0xfe68 - - "": [t: "okänt eller saknat objekt"] # 0xfffc (en: 'unknown or missing object', google translation) + - "﹡": [T: "asterisk"] # 0xfe61 + - "﹢": [T: "plus"] # 0xfe62 + - "﹣": [T: "minus"] # 0xfe63 + - "﹤": # audit-ignore + - test: + if: "$Verbosity!='Terse'" + then: [T: "är"] # (en: 'is', google translation) + - T: "mindre än" + - "﹥": # audit-ignore + - test: + if: "$Verbosity!='Terse'" + then: [T: "är"] # (en: 'is', google translation) + - T: "större än" + - "﹦": [T: "lika med"] # 0xfe66 + - "+": [T: "plus"] # 0xff0b + - "<": # audit-ignore + - test: + if: "$Verbosity!='Terse'" + then: [T: "är"] # (en: 'is', google translation) + - T: "mindre än" + - "=": [T: "lika med"] # 0xff1d + - ">": # audit-ignore + - test: + if: "$Verbosity!='Terse'" + then: [T: "är"] # (en: 'is', google translation) + - T: "större än" + - "\": [T: "backslash"] # 0xff3c + - "^": [T: "hatt"] # 0xff3e + - "|": # 0xff5c + # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' + - with: + variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) + replace: + - test: + - if: "$SpeechStyle != 'ClearSpeak'" + then_test: + if: "$DefaultToGiven" + then: [T: "givet"] + else: [T: "lodstreck"] + - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" + then: [T: "lodstreck"] + - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" + then: [T: "sådana att"] + - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" + then: [T: "givet"] + - else: [T: "delar"] + - "~": [T: "är proportionell mot"] # 0xff5e + - "¬": [T: "inte"] # 0xffe2 + - "←": [T: "vänster-pil"] # 0xffe9 + - "↑": [T: "uppåt-pil"] # 0xffea + - "→": [T: "höger-pil"] # 0xffeb + - "↓": [T: "nedåt-pil"] # 0xffec + - "﹨": [T: "backslash"] # audit-ignore 0xfe68 + - "": [T: "okänt eller saknat objekt"] # 0xfffc (en: 'unknown or missing object', google translation) - "�": [T: "okänt tecken"] # 0xfffd (google: 'okänd eller saknad karaktär') + + - "🣑": [T: "är i jämvikt med"] # 0x1F8D1 + - "🣒": [T: "är i jämvikt förskjuten åt höger med"] # 0x1F8D2 + - "🣓": [T: "är i jämvikt förskjuten åt vänster med"] # 0x1F8D3 + +# MathJax v4 has adopted these PUA values for some partial chem bonds that aren't in Unicode + - "\uE410": [T: "partiell bindning"] # 0xe410 + - "\uE411": [T: "dubbel partiell bindning"] # 0xe411 + - "\uE412": [T: "trippel partiell bindning"] # 0xe412 + +# MathJax v4 also adopted these PUA values for some arrows thar are in Unicode +# Hopefully these will be exported properly in future versions of MathJax + - "\uE428": [SPELL: "'⟵'"] # 0xe428 defer to def of arrow + - "\uE429": [SPELL: "'⟶'"] # 0xe429 defer to def of arrow + - "\uE42A": [SPELL: "'⟷'"] # 0xe42a defer to def of arrow + - "\uE408": [SPELL: "'🣑'"] # 0xe408 defer to def of arrow + - "\uE409": [SPELL: "'🣒'"] # 0xe409 defer to def of arrow + - "\uE40A": [SPELL: "'🣓'"] # 0xe40a defer to def of arrow + - "\uE42B": [SPELL: "'⇄'"] # 0xe42b defer to def of arrow + - "\uE42C": [SPELL: "'←'"] # 0xe42c defer to def of arrow + - "\uE42D": [SPELL: "'→'"] # 0xe42d defer to def of arrow + - "\uE42E": [SPELL: "'⇄'"] # 0xe42e defer to def of arrow \ No newline at end of file From c73a84c5e6731951ad44efc681ab0ab7f4b7f7be Mon Sep 17 00:00:00 2001 From: AndersEkl Date: Wed, 3 Jun 2026 11:12:45 +0200 Subject: [PATCH 14/27] Fixed a corrupt file There was some problem with general.yaml, which should now be fixed. --- Rules/Languages/sv/SharedRules/general.yaml | 348 ++++++++++---------- 1 file changed, 176 insertions(+), 172 deletions(-) diff --git a/Rules/Languages/sv/SharedRules/general.yaml b/Rules/Languages/sv/SharedRules/general.yaml index 093c3a269..161996e10 100644 --- a/Rules/Languages/sv/SharedRules/general.yaml +++ b/Rules/Languages/sv/SharedRules/general.yaml @@ -21,21 +21,21 @@ - bookmark: "*[2]/@id" - test: - if: "*[2][.='+']" - then: [T: "positiva"] # phrase(set of all 'positive' integers less than 10) - else: [T: "negativa"] # phrase(set of all 'negative' integers less than minus 10) + then: [{T: "positiva"}] # phrase(set of all 'positive' integers less than 10) + else: [{T: "negativa"}] # phrase(set of all 'negative' integers less than minus 10) - bookmark: "*[1]/@id" - test: - if: "*[1][.='ℂ']" - then: [T: "komplexa talen"] # phrase('complex numbers' consist of two parts) + then: [{T: "komplexa talen"}] # phrase('complex numbers' consist of two parts) - else_if: "*[1][.='ℕ']" - then: [T: "naturliga talen"] # phrase('natural numbers' are numbers from 1 to infinity) + then: [{T: "naturliga talen"}] # phrase('natural numbers' are numbers from 1 to infinity) - else_if: "*[1][.='ℚ']" - then: [T: "rationella talen"] # phrase('rational numbers' are the fraction of 2 integers) + then: [{T: "rationella talen"}] # phrase('rational numbers' are the fraction of 2 integers) - else_if: "*[1][.='ℝ']" - then: [T: "reella talen"] # phrase('real numbers' can be both positive and negative) + then: [{T: "reella talen"}] # phrase('real numbers' can be both positive and negative) - else_if: "*[1][.='ℤ']" - then: [T: "heltalen"] # phrase(positive 'integers' are natural numbers above 0) - else: [x: "*[1][text()]"] # shouldn't happen + then: [{T: "heltalen"}] # phrase(positive 'integers' are natural numbers above 0) + else: [{x: "*[1][text()]"}] # shouldn't happen - name: dimension-number-sets # should be single digit integer at this point (e.g, R^3) tag: number-sets @@ -44,16 +44,16 @@ - bookmark: "*[1]/@id" - test: - if: "*[1][.='ℂ']" - then: [T: "C"] # phrase(the letter 'C' used to represent complex number) + then: [{T: "C"}] # phrase(the letter 'C' used to represent complex number) - else_if: "*[1][.='ℕ']" - then: [T: "N"] # phrase(the letter 'N' may represent natural numbers) + then: [{T: "N"}] # phrase(the letter 'N' may represent natural numbers) - else_if: "*[1][.='ℚ']" - then: [T: "Q"] # phrase(the letter 'Q' may represent rational numbers) + then: [{T: "Q"}] # phrase(the letter 'Q' may represent rational numbers) - else_if: "*[1][.='ℝ']" - then: [T: "R"] # phrase(the letter 'R' may represent real numbers) + then: [{T: "R"}] # phrase(the letter 'R' may represent real numbers) - else_if: "*[1][.='ℤ']" - then: [T: "Z"] # phrase(the letter 'Z' may represent integers) - else: [x: "*[1][text()]"] # shouldn't happen + then: [{T: "Z"}] # phrase(the letter 'Z' may represent integers) + else: [{x: "*[1][text()]"}] # shouldn't happen - bookmark: "*[2]/@id" - x: "*[2]" @@ -64,15 +64,15 @@ - bookmark: "@id" - test: - if: ".='ℂ'" - then: [T: "de komplexa talen"] # phrase('the complex numbers' include 2 parts) + then: [{T: "de komplexa talen"}] # phrase('the complex numbers' include 2 parts) - else_if: ".='ℕ'" - then: [T: "de naturliga talen"] # phrase('the natural numbers' begin at 1) + then: [{T: "de naturliga talen"}] # phrase('the natural numbers' begin at 1) - else_if: ".='ℚ'" - then: [T: "de rationella talen"] # phrase('the rational numbers' are the fraction of 2 integers) + then: [{T: "de rationella talen"}] # phrase('the rational numbers' are the fraction of 2 integers) - else_if: ".='ℝ'" - then: [T: "de reella talen"] # phrase('the real numbers' can be both positive and negative) + then: [{T: "de reella talen"}] # phrase('the real numbers' can be both positive and negative) - else_if: ".='ℤ'" - then: [T: "heltalen"] # phrase('the integers' are natural numbers above 0) + then: [{T: "heltalen"}] # phrase('the integers' are natural numbers above 0) else: [x: "text()"] # shouldn't happen - name: real-part @@ -90,7 +90,7 @@ - T: "den imaginära delen" # phrase('the imaginary part' is part of a complex number) # rules on scripted vertical bars ('evaluated at') -- name: evaluated-at-2 # audit-ignore +- name: evaluated-at-2 # audit-ignore tag: evaluate match: "count(*)=2" replace: @@ -104,7 +104,7 @@ - pause: auto - x: "*[2]" -- name: evaluated-at-3 # audit-ignore +- name: evaluated-at-3 # audit-ignore tag: evaluate match: "count(*)=3" replace: @@ -136,7 +136,7 @@ - T: "element ur" # phrase(the solution involves several 'permutations of' values) - x: "*[1]" -- name: intervals # audit-ignore +- name: intervals # audit-ignore tag: [open-interval, open-closed-interval, closed-interval, closed-open-interval] match: "count(*)=2" replace: @@ -163,13 +163,8 @@ - if: "self::m:open-closed-interval" then: [T: "och med"] - x: "*[2]" -# removed this option because it doesn't clarify in which end half-open intervals are open -# else: -# - x: "*[1]" -# - T: "komma" # phrase(use a 'comma' to divide large numbers or as a decimal point) -# - x: "*[2]" -- name: default-point # audit-ignore +- name: default-point # audit-ignore tag: point match: "count(*)=2" replace: @@ -178,7 +173,7 @@ - T: "komma" # phrase(use a 'comma' to divide large numbers or as a decimal point) - x: "*[2]" -- name: bigop-both # audit-ignore +- name: bigop-both # audit-ignore tag: large-op match: "count(*) = 3" replace: @@ -191,9 +186,9 @@ - pause: short - test: if: "following-sibling::*" - then: [T: "av"] # phrase(the square root 'of' 25 equals 5) + then: [{T: "av"}] # phrase(the square root 'of' 25 equals 5) -- name: bigop-under # audit-ignore +- name: bigop-under # audit-ignore tag: large-op match: "count(*)=2" replace: @@ -203,9 +198,9 @@ - pause: short - test: if: "following-sibling::*" - then: [T: "av"] # phrase(the square root 'of' 25 equals 5) + then: [{T: "av"}] # phrase(the square root 'of' 25 equals 5) -- name: largeop # audit-ignore +- name: largeop # audit-ignore tag: mrow match: "count(*)=2 and IsInDefinition(*[1], 'LargeOperators')" replace: @@ -219,7 +214,7 @@ replace: - x: "*[1]" - T: "med periodisk decimalutveckling" # phrase('with repeating digits') - - SPELL: "*[2]" + - spell: "*[2]" - name: msubsup-skip-super # handles single, double, etc., prime @@ -229,16 +224,16 @@ - x: "*[1]" - test: if: "$Verbosity='Verbose'" - then: [T: "nedre index"] # phrase(a 'subscript' may be used to indicate an index) - else: [T: "nedsänkt"] # phrase(the result is 'sub' optimal) + then: {T: "nedre index"} # phrase(a 'subscript' may be used to indicate an index) + else: {T: "nedsänkt"} # phrase(the result is 'sub' optimal) - x: "*[2]" - test: - if: "not(IsNode(*[2],'leaf') and $Impairment = 'Blindness')" + if: "not(IsNode(*[2],'leaf'))" then: - test: if: "$Verbosity='Verbose'" - then: [T: "slut nedre index"] # phrase(this is the 'end subscript' position) - else: [T: "slut nedsänkt"] # phrase(this is the 'end sub' position) + then: {T: "slut nedre index"} # phrase(this is the 'end subscript' position) + else: {T: "slut nedsänkt"} # phrase(this is the 'end sub' position) - pause: short else_test: if: "*[2][self::m:mi]" # need a pause in "x sub k prime" so the prime is not associated with the 'k' @@ -247,8 +242,8 @@ if: "name(.)='say-super'" then_test: if: "$Verbosity='Verbose'" - then: [T: "övre index"] # phrase(a 'superscript' number indicates raised to a power) - else: [T: "upphöjt"] # phrase(this is a 'super' set of numbers) + then: {T: "övre index"} # phrase(a 'superscript' number indicates raised to a power) + else: {T: "upphöjt"} # phrase(this is a 'super' set of numbers) - x: "*[3]" - pause: short @@ -258,9 +253,9 @@ match: "$Verbosity = 'Terse' and string-length(.)=1" replace: - bookmark: "@id" - - SPELL: "text()" + - spell: "text()" -# SWEDISH: need to say "ett" for '1' in front of a neuter unit +# need to say "ett" for '1' in front of a neuter unit # this is extra complicated because we need to allow do it for a 1 in front of a mixed fraction # note: bias ha->hektar and Pa->Pascal, not si-prefix "a" (annum) - name: one-for-unit # audit-ignore @@ -398,26 +393,26 @@ variables: # If the amount is singular, we don't add the plural ending. - IsSingular: "*[3][self::m:mn and .=1] and *[2]='\u2062'" + - CurrencyWord: "DefinitionValue(*[1], 'Speech', 'CurrencySymbols')" replace: - bookmark: "*[3]/@id" - x: "*[3]" - test: - if: "$IsSingular" - then: [x: "DefinitionValue(*[1], 'Speech', 'CurrencySymbols')"] - - else_if: "DefinitionValue(*[1], 'Speech', 'PluralForms') != ''" - then: [x: "DefinitionValue(*[1], 'Speech', 'PluralForms')"] - else: [x: "DefinitionValue(*[1], 'Speech', 'CurrencySymbols')"] # SWEDISH: removed s from plural because it should not be added + then: [x: "$CurrencyWord"] + - else_if: "DefinitionValue($CurrencyWord, 'Speech', 'PluralForms') != ''" + then: [x: "DefinitionValue($CurrencyWord, 'Speech', 'PluralForms')"] + else: [x: "DefinitionValue(*[1], 'Speech', 'CurrencySymbols')"] # SWEDISH: Removed plural s. Not used in Swedish. - -- name: sin # audit-ignore +- name: sin # audit-ignore tag: mi match: ".='sin'" replace: - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [T: "sin"] # phrase('sin' is the abbreviation for sine) - else: [T: "sinus"] # phrase(the 'sine' of the angle) + then: {T: "sin"} # phrase('sin' is the abbreviation for sine) + else: {T: "sinus"} # phrase(the 'sine' of the angle) # SWEDISH: Added short form. - name: cos @@ -427,8 +422,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [T: "cos"] # phrase('cos' is the abbreviation for cosine) - else: [T: "cosinus"] # phrase(find the 'cosine' in a right-angle triangle) + then: {T: "cos"} # phrase('cos' is the abbreviation for cosine) + else: {T: "cosinus"} # phrase(find the 'cosine' in a right-angle triangle) - name: tan tag: mi @@ -437,8 +432,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [T: "tan"] # phrase(the 'tan' is the ratio of the opposite to the adjacent side of a right-angled triangle) - else: [T: "tangens"] # phrase(a 'tangent' is a straight line that touches a curve) + then: {T: "tan"} # phrase(the 'tan' is the ratio of the opposite to the adjacent side of a right-angled triangle) + else: {T: "tangens"} # phrase(a 'tangent' is a straight line that touches a curve) - name: sec tag: mi @@ -447,8 +442,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [T: "sec"] # phrase(to 'seek' a solution) - else: [T: "sekans"] # phrase(a 'secant' intersects a curve at two or more points) + then: {T: "sec"} # phrase(to 'seek' a solution) + else: {T: "sekans"} # phrase(a 'secant' intersects a curve at two or more points) - name: csc tag: mi @@ -457,8 +452,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [T: "cosec"] # phrase(we will 'cosecant' a solution) - else: [T: "cosekans"] # phrase(the 'cosecant' is the reciprocal of the secant) + then: {T: "cosec"} # phrase(we will 'cosecant' a solution) + else: {T: "cosekans"} # phrase(the 'cosecant' is the reciprocal of the secant) - name: cot tag: mi @@ -467,8 +462,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [T: "cotan"] # phrase(find the 'cotangent' in a right-angle triangle) - else: [T: "cotangens"] # phrase(the 'cotangent' is the reciprocal of the tangent) + then: {T: "cotan"} # phrase(find the 'cotangent' in a right-angle triangle) + else: {T: "cotangens"} # phrase(the 'cotangent' is the reciprocal of the tangent) - name: sinh tag: mi @@ -477,8 +472,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [T: "sin hype"] # phrase(the word 'sinch' is an abbreviation for hyperbolic sine) - else: [T: "sinus hyperbolicus"] # phrase(the 'hyperbolic sine' is used in mathematics) + then: {T: "sin hype"} # phrase(the word 'sinch' is an abbreviation for hyperbolic sine) + else: {T: "sinus hyperbolicus"} # phrase(the 'hyperbolic sine' is used in mathematics) - name: cosh tag: mi @@ -487,8 +482,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [T: "cos hype"] # phrase('cosh' is an abbreviation of hyperbolic cosine) - else: [T: "cosinus hyperbolicus"] # phrase(the 'hyperbolic cosine' is a mathematical function) + then: {T: "cos hype"} # phrase('cosh' is an abbreviation of hyperbolic cosine) + else: {T: "cosinus hyperbolicus"} # phrase(the 'hyperbolic cosine' is a mathematical function) - name: tanh tag: mi @@ -497,8 +492,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [T: "tan hype"] # phrase('tanch' is shorthand for hyperbolic tangent) - else: [T: "tangens hyperbolicus"] # phrase('hyperbolic tangent' is a mathematical function) + then: {T: "tan hype"} # phrase('tanch' is shorthand for hyperbolic tangent) + else: {T: "tangens hyperbolicus"} # phrase('hyperbolic tangent' is a mathematical function) - name: sech tag: mi @@ -507,8 +502,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [T: "sec hype"] # phrase('sheck' is shorthand for hyperbolic secant) - else: [T: "sekans hyperbolicus"] # phrase('hyperbolic secant' is a mathematical function) + then: {T: "sec hype"} # phrase('sheck' is shorthand for hyperbolic secant) + else: {T: "sekans hyperbolicus"} # phrase('hyperbolic secant' is a mathematical function) - name: csch tag: mi @@ -517,8 +512,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [T: "cosec hype"] # phrase('cosheck' is shorthand for hyperbolic cosecant) - else: [T: "cosekans hyperbolicus"] # phrase('hyperbolic cosecant' is a mathematical function) + then: {T: "cosec hype"} # phrase('cosheck' is shorthand for hyperbolic cosecant) + else: {T: "cosekans hyperbolicus"} # phrase('hyperbolic cosecant' is a mathematical function) - name: coth tag: mi @@ -527,8 +522,8 @@ - bookmark: "@id" - test: if: "$Verbosity='Terse'" - then: [T: "cotan hype"] # phrase('cotanch' is shorthand for hyperbolic cotangent) - else: [T: "cotangens hyperbolicus"] # phrase(the 'hyperbolic cotangent' is a mathematical function) + then: {T: "cotan hype"} # phrase('cotanch' is shorthand for hyperbolic cotangent) + else: {T: "cotangens hyperbolicus"} # phrase(the 'hyperbolic cotangent' is a mathematical function) - name: exponential tag: mi @@ -550,7 +545,8 @@ then: [T: "kov"] # phrase('Cov' is shorthand for the covariance function) else: [T: "kovariansen"] # phrase('covariance' function) -- name: log # audit-ignore handle log, lg and ln +- # handle both log, lg and ln + name: log # audit-ignore tag: mi match: ".='log' or .='ln' or .='lg'" # FI: added 'lg' variables: [log_is_simple: "IsNode(following-sibling::*[2],'simple')"] @@ -564,23 +560,23 @@ - else_if: ".='lg'" then_test: if: "$Verbosity!='Verbose'" - then: [SPELL: "'lg'"] # phrase(the 'lg' of x) + then: [spell: "'lg'"] # phrase(the 'lg' of x) else: [T: "tio-logaritmen"] # SWEDISH: We have added the term "lg" for the logarithm with base 10. Also added a verbosity test for long and short form. - else_if: "$Verbosity!='Verbose'" - then: [SPELL: "'ln'"] + then: [spell: "'ln'"] else: [T: "naturliga logaritmen"] # phrase(the 'natural log' function is used in mathematics) else: - test: - if: ".='log'" then: [T: "logg"] # phrase(the 'log' function is used in mathematics) - else_if: ".='lg'" - then: [SPELL: "'lg'"] # phrase(the 'lg' of x) + then: [spell: "'lg'"] # phrase(the 'lg' of x) - else_if: "$Verbosity='Terse'" - then: [SPELL: "'ln'"] + then: [spell: "'ln'"] else: [T: "naturliga logaritmen"] # phrase(the 'natural log' function is used in mathematics) -- name: multi-line # audit-ignore +- name: multi-line # audit-ignore # that eliminates the need for the if: else_if: ... # IDEA: set a variable with the word to say for the row (e.g., RowLabel = Row/Case/Line/...) tag: [piecewise, system-of-equations, lines] @@ -597,19 +593,19 @@ then: - test: - if: "$LineCount != 1" - then: [T: "fall"] - else: [T: "fallet"] # phrase(this is the first 'case' of three cases) + then: [{T: "fall"}] + else: [{T: "fallet"}] # phrase(this is the first 'case' of three cases) - else_if: "self::m:system-of-equations" then: - test: - if: "$LineCount != 1" - then: [T: "ekvationer"] - else: [T: "ekvationen"] # phrase(this is the first 'equation' of three equations) + then: [{T: "ekvationer"}] + else: [{T: "ekvationen"}] # phrase(this is the first 'equation' of three equations) - else: - test: - if: "$LineCount != 1" - then: [T: "rader"] - else: [T: "raden"] # phrase(this is the first 'line' of three lines) + then: [{T: "rader"}] + else: [{T: "raden"}] # phrase(this is the first 'line' of three lines) - pause: short - x: "*" @@ -673,26 +669,26 @@ # the rules either speak the s (to get "row n") or the s. "column n" spoken if $IsColumnSilent is false - name: 1x1-matrix tag: [matrix, determinant] - variables: [IsColumnSilent: true()] + variables: [{IsColumnSilent: true()}] match: "count(*)=1 and *[self::m:mtr][count(*) = 1]" replace: - T: "ett-gånger-ett" # phrase(the '1 by 1' matrix) - test: if: "self::m:determinant" # just need to check the first bracket since we know it must be (, [, or | - then: [T: "determinant"] # phrase(the 2 by 2 'determinant')) - else: [T: "matris"] # phrase(the 2 by 2 'matrix') + then: {T: "determinant"} # phrase(the 2 by 2 'determinant')) + else: {T: "matris"} # phrase(the 2 by 2 'matrix') - T: "med element" # phrase(the 2 by 2 matrix 'with entry' x) - x: "*[1]/*" # simpler reading methods for special case matrices -# SWEDISH: changed order of speaking -- name: zero-matrix +# SWEDISH: changed the order of speaking +- name: zero-matrix tag: matrix # select all the non-zero entries -- if there are none of them, then it is a zero matrix match: "not( */*/*[not(self::m:mn and .= 0)] )" replace: - - T: "nollmatris" # phrase(the 2 by 2 'zero matrix') + - T: "nollmatris" # phrase(the 2 by 2 'zero matrix') - pause: short - x: count(*) - T: "gånger" # phrase(the 1 'by' 2 matrix) @@ -707,7 +703,7 @@ - "not( */*[count(preceding-sibling::*) = count(../preceding-sibling::*)]/*[not(self::m:mn and .= 1)] ) and " # on-diagonal - "not( */*[count(preceding-sibling::*) != count(../preceding-sibling::*)]/*[not(self::m:mn and .= 0)] )" # off-diagonal replace: - - T: "identitetsmatris" # phrase(the 2 by 2 'zero matrix') + - T: "identitetsmatris" # phrase(the 2 by 2 'identity matrix') - pause: short - x: count(*) - T: "gånger" # phrase(the 1 'by' 2 matrix) @@ -724,7 +720,7 @@ - " [count(../preceding-sibling::*)!=count(../../preceding-sibling::*)]" - " )" replace: - - T: "diagonalmatris" # phrase(the 2 by 2 'zero matrix') + - T: "diagonalmatris" # phrase(the 2 by 2 'diagonal matrix') - pause: short - x: count(*) - T: "gånger" # phrase(the 1 'by' 2 matrix) @@ -741,7 +737,7 @@ # simpler reading methods for smaller matrices if the entries are simple - name: 2-or-3x1-matrix tag: matrix - variables: [IsColumnSilent: true()] + variables: [{IsColumnSilent: true()}] match: - "$ClearSpeak_Matrix != 'SpeakColNum' and " # "simple" isn't used for this preference - "*[self::m:mtr][count(*) = 1] and " # one column @@ -752,8 +748,8 @@ - T: "gånger-ett" # phrase(the 2 'by 1 column' matrix) - test: if: "$ClearSpeak_Matrix = 'Vector' or $ClearSpeak_Matrix = 'EndVector'" - then: [T: "kolumn-vektor"] # phrase(the 2 by 2 'vector') - else: [T: "kolumn-matris"] # phrase(the 2 by 2 'matrix') + then: {T: "kolumn-vektor"} # phrase(the 2 by 2 'vector') + else: {T: "kolumn-matris"} # phrase(the 2 by 2 'matrix') - pause: long - x: "*/*" - test: @@ -762,20 +758,20 @@ - T: "slut" # phrase('end' of matrix) - test: if: $ClearSpeak_Matrix = 'EndVector' - then: [T: "vektor"] # phrase(the 2 column 'vector') - else: [T: "matris"] # phrase(the 2 by 2 'matrix') + then: {T: "vektor"} # phrase(the 2 column 'vector') + else: {T: "matris"} # phrase(the 2 by 2 'matrix') -- name: default-column-matrix # audit-ignore +- name: default-column-matrix # audit-ignore tag: matrix - variables: [IsColumnSilent: true()] + variables: [{IsColumnSilent: true()}] match: "*[self::m:mtr][count(*) = 1]" replace: - x: "count(*)" - T: "gånger-ett" # phrase(the 2 'by 1 column' matrix) - test: if: "$ClearSpeak_Matrix = 'Vector' or $ClearSpeak_Matrix = 'EndVector'" - then: [T: "kolumn-vektor"] # phrase(the 2 column 'vector') - else: [T: "kolumn-matris"] # phrase(the 2 by 2 'matrix') + then: {T: "kolumn-vektor"} # phrase(the 2 column 'vector') + else: {T: "kolumn-matris"} # phrase(the 2 by 2 'matrix') - pause: long - x: "*" # select the rows (mtr) - test: @@ -784,12 +780,12 @@ - T: "slut" # phrase('end' of matrix) - test: if: $ClearSpeak_Matrix = 'EndVector' - then: [T: "vektor"] # phrase(the 2 column 'vector') - else: [T: "matris"] # phrase(the 2 by 2 'matrix') + then: {T: "vektor"} # phrase(the 2 column 'vector') + else: {T: "matris"} # phrase(the 2 by 2 'matrix') - name: 1x2-or-3-matrix tag: matrix - variables: [IsColumnSilent: "$SpeechStyle = 'SimpleSpeak' or ($SpeechStyle = 'ClearSpeak' and $ClearSpeak_Matrix != 'SpeakColNum')"] + variables: [{IsColumnSilent: "$SpeechStyle = 'SimpleSpeak' or ($SpeechStyle = 'ClearSpeak' and $ClearSpeak_Matrix != 'SpeakColNum')"}] match: - "$ClearSpeak_Matrix != 'SpeakColNum' and " # "simple" isn't used for this preference - count(*)=1 and # one row @@ -800,8 +796,8 @@ - x: count(*/*) - test: if: "$ClearSpeak_Matrix = 'Vector' or $ClearSpeak_Matrix = 'EndVector'" - then: [T: "rad-vektor"] # phrase('the 1 by' 2 row 'vector') - else: [T: "rad-matris"] # phrase('the 1 by' 2 'matrix') + then: {T: "rad-vektor"} # phrase('the 1 by' 2 row 'vector') + else: {T: "rad-matris"} # phrase('the 1 by' 2 'matrix') - pause: long - x: "*/*" - test: @@ -810,20 +806,20 @@ - T: "slut" # phrase(the 'end' of matrix has been reached) - test: if: $ClearSpeak_Matrix = 'EndMatrix' - then: [T: "matris"] # phrase(the 2 by 2 'matrix') - else: [T: "vektor"] # phrase(the 2 by 1 'vector') + then: {T: "matris"} # phrase(the 2 by 2 'matrix') + else: {T: "vektor"} # phrase(the 2 by 1 'vector') - name: default-row-matrix tag: matrix - variables: [IsColumnSilent: "$SpeechStyle = 'ClearSpeak' and $ClearSpeak_Matrix = 'SilentColNum'"] + variables: [{IsColumnSilent: "$SpeechStyle = 'ClearSpeak' and $ClearSpeak_Matrix = 'SilentColNum'"}] match: "count(*)=1" # one row replace: - T: "ett-gånger" # phrase('the 1 by' 2 matrix) - x: "count(*/*)" - test: if: "$ClearSpeak_Matrix = 'Vector' or $ClearSpeak_Matrix = 'EndVector'" - then: [T: "rad-vektor"] # phrase(the 2 by 1 'vector') - else: [T: "rad-matris"] # phrase(the 2 by 2 'matrix') + then: {T: "rad-vektor"} # phrase(the 2 by 1 'vector') + else: {T: "rad-matris"} # phrase(the 2 by 2 'matrix') - pause: long - pause: medium - x: "*/*" # select the cols (mtd) @@ -833,8 +829,8 @@ - T: "slut" # phrase(the 'end' of matrix has been reached) - test: if: $ClearSpeak_Matrix = 'EndMatrix' - then: [T: "matris"] # phrase(the 2 by 2 'matrix') - else: [T: "vektor"] # phrase(the 2 by 1 'vector') + then: {T: "matris"} # phrase(the 2 by 2 'matrix') + else: {T: "vektor"} # phrase(the 2 by 1 'vector') - name: simple-small-matrix tag: [matrix, determinant] @@ -842,15 +838,19 @@ - "$ClearSpeak_Matrix != 'SpeakColNum' and " # "simple" isn't used for this preference - (count(*)<=3 and count(*[1]/*)<=3) and # no bigger than a 3x3 matrix - IsNode(*/*/*,'simple') # IsNode() returns true if all the nodes are simple - variables: [IsColumnSilent: "$SpeechStyle = 'SimpleSpeak' or ($SpeechStyle = 'ClearSpeak' and $ClearSpeak_Matrix != 'SpeakColNum')"] + variables: [{IsColumnSilent: "$SpeechStyle = 'SimpleSpeak' or ($SpeechStyle = 'ClearSpeak' and $ClearSpeak_Matrix != 'SpeakColNum')"}] replace: - x: count(*) - T: "gånger" # phrase(the 1 'by' 2 matrix) - x: count(*[self::m:mtr][1]/*) - test: if: "self::m:determinant" - then: [T: "determinant"] # phrase(the 2 by 2 'determinant') - else: [T: "matris"] # phrase(the 2 by 2 'matrix') + then: {T: "determinant"} # phrase(the 2 by 2 'determinant') + else: + - test: + if: "@columnlines and (contains(normalize-space(@columnlines), 'solid') or contains(normalize-space(@columnlines), 'dashed'))" + then: [T: "totalmatris"] # phrase(the 2 by 2 'augmented matrix') + else: [T: "matris"] # phrase(the 2 by 2 'matrix') - pause: long - x: "*" - test: @@ -859,12 +859,12 @@ - T: "slut" # phrase(the 'end' of matrix has been reached) - test: if: "self::m:determinant" - then: [T: "determinant"] # phrase(the 2 by 2 'determinant') - else: [T: "matris"] # phrase(the 2 by 2 'matrix') + then: {T: "determinant"} # phrase(the 2 by 2 'determinant') + else: {T: "matris"} # phrase(the 2 by 2 'matrix') - name: default-matrix tag: [matrix, determinant] - variables: [IsColumnSilent: "$SpeechStyle = 'ClearSpeak' and $ClearSpeak_Matrix = 'SilentColNum'"] + variables: [{IsColumnSilent: "$SpeechStyle = 'ClearSpeak' and $ClearSpeak_Matrix = 'SilentColNum'"}] match: "." replace: - x: "count(*)" @@ -872,8 +872,12 @@ - x: "count(*[self::m:mtr][1]/*)" - test: if: "self::m:determinant" - then: [T: "determinant"] # phrase(the 2 by 2 'determinant') - else: [T: "matris"] # phrase(the 2 by 2 'matrix') + then: {T: "determinant"} # phrase(the 2 by 2 'determinant') + else: + - test: + if: "@columnlines and (contains(normalize-space(@columnlines), 'solid') or contains(normalize-space(@columnlines), 'dashed'))" + then: [T: "totalmatris"] # phrase(the 2 by 2 'augmented matrix') + else: [T: "matris"] # phrase(the 2 by 2 'matrix') - pause: long - x: "*" - test: @@ -882,8 +886,8 @@ - T: "slut" # phrase(the 'end' of matrix has been reached) - test: if: "self::m:determinant" - then: [T: "determinant"] # phrase(the 2 by 2 'determinant') - else: [T: "matris"] # phrase(the 2 by 2 'matrix's) + then: {T: "determinant"} # phrase(the 2 by 2 'determinant') + else: {T: "matris"} # phrase(the 2 by 2 'matrix's) - name: chemistry-msub tag: [chemical-formula] @@ -892,10 +896,10 @@ - x: "*[2]" - test: if: "$Verbosity='Verbose'" - then: [T: "nedre index"] # phrase(H 'subscript' 2) + then: [{T: "nedre index"}] # phrase(H 'subscript' 2) else_test: if: "$Verbosity='Medium'" - then: [T: "nedsänkt"] # phrase(H 'sub' 2) + then: [{T: "nedsänkt"}] # phrase(H 'sub' 2) - x: "*[3]" - name: dimension-by @@ -913,14 +917,14 @@ - x: "*[2]" - test: if: "$Verbosity='Verbose'" - then: [T: "övre index"] # phrase(H 'superscript' 2) + then: [{T: "övre index"}] # phrase(H 'superscript' 2) else_test: if: "$Verbosity='Medium'" - then: [T: "upphöjt"] # phrase(H 'super' 2) + then: [{T: "upphöjt"}] # phrase(H 'super' 2) - x: "*[3]" - test: if: "following-sibling::*[1][.='+' or .='-']" # a little lazy -- assumes chemistry superscripts end with + or - - then: [pause: medium] + then: [{pause: medium}] - # There currently is no way to do sub/super for n-ary number of args @@ -944,10 +948,10 @@ then: - test: if: "$Verbosity='Verbose'" - then: [T: "övre index"] # phrase(H 'superscript' 2) + then: [{T: "övre index"}] # phrase(H 'superscript' 2) else_test: if: "$Verbosity='Medium'" - then: [T: "upphöjt"] # phrase(H 'super' 2) + then: [{T: "upphöjt"}] # phrase(H 'super' 2) - x: "$Prescripts[2]" - pause: "short" - test: @@ -955,10 +959,10 @@ then: - test: if: "$Verbosity='Verbose'" - then: [T: "nedre index"] # phrase(a 'subscript' may be used to indicate an index) + then: [{T: "nedre index"}] # phrase(a 'subscript' may be used to indicate an index) else_test: if: "$Verbosity='Medium'" - then: [T: "nedsänkt"] # phrase(here is a 'sub' total) + then: [{T: "nedsänkt"}] # phrase(here is a 'sub' total) - x: "$Prescripts[1]" - pause: "short" - test: @@ -969,10 +973,10 @@ then: - test: if: "$Verbosity='Verbose'" - then: [T: "övre index"] # phrase(H 'superscript' 2) + then: [{T: "övre index"}] # phrase(H 'superscript' 2) else_test: if: "$Verbosity='Medium'" - then: [T: "upphöjt"] # phrase(H 'super' 2) + then: [{T: "upphöjt"}] # phrase(H 'super' 2) - x: "$Prescripts[4]" - pause: "short" - test: @@ -980,10 +984,10 @@ then: - test: if: "$Verbosity='Verbose'" - then: [T: "nedre index"] # phrase(H 'subscript' 2) + then: [{T: "nedre index"}] # phrase(H 'subscript' 2) else_test: if: "$Verbosity='Medium'" - then: [T: "nedsänkt"] # phrase(H 'sub' 2) + then: [{T: "nedsänkt"}] # phrase(H 'sub' 2) - x: "$Prescripts[3]" - pause: "short" - x: "*[1]" # base @@ -995,10 +999,10 @@ then: - test: if: "$Verbosity='Verbose'" - then: [T: "nedre index"] # phrase(phrase(H 'subscript' 2) + then: [{T: "nedre index"}] # phrase(phrase(H 'subscript' 2) else_test: if: "$Verbosity='Medium'" - then: [T: "nedsänkt"] # phrase(phrase(H 'sub' 2) + then: [{T: "nedsänkt"}] # phrase(phrase(H 'sub' 2) - x: "$Postscripts[1]" - pause: "short" - test: @@ -1006,10 +1010,10 @@ then: - test: if: "$Verbosity='Verbose'" - then: [T: "övre index"] # phrase(H 'superscript' 2) + then: [{T: "övre index"}] # phrase(H 'superscript' 2) else_test: if: "$Verbosity='Medium'" - then: [T: "upphöjt"] # phrase(H 'super' 2) + then: [{T: "upphöjt"}] # phrase(H 'super' 2) - x: "$Postscripts[2]" - pause: "short" - test: @@ -1020,10 +1024,10 @@ then: - test: if: "$Verbosity='Verbose'" - then: [T: "nedre index"] # phrase(H 'subscript' 2) + then: [{T: "nedre index"}] # phrase(H 'subscript' 2) else_test: if: "$Verbosity='Medium'" - then: [T: "nedsänkt"] # phrase(H 'sub' 2) + then: [{T: "nedsänkt"}] # phrase(H 'sub' 2) - x: "$Postscripts[3]" - pause: "short" - test: @@ -1031,10 +1035,10 @@ then: - test: if: "$Verbosity='Verbose'" - then: [T: "övre index"] # phrase(H 'superscript' 2) + then: [{T: "övre index"}] # phrase(H 'superscript' 2) else_test: if: "$Verbosity='Medium'" - then: [T: "upphöjt"] # phrase(H 'super' 2) + then: [{T: "upphöjt"}] # phrase(H 'super' 2) - x: "$Postscripts[4]" - pause: "short" - test: @@ -1045,10 +1049,10 @@ then: - test: if: "$Verbosity='Verbose'" - then: [T: "nedre index"] # phrase(H 'subscript' 2) + then: [{T: "nedre index"}] # phrase(H 'subscript' 2) else_test: if: "$Verbosity='Medium'" - then: [T: "nedsänkt"] # phrase(H 'sub' 2) + then: [{T: "nedsänkt"}] # phrase(H 'sub' 2) - x: "$Postscripts[5]" - pause: "short" - test: @@ -1056,10 +1060,10 @@ then: - test: if: "$Verbosity='Verbose'" - then: [T: "övre index"] # phrase(H 'superscript' 2) + then: [{T: "övre index"}] # phrase(H 'superscript' 2) else_test: if: "$Verbosity='Medium'" - then: [T: "upphöjt"] # phrase(H 'super' 2) + then: [{T: "upphöjt"}] # phrase(H 'super' 2) - x: "$Postscripts[6]" - pause: "short" - test: @@ -1070,10 +1074,10 @@ then: - test: if: "$Verbosity='Verbose'" - then: [T: "nedre index"] # phrase(H 'subscript' 2) + then: [{T: "nedre index"}] # phrase(H 'subscript' 2) else_test: if: "$Verbosity='Medium'" - then: [T: "nedsänkt"] # phrase(H 'sub' 2) + then: [{T: "nedsänkt"}] # phrase(H 'sub' 2) - x: "$Postscripts[7]" - pause: "short" - test: @@ -1081,15 +1085,15 @@ then: - test: if: "$Verbosity='Verbose'" - then: [T: "övre index"] # phrase(H 'superscript' 2) + then: [{T: "övre index"}] # phrase(H 'superscript' 2) else_test: if: "$Verbosity='Medium'" - then: [T: "upphöjt"] # phrase(H 'super' 2) + then: [{T: "upphöjt"}] # phrase(H 'super' 2) - x: "$Postscripts[8]" - pause: "short" - test: if: "$Postscripts[last()][not(self::m:none)] and following-sibling::*[1][.='+' or .='-']" - then: [pause: medium] + then: [{pause: medium}] - name: chemistry tag: chemical-equation @@ -1102,7 +1106,7 @@ match: "." replace: - bookmark: "@id" - - SPELL: text() + - spell: text() - pause: short - name: chemical-state @@ -1112,12 +1116,12 @@ - bookmark: "*[1]/@id" - test: - if: ".='s'" - then: [T: "fast"] # phrase(Boron is a 'solid' in its natural state) + then: [{T: "fast"}] # phrase(Boron is a 'solid' in its natural state) - else_if: ".='l'" - then: [T: "flytande"] # phrase(water is a 'liquid') + then: [{T: "flytande"}] # phrase(water is a 'liquid') - else_if: ".='g'" - then: [T: "gas"] # phrase(hydrogen is a 'gas' ) - else: [T: "vattenlösning"] # phrase(an 'aqueous' solution is contained in water) + then: [{T: "gas"}] # phrase(hydrogen is a 'gas' ) + else: [{T: "vattenlösning"}] # phrase(an 'aqueous' solution is contained in water) - pause: short - name: chemical-formula-operator-bond @@ -1128,14 +1132,14 @@ - bookmark: "@id" - test: - if: ".='-' or .=':'" - then: [T: "enkelbindning"] # phrase(a 'single bond' is formed when two atoms share one pair of electrons) + then: [{T: "enkelbindning"}] # phrase(a 'single bond' is formed when two atoms share one pair of electrons) - else_if: ".='=' or .='∷'" - then: [T: "dubbelbindning"] # phrase(a 'double bond' may occur when two atoms share two pairs of electrons) + then: [{T: "dubbelbindning"}] # phrase(a 'double bond' may occur when two atoms share two pairs of electrons) - else_if: ".='≡'" - then: [T: "trippelbindning"] # phrase(a 'triple bond' occurs when two atoms share three pairs of electrons) + then: [{T: "trippelbindning"}] # phrase(a 'triple bond' occurs when two atoms share three pairs of electrons) - else_if: ".='≣'" - then: [T: "fyrdubbel bindning"] # phrase(a 'quadruple bond' occurs when two atoms share four pairs of electrons) - else: [x: "text()"] + then: [{T: "fyrdubbel bindning"}] # phrase(a 'quadruple bond' occurs when two atoms share four pairs of electrons) + else: [{x: "text()"}] - name: chemical-formula-operator tag: chemical-formula-operator @@ -1153,14 +1157,14 @@ - if: ".='→' or .='⟶'" then_test: if: "$Verbosity='Terse'" - then: [T: "bildar"] # phrase(hydrogen and oxygen 'forms' water ) - else: [T: "reaktion bildar"] # phrase(hydrogen and oxygen 'reacts to form' water) - - else_if: ".='⇌' or .='🣑'" # U+01F8D1 - then: [T: "är i jämvikt med"] # phrase(a reactant 'is in equilibrium with' a product) - - else_if: ".='🣓'" # U+1F8D3 - then: [T: "är i jämvikt med, vänsterförskjuten"] # phrase(the reactant 'is in equilibrium biased to the left with' the product) - - else_if: ".='🣒'" # U+1F8D2 - then: [T: "är i jämvikt med, högerförskjuten"] # phrase(the reactant 'is in equilibrium biased to the right with' the product) + then: [{T: "bildar"}] # phrase(hydrogen and oxygen 'forms' water ) + else: [{T: "reaktion bildar"}] # phrase(hydrogen and oxygen 'reacts to form' water) + - else_if: ".='⇌' or .='\u1f8d2'" + then: [{T: "är i jämvikt med"}] # phrase(a reactant 'is in equilibrium with' a product) + - else_if: ".='\u1f8d4'" + then: [{T: "är i jämvikt med, vänsterförskjuten"}] # phrase(the reactant 'is in equilibrium biased to the left with' the product) + - else_if: ".='\u1f8d3'" + then: [{T: "är i jämvikt med, högerförskjuten"}] # phrase(the reactant 'is in equilibrium biased to the right with' the product) else: [x: "*"] - name: chemical-equation-operator From 4e29795c10a27ba19b7c253c3cd440f9cb6cdd64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Arborealis=20L=C3=B6tberg?= <143188129+TimArborealis@users.noreply.github.com> Date: Wed, 3 Jun 2026 12:04:40 +0200 Subject: [PATCH 15/27] Update default.yaml --- Rules/Languages/sv/SharedRules/default.yaml | 83 ++++++++++----------- 1 file changed, 40 insertions(+), 43 deletions(-) diff --git a/Rules/Languages/sv/SharedRules/default.yaml b/Rules/Languages/sv/SharedRules/default.yaml index 17c0a9c3c..58d54a729 100644 --- a/Rules/Languages/sv/SharedRules/default.yaml +++ b/Rules/Languages/sv/SharedRules/default.yaml @@ -6,10 +6,12 @@ replace: - with: variables: - - ClearSpeak_Fractions: "IFTHENELSE($Verbosity='Verbose' and $ClearSpeak_Fractions='Auto', 'EndFrac', $ClearSpeak_Fractions)" - - ClearSpeak_AbsoluteValue: "IFTHENELSE($Verbosity='Verbose' and $ClearSpeak_AbsoluteValue='Auto', 'AbsEnd', $ClearSpeak_AbsoluteValue)" - - ClearSpeak_Roots: "IFTHENELSE($Verbosity='Verbose' and $ClearSpeak_Roots='Auto', 'RootEnd', $ClearSpeak_Roots)" - - ClearSpeak_Matrix: "IFTHENELSE($Verbosity='Verbose' and $ClearSpeak_Matrix='Auto', 'EndMatrix', $ClearSpeak_Matrix)" + - ClearSpeak_Fractions: "IfThenElse($Verbosity='Verbose' and $ClearSpeak_Fractions='Auto', 'EndFrac', $ClearSpeak_Fractions)" + - ClearSpeak_AbsoluteValue: "IfThenElse($Verbosity='Verbose' and $ClearSpeak_AbsoluteValue='Auto', 'AbsEnd', $ClearSpeak_AbsoluteValue)" + - ClearSpeak_Roots: "IfThenElse($Verbosity='Verbose' and $ClearSpeak_Roots='Auto', 'RootEnd', $ClearSpeak_Roots)" + - ClearSpeak_Matrix: "IfThenElse($Verbosity='Verbose' and $ClearSpeak_Matrix='Auto', 'EndMatrix', $ClearSpeak_Matrix)" + + - MatchingPause: false() # should be set at mtable level, but unknown intents make that impossible to know - IsColumnSilent: false() replace: @@ -55,9 +57,11 @@ replace: - bookmark: "@id" - test: - if: "string-length(.) = 1 and text() != '_'" # need unicode.tdl to kick in for single letter tokens + - if: "string-length(.) = 1 and text() != '_'" # need unicode.tdl to kick in for single letter tokens then: [x: "text()"] - else: [x: "translate(., '-_', ' ')" ] # from intent literals + - else_if: "@data-chem-element" # NavMode=Character needs this + then: [SPELL: "text()", pause: "short"] + else: [x: "translate(., '-_\u00A0', ' ')"] # from intent literals or from extra spaces added (which get deleted) - name: default tag: ms @@ -108,7 +112,7 @@ - pause: medium # not sure what really should be said for these since we should not assume they are square roots -- name: literal-default +- name: literal-default # audit-ignore tag: msqrt match: "." replace: @@ -120,7 +124,7 @@ then: [T: "slut rot", pause: medium] # phrase("root of x 'end root symbol'") # not sure what really should be said for these since we should not assume they are square roots -- name: literal-default +- name: literal-default # audit-ignore tag: mroot match: "." replace: @@ -134,10 +138,11 @@ if: "not(IsNode(*[2],'leaf'))" then: [T: "slut rot"] # phrase("root of x 'end root symbol'") -- name: simple-sub +- name: simple-sub # audit-ignore tag: indexed-by # invisible comma -- want "x 1 when subscript is an integer" - match: "count(*)=2 and $Verbosity='Terse' and *[2][self::m:mn and translate(., '.,', '')=.]" + # SWEDISH: want to skip announcing "index" not only when integer but also the index consists of one single character + match: "count(*)=2 and $Verbosity='Terse' and IsNode(*[2], 'leaf') and ( (*[2][self::m:mn and translate(., '.,', '')=.]) or string-length(*[2])=1 )" replace: - x: "*[1]" - x: "*[2]" @@ -145,14 +150,12 @@ - name: no-end-sub tag: indexed-by - # invisible comma -- want "x 1 when subscript is an integer" - match: "count(*)=2 and (IsNode(*[2], 'leaf') or *[2][self::m:mrow][*[2][.='⁣']])" + match: "count(*)=2 and *[2][self::m:mrow and *[2][.='⁣']]" replace: - x: "*[1]" - - test: - if: "$Verbosity!='Terse' or not(*[2][self::m:mn])" # just say "x 1" for terse vs "x sub 1" - then: [T: "nedsänkt"] # phrase(x 'sub' 2) + - T: "nedsänkt" # phrase(x 'sub' 2) - x: "*[2]" + - pause: short - name: power-indexed-by tag: power-indexed-by @@ -173,7 +176,7 @@ then: [T: "nedsänkt"] # phrase(x 'sub' 2) - x: "*[2]" -- name: structure +- name: literal tag: [msup, msubsup] match: "." replace: @@ -187,34 +190,26 @@ if: "*[last()][translate(., '′″‴⁗†‡°*', '')='']" then: [x: "*[last()]"] else_test: - if: "ancestor-or-self::*[contains(@data-intent-property, ':structure:')]" # FIX: is this test necessary? + if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" # FIX: is this test necessary? then: - T: "upphöjt" # phrase(x 'super' 2) - x: "*[last()]" - test: - if: "not(IsNode(*[last()], 'simple'))" + if: "not(IsNode(*[last()], 'simple')) or $Impairment = 'Blindness'" then: [T: "slut upphöjt"] # phrase(x super 2 'end of super') else: - - T: "upphöjt till" # phrase(5 'raised to the' second power equals 25) + - test: + if: "$Verbosity='Verbose'" + then: [T: "övre index"] + else: [T: "upphöjt"] - x: "*[last()]" - # - t: "power" # phrase(5 raised to the second 'power' equals 25) - -# - name: default -# tag: munder -# match: "." -# replace: -# - test: -# if: "not(IsNode(*[1], 'leaf'))" -# then: [T: "kommenterat uttryck"] # phrase(phrase(x 'modified' with y above it) -# - x: "*[1]" -# - pause: short -# - T: "med kommentar under" # phrase(x 'with' z below it) -# - pause: short -# - x: "*[2]" -# - pause: short -# - T: "slut kommentar" # phrase(x with z 'below' it) + - test: + if: "$Verbosity='Verbose'" + then: [T: "slut övre index"] + else: [T: "slut upphöjt"] -- name: default +# SWEDISH: adapted the rule for less verbose speaking of expressions with a brace under them and then with something under the brace +- name: default # audit-ignore tag: munder match: "." replace: @@ -246,7 +241,7 @@ - name: diacriticals tag: mover - match: "*[1][self::m:mi] and *[2][translate(., '\u0306\u030c.\u00A8\u02D9\u20DB\u20DC`^~→¯_', '')='']" + match: "*[1][self::m:mi] and *[2][translate(., '\u0306\u030c.\u00A8\u02D9\u20DB\u20DC`^ˇ~→¯_', '')='']" replace: - x: "*[1]" - x: "*[2]" @@ -285,11 +280,12 @@ - pause: short - T: "slut kommentar" # phrase(x modified with y 'above' it) -- name: default +- name: default # audit-ignore # Here we support up to 2 prescripts and up to 4 postscripts -- that should cover all reasonable cases # If there are more, we just dump them out without regard to sup/super :-( # FIX: this could use more special cases # There is (currently) no way in MathCAT to deal with n-ary arguments other than "all" ('*') or an individual entry ('*[1]'). + # SWEDISH: announce "left index" also if there are no right indexes tag: mmultiscripts match: "." variables: @@ -374,9 +370,10 @@ else: - test: if: "$Prescripts" - then: [T: "och"] - - T: "höger index" - - pause: short + then: + - T: "och" + - T: "höger index" + - pause: short - test: if: "not($Postscripts[1][self::m:none])" then: @@ -461,7 +458,7 @@ - T: "och" # phrase(the table with 3 rows 'and' 4 columns) - x: "$NumColumns" - test: - if: "$NumColumns" + if: "NumColumns=1" then: [T: "kolumn"] # phrase(the table with 3 rows and 1 'column') else: [T: "kolumner"] # phrase(the table with 3 rows and 4 'columns') - pause: long @@ -719,7 +716,7 @@ then: [pause: short] else: [pause: auto] -- name: function-intent +- name: function-intent # audit-ignore # uncaught intent -- speak as foo of arg1 comma arg2 .... The MathML spec requires arguments to functions tag: "*" match: "count(*)>0" From e977159fede046f12ad248c7cc2bafb10cf83a95 Mon Sep 17 00:00:00 2001 From: AndersEkl Date: Wed, 3 Jun 2026 13:23:55 +0200 Subject: [PATCH 16/27] Update general.yaml Hopefully this fix will solve a lot of the failed tests. #15 --- Rules/Languages/sv/SharedRules/general.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Rules/Languages/sv/SharedRules/general.yaml b/Rules/Languages/sv/SharedRules/general.yaml index 161996e10..be981e709 100644 --- a/Rules/Languages/sv/SharedRules/general.yaml +++ b/Rules/Languages/sv/SharedRules/general.yaml @@ -283,7 +283,10 @@ IsInDefinition(substring(., 2), 'Speech', 'NeuterUnits') != '' ) ]" replace: - - x: "IfThenElse($NeuterUnitFollows, 'ett', 'en')" + - test: + if: "$UnitSibling/..[self::m:mrow and count(*)=3 and *[2][.='\u2062']]" + then: [{x: "IfThenElse($NeuterUnitFollows, 'ett', 'en')"}] + else: [{T: "1"}] # the order of matching is # 1. does it match the base of an SI unit From b3e5649649d5d395d869ca54c306ce3871d3682e Mon Sep 17 00:00:00 2001 From: AndersEkl Date: Fri, 5 Jun 2026 11:26:25 +0200 Subject: [PATCH 17/27] Updated functions.rs Both for ClearSpeak and SimpleSpeak --- tests/Languages/sv/ClearSpeak/functions.rs | 12 ++++++------ tests/Languages/sv/SimpleSpeak/functions.rs | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/Languages/sv/ClearSpeak/functions.rs b/tests/Languages/sv/ClearSpeak/functions.rs index d49f3d988..bea4d081e 100644 --- a/tests/Languages/sv/ClearSpeak/functions.rs +++ b/tests/Languages/sv/ClearSpeak/functions.rs @@ -107,7 +107,7 @@ fn simple_log() -> Result<()> { #[test] fn normal_log() -> Result<()> { let expr = "log(x+y)"; - test("sv", "ClearSpeak", expr, "logg, vänster-parentes; x plus y; höger-parentes")?; + test("sv", "ClearSpeak", expr, "logg av, vänster-parentes; x plus y; höger-parentes")?; return Ok(()); } @@ -139,7 +139,7 @@ fn simple_ln() -> Result<()> { #[test] fn normal_ln() -> Result<()> { let expr = "ln(x+y)"; - test("sv", "ClearSpeak", expr, "l n, vänster-parentes; x plus y; höger-parentes")?; + test("sv", "ClearSpeak", expr, "l n av, vänster-parentes; x plus y; höger-parentes")?; return Ok(()); } @@ -159,7 +159,7 @@ fn simple_natural_log() -> Result<()> { fn natural_log() -> Result<()> { let expr = "ln(x+y)"; test_ClearSpeak("sv", "ClearSpeak_Log", "LnAsNaturalLog",expr, - "naturliga logaritmen; vänster-parentes; x plus y; höger-parentes")?; + "naturliga logaritmen av; vänster-parentes; x plus y; höger-parentes")?; return Ok(()); } @@ -207,7 +207,7 @@ fn test_functions_none_pref() -> Result<()> { f(x+y) "; test_ClearSpeak("sv", "ClearSpeak_Functions", "None",expr, - "logg, vänster-parentes; x plus y; höger-parentes; plus; f gånger, vänster-parentes; x plus y; höger-parentes")?; + "logg av, vänster-parentes; x plus y; höger-parentes; plus; f gånger, vänster-parentes; x plus y; höger-parentes")?; return Ok(()); } @@ -265,7 +265,7 @@ fn no_times_sqrt() -> Result<()> { = ab "; - test("sv", "ClearSpeak", expr, "kvadratroten ur a; kvadratroten ur b; lika med, kvadratroten ur a b")?; + test("sv", "ClearSpeak", expr, "kvadratroten ur a; gånger kvadratroten ur b; lika med, kvadratroten ur a b")?; return Ok(()); } @@ -358,7 +358,7 @@ fn explicit_times_none_superscript() -> Result<()> { xy ) "; - test("sv", "ClearSpeak", expr, "b x y")?; + test("sv", "ClearSpeak", expr, "b, vänster parentes; x y; höger parentes")?; return Ok(()); } diff --git a/tests/Languages/sv/SimpleSpeak/functions.rs b/tests/Languages/sv/SimpleSpeak/functions.rs index 8d7aa2ca7..2fa4531b9 100644 --- a/tests/Languages/sv/SimpleSpeak/functions.rs +++ b/tests/Languages/sv/SimpleSpeak/functions.rs @@ -86,7 +86,7 @@ fn trig_power_other() -> Result<()> { #[test] fn simple_log() -> Result<()> { let expr = " logx "; - test("sv", "SimpleSpeak", expr, "logg x")?; + test("sv", "SimpleSpeak", expr, "logg av x")?; return Ok(()); } @@ -118,7 +118,7 @@ fn normal_log_with_base() -> Result<()> { #[test] fn simple_ln() -> Result<()> { let expr = " lnx "; - test("sv", "SimpleSpeak", expr, "l n x")?; + test("sv", "SimpleSpeak", expr, "l n av x")?; return Ok(()); } @@ -135,7 +135,7 @@ fn normal_ln() -> Result<()> { fn normal_ln_terse() -> Result<()> { let expr = "ln(x+y)"; test_prefs("sv", "SimpleSpeak", vec![("Verbosity", "Terse")], - expr, "l n av, start-parentes; x plus y; slut-parentes")?; + expr, "l n, start-parentes; x plus y; slut-parentes")?; return Ok(()); } From 7c5d1c94f451d4cfda824fda78107f5156345b2b Mon Sep 17 00:00:00 2001 From: AndersEkl Date: Fri, 5 Jun 2026 11:48:30 +0200 Subject: [PATCH 18/27] Fixed a multiline test fail Both ClearSpeak_rules.yaml and multiline.rs needed an update. --- Rules/Languages/sv/ClearSpeak_Rules.yaml | 2 +- tests/Languages/sv/ClearSpeak/multiline.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Rules/Languages/sv/ClearSpeak_Rules.yaml b/Rules/Languages/sv/ClearSpeak_Rules.yaml index 75bcee6f9..ee8089071 100644 --- a/Rules/Languages/sv/ClearSpeak_Rules.yaml +++ b/Rules/Languages/sv/ClearSpeak_Rules.yaml @@ -692,7 +692,7 @@ - else_if: "$ClearSpeak_MultiLineLabel = 'Auto' or $ClearSpeak_MultiLineLabel = 'Line' or $ClearSpeak_MultiLineLabel = 'None'" # already dealt with Auto/Case then: - test: - - if: "count(*) > 1 and $ClearSpeak_MultiLineLabel != 'None'" + - if: "count(*) > 1" then: [T: "rader"] # phrase(this is the first 'line' of three lines) else: [T: "rad"] # phrase(this is the first 'line' of three lines) - else_if: "$ClearSpeak_MultiLineLabel = 'Constraint'" diff --git a/tests/Languages/sv/ClearSpeak/multiline.rs b/tests/Languages/sv/ClearSpeak/multiline.rs index 73cf7209d..ee1fe2574 100644 --- a/tests/Languages/sv/ClearSpeak/multiline.rs +++ b/tests/Languages/sv/ClearSpeak/multiline.rs @@ -122,7 +122,7 @@ fn equation_none() -> Result<()> { "; test_ClearSpeak("sv", "ClearSpeak_MultiLineLabel", "None", expr, - "2; x plus y lika med 7; 2 x plus 3 y; lika med 17")?; + "2 rader; x plus y lika med 7; 2 x plus 3 y; lika med 17")?; return Ok(()); } From c65a75bd12afa8f1aa1a5ea3d7542f7b78142a98 Mon Sep 17 00:00:00 2001 From: AndersEkl Date: Fri, 5 Jun 2026 11:53:35 +0200 Subject: [PATCH 19/27] Fixed linear-algebra fails Restored language-specific rules for homomorphism and kernel. --- .../sv/SharedRules/linear-algebra.yaml | 39 ++++++++++++++++++- Rules/Languages/sv/definitions.yaml | 4 +- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/Rules/Languages/sv/SharedRules/linear-algebra.yaml b/Rules/Languages/sv/SharedRules/linear-algebra.yaml index 02d346b8e..846e8c39c 100644 --- a/Rules/Languages/sv/SharedRules/linear-algebra.yaml +++ b/Rules/Languages/sv/SharedRules/linear-algebra.yaml @@ -24,4 +24,41 @@ if: "$Verbosity!='Terse'" then: - T: "av" # phrase(systems 'of' linear equations) - - x: "*[1]" \ No newline at end of file + - x: "*[1]" + +- name: homomorphism + # can't use IntentMappings because this doesn't fit the function pattern + tag: homomorphism + match: "count(*)=1" + replace: + - test: + if: "$Verbosity!='Terse'" + then: [T: "mängden av endomorfismer på"] + else: [T: "endomorfismerna på"] + - x: "*[1]" + - test: + if: "$Impairment = 'Blindness' and not(*[last()][IsBracketed(., '', '') or IsNode(., 'simple')] )" + then: [T: "slut endomorfismerna"] + - test: + if: "IsNode(., '2D')" + then: [pause: short] + else: [pause: auto] + +- name: kernel + # can't use IntentMappings because this doesn't fit the function pattern + tag: kernel + match: "count(*)=1" + replace: + - T: "noll-rummet" # phrase(this is the 'kernel' of the function) + - test: + if: "$Verbosity!='Terse'" + then: + - T: "till" # phrase(systems 'of' linear equations) + - x: "*[1]" + - test: + if: "$Impairment = 'Blindness' and not(*[last()][IsBracketed(., '', '') or IsNode(., 'simple')] )" + then: [T: "slut noll-rummet"] + - test: + if: "IsNode(., '2D')" + then: [pause: short] + else: [pause: auto] \ No newline at end of file diff --git a/Rules/Languages/sv/definitions.yaml b/Rules/Languages/sv/definitions.yaml index e5d5125c6..040e530e9 100644 --- a/Rules/Languages/sv/definitions.yaml +++ b/Rules/Languages/sv/definitions.yaml @@ -40,8 +40,8 @@ "norm": "function=; normen; slut norm", "trace": "function=;spåret; slut spår", "dimension": "function=; dimensionen; slut dimension", - "homomorphism": "function= ; homomorfism; slut homomorfism", # doesn't fit function pattern - "kernel": "function= ; noll-rummet : noll-rummet till: noll-rummet till; slut noll-rummet", # doesn't fit function pattern + # "homomorphism": "function= ; homomorfism; slut homomorfism", # SWEDISH: doesn't fit function pattern + # "kernel": "function= ; noll-rummet : noll-rummet till: noll-rummet till; slut noll-rummet", # SWEDISH: doesn't fit function pattern "vector": "function= ; vektor: vektorn: vektorn || prefix=vektor: vektorn: vektorn", "cross-product": "infix=kryss: kryssprodukt: kryssprodukt", "dot-product": "infix=skalärt: skalärprodukt: skalärprodukt", From db6758c20045f667ef6fc7a6cecd87642c741999 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Arborealis=20L=C3=B6tberg?= <143188129+TimArborealis@users.noreply.github.com> Date: Fri, 5 Jun 2026 11:57:13 +0200 Subject: [PATCH 20/27] Tests updated Updated tests to conform to slight changes in speaking (pausing and 1/en) --- Rules/Languages/sv/SharedRules/general.yaml | 8 +- tests/Languages/sv/ClearSpeak/functions.rs | 2 +- tests/Languages/sv/mtable.rs | 20 +- tests/Languages/sv/shared.rs | 4 +- tests/Languages/sv/units.rs | 316 ++++++++++---------- 5 files changed, 175 insertions(+), 175 deletions(-) diff --git a/Rules/Languages/sv/SharedRules/general.yaml b/Rules/Languages/sv/SharedRules/general.yaml index be981e709..192c11204 100644 --- a/Rules/Languages/sv/SharedRules/general.yaml +++ b/Rules/Languages/sv/SharedRules/general.yaml @@ -563,20 +563,20 @@ - else_if: ".='lg'" then_test: if: "$Verbosity!='Verbose'" - then: [spell: "'lg'"] # phrase(the 'lg' of x) + then: [SPELL: "'lg'"] # phrase(the 'lg' of x) else: [T: "tio-logaritmen"] # SWEDISH: We have added the term "lg" for the logarithm with base 10. Also added a verbosity test for long and short form. - else_if: "$Verbosity!='Verbose'" - then: [spell: "'ln'"] + then: [SPELL: "'ln'"] else: [T: "naturliga logaritmen"] # phrase(the 'natural log' function is used in mathematics) else: - test: - if: ".='log'" then: [T: "logg"] # phrase(the 'log' function is used in mathematics) - else_if: ".='lg'" - then: [spell: "'lg'"] # phrase(the 'lg' of x) + then: [SPELL: "'lg'"] # phrase(the 'lg' of x) - else_if: "$Verbosity='Terse'" - then: [spell: "'ln'"] + then: [SPELL: "'ln'"] else: [T: "naturliga logaritmen"] # phrase(the 'natural log' function is used in mathematics) - name: multi-line # audit-ignore diff --git a/tests/Languages/sv/ClearSpeak/functions.rs b/tests/Languages/sv/ClearSpeak/functions.rs index d49f3d988..6e11a656a 100644 --- a/tests/Languages/sv/ClearSpeak/functions.rs +++ b/tests/Languages/sv/ClearSpeak/functions.rs @@ -265,7 +265,7 @@ fn no_times_sqrt() -> Result<()> { = ab "; - test("sv", "ClearSpeak", expr, "kvadratroten ur a; kvadratroten ur b; lika med, kvadratroten ur a b")?; + test("sv", "ClearSpeak", expr, "kvadratroten ur a; gånger kvadratroten ur b; lika med, kvadratroten ur a b")?; return Ok(()); } diff --git a/tests/Languages/sv/mtable.rs b/tests/Languages/sv/mtable.rs index 2dcc8e52c..94c8df512 100644 --- a/tests/Languages/sv/mtable.rs +++ b/tests/Languages/sv/mtable.rs @@ -678,8 +678,8 @@ let expr = "( )"; test_ClearSpeak("sv", "ClearSpeak_Matrix", "SpeakColNum", - expr, "2 gånger 2 matris; rad 1; kolumn 1; b nedsänkt 1 1, kolumn 2; b nedsänkt 1 2; \ - rad 2; kolumn 1; b nedsänkt 2 1, kolumn 2; b nedsänkt 2 2")?; + expr, "2 gånger 2 matris; rad 1; kolumn 1; b nedsänkt 1 1; kolumn 2; b nedsänkt 1 2; \ + rad 2; kolumn 1; b nedsänkt 2 1; kolumn 2; b nedsänkt 2 2")?; return Ok(()); } @@ -764,8 +764,8 @@ let expr = "( )"; test_ClearSpeak("sv", "ClearSpeak_Matrix", "SilentColNum", - expr, "2 gånger 2 matris; rad 1; b nedsänkt 1 1, b nedsänkt 1 2; \ - rad 2; b nedsänkt 2 1, b nedsänkt 2 2")?; + expr, "2 gånger 2 matris; rad 1; b nedsänkt 1 1; b nedsänkt 1 2; \ + rad 2; b nedsänkt 2 1; b nedsänkt 2 2")?; return Ok(()); } @@ -850,8 +850,8 @@ let expr = "( )"; test_ClearSpeak("sv", "ClearSpeak_Matrix", "EndMatrix", - expr, "2 gånger 2 matris; rad 1; kolumn 1; b nedsänkt 1 1, kolumn 2; b nedsänkt 1 2; \ - rad 2; kolumn 1; b nedsänkt 2 1, kolumn 2; b nedsänkt 2 2; slut matris")?; + expr, "2 gånger 2 matris; rad 1; kolumn 1; b nedsänkt 1 1; kolumn 2; b nedsänkt 1 2; \ + rad 2; kolumn 1; b nedsänkt 2 1; kolumn 2; b nedsänkt 2 2; slut matris")?; return Ok(()); } @@ -936,8 +936,8 @@ let expr = "( )"; test_ClearSpeak("sv", "ClearSpeak_Matrix", "Vector", - expr, "2 gånger 2 matris; rad 1; kolumn 1; b nedsänkt 1 1, kolumn 2; b nedsänkt 1 2; \ - rad 2; kolumn 1; b nedsänkt 2 1, kolumn 2; b nedsänkt 2 2")?; + expr, "2 gånger 2 matris; rad 1; kolumn 1; b nedsänkt 1 1; kolumn 2; b nedsänkt 1 2; \ + rad 2; kolumn 1; b nedsänkt 2 1; kolumn 2; b nedsänkt 2 2")?; return Ok(()); } @@ -1022,8 +1022,8 @@ let expr = "( )"; test_ClearSpeak("sv", "ClearSpeak_Matrix", "EndVector", - expr, "2 gånger 2 matris; rad 1; kolumn 1; b nedsänkt 1 1, kolumn 2; b nedsänkt 1 2; \ - rad 2; kolumn 1; b nedsänkt 2 1, kolumn 2; b nedsänkt 2 2; slut matris")?; + expr, "2 gånger 2 matris; rad 1; kolumn 1; b nedsänkt 1 1; kolumn 2; b nedsänkt 1 2; \ + rad 2; kolumn 1; b nedsänkt 2 1; kolumn 2; b nedsänkt 2 2; slut matris")?; return Ok(()); } diff --git a/tests/Languages/sv/shared.rs b/tests/Languages/sv/shared.rs index 5825213b2..4ee13f6fb 100644 --- a/tests/Languages/sv/shared.rs +++ b/tests/Languages/sv/shared.rs @@ -151,7 +151,7 @@ fn simple_msubsup() -> Result<()> { "; - test("sv", "ClearSpeak", expr, "x nedsänkt k upphöjt till i")?; + test("sv", "ClearSpeak", expr, "x nedsänkt k, upphöjt till i")?; return Ok(()); } @@ -183,7 +183,7 @@ fn presentation_mathml_in_semantics() -> Result<()> { "; - test("sv", "ClearSpeak", expr, "x nedsänkt k upphöjt till i")?; + test("sv", "ClearSpeak", expr, "x nedsänkt k, upphöjt till i")?; return Ok(()); } diff --git a/tests/Languages/sv/units.rs b/tests/Languages/sv/units.rs index 71ef855c1..01bc0a11c 100644 --- a/tests/Languages/sv/units.rs +++ b/tests/Languages/sv/units.rs @@ -84,17 +84,17 @@ fn si_base() -> Result<()> { 1sek,2sek "#; test("sv", "SimpleSpeak", expr, - "1 ampère, komma, 2 ampère, komma, \ - 1 candela, komma, 2 candela, komma, \ - 1 kelvin, komma, 2 kelvin, komma, \ - 1 kelvin, komma, 2 kelvin, komma, \ + "en ampère, komma, 2 ampère, komma, \ + en candela, komma, 2 candela, komma, \ + en kelvin, komma, 2 kelvin, komma, \ + en kelvin, komma, 2 kelvin, komma, \ ett gram, komma, 2 gram, komma, \ - 1 meter, komma, 2 meter, komma, \ - 1 mol, komma, 2 mol, komma, \ - 1 sekund, komma, 2 sekunder, komma, \ - 1 sekund, komma, 2 sekunder, komma, \ - 1 sekund, komma, 2 sekunder, komma, \ - 1 sekund, komma, 2 sekunder")?; + en meter, komma, 2 meter, komma, \ + en mol, komma, 2 mol, komma, \ + en sekund, komma, 2 sekunder, komma, \ + en sekund, komma, 2 sekunder, komma, \ + en sekund, komma, 2 sekunder, komma, \ + en sekund, komma, 2 sekunder")?; return Ok(()); } @@ -113,15 +113,15 @@ fn si_base_with_prefixes() -> Result<()> { 1nsek,2psek "#; test("sv", "SimpleSpeak", expr, - "1 quetta-ampère, komma; 2 ronna-ampère, komma; \ - 1 yotta-candela, komma; 2 zetta-candela, komma; \ - 1 exa-kelvin, komma; 2 peta-kelvin, komma; \ - 1 tera-kelvin, komma; 2 giga-kelvin, komma; \ + "en quetta-ampère, komma; 2 ronna-ampère, komma; \ + en yotta-candela, komma; 2 zetta-candela, komma; \ + en exa-kelvin, komma; 2 peta-kelvin, komma; \ + en tera-kelvin, komma; 2 giga-kelvin, komma; \ ett mega-gram, komma; 2 kilo-gram, komma; \ - 1 hekto-meter, komma; 2 deka-meter, komma; \ - 1 deci-mol, komma; 2 centi-mol, komma; \ - 1 milli-sekund, komma; 2 mikro-sekunder, komma; \ - 1 nano-sekund, komma; 2 piko-sekunder")?; + en hekto-meter, komma; 2 deka-meter, komma; \ + en deci-mol, komma; 2 centi-mol, komma; \ + en milli-sekund, komma; 2 mikro-sekunder, komma; \ + en nano-sekund, komma; 2 piko-sekunder")?; return Ok(()); } @@ -144,18 +144,18 @@ fn si_derived_1() -> Result<()> { 1lx,2lx "#; test("sv", "SimpleSpeak", expr, - "1 becquerel, komma, 2 becquerel, komma, \ - 1 coulomb, komma, 2 coulomb, komma; \ - 1 grad celsius, komma; 2 grader celsius, komma; \ - 1 grad celsius, komma; 2 grader celsius, komma, \ - 1 farad, komma, 2 farad, komma, \ - 1 gray, komma, 2 gray, komma, \ - 1 henry, komma, 2 henry, komma, \ - 1 hertz, komma, 2 hertz, komma, \ - 1 joule, komma, 2 joule, komma, \ - 1 katal, komma, 2 katal, komma, \ - 1 lumen, komma, 2 lumen, komma, \ - 1 lux, komma, 2 lux")?; + "en becquerel, komma, 2 becquerel, komma, \ + en coulomb, komma, 2 coulomb, komma; \ + en grad celsius, komma; 2 grader celsius, komma; \ + en grad celsius, komma; 2 grader celsius, komma, \ + en farad, komma, 2 farad, komma, \ + en gray, komma, 2 gray, komma, \ + en henry, komma, 2 henry, komma, \ + en hertz, komma, 2 hertz, komma, \ + en joule, komma, 2 joule, komma, \ + en katal, komma, 2 katal, komma, \ + en lumen, komma, 2 lumen, komma, \ + en lux, komma, 2 lux")?; return Ok(()); } @@ -177,18 +177,18 @@ fn si_derived_1_with_prefixes() -> Result<()> { 1p℃,2n℃ "#; test("sv", "SimpleSpeak", expr, - "1 quetta-becquerel, komma; 2 ronna-becquerel, komma; \ - 1 yotta-coulomb, komma; 2 zetta-coulomb, komma; \ - 1 exa-farad, komma; 2 peta-farad, komma; \ - 1 tera-gray, komma; 2 giga-gray, komma; \ - 1 mega-henry, komma; 2 kilo-henry, komma; \ - 1 deka-hertz, komma; 2 deci-hertz, komma; \ - 1 centi-joule, komma; 2 milli-joule, komma; \ - 1 mikro-katal, komma; 2 nano-katal, komma; \ - 1 piko-lumen, komma; 2 femto-lumen, komma; \ - 1 atto-lux, komma; 2 zepto-lux, komma; \ - 1 milli-grad celsius, komma; 2 mikro-grader celsius; komma; \ - 1 piko-grad celsius, komma; 2 nano-grader celsius")?; + "en quetta-becquerel, komma; 2 ronna-becquerel, komma; \ + en yotta-coulomb, komma; 2 zetta-coulomb, komma; \ + en exa-farad, komma; 2 peta-farad, komma; \ + en tera-gray, komma; 2 giga-gray, komma; \ + en mega-henry, komma; 2 kilo-henry, komma; \ + en deka-hertz, komma; 2 deci-hertz, komma; \ + en centi-joule, komma; 2 milli-joule, komma; \ + en mikro-katal, komma; 2 nano-katal, komma; \ + en piko-lumen, komma; 2 femto-lumen, komma; \ + en atto-lux, komma; 2 zepto-lux, komma; \ + en milli-grad celsius; komma; 2 mikro-grader celsius; komma; \ + en piko-grad celsius, komma; 2 nano-grader celsius")?; return Ok(()); } @@ -208,16 +208,16 @@ fn si_derived_2() -> Result<()> { 1Wb,2Wb "#; test("sv", "SimpleSpeak", expr, - "1 newton, komma, 2 newton, komma, \ - 1 ohm, komma, 2 ohm, komma, \ - 1 ohm, komma, 2 ohm, komma, \ - 1 pascal, komma, 2 pascal, komma, \ - 1 siemens, komma, 2 siemens, komma, \ - 1 sievert, komma, 2 sievert, komma, \ - 1 tesla, komma, 2 tesla, komma, \ - 1 volt, komma, 2 volt, komma, \ - 1 watt, komma, 2 watt, komma, \ - 1 weber, komma, 2 weber")?; + "en newton, komma, 2 newton, komma, \ + en ohm, komma, 2 ohm, komma, \ + en ohm, komma, 2 ohm, komma, \ + en pascal, komma, 2 pascal, komma, \ + en siemens, komma, 2 siemens, komma, \ + en sievert, komma, 2 sievert, komma, \ + en tesla, komma, 2 tesla, komma, \ + en volt, komma, 2 volt, komma, \ + en watt, komma, 2 watt, komma, \ + en weber, komma, 2 weber")?; return Ok(()); } @@ -237,16 +237,16 @@ fn si_derived_2_with_prefixes() -> Result<()> { 1PWb,2EWb "#; test("sv", "SimpleSpeak", expr, - "1 quekto-newton, komma; 2 ronto-newton, komma; \ - 1 yokto-ohm, komma; 2 zepto-ohm, komma; \ - 1 atto-ohm, komma; 2 femto-ohm, komma; \ - 1 piko-pascal, komma; 2 nano-pascal, komma; \ - 1 mikro-siemens, komma; 2 milli-siemens, komma; \ - 1 centi-sievert, komma; 2 deci-sievert, komma; \ - 1 deka-tesla, komma; 2 hekto-tesla, komma; \ - 1 kilo-volt, komma; 2 mega-volt, komma; \ - 1 giga-watt, komma; 2 tera-watt, komma; \ - 1 peta-weber, komma; 2 exa-weber")?; + "en quekto-newton, komma; 2 ronto-newton, komma; \ + en yokto-ohm, komma; 2 zepto-ohm, komma; \ + en atto-ohm, komma; 2 femto-ohm, komma; \ + en piko-pascal, komma; 2 nano-pascal, komma; \ + en mikro-siemens, komma; 2 milli-siemens, komma; \ + en centi-sievert, komma; 2 deci-sievert, komma; \ + en deka-tesla, komma; 2 hekto-tesla, komma; \ + en kilo-volt, komma; 2 mega-volt, komma; \ + en giga-watt, komma; 2 tera-watt, komma; \ + en peta-weber, komma; 2 exa-weber")?; return Ok(()); } @@ -272,21 +272,21 @@ fn si_accepted() -> Result<()> { 1Bd,2Bd "#; test("sv", "SimpleSpeak", expr, - "1 liter, komma, 2 liter, komma, \ - 1 liter, komma, 2 liter, komma, \ - 1 liter, komma, 2 liter, komma, \ + "en liter, komma, 2 liter, komma, \ + en liter, komma, 2 liter, komma, \ + en liter, komma, 2 liter, komma, \ ett tonn, komma, 2 tonn, komma, \ - 1 dalton, komma, 2 dalton, komma, \ - 1 neper, komma, 2 neper, komma; \ - 1 atommassenhet, komma; 2 atommassenheter, komma; \ - 1 elektronvolt, komma; 2 elektronvolt, komma, \ - 1 radian, komma, 2 radianer, komma, \ - 1 steradian, komma, 2 steradianer, komma, \ + en dalton, komma, 2 dalton, komma, \ + en neper, komma, 2 neper, komma; \ + en atommassenhet, komma; 2 atommassenheter, komma; \ + en elektronvolt, komma; 2 elektronvolt, komma, \ + en radian, komma, 2 radianer, komma, \ + en steradian, komma, 2 steradianer, komma, \ ett annum, komma, 2 annum, komma, \ - 1 bågsekund, komma; 2 bågsekunder, komma, \ - 1 bit, komma, 2 bits, komma, \ - 1 byte, komma, 2 bytes, komma, \ - 1 baud, komma, 2 bauds")?; + en bågsekund, komma; 2 bågsekunder, komma, \ + en bit, komma, 2 bits, komma, \ + en byte, komma, 2 bytes, komma, \ + en baud, komma, 2 bauds")?; return Ok(()); } @@ -311,21 +311,21 @@ fn si_accepted_with_prefixes() -> Result<()> { 1TBd,2EBd "#; test("sv", "SimpleSpeak", expr, - "1 quetta-liter, komma; 2 ronna-liter, komma; \ - 1 yotta-liter, komma; 2 zetta-liter, komma; \ - 1 exa-liter, komma; 2 peta-liter, komma; \ + "en quetta-liter, komma; 2 ronna-liter, komma; \ + en yotta-liter, komma; 2 zetta-liter, komma; \ + en exa-liter, komma; 2 peta-liter, komma; \ ett tera-tonn, komma; 2 giga-tonn, komma; \ - 1 mega-dalton, komma; 2 kilo-dalton, komma; \ - 1 deci-neper, komma; 2 centi-neper, komma; \ - 1 hekto-atommassenhet; komma; 2 deka-atommassenheter; komma; \ - 1 milli-elektronvolt, komma; 2 mikro-elektronvolt, komma; \ - 1 nano-radian, komma; 2 piko-radianer, komma; \ - 1 femto-steradian, komma; 2 atto-steradianer, komma; \ + en mega-dalton, komma; 2 kilo-dalton, komma; \ + en deci-neper, komma; 2 centi-neper, komma; \ + en hekto-atommassenhet; komma; 2 deka-atommassenheter; komma; \ + en milli-elektronvolt; komma; 2 mikro-elektronvolt, komma; \ + en nano-radian, komma; 2 piko-radianer, komma; \ + en femto-steradian, komma; 2 atto-steradianer, komma; \ ett giga-annum, komma; 2 mega-annum, komma; \ - 1 zepto-bågsekund, komma; 2 yokto-bågsekunder, komma; \ - 1 kilo-bit, komma; 2 mega-bits, komma; \ - 1 giga-byte, komma; 2 tera-bytes, komma; \ - 1 tera-baud, komma; 2 exa-bauds")?; + en zepto-bågsekund, komma; 2 yokto-bågsekunder, komma; \ + en kilo-bit, komma; 2 mega-bits, komma; \ + en giga-byte, komma; 2 tera-bytes, komma; \ + en tera-baud, komma; 2 exa-bauds")?; return Ok(()); } @@ -349,18 +349,18 @@ fn without_prefix_timme() -> Result<()> { 1yr,2yr "#; test("sv", "SimpleSpeak", expr, - "1 sekund, komma, 2 sekunder, komma, \ - 1 sekund, komma, 2 sekunder, komma, \ - 1 minut, komma, 2 minuter, komma, \ - 1 minut, komma, 2 minuter, komma, \ - 1 minut, komma, 2 minuter, komma, \ - 1 timme, komma, 2 timmar, komma, \ - 1 timme, komma, 2 timmar, komma, \ - 1 timme, komma, 2 timmar, komma, \ - 1 dag, komma, 2 dagar, komma, \ - 1 dag, komma, 2 dagar, komma, \ - 1 vecka, komma, 2 veckor, komma, \ - 1 vecka, komma, 2 veckor, komma, \ + "en sekund, komma, 2 sekunder, komma, \ + en sekund, komma, 2 sekunder, komma, \ + en minut, komma, 2 minuter, komma, \ + en minut, komma, 2 minuter, komma, \ + en minut, komma, 2 minuter, komma, \ + en timme, komma, 2 timmar, komma, \ + en timme, komma, 2 timmar, komma, \ + en timme, komma, 2 timmar, komma, \ + en dag, komma, 2 dagar, komma, \ + en dag, komma, 2 dagar, komma, \ + en vecka, komma, 2 veckor, komma, \ + en vecka, komma, 2 veckor, komma, \ ett år, komma, 2 år, komma, \ ett år, komma, 2 år")?; return Ok(()); @@ -380,14 +380,14 @@ fn without_prefix_angles() -> Result<()> { 1asec,2asec "#; test("sv", "SimpleSpeak", expr, - "1 grad, komma, 2 grader, komma, \ - 1 grad, komma, 2 grader, komma, \ - 1 bågminut, komma, 2 bågminuter, komma, \ - 1 bågminut, komma, 2 bågminuter, komma, \ - 1 bågminut, komma, 2 bågminuter, komma, \ - 1 bågminut, komma, 2 bågminuter, komma, \ - 1 bågsekund, komma; 2 bågsekunder, komma, \ - 1 bågsekund, komma; 2 bågsekunder")?; + "en grad, komma, 2 grader, komma, \ + en grad, komma, 2 grader, komma, \ + en bågminut, komma, 2 bågminuter, komma, \ + en bågminut, komma, 2 bågminuter, komma, \ + en bågminut, komma, 2 bågminuter, komma, \ + en bågminut, komma, 2 bågminuter, komma, \ + en bågsekund, komma; 2 bågsekunder, komma, \ + en bågsekund, komma; 2 bågsekunder")?; return Ok(()); } @@ -403,12 +403,12 @@ fn without_prefix_distance() -> Result<()> { 1fm,2fm "#; test("sv", "SimpleSpeak", expr, - "1 astronomisk enhet, komma; 2 astronomiska enheter, komma, \ + "en astronomisk enhet, komma; 2 astronomiska enheter, komma, \ ett ljusår, komma, 2 ljusår, komma, \ - 1 parsek, komma, 2 parsek, komma, \ - 1 ångström, komma, 2 ångström, komma, \ - 1 ångström, komma, 2 ångström, komma, \ - 1 fermi, komma, 2 fermi")?; + en parsek, komma, 2 parsek, komma, \ + en ångström, komma, 2 ångström, komma, \ + en ångström, komma, 2 ångström, komma, \ + en fermi, komma, 2 fermi")?; return Ok(()); } @@ -432,20 +432,20 @@ fn without_prefix_other() -> Result<()> { 1erg,2erg "#; test("sv", "SimpleSpeak", expr, - "1 hektar, komma, 2 hektar, komma, \ - 1 decibel, komma, 2 decibel, komma, \ - 1 atmosfär, komma, 2 atmosfärer, komma; \ - 1 atommassenhet, komma; 2 atommassenheter, komma, \ - 1 bar, komma, 2 bar, komma, \ - 1 kalori, komma, 2 kalorier, komma, \ - 1 curie, komma, 2 curie, komma, \ - 1 gon, komma, 2 gon, komma, \ - 1 molar, komma, 2 molar, komma, \ - 1 röntgen, komma, 2 röntgen, komma; \ + "en hektar, komma, 2 hektar, komma, \ + en decibel, komma, 2 decibel, komma, \ + en atmosfär, komma, 2 atmosfärer, komma; \ + en atommassenhet, komma; 2 atommassenheter, komma, \ + en bar, komma, 2 bar, komma, \ + en kalori, komma, 2 kalorier, komma, \ + en curie, komma, 2 curie, komma, \ + en gon, komma, 2 gon, komma, \ + en molar, komma, 2 molar, komma, \ + en röntgen, komma, 2 röntgen, komma; \ ett varv per minut, komma; 2 varv per minut, komma, \ - 1 m-h-o, komma, 2 m-h-o, komma, \ - 1 dyn, komma, 2 dyn, komma, \ - 1 erg, komma, 2 erg")?; + en m-h-o, komma, 2 m-h-o, komma, \ + en dyn, komma, 2 dyn, komma, \ + en erg, komma, 2 erg")?; return Ok(()); } @@ -471,22 +471,22 @@ fn without_prefix_powers_of_2() -> Result<()> { 1YiB,2YiB "#; test("sv", "SimpleSpeak", expr, - "1 kibi-bit, komma, 2 kibi-bits, komma, \ - 1 mebi-bit, komma, 2 mebi-bits, komma, \ - 1 gibi-bit, komma, 2 gibi-bits, komma, \ - 1 tebi-bit, komma, 2 tebi-bits, komma, \ - 1 pebi-bit, komma, 2 pebi-bits, komma, \ - 1 exbi-bit, komma, 2 exbi-bits, komma, \ - 1 zebi-bit, komma, 2 zebi-bits, komma, \ - 1 yobi-bit, komma, 2 yobi-bits, komma, \ - 1 kibi-byte, komma, 2 kibi-bytes, komma, \ - 1 mebi-byte, komma, 2 mebi-bytes, komma, \ - 1 gibi-byte, komma, 2 gibi-bytes, komma, \ - 1 tebi-byte, komma, 2 tebi-bytes, komma, \ - 1 pebi-byte, komma, 2 pebi-bytes, komma, \ - 1 exbi-byte, komma, 2 exbi-bytes, komma, \ - 1 zebi-byte, komma, 2 zebi-bytes, komma, \ - 1 yobi-byte, komma, 2 yobi-bytes")?; + "en kibi-bit, komma, 2 kibi-bits, komma, \ + en mebi-bit, komma, 2 mebi-bits, komma, \ + en gibi-bit, komma, 2 gibi-bits, komma, \ + en tebi-bit, komma, 2 tebi-bits, komma, \ + en pebi-bit, komma, 2 pebi-bits, komma, \ + en exbi-bit, komma, 2 exbi-bits, komma, \ + en zebi-bit, komma, 2 zebi-bits, komma, \ + en yobi-bit, komma, 2 yobi-bits, komma, \ + en kibi-byte, komma, 2 kibi-bytes, komma, \ + en mebi-byte, komma, 2 mebi-bytes, komma, \ + en gibi-byte, komma, 2 gibi-bytes, komma, \ + en tebi-byte, komma, 2 tebi-bytes, komma, \ + en pebi-byte, komma, 2 pebi-bytes, komma, \ + en exbi-byte, komma, 2 exbi-bytes, komma, \ + en zebi-byte, komma, 2 zebi-bytes, komma, \ + en yobi-byte, komma, 2 yobi-bytes")?; return Ok(()); } @@ -530,8 +530,8 @@ fn one_neuter_unit() -> Result<()> { let expr = r#" 1min "#; - test("sv", "ClearSpeak", expr, "1 minut")?; - test("sv", "SimpleSpeak", expr, "1 minut")?; + test("sv", "ClearSpeak", expr, "en minut")?; + test("sv", "SimpleSpeak", expr, "en minut")?; return Ok(()); } @@ -542,8 +542,8 @@ fn one_masculine_feminine_unit() -> Result<()> { let expr = r#" 1hr "#; - test("sv", "ClearSpeak", expr, "1 timme")?; - test("sv", "SimpleSpeak", expr, "1 timme")?; + test("sv", "ClearSpeak", expr, "en timme")?; + test("sv", "SimpleSpeak", expr, "en timme")?; return Ok(()); } @@ -696,8 +696,8 @@ fn mixed_fractions_third_neuter_unit() -> Result<()> { min "#; - test("sv", "ClearSpeak", expr, "1 och en tredjedels, minut")?; - test("sv", "SimpleSpeak", expr, "1 och en tredjedels, minut")?; + test("sv", "ClearSpeak", expr, "en och en tredjedels, minut")?; + test("sv", "SimpleSpeak", expr, "en och en tredjedels, minut")?; return Ok(()); } @@ -712,8 +712,8 @@ fn mixed_fractions_third_masculine_feminine_unit() -> Result<()> { hr "#; - test("sv", "ClearSpeak", expr, "1 och en tredjedels, timme")?; - test("sv", "SimpleSpeak", expr, "1 och en tredjedels, timme")?; + test("sv", "ClearSpeak", expr, "en och en tredjedels, timme")?; + test("sv", "SimpleSpeak", expr, "en och en tredjedels, timme")?; return Ok(()); } @@ -797,8 +797,8 @@ fn fraction_with_units_2_masculine_feminine_unit() -> Result<()> { 3sek "#; - test("sv", "ClearSpeak", expr, "division med täljaren 1 meter; och nämnaren 3 sekunder")?; - test("sv", "SimpleSpeak", expr, "division, 1 meter, genom, 3 sekunder, slut division")?; + test("sv", "ClearSpeak", expr, "division med täljaren en meter; och nämnaren 3 sekunder")?; + test("sv", "SimpleSpeak", expr, "division, en meter, genom, 3 sekunder, slut division")?; return Ok(()); } @@ -869,8 +869,8 @@ fn one_masculine_feminine_unit_prefix() -> Result<()> { let expr = r#" 1µm "#; - test("sv", "ClearSpeak", expr, "1 mikro-meter")?; - test("sv", "SimpleSpeak", expr, "1 mikro-meter")?; + test("sv", "ClearSpeak", expr, "en mikro-meter")?; + test("sv", "SimpleSpeak", expr, "en mikro-meter")?; return Ok(()); } @@ -914,8 +914,8 @@ fn mixed_fractions_third_masculine_feminine_unit_prefix() -> Result<()> { dN "#; - test("sv", "ClearSpeak", expr, "1 och en tredjedels, deci-newton")?; - test("sv", "SimpleSpeak", expr, "1 och en tredjedels, deci-newton")?; + test("sv", "ClearSpeak", expr, "en och en tredjedels, deci-newton")?; + test("sv", "SimpleSpeak", expr, "en och en tredjedels, deci-newton")?; return Ok(()); } @@ -984,8 +984,8 @@ fn acceleration_half_one_fraction() -> Result<()> { 2s2 "#; - test("sv", "ClearSpeak", expr, "division med täljaren 1 meter; och nämnaren 2 sekunder kvadrat")?; - test("sv", "SimpleSpeak", expr, "division, 1 meter, genom, 2 sekunder kvadrat, slut division")?; + test("sv", "ClearSpeak", expr, "division med täljaren en meter; och nämnaren 2 sekunder kvadrat")?; + test("sv", "SimpleSpeak", expr, "division, en meter, genom, 2 sekunder kvadrat, slut division")?; return Ok(()); } From 47ec724b8bd722d8a75322c8bce76eb679de8394 Mon Sep 17 00:00:00 2001 From: AndersEkl Date: Fri, 5 Jun 2026 12:46:32 +0200 Subject: [PATCH 21/27] Fixed some small errors --- tests/Languages/sv/ClearSpeak/functions.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Languages/sv/ClearSpeak/functions.rs b/tests/Languages/sv/ClearSpeak/functions.rs index bea4d081e..0c6ee05d7 100644 --- a/tests/Languages/sv/ClearSpeak/functions.rs +++ b/tests/Languages/sv/ClearSpeak/functions.rs @@ -159,7 +159,7 @@ fn simple_natural_log() -> Result<()> { fn natural_log() -> Result<()> { let expr = "ln(x+y)"; test_ClearSpeak("sv", "ClearSpeak_Log", "LnAsNaturalLog",expr, - "naturliga logaritmen av; vänster-parentes; x plus y; höger-parentes")?; + "naturliga logaritmen av, vänster-parentes; x plus y; höger-parentes")?; return Ok(()); } @@ -358,7 +358,7 @@ fn explicit_times_none_superscript() -> Result<()> { xy ) "; - test("sv", "ClearSpeak", expr, "b, vänster parentes; x y; höger parentes")?; + test("sv", "ClearSpeak", expr, "b, vänster-parentes; x y; höger-parentes")?; return Ok(()); } From 8c422d8822bffd1b37d9df65f8ff507fea975f6d Mon Sep 17 00:00:00 2001 From: AndersEkl Date: Fri, 5 Jun 2026 13:46:57 +0200 Subject: [PATCH 22/27] Bug fix --- Rules/Languages/sv/ClearSpeak_Rules.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Rules/Languages/sv/ClearSpeak_Rules.yaml b/Rules/Languages/sv/ClearSpeak_Rules.yaml index ee8089071..0484e9da3 100644 --- a/Rules/Languages/sv/ClearSpeak_Rules.yaml +++ b/Rules/Languages/sv/ClearSpeak_Rules.yaml @@ -526,8 +526,8 @@ match: "." # SWEDISH: Differentiate between the initial and ending declaration of the terms. variables: - - WordToSay: "IFTHENELSE($ClearSpeak_AbsoluteValue = 'Kardinaliteten', 'kardinaliteten', 'absolutbeloppet')" - - EndToSay: "IFTHENELSE($ClearSpeak_AbsoluteValue = 'Kardinalitet', 'kardinalitet', 'absolutbelopp')" + - WordToSay: "IFTHENELSE($ClearSpeak_AbsoluteValue = 'Cardinality', 'kardinaliteten', 'absolutbeloppet')" + - EndToSay: "IFTHENELSE($ClearSpeak_AbsoluteValue = 'Cardinality', 'kardinalitet', 'absolutbelopp')" replace: - x: "$WordToSay" - T: "av" # phrase(the absolute value 'of' 25) From 9f8473d2396c716494468095a71f162388441d88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Arborealis=20L=C3=B6tberg?= <143188129+TimArborealis@users.noreply.github.com> Date: Fri, 5 Jun 2026 14:03:08 +0200 Subject: [PATCH 23/27] Update navigate.yaml --- Rules/Languages/sv/navigate.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Rules/Languages/sv/navigate.yaml b/Rules/Languages/sv/navigate.yaml index e66c10605..262c0d8ab 100644 --- a/Rules/Languages/sv/navigate.yaml +++ b/Rules/Languages/sv/navigate.yaml @@ -98,6 +98,11 @@ (name(.)='mrow' or name(.) = 'mtr' or name(.) = 'mlabeledtr' or @data-from-mathml = 'mtable')" replace: [] +- name: into-or-out-of-minus-silent-on-zoom-out + tag: "*" + match: "$Move2D != '' and name(.)='minus' and count(*)=1 and ($NavCommand = 'ZoomOut' or $NavCommand = 'ZoomOutAll')" + replace: [] + - name: into-or-out-of-mtr # audit-ignore tag: [mtr, mlabeledtr] match: "$Move2D = 'i'" # Navigate into a 2D structure. From db28108c382b70387019f9779e3e451a716f97ea Mon Sep 17 00:00:00 2001 From: AndersEkl Date: Fri, 5 Jun 2026 14:18:12 +0200 Subject: [PATCH 24/27] Fixed a language-dependent issue --- Rules/Languages/sv/navigate.yaml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/Rules/Languages/sv/navigate.yaml b/Rules/Languages/sv/navigate.yaml index 262c0d8ab..69d2aad1c 100644 --- a/Rules/Languages/sv/navigate.yaml +++ b/Rules/Languages/sv/navigate.yaml @@ -56,37 +56,37 @@ else: - test: - if: "starts-with($NavCommand, 'Zoom')" - then: [set_variables: [Prefix: "'zooma'"]] # phrase('zoom' in to see more details) + then: [set_variables: [Prefix: "'zooma'", CommandOffset: "5"]] # phrase('zoom' in to see more details) - else_if: "starts-with($NavCommand, 'Move')" - then: [set_variables: [Prefix: "'gå'"]] # phrase('move' to next entry in table) + then: [set_variables: [Prefix: "'gå'", CommandOffset: "5"]] # phrase('move' to next entry in table) - else_if: "starts-with($NavCommand, 'Read')" - then: [set_variables: [Prefix: "'läs'"]] # phrase('read' to next entry in table) + then: [set_variables: [Prefix: "'läs'", CommandOffset: "5"]] # phrase('read' to next entry in table) - else_if: "starts-with($NavCommand, 'Describe')" - then: [set_variables: [Prefix: "'beskriv'"]] # phrase('describe' to next entry in table) + then: [set_variables: [Prefix: "'beskriv'", CommandOffset: "9"]] # phrase('describe' to next entry in table) - test: if: "$Prefix != ''" then: - x: "$Prefix" - test: - - if: "substring($NavCommand, string-length($Prefix)+1) = 'In'" + - if: "substring($NavCommand, $CommandOffset) = 'In'" then: [T: "in"] # phrase(zoom 'in' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'InAll'" + - else_if: "substring($NavCommand, $CommandOffset) = 'InAll'" # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets "ed" concatenated to "zoom" - then: [T: "\uF8FEat helt in"] # phrase(zoom 'out all of the way' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Out'" + then: [T: "\uF8FEt helt in"] # phrase(zoom 'out all of the way' to see more details) + - else_if: "substring($NavCommand, $CommandOffset) = 'Out'" then: [T: "ut"] # phrase(zoom 'out' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'OutAll'" + - else_if: "substring($NavCommand, $CommandOffset) = 'OutAll'" # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets "ed" concatenated to "zoom" - then: [T: "\uF8FEat helt ut"] # phrase(zoom 'out all of the way' to see more details) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Next'" + then: [T: "\uF8FEt helt ut"] # phrase(zoom 'out all of the way' to see more details) + - else_if: "substring($NavCommand, $CommandOffset) = 'Next'" then: [T: "höger"] # phrase(move to the 'right') - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Previous'" + - else_if: "substring($NavCommand, $CommandOffset) = 'Previous'" then: [T: "vänster"] # phrase(move to the 'left') - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Current'" + - else_if: "substring($NavCommand, $CommandOffset) = 'Current'" then: [T: "nuvarande"] # phrase(who is the 'current' president) - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'LineStart'" + - else_if: "substring($NavCommand, $CommandOffset) = 'LineStart'" then: [T: "till början av raden"] # phrase(move 'to start of line') - - else_if: "substring($NavCommand, string-length($Prefix)+1) = 'LineEnd'" + - else_if: "substring($NavCommand, $CommandOffset) = 'LineEnd'" then: [T: "till slutet av raden"] # phrase(move 'to end of line') - pause: "medium" - set_variables: [MatchCounter: "$MatchCounter + 1"] From e5478338ced97f609ff76447e38e15dbdf7d0893 Mon Sep 17 00:00:00 2001 From: AndersEkl Date: Fri, 5 Jun 2026 15:35:08 +0200 Subject: [PATCH 25/27] Added audit-ignore to reintroduced rules --- Rules/Languages/sv/SharedRules/linear-algebra.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Rules/Languages/sv/SharedRules/linear-algebra.yaml b/Rules/Languages/sv/SharedRules/linear-algebra.yaml index 846e8c39c..372166472 100644 --- a/Rules/Languages/sv/SharedRules/linear-algebra.yaml +++ b/Rules/Languages/sv/SharedRules/linear-algebra.yaml @@ -26,7 +26,7 @@ - T: "av" # phrase(systems 'of' linear equations) - x: "*[1]" -- name: homomorphism +- name: homomorphism # audit-ignore # can't use IntentMappings because this doesn't fit the function pattern tag: homomorphism match: "count(*)=1" @@ -44,7 +44,7 @@ then: [pause: short] else: [pause: auto] -- name: kernel +- name: kernel # audit-ignore # can't use IntentMappings because this doesn't fit the function pattern tag: kernel match: "count(*)=1" From 013add88419ebee0304889dfab1cd02e00550659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Arborealis=20L=C3=B6tberg?= <143188129+TimArborealis@users.noreply.github.com> Date: Mon, 8 Jun 2026 14:54:26 +0200 Subject: [PATCH 26/27] Fixed laplacian --- Rules/Languages/sv/definitions.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rules/Languages/sv/definitions.yaml b/Rules/Languages/sv/definitions.yaml index 040e530e9..643f50377 100644 --- a/Rules/Languages/sv/definitions.yaml +++ b/Rules/Languages/sv/definitions.yaml @@ -49,7 +49,7 @@ "divergence": "function= ; div: divergens: divergens; slut divergens", "curl": "function= ; rotation; slut rotation", "gradient": "function= ; grad: gradient: gradient; slut gradient", - "laplacian": "function=laplacian", # speech engines don't do a good job with "laplacian" (swedish ones might) + "laplacian": "function=laplacianen", # speech engines don't do a good job with "laplacian" (swedish ones might) "chemistry-concentration": "function= ; koncentration: koncentrationen av: koncentrationen av; slut koncentration", } From ac2c9290bcd7a4b6d396d630df7ace7683c5d6b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Arborealis=20L=C3=B6tberg?= <143188129+TimArborealis@users.noreply.github.com> Date: Mon, 22 Jun 2026 14:06:03 +0200 Subject: [PATCH 27/27] Minor typo fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added missing "bråk" to "slut bråk" announcement --- Rules/Languages/sv/SharedRules/default.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rules/Languages/sv/SharedRules/default.yaml b/Rules/Languages/sv/SharedRules/default.yaml index 58d54a729..0038f0b21 100644 --- a/Rules/Languages/sv/SharedRules/default.yaml +++ b/Rules/Languages/sv/SharedRules/default.yaml @@ -108,7 +108,7 @@ - pause: short - test: if: "$Impairment = 'Blindness'" - then: [T: "slut"] # phrase("start of fraction x over y 'end over'") + then: [T: "slut bråk"] # phrase("start of fraction x over y 'end over'") - pause: medium # not sure what really should be said for these since we should not assume they are square roots