diff options
-rw-r--r-- | src/Text/Pandoc/Writers/HTML.hs | 37 | ||||
-rw-r--r-- | tests/writer.html | 14 | ||||
-rw-r--r-- | tests/writer.smart.html | 14 |
3 files changed, 51 insertions, 14 deletions
diff --git a/src/Text/Pandoc/Writers/HTML.hs b/src/Text/Pandoc/Writers/HTML.hs index 1b5201191..9ff2f5667 100644 --- a/src/Text/Pandoc/Writers/HTML.hs +++ b/src/Text/Pandoc/Writers/HTML.hs @@ -15,9 +15,9 @@ module Text.Pandoc.Writers.HTML ( import Text.Pandoc.Definition import Text.Pandoc.Shared import Text.Html ( stringToHtmlString ) -import Text.Regex ( mkRegex ) +import Text.Regex ( mkRegex, matchRegex ) import Numeric ( showHex ) -import Char ( ord ) +import Data.Char ( ord, toLower ) import Data.List ( isPrefixOf, partition ) -- | Convert Pandoc document to string in HTML format. @@ -59,14 +59,27 @@ footnoteSection options notes = -- | Obfuscate a "mailto:" link using Javascript. obfuscateLink :: WriterOptions -> [Inline] -> String -> String obfuscateLink options text src = - let text' = inlineListToHtml options text in - let linkText = if src == ("mailto:" ++ text') - then "e" - else "'" ++ text' ++ "'" - altText = if src == ("mailto:" ++ text') - then "\\1 [at] \\2" - else text' ++ " (\\1 [at] \\2)" in - gsub "mailto:([^@]*)@(.*)" ("<script type=\"text/javascript\">h='\\2';n='\\1';e=n+'@'+h;document.write('<a href=\"mailto:'+e+'\">'+" ++ linkText ++ "+'<\\/a>');</script><noscript>" ++ altText ++ "</noscript>") src + let emailRegex = mkRegex "mailto:*([^@]*)@(.*)" + text' = inlineListToHtml options text + src' = map toLower src in + case (matchRegex emailRegex src') of + (Just [name, domain]) -> + let domain' = gsub "\\." " dot " domain + at' = obfuscateChar '@' in + let linkText = if src' == ("mailto:" ++ text') + then "e" + else "'" ++ text' ++ "'" + altText = if src' == ("mailto:" ++ text') + then name ++ " at " ++ domain' + else text' ++ " (" ++ name ++ " at " ++ + domain' ++ ")" in + "<script type=\"text/javascript\">\n<!--\nh='" ++ + obfuscateString domain ++ "';a='" ++ at' ++ "';n='" ++ + obfuscateString name ++ "';e=n+a+h;\n" ++ + "document.write('<a h'+'ref'+'=\"ma'+'ilto'+':'+e+'\">'+" ++ + linkText ++ "+'<\\/'+'a'+'>');\n// -->\n</script><noscript>" ++ + obfuscateString altText ++ "</noscript>" + _ -> "<a href=\"" ++ src ++ "\">" ++ text' ++ "</a>" -- malformed email -- | Obfuscate character as entity. obfuscateChar :: Char -> String @@ -75,6 +88,10 @@ obfuscateChar char = let numstr = if even num then (show num) else ("x" ++ (showHex num "")) in "&#" ++ numstr ++ ";" +-- | Obfuscate string using entities. +obfuscateString :: String -> String +obfuscateString = concatMap obfuscateChar + -- | Escape string, preserving character entities and quote. stringToHtml :: String -> String stringToHtml str = escapePreservingRegex stringToHtmlString diff --git a/tests/writer.html b/tests/writer.html index 0661fb732..2d067c8d5 100644 --- a/tests/writer.html +++ b/tests/writer.html @@ -415,7 +415,12 @@ Cat & 1 \\ \hline <p><a href="/url/" title="title preceded by a tab">URL and title</a>.</p> <p><a href="/url/" title="title with "quotes" in it">URL and title</a></p> <p><a href="/url/" title="title with single quotes">URL and title</a></p> -<p><script type="text/javascript">h='nowhere.net';n='nobody';e=n+'@'+h;document.write('<a href="mailto:'+e+'">'+'Email link'+'<\/a>');</script><noscript>Email link (nobody [at] nowhere.net)</noscript></p> +<p><script type="text/javascript"> +<!-- +h='nowhere.net';a='@';n='nobody';e=n+a+h; +document.write('<a h'+'ref'+'="ma'+'ilto'+':'+e+'">'+'Email link'+'<\/'+'a'+'>'); +// --> +</script><noscript>Email link (nobody at nowhere dot net)</noscript></p> <p><a href="">Empty</a>.</p> <a id="Reference"></a> <h2>Reference</h2> @@ -446,7 +451,12 @@ Cat & 1 \\ \hline <li><a href="http://example.com/">http://example.com/</a></li> <li>It should.</li> </ul> -<p>An e-mail address: <script type="text/javascript">h='nowhere.net';n='nobody';e=n+'@'+h;document.write('<a href="mailto:'+e+'">'+e+'<\/a>');</script><noscript>nobody [at] nowhere.net</noscript></p> +<p>An e-mail address: <script type="text/javascript"> +<!-- +h='nowhere.net';a='@';n='nobody';e=n+a+h; +document.write('<a h'+'ref'+'="ma'+'ilto'+':'+e+'">'+e+'<\/'+'a'+'>'); +// --> +</script><noscript>nobody at nowhere dot net</noscript></p> <blockquote> <p>Blockquoted: <a href="http://example.com/">http://example.com/</a></p> </blockquote> diff --git a/tests/writer.smart.html b/tests/writer.smart.html index d5fb3da93..0ea82cfdd 100644 --- a/tests/writer.smart.html +++ b/tests/writer.smart.html @@ -415,7 +415,12 @@ Cat & 1 \\ \hline <p><a href="/url/" title="title preceded by a tab">URL and title</a>.</p> <p><a href="/url/" title="title with "quotes" in it">URL and title</a></p> <p><a href="/url/" title="title with single quotes">URL and title</a></p> -<p><script type="text/javascript">h='nowhere.net';n='nobody';e=n+'@'+h;document.write('<a href="mailto:'+e+'">'+'Email link'+'<\/a>');</script><noscript>Email link (nobody [at] nowhere.net)</noscript></p> +<p><script type="text/javascript"> +<!-- +h='nowhere.net';a='@';n='nobody';e=n+a+h; +document.write('<a h'+'ref'+'="ma'+'ilto'+':'+e+'">'+'Email link'+'<\/'+'a'+'>'); +// --> +</script><noscript>Email link (nobody at nowhere dot net)</noscript></p> <p><a href="">Empty</a>.</p> <a id="Reference"></a> <h2>Reference</h2> @@ -446,7 +451,12 @@ Cat & 1 \\ \hline <li><a href="http://example.com/">http://example.com/</a></li> <li>It should.</li> </ul> -<p>An e-mail address: <script type="text/javascript">h='nowhere.net';n='nobody';e=n+'@'+h;document.write('<a href="mailto:'+e+'">'+e+'<\/a>');</script><noscript>nobody [at] nowhere.net</noscript></p> +<p>An e-mail address: <script type="text/javascript"> +<!-- +h='nowhere.net';a='@';n='nobody';e=n+a+h; +document.write('<a h'+'ref'+'="ma'+'ilto'+':'+e+'">'+e+'<\/'+'a'+'>'); +// --> +</script><noscript>nobody at nowhere dot net</noscript></p> <blockquote> <p>Blockquoted: <a href="http://example.com/">http://example.com/</a></p> </blockquote> |