@@ -36,19 +36,6 @@ module Text.Pandoc.Readers.Docx.Parse ( Docx(..)
36 , BodyPart(..)
36 , BodyPart(..)
37 , TblLook(..)
37 , TblLook(..)
38 , ParPart(..)
38 , ParPart(..)
49− , OMathRunTextStyle(..)
50− , OMathTextScript(..)
53 , RunElem(..)
40 , RunElem(..)
@@ -74,6 +61,8 @@ import qualified Text.Pandoc.UTF8 as UTF8
74import Control.Monad.Reader
61import Control.Monad.Reader
75import qualified Data.Map as M
62import qualified Data.Map as M
76import Text.Pandoc.Compat.Except
63import Text.Pandoc.Compat.Except
64+import Text.Pandoc.Readers.Docx.OMath (elemToExps)
65+import Text.TeXMath (Exp)
78data ReaderEnv = ReaderEnv { envNotes :: Notes
67data ReaderEnv = ReaderEnv { envNotes :: Notes
79 , envNumbering :: Numbering
68 , envNumbering :: Numbering
@@ -161,7 +150,7 @@ defaultParagraphStyle = ParagraphStyle { pStyle = []
161data BodyPart = Paragraph ParagraphStyle [ParPart]
150data BodyPart = Paragraph ParagraphStyle [ParPart]
162 | ListItem ParagraphStyle String String Level [ParPart]
151 | ListItem ParagraphStyle String String Level [ParPart]
163 | Tbl String TblGrid TblLook [Row]
152 | Tbl String TblGrid TblLook [Row]
164− | OMathPara OMathParaStyle [OMath]
153+ | OMathPara [[Exp]]
165 deriving Show
154 deriving Show
167type TblGrid = [Integer]
156type TblGrid = [Integer]
@@ -185,100 +174,9 @@ data ParPart = PlainRun Run
185 | InternalHyperLink Anchor [Run]
174 | InternalHyperLink Anchor [Run]
186 | ExternalHyperLink URL [Run]
175 | ExternalHyperLink URL [Run]
187 | Drawing FilePath B.ByteString
176 | Drawing FilePath B.ByteString
188− | PlainOMath OMath
177+ | PlainOMath [Exp]
189 deriving Show
178 deriving Show
191−data OMath = OMath [OMathElem]
194−data OMathElem = Accent AccentStyle 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]
206− | NAry NAryStyle [OMathElem] [OMathElem] 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
216−data Base = Base [OMathElem]
220−type OMathParaStyle = [String]
222−data TopBottom = Top | Bottom
225−data AccentStyle = AccentStyle { accentChar :: Maybe Char }
228−data BarStyle = BarStyle { barPos :: TopBottom}
231−data NAryStyle = NAryStyle { nAryChar :: Maybe Char
232− , nAryLimLoc :: LimLoc}
235−data OMathRunStyle = OMathRunStyle { oMathLit :: Bool
236− , oMathRunTextStyle :: OMathRunTextStyle }
239−data OMathRunTextStyle = NoStyle
241− | Styled { oMathScript :: Maybe OMathTextScript
242− , oMathStyle :: Maybe OMathTextStyle }
245−data OMathTextScript = ORoman
253−data OMathTextStyle = OPlain
259−defaultNAryStyle :: NAryStyle
260−defaultNAryStyle = NAryStyle { nAryChar = Nothing -- integral, in practice
261− , nAryLimLoc = SubSup }
263−data LimLoc = SubSup | UnderOver deriving Show
265−data DelimStyle = DelimStyle { delimBegChar :: Maybe Char
266− , delimSepChar :: Maybe Char
267− , delimEndChar :: Maybe Char}
270−defaultDelimStyle :: DelimStyle
271−defaultDelimStyle = DelimStyle { delimBegChar = Nothing
272− , delimSepChar = Nothing
273− , delimEndChar = Nothing }
275−data GroupStyle = GroupStyle { groupChr :: Maybe Char
276− , groupPos :: Maybe TopBottom }
279−defaultGroupStyle :: GroupStyle
280−defaultGroupStyle = GroupStyle {groupChr = Nothing, groupPos = Nothing}
282data Run = Run RunStyle [RunElem]
180data Run = Run RunStyle [RunElem]
283 | Footnote [BodyPart]
181 | Footnote [BodyPart]
284 | Endnote [BodyPart]
182 | Endnote [BodyPart]
@@ -576,9 +474,8 @@ elemToBodyPart ns element
576 | isElem ns "w" "p" element
474 | isElem ns "w" "p" element
577 , (c:_) <- findChildren (elemName ns "m" "oMathPara") element =
475 , (c:_) <- findChildren (elemName ns "m" "oMathPara") element =
579− let style = [] -- placeholder
580− maths <- mapD (elemToMath ns) (elChildren c)
477+ expsLst <- mapD (\e -> (maybeToD $ elemToExps ns e)) (elChildren c)
581− return $ OMathPara style maths
478+ return $ OMathPara expsLst
582elemToBodyPart ns element
479elemToBodyPart ns element
583 | isElem ns "w" "p" element
480 | isElem ns "w" "p" element
584 , Just (numId, lvl) <- elemToNumInfo ns element = do
481 , Just (numId, lvl) <- elemToNumInfo ns element = do
@@ -614,262 +511,6 @@ elemToBodyPart ns element
614 return $ Tbl caption grid tblLook rows
511 return $ Tbl caption grid tblLook rows
615elemToBodyPart _ _ = throwError WrongElem
512elemToBodyPart _ _ = throwError WrongElem
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
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
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
637− OMathRun mrPr $ Run wrPr (map f elems)
638−filterAmpersand e = e
640−elemToBaseNoAmpersand :: NameSpaces -> Element -> D Base
641−elemToBaseNoAmpersand ns element | isElem ns "m" "e" element =
643− (\e -> (elemToMathElem ns e >>= (return . filterAmpersand)))
644− (elChildren element) >>=
645− (\es -> return $ Base es)
646−elemToBaseNoAmpersand _ _ = throwError WrongElem
649−elemToOMathRunStyle :: NameSpaces -> Element -> OMathRunStyle
650−elemToOMathRunStyle ns element =
653− findChild (elemName ns "m" "lit") element >>=
654− findAttr (elemName ns "m" "val")
659− OMathRunStyle { oMathLit = lit
660− , oMathRunTextStyle = (elemToOMathRunTextStyle ns element)
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 =
668− | Just mrPr <- findChild (elemName ns "m" "rPr") element =
671− findChild (elemName ns "m" "scr") mrPr >>=
672− findAttr (elemName ns "m" "val")
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
684− findChild (elemName ns "m" "sty") mrPr >>=
685− findAttr (elemName ns "m" "val")
687− Just "p" -> Just OPlain
688− Just "b" -> Just OBold
689− Just "i" -> Just OItalic
690− Just "bi" -> Just OBoldItalic
693− Styled { oMathScript = scr, oMathStyle = sty }
694− | otherwise = NoStyle
698−elemToNAryStyle :: NameSpaces -> Element -> NAryStyle
699−elemToNAryStyle ns element
700− | Just narypr <- findChild (QName "naryPr" (lookup "m" ns) (Just "m")) element =
702− chr = findChild (QName "chr" (lookup "m" ns) (Just "m")) narypr >>=
703− findAttr (QName "val" (lookup "m" ns) (Just "m")) >>=
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
712− NAryStyle { nAryChar = chr, nAryLimLoc = limLoc'}
713−elemToNAryStyle _ _ = defaultNAryStyle
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))
728− DelimStyle { delimBegChar = begChr
729− , delimSepChar = sepChr
730− , delimEndChar = endChr}
731−elemToDelimStyle _ _ = defaultDelimStyle
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")) >>=
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)
743− GroupStyle { groupChr = chr, groupPos = pos }
744−elemToGroupStyle _ _ = defaultGroupStyle
746−elemToMathElem :: NameSpaces -> Element -> D OMathElem
747−elemToMathElem ns element | isElem ns "m" "acc" element = do
749− findChild (elemName ns "m" "accPr") element >>=
750− findChild (elemName ns "m" "chr") >>=
751− findAttr (elemName ns "m" "val") >>=
753− accPr = AccentStyle { accentChar = accChar}
754− base <-(maybeToD $ findChild (elemName ns "m" "e") element) >>=
756− return $ Accent accPr base
757−elemToMathElem ns element | isElem ns "m" "bar" element = do
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")) >>=
764− barPos = (if s == "bot" then Bottom else Top)
766− base <-maybeToD (findChild (QName "e" (lookup "m" ns) (Just "m")) element) >>=
768− return $ Bar barPr base
769−elemToMathElem ns element | isElem ns "m" "box" element =
770− maybeToD (findChild (elemName ns "m" "e") element) >>=
772− (\b -> return $ Box b)
773−elemToMathElem ns element | isElem ns "m" "borderBox" element =
774− maybeToD (findChild (elemName ns "m" "e") element) >>=
776− (\b -> return $ BorderBox b)
777−elemToMathElem ns element | isElem ns "m" "d" element =
778− let style = elemToDelimStyle ns element
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) >>=
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
800− maybeToD (findChild (elemName ns "m" "e") element) >>=
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)
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)
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) >>=
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) >>=
833− return $ Radical deg base
834−elemToMathElem ns element | isElem ns "m" "phant" element = do
835− base <- maybeToD (findChild (elemName ns "m" "e") element) >>=
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) >>=
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) >>=
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) >>=
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) >>=
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
873lookupRelationship :: RelId -> [Relationship] -> Maybe Target
514lookupRelationship :: RelId -> [Relationship] -> Maybe Target
874lookupRelationship relid rels =
515lookupRelationship relid rels =
875 lookup relid (map (\(Relationship pair) -> pair) rels)
516 lookup relid (map (\(Relationship pair) -> pair) rels)
@@ -933,7 +574,7 @@ elemToParPart ns element
933 Nothing -> ExternalHyperLink "" runs
574 Nothing -> ExternalHyperLink "" runs
934elemToParPart ns element
575elemToParPart ns element
935 | isElem ns "m" "oMath" element =
576 | isElem ns "m" "oMath" element =
936− elemToMath ns element >>= (return . PlainOMath)
577+ (maybeToD $ elemToExps ns element) >>= (return . PlainOMath)
937elemToParPart _ _ = throwError WrongElem
578elemToParPart _ _ = throwError WrongElem
939lookupFootnote :: String -> Notes -> Maybe Element
580lookupFootnote :: String -> Notes -> Maybe Element