aboutsummaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Readers/Docx/OMath.hs
diff options
context:
space:
mode:
authorJesse Rosenthal <jrosenthal@jhu.edu>2014-08-08 11:34:10 -0400
committerJesse Rosenthal <jrosenthal@jhu.edu>2014-08-08 14:15:17 -0400
commitba5804f9ec8c14f818eda2285395aaba98b304ac (patch)
treefa355819aaa244f7be32d97ef0d84c2baf811a1b /src/Text/Pandoc/Readers/Docx/OMath.hs
parent0acd139fb19d01f8f110c15125f1b4385939ff88 (diff)
downloadpandoc-ba5804f9ec8c14f818eda2285395aaba98b304ac.tar.gz
OMath: Remove Namespaces
We still need to test against prefixes, but this is only going to look at oMath fragments, so we're not going to be worried about looking up the real namespace.
Diffstat (limited to 'src/Text/Pandoc/Readers/Docx/OMath.hs')
-rw-r--r--src/Text/Pandoc/Readers/Docx/OMath.hs573
1 files changed, 288 insertions, 285 deletions
diff --git a/src/Text/Pandoc/Readers/Docx/OMath.hs b/src/Text/Pandoc/Readers/Docx/OMath.hs
index c057ba754..210f715f9 100644
--- a/src/Text/Pandoc/Readers/Docx/OMath.hs
+++ b/src/Text/Pandoc/Readers/Docx/OMath.hs
@@ -30,7 +30,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Types and functions for conversion of OMML into TeXMath.
-}
-module Text.Pandoc.Readers.Docx.OMath ( elemToExps
+module Text.Pandoc.Readers.Docx.OMath ( elemToExps
) where
import Text.XML.Light
@@ -39,16 +39,19 @@ import Data.List (intersperse)
import qualified Text.TeXMath.Types as TM
import Control.Applicative ((<$>))
-type NameSpaces = [(String, String)]
-
-elemName :: NameSpaces -> String -> String -> QName
-elemName ns prefix name = (QName name (lookup prefix ns) (Just prefix))
-
-isElem :: NameSpaces -> String -> String -> Element -> Bool
-isElem ns prefix name element =
- qName (elName element) == name &&
- qURI (elName element) == (lookup prefix ns)
+isElem :: String -> String -> Element -> Bool
+isElem prefix name element =
+ let qp = fromMaybe "" (qPrefix (elName element))
+ in
+ qName (elName element) == name &&
+ qp == prefix
+hasElemName:: String -> String -> QName -> Bool
+hasElemName prefix name qn =
+ let qp = fromMaybe "" (qPrefix qn)
+ in
+ qName qn == name &&
+ qp == prefix
data OMath = OMath [OMathElem]
deriving Show
@@ -143,15 +146,15 @@ data GroupStyle = GroupStyle { groupChr :: Maybe Char
defaultGroupStyle :: GroupStyle
defaultGroupStyle = GroupStyle {groupChr = Nothing, groupPos = Nothing}
-elemToMath :: NameSpaces -> Element -> Maybe OMath
-elemToMath ns element | isElem ns "m" "oMath" element =
- Just $ OMath $ mapMaybe (elemToMathElem ns) (elChildren element)
-elemToMath _ _ = Nothing
+elemToMath :: Element -> Maybe OMath
+elemToMath element | isElem "m" "oMath" element =
+ Just $ OMath $ mapMaybe (elemToMathElem) (elChildren element)
+elemToMath _ = Nothing
-elemToBase :: NameSpaces -> Element -> Maybe Base
-elemToBase ns element | isElem ns "m" "e" element =
- Just $ Base $ mapMaybe (elemToMathElem ns) (elChildren element)
-elemToBase _ _ = Nothing
+elemToBase :: Element -> Maybe Base
+elemToBase element | isElem "m" "e" element =
+ Just $ Base $ mapMaybe (elemToMathElem) (elChildren element)
+elemToBase _ = Nothing
-- TODO: The right way to do this is to use the ampersand to break the
-- text lines into multiple columns. That's tricky, though, and this
@@ -164,38 +167,38 @@ filterAmpersand (OMathRun mrPr elems) =
OMathRun mrPr (map f elems)
filterAmpersand e = e
-elemToBaseNoAmpersand :: NameSpaces -> Element -> Maybe Base
-elemToBaseNoAmpersand ns element | isElem ns "m" "e" element =
+elemToBaseNoAmpersand :: Element -> Maybe Base
+elemToBaseNoAmpersand element | isElem "m" "e" element =
return $ Base $
mapMaybe
- (\e -> (elemToMathElem ns e >>= (return . filterAmpersand)))
+ (\e -> (elemToMathElem e >>= (return . filterAmpersand)))
(elChildren element)
-elemToBaseNoAmpersand _ _ = Nothing
+elemToBaseNoAmpersand _ = Nothing
-elemToOMathRunStyle :: NameSpaces -> Element -> OMathRunStyle
-elemToOMathRunStyle ns element =
+elemToOMathRunStyle :: Element -> OMathRunStyle
+elemToOMathRunStyle element =
let lit =
case
- findChild (elemName ns "m" "lit") element >>=
- findAttr (elemName ns "m" "val")
+ filterChildName (hasElemName"m" "lit") element >>=
+ findAttrBy (hasElemName"m" "val")
of
Just "on" -> True
_ -> False
in
OMathRunStyle { oMathLit = lit
- , oMathRunTextStyle = (elemToOMathRunTextStyle ns element)
+ , oMathRunTextStyle = (elemToOMathRunTextStyle element)
}
-elemToOMathRunTextStyle :: NameSpaces -> Element -> OMathRunTextStyle
-elemToOMathRunTextStyle ns element
- | Just mrPr <- findChild (elemName ns "m" "rPr") element
- , Just _ <- findChild (elemName ns "m" "nor") mrPr =
+elemToOMathRunTextStyle :: Element -> OMathRunTextStyle
+elemToOMathRunTextStyle element
+ | Just mrPr <- filterChildName (hasElemName"m" "rPr") element
+ , Just _ <- filterChildName (hasElemName"m" "nor") mrPr =
Normal
- | Just mrPr <- findChild (elemName ns "m" "rPr") element =
+ | Just mrPr <- filterChildName (hasElemName"m" "rPr") element =
let scr =
case
- findChild (elemName ns "m" "scr") mrPr >>=
- findAttr (elemName ns "m" "val")
+ filterChildName (hasElemName"m" "scr") mrPr >>=
+ findAttrBy (hasElemName"m" "val")
of
Just "roman" -> Just ORoman
Just "script" -> Just OScript
@@ -207,8 +210,8 @@ elemToOMathRunTextStyle ns element
sty =
case
- findChild (elemName ns "m" "sty") mrPr >>=
- findAttr (elemName ns "m" "val")
+ filterChildName (hasElemName"m" "sty") mrPr >>=
+ findAttrBy (hasElemName"m" "val")
of
Just "p" -> Just OPlain
Just "b" -> Just OBold
@@ -221,192 +224,192 @@ elemToOMathRunTextStyle ns element
-elemToNAryStyle :: NameSpaces -> Element -> NAryStyle
-elemToNAryStyle ns element
- | Just narypr <- findChild (QName "naryPr" (lookup "m" ns) (Just "m")) element =
+elemToNAryStyle :: Element -> NAryStyle
+elemToNAryStyle element
+ | Just narypr <- filterChildName (hasElemName"m" "naryPr") element =
let
- chr = findChild (QName "chr" (lookup "m" ns) (Just "m")) narypr >>=
- findAttr (QName "val" (lookup "m" ns) (Just "m")) >>=
+ chr = filterChildName (hasElemName"m" "chr") narypr >>=
+ findAttrBy (hasElemName"m" "val") >>=
Just . head
- limLoc = findChild (QName "limLoc" (lookup "m" ns) (Just "m")) narypr >>=
- findAttr (QName "val" (lookup "m" ns) (Just "m"))
+ limLoc = filterChildName (hasElemName"m" "limLoc") narypr >>=
+ findAttrBy (hasElemName"m" "val")
limLoc' = case limLoc of
Just "undOver" -> UnderOver
Just "subSup" -> SubSup
_ -> SubSup
in
NAryStyle { nAryChar = chr, nAryLimLoc = limLoc'}
-elemToNAryStyle _ _ = defaultNAryStyle
+elemToNAryStyle _ = defaultNAryStyle
-elemToDelimStyle :: NameSpaces -> Element -> DelimStyle
-elemToDelimStyle ns element
- | Just dPr <- findChild (QName "dPr" (lookup "m" ns) (Just "m")) element =
- let begChr = findChild (QName "begChr" (lookup "m" ns) (Just "m")) dPr >>=
- findAttr (QName "val" (lookup "m" ns) (Just "m")) >>=
+elemToDelimStyle :: Element -> DelimStyle
+elemToDelimStyle element
+ | Just dPr <- filterChildName (hasElemName"m" "dPr") element =
+ let begChr = filterChildName (hasElemName"m" "begChr") dPr >>=
+ findAttrBy (hasElemName"m" "val") >>=
(\c -> if null c then (Just ' ') else (Just $ head c))
- sepChr = findChild (QName "sepChr" (lookup "m" ns) (Just "m")) dPr >>=
- findAttr (QName "val" (lookup "m" ns) (Just "m")) >>=
+ sepChr = filterChildName (hasElemName"m" "sepChr") dPr >>=
+ findAttrBy (hasElemName"m" "val") >>=
(\c -> if null c then (Just ' ') else (Just $ head c))
- endChr = findChild (QName "endChr" (lookup "m" ns) (Just "m")) dPr >>=
- findAttr (QName "val" (lookup "m" ns) (Just "m")) >>=
+ endChr = filterChildName (hasElemName"m" "endChr") dPr >>=
+ findAttrBy (hasElemName"m" "val") >>=
(\c -> if null c then (Just ' ') else (Just $ head c))
in
DelimStyle { delimBegChar = begChr
, delimSepChar = sepChr
, delimEndChar = endChr}
-elemToDelimStyle _ _ = defaultDelimStyle
+elemToDelimStyle _ = defaultDelimStyle
-elemToGroupStyle :: NameSpaces -> Element -> GroupStyle
-elemToGroupStyle ns element
- | Just gPr <- findChild (QName "groupChrPr" (lookup "m" ns) (Just "m")) element =
- let chr = findChild (QName "chr" (lookup "m" ns) (Just "m")) gPr >>=
- findAttr (QName "val" (lookup "m" ns) (Just "m")) >>=
+elemToGroupStyle :: Element -> GroupStyle
+elemToGroupStyle element
+ | Just gPr <- filterChildName (hasElemName"m" "groupChrPr") element =
+ let chr = filterChildName (hasElemName"m" "chr") gPr >>=
+ findAttrBy (hasElemName"m" "val") >>=
Just . head
- pos = findChild (QName "pos" (lookup "m" ns) (Just "m")) gPr >>=
- findAttr (QName "val" (lookup "m" ns) (Just "m")) >>=
+ pos = filterChildName (hasElemName"m" "pos") gPr >>=
+ findAttrBy (hasElemName"m" "val") >>=
(\s -> Just $ if s == "top" then Top else Bottom)
in
GroupStyle { groupChr = chr, groupPos = pos }
-elemToGroupStyle _ _ = defaultGroupStyle
+elemToGroupStyle _ = defaultGroupStyle
-elemToMathElem :: NameSpaces -> Element -> Maybe OMathElem
-elemToMathElem ns element | isElem ns "m" "acc" element = do
+elemToMathElem :: Element -> Maybe OMathElem
+elemToMathElem element | isElem "m" "acc" element = do
let accChar =
- findChild (elemName ns "m" "accPr") element >>=
- findChild (elemName ns "m" "chr") >>=
- findAttr (elemName ns "m" "val") >>=
+ filterChildName (hasElemName"m" "accPr") element >>=
+ filterChildName (hasElemName"m" "chr") >>=
+ findAttrBy (hasElemName"m" "val") >>=
Just . head
accPr = AccentStyle { accentChar = accChar}
- base <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns
+ base <- filterChildName (hasElemName"m" "e") element >>=
+ elemToBase
return $ Accent accPr base
-elemToMathElem ns element | isElem ns "m" "bar" element = do
- barPr <- findChild (QName "barPr" (lookup "m" ns) (Just "m")) element >>=
- findChild (QName "pos" (lookup "m" ns) (Just "m")) >>=
- findAttr (QName "val" (lookup "m" ns) (Just "m")) >>=
+elemToMathElem element | isElem "m" "bar" element = do
+ barPr <- filterChildName (hasElemName"m" "barPr") element >>=
+ filterChildName (hasElemName"m" "pos") >>=
+ findAttrBy (hasElemName"m" "val") >>=
(\s ->
Just $ BarStyle {
barPos = (if s == "bot" then Bottom else Top)
})
- base <- findChild (QName "e" (lookup "m" ns) (Just "m")) element >>=
- elemToBase ns
+ base <- filterChildName (hasElemName"m" "e") element >>=
+ elemToBase
return $ Bar barPr base
-elemToMathElem ns element | isElem ns "m" "box" element =
- findChild (elemName ns "m" "e") element >>=
- elemToBase ns >>=
+elemToMathElem element | isElem "m" "box" element =
+ filterChildName (hasElemName"m" "e") element >>=
+ elemToBase >>=
(\b -> return $ Box b)
-elemToMathElem ns element | isElem ns "m" "borderBox" element =
- findChild (elemName ns "m" "e") element >>=
- elemToBase ns >>=
+elemToMathElem element | isElem "m" "borderBox" element =
+ filterChildName (hasElemName"m" "e") element >>=
+ elemToBase >>=
(\b -> return $ BorderBox b)
-elemToMathElem ns element | isElem ns "m" "d" element =
- let style = elemToDelimStyle ns element
+elemToMathElem element | isElem "m" "d" element =
+ let style = elemToDelimStyle element
in
- return $ Delimiter style $ mapMaybe (elemToBase ns) (elChildren element)
-elemToMathElem ns element | isElem ns "m" "eqArr" element =
- return $ EquationArray $ mapMaybe (elemToBaseNoAmpersand ns) (elChildren element)
-elemToMathElem ns element | isElem ns "m" "f" element = do
- num <- findChild (elemName ns "m" "num") element
- den <- findChild (elemName ns "m" "den") element
- let numElems = mapMaybe (elemToMathElem ns) (elChildren num)
- denElems = mapMaybe (elemToMathElem ns) (elChildren den)
+ return $ Delimiter style $ mapMaybe (elemToBase) (elChildren element)
+elemToMathElem element | isElem "m" "eqArr" element =
+ return $ EquationArray $ mapMaybe (elemToBaseNoAmpersand) (elChildren element)
+elemToMathElem element | isElem "m" "f" element = do
+ num <- filterChildName (hasElemName"m" "num") element
+ den <- filterChildName (hasElemName"m" "den") element
+ let numElems = mapMaybe (elemToMathElem) (elChildren num)
+ denElems = mapMaybe (elemToMathElem) (elChildren den)
return $ Fraction numElems denElems
-elemToMathElem ns element | isElem ns "m" "func" element = do
- fName <- findChild (elemName ns "m" "fName") element
- base <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns
- let fnElems = mapMaybe (elemToMathElem ns) (elChildren fName)
+elemToMathElem element | isElem "m" "func" element = do
+ fName <- filterChildName (hasElemName"m" "fName") element
+ base <- filterChildName (hasElemName"m" "e") element >>=
+ elemToBase
+ let fnElems = mapMaybe (elemToMathElem) (elChildren fName)
return $ Function fnElems base
-elemToMathElem ns element | isElem ns "m" "groupChr" element =
- let style = elemToGroupStyle ns element
+elemToMathElem element | isElem "m" "groupChr" element =
+ let style = elemToGroupStyle element
in
- findChild (elemName ns "m" "e") element >>=
- elemToBase ns >>=
+ filterChildName (hasElemName"m" "e") element >>=
+ elemToBase >>=
(\b -> return $ Group style b)
-elemToMathElem ns element | isElem ns "m" "limLow" element = do
- base <- findChild (elemName ns "m" "e") element
- >>= elemToBase ns
- lim <- findChild (elemName ns "m" "lim") element
- let limElems = mapMaybe (elemToMathElem ns) (elChildren lim)
+elemToMathElem element | isElem "m" "limLow" element = do
+ base <- filterChildName (hasElemName"m" "e") element
+ >>= elemToBase
+ lim <- filterChildName (hasElemName"m" "lim") element
+ let limElems = mapMaybe (elemToMathElem) (elChildren lim)
return $ LowerLimit base limElems
-elemToMathElem ns element | isElem ns "m" "limUpp" element = do
- base <- findChild (elemName ns "m" "e") element
- >>= elemToBase ns
- lim <- findChild (elemName ns "m" "lim") element
- let limElems = mapMaybe (elemToMathElem ns) (elChildren lim)
+elemToMathElem element | isElem "m" "limUpp" element = do
+ base <- filterChildName (hasElemName"m" "e") element
+ >>= elemToBase
+ lim <- filterChildName (hasElemName"m" "lim") element
+ let limElems = mapMaybe (elemToMathElem) (elChildren lim)
return $ UpperLimit base limElems
-elemToMathElem ns element | isElem ns "m" "m" element = do
- let rows = findChildren (elemName ns "m" "mr") element
- let bases = mapMaybe (\mr -> mapM (elemToBase ns) (elChildren mr)) rows
+elemToMathElem element | isElem "m" "m" element = do
+ let rows = filterChildrenName (hasElemName"m" "mr") element
+ let bases = mapMaybe (\mr -> mapM (elemToBase) (elChildren mr)) rows
return $ Matrix bases
-elemToMathElem ns element | isElem ns "m" "nary" element = do
- let style = elemToNAryStyle ns element
- sub <- findChild (elemName ns "m" "sub") element >>=
- (\e -> return $ mapMaybe (elemToMathElem ns) (elChildren e))
- sup <- findChild (elemName ns "m" "sup") element >>=
- (\e -> return $ mapMaybe (elemToMathElem ns) (elChildren e))
- base <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns
+elemToMathElem element | isElem "m" "nary" element = do
+ let style = elemToNAryStyle element
+ sub <- filterChildName (hasElemName"m" "sub") element >>=
+ (\e -> return $ mapMaybe (elemToMathElem) (elChildren e))
+ sup <- filterChildName (hasElemName"m" "sup") element >>=
+ (\e -> return $ mapMaybe (elemToMathElem) (elChildren e))
+ base <- filterChildName (hasElemName"m" "e") element >>=
+ elemToBase
return $ NAry style sub sup base
-elemToMathElem ns element | isElem ns "m" "rad" element = do
- deg <- findChild (elemName ns "m" "deg") element >>=
- (\e -> return $ mapMaybe (elemToMathElem ns) (elChildren e))
- base <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns
+elemToMathElem element | isElem "m" "rad" element = do
+ deg <- filterChildName (hasElemName"m" "deg") element >>=
+ (\e -> return $ mapMaybe (elemToMathElem) (elChildren e))
+ base <- filterChildName (hasElemName"m" "e") element >>=
+ elemToBase
return $ Radical deg base
-elemToMathElem ns element | isElem ns "m" "phant" element = do
- base <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns
+elemToMathElem element | isElem "m" "phant" element = do
+ base <- filterChildName (hasElemName"m" "e") element >>=
+ elemToBase
return $ Phantom base
-elemToMathElem ns element | isElem ns "m" "sPre" element = do
- sub <- findChild (elemName ns "m" "sub") element >>=
- (\e -> return $ mapMaybe (elemToMathElem ns) (elChildren e))
- sup <- findChild (elemName ns "m" "sup") element >>=
- (\e -> return $ mapMaybe (elemToMathElem ns) (elChildren e))
- base <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns
+elemToMathElem element | isElem "m" "sPre" element = do
+ sub <- filterChildName (hasElemName"m" "sub") element >>=
+ (\e -> return $ mapMaybe (elemToMathElem) (elChildren e))
+ sup <- filterChildName (hasElemName"m" "sup") element >>=
+ (\e -> return $ mapMaybe (elemToMathElem) (elChildren e))
+ base <- filterChildName (hasElemName"m" "e") element >>=
+ elemToBase
return $ PreSubSuper sub sup base
-elemToMathElem ns element | isElem ns "m" "sSub" element = do
- base <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns
- sub <- findChild (elemName ns "m" "sub") element >>=
- (\e -> return $ mapMaybe (elemToMathElem ns) (elChildren e))
+elemToMathElem element | isElem "m" "sSub" element = do
+ base <- filterChildName (hasElemName"m" "e") element >>=
+ elemToBase
+ sub <- filterChildName (hasElemName"m" "sub") element >>=
+ (\e -> return $ mapMaybe (elemToMathElem) (elChildren e))
return $ Sub base sub
-elemToMathElem ns element | isElem ns "m" "sSubSup" element = do
- base <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns
- sub <- findChild (elemName ns "m" "sub") element >>=
- (\e -> return $ mapMaybe (elemToMathElem ns) (elChildren e))
- sup <- findChild (elemName ns "m" "sup") element >>=
- (\e -> return $ mapMaybe (elemToMathElem ns) (elChildren e))
+elemToMathElem element | isElem "m" "sSubSup" element = do
+ base <- filterChildName (hasElemName"m" "e") element >>=
+ elemToBase
+ sub <- filterChildName (hasElemName"m" "sub") element >>=
+ (\e -> return $ mapMaybe (elemToMathElem) (elChildren e))
+ sup <- filterChildName (hasElemName"m" "sup") element >>=
+ (\e -> return $ mapMaybe (elemToMathElem) (elChildren e))
return $ SubSuper base sub sup
-elemToMathElem ns element | isElem ns "m" "sSup" element = do
- base <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns
- sup <- findChild (elemName ns "m" "sup") element >>=
- (\e -> return $ mapMaybe (elemToMathElem ns) (elChildren e))
+elemToMathElem element | isElem "m" "sSup" element = do
+ base <- filterChildName (hasElemName"m" "e") element >>=
+ elemToBase
+ sup <- filterChildName (hasElemName"m" "sup") element >>=
+ (\e -> return $ mapMaybe (elemToMathElem) (elChildren e))
return $ Super base sup
-elemToMathElem ns element | isElem ns "m" "r" element = do
- let mrPr = elemToOMathRunStyle ns element
- mrElems <- elemToOMathRunElems ns element
+elemToMathElem element | isElem "m" "r" element = do
+ let mrPr = elemToOMathRunStyle element
+ mrElems <- elemToOMathRunElems element
return $ OMathRun mrPr mrElems
-elemToMathElem _ _ = Nothing
-
-elemToOMathRunElem :: NameSpaces -> Element -> Maybe OMathRunElem
-elemToOMathRunElem ns element
- | isElem ns "w" "t" element
- || isElem ns "m" "t" element
- || isElem ns "w" "delText" element = Just $ TextRun $ strContent element
- | isElem ns "w" "br" element = Just LnBrk
- | isElem ns "w" "tab" element = Just Tab
+elemToMathElem _ = Nothing
+
+elemToOMathRunElem :: Element -> Maybe OMathRunElem
+elemToOMathRunElem element
+ | isElem "w" "t" element
+ || isElem "m" "t" element
+ || isElem "w" "delText" element = Just $ TextRun $ strContent element
+ | isElem "w" "br" element = Just LnBrk
+ | isElem "w" "tab" element = Just Tab
| otherwise = Nothing
-elemToOMathRunElems :: NameSpaces -> Element -> Maybe [OMathRunElem]
-elemToOMathRunElems ns element
- | isElem ns "w" "r" element
- || isElem ns "m" "r" element =
- Just $ mapMaybe (elemToOMathRunElem ns) (elChildren element)
-elemToOMathRunElems _ _ = Nothing
+elemToOMathRunElems :: Element -> Maybe [OMathRunElem]
+elemToOMathRunElems element
+ | isElem "w" "r" element
+ || isElem "m" "r" element =
+ Just $ mapMaybe (elemToOMathRunElem) (elChildren element)
+elemToOMathRunElems _ = Nothing
----- And now the TeXMath Creation
@@ -655,62 +658,62 @@ baseToExp' :: Base -> [TM.Exp]
baseToExp' (Base mathElems) =
concatMap oMathElemToExps mathElems
-elemToExps :: NameSpaces -> Element -> Maybe [TM.Exp]
-elemToExps ns element = oMathToExps <$> (elemToMath ns element)
+elemToExps :: Element -> Maybe [TM.Exp]
+elemToExps element = oMathToExps <$> (elemToMath element)
-elemToExps' :: NameSpaces -> Element -> Maybe [TM.Exp]
-elemToExps' ns element | isElem ns "m" "acc" element = do
- let chr = findChild (elemName ns "m" "accPr") element >>=
- findChild (elemName ns "m" "chr") >>=
- findAttr (elemName ns "m" "val") >>=
+elemToExps' :: Element -> Maybe [TM.Exp]
+elemToExps' element | isElem "m" "acc" element = do
+ let chr = filterChildName (hasElemName "m" "accPr") element >>=
+ filterChildName (hasElemName "m" "chr") >>=
+ findAttrBy (hasElemName "m" "val") >>=
Just . head
chr' = case chr of
Just c -> c
Nothing -> '\180' -- default to acute.
- baseExp <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns >>=
+ baseExp <- filterChildName (hasElemName "m" "e") element >>=
+ elemToBase >>=
(return . baseToExp)
return $ [TM.EOver False baseExp (TM.ESymbol TM.Accent [chr'])]
-elemToExps' ns element | isElem ns "m" "bar" element = do
- pos <- findChild (elemName ns "m" "barPr") element >>=
- findChild (elemName ns "m" "pos") >>=
- findAttr (elemName ns "m" "val")
- baseExp <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns >>=
+elemToExps' element | isElem "m" "bar" element = do
+ pos <- filterChildName (hasElemName "m" "barPr") element >>=
+ filterChildName (hasElemName "m" "pos") >>=
+ findAttrBy (hasElemName "m" "val")
+ baseExp <- filterChildName (hasElemName "m" "e") element >>=
+ elemToBase >>=
(return . baseToExp)
case pos of
"top" -> Just [TM.EOver False baseExp (TM.ESymbol TM.Accent "\175")]
"bot" -> Just [TM.EUnder False baseExp (TM.ESymbol TM.Accent "\818")]
_ -> Nothing
-elemToExps' ns element | isElem ns "m" "box" element = do
- baseExp <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns >>=
+elemToExps' element | isElem "m" "box" element = do
+ baseExp <- filterChildName (hasElemName "m" "e") element >>=
+ elemToBase >>=
(return . baseToExp)
return [baseExp]
-elemToExps' ns element | isElem ns "m" "borderBox" element = do
+elemToExps' element | isElem "m" "borderBox" element = do
-- TODO: This needs to be "\\boxed" somehow.
- baseExp <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns >>=
+ baseExp <- filterChildName (hasElemName "m" "e") element >>=
+ elemToBase >>=
(return . baseToExp)
return [baseExp]
-elemToExps' ns element | isElem ns "m" "d" element =
+elemToExps' element | isElem "m" "d" element =
let baseExps = mapMaybe
- (\e -> (elemToBase ns e >>= (return . baseToExp)))
+ (\e -> (elemToBase e >>= (return . baseToExp)))
(elChildren element)
inDelimExps = map Right baseExps
- dPr = findChild (elemName ns "m" "dPr") element
+ dPr = filterChildName (hasElemName "m" "dPr") element
begChr = dPr >>=
- findChild (elemName ns "m" "begChr") >>=
- findAttr (elemName ns "m" "val") >>=
+ filterChildName (hasElemName "m" "begChr") >>=
+ findAttrBy (hasElemName "m" "val") >>=
(\c -> if null c then (Just ' ') else (Just $ head c))
sepChr = dPr >>=
- findChild (elemName ns "m" "sepChr") >>=
- findAttr (elemName ns "m" "val") >>=
+ filterChildName (hasElemName "m" "sepChr") >>=
+ findAttrBy (hasElemName "m" "val") >>=
(\c -> if null c then (Just ' ') else (Just $ head c))
endChr = dPr >>=
- findChild (elemName ns "m" "endChr") >>=
- findAttr (elemName ns "m" "val") >>=
+ filterChildName (hasElemName "m" "endChr") >>=
+ findAttrBy (hasElemName "m" "val") >>=
(\c -> if null c then (Just ' ') else (Just $ head c))
beg = fromMaybe '(' begChr
end = fromMaybe ')' endChr
@@ -718,38 +721,38 @@ elemToExps' ns element | isElem ns "m" "d" element =
exps = intersperse (Left [sep]) inDelimExps
in
Just [TM.EDelimited [beg] [end] exps]
-elemToExps' ns element | isElem ns "m" "eqArr" element =
- let bases = mapMaybe (elemToBaseNoAmpersand ns) (elChildren element)
+elemToExps' element | isElem "m" "eqArr" element =
+ let bases = mapMaybe (elemToBaseNoAmpersand) (elChildren element)
baseExps = map (\b -> [baseToExp' b]) bases
in
return [TM.EArray [] baseExps]
-elemToExps' ns element | isElem ns "m" "f" element = do
- num <- findChild (elemName ns "m" "num") element
- den <- findChild (elemName ns "m" "den") element
- let numExp = TM.EGrouped $ concat $ mapMaybe (elemToExps' ns) (elChildren num)
- denExp = TM.EGrouped $ concat $ mapMaybe (elemToExps' ns) (elChildren den)
+elemToExps' element | isElem "m" "f" element = do
+ num <- filterChildName (hasElemName "m" "num") element
+ den <- filterChildName (hasElemName "m" "den") element
+ let numExp = TM.EGrouped $ concat $ mapMaybe (elemToExps') (elChildren num)
+ denExp = TM.EGrouped $ concat $ mapMaybe (elemToExps') (elChildren den)
return $ [TM.EFraction TM.NormalFrac numExp denExp]
-elemToExps' ns element | isElem ns "m" "func" element = do
- fName <- findChild (elemName ns "m" "fName") element
- baseExp <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns >>=
+elemToExps' element | isElem "m" "func" element = do
+ fName <- filterChildName (hasElemName "m" "fName") element
+ baseExp <- filterChildName (hasElemName "m" "e") element >>=
+ elemToBase >>=
(return . baseToExp)
-- We need a string for the fname, but omml gives it to us as a
-- series of oMath elems. We're going to filter out the oMathRuns,
-- which should work for us most of the time.
let fnameString = concatMap expToString $
- concat $ mapMaybe (elemToExps' ns) (elChildren fName)
+ concat $ mapMaybe (elemToExps') (elChildren fName)
return [TM.EMathOperator fnameString, baseExp]
-elemToExps' ns element | isElem ns "m" "groupChr" element = do
- let gPr = findChild (elemName ns "m" "groupChrPr") element
+elemToExps' element | isElem "m" "groupChr" element = do
+ let gPr = filterChildName (hasElemName "m" "groupChrPr") element
chr = gPr >>=
- findChild (elemName ns "m" "chr") >>=
- findAttr (elemName ns "m" "val")
+ filterChildName (hasElemName "m" "chr") >>=
+ findAttrBy (hasElemName "m" "val")
pos = gPr >>=
- findChild (elemName ns "m" "pos") >>=
- findAttr (elemName ns "m" "val")
- baseExp <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns >>=
+ filterChildName (hasElemName "m" "pos") >>=
+ findAttrBy (hasElemName "m" "val")
+ baseExp <- filterChildName (hasElemName "m" "e") element >>=
+ elemToBase >>=
(return . baseToExp)
case pos of
Just "top" ->
@@ -765,48 +768,48 @@ elemToExps' ns element | isElem ns "m" "groupChr" element = do
in
return [TM.EUnder False baseExp (TM.ESymbol TM.Accent [chr'])]
_ -> Nothing
-elemToExps' ns element | isElem ns "m" "limLow" element = do
- baseExp <- findChild (elemName ns "m" "e") element
- >>= elemToBase ns
+elemToExps' element | isElem "m" "limLow" element = do
+ baseExp <- filterChildName (hasElemName "m" "e") element
+ >>= elemToBase
>>= (return . baseToExp)
- limExp <- findChild (elemName ns "m" "lim") element
- >>= (\e -> Just $ concat $ mapMaybe (elemToExps' ns) (elChildren e))
+ limExp <- filterChildName (hasElemName "m" "lim") element
+ >>= (\e -> Just $ concat $ mapMaybe (elemToExps') (elChildren e))
>>= (return . TM.EGrouped)
return [TM.EUnder True limExp baseExp]
-elemToExps' ns element | isElem ns "m" "limUpp" element = do
- baseExp <- findChild (elemName ns "m" "e") element
- >>= elemToBase ns
+elemToExps' element | isElem "m" "limUpp" element = do
+ baseExp <- filterChildName (hasElemName "m" "e") element
+ >>= elemToBase
>>= (return . baseToExp)
- limExp <- findChild (elemName ns "m" "lim") element
- >>= (\e -> Just $ concat $ mapMaybe (elemToExps' ns) (elChildren e))
+ limExp <- filterChildName (hasElemName "m" "lim") element
+ >>= (\e -> Just $ concat $ mapMaybe (elemToExps') (elChildren e))
>>= (return . TM.EGrouped)
return [TM.EOver True limExp baseExp]
-elemToExps' ns element | isElem ns "m" "m" element =
- let rows = findChildren (elemName ns "m" "mr") element
+elemToExps' element | isElem "m" "m" element =
+ let rows = filterChildrenName (hasElemName "m" "mr") element
rowExps = map
(\mr -> mapMaybe
- (\e -> (elemToBase ns e >>= return . baseToExp'))
+ (\e -> (elemToBase e >>= return . baseToExp'))
(elChildren mr))
rows
in
return [TM.EArray [TM.AlignCenter] rowExps]
-elemToExps' ns element | isElem ns "m" "nary" element = do
- let naryPr = findChild (elemName ns "m" "naryPr") element
+elemToExps' element | isElem "m" "nary" element = do
+ let naryPr = filterChildName (hasElemName "m" "naryPr") element
naryChr = naryPr >>=
- findChild (elemName ns "m" "chr") >>=
- findAttr (elemName ns "m" "val")
+ filterChildName (hasElemName "m" "chr") >>=
+ findAttrBy (hasElemName "m" "val")
opChr = case naryChr of
Just (c:_) -> c
_ -> '\8747' -- default to integral
limLoc = naryPr >>=
- findChild (elemName ns "m" "limLoc") >>=
- findAttr (elemName ns "m" "val")
- subExps <- findChild (elemName ns "m" "sub") element >>=
- (\e -> return $ concat $ mapMaybe (elemToExps' ns) (elChildren e))
- supExps <- findChild (elemName ns "m" "sup") element >>=
- (\e -> return $ concat $ mapMaybe (elemToExps' ns) (elChildren e))
- baseExp <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns >>=
+ filterChildName (hasElemName "m" "limLoc") >>=
+ findAttrBy (hasElemName "m" "val")
+ subExps <- filterChildName (hasElemName "m" "sub") element >>=
+ (\e -> return $ concat $ mapMaybe (elemToExps') (elChildren e))
+ supExps <- filterChildName (hasElemName "m" "sup") element >>=
+ (\e -> return $ concat $ mapMaybe (elemToExps') (elChildren e))
+ baseExp <- filterChildName (hasElemName "m" "e") element >>=
+ elemToBase >>=
(return . baseToExp)
case limLoc of
Just "undOvr" -> return [TM.EUnderover True
@@ -820,63 +823,63 @@ elemToExps' ns element | isElem ns "m" "nary" element = do
(TM.EGrouped supExps)
, baseExp]
-elemToExps' ns element | isElem ns "m" "phant" element = do
- baseExp <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns >>=
+elemToExps' element | isElem "m" "phant" element = do
+ baseExp <- filterChildName (hasElemName "m" "e") element >>=
+ elemToBase >>=
(return . baseToExp)
return [TM.EPhantom baseExp]
-elemToExps' ns element | isElem ns "m" "rad" element = do
- degExps <- findChild (elemName ns "m" "deg") element >>=
- (\e -> return $ concat $ mapMaybe (elemToExps' ns) (elChildren e))
- baseExp <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns >>=
+elemToExps' element | isElem "m" "rad" element = do
+ degExps <- filterChildName (hasElemName "m" "deg") element >>=
+ (\e -> return $ concat $ mapMaybe (elemToExps') (elChildren e))
+ baseExp <- filterChildName (hasElemName "m" "e") element >>=
+ elemToBase >>=
(return . baseToExp)
return $ case degExps of
[] -> [TM.ESqrt baseExp]
ds -> [TM.ERoot (TM.EGrouped ds) baseExp]
-elemToExps' ns element | isElem ns "m" "sPre" element = do
- subExps <- findChild (elemName ns "m" "sub") element >>=
- (\e -> return $ concat $ mapMaybe (elemToExps' ns) (elChildren e))
- supExps <- findChild (elemName ns "m" "sup") element >>=
- (\e -> return $ concat $ mapMaybe (elemToExps' ns) (elChildren e))
- baseExp <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns >>=
+elemToExps' element | isElem "m" "sPre" element = do
+ subExps <- filterChildName (hasElemName "m" "sub") element >>=
+ (\e -> return $ concat $ mapMaybe (elemToExps') (elChildren e))
+ supExps <- filterChildName (hasElemName "m" "sup") element >>=
+ (\e -> return $ concat $ mapMaybe (elemToExps') (elChildren e))
+ baseExp <- filterChildName (hasElemName "m" "e") element >>=
+ elemToBase >>=
(return . baseToExp)
return [TM.ESubsup
(TM.EIdentifier "")
(TM.EGrouped subExps)
(TM.EGrouped supExps)
, baseExp]
-elemToExps' ns element | isElem ns "m" "sSub" element = do
- baseExp <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns >>=
+elemToExps' element | isElem "m" "sSub" element = do
+ baseExp <- filterChildName (hasElemName "m" "e") element >>=
+ elemToBase >>=
(return . baseToExp)
- subExps <- findChild (elemName ns "m" "sub") element >>=
- (\e -> return $ concat $ mapMaybe (elemToExps' ns) (elChildren e))
+ subExps <- filterChildName (hasElemName "m" "sub") element >>=
+ (\e -> return $ concat $ mapMaybe (elemToExps') (elChildren e))
return [TM.ESub baseExp (TM.EGrouped subExps)]
-elemToExps' ns element | isElem ns "m" "sSubSup" element = do
- baseExp <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns >>=
+elemToExps' element | isElem "m" "sSubSup" element = do
+ baseExp <- filterChildName (hasElemName "m" "e") element >>=
+ elemToBase >>=
(return . baseToExp)
- subExps <- findChild (elemName ns "m" "sub") element >>=
- (\e -> return $ concat $ mapMaybe (elemToExps' ns) (elChildren e))
- supExps <- findChild (elemName ns "m" "sup") element >>=
- (\e -> return $ concat $ mapMaybe (elemToExps' ns) (elChildren e))
+ subExps <- filterChildName (hasElemName "m" "sub") element >>=
+ (\e -> return $ concat $ mapMaybe (elemToExps') (elChildren e))
+ supExps <- filterChildName (hasElemName "m" "sup") element >>=
+ (\e -> return $ concat $ mapMaybe (elemToExps') (elChildren e))
return [TM.ESubsup baseExp (TM.EGrouped subExps) (TM.EGrouped supExps)]
-elemToExps' ns element | isElem ns "m" "sSup" element = do
- baseExp <- findChild (elemName ns "m" "e") element >>=
- elemToBase ns >>=
+elemToExps' element | isElem "m" "sSup" element = do
+ baseExp <- filterChildName (hasElemName "m" "e") element >>=
+ elemToBase >>=
(return . baseToExp)
- supExps <- findChild (elemName ns "m" "sup") element >>=
- (\e -> return $ concat $ mapMaybe (elemToExps' ns) (elChildren e))
+ supExps <- filterChildName (hasElemName "m" "sup") element >>=
+ (\e -> return $ concat $ mapMaybe (elemToExps') (elChildren e))
return [TM.ESuper baseExp (TM.EGrouped supExps)]
-elemToExps' ns element | isElem ns "m" "r" element = do
- let mrPr = findChild (elemName ns "m" "rPr") element
+elemToExps' element | isElem "m" "r" element = do
+ let mrPr = filterChildName (hasElemName "m" "rPr") element
lit = mrPr >>=
- findChild (elemName ns "m" "lit") >>=
- findAttr (elemName ns "m" "val")
- txtSty = elemToOMathRunTextStyle ns element
- mrElems <- elemToOMathRunElems ns element
+ filterChildName (hasElemName "m" "lit") >>=
+ findAttrBy (hasElemName "m" "val")
+ txtSty = elemToOMathRunTextStyle element
+ mrElems <- elemToOMathRunElems element
return $ case oMathRunTextStyleToTextType txtSty of
Nothing -> [TM.EIdentifier $ oMathRunElemsToString mrElems]
Just textType ->
@@ -885,7 +888,7 @@ elemToExps' ns element | isElem ns "m" "r" element = do
[TM.EText textType (oMathRunElemsToString mrElems)]
_ ->
[TM.EStyled textType [TM.EIdentifier $ oMathRunElemsToString mrElems]]
-elemToExps' _ _ = Nothing
+elemToExps' _ = Nothing
expToString :: TM.Exp -> String
expToString (TM.ENumber s) = s