git.iko.soy/typeable/pandoc
on master help sign in
EPUB writer: correctly resolve relative URIs. (Closes #1671.)
commitf8087b6c43d1047cc2d77f33d28ec697ef572804 authorJohn MacFarlane <jgm@berkeley.edu> dateWed 8 Oct 2014, 15:19 (12 years ago) parenta4d28cd
1 file changed+14−11
src/Text/Pandoc/Writers/EPUB.hs+14−11
src/Text/Pandoc/Writers/EPUB.hs+14−11
@@ -35,7 +35,7 @@ import Data.Maybe ( fromMaybe )
3535import Data.List ( isPrefixOf, isInfixOf, intercalate )
3636import System.Environment ( getEnv )
3737import Text.Printf (printf)
38−import System.FilePath ( (</>), takeExtension, takeFileName )
38+import System.FilePath ( takeExtension, takeFileName )
3939import qualified Data.ByteString.Lazy as B
4040import qualified Data.ByteString.Lazy.Char8 as B8
4141import qualified Text.Pandoc.UTF8 as UTF8
@@ -64,7 +64,8 @@ import Text.XML.Light ( unode, Element(..), unqual, Attr(..), add_attrs
6464import Text.Pandoc.UUID (getRandomUUID)
6565import Text.Pandoc.Writers.HTML (writeHtmlString, writeHtml)
6666import Data.Char ( toLower, isDigit, isAlphaNum )
67−import Network.URI ( unEscapeString, isURI )
67+import Network.URI ( unEscapeString, nonStrictRelativeTo,
68+ escapeURIString, isAllowedInURI, parseURIReference )
6869import Text.Pandoc.MIME (MimeType, getMimeType)
6970import qualified Control.Exception as E
7071import Text.Blaze.Html.Renderer.Utf8 (renderHtml)
@@ -773,12 +774,8 @@ transformTag opts mediaRef tag@(TagOpen name attr)
773774 | name `elem` ["video", "source", "img", "audio"] = do
774775 let src = fromAttrib "src" tag
775776 let poster = fromAttrib "poster" tag
776− let oldsrc = case writerSourceURL opts of
777− Just u | not (isURI src) -> u </> src
778− _ -> src
779− let oldposter = case writerSourceURL opts of
780− Just u | not (isURI src) -> u </> poster
781− _ -> poster
777+ let oldsrc = src `relativeTo` writerSourceURL opts
778+ let oldposter = poster `relativeTo` writerSourceURL opts
782779 newsrc <- modifyMediaRef mediaRef oldsrc
783780 newposter <- modifyMediaRef mediaRef oldposter
784781 let attr' = filter (\(x,_) -> x /= "src" && x /= "poster") attr ++
@@ -815,9 +812,7 @@ transformInline :: WriterOptions
815812 -> Inline
816813 -> IO Inline
817814transformInline opts mediaRef (Image lab (src,tit)) = do
818− let oldsrc = case (unEscapeString src, writerSourceURL opts) of
819− (s, Just u) | not (isURI src) -> u </> s
820− (s, _) -> s
815+ let oldsrc = src `relativeTo` writerSourceURL opts
821816 newsrc <- modifyMediaRef mediaRef oldsrc
822817 return $ Image lab (newsrc, tit)
823818transformInline opts _ (x@(Math _ _))
@@ -1209,3 +1204,11 @@ docTitle' meta = fromMaybe [] $ go <$> lookupMeta "title" meta
12091204 _ -> []
12101205 go (MetaList xs) = concatMap go xs
12111206 go _ = []
1207+
1208+relativeTo :: String -> Maybe String -> String
1209+relativeTo src mbbase =
1210+ case (parseURIReference (ensureEscaped src),
1211+ mbbase >>= parseURIReference . ensureEscaped) of
1212+ (Just src', Just base') -> show (src' `nonStrictRelativeTo` base')
1213+ _ -> unEscapeString src
1214+ where ensureEscaped = escapeURIString isAllowedInURI