@@ -36,19 +36,6 @@ module Text.Pandoc.Readers.Docx.Parse ( Docx(..)
3636 , BodyPart(..)
3737 , TblLook(..)
3838 , ParPart(..)
39− , OMath(..)
40− , OMathElem(..)
41− , Base(..)
42− , TopBottom(..)
43− , AccentStyle(..)
44− , BarStyle(..)
45− , NAryStyle(..)
46− , DelimStyle(..)
47− , GroupStyle(..)
48− , OMathRunStyle(..)
49− , OMathRunTextStyle(..)
50− , OMathTextScript(..)
51− , OMathTextStyle(..)
5239 , Run(..)
5340 , RunElem(..)
5441 , Notes
@@ -74,6 +61,8 @@ import qualified Text.Pandoc.UTF8 as UTF8
7461import Control.Monad.Reader
7562import qualified Data.Map as M
7663import Text.Pandoc.Compat.Except
64+import Text.Pandoc.Readers.Docx.OMath (elemToExps)
65+import Text.TeXMath (Exp)
7766
7867data ReaderEnv = ReaderEnv { envNotes :: Notes
7968 , envNumbering :: Numbering
@@ -161,7 +150,7 @@ defaultParagraphStyle = ParagraphStyle { pStyle = []
161150data BodyPart = Paragraph ParagraphStyle [ParPart]
162151 | ListItem ParagraphStyle String String Level [ParPart]
163152 | Tbl String TblGrid TblLook [Row]
164− | OMathPara OMathParaStyle [OMath]
153+ | OMathPara [[Exp]]
165154 deriving Show
166155
167156type TblGrid = [Integer]
@@ -185,100 +174,9 @@ data ParPart = PlainRun Run
185174 | InternalHyperLink Anchor [Run]
186175 | ExternalHyperLink URL [Run]
187176 | Drawing FilePath B.ByteString
188− | PlainOMath OMath
177+ | PlainOMath [Exp]
189178 deriving Show
190179
191−data OMath = OMath [OMathElem]
192− deriving Show
193−
194−data OMathElem = Accent AccentStyle Base
195− | Bar BarStyle Base
196− | Box Base
197− | BorderBox Base
198− | Delimiter DelimStyle [Base]
199− | EquationArray [Base]
200− | Fraction [OMathElem] [OMathElem]
201− | Function [OMathElem] Base
202− | Group GroupStyle Base
203− | LowerLimit Base [OMathElem]
204− | UpperLimit Base [OMathElem]
205− | Matrix [[Base]]
206− | NAry NAryStyle [OMathElem] [OMathElem] Base
207− | Phantom Base
208− | Radical [OMathElem] Base
209− | PreSubSuper [OMathElem] [OMathElem] Base
210− | Sub Base [OMathElem]
211− | SubSuper Base [OMathElem] [OMathElem]
212− | Super Base [OMathElem]
213− | OMathRun OMathRunStyle Run
214− deriving Show
215−
216−data Base = Base [OMathElem]
217− deriving Show
218−
219−-- placeholders
220−type OMathParaStyle = [String]
221−
222−data TopBottom = Top | Bottom
223− deriving Show
224−
225−data AccentStyle = AccentStyle { accentChar :: Maybe Char }
226− deriving Show
227−
228−data BarStyle = BarStyle { barPos :: TopBottom}
229− deriving Show
230−
231−data NAryStyle = NAryStyle { nAryChar :: Maybe Char
232− , nAryLimLoc :: LimLoc}
233− deriving Show
234−
235−data OMathRunStyle = OMathRunStyle { oMathLit :: Bool
236− , oMathRunTextStyle :: OMathRunTextStyle }
237− deriving Show
238−
239−data OMathRunTextStyle = NoStyle
240− | Normal
241− | Styled { oMathScript :: Maybe OMathTextScript
242− , oMathStyle :: Maybe OMathTextStyle }
243− deriving Show
244−
245−data OMathTextScript = ORoman
246− | OScript
247− | OFraktur
248− | ODoubleStruck
249− | OSansSerif
250− | OMonospace
251− deriving (Show, Eq)
252−
253−data OMathTextStyle = OPlain
254− | OBold
255− | OItalic
256− | OBoldItalic
257− deriving (Show, Eq)
258−
259−defaultNAryStyle :: NAryStyle
260−defaultNAryStyle = NAryStyle { nAryChar = Nothing -- integral, in practice
261− , nAryLimLoc = SubSup }
262−
263−data LimLoc = SubSup | UnderOver deriving Show
264−
265−data DelimStyle = DelimStyle { delimBegChar :: Maybe Char
266− , delimSepChar :: Maybe Char
267− , delimEndChar :: Maybe Char}
268− deriving Show
269−
270−defaultDelimStyle :: DelimStyle
271−defaultDelimStyle = DelimStyle { delimBegChar = Nothing
272− , delimSepChar = Nothing
273− , delimEndChar = Nothing }
274−
275−data GroupStyle = GroupStyle { groupChr :: Maybe Char
276− , groupPos :: Maybe TopBottom }
277− deriving Show
278−
279−defaultGroupStyle :: GroupStyle
280−defaultGroupStyle = GroupStyle {groupChr = Nothing, groupPos = Nothing}
281−
282180data Run = Run RunStyle [RunElem]
283181 | Footnote [BodyPart]
284182 | Endnote [BodyPart]
@@ -576,9 +474,8 @@ elemToBodyPart ns element
576474 | isElem ns "w" "p" element
577475 , (c:_) <- findChildren (elemName ns "m" "oMathPara") element =
578476 do
579− let style = [] -- placeholder
580− maths <- mapD (elemToMath ns) (elChildren c)
581− return $ OMathPara style maths
477+ expsLst <- mapD (\e -> (maybeToD $ elemToExps ns e)) (elChildren c)
478+ return $ OMathPara expsLst
582479elemToBodyPart ns element
583480 | isElem ns "w" "p" element
584481 , Just (numId, lvl) <- elemToNumInfo ns element = do
@@ -614,262 +511,6 @@ elemToBodyPart ns element
614511 return $ Tbl caption grid tblLook rows
615512elemToBodyPart _ _ = throwError WrongElem
616513
617−elemToMath :: NameSpaces -> Element -> D OMath
618−elemToMath ns element | isElem ns "m" "oMath" element =
619− mapD (elemToMathElem ns) (elChildren element) >>=
620− (\es -> return $ OMath es)
621−elemToMath _ _ = throwError WrongElem
622−
623−elemToBase :: NameSpaces -> Element -> D Base
624−elemToBase ns element | isElem ns "m" "e" element =
625− mapD (elemToMathElem ns) (elChildren element) >>=
626− (\es -> return $ Base es)
627−elemToBase _ _ = throwError WrongElem
628−
629−-- TODO: The right way to do this is to use the ampersand to break the
630−-- text lines into multiple columns. That's tricky, though, and this
631−-- will get us most of the way for the time being.
632−filterAmpersand :: OMathElem -> OMathElem
633−filterAmpersand (OMathRun mrPr (Run wrPr elems)) =
634− let f (TextRun s) = TextRun $ filter ('&' /=) s
635− f re = re
636− in
637− OMathRun mrPr $ Run wrPr (map f elems)
638−filterAmpersand e = e
639−
640−elemToBaseNoAmpersand :: NameSpaces -> Element -> D Base
641−elemToBaseNoAmpersand ns element | isElem ns "m" "e" element =
642− mapD
643− (\e -> (elemToMathElem ns e >>= (return . filterAmpersand)))
644− (elChildren element) >>=
645− (\es -> return $ Base es)
646−elemToBaseNoAmpersand _ _ = throwError WrongElem
647−
648−
649−elemToOMathRunStyle :: NameSpaces -> Element -> OMathRunStyle
650−elemToOMathRunStyle ns element =
651− let lit =
652− case
653− findChild (elemName ns "m" "lit") element >>=
654− findAttr (elemName ns "m" "val")
655− of
656− Just "on" -> True
657− _ -> False
658− in
659− OMathRunStyle { oMathLit = lit
660− , oMathRunTextStyle = (elemToOMathRunTextStyle ns element)
661− }
662−
663−elemToOMathRunTextStyle :: NameSpaces -> Element -> OMathRunTextStyle
664−elemToOMathRunTextStyle ns element
665− | Just mrPr <- findChild (elemName ns "m" "rPr") element
666− , Just _ <- findChild (elemName ns "m" "nor") mrPr =
667− Normal
668− | Just mrPr <- findChild (elemName ns "m" "rPr") element =
669− let scr =
670− case
671− findChild (elemName ns "m" "scr") mrPr >>=
672− findAttr (elemName ns "m" "val")
673− of
674− Just "roman" -> Just ORoman
675− Just "script" -> Just OScript
676− Just "fraktur" -> Just OFraktur
677− Just "double-struck" -> Just ODoubleStruck
678− Just "sans-serif" -> Just OSansSerif
679− Just "monospace" -> Just OMonospace
680− _ -> Nothing
681−
682− sty =
683− case
684− findChild (elemName ns "m" "sty") mrPr >>=
685− findAttr (elemName ns "m" "val")
686− of
687− Just "p" -> Just OPlain
688− Just "b" -> Just OBold
689− Just "i" -> Just OItalic
690− Just "bi" -> Just OBoldItalic
691− _ -> Nothing
692− in
693− Styled { oMathScript = scr, oMathStyle = sty }
694− | otherwise = NoStyle
695−
696−
697−
698−elemToNAryStyle :: NameSpaces -> Element -> NAryStyle
699−elemToNAryStyle ns element
700− | Just narypr <- findChild (QName "naryPr" (lookup "m" ns) (Just "m")) element =
701− let
702− chr = findChild (QName "chr" (lookup "m" ns) (Just "m")) narypr >>=
703− findAttr (QName "val" (lookup "m" ns) (Just "m")) >>=
704− Just . head
705− limLoc = findChild (QName "limLoc" (lookup "m" ns) (Just "m")) narypr >>=
706− findAttr (QName "val" (lookup "m" ns) (Just "m"))
707− limLoc' = case limLoc of
708− Just "undOver" -> UnderOver
709− Just "subSup" -> SubSup
710− _ -> SubSup
711− in
712− NAryStyle { nAryChar = chr, nAryLimLoc = limLoc'}
713−elemToNAryStyle _ _ = defaultNAryStyle
714−
715−elemToDelimStyle :: NameSpaces -> Element -> DelimStyle
716−elemToDelimStyle ns element
717− | Just dPr <- findChild (QName "dPr" (lookup "m" ns) (Just "m")) element =
718− let begChr = findChild (QName "begChr" (lookup "m" ns) (Just "m")) dPr >>=
719− findAttr (QName "val" (lookup "m" ns) (Just "m")) >>=
720− (\c -> if null c then (Just ' ') else (Just $ head c))
721− sepChr = findChild (QName "sepChr" (lookup "m" ns) (Just "m")) dPr >>=
722− findAttr (QName "val" (lookup "m" ns) (Just "m")) >>=
723− (\c -> if null c then (Just ' ') else (Just $ head c))
724− endChr = findChild (QName "endChr" (lookup "m" ns) (Just "m")) dPr >>=
725− findAttr (QName "val" (lookup "m" ns) (Just "m")) >>=
726− (\c -> if null c then (Just ' ') else (Just $ head c))
727− in
728− DelimStyle { delimBegChar = begChr
729− , delimSepChar = sepChr
730− , delimEndChar = endChr}
731−elemToDelimStyle _ _ = defaultDelimStyle
732−
733−elemToGroupStyle :: NameSpaces -> Element -> GroupStyle
734−elemToGroupStyle ns element
735− | Just gPr <- findChild (QName "groupChrPr" (lookup "m" ns) (Just "m")) element =
736− let chr = findChild (QName "chr" (lookup "m" ns) (Just "m")) gPr >>=
737− findAttr (QName "val" (lookup "m" ns) (Just "m")) >>=
738− Just . head
739− pos = findChild (QName "pos" (lookup "m" ns) (Just "m")) gPr >>=
740− findAttr (QName "val" (lookup "m" ns) (Just "m")) >>=
741− (\s -> Just $ if s == "top" then Top else Bottom)
742− in
743− GroupStyle { groupChr = chr, groupPos = pos }
744−elemToGroupStyle _ _ = defaultGroupStyle
745−
746−elemToMathElem :: NameSpaces -> Element -> D OMathElem
747−elemToMathElem ns element | isElem ns "m" "acc" element = do
748− let accChar =
749− findChild (elemName ns "m" "accPr") element >>=
750− findChild (elemName ns "m" "chr") >>=
751− findAttr (elemName ns "m" "val") >>=
752− Just . head
753− accPr = AccentStyle { accentChar = accChar}
754− base <-(maybeToD $ findChild (elemName ns "m" "e") element) >>=
755− elemToBase ns
756− return $ Accent accPr base
757−elemToMathElem ns element | isElem ns "m" "bar" element = do
758− barPr <- maybeToD $
759− findChild (QName "barPr" (lookup "m" ns) (Just "m")) element >>=
760− findChild (QName "pos" (lookup "m" ns) (Just "m")) >>=
761− findAttr (QName "val" (lookup "m" ns) (Just "m")) >>=
762− (\s ->
763− Just $ BarStyle {
764− barPos = (if s == "bot" then Bottom else Top)
765− })
766− base <-maybeToD (findChild (QName "e" (lookup "m" ns) (Just "m")) element) >>=
767− elemToBase ns
768− return $ Bar barPr base
769−elemToMathElem ns element | isElem ns "m" "box" element =
770− maybeToD (findChild (elemName ns "m" "e") element) >>=
771− elemToBase ns >>=
772− (\b -> return $ Box b)
773−elemToMathElem ns element | isElem ns "m" "borderBox" element =
774− maybeToD (findChild (elemName ns "m" "e") element) >>=
775− elemToBase ns >>=
776− (\b -> return $ BorderBox b)
777−elemToMathElem ns element | isElem ns "m" "d" element =
778− let style = elemToDelimStyle ns element
779− in
780− mapD (elemToBase ns) (elChildren element) >>=
781− (\es -> return $ Delimiter style es)
782−elemToMathElem ns element | isElem ns "m" "eqArr" element =
783− mapD (elemToBaseNoAmpersand ns) (elChildren element) >>=
784− (\es -> return $ EquationArray es)
785−elemToMathElem ns element | isElem ns "m" "f" element = do
786− num <- maybeToD $ findChild (elemName ns "m" "num") element
787− den <- maybeToD $ findChild (elemName ns "m" "den") element
788− numElems <- mapD (elemToMathElem ns) (elChildren num)
789− denElems <- mapD (elemToMathElem ns) (elChildren den)
790− return $ Fraction numElems denElems
791−elemToMathElem ns element | isElem ns "m" "func" element = do
792− fName <- maybeToD $ findChild (elemName ns "m" "fName") element
793− base <- maybeToD (findChild (elemName ns "m" "e") element) >>=
794− elemToBase ns
795− fnElems <- mapD (elemToMathElem ns) (elChildren fName)
796− return $ Function fnElems base
797−elemToMathElem ns element | isElem ns "m" "groupChr" element =
798− let style = elemToGroupStyle ns element
799− in
800− maybeToD (findChild (elemName ns "m" "e") element) >>=
801− elemToBase ns >>=
802− (\b -> return $ Group style b)
803−elemToMathElem ns element | isElem ns "m" "limLow" element = do
804− base <- maybeToD (findChild (elemName ns "m" "e") element)
805− >>= elemToBase ns
806− lim <- maybeToD $ findChild (elemName ns "m" "lim") element
807− limElems <- mapD (elemToMathElem ns) (elChildren lim)
808− return $ LowerLimit base limElems
809−elemToMathElem ns element | isElem ns "m" "limUpp" element = do
810− base <- maybeToD (findChild (elemName ns "m" "e") element)
811− >>= elemToBase ns
812− lim <- maybeToD $ findChild (elemName ns "m" "lim") element
813− limElems <- mapD (elemToMathElem ns) (elChildren lim)
814− return $ UpperLimit base limElems
815−elemToMathElem ns element | isElem ns "m" "m" element = do
816− let rows = findChildren (elemName ns "m" "mr") element
817− bases <- mapD (\mr -> mapD (elemToBase ns) (elChildren mr)) rows
818− return $ Matrix bases
819−elemToMathElem ns element | isElem ns "m" "nary" element = do
820− let style = elemToNAryStyle ns element
821− sub <- maybeToD (findChild (elemName ns "m" "sub") element) >>=
822− (\e -> mapD (elemToMathElem ns) (elChildren e))
823− sup <- maybeToD (findChild (elemName ns "m" "sup") element) >>=
824− (\e -> mapD (elemToMathElem ns) (elChildren e))
825− base <- maybeToD (findChild (elemName ns "m" "e") element) >>=
826− elemToBase ns
827− return $ NAry style sub sup base
828−elemToMathElem ns element | isElem ns "m" "rad" element = do
829− deg <- maybeToD (findChild (elemName ns "m" "deg") element) >>=
830− (\e -> mapD (elemToMathElem ns) (elChildren e))
831− base <- maybeToD (findChild (elemName ns "m" "e") element) >>=
832− elemToBase ns
833− return $ Radical deg base
834−elemToMathElem ns element | isElem ns "m" "phant" element = do
835− base <- maybeToD (findChild (elemName ns "m" "e") element) >>=
836− elemToBase ns
837− return $ Phantom base
838−elemToMathElem ns element | isElem ns "m" "sPre" element = do
839− sub <- maybeToD (findChild (elemName ns "m" "sub") element) >>=
840− (\e -> mapD (elemToMathElem ns) (elChildren e))
841− sup <- maybeToD (findChild (elemName ns "m" "sup") element) >>=
842− (\e -> mapD (elemToMathElem ns) (elChildren e))
843− base <- maybeToD (findChild (elemName ns "m" "e") element) >>=
844− elemToBase ns
845− return $ PreSubSuper sub sup base
846−elemToMathElem ns element | isElem ns "m" "sSub" element = do
847− base <- maybeToD (findChild (elemName ns "m" "e") element) >>=
848− elemToBase ns
849− sub <- maybeToD (findChild (elemName ns "m" "sub") element) >>=
850− (\e -> mapD (elemToMathElem ns) (elChildren e))
851− return $ Sub base sub
852−elemToMathElem ns element | isElem ns "m" "sSubSup" element = do
853− base <- maybeToD (findChild (elemName ns "m" "e") element) >>=
854− elemToBase ns
855− sub <- maybeToD (findChild (elemName ns "m" "sub") element) >>=
856− (\e -> mapD (elemToMathElem ns) (elChildren e))
857− sup <- maybeToD (findChild (elemName ns "m" "sup") element) >>=
858− (\e -> mapD (elemToMathElem ns) (elChildren e))
859− return $ SubSuper base sub sup
860−elemToMathElem ns element | isElem ns "m" "sSup" element = do
861− base <- maybeToD (findChild (elemName ns "m" "e") element) >>=
862− elemToBase ns
863− sup <- maybeToD (findChild (elemName ns "m" "sup") element) >>=
864− (\e -> mapD (elemToMathElem ns) (elChildren e))
865− return $ Super base sup
866−elemToMathElem ns element | isElem ns "m" "r" element = do
867− let mrPr = elemToOMathRunStyle ns element
868− wrPr = elemToRunStyle ns element
869− relems <- elemToRunElems ns element
870− return $ OMathRun mrPr $ Run wrPr relems
871−elemToMathElem _ _ = throwError WrongElem
872−
873514lookupRelationship :: RelId -> [Relationship] -> Maybe Target
874515lookupRelationship relid rels =
875516 lookup relid (map (\(Relationship pair) -> pair) rels)
@@ -933,7 +574,7 @@ elemToParPart ns element
933574 Nothing -> ExternalHyperLink "" runs
934575elemToParPart ns element
935576 | isElem ns "m" "oMath" element =
936− elemToMath ns element >>= (return . PlainOMath)
577+ (maybeToD $ elemToExps ns element) >>= (return . PlainOMath)
937578elemToParPart _ _ = throwError WrongElem
938579
939580lookupFootnote :: String -> Notes -> Maybe Element