Skip to content

Commit 12c19fc

Browse files
committed
OMML reader: consolidate adjacent texts with same style.
This affects EStyled and EText elements. This way we get `\mathbf{123abc456}` in LaTeX output instead of `\mathbf{123}\mathbf{abc}\mathbf{456}`. See jgm/pandoc#10560 for discussion.
1 parent 827ecab commit 12c19fc

File tree

2 files changed

+132
-117
lines changed

2 files changed

+132
-117
lines changed

src/Text/TeXMath/Readers/OMML.hs

+11-2
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ elemToOMML element | isElem "m" "oMathPara" element = do
6363
[x] -> x
6464
xs -> EGrouped xs) expList
6565
elemToOMML element | isElem "m" "oMath" element =
66-
Just $ concat $ mapMaybe elemToExps $ unwrapWTags $ elChildren element
66+
Just $ elemsToExps $ unwrapWTags $ elChildren element
6767
elemToOMML _ = Nothing
6868

6969
-- oMath can contain w:hyperlink, w:sdt, etc. I can't find a complete
@@ -221,8 +221,17 @@ oMathRunTextStyleToTextType (Styled scr sty)
221221
Just $ TextBoldItalic
222222
| otherwise = Nothing
223223

224+
-- merge adjacent Exps with same style; see jgm/pandoc#10560:
225+
mergeExps :: [Exp] -> [Exp]
226+
mergeExps [] = []
227+
mergeExps (EStyled tt xs : EStyled tt' xs' : rest)
228+
| tt == tt' = mergeExps (EStyled tt (xs <> xs') : rest)
229+
mergeExps (EText tt x : EText tt' x' : rest)
230+
| tt == tt' = mergeExps (EText tt (x <> x') : rest)
231+
mergeExps (x:xs) = x : mergeExps xs
232+
224233
elemsToExps :: [Element] -> [Exp]
225-
elemsToExps = concat . mapMaybe elemToExps
234+
elemsToExps = mergeExps . concat . mapMaybe elemToExps
226235

227236
elemToExps :: Element -> Maybe [Exp]
228237
elemToExps element = unGroup <$> elemToExps' element

test/reader/omml/20.test

+121-115
Original file line numberDiff line numberDiff line change
@@ -814,119 +814,125 @@
814814
</m:oMathPara>
815815

