git.iko.soy/typeable/pandoc
on master help sign in
Implemented `\graphicspath` in LaTeX reader.

Closes #736.

commit0448b7d1fc8bb12d1288287ea01bb2ef091ea7d5 authorJohn MacFarlane <jgm@berkeley.edu> dateFri 24 Feb 2017, 15:34 (10 years ago) parentb867451
2 files changed+86−69
src/Text/Pandoc/Readers/LaTeX.hs+8−1 src/Text/Pandoc/Writers/Docx.hs+78−68
src/Text/Pandoc/Readers/LaTeX.hs+8−1
@@ -53,7 +53,7 @@ import Text.Pandoc.Highlighting (fromListingsLanguage, languagesByExtension)
5353import Text.Pandoc.ImageSize (numUnit, showFl)
5454import Control.Monad.Except (throwError)
5555import Text.Pandoc.Class (PandocMonad, PandocPure, lookupEnv, report,
56− readFileFromDirs)
56+ readFileFromDirs, setResourcePath)
5757
5858-- | Parse LaTeX from string and return 'Pandoc' document.
5959readLaTeX :: PandocMonad m
@@ -372,6 +372,7 @@ blockCommands = M.fromList $
372372 addMeta "bibliography" . splitBibs))
373373 -- includes
374374 , ("lstinputlisting", inputListing)
375+ , ("graphicspath", graphicsPath)
375376 ] ++ map ignoreBlocks
376377 -- these commands will be ignored unless --parse-raw is specified,
377378 -- in which case they will appear as raw latex blocks
@@ -390,6 +391,12 @@ blockCommands = M.fromList $
390391 , "newpage"
391392 ]
392393
394+graphicsPath :: PandocMonad m => LP m Blocks
395+graphicsPath = do
396+ ps <- bgroup *> (manyTill braced egroup)
397+ setResourcePath (".":ps)
398+ return mempty
399+
393400addMeta :: PandocMonad m => ToMetaValue a => String -> a -> LP m ()
394401addMeta field val = updateState $ \st ->
395402 st{ stateMeta = addMetaField field val $ stateMeta st }
src/Text/Pandoc/Writers/Docx.hs+78−68
@@ -48,14 +48,13 @@ import Text.Pandoc.Options
4848import Text.Pandoc.Writers.Math
4949import Text.Pandoc.Highlighting ( highlight )
5050import Text.Pandoc.Walk
51−import Text.Pandoc.Error (PandocError)
5251import Text.XML.Light as XML
5352import Text.TeXMath
5453import Text.Pandoc.Readers.Docx.StyleMap
5554import Control.Monad.Reader
5655import Control.Monad.State
5756import Skylighting
58−import Control.Monad.Except (runExceptT)
57+import Control.Monad.Except (catchError)
5958import System.Random (randomR)
6059import Text.Printf (printf)
6160import Data.Monoid ((<>))
@@ -68,6 +67,7 @@ import Data.Char (ord, isSpace, toLower)
6867import Text.Pandoc.Class (PandocMonad, report)
6968import qualified Text.Pandoc.Class as P
7069import Text.Pandoc.Logging
70+import Text.Pandoc.Error
7171
7272data ListMarker = NoMarker
7373 | BulletMarker
@@ -1175,72 +1175,82 @@ inlineToOpenXML' opts (Image attr alt (src, title)) = do
11751175 case M.lookup src imgs of
11761176 Just (_,_,_,elt,_) -> return [elt]
11771177 Nothing -> do
1178− res <- runExceptT $ lift (P.fetchItem (writerSourceURL opts) src)
1179− case res of
1180− Left (_ :: PandocError) -> do
1181− report $ CouldNotFetchResource src ""
1182− -- emit alt text
1183− inlinesToOpenXML opts alt
1184− Right (img, mt) -> do
1185− ident <- ("rId"++) `fmap` ((lift . lift) getUniqueId)
1186− let (xpt,ypt) = desiredSizeInPoints opts attr
1187− (either (const def) id (imageSize opts img))
1188− -- 12700 emu = 1 pt
1189− let (xemu,yemu) = fitToPage (xpt * 12700, ypt * 12700) (pageWidth * 12700)
1190− let cNvPicPr = mknode "pic:cNvPicPr" [] $
1191− mknode "a:picLocks" [("noChangeArrowheads","1"),("noChangeAspect","1")] ()
1192− let nvPicPr = mknode "pic:nvPicPr" []
1193− [ mknode "pic:cNvPr"
1194− [("descr",src),("id","0"),("name","Picture")] ()
1195− , cNvPicPr ]
1196− let blipFill = mknode "pic:blipFill" []
1197− [ mknode "a:blip" [("r:embed",ident)] ()
1198− , mknode "a:stretch" [] $ mknode "a:fillRect" [] () ]
1199− let xfrm = mknode "a:xfrm" []
1200− [ mknode "a:off" [("x","0"),("y","0")] ()
1201− , mknode "a:ext" [("cx",show xemu),("cy",show yemu)] () ]
1202− let prstGeom = mknode "a:prstGeom" [("prst","rect")] $
1203− mknode "a:avLst" [] ()
1204− let ln = mknode "a:ln" [("w","9525")]
1205− [ mknode "a:noFill" [] ()
1206− , mknode "a:headEnd" [] ()
1207− , mknode "a:tailEnd" [] () ]
1208− let spPr = mknode "pic:spPr" [("bwMode","auto")]
1209− [xfrm, prstGeom, mknode "a:noFill" [] (), ln]
1210− let graphic = mknode "a:graphic" [] $
1211− mknode "a:graphicData" [("uri","http://schemas.openxmlformats.org/drawingml/2006/picture")]
1212− [ mknode "pic:pic" []
1213− [ nvPicPr
1214− , blipFill
1215− , spPr ] ]
1216− let imgElt = mknode "w:r" [] $
1217− mknode "w:drawing" [] $
1218− mknode "wp:inline" []
1219− [ mknode "wp:extent" [("cx",show xemu),("cy",show yemu)] ()
1220− , mknode "wp:effectExtent" [("b","0"),("l","0"),("r","0"),("t","0")] ()
1221− , mknode "wp:docPr" [("descr",stringify alt), ("title", title), ("id","1"),("name","Picture")] ()
1222− , graphic ]
1223− let imgext = case mt >>= extensionFromMimeType of
1224− Just x -> '.':x
1225− Nothing -> case imageType img of
1226− Just Png -> ".png"
1227− Just Jpeg -> ".jpeg"
1228− Just Gif -> ".gif"
1229− Just Pdf -> ".pdf"
1230− Just Eps -> ".eps"
1231− Just Svg -> ".svg"
1232− Nothing -> ""
1233− if null imgext
1234− then -- without an extension there is no rule for content type
1235− inlinesToOpenXML opts alt -- return alt to avoid corrupted docx
1236− else do
1237− let imgpath = "media/" ++ ident ++ imgext
1238− let mbMimeType = mt <|> getMimeType imgpath
1239− -- insert mime type to use in constructing [Content_Types].xml
1240− modify $ \st -> st{ stImages =
1241− M.insert src (ident, imgpath, mbMimeType, imgElt, img)
1242− $ stImages st }
1243− return [imgElt]
1178+ catchError
1179+ (do (img, mt) <- P.fetchItem (writerSourceURL opts) src
1180+ ident <- ("rId"++) `fmap` ((lift . lift) getUniqueId)
1181+ let (xpt,ypt) = desiredSizeInPoints opts attr
1182+ (either (const def) id (imageSize opts img))
1183+ -- 12700 emu = 1 pt
1184+ let (xemu,yemu) = fitToPage (xpt * 12700, ypt * 12700)
1185+ (pageWidth * 12700)
1186+ let cNvPicPr = mknode "pic:cNvPicPr" [] $
1187+ mknode "a:picLocks" [("noChangeArrowheads","1")
1188+ ,("noChangeAspect","1")] ()
1189+ let nvPicPr = mknode "pic:nvPicPr" []
1190+ [ mknode "pic:cNvPr"
1191+ [("descr",src),("id","0"),("name","Picture")] ()
1192+ , cNvPicPr ]
1193+ let blipFill = mknode "pic:blipFill" []
1194+ [ mknode "a:blip" [("r:embed",ident)] ()
1195+ , mknode "a:stretch" [] $
1196+ mknode "a:fillRect" [] () ]
1197+ let xfrm = mknode "a:xfrm" []
1198+ [ mknode "a:off" [("x","0"),("y","0")] ()
1199+ , mknode "a:ext" [("cx",show xemu)
1200+ ,("cy",show yemu)] () ]
1201+ let prstGeom = mknode "a:prstGeom" [("prst","rect")] $
1202+ mknode "a:avLst" [] ()
1203+ let ln = mknode "a:ln" [("w","9525")]
1204+ [ mknode "a:noFill" [] ()
1205+ , mknode "a:headEnd" [] ()
1206+ , mknode "a:tailEnd" [] () ]
1207+ let spPr = mknode "pic:spPr" [("bwMode","auto")]
1208+ [xfrm, prstGeom, mknode "a:noFill" [] (), ln]
1209+ let graphic = mknode "a:graphic" [] $
1210+ mknode "a:graphicData"
1211+ [("uri","http://schemas.openxmlformats.org/drawingml/2006/picture")]
1212+ [ mknode "pic:pic" []
1213+ [ nvPicPr
1214+ , blipFill
1215+ , spPr ] ]
1216+ let imgElt = mknode "w:r" [] $
1217+ mknode "w:drawing" [] $
1218+ mknode "wp:inline" []
1219+ [ mknode "wp:extent" [("cx",show xemu),("cy",show yemu)] ()
1220+ , mknode "wp:effectExtent"
1221+ [("b","0"),("l","0"),("r","0"),("t","0")] ()
1222+ , mknode "wp:docPr" [("descr",stringify alt)
1223+ ,("title", title)
1224+ ,("id","1")
1225+ ,("name","Picture")] ()
1226+ , graphic ]
1227+ let imgext = case mt >>= extensionFromMimeType of
1228+ Just x -> '.':x
1229+ Nothing -> case imageType img of
1230+ Just Png -> ".png"
1231+ Just Jpeg -> ".jpeg"
1232+ Just Gif -> ".gif"
1233+ Just Pdf -> ".pdf"
1234+ Just Eps -> ".eps"
1235+ Just Svg -> ".svg"
1236+ Nothing -> ""
1237+ if null imgext
1238+ then -- without an extension there is no rule for content type
1239+ inlinesToOpenXML opts alt -- return alt to avoid corrupted docx
1240+ else do
1241+ let imgpath = "media/" ++ ident ++ imgext
1242+ let mbMimeType = mt <|> getMimeType imgpath
1243+ -- insert mime type to use in constructing [Content_Types].xml
1244+ modify $ \st -> st{ stImages =
1245+ M.insert src (ident, imgpath, mbMimeType, imgElt, img)
1246+ $ stImages st }
1247+ return [imgElt])
1248+ (\e -> do case e of
1249+ PandocIOError _ e' ->
1250+ report $ CouldNotFetchResource src (show e')
1251+ e' -> report $ CouldNotFetchResource src (show e')
1252+ -- emit alt text
1253+ inlinesToOpenXML opts alt)
12441254
12451255br :: Element
12461256br = breakElement "textWrapping"