@@ -29,7 +29,7 @@ import qualified Data.Set as Set
2929import Data.Text (Text)
3030import qualified Data.Text as T
3131import qualified Data.ByteString.Lazy as BL
32−import System.FilePath (addExtension, takeExtension)
32+import System.FilePath (addExtension, takeExtension, isAbsolute, takeDirectory)
3333import Text.HTML.TagSoup hiding (Row)
3434import Text.Pandoc.Builder (Blocks, Inlines)
3535import qualified Text.Pandoc.Builder as B
@@ -1836,9 +1836,12 @@ regLink :: PandocMonad m
18361836 -> MarkdownParser m (F Inlines)
18371837regLink constructor lab = try $ do
18381838 (src, tit) <- source
1839+ rebase <- option False (True <$ guardEnabled Ext_rebase_relative_paths)
1840+ pos <- getPosition
1841+ let src' = if rebase then rebasePath pos src else src
18391842 attr <- option nullAttr $
18401843 guardEnabled Ext_link_attributes >> attributes
1841− return $ constructor attr src tit <$> lab
1844+ return $ constructor attr src' tit <$> lab
18421845
18431846-- a link like [this][ref] or [this][] or [this]
18441847referenceLink :: PandocMonad m
@@ -1854,6 +1857,8 @@ referenceLink constructor (lab, raw) = do
18541857 return (mempty, "")))
18551858 <|>
18561859 try ((guardDisabled Ext_spaced_reference_links <|> spnl) >> reference)
1860+ rebase <- option False (True <$ guardEnabled Ext_rebase_relative_paths)
1861+ pos <- getPosition
18571862 when (raw' == "") $ guardEnabled Ext_shortcut_reference_links
18581863 let labIsRef = raw' == "" || raw' == "[]"
18591864 let key = toKey $ if labIsRef then raw else raw'
@@ -1878,7 +1883,9 @@ referenceLink constructor (lab, raw) = do
18781883 Just ((src, tit), _) -> constructor nullAttr src tit <$> lab
18791884 Nothing -> makeFallback
18801885 else makeFallback
1881− Just ((src,tit), attr) -> constructor attr src tit <$> lab
1886+ Just ((src,tit), attr) ->
1887+ let src' = if rebase then rebasePath pos src else src
1888+ in constructor attr src' tit <$> lab
18821889
18831890dropBrackets :: Text -> Text
18841891dropBrackets = dropRB . dropLB
@@ -1911,15 +1918,30 @@ autoLink = try $ do
19111918 return $ return $ B.linkWith attr (src <> escapeURI extra) ""
19121919 (B.str $ orig <> extra)
19131920
1921+-- | Rebase a relative path, by adding the (relative) directory
1922+-- of the containing source position. Absolute links and URLs
1923+-- are untouched.
1924+rebasePath :: SourcePos -> Text -> Text
1925+rebasePath pos path = do
1926+ let fp = sourceName pos
1927+ in if isAbsolute (T.unpack path) || isURI path
1928+ then path
1929+ else
1930+ case takeDirectory fp of
1931+ "" -> path
1932+ "." -> path
1933+ d -> T.pack d <> "/" <> path
1934+
19141935image :: PandocMonad m => MarkdownParser m (F Inlines)
19151936image = try $ do
19161937 char '!'
19171938 (lab,raw) <- reference
19181939 defaultExt <- getOption readerDefaultImageExtension
1919− let constructor attr' src = case takeExtension (T.unpack src) of
1920− "" -> B.imageWith attr' (T.pack $ addExtension (T.unpack src)
1921− $ T.unpack defaultExt)
1922− _ -> B.imageWith attr' src
1940+ let constructor attr' src =
1941+ case takeExtension (T.unpack src) of
1942+ "" -> B.imageWith attr' (T.pack $ addExtension (T.unpack src)
1943+ $ T.unpack defaultExt)
1944+ _ -> B.imageWith attr' src
19231945 regLink constructor lab <|> referenceLink constructor (lab,raw)
19241946
19251947note :: PandocMonad m => MarkdownParser m (F Inlines)