mirror of
https://github.com/jgm/pandoc.git
synced 2026-09-26 09:25:48 +00:00
Docx reader: Handle inline drawings.
Previous drawings that were under some other toplevel run (i.e., a hyperlink) wouldn't be properly handled. This should fix that.
This commit is contained in:
@@ -321,6 +321,13 @@ runToInlines (Footnote bps) =
|
||||
concatMapM bodyPartToBlocks bps >>= (\blks -> return [Note blks])
|
||||
runToInlines (Endnote bps) =
|
||||
concatMapM bodyPartToBlocks bps >>= (\blks -> return [Note blks])
|
||||
runToInlines (InlineDrawing fp bs) = do
|
||||
mediaBag <- gets docxMediaBag
|
||||
modify $ \s -> s { docxMediaBag = insertMedia fp Nothing bs mediaBag }
|
||||
return [Image [] (fp, "")]
|
||||
|
||||
|
||||
|
||||
|
||||
parPartToInlines :: ParPart -> DocxContext [Inline]
|
||||
parPartToInlines (PlainRun r) = runToInlines r
|
||||
|
||||
@@ -282,6 +282,7 @@ defaultGroupStyle = GroupStyle {groupChr = Nothing, groupPos = Nothing}
|
||||
data Run = Run RunStyle [RunElem]
|
||||
| Footnote [BodyPart]
|
||||
| Endnote [BodyPart]
|
||||
| InlineDrawing FilePath B.ByteString
|
||||
deriving Show
|
||||
|
||||
data RunElem = TextRun String | LnBrk | Tab
|
||||
@@ -874,14 +875,14 @@ lookupRelationship :: RelId -> [Relationship] -> Maybe Target
|
||||
lookupRelationship relid rels =
|
||||
lookup relid (map (\(Relationship pair) -> pair) rels)
|
||||
|
||||
expandDrawingId :: String -> D ParPart
|
||||
expandDrawingId :: String -> D (FilePath, B.ByteString)
|
||||
expandDrawingId s = do
|
||||
target <- asks (lookupRelationship s . envRelationships)
|
||||
case target of
|
||||
Just filepath -> do
|
||||
bytes <- asks (lookup (combine "word" filepath) . envMedia)
|
||||
case bytes of
|
||||
Just bs -> return $ Drawing filepath bs
|
||||
Just bs -> return (filepath, bs)
|
||||
Nothing -> throwError DocxError
|
||||
Nothing -> throwError DocxError
|
||||
|
||||
@@ -894,7 +895,7 @@ elemToParPart ns element
|
||||
>>= findAttr (QName "embed" (lookup "r" ns) (Just "r"))
|
||||
in
|
||||
case drawing of
|
||||
Just s -> expandDrawingId s
|
||||
Just s -> expandDrawingId s >>= (\(fp, bs) -> return $ Drawing fp bs)
|
||||
Nothing -> throwError WrongElem
|
||||
elemToParPart ns element
|
||||
| isElem ns "w" "r" element =
|
||||
@@ -943,6 +944,17 @@ lookupEndnote :: String -> Notes -> Maybe Element
|
||||
lookupEndnote s (Notes _ _ ens) = ens >>= (M.lookup s)
|
||||
|
||||
elemToRun :: NameSpaces -> Element -> D Run
|
||||
elemToRun ns element
|
||||
| isElem ns "w" "r" element
|
||||
, Just drawingElem <- findChild (elemName ns "w" "drawing") element =
|
||||
let a_ns = "http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||
drawing = findElement (QName "blip" (Just a_ns) (Just "a")) drawingElem
|
||||
>>= findAttr (QName "embed" (lookup "r" ns) (Just "r"))
|
||||
in
|
||||
case drawing of
|
||||
Just s -> expandDrawingId s >>=
|
||||
(\(fp, bs) -> return $ InlineDrawing fp bs)
|
||||
Nothing -> throwError WrongElem
|
||||
elemToRun ns element
|
||||
| isElem ns "w" "r" element
|
||||
, Just ref <- findChild (elemName ns "w" "footnoteReference") element
|
||||
|
||||
Reference in New Issue
Block a user