aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2015-06-09 12:11:22 -0700
committerJohn MacFarlane <jgm@berkeley.edu>2015-06-09 12:11:22 -0700
commitedb0bcc04f330042a7b7f73e2806c534b9869e62 (patch)
tree365bd462e2c392b7874a62d313f9a9738d21d8c0
parent3e533b4f95852f3e81ef437d22236462258eb7b8 (diff)
parentf51757bd16881b6429cccb115f36d595b80826a7 (diff)
downloadpandoc-edb0bcc04f330042a7b7f73e2806c534b9869e62.tar.gz
Merge pull request #2215 from DigitalPublishingToolkit/icml-crashfix
Fix InDesign crash with URLs containing more than one colon character
-rw-r--r--src/Text/Pandoc/Writers/ICML.hs11
-rw-r--r--tests/writer.icml36
2 files changed, 27 insertions, 20 deletions
diff --git a/src/Text/Pandoc/Writers/ICML.hs b/src/Text/Pandoc/Writers/ICML.hs
index f42d26614..08e3e5b63 100644
--- a/src/Text/Pandoc/Writers/ICML.hs
+++ b/src/Text/Pandoc/Writers/ICML.hs
@@ -251,6 +251,13 @@ charStylesToDoc st = vcat $ map makeStyle $ Set.toAscList $ inlineStyles st
else empty
in inTags True "CharacterStyle" ([("Self", "CharacterStyle/"++s), ("Name", s)] ++ attrs') props
+-- | Escape colon characters as %3a
+escapeColons :: String -> String
+escapeColons (x:xs)
+ | x == ':' = "%3a" ++ escapeColons xs
+ | otherwise = x : escapeColons xs
+escapeColons [] = []
+
-- | Convert a list of (identifier, url) pairs to the ICML listing of hyperlinks.
hyperlinksToDoc :: Hyperlink -> Doc
hyperlinksToDoc [] = empty
@@ -259,13 +266,13 @@ hyperlinksToDoc (x:xs) = hyp x $$ hyperlinksToDoc xs
hyp (ident, url) = hdest $$ hlink
where
hdest = selfClosingTag "HyperlinkURLDestination"
- [("Self", "HyperlinkURLDestination/"++url), ("Name","link"), ("DestinationURL",url), ("DestinationUniqueKey","1")]
+ [("Self", "HyperlinkURLDestination/"++(escapeColons url)), ("Name","link"), ("DestinationURL",url), ("DestinationUniqueKey","1")] -- HyperlinkURLDestination with more than one colon crashes CS6
hlink = inTags True "Hyperlink" [("Self","uf-"++show ident), ("Name",url),
("Source","htss-"++show ident), ("Visible","true"), ("DestinationUniqueKey","1")]
$ inTags True "Properties" []
$ inTags False "BorderColor" [("type","enumeration")] (text "Black")
$$ (inTags False "Destination" [("type","object")]
- $ text $ "HyperlinkURLDestination/"++(escapeStringForXML url))
+ $ text $ "HyperlinkURLDestination/"++(escapeColons (escapeStringForXML url))) -- HyperlinkURLDestination with more than one colon crashes CS6
-- | Convert a list of Pandoc blocks to ICML.
diff --git a/tests/writer.icml b/tests/writer.icml
index 26795df58..b6f5b5e32 100644
--- a/tests/writer.icml
+++ b/tests/writer.icml
@@ -2717,39 +2717,39 @@ These should not be escaped: \$ \\ \&gt; \[ \{</Content>
</ParagraphStyleRange>
</Story>
- <HyperlinkURLDestination Self="HyperlinkURLDestination/http://google.com" Name="link" DestinationURL="http://google.com" DestinationUniqueKey="1" />
+ <HyperlinkURLDestination Self="HyperlinkURLDestination/http%3a//google.com" Name="link" DestinationURL="http://google.com" DestinationUniqueKey="1" />
<Hyperlink Self="uf-31" Name="http://google.com" Source="htss-31" Visible="true" DestinationUniqueKey="1">
<Properties>
<BorderColor type="enumeration">Black</BorderColor>
- <Destination type="object">HyperlinkURLDestination/http://google.com</Destination>
+ <Destination type="object">HyperlinkURLDestination/http%3a//google.com</Destination>
</Properties>
</Hyperlink>
- <HyperlinkURLDestination Self="HyperlinkURLDestination/http://example.com/" Name="link" DestinationURL="http://example.com/" DestinationUniqueKey="1" />
+ <HyperlinkURLDestination Self="HyperlinkURLDestination/http%3a//example.com/" Name="link" DestinationURL="http://example.com/" DestinationUniqueKey="1" />
<Hyperlink Self="uf-30" Name="http://example.com/" Source="htss-30" Visible="true" DestinationUniqueKey="1">
<Properties>
<BorderColor type="enumeration">Black</BorderColor>
- <Destination type="object">HyperlinkURLDestination/http://example.com/</Destination>
+ <Destination type="object">HyperlinkURLDestination/http%3a//example.com/</Destination>
</Properties>
</Hyperlink>
- <HyperlinkURLDestination Self="HyperlinkURLDestination/mailto:nobody@nowhere.net" Name="link" DestinationURL="mailto:nobody@nowhere.net" DestinationUniqueKey="1" />
+ <HyperlinkURLDestination Self="HyperlinkURLDestination/mailto%3anobody@nowhere.net" Name="link" DestinationURL="mailto:nobody@nowhere.net" DestinationUniqueKey="1" />
<Hyperlink Self="uf-29" Name="mailto:nobody@nowhere.net" Source="htss-29" Visible="true" DestinationUniqueKey="1">
<Properties>
<BorderColor type="enumeration">Black</BorderColor>
- <Destination type="object">HyperlinkURLDestination/mailto:nobody@nowhere.net</Destination>
+ <Destination type="object">HyperlinkURLDestination/mailto%3anobody@nowhere.net</Destination>
</Properties>
</Hyperlink>
- <HyperlinkURLDestination Self="HyperlinkURLDestination/http://example.com/" Name="link" DestinationURL="http://example.com/" DestinationUniqueKey="1" />
+ <HyperlinkURLDestination Self="HyperlinkURLDestination/http%3a//example.com/" Name="link" DestinationURL="http://example.com/" DestinationUniqueKey="1" />
<Hyperlink Self="uf-28" Name="http://example.com/" Source="htss-28" Visible="true" DestinationUniqueKey="1">
<Properties>
<BorderColor type="enumeration">Black</BorderColor>
- <Destination type="object">HyperlinkURLDestination/http://example.com/</Destination>
+ <Destination type="object">HyperlinkURLDestination/http%3a//example.com/</Destination>
</Properties>
</Hyperlink>
- <HyperlinkURLDestination Self="HyperlinkURLDestination/http://example.com/?foo=1&amp;bar=2" Name="link" DestinationURL="http://example.com/?foo=1&amp;bar=2" DestinationUniqueKey="1" />
+ <HyperlinkURLDestination Self="HyperlinkURLDestination/http%3a//example.com/?foo=1&amp;bar=2" Name="link" DestinationURL="http://example.com/?foo=1&amp;bar=2" DestinationUniqueKey="1" />
<Hyperlink Self="uf-27" Name="http://example.com/?foo=1&amp;bar=2" Source="htss-27" Visible="true" DestinationUniqueKey="1">
<Properties>
<BorderColor type="enumeration">Black</BorderColor>
- <Destination type="object">HyperlinkURLDestination/http://example.com/?foo=1&amp;bar=2</Destination>
+ <Destination type="object">HyperlinkURLDestination/http%3a//example.com/?foo=1&amp;bar=2</Destination>
</Properties>
</Hyperlink>
<HyperlinkURLDestination Self="HyperlinkURLDestination//script?foo=1&amp;bar=2" Name="link" DestinationURL="/script?foo=1&amp;bar=2" DestinationUniqueKey="1" />
@@ -2766,18 +2766,18 @@ These should not be escaped: \$ \\ \&gt; \[ \{</Content>
<Destination type="object">HyperlinkURLDestination//script?foo=1&amp;bar=2</Destination>
</Properties>
</Hyperlink>
- <HyperlinkURLDestination Self="HyperlinkURLDestination/http://att.com/" Name="link" DestinationURL="http://att.com/" DestinationUniqueKey="1" />
+ <HyperlinkURLDestination Self="HyperlinkURLDestination/http%3a//att.com/" Name="link" DestinationURL="http://att.com/" DestinationUniqueKey="1" />
<Hyperlink Self="uf-24" Name="http://att.com/" Source="htss-24" Visible="true" DestinationUniqueKey="1">
<Properties>
<BorderColor type="enumeration">Black</BorderColor>
- <Destination type="object">HyperlinkURLDestination/http://att.com/</Destination>
+ <Destination type="object">HyperlinkURLDestination/http%3a//att.com/</Destination>
</Properties>
</Hyperlink>
- <HyperlinkURLDestination Self="HyperlinkURLDestination/http://example.com/?foo=1&amp;bar=2" Name="link" DestinationURL="http://example.com/?foo=1&amp;bar=2" DestinationUniqueKey="1" />
+ <HyperlinkURLDestination Self="HyperlinkURLDestination/http%3a//example.com/?foo=1&amp;bar=2" Name="link" DestinationURL="http://example.com/?foo=1&amp;bar=2" DestinationUniqueKey="1" />
<Hyperlink Self="uf-23" Name="http://example.com/?foo=1&amp;bar=2" Source="htss-23" Visible="true" DestinationUniqueKey="1">
<Properties>
<BorderColor type="enumeration">Black</BorderColor>
- <Destination type="object">HyperlinkURLDestination/http://example.com/?foo=1&amp;bar=2</Destination>
+ <Destination type="object">HyperlinkURLDestination/http%3a//example.com/?foo=1&amp;bar=2</Destination>
</Properties>
</Hyperlink>
<HyperlinkURLDestination Self="HyperlinkURLDestination//url/" Name="link" DestinationURL="/url/" DestinationUniqueKey="1" />
@@ -2857,11 +2857,11 @@ These should not be escaped: \$ \\ \&gt; \[ \{</Content>
<Destination type="object">HyperlinkURLDestination/</Destination>
</Properties>
</Hyperlink>
- <HyperlinkURLDestination Self="HyperlinkURLDestination/mailto:nobody@nowhere.net" Name="link" DestinationURL="mailto:nobody@nowhere.net" DestinationUniqueKey="1" />
+ <HyperlinkURLDestination Self="HyperlinkURLDestination/mailto%3anobody@nowhere.net" Name="link" DestinationURL="mailto:nobody@nowhere.net" DestinationUniqueKey="1" />
<Hyperlink Self="uf-11" Name="mailto:nobody@nowhere.net" Source="htss-11" Visible="true" DestinationUniqueKey="1">
<Properties>
<BorderColor type="enumeration">Black</BorderColor>
- <Destination type="object">HyperlinkURLDestination/mailto:nobody@nowhere.net</Destination>
+ <Destination type="object">HyperlinkURLDestination/mailto%3anobody@nowhere.net</Destination>
</Properties>
</Hyperlink>
<HyperlinkURLDestination Self="HyperlinkURLDestination//url/with_underscore" Name="link" DestinationURL="/url/with_underscore" DestinationUniqueKey="1" />
@@ -2913,11 +2913,11 @@ These should not be escaped: \$ \\ \&gt; \[ \{</Content>
<Destination type="object">HyperlinkURLDestination//url/</Destination>
</Properties>
</Hyperlink>
- <HyperlinkURLDestination Self="HyperlinkURLDestination/http://example.com/?foo=1&amp;bar=2" Name="link" DestinationURL="http://example.com/?foo=1&amp;bar=2" DestinationUniqueKey="1" />
+ <HyperlinkURLDestination Self="HyperlinkURLDestination/http%3a//example.com/?foo=1&amp;bar=2" Name="link" DestinationURL="http://example.com/?foo=1&amp;bar=2" DestinationUniqueKey="1" />
<Hyperlink Self="uf-3" Name="http://example.com/?foo=1&amp;bar=2" Source="htss-3" Visible="true" DestinationUniqueKey="1">
<Properties>
<BorderColor type="enumeration">Black</BorderColor>
- <Destination type="object">HyperlinkURLDestination/http://example.com/?foo=1&amp;bar=2</Destination>
+ <Destination type="object">HyperlinkURLDestination/http%3a//example.com/?foo=1&amp;bar=2</Destination>
</Properties>
</Hyperlink>
<HyperlinkURLDestination Self="HyperlinkURLDestination//url" Name="link" DestinationURL="/url" DestinationUniqueKey="1" />