@@ -35,6 +35,7 @@ module Text.Pandoc.Readers.Docx.Parse ( Docx(..)
3535 , Body(..)
3636 , BodyPart(..)
3737 , TblLook(..)
38+ , Extent
3839 , ParPart(..)
3940 , Run(..)
4041 , RunElem(..)
@@ -62,6 +63,7 @@ import Control.Monad.Reader
6263import Control.Applicative ((<|>))
6364import qualified Data.Map as M
6465import Text.Pandoc.Compat.Except
66+import Text.Pandoc.Shared (safeRead)
6567import Text.TeXMath.Readers.OMML (readOMML)
6668import Text.Pandoc.Readers.Docx.Fonts (getUnicode, Font(..))
6769import Text.TeXMath (Exp)
@@ -196,20 +198,23 @@ data Row = Row [Cell]
196198data Cell = Cell [BodyPart]
197199 deriving Show
198200
201+-- (width, height) in EMUs
202+type Extent = Maybe (Double, Double)
203+
199204data ParPart = PlainRun Run
200205 | Insertion ChangeId Author ChangeDate [Run]
201206 | Deletion ChangeId Author ChangeDate [Run]
202207 | BookMark BookMarkId Anchor
203208 | InternalHyperLink Anchor [Run]
204209 | ExternalHyperLink URL [Run]
205− | Drawing FilePath B.ByteString
210+ | Drawing FilePath B.ByteString Extent
206211 | PlainOMath [Exp]
207212 deriving Show
208213
209214data Run = Run RunStyle [RunElem]
210215 | Footnote [BodyPart]
211216 | Endnote [BodyPart]
212− | InlineDrawing FilePath B.ByteString
217+ | InlineDrawing FilePath B.ByteString Extent
213218 deriving Show
214219
215220data RunElem = TextRun String | LnBrk | Tab | SoftHyphen | NoBreakHyphen
@@ -619,13 +624,13 @@ expandDrawingId s = do
619624elemToParPart :: NameSpaces -> Element -> D ParPart
620625elemToParPart ns element
621626 | isElem ns "w" "r" element
622− , Just _ <- findChild (elemName ns "w" "drawing") element =
627+ , Just drawingElem <- findChild (elemName ns "w" "drawing") element =
623628 let a_ns = "http://schemas.openxmlformats.org/drawingml/2006/main"
624629 drawing = findElement (QName "blip" (Just a_ns) (Just "a")) element
625630 >>= findAttr (QName "embed" (lookup "r" ns) (Just "r"))
626631 in
627632 case drawing of
628− Just s -> expandDrawingId s >>= (\(fp, bs) -> return $ Drawing fp bs)
633+ Just s -> expandDrawingId s >>= (\(fp, bs) -> return $ Drawing fp bs $ elemToExtent drawingElem)
629634 Nothing -> throwError WrongElem
630635-- The below is an attempt to deal with images in deprecated vml format.
631636elemToParPart ns element
@@ -635,7 +640,7 @@ elemToParPart ns element
635640 >>= findAttr (elemName ns "r" "id")
636641 in
637642 case drawing of
638− Just s -> expandDrawingId s >>= (\(fp, bs) -> return $ Drawing fp bs)
643+ Just s -> expandDrawingId s >>= (\(fp, bs) -> return $ Drawing fp bs Nothing)
639644 Nothing -> throwError WrongElem
640645elemToParPart ns element
641646 | isElem ns "w" "r" element =
@@ -687,6 +692,16 @@ lookupFootnote s (Notes _ fns _) = fns >>= (M.lookup s)
687692lookupEndnote :: String -> Notes -> Maybe Element
688693lookupEndnote s (Notes _ _ ens) = ens >>= (M.lookup s)
689694
695+elemToExtent :: Element -> Extent
696+elemToExtent drawingElem =
697+ case (getDim "cx", getDim "cy") of
698+ (Just w, Just h) -> Just (w, h)
699+ _ -> Nothing
700+ where
701+ wp_ns = "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
702+ getDim at = findElement (QName "extent" (Just wp_ns) (Just "wp")) drawingElem
703+ >>= findAttr (QName at Nothing Nothing) >>= safeRead
704+
690705elemToRun :: NameSpaces -> Element -> D Run
691706elemToRun ns element
692707 | isElem ns "w" "r" element
@@ -697,7 +712,7 @@ elemToRun ns element
697712 in
698713 case drawing of
699714 Just s -> expandDrawingId s >>=
700− (\(fp, bs) -> return $ InlineDrawing fp bs)
715+ (\(fp, bs) -> return $ InlineDrawing fp bs $ elemToExtent drawingElem)
701716 Nothing -> throwError WrongElem
702717elemToRun ns element
703718 | isElem ns "w" "r" element