git.iko.soy/typeable/pandoc
on master help sign in
Docx parser: Use xml convenience functions

The functions `isElem` and `elemName` (defined in Docx/Util.hs) make the code a lot cleaner than the original XML.Light functions, but they had been used inconsistently. This puts them in wherever applicable.

commit347d716826249ea7eadc8332f48e1600c469abb0 authorJesse Rosenthal <jrosenthal@jhu.edu> dateSat 13 Aug 2016, 13:46 (10 years ago) parent1955ee9
1 file changed+27−38
src/Text/Pandoc/Readers/Docx/Parse.hs+27−38
src/Text/Pandoc/Readers/Docx/Parse.hs+27−38
@@ -457,40 +457,33 @@ lookupLevel numId ilvl (Numbering _ numbs absNumbs) = do
457457
458458
459459numElemToNum :: NameSpaces -> Element -> Maybe Numb
460−numElemToNum ns element |
461− qName (elName element) == "num" &&
462− qURI (elName element) == (lookup "w" ns) = do
463− numId <- findAttr (QName "numId" (lookup "w" ns) (Just "w")) element
464− absNumId <- findChild (QName "abstractNumId" (lookup "w" ns) (Just "w")) element
465− >>= findAttr (QName "val" (lookup "w" ns) (Just "w"))
466− return $ Numb numId absNumId
460+numElemToNum ns element
461+ | isElem ns "w" "num" element = do
462+ numId <- findAttr (elemName ns "w" "numId") element
463+ absNumId <- findChild (elemName ns "w" "abstractNumId") element
464+ >>= findAttr (elemName ns "w" "val")
465+ return $ Numb numId absNumId
467466numElemToNum _ _ = Nothing
468467
469468absNumElemToAbsNum :: NameSpaces -> Element -> Maybe AbstractNumb
470−absNumElemToAbsNum ns element |
471− qName (elName element) == "abstractNum" &&
472− qURI (elName element) == (lookup "w" ns) = do
473− absNumId <- findAttr
474− (QName "abstractNumId" (lookup "w" ns) (Just "w"))
475− element
476− let levelElems = findChildren
477− (QName "lvl" (lookup "w" ns) (Just "w"))
478− element
479− levels = mapMaybe (levelElemToLevel ns) levelElems
480− return $ AbstractNumb absNumId levels
469+absNumElemToAbsNum ns element
470+ | isElem ns "w" "abstractNum" element = do
471+ absNumId <- findAttr (elemName ns "w" "abstractNumId") element
472+ let levelElems = findChildren (elemName ns "w" "lvl") element
473+ levels = mapMaybe (levelElemToLevel ns) levelElems
474+ return $ AbstractNumb absNumId levels
481475absNumElemToAbsNum _ _ = Nothing
482476
483477levelElemToLevel :: NameSpaces -> Element -> Maybe Level
484−levelElemToLevel ns element |
485− qName (elName element) == "lvl" &&
486− qURI (elName element) == (lookup "w" ns) = do
487− ilvl <- findAttr (QName "ilvl" (lookup "w" ns) (Just "w")) element
488− fmt <- findChild (QName "numFmt" (lookup "w" ns) (Just "w")) element
489− >>= findAttr (QName "val" (lookup "w" ns) (Just "w"))
490− txt <- findChild (QName "lvlText" (lookup "w" ns) (Just "w")) element
491− >>= findAttr (QName "val" (lookup "w" ns) (Just "w"))
492− let start = findChild (QName "start" (lookup "w" ns) (Just "w")) element
493− >>= findAttr (QName "val" (lookup "w" ns) (Just "w"))
478+levelElemToLevel ns element
479+ | isElem ns "w" "lvl" element = do
480+ ilvl <- findAttr (elemName ns "w" "ilvl") element
481+ fmt <- findChild (elemName ns "w" "numFmt") element
482+ >>= findAttr (elemName ns "w" "val")
483+ txt <- findChild (elemName ns "w" "lvlText") element
484+ >>= findAttr (elemName ns "w" "val")
485+ let start = findChild (elemName ns "w" "start") element
486+ >>= findAttr (elemName ns "w" "val")
494487 >>= (\s -> listToMaybe (map fst (reads s :: [(Integer, String)])))
495488 return (ilvl, fmt, txt, start)
496489levelElemToLevel _ _ = Nothing
@@ -502,12 +495,8 @@ archiveToNumbering' zf = do
502495 Just entry -> do
503496 numberingElem <- (parseXMLDoc . UTF8.toStringLazy . fromEntry) entry
504497 let namespaces = elemToNameSpaces numberingElem
505− numElems = findChildren
506− (QName "num" (lookup "w" namespaces) (Just "w"))
507− numberingElem
508− absNumElems = findChildren
509− (QName "abstractNum" (lookup "w" namespaces) (Just "w"))
510− numberingElem
498+ numElems = findChildren (elemName namespaces "w" "num") numberingElem
499+ absNumElems = findChildren (elemName namespaces "w" "abstractNum") numberingElem
511500 nums = mapMaybe (numElemToNum namespaces) numElems
512501 absNums = mapMaybe (absNumElemToAbsNum namespaces) absNumElems
513502 return $ Numbering namespaces nums absNums
@@ -584,13 +573,13 @@ elemToParIndentation :: NameSpaces -> Element -> Maybe ParIndentation
584573elemToParIndentation ns element | isElem ns "w" "ind" element =
585574 Just $ ParIndentation {
586575 leftParIndent =
587− findAttr (QName "left" (lookup "w" ns) (Just "w")) element >>=
576+ findAttr (elemName ns "w" "left") element >>=
588577 stringToInteger
589578 , rightParIndent =
590− findAttr (QName "right" (lookup "w" ns) (Just "w")) element >>=
579+ findAttr (elemName ns "w" "right") element >>=
591580 stringToInteger
592581 , hangingParIndent =
593− findAttr (QName "hanging" (lookup "w" ns) (Just "w")) element >>=
582+ findAttr (elemName ns "w" "hanging") element >>=
594583 stringToInteger}
595584elemToParIndentation _ _ = Nothing
596585
@@ -677,7 +666,7 @@ elemToParPart ns element
677666 , Just drawingElem <- findChild (elemName ns "w" "drawing") element =
678667 let a_ns = "http://schemas.openxmlformats.org/drawingml/2006/main"
679668 drawing = findElement (QName "blip" (Just a_ns) (Just "a")) element
680− >>= findAttr (QName "embed" (lookup "r" ns) (Just "r"))
669+ >>= findAttr (elemName ns "r" "embed")
681670 in
682671 case drawing of
683672 Just s -> expandDrawingId s >>= (\(fp, bs) -> return $ Drawing fp bs $ elemToExtent drawingElem)