816816
>>> native
817-
[ EStyled TextScript [ EIdentifier "A" ]
818-
, EStyled TextScript [ EIdentifier "B" ]
819-
, EStyled TextScript [ EIdentifier "C" ]
820-
, EStyled TextScript [ EIdentifier "D" ]
821-
, EStyled TextScript [ EIdentifier "E" ]
822-
, EStyled TextScript [ EIdentifier "F" ]
823-
, EStyled TextScript [ EIdentifier "G" ]
824-
, EStyled TextScript [ EIdentifier "H" ]
825-
, EStyled TextScript [ EIdentifier "I" ]
826-
, EStyled TextScript [ EIdentifier "J" ]
827-
, EStyled TextScript [ EIdentifier "K" ]
828-
, EStyled TextScript [ EIdentifier "L" ]
829-
, EStyled TextScript [ EIdentifier "M" ]
830-
, EStyled TextScript [ EIdentifier "N" ]
831-
, EStyled TextScript [ EIdentifier "O" ]
832-
, EStyled TextScript [ EIdentifier "P" ]
833-
, EStyled TextScript [ EIdentifier "Q" ]
834-
, EStyled TextScript [ EIdentifier "R" ]
835-
, EStyled TextScript [ EIdentifier "S" ]
836-
, EStyled TextScript [ EIdentifier "T" ]
837-
, EStyled TextScript [ EIdentifier "U" ]
838-
, EStyled TextScript [ EIdentifier "V" ]
839-
, EStyled TextScript [ EIdentifier "W" ]
840-
, EStyled TextScript [ EIdentifier "X" ]
841-
, EStyled TextScript [ EIdentifier "Y" ]
842-
, EStyled TextScript [ EIdentifier "Z" ]
843-
, EStyled TextScript [ EIdentifier "a" ]
844-
, EStyled TextScript [ EIdentifier "b" ]
845-
, EStyled TextScript [ EIdentifier "c" ]
846-
, EStyled TextScript [ EIdentifier "d" ]
847-
, EStyled TextScript [ EIdentifier "e" ]
848-
, EStyled TextScript [ EIdentifier "f" ]
849-
, EStyled TextScript [ EIdentifier "g" ]
850-
, EStyled TextScript [ EIdentifier "h" ]
851-
, EStyled TextScript [ EIdentifier "i" ]
852-
, EStyled TextScript [ EIdentifier "j" ]
853-
, EStyled TextScript [ EIdentifier "k" ]
854-
, EStyled TextScript [ EIdentifier "l" ]
855-
, EStyled TextScript [ EIdentifier "m" ]
856-
, EStyled TextScript [ EIdentifier "n" ]
857-
, EStyled TextScript [ EIdentifier "o" ]
858-
, EStyled TextScript [ EIdentifier "p" ]
859-
, EStyled TextScript [ EIdentifier "q" ]
860-
, EStyled TextScript [ EIdentifier "r" ]
861-
, EStyled TextScript [ EIdentifier "s" ]
862-
, EStyled TextScript [ EIdentifier "t" ]
863-
, EStyled TextScript [ EIdentifier "u" ]
864-
, EStyled TextScript [ EIdentifier "v" ]
865-
, EStyled TextScript [ EIdentifier "w" ]
866-
, EStyled TextScript [ EIdentifier "x" ]
867-
, EStyled TextScript [ EIdentifier "y" ]
868-
, EStyled TextScript [ EIdentifier "z" ]
869-
, EStyled TextDoubleStruck [ EIdentifier "A" ]
870-
, EStyled TextDoubleStruck [ EIdentifier "B" ]
871-
, EStyled TextDoubleStruck [ EIdentifier "C" ]
872-
, EStyled TextDoubleStruck [ EIdentifier "D" ]
873-
, EStyled TextDoubleStruck [ EIdentifier "E" ]
874-
, EStyled TextDoubleStruck [ EIdentifier "F" ]
875-
, EStyled TextDoubleStruck [ EIdentifier "G" ]
876-
, EStyled TextDoubleStruck [ EIdentifier "H" ]
877-
, EStyled TextDoubleStruck [ EIdentifier "I" ]
878-
, EStyled TextDoubleStruck [ EIdentifier "J" ]
879-
, EStyled TextDoubleStruck [ EIdentifier "K" ]
880-
, EStyled TextDoubleStruck [ EIdentifier "L" ]
881-
, EStyled TextDoubleStruck [ EIdentifier "M" ]
882-
, EStyled TextDoubleStruck [ EIdentifier "N" ]
883-
, EStyled TextDoubleStruck [ EIdentifier "O" ]
884-
, EStyled TextDoubleStruck [ EIdentifier "P" ]
885-
, EStyled TextDoubleStruck [ EIdentifier "Q" ]
886-
, EStyled TextDoubleStruck [ EIdentifier "R" ]
887-
, EStyled TextDoubleStruck [ EIdentifier "S" ]
888-
, EStyled TextDoubleStruck [ EIdentifier "T" ]
889-
, EStyled TextDoubleStruck [ EIdentifier "U" ]
890-
, EStyled TextDoubleStruck [ EIdentifier "V" ]
891-
, EStyled TextDoubleStruck [ EIdentifier "W" ]
892-
, EStyled TextDoubleStruck [ EIdentifier "X" ]
893-
, EStyled TextDoubleStruck [ EIdentifier "Y" ]
894-
, EStyled TextDoubleStruck [ EIdentifier "Z" ]
895-
, EStyled TextDoubleStruck [ EIdentifier "a" ]
896-
, EStyled TextDoubleStruck [ EIdentifier "b" ]
897-
, EStyled TextDoubleStruck [ EIdentifier "c" ]
898-
, EStyled TextDoubleStruck [ EIdentifier "d" ]
899-
, EStyled TextDoubleStruck [ EIdentifier "e" ]
900-
, EStyled TextDoubleStruck [ EIdentifier "f" ]
901-
, EStyled TextDoubleStruck [ EIdentifier "g" ]
902-
, EStyled TextDoubleStruck [ EIdentifier "h" ]
903-
, EStyled TextDoubleStruck [ EIdentifier "i" ]
904-
, EStyled TextDoubleStruck [ EIdentifier "j" ]
905-
, EStyled TextDoubleStruck [ EIdentifier "k" ]
906-
, EStyled TextDoubleStruck [ EIdentifier "l" ]
907-
, EStyled TextDoubleStruck [ EIdentifier "m" ]
908-
, EStyled TextDoubleStruck [ EIdentifier "n" ]
909-
, EStyled TextDoubleStruck [ EIdentifier "o" ]
910-
, EStyled TextDoubleStruck [ EIdentifier "p" ]
911-
, EStyled TextDoubleStruck [ EIdentifier "q" ]
912-
, EStyled TextDoubleStruck [ EIdentifier "r" ]
913-
, EStyled TextDoubleStruck [ EIdentifier "s" ]
914-
, EStyled TextDoubleStruck [ EIdentifier "t" ]
915-
, EStyled TextDoubleStruck [ EIdentifier "u" ]
916-
, EStyled TextDoubleStruck [ EIdentifier "v" ]
917-
, EStyled TextDoubleStruck [ EIdentifier "w" ]
918-
, EStyled TextDoubleStruck [ EIdentifier "x" ]
919-
, EStyled TextDoubleStruck [ EIdentifier "y" ]
920-
, EStyled TextDoubleStruck [ EIdentifier "z" ]
921-
, EStyled TextDoubleStruck [ ENumber "0" ]
922-
, EStyled TextDoubleStruck [ ENumber "1" ]
923-
, EStyled TextDoubleStruck [ ENumber "2" ]
924-
, EStyled TextDoubleStruck [ ENumber "3" ]
925-
, EStyled TextDoubleStruck [ ENumber "4" ]
926-
, EStyled TextDoubleStruck [ ENumber "5" ]
927-
, EStyled TextDoubleStruck [ ENumber "6" ]
928-
, EStyled TextDoubleStruck [ ENumber "7" ]
929-
, EStyled TextDoubleStruck [ ENumber "8" ]
930-
, EStyled TextDoubleStruck [ ENumber "9" ]
931-
, EStyled TextDoubleStruck [ ENumber "0" ]
817+
[ EStyled
818+
TextScript
819+
[ EIdentifier "A"
820+
, EIdentifier "B"
821+
, EIdentifier "C"
822+
, EIdentifier "D"
823+
, EIdentifier "E"
824+
, EIdentifier "F"
825+
, EIdentifier "G"
826+
, EIdentifier "H"
827+
, EIdentifier "I"
828+
, EIdentifier "J"
829+
, EIdentifier "K"
830+
, EIdentifier "L"
831+
, EIdentifier "M"
832+
, EIdentifier "N"
833+
, EIdentifier "O"
834+
, EIdentifier "P"
835+
, EIdentifier "Q"
836+
, EIdentifier "R"
837+
, EIdentifier "S"
838+
, EIdentifier "T"
839+
, EIdentifier "U"
840+
, EIdentifier "V"
841+
, EIdentifier "W"
842+
, EIdentifier "X"
843+
, EIdentifier "Y"
844+
, EIdentifier "Z"
845+
, EIdentifier "a"
846+
, EIdentifier "b"
847+
, EIdentifier "c"
848+
, EIdentifier "d"
849+
, EIdentifier "e"
850+
, EIdentifier "f"
851+
, EIdentifier "g"
852+
, EIdentifier "h"
853+
, EIdentifier "i"
854+
, EIdentifier "j"
855+
, EIdentifier "k"
856+
, EIdentifier "l"
857+
, EIdentifier "m"
858+
, EIdentifier "n"
859+
, EIdentifier "o"
860+
, EIdentifier "p"
861+
, EIdentifier "q"
862+
, EIdentifier "r"
863+
, EIdentifier "s"
864+
, EIdentifier "t"
865+
, EIdentifier "u"
866+
, EIdentifier "v"
867+
, EIdentifier "w"
868+
, EIdentifier "x"
869+
, EIdentifier "y"
870+
, EIdentifier "z"
871+
]
872+
, EStyled
873+
TextDoubleStruck
874+
[ EIdentifier "A"
875+
, EIdentifier "B"
876+
, EIdentifier "C"
877+
, EIdentifier "D"
878+
, EIdentifier "E"
879+
, EIdentifier "F"
880+
, EIdentifier "G"
881+
, EIdentifier "H"
882+
, EIdentifier "I"
883+
, EIdentifier "J"
884+
, EIdentifier "K"
885+
, EIdentifier "L"
886+
, EIdentifier "M"
887+
, EIdentifier "N"
888+
, EIdentifier "O"
889+
, EIdentifier "P"
890+
, EIdentifier "Q"
891+
, EIdentifier "R"
892+
, EIdentifier "S"
893+
, EIdentifier "T"
894+
, EIdentifier "U"
895+
, EIdentifier "V"
896+
, EIdentifier "W"
897+
, EIdentifier "X"
898+
, EIdentifier "Y"
899+
, EIdentifier "Z"
900+
, EIdentifier "a"
901+
, EIdentifier "b"
902+
, EIdentifier "c"
903+
, EIdentifier "d"
904+
, EIdentifier "e"
905+
, EIdentifier "f"
906+
, EIdentifier "g"
907+
, EIdentifier "h"
908+
, EIdentifier "i"
909+
, EIdentifier "j"
910+
, EIdentifier "k"
911+
, EIdentifier "l"
912+
, EIdentifier "m"
913+
, EIdentifier "n"
914+
, EIdentifier "o"
915+
, EIdentifier "p"
916+
, EIdentifier "q"
917+
, EIdentifier "r"
918+
, EIdentifier "s"
919+
, EIdentifier "t"
920+
, EIdentifier "u"
921+
, EIdentifier "v"
922+
, EIdentifier "w"
923+
, EIdentifier "x"
924+
, EIdentifier "y"
925+
, EIdentifier "z"
926+
, ENumber "0"
927+
, ENumber "1"
928+
, ENumber "2"
929+
, ENumber "3"
930+
, ENumber "4"
931+
, ENumber "5"
932+
, ENumber "6"
933+
, ENumber "7"
934+
, ENumber "8"
935+
, ENumber "9"
936+
, ENumber "0"
937+
]
932938
]

0 commit comments

Comments
 (0)