From 1ebb766aff22590874b9660322f1788c3698649a Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Tue, 4 Apr 2017 16:13:24 +0200 Subject: Ms writer: ensure that @ is escaped in URIs. Otherwise we may get unescaped @s that give eqn fits, with @ as the delimiter character. --- src/Text/Pandoc/Writers/Ms.hs | 6 +++++- test/writer.ms | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Text/Pandoc/Writers/Ms.hs b/src/Text/Pandoc/Writers/Ms.hs index 00be502b3..aadbd208e 100644 --- a/src/Text/Pandoc/Writers/Ms.hs +++ b/src/Text/Pandoc/Writers/Ms.hs @@ -57,6 +57,7 @@ import Text.TeXMath (writeEqn) import System.FilePath (takeExtension) import Skylighting import Text.Pandoc.Highlighting +import Network.URI (escapeURIString, isAllowedInURI) data WriterState = WriterState { stHasInlineMath :: Bool , stFirstPara :: Bool @@ -157,6 +158,9 @@ escapeBar = concatMap go escapeString :: String -> String escapeString = concatMap escapeChar +escapeUri :: String -> String +escapeUri = escapeURIString (\c -> c /= '@' && isAllowedInURI c) + toSmallCaps :: String -> String toSmallCaps [] = [] toSmallCaps (c:cs) @@ -509,7 +513,7 @@ inlineToMs opts (Link _ txt (src, _)) = do -- external link contents <- inlineListToMs' opts $ map breakToSpace txt return $ text "\\c" <> cr <> nowrap (text ".pdfhref W -D " <> - doubleQuotes (text src) <> text " -A " <> + doubleQuotes (text (escapeUri src)) <> text " -A " <> doubleQuotes (text "\\c") <> space <> text "\\") <> cr <> text " -- " <> doubleQuotes (nowrap contents) <> cr <> text "\\&" inlineToMs opts (Image attr alternate (source, tit)) = do diff --git a/test/writer.ms b/test/writer.ms index a767416d5..759bdba15 100644 --- a/test/writer.ms +++ b/test/writer.ms @@ -829,7 +829,7 @@ Just a \c \& .PP \c -.pdfhref W -D "mailto:nobody@nowhere.net" -A "\c" \ +.pdfhref W -D "mailto:nobody%40nowhere.net" -A "\c" \ -- "Email link" \& .PP @@ -943,7 +943,7 @@ In a list? It should. .LP An e\-mail address: \c -.pdfhref W -D "mailto:nobody@nowhere.net" -A "\c" \ +.pdfhref W -D "mailto:nobody%40nowhere.net" -A "\c" \ -- "nobody\@nowhere.net" \& .RS -- cgit v1.2.3