git.iko.soy/typeable/pandoc
on master help sign in
Docx parser: Use xml convenience functions
347d716Jesse Rosenthal
src/Text/Pandoc/Readers/Docx/Parse.hs+27−38
@@ -457,40 +457,33 @@ lookupLevel numId ilvl (Numbering _ numbs absNumbs) = do
457
457
458
458
459numElemToNum :: NameSpaces -> Element -> Maybe Numb
459numElemToNum :: NameSpaces -> Element -> Maybe Numb
460−numElemToNum ns element |
460+numElemToNum ns element
461− qName (elName element) == "num" &&
461+ | isElem ns "w" "num" element = do
462− qURI (elName element) == (lookup "w" ns) = do
463− numId <- findAttr (QName "numId" (lookup "w" ns) (Just "w")) element
462+ numId <- findAttr (elemName ns "w" "numId") element
464− absNumId <- findChild (QName "abstractNumId" (lookup "w" ns) (Just "w")) element
463+ absNumId <- findChild (elemName ns "w" "abstractNumId") element
465− >>= findAttr (QName "val" (lookup "w" ns) (Just "w"))
464+ >>= findAttr (elemName ns "w" "val")
466− return $ Numb numId absNumId
465+ return $ Numb numId absNumId
467numElemToNum _ _ = Nothing
466numElemToNum _ _ = Nothing
468
467
469absNumElemToAbsNum :: NameSpaces -> Element -> Maybe AbstractNumb
468absNumElemToAbsNum :: NameSpaces -> Element -> Maybe AbstractNumb
470−absNumElemToAbsNum ns element |
469+absNumElemToAbsNum ns element
471− qName (elName element) == "abstractNum" &&
470+ | isElem ns "w" "abstractNum" element = do
472− qURI (elName element) == (lookup "w" ns) = do
473− absNumId <- findAttr
471+ absNumId <- findAttr (elemName ns "w" "abstractNumId") element
474− (QName "abstractNumId" (lookup "w" ns) (Just "w"))
475− element
476− let levelElems = findChildren
472+ let levelElems = findChildren (elemName ns "w" "lvl") element
477− (QName "lvl" (lookup "w" ns) (Just "w"))
478− element
479− levels = mapMaybe (levelElemToLevel ns) levelElems
473+ levels = mapMaybe (levelElemToLevel ns) levelElems
480− return $ AbstractNumb absNumId levels
474+ return $ AbstractNumb absNumId levels
481absNumElemToAbsNum _ _ = Nothing
475absNumElemToAbsNum _ _ = Nothing
482
476
483levelElemToLevel :: NameSpaces -> Element -> Maybe Level
477levelElemToLevel :: NameSpaces -> Element -> Maybe Level
484−levelElemToLevel ns element |
478+levelElemToLevel ns element
485− qName (elName element) == "lvl" &&
479+ | isElem ns "w" "lvl" element = do
486− qURI (elName element) == (lookup "w" ns) = do
487− ilvl <- findAttr (QName "ilvl" (lookup "w" ns) (Just "w")) element
480+ ilvl <- findAttr (elemName ns "w" "ilvl") element
488− fmt <- findChild (QName "numFmt" (lookup "w" ns) (Just "w")) element
481+ fmt <- findChild (elemName ns "w" "numFmt") element
489− >>= findAttr (QName "val" (lookup "w" ns) (Just "w"))
482+ >>= findAttr (elemName ns "w" "val")
490− txt <- findChild (QName "lvlText" (lookup "w" ns) (Just "w")) element
483+ txt <- findChild (elemName ns "w" "lvlText") element
491− >>= findAttr (QName "val" (lookup "w" ns) (Just "w"))
484+ >>= findAttr (elemName ns "w" "val")
492− let start = findChild (QName "start" (lookup "w" ns) (Just "w")) element
485+ let start = findChild (elemName ns "w" "start") element
493− >>= findAttr (QName "val" (lookup "w" ns) (Just "w"))
486+ >>= findAttr (elemName ns "w" "val")
494 >>= (\s -> listToMaybe (map fst (reads s :: [(Integer, String)])))
487 >>= (\s -> listToMaybe (map fst (reads s :: [(Integer, String)])))
495 return (ilvl, fmt, txt, start)
488 return (ilvl, fmt, txt, start)
496levelElemToLevel _ _ = Nothing
489levelElemToLevel _ _ = Nothing
@@ -502,12 +495,8 @@ archiveToNumbering' zf = do
502 Just entry -> do
495 Just entry -> do
503 numberingElem <- (parseXMLDoc . UTF8.toStringLazy . fromEntry) entry
496 numberingElem <- (parseXMLDoc . UTF8.toStringLazy . fromEntry) entry
504 let namespaces = elemToNameSpaces numberingElem
497 let namespaces = elemToNameSpaces numberingElem
505− numElems = findChildren
498+ numElems = findChildren (elemName namespaces "w" "num") numberingElem
506− (QName "num" (lookup "w" namespaces) (Just "w"))
507− numberingElem
508− absNumElems = findChildren
499+ absNumElems = findChildren (elemName namespaces "w" "abstractNum") numberingElem
509− (QName "abstractNum" (lookup "w" namespaces) (Just "w"))
510− numberingElem
511 nums = mapMaybe (numElemToNum namespaces) numElems
500 nums = mapMaybe (numElemToNum namespaces) numElems
512 absNums = mapMaybe (absNumElemToAbsNum namespaces) absNumElems
501 absNums = mapMaybe (absNumElemToAbsNum namespaces) absNumElems
513 return $ Numbering namespaces nums absNums
502 return $ Numbering namespaces nums absNums
@@ -584,13 +573,13 @@ elemToParIndentation :: NameSpaces -> Element -> Maybe ParIndentation
584elemToParIndentation ns element | isElem ns "w" "ind" element =
573elemToParIndentation ns element | isElem ns "w" "ind" element =
585 Just $ ParIndentation {
574 Just $ ParIndentation {
586 leftParIndent =
575 leftParIndent =
587− findAttr (QName "left" (lookup "w" ns) (Just "w")) element >>=
576+ findAttr (elemName ns "w" "left") element >>=
588 stringToInteger
577 stringToInteger
589 , rightParIndent =
578 , rightParIndent =
590− findAttr (QName "right" (lookup "w" ns) (Just "w")) element >>=
579+ findAttr (elemName ns "w" "right") element >>=
591 stringToInteger
580 stringToInteger
592 , hangingParIndent =
581 , hangingParIndent =
593− findAttr (QName "hanging" (lookup "w" ns) (Just "w")) element >>=
582+ findAttr (elemName ns "w" "hanging") element >>=
594 stringToInteger}
583 stringToInteger}
595elemToParIndentation _ _ = Nothing
584elemToParIndentation _ _ = Nothing
596
585
@@ -677,7 +666,7 @@ elemToParPart ns element
677 , Just drawingElem <- findChild (elemName ns "w" "drawing") element =
666 , Just drawingElem <- findChild (elemName ns "w" "drawing") element =
678 let a_ns = "http://schemas.openxmlformats.org/drawingml/2006/main"
667 let a_ns = "http://schemas.openxmlformats.org/drawingml/2006/main"
679 drawing = findElement (QName "blip" (Just a_ns) (Just "a")) element
668 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")
681 in
670 in
682 case drawing of
671 case drawing of
683 Just s -> expandDrawingId s >>= (\(fp, bs) -> return $ Drawing fp bs $ elemToExtent drawingElem)
672 Just s -> expandDrawingId s >>= (\(fp, bs) -> return $ Drawing fp bs $ elemToExtent drawingElem)