<?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) => a -> 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 <<a href="http://github.com/gregwebs/haskell-xss-sanitize">http://github.com/gregwebs/haskell-xss-sanitize</a>> 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'>-></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'>-></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 <<a href="http://github.com/gregwebs/haskell-xss-sanitize">http://github.com/gregwebs/haskell-xss-sanitize</a>> 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'>-></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'>-></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'>-></span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></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'>-></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'>-- <img><img> converts to <img />, <a/> converts to <a></a></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>&&</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'>-></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'>-></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'>-></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'>-></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>