hxt-8.0.0: doc/hdoc/src/Text-XML-HXT-Arrow-Pickle-DTD.html
<!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>Haskell Code by HsColour</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='comment'>-- ------------------------------------------------------------</span>
<a name="line-2"></a>
<a name="line-3"></a><span class='comment'>{- |
<a name="line-4"></a> Module : Text.XML.HXT.Arrow.Pickle.DTD
<a name="line-5"></a> Copyright : Copyright (C) 2005 Uwe Schmidt
<a name="line-6"></a> License : MIT
<a name="line-7"></a>
<a name="line-8"></a> Maintainer : Uwe Schmidt (uwe@fh-wedel.de)
<a name="line-9"></a> Stability : experimental
<a name="line-10"></a> Portability: portable
<a name="line-11"></a> Version : $Id$
<a name="line-12"></a>
<a name="line-13"></a>Functions for converting a pickler schema
<a name="line-14"></a>into a DTD
<a name="line-15"></a>
<a name="line-16"></a>-}</span>
<a name="line-17"></a>
<a name="line-18"></a><span class='comment'>-- ------------------------------------------------------------</span>
<a name="line-19"></a>
<a name="line-20"></a><span class='keyword'>module</span> <span class='conid'>Text</span><span class='varop'>.</span><span class='conid'>XML</span><span class='varop'>.</span><span class='conid'>HXT</span><span class='varop'>.</span><span class='conid'>Arrow</span><span class='varop'>.</span><span class='conid'>Pickle</span><span class='varop'>.</span><span class='conid'>DTD</span>
<a name="line-21"></a><span class='keyword'>where</span>
<a name="line-22"></a>
<a name="line-23"></a><span class='keyword'>import</span> <span class='conid'>Data</span><span class='varop'>.</span><span class='conid'>Maybe</span>
<a name="line-24"></a>
<a name="line-25"></a><span class='keyword'>import</span> <span class='keyword'>qualified</span> <span class='conid'>Text</span><span class='varop'>.</span><span class='conid'>XML</span><span class='varop'>.</span><span class='conid'>HXT</span><span class='varop'>.</span><span class='conid'>DOM</span><span class='varop'>.</span><span class='conid'>XmlNode</span> <span class='keyword'>as</span> <span class='conid'>XN</span>
<a name="line-26"></a>
<a name="line-27"></a><span class='keyword'>import</span> <span class='conid'>Text</span><span class='varop'>.</span><span class='conid'>XML</span><span class='varop'>.</span><span class='conid'>HXT</span><span class='varop'>.</span><span class='conid'>DOM</span><span class='varop'>.</span><span class='conid'>Interface</span>
<a name="line-28"></a><span class='keyword'>import</span> <span class='conid'>Text</span><span class='varop'>.</span><span class='conid'>XML</span><span class='varop'>.</span><span class='conid'>HXT</span><span class='varop'>.</span><span class='conid'>Arrow</span><span class='varop'>.</span><span class='conid'>Pickle</span><span class='varop'>.</span><span class='conid'>Schema</span>
<a name="line-29"></a><span class='keyword'>import</span> <span class='conid'>Text</span><span class='varop'>.</span><span class='conid'>XML</span><span class='varop'>.</span><span class='conid'>HXT</span><span class='varop'>.</span><span class='conid'>RelaxNG</span><span class='varop'>.</span><span class='conid'>XmlSchema</span><span class='varop'>.</span><span class='conid'>DataTypeLibW3C</span>
<a name="line-30"></a>
<a name="line-31"></a><span class='comment'>-- ------------------------------------------------------------</span>
<a name="line-32"></a>
<a name="line-33"></a><a name="DTDdescr"></a><span class='keyword'>data</span> <span class='conid'>DTDdescr</span> <span class='keyglyph'>=</span> <span class='conid'>DTDdescr</span> <span class='conid'>Name</span> <span class='conid'>Schemas</span> <span class='keyglyph'>[</span><span class='layout'>(</span><span class='conid'>Name</span><span class='layout'>,</span><span class='conid'>Schemas</span><span class='layout'>)</span><span class='keyglyph'>]</span>
<a name="line-34"></a>
<a name="line-35"></a><span class='keyword'>instance</span> <span class='conid'>Show</span> <span class='conid'>DTDdescr</span> <span class='keyword'>where</span>
<a name="line-36"></a> <span class='varid'>show</span> <span class='layout'>(</span><span class='conid'>DTDdescr</span> <span class='varid'>n</span> <span class='varid'>es</span> <span class='keyword'>as</span><span class='layout'>)</span>
<a name="line-37"></a> <span class='keyglyph'>=</span> <span class='str'>"root element: "</span> <span class='varop'>++</span> <span class='varid'>n</span> <span class='varop'>++</span> <span class='str'>"\n"</span>
<a name="line-38"></a> <span class='varop'>++</span>
<a name="line-39"></a> <span class='str'>"elements:\n"</span>
<a name="line-40"></a> <span class='varop'>++</span>
<a name="line-41"></a> <span class='varid'>concatMap</span> <span class='layout'>(</span><span class='layout'>(</span><span class='varop'>++</span> <span class='str'>"\n"</span><span class='layout'>)</span> <span class='varop'>.</span><span class='varid'>show</span><span class='layout'>)</span> <span class='varid'>es</span>
<a name="line-42"></a> <span class='varop'>++</span>
<a name="line-43"></a> <span class='str'>"attributes:\n"</span>
<a name="line-44"></a> <span class='varop'>++</span>
<a name="line-45"></a> <span class='varid'>concatMap</span> <span class='layout'>(</span><span class='layout'>(</span><span class='varop'>++</span> <span class='str'>"\n"</span><span class='layout'>)</span> <span class='varop'>.</span> <span class='varid'>showAttr</span><span class='layout'>)</span> <span class='keyword'>as</span>
<a name="line-46"></a> <span class='keyword'>where</span>
<a name="line-47"></a> <span class='varid'>showAttr</span> <span class='layout'>(</span><span class='varid'>n1</span><span class='layout'>,</span> <span class='varid'>sc</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>n1</span> <span class='varop'>++</span> <span class='str'>": "</span> <span class='varop'>++</span> <span class='varid'>show</span> <span class='varid'>sc</span>
<a name="line-48"></a>
<a name="line-49"></a><span class='comment'>-- ------------------------------------------------------------</span>
<a name="line-50"></a>
<a name="line-51"></a><span class='comment'>-- | convert a DTD descr into XmlTrees</span>
<a name="line-52"></a>
<a name="line-53"></a><a name="dtdDescrToXml"></a><span class='definition'>dtdDescrToXml</span> <span class='keyglyph'>::</span> <span class='conid'>DTDdescr</span> <span class='keyglyph'>-></span> <span class='conid'>XmlTrees</span>
<a name="line-54"></a><span class='definition'>dtdDescrToXml</span> <span class='layout'>(</span><span class='conid'>DTDdescr</span> <span class='varid'>rt</span> <span class='varid'>es</span> <span class='keyword'>as</span><span class='layout'>)</span>
<a name="line-55"></a> <span class='keyglyph'>=</span> <span class='varid'>checkErr</span> <span class='layout'>(</span><span class='varid'>null</span> <span class='varid'>rt</span><span class='layout'>)</span> <span class='str'>"no unique root element found in pickler DTD, add an \"xpElem\" pickler"</span>
<a name="line-56"></a> <span class='varop'>++</span>
<a name="line-57"></a> <span class='varid'>concatMap</span> <span class='layout'>(</span><span class='varid'>checkErr</span> <span class='conid'>True</span> <span class='varop'>.</span> <span class='layout'>(</span><span class='str'>"no element decl found in: "</span> <span class='varop'>++</span><span class='layout'>)</span> <span class='varop'>.</span> <span class='varid'>show</span><span class='layout'>)</span> <span class='layout'>(</span><span class='varid'>filter</span> <span class='layout'>(</span><span class='varid'>not</span> <span class='varop'>.</span> <span class='varid'>isScElem</span><span class='layout'>)</span> <span class='varid'>es</span><span class='layout'>)</span>
<a name="line-58"></a> <span class='varop'>++</span>
<a name="line-59"></a> <span class='varid'>concatMap</span> <span class='layout'>(</span><span class='varid'>uncurry</span> <span class='varid'>checkContentModell</span> <span class='varop'>.</span> <span class='keyglyph'>\</span> <span class='layout'>(</span><span class='conid'>Element</span> <span class='varid'>n</span> <span class='varid'>sc</span><span class='layout'>)</span> <span class='keyglyph'>-></span> <span class='layout'>(</span><span class='varid'>n</span><span class='layout'>,</span><span class='varid'>sc</span><span class='layout'>)</span><span class='layout'>)</span> <span class='varid'>es1</span>
<a name="line-60"></a> <span class='varop'>++</span>
<a name="line-61"></a> <span class='varid'>concatMap</span> <span class='layout'>(</span><span class='varid'>uncurry</span> <span class='varid'>checkAttrModell</span><span class='layout'>)</span> <span class='keyword'>as</span>
<a name="line-62"></a> <span class='varop'>++</span>
<a name="line-63"></a> <span class='keyglyph'>[</span> <span class='conid'>XN</span><span class='varop'>.</span><span class='varid'>mkDTDElem</span> <span class='conid'>DOCTYPE</span> <span class='varid'>docAttrs</span> <span class='layout'>(</span> <span class='varid'>concatMap</span> <span class='varid'>elemDTD</span> <span class='varid'>es1</span>
<a name="line-64"></a> <span class='varop'>++</span>
<a name="line-65"></a> <span class='varid'>concatMap</span> <span class='layout'>(</span><span class='varid'>uncurry</span> <span class='varid'>attrDTDs</span><span class='layout'>)</span> <span class='keyword'>as</span>
<a name="line-66"></a> <span class='layout'>)</span> <span class='keyglyph'>]</span>
<a name="line-67"></a> <span class='keyword'>where</span>
<a name="line-68"></a> <span class='varid'>es1</span> <span class='keyglyph'>=</span> <span class='varid'>filter</span> <span class='varid'>isScElem</span> <span class='varid'>es</span>
<a name="line-69"></a>
<a name="line-70"></a> <span class='varid'>docAttrs</span> <span class='keyglyph'>=</span> <span class='keyglyph'>[</span><span class='layout'>(</span><span class='varid'>a_name</span><span class='layout'>,</span> <span class='keyword'>if</span> <span class='varid'>null</span> <span class='varid'>rt</span> <span class='keyword'>then</span> <span class='str'>"no-unique-root-element-found"</span> <span class='keyword'>else</span> <span class='varid'>rt</span><span class='layout'>)</span><span class='keyglyph'>]</span>
<a name="line-71"></a>
<a name="line-72"></a> <span class='varid'>elemDTD</span> <span class='layout'>(</span><span class='conid'>Element</span> <span class='varid'>n</span> <span class='varid'>sc</span><span class='layout'>)</span>
<a name="line-73"></a> <span class='keyglyph'>|</span> <span class='varid'>lookup1</span> <span class='varid'>a_type</span> <span class='varid'>al</span> <span class='varop'>==</span> <span class='str'>"unknown"</span>
<a name="line-74"></a> <span class='keyglyph'>=</span> <span class='varid'>cl</span>
<a name="line-75"></a> <span class='keyglyph'>|</span> <span class='varid'>otherwise</span>
<a name="line-76"></a> <span class='keyglyph'>=</span> <span class='keyglyph'>[</span> <span class='conid'>XN</span><span class='varop'>.</span><span class='varid'>mkDTDElem</span> <span class='conid'>ELEMENT</span> <span class='layout'>(</span><span class='layout'>(</span><span class='varid'>a_name</span><span class='layout'>,</span> <span class='varid'>n</span><span class='layout'>)</span> <span class='conop'>:</span> <span class='varid'>al</span><span class='layout'>)</span> <span class='varid'>cl</span> <span class='keyglyph'>]</span>
<a name="line-77"></a> <span class='keyword'>where</span>
<a name="line-78"></a> <span class='layout'>(</span><span class='varid'>al</span><span class='layout'>,</span> <span class='varid'>cl</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>scContToXml</span> <span class='varid'>sc</span>
<a name="line-79"></a> <span class='varid'>elemDTD</span> <span class='keyword'>_</span>
<a name="line-80"></a> <span class='keyglyph'>=</span> <span class='varid'>error</span> <span class='str'>"illegal case in elemDTD"</span>
<a name="line-81"></a>
<a name="line-82"></a> <span class='varid'>attrDTDs</span> <span class='varid'>en</span> <span class='keyglyph'>=</span> <span class='varid'>concatMap</span> <span class='layout'>(</span><span class='varid'>attrDTD</span> <span class='varid'>en</span><span class='layout'>)</span>
<a name="line-83"></a> <span class='varid'>attrDTD</span> <span class='varid'>en</span> <span class='layout'>(</span><span class='conid'>Attribute</span> <span class='varid'>an</span> <span class='varid'>sc</span><span class='layout'>)</span>
<a name="line-84"></a> <span class='keyglyph'>=</span> <span class='keyglyph'>[</span> <span class='conid'>XN</span><span class='varop'>.</span><span class='varid'>mkDTDElem</span> <span class='conid'>ATTLIST</span> <span class='layout'>(</span><span class='layout'>(</span><span class='varid'>a_name</span><span class='layout'>,</span> <span class='varid'>en</span><span class='layout'>)</span> <span class='conop'>:</span> <span class='layout'>(</span><span class='varid'>a_value</span><span class='layout'>,</span> <span class='varid'>an</span><span class='layout'>)</span> <span class='conop'>:</span> <span class='varid'>al</span><span class='layout'>)</span> <span class='varid'>cl</span> <span class='keyglyph'>]</span>
<a name="line-85"></a> <span class='keyword'>where</span>
<a name="line-86"></a> <span class='layout'>(</span><span class='varid'>al</span><span class='layout'>,</span> <span class='varid'>cl</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>scAttrToXml</span> <span class='varid'>sc</span>
<a name="line-87"></a> <span class='varid'>attrDTD</span> <span class='keyword'>_</span> <span class='keyword'>_</span> <span class='keyglyph'>=</span> <span class='varid'>error</span> <span class='str'>"illegal case in attrDTD"</span>
<a name="line-88"></a>
<a name="line-89"></a>
<a name="line-90"></a><a name="checkAttrModell"></a><span class='definition'>checkAttrModell</span> <span class='keyglyph'>::</span> <span class='conid'>Name</span> <span class='keyglyph'>-></span> <span class='conid'>Schemas</span> <span class='keyglyph'>-></span> <span class='conid'>XmlTrees</span>
<a name="line-91"></a><span class='definition'>checkAttrModell</span> <span class='varid'>n</span> <span class='keyglyph'>=</span> <span class='varid'>concatMap</span> <span class='layout'>(</span><span class='varid'>checkAM</span> <span class='varid'>n</span><span class='layout'>)</span>
<a name="line-92"></a>
<a name="line-93"></a><a name="checkAM"></a><span class='definition'>checkAM</span> <span class='keyglyph'>::</span> <span class='conid'>Name</span> <span class='keyglyph'>-></span> <span class='conid'>Schema</span> <span class='keyglyph'>-></span> <span class='conid'>XmlTrees</span>
<a name="line-94"></a><span class='definition'>checkAM</span> <span class='varid'>en</span> <span class='layout'>(</span><span class='conid'>Attribute</span> <span class='varid'>an</span> <span class='varid'>sc</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>checkAMC</span> <span class='varid'>en</span> <span class='varid'>an</span> <span class='varid'>sc</span>
<a name="line-95"></a><span class='definition'>checkAM</span> <span class='keyword'>_</span> <span class='keyword'>_</span> <span class='keyglyph'>=</span> <span class='conid'>[]</span>
<a name="line-96"></a>
<a name="line-97"></a><a name="checkAMC"></a><span class='definition'>checkAMC</span> <span class='keyglyph'>::</span> <span class='conid'>Name</span> <span class='keyglyph'>-></span> <span class='conid'>Name</span> <span class='keyglyph'>-></span> <span class='conid'>Schema</span> <span class='keyglyph'>-></span> <span class='conid'>XmlTrees</span>
<a name="line-98"></a><span class='definition'>checkAMC</span> <span class='sel'>_en</span> <span class='sel'>_an</span> <span class='layout'>(</span><span class='conid'>CharData</span> <span class='keyword'>_</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='conid'>[]</span>
<a name="line-99"></a><span class='definition'>checkAMC</span> <span class='varid'>en</span> <span class='varid'>an</span> <span class='varid'>sc</span>
<a name="line-100"></a> <span class='keyglyph'>|</span> <span class='varid'>isScCharData</span> <span class='varid'>sc</span> <span class='keyglyph'>=</span> <span class='conid'>[]</span>
<a name="line-101"></a> <span class='keyglyph'>|</span> <span class='varid'>isScList</span> <span class='varid'>sc</span>
<a name="line-102"></a> <span class='varop'>&&</span>
<a name="line-103"></a> <span class='layout'>(</span><span class='varid'>sc_1</span> <span class='varid'>sc</span> <span class='varop'>==</span> <span class='varid'>scNmtoken</span><span class='layout'>)</span>
<a name="line-104"></a> <span class='keyglyph'>=</span> <span class='conid'>[]</span>
<a name="line-105"></a> <span class='keyglyph'>|</span> <span class='varid'>isScOpt</span> <span class='varid'>sc</span> <span class='keyglyph'>=</span> <span class='varid'>checkAMC</span> <span class='varid'>en</span> <span class='varid'>an</span> <span class='layout'>(</span><span class='varid'>sc_1</span> <span class='varid'>sc</span><span class='layout'>)</span>
<a name="line-106"></a> <span class='keyglyph'>|</span> <span class='varid'>otherwise</span> <span class='keyglyph'>=</span> <span class='varid'>foundErr</span>
<a name="line-107"></a> <span class='layout'>(</span> <span class='str'>"weird attribute type found for attribute "</span>
<a name="line-108"></a> <span class='varop'>++</span> <span class='varid'>show</span> <span class='varid'>an</span>
<a name="line-109"></a> <span class='varop'>++</span> <span class='str'>" for element "</span>
<a name="line-110"></a> <span class='varop'>++</span> <span class='varid'>show</span> <span class='varid'>en</span>
<a name="line-111"></a> <span class='varop'>++</span> <span class='str'>"\n\t(internal structure: "</span> <span class='varop'>++</span> <span class='varid'>show</span> <span class='varid'>sc</span> <span class='varop'>++</span> <span class='str'>")"</span>
<a name="line-112"></a> <span class='varop'>++</span> <span class='str'>"\n\thint: create an element instead of an attribute for "</span>
<a name="line-113"></a> <span class='varop'>++</span> <span class='varid'>show</span> <span class='varid'>an</span>
<a name="line-114"></a> <span class='layout'>)</span>
<a name="line-115"></a>
<a name="line-116"></a><span class='comment'>-- checkContentModell1 n sc = foundErr (n ++ " : " ++ show sc) ++ checkContentModell n sc</span>
<a name="line-117"></a>
<a name="line-118"></a><a name="checkContentModell"></a><span class='definition'>checkContentModell</span> <span class='keyglyph'>::</span> <span class='conid'>Name</span> <span class='keyglyph'>-></span> <span class='conid'>Schema</span> <span class='keyglyph'>-></span> <span class='conid'>XmlTrees</span>
<a name="line-119"></a>
<a name="line-120"></a><span class='definition'>checkContentModell</span> <span class='keyword'>_</span> <span class='conid'>Any</span>
<a name="line-121"></a> <span class='keyglyph'>=</span> <span class='conid'>[]</span>
<a name="line-122"></a>
<a name="line-123"></a><span class='definition'>checkContentModell</span> <span class='keyword'>_</span> <span class='layout'>(</span><span class='conid'>ElemRef</span> <span class='keyword'>_</span><span class='layout'>)</span>
<a name="line-124"></a> <span class='keyglyph'>=</span> <span class='conid'>[]</span>
<a name="line-125"></a>
<a name="line-126"></a><span class='definition'>checkContentModell</span> <span class='keyword'>_</span> <span class='layout'>(</span><span class='conid'>CharData</span> <span class='keyword'>_</span><span class='layout'>)</span>
<a name="line-127"></a> <span class='keyglyph'>=</span> <span class='conid'>[]</span>
<a name="line-128"></a>
<a name="line-129"></a><span class='definition'>checkContentModell</span> <span class='keyword'>_</span> <span class='layout'>(</span><span class='conid'>Seq</span> <span class='conid'>[]</span><span class='layout'>)</span>
<a name="line-130"></a> <span class='keyglyph'>=</span> <span class='conid'>[]</span>
<a name="line-131"></a>
<a name="line-132"></a><span class='definition'>checkContentModell</span> <span class='varid'>n</span> <span class='layout'>(</span><span class='conid'>Seq</span> <span class='varid'>scs</span><span class='layout'>)</span>
<a name="line-133"></a> <span class='keyglyph'>=</span> <span class='varid'>checkErr</span> <span class='varid'>pcDataInCM</span>
<a name="line-134"></a> <span class='layout'>(</span> <span class='str'>"PCDATA found in a sequence spec in the content modell for "</span>
<a name="line-135"></a> <span class='varop'>++</span> <span class='varid'>show</span> <span class='varid'>n</span>
<a name="line-136"></a> <span class='varop'>++</span> <span class='str'>"\n\thint: create an element for this data"</span>
<a name="line-137"></a> <span class='layout'>)</span>
<a name="line-138"></a> <span class='varop'>++</span>
<a name="line-139"></a> <span class='varid'>checkErr</span> <span class='varid'>somethingElseInCM</span>
<a name="line-140"></a> <span class='layout'>(</span> <span class='str'>"something weired found in a sequence spec in the content modell for "</span>
<a name="line-141"></a> <span class='varop'>++</span> <span class='varid'>show</span> <span class='varid'>n</span>
<a name="line-142"></a> <span class='layout'>)</span>
<a name="line-143"></a> <span class='varop'>++</span>
<a name="line-144"></a> <span class='varid'>concatMap</span> <span class='layout'>(</span><span class='varid'>checkContentModell</span> <span class='varid'>n</span><span class='layout'>)</span> <span class='varid'>scs</span>
<a name="line-145"></a> <span class='keyword'>where</span>
<a name="line-146"></a> <span class='varid'>pcDataInCM</span> <span class='keyglyph'>=</span> <span class='varid'>any</span> <span class='varid'>isScCharData</span> <span class='varid'>scs</span>
<a name="line-147"></a> <span class='varid'>somethingElseInCM</span> <span class='keyglyph'>=</span> <span class='varid'>any</span> <span class='layout'>(</span><span class='keyglyph'>\</span> <span class='varid'>sc</span> <span class='keyglyph'>-></span> <span class='varid'>not</span> <span class='layout'>(</span><span class='varid'>isScSARE</span> <span class='varid'>sc</span><span class='layout'>)</span> <span class='varop'>&&</span> <span class='varid'>not</span> <span class='layout'>(</span><span class='varid'>isScCharData</span> <span class='varid'>sc</span><span class='layout'>)</span><span class='layout'>)</span> <span class='varid'>scs</span>
<a name="line-148"></a>
<a name="line-149"></a><span class='definition'>checkContentModell</span> <span class='varid'>n</span> <span class='layout'>(</span><span class='conid'>Alt</span> <span class='varid'>scs</span><span class='layout'>)</span>
<a name="line-150"></a> <span class='keyglyph'>=</span> <span class='varid'>checkErr</span> <span class='varid'>mixedCM</span>
<a name="line-151"></a> <span class='layout'>(</span> <span class='str'>"PCDATA mixed up with illegal content spec in mixed contents for "</span>
<a name="line-152"></a> <span class='varop'>++</span> <span class='varid'>show</span> <span class='varid'>n</span>
<a name="line-153"></a> <span class='varop'>++</span> <span class='str'>"\n\thint: create an element for this data"</span>
<a name="line-154"></a> <span class='layout'>)</span>
<a name="line-155"></a> <span class='varop'>++</span>
<a name="line-156"></a> <span class='varid'>concatMap</span> <span class='layout'>(</span><span class='varid'>checkContentModell</span> <span class='varid'>n</span><span class='layout'>)</span> <span class='varid'>scs</span>
<a name="line-157"></a> <span class='keyword'>where</span>
<a name="line-158"></a> <span class='varid'>mixedCM</span>
<a name="line-159"></a> <span class='keyglyph'>|</span> <span class='varid'>any</span> <span class='varid'>isScCharData</span> <span class='varid'>scs</span>
<a name="line-160"></a> <span class='keyglyph'>=</span> <span class='varid'>any</span> <span class='layout'>(</span><span class='varid'>not</span> <span class='varop'>.</span> <span class='varid'>isScElemRef</span><span class='layout'>)</span> <span class='varop'>.</span> <span class='varid'>filter</span> <span class='layout'>(</span><span class='varid'>not</span> <span class='varop'>.</span> <span class='varid'>isScCharData</span><span class='layout'>)</span> <span class='varop'>$</span> <span class='varid'>scs</span>
<a name="line-161"></a> <span class='keyglyph'>|</span> <span class='varid'>otherwise</span>
<a name="line-162"></a> <span class='keyglyph'>=</span> <span class='conid'>False</span>
<a name="line-163"></a>
<a name="line-164"></a><span class='definition'>checkContentModell</span> <span class='keyword'>_</span> <span class='layout'>(</span><span class='conid'>Rep</span> <span class='keyword'>_</span> <span class='keyword'>_</span> <span class='layout'>(</span><span class='conid'>ElemRef</span> <span class='keyword'>_</span><span class='layout'>)</span><span class='layout'>)</span>
<a name="line-165"></a> <span class='keyglyph'>=</span> <span class='conid'>[]</span>
<a name="line-166"></a>
<a name="line-167"></a><span class='definition'>checkContentModell</span> <span class='varid'>n</span> <span class='layout'>(</span><span class='conid'>Rep</span> <span class='keyword'>_</span> <span class='keyword'>_</span> <span class='varid'>sc</span><span class='keyglyph'>@</span><span class='layout'>(</span><span class='conid'>Seq</span> <span class='keyword'>_</span><span class='layout'>)</span><span class='layout'>)</span>
<a name="line-168"></a> <span class='keyglyph'>=</span> <span class='varid'>checkContentModell</span> <span class='varid'>n</span> <span class='varid'>sc</span>
<a name="line-169"></a>
<a name="line-170"></a><span class='definition'>checkContentModell</span> <span class='varid'>n</span> <span class='layout'>(</span><span class='conid'>Rep</span> <span class='keyword'>_</span> <span class='keyword'>_</span> <span class='varid'>sc</span><span class='keyglyph'>@</span><span class='layout'>(</span><span class='conid'>Alt</span> <span class='keyword'>_</span><span class='layout'>)</span><span class='layout'>)</span>
<a name="line-171"></a> <span class='keyglyph'>=</span> <span class='varid'>checkContentModell</span> <span class='varid'>n</span> <span class='varid'>sc</span>
<a name="line-172"></a>
<a name="line-173"></a><span class='definition'>checkContentModell</span> <span class='varid'>n</span> <span class='layout'>(</span><span class='conid'>Rep</span> <span class='keyword'>_</span> <span class='keyword'>_</span> <span class='keyword'>_</span><span class='layout'>)</span>
<a name="line-174"></a> <span class='keyglyph'>=</span> <span class='varid'>foundErr</span>
<a name="line-175"></a> <span class='layout'>(</span> <span class='str'>"illegal content spec found for "</span>
<a name="line-176"></a> <span class='varop'>++</span> <span class='varid'>show</span> <span class='varid'>n</span>
<a name="line-177"></a> <span class='layout'>)</span>
<a name="line-178"></a>
<a name="line-179"></a><span class='definition'>checkContentModell</span> <span class='keyword'>_</span> <span class='keyword'>_</span>
<a name="line-180"></a> <span class='keyglyph'>=</span> <span class='conid'>[]</span>
<a name="line-181"></a>
<a name="line-182"></a>
<a name="line-183"></a><a name="scContToXml"></a><span class='definition'>scContToXml</span> <span class='keyglyph'>::</span> <span class='conid'>Schema</span> <span class='keyglyph'>-></span> <span class='layout'>(</span><span class='conid'>Attributes</span><span class='layout'>,</span> <span class='conid'>XmlTrees</span><span class='layout'>)</span>
<a name="line-184"></a>
<a name="line-185"></a><span class='definition'>scContToXml</span> <span class='conid'>Any</span> <span class='keyglyph'>=</span> <span class='layout'>(</span> <span class='keyglyph'>[</span><span class='layout'>(</span><span class='varid'>a_type</span><span class='layout'>,</span> <span class='varid'>v_any</span><span class='layout'>)</span><span class='keyglyph'>]</span><span class='layout'>,</span> <span class='conid'>[]</span> <span class='layout'>)</span>
<a name="line-186"></a><span class='definition'>scContToXml</span> <span class='layout'>(</span><span class='conid'>CharData</span> <span class='keyword'>_</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='layout'>(</span> <span class='keyglyph'>[</span><span class='layout'>(</span><span class='varid'>a_type</span><span class='layout'>,</span> <span class='varid'>v_pcdata</span><span class='layout'>)</span><span class='keyglyph'>]</span><span class='layout'>,</span> <span class='conid'>[]</span> <span class='layout'>)</span>
<a name="line-187"></a><span class='definition'>scContToXml</span> <span class='layout'>(</span><span class='conid'>Seq</span> <span class='conid'>[]</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='layout'>(</span> <span class='keyglyph'>[</span><span class='layout'>(</span><span class='varid'>a_type</span><span class='layout'>,</span> <span class='varid'>v_empty</span><span class='layout'>)</span><span class='keyglyph'>]</span><span class='layout'>,</span> <span class='conid'>[]</span> <span class='layout'>)</span>
<a name="line-188"></a><span class='definition'>scContToXml</span> <span class='varid'>sc</span><span class='keyglyph'>@</span><span class='layout'>(</span><span class='conid'>ElemRef</span> <span class='keyword'>_</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>scContToXml</span> <span class='layout'>(</span><span class='conid'>Seq</span> <span class='keyglyph'>[</span><span class='varid'>sc</span><span class='keyglyph'>]</span><span class='layout'>)</span>
<a name="line-189"></a><span class='definition'>scContToXml</span> <span class='varid'>sc</span><span class='keyglyph'>@</span><span class='layout'>(</span><span class='conid'>Seq</span> <span class='keyword'>_</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='layout'>(</span> <span class='keyglyph'>[</span><span class='layout'>(</span><span class='varid'>a_type</span><span class='layout'>,</span> <span class='varid'>v_children</span><span class='layout'>)</span><span class='keyglyph'>]</span>
<a name="line-190"></a> <span class='layout'>,</span> <span class='varid'>scCont</span> <span class='conid'>[]</span> <span class='varid'>sc</span>
<a name="line-191"></a> <span class='layout'>)</span>
<a name="line-192"></a><span class='definition'>scContToXml</span> <span class='varid'>sc</span><span class='keyglyph'>@</span><span class='layout'>(</span><span class='conid'>Alt</span> <span class='varid'>sc1</span><span class='layout'>)</span>
<a name="line-193"></a> <span class='keyglyph'>|</span> <span class='varid'>isMixed</span> <span class='varid'>sc1</span> <span class='keyglyph'>=</span> <span class='layout'>(</span> <span class='keyglyph'>[</span><span class='layout'>(</span><span class='varid'>a_type</span><span class='layout'>,</span> <span class='varid'>v_mixed</span><span class='layout'>)</span><span class='keyglyph'>]</span>
<a name="line-194"></a> <span class='layout'>,</span> <span class='varid'>scCont</span> <span class='keyglyph'>[</span> <span class='layout'>(</span><span class='varid'>a_modifier</span><span class='layout'>,</span> <span class='str'>"*"</span><span class='layout'>)</span> <span class='keyglyph'>]</span> <span class='varid'>sc</span>
<a name="line-195"></a> <span class='layout'>)</span>
<a name="line-196"></a> <span class='keyglyph'>|</span> <span class='varid'>otherwise</span> <span class='keyglyph'>=</span> <span class='layout'>(</span> <span class='keyglyph'>[</span><span class='layout'>(</span><span class='varid'>a_type</span><span class='layout'>,</span> <span class='varid'>v_children</span><span class='layout'>)</span><span class='keyglyph'>]</span>
<a name="line-197"></a> <span class='layout'>,</span> <span class='varid'>scCont</span> <span class='conid'>[]</span> <span class='varid'>sc</span>
<a name="line-198"></a> <span class='layout'>)</span>
<a name="line-199"></a> <span class='keyword'>where</span>
<a name="line-200"></a> <span class='varid'>isMixed</span> <span class='keyglyph'>=</span> <span class='varid'>not</span> <span class='varop'>.</span> <span class='varid'>null</span> <span class='varop'>.</span> <span class='varid'>filter</span> <span class='varid'>isScCharData</span>
<a name="line-201"></a><span class='definition'>scContToXml</span> <span class='varid'>sc</span><span class='keyglyph'>@</span><span class='layout'>(</span><span class='conid'>Rep</span> <span class='keyword'>_</span> <span class='keyword'>_</span> <span class='keyword'>_</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='layout'>(</span> <span class='keyglyph'>[</span><span class='layout'>(</span><span class='varid'>a_type</span><span class='layout'>,</span> <span class='varid'>v_children</span><span class='layout'>)</span><span class='keyglyph'>]</span>
<a name="line-202"></a> <span class='layout'>,</span> <span class='varid'>scCont</span> <span class='conid'>[]</span> <span class='varid'>sc</span>
<a name="line-203"></a> <span class='layout'>)</span>
<a name="line-204"></a><span class='definition'>scContToXml</span> <span class='sel'>_sc</span> <span class='keyglyph'>=</span> <span class='layout'>(</span> <span class='keyglyph'>[</span><span class='layout'>(</span><span class='varid'>a_type</span><span class='layout'>,</span> <span class='varid'>v_any</span><span class='layout'>)</span><span class='keyglyph'>]</span> <span class='comment'>-- default: everything is allowed</span>
<a name="line-205"></a> <span class='layout'>,</span> <span class='conid'>[]</span>
<a name="line-206"></a> <span class='layout'>)</span>
<a name="line-207"></a>
<a name="line-208"></a><a name="scWrap"></a><span class='definition'>scWrap</span> <span class='keyglyph'>::</span> <span class='conid'>Schema</span> <span class='keyglyph'>-></span> <span class='conid'>Schema</span>
<a name="line-209"></a><span class='definition'>scWrap</span> <span class='varid'>sc</span><span class='keyglyph'>@</span><span class='layout'>(</span><span class='conid'>Alt</span> <span class='keyword'>_</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>sc</span>
<a name="line-210"></a><span class='definition'>scWrap</span> <span class='varid'>sc</span><span class='keyglyph'>@</span><span class='layout'>(</span><span class='conid'>Seq</span> <span class='keyword'>_</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>sc</span>
<a name="line-211"></a><span class='definition'>scWrap</span> <span class='varid'>sc</span><span class='keyglyph'>@</span><span class='layout'>(</span><span class='conid'>Rep</span> <span class='keyword'>_</span> <span class='keyword'>_</span> <span class='keyword'>_</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>sc</span>
<a name="line-212"></a><span class='definition'>scWrap</span> <span class='varid'>sc</span> <span class='keyglyph'>=</span> <span class='conid'>Seq</span> <span class='keyglyph'>[</span><span class='varid'>sc</span><span class='keyglyph'>]</span>
<a name="line-213"></a>
<a name="line-214"></a><a name="scCont"></a><span class='definition'>scCont</span> <span class='keyglyph'>::</span> <span class='conid'>Attributes</span> <span class='keyglyph'>-></span> <span class='conid'>Schema</span> <span class='keyglyph'>-></span> <span class='conid'>XmlTrees</span>
<a name="line-215"></a><span class='definition'>scCont</span> <span class='varid'>al</span> <span class='layout'>(</span><span class='conid'>Seq</span> <span class='varid'>scs</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>scConts</span> <span class='layout'>(</span><span class='layout'>(</span><span class='varid'>a_kind</span><span class='layout'>,</span> <span class='varid'>v_seq</span> <span class='layout'>)</span> <span class='conop'>:</span> <span class='varid'>al</span><span class='layout'>)</span> <span class='varid'>scs</span>
<a name="line-216"></a><span class='definition'>scCont</span> <span class='varid'>al</span> <span class='layout'>(</span><span class='conid'>Alt</span> <span class='varid'>scs</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>scConts</span> <span class='layout'>(</span><span class='layout'>(</span><span class='varid'>a_kind</span><span class='layout'>,</span> <span class='varid'>v_choice</span><span class='layout'>)</span> <span class='conop'>:</span> <span class='varid'>al</span><span class='layout'>)</span> <span class='varid'>scs</span>
<a name="line-217"></a><span class='definition'>scCont</span> <span class='varid'>al</span> <span class='layout'>(</span><span class='conid'>Rep</span> <span class='num'>0</span> <span class='layout'>(</span><span class='comment'>-</span><span class='num'>1</span><span class='layout'>)</span> <span class='varid'>sc</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>scCont</span> <span class='layout'>(</span><span class='layout'>(</span><span class='varid'>a_modifier</span><span class='layout'>,</span> <span class='str'>"*"</span><span class='layout'>)</span> <span class='conop'>:</span> <span class='varid'>al</span><span class='layout'>)</span> <span class='layout'>(</span><span class='varid'>scWrap</span> <span class='varid'>sc</span><span class='layout'>)</span>
<a name="line-218"></a><span class='definition'>scCont</span> <span class='varid'>al</span> <span class='layout'>(</span><span class='conid'>Rep</span> <span class='num'>1</span> <span class='layout'>(</span><span class='comment'>-</span><span class='num'>1</span><span class='layout'>)</span> <span class='varid'>sc</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>scCont</span> <span class='layout'>(</span><span class='layout'>(</span><span class='varid'>a_modifier</span><span class='layout'>,</span> <span class='str'>"+"</span><span class='layout'>)</span> <span class='conop'>:</span> <span class='varid'>al</span><span class='layout'>)</span> <span class='layout'>(</span><span class='varid'>scWrap</span> <span class='varid'>sc</span><span class='layout'>)</span>
<a name="line-219"></a><span class='definition'>scCont</span> <span class='varid'>al</span> <span class='layout'>(</span><span class='conid'>Rep</span> <span class='num'>0</span> <span class='num'>1</span> <span class='varid'>sc</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>scCont</span> <span class='layout'>(</span><span class='layout'>(</span><span class='varid'>a_modifier</span><span class='layout'>,</span> <span class='str'>"?"</span><span class='layout'>)</span> <span class='conop'>:</span> <span class='varid'>al</span><span class='layout'>)</span> <span class='layout'>(</span><span class='varid'>scWrap</span> <span class='varid'>sc</span><span class='layout'>)</span>
<a name="line-220"></a><span class='definition'>scCont</span> <span class='varid'>al</span> <span class='layout'>(</span><span class='conid'>ElemRef</span> <span class='varid'>n</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='keyglyph'>[</span><span class='conid'>XN</span><span class='varop'>.</span><span class='varid'>mkDTDElem</span> <span class='conid'>NAME</span> <span class='layout'>(</span><span class='layout'>(</span><span class='varid'>a_name</span><span class='layout'>,</span> <span class='varid'>n</span><span class='layout'>)</span> <span class='conop'>:</span> <span class='varid'>al</span><span class='layout'>)</span> <span class='conid'>[]</span><span class='keyglyph'>]</span>
<a name="line-221"></a><span class='definition'>scCont</span> <span class='keyword'>_</span> <span class='layout'>(</span><span class='conid'>CharData</span> <span class='keyword'>_</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='keyglyph'>[</span><span class='conid'>XN</span><span class='varop'>.</span><span class='varid'>mkDTDElem</span> <span class='conid'>NAME</span> <span class='keyglyph'>[</span><span class='layout'>(</span><span class='varid'>a_name</span><span class='layout'>,</span> <span class='str'>"#PCDATA"</span><span class='layout'>)</span><span class='keyglyph'>]</span> <span class='conid'>[]</span><span class='keyglyph'>]</span>
<a name="line-222"></a><span class='definition'>scCont</span> <span class='keyword'>_</span> <span class='sel'>_sc</span> <span class='keyglyph'>=</span> <span class='keyglyph'>[</span><span class='conid'>XN</span><span class='varop'>.</span><span class='varid'>mkDTDElem</span> <span class='conid'>NAME</span> <span class='keyglyph'>[</span><span class='layout'>(</span><span class='varid'>a_name</span><span class='layout'>,</span> <span class='str'>"bad-content-spec"</span><span class='layout'>)</span><span class='keyglyph'>]</span> <span class='conid'>[]</span><span class='keyglyph'>]</span> <span class='comment'>-- error case</span>
<a name="line-223"></a>
<a name="line-224"></a><a name="scConts"></a><span class='definition'>scConts</span> <span class='keyglyph'>::</span> <span class='conid'>Attributes</span> <span class='keyglyph'>-></span> <span class='conid'>Schemas</span> <span class='keyglyph'>-></span> <span class='conid'>XmlTrees</span>
<a name="line-225"></a><span class='definition'>scConts</span> <span class='varid'>al</span> <span class='varid'>scs</span> <span class='keyglyph'>=</span> <span class='keyglyph'>[</span><span class='conid'>XN</span><span class='varop'>.</span><span class='varid'>mkDTDElem</span> <span class='conid'>CONTENT</span> <span class='varid'>al</span> <span class='layout'>(</span><span class='varid'>concatMap</span> <span class='layout'>(</span><span class='varid'>scCont</span> <span class='conid'>[]</span><span class='layout'>)</span> <span class='varid'>scs</span><span class='layout'>)</span><span class='keyglyph'>]</span>
<a name="line-226"></a>
<a name="line-227"></a><a name="scAttrToXml"></a><span class='definition'>scAttrToXml</span> <span class='keyglyph'>::</span> <span class='conid'>Schema</span> <span class='keyglyph'>-></span> <span class='layout'>(</span><span class='conid'>Attributes</span><span class='layout'>,</span> <span class='conid'>XmlTrees</span><span class='layout'>)</span>
<a name="line-228"></a>
<a name="line-229"></a><span class='definition'>scAttrToXml</span> <span class='varid'>sc</span>
<a name="line-230"></a> <span class='keyglyph'>|</span> <span class='varid'>isScFixed</span> <span class='varid'>sc</span> <span class='keyglyph'>=</span> <span class='layout'>(</span> <span class='keyglyph'>[</span> <span class='layout'>(</span><span class='varid'>a_kind</span><span class='layout'>,</span> <span class='varid'>k_fixed</span><span class='layout'>)</span>
<a name="line-231"></a> <span class='layout'>,</span> <span class='layout'>(</span><span class='varid'>a_type</span><span class='layout'>,</span> <span class='varid'>k_cdata</span><span class='layout'>)</span>
<a name="line-232"></a> <span class='layout'>,</span> <span class='layout'>(</span><span class='varid'>a_default</span><span class='layout'>,</span> <span class='layout'>(</span><span class='varid'>xsdParam</span> <span class='varid'>xsd_enumeration</span> <span class='varid'>sc</span><span class='layout'>)</span><span class='layout'>)</span>
<a name="line-233"></a> <span class='keyglyph'>]</span>
<a name="line-234"></a> <span class='layout'>,</span> <span class='conid'>[]</span><span class='layout'>)</span>
<a name="line-235"></a> <span class='keyglyph'>|</span> <span class='varid'>isScEnum</span> <span class='varid'>sc</span> <span class='keyglyph'>=</span> <span class='layout'>(</span> <span class='keyglyph'>[</span> <span class='layout'>(</span><span class='varid'>a_kind</span><span class='layout'>,</span> <span class='varid'>k_required</span><span class='layout'>)</span>
<a name="line-236"></a> <span class='layout'>,</span> <span class='layout'>(</span><span class='varid'>a_type</span><span class='layout'>,</span> <span class='varid'>k_enumeration</span><span class='layout'>)</span>
<a name="line-237"></a> <span class='keyglyph'>]</span>
<a name="line-238"></a> <span class='layout'>,</span> <span class='varid'>map</span> <span class='layout'>(</span><span class='keyglyph'>\</span> <span class='varid'>n</span> <span class='keyglyph'>-></span> <span class='conid'>XN</span><span class='varop'>.</span><span class='varid'>mkDTDElem</span> <span class='conid'>NAME</span> <span class='keyglyph'>[</span><span class='layout'>(</span><span class='varid'>a_name</span><span class='layout'>,</span> <span class='varid'>n</span><span class='layout'>)</span><span class='keyglyph'>]</span> <span class='conid'>[]</span><span class='layout'>)</span> <span class='varid'>enums</span>
<a name="line-239"></a> <span class='layout'>)</span>
<a name="line-240"></a> <span class='keyglyph'>|</span> <span class='varid'>isScCharData</span> <span class='varid'>sc</span> <span class='keyglyph'>=</span> <span class='layout'>(</span> <span class='keyglyph'>[</span> <span class='layout'>(</span><span class='varid'>a_kind</span><span class='layout'>,</span> <span class='varid'>k_required</span><span class='layout'>)</span>
<a name="line-241"></a> <span class='layout'>,</span> <span class='layout'>(</span><span class='varid'>a_type</span><span class='layout'>,</span> <span class='varid'>d_type</span><span class='layout'>)</span>
<a name="line-242"></a> <span class='keyglyph'>]</span>
<a name="line-243"></a> <span class='layout'>,</span> <span class='conid'>[]</span><span class='layout'>)</span>
<a name="line-244"></a> <span class='keyglyph'>|</span> <span class='varid'>isScOpt</span> <span class='varid'>sc</span> <span class='keyglyph'>=</span> <span class='layout'>(</span><span class='varid'>addEntry</span> <span class='varid'>a_kind</span> <span class='varid'>k_implied</span> <span class='varid'>al</span><span class='layout'>,</span> <span class='varid'>cl</span><span class='layout'>)</span>
<a name="line-245"></a> <span class='keyglyph'>|</span> <span class='varid'>isScList</span> <span class='varid'>sc</span> <span class='keyglyph'>=</span> <span class='layout'>(</span><span class='varid'>addEntry</span> <span class='varid'>a_type</span> <span class='varid'>k_nmtokens</span> <span class='varid'>al</span><span class='layout'>,</span> <span class='varid'>cl</span><span class='layout'>)</span>
<a name="line-246"></a> <span class='keyglyph'>|</span> <span class='varid'>otherwise</span> <span class='keyglyph'>=</span> <span class='layout'>(</span> <span class='keyglyph'>[</span> <span class='layout'>(</span><span class='varid'>a_kind</span><span class='layout'>,</span> <span class='varid'>k_fixed</span><span class='layout'>)</span>
<a name="line-247"></a> <span class='layout'>,</span> <span class='layout'>(</span><span class='varid'>a_default</span><span class='layout'>,</span> <span class='str'>"bad-attribute-type: "</span> <span class='varop'>++</span> <span class='varid'>show</span> <span class='varid'>sc</span><span class='layout'>)</span>
<a name="line-248"></a> <span class='keyglyph'>]</span>
<a name="line-249"></a> <span class='layout'>,</span> <span class='conid'>[]</span> <span class='layout'>)</span>
<a name="line-250"></a> <span class='keyword'>where</span>
<a name="line-251"></a> <span class='layout'>(</span><span class='varid'>al</span><span class='layout'>,</span> <span class='varid'>cl</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>scAttrToXml</span> <span class='layout'>(</span><span class='varid'>sc_1</span> <span class='varid'>sc</span><span class='layout'>)</span>
<a name="line-252"></a> <span class='varid'>d_type</span>
<a name="line-253"></a> <span class='keyglyph'>|</span> <span class='varid'>sc</span> <span class='varop'>==</span> <span class='varid'>scNmtoken</span> <span class='keyglyph'>=</span> <span class='varid'>k_nmtoken</span>
<a name="line-254"></a> <span class='keyglyph'>|</span> <span class='varid'>otherwise</span> <span class='keyglyph'>=</span> <span class='varid'>k_cdata</span>
<a name="line-255"></a> <span class='varid'>enums</span> <span class='keyglyph'>=</span> <span class='varid'>words</span> <span class='varop'>.</span> <span class='varid'>xsdParam</span> <span class='varid'>xsd_enumeration</span> <span class='varop'>$</span> <span class='varid'>sc</span>
<a name="line-256"></a>
<a name="line-257"></a><a name="checkErr"></a><span class='definition'>checkErr</span> <span class='keyglyph'>::</span> <span class='conid'>Bool</span> <span class='keyglyph'>-></span> <span class='conid'>String</span> <span class='keyglyph'>-></span> <span class='conid'>XmlTrees</span>
<a name="line-258"></a><span class='definition'>checkErr</span> <span class='conid'>True</span> <span class='varid'>s</span> <span class='keyglyph'>=</span> <span class='keyglyph'>[</span><span class='conid'>XN</span><span class='varop'>.</span><span class='varid'>mkError</span> <span class='varid'>c_err</span> <span class='varid'>s</span><span class='keyglyph'>]</span>
<a name="line-259"></a><span class='definition'>checkErr</span> <span class='keyword'>_</span> <span class='keyword'>_</span> <span class='keyglyph'>=</span> <span class='conid'>[]</span>
<a name="line-260"></a>
<a name="line-261"></a><a name="foundErr"></a><span class='definition'>foundErr</span> <span class='keyglyph'>::</span> <span class='conid'>String</span> <span class='keyglyph'>-></span> <span class='conid'>XmlTrees</span>
<a name="line-262"></a><span class='definition'>foundErr</span> <span class='keyglyph'>=</span> <span class='varid'>checkErr</span> <span class='conid'>True</span>
<a name="line-263"></a>
<a name="line-264"></a><span class='comment'>-- ------------------------------------------------------------</span>
<a name="line-265"></a>
<a name="line-266"></a><span class='comment'>-- | convert a pickler schema into a DTD descr</span>
<a name="line-267"></a>
<a name="line-268"></a><a name="dtdDescr"></a><span class='definition'>dtdDescr</span> <span class='keyglyph'>::</span> <span class='conid'>Schema</span> <span class='keyglyph'>-></span> <span class='conid'>DTDdescr</span>
<a name="line-269"></a><span class='definition'>dtdDescr</span> <span class='varid'>sc</span>
<a name="line-270"></a> <span class='keyglyph'>=</span> <span class='conid'>DTDdescr</span> <span class='varid'>rt</span> <span class='varid'>es1</span> <span class='keyword'>as</span>
<a name="line-271"></a> <span class='keyword'>where</span>
<a name="line-272"></a> <span class='varid'>es</span> <span class='keyglyph'>=</span> <span class='varid'>elementDeclarations</span> <span class='varid'>sc</span>
<a name="line-273"></a> <span class='varid'>es1</span> <span class='keyglyph'>=</span> <span class='varid'>map</span> <span class='varid'>remAttrDec</span> <span class='varid'>es</span>
<a name="line-274"></a> <span class='keyword'>as</span> <span class='keyglyph'>=</span> <span class='varid'>filter</span> <span class='layout'>(</span><span class='varid'>not</span><span class='varop'>.</span> <span class='varid'>null</span> <span class='varop'>.</span> <span class='varid'>snd</span><span class='layout'>)</span> <span class='varop'>.</span> <span class='varid'>concatMap</span> <span class='varid'>attrDec</span> <span class='varop'>$</span> <span class='varid'>es</span>
<a name="line-275"></a> <span class='varid'>rt</span> <span class='keyglyph'>=</span> <span class='varid'>fromMaybe</span> <span class='str'>""</span> <span class='varop'>.</span> <span class='varid'>elemName</span> <span class='varop'>$</span> <span class='varid'>sc</span>
<a name="line-276"></a>
<a name="line-277"></a><a name="elementDeclarations"></a><span class='definition'>elementDeclarations</span> <span class='keyglyph'>::</span> <span class='conid'>Schema</span> <span class='keyglyph'>-></span> <span class='conid'>Schemas</span>
<a name="line-278"></a><span class='definition'>elementDeclarations</span> <span class='varid'>sc</span> <span class='keyglyph'>=</span> <span class='varid'>elemRefs</span> <span class='varop'>.</span> <span class='varid'>elementDecs</span> <span class='conid'>[]</span> <span class='varop'>$</span> <span class='keyglyph'>[</span><span class='varid'>sc</span><span class='keyglyph'>]</span>
<a name="line-279"></a>
<a name="line-280"></a><a name="elementDecs"></a><span class='definition'>elementDecs</span> <span class='keyglyph'>::</span> <span class='conid'>Schemas</span> <span class='keyglyph'>-></span> <span class='conid'>Schemas</span> <span class='keyglyph'>-></span> <span class='conid'>Schemas</span>
<a name="line-281"></a><span class='definition'>elementDecs</span> <span class='varid'>es</span> <span class='conid'>[]</span>
<a name="line-282"></a> <span class='keyglyph'>=</span> <span class='varid'>es</span>
<a name="line-283"></a><span class='definition'>elementDecs</span> <span class='varid'>es</span> <span class='layout'>(</span><span class='varid'>s</span><span class='conop'>:</span><span class='varid'>ss</span><span class='layout'>)</span>
<a name="line-284"></a> <span class='keyglyph'>=</span> <span class='varid'>elementDecs</span> <span class='layout'>(</span><span class='varid'>elemDecs</span> <span class='varid'>s</span><span class='layout'>)</span> <span class='varid'>ss</span>
<a name="line-285"></a> <span class='keyword'>where</span>
<a name="line-286"></a> <span class='varid'>elemDecs</span> <span class='layout'>(</span><span class='conid'>Seq</span> <span class='varid'>scs</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>elementDecs</span> <span class='varid'>es</span> <span class='varid'>scs</span>
<a name="line-287"></a> <span class='varid'>elemDecs</span> <span class='layout'>(</span><span class='conid'>Alt</span> <span class='varid'>scs</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>elementDecs</span> <span class='varid'>es</span> <span class='varid'>scs</span>
<a name="line-288"></a> <span class='varid'>elemDecs</span> <span class='layout'>(</span><span class='conid'>Rep</span> <span class='keyword'>_</span> <span class='keyword'>_</span> <span class='varid'>sc</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>elemDecs</span> <span class='varid'>sc</span>
<a name="line-289"></a> <span class='varid'>elemDecs</span> <span class='varid'>e</span><span class='keyglyph'>@</span><span class='layout'>(</span><span class='conid'>Element</span> <span class='varid'>n</span> <span class='varid'>sc</span><span class='layout'>)</span>
<a name="line-290"></a> <span class='keyglyph'>|</span> <span class='varid'>n</span> <span class='varop'>`elem`</span> <span class='varid'>elemNames</span> <span class='varid'>es</span> <span class='keyglyph'>=</span> <span class='varid'>es</span>
<a name="line-291"></a> <span class='keyglyph'>|</span> <span class='varid'>otherwise</span> <span class='keyglyph'>=</span> <span class='varid'>elementDecs</span> <span class='layout'>(</span><span class='varid'>e</span><span class='conop'>:</span><span class='varid'>es</span><span class='layout'>)</span> <span class='keyglyph'>[</span><span class='varid'>sc</span><span class='keyglyph'>]</span>
<a name="line-292"></a> <span class='varid'>elemDecs</span> <span class='keyword'>_</span> <span class='keyglyph'>=</span> <span class='varid'>es</span>
<a name="line-293"></a>
<a name="line-294"></a><a name="elemNames"></a><span class='definition'>elemNames</span> <span class='keyglyph'>::</span> <span class='conid'>Schemas</span> <span class='keyglyph'>-></span> <span class='keyglyph'>[</span><span class='conid'>Name</span><span class='keyglyph'>]</span>
<a name="line-295"></a><span class='definition'>elemNames</span> <span class='keyglyph'>=</span> <span class='varid'>concatMap</span> <span class='layout'>(</span><span class='varid'>maybeToList</span> <span class='varop'>.</span> <span class='varid'>elemName</span><span class='layout'>)</span>
<a name="line-296"></a>
<a name="line-297"></a><a name="elemName"></a><span class='definition'>elemName</span> <span class='keyglyph'>::</span> <span class='conid'>Schema</span> <span class='keyglyph'>-></span> <span class='conid'>Maybe</span> <span class='conid'>Name</span>
<a name="line-298"></a><span class='definition'>elemName</span> <span class='layout'>(</span><span class='conid'>Element</span> <span class='varid'>n</span> <span class='keyword'>_</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='conid'>Just</span> <span class='varid'>n</span>
<a name="line-299"></a><span class='definition'>elemName</span> <span class='keyword'>_</span> <span class='keyglyph'>=</span> <span class='conid'>Nothing</span>
<a name="line-300"></a>
<a name="line-301"></a><a name="elemRefs"></a><span class='definition'>elemRefs</span> <span class='keyglyph'>::</span> <span class='conid'>Schemas</span> <span class='keyglyph'>-></span> <span class='conid'>Schemas</span>
<a name="line-302"></a><span class='definition'>elemRefs</span> <span class='keyglyph'>=</span> <span class='varid'>map</span> <span class='varid'>elemRef</span>
<a name="line-303"></a> <span class='keyword'>where</span>
<a name="line-304"></a> <span class='varid'>elemRef</span> <span class='layout'>(</span><span class='conid'>Element</span> <span class='varid'>n</span> <span class='varid'>sc</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='conid'>Element</span> <span class='varid'>n</span> <span class='layout'>(</span><span class='varid'>pruneElem</span> <span class='varid'>sc</span><span class='layout'>)</span>
<a name="line-305"></a> <span class='varid'>elemRef</span> <span class='varid'>sc</span> <span class='keyglyph'>=</span> <span class='varid'>sc</span>
<a name="line-306"></a> <span class='varid'>pruneElem</span> <span class='layout'>(</span><span class='conid'>Element</span> <span class='varid'>n</span> <span class='keyword'>_</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='conid'>ElemRef</span> <span class='varid'>n</span>
<a name="line-307"></a> <span class='varid'>pruneElem</span> <span class='layout'>(</span><span class='conid'>Seq</span> <span class='varid'>scs</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='conid'>Seq</span> <span class='layout'>(</span><span class='varid'>map</span> <span class='varid'>pruneElem</span> <span class='varid'>scs</span><span class='layout'>)</span>
<a name="line-308"></a> <span class='varid'>pruneElem</span> <span class='layout'>(</span><span class='conid'>Alt</span> <span class='varid'>scs</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='conid'>Alt</span> <span class='layout'>(</span><span class='varid'>map</span> <span class='varid'>pruneElem</span> <span class='varid'>scs</span><span class='layout'>)</span>
<a name="line-309"></a> <span class='varid'>pruneElem</span> <span class='layout'>(</span><span class='conid'>Rep</span> <span class='varid'>l</span> <span class='varid'>u</span> <span class='varid'>sc</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='conid'>Rep</span> <span class='varid'>l</span> <span class='varid'>u</span> <span class='layout'>(</span><span class='varid'>pruneElem</span> <span class='varid'>sc</span><span class='layout'>)</span>
<a name="line-310"></a> <span class='varid'>pruneElem</span> <span class='varid'>sc</span> <span class='keyglyph'>=</span> <span class='varid'>sc</span>
<a name="line-311"></a>
<a name="line-312"></a><a name="attrDec"></a><span class='definition'>attrDec</span> <span class='keyglyph'>::</span> <span class='conid'>Schema</span> <span class='keyglyph'>-></span> <span class='keyglyph'>[</span><span class='layout'>(</span><span class='conid'>Name</span><span class='layout'>,</span> <span class='conid'>Schemas</span><span class='layout'>)</span><span class='keyglyph'>]</span>
<a name="line-313"></a><span class='definition'>attrDec</span> <span class='layout'>(</span><span class='conid'>Element</span> <span class='varid'>n</span> <span class='varid'>sc</span><span class='layout'>)</span>
<a name="line-314"></a> <span class='keyglyph'>=</span> <span class='keyglyph'>[</span><span class='layout'>(</span><span class='varid'>n</span><span class='layout'>,</span> <span class='varid'>attrDecs</span> <span class='varid'>sc</span><span class='layout'>)</span><span class='keyglyph'>]</span>
<a name="line-315"></a> <span class='keyword'>where</span>
<a name="line-316"></a> <span class='varid'>attrDecs</span> <span class='varid'>a</span><span class='keyglyph'>@</span><span class='layout'>(</span><span class='conid'>Attribute</span> <span class='keyword'>_</span> <span class='keyword'>_</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='keyglyph'>[</span><span class='varid'>a</span><span class='keyglyph'>]</span>
<a name="line-317"></a> <span class='varid'>attrDecs</span> <span class='layout'>(</span><span class='conid'>Seq</span> <span class='varid'>scs</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>concatMap</span> <span class='varid'>attrDecs</span> <span class='varid'>scs</span>
<a name="line-318"></a> <span class='varid'>attrDecs</span> <span class='keyword'>_</span> <span class='keyglyph'>=</span> <span class='conid'>[]</span>
<a name="line-319"></a><span class='definition'>attrDec</span> <span class='keyword'>_</span> <span class='keyglyph'>=</span> <span class='conid'>[]</span>
<a name="line-320"></a>
<a name="line-321"></a><a name="remAttrDec"></a><span class='definition'>remAttrDec</span> <span class='keyglyph'>::</span> <span class='conid'>Schema</span> <span class='keyglyph'>-></span> <span class='conid'>Schema</span>
<a name="line-322"></a><span class='definition'>remAttrDec</span> <span class='layout'>(</span><span class='conid'>Element</span> <span class='varid'>n</span> <span class='varid'>sc</span><span class='layout'>)</span>
<a name="line-323"></a> <span class='keyglyph'>=</span> <span class='conid'>Element</span> <span class='varid'>n</span> <span class='layout'>(</span><span class='varid'>remA</span> <span class='varid'>sc</span><span class='layout'>)</span>
<a name="line-324"></a> <span class='keyword'>where</span>
<a name="line-325"></a> <span class='varid'>remA</span> <span class='layout'>(</span><span class='conid'>Attribute</span> <span class='keyword'>_</span> <span class='keyword'>_</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>scEmpty</span>
<a name="line-326"></a> <span class='varid'>remA</span> <span class='layout'>(</span><span class='conid'>Seq</span> <span class='varid'>scs</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>scSeqs</span> <span class='varop'>.</span> <span class='varid'>map</span> <span class='varid'>remA</span> <span class='varop'>$</span> <span class='varid'>scs</span>
<a name="line-327"></a> <span class='varid'>remA</span> <span class='varid'>sc1</span> <span class='keyglyph'>=</span> <span class='varid'>sc1</span>
<a name="line-328"></a><span class='definition'>remAttrDec</span> <span class='keyword'>_</span>
<a name="line-329"></a> <span class='keyglyph'>=</span> <span class='varid'>error</span> <span class='str'>"illegal case in remAttrDec"</span>
<a name="line-330"></a>
<a name="line-331"></a><span class='comment'>-- ------------------------------------------------------------</span>
<a name="line-332"></a>
</pre></body>
</html>