git.iko.soy/typeable/pandoc
on master help sign in
Docx reader: Split math out into math module.

Could use some cleanup, but this is the first step for getting an OMML reader into TeXMath.

commita7967d1aeff0336ef4fb50175865747a88ec1a17 authorJesse Rosenthal <jrosenthal@jhu.edu> dateThu 7 Aug 2014, 12:20 (12 years ago) parent13f26af
3 files changed+15−560
pandoc.cabal+1 src/Text/Pandoc/Readers/Docx.hs+7−194 src/Text/Pandoc/Readers/Docx/Parse.hs+7−366
pandoc.cabal+1
@@ -323,6 +323,7 @@ Library
323323 Other-Modules: Text.Pandoc.Readers.Docx.Lists,
324324 Text.Pandoc.Readers.Docx.Reducible,
325325 Text.Pandoc.Readers.Docx.Parse,
326+ Text.Pandoc.Readers.Docx.OMath,
326327 Text.Pandoc.Writers.Shared,
327328 Text.Pandoc.Asciify,
328329 Text.Pandoc.MIME,
src/Text/Pandoc/Readers/Docx.hs+7−194
@@ -84,11 +84,10 @@ import Text.Pandoc.Readers.Docx.Lists
8484import Text.Pandoc.Readers.Docx.Reducible
8585import Text.Pandoc.Shared
8686import Text.Pandoc.MediaBag (insertMedia, MediaBag)
87−import Data.Maybe (mapMaybe, fromMaybe)
88−import Data.List (delete, stripPrefix, (\\), intersperse, intersect)
87+import Data.Maybe (mapMaybe)
88+import Data.List (delete, stripPrefix, (\\), intersect)
8989import Data.Monoid
9090import Text.TeXMath (writeTeX)
91−import qualified Text.TeXMath.Types as TM
9291import Data.Default (Default)
9392import qualified Data.ByteString.Lazy as B
9493import qualified Data.Map as M
@@ -374,193 +373,8 @@ parPartToInlines (InternalHyperLink anchor runs) = do
374373parPartToInlines (ExternalHyperLink target runs) = do
375374 ils <- concatMapM runToInlines runs
376375 return [Link ils (target, "")]
377−parPartToInlines (PlainOMath omath) = do
378− e <- oMathToExps omath
379− return [Math InlineMath (writeTeX e)]
380−
381−oMathToExps :: OMath -> DocxContext [TM.Exp]
382−oMathToExps (OMath oMathElems) = concatMapM oMathElemToExps oMathElems
383−
384−oMathElemToExps :: OMathElem -> DocxContext [TM.Exp]
385−oMathElemToExps (Accent style base) = do
386− baseExp <- baseToExp base
387− let chr = case accentChar style of
388− Just c -> c
389− Nothing -> '\180' -- default to acute.
390− return [TM.EOver False baseExp (TM.ESymbol TM.Accent [chr])]
391−oMathElemToExps(Bar style base) = do
392− baseExp <- baseToExp base
393− return $ case barPos style of
394− Top -> [TM.EOver False baseExp (TM.ESymbol TM.Accent "\175")]
395− Bottom -> [TM.EUnder False baseExp (TM.ESymbol TM.Accent "\818")]
396−oMathElemToExps (Box base) =
397− (\e -> return [e]) =<< baseToExp base
398−oMathElemToExps (BorderBox base) =
399− -- TODO: This should be "\\boxed" somehow
400− (\e -> return [e]) =<< baseToExp base
401−oMathElemToExps (Delimiter dPr bases) = do
402− baseExps <- mapM baseToExp bases
403− let inDelimExps = map Right baseExps
404− beg = fromMaybe '(' (delimBegChar dPr)
405− end = fromMaybe ')' (delimEndChar dPr)
406− sep = fromMaybe '|' (delimSepChar dPr)
407− exps = intersperse (Left [sep]) inDelimExps
408− return [TM.EDelimited [beg] [end] exps]
409−oMathElemToExps (EquationArray bases) = do
410− let f b = do bs <- baseToExp' b
411− return [bs]
412− baseExps <- mapM f bases
413− return [TM.EArray [] baseExps]
414−oMathElemToExps (Fraction num denom) = do
415− numExp <- concatMapM oMathElemToExps num >>= (return . TM.EGrouped)
416− denExp <- concatMapM oMathElemToExps denom >>= (return . TM.EGrouped)
417− return [TM.EFraction TM.NormalFrac numExp denExp]
418−oMathElemToExps (Function fname base) = do
419− -- We need a string for the fname, but omml gives it to us as a
420− -- series of oMath elems. We're going to filter out the oMathRuns,
421− -- which should work for us most of the time.
422− let f :: OMathElem -> String
423− f (OMathRun _ run) = runToString run
424− f _ = ""
425− fnameString = concatMap f fname
426− baseExp <- baseToExp base
427− return [TM.EMathOperator fnameString, baseExp]
428−oMathElemToExps (Group style base)
429− | Just Top <- groupPos style = do
430− baseExp <- baseToExp base
431− let chr = case groupChr style of
432− Just c -> c
433− Nothing -> '\65079' -- default to overbrace
434− return [TM.EOver False baseExp (TM.ESymbol TM.Accent [chr])]
435− | otherwise = do
436− baseExp <- baseToExp base
437− let chr = case groupChr style of
438− Just c -> c
439− Nothing -> '\65080' -- default to underbrace
440− return [TM.EUnder False baseExp (TM.ESymbol TM.Accent [chr])]
441−oMathElemToExps (LowerLimit base limElems) = do
442− baseExp <- baseToExp base
443− lim <- concatMapM oMathElemToExps limElems >>= (return . TM.EGrouped)
444− return [TM.EUnder True lim baseExp]
445−oMathElemToExps (UpperLimit base limElems) = do
446− baseExp <- baseToExp base
447− lim <- concatMapM oMathElemToExps limElems >>= (return . TM.EGrouped)
448− return [TM.EOver True lim baseExp]
449−oMathElemToExps (Matrix bases) = do
450− rows <- mapM (mapM (\b -> baseToExp' b)) bases
451− return [TM.EArray [TM.AlignCenter] rows]
452−oMathElemToExps (NAry style sub sup base) = do
453− subExps <- concatMapM oMathElemToExps sub
454− supExps <- concatMapM oMathElemToExps sup
455− baseExp <- baseToExp base
456− let opChar = case nAryChar style of
457− Just c -> c
458− -- default to integral
459− Nothing -> '\8747'
460− return [ TM.ESubsup
461− (TM.ESymbol TM.Op [opChar])
462− (TM.EGrouped subExps)
463− (TM.EGrouped supExps)
464− , baseExp]
465−oMathElemToExps (Phantom base) =
466− (\e -> return [TM.EPhantom e]) =<< baseToExp base
467−oMathElemToExps (Radical degree base) = do
468− degExps <- concatMapM oMathElemToExps degree
469− baseExp <- baseToExp base
470− return $ case degExps of
471− [] -> [TM.ESqrt baseExp]
472− ds -> [TM.ERoot (TM.EGrouped ds) baseExp]
473−oMathElemToExps (PreSubSuper sub sup base) = do
474− subExps <- concatMapM oMathElemToExps sub
475− supExps <- concatMapM oMathElemToExps sup
476− baseExp <- baseToExp base
477− return [ TM.ESubsup
478− (TM.EIdentifier "") (TM.EGrouped subExps) (TM.EGrouped supExps)
479− , baseExp]
480−oMathElemToExps (Sub base sub) = do
481− baseExp <- baseToExp base
482− subExps <- concatMapM oMathElemToExps sub
483− return [TM.ESub baseExp (TM.EGrouped subExps)]
484−oMathElemToExps (SubSuper base sub sup) = do
485− baseExp <- baseToExp base
486− subExps <- concatMapM oMathElemToExps sub
487− supExps <- concatMapM oMathElemToExps sup
488− return [TM.ESubsup baseExp (TM.EGrouped subExps) (TM.EGrouped supExps)]
489−oMathElemToExps (Super base sup) = do
490− baseExp <- baseToExp base
491− supExps <- concatMapM oMathElemToExps sup
492− return [TM.ESuper baseExp (TM.EGrouped supExps)]
493−oMathElemToExps (OMathRun sty run@(Run _ _))
494− | NoStyle <- oMathRunTextStyle sty =
495− return $ [TM.EIdentifier $ runToString run]
496− | Nothing <- oMathRunStyleToTextType sty =
497− return $ [TM.EIdentifier $ runToString run]
498− | Just textType <- oMathRunStyleToTextType sty =
499− return $ if oMathLit sty
500− then [TM.EText textType (runToString run)]
501− else [TM.EStyled textType [TM.EIdentifier $ runToString run]]
502−oMathElemToExps (OMathRun _ _) = return []
503−
504−oMathRunStyleToTextType :: OMathRunStyle -> Maybe TM.TextType
505−oMathRunStyleToTextType mrPr
506− | Normal <- oMathRunTextStyle mrPr =
507− Just $ TM.TextNormal
508− | Styled scr sty <- oMathRunTextStyle mrPr
509− ,Just OBold <- sty
510− , Just OSansSerif <- scr =
511− Just $ TM.TextSansSerifBold
512− | Styled scr sty <- oMathRunTextStyle mrPr
513− , Just OBoldItalic <- sty
514− , Just OSansSerif <- scr =
515− Just $ TM.TextSansSerifBoldItalic
516− | Styled scr sty <- oMathRunTextStyle mrPr
517− , Just OBold <- sty
518− , Just OScript <- scr =
519− Just $ TM.TextBoldScript
520− | Styled scr sty <- oMathRunTextStyle mrPr
521− , Just OBold <- sty
522− , Just OFraktur <- scr =
523− Just $ TM.TextBoldFraktur
524− | Styled scr sty <- oMathRunTextStyle mrPr
525− , Just OItalic <- sty
526− , Just OSansSerif <- scr =
527− Just $ TM.TextSansSerifItalic
528− | Styled _ sty <- oMathRunTextStyle mrPr
529− , Just OBold <- sty =
530− Just $ TM.TextBold
531− | Styled _ sty <- oMathRunTextStyle mrPr
532− , Just OItalic <- sty =
533− Just $ TM.TextItalic
534− | Styled scr _ <- oMathRunTextStyle mrPr
535− , Just OMonospace <- scr =
536− Just $ TM.TextMonospace
537− | Styled scr _ <- oMathRunTextStyle mrPr
538− , Just OSansSerif <- scr =
539− Just $ TM.TextSansSerif
540− | Styled scr _ <- oMathRunTextStyle mrPr
541− , Just ODoubleStruck <- scr =
542− Just $ TM.TextDoubleStruck
543− | Styled scr _ <- oMathRunTextStyle mrPr
544− , Just OScript <- scr =
545− Just $ TM.TextDoubleStruck
546− | Styled scr _ <- oMathRunTextStyle mrPr
547− , Just OFraktur <- scr =
548− Just $ TM.TextFraktur
549− | Styled _ sty <- oMathRunTextStyle mrPr
550− , Just OBoldItalic <- sty =
551− Just $ TM.TextBoldItalic
552− | otherwise = Nothing
553−
554−
555−
556−baseToExp :: Base -> DocxContext TM.Exp
557−baseToExp (Base mathElems) =
558− concatMapM oMathElemToExps mathElems >>= (return . TM.EGrouped)
559−
560−-- an ungrouped version of baseToExp
561−baseToExp' :: Base -> DocxContext [TM.Exp]
562−baseToExp' (Base mathElems) =
563− concatMapM oMathElemToExps mathElems
376+parPartToInlines (PlainOMath exps) = do
377+ return [Math InlineMath (writeTeX exps)]
564378
565379
566380isAnchorSpan :: Inline -> Bool
@@ -686,11 +500,10 @@ bodyPartToBlocks (Tbl cap _ look (r:rs)) = do
686500 widths = replicate size 0 :: [Double]
687501
688502 return [Table caption alignments widths hdrCells cells]
689−bodyPartToBlocks (OMathPara _ maths) = do
690− omaths <- mapM oMathToExps maths
503+bodyPartToBlocks (OMathPara exps) = do
691504 return [Para $
692− map (\m -> Math DisplayMath (writeTeX m))
693− omaths]
505+ map (\e -> Math DisplayMath (writeTeX e))
506+ exps]
694507
695508-- replace targets with generated anchors.
696509rewriteLink :: Inline -> DocxContext Inline
src/Text/Pandoc/Readers/Docx/Parse.hs+7−366
@@ -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