Sophie

Sophie

distrib > Fedora > 14 > x86_64 > by-pkgid > c9500ee8aa1bb84cc3f2845c61886015 > files > 24

ghc-xss-sanitize-devel-0.2.6-1.fc14.x86_64.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->
<title>Text/HTML/SanitizeXSS.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>HTML</span><span class='hs-varop'>.</span><span class='hs-conid'>SanitizeXSS</span>
<a name="line-2"></a>    <span class='hs-layout'>(</span> <span class='hs-varid'>sanitize</span>
<a name="line-3"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>sanitizeBalance</span>
<a name="line-4"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>sanitizeXSS</span>
<a name="line-5"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>filterTags</span>
<a name="line-6"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>safeTags</span>
<a name="line-7"></a>    <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-8"></a>
<a name="line-9"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>HTML</span><span class='hs-varop'>.</span><span class='hs-conid'>TagSoup</span>
<a name="line-10"></a>
<a name="line-11"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Set</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set</span><span class='hs-conid'>()</span><span class='hs-layout'>,</span> <span class='hs-varid'>member</span><span class='hs-layout'>,</span> <span class='hs-varid'>notMember</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>\\</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>fromList</span><span class='hs-layout'>)</span>
<a name="line-12"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Char</span> <span class='hs-layout'>(</span> <span class='hs-varid'>toLower</span> <span class='hs-layout'>)</span>
<a name="line-13"></a>
<a name="line-14"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Network</span><span class='hs-varop'>.</span><span class='hs-conid'>URI</span> <span class='hs-layout'>(</span> <span class='hs-varid'>parseURIReference</span><span class='hs-layout'>,</span> <span class='hs-conid'>URI</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-15"></a>                     <span class='hs-varid'>isAllowedInURI</span><span class='hs-layout'>,</span> <span class='hs-varid'>escapeURIString</span><span class='hs-layout'>,</span> <span class='hs-varid'>uriScheme</span> <span class='hs-layout'>)</span>
<a name="line-16"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Codec</span><span class='hs-varop'>.</span><span class='hs-conid'>Binary</span><span class='hs-varop'>.</span><span class='hs-conid'>UTF8</span><span class='hs-varop'>.</span><span class='hs-conid'>String</span> <span class='hs-layout'>(</span> <span class='hs-varid'>encodeString</span> <span class='hs-layout'>)</span>
<a name="line-17"></a>
<a name="line-18"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Map</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>Map</span>
<a name="line-19"></a>
<a name="line-20"></a><span class='hs-comment'>{-
<a name="line-21"></a>import Debug.Trace
<a name="line-22"></a>debug :: (Show a) =&gt; a -&gt; a
<a name="line-23"></a>debug a = trace ("DEBUG: " ++ show a) a
<a name="line-24"></a>  -}</span>
<a name="line-25"></a>
<a name="line-26"></a>
<a name="line-27"></a><a name="sanitize"></a><span class='hs-comment'>-- | santize the html to prevent XSS attacks. See README.md &lt;<a href="http://github.com/gregwebs/haskell-xss-sanitize">http://github.com/gregwebs/haskell-xss-sanitize</a>&gt; for more details</span>
<a name="line-28"></a><span class='hs-definition'>sanitize</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-29"></a><span class='hs-definition'>sanitize</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sanitizeXSS</span>
<a name="line-30"></a>
<a name="line-31"></a><a name="sanitizeXSS"></a><span class='hs-comment'>-- | alias of sanitize function</span>
<a name="line-32"></a><span class='hs-definition'>sanitizeXSS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-33"></a><span class='hs-definition'>sanitizeXSS</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>filterTags</span> <span class='hs-varid'>safeTags</span>
<a name="line-34"></a>
<a name="line-35"></a><a name="sanitizeBalance"></a><span class='hs-comment'>-- | same as sanitize but makes sure there are no lone closing tags. See README.md &lt;<a href="http://github.com/gregwebs/haskell-xss-sanitize">http://github.com/gregwebs/haskell-xss-sanitize</a>&gt; for more details</span>
<a name="line-36"></a><span class='hs-definition'>sanitizeBalance</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-37"></a><span class='hs-definition'>sanitizeBalance</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>filterTags</span> <span class='hs-layout'>(</span><span class='hs-varid'>balance</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span> <span class='hs-varop'>.</span> <span class='hs-varid'>safeTags</span><span class='hs-layout'>)</span>
<a name="line-38"></a>
<a name="line-39"></a><a name="filterTags"></a><span class='hs-comment'>-- | insert custom tag filtering. Don't forget to compose your filter with safeTags!</span>
<a name="line-40"></a><span class='hs-definition'>filterTags</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Tag</span> <span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Tag</span> <span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-41"></a><span class='hs-definition'>filterTags</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>renderTagsOptions</span> <span class='hs-varid'>renderOptions</span> <span class='hs-layout'>{</span>
<a name="line-42"></a>    <span class='hs-varid'>optMinimize</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>x</span> <span class='hs-varop'>`elem`</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"br"</span><span class='hs-layout'>,</span><span class='hs-str'>"img"</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- &lt;img&gt;&lt;img&gt; converts to &lt;img /&gt;, &lt;a/&gt; converts to &lt;a&gt;&lt;/a&gt;</span>
<a name="line-43"></a>  <span class='hs-layout'>}</span> <span class='hs-varop'>.</span>  <span class='hs-varid'>f</span> <span class='hs-varop'>.</span> <span class='hs-varid'>canonicalizeTags</span> <span class='hs-varop'>.</span> <span class='hs-varid'>parseTags</span>
<a name="line-44"></a>
<a name="line-45"></a><a name="balance"></a><span class='hs-definition'>balance</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-conid'>Map</span> <span class='hs-conid'>String</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Tag</span> <span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Tag</span> <span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-46"></a><span class='hs-definition'>balance</span> <span class='hs-varid'>m</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span>
<a name="line-47"></a>    <span class='hs-varid'>concatMap</span> <span class='hs-varid'>go</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>toList</span> <span class='hs-varid'>m</span>
<a name="line-48"></a>  <span class='hs-keyword'>where</span>
<a name="line-49"></a>    <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-varid'>name</span><span class='hs-layout'>,</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-50"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>noClosing</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-51"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>replicate</span> <span class='hs-varid'>i</span> <span class='hs-varop'>$</span> <span class='hs-conid'>TagClose</span> <span class='hs-varid'>name</span>
<a name="line-52"></a>    <span class='hs-varid'>noClosing</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>flip</span> <span class='hs-varid'>elem</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"br"</span><span class='hs-layout'>,</span> <span class='hs-str'>"img"</span><span class='hs-keyglyph'>]</span>
<a name="line-53"></a><span class='hs-definition'>balance</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>t</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>TagClose</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>tags</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-54"></a>    <span class='hs-keyword'>case</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>lookup</span> <span class='hs-varid'>name</span> <span class='hs-varid'>m</span> <span class='hs-keyword'>of</span>
<a name="line-55"></a>        <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TagOpen</span> <span class='hs-varid'>name</span> <span class='hs-conid'>[]</span> <span class='hs-conop'>:</span> <span class='hs-conid'>TagClose</span> <span class='hs-varid'>name</span> <span class='hs-conop'>:</span> <span class='hs-varid'>balance</span> <span class='hs-varid'>m</span> <span class='hs-varid'>tags</span>
<a name="line-56"></a>        <span class='hs-conid'>Just</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-57"></a>            <span class='hs-keyword'>let</span> <span class='hs-varid'>m'</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>i</span> <span class='hs-varop'>==</span> <span class='hs-num'>1</span>
<a name="line-58"></a>                        <span class='hs-keyword'>then</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>delete</span> <span class='hs-varid'>name</span> <span class='hs-varid'>m</span>
<a name="line-59"></a>                        <span class='hs-keyword'>else</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>insert</span> <span class='hs-varid'>name</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>m</span>
<a name="line-60"></a>             <span class='hs-keyword'>in</span> <span class='hs-varid'>t</span> <span class='hs-conop'>:</span> <span class='hs-varid'>balance</span> <span class='hs-varid'>m'</span> <span class='hs-varid'>tags</span>
<a name="line-61"></a><span class='hs-definition'>balance</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-conid'>TagOpen</span> <span class='hs-varid'>name</span> <span class='hs-keyword'>as</span> <span class='hs-conop'>:</span> <span class='hs-varid'>tags</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-62"></a>    <span class='hs-conid'>TagOpen</span> <span class='hs-varid'>name</span> <span class='hs-keyword'>as</span> <span class='hs-conop'>:</span> <span class='hs-varid'>balance</span> <span class='hs-varid'>m'</span> <span class='hs-varid'>tags</span>
<a name="line-63"></a>  <span class='hs-keyword'>where</span>
<a name="line-64"></a>    <span class='hs-varid'>m'</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>lookup</span> <span class='hs-varid'>name</span> <span class='hs-varid'>m</span> <span class='hs-keyword'>of</span>
<a name="line-65"></a>            <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>insert</span> <span class='hs-varid'>name</span> <span class='hs-num'>1</span> <span class='hs-varid'>m</span>
<a name="line-66"></a>            <span class='hs-conid'>Just</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>insert</span> <span class='hs-varid'>name</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>m</span>
<a name="line-67"></a><span class='hs-definition'>balance</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>t</span><span class='hs-conop'>:</span><span class='hs-varid'>ts</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t</span> <span class='hs-conop'>:</span> <span class='hs-varid'>balance</span> <span class='hs-varid'>m</span> <span class='hs-varid'>ts</span>
<a name="line-68"></a>
<a name="line-69"></a><a name="safeTags"></a><span class='hs-comment'>-- | Filters out any usafe tags and attributes. Use with filterTags to create a custom filter.</span>
<a name="line-70"></a><span class='hs-definition'>safeTags</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Tag</span> <span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Tag</span> <span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-71"></a><span class='hs-definition'>safeTags</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-72"></a><span class='hs-definition'>safeTags</span> <span class='hs-layout'>(</span><span class='hs-varid'>t</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>TagClose</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>tags</span><span class='hs-layout'>)</span>
<a name="line-73"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>safeTagName</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t</span> <span class='hs-conop'>:</span> <span class='hs-varid'>safeTags</span> <span class='hs-varid'>tags</span>
<a name="line-74"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>safeTags</span> <span class='hs-varid'>tags</span>
<a name="line-75"></a><span class='hs-definition'>safeTags</span> <span class='hs-layout'>(</span><span class='hs-conid'>TagOpen</span> <span class='hs-varid'>name</span> <span class='hs-varid'>attributes</span><span class='hs-conop'>:</span><span class='hs-varid'>tags</span><span class='hs-layout'>)</span>
<a name="line-76"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>safeTagName</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TagOpen</span> <span class='hs-varid'>name</span> <span class='hs-layout'>(</span><span class='hs-varid'>filter</span> <span class='hs-varid'>safeAttribute</span> <span class='hs-varid'>attributes</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>safeTags</span> <span class='hs-varid'>tags</span>
<a name="line-77"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>safeTags</span> <span class='hs-varid'>tags</span>
<a name="line-78"></a><span class='hs-definition'>safeTags</span> <span class='hs-layout'>(</span><span class='hs-varid'>t</span><span class='hs-conop'>:</span><span class='hs-varid'>tags</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t</span><span class='hs-conop'>:</span><span class='hs-varid'>safeTags</span> <span class='hs-varid'>tags</span>
<a name="line-79"></a>
<a name="line-80"></a><a name="safeTagName"></a><span class='hs-definition'>safeTagName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-81"></a><span class='hs-definition'>safeTagName</span> <span class='hs-varid'>tagname</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tagname</span> <span class='hs-varop'>`member`</span> <span class='hs-varid'>sanitaryTags</span>
<a name="line-82"></a>
<a name="line-83"></a><a name="safeAttribute"></a><span class='hs-definition'>safeAttribute</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-84"></a><span class='hs-definition'>safeAttribute</span> <span class='hs-layout'>(</span><span class='hs-varid'>name</span><span class='hs-layout'>,</span> <span class='hs-varid'>value</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>name</span> <span class='hs-varop'>`member`</span> <span class='hs-varid'>sanitaryAttributes</span> <span class='hs-varop'>&amp;&amp;</span>
<a name="line-85"></a>  <span class='hs-layout'>(</span><span class='hs-varid'>name</span> <span class='hs-varop'>`notMember`</span> <span class='hs-varid'>attrValIsUri</span> <span class='hs-varop'>||</span> <span class='hs-varid'>sanitaryURI</span> <span class='hs-varid'>value</span><span class='hs-layout'>)</span>
<a name="line-86"></a>         
<a name="line-87"></a>
<a name="line-88"></a><a name="sanitaryURI"></a><span class='hs-comment'>-- | Returns @True@ if the specified URI is not a potential security risk.</span>
<a name="line-89"></a><span class='hs-definition'>sanitaryURI</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-90"></a><span class='hs-definition'>sanitaryURI</span> <span class='hs-varid'>u</span> <span class='hs-keyglyph'>=</span>
<a name="line-91"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>parseURIReference</span> <span class='hs-layout'>(</span><span class='hs-varid'>escapeURI</span> <span class='hs-varid'>u</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span>
<a name="line-92"></a>     <span class='hs-conid'>Just</span> <span class='hs-varid'>p</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>null</span> <span class='hs-layout'>(</span><span class='hs-varid'>uriScheme</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>||</span>
<a name="line-93"></a>                <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>toLower</span> <span class='hs-varop'>$</span> <span class='hs-varid'>init</span> <span class='hs-varop'>$</span> <span class='hs-varid'>uriScheme</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-varop'>`member`</span> <span class='hs-varid'>safeURISchemes</span><span class='hs-layout'>)</span>
<a name="line-94"></a>     <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-95"></a>
<a name="line-96"></a>
<a name="line-97"></a><a name="escapeURI"></a><span class='hs-comment'>-- | Escape unicode characters in a URI.  Characters that are</span>
<a name="line-98"></a><span class='hs-comment'>-- already valid in a URI, including % and ?, are left alone.</span>
<a name="line-99"></a><span class='hs-definition'>escapeURI</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-100"></a><span class='hs-definition'>escapeURI</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>escapeURIString</span> <span class='hs-varid'>isAllowedInURI</span> <span class='hs-varop'>.</span> <span class='hs-varid'>encodeString</span>
<a name="line-101"></a>
<a name="line-102"></a><a name="safeURISchemes"></a><span class='hs-definition'>safeURISchemes</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>String</span>
<a name="line-103"></a><span class='hs-definition'>safeURISchemes</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromList</span> <span class='hs-varid'>acceptable_protocols</span>
<a name="line-104"></a>
<a name="line-105"></a><a name="sanitaryTags"></a><span class='hs-definition'>sanitaryTags</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>String</span>
<a name="line-106"></a><span class='hs-definition'>sanitaryTags</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromList</span> <span class='hs-layout'>(</span><span class='hs-varid'>acceptable_elements</span> <span class='hs-varop'>++</span> <span class='hs-varid'>mathml_elements</span> <span class='hs-varop'>++</span> <span class='hs-varid'>svg_elements</span><span class='hs-layout'>)</span>
<a name="line-107"></a>  <span class='hs-varop'>\\</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromList</span> <span class='hs-varid'>svg_allow_local_href</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- extra filtering not implemented</span>
<a name="line-108"></a>
<a name="line-109"></a><a name="sanitaryAttributes"></a><span class='hs-definition'>sanitaryAttributes</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>String</span>
<a name="line-110"></a><span class='hs-definition'>sanitaryAttributes</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromList</span> <span class='hs-layout'>(</span><span class='hs-varid'>acceptable_attributes</span> <span class='hs-varop'>++</span> <span class='hs-varid'>mathml_attributes</span> <span class='hs-varop'>++</span> <span class='hs-varid'>svg_attributes</span><span class='hs-layout'>)</span>
<a name="line-111"></a>  <span class='hs-varop'>\\</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromList</span> <span class='hs-varid'>svg_attr_val_allows_ref</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- extra unescaping not implemented</span>
<a name="line-112"></a>
<a name="line-113"></a><a name="attrValIsUri"></a><span class='hs-definition'>attrValIsUri</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>String</span>
<a name="line-114"></a><span class='hs-definition'>attrValIsUri</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromList</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"href"</span><span class='hs-layout'>,</span> <span class='hs-str'>"src"</span><span class='hs-layout'>,</span> <span class='hs-str'>"cite"</span><span class='hs-layout'>,</span> <span class='hs-str'>"action"</span><span class='hs-layout'>,</span> <span class='hs-str'>"longdesc"</span><span class='hs-layout'>,</span>
<a name="line-115"></a>    <span class='hs-str'>"xlink:href"</span><span class='hs-layout'>,</span> <span class='hs-str'>"xml:base"</span><span class='hs-keyglyph'>]</span>
<a name="line-116"></a>
<a name="line-117"></a><a name="acceptable_elements"></a><span class='hs-definition'>acceptable_elements</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-118"></a><span class='hs-definition'>acceptable_elements</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"a"</span><span class='hs-layout'>,</span> <span class='hs-str'>"abbr"</span><span class='hs-layout'>,</span> <span class='hs-str'>"acronym"</span><span class='hs-layout'>,</span> <span class='hs-str'>"address"</span><span class='hs-layout'>,</span> <span class='hs-str'>"area"</span><span class='hs-layout'>,</span>
<a name="line-119"></a>    <span class='hs-str'>"article"</span><span class='hs-layout'>,</span> <span class='hs-str'>"aside"</span><span class='hs-layout'>,</span> <span class='hs-str'>"audio"</span><span class='hs-layout'>,</span> <span class='hs-str'>"b"</span><span class='hs-layout'>,</span> <span class='hs-str'>"big"</span><span class='hs-layout'>,</span> <span class='hs-str'>"blockquote"</span><span class='hs-layout'>,</span> <span class='hs-str'>"br"</span><span class='hs-layout'>,</span> <span class='hs-str'>"button"</span><span class='hs-layout'>,</span>
<a name="line-120"></a>    <span class='hs-str'>"canvas"</span><span class='hs-layout'>,</span> <span class='hs-str'>"caption"</span><span class='hs-layout'>,</span> <span class='hs-str'>"center"</span><span class='hs-layout'>,</span> <span class='hs-str'>"cite"</span><span class='hs-layout'>,</span> <span class='hs-str'>"code"</span><span class='hs-layout'>,</span> <span class='hs-str'>"col"</span><span class='hs-layout'>,</span> <span class='hs-str'>"colgroup"</span><span class='hs-layout'>,</span>
<a name="line-121"></a>    <span class='hs-str'>"command"</span><span class='hs-layout'>,</span> <span class='hs-str'>"datagrid"</span><span class='hs-layout'>,</span> <span class='hs-str'>"datalist"</span><span class='hs-layout'>,</span> <span class='hs-str'>"dd"</span><span class='hs-layout'>,</span> <span class='hs-str'>"del"</span><span class='hs-layout'>,</span> <span class='hs-str'>"details"</span><span class='hs-layout'>,</span> <span class='hs-str'>"dfn"</span><span class='hs-layout'>,</span>
<a name="line-122"></a>    <span class='hs-str'>"dialog"</span><span class='hs-layout'>,</span> <span class='hs-str'>"dir"</span><span class='hs-layout'>,</span> <span class='hs-str'>"div"</span><span class='hs-layout'>,</span> <span class='hs-str'>"dl"</span><span class='hs-layout'>,</span> <span class='hs-str'>"dt"</span><span class='hs-layout'>,</span> <span class='hs-str'>"em"</span><span class='hs-layout'>,</span> <span class='hs-str'>"event-source"</span><span class='hs-layout'>,</span> <span class='hs-str'>"fieldset"</span><span class='hs-layout'>,</span>
<a name="line-123"></a>    <span class='hs-str'>"figure"</span><span class='hs-layout'>,</span> <span class='hs-str'>"footer"</span><span class='hs-layout'>,</span> <span class='hs-str'>"font"</span><span class='hs-layout'>,</span> <span class='hs-str'>"form"</span><span class='hs-layout'>,</span> <span class='hs-str'>"header"</span><span class='hs-layout'>,</span> <span class='hs-str'>"h1"</span><span class='hs-layout'>,</span> <span class='hs-str'>"h2"</span><span class='hs-layout'>,</span> <span class='hs-str'>"h3"</span><span class='hs-layout'>,</span> <span class='hs-str'>"h4"</span><span class='hs-layout'>,</span>
<a name="line-124"></a>    <span class='hs-str'>"h5"</span><span class='hs-layout'>,</span> <span class='hs-str'>"h6"</span><span class='hs-layout'>,</span> <span class='hs-str'>"hr"</span><span class='hs-layout'>,</span> <span class='hs-str'>"i"</span><span class='hs-layout'>,</span> <span class='hs-str'>"img"</span><span class='hs-layout'>,</span> <span class='hs-str'>"input"</span><span class='hs-layout'>,</span> <span class='hs-str'>"ins"</span><span class='hs-layout'>,</span> <span class='hs-str'>"keygen"</span><span class='hs-layout'>,</span> <span class='hs-str'>"kbd"</span><span class='hs-layout'>,</span>
<a name="line-125"></a>    <span class='hs-str'>"label"</span><span class='hs-layout'>,</span> <span class='hs-str'>"legend"</span><span class='hs-layout'>,</span> <span class='hs-str'>"li"</span><span class='hs-layout'>,</span> <span class='hs-str'>"m"</span><span class='hs-layout'>,</span> <span class='hs-str'>"map"</span><span class='hs-layout'>,</span> <span class='hs-str'>"menu"</span><span class='hs-layout'>,</span> <span class='hs-str'>"meter"</span><span class='hs-layout'>,</span> <span class='hs-str'>"multicol"</span><span class='hs-layout'>,</span>
<a name="line-126"></a>    <span class='hs-str'>"nav"</span><span class='hs-layout'>,</span> <span class='hs-str'>"nextid"</span><span class='hs-layout'>,</span> <span class='hs-str'>"ol"</span><span class='hs-layout'>,</span> <span class='hs-str'>"output"</span><span class='hs-layout'>,</span> <span class='hs-str'>"optgroup"</span><span class='hs-layout'>,</span> <span class='hs-str'>"option"</span><span class='hs-layout'>,</span> <span class='hs-str'>"p"</span><span class='hs-layout'>,</span> <span class='hs-str'>"pre"</span><span class='hs-layout'>,</span>
<a name="line-127"></a>    <span class='hs-str'>"progress"</span><span class='hs-layout'>,</span> <span class='hs-str'>"q"</span><span class='hs-layout'>,</span> <span class='hs-str'>"s"</span><span class='hs-layout'>,</span> <span class='hs-str'>"samp"</span><span class='hs-layout'>,</span> <span class='hs-str'>"section"</span><span class='hs-layout'>,</span> <span class='hs-str'>"select"</span><span class='hs-layout'>,</span> <span class='hs-str'>"small"</span><span class='hs-layout'>,</span> <span class='hs-str'>"sound"</span><span class='hs-layout'>,</span>
<a name="line-128"></a>    <span class='hs-str'>"source"</span><span class='hs-layout'>,</span> <span class='hs-str'>"spacer"</span><span class='hs-layout'>,</span> <span class='hs-str'>"span"</span><span class='hs-layout'>,</span> <span class='hs-str'>"strike"</span><span class='hs-layout'>,</span> <span class='hs-str'>"strong"</span><span class='hs-layout'>,</span> <span class='hs-str'>"sub"</span><span class='hs-layout'>,</span> <span class='hs-str'>"sup"</span><span class='hs-layout'>,</span> <span class='hs-str'>"table"</span><span class='hs-layout'>,</span>
<a name="line-129"></a>    <span class='hs-str'>"tbody"</span><span class='hs-layout'>,</span> <span class='hs-str'>"td"</span><span class='hs-layout'>,</span> <span class='hs-str'>"textarea"</span><span class='hs-layout'>,</span> <span class='hs-str'>"time"</span><span class='hs-layout'>,</span> <span class='hs-str'>"tfoot"</span><span class='hs-layout'>,</span> <span class='hs-str'>"th"</span><span class='hs-layout'>,</span> <span class='hs-str'>"thead"</span><span class='hs-layout'>,</span> <span class='hs-str'>"tr"</span><span class='hs-layout'>,</span> <span class='hs-str'>"tt"</span><span class='hs-layout'>,</span>
<a name="line-130"></a>    <span class='hs-str'>"u"</span><span class='hs-layout'>,</span> <span class='hs-str'>"ul"</span><span class='hs-layout'>,</span> <span class='hs-str'>"var"</span><span class='hs-layout'>,</span> <span class='hs-str'>"video"</span><span class='hs-keyglyph'>]</span>
<a name="line-131"></a>  
<a name="line-132"></a><a name="mathml_elements"></a><span class='hs-definition'>mathml_elements</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-133"></a><span class='hs-definition'>mathml_elements</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"maction"</span><span class='hs-layout'>,</span> <span class='hs-str'>"math"</span><span class='hs-layout'>,</span> <span class='hs-str'>"merror"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mfrac"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mi"</span><span class='hs-layout'>,</span>
<a name="line-134"></a>    <span class='hs-str'>"mmultiscripts"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mn"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mo"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mover"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mpadded"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mphantom"</span><span class='hs-layout'>,</span>
<a name="line-135"></a>    <span class='hs-str'>"mprescripts"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mroot"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mrow"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mspace"</span><span class='hs-layout'>,</span> <span class='hs-str'>"msqrt"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mstyle"</span><span class='hs-layout'>,</span> <span class='hs-str'>"msub"</span><span class='hs-layout'>,</span>
<a name="line-136"></a>    <span class='hs-str'>"msubsup"</span><span class='hs-layout'>,</span> <span class='hs-str'>"msup"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mtable"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mtd"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mtext"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mtr"</span><span class='hs-layout'>,</span> <span class='hs-str'>"munder"</span><span class='hs-layout'>,</span>
<a name="line-137"></a>    <span class='hs-str'>"munderover"</span><span class='hs-layout'>,</span> <span class='hs-str'>"none"</span><span class='hs-keyglyph'>]</span>
<a name="line-138"></a>
<a name="line-139"></a><a name="svg_elements"></a><span class='hs-comment'>-- this should include altGlyph I think</span>
<a name="line-140"></a><span class='hs-definition'>svg_elements</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-141"></a><span class='hs-definition'>svg_elements</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"a"</span><span class='hs-layout'>,</span> <span class='hs-str'>"animate"</span><span class='hs-layout'>,</span> <span class='hs-str'>"animateColor"</span><span class='hs-layout'>,</span> <span class='hs-str'>"animateMotion"</span><span class='hs-layout'>,</span>
<a name="line-142"></a>    <span class='hs-str'>"animateTransform"</span><span class='hs-layout'>,</span> <span class='hs-str'>"clipPath"</span><span class='hs-layout'>,</span> <span class='hs-str'>"circle"</span><span class='hs-layout'>,</span> <span class='hs-str'>"defs"</span><span class='hs-layout'>,</span> <span class='hs-str'>"desc"</span><span class='hs-layout'>,</span> <span class='hs-str'>"ellipse"</span><span class='hs-layout'>,</span>
<a name="line-143"></a>    <span class='hs-str'>"font-face"</span><span class='hs-layout'>,</span> <span class='hs-str'>"font-face-name"</span><span class='hs-layout'>,</span> <span class='hs-str'>"font-face-src"</span><span class='hs-layout'>,</span> <span class='hs-str'>"g"</span><span class='hs-layout'>,</span> <span class='hs-str'>"glyph"</span><span class='hs-layout'>,</span> <span class='hs-str'>"hkern"</span><span class='hs-layout'>,</span>
<a name="line-144"></a>    <span class='hs-str'>"linearGradient"</span><span class='hs-layout'>,</span> <span class='hs-str'>"line"</span><span class='hs-layout'>,</span> <span class='hs-str'>"marker"</span><span class='hs-layout'>,</span> <span class='hs-str'>"metadata"</span><span class='hs-layout'>,</span> <span class='hs-str'>"missing-glyph"</span><span class='hs-layout'>,</span>
<a name="line-145"></a>    <span class='hs-str'>"mpath"</span><span class='hs-layout'>,</span> <span class='hs-str'>"path"</span><span class='hs-layout'>,</span> <span class='hs-str'>"polygon"</span><span class='hs-layout'>,</span> <span class='hs-str'>"polyline"</span><span class='hs-layout'>,</span> <span class='hs-str'>"radialGradient"</span><span class='hs-layout'>,</span> <span class='hs-str'>"rect"</span><span class='hs-layout'>,</span>
<a name="line-146"></a>    <span class='hs-str'>"set"</span><span class='hs-layout'>,</span> <span class='hs-str'>"stop"</span><span class='hs-layout'>,</span> <span class='hs-str'>"svg"</span><span class='hs-layout'>,</span> <span class='hs-str'>"switch"</span><span class='hs-layout'>,</span> <span class='hs-str'>"text"</span><span class='hs-layout'>,</span> <span class='hs-str'>"title"</span><span class='hs-layout'>,</span> <span class='hs-str'>"tspan"</span><span class='hs-layout'>,</span> <span class='hs-str'>"use"</span><span class='hs-keyglyph'>]</span>
<a name="line-147"></a>  
<a name="line-148"></a><a name="acceptable_attributes"></a><span class='hs-definition'>acceptable_attributes</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-149"></a><span class='hs-definition'>acceptable_attributes</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"abbr"</span><span class='hs-layout'>,</span> <span class='hs-str'>"accept"</span><span class='hs-layout'>,</span> <span class='hs-str'>"accept-charset"</span><span class='hs-layout'>,</span> <span class='hs-str'>"accesskey"</span><span class='hs-layout'>,</span>
<a name="line-150"></a>    <span class='hs-str'>"action"</span><span class='hs-layout'>,</span> <span class='hs-str'>"align"</span><span class='hs-layout'>,</span> <span class='hs-str'>"alt"</span><span class='hs-layout'>,</span> <span class='hs-str'>"autocomplete"</span><span class='hs-layout'>,</span> <span class='hs-str'>"autofocus"</span><span class='hs-layout'>,</span> <span class='hs-str'>"axis"</span><span class='hs-layout'>,</span>
<a name="line-151"></a>    <span class='hs-str'>"background"</span><span class='hs-layout'>,</span> <span class='hs-str'>"balance"</span><span class='hs-layout'>,</span> <span class='hs-str'>"bgcolor"</span><span class='hs-layout'>,</span> <span class='hs-str'>"bgproperties"</span><span class='hs-layout'>,</span> <span class='hs-str'>"border"</span><span class='hs-layout'>,</span>
<a name="line-152"></a>    <span class='hs-str'>"bordercolor"</span><span class='hs-layout'>,</span> <span class='hs-str'>"bordercolordark"</span><span class='hs-layout'>,</span> <span class='hs-str'>"bordercolorlight"</span><span class='hs-layout'>,</span> <span class='hs-str'>"bottompadding"</span><span class='hs-layout'>,</span>
<a name="line-153"></a>    <span class='hs-str'>"cellpadding"</span><span class='hs-layout'>,</span> <span class='hs-str'>"cellspacing"</span><span class='hs-layout'>,</span> <span class='hs-str'>"ch"</span><span class='hs-layout'>,</span> <span class='hs-str'>"challenge"</span><span class='hs-layout'>,</span> <span class='hs-str'>"char"</span><span class='hs-layout'>,</span> <span class='hs-str'>"charoff"</span><span class='hs-layout'>,</span>
<a name="line-154"></a>    <span class='hs-str'>"choff"</span><span class='hs-layout'>,</span> <span class='hs-str'>"charset"</span><span class='hs-layout'>,</span> <span class='hs-str'>"checked"</span><span class='hs-layout'>,</span> <span class='hs-str'>"cite"</span><span class='hs-layout'>,</span> <span class='hs-str'>"class"</span><span class='hs-layout'>,</span> <span class='hs-str'>"clear"</span><span class='hs-layout'>,</span> <span class='hs-str'>"color"</span><span class='hs-layout'>,</span>
<a name="line-155"></a>    <span class='hs-str'>"cols"</span><span class='hs-layout'>,</span> <span class='hs-str'>"colspan"</span><span class='hs-layout'>,</span> <span class='hs-str'>"compact"</span><span class='hs-layout'>,</span> <span class='hs-str'>"contenteditable"</span><span class='hs-layout'>,</span> <span class='hs-str'>"controls"</span><span class='hs-layout'>,</span> <span class='hs-str'>"coords"</span><span class='hs-layout'>,</span>
<a name="line-156"></a>    <span class='hs-comment'>-- "data", TODO: allow this with further filtering</span>
<a name="line-157"></a>    <span class='hs-str'>"datafld"</span><span class='hs-layout'>,</span> <span class='hs-str'>"datapagesize"</span><span class='hs-layout'>,</span> <span class='hs-str'>"datasrc"</span><span class='hs-layout'>,</span> <span class='hs-str'>"datetime"</span><span class='hs-layout'>,</span> <span class='hs-str'>"default"</span><span class='hs-layout'>,</span>
<a name="line-158"></a>    <span class='hs-str'>"delay"</span><span class='hs-layout'>,</span> <span class='hs-str'>"dir"</span><span class='hs-layout'>,</span> <span class='hs-str'>"disabled"</span><span class='hs-layout'>,</span> <span class='hs-str'>"draggable"</span><span class='hs-layout'>,</span> <span class='hs-str'>"dynsrc"</span><span class='hs-layout'>,</span> <span class='hs-str'>"enctype"</span><span class='hs-layout'>,</span> <span class='hs-str'>"end"</span><span class='hs-layout'>,</span>
<a name="line-159"></a>    <span class='hs-str'>"face"</span><span class='hs-layout'>,</span> <span class='hs-str'>"for"</span><span class='hs-layout'>,</span> <span class='hs-str'>"form"</span><span class='hs-layout'>,</span> <span class='hs-str'>"frame"</span><span class='hs-layout'>,</span> <span class='hs-str'>"galleryimg"</span><span class='hs-layout'>,</span> <span class='hs-str'>"gutter"</span><span class='hs-layout'>,</span> <span class='hs-str'>"headers"</span><span class='hs-layout'>,</span>
<a name="line-160"></a>    <span class='hs-str'>"height"</span><span class='hs-layout'>,</span> <span class='hs-str'>"hidefocus"</span><span class='hs-layout'>,</span> <span class='hs-str'>"hidden"</span><span class='hs-layout'>,</span> <span class='hs-str'>"high"</span><span class='hs-layout'>,</span> <span class='hs-str'>"href"</span><span class='hs-layout'>,</span> <span class='hs-str'>"hreflang"</span><span class='hs-layout'>,</span> <span class='hs-str'>"hspace"</span><span class='hs-layout'>,</span>
<a name="line-161"></a>    <span class='hs-str'>"icon"</span><span class='hs-layout'>,</span> <span class='hs-str'>"id"</span><span class='hs-layout'>,</span> <span class='hs-str'>"inputmode"</span><span class='hs-layout'>,</span> <span class='hs-str'>"ismap"</span><span class='hs-layout'>,</span> <span class='hs-str'>"keytype"</span><span class='hs-layout'>,</span> <span class='hs-str'>"label"</span><span class='hs-layout'>,</span> <span class='hs-str'>"leftspacing"</span><span class='hs-layout'>,</span>
<a name="line-162"></a>    <span class='hs-str'>"lang"</span><span class='hs-layout'>,</span> <span class='hs-str'>"list"</span><span class='hs-layout'>,</span> <span class='hs-str'>"longdesc"</span><span class='hs-layout'>,</span> <span class='hs-str'>"loop"</span><span class='hs-layout'>,</span> <span class='hs-str'>"loopcount"</span><span class='hs-layout'>,</span> <span class='hs-str'>"loopend"</span><span class='hs-layout'>,</span>
<a name="line-163"></a>    <span class='hs-str'>"loopstart"</span><span class='hs-layout'>,</span> <span class='hs-str'>"low"</span><span class='hs-layout'>,</span> <span class='hs-str'>"lowsrc"</span><span class='hs-layout'>,</span> <span class='hs-str'>"max"</span><span class='hs-layout'>,</span> <span class='hs-str'>"maxlength"</span><span class='hs-layout'>,</span> <span class='hs-str'>"media"</span><span class='hs-layout'>,</span> <span class='hs-str'>"method"</span><span class='hs-layout'>,</span>
<a name="line-164"></a>    <span class='hs-str'>"min"</span><span class='hs-layout'>,</span> <span class='hs-str'>"multiple"</span><span class='hs-layout'>,</span> <span class='hs-str'>"name"</span><span class='hs-layout'>,</span> <span class='hs-str'>"nohref"</span><span class='hs-layout'>,</span> <span class='hs-str'>"noshade"</span><span class='hs-layout'>,</span> <span class='hs-str'>"nowrap"</span><span class='hs-layout'>,</span> <span class='hs-str'>"open"</span><span class='hs-layout'>,</span>
<a name="line-165"></a>    <span class='hs-str'>"optimum"</span><span class='hs-layout'>,</span> <span class='hs-str'>"pattern"</span><span class='hs-layout'>,</span> <span class='hs-str'>"ping"</span><span class='hs-layout'>,</span> <span class='hs-str'>"point-size"</span><span class='hs-layout'>,</span> <span class='hs-str'>"prompt"</span><span class='hs-layout'>,</span> <span class='hs-str'>"pqg"</span><span class='hs-layout'>,</span>
<a name="line-166"></a>    <span class='hs-str'>"radiogroup"</span><span class='hs-layout'>,</span> <span class='hs-str'>"readonly"</span><span class='hs-layout'>,</span> <span class='hs-str'>"rel"</span><span class='hs-layout'>,</span> <span class='hs-str'>"repeat-max"</span><span class='hs-layout'>,</span> <span class='hs-str'>"repeat-min"</span><span class='hs-layout'>,</span>
<a name="line-167"></a>    <span class='hs-str'>"replace"</span><span class='hs-layout'>,</span> <span class='hs-str'>"required"</span><span class='hs-layout'>,</span> <span class='hs-str'>"rev"</span><span class='hs-layout'>,</span> <span class='hs-str'>"rightspacing"</span><span class='hs-layout'>,</span> <span class='hs-str'>"rows"</span><span class='hs-layout'>,</span> <span class='hs-str'>"rowspan"</span><span class='hs-layout'>,</span>
<a name="line-168"></a>    <span class='hs-str'>"rules"</span><span class='hs-layout'>,</span> <span class='hs-str'>"scope"</span><span class='hs-layout'>,</span> <span class='hs-str'>"selected"</span><span class='hs-layout'>,</span> <span class='hs-str'>"shape"</span><span class='hs-layout'>,</span> <span class='hs-str'>"size"</span><span class='hs-layout'>,</span> <span class='hs-str'>"span"</span><span class='hs-layout'>,</span> <span class='hs-str'>"src"</span><span class='hs-layout'>,</span> <span class='hs-str'>"start"</span><span class='hs-layout'>,</span>
<a name="line-169"></a>    <span class='hs-str'>"step"</span><span class='hs-layout'>,</span>
<a name="line-170"></a>    <span class='hs-comment'>-- "style", TODO: allow this with further filtering</span>
<a name="line-171"></a>    <span class='hs-str'>"summary"</span><span class='hs-layout'>,</span> <span class='hs-str'>"suppress"</span><span class='hs-layout'>,</span> <span class='hs-str'>"tabindex"</span><span class='hs-layout'>,</span> <span class='hs-str'>"target"</span><span class='hs-layout'>,</span>
<a name="line-172"></a>    <span class='hs-str'>"template"</span><span class='hs-layout'>,</span> <span class='hs-str'>"title"</span><span class='hs-layout'>,</span> <span class='hs-str'>"toppadding"</span><span class='hs-layout'>,</span> <span class='hs-str'>"type"</span><span class='hs-layout'>,</span> <span class='hs-str'>"unselectable"</span><span class='hs-layout'>,</span> <span class='hs-str'>"usemap"</span><span class='hs-layout'>,</span>
<a name="line-173"></a>    <span class='hs-str'>"urn"</span><span class='hs-layout'>,</span> <span class='hs-str'>"valign"</span><span class='hs-layout'>,</span> <span class='hs-str'>"value"</span><span class='hs-layout'>,</span> <span class='hs-str'>"variable"</span><span class='hs-layout'>,</span> <span class='hs-str'>"volume"</span><span class='hs-layout'>,</span> <span class='hs-str'>"vspace"</span><span class='hs-layout'>,</span> <span class='hs-str'>"vrml"</span><span class='hs-layout'>,</span>
<a name="line-174"></a>    <span class='hs-str'>"width"</span><span class='hs-layout'>,</span> <span class='hs-str'>"wrap"</span><span class='hs-layout'>,</span> <span class='hs-str'>"xml:lang"</span><span class='hs-keyglyph'>]</span>
<a name="line-175"></a>
<a name="line-176"></a><a name="acceptable_protocols"></a><span class='hs-definition'>acceptable_protocols</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-177"></a><span class='hs-definition'>acceptable_protocols</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span> <span class='hs-str'>"ed2k"</span><span class='hs-layout'>,</span> <span class='hs-str'>"ftp"</span><span class='hs-layout'>,</span> <span class='hs-str'>"http"</span><span class='hs-layout'>,</span> <span class='hs-str'>"https"</span><span class='hs-layout'>,</span> <span class='hs-str'>"irc"</span><span class='hs-layout'>,</span>
<a name="line-178"></a>    <span class='hs-str'>"mailto"</span><span class='hs-layout'>,</span> <span class='hs-str'>"news"</span><span class='hs-layout'>,</span> <span class='hs-str'>"gopher"</span><span class='hs-layout'>,</span> <span class='hs-str'>"nntp"</span><span class='hs-layout'>,</span> <span class='hs-str'>"telnet"</span><span class='hs-layout'>,</span> <span class='hs-str'>"webcal"</span><span class='hs-layout'>,</span>
<a name="line-179"></a>    <span class='hs-str'>"xmpp"</span><span class='hs-layout'>,</span> <span class='hs-str'>"callto"</span><span class='hs-layout'>,</span> <span class='hs-str'>"feed"</span><span class='hs-layout'>,</span> <span class='hs-str'>"urn"</span><span class='hs-layout'>,</span> <span class='hs-str'>"aim"</span><span class='hs-layout'>,</span> <span class='hs-str'>"rsync"</span><span class='hs-layout'>,</span> <span class='hs-str'>"tag"</span><span class='hs-layout'>,</span>
<a name="line-180"></a>    <span class='hs-str'>"ssh"</span><span class='hs-layout'>,</span> <span class='hs-str'>"sftp"</span><span class='hs-layout'>,</span> <span class='hs-str'>"rtsp"</span><span class='hs-layout'>,</span> <span class='hs-str'>"afs"</span> <span class='hs-keyglyph'>]</span>
<a name="line-181"></a>
<a name="line-182"></a><a name="mathml_attributes"></a><span class='hs-definition'>mathml_attributes</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-183"></a><span class='hs-definition'>mathml_attributes</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"actiontype"</span><span class='hs-layout'>,</span> <span class='hs-str'>"align"</span><span class='hs-layout'>,</span> <span class='hs-str'>"columnalign"</span><span class='hs-layout'>,</span> <span class='hs-str'>"columnalign"</span><span class='hs-layout'>,</span>
<a name="line-184"></a>    <span class='hs-str'>"columnalign"</span><span class='hs-layout'>,</span> <span class='hs-str'>"columnlines"</span><span class='hs-layout'>,</span> <span class='hs-str'>"columnspacing"</span><span class='hs-layout'>,</span> <span class='hs-str'>"columnspan"</span><span class='hs-layout'>,</span> <span class='hs-str'>"depth"</span><span class='hs-layout'>,</span>
<a name="line-185"></a>    <span class='hs-str'>"display"</span><span class='hs-layout'>,</span> <span class='hs-str'>"displaystyle"</span><span class='hs-layout'>,</span> <span class='hs-str'>"equalcolumns"</span><span class='hs-layout'>,</span> <span class='hs-str'>"equalrows"</span><span class='hs-layout'>,</span> <span class='hs-str'>"fence"</span><span class='hs-layout'>,</span>
<a name="line-186"></a>    <span class='hs-str'>"fontstyle"</span><span class='hs-layout'>,</span> <span class='hs-str'>"fontweight"</span><span class='hs-layout'>,</span> <span class='hs-str'>"frame"</span><span class='hs-layout'>,</span> <span class='hs-str'>"height"</span><span class='hs-layout'>,</span> <span class='hs-str'>"linethickness"</span><span class='hs-layout'>,</span> <span class='hs-str'>"lspace"</span><span class='hs-layout'>,</span>
<a name="line-187"></a>    <span class='hs-str'>"mathbackground"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mathcolor"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mathvariant"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mathvariant"</span><span class='hs-layout'>,</span> <span class='hs-str'>"maxsize"</span><span class='hs-layout'>,</span>
<a name="line-188"></a>    <span class='hs-str'>"minsize"</span><span class='hs-layout'>,</span> <span class='hs-str'>"other"</span><span class='hs-layout'>,</span> <span class='hs-str'>"rowalign"</span><span class='hs-layout'>,</span> <span class='hs-str'>"rowalign"</span><span class='hs-layout'>,</span> <span class='hs-str'>"rowalign"</span><span class='hs-layout'>,</span> <span class='hs-str'>"rowlines"</span><span class='hs-layout'>,</span>
<a name="line-189"></a>    <span class='hs-str'>"rowspacing"</span><span class='hs-layout'>,</span> <span class='hs-str'>"rowspan"</span><span class='hs-layout'>,</span> <span class='hs-str'>"rspace"</span><span class='hs-layout'>,</span> <span class='hs-str'>"scriptlevel"</span><span class='hs-layout'>,</span> <span class='hs-str'>"selection"</span><span class='hs-layout'>,</span>
<a name="line-190"></a>    <span class='hs-str'>"separator"</span><span class='hs-layout'>,</span> <span class='hs-str'>"stretchy"</span><span class='hs-layout'>,</span> <span class='hs-str'>"width"</span><span class='hs-layout'>,</span> <span class='hs-str'>"width"</span><span class='hs-layout'>,</span> <span class='hs-str'>"xlink:href"</span><span class='hs-layout'>,</span> <span class='hs-str'>"xlink:show"</span><span class='hs-layout'>,</span>
<a name="line-191"></a>    <span class='hs-str'>"xlink:type"</span><span class='hs-layout'>,</span> <span class='hs-str'>"xmlns"</span><span class='hs-layout'>,</span> <span class='hs-str'>"xmlns:xlink"</span><span class='hs-keyglyph'>]</span>
<a name="line-192"></a>
<a name="line-193"></a><a name="svg_attributes"></a><span class='hs-definition'>svg_attributes</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-194"></a><span class='hs-definition'>svg_attributes</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"accent-height"</span><span class='hs-layout'>,</span> <span class='hs-str'>"accumulate"</span><span class='hs-layout'>,</span> <span class='hs-str'>"additive"</span><span class='hs-layout'>,</span> <span class='hs-str'>"alphabetic"</span><span class='hs-layout'>,</span>
<a name="line-195"></a>    <span class='hs-str'>"arabic-form"</span><span class='hs-layout'>,</span> <span class='hs-str'>"ascent"</span><span class='hs-layout'>,</span> <span class='hs-str'>"attributeName"</span><span class='hs-layout'>,</span> <span class='hs-str'>"attributeType"</span><span class='hs-layout'>,</span>
<a name="line-196"></a>    <span class='hs-str'>"baseProfile"</span><span class='hs-layout'>,</span> <span class='hs-str'>"bbox"</span><span class='hs-layout'>,</span> <span class='hs-str'>"begin"</span><span class='hs-layout'>,</span> <span class='hs-str'>"by"</span><span class='hs-layout'>,</span> <span class='hs-str'>"calcMode"</span><span class='hs-layout'>,</span> <span class='hs-str'>"cap-height"</span><span class='hs-layout'>,</span>
<a name="line-197"></a>    <span class='hs-str'>"class"</span><span class='hs-layout'>,</span> <span class='hs-str'>"clip-path"</span><span class='hs-layout'>,</span> <span class='hs-str'>"color"</span><span class='hs-layout'>,</span> <span class='hs-str'>"color-rendering"</span><span class='hs-layout'>,</span> <span class='hs-str'>"content"</span><span class='hs-layout'>,</span> <span class='hs-str'>"cx"</span><span class='hs-layout'>,</span>
<a name="line-198"></a>    <span class='hs-str'>"cy"</span><span class='hs-layout'>,</span> <span class='hs-str'>"d"</span><span class='hs-layout'>,</span> <span class='hs-str'>"dx"</span><span class='hs-layout'>,</span> <span class='hs-str'>"dy"</span><span class='hs-layout'>,</span> <span class='hs-str'>"descent"</span><span class='hs-layout'>,</span> <span class='hs-str'>"display"</span><span class='hs-layout'>,</span> <span class='hs-str'>"dur"</span><span class='hs-layout'>,</span> <span class='hs-str'>"end"</span><span class='hs-layout'>,</span> <span class='hs-str'>"fill"</span><span class='hs-layout'>,</span>
<a name="line-199"></a>    <span class='hs-str'>"fill-opacity"</span><span class='hs-layout'>,</span> <span class='hs-str'>"fill-rule"</span><span class='hs-layout'>,</span> <span class='hs-str'>"font-family"</span><span class='hs-layout'>,</span> <span class='hs-str'>"font-size"</span><span class='hs-layout'>,</span>
<a name="line-200"></a>    <span class='hs-str'>"font-stretch"</span><span class='hs-layout'>,</span> <span class='hs-str'>"font-style"</span><span class='hs-layout'>,</span> <span class='hs-str'>"font-variant"</span><span class='hs-layout'>,</span> <span class='hs-str'>"font-weight"</span><span class='hs-layout'>,</span> <span class='hs-str'>"from"</span><span class='hs-layout'>,</span>
<a name="line-201"></a>    <span class='hs-str'>"fx"</span><span class='hs-layout'>,</span> <span class='hs-str'>"fy"</span><span class='hs-layout'>,</span> <span class='hs-str'>"g1"</span><span class='hs-layout'>,</span> <span class='hs-str'>"g2"</span><span class='hs-layout'>,</span> <span class='hs-str'>"glyph-name"</span><span class='hs-layout'>,</span> <span class='hs-str'>"gradientUnits"</span><span class='hs-layout'>,</span> <span class='hs-str'>"hanging"</span><span class='hs-layout'>,</span>
<a name="line-202"></a>    <span class='hs-str'>"height"</span><span class='hs-layout'>,</span> <span class='hs-str'>"horiz-adv-x"</span><span class='hs-layout'>,</span> <span class='hs-str'>"horiz-origin-x"</span><span class='hs-layout'>,</span> <span class='hs-str'>"id"</span><span class='hs-layout'>,</span> <span class='hs-str'>"ideographic"</span><span class='hs-layout'>,</span> <span class='hs-str'>"k"</span><span class='hs-layout'>,</span>
<a name="line-203"></a>    <span class='hs-str'>"keyPoints"</span><span class='hs-layout'>,</span> <span class='hs-str'>"keySplines"</span><span class='hs-layout'>,</span> <span class='hs-str'>"keyTimes"</span><span class='hs-layout'>,</span> <span class='hs-str'>"lang"</span><span class='hs-layout'>,</span> <span class='hs-str'>"marker-end"</span><span class='hs-layout'>,</span>
<a name="line-204"></a>    <span class='hs-str'>"marker-mid"</span><span class='hs-layout'>,</span> <span class='hs-str'>"marker-start"</span><span class='hs-layout'>,</span> <span class='hs-str'>"markerHeight"</span><span class='hs-layout'>,</span> <span class='hs-str'>"markerUnits"</span><span class='hs-layout'>,</span>
<a name="line-205"></a>    <span class='hs-str'>"markerWidth"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mathematical"</span><span class='hs-layout'>,</span> <span class='hs-str'>"max"</span><span class='hs-layout'>,</span> <span class='hs-str'>"min"</span><span class='hs-layout'>,</span> <span class='hs-str'>"name"</span><span class='hs-layout'>,</span> <span class='hs-str'>"offset"</span><span class='hs-layout'>,</span>
<a name="line-206"></a>    <span class='hs-str'>"opacity"</span><span class='hs-layout'>,</span> <span class='hs-str'>"orient"</span><span class='hs-layout'>,</span> <span class='hs-str'>"origin"</span><span class='hs-layout'>,</span> <span class='hs-str'>"overline-position"</span><span class='hs-layout'>,</span>
<a name="line-207"></a>    <span class='hs-str'>"overline-thickness"</span><span class='hs-layout'>,</span> <span class='hs-str'>"panose-1"</span><span class='hs-layout'>,</span> <span class='hs-str'>"path"</span><span class='hs-layout'>,</span> <span class='hs-str'>"pathLength"</span><span class='hs-layout'>,</span> <span class='hs-str'>"points"</span><span class='hs-layout'>,</span>
<a name="line-208"></a>    <span class='hs-str'>"preserveAspectRatio"</span><span class='hs-layout'>,</span> <span class='hs-str'>"r"</span><span class='hs-layout'>,</span> <span class='hs-str'>"refX"</span><span class='hs-layout'>,</span> <span class='hs-str'>"refY"</span><span class='hs-layout'>,</span> <span class='hs-str'>"repeatCount"</span><span class='hs-layout'>,</span>
<a name="line-209"></a>    <span class='hs-str'>"repeatDur"</span><span class='hs-layout'>,</span> <span class='hs-str'>"requiredExtensions"</span><span class='hs-layout'>,</span> <span class='hs-str'>"requiredFeatures"</span><span class='hs-layout'>,</span> <span class='hs-str'>"restart"</span><span class='hs-layout'>,</span>
<a name="line-210"></a>    <span class='hs-str'>"rotate"</span><span class='hs-layout'>,</span> <span class='hs-str'>"rx"</span><span class='hs-layout'>,</span> <span class='hs-str'>"ry"</span><span class='hs-layout'>,</span> <span class='hs-str'>"slope"</span><span class='hs-layout'>,</span> <span class='hs-str'>"stemh"</span><span class='hs-layout'>,</span> <span class='hs-str'>"stemv"</span><span class='hs-layout'>,</span> <span class='hs-str'>"stop-color"</span><span class='hs-layout'>,</span>
<a name="line-211"></a>    <span class='hs-str'>"stop-opacity"</span><span class='hs-layout'>,</span> <span class='hs-str'>"strikethrough-position"</span><span class='hs-layout'>,</span> <span class='hs-str'>"strikethrough-thickness"</span><span class='hs-layout'>,</span>
<a name="line-212"></a>    <span class='hs-str'>"stroke"</span><span class='hs-layout'>,</span> <span class='hs-str'>"stroke-dasharray"</span><span class='hs-layout'>,</span> <span class='hs-str'>"stroke-dashoffset"</span><span class='hs-layout'>,</span> <span class='hs-str'>"stroke-linecap"</span><span class='hs-layout'>,</span>
<a name="line-213"></a>    <span class='hs-str'>"stroke-linejoin"</span><span class='hs-layout'>,</span> <span class='hs-str'>"stroke-miterlimit"</span><span class='hs-layout'>,</span> <span class='hs-str'>"stroke-opacity"</span><span class='hs-layout'>,</span>
<a name="line-214"></a>    <span class='hs-str'>"stroke-width"</span><span class='hs-layout'>,</span> <span class='hs-str'>"systemLanguage"</span><span class='hs-layout'>,</span> <span class='hs-str'>"target"</span><span class='hs-layout'>,</span> <span class='hs-str'>"text-anchor"</span><span class='hs-layout'>,</span> <span class='hs-str'>"to"</span><span class='hs-layout'>,</span>
<a name="line-215"></a>    <span class='hs-str'>"transform"</span><span class='hs-layout'>,</span> <span class='hs-str'>"type"</span><span class='hs-layout'>,</span> <span class='hs-str'>"u1"</span><span class='hs-layout'>,</span> <span class='hs-str'>"u2"</span><span class='hs-layout'>,</span> <span class='hs-str'>"underline-position"</span><span class='hs-layout'>,</span>
<a name="line-216"></a>    <span class='hs-str'>"underline-thickness"</span><span class='hs-layout'>,</span> <span class='hs-str'>"unicode"</span><span class='hs-layout'>,</span> <span class='hs-str'>"unicode-range"</span><span class='hs-layout'>,</span> <span class='hs-str'>"units-per-em"</span><span class='hs-layout'>,</span>
<a name="line-217"></a>    <span class='hs-str'>"values"</span><span class='hs-layout'>,</span> <span class='hs-str'>"version"</span><span class='hs-layout'>,</span> <span class='hs-str'>"viewBox"</span><span class='hs-layout'>,</span> <span class='hs-str'>"visibility"</span><span class='hs-layout'>,</span> <span class='hs-str'>"width"</span><span class='hs-layout'>,</span> <span class='hs-str'>"widths"</span><span class='hs-layout'>,</span> <span class='hs-str'>"x"</span><span class='hs-layout'>,</span>
<a name="line-218"></a>    <span class='hs-str'>"x-height"</span><span class='hs-layout'>,</span> <span class='hs-str'>"x1"</span><span class='hs-layout'>,</span> <span class='hs-str'>"x2"</span><span class='hs-layout'>,</span> <span class='hs-str'>"xlink:actuate"</span><span class='hs-layout'>,</span> <span class='hs-str'>"xlink:arcrole"</span><span class='hs-layout'>,</span>
<a name="line-219"></a>    <span class='hs-str'>"xlink:href"</span><span class='hs-layout'>,</span> <span class='hs-str'>"xlink:role"</span><span class='hs-layout'>,</span> <span class='hs-str'>"xlink:show"</span><span class='hs-layout'>,</span> <span class='hs-str'>"xlink:title"</span><span class='hs-layout'>,</span> <span class='hs-str'>"xlink:type"</span><span class='hs-layout'>,</span>
<a name="line-220"></a>    <span class='hs-str'>"xml:base"</span><span class='hs-layout'>,</span> <span class='hs-str'>"xml:lang"</span><span class='hs-layout'>,</span> <span class='hs-str'>"xml:space"</span><span class='hs-layout'>,</span> <span class='hs-str'>"xmlns"</span><span class='hs-layout'>,</span> <span class='hs-str'>"xmlns:xlink"</span><span class='hs-layout'>,</span> <span class='hs-str'>"y"</span><span class='hs-layout'>,</span>
<a name="line-221"></a>    <span class='hs-str'>"y1"</span><span class='hs-layout'>,</span> <span class='hs-str'>"y2"</span><span class='hs-layout'>,</span> <span class='hs-str'>"zoomAndPan"</span><span class='hs-keyglyph'>]</span>
<a name="line-222"></a>
<a name="line-223"></a><a name="svg_attr_val_allows_ref"></a><span class='hs-comment'>-- the values for these need to be escaped</span>
<a name="line-224"></a><span class='hs-definition'>svg_attr_val_allows_ref</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-225"></a><span class='hs-definition'>svg_attr_val_allows_ref</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"clip-path"</span><span class='hs-layout'>,</span> <span class='hs-str'>"color-profile"</span><span class='hs-layout'>,</span> <span class='hs-str'>"cursor"</span><span class='hs-layout'>,</span> <span class='hs-str'>"fill"</span><span class='hs-layout'>,</span>
<a name="line-226"></a>    <span class='hs-str'>"filter"</span><span class='hs-layout'>,</span> <span class='hs-str'>"marker"</span><span class='hs-layout'>,</span> <span class='hs-str'>"marker-start"</span><span class='hs-layout'>,</span> <span class='hs-str'>"marker-mid"</span><span class='hs-layout'>,</span> <span class='hs-str'>"marker-end"</span><span class='hs-layout'>,</span>
<a name="line-227"></a>    <span class='hs-str'>"mask"</span><span class='hs-layout'>,</span> <span class='hs-str'>"stroke"</span><span class='hs-keyglyph'>]</span>
<a name="line-228"></a>
<a name="line-229"></a><a name="svg_allow_local_href"></a><span class='hs-definition'>svg_allow_local_href</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-230"></a><span class='hs-definition'>svg_allow_local_href</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"altGlyph"</span><span class='hs-layout'>,</span> <span class='hs-str'>"animate"</span><span class='hs-layout'>,</span> <span class='hs-str'>"animateColor"</span><span class='hs-layout'>,</span>
<a name="line-231"></a>    <span class='hs-str'>"animateMotion"</span><span class='hs-layout'>,</span> <span class='hs-str'>"animateTransform"</span><span class='hs-layout'>,</span> <span class='hs-str'>"cursor"</span><span class='hs-layout'>,</span> <span class='hs-str'>"feImage"</span><span class='hs-layout'>,</span> <span class='hs-str'>"filter"</span><span class='hs-layout'>,</span>
<a name="line-232"></a>    <span class='hs-str'>"linearGradient"</span><span class='hs-layout'>,</span> <span class='hs-str'>"pattern"</span><span class='hs-layout'>,</span> <span class='hs-str'>"radialGradient"</span><span class='hs-layout'>,</span> <span class='hs-str'>"textpath"</span><span class='hs-layout'>,</span> <span class='hs-str'>"tref"</span><span class='hs-layout'>,</span>
<a name="line-233"></a>    <span class='hs-str'>"set"</span><span class='hs-layout'>,</span> <span class='hs-str'>"use"</span><span class='hs-keyglyph'>]</span>
<a name="line-234"></a>
<a name="line-235"></a><span class='hs-comment'>{- style value (css) filtering not implemented
<a name="line-236"></a> -
<a name="line-237"></a> - this is used for css filtering
<a name="line-238"></a>allowed_svg_properties = fromList acceptable_svg_properties
<a name="line-239"></a>acceptable_svg_properties = [ "fill", "fill-opacity", "fill-rule",
<a name="line-240"></a>    "stroke", "stroke-width", "stroke-linecap", "stroke-linejoin",
<a name="line-241"></a>    "stroke-opacity"]
<a name="line-242"></a>
<a name="line-243"></a>
<a name="line-244"></a>allowed_css_properties = fromList acceptable_css_properties
<a name="line-245"></a>allowed_css_keywords = fromList acceptable_css_keywords
<a name="line-246"></a>acceptable_css_properties = ["azimuth", "background-color",
<a name="line-247"></a>    "border-bottom-color", "border-collapse", "border-color",
<a name="line-248"></a>    "border-left-color", "border-right-color", "border-top-color", "clear",
<a name="line-249"></a>    "color", "cursor", "direction", "display", "elevation", "float", "font",
<a name="line-250"></a>    "font-family", "font-size", "font-style", "font-variant", "font-weight",
<a name="line-251"></a>    "height", "letter-spacing", "line-height", "overflow", "pause",
<a name="line-252"></a>    "pause-after", "pause-before", "pitch", "pitch-range", "richness",
<a name="line-253"></a>    "speak", "speak-header", "speak-numeral", "speak-punctuation",
<a name="line-254"></a>    "speech-rate", "stress", "text-align", "text-decoration", "text-indent",
<a name="line-255"></a>    "unicode-bidi", "vertical-align", "voice-family", "volume",
<a name="line-256"></a>    "white-space", "width"]
<a name="line-257"></a>acceptable_css_keywords = ["auto", "aqua", "black", "block", "blue",
<a name="line-258"></a>    "bold", "both", "bottom", "brown", "center", "collapse", "dashed",
<a name="line-259"></a>    "dotted", "fuchsia", "gray", "green", "!important", "italic", "left",
<a name="line-260"></a>    "lime", "maroon", "medium", "none", "navy", "normal", "nowrap", "olive",
<a name="line-261"></a>    "pointer", "purple", "red", "right", "solid", "silver", "teal", "top",
<a name="line-262"></a>    "transparent", "underline", "white", "yellow"]
<a name="line-263"></a>-}</span>
</pre></body>
</html>