HaXml 1.19.4 → 1.19.5
raw patch · 48 files changed
+11004/−9654 lines, 48 filesdep +filepathPVP ok
version bump matches the API change (PVP)
Dependencies added: filepath
API changes (from Hackage documentation)
+ Text.XML.HaXml.TypeMapping: instance (HTypeable a, HTypeable b, HTypeable c, HTypeable d, HTypeable e, HTypeable f, HTypeable g) => HTypeable (a, b, c, d, e, f, g)
+ Text.XML.HaXml.TypeMapping: instance (HTypeable a, HTypeable b, HTypeable c, HTypeable d, HTypeable e, HTypeable f, HTypeable g, HTypeable h) => HTypeable (a, b, c, d, e, f, g, h)
+ Text.XML.HaXml.TypeMapping: instance (HTypeable a, HTypeable b, HTypeable c, HTypeable d, HTypeable e, HTypeable f, HTypeable g, HTypeable h, HTypeable i) => HTypeable (a, b, c, d, e, f, g, h, i)
+ Text.XML.HaXml.TypeMapping: instance (HTypeable a, HTypeable b, HTypeable c, HTypeable d, HTypeable e, HTypeable f, HTypeable g, HTypeable h, HTypeable i, HTypeable j) => HTypeable (a, b, c, d, e, f, g, h, i, j)
+ Text.XML.HaXml.TypeMapping: instance (HTypeable a, HTypeable b, HTypeable c, HTypeable d, HTypeable e, HTypeable f, HTypeable g, HTypeable h, HTypeable i, HTypeable j, HTypeable k) => HTypeable (a, b, c, d, e, f, g, h, i, j, k)
+ Text.XML.HaXml.TypeMapping: instance (HTypeable a, HTypeable b, HTypeable c, HTypeable d, HTypeable e, HTypeable f, HTypeable g, HTypeable h, HTypeable i, HTypeable j, HTypeable k, HTypeable l) => HTypeable (a, b, c, d, e, f, g, h, i, j, k, l)
+ Text.XML.HaXml.TypeMapping: instance (HTypeable a, HTypeable b, HTypeable c, HTypeable d, HTypeable e, HTypeable f, HTypeable g, HTypeable h, HTypeable i, HTypeable j, HTypeable k, HTypeable l, HTypeable m) => HTypeable (a, b, c, d, e, f, g, h, i, j, k, l, m)
+ Text.XML.HaXml.TypeMapping: instance (HTypeable a, HTypeable b, HTypeable c, HTypeable d, HTypeable e, HTypeable f, HTypeable g, HTypeable h, HTypeable i, HTypeable j, HTypeable k, HTypeable l, HTypeable m, HTypeable n) => HTypeable (a, b, c, d, e, f, g, h, i, j, k, l, m, n)
+ Text.XML.HaXml.TypeMapping: instance (HTypeable a, HTypeable b, HTypeable c, HTypeable d, HTypeable e, HTypeable f, HTypeable g, HTypeable h, HTypeable i, HTypeable j, HTypeable k, HTypeable l, HTypeable m, HTypeable n, HTypeable o) => HTypeable (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
+ Text.XML.HaXml.Wrappers: onContent :: CFilter i -> Document i -> Document i
+ Text.XML.HaXml.XmlContent: instance (XmlContent a, XmlContent b, XmlContent c, XmlContent d, XmlContent e, XmlContent f, XmlContent g) => XmlContent (a, b, c, d, e, f, g)
+ Text.XML.HaXml.XmlContent: instance (XmlContent a, XmlContent b, XmlContent c, XmlContent d, XmlContent e, XmlContent f, XmlContent g, XmlContent h) => XmlContent (a, b, c, d, e, f, g, h)
+ Text.XML.HaXml.XmlContent: instance (XmlContent a, XmlContent b, XmlContent c, XmlContent d, XmlContent e, XmlContent f, XmlContent g, XmlContent h, XmlContent i) => XmlContent (a, b, c, d, e, f, g, h, i)
+ Text.XML.HaXml.XmlContent: instance (XmlContent a, XmlContent b, XmlContent c, XmlContent d, XmlContent e, XmlContent f, XmlContent g, XmlContent h, XmlContent i, XmlContent j) => XmlContent (a, b, c, d, e, f, g, h, i, j)
+ Text.XML.HaXml.XmlContent: instance (XmlContent a, XmlContent b, XmlContent c, XmlContent d, XmlContent e, XmlContent f, XmlContent g, XmlContent h, XmlContent i, XmlContent j, XmlContent k) => XmlContent (a, b, c, d, e, f, g, h, i, j, k)
+ Text.XML.HaXml.XmlContent: instance (XmlContent a, XmlContent b, XmlContent c, XmlContent d, XmlContent e, XmlContent f, XmlContent g, XmlContent h, XmlContent i, XmlContent j, XmlContent k, XmlContent l) => XmlContent (a, b, c, d, e, f, g, h, i, j, k, l)
+ Text.XML.HaXml.XmlContent: instance (XmlContent a, XmlContent b, XmlContent c, XmlContent d, XmlContent e, XmlContent f, XmlContent g, XmlContent h, XmlContent i, XmlContent j, XmlContent k, XmlContent l, XmlContent m) => XmlContent (a, b, c, d, e, f, g, h, i, j, k, l, m)
+ Text.XML.HaXml.XmlContent: instance (XmlContent a, XmlContent b, XmlContent c, XmlContent d, XmlContent e, XmlContent f, XmlContent g, XmlContent h, XmlContent i, XmlContent j, XmlContent k, XmlContent l, XmlContent m, XmlContent n) => XmlContent (a, b, c, d, e, f, g, h, i, j, k, l, m, n)
+ Text.XML.HaXml.XmlContent: instance (XmlContent a, XmlContent b, XmlContent c, XmlContent d, XmlContent e, XmlContent f, XmlContent g, XmlContent h, XmlContent i, XmlContent j, XmlContent k, XmlContent l, XmlContent m, XmlContent n, XmlContent o) => XmlContent (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
Files
- HaXml.cabal +2/−2
- Makefile +1/−1
- configure +1/−1
- docs/HaXml/Text-XML-HaXml-TypeMapping.html +252/−0
- docs/HaXml/Text-XML-HaXml-Wrappers.html +52/−0
- docs/HaXml/Text-XML-HaXml-XmlContent.html +252/−0
- docs/HaXml/doc-index-O.html +8/−0
- docs/HaXml/src/Text/XML/HaXml.html +42/−36
- docs/HaXml/src/Text/XML/HaXml/ByteStringPP.html +346/−340
- docs/HaXml/src/Text/XML/HaXml/Combinators.html +430/−424
- docs/HaXml/src/Text/XML/HaXml/DtdToHaskell/Convert.html +133/−127
- docs/HaXml/src/Text/XML/HaXml/DtdToHaskell/Instance.html +401/−393
- docs/HaXml/src/Text/XML/HaXml/DtdToHaskell/TypeDef.html +254/−248
- docs/HaXml/src/Text/XML/HaXml/Escape.html +297/−291
- docs/HaXml/src/Text/XML/HaXml/Html/Generate.html +181/−175
- docs/HaXml/src/Text/XML/HaXml/Html/Parse.html +731/−725
- docs/HaXml/src/Text/XML/HaXml/Html/ParseLazy.html +735/−729
- docs/HaXml/src/Text/XML/HaXml/Html/Pretty.html +240/−234
- docs/HaXml/src/Text/XML/HaXml/Lex.html +339/−333
- docs/HaXml/src/Text/XML/HaXml/OneOfN.html +670/−664
- docs/HaXml/src/Text/XML/HaXml/Parse.html +893/−884
- docs/HaXml/src/Text/XML/HaXml/ParseLazy.html +903/−889
- docs/HaXml/src/Text/XML/HaXml/Posn.html +82/−75
- docs/HaXml/src/Text/XML/HaXml/Pretty.html +304/−298
- docs/HaXml/src/Text/XML/HaXml/SAX.html +99/−93
- docs/HaXml/src/Text/XML/HaXml/ShowXmlLazy.html +333/−327
- docs/HaXml/src/Text/XML/HaXml/TypeMapping.html +296/−220
- docs/HaXml/src/Text/XML/HaXml/Types.html +298/−292
- docs/HaXml/src/Text/XML/HaXml/Util.html +47/−41
- docs/HaXml/src/Text/XML/HaXml/Validate.html +278/−272
- docs/HaXml/src/Text/XML/HaXml/Verbatim.html +97/−91
- docs/HaXml/src/Text/XML/HaXml/Wrappers.html +77/−61
- docs/HaXml/src/Text/XML/HaXml/XmlContent.html +895/−680
- docs/HaXml/src/Text/XML/HaXml/Xtract/Combinators.html +110/−104
- docs/HaXml/src/Text/XML/HaXml/Xtract/Lex.html +134/−128
- docs/HaXml/src/Text/XML/HaXml/Xtract/Parse.html +423/−417
- docs/changelog.html +4/−0
- docs/index.html +5/−3
- src/Makefile +1/−1
- src/Text/XML/HaXml/DtdToHaskell/Convert.hs +2/−2
- src/Text/XML/HaXml/DtdToHaskell/Instance.hs +3/−1
- src/Text/XML/HaXml/Lex.hs +1/−1
- src/Text/XML/HaXml/Parse.hs +27/−24
- src/Text/XML/HaXml/ParseLazy.hs +27/−19
- src/Text/XML/HaXml/Posn.hs +2/−1
- src/Text/XML/HaXml/TypeMapping.hs +70/−0
- src/Text/XML/HaXml/Wrappers.hs +10/−0
- src/Text/XML/HaXml/XmlContent.hs +216/−7
HaXml.cabal view
@@ -1,5 +1,5 @@ name: HaXml-version: 1.19.4+version: 1.19.5 license: LGPL license-file: COPYRIGHT author: Malcolm Wallace <Malcolm.Wallace@cs.york.ac.uk>@@ -50,7 +50,7 @@ Text.XML.HaXml.Xtract.Lex, Text.XML.HaXml.Xtract.Parse hs-source-dirs: src- build-depends: base, haskell98, polyparse+ build-depends: base, haskell98, polyparse, filepath if flag(splitBase) build-depends: base >= 3, pretty, random, containers else
Makefile view
@@ -1,5 +1,5 @@ SOFTWARE = HaXml-VERSION = 1.19.4+VERSION = 1.19.5 #CPP = cpp -traditional CPP = cpphs --text --noline # useful e.g. on MacOS X
configure view
@@ -2,7 +2,7 @@ # configure -- prepare to compile/install the HaXml package # author: Malcolm.Wallace@cs.york.ac.uk, August 2002 -VERSION="1.19.4"+VERSION="1.19.5" if [ -f obj/prefix ] then INSTALLDIR=`cat obj/prefix`
docs/HaXml/Text-XML-HaXml-TypeMapping.html view
@@ -483,6 +483,258 @@ ></TR ><TR ><TD CLASS="decl"+>(<A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> a, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> b, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> c, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> d, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> e, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> f, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> g) => <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> (a, b, c, d, e, f, g)</TD+></TR+><TR+><TD CLASS="decl"+>(<A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> a, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> b, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> c, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> d, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> e, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> f, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> g, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> h) => <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> (a, b, c, d, e, f, g, h)</TD+></TR+><TR+><TD CLASS="decl"+>(<A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> a, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> b, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> c, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> d, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> e, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> f, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> g, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> h, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> i) => <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> (a, b, c, d, e, f, g, h, i)</TD+></TR+><TR+><TD CLASS="decl"+>(<A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> a, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> b, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> c, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> d, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> e, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> f, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> g, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> h, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> i, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> j) => <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> (a, b, c, d, e, f, g, h, i, j)</TD+></TR+><TR+><TD CLASS="decl"+>(<A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> a, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> b, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> c, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> d, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> e, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> f, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> g, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> h, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> i, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> j, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> k) => <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> (a, b, c, d, e, f, g, h, i, j, k)</TD+></TR+><TR+><TD CLASS="decl"+>(<A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> a, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> b, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> c, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> d, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> e, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> f, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> g, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> h, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> i, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> j, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> k, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> l) => <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> (a, b, c, d, e, f, g, h, i, j, k, l)</TD+></TR+><TR+><TD CLASS="decl"+>(<A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> a, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> b, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> c, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> d, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> e, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> f, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> g, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> h, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> i, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> j, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> k, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> l, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> m) => <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> (a, b, c, d, e, f, g, h, i, j, k, l, m)</TD+></TR+><TR+><TD CLASS="decl"+>(<A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> a, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> b, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> c, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> d, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> e, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> f, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> g, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> h, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> i, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> j, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> k, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> l, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> m, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> n) => <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> (a, b, c, d, e, f, g, h, i, j, k, l, m, n)</TD+></TR+><TR+><TD CLASS="decl"+>(<A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> a, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> b, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> c, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> d, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> e, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> f, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> g, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> h, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> i, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> j, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> k, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> l, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> m, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> n, <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> o) => <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"+>HTypeable</A+> (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)</TD+></TR+><TR+><TD CLASS="decl" ><A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable" >HTypeable</A > a => <A HREF="Text-XML-HaXml-TypeMapping.html#t%3AHTypeable"
docs/HaXml/Text-XML-HaXml-Wrappers.html view
@@ -97,6 +97,22 @@ >Posn</A > -> IO ()</TD ></TR+><TR+><TD CLASS="s8"+></TD+></TR+><TR+><TD CLASS="decl"+><A HREF="#v%3AonContent"+>onContent</A+> :: <A HREF="Text-XML-HaXml-Combinators.html#t%3ACFilter"+>CFilter</A+> i -> <A HREF="Text-XML-HaXml-Types.html#t%3ADocument"+>Document</A+> i -> <A HREF="Text-XML-HaXml-Types.html#t%3ADocument"+>Document</A+> i</TD+></TR ></TABLE ></TD ></TR@@ -180,6 +196,42 @@ the error-correcting HTML parser rather than the strict XML parser. </P ></TD+></TR+><TR+><TD CLASS="s15"+></TD+></TR+><TR+><TD CLASS="topdecl"+><TABLE CLASS="declbar"+><TR+><TD CLASS="declname"+><A NAME="v%3AonContent"+></A+><B+>onContent</B+> :: <A HREF="Text-XML-HaXml-Combinators.html#t%3ACFilter"+>CFilter</A+> i -> <A HREF="Text-XML-HaXml-Types.html#t%3ADocument"+>Document</A+> i -> <A HREF="Text-XML-HaXml-Types.html#t%3ADocument"+>Document</A+> i</TD+><TD CLASS="declbut"+><A HREF="src/Text/XML/HaXml/Wrappers.html#onContent"+>Source</A+></TD+></TR+></TABLE+></TD+></TR+><TR+><TD CLASS="doc"+>The wrapper <TT+>onContent</TT+> simply applies a given content filter to a+ document. Ambiguous or empty results raise an error exception.+</TD ></TR ><TR ><TD CLASS="s15"
docs/HaXml/Text-XML-HaXml-XmlContent.html view
@@ -2117,6 +2117,258 @@ ></TR ><TR ><TD CLASS="decl"+>(<A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> a, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> b, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> c, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> d, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> e, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> f, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> g) => <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> (a, b, c, d, e, f, g)</TD+></TR+><TR+><TD CLASS="decl"+>(<A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> a, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> b, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> c, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> d, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> e, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> f, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> g, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> h) => <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> (a, b, c, d, e, f, g, h)</TD+></TR+><TR+><TD CLASS="decl"+>(<A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> a, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> b, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> c, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> d, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> e, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> f, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> g, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> h, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> i) => <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> (a, b, c, d, e, f, g, h, i)</TD+></TR+><TR+><TD CLASS="decl"+>(<A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> a, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> b, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> c, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> d, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> e, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> f, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> g, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> h, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> i, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> j) => <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> (a, b, c, d, e, f, g, h, i, j)</TD+></TR+><TR+><TD CLASS="decl"+>(<A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> a, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> b, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> c, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> d, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> e, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> f, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> g, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> h, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> i, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> j, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> k) => <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> (a, b, c, d, e, f, g, h, i, j, k)</TD+></TR+><TR+><TD CLASS="decl"+>(<A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> a, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> b, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> c, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> d, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> e, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> f, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> g, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> h, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> i, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> j, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> k, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> l) => <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> (a, b, c, d, e, f, g, h, i, j, k, l)</TD+></TR+><TR+><TD CLASS="decl"+>(<A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> a, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> b, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> c, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> d, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> e, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> f, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> g, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> h, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> i, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> j, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> k, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> l, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> m) => <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> (a, b, c, d, e, f, g, h, i, j, k, l, m)</TD+></TR+><TR+><TD CLASS="decl"+>(<A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> a, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> b, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> c, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> d, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> e, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> f, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> g, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> h, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> i, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> j, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> k, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> l, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> m, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> n) => <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> (a, b, c, d, e, f, g, h, i, j, k, l, m, n)</TD+></TR+><TR+><TD CLASS="decl"+>(<A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> a, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> b, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> c, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> d, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> e, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> f, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> g, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> h, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> i, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> j, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> k, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> l, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> m, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> n, <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> o) => <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"+>XmlContent</A+> (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)</TD+></TR+><TR+><TD CLASS="decl" ><A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent" >XmlContent</A > a => <A HREF="Text-XML-HaXml-XmlContent.html#t%3AXmlContent"
docs/HaXml/doc-index-O.html view
@@ -571,6 +571,14 @@ ></TR ><TR ><TD CLASS="indexentry"+>onContent</TD+><TD CLASS="indexlinks"+><A HREF="Text-XML-HaXml-Wrappers.html#v%3AonContent"+>Text.XML.HaXml.Wrappers</A+></TD+></TR+><TR+><TD CLASS="indexentry" >oo</TD ><TD CLASS="indexlinks" ><A HREF="Text-XML-HaXml-Combinators.html#v%3Aoo"
docs/HaXml/src/Text/XML/HaXml.html view
@@ -1,40 +1,46 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Magenta><em>#</em></font>define dummy <font color=Blue>-- just to ensure cpp gets called on this file</font>-<a name="(line2)"></a><font color=Blue>-- | This is just a convenient way of bunching the XML combinators</font>-<a name="(line3)"></a><font color=Blue>-- together with some other things you are likely to want at the</font>-<a name="(line4)"></a><font color=Blue>-- same time.</font>-<a name="(line5)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml-<a name="(line6)"></a> <font color=Cyan>(</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line7)"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Combinators-<a name="(line8)"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Parse-<a name="(line9)"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Pretty-<a name="(line10)"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Html<font color=Cyan>.</font>Generate-<a name="(line11)"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Html<font color=Cyan>.</font>Parse-<a name="(line12)"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Validate-<a name="(line13)"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Wrappers-<a name="(line14)"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Verbatim-<a name="(line15)"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Escape-<a name="(line16)"></a> <font color=Cyan>,</font> render-<a name="(line17)"></a> <font color=Cyan>,</font> version-<a name="(line18)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line19)"></a>-<a name="(line20)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line21)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Combinators-<a name="(line22)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Parse <font color=Cyan>(</font>xmlParse<font color=Cyan>,</font>dtdParse<font color=Cyan>)</font>-<a name="(line23)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Pretty <font color=Cyan>(</font>element<font color=Cyan>)</font>-<a name="(line24)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Html<font color=Cyan>.</font>Generate-<a name="(line25)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Html<font color=Cyan>.</font>Parse <font color=Cyan>(</font>htmlParse<font color=Cyan>)</font>-<a name="(line26)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Validate <font color=Cyan>(</font>validate<font color=Cyan>)</font>-<a name="(line27)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Wrappers <font color=Cyan>(</font>fix2Args<font color=Cyan>,</font>processXmlWith<font color=Cyan>)</font>-<a name="(line28)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Verbatim-<a name="(line29)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Escape-<a name="(line30)"></a>-<a name="(line31)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>PrettyPrint<font color=Cyan>.</font>HughesPJ <font color=Cyan>(</font>render<font color=Cyan>)</font>-<a name="(line32)"></a>-<a name="(line33)"></a><a name="version"></a><font color=Blue>-- | The version of the library.</font>-<a name="(line34)"></a>version <font color=Red>::</font> String-<a name="(line35)"></a>version <font color=Red>=</font> <font color=Magenta>"VERSION"</font>-<a name="(line36)"></a> <font color=Blue>-- expect cpp to fill in value</font>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Magenta><em>#</em></font>define dummy <font color=Blue>-- just to ensure cpp gets called on this file</font>+<a name="line-2"></a><font color=Blue>-- | This is just a convenient way of bunching the XML combinators</font>+<a name="line-3"></a><font color=Blue>-- together with some other things you are likely to want at the</font>+<a name="line-4"></a><font color=Blue>-- same time.</font>+<a name="line-5"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml+<a name="line-6"></a> <font color=Cyan>(</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-7"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Combinators+<a name="line-8"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Parse+<a name="line-9"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Pretty+<a name="line-10"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Html<font color=Cyan>.</font>Generate+<a name="line-11"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Html<font color=Cyan>.</font>Parse+<a name="line-12"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Validate+<a name="line-13"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Wrappers+<a name="line-14"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Verbatim+<a name="line-15"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Escape+<a name="line-16"></a> <font color=Cyan>,</font> render+<a name="line-17"></a> <font color=Cyan>,</font> version+<a name="line-18"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-19"></a>+<a name="line-20"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-21"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Combinators+<a name="line-22"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Parse <font color=Cyan>(</font>xmlParse<font color=Cyan>,</font>dtdParse<font color=Cyan>)</font>+<a name="line-23"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Pretty <font color=Cyan>(</font>element<font color=Cyan>)</font>+<a name="line-24"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Html<font color=Cyan>.</font>Generate+<a name="line-25"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Html<font color=Cyan>.</font>Parse <font color=Cyan>(</font>htmlParse<font color=Cyan>)</font>+<a name="line-26"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Validate <font color=Cyan>(</font>validate<font color=Cyan>)</font>+<a name="line-27"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Wrappers <font color=Cyan>(</font>fix2Args<font color=Cyan>,</font>processXmlWith<font color=Cyan>)</font>+<a name="line-28"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Verbatim+<a name="line-29"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Escape+<a name="line-30"></a>+<a name="line-31"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>PrettyPrint<font color=Cyan>.</font>HughesPJ <font color=Cyan>(</font>render<font color=Cyan>)</font>+<a name="line-32"></a>+<a name="line-33"></a><a name="version"></a><font color=Blue>-- | The version of the library.</font>+<a name="line-34"></a><font color=Blue>version</font> <font color=Red>::</font> String+<a name="line-35"></a><font color=Blue>version</font> <font color=Red>=</font> <font color=Magenta>"VERSION"</font>+<a name="line-36"></a> <font color=Blue>-- expect cpp to fill in value</font> </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/ByteStringPP.html view
@@ -1,344 +1,350 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>-- | This is a fast non-pretty-printer for turning the internal representation</font>-<a name="(line2)"></a><font color=Blue>-- of generic structured XML documents into Lazy ByteStrings.</font>-<a name="(line3)"></a><font color=Blue>-- Like in Text.Xml.HaXml.Pretty, there is one pp function for each type in</font>-<a name="(line4)"></a><font color=Blue>-- Text.Xml.HaXml.Types, so you can pretty-print as much or as little</font>-<a name="(line5)"></a><font color=Blue>-- of the document as you wish.</font>-<a name="(line6)"></a>-<a name="(line7)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>ByteStringPP-<a name="(line8)"></a> <font color=Cyan>(</font>-<a name="(line9)"></a> <font color=Blue>-- * Pretty-print a whole document</font>-<a name="(line10)"></a> document-<a name="(line11)"></a> <font color=Blue>-- ** Just one content</font>-<a name="(line12)"></a> <font color=Cyan>,</font> content-<a name="(line13)"></a> <font color=Blue>-- ** Just one tagged element</font>-<a name="(line14)"></a> <font color=Cyan>,</font> element-<a name="(line15)"></a> <font color=Blue>-- * Pretty-print just a DTD</font>-<a name="(line16)"></a> <font color=Cyan>,</font> doctypedecl-<a name="(line17)"></a> <font color=Blue>-- ** The prolog</font>-<a name="(line18)"></a> <font color=Cyan>,</font> prolog-<a name="(line19)"></a> <font color=Blue>-- ** A content particle description</font>-<a name="(line20)"></a> <font color=Cyan>,</font> cp-<a name="(line21)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line22)"></a>-<a name="(line23)"></a><font color=Green><u>import</u></font> Prelude hiding <font color=Cyan>(</font>maybe<font color=Cyan>,</font>either<font color=Cyan>,</font>elem<font color=Cyan>,</font>concat<font color=Cyan>)</font>-<a name="(line24)"></a><font color=Green><u>import</u></font> Maybe hiding <font color=Cyan>(</font>maybe<font color=Cyan>)</font>-<a name="(line25)"></a><font color=Green><u>import</u></font> Data<font color=Cyan>.</font>List <font color=Cyan>(</font>intersperse<font color=Cyan>)</font>-<a name="(line26)"></a><font color=Blue>--import Data.ByteString.Lazy hiding (pack,map,head,any,singleton,intersperse,join)</font>-<a name="(line27)"></a><font color=Green><u>import</u></font> Data<font color=Cyan>.</font>ByteString<font color=Cyan>.</font>Lazy<font color=Cyan>.</font>Char8 <font color=Cyan>(</font>ByteString()<font color=Cyan>,</font> concat<font color=Cyan>,</font> pack<font color=Cyan>,</font> singleton<font color=Cyan>,</font> intercalate-<a name="(line28)"></a> <font color=Cyan>,</font> append<font color=Cyan>,</font> elem<font color=Cyan>,</font> empty<font color=Cyan>)</font>-<a name="(line29)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line30)"></a>-<a name="(line31)"></a><a name="either"></a>either <font color=Red>::</font> <font color=Cyan>(</font>t <font color=Red>-></font> t1<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>t2 <font color=Red>-></font> t1<font color=Cyan>)</font> <font color=Red>-></font> Either t t2 <font color=Red>-></font> t1-<a name="(line32)"></a>either f <font color=Green><u>_</u></font> <font color=Cyan>(</font>Left x<font color=Cyan>)</font> <font color=Red>=</font> f x-<a name="(line33)"></a>either <font color=Green><u>_</u></font> g <font color=Cyan>(</font>Right x<font color=Cyan>)</font> <font color=Red>=</font> g x-<a name="(line34)"></a>-<a name="(line35)"></a><a name="maybe"></a>maybe <font color=Red>::</font> <font color=Cyan>(</font>t <font color=Red>-></font> ByteString<font color=Cyan>)</font> <font color=Red>-></font> Maybe t <font color=Red>-></font> ByteString-<a name="(line36)"></a>maybe <font color=Green><u>_</u></font> Nothing <font color=Red>=</font> empty-<a name="(line37)"></a>maybe f <font color=Cyan>(</font>Just x<font color=Cyan>)</font> <font color=Red>=</font> f x-<a name="(line38)"></a>-<a name="(line39)"></a>-<a name="(line40)"></a><font color=Blue>-- A simple implementation of the pretty-printing combinator interface,</font>-<a name="(line41)"></a><font color=Blue>-- but for plain ByteStrings:</font>-<a name="(line42)"></a><font color=Green><u>infixl</u></font> <font color=Magenta>6</font> <font color=Cyan><></font>-<a name="(line43)"></a><font color=Green><u>infixl</u></font> <font color=Magenta>6</font> <font color=Cyan><+></font>-<a name="(line44)"></a><font color=Green><u>infixl</u></font> <font color=Magenta>5</font> <font color=Cyan>$$</font>-<a name="(line45)"></a><a name="<>"></a><font color=Cyan>(</font><font color=Cyan><></font><font color=Cyan>)</font> <font color=Red>::</font> ByteString <font color=Red>-></font> ByteString <font color=Red>-></font> ByteString <font color=Blue>-- Beside</font>-<a name="(line46)"></a><a name="hcat"></a>hcat <font color=Red>::</font> <font color=Red>[</font>ByteString<font color=Red>]</font> <font color=Red>-></font> ByteString <font color=Blue>-- List version of <></font>-<a name="(line47)"></a><a name="<+>"></a><font color=Cyan>(</font><font color=Cyan><+></font><font color=Cyan>)</font> <font color=Red>::</font> ByteString <font color=Red>-></font> ByteString <font color=Red>-></font> ByteString <font color=Blue>-- Beside, separated by space</font>-<a name="(line48)"></a><a name="hsep"></a>hsep <font color=Red>::</font> <font color=Red>[</font>ByteString<font color=Red>]</font> <font color=Red>-></font> ByteString <font color=Blue>-- List version of <+></font>-<a name="(line49)"></a><a name="$$"></a><font color=Cyan>(</font><font color=Cyan>$$</font><font color=Cyan>)</font> <font color=Red>::</font> ByteString <font color=Red>-></font> ByteString <font color=Red>-></font> ByteString <font color=Blue>-- Above; if there is no</font>-<a name="(line50)"></a> <font color=Blue>-- overlap, it "dovetails"</font>-<a name="(line51)"></a><a name="vcat"></a>vcat <font color=Red>::</font> <font color=Red>[</font>ByteString<font color=Red>]</font> <font color=Red>-></font> ByteString <font color=Blue>-- List version of $$</font>-<a name="(line52)"></a><a name="sep"></a><font color=Blue>-- cat :: [ByteString] -> ByteString -- Either hcat or vcat</font>-<a name="(line53)"></a>sep <font color=Red>::</font> <font color=Red>[</font>ByteString<font color=Red>]</font> <font color=Red>-></font> ByteString <font color=Blue>-- Either hsep or vcat</font>-<a name="(line54)"></a><a name="fsep"></a><font color=Blue>-- fcat :: [ByteString] -> ByteString -- ``Paragraph fill'' version of cat</font>-<a name="(line55)"></a>fsep <font color=Red>::</font> <font color=Red>[</font>ByteString<font color=Red>]</font> <font color=Red>-></font> ByteString <font color=Blue>-- ``Paragraph fill'' version of sep</font>-<a name="(line56)"></a><a name="nest"></a>nest <font color=Red>::</font> Int <font color=Red>-></font> ByteString <font color=Red>-></font> ByteString <font color=Blue>-- Nested</font>-<a name="(line57)"></a>-<a name="(line58)"></a><font color=Cyan>(</font><font color=Cyan><></font><font color=Cyan>)</font> b1 b2 <font color=Red>=</font> b1 <font color=Cyan>`append`</font> b2-<a name="(line59)"></a><font color=Cyan>(</font><font color=Cyan><+></font><font color=Cyan>)</font> b1 b2 <font color=Red>=</font> b1 <font color=Cyan><></font> pack <font color=Magenta>" "</font> <font color=Cyan><></font> b2-<a name="(line60)"></a><font color=Cyan>(</font><font color=Cyan>$$</font><font color=Cyan>)</font> b1 b2 <font color=Red>=</font> b1 <font color=Cyan><></font> pack <font color=Magenta>"\n"</font> <font color=Cyan><></font> b2-<a name="(line61)"></a><font color=Blue>-- ($+$) = ($$)</font>-<a name="(line62)"></a>-<a name="(line63)"></a>hcat <font color=Red>=</font> Data<font color=Cyan>.</font>ByteString<font color=Cyan>.</font>Lazy<font color=Cyan>.</font>Char8<font color=Cyan>.</font>concat-<a name="(line64)"></a>hsep <font color=Red>=</font> Data<font color=Cyan>.</font>ByteString<font color=Cyan>.</font>Lazy<font color=Cyan>.</font>Char8<font color=Cyan>.</font>intercalate <font color=Cyan>(</font>singleton <font color=Magenta>' '</font><font color=Cyan>)</font>-<a name="(line65)"></a>vcat <font color=Red>=</font> Data<font color=Cyan>.</font>ByteString<font color=Cyan>.</font>Lazy<font color=Cyan>.</font>Char8<font color=Cyan>.</font>intercalate <font color=Cyan>(</font>singleton <font color=Magenta>'\n'</font><font color=Cyan>)</font>-<a name="(line66)"></a><font color=Green><u>_</u></font> <font color=Red>=</font> hcat-<a name="(line67)"></a>sep <font color=Red>=</font> hsep-<a name="(line68)"></a><a name="text"></a>text <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> ByteString-<a name="(line69)"></a>text <font color=Red>=</font> pack-<a name="(line70)"></a><font color=Blue>-- _ = cat</font>-<a name="(line71)"></a>fsep <font color=Red>=</font> sep-<a name="(line72)"></a>nest <font color=Green><u>_</u></font> b <font color=Red>=</font> pack <font color=Magenta>" "</font> <font color=Cyan><></font> b-<a name="(line73)"></a><a name="parens"></a>parens <font color=Red>::</font> ByteString <font color=Red>-></font> ByteString-<a name="(line74)"></a>parens p <font color=Red>=</font> pack <font color=Magenta>"("</font> <font color=Cyan><></font> p <font color=Cyan><></font> pack <font color=Magenta>")"</font>-<a name="(line75)"></a>-<a name="(line76)"></a>-<a name="(line77)"></a><font color=Blue>----</font>-<a name="(line78)"></a><font color=Blue>-- Now for the XML pretty-printing interface.</font>-<a name="(line79)"></a><font color=Blue>-- (Basically copied direct from Text.XML.HaXml.Pretty).</font>-<a name="(line80)"></a>-<a name="(line81)"></a><a name="document"></a>document <font color=Red>::</font> Document i <font color=Red>-></font> ByteString-<a name="(line82)"></a><a name="prolog"></a>prolog <font color=Red>::</font> Prolog <font color=Red>-></font> ByteString-<a name="(line83)"></a><a name="xmldecl"></a>xmldecl <font color=Red>::</font> XMLDecl <font color=Red>-></font> ByteString-<a name="(line84)"></a><a name="misc"></a>misc <font color=Red>::</font> Misc <font color=Red>-></font> ByteString-<a name="(line85)"></a><a name="sddecl"></a>sddecl <font color=Red>::</font> Bool <font color=Red>-></font> ByteString-<a name="(line86)"></a>-<a name="(line87)"></a><a name="doctypedecl"></a>doctypedecl <font color=Red>::</font> DocTypeDecl <font color=Red>-></font> ByteString-<a name="(line88)"></a><a name="markupdecl"></a>markupdecl <font color=Red>::</font> MarkupDecl <font color=Red>-></font> ByteString-<a name="(line89)"></a><a name="cp"></a><font color=Blue>-- extsubset :: ExtSubset -> ByteString</font>-<a name="(line90)"></a><font color=Blue>-- extsubsetdecl :: ExtSubsetDecl -> ByteString</font>-<a name="(line91)"></a>cp <font color=Red>::</font> CP <font color=Red>-></font> ByteString-<a name="(line92)"></a>-<a name="(line93)"></a><a name="element"></a>element <font color=Red>::</font> Element i <font color=Red>-></font> ByteString-<a name="(line94)"></a><a name="attribute"></a>attribute <font color=Red>::</font> Attribute <font color=Red>-></font> ByteString-<a name="(line95)"></a><a name="content"></a>content <font color=Red>::</font> Content i <font color=Red>-></font> ByteString-<a name="(line96)"></a>-<a name="(line97)"></a><font color=Blue>----</font>-<a name="(line98)"></a>-<a name="(line99)"></a>document <font color=Cyan>(</font>Document p <font color=Green><u>_</u></font> e m<font color=Cyan>)</font><font color=Red>=</font> prolog p <font color=Cyan>$$</font> element e <font color=Cyan>$$</font> vcat <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map misc m<font color=Cyan>)</font>-<a name="(line100)"></a>prolog <font color=Cyan>(</font>Prolog x m1 dtd m2<font color=Cyan>)</font><font color=Red>=</font> maybe xmldecl x <font color=Cyan>$$</font>-<a name="(line101)"></a> vcat <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map misc m1<font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line102)"></a> maybe doctypedecl dtd <font color=Cyan>$$</font>-<a name="(line103)"></a> vcat <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map misc m2<font color=Cyan>)</font>-<a name="(line104)"></a>xmldecl <font color=Cyan>(</font>XMLDecl v e sd<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?xml version='"</font> <font color=Cyan><></font> text v <font color=Cyan><></font> text <font color=Magenta>"'"</font> <font color=Cyan><+></font>-<a name="(line105)"></a> maybe encodingdecl e <font color=Cyan><+></font>-<a name="(line106)"></a> maybe sddecl sd <font color=Cyan><+></font>-<a name="(line107)"></a> text <font color=Magenta>"?>"</font>-<a name="(line108)"></a>misc <font color=Cyan>(</font>Comment s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!--"</font> <font color=Cyan><+></font> text s <font color=Cyan><+></font> text <font color=Magenta>"-->"</font>-<a name="(line109)"></a>misc <font color=Cyan>(</font>PI <font color=Cyan>(</font>n<font color=Cyan>,</font>s<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> text s <font color=Cyan><+></font> text <font color=Magenta>"?>"</font>-<a name="(line110)"></a>sddecl sd <font color=Red>|</font> sd <font color=Red>=</font> text <font color=Magenta>"standalone='yes'"</font>-<a name="(line111)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"standalone='no'"</font>-<a name="(line112)"></a>doctypedecl <font color=Cyan>(</font>DTD n eid ds<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>if</u></font> Prelude<font color=Cyan>.</font>null ds <font color=Green><u>then</u></font>-<a name="(line113)"></a> hd <font color=Cyan><></font> text <font color=Magenta>">"</font>-<a name="(line114)"></a> <font color=Green><u>else</u></font> hd <font color=Cyan><+></font> text <font color=Magenta>" ["</font> <font color=Cyan>$$</font>-<a name="(line115)"></a> vcat <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map markupdecl ds<font color=Cyan>)</font> <font color=Cyan>$$</font> text <font color=Magenta>"]>"</font>-<a name="(line116)"></a> <font color=Green><u>where</u></font> hd <font color=Red>=</font> text <font color=Magenta>"<!DOCTYPE"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>-<a name="(line117)"></a> maybe externalid eid-<a name="(line118)"></a>markupdecl <font color=Cyan>(</font>Element e<font color=Cyan>)</font> <font color=Red>=</font> elementdecl e-<a name="(line119)"></a>markupdecl <font color=Cyan>(</font>AttList a<font color=Cyan>)</font> <font color=Red>=</font> attlistdecl a-<a name="(line120)"></a>markupdecl <font color=Cyan>(</font>Entity e<font color=Cyan>)</font> <font color=Red>=</font> entitydecl e-<a name="(line121)"></a>markupdecl <font color=Cyan>(</font>Notation n<font color=Cyan>)</font> <font color=Red>=</font> notationdecl n-<a name="(line122)"></a>markupdecl <font color=Cyan>(</font>MarkupMisc m<font color=Cyan>)</font> <font color=Red>=</font> misc m-<a name="(line123)"></a><font color=Blue>--markupdecl (MarkupPE p m) = peref p</font>-<a name="(line124)"></a><font color=Blue>-- _ (ExtSubset t ds) = maybe textdecl t $$</font>-<a name="(line125)"></a><font color=Blue>-- vcat (Prelude.map extsubsetdecl ds)</font>-<a name="(line126)"></a><font color=Blue>-- _ (ExtMarkupDecl m) = markupdecl m</font>-<a name="(line127)"></a><font color=Blue>-- extsubsetdecl (ExtConditionalSect c) = conditionalsect c</font>-<a name="(line128)"></a><font color=Blue>--extsubsetdecl (ExtPEReference p e) = peref p</font>-<a name="(line129)"></a>-<a name="(line130)"></a>element <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font>-<a name="(line131)"></a> fsep <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"/>"</font>-<a name="(line132)"></a>element e<font color=Red>@</font><font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font>-<a name="(line133)"></a><font color=Blue>-- | any isText cs = text "<" <> text n <+> fsep (map attribute as) <></font>-<a name="(line134)"></a><font color=Blue>-- text ">" <> hcat (map content cs) <></font>-<a name="(line135)"></a><font color=Blue>-- text "</" <> text n <> text ">"</font>-<a name="(line136)"></a> <font color=Red>|</font> isText <font color=Cyan>(</font>head cs<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line137)"></a> text <font color=Magenta>">"</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map content cs<font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line138)"></a> text <font color=Magenta>"</"</font> <font color=Cyan><></font> text n <font color=Cyan><></font> text <font color=Magenta>">"</font>-<a name="(line139)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>d<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>=</font> carryelem e empty-<a name="(line140)"></a> <font color=Green><u>in</u></font> d <font color=Cyan><></font> c-<a name="(line141)"></a>-<a name="(line142)"></a><a name="isText"></a>isText <font color=Red>::</font> Content t <font color=Red>-></font> Bool-<a name="(line143)"></a>isText <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True-<a name="(line144)"></a>isText <font color=Cyan>(</font>CRef <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True-<a name="(line145)"></a>isText <font color=Green><u>_</u></font> <font color=Red>=</font> False-<a name="(line146)"></a>-<a name="(line147)"></a><a name="carryelem"></a>carryelem <font color=Red>::</font> Element t <font color=Red>-></font> ByteString <font color=Red>-></font> <font color=Cyan>(</font>ByteString<font color=Cyan>,</font> ByteString<font color=Cyan>)</font>-<a name="(line148)"></a>carryelem <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font> c-<a name="(line149)"></a> <font color=Red>=</font> <font color=Cyan>(</font> c <font color=Cyan><></font>-<a name="(line150)"></a> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font>-<a name="(line151)"></a> <font color=Cyan>,</font> text <font color=Magenta>"/>"</font><font color=Cyan>)</font>-<a name="(line152)"></a>carryelem <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> c-<a name="(line153)"></a><font color=Blue>-- | any isText cs = ( c <> element e, empty)</font>-<a name="(line154)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>cs0<font color=Cyan>,</font>d0<font color=Cyan>)</font> <font color=Red>=</font> carryscan carrycontent cs <font color=Cyan>(</font>text <font color=Magenta>">"</font><font color=Cyan>)</font>-<a name="(line155)"></a> <font color=Green><u>in</u></font>-<a name="(line156)"></a> <font color=Cyan>(</font> c <font color=Cyan><></font>-<a name="(line157)"></a> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line158)"></a> nest <font color=Magenta>2</font> <font color=Cyan>(</font>vcat cs0<font color=Cyan>)</font> <font color=Cyan><></font> <font color=Blue>--- $$</font>-<a name="(line159)"></a> d0 <font color=Cyan><></font> text <font color=Magenta>"</"</font> <font color=Cyan><></font> text n-<a name="(line160)"></a> <font color=Cyan>,</font> text <font color=Magenta>">"</font><font color=Cyan>)</font>-<a name="(line161)"></a><a name="carrycontent"></a>carrycontent <font color=Red>::</font> Content t <font color=Red>-></font> ByteString <font color=Red>-></font> <font color=Cyan>(</font>ByteString<font color=Cyan>,</font> ByteString<font color=Cyan>)</font>-<a name="(line162)"></a>carrycontent <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> carryelem e c-<a name="(line163)"></a>carrycontent <font color=Cyan>(</font>CString False s <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> chardata s<font color=Cyan>,</font> empty<font color=Cyan>)</font>-<a name="(line164)"></a>carrycontent <font color=Cyan>(</font>CString True s <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> cdsect s<font color=Cyan>,</font> empty<font color=Cyan>)</font>-<a name="(line165)"></a>carrycontent <font color=Cyan>(</font>CRef r <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> reference r<font color=Cyan>,</font> empty<font color=Cyan>)</font>-<a name="(line166)"></a>carrycontent <font color=Cyan>(</font>CMisc m <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> misc m<font color=Cyan>,</font> empty<font color=Cyan>)</font>-<a name="(line167)"></a>-<a name="(line168)"></a><a name="carryscan"></a>carryscan <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font>c<font color=Red>-></font><font color=Cyan>(</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-></font> c <font color=Red>-></font> <font color=Cyan>(</font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>,</font>c<font color=Cyan>)</font>-<a name="(line169)"></a>carryscan <font color=Green><u>_</u></font> [] c <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>c<font color=Cyan>)</font>-<a name="(line170)"></a>carryscan f <font color=Cyan>(</font>a<font color=Red><b>:</b></font><font color=Green><u>as</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>b<font color=Cyan>,</font> c0<font color=Cyan>)</font> <font color=Red>=</font> f a c-<a name="(line171)"></a> <font color=Cyan>(</font>bs<font color=Cyan>,</font>c1<font color=Cyan>)</font> <font color=Red>=</font> carryscan f <font color=Green><u>as</u></font> c0-<a name="(line172)"></a> <font color=Green><u>in</u></font> <font color=Cyan>(</font>b<font color=Red><b>:</b></font>bs<font color=Cyan>,</font> c1<font color=Cyan>)</font>-<a name="(line173)"></a>-<a name="(line174)"></a><font color=Blue>--carryelem e@(Elem n as cs) c</font>-<a name="(line175)"></a><font color=Blue>-- | isText (head cs) =</font>-<a name="(line176)"></a><font color=Blue>-- ( start <></font>-<a name="(line177)"></a><font color=Blue>-- text ">" <> hcat (map content cs) <> text "</" <> text n</font>-<a name="(line178)"></a><font color=Blue>-- , text ">")</font>-<a name="(line179)"></a><font color=Blue>-- | otherwise =</font>-<a name="(line180)"></a><font color=Blue>-- let (d,c0) = foldl carrycontent (start, text ">") cs in</font>-<a name="(line181)"></a><font color=Blue>-- ( d <> c0 <> text "</" <> text n</font>-<a name="(line182)"></a><font color=Blue>-- , text ">")</font>-<a name="(line183)"></a><font color=Blue>-- where start = c <> text "<" <> text n <+> fsep (map attribute as)</font>-<a name="(line184)"></a><font color=Blue>--</font>-<a name="(line185)"></a><font color=Blue>--carrycontent (d,c) (CElem e) = let (d',c') = carryelem e c in</font>-<a name="(line186)"></a><font color=Blue>-- (d $$ nest 2 d', c')</font>-<a name="(line187)"></a><font color=Blue>--carrycontent (d,c) (CString _ s) = (d <> c <> chardata s, empty)</font>-<a name="(line188)"></a><font color=Blue>--carrycontent (d,c) (CRef r) = (d <> c <> reference r,empty)</font>-<a name="(line189)"></a><font color=Blue>--carrycontent (d,c) (CMisc m) = (d $$ c <> misc m, empty)</font>-<a name="(line190)"></a>-<a name="(line191)"></a>-<a name="(line192)"></a>attribute <font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><></font> text <font color=Magenta>"="</font> <font color=Cyan><></font> attvalue v-<a name="(line193)"></a>content <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> element e-<a name="(line194)"></a>content <font color=Cyan>(</font>CString False s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> chardata s-<a name="(line195)"></a>content <font color=Cyan>(</font>CString True s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> cdsect s-<a name="(line196)"></a>content <font color=Cyan>(</font>CRef r <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> reference r-<a name="(line197)"></a>content <font color=Cyan>(</font>CMisc m <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> misc m-<a name="(line198)"></a>-<a name="(line199)"></a><a name="elementdecl"></a>elementdecl <font color=Red>::</font> ElementDecl <font color=Red>-></font> ByteString-<a name="(line200)"></a>elementdecl <font color=Cyan>(</font>ElementDecl n cs<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ELEMENT"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>-<a name="(line201)"></a> contentspec cs <font color=Cyan><></font> text <font color=Magenta>">"</font>-<a name="(line202)"></a><a name="contentspec"></a>contentspec <font color=Red>::</font> ContentSpec <font color=Red>-></font> ByteString-<a name="(line203)"></a>contentspec EMPTY <font color=Red>=</font> text <font color=Magenta>"EMPTY"</font>-<a name="(line204)"></a>contentspec ANY <font color=Red>=</font> text <font color=Magenta>"ANY"</font>-<a name="(line205)"></a>contentspec <font color=Cyan>(</font>Mixed m<font color=Cyan>)</font> <font color=Red>=</font> mixed m-<a name="(line206)"></a>contentspec <font color=Cyan>(</font>ContentSpec c<font color=Cyan>)</font> <font color=Red>=</font> cp c-<a name="(line207)"></a><font color=Blue>--contentspec (ContentPE p cs) = peref p</font>-<a name="(line208)"></a>cp <font color=Cyan>(</font>TagName n m<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><></font> modifier m-<a name="(line209)"></a>cp <font color=Cyan>(</font>Choice cs m<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map cp cs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line210)"></a> modifier m-<a name="(line211)"></a>cp <font color=Cyan>(</font>Seq cs m<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>","</font><font color=Cyan>)</font> <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map cp cs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line212)"></a> modifier m-<a name="(line213)"></a><a name="modifier"></a><font color=Blue>--cp (CPPE p c) = peref p</font>-<a name="(line214)"></a>modifier <font color=Red>::</font> Modifier <font color=Red>-></font> ByteString-<a name="(line215)"></a>modifier None <font color=Red>=</font> empty-<a name="(line216)"></a>modifier Query <font color=Red>=</font> text <font color=Magenta>"?"</font>-<a name="(line217)"></a>modifier Star <font color=Red>=</font> text <font color=Magenta>"*"</font>-<a name="(line218)"></a>modifier Plus <font color=Red>=</font> text <font color=Magenta>"+"</font>-<a name="(line219)"></a><a name="mixed"></a>mixed <font color=Red>::</font> Mixed <font color=Red>-></font> ByteString-<a name="(line220)"></a>mixed PCDATA <font color=Red>=</font> text <font color=Magenta>"(#PCDATA)"</font>-<a name="(line221)"></a>mixed <font color=Cyan>(</font>PCDATAplus ns<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"(#PCDATA |"</font> <font color=Cyan><+></font>-<a name="(line222)"></a> hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map text ns<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line223)"></a> text <font color=Magenta>")*"</font>-<a name="(line224)"></a>-<a name="(line225)"></a><a name="attlistdecl"></a>attlistdecl <font color=Red>::</font> AttListDecl <font color=Red>-></font> ByteString-<a name="(line226)"></a>attlistdecl <font color=Cyan>(</font>AttListDecl n ds<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ATTLIST"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>-<a name="(line227)"></a> fsep <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map attdef ds<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>">"</font>-<a name="(line228)"></a><a name="attdef"></a>attdef <font color=Red>::</font> AttDef <font color=Red>-></font> ByteString-<a name="(line229)"></a>attdef <font color=Cyan>(</font>AttDef n t d<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><+></font> atttype t <font color=Cyan><+></font> defaultdecl d-<a name="(line230)"></a><a name="atttype"></a>atttype <font color=Red>::</font> AttType <font color=Red>-></font> ByteString-<a name="(line231)"></a>atttype StringType <font color=Red>=</font> text <font color=Magenta>"CDATA"</font>-<a name="(line232)"></a>atttype <font color=Cyan>(</font>TokenizedType t<font color=Cyan>)</font> <font color=Red>=</font> tokenizedtype t-<a name="(line233)"></a>atttype <font color=Cyan>(</font>EnumeratedType t<font color=Cyan>)</font> <font color=Red>=</font> enumeratedtype t-<a name="(line234)"></a><a name="tokenizedtype"></a>tokenizedtype <font color=Red>::</font> TokenizedType <font color=Red>-></font> ByteString-<a name="(line235)"></a>tokenizedtype ID <font color=Red>=</font> text <font color=Magenta>"ID"</font>-<a name="(line236)"></a>tokenizedtype IDREF <font color=Red>=</font> text <font color=Magenta>"IDREF"</font>-<a name="(line237)"></a>tokenizedtype IDREFS <font color=Red>=</font> text <font color=Magenta>"IDREFS"</font>-<a name="(line238)"></a>tokenizedtype ENTITY <font color=Red>=</font> text <font color=Magenta>"ENTITY"</font>-<a name="(line239)"></a>tokenizedtype ENTITIES <font color=Red>=</font> text <font color=Magenta>"ENTITIES"</font>-<a name="(line240)"></a>tokenizedtype NMTOKEN <font color=Red>=</font> text <font color=Magenta>"NMTOKEN"</font>-<a name="(line241)"></a>tokenizedtype NMTOKENS <font color=Red>=</font> text <font color=Magenta>"NMTOKENS"</font>-<a name="(line242)"></a><a name="enumeratedtype"></a>enumeratedtype <font color=Red>::</font> EnumeratedType <font color=Red>-></font> ByteString-<a name="(line243)"></a>enumeratedtype <font color=Cyan>(</font>NotationType n<font color=Cyan>)</font><font color=Red>=</font> notationtype n-<a name="(line244)"></a>enumeratedtype <font color=Cyan>(</font>Enumeration e<font color=Cyan>)</font> <font color=Red>=</font> enumeration e-<a name="(line245)"></a><a name="notationtype"></a>notationtype <font color=Red>::</font> <font color=Red>[</font><font color=Red>[</font>Char<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> ByteString-<a name="(line246)"></a>notationtype ns <font color=Red>=</font> text <font color=Magenta>"NOTATION"</font> <font color=Cyan><+></font>-<a name="(line247)"></a> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map text ns<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line248)"></a><a name="enumeration"></a>enumeration <font color=Red>::</font> <font color=Red>[</font><font color=Red>[</font>Char<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> ByteString-<a name="(line249)"></a>enumeration ns <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map nmtoken ns<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line250)"></a><a name="defaultdecl"></a>defaultdecl <font color=Red>::</font> DefaultDecl <font color=Red>-></font> ByteString-<a name="(line251)"></a>defaultdecl REQUIRED <font color=Red>=</font> text <font color=Magenta>"#REQUIRED"</font>-<a name="(line252)"></a>defaultdecl IMPLIED <font color=Red>=</font> text <font color=Magenta>"#IMPLIED"</font>-<a name="(line253)"></a>defaultdecl <font color=Cyan>(</font>DefaultTo a f<font color=Cyan>)</font> <font color=Red>=</font> maybe <font color=Cyan>(</font>const <font color=Cyan>(</font>text <font color=Magenta>"#FIXED"</font><font color=Cyan>)</font><font color=Cyan>)</font> f <font color=Cyan><+></font> attvalue a-<a name="(line254)"></a><a name="reference"></a><font color=Blue>--_ (IncludeSect i)= text "<![INCLUDE [" <+></font>-<a name="(line255)"></a><font color=Blue>-- vcat (Prelude.map extsubsetdecl i) <+> text "]]>"</font>-<a name="(line256)"></a><font color=Blue>-- conditionalsect (IgnoreSect i) = text "<![IGNORE [" <+></font>-<a name="(line257)"></a><font color=Blue>-- fsep (Prelude.map ignoresectcontents i) <+> text "]]>"</font>-<a name="(line258)"></a><font color=Blue>-- -- _ (Ignore) = empty</font>-<a name="(line259)"></a><font color=Blue>-- ignoresectcontents :: IgnoreSectContents -> ByteString</font>-<a name="(line260)"></a><font color=Blue>-- _ (IgnoreSectContents i is)</font>-<a name="(line261)"></a><font color=Blue>-- = ignore i <+> vcat (Prelude.map internal is)</font>-<a name="(line262)"></a><font color=Blue>-- where internal (ics,i) = text "<![[" <+></font>-<a name="(line263)"></a><font color=Blue>-- ignoresectcontents ics <+></font>-<a name="(line264)"></a><font color=Blue>-- text "]]>" <+> ignore i</font>-<a name="(line265)"></a>reference <font color=Red>::</font> Reference <font color=Red>-></font> ByteString-<a name="(line266)"></a>reference <font color=Cyan>(</font>RefEntity er<font color=Cyan>)</font> <font color=Red>=</font> entityref er-<a name="(line267)"></a>reference <font color=Cyan>(</font>RefChar cr<font color=Cyan>)</font> <font color=Red>=</font> charref cr-<a name="(line268)"></a><a name="entityref"></a>entityref <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> ByteString-<a name="(line269)"></a>entityref n <font color=Red>=</font> text <font color=Magenta>"&"</font> <font color=Cyan><></font> text n <font color=Cyan><></font> text <font color=Magenta>";"</font>-<a name="(line270)"></a><a name="charref"></a>charref <font color=Red>::</font> <font color=Cyan>(</font>Show a<font color=Cyan>)</font> <font color=Red>=></font> a <font color=Red>-></font> ByteString-<a name="(line271)"></a>charref c <font color=Red>=</font> text <font color=Magenta>"&#"</font> <font color=Cyan><></font> text <font color=Cyan>(</font>show c<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>";"</font>-<a name="(line272)"></a><a name="entitydecl"></a>entitydecl <font color=Red>::</font> EntityDecl <font color=Red>-></font> ByteString-<a name="(line273)"></a>entitydecl <font color=Cyan>(</font>EntityGEDecl d<font color=Cyan>)</font> <font color=Red>=</font> gedecl d-<a name="(line274)"></a>entitydecl <font color=Cyan>(</font>EntityPEDecl d<font color=Cyan>)</font> <font color=Red>=</font> pedecl d-<a name="(line275)"></a><a name="gedecl"></a>gedecl <font color=Red>::</font> GEDecl <font color=Red>-></font> ByteString-<a name="(line276)"></a>gedecl <font color=Cyan>(</font>GEDecl n ed<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ENTITY"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font> entitydef ed <font color=Cyan><></font>-<a name="(line277)"></a> text <font color=Magenta>">"</font>-<a name="(line278)"></a><a name="pedecl"></a>pedecl <font color=Red>::</font> PEDecl <font color=Red>-></font> ByteString-<a name="(line279)"></a>pedecl <font color=Cyan>(</font>PEDecl n pd<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ENTITY %"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> pedef pd <font color=Cyan><></font>-<a name="(line280)"></a> text <font color=Magenta>">"</font>-<a name="(line281)"></a><a name="entitydef"></a>entitydef <font color=Red>::</font> EntityDef <font color=Red>-></font> ByteString-<a name="(line282)"></a>entitydef <font color=Cyan>(</font>DefEntityValue ew<font color=Cyan>)</font> <font color=Red>=</font> entityvalue ew-<a name="(line283)"></a>entitydef <font color=Cyan>(</font>DefExternalID i nd<font color=Cyan>)</font> <font color=Red>=</font> externalid i <font color=Cyan><+></font> maybe ndatadecl nd-<a name="(line284)"></a><a name="pedef"></a>pedef <font color=Red>::</font> PEDef <font color=Red>-></font> ByteString-<a name="(line285)"></a>pedef <font color=Cyan>(</font>PEDefEntityValue ew<font color=Cyan>)</font> <font color=Red>=</font> entityvalue ew-<a name="(line286)"></a>pedef <font color=Cyan>(</font>PEDefExternalID eid<font color=Cyan>)</font> <font color=Red>=</font> externalid eid-<a name="(line287)"></a><a name="externalid"></a>externalid <font color=Red>::</font> ExternalID <font color=Red>-></font> ByteString-<a name="(line288)"></a>externalid <font color=Cyan>(</font>SYSTEM sl<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"SYSTEM"</font> <font color=Cyan><+></font> systemliteral sl-<a name="(line289)"></a>externalid <font color=Cyan>(</font>PUBLIC i sl<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"PUBLIC"</font> <font color=Cyan><+></font> pubidliteral i <font color=Cyan><+></font>-<a name="(line290)"></a> systemliteral sl-<a name="(line291)"></a><a name="ndatadecl"></a>ndatadecl <font color=Red>::</font> NDataDecl <font color=Red>-></font> ByteString-<a name="(line292)"></a>ndatadecl <font color=Cyan>(</font>NDATA n<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"NDATA"</font> <font color=Cyan><+></font> text n-<a name="(line293)"></a><a name="notationdecl"></a><font color=Blue>-- _ (TextDecl vi ed) = text "<?xml" <+> maybe text vi <+></font>-<a name="(line294)"></a><font color=Blue>-- encodingdecl ed <> text "?>"</font>-<a name="(line295)"></a><font color=Blue>-- extparsedent :: ExtParsedEnt t -> ByteString</font>-<a name="(line296)"></a><font color=Blue>-- _ (ExtParsedEnt t c)= maybe textdecl t <+> content c</font>-<a name="(line297)"></a><font color=Blue>-- _ (ExtPE t esd) = maybe textdecl t <+></font>-<a name="(line298)"></a><font color=Blue>-- vcat (Prelude.map extsubsetdecl esd)</font>-<a name="(line299)"></a>notationdecl <font color=Red>::</font> NotationDecl <font color=Red>-></font> ByteString-<a name="(line300)"></a>notationdecl <font color=Cyan>(</font>NOTATION n e<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!NOTATION"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>-<a name="(line301)"></a> either externalid publicid e <font color=Cyan><></font>-<a name="(line302)"></a> text <font color=Magenta>">"</font>-<a name="(line303)"></a><a name="publicid"></a>publicid <font color=Red>::</font> PublicID <font color=Red>-></font> ByteString-<a name="(line304)"></a>publicid <font color=Cyan>(</font>PUBLICID p<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"PUBLICID"</font> <font color=Cyan><+></font> pubidliteral p-<a name="(line305)"></a><a name="encodingdecl"></a>encodingdecl <font color=Red>::</font> EncodingDecl <font color=Red>-></font> ByteString-<a name="(line306)"></a>encodingdecl <font color=Cyan>(</font>EncodingDecl s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"encoding='"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>-<a name="(line307)"></a><a name="nmtoken"></a>nmtoken <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> ByteString-<a name="(line308)"></a>nmtoken s <font color=Red>=</font> text s-<a name="(line309)"></a><a name="attvalue"></a>attvalue <font color=Red>::</font> AttValue <font color=Red>-></font> ByteString-<a name="(line310)"></a>attvalue <font color=Cyan>(</font>AttValue esr<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font>-<a name="(line311)"></a> hcat <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map <font color=Cyan>(</font>either text reference<font color=Cyan>)</font> esr<font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line312)"></a> text <font color=Magenta>"\""</font>-<a name="(line313)"></a><a name="entityvalue"></a>entityvalue <font color=Red>::</font> EntityValue <font color=Red>-></font> ByteString-<a name="(line314)"></a>entityvalue <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font>-<a name="(line315)"></a> <font color=Red>|</font> containsDoubleQuote evs <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map ev evs<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"'"</font>-<a name="(line316)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map ev evs<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"\""</font>-<a name="(line317)"></a><a name="ev"></a>ev <font color=Red>::</font> EV <font color=Red>-></font> ByteString-<a name="(line318)"></a>ev <font color=Cyan>(</font>EVString s<font color=Cyan>)</font> <font color=Red>=</font> text s-<a name="(line319)"></a><font color=Blue>--ev (EVPERef p e) = peref p</font>-<a name="(line320)"></a>ev <font color=Cyan>(</font>EVRef r<font color=Cyan>)</font> <font color=Red>=</font> reference r-<a name="(line321)"></a><a name="pubidliteral"></a>pubidliteral <font color=Red>::</font> PubidLiteral <font color=Red>-></font> ByteString-<a name="(line322)"></a>pubidliteral <font color=Cyan>(</font>PubidLiteral s<font color=Cyan>)</font>-<a name="(line323)"></a> <font color=Red>|</font> toWord8 <font color=Magenta>'"'</font> <font color=Cyan>`elem`</font> <font color=Cyan>(</font>pack s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>-<a name="(line324)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"\""</font>-<a name="(line325)"></a><a name="systemliteral"></a>systemliteral <font color=Red>::</font> SystemLiteral <font color=Red>-></font> ByteString-<a name="(line326)"></a>systemliteral <font color=Cyan>(</font>SystemLiteral s<font color=Cyan>)</font>-<a name="(line327)"></a> <font color=Red>|</font> toWord8 <font color=Magenta>'"'</font> <font color=Cyan>`elem`</font> <font color=Cyan>(</font>pack s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>-<a name="(line328)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"\""</font>-<a name="(line329)"></a><a name="chardata"></a>chardata<font color=Cyan>,</font> cdsect <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> ByteString-<a name="(line330)"></a>chardata s <font color=Red>=</font> <font color=Blue>{-if all isSpace s then empty else-}</font> text s-<a name="(line331)"></a><a name="cdsect"></a>cdsect c <font color=Red>=</font> text <font color=Magenta>"<![CDATA["</font> <font color=Cyan><></font> chardata c <font color=Cyan><></font> text <font color=Magenta>"]]>"</font>-<a name="(line332)"></a>-<a name="(line333)"></a><a name="toWord8"></a><font color=Blue>-- toWord8 :: Char -> Word8</font>-<a name="(line334)"></a>toWord8 <font color=Red>::</font> <font color=Cyan>(</font>Enum a<font color=Cyan>,</font> Enum a1<font color=Cyan>)</font> <font color=Red>=></font> a1 <font color=Red>-></font> a-<a name="(line335)"></a>toWord8 <font color=Red>=</font> toEnum <font color=Cyan>.</font> fromEnum-<a name="(line336)"></a>-<a name="(line337)"></a><a name="containsDoubleQuote"></a>containsDoubleQuote <font color=Red>::</font> <font color=Red>[</font>EV<font color=Red>]</font> <font color=Red>-></font> Bool-<a name="(line338)"></a>containsDoubleQuote evs <font color=Red>=</font> any csq evs-<a name="(line339)"></a> <font color=Green><u>where</u></font> csq <font color=Cyan>(</font>EVString s<font color=Cyan>)</font> <font color=Red>=</font> toWord8 <font color=Magenta>'"'</font> <font color=Cyan>`elem`</font> <font color=Cyan>(</font>pack s<font color=Cyan>)</font>-<a name="(line340)"></a> csq <font color=Green><u>_</u></font> <font color=Red>=</font> False+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/ByteStringPP.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>-- | This is a fast non-pretty-printer for turning the internal representation</font>+<a name="line-2"></a><font color=Blue>-- of generic structured XML documents into Lazy ByteStrings.</font>+<a name="line-3"></a><font color=Blue>-- Like in Text.Xml.HaXml.Pretty, there is one pp function for each type in</font>+<a name="line-4"></a><font color=Blue>-- Text.Xml.HaXml.Types, so you can pretty-print as much or as little</font>+<a name="line-5"></a><font color=Blue>-- of the document as you wish.</font>+<a name="line-6"></a>+<a name="line-7"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>ByteStringPP+<a name="line-8"></a> <font color=Cyan>(</font>+<a name="line-9"></a> <font color=Blue>-- * Pretty-print a whole document</font>+<a name="line-10"></a> document+<a name="line-11"></a> <font color=Blue>-- ** Just one content</font>+<a name="line-12"></a> <font color=Cyan>,</font> content+<a name="line-13"></a> <font color=Blue>-- ** Just one tagged element</font>+<a name="line-14"></a> <font color=Cyan>,</font> element+<a name="line-15"></a> <font color=Blue>-- * Pretty-print just a DTD</font>+<a name="line-16"></a> <font color=Cyan>,</font> doctypedecl+<a name="line-17"></a> <font color=Blue>-- ** The prolog</font>+<a name="line-18"></a> <font color=Cyan>,</font> prolog+<a name="line-19"></a> <font color=Blue>-- ** A content particle description</font>+<a name="line-20"></a> <font color=Cyan>,</font> cp+<a name="line-21"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-22"></a>+<a name="line-23"></a><font color=Green><u>import</u></font> Prelude hiding <font color=Cyan>(</font>maybe<font color=Cyan>,</font>either<font color=Cyan>,</font>elem<font color=Cyan>,</font>concat<font color=Cyan>)</font>+<a name="line-24"></a><font color=Green><u>import</u></font> Maybe hiding <font color=Cyan>(</font>maybe<font color=Cyan>)</font>+<a name="line-25"></a><font color=Green><u>import</u></font> Data<font color=Cyan>.</font>List <font color=Cyan>(</font>intersperse<font color=Cyan>)</font>+<a name="line-26"></a><font color=Blue>--import Data.ByteString.Lazy hiding (pack,map,head,any,singleton,intersperse,join)</font>+<a name="line-27"></a><font color=Green><u>import</u></font> Data<font color=Cyan>.</font>ByteString<font color=Cyan>.</font>Lazy<font color=Cyan>.</font>Char8 <font color=Cyan>(</font>ByteString()<font color=Cyan>,</font> concat<font color=Cyan>,</font> pack<font color=Cyan>,</font> singleton<font color=Cyan>,</font> intercalate+<a name="line-28"></a> <font color=Cyan>,</font> append<font color=Cyan>,</font> elem<font color=Cyan>,</font> empty<font color=Cyan>)</font>+<a name="line-29"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-30"></a>+<a name="line-31"></a><a name="either"></a><font color=Blue>either</font> <font color=Red>::</font> <font color=Cyan>(</font>t <font color=Red>-></font> t1<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>t2 <font color=Red>-></font> t1<font color=Cyan>)</font> <font color=Red>-></font> Either t t2 <font color=Red>-></font> t1+<a name="line-32"></a><font color=Blue>either</font> f <font color=Green><u>_</u></font> <font color=Cyan>(</font>Left x<font color=Cyan>)</font> <font color=Red>=</font> f x+<a name="line-33"></a><font color=Blue>either</font> <font color=Green><u>_</u></font> g <font color=Cyan>(</font>Right x<font color=Cyan>)</font> <font color=Red>=</font> g x+<a name="line-34"></a>+<a name="line-35"></a><a name="maybe"></a><font color=Blue>maybe</font> <font color=Red>::</font> <font color=Cyan>(</font>t <font color=Red>-></font> ByteString<font color=Cyan>)</font> <font color=Red>-></font> Maybe t <font color=Red>-></font> ByteString+<a name="line-36"></a><font color=Blue>maybe</font> <font color=Green><u>_</u></font> Nothing <font color=Red>=</font> empty+<a name="line-37"></a><font color=Blue>maybe</font> f <font color=Cyan>(</font>Just x<font color=Cyan>)</font> <font color=Red>=</font> f x+<a name="line-38"></a>+<a name="line-39"></a>+<a name="line-40"></a><font color=Blue>-- A simple implementation of the pretty-printing combinator interface,</font>+<a name="line-41"></a><font color=Blue>-- but for plain ByteStrings:</font>+<a name="line-42"></a><font color=Green><u>infixl</u></font> <font color=Magenta>6</font> <font color=Cyan><></font>+<a name="line-43"></a><font color=Green><u>infixl</u></font> <font color=Magenta>6</font> <font color=Cyan><+></font>+<a name="line-44"></a><font color=Green><u>infixl</u></font> <font color=Magenta>5</font> <font color=Cyan>$$</font>+<a name="line-45"></a><a name="<>"></a><font color=Cyan>(</font><font color=Cyan><></font><font color=Cyan>)</font> <font color=Red>::</font> ByteString <font color=Red>-></font> ByteString <font color=Red>-></font> ByteString <font color=Blue>-- Beside</font>+<a name="line-46"></a><a name="hcat"></a><font color=Blue>hcat</font> <font color=Red>::</font> <font color=Red>[</font>ByteString<font color=Red>]</font> <font color=Red>-></font> ByteString <font color=Blue>-- List version of <></font>+<a name="line-47"></a><a name="<+>"></a><font color=Cyan>(</font><font color=Cyan><+></font><font color=Cyan>)</font> <font color=Red>::</font> ByteString <font color=Red>-></font> ByteString <font color=Red>-></font> ByteString <font color=Blue>-- Beside, separated by space</font>+<a name="line-48"></a><a name="hsep"></a><font color=Blue>hsep</font> <font color=Red>::</font> <font color=Red>[</font>ByteString<font color=Red>]</font> <font color=Red>-></font> ByteString <font color=Blue>-- List version of <+></font>+<a name="line-49"></a><a name="$$"></a><font color=Cyan>(</font><font color=Cyan>$$</font><font color=Cyan>)</font> <font color=Red>::</font> ByteString <font color=Red>-></font> ByteString <font color=Red>-></font> ByteString <font color=Blue>-- Above; if there is no</font>+<a name="line-50"></a> <font color=Blue>-- overlap, it "dovetails"</font>+<a name="line-51"></a><a name="vcat"></a><font color=Blue>vcat</font> <font color=Red>::</font> <font color=Red>[</font>ByteString<font color=Red>]</font> <font color=Red>-></font> ByteString <font color=Blue>-- List version of $$</font>+<a name="line-52"></a><a name="sep"></a><font color=Blue>-- cat :: [ByteString] -> ByteString -- Either hcat or vcat</font>+<a name="line-53"></a><font color=Blue>sep</font> <font color=Red>::</font> <font color=Red>[</font>ByteString<font color=Red>]</font> <font color=Red>-></font> ByteString <font color=Blue>-- Either hsep or vcat</font>+<a name="line-54"></a><a name="fsep"></a><font color=Blue>-- fcat :: [ByteString] -> ByteString -- ``Paragraph fill'' version of cat</font>+<a name="line-55"></a><font color=Blue>fsep</font> <font color=Red>::</font> <font color=Red>[</font>ByteString<font color=Red>]</font> <font color=Red>-></font> ByteString <font color=Blue>-- ``Paragraph fill'' version of sep</font>+<a name="line-56"></a><a name="nest"></a><font color=Blue>nest</font> <font color=Red>::</font> Int <font color=Red>-></font> ByteString <font color=Red>-></font> ByteString <font color=Blue>-- Nested</font>+<a name="line-57"></a>+<a name="line-58"></a><font color=Cyan>(</font><font color=Cyan><></font><font color=Cyan>)</font> b1 b2 <font color=Red>=</font> b1 <font color=Cyan>`append`</font> b2+<a name="line-59"></a><font color=Cyan>(</font><font color=Cyan><+></font><font color=Cyan>)</font> b1 b2 <font color=Red>=</font> b1 <font color=Cyan><></font> pack <font color=Magenta>" "</font> <font color=Cyan><></font> b2+<a name="line-60"></a><font color=Cyan>(</font><font color=Cyan>$$</font><font color=Cyan>)</font> b1 b2 <font color=Red>=</font> b1 <font color=Cyan><></font> pack <font color=Magenta>"\n"</font> <font color=Cyan><></font> b2+<a name="line-61"></a><font color=Blue>-- ($+$) = ($$)</font>+<a name="line-62"></a>+<a name="line-63"></a><font color=Blue>hcat</font> <font color=Red>=</font> Data<font color=Cyan>.</font>ByteString<font color=Cyan>.</font>Lazy<font color=Cyan>.</font>Char8<font color=Cyan>.</font>concat+<a name="line-64"></a><font color=Blue>hsep</font> <font color=Red>=</font> Data<font color=Cyan>.</font>ByteString<font color=Cyan>.</font>Lazy<font color=Cyan>.</font>Char8<font color=Cyan>.</font>intercalate <font color=Cyan>(</font>singleton <font color=Magenta>' '</font><font color=Cyan>)</font>+<a name="line-65"></a><font color=Blue>vcat</font> <font color=Red>=</font> Data<font color=Cyan>.</font>ByteString<font color=Cyan>.</font>Lazy<font color=Cyan>.</font>Char8<font color=Cyan>.</font>intercalate <font color=Cyan>(</font>singleton <font color=Magenta>'\n'</font><font color=Cyan>)</font>+<a name="line-66"></a><font color=Green><u>_</u></font> <font color=Red>=</font> hcat+<a name="line-67"></a><font color=Blue>sep</font> <font color=Red>=</font> hsep+<a name="line-68"></a><a name="text"></a><font color=Blue>text</font> <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> ByteString+<a name="line-69"></a><font color=Blue>text</font> <font color=Red>=</font> pack+<a name="line-70"></a><font color=Blue>-- _ = cat</font>+<a name="line-71"></a><font color=Blue>fsep</font> <font color=Red>=</font> sep+<a name="line-72"></a><font color=Blue>nest</font> <font color=Green><u>_</u></font> b <font color=Red>=</font> pack <font color=Magenta>" "</font> <font color=Cyan><></font> b+<a name="line-73"></a><a name="parens"></a><font color=Blue>parens</font> <font color=Red>::</font> ByteString <font color=Red>-></font> ByteString+<a name="line-74"></a><font color=Blue>parens</font> p <font color=Red>=</font> pack <font color=Magenta>"("</font> <font color=Cyan><></font> p <font color=Cyan><></font> pack <font color=Magenta>")"</font>+<a name="line-75"></a>+<a name="line-76"></a>+<a name="line-77"></a><font color=Blue>----</font>+<a name="line-78"></a><font color=Blue>-- Now for the XML pretty-printing interface.</font>+<a name="line-79"></a><font color=Blue>-- (Basically copied direct from Text.XML.HaXml.Pretty).</font>+<a name="line-80"></a>+<a name="line-81"></a><a name="document"></a><font color=Blue>document</font> <font color=Red>::</font> Document i <font color=Red>-></font> ByteString+<a name="line-82"></a><a name="prolog"></a><font color=Blue>prolog</font> <font color=Red>::</font> Prolog <font color=Red>-></font> ByteString+<a name="line-83"></a><a name="xmldecl"></a><font color=Blue>xmldecl</font> <font color=Red>::</font> XMLDecl <font color=Red>-></font> ByteString+<a name="line-84"></a><a name="misc"></a><font color=Blue>misc</font> <font color=Red>::</font> Misc <font color=Red>-></font> ByteString+<a name="line-85"></a><a name="sddecl"></a><font color=Blue>sddecl</font> <font color=Red>::</font> Bool <font color=Red>-></font> ByteString+<a name="line-86"></a>+<a name="line-87"></a><a name="doctypedecl"></a><font color=Blue>doctypedecl</font> <font color=Red>::</font> DocTypeDecl <font color=Red>-></font> ByteString+<a name="line-88"></a><a name="markupdecl"></a><font color=Blue>markupdecl</font> <font color=Red>::</font> MarkupDecl <font color=Red>-></font> ByteString+<a name="line-89"></a><a name="cp"></a><font color=Blue>-- extsubset :: ExtSubset -> ByteString</font>+<a name="line-90"></a><font color=Blue>-- extsubsetdecl :: ExtSubsetDecl -> ByteString</font>+<a name="line-91"></a><font color=Blue>cp</font> <font color=Red>::</font> CP <font color=Red>-></font> ByteString+<a name="line-92"></a>+<a name="line-93"></a><a name="element"></a><font color=Blue>element</font> <font color=Red>::</font> Element i <font color=Red>-></font> ByteString+<a name="line-94"></a><a name="attribute"></a><font color=Blue>attribute</font> <font color=Red>::</font> Attribute <font color=Red>-></font> ByteString+<a name="line-95"></a><a name="content"></a><font color=Blue>content</font> <font color=Red>::</font> Content i <font color=Red>-></font> ByteString+<a name="line-96"></a>+<a name="line-97"></a><font color=Blue>----</font>+<a name="line-98"></a>+<a name="line-99"></a><font color=Blue>document</font> <font color=Cyan>(</font>Document p <font color=Green><u>_</u></font> e m<font color=Cyan>)</font><font color=Red>=</font> prolog p <font color=Cyan>$$</font> element e <font color=Cyan>$$</font> vcat <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map misc m<font color=Cyan>)</font>+<a name="line-100"></a><font color=Blue>prolog</font> <font color=Cyan>(</font>Prolog x m1 dtd m2<font color=Cyan>)</font><font color=Red>=</font> maybe xmldecl x <font color=Cyan>$$</font>+<a name="line-101"></a> vcat <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map misc m1<font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-102"></a> maybe doctypedecl dtd <font color=Cyan>$$</font>+<a name="line-103"></a> vcat <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map misc m2<font color=Cyan>)</font>+<a name="line-104"></a><font color=Blue>xmldecl</font> <font color=Cyan>(</font>XMLDecl v e sd<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?xml version='"</font> <font color=Cyan><></font> text v <font color=Cyan><></font> text <font color=Magenta>"'"</font> <font color=Cyan><+></font>+<a name="line-105"></a> maybe encodingdecl e <font color=Cyan><+></font>+<a name="line-106"></a> maybe sddecl sd <font color=Cyan><+></font>+<a name="line-107"></a> text <font color=Magenta>"?>"</font>+<a name="line-108"></a><font color=Blue>misc</font> <font color=Cyan>(</font>Comment s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!--"</font> <font color=Cyan><+></font> text s <font color=Cyan><+></font> text <font color=Magenta>"-->"</font>+<a name="line-109"></a><font color=Blue>misc</font> <font color=Cyan>(</font>PI <font color=Cyan>(</font>n<font color=Cyan>,</font>s<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> text s <font color=Cyan><+></font> text <font color=Magenta>"?>"</font>+<a name="line-110"></a><font color=Blue>sddecl</font> sd <font color=Red>|</font> sd <font color=Red>=</font> text <font color=Magenta>"standalone='yes'"</font>+<a name="line-111"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"standalone='no'"</font>+<a name="line-112"></a><font color=Blue>doctypedecl</font> <font color=Cyan>(</font>DTD n eid ds<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>if</u></font> Prelude<font color=Cyan>.</font>null ds <font color=Green><u>then</u></font>+<a name="line-113"></a> hd <font color=Cyan><></font> text <font color=Magenta>">"</font>+<a name="line-114"></a> <font color=Green><u>else</u></font> hd <font color=Cyan><+></font> text <font color=Magenta>" ["</font> <font color=Cyan>$$</font>+<a name="line-115"></a> vcat <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map markupdecl ds<font color=Cyan>)</font> <font color=Cyan>$$</font> text <font color=Magenta>"]>"</font>+<a name="line-116"></a> <font color=Green><u>where</u></font> hd <font color=Red>=</font> text <font color=Magenta>"<!DOCTYPE"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>+<a name="line-117"></a> maybe externalid eid+<a name="line-118"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>Element e<font color=Cyan>)</font> <font color=Red>=</font> elementdecl e+<a name="line-119"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>AttList a<font color=Cyan>)</font> <font color=Red>=</font> attlistdecl a+<a name="line-120"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>Entity e<font color=Cyan>)</font> <font color=Red>=</font> entitydecl e+<a name="line-121"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>Notation n<font color=Cyan>)</font> <font color=Red>=</font> notationdecl n+<a name="line-122"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>MarkupMisc m<font color=Cyan>)</font> <font color=Red>=</font> misc m+<a name="line-123"></a><font color=Blue>--markupdecl (MarkupPE p m) = peref p</font>+<a name="line-124"></a><font color=Blue>-- _ (ExtSubset t ds) = maybe textdecl t $$</font>+<a name="line-125"></a><font color=Blue>-- vcat (Prelude.map extsubsetdecl ds)</font>+<a name="line-126"></a><font color=Blue>-- _ (ExtMarkupDecl m) = markupdecl m</font>+<a name="line-127"></a><font color=Blue>-- extsubsetdecl (ExtConditionalSect c) = conditionalsect c</font>+<a name="line-128"></a><font color=Blue>--extsubsetdecl (ExtPEReference p e) = peref p</font>+<a name="line-129"></a>+<a name="line-130"></a><font color=Blue>element</font> <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font>+<a name="line-131"></a> fsep <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"/>"</font>+<a name="line-132"></a><font color=Blue>element</font> e<font color=Red>@</font><font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font>+<a name="line-133"></a><font color=Blue>-- | any isText cs = text "<" <> text n <+> fsep (map attribute as) <></font>+<a name="line-134"></a><font color=Blue>-- text ">" <> hcat (map content cs) <></font>+<a name="line-135"></a><font color=Blue>-- text "</" <> text n <> text ">"</font>+<a name="line-136"></a> <font color=Red>|</font> isText <font color=Cyan>(</font>head cs<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-137"></a> text <font color=Magenta>">"</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map content cs<font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-138"></a> text <font color=Magenta>"</"</font> <font color=Cyan><></font> text n <font color=Cyan><></font> text <font color=Magenta>">"</font>+<a name="line-139"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>d<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>=</font> carryelem e empty+<a name="line-140"></a> <font color=Green><u>in</u></font> d <font color=Cyan><></font> c+<a name="line-141"></a>+<a name="line-142"></a><a name="isText"></a><font color=Blue>isText</font> <font color=Red>::</font> Content t <font color=Red>-></font> Bool+<a name="line-143"></a><font color=Blue>isText</font> <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True+<a name="line-144"></a><font color=Blue>isText</font> <font color=Cyan>(</font>CRef <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True+<a name="line-145"></a><font color=Blue>isText</font> <font color=Green><u>_</u></font> <font color=Red>=</font> False+<a name="line-146"></a>+<a name="line-147"></a><a name="carryelem"></a><font color=Blue>carryelem</font> <font color=Red>::</font> Element t <font color=Red>-></font> ByteString <font color=Red>-></font> <font color=Cyan>(</font>ByteString<font color=Cyan>,</font> ByteString<font color=Cyan>)</font>+<a name="line-148"></a><font color=Blue>carryelem</font> <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font> c+<a name="line-149"></a> <font color=Red>=</font> <font color=Cyan>(</font> c <font color=Cyan><></font>+<a name="line-150"></a> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font>+<a name="line-151"></a> <font color=Cyan>,</font> text <font color=Magenta>"/>"</font><font color=Cyan>)</font>+<a name="line-152"></a><font color=Blue>carryelem</font> <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> c+<a name="line-153"></a><font color=Blue>-- | any isText cs = ( c <> element e, empty)</font>+<a name="line-154"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>cs0<font color=Cyan>,</font>d0<font color=Cyan>)</font> <font color=Red>=</font> carryscan carrycontent cs <font color=Cyan>(</font>text <font color=Magenta>">"</font><font color=Cyan>)</font>+<a name="line-155"></a> <font color=Green><u>in</u></font>+<a name="line-156"></a> <font color=Cyan>(</font> c <font color=Cyan><></font>+<a name="line-157"></a> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-158"></a> nest <font color=Magenta>2</font> <font color=Cyan>(</font>vcat cs0<font color=Cyan>)</font> <font color=Cyan><></font> <font color=Blue>--- $$</font>+<a name="line-159"></a> d0 <font color=Cyan><></font> text <font color=Magenta>"</"</font> <font color=Cyan><></font> text n+<a name="line-160"></a> <font color=Cyan>,</font> text <font color=Magenta>">"</font><font color=Cyan>)</font>+<a name="line-161"></a><a name="carrycontent"></a><font color=Blue>carrycontent</font> <font color=Red>::</font> Content t <font color=Red>-></font> ByteString <font color=Red>-></font> <font color=Cyan>(</font>ByteString<font color=Cyan>,</font> ByteString<font color=Cyan>)</font>+<a name="line-162"></a><font color=Blue>carrycontent</font> <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> carryelem e c+<a name="line-163"></a><font color=Blue>carrycontent</font> <font color=Cyan>(</font>CString False s <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> chardata s<font color=Cyan>,</font> empty<font color=Cyan>)</font>+<a name="line-164"></a><font color=Blue>carrycontent</font> <font color=Cyan>(</font>CString True s <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> cdsect s<font color=Cyan>,</font> empty<font color=Cyan>)</font>+<a name="line-165"></a><font color=Blue>carrycontent</font> <font color=Cyan>(</font>CRef r <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> reference r<font color=Cyan>,</font> empty<font color=Cyan>)</font>+<a name="line-166"></a><font color=Blue>carrycontent</font> <font color=Cyan>(</font>CMisc m <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> misc m<font color=Cyan>,</font> empty<font color=Cyan>)</font>+<a name="line-167"></a>+<a name="line-168"></a><a name="carryscan"></a><font color=Blue>carryscan</font> <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font>c<font color=Red>-></font><font color=Cyan>(</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-></font> c <font color=Red>-></font> <font color=Cyan>(</font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>,</font>c<font color=Cyan>)</font>+<a name="line-169"></a><font color=Blue>carryscan</font> <font color=Green><u>_</u></font> [] c <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>c<font color=Cyan>)</font>+<a name="line-170"></a><font color=Blue>carryscan</font> f <font color=Cyan>(</font>a<font color=Red><b>:</b></font><font color=Green><u>as</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>b<font color=Cyan>,</font> c0<font color=Cyan>)</font> <font color=Red>=</font> f a c+<a name="line-171"></a> <font color=Cyan>(</font>bs<font color=Cyan>,</font>c1<font color=Cyan>)</font> <font color=Red>=</font> carryscan f <font color=Green><u>as</u></font> c0+<a name="line-172"></a> <font color=Green><u>in</u></font> <font color=Cyan>(</font>b<font color=Red><b>:</b></font>bs<font color=Cyan>,</font> c1<font color=Cyan>)</font>+<a name="line-173"></a>+<a name="line-174"></a><font color=Blue>--carryelem e@(Elem n as cs) c</font>+<a name="line-175"></a><font color=Blue>-- | isText (head cs) =</font>+<a name="line-176"></a><font color=Blue>-- ( start <></font>+<a name="line-177"></a><font color=Blue>-- text ">" <> hcat (map content cs) <> text "</" <> text n</font>+<a name="line-178"></a><font color=Blue>-- , text ">")</font>+<a name="line-179"></a><font color=Blue>-- | otherwise =</font>+<a name="line-180"></a><font color=Blue>-- let (d,c0) = foldl carrycontent (start, text ">") cs in</font>+<a name="line-181"></a><font color=Blue>-- ( d <> c0 <> text "</" <> text n</font>+<a name="line-182"></a><font color=Blue>-- , text ">")</font>+<a name="line-183"></a><font color=Blue>-- where start = c <> text "<" <> text n <+> fsep (map attribute as)</font>+<a name="line-184"></a><font color=Blue>--</font>+<a name="line-185"></a><font color=Blue>--carrycontent (d,c) (CElem e) = let (d',c') = carryelem e c in</font>+<a name="line-186"></a><font color=Blue>-- (d $$ nest 2 d', c')</font>+<a name="line-187"></a><font color=Blue>--carrycontent (d,c) (CString _ s) = (d <> c <> chardata s, empty)</font>+<a name="line-188"></a><font color=Blue>--carrycontent (d,c) (CRef r) = (d <> c <> reference r,empty)</font>+<a name="line-189"></a><font color=Blue>--carrycontent (d,c) (CMisc m) = (d $$ c <> misc m, empty)</font>+<a name="line-190"></a>+<a name="line-191"></a>+<a name="line-192"></a><font color=Blue>attribute</font> <font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><></font> text <font color=Magenta>"="</font> <font color=Cyan><></font> attvalue v+<a name="line-193"></a><font color=Blue>content</font> <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> element e+<a name="line-194"></a><font color=Blue>content</font> <font color=Cyan>(</font>CString False s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> chardata s+<a name="line-195"></a><font color=Blue>content</font> <font color=Cyan>(</font>CString True s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> cdsect s+<a name="line-196"></a><font color=Blue>content</font> <font color=Cyan>(</font>CRef r <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> reference r+<a name="line-197"></a><font color=Blue>content</font> <font color=Cyan>(</font>CMisc m <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> misc m+<a name="line-198"></a>+<a name="line-199"></a><a name="elementdecl"></a><font color=Blue>elementdecl</font> <font color=Red>::</font> ElementDecl <font color=Red>-></font> ByteString+<a name="line-200"></a><font color=Blue>elementdecl</font> <font color=Cyan>(</font>ElementDecl n cs<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ELEMENT"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>+<a name="line-201"></a> contentspec cs <font color=Cyan><></font> text <font color=Magenta>">"</font>+<a name="line-202"></a><a name="contentspec"></a><font color=Blue>contentspec</font> <font color=Red>::</font> ContentSpec <font color=Red>-></font> ByteString+<a name="line-203"></a><font color=Blue>contentspec</font> EMPTY <font color=Red>=</font> text <font color=Magenta>"EMPTY"</font>+<a name="line-204"></a><font color=Blue>contentspec</font> ANY <font color=Red>=</font> text <font color=Magenta>"ANY"</font>+<a name="line-205"></a><font color=Blue>contentspec</font> <font color=Cyan>(</font>Mixed m<font color=Cyan>)</font> <font color=Red>=</font> mixed m+<a name="line-206"></a><font color=Blue>contentspec</font> <font color=Cyan>(</font>ContentSpec c<font color=Cyan>)</font> <font color=Red>=</font> cp c+<a name="line-207"></a><font color=Blue>--contentspec (ContentPE p cs) = peref p</font>+<a name="line-208"></a><font color=Blue>cp</font> <font color=Cyan>(</font>TagName n m<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><></font> modifier m+<a name="line-209"></a><font color=Blue>cp</font> <font color=Cyan>(</font>Choice cs m<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map cp cs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-210"></a> modifier m+<a name="line-211"></a><font color=Blue>cp</font> <font color=Cyan>(</font>Seq cs m<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>","</font><font color=Cyan>)</font> <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map cp cs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-212"></a> modifier m+<a name="line-213"></a><a name="modifier"></a><font color=Blue>--cp (CPPE p c) = peref p</font>+<a name="line-214"></a><font color=Blue>modifier</font> <font color=Red>::</font> Modifier <font color=Red>-></font> ByteString+<a name="line-215"></a><font color=Blue>modifier</font> None <font color=Red>=</font> empty+<a name="line-216"></a><font color=Blue>modifier</font> Query <font color=Red>=</font> text <font color=Magenta>"?"</font>+<a name="line-217"></a><font color=Blue>modifier</font> Star <font color=Red>=</font> text <font color=Magenta>"*"</font>+<a name="line-218"></a><font color=Blue>modifier</font> Plus <font color=Red>=</font> text <font color=Magenta>"+"</font>+<a name="line-219"></a><a name="mixed"></a><font color=Blue>mixed</font> <font color=Red>::</font> Mixed <font color=Red>-></font> ByteString+<a name="line-220"></a><font color=Blue>mixed</font> PCDATA <font color=Red>=</font> text <font color=Magenta>"(#PCDATA)"</font>+<a name="line-221"></a><font color=Blue>mixed</font> <font color=Cyan>(</font>PCDATAplus ns<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"(#PCDATA |"</font> <font color=Cyan><+></font>+<a name="line-222"></a> hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map text ns<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-223"></a> text <font color=Magenta>")*"</font>+<a name="line-224"></a>+<a name="line-225"></a><a name="attlistdecl"></a><font color=Blue>attlistdecl</font> <font color=Red>::</font> AttListDecl <font color=Red>-></font> ByteString+<a name="line-226"></a><font color=Blue>attlistdecl</font> <font color=Cyan>(</font>AttListDecl n ds<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ATTLIST"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>+<a name="line-227"></a> fsep <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map attdef ds<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>">"</font>+<a name="line-228"></a><a name="attdef"></a><font color=Blue>attdef</font> <font color=Red>::</font> AttDef <font color=Red>-></font> ByteString+<a name="line-229"></a><font color=Blue>attdef</font> <font color=Cyan>(</font>AttDef n t d<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><+></font> atttype t <font color=Cyan><+></font> defaultdecl d+<a name="line-230"></a><a name="atttype"></a><font color=Blue>atttype</font> <font color=Red>::</font> AttType <font color=Red>-></font> ByteString+<a name="line-231"></a><font color=Blue>atttype</font> StringType <font color=Red>=</font> text <font color=Magenta>"CDATA"</font>+<a name="line-232"></a><font color=Blue>atttype</font> <font color=Cyan>(</font>TokenizedType t<font color=Cyan>)</font> <font color=Red>=</font> tokenizedtype t+<a name="line-233"></a><font color=Blue>atttype</font> <font color=Cyan>(</font>EnumeratedType t<font color=Cyan>)</font> <font color=Red>=</font> enumeratedtype t+<a name="line-234"></a><a name="tokenizedtype"></a><font color=Blue>tokenizedtype</font> <font color=Red>::</font> TokenizedType <font color=Red>-></font> ByteString+<a name="line-235"></a><font color=Blue>tokenizedtype</font> ID <font color=Red>=</font> text <font color=Magenta>"ID"</font>+<a name="line-236"></a><font color=Blue>tokenizedtype</font> IDREF <font color=Red>=</font> text <font color=Magenta>"IDREF"</font>+<a name="line-237"></a><font color=Blue>tokenizedtype</font> IDREFS <font color=Red>=</font> text <font color=Magenta>"IDREFS"</font>+<a name="line-238"></a><font color=Blue>tokenizedtype</font> ENTITY <font color=Red>=</font> text <font color=Magenta>"ENTITY"</font>+<a name="line-239"></a><font color=Blue>tokenizedtype</font> ENTITIES <font color=Red>=</font> text <font color=Magenta>"ENTITIES"</font>+<a name="line-240"></a><font color=Blue>tokenizedtype</font> NMTOKEN <font color=Red>=</font> text <font color=Magenta>"NMTOKEN"</font>+<a name="line-241"></a><font color=Blue>tokenizedtype</font> NMTOKENS <font color=Red>=</font> text <font color=Magenta>"NMTOKENS"</font>+<a name="line-242"></a><a name="enumeratedtype"></a><font color=Blue>enumeratedtype</font> <font color=Red>::</font> EnumeratedType <font color=Red>-></font> ByteString+<a name="line-243"></a><font color=Blue>enumeratedtype</font> <font color=Cyan>(</font>NotationType n<font color=Cyan>)</font><font color=Red>=</font> notationtype n+<a name="line-244"></a><font color=Blue>enumeratedtype</font> <font color=Cyan>(</font>Enumeration e<font color=Cyan>)</font> <font color=Red>=</font> enumeration e+<a name="line-245"></a><a name="notationtype"></a><font color=Blue>notationtype</font> <font color=Red>::</font> <font color=Red>[</font><font color=Red>[</font>Char<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> ByteString+<a name="line-246"></a><font color=Blue>notationtype</font> ns <font color=Red>=</font> text <font color=Magenta>"NOTATION"</font> <font color=Cyan><+></font>+<a name="line-247"></a> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map text ns<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-248"></a><a name="enumeration"></a><font color=Blue>enumeration</font> <font color=Red>::</font> <font color=Red>[</font><font color=Red>[</font>Char<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> ByteString+<a name="line-249"></a><font color=Blue>enumeration</font> ns <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map nmtoken ns<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-250"></a><a name="defaultdecl"></a><font color=Blue>defaultdecl</font> <font color=Red>::</font> DefaultDecl <font color=Red>-></font> ByteString+<a name="line-251"></a><font color=Blue>defaultdecl</font> REQUIRED <font color=Red>=</font> text <font color=Magenta>"#REQUIRED"</font>+<a name="line-252"></a><font color=Blue>defaultdecl</font> IMPLIED <font color=Red>=</font> text <font color=Magenta>"#IMPLIED"</font>+<a name="line-253"></a><font color=Blue>defaultdecl</font> <font color=Cyan>(</font>DefaultTo a f<font color=Cyan>)</font> <font color=Red>=</font> maybe <font color=Cyan>(</font>const <font color=Cyan>(</font>text <font color=Magenta>"#FIXED"</font><font color=Cyan>)</font><font color=Cyan>)</font> f <font color=Cyan><+></font> attvalue a+<a name="line-254"></a><a name="reference"></a><font color=Blue>--_ (IncludeSect i)= text "<![INCLUDE [" <+></font>+<a name="line-255"></a><font color=Blue>-- vcat (Prelude.map extsubsetdecl i) <+> text "]]>"</font>+<a name="line-256"></a><font color=Blue>-- conditionalsect (IgnoreSect i) = text "<![IGNORE [" <+></font>+<a name="line-257"></a><font color=Blue>-- fsep (Prelude.map ignoresectcontents i) <+> text "]]>"</font>+<a name="line-258"></a><font color=Blue>-- -- _ (Ignore) = empty</font>+<a name="line-259"></a><font color=Blue>-- ignoresectcontents :: IgnoreSectContents -> ByteString</font>+<a name="line-260"></a><font color=Blue>-- _ (IgnoreSectContents i is)</font>+<a name="line-261"></a><font color=Blue>-- = ignore i <+> vcat (Prelude.map internal is)</font>+<a name="line-262"></a><font color=Blue>-- where internal (ics,i) = text "<![[" <+></font>+<a name="line-263"></a><font color=Blue>-- ignoresectcontents ics <+></font>+<a name="line-264"></a><font color=Blue>-- text "]]>" <+> ignore i</font>+<a name="line-265"></a><font color=Blue>reference</font> <font color=Red>::</font> Reference <font color=Red>-></font> ByteString+<a name="line-266"></a><font color=Blue>reference</font> <font color=Cyan>(</font>RefEntity er<font color=Cyan>)</font> <font color=Red>=</font> entityref er+<a name="line-267"></a><font color=Blue>reference</font> <font color=Cyan>(</font>RefChar cr<font color=Cyan>)</font> <font color=Red>=</font> charref cr+<a name="line-268"></a><a name="entityref"></a><font color=Blue>entityref</font> <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> ByteString+<a name="line-269"></a><font color=Blue>entityref</font> n <font color=Red>=</font> text <font color=Magenta>"&"</font> <font color=Cyan><></font> text n <font color=Cyan><></font> text <font color=Magenta>";"</font>+<a name="line-270"></a><a name="charref"></a><font color=Blue>charref</font> <font color=Red>::</font> <font color=Cyan>(</font>Show a<font color=Cyan>)</font> <font color=Red>=></font> a <font color=Red>-></font> ByteString+<a name="line-271"></a><font color=Blue>charref</font> c <font color=Red>=</font> text <font color=Magenta>"&#"</font> <font color=Cyan><></font> text <font color=Cyan>(</font>show c<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>";"</font>+<a name="line-272"></a><a name="entitydecl"></a><font color=Blue>entitydecl</font> <font color=Red>::</font> EntityDecl <font color=Red>-></font> ByteString+<a name="line-273"></a><font color=Blue>entitydecl</font> <font color=Cyan>(</font>EntityGEDecl d<font color=Cyan>)</font> <font color=Red>=</font> gedecl d+<a name="line-274"></a><font color=Blue>entitydecl</font> <font color=Cyan>(</font>EntityPEDecl d<font color=Cyan>)</font> <font color=Red>=</font> pedecl d+<a name="line-275"></a><a name="gedecl"></a><font color=Blue>gedecl</font> <font color=Red>::</font> GEDecl <font color=Red>-></font> ByteString+<a name="line-276"></a><font color=Blue>gedecl</font> <font color=Cyan>(</font>GEDecl n ed<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ENTITY"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font> entitydef ed <font color=Cyan><></font>+<a name="line-277"></a> text <font color=Magenta>">"</font>+<a name="line-278"></a><a name="pedecl"></a><font color=Blue>pedecl</font> <font color=Red>::</font> PEDecl <font color=Red>-></font> ByteString+<a name="line-279"></a><font color=Blue>pedecl</font> <font color=Cyan>(</font>PEDecl n pd<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ENTITY %"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> pedef pd <font color=Cyan><></font>+<a name="line-280"></a> text <font color=Magenta>">"</font>+<a name="line-281"></a><a name="entitydef"></a><font color=Blue>entitydef</font> <font color=Red>::</font> EntityDef <font color=Red>-></font> ByteString+<a name="line-282"></a><font color=Blue>entitydef</font> <font color=Cyan>(</font>DefEntityValue ew<font color=Cyan>)</font> <font color=Red>=</font> entityvalue ew+<a name="line-283"></a><font color=Blue>entitydef</font> <font color=Cyan>(</font>DefExternalID i nd<font color=Cyan>)</font> <font color=Red>=</font> externalid i <font color=Cyan><+></font> maybe ndatadecl nd+<a name="line-284"></a><a name="pedef"></a><font color=Blue>pedef</font> <font color=Red>::</font> PEDef <font color=Red>-></font> ByteString+<a name="line-285"></a><font color=Blue>pedef</font> <font color=Cyan>(</font>PEDefEntityValue ew<font color=Cyan>)</font> <font color=Red>=</font> entityvalue ew+<a name="line-286"></a><font color=Blue>pedef</font> <font color=Cyan>(</font>PEDefExternalID eid<font color=Cyan>)</font> <font color=Red>=</font> externalid eid+<a name="line-287"></a><a name="externalid"></a><font color=Blue>externalid</font> <font color=Red>::</font> ExternalID <font color=Red>-></font> ByteString+<a name="line-288"></a><font color=Blue>externalid</font> <font color=Cyan>(</font>SYSTEM sl<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"SYSTEM"</font> <font color=Cyan><+></font> systemliteral sl+<a name="line-289"></a><font color=Blue>externalid</font> <font color=Cyan>(</font>PUBLIC i sl<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"PUBLIC"</font> <font color=Cyan><+></font> pubidliteral i <font color=Cyan><+></font>+<a name="line-290"></a> systemliteral sl+<a name="line-291"></a><a name="ndatadecl"></a><font color=Blue>ndatadecl</font> <font color=Red>::</font> NDataDecl <font color=Red>-></font> ByteString+<a name="line-292"></a><font color=Blue>ndatadecl</font> <font color=Cyan>(</font>NDATA n<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"NDATA"</font> <font color=Cyan><+></font> text n+<a name="line-293"></a><a name="notationdecl"></a><font color=Blue>-- _ (TextDecl vi ed) = text "<?xml" <+> maybe text vi <+></font>+<a name="line-294"></a><font color=Blue>-- encodingdecl ed <> text "?>"</font>+<a name="line-295"></a><font color=Blue>-- extparsedent :: ExtParsedEnt t -> ByteString</font>+<a name="line-296"></a><font color=Blue>-- _ (ExtParsedEnt t c)= maybe textdecl t <+> content c</font>+<a name="line-297"></a><font color=Blue>-- _ (ExtPE t esd) = maybe textdecl t <+></font>+<a name="line-298"></a><font color=Blue>-- vcat (Prelude.map extsubsetdecl esd)</font>+<a name="line-299"></a><font color=Blue>notationdecl</font> <font color=Red>::</font> NotationDecl <font color=Red>-></font> ByteString+<a name="line-300"></a><font color=Blue>notationdecl</font> <font color=Cyan>(</font>NOTATION n e<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!NOTATION"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>+<a name="line-301"></a> either externalid publicid e <font color=Cyan><></font>+<a name="line-302"></a> text <font color=Magenta>">"</font>+<a name="line-303"></a><a name="publicid"></a><font color=Blue>publicid</font> <font color=Red>::</font> PublicID <font color=Red>-></font> ByteString+<a name="line-304"></a><font color=Blue>publicid</font> <font color=Cyan>(</font>PUBLICID p<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"PUBLICID"</font> <font color=Cyan><+></font> pubidliteral p+<a name="line-305"></a><a name="encodingdecl"></a><font color=Blue>encodingdecl</font> <font color=Red>::</font> EncodingDecl <font color=Red>-></font> ByteString+<a name="line-306"></a><font color=Blue>encodingdecl</font> <font color=Cyan>(</font>EncodingDecl s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"encoding='"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>+<a name="line-307"></a><a name="nmtoken"></a><font color=Blue>nmtoken</font> <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> ByteString+<a name="line-308"></a><font color=Blue>nmtoken</font> s <font color=Red>=</font> text s+<a name="line-309"></a><a name="attvalue"></a><font color=Blue>attvalue</font> <font color=Red>::</font> AttValue <font color=Red>-></font> ByteString+<a name="line-310"></a><font color=Blue>attvalue</font> <font color=Cyan>(</font>AttValue esr<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font>+<a name="line-311"></a> hcat <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map <font color=Cyan>(</font>either text reference<font color=Cyan>)</font> esr<font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-312"></a> text <font color=Magenta>"\""</font>+<a name="line-313"></a><a name="entityvalue"></a><font color=Blue>entityvalue</font> <font color=Red>::</font> EntityValue <font color=Red>-></font> ByteString+<a name="line-314"></a><font color=Blue>entityvalue</font> <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font>+<a name="line-315"></a> <font color=Red>|</font> containsDoubleQuote evs <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map ev evs<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"'"</font>+<a name="line-316"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>map ev evs<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"\""</font>+<a name="line-317"></a><a name="ev"></a><font color=Blue>ev</font> <font color=Red>::</font> EV <font color=Red>-></font> ByteString+<a name="line-318"></a><font color=Blue>ev</font> <font color=Cyan>(</font>EVString s<font color=Cyan>)</font> <font color=Red>=</font> text s+<a name="line-319"></a><font color=Blue>--ev (EVPERef p e) = peref p</font>+<a name="line-320"></a><font color=Blue>ev</font> <font color=Cyan>(</font>EVRef r<font color=Cyan>)</font> <font color=Red>=</font> reference r+<a name="line-321"></a><a name="pubidliteral"></a><font color=Blue>pubidliteral</font> <font color=Red>::</font> PubidLiteral <font color=Red>-></font> ByteString+<a name="line-322"></a><font color=Blue>pubidliteral</font> <font color=Cyan>(</font>PubidLiteral s<font color=Cyan>)</font>+<a name="line-323"></a> <font color=Red>|</font> toWord8 <font color=Magenta>'"'</font> <font color=Cyan>`elem`</font> <font color=Cyan>(</font>pack s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>+<a name="line-324"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"\""</font>+<a name="line-325"></a><a name="systemliteral"></a><font color=Blue>systemliteral</font> <font color=Red>::</font> SystemLiteral <font color=Red>-></font> ByteString+<a name="line-326"></a><font color=Blue>systemliteral</font> <font color=Cyan>(</font>SystemLiteral s<font color=Cyan>)</font>+<a name="line-327"></a> <font color=Red>|</font> toWord8 <font color=Magenta>'"'</font> <font color=Cyan>`elem`</font> <font color=Cyan>(</font>pack s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>+<a name="line-328"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"\""</font>+<a name="line-329"></a><a name="chardata"></a><font color=Blue>chardata</font><font color=Cyan>,</font> cdsect <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> ByteString+<a name="line-330"></a><font color=Blue>chardata</font> s <font color=Red>=</font> <font color=Blue>{-if all isSpace s then empty else-}</font> text s+<a name="line-331"></a><a name="cdsect"></a><font color=Blue>cdsect</font> c <font color=Red>=</font> text <font color=Magenta>"<![CDATA["</font> <font color=Cyan><></font> chardata c <font color=Cyan><></font> text <font color=Magenta>"]]>"</font>+<a name="line-332"></a>+<a name="line-333"></a><a name="toWord8"></a><font color=Blue>-- toWord8 :: Char -> Word8</font>+<a name="line-334"></a><font color=Blue>toWord8</font> <font color=Red>::</font> <font color=Cyan>(</font>Enum a<font color=Cyan>,</font> Enum a1<font color=Cyan>)</font> <font color=Red>=></font> a1 <font color=Red>-></font> a+<a name="line-335"></a><font color=Blue>toWord8</font> <font color=Red>=</font> toEnum <font color=Cyan>.</font> fromEnum+<a name="line-336"></a>+<a name="line-337"></a><a name="containsDoubleQuote"></a><font color=Blue>containsDoubleQuote</font> <font color=Red>::</font> <font color=Red>[</font>EV<font color=Red>]</font> <font color=Red>-></font> Bool+<a name="line-338"></a><font color=Blue>containsDoubleQuote</font> evs <font color=Red>=</font> any csq evs+<a name="line-339"></a> <font color=Green><u>where</u></font> csq <font color=Cyan>(</font>EVString s<font color=Cyan>)</font> <font color=Red>=</font> toWord8 <font color=Magenta>'"'</font> <font color=Cyan>`elem`</font> <font color=Cyan>(</font>pack s<font color=Cyan>)</font>+<a name="line-340"></a> csq <font color=Green><u>_</u></font> <font color=Red>=</font> False </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/Combinators.html view
@@ -1,428 +1,434 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>--------------------------------------------</font>-<a name="(line2)"></a><font color=Blue>-- | This module defines the notion of filters and filter combinators</font>-<a name="(line3)"></a><font color=Blue>-- for processing XML documents.</font>-<a name="(line4)"></a><font color=Blue>--</font>-<a name="(line5)"></a><font color=Blue>-- These XML transformation combinators are described in the paper</font>-<a name="(line6)"></a><font color=Blue>-- ``Haskell and XML: Generic Combinators or Type-Based Translation?''</font>-<a name="(line7)"></a><font color=Blue>-- Malcolm Wallace and Colin Runciman, Proceedings ICFP'99.</font>-<a name="(line8)"></a><font color=Blue>--------------------------------------------</font>-<a name="(line9)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Combinators-<a name="(line10)"></a> <font color=Cyan>(</font><font color=Blue>-- * The content filter type.</font>-<a name="(line11)"></a> CFilter-<a name="(line12)"></a>-<a name="(line13)"></a> <font color=Blue>-- * Simple filters.</font>-<a name="(line14)"></a> <font color=Blue>-- ** Selection filters.</font>-<a name="(line15)"></a> <font color=Blue>-- $selection</font>-<a name="(line16)"></a> <font color=Cyan>,</font> keep<font color=Cyan>,</font> none<font color=Cyan>,</font> children<font color=Cyan>,</font> position-<a name="(line17)"></a>-<a name="(line18)"></a> <font color=Blue>-- ** Predicate filters.</font>-<a name="(line19)"></a> <font color=Blue>-- $pred</font>-<a name="(line20)"></a> <font color=Cyan>,</font> elm<font color=Cyan>,</font> txt<font color=Cyan>,</font> tag<font color=Cyan>,</font> attr<font color=Cyan>,</font> attrval<font color=Cyan>,</font> tagWith-<a name="(line21)"></a>-<a name="(line22)"></a> <font color=Blue>-- ** Search filters.</font>-<a name="(line23)"></a> <font color=Cyan>,</font> find<font color=Cyan>,</font> iffind<font color=Cyan>,</font> ifTxt-<a name="(line24)"></a>-<a name="(line25)"></a> <font color=Blue>-- * Filter combinators</font>-<a name="(line26)"></a> <font color=Blue>-- ** Basic combinators.</font>-<a name="(line27)"></a> <font color=Cyan>,</font> o<font color=Cyan>,</font> union<font color=Cyan>,</font> cat<font color=Cyan>,</font> andThen-<a name="(line28)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Cyan>|>|</font><font color=Cyan>)</font><font color=Cyan>,</font> with<font color=Cyan>,</font> without-<a name="(line29)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Cyan>/></font><font color=Cyan>)</font><font color=Cyan>,</font> <font color=Cyan>(</font><font color=Cyan></</font><font color=Cyan>)</font><font color=Cyan>,</font> et-<a name="(line30)"></a> <font color=Cyan>,</font> path-<a name="(line31)"></a> <font color=Blue>-- ** Recursive search.</font>-<a name="(line32)"></a> <font color=Blue>-- $recursive</font>-<a name="(line33)"></a> <font color=Cyan>,</font> deep<font color=Cyan>,</font> deepest<font color=Cyan>,</font> multi-<a name="(line34)"></a> <font color=Blue>-- ** Interior editing.</font>-<a name="(line35)"></a> <font color=Cyan>,</font> when<font color=Cyan>,</font> guards<font color=Cyan>,</font> chip<font color=Cyan>,</font> inplace<font color=Cyan>,</font> foldXml-<a name="(line36)"></a> <font color=Blue>-- ** Constructive filters.</font>-<a name="(line37)"></a> <font color=Cyan>,</font> mkElem<font color=Cyan>,</font> mkElemAttr<font color=Cyan>,</font> literal<font color=Cyan>,</font> cdata<font color=Cyan>,</font> replaceTag<font color=Cyan>,</font> replaceAttrs-<a name="(line38)"></a>-<a name="(line39)"></a> <font color=Blue>-- * C-like conditionals.</font>-<a name="(line40)"></a> <font color=Blue>-- $cond</font>-<a name="(line41)"></a> <font color=Cyan>,</font> ThenElse<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font> <font color=Cyan>(</font><font color=Cyan>?></font><font color=Cyan>)</font>-<a name="(line42)"></a>-<a name="(line43)"></a> <font color=Blue>-- * Filters with labelled results.</font>-<a name="(line44)"></a> <font color=Cyan>,</font> LabelFilter-<a name="(line45)"></a> <font color=Blue>-- ** Using and combining labelled filters.</font>-<a name="(line46)"></a> <font color=Cyan>,</font> oo<font color=Cyan>,</font> x-<a name="(line47)"></a> <font color=Blue>-- ** Some label-generating filters.</font>-<a name="(line48)"></a> <font color=Cyan>,</font> numbered<font color=Cyan>,</font> interspersed<font color=Cyan>,</font> tagged<font color=Cyan>,</font> attributed<font color=Cyan>,</font> textlabelled<font color=Cyan>,</font> extracted-<a name="(line49)"></a>-<a name="(line50)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line51)"></a>-<a name="(line52)"></a>-<a name="(line53)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line54)"></a><font color=Green><u>import</u></font> Maybe <font color=Cyan>(</font>fromMaybe<font color=Cyan>)</font>-<a name="(line55)"></a>-<a name="(line56)"></a><font color=Green><u>infixl</u></font> <font color=Magenta>6</font> <font color=Cyan>`with`</font><font color=Cyan>,</font> <font color=Cyan>`without`</font>-<a name="(line57)"></a><font color=Green><u>infixr</u></font> <font color=Magenta>5</font> <font color=Cyan>`o`</font><font color=Cyan>,</font> <font color=Cyan>`oo`</font><font color=Cyan>,</font> <font color=Cyan>`union`</font><font color=Cyan>,</font> <font color=Cyan>`andThen`</font> <font color=Blue>-- , `orelse`</font>-<a name="(line58)"></a><font color=Green><u>infixl</u></font> <font color=Magenta>5</font> <font color=Cyan>/></font><font color=Cyan>,</font> <font color=Cyan></</font><font color=Cyan>,</font> <font color=Cyan>|>|</font>-<a name="(line59)"></a><font color=Green><u>infixr</u></font> <font color=Magenta>4</font> <font color=Cyan>`when`</font><font color=Cyan>,</font> <font color=Cyan>`guards`</font>-<a name="(line60)"></a><font color=Green><u>infixr</u></font> <font color=Magenta>3</font> <font color=Cyan>?></font><font color=Cyan>,</font> <font color=Red><b>:></b></font>-<a name="(line61)"></a>-<a name="(line62)"></a>-<a name="(line63)"></a>-<a name="(line64)"></a><font color=Blue>-- THE CONTENT FILTER TYPE</font>-<a name="(line65)"></a>-<a name="(line66)"></a><a name="CFilter"></a><font color=Blue>-- | All document transformations are /content filters/.</font>-<a name="(line67)"></a><a name="CFilter"></a><font color=Blue>-- A filter takes a single XML 'Content' value and returns a sequence</font>-<a name="(line68)"></a><a name="CFilter"></a><font color=Blue>-- of 'Content' values, possibly empty.</font>-<a name="(line69)"></a><a name="CFilter"></a><font color=Green><u>type</u></font> CFilter i <font color=Red>=</font> Content i <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font>-<a name="(line70)"></a>-<a name="(line71)"></a>-<a name="(line72)"></a>-<a name="(line73)"></a><a name="keep"></a><font color=Blue>-- BASIC SELECTION FILTERS</font>-<a name="(line74)"></a><font color=Blue>-- $selection</font>-<a name="(line75)"></a><font color=Blue>-- In the algebra of combinators, @none@ is the zero, and @keep@ the identity.</font>-<a name="(line76)"></a><font color=Blue>-- (They have a more general type than just CFilter.)</font>-<a name="(line77)"></a>keep <font color=Red>::</font> a<font color=Red>-></font><font color=Red>[</font>a<font color=Red>]</font>-<a name="(line78)"></a>keep <font color=Red>=</font> <font color=Red>\</font>x<font color=Red>-></font><font color=Red>[</font>x<font color=Red>]</font>-<a name="(line79)"></a><a name="none"></a>none <font color=Red>::</font> a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font>-<a name="(line80)"></a>none <font color=Red>=</font> <font color=Red>\</font>x<font color=Red>-></font>[]-<a name="(line81)"></a>-<a name="(line82)"></a><a name="children"></a><font color=Blue>-- | Throw away current node, keep just the (unprocessed) children.</font>-<a name="(line83)"></a>children <font color=Red>::</font> CFilter i-<a name="(line84)"></a>children <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> cs<font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> cs-<a name="(line85)"></a>children <font color=Green><u>_</u></font> <font color=Red>=</font> []-<a name="(line86)"></a>-<a name="(line87)"></a><a name="position"></a><font color=Blue>-- | Select the @n@'th positional result of a filter.</font>-<a name="(line88)"></a>position <font color=Red>::</font> Int <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i-<a name="(line89)"></a>position n f <font color=Red>=</font> <font color=Cyan>(</font><font color=Red>\</font>cs<font color=Red>-></font> <font color=Red>[</font>cs<font color=Cyan>!!</font>n<font color=Red>]</font><font color=Cyan>)</font> <font color=Cyan>.</font> f-<a name="(line90)"></a>-<a name="(line91)"></a>-<a name="(line92)"></a>-<a name="(line93)"></a><font color=Blue>-- BASIC PREDICATE FILTERS</font>-<a name="(line94)"></a><font color=Blue>-- $pred</font>-<a name="(line95)"></a><font color=Blue>-- These filters either keep or throw away some content based on</font>-<a name="(line96)"></a><font color=Blue>-- a simple test. For instance, @elm@ keeps only a tagged element,</font>-<a name="(line97)"></a><font color=Blue>-- @txt@ keeps only non-element text, @tag@ keeps only an element</font>-<a name="(line98)"></a><font color=Blue>-- with the named tag, @attr@ keeps only an element with the named</font>-<a name="(line99)"></a><font color=Blue>-- attribute, @attrval@ keeps only an element with the given</font>-<a name="(line100)"></a><font color=Blue>-- attribute value, @tagWith@ keeps only an element whose tag name</font>-<a name="(line101)"></a><font color=Blue>-- satisfies the given predicate.</font>-<a name="(line102)"></a>-<a name="(line103)"></a><a name="elm"></a>elm<font color=Cyan>,</font> txt <font color=Red>::</font> CFilter i-<a name="(line104)"></a><a name="tag"></a>tag <font color=Red>::</font> String <font color=Red>-></font> CFilter i-<a name="(line105)"></a><a name="attr"></a>attr <font color=Red>::</font> Name <font color=Red>-></font> CFilter i-<a name="(line106)"></a><a name="attrval"></a>attrval <font color=Red>::</font> Attribute <font color=Red>-></font> CFilter i-<a name="(line107)"></a><a name="tagWith"></a>tagWith <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>Bool<font color=Cyan>)</font> <font color=Red>-></font> CFilter i-<a name="(line108)"></a>-<a name="(line109)"></a>elm x<font color=Red>@</font><font color=Cyan>(</font>CElem <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>x<font color=Red>]</font>-<a name="(line110)"></a>elm <font color=Green><u>_</u></font> <font color=Red>=</font> []-<a name="(line111)"></a>-<a name="(line112)"></a><a name="txt"></a>txt x<font color=Red>@</font><font color=Cyan>(</font>CString <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>x<font color=Red>]</font>-<a name="(line113)"></a>txt x<font color=Red>@</font><font color=Cyan>(</font>CRef <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>x<font color=Red>]</font>-<a name="(line114)"></a>txt <font color=Green><u>_</u></font> <font color=Red>=</font> []-<a name="(line115)"></a>-<a name="(line116)"></a>tag t x<font color=Red>@</font><font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem n <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>|</font> t<font color=Cyan>==</font>n <font color=Red>=</font> <font color=Red>[</font>x<font color=Red>]</font>-<a name="(line117)"></a>tag t <font color=Green><u>_</u></font> <font color=Red>=</font> []-<a name="(line118)"></a>-<a name="(line119)"></a>tagWith p x<font color=Red>@</font><font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem n <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>|</font> p n <font color=Red>=</font> <font color=Red>[</font>x<font color=Red>]</font>-<a name="(line120)"></a>tagWith p <font color=Green><u>_</u></font> <font color=Red>=</font> []-<a name="(line121)"></a>-<a name="(line122)"></a>attr n x<font color=Red>@</font><font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>as</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>|</font> n <font color=Cyan>`elem`</font> <font color=Cyan>(</font>map fst <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>x<font color=Red>]</font>-<a name="(line123)"></a>attr n <font color=Green><u>_</u></font> <font color=Red>=</font> []-<a name="(line124)"></a>-<a name="(line125)"></a>attrval av x<font color=Red>@</font><font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>as</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>|</font> av <font color=Cyan>`elem`</font> <font color=Green><u>as</u></font> <font color=Red>=</font> <font color=Red>[</font>x<font color=Red>]</font>-<a name="(line126)"></a>attrval av <font color=Green><u>_</u></font> <font color=Red>=</font> []-<a name="(line127)"></a>-<a name="(line128)"></a>-<a name="(line129)"></a>-<a name="(line130)"></a><font color=Blue>-- SEARCH FILTERS</font>-<a name="(line131)"></a>-<a name="(line132)"></a><a name="find"></a><font color=Blue>-- | For a mandatory attribute field, @find key cont@ looks up the value of</font>-<a name="(line133)"></a><font color=Blue>-- the attribute name @key@, and applies the continuation @cont@ to</font>-<a name="(line134)"></a><font color=Blue>-- the value.</font>-<a name="(line135)"></a>find <font color=Red>::</font> String <font color=Red>-></font> <font color=Cyan>(</font>String<font color=Red>-></font>CFilter i<font color=Cyan>)</font> <font color=Red>-></font> CFilter i-<a name="(line136)"></a>find key cont c<font color=Red>@</font><font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>as</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> cont <font color=Cyan>(</font>show <font color=Cyan>(</font>lookfor key <font color=Green><u>as</u></font><font color=Cyan>)</font><font color=Cyan>)</font> c-<a name="(line137)"></a> <font color=Green><u>where</u></font> lookfor x <font color=Red>=</font> fromMaybe <font color=Cyan>(</font>error <font color=Cyan>(</font><font color=Magenta>"missing attribute: "</font><font color=Cyan>++</font>show x<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>.</font> lookup x-<a name="(line138)"></a><font color=Blue>-- 'lookfor' has the more general type :: (Eq a,Show a) => a -> [(a,b)] -> b</font>-<a name="(line139)"></a>-<a name="(line140)"></a><a name="iffind"></a><font color=Blue>-- | When an attribute field may be absent, use @iffind key yes no@ to lookup</font>-<a name="(line141)"></a><font color=Blue>-- its value. If the attribute is absent, it acts as the @no@ filter,</font>-<a name="(line142)"></a><font color=Blue>-- otherwise it applies the @yes@ filter.</font>-<a name="(line143)"></a>iffind <font color=Red>::</font> String <font color=Red>-></font> <font color=Cyan>(</font>String<font color=Red>-></font>CFilter i<font color=Cyan>)</font> <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i-<a name="(line144)"></a>iffind key yes no c<font color=Red>@</font><font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>as</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line145)"></a> <font color=Green><u>case</u></font> <font color=Cyan>(</font>lookup key <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Green><u>of</u></font>-<a name="(line146)"></a> Nothing <font color=Red>-></font> no c-<a name="(line147)"></a> <font color=Cyan>(</font>Just v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> yes <font color=Cyan>(</font>show v<font color=Cyan>)</font> c-<a name="(line148)"></a>iffind key yes no other <font color=Red>=</font> no other-<a name="(line149)"></a>-<a name="(line150)"></a><a name="ifTxt"></a><font color=Blue>-- | @ifTxt yes no@ processes any textual content with the @yes@ filter,</font>-<a name="(line151)"></a><font color=Blue>-- but otherwise is the same as the @no@ filter.</font>-<a name="(line152)"></a>ifTxt <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>CFilter i<font color=Cyan>)</font> <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i-<a name="(line153)"></a>ifTxt yes no c<font color=Red>@</font><font color=Cyan>(</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> yes s c-<a name="(line154)"></a>ifTxt yes no c <font color=Red>=</font> no c-<a name="(line155)"></a>-<a name="(line156)"></a>-<a name="(line157)"></a>-<a name="(line158)"></a><font color=Blue>-- C-LIKE CONDITIONALS</font>-<a name="(line159)"></a><font color=Blue>--</font>-<a name="(line160)"></a><font color=Blue>-- $cond</font>-<a name="(line161)"></a><font color=Blue>-- These definitions provide C-like conditionals, lifted to the filter level.</font>-<a name="(line162)"></a><font color=Blue>--</font>-<a name="(line163)"></a><font color=Blue>-- The @(cond ? yes : no)@ style in C becomes @(cond ?> yes :> no)@ in Haskell.</font>-<a name="(line164)"></a>-<a name="(line165)"></a><a name="ThenElse"></a><font color=Blue>-- | Conjoin the two branches of a conditional.</font>-<a name="(line166)"></a><a name="ThenElse"></a><font color=Green><u>data</u></font> ThenElse a <font color=Red>=</font> a <font color=Red><b>:></b></font> a-<a name="(line167)"></a>-<a name="(line168)"></a><a name="?>"></a><font color=Blue>-- | Select between the two branches of a joined conditional.</font>-<a name="(line169)"></a><font color=Cyan>(</font><font color=Cyan>?></font><font color=Cyan>)</font> <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> ThenElse <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font>-<a name="(line170)"></a><a name="p"></a>p <font color=Cyan>?></font> <font color=Cyan>(</font>f <font color=Red><b>:></b></font> g<font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>\</font>c<font color=Red>-></font> <font color=Green><u>if</u></font> <font color=Cyan>(</font>not<font color=Cyan>.</font>null<font color=Cyan>.</font>p<font color=Cyan>)</font> c <font color=Green><u>then</u></font> f c <font color=Green><u>else</u></font> g c-<a name="(line171)"></a>-<a name="(line172)"></a>-<a name="(line173)"></a>-<a name="(line174)"></a><font color=Blue>-- FILTER COMBINATORS</font>-<a name="(line175)"></a>-<a name="(line176)"></a>-<a name="(line177)"></a><a name="o"></a><font color=Blue>-- | Sequential (/Irish/,/backwards/) composition</font>-<a name="(line178)"></a>o <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i-<a name="(line179)"></a><a name="o"></a>f <font color=Cyan>`o`</font> g <font color=Red>=</font> concatMap f <font color=Cyan>.</font> g-<a name="(line180)"></a>-<a name="(line181)"></a><a name="union"></a><font color=Blue>-- | Binary parallel composition. Each filter uses a copy of the input,</font>-<a name="(line182)"></a><font color=Blue>-- rather than one filter using the result of the other.</font>-<a name="(line183)"></a><font color=Blue>-- (Has a more general type than just CFilter.)</font>-<a name="(line184)"></a>union <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font>-<a name="(line185)"></a>union <font color=Red>=</font> lift <font color=Cyan>(</font><font color=Cyan>++</font><font color=Cyan>)</font> <font color=Blue>-- in Haskell 98: union = lift List.union</font>-<a name="(line186)"></a> <font color=Green><u>where</u></font>-<a name="(line187)"></a> lift <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font>b<font color=Red>-></font>d<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>c<font color=Red>-></font>a<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>c<font color=Red>-></font>b<font color=Cyan>)</font> <font color=Red>-></font> c <font color=Red>-></font> d-<a name="(line188)"></a> lift f g h <font color=Red>=</font> <font color=Red>\</font>x<font color=Red>-></font> f <font color=Cyan>(</font>g x<font color=Cyan>)</font> <font color=Cyan>(</font>h x<font color=Cyan>)</font>-<a name="(line189)"></a>-<a name="(line190)"></a><a name="cat"></a><font color=Blue>-- | Glue a list of filters together. (A list version of union;</font>-<a name="(line191)"></a><font color=Blue>-- also has a more general type than just CFilter.)</font>-<a name="(line192)"></a>cat <font color=Red>::</font> <font color=Red>[</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font>-<a name="(line193)"></a><font color=Blue>-- Specification: cat fs = \e-> concat [ f e | f <- fs ]</font>-<a name="(line194)"></a><font color=Blue>-- more efficient implementation below:</font>-<a name="(line195)"></a>cat [] <font color=Red>=</font> const []-<a name="(line196)"></a>cat fs <font color=Red>=</font> foldr1 union fs-<a name="(line197)"></a>-<a name="(line198)"></a><a name="andThen"></a><font color=Blue>-- | A special form of filter composition where the second filter</font>-<a name="(line199)"></a><font color=Blue>-- works over the same data as the first, but also uses the</font>-<a name="(line200)"></a><font color=Blue>-- first's result.</font>-<a name="(line201)"></a>andThen <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font>c<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>c<font color=Red>-></font>a<font color=Red>-></font>b<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font>b<font color=Cyan>)</font>-<a name="(line202)"></a>andThen f g <font color=Red>=</font> <font color=Red>\</font>x<font color=Red>-></font> g <font color=Cyan>(</font>f x<font color=Cyan>)</font> x <font color=Blue>-- lift g f id</font>-<a name="(line203)"></a>-<a name="(line204)"></a><a name="childrenBy"></a><font color=Blue>-- | Process children using specified filters. /not exported/</font>-<a name="(line205)"></a>childrenBy <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i -<a name="(line206)"></a>childrenBy f <font color=Red>=</font> f <font color=Cyan>`o`</font> children-<a name="(line207)"></a>-<a name="(line208)"></a><a name="|>|"></a><font color=Blue>-- | Directional choice:</font>-<a name="(line209)"></a><font color=Blue>-- in @f |>| g@ give g-productions only if no f-productions</font>-<a name="(line210)"></a><font color=Cyan>(</font><font color=Cyan>|>|</font><font color=Cyan>)</font> <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font>-<a name="(line211)"></a><a name="f"></a>f <font color=Cyan>|>|</font> g <font color=Red>=</font> <font color=Red>\</font>x<font color=Red>-></font> <font color=Green><u>let</u></font> fx <font color=Red>=</font> f x <font color=Green><u>in</u></font> <font color=Green><u>if</u></font> null fx <font color=Green><u>then</u></font> g x <font color=Green><u>else</u></font> fx-<a name="(line212)"></a><font color=Blue>-- f |>| g = f ?> f :> g</font>-<a name="(line213)"></a>-<a name="(line214)"></a><a name="with"></a><font color=Blue>-- | Pruning: in @f `with` g@,</font>-<a name="(line215)"></a><font color=Blue>-- keep only those f-productions which have at least one g-production</font>-<a name="(line216)"></a>with <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i-<a name="(line217)"></a><a name="with"></a>f <font color=Cyan>`with`</font> g <font color=Red>=</font> filter <font color=Cyan>(</font>not<font color=Cyan>.</font>null<font color=Cyan>.</font>g<font color=Cyan>)</font> <font color=Cyan>.</font> f-<a name="(line218)"></a>-<a name="(line219)"></a><a name="without"></a><font color=Blue>-- | Pruning: in @f `without` g@,</font>-<a name="(line220)"></a><font color=Blue>-- keep only those f-productions which have no g-productions</font>-<a name="(line221)"></a>without <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i-<a name="(line222)"></a><a name="without"></a>f <font color=Cyan>`without`</font> g <font color=Red>=</font> filter <font color=Cyan>(</font>null<font color=Cyan>.</font>g<font color=Cyan>)</font> <font color=Cyan>.</font> f-<a name="(line223)"></a>-<a name="(line224)"></a><a name="/>"></a><font color=Blue>-- | Pronounced /slash/, @f \/> g@ means g inside f</font>-<a name="(line225)"></a><font color=Cyan>(</font><font color=Cyan>/></font><font color=Cyan>)</font> <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i-<a name="(line226)"></a>f <font color=Cyan>/></font> g <font color=Red>=</font> g <font color=Cyan>`o`</font> children <font color=Cyan>`o`</font> f-<a name="(line227)"></a>-<a name="(line228)"></a><a name="</"></a><font color=Blue>-- | Pronounced /outside/, @f \<\/ g@ means f containing g</font>-<a name="(line229)"></a><font color=Cyan>(</font><font color=Cyan></</font><font color=Cyan>)</font> <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i-<a name="(line230)"></a>f <font color=Cyan></</font> g <font color=Red>=</font> f <font color=Cyan>`with`</font> <font color=Cyan>(</font>g <font color=Cyan>`o`</font> children<font color=Cyan>)</font>-<a name="(line231)"></a>-<a name="(line232)"></a><a name="et"></a><font color=Blue>-- | Join an element-matching filter with a text-only filter</font>-<a name="(line233)"></a>et <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>CFilter i<font color=Cyan>)</font> <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i-<a name="(line234)"></a>et f g <font color=Red>=</font> <font color=Cyan>(</font>f <font color=Cyan>`oo`</font> tagged elm<font color=Cyan>)</font>-<a name="(line235)"></a> <font color=Cyan>|>|</font>-<a name="(line236)"></a> <font color=Cyan>(</font>g <font color=Cyan>`o`</font> txt<font color=Cyan>)</font>-<a name="(line237)"></a>-<a name="(line238)"></a><a name="path"></a><font color=Blue>-- | Express a list of filters like an XPath query, e.g.</font>-<a name="(line239)"></a><font color=Blue>-- @path [children, tag \"name1\", attr \"attr1\", children, tag \"name2\"]@</font>-<a name="(line240)"></a><font color=Blue>-- is like the XPath query @\/name1[\@attr1]\/name2@.</font>-<a name="(line241)"></a>path <font color=Red>::</font> <font color=Red>[</font>CFilter i<font color=Red>]</font> <font color=Red>-></font> CFilter i-<a name="(line242)"></a>path fs <font color=Red>=</font> foldr <font color=Cyan>(</font>flip <font color=Cyan>(</font>o<font color=Cyan>)</font><font color=Cyan>)</font> keep fs-<a name="(line243)"></a>-<a name="(line244)"></a>-<a name="(line245)"></a><a name="deep"></a><font color=Blue>-- RECURSIVE SEARCH</font>-<a name="(line246)"></a><font color=Blue>-- $recursive</font>-<a name="(line247)"></a><font color=Blue>-- Recursive search has three variants: @deep@ does a breadth-first</font>-<a name="(line248)"></a><font color=Blue>-- search of the tree, @deepest@ does a depth-first search, @multi@ returns</font>-<a name="(line249)"></a><font color=Blue>-- content at all tree-levels, even those strictly contained within results</font>-<a name="(line250)"></a><font color=Blue>-- that have already been returned.</font>-<a name="(line251)"></a>deep<font color=Cyan>,</font> deepest<font color=Cyan>,</font> multi <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i-<a name="(line252)"></a>deep f <font color=Red>=</font> f <font color=Cyan>|>|</font> <font color=Cyan>(</font>deep f <font color=Cyan>`o`</font> children<font color=Cyan>)</font>-<a name="(line253)"></a><a name="deepest"></a>deepest f <font color=Red>=</font> <font color=Cyan>(</font>deepest f <font color=Cyan>`o`</font> children<font color=Cyan>)</font> <font color=Cyan>|>|</font> f-<a name="(line254)"></a><a name="multi"></a>multi f <font color=Red>=</font> f <font color=Cyan>`union`</font> <font color=Cyan>(</font>multi f <font color=Cyan>`o`</font> children<font color=Cyan>)</font>-<a name="(line255)"></a>-<a name="(line256)"></a><a name="when"></a><font color=Blue>-- | Interior editing:</font>-<a name="(line257)"></a><font color=Blue>-- @f `when` g@ applies @f@ only when the predicate @g@ succeeds,</font>-<a name="(line258)"></a><font color=Blue>-- otherwise the content is unchanged.</font>-<a name="(line259)"></a>when <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i-<a name="(line260)"></a><a name="guards"></a><font color=Blue>-- | Interior editing:</font>-<a name="(line261)"></a><font color=Blue>-- @g `guards` f@ applies @f@ only when the predicate @g@ succeeds,</font>-<a name="(line262)"></a><font color=Blue>-- otherwise the content is discarded.</font>-<a name="(line263)"></a>guards <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i-<a name="(line264)"></a><a name="when"></a>f <font color=Cyan>`when`</font> g <font color=Red>=</font> g <font color=Cyan>?></font> f <font color=Red><b>:></b></font> keep-<a name="(line265)"></a><a name="guards"></a>g <font color=Cyan>`guards`</font> f <font color=Red>=</font> g <font color=Cyan>?></font> f <font color=Red><b>:></b></font> none <font color=Blue>-- = f `o` (keep `with` g)</font>-<a name="(line266)"></a>-<a name="(line267)"></a><a name="chip"></a><font color=Blue>-- | Process CHildren In Place. The filter is applied to any children</font>-<a name="(line268)"></a><font color=Blue>-- of an element content, and the element rebuilt around the results.</font>-<a name="(line269)"></a>chip <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i-<a name="(line270)"></a>chip f <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> i<font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font> CElem <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> <font color=Cyan>(</font>concatMap f cs<font color=Cyan>)</font><font color=Cyan>)</font> i <font color=Red>]</font>-<a name="(line271)"></a>chip f c <font color=Red>=</font> <font color=Red>[</font>c<font color=Red>]</font>-<a name="(line272)"></a><font color=Blue>-- chip f = inplace (f `o` children)</font>-<a name="(line273)"></a>-<a name="(line274)"></a><a name="inplace"></a><font color=Blue>-- | Process an element In Place. The filter is applied to the element</font>-<a name="(line275)"></a><font color=Blue>-- itself, and then the original element rebuilt around the results.</font>-<a name="(line276)"></a>inplace <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i-<a name="(line277)"></a>inplace f c<font color=Red>@</font><font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem name <font color=Green><u>as</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> i<font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font> CElem <font color=Cyan>(</font>Elem name <font color=Green><u>as</u></font> <font color=Cyan>(</font>f c<font color=Cyan>)</font><font color=Cyan>)</font> i <font color=Red>]</font>-<a name="(line278)"></a>inplace f c <font color=Red>=</font> <font color=Red>[</font>c<font color=Red>]</font>-<a name="(line279)"></a>-<a name="(line280)"></a>-<a name="(line281)"></a><a name="foldXml"></a><font color=Blue>-- | Recursive application of filters: a fold-like operator. Defined</font>-<a name="(line282)"></a><font color=Blue>-- as @f `o` chip (foldXml f)@.</font>-<a name="(line283)"></a>foldXml <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i-<a name="(line284)"></a>foldXml f <font color=Red>=</font> f <font color=Cyan>`o`</font> chip <font color=Cyan>(</font>foldXml f<font color=Cyan>)</font>-<a name="(line285)"></a>-<a name="(line286)"></a>-<a name="(line287)"></a>-<a name="(line288)"></a>-<a name="(line289)"></a><font color=Blue>-- CONSTRUCTIVE CONTENT FILTERS</font>-<a name="(line290)"></a>-<a name="(line291)"></a><a name="mkElem"></a><font color=Blue>-- | Build an element with the given tag name - its content is the results</font>-<a name="(line292)"></a><font color=Blue>-- of the given list of filters.</font>-<a name="(line293)"></a>mkElem <font color=Red>::</font> String <font color=Red>-></font> <font color=Red>[</font>CFilter i<font color=Red>]</font> <font color=Red>-></font> CFilter i-<a name="(line294)"></a>mkElem h cfs <font color=Red>=</font> <font color=Red>\</font>t<font color=Red>-></font> <font color=Red>[</font> CElem <font color=Cyan>(</font>Elem h [] <font color=Cyan>(</font>cat cfs t<font color=Cyan>)</font><font color=Cyan>)</font> undefined <font color=Red>]</font>-<a name="(line295)"></a>-<a name="(line296)"></a><a name="mkElemAttr"></a><font color=Blue>-- | Build an element with the given name, attributes, and content.</font>-<a name="(line297)"></a>mkElemAttr <font color=Red>::</font> String <font color=Red>-></font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font>CFilter i<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>CFilter i<font color=Red>]</font> <font color=Red>-></font> CFilter i-<a name="(line298)"></a>mkElemAttr h <font color=Green><u>as</u></font> cfs <font color=Red>=</font> <font color=Red>\</font>t<font color=Red>-></font> <font color=Red>[</font> CElem <font color=Cyan>(</font>Elem h <font color=Cyan>(</font>map <font color=Cyan>(</font>attr t<font color=Cyan>)</font> <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan>(</font>cat cfs t<font color=Cyan>)</font><font color=Cyan>)</font> undefined <font color=Red>]</font>-<a name="(line299)"></a> <font color=Green><u>where</u></font> attr t <font color=Cyan>(</font>n<font color=Cyan>,</font>vf<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line300)"></a> <font color=Green><u>let</u></font> v <font color=Red>=</font> concat <font color=Red>[</font> s <font color=Red>|</font> <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red><-</font> <font color=Cyan>(</font>deep txt <font color=Cyan>`o`</font> vf<font color=Cyan>)</font> t <font color=Red>]</font>-<a name="(line301)"></a> <font color=Green><u>in</u></font> <font color=Cyan>(</font>n<font color=Cyan>,</font> AttValue <font color=Red>[</font>Left v<font color=Red>]</font><font color=Cyan>)</font>-<a name="(line302)"></a>-<a name="(line303)"></a><a name="literal"></a><font color=Blue>-- | Build some textual content.</font>-<a name="(line304)"></a>literal <font color=Red>::</font> String <font color=Red>-></font> CFilter i-<a name="(line305)"></a>literal s <font color=Red>=</font> const <font color=Red>[</font>CString False s undefined<font color=Red>]</font>-<a name="(line306)"></a>-<a name="(line307)"></a><a name="cdata"></a><font color=Blue>-- | Build some CDATA content.</font>-<a name="(line308)"></a>cdata <font color=Red>::</font> String <font color=Red>-></font> CFilter i-<a name="(line309)"></a>cdata s <font color=Red>=</font> const <font color=Red>[</font>CString True s undefined<font color=Red>]</font>-<a name="(line310)"></a>-<a name="(line311)"></a><a name="replaceTag"></a><font color=Blue>-- | Rename an element tag (leaving attributes in place).</font>-<a name="(line312)"></a>replaceTag <font color=Red>::</font> String <font color=Red>-></font> CFilter i-<a name="(line313)"></a>replaceTag n <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> i<font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>CElem <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> i<font color=Red>]</font>-<a name="(line314)"></a>replaceTag n <font color=Green><u>_</u></font> <font color=Red>=</font> []-<a name="(line315)"></a>-<a name="(line316)"></a><a name="replaceAttrs"></a><font color=Blue>-- | Replace the attributes of an element (leaving tag the same).</font>-<a name="(line317)"></a>replaceAttrs <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> CFilter i-<a name="(line318)"></a>replaceAttrs <font color=Green><u>as</u></font> <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem n <font color=Green><u>_</u></font> cs<font color=Cyan>)</font> i<font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>CElem <font color=Cyan>(</font>Elem n as' cs<font color=Cyan>)</font> i<font color=Red>]</font>-<a name="(line319)"></a> <font color=Green><u>where</u></font> as' <font color=Red>=</font> map <font color=Cyan>(</font><font color=Red>\</font><font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Cyan>)</font><font color=Red>-></font> <font color=Cyan>(</font>n<font color=Cyan>,</font> AttValue <font color=Red>[</font>Left v<font color=Red>]</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Green><u>as</u></font>-<a name="(line320)"></a>replaceAttrs <font color=Green><u>as</u></font> <font color=Green><u>_</u></font> <font color=Red>=</font> []-<a name="(line321)"></a>-<a name="(line322)"></a>-<a name="(line323)"></a>-<a name="(line324)"></a><font color=Blue>-- LABELLING</font>-<a name="(line325)"></a>-<a name="(line326)"></a><a name="LabelFilter"></a><font color=Blue>-- | A LabelFilter is like a CFilter except that it pairs up a polymorphic</font>-<a name="(line327)"></a><a name="LabelFilter"></a><font color=Blue>-- value (label) with each of its results.</font>-<a name="(line328)"></a><a name="LabelFilter"></a><font color=Green><u>type</u></font> LabelFilter i a <font color=Red>=</font> Content i <font color=Red>-></font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font>Content i<font color=Cyan>)</font><font color=Red>]</font>-<a name="(line329)"></a>-<a name="(line330)"></a><a name="oo"></a><font color=Blue>-- | Compose a label-processing filter with a label-generating filter.</font>-<a name="(line331)"></a>oo <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font>CFilter i<font color=Cyan>)</font> <font color=Red>-></font> LabelFilter i a <font color=Red>-></font> CFilter i-<a name="(line332)"></a><a name="oo"></a>f <font color=Cyan>`oo`</font> g <font color=Red>=</font> concatMap <font color=Cyan>(</font>uncurry f<font color=Cyan>)</font> <font color=Cyan>.</font> g-<a name="(line333)"></a>-<a name="(line334)"></a><font color=Blue>{--<a name="(line335)"></a>-- | Process the information labels (very nearly monadic bind).-<a name="(line336)"></a>oo :: (b -> CFilter b c) -> CFilter a b -> CFilter a c-<a name="(line337)"></a>f `oo` g = concatMap info . g-<a name="(line338)"></a> where info c@(CElem _ i) = f i c-<a name="(line339)"></a> info c@(CString _ _ i) = f i c-<a name="(line340)"></a> info c@(CRef _ i) = f i c-<a name="(line341)"></a> info c = [c]-<a name="(line342)"></a>-}</font>-<a name="(line343)"></a>-<a name="(line344)"></a><a name="x"></a><font color=Blue>-- | Combine labels. Think of this as a pair-wise zip on labels.</font>-<a name="(line345)"></a><font color=Blue>-- e.g. @(numbered `x` tagged)@</font>-<a name="(line346)"></a>x <font color=Red>::</font> <font color=Cyan>(</font>CFilter i<font color=Red>-></font>LabelFilter i a<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>CFilter i<font color=Red>-></font>LabelFilter i b<font color=Cyan>)</font> <font color=Red>-></font>-<a name="(line347)"></a> <font color=Cyan>(</font>CFilter i<font color=Red>-></font>LabelFilter i <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line348)"></a><a name="x"></a>f <font color=Cyan>`x`</font> g <font color=Red>=</font> <font color=Red>\</font>cf c<font color=Red>-></font> <font color=Green><u>let</u></font> gs <font color=Red>=</font> map fst <font color=Cyan>(</font>g cf c<font color=Cyan>)</font>-<a name="(line349)"></a> fs <font color=Red>=</font> map fst <font color=Cyan>(</font>f cf c<font color=Cyan>)</font>-<a name="(line350)"></a> <font color=Green><u>in</u></font> zip <font color=Cyan>(</font>zip fs gs<font color=Cyan>)</font> <font color=Cyan>(</font>cf c<font color=Cyan>)</font>-<a name="(line351)"></a>-<a name="(line352)"></a>-<a name="(line353)"></a><font color=Blue>-- Some basic label-generating filters.</font>-<a name="(line354)"></a>-<a name="(line355)"></a><a name="numbered"></a><font color=Blue>-- | Number the results from 1 upwards.</font>-<a name="(line356)"></a>numbered <font color=Red>::</font> CFilter i <font color=Red>-></font> LabelFilter i Int-<a name="(line357)"></a>numbered f <font color=Red>=</font> zip <font color=Red>[</font><font color=Magenta>1</font><font color=Red>..</font><font color=Red>]</font> <font color=Cyan>.</font> f-<a name="(line358)"></a>-<a name="(line359)"></a><a name="interspersed"></a><font color=Blue>-- | In @interspersed a f b@, label each result of @f@ with the string @a@,</font>-<a name="(line360)"></a><font color=Blue>-- except for the last one which is labelled with the string @b@.</font>-<a name="(line361)"></a>interspersed <font color=Red>::</font> String <font color=Red>-></font> CFilter i <font color=Red>-></font> String <font color=Red>-></font> LabelFilter i String-<a name="(line362)"></a>interspersed a f b <font color=Red>=</font>-<a name="(line363)"></a> <font color=Cyan>(</font><font color=Red>\</font>xs<font color=Red>-></font> zip <font color=Cyan>(</font>replicate <font color=Cyan>(</font>len xs<font color=Cyan>)</font> a <font color=Cyan>++</font> <font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font> xs<font color=Cyan>)</font> <font color=Cyan>.</font> f-<a name="(line364)"></a> <font color=Green><u>where</u></font>-<a name="(line365)"></a> len [] <font color=Red>=</font> <font color=Magenta>0</font>-<a name="(line366)"></a> len xs <font color=Red>=</font> length xs <font color=Blue>-</font> <font color=Magenta>1</font>-<a name="(line367)"></a>-<a name="(line368)"></a><a name="tagged"></a><font color=Blue>-- | Label each element in the result with its tag name. Non-element</font>-<a name="(line369)"></a><font color=Blue>-- results get an empty string label.</font>-<a name="(line370)"></a>tagged <font color=Red>::</font> CFilter i <font color=Red>-></font> LabelFilter i String-<a name="(line371)"></a>tagged f <font color=Red>=</font> extracted name f-<a name="(line372)"></a> <font color=Green><u>where</u></font> name <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem n <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> n-<a name="(line373)"></a> name <font color=Green><u>_</u></font> <font color=Red>=</font> <font color=Magenta>""</font>-<a name="(line374)"></a>-<a name="(line375)"></a><a name="attributed"></a><font color=Blue>-- | Label each element in the result with the value of the named attribute.</font>-<a name="(line376)"></a><font color=Blue>-- Elements without the attribute, and non-element results, get an</font>-<a name="(line377)"></a><font color=Blue>-- empty string label.</font>-<a name="(line378)"></a>attributed <font color=Red>::</font> String <font color=Red>-></font> CFilter i <font color=Red>-></font> LabelFilter i String-<a name="(line379)"></a>attributed key f <font color=Red>=</font> extracted att f-<a name="(line380)"></a> <font color=Green><u>where</u></font> att <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>as</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line381)"></a> <font color=Green><u>case</u></font> <font color=Cyan>(</font>lookup key <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Green><u>of</u></font>-<a name="(line382)"></a> Nothing <font color=Red>-></font> <font color=Magenta>""</font>-<a name="(line383)"></a> <font color=Cyan>(</font>Just v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> show v-<a name="(line384)"></a> att <font color=Green><u>_</u></font> <font color=Red>=</font> <font color=Magenta>""</font>-<a name="(line385)"></a>-<a name="(line386)"></a><a name="textlabelled"></a><font color=Blue>-- | Label each textual part of the result with its text. Element</font>-<a name="(line387)"></a><font color=Blue>-- results get an empty string label.</font>-<a name="(line388)"></a>textlabelled <font color=Red>::</font> CFilter i <font color=Red>-></font> LabelFilter i <font color=Cyan>(</font>Maybe String<font color=Cyan>)</font>-<a name="(line389)"></a>textlabelled f <font color=Red>=</font> extracted text f-<a name="(line390)"></a> <font color=Green><u>where</u></font> text <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> Just s-<a name="(line391)"></a> text <font color=Green><u>_</u></font> <font color=Red>=</font> Nothing-<a name="(line392)"></a>-<a name="(line393)"></a><a name="extracted"></a><font color=Blue>-- | Label each content with some information extracted from itself.</font>-<a name="(line394)"></a>extracted <font color=Red>::</font> <font color=Cyan>(</font>Content i<font color=Red>-></font>a<font color=Cyan>)</font> <font color=Red>-></font> CFilter i <font color=Red>-></font> LabelFilter i a-<a name="(line395)"></a>extracted proj f <font color=Red>=</font> concatMap <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font><font color=Red>[</font><font color=Cyan>(</font>proj c<font color=Cyan>,</font> c<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font> <font color=Cyan>.</font> f-<a name="(line396)"></a> -<a name="(line397)"></a>-<a name="(line398)"></a>-<a name="(line399)"></a><font color=Blue>{--<a name="(line400)"></a>-- MISC-<a name="(line401)"></a>-<a name="(line402)"></a>-- | I haven't yet remembered \/ worked out what this does.-<a name="(line403)"></a>combine :: (Read a,Show a) => ([a]->a) -> LabelFilter String -> CFilter-<a name="(line404)"></a>combine f lf = \c-> [ CString False (show (f [ read l | (l,_) <- lf c ])) ]-<a name="(line405)"></a>-}</font>-<a name="(line406)"></a>-<a name="(line407)"></a>-<a name="(line408)"></a><font color=Blue>{- OLD STUFF - OBSOLETE-<a name="(line409)"></a>-- Keep an element by its numbered position (starting at 1).-<a name="(line410)"></a>position :: Int -> [Content] -> [Content]-<a name="(line411)"></a>position n | n>0 = (:[]) . (!!(n-1))-<a name="(line412)"></a> | otherwise = const []-<a name="(line413)"></a>-<a name="(line414)"></a>-- Chop and remove the root portions of trees to depth n.-<a name="(line415)"></a>layer :: Int -> [Content] -> [Content]-<a name="(line416)"></a>layer n = apply n (concatMap lay)-<a name="(line417)"></a> where lay (CElem (Elem _ _ cs)) = cs-<a name="(line418)"></a> lay _ = []-<a name="(line419)"></a> apply 0 f xs = xs-<a name="(line420)"></a> apply n f xs = apply (n-1) f (f xs)-<a name="(line421)"></a>-<a name="(line422)"></a>combine :: (Read a, Show a) => ([a]->a) -> [Content] -> [Content]-<a name="(line423)"></a>combine f = \cs-> [ CString False (show (f [ read s | CString _ s <- cs ])) ]-<a name="(line424)"></a>-}</font>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/Combinators.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>--------------------------------------------</font>+<a name="line-2"></a><font color=Blue>-- | This module defines the notion of filters and filter combinators</font>+<a name="line-3"></a><font color=Blue>-- for processing XML documents.</font>+<a name="line-4"></a><font color=Blue>--</font>+<a name="line-5"></a><font color=Blue>-- These XML transformation combinators are described in the paper</font>+<a name="line-6"></a><font color=Blue>-- ``Haskell and XML: Generic Combinators or Type-Based Translation?''</font>+<a name="line-7"></a><font color=Blue>-- Malcolm Wallace and Colin Runciman, Proceedings ICFP'99.</font>+<a name="line-8"></a><font color=Blue>--------------------------------------------</font>+<a name="line-9"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Combinators+<a name="line-10"></a> <font color=Cyan>(</font><font color=Blue>-- * The content filter type.</font>+<a name="line-11"></a> CFilter+<a name="line-12"></a>+<a name="line-13"></a> <font color=Blue>-- * Simple filters.</font>+<a name="line-14"></a> <font color=Blue>-- ** Selection filters.</font>+<a name="line-15"></a> <font color=Blue>-- $selection</font>+<a name="line-16"></a> <font color=Cyan>,</font> keep<font color=Cyan>,</font> none<font color=Cyan>,</font> children<font color=Cyan>,</font> position+<a name="line-17"></a>+<a name="line-18"></a> <font color=Blue>-- ** Predicate filters.</font>+<a name="line-19"></a> <font color=Blue>-- $pred</font>+<a name="line-20"></a> <font color=Cyan>,</font> elm<font color=Cyan>,</font> txt<font color=Cyan>,</font> tag<font color=Cyan>,</font> attr<font color=Cyan>,</font> attrval<font color=Cyan>,</font> tagWith+<a name="line-21"></a>+<a name="line-22"></a> <font color=Blue>-- ** Search filters.</font>+<a name="line-23"></a> <font color=Cyan>,</font> find<font color=Cyan>,</font> iffind<font color=Cyan>,</font> ifTxt+<a name="line-24"></a>+<a name="line-25"></a> <font color=Blue>-- * Filter combinators</font>+<a name="line-26"></a> <font color=Blue>-- ** Basic combinators.</font>+<a name="line-27"></a> <font color=Cyan>,</font> o<font color=Cyan>,</font> union<font color=Cyan>,</font> cat<font color=Cyan>,</font> andThen+<a name="line-28"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Cyan>|>|</font><font color=Cyan>)</font><font color=Cyan>,</font> with<font color=Cyan>,</font> without+<a name="line-29"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Cyan>/></font><font color=Cyan>)</font><font color=Cyan>,</font> <font color=Cyan>(</font><font color=Cyan></</font><font color=Cyan>)</font><font color=Cyan>,</font> et+<a name="line-30"></a> <font color=Cyan>,</font> path+<a name="line-31"></a> <font color=Blue>-- ** Recursive search.</font>+<a name="line-32"></a> <font color=Blue>-- $recursive</font>+<a name="line-33"></a> <font color=Cyan>,</font> deep<font color=Cyan>,</font> deepest<font color=Cyan>,</font> multi+<a name="line-34"></a> <font color=Blue>-- ** Interior editing.</font>+<a name="line-35"></a> <font color=Cyan>,</font> when<font color=Cyan>,</font> guards<font color=Cyan>,</font> chip<font color=Cyan>,</font> inplace<font color=Cyan>,</font> foldXml+<a name="line-36"></a> <font color=Blue>-- ** Constructive filters.</font>+<a name="line-37"></a> <font color=Cyan>,</font> mkElem<font color=Cyan>,</font> mkElemAttr<font color=Cyan>,</font> literal<font color=Cyan>,</font> cdata<font color=Cyan>,</font> replaceTag<font color=Cyan>,</font> replaceAttrs+<a name="line-38"></a>+<a name="line-39"></a> <font color=Blue>-- * C-like conditionals.</font>+<a name="line-40"></a> <font color=Blue>-- $cond</font>+<a name="line-41"></a> <font color=Cyan>,</font> ThenElse<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font> <font color=Cyan>(</font><font color=Cyan>?></font><font color=Cyan>)</font>+<a name="line-42"></a>+<a name="line-43"></a> <font color=Blue>-- * Filters with labelled results.</font>+<a name="line-44"></a> <font color=Cyan>,</font> LabelFilter+<a name="line-45"></a> <font color=Blue>-- ** Using and combining labelled filters.</font>+<a name="line-46"></a> <font color=Cyan>,</font> oo<font color=Cyan>,</font> x+<a name="line-47"></a> <font color=Blue>-- ** Some label-generating filters.</font>+<a name="line-48"></a> <font color=Cyan>,</font> numbered<font color=Cyan>,</font> interspersed<font color=Cyan>,</font> tagged<font color=Cyan>,</font> attributed<font color=Cyan>,</font> textlabelled<font color=Cyan>,</font> extracted+<a name="line-49"></a>+<a name="line-50"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-51"></a>+<a name="line-52"></a>+<a name="line-53"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-54"></a><font color=Green><u>import</u></font> Maybe <font color=Cyan>(</font>fromMaybe<font color=Cyan>)</font>+<a name="line-55"></a>+<a name="line-56"></a><font color=Green><u>infixl</u></font> <font color=Magenta>6</font> <font color=Cyan>`with`</font><font color=Cyan>,</font> <font color=Cyan>`without`</font>+<a name="line-57"></a><font color=Green><u>infixr</u></font> <font color=Magenta>5</font> <font color=Cyan>`o`</font><font color=Cyan>,</font> <font color=Cyan>`oo`</font><font color=Cyan>,</font> <font color=Cyan>`union`</font><font color=Cyan>,</font> <font color=Cyan>`andThen`</font> <font color=Blue>-- , `orelse`</font>+<a name="line-58"></a><font color=Green><u>infixl</u></font> <font color=Magenta>5</font> <font color=Cyan>/></font><font color=Cyan>,</font> <font color=Cyan></</font><font color=Cyan>,</font> <font color=Cyan>|>|</font>+<a name="line-59"></a><font color=Green><u>infixr</u></font> <font color=Magenta>4</font> <font color=Cyan>`when`</font><font color=Cyan>,</font> <font color=Cyan>`guards`</font>+<a name="line-60"></a><font color=Green><u>infixr</u></font> <font color=Magenta>3</font> <font color=Cyan>?></font><font color=Cyan>,</font> <font color=Red><b>:></b></font>+<a name="line-61"></a>+<a name="line-62"></a>+<a name="line-63"></a>+<a name="line-64"></a><font color=Blue>-- THE CONTENT FILTER TYPE</font>+<a name="line-65"></a>+<a name="line-66"></a><a name="CFilter"></a><font color=Blue>-- | All document transformations are /content filters/.</font>+<a name="line-67"></a><a name="CFilter"></a><font color=Blue>-- A filter takes a single XML 'Content' value and returns a sequence</font>+<a name="line-68"></a><a name="CFilter"></a><font color=Blue>-- of 'Content' values, possibly empty.</font>+<a name="line-69"></a><a name="CFilter"></a><font color=Green><u>type</u></font> CFilter i <font color=Red>=</font> Content i <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font>+<a name="line-70"></a>+<a name="line-71"></a>+<a name="line-72"></a>+<a name="line-73"></a><a name="keep"></a><font color=Blue>-- BASIC SELECTION FILTERS</font>+<a name="line-74"></a><font color=Blue>-- $selection</font>+<a name="line-75"></a><font color=Blue>-- In the algebra of combinators, @none@ is the zero, and @keep@ the identity.</font>+<a name="line-76"></a><font color=Blue>-- (They have a more general type than just CFilter.)</font>+<a name="line-77"></a><font color=Blue>keep</font> <font color=Red>::</font> a<font color=Red>-></font><font color=Red>[</font>a<font color=Red>]</font>+<a name="line-78"></a><font color=Blue>keep</font> <font color=Red>=</font> <font color=Red>\</font>x<font color=Red>-></font><font color=Red>[</font>x<font color=Red>]</font>+<a name="line-79"></a><a name="none"></a><font color=Blue>none</font> <font color=Red>::</font> a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font>+<a name="line-80"></a><font color=Blue>none</font> <font color=Red>=</font> <font color=Red>\</font>x<font color=Red>-></font>[]+<a name="line-81"></a>+<a name="line-82"></a><a name="children"></a><font color=Blue>-- | Throw away current node, keep just the (unprocessed) children.</font>+<a name="line-83"></a><font color=Blue>children</font> <font color=Red>::</font> CFilter i+<a name="line-84"></a><font color=Blue>children</font> <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> cs<font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> cs+<a name="line-85"></a><font color=Blue>children</font> <font color=Green><u>_</u></font> <font color=Red>=</font> []+<a name="line-86"></a>+<a name="line-87"></a><a name="position"></a><font color=Blue>-- | Select the @n@'th positional result of a filter.</font>+<a name="line-88"></a><font color=Blue>position</font> <font color=Red>::</font> Int <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i+<a name="line-89"></a><font color=Blue>position</font> n f <font color=Red>=</font> <font color=Cyan>(</font><font color=Red>\</font>cs<font color=Red>-></font> <font color=Red>[</font>cs<font color=Cyan>!!</font>n<font color=Red>]</font><font color=Cyan>)</font> <font color=Cyan>.</font> f+<a name="line-90"></a>+<a name="line-91"></a>+<a name="line-92"></a>+<a name="line-93"></a><font color=Blue>-- BASIC PREDICATE FILTERS</font>+<a name="line-94"></a><font color=Blue>-- $pred</font>+<a name="line-95"></a><font color=Blue>-- These filters either keep or throw away some content based on</font>+<a name="line-96"></a><font color=Blue>-- a simple test. For instance, @elm@ keeps only a tagged element,</font>+<a name="line-97"></a><font color=Blue>-- @txt@ keeps only non-element text, @tag@ keeps only an element</font>+<a name="line-98"></a><font color=Blue>-- with the named tag, @attr@ keeps only an element with the named</font>+<a name="line-99"></a><font color=Blue>-- attribute, @attrval@ keeps only an element with the given</font>+<a name="line-100"></a><font color=Blue>-- attribute value, @tagWith@ keeps only an element whose tag name</font>+<a name="line-101"></a><font color=Blue>-- satisfies the given predicate.</font>+<a name="line-102"></a>+<a name="line-103"></a><a name="elm"></a><font color=Blue>elm</font><font color=Cyan>,</font> txt <font color=Red>::</font> CFilter i+<a name="line-104"></a><a name="tag"></a><font color=Blue>tag</font> <font color=Red>::</font> String <font color=Red>-></font> CFilter i+<a name="line-105"></a><a name="attr"></a><font color=Blue>attr</font> <font color=Red>::</font> Name <font color=Red>-></font> CFilter i+<a name="line-106"></a><a name="attrval"></a><font color=Blue>attrval</font> <font color=Red>::</font> Attribute <font color=Red>-></font> CFilter i+<a name="line-107"></a><a name="tagWith"></a><font color=Blue>tagWith</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>Bool<font color=Cyan>)</font> <font color=Red>-></font> CFilter i+<a name="line-108"></a>+<a name="line-109"></a><font color=Blue>elm</font> x<font color=Red>@</font><font color=Cyan>(</font>CElem <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>x<font color=Red>]</font>+<a name="line-110"></a><font color=Blue>elm</font> <font color=Green><u>_</u></font> <font color=Red>=</font> []+<a name="line-111"></a>+<a name="line-112"></a><a name="txt"></a><font color=Blue>txt</font> x<font color=Red>@</font><font color=Cyan>(</font>CString <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>x<font color=Red>]</font>+<a name="line-113"></a><font color=Blue>txt</font> x<font color=Red>@</font><font color=Cyan>(</font>CRef <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>x<font color=Red>]</font>+<a name="line-114"></a><font color=Blue>txt</font> <font color=Green><u>_</u></font> <font color=Red>=</font> []+<a name="line-115"></a>+<a name="line-116"></a><font color=Blue>tag</font> t x<font color=Red>@</font><font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem n <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>|</font> t<font color=Cyan>==</font>n <font color=Red>=</font> <font color=Red>[</font>x<font color=Red>]</font>+<a name="line-117"></a><font color=Blue>tag</font> t <font color=Green><u>_</u></font> <font color=Red>=</font> []+<a name="line-118"></a>+<a name="line-119"></a><font color=Blue>tagWith</font> p x<font color=Red>@</font><font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem n <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>|</font> p n <font color=Red>=</font> <font color=Red>[</font>x<font color=Red>]</font>+<a name="line-120"></a><font color=Blue>tagWith</font> p <font color=Green><u>_</u></font> <font color=Red>=</font> []+<a name="line-121"></a>+<a name="line-122"></a><font color=Blue>attr</font> n x<font color=Red>@</font><font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>as</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>|</font> n <font color=Cyan>`elem`</font> <font color=Cyan>(</font>map fst <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>x<font color=Red>]</font>+<a name="line-123"></a><font color=Blue>attr</font> n <font color=Green><u>_</u></font> <font color=Red>=</font> []+<a name="line-124"></a>+<a name="line-125"></a><font color=Blue>attrval</font> av x<font color=Red>@</font><font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>as</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>|</font> av <font color=Cyan>`elem`</font> <font color=Green><u>as</u></font> <font color=Red>=</font> <font color=Red>[</font>x<font color=Red>]</font>+<a name="line-126"></a><font color=Blue>attrval</font> av <font color=Green><u>_</u></font> <font color=Red>=</font> []+<a name="line-127"></a>+<a name="line-128"></a>+<a name="line-129"></a>+<a name="line-130"></a><font color=Blue>-- SEARCH FILTERS</font>+<a name="line-131"></a>+<a name="line-132"></a><a name="find"></a><font color=Blue>-- | For a mandatory attribute field, @find key cont@ looks up the value of</font>+<a name="line-133"></a><font color=Blue>-- the attribute name @key@, and applies the continuation @cont@ to</font>+<a name="line-134"></a><font color=Blue>-- the value.</font>+<a name="line-135"></a><font color=Blue>find</font> <font color=Red>::</font> String <font color=Red>-></font> <font color=Cyan>(</font>String<font color=Red>-></font>CFilter i<font color=Cyan>)</font> <font color=Red>-></font> CFilter i+<a name="line-136"></a><font color=Blue>find</font> key cont c<font color=Red>@</font><font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>as</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> cont <font color=Cyan>(</font>show <font color=Cyan>(</font>lookfor key <font color=Green><u>as</u></font><font color=Cyan>)</font><font color=Cyan>)</font> c+<a name="line-137"></a> <font color=Green><u>where</u></font> lookfor x <font color=Red>=</font> fromMaybe <font color=Cyan>(</font>error <font color=Cyan>(</font><font color=Magenta>"missing attribute: "</font><font color=Cyan>++</font>show x<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>.</font> lookup x+<a name="line-138"></a><font color=Blue>-- 'lookfor' has the more general type :: (Eq a,Show a) => a -> [(a,b)] -> b</font>+<a name="line-139"></a>+<a name="line-140"></a><a name="iffind"></a><font color=Blue>-- | When an attribute field may be absent, use @iffind key yes no@ to lookup</font>+<a name="line-141"></a><font color=Blue>-- its value. If the attribute is absent, it acts as the @no@ filter,</font>+<a name="line-142"></a><font color=Blue>-- otherwise it applies the @yes@ filter.</font>+<a name="line-143"></a><font color=Blue>iffind</font> <font color=Red>::</font> String <font color=Red>-></font> <font color=Cyan>(</font>String<font color=Red>-></font>CFilter i<font color=Cyan>)</font> <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i+<a name="line-144"></a><font color=Blue>iffind</font> key yes no c<font color=Red>@</font><font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>as</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-145"></a> <font color=Green><u>case</u></font> <font color=Cyan>(</font>lookup key <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Green><u>of</u></font>+<a name="line-146"></a> Nothing <font color=Red>-></font> no c+<a name="line-147"></a> <font color=Cyan>(</font>Just v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> yes <font color=Cyan>(</font>show v<font color=Cyan>)</font> c+<a name="line-148"></a><font color=Blue>iffind</font> key yes no other <font color=Red>=</font> no other+<a name="line-149"></a>+<a name="line-150"></a><a name="ifTxt"></a><font color=Blue>-- | @ifTxt yes no@ processes any textual content with the @yes@ filter,</font>+<a name="line-151"></a><font color=Blue>-- but otherwise is the same as the @no@ filter.</font>+<a name="line-152"></a><font color=Blue>ifTxt</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>CFilter i<font color=Cyan>)</font> <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i+<a name="line-153"></a><font color=Blue>ifTxt</font> yes no c<font color=Red>@</font><font color=Cyan>(</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> yes s c+<a name="line-154"></a><font color=Blue>ifTxt</font> yes no c <font color=Red>=</font> no c+<a name="line-155"></a>+<a name="line-156"></a>+<a name="line-157"></a>+<a name="line-158"></a><font color=Blue>-- C-LIKE CONDITIONALS</font>+<a name="line-159"></a><font color=Blue>--</font>+<a name="line-160"></a><font color=Blue>-- $cond</font>+<a name="line-161"></a><font color=Blue>-- These definitions provide C-like conditionals, lifted to the filter level.</font>+<a name="line-162"></a><font color=Blue>--</font>+<a name="line-163"></a><font color=Blue>-- The @(cond ? yes : no)@ style in C becomes @(cond ?> yes :> no)@ in Haskell.</font>+<a name="line-164"></a>+<a name="line-165"></a><a name="ThenElse"></a><font color=Blue>-- | Conjoin the two branches of a conditional.</font>+<a name="line-166"></a><a name="ThenElse"></a><font color=Green><u>data</u></font> ThenElse a <font color=Red>=</font> a <font color=Red><b>:></b></font> a+<a name="line-167"></a>+<a name="line-168"></a><a name="?>"></a><font color=Blue>-- | Select between the two branches of a joined conditional.</font>+<a name="line-169"></a><font color=Cyan>(</font><font color=Cyan>?></font><font color=Cyan>)</font> <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> ThenElse <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font>+<a name="line-170"></a><a name="p"></a><font color=Blue>p</font> <font color=Cyan>?></font> <font color=Cyan>(</font>f <font color=Red><b>:></b></font> g<font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>\</font>c<font color=Red>-></font> <font color=Green><u>if</u></font> <font color=Cyan>(</font>not<font color=Cyan>.</font>null<font color=Cyan>.</font>p<font color=Cyan>)</font> c <font color=Green><u>then</u></font> f c <font color=Green><u>else</u></font> g c+<a name="line-171"></a>+<a name="line-172"></a>+<a name="line-173"></a>+<a name="line-174"></a><font color=Blue>-- FILTER COMBINATORS</font>+<a name="line-175"></a>+<a name="line-176"></a>+<a name="line-177"></a><a name="o"></a><font color=Blue>-- | Sequential (/Irish/,/backwards/) composition</font>+<a name="line-178"></a><font color=Blue>o</font> <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i+<a name="line-179"></a><a name="o"></a><font color=Blue>f</font> <font color=Cyan>`o`</font> g <font color=Red>=</font> concatMap f <font color=Cyan>.</font> g+<a name="line-180"></a>+<a name="line-181"></a><a name="union"></a><font color=Blue>-- | Binary parallel composition. Each filter uses a copy of the input,</font>+<a name="line-182"></a><font color=Blue>-- rather than one filter using the result of the other.</font>+<a name="line-183"></a><font color=Blue>-- (Has a more general type than just CFilter.)</font>+<a name="line-184"></a><font color=Blue>union</font> <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font>+<a name="line-185"></a><font color=Blue>union</font> <font color=Red>=</font> lift <font color=Cyan>(</font><font color=Cyan>++</font><font color=Cyan>)</font> <font color=Blue>-- in Haskell 98: union = lift List.union</font>+<a name="line-186"></a> <font color=Green><u>where</u></font>+<a name="line-187"></a> lift <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font>b<font color=Red>-></font>d<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>c<font color=Red>-></font>a<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>c<font color=Red>-></font>b<font color=Cyan>)</font> <font color=Red>-></font> c <font color=Red>-></font> d+<a name="line-188"></a> lift f g h <font color=Red>=</font> <font color=Red>\</font>x<font color=Red>-></font> f <font color=Cyan>(</font>g x<font color=Cyan>)</font> <font color=Cyan>(</font>h x<font color=Cyan>)</font>+<a name="line-189"></a>+<a name="line-190"></a><a name="cat"></a><font color=Blue>-- | Glue a list of filters together. (A list version of union;</font>+<a name="line-191"></a><font color=Blue>-- also has a more general type than just CFilter.)</font>+<a name="line-192"></a><font color=Blue>cat</font> <font color=Red>::</font> <font color=Red>[</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font>+<a name="line-193"></a><font color=Blue>-- Specification: cat fs = \e-> concat [ f e | f <- fs ]</font>+<a name="line-194"></a><font color=Blue>-- more efficient implementation below:</font>+<a name="line-195"></a><font color=Blue>cat</font> [] <font color=Red>=</font> const []+<a name="line-196"></a><font color=Blue>cat</font> fs <font color=Red>=</font> foldr1 union fs+<a name="line-197"></a>+<a name="line-198"></a><a name="andThen"></a><font color=Blue>-- | A special form of filter composition where the second filter</font>+<a name="line-199"></a><font color=Blue>-- works over the same data as the first, but also uses the</font>+<a name="line-200"></a><font color=Blue>-- first's result.</font>+<a name="line-201"></a><font color=Blue>andThen</font> <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font>c<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>c<font color=Red>-></font>a<font color=Red>-></font>b<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font>b<font color=Cyan>)</font>+<a name="line-202"></a><font color=Blue>andThen</font> f g <font color=Red>=</font> <font color=Red>\</font>x<font color=Red>-></font> g <font color=Cyan>(</font>f x<font color=Cyan>)</font> x <font color=Blue>-- lift g f id</font>+<a name="line-203"></a>+<a name="line-204"></a><a name="childrenBy"></a><font color=Blue>-- | Process children using specified filters. /not exported/</font>+<a name="line-205"></a><font color=Blue>childrenBy</font> <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i +<a name="line-206"></a><font color=Blue>childrenBy</font> f <font color=Red>=</font> f <font color=Cyan>`o`</font> children+<a name="line-207"></a>+<a name="line-208"></a><a name="|>|"></a><font color=Blue>-- | Directional choice:</font>+<a name="line-209"></a><font color=Blue>-- in @f |>| g@ give g-productions only if no f-productions</font>+<a name="line-210"></a><font color=Cyan>(</font><font color=Cyan>|>|</font><font color=Cyan>)</font> <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font>+<a name="line-211"></a><a name="f"></a><font color=Blue>f</font> <font color=Cyan>|>|</font> g <font color=Red>=</font> <font color=Red>\</font>x<font color=Red>-></font> <font color=Green><u>let</u></font> fx <font color=Red>=</font> f x <font color=Green><u>in</u></font> <font color=Green><u>if</u></font> null fx <font color=Green><u>then</u></font> g x <font color=Green><u>else</u></font> fx+<a name="line-212"></a><font color=Blue>-- f |>| g = f ?> f :> g</font>+<a name="line-213"></a>+<a name="line-214"></a><a name="with"></a><font color=Blue>-- | Pruning: in @f `with` g@,</font>+<a name="line-215"></a><font color=Blue>-- keep only those f-productions which have at least one g-production</font>+<a name="line-216"></a><font color=Blue>with</font> <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i+<a name="line-217"></a><a name="with"></a><font color=Blue>f</font> <font color=Cyan>`with`</font> g <font color=Red>=</font> filter <font color=Cyan>(</font>not<font color=Cyan>.</font>null<font color=Cyan>.</font>g<font color=Cyan>)</font> <font color=Cyan>.</font> f+<a name="line-218"></a>+<a name="line-219"></a><a name="without"></a><font color=Blue>-- | Pruning: in @f `without` g@,</font>+<a name="line-220"></a><font color=Blue>-- keep only those f-productions which have no g-productions</font>+<a name="line-221"></a><font color=Blue>without</font> <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i+<a name="line-222"></a><a name="without"></a><font color=Blue>f</font> <font color=Cyan>`without`</font> g <font color=Red>=</font> filter <font color=Cyan>(</font>null<font color=Cyan>.</font>g<font color=Cyan>)</font> <font color=Cyan>.</font> f+<a name="line-223"></a>+<a name="line-224"></a><a name="/>"></a><font color=Blue>-- | Pronounced /slash/, @f \/> g@ means g inside f</font>+<a name="line-225"></a><font color=Cyan>(</font><font color=Cyan>/></font><font color=Cyan>)</font> <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i+<a name="line-226"></a><font color=Blue>f</font> <font color=Cyan>/></font> g <font color=Red>=</font> g <font color=Cyan>`o`</font> children <font color=Cyan>`o`</font> f+<a name="line-227"></a>+<a name="line-228"></a><a name="</"></a><font color=Blue>-- | Pronounced /outside/, @f \<\/ g@ means f containing g</font>+<a name="line-229"></a><font color=Cyan>(</font><font color=Cyan></</font><font color=Cyan>)</font> <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i+<a name="line-230"></a><font color=Blue>f</font> <font color=Cyan></</font> g <font color=Red>=</font> f <font color=Cyan>`with`</font> <font color=Cyan>(</font>g <font color=Cyan>`o`</font> children<font color=Cyan>)</font>+<a name="line-231"></a>+<a name="line-232"></a><a name="et"></a><font color=Blue>-- | Join an element-matching filter with a text-only filter</font>+<a name="line-233"></a><font color=Blue>et</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>CFilter i<font color=Cyan>)</font> <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i+<a name="line-234"></a><font color=Blue>et</font> f g <font color=Red>=</font> <font color=Cyan>(</font>f <font color=Cyan>`oo`</font> tagged elm<font color=Cyan>)</font>+<a name="line-235"></a> <font color=Cyan>|>|</font>+<a name="line-236"></a> <font color=Cyan>(</font>g <font color=Cyan>`o`</font> txt<font color=Cyan>)</font>+<a name="line-237"></a>+<a name="line-238"></a><a name="path"></a><font color=Blue>-- | Express a list of filters like an XPath query, e.g.</font>+<a name="line-239"></a><font color=Blue>-- @path [children, tag \"name1\", attr \"attr1\", children, tag \"name2\"]@</font>+<a name="line-240"></a><font color=Blue>-- is like the XPath query @\/name1[\@attr1]\/name2@.</font>+<a name="line-241"></a><font color=Blue>path</font> <font color=Red>::</font> <font color=Red>[</font>CFilter i<font color=Red>]</font> <font color=Red>-></font> CFilter i+<a name="line-242"></a><font color=Blue>path</font> fs <font color=Red>=</font> foldr <font color=Cyan>(</font>flip <font color=Cyan>(</font>o<font color=Cyan>)</font><font color=Cyan>)</font> keep fs+<a name="line-243"></a>+<a name="line-244"></a>+<a name="line-245"></a><a name="deep"></a><font color=Blue>-- RECURSIVE SEARCH</font>+<a name="line-246"></a><font color=Blue>-- $recursive</font>+<a name="line-247"></a><font color=Blue>-- Recursive search has three variants: @deep@ does a breadth-first</font>+<a name="line-248"></a><font color=Blue>-- search of the tree, @deepest@ does a depth-first search, @multi@ returns</font>+<a name="line-249"></a><font color=Blue>-- content at all tree-levels, even those strictly contained within results</font>+<a name="line-250"></a><font color=Blue>-- that have already been returned.</font>+<a name="line-251"></a><font color=Blue>deep</font><font color=Cyan>,</font> deepest<font color=Cyan>,</font> multi <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i+<a name="line-252"></a><font color=Blue>deep</font> f <font color=Red>=</font> f <font color=Cyan>|>|</font> <font color=Cyan>(</font>deep f <font color=Cyan>`o`</font> children<font color=Cyan>)</font>+<a name="line-253"></a><a name="deepest"></a><font color=Blue>deepest</font> f <font color=Red>=</font> <font color=Cyan>(</font>deepest f <font color=Cyan>`o`</font> children<font color=Cyan>)</font> <font color=Cyan>|>|</font> f+<a name="line-254"></a><a name="multi"></a><font color=Blue>multi</font> f <font color=Red>=</font> f <font color=Cyan>`union`</font> <font color=Cyan>(</font>multi f <font color=Cyan>`o`</font> children<font color=Cyan>)</font>+<a name="line-255"></a>+<a name="line-256"></a><a name="when"></a><font color=Blue>-- | Interior editing:</font>+<a name="line-257"></a><font color=Blue>-- @f `when` g@ applies @f@ only when the predicate @g@ succeeds,</font>+<a name="line-258"></a><font color=Blue>-- otherwise the content is unchanged.</font>+<a name="line-259"></a><font color=Blue>when</font> <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i+<a name="line-260"></a><a name="guards"></a><font color=Blue>-- | Interior editing:</font>+<a name="line-261"></a><font color=Blue>-- @g `guards` f@ applies @f@ only when the predicate @g@ succeeds,</font>+<a name="line-262"></a><font color=Blue>-- otherwise the content is discarded.</font>+<a name="line-263"></a><font color=Blue>guards</font> <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i <font color=Red>-></font> CFilter i+<a name="line-264"></a><a name="when"></a><font color=Blue>f</font> <font color=Cyan>`when`</font> g <font color=Red>=</font> g <font color=Cyan>?></font> f <font color=Red><b>:></b></font> keep+<a name="line-265"></a><a name="guards"></a><font color=Blue>g</font> <font color=Cyan>`guards`</font> f <font color=Red>=</font> g <font color=Cyan>?></font> f <font color=Red><b>:></b></font> none <font color=Blue>-- = f `o` (keep `with` g)</font>+<a name="line-266"></a>+<a name="line-267"></a><a name="chip"></a><font color=Blue>-- | Process CHildren In Place. The filter is applied to any children</font>+<a name="line-268"></a><font color=Blue>-- of an element content, and the element rebuilt around the results.</font>+<a name="line-269"></a><font color=Blue>chip</font> <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i+<a name="line-270"></a><font color=Blue>chip</font> f <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> i<font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font> CElem <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> <font color=Cyan>(</font>concatMap f cs<font color=Cyan>)</font><font color=Cyan>)</font> i <font color=Red>]</font>+<a name="line-271"></a><font color=Blue>chip</font> f c <font color=Red>=</font> <font color=Red>[</font>c<font color=Red>]</font>+<a name="line-272"></a><font color=Blue>-- chip f = inplace (f `o` children)</font>+<a name="line-273"></a>+<a name="line-274"></a><a name="inplace"></a><font color=Blue>-- | Process an element In Place. The filter is applied to the element</font>+<a name="line-275"></a><font color=Blue>-- itself, and then the original element rebuilt around the results.</font>+<a name="line-276"></a><font color=Blue>inplace</font> <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i+<a name="line-277"></a><font color=Blue>inplace</font> f c<font color=Red>@</font><font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem name <font color=Green><u>as</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> i<font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font> CElem <font color=Cyan>(</font>Elem name <font color=Green><u>as</u></font> <font color=Cyan>(</font>f c<font color=Cyan>)</font><font color=Cyan>)</font> i <font color=Red>]</font>+<a name="line-278"></a><font color=Blue>inplace</font> f c <font color=Red>=</font> <font color=Red>[</font>c<font color=Red>]</font>+<a name="line-279"></a>+<a name="line-280"></a>+<a name="line-281"></a><a name="foldXml"></a><font color=Blue>-- | Recursive application of filters: a fold-like operator. Defined</font>+<a name="line-282"></a><font color=Blue>-- as @f `o` chip (foldXml f)@.</font>+<a name="line-283"></a><font color=Blue>foldXml</font> <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i+<a name="line-284"></a><font color=Blue>foldXml</font> f <font color=Red>=</font> f <font color=Cyan>`o`</font> chip <font color=Cyan>(</font>foldXml f<font color=Cyan>)</font>+<a name="line-285"></a>+<a name="line-286"></a>+<a name="line-287"></a>+<a name="line-288"></a>+<a name="line-289"></a><font color=Blue>-- CONSTRUCTIVE CONTENT FILTERS</font>+<a name="line-290"></a>+<a name="line-291"></a><a name="mkElem"></a><font color=Blue>-- | Build an element with the given tag name - its content is the results</font>+<a name="line-292"></a><font color=Blue>-- of the given list of filters.</font>+<a name="line-293"></a><font color=Blue>mkElem</font> <font color=Red>::</font> String <font color=Red>-></font> <font color=Red>[</font>CFilter i<font color=Red>]</font> <font color=Red>-></font> CFilter i+<a name="line-294"></a><font color=Blue>mkElem</font> h cfs <font color=Red>=</font> <font color=Red>\</font>t<font color=Red>-></font> <font color=Red>[</font> CElem <font color=Cyan>(</font>Elem h [] <font color=Cyan>(</font>cat cfs t<font color=Cyan>)</font><font color=Cyan>)</font> undefined <font color=Red>]</font>+<a name="line-295"></a>+<a name="line-296"></a><a name="mkElemAttr"></a><font color=Blue>-- | Build an element with the given name, attributes, and content.</font>+<a name="line-297"></a><font color=Blue>mkElemAttr</font> <font color=Red>::</font> String <font color=Red>-></font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font>CFilter i<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>CFilter i<font color=Red>]</font> <font color=Red>-></font> CFilter i+<a name="line-298"></a><font color=Blue>mkElemAttr</font> h <font color=Green><u>as</u></font> cfs <font color=Red>=</font> <font color=Red>\</font>t<font color=Red>-></font> <font color=Red>[</font> CElem <font color=Cyan>(</font>Elem h <font color=Cyan>(</font>map <font color=Cyan>(</font>attr t<font color=Cyan>)</font> <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan>(</font>cat cfs t<font color=Cyan>)</font><font color=Cyan>)</font> undefined <font color=Red>]</font>+<a name="line-299"></a> <font color=Green><u>where</u></font> attr t <font color=Cyan>(</font>n<font color=Cyan>,</font>vf<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-300"></a> <font color=Green><u>let</u></font> v <font color=Red>=</font> concat <font color=Red>[</font> s <font color=Red>|</font> <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red><-</font> <font color=Cyan>(</font>deep txt <font color=Cyan>`o`</font> vf<font color=Cyan>)</font> t <font color=Red>]</font>+<a name="line-301"></a> <font color=Green><u>in</u></font> <font color=Cyan>(</font>n<font color=Cyan>,</font> AttValue <font color=Red>[</font>Left v<font color=Red>]</font><font color=Cyan>)</font>+<a name="line-302"></a>+<a name="line-303"></a><a name="literal"></a><font color=Blue>-- | Build some textual content.</font>+<a name="line-304"></a><font color=Blue>literal</font> <font color=Red>::</font> String <font color=Red>-></font> CFilter i+<a name="line-305"></a><font color=Blue>literal</font> s <font color=Red>=</font> const <font color=Red>[</font>CString False s undefined<font color=Red>]</font>+<a name="line-306"></a>+<a name="line-307"></a><a name="cdata"></a><font color=Blue>-- | Build some CDATA content.</font>+<a name="line-308"></a><font color=Blue>cdata</font> <font color=Red>::</font> String <font color=Red>-></font> CFilter i+<a name="line-309"></a><font color=Blue>cdata</font> s <font color=Red>=</font> const <font color=Red>[</font>CString True s undefined<font color=Red>]</font>+<a name="line-310"></a>+<a name="line-311"></a><a name="replaceTag"></a><font color=Blue>-- | Rename an element tag (leaving attributes in place).</font>+<a name="line-312"></a><font color=Blue>replaceTag</font> <font color=Red>::</font> String <font color=Red>-></font> CFilter i+<a name="line-313"></a><font color=Blue>replaceTag</font> n <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> i<font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>CElem <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> i<font color=Red>]</font>+<a name="line-314"></a><font color=Blue>replaceTag</font> n <font color=Green><u>_</u></font> <font color=Red>=</font> []+<a name="line-315"></a>+<a name="line-316"></a><a name="replaceAttrs"></a><font color=Blue>-- | Replace the attributes of an element (leaving tag the same).</font>+<a name="line-317"></a><font color=Blue>replaceAttrs</font> <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> CFilter i+<a name="line-318"></a><font color=Blue>replaceAttrs</font> <font color=Green><u>as</u></font> <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem n <font color=Green><u>_</u></font> cs<font color=Cyan>)</font> i<font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>CElem <font color=Cyan>(</font>Elem n as' cs<font color=Cyan>)</font> i<font color=Red>]</font>+<a name="line-319"></a> <font color=Green><u>where</u></font> as' <font color=Red>=</font> map <font color=Cyan>(</font><font color=Red>\</font><font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Cyan>)</font><font color=Red>-></font> <font color=Cyan>(</font>n<font color=Cyan>,</font> AttValue <font color=Red>[</font>Left v<font color=Red>]</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Green><u>as</u></font>+<a name="line-320"></a><font color=Blue>replaceAttrs</font> <font color=Green><u>as</u></font> <font color=Green><u>_</u></font> <font color=Red>=</font> []+<a name="line-321"></a>+<a name="line-322"></a>+<a name="line-323"></a>+<a name="line-324"></a><font color=Blue>-- LABELLING</font>+<a name="line-325"></a>+<a name="line-326"></a><a name="LabelFilter"></a><font color=Blue>-- | A LabelFilter is like a CFilter except that it pairs up a polymorphic</font>+<a name="line-327"></a><a name="LabelFilter"></a><font color=Blue>-- value (label) with each of its results.</font>+<a name="line-328"></a><a name="LabelFilter"></a><font color=Green><u>type</u></font> LabelFilter i a <font color=Red>=</font> Content i <font color=Red>-></font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font>Content i<font color=Cyan>)</font><font color=Red>]</font>+<a name="line-329"></a>+<a name="line-330"></a><a name="oo"></a><font color=Blue>-- | Compose a label-processing filter with a label-generating filter.</font>+<a name="line-331"></a><font color=Blue>oo</font> <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font>CFilter i<font color=Cyan>)</font> <font color=Red>-></font> LabelFilter i a <font color=Red>-></font> CFilter i+<a name="line-332"></a><a name="oo"></a><font color=Blue>f</font> <font color=Cyan>`oo`</font> g <font color=Red>=</font> concatMap <font color=Cyan>(</font>uncurry f<font color=Cyan>)</font> <font color=Cyan>.</font> g+<a name="line-333"></a>+<a name="line-334"></a><font color=Blue>{-+<a name="line-335"></a>-- | Process the information labels (very nearly monadic bind).+<a name="line-336"></a>oo :: (b -> CFilter b c) -> CFilter a b -> CFilter a c+<a name="line-337"></a>f `oo` g = concatMap info . g+<a name="line-338"></a> where info c@(CElem _ i) = f i c+<a name="line-339"></a> info c@(CString _ _ i) = f i c+<a name="line-340"></a> info c@(CRef _ i) = f i c+<a name="line-341"></a> info c = [c]+<a name="line-342"></a>-}</font>+<a name="line-343"></a>+<a name="line-344"></a><a name="x"></a><font color=Blue>-- | Combine labels. Think of this as a pair-wise zip on labels.</font>+<a name="line-345"></a><font color=Blue>-- e.g. @(numbered `x` tagged)@</font>+<a name="line-346"></a><font color=Blue>x</font> <font color=Red>::</font> <font color=Cyan>(</font>CFilter i<font color=Red>-></font>LabelFilter i a<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>CFilter i<font color=Red>-></font>LabelFilter i b<font color=Cyan>)</font> <font color=Red>-></font>+<a name="line-347"></a> <font color=Cyan>(</font>CFilter i<font color=Red>-></font>LabelFilter i <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-348"></a><a name="x"></a><font color=Blue>f</font> <font color=Cyan>`x`</font> g <font color=Red>=</font> <font color=Red>\</font>cf c<font color=Red>-></font> <font color=Green><u>let</u></font> gs <font color=Red>=</font> map fst <font color=Cyan>(</font>g cf c<font color=Cyan>)</font>+<a name="line-349"></a> fs <font color=Red>=</font> map fst <font color=Cyan>(</font>f cf c<font color=Cyan>)</font>+<a name="line-350"></a> <font color=Green><u>in</u></font> zip <font color=Cyan>(</font>zip fs gs<font color=Cyan>)</font> <font color=Cyan>(</font>cf c<font color=Cyan>)</font>+<a name="line-351"></a>+<a name="line-352"></a>+<a name="line-353"></a><font color=Blue>-- Some basic label-generating filters.</font>+<a name="line-354"></a>+<a name="line-355"></a><a name="numbered"></a><font color=Blue>-- | Number the results from 1 upwards.</font>+<a name="line-356"></a><font color=Blue>numbered</font> <font color=Red>::</font> CFilter i <font color=Red>-></font> LabelFilter i Int+<a name="line-357"></a><font color=Blue>numbered</font> f <font color=Red>=</font> zip <font color=Red>[</font><font color=Magenta>1</font><font color=Red>..</font><font color=Red>]</font> <font color=Cyan>.</font> f+<a name="line-358"></a>+<a name="line-359"></a><a name="interspersed"></a><font color=Blue>-- | In @interspersed a f b@, label each result of @f@ with the string @a@,</font>+<a name="line-360"></a><font color=Blue>-- except for the last one which is labelled with the string @b@.</font>+<a name="line-361"></a><font color=Blue>interspersed</font> <font color=Red>::</font> String <font color=Red>-></font> CFilter i <font color=Red>-></font> String <font color=Red>-></font> LabelFilter i String+<a name="line-362"></a><font color=Blue>interspersed</font> a f b <font color=Red>=</font>+<a name="line-363"></a> <font color=Cyan>(</font><font color=Red>\</font>xs<font color=Red>-></font> zip <font color=Cyan>(</font>replicate <font color=Cyan>(</font>len xs<font color=Cyan>)</font> a <font color=Cyan>++</font> <font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>)</font> xs<font color=Cyan>)</font> <font color=Cyan>.</font> f+<a name="line-364"></a> <font color=Green><u>where</u></font>+<a name="line-365"></a> len [] <font color=Red>=</font> <font color=Magenta>0</font>+<a name="line-366"></a> len xs <font color=Red>=</font> length xs <font color=Blue>-</font> <font color=Magenta>1</font>+<a name="line-367"></a>+<a name="line-368"></a><a name="tagged"></a><font color=Blue>-- | Label each element in the result with its tag name. Non-element</font>+<a name="line-369"></a><font color=Blue>-- results get an empty string label.</font>+<a name="line-370"></a><font color=Blue>tagged</font> <font color=Red>::</font> CFilter i <font color=Red>-></font> LabelFilter i String+<a name="line-371"></a><font color=Blue>tagged</font> f <font color=Red>=</font> extracted name f+<a name="line-372"></a> <font color=Green><u>where</u></font> name <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem n <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> n+<a name="line-373"></a> name <font color=Green><u>_</u></font> <font color=Red>=</font> <font color=Magenta>""</font>+<a name="line-374"></a>+<a name="line-375"></a><a name="attributed"></a><font color=Blue>-- | Label each element in the result with the value of the named attribute.</font>+<a name="line-376"></a><font color=Blue>-- Elements without the attribute, and non-element results, get an</font>+<a name="line-377"></a><font color=Blue>-- empty string label.</font>+<a name="line-378"></a><font color=Blue>attributed</font> <font color=Red>::</font> String <font color=Red>-></font> CFilter i <font color=Red>-></font> LabelFilter i String+<a name="line-379"></a><font color=Blue>attributed</font> key f <font color=Red>=</font> extracted att f+<a name="line-380"></a> <font color=Green><u>where</u></font> att <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>as</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-381"></a> <font color=Green><u>case</u></font> <font color=Cyan>(</font>lookup key <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Green><u>of</u></font>+<a name="line-382"></a> Nothing <font color=Red>-></font> <font color=Magenta>""</font>+<a name="line-383"></a> <font color=Cyan>(</font>Just v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> show v+<a name="line-384"></a> att <font color=Green><u>_</u></font> <font color=Red>=</font> <font color=Magenta>""</font>+<a name="line-385"></a>+<a name="line-386"></a><a name="textlabelled"></a><font color=Blue>-- | Label each textual part of the result with its text. Element</font>+<a name="line-387"></a><font color=Blue>-- results get an empty string label.</font>+<a name="line-388"></a><font color=Blue>textlabelled</font> <font color=Red>::</font> CFilter i <font color=Red>-></font> LabelFilter i <font color=Cyan>(</font>Maybe String<font color=Cyan>)</font>+<a name="line-389"></a><font color=Blue>textlabelled</font> f <font color=Red>=</font> extracted text f+<a name="line-390"></a> <font color=Green><u>where</u></font> text <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> Just s+<a name="line-391"></a> text <font color=Green><u>_</u></font> <font color=Red>=</font> Nothing+<a name="line-392"></a>+<a name="line-393"></a><a name="extracted"></a><font color=Blue>-- | Label each content with some information extracted from itself.</font>+<a name="line-394"></a><font color=Blue>extracted</font> <font color=Red>::</font> <font color=Cyan>(</font>Content i<font color=Red>-></font>a<font color=Cyan>)</font> <font color=Red>-></font> CFilter i <font color=Red>-></font> LabelFilter i a+<a name="line-395"></a><font color=Blue>extracted</font> proj f <font color=Red>=</font> concatMap <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font><font color=Red>[</font><font color=Cyan>(</font>proj c<font color=Cyan>,</font> c<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font> <font color=Cyan>.</font> f+<a name="line-396"></a> +<a name="line-397"></a>+<a name="line-398"></a>+<a name="line-399"></a><font color=Blue>{-+<a name="line-400"></a>-- MISC+<a name="line-401"></a>+<a name="line-402"></a>-- | I haven't yet remembered \/ worked out what this does.+<a name="line-403"></a>combine :: (Read a,Show a) => ([a]->a) -> LabelFilter String -> CFilter+<a name="line-404"></a>combine f lf = \c-> [ CString False (show (f [ read l | (l,_) <- lf c ])) ]+<a name="line-405"></a>-}</font>+<a name="line-406"></a>+<a name="line-407"></a>+<a name="line-408"></a><font color=Blue>{- OLD STUFF - OBSOLETE+<a name="line-409"></a>-- Keep an element by its numbered position (starting at 1).+<a name="line-410"></a>position :: Int -> [Content] -> [Content]+<a name="line-411"></a>position n | n>0 = (:[]) . (!!(n-1))+<a name="line-412"></a> | otherwise = const []+<a name="line-413"></a>+<a name="line-414"></a>-- Chop and remove the root portions of trees to depth n.+<a name="line-415"></a>layer :: Int -> [Content] -> [Content]+<a name="line-416"></a>layer n = apply n (concatMap lay)+<a name="line-417"></a> where lay (CElem (Elem _ _ cs)) = cs+<a name="line-418"></a> lay _ = []+<a name="line-419"></a> apply 0 f xs = xs+<a name="line-420"></a> apply n f xs = apply (n-1) f (f xs)+<a name="line-421"></a>+<a name="line-422"></a>combine :: (Read a, Show a) => ([a]->a) -> [Content] -> [Content]+<a name="line-423"></a>combine f = \cs-> [ CString False (show (f [ read s | CString _ s <- cs ])) ]+<a name="line-424"></a>-}</font> </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/DtdToHaskell/Convert.html view
@@ -1,131 +1,137 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>-- | This module performs the translation of a parsed XML DTD into the</font>-<a name="(line2)"></a><font color=Blue>-- internal representation of corresponding Haskell data\/newtypes.</font>-<a name="(line3)"></a>-<a name="(line4)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>DtdToHaskell<font color=Cyan>.</font>Convert-<a name="(line5)"></a> <font color=Cyan>(</font> dtd2TypeDef-<a name="(line6)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line7)"></a>-<a name="(line8)"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>intersperse<font color=Cyan>)</font>-<a name="(line9)"></a>-<a name="(line10)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types hiding <font color=Cyan>(</font>Name<font color=Cyan>)</font>-<a name="(line11)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>DtdToHaskell<font color=Cyan>.</font>TypeDef-<a name="(line12)"></a>-<a name="(line13)"></a>-<a name="(line14)"></a><a name="Record"></a><font color=Blue>---- Internal representation for database of DTD decls ----</font>-<a name="(line15)"></a><a name="Record"></a><font color=Green><u>data</u></font> Record <font color=Red>=</font> R <font color=Red>[</font>AttDef<font color=Red>]</font> ContentSpec-<a name="(line16)"></a><font color=Blue>-- type Db = [(String,Record)]</font>-<a name="(line17)"></a>-<a name="(line18)"></a>-<a name="(line19)"></a><a name="dtd2TypeDef"></a><font color=Blue>---- Build a database of DTD decls then convert them to typedefs ----</font>-<a name="(line20)"></a><font color=Blue>---- (Done in two steps because we need to merge ELEMENT and ATTLIST decls.)</font>-<a name="(line21)"></a><font color=Blue>---- Apparently multiple ATTLIST decls for the same element are permitted,</font>-<a name="(line22)"></a><font color=Blue>---- although only one ELEMENT decl for it is allowed.</font>-<a name="(line23)"></a>dtd2TypeDef <font color=Red>::</font> <font color=Red>[</font>MarkupDecl<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>TypeDef<font color=Red>]</font>-<a name="(line24)"></a>dtd2TypeDef mds <font color=Red>=</font>-<a name="(line25)"></a> <font color=Cyan>(</font>concatMap convert <font color=Cyan>.</font> reverse <font color=Cyan>.</font> database []<font color=Cyan>)</font> mds-<a name="(line26)"></a> <font color=Green><u>where</u></font>-<a name="(line27)"></a> database db [] <font color=Red>=</font> db-<a name="(line28)"></a> database db <font color=Cyan>(</font>m<font color=Red><b>:</b></font>ms<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line29)"></a> <font color=Green><u>case</u></font> m <font color=Green><u>of</u></font>-<a name="(line30)"></a> <font color=Cyan>(</font>Element <font color=Cyan>(</font>ElementDecl n cs<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font>-<a name="(line31)"></a> <font color=Green><u>case</u></font> lookup n db <font color=Green><u>of</u></font>-<a name="(line32)"></a> Nothing <font color=Red>-></font> database <font color=Cyan>(</font><font color=Cyan>(</font>n<font color=Cyan>,</font> R [] cs<font color=Cyan>)</font><font color=Red><b>:</b></font>db<font color=Cyan>)</font> ms-<a name="(line33)"></a> <font color=Cyan>(</font>Just <font color=Cyan>(</font>R <font color=Green><u>as</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> database <font color=Cyan>(</font>replace n <font color=Cyan>(</font>R <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> db<font color=Cyan>)</font> ms-<a name="(line34)"></a> <font color=Cyan>(</font>AttList <font color=Cyan>(</font>AttListDecl n <font color=Green><u>as</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font>-<a name="(line35)"></a> <font color=Green><u>case</u></font> lookup n db <font color=Green><u>of</u></font>-<a name="(line36)"></a> Nothing <font color=Red>-></font> database <font color=Cyan>(</font><font color=Cyan>(</font>n<font color=Cyan>,</font> R <font color=Green><u>as</u></font> EMPTY<font color=Cyan>)</font><font color=Red><b>:</b></font>db<font color=Cyan>)</font> ms-<a name="(line37)"></a> <font color=Cyan>(</font>Just <font color=Cyan>(</font>R a cs<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> database <font color=Cyan>(</font>replace n <font color=Cyan>(</font>R <font color=Cyan>(</font>a<font color=Cyan>++</font><font color=Green><u>as</u></font><font color=Cyan>)</font> cs<font color=Cyan>)</font> db<font color=Cyan>)</font> ms-<a name="(line38)"></a> <font color=Blue>-- (MarkupPE _ m') -> database db (m':ms)</font>-<a name="(line39)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> database db ms-<a name="(line40)"></a>-<a name="(line41)"></a> replace <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> [] <font color=Red>=</font> error <font color=Magenta>"dtd2TypeDef.replace: no element to replace"</font>-<a name="(line42)"></a> replace n v <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>n0<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Red><b>:</b></font>db<font color=Cyan>)</font>-<a name="(line43)"></a> <font color=Red>|</font> n<font color=Cyan>==</font>n0 <font color=Red>=</font> <font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Cyan>)</font><font color=Red><b>:</b></font> db-<a name="(line44)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> x<font color=Red><b>:</b></font> replace n v db-<a name="(line45)"></a>-<a name="(line46)"></a>-<a name="(line47)"></a>-<a name="(line48)"></a><a name="convert"></a><font color=Blue>---- Convert DTD record to typedef ----</font>-<a name="(line49)"></a>convert <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Cyan>,</font> Record<font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>TypeDef<font color=Red>]</font>-<a name="(line50)"></a>convert <font color=Cyan>(</font>n<font color=Cyan>,</font> R <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line51)"></a> <font color=Green><u>case</u></font> cs <font color=Green><u>of</u></font>-<a name="(line52)"></a> EMPTY <font color=Red>-></font> modifier None []-<a name="(line53)"></a> ANY <font color=Red>-></font> modifier None <font color=Red>[</font><font color=Red>[</font>Any<font color=Red>]</font><font color=Red>]</font>-<a name="(line54)"></a> <font color=Blue>--error "NYI: contentspec of ANY"</font>-<a name="(line55)"></a> <font color=Cyan>(</font>Mixed PCDATA<font color=Cyan>)</font> <font color=Red>-></font> modifier None <font color=Red>[</font><font color=Red>[</font>String<font color=Red>]</font><font color=Red>]</font>-<a name="(line56)"></a> <font color=Cyan>(</font>Mixed <font color=Cyan>(</font>PCDATAplus ns<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> modifier Star <font color=Cyan>(</font><font color=Red>[</font>String<font color=Red>]</font><font color=Red><b>:</b></font> map <font color=Cyan>(</font><font color=Cyan>(</font><font color=Red><b>:</b></font>[]<font color=Cyan>)</font> <font color=Cyan>.</font> Defined <font color=Cyan>.</font> name<font color=Cyan>)</font> ns<font color=Cyan>)</font>-<a name="(line57)"></a> <font color=Cyan>(</font>ContentSpec cp<font color=Cyan>)</font> <font color=Red>-></font>-<a name="(line58)"></a> <font color=Green><u>case</u></font> cp <font color=Green><u>of</u></font>-<a name="(line59)"></a> <font color=Cyan>(</font>TagName n' m<font color=Cyan>)</font> <font color=Red>-></font> modifier m <font color=Red>[</font><font color=Red>[</font>Defined <font color=Cyan>(</font>name n'<font color=Cyan>)</font><font color=Red>]</font><font color=Red>]</font>-<a name="(line60)"></a> <font color=Cyan>(</font>Choice cps m<font color=Cyan>)</font> <font color=Red>-></font> modifier m <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Cyan>(</font><font color=Red><b>:</b></font>[]<font color=Cyan>)</font><font color=Cyan>.</font>inner<font color=Cyan>)</font> cps<font color=Cyan>)</font>-<a name="(line61)"></a> <font color=Cyan>(</font>Seq cps m<font color=Cyan>)</font> <font color=Red>-></font> modifier m <font color=Red>[</font>map inner cps<font color=Red>]</font>-<a name="(line62)"></a> <font color=Cyan>++</font> concatMap <font color=Cyan>(</font>mkAttrDef n<font color=Cyan>)</font> <font color=Green><u>as</u></font>-<a name="(line63)"></a> <font color=Green><u>where</u></font>-<a name="(line64)"></a> attrs <font color=Red>::</font> AttrFields-<a name="(line65)"></a> attrs <font color=Red>=</font> map <font color=Cyan>(</font>mkAttrField n<font color=Cyan>)</font> <font color=Green><u>as</u></font>-<a name="(line66)"></a>-<a name="(line67)"></a> modifier None sts <font color=Red>=</font> mkData sts attrs False <font color=Cyan>(</font>name n<font color=Cyan>)</font>-<a name="(line68)"></a> modifier m <font color=Red>[</font><font color=Red>[</font>st<font color=Red>]</font><font color=Red>]</font> <font color=Red>=</font> mkData <font color=Red>[</font><font color=Red>[</font>modf m st<font color=Red>]</font><font color=Red>]</font> attrs False <font color=Cyan>(</font>name n<font color=Cyan>)</font>-<a name="(line69)"></a> modifier m sts <font color=Red>=</font> mkData <font color=Red>[</font><font color=Red>[</font>modf m <font color=Cyan>(</font>Defined <font color=Cyan>(</font>name_ n<font color=Cyan>)</font><font color=Cyan>)</font><font color=Red>]</font><font color=Red>]</font>-<a name="(line70)"></a> attrs False <font color=Cyan>(</font>name n<font color=Cyan>)</font> <font color=Cyan>++</font>-<a name="(line71)"></a> mkData sts [] True <font color=Cyan>(</font>name_ n<font color=Cyan>)</font>-<a name="(line72)"></a>-<a name="(line73)"></a> inner <font color=Red>::</font> CP <font color=Red>-></font> StructType-<a name="(line74)"></a> inner <font color=Cyan>(</font>TagName n' m<font color=Cyan>)</font> <font color=Red>=</font> modf m <font color=Cyan>(</font>Defined <font color=Cyan>(</font>name n'<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line75)"></a> inner <font color=Cyan>(</font>Choice cps m<font color=Cyan>)</font> <font color=Red>=</font> modf m <font color=Cyan>(</font>OneOf <font color=Cyan>(</font>map inner cps<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line76)"></a> inner <font color=Cyan>(</font>Seq cps None<font color=Cyan>)</font> <font color=Red>=</font> Tuple <font color=Cyan>(</font>map inner cps<font color=Cyan>)</font>-<a name="(line77)"></a> inner <font color=Cyan>(</font>Seq cps m<font color=Cyan>)</font> <font color=Red>=</font> modf m <font color=Cyan>(</font>Tuple <font color=Cyan>(</font>map inner cps<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line78)"></a>-<a name="(line79)"></a> modf None x <font color=Red>=</font> x-<a name="(line80)"></a> modf Query x <font color=Red>=</font> Maybe x-<a name="(line81)"></a> modf Star x <font color=Red>=</font> List x-<a name="(line82)"></a> modf Plus x <font color=Red>=</font> List1 x-<a name="(line83)"></a>-<a name="(line84)"></a><a name="mkData"></a>mkData <font color=Red>::</font> <font color=Red>[</font><font color=Red>[</font>StructType<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> AttrFields <font color=Red>-></font> Bool <font color=Red>-></font> Name <font color=Red>-></font> <font color=Red>[</font>TypeDef<font color=Red>]</font>-<a name="(line85)"></a>mkData [] fs aux n <font color=Red>=</font> <font color=Red>[</font>DataDef aux n fs []<font color=Red>]</font>-<a name="(line86)"></a>mkData <font color=Red>[</font>ts<font color=Red>]</font> fs aux n <font color=Red>=</font> <font color=Red>[</font>DataDef aux n fs <font color=Red>[</font><font color=Cyan>(</font>n<font color=Cyan>,</font> ts<font color=Cyan>)</font><font color=Red>]</font><font color=Red>]</font>-<a name="(line87)"></a>mkData tss fs aux n <font color=Red>=</font> <font color=Red>[</font>DataDef aux n fs <font color=Cyan>(</font>map <font color=Cyan>(</font>mkConstr n<font color=Cyan>)</font> tss<font color=Cyan>)</font><font color=Red>]</font>-<a name="(line88)"></a> <font color=Green><u>where</u></font>-<a name="(line89)"></a> mkConstr m ts <font color=Red>=</font> <font color=Cyan>(</font>mkConsName m ts<font color=Cyan>,</font> ts<font color=Cyan>)</font>-<a name="(line90)"></a> mkConsName <font color=Cyan>(</font>Name x m<font color=Cyan>)</font> sts <font color=Red>=</font> Name x <font color=Cyan>(</font>m<font color=Cyan>++</font>concat <font color=Cyan>(</font>intersperse <font color=Magenta>"_"</font> <font color=Cyan>(</font>map flatten sts<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line91)"></a> flatten <font color=Cyan>(</font>Maybe st<font color=Cyan>)</font> <font color=Red>=</font> <font color=Blue>{-"Maybe_" ++ -}</font> flatten st-<a name="(line92)"></a> flatten <font color=Cyan>(</font>List st<font color=Cyan>)</font> <font color=Red>=</font> <font color=Blue>{-"List_" ++ -}</font> flatten st-<a name="(line93)"></a> flatten <font color=Cyan>(</font>List1 st<font color=Cyan>)</font> <font color=Red>=</font> <font color=Blue>{-"List1_" ++ -}</font> flatten st-<a name="(line94)"></a> flatten <font color=Cyan>(</font>Tuple sts<font color=Cyan>)</font> <font color=Red>=</font> <font color=Blue>{-"Tuple" ++ show (length sts) ++ "_" ++ -}</font>-<a name="(line95)"></a> concat <font color=Cyan>(</font>intersperse <font color=Magenta>"_"</font> <font color=Cyan>(</font>map flatten sts<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line96)"></a> flatten String <font color=Red>=</font> <font color=Magenta>"Str"</font>-<a name="(line97)"></a> flatten <font color=Cyan>(</font>OneOf sts<font color=Cyan>)</font> <font color=Red>=</font> <font color=Blue>{-"OneOf" ++ show (length sts) ++ "_" ++ -}</font>-<a name="(line98)"></a> concat <font color=Cyan>(</font>intersperse <font color=Magenta>"_"</font> <font color=Cyan>(</font>map flatten sts<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line99)"></a> flatten Any <font color=Red>=</font> <font color=Magenta>"Any"</font>-<a name="(line100)"></a> flatten <font color=Cyan>(</font>Defined <font color=Cyan>(</font>Name <font color=Green><u>_</u></font> m<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> m-<a name="(line101)"></a>-<a name="(line102)"></a><a name="mkAttrDef"></a>mkAttrDef <font color=Red>::</font> String <font color=Red>-></font> AttDef <font color=Red>-></font> <font color=Red>[</font>TypeDef<font color=Red>]</font>-<a name="(line103)"></a>mkAttrDef <font color=Green><u>_</u></font> <font color=Cyan>(</font>AttDef <font color=Green><u>_</u></font> StringType <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line104)"></a> []-<a name="(line105)"></a>mkAttrDef <font color=Green><u>_</u></font> <font color=Cyan>(</font>AttDef <font color=Green><u>_</u></font> <font color=Cyan>(</font>TokenizedType <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line106)"></a> [] <font color=Blue>-- mkData [[String]] [] False (name n)</font>-<a name="(line107)"></a>mkAttrDef e <font color=Cyan>(</font>AttDef n <font color=Cyan>(</font>EnumeratedType <font color=Cyan>(</font>NotationType nt<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line108)"></a> <font color=Red>[</font>EnumDef <font color=Cyan>(</font>name_a e n<font color=Cyan>)</font> <font color=Cyan>(</font>map <font color=Cyan>(</font>name_ac e n<font color=Cyan>)</font> nt<font color=Cyan>)</font><font color=Red>]</font>-<a name="(line109)"></a>mkAttrDef e <font color=Cyan>(</font>AttDef n <font color=Cyan>(</font>EnumeratedType <font color=Cyan>(</font>Enumeration es<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line110)"></a> <font color=Red>[</font>EnumDef <font color=Cyan>(</font>name_a e n<font color=Cyan>)</font> <font color=Cyan>(</font>map <font color=Cyan>(</font>name_ac e n<font color=Cyan>)</font> es<font color=Cyan>)</font><font color=Red>]</font>-<a name="(line111)"></a> <font color=Blue>-- Default attribute values not handled here</font>-<a name="(line112)"></a>-<a name="(line113)"></a><a name="mkAttrField"></a>mkAttrField <font color=Red>::</font> String <font color=Red>-></font> AttDef <font color=Red>-></font> <font color=Cyan>(</font>Name<font color=Cyan>,</font>StructType<font color=Cyan>)</font>-<a name="(line114)"></a>mkAttrField e <font color=Cyan>(</font>AttDef n typ req<font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>name_f e n<font color=Cyan>,</font> mkType typ req<font color=Cyan>)</font>-<a name="(line115)"></a> <font color=Green><u>where</u></font>-<a name="(line116)"></a> mkType StringType REQUIRED <font color=Red>=</font> String-<a name="(line117)"></a> mkType StringType IMPLIED <font color=Red>=</font> Maybe String-<a name="(line118)"></a> mkType StringType <font color=Cyan>(</font>DefaultTo v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> Defaultable String <font color=Cyan>(</font>show v<font color=Cyan>)</font>-<a name="(line119)"></a> mkType <font color=Cyan>(</font>TokenizedType <font color=Green><u>_</u></font><font color=Cyan>)</font> REQUIRED <font color=Red>=</font> String-<a name="(line120)"></a> mkType <font color=Cyan>(</font>TokenizedType <font color=Green><u>_</u></font><font color=Cyan>)</font> IMPLIED <font color=Red>=</font> Maybe String-<a name="(line121)"></a> mkType <font color=Cyan>(</font>TokenizedType <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>(</font>DefaultTo v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line122)"></a> Defaultable String <font color=Cyan>(</font>show v<font color=Cyan>)</font>-<a name="(line123)"></a> mkType <font color=Cyan>(</font>EnumeratedType <font color=Green><u>_</u></font><font color=Cyan>)</font> REQUIRED <font color=Red>=</font> Defined <font color=Cyan>(</font>name_a e n<font color=Cyan>)</font>-<a name="(line124)"></a> mkType <font color=Cyan>(</font>EnumeratedType <font color=Green><u>_</u></font><font color=Cyan>)</font> IMPLIED <font color=Red>=</font> Maybe <font color=Cyan>(</font>Defined <font color=Cyan>(</font>name_a e n<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line125)"></a> mkType <font color=Cyan>(</font>EnumeratedType <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>(</font>DefaultTo v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line126)"></a> Defaultable <font color=Cyan>(</font>Defined <font color=Cyan>(</font>name_a e n<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>hName <font color=Cyan>(</font>name_ac e n <font color=Cyan>(</font>show v<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line127)"></a>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/DtdToHaskell/Convert.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>-- | This module performs the translation of a parsed XML DTD into the</font>+<a name="line-2"></a><font color=Blue>-- internal representation of corresponding Haskell data\/newtypes.</font>+<a name="line-3"></a>+<a name="line-4"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>DtdToHaskell<font color=Cyan>.</font>Convert+<a name="line-5"></a> <font color=Cyan>(</font> dtd2TypeDef+<a name="line-6"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-7"></a>+<a name="line-8"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>intersperse<font color=Cyan>,</font>nub<font color=Cyan>)</font>+<a name="line-9"></a>+<a name="line-10"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types hiding <font color=Cyan>(</font>Name<font color=Cyan>)</font>+<a name="line-11"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>DtdToHaskell<font color=Cyan>.</font>TypeDef+<a name="line-12"></a>+<a name="line-13"></a>+<a name="line-14"></a><a name="Record"></a><font color=Blue>---- Internal representation for database of DTD decls ----</font>+<a name="line-15"></a><a name="Record"></a><font color=Green><u>data</u></font> Record <font color=Red>=</font> R <font color=Red>[</font>AttDef<font color=Red>]</font> ContentSpec+<a name="line-16"></a><font color=Blue>-- type Db = [(String,Record)]</font>+<a name="line-17"></a>+<a name="line-18"></a>+<a name="line-19"></a><a name="dtd2TypeDef"></a><font color=Blue>---- Build a database of DTD decls then convert them to typedefs ----</font>+<a name="line-20"></a><font color=Blue>---- (Done in two steps because we need to merge ELEMENT and ATTLIST decls.)</font>+<a name="line-21"></a><font color=Blue>---- Apparently multiple ATTLIST decls for the same element are permitted,</font>+<a name="line-22"></a><font color=Blue>---- although only one ELEMENT decl for it is allowed.</font>+<a name="line-23"></a><font color=Blue>dtd2TypeDef</font> <font color=Red>::</font> <font color=Red>[</font>MarkupDecl<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>TypeDef<font color=Red>]</font>+<a name="line-24"></a><font color=Blue>dtd2TypeDef</font> mds <font color=Red>=</font>+<a name="line-25"></a> <font color=Cyan>(</font>concatMap convert <font color=Cyan>.</font> reverse <font color=Cyan>.</font> database []<font color=Cyan>)</font> mds+<a name="line-26"></a> <font color=Green><u>where</u></font>+<a name="line-27"></a> database db [] <font color=Red>=</font> db+<a name="line-28"></a> database db <font color=Cyan>(</font>m<font color=Red><b>:</b></font>ms<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-29"></a> <font color=Green><u>case</u></font> m <font color=Green><u>of</u></font>+<a name="line-30"></a> <font color=Cyan>(</font>Element <font color=Cyan>(</font>ElementDecl n cs<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font>+<a name="line-31"></a> <font color=Green><u>case</u></font> lookup n db <font color=Green><u>of</u></font>+<a name="line-32"></a> Nothing <font color=Red>-></font> database <font color=Cyan>(</font><font color=Cyan>(</font>n<font color=Cyan>,</font> R [] cs<font color=Cyan>)</font><font color=Red><b>:</b></font>db<font color=Cyan>)</font> ms+<a name="line-33"></a> <font color=Cyan>(</font>Just <font color=Cyan>(</font>R <font color=Green><u>as</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> database <font color=Cyan>(</font>replace n <font color=Cyan>(</font>R <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> db<font color=Cyan>)</font> ms+<a name="line-34"></a> <font color=Cyan>(</font>AttList <font color=Cyan>(</font>AttListDecl n <font color=Green><u>as</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font>+<a name="line-35"></a> <font color=Green><u>case</u></font> lookup n db <font color=Green><u>of</u></font>+<a name="line-36"></a> Nothing <font color=Red>-></font> database <font color=Cyan>(</font><font color=Cyan>(</font>n<font color=Cyan>,</font> R <font color=Green><u>as</u></font> EMPTY<font color=Cyan>)</font><font color=Red><b>:</b></font>db<font color=Cyan>)</font> ms+<a name="line-37"></a> <font color=Cyan>(</font>Just <font color=Cyan>(</font>R a cs<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> database <font color=Cyan>(</font>replace n <font color=Cyan>(</font>R <font color=Cyan>(</font>nub <font color=Cyan>(</font>a<font color=Cyan>++</font><font color=Green><u>as</u></font><font color=Cyan>)</font><font color=Cyan>)</font> cs<font color=Cyan>)</font> db<font color=Cyan>)</font> ms+<a name="line-38"></a> <font color=Blue>-- (MarkupPE _ m') -> database db (m':ms)</font>+<a name="line-39"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> database db ms+<a name="line-40"></a>+<a name="line-41"></a> replace <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> [] <font color=Red>=</font> error <font color=Magenta>"dtd2TypeDef.replace: no element to replace"</font>+<a name="line-42"></a> replace n v <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>n0<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Red><b>:</b></font>db<font color=Cyan>)</font>+<a name="line-43"></a> <font color=Red>|</font> n<font color=Cyan>==</font>n0 <font color=Red>=</font> <font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Cyan>)</font><font color=Red><b>:</b></font> db+<a name="line-44"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> x<font color=Red><b>:</b></font> replace n v db+<a name="line-45"></a>+<a name="line-46"></a>+<a name="line-47"></a>+<a name="line-48"></a><a name="convert"></a><font color=Blue>---- Convert DTD record to typedef ----</font>+<a name="line-49"></a><font color=Blue>convert</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Cyan>,</font> Record<font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>TypeDef<font color=Red>]</font>+<a name="line-50"></a><font color=Blue>convert</font> <font color=Cyan>(</font>n<font color=Cyan>,</font> R <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-51"></a> <font color=Green><u>case</u></font> cs <font color=Green><u>of</u></font>+<a name="line-52"></a> EMPTY <font color=Red>-></font> modifier None []+<a name="line-53"></a> ANY <font color=Red>-></font> modifier None <font color=Red>[</font><font color=Red>[</font>Any<font color=Red>]</font><font color=Red>]</font>+<a name="line-54"></a> <font color=Blue>--error "NYI: contentspec of ANY"</font>+<a name="line-55"></a> <font color=Cyan>(</font>Mixed PCDATA<font color=Cyan>)</font> <font color=Red>-></font> modifier None <font color=Red>[</font><font color=Red>[</font>String<font color=Red>]</font><font color=Red>]</font>+<a name="line-56"></a> <font color=Cyan>(</font>Mixed <font color=Cyan>(</font>PCDATAplus ns<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> modifier Star <font color=Cyan>(</font><font color=Red>[</font>String<font color=Red>]</font><font color=Red><b>:</b></font> map <font color=Cyan>(</font><font color=Cyan>(</font><font color=Red><b>:</b></font>[]<font color=Cyan>)</font> <font color=Cyan>.</font> Defined <font color=Cyan>.</font> name<font color=Cyan>)</font> ns<font color=Cyan>)</font>+<a name="line-57"></a> <font color=Cyan>(</font>ContentSpec cp<font color=Cyan>)</font> <font color=Red>-></font>+<a name="line-58"></a> <font color=Green><u>case</u></font> cp <font color=Green><u>of</u></font>+<a name="line-59"></a> <font color=Cyan>(</font>TagName n' m<font color=Cyan>)</font> <font color=Red>-></font> modifier m <font color=Red>[</font><font color=Red>[</font>Defined <font color=Cyan>(</font>name n'<font color=Cyan>)</font><font color=Red>]</font><font color=Red>]</font>+<a name="line-60"></a> <font color=Cyan>(</font>Choice cps m<font color=Cyan>)</font> <font color=Red>-></font> modifier m <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Cyan>(</font><font color=Red><b>:</b></font>[]<font color=Cyan>)</font><font color=Cyan>.</font>inner<font color=Cyan>)</font> cps<font color=Cyan>)</font>+<a name="line-61"></a> <font color=Cyan>(</font>Seq cps m<font color=Cyan>)</font> <font color=Red>-></font> modifier m <font color=Red>[</font>map inner cps<font color=Red>]</font>+<a name="line-62"></a> <font color=Cyan>++</font> concatMap <font color=Cyan>(</font>mkAttrDef n<font color=Cyan>)</font> <font color=Green><u>as</u></font>+<a name="line-63"></a> <font color=Green><u>where</u></font>+<a name="line-64"></a> attrs <font color=Red>::</font> AttrFields+<a name="line-65"></a> attrs <font color=Red>=</font> map <font color=Cyan>(</font>mkAttrField n<font color=Cyan>)</font> <font color=Green><u>as</u></font>+<a name="line-66"></a>+<a name="line-67"></a> modifier None sts <font color=Red>=</font> mkData sts attrs False <font color=Cyan>(</font>name n<font color=Cyan>)</font>+<a name="line-68"></a> modifier m <font color=Red>[</font><font color=Red>[</font>st<font color=Red>]</font><font color=Red>]</font> <font color=Red>=</font> mkData <font color=Red>[</font><font color=Red>[</font>modf m st<font color=Red>]</font><font color=Red>]</font> attrs False <font color=Cyan>(</font>name n<font color=Cyan>)</font>+<a name="line-69"></a> modifier m sts <font color=Red>=</font> mkData <font color=Red>[</font><font color=Red>[</font>modf m <font color=Cyan>(</font>Defined <font color=Cyan>(</font>name_ n<font color=Cyan>)</font><font color=Cyan>)</font><font color=Red>]</font><font color=Red>]</font>+<a name="line-70"></a> attrs False <font color=Cyan>(</font>name n<font color=Cyan>)</font> <font color=Cyan>++</font>+<a name="line-71"></a> mkData sts [] True <font color=Cyan>(</font>name_ n<font color=Cyan>)</font>+<a name="line-72"></a>+<a name="line-73"></a> inner <font color=Red>::</font> CP <font color=Red>-></font> StructType+<a name="line-74"></a> inner <font color=Cyan>(</font>TagName n' m<font color=Cyan>)</font> <font color=Red>=</font> modf m <font color=Cyan>(</font>Defined <font color=Cyan>(</font>name n'<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-75"></a> inner <font color=Cyan>(</font>Choice cps m<font color=Cyan>)</font> <font color=Red>=</font> modf m <font color=Cyan>(</font>OneOf <font color=Cyan>(</font>map inner cps<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-76"></a> inner <font color=Cyan>(</font>Seq cps None<font color=Cyan>)</font> <font color=Red>=</font> Tuple <font color=Cyan>(</font>map inner cps<font color=Cyan>)</font>+<a name="line-77"></a> inner <font color=Cyan>(</font>Seq cps m<font color=Cyan>)</font> <font color=Red>=</font> modf m <font color=Cyan>(</font>Tuple <font color=Cyan>(</font>map inner cps<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-78"></a>+<a name="line-79"></a> modf None x <font color=Red>=</font> x+<a name="line-80"></a> modf Query x <font color=Red>=</font> Maybe x+<a name="line-81"></a> modf Star x <font color=Red>=</font> List x+<a name="line-82"></a> modf Plus x <font color=Red>=</font> List1 x+<a name="line-83"></a>+<a name="line-84"></a><a name="mkData"></a><font color=Blue>mkData</font> <font color=Red>::</font> <font color=Red>[</font><font color=Red>[</font>StructType<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> AttrFields <font color=Red>-></font> Bool <font color=Red>-></font> Name <font color=Red>-></font> <font color=Red>[</font>TypeDef<font color=Red>]</font>+<a name="line-85"></a><font color=Blue>mkData</font> [] fs aux n <font color=Red>=</font> <font color=Red>[</font>DataDef aux n fs []<font color=Red>]</font>+<a name="line-86"></a><font color=Blue>mkData</font> <font color=Red>[</font>ts<font color=Red>]</font> fs aux n <font color=Red>=</font> <font color=Red>[</font>DataDef aux n fs <font color=Red>[</font><font color=Cyan>(</font>n<font color=Cyan>,</font> ts<font color=Cyan>)</font><font color=Red>]</font><font color=Red>]</font>+<a name="line-87"></a><font color=Blue>mkData</font> tss fs aux n <font color=Red>=</font> <font color=Red>[</font>DataDef aux n fs <font color=Cyan>(</font>map <font color=Cyan>(</font>mkConstr n<font color=Cyan>)</font> tss<font color=Cyan>)</font><font color=Red>]</font>+<a name="line-88"></a> <font color=Green><u>where</u></font>+<a name="line-89"></a> mkConstr m ts <font color=Red>=</font> <font color=Cyan>(</font>mkConsName m ts<font color=Cyan>,</font> ts<font color=Cyan>)</font>+<a name="line-90"></a> mkConsName <font color=Cyan>(</font>Name x m<font color=Cyan>)</font> sts <font color=Red>=</font> Name x <font color=Cyan>(</font>m<font color=Cyan>++</font>concat <font color=Cyan>(</font>intersperse <font color=Magenta>"_"</font> <font color=Cyan>(</font>map flatten sts<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-91"></a> flatten <font color=Cyan>(</font>Maybe st<font color=Cyan>)</font> <font color=Red>=</font> <font color=Blue>{-"Maybe_" ++ -}</font> flatten st+<a name="line-92"></a> flatten <font color=Cyan>(</font>List st<font color=Cyan>)</font> <font color=Red>=</font> <font color=Blue>{-"List_" ++ -}</font> flatten st+<a name="line-93"></a> flatten <font color=Cyan>(</font>List1 st<font color=Cyan>)</font> <font color=Red>=</font> <font color=Blue>{-"List1_" ++ -}</font> flatten st+<a name="line-94"></a> flatten <font color=Cyan>(</font>Tuple sts<font color=Cyan>)</font> <font color=Red>=</font> <font color=Blue>{-"Tuple" ++ show (length sts) ++ "_" ++ -}</font>+<a name="line-95"></a> concat <font color=Cyan>(</font>intersperse <font color=Magenta>"_"</font> <font color=Cyan>(</font>map flatten sts<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-96"></a> flatten String <font color=Red>=</font> <font color=Magenta>"Str"</font>+<a name="line-97"></a> flatten <font color=Cyan>(</font>OneOf sts<font color=Cyan>)</font> <font color=Red>=</font> <font color=Blue>{-"OneOf" ++ show (length sts) ++ "_" ++ -}</font>+<a name="line-98"></a> concat <font color=Cyan>(</font>intersperse <font color=Magenta>"_"</font> <font color=Cyan>(</font>map flatten sts<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-99"></a> flatten Any <font color=Red>=</font> <font color=Magenta>"Any"</font>+<a name="line-100"></a> flatten <font color=Cyan>(</font>Defined <font color=Cyan>(</font>Name <font color=Green><u>_</u></font> m<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> m+<a name="line-101"></a>+<a name="line-102"></a><a name="mkAttrDef"></a><font color=Blue>mkAttrDef</font> <font color=Red>::</font> String <font color=Red>-></font> AttDef <font color=Red>-></font> <font color=Red>[</font>TypeDef<font color=Red>]</font>+<a name="line-103"></a><font color=Blue>mkAttrDef</font> <font color=Green><u>_</u></font> <font color=Cyan>(</font>AttDef <font color=Green><u>_</u></font> StringType <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-104"></a> []+<a name="line-105"></a><font color=Blue>mkAttrDef</font> <font color=Green><u>_</u></font> <font color=Cyan>(</font>AttDef <font color=Green><u>_</u></font> <font color=Cyan>(</font>TokenizedType <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-106"></a> [] <font color=Blue>-- mkData [[String]] [] False (name n)</font>+<a name="line-107"></a><font color=Blue>mkAttrDef</font> e <font color=Cyan>(</font>AttDef n <font color=Cyan>(</font>EnumeratedType <font color=Cyan>(</font>NotationType nt<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-108"></a> <font color=Red>[</font>EnumDef <font color=Cyan>(</font>name_a e n<font color=Cyan>)</font> <font color=Cyan>(</font>map <font color=Cyan>(</font>name_ac e n<font color=Cyan>)</font> nt<font color=Cyan>)</font><font color=Red>]</font>+<a name="line-109"></a><font color=Blue>mkAttrDef</font> e <font color=Cyan>(</font>AttDef n <font color=Cyan>(</font>EnumeratedType <font color=Cyan>(</font>Enumeration es<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-110"></a> <font color=Red>[</font>EnumDef <font color=Cyan>(</font>name_a e n<font color=Cyan>)</font> <font color=Cyan>(</font>map <font color=Cyan>(</font>name_ac e n<font color=Cyan>)</font> es<font color=Cyan>)</font><font color=Red>]</font>+<a name="line-111"></a> <font color=Blue>-- Default attribute values not handled here</font>+<a name="line-112"></a>+<a name="line-113"></a><a name="mkAttrField"></a><font color=Blue>mkAttrField</font> <font color=Red>::</font> String <font color=Red>-></font> AttDef <font color=Red>-></font> <font color=Cyan>(</font>Name<font color=Cyan>,</font>StructType<font color=Cyan>)</font>+<a name="line-114"></a><font color=Blue>mkAttrField</font> e <font color=Cyan>(</font>AttDef n typ req<font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>name_f e n<font color=Cyan>,</font> mkType typ req<font color=Cyan>)</font>+<a name="line-115"></a> <font color=Green><u>where</u></font>+<a name="line-116"></a> mkType StringType REQUIRED <font color=Red>=</font> String+<a name="line-117"></a> mkType StringType IMPLIED <font color=Red>=</font> Maybe String+<a name="line-118"></a> mkType StringType <font color=Cyan>(</font>DefaultTo v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> Defaultable String <font color=Cyan>(</font>show v<font color=Cyan>)</font>+<a name="line-119"></a> mkType <font color=Cyan>(</font>TokenizedType <font color=Green><u>_</u></font><font color=Cyan>)</font> REQUIRED <font color=Red>=</font> String+<a name="line-120"></a> mkType <font color=Cyan>(</font>TokenizedType <font color=Green><u>_</u></font><font color=Cyan>)</font> IMPLIED <font color=Red>=</font> Maybe String+<a name="line-121"></a> mkType <font color=Cyan>(</font>TokenizedType <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>(</font>DefaultTo v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-122"></a> Defaultable String <font color=Cyan>(</font>show v<font color=Cyan>)</font>+<a name="line-123"></a> mkType <font color=Cyan>(</font>EnumeratedType <font color=Green><u>_</u></font><font color=Cyan>)</font> REQUIRED <font color=Red>=</font> Defined <font color=Cyan>(</font>name_a e n<font color=Cyan>)</font>+<a name="line-124"></a> mkType <font color=Cyan>(</font>EnumeratedType <font color=Green><u>_</u></font><font color=Cyan>)</font> IMPLIED <font color=Red>=</font> Maybe <font color=Cyan>(</font>Defined <font color=Cyan>(</font>name_a e n<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-125"></a> mkType <font color=Cyan>(</font>EnumeratedType <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>(</font>DefaultTo v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-126"></a> Defaultable <font color=Cyan>(</font>Defined <font color=Cyan>(</font>name_a e n<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>hName <font color=Cyan>(</font>name_ac e n <font color=Cyan>(</font>show v<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-127"></a> </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/DtdToHaskell/Instance.html view
@@ -1,397 +1,405 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>DtdToHaskell<font color=Cyan>.</font>Instance-<a name="(line2)"></a> <font color=Cyan>(</font> mkInstance-<a name="(line3)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line4)"></a>-<a name="(line5)"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>intersperse<font color=Cyan>)</font>-<a name="(line6)"></a>-<a name="(line7)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>DtdToHaskell<font color=Cyan>.</font>TypeDef-<a name="(line8)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>PrettyPrint<font color=Cyan>.</font>HughesPJ-<a name="(line9)"></a>-<a name="(line10)"></a><a name="mkInstance"></a><font color=Blue>-- | Convert typedef to appropriate instance declaration, either @XmlContent@,</font>-<a name="(line11)"></a><font color=Blue>-- @XmlAttributes@, or @XmlAttrType@.</font>-<a name="(line12)"></a>mkInstance <font color=Red>::</font> TypeDef <font color=Red>-></font> Doc-<a name="(line13)"></a>-<a name="(line14)"></a><font color=Blue>-- no constructors - represents an element with empty content but attributes.</font>-<a name="(line15)"></a>mkInstance <font color=Cyan>(</font>DataDef <font color=Green><u>_</u></font> n fs []<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line16)"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font> frattr<font color=Cyan>,</font> topat<font color=Cyan>,</font> toattr<font color=Cyan>)</font> <font color=Red>=</font> attrpats fs-<a name="(line17)"></a> frretval <font color=Red>=</font> <font color=Green><u>if</u></font> null fs <font color=Green><u>then</u></font> ppHName n <font color=Green><u>else</u></font> frattr-<a name="(line18)"></a> topatval <font color=Red>=</font> <font color=Green><u>if</u></font> null fs <font color=Green><u>then</u></font> ppHName n <font color=Green><u>else</u></font> topat-<a name="(line19)"></a> <font color=Green><u>in</u></font>-<a name="(line20)"></a> text <font color=Magenta>"instance HTypeable"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>-<a name="(line21)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"toHType x = Defined \""</font> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\" [] []"</font> <font color=Cyan>)</font>-<a name="(line22)"></a> <font color=Cyan>$$</font>-<a name="(line23)"></a> text <font color=Magenta>"instance XmlContent"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>-<a name="(line24)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font>-<a name="(line25)"></a> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> topatval <font color=Cyan><+></font> text <font color=Magenta>"="</font> <font color=Cyan>$$</font>-<a name="(line26)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font>text <font color=Magenta>"[CElem (Elem \""</font> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\""</font>-<a name="(line27)"></a> <font color=Cyan><+></font> toattr <font color=Cyan><+></font> text <font color=Magenta>"[]) ()]"</font><font color=Cyan>)</font>-<a name="(line28)"></a> <font color=Cyan>$$</font>-<a name="(line29)"></a> text <font color=Magenta>"parseContents = do"</font> <font color=Cyan>$$</font>-<a name="(line30)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font>text <font color=Magenta>"{ (Elem _ as []) <- element [\""</font>-<a name="(line31)"></a> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\"]"</font> <font color=Cyan>$$</font>-<a name="(line32)"></a> text <font color=Magenta>"; return"</font> <font color=Cyan><+></font> frretval <font color=Cyan>$$</font>-<a name="(line33)"></a> text <font color=Magenta>"} `adjustErr` (\"in <"</font> <font color=Cyan><></font> ppXName n-<a name="(line34)"></a> <font color=Cyan><></font> text <font color=Magenta>">, \"++)"</font>-<a name="(line35)"></a> <font color=Cyan>)</font>-<a name="(line36)"></a> <font color=Cyan>)</font>-<a name="(line37)"></a> <font color=Cyan>$$</font>-<a name="(line38)"></a> mkInstanceAttrs Same n fs-<a name="(line39)"></a>-<a name="(line40)"></a><font color=Blue>-- single constructor, "real" (non-auxiliary) type</font>-<a name="(line41)"></a>mkInstance <font color=Cyan>(</font>DataDef False n fs <font color=Red>[</font><font color=Cyan>(</font>n0<font color=Cyan>,</font>sts<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line42)"></a> <font color=Green><u>let</u></font> vs <font color=Red>=</font> nameSupply sts-<a name="(line43)"></a> <font color=Cyan>(</font>frpat<font color=Cyan>,</font> frattr<font color=Cyan>,</font> topat<font color=Cyan>,</font> toattr<font color=Cyan>)</font> <font color=Red>=</font> attrpats fs-<a name="(line44)"></a> <font color=Green><u>in</u></font>-<a name="(line45)"></a> text <font color=Magenta>"instance HTypeable"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>-<a name="(line46)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"toHType x = Defined \""</font> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\" [] []"</font> <font color=Cyan>)</font>-<a name="(line47)"></a> <font color=Cyan>$$</font>-<a name="(line48)"></a> text <font color=Magenta>"instance XmlContent"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>-<a name="(line49)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font>-<a name="(line50)"></a> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> parens <font color=Cyan>(</font>mkCpat n0 topat vs<font color=Cyan>)</font> <font color=Cyan><+></font> text <font color=Magenta>"="</font> <font color=Cyan>$$</font>-<a name="(line51)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font>text <font color=Magenta>"[CElem (Elem \""</font> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\""</font>-<a name="(line52)"></a> <font color=Cyan><+></font> toattr <font color=Cyan><+></font> parens <font color=Cyan>(</font>mkToElem sts vs<font color=Cyan>)</font>-<a name="(line53)"></a> <font color=Cyan><></font> text <font color=Magenta>") ()]"</font><font color=Cyan>)</font>-<a name="(line54)"></a> <font color=Cyan>$$</font>-<a name="(line55)"></a> text <font color=Magenta>"parseContents = do"</font> <font color=Cyan>$$</font>-<a name="(line56)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font>text <font color=Magenta>"{ e@(Elem _"</font><font color=Cyan><+></font> frpat <font color=Cyan><+></font> text <font color=Magenta>"_) <- element [\""</font>-<a name="(line57)"></a> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\"]"</font>-<a name="(line58)"></a> <font color=Cyan>$$</font> text <font color=Magenta>"; interior e $"</font>-<a name="(line59)"></a> <font color=Cyan><+></font> <font color=Cyan>(</font>mkParseConstr frattr <font color=Cyan>(</font>n0<font color=Cyan>,</font>sts<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line60)"></a> <font color=Cyan>$$</font> text <font color=Magenta>"} `adjustErr` (\"in <"</font> <font color=Cyan><></font> ppXName n-<a name="(line61)"></a> <font color=Cyan><></font> text <font color=Magenta>">, \"++)"</font><font color=Cyan>)</font>-<a name="(line62)"></a> <font color=Cyan>)</font>-<a name="(line63)"></a> <font color=Cyan>$$</font>-<a name="(line64)"></a> mkInstanceAttrs Extended n fs-<a name="(line65)"></a>-<a name="(line66)"></a><font color=Blue>-- single constructor, auxiliary type (i.e. no corresponding element tag)</font>-<a name="(line67)"></a><font color=Blue>-- cannot be attributes here?</font>-<a name="(line68)"></a>mkInstance <font color=Cyan>(</font>DataDef True n [] <font color=Red>[</font><font color=Cyan>(</font>n0<font color=Cyan>,</font>sts<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line69)"></a> <font color=Green><u>let</u></font> vs <font color=Red>=</font> nameSupply sts-<a name="(line70)"></a> <font color=Green><u>in</u></font>-<a name="(line71)"></a> text <font color=Magenta>"instance HTypeable"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>-<a name="(line72)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"toHType x = Defined \""</font> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\" [] []"</font> <font color=Cyan>)</font>-<a name="(line73)"></a> <font color=Cyan>$$</font>-<a name="(line74)"></a> text <font color=Magenta>"instance XmlContent"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>-<a name="(line75)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> parens <font color=Cyan>(</font>mkCpat n0 empty vs<font color=Cyan>)</font>-<a name="(line76)"></a> <font color=Cyan><+></font> text <font color=Magenta>"="</font>-<a name="(line77)"></a> <font color=Cyan>$$</font> nest <font color=Magenta>4</font> <font color=Cyan>(</font>parens <font color=Cyan>(</font>mkToElem sts vs<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line78)"></a> <font color=Cyan>$$</font>-<a name="(line79)"></a> text <font color=Magenta>"parseContents ="</font> <font color=Cyan><+></font> mkParseConstr empty <font color=Cyan>(</font>n0<font color=Cyan>,</font>sts<font color=Cyan>)</font>-<a name="(line80)"></a> <font color=Cyan>)</font>-<a name="(line81)"></a>-<a name="(line82)"></a><font color=Blue>-- multiple constructors (real)</font>-<a name="(line83)"></a>mkInstance <font color=Cyan>(</font>DataDef False n fs cs<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line84)"></a> <font color=Green><u>let</u></font> <font color=Green><u>_</u></font> <font color=Red>=</font> nameSupply cs-<a name="(line85)"></a> <font color=Cyan>(</font>frpat<font color=Cyan>,</font> frattr<font color=Cyan>,</font> topat<font color=Cyan>,</font> toattr<font color=Cyan>)</font> <font color=Red>=</font> attrpats fs-<a name="(line86)"></a> <font color=Green><u>_</u></font> <font color=Red>=</font> <font color=Green><u>if</u></font> null fs <font color=Green><u>then</u></font> False <font color=Green><u>else</u></font> True-<a name="(line87)"></a> <font color=Green><u>in</u></font>-<a name="(line88)"></a> text <font color=Magenta>"instance HTypeable"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>-<a name="(line89)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"toHType x = Defined \""</font> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\" [] []"</font> <font color=Cyan>)</font>-<a name="(line90)"></a> <font color=Cyan>$$</font>-<a name="(line91)"></a> text <font color=Magenta>"instance XmlContent"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>-<a name="(line92)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> vcat <font color=Cyan>(</font>map <font color=Cyan>(</font>mkToMult n topat toattr<font color=Cyan>)</font> cs<font color=Cyan>)</font>-<a name="(line93)"></a> <font color=Cyan>$$</font> text <font color=Magenta>"parseContents = do "</font>-<a name="(line94)"></a> <font color=Cyan>$$</font> nest <font color=Magenta>4</font> <font color=Cyan>(</font>text <font color=Magenta>"{ e@(Elem _"</font><font color=Cyan><+></font> frpat <font color=Cyan><+></font> text <font color=Magenta>"_) <- element [\""</font>-<a name="(line95)"></a> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\"]"</font>-<a name="(line96)"></a> <font color=Cyan>$$</font> text <font color=Magenta>"; interior e $ oneOf"</font>-<a name="(line97)"></a> <font color=Cyan>$$</font> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"["</font> <font color=Cyan><+></font> mkParseConstr frattr <font color=Cyan>(</font>head cs<font color=Cyan>)</font>-<a name="(line98)"></a> <font color=Cyan>$$</font> vcat <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font> text <font color=Magenta>","</font> <font color=Cyan><+></font> mkParseConstr frattr c<font color=Cyan>)</font>-<a name="(line99)"></a> <font color=Cyan>(</font>tail cs<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line100)"></a> <font color=Cyan>$$</font> text <font color=Magenta>"] `adjustErr` (\"in <"</font> <font color=Cyan><></font> ppXName n-<a name="(line101)"></a> <font color=Cyan><></font> text <font color=Magenta>">, \"++)"</font>-<a name="(line102)"></a> <font color=Cyan>)</font>-<a name="(line103)"></a> <font color=Cyan>$$</font> text <font color=Magenta>"}"</font>-<a name="(line104)"></a> <font color=Cyan>)</font>-<a name="(line105)"></a> <font color=Cyan>)</font>-<a name="(line106)"></a> <font color=Cyan>$$</font>-<a name="(line107)"></a> mkInstanceAttrs Extended n fs-<a name="(line108)"></a>-<a name="(line109)"></a><font color=Blue>-- multiple constructors (auxiliary)</font>-<a name="(line110)"></a>mkInstance <font color=Cyan>(</font>DataDef True n fs cs<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line111)"></a> <font color=Green><u>let</u></font> <font color=Green><u>_</u></font> <font color=Red>=</font> nameSupply cs-<a name="(line112)"></a> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font> frattr<font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> attrpats fs-<a name="(line113)"></a> mixattrs <font color=Red>=</font> <font color=Green><u>if</u></font> null fs <font color=Green><u>then</u></font> False <font color=Green><u>else</u></font> True-<a name="(line114)"></a> <font color=Green><u>in</u></font>-<a name="(line115)"></a> text <font color=Magenta>"instance HTypeable"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>-<a name="(line116)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"toHType x = Defined \""</font> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\" [] []"</font> <font color=Cyan>)</font>-<a name="(line117)"></a> <font color=Cyan>$$</font>-<a name="(line118)"></a> text <font color=Magenta>"instance XmlContent"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>-<a name="(line119)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> vcat <font color=Cyan>(</font>map <font color=Cyan>(</font>mkToAux mixattrs<font color=Cyan>)</font> cs<font color=Cyan>)</font>-<a name="(line120)"></a> <font color=Cyan>$$</font> text <font color=Magenta>"parseContents = oneOf"</font>-<a name="(line121)"></a> <font color=Cyan>$$</font> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"["</font> <font color=Cyan><+></font> mkParseConstr frattr <font color=Cyan>(</font>head cs<font color=Cyan>)</font>-<a name="(line122)"></a> <font color=Cyan>$$</font> vcat <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font> text <font color=Magenta>","</font> <font color=Cyan><+></font> mkParseConstr frattr c<font color=Cyan>)</font>-<a name="(line123)"></a> <font color=Cyan>(</font>tail cs<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line124)"></a> <font color=Cyan>$$</font> text <font color=Magenta>"] `adjustErr` (\"in <"</font> <font color=Cyan><></font> ppXName n-<a name="(line125)"></a> <font color=Cyan><></font> text <font color=Magenta>">, \"++)"</font>-<a name="(line126)"></a> <font color=Cyan>)</font>-<a name="(line127)"></a> <font color=Cyan>)</font>-<a name="(line128)"></a> <font color=Cyan>$$</font>-<a name="(line129)"></a> mkInstanceAttrs Extended n fs-<a name="(line130)"></a>-<a name="(line131)"></a><font color=Blue>-- enumeration of attribute values</font>-<a name="(line132)"></a>mkInstance <font color=Cyan>(</font>EnumDef n es<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line133)"></a> text <font color=Magenta>"instance XmlAttrType"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>-<a name="(line134)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"fromAttrToTyp n (n',v)"</font> <font color=Cyan>$$</font>-<a name="(line135)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font>text <font color=Magenta>"| n==n' = translate (attr2str v)"</font> <font color=Cyan>$$</font>-<a name="(line136)"></a> text <font color=Magenta>"| otherwise = Nothing"</font><font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line137)"></a> nest <font color=Magenta>2</font> <font color=Cyan>(</font>text <font color=Magenta>"where"</font> <font color=Cyan><+></font> mkTranslate es<font color=Cyan>)</font>-<a name="(line138)"></a> <font color=Cyan>$$</font>-<a name="(line139)"></a> vcat <font color=Cyan>(</font>map mkToAttr es<font color=Cyan>)</font>-<a name="(line140)"></a> <font color=Cyan>)</font>-<a name="(line141)"></a>-<a name="(line142)"></a>-<a name="(line143)"></a><a name="SameName"></a><font color=Green><u>data</u></font> SameName <font color=Red>=</font> Same <font color=Red>|</font> Extended-<a name="(line144)"></a>-<a name="(line145)"></a><a name="mkInstanceAttrs"></a>mkInstanceAttrs <font color=Red>::</font> SameName <font color=Red>-></font> Name <font color=Red>-></font> AttrFields <font color=Red>-></font> Doc-<a name="(line146)"></a>mkInstanceAttrs <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> [] <font color=Red>=</font> empty-<a name="(line147)"></a>mkInstanceAttrs s n fs <font color=Red>=</font>-<a name="(line148)"></a> <font color=Green><u>let</u></font> ppName <font color=Red>=</font> <font color=Green><u>case</u></font> s <font color=Green><u>of</u></font> <font color=Cyan>{</font> Same<font color=Red>-></font> ppHName<font color=Cyan>;</font> Extended<font color=Red>-></font> ppAName<font color=Cyan>;</font> <font color=Cyan>}</font>-<a name="(line149)"></a> <font color=Green><u>in</u></font>-<a name="(line150)"></a> text <font color=Magenta>"instance XmlAttributes"</font> <font color=Cyan><+></font> ppName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>-<a name="(line151)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"fromAttrs as ="</font> <font color=Cyan>$$</font>-<a name="(line152)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> ppName n <font color=Cyan>$$</font>-<a name="(line153)"></a> nest <font color=Magenta>2</font> <font color=Cyan>(</font>vcat <font color=Cyan>(</font><font color=Cyan>(</font>text <font color=Magenta>"{"</font> <font color=Cyan><+></font> mkFrFld n <font color=Cyan>(</font>head fs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Red><b>:</b></font>-<a name="(line154)"></a> map <font color=Cyan>(</font><font color=Red>\</font>x<font color=Red>-></font> comma <font color=Cyan><+></font> mkFrFld n x<font color=Cyan>)</font> <font color=Cyan>(</font>tail fs<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line155)"></a> text <font color=Magenta>"}"</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line156)"></a> <font color=Cyan>$$</font>-<a name="(line157)"></a> text <font color=Magenta>"toAttrs v = catMaybes "</font> <font color=Cyan>$$</font>-<a name="(line158)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font>vcat <font color=Cyan>(</font><font color=Cyan>(</font>text <font color=Magenta>"["</font> <font color=Cyan><+></font> mkToFld <font color=Cyan>(</font>head fs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Red><b>:</b></font>-<a name="(line159)"></a> map <font color=Cyan>(</font><font color=Red>\</font>x<font color=Red>-></font> comma <font color=Cyan><+></font> mkToFld x<font color=Cyan>)</font> <font color=Cyan>(</font>tail fs<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line160)"></a> text <font color=Magenta>"]"</font><font color=Cyan>)</font>-<a name="(line161)"></a> <font color=Cyan>)</font>-<a name="(line162)"></a>-<a name="(line163)"></a>-<a name="(line164)"></a><a name="attrpats"></a><font color=Blue>-- respectively (frpat,frattr,topat,toattr)</font>-<a name="(line165)"></a>attrpats <font color=Red>::</font> AttrFields <font color=Red>-></font> <font color=Cyan>(</font>Doc<font color=Cyan>,</font>Doc<font color=Cyan>,</font>Doc<font color=Cyan>,</font>Doc<font color=Cyan>)</font>-<a name="(line166)"></a>attrpats fs <font color=Red>=</font>-<a name="(line167)"></a> <font color=Green><u>if</u></font> null fs <font color=Green><u>then</u></font> <font color=Cyan>(</font>text <font color=Magenta>"[]"</font><font color=Cyan>,</font> empty<font color=Cyan>,</font> empty<font color=Cyan>,</font> text <font color=Magenta>"[]"</font><font color=Cyan>)</font>-<a name="(line168)"></a> <font color=Green><u>else</u></font> <font color=Cyan>(</font>text <font color=Magenta>"as"</font><font color=Cyan>,</font> parens <font color=Cyan>(</font>text <font color=Magenta>"fromAttrs as"</font><font color=Cyan>)</font><font color=Cyan>,</font> text <font color=Magenta>"as"</font><font color=Cyan>,</font> parens <font color=Cyan>(</font>text <font color=Magenta>"toAttrs as"</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line169)"></a>-<a name="(line170)"></a>-<a name="(line171)"></a>-<a name="(line172)"></a>-<a name="(line173)"></a><font color=Blue>-- mkFrElem :: Name -> [StructType] -> [Doc] -> Doc -> Doc</font>-<a name="(line174)"></a><font color=Blue>-- mkFrElem n sts vs inner =</font>-<a name="(line175)"></a><font color=Blue>-- foldr (frElem n) inner (zip3 sts vs cvs)</font>-<a name="(line176)"></a><font color=Blue>-- where</font>-<a name="(line177)"></a><font color=Blue>-- cvs = let ns = nameSupply2 vs</font>-<a name="(line178)"></a><font color=Blue>-- in zip ns (text "c0": init ns)</font>-<a name="(line179)"></a><font color=Blue>-- frElem _ (st,v,(cvi,cvo)) inner =</font>-<a name="(line180)"></a><font color=Blue>-- parens (text "\\" <> parens (v<>comma<>cvi) <> text "->" $$</font>-<a name="(line181)"></a><font color=Blue>-- nest 2 inner) $$</font>-<a name="(line182)"></a><font color=Blue>-- parens (</font>-<a name="(line183)"></a><font color=Blue>-- case st of</font>-<a name="(line184)"></a><font color=Blue>-- (Maybe String) -> text "fromText" <+> cvo</font>-<a name="(line185)"></a><font color=Blue>-- (Maybe _) -> text "fromElem" <+> cvo</font>-<a name="(line186)"></a><font color=Blue>-- (List String) -> text "many fromText" <+> cvo</font>-<a name="(line187)"></a><font color=Blue>-- (List _) -> text "many fromElem" <+> cvo</font>-<a name="(line188)"></a><font color=Blue>-- (List1 s) -> text "definite fromElem"</font>-<a name="(line189)"></a><font color=Blue>-- <+> text "\"" <> text (show s)<> text "+\""</font>-<a name="(line190)"></a><font color=Blue>-- <+> text "\"" <> ppXName n <> text "\""</font>-<a name="(line191)"></a><font color=Blue>-- <+> cvo</font>-<a name="(line192)"></a><font color=Blue>-- (Tuple ss) -> text "definite fromElem"</font>-<a name="(line193)"></a><font color=Blue>-- <+> text "\"(" <> hcat (intersperse (text ",")</font>-<a name="(line194)"></a><font color=Blue>-- (map (text.show) ss))</font>-<a name="(line195)"></a><font color=Blue>-- <> text ")\""</font>-<a name="(line196)"></a><font color=Blue>-- <+> text "\"" <> ppXName n <> text "\""</font>-<a name="(line197)"></a><font color=Blue>-- <+> cvo</font>-<a name="(line198)"></a><font color=Blue>-- (OneOf _) -> text "definite fromElem"</font>-<a name="(line199)"></a><font color=Blue>-- <+> text "\"OneOf\""</font>-<a name="(line200)"></a><font color=Blue>-- <+> text "\"" <> ppXName n <> text "\""</font>-<a name="(line201)"></a><font color=Blue>-- <+> cvo</font>-<a name="(line202)"></a><font color=Blue>-- (String) -> text "definite fromText" <+> text "\"text\" \"" <></font>-<a name="(line203)"></a><font color=Blue>-- ppXName n <> text "\"" <+> cvo</font>-<a name="(line204)"></a><font color=Blue>-- (Any) -> text "definite fromElem" <+> text "\"ANY\" \"" <></font>-<a name="(line205)"></a><font color=Blue>-- ppXName n <> text "\"" <+> cvo</font>-<a name="(line206)"></a><font color=Blue>-- (Defined m) -> text "definite fromElem" <+></font>-<a name="(line207)"></a><font color=Blue>-- text "\"<" <> ppXName m <> text ">\" \"" <></font>-<a name="(line208)"></a><font color=Blue>-- ppXName m <> text "\"" <+> cvo</font>-<a name="(line209)"></a><font color=Blue>-- (Defaultable _ _) -> text "nyi_fromElem_Defaultable" <+> cvo</font>-<a name="(line210)"></a><font color=Blue>-- )</font>-<a name="(line211)"></a>-<a name="(line212)"></a><a name="mkParseConstr"></a><font color=Blue>--</font>-<a name="(line213)"></a><font color=Blue>{--<a name="(line214)"></a>mkParseContents :: Name -> [StructType] -> [Doc] -> Doc -> Doc-<a name="(line215)"></a>mkParseContents n sts vs inner =-<a name="(line216)"></a> foldr (frElem n) inner (zip3 sts vs cvs)-<a name="(line217)"></a> where-<a name="(line218)"></a> cvs = let ns = nameSupply2 vs-<a name="(line219)"></a> in zip ns (text "c0": init ns)-<a name="(line220)"></a> frElem n (st,v,(cvi,cvo)) inner =-<a name="(line221)"></a> parens (text "\\" <> parens (v<>comma<>cvi) <> text "->" $$-<a name="(line222)"></a> nest 2 inner) $$-<a name="(line223)"></a> parens (-<a name="(line224)"></a> )-<a name="(line225)"></a>-}</font>-<a name="(line226)"></a>mkParseConstr <font color=Red>::</font> Doc <font color=Red>-></font> <font color=Cyan>(</font>Name<font color=Cyan>,</font> <font color=Red>[</font>StructType<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> Doc-<a name="(line227)"></a>mkParseConstr frattr <font color=Cyan>(</font>c<font color=Cyan>,</font>sts<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line228)"></a> fsep <font color=Cyan>(</font>text <font color=Magenta>"return"</font> <font color=Cyan><+></font> parens <font color=Cyan>(</font>ppHName c <font color=Cyan><+></font> frattr<font color=Cyan>)</font>-<a name="(line229)"></a> <font color=Red><b>:</b></font> map mkParseContents sts<font color=Cyan>)</font>-<a name="(line230)"></a>-<a name="(line231)"></a><a name="mkParseContents"></a>mkParseContents <font color=Red>::</font> StructType <font color=Red>-></font> Doc-<a name="(line232)"></a>mkParseContents st <font color=Red>=</font>-<a name="(line233)"></a> <font color=Green><u>let</u></font> ap <font color=Red>=</font> text <font color=Magenta>"`apply`"</font> <font color=Green><u>in</u></font>-<a name="(line234)"></a> <font color=Green><u>case</u></font> st <font color=Green><u>of</u></font>-<a name="(line235)"></a> <font color=Cyan>(</font>Maybe String<font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"optional text"</font>-<a name="(line236)"></a> <font color=Cyan>(</font>Maybe <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"optional parseContents"</font>-<a name="(line237)"></a> <font color=Cyan>(</font>List String<font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"many text"</font>-<a name="(line238)"></a> <font color=Cyan>(</font>List <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"many parseContents"</font>-<a name="(line239)"></a> <font color=Cyan>(</font>List1 <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"parseContents"</font>-<a name="(line240)"></a> <font color=Cyan>(</font>Tuple <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"parseContents"</font>-<a name="(line241)"></a> <font color=Cyan>(</font>OneOf <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"parseContents"</font>-<a name="(line242)"></a> <font color=Cyan>(</font>String<font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"(text `onFail` return \"\")"</font>-<a name="(line243)"></a> <font color=Cyan>(</font>Any<font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"parseContents"</font>-<a name="(line244)"></a> <font color=Cyan>(</font>Defined <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"parseContents"</font>-<a name="(line245)"></a> <font color=Cyan>(</font>Defaultable <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"nyi_fromElem_Defaultable"</font>-<a name="(line246)"></a>-<a name="(line247)"></a><a name="mkToElem"></a><font color=Blue>--</font>-<a name="(line248)"></a>mkToElem <font color=Red>::</font> <font color=Red>[</font>StructType<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Doc<font color=Red>]</font> <font color=Red>-></font> Doc-<a name="(line249)"></a>mkToElem [] [] <font color=Red>=</font> text <font color=Magenta>"[]"</font>-<a name="(line250)"></a>mkToElem sts vs <font color=Red>=</font>-<a name="(line251)"></a> fsep <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"++"</font><font color=Cyan>)</font> <font color=Cyan>(</font>zipWith toElem sts vs<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line252)"></a> <font color=Green><u>where</u></font>-<a name="(line253)"></a> toElem st v <font color=Red>=</font>-<a name="(line254)"></a> <font color=Green><u>case</u></font> st <font color=Green><u>of</u></font>-<a name="(line255)"></a> <font color=Cyan>(</font>Maybe String<font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"maybe [] toText"</font> <font color=Cyan><+></font> v-<a name="(line256)"></a> <font color=Cyan>(</font>Maybe <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"maybe [] toContents"</font> <font color=Cyan><+></font> v-<a name="(line257)"></a> <font color=Cyan>(</font>List String<font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"concatMap toText"</font> <font color=Cyan><+></font> v-<a name="(line258)"></a> <font color=Cyan>(</font>List <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"concatMap toContents"</font> <font color=Cyan><+></font> v-<a name="(line259)"></a> <font color=Cyan>(</font>List1 <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> v-<a name="(line260)"></a> <font color=Cyan>(</font>Tuple <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> v-<a name="(line261)"></a> <font color=Cyan>(</font>OneOf <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> v-<a name="(line262)"></a> <font color=Cyan>(</font>String<font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"toText"</font> <font color=Cyan><+></font> v-<a name="(line263)"></a> <font color=Cyan>(</font>Any<font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> v-<a name="(line264)"></a> <font color=Cyan>(</font>Defined <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> v-<a name="(line265)"></a> <font color=Cyan>(</font>Defaultable <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"nyi_toElem_Defaultable"</font> <font color=Cyan><+></font> v-<a name="(line266)"></a>-<a name="(line267)"></a><font color=Blue>-- mkRpat :: [Doc] -> Doc</font>-<a name="(line268)"></a><font color=Blue>-- mkRpat [v] = v</font>-<a name="(line269)"></a><font color=Blue>-- mkRpat vs = (parens . hcat . intersperse comma) vs</font>-<a name="(line270)"></a>-<a name="(line271)"></a><a name="mkCpat"></a>mkCpat <font color=Red>::</font> Name <font color=Red>-></font> Doc <font color=Red>-></font> <font color=Red>[</font>Doc<font color=Red>]</font> <font color=Red>-></font> Doc-<a name="(line272)"></a>mkCpat n i vs <font color=Red>=</font> ppHName n <font color=Cyan><+></font> i <font color=Cyan><+></font> fsep vs-<a name="(line273)"></a>-<a name="(line274)"></a><a name="nameSupply"></a>nameSupply <font color=Red>::</font> <font color=Red>[</font>b<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Doc<font color=Red>]</font>-<a name="(line275)"></a>nameSupply ss <font color=Red>=</font> take <font color=Cyan>(</font>length ss<font color=Cyan>)</font> <font color=Cyan>(</font>map char <font color=Red>[</font><font color=Magenta>'a'</font><font color=Red>..</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line276)"></a><font color=Blue>-- nameSupply2 ss = take (length ss) [ text ('c':v:[]) | v <- ['a'..]]</font>-<a name="(line277)"></a>-<a name="(line278)"></a><a name="mkTranslate"></a>mkTranslate <font color=Red>::</font> <font color=Red>[</font>Name<font color=Red>]</font> <font color=Red>-></font> Doc-<a name="(line279)"></a>mkTranslate es <font color=Red>=</font>-<a name="(line280)"></a> vcat <font color=Cyan>(</font>map trans es<font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line281)"></a> text <font color=Magenta>"translate _ = Nothing"</font>-<a name="(line282)"></a> <font color=Green><u>where</u></font>-<a name="(line283)"></a> trans n <font color=Red>=</font> text <font color=Magenta>"translate \""</font> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\" ="</font> <font color=Cyan><+></font>-<a name="(line284)"></a> text <font color=Magenta>"Just"</font> <font color=Cyan><+></font> ppHName n-<a name="(line285)"></a>-<a name="(line286)"></a><a name="mkToAttr"></a>mkToAttr <font color=Red>::</font> Name <font color=Red>-></font> Doc-<a name="(line287)"></a>mkToAttr n <font color=Red>=</font> text <font color=Magenta>"toAttrFrTyp n"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"="</font> <font color=Cyan><+></font>-<a name="(line288)"></a> text <font color=Magenta>"Just (n, str2attr"</font> <font color=Cyan><+></font> doubleQuotes <font color=Cyan>(</font>ppXName n<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>")"</font>-<a name="(line289)"></a>-<a name="(line290)"></a><a name="mkFrFld"></a>mkFrFld <font color=Red>::</font> Name <font color=Red>-></font> <font color=Cyan>(</font>Name<font color=Cyan>,</font>StructType<font color=Cyan>)</font> <font color=Red>-></font> Doc-<a name="(line291)"></a>mkFrFld tag <font color=Cyan>(</font>n<font color=Cyan>,</font>st<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line292)"></a> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"="</font> <font color=Cyan><+></font>-<a name="(line293)"></a> <font color=Cyan>(</font> <font color=Green><u>case</u></font> st <font color=Green><u>of</u></font>-<a name="(line294)"></a> <font color=Cyan>(</font>Defaultable String s<font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"defaultA fromAttrToStr"</font> <font color=Cyan><+></font>-<a name="(line295)"></a> doubleQuotes <font color=Cyan>(</font>text s<font color=Cyan>)</font>-<a name="(line296)"></a> <font color=Cyan>(</font>Defaultable <font color=Green><u>_</u></font> s<font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"defaultA fromAttrToTyp"</font> <font color=Cyan><+></font> text s-<a name="(line297)"></a> <font color=Cyan>(</font>Maybe String<font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"possibleA fromAttrToStr"</font>-<a name="(line298)"></a> <font color=Cyan>(</font>Maybe <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"possibleA fromAttrToTyp"</font>-<a name="(line299)"></a> String <font color=Red>-></font> text <font color=Magenta>"definiteA fromAttrToStr"</font> <font color=Cyan><+></font>-<a name="(line300)"></a> doubleQuotes <font color=Cyan>(</font>ppXName tag<font color=Cyan>)</font>-<a name="(line301)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> text <font color=Magenta>"definiteA fromAttrToTyp"</font> <font color=Cyan><+></font>-<a name="(line302)"></a> doubleQuotes <font color=Cyan>(</font>ppXName tag<font color=Cyan>)</font>-<a name="(line303)"></a> <font color=Cyan>)</font> <font color=Cyan><+></font> doubleQuotes <font color=Cyan>(</font>ppXName n<font color=Cyan>)</font> <font color=Cyan><+></font> text <font color=Magenta>"as"</font>-<a name="(line304)"></a>-<a name="(line305)"></a><a name="mkToFld"></a>mkToFld <font color=Red>::</font> <font color=Cyan>(</font>Name<font color=Cyan>,</font>StructType<font color=Cyan>)</font> <font color=Red>-></font> Doc-<a name="(line306)"></a>mkToFld <font color=Cyan>(</font>n<font color=Cyan>,</font>st<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line307)"></a> <font color=Cyan>(</font> <font color=Green><u>case</u></font> st <font color=Green><u>of</u></font>-<a name="(line308)"></a> <font color=Cyan>(</font>Defaultable String <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"defaultToAttr toAttrFrStr"</font>-<a name="(line309)"></a> <font color=Cyan>(</font>Defaultable <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"defaultToAttr toAttrFrTyp"</font>-<a name="(line310)"></a> <font color=Cyan>(</font>Maybe String<font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"maybeToAttr toAttrFrStr"</font>-<a name="(line311)"></a> <font color=Cyan>(</font>Maybe <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"maybeToAttr toAttrFrTyp"</font>-<a name="(line312)"></a> String <font color=Red>-></font> text <font color=Magenta>"toAttrFrStr"</font>-<a name="(line313)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> text <font color=Magenta>"toAttrFrTyp"</font>-<a name="(line314)"></a> <font color=Cyan>)</font> <font color=Cyan><+></font> doubleQuotes <font color=Cyan>(</font>ppXName n<font color=Cyan>)</font> <font color=Cyan><+></font> parens <font color=Cyan>(</font>ppHName n <font color=Cyan><+></font> text <font color=Magenta>"v"</font><font color=Cyan>)</font>-<a name="(line315)"></a>-<a name="(line316)"></a><font color=Blue>-- mkFrAux :: Bool -> Doc -> [(Name,[StructType])] -> Doc</font>-<a name="(line317)"></a><font color=Blue>-- mkFrAux keeprest attrs cs = foldr frAux inner cs</font>-<a name="(line318)"></a><font color=Blue>-- where</font>-<a name="(line319)"></a><font color=Blue>-- inner = text "(Nothing, c0)"</font>-<a name="(line320)"></a><font color=Blue>-- rest = if keeprest then text "rest" else text "_"</font>-<a name="(line321)"></a><font color=Blue>-- frAux (n,sts) innr =</font>-<a name="(line322)"></a><font color=Blue>-- let vs = nameSupply sts in</font>-<a name="(line323)"></a><font color=Blue>-- nest 4 (text "case" <+> blah sts vs <+> text "of" $$</font>-<a name="(line324)"></a><font color=Blue>-- succpat sts vs <+> text "-> (Just" <+></font>-<a name="(line325)"></a><font color=Blue>-- parens (mkCpat n attrs vs) <> text ", rest)"</font>-<a name="(line326)"></a><font color=Blue>-- $$</font>-<a name="(line327)"></a><font color=Blue>-- failpat sts <+> text "->" $$ nest 4 innr</font>-<a name="(line328)"></a><font color=Blue>-- )</font>-<a name="(line329)"></a><font color=Blue>-- blah [st] [_] =</font>-<a name="(line330)"></a><font color=Blue>-- blahblahblah st (text "c0")</font>-<a name="(line331)"></a><font color=Blue>-- blah sts vs =</font>-<a name="(line332)"></a><font color=Blue>-- let ns = nameSupply2 vs</font>-<a name="(line333)"></a><font color=Blue>-- cvs = zip ns (text "c0": init ns)</font>-<a name="(line334)"></a><font color=Blue>-- blahblah (st,v,(cvi,cvo)) innr =</font>-<a name="(line335)"></a><font color=Blue>-- parens (text "\\" <> parens (v<>comma<>cvi) <> text "->" $$</font>-<a name="(line336)"></a><font color=Blue>-- nest 2 innr) $$</font>-<a name="(line337)"></a><font color=Blue>-- blahblahblah st cvo</font>-<a name="(line338)"></a><font color=Blue>-- in</font>-<a name="(line339)"></a><font color=Blue>-- foldr blahblah (mkRpat (vs++[last ns])) (zip3 sts vs cvs)</font>-<a name="(line340)"></a><font color=Blue>-- blahblahblah st cvo = parens (</font>-<a name="(line341)"></a><font color=Blue>-- case st of</font>-<a name="(line342)"></a><font color=Blue>-- (Maybe String) -> text "fromText" <+> cvo</font>-<a name="(line343)"></a><font color=Blue>-- (Maybe _) -> text "fromElem" <+> cvo</font>-<a name="(line344)"></a><font color=Blue>-- (List String) -> text "many fromText" <+> cvo</font>-<a name="(line345)"></a><font color=Blue>-- (List _) -> text "many fromElem" <+> cvo</font>-<a name="(line346)"></a><font color=Blue>-- (List1 _) -> text "fromElem" <+> cvo</font>-<a name="(line347)"></a><font color=Blue>-- (Tuple _) -> text "fromElem" <+> cvo -- ??</font>-<a name="(line348)"></a><font color=Blue>-- (OneOf _) -> text "fromElem" <+> cvo</font>-<a name="(line349)"></a><font color=Blue>-- (String) -> text "fromText" <+> cvo</font>-<a name="(line350)"></a><font color=Blue>-- (Any) -> text "fromElem" <+> cvo</font>-<a name="(line351)"></a><font color=Blue>-- (Defined _) -> text "fromElem" <+> cvo</font>-<a name="(line352)"></a><font color=Blue>-- )</font>-<a name="(line353)"></a><font color=Blue>-- failpat sts =</font>-<a name="(line354)"></a><font color=Blue>-- let fp st =</font>-<a name="(line355)"></a><font color=Blue>-- case st of</font>-<a name="(line356)"></a><font color=Blue>-- (Maybe _) -> text "Nothing"</font>-<a name="(line357)"></a><font color=Blue>-- (List _) -> text "[]"</font>-<a name="(line358)"></a><font color=Blue>-- (List1 _) -> text "_"</font>-<a name="(line359)"></a><font color=Blue>-- (Tuple _) -> text "_"</font>-<a name="(line360)"></a><font color=Blue>-- (OneOf _) -> text "_"</font>-<a name="(line361)"></a><font color=Blue>-- (String) -> text "_"</font>-<a name="(line362)"></a><font color=Blue>-- (Any) -> text "_"</font>-<a name="(line363)"></a><font color=Blue>-- (Defined _) -> text "_"</font>-<a name="(line364)"></a><font color=Blue>-- in parens (hcat (intersperse comma (map fp sts++[text "_"])))</font>-<a name="(line365)"></a><font color=Blue>-- succpat sts vs =</font>-<a name="(line366)"></a><font color=Blue>-- let sp st v =</font>-<a name="(line367)"></a><font color=Blue>-- case st of</font>-<a name="(line368)"></a><font color=Blue>-- (Maybe _) -> v</font>-<a name="(line369)"></a><font color=Blue>-- (List _) -> v</font>-<a name="(line370)"></a><font color=Blue>-- (List1 _) -> text "Just" <+> v</font>-<a name="(line371)"></a><font color=Blue>-- (Tuple _) -> text "Just" <+> v</font>-<a name="(line372)"></a><font color=Blue>-- (OneOf _) -> text "Just" <+> v</font>-<a name="(line373)"></a><font color=Blue>-- (String) -> text "Just" <+> v</font>-<a name="(line374)"></a><font color=Blue>-- (Any) -> text "Just" <+> v</font>-<a name="(line375)"></a><font color=Blue>-- (Defined _) -> text "Just" <+> v</font>-<a name="(line376)"></a><font color=Blue>-- in parens (hcat (intersperse comma (zipWith sp sts vs++[rest])))</font>-<a name="(line377)"></a>-<a name="(line378)"></a><a name="mkToAux"></a>mkToAux <font color=Red>::</font> Bool <font color=Red>-></font> <font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>StructType<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> Doc-<a name="(line379)"></a>mkToAux mixattrs <font color=Cyan>(</font>n<font color=Cyan>,</font>sts<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line380)"></a> <font color=Green><u>let</u></font> vs <font color=Red>=</font> nameSupply sts-<a name="(line381)"></a> attrs <font color=Red>=</font> <font color=Green><u>if</u></font> mixattrs <font color=Green><u>then</u></font> text <font color=Magenta>"as"</font> <font color=Green><u>else</u></font> empty-<a name="(line382)"></a> <font color=Green><u>in</u></font>-<a name="(line383)"></a> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> parens <font color=Cyan>(</font>mkCpat n attrs vs<font color=Cyan>)</font> <font color=Cyan><+></font> text <font color=Magenta>"="</font> <font color=Cyan><+></font>-<a name="(line384)"></a> mkToElem sts vs-<a name="(line385)"></a>-<a name="(line386)"></a><a name="mkToMult"></a>mkToMult <font color=Red>::</font> Name <font color=Red>-></font> Doc <font color=Red>-></font> Doc <font color=Red>-></font> <font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>StructType<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> Doc-<a name="(line387)"></a>mkToMult tag attrpat attrexp <font color=Cyan>(</font>n<font color=Cyan>,</font>sts<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line388)"></a> <font color=Green><u>let</u></font> vs <font color=Red>=</font> nameSupply sts-<a name="(line389)"></a> <font color=Green><u>in</u></font>-<a name="(line390)"></a> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> parens <font color=Cyan>(</font>mkCpat n attrpat vs<font color=Cyan>)</font> <font color=Cyan><+></font> text <font color=Magenta>"="</font>-<a name="(line391)"></a> <font color=Cyan>$$</font> nest <font color=Magenta>4</font> <font color=Cyan>(</font>text <font color=Magenta>"[CElem (Elem \""</font> <font color=Cyan><></font> ppXName tag <font color=Cyan><></font> text <font color=Magenta>"\""</font><font color=Cyan><+></font> attrexp-<a name="(line392)"></a> <font color=Cyan><+></font> parens <font color=Cyan>(</font>mkToElem sts vs<font color=Cyan>)</font> <font color=Cyan><+></font> text <font color=Magenta>") ()]"</font><font color=Cyan>)</font>-<a name="(line393)"></a>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/DtdToHaskell/Instance.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>DtdToHaskell<font color=Cyan>.</font>Instance+<a name="line-2"></a> <font color=Cyan>(</font> mkInstance+<a name="line-3"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-4"></a>+<a name="line-5"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>intersperse<font color=Cyan>)</font>+<a name="line-6"></a>+<a name="line-7"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>DtdToHaskell<font color=Cyan>.</font>TypeDef+<a name="line-8"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>PrettyPrint<font color=Cyan>.</font>HughesPJ+<a name="line-9"></a>+<a name="line-10"></a><a name="mkInstance"></a><font color=Blue>-- | Convert typedef to appropriate instance declaration, either @XmlContent@,</font>+<a name="line-11"></a><font color=Blue>-- @XmlAttributes@, or @XmlAttrType@.</font>+<a name="line-12"></a><font color=Blue>mkInstance</font> <font color=Red>::</font> TypeDef <font color=Red>-></font> Doc+<a name="line-13"></a>+<a name="line-14"></a><font color=Blue>-- no constructors - represents an element with empty content but attributes.</font>+<a name="line-15"></a><font color=Blue>mkInstance</font> <font color=Cyan>(</font>DataDef <font color=Green><u>_</u></font> n fs []<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-16"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font> frattr<font color=Cyan>,</font> topat<font color=Cyan>,</font> toattr<font color=Cyan>)</font> <font color=Red>=</font> attrpats fs+<a name="line-17"></a> frretval <font color=Red>=</font> <font color=Green><u>if</u></font> null fs <font color=Green><u>then</u></font> ppHName n <font color=Green><u>else</u></font> frattr+<a name="line-18"></a> topatval <font color=Red>=</font> <font color=Green><u>if</u></font> null fs <font color=Green><u>then</u></font> ppHName n <font color=Green><u>else</u></font> topat+<a name="line-19"></a> <font color=Green><u>in</u></font>+<a name="line-20"></a> text <font color=Magenta>"instance HTypeable"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>+<a name="line-21"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"toHType x = Defined \""</font> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\" [] []"</font> <font color=Cyan>)</font>+<a name="line-22"></a> <font color=Cyan>$$</font>+<a name="line-23"></a> text <font color=Magenta>"instance XmlContent"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>+<a name="line-24"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font>+<a name="line-25"></a> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> topatval <font color=Cyan><+></font> text <font color=Magenta>"="</font> <font color=Cyan>$$</font>+<a name="line-26"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font>text <font color=Magenta>"[CElem (Elem \""</font> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\""</font>+<a name="line-27"></a> <font color=Cyan><+></font> toattr <font color=Cyan><+></font> text <font color=Magenta>"[]) ()]"</font><font color=Cyan>)</font>+<a name="line-28"></a> <font color=Cyan>$$</font>+<a name="line-29"></a> text <font color=Magenta>"parseContents = do"</font> <font color=Cyan>$$</font>+<a name="line-30"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font>text <font color=Magenta>"{ (Elem _ as []) <- element [\""</font>+<a name="line-31"></a> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\"]"</font> <font color=Cyan>$$</font>+<a name="line-32"></a> text <font color=Magenta>"; return"</font> <font color=Cyan><+></font> frretval <font color=Cyan>$$</font>+<a name="line-33"></a> text <font color=Magenta>"} `adjustErr` (\"in <"</font> <font color=Cyan><></font> ppXName n+<a name="line-34"></a> <font color=Cyan><></font> text <font color=Magenta>">, \"++)"</font>+<a name="line-35"></a> <font color=Cyan>)</font>+<a name="line-36"></a> <font color=Cyan>)</font>+<a name="line-37"></a> <font color=Cyan>$$</font>+<a name="line-38"></a> mkInstanceAttrs Same n fs+<a name="line-39"></a>+<a name="line-40"></a><font color=Blue>-- single constructor, "real" (non-auxiliary) type</font>+<a name="line-41"></a><font color=Blue>mkInstance</font> <font color=Cyan>(</font>DataDef False n fs <font color=Red>[</font><font color=Cyan>(</font>n0<font color=Cyan>,</font>sts<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-42"></a> <font color=Green><u>let</u></font> vs <font color=Red>=</font> nameSupply sts+<a name="line-43"></a> <font color=Cyan>(</font>frpat<font color=Cyan>,</font> frattr<font color=Cyan>,</font> topat<font color=Cyan>,</font> toattr<font color=Cyan>)</font> <font color=Red>=</font> attrpats fs+<a name="line-44"></a> <font color=Green><u>in</u></font>+<a name="line-45"></a> text <font color=Magenta>"instance HTypeable"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>+<a name="line-46"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"toHType x = Defined \""</font> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\" [] []"</font> <font color=Cyan>)</font>+<a name="line-47"></a> <font color=Cyan>$$</font>+<a name="line-48"></a> text <font color=Magenta>"instance XmlContent"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>+<a name="line-49"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font>+<a name="line-50"></a> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> parens <font color=Cyan>(</font>mkCpat n0 topat vs<font color=Cyan>)</font> <font color=Cyan><+></font> text <font color=Magenta>"="</font> <font color=Cyan>$$</font>+<a name="line-51"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font>text <font color=Magenta>"[CElem (Elem \""</font> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\""</font>+<a name="line-52"></a> <font color=Cyan><+></font> toattr <font color=Cyan><+></font> parens <font color=Cyan>(</font>mkToElem sts vs<font color=Cyan>)</font>+<a name="line-53"></a> <font color=Cyan><></font> text <font color=Magenta>") ()]"</font><font color=Cyan>)</font>+<a name="line-54"></a> <font color=Cyan>$$</font>+<a name="line-55"></a> text <font color=Magenta>"parseContents = do"</font> <font color=Cyan>$$</font>+<a name="line-56"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font>text <font color=Magenta>"{ e@(Elem _"</font><font color=Cyan><+></font> frpat <font color=Cyan><+></font> text <font color=Magenta>"_) <- element [\""</font>+<a name="line-57"></a> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\"]"</font>+<a name="line-58"></a> <font color=Cyan>$$</font> text <font color=Magenta>"; interior e $"</font>+<a name="line-59"></a> <font color=Cyan><+></font> <font color=Cyan>(</font>mkParseConstr frattr <font color=Cyan>(</font>n0<font color=Cyan>,</font>sts<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-60"></a> <font color=Cyan>$$</font> text <font color=Magenta>"} `adjustErr` (\"in <"</font> <font color=Cyan><></font> ppXName n+<a name="line-61"></a> <font color=Cyan><></font> text <font color=Magenta>">, \"++)"</font><font color=Cyan>)</font>+<a name="line-62"></a> <font color=Cyan>)</font>+<a name="line-63"></a> <font color=Cyan>$$</font>+<a name="line-64"></a> mkInstanceAttrs Extended n fs+<a name="line-65"></a>+<a name="line-66"></a><font color=Blue>-- single constructor, auxiliary type (i.e. no corresponding element tag)</font>+<a name="line-67"></a><font color=Blue>-- cannot be attributes here?</font>+<a name="line-68"></a><font color=Blue>mkInstance</font> <font color=Cyan>(</font>DataDef True n [] <font color=Red>[</font><font color=Cyan>(</font>n0<font color=Cyan>,</font>sts<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-69"></a> <font color=Green><u>let</u></font> vs <font color=Red>=</font> nameSupply sts+<a name="line-70"></a> <font color=Green><u>in</u></font>+<a name="line-71"></a> text <font color=Magenta>"instance HTypeable"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>+<a name="line-72"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"toHType x = Defined \""</font> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\" [] []"</font> <font color=Cyan>)</font>+<a name="line-73"></a> <font color=Cyan>$$</font>+<a name="line-74"></a> text <font color=Magenta>"instance XmlContent"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>+<a name="line-75"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> parens <font color=Cyan>(</font>mkCpat n0 empty vs<font color=Cyan>)</font>+<a name="line-76"></a> <font color=Cyan><+></font> text <font color=Magenta>"="</font>+<a name="line-77"></a> <font color=Cyan>$$</font> nest <font color=Magenta>4</font> <font color=Cyan>(</font>parens <font color=Cyan>(</font>mkToElem sts vs<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-78"></a> <font color=Cyan>$$</font>+<a name="line-79"></a> text <font color=Magenta>"parseContents ="</font> <font color=Cyan><+></font> mkParseConstr empty <font color=Cyan>(</font>n0<font color=Cyan>,</font>sts<font color=Cyan>)</font>+<a name="line-80"></a> <font color=Cyan>)</font>+<a name="line-81"></a>+<a name="line-82"></a><font color=Blue>-- multiple constructors (real)</font>+<a name="line-83"></a><font color=Blue>mkInstance</font> <font color=Cyan>(</font>DataDef False n fs cs<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-84"></a> <font color=Green><u>let</u></font> <font color=Green><u>_</u></font> <font color=Red>=</font> nameSupply cs+<a name="line-85"></a> <font color=Cyan>(</font>frpat<font color=Cyan>,</font> frattr<font color=Cyan>,</font> topat<font color=Cyan>,</font> toattr<font color=Cyan>)</font> <font color=Red>=</font> attrpats fs+<a name="line-86"></a> <font color=Green><u>_</u></font> <font color=Red>=</font> <font color=Green><u>if</u></font> null fs <font color=Green><u>then</u></font> False <font color=Green><u>else</u></font> True+<a name="line-87"></a> <font color=Green><u>in</u></font>+<a name="line-88"></a> text <font color=Magenta>"instance HTypeable"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>+<a name="line-89"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"toHType x = Defined \""</font> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\" [] []"</font> <font color=Cyan>)</font>+<a name="line-90"></a> <font color=Cyan>$$</font>+<a name="line-91"></a> text <font color=Magenta>"instance XmlContent"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>+<a name="line-92"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> vcat <font color=Cyan>(</font>map <font color=Cyan>(</font>mkToMult n topat toattr<font color=Cyan>)</font> cs<font color=Cyan>)</font>+<a name="line-93"></a> <font color=Cyan>$$</font> text <font color=Magenta>"parseContents = do "</font>+<a name="line-94"></a> <font color=Cyan>$$</font> nest <font color=Magenta>4</font> <font color=Cyan>(</font>text <font color=Magenta>"{ e@(Elem _"</font><font color=Cyan><+></font> frpat <font color=Cyan><+></font> text <font color=Magenta>"_) <- element [\""</font>+<a name="line-95"></a> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\"]"</font>+<a name="line-96"></a> <font color=Cyan>$$</font> text <font color=Magenta>"; interior e $ oneOf"</font>+<a name="line-97"></a> <font color=Cyan>$$</font> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"["</font> <font color=Cyan><+></font> mkParseConstr frattr <font color=Cyan>(</font>head cs<font color=Cyan>)</font>+<a name="line-98"></a> <font color=Cyan>$$</font> vcat <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font> text <font color=Magenta>","</font> <font color=Cyan><+></font> mkParseConstr frattr c<font color=Cyan>)</font>+<a name="line-99"></a> <font color=Cyan>(</font>tail cs<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-100"></a> <font color=Cyan>$$</font> text <font color=Magenta>"] `adjustErr` (\"in <"</font> <font color=Cyan><></font> ppXName n+<a name="line-101"></a> <font color=Cyan><></font> text <font color=Magenta>">, \"++)"</font>+<a name="line-102"></a> <font color=Cyan>)</font>+<a name="line-103"></a> <font color=Cyan>$$</font> text <font color=Magenta>"}"</font>+<a name="line-104"></a> <font color=Cyan>)</font>+<a name="line-105"></a> <font color=Cyan>)</font>+<a name="line-106"></a> <font color=Cyan>$$</font>+<a name="line-107"></a> mkInstanceAttrs Extended n fs+<a name="line-108"></a>+<a name="line-109"></a><font color=Blue>-- multiple constructors (auxiliary)</font>+<a name="line-110"></a><font color=Blue>mkInstance</font> <font color=Cyan>(</font>DataDef True n fs cs<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-111"></a> <font color=Green><u>let</u></font> <font color=Green><u>_</u></font> <font color=Red>=</font> nameSupply cs+<a name="line-112"></a> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font> frattr<font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> attrpats fs+<a name="line-113"></a> mixattrs <font color=Red>=</font> <font color=Green><u>if</u></font> null fs <font color=Green><u>then</u></font> False <font color=Green><u>else</u></font> True+<a name="line-114"></a> <font color=Green><u>in</u></font>+<a name="line-115"></a> text <font color=Magenta>"instance HTypeable"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>+<a name="line-116"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"toHType x = Defined \""</font> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\" [] []"</font> <font color=Cyan>)</font>+<a name="line-117"></a> <font color=Cyan>$$</font>+<a name="line-118"></a> text <font color=Magenta>"instance XmlContent"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>+<a name="line-119"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> vcat <font color=Cyan>(</font>map <font color=Cyan>(</font>mkToAux mixattrs<font color=Cyan>)</font> cs<font color=Cyan>)</font>+<a name="line-120"></a> <font color=Cyan>$$</font> text <font color=Magenta>"parseContents = oneOf"</font>+<a name="line-121"></a> <font color=Cyan>$$</font> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"["</font> <font color=Cyan><+></font> mkParseConstr frattr <font color=Cyan>(</font>head cs<font color=Cyan>)</font>+<a name="line-122"></a> <font color=Cyan>$$</font> vcat <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font> text <font color=Magenta>","</font> <font color=Cyan><+></font> mkParseConstr frattr c<font color=Cyan>)</font>+<a name="line-123"></a> <font color=Cyan>(</font>tail cs<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-124"></a> <font color=Cyan>$$</font> text <font color=Magenta>"] `adjustErr` (\"in <"</font> <font color=Cyan><></font> ppXName n+<a name="line-125"></a> <font color=Cyan><></font> text <font color=Magenta>">, \"++)"</font>+<a name="line-126"></a> <font color=Cyan>)</font>+<a name="line-127"></a> <font color=Cyan>)</font>+<a name="line-128"></a> <font color=Cyan>$$</font>+<a name="line-129"></a> mkInstanceAttrs Extended n fs+<a name="line-130"></a>+<a name="line-131"></a><font color=Blue>-- enumeration of attribute values</font>+<a name="line-132"></a><font color=Blue>mkInstance</font> <font color=Cyan>(</font>EnumDef n es<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-133"></a> text <font color=Magenta>"instance XmlAttrType"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>+<a name="line-134"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"fromAttrToTyp n (n',v)"</font> <font color=Cyan>$$</font>+<a name="line-135"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font>text <font color=Magenta>"| n==n' = translate (attr2str v)"</font> <font color=Cyan>$$</font>+<a name="line-136"></a> text <font color=Magenta>"| otherwise = Nothing"</font><font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-137"></a> nest <font color=Magenta>2</font> <font color=Cyan>(</font>text <font color=Magenta>"where"</font> <font color=Cyan><+></font> mkTranslate es<font color=Cyan>)</font>+<a name="line-138"></a> <font color=Cyan>$$</font>+<a name="line-139"></a> vcat <font color=Cyan>(</font>map mkToAttr es<font color=Cyan>)</font>+<a name="line-140"></a> <font color=Cyan>)</font>+<a name="line-141"></a>+<a name="line-142"></a>+<a name="line-143"></a><a name="SameName"></a><font color=Green><u>data</u></font> SameName <font color=Red>=</font> Same <font color=Red>|</font> Extended+<a name="line-144"></a>+<a name="line-145"></a><a name="mkInstanceAttrs"></a><font color=Blue>mkInstanceAttrs</font> <font color=Red>::</font> SameName <font color=Red>-></font> Name <font color=Red>-></font> AttrFields <font color=Red>-></font> Doc+<a name="line-146"></a><font color=Blue>mkInstanceAttrs</font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> [] <font color=Red>=</font> empty+<a name="line-147"></a><font color=Blue>mkInstanceAttrs</font> s n fs <font color=Red>=</font>+<a name="line-148"></a> <font color=Green><u>let</u></font> ppName <font color=Red>=</font> <font color=Green><u>case</u></font> s <font color=Green><u>of</u></font> <font color=Cyan>{</font> Same<font color=Red>-></font> ppHName<font color=Cyan>;</font> Extended<font color=Red>-></font> ppAName<font color=Cyan>;</font> <font color=Cyan>}</font>+<a name="line-149"></a> <font color=Green><u>in</u></font>+<a name="line-150"></a> text <font color=Magenta>"instance XmlAttributes"</font> <font color=Cyan><+></font> ppName n <font color=Cyan><+></font> text <font color=Magenta>"where"</font> <font color=Cyan>$$</font>+<a name="line-151"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"fromAttrs as ="</font> <font color=Cyan>$$</font>+<a name="line-152"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> ppName n <font color=Cyan>$$</font>+<a name="line-153"></a> nest <font color=Magenta>2</font> <font color=Cyan>(</font>vcat <font color=Cyan>(</font><font color=Cyan>(</font>text <font color=Magenta>"{"</font> <font color=Cyan><+></font> mkFrFld n <font color=Cyan>(</font>head fs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Red><b>:</b></font>+<a name="line-154"></a> map <font color=Cyan>(</font><font color=Red>\</font>x<font color=Red>-></font> comma <font color=Cyan><+></font> mkFrFld n x<font color=Cyan>)</font> <font color=Cyan>(</font>tail fs<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-155"></a> text <font color=Magenta>"}"</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-156"></a> <font color=Cyan>$$</font>+<a name="line-157"></a> text <font color=Magenta>"toAttrs v = catMaybes "</font> <font color=Cyan>$$</font>+<a name="line-158"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font>vcat <font color=Cyan>(</font><font color=Cyan>(</font>text <font color=Magenta>"["</font> <font color=Cyan><+></font> mkToFld <font color=Cyan>(</font>head fs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Red><b>:</b></font>+<a name="line-159"></a> map <font color=Cyan>(</font><font color=Red>\</font>x<font color=Red>-></font> comma <font color=Cyan><+></font> mkToFld x<font color=Cyan>)</font> <font color=Cyan>(</font>tail fs<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-160"></a> text <font color=Magenta>"]"</font><font color=Cyan>)</font>+<a name="line-161"></a> <font color=Cyan>)</font>+<a name="line-162"></a>+<a name="line-163"></a>+<a name="line-164"></a><a name="attrpats"></a><font color=Blue>-- respectively (frpat,frattr,topat,toattr)</font>+<a name="line-165"></a><font color=Blue>attrpats</font> <font color=Red>::</font> AttrFields <font color=Red>-></font> <font color=Cyan>(</font>Doc<font color=Cyan>,</font>Doc<font color=Cyan>,</font>Doc<font color=Cyan>,</font>Doc<font color=Cyan>)</font>+<a name="line-166"></a><font color=Blue>attrpats</font> fs <font color=Red>=</font>+<a name="line-167"></a> <font color=Green><u>if</u></font> null fs <font color=Green><u>then</u></font> <font color=Cyan>(</font>text <font color=Magenta>"[]"</font><font color=Cyan>,</font> empty<font color=Cyan>,</font> empty<font color=Cyan>,</font> text <font color=Magenta>"[]"</font><font color=Cyan>)</font>+<a name="line-168"></a> <font color=Green><u>else</u></font> <font color=Cyan>(</font>text <font color=Magenta>"as"</font><font color=Cyan>,</font> parens <font color=Cyan>(</font>text <font color=Magenta>"fromAttrs as"</font><font color=Cyan>)</font><font color=Cyan>,</font> text <font color=Magenta>"as"</font><font color=Cyan>,</font> parens <font color=Cyan>(</font>text <font color=Magenta>"toAttrs as"</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-169"></a>+<a name="line-170"></a>+<a name="line-171"></a>+<a name="line-172"></a>+<a name="line-173"></a><font color=Blue>-- mkFrElem :: Name -> [StructType] -> [Doc] -> Doc -> Doc</font>+<a name="line-174"></a><font color=Blue>-- mkFrElem n sts vs inner =</font>+<a name="line-175"></a><font color=Blue>-- foldr (frElem n) inner (zip3 sts vs cvs)</font>+<a name="line-176"></a><font color=Blue>-- where</font>+<a name="line-177"></a><font color=Blue>-- cvs = let ns = nameSupply2 vs</font>+<a name="line-178"></a><font color=Blue>-- in zip ns (text "c0": init ns)</font>+<a name="line-179"></a><font color=Blue>-- frElem _ (st,v,(cvi,cvo)) inner =</font>+<a name="line-180"></a><font color=Blue>-- parens (text "\\" <> parens (v<>comma<>cvi) <> text "->" $$</font>+<a name="line-181"></a><font color=Blue>-- nest 2 inner) $$</font>+<a name="line-182"></a><font color=Blue>-- parens (</font>+<a name="line-183"></a><font color=Blue>-- case st of</font>+<a name="line-184"></a><font color=Blue>-- (Maybe String) -> text "fromText" <+> cvo</font>+<a name="line-185"></a><font color=Blue>-- (Maybe _) -> text "fromElem" <+> cvo</font>+<a name="line-186"></a><font color=Blue>-- (List String) -> text "many fromText" <+> cvo</font>+<a name="line-187"></a><font color=Blue>-- (List _) -> text "many fromElem" <+> cvo</font>+<a name="line-188"></a><font color=Blue>-- (List1 s) -> text "definite fromElem"</font>+<a name="line-189"></a><font color=Blue>-- <+> text "\"" <> text (show s)<> text "+\""</font>+<a name="line-190"></a><font color=Blue>-- <+> text "\"" <> ppXName n <> text "\""</font>+<a name="line-191"></a><font color=Blue>-- <+> cvo</font>+<a name="line-192"></a><font color=Blue>-- (Tuple ss) -> text "definite fromElem"</font>+<a name="line-193"></a><font color=Blue>-- <+> text "\"(" <> hcat (intersperse (text ",")</font>+<a name="line-194"></a><font color=Blue>-- (map (text.show) ss))</font>+<a name="line-195"></a><font color=Blue>-- <> text ")\""</font>+<a name="line-196"></a><font color=Blue>-- <+> text "\"" <> ppXName n <> text "\""</font>+<a name="line-197"></a><font color=Blue>-- <+> cvo</font>+<a name="line-198"></a><font color=Blue>-- (OneOf _) -> text "definite fromElem"</font>+<a name="line-199"></a><font color=Blue>-- <+> text "\"OneOf\""</font>+<a name="line-200"></a><font color=Blue>-- <+> text "\"" <> ppXName n <> text "\""</font>+<a name="line-201"></a><font color=Blue>-- <+> cvo</font>+<a name="line-202"></a><font color=Blue>-- (String) -> text "definite fromText" <+> text "\"text\" \"" <></font>+<a name="line-203"></a><font color=Blue>-- ppXName n <> text "\"" <+> cvo</font>+<a name="line-204"></a><font color=Blue>-- (Any) -> text "definite fromElem" <+> text "\"ANY\" \"" <></font>+<a name="line-205"></a><font color=Blue>-- ppXName n <> text "\"" <+> cvo</font>+<a name="line-206"></a><font color=Blue>-- (Defined m) -> text "definite fromElem" <+></font>+<a name="line-207"></a><font color=Blue>-- text "\"<" <> ppXName m <> text ">\" \"" <></font>+<a name="line-208"></a><font color=Blue>-- ppXName m <> text "\"" <+> cvo</font>+<a name="line-209"></a><font color=Blue>-- (Defaultable _ _) -> text "nyi_fromElem_Defaultable" <+> cvo</font>+<a name="line-210"></a><font color=Blue>-- )</font>+<a name="line-211"></a>+<a name="line-212"></a><a name="mkParseConstr"></a><font color=Blue>--</font>+<a name="line-213"></a><font color=Blue>{-+<a name="line-214"></a>mkParseContents :: Name -> [StructType] -> [Doc] -> Doc -> Doc+<a name="line-215"></a>mkParseContents n sts vs inner =+<a name="line-216"></a> foldr (frElem n) inner (zip3 sts vs cvs)+<a name="line-217"></a> where+<a name="line-218"></a> cvs = let ns = nameSupply2 vs+<a name="line-219"></a> in zip ns (text "c0": init ns)+<a name="line-220"></a> frElem n (st,v,(cvi,cvo)) inner =+<a name="line-221"></a> parens (text "\\" <> parens (v<>comma<>cvi) <> text "->" $$+<a name="line-222"></a> nest 2 inner) $$+<a name="line-223"></a> parens (+<a name="line-224"></a> )+<a name="line-225"></a>-}</font>+<a name="line-226"></a><font color=Blue>mkParseConstr</font> <font color=Red>::</font> Doc <font color=Red>-></font> <font color=Cyan>(</font>Name<font color=Cyan>,</font> <font color=Red>[</font>StructType<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> Doc+<a name="line-227"></a><font color=Blue>mkParseConstr</font> frattr <font color=Cyan>(</font>c<font color=Cyan>,</font>sts<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-228"></a> fsep <font color=Cyan>(</font>text <font color=Magenta>"return"</font> <font color=Cyan><+></font> parens <font color=Cyan>(</font>ppHName c <font color=Cyan><+></font> frattr<font color=Cyan>)</font>+<a name="line-229"></a> <font color=Red><b>:</b></font> map mkParseContents sts<font color=Cyan>)</font>+<a name="line-230"></a>+<a name="line-231"></a><a name="mkParseContents"></a><font color=Blue>mkParseContents</font> <font color=Red>::</font> StructType <font color=Red>-></font> Doc+<a name="line-232"></a><font color=Blue>mkParseContents</font> st <font color=Red>=</font>+<a name="line-233"></a> <font color=Green><u>let</u></font> ap <font color=Red>=</font> text <font color=Magenta>"`apply`"</font> <font color=Green><u>in</u></font>+<a name="line-234"></a> <font color=Green><u>case</u></font> st <font color=Green><u>of</u></font>+<a name="line-235"></a> <font color=Cyan>(</font>Maybe String<font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"optional text"</font>+<a name="line-236"></a> <font color=Cyan>(</font>Maybe <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"optional parseContents"</font>+<a name="line-237"></a> <font color=Cyan>(</font>List String<font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"many text"</font>+<a name="line-238"></a> <font color=Cyan>(</font>List <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"many parseContents"</font>+<a name="line-239"></a> <font color=Cyan>(</font>List1 <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"parseContents"</font>+<a name="line-240"></a> <font color=Cyan>(</font>Tuple <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"parseContents"</font>+<a name="line-241"></a> <font color=Cyan>(</font>OneOf <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"parseContents"</font>+<a name="line-242"></a> <font color=Cyan>(</font>String<font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"(text `onFail` return \"\")"</font>+<a name="line-243"></a> <font color=Cyan>(</font>Any<font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"parseContents"</font>+<a name="line-244"></a> <font color=Cyan>(</font>Defined <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"parseContents"</font>+<a name="line-245"></a> <font color=Cyan>(</font>Defaultable <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> ap <font color=Cyan><+></font> text <font color=Magenta>"nyi_fromElem_Defaultable"</font>+<a name="line-246"></a>+<a name="line-247"></a><a name="mkToElem"></a><font color=Blue>--</font>+<a name="line-248"></a><font color=Blue>mkToElem</font> <font color=Red>::</font> <font color=Red>[</font>StructType<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Doc<font color=Red>]</font> <font color=Red>-></font> Doc+<a name="line-249"></a><font color=Blue>mkToElem</font> [] [] <font color=Red>=</font> text <font color=Magenta>"[]"</font>+<a name="line-250"></a><font color=Blue>mkToElem</font> sts vs <font color=Red>=</font>+<a name="line-251"></a> fsep <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"++"</font><font color=Cyan>)</font> <font color=Cyan>(</font>zipWith toElem sts vs<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-252"></a> <font color=Green><u>where</u></font>+<a name="line-253"></a> toElem st v <font color=Red>=</font>+<a name="line-254"></a> <font color=Green><u>case</u></font> st <font color=Green><u>of</u></font>+<a name="line-255"></a> <font color=Cyan>(</font>Maybe String<font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"maybe [] toText"</font> <font color=Cyan><+></font> v+<a name="line-256"></a> <font color=Cyan>(</font>Maybe <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"maybe [] toContents"</font> <font color=Cyan><+></font> v+<a name="line-257"></a> <font color=Cyan>(</font>List String<font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"concatMap toText"</font> <font color=Cyan><+></font> v+<a name="line-258"></a> <font color=Cyan>(</font>List <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"concatMap toContents"</font> <font color=Cyan><+></font> v+<a name="line-259"></a> <font color=Cyan>(</font>List1 <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> v+<a name="line-260"></a> <font color=Cyan>(</font>Tuple <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> v+<a name="line-261"></a> <font color=Cyan>(</font>OneOf <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> v+<a name="line-262"></a> <font color=Cyan>(</font>String<font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"toText"</font> <font color=Cyan><+></font> v+<a name="line-263"></a> <font color=Cyan>(</font>Any<font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> v+<a name="line-264"></a> <font color=Cyan>(</font>Defined <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> v+<a name="line-265"></a> <font color=Cyan>(</font>Defaultable <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"nyi_toElem_Defaultable"</font> <font color=Cyan><+></font> v+<a name="line-266"></a>+<a name="line-267"></a><font color=Blue>-- mkRpat :: [Doc] -> Doc</font>+<a name="line-268"></a><font color=Blue>-- mkRpat [v] = v</font>+<a name="line-269"></a><font color=Blue>-- mkRpat vs = (parens . hcat . intersperse comma) vs</font>+<a name="line-270"></a>+<a name="line-271"></a><a name="mkCpat"></a><font color=Blue>mkCpat</font> <font color=Red>::</font> Name <font color=Red>-></font> Doc <font color=Red>-></font> <font color=Red>[</font>Doc<font color=Red>]</font> <font color=Red>-></font> Doc+<a name="line-272"></a><font color=Blue>mkCpat</font> n i vs <font color=Red>=</font> ppHName n <font color=Cyan><+></font> i <font color=Cyan><+></font> fsep vs+<a name="line-273"></a>+<a name="line-274"></a><a name="nameSupply"></a><font color=Blue>nameSupply</font> <font color=Red>::</font> <font color=Red>[</font>b<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Doc<font color=Red>]</font>+<a name="line-275"></a><font color=Blue>nameSupply</font> ss <font color=Red>=</font> take <font color=Cyan>(</font>length ss<font color=Cyan>)</font> <font color=Cyan>(</font>map char <font color=Red>[</font><font color=Magenta>'a'</font><font color=Red>..</font><font color=Magenta>'z'</font><font color=Red>]</font>+<a name="line-276"></a> <font color=Cyan>++</font> map text <font color=Red>[</font> a<font color=Red><b>:</b></font>n<font color=Red><b>:</b></font>[] <font color=Red>|</font> n <font color=Red><-</font> <font color=Red>[</font><font color=Magenta>'0'</font><font color=Red>..</font><font color=Magenta>'9'</font><font color=Red>]</font>+<a name="line-277"></a> <font color=Cyan>,</font> a <font color=Red><-</font> <font color=Red>[</font><font color=Magenta>'a'</font><font color=Red>..</font><font color=Magenta>'z'</font><font color=Red>]</font> <font color=Red>]</font><font color=Cyan>)</font>+<a name="line-278"></a><font color=Blue>-- nameSupply2 ss = take (length ss) [ text ('c':v:[]) | v <- ['a'..]]</font>+<a name="line-279"></a>+<a name="line-280"></a><a name="mkTranslate"></a><font color=Blue>mkTranslate</font> <font color=Red>::</font> <font color=Red>[</font>Name<font color=Red>]</font> <font color=Red>-></font> Doc+<a name="line-281"></a><font color=Blue>mkTranslate</font> es <font color=Red>=</font>+<a name="line-282"></a> vcat <font color=Cyan>(</font>map trans es<font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-283"></a> text <font color=Magenta>"translate _ = Nothing"</font>+<a name="line-284"></a> <font color=Green><u>where</u></font>+<a name="line-285"></a> trans n <font color=Red>=</font> text <font color=Magenta>"translate \""</font> <font color=Cyan><></font> ppXName n <font color=Cyan><></font> text <font color=Magenta>"\" ="</font> <font color=Cyan><+></font>+<a name="line-286"></a> text <font color=Magenta>"Just"</font> <font color=Cyan><+></font> ppHName n+<a name="line-287"></a>+<a name="line-288"></a><a name="mkToAttr"></a><font color=Blue>mkToAttr</font> <font color=Red>::</font> Name <font color=Red>-></font> Doc+<a name="line-289"></a><font color=Blue>mkToAttr</font> n <font color=Red>=</font> text <font color=Magenta>"toAttrFrTyp n"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"="</font> <font color=Cyan><+></font>+<a name="line-290"></a> text <font color=Magenta>"Just (n, str2attr"</font> <font color=Cyan><+></font> doubleQuotes <font color=Cyan>(</font>ppXName n<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>")"</font>+<a name="line-291"></a>+<a name="line-292"></a><a name="mkFrFld"></a><font color=Blue>mkFrFld</font> <font color=Red>::</font> Name <font color=Red>-></font> <font color=Cyan>(</font>Name<font color=Cyan>,</font>StructType<font color=Cyan>)</font> <font color=Red>-></font> Doc+<a name="line-293"></a><font color=Blue>mkFrFld</font> tag <font color=Cyan>(</font>n<font color=Cyan>,</font>st<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-294"></a> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"="</font> <font color=Cyan><+></font>+<a name="line-295"></a> <font color=Cyan>(</font> <font color=Green><u>case</u></font> st <font color=Green><u>of</u></font>+<a name="line-296"></a> <font color=Cyan>(</font>Defaultable String s<font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"defaultA fromAttrToStr"</font> <font color=Cyan><+></font>+<a name="line-297"></a> doubleQuotes <font color=Cyan>(</font>text s<font color=Cyan>)</font>+<a name="line-298"></a> <font color=Cyan>(</font>Defaultable <font color=Green><u>_</u></font> s<font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"defaultA fromAttrToTyp"</font> <font color=Cyan><+></font> text s+<a name="line-299"></a> <font color=Cyan>(</font>Maybe String<font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"possibleA fromAttrToStr"</font>+<a name="line-300"></a> <font color=Cyan>(</font>Maybe <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"possibleA fromAttrToTyp"</font>+<a name="line-301"></a> String <font color=Red>-></font> text <font color=Magenta>"definiteA fromAttrToStr"</font> <font color=Cyan><+></font>+<a name="line-302"></a> doubleQuotes <font color=Cyan>(</font>ppXName tag<font color=Cyan>)</font>+<a name="line-303"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> text <font color=Magenta>"definiteA fromAttrToTyp"</font> <font color=Cyan><+></font>+<a name="line-304"></a> doubleQuotes <font color=Cyan>(</font>ppXName tag<font color=Cyan>)</font>+<a name="line-305"></a> <font color=Cyan>)</font> <font color=Cyan><+></font> doubleQuotes <font color=Cyan>(</font>ppXName n<font color=Cyan>)</font> <font color=Cyan><+></font> text <font color=Magenta>"as"</font>+<a name="line-306"></a>+<a name="line-307"></a><a name="mkToFld"></a><font color=Blue>mkToFld</font> <font color=Red>::</font> <font color=Cyan>(</font>Name<font color=Cyan>,</font>StructType<font color=Cyan>)</font> <font color=Red>-></font> Doc+<a name="line-308"></a><font color=Blue>mkToFld</font> <font color=Cyan>(</font>n<font color=Cyan>,</font>st<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-309"></a> <font color=Cyan>(</font> <font color=Green><u>case</u></font> st <font color=Green><u>of</u></font>+<a name="line-310"></a> <font color=Cyan>(</font>Defaultable String <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"defaultToAttr toAttrFrStr"</font>+<a name="line-311"></a> <font color=Cyan>(</font>Defaultable <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"defaultToAttr toAttrFrTyp"</font>+<a name="line-312"></a> <font color=Cyan>(</font>Maybe String<font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"maybeToAttr toAttrFrStr"</font>+<a name="line-313"></a> <font color=Cyan>(</font>Maybe <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> text <font color=Magenta>"maybeToAttr toAttrFrTyp"</font>+<a name="line-314"></a> String <font color=Red>-></font> text <font color=Magenta>"toAttrFrStr"</font>+<a name="line-315"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> text <font color=Magenta>"toAttrFrTyp"</font>+<a name="line-316"></a> <font color=Cyan>)</font> <font color=Cyan><+></font> doubleQuotes <font color=Cyan>(</font>ppXName n<font color=Cyan>)</font> <font color=Cyan><+></font> parens <font color=Cyan>(</font>ppHName n <font color=Cyan><+></font> text <font color=Magenta>"v"</font><font color=Cyan>)</font>+<a name="line-317"></a>+<a name="line-318"></a><font color=Blue>-- mkFrAux :: Bool -> Doc -> [(Name,[StructType])] -> Doc</font>+<a name="line-319"></a><font color=Blue>-- mkFrAux keeprest attrs cs = foldr frAux inner cs</font>+<a name="line-320"></a><font color=Blue>-- where</font>+<a name="line-321"></a><font color=Blue>-- inner = text "(Nothing, c0)"</font>+<a name="line-322"></a><font color=Blue>-- rest = if keeprest then text "rest" else text "_"</font>+<a name="line-323"></a><font color=Blue>-- frAux (n,sts) innr =</font>+<a name="line-324"></a><font color=Blue>-- let vs = nameSupply sts in</font>+<a name="line-325"></a><font color=Blue>-- nest 4 (text "case" <+> blah sts vs <+> text "of" $$</font>+<a name="line-326"></a><font color=Blue>-- succpat sts vs <+> text "-> (Just" <+></font>+<a name="line-327"></a><font color=Blue>-- parens (mkCpat n attrs vs) <> text ", rest)"</font>+<a name="line-328"></a><font color=Blue>-- $$</font>+<a name="line-329"></a><font color=Blue>-- failpat sts <+> text "->" $$ nest 4 innr</font>+<a name="line-330"></a><font color=Blue>-- )</font>+<a name="line-331"></a><font color=Blue>-- blah [st] [_] =</font>+<a name="line-332"></a><font color=Blue>-- blahblahblah st (text "c0")</font>+<a name="line-333"></a><font color=Blue>-- blah sts vs =</font>+<a name="line-334"></a><font color=Blue>-- let ns = nameSupply2 vs</font>+<a name="line-335"></a><font color=Blue>-- cvs = zip ns (text "c0": init ns)</font>+<a name="line-336"></a><font color=Blue>-- blahblah (st,v,(cvi,cvo)) innr =</font>+<a name="line-337"></a><font color=Blue>-- parens (text "\\" <> parens (v<>comma<>cvi) <> text "->" $$</font>+<a name="line-338"></a><font color=Blue>-- nest 2 innr) $$</font>+<a name="line-339"></a><font color=Blue>-- blahblahblah st cvo</font>+<a name="line-340"></a><font color=Blue>-- in</font>+<a name="line-341"></a><font color=Blue>-- foldr blahblah (mkRpat (vs++[last ns])) (zip3 sts vs cvs)</font>+<a name="line-342"></a><font color=Blue>-- blahblahblah st cvo = parens (</font>+<a name="line-343"></a><font color=Blue>-- case st of</font>+<a name="line-344"></a><font color=Blue>-- (Maybe String) -> text "fromText" <+> cvo</font>+<a name="line-345"></a><font color=Blue>-- (Maybe _) -> text "fromElem" <+> cvo</font>+<a name="line-346"></a><font color=Blue>-- (List String) -> text "many fromText" <+> cvo</font>+<a name="line-347"></a><font color=Blue>-- (List _) -> text "many fromElem" <+> cvo</font>+<a name="line-348"></a><font color=Blue>-- (List1 _) -> text "fromElem" <+> cvo</font>+<a name="line-349"></a><font color=Blue>-- (Tuple _) -> text "fromElem" <+> cvo -- ??</font>+<a name="line-350"></a><font color=Blue>-- (OneOf _) -> text "fromElem" <+> cvo</font>+<a name="line-351"></a><font color=Blue>-- (String) -> text "fromText" <+> cvo</font>+<a name="line-352"></a><font color=Blue>-- (Any) -> text "fromElem" <+> cvo</font>+<a name="line-353"></a><font color=Blue>-- (Defined _) -> text "fromElem" <+> cvo</font>+<a name="line-354"></a><font color=Blue>-- )</font>+<a name="line-355"></a><font color=Blue>-- failpat sts =</font>+<a name="line-356"></a><font color=Blue>-- let fp st =</font>+<a name="line-357"></a><font color=Blue>-- case st of</font>+<a name="line-358"></a><font color=Blue>-- (Maybe _) -> text "Nothing"</font>+<a name="line-359"></a><font color=Blue>-- (List _) -> text "[]"</font>+<a name="line-360"></a><font color=Blue>-- (List1 _) -> text "_"</font>+<a name="line-361"></a><font color=Blue>-- (Tuple _) -> text "_"</font>+<a name="line-362"></a><font color=Blue>-- (OneOf _) -> text "_"</font>+<a name="line-363"></a><font color=Blue>-- (String) -> text "_"</font>+<a name="line-364"></a><font color=Blue>-- (Any) -> text "_"</font>+<a name="line-365"></a><font color=Blue>-- (Defined _) -> text "_"</font>+<a name="line-366"></a><font color=Blue>-- in parens (hcat (intersperse comma (map fp sts++[text "_"])))</font>+<a name="line-367"></a><font color=Blue>-- succpat sts vs =</font>+<a name="line-368"></a><font color=Blue>-- let sp st v =</font>+<a name="line-369"></a><font color=Blue>-- case st of</font>+<a name="line-370"></a><font color=Blue>-- (Maybe _) -> v</font>+<a name="line-371"></a><font color=Blue>-- (List _) -> v</font>+<a name="line-372"></a><font color=Blue>-- (List1 _) -> text "Just" <+> v</font>+<a name="line-373"></a><font color=Blue>-- (Tuple _) -> text "Just" <+> v</font>+<a name="line-374"></a><font color=Blue>-- (OneOf _) -> text "Just" <+> v</font>+<a name="line-375"></a><font color=Blue>-- (String) -> text "Just" <+> v</font>+<a name="line-376"></a><font color=Blue>-- (Any) -> text "Just" <+> v</font>+<a name="line-377"></a><font color=Blue>-- (Defined _) -> text "Just" <+> v</font>+<a name="line-378"></a><font color=Blue>-- in parens (hcat (intersperse comma (zipWith sp sts vs++[rest])))</font>+<a name="line-379"></a>+<a name="line-380"></a><a name="mkToAux"></a><font color=Blue>mkToAux</font> <font color=Red>::</font> Bool <font color=Red>-></font> <font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>StructType<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> Doc+<a name="line-381"></a><font color=Blue>mkToAux</font> mixattrs <font color=Cyan>(</font>n<font color=Cyan>,</font>sts<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-382"></a> <font color=Green><u>let</u></font> vs <font color=Red>=</font> nameSupply sts+<a name="line-383"></a> attrs <font color=Red>=</font> <font color=Green><u>if</u></font> mixattrs <font color=Green><u>then</u></font> text <font color=Magenta>"as"</font> <font color=Green><u>else</u></font> empty+<a name="line-384"></a> <font color=Green><u>in</u></font>+<a name="line-385"></a> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> parens <font color=Cyan>(</font>mkCpat n attrs vs<font color=Cyan>)</font> <font color=Cyan><+></font> text <font color=Magenta>"="</font> <font color=Cyan><+></font>+<a name="line-386"></a> mkToElem sts vs+<a name="line-387"></a>+<a name="line-388"></a><a name="mkToMult"></a><font color=Blue>mkToMult</font> <font color=Red>::</font> Name <font color=Red>-></font> Doc <font color=Red>-></font> Doc <font color=Red>-></font> <font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>StructType<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> Doc+<a name="line-389"></a><font color=Blue>mkToMult</font> tag attrpat attrexp <font color=Cyan>(</font>n<font color=Cyan>,</font>sts<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-390"></a> <font color=Green><u>let</u></font> vs <font color=Red>=</font> nameSupply sts+<a name="line-391"></a> <font color=Green><u>in</u></font>+<a name="line-392"></a> text <font color=Magenta>"toContents"</font> <font color=Cyan><+></font> parens <font color=Cyan>(</font>mkCpat n attrpat vs<font color=Cyan>)</font> <font color=Cyan><+></font> text <font color=Magenta>"="</font>+<a name="line-393"></a> <font color=Cyan>$$</font> nest <font color=Magenta>4</font> <font color=Cyan>(</font>text <font color=Magenta>"[CElem (Elem \""</font> <font color=Cyan><></font> ppXName tag <font color=Cyan><></font> text <font color=Magenta>"\""</font><font color=Cyan><+></font> attrexp+<a name="line-394"></a> <font color=Cyan><+></font> parens <font color=Cyan>(</font>mkToElem sts vs<font color=Cyan>)</font> <font color=Cyan><+></font> text <font color=Magenta>") ()]"</font><font color=Cyan>)</font>+<a name="line-395"></a> </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/DtdToHaskell/TypeDef.html view
@@ -1,252 +1,258 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>-- | Defines an internal representation of Haskell data\/newtype definitions</font>-<a name="(line2)"></a><font color=Blue>-- that correspond to the XML DTD types, and provides pretty-printers to</font>-<a name="(line3)"></a><font color=Blue>-- convert these types into the 'Doc' type of "Text.PrettyPrint.HughesPJ".</font>-<a name="(line4)"></a>-<a name="(line5)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>DtdToHaskell<font color=Cyan>.</font>TypeDef-<a name="(line6)"></a> <font color=Cyan>(</font> <font color=Blue>-- * Internal representation of types</font>-<a name="(line7)"></a> TypeDef<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line8)"></a> <font color=Cyan>,</font> Constructors-<a name="(line9)"></a> <font color=Cyan>,</font> AttrFields-<a name="(line10)"></a> <font color=Cyan>,</font> StructType<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line11)"></a> <font color=Blue>-- * Pretty-print a TypeDef</font>-<a name="(line12)"></a> <font color=Cyan>,</font> ppTypeDef-<a name="(line13)"></a> <font color=Cyan>,</font> ppHName-<a name="(line14)"></a> <font color=Cyan>,</font> ppXName-<a name="(line15)"></a> <font color=Cyan>,</font> ppAName-<a name="(line16)"></a> <font color=Blue>-- * Name mangling</font>-<a name="(line17)"></a> <font color=Cyan>,</font> Name<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line18)"></a> <font color=Cyan>,</font> name<font color=Cyan>,</font> name_<font color=Cyan>,</font> name_a<font color=Cyan>,</font> name_ac<font color=Cyan>,</font> name_f<font color=Cyan>,</font> mangle<font color=Cyan>,</font> manglef-<a name="(line19)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line20)"></a>-<a name="(line21)"></a><font color=Green><u>import</u></font> Char <font color=Cyan>(</font>isLower<font color=Cyan>,</font> isUpper<font color=Cyan>,</font> toLower<font color=Cyan>,</font> toUpper<font color=Cyan>,</font> isDigit<font color=Cyan>)</font>-<a name="(line22)"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>intersperse<font color=Cyan>)</font>-<a name="(line23)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>PrettyPrint<font color=Cyan>.</font>HughesPJ-<a name="(line24)"></a>-<a name="(line25)"></a>-<a name="(line26)"></a><font color=Blue>---- Internal representation for typedefs ----</font>-<a name="(line27)"></a>-<a name="(line28)"></a><a name="Name"></a><font color=Blue>-- | Need to keep both the XML and Haskell versions of a name.</font>-<a name="(line29)"></a><a name="Name"></a><font color=Green><u>data</u></font> Name <font color=Red>=</font> Name <font color=Cyan>{</font> xName <font color=Red>::</font> String <font color=Blue>-- ^ original XML name</font>-<a name="(line30)"></a> <font color=Cyan>,</font> hName <font color=Red>::</font> String <font color=Blue>-- ^ mangled Haskell name</font>-<a name="(line31)"></a> <font color=Cyan>}</font>-<a name="(line32)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line33)"></a>-<a name="(line34)"></a><a name="TypeDef"></a><font color=Green><u>data</u></font> TypeDef <font color=Red>=</font>-<a name="(line35)"></a> DataDef Bool Name AttrFields Constructors <font color=Blue>-- ^ Bool for main\/aux.</font>-<a name="(line36)"></a> <font color=Red>|</font> EnumDef Name <font color=Red>[</font>Name<font color=Red>]</font>-<a name="(line37)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line38)"></a><a name="Constructors"></a><font color=Green><u>type</u></font> Constructors <font color=Red>=</font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>StructType<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font>-<a name="(line39)"></a><a name="AttrFields"></a><font color=Green><u>type</u></font> AttrFields <font color=Red>=</font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font> StructType<font color=Cyan>)</font><font color=Red>]</font>-<a name="(line40)"></a><a name="StructType"></a><font color=Green><u>data</u></font> StructType <font color=Red>=</font>-<a name="(line41)"></a> Maybe StructType-<a name="(line42)"></a> <font color=Red>|</font> Defaultable StructType String <font color=Blue>-- ^ String holds default value.</font>-<a name="(line43)"></a> <font color=Red>|</font> List StructType-<a name="(line44)"></a> <font color=Red>|</font> List1 StructType <font color=Blue>-- ^ Non-empty lists.</font>-<a name="(line45)"></a> <font color=Red>|</font> Tuple <font color=Red>[</font>StructType<font color=Red>]</font>-<a name="(line46)"></a> <font color=Red>|</font> OneOf <font color=Red>[</font>StructType<font color=Red>]</font>-<a name="(line47)"></a> <font color=Red>|</font> Any <font color=Blue>-- ^ XML's contentspec allows ANY</font>-<a name="(line48)"></a> <font color=Red>|</font> String-<a name="(line49)"></a> <font color=Red>|</font> Defined Name-<a name="(line50)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line51)"></a>-<a name="(line52)"></a><font color=Blue>-- used for converting StructType (roughly) back to an XML content model</font>-<a name="(line53)"></a><font color=Green><u>instance</u></font> Show StructType <font color=Green><u>where</u></font>-<a name="(line54)"></a> showsPrec p <font color=Cyan>(</font>Maybe s<font color=Cyan>)</font> <font color=Red>=</font> showsPrec <font color=Cyan>(</font>p<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> s <font color=Cyan>.</font> showChar <font color=Magenta>'?'</font>-<a name="(line55)"></a> showsPrec <font color=Green><u>_</u></font> <font color=Cyan>(</font>Defaultable s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> shows s-<a name="(line56)"></a> showsPrec p <font color=Cyan>(</font>List s<font color=Cyan>)</font> <font color=Red>=</font> showsPrec <font color=Cyan>(</font>p<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> s <font color=Cyan>.</font> showChar <font color=Magenta>'*'</font>-<a name="(line57)"></a> showsPrec p <font color=Cyan>(</font>List1 s<font color=Cyan>)</font> <font color=Red>=</font> showsPrec <font color=Cyan>(</font>p<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> s <font color=Cyan>.</font> showChar <font color=Magenta>'+'</font>-<a name="(line58)"></a> showsPrec <font color=Green><u>_</u></font> <font color=Cyan>(</font>Tuple ss<font color=Cyan>)</font> <font color=Red>=</font> showChar <font color=Magenta>'('</font>-<a name="(line59)"></a> <font color=Cyan>.</font> foldr1 <font color=Cyan>(</font><font color=Cyan>.</font><font color=Cyan>)</font> <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>showChar <font color=Magenta>','</font><font color=Cyan>)</font>-<a name="(line60)"></a> <font color=Cyan>(</font>map shows ss<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line61)"></a> <font color=Cyan>.</font> showChar <font color=Magenta>')'</font>-<a name="(line62)"></a> showsPrec <font color=Green><u>_</u></font> <font color=Cyan>(</font>OneOf ss<font color=Cyan>)</font> <font color=Red>=</font> showChar <font color=Magenta>'('</font>-<a name="(line63)"></a> <font color=Cyan>.</font> foldr1 <font color=Cyan>(</font><font color=Cyan>.</font><font color=Cyan>)</font> <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>showChar <font color=Magenta>'|'</font><font color=Cyan>)</font>-<a name="(line64)"></a> <font color=Cyan>(</font>map shows ss<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line65)"></a> <font color=Cyan>.</font> showChar <font color=Magenta>')'</font>-<a name="(line66)"></a> showsPrec <font color=Green><u>_</u></font> <font color=Cyan>(</font>Any<font color=Cyan>)</font> <font color=Red>=</font> showString <font color=Magenta>"ANY"</font>-<a name="(line67)"></a> showsPrec <font color=Green><u>_</u></font> <font color=Cyan>(</font>String<font color=Cyan>)</font> <font color=Red>=</font> showString <font color=Magenta>"#PCDATA"</font>-<a name="(line68)"></a> showsPrec <font color=Green><u>_</u></font> <font color=Cyan>(</font>Defined <font color=Cyan>(</font>Name n <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> showString n-<a name="(line69)"></a>-<a name="(line70)"></a>-<a name="(line71)"></a><a name="ppTypeDef"></a><font color=Blue>---- Pretty-printing typedefs ----</font>-<a name="(line72)"></a>ppTypeDef <font color=Red>::</font> TypeDef <font color=Red>-></font> Doc-<a name="(line73)"></a>-<a name="(line74)"></a><font color=Blue>-- no attrs, no constructors</font>-<a name="(line75)"></a>ppTypeDef <font color=Cyan>(</font>DataDef <font color=Green><u>_</u></font> n [] []<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line76)"></a> <font color=Green><u>let</u></font> nme <font color=Red>=</font> ppHName n <font color=Green><u>in</u></font>-<a name="(line77)"></a> text <font color=Magenta>"data"</font> <font color=Cyan><+></font> nme <font color=Cyan><+></font> text <font color=Magenta>"="</font> <font color=Cyan><+></font> nme <font color=Cyan><+></font> text <font color=Magenta>"\t\t"</font> <font color=Cyan><></font> derives-<a name="(line78)"></a>-<a name="(line79)"></a><font color=Blue>-- no attrs, single constructor</font>-<a name="(line80)"></a>ppTypeDef <font color=Cyan>(</font>DataDef <font color=Green><u>_</u></font> n [] <font color=Red>[</font>c<font color=Red>@</font><font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font><font color=Red>[</font><font color=Green><u>_</u></font><font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line81)"></a> text <font color=Magenta>"newtype"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"="</font> <font color=Cyan><+></font> ppC c <font color=Cyan><+></font> text <font color=Magenta>"\t\t"</font> <font color=Cyan><></font> derives-<a name="(line82)"></a>-<a name="(line83)"></a><font color=Blue>-- no attrs, multiple constrs</font>-<a name="(line84)"></a>ppTypeDef <font color=Cyan>(</font>DataDef <font color=Green><u>_</u></font> n [] cs<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line85)"></a> text <font color=Magenta>"data"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font>-<a name="(line86)"></a> <font color=Cyan>(</font> text <font color=Magenta>"="</font> <font color=Cyan><+></font> ppC <font color=Cyan>(</font>head cs<font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line87)"></a> vcat <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font> text <font color=Magenta>"|"</font> <font color=Cyan><+></font> ppC c<font color=Cyan>)</font> <font color=Cyan>(</font>tail cs<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line88)"></a> derives <font color=Cyan>)</font>-<a name="(line89)"></a>-<a name="(line90)"></a><font color=Blue>-- nonzero attrs, no constructors</font>-<a name="(line91)"></a>ppTypeDef <font color=Cyan>(</font>DataDef <font color=Green><u>_</u></font> n fs []<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line92)"></a> <font color=Green><u>let</u></font> nme <font color=Red>=</font> ppHName n <font color=Green><u>in</u></font>-<a name="(line93)"></a> text <font color=Magenta>"data"</font> <font color=Cyan><+></font> nme <font color=Cyan><+></font> text <font color=Magenta>"="</font> <font color=Cyan><+></font> nme <font color=Cyan>$$</font>-<a name="(line94)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"{"</font> <font color=Cyan><+></font> ppF <font color=Cyan>(</font>head fs<font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line95)"></a> vcat <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font>f<font color=Red>-></font> text <font color=Magenta>","</font> <font color=Cyan><+></font> ppF f<font color=Cyan>)</font> <font color=Cyan>(</font>tail fs<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line96)"></a> text <font color=Magenta>"}"</font> <font color=Cyan><+></font> derives <font color=Cyan>)</font>-<a name="(line97)"></a>-<a name="(line98)"></a><font color=Blue>-- nonzero attrs, one or more constrs</font>-<a name="(line99)"></a>ppTypeDef <font color=Cyan>(</font>DataDef <font color=Green><u>_</u></font> n fs cs<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line100)"></a> <font color=Green><u>let</u></font> attr <font color=Red>=</font> ppAName n <font color=Green><u>in</u></font>-<a name="(line101)"></a> text <font color=Magenta>"data"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font>-<a name="(line102)"></a> <font color=Cyan>(</font> text <font color=Magenta>"="</font> <font color=Cyan><+></font> ppAC attr <font color=Cyan>(</font>head cs<font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line103)"></a> vcat <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font> text <font color=Magenta>"|"</font> <font color=Cyan><+></font> ppAC attr c<font color=Cyan>)</font> <font color=Cyan>(</font>tail cs<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line104)"></a> derives <font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line105)"></a> text <font color=Magenta>"data"</font> <font color=Cyan><+></font> attr <font color=Cyan><+></font> text <font color=Magenta>"="</font> <font color=Cyan><+></font> attr <font color=Cyan>$$</font>-<a name="(line106)"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"{"</font> <font color=Cyan><+></font> ppF <font color=Cyan>(</font>head fs<font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line107)"></a> vcat <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font>f<font color=Red>-></font> text <font color=Magenta>","</font> <font color=Cyan><+></font> ppF f<font color=Cyan>)</font> <font color=Cyan>(</font>tail fs<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line108)"></a> text <font color=Magenta>"}"</font> <font color=Cyan><+></font> derives <font color=Cyan>)</font>-<a name="(line109)"></a>-<a name="(line110)"></a><font color=Blue>-- enumerations (of attribute values)</font>-<a name="(line111)"></a>ppTypeDef <font color=Cyan>(</font>EnumDef n es<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line112)"></a> text <font color=Magenta>"data"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font>-<a name="(line113)"></a> <font color=Cyan>(</font> text <font color=Magenta>"="</font> <font color=Cyan><+></font>-<a name="(line114)"></a> fsep <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>" | "</font><font color=Cyan>)</font> <font color=Cyan>(</font>map ppHName es<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line115)"></a> <font color=Cyan>$$</font> derives <font color=Cyan>)</font>-<a name="(line116)"></a>-<a name="(line117)"></a>-<a name="(line118)"></a><a name="ppST"></a>ppST <font color=Red>::</font> StructType <font color=Red>-></font> Doc-<a name="(line119)"></a>ppST <font color=Cyan>(</font>Defaultable st <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>text <font color=Magenta>"Defaultable"</font> <font color=Cyan><+></font> ppST st<font color=Cyan>)</font>-<a name="(line120)"></a>ppST <font color=Cyan>(</font>Maybe st<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>text <font color=Magenta>"Maybe"</font> <font color=Cyan><+></font> ppST st<font color=Cyan>)</font>-<a name="(line121)"></a>ppST <font color=Cyan>(</font>List st<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"["</font> <font color=Cyan><></font> ppST st <font color=Cyan><></font> text <font color=Magenta>"]"</font>-<a name="(line122)"></a>ppST <font color=Cyan>(</font>List1 st<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>text <font color=Magenta>"List1"</font> <font color=Cyan><+></font> ppST st<font color=Cyan>)</font>-<a name="(line123)"></a>ppST <font color=Cyan>(</font>Tuple sts<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>commaList <font color=Cyan>(</font>map ppST sts<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line124)"></a>ppST <font color=Cyan>(</font>OneOf sts<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>text <font color=Magenta>"OneOf"</font> <font color=Cyan><></font> text <font color=Cyan>(</font>show <font color=Cyan>(</font>length sts<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><+></font>-<a name="(line125)"></a> hsep <font color=Cyan>(</font>map ppST sts<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line126)"></a>ppST String <font color=Red>=</font> text <font color=Magenta>"String"</font>-<a name="(line127)"></a>ppST Any <font color=Red>=</font> text <font color=Magenta>"ANYContent"</font>-<a name="(line128)"></a>ppST <font color=Cyan>(</font>Defined n<font color=Cyan>)</font> <font color=Red>=</font> ppHName n-<a name="(line129)"></a>-<a name="(line130)"></a><a name="ppC"></a><font color=Blue>-- constructor and components</font>-<a name="(line131)"></a>ppC <font color=Red>::</font> <font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>StructType<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> Doc-<a name="(line132)"></a>ppC <font color=Cyan>(</font>n<font color=Cyan>,</font>sts<font color=Cyan>)</font> <font color=Red>=</font> ppHName n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map ppST sts<font color=Cyan>)</font>-<a name="(line133)"></a>-<a name="(line134)"></a><a name="ppF"></a><font color=Blue>-- attribute (fieldname and type)</font>-<a name="(line135)"></a>ppF <font color=Red>::</font> <font color=Cyan>(</font>Name<font color=Cyan>,</font>StructType<font color=Cyan>)</font> <font color=Red>-></font> Doc-<a name="(line136)"></a>ppF <font color=Cyan>(</font>n<font color=Cyan>,</font>st<font color=Cyan>)</font> <font color=Red>=</font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"::"</font> <font color=Cyan><+></font> ppST st-<a name="(line137)"></a>-<a name="(line138)"></a><a name="ppAC"></a><font color=Blue>-- constructor and components with initial attr-type</font>-<a name="(line139)"></a>ppAC <font color=Red>::</font> Doc <font color=Red>-></font> <font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>StructType<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> Doc-<a name="(line140)"></a>ppAC atype <font color=Cyan>(</font>n<font color=Cyan>,</font>sts<font color=Cyan>)</font> <font color=Red>=</font> ppHName n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>atype<font color=Red><b>:</b></font> map ppST sts<font color=Cyan>)</font>-<a name="(line141)"></a>-<a name="(line142)"></a><a name="ppHName"></a><font color=Blue>-- | Pretty print Haskell name.</font>-<a name="(line143)"></a>ppHName <font color=Red>::</font> Name <font color=Red>-></font> Doc-<a name="(line144)"></a>ppHName <font color=Cyan>(</font>Name <font color=Green><u>_</u></font> s<font color=Cyan>)</font> <font color=Red>=</font> text s-<a name="(line145)"></a><a name="ppXName"></a><font color=Blue>-- | Pretty print XML name.</font>-<a name="(line146)"></a>ppXName <font color=Red>::</font> Name <font color=Red>-></font> Doc-<a name="(line147)"></a>ppXName <font color=Cyan>(</font>Name s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> text s-<a name="(line148)"></a><a name="ppAName"></a><font color=Blue>-- | Pretty print Haskell attributes name.</font>-<a name="(line149)"></a>ppAName <font color=Red>::</font> Name <font color=Red>-></font> Doc-<a name="(line150)"></a>ppAName <font color=Cyan>(</font>Name <font color=Green><u>_</u></font> s<font color=Cyan>)</font> <font color=Red>=</font> text s <font color=Cyan><></font> text <font color=Magenta>"_Attrs"</font>-<a name="(line151)"></a>-<a name="(line152)"></a><a name="derives"></a>derives <font color=Red>::</font> Doc-<a name="(line153)"></a>derives <font color=Red>=</font> text <font color=Magenta>"deriving"</font> <font color=Cyan><+></font> parens <font color=Cyan>(</font>commaList <font color=Cyan>(</font>map text <font color=Red>[</font><font color=Magenta>"Eq"</font><font color=Cyan>,</font><font color=Magenta>"Show"</font><font color=Red>]</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line154)"></a>-<a name="(line155)"></a>-<a name="(line156)"></a><font color=Blue>---- Some operations on Names ----</font>-<a name="(line157)"></a>-<a name="(line158)"></a><a name="name"></a><font color=Blue>-- | Make a type name valid in both XML and Haskell.</font>-<a name="(line159)"></a>name <font color=Red>::</font> String <font color=Red>-></font> Name-<a name="(line160)"></a>name n <font color=Red>=</font> Name <font color=Cyan>{</font> xName <font color=Red>=</font> n-<a name="(line161)"></a> <font color=Cyan>,</font> hName <font color=Red>=</font> mangle n <font color=Cyan>}</font>-<a name="(line162)"></a>-<a name="(line163)"></a><a name="name_"></a><font color=Blue>-- | Append an underscore to the Haskell version of the name.</font>-<a name="(line164)"></a>name_ <font color=Red>::</font> String <font color=Red>-></font> Name-<a name="(line165)"></a>name_ n <font color=Red>=</font> Name <font color=Cyan>{</font> xName <font color=Red>=</font> n-<a name="(line166)"></a> <font color=Cyan>,</font> hName <font color=Red>=</font> mangle n <font color=Cyan>++</font> <font color=Magenta>"_"</font> <font color=Cyan>}</font>-<a name="(line167)"></a>-<a name="(line168)"></a><a name="name_a"></a><font color=Blue>-- | Prefix an attribute enumeration type name with its containing element</font>-<a name="(line169)"></a><font color=Blue>-- name.</font>-<a name="(line170)"></a>name_a <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Name-<a name="(line171)"></a>name_a e n <font color=Red>=</font> Name <font color=Cyan>{</font> xName <font color=Red>=</font> n-<a name="(line172)"></a> <font color=Cyan>,</font> hName <font color=Red>=</font> mangle e <font color=Cyan>++</font> <font color=Magenta>"_"</font> <font color=Cyan>++</font> map decolonify n <font color=Cyan>}</font>-<a name="(line173)"></a>-<a name="(line174)"></a><a name="name_ac"></a><font color=Blue>-- | Prefix an attribute enumeration constructor with its element-tag name,</font>-<a name="(line175)"></a><font color=Blue>-- and its enumeration type name.</font>-<a name="(line176)"></a>name_ac <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> String <font color=Red>-></font> Name-<a name="(line177)"></a>name_ac e t n <font color=Red>=</font> Name <font color=Cyan>{</font> xName <font color=Red>=</font> n-<a name="(line178)"></a> <font color=Cyan>,</font> hName <font color=Red>=</font> mangle e <font color=Cyan>++</font> <font color=Magenta>"_"</font> <font color=Cyan>++</font> map decolonify t-<a name="(line179)"></a> <font color=Cyan>++</font> <font color=Magenta>"_"</font> <font color=Cyan>++</font> map decolonify n <font color=Cyan>}</font>-<a name="(line180)"></a>-<a name="(line181)"></a><a name="name_f"></a><font color=Blue>-- | Prefix a field name with its enclosing element name.</font>-<a name="(line182)"></a>name_f <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Name-<a name="(line183)"></a>name_f e n <font color=Red>=</font> Name <font color=Cyan>{</font> xName <font color=Red>=</font> n-<a name="(line184)"></a> <font color=Cyan>,</font> hName <font color=Red>=</font> manglef e <font color=Cyan>++</font> mangle n <font color=Cyan>}</font>-<a name="(line185)"></a>-<a name="(line186)"></a><font color=Blue>---- obsolete</font>-<a name="(line187)"></a><font color=Blue>-- elementname_at :: String -> Name</font>-<a name="(line188)"></a><font color=Blue>-- elementname_at n = Name n (mangle n ++ "_Attrs")</font>-<a name="(line189)"></a>-<a name="(line190)"></a><a name="mangle"></a><font color=Blue>-- | Convert an XML name to a Haskell conid.</font>-<a name="(line191)"></a>mangle <font color=Red>::</font> String <font color=Red>-></font> String-<a name="(line192)"></a>mangle <font color=Cyan>(</font>n<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>-<a name="(line193)"></a> <font color=Red>|</font> isLower n <font color=Red>=</font> notPrelude <font color=Cyan>(</font>toUpper n<font color=Red><b>:</b></font> map decolonify ns<font color=Cyan>)</font>-<a name="(line194)"></a> <font color=Red>|</font> isDigit n <font color=Red>=</font> <font color=Magenta>'I'</font><font color=Red><b>:</b></font> n<font color=Red><b>:</b></font> map decolonify ns-<a name="(line195)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> notPrelude <font color=Cyan>(</font>n<font color=Red><b>:</b></font> map decolonify ns<font color=Cyan>)</font>-<a name="(line196)"></a>-<a name="(line197)"></a><a name="notPrelude"></a><font color=Blue>-- | Ensure a generated name does not conflict with a standard haskell one.</font>-<a name="(line198)"></a>notPrelude <font color=Red>::</font> String <font color=Red>-></font> String-<a name="(line199)"></a>notPrelude <font color=Magenta>"Bool"</font> <font color=Red>=</font> <font color=Magenta>"ABool"</font>-<a name="(line200)"></a>notPrelude <font color=Magenta>"Bounded"</font> <font color=Red>=</font> <font color=Magenta>"ABounded"</font>-<a name="(line201)"></a>notPrelude <font color=Magenta>"Char"</font> <font color=Red>=</font> <font color=Magenta>"AChar"</font>-<a name="(line202)"></a>notPrelude <font color=Magenta>"Double"</font> <font color=Red>=</font> <font color=Magenta>"ADouble"</font>-<a name="(line203)"></a>notPrelude <font color=Magenta>"Either"</font> <font color=Red>=</font> <font color=Magenta>"AEither"</font>-<a name="(line204)"></a>notPrelude <font color=Magenta>"Enum"</font> <font color=Red>=</font> <font color=Magenta>"AEnum"</font>-<a name="(line205)"></a>notPrelude <font color=Magenta>"Eq"</font> <font color=Red>=</font> <font color=Magenta>"AEq"</font>-<a name="(line206)"></a>notPrelude <font color=Magenta>"FilePath"</font><font color=Red>=</font> <font color=Magenta>"AFilePath"</font>-<a name="(line207)"></a>notPrelude <font color=Magenta>"Float"</font> <font color=Red>=</font> <font color=Magenta>"AFloat"</font>-<a name="(line208)"></a>notPrelude <font color=Magenta>"Floating"</font><font color=Red>=</font> <font color=Magenta>"AFloating"</font>-<a name="(line209)"></a>notPrelude <font color=Magenta>"Fractional"</font><font color=Red>=</font> <font color=Magenta>"AFractional"</font>-<a name="(line210)"></a>notPrelude <font color=Magenta>"Functor"</font> <font color=Red>=</font> <font color=Magenta>"AFunctor"</font>-<a name="(line211)"></a>notPrelude <font color=Magenta>"IO"</font> <font color=Red>=</font> <font color=Magenta>"AIO"</font>-<a name="(line212)"></a>notPrelude <font color=Magenta>"IOError"</font> <font color=Red>=</font> <font color=Magenta>"AIOError"</font>-<a name="(line213)"></a>notPrelude <font color=Magenta>"Int"</font> <font color=Red>=</font> <font color=Magenta>"AInt"</font>-<a name="(line214)"></a>notPrelude <font color=Magenta>"Integer"</font> <font color=Red>=</font> <font color=Magenta>"AInteger"</font>-<a name="(line215)"></a>notPrelude <font color=Magenta>"Integral"</font><font color=Red>=</font> <font color=Magenta>"AIntegral"</font>-<a name="(line216)"></a>notPrelude <font color=Magenta>"List1"</font> <font color=Red>=</font> <font color=Magenta>"AList1"</font> <font color=Blue>-- part of HaXml</font>-<a name="(line217)"></a>notPrelude <font color=Magenta>"Maybe"</font> <font color=Red>=</font> <font color=Magenta>"AMaybe"</font>-<a name="(line218)"></a>notPrelude <font color=Magenta>"Monad"</font> <font color=Red>=</font> <font color=Magenta>"AMonad"</font>-<a name="(line219)"></a>notPrelude <font color=Magenta>"Num"</font> <font color=Red>=</font> <font color=Magenta>"ANum"</font>-<a name="(line220)"></a>notPrelude <font color=Magenta>"Ord"</font> <font color=Red>=</font> <font color=Magenta>"AOrd"</font>-<a name="(line221)"></a>notPrelude <font color=Magenta>"Ordering"</font><font color=Red>=</font> <font color=Magenta>"AOrdering"</font>-<a name="(line222)"></a>notPrelude <font color=Magenta>"Rational"</font><font color=Red>=</font> <font color=Magenta>"ARational"</font>-<a name="(line223)"></a>notPrelude <font color=Magenta>"Read"</font> <font color=Red>=</font> <font color=Magenta>"ARead"</font>-<a name="(line224)"></a>notPrelude <font color=Magenta>"ReadS"</font> <font color=Red>=</font> <font color=Magenta>"AReadS"</font>-<a name="(line225)"></a>notPrelude <font color=Magenta>"Real"</font> <font color=Red>=</font> <font color=Magenta>"AReal"</font>-<a name="(line226)"></a>notPrelude <font color=Magenta>"RealFloat"</font> <font color=Red>=</font> <font color=Magenta>"ARealFloat"</font>-<a name="(line227)"></a>notPrelude <font color=Magenta>"RealFrac"</font><font color=Red>=</font> <font color=Magenta>"ARealFrac"</font>-<a name="(line228)"></a>notPrelude <font color=Magenta>"Show"</font> <font color=Red>=</font> <font color=Magenta>"AShow"</font>-<a name="(line229)"></a>notPrelude <font color=Magenta>"ShowS"</font> <font color=Red>=</font> <font color=Magenta>"AShowS"</font>-<a name="(line230)"></a>notPrelude <font color=Magenta>"String"</font> <font color=Red>=</font> <font color=Magenta>"AString"</font>-<a name="(line231)"></a>notPrelude n <font color=Red>=</font> n-<a name="(line232)"></a>-<a name="(line233)"></a><a name="manglef"></a><font color=Blue>-- | Convert an XML name to a Haskell varid.</font>-<a name="(line234)"></a>manglef <font color=Red>::</font> String <font color=Red>-></font> String-<a name="(line235)"></a>manglef <font color=Cyan>(</font>n<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>-<a name="(line236)"></a> <font color=Red>|</font> isUpper n <font color=Red>=</font> toLower n<font color=Red><b>:</b></font> map decolonify ns-<a name="(line237)"></a> <font color=Red>|</font> isDigit n <font color=Red>=</font> <font color=Magenta>'_'</font><font color=Red><b>:</b></font> n<font color=Red><b>:</b></font> map decolonify ns-<a name="(line238)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> n<font color=Red><b>:</b></font> map decolonify ns-<a name="(line239)"></a>-<a name="(line240)"></a><a name="decolonify"></a><font color=Blue>-- | Convert colon to prime, hyphen to underscore.</font>-<a name="(line241)"></a>decolonify <font color=Red>::</font> Char <font color=Red>-></font> Char-<a name="(line242)"></a>decolonify <font color=Magenta>':'</font> <font color=Red>=</font> <font color=Magenta>'\''</font> <font color=Blue>-- TODO: turn namespaces into qualified identifiers</font>-<a name="(line243)"></a>decolonify <font color=Magenta>'-'</font> <font color=Red>=</font> <font color=Magenta>'_'</font>-<a name="(line244)"></a>decolonify <font color=Magenta>'.'</font> <font color=Red>=</font> <font color=Magenta>'_'</font>-<a name="(line245)"></a>decolonify c <font color=Red>=</font> c-<a name="(line246)"></a>-<a name="(line247)"></a><a name="commaList"></a>commaList <font color=Red>::</font> <font color=Red>[</font>Doc<font color=Red>]</font> <font color=Red>-></font> Doc-<a name="(line248)"></a>commaList <font color=Red>=</font> hcat <font color=Cyan>.</font> intersperse comma+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/DtdToHaskell/TypeDef.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>-- | Defines an internal representation of Haskell data\/newtype definitions</font>+<a name="line-2"></a><font color=Blue>-- that correspond to the XML DTD types, and provides pretty-printers to</font>+<a name="line-3"></a><font color=Blue>-- convert these types into the 'Doc' type of "Text.PrettyPrint.HughesPJ".</font>+<a name="line-4"></a>+<a name="line-5"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>DtdToHaskell<font color=Cyan>.</font>TypeDef+<a name="line-6"></a> <font color=Cyan>(</font> <font color=Blue>-- * Internal representation of types</font>+<a name="line-7"></a> TypeDef<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-8"></a> <font color=Cyan>,</font> Constructors+<a name="line-9"></a> <font color=Cyan>,</font> AttrFields+<a name="line-10"></a> <font color=Cyan>,</font> StructType<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-11"></a> <font color=Blue>-- * Pretty-print a TypeDef</font>+<a name="line-12"></a> <font color=Cyan>,</font> ppTypeDef+<a name="line-13"></a> <font color=Cyan>,</font> ppHName+<a name="line-14"></a> <font color=Cyan>,</font> ppXName+<a name="line-15"></a> <font color=Cyan>,</font> ppAName+<a name="line-16"></a> <font color=Blue>-- * Name mangling</font>+<a name="line-17"></a> <font color=Cyan>,</font> Name<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-18"></a> <font color=Cyan>,</font> name<font color=Cyan>,</font> name_<font color=Cyan>,</font> name_a<font color=Cyan>,</font> name_ac<font color=Cyan>,</font> name_f<font color=Cyan>,</font> mangle<font color=Cyan>,</font> manglef+<a name="line-19"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-20"></a>+<a name="line-21"></a><font color=Green><u>import</u></font> Char <font color=Cyan>(</font>isLower<font color=Cyan>,</font> isUpper<font color=Cyan>,</font> toLower<font color=Cyan>,</font> toUpper<font color=Cyan>,</font> isDigit<font color=Cyan>)</font>+<a name="line-22"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>intersperse<font color=Cyan>)</font>+<a name="line-23"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>PrettyPrint<font color=Cyan>.</font>HughesPJ+<a name="line-24"></a>+<a name="line-25"></a>+<a name="line-26"></a><font color=Blue>---- Internal representation for typedefs ----</font>+<a name="line-27"></a>+<a name="line-28"></a><a name="Name"></a><font color=Blue>-- | Need to keep both the XML and Haskell versions of a name.</font>+<a name="line-29"></a><a name="Name"></a><font color=Green><u>data</u></font> Name <font color=Red>=</font> Name <font color=Cyan>{</font> xName <font color=Red>::</font> String <font color=Blue>-- ^ original XML name</font>+<a name="line-30"></a> <font color=Cyan>,</font> hName <font color=Red>::</font> String <font color=Blue>-- ^ mangled Haskell name</font>+<a name="line-31"></a> <font color=Cyan>}</font>+<a name="line-32"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-33"></a>+<a name="line-34"></a><a name="TypeDef"></a><font color=Green><u>data</u></font> TypeDef <font color=Red>=</font>+<a name="line-35"></a> DataDef Bool Name AttrFields Constructors <font color=Blue>-- ^ Bool for main\/aux.</font>+<a name="line-36"></a> <font color=Red>|</font> EnumDef Name <font color=Red>[</font>Name<font color=Red>]</font>+<a name="line-37"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-38"></a><a name="Constructors"></a><font color=Green><u>type</u></font> Constructors <font color=Red>=</font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>StructType<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font>+<a name="line-39"></a><a name="AttrFields"></a><font color=Green><u>type</u></font> AttrFields <font color=Red>=</font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font> StructType<font color=Cyan>)</font><font color=Red>]</font>+<a name="line-40"></a><a name="StructType"></a><font color=Green><u>data</u></font> StructType <font color=Red>=</font>+<a name="line-41"></a> Maybe StructType+<a name="line-42"></a> <font color=Red>|</font> Defaultable StructType String <font color=Blue>-- ^ String holds default value.</font>+<a name="line-43"></a> <font color=Red>|</font> List StructType+<a name="line-44"></a> <font color=Red>|</font> List1 StructType <font color=Blue>-- ^ Non-empty lists.</font>+<a name="line-45"></a> <font color=Red>|</font> Tuple <font color=Red>[</font>StructType<font color=Red>]</font>+<a name="line-46"></a> <font color=Red>|</font> OneOf <font color=Red>[</font>StructType<font color=Red>]</font>+<a name="line-47"></a> <font color=Red>|</font> Any <font color=Blue>-- ^ XML's contentspec allows ANY</font>+<a name="line-48"></a> <font color=Red>|</font> String+<a name="line-49"></a> <font color=Red>|</font> Defined Name+<a name="line-50"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-51"></a>+<a name="line-52"></a><font color=Blue>-- used for converting StructType (roughly) back to an XML content model</font>+<a name="line-53"></a><font color=Green><u>instance</u></font> Show StructType <font color=Green><u>where</u></font>+<a name="line-54"></a> showsPrec p <font color=Cyan>(</font>Maybe s<font color=Cyan>)</font> <font color=Red>=</font> showsPrec <font color=Cyan>(</font>p<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> s <font color=Cyan>.</font> showChar <font color=Magenta>'?'</font>+<a name="line-55"></a> showsPrec <font color=Green><u>_</u></font> <font color=Cyan>(</font>Defaultable s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> shows s+<a name="line-56"></a> showsPrec p <font color=Cyan>(</font>List s<font color=Cyan>)</font> <font color=Red>=</font> showsPrec <font color=Cyan>(</font>p<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> s <font color=Cyan>.</font> showChar <font color=Magenta>'*'</font>+<a name="line-57"></a> showsPrec p <font color=Cyan>(</font>List1 s<font color=Cyan>)</font> <font color=Red>=</font> showsPrec <font color=Cyan>(</font>p<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> s <font color=Cyan>.</font> showChar <font color=Magenta>'+'</font>+<a name="line-58"></a> showsPrec <font color=Green><u>_</u></font> <font color=Cyan>(</font>Tuple ss<font color=Cyan>)</font> <font color=Red>=</font> showChar <font color=Magenta>'('</font>+<a name="line-59"></a> <font color=Cyan>.</font> foldr1 <font color=Cyan>(</font><font color=Cyan>.</font><font color=Cyan>)</font> <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>showChar <font color=Magenta>','</font><font color=Cyan>)</font>+<a name="line-60"></a> <font color=Cyan>(</font>map shows ss<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-61"></a> <font color=Cyan>.</font> showChar <font color=Magenta>')'</font>+<a name="line-62"></a> showsPrec <font color=Green><u>_</u></font> <font color=Cyan>(</font>OneOf ss<font color=Cyan>)</font> <font color=Red>=</font> showChar <font color=Magenta>'('</font>+<a name="line-63"></a> <font color=Cyan>.</font> foldr1 <font color=Cyan>(</font><font color=Cyan>.</font><font color=Cyan>)</font> <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>showChar <font color=Magenta>'|'</font><font color=Cyan>)</font>+<a name="line-64"></a> <font color=Cyan>(</font>map shows ss<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-65"></a> <font color=Cyan>.</font> showChar <font color=Magenta>')'</font>+<a name="line-66"></a> showsPrec <font color=Green><u>_</u></font> <font color=Cyan>(</font>Any<font color=Cyan>)</font> <font color=Red>=</font> showString <font color=Magenta>"ANY"</font>+<a name="line-67"></a> showsPrec <font color=Green><u>_</u></font> <font color=Cyan>(</font>String<font color=Cyan>)</font> <font color=Red>=</font> showString <font color=Magenta>"#PCDATA"</font>+<a name="line-68"></a> showsPrec <font color=Green><u>_</u></font> <font color=Cyan>(</font>Defined <font color=Cyan>(</font>Name n <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> showString n+<a name="line-69"></a>+<a name="line-70"></a>+<a name="line-71"></a><a name="ppTypeDef"></a><font color=Blue>---- Pretty-printing typedefs ----</font>+<a name="line-72"></a><font color=Blue>ppTypeDef</font> <font color=Red>::</font> TypeDef <font color=Red>-></font> Doc+<a name="line-73"></a>+<a name="line-74"></a><font color=Blue>-- no attrs, no constructors</font>+<a name="line-75"></a><font color=Blue>ppTypeDef</font> <font color=Cyan>(</font>DataDef <font color=Green><u>_</u></font> n [] []<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-76"></a> <font color=Green><u>let</u></font> nme <font color=Red>=</font> ppHName n <font color=Green><u>in</u></font>+<a name="line-77"></a> text <font color=Magenta>"data"</font> <font color=Cyan><+></font> nme <font color=Cyan><+></font> text <font color=Magenta>"="</font> <font color=Cyan><+></font> nme <font color=Cyan><+></font> text <font color=Magenta>"\t\t"</font> <font color=Cyan><></font> derives+<a name="line-78"></a>+<a name="line-79"></a><font color=Blue>-- no attrs, single constructor</font>+<a name="line-80"></a><font color=Blue>ppTypeDef</font> <font color=Cyan>(</font>DataDef <font color=Green><u>_</u></font> n [] <font color=Red>[</font>c<font color=Red>@</font><font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font><font color=Red>[</font><font color=Green><u>_</u></font><font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-81"></a> text <font color=Magenta>"newtype"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"="</font> <font color=Cyan><+></font> ppC c <font color=Cyan><+></font> text <font color=Magenta>"\t\t"</font> <font color=Cyan><></font> derives+<a name="line-82"></a>+<a name="line-83"></a><font color=Blue>-- no attrs, multiple constrs</font>+<a name="line-84"></a><font color=Blue>ppTypeDef</font> <font color=Cyan>(</font>DataDef <font color=Green><u>_</u></font> n [] cs<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-85"></a> text <font color=Magenta>"data"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font>+<a name="line-86"></a> <font color=Cyan>(</font> text <font color=Magenta>"="</font> <font color=Cyan><+></font> ppC <font color=Cyan>(</font>head cs<font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-87"></a> vcat <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font> text <font color=Magenta>"|"</font> <font color=Cyan><+></font> ppC c<font color=Cyan>)</font> <font color=Cyan>(</font>tail cs<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-88"></a> derives <font color=Cyan>)</font>+<a name="line-89"></a>+<a name="line-90"></a><font color=Blue>-- nonzero attrs, no constructors</font>+<a name="line-91"></a><font color=Blue>ppTypeDef</font> <font color=Cyan>(</font>DataDef <font color=Green><u>_</u></font> n fs []<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-92"></a> <font color=Green><u>let</u></font> nme <font color=Red>=</font> ppHName n <font color=Green><u>in</u></font>+<a name="line-93"></a> text <font color=Magenta>"data"</font> <font color=Cyan><+></font> nme <font color=Cyan><+></font> text <font color=Magenta>"="</font> <font color=Cyan><+></font> nme <font color=Cyan>$$</font>+<a name="line-94"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"{"</font> <font color=Cyan><+></font> ppF <font color=Cyan>(</font>head fs<font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-95"></a> vcat <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font>f<font color=Red>-></font> text <font color=Magenta>","</font> <font color=Cyan><+></font> ppF f<font color=Cyan>)</font> <font color=Cyan>(</font>tail fs<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-96"></a> text <font color=Magenta>"}"</font> <font color=Cyan><+></font> derives <font color=Cyan>)</font>+<a name="line-97"></a>+<a name="line-98"></a><font color=Blue>-- nonzero attrs, one or more constrs</font>+<a name="line-99"></a><font color=Blue>ppTypeDef</font> <font color=Cyan>(</font>DataDef <font color=Green><u>_</u></font> n fs cs<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-100"></a> <font color=Green><u>let</u></font> attr <font color=Red>=</font> ppAName n <font color=Green><u>in</u></font>+<a name="line-101"></a> text <font color=Magenta>"data"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font>+<a name="line-102"></a> <font color=Cyan>(</font> text <font color=Magenta>"="</font> <font color=Cyan><+></font> ppAC attr <font color=Cyan>(</font>head cs<font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-103"></a> vcat <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font> text <font color=Magenta>"|"</font> <font color=Cyan><+></font> ppAC attr c<font color=Cyan>)</font> <font color=Cyan>(</font>tail cs<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-104"></a> derives <font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-105"></a> text <font color=Magenta>"data"</font> <font color=Cyan><+></font> attr <font color=Cyan><+></font> text <font color=Magenta>"="</font> <font color=Cyan><+></font> attr <font color=Cyan>$$</font>+<a name="line-106"></a> nest <font color=Magenta>4</font> <font color=Cyan>(</font> text <font color=Magenta>"{"</font> <font color=Cyan><+></font> ppF <font color=Cyan>(</font>head fs<font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-107"></a> vcat <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font>f<font color=Red>-></font> text <font color=Magenta>","</font> <font color=Cyan><+></font> ppF f<font color=Cyan>)</font> <font color=Cyan>(</font>tail fs<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-108"></a> text <font color=Magenta>"}"</font> <font color=Cyan><+></font> derives <font color=Cyan>)</font>+<a name="line-109"></a>+<a name="line-110"></a><font color=Blue>-- enumerations (of attribute values)</font>+<a name="line-111"></a><font color=Blue>ppTypeDef</font> <font color=Cyan>(</font>EnumDef n es<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-112"></a> text <font color=Magenta>"data"</font> <font color=Cyan><+></font> ppHName n <font color=Cyan><+></font>+<a name="line-113"></a> <font color=Cyan>(</font> text <font color=Magenta>"="</font> <font color=Cyan><+></font>+<a name="line-114"></a> fsep <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>" | "</font><font color=Cyan>)</font> <font color=Cyan>(</font>map ppHName es<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-115"></a> <font color=Cyan>$$</font> derives <font color=Cyan>)</font>+<a name="line-116"></a>+<a name="line-117"></a>+<a name="line-118"></a><a name="ppST"></a><font color=Blue>ppST</font> <font color=Red>::</font> StructType <font color=Red>-></font> Doc+<a name="line-119"></a><font color=Blue>ppST</font> <font color=Cyan>(</font>Defaultable st <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>text <font color=Magenta>"Defaultable"</font> <font color=Cyan><+></font> ppST st<font color=Cyan>)</font>+<a name="line-120"></a><font color=Blue>ppST</font> <font color=Cyan>(</font>Maybe st<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>text <font color=Magenta>"Maybe"</font> <font color=Cyan><+></font> ppST st<font color=Cyan>)</font>+<a name="line-121"></a><font color=Blue>ppST</font> <font color=Cyan>(</font>List st<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"["</font> <font color=Cyan><></font> ppST st <font color=Cyan><></font> text <font color=Magenta>"]"</font>+<a name="line-122"></a><font color=Blue>ppST</font> <font color=Cyan>(</font>List1 st<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>text <font color=Magenta>"List1"</font> <font color=Cyan><+></font> ppST st<font color=Cyan>)</font>+<a name="line-123"></a><font color=Blue>ppST</font> <font color=Cyan>(</font>Tuple sts<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>commaList <font color=Cyan>(</font>map ppST sts<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-124"></a><font color=Blue>ppST</font> <font color=Cyan>(</font>OneOf sts<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>text <font color=Magenta>"OneOf"</font> <font color=Cyan><></font> text <font color=Cyan>(</font>show <font color=Cyan>(</font>length sts<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><+></font>+<a name="line-125"></a> hsep <font color=Cyan>(</font>map ppST sts<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-126"></a><font color=Blue>ppST</font> String <font color=Red>=</font> text <font color=Magenta>"String"</font>+<a name="line-127"></a><font color=Blue>ppST</font> Any <font color=Red>=</font> text <font color=Magenta>"ANYContent"</font>+<a name="line-128"></a><font color=Blue>ppST</font> <font color=Cyan>(</font>Defined n<font color=Cyan>)</font> <font color=Red>=</font> ppHName n+<a name="line-129"></a>+<a name="line-130"></a><a name="ppC"></a><font color=Blue>-- constructor and components</font>+<a name="line-131"></a><font color=Blue>ppC</font> <font color=Red>::</font> <font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>StructType<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> Doc+<a name="line-132"></a><font color=Blue>ppC</font> <font color=Cyan>(</font>n<font color=Cyan>,</font>sts<font color=Cyan>)</font> <font color=Red>=</font> ppHName n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map ppST sts<font color=Cyan>)</font>+<a name="line-133"></a>+<a name="line-134"></a><a name="ppF"></a><font color=Blue>-- attribute (fieldname and type)</font>+<a name="line-135"></a><font color=Blue>ppF</font> <font color=Red>::</font> <font color=Cyan>(</font>Name<font color=Cyan>,</font>StructType<font color=Cyan>)</font> <font color=Red>-></font> Doc+<a name="line-136"></a><font color=Blue>ppF</font> <font color=Cyan>(</font>n<font color=Cyan>,</font>st<font color=Cyan>)</font> <font color=Red>=</font> ppHName n <font color=Cyan><+></font> text <font color=Magenta>"::"</font> <font color=Cyan><+></font> ppST st+<a name="line-137"></a>+<a name="line-138"></a><a name="ppAC"></a><font color=Blue>-- constructor and components with initial attr-type</font>+<a name="line-139"></a><font color=Blue>ppAC</font> <font color=Red>::</font> Doc <font color=Red>-></font> <font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>StructType<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> Doc+<a name="line-140"></a><font color=Blue>ppAC</font> atype <font color=Cyan>(</font>n<font color=Cyan>,</font>sts<font color=Cyan>)</font> <font color=Red>=</font> ppHName n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>atype<font color=Red><b>:</b></font> map ppST sts<font color=Cyan>)</font>+<a name="line-141"></a>+<a name="line-142"></a><a name="ppHName"></a><font color=Blue>-- | Pretty print Haskell name.</font>+<a name="line-143"></a><font color=Blue>ppHName</font> <font color=Red>::</font> Name <font color=Red>-></font> Doc+<a name="line-144"></a><font color=Blue>ppHName</font> <font color=Cyan>(</font>Name <font color=Green><u>_</u></font> s<font color=Cyan>)</font> <font color=Red>=</font> text s+<a name="line-145"></a><a name="ppXName"></a><font color=Blue>-- | Pretty print XML name.</font>+<a name="line-146"></a><font color=Blue>ppXName</font> <font color=Red>::</font> Name <font color=Red>-></font> Doc+<a name="line-147"></a><font color=Blue>ppXName</font> <font color=Cyan>(</font>Name s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> text s+<a name="line-148"></a><a name="ppAName"></a><font color=Blue>-- | Pretty print Haskell attributes name.</font>+<a name="line-149"></a><font color=Blue>ppAName</font> <font color=Red>::</font> Name <font color=Red>-></font> Doc+<a name="line-150"></a><font color=Blue>ppAName</font> <font color=Cyan>(</font>Name <font color=Green><u>_</u></font> s<font color=Cyan>)</font> <font color=Red>=</font> text s <font color=Cyan><></font> text <font color=Magenta>"_Attrs"</font>+<a name="line-151"></a>+<a name="line-152"></a><a name="derives"></a><font color=Blue>derives</font> <font color=Red>::</font> Doc+<a name="line-153"></a><font color=Blue>derives</font> <font color=Red>=</font> text <font color=Magenta>"deriving"</font> <font color=Cyan><+></font> parens <font color=Cyan>(</font>commaList <font color=Cyan>(</font>map text <font color=Red>[</font><font color=Magenta>"Eq"</font><font color=Cyan>,</font><font color=Magenta>"Show"</font><font color=Red>]</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-154"></a>+<a name="line-155"></a>+<a name="line-156"></a><font color=Blue>---- Some operations on Names ----</font>+<a name="line-157"></a>+<a name="line-158"></a><a name="name"></a><font color=Blue>-- | Make a type name valid in both XML and Haskell.</font>+<a name="line-159"></a><font color=Blue>name</font> <font color=Red>::</font> String <font color=Red>-></font> Name+<a name="line-160"></a><font color=Blue>name</font> n <font color=Red>=</font> Name <font color=Cyan>{</font> xName <font color=Red>=</font> n+<a name="line-161"></a> <font color=Cyan>,</font> hName <font color=Red>=</font> mangle n <font color=Cyan>}</font>+<a name="line-162"></a>+<a name="line-163"></a><a name="name_"></a><font color=Blue>-- | Append an underscore to the Haskell version of the name.</font>+<a name="line-164"></a><font color=Blue>name_</font> <font color=Red>::</font> String <font color=Red>-></font> Name+<a name="line-165"></a><font color=Blue>name_</font> n <font color=Red>=</font> Name <font color=Cyan>{</font> xName <font color=Red>=</font> n+<a name="line-166"></a> <font color=Cyan>,</font> hName <font color=Red>=</font> mangle n <font color=Cyan>++</font> <font color=Magenta>"_"</font> <font color=Cyan>}</font>+<a name="line-167"></a>+<a name="line-168"></a><a name="name_a"></a><font color=Blue>-- | Prefix an attribute enumeration type name with its containing element</font>+<a name="line-169"></a><font color=Blue>-- name.</font>+<a name="line-170"></a><font color=Blue>name_a</font> <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Name+<a name="line-171"></a><font color=Blue>name_a</font> e n <font color=Red>=</font> Name <font color=Cyan>{</font> xName <font color=Red>=</font> n+<a name="line-172"></a> <font color=Cyan>,</font> hName <font color=Red>=</font> mangle e <font color=Cyan>++</font> <font color=Magenta>"_"</font> <font color=Cyan>++</font> map decolonify n <font color=Cyan>}</font>+<a name="line-173"></a>+<a name="line-174"></a><a name="name_ac"></a><font color=Blue>-- | Prefix an attribute enumeration constructor with its element-tag name,</font>+<a name="line-175"></a><font color=Blue>-- and its enumeration type name.</font>+<a name="line-176"></a><font color=Blue>name_ac</font> <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> String <font color=Red>-></font> Name+<a name="line-177"></a><font color=Blue>name_ac</font> e t n <font color=Red>=</font> Name <font color=Cyan>{</font> xName <font color=Red>=</font> n+<a name="line-178"></a> <font color=Cyan>,</font> hName <font color=Red>=</font> mangle e <font color=Cyan>++</font> <font color=Magenta>"_"</font> <font color=Cyan>++</font> map decolonify t+<a name="line-179"></a> <font color=Cyan>++</font> <font color=Magenta>"_"</font> <font color=Cyan>++</font> map decolonify n <font color=Cyan>}</font>+<a name="line-180"></a>+<a name="line-181"></a><a name="name_f"></a><font color=Blue>-- | Prefix a field name with its enclosing element name.</font>+<a name="line-182"></a><font color=Blue>name_f</font> <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Name+<a name="line-183"></a><font color=Blue>name_f</font> e n <font color=Red>=</font> Name <font color=Cyan>{</font> xName <font color=Red>=</font> n+<a name="line-184"></a> <font color=Cyan>,</font> hName <font color=Red>=</font> manglef e <font color=Cyan>++</font> mangle n <font color=Cyan>}</font>+<a name="line-185"></a>+<a name="line-186"></a><font color=Blue>---- obsolete</font>+<a name="line-187"></a><font color=Blue>-- elementname_at :: String -> Name</font>+<a name="line-188"></a><font color=Blue>-- elementname_at n = Name n (mangle n ++ "_Attrs")</font>+<a name="line-189"></a>+<a name="line-190"></a><a name="mangle"></a><font color=Blue>-- | Convert an XML name to a Haskell conid.</font>+<a name="line-191"></a><font color=Blue>mangle</font> <font color=Red>::</font> String <font color=Red>-></font> String+<a name="line-192"></a><font color=Blue>mangle</font> <font color=Cyan>(</font>n<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>+<a name="line-193"></a> <font color=Red>|</font> isLower n <font color=Red>=</font> notPrelude <font color=Cyan>(</font>toUpper n<font color=Red><b>:</b></font> map decolonify ns<font color=Cyan>)</font>+<a name="line-194"></a> <font color=Red>|</font> isDigit n <font color=Red>=</font> <font color=Magenta>'I'</font><font color=Red><b>:</b></font> n<font color=Red><b>:</b></font> map decolonify ns+<a name="line-195"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> notPrelude <font color=Cyan>(</font>n<font color=Red><b>:</b></font> map decolonify ns<font color=Cyan>)</font>+<a name="line-196"></a>+<a name="line-197"></a><a name="notPrelude"></a><font color=Blue>-- | Ensure a generated name does not conflict with a standard haskell one.</font>+<a name="line-198"></a><font color=Blue>notPrelude</font> <font color=Red>::</font> String <font color=Red>-></font> String+<a name="line-199"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Bool"</font> <font color=Red>=</font> <font color=Magenta>"ABool"</font>+<a name="line-200"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Bounded"</font> <font color=Red>=</font> <font color=Magenta>"ABounded"</font>+<a name="line-201"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Char"</font> <font color=Red>=</font> <font color=Magenta>"AChar"</font>+<a name="line-202"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Double"</font> <font color=Red>=</font> <font color=Magenta>"ADouble"</font>+<a name="line-203"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Either"</font> <font color=Red>=</font> <font color=Magenta>"AEither"</font>+<a name="line-204"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Enum"</font> <font color=Red>=</font> <font color=Magenta>"AEnum"</font>+<a name="line-205"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Eq"</font> <font color=Red>=</font> <font color=Magenta>"AEq"</font>+<a name="line-206"></a><font color=Blue>notPrelude</font> <font color=Magenta>"FilePath"</font><font color=Red>=</font> <font color=Magenta>"AFilePath"</font>+<a name="line-207"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Float"</font> <font color=Red>=</font> <font color=Magenta>"AFloat"</font>+<a name="line-208"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Floating"</font><font color=Red>=</font> <font color=Magenta>"AFloating"</font>+<a name="line-209"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Fractional"</font><font color=Red>=</font> <font color=Magenta>"AFractional"</font>+<a name="line-210"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Functor"</font> <font color=Red>=</font> <font color=Magenta>"AFunctor"</font>+<a name="line-211"></a><font color=Blue>notPrelude</font> <font color=Magenta>"IO"</font> <font color=Red>=</font> <font color=Magenta>"AIO"</font>+<a name="line-212"></a><font color=Blue>notPrelude</font> <font color=Magenta>"IOError"</font> <font color=Red>=</font> <font color=Magenta>"AIOError"</font>+<a name="line-213"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Int"</font> <font color=Red>=</font> <font color=Magenta>"AInt"</font>+<a name="line-214"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Integer"</font> <font color=Red>=</font> <font color=Magenta>"AInteger"</font>+<a name="line-215"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Integral"</font><font color=Red>=</font> <font color=Magenta>"AIntegral"</font>+<a name="line-216"></a><font color=Blue>notPrelude</font> <font color=Magenta>"List1"</font> <font color=Red>=</font> <font color=Magenta>"AList1"</font> <font color=Blue>-- part of HaXml</font>+<a name="line-217"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Maybe"</font> <font color=Red>=</font> <font color=Magenta>"AMaybe"</font>+<a name="line-218"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Monad"</font> <font color=Red>=</font> <font color=Magenta>"AMonad"</font>+<a name="line-219"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Num"</font> <font color=Red>=</font> <font color=Magenta>"ANum"</font>+<a name="line-220"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Ord"</font> <font color=Red>=</font> <font color=Magenta>"AOrd"</font>+<a name="line-221"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Ordering"</font><font color=Red>=</font> <font color=Magenta>"AOrdering"</font>+<a name="line-222"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Rational"</font><font color=Red>=</font> <font color=Magenta>"ARational"</font>+<a name="line-223"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Read"</font> <font color=Red>=</font> <font color=Magenta>"ARead"</font>+<a name="line-224"></a><font color=Blue>notPrelude</font> <font color=Magenta>"ReadS"</font> <font color=Red>=</font> <font color=Magenta>"AReadS"</font>+<a name="line-225"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Real"</font> <font color=Red>=</font> <font color=Magenta>"AReal"</font>+<a name="line-226"></a><font color=Blue>notPrelude</font> <font color=Magenta>"RealFloat"</font> <font color=Red>=</font> <font color=Magenta>"ARealFloat"</font>+<a name="line-227"></a><font color=Blue>notPrelude</font> <font color=Magenta>"RealFrac"</font><font color=Red>=</font> <font color=Magenta>"ARealFrac"</font>+<a name="line-228"></a><font color=Blue>notPrelude</font> <font color=Magenta>"Show"</font> <font color=Red>=</font> <font color=Magenta>"AShow"</font>+<a name="line-229"></a><font color=Blue>notPrelude</font> <font color=Magenta>"ShowS"</font> <font color=Red>=</font> <font color=Magenta>"AShowS"</font>+<a name="line-230"></a><font color=Blue>notPrelude</font> <font color=Magenta>"String"</font> <font color=Red>=</font> <font color=Magenta>"AString"</font>+<a name="line-231"></a><font color=Blue>notPrelude</font> n <font color=Red>=</font> n+<a name="line-232"></a>+<a name="line-233"></a><a name="manglef"></a><font color=Blue>-- | Convert an XML name to a Haskell varid.</font>+<a name="line-234"></a><font color=Blue>manglef</font> <font color=Red>::</font> String <font color=Red>-></font> String+<a name="line-235"></a><font color=Blue>manglef</font> <font color=Cyan>(</font>n<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>+<a name="line-236"></a> <font color=Red>|</font> isUpper n <font color=Red>=</font> toLower n<font color=Red><b>:</b></font> map decolonify ns+<a name="line-237"></a> <font color=Red>|</font> isDigit n <font color=Red>=</font> <font color=Magenta>'_'</font><font color=Red><b>:</b></font> n<font color=Red><b>:</b></font> map decolonify ns+<a name="line-238"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> n<font color=Red><b>:</b></font> map decolonify ns+<a name="line-239"></a>+<a name="line-240"></a><a name="decolonify"></a><font color=Blue>-- | Convert colon to prime, hyphen to underscore.</font>+<a name="line-241"></a><font color=Blue>decolonify</font> <font color=Red>::</font> Char <font color=Red>-></font> Char+<a name="line-242"></a><font color=Blue>decolonify</font> <font color=Magenta>':'</font> <font color=Red>=</font> <font color=Magenta>'\''</font> <font color=Blue>-- TODO: turn namespaces into qualified identifiers</font>+<a name="line-243"></a><font color=Blue>decolonify</font> <font color=Magenta>'-'</font> <font color=Red>=</font> <font color=Magenta>'_'</font>+<a name="line-244"></a><font color=Blue>decolonify</font> <font color=Magenta>'.'</font> <font color=Red>=</font> <font color=Magenta>'_'</font>+<a name="line-245"></a><font color=Blue>decolonify</font> c <font color=Red>=</font> c+<a name="line-246"></a>+<a name="line-247"></a><a name="commaList"></a><font color=Blue>commaList</font> <font color=Red>::</font> <font color=Red>[</font>Doc<font color=Red>]</font> <font color=Red>-></font> Doc+<a name="line-248"></a><font color=Blue>commaList</font> <font color=Red>=</font> hcat <font color=Cyan>.</font> intersperse comma </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/Escape.html view
@@ -1,295 +1,301 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>{- This module contains code for escaping/unescaping text in attributes-<a name="(line2)"></a> and elements in the HaXml Element type, replacing characters by character-<a name="(line3)"></a> references or vice-versa. Two uses are envisaged for this:-<a name="(line4)"></a>-<a name="(line5)"></a> (1) stopping HaXml generating incorrect XML when a character is included-<a name="(line6)"></a> which is also the appropriate XML terminating character, for example-<a name="(line7)"></a> when an attribute includes a double quote.-<a name="(line8)"></a> (2) representing XML which contains non-ASCII characters as ASCII.-<a name="(line9)"></a> -}</font>-<a name="(line10)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Escape<font color=Cyan>(</font>-<a name="(line11)"></a> xmlEscape<font color=Cyan>,</font>-<a name="(line12)"></a> <font color=Blue>-- :: XmlEscaper -> Element i -> Element i</font>-<a name="(line13)"></a> xmlUnEscape<font color=Cyan>,</font>-<a name="(line14)"></a> <font color=Blue>-- :: XmlEscaper -> Element i -> Element i</font>-<a name="(line15)"></a> xmlEscapeContent<font color=Cyan>,</font>-<a name="(line16)"></a> <font color=Blue>-- :: XmlEscaper -> [Content i] -> [Content i]</font>-<a name="(line17)"></a> xmlUnEscapeContent<font color=Cyan>,</font>-<a name="(line18)"></a> <font color=Blue>-- :: XmlEscaper -> [Content i] -> [Content i]</font>-<a name="(line19)"></a>-<a name="(line20)"></a> XmlEscaper<font color=Cyan>,</font>-<a name="(line21)"></a> <font color=Blue>-- Something describing a particular set of escapes.</font>-<a name="(line22)"></a>-<a name="(line23)"></a> stdXmlEscaper<font color=Cyan>,</font>-<a name="(line24)"></a> <font color=Blue>-- Standard boilerplate escaper, escaping everything that is</font>-<a name="(line25)"></a> <font color=Blue>-- nonprintable, non-ASCII, or might conceivably cause problems by</font>-<a name="(line26)"></a> <font color=Blue>-- parsing XML, for example quotes, < signs, and ampersands.</font>-<a name="(line27)"></a>-<a name="(line28)"></a> mkXmlEscaper<font color=Cyan>,</font>-<a name="(line29)"></a> <font color=Blue>-- :: [(Char,String)] -> (Char -> Bool) -> XmlEscaper</font>-<a name="(line30)"></a> <font color=Blue>-- The first argument contains a list of characters, with their</font>-<a name="(line31)"></a> <font color=Blue>-- corresponding character reference names.</font>-<a name="(line32)"></a> <font color=Blue>-- For example [('\60',"lt"),('\62',"gt"),('\38',"amp"),</font>-<a name="(line33)"></a> <font color=Blue>-- ('\39',"apos"),('\34',"quot")] will give you the "standard"</font>-<a name="(line34)"></a> <font color=Blue>-- XML escapes listed in section 4.6 of the XML standard, so that</font>-<a name="(line35)"></a> <font color=Blue>-- "&quot;" will automatically get translated into a double</font>-<a name="(line36)"></a> <font color=Blue>-- quotation mark.</font>-<a name="(line37)"></a> <font color=Blue>--</font>-<a name="(line38)"></a> <font color=Blue>-- It's the caller's responsibility to see that the reference</font>-<a name="(line39)"></a> <font color=Blue>-- names ("lt","gt","amp","apos" and "quot" in the above example)</font>-<a name="(line40)"></a> <font color=Blue>-- are valid XML reference names. A sequence of letters, digits,</font>-<a name="(line41)"></a> <font color=Blue>-- "." or ":" characters should be fine so long as the first one</font>-<a name="(line42)"></a> <font color=Blue>-- isn't a digit.</font>-<a name="(line43)"></a> <font color=Blue>--</font>-<a name="(line44)"></a> <font color=Blue>-- The second argument is a function applied to each text character.</font>-<a name="(line45)"></a> <font color=Blue>-- If it returns True, that means we should escape this character.</font>-<a name="(line46)"></a>-<a name="(line47)"></a> <font color=Blue>-- Policy: on escaping, we expand all characters for which the</font>-<a name="(line48)"></a> <font color=Blue>-- (Char -> Bool) function returns True, either giving the corresponding</font>-<a name="(line49)"></a> <font color=Blue>-- character reference name if one was supplied, or else using a</font>-<a name="(line50)"></a> <font color=Blue>-- hexadecimal CharRef.</font>-<a name="(line51)"></a> <font color=Blue>--</font>-<a name="(line52)"></a> <font color=Blue>-- on unescaping, we translate all the references we understand</font>-<a name="(line53)"></a> <font color=Blue>-- (hexadecimal,decimal, and the ones in the [(Char,String)] list,</font>-<a name="(line54)"></a> <font color=Blue>-- and leave the others alone.</font>-<a name="(line55)"></a>-<a name="(line56)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line57)"></a>-<a name="(line58)"></a><font color=Green><u>import</u></font> Char-<a name="(line59)"></a><font color=Blue>-- import Numeric</font>-<a name="(line60)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line61)"></a>-<a name="(line62)"></a><font color=Magenta><em>#if __GLASGOW_HASKELL__ >= 604 || __NHC__ >= 118 || defined(__HUGS__)</em></font>-<a name="(line63)"></a><font color=Blue>-- emulate older finite map interface using Data.Map, if it is available</font>-<a name="(line64)"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Data<font color=Cyan>.</font>Map <font color=Green><u>as</u></font> Map-<a name="(line65)"></a><a name="FiniteMap"></a><font color=Green><u>type</u></font> FiniteMap a b <font color=Red>=</font> Map<font color=Cyan>.</font>Map a b-<a name="(line66)"></a><a name="listToFM"></a>listToFM <font color=Red>::</font> Ord a <font color=Red>=></font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> FiniteMap a b-<a name="(line67)"></a>listToFM <font color=Red>=</font> Map<font color=Cyan>.</font>fromList-<a name="(line68)"></a><a name="lookupFM"></a>lookupFM <font color=Red>::</font> Ord a <font color=Red>=></font> FiniteMap a b <font color=Red>-></font> a <font color=Red>-></font> Maybe b-<a name="(line69)"></a>lookupFM <font color=Red>=</font> flip Map<font color=Cyan>.</font>lookup-<a name="(line70)"></a><font color=Magenta><em>#elif __GLASGOW_HASKELL__ >= 504 || __NHC__ > 114</em></font>-<a name="(line71)"></a><font color=Blue>-- real finite map, if it is available</font>-<a name="(line72)"></a><font color=Green><u>import</u></font> Data<font color=Cyan>.</font>FiniteMap-<a name="(line73)"></a><font color=Magenta><em>#else</em></font>-<a name="(line74)"></a><a name="FiniteMap"></a><font color=Blue>-- otherwise, a very simple and inefficient implementation of a finite map</font>-<a name="(line75)"></a><a name="FiniteMap"></a><font color=Green><u>type</u></font> FiniteMap a b <font color=Red>=</font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font><font color=Red>]</font>-<a name="(line76)"></a>listToFM <font color=Red>::</font> Eq a <font color=Red>=></font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> FiniteMap a b-<a name="(line77)"></a>listToFM <font color=Red>=</font> id-<a name="(line78)"></a>lookupFM <font color=Red>::</font> Eq a <font color=Red>=></font> FiniteMap a b <font color=Red>-></font> a <font color=Red>-></font> Maybe b-<a name="(line79)"></a>lookupFM fm k <font color=Red>=</font> lookup k fm-<a name="(line80)"></a><font color=Magenta><em>#endif</em></font>-<a name="(line81)"></a>-<a name="(line82)"></a>-<a name="(line83)"></a><font color=Blue>-- ------------------------------------------------------------------------</font>-<a name="(line84)"></a><font color=Blue>-- Data types</font>-<a name="(line85)"></a><font color=Blue>-- ------------------------------------------------------------------------</font>-<a name="(line86)"></a>-<a name="(line87)"></a><a name="XmlEscaper"></a><font color=Green><u>data</u></font> XmlEscaper <font color=Red>=</font> XmlEscaper <font color=Cyan>{</font>-<a name="(line88)"></a> toEscape <font color=Red>::</font> FiniteMap Char String<font color=Cyan>,</font>-<a name="(line89)"></a> fromEscape <font color=Red>::</font> FiniteMap String Char<font color=Cyan>,</font>-<a name="(line90)"></a> isEscape <font color=Red>::</font> Char <font color=Red>-></font> Bool-<a name="(line91)"></a> <font color=Cyan>}</font>-<a name="(line92)"></a>-<a name="(line93)"></a>-<a name="(line94)"></a><font color=Blue>-- ------------------------------------------------------------------------</font>-<a name="(line95)"></a><font color=Blue>-- Escaping</font>-<a name="(line96)"></a><font color=Blue>-- ------------------------------------------------------------------------</font>-<a name="(line97)"></a>-<a name="(line98)"></a>-<a name="(line99)"></a>-<a name="(line100)"></a><a name="xmlEscape"></a>xmlEscape <font color=Red>::</font> XmlEscaper <font color=Red>-></font> Element i <font color=Red>-></font> Element i-<a name="(line101)"></a>xmlEscape xmlEscaper element <font color=Red>=</font>-<a name="(line102)"></a> compressElement <font color=Cyan>(</font>escapeElement xmlEscaper element<font color=Cyan>)</font>-<a name="(line103)"></a>-<a name="(line104)"></a><a name="xmlEscapeContent"></a>xmlEscapeContent <font color=Red>::</font> XmlEscaper <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font>-<a name="(line105)"></a>xmlEscapeContent xmlEscaper cs <font color=Red>=</font>-<a name="(line106)"></a> compressContent <font color=Cyan>(</font>escapeContent xmlEscaper cs<font color=Cyan>)</font>-<a name="(line107)"></a>-<a name="(line108)"></a><a name="escapeElement"></a>escapeElement <font color=Red>::</font> XmlEscaper <font color=Red>-></font> Element i <font color=Red>-></font> Element i-<a name="(line109)"></a>escapeElement xmlEscaper <font color=Cyan>(</font>Elem name attributes content<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line110)"></a> Elem name <font color=Cyan>(</font>escapeAttributes xmlEscaper attributes<font color=Cyan>)</font>-<a name="(line111)"></a> <font color=Cyan>(</font>escapeContent xmlEscaper content<font color=Cyan>)</font>-<a name="(line112)"></a>-<a name="(line113)"></a><a name="escapeAttributes"></a>escapeAttributes <font color=Red>::</font> XmlEscaper <font color=Red>-></font> <font color=Red>[</font>Attribute<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Attribute<font color=Red>]</font>-<a name="(line114)"></a>escapeAttributes xmlEscaper atts <font color=Red>=</font>-<a name="(line115)"></a> map-<a name="(line116)"></a> <font color=Cyan>(</font><font color=Red>\</font> <font color=Cyan>(</font>name<font color=Cyan>,</font>av<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>name<font color=Cyan>,</font>escapeAttValue xmlEscaper av<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line117)"></a> atts-<a name="(line118)"></a>-<a name="(line119)"></a><a name="escapeAttValue"></a>escapeAttValue <font color=Red>::</font> XmlEscaper <font color=Red>-></font> AttValue <font color=Red>-></font> AttValue-<a name="(line120)"></a>escapeAttValue xmlEscaper <font color=Cyan>(</font>AttValue attValList<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line121)"></a> AttValue <font color=Cyan>(</font>-<a name="(line122)"></a> concat <font color=Cyan>(</font>-<a name="(line123)"></a> map-<a name="(line124)"></a> <font color=Cyan>(</font><font color=Red>\</font> av <font color=Red>-></font> <font color=Green><u>case</u></font> av <font color=Green><u>of</u></font>-<a name="(line125)"></a> Right <font color=Green><u>_</u></font> <font color=Red>-></font> <font color=Red>[</font>av<font color=Red>]</font>-<a name="(line126)"></a> Left s <font color=Red>-></font>-<a name="(line127)"></a> map-<a name="(line128)"></a> <font color=Cyan>(</font><font color=Red>\</font> c <font color=Red>-></font> <font color=Green><u>if</u></font> isEscape xmlEscaper c-<a name="(line129)"></a> <font color=Green><u>then</u></font>-<a name="(line130)"></a> Right <font color=Cyan>(</font>mkEscape xmlEscaper c<font color=Cyan>)</font>-<a name="(line131)"></a> <font color=Green><u>else</u></font>-<a name="(line132)"></a> Left <font color=Red>[</font>c<font color=Red>]</font>-<a name="(line133)"></a> <font color=Cyan>)</font>-<a name="(line134)"></a> s-<a name="(line135)"></a> <font color=Cyan>)</font>-<a name="(line136)"></a> attValList-<a name="(line137)"></a> <font color=Cyan>)</font>-<a name="(line138)"></a> <font color=Cyan>)</font>-<a name="(line139)"></a>-<a name="(line140)"></a><a name="escapeContent"></a>escapeContent <font color=Red>::</font> XmlEscaper <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font>-<a name="(line141)"></a>escapeContent xmlEscaper contents <font color=Red>=</font>-<a name="(line142)"></a> concat-<a name="(line143)"></a> <font color=Cyan>(</font>map-<a name="(line144)"></a> <font color=Cyan>(</font><font color=Red>\</font> content <font color=Red>-></font> <font color=Green><u>case</u></font> content <font color=Green><u>of</u></font>-<a name="(line145)"></a> <font color=Cyan>(</font>CString b str i<font color=Cyan>)</font> <font color=Red>-></font>-<a name="(line146)"></a> map-<a name="(line147)"></a> <font color=Cyan>(</font><font color=Red>\</font> c <font color=Red>-></font> <font color=Green><u>if</u></font> isEscape xmlEscaper c-<a name="(line148)"></a> <font color=Green><u>then</u></font>-<a name="(line149)"></a> CRef <font color=Cyan>(</font>mkEscape xmlEscaper c<font color=Cyan>)</font> i-<a name="(line150)"></a> <font color=Green><u>else</u></font>-<a name="(line151)"></a> CString b <font color=Red>[</font>c<font color=Red>]</font> i-<a name="(line152)"></a> <font color=Cyan>)</font>-<a name="(line153)"></a> str-<a name="(line154)"></a> <font color=Cyan>(</font>CElem element i<font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>CElem <font color=Cyan>(</font>escapeElement xmlEscaper element<font color=Cyan>)</font> i<font color=Red>]</font>-<a name="(line155)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> <font color=Red>[</font>content<font color=Red>]</font>-<a name="(line156)"></a> <font color=Cyan>)</font>-<a name="(line157)"></a> contents-<a name="(line158)"></a> <font color=Cyan>)</font>-<a name="(line159)"></a>-<a name="(line160)"></a><a name="mkEscape"></a>mkEscape <font color=Red>::</font> XmlEscaper <font color=Red>-></font> Char <font color=Red>-></font> Reference-<a name="(line161)"></a>mkEscape <font color=Cyan>(</font>XmlEscaper <font color=Cyan>{</font>toEscape <font color=Red>=</font> toescape<font color=Cyan>}</font><font color=Cyan>)</font> ch <font color=Red>=</font>-<a name="(line162)"></a> <font color=Green><u>case</u></font> lookupFM toescape ch <font color=Green><u>of</u></font>-<a name="(line163)"></a> Nothing <font color=Red>-></font> RefChar <font color=Cyan>(</font>ord ch<font color=Cyan>)</font>-<a name="(line164)"></a> Just str <font color=Red>-></font> RefEntity str-<a name="(line165)"></a><font color=Blue>-- where</font>-<a name="(line166)"></a><font color=Blue>-- _ = showIntAtBase 16 intToDigit</font>-<a name="(line167)"></a><font color=Blue>-- -- It should be, but in GHC it isn't.</font>-<a name="(line168)"></a>-<a name="(line169)"></a><font color=Blue>-- ------------------------------------------------------------------------</font>-<a name="(line170)"></a><font color=Blue>-- Unescaping</font>-<a name="(line171)"></a><font color=Blue>-- ------------------------------------------------------------------------</font>-<a name="(line172)"></a>-<a name="(line173)"></a><a name="xmlUnEscape"></a>xmlUnEscape <font color=Red>::</font> XmlEscaper <font color=Red>-></font> Element i <font color=Red>-></font> Element i-<a name="(line174)"></a>xmlUnEscape xmlEscaper element <font color=Red>=</font>-<a name="(line175)"></a> compressElement <font color=Cyan>(</font>unEscapeElement xmlEscaper element<font color=Cyan>)</font>-<a name="(line176)"></a>-<a name="(line177)"></a><a name="xmlUnEscapeContent"></a>xmlUnEscapeContent <font color=Red>::</font> XmlEscaper <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font>-<a name="(line178)"></a>xmlUnEscapeContent xmlEscaper cs <font color=Red>=</font>-<a name="(line179)"></a> compressContent <font color=Cyan>(</font>unEscapeContent xmlEscaper cs<font color=Cyan>)</font>-<a name="(line180)"></a>-<a name="(line181)"></a><a name="unEscapeElement"></a>unEscapeElement <font color=Red>::</font> XmlEscaper <font color=Red>-></font> Element i <font color=Red>-></font> Element i-<a name="(line182)"></a>unEscapeElement xmlEscaper <font color=Cyan>(</font>Elem name attributes content<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line183)"></a> Elem name <font color=Cyan>(</font>unEscapeAttributes xmlEscaper attributes<font color=Cyan>)</font>-<a name="(line184)"></a> <font color=Cyan>(</font>unEscapeContent xmlEscaper content<font color=Cyan>)</font>-<a name="(line185)"></a>-<a name="(line186)"></a><a name="unEscapeAttributes"></a>unEscapeAttributes <font color=Red>::</font> XmlEscaper <font color=Red>-></font> <font color=Red>[</font>Attribute<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Attribute<font color=Red>]</font>-<a name="(line187)"></a>unEscapeAttributes xmlEscaper atts <font color=Red>=</font>-<a name="(line188)"></a> map-<a name="(line189)"></a> <font color=Cyan>(</font><font color=Red>\</font> <font color=Cyan>(</font>name<font color=Cyan>,</font>av<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>name<font color=Cyan>,</font>unEscapeAttValue xmlEscaper av<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line190)"></a> atts-<a name="(line191)"></a>-<a name="(line192)"></a><a name="unEscapeAttValue"></a>unEscapeAttValue <font color=Red>::</font> XmlEscaper <font color=Red>-></font> AttValue <font color=Red>-></font> AttValue-<a name="(line193)"></a>unEscapeAttValue xmlEscaper <font color=Cyan>(</font>AttValue attValList<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line194)"></a> AttValue <font color=Cyan>(</font>-<a name="(line195)"></a> map-<a name="(line196)"></a> <font color=Cyan>(</font><font color=Red>\</font> av <font color=Red>-></font> <font color=Green><u>case</u></font> av <font color=Green><u>of</u></font>-<a name="(line197)"></a> Left <font color=Green><u>_</u></font> <font color=Red>-></font> av-<a name="(line198)"></a> Right ref <font color=Red>-></font> <font color=Green><u>case</u></font> unEscapeChar xmlEscaper ref <font color=Green><u>of</u></font>-<a name="(line199)"></a> Just c <font color=Red>-></font> Left <font color=Red>[</font>c<font color=Red>]</font>-<a name="(line200)"></a> Nothing <font color=Red>-></font> av-<a name="(line201)"></a> <font color=Cyan>)</font>-<a name="(line202)"></a> attValList-<a name="(line203)"></a> <font color=Cyan>)</font>-<a name="(line204)"></a>-<a name="(line205)"></a><a name="unEscapeContent"></a>unEscapeContent <font color=Red>::</font> XmlEscaper <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font>-<a name="(line206)"></a>unEscapeContent xmlEscaper content <font color=Red>=</font>-<a name="(line207)"></a> map-<a name="(line208)"></a> <font color=Cyan>(</font><font color=Red>\</font> cntnt <font color=Red>-></font> <font color=Green><u>case</u></font> cntnt <font color=Green><u>of</u></font>-<a name="(line209)"></a> CRef ref i <font color=Red>-></font> <font color=Green><u>case</u></font> unEscapeChar xmlEscaper ref <font color=Green><u>of</u></font>-<a name="(line210)"></a> Just c <font color=Red>-></font> CString False <font color=Red>[</font>c<font color=Red>]</font> i-<a name="(line211)"></a> Nothing <font color=Red>-></font> cntnt-<a name="(line212)"></a> CElem element i <font color=Red>-></font> CElem <font color=Cyan>(</font>unEscapeElement xmlEscaper element<font color=Cyan>)</font> i-<a name="(line213)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> cntnt-<a name="(line214)"></a> <font color=Cyan>)</font>-<a name="(line215)"></a> content-<a name="(line216)"></a>-<a name="(line217)"></a><a name="unEscapeChar"></a>unEscapeChar <font color=Red>::</font> XmlEscaper <font color=Red>-></font> Reference <font color=Red>-></font> Maybe Char-<a name="(line218)"></a>unEscapeChar xmlEscaper ref <font color=Red>=</font>-<a name="(line219)"></a> <font color=Green><u>case</u></font> ref <font color=Green><u>of</u></font>-<a name="(line220)"></a> RefChar i <font color=Red>-></font> Just <font color=Cyan>(</font>chr i<font color=Cyan>)</font>-<a name="(line221)"></a> RefEntity name <font color=Red>-></font> lookupFM <font color=Cyan>(</font>fromEscape xmlEscaper<font color=Cyan>)</font> name-<a name="(line222)"></a>-<a name="(line223)"></a><font color=Blue>-- ------------------------------------------------------------------------</font>-<a name="(line224)"></a><font color=Blue>-- After escaping and unescaping we rebuild the lists, compressing</font>-<a name="(line225)"></a><font color=Blue>-- adjacent identical character data.</font>-<a name="(line226)"></a><font color=Blue>-- ------------------------------------------------------------------------</font>-<a name="(line227)"></a>-<a name="(line228)"></a><a name="compressElement"></a>compressElement <font color=Red>::</font> Element i <font color=Red>-></font> Element i-<a name="(line229)"></a>compressElement <font color=Cyan>(</font>Elem name attributes content<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line230)"></a> Elem name <font color=Cyan>(</font>compressAttributes attributes<font color=Cyan>)</font> <font color=Cyan>(</font>compressContent content<font color=Cyan>)</font>-<a name="(line231)"></a>-<a name="(line232)"></a><a name="compressAttributes"></a>compressAttributes <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font>AttValue<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font>AttValue<font color=Cyan>)</font><font color=Red>]</font>-<a name="(line233)"></a>compressAttributes atts <font color=Red>=</font>-<a name="(line234)"></a> map-<a name="(line235)"></a> <font color=Cyan>(</font><font color=Red>\</font> <font color=Cyan>(</font>name<font color=Cyan>,</font>av<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>name<font color=Cyan>,</font>compressAttValue av<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line236)"></a> atts-<a name="(line237)"></a>-<a name="(line238)"></a><a name="compressAttValue"></a>compressAttValue <font color=Red>::</font> AttValue <font color=Red>-></font> AttValue-<a name="(line239)"></a>compressAttValue <font color=Cyan>(</font>AttValue l<font color=Cyan>)</font> <font color=Red>=</font> AttValue <font color=Cyan>(</font>compress l<font color=Cyan>)</font>-<a name="(line240)"></a> <font color=Green><u>where</u></font>-<a name="(line241)"></a> compress <font color=Red>::</font> <font color=Red>[</font>Either String Reference<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Either String Reference<font color=Red>]</font>-<a name="(line242)"></a> compress [] <font color=Red>=</font> []-<a name="(line243)"></a> compress <font color=Cyan>(</font>Right ref <font color=Red><b>:</b></font> es<font color=Cyan>)</font> <font color=Red>=</font> Right ref <font color=Red><b>:</b></font> <font color=Cyan>(</font>compress es<font color=Cyan>)</font>-<a name="(line244)"></a> compress <font color=Cyan>(</font> <font color=Cyan>(</font>ls <font color=Red>@</font> <font color=Cyan>(</font>Left s1<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red><b>:</b></font> es<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line245)"></a> <font color=Green><u>case</u></font> compress es <font color=Green><u>of</u></font>-<a name="(line246)"></a> <font color=Cyan>(</font>Left s2 <font color=Red><b>:</b></font> es2<font color=Cyan>)</font> <font color=Red>-></font> Left <font color=Cyan>(</font>s1 <font color=Cyan>++</font> s2<font color=Cyan>)</font> <font color=Red><b>:</b></font> es2-<a name="(line247)"></a> es2 <font color=Red>-></font> ls <font color=Red><b>:</b></font> es2-<a name="(line248)"></a>-<a name="(line249)"></a><a name="compressContent"></a>compressContent <font color=Red>::</font> <font color=Red>[</font>Content i<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font>-<a name="(line250)"></a>compressContent [] <font color=Red>=</font> []-<a name="(line251)"></a>compressContent <font color=Cyan>(</font><font color=Cyan>(</font>csb <font color=Red>@</font> <font color=Cyan>(</font>CString b1 s1 i1<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red><b>:</b></font> cs<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line252)"></a> <font color=Green><u>case</u></font> compressContent cs <font color=Green><u>of</u></font>-<a name="(line253)"></a> <font color=Cyan>(</font>CString b2 s2 <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red><b>:</b></font> cs2-<a name="(line254)"></a> <font color=Red>|</font> b1 <font color=Cyan>==</font> b2-<a name="(line255)"></a> <font color=Red>-></font> CString b1 <font color=Cyan>(</font>s1 <font color=Cyan>++</font> s2<font color=Cyan>)</font> i1<font color=Red><b>:</b></font> cs2-<a name="(line256)"></a> cs2 <font color=Red>-></font> csb <font color=Red><b>:</b></font> cs2-<a name="(line257)"></a>compressContent <font color=Cyan>(</font>CElem element i <font color=Red><b>:</b></font> cs<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line258)"></a> CElem <font color=Cyan>(</font>compressElement element<font color=Cyan>)</font> i <font color=Red><b>:</b></font> compressContent cs-<a name="(line259)"></a>compressContent <font color=Cyan>(</font>c <font color=Red><b>:</b></font> cs<font color=Cyan>)</font> <font color=Red>=</font> c <font color=Red><b>:</b></font> compressContent cs-<a name="(line260)"></a>-<a name="(line261)"></a>-<a name="(line262)"></a><font color=Blue>-- ------------------------------------------------------------------------</font>-<a name="(line263)"></a><font color=Blue>-- Making XmlEscaper values.</font>-<a name="(line264)"></a><font color=Blue>-- ------------------------------------------------------------------------</font>-<a name="(line265)"></a>-<a name="(line266)"></a><a name="stdXmlEscaper"></a>stdXmlEscaper <font color=Red>::</font> XmlEscaper-<a name="(line267)"></a>stdXmlEscaper <font color=Red>=</font> mkXmlEscaper-<a name="(line268)"></a> <font color=Red>[</font><font color=Cyan>(</font><font color=Magenta>'\60'</font><font color=Cyan>,</font><font color=Magenta>"lt"</font><font color=Cyan>)</font><font color=Cyan>,</font><font color=Cyan>(</font><font color=Magenta>'\62'</font><font color=Cyan>,</font><font color=Magenta>"gt"</font><font color=Cyan>)</font><font color=Cyan>,</font><font color=Cyan>(</font><font color=Magenta>'\38'</font><font color=Cyan>,</font><font color=Magenta>"amp"</font><font color=Cyan>)</font><font color=Cyan>,</font><font color=Cyan>(</font><font color=Magenta>'\39'</font><font color=Cyan>,</font><font color=Magenta>"apos"</font><font color=Cyan>)</font><font color=Cyan>,</font><font color=Cyan>(</font><font color=Magenta>'\34'</font><font color=Cyan>,</font><font color=Magenta>"quot"</font><font color=Cyan>)</font><font color=Red>]</font>-<a name="(line269)"></a> <font color=Cyan>(</font><font color=Red>\</font> ch <font color=Red>-></font>-<a name="(line270)"></a> <font color=Green><u>let</u></font>-<a name="(line271)"></a> i <font color=Red>=</font> ord ch-<a name="(line272)"></a> <font color=Green><u>in</u></font>-<a name="(line273)"></a> i <font color=Cyan><</font> <font color=Magenta>10</font> <font color=Cyan>||</font> <font color=Cyan>(</font><font color=Magenta>10</font><font color=Cyan><</font>i <font color=Cyan>&&</font> i<font color=Cyan><</font><font color=Magenta>32</font><font color=Cyan>)</font> <font color=Cyan>||</font> i <font color=Cyan>>=</font> <font color=Magenta>127</font> <font color=Cyan>||</font>-<a name="(line274)"></a> <font color=Green><u>case</u></font> ch <font color=Green><u>of</u></font>-<a name="(line275)"></a> <font color=Magenta>'\''</font> <font color=Red>-></font> True-<a name="(line276)"></a> <font color=Magenta>'\"'</font> <font color=Red>-></font> True-<a name="(line277)"></a> <font color=Magenta>'&'</font> <font color=Red>-></font> True-<a name="(line278)"></a> <font color=Magenta>'<'</font> <font color=Red>-></font> True-<a name="(line279)"></a> <font color=Magenta>'>'</font> <font color=Red>-></font> True-<a name="(line280)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> False-<a name="(line281)"></a> <font color=Cyan>)</font>-<a name="(line282)"></a>-<a name="(line283)"></a>-<a name="(line284)"></a><a name="mkXmlEscaper"></a>mkXmlEscaper <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>Char<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> <font color=Cyan>(</font>Char <font color=Red>-></font> Bool<font color=Cyan>)</font> <font color=Red>-></font> XmlEscaper-<a name="(line285)"></a>mkXmlEscaper escapes isescape <font color=Red>=</font>-<a name="(line286)"></a> XmlEscaper <font color=Cyan>{</font>-<a name="(line287)"></a> toEscape <font color=Red>=</font> listToFM escapes<font color=Cyan>,</font>-<a name="(line288)"></a> fromEscape <font color=Red>=</font> listToFM <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font> <font color=Cyan>(</font>c<font color=Cyan>,</font>str<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>str<font color=Cyan>,</font>c<font color=Cyan>)</font><font color=Cyan>)</font> escapes<font color=Cyan>)</font><font color=Cyan>,</font>-<a name="(line289)"></a> isEscape <font color=Red>=</font> isescape-<a name="(line290)"></a> <font color=Cyan>}</font>-<a name="(line291)"></a>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/Escape.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>{- This module contains code for escaping/unescaping text in attributes+<a name="line-2"></a> and elements in the HaXml Element type, replacing characters by character+<a name="line-3"></a> references or vice-versa. Two uses are envisaged for this:+<a name="line-4"></a>+<a name="line-5"></a> (1) stopping HaXml generating incorrect XML when a character is included+<a name="line-6"></a> which is also the appropriate XML terminating character, for example+<a name="line-7"></a> when an attribute includes a double quote.+<a name="line-8"></a> (2) representing XML which contains non-ASCII characters as ASCII.+<a name="line-9"></a> -}</font>+<a name="line-10"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Escape<font color=Cyan>(</font>+<a name="line-11"></a> xmlEscape<font color=Cyan>,</font>+<a name="line-12"></a> <font color=Blue>-- :: XmlEscaper -> Element i -> Element i</font>+<a name="line-13"></a> xmlUnEscape<font color=Cyan>,</font>+<a name="line-14"></a> <font color=Blue>-- :: XmlEscaper -> Element i -> Element i</font>+<a name="line-15"></a> xmlEscapeContent<font color=Cyan>,</font>+<a name="line-16"></a> <font color=Blue>-- :: XmlEscaper -> [Content i] -> [Content i]</font>+<a name="line-17"></a> xmlUnEscapeContent<font color=Cyan>,</font>+<a name="line-18"></a> <font color=Blue>-- :: XmlEscaper -> [Content i] -> [Content i]</font>+<a name="line-19"></a>+<a name="line-20"></a> XmlEscaper<font color=Cyan>,</font>+<a name="line-21"></a> <font color=Blue>-- Something describing a particular set of escapes.</font>+<a name="line-22"></a>+<a name="line-23"></a> stdXmlEscaper<font color=Cyan>,</font>+<a name="line-24"></a> <font color=Blue>-- Standard boilerplate escaper, escaping everything that is</font>+<a name="line-25"></a> <font color=Blue>-- nonprintable, non-ASCII, or might conceivably cause problems by</font>+<a name="line-26"></a> <font color=Blue>-- parsing XML, for example quotes, < signs, and ampersands.</font>+<a name="line-27"></a>+<a name="line-28"></a> mkXmlEscaper<font color=Cyan>,</font>+<a name="line-29"></a> <font color=Blue>-- :: [(Char,String)] -> (Char -> Bool) -> XmlEscaper</font>+<a name="line-30"></a> <font color=Blue>-- The first argument contains a list of characters, with their</font>+<a name="line-31"></a> <font color=Blue>-- corresponding character reference names.</font>+<a name="line-32"></a> <font color=Blue>-- For example [('\60',"lt"),('\62',"gt"),('\38',"amp"),</font>+<a name="line-33"></a> <font color=Blue>-- ('\39',"apos"),('\34',"quot")] will give you the "standard"</font>+<a name="line-34"></a> <font color=Blue>-- XML escapes listed in section 4.6 of the XML standard, so that</font>+<a name="line-35"></a> <font color=Blue>-- "&quot;" will automatically get translated into a double</font>+<a name="line-36"></a> <font color=Blue>-- quotation mark.</font>+<a name="line-37"></a> <font color=Blue>--</font>+<a name="line-38"></a> <font color=Blue>-- It's the caller's responsibility to see that the reference</font>+<a name="line-39"></a> <font color=Blue>-- names ("lt","gt","amp","apos" and "quot" in the above example)</font>+<a name="line-40"></a> <font color=Blue>-- are valid XML reference names. A sequence of letters, digits,</font>+<a name="line-41"></a> <font color=Blue>-- "." or ":" characters should be fine so long as the first one</font>+<a name="line-42"></a> <font color=Blue>-- isn't a digit.</font>+<a name="line-43"></a> <font color=Blue>--</font>+<a name="line-44"></a> <font color=Blue>-- The second argument is a function applied to each text character.</font>+<a name="line-45"></a> <font color=Blue>-- If it returns True, that means we should escape this character.</font>+<a name="line-46"></a>+<a name="line-47"></a> <font color=Blue>-- Policy: on escaping, we expand all characters for which the</font>+<a name="line-48"></a> <font color=Blue>-- (Char -> Bool) function returns True, either giving the corresponding</font>+<a name="line-49"></a> <font color=Blue>-- character reference name if one was supplied, or else using a</font>+<a name="line-50"></a> <font color=Blue>-- hexadecimal CharRef.</font>+<a name="line-51"></a> <font color=Blue>--</font>+<a name="line-52"></a> <font color=Blue>-- on unescaping, we translate all the references we understand</font>+<a name="line-53"></a> <font color=Blue>-- (hexadecimal,decimal, and the ones in the [(Char,String)] list,</font>+<a name="line-54"></a> <font color=Blue>-- and leave the others alone.</font>+<a name="line-55"></a>+<a name="line-56"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-57"></a>+<a name="line-58"></a><font color=Green><u>import</u></font> Char+<a name="line-59"></a><font color=Blue>-- import Numeric</font>+<a name="line-60"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-61"></a>+<a name="line-62"></a><font color=Magenta><em>#if __GLASGOW_HASKELL__ >= 604 || __NHC__ >= 118 || defined(__HUGS__)</em></font>+<a name="line-63"></a><font color=Blue>-- emulate older finite map interface using Data.Map, if it is available</font>+<a name="line-64"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Data<font color=Cyan>.</font>Map <font color=Green><u>as</u></font> Map+<a name="line-65"></a><a name="FiniteMap"></a><font color=Green><u>type</u></font> FiniteMap a b <font color=Red>=</font> Map<font color=Cyan>.</font>Map a b+<a name="line-66"></a><a name="listToFM"></a><font color=Blue>listToFM</font> <font color=Red>::</font> Ord a <font color=Red>=></font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> FiniteMap a b+<a name="line-67"></a><font color=Blue>listToFM</font> <font color=Red>=</font> Map<font color=Cyan>.</font>fromList+<a name="line-68"></a><a name="lookupFM"></a><font color=Blue>lookupFM</font> <font color=Red>::</font> Ord a <font color=Red>=></font> FiniteMap a b <font color=Red>-></font> a <font color=Red>-></font> Maybe b+<a name="line-69"></a><font color=Blue>lookupFM</font> <font color=Red>=</font> flip Map<font color=Cyan>.</font>lookup+<a name="line-70"></a><font color=Magenta><em>#elif __GLASGOW_HASKELL__ >= 504 || __NHC__ > 114</em></font>+<a name="line-71"></a><font color=Blue>-- real finite map, if it is available</font>+<a name="line-72"></a><font color=Green><u>import</u></font> Data<font color=Cyan>.</font>FiniteMap+<a name="line-73"></a><font color=Magenta><em>#else</em></font>+<a name="line-74"></a><a name="FiniteMap"></a><font color=Blue>-- otherwise, a very simple and inefficient implementation of a finite map</font>+<a name="line-75"></a><a name="FiniteMap"></a><font color=Green><u>type</u></font> FiniteMap a b <font color=Red>=</font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font><font color=Red>]</font>+<a name="line-76"></a><font color=Blue>listToFM</font> <font color=Red>::</font> Eq a <font color=Red>=></font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> FiniteMap a b+<a name="line-77"></a><font color=Blue>listToFM</font> <font color=Red>=</font> id+<a name="line-78"></a><font color=Blue>lookupFM</font> <font color=Red>::</font> Eq a <font color=Red>=></font> FiniteMap a b <font color=Red>-></font> a <font color=Red>-></font> Maybe b+<a name="line-79"></a><font color=Blue>lookupFM</font> fm k <font color=Red>=</font> lookup k fm+<a name="line-80"></a><font color=Magenta><em>#endif</em></font>+<a name="line-81"></a>+<a name="line-82"></a>+<a name="line-83"></a><font color=Blue>-- ------------------------------------------------------------------------</font>+<a name="line-84"></a><font color=Blue>-- Data types</font>+<a name="line-85"></a><font color=Blue>-- ------------------------------------------------------------------------</font>+<a name="line-86"></a>+<a name="line-87"></a><a name="XmlEscaper"></a><font color=Green><u>data</u></font> XmlEscaper <font color=Red>=</font> XmlEscaper <font color=Cyan>{</font>+<a name="line-88"></a> toEscape <font color=Red>::</font> FiniteMap Char String<font color=Cyan>,</font>+<a name="line-89"></a> fromEscape <font color=Red>::</font> FiniteMap String Char<font color=Cyan>,</font>+<a name="line-90"></a> isEscape <font color=Red>::</font> Char <font color=Red>-></font> Bool+<a name="line-91"></a> <font color=Cyan>}</font>+<a name="line-92"></a>+<a name="line-93"></a>+<a name="line-94"></a><font color=Blue>-- ------------------------------------------------------------------------</font>+<a name="line-95"></a><font color=Blue>-- Escaping</font>+<a name="line-96"></a><font color=Blue>-- ------------------------------------------------------------------------</font>+<a name="line-97"></a>+<a name="line-98"></a>+<a name="line-99"></a>+<a name="line-100"></a><a name="xmlEscape"></a><font color=Blue>xmlEscape</font> <font color=Red>::</font> XmlEscaper <font color=Red>-></font> Element i <font color=Red>-></font> Element i+<a name="line-101"></a><font color=Blue>xmlEscape</font> xmlEscaper element <font color=Red>=</font>+<a name="line-102"></a> compressElement <font color=Cyan>(</font>escapeElement xmlEscaper element<font color=Cyan>)</font>+<a name="line-103"></a>+<a name="line-104"></a><a name="xmlEscapeContent"></a><font color=Blue>xmlEscapeContent</font> <font color=Red>::</font> XmlEscaper <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font>+<a name="line-105"></a><font color=Blue>xmlEscapeContent</font> xmlEscaper cs <font color=Red>=</font>+<a name="line-106"></a> compressContent <font color=Cyan>(</font>escapeContent xmlEscaper cs<font color=Cyan>)</font>+<a name="line-107"></a>+<a name="line-108"></a><a name="escapeElement"></a><font color=Blue>escapeElement</font> <font color=Red>::</font> XmlEscaper <font color=Red>-></font> Element i <font color=Red>-></font> Element i+<a name="line-109"></a><font color=Blue>escapeElement</font> xmlEscaper <font color=Cyan>(</font>Elem name attributes content<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-110"></a> Elem name <font color=Cyan>(</font>escapeAttributes xmlEscaper attributes<font color=Cyan>)</font>+<a name="line-111"></a> <font color=Cyan>(</font>escapeContent xmlEscaper content<font color=Cyan>)</font>+<a name="line-112"></a>+<a name="line-113"></a><a name="escapeAttributes"></a><font color=Blue>escapeAttributes</font> <font color=Red>::</font> XmlEscaper <font color=Red>-></font> <font color=Red>[</font>Attribute<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Attribute<font color=Red>]</font>+<a name="line-114"></a><font color=Blue>escapeAttributes</font> xmlEscaper atts <font color=Red>=</font>+<a name="line-115"></a> map+<a name="line-116"></a> <font color=Cyan>(</font><font color=Red>\</font> <font color=Cyan>(</font>name<font color=Cyan>,</font>av<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>name<font color=Cyan>,</font>escapeAttValue xmlEscaper av<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-117"></a> atts+<a name="line-118"></a>+<a name="line-119"></a><a name="escapeAttValue"></a><font color=Blue>escapeAttValue</font> <font color=Red>::</font> XmlEscaper <font color=Red>-></font> AttValue <font color=Red>-></font> AttValue+<a name="line-120"></a><font color=Blue>escapeAttValue</font> xmlEscaper <font color=Cyan>(</font>AttValue attValList<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-121"></a> AttValue <font color=Cyan>(</font>+<a name="line-122"></a> concat <font color=Cyan>(</font>+<a name="line-123"></a> map+<a name="line-124"></a> <font color=Cyan>(</font><font color=Red>\</font> av <font color=Red>-></font> <font color=Green><u>case</u></font> av <font color=Green><u>of</u></font>+<a name="line-125"></a> Right <font color=Green><u>_</u></font> <font color=Red>-></font> <font color=Red>[</font>av<font color=Red>]</font>+<a name="line-126"></a> Left s <font color=Red>-></font>+<a name="line-127"></a> map+<a name="line-128"></a> <font color=Cyan>(</font><font color=Red>\</font> c <font color=Red>-></font> <font color=Green><u>if</u></font> isEscape xmlEscaper c+<a name="line-129"></a> <font color=Green><u>then</u></font>+<a name="line-130"></a> Right <font color=Cyan>(</font>mkEscape xmlEscaper c<font color=Cyan>)</font>+<a name="line-131"></a> <font color=Green><u>else</u></font>+<a name="line-132"></a> Left <font color=Red>[</font>c<font color=Red>]</font>+<a name="line-133"></a> <font color=Cyan>)</font>+<a name="line-134"></a> s+<a name="line-135"></a> <font color=Cyan>)</font>+<a name="line-136"></a> attValList+<a name="line-137"></a> <font color=Cyan>)</font>+<a name="line-138"></a> <font color=Cyan>)</font>+<a name="line-139"></a>+<a name="line-140"></a><a name="escapeContent"></a><font color=Blue>escapeContent</font> <font color=Red>::</font> XmlEscaper <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font>+<a name="line-141"></a><font color=Blue>escapeContent</font> xmlEscaper contents <font color=Red>=</font>+<a name="line-142"></a> concat+<a name="line-143"></a> <font color=Cyan>(</font>map+<a name="line-144"></a> <font color=Cyan>(</font><font color=Red>\</font> content <font color=Red>-></font> <font color=Green><u>case</u></font> content <font color=Green><u>of</u></font>+<a name="line-145"></a> <font color=Cyan>(</font>CString b str i<font color=Cyan>)</font> <font color=Red>-></font>+<a name="line-146"></a> map+<a name="line-147"></a> <font color=Cyan>(</font><font color=Red>\</font> c <font color=Red>-></font> <font color=Green><u>if</u></font> isEscape xmlEscaper c+<a name="line-148"></a> <font color=Green><u>then</u></font>+<a name="line-149"></a> CRef <font color=Cyan>(</font>mkEscape xmlEscaper c<font color=Cyan>)</font> i+<a name="line-150"></a> <font color=Green><u>else</u></font>+<a name="line-151"></a> CString b <font color=Red>[</font>c<font color=Red>]</font> i+<a name="line-152"></a> <font color=Cyan>)</font>+<a name="line-153"></a> str+<a name="line-154"></a> <font color=Cyan>(</font>CElem element i<font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>CElem <font color=Cyan>(</font>escapeElement xmlEscaper element<font color=Cyan>)</font> i<font color=Red>]</font>+<a name="line-155"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> <font color=Red>[</font>content<font color=Red>]</font>+<a name="line-156"></a> <font color=Cyan>)</font>+<a name="line-157"></a> contents+<a name="line-158"></a> <font color=Cyan>)</font>+<a name="line-159"></a>+<a name="line-160"></a><a name="mkEscape"></a><font color=Blue>mkEscape</font> <font color=Red>::</font> XmlEscaper <font color=Red>-></font> Char <font color=Red>-></font> Reference+<a name="line-161"></a><font color=Blue>mkEscape</font> <font color=Cyan>(</font>XmlEscaper <font color=Cyan>{</font>toEscape <font color=Red>=</font> toescape<font color=Cyan>}</font><font color=Cyan>)</font> ch <font color=Red>=</font>+<a name="line-162"></a> <font color=Green><u>case</u></font> lookupFM toescape ch <font color=Green><u>of</u></font>+<a name="line-163"></a> Nothing <font color=Red>-></font> RefChar <font color=Cyan>(</font>ord ch<font color=Cyan>)</font>+<a name="line-164"></a> Just str <font color=Red>-></font> RefEntity str+<a name="line-165"></a><font color=Blue>-- where</font>+<a name="line-166"></a><font color=Blue>-- _ = showIntAtBase 16 intToDigit</font>+<a name="line-167"></a><font color=Blue>-- -- It should be, but in GHC it isn't.</font>+<a name="line-168"></a>+<a name="line-169"></a><font color=Blue>-- ------------------------------------------------------------------------</font>+<a name="line-170"></a><font color=Blue>-- Unescaping</font>+<a name="line-171"></a><font color=Blue>-- ------------------------------------------------------------------------</font>+<a name="line-172"></a>+<a name="line-173"></a><a name="xmlUnEscape"></a><font color=Blue>xmlUnEscape</font> <font color=Red>::</font> XmlEscaper <font color=Red>-></font> Element i <font color=Red>-></font> Element i+<a name="line-174"></a><font color=Blue>xmlUnEscape</font> xmlEscaper element <font color=Red>=</font>+<a name="line-175"></a> compressElement <font color=Cyan>(</font>unEscapeElement xmlEscaper element<font color=Cyan>)</font>+<a name="line-176"></a>+<a name="line-177"></a><a name="xmlUnEscapeContent"></a><font color=Blue>xmlUnEscapeContent</font> <font color=Red>::</font> XmlEscaper <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font>+<a name="line-178"></a><font color=Blue>xmlUnEscapeContent</font> xmlEscaper cs <font color=Red>=</font>+<a name="line-179"></a> compressContent <font color=Cyan>(</font>unEscapeContent xmlEscaper cs<font color=Cyan>)</font>+<a name="line-180"></a>+<a name="line-181"></a><a name="unEscapeElement"></a><font color=Blue>unEscapeElement</font> <font color=Red>::</font> XmlEscaper <font color=Red>-></font> Element i <font color=Red>-></font> Element i+<a name="line-182"></a><font color=Blue>unEscapeElement</font> xmlEscaper <font color=Cyan>(</font>Elem name attributes content<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-183"></a> Elem name <font color=Cyan>(</font>unEscapeAttributes xmlEscaper attributes<font color=Cyan>)</font>+<a name="line-184"></a> <font color=Cyan>(</font>unEscapeContent xmlEscaper content<font color=Cyan>)</font>+<a name="line-185"></a>+<a name="line-186"></a><a name="unEscapeAttributes"></a><font color=Blue>unEscapeAttributes</font> <font color=Red>::</font> XmlEscaper <font color=Red>-></font> <font color=Red>[</font>Attribute<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Attribute<font color=Red>]</font>+<a name="line-187"></a><font color=Blue>unEscapeAttributes</font> xmlEscaper atts <font color=Red>=</font>+<a name="line-188"></a> map+<a name="line-189"></a> <font color=Cyan>(</font><font color=Red>\</font> <font color=Cyan>(</font>name<font color=Cyan>,</font>av<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>name<font color=Cyan>,</font>unEscapeAttValue xmlEscaper av<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-190"></a> atts+<a name="line-191"></a>+<a name="line-192"></a><a name="unEscapeAttValue"></a><font color=Blue>unEscapeAttValue</font> <font color=Red>::</font> XmlEscaper <font color=Red>-></font> AttValue <font color=Red>-></font> AttValue+<a name="line-193"></a><font color=Blue>unEscapeAttValue</font> xmlEscaper <font color=Cyan>(</font>AttValue attValList<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-194"></a> AttValue <font color=Cyan>(</font>+<a name="line-195"></a> map+<a name="line-196"></a> <font color=Cyan>(</font><font color=Red>\</font> av <font color=Red>-></font> <font color=Green><u>case</u></font> av <font color=Green><u>of</u></font>+<a name="line-197"></a> Left <font color=Green><u>_</u></font> <font color=Red>-></font> av+<a name="line-198"></a> Right ref <font color=Red>-></font> <font color=Green><u>case</u></font> unEscapeChar xmlEscaper ref <font color=Green><u>of</u></font>+<a name="line-199"></a> Just c <font color=Red>-></font> Left <font color=Red>[</font>c<font color=Red>]</font>+<a name="line-200"></a> Nothing <font color=Red>-></font> av+<a name="line-201"></a> <font color=Cyan>)</font>+<a name="line-202"></a> attValList+<a name="line-203"></a> <font color=Cyan>)</font>+<a name="line-204"></a>+<a name="line-205"></a><a name="unEscapeContent"></a><font color=Blue>unEscapeContent</font> <font color=Red>::</font> XmlEscaper <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font>+<a name="line-206"></a><font color=Blue>unEscapeContent</font> xmlEscaper content <font color=Red>=</font>+<a name="line-207"></a> map+<a name="line-208"></a> <font color=Cyan>(</font><font color=Red>\</font> cntnt <font color=Red>-></font> <font color=Green><u>case</u></font> cntnt <font color=Green><u>of</u></font>+<a name="line-209"></a> CRef ref i <font color=Red>-></font> <font color=Green><u>case</u></font> unEscapeChar xmlEscaper ref <font color=Green><u>of</u></font>+<a name="line-210"></a> Just c <font color=Red>-></font> CString False <font color=Red>[</font>c<font color=Red>]</font> i+<a name="line-211"></a> Nothing <font color=Red>-></font> cntnt+<a name="line-212"></a> CElem element i <font color=Red>-></font> CElem <font color=Cyan>(</font>unEscapeElement xmlEscaper element<font color=Cyan>)</font> i+<a name="line-213"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> cntnt+<a name="line-214"></a> <font color=Cyan>)</font>+<a name="line-215"></a> content+<a name="line-216"></a>+<a name="line-217"></a><a name="unEscapeChar"></a><font color=Blue>unEscapeChar</font> <font color=Red>::</font> XmlEscaper <font color=Red>-></font> Reference <font color=Red>-></font> Maybe Char+<a name="line-218"></a><font color=Blue>unEscapeChar</font> xmlEscaper ref <font color=Red>=</font>+<a name="line-219"></a> <font color=Green><u>case</u></font> ref <font color=Green><u>of</u></font>+<a name="line-220"></a> RefChar i <font color=Red>-></font> Just <font color=Cyan>(</font>chr i<font color=Cyan>)</font>+<a name="line-221"></a> RefEntity name <font color=Red>-></font> lookupFM <font color=Cyan>(</font>fromEscape xmlEscaper<font color=Cyan>)</font> name+<a name="line-222"></a>+<a name="line-223"></a><font color=Blue>-- ------------------------------------------------------------------------</font>+<a name="line-224"></a><font color=Blue>-- After escaping and unescaping we rebuild the lists, compressing</font>+<a name="line-225"></a><font color=Blue>-- adjacent identical character data.</font>+<a name="line-226"></a><font color=Blue>-- ------------------------------------------------------------------------</font>+<a name="line-227"></a>+<a name="line-228"></a><a name="compressElement"></a><font color=Blue>compressElement</font> <font color=Red>::</font> Element i <font color=Red>-></font> Element i+<a name="line-229"></a><font color=Blue>compressElement</font> <font color=Cyan>(</font>Elem name attributes content<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-230"></a> Elem name <font color=Cyan>(</font>compressAttributes attributes<font color=Cyan>)</font> <font color=Cyan>(</font>compressContent content<font color=Cyan>)</font>+<a name="line-231"></a>+<a name="line-232"></a><a name="compressAttributes"></a><font color=Blue>compressAttributes</font> <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font>AttValue<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font>AttValue<font color=Cyan>)</font><font color=Red>]</font>+<a name="line-233"></a><font color=Blue>compressAttributes</font> atts <font color=Red>=</font>+<a name="line-234"></a> map+<a name="line-235"></a> <font color=Cyan>(</font><font color=Red>\</font> <font color=Cyan>(</font>name<font color=Cyan>,</font>av<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>name<font color=Cyan>,</font>compressAttValue av<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-236"></a> atts+<a name="line-237"></a>+<a name="line-238"></a><a name="compressAttValue"></a><font color=Blue>compressAttValue</font> <font color=Red>::</font> AttValue <font color=Red>-></font> AttValue+<a name="line-239"></a><font color=Blue>compressAttValue</font> <font color=Cyan>(</font>AttValue l<font color=Cyan>)</font> <font color=Red>=</font> AttValue <font color=Cyan>(</font>compress l<font color=Cyan>)</font>+<a name="line-240"></a> <font color=Green><u>where</u></font>+<a name="line-241"></a> compress <font color=Red>::</font> <font color=Red>[</font>Either String Reference<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Either String Reference<font color=Red>]</font>+<a name="line-242"></a> compress [] <font color=Red>=</font> []+<a name="line-243"></a> compress <font color=Cyan>(</font>Right ref <font color=Red><b>:</b></font> es<font color=Cyan>)</font> <font color=Red>=</font> Right ref <font color=Red><b>:</b></font> <font color=Cyan>(</font>compress es<font color=Cyan>)</font>+<a name="line-244"></a> compress <font color=Cyan>(</font> <font color=Cyan>(</font>ls <font color=Red>@</font> <font color=Cyan>(</font>Left s1<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red><b>:</b></font> es<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-245"></a> <font color=Green><u>case</u></font> compress es <font color=Green><u>of</u></font>+<a name="line-246"></a> <font color=Cyan>(</font>Left s2 <font color=Red><b>:</b></font> es2<font color=Cyan>)</font> <font color=Red>-></font> Left <font color=Cyan>(</font>s1 <font color=Cyan>++</font> s2<font color=Cyan>)</font> <font color=Red><b>:</b></font> es2+<a name="line-247"></a> es2 <font color=Red>-></font> ls <font color=Red><b>:</b></font> es2+<a name="line-248"></a>+<a name="line-249"></a><a name="compressContent"></a><font color=Blue>compressContent</font> <font color=Red>::</font> <font color=Red>[</font>Content i<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font>+<a name="line-250"></a><font color=Blue>compressContent</font> [] <font color=Red>=</font> []+<a name="line-251"></a><font color=Blue>compressContent</font> <font color=Cyan>(</font><font color=Cyan>(</font>csb <font color=Red>@</font> <font color=Cyan>(</font>CString b1 s1 i1<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red><b>:</b></font> cs<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-252"></a> <font color=Green><u>case</u></font> compressContent cs <font color=Green><u>of</u></font>+<a name="line-253"></a> <font color=Cyan>(</font>CString b2 s2 <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red><b>:</b></font> cs2+<a name="line-254"></a> <font color=Red>|</font> b1 <font color=Cyan>==</font> b2+<a name="line-255"></a> <font color=Red>-></font> CString b1 <font color=Cyan>(</font>s1 <font color=Cyan>++</font> s2<font color=Cyan>)</font> i1<font color=Red><b>:</b></font> cs2+<a name="line-256"></a> cs2 <font color=Red>-></font> csb <font color=Red><b>:</b></font> cs2+<a name="line-257"></a><font color=Blue>compressContent</font> <font color=Cyan>(</font>CElem element i <font color=Red><b>:</b></font> cs<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-258"></a> CElem <font color=Cyan>(</font>compressElement element<font color=Cyan>)</font> i <font color=Red><b>:</b></font> compressContent cs+<a name="line-259"></a><font color=Blue>compressContent</font> <font color=Cyan>(</font>c <font color=Red><b>:</b></font> cs<font color=Cyan>)</font> <font color=Red>=</font> c <font color=Red><b>:</b></font> compressContent cs+<a name="line-260"></a>+<a name="line-261"></a>+<a name="line-262"></a><font color=Blue>-- ------------------------------------------------------------------------</font>+<a name="line-263"></a><font color=Blue>-- Making XmlEscaper values.</font>+<a name="line-264"></a><font color=Blue>-- ------------------------------------------------------------------------</font>+<a name="line-265"></a>+<a name="line-266"></a><a name="stdXmlEscaper"></a><font color=Blue>stdXmlEscaper</font> <font color=Red>::</font> XmlEscaper+<a name="line-267"></a><font color=Blue>stdXmlEscaper</font> <font color=Red>=</font> mkXmlEscaper+<a name="line-268"></a> <font color=Red>[</font><font color=Cyan>(</font><font color=Magenta>'\60'</font><font color=Cyan>,</font><font color=Magenta>"lt"</font><font color=Cyan>)</font><font color=Cyan>,</font><font color=Cyan>(</font><font color=Magenta>'\62'</font><font color=Cyan>,</font><font color=Magenta>"gt"</font><font color=Cyan>)</font><font color=Cyan>,</font><font color=Cyan>(</font><font color=Magenta>'\38'</font><font color=Cyan>,</font><font color=Magenta>"amp"</font><font color=Cyan>)</font><font color=Cyan>,</font><font color=Cyan>(</font><font color=Magenta>'\39'</font><font color=Cyan>,</font><font color=Magenta>"apos"</font><font color=Cyan>)</font><font color=Cyan>,</font><font color=Cyan>(</font><font color=Magenta>'\34'</font><font color=Cyan>,</font><font color=Magenta>"quot"</font><font color=Cyan>)</font><font color=Red>]</font>+<a name="line-269"></a> <font color=Cyan>(</font><font color=Red>\</font> ch <font color=Red>-></font>+<a name="line-270"></a> <font color=Green><u>let</u></font>+<a name="line-271"></a> i <font color=Red>=</font> ord ch+<a name="line-272"></a> <font color=Green><u>in</u></font>+<a name="line-273"></a> i <font color=Cyan><</font> <font color=Magenta>10</font> <font color=Cyan>||</font> <font color=Cyan>(</font><font color=Magenta>10</font><font color=Cyan><</font>i <font color=Cyan>&&</font> i<font color=Cyan><</font><font color=Magenta>32</font><font color=Cyan>)</font> <font color=Cyan>||</font> i <font color=Cyan>>=</font> <font color=Magenta>127</font> <font color=Cyan>||</font>+<a name="line-274"></a> <font color=Green><u>case</u></font> ch <font color=Green><u>of</u></font>+<a name="line-275"></a> <font color=Magenta>'\''</font> <font color=Red>-></font> True+<a name="line-276"></a> <font color=Magenta>'\"'</font> <font color=Red>-></font> True+<a name="line-277"></a> <font color=Magenta>'&'</font> <font color=Red>-></font> True+<a name="line-278"></a> <font color=Magenta>'<'</font> <font color=Red>-></font> True+<a name="line-279"></a> <font color=Magenta>'>'</font> <font color=Red>-></font> True+<a name="line-280"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> False+<a name="line-281"></a> <font color=Cyan>)</font>+<a name="line-282"></a>+<a name="line-283"></a>+<a name="line-284"></a><a name="mkXmlEscaper"></a><font color=Blue>mkXmlEscaper</font> <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>Char<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> <font color=Cyan>(</font>Char <font color=Red>-></font> Bool<font color=Cyan>)</font> <font color=Red>-></font> XmlEscaper+<a name="line-285"></a><font color=Blue>mkXmlEscaper</font> escapes isescape <font color=Red>=</font>+<a name="line-286"></a> XmlEscaper <font color=Cyan>{</font>+<a name="line-287"></a> toEscape <font color=Red>=</font> listToFM escapes<font color=Cyan>,</font>+<a name="line-288"></a> fromEscape <font color=Red>=</font> listToFM <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font> <font color=Cyan>(</font>c<font color=Cyan>,</font>str<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>str<font color=Cyan>,</font>c<font color=Cyan>)</font><font color=Cyan>)</font> escapes<font color=Cyan>)</font><font color=Cyan>,</font>+<a name="line-289"></a> isEscape <font color=Red>=</font> isescape+<a name="line-290"></a> <font color=Cyan>}</font>+<a name="line-291"></a> </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/Html/Generate.html view
@@ -1,179 +1,185 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>-- | These are just some common abbreviations for generating HTML</font>-<a name="(line2)"></a><font color=Blue>-- content within the XML transformation framework defined</font>-<a name="(line3)"></a><font color=Blue>-- by "Text.Xml.HaXml.Combinators".</font>-<a name="(line4)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Html<font color=Cyan>.</font>Generate-<a name="(line5)"></a> <font color=Cyan>(</font> <font color=Blue>-- * HTML construction filters</font>-<a name="(line6)"></a> <font color=Blue>-- ** Containers</font>-<a name="(line7)"></a> html-<a name="(line8)"></a> <font color=Cyan>,</font> hhead-<a name="(line9)"></a> <font color=Cyan>,</font> htitle-<a name="(line10)"></a> <font color=Cyan>,</font> hbody-<a name="(line11)"></a> <font color=Cyan>,</font> h1<font color=Cyan>,</font> h2<font color=Cyan>,</font> h3<font color=Cyan>,</font> h4-<a name="(line12)"></a> <font color=Cyan>,</font> hpara-<a name="(line13)"></a> <font color=Cyan>,</font> hdiv<font color=Cyan>,</font> hspan<font color=Cyan>,</font> margin-<a name="(line14)"></a> <font color=Blue>-- ** Anchors</font>-<a name="(line15)"></a> <font color=Cyan>,</font> anchor<font color=Cyan>,</font> makehref<font color=Cyan>,</font> anchorname-<a name="(line16)"></a> <font color=Blue>-- ** Text style</font>-<a name="(line17)"></a> <font color=Cyan>,</font> hpre-<a name="(line18)"></a> <font color=Cyan>,</font> hcentre-<a name="(line19)"></a> <font color=Cyan>,</font> hem<font color=Cyan>,</font> htt<font color=Cyan>,</font> hbold-<a name="(line20)"></a> <font color=Cyan>,</font> parens<font color=Cyan>,</font> bullet-<a name="(line21)"></a> <font color=Blue>-- ** Tables</font>-<a name="(line22)"></a> <font color=Cyan>,</font> htable<font color=Cyan>,</font> hrow<font color=Cyan>,</font> hcol-<a name="(line23)"></a> <font color=Blue>-- ** Breaks, lines</font>-<a name="(line24)"></a> <font color=Cyan>,</font> hbr<font color=Cyan>,</font> hhr-<a name="(line25)"></a> <font color=Blue>-- ** Attributes</font>-<a name="(line26)"></a> <font color=Cyan>,</font> showattr<font color=Cyan>,</font> <font color=Cyan>(</font><font color=Cyan>!</font><font color=Cyan>)</font><font color=Cyan>,</font> <font color=Cyan>(</font><font color=Cyan>?</font><font color=Cyan>)</font>-<a name="(line27)"></a> <font color=Blue>-- * A simple HTML pretty-printer</font>-<a name="(line28)"></a> <font color=Cyan>,</font> htmlprint-<a name="(line29)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line30)"></a>-<a name="(line31)"></a><font color=Green><u>import</u></font> Char <font color=Cyan>(</font>isSpace<font color=Cyan>)</font>-<a name="(line32)"></a>-<a name="(line33)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line34)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Combinators-<a name="(line35)"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Text<font color=Cyan>.</font>PrettyPrint<font color=Cyan>.</font>HughesPJ <font color=Green><u>as</u></font> Pretty-<a name="(line36)"></a>-<a name="(line37)"></a><font color=Blue>---- Constructor functions</font>-<a name="(line38)"></a>-<a name="(line39)"></a><a name="html"></a>html<font color=Cyan>,</font> hhead<font color=Cyan>,</font> htitle<font color=Cyan>,</font> hbody<font color=Cyan>,</font> h1<font color=Cyan>,</font> h2<font color=Cyan>,</font> h3<font color=Cyan>,</font> h4<font color=Cyan>,</font> hpara<font color=Cyan>,</font> hpre<font color=Cyan>,</font> hcentre<font color=Cyan>,</font>-<a name="(line40)"></a> hem<font color=Cyan>,</font> htt<font color=Cyan>,</font> hbold<font color=Cyan>,</font> htable<font color=Cyan>,</font> hrow<font color=Cyan>,</font> hcol<font color=Cyan>,</font> hdiv<font color=Cyan>,</font> hspan<font color=Cyan>,</font> margin-<a name="(line41)"></a> <font color=Red>::</font> <font color=Red>[</font>CFilter i<font color=Red>]</font> <font color=Red>-></font> CFilter i-<a name="(line42)"></a>html <font color=Red>=</font> mkElem <font color=Magenta>"html"</font>-<a name="(line43)"></a><a name="hhead"></a>hhead <font color=Red>=</font> mkElem <font color=Magenta>"head"</font>-<a name="(line44)"></a><a name="htitle"></a>htitle <font color=Red>=</font> mkElem <font color=Magenta>"title"</font>-<a name="(line45)"></a><a name="hbody"></a>hbody <font color=Red>=</font> mkElem <font color=Magenta>"body"</font>-<a name="(line46)"></a><a name="h1"></a>h1 <font color=Red>=</font> mkElem <font color=Magenta>"h1"</font>-<a name="(line47)"></a><a name="h2"></a>h2 <font color=Red>=</font> mkElem <font color=Magenta>"h2"</font>-<a name="(line48)"></a><a name="h3"></a>h3 <font color=Red>=</font> mkElem <font color=Magenta>"h3"</font>-<a name="(line49)"></a><a name="h4"></a>h4 <font color=Red>=</font> mkElem <font color=Magenta>"h4"</font>-<a name="(line50)"></a><a name="hpara"></a>hpara <font color=Red>=</font> mkElem <font color=Magenta>"p"</font>-<a name="(line51)"></a><a name="hpre"></a>hpre <font color=Red>=</font> mkElem <font color=Magenta>"pre"</font>-<a name="(line52)"></a><a name="hcentre"></a>hcentre <font color=Red>=</font> mkElem <font color=Magenta>"center"</font>-<a name="(line53)"></a><a name="hem"></a>hem <font color=Red>=</font> mkElem <font color=Magenta>"em"</font>-<a name="(line54)"></a><a name="htt"></a>htt <font color=Red>=</font> mkElem <font color=Magenta>"tt"</font>-<a name="(line55)"></a><a name="hbold"></a>hbold <font color=Red>=</font> mkElem <font color=Magenta>"b"</font>-<a name="(line56)"></a>-<a name="(line57)"></a><a name="htable"></a>htable <font color=Red>=</font> mkElem <font color=Magenta>"table"</font>-<a name="(line58)"></a><a name="hrow"></a>hrow <font color=Red>=</font> mkElem <font color=Magenta>"tr"</font>-<a name="(line59)"></a><a name="hcol"></a>hcol <font color=Red>=</font> mkElem <font color=Magenta>"td"</font>-<a name="(line60)"></a>-<a name="(line61)"></a><a name="hdiv"></a>hdiv <font color=Red>=</font> mkElem <font color=Magenta>"div"</font>-<a name="(line62)"></a><a name="hspan"></a>hspan <font color=Red>=</font> mkElem <font color=Magenta>"span"</font>-<a name="(line63)"></a><a name="margin"></a>margin <font color=Red>=</font> mkElemAttr <font color=Magenta>"div"</font> <font color=Red>[</font><font color=Cyan>(</font><font color=Magenta>"margin-left"</font><font color=Cyan>,</font><font color=Cyan>(</font><font color=Magenta>"2em"</font><font color=Cyan>!</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>,</font>-<a name="(line64)"></a> <font color=Cyan>(</font><font color=Magenta>"margin-top"</font><font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"1em"</font><font color=Cyan>!</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Red>]</font>-<a name="(line65)"></a>-<a name="(line66)"></a><a name="anchor"></a>anchor <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font> CFilter i<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>CFilter i<font color=Red>]</font> <font color=Red>-></font> CFilter i-<a name="(line67)"></a>anchor <font color=Red>=</font> mkElemAttr <font color=Magenta>"a"</font>-<a name="(line68)"></a>-<a name="(line69)"></a><a name="makehref"></a>makehref<font color=Cyan>,</font> anchorname <font color=Red>::</font> CFilter i <font color=Red>-></font> <font color=Red>[</font>CFilter i<font color=Red>]</font> <font color=Red>-></font> CFilter i-<a name="(line70)"></a>makehref r <font color=Red>=</font> anchor <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"href"</font><font color=Cyan>,</font>r<font color=Cyan>)</font> <font color=Red>]</font>-<a name="(line71)"></a><a name="anchorname"></a>anchorname n <font color=Red>=</font> anchor <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"name"</font><font color=Cyan>,</font>n<font color=Cyan>)</font> <font color=Red>]</font>-<a name="(line72)"></a>-<a name="(line73)"></a>-<a name="(line74)"></a><a name="hbr"></a>hbr<font color=Cyan>,</font> hhr <font color=Red>::</font> CFilter i-<a name="(line75)"></a>hbr <font color=Red>=</font> mkElem <font color=Magenta>"br"</font> []-<a name="(line76)"></a><a name="hhr"></a>hhr <font color=Red>=</font> mkElem <font color=Magenta>"hr"</font> []-<a name="(line77)"></a>-<a name="(line78)"></a>-<a name="(line79)"></a><a name="showattr"></a>showattr<font color=Cyan>,</font> <font color=Cyan>(</font><font color=Cyan>!</font><font color=Cyan>)</font><font color=Cyan>,</font> <font color=Cyan>(</font><font color=Cyan>?</font><font color=Cyan>)</font> <font color=Red>::</font> String <font color=Red>-></font> CFilter i-<a name="(line80)"></a>showattr n <font color=Red>=</font> find n literal-<a name="(line81)"></a><a name="!"></a><font color=Cyan>(</font><font color=Cyan>!</font><font color=Cyan>)</font> <font color=Red>=</font> literal-<a name="(line82)"></a><a name="?"></a><font color=Cyan>(</font><font color=Cyan>?</font><font color=Cyan>)</font> <font color=Red>=</font> showattr-<a name="(line83)"></a>-<a name="(line84)"></a><a name="parens"></a>parens <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i-<a name="(line85)"></a>parens f <font color=Red>=</font> cat <font color=Red>[</font> literal <font color=Magenta>"("</font><font color=Cyan>,</font> f<font color=Cyan>,</font> literal <font color=Magenta>")"</font> <font color=Red>]</font>-<a name="(line86)"></a>-<a name="(line87)"></a><a name="bullet"></a>bullet <font color=Red>::</font> <font color=Red>[</font>CFilter i<font color=Red>]</font> <font color=Red>-></font> CFilter i-<a name="(line88)"></a>bullet <font color=Red>=</font> cat <font color=Cyan>.</font> <font color=Cyan>(</font>literal <font color=Magenta>"M-^U"</font><font color=Red><b>:</b></font><font color=Cyan>)</font>-<a name="(line89)"></a>-<a name="(line90)"></a>-<a name="(line91)"></a><font color=Blue>---- Printing function</font>-<a name="(line92)"></a>-<a name="(line93)"></a><font color=Blue>-- htmlprint :: [Content] -> String</font>-<a name="(line94)"></a><font color=Blue>-- htmlprint = concatMap cprint</font>-<a name="(line95)"></a><font color=Blue>-- where</font>-<a name="(line96)"></a><font color=Blue>-- cprint (CElem e _) = elem e</font>-<a name="(line97)"></a><font color=Blue>-- cprint (CString _ s) = s</font>-<a name="(line98)"></a><font color=Blue>-- cprint (CMisc m) = ""</font>-<a name="(line99)"></a><font color=Blue>--</font>-<a name="(line100)"></a><font color=Blue>-- elem (Elem n as []) = "\n<"++n++attrs as++" />"</font>-<a name="(line101)"></a><font color=Blue>-- elem (Elem n as cs) = "\n<"++n++attrs as++">"++htmlprint cs++"\n</"++n++">"</font>-<a name="(line102)"></a><font color=Blue>--</font>-<a name="(line103)"></a><font color=Blue>-- attrs = concatMap attr</font>-<a name="(line104)"></a><font color=Blue>-- attr (n,v) = " "++n++"='"++v++"'"</font>-<a name="(line105)"></a>-<a name="(line106)"></a>-<a name="(line107)"></a><a name="htmlprint"></a>htmlprint <font color=Red>::</font> <font color=Red>[</font>Content i<font color=Red>]</font> <font color=Red>-></font> Pretty<font color=Cyan>.</font>Doc-<a name="(line108)"></a>htmlprint <font color=Red>=</font> Pretty<font color=Cyan>.</font>cat <font color=Cyan>.</font> map cprint <font color=Cyan>.</font> foldrefs-<a name="(line109)"></a> <font color=Green><u>where</u></font>-<a name="(line110)"></a> foldrefs [] <font color=Red>=</font> []-<a name="(line111)"></a> foldrefs <font color=Cyan>(</font>CString ws s1 i<font color=Red><b>:</b></font>CRef r <font color=Green><u>_</u></font><font color=Red><b>:</b></font>CString <font color=Green><u>_</u></font> s2 <font color=Green><u>_</u></font><font color=Red><b>:</b></font>cs<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line112)"></a> CString ws <font color=Cyan>(</font>s1<font color=Cyan>++</font><font color=Magenta>"&"</font><font color=Cyan>++</font>ref r<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>++</font>s2<font color=Cyan>)</font> i<font color=Red><b>:</b></font> foldrefs cs-<a name="(line113)"></a> foldrefs <font color=Cyan>(</font>c<font color=Red><b>:</b></font>cs<font color=Cyan>)</font> <font color=Red>=</font> c <font color=Red><b>:</b></font> foldrefs cs-<a name="(line114)"></a>-<a name="(line115)"></a><font color=Blue>--ref (RefEntity (EntityRef n)) = n -- Actually, should look-up symtable.</font>-<a name="(line116)"></a><font color=Blue>--ref (RefChar (CharRef s)) = s</font>-<a name="(line117)"></a> ref <font color=Cyan>(</font>RefEntity n<font color=Cyan>)</font> <font color=Red>=</font> n <font color=Blue>-- Actually, should look-up symtable.</font>-<a name="(line118)"></a> ref <font color=Cyan>(</font>RefChar s<font color=Cyan>)</font> <font color=Red>=</font> show s-<a name="(line119)"></a>-<a name="(line120)"></a> cprint <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> element e-<a name="(line121)"></a> cprint <font color=Cyan>(</font>CString ws s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> Pretty<font color=Cyan>.</font>cat <font color=Cyan>(</font>map Pretty<font color=Cyan>.</font>text <font color=Cyan>(</font>fmt <font color=Magenta>60</font>-<a name="(line122)"></a> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Green><u>if</u></font> ws <font color=Green><u>then</u></font> id <font color=Green><u>else</u></font> deSpace<font color=Cyan>)</font> s<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line123)"></a> cprint <font color=Cyan>(</font>CRef r <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> Pretty<font color=Cyan>.</font>text <font color=Cyan>(</font><font color=Magenta>"&"</font><font color=Cyan>++</font>ref r<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font>-<a name="(line124)"></a> cprint <font color=Cyan>(</font>CMisc <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> Pretty<font color=Cyan>.</font>empty-<a name="(line125)"></a>-<a name="(line126)"></a> element <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font> <font color=Red>=</font> Pretty<font color=Cyan>.</font>text <font color=Magenta>"<"</font> Pretty<font color=Cyan>.<></font>-<a name="(line127)"></a> Pretty<font color=Cyan>.</font>text n Pretty<font color=Cyan>.<></font>-<a name="(line128)"></a> attrs <font color=Green><u>as</u></font> Pretty<font color=Cyan>.<></font>-<a name="(line129)"></a> Pretty<font color=Cyan>.</font>text <font color=Magenta>" />"</font>-<a name="(line130)"></a> element <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line131)"></a> <font color=Blue>-- ( Pretty.text "<" Pretty.<></font>-<a name="(line132)"></a> <font color=Blue>-- Pretty.text n Pretty.<></font>-<a name="(line133)"></a> <font color=Blue>-- attrs as Pretty.<></font>-<a name="(line134)"></a> <font color=Blue>-- Pretty.text ">") Pretty.$$</font>-<a name="(line135)"></a> <font color=Blue>-- Pretty.nest 6 (htmlprint cs) Pretty.$$</font>-<a name="(line136)"></a> <font color=Blue>-- ( Pretty.text "</" Pretty.<></font>-<a name="(line137)"></a> <font color=Blue>-- Pretty.text n Pretty.<></font>-<a name="(line138)"></a> <font color=Blue>-- Pretty.text ">" )</font>-<a name="(line139)"></a> Pretty<font color=Cyan>.</font>fcat <font color=Red>[</font> <font color=Cyan>(</font> Pretty<font color=Cyan>.</font>text <font color=Magenta>"<"</font> Pretty<font color=Cyan>.<></font>-<a name="(line140)"></a> Pretty<font color=Cyan>.</font>text n Pretty<font color=Cyan>.<></font>-<a name="(line141)"></a> attrs <font color=Green><u>as</u></font> Pretty<font color=Cyan>.<></font>-<a name="(line142)"></a> Pretty<font color=Cyan>.</font>text <font color=Magenta>">"</font><font color=Cyan>)</font>-<a name="(line143)"></a> <font color=Cyan>,</font> Pretty<font color=Cyan>.</font>nest <font color=Magenta>4</font> <font color=Cyan>(</font>htmlprint cs<font color=Cyan>)</font>-<a name="(line144)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> Pretty<font color=Cyan>.</font>text <font color=Magenta>"</"</font> Pretty<font color=Cyan>.<></font>-<a name="(line145)"></a> Pretty<font color=Cyan>.</font>text n Pretty<font color=Cyan>.<></font>-<a name="(line146)"></a> Pretty<font color=Cyan>.</font>text <font color=Magenta>">"</font> <font color=Cyan>)</font>-<a name="(line147)"></a> <font color=Red>]</font>-<a name="(line148)"></a>-<a name="(line149)"></a> attrs <font color=Red>=</font> Pretty<font color=Cyan>.</font>cat <font color=Cyan>.</font> map attribute-<a name="(line150)"></a> attribute <font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line151)"></a> Pretty<font color=Cyan>.</font>text <font color=Magenta>" "</font> Pretty<font color=Cyan>.<></font>-<a name="(line152)"></a> Pretty<font color=Cyan>.</font>text n Pretty<font color=Cyan>.<></font>-<a name="(line153)"></a> Pretty<font color=Cyan>.</font>text <font color=Magenta>"='"</font> Pretty<font color=Cyan>.<></font>-<a name="(line154)"></a> Pretty<font color=Cyan>.</font>text <font color=Cyan>(</font>show v<font color=Cyan>)</font> Pretty<font color=Cyan>.<></font>-<a name="(line155)"></a> Pretty<font color=Cyan>.</font>text <font color=Magenta>"'"</font>-<a name="(line156)"></a>-<a name="(line157)"></a> fmt <font color=Green><u>_</u></font> [] <font color=Red>=</font> []-<a name="(line158)"></a> fmt n s <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>top<font color=Cyan>,</font>bot<font color=Cyan>)</font> <font color=Red>=</font> splitAt n s-<a name="(line159)"></a> <font color=Cyan>(</font>word<font color=Cyan>,</font>left<font color=Cyan>)</font> <font color=Red>=</font> keepUntil isSpace <font color=Cyan>(</font>reverse top<font color=Cyan>)</font>-<a name="(line160)"></a> <font color=Green><u>in</u></font> <font color=Green><u>if</u></font> length top <font color=Cyan><</font> n <font color=Green><u>then</u></font> <font color=Red>[</font>s<font color=Red>]</font>-<a name="(line161)"></a> <font color=Green><u>else</u></font> <font color=Green><u>if</u></font> not <font color=Cyan>(</font>null left<font color=Cyan>)</font> <font color=Green><u>then</u></font>-<a name="(line162)"></a> reverse left<font color=Red><b>:</b></font> fmt n <font color=Cyan>(</font>word<font color=Cyan>++</font>bot<font color=Cyan>)</font>-<a name="(line163)"></a> <font color=Green><u>else</u></font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>big<font color=Cyan>,</font>rest<font color=Cyan>)</font> <font color=Red>=</font> keepUntil isSpace s-<a name="(line164)"></a> <font color=Green><u>in</u></font> reverse big<font color=Red><b>:</b></font> fmt n rest-<a name="(line165)"></a>-<a name="(line166)"></a> deSpace [] <font color=Red>=</font> []-<a name="(line167)"></a> deSpace <font color=Cyan>(</font>c<font color=Red><b>:</b></font>cs<font color=Cyan>)</font> <font color=Red>|</font> c<font color=Cyan>==</font><font color=Magenta>'\n'</font> <font color=Red>=</font> deSpace <font color=Cyan>(</font><font color=Magenta>' '</font><font color=Red><b>:</b></font>cs<font color=Cyan>)</font>-<a name="(line168)"></a> <font color=Red>|</font> isSpace c <font color=Red>=</font> c <font color=Red><b>:</b></font> deSpace <font color=Cyan>(</font>dropWhile isSpace cs<font color=Cyan>)</font>-<a name="(line169)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> c <font color=Red><b>:</b></font> deSpace cs-<a name="(line170)"></a>-<a name="(line171)"></a> keepUntil p xs <font color=Red>=</font> select p <font color=Cyan>(</font>[]<font color=Cyan>,</font>xs<font color=Cyan>)</font>-<a name="(line172)"></a> <font color=Green><u>where</u></font> select <font color=Green><u>_</u></font> <font color=Cyan>(</font>ls<font color=Cyan>,</font>[]<font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>ls<font color=Cyan>,</font>[]<font color=Cyan>)</font>-<a name="(line173)"></a> select q <font color=Cyan>(</font>ls<font color=Cyan>,</font><font color=Cyan>(</font>y<font color=Red><b>:</b></font>ys<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>|</font> q y <font color=Red>=</font> <font color=Cyan>(</font>ls<font color=Cyan>,</font>y<font color=Red><b>:</b></font>ys<font color=Cyan>)</font>-<a name="(line174)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> select q <font color=Cyan>(</font>y<font color=Red><b>:</b></font>ls<font color=Cyan>,</font>ys<font color=Cyan>)</font>-<a name="(line175)"></a>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/Html/Generate.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>-- | These are just some common abbreviations for generating HTML</font>+<a name="line-2"></a><font color=Blue>-- content within the XML transformation framework defined</font>+<a name="line-3"></a><font color=Blue>-- by "Text.Xml.HaXml.Combinators".</font>+<a name="line-4"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Html<font color=Cyan>.</font>Generate+<a name="line-5"></a> <font color=Cyan>(</font> <font color=Blue>-- * HTML construction filters</font>+<a name="line-6"></a> <font color=Blue>-- ** Containers</font>+<a name="line-7"></a> html+<a name="line-8"></a> <font color=Cyan>,</font> hhead+<a name="line-9"></a> <font color=Cyan>,</font> htitle+<a name="line-10"></a> <font color=Cyan>,</font> hbody+<a name="line-11"></a> <font color=Cyan>,</font> h1<font color=Cyan>,</font> h2<font color=Cyan>,</font> h3<font color=Cyan>,</font> h4+<a name="line-12"></a> <font color=Cyan>,</font> hpara+<a name="line-13"></a> <font color=Cyan>,</font> hdiv<font color=Cyan>,</font> hspan<font color=Cyan>,</font> margin+<a name="line-14"></a> <font color=Blue>-- ** Anchors</font>+<a name="line-15"></a> <font color=Cyan>,</font> anchor<font color=Cyan>,</font> makehref<font color=Cyan>,</font> anchorname+<a name="line-16"></a> <font color=Blue>-- ** Text style</font>+<a name="line-17"></a> <font color=Cyan>,</font> hpre+<a name="line-18"></a> <font color=Cyan>,</font> hcentre+<a name="line-19"></a> <font color=Cyan>,</font> hem<font color=Cyan>,</font> htt<font color=Cyan>,</font> hbold+<a name="line-20"></a> <font color=Cyan>,</font> parens<font color=Cyan>,</font> bullet+<a name="line-21"></a> <font color=Blue>-- ** Tables</font>+<a name="line-22"></a> <font color=Cyan>,</font> htable<font color=Cyan>,</font> hrow<font color=Cyan>,</font> hcol+<a name="line-23"></a> <font color=Blue>-- ** Breaks, lines</font>+<a name="line-24"></a> <font color=Cyan>,</font> hbr<font color=Cyan>,</font> hhr+<a name="line-25"></a> <font color=Blue>-- ** Attributes</font>+<a name="line-26"></a> <font color=Cyan>,</font> showattr<font color=Cyan>,</font> <font color=Cyan>(</font><font color=Cyan>!</font><font color=Cyan>)</font><font color=Cyan>,</font> <font color=Cyan>(</font><font color=Cyan>?</font><font color=Cyan>)</font>+<a name="line-27"></a> <font color=Blue>-- * A simple HTML pretty-printer</font>+<a name="line-28"></a> <font color=Cyan>,</font> htmlprint+<a name="line-29"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-30"></a>+<a name="line-31"></a><font color=Green><u>import</u></font> Char <font color=Cyan>(</font>isSpace<font color=Cyan>)</font>+<a name="line-32"></a>+<a name="line-33"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-34"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Combinators+<a name="line-35"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Text<font color=Cyan>.</font>PrettyPrint<font color=Cyan>.</font>HughesPJ <font color=Green><u>as</u></font> Pretty+<a name="line-36"></a>+<a name="line-37"></a><font color=Blue>---- Constructor functions</font>+<a name="line-38"></a>+<a name="line-39"></a><a name="html"></a><font color=Blue>html</font><font color=Cyan>,</font> hhead<font color=Cyan>,</font> htitle<font color=Cyan>,</font> hbody<font color=Cyan>,</font> h1<font color=Cyan>,</font> h2<font color=Cyan>,</font> h3<font color=Cyan>,</font> h4<font color=Cyan>,</font> hpara<font color=Cyan>,</font> hpre<font color=Cyan>,</font> hcentre<font color=Cyan>,</font>+<a name="line-40"></a> hem<font color=Cyan>,</font> htt<font color=Cyan>,</font> hbold<font color=Cyan>,</font> htable<font color=Cyan>,</font> hrow<font color=Cyan>,</font> hcol<font color=Cyan>,</font> hdiv<font color=Cyan>,</font> hspan<font color=Cyan>,</font> margin+<a name="line-41"></a> <font color=Red>::</font> <font color=Red>[</font>CFilter i<font color=Red>]</font> <font color=Red>-></font> CFilter i+<a name="line-42"></a><font color=Blue>html</font> <font color=Red>=</font> mkElem <font color=Magenta>"html"</font>+<a name="line-43"></a><a name="hhead"></a><font color=Blue>hhead</font> <font color=Red>=</font> mkElem <font color=Magenta>"head"</font>+<a name="line-44"></a><a name="htitle"></a><font color=Blue>htitle</font> <font color=Red>=</font> mkElem <font color=Magenta>"title"</font>+<a name="line-45"></a><a name="hbody"></a><font color=Blue>hbody</font> <font color=Red>=</font> mkElem <font color=Magenta>"body"</font>+<a name="line-46"></a><a name="h1"></a><font color=Blue>h1</font> <font color=Red>=</font> mkElem <font color=Magenta>"h1"</font>+<a name="line-47"></a><a name="h2"></a><font color=Blue>h2</font> <font color=Red>=</font> mkElem <font color=Magenta>"h2"</font>+<a name="line-48"></a><a name="h3"></a><font color=Blue>h3</font> <font color=Red>=</font> mkElem <font color=Magenta>"h3"</font>+<a name="line-49"></a><a name="h4"></a><font color=Blue>h4</font> <font color=Red>=</font> mkElem <font color=Magenta>"h4"</font>+<a name="line-50"></a><a name="hpara"></a><font color=Blue>hpara</font> <font color=Red>=</font> mkElem <font color=Magenta>"p"</font>+<a name="line-51"></a><a name="hpre"></a><font color=Blue>hpre</font> <font color=Red>=</font> mkElem <font color=Magenta>"pre"</font>+<a name="line-52"></a><a name="hcentre"></a><font color=Blue>hcentre</font> <font color=Red>=</font> mkElem <font color=Magenta>"center"</font>+<a name="line-53"></a><a name="hem"></a><font color=Blue>hem</font> <font color=Red>=</font> mkElem <font color=Magenta>"em"</font>+<a name="line-54"></a><a name="htt"></a><font color=Blue>htt</font> <font color=Red>=</font> mkElem <font color=Magenta>"tt"</font>+<a name="line-55"></a><a name="hbold"></a><font color=Blue>hbold</font> <font color=Red>=</font> mkElem <font color=Magenta>"b"</font>+<a name="line-56"></a>+<a name="line-57"></a><a name="htable"></a><font color=Blue>htable</font> <font color=Red>=</font> mkElem <font color=Magenta>"table"</font>+<a name="line-58"></a><a name="hrow"></a><font color=Blue>hrow</font> <font color=Red>=</font> mkElem <font color=Magenta>"tr"</font>+<a name="line-59"></a><a name="hcol"></a><font color=Blue>hcol</font> <font color=Red>=</font> mkElem <font color=Magenta>"td"</font>+<a name="line-60"></a>+<a name="line-61"></a><a name="hdiv"></a><font color=Blue>hdiv</font> <font color=Red>=</font> mkElem <font color=Magenta>"div"</font>+<a name="line-62"></a><a name="hspan"></a><font color=Blue>hspan</font> <font color=Red>=</font> mkElem <font color=Magenta>"span"</font>+<a name="line-63"></a><a name="margin"></a><font color=Blue>margin</font> <font color=Red>=</font> mkElemAttr <font color=Magenta>"div"</font> <font color=Red>[</font><font color=Cyan>(</font><font color=Magenta>"margin-left"</font><font color=Cyan>,</font><font color=Cyan>(</font><font color=Magenta>"2em"</font><font color=Cyan>!</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>,</font>+<a name="line-64"></a> <font color=Cyan>(</font><font color=Magenta>"margin-top"</font><font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"1em"</font><font color=Cyan>!</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Red>]</font>+<a name="line-65"></a>+<a name="line-66"></a><a name="anchor"></a><font color=Blue>anchor</font> <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font> CFilter i<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>CFilter i<font color=Red>]</font> <font color=Red>-></font> CFilter i+<a name="line-67"></a><font color=Blue>anchor</font> <font color=Red>=</font> mkElemAttr <font color=Magenta>"a"</font>+<a name="line-68"></a>+<a name="line-69"></a><a name="makehref"></a><font color=Blue>makehref</font><font color=Cyan>,</font> anchorname <font color=Red>::</font> CFilter i <font color=Red>-></font> <font color=Red>[</font>CFilter i<font color=Red>]</font> <font color=Red>-></font> CFilter i+<a name="line-70"></a><font color=Blue>makehref</font> r <font color=Red>=</font> anchor <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"href"</font><font color=Cyan>,</font>r<font color=Cyan>)</font> <font color=Red>]</font>+<a name="line-71"></a><a name="anchorname"></a><font color=Blue>anchorname</font> n <font color=Red>=</font> anchor <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"name"</font><font color=Cyan>,</font>n<font color=Cyan>)</font> <font color=Red>]</font>+<a name="line-72"></a>+<a name="line-73"></a>+<a name="line-74"></a><a name="hbr"></a><font color=Blue>hbr</font><font color=Cyan>,</font> hhr <font color=Red>::</font> CFilter i+<a name="line-75"></a><font color=Blue>hbr</font> <font color=Red>=</font> mkElem <font color=Magenta>"br"</font> []+<a name="line-76"></a><a name="hhr"></a><font color=Blue>hhr</font> <font color=Red>=</font> mkElem <font color=Magenta>"hr"</font> []+<a name="line-77"></a>+<a name="line-78"></a>+<a name="line-79"></a><a name="showattr"></a><font color=Blue>showattr</font><font color=Cyan>,</font> <font color=Cyan>(</font><font color=Cyan>!</font><font color=Cyan>)</font><font color=Cyan>,</font> <font color=Cyan>(</font><font color=Cyan>?</font><font color=Cyan>)</font> <font color=Red>::</font> String <font color=Red>-></font> CFilter i+<a name="line-80"></a><font color=Blue>showattr</font> n <font color=Red>=</font> find n literal+<a name="line-81"></a><a name="!"></a><font color=Cyan>(</font><font color=Cyan>!</font><font color=Cyan>)</font> <font color=Red>=</font> literal+<a name="line-82"></a><a name="?"></a><font color=Cyan>(</font><font color=Cyan>?</font><font color=Cyan>)</font> <font color=Red>=</font> showattr+<a name="line-83"></a>+<a name="line-84"></a><a name="parens"></a><font color=Blue>parens</font> <font color=Red>::</font> CFilter i <font color=Red>-></font> CFilter i+<a name="line-85"></a><font color=Blue>parens</font> f <font color=Red>=</font> cat <font color=Red>[</font> literal <font color=Magenta>"("</font><font color=Cyan>,</font> f<font color=Cyan>,</font> literal <font color=Magenta>")"</font> <font color=Red>]</font>+<a name="line-86"></a>+<a name="line-87"></a><a name="bullet"></a><font color=Blue>bullet</font> <font color=Red>::</font> <font color=Red>[</font>CFilter i<font color=Red>]</font> <font color=Red>-></font> CFilter i+<a name="line-88"></a><font color=Blue>bullet</font> <font color=Red>=</font> cat <font color=Cyan>.</font> <font color=Cyan>(</font>literal <font color=Magenta>"M-^U"</font><font color=Red><b>:</b></font><font color=Cyan>)</font>+<a name="line-89"></a>+<a name="line-90"></a>+<a name="line-91"></a><font color=Blue>---- Printing function</font>+<a name="line-92"></a>+<a name="line-93"></a><font color=Blue>-- htmlprint :: [Content] -> String</font>+<a name="line-94"></a><font color=Blue>-- htmlprint = concatMap cprint</font>+<a name="line-95"></a><font color=Blue>-- where</font>+<a name="line-96"></a><font color=Blue>-- cprint (CElem e _) = elem e</font>+<a name="line-97"></a><font color=Blue>-- cprint (CString _ s) = s</font>+<a name="line-98"></a><font color=Blue>-- cprint (CMisc m) = ""</font>+<a name="line-99"></a><font color=Blue>--</font>+<a name="line-100"></a><font color=Blue>-- elem (Elem n as []) = "\n<"++n++attrs as++" />"</font>+<a name="line-101"></a><font color=Blue>-- elem (Elem n as cs) = "\n<"++n++attrs as++">"++htmlprint cs++"\n</"++n++">"</font>+<a name="line-102"></a><font color=Blue>--</font>+<a name="line-103"></a><font color=Blue>-- attrs = concatMap attr</font>+<a name="line-104"></a><font color=Blue>-- attr (n,v) = " "++n++"='"++v++"'"</font>+<a name="line-105"></a>+<a name="line-106"></a>+<a name="line-107"></a><a name="htmlprint"></a><font color=Blue>htmlprint</font> <font color=Red>::</font> <font color=Red>[</font>Content i<font color=Red>]</font> <font color=Red>-></font> Pretty<font color=Cyan>.</font>Doc+<a name="line-108"></a><font color=Blue>htmlprint</font> <font color=Red>=</font> Pretty<font color=Cyan>.</font>cat <font color=Cyan>.</font> map cprint <font color=Cyan>.</font> foldrefs+<a name="line-109"></a> <font color=Green><u>where</u></font>+<a name="line-110"></a> foldrefs [] <font color=Red>=</font> []+<a name="line-111"></a> foldrefs <font color=Cyan>(</font>CString ws s1 i<font color=Red><b>:</b></font>CRef r <font color=Green><u>_</u></font><font color=Red><b>:</b></font>CString <font color=Green><u>_</u></font> s2 <font color=Green><u>_</u></font><font color=Red><b>:</b></font>cs<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-112"></a> CString ws <font color=Cyan>(</font>s1<font color=Cyan>++</font><font color=Magenta>"&"</font><font color=Cyan>++</font>ref r<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>++</font>s2<font color=Cyan>)</font> i<font color=Red><b>:</b></font> foldrefs cs+<a name="line-113"></a> foldrefs <font color=Cyan>(</font>c<font color=Red><b>:</b></font>cs<font color=Cyan>)</font> <font color=Red>=</font> c <font color=Red><b>:</b></font> foldrefs cs+<a name="line-114"></a>+<a name="line-115"></a><font color=Blue>--ref (RefEntity (EntityRef n)) = n -- Actually, should look-up symtable.</font>+<a name="line-116"></a><font color=Blue>--ref (RefChar (CharRef s)) = s</font>+<a name="line-117"></a> ref <font color=Cyan>(</font>RefEntity n<font color=Cyan>)</font> <font color=Red>=</font> n <font color=Blue>-- Actually, should look-up symtable.</font>+<a name="line-118"></a> ref <font color=Cyan>(</font>RefChar s<font color=Cyan>)</font> <font color=Red>=</font> show s+<a name="line-119"></a>+<a name="line-120"></a> cprint <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> element e+<a name="line-121"></a> cprint <font color=Cyan>(</font>CString ws s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> Pretty<font color=Cyan>.</font>cat <font color=Cyan>(</font>map Pretty<font color=Cyan>.</font>text <font color=Cyan>(</font>fmt <font color=Magenta>60</font>+<a name="line-122"></a> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Green><u>if</u></font> ws <font color=Green><u>then</u></font> id <font color=Green><u>else</u></font> deSpace<font color=Cyan>)</font> s<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-123"></a> cprint <font color=Cyan>(</font>CRef r <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> Pretty<font color=Cyan>.</font>text <font color=Cyan>(</font><font color=Magenta>"&"</font><font color=Cyan>++</font>ref r<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font>+<a name="line-124"></a> cprint <font color=Cyan>(</font>CMisc <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> Pretty<font color=Cyan>.</font>empty+<a name="line-125"></a>+<a name="line-126"></a> element <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font> <font color=Red>=</font> Pretty<font color=Cyan>.</font>text <font color=Magenta>"<"</font> Pretty<font color=Cyan>.<></font>+<a name="line-127"></a> Pretty<font color=Cyan>.</font>text n Pretty<font color=Cyan>.<></font>+<a name="line-128"></a> attrs <font color=Green><u>as</u></font> Pretty<font color=Cyan>.<></font>+<a name="line-129"></a> Pretty<font color=Cyan>.</font>text <font color=Magenta>" />"</font>+<a name="line-130"></a> element <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-131"></a> <font color=Blue>-- ( Pretty.text "<" Pretty.<></font>+<a name="line-132"></a> <font color=Blue>-- Pretty.text n Pretty.<></font>+<a name="line-133"></a> <font color=Blue>-- attrs as Pretty.<></font>+<a name="line-134"></a> <font color=Blue>-- Pretty.text ">") Pretty.$$</font>+<a name="line-135"></a> <font color=Blue>-- Pretty.nest 6 (htmlprint cs) Pretty.$$</font>+<a name="line-136"></a> <font color=Blue>-- ( Pretty.text "</" Pretty.<></font>+<a name="line-137"></a> <font color=Blue>-- Pretty.text n Pretty.<></font>+<a name="line-138"></a> <font color=Blue>-- Pretty.text ">" )</font>+<a name="line-139"></a> Pretty<font color=Cyan>.</font>fcat <font color=Red>[</font> <font color=Cyan>(</font> Pretty<font color=Cyan>.</font>text <font color=Magenta>"<"</font> Pretty<font color=Cyan>.<></font>+<a name="line-140"></a> Pretty<font color=Cyan>.</font>text n Pretty<font color=Cyan>.<></font>+<a name="line-141"></a> attrs <font color=Green><u>as</u></font> Pretty<font color=Cyan>.<></font>+<a name="line-142"></a> Pretty<font color=Cyan>.</font>text <font color=Magenta>">"</font><font color=Cyan>)</font>+<a name="line-143"></a> <font color=Cyan>,</font> Pretty<font color=Cyan>.</font>nest <font color=Magenta>4</font> <font color=Cyan>(</font>htmlprint cs<font color=Cyan>)</font>+<a name="line-144"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> Pretty<font color=Cyan>.</font>text <font color=Magenta>"</"</font> Pretty<font color=Cyan>.<></font>+<a name="line-145"></a> Pretty<font color=Cyan>.</font>text n Pretty<font color=Cyan>.<></font>+<a name="line-146"></a> Pretty<font color=Cyan>.</font>text <font color=Magenta>">"</font> <font color=Cyan>)</font>+<a name="line-147"></a> <font color=Red>]</font>+<a name="line-148"></a>+<a name="line-149"></a> attrs <font color=Red>=</font> Pretty<font color=Cyan>.</font>cat <font color=Cyan>.</font> map attribute+<a name="line-150"></a> attribute <font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-151"></a> Pretty<font color=Cyan>.</font>text <font color=Magenta>" "</font> Pretty<font color=Cyan>.<></font>+<a name="line-152"></a> Pretty<font color=Cyan>.</font>text n Pretty<font color=Cyan>.<></font>+<a name="line-153"></a> Pretty<font color=Cyan>.</font>text <font color=Magenta>"='"</font> Pretty<font color=Cyan>.<></font>+<a name="line-154"></a> Pretty<font color=Cyan>.</font>text <font color=Cyan>(</font>show v<font color=Cyan>)</font> Pretty<font color=Cyan>.<></font>+<a name="line-155"></a> Pretty<font color=Cyan>.</font>text <font color=Magenta>"'"</font>+<a name="line-156"></a>+<a name="line-157"></a> fmt <font color=Green><u>_</u></font> [] <font color=Red>=</font> []+<a name="line-158"></a> fmt n s <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>top<font color=Cyan>,</font>bot<font color=Cyan>)</font> <font color=Red>=</font> splitAt n s+<a name="line-159"></a> <font color=Cyan>(</font>word<font color=Cyan>,</font>left<font color=Cyan>)</font> <font color=Red>=</font> keepUntil isSpace <font color=Cyan>(</font>reverse top<font color=Cyan>)</font>+<a name="line-160"></a> <font color=Green><u>in</u></font> <font color=Green><u>if</u></font> length top <font color=Cyan><</font> n <font color=Green><u>then</u></font> <font color=Red>[</font>s<font color=Red>]</font>+<a name="line-161"></a> <font color=Green><u>else</u></font> <font color=Green><u>if</u></font> not <font color=Cyan>(</font>null left<font color=Cyan>)</font> <font color=Green><u>then</u></font>+<a name="line-162"></a> reverse left<font color=Red><b>:</b></font> fmt n <font color=Cyan>(</font>word<font color=Cyan>++</font>bot<font color=Cyan>)</font>+<a name="line-163"></a> <font color=Green><u>else</u></font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>big<font color=Cyan>,</font>rest<font color=Cyan>)</font> <font color=Red>=</font> keepUntil isSpace s+<a name="line-164"></a> <font color=Green><u>in</u></font> reverse big<font color=Red><b>:</b></font> fmt n rest+<a name="line-165"></a>+<a name="line-166"></a> deSpace [] <font color=Red>=</font> []+<a name="line-167"></a> deSpace <font color=Cyan>(</font>c<font color=Red><b>:</b></font>cs<font color=Cyan>)</font> <font color=Red>|</font> c<font color=Cyan>==</font><font color=Magenta>'\n'</font> <font color=Red>=</font> deSpace <font color=Cyan>(</font><font color=Magenta>' '</font><font color=Red><b>:</b></font>cs<font color=Cyan>)</font>+<a name="line-168"></a> <font color=Red>|</font> isSpace c <font color=Red>=</font> c <font color=Red><b>:</b></font> deSpace <font color=Cyan>(</font>dropWhile isSpace cs<font color=Cyan>)</font>+<a name="line-169"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> c <font color=Red><b>:</b></font> deSpace cs+<a name="line-170"></a>+<a name="line-171"></a> keepUntil p xs <font color=Red>=</font> select p <font color=Cyan>(</font>[]<font color=Cyan>,</font>xs<font color=Cyan>)</font>+<a name="line-172"></a> <font color=Green><u>where</u></font> select <font color=Green><u>_</u></font> <font color=Cyan>(</font>ls<font color=Cyan>,</font>[]<font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>ls<font color=Cyan>,</font>[]<font color=Cyan>)</font>+<a name="line-173"></a> select q <font color=Cyan>(</font>ls<font color=Cyan>,</font><font color=Cyan>(</font>y<font color=Red><b>:</b></font>ys<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>|</font> q y <font color=Red>=</font> <font color=Cyan>(</font>ls<font color=Cyan>,</font>y<font color=Red><b>:</b></font>ys<font color=Cyan>)</font>+<a name="line-174"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> select q <font color=Cyan>(</font>y<font color=Red><b>:</b></font>ls<font color=Cyan>,</font>ys<font color=Cyan>)</font>+<a name="line-175"></a> </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/Html/Parse.html view
@@ -1,728 +1,734 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>-- | This is a parser for HTML documents. Unlike for XML documents, it</font>-<a name="(line2)"></a><font color=Blue>-- must include a certain amount of error-correction to account for</font>-<a name="(line3)"></a><font color=Blue>-- HTML features like self-terminating tags, unterminated tags, and</font>-<a name="(line4)"></a><font color=Blue>-- incorrect nesting. The input is tokenised by the</font>-<a name="(line5)"></a><font color=Blue>-- XML lexer (a separate lexer is not required for HTML).</font>-<a name="(line6)"></a>-<a name="(line7)"></a><font color=Blue>-- It uses a slightly extended version of the Hutton/Meijer parser</font>-<a name="(line8)"></a><font color=Blue>-- combinators.</font>-<a name="(line9)"></a>-<a name="(line10)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Html<font color=Cyan>.</font>Parse-<a name="(line11)"></a> <font color=Cyan>(</font> htmlParse-<a name="(line12)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line13)"></a>-<a name="(line14)"></a><font color=Green><u>import</u></font> Prelude hiding <font color=Cyan>(</font>either<font color=Cyan>,</font>maybe<font color=Cyan>,</font>sequence<font color=Cyan>)</font>-<a name="(line15)"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Prelude <font color=Cyan>(</font>either<font color=Cyan>)</font>-<a name="(line16)"></a><font color=Green><u>import</u></font> Maybe hiding <font color=Cyan>(</font>maybe<font color=Cyan>)</font>-<a name="(line17)"></a><font color=Green><u>import</u></font> Char <font color=Cyan>(</font>toLower<font color=Cyan>,</font> isSpace<font color=Cyan>,</font> isDigit<font color=Cyan>,</font> isHexDigit<font color=Cyan>)</font>-<a name="(line18)"></a><font color=Green><u>import</u></font> Numeric <font color=Cyan>(</font>readDec<font color=Cyan>,</font>readHex<font color=Cyan>)</font>-<a name="(line19)"></a><font color=Green><u>import</u></font> Monad-<a name="(line20)"></a>-<a name="(line21)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line22)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Lex-<a name="(line23)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Posn-<a name="(line24)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>Poly<font color=Cyan>.</font>NoLeak<font color=Cyan>.</font>Plain-<a name="(line25)"></a>-<a name="(line26)"></a><font color=Blue>-- #define DEBUG</font>-<a name="(line27)"></a> -<a name="(line28)"></a><font color=Magenta><em>#if defined(DEBUG)</em></font>-<a name="(line29)"></a><font color=Magenta><em># if ( defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 502 ) || \</em></font>-<a name="(line30)"></a> <font color=Cyan>(</font> defined<font color=Cyan>(</font><b><font color=Magenta>__NHC__</font></b><font color=Cyan>)</font> <font color=Cyan>&&</font> <b><font color=Magenta>__NHC__</font></b> <font color=Cyan>></font> <font color=Magenta>114</font> <font color=Cyan>)</font> <font color=Cyan>||</font> defined<font color=Cyan>(</font><b><font color=Magenta>__HUGS__</font></b><font color=Cyan>)</font>-<a name="(line31)"></a><font color=Green><u>import</u></font> Debug<font color=Cyan>.</font>Trace<font color=Cyan>(</font>trace<font color=Cyan>)</font>-<a name="(line32)"></a><font color=Magenta><em># elif defined(__GLASGOW_HASKELL__)</em></font>-<a name="(line33)"></a><font color=Green><u>import</u></font> IOExts<font color=Cyan>(</font>trace<font color=Cyan>)</font>-<a name="(line34)"></a><font color=Magenta><em># elif defined(__NHC__) || defined(__HBC__)</em></font>-<a name="(line35)"></a><font color=Green><u>import</u></font> NonStdTrace-<a name="(line36)"></a><font color=Magenta><em># endif</em></font>-<a name="(line37)"></a><a name="debug"></a>debug <font color=Red>::</font> Monad m <font color=Red>=></font> String <font color=Red>-></font> m ()-<a name="(line38)"></a>debug s <font color=Red>=</font> trace s <font color=Cyan>(</font>return ()<font color=Cyan>)</font>-<a name="(line39)"></a><font color=Magenta><em>#else</em></font>-<a name="(line40)"></a>debug <font color=Red>::</font> Monad m <font color=Red>=></font> String <font color=Red>-></font> m ()-<a name="(line41)"></a>debug s <font color=Red>=</font> return ()-<a name="(line42)"></a><font color=Magenta><em>#endif</em></font>-<a name="(line43)"></a>-<a name="(line44)"></a>-<a name="(line45)"></a><a name="htmlParse"></a><font color=Blue>-- | The first argument is the name of the file, the second is the string</font>-<a name="(line46)"></a><font color=Blue>-- contents of the file. The result is the generic representation of</font>-<a name="(line47)"></a><font color=Blue>-- an XML document. Any errors cause program failure with message to stderr.</font>-<a name="(line48)"></a>htmlParse <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Document Posn-<a name="(line49)"></a>htmlParse name <font color=Red>=</font> Prelude<font color=Cyan>.</font>either error id <font color=Cyan>.</font> htmlParse' name-<a name="(line50)"></a>-<a name="(line51)"></a><a name="htmlParse'"></a><font color=Blue>-- | The first argument is the name of the file, the second is the string</font>-<a name="(line52)"></a><font color=Blue>-- contents of the file. The result is the generic representation of</font>-<a name="(line53)"></a><font color=Blue>-- an XML document. Any parsing errors are returned in the @Either@ type.</font>-<a name="(line54)"></a>htmlParse' <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Either String <font color=Cyan>(</font>Document Posn<font color=Cyan>)</font>-<a name="(line55)"></a>htmlParse' name <font color=Red>=</font> Prelude<font color=Cyan>.</font>either Left <font color=Cyan>(</font>Right <font color=Cyan>.</font> simplify<font color=Cyan>)</font> <font color=Cyan>.</font> fst-<a name="(line56)"></a> <font color=Cyan>.</font> runParser document <font color=Cyan>.</font> xmlLex name-<a name="(line57)"></a>-<a name="(line58)"></a><font color=Blue>---- Document simplification ----</font>-<a name="(line59)"></a>-<a name="(line60)"></a><a name="simplify"></a>simplify <font color=Red>::</font> Document i <font color=Red>-></font> Document i-<a name="(line61)"></a>simplify <font color=Cyan>(</font>Document p st <font color=Cyan>(</font>Elem n avs cs<font color=Cyan>)</font> ms<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line62)"></a> Document p st <font color=Cyan>(</font>Elem n avs <font color=Cyan>(</font>deepfilter simp cs<font color=Cyan>)</font><font color=Cyan>)</font> ms-<a name="(line63)"></a> <font color=Green><u>where</u></font>-<a name="(line64)"></a> simp <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"null"</font> [] []<font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> False-<a name="(line65)"></a> simp <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem n <font color=Green><u>_</u></font> []<font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>|</font> n <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"font"</font><font color=Cyan>,</font><font color=Magenta>"p"</font><font color=Cyan>,</font><font color=Magenta>"i"</font><font color=Cyan>,</font><font color=Magenta>"b"</font><font color=Cyan>,</font><font color=Magenta>"em"</font>-<a name="(line66)"></a> <font color=Cyan>,</font><font color=Magenta>"tt"</font><font color=Cyan>,</font><font color=Magenta>"big"</font><font color=Cyan>,</font><font color=Magenta>"small"</font><font color=Red>]</font> <font color=Red>=</font> False-<a name="(line67)"></a> <font color=Blue>-- simp (CString False s _) | all isSpace s = False</font>-<a name="(line68)"></a> simp <font color=Green><u>_</u></font> <font color=Red>=</font> True-<a name="(line69)"></a> deepfilter p <font color=Red>=</font>-<a name="(line70)"></a> filter p <font color=Cyan>.</font> map <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font> <font color=Green><u>case</u></font> c <font color=Green><u>of</u></font>-<a name="(line71)"></a> CElem <font color=Cyan>(</font>Elem n avs cs<font color=Cyan>)</font> i-<a name="(line72)"></a> <font color=Red>-></font> CElem <font color=Cyan>(</font>Elem n avs <font color=Cyan>(</font>deepfilter p cs<font color=Cyan>)</font><font color=Cyan>)</font> i-<a name="(line73)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> c<font color=Cyan>)</font>-<a name="(line74)"></a>-<a name="(line75)"></a><a name="selfclosingtags"></a><font color=Blue>-- opening any of these, they close again immediately</font>-<a name="(line76)"></a>selfclosingtags <font color=Red>=</font> <font color=Red>[</font><font color=Magenta>"img"</font><font color=Cyan>,</font><font color=Magenta>"hr"</font><font color=Cyan>,</font><font color=Magenta>"br"</font><font color=Cyan>,</font><font color=Magenta>"meta"</font><font color=Cyan>,</font><font color=Magenta>"col"</font><font color=Cyan>,</font><font color=Magenta>"link"</font><font color=Cyan>,</font><font color=Magenta>"base"</font>-<a name="(line77)"></a> <font color=Cyan>,</font><font color=Magenta>"param"</font><font color=Cyan>,</font><font color=Magenta>"area"</font><font color=Cyan>,</font><font color=Magenta>"frame"</font><font color=Cyan>,</font><font color=Magenta>"input"</font><font color=Red>]</font>-<a name="(line78)"></a>-<a name="(line79)"></a><a name="closeInnerTags"></a><font color=Blue>--closing this, implicitly closes any of those which are contained in it</font>-<a name="(line80)"></a>closeInnerTags <font color=Red>=</font>-<a name="(line81)"></a> <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"ul"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"li"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line82)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"ol"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"li"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line83)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"dl"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"dt"</font><font color=Cyan>,</font><font color=Magenta>"dd"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line84)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"tr"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line85)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"div"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line86)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"thead"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line87)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"tfoot"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line88)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"tbody"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line89)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"table"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Cyan>,</font><font color=Magenta>"thead"</font><font color=Cyan>,</font><font color=Magenta>"tfoot"</font><font color=Cyan>,</font><font color=Magenta>"tbody"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line90)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"caption"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line91)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"th"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line92)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"td"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line93)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"li"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line94)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"dt"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line95)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"dd"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line96)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"object"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line97)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"map"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line98)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"body"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line99)"></a> <font color=Red>]</font>-<a name="(line100)"></a>-<a name="(line101)"></a><a name="closes"></a><font color=Blue>--opening this, implicitly closes that</font>-<a name="(line102)"></a>closes <font color=Red>::</font> Name <font color=Red>-></font> Name <font color=Red>-></font> Bool-<a name="(line103)"></a><font color=Magenta>"a"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"a"</font> <font color=Red>=</font> True-<a name="(line104)"></a><font color=Magenta>"li"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"li"</font> <font color=Red>=</font> True-<a name="(line105)"></a><font color=Magenta>"th"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font> <font color=Red>=</font> True-<a name="(line106)"></a><font color=Magenta>"td"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font> <font color=Red>=</font> True-<a name="(line107)"></a><font color=Magenta>"tr"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Red>]</font> <font color=Red>=</font> True-<a name="(line108)"></a><font color=Magenta>"dt"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"dt"</font><font color=Cyan>,</font><font color=Magenta>"dd"</font><font color=Red>]</font> <font color=Red>=</font> True-<a name="(line109)"></a><font color=Magenta>"dd"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"dt"</font><font color=Cyan>,</font><font color=Magenta>"dd"</font><font color=Red>]</font> <font color=Red>=</font> True-<a name="(line110)"></a><font color=Magenta>"form"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"form"</font> <font color=Red>=</font> True-<a name="(line111)"></a><font color=Magenta>"label"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"label"</font> <font color=Red>=</font> True-<a name="(line112)"></a><font color=Green><u>_</u></font> <font color=Cyan>`closes`</font> <font color=Magenta>"option"</font> <font color=Red>=</font> True-<a name="(line113)"></a><font color=Magenta>"thead"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"colgroup"</font><font color=Red>]</font> <font color=Red>=</font> True-<a name="(line114)"></a><font color=Magenta>"tfoot"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"thead"</font><font color=Cyan>,</font><font color=Magenta>"colgroup"</font><font color=Red>]</font> <font color=Red>=</font> True-<a name="(line115)"></a><font color=Magenta>"tbody"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"tbody"</font><font color=Cyan>,</font><font color=Magenta>"tfoot"</font><font color=Cyan>,</font><font color=Magenta>"thead"</font><font color=Cyan>,</font><font color=Magenta>"colgroup"</font><font color=Red>]</font> <font color=Red>=</font> True-<a name="(line116)"></a><font color=Magenta>"colgroup"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"colgroup"</font> <font color=Red>=</font> True-<a name="(line117)"></a><a name="closes"></a>t <font color=Cyan>`closes`</font> <font color=Magenta>"p"</font>-<a name="(line118)"></a> <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Cyan>,</font><font color=Magenta>"h1"</font><font color=Cyan>,</font><font color=Magenta>"h2"</font><font color=Cyan>,</font><font color=Magenta>"h3"</font><font color=Cyan>,</font><font color=Magenta>"h4"</font><font color=Cyan>,</font><font color=Magenta>"h5"</font><font color=Cyan>,</font><font color=Magenta>"h6"</font>-<a name="(line119)"></a> <font color=Cyan>,</font><font color=Magenta>"hr"</font><font color=Cyan>,</font><font color=Magenta>"div"</font><font color=Cyan>,</font><font color=Magenta>"ul"</font><font color=Cyan>,</font><font color=Magenta>"dl"</font><font color=Cyan>,</font><font color=Magenta>"ol"</font><font color=Cyan>,</font><font color=Magenta>"table"</font><font color=Red>]</font> <font color=Red>=</font> True-<a name="(line120)"></a><font color=Green><u>_</u></font> <font color=Cyan>`closes`</font> <font color=Green><u>_</u></font> <font color=Red>=</font> False-<a name="(line121)"></a>-<a name="(line122)"></a>-<a name="(line123)"></a>-<a name="(line124)"></a><font color=Blue>---- Misc ----</font>-<a name="(line125)"></a>-<a name="(line126)"></a><a name="fst3"></a>fst3 <font color=Cyan>(</font>a<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> a-<a name="(line127)"></a><a name="snd3"></a>snd3 <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font>a<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> a-<a name="(line128)"></a><a name="thd3"></a>thd3 <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font>a<font color=Cyan>)</font> <font color=Red>=</font> a-<a name="(line129)"></a>-<a name="(line130)"></a>-<a name="(line131)"></a>-<a name="(line132)"></a><font color=Blue>---- Auxiliary Parsing Functions ----</font>-<a name="(line133)"></a>-<a name="(line134)"></a><a name="HParser"></a><font color=Green><u>type</u></font> HParser a <font color=Red>=</font> Parser <font color=Cyan>(</font>Posn<font color=Cyan>,</font>TokenT<font color=Cyan>)</font> a-<a name="(line135)"></a>-<a name="(line136)"></a><a name="tok"></a>tok <font color=Red>::</font> TokenT <font color=Red>-></font> HParser TokenT-<a name="(line137)"></a>tok t <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t'<font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line138)"></a> <font color=Green><u>case</u></font> t' <font color=Green><u>of</u></font> TokError s <font color=Red>-></font> report failBad <font color=Cyan>(</font>show t<font color=Cyan>)</font> p t'-<a name="(line139)"></a> <font color=Green><u>_</u></font> <font color=Red>|</font> t'<font color=Cyan>==</font>t <font color=Red>-></font> return t-<a name="(line140)"></a> <font color=Red>|</font> otherwise <font color=Red>-></font> report fail <font color=Cyan>(</font>show t<font color=Cyan>)</font> p t'-<a name="(line141)"></a>-<a name="(line142)"></a><a name="name"></a>name <font color=Red>::</font> HParser Name-<a name="(line143)"></a><font color=Blue>--name = do {(p,TokName s) <- next; return s}</font>-<a name="(line144)"></a>name <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>tok<font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line145)"></a> <font color=Green><u>case</u></font> tok <font color=Green><u>of</u></font> -<a name="(line146)"></a> TokName s <font color=Red>-></font> return s -<a name="(line147)"></a> TokError s <font color=Red>-></font> report failBad <font color=Magenta>"a name"</font> p tok-<a name="(line148)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"a name"</font> p tok-<a name="(line149)"></a>-<a name="(line150)"></a><a name="string"></a>string<font color=Cyan>,</font> freetext <font color=Red>::</font> HParser String-<a name="(line151)"></a>string <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line152)"></a> <font color=Green><u>case</u></font> t <font color=Green><u>of</u></font> TokName s <font color=Red>-></font> return s-<a name="(line153)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"text"</font> p t-<a name="(line154)"></a><a name="freetext"></a>freetext <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line155)"></a> <font color=Green><u>case</u></font> t <font color=Green><u>of</u></font> TokFreeText s <font color=Red>-></font> return s-<a name="(line156)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"text"</font> p t-<a name="(line157)"></a>-<a name="(line158)"></a><a name="maybe"></a>maybe <font color=Red>::</font> HParser a <font color=Red>-></font> HParser <font color=Cyan>(</font>Maybe a<font color=Cyan>)</font>-<a name="(line159)"></a>maybe p <font color=Red>=</font>-<a name="(line160)"></a> <font color=Cyan>(</font> p <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Just<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line161)"></a> <font color=Cyan>(</font> return Nothing<font color=Cyan>)</font>-<a name="(line162)"></a>-<a name="(line163)"></a><a name="either"></a>either <font color=Red>::</font> HParser a <font color=Red>-></font> HParser b <font color=Red>-></font> HParser <font color=Cyan>(</font>Either a b<font color=Cyan>)</font>-<a name="(line164)"></a>either p q <font color=Red>=</font>-<a name="(line165)"></a> <font color=Cyan>(</font> p <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Left<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line166)"></a> <font color=Cyan>(</font> q <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Right<font color=Cyan>)</font>-<a name="(line167)"></a>-<a name="(line168)"></a><a name="word"></a>word <font color=Red>::</font> String <font color=Red>-></font> HParser ()-<a name="(line169)"></a>word s <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> x <font color=Red><-</font> next-<a name="(line170)"></a> <font color=Cyan>;</font> <font color=Green><u>case</u></font> x <font color=Green><u>of</u></font>-<a name="(line171)"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>TokName n<font color=Cyan>)</font> <font color=Red>|</font> s<font color=Cyan>==</font>n <font color=Red>-></font> return ()-<a name="(line172)"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>TokFreeText n<font color=Cyan>)</font> <font color=Red>|</font> s<font color=Cyan>==</font>n <font color=Red>-></font> return ()-<a name="(line173)"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Red>@</font><font color=Cyan>(</font>TokError <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> report failBad <font color=Cyan>(</font>show s<font color=Cyan>)</font> p t-<a name="(line174)"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red>-></font> report fail <font color=Cyan>(</font>show s<font color=Cyan>)</font> p t-<a name="(line175)"></a> <font color=Cyan>}</font>-<a name="(line176)"></a>-<a name="(line177)"></a><a name="posn"></a>posn <font color=Red>::</font> HParser Posn-<a name="(line178)"></a>posn <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> x<font color=Red>@</font><font color=Cyan>(</font>p<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line179)"></a> <font color=Cyan>;</font> reparse <font color=Red>[</font>x<font color=Red>]</font>-<a name="(line180)"></a> <font color=Cyan>;</font> return p-<a name="(line181)"></a> <font color=Cyan>}</font> <font color=Cyan>`onFail`</font> return noPos-<a name="(line182)"></a>-<a name="(line183)"></a><a name="nmtoken"></a>nmtoken <font color=Red>::</font> HParser NmToken-<a name="(line184)"></a>nmtoken <font color=Red>=</font> <font color=Cyan>(</font>string <font color=Cyan>`onFail`</font> freetext<font color=Cyan>)</font>-<a name="(line185)"></a>-<a name="(line186)"></a><a name="failP"></a>failP<font color=Cyan>,</font> failBadP <font color=Red>::</font> String <font color=Red>-></font> HParser a-<a name="(line187)"></a>failP msg <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn<font color=Cyan>;</font> fail <font color=Cyan>(</font>msg<font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font> <font color=Cyan>}</font>-<a name="(line188)"></a><a name="failBadP"></a>failBadP msg <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn<font color=Cyan>;</font> failBad <font color=Cyan>(</font>msg<font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font> <font color=Cyan>}</font>-<a name="(line189)"></a>-<a name="(line190)"></a><a name="report"></a>report <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>HParser a<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> Posn <font color=Red>-></font> TokenT <font color=Red>-></font> HParser a-<a name="(line191)"></a>report fail exp p t <font color=Red>=</font> fail <font color=Cyan>(</font><font color=Magenta>"Expected "</font><font color=Cyan>++</font>show exp<font color=Cyan>++</font><font color=Magenta>" but found "</font><font color=Cyan>++</font>show t-<a name="(line192)"></a> <font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>-<a name="(line193)"></a>-<a name="(line194)"></a><a name="adjustErrP"></a>adjustErrP <font color=Red>::</font> HParser a <font color=Red>-></font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Cyan>)</font> <font color=Red>-></font> HParser a-<a name="(line195)"></a><a name="adjustErrP"></a>p <font color=Cyan>`adjustErrP`</font> f <font color=Red>=</font> p <font color=Cyan>`onFail`</font> <font color=Green><u>do</u></font> pn <font color=Red><-</font> posn-<a name="(line196)"></a> <font color=Cyan>(</font>p <font color=Cyan>`adjustErr`</font> f<font color=Cyan>)</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>++</font>show pn<font color=Cyan>)</font>-<a name="(line197)"></a>-<a name="(line198)"></a><font color=Blue>---- XML Parsing Functions ----</font>-<a name="(line199)"></a>-<a name="(line200)"></a><a name="document"></a>document <font color=Red>::</font> HParser <font color=Cyan>(</font>Document Posn<font color=Cyan>)</font>-<a name="(line201)"></a>document <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line202)"></a> p <font color=Red><-</font> prolog <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"unrecognisable XML prolog\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line203)"></a> es <font color=Red><-</font> many1 <font color=Cyan>(</font>element <font color=Magenta>"HTML document"</font><font color=Cyan>)</font>-<a name="(line204)"></a> ms <font color=Red><-</font> many misc-<a name="(line205)"></a> return <font color=Cyan>(</font>Document p emptyST <font color=Cyan>(</font><font color=Green><u>case</u></font> map snd es <font color=Green><u>of</u></font>-<a name="(line206)"></a> <font color=Red>[</font>e<font color=Red>]</font> <font color=Red>-></font> e-<a name="(line207)"></a> es <font color=Red>-></font> Elem <font color=Magenta>"html"</font> [] <font color=Cyan>(</font>map mkCElem es<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line208)"></a> ms<font color=Cyan>)</font>-<a name="(line209)"></a> <font color=Green><u>where</u></font> mkCElem e <font color=Red>=</font> CElem e noPos-<a name="(line210)"></a>-<a name="(line211)"></a><a name="comment"></a>comment <font color=Red>::</font> HParser Comment-<a name="(line212)"></a>comment <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line213)"></a> bracket <font color=Cyan>(</font>tok TokCommentOpen<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokCommentClose<font color=Cyan>)</font> freetext-<a name="(line214)"></a>-<a name="(line215)"></a><a name="processinginstruction"></a>processinginstruction <font color=Red>::</font> HParser ProcessingInstruction-<a name="(line216)"></a>processinginstruction <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line217)"></a> tok TokPIOpen-<a name="(line218)"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>-<a name="(line219)"></a> n <font color=Red><-</font> string <font color=Cyan>`onFail`</font> failP <font color=Magenta>"processing instruction has no target"</font>-<a name="(line220)"></a> f <font color=Red><-</font> freetext-<a name="(line221)"></a> <font color=Cyan>(</font>tok TokPIClose <font color=Cyan>`onFail`</font> tok TokAnyClose<font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing ?> or >"</font>-<a name="(line222)"></a> return <font color=Cyan>(</font>n<font color=Cyan>,</font> f<font color=Cyan>)</font>-<a name="(line223)"></a>-<a name="(line224)"></a><a name="cdsect"></a>cdsect <font color=Red>::</font> HParser CDSect-<a name="(line225)"></a>cdsect <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line226)"></a> tok TokSectionOpen-<a name="(line227)"></a> bracket <font color=Cyan>(</font>tok <font color=Cyan>(</font>TokSection CDATAx<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSectionClose<font color=Cyan>)</font> chardata-<a name="(line228)"></a>-<a name="(line229)"></a><a name="prolog"></a>prolog <font color=Red>::</font> HParser Prolog-<a name="(line230)"></a>prolog <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line231)"></a> x <font color=Red><-</font> maybe xmldecl-<a name="(line232)"></a> m1 <font color=Red><-</font> many misc-<a name="(line233)"></a> dtd <font color=Red><-</font> maybe doctypedecl-<a name="(line234)"></a> m2 <font color=Red><-</font> many misc-<a name="(line235)"></a> return <font color=Cyan>(</font>Prolog x m1 dtd m2<font color=Cyan>)</font>-<a name="(line236)"></a>-<a name="(line237)"></a><a name="xmldecl"></a>xmldecl <font color=Red>::</font> HParser XMLDecl-<a name="(line238)"></a>xmldecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line239)"></a> tok TokPIOpen-<a name="(line240)"></a> <font color=Cyan>(</font>word <font color=Magenta>"xml"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"XML"</font><font color=Cyan>)</font>-<a name="(line241)"></a> p <font color=Red><-</font> posn-<a name="(line242)"></a> s <font color=Red><-</font> freetext-<a name="(line243)"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing ?> in <?xml ...?>"</font>-<a name="(line244)"></a> <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>either failP return <font color=Cyan>.</font> fst <font color=Cyan>.</font> runParser aux <font color=Cyan>.</font> xmlReLex p<font color=Cyan>)</font> s-<a name="(line245)"></a> <font color=Green><u>where</u></font>-<a name="(line246)"></a> aux <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line247)"></a> v <font color=Red><-</font> versioninfo <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing XML version info"</font>-<a name="(line248)"></a> e <font color=Red><-</font> maybe encodingdecl-<a name="(line249)"></a> s <font color=Red><-</font> maybe sddecl-<a name="(line250)"></a> return <font color=Cyan>(</font>XMLDecl v e s<font color=Cyan>)</font>-<a name="(line251)"></a>-<a name="(line252)"></a><a name="versioninfo"></a>versioninfo <font color=Red>::</font> HParser VersionInfo-<a name="(line253)"></a>versioninfo <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line254)"></a> <font color=Cyan>(</font>word <font color=Magenta>"version"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"VERSION"</font><font color=Cyan>)</font>-<a name="(line255)"></a> tok TokEqual-<a name="(line256)"></a> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext-<a name="(line257)"></a>-<a name="(line258)"></a><a name="misc"></a>misc <font color=Red>::</font> HParser Misc-<a name="(line259)"></a>misc <font color=Red>=</font> -<a name="(line260)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"<!--comment-->"</font><font color=Cyan>,</font> comment <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Comment<font color=Cyan>)</font>-<a name="(line261)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"<?PI?>"</font><font color=Cyan>,</font> processinginstruction <font color=Cyan>>>=</font> return <font color=Cyan>.</font> PI<font color=Cyan>)</font>-<a name="(line262)"></a> <font color=Red>]</font>-<a name="(line263)"></a>-<a name="(line264)"></a>-<a name="(line265)"></a><font color=Blue>-- Question: for HTML, should we disallow in-line DTDs, allowing only externals?</font>-<a name="(line266)"></a><font color=Blue>-- Answer: I think so.</font>-<a name="(line267)"></a>-<a name="(line268)"></a><a name="doctypedecl"></a>doctypedecl <font color=Red>::</font> HParser DocTypeDecl-<a name="(line269)"></a>doctypedecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line270)"></a> tok TokSpecialOpen-<a name="(line271)"></a> tok <font color=Cyan>(</font>TokSpecial DOCTYPEx<font color=Cyan>)</font>-<a name="(line272)"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>-<a name="(line273)"></a> n <font color=Red><-</font> name-<a name="(line274)"></a> eid <font color=Red><-</font> maybe externalid-<a name="(line275)"></a><font color=Blue>-- es <- maybe (bracket (tok TokSqOpen) (tok TokSqClose)) (many markupdecl)</font>-<a name="(line276)"></a> tok TokAnyClose <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing > in DOCTYPE decl"</font>-<a name="(line277)"></a><font color=Blue>-- return (DTD n eid (case es of { Nothing -> []; Just e -> e }))</font>-<a name="(line278)"></a> return <font color=Cyan>(</font>DTD n eid []<font color=Cyan>)</font>-<a name="(line279)"></a>-<a name="(line280)"></a><font color=Blue>--markupdecl :: HParser MarkupDecl</font>-<a name="(line281)"></a><font color=Blue>--markupdecl =</font>-<a name="(line282)"></a><font color=Blue>-- ( elementdecl >>= return . Element) `onFail`</font>-<a name="(line283)"></a><font color=Blue>-- ( attlistdecl >>= return . AttList) `onFail`</font>-<a name="(line284)"></a><font color=Blue>-- ( entitydecl >>= return . Entity) `onFail`</font>-<a name="(line285)"></a><font color=Blue>-- ( notationdecl >>= return . Notation) `onFail`</font>-<a name="(line286)"></a><font color=Blue>-- ( misc >>= return . MarkupMisc) `onFail`</font>-<a name="(line287)"></a><font color=Blue>-- PEREF(MarkupPE,markupdecl)</font>-<a name="(line288)"></a><font color=Blue>--</font>-<a name="(line289)"></a><font color=Blue>--extsubset :: HParser ExtSubset</font>-<a name="(line290)"></a><font color=Blue>--extsubset = do</font>-<a name="(line291)"></a><font color=Blue>-- td <- maybe textdecl</font>-<a name="(line292)"></a><font color=Blue>-- ds <- many extsubsetdecl</font>-<a name="(line293)"></a><font color=Blue>-- return (ExtSubset td ds)</font>-<a name="(line294)"></a><font color=Blue>--</font>-<a name="(line295)"></a><font color=Blue>--extsubsetdecl :: HParser ExtSubsetDecl</font>-<a name="(line296)"></a><font color=Blue>--extsubsetdecl =</font>-<a name="(line297)"></a><font color=Blue>-- ( markupdecl >>= return . ExtMarkupDecl) `onFail`</font>-<a name="(line298)"></a><font color=Blue>-- ( conditionalsect >>= return . ExtConditionalSect) `onFail`</font>-<a name="(line299)"></a><font color=Blue>-- PEREF(ExtPEReference,extsubsetdecl)</font>-<a name="(line300)"></a>-<a name="(line301)"></a><a name="sddecl"></a>sddecl <font color=Red>::</font> HParser SDDecl-<a name="(line302)"></a>sddecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line303)"></a> <font color=Cyan>(</font>word <font color=Magenta>"standalone"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"STANDALONE"</font><font color=Cyan>)</font>-<a name="(line304)"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>-<a name="(line305)"></a> tok TokEqual <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing = in 'standalone' decl"</font>-<a name="(line306)"></a> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font>-<a name="(line307)"></a> <font color=Cyan>(</font> <font color=Cyan>(</font>word <font color=Magenta>"yes"</font> <font color=Cyan>>></font> return True<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line308)"></a> <font color=Cyan>(</font>word <font color=Magenta>"no"</font> <font color=Cyan>>></font> return False<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line309)"></a> failP <font color=Magenta>"'standalone' decl requires 'yes' or 'no' value"</font> <font color=Cyan>)</font>-<a name="(line310)"></a>-<a name="(line311)"></a>-<a name="(line312)"></a>-<a name="(line313)"></a>-<a name="(line314)"></a><a name="Stack"></a><font color=Blue>----</font>-<a name="(line315)"></a><a name="Stack"></a><font color=Blue>-- VERY IMPORTANT NOTE: The stack returned here contains those tags which</font>-<a name="(line316)"></a><a name="Stack"></a><font color=Blue>-- have been closed implicitly and need to be reopened again at the</font>-<a name="(line317)"></a><a name="Stack"></a><font color=Blue>-- earliest opportunity.</font>-<a name="(line318)"></a><a name="Stack"></a><font color=Green><u>type</u></font> Stack <font color=Red>=</font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>Attribute<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font>-<a name="(line319)"></a>-<a name="(line320)"></a><a name="element"></a>element <font color=Red>::</font> Name <font color=Red>-></font> HParser <font color=Cyan>(</font>Stack<font color=Cyan>,</font>Element Posn<font color=Cyan>)</font>-<a name="(line321)"></a>element ctx <font color=Red>=</font>-<a name="(line322)"></a> <font color=Green><u>do</u></font>-<a name="(line323)"></a> tok TokAnyOpen-<a name="(line324)"></a> <font color=Cyan>(</font>ElemTag e avs<font color=Cyan>)</font> <font color=Red><-</font> elemtag-<a name="(line325)"></a> <font color=Cyan>(</font> <font color=Green><u>if</u></font> e <font color=Cyan>`closes`</font> ctx <font color=Green><u>then</u></font>-<a name="(line326)"></a> <font color=Blue>-- insert the missing close-tag, fail forward, and reparse.</font>-<a name="(line327)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> debug <font color=Cyan>(</font><font color=Magenta>"/"</font><font color=Cyan>)</font>-<a name="(line328)"></a> unparse <font color=Cyan>(</font><font color=Red>[</font>TokEndOpen<font color=Cyan>,</font> TokName ctx<font color=Cyan>,</font> TokAnyClose<font color=Cyan>,</font>-<a name="(line329)"></a> TokAnyOpen<font color=Cyan>,</font> TokName e<font color=Red>]</font> <font color=Cyan>++</font> reformatAttrs avs<font color=Cyan>)</font>-<a name="(line330)"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> Elem <font color=Magenta>"null"</font> [] []<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line331)"></a> <font color=Green><u>else</u></font> <font color=Green><u>if</u></font> e <font color=Cyan>`elem`</font> selfclosingtags <font color=Green><u>then</u></font>-<a name="(line332)"></a> <font color=Blue>-- complete the parse straightaway.</font>-<a name="(line333)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokEndClose <font color=Blue>-- self-closing <tag /> </font>-<a name="(line334)"></a> debug <font color=Cyan>(</font>e<font color=Cyan>++</font><font color=Magenta>"[+]"</font><font color=Cyan>)</font>-<a name="(line335)"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> Elem e avs []<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line336)"></a> <font color=Blue>-- ( do tok TokAnyClose -- sequence <tag></tag> (**not HTML?**)</font>-<a name="(line337)"></a> <font color=Blue>-- debug (e++"[+")</font>-<a name="(line338)"></a> <font color=Blue>-- n <- bracket (tok TokEndOpen) (tok TokAnyClose) name</font>-<a name="(line339)"></a> <font color=Blue>-- debug "]"</font>-<a name="(line340)"></a> <font color=Blue>-- if e == (map toLower n :: Name) </font>-<a name="(line341)"></a> <font color=Blue>-- then return ([], Elem e avs []) </font>-<a name="(line342)"></a> <font color=Blue>-- else return (error "no nesting in empty tag")) `onFail`</font>-<a name="(line343)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokAnyClose <font color=Blue>-- <tag> with no close (e.g. <IMG>)</font>-<a name="(line344)"></a> debug <font color=Cyan>(</font>e<font color=Cyan>++</font><font color=Magenta>"[+]"</font><font color=Cyan>)</font>-<a name="(line345)"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> Elem e avs []<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line346)"></a> <font color=Green><u>else</u></font>-<a name="(line347)"></a> <font color=Cyan>(</font><font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokEndClose-<a name="(line348)"></a> debug <font color=Cyan>(</font>e<font color=Cyan>++</font><font color=Magenta>"[]"</font><font color=Cyan>)</font>-<a name="(line349)"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> Elem e avs []<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line350)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokAnyClose <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing > or /> in element tag"</font>-<a name="(line351)"></a> debug <font color=Cyan>(</font>e<font color=Cyan>++</font><font color=Magenta>"["</font><font color=Cyan>)</font>-<a name="(line352)"></a> <font color=Blue>-- zz <- many (content e)</font>-<a name="(line353)"></a> <font color=Blue>-- n <- bracket (tok TokEndOpen) (tok TokAnyClose) name</font>-<a name="(line354)"></a> zz <font color=Red><-</font> manyFinally <font color=Cyan>(</font>content e<font color=Cyan>)</font>-<a name="(line355)"></a> <font color=Cyan>(</font>tok TokEndOpen<font color=Cyan>)</font>-<a name="(line356)"></a> n <font color=Red><-</font> name-<a name="(line357)"></a> commit <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font>-<a name="(line358)"></a> debug <font color=Magenta>"]"</font>-<a name="(line359)"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>ss<font color=Cyan>,</font>cs<font color=Cyan>)</font> <font color=Red>=</font> unzip zz-<a name="(line360)"></a> <font color=Green><u>let</u></font> s <font color=Red>=</font> <font color=Green><u>if</u></font> null ss <font color=Green><u>then</u></font> [] <font color=Green><u>else</u></font> last ss-<a name="(line361)"></a> <font color=Cyan>(</font> <font color=Green><u>if</u></font> e <font color=Cyan>==</font> <font color=Cyan>(</font>map toLower n <font color=Red>::</font> Name<font color=Cyan>)</font> <font color=Green><u>then</u></font>-<a name="(line362)"></a> <font color=Green><u>do</u></font> unparse <font color=Cyan>(</font>reformatTags <font color=Cyan>(</font>closeInner e s<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line363)"></a> debug <font color=Magenta>"^"</font>-<a name="(line364)"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> Elem e avs cs<font color=Cyan>)</font>-<a name="(line365)"></a> <font color=Green><u>else</u></font>-<a name="(line366)"></a> <font color=Green><u>do</u></font> unparse <font color=Red>[</font>TokEndOpen<font color=Cyan>,</font> TokName n<font color=Cyan>,</font> TokAnyClose<font color=Red>]</font>-<a name="(line367)"></a> debug <font color=Magenta>"-"</font>-<a name="(line368)"></a> return <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>(</font>e<font color=Cyan>,</font>avs<font color=Cyan>)</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font><font color=Cyan>,</font> Elem e avs cs<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line369)"></a> <font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failP <font color=Cyan>(</font><font color=Magenta>"failed to repair non-matching tags in context: "</font><font color=Cyan>++</font>ctx<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line370)"></a>-<a name="(line371)"></a><a name="closeInner"></a>closeInner <font color=Red>::</font> Name <font color=Red>-></font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>Attribute<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>Attribute<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font>-<a name="(line372)"></a>closeInner c ts <font color=Red>=</font>-<a name="(line373)"></a> <font color=Green><u>case</u></font> lookup c closeInnerTags <font color=Green><u>of</u></font>-<a name="(line374)"></a> <font color=Cyan>(</font>Just these<font color=Cyan>)</font> <font color=Red>-></font> filter <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>`notElem`</font> these<font color=Cyan>)</font><font color=Cyan>.</font>fst<font color=Cyan>)</font> ts-<a name="(line375)"></a> Nothing <font color=Red>-></font> ts-<a name="(line376)"></a>-<a name="(line377)"></a><a name="unparse"></a>unparse ts <font color=Red>=</font> <font color=Green><u>do</u></font> p <font color=Red><-</font> posn-<a name="(line378)"></a> reparse <font color=Cyan>(</font>zip <font color=Cyan>(</font>repeat p<font color=Cyan>)</font> ts<font color=Cyan>)</font>-<a name="(line379)"></a>-<a name="(line380)"></a><a name="reformatAttrs"></a>reformatAttrs avs <font color=Red>=</font> concatMap f0 avs-<a name="(line381)"></a> <font color=Green><u>where</u></font> f0 <font color=Cyan>(</font>a<font color=Cyan>,</font> v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>TokName a<font color=Cyan>,</font> TokEqual<font color=Cyan>,</font> TokQuote<font color=Cyan>,</font>-<a name="(line382)"></a> TokFreeText <font color=Cyan>(</font>show v<font color=Cyan>)</font><font color=Cyan>,</font> TokQuote<font color=Red>]</font>-<a name="(line383)"></a><a name="reformatTags"></a>reformatTags ts <font color=Red>=</font> concatMap f0 ts-<a name="(line384)"></a> <font color=Green><u>where</u></font> f0 <font color=Cyan>(</font>t<font color=Cyan>,</font>avs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>TokAnyOpen<font color=Cyan>,</font> TokName t<font color=Red>]</font><font color=Cyan>++</font>reformatAttrs avs<font color=Cyan>++</font><font color=Red>[</font>TokAnyClose<font color=Red>]</font>-<a name="(line385)"></a>-<a name="(line386)"></a><a name="content"></a>content <font color=Red>::</font> Name <font color=Red>-></font> HParser <font color=Cyan>(</font>Stack<font color=Cyan>,</font>Content Posn<font color=Cyan>)</font>-<a name="(line387)"></a>content ctx <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn <font color=Cyan>;</font> content' p ctx <font color=Cyan>}</font>-<a name="(line388)"></a> <font color=Green><u>where</u></font> content' p ctx <font color=Red>=</font> oneOf'-<a name="(line389)"></a> <font color=Red>[</font> <font color=Cyan>(</font> <font color=Magenta>"element"</font><font color=Cyan>,</font> element ctx <font color=Cyan>>>=</font> <font color=Red>\</font><font color=Cyan>(</font>s<font color=Cyan>,</font>e<font color=Cyan>)</font><font color=Red>-></font> return <font color=Cyan>(</font>s<font color=Cyan>,</font> CElem e p<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line390)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"chardata"</font><font color=Cyan>,</font> chardata <font color=Cyan>>>=</font> <font color=Red>\</font>s<font color=Red>-></font> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> CString False s p<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line391)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"reference"</font><font color=Cyan>,</font> reference <font color=Cyan>>>=</font> <font color=Red>\</font>r<font color=Red>-></font> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> CRef r p<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line392)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"cdsect"</font><font color=Cyan>,</font> cdsect <font color=Cyan>>>=</font> <font color=Red>\</font>c<font color=Red>-></font> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> CString True c p<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line393)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"misc"</font><font color=Cyan>,</font> misc <font color=Cyan>>>=</font> <font color=Red>\</font>m<font color=Red>-></font> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> CMisc m p<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line394)"></a> <font color=Red>]</font> <font color=Cyan>`adjustErrP`</font> <font color=Cyan>(</font><font color=Magenta>"when looking for a content item,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line395)"></a>-<a name="(line396)"></a><a name="elemtag"></a><font color=Blue>----</font>-<a name="(line397)"></a>elemtag <font color=Red>::</font> HParser ElemTag-<a name="(line398)"></a>elemtag <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line399)"></a> n <font color=Red><-</font> name <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Magenta>"malformed element tag\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line400)"></a> <font color=Green><u>as</u></font> <font color=Red><-</font> many attribute-<a name="(line401)"></a> return <font color=Cyan>(</font>ElemTag <font color=Cyan>(</font>map toLower n<font color=Cyan>)</font> <font color=Green><u>as</u></font><font color=Cyan>)</font>-<a name="(line402)"></a>-<a name="(line403)"></a><a name="attribute"></a>attribute <font color=Red>::</font> HParser Attribute-<a name="(line404)"></a>attribute <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line405)"></a> n <font color=Red><-</font> name-<a name="(line406)"></a> v <font color=Red><-</font> <font color=Cyan>(</font><font color=Green><u>do</u></font> tok TokEqual-<a name="(line407)"></a> attvalue<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line408)"></a> <font color=Cyan>(</font>return <font color=Cyan>(</font>AttValue <font color=Red>[</font>Left <font color=Magenta>"TRUE"</font><font color=Red>]</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line409)"></a> return <font color=Cyan>(</font>map toLower n<font color=Cyan>,</font>v<font color=Cyan>)</font>-<a name="(line410)"></a>-<a name="(line411)"></a><font color=Blue>--elementdecl :: HParser ElementDecl</font>-<a name="(line412)"></a><font color=Blue>--elementdecl = do</font>-<a name="(line413)"></a><font color=Blue>-- tok TokSpecialOpen</font>-<a name="(line414)"></a><font color=Blue>-- tok (TokSpecial ELEMENTx)</font>-<a name="(line415)"></a><font color=Blue>-- n <- name `onFail` failP "missing identifier in ELEMENT decl"</font>-<a name="(line416)"></a><font color=Blue>-- c <- contentspec `onFail` failP "missing content spec in ELEMENT decl"</font>-<a name="(line417)"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "expected > terminating ELEMENT decl"</font>-<a name="(line418)"></a><font color=Blue>-- return (ElementDecl n c)</font>-<a name="(line419)"></a><font color=Blue>--</font>-<a name="(line420)"></a><font color=Blue>--contentspec :: HParser ContentSpec</font>-<a name="(line421)"></a><font color=Blue>--contentspec =</font>-<a name="(line422)"></a><font color=Blue>-- ( word "EMPTY" >> return EMPTY) `onFail`</font>-<a name="(line423)"></a><font color=Blue>-- ( word "ANY" >> return ANY) `onFail`</font>-<a name="(line424)"></a><font color=Blue>-- ( mixed >>= return . Mixed) `onFail`</font>-<a name="(line425)"></a><font color=Blue>-- ( cp >>= return . ContentSpec) `onFail`</font>-<a name="(line426)"></a><font color=Blue>-- PEREF(ContentPE,contentspec)</font>-<a name="(line427)"></a><font color=Blue>--</font>-<a name="(line428)"></a><font color=Blue>--choice :: HParser [CP]</font>-<a name="(line429)"></a><font color=Blue>--choice = do</font>-<a name="(line430)"></a><font color=Blue>-- bracket (tok TokBraOpen) (tok TokBraClose)</font>-<a name="(line431)"></a><font color=Blue>-- (cp `sepby1` (tok TokPipe))</font>-<a name="(line432)"></a><font color=Blue>--</font>-<a name="(line433)"></a><font color=Blue>--sequence :: HParser [CP]</font>-<a name="(line434)"></a><font color=Blue>--sequence = do</font>-<a name="(line435)"></a><font color=Blue>-- bracket (tok TokBraOpen) (tok TokBraClose)</font>-<a name="(line436)"></a><font color=Blue>-- (cp `sepby1` (tok TokComma))</font>-<a name="(line437)"></a><font color=Blue>--</font>-<a name="(line438)"></a><font color=Blue>--cp :: HParser CP</font>-<a name="(line439)"></a><font color=Blue>--cp =</font>-<a name="(line440)"></a><font color=Blue>-- ( do n <- name</font>-<a name="(line441)"></a><font color=Blue>-- m <- modifier</font>-<a name="(line442)"></a><font color=Blue>-- return (TagName n m)) `onFail`</font>-<a name="(line443)"></a><font color=Blue>-- ( do ss <- sequence</font>-<a name="(line444)"></a><font color=Blue>-- m <- modifier</font>-<a name="(line445)"></a><font color=Blue>-- return (Seq ss m)) `onFail`</font>-<a name="(line446)"></a><font color=Blue>-- ( do cs <- choice</font>-<a name="(line447)"></a><font color=Blue>-- m <- modifier</font>-<a name="(line448)"></a><font color=Blue>-- return (Choice cs m)) `onFail`</font>-<a name="(line449)"></a><font color=Blue>-- PEREF(CPPE,cp)</font>-<a name="(line450)"></a><font color=Blue>--</font>-<a name="(line451)"></a><font color=Blue>--modifier :: HParser Modifier</font>-<a name="(line452)"></a><font color=Blue>--modifier =</font>-<a name="(line453)"></a><font color=Blue>-- ( tok TokStar >> return Star) `onFail`</font>-<a name="(line454)"></a><font color=Blue>-- ( tok TokQuery >> return Query) `onFail`</font>-<a name="(line455)"></a><font color=Blue>-- ( tok TokPlus >> return Plus) `onFail`</font>-<a name="(line456)"></a><font color=Blue>-- ( return None)</font>-<a name="(line457)"></a><font color=Blue>--</font>-<a name="(line458)"></a><font color=Blue>--mixed :: HParser Mixed</font>-<a name="(line459)"></a><font color=Blue>--mixed = do</font>-<a name="(line460)"></a><font color=Blue>-- tok TokBraOpen</font>-<a name="(line461)"></a><font color=Blue>-- tok TokHash</font>-<a name="(line462)"></a><font color=Blue>-- word "PCDATA"</font>-<a name="(line463)"></a><font color=Blue>-- cont</font>-<a name="(line464)"></a><font color=Blue>-- where</font>-<a name="(line465)"></a><font color=Blue>-- cont = ( tok TokBraClose >> return PCDATA) `onFail`</font>-<a name="(line466)"></a><font color=Blue>-- ( do cs <- many ( do tok TokPipe</font>-<a name="(line467)"></a><font color=Blue>-- n <- name</font>-<a name="(line468)"></a><font color=Blue>-- return n)</font>-<a name="(line469)"></a><font color=Blue>-- tok TokBraClose</font>-<a name="(line470)"></a><font color=Blue>-- tok TokStar</font>-<a name="(line471)"></a><font color=Blue>-- return (PCDATAplus cs))</font>-<a name="(line472)"></a><font color=Blue>--</font>-<a name="(line473)"></a><font color=Blue>--attlistdecl :: HParser AttListDecl</font>-<a name="(line474)"></a><font color=Blue>--attlistdecl = do</font>-<a name="(line475)"></a><font color=Blue>-- tok TokSpecialOpen</font>-<a name="(line476)"></a><font color=Blue>-- tok (TokSpecial ATTLISTx)</font>-<a name="(line477)"></a><font color=Blue>-- n <- name `onFail` failP "missing identifier in ATTLIST"</font>-<a name="(line478)"></a><font color=Blue>-- ds <- many attdef</font>-<a name="(line479)"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "missing > terminating ATTLIST"</font>-<a name="(line480)"></a><font color=Blue>-- return (AttListDecl n ds)</font>-<a name="(line481)"></a><font color=Blue>--</font>-<a name="(line482)"></a><font color=Blue>--attdef :: HParser AttDef</font>-<a name="(line483)"></a><font color=Blue>--attdef = do</font>-<a name="(line484)"></a><font color=Blue>-- n <- name</font>-<a name="(line485)"></a><font color=Blue>-- t <- atttype `onFail` failP "missing attribute type in attlist defn"</font>-<a name="(line486)"></a><font color=Blue>-- d <- defaultdecl</font>-<a name="(line487)"></a><font color=Blue>-- return (AttDef n t d)</font>-<a name="(line488)"></a><font color=Blue>--</font>-<a name="(line489)"></a><font color=Blue>--atttype :: HParser AttType</font>-<a name="(line490)"></a><font color=Blue>--atttype =</font>-<a name="(line491)"></a><font color=Blue>-- ( word "CDATA" >> return StringType) `onFail`</font>-<a name="(line492)"></a><font color=Blue>-- ( tokenizedtype >>= return . TokenizedType) `onFail`</font>-<a name="(line493)"></a><font color=Blue>-- ( enumeratedtype >>= return . EnumeratedType)</font>-<a name="(line494)"></a><font color=Blue>--</font>-<a name="(line495)"></a><font color=Blue>--tokenizedtype :: HParser TokenizedType</font>-<a name="(line496)"></a><font color=Blue>--tokenizedtype =</font>-<a name="(line497)"></a><font color=Blue>-- ( word "ID" >> return ID) `onFail`</font>-<a name="(line498)"></a><font color=Blue>-- ( word "IDREF" >> return IDREF) `onFail`</font>-<a name="(line499)"></a><font color=Blue>-- ( word "IDREFS" >> return IDREFS) `onFail`</font>-<a name="(line500)"></a><font color=Blue>-- ( word "ENTITY" >> return ENTITY) `onFail`</font>-<a name="(line501)"></a><font color=Blue>-- ( word "ENTITIES" >> return ENTITIES) `onFail`</font>-<a name="(line502)"></a><font color=Blue>-- ( word "NMTOKEN" >> return NMTOKEN) `onFail`</font>-<a name="(line503)"></a><font color=Blue>-- ( word "NMTOKENS" >> return NMTOKENS)</font>-<a name="(line504)"></a><font color=Blue>--</font>-<a name="(line505)"></a><font color=Blue>--enumeratedtype :: HParser EnumeratedType</font>-<a name="(line506)"></a><font color=Blue>--enumeratedtype =</font>-<a name="(line507)"></a><font color=Blue>-- ( notationtype >>= return . NotationType) `onFail`</font>-<a name="(line508)"></a><font color=Blue>-- ( enumeration >>= return . Enumeration)</font>-<a name="(line509)"></a><font color=Blue>--</font>-<a name="(line510)"></a><font color=Blue>--notationtype :: HParser NotationType</font>-<a name="(line511)"></a><font color=Blue>--notationtype = do</font>-<a name="(line512)"></a><font color=Blue>-- word "NOTATION"</font>-<a name="(line513)"></a><font color=Blue>-- bracket (tok TokBraOpen) (tok TokBraClose)</font>-<a name="(line514)"></a><font color=Blue>-- (name `sepby1` (tok TokPipe))</font>-<a name="(line515)"></a><font color=Blue>--</font>-<a name="(line516)"></a><font color=Blue>--enumeration :: HParser Enumeration</font>-<a name="(line517)"></a><font color=Blue>--enumeration =</font>-<a name="(line518)"></a><font color=Blue>-- bracket (tok TokBraOpen) (tok TokBraClose)</font>-<a name="(line519)"></a><font color=Blue>-- (nmtoken `sepby1` (tok TokPipe))</font>-<a name="(line520)"></a><font color=Blue>--</font>-<a name="(line521)"></a><font color=Blue>--defaultdecl :: HParser DefaultDecl</font>-<a name="(line522)"></a><font color=Blue>--defaultdecl =</font>-<a name="(line523)"></a><font color=Blue>-- ( tok TokHash >> word "REQUIRED" >> return REQUIRED) `onFail`</font>-<a name="(line524)"></a><font color=Blue>-- ( tok TokHash >> word "IMPLIED" >> return IMPLIED) `onFail`</font>-<a name="(line525)"></a><font color=Blue>-- ( do f <- maybe (tok TokHash >> word "FIXED" >> return FIXED)</font>-<a name="(line526)"></a><font color=Blue>-- a <- attvalue</font>-<a name="(line527)"></a><font color=Blue>-- return (DefaultTo a f))</font>-<a name="(line528)"></a><font color=Blue>--</font>-<a name="(line529)"></a><font color=Blue>--conditionalsect :: HParser ConditionalSect</font>-<a name="(line530)"></a><font color=Blue>--conditionalsect =</font>-<a name="(line531)"></a><font color=Blue>-- ( do tok TokSectionOpen</font>-<a name="(line532)"></a><font color=Blue>-- tok (TokSection INCLUDEx)</font>-<a name="(line533)"></a><font color=Blue>-- tok TokSqOpen `onFail` failP "missing [ after INCLUDE"</font>-<a name="(line534)"></a><font color=Blue>-- i <- extsubsetdecl `onFail` failP "missing ExtSubsetDecl in INCLUDE"</font>-<a name="(line535)"></a><font color=Blue>-- tok TokSectionClose `onFail` failP "missing ] after INCLUDE"</font>-<a name="(line536)"></a><font color=Blue>-- return (IncludeSect i)) `onFail`</font>-<a name="(line537)"></a><font color=Blue>-- ( do tok TokSectionOpen</font>-<a name="(line538)"></a><font color=Blue>-- tok (TokSection IGNOREx)</font>-<a name="(line539)"></a><font color=Blue>-- tok TokSqOpen `onFail` failP "missing [ after IGNORE"</font>-<a name="(line540)"></a><font color=Blue>-- i <- many ignoresectcontents</font>-<a name="(line541)"></a><font color=Blue>-- tok TokSectionClose `onFail` failP "missing ] after IGNORE"</font>-<a name="(line542)"></a><font color=Blue>-- return (IgnoreSect i))</font>-<a name="(line543)"></a><font color=Blue>--</font>-<a name="(line544)"></a><font color=Blue>--ignoresectcontents :: HParser IgnoreSectContents</font>-<a name="(line545)"></a><font color=Blue>--ignoresectcontents = do</font>-<a name="(line546)"></a><font color=Blue>-- i <- ignore</font>-<a name="(line547)"></a><font color=Blue>-- is <- many (do tok TokSectionOpen</font>-<a name="(line548)"></a><font color=Blue>-- ic <- ignoresectcontents</font>-<a name="(line549)"></a><font color=Blue>-- tok TokSectionClose</font>-<a name="(line550)"></a><font color=Blue>-- ig <- ignore</font>-<a name="(line551)"></a><font color=Blue>-- return (ic,ig))</font>-<a name="(line552)"></a><font color=Blue>-- return (IgnoreSectContents i is)</font>-<a name="(line553)"></a><font color=Blue>--</font>-<a name="(line554)"></a><font color=Blue>--ignore :: HParser Ignore</font>-<a name="(line555)"></a><font color=Blue>--ignore = freetext >>= return . Ignore</font>-<a name="(line556)"></a>-<a name="(line557)"></a><a name="reference"></a>reference <font color=Red>::</font> HParser Reference-<a name="(line558)"></a>reference <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line559)"></a> bracket <font color=Cyan>(</font>tok TokAmp<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSemi<font color=Cyan>)</font> <font color=Cyan>(</font>freetext <font color=Cyan>>>=</font> val<font color=Cyan>)</font>-<a name="(line560)"></a> <font color=Green><u>where</u></font>-<a name="(line561)"></a> val <font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font><font color=Magenta>'x'</font><font color=Red><b>:</b></font>i<font color=Cyan>)</font> <font color=Red>|</font> all isHexDigit i-<a name="(line562)"></a> <font color=Red>=</font> return <font color=Cyan>.</font> RefChar <font color=Cyan>.</font> fst <font color=Cyan>.</font> head <font color=Cyan>.</font> readHex <font color=Cyan>$</font> i-<a name="(line563)"></a> val <font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>i<font color=Cyan>)</font> <font color=Red>|</font> all isDigit i-<a name="(line564)"></a> <font color=Red>=</font> return <font color=Cyan>.</font> RefChar <font color=Cyan>.</font> fst <font color=Cyan>.</font> head <font color=Cyan>.</font> readDec <font color=Cyan>$</font> i-<a name="(line565)"></a> val name <font color=Red>=</font> return <font color=Cyan>.</font> RefEntity <font color=Cyan>$</font> name-<a name="(line566)"></a>-<a name="(line567)"></a><font color=Blue>{--<a name="(line568)"></a>reference :: HParser Reference-<a name="(line569)"></a>reference =-<a name="(line570)"></a> ( charref >>= return . RefChar) `onFail`-<a name="(line571)"></a> ( entityref >>= return . RefEntity)-<a name="(line572)"></a>-<a name="(line573)"></a>entityref :: HParser EntityRef-<a name="(line574)"></a>entityref = do-<a name="(line575)"></a> n <- bracket (tok TokAmp) (tok TokSemi) name-<a name="(line576)"></a> return n-<a name="(line577)"></a>-<a name="(line578)"></a>charref :: HParser CharRef-<a name="(line579)"></a>charref = do-<a name="(line580)"></a> bracket (tok TokAmp) (tok TokSemi) (freetext >>= readCharVal)-<a name="(line581)"></a> where-<a name="(line582)"></a> readCharVal ('#':'x':i) = return . fst . head . readHex $ i-<a name="(line583)"></a> readCharVal ('#':i) = return . fst . head . readDec $ i-<a name="(line584)"></a> readCharVal _ = mzero-<a name="(line585)"></a>-}</font>-<a name="(line586)"></a>-<a name="(line587)"></a><font color=Blue>--pereference :: HParser PEReference</font>-<a name="(line588)"></a><font color=Blue>--pereference = do</font>-<a name="(line589)"></a><font color=Blue>-- bracket (tok TokPercent) (tok TokSemi) nmtoken</font>-<a name="(line590)"></a><font color=Blue>--</font>-<a name="(line591)"></a><font color=Blue>--entitydecl :: HParser EntityDecl</font>-<a name="(line592)"></a><font color=Blue>--entitydecl =</font>-<a name="(line593)"></a><font color=Blue>-- ( gedecl >>= return . EntityGEDecl) `onFail`</font>-<a name="(line594)"></a><font color=Blue>-- ( pedecl >>= return . EntityPEDecl)</font>-<a name="(line595)"></a><font color=Blue>--</font>-<a name="(line596)"></a><font color=Blue>--gedecl :: HParser GEDecl</font>-<a name="(line597)"></a><font color=Blue>--gedecl = do</font>-<a name="(line598)"></a><font color=Blue>-- tok TokSpecialOpen</font>-<a name="(line599)"></a><font color=Blue>-- tok (TokSpecial ENTITYx)</font>-<a name="(line600)"></a><font color=Blue>-- n <- name</font>-<a name="(line601)"></a><font color=Blue>-- e <- entitydef `onFail` failP "missing entity defn in G ENTITY decl"</font>-<a name="(line602)"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "expected > terminating G ENTITY decl"</font>-<a name="(line603)"></a><font color=Blue>-- return (GEDecl n e)</font>-<a name="(line604)"></a><font color=Blue>--</font>-<a name="(line605)"></a><font color=Blue>--pedecl :: HParser PEDecl</font>-<a name="(line606)"></a><font color=Blue>--pedecl = do</font>-<a name="(line607)"></a><font color=Blue>-- tok TokSpecialOpen</font>-<a name="(line608)"></a><font color=Blue>-- tok (TokSpecial ENTITYx)</font>-<a name="(line609)"></a><font color=Blue>-- tok TokPercent</font>-<a name="(line610)"></a><font color=Blue>-- n <- name</font>-<a name="(line611)"></a><font color=Blue>-- e <- pedef `onFail` failP "missing entity defn in P ENTITY decl"</font>-<a name="(line612)"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "expected > terminating P ENTITY decl"</font>-<a name="(line613)"></a><font color=Blue>-- return (PEDecl n e)</font>-<a name="(line614)"></a><font color=Blue>--</font>-<a name="(line615)"></a><font color=Blue>--entitydef :: HParser EntityDef</font>-<a name="(line616)"></a><font color=Blue>--entitydef =</font>-<a name="(line617)"></a><font color=Blue>-- ( entityvalue >>= return . DefEntityValue) `onFail`</font>-<a name="(line618)"></a><font color=Blue>-- ( do eid <- externalid</font>-<a name="(line619)"></a><font color=Blue>-- ndd <- maybe ndatadecl</font>-<a name="(line620)"></a><font color=Blue>-- return (DefExternalID eid ndd))</font>-<a name="(line621)"></a><font color=Blue>--</font>-<a name="(line622)"></a><font color=Blue>--pedef :: HParser PEDef</font>-<a name="(line623)"></a><font color=Blue>--pedef =</font>-<a name="(line624)"></a><font color=Blue>-- ( entityvalue >>= return . PEDefEntityValue) `onFail`</font>-<a name="(line625)"></a><font color=Blue>-- ( externalid >>= return . PEDefExternalID)</font>-<a name="(line626)"></a>-<a name="(line627)"></a><a name="externalid"></a>externalid <font color=Red>::</font> HParser ExternalID-<a name="(line628)"></a>externalid <font color=Red>=</font>-<a name="(line629)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> word <font color=Magenta>"SYSTEM"</font>-<a name="(line630)"></a> s <font color=Red><-</font> systemliteral-<a name="(line631)"></a> return <font color=Cyan>(</font>SYSTEM s<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line632)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> word <font color=Magenta>"PUBLIC"</font>-<a name="(line633)"></a> p <font color=Red><-</font> pubidliteral-<a name="(line634)"></a> s <font color=Red><-</font> <font color=Cyan>(</font>systemliteral <font color=Cyan>`onFail`</font> return <font color=Cyan>(</font>SystemLiteral <font color=Magenta>""</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line635)"></a> return <font color=Cyan>(</font>PUBLIC p s<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line636)"></a>-<a name="(line637)"></a><font color=Blue>--ndatadecl :: HParser NDataDecl</font>-<a name="(line638)"></a><font color=Blue>--ndatadecl = do</font>-<a name="(line639)"></a><font color=Blue>-- word "NDATA"</font>-<a name="(line640)"></a><font color=Blue>-- n <- name</font>-<a name="(line641)"></a><font color=Blue>-- return (NDATA n)</font>-<a name="(line642)"></a>-<a name="(line643)"></a><a name="textdecl"></a>textdecl <font color=Red>::</font> HParser TextDecl-<a name="(line644)"></a>textdecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line645)"></a> tok TokPIOpen-<a name="(line646)"></a> <font color=Cyan>(</font>word <font color=Magenta>"xml"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"XML"</font><font color=Cyan>)</font>-<a name="(line647)"></a> v <font color=Red><-</font> maybe versioninfo-<a name="(line648)"></a> e <font color=Red><-</font> encodingdecl-<a name="(line649)"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failP <font color=Magenta>"expected ?> terminating text decl"</font>-<a name="(line650)"></a> return <font color=Cyan>(</font>TextDecl v e<font color=Cyan>)</font>-<a name="(line651)"></a>-<a name="(line652)"></a><font color=Blue>--extparsedent :: HParser ExtParsedEnt</font>-<a name="(line653)"></a><font color=Blue>--extparsedent = do</font>-<a name="(line654)"></a><font color=Blue>-- t <- maybe textdecl</font>-<a name="(line655)"></a><font color=Blue>-- (_,c) <- (content "")</font>-<a name="(line656)"></a><font color=Blue>-- return (ExtParsedEnt t c)</font>-<a name="(line657)"></a><font color=Blue>--</font>-<a name="(line658)"></a><font color=Blue>--extpe :: HParser ExtPE</font>-<a name="(line659)"></a><font color=Blue>--extpe = do</font>-<a name="(line660)"></a><font color=Blue>-- t <- maybe textdecl</font>-<a name="(line661)"></a><font color=Blue>-- e <- extsubsetdecl</font>-<a name="(line662)"></a><font color=Blue>-- return (ExtPE t e)</font>-<a name="(line663)"></a>-<a name="(line664)"></a><a name="encodingdecl"></a>encodingdecl <font color=Red>::</font> HParser EncodingDecl-<a name="(line665)"></a>encodingdecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line666)"></a> <font color=Cyan>(</font>word <font color=Magenta>"encoding"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"ENCODING"</font><font color=Cyan>)</font>-<a name="(line667)"></a> tok TokEqual <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"expected = in 'encoding' decl"</font>-<a name="(line668)"></a> f <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext-<a name="(line669)"></a> return <font color=Cyan>(</font>EncodingDecl f<font color=Cyan>)</font>-<a name="(line670)"></a>-<a name="(line671)"></a><font color=Blue>--notationdecl :: HParser NotationDecl</font>-<a name="(line672)"></a><font color=Blue>--notationdecl = do</font>-<a name="(line673)"></a><font color=Blue>-- tok TokSpecialOpen</font>-<a name="(line674)"></a><font color=Blue>-- word "NOTATION"</font>-<a name="(line675)"></a><font color=Blue>-- n <- name</font>-<a name="(line676)"></a><font color=Blue>-- e <- either externalid publicid</font>-<a name="(line677)"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "expected > terminating NOTATION decl"</font>-<a name="(line678)"></a><font color=Blue>-- return (NOTATION n e)</font>-<a name="(line679)"></a>-<a name="(line680)"></a><a name="publicid"></a>publicid <font color=Red>::</font> HParser PublicID-<a name="(line681)"></a>publicid <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line682)"></a> word <font color=Magenta>"PUBLICID"</font>-<a name="(line683)"></a> p <font color=Red><-</font> pubidliteral-<a name="(line684)"></a> return <font color=Cyan>(</font>PUBLICID p<font color=Cyan>)</font>-<a name="(line685)"></a>-<a name="(line686)"></a><a name="entityvalue"></a>entityvalue <font color=Red>::</font> HParser EntityValue-<a name="(line687)"></a>entityvalue <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line688)"></a> evs <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>many ev<font color=Cyan>)</font>-<a name="(line689)"></a> return <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font>-<a name="(line690)"></a>-<a name="(line691)"></a><a name="ev"></a>ev <font color=Red>::</font> HParser EV-<a name="(line692)"></a>ev <font color=Red>=</font>-<a name="(line693)"></a> <font color=Cyan>(</font> freetext <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EVString<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line694)"></a><font color=Blue>-- PEREF(EVPERef,ev) `onFail`</font>-<a name="(line695)"></a> <font color=Cyan>(</font> reference <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EVRef<font color=Cyan>)</font>-<a name="(line696)"></a>-<a name="(line697)"></a><a name="attvalue"></a>attvalue <font color=Red>::</font> HParser AttValue-<a name="(line698)"></a>attvalue <font color=Red>=</font>-<a name="(line699)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> avs <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font>-<a name="(line700)"></a> <font color=Cyan>(</font>many <font color=Cyan>(</font>either freetext reference<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line701)"></a> return <font color=Cyan>(</font>AttValue avs<font color=Cyan>)</font> <font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line702)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> v <font color=Red><-</font> nmtoken-<a name="(line703)"></a> s <font color=Red><-</font> <font color=Cyan>(</font>tok TokPercent <font color=Cyan>>></font> return <font color=Magenta>"%"</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font> return <font color=Magenta>""</font>-<a name="(line704)"></a> return <font color=Cyan>(</font>AttValue <font color=Red>[</font>Left <font color=Cyan>(</font>v<font color=Cyan>++</font>s<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font> <font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line705)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> s <font color=Red><-</font> oneOf <font color=Red>[</font> tok TokPlus <font color=Cyan>>></font> return <font color=Magenta>"+"</font>-<a name="(line706)"></a> <font color=Cyan>,</font> tok TokHash <font color=Cyan>>></font> return <font color=Magenta>"#"</font>-<a name="(line707)"></a> <font color=Red>]</font>-<a name="(line708)"></a> v <font color=Red><-</font> nmtoken-<a name="(line709)"></a> return <font color=Cyan>(</font>AttValue <font color=Red>[</font>Left <font color=Cyan>(</font>s<font color=Cyan>++</font>v<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font> <font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line710)"></a> failP <font color=Magenta>"Badly formatted attribute value"</font>-<a name="(line711)"></a>-<a name="(line712)"></a><a name="systemliteral"></a>systemliteral <font color=Red>::</font> HParser SystemLiteral-<a name="(line713)"></a>systemliteral <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line714)"></a> s <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext-<a name="(line715)"></a> return <font color=Cyan>(</font>SystemLiteral s<font color=Cyan>)</font> <font color=Blue>-- note: need to fold &...; escapes</font>-<a name="(line716)"></a>-<a name="(line717)"></a><a name="pubidliteral"></a>pubidliteral <font color=Red>::</font> HParser PubidLiteral-<a name="(line718)"></a>pubidliteral <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line719)"></a> s <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext-<a name="(line720)"></a> return <font color=Cyan>(</font>PubidLiteral s<font color=Cyan>)</font> <font color=Blue>-- note: need to fold &...; escapes</font>-<a name="(line721)"></a>-<a name="(line722)"></a><a name="chardata"></a>chardata <font color=Red>::</font> HParser CharData-<a name="(line723)"></a>chardata <font color=Red>=</font> freetext <font color=Blue>-- >>= return . CharData</font>-<a name="(line724)"></a>-</pre>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/Html/Parse.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>-- | This is a parser for HTML documents. Unlike for XML documents, it</font>+<a name="line-2"></a><font color=Blue>-- must include a certain amount of error-correction to account for</font>+<a name="line-3"></a><font color=Blue>-- HTML features like self-terminating tags, unterminated tags, and</font>+<a name="line-4"></a><font color=Blue>-- incorrect nesting. The input is tokenised by the</font>+<a name="line-5"></a><font color=Blue>-- XML lexer (a separate lexer is not required for HTML).</font>+<a name="line-6"></a>+<a name="line-7"></a><font color=Blue>-- It uses a slightly extended version of the Hutton/Meijer parser</font>+<a name="line-8"></a><font color=Blue>-- combinators.</font>+<a name="line-9"></a>+<a name="line-10"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Html<font color=Cyan>.</font>Parse+<a name="line-11"></a> <font color=Cyan>(</font> htmlParse+<a name="line-12"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-13"></a>+<a name="line-14"></a><font color=Green><u>import</u></font> Prelude hiding <font color=Cyan>(</font>either<font color=Cyan>,</font>maybe<font color=Cyan>,</font>sequence<font color=Cyan>)</font>+<a name="line-15"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Prelude <font color=Cyan>(</font>either<font color=Cyan>)</font>+<a name="line-16"></a><font color=Green><u>import</u></font> Maybe hiding <font color=Cyan>(</font>maybe<font color=Cyan>)</font>+<a name="line-17"></a><font color=Green><u>import</u></font> Char <font color=Cyan>(</font>toLower<font color=Cyan>,</font> isSpace<font color=Cyan>,</font> isDigit<font color=Cyan>,</font> isHexDigit<font color=Cyan>)</font>+<a name="line-18"></a><font color=Green><u>import</u></font> Numeric <font color=Cyan>(</font>readDec<font color=Cyan>,</font>readHex<font color=Cyan>)</font>+<a name="line-19"></a><font color=Green><u>import</u></font> Monad+<a name="line-20"></a>+<a name="line-21"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-22"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Lex+<a name="line-23"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Posn+<a name="line-24"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>Poly<font color=Cyan>.</font>NoLeak<font color=Cyan>.</font>Plain+<a name="line-25"></a>+<a name="line-26"></a><font color=Blue>-- #define DEBUG</font>+<a name="line-27"></a> +<a name="line-28"></a><font color=Magenta><em>#if defined(DEBUG)</em></font>+<a name="line-29"></a><font color=Magenta><em># if ( defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 502 ) || \</em></font>+<a name="line-30"></a> <font color=Cyan>(</font> defined<font color=Cyan>(</font><b><font color=Magenta>__NHC__</font></b><font color=Cyan>)</font> <font color=Cyan>&&</font> <b><font color=Magenta>__NHC__</font></b> <font color=Cyan>></font> <font color=Magenta>114</font> <font color=Cyan>)</font> <font color=Cyan>||</font> defined<font color=Cyan>(</font><b><font color=Magenta>__HUGS__</font></b><font color=Cyan>)</font>+<a name="line-31"></a><font color=Green><u>import</u></font> Debug<font color=Cyan>.</font>Trace<font color=Cyan>(</font>trace<font color=Cyan>)</font>+<a name="line-32"></a><font color=Magenta><em># elif defined(__GLASGOW_HASKELL__)</em></font>+<a name="line-33"></a><font color=Green><u>import</u></font> IOExts<font color=Cyan>(</font>trace<font color=Cyan>)</font>+<a name="line-34"></a><font color=Magenta><em># elif defined(__NHC__) || defined(__HBC__)</em></font>+<a name="line-35"></a><font color=Green><u>import</u></font> NonStdTrace+<a name="line-36"></a><font color=Magenta><em># endif</em></font>+<a name="line-37"></a><a name="debug"></a><font color=Blue>debug</font> <font color=Red>::</font> Monad m <font color=Red>=></font> String <font color=Red>-></font> m ()+<a name="line-38"></a><font color=Blue>debug</font> s <font color=Red>=</font> trace s <font color=Cyan>(</font>return ()<font color=Cyan>)</font>+<a name="line-39"></a><font color=Magenta><em>#else</em></font>+<a name="line-40"></a><font color=Blue>debug</font> <font color=Red>::</font> Monad m <font color=Red>=></font> String <font color=Red>-></font> m ()+<a name="line-41"></a><font color=Blue>debug</font> s <font color=Red>=</font> return ()+<a name="line-42"></a><font color=Magenta><em>#endif</em></font>+<a name="line-43"></a>+<a name="line-44"></a>+<a name="line-45"></a><a name="htmlParse"></a><font color=Blue>-- | The first argument is the name of the file, the second is the string</font>+<a name="line-46"></a><font color=Blue>-- contents of the file. The result is the generic representation of</font>+<a name="line-47"></a><font color=Blue>-- an XML document. Any errors cause program failure with message to stderr.</font>+<a name="line-48"></a><font color=Blue>htmlParse</font> <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Document Posn+<a name="line-49"></a><font color=Blue>htmlParse</font> name <font color=Red>=</font> Prelude<font color=Cyan>.</font>either error id <font color=Cyan>.</font> htmlParse' name+<a name="line-50"></a>+<a name="line-51"></a><a name="htmlParse'"></a><font color=Blue>-- | The first argument is the name of the file, the second is the string</font>+<a name="line-52"></a><font color=Blue>-- contents of the file. The result is the generic representation of</font>+<a name="line-53"></a><font color=Blue>-- an XML document. Any parsing errors are returned in the @Either@ type.</font>+<a name="line-54"></a><font color=Blue>htmlParse'</font> <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Either String <font color=Cyan>(</font>Document Posn<font color=Cyan>)</font>+<a name="line-55"></a><font color=Blue>htmlParse'</font> name <font color=Red>=</font> Prelude<font color=Cyan>.</font>either Left <font color=Cyan>(</font>Right <font color=Cyan>.</font> simplify<font color=Cyan>)</font> <font color=Cyan>.</font> fst+<a name="line-56"></a> <font color=Cyan>.</font> runParser document <font color=Cyan>.</font> xmlLex name+<a name="line-57"></a>+<a name="line-58"></a><font color=Blue>---- Document simplification ----</font>+<a name="line-59"></a>+<a name="line-60"></a><a name="simplify"></a><font color=Blue>simplify</font> <font color=Red>::</font> Document i <font color=Red>-></font> Document i+<a name="line-61"></a><font color=Blue>simplify</font> <font color=Cyan>(</font>Document p st <font color=Cyan>(</font>Elem n avs cs<font color=Cyan>)</font> ms<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-62"></a> Document p st <font color=Cyan>(</font>Elem n avs <font color=Cyan>(</font>deepfilter simp cs<font color=Cyan>)</font><font color=Cyan>)</font> ms+<a name="line-63"></a> <font color=Green><u>where</u></font>+<a name="line-64"></a> simp <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"null"</font> [] []<font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> False+<a name="line-65"></a> simp <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem n <font color=Green><u>_</u></font> []<font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>|</font> n <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"font"</font><font color=Cyan>,</font><font color=Magenta>"p"</font><font color=Cyan>,</font><font color=Magenta>"i"</font><font color=Cyan>,</font><font color=Magenta>"b"</font><font color=Cyan>,</font><font color=Magenta>"em"</font>+<a name="line-66"></a> <font color=Cyan>,</font><font color=Magenta>"tt"</font><font color=Cyan>,</font><font color=Magenta>"big"</font><font color=Cyan>,</font><font color=Magenta>"small"</font><font color=Red>]</font> <font color=Red>=</font> False+<a name="line-67"></a> <font color=Blue>-- simp (CString False s _) | all isSpace s = False</font>+<a name="line-68"></a> simp <font color=Green><u>_</u></font> <font color=Red>=</font> True+<a name="line-69"></a> deepfilter p <font color=Red>=</font>+<a name="line-70"></a> filter p <font color=Cyan>.</font> map <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font> <font color=Green><u>case</u></font> c <font color=Green><u>of</u></font>+<a name="line-71"></a> CElem <font color=Cyan>(</font>Elem n avs cs<font color=Cyan>)</font> i+<a name="line-72"></a> <font color=Red>-></font> CElem <font color=Cyan>(</font>Elem n avs <font color=Cyan>(</font>deepfilter p cs<font color=Cyan>)</font><font color=Cyan>)</font> i+<a name="line-73"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> c<font color=Cyan>)</font>+<a name="line-74"></a>+<a name="line-75"></a><a name="selfclosingtags"></a><font color=Blue>-- opening any of these, they close again immediately</font>+<a name="line-76"></a><font color=Blue>selfclosingtags</font> <font color=Red>=</font> <font color=Red>[</font><font color=Magenta>"img"</font><font color=Cyan>,</font><font color=Magenta>"hr"</font><font color=Cyan>,</font><font color=Magenta>"br"</font><font color=Cyan>,</font><font color=Magenta>"meta"</font><font color=Cyan>,</font><font color=Magenta>"col"</font><font color=Cyan>,</font><font color=Magenta>"link"</font><font color=Cyan>,</font><font color=Magenta>"base"</font>+<a name="line-77"></a> <font color=Cyan>,</font><font color=Magenta>"param"</font><font color=Cyan>,</font><font color=Magenta>"area"</font><font color=Cyan>,</font><font color=Magenta>"frame"</font><font color=Cyan>,</font><font color=Magenta>"input"</font><font color=Red>]</font>+<a name="line-78"></a>+<a name="line-79"></a><a name="closeInnerTags"></a><font color=Blue>--closing this, implicitly closes any of those which are contained in it</font>+<a name="line-80"></a><font color=Blue>closeInnerTags</font> <font color=Red>=</font>+<a name="line-81"></a> <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"ul"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"li"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-82"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"ol"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"li"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-83"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"dl"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"dt"</font><font color=Cyan>,</font><font color=Magenta>"dd"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-84"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"tr"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-85"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"div"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-86"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"thead"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-87"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"tfoot"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-88"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"tbody"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-89"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"table"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Cyan>,</font><font color=Magenta>"thead"</font><font color=Cyan>,</font><font color=Magenta>"tfoot"</font><font color=Cyan>,</font><font color=Magenta>"tbody"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-90"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"caption"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-91"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"th"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-92"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"td"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-93"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"li"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-94"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"dt"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-95"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"dd"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-96"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"object"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-97"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"map"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-98"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"body"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-99"></a> <font color=Red>]</font>+<a name="line-100"></a>+<a name="line-101"></a><a name="closes"></a><font color=Blue>--opening this, implicitly closes that</font>+<a name="line-102"></a><font color=Blue>closes</font> <font color=Red>::</font> Name <font color=Red>-></font> Name <font color=Red>-></font> Bool+<a name="line-103"></a><font color=Magenta>"a"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"a"</font> <font color=Red>=</font> True+<a name="line-104"></a><font color=Magenta>"li"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"li"</font> <font color=Red>=</font> True+<a name="line-105"></a><font color=Magenta>"th"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font> <font color=Red>=</font> True+<a name="line-106"></a><font color=Magenta>"td"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font> <font color=Red>=</font> True+<a name="line-107"></a><font color=Magenta>"tr"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Red>]</font> <font color=Red>=</font> True+<a name="line-108"></a><font color=Magenta>"dt"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"dt"</font><font color=Cyan>,</font><font color=Magenta>"dd"</font><font color=Red>]</font> <font color=Red>=</font> True+<a name="line-109"></a><font color=Magenta>"dd"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"dt"</font><font color=Cyan>,</font><font color=Magenta>"dd"</font><font color=Red>]</font> <font color=Red>=</font> True+<a name="line-110"></a><font color=Magenta>"form"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"form"</font> <font color=Red>=</font> True+<a name="line-111"></a><font color=Magenta>"label"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"label"</font> <font color=Red>=</font> True+<a name="line-112"></a><font color=Green><u>_</u></font> <font color=Cyan>`closes`</font> <font color=Magenta>"option"</font> <font color=Red>=</font> True+<a name="line-113"></a><font color=Magenta>"thead"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"colgroup"</font><font color=Red>]</font> <font color=Red>=</font> True+<a name="line-114"></a><font color=Magenta>"tfoot"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"thead"</font><font color=Cyan>,</font><font color=Magenta>"colgroup"</font><font color=Red>]</font> <font color=Red>=</font> True+<a name="line-115"></a><font color=Magenta>"tbody"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"tbody"</font><font color=Cyan>,</font><font color=Magenta>"tfoot"</font><font color=Cyan>,</font><font color=Magenta>"thead"</font><font color=Cyan>,</font><font color=Magenta>"colgroup"</font><font color=Red>]</font> <font color=Red>=</font> True+<a name="line-116"></a><font color=Magenta>"colgroup"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"colgroup"</font> <font color=Red>=</font> True+<a name="line-117"></a><a name="closes"></a><font color=Blue>t</font> <font color=Cyan>`closes`</font> <font color=Magenta>"p"</font>+<a name="line-118"></a> <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Cyan>,</font><font color=Magenta>"h1"</font><font color=Cyan>,</font><font color=Magenta>"h2"</font><font color=Cyan>,</font><font color=Magenta>"h3"</font><font color=Cyan>,</font><font color=Magenta>"h4"</font><font color=Cyan>,</font><font color=Magenta>"h5"</font><font color=Cyan>,</font><font color=Magenta>"h6"</font>+<a name="line-119"></a> <font color=Cyan>,</font><font color=Magenta>"hr"</font><font color=Cyan>,</font><font color=Magenta>"div"</font><font color=Cyan>,</font><font color=Magenta>"ul"</font><font color=Cyan>,</font><font color=Magenta>"dl"</font><font color=Cyan>,</font><font color=Magenta>"ol"</font><font color=Cyan>,</font><font color=Magenta>"table"</font><font color=Red>]</font> <font color=Red>=</font> True+<a name="line-120"></a><font color=Green><u>_</u></font> <font color=Cyan>`closes`</font> <font color=Green><u>_</u></font> <font color=Red>=</font> False+<a name="line-121"></a>+<a name="line-122"></a>+<a name="line-123"></a>+<a name="line-124"></a><font color=Blue>---- Misc ----</font>+<a name="line-125"></a>+<a name="line-126"></a><a name="fst3"></a><font color=Blue>fst3</font> <font color=Cyan>(</font>a<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> a+<a name="line-127"></a><a name="snd3"></a><font color=Blue>snd3</font> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font>a<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> a+<a name="line-128"></a><a name="thd3"></a><font color=Blue>thd3</font> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font>a<font color=Cyan>)</font> <font color=Red>=</font> a+<a name="line-129"></a>+<a name="line-130"></a>+<a name="line-131"></a>+<a name="line-132"></a><font color=Blue>---- Auxiliary Parsing Functions ----</font>+<a name="line-133"></a>+<a name="line-134"></a><a name="HParser"></a><font color=Green><u>type</u></font> HParser a <font color=Red>=</font> Parser <font color=Cyan>(</font>Posn<font color=Cyan>,</font>TokenT<font color=Cyan>)</font> a+<a name="line-135"></a>+<a name="line-136"></a><a name="tok"></a><font color=Blue>tok</font> <font color=Red>::</font> TokenT <font color=Red>-></font> HParser TokenT+<a name="line-137"></a><font color=Blue>tok</font> t <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t'<font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-138"></a> <font color=Green><u>case</u></font> t' <font color=Green><u>of</u></font> TokError s <font color=Red>-></font> report failBad <font color=Cyan>(</font>show t<font color=Cyan>)</font> p t'+<a name="line-139"></a> <font color=Green><u>_</u></font> <font color=Red>|</font> t'<font color=Cyan>==</font>t <font color=Red>-></font> return t+<a name="line-140"></a> <font color=Red>|</font> otherwise <font color=Red>-></font> report fail <font color=Cyan>(</font>show t<font color=Cyan>)</font> p t'+<a name="line-141"></a>+<a name="line-142"></a><a name="name"></a><font color=Blue>name</font> <font color=Red>::</font> HParser Name+<a name="line-143"></a><font color=Blue>--name = do {(p,TokName s) <- next; return s}</font>+<a name="line-144"></a><font color=Blue>name</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>tok<font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-145"></a> <font color=Green><u>case</u></font> tok <font color=Green><u>of</u></font> +<a name="line-146"></a> TokName s <font color=Red>-></font> return s +<a name="line-147"></a> TokError s <font color=Red>-></font> report failBad <font color=Magenta>"a name"</font> p tok+<a name="line-148"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"a name"</font> p tok+<a name="line-149"></a>+<a name="line-150"></a><a name="string"></a><font color=Blue>string</font><font color=Cyan>,</font> freetext <font color=Red>::</font> HParser String+<a name="line-151"></a><font color=Blue>string</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-152"></a> <font color=Green><u>case</u></font> t <font color=Green><u>of</u></font> TokName s <font color=Red>-></font> return s+<a name="line-153"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"text"</font> p t+<a name="line-154"></a><a name="freetext"></a><font color=Blue>freetext</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-155"></a> <font color=Green><u>case</u></font> t <font color=Green><u>of</u></font> TokFreeText s <font color=Red>-></font> return s+<a name="line-156"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"text"</font> p t+<a name="line-157"></a>+<a name="line-158"></a><a name="maybe"></a><font color=Blue>maybe</font> <font color=Red>::</font> HParser a <font color=Red>-></font> HParser <font color=Cyan>(</font>Maybe a<font color=Cyan>)</font>+<a name="line-159"></a><font color=Blue>maybe</font> p <font color=Red>=</font>+<a name="line-160"></a> <font color=Cyan>(</font> p <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Just<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-161"></a> <font color=Cyan>(</font> return Nothing<font color=Cyan>)</font>+<a name="line-162"></a>+<a name="line-163"></a><a name="either"></a><font color=Blue>either</font> <font color=Red>::</font> HParser a <font color=Red>-></font> HParser b <font color=Red>-></font> HParser <font color=Cyan>(</font>Either a b<font color=Cyan>)</font>+<a name="line-164"></a><font color=Blue>either</font> p q <font color=Red>=</font>+<a name="line-165"></a> <font color=Cyan>(</font> p <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Left<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-166"></a> <font color=Cyan>(</font> q <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Right<font color=Cyan>)</font>+<a name="line-167"></a>+<a name="line-168"></a><a name="word"></a><font color=Blue>word</font> <font color=Red>::</font> String <font color=Red>-></font> HParser ()+<a name="line-169"></a><font color=Blue>word</font> s <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> x <font color=Red><-</font> next+<a name="line-170"></a> <font color=Cyan>;</font> <font color=Green><u>case</u></font> x <font color=Green><u>of</u></font>+<a name="line-171"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>TokName n<font color=Cyan>)</font> <font color=Red>|</font> s<font color=Cyan>==</font>n <font color=Red>-></font> return ()+<a name="line-172"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>TokFreeText n<font color=Cyan>)</font> <font color=Red>|</font> s<font color=Cyan>==</font>n <font color=Red>-></font> return ()+<a name="line-173"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Red>@</font><font color=Cyan>(</font>TokError <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> report failBad <font color=Cyan>(</font>show s<font color=Cyan>)</font> p t+<a name="line-174"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red>-></font> report fail <font color=Cyan>(</font>show s<font color=Cyan>)</font> p t+<a name="line-175"></a> <font color=Cyan>}</font>+<a name="line-176"></a>+<a name="line-177"></a><a name="posn"></a><font color=Blue>posn</font> <font color=Red>::</font> HParser Posn+<a name="line-178"></a><font color=Blue>posn</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> x<font color=Red>@</font><font color=Cyan>(</font>p<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-179"></a> <font color=Cyan>;</font> reparse <font color=Red>[</font>x<font color=Red>]</font>+<a name="line-180"></a> <font color=Cyan>;</font> return p+<a name="line-181"></a> <font color=Cyan>}</font> <font color=Cyan>`onFail`</font> return noPos+<a name="line-182"></a>+<a name="line-183"></a><a name="nmtoken"></a><font color=Blue>nmtoken</font> <font color=Red>::</font> HParser NmToken+<a name="line-184"></a><font color=Blue>nmtoken</font> <font color=Red>=</font> <font color=Cyan>(</font>string <font color=Cyan>`onFail`</font> freetext<font color=Cyan>)</font>+<a name="line-185"></a>+<a name="line-186"></a><a name="failP"></a><font color=Blue>failP</font><font color=Cyan>,</font> failBadP <font color=Red>::</font> String <font color=Red>-></font> HParser a+<a name="line-187"></a><font color=Blue>failP</font> msg <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn<font color=Cyan>;</font> fail <font color=Cyan>(</font>msg<font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font> <font color=Cyan>}</font>+<a name="line-188"></a><a name="failBadP"></a><font color=Blue>failBadP</font> msg <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn<font color=Cyan>;</font> failBad <font color=Cyan>(</font>msg<font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font> <font color=Cyan>}</font>+<a name="line-189"></a>+<a name="line-190"></a><a name="report"></a><font color=Blue>report</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>HParser a<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> Posn <font color=Red>-></font> TokenT <font color=Red>-></font> HParser a+<a name="line-191"></a><font color=Blue>report</font> fail exp p t <font color=Red>=</font> fail <font color=Cyan>(</font><font color=Magenta>"Expected "</font><font color=Cyan>++</font>show exp<font color=Cyan>++</font><font color=Magenta>" but found "</font><font color=Cyan>++</font>show t+<a name="line-192"></a> <font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>+<a name="line-193"></a>+<a name="line-194"></a><a name="adjustErrP"></a><font color=Blue>adjustErrP</font> <font color=Red>::</font> HParser a <font color=Red>-></font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Cyan>)</font> <font color=Red>-></font> HParser a+<a name="line-195"></a><a name="adjustErrP"></a><font color=Blue>p</font> <font color=Cyan>`adjustErrP`</font> f <font color=Red>=</font> p <font color=Cyan>`onFail`</font> <font color=Green><u>do</u></font> pn <font color=Red><-</font> posn+<a name="line-196"></a> <font color=Cyan>(</font>p <font color=Cyan>`adjustErr`</font> f<font color=Cyan>)</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>++</font>show pn<font color=Cyan>)</font>+<a name="line-197"></a>+<a name="line-198"></a><font color=Blue>---- XML Parsing Functions ----</font>+<a name="line-199"></a>+<a name="line-200"></a><a name="document"></a><font color=Blue>document</font> <font color=Red>::</font> HParser <font color=Cyan>(</font>Document Posn<font color=Cyan>)</font>+<a name="line-201"></a><font color=Blue>document</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-202"></a> p <font color=Red><-</font> prolog <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"unrecognisable XML prolog\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-203"></a> es <font color=Red><-</font> many1 <font color=Cyan>(</font>element <font color=Magenta>"HTML document"</font><font color=Cyan>)</font>+<a name="line-204"></a> ms <font color=Red><-</font> many misc+<a name="line-205"></a> return <font color=Cyan>(</font>Document p emptyST <font color=Cyan>(</font><font color=Green><u>case</u></font> map snd es <font color=Green><u>of</u></font>+<a name="line-206"></a> <font color=Red>[</font>e<font color=Red>]</font> <font color=Red>-></font> e+<a name="line-207"></a> es <font color=Red>-></font> Elem <font color=Magenta>"html"</font> [] <font color=Cyan>(</font>map mkCElem es<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-208"></a> ms<font color=Cyan>)</font>+<a name="line-209"></a> <font color=Green><u>where</u></font> mkCElem e <font color=Red>=</font> CElem e noPos+<a name="line-210"></a>+<a name="line-211"></a><a name="comment"></a><font color=Blue>comment</font> <font color=Red>::</font> HParser Comment+<a name="line-212"></a><font color=Blue>comment</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-213"></a> bracket <font color=Cyan>(</font>tok TokCommentOpen<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokCommentClose<font color=Cyan>)</font> freetext+<a name="line-214"></a>+<a name="line-215"></a><a name="processinginstruction"></a><font color=Blue>processinginstruction</font> <font color=Red>::</font> HParser ProcessingInstruction+<a name="line-216"></a><font color=Blue>processinginstruction</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-217"></a> tok TokPIOpen+<a name="line-218"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>+<a name="line-219"></a> n <font color=Red><-</font> string <font color=Cyan>`onFail`</font> failP <font color=Magenta>"processing instruction has no target"</font>+<a name="line-220"></a> f <font color=Red><-</font> freetext+<a name="line-221"></a> <font color=Cyan>(</font>tok TokPIClose <font color=Cyan>`onFail`</font> tok TokAnyClose<font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing ?> or >"</font>+<a name="line-222"></a> return <font color=Cyan>(</font>n<font color=Cyan>,</font> f<font color=Cyan>)</font>+<a name="line-223"></a>+<a name="line-224"></a><a name="cdsect"></a><font color=Blue>cdsect</font> <font color=Red>::</font> HParser CDSect+<a name="line-225"></a><font color=Blue>cdsect</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-226"></a> tok TokSectionOpen+<a name="line-227"></a> bracket <font color=Cyan>(</font>tok <font color=Cyan>(</font>TokSection CDATAx<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSectionClose<font color=Cyan>)</font> chardata+<a name="line-228"></a>+<a name="line-229"></a><a name="prolog"></a><font color=Blue>prolog</font> <font color=Red>::</font> HParser Prolog+<a name="line-230"></a><font color=Blue>prolog</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-231"></a> x <font color=Red><-</font> maybe xmldecl+<a name="line-232"></a> m1 <font color=Red><-</font> many misc+<a name="line-233"></a> dtd <font color=Red><-</font> maybe doctypedecl+<a name="line-234"></a> m2 <font color=Red><-</font> many misc+<a name="line-235"></a> return <font color=Cyan>(</font>Prolog x m1 dtd m2<font color=Cyan>)</font>+<a name="line-236"></a>+<a name="line-237"></a><a name="xmldecl"></a><font color=Blue>xmldecl</font> <font color=Red>::</font> HParser XMLDecl+<a name="line-238"></a><font color=Blue>xmldecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-239"></a> tok TokPIOpen+<a name="line-240"></a> <font color=Cyan>(</font>word <font color=Magenta>"xml"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"XML"</font><font color=Cyan>)</font>+<a name="line-241"></a> p <font color=Red><-</font> posn+<a name="line-242"></a> s <font color=Red><-</font> freetext+<a name="line-243"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing ?> in <?xml ...?>"</font>+<a name="line-244"></a> <font color=Cyan>(</font>Prelude<font color=Cyan>.</font>either failP return <font color=Cyan>.</font> fst <font color=Cyan>.</font> runParser aux <font color=Cyan>.</font> xmlReLex p<font color=Cyan>)</font> s+<a name="line-245"></a> <font color=Green><u>where</u></font>+<a name="line-246"></a> aux <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-247"></a> v <font color=Red><-</font> versioninfo <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing XML version info"</font>+<a name="line-248"></a> e <font color=Red><-</font> maybe encodingdecl+<a name="line-249"></a> s <font color=Red><-</font> maybe sddecl+<a name="line-250"></a> return <font color=Cyan>(</font>XMLDecl v e s<font color=Cyan>)</font>+<a name="line-251"></a>+<a name="line-252"></a><a name="versioninfo"></a><font color=Blue>versioninfo</font> <font color=Red>::</font> HParser VersionInfo+<a name="line-253"></a><font color=Blue>versioninfo</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-254"></a> <font color=Cyan>(</font>word <font color=Magenta>"version"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"VERSION"</font><font color=Cyan>)</font>+<a name="line-255"></a> tok TokEqual+<a name="line-256"></a> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext+<a name="line-257"></a>+<a name="line-258"></a><a name="misc"></a><font color=Blue>misc</font> <font color=Red>::</font> HParser Misc+<a name="line-259"></a><font color=Blue>misc</font> <font color=Red>=</font> +<a name="line-260"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"<!--comment-->"</font><font color=Cyan>,</font> comment <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Comment<font color=Cyan>)</font>+<a name="line-261"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"<?PI?>"</font><font color=Cyan>,</font> processinginstruction <font color=Cyan>>>=</font> return <font color=Cyan>.</font> PI<font color=Cyan>)</font>+<a name="line-262"></a> <font color=Red>]</font>+<a name="line-263"></a>+<a name="line-264"></a>+<a name="line-265"></a><font color=Blue>-- Question: for HTML, should we disallow in-line DTDs, allowing only externals?</font>+<a name="line-266"></a><font color=Blue>-- Answer: I think so.</font>+<a name="line-267"></a>+<a name="line-268"></a><a name="doctypedecl"></a><font color=Blue>doctypedecl</font> <font color=Red>::</font> HParser DocTypeDecl+<a name="line-269"></a><font color=Blue>doctypedecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-270"></a> tok TokSpecialOpen+<a name="line-271"></a> tok <font color=Cyan>(</font>TokSpecial DOCTYPEx<font color=Cyan>)</font>+<a name="line-272"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>+<a name="line-273"></a> n <font color=Red><-</font> name+<a name="line-274"></a> eid <font color=Red><-</font> maybe externalid+<a name="line-275"></a><font color=Blue>-- es <- maybe (bracket (tok TokSqOpen) (tok TokSqClose)) (many markupdecl)</font>+<a name="line-276"></a> tok TokAnyClose <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing > in DOCTYPE decl"</font>+<a name="line-277"></a><font color=Blue>-- return (DTD n eid (case es of { Nothing -> []; Just e -> e }))</font>+<a name="line-278"></a> return <font color=Cyan>(</font>DTD n eid []<font color=Cyan>)</font>+<a name="line-279"></a>+<a name="line-280"></a><font color=Blue>--markupdecl :: HParser MarkupDecl</font>+<a name="line-281"></a><font color=Blue>--markupdecl =</font>+<a name="line-282"></a><font color=Blue>-- ( elementdecl >>= return . Element) `onFail`</font>+<a name="line-283"></a><font color=Blue>-- ( attlistdecl >>= return . AttList) `onFail`</font>+<a name="line-284"></a><font color=Blue>-- ( entitydecl >>= return . Entity) `onFail`</font>+<a name="line-285"></a><font color=Blue>-- ( notationdecl >>= return . Notation) `onFail`</font>+<a name="line-286"></a><font color=Blue>-- ( misc >>= return . MarkupMisc) `onFail`</font>+<a name="line-287"></a><font color=Blue>-- PEREF(MarkupPE,markupdecl)</font>+<a name="line-288"></a><font color=Blue>--</font>+<a name="line-289"></a><font color=Blue>--extsubset :: HParser ExtSubset</font>+<a name="line-290"></a><font color=Blue>--extsubset = do</font>+<a name="line-291"></a><font color=Blue>-- td <- maybe textdecl</font>+<a name="line-292"></a><font color=Blue>-- ds <- many extsubsetdecl</font>+<a name="line-293"></a><font color=Blue>-- return (ExtSubset td ds)</font>+<a name="line-294"></a><font color=Blue>--</font>+<a name="line-295"></a><font color=Blue>--extsubsetdecl :: HParser ExtSubsetDecl</font>+<a name="line-296"></a><font color=Blue>--extsubsetdecl =</font>+<a name="line-297"></a><font color=Blue>-- ( markupdecl >>= return . ExtMarkupDecl) `onFail`</font>+<a name="line-298"></a><font color=Blue>-- ( conditionalsect >>= return . ExtConditionalSect) `onFail`</font>+<a name="line-299"></a><font color=Blue>-- PEREF(ExtPEReference,extsubsetdecl)</font>+<a name="line-300"></a>+<a name="line-301"></a><a name="sddecl"></a><font color=Blue>sddecl</font> <font color=Red>::</font> HParser SDDecl+<a name="line-302"></a><font color=Blue>sddecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-303"></a> <font color=Cyan>(</font>word <font color=Magenta>"standalone"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"STANDALONE"</font><font color=Cyan>)</font>+<a name="line-304"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>+<a name="line-305"></a> tok TokEqual <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing = in 'standalone' decl"</font>+<a name="line-306"></a> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font>+<a name="line-307"></a> <font color=Cyan>(</font> <font color=Cyan>(</font>word <font color=Magenta>"yes"</font> <font color=Cyan>>></font> return True<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-308"></a> <font color=Cyan>(</font>word <font color=Magenta>"no"</font> <font color=Cyan>>></font> return False<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-309"></a> failP <font color=Magenta>"'standalone' decl requires 'yes' or 'no' value"</font> <font color=Cyan>)</font>+<a name="line-310"></a>+<a name="line-311"></a>+<a name="line-312"></a>+<a name="line-313"></a>+<a name="line-314"></a><a name="Stack"></a><font color=Blue>----</font>+<a name="line-315"></a><a name="Stack"></a><font color=Blue>-- VERY IMPORTANT NOTE: The stack returned here contains those tags which</font>+<a name="line-316"></a><a name="Stack"></a><font color=Blue>-- have been closed implicitly and need to be reopened again at the</font>+<a name="line-317"></a><a name="Stack"></a><font color=Blue>-- earliest opportunity.</font>+<a name="line-318"></a><a name="Stack"></a><font color=Green><u>type</u></font> Stack <font color=Red>=</font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>Attribute<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font>+<a name="line-319"></a>+<a name="line-320"></a><a name="element"></a><font color=Blue>element</font> <font color=Red>::</font> Name <font color=Red>-></font> HParser <font color=Cyan>(</font>Stack<font color=Cyan>,</font>Element Posn<font color=Cyan>)</font>+<a name="line-321"></a><font color=Blue>element</font> ctx <font color=Red>=</font>+<a name="line-322"></a> <font color=Green><u>do</u></font>+<a name="line-323"></a> tok TokAnyOpen+<a name="line-324"></a> <font color=Cyan>(</font>ElemTag e avs<font color=Cyan>)</font> <font color=Red><-</font> elemtag+<a name="line-325"></a> <font color=Cyan>(</font> <font color=Green><u>if</u></font> e <font color=Cyan>`closes`</font> ctx <font color=Green><u>then</u></font>+<a name="line-326"></a> <font color=Blue>-- insert the missing close-tag, fail forward, and reparse.</font>+<a name="line-327"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> debug <font color=Cyan>(</font><font color=Magenta>"/"</font><font color=Cyan>)</font>+<a name="line-328"></a> unparse <font color=Cyan>(</font><font color=Red>[</font>TokEndOpen<font color=Cyan>,</font> TokName ctx<font color=Cyan>,</font> TokAnyClose<font color=Cyan>,</font>+<a name="line-329"></a> TokAnyOpen<font color=Cyan>,</font> TokName e<font color=Red>]</font> <font color=Cyan>++</font> reformatAttrs avs<font color=Cyan>)</font>+<a name="line-330"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> Elem <font color=Magenta>"null"</font> [] []<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-331"></a> <font color=Green><u>else</u></font> <font color=Green><u>if</u></font> e <font color=Cyan>`elem`</font> selfclosingtags <font color=Green><u>then</u></font>+<a name="line-332"></a> <font color=Blue>-- complete the parse straightaway.</font>+<a name="line-333"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokEndClose <font color=Blue>-- self-closing <tag /> </font>+<a name="line-334"></a> debug <font color=Cyan>(</font>e<font color=Cyan>++</font><font color=Magenta>"[+]"</font><font color=Cyan>)</font>+<a name="line-335"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> Elem e avs []<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-336"></a> <font color=Blue>-- ( do tok TokAnyClose -- sequence <tag></tag> (**not HTML?**)</font>+<a name="line-337"></a> <font color=Blue>-- debug (e++"[+")</font>+<a name="line-338"></a> <font color=Blue>-- n <- bracket (tok TokEndOpen) (tok TokAnyClose) name</font>+<a name="line-339"></a> <font color=Blue>-- debug "]"</font>+<a name="line-340"></a> <font color=Blue>-- if e == (map toLower n :: Name) </font>+<a name="line-341"></a> <font color=Blue>-- then return ([], Elem e avs []) </font>+<a name="line-342"></a> <font color=Blue>-- else return (error "no nesting in empty tag")) `onFail`</font>+<a name="line-343"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokAnyClose <font color=Blue>-- <tag> with no close (e.g. <IMG>)</font>+<a name="line-344"></a> debug <font color=Cyan>(</font>e<font color=Cyan>++</font><font color=Magenta>"[+]"</font><font color=Cyan>)</font>+<a name="line-345"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> Elem e avs []<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-346"></a> <font color=Green><u>else</u></font>+<a name="line-347"></a> <font color=Cyan>(</font><font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokEndClose+<a name="line-348"></a> debug <font color=Cyan>(</font>e<font color=Cyan>++</font><font color=Magenta>"[]"</font><font color=Cyan>)</font>+<a name="line-349"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> Elem e avs []<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-350"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokAnyClose <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing > or /> in element tag"</font>+<a name="line-351"></a> debug <font color=Cyan>(</font>e<font color=Cyan>++</font><font color=Magenta>"["</font><font color=Cyan>)</font>+<a name="line-352"></a> <font color=Blue>-- zz <- many (content e)</font>+<a name="line-353"></a> <font color=Blue>-- n <- bracket (tok TokEndOpen) (tok TokAnyClose) name</font>+<a name="line-354"></a> zz <font color=Red><-</font> manyFinally <font color=Cyan>(</font>content e<font color=Cyan>)</font>+<a name="line-355"></a> <font color=Cyan>(</font>tok TokEndOpen<font color=Cyan>)</font>+<a name="line-356"></a> n <font color=Red><-</font> name+<a name="line-357"></a> commit <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font>+<a name="line-358"></a> debug <font color=Magenta>"]"</font>+<a name="line-359"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>ss<font color=Cyan>,</font>cs<font color=Cyan>)</font> <font color=Red>=</font> unzip zz+<a name="line-360"></a> <font color=Green><u>let</u></font> s <font color=Red>=</font> <font color=Green><u>if</u></font> null ss <font color=Green><u>then</u></font> [] <font color=Green><u>else</u></font> last ss+<a name="line-361"></a> <font color=Cyan>(</font> <font color=Green><u>if</u></font> e <font color=Cyan>==</font> <font color=Cyan>(</font>map toLower n <font color=Red>::</font> Name<font color=Cyan>)</font> <font color=Green><u>then</u></font>+<a name="line-362"></a> <font color=Green><u>do</u></font> unparse <font color=Cyan>(</font>reformatTags <font color=Cyan>(</font>closeInner e s<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-363"></a> debug <font color=Magenta>"^"</font>+<a name="line-364"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> Elem e avs cs<font color=Cyan>)</font>+<a name="line-365"></a> <font color=Green><u>else</u></font>+<a name="line-366"></a> <font color=Green><u>do</u></font> unparse <font color=Red>[</font>TokEndOpen<font color=Cyan>,</font> TokName n<font color=Cyan>,</font> TokAnyClose<font color=Red>]</font>+<a name="line-367"></a> debug <font color=Magenta>"-"</font>+<a name="line-368"></a> return <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>(</font>e<font color=Cyan>,</font>avs<font color=Cyan>)</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font><font color=Cyan>,</font> Elem e avs cs<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-369"></a> <font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failP <font color=Cyan>(</font><font color=Magenta>"failed to repair non-matching tags in context: "</font><font color=Cyan>++</font>ctx<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-370"></a>+<a name="line-371"></a><a name="closeInner"></a><font color=Blue>closeInner</font> <font color=Red>::</font> Name <font color=Red>-></font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>Attribute<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>Attribute<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font>+<a name="line-372"></a><font color=Blue>closeInner</font> c ts <font color=Red>=</font>+<a name="line-373"></a> <font color=Green><u>case</u></font> lookup c closeInnerTags <font color=Green><u>of</u></font>+<a name="line-374"></a> <font color=Cyan>(</font>Just these<font color=Cyan>)</font> <font color=Red>-></font> filter <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>`notElem`</font> these<font color=Cyan>)</font><font color=Cyan>.</font>fst<font color=Cyan>)</font> ts+<a name="line-375"></a> Nothing <font color=Red>-></font> ts+<a name="line-376"></a>+<a name="line-377"></a><a name="unparse"></a><font color=Blue>unparse</font> ts <font color=Red>=</font> <font color=Green><u>do</u></font> p <font color=Red><-</font> posn+<a name="line-378"></a> reparse <font color=Cyan>(</font>zip <font color=Cyan>(</font>repeat p<font color=Cyan>)</font> ts<font color=Cyan>)</font>+<a name="line-379"></a>+<a name="line-380"></a><a name="reformatAttrs"></a><font color=Blue>reformatAttrs</font> avs <font color=Red>=</font> concatMap f0 avs+<a name="line-381"></a> <font color=Green><u>where</u></font> f0 <font color=Cyan>(</font>a<font color=Cyan>,</font> v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>TokName a<font color=Cyan>,</font> TokEqual<font color=Cyan>,</font> TokQuote<font color=Cyan>,</font>+<a name="line-382"></a> TokFreeText <font color=Cyan>(</font>show v<font color=Cyan>)</font><font color=Cyan>,</font> TokQuote<font color=Red>]</font>+<a name="line-383"></a><a name="reformatTags"></a><font color=Blue>reformatTags</font> ts <font color=Red>=</font> concatMap f0 ts+<a name="line-384"></a> <font color=Green><u>where</u></font> f0 <font color=Cyan>(</font>t<font color=Cyan>,</font>avs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>TokAnyOpen<font color=Cyan>,</font> TokName t<font color=Red>]</font><font color=Cyan>++</font>reformatAttrs avs<font color=Cyan>++</font><font color=Red>[</font>TokAnyClose<font color=Red>]</font>+<a name="line-385"></a>+<a name="line-386"></a><a name="content"></a><font color=Blue>content</font> <font color=Red>::</font> Name <font color=Red>-></font> HParser <font color=Cyan>(</font>Stack<font color=Cyan>,</font>Content Posn<font color=Cyan>)</font>+<a name="line-387"></a><font color=Blue>content</font> ctx <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn <font color=Cyan>;</font> content' p ctx <font color=Cyan>}</font>+<a name="line-388"></a> <font color=Green><u>where</u></font> content' p ctx <font color=Red>=</font> oneOf'+<a name="line-389"></a> <font color=Red>[</font> <font color=Cyan>(</font> <font color=Magenta>"element"</font><font color=Cyan>,</font> element ctx <font color=Cyan>>>=</font> <font color=Red>\</font><font color=Cyan>(</font>s<font color=Cyan>,</font>e<font color=Cyan>)</font><font color=Red>-></font> return <font color=Cyan>(</font>s<font color=Cyan>,</font> CElem e p<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-390"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"chardata"</font><font color=Cyan>,</font> chardata <font color=Cyan>>>=</font> <font color=Red>\</font>s<font color=Red>-></font> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> CString False s p<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-391"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"reference"</font><font color=Cyan>,</font> reference <font color=Cyan>>>=</font> <font color=Red>\</font>r<font color=Red>-></font> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> CRef r p<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-392"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"cdsect"</font><font color=Cyan>,</font> cdsect <font color=Cyan>>>=</font> <font color=Red>\</font>c<font color=Red>-></font> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> CString True c p<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-393"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"misc"</font><font color=Cyan>,</font> misc <font color=Cyan>>>=</font> <font color=Red>\</font>m<font color=Red>-></font> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> CMisc m p<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-394"></a> <font color=Red>]</font> <font color=Cyan>`adjustErrP`</font> <font color=Cyan>(</font><font color=Magenta>"when looking for a content item,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-395"></a>+<a name="line-396"></a><a name="elemtag"></a><font color=Blue>----</font>+<a name="line-397"></a><font color=Blue>elemtag</font> <font color=Red>::</font> HParser ElemTag+<a name="line-398"></a><font color=Blue>elemtag</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-399"></a> n <font color=Red><-</font> name <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Magenta>"malformed element tag\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-400"></a> <font color=Green><u>as</u></font> <font color=Red><-</font> many attribute+<a name="line-401"></a> return <font color=Cyan>(</font>ElemTag <font color=Cyan>(</font>map toLower n<font color=Cyan>)</font> <font color=Green><u>as</u></font><font color=Cyan>)</font>+<a name="line-402"></a>+<a name="line-403"></a><a name="attribute"></a><font color=Blue>attribute</font> <font color=Red>::</font> HParser Attribute+<a name="line-404"></a><font color=Blue>attribute</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-405"></a> n <font color=Red><-</font> name+<a name="line-406"></a> v <font color=Red><-</font> <font color=Cyan>(</font><font color=Green><u>do</u></font> tok TokEqual+<a name="line-407"></a> attvalue<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-408"></a> <font color=Cyan>(</font>return <font color=Cyan>(</font>AttValue <font color=Red>[</font>Left <font color=Magenta>"TRUE"</font><font color=Red>]</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-409"></a> return <font color=Cyan>(</font>map toLower n<font color=Cyan>,</font>v<font color=Cyan>)</font>+<a name="line-410"></a>+<a name="line-411"></a><font color=Blue>--elementdecl :: HParser ElementDecl</font>+<a name="line-412"></a><font color=Blue>--elementdecl = do</font>+<a name="line-413"></a><font color=Blue>-- tok TokSpecialOpen</font>+<a name="line-414"></a><font color=Blue>-- tok (TokSpecial ELEMENTx)</font>+<a name="line-415"></a><font color=Blue>-- n <- name `onFail` failP "missing identifier in ELEMENT decl"</font>+<a name="line-416"></a><font color=Blue>-- c <- contentspec `onFail` failP "missing content spec in ELEMENT decl"</font>+<a name="line-417"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "expected > terminating ELEMENT decl"</font>+<a name="line-418"></a><font color=Blue>-- return (ElementDecl n c)</font>+<a name="line-419"></a><font color=Blue>--</font>+<a name="line-420"></a><font color=Blue>--contentspec :: HParser ContentSpec</font>+<a name="line-421"></a><font color=Blue>--contentspec =</font>+<a name="line-422"></a><font color=Blue>-- ( word "EMPTY" >> return EMPTY) `onFail`</font>+<a name="line-423"></a><font color=Blue>-- ( word "ANY" >> return ANY) `onFail`</font>+<a name="line-424"></a><font color=Blue>-- ( mixed >>= return . Mixed) `onFail`</font>+<a name="line-425"></a><font color=Blue>-- ( cp >>= return . ContentSpec) `onFail`</font>+<a name="line-426"></a><font color=Blue>-- PEREF(ContentPE,contentspec)</font>+<a name="line-427"></a><font color=Blue>--</font>+<a name="line-428"></a><font color=Blue>--choice :: HParser [CP]</font>+<a name="line-429"></a><font color=Blue>--choice = do</font>+<a name="line-430"></a><font color=Blue>-- bracket (tok TokBraOpen) (tok TokBraClose)</font>+<a name="line-431"></a><font color=Blue>-- (cp `sepby1` (tok TokPipe))</font>+<a name="line-432"></a><font color=Blue>--</font>+<a name="line-433"></a><font color=Blue>--sequence :: HParser [CP]</font>+<a name="line-434"></a><font color=Blue>--sequence = do</font>+<a name="line-435"></a><font color=Blue>-- bracket (tok TokBraOpen) (tok TokBraClose)</font>+<a name="line-436"></a><font color=Blue>-- (cp `sepby1` (tok TokComma))</font>+<a name="line-437"></a><font color=Blue>--</font>+<a name="line-438"></a><font color=Blue>--cp :: HParser CP</font>+<a name="line-439"></a><font color=Blue>--cp =</font>+<a name="line-440"></a><font color=Blue>-- ( do n <- name</font>+<a name="line-441"></a><font color=Blue>-- m <- modifier</font>+<a name="line-442"></a><font color=Blue>-- return (TagName n m)) `onFail`</font>+<a name="line-443"></a><font color=Blue>-- ( do ss <- sequence</font>+<a name="line-444"></a><font color=Blue>-- m <- modifier</font>+<a name="line-445"></a><font color=Blue>-- return (Seq ss m)) `onFail`</font>+<a name="line-446"></a><font color=Blue>-- ( do cs <- choice</font>+<a name="line-447"></a><font color=Blue>-- m <- modifier</font>+<a name="line-448"></a><font color=Blue>-- return (Choice cs m)) `onFail`</font>+<a name="line-449"></a><font color=Blue>-- PEREF(CPPE,cp)</font>+<a name="line-450"></a><font color=Blue>--</font>+<a name="line-451"></a><font color=Blue>--modifier :: HParser Modifier</font>+<a name="line-452"></a><font color=Blue>--modifier =</font>+<a name="line-453"></a><font color=Blue>-- ( tok TokStar >> return Star) `onFail`</font>+<a name="line-454"></a><font color=Blue>-- ( tok TokQuery >> return Query) `onFail`</font>+<a name="line-455"></a><font color=Blue>-- ( tok TokPlus >> return Plus) `onFail`</font>+<a name="line-456"></a><font color=Blue>-- ( return None)</font>+<a name="line-457"></a><font color=Blue>--</font>+<a name="line-458"></a><font color=Blue>--mixed :: HParser Mixed</font>+<a name="line-459"></a><font color=Blue>--mixed = do</font>+<a name="line-460"></a><font color=Blue>-- tok TokBraOpen</font>+<a name="line-461"></a><font color=Blue>-- tok TokHash</font>+<a name="line-462"></a><font color=Blue>-- word "PCDATA"</font>+<a name="line-463"></a><font color=Blue>-- cont</font>+<a name="line-464"></a><font color=Blue>-- where</font>+<a name="line-465"></a><font color=Blue>-- cont = ( tok TokBraClose >> return PCDATA) `onFail`</font>+<a name="line-466"></a><font color=Blue>-- ( do cs <- many ( do tok TokPipe</font>+<a name="line-467"></a><font color=Blue>-- n <- name</font>+<a name="line-468"></a><font color=Blue>-- return n)</font>+<a name="line-469"></a><font color=Blue>-- tok TokBraClose</font>+<a name="line-470"></a><font color=Blue>-- tok TokStar</font>+<a name="line-471"></a><font color=Blue>-- return (PCDATAplus cs))</font>+<a name="line-472"></a><font color=Blue>--</font>+<a name="line-473"></a><font color=Blue>--attlistdecl :: HParser AttListDecl</font>+<a name="line-474"></a><font color=Blue>--attlistdecl = do</font>+<a name="line-475"></a><font color=Blue>-- tok TokSpecialOpen</font>+<a name="line-476"></a><font color=Blue>-- tok (TokSpecial ATTLISTx)</font>+<a name="line-477"></a><font color=Blue>-- n <- name `onFail` failP "missing identifier in ATTLIST"</font>+<a name="line-478"></a><font color=Blue>-- ds <- many attdef</font>+<a name="line-479"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "missing > terminating ATTLIST"</font>+<a name="line-480"></a><font color=Blue>-- return (AttListDecl n ds)</font>+<a name="line-481"></a><font color=Blue>--</font>+<a name="line-482"></a><font color=Blue>--attdef :: HParser AttDef</font>+<a name="line-483"></a><font color=Blue>--attdef = do</font>+<a name="line-484"></a><font color=Blue>-- n <- name</font>+<a name="line-485"></a><font color=Blue>-- t <- atttype `onFail` failP "missing attribute type in attlist defn"</font>+<a name="line-486"></a><font color=Blue>-- d <- defaultdecl</font>+<a name="line-487"></a><font color=Blue>-- return (AttDef n t d)</font>+<a name="line-488"></a><font color=Blue>--</font>+<a name="line-489"></a><font color=Blue>--atttype :: HParser AttType</font>+<a name="line-490"></a><font color=Blue>--atttype =</font>+<a name="line-491"></a><font color=Blue>-- ( word "CDATA" >> return StringType) `onFail`</font>+<a name="line-492"></a><font color=Blue>-- ( tokenizedtype >>= return . TokenizedType) `onFail`</font>+<a name="line-493"></a><font color=Blue>-- ( enumeratedtype >>= return . EnumeratedType)</font>+<a name="line-494"></a><font color=Blue>--</font>+<a name="line-495"></a><font color=Blue>--tokenizedtype :: HParser TokenizedType</font>+<a name="line-496"></a><font color=Blue>--tokenizedtype =</font>+<a name="line-497"></a><font color=Blue>-- ( word "ID" >> return ID) `onFail`</font>+<a name="line-498"></a><font color=Blue>-- ( word "IDREF" >> return IDREF) `onFail`</font>+<a name="line-499"></a><font color=Blue>-- ( word "IDREFS" >> return IDREFS) `onFail`</font>+<a name="line-500"></a><font color=Blue>-- ( word "ENTITY" >> return ENTITY) `onFail`</font>+<a name="line-501"></a><font color=Blue>-- ( word "ENTITIES" >> return ENTITIES) `onFail`</font>+<a name="line-502"></a><font color=Blue>-- ( word "NMTOKEN" >> return NMTOKEN) `onFail`</font>+<a name="line-503"></a><font color=Blue>-- ( word "NMTOKENS" >> return NMTOKENS)</font>+<a name="line-504"></a><font color=Blue>--</font>+<a name="line-505"></a><font color=Blue>--enumeratedtype :: HParser EnumeratedType</font>+<a name="line-506"></a><font color=Blue>--enumeratedtype =</font>+<a name="line-507"></a><font color=Blue>-- ( notationtype >>= return . NotationType) `onFail`</font>+<a name="line-508"></a><font color=Blue>-- ( enumeration >>= return . Enumeration)</font>+<a name="line-509"></a><font color=Blue>--</font>+<a name="line-510"></a><font color=Blue>--notationtype :: HParser NotationType</font>+<a name="line-511"></a><font color=Blue>--notationtype = do</font>+<a name="line-512"></a><font color=Blue>-- word "NOTATION"</font>+<a name="line-513"></a><font color=Blue>-- bracket (tok TokBraOpen) (tok TokBraClose)</font>+<a name="line-514"></a><font color=Blue>-- (name `sepby1` (tok TokPipe))</font>+<a name="line-515"></a><font color=Blue>--</font>+<a name="line-516"></a><font color=Blue>--enumeration :: HParser Enumeration</font>+<a name="line-517"></a><font color=Blue>--enumeration =</font>+<a name="line-518"></a><font color=Blue>-- bracket (tok TokBraOpen) (tok TokBraClose)</font>+<a name="line-519"></a><font color=Blue>-- (nmtoken `sepby1` (tok TokPipe))</font>+<a name="line-520"></a><font color=Blue>--</font>+<a name="line-521"></a><font color=Blue>--defaultdecl :: HParser DefaultDecl</font>+<a name="line-522"></a><font color=Blue>--defaultdecl =</font>+<a name="line-523"></a><font color=Blue>-- ( tok TokHash >> word "REQUIRED" >> return REQUIRED) `onFail`</font>+<a name="line-524"></a><font color=Blue>-- ( tok TokHash >> word "IMPLIED" >> return IMPLIED) `onFail`</font>+<a name="line-525"></a><font color=Blue>-- ( do f <- maybe (tok TokHash >> word "FIXED" >> return FIXED)</font>+<a name="line-526"></a><font color=Blue>-- a <- attvalue</font>+<a name="line-527"></a><font color=Blue>-- return (DefaultTo a f))</font>+<a name="line-528"></a><font color=Blue>--</font>+<a name="line-529"></a><font color=Blue>--conditionalsect :: HParser ConditionalSect</font>+<a name="line-530"></a><font color=Blue>--conditionalsect =</font>+<a name="line-531"></a><font color=Blue>-- ( do tok TokSectionOpen</font>+<a name="line-532"></a><font color=Blue>-- tok (TokSection INCLUDEx)</font>+<a name="line-533"></a><font color=Blue>-- tok TokSqOpen `onFail` failP "missing [ after INCLUDE"</font>+<a name="line-534"></a><font color=Blue>-- i <- extsubsetdecl `onFail` failP "missing ExtSubsetDecl in INCLUDE"</font>+<a name="line-535"></a><font color=Blue>-- tok TokSectionClose `onFail` failP "missing ] after INCLUDE"</font>+<a name="line-536"></a><font color=Blue>-- return (IncludeSect i)) `onFail`</font>+<a name="line-537"></a><font color=Blue>-- ( do tok TokSectionOpen</font>+<a name="line-538"></a><font color=Blue>-- tok (TokSection IGNOREx)</font>+<a name="line-539"></a><font color=Blue>-- tok TokSqOpen `onFail` failP "missing [ after IGNORE"</font>+<a name="line-540"></a><font color=Blue>-- i <- many ignoresectcontents</font>+<a name="line-541"></a><font color=Blue>-- tok TokSectionClose `onFail` failP "missing ] after IGNORE"</font>+<a name="line-542"></a><font color=Blue>-- return (IgnoreSect i))</font>+<a name="line-543"></a><font color=Blue>--</font>+<a name="line-544"></a><font color=Blue>--ignoresectcontents :: HParser IgnoreSectContents</font>+<a name="line-545"></a><font color=Blue>--ignoresectcontents = do</font>+<a name="line-546"></a><font color=Blue>-- i <- ignore</font>+<a name="line-547"></a><font color=Blue>-- is <- many (do tok TokSectionOpen</font>+<a name="line-548"></a><font color=Blue>-- ic <- ignoresectcontents</font>+<a name="line-549"></a><font color=Blue>-- tok TokSectionClose</font>+<a name="line-550"></a><font color=Blue>-- ig <- ignore</font>+<a name="line-551"></a><font color=Blue>-- return (ic,ig))</font>+<a name="line-552"></a><font color=Blue>-- return (IgnoreSectContents i is)</font>+<a name="line-553"></a><font color=Blue>--</font>+<a name="line-554"></a><font color=Blue>--ignore :: HParser Ignore</font>+<a name="line-555"></a><font color=Blue>--ignore = freetext >>= return . Ignore</font>+<a name="line-556"></a>+<a name="line-557"></a><a name="reference"></a><font color=Blue>reference</font> <font color=Red>::</font> HParser Reference+<a name="line-558"></a><font color=Blue>reference</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-559"></a> bracket <font color=Cyan>(</font>tok TokAmp<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSemi<font color=Cyan>)</font> <font color=Cyan>(</font>freetext <font color=Cyan>>>=</font> val<font color=Cyan>)</font>+<a name="line-560"></a> <font color=Green><u>where</u></font>+<a name="line-561"></a> val <font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font><font color=Magenta>'x'</font><font color=Red><b>:</b></font>i<font color=Cyan>)</font> <font color=Red>|</font> all isHexDigit i+<a name="line-562"></a> <font color=Red>=</font> return <font color=Cyan>.</font> RefChar <font color=Cyan>.</font> fst <font color=Cyan>.</font> head <font color=Cyan>.</font> readHex <font color=Cyan>$</font> i+<a name="line-563"></a> val <font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>i<font color=Cyan>)</font> <font color=Red>|</font> all isDigit i+<a name="line-564"></a> <font color=Red>=</font> return <font color=Cyan>.</font> RefChar <font color=Cyan>.</font> fst <font color=Cyan>.</font> head <font color=Cyan>.</font> readDec <font color=Cyan>$</font> i+<a name="line-565"></a> val name <font color=Red>=</font> return <font color=Cyan>.</font> RefEntity <font color=Cyan>$</font> name+<a name="line-566"></a>+<a name="line-567"></a><font color=Blue>{-+<a name="line-568"></a>reference :: HParser Reference+<a name="line-569"></a>reference =+<a name="line-570"></a> ( charref >>= return . RefChar) `onFail`+<a name="line-571"></a> ( entityref >>= return . RefEntity)+<a name="line-572"></a>+<a name="line-573"></a>entityref :: HParser EntityRef+<a name="line-574"></a>entityref = do+<a name="line-575"></a> n <- bracket (tok TokAmp) (tok TokSemi) name+<a name="line-576"></a> return n+<a name="line-577"></a>+<a name="line-578"></a>charref :: HParser CharRef+<a name="line-579"></a>charref = do+<a name="line-580"></a> bracket (tok TokAmp) (tok TokSemi) (freetext >>= readCharVal)+<a name="line-581"></a> where+<a name="line-582"></a> readCharVal ('#':'x':i) = return . fst . head . readHex $ i+<a name="line-583"></a> readCharVal ('#':i) = return . fst . head . readDec $ i+<a name="line-584"></a> readCharVal _ = mzero+<a name="line-585"></a>-}</font>+<a name="line-586"></a>+<a name="line-587"></a><font color=Blue>--pereference :: HParser PEReference</font>+<a name="line-588"></a><font color=Blue>--pereference = do</font>+<a name="line-589"></a><font color=Blue>-- bracket (tok TokPercent) (tok TokSemi) nmtoken</font>+<a name="line-590"></a><font color=Blue>--</font>+<a name="line-591"></a><font color=Blue>--entitydecl :: HParser EntityDecl</font>+<a name="line-592"></a><font color=Blue>--entitydecl =</font>+<a name="line-593"></a><font color=Blue>-- ( gedecl >>= return . EntityGEDecl) `onFail`</font>+<a name="line-594"></a><font color=Blue>-- ( pedecl >>= return . EntityPEDecl)</font>+<a name="line-595"></a><font color=Blue>--</font>+<a name="line-596"></a><font color=Blue>--gedecl :: HParser GEDecl</font>+<a name="line-597"></a><font color=Blue>--gedecl = do</font>+<a name="line-598"></a><font color=Blue>-- tok TokSpecialOpen</font>+<a name="line-599"></a><font color=Blue>-- tok (TokSpecial ENTITYx)</font>+<a name="line-600"></a><font color=Blue>-- n <- name</font>+<a name="line-601"></a><font color=Blue>-- e <- entitydef `onFail` failP "missing entity defn in G ENTITY decl"</font>+<a name="line-602"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "expected > terminating G ENTITY decl"</font>+<a name="line-603"></a><font color=Blue>-- return (GEDecl n e)</font>+<a name="line-604"></a><font color=Blue>--</font>+<a name="line-605"></a><font color=Blue>--pedecl :: HParser PEDecl</font>+<a name="line-606"></a><font color=Blue>--pedecl = do</font>+<a name="line-607"></a><font color=Blue>-- tok TokSpecialOpen</font>+<a name="line-608"></a><font color=Blue>-- tok (TokSpecial ENTITYx)</font>+<a name="line-609"></a><font color=Blue>-- tok TokPercent</font>+<a name="line-610"></a><font color=Blue>-- n <- name</font>+<a name="line-611"></a><font color=Blue>-- e <- pedef `onFail` failP "missing entity defn in P ENTITY decl"</font>+<a name="line-612"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "expected > terminating P ENTITY decl"</font>+<a name="line-613"></a><font color=Blue>-- return (PEDecl n e)</font>+<a name="line-614"></a><font color=Blue>--</font>+<a name="line-615"></a><font color=Blue>--entitydef :: HParser EntityDef</font>+<a name="line-616"></a><font color=Blue>--entitydef =</font>+<a name="line-617"></a><font color=Blue>-- ( entityvalue >>= return . DefEntityValue) `onFail`</font>+<a name="line-618"></a><font color=Blue>-- ( do eid <- externalid</font>+<a name="line-619"></a><font color=Blue>-- ndd <- maybe ndatadecl</font>+<a name="line-620"></a><font color=Blue>-- return (DefExternalID eid ndd))</font>+<a name="line-621"></a><font color=Blue>--</font>+<a name="line-622"></a><font color=Blue>--pedef :: HParser PEDef</font>+<a name="line-623"></a><font color=Blue>--pedef =</font>+<a name="line-624"></a><font color=Blue>-- ( entityvalue >>= return . PEDefEntityValue) `onFail`</font>+<a name="line-625"></a><font color=Blue>-- ( externalid >>= return . PEDefExternalID)</font>+<a name="line-626"></a>+<a name="line-627"></a><a name="externalid"></a><font color=Blue>externalid</font> <font color=Red>::</font> HParser ExternalID+<a name="line-628"></a><font color=Blue>externalid</font> <font color=Red>=</font>+<a name="line-629"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> word <font color=Magenta>"SYSTEM"</font>+<a name="line-630"></a> s <font color=Red><-</font> systemliteral+<a name="line-631"></a> return <font color=Cyan>(</font>SYSTEM s<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-632"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> word <font color=Magenta>"PUBLIC"</font>+<a name="line-633"></a> p <font color=Red><-</font> pubidliteral+<a name="line-634"></a> s <font color=Red><-</font> <font color=Cyan>(</font>systemliteral <font color=Cyan>`onFail`</font> return <font color=Cyan>(</font>SystemLiteral <font color=Magenta>""</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-635"></a> return <font color=Cyan>(</font>PUBLIC p s<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-636"></a>+<a name="line-637"></a><font color=Blue>--ndatadecl :: HParser NDataDecl</font>+<a name="line-638"></a><font color=Blue>--ndatadecl = do</font>+<a name="line-639"></a><font color=Blue>-- word "NDATA"</font>+<a name="line-640"></a><font color=Blue>-- n <- name</font>+<a name="line-641"></a><font color=Blue>-- return (NDATA n)</font>+<a name="line-642"></a>+<a name="line-643"></a><a name="textdecl"></a><font color=Blue>textdecl</font> <font color=Red>::</font> HParser TextDecl+<a name="line-644"></a><font color=Blue>textdecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-645"></a> tok TokPIOpen+<a name="line-646"></a> <font color=Cyan>(</font>word <font color=Magenta>"xml"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"XML"</font><font color=Cyan>)</font>+<a name="line-647"></a> v <font color=Red><-</font> maybe versioninfo+<a name="line-648"></a> e <font color=Red><-</font> encodingdecl+<a name="line-649"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failP <font color=Magenta>"expected ?> terminating text decl"</font>+<a name="line-650"></a> return <font color=Cyan>(</font>TextDecl v e<font color=Cyan>)</font>+<a name="line-651"></a>+<a name="line-652"></a><font color=Blue>--extparsedent :: HParser ExtParsedEnt</font>+<a name="line-653"></a><font color=Blue>--extparsedent = do</font>+<a name="line-654"></a><font color=Blue>-- t <- maybe textdecl</font>+<a name="line-655"></a><font color=Blue>-- (_,c) <- (content "")</font>+<a name="line-656"></a><font color=Blue>-- return (ExtParsedEnt t c)</font>+<a name="line-657"></a><font color=Blue>--</font>+<a name="line-658"></a><font color=Blue>--extpe :: HParser ExtPE</font>+<a name="line-659"></a><font color=Blue>--extpe = do</font>+<a name="line-660"></a><font color=Blue>-- t <- maybe textdecl</font>+<a name="line-661"></a><font color=Blue>-- e <- extsubsetdecl</font>+<a name="line-662"></a><font color=Blue>-- return (ExtPE t e)</font>+<a name="line-663"></a>+<a name="line-664"></a><a name="encodingdecl"></a><font color=Blue>encodingdecl</font> <font color=Red>::</font> HParser EncodingDecl+<a name="line-665"></a><font color=Blue>encodingdecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-666"></a> <font color=Cyan>(</font>word <font color=Magenta>"encoding"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"ENCODING"</font><font color=Cyan>)</font>+<a name="line-667"></a> tok TokEqual <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"expected = in 'encoding' decl"</font>+<a name="line-668"></a> f <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext+<a name="line-669"></a> return <font color=Cyan>(</font>EncodingDecl f<font color=Cyan>)</font>+<a name="line-670"></a>+<a name="line-671"></a><font color=Blue>--notationdecl :: HParser NotationDecl</font>+<a name="line-672"></a><font color=Blue>--notationdecl = do</font>+<a name="line-673"></a><font color=Blue>-- tok TokSpecialOpen</font>+<a name="line-674"></a><font color=Blue>-- word "NOTATION"</font>+<a name="line-675"></a><font color=Blue>-- n <- name</font>+<a name="line-676"></a><font color=Blue>-- e <- either externalid publicid</font>+<a name="line-677"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "expected > terminating NOTATION decl"</font>+<a name="line-678"></a><font color=Blue>-- return (NOTATION n e)</font>+<a name="line-679"></a>+<a name="line-680"></a><a name="publicid"></a><font color=Blue>publicid</font> <font color=Red>::</font> HParser PublicID+<a name="line-681"></a><font color=Blue>publicid</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-682"></a> word <font color=Magenta>"PUBLICID"</font>+<a name="line-683"></a> p <font color=Red><-</font> pubidliteral+<a name="line-684"></a> return <font color=Cyan>(</font>PUBLICID p<font color=Cyan>)</font>+<a name="line-685"></a>+<a name="line-686"></a><a name="entityvalue"></a><font color=Blue>entityvalue</font> <font color=Red>::</font> HParser EntityValue+<a name="line-687"></a><font color=Blue>entityvalue</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-688"></a> evs <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>many ev<font color=Cyan>)</font>+<a name="line-689"></a> return <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font>+<a name="line-690"></a>+<a name="line-691"></a><a name="ev"></a><font color=Blue>ev</font> <font color=Red>::</font> HParser EV+<a name="line-692"></a><font color=Blue>ev</font> <font color=Red>=</font>+<a name="line-693"></a> <font color=Cyan>(</font> freetext <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EVString<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-694"></a><font color=Blue>-- PEREF(EVPERef,ev) `onFail`</font>+<a name="line-695"></a> <font color=Cyan>(</font> reference <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EVRef<font color=Cyan>)</font>+<a name="line-696"></a>+<a name="line-697"></a><a name="attvalue"></a><font color=Blue>attvalue</font> <font color=Red>::</font> HParser AttValue+<a name="line-698"></a><font color=Blue>attvalue</font> <font color=Red>=</font>+<a name="line-699"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> avs <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font>+<a name="line-700"></a> <font color=Cyan>(</font>many <font color=Cyan>(</font>either freetext reference<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-701"></a> return <font color=Cyan>(</font>AttValue avs<font color=Cyan>)</font> <font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-702"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> v <font color=Red><-</font> nmtoken+<a name="line-703"></a> s <font color=Red><-</font> <font color=Cyan>(</font>tok TokPercent <font color=Cyan>>></font> return <font color=Magenta>"%"</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font> return <font color=Magenta>""</font>+<a name="line-704"></a> return <font color=Cyan>(</font>AttValue <font color=Red>[</font>Left <font color=Cyan>(</font>v<font color=Cyan>++</font>s<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font> <font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-705"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> s <font color=Red><-</font> oneOf <font color=Red>[</font> tok TokPlus <font color=Cyan>>></font> return <font color=Magenta>"+"</font>+<a name="line-706"></a> <font color=Cyan>,</font> tok TokHash <font color=Cyan>>></font> return <font color=Magenta>"#"</font>+<a name="line-707"></a> <font color=Red>]</font>+<a name="line-708"></a> v <font color=Red><-</font> nmtoken+<a name="line-709"></a> return <font color=Cyan>(</font>AttValue <font color=Red>[</font>Left <font color=Cyan>(</font>s<font color=Cyan>++</font>v<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font> <font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-710"></a> failP <font color=Magenta>"Badly formatted attribute value"</font>+<a name="line-711"></a>+<a name="line-712"></a><a name="systemliteral"></a><font color=Blue>systemliteral</font> <font color=Red>::</font> HParser SystemLiteral+<a name="line-713"></a><font color=Blue>systemliteral</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-714"></a> s <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext+<a name="line-715"></a> return <font color=Cyan>(</font>SystemLiteral s<font color=Cyan>)</font> <font color=Blue>-- note: need to fold &...; escapes</font>+<a name="line-716"></a>+<a name="line-717"></a><a name="pubidliteral"></a><font color=Blue>pubidliteral</font> <font color=Red>::</font> HParser PubidLiteral+<a name="line-718"></a><font color=Blue>pubidliteral</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-719"></a> s <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext+<a name="line-720"></a> return <font color=Cyan>(</font>PubidLiteral s<font color=Cyan>)</font> <font color=Blue>-- note: need to fold &...; escapes</font>+<a name="line-721"></a>+<a name="line-722"></a><a name="chardata"></a><font color=Blue>chardata</font> <font color=Red>::</font> HParser CharData+<a name="line-723"></a><font color=Blue>chardata</font> <font color=Red>=</font> freetext <font color=Blue>-- >>= return . CharData</font>+<a name="line-724"></a>+</pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/Html/ParseLazy.html view
@@ -1,732 +1,738 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>-- | This is a parser for HTML documents. Unlike for XML documents, it</font>-<a name="(line2)"></a><font color=Blue>-- must include a certain amount of error-correction to account for</font>-<a name="(line3)"></a><font color=Blue>-- HTML features like self-terminating tags, unterminated tags, and</font>-<a name="(line4)"></a><font color=Blue>-- incorrect nesting. The input is tokenised by the</font>-<a name="(line5)"></a><font color=Blue>-- XML lexer (a separate lexer is not required for HTML).</font>-<a name="(line6)"></a>-<a name="(line7)"></a><font color=Blue>-- It uses a slightly extended version of the Hutton/Meijer parser</font>-<a name="(line8)"></a><font color=Blue>-- combinators.</font>-<a name="(line9)"></a>-<a name="(line10)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Html<font color=Cyan>.</font>ParseLazy-<a name="(line11)"></a> <font color=Cyan>(</font> htmlParse-<a name="(line12)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line13)"></a>-<a name="(line14)"></a><font color=Green><u>import</u></font> Prelude hiding <font color=Cyan>(</font>either<font color=Cyan>,</font>maybe<font color=Cyan>,</font>sequence<font color=Cyan>)</font>-<a name="(line15)"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Prelude <font color=Cyan>(</font>either<font color=Cyan>)</font>-<a name="(line16)"></a><font color=Green><u>import</u></font> Maybe hiding <font color=Cyan>(</font>maybe<font color=Cyan>)</font>-<a name="(line17)"></a><font color=Green><u>import</u></font> Char <font color=Cyan>(</font>toLower<font color=Cyan>,</font> isSpace<font color=Cyan>,</font> isDigit<font color=Cyan>,</font> isHexDigit<font color=Cyan>)</font>-<a name="(line18)"></a><font color=Green><u>import</u></font> Numeric <font color=Cyan>(</font>readDec<font color=Cyan>,</font>readHex<font color=Cyan>)</font>-<a name="(line19)"></a><font color=Green><u>import</u></font> Monad-<a name="(line20)"></a>-<a name="(line21)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line22)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Lex-<a name="(line23)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Posn-<a name="(line24)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>Poly<font color=Cyan>.</font>NoLeak<font color=Cyan>.</font>Lazy-<a name="(line25)"></a>-<a name="(line26)"></a><font color=Blue>-- #define DEBUG</font>-<a name="(line27)"></a> -<a name="(line28)"></a><font color=Magenta><em>#if defined(DEBUG)</em></font>-<a name="(line29)"></a><font color=Magenta><em># if ( defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 502 ) || \</em></font>-<a name="(line30)"></a> <font color=Cyan>(</font> defined<font color=Cyan>(</font><b><font color=Magenta>__NHC__</font></b><font color=Cyan>)</font> <font color=Cyan>&&</font> <b><font color=Magenta>__NHC__</font></b> <font color=Cyan>></font> <font color=Magenta>114</font> <font color=Cyan>)</font> <font color=Cyan>||</font> defined<font color=Cyan>(</font><b><font color=Magenta>__HUGS__</font></b><font color=Cyan>)</font>-<a name="(line31)"></a><font color=Green><u>import</u></font> Debug<font color=Cyan>.</font>Trace<font color=Cyan>(</font>trace<font color=Cyan>)</font>-<a name="(line32)"></a><font color=Magenta><em># elif defined(__GLASGOW_HASKELL__)</em></font>-<a name="(line33)"></a><font color=Green><u>import</u></font> IOExts<font color=Cyan>(</font>trace<font color=Cyan>)</font>-<a name="(line34)"></a><font color=Magenta><em># elif defined(__NHC__) || defined(__HBC__)</em></font>-<a name="(line35)"></a><font color=Green><u>import</u></font> NonStdTrace-<a name="(line36)"></a><font color=Magenta><em># endif</em></font>-<a name="(line37)"></a><a name="debug"></a>debug <font color=Red>::</font> Monad m <font color=Red>=></font> String <font color=Red>-></font> m ()-<a name="(line38)"></a>debug s <font color=Red>=</font> trace s <font color=Cyan>(</font>return ()<font color=Cyan>)</font>-<a name="(line39)"></a><font color=Magenta><em>#else</em></font>-<a name="(line40)"></a>debug <font color=Red>::</font> Monad m <font color=Red>=></font> String <font color=Red>-></font> m ()-<a name="(line41)"></a>debug s <font color=Red>=</font> return ()-<a name="(line42)"></a><font color=Magenta><em>#endif</em></font>-<a name="(line43)"></a>-<a name="(line44)"></a>-<a name="(line45)"></a><a name="htmlParse"></a><font color=Blue>-- | The first argument is the name of the file, the second is the string</font>-<a name="(line46)"></a><font color=Blue>-- contents of the file. The result is the generic representation of</font>-<a name="(line47)"></a><font color=Blue>-- an XML document. Any errors cause program failure with message to stderr.</font>-<a name="(line48)"></a>htmlParse <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Document Posn-<a name="(line49)"></a>htmlParse name <font color=Red>=</font> <font color=Blue>{-simplify .-}</font> fst <font color=Cyan>.</font> runParser document <font color=Cyan>.</font> xmlLex name-<a name="(line50)"></a>-<a name="(line51)"></a><font color=Blue>{--<a name="(line52)"></a>-- | The first argument is the name of the file, the second is the string-<a name="(line53)"></a>-- contents of the file. The result is the generic representation of-<a name="(line54)"></a>-- an XML document. Any parsing errors are returned in the @Either@ type.-<a name="(line55)"></a>htmlParse' :: String -> String -> Either String (Document Posn)-<a name="(line56)"></a>htmlParse' name = Prelude.either Left (Right . simplify) . fst-<a name="(line57)"></a> . runParser document . xmlLex name-<a name="(line58)"></a>-}</font>-<a name="(line59)"></a>-<a name="(line60)"></a><font color=Blue>---- Document simplification ----</font>-<a name="(line61)"></a>-<a name="(line62)"></a><a name="simplify"></a>simplify <font color=Red>::</font> Document i <font color=Red>-></font> Document i-<a name="(line63)"></a>simplify <font color=Cyan>(</font>Document p st <font color=Cyan>(</font>Elem n avs cs<font color=Cyan>)</font> ms<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line64)"></a> Document p st <font color=Cyan>(</font>Elem n avs <font color=Cyan>(</font>deepfilter simp cs<font color=Cyan>)</font><font color=Cyan>)</font> ms-<a name="(line65)"></a> <font color=Green><u>where</u></font>-<a name="(line66)"></a> simp <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"null"</font> [] []<font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> False-<a name="(line67)"></a> simp <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem n <font color=Green><u>_</u></font> []<font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>|</font> n <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"font"</font><font color=Cyan>,</font><font color=Magenta>"p"</font><font color=Cyan>,</font><font color=Magenta>"i"</font><font color=Cyan>,</font><font color=Magenta>"b"</font><font color=Cyan>,</font><font color=Magenta>"em"</font>-<a name="(line68)"></a> <font color=Cyan>,</font><font color=Magenta>"tt"</font><font color=Cyan>,</font><font color=Magenta>"big"</font><font color=Cyan>,</font><font color=Magenta>"small"</font><font color=Red>]</font> <font color=Red>=</font> False-<a name="(line69)"></a> <font color=Blue>-- simp (CString False s _) | all isSpace s = False</font>-<a name="(line70)"></a> simp <font color=Green><u>_</u></font> <font color=Red>=</font> True-<a name="(line71)"></a> deepfilter p <font color=Red>=</font>-<a name="(line72)"></a> filter p <font color=Cyan>.</font> map <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font> <font color=Green><u>case</u></font> c <font color=Green><u>of</u></font>-<a name="(line73)"></a> CElem <font color=Cyan>(</font>Elem n avs cs<font color=Cyan>)</font> i-<a name="(line74)"></a> <font color=Red>-></font> CElem <font color=Cyan>(</font>Elem n avs <font color=Cyan>(</font>deepfilter p cs<font color=Cyan>)</font><font color=Cyan>)</font> i-<a name="(line75)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> c<font color=Cyan>)</font>-<a name="(line76)"></a>-<a name="(line77)"></a><a name="selfclosingtags"></a><font color=Blue>-- opening any of these, they close again immediately</font>-<a name="(line78)"></a>selfclosingtags <font color=Red>=</font> <font color=Red>[</font><font color=Magenta>"img"</font><font color=Cyan>,</font><font color=Magenta>"hr"</font><font color=Cyan>,</font><font color=Magenta>"br"</font><font color=Cyan>,</font><font color=Magenta>"meta"</font><font color=Cyan>,</font><font color=Magenta>"col"</font><font color=Cyan>,</font><font color=Magenta>"link"</font><font color=Cyan>,</font><font color=Magenta>"base"</font>-<a name="(line79)"></a> <font color=Cyan>,</font><font color=Magenta>"param"</font><font color=Cyan>,</font><font color=Magenta>"area"</font><font color=Cyan>,</font><font color=Magenta>"frame"</font><font color=Cyan>,</font><font color=Magenta>"input"</font><font color=Red>]</font>-<a name="(line80)"></a>-<a name="(line81)"></a><a name="closeInnerTags"></a><font color=Blue>--closing this, implicitly closes any of those which are contained in it</font>-<a name="(line82)"></a>closeInnerTags <font color=Red>=</font>-<a name="(line83)"></a> <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"ul"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"li"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line84)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"ol"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"li"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line85)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"dl"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"dt"</font><font color=Cyan>,</font><font color=Magenta>"dd"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line86)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"tr"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line87)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"div"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line88)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"thead"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line89)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"tfoot"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line90)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"tbody"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line91)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"table"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Cyan>,</font><font color=Magenta>"thead"</font><font color=Cyan>,</font><font color=Magenta>"tfoot"</font><font color=Cyan>,</font><font color=Magenta>"tbody"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line92)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"caption"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line93)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"th"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line94)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"td"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line95)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"li"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line96)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"dt"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line97)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"dd"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line98)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"object"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line99)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"map"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line100)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"body"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line101)"></a> <font color=Red>]</font>-<a name="(line102)"></a>-<a name="(line103)"></a><a name="closes"></a><font color=Blue>--opening this, implicitly closes that</font>-<a name="(line104)"></a>closes <font color=Red>::</font> Name <font color=Red>-></font> Name <font color=Red>-></font> Bool-<a name="(line105)"></a><font color=Magenta>"a"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"a"</font> <font color=Red>=</font> True-<a name="(line106)"></a><font color=Magenta>"li"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"li"</font> <font color=Red>=</font> True-<a name="(line107)"></a><font color=Magenta>"th"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font> <font color=Red>=</font> True-<a name="(line108)"></a><font color=Magenta>"td"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font> <font color=Red>=</font> True-<a name="(line109)"></a><font color=Magenta>"tr"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Red>]</font> <font color=Red>=</font> True-<a name="(line110)"></a><font color=Magenta>"dt"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"dt"</font><font color=Cyan>,</font><font color=Magenta>"dd"</font><font color=Red>]</font> <font color=Red>=</font> True-<a name="(line111)"></a><font color=Magenta>"dd"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"dt"</font><font color=Cyan>,</font><font color=Magenta>"dd"</font><font color=Red>]</font> <font color=Red>=</font> True-<a name="(line112)"></a><font color=Magenta>"form"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"form"</font> <font color=Red>=</font> True-<a name="(line113)"></a><font color=Magenta>"label"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"label"</font> <font color=Red>=</font> True-<a name="(line114)"></a><font color=Green><u>_</u></font> <font color=Cyan>`closes`</font> <font color=Magenta>"option"</font> <font color=Red>=</font> True-<a name="(line115)"></a><font color=Magenta>"thead"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"colgroup"</font><font color=Red>]</font> <font color=Red>=</font> True-<a name="(line116)"></a><font color=Magenta>"tfoot"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"thead"</font><font color=Cyan>,</font><font color=Magenta>"colgroup"</font><font color=Red>]</font> <font color=Red>=</font> True-<a name="(line117)"></a><font color=Magenta>"tbody"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"tbody"</font><font color=Cyan>,</font><font color=Magenta>"tfoot"</font><font color=Cyan>,</font><font color=Magenta>"thead"</font><font color=Cyan>,</font><font color=Magenta>"colgroup"</font><font color=Red>]</font> <font color=Red>=</font> True-<a name="(line118)"></a><font color=Magenta>"colgroup"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"colgroup"</font> <font color=Red>=</font> True-<a name="(line119)"></a><a name="closes"></a>t <font color=Cyan>`closes`</font> <font color=Magenta>"p"</font>-<a name="(line120)"></a> <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Cyan>,</font><font color=Magenta>"h1"</font><font color=Cyan>,</font><font color=Magenta>"h2"</font><font color=Cyan>,</font><font color=Magenta>"h3"</font><font color=Cyan>,</font><font color=Magenta>"h4"</font><font color=Cyan>,</font><font color=Magenta>"h5"</font><font color=Cyan>,</font><font color=Magenta>"h6"</font>-<a name="(line121)"></a> <font color=Cyan>,</font><font color=Magenta>"hr"</font><font color=Cyan>,</font><font color=Magenta>"div"</font><font color=Cyan>,</font><font color=Magenta>"ul"</font><font color=Cyan>,</font><font color=Magenta>"dl"</font><font color=Cyan>,</font><font color=Magenta>"ol"</font><font color=Cyan>,</font><font color=Magenta>"table"</font><font color=Red>]</font> <font color=Red>=</font> True-<a name="(line122)"></a><font color=Green><u>_</u></font> <font color=Cyan>`closes`</font> <font color=Green><u>_</u></font> <font color=Red>=</font> False-<a name="(line123)"></a>-<a name="(line124)"></a>-<a name="(line125)"></a>-<a name="(line126)"></a><font color=Blue>---- Misc ----</font>-<a name="(line127)"></a>-<a name="(line128)"></a><a name="fst3"></a>fst3 <font color=Cyan>(</font>a<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> a-<a name="(line129)"></a><a name="snd3"></a>snd3 <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font>a<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> a-<a name="(line130)"></a><a name="thd3"></a>thd3 <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font>a<font color=Cyan>)</font> <font color=Red>=</font> a-<a name="(line131)"></a>-<a name="(line132)"></a>-<a name="(line133)"></a>-<a name="(line134)"></a><font color=Blue>---- Auxiliary Parsing Functions ----</font>-<a name="(line135)"></a>-<a name="(line136)"></a><a name="HParser"></a><font color=Green><u>type</u></font> HParser a <font color=Red>=</font> Parser <font color=Cyan>(</font>Posn<font color=Cyan>,</font>TokenT<font color=Cyan>)</font> a-<a name="(line137)"></a>-<a name="(line138)"></a><a name="tok"></a>tok <font color=Red>::</font> TokenT <font color=Red>-></font> HParser TokenT-<a name="(line139)"></a>tok t <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t'<font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line140)"></a> <font color=Green><u>case</u></font> t' <font color=Green><u>of</u></font> TokError s <font color=Red>-></font> report failBad <font color=Cyan>(</font>show t<font color=Cyan>)</font> p t'-<a name="(line141)"></a> <font color=Green><u>_</u></font> <font color=Red>|</font> t'<font color=Cyan>==</font>t <font color=Red>-></font> return t-<a name="(line142)"></a> <font color=Red>|</font> otherwise <font color=Red>-></font> report fail <font color=Cyan>(</font>show t<font color=Cyan>)</font> p t'-<a name="(line143)"></a>-<a name="(line144)"></a><a name="name"></a>name <font color=Red>::</font> HParser Name-<a name="(line145)"></a><font color=Blue>--name = do {(p,TokName s) <- next; return s}</font>-<a name="(line146)"></a>name <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>tok<font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line147)"></a> <font color=Green><u>case</u></font> tok <font color=Green><u>of</u></font> -<a name="(line148)"></a> TokName s <font color=Red>-></font> return s -<a name="(line149)"></a> TokError s <font color=Red>-></font> report failBad <font color=Magenta>"a name"</font> p tok-<a name="(line150)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"a name"</font> p tok-<a name="(line151)"></a>-<a name="(line152)"></a><a name="string"></a>string<font color=Cyan>,</font> freetext <font color=Red>::</font> HParser String-<a name="(line153)"></a>string <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line154)"></a> <font color=Green><u>case</u></font> t <font color=Green><u>of</u></font> TokName s <font color=Red>-></font> return s-<a name="(line155)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"text"</font> p t-<a name="(line156)"></a><a name="freetext"></a>freetext <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line157)"></a> <font color=Green><u>case</u></font> t <font color=Green><u>of</u></font> TokFreeText s <font color=Red>-></font> return s-<a name="(line158)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"text"</font> p t-<a name="(line159)"></a>-<a name="(line160)"></a><a name="maybe"></a>maybe <font color=Red>::</font> HParser a <font color=Red>-></font> HParser <font color=Cyan>(</font>Maybe a<font color=Cyan>)</font>-<a name="(line161)"></a>maybe p <font color=Red>=</font>-<a name="(line162)"></a> <font color=Cyan>(</font> p <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Just<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line163)"></a> <font color=Cyan>(</font> return Nothing<font color=Cyan>)</font>-<a name="(line164)"></a>-<a name="(line165)"></a><a name="either"></a>either <font color=Red>::</font> HParser a <font color=Red>-></font> HParser b <font color=Red>-></font> HParser <font color=Cyan>(</font>Either a b<font color=Cyan>)</font>-<a name="(line166)"></a>either p q <font color=Red>=</font>-<a name="(line167)"></a> <font color=Cyan>(</font> p <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Left<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line168)"></a> <font color=Cyan>(</font> q <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Right<font color=Cyan>)</font>-<a name="(line169)"></a>-<a name="(line170)"></a><a name="word"></a>word <font color=Red>::</font> String <font color=Red>-></font> HParser ()-<a name="(line171)"></a>word s <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> x <font color=Red><-</font> next-<a name="(line172)"></a> <font color=Cyan>;</font> <font color=Green><u>case</u></font> x <font color=Green><u>of</u></font>-<a name="(line173)"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>TokName n<font color=Cyan>)</font> <font color=Red>|</font> s<font color=Cyan>==</font>n <font color=Red>-></font> return ()-<a name="(line174)"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>TokFreeText n<font color=Cyan>)</font> <font color=Red>|</font> s<font color=Cyan>==</font>n <font color=Red>-></font> return ()-<a name="(line175)"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Red>@</font><font color=Cyan>(</font>TokError <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> report failBad <font color=Cyan>(</font>show s<font color=Cyan>)</font> p t-<a name="(line176)"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red>-></font> report fail <font color=Cyan>(</font>show s<font color=Cyan>)</font> p t-<a name="(line177)"></a> <font color=Cyan>}</font>-<a name="(line178)"></a>-<a name="(line179)"></a><a name="posn"></a>posn <font color=Red>::</font> HParser Posn-<a name="(line180)"></a>posn <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> x<font color=Red>@</font><font color=Cyan>(</font>p<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line181)"></a> <font color=Cyan>;</font> reparse <font color=Red>[</font>x<font color=Red>]</font>-<a name="(line182)"></a> <font color=Cyan>;</font> return p-<a name="(line183)"></a> <font color=Cyan>}</font> <font color=Cyan>`onFail`</font> return noPos-<a name="(line184)"></a>-<a name="(line185)"></a><a name="nmtoken"></a>nmtoken <font color=Red>::</font> HParser NmToken-<a name="(line186)"></a>nmtoken <font color=Red>=</font> <font color=Cyan>(</font>string <font color=Cyan>`onFail`</font> freetext<font color=Cyan>)</font>-<a name="(line187)"></a>-<a name="(line188)"></a><a name="failP"></a>failP<font color=Cyan>,</font> failBadP <font color=Red>::</font> String <font color=Red>-></font> HParser a-<a name="(line189)"></a>failP msg <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn<font color=Cyan>;</font> fail <font color=Cyan>(</font>msg<font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font> <font color=Cyan>}</font>-<a name="(line190)"></a><a name="failBadP"></a>failBadP msg <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn<font color=Cyan>;</font> failBad <font color=Cyan>(</font>msg<font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font> <font color=Cyan>}</font>-<a name="(line191)"></a>-<a name="(line192)"></a><a name="report"></a>report <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>HParser a<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> Posn <font color=Red>-></font> TokenT <font color=Red>-></font> HParser a-<a name="(line193)"></a>report fail exp p t <font color=Red>=</font> fail <font color=Cyan>(</font><font color=Magenta>"Expected "</font><font color=Cyan>++</font>show exp<font color=Cyan>++</font><font color=Magenta>" but found "</font><font color=Cyan>++</font>show t-<a name="(line194)"></a> <font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>-<a name="(line195)"></a>-<a name="(line196)"></a><a name="adjustErrP"></a>adjustErrP <font color=Red>::</font> HParser a <font color=Red>-></font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Cyan>)</font> <font color=Red>-></font> HParser a-<a name="(line197)"></a><a name="adjustErrP"></a>p <font color=Cyan>`adjustErrP`</font> f <font color=Red>=</font> p <font color=Cyan>`onFail`</font> <font color=Green><u>do</u></font> pn <font color=Red><-</font> posn-<a name="(line198)"></a> <font color=Cyan>(</font>p <font color=Cyan>`adjustErr`</font> f<font color=Cyan>)</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>++</font>show pn<font color=Cyan>)</font>-<a name="(line199)"></a>-<a name="(line200)"></a><font color=Blue>---- XML Parsing Functions ----</font>-<a name="(line201)"></a>-<a name="(line202)"></a><a name="document"></a>document <font color=Red>::</font> HParser <font color=Cyan>(</font>Document Posn<font color=Cyan>)</font>-<a name="(line203)"></a>document <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line204)"></a> return Document-<a name="(line205)"></a> <font color=Cyan>`apply`</font> <font color=Cyan>(</font>prolog <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"unrecognisable XML prolog\n"</font><font color=Cyan>++</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line206)"></a> <font color=Cyan>`apply`</font> <font color=Cyan>(</font>return emptyST<font color=Cyan>)</font>-<a name="(line207)"></a> <font color=Cyan>`apply`</font> <font color=Cyan>(</font><font color=Green><u>do</u></font> es <font color=Red><-</font> many1 <font color=Cyan>(</font>element <font color=Magenta>"HTML document"</font><font color=Cyan>)</font>-<a name="(line208)"></a> return <font color=Cyan>(</font><font color=Green><u>case</u></font> map snd es <font color=Green><u>of</u></font>-<a name="(line209)"></a> <font color=Red>[</font>e<font color=Red>]</font> <font color=Red>-></font> e-<a name="(line210)"></a> es <font color=Red>-></font> Elem <font color=Magenta>"html"</font> [] <font color=Cyan>(</font>map mkCElem es<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line211)"></a> <font color=Cyan>`apply`</font> <font color=Cyan>(</font>many misc<font color=Cyan>)</font>-<a name="(line212)"></a> <font color=Green><u>where</u></font> mkCElem e <font color=Red>=</font> CElem e noPos-<a name="(line213)"></a>-<a name="(line214)"></a><a name="comment"></a>comment <font color=Red>::</font> HParser Comment-<a name="(line215)"></a>comment <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line216)"></a> bracket <font color=Cyan>(</font>tok TokCommentOpen<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokCommentClose<font color=Cyan>)</font> freetext-<a name="(line217)"></a>-<a name="(line218)"></a><a name="processinginstruction"></a>processinginstruction <font color=Red>::</font> HParser ProcessingInstruction-<a name="(line219)"></a>processinginstruction <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line220)"></a> tok TokPIOpen-<a name="(line221)"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>-<a name="(line222)"></a> n <font color=Red><-</font> string <font color=Cyan>`onFail`</font> failP <font color=Magenta>"processing instruction has no target"</font>-<a name="(line223)"></a> f <font color=Red><-</font> freetext-<a name="(line224)"></a> <font color=Cyan>(</font>tok TokPIClose <font color=Cyan>`onFail`</font> tok TokAnyClose<font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing ?> or >"</font>-<a name="(line225)"></a> return <font color=Cyan>(</font>n<font color=Cyan>,</font> f<font color=Cyan>)</font>-<a name="(line226)"></a>-<a name="(line227)"></a><a name="cdsect"></a>cdsect <font color=Red>::</font> HParser CDSect-<a name="(line228)"></a>cdsect <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line229)"></a> tok TokSectionOpen-<a name="(line230)"></a> bracket <font color=Cyan>(</font>tok <font color=Cyan>(</font>TokSection CDATAx<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSectionClose<font color=Cyan>)</font> chardata-<a name="(line231)"></a>-<a name="(line232)"></a><a name="prolog"></a>prolog <font color=Red>::</font> HParser Prolog-<a name="(line233)"></a>prolog <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line234)"></a> x <font color=Red><-</font> maybe xmldecl-<a name="(line235)"></a> m1 <font color=Red><-</font> many misc-<a name="(line236)"></a> dtd <font color=Red><-</font> maybe doctypedecl-<a name="(line237)"></a> m2 <font color=Red><-</font> many misc-<a name="(line238)"></a> return <font color=Cyan>(</font>Prolog x m1 dtd m2<font color=Cyan>)</font>-<a name="(line239)"></a>-<a name="(line240)"></a><a name="xmldecl"></a>xmldecl <font color=Red>::</font> HParser XMLDecl-<a name="(line241)"></a>xmldecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line242)"></a> tok TokPIOpen-<a name="(line243)"></a> <font color=Cyan>(</font>word <font color=Magenta>"xml"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"XML"</font><font color=Cyan>)</font>-<a name="(line244)"></a> p <font color=Red><-</font> posn-<a name="(line245)"></a> s <font color=Red><-</font> freetext-<a name="(line246)"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing ?> in <?xml ...?>"</font>-<a name="(line247)"></a> <font color=Cyan>(</font>return <font color=Cyan>.</font> fst <font color=Cyan>.</font> runParser aux <font color=Cyan>.</font> xmlReLex p<font color=Cyan>)</font> s-<a name="(line248)"></a> <font color=Green><u>where</u></font>-<a name="(line249)"></a> aux <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line250)"></a> v <font color=Red><-</font> versioninfo <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing XML version info"</font>-<a name="(line251)"></a> e <font color=Red><-</font> maybe encodingdecl-<a name="(line252)"></a> s <font color=Red><-</font> maybe sddecl-<a name="(line253)"></a> return <font color=Cyan>(</font>XMLDecl v e s<font color=Cyan>)</font>-<a name="(line254)"></a>-<a name="(line255)"></a><a name="versioninfo"></a>versioninfo <font color=Red>::</font> HParser VersionInfo-<a name="(line256)"></a>versioninfo <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line257)"></a> <font color=Cyan>(</font>word <font color=Magenta>"version"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"VERSION"</font><font color=Cyan>)</font>-<a name="(line258)"></a> tok TokEqual-<a name="(line259)"></a> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext-<a name="(line260)"></a>-<a name="(line261)"></a><a name="misc"></a>misc <font color=Red>::</font> HParser Misc-<a name="(line262)"></a>misc <font color=Red>=</font> -<a name="(line263)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"<!--comment-->"</font><font color=Cyan>,</font> comment <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Comment<font color=Cyan>)</font>-<a name="(line264)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"<?PI?>"</font><font color=Cyan>,</font> processinginstruction <font color=Cyan>>>=</font> return <font color=Cyan>.</font> PI<font color=Cyan>)</font>-<a name="(line265)"></a> <font color=Red>]</font>-<a name="(line266)"></a>-<a name="(line267)"></a>-<a name="(line268)"></a><font color=Blue>-- Question: for HTML, should we disallow in-line DTDs, allowing only externals?</font>-<a name="(line269)"></a><font color=Blue>-- Answer: I think so.</font>-<a name="(line270)"></a>-<a name="(line271)"></a><a name="doctypedecl"></a>doctypedecl <font color=Red>::</font> HParser DocTypeDecl-<a name="(line272)"></a>doctypedecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line273)"></a> tok TokSpecialOpen-<a name="(line274)"></a> tok <font color=Cyan>(</font>TokSpecial DOCTYPEx<font color=Cyan>)</font>-<a name="(line275)"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>-<a name="(line276)"></a> n <font color=Red><-</font> name-<a name="(line277)"></a> eid <font color=Red><-</font> maybe externalid-<a name="(line278)"></a><font color=Blue>-- es <- maybe (bracket (tok TokSqOpen) (tok TokSqClose)) (many markupdecl)</font>-<a name="(line279)"></a> tok TokAnyClose <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing > in DOCTYPE decl"</font>-<a name="(line280)"></a><font color=Blue>-- return (DTD n eid (case es of { Nothing -> []; Just e -> e }))</font>-<a name="(line281)"></a> return <font color=Cyan>(</font>DTD n eid []<font color=Cyan>)</font>-<a name="(line282)"></a>-<a name="(line283)"></a><font color=Blue>--markupdecl :: HParser MarkupDecl</font>-<a name="(line284)"></a><font color=Blue>--markupdecl =</font>-<a name="(line285)"></a><font color=Blue>-- ( elementdecl >>= return . Element) `onFail`</font>-<a name="(line286)"></a><font color=Blue>-- ( attlistdecl >>= return . AttList) `onFail`</font>-<a name="(line287)"></a><font color=Blue>-- ( entitydecl >>= return . Entity) `onFail`</font>-<a name="(line288)"></a><font color=Blue>-- ( notationdecl >>= return . Notation) `onFail`</font>-<a name="(line289)"></a><font color=Blue>-- ( misc >>= return . MarkupMisc) `onFail`</font>-<a name="(line290)"></a><font color=Blue>-- PEREF(MarkupPE,markupdecl)</font>-<a name="(line291)"></a><font color=Blue>--</font>-<a name="(line292)"></a><font color=Blue>--extsubset :: HParser ExtSubset</font>-<a name="(line293)"></a><font color=Blue>--extsubset = do</font>-<a name="(line294)"></a><font color=Blue>-- td <- maybe textdecl</font>-<a name="(line295)"></a><font color=Blue>-- ds <- many extsubsetdecl</font>-<a name="(line296)"></a><font color=Blue>-- return (ExtSubset td ds)</font>-<a name="(line297)"></a><font color=Blue>--</font>-<a name="(line298)"></a><font color=Blue>--extsubsetdecl :: HParser ExtSubsetDecl</font>-<a name="(line299)"></a><font color=Blue>--extsubsetdecl =</font>-<a name="(line300)"></a><font color=Blue>-- ( markupdecl >>= return . ExtMarkupDecl) `onFail`</font>-<a name="(line301)"></a><font color=Blue>-- ( conditionalsect >>= return . ExtConditionalSect) `onFail`</font>-<a name="(line302)"></a><font color=Blue>-- PEREF(ExtPEReference,extsubsetdecl)</font>-<a name="(line303)"></a>-<a name="(line304)"></a><a name="sddecl"></a>sddecl <font color=Red>::</font> HParser SDDecl-<a name="(line305)"></a>sddecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line306)"></a> <font color=Cyan>(</font>word <font color=Magenta>"standalone"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"STANDALONE"</font><font color=Cyan>)</font>-<a name="(line307)"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>-<a name="(line308)"></a> tok TokEqual <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing = in 'standalone' decl"</font>-<a name="(line309)"></a> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font>-<a name="(line310)"></a> <font color=Cyan>(</font> <font color=Cyan>(</font>word <font color=Magenta>"yes"</font> <font color=Cyan>>></font> return True<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line311)"></a> <font color=Cyan>(</font>word <font color=Magenta>"no"</font> <font color=Cyan>>></font> return False<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line312)"></a> failP <font color=Magenta>"'standalone' decl requires 'yes' or 'no' value"</font> <font color=Cyan>)</font>-<a name="(line313)"></a>-<a name="(line314)"></a>-<a name="(line315)"></a>-<a name="(line316)"></a>-<a name="(line317)"></a><a name="Stack"></a><font color=Blue>----</font>-<a name="(line318)"></a><a name="Stack"></a><font color=Blue>-- VERY IMPORTANT NOTE: The stack returned here contains those tags which</font>-<a name="(line319)"></a><a name="Stack"></a><font color=Blue>-- have been closed implicitly and need to be reopened again at the</font>-<a name="(line320)"></a><a name="Stack"></a><font color=Blue>-- earliest opportunity.</font>-<a name="(line321)"></a><a name="Stack"></a><font color=Green><u>type</u></font> Stack <font color=Red>=</font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>Attribute<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font>-<a name="(line322)"></a>-<a name="(line323)"></a><a name="element"></a>element <font color=Red>::</font> Name <font color=Red>-></font> HParser <font color=Cyan>(</font>Stack<font color=Cyan>,</font>Element Posn<font color=Cyan>)</font>-<a name="(line324)"></a>element ctx <font color=Red>=</font>-<a name="(line325)"></a> <font color=Green><u>do</u></font>-<a name="(line326)"></a> tok TokAnyOpen-<a name="(line327)"></a> <font color=Cyan>(</font>ElemTag e avs<font color=Cyan>)</font> <font color=Red><-</font> elemtag-<a name="(line328)"></a> <font color=Cyan>(</font> <font color=Green><u>if</u></font> e <font color=Cyan>`closes`</font> ctx <font color=Green><u>then</u></font>-<a name="(line329)"></a> <font color=Blue>-- insert the missing close-tag, fail forward, and reparse.</font>-<a name="(line330)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> debug <font color=Cyan>(</font><font color=Magenta>"/"</font><font color=Cyan>)</font>-<a name="(line331)"></a> unparse <font color=Cyan>(</font><font color=Red>[</font>TokEndOpen<font color=Cyan>,</font> TokName ctx<font color=Cyan>,</font> TokAnyClose<font color=Cyan>,</font>-<a name="(line332)"></a> TokAnyOpen<font color=Cyan>,</font> TokName e<font color=Red>]</font> <font color=Cyan>++</font> reformatAttrs avs<font color=Cyan>)</font>-<a name="(line333)"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> Elem <font color=Magenta>"null"</font> [] []<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line334)"></a> <font color=Green><u>else</u></font> <font color=Green><u>if</u></font> e <font color=Cyan>`elem`</font> selfclosingtags <font color=Green><u>then</u></font>-<a name="(line335)"></a> <font color=Blue>-- complete the parse straightaway.</font>-<a name="(line336)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokEndClose <font color=Blue>-- self-closing <tag /> </font>-<a name="(line337)"></a> debug <font color=Cyan>(</font>e<font color=Cyan>++</font><font color=Magenta>"[+]"</font><font color=Cyan>)</font>-<a name="(line338)"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> Elem e avs []<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line339)"></a> <font color=Blue>-- ( do tok TokAnyClose -- sequence <tag></tag> (**not HTML?**)</font>-<a name="(line340)"></a> <font color=Blue>-- debug (e++"[+")</font>-<a name="(line341)"></a> <font color=Blue>-- n <- bracket (tok TokEndOpen) (tok TokAnyClose) name</font>-<a name="(line342)"></a> <font color=Blue>-- debug "]"</font>-<a name="(line343)"></a> <font color=Blue>-- if e == (map toLower n :: Name) </font>-<a name="(line344)"></a> <font color=Blue>-- then return ([], Elem e avs []) </font>-<a name="(line345)"></a> <font color=Blue>-- else return (error "no nesting in empty tag")) `onFail`</font>-<a name="(line346)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokAnyClose <font color=Blue>-- <tag> with no close (e.g. <IMG>)</font>-<a name="(line347)"></a> debug <font color=Cyan>(</font>e<font color=Cyan>++</font><font color=Magenta>"[+]"</font><font color=Cyan>)</font>-<a name="(line348)"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> Elem e avs []<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line349)"></a> <font color=Green><u>else</u></font>-<a name="(line350)"></a> <font color=Cyan>(</font><font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokEndClose-<a name="(line351)"></a> debug <font color=Cyan>(</font>e<font color=Cyan>++</font><font color=Magenta>"[]"</font><font color=Cyan>)</font>-<a name="(line352)"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> Elem e avs []<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line353)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokAnyClose <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing > or /> in element tag"</font>-<a name="(line354)"></a> debug <font color=Cyan>(</font>e<font color=Cyan>++</font><font color=Magenta>"["</font><font color=Cyan>)</font>-<a name="(line355)"></a> return <font color=Cyan>(</font><font color=Red>\</font> interior<font color=Red>-></font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>stack<font color=Cyan>,</font>contained<font color=Cyan>)</font> <font color=Red>=</font> interior-<a name="(line356)"></a> <font color=Green><u>in</u></font> <font color=Cyan>(</font>stack<font color=Cyan>,</font> Elem e avs contained<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line357)"></a> <font color=Cyan>`apply`</font>-<a name="(line358)"></a> <font color=Cyan>(</font><font color=Green><u>do</u></font> zz <font color=Red><-</font> manyFinally <font color=Cyan>(</font>content e<font color=Cyan>)</font>-<a name="(line359)"></a> <font color=Cyan>(</font>tok TokEndOpen<font color=Cyan>)</font>-<a name="(line360)"></a> n <font color=Red><-</font> name-<a name="(line361)"></a> commit <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font>-<a name="(line362)"></a> debug <font color=Magenta>"]"</font>-<a name="(line363)"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>ss<font color=Cyan>,</font>cs<font color=Cyan>)</font> <font color=Red>=</font> unzip zz-<a name="(line364)"></a> <font color=Green><u>let</u></font> s <font color=Red>=</font> <font color=Green><u>if</u></font> null ss <font color=Green><u>then</u></font> [] <font color=Green><u>else</u></font> last ss-<a name="(line365)"></a> <font color=Cyan>(</font> <font color=Green><u>if</u></font> e <font color=Cyan>==</font> <font color=Cyan>(</font>map toLower n <font color=Red>::</font> Name<font color=Cyan>)</font> <font color=Green><u>then</u></font>-<a name="(line366)"></a> <font color=Green><u>do</u></font> unparse <font color=Cyan>(</font>reformatTags <font color=Cyan>(</font>closeInner e s<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line367)"></a> debug <font color=Magenta>"^"</font>-<a name="(line368)"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> cs<font color=Cyan>)</font>-<a name="(line369)"></a> <font color=Green><u>else</u></font>-<a name="(line370)"></a> <font color=Green><u>do</u></font> unparse <font color=Red>[</font>TokEndOpen<font color=Cyan>,</font> TokName n<font color=Cyan>,</font> TokAnyClose<font color=Red>]</font>-<a name="(line371)"></a> debug <font color=Magenta>"-"</font>-<a name="(line372)"></a> return <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>(</font>e<font color=Cyan>,</font>avs<font color=Cyan>)</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font><font color=Cyan>,</font> cs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line373)"></a> <font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failP <font color=Cyan>(</font><font color=Magenta>"failed to repair non-matching tags in context: "</font><font color=Cyan>++</font>ctx<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line374)"></a>-<a name="(line375)"></a><a name="closeInner"></a>closeInner <font color=Red>::</font> Name <font color=Red>-></font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>Attribute<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>Attribute<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font>-<a name="(line376)"></a>closeInner c ts <font color=Red>=</font>-<a name="(line377)"></a> <font color=Green><u>case</u></font> lookup c closeInnerTags <font color=Green><u>of</u></font>-<a name="(line378)"></a> <font color=Cyan>(</font>Just these<font color=Cyan>)</font> <font color=Red>-></font> filter <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>`notElem`</font> these<font color=Cyan>)</font><font color=Cyan>.</font>fst<font color=Cyan>)</font> ts-<a name="(line379)"></a> Nothing <font color=Red>-></font> ts-<a name="(line380)"></a>-<a name="(line381)"></a><a name="unparse"></a>unparse ts <font color=Red>=</font> <font color=Green><u>do</u></font> p <font color=Red><-</font> posn-<a name="(line382)"></a> reparse <font color=Cyan>(</font>zip <font color=Cyan>(</font>repeat p<font color=Cyan>)</font> ts<font color=Cyan>)</font>-<a name="(line383)"></a>-<a name="(line384)"></a><a name="reformatAttrs"></a>reformatAttrs avs <font color=Red>=</font> concatMap f0 avs-<a name="(line385)"></a> <font color=Green><u>where</u></font> f0 <font color=Cyan>(</font>a<font color=Cyan>,</font> v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>TokName a<font color=Cyan>,</font> TokEqual<font color=Cyan>,</font> TokQuote<font color=Cyan>,</font>-<a name="(line386)"></a> TokFreeText <font color=Cyan>(</font>show v<font color=Cyan>)</font><font color=Cyan>,</font> TokQuote<font color=Red>]</font>-<a name="(line387)"></a><a name="reformatTags"></a>reformatTags ts <font color=Red>=</font> concatMap f0 ts-<a name="(line388)"></a> <font color=Green><u>where</u></font> f0 <font color=Cyan>(</font>t<font color=Cyan>,</font>avs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>TokAnyOpen<font color=Cyan>,</font> TokName t<font color=Red>]</font><font color=Cyan>++</font>reformatAttrs avs<font color=Cyan>++</font><font color=Red>[</font>TokAnyClose<font color=Red>]</font>-<a name="(line389)"></a>-<a name="(line390)"></a><a name="content"></a>content <font color=Red>::</font> Name <font color=Red>-></font> HParser <font color=Cyan>(</font>Stack<font color=Cyan>,</font>Content Posn<font color=Cyan>)</font>-<a name="(line391)"></a>content ctx <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn <font color=Cyan>;</font> content' p ctx <font color=Cyan>}</font>-<a name="(line392)"></a> <font color=Green><u>where</u></font> content' p ctx <font color=Red>=</font> oneOf'-<a name="(line393)"></a> <font color=Red>[</font> <font color=Cyan>(</font> <font color=Magenta>"element"</font><font color=Cyan>,</font> element ctx <font color=Cyan>>>=</font> <font color=Red>\</font><font color=Cyan>(</font>s<font color=Cyan>,</font>e<font color=Cyan>)</font><font color=Red>-></font> return <font color=Cyan>(</font>s<font color=Cyan>,</font> CElem e p<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line394)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"chardata"</font><font color=Cyan>,</font> chardata <font color=Cyan>>>=</font> <font color=Red>\</font>s<font color=Red>-></font> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> CString False s p<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line395)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"reference"</font><font color=Cyan>,</font> reference <font color=Cyan>>>=</font> <font color=Red>\</font>r<font color=Red>-></font> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> CRef r p<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line396)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"cdsect"</font><font color=Cyan>,</font> cdsect <font color=Cyan>>>=</font> <font color=Red>\</font>c<font color=Red>-></font> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> CString True c p<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line397)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"misc"</font><font color=Cyan>,</font> misc <font color=Cyan>>>=</font> <font color=Red>\</font>m<font color=Red>-></font> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> CMisc m p<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line398)"></a> <font color=Red>]</font> <font color=Cyan>`adjustErrP`</font> <font color=Cyan>(</font><font color=Magenta>"when looking for a content item,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line399)"></a>-<a name="(line400)"></a><a name="elemtag"></a><font color=Blue>----</font>-<a name="(line401)"></a>elemtag <font color=Red>::</font> HParser ElemTag-<a name="(line402)"></a>elemtag <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line403)"></a> n <font color=Red><-</font> name <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Magenta>"malformed element tag\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line404)"></a> <font color=Green><u>as</u></font> <font color=Red><-</font> many attribute-<a name="(line405)"></a> return <font color=Cyan>(</font>ElemTag <font color=Cyan>(</font>map toLower n<font color=Cyan>)</font> <font color=Green><u>as</u></font><font color=Cyan>)</font>-<a name="(line406)"></a>-<a name="(line407)"></a><a name="attribute"></a>attribute <font color=Red>::</font> HParser Attribute-<a name="(line408)"></a>attribute <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line409)"></a> n <font color=Red><-</font> name-<a name="(line410)"></a> v <font color=Red><-</font> <font color=Cyan>(</font><font color=Green><u>do</u></font> tok TokEqual-<a name="(line411)"></a> attvalue<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line412)"></a> <font color=Cyan>(</font>return <font color=Cyan>(</font>AttValue <font color=Red>[</font>Left <font color=Magenta>"TRUE"</font><font color=Red>]</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line413)"></a> return <font color=Cyan>(</font>map toLower n<font color=Cyan>,</font>v<font color=Cyan>)</font>-<a name="(line414)"></a>-<a name="(line415)"></a><font color=Blue>--elementdecl :: HParser ElementDecl</font>-<a name="(line416)"></a><font color=Blue>--elementdecl = do</font>-<a name="(line417)"></a><font color=Blue>-- tok TokSpecialOpen</font>-<a name="(line418)"></a><font color=Blue>-- tok (TokSpecial ELEMENTx)</font>-<a name="(line419)"></a><font color=Blue>-- n <- name `onFail` failP "missing identifier in ELEMENT decl"</font>-<a name="(line420)"></a><font color=Blue>-- c <- contentspec `onFail` failP "missing content spec in ELEMENT decl"</font>-<a name="(line421)"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "expected > terminating ELEMENT decl"</font>-<a name="(line422)"></a><font color=Blue>-- return (ElementDecl n c)</font>-<a name="(line423)"></a><font color=Blue>--</font>-<a name="(line424)"></a><font color=Blue>--contentspec :: HParser ContentSpec</font>-<a name="(line425)"></a><font color=Blue>--contentspec =</font>-<a name="(line426)"></a><font color=Blue>-- ( word "EMPTY" >> return EMPTY) `onFail`</font>-<a name="(line427)"></a><font color=Blue>-- ( word "ANY" >> return ANY) `onFail`</font>-<a name="(line428)"></a><font color=Blue>-- ( mixed >>= return . Mixed) `onFail`</font>-<a name="(line429)"></a><font color=Blue>-- ( cp >>= return . ContentSpec) `onFail`</font>-<a name="(line430)"></a><font color=Blue>-- PEREF(ContentPE,contentspec)</font>-<a name="(line431)"></a><font color=Blue>--</font>-<a name="(line432)"></a><font color=Blue>--choice :: HParser [CP]</font>-<a name="(line433)"></a><font color=Blue>--choice = do</font>-<a name="(line434)"></a><font color=Blue>-- bracket (tok TokBraOpen) (tok TokBraClose)</font>-<a name="(line435)"></a><font color=Blue>-- (cp `sepby1` (tok TokPipe))</font>-<a name="(line436)"></a><font color=Blue>--</font>-<a name="(line437)"></a><font color=Blue>--sequence :: HParser [CP]</font>-<a name="(line438)"></a><font color=Blue>--sequence = do</font>-<a name="(line439)"></a><font color=Blue>-- bracket (tok TokBraOpen) (tok TokBraClose)</font>-<a name="(line440)"></a><font color=Blue>-- (cp `sepby1` (tok TokComma))</font>-<a name="(line441)"></a><font color=Blue>--</font>-<a name="(line442)"></a><font color=Blue>--cp :: HParser CP</font>-<a name="(line443)"></a><font color=Blue>--cp =</font>-<a name="(line444)"></a><font color=Blue>-- ( do n <- name</font>-<a name="(line445)"></a><font color=Blue>-- m <- modifier</font>-<a name="(line446)"></a><font color=Blue>-- return (TagName n m)) `onFail`</font>-<a name="(line447)"></a><font color=Blue>-- ( do ss <- sequence</font>-<a name="(line448)"></a><font color=Blue>-- m <- modifier</font>-<a name="(line449)"></a><font color=Blue>-- return (Seq ss m)) `onFail`</font>-<a name="(line450)"></a><font color=Blue>-- ( do cs <- choice</font>-<a name="(line451)"></a><font color=Blue>-- m <- modifier</font>-<a name="(line452)"></a><font color=Blue>-- return (Choice cs m)) `onFail`</font>-<a name="(line453)"></a><font color=Blue>-- PEREF(CPPE,cp)</font>-<a name="(line454)"></a><font color=Blue>--</font>-<a name="(line455)"></a><font color=Blue>--modifier :: HParser Modifier</font>-<a name="(line456)"></a><font color=Blue>--modifier =</font>-<a name="(line457)"></a><font color=Blue>-- ( tok TokStar >> return Star) `onFail`</font>-<a name="(line458)"></a><font color=Blue>-- ( tok TokQuery >> return Query) `onFail`</font>-<a name="(line459)"></a><font color=Blue>-- ( tok TokPlus >> return Plus) `onFail`</font>-<a name="(line460)"></a><font color=Blue>-- ( return None)</font>-<a name="(line461)"></a><font color=Blue>--</font>-<a name="(line462)"></a><font color=Blue>--mixed :: HParser Mixed</font>-<a name="(line463)"></a><font color=Blue>--mixed = do</font>-<a name="(line464)"></a><font color=Blue>-- tok TokBraOpen</font>-<a name="(line465)"></a><font color=Blue>-- tok TokHash</font>-<a name="(line466)"></a><font color=Blue>-- word "PCDATA"</font>-<a name="(line467)"></a><font color=Blue>-- cont</font>-<a name="(line468)"></a><font color=Blue>-- where</font>-<a name="(line469)"></a><font color=Blue>-- cont = ( tok TokBraClose >> return PCDATA) `onFail`</font>-<a name="(line470)"></a><font color=Blue>-- ( do cs <- many ( do tok TokPipe</font>-<a name="(line471)"></a><font color=Blue>-- n <- name</font>-<a name="(line472)"></a><font color=Blue>-- return n)</font>-<a name="(line473)"></a><font color=Blue>-- tok TokBraClose</font>-<a name="(line474)"></a><font color=Blue>-- tok TokStar</font>-<a name="(line475)"></a><font color=Blue>-- return (PCDATAplus cs))</font>-<a name="(line476)"></a><font color=Blue>--</font>-<a name="(line477)"></a><font color=Blue>--attlistdecl :: HParser AttListDecl</font>-<a name="(line478)"></a><font color=Blue>--attlistdecl = do</font>-<a name="(line479)"></a><font color=Blue>-- tok TokSpecialOpen</font>-<a name="(line480)"></a><font color=Blue>-- tok (TokSpecial ATTLISTx)</font>-<a name="(line481)"></a><font color=Blue>-- n <- name `onFail` failP "missing identifier in ATTLIST"</font>-<a name="(line482)"></a><font color=Blue>-- ds <- many attdef</font>-<a name="(line483)"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "missing > terminating ATTLIST"</font>-<a name="(line484)"></a><font color=Blue>-- return (AttListDecl n ds)</font>-<a name="(line485)"></a><font color=Blue>--</font>-<a name="(line486)"></a><font color=Blue>--attdef :: HParser AttDef</font>-<a name="(line487)"></a><font color=Blue>--attdef = do</font>-<a name="(line488)"></a><font color=Blue>-- n <- name</font>-<a name="(line489)"></a><font color=Blue>-- t <- atttype `onFail` failP "missing attribute type in attlist defn"</font>-<a name="(line490)"></a><font color=Blue>-- d <- defaultdecl</font>-<a name="(line491)"></a><font color=Blue>-- return (AttDef n t d)</font>-<a name="(line492)"></a><font color=Blue>--</font>-<a name="(line493)"></a><font color=Blue>--atttype :: HParser AttType</font>-<a name="(line494)"></a><font color=Blue>--atttype =</font>-<a name="(line495)"></a><font color=Blue>-- ( word "CDATA" >> return StringType) `onFail`</font>-<a name="(line496)"></a><font color=Blue>-- ( tokenizedtype >>= return . TokenizedType) `onFail`</font>-<a name="(line497)"></a><font color=Blue>-- ( enumeratedtype >>= return . EnumeratedType)</font>-<a name="(line498)"></a><font color=Blue>--</font>-<a name="(line499)"></a><font color=Blue>--tokenizedtype :: HParser TokenizedType</font>-<a name="(line500)"></a><font color=Blue>--tokenizedtype =</font>-<a name="(line501)"></a><font color=Blue>-- ( word "ID" >> return ID) `onFail`</font>-<a name="(line502)"></a><font color=Blue>-- ( word "IDREF" >> return IDREF) `onFail`</font>-<a name="(line503)"></a><font color=Blue>-- ( word "IDREFS" >> return IDREFS) `onFail`</font>-<a name="(line504)"></a><font color=Blue>-- ( word "ENTITY" >> return ENTITY) `onFail`</font>-<a name="(line505)"></a><font color=Blue>-- ( word "ENTITIES" >> return ENTITIES) `onFail`</font>-<a name="(line506)"></a><font color=Blue>-- ( word "NMTOKEN" >> return NMTOKEN) `onFail`</font>-<a name="(line507)"></a><font color=Blue>-- ( word "NMTOKENS" >> return NMTOKENS)</font>-<a name="(line508)"></a><font color=Blue>--</font>-<a name="(line509)"></a><font color=Blue>--enumeratedtype :: HParser EnumeratedType</font>-<a name="(line510)"></a><font color=Blue>--enumeratedtype =</font>-<a name="(line511)"></a><font color=Blue>-- ( notationtype >>= return . NotationType) `onFail`</font>-<a name="(line512)"></a><font color=Blue>-- ( enumeration >>= return . Enumeration)</font>-<a name="(line513)"></a><font color=Blue>--</font>-<a name="(line514)"></a><font color=Blue>--notationtype :: HParser NotationType</font>-<a name="(line515)"></a><font color=Blue>--notationtype = do</font>-<a name="(line516)"></a><font color=Blue>-- word "NOTATION"</font>-<a name="(line517)"></a><font color=Blue>-- bracket (tok TokBraOpen) (tok TokBraClose)</font>-<a name="(line518)"></a><font color=Blue>-- (name `sepby1` (tok TokPipe))</font>-<a name="(line519)"></a><font color=Blue>--</font>-<a name="(line520)"></a><font color=Blue>--enumeration :: HParser Enumeration</font>-<a name="(line521)"></a><font color=Blue>--enumeration =</font>-<a name="(line522)"></a><font color=Blue>-- bracket (tok TokBraOpen) (tok TokBraClose)</font>-<a name="(line523)"></a><font color=Blue>-- (nmtoken `sepby1` (tok TokPipe))</font>-<a name="(line524)"></a><font color=Blue>--</font>-<a name="(line525)"></a><font color=Blue>--defaultdecl :: HParser DefaultDecl</font>-<a name="(line526)"></a><font color=Blue>--defaultdecl =</font>-<a name="(line527)"></a><font color=Blue>-- ( tok TokHash >> word "REQUIRED" >> return REQUIRED) `onFail`</font>-<a name="(line528)"></a><font color=Blue>-- ( tok TokHash >> word "IMPLIED" >> return IMPLIED) `onFail`</font>-<a name="(line529)"></a><font color=Blue>-- ( do f <- maybe (tok TokHash >> word "FIXED" >> return FIXED)</font>-<a name="(line530)"></a><font color=Blue>-- a <- attvalue</font>-<a name="(line531)"></a><font color=Blue>-- return (DefaultTo a f))</font>-<a name="(line532)"></a><font color=Blue>--</font>-<a name="(line533)"></a><font color=Blue>--conditionalsect :: HParser ConditionalSect</font>-<a name="(line534)"></a><font color=Blue>--conditionalsect =</font>-<a name="(line535)"></a><font color=Blue>-- ( do tok TokSectionOpen</font>-<a name="(line536)"></a><font color=Blue>-- tok (TokSection INCLUDEx)</font>-<a name="(line537)"></a><font color=Blue>-- tok TokSqOpen `onFail` failP "missing [ after INCLUDE"</font>-<a name="(line538)"></a><font color=Blue>-- i <- extsubsetdecl `onFail` failP "missing ExtSubsetDecl in INCLUDE"</font>-<a name="(line539)"></a><font color=Blue>-- tok TokSectionClose `onFail` failP "missing ] after INCLUDE"</font>-<a name="(line540)"></a><font color=Blue>-- return (IncludeSect i)) `onFail`</font>-<a name="(line541)"></a><font color=Blue>-- ( do tok TokSectionOpen</font>-<a name="(line542)"></a><font color=Blue>-- tok (TokSection IGNOREx)</font>-<a name="(line543)"></a><font color=Blue>-- tok TokSqOpen `onFail` failP "missing [ after IGNORE"</font>-<a name="(line544)"></a><font color=Blue>-- i <- many ignoresectcontents</font>-<a name="(line545)"></a><font color=Blue>-- tok TokSectionClose `onFail` failP "missing ] after IGNORE"</font>-<a name="(line546)"></a><font color=Blue>-- return (IgnoreSect i))</font>-<a name="(line547)"></a><font color=Blue>--</font>-<a name="(line548)"></a><font color=Blue>--ignoresectcontents :: HParser IgnoreSectContents</font>-<a name="(line549)"></a><font color=Blue>--ignoresectcontents = do</font>-<a name="(line550)"></a><font color=Blue>-- i <- ignore</font>-<a name="(line551)"></a><font color=Blue>-- is <- many (do tok TokSectionOpen</font>-<a name="(line552)"></a><font color=Blue>-- ic <- ignoresectcontents</font>-<a name="(line553)"></a><font color=Blue>-- tok TokSectionClose</font>-<a name="(line554)"></a><font color=Blue>-- ig <- ignore</font>-<a name="(line555)"></a><font color=Blue>-- return (ic,ig))</font>-<a name="(line556)"></a><font color=Blue>-- return (IgnoreSectContents i is)</font>-<a name="(line557)"></a><font color=Blue>--</font>-<a name="(line558)"></a><font color=Blue>--ignore :: HParser Ignore</font>-<a name="(line559)"></a><font color=Blue>--ignore = freetext >>= return . Ignore</font>-<a name="(line560)"></a>-<a name="(line561)"></a><a name="reference"></a>reference <font color=Red>::</font> HParser Reference-<a name="(line562)"></a>reference <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line563)"></a> bracket <font color=Cyan>(</font>tok TokAmp<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSemi<font color=Cyan>)</font> <font color=Cyan>(</font>freetext <font color=Cyan>>>=</font> val<font color=Cyan>)</font>-<a name="(line564)"></a> <font color=Green><u>where</u></font>-<a name="(line565)"></a> val <font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font><font color=Magenta>'x'</font><font color=Red><b>:</b></font>i<font color=Cyan>)</font> <font color=Red>|</font> all isHexDigit i-<a name="(line566)"></a> <font color=Red>=</font> return <font color=Cyan>.</font> RefChar <font color=Cyan>.</font> fst <font color=Cyan>.</font> head <font color=Cyan>.</font> readHex <font color=Cyan>$</font> i-<a name="(line567)"></a> val <font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>i<font color=Cyan>)</font> <font color=Red>|</font> all isDigit i-<a name="(line568)"></a> <font color=Red>=</font> return <font color=Cyan>.</font> RefChar <font color=Cyan>.</font> fst <font color=Cyan>.</font> head <font color=Cyan>.</font> readDec <font color=Cyan>$</font> i-<a name="(line569)"></a> val name <font color=Red>=</font> return <font color=Cyan>.</font> RefEntity <font color=Cyan>$</font> name-<a name="(line570)"></a>-<a name="(line571)"></a><font color=Blue>{--<a name="(line572)"></a>reference :: HParser Reference-<a name="(line573)"></a>reference =-<a name="(line574)"></a> ( charref >>= return . RefChar) `onFail`-<a name="(line575)"></a> ( entityref >>= return . RefEntity)-<a name="(line576)"></a>-<a name="(line577)"></a>entityref :: HParser EntityRef-<a name="(line578)"></a>entityref = do-<a name="(line579)"></a> n <- bracket (tok TokAmp) (tok TokSemi) name-<a name="(line580)"></a> return n-<a name="(line581)"></a>-<a name="(line582)"></a>charref :: HParser CharRef-<a name="(line583)"></a>charref = do-<a name="(line584)"></a> bracket (tok TokAmp) (tok TokSemi) (freetext >>= readCharVal)-<a name="(line585)"></a> where-<a name="(line586)"></a> readCharVal ('#':'x':i) = return . fst . head . readHex $ i-<a name="(line587)"></a> readCharVal ('#':i) = return . fst . head . readDec $ i-<a name="(line588)"></a> readCharVal _ = mzero-<a name="(line589)"></a>-}</font>-<a name="(line590)"></a>-<a name="(line591)"></a><font color=Blue>--pereference :: HParser PEReference</font>-<a name="(line592)"></a><font color=Blue>--pereference = do</font>-<a name="(line593)"></a><font color=Blue>-- bracket (tok TokPercent) (tok TokSemi) nmtoken</font>-<a name="(line594)"></a><font color=Blue>--</font>-<a name="(line595)"></a><font color=Blue>--entitydecl :: HParser EntityDecl</font>-<a name="(line596)"></a><font color=Blue>--entitydecl =</font>-<a name="(line597)"></a><font color=Blue>-- ( gedecl >>= return . EntityGEDecl) `onFail`</font>-<a name="(line598)"></a><font color=Blue>-- ( pedecl >>= return . EntityPEDecl)</font>-<a name="(line599)"></a><font color=Blue>--</font>-<a name="(line600)"></a><font color=Blue>--gedecl :: HParser GEDecl</font>-<a name="(line601)"></a><font color=Blue>--gedecl = do</font>-<a name="(line602)"></a><font color=Blue>-- tok TokSpecialOpen</font>-<a name="(line603)"></a><font color=Blue>-- tok (TokSpecial ENTITYx)</font>-<a name="(line604)"></a><font color=Blue>-- n <- name</font>-<a name="(line605)"></a><font color=Blue>-- e <- entitydef `onFail` failP "missing entity defn in G ENTITY decl"</font>-<a name="(line606)"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "expected > terminating G ENTITY decl"</font>-<a name="(line607)"></a><font color=Blue>-- return (GEDecl n e)</font>-<a name="(line608)"></a><font color=Blue>--</font>-<a name="(line609)"></a><font color=Blue>--pedecl :: HParser PEDecl</font>-<a name="(line610)"></a><font color=Blue>--pedecl = do</font>-<a name="(line611)"></a><font color=Blue>-- tok TokSpecialOpen</font>-<a name="(line612)"></a><font color=Blue>-- tok (TokSpecial ENTITYx)</font>-<a name="(line613)"></a><font color=Blue>-- tok TokPercent</font>-<a name="(line614)"></a><font color=Blue>-- n <- name</font>-<a name="(line615)"></a><font color=Blue>-- e <- pedef `onFail` failP "missing entity defn in P ENTITY decl"</font>-<a name="(line616)"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "expected > terminating P ENTITY decl"</font>-<a name="(line617)"></a><font color=Blue>-- return (PEDecl n e)</font>-<a name="(line618)"></a><font color=Blue>--</font>-<a name="(line619)"></a><font color=Blue>--entitydef :: HParser EntityDef</font>-<a name="(line620)"></a><font color=Blue>--entitydef =</font>-<a name="(line621)"></a><font color=Blue>-- ( entityvalue >>= return . DefEntityValue) `onFail`</font>-<a name="(line622)"></a><font color=Blue>-- ( do eid <- externalid</font>-<a name="(line623)"></a><font color=Blue>-- ndd <- maybe ndatadecl</font>-<a name="(line624)"></a><font color=Blue>-- return (DefExternalID eid ndd))</font>-<a name="(line625)"></a><font color=Blue>--</font>-<a name="(line626)"></a><font color=Blue>--pedef :: HParser PEDef</font>-<a name="(line627)"></a><font color=Blue>--pedef =</font>-<a name="(line628)"></a><font color=Blue>-- ( entityvalue >>= return . PEDefEntityValue) `onFail`</font>-<a name="(line629)"></a><font color=Blue>-- ( externalid >>= return . PEDefExternalID)</font>-<a name="(line630)"></a>-<a name="(line631)"></a><a name="externalid"></a>externalid <font color=Red>::</font> HParser ExternalID-<a name="(line632)"></a>externalid <font color=Red>=</font>-<a name="(line633)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> word <font color=Magenta>"SYSTEM"</font>-<a name="(line634)"></a> s <font color=Red><-</font> systemliteral-<a name="(line635)"></a> return <font color=Cyan>(</font>SYSTEM s<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line636)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> word <font color=Magenta>"PUBLIC"</font>-<a name="(line637)"></a> p <font color=Red><-</font> pubidliteral-<a name="(line638)"></a> s <font color=Red><-</font> <font color=Cyan>(</font>systemliteral <font color=Cyan>`onFail`</font> return <font color=Cyan>(</font>SystemLiteral <font color=Magenta>""</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line639)"></a> return <font color=Cyan>(</font>PUBLIC p s<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line640)"></a>-<a name="(line641)"></a><font color=Blue>--ndatadecl :: HParser NDataDecl</font>-<a name="(line642)"></a><font color=Blue>--ndatadecl = do</font>-<a name="(line643)"></a><font color=Blue>-- word "NDATA"</font>-<a name="(line644)"></a><font color=Blue>-- n <- name</font>-<a name="(line645)"></a><font color=Blue>-- return (NDATA n)</font>-<a name="(line646)"></a>-<a name="(line647)"></a><a name="textdecl"></a>textdecl <font color=Red>::</font> HParser TextDecl-<a name="(line648)"></a>textdecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line649)"></a> tok TokPIOpen-<a name="(line650)"></a> <font color=Cyan>(</font>word <font color=Magenta>"xml"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"XML"</font><font color=Cyan>)</font>-<a name="(line651)"></a> v <font color=Red><-</font> maybe versioninfo-<a name="(line652)"></a> e <font color=Red><-</font> encodingdecl-<a name="(line653)"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failP <font color=Magenta>"expected ?> terminating text decl"</font>-<a name="(line654)"></a> return <font color=Cyan>(</font>TextDecl v e<font color=Cyan>)</font>-<a name="(line655)"></a>-<a name="(line656)"></a><font color=Blue>--extparsedent :: HParser ExtParsedEnt</font>-<a name="(line657)"></a><font color=Blue>--extparsedent = do</font>-<a name="(line658)"></a><font color=Blue>-- t <- maybe textdecl</font>-<a name="(line659)"></a><font color=Blue>-- (_,c) <- (content "")</font>-<a name="(line660)"></a><font color=Blue>-- return (ExtParsedEnt t c)</font>-<a name="(line661)"></a><font color=Blue>--</font>-<a name="(line662)"></a><font color=Blue>--extpe :: HParser ExtPE</font>-<a name="(line663)"></a><font color=Blue>--extpe = do</font>-<a name="(line664)"></a><font color=Blue>-- t <- maybe textdecl</font>-<a name="(line665)"></a><font color=Blue>-- e <- extsubsetdecl</font>-<a name="(line666)"></a><font color=Blue>-- return (ExtPE t e)</font>-<a name="(line667)"></a>-<a name="(line668)"></a><a name="encodingdecl"></a>encodingdecl <font color=Red>::</font> HParser EncodingDecl-<a name="(line669)"></a>encodingdecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line670)"></a> <font color=Cyan>(</font>word <font color=Magenta>"encoding"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"ENCODING"</font><font color=Cyan>)</font>-<a name="(line671)"></a> tok TokEqual <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"expected = in 'encoding' decl"</font>-<a name="(line672)"></a> f <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext-<a name="(line673)"></a> return <font color=Cyan>(</font>EncodingDecl f<font color=Cyan>)</font>-<a name="(line674)"></a>-<a name="(line675)"></a><font color=Blue>--notationdecl :: HParser NotationDecl</font>-<a name="(line676)"></a><font color=Blue>--notationdecl = do</font>-<a name="(line677)"></a><font color=Blue>-- tok TokSpecialOpen</font>-<a name="(line678)"></a><font color=Blue>-- word "NOTATION"</font>-<a name="(line679)"></a><font color=Blue>-- n <- name</font>-<a name="(line680)"></a><font color=Blue>-- e <- either externalid publicid</font>-<a name="(line681)"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "expected > terminating NOTATION decl"</font>-<a name="(line682)"></a><font color=Blue>-- return (NOTATION n e)</font>-<a name="(line683)"></a>-<a name="(line684)"></a><a name="publicid"></a>publicid <font color=Red>::</font> HParser PublicID-<a name="(line685)"></a>publicid <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line686)"></a> word <font color=Magenta>"PUBLICID"</font>-<a name="(line687)"></a> p <font color=Red><-</font> pubidliteral-<a name="(line688)"></a> return <font color=Cyan>(</font>PUBLICID p<font color=Cyan>)</font>-<a name="(line689)"></a>-<a name="(line690)"></a><a name="entityvalue"></a>entityvalue <font color=Red>::</font> HParser EntityValue-<a name="(line691)"></a>entityvalue <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line692)"></a> evs <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>many ev<font color=Cyan>)</font>-<a name="(line693)"></a> return <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font>-<a name="(line694)"></a>-<a name="(line695)"></a><a name="ev"></a>ev <font color=Red>::</font> HParser EV-<a name="(line696)"></a>ev <font color=Red>=</font>-<a name="(line697)"></a> <font color=Cyan>(</font> freetext <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EVString<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line698)"></a><font color=Blue>-- PEREF(EVPERef,ev) `onFail`</font>-<a name="(line699)"></a> <font color=Cyan>(</font> reference <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EVRef<font color=Cyan>)</font>-<a name="(line700)"></a>-<a name="(line701)"></a><a name="attvalue"></a>attvalue <font color=Red>::</font> HParser AttValue-<a name="(line702)"></a>attvalue <font color=Red>=</font>-<a name="(line703)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> avs <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font>-<a name="(line704)"></a> <font color=Cyan>(</font>many <font color=Cyan>(</font>either freetext reference<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line705)"></a> return <font color=Cyan>(</font>AttValue avs<font color=Cyan>)</font> <font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line706)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> v <font color=Red><-</font> nmtoken-<a name="(line707)"></a> s <font color=Red><-</font> <font color=Cyan>(</font>tok TokPercent <font color=Cyan>>></font> return <font color=Magenta>"%"</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font> return <font color=Magenta>""</font>-<a name="(line708)"></a> return <font color=Cyan>(</font>AttValue <font color=Red>[</font>Left <font color=Cyan>(</font>v<font color=Cyan>++</font>s<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font> <font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line709)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> s <font color=Red><-</font> oneOf <font color=Red>[</font> tok TokPlus <font color=Cyan>>></font> return <font color=Magenta>"+"</font>-<a name="(line710)"></a> <font color=Cyan>,</font> tok TokHash <font color=Cyan>>></font> return <font color=Magenta>"#"</font>-<a name="(line711)"></a> <font color=Red>]</font>-<a name="(line712)"></a> v <font color=Red><-</font> nmtoken-<a name="(line713)"></a> return <font color=Cyan>(</font>AttValue <font color=Red>[</font>Left <font color=Cyan>(</font>s<font color=Cyan>++</font>v<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font> <font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line714)"></a> failP <font color=Magenta>"Badly formatted attribute value"</font>-<a name="(line715)"></a>-<a name="(line716)"></a><a name="systemliteral"></a>systemliteral <font color=Red>::</font> HParser SystemLiteral-<a name="(line717)"></a>systemliteral <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line718)"></a> s <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext-<a name="(line719)"></a> return <font color=Cyan>(</font>SystemLiteral s<font color=Cyan>)</font> <font color=Blue>-- note: need to fold &...; escapes</font>-<a name="(line720)"></a>-<a name="(line721)"></a><a name="pubidliteral"></a>pubidliteral <font color=Red>::</font> HParser PubidLiteral-<a name="(line722)"></a>pubidliteral <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line723)"></a> s <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext-<a name="(line724)"></a> return <font color=Cyan>(</font>PubidLiteral s<font color=Cyan>)</font> <font color=Blue>-- note: need to fold &...; escapes</font>-<a name="(line725)"></a>-<a name="(line726)"></a><a name="chardata"></a>chardata <font color=Red>::</font> HParser CharData-<a name="(line727)"></a>chardata <font color=Red>=</font> freetext <font color=Blue>-- >>= return . CharData</font>-<a name="(line728)"></a>-</pre>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/Html/ParseLazy.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>-- | This is a parser for HTML documents. Unlike for XML documents, it</font>+<a name="line-2"></a><font color=Blue>-- must include a certain amount of error-correction to account for</font>+<a name="line-3"></a><font color=Blue>-- HTML features like self-terminating tags, unterminated tags, and</font>+<a name="line-4"></a><font color=Blue>-- incorrect nesting. The input is tokenised by the</font>+<a name="line-5"></a><font color=Blue>-- XML lexer (a separate lexer is not required for HTML).</font>+<a name="line-6"></a>+<a name="line-7"></a><font color=Blue>-- It uses a slightly extended version of the Hutton/Meijer parser</font>+<a name="line-8"></a><font color=Blue>-- combinators.</font>+<a name="line-9"></a>+<a name="line-10"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Html<font color=Cyan>.</font>ParseLazy+<a name="line-11"></a> <font color=Cyan>(</font> htmlParse+<a name="line-12"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-13"></a>+<a name="line-14"></a><font color=Green><u>import</u></font> Prelude hiding <font color=Cyan>(</font>either<font color=Cyan>,</font>maybe<font color=Cyan>,</font>sequence<font color=Cyan>)</font>+<a name="line-15"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Prelude <font color=Cyan>(</font>either<font color=Cyan>)</font>+<a name="line-16"></a><font color=Green><u>import</u></font> Maybe hiding <font color=Cyan>(</font>maybe<font color=Cyan>)</font>+<a name="line-17"></a><font color=Green><u>import</u></font> Char <font color=Cyan>(</font>toLower<font color=Cyan>,</font> isSpace<font color=Cyan>,</font> isDigit<font color=Cyan>,</font> isHexDigit<font color=Cyan>)</font>+<a name="line-18"></a><font color=Green><u>import</u></font> Numeric <font color=Cyan>(</font>readDec<font color=Cyan>,</font>readHex<font color=Cyan>)</font>+<a name="line-19"></a><font color=Green><u>import</u></font> Monad+<a name="line-20"></a>+<a name="line-21"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-22"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Lex+<a name="line-23"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Posn+<a name="line-24"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>Poly<font color=Cyan>.</font>NoLeak<font color=Cyan>.</font>Lazy+<a name="line-25"></a>+<a name="line-26"></a><font color=Blue>-- #define DEBUG</font>+<a name="line-27"></a> +<a name="line-28"></a><font color=Magenta><em>#if defined(DEBUG)</em></font>+<a name="line-29"></a><font color=Magenta><em># if ( defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 502 ) || \</em></font>+<a name="line-30"></a> <font color=Cyan>(</font> defined<font color=Cyan>(</font><b><font color=Magenta>__NHC__</font></b><font color=Cyan>)</font> <font color=Cyan>&&</font> <b><font color=Magenta>__NHC__</font></b> <font color=Cyan>></font> <font color=Magenta>114</font> <font color=Cyan>)</font> <font color=Cyan>||</font> defined<font color=Cyan>(</font><b><font color=Magenta>__HUGS__</font></b><font color=Cyan>)</font>+<a name="line-31"></a><font color=Green><u>import</u></font> Debug<font color=Cyan>.</font>Trace<font color=Cyan>(</font>trace<font color=Cyan>)</font>+<a name="line-32"></a><font color=Magenta><em># elif defined(__GLASGOW_HASKELL__)</em></font>+<a name="line-33"></a><font color=Green><u>import</u></font> IOExts<font color=Cyan>(</font>trace<font color=Cyan>)</font>+<a name="line-34"></a><font color=Magenta><em># elif defined(__NHC__) || defined(__HBC__)</em></font>+<a name="line-35"></a><font color=Green><u>import</u></font> NonStdTrace+<a name="line-36"></a><font color=Magenta><em># endif</em></font>+<a name="line-37"></a><a name="debug"></a><font color=Blue>debug</font> <font color=Red>::</font> Monad m <font color=Red>=></font> String <font color=Red>-></font> m ()+<a name="line-38"></a><font color=Blue>debug</font> s <font color=Red>=</font> trace s <font color=Cyan>(</font>return ()<font color=Cyan>)</font>+<a name="line-39"></a><font color=Magenta><em>#else</em></font>+<a name="line-40"></a><font color=Blue>debug</font> <font color=Red>::</font> Monad m <font color=Red>=></font> String <font color=Red>-></font> m ()+<a name="line-41"></a><font color=Blue>debug</font> s <font color=Red>=</font> return ()+<a name="line-42"></a><font color=Magenta><em>#endif</em></font>+<a name="line-43"></a>+<a name="line-44"></a>+<a name="line-45"></a><a name="htmlParse"></a><font color=Blue>-- | The first argument is the name of the file, the second is the string</font>+<a name="line-46"></a><font color=Blue>-- contents of the file. The result is the generic representation of</font>+<a name="line-47"></a><font color=Blue>-- an XML document. Any errors cause program failure with message to stderr.</font>+<a name="line-48"></a><font color=Blue>htmlParse</font> <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Document Posn+<a name="line-49"></a><font color=Blue>htmlParse</font> name <font color=Red>=</font> <font color=Blue>{-simplify .-}</font> fst <font color=Cyan>.</font> runParser document <font color=Cyan>.</font> xmlLex name+<a name="line-50"></a>+<a name="line-51"></a><font color=Blue>{-+<a name="line-52"></a>-- | The first argument is the name of the file, the second is the string+<a name="line-53"></a>-- contents of the file. The result is the generic representation of+<a name="line-54"></a>-- an XML document. Any parsing errors are returned in the @Either@ type.+<a name="line-55"></a>htmlParse' :: String -> String -> Either String (Document Posn)+<a name="line-56"></a>htmlParse' name = Prelude.either Left (Right . simplify) . fst+<a name="line-57"></a> . runParser document . xmlLex name+<a name="line-58"></a>-}</font>+<a name="line-59"></a>+<a name="line-60"></a><font color=Blue>---- Document simplification ----</font>+<a name="line-61"></a>+<a name="line-62"></a><a name="simplify"></a><font color=Blue>simplify</font> <font color=Red>::</font> Document i <font color=Red>-></font> Document i+<a name="line-63"></a><font color=Blue>simplify</font> <font color=Cyan>(</font>Document p st <font color=Cyan>(</font>Elem n avs cs<font color=Cyan>)</font> ms<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-64"></a> Document p st <font color=Cyan>(</font>Elem n avs <font color=Cyan>(</font>deepfilter simp cs<font color=Cyan>)</font><font color=Cyan>)</font> ms+<a name="line-65"></a> <font color=Green><u>where</u></font>+<a name="line-66"></a> simp <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"null"</font> [] []<font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> False+<a name="line-67"></a> simp <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem n <font color=Green><u>_</u></font> []<font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>|</font> n <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"font"</font><font color=Cyan>,</font><font color=Magenta>"p"</font><font color=Cyan>,</font><font color=Magenta>"i"</font><font color=Cyan>,</font><font color=Magenta>"b"</font><font color=Cyan>,</font><font color=Magenta>"em"</font>+<a name="line-68"></a> <font color=Cyan>,</font><font color=Magenta>"tt"</font><font color=Cyan>,</font><font color=Magenta>"big"</font><font color=Cyan>,</font><font color=Magenta>"small"</font><font color=Red>]</font> <font color=Red>=</font> False+<a name="line-69"></a> <font color=Blue>-- simp (CString False s _) | all isSpace s = False</font>+<a name="line-70"></a> simp <font color=Green><u>_</u></font> <font color=Red>=</font> True+<a name="line-71"></a> deepfilter p <font color=Red>=</font>+<a name="line-72"></a> filter p <font color=Cyan>.</font> map <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font> <font color=Green><u>case</u></font> c <font color=Green><u>of</u></font>+<a name="line-73"></a> CElem <font color=Cyan>(</font>Elem n avs cs<font color=Cyan>)</font> i+<a name="line-74"></a> <font color=Red>-></font> CElem <font color=Cyan>(</font>Elem n avs <font color=Cyan>(</font>deepfilter p cs<font color=Cyan>)</font><font color=Cyan>)</font> i+<a name="line-75"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> c<font color=Cyan>)</font>+<a name="line-76"></a>+<a name="line-77"></a><a name="selfclosingtags"></a><font color=Blue>-- opening any of these, they close again immediately</font>+<a name="line-78"></a><font color=Blue>selfclosingtags</font> <font color=Red>=</font> <font color=Red>[</font><font color=Magenta>"img"</font><font color=Cyan>,</font><font color=Magenta>"hr"</font><font color=Cyan>,</font><font color=Magenta>"br"</font><font color=Cyan>,</font><font color=Magenta>"meta"</font><font color=Cyan>,</font><font color=Magenta>"col"</font><font color=Cyan>,</font><font color=Magenta>"link"</font><font color=Cyan>,</font><font color=Magenta>"base"</font>+<a name="line-79"></a> <font color=Cyan>,</font><font color=Magenta>"param"</font><font color=Cyan>,</font><font color=Magenta>"area"</font><font color=Cyan>,</font><font color=Magenta>"frame"</font><font color=Cyan>,</font><font color=Magenta>"input"</font><font color=Red>]</font>+<a name="line-80"></a>+<a name="line-81"></a><a name="closeInnerTags"></a><font color=Blue>--closing this, implicitly closes any of those which are contained in it</font>+<a name="line-82"></a><font color=Blue>closeInnerTags</font> <font color=Red>=</font>+<a name="line-83"></a> <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"ul"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"li"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-84"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"ol"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"li"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-85"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"dl"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"dt"</font><font color=Cyan>,</font><font color=Magenta>"dd"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-86"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"tr"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-87"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"div"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-88"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"thead"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-89"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"tfoot"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-90"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"tbody"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-91"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"table"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Cyan>,</font><font color=Magenta>"thead"</font><font color=Cyan>,</font><font color=Magenta>"tfoot"</font><font color=Cyan>,</font><font color=Magenta>"tbody"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-92"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"caption"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-93"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"th"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-94"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"td"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-95"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"li"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-96"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"dt"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-97"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"dd"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-98"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"object"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-99"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"map"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-100"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"body"</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-101"></a> <font color=Red>]</font>+<a name="line-102"></a>+<a name="line-103"></a><a name="closes"></a><font color=Blue>--opening this, implicitly closes that</font>+<a name="line-104"></a><font color=Blue>closes</font> <font color=Red>::</font> Name <font color=Red>-></font> Name <font color=Red>-></font> Bool+<a name="line-105"></a><font color=Magenta>"a"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"a"</font> <font color=Red>=</font> True+<a name="line-106"></a><font color=Magenta>"li"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"li"</font> <font color=Red>=</font> True+<a name="line-107"></a><font color=Magenta>"th"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font> <font color=Red>=</font> True+<a name="line-108"></a><font color=Magenta>"td"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Red>]</font> <font color=Red>=</font> True+<a name="line-109"></a><font color=Magenta>"tr"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"th"</font><font color=Cyan>,</font><font color=Magenta>"td"</font><font color=Cyan>,</font><font color=Magenta>"tr"</font><font color=Red>]</font> <font color=Red>=</font> True+<a name="line-110"></a><font color=Magenta>"dt"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"dt"</font><font color=Cyan>,</font><font color=Magenta>"dd"</font><font color=Red>]</font> <font color=Red>=</font> True+<a name="line-111"></a><font color=Magenta>"dd"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"dt"</font><font color=Cyan>,</font><font color=Magenta>"dd"</font><font color=Red>]</font> <font color=Red>=</font> True+<a name="line-112"></a><font color=Magenta>"form"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"form"</font> <font color=Red>=</font> True+<a name="line-113"></a><font color=Magenta>"label"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"label"</font> <font color=Red>=</font> True+<a name="line-114"></a><font color=Green><u>_</u></font> <font color=Cyan>`closes`</font> <font color=Magenta>"option"</font> <font color=Red>=</font> True+<a name="line-115"></a><font color=Magenta>"thead"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"colgroup"</font><font color=Red>]</font> <font color=Red>=</font> True+<a name="line-116"></a><font color=Magenta>"tfoot"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"thead"</font><font color=Cyan>,</font><font color=Magenta>"colgroup"</font><font color=Red>]</font> <font color=Red>=</font> True+<a name="line-117"></a><font color=Magenta>"tbody"</font> <font color=Cyan>`closes`</font> t <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"tbody"</font><font color=Cyan>,</font><font color=Magenta>"tfoot"</font><font color=Cyan>,</font><font color=Magenta>"thead"</font><font color=Cyan>,</font><font color=Magenta>"colgroup"</font><font color=Red>]</font> <font color=Red>=</font> True+<a name="line-118"></a><font color=Magenta>"colgroup"</font> <font color=Cyan>`closes`</font> <font color=Magenta>"colgroup"</font> <font color=Red>=</font> True+<a name="line-119"></a><a name="closes"></a><font color=Blue>t</font> <font color=Cyan>`closes`</font> <font color=Magenta>"p"</font>+<a name="line-120"></a> <font color=Red>|</font> t <font color=Cyan>`elem`</font> <font color=Red>[</font><font color=Magenta>"p"</font><font color=Cyan>,</font><font color=Magenta>"h1"</font><font color=Cyan>,</font><font color=Magenta>"h2"</font><font color=Cyan>,</font><font color=Magenta>"h3"</font><font color=Cyan>,</font><font color=Magenta>"h4"</font><font color=Cyan>,</font><font color=Magenta>"h5"</font><font color=Cyan>,</font><font color=Magenta>"h6"</font>+<a name="line-121"></a> <font color=Cyan>,</font><font color=Magenta>"hr"</font><font color=Cyan>,</font><font color=Magenta>"div"</font><font color=Cyan>,</font><font color=Magenta>"ul"</font><font color=Cyan>,</font><font color=Magenta>"dl"</font><font color=Cyan>,</font><font color=Magenta>"ol"</font><font color=Cyan>,</font><font color=Magenta>"table"</font><font color=Red>]</font> <font color=Red>=</font> True+<a name="line-122"></a><font color=Green><u>_</u></font> <font color=Cyan>`closes`</font> <font color=Green><u>_</u></font> <font color=Red>=</font> False+<a name="line-123"></a>+<a name="line-124"></a>+<a name="line-125"></a>+<a name="line-126"></a><font color=Blue>---- Misc ----</font>+<a name="line-127"></a>+<a name="line-128"></a><a name="fst3"></a><font color=Blue>fst3</font> <font color=Cyan>(</font>a<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> a+<a name="line-129"></a><a name="snd3"></a><font color=Blue>snd3</font> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font>a<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> a+<a name="line-130"></a><a name="thd3"></a><font color=Blue>thd3</font> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font>a<font color=Cyan>)</font> <font color=Red>=</font> a+<a name="line-131"></a>+<a name="line-132"></a>+<a name="line-133"></a>+<a name="line-134"></a><font color=Blue>---- Auxiliary Parsing Functions ----</font>+<a name="line-135"></a>+<a name="line-136"></a><a name="HParser"></a><font color=Green><u>type</u></font> HParser a <font color=Red>=</font> Parser <font color=Cyan>(</font>Posn<font color=Cyan>,</font>TokenT<font color=Cyan>)</font> a+<a name="line-137"></a>+<a name="line-138"></a><a name="tok"></a><font color=Blue>tok</font> <font color=Red>::</font> TokenT <font color=Red>-></font> HParser TokenT+<a name="line-139"></a><font color=Blue>tok</font> t <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t'<font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-140"></a> <font color=Green><u>case</u></font> t' <font color=Green><u>of</u></font> TokError s <font color=Red>-></font> report failBad <font color=Cyan>(</font>show t<font color=Cyan>)</font> p t'+<a name="line-141"></a> <font color=Green><u>_</u></font> <font color=Red>|</font> t'<font color=Cyan>==</font>t <font color=Red>-></font> return t+<a name="line-142"></a> <font color=Red>|</font> otherwise <font color=Red>-></font> report fail <font color=Cyan>(</font>show t<font color=Cyan>)</font> p t'+<a name="line-143"></a>+<a name="line-144"></a><a name="name"></a><font color=Blue>name</font> <font color=Red>::</font> HParser Name+<a name="line-145"></a><font color=Blue>--name = do {(p,TokName s) <- next; return s}</font>+<a name="line-146"></a><font color=Blue>name</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>tok<font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-147"></a> <font color=Green><u>case</u></font> tok <font color=Green><u>of</u></font> +<a name="line-148"></a> TokName s <font color=Red>-></font> return s +<a name="line-149"></a> TokError s <font color=Red>-></font> report failBad <font color=Magenta>"a name"</font> p tok+<a name="line-150"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"a name"</font> p tok+<a name="line-151"></a>+<a name="line-152"></a><a name="string"></a><font color=Blue>string</font><font color=Cyan>,</font> freetext <font color=Red>::</font> HParser String+<a name="line-153"></a><font color=Blue>string</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-154"></a> <font color=Green><u>case</u></font> t <font color=Green><u>of</u></font> TokName s <font color=Red>-></font> return s+<a name="line-155"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"text"</font> p t+<a name="line-156"></a><a name="freetext"></a><font color=Blue>freetext</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-157"></a> <font color=Green><u>case</u></font> t <font color=Green><u>of</u></font> TokFreeText s <font color=Red>-></font> return s+<a name="line-158"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"text"</font> p t+<a name="line-159"></a>+<a name="line-160"></a><a name="maybe"></a><font color=Blue>maybe</font> <font color=Red>::</font> HParser a <font color=Red>-></font> HParser <font color=Cyan>(</font>Maybe a<font color=Cyan>)</font>+<a name="line-161"></a><font color=Blue>maybe</font> p <font color=Red>=</font>+<a name="line-162"></a> <font color=Cyan>(</font> p <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Just<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-163"></a> <font color=Cyan>(</font> return Nothing<font color=Cyan>)</font>+<a name="line-164"></a>+<a name="line-165"></a><a name="either"></a><font color=Blue>either</font> <font color=Red>::</font> HParser a <font color=Red>-></font> HParser b <font color=Red>-></font> HParser <font color=Cyan>(</font>Either a b<font color=Cyan>)</font>+<a name="line-166"></a><font color=Blue>either</font> p q <font color=Red>=</font>+<a name="line-167"></a> <font color=Cyan>(</font> p <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Left<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-168"></a> <font color=Cyan>(</font> q <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Right<font color=Cyan>)</font>+<a name="line-169"></a>+<a name="line-170"></a><a name="word"></a><font color=Blue>word</font> <font color=Red>::</font> String <font color=Red>-></font> HParser ()+<a name="line-171"></a><font color=Blue>word</font> s <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> x <font color=Red><-</font> next+<a name="line-172"></a> <font color=Cyan>;</font> <font color=Green><u>case</u></font> x <font color=Green><u>of</u></font>+<a name="line-173"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>TokName n<font color=Cyan>)</font> <font color=Red>|</font> s<font color=Cyan>==</font>n <font color=Red>-></font> return ()+<a name="line-174"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>TokFreeText n<font color=Cyan>)</font> <font color=Red>|</font> s<font color=Cyan>==</font>n <font color=Red>-></font> return ()+<a name="line-175"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Red>@</font><font color=Cyan>(</font>TokError <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> report failBad <font color=Cyan>(</font>show s<font color=Cyan>)</font> p t+<a name="line-176"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red>-></font> report fail <font color=Cyan>(</font>show s<font color=Cyan>)</font> p t+<a name="line-177"></a> <font color=Cyan>}</font>+<a name="line-178"></a>+<a name="line-179"></a><a name="posn"></a><font color=Blue>posn</font> <font color=Red>::</font> HParser Posn+<a name="line-180"></a><font color=Blue>posn</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> x<font color=Red>@</font><font color=Cyan>(</font>p<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-181"></a> <font color=Cyan>;</font> reparse <font color=Red>[</font>x<font color=Red>]</font>+<a name="line-182"></a> <font color=Cyan>;</font> return p+<a name="line-183"></a> <font color=Cyan>}</font> <font color=Cyan>`onFail`</font> return noPos+<a name="line-184"></a>+<a name="line-185"></a><a name="nmtoken"></a><font color=Blue>nmtoken</font> <font color=Red>::</font> HParser NmToken+<a name="line-186"></a><font color=Blue>nmtoken</font> <font color=Red>=</font> <font color=Cyan>(</font>string <font color=Cyan>`onFail`</font> freetext<font color=Cyan>)</font>+<a name="line-187"></a>+<a name="line-188"></a><a name="failP"></a><font color=Blue>failP</font><font color=Cyan>,</font> failBadP <font color=Red>::</font> String <font color=Red>-></font> HParser a+<a name="line-189"></a><font color=Blue>failP</font> msg <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn<font color=Cyan>;</font> fail <font color=Cyan>(</font>msg<font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font> <font color=Cyan>}</font>+<a name="line-190"></a><a name="failBadP"></a><font color=Blue>failBadP</font> msg <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn<font color=Cyan>;</font> failBad <font color=Cyan>(</font>msg<font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font> <font color=Cyan>}</font>+<a name="line-191"></a>+<a name="line-192"></a><a name="report"></a><font color=Blue>report</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>HParser a<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> Posn <font color=Red>-></font> TokenT <font color=Red>-></font> HParser a+<a name="line-193"></a><font color=Blue>report</font> fail exp p t <font color=Red>=</font> fail <font color=Cyan>(</font><font color=Magenta>"Expected "</font><font color=Cyan>++</font>show exp<font color=Cyan>++</font><font color=Magenta>" but found "</font><font color=Cyan>++</font>show t+<a name="line-194"></a> <font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>+<a name="line-195"></a>+<a name="line-196"></a><a name="adjustErrP"></a><font color=Blue>adjustErrP</font> <font color=Red>::</font> HParser a <font color=Red>-></font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Cyan>)</font> <font color=Red>-></font> HParser a+<a name="line-197"></a><a name="adjustErrP"></a><font color=Blue>p</font> <font color=Cyan>`adjustErrP`</font> f <font color=Red>=</font> p <font color=Cyan>`onFail`</font> <font color=Green><u>do</u></font> pn <font color=Red><-</font> posn+<a name="line-198"></a> <font color=Cyan>(</font>p <font color=Cyan>`adjustErr`</font> f<font color=Cyan>)</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>++</font>show pn<font color=Cyan>)</font>+<a name="line-199"></a>+<a name="line-200"></a><font color=Blue>---- XML Parsing Functions ----</font>+<a name="line-201"></a>+<a name="line-202"></a><a name="document"></a><font color=Blue>document</font> <font color=Red>::</font> HParser <font color=Cyan>(</font>Document Posn<font color=Cyan>)</font>+<a name="line-203"></a><font color=Blue>document</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-204"></a> return Document+<a name="line-205"></a> <font color=Cyan>`apply`</font> <font color=Cyan>(</font>prolog <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"unrecognisable XML prolog\n"</font><font color=Cyan>++</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-206"></a> <font color=Cyan>`apply`</font> <font color=Cyan>(</font>return emptyST<font color=Cyan>)</font>+<a name="line-207"></a> <font color=Cyan>`apply`</font> <font color=Cyan>(</font><font color=Green><u>do</u></font> es <font color=Red><-</font> many1 <font color=Cyan>(</font>element <font color=Magenta>"HTML document"</font><font color=Cyan>)</font>+<a name="line-208"></a> return <font color=Cyan>(</font><font color=Green><u>case</u></font> map snd es <font color=Green><u>of</u></font>+<a name="line-209"></a> <font color=Red>[</font>e<font color=Red>]</font> <font color=Red>-></font> e+<a name="line-210"></a> es <font color=Red>-></font> Elem <font color=Magenta>"html"</font> [] <font color=Cyan>(</font>map mkCElem es<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-211"></a> <font color=Cyan>`apply`</font> <font color=Cyan>(</font>many misc<font color=Cyan>)</font>+<a name="line-212"></a> <font color=Green><u>where</u></font> mkCElem e <font color=Red>=</font> CElem e noPos+<a name="line-213"></a>+<a name="line-214"></a><a name="comment"></a><font color=Blue>comment</font> <font color=Red>::</font> HParser Comment+<a name="line-215"></a><font color=Blue>comment</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-216"></a> bracket <font color=Cyan>(</font>tok TokCommentOpen<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokCommentClose<font color=Cyan>)</font> freetext+<a name="line-217"></a>+<a name="line-218"></a><a name="processinginstruction"></a><font color=Blue>processinginstruction</font> <font color=Red>::</font> HParser ProcessingInstruction+<a name="line-219"></a><font color=Blue>processinginstruction</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-220"></a> tok TokPIOpen+<a name="line-221"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>+<a name="line-222"></a> n <font color=Red><-</font> string <font color=Cyan>`onFail`</font> failP <font color=Magenta>"processing instruction has no target"</font>+<a name="line-223"></a> f <font color=Red><-</font> freetext+<a name="line-224"></a> <font color=Cyan>(</font>tok TokPIClose <font color=Cyan>`onFail`</font> tok TokAnyClose<font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing ?> or >"</font>+<a name="line-225"></a> return <font color=Cyan>(</font>n<font color=Cyan>,</font> f<font color=Cyan>)</font>+<a name="line-226"></a>+<a name="line-227"></a><a name="cdsect"></a><font color=Blue>cdsect</font> <font color=Red>::</font> HParser CDSect+<a name="line-228"></a><font color=Blue>cdsect</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-229"></a> tok TokSectionOpen+<a name="line-230"></a> bracket <font color=Cyan>(</font>tok <font color=Cyan>(</font>TokSection CDATAx<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSectionClose<font color=Cyan>)</font> chardata+<a name="line-231"></a>+<a name="line-232"></a><a name="prolog"></a><font color=Blue>prolog</font> <font color=Red>::</font> HParser Prolog+<a name="line-233"></a><font color=Blue>prolog</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-234"></a> x <font color=Red><-</font> maybe xmldecl+<a name="line-235"></a> m1 <font color=Red><-</font> many misc+<a name="line-236"></a> dtd <font color=Red><-</font> maybe doctypedecl+<a name="line-237"></a> m2 <font color=Red><-</font> many misc+<a name="line-238"></a> return <font color=Cyan>(</font>Prolog x m1 dtd m2<font color=Cyan>)</font>+<a name="line-239"></a>+<a name="line-240"></a><a name="xmldecl"></a><font color=Blue>xmldecl</font> <font color=Red>::</font> HParser XMLDecl+<a name="line-241"></a><font color=Blue>xmldecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-242"></a> tok TokPIOpen+<a name="line-243"></a> <font color=Cyan>(</font>word <font color=Magenta>"xml"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"XML"</font><font color=Cyan>)</font>+<a name="line-244"></a> p <font color=Red><-</font> posn+<a name="line-245"></a> s <font color=Red><-</font> freetext+<a name="line-246"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing ?> in <?xml ...?>"</font>+<a name="line-247"></a> <font color=Cyan>(</font>return <font color=Cyan>.</font> fst <font color=Cyan>.</font> runParser aux <font color=Cyan>.</font> xmlReLex p<font color=Cyan>)</font> s+<a name="line-248"></a> <font color=Green><u>where</u></font>+<a name="line-249"></a> aux <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-250"></a> v <font color=Red><-</font> versioninfo <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing XML version info"</font>+<a name="line-251"></a> e <font color=Red><-</font> maybe encodingdecl+<a name="line-252"></a> s <font color=Red><-</font> maybe sddecl+<a name="line-253"></a> return <font color=Cyan>(</font>XMLDecl v e s<font color=Cyan>)</font>+<a name="line-254"></a>+<a name="line-255"></a><a name="versioninfo"></a><font color=Blue>versioninfo</font> <font color=Red>::</font> HParser VersionInfo+<a name="line-256"></a><font color=Blue>versioninfo</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-257"></a> <font color=Cyan>(</font>word <font color=Magenta>"version"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"VERSION"</font><font color=Cyan>)</font>+<a name="line-258"></a> tok TokEqual+<a name="line-259"></a> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext+<a name="line-260"></a>+<a name="line-261"></a><a name="misc"></a><font color=Blue>misc</font> <font color=Red>::</font> HParser Misc+<a name="line-262"></a><font color=Blue>misc</font> <font color=Red>=</font> +<a name="line-263"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"<!--comment-->"</font><font color=Cyan>,</font> comment <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Comment<font color=Cyan>)</font>+<a name="line-264"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"<?PI?>"</font><font color=Cyan>,</font> processinginstruction <font color=Cyan>>>=</font> return <font color=Cyan>.</font> PI<font color=Cyan>)</font>+<a name="line-265"></a> <font color=Red>]</font>+<a name="line-266"></a>+<a name="line-267"></a>+<a name="line-268"></a><font color=Blue>-- Question: for HTML, should we disallow in-line DTDs, allowing only externals?</font>+<a name="line-269"></a><font color=Blue>-- Answer: I think so.</font>+<a name="line-270"></a>+<a name="line-271"></a><a name="doctypedecl"></a><font color=Blue>doctypedecl</font> <font color=Red>::</font> HParser DocTypeDecl+<a name="line-272"></a><font color=Blue>doctypedecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-273"></a> tok TokSpecialOpen+<a name="line-274"></a> tok <font color=Cyan>(</font>TokSpecial DOCTYPEx<font color=Cyan>)</font>+<a name="line-275"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>+<a name="line-276"></a> n <font color=Red><-</font> name+<a name="line-277"></a> eid <font color=Red><-</font> maybe externalid+<a name="line-278"></a><font color=Blue>-- es <- maybe (bracket (tok TokSqOpen) (tok TokSqClose)) (many markupdecl)</font>+<a name="line-279"></a> tok TokAnyClose <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing > in DOCTYPE decl"</font>+<a name="line-280"></a><font color=Blue>-- return (DTD n eid (case es of { Nothing -> []; Just e -> e }))</font>+<a name="line-281"></a> return <font color=Cyan>(</font>DTD n eid []<font color=Cyan>)</font>+<a name="line-282"></a>+<a name="line-283"></a><font color=Blue>--markupdecl :: HParser MarkupDecl</font>+<a name="line-284"></a><font color=Blue>--markupdecl =</font>+<a name="line-285"></a><font color=Blue>-- ( elementdecl >>= return . Element) `onFail`</font>+<a name="line-286"></a><font color=Blue>-- ( attlistdecl >>= return . AttList) `onFail`</font>+<a name="line-287"></a><font color=Blue>-- ( entitydecl >>= return . Entity) `onFail`</font>+<a name="line-288"></a><font color=Blue>-- ( notationdecl >>= return . Notation) `onFail`</font>+<a name="line-289"></a><font color=Blue>-- ( misc >>= return . MarkupMisc) `onFail`</font>+<a name="line-290"></a><font color=Blue>-- PEREF(MarkupPE,markupdecl)</font>+<a name="line-291"></a><font color=Blue>--</font>+<a name="line-292"></a><font color=Blue>--extsubset :: HParser ExtSubset</font>+<a name="line-293"></a><font color=Blue>--extsubset = do</font>+<a name="line-294"></a><font color=Blue>-- td <- maybe textdecl</font>+<a name="line-295"></a><font color=Blue>-- ds <- many extsubsetdecl</font>+<a name="line-296"></a><font color=Blue>-- return (ExtSubset td ds)</font>+<a name="line-297"></a><font color=Blue>--</font>+<a name="line-298"></a><font color=Blue>--extsubsetdecl :: HParser ExtSubsetDecl</font>+<a name="line-299"></a><font color=Blue>--extsubsetdecl =</font>+<a name="line-300"></a><font color=Blue>-- ( markupdecl >>= return . ExtMarkupDecl) `onFail`</font>+<a name="line-301"></a><font color=Blue>-- ( conditionalsect >>= return . ExtConditionalSect) `onFail`</font>+<a name="line-302"></a><font color=Blue>-- PEREF(ExtPEReference,extsubsetdecl)</font>+<a name="line-303"></a>+<a name="line-304"></a><a name="sddecl"></a><font color=Blue>sddecl</font> <font color=Red>::</font> HParser SDDecl+<a name="line-305"></a><font color=Blue>sddecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-306"></a> <font color=Cyan>(</font>word <font color=Magenta>"standalone"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"STANDALONE"</font><font color=Cyan>)</font>+<a name="line-307"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>+<a name="line-308"></a> tok TokEqual <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing = in 'standalone' decl"</font>+<a name="line-309"></a> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font>+<a name="line-310"></a> <font color=Cyan>(</font> <font color=Cyan>(</font>word <font color=Magenta>"yes"</font> <font color=Cyan>>></font> return True<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-311"></a> <font color=Cyan>(</font>word <font color=Magenta>"no"</font> <font color=Cyan>>></font> return False<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-312"></a> failP <font color=Magenta>"'standalone' decl requires 'yes' or 'no' value"</font> <font color=Cyan>)</font>+<a name="line-313"></a>+<a name="line-314"></a>+<a name="line-315"></a>+<a name="line-316"></a>+<a name="line-317"></a><a name="Stack"></a><font color=Blue>----</font>+<a name="line-318"></a><a name="Stack"></a><font color=Blue>-- VERY IMPORTANT NOTE: The stack returned here contains those tags which</font>+<a name="line-319"></a><a name="Stack"></a><font color=Blue>-- have been closed implicitly and need to be reopened again at the</font>+<a name="line-320"></a><a name="Stack"></a><font color=Blue>-- earliest opportunity.</font>+<a name="line-321"></a><a name="Stack"></a><font color=Green><u>type</u></font> Stack <font color=Red>=</font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>Attribute<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font>+<a name="line-322"></a>+<a name="line-323"></a><a name="element"></a><font color=Blue>element</font> <font color=Red>::</font> Name <font color=Red>-></font> HParser <font color=Cyan>(</font>Stack<font color=Cyan>,</font>Element Posn<font color=Cyan>)</font>+<a name="line-324"></a><font color=Blue>element</font> ctx <font color=Red>=</font>+<a name="line-325"></a> <font color=Green><u>do</u></font>+<a name="line-326"></a> tok TokAnyOpen+<a name="line-327"></a> <font color=Cyan>(</font>ElemTag e avs<font color=Cyan>)</font> <font color=Red><-</font> elemtag+<a name="line-328"></a> <font color=Cyan>(</font> <font color=Green><u>if</u></font> e <font color=Cyan>`closes`</font> ctx <font color=Green><u>then</u></font>+<a name="line-329"></a> <font color=Blue>-- insert the missing close-tag, fail forward, and reparse.</font>+<a name="line-330"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> debug <font color=Cyan>(</font><font color=Magenta>"/"</font><font color=Cyan>)</font>+<a name="line-331"></a> unparse <font color=Cyan>(</font><font color=Red>[</font>TokEndOpen<font color=Cyan>,</font> TokName ctx<font color=Cyan>,</font> TokAnyClose<font color=Cyan>,</font>+<a name="line-332"></a> TokAnyOpen<font color=Cyan>,</font> TokName e<font color=Red>]</font> <font color=Cyan>++</font> reformatAttrs avs<font color=Cyan>)</font>+<a name="line-333"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> Elem <font color=Magenta>"null"</font> [] []<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-334"></a> <font color=Green><u>else</u></font> <font color=Green><u>if</u></font> e <font color=Cyan>`elem`</font> selfclosingtags <font color=Green><u>then</u></font>+<a name="line-335"></a> <font color=Blue>-- complete the parse straightaway.</font>+<a name="line-336"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokEndClose <font color=Blue>-- self-closing <tag /> </font>+<a name="line-337"></a> debug <font color=Cyan>(</font>e<font color=Cyan>++</font><font color=Magenta>"[+]"</font><font color=Cyan>)</font>+<a name="line-338"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> Elem e avs []<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-339"></a> <font color=Blue>-- ( do tok TokAnyClose -- sequence <tag></tag> (**not HTML?**)</font>+<a name="line-340"></a> <font color=Blue>-- debug (e++"[+")</font>+<a name="line-341"></a> <font color=Blue>-- n <- bracket (tok TokEndOpen) (tok TokAnyClose) name</font>+<a name="line-342"></a> <font color=Blue>-- debug "]"</font>+<a name="line-343"></a> <font color=Blue>-- if e == (map toLower n :: Name) </font>+<a name="line-344"></a> <font color=Blue>-- then return ([], Elem e avs []) </font>+<a name="line-345"></a> <font color=Blue>-- else return (error "no nesting in empty tag")) `onFail`</font>+<a name="line-346"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokAnyClose <font color=Blue>-- <tag> with no close (e.g. <IMG>)</font>+<a name="line-347"></a> debug <font color=Cyan>(</font>e<font color=Cyan>++</font><font color=Magenta>"[+]"</font><font color=Cyan>)</font>+<a name="line-348"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> Elem e avs []<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-349"></a> <font color=Green><u>else</u></font>+<a name="line-350"></a> <font color=Cyan>(</font><font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokEndClose+<a name="line-351"></a> debug <font color=Cyan>(</font>e<font color=Cyan>++</font><font color=Magenta>"[]"</font><font color=Cyan>)</font>+<a name="line-352"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> Elem e avs []<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-353"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokAnyClose <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing > or /> in element tag"</font>+<a name="line-354"></a> debug <font color=Cyan>(</font>e<font color=Cyan>++</font><font color=Magenta>"["</font><font color=Cyan>)</font>+<a name="line-355"></a> return <font color=Cyan>(</font><font color=Red>\</font> interior<font color=Red>-></font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>stack<font color=Cyan>,</font>contained<font color=Cyan>)</font> <font color=Red>=</font> interior+<a name="line-356"></a> <font color=Green><u>in</u></font> <font color=Cyan>(</font>stack<font color=Cyan>,</font> Elem e avs contained<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-357"></a> <font color=Cyan>`apply`</font>+<a name="line-358"></a> <font color=Cyan>(</font><font color=Green><u>do</u></font> zz <font color=Red><-</font> manyFinally <font color=Cyan>(</font>content e<font color=Cyan>)</font>+<a name="line-359"></a> <font color=Cyan>(</font>tok TokEndOpen<font color=Cyan>)</font>+<a name="line-360"></a> n <font color=Red><-</font> name+<a name="line-361"></a> commit <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font>+<a name="line-362"></a> debug <font color=Magenta>"]"</font>+<a name="line-363"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>ss<font color=Cyan>,</font>cs<font color=Cyan>)</font> <font color=Red>=</font> unzip zz+<a name="line-364"></a> <font color=Green><u>let</u></font> s <font color=Red>=</font> <font color=Green><u>if</u></font> null ss <font color=Green><u>then</u></font> [] <font color=Green><u>else</u></font> last ss+<a name="line-365"></a> <font color=Cyan>(</font> <font color=Green><u>if</u></font> e <font color=Cyan>==</font> <font color=Cyan>(</font>map toLower n <font color=Red>::</font> Name<font color=Cyan>)</font> <font color=Green><u>then</u></font>+<a name="line-366"></a> <font color=Green><u>do</u></font> unparse <font color=Cyan>(</font>reformatTags <font color=Cyan>(</font>closeInner e s<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-367"></a> debug <font color=Magenta>"^"</font>+<a name="line-368"></a> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> cs<font color=Cyan>)</font>+<a name="line-369"></a> <font color=Green><u>else</u></font>+<a name="line-370"></a> <font color=Green><u>do</u></font> unparse <font color=Red>[</font>TokEndOpen<font color=Cyan>,</font> TokName n<font color=Cyan>,</font> TokAnyClose<font color=Red>]</font>+<a name="line-371"></a> debug <font color=Magenta>"-"</font>+<a name="line-372"></a> return <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>(</font>e<font color=Cyan>,</font>avs<font color=Cyan>)</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font><font color=Cyan>,</font> cs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-373"></a> <font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failP <font color=Cyan>(</font><font color=Magenta>"failed to repair non-matching tags in context: "</font><font color=Cyan>++</font>ctx<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-374"></a>+<a name="line-375"></a><a name="closeInner"></a><font color=Blue>closeInner</font> <font color=Red>::</font> Name <font color=Red>-></font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>Attribute<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font><font color=Red>[</font>Attribute<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font>+<a name="line-376"></a><font color=Blue>closeInner</font> c ts <font color=Red>=</font>+<a name="line-377"></a> <font color=Green><u>case</u></font> lookup c closeInnerTags <font color=Green><u>of</u></font>+<a name="line-378"></a> <font color=Cyan>(</font>Just these<font color=Cyan>)</font> <font color=Red>-></font> filter <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>`notElem`</font> these<font color=Cyan>)</font><font color=Cyan>.</font>fst<font color=Cyan>)</font> ts+<a name="line-379"></a> Nothing <font color=Red>-></font> ts+<a name="line-380"></a>+<a name="line-381"></a><a name="unparse"></a><font color=Blue>unparse</font> ts <font color=Red>=</font> <font color=Green><u>do</u></font> p <font color=Red><-</font> posn+<a name="line-382"></a> reparse <font color=Cyan>(</font>zip <font color=Cyan>(</font>repeat p<font color=Cyan>)</font> ts<font color=Cyan>)</font>+<a name="line-383"></a>+<a name="line-384"></a><a name="reformatAttrs"></a><font color=Blue>reformatAttrs</font> avs <font color=Red>=</font> concatMap f0 avs+<a name="line-385"></a> <font color=Green><u>where</u></font> f0 <font color=Cyan>(</font>a<font color=Cyan>,</font> v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>TokName a<font color=Cyan>,</font> TokEqual<font color=Cyan>,</font> TokQuote<font color=Cyan>,</font>+<a name="line-386"></a> TokFreeText <font color=Cyan>(</font>show v<font color=Cyan>)</font><font color=Cyan>,</font> TokQuote<font color=Red>]</font>+<a name="line-387"></a><a name="reformatTags"></a><font color=Blue>reformatTags</font> ts <font color=Red>=</font> concatMap f0 ts+<a name="line-388"></a> <font color=Green><u>where</u></font> f0 <font color=Cyan>(</font>t<font color=Cyan>,</font>avs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>TokAnyOpen<font color=Cyan>,</font> TokName t<font color=Red>]</font><font color=Cyan>++</font>reformatAttrs avs<font color=Cyan>++</font><font color=Red>[</font>TokAnyClose<font color=Red>]</font>+<a name="line-389"></a>+<a name="line-390"></a><a name="content"></a><font color=Blue>content</font> <font color=Red>::</font> Name <font color=Red>-></font> HParser <font color=Cyan>(</font>Stack<font color=Cyan>,</font>Content Posn<font color=Cyan>)</font>+<a name="line-391"></a><font color=Blue>content</font> ctx <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn <font color=Cyan>;</font> content' p ctx <font color=Cyan>}</font>+<a name="line-392"></a> <font color=Green><u>where</u></font> content' p ctx <font color=Red>=</font> oneOf'+<a name="line-393"></a> <font color=Red>[</font> <font color=Cyan>(</font> <font color=Magenta>"element"</font><font color=Cyan>,</font> element ctx <font color=Cyan>>>=</font> <font color=Red>\</font><font color=Cyan>(</font>s<font color=Cyan>,</font>e<font color=Cyan>)</font><font color=Red>-></font> return <font color=Cyan>(</font>s<font color=Cyan>,</font> CElem e p<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-394"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"chardata"</font><font color=Cyan>,</font> chardata <font color=Cyan>>>=</font> <font color=Red>\</font>s<font color=Red>-></font> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> CString False s p<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-395"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"reference"</font><font color=Cyan>,</font> reference <font color=Cyan>>>=</font> <font color=Red>\</font>r<font color=Red>-></font> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> CRef r p<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-396"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"cdsect"</font><font color=Cyan>,</font> cdsect <font color=Cyan>>>=</font> <font color=Red>\</font>c<font color=Red>-></font> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> CString True c p<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-397"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"misc"</font><font color=Cyan>,</font> misc <font color=Cyan>>>=</font> <font color=Red>\</font>m<font color=Red>-></font> return <font color=Cyan>(</font>[]<font color=Cyan>,</font> CMisc m p<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-398"></a> <font color=Red>]</font> <font color=Cyan>`adjustErrP`</font> <font color=Cyan>(</font><font color=Magenta>"when looking for a content item,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-399"></a>+<a name="line-400"></a><a name="elemtag"></a><font color=Blue>----</font>+<a name="line-401"></a><font color=Blue>elemtag</font> <font color=Red>::</font> HParser ElemTag+<a name="line-402"></a><font color=Blue>elemtag</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-403"></a> n <font color=Red><-</font> name <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Magenta>"malformed element tag\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-404"></a> <font color=Green><u>as</u></font> <font color=Red><-</font> many attribute+<a name="line-405"></a> return <font color=Cyan>(</font>ElemTag <font color=Cyan>(</font>map toLower n<font color=Cyan>)</font> <font color=Green><u>as</u></font><font color=Cyan>)</font>+<a name="line-406"></a>+<a name="line-407"></a><a name="attribute"></a><font color=Blue>attribute</font> <font color=Red>::</font> HParser Attribute+<a name="line-408"></a><font color=Blue>attribute</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-409"></a> n <font color=Red><-</font> name+<a name="line-410"></a> v <font color=Red><-</font> <font color=Cyan>(</font><font color=Green><u>do</u></font> tok TokEqual+<a name="line-411"></a> attvalue<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-412"></a> <font color=Cyan>(</font>return <font color=Cyan>(</font>AttValue <font color=Red>[</font>Left <font color=Magenta>"TRUE"</font><font color=Red>]</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-413"></a> return <font color=Cyan>(</font>map toLower n<font color=Cyan>,</font>v<font color=Cyan>)</font>+<a name="line-414"></a>+<a name="line-415"></a><font color=Blue>--elementdecl :: HParser ElementDecl</font>+<a name="line-416"></a><font color=Blue>--elementdecl = do</font>+<a name="line-417"></a><font color=Blue>-- tok TokSpecialOpen</font>+<a name="line-418"></a><font color=Blue>-- tok (TokSpecial ELEMENTx)</font>+<a name="line-419"></a><font color=Blue>-- n <- name `onFail` failP "missing identifier in ELEMENT decl"</font>+<a name="line-420"></a><font color=Blue>-- c <- contentspec `onFail` failP "missing content spec in ELEMENT decl"</font>+<a name="line-421"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "expected > terminating ELEMENT decl"</font>+<a name="line-422"></a><font color=Blue>-- return (ElementDecl n c)</font>+<a name="line-423"></a><font color=Blue>--</font>+<a name="line-424"></a><font color=Blue>--contentspec :: HParser ContentSpec</font>+<a name="line-425"></a><font color=Blue>--contentspec =</font>+<a name="line-426"></a><font color=Blue>-- ( word "EMPTY" >> return EMPTY) `onFail`</font>+<a name="line-427"></a><font color=Blue>-- ( word "ANY" >> return ANY) `onFail`</font>+<a name="line-428"></a><font color=Blue>-- ( mixed >>= return . Mixed) `onFail`</font>+<a name="line-429"></a><font color=Blue>-- ( cp >>= return . ContentSpec) `onFail`</font>+<a name="line-430"></a><font color=Blue>-- PEREF(ContentPE,contentspec)</font>+<a name="line-431"></a><font color=Blue>--</font>+<a name="line-432"></a><font color=Blue>--choice :: HParser [CP]</font>+<a name="line-433"></a><font color=Blue>--choice = do</font>+<a name="line-434"></a><font color=Blue>-- bracket (tok TokBraOpen) (tok TokBraClose)</font>+<a name="line-435"></a><font color=Blue>-- (cp `sepby1` (tok TokPipe))</font>+<a name="line-436"></a><font color=Blue>--</font>+<a name="line-437"></a><font color=Blue>--sequence :: HParser [CP]</font>+<a name="line-438"></a><font color=Blue>--sequence = do</font>+<a name="line-439"></a><font color=Blue>-- bracket (tok TokBraOpen) (tok TokBraClose)</font>+<a name="line-440"></a><font color=Blue>-- (cp `sepby1` (tok TokComma))</font>+<a name="line-441"></a><font color=Blue>--</font>+<a name="line-442"></a><font color=Blue>--cp :: HParser CP</font>+<a name="line-443"></a><font color=Blue>--cp =</font>+<a name="line-444"></a><font color=Blue>-- ( do n <- name</font>+<a name="line-445"></a><font color=Blue>-- m <- modifier</font>+<a name="line-446"></a><font color=Blue>-- return (TagName n m)) `onFail`</font>+<a name="line-447"></a><font color=Blue>-- ( do ss <- sequence</font>+<a name="line-448"></a><font color=Blue>-- m <- modifier</font>+<a name="line-449"></a><font color=Blue>-- return (Seq ss m)) `onFail`</font>+<a name="line-450"></a><font color=Blue>-- ( do cs <- choice</font>+<a name="line-451"></a><font color=Blue>-- m <- modifier</font>+<a name="line-452"></a><font color=Blue>-- return (Choice cs m)) `onFail`</font>+<a name="line-453"></a><font color=Blue>-- PEREF(CPPE,cp)</font>+<a name="line-454"></a><font color=Blue>--</font>+<a name="line-455"></a><font color=Blue>--modifier :: HParser Modifier</font>+<a name="line-456"></a><font color=Blue>--modifier =</font>+<a name="line-457"></a><font color=Blue>-- ( tok TokStar >> return Star) `onFail`</font>+<a name="line-458"></a><font color=Blue>-- ( tok TokQuery >> return Query) `onFail`</font>+<a name="line-459"></a><font color=Blue>-- ( tok TokPlus >> return Plus) `onFail`</font>+<a name="line-460"></a><font color=Blue>-- ( return None)</font>+<a name="line-461"></a><font color=Blue>--</font>+<a name="line-462"></a><font color=Blue>--mixed :: HParser Mixed</font>+<a name="line-463"></a><font color=Blue>--mixed = do</font>+<a name="line-464"></a><font color=Blue>-- tok TokBraOpen</font>+<a name="line-465"></a><font color=Blue>-- tok TokHash</font>+<a name="line-466"></a><font color=Blue>-- word "PCDATA"</font>+<a name="line-467"></a><font color=Blue>-- cont</font>+<a name="line-468"></a><font color=Blue>-- where</font>+<a name="line-469"></a><font color=Blue>-- cont = ( tok TokBraClose >> return PCDATA) `onFail`</font>+<a name="line-470"></a><font color=Blue>-- ( do cs <- many ( do tok TokPipe</font>+<a name="line-471"></a><font color=Blue>-- n <- name</font>+<a name="line-472"></a><font color=Blue>-- return n)</font>+<a name="line-473"></a><font color=Blue>-- tok TokBraClose</font>+<a name="line-474"></a><font color=Blue>-- tok TokStar</font>+<a name="line-475"></a><font color=Blue>-- return (PCDATAplus cs))</font>+<a name="line-476"></a><font color=Blue>--</font>+<a name="line-477"></a><font color=Blue>--attlistdecl :: HParser AttListDecl</font>+<a name="line-478"></a><font color=Blue>--attlistdecl = do</font>+<a name="line-479"></a><font color=Blue>-- tok TokSpecialOpen</font>+<a name="line-480"></a><font color=Blue>-- tok (TokSpecial ATTLISTx)</font>+<a name="line-481"></a><font color=Blue>-- n <- name `onFail` failP "missing identifier in ATTLIST"</font>+<a name="line-482"></a><font color=Blue>-- ds <- many attdef</font>+<a name="line-483"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "missing > terminating ATTLIST"</font>+<a name="line-484"></a><font color=Blue>-- return (AttListDecl n ds)</font>+<a name="line-485"></a><font color=Blue>--</font>+<a name="line-486"></a><font color=Blue>--attdef :: HParser AttDef</font>+<a name="line-487"></a><font color=Blue>--attdef = do</font>+<a name="line-488"></a><font color=Blue>-- n <- name</font>+<a name="line-489"></a><font color=Blue>-- t <- atttype `onFail` failP "missing attribute type in attlist defn"</font>+<a name="line-490"></a><font color=Blue>-- d <- defaultdecl</font>+<a name="line-491"></a><font color=Blue>-- return (AttDef n t d)</font>+<a name="line-492"></a><font color=Blue>--</font>+<a name="line-493"></a><font color=Blue>--atttype :: HParser AttType</font>+<a name="line-494"></a><font color=Blue>--atttype =</font>+<a name="line-495"></a><font color=Blue>-- ( word "CDATA" >> return StringType) `onFail`</font>+<a name="line-496"></a><font color=Blue>-- ( tokenizedtype >>= return . TokenizedType) `onFail`</font>+<a name="line-497"></a><font color=Blue>-- ( enumeratedtype >>= return . EnumeratedType)</font>+<a name="line-498"></a><font color=Blue>--</font>+<a name="line-499"></a><font color=Blue>--tokenizedtype :: HParser TokenizedType</font>+<a name="line-500"></a><font color=Blue>--tokenizedtype =</font>+<a name="line-501"></a><font color=Blue>-- ( word "ID" >> return ID) `onFail`</font>+<a name="line-502"></a><font color=Blue>-- ( word "IDREF" >> return IDREF) `onFail`</font>+<a name="line-503"></a><font color=Blue>-- ( word "IDREFS" >> return IDREFS) `onFail`</font>+<a name="line-504"></a><font color=Blue>-- ( word "ENTITY" >> return ENTITY) `onFail`</font>+<a name="line-505"></a><font color=Blue>-- ( word "ENTITIES" >> return ENTITIES) `onFail`</font>+<a name="line-506"></a><font color=Blue>-- ( word "NMTOKEN" >> return NMTOKEN) `onFail`</font>+<a name="line-507"></a><font color=Blue>-- ( word "NMTOKENS" >> return NMTOKENS)</font>+<a name="line-508"></a><font color=Blue>--</font>+<a name="line-509"></a><font color=Blue>--enumeratedtype :: HParser EnumeratedType</font>+<a name="line-510"></a><font color=Blue>--enumeratedtype =</font>+<a name="line-511"></a><font color=Blue>-- ( notationtype >>= return . NotationType) `onFail`</font>+<a name="line-512"></a><font color=Blue>-- ( enumeration >>= return . Enumeration)</font>+<a name="line-513"></a><font color=Blue>--</font>+<a name="line-514"></a><font color=Blue>--notationtype :: HParser NotationType</font>+<a name="line-515"></a><font color=Blue>--notationtype = do</font>+<a name="line-516"></a><font color=Blue>-- word "NOTATION"</font>+<a name="line-517"></a><font color=Blue>-- bracket (tok TokBraOpen) (tok TokBraClose)</font>+<a name="line-518"></a><font color=Blue>-- (name `sepby1` (tok TokPipe))</font>+<a name="line-519"></a><font color=Blue>--</font>+<a name="line-520"></a><font color=Blue>--enumeration :: HParser Enumeration</font>+<a name="line-521"></a><font color=Blue>--enumeration =</font>+<a name="line-522"></a><font color=Blue>-- bracket (tok TokBraOpen) (tok TokBraClose)</font>+<a name="line-523"></a><font color=Blue>-- (nmtoken `sepby1` (tok TokPipe))</font>+<a name="line-524"></a><font color=Blue>--</font>+<a name="line-525"></a><font color=Blue>--defaultdecl :: HParser DefaultDecl</font>+<a name="line-526"></a><font color=Blue>--defaultdecl =</font>+<a name="line-527"></a><font color=Blue>-- ( tok TokHash >> word "REQUIRED" >> return REQUIRED) `onFail`</font>+<a name="line-528"></a><font color=Blue>-- ( tok TokHash >> word "IMPLIED" >> return IMPLIED) `onFail`</font>+<a name="line-529"></a><font color=Blue>-- ( do f <- maybe (tok TokHash >> word "FIXED" >> return FIXED)</font>+<a name="line-530"></a><font color=Blue>-- a <- attvalue</font>+<a name="line-531"></a><font color=Blue>-- return (DefaultTo a f))</font>+<a name="line-532"></a><font color=Blue>--</font>+<a name="line-533"></a><font color=Blue>--conditionalsect :: HParser ConditionalSect</font>+<a name="line-534"></a><font color=Blue>--conditionalsect =</font>+<a name="line-535"></a><font color=Blue>-- ( do tok TokSectionOpen</font>+<a name="line-536"></a><font color=Blue>-- tok (TokSection INCLUDEx)</font>+<a name="line-537"></a><font color=Blue>-- tok TokSqOpen `onFail` failP "missing [ after INCLUDE"</font>+<a name="line-538"></a><font color=Blue>-- i <- extsubsetdecl `onFail` failP "missing ExtSubsetDecl in INCLUDE"</font>+<a name="line-539"></a><font color=Blue>-- tok TokSectionClose `onFail` failP "missing ] after INCLUDE"</font>+<a name="line-540"></a><font color=Blue>-- return (IncludeSect i)) `onFail`</font>+<a name="line-541"></a><font color=Blue>-- ( do tok TokSectionOpen</font>+<a name="line-542"></a><font color=Blue>-- tok (TokSection IGNOREx)</font>+<a name="line-543"></a><font color=Blue>-- tok TokSqOpen `onFail` failP "missing [ after IGNORE"</font>+<a name="line-544"></a><font color=Blue>-- i <- many ignoresectcontents</font>+<a name="line-545"></a><font color=Blue>-- tok TokSectionClose `onFail` failP "missing ] after IGNORE"</font>+<a name="line-546"></a><font color=Blue>-- return (IgnoreSect i))</font>+<a name="line-547"></a><font color=Blue>--</font>+<a name="line-548"></a><font color=Blue>--ignoresectcontents :: HParser IgnoreSectContents</font>+<a name="line-549"></a><font color=Blue>--ignoresectcontents = do</font>+<a name="line-550"></a><font color=Blue>-- i <- ignore</font>+<a name="line-551"></a><font color=Blue>-- is <- many (do tok TokSectionOpen</font>+<a name="line-552"></a><font color=Blue>-- ic <- ignoresectcontents</font>+<a name="line-553"></a><font color=Blue>-- tok TokSectionClose</font>+<a name="line-554"></a><font color=Blue>-- ig <- ignore</font>+<a name="line-555"></a><font color=Blue>-- return (ic,ig))</font>+<a name="line-556"></a><font color=Blue>-- return (IgnoreSectContents i is)</font>+<a name="line-557"></a><font color=Blue>--</font>+<a name="line-558"></a><font color=Blue>--ignore :: HParser Ignore</font>+<a name="line-559"></a><font color=Blue>--ignore = freetext >>= return . Ignore</font>+<a name="line-560"></a>+<a name="line-561"></a><a name="reference"></a><font color=Blue>reference</font> <font color=Red>::</font> HParser Reference+<a name="line-562"></a><font color=Blue>reference</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-563"></a> bracket <font color=Cyan>(</font>tok TokAmp<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSemi<font color=Cyan>)</font> <font color=Cyan>(</font>freetext <font color=Cyan>>>=</font> val<font color=Cyan>)</font>+<a name="line-564"></a> <font color=Green><u>where</u></font>+<a name="line-565"></a> val <font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font><font color=Magenta>'x'</font><font color=Red><b>:</b></font>i<font color=Cyan>)</font> <font color=Red>|</font> all isHexDigit i+<a name="line-566"></a> <font color=Red>=</font> return <font color=Cyan>.</font> RefChar <font color=Cyan>.</font> fst <font color=Cyan>.</font> head <font color=Cyan>.</font> readHex <font color=Cyan>$</font> i+<a name="line-567"></a> val <font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>i<font color=Cyan>)</font> <font color=Red>|</font> all isDigit i+<a name="line-568"></a> <font color=Red>=</font> return <font color=Cyan>.</font> RefChar <font color=Cyan>.</font> fst <font color=Cyan>.</font> head <font color=Cyan>.</font> readDec <font color=Cyan>$</font> i+<a name="line-569"></a> val name <font color=Red>=</font> return <font color=Cyan>.</font> RefEntity <font color=Cyan>$</font> name+<a name="line-570"></a>+<a name="line-571"></a><font color=Blue>{-+<a name="line-572"></a>reference :: HParser Reference+<a name="line-573"></a>reference =+<a name="line-574"></a> ( charref >>= return . RefChar) `onFail`+<a name="line-575"></a> ( entityref >>= return . RefEntity)+<a name="line-576"></a>+<a name="line-577"></a>entityref :: HParser EntityRef+<a name="line-578"></a>entityref = do+<a name="line-579"></a> n <- bracket (tok TokAmp) (tok TokSemi) name+<a name="line-580"></a> return n+<a name="line-581"></a>+<a name="line-582"></a>charref :: HParser CharRef+<a name="line-583"></a>charref = do+<a name="line-584"></a> bracket (tok TokAmp) (tok TokSemi) (freetext >>= readCharVal)+<a name="line-585"></a> where+<a name="line-586"></a> readCharVal ('#':'x':i) = return . fst . head . readHex $ i+<a name="line-587"></a> readCharVal ('#':i) = return . fst . head . readDec $ i+<a name="line-588"></a> readCharVal _ = mzero+<a name="line-589"></a>-}</font>+<a name="line-590"></a>+<a name="line-591"></a><font color=Blue>--pereference :: HParser PEReference</font>+<a name="line-592"></a><font color=Blue>--pereference = do</font>+<a name="line-593"></a><font color=Blue>-- bracket (tok TokPercent) (tok TokSemi) nmtoken</font>+<a name="line-594"></a><font color=Blue>--</font>+<a name="line-595"></a><font color=Blue>--entitydecl :: HParser EntityDecl</font>+<a name="line-596"></a><font color=Blue>--entitydecl =</font>+<a name="line-597"></a><font color=Blue>-- ( gedecl >>= return . EntityGEDecl) `onFail`</font>+<a name="line-598"></a><font color=Blue>-- ( pedecl >>= return . EntityPEDecl)</font>+<a name="line-599"></a><font color=Blue>--</font>+<a name="line-600"></a><font color=Blue>--gedecl :: HParser GEDecl</font>+<a name="line-601"></a><font color=Blue>--gedecl = do</font>+<a name="line-602"></a><font color=Blue>-- tok TokSpecialOpen</font>+<a name="line-603"></a><font color=Blue>-- tok (TokSpecial ENTITYx)</font>+<a name="line-604"></a><font color=Blue>-- n <- name</font>+<a name="line-605"></a><font color=Blue>-- e <- entitydef `onFail` failP "missing entity defn in G ENTITY decl"</font>+<a name="line-606"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "expected > terminating G ENTITY decl"</font>+<a name="line-607"></a><font color=Blue>-- return (GEDecl n e)</font>+<a name="line-608"></a><font color=Blue>--</font>+<a name="line-609"></a><font color=Blue>--pedecl :: HParser PEDecl</font>+<a name="line-610"></a><font color=Blue>--pedecl = do</font>+<a name="line-611"></a><font color=Blue>-- tok TokSpecialOpen</font>+<a name="line-612"></a><font color=Blue>-- tok (TokSpecial ENTITYx)</font>+<a name="line-613"></a><font color=Blue>-- tok TokPercent</font>+<a name="line-614"></a><font color=Blue>-- n <- name</font>+<a name="line-615"></a><font color=Blue>-- e <- pedef `onFail` failP "missing entity defn in P ENTITY decl"</font>+<a name="line-616"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "expected > terminating P ENTITY decl"</font>+<a name="line-617"></a><font color=Blue>-- return (PEDecl n e)</font>+<a name="line-618"></a><font color=Blue>--</font>+<a name="line-619"></a><font color=Blue>--entitydef :: HParser EntityDef</font>+<a name="line-620"></a><font color=Blue>--entitydef =</font>+<a name="line-621"></a><font color=Blue>-- ( entityvalue >>= return . DefEntityValue) `onFail`</font>+<a name="line-622"></a><font color=Blue>-- ( do eid <- externalid</font>+<a name="line-623"></a><font color=Blue>-- ndd <- maybe ndatadecl</font>+<a name="line-624"></a><font color=Blue>-- return (DefExternalID eid ndd))</font>+<a name="line-625"></a><font color=Blue>--</font>+<a name="line-626"></a><font color=Blue>--pedef :: HParser PEDef</font>+<a name="line-627"></a><font color=Blue>--pedef =</font>+<a name="line-628"></a><font color=Blue>-- ( entityvalue >>= return . PEDefEntityValue) `onFail`</font>+<a name="line-629"></a><font color=Blue>-- ( externalid >>= return . PEDefExternalID)</font>+<a name="line-630"></a>+<a name="line-631"></a><a name="externalid"></a><font color=Blue>externalid</font> <font color=Red>::</font> HParser ExternalID+<a name="line-632"></a><font color=Blue>externalid</font> <font color=Red>=</font>+<a name="line-633"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> word <font color=Magenta>"SYSTEM"</font>+<a name="line-634"></a> s <font color=Red><-</font> systemliteral+<a name="line-635"></a> return <font color=Cyan>(</font>SYSTEM s<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-636"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> word <font color=Magenta>"PUBLIC"</font>+<a name="line-637"></a> p <font color=Red><-</font> pubidliteral+<a name="line-638"></a> s <font color=Red><-</font> <font color=Cyan>(</font>systemliteral <font color=Cyan>`onFail`</font> return <font color=Cyan>(</font>SystemLiteral <font color=Magenta>""</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-639"></a> return <font color=Cyan>(</font>PUBLIC p s<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-640"></a>+<a name="line-641"></a><font color=Blue>--ndatadecl :: HParser NDataDecl</font>+<a name="line-642"></a><font color=Blue>--ndatadecl = do</font>+<a name="line-643"></a><font color=Blue>-- word "NDATA"</font>+<a name="line-644"></a><font color=Blue>-- n <- name</font>+<a name="line-645"></a><font color=Blue>-- return (NDATA n)</font>+<a name="line-646"></a>+<a name="line-647"></a><a name="textdecl"></a><font color=Blue>textdecl</font> <font color=Red>::</font> HParser TextDecl+<a name="line-648"></a><font color=Blue>textdecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-649"></a> tok TokPIOpen+<a name="line-650"></a> <font color=Cyan>(</font>word <font color=Magenta>"xml"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"XML"</font><font color=Cyan>)</font>+<a name="line-651"></a> v <font color=Red><-</font> maybe versioninfo+<a name="line-652"></a> e <font color=Red><-</font> encodingdecl+<a name="line-653"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failP <font color=Magenta>"expected ?> terminating text decl"</font>+<a name="line-654"></a> return <font color=Cyan>(</font>TextDecl v e<font color=Cyan>)</font>+<a name="line-655"></a>+<a name="line-656"></a><font color=Blue>--extparsedent :: HParser ExtParsedEnt</font>+<a name="line-657"></a><font color=Blue>--extparsedent = do</font>+<a name="line-658"></a><font color=Blue>-- t <- maybe textdecl</font>+<a name="line-659"></a><font color=Blue>-- (_,c) <- (content "")</font>+<a name="line-660"></a><font color=Blue>-- return (ExtParsedEnt t c)</font>+<a name="line-661"></a><font color=Blue>--</font>+<a name="line-662"></a><font color=Blue>--extpe :: HParser ExtPE</font>+<a name="line-663"></a><font color=Blue>--extpe = do</font>+<a name="line-664"></a><font color=Blue>-- t <- maybe textdecl</font>+<a name="line-665"></a><font color=Blue>-- e <- extsubsetdecl</font>+<a name="line-666"></a><font color=Blue>-- return (ExtPE t e)</font>+<a name="line-667"></a>+<a name="line-668"></a><a name="encodingdecl"></a><font color=Blue>encodingdecl</font> <font color=Red>::</font> HParser EncodingDecl+<a name="line-669"></a><font color=Blue>encodingdecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-670"></a> <font color=Cyan>(</font>word <font color=Magenta>"encoding"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"ENCODING"</font><font color=Cyan>)</font>+<a name="line-671"></a> tok TokEqual <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"expected = in 'encoding' decl"</font>+<a name="line-672"></a> f <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext+<a name="line-673"></a> return <font color=Cyan>(</font>EncodingDecl f<font color=Cyan>)</font>+<a name="line-674"></a>+<a name="line-675"></a><font color=Blue>--notationdecl :: HParser NotationDecl</font>+<a name="line-676"></a><font color=Blue>--notationdecl = do</font>+<a name="line-677"></a><font color=Blue>-- tok TokSpecialOpen</font>+<a name="line-678"></a><font color=Blue>-- word "NOTATION"</font>+<a name="line-679"></a><font color=Blue>-- n <- name</font>+<a name="line-680"></a><font color=Blue>-- e <- either externalid publicid</font>+<a name="line-681"></a><font color=Blue>-- tok TokAnyClose `onFail` failP "expected > terminating NOTATION decl"</font>+<a name="line-682"></a><font color=Blue>-- return (NOTATION n e)</font>+<a name="line-683"></a>+<a name="line-684"></a><a name="publicid"></a><font color=Blue>publicid</font> <font color=Red>::</font> HParser PublicID+<a name="line-685"></a><font color=Blue>publicid</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-686"></a> word <font color=Magenta>"PUBLICID"</font>+<a name="line-687"></a> p <font color=Red><-</font> pubidliteral+<a name="line-688"></a> return <font color=Cyan>(</font>PUBLICID p<font color=Cyan>)</font>+<a name="line-689"></a>+<a name="line-690"></a><a name="entityvalue"></a><font color=Blue>entityvalue</font> <font color=Red>::</font> HParser EntityValue+<a name="line-691"></a><font color=Blue>entityvalue</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-692"></a> evs <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>many ev<font color=Cyan>)</font>+<a name="line-693"></a> return <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font>+<a name="line-694"></a>+<a name="line-695"></a><a name="ev"></a><font color=Blue>ev</font> <font color=Red>::</font> HParser EV+<a name="line-696"></a><font color=Blue>ev</font> <font color=Red>=</font>+<a name="line-697"></a> <font color=Cyan>(</font> freetext <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EVString<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-698"></a><font color=Blue>-- PEREF(EVPERef,ev) `onFail`</font>+<a name="line-699"></a> <font color=Cyan>(</font> reference <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EVRef<font color=Cyan>)</font>+<a name="line-700"></a>+<a name="line-701"></a><a name="attvalue"></a><font color=Blue>attvalue</font> <font color=Red>::</font> HParser AttValue+<a name="line-702"></a><font color=Blue>attvalue</font> <font color=Red>=</font>+<a name="line-703"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> avs <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font>+<a name="line-704"></a> <font color=Cyan>(</font>many <font color=Cyan>(</font>either freetext reference<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-705"></a> return <font color=Cyan>(</font>AttValue avs<font color=Cyan>)</font> <font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-706"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> v <font color=Red><-</font> nmtoken+<a name="line-707"></a> s <font color=Red><-</font> <font color=Cyan>(</font>tok TokPercent <font color=Cyan>>></font> return <font color=Magenta>"%"</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font> return <font color=Magenta>""</font>+<a name="line-708"></a> return <font color=Cyan>(</font>AttValue <font color=Red>[</font>Left <font color=Cyan>(</font>v<font color=Cyan>++</font>s<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font> <font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-709"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> s <font color=Red><-</font> oneOf <font color=Red>[</font> tok TokPlus <font color=Cyan>>></font> return <font color=Magenta>"+"</font>+<a name="line-710"></a> <font color=Cyan>,</font> tok TokHash <font color=Cyan>>></font> return <font color=Magenta>"#"</font>+<a name="line-711"></a> <font color=Red>]</font>+<a name="line-712"></a> v <font color=Red><-</font> nmtoken+<a name="line-713"></a> return <font color=Cyan>(</font>AttValue <font color=Red>[</font>Left <font color=Cyan>(</font>s<font color=Cyan>++</font>v<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font> <font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-714"></a> failP <font color=Magenta>"Badly formatted attribute value"</font>+<a name="line-715"></a>+<a name="line-716"></a><a name="systemliteral"></a><font color=Blue>systemliteral</font> <font color=Red>::</font> HParser SystemLiteral+<a name="line-717"></a><font color=Blue>systemliteral</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-718"></a> s <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext+<a name="line-719"></a> return <font color=Cyan>(</font>SystemLiteral s<font color=Cyan>)</font> <font color=Blue>-- note: need to fold &...; escapes</font>+<a name="line-720"></a>+<a name="line-721"></a><a name="pubidliteral"></a><font color=Blue>pubidliteral</font> <font color=Red>::</font> HParser PubidLiteral+<a name="line-722"></a><font color=Blue>pubidliteral</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-723"></a> s <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext+<a name="line-724"></a> return <font color=Cyan>(</font>PubidLiteral s<font color=Cyan>)</font> <font color=Blue>-- note: need to fold &...; escapes</font>+<a name="line-725"></a>+<a name="line-726"></a><a name="chardata"></a><font color=Blue>chardata</font> <font color=Red>::</font> HParser CharData+<a name="line-727"></a><font color=Blue>chardata</font> <font color=Red>=</font> freetext <font color=Blue>-- >>= return . CharData</font>+<a name="line-728"></a>+</pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/Html/Pretty.html view
@@ -1,238 +1,244 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>-- | This is a separate pretty-printer for HTML documents, recognising</font>-<a name="(line2)"></a><font color=Blue>-- some of the differences between HTML and true XML.</font>-<a name="(line3)"></a>-<a name="(line4)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Html<font color=Cyan>.</font>Pretty-<a name="(line5)"></a> <font color=Cyan>(</font> document-<a name="(line6)"></a> <font color=Cyan>,</font> element-<a name="(line7)"></a> <font color=Cyan>,</font> attribute-<a name="(line8)"></a> <font color=Cyan>,</font> content-<a name="(line9)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line10)"></a>-<a name="(line11)"></a><font color=Green><u>import</u></font> Prelude hiding <font color=Cyan>(</font>maybe<font color=Cyan>,</font>either<font color=Cyan>)</font>-<a name="(line12)"></a><font color=Green><u>import</u></font> Maybe hiding <font color=Cyan>(</font>maybe<font color=Cyan>)</font>-<a name="(line13)"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>intersperse<font color=Cyan>)</font>-<a name="(line14)"></a><font color=Green><u>import</u></font> Char <font color=Cyan>(</font>isSpace<font color=Cyan>)</font>-<a name="(line15)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>PrettyPrint<font color=Cyan>.</font>HughesPJ-<a name="(line16)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line17)"></a>-<a name="(line18)"></a><a name="either"></a>either f g <font color=Cyan>(</font>Left x<font color=Cyan>)</font> <font color=Red>=</font> f x-<a name="(line19)"></a>either f g <font color=Cyan>(</font>Right x<font color=Cyan>)</font> <font color=Red>=</font> g x-<a name="(line20)"></a>-<a name="(line21)"></a><a name="maybe"></a>maybe f Nothing <font color=Red>=</font> empty-<a name="(line22)"></a>maybe f <font color=Cyan>(</font>Just x<font color=Cyan>)</font> <font color=Red>=</font> f x-<a name="(line23)"></a>-<a name="(line24)"></a><font color=Blue>--peref p = text "%" <> text p <> text ";"</font>-<a name="(line25)"></a>-<a name="(line26)"></a><font color=Blue>----</font>-<a name="(line27)"></a>-<a name="(line28)"></a><a name="document"></a>document <font color=Red>::</font> Document i <font color=Red>-></font> Doc-<a name="(line29)"></a><a name="prolog"></a>prolog <font color=Red>::</font> Prolog <font color=Red>-></font> Doc-<a name="(line30)"></a><a name="xmldecl"></a>xmldecl <font color=Red>::</font> XMLDecl <font color=Red>-></font> Doc-<a name="(line31)"></a><a name="misc"></a>misc <font color=Red>::</font> Misc <font color=Red>-></font> Doc-<a name="(line32)"></a><a name="sddecl"></a>sddecl <font color=Red>::</font> Bool <font color=Red>-></font> Doc-<a name="(line33)"></a>-<a name="(line34)"></a><a name="doctypedecl"></a>doctypedecl <font color=Red>::</font> DocTypeDecl <font color=Red>-></font> Doc-<a name="(line35)"></a><a name="markupdecl"></a>markupdecl <font color=Red>::</font> MarkupDecl <font color=Red>-></font> Doc-<a name="(line36)"></a><a name="extsubset"></a>extsubset <font color=Red>::</font> ExtSubset <font color=Red>-></font> Doc-<a name="(line37)"></a><a name="extsubsetdecl"></a>extsubsetdecl <font color=Red>::</font> ExtSubsetDecl <font color=Red>-></font> Doc-<a name="(line38)"></a>-<a name="(line39)"></a><a name="element"></a>element <font color=Red>::</font> Element i <font color=Red>-></font> Doc-<a name="(line40)"></a><a name="attribute"></a>attribute <font color=Red>::</font> Attribute <font color=Red>-></font> Doc <font color=Cyan>--etc</font>-<a name="(line41)"></a><a name="content"></a>content <font color=Red>::</font> Content i <font color=Red>-></font> Doc-<a name="(line42)"></a>-<a name="(line43)"></a><font color=Blue>----</font>-<a name="(line44)"></a>-<a name="(line45)"></a>document <font color=Cyan>(</font>Document p <font color=Green><u>_</u></font> e m<font color=Cyan>)</font><font color=Red>=</font> prolog p <font color=Cyan>$$</font> element e <font color=Cyan>$$</font> vcat <font color=Cyan>(</font>map misc m<font color=Cyan>)</font>-<a name="(line46)"></a>prolog <font color=Cyan>(</font>Prolog x m1 dtd m2<font color=Cyan>)</font><font color=Red>=</font> maybe xmldecl x <font color=Cyan>$$</font>-<a name="(line47)"></a> vcat <font color=Cyan>(</font>map misc m1<font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line48)"></a> maybe doctypedecl dtd <font color=Cyan>$$</font>-<a name="(line49)"></a> vcat <font color=Cyan>(</font>map misc m2<font color=Cyan>)</font>-<a name="(line50)"></a>xmldecl <font color=Cyan>(</font>XMLDecl v e sd<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?xml version='"</font> <font color=Cyan><></font> text v <font color=Cyan><></font> text <font color=Magenta>"'"</font> <font color=Cyan><+></font>-<a name="(line51)"></a> maybe encodingdecl e <font color=Cyan><+></font>-<a name="(line52)"></a> maybe sddecl sd <font color=Cyan><+></font>-<a name="(line53)"></a> text <font color=Magenta>"?>"</font>-<a name="(line54)"></a>misc <font color=Cyan>(</font>Comment s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!--"</font> <font color=Cyan><+></font> text s <font color=Cyan><+></font> text <font color=Magenta>"-->"</font>-<a name="(line55)"></a>misc <font color=Cyan>(</font>PI <font color=Cyan>(</font>n<font color=Cyan>,</font>s<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> text s <font color=Cyan><+></font> text <font color=Magenta>"?>"</font>-<a name="(line56)"></a>sddecl sd <font color=Red>|</font> sd <font color=Red>=</font> text <font color=Magenta>"standalone='yes'"</font>-<a name="(line57)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"standalone='no'"</font>-<a name="(line58)"></a>doctypedecl <font color=Cyan>(</font>DTD n eid ds<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>if</u></font> null ds <font color=Green><u>then</u></font> -<a name="(line59)"></a> hd <font color=Cyan><></font> text <font color=Magenta>">"</font>-<a name="(line60)"></a> <font color=Green><u>else</u></font> hd <font color=Cyan><+></font> text <font color=Magenta>" ["</font> <font color=Cyan>$$</font>-<a name="(line61)"></a> vcat <font color=Cyan>(</font>map markupdecl ds<font color=Cyan>)</font> <font color=Cyan>$$</font> text <font color=Magenta>"]>"</font>-<a name="(line62)"></a> <font color=Green><u>where</u></font> hd <font color=Red>=</font> text <font color=Magenta>"<!DOCTYPE"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>-<a name="(line63)"></a> maybe externalid eid-<a name="(line64)"></a>markupdecl <font color=Cyan>(</font>Element e<font color=Cyan>)</font> <font color=Red>=</font> elementdecl e-<a name="(line65)"></a>markupdecl <font color=Cyan>(</font>AttList a<font color=Cyan>)</font> <font color=Red>=</font> attlistdecl a-<a name="(line66)"></a>markupdecl <font color=Cyan>(</font>Entity e<font color=Cyan>)</font> <font color=Red>=</font> entitydecl e-<a name="(line67)"></a>markupdecl <font color=Cyan>(</font>Notation n<font color=Cyan>)</font> <font color=Red>=</font> notationdecl n-<a name="(line68)"></a>markupdecl <font color=Cyan>(</font>MarkupMisc m<font color=Cyan>)</font> <font color=Red>=</font> misc m-<a name="(line69)"></a><font color=Blue>--markupdecl (MarkupPE p m) = peref p</font>-<a name="(line70)"></a>extsubset <font color=Cyan>(</font>ExtSubset t ds<font color=Cyan>)</font> <font color=Red>=</font> maybe textdecl t <font color=Cyan>$$</font>-<a name="(line71)"></a> vcat <font color=Cyan>(</font>map extsubsetdecl ds<font color=Cyan>)</font>-<a name="(line72)"></a>extsubsetdecl <font color=Cyan>(</font>ExtMarkupDecl m<font color=Cyan>)</font> <font color=Red>=</font> markupdecl m-<a name="(line73)"></a>extsubsetdecl <font color=Cyan>(</font>ExtConditionalSect c<font color=Cyan>)</font> <font color=Red>=</font> conditionalsect c-<a name="(line74)"></a><font color=Blue>--extsubsetdecl (ExtPEReference p e) = peref p</font>-<a name="(line75)"></a>-<a name="(line76)"></a>element <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font>-<a name="(line77)"></a> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"/>"</font>-<a name="(line78)"></a>element e<font color=Red>@</font><font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font>-<a name="(line79)"></a><font color=Blue>-- | any isText cs = text "<" <> text n <+> fsep (map attribute as) <></font>-<a name="(line80)"></a><font color=Blue>-- text ">" <> hcat (map content cs) <></font>-<a name="(line81)"></a><font color=Blue>-- text "</" <> text n <> text ">"</font>-<a name="(line82)"></a> <font color=Red>|</font> isText <font color=Cyan>(</font>head cs<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line83)"></a> text <font color=Magenta>">"</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>map content cs<font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line84)"></a> text <font color=Magenta>"</"</font> <font color=Cyan><></font> text n <font color=Cyan><></font> text <font color=Magenta>">"</font>-<a name="(line85)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>d<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>=</font> carryelem e empty-<a name="(line86)"></a> <font color=Green><u>in</u></font> d <font color=Cyan><></font> c-<a name="(line87)"></a>-<a name="(line88)"></a><a name="isText"></a>isText <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True-<a name="(line89)"></a>isText <font color=Cyan>(</font>CRef <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True-<a name="(line90)"></a>isText <font color=Green><u>_</u></font> <font color=Red>=</font> False-<a name="(line91)"></a>-<a name="(line92)"></a><a name="carryelem"></a>carryelem <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font> c-<a name="(line93)"></a> <font color=Red>=</font> <font color=Cyan>(</font> c <font color=Cyan><></font>-<a name="(line94)"></a> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font>-<a name="(line95)"></a> <font color=Cyan>,</font> text <font color=Magenta>"/>"</font><font color=Cyan>)</font>-<a name="(line96)"></a><font color=Blue>--carryelem e@(Elem n as cs) c</font>-<a name="(line97)"></a><font color=Blue>---- | any isText cs = ( c <> element e, empty)</font>-<a name="(line98)"></a><font color=Blue>-- | otherwise = let (cs',d') = carryscan carrycontent cs (text ">")</font>-<a name="(line99)"></a><font color=Blue>-- in</font>-<a name="(line100)"></a><font color=Blue>-- ( c <></font>-<a name="(line101)"></a><font color=Blue>-- text "<" <> text n <+> fsep (map attribute as) $$</font>-<a name="(line102)"></a><font color=Blue>-- nest 2 (vcat cs') <> -- $$</font>-<a name="(line103)"></a><font color=Blue>-- c' <> text "</" <> text n</font>-<a name="(line104)"></a><font color=Blue>-- , text ">")</font>-<a name="(line105)"></a><font color=Blue>--carrycontent (CElem e) c = carryelem e c</font>-<a name="(line106)"></a><font color=Blue>--carrycontent (CString _ s) c = (c <> chardata s, empty)</font>-<a name="(line107)"></a><font color=Blue>--carrycontent (CRef r) c = (c <> reference r, empty)</font>-<a name="(line108)"></a><font color=Blue>--carrycontent (CMisc m) c = (c <> misc m, empty)</font>-<a name="(line109)"></a><font color=Blue>--</font>-<a name="(line110)"></a><font color=Blue>--carryscan :: (a->c->(b,c)) -> [a] -> c -> ([b],c)</font>-<a name="(line111)"></a><font color=Blue>--carryscan f [] c = ([],c)</font>-<a name="(line112)"></a><font color=Blue>--carryscan f (a:as) c = let (b, c') = f a c</font>-<a name="(line113)"></a><font color=Blue>-- (bs,c'') = carryscan f as c'</font>-<a name="(line114)"></a><font color=Blue>-- in (b:bs, c'')</font>-<a name="(line115)"></a>-<a name="(line116)"></a>carryelem e<font color=Red>@</font><font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> c-<a name="(line117)"></a> <font color=Red>|</font> isText <font color=Cyan>(</font>head cs<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line118)"></a> <font color=Cyan>(</font> start <font color=Cyan><></font>-<a name="(line119)"></a> text <font color=Magenta>">"</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>map content cs<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"</"</font> <font color=Cyan><></font> text n-<a name="(line120)"></a> <font color=Cyan>,</font> text <font color=Magenta>">"</font><font color=Cyan>)</font>-<a name="(line121)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font>-<a name="(line122)"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>d<font color=Cyan>,</font>c'<font color=Cyan>)</font> <font color=Red>=</font> foldl carrycontent <font color=Cyan>(</font>start<font color=Cyan>,</font> text <font color=Magenta>">"</font><font color=Cyan>)</font> cs <font color=Green><u>in</u></font>-<a name="(line123)"></a> <font color=Cyan>(</font> d <font color=Cyan><></font> c' <font color=Cyan><></font> text <font color=Magenta>"</"</font> <font color=Cyan><></font> text n-<a name="(line124)"></a> <font color=Cyan>,</font> text <font color=Magenta>">"</font><font color=Cyan>)</font>-<a name="(line125)"></a> <font color=Green><u>where</u></font> start <font color=Red>=</font> c <font color=Cyan><></font> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font>-<a name="(line126)"></a>-<a name="(line127)"></a><a name="carrycontent"></a>carrycontent <font color=Cyan>(</font>d<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>d'<font color=Cyan>,</font>c'<font color=Cyan>)</font> <font color=Red>=</font> carryelem e c <font color=Green><u>in</u></font>-<a name="(line128)"></a> <font color=Cyan>(</font>d <font color=Cyan>$$</font> nest <font color=Magenta>2</font> d'<font color=Cyan>,</font> c'<font color=Cyan>)</font>-<a name="(line129)"></a>carrycontent <font color=Cyan>(</font>d<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>d <font color=Cyan><></font> c <font color=Cyan><></font> chardata s<font color=Cyan>,</font> empty<font color=Cyan>)</font>-<a name="(line130)"></a>carrycontent <font color=Cyan>(</font>d<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Cyan>(</font>CRef r <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>d <font color=Cyan><></font> c <font color=Cyan><></font> reference r<font color=Cyan>,</font>empty<font color=Cyan>)</font>-<a name="(line131)"></a>carrycontent <font color=Cyan>(</font>d<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Cyan>(</font>CMisc m <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>d <font color=Cyan>$$</font> c <font color=Cyan><></font> misc m<font color=Cyan>,</font> empty<font color=Cyan>)</font>-<a name="(line132)"></a>-<a name="(line133)"></a>-<a name="(line134)"></a>attribute <font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><></font> text <font color=Magenta>"="</font> <font color=Cyan><></font> attvalue v-<a name="(line135)"></a>content <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> element e-<a name="(line136)"></a>content <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> chardata s-<a name="(line137)"></a>content <font color=Cyan>(</font>CRef r <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> reference r-<a name="(line138)"></a>content <font color=Cyan>(</font>CMisc m <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> misc m-<a name="(line139)"></a>-<a name="(line140)"></a><a name="elementdecl"></a>elementdecl <font color=Cyan>(</font>ElementDecl n cs<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ELEMENT"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>-<a name="(line141)"></a> contentspec cs <font color=Cyan><></font> text <font color=Magenta>">"</font>-<a name="(line142)"></a><a name="contentspec"></a>contentspec EMPTY <font color=Red>=</font> text <font color=Magenta>"EMPTY"</font>-<a name="(line143)"></a>contentspec ANY <font color=Red>=</font> text <font color=Magenta>"ANY"</font>-<a name="(line144)"></a>contentspec <font color=Cyan>(</font>Mixed m<font color=Cyan>)</font> <font color=Red>=</font> mixed m-<a name="(line145)"></a>contentspec <font color=Cyan>(</font>ContentSpec c<font color=Cyan>)</font> <font color=Red>=</font> cp c-<a name="(line146)"></a><a name="cp"></a><font color=Blue>--contentspec (ContentPE p cs) = peref p</font>-<a name="(line147)"></a>cp <font color=Cyan>(</font>TagName n m<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><></font> modifier m-<a name="(line148)"></a>cp <font color=Cyan>(</font>Choice cs m<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map cp cs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line149)"></a> modifier m-<a name="(line150)"></a>cp <font color=Cyan>(</font>Seq cs m<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>","</font><font color=Cyan>)</font> <font color=Cyan>(</font>map cp cs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line151)"></a> modifier m-<a name="(line152)"></a><a name="modifier"></a><font color=Blue>--cp (CPPE p c) = peref p</font>-<a name="(line153)"></a>modifier None <font color=Red>=</font> empty-<a name="(line154)"></a>modifier Query <font color=Red>=</font> text <font color=Magenta>"?"</font>-<a name="(line155)"></a>modifier Star <font color=Red>=</font> text <font color=Magenta>"*"</font>-<a name="(line156)"></a>modifier Plus <font color=Red>=</font> text <font color=Magenta>"+"</font>-<a name="(line157)"></a><a name="mixed"></a>mixed PCDATA <font color=Red>=</font> text <font color=Magenta>"(#PCDATA)"</font>-<a name="(line158)"></a>mixed <font color=Cyan>(</font>PCDATAplus ns<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"(#PCDATA |"</font> <font color=Cyan><+></font>-<a name="(line159)"></a> hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map text ns<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line160)"></a> text <font color=Magenta>")*"</font>-<a name="(line161)"></a>-<a name="(line162)"></a><a name="attlistdecl"></a>attlistdecl <font color=Cyan>(</font>AttListDecl n ds<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ATTLIST"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>-<a name="(line163)"></a> fsep <font color=Cyan>(</font>map attdef ds<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>">"</font>-<a name="(line164)"></a><a name="attdef"></a>attdef <font color=Cyan>(</font>AttDef n t d<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><+></font> atttype t <font color=Cyan><+></font> defaultdecl d-<a name="(line165)"></a><a name="atttype"></a>atttype StringType <font color=Red>=</font> text <font color=Magenta>"CDATA"</font>-<a name="(line166)"></a>atttype <font color=Cyan>(</font>TokenizedType t<font color=Cyan>)</font> <font color=Red>=</font> tokenizedtype t-<a name="(line167)"></a>atttype <font color=Cyan>(</font>EnumeratedType t<font color=Cyan>)</font> <font color=Red>=</font> enumeratedtype t-<a name="(line168)"></a><a name="tokenizedtype"></a>tokenizedtype ID <font color=Red>=</font> text <font color=Magenta>"ID"</font>-<a name="(line169)"></a>tokenizedtype IDREF <font color=Red>=</font> text <font color=Magenta>"IDREF"</font>-<a name="(line170)"></a>tokenizedtype IDREFS <font color=Red>=</font> text <font color=Magenta>"IDREFS"</font>-<a name="(line171)"></a>tokenizedtype ENTITY <font color=Red>=</font> text <font color=Magenta>"ENTITY"</font>-<a name="(line172)"></a>tokenizedtype ENTITIES <font color=Red>=</font> text <font color=Magenta>"ENTITIES"</font>-<a name="(line173)"></a>tokenizedtype NMTOKEN <font color=Red>=</font> text <font color=Magenta>"NMTOKEN"</font>-<a name="(line174)"></a>tokenizedtype NMTOKENS <font color=Red>=</font> text <font color=Magenta>"NMTOKENS"</font>-<a name="(line175)"></a><a name="enumeratedtype"></a>enumeratedtype <font color=Cyan>(</font>NotationType n<font color=Cyan>)</font><font color=Red>=</font> notationtype n-<a name="(line176)"></a>enumeratedtype <font color=Cyan>(</font>Enumeration e<font color=Cyan>)</font> <font color=Red>=</font> enumeration e-<a name="(line177)"></a><a name="notationtype"></a>notationtype ns <font color=Red>=</font> text <font color=Magenta>"NOTATION"</font> <font color=Cyan><+></font>-<a name="(line178)"></a> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map text ns<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line179)"></a><a name="enumeration"></a>enumeration ns <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map nmtoken ns<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line180)"></a><a name="defaultdecl"></a>defaultdecl REQUIRED <font color=Red>=</font> text <font color=Magenta>"#REQUIRED"</font>-<a name="(line181)"></a>defaultdecl IMPLIED <font color=Red>=</font> text <font color=Magenta>"#IMPLIED"</font>-<a name="(line182)"></a>defaultdecl <font color=Cyan>(</font>DefaultTo a f<font color=Cyan>)</font> <font color=Red>=</font> maybe <font color=Cyan>(</font>const <font color=Cyan>(</font>text <font color=Magenta>"#FIXED"</font><font color=Cyan>)</font><font color=Cyan>)</font> f <font color=Cyan><+></font> attvalue a-<a name="(line183)"></a><a name="conditionalsect"></a>conditionalsect <font color=Cyan>(</font>IncludeSect i<font color=Cyan>)</font><font color=Red>=</font> text <font color=Magenta>"<![INCLUDE ["</font> <font color=Cyan><+></font>-<a name="(line184)"></a> vcat <font color=Cyan>(</font>map extsubsetdecl i<font color=Cyan>)</font> <font color=Cyan><+></font> text <font color=Magenta>"]]>"</font>-<a name="(line185)"></a>conditionalsect <font color=Cyan>(</font>IgnoreSect i<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<![IGNORE ["</font> <font color=Cyan><+></font>-<a name="(line186)"></a> fsep <font color=Cyan>(</font>map ignoresectcontents i<font color=Cyan>)</font> <font color=Cyan><+></font> text <font color=Magenta>"]]>"</font>-<a name="(line187)"></a><a name="ignore"></a>ignore <font color=Cyan>(</font>Ignore<font color=Cyan>)</font> <font color=Red>=</font> empty-<a name="(line188)"></a><a name="ignoresectcontents"></a>ignoresectcontents <font color=Cyan>(</font>IgnoreSectContents i is<font color=Cyan>)</font>-<a name="(line189)"></a> <font color=Red>=</font> ignore i <font color=Cyan><+></font> vcat <font color=Cyan>(</font>map internal is<font color=Cyan>)</font>-<a name="(line190)"></a> <font color=Green><u>where</u></font> internal <font color=Cyan>(</font>ics<font color=Cyan>,</font>i<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<![["</font> <font color=Cyan><+></font>-<a name="(line191)"></a> ignoresectcontents ics <font color=Cyan><+></font>-<a name="(line192)"></a> text <font color=Magenta>"]]>"</font> <font color=Cyan><+></font> ignore i-<a name="(line193)"></a><a name="reference"></a>reference <font color=Cyan>(</font>RefEntity er<font color=Cyan>)</font> <font color=Red>=</font> entityref er-<a name="(line194)"></a>reference <font color=Cyan>(</font>RefChar cr<font color=Cyan>)</font> <font color=Red>=</font> charref cr-<a name="(line195)"></a><a name="entityref"></a>entityref n <font color=Red>=</font> text <font color=Magenta>"&"</font> <font color=Cyan><></font> text n <font color=Cyan><></font> text <font color=Magenta>";"</font>-<a name="(line196)"></a><a name="charref"></a>charref c <font color=Red>=</font> text <font color=Magenta>"&#"</font> <font color=Cyan><></font> text <font color=Cyan>(</font>show c<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>";"</font>-<a name="(line197)"></a><a name="entitydecl"></a>entitydecl <font color=Cyan>(</font>EntityGEDecl d<font color=Cyan>)</font> <font color=Red>=</font> gedecl d-<a name="(line198)"></a>entitydecl <font color=Cyan>(</font>EntityPEDecl d<font color=Cyan>)</font> <font color=Red>=</font> pedecl d-<a name="(line199)"></a><a name="gedecl"></a>gedecl <font color=Cyan>(</font>GEDecl n ed<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ENTITY"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font> entitydef ed <font color=Cyan><></font>-<a name="(line200)"></a> text <font color=Magenta>">"</font>-<a name="(line201)"></a><a name="pedecl"></a>pedecl <font color=Cyan>(</font>PEDecl n pd<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ENTITY %"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> pedef pd <font color=Cyan><></font>-<a name="(line202)"></a> text <font color=Magenta>">"</font>-<a name="(line203)"></a><a name="entitydef"></a>entitydef <font color=Cyan>(</font>DefEntityValue ev<font color=Cyan>)</font> <font color=Red>=</font> entityvalue ev-<a name="(line204)"></a>entitydef <font color=Cyan>(</font>DefExternalID i nd<font color=Cyan>)</font> <font color=Red>=</font> externalid i <font color=Cyan><+></font> maybe ndatadecl nd-<a name="(line205)"></a><a name="pedef"></a>pedef <font color=Cyan>(</font>PEDefEntityValue ev<font color=Cyan>)</font> <font color=Red>=</font> entityvalue ev-<a name="(line206)"></a>pedef <font color=Cyan>(</font>PEDefExternalID eid<font color=Cyan>)</font> <font color=Red>=</font> externalid eid-<a name="(line207)"></a><a name="externalid"></a>externalid <font color=Cyan>(</font>SYSTEM sl<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"SYSTEM"</font> <font color=Cyan><+></font> systemliteral sl-<a name="(line208)"></a>externalid <font color=Cyan>(</font>PUBLIC i sl<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"PUBLIC"</font> <font color=Cyan><+></font> pubidliteral i <font color=Cyan><+></font>-<a name="(line209)"></a> systemliteral sl-<a name="(line210)"></a><a name="ndatadecl"></a>ndatadecl <font color=Cyan>(</font>NDATA n<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"NDATA"</font> <font color=Cyan><+></font> text n-<a name="(line211)"></a><a name="textdecl"></a>textdecl <font color=Cyan>(</font>TextDecl vi ed<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?xml"</font> <font color=Cyan><+></font> maybe text vi <font color=Cyan><+></font>-<a name="(line212)"></a> encodingdecl ed <font color=Cyan><></font> text <font color=Magenta>"?>"</font>-<a name="(line213)"></a><a name="extparsedent"></a>extparsedent <font color=Cyan>(</font>ExtParsedEnt t c<font color=Cyan>)</font><font color=Red>=</font> maybe textdecl t <font color=Cyan><+></font> content c-<a name="(line214)"></a><a name="extpe"></a>extpe <font color=Cyan>(</font>ExtPE t esd<font color=Cyan>)</font> <font color=Red>=</font> maybe textdecl t <font color=Cyan><+></font>-<a name="(line215)"></a> vcat <font color=Cyan>(</font>map extsubsetdecl esd<font color=Cyan>)</font>-<a name="(line216)"></a><a name="notationdecl"></a>notationdecl <font color=Cyan>(</font>NOTATION n e<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!NOTATION"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>-<a name="(line217)"></a> either externalid publicid e <font color=Cyan><></font>-<a name="(line218)"></a> text <font color=Magenta>">"</font>-<a name="(line219)"></a><a name="publicid"></a>publicid <font color=Cyan>(</font>PUBLICID p<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"PUBLICID"</font> <font color=Cyan><+></font> pubidliteral p-<a name="(line220)"></a><a name="encodingdecl"></a>encodingdecl <font color=Cyan>(</font>EncodingDecl s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"encoding='"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>-<a name="(line221)"></a><a name="nmtoken"></a>nmtoken s <font color=Red>=</font> text s-<a name="(line222)"></a><a name="attvalue"></a>attvalue <font color=Cyan>(</font>AttValue esr<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font>-<a name="(line223)"></a> hcat <font color=Cyan>(</font>map <font color=Cyan>(</font>either text reference<font color=Cyan>)</font> esr<font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line224)"></a> text <font color=Magenta>"\""</font>-<a name="(line225)"></a><a name="entityvalue"></a>entityvalue <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>map ev evs<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"'"</font>-<a name="(line226)"></a><a name="ev"></a>ev <font color=Cyan>(</font>EVString s<font color=Cyan>)</font> <font color=Red>=</font> text s-<a name="(line227)"></a><font color=Blue>--ev (EVPERef p e) = peref p</font>-<a name="(line228)"></a>ev <font color=Cyan>(</font>EVRef r<font color=Cyan>)</font> <font color=Red>=</font> reference r-<a name="(line229)"></a><a name="pubidliteral"></a>pubidliteral <font color=Cyan>(</font>PubidLiteral s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>-<a name="(line230)"></a><a name="systemliteral"></a>systemliteral <font color=Cyan>(</font>SystemLiteral s<font color=Cyan>)</font><font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>-<a name="(line231)"></a><a name="chardata"></a>chardata s <font color=Red>=</font> <font color=Green><u>if</u></font> all isSpace s <font color=Green><u>then</u></font> empty <font color=Green><u>else</u></font> text s-<a name="(line232)"></a><a name="cdsect"></a>cdsect c <font color=Red>=</font> text <font color=Magenta>"<![CDATA["</font> <font color=Cyan><></font> chardata c <font color=Cyan><></font> text <font color=Magenta>"]]>"</font>-<a name="(line233)"></a>-<a name="(line234)"></a><font color=Blue>----</font>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/Html/Pretty.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>-- | This is a separate pretty-printer for HTML documents, recognising</font>+<a name="line-2"></a><font color=Blue>-- some of the differences between HTML and true XML.</font>+<a name="line-3"></a>+<a name="line-4"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Html<font color=Cyan>.</font>Pretty+<a name="line-5"></a> <font color=Cyan>(</font> document+<a name="line-6"></a> <font color=Cyan>,</font> element+<a name="line-7"></a> <font color=Cyan>,</font> attribute+<a name="line-8"></a> <font color=Cyan>,</font> content+<a name="line-9"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-10"></a>+<a name="line-11"></a><font color=Green><u>import</u></font> Prelude hiding <font color=Cyan>(</font>maybe<font color=Cyan>,</font>either<font color=Cyan>)</font>+<a name="line-12"></a><font color=Green><u>import</u></font> Maybe hiding <font color=Cyan>(</font>maybe<font color=Cyan>)</font>+<a name="line-13"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>intersperse<font color=Cyan>)</font>+<a name="line-14"></a><font color=Green><u>import</u></font> Char <font color=Cyan>(</font>isSpace<font color=Cyan>)</font>+<a name="line-15"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>PrettyPrint<font color=Cyan>.</font>HughesPJ+<a name="line-16"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-17"></a>+<a name="line-18"></a><a name="either"></a><font color=Blue>either</font> f g <font color=Cyan>(</font>Left x<font color=Cyan>)</font> <font color=Red>=</font> f x+<a name="line-19"></a><font color=Blue>either</font> f g <font color=Cyan>(</font>Right x<font color=Cyan>)</font> <font color=Red>=</font> g x+<a name="line-20"></a>+<a name="line-21"></a><a name="maybe"></a><font color=Blue>maybe</font> f Nothing <font color=Red>=</font> empty+<a name="line-22"></a><font color=Blue>maybe</font> f <font color=Cyan>(</font>Just x<font color=Cyan>)</font> <font color=Red>=</font> f x+<a name="line-23"></a>+<a name="line-24"></a><font color=Blue>--peref p = text "%" <> text p <> text ";"</font>+<a name="line-25"></a>+<a name="line-26"></a><font color=Blue>----</font>+<a name="line-27"></a>+<a name="line-28"></a><a name="document"></a><font color=Blue>document</font> <font color=Red>::</font> Document i <font color=Red>-></font> Doc+<a name="line-29"></a><a name="prolog"></a><font color=Blue>prolog</font> <font color=Red>::</font> Prolog <font color=Red>-></font> Doc+<a name="line-30"></a><a name="xmldecl"></a><font color=Blue>xmldecl</font> <font color=Red>::</font> XMLDecl <font color=Red>-></font> Doc+<a name="line-31"></a><a name="misc"></a><font color=Blue>misc</font> <font color=Red>::</font> Misc <font color=Red>-></font> Doc+<a name="line-32"></a><a name="sddecl"></a><font color=Blue>sddecl</font> <font color=Red>::</font> Bool <font color=Red>-></font> Doc+<a name="line-33"></a>+<a name="line-34"></a><a name="doctypedecl"></a><font color=Blue>doctypedecl</font> <font color=Red>::</font> DocTypeDecl <font color=Red>-></font> Doc+<a name="line-35"></a><a name="markupdecl"></a><font color=Blue>markupdecl</font> <font color=Red>::</font> MarkupDecl <font color=Red>-></font> Doc+<a name="line-36"></a><a name="extsubset"></a><font color=Blue>extsubset</font> <font color=Red>::</font> ExtSubset <font color=Red>-></font> Doc+<a name="line-37"></a><a name="extsubsetdecl"></a><font color=Blue>extsubsetdecl</font> <font color=Red>::</font> ExtSubsetDecl <font color=Red>-></font> Doc+<a name="line-38"></a>+<a name="line-39"></a><a name="element"></a><font color=Blue>element</font> <font color=Red>::</font> Element i <font color=Red>-></font> Doc+<a name="line-40"></a><a name="attribute"></a><font color=Blue>attribute</font> <font color=Red>::</font> Attribute <font color=Red>-></font> Doc <font color=Cyan>--etc</font>+<a name="line-41"></a><a name="content"></a><font color=Blue>content</font> <font color=Red>::</font> Content i <font color=Red>-></font> Doc+<a name="line-42"></a>+<a name="line-43"></a><font color=Blue>----</font>+<a name="line-44"></a>+<a name="line-45"></a><font color=Blue>document</font> <font color=Cyan>(</font>Document p <font color=Green><u>_</u></font> e m<font color=Cyan>)</font><font color=Red>=</font> prolog p <font color=Cyan>$$</font> element e <font color=Cyan>$$</font> vcat <font color=Cyan>(</font>map misc m<font color=Cyan>)</font>+<a name="line-46"></a><font color=Blue>prolog</font> <font color=Cyan>(</font>Prolog x m1 dtd m2<font color=Cyan>)</font><font color=Red>=</font> maybe xmldecl x <font color=Cyan>$$</font>+<a name="line-47"></a> vcat <font color=Cyan>(</font>map misc m1<font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-48"></a> maybe doctypedecl dtd <font color=Cyan>$$</font>+<a name="line-49"></a> vcat <font color=Cyan>(</font>map misc m2<font color=Cyan>)</font>+<a name="line-50"></a><font color=Blue>xmldecl</font> <font color=Cyan>(</font>XMLDecl v e sd<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?xml version='"</font> <font color=Cyan><></font> text v <font color=Cyan><></font> text <font color=Magenta>"'"</font> <font color=Cyan><+></font>+<a name="line-51"></a> maybe encodingdecl e <font color=Cyan><+></font>+<a name="line-52"></a> maybe sddecl sd <font color=Cyan><+></font>+<a name="line-53"></a> text <font color=Magenta>"?>"</font>+<a name="line-54"></a><font color=Blue>misc</font> <font color=Cyan>(</font>Comment s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!--"</font> <font color=Cyan><+></font> text s <font color=Cyan><+></font> text <font color=Magenta>"-->"</font>+<a name="line-55"></a><font color=Blue>misc</font> <font color=Cyan>(</font>PI <font color=Cyan>(</font>n<font color=Cyan>,</font>s<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> text s <font color=Cyan><+></font> text <font color=Magenta>"?>"</font>+<a name="line-56"></a><font color=Blue>sddecl</font> sd <font color=Red>|</font> sd <font color=Red>=</font> text <font color=Magenta>"standalone='yes'"</font>+<a name="line-57"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"standalone='no'"</font>+<a name="line-58"></a><font color=Blue>doctypedecl</font> <font color=Cyan>(</font>DTD n eid ds<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>if</u></font> null ds <font color=Green><u>then</u></font> +<a name="line-59"></a> hd <font color=Cyan><></font> text <font color=Magenta>">"</font>+<a name="line-60"></a> <font color=Green><u>else</u></font> hd <font color=Cyan><+></font> text <font color=Magenta>" ["</font> <font color=Cyan>$$</font>+<a name="line-61"></a> vcat <font color=Cyan>(</font>map markupdecl ds<font color=Cyan>)</font> <font color=Cyan>$$</font> text <font color=Magenta>"]>"</font>+<a name="line-62"></a> <font color=Green><u>where</u></font> hd <font color=Red>=</font> text <font color=Magenta>"<!DOCTYPE"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>+<a name="line-63"></a> maybe externalid eid+<a name="line-64"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>Element e<font color=Cyan>)</font> <font color=Red>=</font> elementdecl e+<a name="line-65"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>AttList a<font color=Cyan>)</font> <font color=Red>=</font> attlistdecl a+<a name="line-66"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>Entity e<font color=Cyan>)</font> <font color=Red>=</font> entitydecl e+<a name="line-67"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>Notation n<font color=Cyan>)</font> <font color=Red>=</font> notationdecl n+<a name="line-68"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>MarkupMisc m<font color=Cyan>)</font> <font color=Red>=</font> misc m+<a name="line-69"></a><font color=Blue>--markupdecl (MarkupPE p m) = peref p</font>+<a name="line-70"></a><font color=Blue>extsubset</font> <font color=Cyan>(</font>ExtSubset t ds<font color=Cyan>)</font> <font color=Red>=</font> maybe textdecl t <font color=Cyan>$$</font>+<a name="line-71"></a> vcat <font color=Cyan>(</font>map extsubsetdecl ds<font color=Cyan>)</font>+<a name="line-72"></a><font color=Blue>extsubsetdecl</font> <font color=Cyan>(</font>ExtMarkupDecl m<font color=Cyan>)</font> <font color=Red>=</font> markupdecl m+<a name="line-73"></a><font color=Blue>extsubsetdecl</font> <font color=Cyan>(</font>ExtConditionalSect c<font color=Cyan>)</font> <font color=Red>=</font> conditionalsect c+<a name="line-74"></a><font color=Blue>--extsubsetdecl (ExtPEReference p e) = peref p</font>+<a name="line-75"></a>+<a name="line-76"></a><font color=Blue>element</font> <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font>+<a name="line-77"></a> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"/>"</font>+<a name="line-78"></a><font color=Blue>element</font> e<font color=Red>@</font><font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font>+<a name="line-79"></a><font color=Blue>-- | any isText cs = text "<" <> text n <+> fsep (map attribute as) <></font>+<a name="line-80"></a><font color=Blue>-- text ">" <> hcat (map content cs) <></font>+<a name="line-81"></a><font color=Blue>-- text "</" <> text n <> text ">"</font>+<a name="line-82"></a> <font color=Red>|</font> isText <font color=Cyan>(</font>head cs<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-83"></a> text <font color=Magenta>">"</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>map content cs<font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-84"></a> text <font color=Magenta>"</"</font> <font color=Cyan><></font> text n <font color=Cyan><></font> text <font color=Magenta>">"</font>+<a name="line-85"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>d<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>=</font> carryelem e empty+<a name="line-86"></a> <font color=Green><u>in</u></font> d <font color=Cyan><></font> c+<a name="line-87"></a>+<a name="line-88"></a><a name="isText"></a><font color=Blue>isText</font> <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True+<a name="line-89"></a><font color=Blue>isText</font> <font color=Cyan>(</font>CRef <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True+<a name="line-90"></a><font color=Blue>isText</font> <font color=Green><u>_</u></font> <font color=Red>=</font> False+<a name="line-91"></a>+<a name="line-92"></a><a name="carryelem"></a><font color=Blue>carryelem</font> <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font> c+<a name="line-93"></a> <font color=Red>=</font> <font color=Cyan>(</font> c <font color=Cyan><></font>+<a name="line-94"></a> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font>+<a name="line-95"></a> <font color=Cyan>,</font> text <font color=Magenta>"/>"</font><font color=Cyan>)</font>+<a name="line-96"></a><font color=Blue>--carryelem e@(Elem n as cs) c</font>+<a name="line-97"></a><font color=Blue>---- | any isText cs = ( c <> element e, empty)</font>+<a name="line-98"></a><font color=Blue>-- | otherwise = let (cs',d') = carryscan carrycontent cs (text ">")</font>+<a name="line-99"></a><font color=Blue>-- in</font>+<a name="line-100"></a><font color=Blue>-- ( c <></font>+<a name="line-101"></a><font color=Blue>-- text "<" <> text n <+> fsep (map attribute as) $$</font>+<a name="line-102"></a><font color=Blue>-- nest 2 (vcat cs') <> -- $$</font>+<a name="line-103"></a><font color=Blue>-- c' <> text "</" <> text n</font>+<a name="line-104"></a><font color=Blue>-- , text ">")</font>+<a name="line-105"></a><font color=Blue>--carrycontent (CElem e) c = carryelem e c</font>+<a name="line-106"></a><font color=Blue>--carrycontent (CString _ s) c = (c <> chardata s, empty)</font>+<a name="line-107"></a><font color=Blue>--carrycontent (CRef r) c = (c <> reference r, empty)</font>+<a name="line-108"></a><font color=Blue>--carrycontent (CMisc m) c = (c <> misc m, empty)</font>+<a name="line-109"></a><font color=Blue>--</font>+<a name="line-110"></a><font color=Blue>--carryscan :: (a->c->(b,c)) -> [a] -> c -> ([b],c)</font>+<a name="line-111"></a><font color=Blue>--carryscan f [] c = ([],c)</font>+<a name="line-112"></a><font color=Blue>--carryscan f (a:as) c = let (b, c') = f a c</font>+<a name="line-113"></a><font color=Blue>-- (bs,c'') = carryscan f as c'</font>+<a name="line-114"></a><font color=Blue>-- in (b:bs, c'')</font>+<a name="line-115"></a>+<a name="line-116"></a><font color=Blue>carryelem</font> e<font color=Red>@</font><font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> c+<a name="line-117"></a> <font color=Red>|</font> isText <font color=Cyan>(</font>head cs<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-118"></a> <font color=Cyan>(</font> start <font color=Cyan><></font>+<a name="line-119"></a> text <font color=Magenta>">"</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>map content cs<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"</"</font> <font color=Cyan><></font> text n+<a name="line-120"></a> <font color=Cyan>,</font> text <font color=Magenta>">"</font><font color=Cyan>)</font>+<a name="line-121"></a> <font color=Red>|</font> otherwise <font color=Red>=</font>+<a name="line-122"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>d<font color=Cyan>,</font>c'<font color=Cyan>)</font> <font color=Red>=</font> foldl carrycontent <font color=Cyan>(</font>start<font color=Cyan>,</font> text <font color=Magenta>">"</font><font color=Cyan>)</font> cs <font color=Green><u>in</u></font>+<a name="line-123"></a> <font color=Cyan>(</font> d <font color=Cyan><></font> c' <font color=Cyan><></font> text <font color=Magenta>"</"</font> <font color=Cyan><></font> text n+<a name="line-124"></a> <font color=Cyan>,</font> text <font color=Magenta>">"</font><font color=Cyan>)</font>+<a name="line-125"></a> <font color=Green><u>where</u></font> start <font color=Red>=</font> c <font color=Cyan><></font> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font>+<a name="line-126"></a>+<a name="line-127"></a><a name="carrycontent"></a><font color=Blue>carrycontent</font> <font color=Cyan>(</font>d<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>d'<font color=Cyan>,</font>c'<font color=Cyan>)</font> <font color=Red>=</font> carryelem e c <font color=Green><u>in</u></font>+<a name="line-128"></a> <font color=Cyan>(</font>d <font color=Cyan>$$</font> nest <font color=Magenta>2</font> d'<font color=Cyan>,</font> c'<font color=Cyan>)</font>+<a name="line-129"></a><font color=Blue>carrycontent</font> <font color=Cyan>(</font>d<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>d <font color=Cyan><></font> c <font color=Cyan><></font> chardata s<font color=Cyan>,</font> empty<font color=Cyan>)</font>+<a name="line-130"></a><font color=Blue>carrycontent</font> <font color=Cyan>(</font>d<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Cyan>(</font>CRef r <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>d <font color=Cyan><></font> c <font color=Cyan><></font> reference r<font color=Cyan>,</font>empty<font color=Cyan>)</font>+<a name="line-131"></a><font color=Blue>carrycontent</font> <font color=Cyan>(</font>d<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Cyan>(</font>CMisc m <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>d <font color=Cyan>$$</font> c <font color=Cyan><></font> misc m<font color=Cyan>,</font> empty<font color=Cyan>)</font>+<a name="line-132"></a>+<a name="line-133"></a>+<a name="line-134"></a><font color=Blue>attribute</font> <font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><></font> text <font color=Magenta>"="</font> <font color=Cyan><></font> attvalue v+<a name="line-135"></a><font color=Blue>content</font> <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> element e+<a name="line-136"></a><font color=Blue>content</font> <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> chardata s+<a name="line-137"></a><font color=Blue>content</font> <font color=Cyan>(</font>CRef r <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> reference r+<a name="line-138"></a><font color=Blue>content</font> <font color=Cyan>(</font>CMisc m <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> misc m+<a name="line-139"></a>+<a name="line-140"></a><a name="elementdecl"></a><font color=Blue>elementdecl</font> <font color=Cyan>(</font>ElementDecl n cs<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ELEMENT"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>+<a name="line-141"></a> contentspec cs <font color=Cyan><></font> text <font color=Magenta>">"</font>+<a name="line-142"></a><a name="contentspec"></a><font color=Blue>contentspec</font> EMPTY <font color=Red>=</font> text <font color=Magenta>"EMPTY"</font>+<a name="line-143"></a><font color=Blue>contentspec</font> ANY <font color=Red>=</font> text <font color=Magenta>"ANY"</font>+<a name="line-144"></a><font color=Blue>contentspec</font> <font color=Cyan>(</font>Mixed m<font color=Cyan>)</font> <font color=Red>=</font> mixed m+<a name="line-145"></a><font color=Blue>contentspec</font> <font color=Cyan>(</font>ContentSpec c<font color=Cyan>)</font> <font color=Red>=</font> cp c+<a name="line-146"></a><a name="cp"></a><font color=Blue>--contentspec (ContentPE p cs) = peref p</font>+<a name="line-147"></a><font color=Blue>cp</font> <font color=Cyan>(</font>TagName n m<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><></font> modifier m+<a name="line-148"></a><font color=Blue>cp</font> <font color=Cyan>(</font>Choice cs m<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map cp cs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-149"></a> modifier m+<a name="line-150"></a><font color=Blue>cp</font> <font color=Cyan>(</font>Seq cs m<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>","</font><font color=Cyan>)</font> <font color=Cyan>(</font>map cp cs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-151"></a> modifier m+<a name="line-152"></a><a name="modifier"></a><font color=Blue>--cp (CPPE p c) = peref p</font>+<a name="line-153"></a><font color=Blue>modifier</font> None <font color=Red>=</font> empty+<a name="line-154"></a><font color=Blue>modifier</font> Query <font color=Red>=</font> text <font color=Magenta>"?"</font>+<a name="line-155"></a><font color=Blue>modifier</font> Star <font color=Red>=</font> text <font color=Magenta>"*"</font>+<a name="line-156"></a><font color=Blue>modifier</font> Plus <font color=Red>=</font> text <font color=Magenta>"+"</font>+<a name="line-157"></a><a name="mixed"></a><font color=Blue>mixed</font> PCDATA <font color=Red>=</font> text <font color=Magenta>"(#PCDATA)"</font>+<a name="line-158"></a><font color=Blue>mixed</font> <font color=Cyan>(</font>PCDATAplus ns<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"(#PCDATA |"</font> <font color=Cyan><+></font>+<a name="line-159"></a> hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map text ns<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-160"></a> text <font color=Magenta>")*"</font>+<a name="line-161"></a>+<a name="line-162"></a><a name="attlistdecl"></a><font color=Blue>attlistdecl</font> <font color=Cyan>(</font>AttListDecl n ds<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ATTLIST"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>+<a name="line-163"></a> fsep <font color=Cyan>(</font>map attdef ds<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>">"</font>+<a name="line-164"></a><a name="attdef"></a><font color=Blue>attdef</font> <font color=Cyan>(</font>AttDef n t d<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><+></font> atttype t <font color=Cyan><+></font> defaultdecl d+<a name="line-165"></a><a name="atttype"></a><font color=Blue>atttype</font> StringType <font color=Red>=</font> text <font color=Magenta>"CDATA"</font>+<a name="line-166"></a><font color=Blue>atttype</font> <font color=Cyan>(</font>TokenizedType t<font color=Cyan>)</font> <font color=Red>=</font> tokenizedtype t+<a name="line-167"></a><font color=Blue>atttype</font> <font color=Cyan>(</font>EnumeratedType t<font color=Cyan>)</font> <font color=Red>=</font> enumeratedtype t+<a name="line-168"></a><a name="tokenizedtype"></a><font color=Blue>tokenizedtype</font> ID <font color=Red>=</font> text <font color=Magenta>"ID"</font>+<a name="line-169"></a><font color=Blue>tokenizedtype</font> IDREF <font color=Red>=</font> text <font color=Magenta>"IDREF"</font>+<a name="line-170"></a><font color=Blue>tokenizedtype</font> IDREFS <font color=Red>=</font> text <font color=Magenta>"IDREFS"</font>+<a name="line-171"></a><font color=Blue>tokenizedtype</font> ENTITY <font color=Red>=</font> text <font color=Magenta>"ENTITY"</font>+<a name="line-172"></a><font color=Blue>tokenizedtype</font> ENTITIES <font color=Red>=</font> text <font color=Magenta>"ENTITIES"</font>+<a name="line-173"></a><font color=Blue>tokenizedtype</font> NMTOKEN <font color=Red>=</font> text <font color=Magenta>"NMTOKEN"</font>+<a name="line-174"></a><font color=Blue>tokenizedtype</font> NMTOKENS <font color=Red>=</font> text <font color=Magenta>"NMTOKENS"</font>+<a name="line-175"></a><a name="enumeratedtype"></a><font color=Blue>enumeratedtype</font> <font color=Cyan>(</font>NotationType n<font color=Cyan>)</font><font color=Red>=</font> notationtype n+<a name="line-176"></a><font color=Blue>enumeratedtype</font> <font color=Cyan>(</font>Enumeration e<font color=Cyan>)</font> <font color=Red>=</font> enumeration e+<a name="line-177"></a><a name="notationtype"></a><font color=Blue>notationtype</font> ns <font color=Red>=</font> text <font color=Magenta>"NOTATION"</font> <font color=Cyan><+></font>+<a name="line-178"></a> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map text ns<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-179"></a><a name="enumeration"></a><font color=Blue>enumeration</font> ns <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map nmtoken ns<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-180"></a><a name="defaultdecl"></a><font color=Blue>defaultdecl</font> REQUIRED <font color=Red>=</font> text <font color=Magenta>"#REQUIRED"</font>+<a name="line-181"></a><font color=Blue>defaultdecl</font> IMPLIED <font color=Red>=</font> text <font color=Magenta>"#IMPLIED"</font>+<a name="line-182"></a><font color=Blue>defaultdecl</font> <font color=Cyan>(</font>DefaultTo a f<font color=Cyan>)</font> <font color=Red>=</font> maybe <font color=Cyan>(</font>const <font color=Cyan>(</font>text <font color=Magenta>"#FIXED"</font><font color=Cyan>)</font><font color=Cyan>)</font> f <font color=Cyan><+></font> attvalue a+<a name="line-183"></a><a name="conditionalsect"></a><font color=Blue>conditionalsect</font> <font color=Cyan>(</font>IncludeSect i<font color=Cyan>)</font><font color=Red>=</font> text <font color=Magenta>"<![INCLUDE ["</font> <font color=Cyan><+></font>+<a name="line-184"></a> vcat <font color=Cyan>(</font>map extsubsetdecl i<font color=Cyan>)</font> <font color=Cyan><+></font> text <font color=Magenta>"]]>"</font>+<a name="line-185"></a><font color=Blue>conditionalsect</font> <font color=Cyan>(</font>IgnoreSect i<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<![IGNORE ["</font> <font color=Cyan><+></font>+<a name="line-186"></a> fsep <font color=Cyan>(</font>map ignoresectcontents i<font color=Cyan>)</font> <font color=Cyan><+></font> text <font color=Magenta>"]]>"</font>+<a name="line-187"></a><a name="ignore"></a><font color=Blue>ignore</font> <font color=Cyan>(</font>Ignore<font color=Cyan>)</font> <font color=Red>=</font> empty+<a name="line-188"></a><a name="ignoresectcontents"></a><font color=Blue>ignoresectcontents</font> <font color=Cyan>(</font>IgnoreSectContents i is<font color=Cyan>)</font>+<a name="line-189"></a> <font color=Red>=</font> ignore i <font color=Cyan><+></font> vcat <font color=Cyan>(</font>map internal is<font color=Cyan>)</font>+<a name="line-190"></a> <font color=Green><u>where</u></font> internal <font color=Cyan>(</font>ics<font color=Cyan>,</font>i<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<![["</font> <font color=Cyan><+></font>+<a name="line-191"></a> ignoresectcontents ics <font color=Cyan><+></font>+<a name="line-192"></a> text <font color=Magenta>"]]>"</font> <font color=Cyan><+></font> ignore i+<a name="line-193"></a><a name="reference"></a><font color=Blue>reference</font> <font color=Cyan>(</font>RefEntity er<font color=Cyan>)</font> <font color=Red>=</font> entityref er+<a name="line-194"></a><font color=Blue>reference</font> <font color=Cyan>(</font>RefChar cr<font color=Cyan>)</font> <font color=Red>=</font> charref cr+<a name="line-195"></a><a name="entityref"></a><font color=Blue>entityref</font> n <font color=Red>=</font> text <font color=Magenta>"&"</font> <font color=Cyan><></font> text n <font color=Cyan><></font> text <font color=Magenta>";"</font>+<a name="line-196"></a><a name="charref"></a><font color=Blue>charref</font> c <font color=Red>=</font> text <font color=Magenta>"&#"</font> <font color=Cyan><></font> text <font color=Cyan>(</font>show c<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>";"</font>+<a name="line-197"></a><a name="entitydecl"></a><font color=Blue>entitydecl</font> <font color=Cyan>(</font>EntityGEDecl d<font color=Cyan>)</font> <font color=Red>=</font> gedecl d+<a name="line-198"></a><font color=Blue>entitydecl</font> <font color=Cyan>(</font>EntityPEDecl d<font color=Cyan>)</font> <font color=Red>=</font> pedecl d+<a name="line-199"></a><a name="gedecl"></a><font color=Blue>gedecl</font> <font color=Cyan>(</font>GEDecl n ed<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ENTITY"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font> entitydef ed <font color=Cyan><></font>+<a name="line-200"></a> text <font color=Magenta>">"</font>+<a name="line-201"></a><a name="pedecl"></a><font color=Blue>pedecl</font> <font color=Cyan>(</font>PEDecl n pd<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ENTITY %"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> pedef pd <font color=Cyan><></font>+<a name="line-202"></a> text <font color=Magenta>">"</font>+<a name="line-203"></a><a name="entitydef"></a><font color=Blue>entitydef</font> <font color=Cyan>(</font>DefEntityValue ev<font color=Cyan>)</font> <font color=Red>=</font> entityvalue ev+<a name="line-204"></a><font color=Blue>entitydef</font> <font color=Cyan>(</font>DefExternalID i nd<font color=Cyan>)</font> <font color=Red>=</font> externalid i <font color=Cyan><+></font> maybe ndatadecl nd+<a name="line-205"></a><a name="pedef"></a><font color=Blue>pedef</font> <font color=Cyan>(</font>PEDefEntityValue ev<font color=Cyan>)</font> <font color=Red>=</font> entityvalue ev+<a name="line-206"></a><font color=Blue>pedef</font> <font color=Cyan>(</font>PEDefExternalID eid<font color=Cyan>)</font> <font color=Red>=</font> externalid eid+<a name="line-207"></a><a name="externalid"></a><font color=Blue>externalid</font> <font color=Cyan>(</font>SYSTEM sl<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"SYSTEM"</font> <font color=Cyan><+></font> systemliteral sl+<a name="line-208"></a><font color=Blue>externalid</font> <font color=Cyan>(</font>PUBLIC i sl<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"PUBLIC"</font> <font color=Cyan><+></font> pubidliteral i <font color=Cyan><+></font>+<a name="line-209"></a> systemliteral sl+<a name="line-210"></a><a name="ndatadecl"></a><font color=Blue>ndatadecl</font> <font color=Cyan>(</font>NDATA n<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"NDATA"</font> <font color=Cyan><+></font> text n+<a name="line-211"></a><a name="textdecl"></a><font color=Blue>textdecl</font> <font color=Cyan>(</font>TextDecl vi ed<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?xml"</font> <font color=Cyan><+></font> maybe text vi <font color=Cyan><+></font>+<a name="line-212"></a> encodingdecl ed <font color=Cyan><></font> text <font color=Magenta>"?>"</font>+<a name="line-213"></a><a name="extparsedent"></a><font color=Blue>extparsedent</font> <font color=Cyan>(</font>ExtParsedEnt t c<font color=Cyan>)</font><font color=Red>=</font> maybe textdecl t <font color=Cyan><+></font> content c+<a name="line-214"></a><a name="extpe"></a><font color=Blue>extpe</font> <font color=Cyan>(</font>ExtPE t esd<font color=Cyan>)</font> <font color=Red>=</font> maybe textdecl t <font color=Cyan><+></font>+<a name="line-215"></a> vcat <font color=Cyan>(</font>map extsubsetdecl esd<font color=Cyan>)</font>+<a name="line-216"></a><a name="notationdecl"></a><font color=Blue>notationdecl</font> <font color=Cyan>(</font>NOTATION n e<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!NOTATION"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>+<a name="line-217"></a> either externalid publicid e <font color=Cyan><></font>+<a name="line-218"></a> text <font color=Magenta>">"</font>+<a name="line-219"></a><a name="publicid"></a><font color=Blue>publicid</font> <font color=Cyan>(</font>PUBLICID p<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"PUBLICID"</font> <font color=Cyan><+></font> pubidliteral p+<a name="line-220"></a><a name="encodingdecl"></a><font color=Blue>encodingdecl</font> <font color=Cyan>(</font>EncodingDecl s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"encoding='"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>+<a name="line-221"></a><a name="nmtoken"></a><font color=Blue>nmtoken</font> s <font color=Red>=</font> text s+<a name="line-222"></a><a name="attvalue"></a><font color=Blue>attvalue</font> <font color=Cyan>(</font>AttValue esr<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font>+<a name="line-223"></a> hcat <font color=Cyan>(</font>map <font color=Cyan>(</font>either text reference<font color=Cyan>)</font> esr<font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-224"></a> text <font color=Magenta>"\""</font>+<a name="line-225"></a><a name="entityvalue"></a><font color=Blue>entityvalue</font> <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>map ev evs<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"'"</font>+<a name="line-226"></a><a name="ev"></a><font color=Blue>ev</font> <font color=Cyan>(</font>EVString s<font color=Cyan>)</font> <font color=Red>=</font> text s+<a name="line-227"></a><font color=Blue>--ev (EVPERef p e) = peref p</font>+<a name="line-228"></a><font color=Blue>ev</font> <font color=Cyan>(</font>EVRef r<font color=Cyan>)</font> <font color=Red>=</font> reference r+<a name="line-229"></a><a name="pubidliteral"></a><font color=Blue>pubidliteral</font> <font color=Cyan>(</font>PubidLiteral s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>+<a name="line-230"></a><a name="systemliteral"></a><font color=Blue>systemliteral</font> <font color=Cyan>(</font>SystemLiteral s<font color=Cyan>)</font><font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>+<a name="line-231"></a><a name="chardata"></a><font color=Blue>chardata</font> s <font color=Red>=</font> <font color=Green><u>if</u></font> all isSpace s <font color=Green><u>then</u></font> empty <font color=Green><u>else</u></font> text s+<a name="line-232"></a><a name="cdsect"></a><font color=Blue>cdsect</font> c <font color=Red>=</font> text <font color=Magenta>"<![CDATA["</font> <font color=Cyan><></font> chardata c <font color=Cyan><></font> text <font color=Magenta>"]]>"</font>+<a name="line-233"></a>+<a name="line-234"></a><font color=Blue>----</font> </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/Lex.html view
@@ -1,337 +1,343 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>-- | You don't normally need to use this Lex module directly - it is</font>-<a name="(line2)"></a><font color=Blue>-- called automatically by the parser. (This interface is only exposed</font>-<a name="(line3)"></a><font color=Blue>-- for debugging purposes.)</font>-<a name="(line4)"></a><font color=Blue>--</font>-<a name="(line5)"></a><font color=Blue>-- This is a hand-written lexer for tokenising the text of an XML</font>-<a name="(line6)"></a><font color=Blue>-- document so that it is ready for parsing. It attaches position</font>-<a name="(line7)"></a><font color=Blue>-- information in (line,column) format to every token. The main</font>-<a name="(line8)"></a><font color=Blue>-- entry point is 'xmlLex'. A secondary entry point, 'xmlReLex', is</font>-<a name="(line9)"></a><font color=Blue>-- provided for when the parser needs to stuff a string back onto</font>-<a name="(line10)"></a><font color=Blue>-- the front of the text and re-tokenise it (typically when expanding</font>-<a name="(line11)"></a><font color=Blue>-- macros).</font>-<a name="(line12)"></a><font color=Blue>--</font>-<a name="(line13)"></a><font color=Blue>-- As one would expect, the lexer is essentially a small finite</font>-<a name="(line14)"></a><font color=Blue>-- state machine.</font>-<a name="(line15)"></a>-<a name="(line16)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Lex-<a name="(line17)"></a> <font color=Cyan>(</font>-<a name="(line18)"></a> <font color=Blue>-- * Entry points to the lexer</font>-<a name="(line19)"></a> xmlLex <font color=Blue>-- :: String -> String -> [Token]</font>-<a name="(line20)"></a> <font color=Cyan>,</font> xmlReLex <font color=Blue>-- :: Posn -> String -> [Token]</font>-<a name="(line21)"></a> <font color=Cyan>,</font> reLexEntityValue <font color=Blue>-- :: (String->Maybe String) -> Posn -> String -> [Token]</font>-<a name="(line22)"></a> <font color=Blue>-- * Token types</font>-<a name="(line23)"></a> <font color=Cyan>,</font> Token-<a name="(line24)"></a> <font color=Cyan>,</font> TokenT<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line25)"></a> <font color=Cyan>,</font> Special<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line26)"></a> <font color=Cyan>,</font> Section<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line27)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line28)"></a>-<a name="(line29)"></a><font color=Green><u>import</u></font> Char-<a name="(line30)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Posn-<a name="(line31)"></a>-<a name="(line32)"></a><a name="Where"></a><font color=Green><u>data</u></font> Where <font color=Red>=</font> InTag String <font color=Red>|</font> NotInTag-<a name="(line33)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>)</font>-<a name="(line34)"></a>-<a name="(line35)"></a><a name="Token"></a><font color=Blue>-- | All tokens are paired up with a source position.</font>-<a name="(line36)"></a><a name="Token"></a><font color=Blue>-- Lexical errors are passed back as a special @TokenT@ value.</font>-<a name="(line37)"></a><a name="Token"></a><font color=Green><u>type</u></font> Token <font color=Red>=</font> <font color=Cyan>(</font>Posn<font color=Cyan>,</font> TokenT<font color=Cyan>)</font>-<a name="(line38)"></a>-<a name="(line39)"></a><a name="TokenT"></a><font color=Blue>-- | The basic token type.</font>-<a name="(line40)"></a><a name="TokenT"></a><font color=Green><u>data</u></font> TokenT <font color=Red>=</font>-<a name="(line41)"></a> TokCommentOpen <font color=Blue>-- ^ \<!--</font>-<a name="(line42)"></a> <font color=Red>|</font> TokCommentClose <font color=Blue>-- ^ --></font>-<a name="(line43)"></a> <font color=Red>|</font> TokPIOpen <font color=Blue>-- ^ \<?</font>-<a name="(line44)"></a> <font color=Red>|</font> TokPIClose <font color=Blue>-- ^ ?></font>-<a name="(line45)"></a> <font color=Red>|</font> TokSectionOpen <font color=Blue>-- ^ \<![</font>-<a name="(line46)"></a> <font color=Red>|</font> TokSectionClose <font color=Blue>-- ^ ]]></font>-<a name="(line47)"></a> <font color=Red>|</font> TokSection Section <font color=Blue>-- ^ CDATA INCLUDE IGNORE etc</font>-<a name="(line48)"></a> <font color=Red>|</font> TokSpecialOpen <font color=Blue>-- ^ \<!</font>-<a name="(line49)"></a> <font color=Red>|</font> TokSpecial Special <font color=Blue>-- ^ DOCTYPE ELEMENT ATTLIST etc</font>-<a name="(line50)"></a> <font color=Red>|</font> TokEndOpen <font color=Blue>-- ^ \<\/</font>-<a name="(line51)"></a> <font color=Red>|</font> TokEndClose <font color=Blue>-- ^ \/></font>-<a name="(line52)"></a> <font color=Red>|</font> TokAnyOpen <font color=Blue>-- ^ \<</font>-<a name="(line53)"></a> <font color=Red>|</font> TokAnyClose <font color=Blue>-- ^ ></font>-<a name="(line54)"></a> <font color=Red>|</font> TokSqOpen <font color=Blue>-- ^ \[</font>-<a name="(line55)"></a> <font color=Red>|</font> TokSqClose <font color=Blue>-- ^ \]</font>-<a name="(line56)"></a> <font color=Red>|</font> TokEqual <font color=Blue>-- ^ =</font>-<a name="(line57)"></a> <font color=Red>|</font> TokQuery <font color=Blue>-- ^ ?</font>-<a name="(line58)"></a> <font color=Red>|</font> TokStar <font color=Blue>-- ^ \*</font>-<a name="(line59)"></a> <font color=Red>|</font> TokPlus <font color=Blue>-- ^ +</font>-<a name="(line60)"></a> <font color=Red>|</font> TokAmp <font color=Blue>-- ^ &</font>-<a name="(line61)"></a> <font color=Red>|</font> TokSemi <font color=Blue>-- ^ ;</font>-<a name="(line62)"></a> <font color=Red>|</font> TokHash <font color=Blue>-- ^ #</font>-<a name="(line63)"></a> <font color=Red>|</font> TokBraOpen <font color=Blue>-- ^ (</font>-<a name="(line64)"></a> <font color=Red>|</font> TokBraClose <font color=Blue>-- ^ )</font>-<a name="(line65)"></a> <font color=Red>|</font> TokPipe <font color=Blue>-- ^ |</font>-<a name="(line66)"></a> <font color=Red>|</font> TokPercent <font color=Blue>-- ^ %</font>-<a name="(line67)"></a> <font color=Red>|</font> TokComma <font color=Blue>-- ^ ,</font>-<a name="(line68)"></a> <font color=Red>|</font> TokQuote <font color=Blue>-- ^ \'\' or \"\"</font>-<a name="(line69)"></a> <font color=Red>|</font> TokName String <font color=Blue>-- ^ begins with letter, no spaces</font>-<a name="(line70)"></a> <font color=Red>|</font> TokFreeText String <font color=Blue>-- ^ any character data</font>-<a name="(line71)"></a> <font color=Red>|</font> TokNull <font color=Blue>-- ^ fake token</font>-<a name="(line72)"></a> <font color=Red>|</font> TokError String <font color=Blue>-- ^ lexical error</font>-<a name="(line73)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>)</font>-<a name="(line74)"></a>-<a name="(line75)"></a><a name="Special"></a><font color=Green><u>data</u></font> Special <font color=Red>=</font>-<a name="(line76)"></a> DOCTYPEx-<a name="(line77)"></a> <font color=Red>|</font> ELEMENTx-<a name="(line78)"></a> <font color=Red>|</font> ATTLISTx-<a name="(line79)"></a> <font color=Red>|</font> ENTITYx-<a name="(line80)"></a> <font color=Red>|</font> NOTATIONx-<a name="(line81)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line82)"></a><a name="Section"></a><font color=Green><u>data</u></font> Section <font color=Red>=</font>-<a name="(line83)"></a> CDATAx-<a name="(line84)"></a> <font color=Red>|</font> INCLUDEx-<a name="(line85)"></a> <font color=Red>|</font> IGNOREx-<a name="(line86)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line87)"></a>-<a name="(line88)"></a><font color=Green><u>instance</u></font> Show TokenT <font color=Green><u>where</u></font>-<a name="(line89)"></a> showsPrec p TokCommentOpen <font color=Red>=</font> showString <font color=Magenta>"<!--"</font>-<a name="(line90)"></a> showsPrec p TokCommentClose <font color=Red>=</font> showString <font color=Magenta>"-->"</font>-<a name="(line91)"></a> showsPrec p TokPIOpen <font color=Red>=</font> showString <font color=Magenta>"<?"</font>-<a name="(line92)"></a> showsPrec p TokPIClose <font color=Red>=</font> showString <font color=Magenta>"?>"</font>-<a name="(line93)"></a> showsPrec p TokSectionOpen <font color=Red>=</font> showString <font color=Magenta>"<!["</font>-<a name="(line94)"></a> showsPrec p TokSectionClose <font color=Red>=</font> showString <font color=Magenta>"]]>"</font>-<a name="(line95)"></a> showsPrec p <font color=Cyan>(</font>TokSection s<font color=Cyan>)</font> <font color=Red>=</font> showsPrec p s-<a name="(line96)"></a> showsPrec p TokSpecialOpen <font color=Red>=</font> showString <font color=Magenta>"<!"</font>-<a name="(line97)"></a> showsPrec p <font color=Cyan>(</font>TokSpecial s<font color=Cyan>)</font> <font color=Red>=</font> showsPrec p s-<a name="(line98)"></a> showsPrec p TokEndOpen <font color=Red>=</font> showString <font color=Magenta>"</"</font>-<a name="(line99)"></a> showsPrec p TokEndClose <font color=Red>=</font> showString <font color=Magenta>"/>"</font>-<a name="(line100)"></a> showsPrec p TokAnyOpen <font color=Red>=</font> showString <font color=Magenta>"<"</font>-<a name="(line101)"></a> showsPrec p TokAnyClose <font color=Red>=</font> showString <font color=Magenta>">"</font>-<a name="(line102)"></a> showsPrec p TokSqOpen <font color=Red>=</font> showString <font color=Magenta>"["</font>-<a name="(line103)"></a> showsPrec p TokSqClose <font color=Red>=</font> showString <font color=Magenta>"]"</font>-<a name="(line104)"></a> showsPrec p TokEqual <font color=Red>=</font> showString <font color=Magenta>"="</font>-<a name="(line105)"></a> showsPrec p TokQuery <font color=Red>=</font> showString <font color=Magenta>"?"</font>-<a name="(line106)"></a> showsPrec p TokStar <font color=Red>=</font> showString <font color=Magenta>"*"</font>-<a name="(line107)"></a> showsPrec p TokPlus <font color=Red>=</font> showString <font color=Magenta>"+"</font>-<a name="(line108)"></a> showsPrec p TokAmp <font color=Red>=</font> showString <font color=Magenta>"&"</font>-<a name="(line109)"></a> showsPrec p TokSemi <font color=Red>=</font> showString <font color=Magenta>";"</font>-<a name="(line110)"></a> showsPrec p TokHash <font color=Red>=</font> showString <font color=Magenta>"#"</font>-<a name="(line111)"></a> showsPrec p TokBraOpen <font color=Red>=</font> showString <font color=Magenta>"("</font>-<a name="(line112)"></a> showsPrec p TokBraClose <font color=Red>=</font> showString <font color=Magenta>")"</font>-<a name="(line113)"></a> showsPrec p TokPipe <font color=Red>=</font> showString <font color=Magenta>"|"</font>-<a name="(line114)"></a> showsPrec p TokPercent <font color=Red>=</font> showString <font color=Magenta>"%"</font>-<a name="(line115)"></a> showsPrec p TokComma <font color=Red>=</font> showString <font color=Magenta>","</font>-<a name="(line116)"></a> showsPrec p TokQuote <font color=Red>=</font> showString <font color=Magenta>"' or \""</font>-<a name="(line117)"></a> showsPrec p <font color=Cyan>(</font>TokName s<font color=Cyan>)</font> <font color=Red>=</font> showString s-<a name="(line118)"></a> showsPrec p <font color=Cyan>(</font>TokFreeText s<font color=Cyan>)</font> <font color=Red>=</font> showString s-<a name="(line119)"></a> showsPrec p TokNull <font color=Red>=</font> showString <font color=Magenta>"(null)"</font>-<a name="(line120)"></a> showsPrec p <font color=Cyan>(</font>TokError s<font color=Cyan>)</font> <font color=Red>=</font> showString s-<a name="(line121)"></a>-<a name="(line122)"></a><font color=Blue>--trim, revtrim :: String -> String</font>-<a name="(line123)"></a><font color=Blue>--trim = f . f where f = reverse . dropWhile isSpace</font>-<a name="(line124)"></a><font color=Blue>--revtrim = f.reverse.f where f = dropWhile isSpace</font>-<a name="(line125)"></a><font color=Blue>--revtrim = reverse . dropWhile (=='\n') -- most recently used defn.</font>-<a name="(line126)"></a>-<a name="(line127)"></a><a name="emit"></a>emit <font color=Red>::</font> TokenT <font color=Red>-></font> Posn <font color=Red>-></font> Token-<a name="(line128)"></a>emit tok p <font color=Red>=</font> forcep p <font color=Cyan>`seq`</font> <font color=Cyan>(</font>p<font color=Cyan>,</font>tok<font color=Cyan>)</font>-<a name="(line129)"></a>-<a name="(line130)"></a><a name="lexerror"></a>lexerror <font color=Red>::</font> String <font color=Red>-></font> Posn <font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>-<a name="(line131)"></a>lexerror s p <font color=Red>=</font> <font color=Red>[</font><font color=Cyan>(</font>p<font color=Cyan>,</font> TokError <font color=Cyan>(</font><font color=Magenta>"Lexical error:\n "</font><font color=Cyan>++</font>s<font color=Cyan>)</font><font color=Cyan>)</font><font color=Red>]</font>-<a name="(line132)"></a>-<a name="(line133)"></a><a name="skip"></a>skip <font color=Red>::</font> Int <font color=Red>-></font> Posn <font color=Red>-></font> String <font color=Red>-></font> <font color=Cyan>(</font>Posn<font color=Red>-></font>String<font color=Red>-></font><font color=Red>[</font>Token<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>-<a name="(line134)"></a>skip n p s k <font color=Red>=</font> k <font color=Cyan>(</font>addcol n p<font color=Cyan>)</font> <font color=Cyan>(</font>drop n s<font color=Cyan>)</font>-<a name="(line135)"></a>-<a name="(line136)"></a><a name="blank"></a>blank <font color=Red>::</font> <font color=Cyan>(</font><font color=Red>[</font>Where<font color=Red>]</font><font color=Red>-></font>Posn<font color=Red>-></font>String<font color=Red>-></font><font color=Red>[</font>Token<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>Where<font color=Red>]</font><font color=Red>-></font> Posn<font color=Red>-></font> String<font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>-<a name="(line137)"></a>blank k <font color=Cyan>(</font>InTag t<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> p [] <font color=Red>=</font> lexerror <font color=Cyan>(</font><font color=Magenta>"unexpected EOF within "</font><font color=Cyan>++</font>t<font color=Cyan>)</font> p-<a name="(line138)"></a>blank k <font color=Green><u>_</u></font> p [] <font color=Red>=</font> []-<a name="(line139)"></a>blank k w p <font color=Cyan>(</font><font color=Magenta>' '</font><font color=Red><b>:</b></font> s<font color=Cyan>)</font> <font color=Red>=</font> blank k w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> s-<a name="(line140)"></a>blank k w p <font color=Cyan>(</font><font color=Magenta>'\t'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font> <font color=Red>=</font> blank k w <font color=Cyan>(</font>tab p<font color=Cyan>)</font> s-<a name="(line141)"></a>blank k w p <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font> <font color=Red>=</font> blank k w <font color=Cyan>(</font>newline p<font color=Cyan>)</font> s-<a name="(line142)"></a>blank k w p <font color=Cyan>(</font><font color=Magenta>'\r'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font> <font color=Red>=</font> blank k w p s-<a name="(line143)"></a>blank k w p <font color=Cyan>(</font><font color=Magenta>'\xa0'</font><font color=Red><b>:</b></font> s<font color=Cyan>)</font> <font color=Red>=</font> blank k w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> s-<a name="(line144)"></a>blank k w p s <font color=Red>=</font> k w p s-<a name="(line145)"></a>-<a name="(line146)"></a><a name="prefixes"></a>prefixes <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Bool-<a name="(line147)"></a>[] <font color=Cyan>`prefixes`</font> ys <font color=Red>=</font> True-<a name="(line148)"></a><a name="prefixes"></a><font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Cyan>`prefixes`</font> <font color=Cyan>(</font>y<font color=Red><b>:</b></font>ys<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Cyan>==</font>y <font color=Cyan>&&</font> xs <font color=Cyan>`prefixes`</font> ys-<a name="(line149)"></a><a name="prefixes"></a><font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Cyan>`prefixes`</font> [] <font color=Red>=</font> False <font color=Blue>--error "unexpected EOF in prefix"</font>-<a name="(line150)"></a>-<a name="(line151)"></a><a name="textUntil"></a>textUntil close tok acc pos p [] k <font color=Red>=</font>-<a name="(line152)"></a> lexerror <font color=Cyan>(</font><font color=Magenta>"unexpected EOF while looking for closing token "</font><font color=Cyan>++</font>close-<a name="(line153)"></a> <font color=Cyan>++</font><font color=Magenta>"\n to match the opening token in "</font><font color=Cyan>++</font>show pos<font color=Cyan>)</font> p-<a name="(line154)"></a>textUntil close tok acc pos p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> k-<a name="(line155)"></a> <font color=Red>|</font> close <font color=Cyan>`prefixes`</font> <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>TokFreeText <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font>-<a name="(line156)"></a> emit tok p<font color=Red><b>:</b></font>-<a name="(line157)"></a> skip <font color=Cyan>(</font>length close<font color=Blue>-</font><font color=Magenta>1</font><font color=Cyan>)</font> <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss k-<a name="(line158)"></a> <font color=Red>|</font> isSpace s <font color=Red>=</font> textUntil close tok <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> pos <font color=Cyan>(</font>white s p<font color=Cyan>)</font> ss k-<a name="(line159)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> textUntil close tok <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> pos <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss k-<a name="(line160)"></a>-<a name="(line161)"></a><a name="textOrRefUntil"></a>textOrRefUntil close tok acc pos p [] k <font color=Red>=</font>-<a name="(line162)"></a> lexerror <font color=Cyan>(</font><font color=Magenta>"unexpected EOF while looking for closing token "</font><font color=Cyan>++</font>close-<a name="(line163)"></a> <font color=Cyan>++</font><font color=Magenta>"\n to match the opening token in "</font><font color=Cyan>++</font>show pos<font color=Cyan>)</font> p-<a name="(line164)"></a>textOrRefUntil close tok acc pos p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> k-<a name="(line165)"></a> <font color=Red>|</font> close <font color=Cyan>`prefixes`</font> <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>TokFreeText <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font>-<a name="(line166)"></a> emit tok p<font color=Red><b>:</b></font>-<a name="(line167)"></a> skip <font color=Cyan>(</font>length close<font color=Blue>-</font><font color=Magenta>1</font><font color=Cyan>)</font> <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss k-<a name="(line168)"></a> <font color=Red>|</font> s<font color=Cyan>==</font><font color=Magenta>'&'</font> <font color=Red>=</font> <font color=Cyan>(</font><font color=Green><u>if</u></font> not <font color=Cyan>(</font>null acc<font color=Cyan>)</font>-<a name="(line169)"></a> <font color=Green><u>then</u></font> <font color=Cyan>(</font>emit <font color=Cyan>(</font>TokFreeText <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font><font color=Cyan>)</font>-<a name="(line170)"></a> <font color=Green><u>else</u></font> id<font color=Cyan>)</font>-<a name="(line171)"></a> <font color=Cyan>(</font>emit TokAmp p<font color=Red><b>:</b></font>-<a name="(line172)"></a> textUntil <font color=Magenta>";"</font> TokSemi <font color=Magenta>""</font> p <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line173)"></a> <font color=Cyan>(</font><font color=Red>\</font>p' i<font color=Red>-></font> textOrRefUntil close tok <font color=Magenta>""</font> p p' i k<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line174)"></a> <font color=Red>|</font> isSpace s <font color=Red>=</font> textOrRefUntil close tok <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> pos <font color=Cyan>(</font>white s p<font color=Cyan>)</font> ss k-<a name="(line175)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> textOrRefUntil close tok <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> pos <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss k-<a name="(line176)"></a>-<a name="(line177)"></a><font color=Blue>----</font>-<a name="(line178)"></a>-<a name="(line179)"></a><a name="xmlLex"></a><font color=Blue>-- | The first argument to 'xmlLex' is the filename (used for source positions,</font>-<a name="(line180)"></a><font color=Blue>-- especially in error messages), and the second is the string content of</font>-<a name="(line181)"></a><font color=Blue>-- the XML file.</font>-<a name="(line182)"></a>xmlLex <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>-<a name="(line183)"></a>xmlLex filename <font color=Red>=</font> xmlAny [] <font color=Cyan>(</font>posInNewCxt <font color=Cyan>(</font><font color=Magenta>"file "</font><font color=Cyan>++</font>filename<font color=Cyan>)</font> Nothing<font color=Cyan>)</font>-<a name="(line184)"></a>-<a name="(line185)"></a><a name="xmlReLex"></a><font color=Blue>-- | 'xmlReLex' is used when the parser expands a macro (PE reference).</font>-<a name="(line186)"></a><font color=Blue>-- The expansion of the macro must be re-lexed as if for the first time.</font>-<a name="(line187)"></a>xmlReLex <font color=Red>::</font> Posn <font color=Red>-></font> String <font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>-<a name="(line188)"></a>xmlReLex p s-<a name="(line189)"></a> <font color=Red>|</font> <font color=Magenta>"INCLUDE"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSection INCLUDEx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> k <font color=Magenta>7</font>-<a name="(line190)"></a> <font color=Red>|</font> <font color=Magenta>"IGNORE"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSection IGNOREx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> k <font color=Magenta>6</font>-<a name="(line191)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> blank xmlAny [] p s-<a name="(line192)"></a> <font color=Green><u>where</u></font>-<a name="(line193)"></a> k n <font color=Red>=</font> skip n p s <font color=Cyan>(</font>blank xmlAny []<font color=Cyan>)</font>-<a name="(line194)"></a>-<a name="(line195)"></a><a name="reLexEntityValue"></a><font color=Blue>-- | 'reLexEntityValue' is used solely within parsing an entityvalue.</font>-<a name="(line196)"></a><font color=Blue>-- Normally, a PERef is logically separated from its surroundings by</font>-<a name="(line197)"></a><font color=Blue>-- whitespace. But in an entityvalue, a PERef can be juxtaposed to</font>-<a name="(line198)"></a><font color=Blue>-- an identifier, so the expansion forms a new identifier.</font>-<a name="(line199)"></a><font color=Blue>-- Thus the need to rescan the whole text for possible PERefs.</font>-<a name="(line200)"></a>reLexEntityValue <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>Maybe String<font color=Cyan>)</font> <font color=Red>-></font> Posn <font color=Red>-></font> String <font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>-<a name="(line201)"></a>reLexEntityValue lookup p s <font color=Red>=</font>-<a name="(line202)"></a> textOrRefUntil <font color=Magenta>"%"</font> TokNull [] p p <font color=Cyan>(</font>expand s<font color=Cyan>++</font><font color=Magenta>"%"</font><font color=Cyan>)</font> <font color=Cyan>(</font>xmlAny []<font color=Cyan>)</font>-<a name="(line203)"></a> <font color=Green><u>where</u></font>-<a name="(line204)"></a> expand [] <font color=Red>=</font> []-<a name="(line205)"></a> expand <font color=Cyan>(</font><font color=Magenta>'%'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>sym<font color=Cyan>,</font>rest<font color=Cyan>)</font> <font color=Red>=</font> break <font color=Cyan>(</font><font color=Cyan>==</font><font color=Magenta>';'</font><font color=Cyan>)</font> ss <font color=Green><u>in</u></font>-<a name="(line206)"></a> <font color=Green><u>case</u></font> lookup sym <font color=Green><u>of</u></font>-<a name="(line207)"></a> Just val <font color=Red>-></font> expand val <font color=Cyan>++</font> expand <font color=Cyan>(</font>tail rest<font color=Cyan>)</font>-<a name="(line208)"></a> Nothing <font color=Red>-></font> <font color=Magenta>"%"</font><font color=Cyan>++</font>sym<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>++</font> expand <font color=Cyan>(</font>tail rest<font color=Cyan>)</font> <font color=Blue>-- hmmm</font>-<a name="(line209)"></a> expand <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> s<font color=Red><b>:</b></font> expand ss-<a name="(line210)"></a>-<a name="(line211)"></a><font color=Blue>--xmltop :: Posn -> String -> [Token]</font>-<a name="(line212)"></a><font color=Blue>--xmltop p [] = []</font>-<a name="(line213)"></a><font color=Blue>--xmltop p s</font>-<a name="(line214)"></a><font color=Blue>-- | "<?" `prefixes` s = emit TokPIOpen p: next 2 (xmlPI [InTag "<?...?>"])</font>-<a name="(line215)"></a><font color=Blue>-- | "<!--" `prefixes` s = emit TokCommentOpen p: next 4 (xmlComment [])</font>-<a name="(line216)"></a><font color=Blue>-- | "<!" `prefixes` s = emit TokSpecialOpen p: next 2 (xmlSpecial [InTag "<!...>"])</font>-<a name="(line217)"></a><font color=Blue>-- | otherwise = lexerror "expected <?xml?> or <!DOCTYPE>" p</font>-<a name="(line218)"></a><font color=Blue>-- where next n k = skip n p s k</font>-<a name="(line219)"></a>-<a name="(line220)"></a><a name="xmlPI"></a>xmlPI w p s <font color=Red>=</font> xmlName p s <font color=Magenta>"name of processor in <? ?>"</font> <font color=Cyan>(</font>blank xmlPIEnd w<font color=Cyan>)</font>-<a name="(line221)"></a><a name="xmlPIEnd"></a>xmlPIEnd w p s <font color=Red>=</font> textUntil <font color=Magenta>"?>"</font> TokPIClose <font color=Magenta>""</font> p p s <font color=Cyan>(</font>blank xmlAny <font color=Cyan>(</font>tail w<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line222)"></a><a name="xmlComment"></a>xmlComment w p s <font color=Red>=</font> textUntil <font color=Magenta>"-->"</font> TokCommentClose <font color=Magenta>""</font> p p s <font color=Cyan>(</font>blank xmlAny w<font color=Cyan>)</font>-<a name="(line223)"></a>-<a name="(line224)"></a><a name="xmlAny"></a><font color=Blue>-- Note: the order of the clauses in xmlAny is very important.</font>-<a name="(line225)"></a><font color=Blue>-- Some matches must precede the NotInTag test, the rest must follow it.</font>-<a name="(line226)"></a>xmlAny <font color=Red>::</font> <font color=Red>[</font>Where<font color=Red>]</font> <font color=Red>-></font> Posn <font color=Red>-></font> String <font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>-<a name="(line227)"></a>xmlAny <font color=Cyan>(</font>InTag t<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> p [] <font color=Red>=</font> lexerror <font color=Cyan>(</font><font color=Magenta>"unexpected EOF within "</font><font color=Cyan>++</font>t<font color=Cyan>)</font> p-<a name="(line228)"></a>xmlAny <font color=Green><u>_</u></font> p [] <font color=Red>=</font> []-<a name="(line229)"></a>xmlAny w p s<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'<'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font>-<a name="(line230)"></a> <font color=Red>|</font> <font color=Magenta>"?"</font> <font color=Cyan>`prefixes`</font> ss <font color=Red>=</font> emit TokPIOpen p<font color=Red><b>:</b></font>-<a name="(line231)"></a> skip <font color=Magenta>2</font> p s <font color=Cyan>(</font>xmlPI <font color=Cyan>(</font>InTag <font color=Magenta>"<?...?>"</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line232)"></a> <font color=Red>|</font> <font color=Magenta>"!--"</font> <font color=Cyan>`prefixes`</font> ss <font color=Red>=</font> emit TokCommentOpen p<font color=Red><b>:</b></font> skip <font color=Magenta>4</font> p s <font color=Cyan>(</font>xmlComment w<font color=Cyan>)</font>-<a name="(line233)"></a> <font color=Red>|</font> <font color=Magenta>"!["</font> <font color=Cyan>`prefixes`</font> ss <font color=Red>=</font> emit TokSectionOpen p<font color=Red><b>:</b></font> skip <font color=Magenta>3</font> p s <font color=Cyan>(</font>xmlSection w<font color=Cyan>)</font>-<a name="(line234)"></a> <font color=Red>|</font> <font color=Magenta>"!"</font> <font color=Cyan>`prefixes`</font> ss <font color=Red>=</font> emit TokSpecialOpen p<font color=Red><b>:</b></font>-<a name="(line235)"></a> skip <font color=Magenta>2</font> p s <font color=Cyan>(</font>xmlSpecial <font color=Cyan>(</font>InTag <font color=Magenta>"<!...>"</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line236)"></a> <font color=Red>|</font> <font color=Magenta>"/"</font> <font color=Cyan>`prefixes`</font> ss <font color=Red>=</font> emit TokEndOpen p<font color=Red><b>:</b></font> -<a name="(line237)"></a> skip <font color=Magenta>2</font> p s <font color=Cyan>(</font>xmlTag <font color=Cyan>(</font>InTag <font color=Magenta>"</...>"</font><font color=Red><b>:</b></font>tail w<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line238)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> emit TokAnyOpen p<font color=Red><b>:</b></font>-<a name="(line239)"></a> skip <font color=Magenta>1</font> p s <font color=Cyan>(</font>xmlTag <font color=Cyan>(</font>InTag <font color=Magenta>"<...>"</font><font color=Red><b>:</b></font>NotInTag<font color=Red><b>:</b></font>w<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line240)"></a>xmlAny <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>w<font color=Cyan>)</font> p s<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font>-<a name="(line241)"></a> <font color=Red>|</font> <font color=Magenta>">"</font> <font color=Cyan>`prefixes`</font> ss <font color=Red>=</font> emit TokEndClose p<font color=Red><b>:</b></font> skip <font color=Magenta>2</font> p s <font color=Cyan>(</font>xmlAny w<font color=Cyan>)</font>-<a name="(line242)"></a>xmlAny w p <font color=Cyan>(</font><font color=Magenta>'&'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokAmp p<font color=Red><b>:</b></font> textUntil <font color=Magenta>";"</font> TokSemi <font color=Magenta>""</font> p-<a name="(line243)"></a> <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss <font color=Cyan>(</font>xmlAny w<font color=Cyan>)</font>-<a name="(line244)"></a>xmlAny w<font color=Red>@</font><font color=Cyan>(</font>NotInTag<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> p s <font color=Red>=</font> xmlContent <font color=Magenta>""</font> w p p s-<a name="(line245)"></a><font color=Blue>-- everything below here is implicitly InTag.</font>-<a name="(line246)"></a>xmlAny w p <font color=Cyan>(</font><font color=Magenta>'>'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokAnyClose p<font color=Red><b>:</b></font> xmlAny <font color=Cyan>(</font>tail w<font color=Cyan>)</font> <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line247)"></a>xmlAny w p <font color=Cyan>(</font><font color=Magenta>'['</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokSqOpen p<font color=Red><b>:</b></font>-<a name="(line248)"></a> blank xmlAny <font color=Cyan>(</font>InTag <font color=Magenta>"[...]"</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font> <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line249)"></a>xmlAny w p <font color=Cyan>(</font><font color=Magenta>']'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font>-<a name="(line250)"></a> <font color=Red>|</font> <font color=Magenta>"]>"</font> <font color=Cyan>`prefixes`</font> ss <font color=Red>=</font>-<a name="(line251)"></a> emit TokSectionClose p<font color=Red><b>:</b></font> skip <font color=Magenta>3</font> p <font color=Cyan>(</font><font color=Magenta>']'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Cyan>(</font>xmlAny <font color=Cyan>(</font>tail w<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line252)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> emit TokSqClose p<font color=Red><b>:</b></font> blank xmlAny <font color=Cyan>(</font>tail w<font color=Cyan>)</font> <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line253)"></a>xmlAny w p <font color=Cyan>(</font><font color=Magenta>'('</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokBraOpen p<font color=Red><b>:</b></font>-<a name="(line254)"></a> blank xmlAny <font color=Cyan>(</font>InTag <font color=Magenta>"(...)"</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font> <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line255)"></a>xmlAny w p <font color=Cyan>(</font><font color=Magenta>')'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokBraClose p<font color=Red><b>:</b></font> blank xmlAny <font color=Cyan>(</font>tail w<font color=Cyan>)</font> <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line256)"></a>xmlAny w p <font color=Cyan>(</font><font color=Magenta>'='</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokEqual p<font color=Red><b>:</b></font> blank xmlAny w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line257)"></a>xmlAny w p <font color=Cyan>(</font><font color=Magenta>'*'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokStar p<font color=Red><b>:</b></font> blank xmlAny w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line258)"></a>xmlAny w p <font color=Cyan>(</font><font color=Magenta>'+'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokPlus p<font color=Red><b>:</b></font> blank xmlAny w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line259)"></a>xmlAny w p <font color=Cyan>(</font><font color=Magenta>'?'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokQuery p<font color=Red><b>:</b></font> blank xmlAny w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line260)"></a>xmlAny w p <font color=Cyan>(</font><font color=Magenta>'|'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokPipe p<font color=Red><b>:</b></font> blank xmlAny w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line261)"></a>xmlAny w p <font color=Cyan>(</font><font color=Magenta>'%'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokPercent p<font color=Red><b>:</b></font> blank xmlAny w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line262)"></a>xmlAny w p <font color=Cyan>(</font><font color=Magenta>';'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokSemi p<font color=Red><b>:</b></font> blank xmlAny w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line263)"></a>xmlAny w p <font color=Cyan>(</font><font color=Magenta>','</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokComma p<font color=Red><b>:</b></font> blank xmlAny w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line264)"></a>xmlAny w p <font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokHash p<font color=Red><b>:</b></font> blank xmlAny w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line265)"></a>xmlAny w p <font color=Cyan>(</font><font color=Magenta>'"'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokQuote p<font color=Red><b>:</b></font> textOrRefUntil <font color=Magenta>"\""</font> TokQuote <font color=Magenta>""</font> p1-<a name="(line266)"></a> p1 ss <font color=Cyan>(</font>xmlAny w<font color=Cyan>)</font>-<a name="(line267)"></a> <font color=Green><u>where</u></font> p1 <font color=Red>=</font> addcol <font color=Magenta>1</font> p-<a name="(line268)"></a>xmlAny w p <font color=Cyan>(</font><font color=Magenta>'\''</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokQuote p<font color=Red><b>:</b></font> textOrRefUntil <font color=Magenta>"'"</font> TokQuote <font color=Magenta>""</font> p1-<a name="(line269)"></a> p1 ss <font color=Cyan>(</font>xmlAny w<font color=Cyan>)</font>-<a name="(line270)"></a> <font color=Green><u>where</u></font> p1 <font color=Red>=</font> addcol <font color=Magenta>1</font> p-<a name="(line271)"></a>xmlAny w p s-<a name="(line272)"></a> <font color=Red>|</font> isSpace <font color=Cyan>(</font>head s<font color=Cyan>)</font> <font color=Red>=</font> blank xmlAny w p s-<a name="(line273)"></a> <font color=Red>|</font> isAlphaNum <font color=Cyan>(</font>head s<font color=Cyan>)</font> <font color=Cyan>||</font> <font color=Cyan>(</font>head s<font color=Cyan>)</font><font color=Cyan>`elem`</font><font color=Magenta>":_"</font>-<a name="(line274)"></a> <font color=Red>=</font> xmlName p s <font color=Magenta>"some kind of name"</font> <font color=Cyan>(</font>blank xmlAny w<font color=Cyan>)</font>-<a name="(line275)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> lexerror <font color=Cyan>(</font><font color=Magenta>"unrecognised token: "</font><font color=Cyan>++</font>take <font color=Magenta>4</font> s<font color=Cyan>)</font> p-<a name="(line276)"></a>-<a name="(line277)"></a><a name="xmlTag"></a>xmlTag w p s <font color=Red>=</font> xmlName p s <font color=Magenta>"tagname for element in < >"</font> <font color=Cyan>(</font>blank xmlAny w<font color=Cyan>)</font>-<a name="(line278)"></a>-<a name="(line279)"></a><a name="xmlSection"></a>xmlSection <font color=Red>=</font> blank xmlSection0-<a name="(line280)"></a> <font color=Green><u>where</u></font>-<a name="(line281)"></a> xmlSection0 w p s-<a name="(line282)"></a> <font color=Red>|</font> <font color=Magenta>"CDATA["</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSection CDATAx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> accum w p s <font color=Magenta>6</font>-<a name="(line283)"></a> <font color=Red>|</font> <font color=Magenta>"INCLUDE"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSection INCLUDEx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> k w p s <font color=Magenta>7</font>-<a name="(line284)"></a> <font color=Red>|</font> <font color=Magenta>"IGNORE"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSection IGNOREx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> k w p s <font color=Magenta>6</font>-<a name="(line285)"></a> <font color=Red>|</font> <font color=Magenta>"%"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit TokPercent p<font color=Red><b>:</b></font> k w p s <font color=Magenta>1</font>-<a name="(line286)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> lexerror <font color=Cyan>(</font><font color=Magenta>"expected CDATA, IGNORE, or INCLUDE, but got "</font>-<a name="(line287)"></a> <font color=Cyan>++</font>take <font color=Magenta>7</font> s<font color=Cyan>)</font> p-<a name="(line288)"></a> accum w p s n <font color=Red>=</font>-<a name="(line289)"></a> <font color=Green><u>let</u></font> p0 <font color=Red>=</font> addcol n p <font color=Green><u>in</u></font>-<a name="(line290)"></a> textUntil <font color=Magenta>"]]>"</font> TokSectionClose <font color=Magenta>""</font> p0 p0 <font color=Cyan>(</font>drop n s<font color=Cyan>)</font> <font color=Cyan>(</font>blank xmlAny w<font color=Cyan>)</font>-<a name="(line291)"></a> k w p s n <font color=Red>=</font>-<a name="(line292)"></a> skip n p s <font color=Cyan>(</font>xmlAny <font color=Cyan>(</font><font color=Blue>{-InTag "<![section[ ... ]]>": -}</font>w<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line293)"></a>-<a name="(line294)"></a><a name="xmlSpecial"></a>xmlSpecial w p s-<a name="(line295)"></a> <font color=Red>|</font> <font color=Magenta>"DOCTYPE"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSpecial DOCTYPEx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> k <font color=Magenta>7</font>-<a name="(line296)"></a> <font color=Red>|</font> <font color=Magenta>"ELEMENT"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSpecial ELEMENTx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> k <font color=Magenta>7</font>-<a name="(line297)"></a> <font color=Red>|</font> <font color=Magenta>"ATTLIST"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSpecial ATTLISTx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> k <font color=Magenta>7</font>-<a name="(line298)"></a> <font color=Red>|</font> <font color=Magenta>"ENTITY"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSpecial ENTITYx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> k <font color=Magenta>6</font>-<a name="(line299)"></a> <font color=Red>|</font> <font color=Magenta>"NOTATION"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSpecial NOTATIONx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> k <font color=Magenta>8</font>-<a name="(line300)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> lexerror-<a name="(line301)"></a> <font color=Cyan>(</font><font color=Magenta>"expected DOCTYPE, ELEMENT, ENTITY, ATTLIST, or NOTATION,"</font>-<a name="(line302)"></a> <font color=Cyan>++</font><font color=Magenta>" but got "</font><font color=Cyan>++</font>take <font color=Magenta>7</font> s<font color=Cyan>)</font> p-<a name="(line303)"></a> <font color=Green><u>where</u></font> k n <font color=Red>=</font> skip n p s <font color=Cyan>(</font>blank xmlAny w<font color=Cyan>)</font>-<a name="(line304)"></a>-<a name="(line305)"></a><a name="xmlName"></a>xmlName p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> cxt k-<a name="(line306)"></a> <font color=Red>|</font> isAlphaNum s <font color=Cyan>||</font> s<font color=Cyan>==</font><font color=Magenta>':'</font> <font color=Cyan>||</font> s<font color=Cyan>==</font><font color=Magenta>'_'</font> <font color=Red>=</font> gatherName <font color=Cyan>(</font>s<font color=Red><b>:</b></font>[]<font color=Cyan>)</font> p <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss k-<a name="(line307)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> lexerror <font color=Cyan>(</font><font color=Magenta>"expected a "</font><font color=Cyan>++</font>cxt<font color=Cyan>++</font><font color=Magenta>", but got char "</font><font color=Cyan>++</font>show s<font color=Cyan>)</font> p-<a name="(line308)"></a> <font color=Green><u>where</u></font>-<a name="(line309)"></a> gatherName acc pos p [] k <font color=Red>=</font>-<a name="(line310)"></a> emit <font color=Cyan>(</font>TokName <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font> k p []-<a name="(line311)"></a> <font color=Blue>-- lexerror ("unexpected EOF in name at "++show pos) p</font>-<a name="(line312)"></a> gatherName acc pos p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> k-<a name="(line313)"></a> <font color=Red>|</font> isAlphaNum s <font color=Cyan>||</font> s <font color=Cyan>`elem`</font> <font color=Magenta>".-_:"</font>-<a name="(line314)"></a> <font color=Red>=</font> gatherName <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> pos <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss k-<a name="(line315)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> emit <font color=Cyan>(</font>TokName <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font> k p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font>-<a name="(line316)"></a>xmlName p [] cxt k <font color=Red>=</font> lexerror <font color=Cyan>(</font><font color=Magenta>"expected a "</font><font color=Cyan>++</font>cxt<font color=Cyan>++</font><font color=Magenta>", but got end of input"</font><font color=Cyan>)</font> p-<a name="(line317)"></a>-<a name="(line318)"></a><a name="xmlContent"></a>xmlContent acc w pos p [] <font color=Red>=</font> <font color=Green><u>if</u></font> all isSpace acc <font color=Green><u>then</u></font> []-<a name="(line319)"></a> <font color=Green><u>else</u></font> lexerror <font color=Magenta>"unexpected EOF between tags"</font> p-<a name="(line320)"></a>xmlContent acc w pos p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font>-<a name="(line321)"></a> <font color=Red>|</font> elem s <font color=Magenta>"<&"</font> <font color=Red>=</font> <font color=Blue>{- if all isSpace acc then xmlAny w p (s:ss) else -}</font>-<a name="(line322)"></a> emit <font color=Cyan>(</font>TokFreeText <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font> xmlAny w p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font>-<a name="(line323)"></a> <font color=Red>|</font> isSpace s <font color=Red>=</font> xmlContent <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> w pos <font color=Cyan>(</font>white s p<font color=Cyan>)</font> ss-<a name="(line324)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> xmlContent <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> w pos <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line325)"></a>-<a name="(line326)"></a>-<a name="(line327)"></a>-<a name="(line328)"></a><font color=Blue>--ident :: (String->TokenT) -></font>-<a name="(line329)"></a><font color=Blue>-- Posn -> String -> [String] -></font>-<a name="(line330)"></a><font color=Blue>-- (Posn->String->[String]->[Token]) -> [Token]</font>-<a name="(line331)"></a><font color=Blue>--ident tok p s ss k =</font>-<a name="(line332)"></a><font color=Blue>-- let (name,s0) = span (\c-> isAlphaNum c || c `elem` "`-_#.'/\\") s</font>-<a name="(line333)"></a><font color=Blue>-- in emit (tok name) p: skip (length name) p s ss k</font>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/Lex.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>-- | You don't normally need to use this Lex module directly - it is</font>+<a name="line-2"></a><font color=Blue>-- called automatically by the parser. (This interface is only exposed</font>+<a name="line-3"></a><font color=Blue>-- for debugging purposes.)</font>+<a name="line-4"></a><font color=Blue>--</font>+<a name="line-5"></a><font color=Blue>-- This is a hand-written lexer for tokenising the text of an XML</font>+<a name="line-6"></a><font color=Blue>-- document so that it is ready for parsing. It attaches position</font>+<a name="line-7"></a><font color=Blue>-- information in (line,column) format to every token. The main</font>+<a name="line-8"></a><font color=Blue>-- entry point is 'xmlLex'. A secondary entry point, 'xmlReLex', is</font>+<a name="line-9"></a><font color=Blue>-- provided for when the parser needs to stuff a string back onto</font>+<a name="line-10"></a><font color=Blue>-- the front of the text and re-tokenise it (typically when expanding</font>+<a name="line-11"></a><font color=Blue>-- macros).</font>+<a name="line-12"></a><font color=Blue>--</font>+<a name="line-13"></a><font color=Blue>-- As one would expect, the lexer is essentially a small finite</font>+<a name="line-14"></a><font color=Blue>-- state machine.</font>+<a name="line-15"></a>+<a name="line-16"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Lex+<a name="line-17"></a> <font color=Cyan>(</font>+<a name="line-18"></a> <font color=Blue>-- * Entry points to the lexer</font>+<a name="line-19"></a> xmlLex <font color=Blue>-- :: String -> String -> [Token]</font>+<a name="line-20"></a> <font color=Cyan>,</font> xmlReLex <font color=Blue>-- :: Posn -> String -> [Token]</font>+<a name="line-21"></a> <font color=Cyan>,</font> reLexEntityValue <font color=Blue>-- :: (String->Maybe String) -> Posn -> String -> [Token]</font>+<a name="line-22"></a> <font color=Blue>-- * Token types</font>+<a name="line-23"></a> <font color=Cyan>,</font> Token+<a name="line-24"></a> <font color=Cyan>,</font> TokenT<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-25"></a> <font color=Cyan>,</font> Special<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-26"></a> <font color=Cyan>,</font> Section<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-27"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-28"></a>+<a name="line-29"></a><font color=Green><u>import</u></font> Char+<a name="line-30"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Posn+<a name="line-31"></a>+<a name="line-32"></a><a name="Where"></a><font color=Green><u>data</u></font> Where <font color=Red>=</font> InTag String <font color=Red>|</font> NotInTag+<a name="line-33"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>)</font>+<a name="line-34"></a>+<a name="line-35"></a><a name="Token"></a><font color=Blue>-- | All tokens are paired up with a source position.</font>+<a name="line-36"></a><a name="Token"></a><font color=Blue>-- Lexical errors are passed back as a special @TokenT@ value.</font>+<a name="line-37"></a><a name="Token"></a><font color=Green><u>type</u></font> Token <font color=Red>=</font> <font color=Cyan>(</font>Posn<font color=Cyan>,</font> TokenT<font color=Cyan>)</font>+<a name="line-38"></a>+<a name="line-39"></a><a name="TokenT"></a><font color=Blue>-- | The basic token type.</font>+<a name="line-40"></a><a name="TokenT"></a><font color=Green><u>data</u></font> TokenT <font color=Red>=</font>+<a name="line-41"></a> TokCommentOpen <font color=Blue>-- ^ \<!--</font>+<a name="line-42"></a> <font color=Red>|</font> TokCommentClose <font color=Blue>-- ^ --></font>+<a name="line-43"></a> <font color=Red>|</font> TokPIOpen <font color=Blue>-- ^ \<?</font>+<a name="line-44"></a> <font color=Red>|</font> TokPIClose <font color=Blue>-- ^ ?></font>+<a name="line-45"></a> <font color=Red>|</font> TokSectionOpen <font color=Blue>-- ^ \<![</font>+<a name="line-46"></a> <font color=Red>|</font> TokSectionClose <font color=Blue>-- ^ ]]></font>+<a name="line-47"></a> <font color=Red>|</font> TokSection Section <font color=Blue>-- ^ CDATA INCLUDE IGNORE etc</font>+<a name="line-48"></a> <font color=Red>|</font> TokSpecialOpen <font color=Blue>-- ^ \<!</font>+<a name="line-49"></a> <font color=Red>|</font> TokSpecial Special <font color=Blue>-- ^ DOCTYPE ELEMENT ATTLIST etc</font>+<a name="line-50"></a> <font color=Red>|</font> TokEndOpen <font color=Blue>-- ^ \<\/</font>+<a name="line-51"></a> <font color=Red>|</font> TokEndClose <font color=Blue>-- ^ \/></font>+<a name="line-52"></a> <font color=Red>|</font> TokAnyOpen <font color=Blue>-- ^ \<</font>+<a name="line-53"></a> <font color=Red>|</font> TokAnyClose <font color=Blue>-- ^ ></font>+<a name="line-54"></a> <font color=Red>|</font> TokSqOpen <font color=Blue>-- ^ \[</font>+<a name="line-55"></a> <font color=Red>|</font> TokSqClose <font color=Blue>-- ^ \]</font>+<a name="line-56"></a> <font color=Red>|</font> TokEqual <font color=Blue>-- ^ =</font>+<a name="line-57"></a> <font color=Red>|</font> TokQuery <font color=Blue>-- ^ ?</font>+<a name="line-58"></a> <font color=Red>|</font> TokStar <font color=Blue>-- ^ \*</font>+<a name="line-59"></a> <font color=Red>|</font> TokPlus <font color=Blue>-- ^ +</font>+<a name="line-60"></a> <font color=Red>|</font> TokAmp <font color=Blue>-- ^ &</font>+<a name="line-61"></a> <font color=Red>|</font> TokSemi <font color=Blue>-- ^ ;</font>+<a name="line-62"></a> <font color=Red>|</font> TokHash <font color=Blue>-- ^ #</font>+<a name="line-63"></a> <font color=Red>|</font> TokBraOpen <font color=Blue>-- ^ (</font>+<a name="line-64"></a> <font color=Red>|</font> TokBraClose <font color=Blue>-- ^ )</font>+<a name="line-65"></a> <font color=Red>|</font> TokPipe <font color=Blue>-- ^ |</font>+<a name="line-66"></a> <font color=Red>|</font> TokPercent <font color=Blue>-- ^ %</font>+<a name="line-67"></a> <font color=Red>|</font> TokComma <font color=Blue>-- ^ ,</font>+<a name="line-68"></a> <font color=Red>|</font> TokQuote <font color=Blue>-- ^ \'\' or \"\"</font>+<a name="line-69"></a> <font color=Red>|</font> TokName String <font color=Blue>-- ^ begins with letter, no spaces</font>+<a name="line-70"></a> <font color=Red>|</font> TokFreeText String <font color=Blue>-- ^ any character data</font>+<a name="line-71"></a> <font color=Red>|</font> TokNull <font color=Blue>-- ^ fake token</font>+<a name="line-72"></a> <font color=Red>|</font> TokError String <font color=Blue>-- ^ lexical error</font>+<a name="line-73"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>)</font>+<a name="line-74"></a>+<a name="line-75"></a><a name="Special"></a><font color=Green><u>data</u></font> Special <font color=Red>=</font>+<a name="line-76"></a> DOCTYPEx+<a name="line-77"></a> <font color=Red>|</font> ELEMENTx+<a name="line-78"></a> <font color=Red>|</font> ATTLISTx+<a name="line-79"></a> <font color=Red>|</font> ENTITYx+<a name="line-80"></a> <font color=Red>|</font> NOTATIONx+<a name="line-81"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-82"></a><a name="Section"></a><font color=Green><u>data</u></font> Section <font color=Red>=</font>+<a name="line-83"></a> CDATAx+<a name="line-84"></a> <font color=Red>|</font> INCLUDEx+<a name="line-85"></a> <font color=Red>|</font> IGNOREx+<a name="line-86"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-87"></a>+<a name="line-88"></a><font color=Green><u>instance</u></font> Show TokenT <font color=Green><u>where</u></font>+<a name="line-89"></a> showsPrec p TokCommentOpen <font color=Red>=</font> showString <font color=Magenta>"<!--"</font>+<a name="line-90"></a> showsPrec p TokCommentClose <font color=Red>=</font> showString <font color=Magenta>"-->"</font>+<a name="line-91"></a> showsPrec p TokPIOpen <font color=Red>=</font> showString <font color=Magenta>"<?"</font>+<a name="line-92"></a> showsPrec p TokPIClose <font color=Red>=</font> showString <font color=Magenta>"?>"</font>+<a name="line-93"></a> showsPrec p TokSectionOpen <font color=Red>=</font> showString <font color=Magenta>"<!["</font>+<a name="line-94"></a> showsPrec p TokSectionClose <font color=Red>=</font> showString <font color=Magenta>"]]>"</font>+<a name="line-95"></a> showsPrec p <font color=Cyan>(</font>TokSection s<font color=Cyan>)</font> <font color=Red>=</font> showsPrec p s+<a name="line-96"></a> showsPrec p TokSpecialOpen <font color=Red>=</font> showString <font color=Magenta>"<!"</font>+<a name="line-97"></a> showsPrec p <font color=Cyan>(</font>TokSpecial s<font color=Cyan>)</font> <font color=Red>=</font> showsPrec p s+<a name="line-98"></a> showsPrec p TokEndOpen <font color=Red>=</font> showString <font color=Magenta>"</"</font>+<a name="line-99"></a> showsPrec p TokEndClose <font color=Red>=</font> showString <font color=Magenta>"/>"</font>+<a name="line-100"></a> showsPrec p TokAnyOpen <font color=Red>=</font> showString <font color=Magenta>"<"</font>+<a name="line-101"></a> showsPrec p TokAnyClose <font color=Red>=</font> showString <font color=Magenta>">"</font>+<a name="line-102"></a> showsPrec p TokSqOpen <font color=Red>=</font> showString <font color=Magenta>"["</font>+<a name="line-103"></a> showsPrec p TokSqClose <font color=Red>=</font> showString <font color=Magenta>"]"</font>+<a name="line-104"></a> showsPrec p TokEqual <font color=Red>=</font> showString <font color=Magenta>"="</font>+<a name="line-105"></a> showsPrec p TokQuery <font color=Red>=</font> showString <font color=Magenta>"?"</font>+<a name="line-106"></a> showsPrec p TokStar <font color=Red>=</font> showString <font color=Magenta>"*"</font>+<a name="line-107"></a> showsPrec p TokPlus <font color=Red>=</font> showString <font color=Magenta>"+"</font>+<a name="line-108"></a> showsPrec p TokAmp <font color=Red>=</font> showString <font color=Magenta>"&"</font>+<a name="line-109"></a> showsPrec p TokSemi <font color=Red>=</font> showString <font color=Magenta>";"</font>+<a name="line-110"></a> showsPrec p TokHash <font color=Red>=</font> showString <font color=Magenta>"#"</font>+<a name="line-111"></a> showsPrec p TokBraOpen <font color=Red>=</font> showString <font color=Magenta>"("</font>+<a name="line-112"></a> showsPrec p TokBraClose <font color=Red>=</font> showString <font color=Magenta>")"</font>+<a name="line-113"></a> showsPrec p TokPipe <font color=Red>=</font> showString <font color=Magenta>"|"</font>+<a name="line-114"></a> showsPrec p TokPercent <font color=Red>=</font> showString <font color=Magenta>"%"</font>+<a name="line-115"></a> showsPrec p TokComma <font color=Red>=</font> showString <font color=Magenta>","</font>+<a name="line-116"></a> showsPrec p TokQuote <font color=Red>=</font> showString <font color=Magenta>"' or \""</font>+<a name="line-117"></a> showsPrec p <font color=Cyan>(</font>TokName s<font color=Cyan>)</font> <font color=Red>=</font> showString s+<a name="line-118"></a> showsPrec p <font color=Cyan>(</font>TokFreeText s<font color=Cyan>)</font> <font color=Red>=</font> showString s+<a name="line-119"></a> showsPrec p TokNull <font color=Red>=</font> showString <font color=Magenta>"(null)"</font>+<a name="line-120"></a> showsPrec p <font color=Cyan>(</font>TokError s<font color=Cyan>)</font> <font color=Red>=</font> showString s+<a name="line-121"></a>+<a name="line-122"></a><font color=Blue>--trim, revtrim :: String -> String</font>+<a name="line-123"></a><font color=Blue>--trim = f . f where f = reverse . dropWhile isSpace</font>+<a name="line-124"></a><font color=Blue>--revtrim = f.reverse.f where f = dropWhile isSpace</font>+<a name="line-125"></a><font color=Blue>--revtrim = reverse . dropWhile (=='\n') -- most recently used defn.</font>+<a name="line-126"></a>+<a name="line-127"></a><a name="emit"></a><font color=Blue>emit</font> <font color=Red>::</font> TokenT <font color=Red>-></font> Posn <font color=Red>-></font> Token+<a name="line-128"></a><font color=Blue>emit</font> tok p <font color=Red>=</font> forcep p <font color=Cyan>`seq`</font> <font color=Cyan>(</font>p<font color=Cyan>,</font>tok<font color=Cyan>)</font>+<a name="line-129"></a>+<a name="line-130"></a><a name="lexerror"></a><font color=Blue>lexerror</font> <font color=Red>::</font> String <font color=Red>-></font> Posn <font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>+<a name="line-131"></a><font color=Blue>lexerror</font> s p <font color=Red>=</font> <font color=Red>[</font><font color=Cyan>(</font>p<font color=Cyan>,</font> TokError <font color=Cyan>(</font><font color=Magenta>"Lexical error:\n "</font><font color=Cyan>++</font>s<font color=Cyan>)</font><font color=Cyan>)</font><font color=Red>]</font>+<a name="line-132"></a>+<a name="line-133"></a><a name="skip"></a><font color=Blue>skip</font> <font color=Red>::</font> Int <font color=Red>-></font> Posn <font color=Red>-></font> String <font color=Red>-></font> <font color=Cyan>(</font>Posn<font color=Red>-></font>String<font color=Red>-></font><font color=Red>[</font>Token<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>+<a name="line-134"></a><font color=Blue>skip</font> n p s k <font color=Red>=</font> k <font color=Cyan>(</font>addcol n p<font color=Cyan>)</font> <font color=Cyan>(</font>drop n s<font color=Cyan>)</font>+<a name="line-135"></a>+<a name="line-136"></a><a name="blank"></a><font color=Blue>blank</font> <font color=Red>::</font> <font color=Cyan>(</font><font color=Red>[</font>Where<font color=Red>]</font><font color=Red>-></font>Posn<font color=Red>-></font>String<font color=Red>-></font><font color=Red>[</font>Token<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>Where<font color=Red>]</font><font color=Red>-></font> Posn<font color=Red>-></font> String<font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>+<a name="line-137"></a><font color=Blue>blank</font> k <font color=Cyan>(</font>InTag t<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> p [] <font color=Red>=</font> lexerror <font color=Cyan>(</font><font color=Magenta>"unexpected EOF within "</font><font color=Cyan>++</font>t<font color=Cyan>)</font> p+<a name="line-138"></a><font color=Blue>blank</font> k <font color=Green><u>_</u></font> p [] <font color=Red>=</font> []+<a name="line-139"></a><font color=Blue>blank</font> k w p <font color=Cyan>(</font><font color=Magenta>' '</font><font color=Red><b>:</b></font> s<font color=Cyan>)</font> <font color=Red>=</font> blank k w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> s+<a name="line-140"></a><font color=Blue>blank</font> k w p <font color=Cyan>(</font><font color=Magenta>'\t'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font> <font color=Red>=</font> blank k w <font color=Cyan>(</font>tab p<font color=Cyan>)</font> s+<a name="line-141"></a><font color=Blue>blank</font> k w p <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font> <font color=Red>=</font> blank k w <font color=Cyan>(</font>newline p<font color=Cyan>)</font> s+<a name="line-142"></a><font color=Blue>blank</font> k w p <font color=Cyan>(</font><font color=Magenta>'\r'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font> <font color=Red>=</font> blank k w p s+<a name="line-143"></a><font color=Blue>blank</font> k w p <font color=Cyan>(</font><font color=Magenta>'\xa0'</font><font color=Red><b>:</b></font> s<font color=Cyan>)</font> <font color=Red>=</font> blank k w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> s+<a name="line-144"></a><font color=Blue>blank</font> k w p s <font color=Red>=</font> k w p s+<a name="line-145"></a>+<a name="line-146"></a><a name="prefixes"></a><font color=Blue>prefixes</font> <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Bool+<a name="line-147"></a>[] <font color=Cyan>`prefixes`</font> ys <font color=Red>=</font> True+<a name="line-148"></a><a name="prefixes"></a><font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Cyan>`prefixes`</font> <font color=Cyan>(</font>y<font color=Red><b>:</b></font>ys<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Cyan>==</font>y <font color=Cyan>&&</font> xs <font color=Cyan>`prefixes`</font> ys+<a name="line-149"></a><a name="prefixes"></a><font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Cyan>`prefixes`</font> [] <font color=Red>=</font> False <font color=Blue>--error "unexpected EOF in prefix"</font>+<a name="line-150"></a>+<a name="line-151"></a><a name="textUntil"></a><font color=Blue>textUntil</font> close tok acc pos p [] k <font color=Red>=</font>+<a name="line-152"></a> lexerror <font color=Cyan>(</font><font color=Magenta>"unexpected EOF while looking for closing token "</font><font color=Cyan>++</font>close+<a name="line-153"></a> <font color=Cyan>++</font><font color=Magenta>"\n to match the opening token in "</font><font color=Cyan>++</font>show pos<font color=Cyan>)</font> p+<a name="line-154"></a><font color=Blue>textUntil</font> close tok acc pos p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> k+<a name="line-155"></a> <font color=Red>|</font> close <font color=Cyan>`prefixes`</font> <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>TokFreeText <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font>+<a name="line-156"></a> emit tok p<font color=Red><b>:</b></font>+<a name="line-157"></a> skip <font color=Cyan>(</font>length close<font color=Blue>-</font><font color=Magenta>1</font><font color=Cyan>)</font> <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss k+<a name="line-158"></a> <font color=Red>|</font> isSpace s <font color=Red>=</font> textUntil close tok <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> pos <font color=Cyan>(</font>white s p<font color=Cyan>)</font> ss k+<a name="line-159"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> textUntil close tok <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> pos <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss k+<a name="line-160"></a>+<a name="line-161"></a><a name="textOrRefUntil"></a><font color=Blue>textOrRefUntil</font> close tok acc pos p [] k <font color=Red>=</font>+<a name="line-162"></a> lexerror <font color=Cyan>(</font><font color=Magenta>"unexpected EOF while looking for closing token "</font><font color=Cyan>++</font>close+<a name="line-163"></a> <font color=Cyan>++</font><font color=Magenta>"\n to match the opening token in "</font><font color=Cyan>++</font>show pos<font color=Cyan>)</font> p+<a name="line-164"></a><font color=Blue>textOrRefUntil</font> close tok acc pos p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> k+<a name="line-165"></a> <font color=Red>|</font> close <font color=Cyan>`prefixes`</font> <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>TokFreeText <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font>+<a name="line-166"></a> emit tok p<font color=Red><b>:</b></font>+<a name="line-167"></a> skip <font color=Cyan>(</font>length close<font color=Blue>-</font><font color=Magenta>1</font><font color=Cyan>)</font> <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss k+<a name="line-168"></a> <font color=Red>|</font> s<font color=Cyan>==</font><font color=Magenta>'&'</font> <font color=Red>=</font> <font color=Cyan>(</font><font color=Green><u>if</u></font> not <font color=Cyan>(</font>null acc<font color=Cyan>)</font>+<a name="line-169"></a> <font color=Green><u>then</u></font> <font color=Cyan>(</font>emit <font color=Cyan>(</font>TokFreeText <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font><font color=Cyan>)</font>+<a name="line-170"></a> <font color=Green><u>else</u></font> id<font color=Cyan>)</font>+<a name="line-171"></a> <font color=Cyan>(</font>emit TokAmp p<font color=Red><b>:</b></font>+<a name="line-172"></a> textUntil <font color=Magenta>";"</font> TokSemi <font color=Magenta>""</font> p <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-173"></a> <font color=Cyan>(</font><font color=Red>\</font>p' i<font color=Red>-></font> textOrRefUntil close tok <font color=Magenta>""</font> p p' i k<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-174"></a> <font color=Red>|</font> isSpace s <font color=Red>=</font> textOrRefUntil close tok <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> pos <font color=Cyan>(</font>white s p<font color=Cyan>)</font> ss k+<a name="line-175"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> textOrRefUntil close tok <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> pos <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss k+<a name="line-176"></a>+<a name="line-177"></a><font color=Blue>----</font>+<a name="line-178"></a>+<a name="line-179"></a><a name="xmlLex"></a><font color=Blue>-- | The first argument to 'xmlLex' is the filename (used for source positions,</font>+<a name="line-180"></a><font color=Blue>-- especially in error messages), and the second is the string content of</font>+<a name="line-181"></a><font color=Blue>-- the XML file.</font>+<a name="line-182"></a><font color=Blue>xmlLex</font> <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>+<a name="line-183"></a><font color=Blue>xmlLex</font> filename <font color=Red>=</font> xmlAny [] <font color=Cyan>(</font>posInNewCxt filename Nothing<font color=Cyan>)</font>+<a name="line-184"></a>+<a name="line-185"></a><a name="xmlReLex"></a><font color=Blue>-- | 'xmlReLex' is used when the parser expands a macro (PE reference).</font>+<a name="line-186"></a><font color=Blue>-- The expansion of the macro must be re-lexed as if for the first time.</font>+<a name="line-187"></a><font color=Blue>xmlReLex</font> <font color=Red>::</font> Posn <font color=Red>-></font> String <font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>+<a name="line-188"></a><font color=Blue>xmlReLex</font> p s+<a name="line-189"></a> <font color=Red>|</font> <font color=Magenta>"INCLUDE"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSection INCLUDEx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> k <font color=Magenta>7</font>+<a name="line-190"></a> <font color=Red>|</font> <font color=Magenta>"IGNORE"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSection IGNOREx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> k <font color=Magenta>6</font>+<a name="line-191"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> blank xmlAny [] p s+<a name="line-192"></a> <font color=Green><u>where</u></font>+<a name="line-193"></a> k n <font color=Red>=</font> skip n p s <font color=Cyan>(</font>blank xmlAny []<font color=Cyan>)</font>+<a name="line-194"></a>+<a name="line-195"></a><a name="reLexEntityValue"></a><font color=Blue>-- | 'reLexEntityValue' is used solely within parsing an entityvalue.</font>+<a name="line-196"></a><font color=Blue>-- Normally, a PERef is logically separated from its surroundings by</font>+<a name="line-197"></a><font color=Blue>-- whitespace. But in an entityvalue, a PERef can be juxtaposed to</font>+<a name="line-198"></a><font color=Blue>-- an identifier, so the expansion forms a new identifier.</font>+<a name="line-199"></a><font color=Blue>-- Thus the need to rescan the whole text for possible PERefs.</font>+<a name="line-200"></a><font color=Blue>reLexEntityValue</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>Maybe String<font color=Cyan>)</font> <font color=Red>-></font> Posn <font color=Red>-></font> String <font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>+<a name="line-201"></a><font color=Blue>reLexEntityValue</font> lookup p s <font color=Red>=</font>+<a name="line-202"></a> textOrRefUntil <font color=Magenta>"%"</font> TokNull [] p p <font color=Cyan>(</font>expand s<font color=Cyan>++</font><font color=Magenta>"%"</font><font color=Cyan>)</font> <font color=Cyan>(</font>xmlAny []<font color=Cyan>)</font>+<a name="line-203"></a> <font color=Green><u>where</u></font>+<a name="line-204"></a> expand [] <font color=Red>=</font> []+<a name="line-205"></a> expand <font color=Cyan>(</font><font color=Magenta>'%'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>sym<font color=Cyan>,</font>rest<font color=Cyan>)</font> <font color=Red>=</font> break <font color=Cyan>(</font><font color=Cyan>==</font><font color=Magenta>';'</font><font color=Cyan>)</font> ss <font color=Green><u>in</u></font>+<a name="line-206"></a> <font color=Green><u>case</u></font> lookup sym <font color=Green><u>of</u></font>+<a name="line-207"></a> Just val <font color=Red>-></font> expand val <font color=Cyan>++</font> expand <font color=Cyan>(</font>tail rest<font color=Cyan>)</font>+<a name="line-208"></a> Nothing <font color=Red>-></font> <font color=Magenta>"%"</font><font color=Cyan>++</font>sym<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>++</font> expand <font color=Cyan>(</font>tail rest<font color=Cyan>)</font> <font color=Blue>-- hmmm</font>+<a name="line-209"></a> expand <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> s<font color=Red><b>:</b></font> expand ss+<a name="line-210"></a>+<a name="line-211"></a><font color=Blue>--xmltop :: Posn -> String -> [Token]</font>+<a name="line-212"></a><font color=Blue>--xmltop p [] = []</font>+<a name="line-213"></a><font color=Blue>--xmltop p s</font>+<a name="line-214"></a><font color=Blue>-- | "<?" `prefixes` s = emit TokPIOpen p: next 2 (xmlPI [InTag "<?...?>"])</font>+<a name="line-215"></a><font color=Blue>-- | "<!--" `prefixes` s = emit TokCommentOpen p: next 4 (xmlComment [])</font>+<a name="line-216"></a><font color=Blue>-- | "<!" `prefixes` s = emit TokSpecialOpen p: next 2 (xmlSpecial [InTag "<!...>"])</font>+<a name="line-217"></a><font color=Blue>-- | otherwise = lexerror "expected <?xml?> or <!DOCTYPE>" p</font>+<a name="line-218"></a><font color=Blue>-- where next n k = skip n p s k</font>+<a name="line-219"></a>+<a name="line-220"></a><a name="xmlPI"></a><font color=Blue>xmlPI</font> w p s <font color=Red>=</font> xmlName p s <font color=Magenta>"name of processor in <? ?>"</font> <font color=Cyan>(</font>blank xmlPIEnd w<font color=Cyan>)</font>+<a name="line-221"></a><a name="xmlPIEnd"></a><font color=Blue>xmlPIEnd</font> w p s <font color=Red>=</font> textUntil <font color=Magenta>"?>"</font> TokPIClose <font color=Magenta>""</font> p p s <font color=Cyan>(</font>blank xmlAny <font color=Cyan>(</font>tail w<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-222"></a><a name="xmlComment"></a><font color=Blue>xmlComment</font> w p s <font color=Red>=</font> textUntil <font color=Magenta>"-->"</font> TokCommentClose <font color=Magenta>""</font> p p s <font color=Cyan>(</font>blank xmlAny w<font color=Cyan>)</font>+<a name="line-223"></a>+<a name="line-224"></a><a name="xmlAny"></a><font color=Blue>-- Note: the order of the clauses in xmlAny is very important.</font>+<a name="line-225"></a><font color=Blue>-- Some matches must precede the NotInTag test, the rest must follow it.</font>+<a name="line-226"></a><font color=Blue>xmlAny</font> <font color=Red>::</font> <font color=Red>[</font>Where<font color=Red>]</font> <font color=Red>-></font> Posn <font color=Red>-></font> String <font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>+<a name="line-227"></a><font color=Blue>xmlAny</font> <font color=Cyan>(</font>InTag t<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> p [] <font color=Red>=</font> lexerror <font color=Cyan>(</font><font color=Magenta>"unexpected EOF within "</font><font color=Cyan>++</font>t<font color=Cyan>)</font> p+<a name="line-228"></a><font color=Blue>xmlAny</font> <font color=Green><u>_</u></font> p [] <font color=Red>=</font> []+<a name="line-229"></a><font color=Blue>xmlAny</font> w p s<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'<'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font>+<a name="line-230"></a> <font color=Red>|</font> <font color=Magenta>"?"</font> <font color=Cyan>`prefixes`</font> ss <font color=Red>=</font> emit TokPIOpen p<font color=Red><b>:</b></font>+<a name="line-231"></a> skip <font color=Magenta>2</font> p s <font color=Cyan>(</font>xmlPI <font color=Cyan>(</font>InTag <font color=Magenta>"<?...?>"</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-232"></a> <font color=Red>|</font> <font color=Magenta>"!--"</font> <font color=Cyan>`prefixes`</font> ss <font color=Red>=</font> emit TokCommentOpen p<font color=Red><b>:</b></font> skip <font color=Magenta>4</font> p s <font color=Cyan>(</font>xmlComment w<font color=Cyan>)</font>+<a name="line-233"></a> <font color=Red>|</font> <font color=Magenta>"!["</font> <font color=Cyan>`prefixes`</font> ss <font color=Red>=</font> emit TokSectionOpen p<font color=Red><b>:</b></font> skip <font color=Magenta>3</font> p s <font color=Cyan>(</font>xmlSection w<font color=Cyan>)</font>+<a name="line-234"></a> <font color=Red>|</font> <font color=Magenta>"!"</font> <font color=Cyan>`prefixes`</font> ss <font color=Red>=</font> emit TokSpecialOpen p<font color=Red><b>:</b></font>+<a name="line-235"></a> skip <font color=Magenta>2</font> p s <font color=Cyan>(</font>xmlSpecial <font color=Cyan>(</font>InTag <font color=Magenta>"<!...>"</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-236"></a> <font color=Red>|</font> <font color=Magenta>"/"</font> <font color=Cyan>`prefixes`</font> ss <font color=Red>=</font> emit TokEndOpen p<font color=Red><b>:</b></font> +<a name="line-237"></a> skip <font color=Magenta>2</font> p s <font color=Cyan>(</font>xmlTag <font color=Cyan>(</font>InTag <font color=Magenta>"</...>"</font><font color=Red><b>:</b></font>tail w<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-238"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> emit TokAnyOpen p<font color=Red><b>:</b></font>+<a name="line-239"></a> skip <font color=Magenta>1</font> p s <font color=Cyan>(</font>xmlTag <font color=Cyan>(</font>InTag <font color=Magenta>"<...>"</font><font color=Red><b>:</b></font>NotInTag<font color=Red><b>:</b></font>w<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-240"></a><font color=Blue>xmlAny</font> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>w<font color=Cyan>)</font> p s<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font>+<a name="line-241"></a> <font color=Red>|</font> <font color=Magenta>">"</font> <font color=Cyan>`prefixes`</font> ss <font color=Red>=</font> emit TokEndClose p<font color=Red><b>:</b></font> skip <font color=Magenta>2</font> p s <font color=Cyan>(</font>xmlAny w<font color=Cyan>)</font>+<a name="line-242"></a><font color=Blue>xmlAny</font> w p <font color=Cyan>(</font><font color=Magenta>'&'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokAmp p<font color=Red><b>:</b></font> textUntil <font color=Magenta>";"</font> TokSemi <font color=Magenta>""</font> p+<a name="line-243"></a> <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss <font color=Cyan>(</font>xmlAny w<font color=Cyan>)</font>+<a name="line-244"></a><font color=Blue>xmlAny</font> w<font color=Red>@</font><font color=Cyan>(</font>NotInTag<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> p s <font color=Red>=</font> xmlContent <font color=Magenta>""</font> w p p s+<a name="line-245"></a><font color=Blue>-- everything below here is implicitly InTag.</font>+<a name="line-246"></a><font color=Blue>xmlAny</font> w p <font color=Cyan>(</font><font color=Magenta>'>'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokAnyClose p<font color=Red><b>:</b></font> xmlAny <font color=Cyan>(</font>tail w<font color=Cyan>)</font> <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-247"></a><font color=Blue>xmlAny</font> w p <font color=Cyan>(</font><font color=Magenta>'['</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokSqOpen p<font color=Red><b>:</b></font>+<a name="line-248"></a> blank xmlAny <font color=Cyan>(</font>InTag <font color=Magenta>"[...]"</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font> <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-249"></a><font color=Blue>xmlAny</font> w p <font color=Cyan>(</font><font color=Magenta>']'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font>+<a name="line-250"></a> <font color=Red>|</font> <font color=Magenta>"]>"</font> <font color=Cyan>`prefixes`</font> ss <font color=Red>=</font>+<a name="line-251"></a> emit TokSectionClose p<font color=Red><b>:</b></font> skip <font color=Magenta>3</font> p <font color=Cyan>(</font><font color=Magenta>']'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Cyan>(</font>xmlAny <font color=Cyan>(</font>tail w<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-252"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> emit TokSqClose p<font color=Red><b>:</b></font> blank xmlAny <font color=Cyan>(</font>tail w<font color=Cyan>)</font> <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-253"></a><font color=Blue>xmlAny</font> w p <font color=Cyan>(</font><font color=Magenta>'('</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokBraOpen p<font color=Red><b>:</b></font>+<a name="line-254"></a> blank xmlAny <font color=Cyan>(</font>InTag <font color=Magenta>"(...)"</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font> <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-255"></a><font color=Blue>xmlAny</font> w p <font color=Cyan>(</font><font color=Magenta>')'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokBraClose p<font color=Red><b>:</b></font> blank xmlAny <font color=Cyan>(</font>tail w<font color=Cyan>)</font> <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-256"></a><font color=Blue>xmlAny</font> w p <font color=Cyan>(</font><font color=Magenta>'='</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokEqual p<font color=Red><b>:</b></font> blank xmlAny w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-257"></a><font color=Blue>xmlAny</font> w p <font color=Cyan>(</font><font color=Magenta>'*'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokStar p<font color=Red><b>:</b></font> blank xmlAny w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-258"></a><font color=Blue>xmlAny</font> w p <font color=Cyan>(</font><font color=Magenta>'+'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokPlus p<font color=Red><b>:</b></font> blank xmlAny w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-259"></a><font color=Blue>xmlAny</font> w p <font color=Cyan>(</font><font color=Magenta>'?'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokQuery p<font color=Red><b>:</b></font> blank xmlAny w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-260"></a><font color=Blue>xmlAny</font> w p <font color=Cyan>(</font><font color=Magenta>'|'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokPipe p<font color=Red><b>:</b></font> blank xmlAny w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-261"></a><font color=Blue>xmlAny</font> w p <font color=Cyan>(</font><font color=Magenta>'%'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokPercent p<font color=Red><b>:</b></font> blank xmlAny w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-262"></a><font color=Blue>xmlAny</font> w p <font color=Cyan>(</font><font color=Magenta>';'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokSemi p<font color=Red><b>:</b></font> blank xmlAny w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-263"></a><font color=Blue>xmlAny</font> w p <font color=Cyan>(</font><font color=Magenta>','</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokComma p<font color=Red><b>:</b></font> blank xmlAny w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-264"></a><font color=Blue>xmlAny</font> w p <font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokHash p<font color=Red><b>:</b></font> blank xmlAny w <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-265"></a><font color=Blue>xmlAny</font> w p <font color=Cyan>(</font><font color=Magenta>'"'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokQuote p<font color=Red><b>:</b></font> textOrRefUntil <font color=Magenta>"\""</font> TokQuote <font color=Magenta>""</font> p1+<a name="line-266"></a> p1 ss <font color=Cyan>(</font>xmlAny w<font color=Cyan>)</font>+<a name="line-267"></a> <font color=Green><u>where</u></font> p1 <font color=Red>=</font> addcol <font color=Magenta>1</font> p+<a name="line-268"></a><font color=Blue>xmlAny</font> w p <font color=Cyan>(</font><font color=Magenta>'\''</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit TokQuote p<font color=Red><b>:</b></font> textOrRefUntil <font color=Magenta>"'"</font> TokQuote <font color=Magenta>""</font> p1+<a name="line-269"></a> p1 ss <font color=Cyan>(</font>xmlAny w<font color=Cyan>)</font>+<a name="line-270"></a> <font color=Green><u>where</u></font> p1 <font color=Red>=</font> addcol <font color=Magenta>1</font> p+<a name="line-271"></a><font color=Blue>xmlAny</font> w p s+<a name="line-272"></a> <font color=Red>|</font> isSpace <font color=Cyan>(</font>head s<font color=Cyan>)</font> <font color=Red>=</font> blank xmlAny w p s+<a name="line-273"></a> <font color=Red>|</font> isAlphaNum <font color=Cyan>(</font>head s<font color=Cyan>)</font> <font color=Cyan>||</font> <font color=Cyan>(</font>head s<font color=Cyan>)</font><font color=Cyan>`elem`</font><font color=Magenta>":_"</font>+<a name="line-274"></a> <font color=Red>=</font> xmlName p s <font color=Magenta>"some kind of name"</font> <font color=Cyan>(</font>blank xmlAny w<font color=Cyan>)</font>+<a name="line-275"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> lexerror <font color=Cyan>(</font><font color=Magenta>"unrecognised token: "</font><font color=Cyan>++</font>take <font color=Magenta>4</font> s<font color=Cyan>)</font> p+<a name="line-276"></a>+<a name="line-277"></a><a name="xmlTag"></a><font color=Blue>xmlTag</font> w p s <font color=Red>=</font> xmlName p s <font color=Magenta>"tagname for element in < >"</font> <font color=Cyan>(</font>blank xmlAny w<font color=Cyan>)</font>+<a name="line-278"></a>+<a name="line-279"></a><a name="xmlSection"></a><font color=Blue>xmlSection</font> <font color=Red>=</font> blank xmlSection0+<a name="line-280"></a> <font color=Green><u>where</u></font>+<a name="line-281"></a> xmlSection0 w p s+<a name="line-282"></a> <font color=Red>|</font> <font color=Magenta>"CDATA["</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSection CDATAx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> accum w p s <font color=Magenta>6</font>+<a name="line-283"></a> <font color=Red>|</font> <font color=Magenta>"INCLUDE"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSection INCLUDEx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> k w p s <font color=Magenta>7</font>+<a name="line-284"></a> <font color=Red>|</font> <font color=Magenta>"IGNORE"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSection IGNOREx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> k w p s <font color=Magenta>6</font>+<a name="line-285"></a> <font color=Red>|</font> <font color=Magenta>"%"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit TokPercent p<font color=Red><b>:</b></font> k w p s <font color=Magenta>1</font>+<a name="line-286"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> lexerror <font color=Cyan>(</font><font color=Magenta>"expected CDATA, IGNORE, or INCLUDE, but got "</font>+<a name="line-287"></a> <font color=Cyan>++</font>take <font color=Magenta>7</font> s<font color=Cyan>)</font> p+<a name="line-288"></a> accum w p s n <font color=Red>=</font>+<a name="line-289"></a> <font color=Green><u>let</u></font> p0 <font color=Red>=</font> addcol n p <font color=Green><u>in</u></font>+<a name="line-290"></a> textUntil <font color=Magenta>"]]>"</font> TokSectionClose <font color=Magenta>""</font> p0 p0 <font color=Cyan>(</font>drop n s<font color=Cyan>)</font> <font color=Cyan>(</font>blank xmlAny w<font color=Cyan>)</font>+<a name="line-291"></a> k w p s n <font color=Red>=</font>+<a name="line-292"></a> skip n p s <font color=Cyan>(</font>xmlAny <font color=Cyan>(</font><font color=Blue>{-InTag "<![section[ ... ]]>": -}</font>w<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-293"></a>+<a name="line-294"></a><a name="xmlSpecial"></a><font color=Blue>xmlSpecial</font> w p s+<a name="line-295"></a> <font color=Red>|</font> <font color=Magenta>"DOCTYPE"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSpecial DOCTYPEx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> k <font color=Magenta>7</font>+<a name="line-296"></a> <font color=Red>|</font> <font color=Magenta>"ELEMENT"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSpecial ELEMENTx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> k <font color=Magenta>7</font>+<a name="line-297"></a> <font color=Red>|</font> <font color=Magenta>"ATTLIST"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSpecial ATTLISTx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> k <font color=Magenta>7</font>+<a name="line-298"></a> <font color=Red>|</font> <font color=Magenta>"ENTITY"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSpecial ENTITYx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> k <font color=Magenta>6</font>+<a name="line-299"></a> <font color=Red>|</font> <font color=Magenta>"NOTATION"</font> <font color=Cyan>`prefixes`</font> s <font color=Red>=</font> emit <font color=Cyan>(</font>TokSpecial NOTATIONx<font color=Cyan>)</font> p<font color=Red><b>:</b></font> k <font color=Magenta>8</font>+<a name="line-300"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> lexerror+<a name="line-301"></a> <font color=Cyan>(</font><font color=Magenta>"expected DOCTYPE, ELEMENT, ENTITY, ATTLIST, or NOTATION,"</font>+<a name="line-302"></a> <font color=Cyan>++</font><font color=Magenta>" but got "</font><font color=Cyan>++</font>take <font color=Magenta>7</font> s<font color=Cyan>)</font> p+<a name="line-303"></a> <font color=Green><u>where</u></font> k n <font color=Red>=</font> skip n p s <font color=Cyan>(</font>blank xmlAny w<font color=Cyan>)</font>+<a name="line-304"></a>+<a name="line-305"></a><a name="xmlName"></a><font color=Blue>xmlName</font> p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> cxt k+<a name="line-306"></a> <font color=Red>|</font> isAlphaNum s <font color=Cyan>||</font> s<font color=Cyan>==</font><font color=Magenta>':'</font> <font color=Cyan>||</font> s<font color=Cyan>==</font><font color=Magenta>'_'</font> <font color=Red>=</font> gatherName <font color=Cyan>(</font>s<font color=Red><b>:</b></font>[]<font color=Cyan>)</font> p <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss k+<a name="line-307"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> lexerror <font color=Cyan>(</font><font color=Magenta>"expected a "</font><font color=Cyan>++</font>cxt<font color=Cyan>++</font><font color=Magenta>", but got char "</font><font color=Cyan>++</font>show s<font color=Cyan>)</font> p+<a name="line-308"></a> <font color=Green><u>where</u></font>+<a name="line-309"></a> gatherName acc pos p [] k <font color=Red>=</font>+<a name="line-310"></a> emit <font color=Cyan>(</font>TokName <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font> k p []+<a name="line-311"></a> <font color=Blue>-- lexerror ("unexpected EOF in name at "++show pos) p</font>+<a name="line-312"></a> gatherName acc pos p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> k+<a name="line-313"></a> <font color=Red>|</font> isAlphaNum s <font color=Cyan>||</font> s <font color=Cyan>`elem`</font> <font color=Magenta>".-_:"</font>+<a name="line-314"></a> <font color=Red>=</font> gatherName <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> pos <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss k+<a name="line-315"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> emit <font color=Cyan>(</font>TokName <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font> k p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font>+<a name="line-316"></a><font color=Blue>xmlName</font> p [] cxt k <font color=Red>=</font> lexerror <font color=Cyan>(</font><font color=Magenta>"expected a "</font><font color=Cyan>++</font>cxt<font color=Cyan>++</font><font color=Magenta>", but got end of input"</font><font color=Cyan>)</font> p+<a name="line-317"></a>+<a name="line-318"></a><a name="xmlContent"></a><font color=Blue>xmlContent</font> acc w pos p [] <font color=Red>=</font> <font color=Green><u>if</u></font> all isSpace acc <font color=Green><u>then</u></font> []+<a name="line-319"></a> <font color=Green><u>else</u></font> lexerror <font color=Magenta>"unexpected EOF between tags"</font> p+<a name="line-320"></a><font color=Blue>xmlContent</font> acc w pos p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font>+<a name="line-321"></a> <font color=Red>|</font> elem s <font color=Magenta>"<&"</font> <font color=Red>=</font> <font color=Blue>{- if all isSpace acc then xmlAny w p (s:ss) else -}</font>+<a name="line-322"></a> emit <font color=Cyan>(</font>TokFreeText <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font> xmlAny w p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font>+<a name="line-323"></a> <font color=Red>|</font> isSpace s <font color=Red>=</font> xmlContent <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> w pos <font color=Cyan>(</font>white s p<font color=Cyan>)</font> ss+<a name="line-324"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> xmlContent <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> w pos <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-325"></a>+<a name="line-326"></a>+<a name="line-327"></a>+<a name="line-328"></a><font color=Blue>--ident :: (String->TokenT) -></font>+<a name="line-329"></a><font color=Blue>-- Posn -> String -> [String] -></font>+<a name="line-330"></a><font color=Blue>-- (Posn->String->[String]->[Token]) -> [Token]</font>+<a name="line-331"></a><font color=Blue>--ident tok p s ss k =</font>+<a name="line-332"></a><font color=Blue>-- let (name,s0) = span (\c-> isAlphaNum c || c `elem` "`-_#.'/\\") s</font>+<a name="line-333"></a><font color=Blue>-- in emit (tok name) p: skip (length name) p s ss k</font> </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/OneOfN.html view
@@ -1,667 +1,673 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>OneOfN <font color=Green><u>where</u></font>-<a name="(line2)"></a>-<a name="(line3)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>XmlContent-<a name="(line4)"></a>-<a name="(line5)"></a><a name="OneOf2"></a><font color=Green><u>data</u></font> OneOf2 a b-<a name="(line6)"></a> <font color=Red>=</font> OneOf2 a <font color=Red>|</font> TwoOf2 b-<a name="(line7)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line8)"></a>-<a name="(line9)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>)</font>-<a name="(line10)"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf2 a b<font color=Cyan>)</font>-<a name="(line11)"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf2"</font> [] []-<a name="(line12)"></a> <font color=Blue>-- toHType m = Defined "OneOf2" [a,b] []</font>-<a name="(line13)"></a> <font color=Blue>-- where a = toHType $ (\ (OneOf2 a)->a) $ m</font>-<a name="(line14)"></a> <font color=Blue>-- b = toHType $ (\ (TwoOf2 b)->b) $ m</font>-<a name="(line15)"></a>-<a name="(line16)"></a>-<a name="(line17)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>)</font>-<a name="(line18)"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf2 a b<font color=Cyan>)</font>-<a name="(line19)"></a> <font color=Green><u>where</u></font>-<a name="(line20)"></a> parseContents <font color=Red>=</font>-<a name="(line21)"></a> <font color=Cyan>(</font>choice OneOf2 <font color=Cyan>$</font> choice TwoOf2-<a name="(line22)"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf2"</font><font color=Cyan>)</font>-<a name="(line23)"></a> toContents <font color=Cyan>(</font>OneOf2 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line24)"></a> toContents <font color=Cyan>(</font>TwoOf2 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line25)"></a>-<a name="(line26)"></a><a name="OneOf3"></a><font color=Blue>----</font>-<a name="(line27)"></a><a name="OneOf3"></a><font color=Green><u>data</u></font> OneOf3 a b c-<a name="(line28)"></a> <font color=Red>=</font> OneOf3 a <font color=Red>|</font> TwoOf3 b <font color=Red>|</font> ThreeOf3 c-<a name="(line29)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line30)"></a>-<a name="(line31)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>)</font>-<a name="(line32)"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf3 a b c<font color=Cyan>)</font>-<a name="(line33)"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf3"</font> [] []-<a name="(line34)"></a>-<a name="(line35)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>)</font>-<a name="(line36)"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf3 a b c<font color=Cyan>)</font>-<a name="(line37)"></a> <font color=Green><u>where</u></font>-<a name="(line38)"></a> parseContents <font color=Red>=</font>-<a name="(line39)"></a> <font color=Cyan>(</font>choice OneOf3 <font color=Cyan>$</font> choice TwoOf3 <font color=Cyan>$</font> choice ThreeOf3-<a name="(line40)"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf3"</font><font color=Cyan>)</font>-<a name="(line41)"></a> toContents <font color=Cyan>(</font>OneOf3 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line42)"></a> toContents <font color=Cyan>(</font>TwoOf3 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line43)"></a> toContents <font color=Cyan>(</font>ThreeOf3 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line44)"></a>-<a name="(line45)"></a><a name="OneOf4"></a><font color=Blue>----</font>-<a name="(line46)"></a><a name="OneOf4"></a><font color=Green><u>data</u></font> OneOf4 a b c d-<a name="(line47)"></a> <font color=Red>=</font> OneOf4 a <font color=Red>|</font> TwoOf4 b <font color=Red>|</font> ThreeOf4 c <font color=Red>|</font> FourOf4 d-<a name="(line48)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line49)"></a>-<a name="(line50)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>)</font>-<a name="(line51)"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf4 a b c d<font color=Cyan>)</font>-<a name="(line52)"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf4"</font> [] []-<a name="(line53)"></a>-<a name="(line54)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>)</font>-<a name="(line55)"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf4 a b c d<font color=Cyan>)</font>-<a name="(line56)"></a> <font color=Green><u>where</u></font>-<a name="(line57)"></a> parseContents <font color=Red>=</font>-<a name="(line58)"></a> <font color=Cyan>(</font>choice OneOf4 <font color=Cyan>$</font> choice TwoOf4 <font color=Cyan>$</font> choice ThreeOf4 <font color=Cyan>$</font> choice FourOf4-<a name="(line59)"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf4"</font><font color=Cyan>)</font>-<a name="(line60)"></a> toContents <font color=Cyan>(</font>OneOf4 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line61)"></a> toContents <font color=Cyan>(</font>TwoOf4 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line62)"></a> toContents <font color=Cyan>(</font>ThreeOf4 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line63)"></a> toContents <font color=Cyan>(</font>FourOf4 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line64)"></a>-<a name="(line65)"></a><a name="OneOf5"></a><font color=Blue>----</font>-<a name="(line66)"></a><a name="OneOf5"></a><font color=Green><u>data</u></font> OneOf5 a b c d e-<a name="(line67)"></a> <font color=Red>=</font> OneOf5 a <font color=Red>|</font> TwoOf5 b <font color=Red>|</font> ThreeOf5 c <font color=Red>|</font> FourOf5 d <font color=Red>|</font> FiveOf5 e-<a name="(line68)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line69)"></a>-<a name="(line70)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e<font color=Cyan>)</font>-<a name="(line71)"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf5 a b c d e<font color=Cyan>)</font>-<a name="(line72)"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf5"</font> [] []-<a name="(line73)"></a>-<a name="(line74)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e<font color=Cyan>)</font>-<a name="(line75)"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf5 a b c d e<font color=Cyan>)</font>-<a name="(line76)"></a> <font color=Green><u>where</u></font>-<a name="(line77)"></a> parseContents <font color=Red>=</font>-<a name="(line78)"></a> <font color=Cyan>(</font>choice OneOf5 <font color=Cyan>$</font> choice TwoOf5 <font color=Cyan>$</font> choice ThreeOf5 <font color=Cyan>$</font> choice FourOf5-<a name="(line79)"></a> <font color=Cyan>$</font> choice FiveOf5-<a name="(line80)"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf5"</font><font color=Cyan>)</font>-<a name="(line81)"></a> toContents <font color=Cyan>(</font>OneOf5 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line82)"></a> toContents <font color=Cyan>(</font>TwoOf5 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line83)"></a> toContents <font color=Cyan>(</font>ThreeOf5 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line84)"></a> toContents <font color=Cyan>(</font>FourOf5 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line85)"></a> toContents <font color=Cyan>(</font>FiveOf5 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line86)"></a>-<a name="(line87)"></a><a name="OneOf6"></a><font color=Blue>----</font>-<a name="(line88)"></a><a name="OneOf6"></a><font color=Green><u>data</u></font> OneOf6 a b c d e f-<a name="(line89)"></a> <font color=Red>=</font> OneOf6 a <font color=Red>|</font> TwoOf6 b <font color=Red>|</font> ThreeOf6 c <font color=Red>|</font> FourOf6 d <font color=Red>|</font> FiveOf6 e <font color=Red>|</font> SixOf6 f-<a name="(line90)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line91)"></a>-<a name="(line92)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e-<a name="(line93)"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>)</font>-<a name="(line94)"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf6 a b c d e f<font color=Cyan>)</font>-<a name="(line95)"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf6"</font> [] []-<a name="(line96)"></a>-<a name="(line97)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e-<a name="(line98)"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>)</font>-<a name="(line99)"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf6 a b c d e f<font color=Cyan>)</font>-<a name="(line100)"></a> <font color=Green><u>where</u></font>-<a name="(line101)"></a> parseContents <font color=Red>=</font>-<a name="(line102)"></a> <font color=Cyan>(</font>choice OneOf6 <font color=Cyan>$</font> choice TwoOf6 <font color=Cyan>$</font> choice ThreeOf6 <font color=Cyan>$</font> choice FourOf6-<a name="(line103)"></a> <font color=Cyan>$</font> choice FiveOf6 <font color=Cyan>$</font> choice SixOf6-<a name="(line104)"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf6"</font><font color=Cyan>)</font>-<a name="(line105)"></a> toContents <font color=Cyan>(</font>OneOf6 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line106)"></a> toContents <font color=Cyan>(</font>TwoOf6 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line107)"></a> toContents <font color=Cyan>(</font>ThreeOf6 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line108)"></a> toContents <font color=Cyan>(</font>FourOf6 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line109)"></a> toContents <font color=Cyan>(</font>FiveOf6 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line110)"></a> toContents <font color=Cyan>(</font>SixOf6 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line111)"></a>-<a name="(line112)"></a><a name="OneOf7"></a><font color=Blue>----</font>-<a name="(line113)"></a><a name="OneOf7"></a><font color=Green><u>data</u></font> OneOf7 a b c d e f g-<a name="(line114)"></a> <font color=Red>=</font> OneOf7 a <font color=Red>|</font> TwoOf7 b <font color=Red>|</font> ThreeOf7 c <font color=Red>|</font> FourOf7 d <font color=Red>|</font> FiveOf7 e <font color=Red>|</font> SixOf7 f-<a name="(line115)"></a> <font color=Red>|</font> SevenOf7 g-<a name="(line116)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line117)"></a>-<a name="(line118)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e-<a name="(line119)"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>)</font>-<a name="(line120)"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf7 a b c d e f g<font color=Cyan>)</font>-<a name="(line121)"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf7"</font> [] []-<a name="(line122)"></a>-<a name="(line123)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e-<a name="(line124)"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>)</font>-<a name="(line125)"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf7 a b c d e f g<font color=Cyan>)</font>-<a name="(line126)"></a> <font color=Green><u>where</u></font>-<a name="(line127)"></a> parseContents <font color=Red>=</font>-<a name="(line128)"></a> <font color=Cyan>(</font>choice OneOf7 <font color=Cyan>$</font> choice TwoOf7 <font color=Cyan>$</font> choice ThreeOf7 <font color=Cyan>$</font> choice FourOf7-<a name="(line129)"></a> <font color=Cyan>$</font> choice FiveOf7 <font color=Cyan>$</font> choice SixOf7 <font color=Cyan>$</font> choice SevenOf7-<a name="(line130)"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf7"</font><font color=Cyan>)</font>-<a name="(line131)"></a> toContents <font color=Cyan>(</font>OneOf7 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line132)"></a> toContents <font color=Cyan>(</font>TwoOf7 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line133)"></a> toContents <font color=Cyan>(</font>ThreeOf7 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line134)"></a> toContents <font color=Cyan>(</font>FourOf7 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line135)"></a> toContents <font color=Cyan>(</font>FiveOf7 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line136)"></a> toContents <font color=Cyan>(</font>SixOf7 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line137)"></a> toContents <font color=Cyan>(</font>SevenOf7 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line138)"></a>-<a name="(line139)"></a><a name="OneOf8"></a><font color=Blue>----</font>-<a name="(line140)"></a><a name="OneOf8"></a><font color=Green><u>data</u></font> OneOf8 a b c d e f g h-<a name="(line141)"></a> <font color=Red>=</font> OneOf8 a <font color=Red>|</font> TwoOf8 b <font color=Red>|</font> ThreeOf8 c <font color=Red>|</font> FourOf8 d <font color=Red>|</font> FiveOf8 e <font color=Red>|</font> SixOf8 f-<a name="(line142)"></a> <font color=Red>|</font> SevenOf8 g <font color=Red>|</font> EightOf8 h-<a name="(line143)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line144)"></a>-<a name="(line145)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e-<a name="(line146)"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>)</font>-<a name="(line147)"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf8 a b c d e f g h<font color=Cyan>)</font>-<a name="(line148)"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf8"</font> [] []-<a name="(line149)"></a>-<a name="(line150)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e-<a name="(line151)"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>)</font>-<a name="(line152)"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf8 a b c d e f g h<font color=Cyan>)</font>-<a name="(line153)"></a> <font color=Green><u>where</u></font>-<a name="(line154)"></a> parseContents <font color=Red>=</font>-<a name="(line155)"></a> <font color=Cyan>(</font>choice OneOf8 <font color=Cyan>$</font> choice TwoOf8 <font color=Cyan>$</font> choice ThreeOf8 <font color=Cyan>$</font> choice FourOf8-<a name="(line156)"></a> <font color=Cyan>$</font> choice FiveOf8 <font color=Cyan>$</font> choice SixOf8 <font color=Cyan>$</font> choice SevenOf8 <font color=Cyan>$</font> choice EightOf8-<a name="(line157)"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf8"</font><font color=Cyan>)</font>-<a name="(line158)"></a> toContents <font color=Cyan>(</font>OneOf8 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line159)"></a> toContents <font color=Cyan>(</font>TwoOf8 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line160)"></a> toContents <font color=Cyan>(</font>ThreeOf8 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line161)"></a> toContents <font color=Cyan>(</font>FourOf8 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line162)"></a> toContents <font color=Cyan>(</font>FiveOf8 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line163)"></a> toContents <font color=Cyan>(</font>SixOf8 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line164)"></a> toContents <font color=Cyan>(</font>SevenOf8 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line165)"></a> toContents <font color=Cyan>(</font>EightOf8 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line166)"></a>-<a name="(line167)"></a><a name="OneOf9"></a><font color=Blue>----</font>-<a name="(line168)"></a><a name="OneOf9"></a><font color=Green><u>data</u></font> OneOf9 a b c d e f g h i-<a name="(line169)"></a> <font color=Red>=</font> OneOf9 a <font color=Red>|</font> TwoOf9 b <font color=Red>|</font> ThreeOf9 c <font color=Red>|</font> FourOf9 d <font color=Red>|</font> FiveOf9 e <font color=Red>|</font> SixOf9 f-<a name="(line170)"></a> <font color=Red>|</font> SevenOf9 g <font color=Red>|</font> EightOf9 h <font color=Red>|</font> NineOf9 i-<a name="(line171)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line172)"></a>-<a name="(line173)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e-<a name="(line174)"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>)</font>-<a name="(line175)"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf9 a b c d e f g h i<font color=Cyan>)</font>-<a name="(line176)"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf9"</font> [] []-<a name="(line177)"></a>-<a name="(line178)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e-<a name="(line179)"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>)</font>-<a name="(line180)"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf9 a b c d e f g h i<font color=Cyan>)</font>-<a name="(line181)"></a> <font color=Green><u>where</u></font>-<a name="(line182)"></a> parseContents <font color=Red>=</font>-<a name="(line183)"></a> <font color=Cyan>(</font>choice OneOf9 <font color=Cyan>$</font> choice TwoOf9 <font color=Cyan>$</font> choice ThreeOf9 <font color=Cyan>$</font> choice FourOf9-<a name="(line184)"></a> <font color=Cyan>$</font> choice FiveOf9 <font color=Cyan>$</font> choice SixOf9 <font color=Cyan>$</font> choice SevenOf9 <font color=Cyan>$</font> choice EightOf9-<a name="(line185)"></a> <font color=Cyan>$</font> choice NineOf9-<a name="(line186)"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf9"</font><font color=Cyan>)</font>-<a name="(line187)"></a> toContents <font color=Cyan>(</font>OneOf9 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line188)"></a> toContents <font color=Cyan>(</font>TwoOf9 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line189)"></a> toContents <font color=Cyan>(</font>ThreeOf9 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line190)"></a> toContents <font color=Cyan>(</font>FourOf9 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line191)"></a> toContents <font color=Cyan>(</font>FiveOf9 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line192)"></a> toContents <font color=Cyan>(</font>SixOf9 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line193)"></a> toContents <font color=Cyan>(</font>SevenOf9 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line194)"></a> toContents <font color=Cyan>(</font>EightOf9 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line195)"></a> toContents <font color=Cyan>(</font>NineOf9 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line196)"></a>-<a name="(line197)"></a><a name="OneOf10"></a><font color=Blue>----</font>-<a name="(line198)"></a><a name="OneOf10"></a><font color=Green><u>data</u></font> OneOf10 a b c d e f g h i j-<a name="(line199)"></a> <font color=Red>=</font> OneOf10 a <font color=Red>|</font> TwoOf10 b <font color=Red>|</font> ThreeOf10 c <font color=Red>|</font> FourOf10 d <font color=Red>|</font> FiveOf10 e-<a name="(line200)"></a> <font color=Red>|</font> SixOf10 f <font color=Red>|</font> SevenOf10 g <font color=Red>|</font> EightOf10 h <font color=Red>|</font> NineOf10 i <font color=Red>|</font> TenOf10 j-<a name="(line201)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line202)"></a>-<a name="(line203)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e-<a name="(line204)"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j<font color=Cyan>)</font>-<a name="(line205)"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf10 a b c d e f g h i j<font color=Cyan>)</font>-<a name="(line206)"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf10"</font> [] []-<a name="(line207)"></a>-<a name="(line208)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e-<a name="(line209)"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j<font color=Cyan>)</font>-<a name="(line210)"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf10 a b c d e f g h i j<font color=Cyan>)</font>-<a name="(line211)"></a> <font color=Green><u>where</u></font>-<a name="(line212)"></a> parseContents <font color=Red>=</font>-<a name="(line213)"></a> <font color=Cyan>(</font>choice OneOf10 <font color=Cyan>$</font> choice TwoOf10 <font color=Cyan>$</font> choice ThreeOf10 <font color=Cyan>$</font> choice FourOf10-<a name="(line214)"></a> <font color=Cyan>$</font> choice FiveOf10 <font color=Cyan>$</font> choice SixOf10 <font color=Cyan>$</font> choice SevenOf10-<a name="(line215)"></a> <font color=Cyan>$</font> choice EightOf10 <font color=Cyan>$</font> choice NineOf10 <font color=Cyan>$</font> choice TenOf10-<a name="(line216)"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf10"</font><font color=Cyan>)</font>-<a name="(line217)"></a> toContents <font color=Cyan>(</font>OneOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line218)"></a> toContents <font color=Cyan>(</font>TwoOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line219)"></a> toContents <font color=Cyan>(</font>ThreeOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line220)"></a> toContents <font color=Cyan>(</font>FourOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line221)"></a> toContents <font color=Cyan>(</font>FiveOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line222)"></a> toContents <font color=Cyan>(</font>SixOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line223)"></a> toContents <font color=Cyan>(</font>SevenOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line224)"></a> toContents <font color=Cyan>(</font>EightOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line225)"></a> toContents <font color=Cyan>(</font>NineOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line226)"></a> toContents <font color=Cyan>(</font>TenOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line227)"></a>-<a name="(line228)"></a><a name="OneOf11"></a><font color=Blue>----</font>-<a name="(line229)"></a><a name="OneOf11"></a><font color=Green><u>data</u></font> OneOf11 a b c d e f g h i j k-<a name="(line230)"></a> <font color=Red>=</font> OneOf11 a <font color=Red>|</font> TwoOf11 b <font color=Red>|</font> ThreeOf11 c <font color=Red>|</font> FourOf11 d <font color=Red>|</font> FiveOf11 e-<a name="(line231)"></a> <font color=Red>|</font> SixOf11 f <font color=Red>|</font> SevenOf11 g <font color=Red>|</font> EightOf11 h <font color=Red>|</font> NineOf11 i <font color=Red>|</font> TenOf11 j-<a name="(line232)"></a> <font color=Red>|</font> ElevenOf11 k-<a name="(line233)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line234)"></a>-<a name="(line235)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e-<a name="(line236)"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j-<a name="(line237)"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>)</font>-<a name="(line238)"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf11 a b c d e f g h i j k<font color=Cyan>)</font>-<a name="(line239)"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf11"</font> [] []-<a name="(line240)"></a>-<a name="(line241)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e-<a name="(line242)"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j-<a name="(line243)"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>)</font>-<a name="(line244)"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf11 a b c d e f g h i j k<font color=Cyan>)</font>-<a name="(line245)"></a> <font color=Green><u>where</u></font>-<a name="(line246)"></a> parseContents <font color=Red>=</font>-<a name="(line247)"></a> <font color=Cyan>(</font>choice OneOf11 <font color=Cyan>$</font> choice TwoOf11 <font color=Cyan>$</font> choice ThreeOf11 <font color=Cyan>$</font> choice FourOf11-<a name="(line248)"></a> <font color=Cyan>$</font> choice FiveOf11 <font color=Cyan>$</font> choice SixOf11 <font color=Cyan>$</font> choice SevenOf11-<a name="(line249)"></a> <font color=Cyan>$</font> choice EightOf11 <font color=Cyan>$</font> choice NineOf11 <font color=Cyan>$</font> choice TenOf11-<a name="(line250)"></a> <font color=Cyan>$</font> choice ElevenOf11-<a name="(line251)"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf11"</font><font color=Cyan>)</font>-<a name="(line252)"></a> toContents <font color=Cyan>(</font>OneOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line253)"></a> toContents <font color=Cyan>(</font>TwoOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line254)"></a> toContents <font color=Cyan>(</font>ThreeOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line255)"></a> toContents <font color=Cyan>(</font>FourOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line256)"></a> toContents <font color=Cyan>(</font>FiveOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line257)"></a> toContents <font color=Cyan>(</font>SixOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line258)"></a> toContents <font color=Cyan>(</font>SevenOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line259)"></a> toContents <font color=Cyan>(</font>EightOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line260)"></a> toContents <font color=Cyan>(</font>NineOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line261)"></a> toContents <font color=Cyan>(</font>TenOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line262)"></a> toContents <font color=Cyan>(</font>ElevenOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line263)"></a>-<a name="(line264)"></a><a name="OneOf12"></a><font color=Blue>----</font>-<a name="(line265)"></a><a name="OneOf12"></a><font color=Green><u>data</u></font> OneOf12 a b c d e f g h i j k l-<a name="(line266)"></a> <font color=Red>=</font> OneOf12 a <font color=Red>|</font> TwoOf12 b <font color=Red>|</font> ThreeOf12 c <font color=Red>|</font> FourOf12 d <font color=Red>|</font> FiveOf12 e-<a name="(line267)"></a> <font color=Red>|</font> SixOf12 f <font color=Red>|</font> SevenOf12 g <font color=Red>|</font> EightOf12 h <font color=Red>|</font> NineOf12 i <font color=Red>|</font> TenOf12 j-<a name="(line268)"></a> <font color=Red>|</font> ElevenOf12 k <font color=Red>|</font> TwelveOf12 l-<a name="(line269)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line270)"></a>-<a name="(line271)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e-<a name="(line272)"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j-<a name="(line273)"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>,</font>HTypeable l<font color=Cyan>)</font>-<a name="(line274)"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf12 a b c d e f g h i j k l<font color=Cyan>)</font>-<a name="(line275)"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf12"</font> [] []-<a name="(line276)"></a>-<a name="(line277)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e-<a name="(line278)"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j-<a name="(line279)"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>,</font>XmlContent l<font color=Cyan>)</font>-<a name="(line280)"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf12 a b c d e f g h i j k l<font color=Cyan>)</font>-<a name="(line281)"></a> <font color=Green><u>where</u></font>-<a name="(line282)"></a> parseContents <font color=Red>=</font>-<a name="(line283)"></a> <font color=Cyan>(</font>choice OneOf12 <font color=Cyan>$</font> choice TwoOf12 <font color=Cyan>$</font> choice ThreeOf12 <font color=Cyan>$</font> choice FourOf12-<a name="(line284)"></a> <font color=Cyan>$</font> choice FiveOf12 <font color=Cyan>$</font> choice SixOf12 <font color=Cyan>$</font> choice SevenOf12-<a name="(line285)"></a> <font color=Cyan>$</font> choice EightOf12 <font color=Cyan>$</font> choice NineOf12 <font color=Cyan>$</font> choice TenOf12-<a name="(line286)"></a> <font color=Cyan>$</font> choice ElevenOf12 <font color=Cyan>$</font> choice TwelveOf12-<a name="(line287)"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf12"</font><font color=Cyan>)</font>-<a name="(line288)"></a> toContents <font color=Cyan>(</font>OneOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line289)"></a> toContents <font color=Cyan>(</font>TwoOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line290)"></a> toContents <font color=Cyan>(</font>ThreeOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line291)"></a> toContents <font color=Cyan>(</font>FourOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line292)"></a> toContents <font color=Cyan>(</font>FiveOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line293)"></a> toContents <font color=Cyan>(</font>SixOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line294)"></a> toContents <font color=Cyan>(</font>SevenOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line295)"></a> toContents <font color=Cyan>(</font>EightOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line296)"></a> toContents <font color=Cyan>(</font>NineOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line297)"></a> toContents <font color=Cyan>(</font>TenOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line298)"></a> toContents <font color=Cyan>(</font>ElevenOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line299)"></a> toContents <font color=Cyan>(</font>TwelveOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line300)"></a>-<a name="(line301)"></a><a name="OneOf13"></a><font color=Blue>----</font>-<a name="(line302)"></a><a name="OneOf13"></a><font color=Green><u>data</u></font> OneOf13 a b c d e f g h i j k l m-<a name="(line303)"></a> <font color=Red>=</font> OneOf13 a <font color=Red>|</font> TwoOf13 b <font color=Red>|</font> ThreeOf13 c <font color=Red>|</font> FourOf13 d <font color=Red>|</font> FiveOf13 e-<a name="(line304)"></a> <font color=Red>|</font> SixOf13 f <font color=Red>|</font> SevenOf13 g <font color=Red>|</font> EightOf13 h <font color=Red>|</font> NineOf13 i <font color=Red>|</font> TenOf13 j-<a name="(line305)"></a> <font color=Red>|</font> ElevenOf13 k <font color=Red>|</font> TwelveOf13 l <font color=Red>|</font> ThirteenOf13 m-<a name="(line306)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line307)"></a>-<a name="(line308)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e-<a name="(line309)"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j-<a name="(line310)"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>,</font>HTypeable l<font color=Cyan>,</font>HTypeable m<font color=Cyan>)</font>-<a name="(line311)"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf13 a b c d e f g h i j k l m<font color=Cyan>)</font>-<a name="(line312)"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf13"</font> [] []-<a name="(line313)"></a>-<a name="(line314)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e-<a name="(line315)"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j-<a name="(line316)"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>,</font>XmlContent l<font color=Cyan>,</font>XmlContent m<font color=Cyan>)</font>-<a name="(line317)"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf13 a b c d e f g h i j k l m<font color=Cyan>)</font>-<a name="(line318)"></a> <font color=Green><u>where</u></font>-<a name="(line319)"></a> parseContents <font color=Red>=</font>-<a name="(line320)"></a> <font color=Cyan>(</font>choice OneOf13 <font color=Cyan>$</font> choice TwoOf13 <font color=Cyan>$</font> choice ThreeOf13 <font color=Cyan>$</font> choice FourOf13-<a name="(line321)"></a> <font color=Cyan>$</font> choice FiveOf13 <font color=Cyan>$</font> choice SixOf13 <font color=Cyan>$</font> choice SevenOf13-<a name="(line322)"></a> <font color=Cyan>$</font> choice EightOf13 <font color=Cyan>$</font> choice NineOf13 <font color=Cyan>$</font> choice TenOf13-<a name="(line323)"></a> <font color=Cyan>$</font> choice ElevenOf13 <font color=Cyan>$</font> choice TwelveOf13 <font color=Cyan>$</font> choice ThirteenOf13-<a name="(line324)"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf13"</font><font color=Cyan>)</font>-<a name="(line325)"></a> toContents <font color=Cyan>(</font>OneOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line326)"></a> toContents <font color=Cyan>(</font>TwoOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line327)"></a> toContents <font color=Cyan>(</font>ThreeOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line328)"></a> toContents <font color=Cyan>(</font>FourOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line329)"></a> toContents <font color=Cyan>(</font>FiveOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line330)"></a> toContents <font color=Cyan>(</font>SixOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line331)"></a> toContents <font color=Cyan>(</font>SevenOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line332)"></a> toContents <font color=Cyan>(</font>EightOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line333)"></a> toContents <font color=Cyan>(</font>NineOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line334)"></a> toContents <font color=Cyan>(</font>TenOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line335)"></a> toContents <font color=Cyan>(</font>ElevenOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line336)"></a> toContents <font color=Cyan>(</font>TwelveOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line337)"></a> toContents <font color=Cyan>(</font>ThirteenOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line338)"></a>-<a name="(line339)"></a><a name="OneOf14"></a><font color=Blue>----</font>-<a name="(line340)"></a><a name="OneOf14"></a><font color=Green><u>data</u></font> OneOf14 a b c d e f g h i j k l m n-<a name="(line341)"></a> <font color=Red>=</font> OneOf14 a <font color=Red>|</font> TwoOf14 b <font color=Red>|</font> ThreeOf14 c <font color=Red>|</font> FourOf14 d <font color=Red>|</font> FiveOf14 e-<a name="(line342)"></a> <font color=Red>|</font> SixOf14 f <font color=Red>|</font> SevenOf14 g <font color=Red>|</font> EightOf14 h <font color=Red>|</font> NineOf14 i <font color=Red>|</font> TenOf14 j-<a name="(line343)"></a> <font color=Red>|</font> ElevenOf14 k <font color=Red>|</font> TwelveOf14 l <font color=Red>|</font> ThirteenOf14 m <font color=Red>|</font> FourteenOf14 n-<a name="(line344)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line345)"></a>-<a name="(line346)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e-<a name="(line347)"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j-<a name="(line348)"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>,</font>HTypeable l<font color=Cyan>,</font>HTypeable m<font color=Cyan>,</font>HTypeable n<font color=Cyan>)</font>-<a name="(line349)"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf14 a b c d e f g h i j k l m n<font color=Cyan>)</font>-<a name="(line350)"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf14"</font> [] []-<a name="(line351)"></a>-<a name="(line352)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e-<a name="(line353)"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j-<a name="(line354)"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>,</font>XmlContent l<font color=Cyan>,</font>XmlContent m<font color=Cyan>,</font>XmlContent n<font color=Cyan>)</font>-<a name="(line355)"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf14 a b c d e f g h i j k l m n<font color=Cyan>)</font>-<a name="(line356)"></a> <font color=Green><u>where</u></font>-<a name="(line357)"></a> parseContents <font color=Red>=</font>-<a name="(line358)"></a> <font color=Cyan>(</font>choice OneOf14 <font color=Cyan>$</font> choice TwoOf14 <font color=Cyan>$</font> choice ThreeOf14 <font color=Cyan>$</font> choice FourOf14-<a name="(line359)"></a> <font color=Cyan>$</font> choice FiveOf14 <font color=Cyan>$</font> choice SixOf14 <font color=Cyan>$</font> choice SevenOf14-<a name="(line360)"></a> <font color=Cyan>$</font> choice EightOf14 <font color=Cyan>$</font> choice NineOf14 <font color=Cyan>$</font> choice TenOf14-<a name="(line361)"></a> <font color=Cyan>$</font> choice ElevenOf14 <font color=Cyan>$</font> choice TwelveOf14 <font color=Cyan>$</font> choice ThirteenOf14-<a name="(line362)"></a> <font color=Cyan>$</font> choice FourteenOf14-<a name="(line363)"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf14"</font><font color=Cyan>)</font>-<a name="(line364)"></a> toContents <font color=Cyan>(</font>OneOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line365)"></a> toContents <font color=Cyan>(</font>TwoOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line366)"></a> toContents <font color=Cyan>(</font>ThreeOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line367)"></a> toContents <font color=Cyan>(</font>FourOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line368)"></a> toContents <font color=Cyan>(</font>FiveOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line369)"></a> toContents <font color=Cyan>(</font>SixOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line370)"></a> toContents <font color=Cyan>(</font>SevenOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line371)"></a> toContents <font color=Cyan>(</font>EightOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line372)"></a> toContents <font color=Cyan>(</font>NineOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line373)"></a> toContents <font color=Cyan>(</font>TenOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line374)"></a> toContents <font color=Cyan>(</font>ElevenOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line375)"></a> toContents <font color=Cyan>(</font>TwelveOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line376)"></a> toContents <font color=Cyan>(</font>ThirteenOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line377)"></a> toContents <font color=Cyan>(</font>FourteenOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line378)"></a>-<a name="(line379)"></a><a name="OneOf15"></a><font color=Blue>----</font>-<a name="(line380)"></a><a name="OneOf15"></a><font color=Green><u>data</u></font> OneOf15 a b c d e f g h i j k l m n o-<a name="(line381)"></a> <font color=Red>=</font> OneOf15 a <font color=Red>|</font> TwoOf15 b <font color=Red>|</font> ThreeOf15 c <font color=Red>|</font> FourOf15 d <font color=Red>|</font> FiveOf15 e-<a name="(line382)"></a> <font color=Red>|</font> SixOf15 f <font color=Red>|</font> SevenOf15 g <font color=Red>|</font> EightOf15 h <font color=Red>|</font> NineOf15 i <font color=Red>|</font> TenOf15 j-<a name="(line383)"></a> <font color=Red>|</font> ElevenOf15 k <font color=Red>|</font> TwelveOf15 l <font color=Red>|</font> ThirteenOf15 m <font color=Red>|</font> FourteenOf15 n-<a name="(line384)"></a> <font color=Red>|</font> FifteenOf15 o-<a name="(line385)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line386)"></a>-<a name="(line387)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e-<a name="(line388)"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j-<a name="(line389)"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>,</font>HTypeable l<font color=Cyan>,</font>HTypeable m<font color=Cyan>,</font>HTypeable n<font color=Cyan>,</font>HTypeable o<font color=Cyan>)</font>-<a name="(line390)"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf15 a b c d e f g h i j k l m n o<font color=Cyan>)</font>-<a name="(line391)"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf15"</font> [] []-<a name="(line392)"></a>-<a name="(line393)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e-<a name="(line394)"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j-<a name="(line395)"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>,</font>XmlContent l<font color=Cyan>,</font>XmlContent m<font color=Cyan>,</font>XmlContent n<font color=Cyan>,</font>XmlContent o<font color=Cyan>)</font>-<a name="(line396)"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf15 a b c d e f g h i j k l m n o<font color=Cyan>)</font>-<a name="(line397)"></a> <font color=Green><u>where</u></font>-<a name="(line398)"></a> parseContents <font color=Red>=</font>-<a name="(line399)"></a> <font color=Cyan>(</font>choice OneOf15 <font color=Cyan>$</font> choice TwoOf15 <font color=Cyan>$</font> choice ThreeOf15 <font color=Cyan>$</font> choice FourOf15-<a name="(line400)"></a> <font color=Cyan>$</font> choice FiveOf15 <font color=Cyan>$</font> choice SixOf15 <font color=Cyan>$</font> choice SevenOf15-<a name="(line401)"></a> <font color=Cyan>$</font> choice EightOf15 <font color=Cyan>$</font> choice NineOf15 <font color=Cyan>$</font> choice TenOf15-<a name="(line402)"></a> <font color=Cyan>$</font> choice ElevenOf15 <font color=Cyan>$</font> choice TwelveOf15 <font color=Cyan>$</font> choice ThirteenOf15-<a name="(line403)"></a> <font color=Cyan>$</font> choice FourteenOf15 <font color=Cyan>$</font> choice FifteenOf15-<a name="(line404)"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf15"</font><font color=Cyan>)</font>-<a name="(line405)"></a> toContents <font color=Cyan>(</font>OneOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line406)"></a> toContents <font color=Cyan>(</font>TwoOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line407)"></a> toContents <font color=Cyan>(</font>ThreeOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line408)"></a> toContents <font color=Cyan>(</font>FourOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line409)"></a> toContents <font color=Cyan>(</font>FiveOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line410)"></a> toContents <font color=Cyan>(</font>SixOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line411)"></a> toContents <font color=Cyan>(</font>SevenOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line412)"></a> toContents <font color=Cyan>(</font>EightOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line413)"></a> toContents <font color=Cyan>(</font>NineOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line414)"></a> toContents <font color=Cyan>(</font>TenOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line415)"></a> toContents <font color=Cyan>(</font>ElevenOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line416)"></a> toContents <font color=Cyan>(</font>TwelveOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line417)"></a> toContents <font color=Cyan>(</font>ThirteenOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line418)"></a> toContents <font color=Cyan>(</font>FourteenOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line419)"></a> toContents <font color=Cyan>(</font>FifteenOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line420)"></a>-<a name="(line421)"></a><a name="OneOf16"></a><font color=Blue>----</font>-<a name="(line422)"></a><a name="OneOf16"></a><font color=Green><u>data</u></font> OneOf16 a b c d e f g h i j k l m n o p-<a name="(line423)"></a> <font color=Red>=</font> OneOf16 a <font color=Red>|</font> TwoOf16 b <font color=Red>|</font> ThreeOf16 c <font color=Red>|</font> FourOf16 d <font color=Red>|</font> FiveOf16 e-<a name="(line424)"></a> <font color=Red>|</font> SixOf16 f <font color=Red>|</font> SevenOf16 g <font color=Red>|</font> EightOf16 h <font color=Red>|</font> NineOf16 i <font color=Red>|</font> TenOf16 j-<a name="(line425)"></a> <font color=Red>|</font> ElevenOf16 k <font color=Red>|</font> TwelveOf16 l <font color=Red>|</font> ThirteenOf16 m <font color=Red>|</font> FourteenOf16 n-<a name="(line426)"></a> <font color=Red>|</font> FifteenOf16 o <font color=Red>|</font> SixteenOf16 p-<a name="(line427)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line428)"></a>-<a name="(line429)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e-<a name="(line430)"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j-<a name="(line431)"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>,</font>HTypeable l<font color=Cyan>,</font>HTypeable m<font color=Cyan>,</font>HTypeable n<font color=Cyan>,</font>HTypeable o-<a name="(line432)"></a> <font color=Cyan>,</font>HTypeable p<font color=Cyan>)</font>-<a name="(line433)"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf16 a b c d e f g h i j k l m n o p<font color=Cyan>)</font>-<a name="(line434)"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf16"</font> [] []-<a name="(line435)"></a>-<a name="(line436)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e-<a name="(line437)"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j-<a name="(line438)"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>,</font>XmlContent l<font color=Cyan>,</font>XmlContent m<font color=Cyan>,</font>XmlContent n<font color=Cyan>,</font>XmlContent o-<a name="(line439)"></a> <font color=Cyan>,</font>XmlContent p<font color=Cyan>)</font>-<a name="(line440)"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf16 a b c d e f g h i j k l m n o p<font color=Cyan>)</font>-<a name="(line441)"></a> <font color=Green><u>where</u></font>-<a name="(line442)"></a> parseContents <font color=Red>=</font>-<a name="(line443)"></a> <font color=Cyan>(</font>choice OneOf16 <font color=Cyan>$</font> choice TwoOf16 <font color=Cyan>$</font> choice ThreeOf16 <font color=Cyan>$</font> choice FourOf16-<a name="(line444)"></a> <font color=Cyan>$</font> choice FiveOf16 <font color=Cyan>$</font> choice SixOf16 <font color=Cyan>$</font> choice SevenOf16-<a name="(line445)"></a> <font color=Cyan>$</font> choice EightOf16 <font color=Cyan>$</font> choice NineOf16 <font color=Cyan>$</font> choice TenOf16-<a name="(line446)"></a> <font color=Cyan>$</font> choice ElevenOf16 <font color=Cyan>$</font> choice TwelveOf16 <font color=Cyan>$</font> choice ThirteenOf16-<a name="(line447)"></a> <font color=Cyan>$</font> choice FourteenOf16 <font color=Cyan>$</font> choice FifteenOf16 <font color=Cyan>$</font> choice SixteenOf16-<a name="(line448)"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf16"</font><font color=Cyan>)</font>-<a name="(line449)"></a> toContents <font color=Cyan>(</font>OneOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line450)"></a> toContents <font color=Cyan>(</font>TwoOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line451)"></a> toContents <font color=Cyan>(</font>ThreeOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line452)"></a> toContents <font color=Cyan>(</font>FourOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line453)"></a> toContents <font color=Cyan>(</font>FiveOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line454)"></a> toContents <font color=Cyan>(</font>SixOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line455)"></a> toContents <font color=Cyan>(</font>SevenOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line456)"></a> toContents <font color=Cyan>(</font>EightOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line457)"></a> toContents <font color=Cyan>(</font>NineOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line458)"></a> toContents <font color=Cyan>(</font>TenOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line459)"></a> toContents <font color=Cyan>(</font>ElevenOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line460)"></a> toContents <font color=Cyan>(</font>TwelveOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line461)"></a> toContents <font color=Cyan>(</font>ThirteenOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line462)"></a> toContents <font color=Cyan>(</font>FourteenOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line463)"></a> toContents <font color=Cyan>(</font>FifteenOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line464)"></a> toContents <font color=Cyan>(</font>SixteenOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line465)"></a>-<a name="(line466)"></a><a name="OneOf17"></a><font color=Blue>----</font>-<a name="(line467)"></a><a name="OneOf17"></a><font color=Green><u>data</u></font> OneOf17 a b c d e f g h i j k l m n o p q-<a name="(line468)"></a> <font color=Red>=</font> OneOf17 a <font color=Red>|</font> TwoOf17 b <font color=Red>|</font> ThreeOf17 c <font color=Red>|</font> FourOf17 d <font color=Red>|</font> FiveOf17 e-<a name="(line469)"></a> <font color=Red>|</font> SixOf17 f <font color=Red>|</font> SevenOf17 g <font color=Red>|</font> EightOf17 h <font color=Red>|</font> NineOf17 i <font color=Red>|</font> TenOf17 j-<a name="(line470)"></a> <font color=Red>|</font> ElevenOf17 k <font color=Red>|</font> TwelveOf17 l <font color=Red>|</font> ThirteenOf17 m <font color=Red>|</font> FourteenOf17 n-<a name="(line471)"></a> <font color=Red>|</font> FifteenOf17 o <font color=Red>|</font> SixteenOf17 p <font color=Red>|</font> SeventeenOf17 q-<a name="(line472)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line473)"></a>-<a name="(line474)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e-<a name="(line475)"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j-<a name="(line476)"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>,</font>HTypeable l<font color=Cyan>,</font>HTypeable m<font color=Cyan>,</font>HTypeable n<font color=Cyan>,</font>HTypeable o-<a name="(line477)"></a> <font color=Cyan>,</font>HTypeable p<font color=Cyan>,</font>HTypeable q<font color=Cyan>)</font>-<a name="(line478)"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf17 a b c d e f g h i j k l m n o p q<font color=Cyan>)</font>-<a name="(line479)"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf17"</font> [] []-<a name="(line480)"></a>-<a name="(line481)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e-<a name="(line482)"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j-<a name="(line483)"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>,</font>XmlContent l<font color=Cyan>,</font>XmlContent m<font color=Cyan>,</font>XmlContent n<font color=Cyan>,</font>XmlContent o-<a name="(line484)"></a> <font color=Cyan>,</font>XmlContent p<font color=Cyan>,</font>XmlContent q<font color=Cyan>)</font>-<a name="(line485)"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf17 a b c d e f g h i j k l m n o p q<font color=Cyan>)</font>-<a name="(line486)"></a> <font color=Green><u>where</u></font>-<a name="(line487)"></a> parseContents <font color=Red>=</font>-<a name="(line488)"></a> <font color=Cyan>(</font>choice OneOf17 <font color=Cyan>$</font> choice TwoOf17 <font color=Cyan>$</font> choice ThreeOf17 <font color=Cyan>$</font> choice FourOf17-<a name="(line489)"></a> <font color=Cyan>$</font> choice FiveOf17 <font color=Cyan>$</font> choice SixOf17 <font color=Cyan>$</font> choice SevenOf17-<a name="(line490)"></a> <font color=Cyan>$</font> choice EightOf17 <font color=Cyan>$</font> choice NineOf17 <font color=Cyan>$</font> choice TenOf17-<a name="(line491)"></a> <font color=Cyan>$</font> choice ElevenOf17 <font color=Cyan>$</font> choice TwelveOf17 <font color=Cyan>$</font> choice ThirteenOf17-<a name="(line492)"></a> <font color=Cyan>$</font> choice FourteenOf17 <font color=Cyan>$</font> choice FifteenOf17 <font color=Cyan>$</font> choice SixteenOf17-<a name="(line493)"></a> <font color=Cyan>$</font> choice SeventeenOf17-<a name="(line494)"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf17"</font><font color=Cyan>)</font>-<a name="(line495)"></a> toContents <font color=Cyan>(</font>OneOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line496)"></a> toContents <font color=Cyan>(</font>TwoOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line497)"></a> toContents <font color=Cyan>(</font>ThreeOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line498)"></a> toContents <font color=Cyan>(</font>FourOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line499)"></a> toContents <font color=Cyan>(</font>FiveOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line500)"></a> toContents <font color=Cyan>(</font>SixOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line501)"></a> toContents <font color=Cyan>(</font>SevenOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line502)"></a> toContents <font color=Cyan>(</font>EightOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line503)"></a> toContents <font color=Cyan>(</font>NineOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line504)"></a> toContents <font color=Cyan>(</font>TenOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line505)"></a> toContents <font color=Cyan>(</font>ElevenOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line506)"></a> toContents <font color=Cyan>(</font>TwelveOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line507)"></a> toContents <font color=Cyan>(</font>ThirteenOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line508)"></a> toContents <font color=Cyan>(</font>FourteenOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line509)"></a> toContents <font color=Cyan>(</font>FifteenOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line510)"></a> toContents <font color=Cyan>(</font>SixteenOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line511)"></a> toContents <font color=Cyan>(</font>SeventeenOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line512)"></a>-<a name="(line513)"></a><a name="OneOf18"></a><font color=Blue>----</font>-<a name="(line514)"></a><a name="OneOf18"></a><font color=Green><u>data</u></font> OneOf18 a b c d e f g h i j k l m n o p q r-<a name="(line515)"></a> <font color=Red>=</font> OneOf18 a <font color=Red>|</font> TwoOf18 b <font color=Red>|</font> ThreeOf18 c <font color=Red>|</font> FourOf18 d <font color=Red>|</font> FiveOf18 e-<a name="(line516)"></a> <font color=Red>|</font> SixOf18 f <font color=Red>|</font> SevenOf18 g <font color=Red>|</font> EightOf18 h <font color=Red>|</font> NineOf18 i <font color=Red>|</font> TenOf18 j-<a name="(line517)"></a> <font color=Red>|</font> ElevenOf18 k <font color=Red>|</font> TwelveOf18 l <font color=Red>|</font> ThirteenOf18 m <font color=Red>|</font> FourteenOf18 n-<a name="(line518)"></a> <font color=Red>|</font> FifteenOf18 o <font color=Red>|</font> SixteenOf18 p <font color=Red>|</font> SeventeenOf18 q <font color=Red>|</font> EighteenOf18 r-<a name="(line519)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line520)"></a>-<a name="(line521)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e-<a name="(line522)"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j-<a name="(line523)"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>,</font>HTypeable l<font color=Cyan>,</font>HTypeable m<font color=Cyan>,</font>HTypeable n<font color=Cyan>,</font>HTypeable o-<a name="(line524)"></a> <font color=Cyan>,</font>HTypeable p<font color=Cyan>,</font>HTypeable q<font color=Cyan>,</font>HTypeable r<font color=Cyan>)</font>-<a name="(line525)"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf18 a b c d e f g h i j k l m n o p q r<font color=Cyan>)</font>-<a name="(line526)"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf18"</font> [] []-<a name="(line527)"></a>-<a name="(line528)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e-<a name="(line529)"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j-<a name="(line530)"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>,</font>XmlContent l<font color=Cyan>,</font>XmlContent m<font color=Cyan>,</font>XmlContent n<font color=Cyan>,</font>XmlContent o-<a name="(line531)"></a> <font color=Cyan>,</font>XmlContent p<font color=Cyan>,</font>XmlContent q<font color=Cyan>,</font>XmlContent r<font color=Cyan>)</font>-<a name="(line532)"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf18 a b c d e f g h i j k l m n o p q r<font color=Cyan>)</font>-<a name="(line533)"></a> <font color=Green><u>where</u></font>-<a name="(line534)"></a> parseContents <font color=Red>=</font>-<a name="(line535)"></a> <font color=Cyan>(</font>choice OneOf18 <font color=Cyan>$</font> choice TwoOf18 <font color=Cyan>$</font> choice ThreeOf18 <font color=Cyan>$</font> choice FourOf18-<a name="(line536)"></a> <font color=Cyan>$</font> choice FiveOf18 <font color=Cyan>$</font> choice SixOf18 <font color=Cyan>$</font> choice SevenOf18-<a name="(line537)"></a> <font color=Cyan>$</font> choice EightOf18 <font color=Cyan>$</font> choice NineOf18 <font color=Cyan>$</font> choice TenOf18-<a name="(line538)"></a> <font color=Cyan>$</font> choice ElevenOf18 <font color=Cyan>$</font> choice TwelveOf18 <font color=Cyan>$</font> choice ThirteenOf18-<a name="(line539)"></a> <font color=Cyan>$</font> choice FourteenOf18 <font color=Cyan>$</font> choice FifteenOf18 <font color=Cyan>$</font> choice SixteenOf18-<a name="(line540)"></a> <font color=Cyan>$</font> choice SeventeenOf18 <font color=Cyan>$</font> choice EighteenOf18-<a name="(line541)"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf18"</font><font color=Cyan>)</font>-<a name="(line542)"></a> toContents <font color=Cyan>(</font>OneOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line543)"></a> toContents <font color=Cyan>(</font>TwoOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line544)"></a> toContents <font color=Cyan>(</font>ThreeOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line545)"></a> toContents <font color=Cyan>(</font>FourOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line546)"></a> toContents <font color=Cyan>(</font>FiveOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line547)"></a> toContents <font color=Cyan>(</font>SixOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line548)"></a> toContents <font color=Cyan>(</font>SevenOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line549)"></a> toContents <font color=Cyan>(</font>EightOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line550)"></a> toContents <font color=Cyan>(</font>NineOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line551)"></a> toContents <font color=Cyan>(</font>TenOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line552)"></a> toContents <font color=Cyan>(</font>ElevenOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line553)"></a> toContents <font color=Cyan>(</font>TwelveOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line554)"></a> toContents <font color=Cyan>(</font>ThirteenOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line555)"></a> toContents <font color=Cyan>(</font>FourteenOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line556)"></a> toContents <font color=Cyan>(</font>FifteenOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line557)"></a> toContents <font color=Cyan>(</font>SixteenOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line558)"></a> toContents <font color=Cyan>(</font>SeventeenOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line559)"></a> toContents <font color=Cyan>(</font>EighteenOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line560)"></a>-<a name="(line561)"></a><a name="OneOf19"></a><font color=Blue>----</font>-<a name="(line562)"></a><a name="OneOf19"></a><font color=Green><u>data</u></font> OneOf19 a b c d e f g h i j k l m n o p q r s-<a name="(line563)"></a> <font color=Red>=</font> OneOf19 a <font color=Red>|</font> TwoOf19 b <font color=Red>|</font> ThreeOf19 c <font color=Red>|</font> FourOf19 d <font color=Red>|</font> FiveOf19 e-<a name="(line564)"></a> <font color=Red>|</font> SixOf19 f <font color=Red>|</font> SevenOf19 g <font color=Red>|</font> EightOf19 h <font color=Red>|</font> NineOf19 i <font color=Red>|</font> TenOf19 j-<a name="(line565)"></a> <font color=Red>|</font> ElevenOf19 k <font color=Red>|</font> TwelveOf19 l <font color=Red>|</font> ThirteenOf19 m <font color=Red>|</font> FourteenOf19 n-<a name="(line566)"></a> <font color=Red>|</font> FifteenOf19 o <font color=Red>|</font> SixteenOf19 p <font color=Red>|</font> SeventeenOf19 q <font color=Red>|</font> EighteenOf19 r-<a name="(line567)"></a> <font color=Red>|</font> NineteenOf19 s-<a name="(line568)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line569)"></a>-<a name="(line570)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e-<a name="(line571)"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j-<a name="(line572)"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>,</font>HTypeable l<font color=Cyan>,</font>HTypeable m<font color=Cyan>,</font>HTypeable n<font color=Cyan>,</font>HTypeable o-<a name="(line573)"></a> <font color=Cyan>,</font>HTypeable p<font color=Cyan>,</font>HTypeable q<font color=Cyan>,</font>HTypeable r<font color=Cyan>,</font>HTypeable s<font color=Cyan>)</font>-<a name="(line574)"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf19 a b c d e f g h i j k l m n o p q r s<font color=Cyan>)</font>-<a name="(line575)"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf19"</font> [] []-<a name="(line576)"></a>-<a name="(line577)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e-<a name="(line578)"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j-<a name="(line579)"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>,</font>XmlContent l<font color=Cyan>,</font>XmlContent m<font color=Cyan>,</font>XmlContent n<font color=Cyan>,</font>XmlContent o-<a name="(line580)"></a> <font color=Cyan>,</font>XmlContent p<font color=Cyan>,</font>XmlContent q<font color=Cyan>,</font>XmlContent r<font color=Cyan>,</font>XmlContent s<font color=Cyan>)</font>-<a name="(line581)"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf19 a b c d e f g h i j k l m n o p q r s<font color=Cyan>)</font>-<a name="(line582)"></a> <font color=Green><u>where</u></font>-<a name="(line583)"></a> parseContents <font color=Red>=</font>-<a name="(line584)"></a> <font color=Cyan>(</font>choice OneOf19 <font color=Cyan>$</font> choice TwoOf19 <font color=Cyan>$</font> choice ThreeOf19 <font color=Cyan>$</font> choice FourOf19-<a name="(line585)"></a> <font color=Cyan>$</font> choice FiveOf19 <font color=Cyan>$</font> choice SixOf19 <font color=Cyan>$</font> choice SevenOf19-<a name="(line586)"></a> <font color=Cyan>$</font> choice EightOf19 <font color=Cyan>$</font> choice NineOf19 <font color=Cyan>$</font> choice TenOf19-<a name="(line587)"></a> <font color=Cyan>$</font> choice ElevenOf19 <font color=Cyan>$</font> choice TwelveOf19 <font color=Cyan>$</font> choice ThirteenOf19-<a name="(line588)"></a> <font color=Cyan>$</font> choice FourteenOf19 <font color=Cyan>$</font> choice FifteenOf19 <font color=Cyan>$</font> choice SixteenOf19-<a name="(line589)"></a> <font color=Cyan>$</font> choice SeventeenOf19 <font color=Cyan>$</font> choice EighteenOf19 <font color=Cyan>$</font> choice NineteenOf19-<a name="(line590)"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf19"</font><font color=Cyan>)</font>-<a name="(line591)"></a> toContents <font color=Cyan>(</font>OneOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line592)"></a> toContents <font color=Cyan>(</font>TwoOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line593)"></a> toContents <font color=Cyan>(</font>ThreeOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line594)"></a> toContents <font color=Cyan>(</font>FourOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line595)"></a> toContents <font color=Cyan>(</font>FiveOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line596)"></a> toContents <font color=Cyan>(</font>SixOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line597)"></a> toContents <font color=Cyan>(</font>SevenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line598)"></a> toContents <font color=Cyan>(</font>EightOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line599)"></a> toContents <font color=Cyan>(</font>NineOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line600)"></a> toContents <font color=Cyan>(</font>TenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line601)"></a> toContents <font color=Cyan>(</font>ElevenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line602)"></a> toContents <font color=Cyan>(</font>TwelveOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line603)"></a> toContents <font color=Cyan>(</font>ThirteenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line604)"></a> toContents <font color=Cyan>(</font>FourteenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line605)"></a> toContents <font color=Cyan>(</font>FifteenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line606)"></a> toContents <font color=Cyan>(</font>SixteenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line607)"></a> toContents <font color=Cyan>(</font>SeventeenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line608)"></a> toContents <font color=Cyan>(</font>EighteenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line609)"></a> toContents <font color=Cyan>(</font>NineteenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line610)"></a>-<a name="(line611)"></a><a name="OneOf20"></a><font color=Blue>----</font>-<a name="(line612)"></a><a name="OneOf20"></a><font color=Green><u>data</u></font> OneOf20 a b c d e f g h i j k l m n o p q r s t-<a name="(line613)"></a> <font color=Red>=</font> OneOf20 a <font color=Red>|</font> TwoOf20 b <font color=Red>|</font> ThreeOf20 c <font color=Red>|</font> FourOf20 d <font color=Red>|</font> FiveOf20 e-<a name="(line614)"></a> <font color=Red>|</font> SixOf20 f <font color=Red>|</font> SevenOf20 g <font color=Red>|</font> EightOf20 h <font color=Red>|</font> NineOf20 i <font color=Red>|</font> TenOf20 j-<a name="(line615)"></a> <font color=Red>|</font> ElevenOf20 k <font color=Red>|</font> TwelveOf20 l <font color=Red>|</font> ThirteenOf20 m <font color=Red>|</font> FourteenOf20 n-<a name="(line616)"></a> <font color=Red>|</font> FifteenOf20 o <font color=Red>|</font> SixteenOf20 p <font color=Red>|</font> SeventeenOf20 q <font color=Red>|</font> EighteenOf20 r-<a name="(line617)"></a> <font color=Red>|</font> NineteenOf20 s <font color=Red>|</font> TwentyOf20 t-<a name="(line618)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line619)"></a>-<a name="(line620)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e-<a name="(line621)"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j-<a name="(line622)"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>,</font>HTypeable l<font color=Cyan>,</font>HTypeable m<font color=Cyan>,</font>HTypeable n<font color=Cyan>,</font>HTypeable o-<a name="(line623)"></a> <font color=Cyan>,</font>HTypeable p<font color=Cyan>,</font>HTypeable q<font color=Cyan>,</font>HTypeable r<font color=Cyan>,</font>HTypeable s<font color=Cyan>,</font>HTypeable t<font color=Cyan>)</font>-<a name="(line624)"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf20 a b c d e f g h i j k l m n o p q r s t<font color=Cyan>)</font>-<a name="(line625)"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf20"</font> [] []-<a name="(line626)"></a>-<a name="(line627)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e-<a name="(line628)"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j-<a name="(line629)"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>,</font>XmlContent l<font color=Cyan>,</font>XmlContent m<font color=Cyan>,</font>XmlContent n<font color=Cyan>,</font>XmlContent o-<a name="(line630)"></a> <font color=Cyan>,</font>XmlContent p<font color=Cyan>,</font>XmlContent q<font color=Cyan>,</font>XmlContent r<font color=Cyan>,</font>XmlContent s<font color=Cyan>,</font>XmlContent t<font color=Cyan>)</font>-<a name="(line631)"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf20 a b c d e f g h i j k l m n o p q r s t<font color=Cyan>)</font>-<a name="(line632)"></a> <font color=Green><u>where</u></font>-<a name="(line633)"></a> parseContents <font color=Red>=</font>-<a name="(line634)"></a> <font color=Cyan>(</font>choice OneOf20 <font color=Cyan>$</font> choice TwoOf20 <font color=Cyan>$</font> choice ThreeOf20 <font color=Cyan>$</font> choice FourOf20-<a name="(line635)"></a> <font color=Cyan>$</font> choice FiveOf20 <font color=Cyan>$</font> choice SixOf20 <font color=Cyan>$</font> choice SevenOf20-<a name="(line636)"></a> <font color=Cyan>$</font> choice EightOf20 <font color=Cyan>$</font> choice NineOf20 <font color=Cyan>$</font> choice TenOf20-<a name="(line637)"></a> <font color=Cyan>$</font> choice ElevenOf20 <font color=Cyan>$</font> choice TwelveOf20 <font color=Cyan>$</font> choice ThirteenOf20-<a name="(line638)"></a> <font color=Cyan>$</font> choice FourteenOf20 <font color=Cyan>$</font> choice FifteenOf20 <font color=Cyan>$</font> choice SixteenOf20-<a name="(line639)"></a> <font color=Cyan>$</font> choice SeventeenOf20 <font color=Cyan>$</font> choice EighteenOf20 <font color=Cyan>$</font> choice NineteenOf20-<a name="(line640)"></a> <font color=Cyan>$</font> choice TwentyOf20-<a name="(line641)"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf20"</font><font color=Cyan>)</font>-<a name="(line642)"></a> toContents <font color=Cyan>(</font>OneOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line643)"></a> toContents <font color=Cyan>(</font>TwoOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line644)"></a> toContents <font color=Cyan>(</font>ThreeOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line645)"></a> toContents <font color=Cyan>(</font>FourOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line646)"></a> toContents <font color=Cyan>(</font>FiveOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line647)"></a> toContents <font color=Cyan>(</font>SixOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line648)"></a> toContents <font color=Cyan>(</font>SevenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line649)"></a> toContents <font color=Cyan>(</font>EightOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line650)"></a> toContents <font color=Cyan>(</font>NineOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line651)"></a> toContents <font color=Cyan>(</font>TenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line652)"></a> toContents <font color=Cyan>(</font>ElevenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line653)"></a> toContents <font color=Cyan>(</font>TwelveOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line654)"></a> toContents <font color=Cyan>(</font>ThirteenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line655)"></a> toContents <font color=Cyan>(</font>FourteenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line656)"></a> toContents <font color=Cyan>(</font>FifteenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line657)"></a> toContents <font color=Cyan>(</font>SixteenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line658)"></a> toContents <font color=Cyan>(</font>SeventeenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line659)"></a> toContents <font color=Cyan>(</font>EighteenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line660)"></a> toContents <font color=Cyan>(</font>NineteenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line661)"></a> toContents <font color=Cyan>(</font>TwentyOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x-<a name="(line662)"></a>-<a name="(line663)"></a><font color=Blue>----</font>-</pre>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/OneOfN.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>OneOfN <font color=Green><u>where</u></font>+<a name="line-2"></a>+<a name="line-3"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>XmlContent+<a name="line-4"></a>+<a name="line-5"></a><a name="OneOf2"></a><font color=Green><u>data</u></font> OneOf2 a b+<a name="line-6"></a> <font color=Red>=</font> OneOf2 a <font color=Red>|</font> TwoOf2 b+<a name="line-7"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-8"></a>+<a name="line-9"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>)</font>+<a name="line-10"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf2 a b<font color=Cyan>)</font>+<a name="line-11"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf2"</font> [] []+<a name="line-12"></a> <font color=Blue>-- toHType m = Defined "OneOf2" [a,b] []</font>+<a name="line-13"></a> <font color=Blue>-- where a = toHType $ (\ (OneOf2 a)->a) $ m</font>+<a name="line-14"></a> <font color=Blue>-- b = toHType $ (\ (TwoOf2 b)->b) $ m</font>+<a name="line-15"></a>+<a name="line-16"></a>+<a name="line-17"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>)</font>+<a name="line-18"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf2 a b<font color=Cyan>)</font>+<a name="line-19"></a> <font color=Green><u>where</u></font>+<a name="line-20"></a> parseContents <font color=Red>=</font>+<a name="line-21"></a> <font color=Cyan>(</font>choice OneOf2 <font color=Cyan>$</font> choice TwoOf2+<a name="line-22"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf2"</font><font color=Cyan>)</font>+<a name="line-23"></a> toContents <font color=Cyan>(</font>OneOf2 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-24"></a> toContents <font color=Cyan>(</font>TwoOf2 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-25"></a>+<a name="line-26"></a><a name="OneOf3"></a><font color=Blue>----</font>+<a name="line-27"></a><a name="OneOf3"></a><font color=Green><u>data</u></font> OneOf3 a b c+<a name="line-28"></a> <font color=Red>=</font> OneOf3 a <font color=Red>|</font> TwoOf3 b <font color=Red>|</font> ThreeOf3 c+<a name="line-29"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-30"></a>+<a name="line-31"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>)</font>+<a name="line-32"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf3 a b c<font color=Cyan>)</font>+<a name="line-33"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf3"</font> [] []+<a name="line-34"></a>+<a name="line-35"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>)</font>+<a name="line-36"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf3 a b c<font color=Cyan>)</font>+<a name="line-37"></a> <font color=Green><u>where</u></font>+<a name="line-38"></a> parseContents <font color=Red>=</font>+<a name="line-39"></a> <font color=Cyan>(</font>choice OneOf3 <font color=Cyan>$</font> choice TwoOf3 <font color=Cyan>$</font> choice ThreeOf3+<a name="line-40"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf3"</font><font color=Cyan>)</font>+<a name="line-41"></a> toContents <font color=Cyan>(</font>OneOf3 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-42"></a> toContents <font color=Cyan>(</font>TwoOf3 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-43"></a> toContents <font color=Cyan>(</font>ThreeOf3 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-44"></a>+<a name="line-45"></a><a name="OneOf4"></a><font color=Blue>----</font>+<a name="line-46"></a><a name="OneOf4"></a><font color=Green><u>data</u></font> OneOf4 a b c d+<a name="line-47"></a> <font color=Red>=</font> OneOf4 a <font color=Red>|</font> TwoOf4 b <font color=Red>|</font> ThreeOf4 c <font color=Red>|</font> FourOf4 d+<a name="line-48"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-49"></a>+<a name="line-50"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>)</font>+<a name="line-51"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf4 a b c d<font color=Cyan>)</font>+<a name="line-52"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf4"</font> [] []+<a name="line-53"></a>+<a name="line-54"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>)</font>+<a name="line-55"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf4 a b c d<font color=Cyan>)</font>+<a name="line-56"></a> <font color=Green><u>where</u></font>+<a name="line-57"></a> parseContents <font color=Red>=</font>+<a name="line-58"></a> <font color=Cyan>(</font>choice OneOf4 <font color=Cyan>$</font> choice TwoOf4 <font color=Cyan>$</font> choice ThreeOf4 <font color=Cyan>$</font> choice FourOf4+<a name="line-59"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf4"</font><font color=Cyan>)</font>+<a name="line-60"></a> toContents <font color=Cyan>(</font>OneOf4 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-61"></a> toContents <font color=Cyan>(</font>TwoOf4 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-62"></a> toContents <font color=Cyan>(</font>ThreeOf4 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-63"></a> toContents <font color=Cyan>(</font>FourOf4 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-64"></a>+<a name="line-65"></a><a name="OneOf5"></a><font color=Blue>----</font>+<a name="line-66"></a><a name="OneOf5"></a><font color=Green><u>data</u></font> OneOf5 a b c d e+<a name="line-67"></a> <font color=Red>=</font> OneOf5 a <font color=Red>|</font> TwoOf5 b <font color=Red>|</font> ThreeOf5 c <font color=Red>|</font> FourOf5 d <font color=Red>|</font> FiveOf5 e+<a name="line-68"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-69"></a>+<a name="line-70"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e<font color=Cyan>)</font>+<a name="line-71"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf5 a b c d e<font color=Cyan>)</font>+<a name="line-72"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf5"</font> [] []+<a name="line-73"></a>+<a name="line-74"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e<font color=Cyan>)</font>+<a name="line-75"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf5 a b c d e<font color=Cyan>)</font>+<a name="line-76"></a> <font color=Green><u>where</u></font>+<a name="line-77"></a> parseContents <font color=Red>=</font>+<a name="line-78"></a> <font color=Cyan>(</font>choice OneOf5 <font color=Cyan>$</font> choice TwoOf5 <font color=Cyan>$</font> choice ThreeOf5 <font color=Cyan>$</font> choice FourOf5+<a name="line-79"></a> <font color=Cyan>$</font> choice FiveOf5+<a name="line-80"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf5"</font><font color=Cyan>)</font>+<a name="line-81"></a> toContents <font color=Cyan>(</font>OneOf5 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-82"></a> toContents <font color=Cyan>(</font>TwoOf5 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-83"></a> toContents <font color=Cyan>(</font>ThreeOf5 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-84"></a> toContents <font color=Cyan>(</font>FourOf5 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-85"></a> toContents <font color=Cyan>(</font>FiveOf5 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-86"></a>+<a name="line-87"></a><a name="OneOf6"></a><font color=Blue>----</font>+<a name="line-88"></a><a name="OneOf6"></a><font color=Green><u>data</u></font> OneOf6 a b c d e f+<a name="line-89"></a> <font color=Red>=</font> OneOf6 a <font color=Red>|</font> TwoOf6 b <font color=Red>|</font> ThreeOf6 c <font color=Red>|</font> FourOf6 d <font color=Red>|</font> FiveOf6 e <font color=Red>|</font> SixOf6 f+<a name="line-90"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-91"></a>+<a name="line-92"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e+<a name="line-93"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>)</font>+<a name="line-94"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf6 a b c d e f<font color=Cyan>)</font>+<a name="line-95"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf6"</font> [] []+<a name="line-96"></a>+<a name="line-97"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e+<a name="line-98"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>)</font>+<a name="line-99"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf6 a b c d e f<font color=Cyan>)</font>+<a name="line-100"></a> <font color=Green><u>where</u></font>+<a name="line-101"></a> parseContents <font color=Red>=</font>+<a name="line-102"></a> <font color=Cyan>(</font>choice OneOf6 <font color=Cyan>$</font> choice TwoOf6 <font color=Cyan>$</font> choice ThreeOf6 <font color=Cyan>$</font> choice FourOf6+<a name="line-103"></a> <font color=Cyan>$</font> choice FiveOf6 <font color=Cyan>$</font> choice SixOf6+<a name="line-104"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf6"</font><font color=Cyan>)</font>+<a name="line-105"></a> toContents <font color=Cyan>(</font>OneOf6 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-106"></a> toContents <font color=Cyan>(</font>TwoOf6 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-107"></a> toContents <font color=Cyan>(</font>ThreeOf6 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-108"></a> toContents <font color=Cyan>(</font>FourOf6 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-109"></a> toContents <font color=Cyan>(</font>FiveOf6 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-110"></a> toContents <font color=Cyan>(</font>SixOf6 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-111"></a>+<a name="line-112"></a><a name="OneOf7"></a><font color=Blue>----</font>+<a name="line-113"></a><a name="OneOf7"></a><font color=Green><u>data</u></font> OneOf7 a b c d e f g+<a name="line-114"></a> <font color=Red>=</font> OneOf7 a <font color=Red>|</font> TwoOf7 b <font color=Red>|</font> ThreeOf7 c <font color=Red>|</font> FourOf7 d <font color=Red>|</font> FiveOf7 e <font color=Red>|</font> SixOf7 f+<a name="line-115"></a> <font color=Red>|</font> SevenOf7 g+<a name="line-116"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-117"></a>+<a name="line-118"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e+<a name="line-119"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>)</font>+<a name="line-120"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf7 a b c d e f g<font color=Cyan>)</font>+<a name="line-121"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf7"</font> [] []+<a name="line-122"></a>+<a name="line-123"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e+<a name="line-124"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>)</font>+<a name="line-125"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf7 a b c d e f g<font color=Cyan>)</font>+<a name="line-126"></a> <font color=Green><u>where</u></font>+<a name="line-127"></a> parseContents <font color=Red>=</font>+<a name="line-128"></a> <font color=Cyan>(</font>choice OneOf7 <font color=Cyan>$</font> choice TwoOf7 <font color=Cyan>$</font> choice ThreeOf7 <font color=Cyan>$</font> choice FourOf7+<a name="line-129"></a> <font color=Cyan>$</font> choice FiveOf7 <font color=Cyan>$</font> choice SixOf7 <font color=Cyan>$</font> choice SevenOf7+<a name="line-130"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf7"</font><font color=Cyan>)</font>+<a name="line-131"></a> toContents <font color=Cyan>(</font>OneOf7 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-132"></a> toContents <font color=Cyan>(</font>TwoOf7 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-133"></a> toContents <font color=Cyan>(</font>ThreeOf7 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-134"></a> toContents <font color=Cyan>(</font>FourOf7 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-135"></a> toContents <font color=Cyan>(</font>FiveOf7 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-136"></a> toContents <font color=Cyan>(</font>SixOf7 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-137"></a> toContents <font color=Cyan>(</font>SevenOf7 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-138"></a>+<a name="line-139"></a><a name="OneOf8"></a><font color=Blue>----</font>+<a name="line-140"></a><a name="OneOf8"></a><font color=Green><u>data</u></font> OneOf8 a b c d e f g h+<a name="line-141"></a> <font color=Red>=</font> OneOf8 a <font color=Red>|</font> TwoOf8 b <font color=Red>|</font> ThreeOf8 c <font color=Red>|</font> FourOf8 d <font color=Red>|</font> FiveOf8 e <font color=Red>|</font> SixOf8 f+<a name="line-142"></a> <font color=Red>|</font> SevenOf8 g <font color=Red>|</font> EightOf8 h+<a name="line-143"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-144"></a>+<a name="line-145"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e+<a name="line-146"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>)</font>+<a name="line-147"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf8 a b c d e f g h<font color=Cyan>)</font>+<a name="line-148"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf8"</font> [] []+<a name="line-149"></a>+<a name="line-150"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e+<a name="line-151"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>)</font>+<a name="line-152"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf8 a b c d e f g h<font color=Cyan>)</font>+<a name="line-153"></a> <font color=Green><u>where</u></font>+<a name="line-154"></a> parseContents <font color=Red>=</font>+<a name="line-155"></a> <font color=Cyan>(</font>choice OneOf8 <font color=Cyan>$</font> choice TwoOf8 <font color=Cyan>$</font> choice ThreeOf8 <font color=Cyan>$</font> choice FourOf8+<a name="line-156"></a> <font color=Cyan>$</font> choice FiveOf8 <font color=Cyan>$</font> choice SixOf8 <font color=Cyan>$</font> choice SevenOf8 <font color=Cyan>$</font> choice EightOf8+<a name="line-157"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf8"</font><font color=Cyan>)</font>+<a name="line-158"></a> toContents <font color=Cyan>(</font>OneOf8 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-159"></a> toContents <font color=Cyan>(</font>TwoOf8 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-160"></a> toContents <font color=Cyan>(</font>ThreeOf8 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-161"></a> toContents <font color=Cyan>(</font>FourOf8 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-162"></a> toContents <font color=Cyan>(</font>FiveOf8 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-163"></a> toContents <font color=Cyan>(</font>SixOf8 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-164"></a> toContents <font color=Cyan>(</font>SevenOf8 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-165"></a> toContents <font color=Cyan>(</font>EightOf8 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-166"></a>+<a name="line-167"></a><a name="OneOf9"></a><font color=Blue>----</font>+<a name="line-168"></a><a name="OneOf9"></a><font color=Green><u>data</u></font> OneOf9 a b c d e f g h i+<a name="line-169"></a> <font color=Red>=</font> OneOf9 a <font color=Red>|</font> TwoOf9 b <font color=Red>|</font> ThreeOf9 c <font color=Red>|</font> FourOf9 d <font color=Red>|</font> FiveOf9 e <font color=Red>|</font> SixOf9 f+<a name="line-170"></a> <font color=Red>|</font> SevenOf9 g <font color=Red>|</font> EightOf9 h <font color=Red>|</font> NineOf9 i+<a name="line-171"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-172"></a>+<a name="line-173"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e+<a name="line-174"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>)</font>+<a name="line-175"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf9 a b c d e f g h i<font color=Cyan>)</font>+<a name="line-176"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf9"</font> [] []+<a name="line-177"></a>+<a name="line-178"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e+<a name="line-179"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>)</font>+<a name="line-180"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf9 a b c d e f g h i<font color=Cyan>)</font>+<a name="line-181"></a> <font color=Green><u>where</u></font>+<a name="line-182"></a> parseContents <font color=Red>=</font>+<a name="line-183"></a> <font color=Cyan>(</font>choice OneOf9 <font color=Cyan>$</font> choice TwoOf9 <font color=Cyan>$</font> choice ThreeOf9 <font color=Cyan>$</font> choice FourOf9+<a name="line-184"></a> <font color=Cyan>$</font> choice FiveOf9 <font color=Cyan>$</font> choice SixOf9 <font color=Cyan>$</font> choice SevenOf9 <font color=Cyan>$</font> choice EightOf9+<a name="line-185"></a> <font color=Cyan>$</font> choice NineOf9+<a name="line-186"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf9"</font><font color=Cyan>)</font>+<a name="line-187"></a> toContents <font color=Cyan>(</font>OneOf9 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-188"></a> toContents <font color=Cyan>(</font>TwoOf9 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-189"></a> toContents <font color=Cyan>(</font>ThreeOf9 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-190"></a> toContents <font color=Cyan>(</font>FourOf9 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-191"></a> toContents <font color=Cyan>(</font>FiveOf9 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-192"></a> toContents <font color=Cyan>(</font>SixOf9 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-193"></a> toContents <font color=Cyan>(</font>SevenOf9 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-194"></a> toContents <font color=Cyan>(</font>EightOf9 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-195"></a> toContents <font color=Cyan>(</font>NineOf9 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-196"></a>+<a name="line-197"></a><a name="OneOf10"></a><font color=Blue>----</font>+<a name="line-198"></a><a name="OneOf10"></a><font color=Green><u>data</u></font> OneOf10 a b c d e f g h i j+<a name="line-199"></a> <font color=Red>=</font> OneOf10 a <font color=Red>|</font> TwoOf10 b <font color=Red>|</font> ThreeOf10 c <font color=Red>|</font> FourOf10 d <font color=Red>|</font> FiveOf10 e+<a name="line-200"></a> <font color=Red>|</font> SixOf10 f <font color=Red>|</font> SevenOf10 g <font color=Red>|</font> EightOf10 h <font color=Red>|</font> NineOf10 i <font color=Red>|</font> TenOf10 j+<a name="line-201"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-202"></a>+<a name="line-203"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e+<a name="line-204"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j<font color=Cyan>)</font>+<a name="line-205"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf10 a b c d e f g h i j<font color=Cyan>)</font>+<a name="line-206"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf10"</font> [] []+<a name="line-207"></a>+<a name="line-208"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e+<a name="line-209"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j<font color=Cyan>)</font>+<a name="line-210"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf10 a b c d e f g h i j<font color=Cyan>)</font>+<a name="line-211"></a> <font color=Green><u>where</u></font>+<a name="line-212"></a> parseContents <font color=Red>=</font>+<a name="line-213"></a> <font color=Cyan>(</font>choice OneOf10 <font color=Cyan>$</font> choice TwoOf10 <font color=Cyan>$</font> choice ThreeOf10 <font color=Cyan>$</font> choice FourOf10+<a name="line-214"></a> <font color=Cyan>$</font> choice FiveOf10 <font color=Cyan>$</font> choice SixOf10 <font color=Cyan>$</font> choice SevenOf10+<a name="line-215"></a> <font color=Cyan>$</font> choice EightOf10 <font color=Cyan>$</font> choice NineOf10 <font color=Cyan>$</font> choice TenOf10+<a name="line-216"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf10"</font><font color=Cyan>)</font>+<a name="line-217"></a> toContents <font color=Cyan>(</font>OneOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-218"></a> toContents <font color=Cyan>(</font>TwoOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-219"></a> toContents <font color=Cyan>(</font>ThreeOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-220"></a> toContents <font color=Cyan>(</font>FourOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-221"></a> toContents <font color=Cyan>(</font>FiveOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-222"></a> toContents <font color=Cyan>(</font>SixOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-223"></a> toContents <font color=Cyan>(</font>SevenOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-224"></a> toContents <font color=Cyan>(</font>EightOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-225"></a> toContents <font color=Cyan>(</font>NineOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-226"></a> toContents <font color=Cyan>(</font>TenOf10 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-227"></a>+<a name="line-228"></a><a name="OneOf11"></a><font color=Blue>----</font>+<a name="line-229"></a><a name="OneOf11"></a><font color=Green><u>data</u></font> OneOf11 a b c d e f g h i j k+<a name="line-230"></a> <font color=Red>=</font> OneOf11 a <font color=Red>|</font> TwoOf11 b <font color=Red>|</font> ThreeOf11 c <font color=Red>|</font> FourOf11 d <font color=Red>|</font> FiveOf11 e+<a name="line-231"></a> <font color=Red>|</font> SixOf11 f <font color=Red>|</font> SevenOf11 g <font color=Red>|</font> EightOf11 h <font color=Red>|</font> NineOf11 i <font color=Red>|</font> TenOf11 j+<a name="line-232"></a> <font color=Red>|</font> ElevenOf11 k+<a name="line-233"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-234"></a>+<a name="line-235"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e+<a name="line-236"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j+<a name="line-237"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>)</font>+<a name="line-238"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf11 a b c d e f g h i j k<font color=Cyan>)</font>+<a name="line-239"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf11"</font> [] []+<a name="line-240"></a>+<a name="line-241"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e+<a name="line-242"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j+<a name="line-243"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>)</font>+<a name="line-244"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf11 a b c d e f g h i j k<font color=Cyan>)</font>+<a name="line-245"></a> <font color=Green><u>where</u></font>+<a name="line-246"></a> parseContents <font color=Red>=</font>+<a name="line-247"></a> <font color=Cyan>(</font>choice OneOf11 <font color=Cyan>$</font> choice TwoOf11 <font color=Cyan>$</font> choice ThreeOf11 <font color=Cyan>$</font> choice FourOf11+<a name="line-248"></a> <font color=Cyan>$</font> choice FiveOf11 <font color=Cyan>$</font> choice SixOf11 <font color=Cyan>$</font> choice SevenOf11+<a name="line-249"></a> <font color=Cyan>$</font> choice EightOf11 <font color=Cyan>$</font> choice NineOf11 <font color=Cyan>$</font> choice TenOf11+<a name="line-250"></a> <font color=Cyan>$</font> choice ElevenOf11+<a name="line-251"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf11"</font><font color=Cyan>)</font>+<a name="line-252"></a> toContents <font color=Cyan>(</font>OneOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-253"></a> toContents <font color=Cyan>(</font>TwoOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-254"></a> toContents <font color=Cyan>(</font>ThreeOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-255"></a> toContents <font color=Cyan>(</font>FourOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-256"></a> toContents <font color=Cyan>(</font>FiveOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-257"></a> toContents <font color=Cyan>(</font>SixOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-258"></a> toContents <font color=Cyan>(</font>SevenOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-259"></a> toContents <font color=Cyan>(</font>EightOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-260"></a> toContents <font color=Cyan>(</font>NineOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-261"></a> toContents <font color=Cyan>(</font>TenOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-262"></a> toContents <font color=Cyan>(</font>ElevenOf11 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-263"></a>+<a name="line-264"></a><a name="OneOf12"></a><font color=Blue>----</font>+<a name="line-265"></a><a name="OneOf12"></a><font color=Green><u>data</u></font> OneOf12 a b c d e f g h i j k l+<a name="line-266"></a> <font color=Red>=</font> OneOf12 a <font color=Red>|</font> TwoOf12 b <font color=Red>|</font> ThreeOf12 c <font color=Red>|</font> FourOf12 d <font color=Red>|</font> FiveOf12 e+<a name="line-267"></a> <font color=Red>|</font> SixOf12 f <font color=Red>|</font> SevenOf12 g <font color=Red>|</font> EightOf12 h <font color=Red>|</font> NineOf12 i <font color=Red>|</font> TenOf12 j+<a name="line-268"></a> <font color=Red>|</font> ElevenOf12 k <font color=Red>|</font> TwelveOf12 l+<a name="line-269"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-270"></a>+<a name="line-271"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e+<a name="line-272"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j+<a name="line-273"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>,</font>HTypeable l<font color=Cyan>)</font>+<a name="line-274"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf12 a b c d e f g h i j k l<font color=Cyan>)</font>+<a name="line-275"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf12"</font> [] []+<a name="line-276"></a>+<a name="line-277"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e+<a name="line-278"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j+<a name="line-279"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>,</font>XmlContent l<font color=Cyan>)</font>+<a name="line-280"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf12 a b c d e f g h i j k l<font color=Cyan>)</font>+<a name="line-281"></a> <font color=Green><u>where</u></font>+<a name="line-282"></a> parseContents <font color=Red>=</font>+<a name="line-283"></a> <font color=Cyan>(</font>choice OneOf12 <font color=Cyan>$</font> choice TwoOf12 <font color=Cyan>$</font> choice ThreeOf12 <font color=Cyan>$</font> choice FourOf12+<a name="line-284"></a> <font color=Cyan>$</font> choice FiveOf12 <font color=Cyan>$</font> choice SixOf12 <font color=Cyan>$</font> choice SevenOf12+<a name="line-285"></a> <font color=Cyan>$</font> choice EightOf12 <font color=Cyan>$</font> choice NineOf12 <font color=Cyan>$</font> choice TenOf12+<a name="line-286"></a> <font color=Cyan>$</font> choice ElevenOf12 <font color=Cyan>$</font> choice TwelveOf12+<a name="line-287"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf12"</font><font color=Cyan>)</font>+<a name="line-288"></a> toContents <font color=Cyan>(</font>OneOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-289"></a> toContents <font color=Cyan>(</font>TwoOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-290"></a> toContents <font color=Cyan>(</font>ThreeOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-291"></a> toContents <font color=Cyan>(</font>FourOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-292"></a> toContents <font color=Cyan>(</font>FiveOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-293"></a> toContents <font color=Cyan>(</font>SixOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-294"></a> toContents <font color=Cyan>(</font>SevenOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-295"></a> toContents <font color=Cyan>(</font>EightOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-296"></a> toContents <font color=Cyan>(</font>NineOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-297"></a> toContents <font color=Cyan>(</font>TenOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-298"></a> toContents <font color=Cyan>(</font>ElevenOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-299"></a> toContents <font color=Cyan>(</font>TwelveOf12 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-300"></a>+<a name="line-301"></a><a name="OneOf13"></a><font color=Blue>----</font>+<a name="line-302"></a><a name="OneOf13"></a><font color=Green><u>data</u></font> OneOf13 a b c d e f g h i j k l m+<a name="line-303"></a> <font color=Red>=</font> OneOf13 a <font color=Red>|</font> TwoOf13 b <font color=Red>|</font> ThreeOf13 c <font color=Red>|</font> FourOf13 d <font color=Red>|</font> FiveOf13 e+<a name="line-304"></a> <font color=Red>|</font> SixOf13 f <font color=Red>|</font> SevenOf13 g <font color=Red>|</font> EightOf13 h <font color=Red>|</font> NineOf13 i <font color=Red>|</font> TenOf13 j+<a name="line-305"></a> <font color=Red>|</font> ElevenOf13 k <font color=Red>|</font> TwelveOf13 l <font color=Red>|</font> ThirteenOf13 m+<a name="line-306"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-307"></a>+<a name="line-308"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e+<a name="line-309"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j+<a name="line-310"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>,</font>HTypeable l<font color=Cyan>,</font>HTypeable m<font color=Cyan>)</font>+<a name="line-311"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf13 a b c d e f g h i j k l m<font color=Cyan>)</font>+<a name="line-312"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf13"</font> [] []+<a name="line-313"></a>+<a name="line-314"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e+<a name="line-315"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j+<a name="line-316"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>,</font>XmlContent l<font color=Cyan>,</font>XmlContent m<font color=Cyan>)</font>+<a name="line-317"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf13 a b c d e f g h i j k l m<font color=Cyan>)</font>+<a name="line-318"></a> <font color=Green><u>where</u></font>+<a name="line-319"></a> parseContents <font color=Red>=</font>+<a name="line-320"></a> <font color=Cyan>(</font>choice OneOf13 <font color=Cyan>$</font> choice TwoOf13 <font color=Cyan>$</font> choice ThreeOf13 <font color=Cyan>$</font> choice FourOf13+<a name="line-321"></a> <font color=Cyan>$</font> choice FiveOf13 <font color=Cyan>$</font> choice SixOf13 <font color=Cyan>$</font> choice SevenOf13+<a name="line-322"></a> <font color=Cyan>$</font> choice EightOf13 <font color=Cyan>$</font> choice NineOf13 <font color=Cyan>$</font> choice TenOf13+<a name="line-323"></a> <font color=Cyan>$</font> choice ElevenOf13 <font color=Cyan>$</font> choice TwelveOf13 <font color=Cyan>$</font> choice ThirteenOf13+<a name="line-324"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf13"</font><font color=Cyan>)</font>+<a name="line-325"></a> toContents <font color=Cyan>(</font>OneOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-326"></a> toContents <font color=Cyan>(</font>TwoOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-327"></a> toContents <font color=Cyan>(</font>ThreeOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-328"></a> toContents <font color=Cyan>(</font>FourOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-329"></a> toContents <font color=Cyan>(</font>FiveOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-330"></a> toContents <font color=Cyan>(</font>SixOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-331"></a> toContents <font color=Cyan>(</font>SevenOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-332"></a> toContents <font color=Cyan>(</font>EightOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-333"></a> toContents <font color=Cyan>(</font>NineOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-334"></a> toContents <font color=Cyan>(</font>TenOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-335"></a> toContents <font color=Cyan>(</font>ElevenOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-336"></a> toContents <font color=Cyan>(</font>TwelveOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-337"></a> toContents <font color=Cyan>(</font>ThirteenOf13 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-338"></a>+<a name="line-339"></a><a name="OneOf14"></a><font color=Blue>----</font>+<a name="line-340"></a><a name="OneOf14"></a><font color=Green><u>data</u></font> OneOf14 a b c d e f g h i j k l m n+<a name="line-341"></a> <font color=Red>=</font> OneOf14 a <font color=Red>|</font> TwoOf14 b <font color=Red>|</font> ThreeOf14 c <font color=Red>|</font> FourOf14 d <font color=Red>|</font> FiveOf14 e+<a name="line-342"></a> <font color=Red>|</font> SixOf14 f <font color=Red>|</font> SevenOf14 g <font color=Red>|</font> EightOf14 h <font color=Red>|</font> NineOf14 i <font color=Red>|</font> TenOf14 j+<a name="line-343"></a> <font color=Red>|</font> ElevenOf14 k <font color=Red>|</font> TwelveOf14 l <font color=Red>|</font> ThirteenOf14 m <font color=Red>|</font> FourteenOf14 n+<a name="line-344"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-345"></a>+<a name="line-346"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e+<a name="line-347"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j+<a name="line-348"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>,</font>HTypeable l<font color=Cyan>,</font>HTypeable m<font color=Cyan>,</font>HTypeable n<font color=Cyan>)</font>+<a name="line-349"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf14 a b c d e f g h i j k l m n<font color=Cyan>)</font>+<a name="line-350"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf14"</font> [] []+<a name="line-351"></a>+<a name="line-352"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e+<a name="line-353"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j+<a name="line-354"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>,</font>XmlContent l<font color=Cyan>,</font>XmlContent m<font color=Cyan>,</font>XmlContent n<font color=Cyan>)</font>+<a name="line-355"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf14 a b c d e f g h i j k l m n<font color=Cyan>)</font>+<a name="line-356"></a> <font color=Green><u>where</u></font>+<a name="line-357"></a> parseContents <font color=Red>=</font>+<a name="line-358"></a> <font color=Cyan>(</font>choice OneOf14 <font color=Cyan>$</font> choice TwoOf14 <font color=Cyan>$</font> choice ThreeOf14 <font color=Cyan>$</font> choice FourOf14+<a name="line-359"></a> <font color=Cyan>$</font> choice FiveOf14 <font color=Cyan>$</font> choice SixOf14 <font color=Cyan>$</font> choice SevenOf14+<a name="line-360"></a> <font color=Cyan>$</font> choice EightOf14 <font color=Cyan>$</font> choice NineOf14 <font color=Cyan>$</font> choice TenOf14+<a name="line-361"></a> <font color=Cyan>$</font> choice ElevenOf14 <font color=Cyan>$</font> choice TwelveOf14 <font color=Cyan>$</font> choice ThirteenOf14+<a name="line-362"></a> <font color=Cyan>$</font> choice FourteenOf14+<a name="line-363"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf14"</font><font color=Cyan>)</font>+<a name="line-364"></a> toContents <font color=Cyan>(</font>OneOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-365"></a> toContents <font color=Cyan>(</font>TwoOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-366"></a> toContents <font color=Cyan>(</font>ThreeOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-367"></a> toContents <font color=Cyan>(</font>FourOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-368"></a> toContents <font color=Cyan>(</font>FiveOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-369"></a> toContents <font color=Cyan>(</font>SixOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-370"></a> toContents <font color=Cyan>(</font>SevenOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-371"></a> toContents <font color=Cyan>(</font>EightOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-372"></a> toContents <font color=Cyan>(</font>NineOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-373"></a> toContents <font color=Cyan>(</font>TenOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-374"></a> toContents <font color=Cyan>(</font>ElevenOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-375"></a> toContents <font color=Cyan>(</font>TwelveOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-376"></a> toContents <font color=Cyan>(</font>ThirteenOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-377"></a> toContents <font color=Cyan>(</font>FourteenOf14 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-378"></a>+<a name="line-379"></a><a name="OneOf15"></a><font color=Blue>----</font>+<a name="line-380"></a><a name="OneOf15"></a><font color=Green><u>data</u></font> OneOf15 a b c d e f g h i j k l m n o+<a name="line-381"></a> <font color=Red>=</font> OneOf15 a <font color=Red>|</font> TwoOf15 b <font color=Red>|</font> ThreeOf15 c <font color=Red>|</font> FourOf15 d <font color=Red>|</font> FiveOf15 e+<a name="line-382"></a> <font color=Red>|</font> SixOf15 f <font color=Red>|</font> SevenOf15 g <font color=Red>|</font> EightOf15 h <font color=Red>|</font> NineOf15 i <font color=Red>|</font> TenOf15 j+<a name="line-383"></a> <font color=Red>|</font> ElevenOf15 k <font color=Red>|</font> TwelveOf15 l <font color=Red>|</font> ThirteenOf15 m <font color=Red>|</font> FourteenOf15 n+<a name="line-384"></a> <font color=Red>|</font> FifteenOf15 o+<a name="line-385"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-386"></a>+<a name="line-387"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e+<a name="line-388"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j+<a name="line-389"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>,</font>HTypeable l<font color=Cyan>,</font>HTypeable m<font color=Cyan>,</font>HTypeable n<font color=Cyan>,</font>HTypeable o<font color=Cyan>)</font>+<a name="line-390"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf15 a b c d e f g h i j k l m n o<font color=Cyan>)</font>+<a name="line-391"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf15"</font> [] []+<a name="line-392"></a>+<a name="line-393"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e+<a name="line-394"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j+<a name="line-395"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>,</font>XmlContent l<font color=Cyan>,</font>XmlContent m<font color=Cyan>,</font>XmlContent n<font color=Cyan>,</font>XmlContent o<font color=Cyan>)</font>+<a name="line-396"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf15 a b c d e f g h i j k l m n o<font color=Cyan>)</font>+<a name="line-397"></a> <font color=Green><u>where</u></font>+<a name="line-398"></a> parseContents <font color=Red>=</font>+<a name="line-399"></a> <font color=Cyan>(</font>choice OneOf15 <font color=Cyan>$</font> choice TwoOf15 <font color=Cyan>$</font> choice ThreeOf15 <font color=Cyan>$</font> choice FourOf15+<a name="line-400"></a> <font color=Cyan>$</font> choice FiveOf15 <font color=Cyan>$</font> choice SixOf15 <font color=Cyan>$</font> choice SevenOf15+<a name="line-401"></a> <font color=Cyan>$</font> choice EightOf15 <font color=Cyan>$</font> choice NineOf15 <font color=Cyan>$</font> choice TenOf15+<a name="line-402"></a> <font color=Cyan>$</font> choice ElevenOf15 <font color=Cyan>$</font> choice TwelveOf15 <font color=Cyan>$</font> choice ThirteenOf15+<a name="line-403"></a> <font color=Cyan>$</font> choice FourteenOf15 <font color=Cyan>$</font> choice FifteenOf15+<a name="line-404"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf15"</font><font color=Cyan>)</font>+<a name="line-405"></a> toContents <font color=Cyan>(</font>OneOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-406"></a> toContents <font color=Cyan>(</font>TwoOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-407"></a> toContents <font color=Cyan>(</font>ThreeOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-408"></a> toContents <font color=Cyan>(</font>FourOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-409"></a> toContents <font color=Cyan>(</font>FiveOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-410"></a> toContents <font color=Cyan>(</font>SixOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-411"></a> toContents <font color=Cyan>(</font>SevenOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-412"></a> toContents <font color=Cyan>(</font>EightOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-413"></a> toContents <font color=Cyan>(</font>NineOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-414"></a> toContents <font color=Cyan>(</font>TenOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-415"></a> toContents <font color=Cyan>(</font>ElevenOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-416"></a> toContents <font color=Cyan>(</font>TwelveOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-417"></a> toContents <font color=Cyan>(</font>ThirteenOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-418"></a> toContents <font color=Cyan>(</font>FourteenOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-419"></a> toContents <font color=Cyan>(</font>FifteenOf15 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-420"></a>+<a name="line-421"></a><a name="OneOf16"></a><font color=Blue>----</font>+<a name="line-422"></a><a name="OneOf16"></a><font color=Green><u>data</u></font> OneOf16 a b c d e f g h i j k l m n o p+<a name="line-423"></a> <font color=Red>=</font> OneOf16 a <font color=Red>|</font> TwoOf16 b <font color=Red>|</font> ThreeOf16 c <font color=Red>|</font> FourOf16 d <font color=Red>|</font> FiveOf16 e+<a name="line-424"></a> <font color=Red>|</font> SixOf16 f <font color=Red>|</font> SevenOf16 g <font color=Red>|</font> EightOf16 h <font color=Red>|</font> NineOf16 i <font color=Red>|</font> TenOf16 j+<a name="line-425"></a> <font color=Red>|</font> ElevenOf16 k <font color=Red>|</font> TwelveOf16 l <font color=Red>|</font> ThirteenOf16 m <font color=Red>|</font> FourteenOf16 n+<a name="line-426"></a> <font color=Red>|</font> FifteenOf16 o <font color=Red>|</font> SixteenOf16 p+<a name="line-427"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-428"></a>+<a name="line-429"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e+<a name="line-430"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j+<a name="line-431"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>,</font>HTypeable l<font color=Cyan>,</font>HTypeable m<font color=Cyan>,</font>HTypeable n<font color=Cyan>,</font>HTypeable o+<a name="line-432"></a> <font color=Cyan>,</font>HTypeable p<font color=Cyan>)</font>+<a name="line-433"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf16 a b c d e f g h i j k l m n o p<font color=Cyan>)</font>+<a name="line-434"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf16"</font> [] []+<a name="line-435"></a>+<a name="line-436"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e+<a name="line-437"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j+<a name="line-438"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>,</font>XmlContent l<font color=Cyan>,</font>XmlContent m<font color=Cyan>,</font>XmlContent n<font color=Cyan>,</font>XmlContent o+<a name="line-439"></a> <font color=Cyan>,</font>XmlContent p<font color=Cyan>)</font>+<a name="line-440"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf16 a b c d e f g h i j k l m n o p<font color=Cyan>)</font>+<a name="line-441"></a> <font color=Green><u>where</u></font>+<a name="line-442"></a> parseContents <font color=Red>=</font>+<a name="line-443"></a> <font color=Cyan>(</font>choice OneOf16 <font color=Cyan>$</font> choice TwoOf16 <font color=Cyan>$</font> choice ThreeOf16 <font color=Cyan>$</font> choice FourOf16+<a name="line-444"></a> <font color=Cyan>$</font> choice FiveOf16 <font color=Cyan>$</font> choice SixOf16 <font color=Cyan>$</font> choice SevenOf16+<a name="line-445"></a> <font color=Cyan>$</font> choice EightOf16 <font color=Cyan>$</font> choice NineOf16 <font color=Cyan>$</font> choice TenOf16+<a name="line-446"></a> <font color=Cyan>$</font> choice ElevenOf16 <font color=Cyan>$</font> choice TwelveOf16 <font color=Cyan>$</font> choice ThirteenOf16+<a name="line-447"></a> <font color=Cyan>$</font> choice FourteenOf16 <font color=Cyan>$</font> choice FifteenOf16 <font color=Cyan>$</font> choice SixteenOf16+<a name="line-448"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf16"</font><font color=Cyan>)</font>+<a name="line-449"></a> toContents <font color=Cyan>(</font>OneOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-450"></a> toContents <font color=Cyan>(</font>TwoOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-451"></a> toContents <font color=Cyan>(</font>ThreeOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-452"></a> toContents <font color=Cyan>(</font>FourOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-453"></a> toContents <font color=Cyan>(</font>FiveOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-454"></a> toContents <font color=Cyan>(</font>SixOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-455"></a> toContents <font color=Cyan>(</font>SevenOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-456"></a> toContents <font color=Cyan>(</font>EightOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-457"></a> toContents <font color=Cyan>(</font>NineOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-458"></a> toContents <font color=Cyan>(</font>TenOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-459"></a> toContents <font color=Cyan>(</font>ElevenOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-460"></a> toContents <font color=Cyan>(</font>TwelveOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-461"></a> toContents <font color=Cyan>(</font>ThirteenOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-462"></a> toContents <font color=Cyan>(</font>FourteenOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-463"></a> toContents <font color=Cyan>(</font>FifteenOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-464"></a> toContents <font color=Cyan>(</font>SixteenOf16 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-465"></a>+<a name="line-466"></a><a name="OneOf17"></a><font color=Blue>----</font>+<a name="line-467"></a><a name="OneOf17"></a><font color=Green><u>data</u></font> OneOf17 a b c d e f g h i j k l m n o p q+<a name="line-468"></a> <font color=Red>=</font> OneOf17 a <font color=Red>|</font> TwoOf17 b <font color=Red>|</font> ThreeOf17 c <font color=Red>|</font> FourOf17 d <font color=Red>|</font> FiveOf17 e+<a name="line-469"></a> <font color=Red>|</font> SixOf17 f <font color=Red>|</font> SevenOf17 g <font color=Red>|</font> EightOf17 h <font color=Red>|</font> NineOf17 i <font color=Red>|</font> TenOf17 j+<a name="line-470"></a> <font color=Red>|</font> ElevenOf17 k <font color=Red>|</font> TwelveOf17 l <font color=Red>|</font> ThirteenOf17 m <font color=Red>|</font> FourteenOf17 n+<a name="line-471"></a> <font color=Red>|</font> FifteenOf17 o <font color=Red>|</font> SixteenOf17 p <font color=Red>|</font> SeventeenOf17 q+<a name="line-472"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-473"></a>+<a name="line-474"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e+<a name="line-475"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j+<a name="line-476"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>,</font>HTypeable l<font color=Cyan>,</font>HTypeable m<font color=Cyan>,</font>HTypeable n<font color=Cyan>,</font>HTypeable o+<a name="line-477"></a> <font color=Cyan>,</font>HTypeable p<font color=Cyan>,</font>HTypeable q<font color=Cyan>)</font>+<a name="line-478"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf17 a b c d e f g h i j k l m n o p q<font color=Cyan>)</font>+<a name="line-479"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf17"</font> [] []+<a name="line-480"></a>+<a name="line-481"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e+<a name="line-482"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j+<a name="line-483"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>,</font>XmlContent l<font color=Cyan>,</font>XmlContent m<font color=Cyan>,</font>XmlContent n<font color=Cyan>,</font>XmlContent o+<a name="line-484"></a> <font color=Cyan>,</font>XmlContent p<font color=Cyan>,</font>XmlContent q<font color=Cyan>)</font>+<a name="line-485"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf17 a b c d e f g h i j k l m n o p q<font color=Cyan>)</font>+<a name="line-486"></a> <font color=Green><u>where</u></font>+<a name="line-487"></a> parseContents <font color=Red>=</font>+<a name="line-488"></a> <font color=Cyan>(</font>choice OneOf17 <font color=Cyan>$</font> choice TwoOf17 <font color=Cyan>$</font> choice ThreeOf17 <font color=Cyan>$</font> choice FourOf17+<a name="line-489"></a> <font color=Cyan>$</font> choice FiveOf17 <font color=Cyan>$</font> choice SixOf17 <font color=Cyan>$</font> choice SevenOf17+<a name="line-490"></a> <font color=Cyan>$</font> choice EightOf17 <font color=Cyan>$</font> choice NineOf17 <font color=Cyan>$</font> choice TenOf17+<a name="line-491"></a> <font color=Cyan>$</font> choice ElevenOf17 <font color=Cyan>$</font> choice TwelveOf17 <font color=Cyan>$</font> choice ThirteenOf17+<a name="line-492"></a> <font color=Cyan>$</font> choice FourteenOf17 <font color=Cyan>$</font> choice FifteenOf17 <font color=Cyan>$</font> choice SixteenOf17+<a name="line-493"></a> <font color=Cyan>$</font> choice SeventeenOf17+<a name="line-494"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf17"</font><font color=Cyan>)</font>+<a name="line-495"></a> toContents <font color=Cyan>(</font>OneOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-496"></a> toContents <font color=Cyan>(</font>TwoOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-497"></a> toContents <font color=Cyan>(</font>ThreeOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-498"></a> toContents <font color=Cyan>(</font>FourOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-499"></a> toContents <font color=Cyan>(</font>FiveOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-500"></a> toContents <font color=Cyan>(</font>SixOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-501"></a> toContents <font color=Cyan>(</font>SevenOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-502"></a> toContents <font color=Cyan>(</font>EightOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-503"></a> toContents <font color=Cyan>(</font>NineOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-504"></a> toContents <font color=Cyan>(</font>TenOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-505"></a> toContents <font color=Cyan>(</font>ElevenOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-506"></a> toContents <font color=Cyan>(</font>TwelveOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-507"></a> toContents <font color=Cyan>(</font>ThirteenOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-508"></a> toContents <font color=Cyan>(</font>FourteenOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-509"></a> toContents <font color=Cyan>(</font>FifteenOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-510"></a> toContents <font color=Cyan>(</font>SixteenOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-511"></a> toContents <font color=Cyan>(</font>SeventeenOf17 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-512"></a>+<a name="line-513"></a><a name="OneOf18"></a><font color=Blue>----</font>+<a name="line-514"></a><a name="OneOf18"></a><font color=Green><u>data</u></font> OneOf18 a b c d e f g h i j k l m n o p q r+<a name="line-515"></a> <font color=Red>=</font> OneOf18 a <font color=Red>|</font> TwoOf18 b <font color=Red>|</font> ThreeOf18 c <font color=Red>|</font> FourOf18 d <font color=Red>|</font> FiveOf18 e+<a name="line-516"></a> <font color=Red>|</font> SixOf18 f <font color=Red>|</font> SevenOf18 g <font color=Red>|</font> EightOf18 h <font color=Red>|</font> NineOf18 i <font color=Red>|</font> TenOf18 j+<a name="line-517"></a> <font color=Red>|</font> ElevenOf18 k <font color=Red>|</font> TwelveOf18 l <font color=Red>|</font> ThirteenOf18 m <font color=Red>|</font> FourteenOf18 n+<a name="line-518"></a> <font color=Red>|</font> FifteenOf18 o <font color=Red>|</font> SixteenOf18 p <font color=Red>|</font> SeventeenOf18 q <font color=Red>|</font> EighteenOf18 r+<a name="line-519"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-520"></a>+<a name="line-521"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e+<a name="line-522"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j+<a name="line-523"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>,</font>HTypeable l<font color=Cyan>,</font>HTypeable m<font color=Cyan>,</font>HTypeable n<font color=Cyan>,</font>HTypeable o+<a name="line-524"></a> <font color=Cyan>,</font>HTypeable p<font color=Cyan>,</font>HTypeable q<font color=Cyan>,</font>HTypeable r<font color=Cyan>)</font>+<a name="line-525"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf18 a b c d e f g h i j k l m n o p q r<font color=Cyan>)</font>+<a name="line-526"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf18"</font> [] []+<a name="line-527"></a>+<a name="line-528"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e+<a name="line-529"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j+<a name="line-530"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>,</font>XmlContent l<font color=Cyan>,</font>XmlContent m<font color=Cyan>,</font>XmlContent n<font color=Cyan>,</font>XmlContent o+<a name="line-531"></a> <font color=Cyan>,</font>XmlContent p<font color=Cyan>,</font>XmlContent q<font color=Cyan>,</font>XmlContent r<font color=Cyan>)</font>+<a name="line-532"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf18 a b c d e f g h i j k l m n o p q r<font color=Cyan>)</font>+<a name="line-533"></a> <font color=Green><u>where</u></font>+<a name="line-534"></a> parseContents <font color=Red>=</font>+<a name="line-535"></a> <font color=Cyan>(</font>choice OneOf18 <font color=Cyan>$</font> choice TwoOf18 <font color=Cyan>$</font> choice ThreeOf18 <font color=Cyan>$</font> choice FourOf18+<a name="line-536"></a> <font color=Cyan>$</font> choice FiveOf18 <font color=Cyan>$</font> choice SixOf18 <font color=Cyan>$</font> choice SevenOf18+<a name="line-537"></a> <font color=Cyan>$</font> choice EightOf18 <font color=Cyan>$</font> choice NineOf18 <font color=Cyan>$</font> choice TenOf18+<a name="line-538"></a> <font color=Cyan>$</font> choice ElevenOf18 <font color=Cyan>$</font> choice TwelveOf18 <font color=Cyan>$</font> choice ThirteenOf18+<a name="line-539"></a> <font color=Cyan>$</font> choice FourteenOf18 <font color=Cyan>$</font> choice FifteenOf18 <font color=Cyan>$</font> choice SixteenOf18+<a name="line-540"></a> <font color=Cyan>$</font> choice SeventeenOf18 <font color=Cyan>$</font> choice EighteenOf18+<a name="line-541"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf18"</font><font color=Cyan>)</font>+<a name="line-542"></a> toContents <font color=Cyan>(</font>OneOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-543"></a> toContents <font color=Cyan>(</font>TwoOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-544"></a> toContents <font color=Cyan>(</font>ThreeOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-545"></a> toContents <font color=Cyan>(</font>FourOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-546"></a> toContents <font color=Cyan>(</font>FiveOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-547"></a> toContents <font color=Cyan>(</font>SixOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-548"></a> toContents <font color=Cyan>(</font>SevenOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-549"></a> toContents <font color=Cyan>(</font>EightOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-550"></a> toContents <font color=Cyan>(</font>NineOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-551"></a> toContents <font color=Cyan>(</font>TenOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-552"></a> toContents <font color=Cyan>(</font>ElevenOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-553"></a> toContents <font color=Cyan>(</font>TwelveOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-554"></a> toContents <font color=Cyan>(</font>ThirteenOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-555"></a> toContents <font color=Cyan>(</font>FourteenOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-556"></a> toContents <font color=Cyan>(</font>FifteenOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-557"></a> toContents <font color=Cyan>(</font>SixteenOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-558"></a> toContents <font color=Cyan>(</font>SeventeenOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-559"></a> toContents <font color=Cyan>(</font>EighteenOf18 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-560"></a>+<a name="line-561"></a><a name="OneOf19"></a><font color=Blue>----</font>+<a name="line-562"></a><a name="OneOf19"></a><font color=Green><u>data</u></font> OneOf19 a b c d e f g h i j k l m n o p q r s+<a name="line-563"></a> <font color=Red>=</font> OneOf19 a <font color=Red>|</font> TwoOf19 b <font color=Red>|</font> ThreeOf19 c <font color=Red>|</font> FourOf19 d <font color=Red>|</font> FiveOf19 e+<a name="line-564"></a> <font color=Red>|</font> SixOf19 f <font color=Red>|</font> SevenOf19 g <font color=Red>|</font> EightOf19 h <font color=Red>|</font> NineOf19 i <font color=Red>|</font> TenOf19 j+<a name="line-565"></a> <font color=Red>|</font> ElevenOf19 k <font color=Red>|</font> TwelveOf19 l <font color=Red>|</font> ThirteenOf19 m <font color=Red>|</font> FourteenOf19 n+<a name="line-566"></a> <font color=Red>|</font> FifteenOf19 o <font color=Red>|</font> SixteenOf19 p <font color=Red>|</font> SeventeenOf19 q <font color=Red>|</font> EighteenOf19 r+<a name="line-567"></a> <font color=Red>|</font> NineteenOf19 s+<a name="line-568"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-569"></a>+<a name="line-570"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e+<a name="line-571"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j+<a name="line-572"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>,</font>HTypeable l<font color=Cyan>,</font>HTypeable m<font color=Cyan>,</font>HTypeable n<font color=Cyan>,</font>HTypeable o+<a name="line-573"></a> <font color=Cyan>,</font>HTypeable p<font color=Cyan>,</font>HTypeable q<font color=Cyan>,</font>HTypeable r<font color=Cyan>,</font>HTypeable s<font color=Cyan>)</font>+<a name="line-574"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf19 a b c d e f g h i j k l m n o p q r s<font color=Cyan>)</font>+<a name="line-575"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf19"</font> [] []+<a name="line-576"></a>+<a name="line-577"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e+<a name="line-578"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j+<a name="line-579"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>,</font>XmlContent l<font color=Cyan>,</font>XmlContent m<font color=Cyan>,</font>XmlContent n<font color=Cyan>,</font>XmlContent o+<a name="line-580"></a> <font color=Cyan>,</font>XmlContent p<font color=Cyan>,</font>XmlContent q<font color=Cyan>,</font>XmlContent r<font color=Cyan>,</font>XmlContent s<font color=Cyan>)</font>+<a name="line-581"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf19 a b c d e f g h i j k l m n o p q r s<font color=Cyan>)</font>+<a name="line-582"></a> <font color=Green><u>where</u></font>+<a name="line-583"></a> parseContents <font color=Red>=</font>+<a name="line-584"></a> <font color=Cyan>(</font>choice OneOf19 <font color=Cyan>$</font> choice TwoOf19 <font color=Cyan>$</font> choice ThreeOf19 <font color=Cyan>$</font> choice FourOf19+<a name="line-585"></a> <font color=Cyan>$</font> choice FiveOf19 <font color=Cyan>$</font> choice SixOf19 <font color=Cyan>$</font> choice SevenOf19+<a name="line-586"></a> <font color=Cyan>$</font> choice EightOf19 <font color=Cyan>$</font> choice NineOf19 <font color=Cyan>$</font> choice TenOf19+<a name="line-587"></a> <font color=Cyan>$</font> choice ElevenOf19 <font color=Cyan>$</font> choice TwelveOf19 <font color=Cyan>$</font> choice ThirteenOf19+<a name="line-588"></a> <font color=Cyan>$</font> choice FourteenOf19 <font color=Cyan>$</font> choice FifteenOf19 <font color=Cyan>$</font> choice SixteenOf19+<a name="line-589"></a> <font color=Cyan>$</font> choice SeventeenOf19 <font color=Cyan>$</font> choice EighteenOf19 <font color=Cyan>$</font> choice NineteenOf19+<a name="line-590"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf19"</font><font color=Cyan>)</font>+<a name="line-591"></a> toContents <font color=Cyan>(</font>OneOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-592"></a> toContents <font color=Cyan>(</font>TwoOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-593"></a> toContents <font color=Cyan>(</font>ThreeOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-594"></a> toContents <font color=Cyan>(</font>FourOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-595"></a> toContents <font color=Cyan>(</font>FiveOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-596"></a> toContents <font color=Cyan>(</font>SixOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-597"></a> toContents <font color=Cyan>(</font>SevenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-598"></a> toContents <font color=Cyan>(</font>EightOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-599"></a> toContents <font color=Cyan>(</font>NineOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-600"></a> toContents <font color=Cyan>(</font>TenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-601"></a> toContents <font color=Cyan>(</font>ElevenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-602"></a> toContents <font color=Cyan>(</font>TwelveOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-603"></a> toContents <font color=Cyan>(</font>ThirteenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-604"></a> toContents <font color=Cyan>(</font>FourteenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-605"></a> toContents <font color=Cyan>(</font>FifteenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-606"></a> toContents <font color=Cyan>(</font>SixteenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-607"></a> toContents <font color=Cyan>(</font>SeventeenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-608"></a> toContents <font color=Cyan>(</font>EighteenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-609"></a> toContents <font color=Cyan>(</font>NineteenOf19 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-610"></a>+<a name="line-611"></a><a name="OneOf20"></a><font color=Blue>----</font>+<a name="line-612"></a><a name="OneOf20"></a><font color=Green><u>data</u></font> OneOf20 a b c d e f g h i j k l m n o p q r s t+<a name="line-613"></a> <font color=Red>=</font> OneOf20 a <font color=Red>|</font> TwoOf20 b <font color=Red>|</font> ThreeOf20 c <font color=Red>|</font> FourOf20 d <font color=Red>|</font> FiveOf20 e+<a name="line-614"></a> <font color=Red>|</font> SixOf20 f <font color=Red>|</font> SevenOf20 g <font color=Red>|</font> EightOf20 h <font color=Red>|</font> NineOf20 i <font color=Red>|</font> TenOf20 j+<a name="line-615"></a> <font color=Red>|</font> ElevenOf20 k <font color=Red>|</font> TwelveOf20 l <font color=Red>|</font> ThirteenOf20 m <font color=Red>|</font> FourteenOf20 n+<a name="line-616"></a> <font color=Red>|</font> FifteenOf20 o <font color=Red>|</font> SixteenOf20 p <font color=Red>|</font> SeventeenOf20 q <font color=Red>|</font> EighteenOf20 r+<a name="line-617"></a> <font color=Red>|</font> NineteenOf20 s <font color=Red>|</font> TwentyOf20 t+<a name="line-618"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-619"></a>+<a name="line-620"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font>HTypeable b<font color=Cyan>,</font>HTypeable c<font color=Cyan>,</font>HTypeable d<font color=Cyan>,</font>HTypeable e+<a name="line-621"></a> <font color=Cyan>,</font>HTypeable f<font color=Cyan>,</font>HTypeable g<font color=Cyan>,</font>HTypeable h<font color=Cyan>,</font>HTypeable i<font color=Cyan>,</font>HTypeable j+<a name="line-622"></a> <font color=Cyan>,</font>HTypeable k<font color=Cyan>,</font>HTypeable l<font color=Cyan>,</font>HTypeable m<font color=Cyan>,</font>HTypeable n<font color=Cyan>,</font>HTypeable o+<a name="line-623"></a> <font color=Cyan>,</font>HTypeable p<font color=Cyan>,</font>HTypeable q<font color=Cyan>,</font>HTypeable r<font color=Cyan>,</font>HTypeable s<font color=Cyan>,</font>HTypeable t<font color=Cyan>)</font>+<a name="line-624"></a> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>OneOf20 a b c d e f g h i j k l m n o p q r s t<font color=Cyan>)</font>+<a name="line-625"></a> <font color=Green><u>where</u></font> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Defined <font color=Magenta>"OneOf20"</font> [] []+<a name="line-626"></a>+<a name="line-627"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font>XmlContent b<font color=Cyan>,</font>XmlContent c<font color=Cyan>,</font>XmlContent d<font color=Cyan>,</font>XmlContent e+<a name="line-628"></a> <font color=Cyan>,</font>XmlContent f<font color=Cyan>,</font>XmlContent g<font color=Cyan>,</font>XmlContent h<font color=Cyan>,</font>XmlContent i<font color=Cyan>,</font>XmlContent j+<a name="line-629"></a> <font color=Cyan>,</font>XmlContent k<font color=Cyan>,</font>XmlContent l<font color=Cyan>,</font>XmlContent m<font color=Cyan>,</font>XmlContent n<font color=Cyan>,</font>XmlContent o+<a name="line-630"></a> <font color=Cyan>,</font>XmlContent p<font color=Cyan>,</font>XmlContent q<font color=Cyan>,</font>XmlContent r<font color=Cyan>,</font>XmlContent s<font color=Cyan>,</font>XmlContent t<font color=Cyan>)</font>+<a name="line-631"></a> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>OneOf20 a b c d e f g h i j k l m n o p q r s t<font color=Cyan>)</font>+<a name="line-632"></a> <font color=Green><u>where</u></font>+<a name="line-633"></a> parseContents <font color=Red>=</font>+<a name="line-634"></a> <font color=Cyan>(</font>choice OneOf20 <font color=Cyan>$</font> choice TwoOf20 <font color=Cyan>$</font> choice ThreeOf20 <font color=Cyan>$</font> choice FourOf20+<a name="line-635"></a> <font color=Cyan>$</font> choice FiveOf20 <font color=Cyan>$</font> choice SixOf20 <font color=Cyan>$</font> choice SevenOf20+<a name="line-636"></a> <font color=Cyan>$</font> choice EightOf20 <font color=Cyan>$</font> choice NineOf20 <font color=Cyan>$</font> choice TenOf20+<a name="line-637"></a> <font color=Cyan>$</font> choice ElevenOf20 <font color=Cyan>$</font> choice TwelveOf20 <font color=Cyan>$</font> choice ThirteenOf20+<a name="line-638"></a> <font color=Cyan>$</font> choice FourteenOf20 <font color=Cyan>$</font> choice FifteenOf20 <font color=Cyan>$</font> choice SixteenOf20+<a name="line-639"></a> <font color=Cyan>$</font> choice SeventeenOf20 <font color=Cyan>$</font> choice EighteenOf20 <font color=Cyan>$</font> choice NineteenOf20+<a name="line-640"></a> <font color=Cyan>$</font> choice TwentyOf20+<a name="line-641"></a> <font color=Cyan>$</font> fail <font color=Magenta>"OneOf20"</font><font color=Cyan>)</font>+<a name="line-642"></a> toContents <font color=Cyan>(</font>OneOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-643"></a> toContents <font color=Cyan>(</font>TwoOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-644"></a> toContents <font color=Cyan>(</font>ThreeOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-645"></a> toContents <font color=Cyan>(</font>FourOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-646"></a> toContents <font color=Cyan>(</font>FiveOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-647"></a> toContents <font color=Cyan>(</font>SixOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-648"></a> toContents <font color=Cyan>(</font>SevenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-649"></a> toContents <font color=Cyan>(</font>EightOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-650"></a> toContents <font color=Cyan>(</font>NineOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-651"></a> toContents <font color=Cyan>(</font>TenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-652"></a> toContents <font color=Cyan>(</font>ElevenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-653"></a> toContents <font color=Cyan>(</font>TwelveOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-654"></a> toContents <font color=Cyan>(</font>ThirteenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-655"></a> toContents <font color=Cyan>(</font>FourteenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-656"></a> toContents <font color=Cyan>(</font>FifteenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-657"></a> toContents <font color=Cyan>(</font>SixteenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-658"></a> toContents <font color=Cyan>(</font>SeventeenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-659"></a> toContents <font color=Cyan>(</font>EighteenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-660"></a> toContents <font color=Cyan>(</font>NineteenOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-661"></a> toContents <font color=Cyan>(</font>TwentyOf20 x<font color=Cyan>)</font> <font color=Red>=</font> toContents x+<a name="line-662"></a>+<a name="line-663"></a><font color=Blue>----</font>+</pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/Parse.html view
@@ -1,887 +1,896 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>{-# OPTIONS -cpp #-}</font>-<a name="(line2)"></a><font color=Blue>-- | A non-validating XML parser. For the input grammar, see</font>-<a name="(line3)"></a><font color=Blue>-- <<a href="http://www.w3.org/TR/REC-xml">http://www.w3.org/TR/REC-xml</a>>.</font>-<a name="(line4)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Parse-<a name="(line5)"></a> <font color=Cyan>(</font>-<a name="(line6)"></a> <font color=Blue>-- * Parse a whole document</font>-<a name="(line7)"></a> xmlParse<font color=Cyan>,</font> xmlParse'-<a name="(line8)"></a> <font color=Blue>-- * Parse just a DTD</font>-<a name="(line9)"></a> <font color=Cyan>,</font> dtdParse<font color=Cyan>,</font> dtdParse'-<a name="(line10)"></a> <font color=Blue>-- * Parse a partial document</font>-<a name="(line11)"></a> <font color=Cyan>,</font> xmlParseWith-<a name="(line12)"></a> <font color=Blue>-- * Individual parsers for use with /xmlParseWith/ and module SAX</font>-<a name="(line13)"></a> <font color=Cyan>,</font> document<font color=Cyan>,</font> element<font color=Cyan>,</font> content-<a name="(line14)"></a> <font color=Cyan>,</font> comment<font color=Cyan>,</font> cdsect<font color=Cyan>,</font> chardata-<a name="(line15)"></a> <font color=Cyan>,</font> reference<font color=Cyan>,</font> doctypedecl-<a name="(line16)"></a> <font color=Cyan>,</font> processinginstruction-<a name="(line17)"></a> <font color=Cyan>,</font> elemtag<font color=Cyan>,</font> name<font color=Cyan>,</font> tok-<a name="(line18)"></a> <font color=Cyan>,</font> elemOpenTag<font color=Cyan>,</font> elemCloseTag-<a name="(line19)"></a> <font color=Cyan>,</font> emptySTs<font color=Cyan>,</font> XParser-<a name="(line20)"></a> <font color=Blue>-- * These general utility functions don't belong here</font>-<a name="(line21)"></a> <font color=Cyan>,</font> fst3<font color=Cyan>,</font> snd3<font color=Cyan>,</font> thd3-<a name="(line22)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line23)"></a>-<a name="(line24)"></a><font color=Blue>-- An XML parser, written using a slightly extended version of the</font>-<a name="(line25)"></a><font color=Blue>-- Hutton/Meijer parser combinators. The input is tokenised internally</font>-<a name="(line26)"></a><font color=Blue>-- by the lexer xmlLex. Whilst parsing, we gather a symbol</font>-<a name="(line27)"></a><font color=Blue>-- table of entity references. PERefs must be defined before use, so we</font>-<a name="(line28)"></a><font color=Blue>-- expand their uses as we encounter them, forcing the remainder of the</font>-<a name="(line29)"></a><font color=Blue>-- input to be re-lexed and re-parsed. GERefs are simply stored for</font>-<a name="(line30)"></a><font color=Blue>-- later retrieval.</font>-<a name="(line31)"></a>-<a name="(line32)"></a><font color=Green><u>import</u></font> Prelude hiding <font color=Cyan>(</font>either<font color=Cyan>,</font>maybe<font color=Cyan>,</font>sequence<font color=Cyan>)</font>-<a name="(line33)"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Prelude <font color=Cyan>(</font>either<font color=Cyan>)</font>-<a name="(line34)"></a><font color=Green><u>import</u></font> Maybe hiding <font color=Cyan>(</font>maybe<font color=Cyan>)</font>-<a name="(line35)"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>intersperse<font color=Cyan>)</font> <font color=Blue>-- debugging only</font>-<a name="(line36)"></a><font color=Green><u>import</u></font> Char <font color=Cyan>(</font>isSpace<font color=Cyan>,</font>isDigit<font color=Cyan>,</font>isHexDigit<font color=Cyan>)</font>-<a name="(line37)"></a><font color=Green><u>import</u></font> Monad hiding <font color=Cyan>(</font>sequence<font color=Cyan>)</font>-<a name="(line38)"></a><font color=Green><u>import</u></font> Numeric <font color=Cyan>(</font>readDec<font color=Cyan>,</font>readHex<font color=Cyan>)</font>-<a name="(line39)"></a>-<a name="(line40)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line41)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Posn-<a name="(line42)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Lex-<a name="(line43)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>Poly<font color=Cyan>.</font>NoLeak<font color=Cyan>.</font>State-<a name="(line44)"></a>-<a name="(line45)"></a>-<a name="(line46)"></a><font color=Magenta><em>#if ( defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 502 ) || \</em></font>-<a name="(line47)"></a> <font color=Cyan>(</font> defined<font color=Cyan>(</font><b><font color=Magenta>__NHC__</font></b><font color=Cyan>)</font> <font color=Cyan>&&</font> <b><font color=Magenta>__NHC__</font></b> <font color=Cyan>></font> <font color=Magenta>114</font> <font color=Cyan>)</font> <font color=Cyan>||</font> defined<font color=Cyan>(</font><b><font color=Magenta>__HUGS__</font></b><font color=Cyan>)</font>-<a name="(line48)"></a><font color=Green><u>import</u></font> System<font color=Cyan>.</font>IO<font color=Cyan>.</font>Unsafe <font color=Cyan>(</font>unsafePerformIO<font color=Cyan>)</font>-<a name="(line49)"></a><font color=Magenta><em>#elif defined(__GLASGOW_HASKELL__)</em></font>-<a name="(line50)"></a><font color=Green><u>import</u></font> IOExts <font color=Cyan>(</font>unsafePerformIO<font color=Cyan>)</font>-<a name="(line51)"></a><font color=Magenta><em>#elif defined(__NHC__)</em></font>-<a name="(line52)"></a><font color=Green><u>import</u></font> IOExtras <font color=Cyan>(</font>unsafePerformIO<font color=Cyan>)</font>-<a name="(line53)"></a><font color=Magenta><em>#elif defined(__HBC__)</em></font>-<a name="(line54)"></a><font color=Green><u>import</u></font> UnsafePerformIO-<a name="(line55)"></a><font color=Magenta><em>#endif</em></font>-<a name="(line56)"></a>-<a name="(line57)"></a><font color=Blue>-- #define DEBUG</font>-<a name="(line58)"></a>-<a name="(line59)"></a><font color=Magenta><em>#if defined(DEBUG)</em></font>-<a name="(line60)"></a><font color=Magenta><em># if ( defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 502 ) || \</em></font>-<a name="(line61)"></a> <font color=Cyan>(</font> defined<font color=Cyan>(</font><b><font color=Magenta>__NHC__</font></b><font color=Cyan>)</font> <font color=Cyan>&&</font> <b><font color=Magenta>__NHC__</font></b> <font color=Cyan>></font> <font color=Magenta>114</font> <font color=Cyan>)</font> <font color=Cyan>||</font> defined<font color=Cyan>(</font><b><font color=Magenta>__HUGS__</font></b><font color=Cyan>)</font>-<a name="(line62)"></a><font color=Green><u>import</u></font> Debug<font color=Cyan>.</font>Trace<font color=Cyan>(</font>trace<font color=Cyan>)</font>-<a name="(line63)"></a><font color=Magenta><em># elif defined(__GLASGOW_HASKELL__)</em></font>-<a name="(line64)"></a><font color=Green><u>import</u></font> IOExts<font color=Cyan>(</font>trace<font color=Cyan>)</font>-<a name="(line65)"></a><font color=Magenta><em># elif defined(__NHC__) || defined(__HBC__)</em></font>-<a name="(line66)"></a><font color=Green><u>import</u></font> NonStdTrace-<a name="(line67)"></a><font color=Magenta><em># endif</em></font>-<a name="(line68)"></a><a name="debug"></a>debug <font color=Red>::</font> a <font color=Red>-></font> String <font color=Red>-></font> a-<a name="(line69)"></a><a name="debug"></a>v <font color=Cyan>`debug`</font> s <font color=Red>=</font> trace s v-<a name="(line70)"></a><font color=Magenta><em>#else</em></font>-<a name="(line71)"></a><a name="debug"></a>v <font color=Cyan>`debug`</font> s <font color=Red>=</font> v-<a name="(line72)"></a><font color=Magenta><em>#endif</em></font>-<a name="(line73)"></a>-<a name="(line74)"></a>-<a name="(line75)"></a><a name="xmlParse"></a><font color=Blue>-- | To parse a whole document, @xmlParse file content@ takes a filename</font>-<a name="(line76)"></a><font color=Blue>-- (for generating error reports) and the string content of that file.</font>-<a name="(line77)"></a><font color=Blue>-- A parse error causes program failure, with message to stderr.</font>-<a name="(line78)"></a>xmlParse <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Document Posn-<a name="(line79)"></a>-<a name="(line80)"></a><a name="xmlParse'"></a><font color=Blue>-- | To parse a whole document, @xmlParse' file content@ takes a filename</font>-<a name="(line81)"></a><font color=Blue>-- (for generating error reports) and the string content of that file.</font>-<a name="(line82)"></a><font color=Blue>-- Any parse error message is passed back to the caller through the</font>-<a name="(line83)"></a><font color=Blue>-- @Either@ type.</font>-<a name="(line84)"></a>xmlParse' <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Either String <font color=Cyan>(</font>Document Posn<font color=Cyan>)</font>-<a name="(line85)"></a>-<a name="(line86)"></a><a name="dtdParse"></a><font color=Blue>-- | To parse just a DTD, @dtdParse file content@ takes a filename</font>-<a name="(line87)"></a><font color=Blue>-- (for generating error reports) and the string content of that</font>-<a name="(line88)"></a><font color=Blue>-- file. If no DTD was found, you get @Nothing@ rather than an error.</font>-<a name="(line89)"></a><font color=Blue>-- However, if a DTD is found but contains errors, the program crashes.</font>-<a name="(line90)"></a>dtdParse <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Maybe DocTypeDecl-<a name="(line91)"></a>-<a name="(line92)"></a><a name="dtdParse'"></a><font color=Blue>-- | To parse just a DTD, @dtdParse' file content@ takes a filename</font>-<a name="(line93)"></a><font color=Blue>-- (for generating error reports) and the string content of that</font>-<a name="(line94)"></a><font color=Blue>-- file. If no DTD was found, you get @Right Nothing@.</font>-<a name="(line95)"></a><font color=Blue>-- If a DTD was found but contains errors, you get a @Left message@.</font>-<a name="(line96)"></a>dtdParse' <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Either String <font color=Cyan>(</font>Maybe DocTypeDecl<font color=Cyan>)</font>-<a name="(line97)"></a>-<a name="(line98)"></a>xmlParse name <font color=Red>=</font> Prelude<font color=Cyan>.</font>either error id <font color=Cyan>.</font> xmlParse' name-<a name="(line99)"></a>dtdParse name <font color=Red>=</font> Prelude<font color=Cyan>.</font>either error id <font color=Cyan>.</font> dtdParse' name-<a name="(line100)"></a>-<a name="(line101)"></a>xmlParse' name <font color=Red>=</font> fst3 <font color=Cyan>.</font> runParser <font color=Cyan>(</font>toEOF document<font color=Cyan>)</font> emptySTs <font color=Cyan>.</font> xmlLex name-<a name="(line102)"></a>dtdParse' name <font color=Red>=</font> fst3 <font color=Cyan>.</font> runParser justDTD emptySTs <font color=Cyan>.</font> xmlLex name-<a name="(line103)"></a>-<a name="(line104)"></a><a name="toEOF"></a>toEOF <font color=Red>=</font> id <font color=Blue>-- there are other possible implementations...</font>-<a name="(line105)"></a>-<a name="(line106)"></a><a name="xmlParseWith"></a><font color=Blue>-- | To parse a partial document, e.g. from an XML-based stream protocol,</font>-<a name="(line107)"></a><font color=Blue>-- where you may later want to get more document elements from the same</font>-<a name="(line108)"></a><font color=Blue>-- stream. Arguments are: a parser for the item you want, and the</font>-<a name="(line109)"></a><font color=Blue>-- already-lexed input to parse from. Returns the item you wanted</font>-<a name="(line110)"></a><font color=Blue>-- (or an error message), plus the remainder of the input.</font>-<a name="(line111)"></a>xmlParseWith <font color=Red>::</font> XParser a <font color=Red>-></font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>TokenT<font color=Cyan>)</font><font color=Red>]</font>-<a name="(line112)"></a> <font color=Red>-></font> <font color=Cyan>(</font>Either String a<font color=Cyan>,</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>TokenT<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line113)"></a>xmlParseWith p <font color=Red>=</font> <font color=Cyan>(</font><font color=Red>\</font><font color=Cyan>(</font>v<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font>s<font color=Cyan>)</font><font color=Red>-></font><font color=Cyan>(</font>v<font color=Cyan>,</font>s<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>.</font> runParser p emptySTs-<a name="(line114)"></a>-<a name="(line115)"></a>-<a name="(line116)"></a><font color=Blue>---- Symbol table stuff ----</font>-<a name="(line117)"></a>-<a name="(line118)"></a><a name="SymTabs"></a><font color=Green><u>type</u></font> SymTabs <font color=Red>=</font> <font color=Cyan>(</font>SymTab PEDef<font color=Cyan>,</font> SymTab EntityDef<font color=Cyan>)</font>-<a name="(line119)"></a>-<a name="(line120)"></a><a name="emptySTs"></a><font color=Blue>-- | Some empty symbol tables for GE and PE references.</font>-<a name="(line121)"></a>emptySTs <font color=Red>::</font> SymTabs-<a name="(line122)"></a>emptySTs <font color=Red>=</font> <font color=Cyan>(</font>emptyST<font color=Cyan>,</font> emptyST<font color=Cyan>)</font>-<a name="(line123)"></a>-<a name="(line124)"></a><a name="addPE"></a>addPE <font color=Red>::</font> String <font color=Red>-></font> PEDef <font color=Red>-></font> SymTabs <font color=Red>-></font> SymTabs-<a name="(line125)"></a>addPE n v <font color=Cyan>(</font>pe<font color=Cyan>,</font>ge<font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>addST n v pe<font color=Cyan>,</font> ge<font color=Cyan>)</font>-<a name="(line126)"></a>-<a name="(line127)"></a><a name="addGE"></a>addGE <font color=Red>::</font> String <font color=Red>-></font> EntityDef <font color=Red>-></font> SymTabs <font color=Red>-></font> SymTabs-<a name="(line128)"></a>addGE n v <font color=Cyan>(</font>pe<font color=Cyan>,</font>ge<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>let</u></font> newge <font color=Red>=</font> addST n v ge <font color=Green><u>in</u></font> newge <font color=Cyan>`seq`</font> <font color=Cyan>(</font>pe<font color=Cyan>,</font> newge<font color=Cyan>)</font>-<a name="(line129)"></a>-<a name="(line130)"></a><a name="lookupPE"></a>lookupPE <font color=Red>::</font> String <font color=Red>-></font> SymTabs <font color=Red>-></font> Maybe PEDef-<a name="(line131)"></a>lookupPE s <font color=Cyan>(</font>pe<font color=Cyan>,</font>ge<font color=Cyan>)</font> <font color=Red>=</font> lookupST s pe-<a name="(line132)"></a>-<a name="(line133)"></a><a name="flattenEV"></a>flattenEV <font color=Red>::</font> EntityValue <font color=Red>-></font> String-<a name="(line134)"></a>flattenEV <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font> <font color=Red>=</font> concatMap flatten evs-<a name="(line135)"></a> <font color=Green><u>where</u></font>-<a name="(line136)"></a> flatten <font color=Cyan>(</font>EVString s<font color=Cyan>)</font> <font color=Red>=</font> s-<a name="(line137)"></a> flatten <font color=Cyan>(</font>EVRef <font color=Cyan>(</font>RefEntity r<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"&"</font> <font color=Cyan>++</font>r<font color=Cyan>++</font><font color=Magenta>";"</font>-<a name="(line138)"></a> flatten <font color=Cyan>(</font>EVRef <font color=Cyan>(</font>RefChar r<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"&#"</font><font color=Cyan>++</font>show r<font color=Cyan>++</font><font color=Magenta>";"</font>-<a name="(line139)"></a> <font color=Blue>-- flatten (EVPERef n) = "%" ++n++";"</font>-<a name="(line140)"></a>-<a name="(line141)"></a>-<a name="(line142)"></a><a name="fst3"></a><font color=Blue>---- Misc ----</font>-<a name="(line143)"></a>fst3 <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>-></font> a-<a name="(line144)"></a><a name="snd3"></a>snd3 <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>-></font> b-<a name="(line145)"></a><a name="thd3"></a>thd3 <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>-></font> c-<a name="(line146)"></a>-<a name="(line147)"></a>fst3 <font color=Cyan>(</font>a<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> a-<a name="(line148)"></a>snd3 <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font>a<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> a-<a name="(line149)"></a>thd3 <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font>a<font color=Cyan>)</font> <font color=Red>=</font> a-<a name="(line150)"></a>-<a name="(line151)"></a>-<a name="(line152)"></a><font color=Blue>---- Auxiliary Parsing Functions ----</font>-<a name="(line153)"></a>-<a name="(line154)"></a><a name="XParser"></a><font color=Blue>-- | XParser is just a specialisation of the PolyState parser.</font>-<a name="(line155)"></a><a name="XParser"></a><font color=Green><u>type</u></font> XParser a <font color=Red>=</font> Parser SymTabs <font color=Cyan>(</font>Posn<font color=Cyan>,</font>TokenT<font color=Cyan>)</font> a-<a name="(line156)"></a>-<a name="(line157)"></a><a name="tok"></a><font color=Blue>-- | Return the next token from the input only if it matches the given token.</font>-<a name="(line158)"></a>tok <font color=Red>::</font> TokenT <font color=Red>-></font> XParser TokenT-<a name="(line159)"></a>tok t <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t'<font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line160)"></a> <font color=Green><u>case</u></font> t' <font color=Green><u>of</u></font> TokError <font color=Green><u>_</u></font> <font color=Red>-></font> report failBad <font color=Cyan>(</font>show t<font color=Cyan>)</font> p t'-<a name="(line161)"></a> <font color=Green><u>_</u></font> <font color=Red>|</font> t'<font color=Cyan>==</font>t <font color=Red>-></font> return t-<a name="(line162)"></a> <font color=Red>|</font> otherwise <font color=Red>-></font> report fail <font color=Cyan>(</font>show t<font color=Cyan>)</font> p t'-<a name="(line163)"></a><a name="nottok"></a>nottok <font color=Red>::</font> <font color=Red>[</font>TokenT<font color=Red>]</font> <font color=Red>-></font> XParser TokenT-<a name="(line164)"></a>nottok ts <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line165)"></a> <font color=Green><u>if</u></font> t<font color=Cyan>`elem`</font>ts <font color=Green><u>then</u></font> report fail <font color=Cyan>(</font><font color=Magenta>"no "</font><font color=Cyan>++</font>show t<font color=Cyan>)</font> p t-<a name="(line166)"></a> <font color=Green><u>else</u></font> return t-<a name="(line167)"></a>-<a name="(line168)"></a><a name="name"></a><font color=Blue>-- | Return just a name, e.g. element name, attribute name.</font>-<a name="(line169)"></a>name <font color=Red>::</font> XParser Name-<a name="(line170)"></a>name <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>tok<font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line171)"></a> <font color=Green><u>case</u></font> tok <font color=Green><u>of</u></font>-<a name="(line172)"></a> TokName s <font color=Red>-></font> return s-<a name="(line173)"></a> TokError <font color=Green><u>_</u></font> <font color=Red>-></font> report failBad <font color=Magenta>"a name"</font> p tok-<a name="(line174)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"a name"</font> p tok-<a name="(line175)"></a>-<a name="(line176)"></a><a name="string"></a>string<font color=Cyan>,</font> freetext <font color=Red>::</font> XParser String-<a name="(line177)"></a>string <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line178)"></a> <font color=Green><u>case</u></font> t <font color=Green><u>of</u></font> TokName s <font color=Red>-></font> return s-<a name="(line179)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"text"</font> p t-<a name="(line180)"></a><a name="freetext"></a>freetext <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line181)"></a> <font color=Green><u>case</u></font> t <font color=Green><u>of</u></font> TokFreeText s <font color=Red>-></font> return s-<a name="(line182)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"text"</font> p t-<a name="(line183)"></a>-<a name="(line184)"></a><a name="maybe"></a>maybe <font color=Red>::</font> XParser a <font color=Red>-></font> XParser <font color=Cyan>(</font>Maybe a<font color=Cyan>)</font>-<a name="(line185)"></a>maybe p <font color=Red>=</font>-<a name="(line186)"></a> <font color=Cyan>(</font> p <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Just<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line187)"></a> <font color=Cyan>(</font> return Nothing<font color=Cyan>)</font>-<a name="(line188)"></a>-<a name="(line189)"></a><a name="either"></a>either <font color=Red>::</font> XParser a <font color=Red>-></font> XParser b <font color=Red>-></font> XParser <font color=Cyan>(</font>Either a b<font color=Cyan>)</font>-<a name="(line190)"></a>either p q <font color=Red>=</font>-<a name="(line191)"></a> <font color=Cyan>(</font> p <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Left<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line192)"></a> <font color=Cyan>(</font> q <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Right<font color=Cyan>)</font>-<a name="(line193)"></a>-<a name="(line194)"></a><a name="word"></a>word <font color=Red>::</font> String <font color=Red>-></font> XParser ()-<a name="(line195)"></a>word s <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> x <font color=Red><-</font> next-<a name="(line196)"></a> <font color=Cyan>;</font> <font color=Green><u>case</u></font> x <font color=Green><u>of</u></font>-<a name="(line197)"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>TokName n<font color=Cyan>)</font> <font color=Red>|</font> s<font color=Cyan>==</font>n <font color=Red>-></font> return ()-<a name="(line198)"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>TokFreeText n<font color=Cyan>)</font> <font color=Red>|</font> s<font color=Cyan>==</font>n <font color=Red>-></font> return ()-<a name="(line199)"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Red>@</font><font color=Cyan>(</font>TokError <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> report failBad <font color=Cyan>(</font>show s<font color=Cyan>)</font> p t-<a name="(line200)"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red>-></font> report fail <font color=Cyan>(</font>show s<font color=Cyan>)</font> p t-<a name="(line201)"></a> <font color=Cyan>}</font>-<a name="(line202)"></a>-<a name="(line203)"></a><a name="posn"></a>posn <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> x<font color=Red>@</font><font color=Cyan>(</font>p<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line204)"></a> <font color=Cyan>;</font> reparse <font color=Red>[</font>x<font color=Red>]</font>-<a name="(line205)"></a> <font color=Cyan>;</font> return p-<a name="(line206)"></a> <font color=Cyan>}</font>-<a name="(line207)"></a>-<a name="(line208)"></a><a name="nmtoken"></a>nmtoken <font color=Red>::</font> XParser NmToken-<a name="(line209)"></a>nmtoken <font color=Red>=</font> <font color=Cyan>(</font>string <font color=Cyan>`onFail`</font> freetext<font color=Cyan>)</font>-<a name="(line210)"></a>-<a name="(line211)"></a><a name="failP"></a>failP<font color=Cyan>,</font> failBadP <font color=Red>::</font> String <font color=Red>-></font> XParser a-<a name="(line212)"></a>failP msg <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn<font color=Cyan>;</font> fail <font color=Cyan>(</font>msg<font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font> <font color=Cyan>}</font>-<a name="(line213)"></a><a name="failBadP"></a>failBadP msg <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn<font color=Cyan>;</font> failBad <font color=Cyan>(</font>msg<font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font> <font color=Cyan>}</font>-<a name="(line214)"></a>-<a name="(line215)"></a><a name="report"></a>report <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>XParser a<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> Posn <font color=Red>-></font> TokenT <font color=Red>-></font> XParser a-<a name="(line216)"></a>report fail exp p t <font color=Red>=</font> fail <font color=Cyan>(</font><font color=Magenta>"Expected "</font><font color=Cyan>++</font>exp<font color=Cyan>++</font><font color=Magenta>" but found "</font><font color=Cyan>++</font>show t-<a name="(line217)"></a> <font color=Cyan>++</font><font color=Magenta>"\n in "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>-<a name="(line218)"></a>-<a name="(line219)"></a><a name="adjustErrP"></a>adjustErrP <font color=Red>::</font> XParser a <font color=Red>-></font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Cyan>)</font> <font color=Red>-></font> XParser a-<a name="(line220)"></a><a name="adjustErrP"></a>p <font color=Cyan>`adjustErrP`</font> f <font color=Red>=</font> p <font color=Cyan>`onFail`</font> <font color=Green><u>do</u></font> pn <font color=Red><-</font> posn-<a name="(line221)"></a> <font color=Cyan>(</font>p <font color=Cyan>`adjustErr`</font> f<font color=Cyan>)</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>++</font>show pn<font color=Cyan>)</font>-<a name="(line222)"></a>-<a name="(line223)"></a><a name="peRef"></a>peRef <font color=Red>::</font> XParser a <font color=Red>-></font> XParser a-<a name="(line224)"></a>peRef p <font color=Red>=</font>-<a name="(line225)"></a> p <font color=Cyan>`onFail`</font>-<a name="(line226)"></a> <font color=Green><u>do</u></font> pn <font color=Red><-</font> posn-<a name="(line227)"></a> n <font color=Red><-</font> pereference-<a name="(line228)"></a> tr <font color=Red><-</font> stQuery <font color=Cyan>(</font>lookupPE n<font color=Cyan>)</font> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"Looking up %"</font><font color=Cyan>++</font>n<font color=Cyan>)</font>-<a name="(line229)"></a> <font color=Green><u>case</u></font> tr <font color=Green><u>of</u></font>-<a name="(line230)"></a> Just <font color=Cyan>(</font>PEDefEntityValue ev<font color=Cyan>)</font> <font color=Red>-></font>-<a name="(line231)"></a> <font color=Green><u>do</u></font> reparse <font color=Cyan>(</font>xmlReLex <font color=Cyan>(</font>posInNewCxt <font color=Cyan>(</font><font color=Magenta>"macro %"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font>-<a name="(line232)"></a> <font color=Cyan>(</font>Just pn<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line233)"></a> <font color=Cyan>(</font>flattenEV ev<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line234)"></a> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>" defn: "</font><font color=Cyan>++</font>flattenEV ev<font color=Cyan>)</font>-<a name="(line235)"></a> peRef p-<a name="(line236)"></a> Just <font color=Cyan>(</font>PEDefExternalID <font color=Cyan>(</font>PUBLIC <font color=Green><u>_</u></font> <font color=Cyan>(</font>SystemLiteral f<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font>-<a name="(line237)"></a> <font color=Green><u>do</u></font> <font color=Green><u>let</u></font> val <font color=Red>=</font> unsafePerformIO <font color=Cyan>(</font>readFile f<font color=Cyan>)</font>-<a name="(line238)"></a> reparse <font color=Cyan>(</font>xmlReLex <font color=Cyan>(</font>posInNewCxt <font color=Cyan>(</font><font color=Magenta>"file "</font><font color=Cyan>++</font>f<font color=Cyan>)</font>-<a name="(line239)"></a> <font color=Cyan>(</font>Just pn<font color=Cyan>)</font><font color=Cyan>)</font> val<font color=Cyan>)</font>-<a name="(line240)"></a> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>" reading from file "</font><font color=Cyan>++</font>f<font color=Cyan>)</font>-<a name="(line241)"></a> peRef p-<a name="(line242)"></a> Just <font color=Cyan>(</font>PEDefExternalID <font color=Cyan>(</font>SYSTEM <font color=Cyan>(</font>SystemLiteral f<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font>-<a name="(line243)"></a> <font color=Green><u>do</u></font> <font color=Green><u>let</u></font> val <font color=Red>=</font> unsafePerformIO <font color=Cyan>(</font>readFile f<font color=Cyan>)</font>-<a name="(line244)"></a> reparse <font color=Cyan>(</font>xmlReLex <font color=Cyan>(</font>posInNewCxt <font color=Cyan>(</font><font color=Magenta>"file "</font><font color=Cyan>++</font>f<font color=Cyan>)</font>-<a name="(line245)"></a> <font color=Cyan>(</font>Just pn<font color=Cyan>)</font><font color=Cyan>)</font> val<font color=Cyan>)</font>-<a name="(line246)"></a> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>" reading from file "</font><font color=Cyan>++</font>f<font color=Cyan>)</font>-<a name="(line247)"></a> peRef p-<a name="(line248)"></a> Nothing <font color=Red>-></font> fail <font color=Cyan>(</font><font color=Magenta>"PEReference use before definition: "</font><font color=Cyan>++</font><font color=Magenta>"%"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font>-<a name="(line249)"></a> <font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show pn<font color=Cyan>)</font>-<a name="(line250)"></a>-<a name="(line251)"></a><a name="blank"></a>blank <font color=Red>::</font> XParser a <font color=Red>-></font> XParser a-<a name="(line252)"></a>blank p <font color=Red>=</font>-<a name="(line253)"></a> p <font color=Cyan>`onFail`</font>-<a name="(line254)"></a> <font color=Green><u>do</u></font> n <font color=Red><-</font> pereference-<a name="(line255)"></a> tr <font color=Red><-</font> stQuery <font color=Cyan>(</font>lookupPE n<font color=Cyan>)</font> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"Looking up %"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>" (is blank?)"</font><font color=Cyan>)</font>-<a name="(line256)"></a> <font color=Green><u>case</u></font> tr <font color=Green><u>of</u></font>-<a name="(line257)"></a> Just <font color=Cyan>(</font>PEDefEntityValue ev<font color=Cyan>)</font>-<a name="(line258)"></a> <font color=Red>|</font> all isSpace <font color=Cyan>(</font>flattenEV ev<font color=Cyan>)</font> <font color=Red>-></font>-<a name="(line259)"></a> <font color=Green><u>do</u></font> blank p <font color=Cyan>`debug`</font> <font color=Magenta>"Empty macro definition"</font>-<a name="(line260)"></a> Just <font color=Green><u>_</u></font> <font color=Red>-></font> failP <font color=Cyan>(</font><font color=Magenta>"expected a blank PERef macro: "</font><font color=Cyan>++</font><font color=Magenta>"%"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font>-<a name="(line261)"></a> Nothing <font color=Red>-></font> failP <font color=Cyan>(</font><font color=Magenta>"PEReference use before definition: "</font><font color=Cyan>++</font><font color=Magenta>"%"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font>-<a name="(line262)"></a>-<a name="(line263)"></a>-<a name="(line264)"></a>-<a name="(line265)"></a><font color=Blue>---- XML Parsing Functions ----</font>-<a name="(line266)"></a>-<a name="(line267)"></a><a name="justDTD"></a>justDTD <font color=Red>::</font> XParser <font color=Cyan>(</font>Maybe DocTypeDecl<font color=Cyan>)</font>-<a name="(line268)"></a>justDTD <font color=Red>=</font>-<a name="(line269)"></a> <font color=Green><u>do</u></font> <font color=Cyan>(</font>ExtSubset <font color=Green><u>_</u></font> ds<font color=Cyan>)</font> <font color=Red><-</font> extsubset <font color=Cyan>`debug`</font> <font color=Magenta>"Trying external subset"</font>-<a name="(line270)"></a> <font color=Green><u>if</u></font> null ds <font color=Green><u>then</u></font> fail <font color=Magenta>"empty"</font>-<a name="(line271)"></a> <font color=Green><u>else</u></font> return <font color=Cyan>(</font>Just <font color=Cyan>(</font>DTD <font color=Magenta>"extsubset"</font> Nothing <font color=Cyan>(</font>concatMap extract ds<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line272)"></a> <font color=Cyan>`onFail`</font>-<a name="(line273)"></a> <font color=Green><u>do</u></font> <font color=Cyan>(</font>Prolog <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> dtd <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red><-</font> prolog-<a name="(line274)"></a> return dtd-<a name="(line275)"></a> <font color=Green><u>where</u></font> extract <font color=Cyan>(</font>ExtMarkupDecl m<font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>m<font color=Red>]</font>-<a name="(line276)"></a> extract <font color=Cyan>(</font>ExtConditionalSect <font color=Cyan>(</font>IncludeSect i<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> concatMap extract i-<a name="(line277)"></a> extract <font color=Cyan>(</font>ExtConditionalSect <font color=Cyan>(</font>IgnoreSect i<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> []-<a name="(line278)"></a>-<a name="(line279)"></a><a name="document"></a><font color=Blue>-- | Return an entire XML document including prolog and trailing junk.</font>-<a name="(line280)"></a>document <font color=Red>::</font> XParser <font color=Cyan>(</font>Document Posn<font color=Cyan>)</font>-<a name="(line281)"></a>document <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line282)"></a> p <font color=Red><-</font> prolog <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"unrecognisable XML prolog\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line283)"></a> e <font color=Red><-</font> element-<a name="(line284)"></a> ms <font color=Red><-</font> many misc-<a name="(line285)"></a> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font>ge<font color=Cyan>)</font> <font color=Red><-</font> stGet-<a name="(line286)"></a> return <font color=Cyan>(</font>Document p ge e ms<font color=Cyan>)</font>-<a name="(line287)"></a>-<a name="(line288)"></a><a name="comment"></a><font color=Blue>-- | Return an XML comment.</font>-<a name="(line289)"></a>comment <font color=Red>::</font> XParser Comment-<a name="(line290)"></a>comment <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line291)"></a> bracket <font color=Cyan>(</font>tok TokCommentOpen<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokCommentClose<font color=Cyan>)</font> freetext-<a name="(line292)"></a><font color=Blue>-- tok TokCommentOpen</font>-<a name="(line293)"></a><font color=Blue>-- commit $ do</font>-<a name="(line294)"></a><font color=Blue>-- c <- freetext</font>-<a name="(line295)"></a><font color=Blue>-- tok TokCommentClose</font>-<a name="(line296)"></a><font color=Blue>-- return c</font>-<a name="(line297)"></a>-<a name="(line298)"></a><a name="processinginstruction"></a><font color=Blue>-- | Parse a processing instruction.</font>-<a name="(line299)"></a>processinginstruction <font color=Red>::</font> XParser ProcessingInstruction-<a name="(line300)"></a>processinginstruction <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line301)"></a> tok TokPIOpen-<a name="(line302)"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>-<a name="(line303)"></a> n <font color=Red><-</font> string <font color=Cyan>`onFail`</font> failP <font color=Magenta>"processing instruction has no target"</font>-<a name="(line304)"></a> f <font color=Red><-</font> freetext-<a name="(line305)"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failP <font color=Cyan>(</font><font color=Magenta>"missing ?> in <?"</font><font color=Cyan>++</font>n<font color=Cyan>)</font>-<a name="(line306)"></a> return <font color=Cyan>(</font>n<font color=Cyan>,</font> f<font color=Cyan>)</font>-<a name="(line307)"></a>-<a name="(line308)"></a><a name="cdsect"></a>cdsect <font color=Red>::</font> XParser CDSect-<a name="(line309)"></a>cdsect <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line310)"></a> tok TokSectionOpen-<a name="(line311)"></a> bracket <font color=Cyan>(</font>tok <font color=Cyan>(</font>TokSection CDATAx<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSectionClose<font color=Cyan>)</font> chardata-<a name="(line312)"></a>-<a name="(line313)"></a><a name="prolog"></a>prolog <font color=Red>::</font> XParser Prolog-<a name="(line314)"></a>prolog <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line315)"></a> x <font color=Red><-</font> maybe xmldecl-<a name="(line316)"></a> m1 <font color=Red><-</font> many misc-<a name="(line317)"></a> dtd <font color=Red><-</font> maybe doctypedecl-<a name="(line318)"></a> m2 <font color=Red><-</font> many misc-<a name="(line319)"></a> return <font color=Cyan>(</font>Prolog x m1 dtd m2<font color=Cyan>)</font>-<a name="(line320)"></a>-<a name="(line321)"></a><a name="xmldecl"></a>xmldecl <font color=Red>::</font> XParser XMLDecl-<a name="(line322)"></a>xmldecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line323)"></a> tok TokPIOpen-<a name="(line324)"></a> <font color=Cyan>(</font>word <font color=Magenta>"xml"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"XML"</font><font color=Cyan>)</font>-<a name="(line325)"></a> p <font color=Red><-</font> posn-<a name="(line326)"></a> s <font color=Red><-</font> freetext-<a name="(line327)"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing ?> in <?xml ...?>"</font>-<a name="(line328)"></a> raise <font color=Cyan>(</font><font color=Cyan>(</font>runParser aux emptySTs <font color=Cyan>.</font> xmlReLex p<font color=Cyan>)</font> s<font color=Cyan>)</font>-<a name="(line329)"></a> <font color=Green><u>where</u></font>-<a name="(line330)"></a> aux <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line331)"></a> v <font color=Red><-</font> versioninfo <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing XML version info"</font>-<a name="(line332)"></a> e <font color=Red><-</font> maybe encodingdecl-<a name="(line333)"></a> s <font color=Red><-</font> maybe sddecl-<a name="(line334)"></a> return <font color=Cyan>(</font>XMLDecl v e s<font color=Cyan>)</font>-<a name="(line335)"></a> raise <font color=Cyan>(</font>Left err<font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> failP err-<a name="(line336)"></a> raise <font color=Cyan>(</font>Right ok<font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> return ok-<a name="(line337)"></a>-<a name="(line338)"></a><a name="versioninfo"></a>versioninfo <font color=Red>::</font> XParser VersionInfo-<a name="(line339)"></a>versioninfo <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line340)"></a> <font color=Cyan>(</font>word <font color=Magenta>"version"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"VERSION"</font><font color=Cyan>)</font>-<a name="(line341)"></a> tok TokEqual-<a name="(line342)"></a> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext-<a name="(line343)"></a>-<a name="(line344)"></a><a name="misc"></a>misc <font color=Red>::</font> XParser Misc-<a name="(line345)"></a>misc <font color=Red>=</font>-<a name="(line346)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"<!--comment-->"</font><font color=Cyan>,</font> comment <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Comment<font color=Cyan>)</font>-<a name="(line347)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"<?PI?>"</font><font color=Cyan>,</font> processinginstruction <font color=Cyan>>>=</font> return <font color=Cyan>.</font> PI<font color=Cyan>)</font>-<a name="(line348)"></a> <font color=Red>]</font>-<a name="(line349)"></a>-<a name="(line350)"></a><a name="doctypedecl"></a><font color=Blue>-- | Return a DOCTYPE decl, indicating a DTD.</font>-<a name="(line351)"></a>doctypedecl <font color=Red>::</font> XParser DocTypeDecl-<a name="(line352)"></a>doctypedecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line353)"></a> tok TokSpecialOpen-<a name="(line354)"></a> tok <font color=Cyan>(</font>TokSpecial DOCTYPEx<font color=Cyan>)</font>-<a name="(line355)"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>-<a name="(line356)"></a> n <font color=Red><-</font> name-<a name="(line357)"></a> eid <font color=Red><-</font> maybe externalid-<a name="(line358)"></a> es <font color=Red><-</font> maybe <font color=Cyan>(</font>bracket <font color=Cyan>(</font>tok TokSqOpen<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSqClose<font color=Cyan>)</font>-<a name="(line359)"></a> <font color=Cyan>(</font>many <font color=Cyan>(</font>peRef markupdecl<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line360)"></a> blank <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing > in DOCTYPE decl"</font>-<a name="(line361)"></a> return <font color=Cyan>(</font>DTD n eid <font color=Cyan>(</font><font color=Green><u>case</u></font> es <font color=Green><u>of</u></font> <font color=Cyan>{</font> Nothing <font color=Red>-></font> []<font color=Cyan>;</font> Just e <font color=Red>-></font> e <font color=Cyan>}</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line362)"></a>-<a name="(line363)"></a><a name="markupdecl"></a><font color=Blue>-- | Return a DTD markup decl, e.g. ELEMENT, ATTLIST, etc</font>-<a name="(line364)"></a>markupdecl <font color=Red>::</font> XParser MarkupDecl-<a name="(line365)"></a>markupdecl <font color=Red>=</font>-<a name="(line366)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"ELEMENT"</font><font color=Cyan>,</font> elementdecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Element<font color=Cyan>)</font>-<a name="(line367)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"ATTLIST"</font><font color=Cyan>,</font> attlistdecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> AttList<font color=Cyan>)</font>-<a name="(line368)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"ENTITY"</font><font color=Cyan>,</font> entitydecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Entity<font color=Cyan>)</font>-<a name="(line369)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"NOTATION"</font><font color=Cyan>,</font> notationdecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Notation<font color=Cyan>)</font>-<a name="(line370)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"misc"</font><font color=Cyan>,</font> misc <font color=Cyan>>>=</font> return <font color=Cyan>.</font> MarkupMisc<font color=Cyan>)</font>-<a name="(line371)"></a> <font color=Red>]</font>-<a name="(line372)"></a> <font color=Cyan>`adjustErrP`</font>-<a name="(line373)"></a> <font color=Cyan>(</font><font color=Magenta>"when looking for a markup decl,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line374)"></a> <font color=Blue>-- (\ (ELEMENT, ATTLIST, ENTITY, NOTATION, <!--comment-->, or <?PI?>")</font>-<a name="(line375)"></a>-<a name="(line376)"></a><a name="extsubset"></a>extsubset <font color=Red>::</font> XParser ExtSubset-<a name="(line377)"></a>extsubset <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line378)"></a> td <font color=Red><-</font> maybe textdecl-<a name="(line379)"></a> ds <font color=Red><-</font> many <font color=Cyan>(</font>peRef extsubsetdecl<font color=Cyan>)</font>-<a name="(line380)"></a> return <font color=Cyan>(</font>ExtSubset td ds<font color=Cyan>)</font>-<a name="(line381)"></a>-<a name="(line382)"></a><a name="extsubsetdecl"></a>extsubsetdecl <font color=Red>::</font> XParser ExtSubsetDecl-<a name="(line383)"></a>extsubsetdecl <font color=Red>=</font>-<a name="(line384)"></a> <font color=Cyan>(</font> markupdecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> ExtMarkupDecl<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line385)"></a> <font color=Cyan>(</font> conditionalsect <font color=Cyan>>>=</font> return <font color=Cyan>.</font> ExtConditionalSect<font color=Cyan>)</font>-<a name="(line386)"></a>-<a name="(line387)"></a><a name="sddecl"></a>sddecl <font color=Red>::</font> XParser SDDecl-<a name="(line388)"></a>sddecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line389)"></a> <font color=Cyan>(</font>word <font color=Magenta>"standalone"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"STANDALONE"</font><font color=Cyan>)</font>-<a name="(line390)"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>-<a name="(line391)"></a> tok TokEqual <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing = in 'standalone' decl"</font>-<a name="(line392)"></a> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font>-<a name="(line393)"></a> <font color=Cyan>(</font> <font color=Cyan>(</font>word <font color=Magenta>"yes"</font> <font color=Cyan>>></font> return True<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line394)"></a> <font color=Cyan>(</font>word <font color=Magenta>"no"</font> <font color=Cyan>>></font> return False<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line395)"></a> failP <font color=Magenta>"'standalone' decl requires 'yes' or 'no' value"</font> <font color=Cyan>)</font>-<a name="(line396)"></a>-<a name="(line397)"></a><font color=Blue>{--<a name="(line398)"></a>element :: XParser (Element Posn)-<a name="(line399)"></a>element = do-<a name="(line400)"></a> tok TokAnyOpen-<a name="(line401)"></a> (ElemTag n as) <- elemtag-<a name="(line402)"></a> oneOf' [ ("self-closing tag <"++n++"/>"-<a name="(line403)"></a> , do tok TokEndClose-<a name="(line404)"></a> return (Elem n as []))-<a name="(line405)"></a> , ("after open tag <"++n++">"-<a name="(line406)"></a> , do tok TokAnyClose-<a name="(line407)"></a> cs <- many content-<a name="(line408)"></a> p <- posn-<a name="(line409)"></a> m <- bracket (tok TokEndOpen) (tok TokAnyClose) name-<a name="(line410)"></a> checkmatch p n m-<a name="(line411)"></a> return (Elem n as cs))-<a name="(line412)"></a> ] `adjustErr` (("in element tag "++n++",\n")++)-<a name="(line413)"></a>-}</font>-<a name="(line414)"></a>-<a name="(line415)"></a><a name="element"></a><font color=Blue>-- | Return a complete element including all its inner content.</font>-<a name="(line416)"></a>element <font color=Red>::</font> XParser <font color=Cyan>(</font>Element Posn<font color=Cyan>)</font>-<a name="(line417)"></a>element <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line418)"></a> tok TokAnyOpen-<a name="(line419)"></a> <font color=Cyan>(</font>ElemTag n <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Red><-</font> elemtag-<a name="(line420)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokEndClose-<a name="(line421)"></a> commit <font color=Cyan>(</font>return <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line422)"></a> <font color=Cyan>`onFail`</font>-<a name="(line423)"></a> <font color=Green><u>do</u></font> tok TokAnyClose-<a name="(line424)"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>-<a name="(line425)"></a> return <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan>`apply`</font>-<a name="(line426)"></a> manyFinally content-<a name="(line427)"></a> <font color=Cyan>(</font><font color=Green><u>do</u></font> p <font color=Red><-</font> posn-<a name="(line428)"></a> m <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokEndOpen<font color=Cyan>)</font>-<a name="(line429)"></a> <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font> name-<a name="(line430)"></a> checkmatch p n m<font color=Cyan>)</font>-<a name="(line431)"></a> <font color=Cyan>)</font> <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in element tag "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line432)"></a>-<a name="(line433)"></a><a name="checkmatch"></a>checkmatch <font color=Red>::</font> Posn <font color=Red>-></font> Name <font color=Red>-></font> Name <font color=Red>-></font> XParser ()-<a name="(line434)"></a>checkmatch p n m <font color=Red>=</font>-<a name="(line435)"></a> <font color=Green><u>if</u></font> n <font color=Cyan>==</font> m <font color=Green><u>then</u></font> return ()-<a name="(line436)"></a> <font color=Green><u>else</u></font> failBadP <font color=Cyan>(</font><font color=Magenta>"tag <"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>"> terminated by </"</font><font color=Cyan>++</font>m<font color=Cyan>++</font><font color=Magenta>">"</font><font color=Cyan>)</font>-<a name="(line437)"></a>-<a name="(line438)"></a><a name="elemtag"></a><font color=Blue>-- | Parse only the parts between angle brackets in an element tag.</font>-<a name="(line439)"></a>elemtag <font color=Red>::</font> XParser ElemTag-<a name="(line440)"></a>elemtag <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line441)"></a> n <font color=Red><-</font> name <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Magenta>"malformed element tag\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line442)"></a> <font color=Green><u>as</u></font> <font color=Red><-</font> many attribute-<a name="(line443)"></a> return <font color=Cyan>(</font>ElemTag n <font color=Green><u>as</u></font><font color=Cyan>)</font>-<a name="(line444)"></a>-<a name="(line445)"></a><a name="elemOpenTag"></a><font color=Blue>-- | For use with stream parsers - returns the complete opening element tag.</font>-<a name="(line446)"></a>elemOpenTag <font color=Red>::</font> XParser ElemTag-<a name="(line447)"></a>elemOpenTag <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line448)"></a> tok TokAnyOpen-<a name="(line449)"></a> e <font color=Red><-</font> elemtag-<a name="(line450)"></a> tok TokAnyClose-<a name="(line451)"></a> return e-<a name="(line452)"></a>-<a name="(line453)"></a><a name="elemCloseTag"></a><font color=Blue>-- | For use with stream parsers - accepts a closing tag, provided it</font>-<a name="(line454)"></a><font color=Blue>-- matches the given element name.</font>-<a name="(line455)"></a>elemCloseTag <font color=Red>::</font> Name <font color=Red>-></font> XParser ()-<a name="(line456)"></a>elemCloseTag n <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line457)"></a> tok TokEndOpen-<a name="(line458)"></a> p <font color=Red><-</font> posn-<a name="(line459)"></a> m <font color=Red><-</font> name-<a name="(line460)"></a> tok TokAnyClose-<a name="(line461)"></a> checkmatch p n m-<a name="(line462)"></a>-<a name="(line463)"></a><a name="attribute"></a>attribute <font color=Red>::</font> XParser Attribute-<a name="(line464)"></a>attribute <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line465)"></a> n <font color=Red><-</font> name <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"malformed attribute name\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line466)"></a> tok TokEqual <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing = in attribute"</font>-<a name="(line467)"></a> v <font color=Red><-</font> attvalue <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing attvalue"</font>-<a name="(line468)"></a> return <font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Cyan>)</font>-<a name="(line469)"></a>-<a name="(line470)"></a><a name="content"></a><font color=Blue>-- | Return a content particle, e.g. text, element, reference, etc</font>-<a name="(line471)"></a>content <font color=Red>::</font> XParser <font color=Cyan>(</font>Content Posn<font color=Cyan>)</font>-<a name="(line472)"></a>content <font color=Red>=</font>-<a name="(line473)"></a> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn-<a name="(line474)"></a> <font color=Cyan>;</font> c' <font color=Red><-</font> content'-<a name="(line475)"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>c' p<font color=Cyan>)</font>-<a name="(line476)"></a> <font color=Cyan>}</font>-<a name="(line477)"></a> <font color=Green><u>where</u></font>-<a name="(line478)"></a> content' <font color=Red>=</font> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"element"</font><font color=Cyan>,</font> element <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CElem<font color=Cyan>)</font>-<a name="(line479)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"chardata"</font><font color=Cyan>,</font> chardata <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CString False<font color=Cyan>)</font>-<a name="(line480)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"reference"</font><font color=Cyan>,</font> reference <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CRef<font color=Cyan>)</font>-<a name="(line481)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"CDATA"</font><font color=Cyan>,</font> cdsect <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CString True<font color=Cyan>)</font>-<a name="(line482)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"misc"</font><font color=Cyan>,</font> misc <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CMisc<font color=Cyan>)</font>-<a name="(line483)"></a> <font color=Red>]</font>-<a name="(line484)"></a> <font color=Cyan>`adjustErrP`</font> <font color=Cyan>(</font><font color=Magenta>"when looking for a content item,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line485)"></a><font color=Blue>-- (\ (element, text, reference, CDATA section, <!--comment-->, or <?PI?>")</font>-<a name="(line486)"></a>-<a name="(line487)"></a><a name="elementdecl"></a>elementdecl <font color=Red>::</font> XParser ElementDecl-<a name="(line488)"></a>elementdecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line489)"></a> tok TokSpecialOpen-<a name="(line490)"></a> tok <font color=Cyan>(</font>TokSpecial ELEMENTx<font color=Cyan>)</font>-<a name="(line491)"></a> n <font color=Red><-</font> peRef name <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Magenta>"expecting identifier in ELEMENT decl\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line492)"></a> c <font color=Red><-</font> peRef contentspec-<a name="(line493)"></a> <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in content spec of ELEMENT decl: "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>"\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line494)"></a> blank <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failBadP-<a name="(line495)"></a> <font color=Cyan>(</font><font color=Magenta>"expected > terminating ELEMENT decl"</font>-<a name="(line496)"></a> <font color=Cyan>++</font><font color=Magenta>"\n element name was "</font><font color=Cyan>++</font>show n-<a name="(line497)"></a> <font color=Cyan>++</font><font color=Magenta>"\n contentspec was "</font><font color=Cyan>++</font><font color=Cyan>(</font><font color=Red>\</font> <font color=Cyan>(</font>ContentSpec p<font color=Cyan>)</font><font color=Red>-></font> show p<font color=Cyan>)</font> c<font color=Cyan>)</font>-<a name="(line498)"></a> return <font color=Cyan>(</font>ElementDecl n c<font color=Cyan>)</font>-<a name="(line499)"></a>-<a name="(line500)"></a><a name="contentspec"></a>contentspec <font color=Red>::</font> XParser ContentSpec-<a name="(line501)"></a>contentspec <font color=Red>=</font>-<a name="(line502)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"EMPTY"</font><font color=Cyan>,</font> peRef <font color=Cyan>(</font>word <font color=Magenta>"EMPTY"</font><font color=Cyan>)</font> <font color=Cyan>>></font> return EMPTY<font color=Cyan>)</font>-<a name="(line503)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"ANY"</font><font color=Cyan>,</font> peRef <font color=Cyan>(</font>word <font color=Magenta>"ANY"</font><font color=Cyan>)</font> <font color=Cyan>>></font> return ANY<font color=Cyan>)</font>-<a name="(line504)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"mixed"</font><font color=Cyan>,</font> peRef mixed <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Mixed<font color=Cyan>)</font>-<a name="(line505)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"simple"</font><font color=Cyan>,</font> peRef cp <font color=Cyan>>>=</font> return <font color=Cyan>.</font> ContentSpec<font color=Cyan>)</font>-<a name="(line506)"></a> <font color=Red>]</font>-<a name="(line507)"></a> <font color=Blue>-- `adjustErr` ("when looking for content spec,\n"++)</font>-<a name="(line508)"></a> <font color=Blue>-- `adjustErr` (++"\nLooking for content spec (EMPTY, ANY, mixed, etc)")</font>-<a name="(line509)"></a>-<a name="(line510)"></a><a name="choice"></a>choice <font color=Red>::</font> XParser <font color=Red>[</font>CP<font color=Red>]</font>-<a name="(line511)"></a>choice <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line512)"></a> bracket <font color=Cyan>(</font>tok TokBraOpen <font color=Cyan>`debug`</font> <font color=Magenta>"Trying choice"</font><font color=Cyan>)</font>-<a name="(line513)"></a> <font color=Cyan>(</font>blank <font color=Cyan>(</font>tok TokBraClose <font color=Cyan>`debug`</font> <font color=Magenta>"Succeeded with choice"</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line514)"></a> <font color=Cyan>(</font>peRef cp <font color=Cyan>`sepBy1`</font> blank <font color=Cyan>(</font>tok TokPipe<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line515)"></a>-<a name="(line516)"></a><a name="sequence"></a>sequence <font color=Red>::</font> XParser <font color=Red>[</font>CP<font color=Red>]</font>-<a name="(line517)"></a>sequence <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Blue>-- bracket is inappropriate because of inner failBad</font>-<a name="(line518)"></a> <font color=Blue>-- bracket (tok TokBraOpen `debug` "Trying sequence")</font>-<a name="(line519)"></a> <font color=Blue>-- (blank (tok TokBraClose `debug` "Succeeded with sequence"))</font>-<a name="(line520)"></a> <font color=Blue>-- (peRef cp `sepBy1` blank (tok TokComma))</font>-<a name="(line521)"></a> tok TokBraOpen <font color=Cyan>`debug`</font> <font color=Magenta>"Trying sequence"</font>-<a name="(line522)"></a> cps <font color=Red><-</font> peRef cp <font color=Cyan>`sepBy1`</font> blank <font color=Cyan>(</font>tok TokComma<font color=Cyan>)</font>-<a name="(line523)"></a> blank <font color=Cyan>(</font>tok TokBraClose <font color=Cyan>`debug`</font> <font color=Magenta>"Succeeded with sequence"</font><font color=Cyan>)</font>-<a name="(line524)"></a> return cps-<a name="(line525)"></a>-<a name="(line526)"></a><a name="cp"></a>cp <font color=Red>::</font> XParser CP-<a name="(line527)"></a>cp <font color=Red>=</font> oneOf <font color=Red>[</font> <font color=Cyan>(</font> <font color=Green><u>do</u></font> n <font color=Red><-</font> name-<a name="(line528)"></a> m <font color=Red><-</font> modifier-<a name="(line529)"></a> <font color=Green><u>let</u></font> c <font color=Red>=</font> TagName n m-<a name="(line530)"></a> return c <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ContentSpec: name "</font><font color=Cyan>++</font>show c<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line531)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Green><u>do</u></font> ss <font color=Red><-</font> sequence-<a name="(line532)"></a> m <font color=Red><-</font> modifier-<a name="(line533)"></a> <font color=Green><u>let</u></font> c <font color=Red>=</font> Seq ss m-<a name="(line534)"></a> return c <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ContentSpec: sequence "</font><font color=Cyan>++</font>show c<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line535)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Green><u>do</u></font> cs <font color=Red><-</font> choice-<a name="(line536)"></a> m <font color=Red><-</font> modifier-<a name="(line537)"></a> <font color=Green><u>let</u></font> c <font color=Red>=</font> Choice cs m-<a name="(line538)"></a> return c <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ContentSpec: choice "</font><font color=Cyan>++</font>show c<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line539)"></a> <font color=Red>]</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>++</font><font color=Magenta>"\nwhen looking for a content particle"</font><font color=Cyan>)</font>-<a name="(line540)"></a>-<a name="(line541)"></a><a name="modifier"></a>modifier <font color=Red>::</font> XParser Modifier-<a name="(line542)"></a>modifier <font color=Red>=</font> oneOf <font color=Red>[</font> <font color=Cyan>(</font> tok TokStar <font color=Cyan>>></font> return Star <font color=Cyan>)</font>-<a name="(line543)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> tok TokQuery <font color=Cyan>>></font> return Query <font color=Cyan>)</font>-<a name="(line544)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> tok TokPlus <font color=Cyan>>></font> return Plus <font color=Cyan>)</font>-<a name="(line545)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> return None <font color=Cyan>)</font>-<a name="(line546)"></a> <font color=Red>]</font>-<a name="(line547)"></a>-<a name="(line548)"></a><font color=Blue>-- just for debugging</font>-<a name="(line549)"></a><font color=Green><u>instance</u></font> Show CP <font color=Green><u>where</u></font>-<a name="(line550)"></a> show <font color=Cyan>(</font>TagName n m<font color=Cyan>)</font> <font color=Red>=</font> n<font color=Cyan>++</font>show m-<a name="(line551)"></a> show <font color=Cyan>(</font>Choice cps m<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>'('</font><font color=Red><b>:</b></font> concat <font color=Cyan>(</font>intersperse <font color=Magenta>"|"</font> <font color=Cyan>(</font>map show cps<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line552)"></a> <font color=Cyan>++</font><font color=Magenta>")"</font><font color=Cyan>++</font>show m-<a name="(line553)"></a> show <font color=Cyan>(</font>Seq cps m<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>'('</font><font color=Red><b>:</b></font> concat <font color=Cyan>(</font>intersperse <font color=Magenta>","</font> <font color=Cyan>(</font>map show cps<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line554)"></a> <font color=Cyan>++</font><font color=Magenta>")"</font><font color=Cyan>++</font>show m-<a name="(line555)"></a><font color=Green><u>instance</u></font> Show Modifier <font color=Green><u>where</u></font>-<a name="(line556)"></a> show None <font color=Red>=</font> <font color=Magenta>""</font>-<a name="(line557)"></a> show Query <font color=Red>=</font> <font color=Magenta>"?"</font>-<a name="(line558)"></a> show Star <font color=Red>=</font> <font color=Magenta>"*"</font>-<a name="(line559)"></a> show Plus <font color=Red>=</font> <font color=Magenta>"+"</font>-<a name="(line560)"></a><font color=Blue>----</font>-<a name="(line561)"></a>-<a name="(line562)"></a><a name="mixed"></a>mixed <font color=Red>::</font> XParser Mixed-<a name="(line563)"></a>mixed <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line564)"></a> tok TokBraOpen-<a name="(line565)"></a> peRef <font color=Cyan>(</font><font color=Green><u>do</u></font> tok TokHash-<a name="(line566)"></a> word <font color=Magenta>"PCDATA"</font><font color=Cyan>)</font>-<a name="(line567)"></a> commit <font color=Cyan>$</font>-<a name="(line568)"></a> oneOf <font color=Red>[</font> <font color=Cyan>(</font> <font color=Green><u>do</u></font> cs <font color=Red><-</font> many <font color=Cyan>(</font>peRef <font color=Cyan>(</font><font color=Green><u>do</u></font> tok TokPipe-<a name="(line569)"></a> peRef name<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line570)"></a> blank <font color=Cyan>(</font>tok TokBraClose <font color=Cyan>>></font> tok TokStar<font color=Cyan>)</font>-<a name="(line571)"></a> return <font color=Cyan>(</font>PCDATAplus cs<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line572)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> blank <font color=Cyan>(</font>tok TokBraClose <font color=Cyan>>></font> tok TokStar<font color=Cyan>)</font> <font color=Cyan>>></font> return PCDATA<font color=Cyan>)</font>-<a name="(line573)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> blank <font color=Cyan>(</font>tok TokBraClose<font color=Cyan>)</font> <font color=Cyan>>></font> return PCDATA<font color=Cyan>)</font>-<a name="(line574)"></a> <font color=Red>]</font>-<a name="(line575)"></a> <font color=Cyan>`adjustErrP`</font> <font color=Cyan>(</font><font color=Cyan>++</font><font color=Magenta>"\nLooking for mixed content spec (#PCDATA | ...)*\n"</font><font color=Cyan>)</font>-<a name="(line576)"></a>-<a name="(line577)"></a><a name="attlistdecl"></a>attlistdecl <font color=Red>::</font> XParser AttListDecl-<a name="(line578)"></a>attlistdecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line579)"></a> tok TokSpecialOpen-<a name="(line580)"></a> tok <font color=Cyan>(</font>TokSpecial ATTLISTx<font color=Cyan>)</font>-<a name="(line581)"></a> n <font color=Red><-</font> peRef name <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Magenta>"expecting identifier in ATTLIST\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line582)"></a> ds <font color=Red><-</font> peRef <font color=Cyan>(</font>many1 <font color=Cyan>(</font>peRef attdef<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line583)"></a> blank <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing > terminating ATTLIST"</font>-<a name="(line584)"></a> return <font color=Cyan>(</font>AttListDecl n ds<font color=Cyan>)</font>-<a name="(line585)"></a>-<a name="(line586)"></a><a name="attdef"></a>attdef <font color=Red>::</font> XParser AttDef-<a name="(line587)"></a>attdef <font color=Red>=</font>-<a name="(line588)"></a> <font color=Green><u>do</u></font> n <font color=Red><-</font> peRef name <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"expecting attribute name\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line589)"></a> t <font color=Red><-</font> peRef atttype <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"within attlist defn: "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line590)"></a> d <font color=Red><-</font> peRef defaultdecl <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in attlist defn: "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line591)"></a> return <font color=Cyan>(</font>AttDef n t d<font color=Cyan>)</font>-<a name="(line592)"></a>-<a name="(line593)"></a><a name="atttype"></a>atttype <font color=Red>::</font> XParser AttType-<a name="(line594)"></a>atttype <font color=Red>=</font>-<a name="(line595)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"CDATA"</font><font color=Cyan>,</font> word <font color=Magenta>"CDATA"</font> <font color=Cyan>>></font> return StringType<font color=Cyan>)</font>-<a name="(line596)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"tokenized"</font><font color=Cyan>,</font> tokenizedtype <font color=Cyan>>>=</font> return <font color=Cyan>.</font> TokenizedType<font color=Cyan>)</font>-<a name="(line597)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"enumerated"</font><font color=Cyan>,</font> enumeratedtype <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EnumeratedType<font color=Cyan>)</font>-<a name="(line598)"></a> <font color=Red>]</font>-<a name="(line599)"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for ATTTYPE,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line600)"></a> <font color=Blue>-- `adjustErr` (++"\nLooking for ATTTYPE (CDATA, tokenized, or enumerated")</font>-<a name="(line601)"></a>-<a name="(line602)"></a><a name="tokenizedtype"></a>tokenizedtype <font color=Red>::</font> XParser TokenizedType-<a name="(line603)"></a>tokenizedtype <font color=Red>=</font>-<a name="(line604)"></a> oneOf <font color=Red>[</font> <font color=Cyan>(</font> word <font color=Magenta>"ID"</font> <font color=Cyan>>></font> return ID<font color=Cyan>)</font>-<a name="(line605)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"IDREF"</font> <font color=Cyan>>></font> return IDREF<font color=Cyan>)</font>-<a name="(line606)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"IDREFS"</font> <font color=Cyan>>></font> return IDREFS<font color=Cyan>)</font>-<a name="(line607)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"ENTITY"</font> <font color=Cyan>>></font> return ENTITY<font color=Cyan>)</font>-<a name="(line608)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"ENTITIES"</font> <font color=Cyan>>></font> return ENTITIES<font color=Cyan>)</font>-<a name="(line609)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"NMTOKEN"</font> <font color=Cyan>>></font> return NMTOKEN<font color=Cyan>)</font>-<a name="(line610)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"NMTOKENS"</font> <font color=Cyan>>></font> return NMTOKENS<font color=Cyan>)</font>-<a name="(line611)"></a> <font color=Red>]</font> <font color=Cyan>`onFail`</font>-<a name="(line612)"></a> <font color=Green><u>do</u></font> <font color=Cyan>{</font> t <font color=Red><-</font> next-<a name="(line613)"></a> <font color=Cyan>;</font> failP <font color=Cyan>(</font><font color=Magenta>"Expected one of"</font>-<a name="(line614)"></a> <font color=Cyan>++</font><font color=Magenta>" (ID, IDREF, IDREFS, ENTITY, ENTITIES, NMTOKEN, NMTOKENS)"</font>-<a name="(line615)"></a> <font color=Cyan>++</font><font color=Magenta>"\nbut got "</font><font color=Cyan>++</font>show t<font color=Cyan>)</font>-<a name="(line616)"></a> <font color=Cyan>}</font>-<a name="(line617)"></a><font color=Blue>-- `adjustErr` (++"\nLooking for a tokenized type:\n\ </font>-<a name="(line618)"></a><font color=Blue>-- \ (ID, IDREF, IDREFS, ENTITY, ENTITIES, NMTOKEN, NMTOKENS)")</font>-<a name="(line619)"></a>-<a name="(line620)"></a><a name="enumeratedtype"></a>enumeratedtype <font color=Red>::</font> XParser EnumeratedType-<a name="(line621)"></a>enumeratedtype <font color=Red>=</font>-<a name="(line622)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"NOTATION"</font><font color=Cyan>,</font> notationtype <font color=Cyan>>>=</font> return <font color=Cyan>.</font> NotationType<font color=Cyan>)</font>-<a name="(line623)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"enumerated"</font><font color=Cyan>,</font> enumeration <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Enumeration<font color=Cyan>)</font>-<a name="(line624)"></a> <font color=Red>]</font>-<a name="(line625)"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for an enumerated or NOTATION type,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line626)"></a>-<a name="(line627)"></a><a name="notationtype"></a>notationtype <font color=Red>::</font> XParser NotationType-<a name="(line628)"></a>notationtype <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line629)"></a> word <font color=Magenta>"NOTATION"</font>-<a name="(line630)"></a> bracket <font color=Cyan>(</font>tok TokBraOpen<font color=Cyan>)</font> <font color=Cyan>(</font>blank <font color=Cyan>(</font>tok TokBraClose<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line631)"></a> <font color=Cyan>(</font>peRef name <font color=Cyan>`sepBy1`</font> peRef <font color=Cyan>(</font>tok TokPipe<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line632)"></a>-<a name="(line633)"></a><a name="enumeration"></a>enumeration <font color=Red>::</font> XParser Enumeration-<a name="(line634)"></a>enumeration <font color=Red>=</font>-<a name="(line635)"></a> bracket <font color=Cyan>(</font>tok TokBraOpen<font color=Cyan>)</font> <font color=Cyan>(</font>blank <font color=Cyan>(</font>tok TokBraClose<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line636)"></a> <font color=Cyan>(</font>peRef nmtoken <font color=Cyan>`sepBy1`</font> blank <font color=Cyan>(</font>peRef <font color=Cyan>(</font>tok TokPipe<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line637)"></a>-<a name="(line638)"></a><a name="defaultdecl"></a>defaultdecl <font color=Red>::</font> XParser DefaultDecl-<a name="(line639)"></a>defaultdecl <font color=Red>=</font>-<a name="(line640)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"REQUIRED"</font><font color=Cyan>,</font> tok TokHash <font color=Cyan>>></font> word <font color=Magenta>"REQUIRED"</font> <font color=Cyan>>></font> return REQUIRED<font color=Cyan>)</font>-<a name="(line641)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"IMPLIED"</font><font color=Cyan>,</font> tok TokHash <font color=Cyan>>></font> word <font color=Magenta>"IMPLIED"</font> <font color=Cyan>>></font> return IMPLIED<font color=Cyan>)</font>-<a name="(line642)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"FIXED"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> f <font color=Red><-</font> maybe <font color=Cyan>(</font>tok TokHash <font color=Cyan>>></font> word <font color=Magenta>"FIXED"</font>-<a name="(line643)"></a> <font color=Cyan>>></font> return FIXED<font color=Cyan>)</font>-<a name="(line644)"></a> a <font color=Red><-</font> peRef attvalue-<a name="(line645)"></a> return <font color=Cyan>(</font>DefaultTo a f<font color=Cyan>)</font> <font color=Cyan>)</font>-<a name="(line646)"></a> <font color=Red>]</font>-<a name="(line647)"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for an attribute default decl,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line648)"></a><font color=Blue>-- `adjustErr` (++"\nLooking for an attribute default decl:\n\ </font>-<a name="(line649)"></a><font color=Blue>-- \ (REQUIRED, IMPLIED, FIXED)")</font>-<a name="(line650)"></a>-<a name="(line651)"></a><a name="conditionalsect"></a>conditionalsect <font color=Red>::</font> XParser ConditionalSect-<a name="(line652)"></a>conditionalsect <font color=Red>=</font> oneOf'-<a name="(line653)"></a> <font color=Red>[</font> <font color=Cyan>(</font> <font color=Magenta>"INCLUDE"</font>-<a name="(line654)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> tok TokSectionOpen-<a name="(line655)"></a> peRef <font color=Cyan>(</font>tok <font color=Cyan>(</font>TokSection INCLUDEx<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line656)"></a> p <font color=Red><-</font> posn-<a name="(line657)"></a> tok TokSqOpen <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing [ after INCLUDE"</font>-<a name="(line658)"></a> i <font color=Red><-</font> many <font color=Cyan>(</font>peRef extsubsetdecl<font color=Cyan>)</font>-<a name="(line659)"></a> tok TokSectionClose-<a name="(line660)"></a> <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"missing ]]> for INCLUDE section"</font>-<a name="(line661)"></a> <font color=Cyan>++</font><font color=Magenta>"\n begun at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>-<a name="(line662)"></a> return <font color=Cyan>(</font>IncludeSect i<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line663)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"IGNORE"</font>-<a name="(line664)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> tok TokSectionOpen-<a name="(line665)"></a> peRef <font color=Cyan>(</font>tok <font color=Cyan>(</font>TokSection IGNOREx<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line666)"></a> p <font color=Red><-</font> posn-<a name="(line667)"></a> tok TokSqOpen <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing [ after IGNORE"</font>-<a name="(line668)"></a> i <font color=Red><-</font> many newIgnore <font color=Blue>-- many ignoresectcontents</font>-<a name="(line669)"></a> tok TokSectionClose-<a name="(line670)"></a> <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"missing ]]> for IGNORE section"</font>-<a name="(line671)"></a> <font color=Cyan>++</font><font color=Magenta>"\n begun at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>-<a name="(line672)"></a> return <font color=Cyan>(</font>IgnoreSect []<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line673)"></a> <font color=Red>]</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"in a conditional section,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line674)"></a>-<a name="(line675)"></a><a name="newIgnore"></a>newIgnore <font color=Red>::</font> XParser Ignore-<a name="(line676)"></a>newIgnore <font color=Red>=</font>-<a name="(line677)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokSectionOpen-<a name="(line678)"></a> many newIgnore <font color=Cyan>`debug`</font> <font color=Magenta>"IGNORING conditional section"</font>-<a name="(line679)"></a> tok TokSectionClose-<a name="(line680)"></a> return Ignore <font color=Cyan>`debug`</font> <font color=Magenta>"end of IGNORED conditional section"</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line681)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> t <font color=Red><-</font> nottok <font color=Red>[</font>TokSectionOpen<font color=Cyan>,</font>TokSectionClose<font color=Red>]</font>-<a name="(line682)"></a> return Ignore <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ignoring: "</font><font color=Cyan>++</font>show t<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line683)"></a>-<a name="(line684)"></a><a name="ignoresectcontents"></a><font color=Blue>--- obsolete?</font>-<a name="(line685)"></a>ignoresectcontents <font color=Red>::</font> XParser IgnoreSectContents-<a name="(line686)"></a>ignoresectcontents <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line687)"></a> i <font color=Red><-</font> ignore-<a name="(line688)"></a> is <font color=Red><-</font> many <font color=Cyan>(</font><font color=Green><u>do</u></font> tok TokSectionOpen-<a name="(line689)"></a> ic <font color=Red><-</font> ignoresectcontents-<a name="(line690)"></a> tok TokSectionClose-<a name="(line691)"></a> ig <font color=Red><-</font> ignore-<a name="(line692)"></a> return <font color=Cyan>(</font>ic<font color=Cyan>,</font>ig<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line693)"></a> return <font color=Cyan>(</font>IgnoreSectContents i is<font color=Cyan>)</font>-<a name="(line694)"></a>-<a name="(line695)"></a><a name="ignore"></a>ignore <font color=Red>::</font> XParser Ignore-<a name="(line696)"></a>ignore <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line697)"></a> is <font color=Red><-</font> many1 <font color=Cyan>(</font>nottok <font color=Red>[</font>TokSectionOpen<font color=Cyan>,</font>TokSectionClose<font color=Red>]</font><font color=Cyan>)</font>-<a name="(line698)"></a> return Ignore <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ignored all of: "</font><font color=Cyan>++</font>show is<font color=Cyan>)</font>-<a name="(line699)"></a><font color=Blue>----</font>-<a name="(line700)"></a>-<a name="(line701)"></a><a name="reference"></a><font color=Blue>-- | Return either a general entity reference, or a character reference.</font>-<a name="(line702)"></a>reference <font color=Red>::</font> XParser Reference-<a name="(line703)"></a>reference <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line704)"></a> bracket <font color=Cyan>(</font>tok TokAmp<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSemi<font color=Cyan>)</font> <font color=Cyan>(</font>freetext <font color=Cyan>>>=</font> val<font color=Cyan>)</font>-<a name="(line705)"></a> <font color=Green><u>where</u></font>-<a name="(line706)"></a> val <font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font><font color=Magenta>'x'</font><font color=Red><b>:</b></font>i<font color=Cyan>)</font> <font color=Red>|</font> all isHexDigit i-<a name="(line707)"></a> <font color=Red>=</font> return <font color=Cyan>.</font> RefChar <font color=Cyan>.</font> fst <font color=Cyan>.</font> head <font color=Cyan>.</font> readHex <font color=Cyan>$</font> i-<a name="(line708)"></a> val <font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>i<font color=Cyan>)</font> <font color=Red>|</font> all isDigit i-<a name="(line709)"></a> <font color=Red>=</font> return <font color=Cyan>.</font> RefChar <font color=Cyan>.</font> fst <font color=Cyan>.</font> head <font color=Cyan>.</font> readDec <font color=Cyan>$</font> i-<a name="(line710)"></a> val name <font color=Red>=</font> return <font color=Cyan>.</font> RefEntity <font color=Cyan>$</font> name-<a name="(line711)"></a>-<a name="(line712)"></a><font color=Blue>{- -- following is incorrect-<a name="(line713)"></a>reference =-<a name="(line714)"></a> ( charref >>= return . RefChar) `onFail`-<a name="(line715)"></a> ( entityref >>= return . RefEntity)-<a name="(line716)"></a>-<a name="(line717)"></a>entityref :: XParser EntityRef-<a name="(line718)"></a>entityref = do-<a name="(line719)"></a> bracket (tok TokAmp) (tok TokSemi) name-<a name="(line720)"></a>-<a name="(line721)"></a>charref :: XParser CharRef-<a name="(line722)"></a>charref = do-<a name="(line723)"></a> bracket (tok TokAmp) (tok TokSemi) (freetext >>= readCharVal)-<a name="(line724)"></a> where-<a name="(line725)"></a> readCharVal ('#':'x':i) = return . fst . head . readHex $ i-<a name="(line726)"></a> readCharVal ('#':i) = return . fst . head . readDec $ i-<a name="(line727)"></a> readCharVal _ = mzero-<a name="(line728)"></a>-}</font>-<a name="(line729)"></a>-<a name="(line730)"></a><a name="pereference"></a>pereference <font color=Red>::</font> XParser PEReference-<a name="(line731)"></a>pereference <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line732)"></a><font color=Blue>-- bracket (tok TokPercent) (tok TokSemi) nmtoken</font>-<a name="(line733)"></a> tok TokPercent-<a name="(line734)"></a> p <font color=Red><-</font> nmtoken-<a name="(line735)"></a> tok TokSemi-<a name="(line736)"></a> return p-<a name="(line737)"></a>-<a name="(line738)"></a><a name="entitydecl"></a>entitydecl <font color=Red>::</font> XParser EntityDecl-<a name="(line739)"></a>entitydecl <font color=Red>=</font>-<a name="(line740)"></a> <font color=Cyan>(</font> gedecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EntityGEDecl<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line741)"></a> <font color=Cyan>(</font> pedecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EntityPEDecl<font color=Cyan>)</font>-<a name="(line742)"></a>-<a name="(line743)"></a><a name="gedecl"></a>gedecl <font color=Red>::</font> XParser GEDecl-<a name="(line744)"></a>gedecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line745)"></a> tok TokSpecialOpen-<a name="(line746)"></a> tok <font color=Cyan>(</font>TokSpecial ENTITYx<font color=Cyan>)</font>-<a name="(line747)"></a> n <font color=Red><-</font> name-<a name="(line748)"></a> e <font color=Red><-</font> entitydef <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in general entity defn "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line749)"></a> tok TokAnyClose <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"expected > terminating G ENTITY decl "</font><font color=Cyan>++</font>n<font color=Cyan>)</font>-<a name="(line750)"></a> stUpdate <font color=Cyan>(</font>addGE n e<font color=Cyan>)</font> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"added GE defn &"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font>-<a name="(line751)"></a> return <font color=Cyan>(</font>GEDecl n e<font color=Cyan>)</font>-<a name="(line752)"></a>-<a name="(line753)"></a><a name="pedecl"></a>pedecl <font color=Red>::</font> XParser PEDecl-<a name="(line754)"></a>pedecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line755)"></a> tok TokSpecialOpen-<a name="(line756)"></a> tok <font color=Cyan>(</font>TokSpecial ENTITYx<font color=Cyan>)</font>-<a name="(line757)"></a> tok TokPercent-<a name="(line758)"></a> n <font color=Red><-</font> name-<a name="(line759)"></a> e <font color=Red><-</font> pedef <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in parameter entity defn "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line760)"></a> tok TokAnyClose <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"expected > terminating P ENTITY decl "</font><font color=Cyan>++</font>n<font color=Cyan>)</font>-<a name="(line761)"></a> stUpdate <font color=Cyan>(</font>addPE n e<font color=Cyan>)</font> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"added PE defn %"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";\n"</font><font color=Cyan>++</font>show e<font color=Cyan>)</font>-<a name="(line762)"></a> return <font color=Cyan>(</font>PEDecl n e<font color=Cyan>)</font>-<a name="(line763)"></a>-<a name="(line764)"></a><a name="entitydef"></a>entitydef <font color=Red>::</font> XParser EntityDef-<a name="(line765)"></a>entitydef <font color=Red>=</font>-<a name="(line766)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"entityvalue"</font><font color=Cyan>,</font> entityvalue <font color=Cyan>>>=</font> return <font color=Cyan>.</font> DefEntityValue<font color=Cyan>)</font>-<a name="(line767)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"external"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> eid <font color=Red><-</font> externalid-<a name="(line768)"></a> ndd <font color=Red><-</font> maybe ndatadecl-<a name="(line769)"></a> return <font color=Cyan>(</font>DefExternalID eid ndd<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line770)"></a> <font color=Red>]</font>-<a name="(line771)"></a>-<a name="(line772)"></a><a name="pedef"></a>pedef <font color=Red>::</font> XParser PEDef-<a name="(line773)"></a>pedef <font color=Red>=</font>-<a name="(line774)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"entityvalue"</font><font color=Cyan>,</font> entityvalue <font color=Cyan>>>=</font> return <font color=Cyan>.</font> PEDefEntityValue<font color=Cyan>)</font>-<a name="(line775)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"externalid"</font><font color=Cyan>,</font> externalid <font color=Cyan>>>=</font> return <font color=Cyan>.</font> PEDefExternalID<font color=Cyan>)</font>-<a name="(line776)"></a> <font color=Red>]</font>-<a name="(line777)"></a>-<a name="(line778)"></a><a name="externalid"></a>externalid <font color=Red>::</font> XParser ExternalID-<a name="(line779)"></a>externalid <font color=Red>=</font>-<a name="(line780)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"SYSTEM"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> word <font color=Magenta>"SYSTEM"</font>-<a name="(line781)"></a> s <font color=Red><-</font> systemliteral-<a name="(line782)"></a> return <font color=Cyan>(</font>SYSTEM s<font color=Cyan>)</font> <font color=Cyan>)</font>-<a name="(line783)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"PUBLIC"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> word <font color=Magenta>"PUBLIC"</font>-<a name="(line784)"></a> p <font color=Red><-</font> pubidliteral-<a name="(line785)"></a> s <font color=Red><-</font> systemliteral-<a name="(line786)"></a> return <font color=Cyan>(</font>PUBLIC p s<font color=Cyan>)</font> <font color=Cyan>)</font>-<a name="(line787)"></a> <font color=Red>]</font>-<a name="(line788)"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for an external id,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line789)"></a>-<a name="(line790)"></a><a name="ndatadecl"></a>ndatadecl <font color=Red>::</font> XParser NDataDecl-<a name="(line791)"></a>ndatadecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line792)"></a> word <font color=Magenta>"NDATA"</font>-<a name="(line793)"></a> n <font color=Red><-</font> name-<a name="(line794)"></a> return <font color=Cyan>(</font>NDATA n<font color=Cyan>)</font>-<a name="(line795)"></a>-<a name="(line796)"></a><a name="textdecl"></a>textdecl <font color=Red>::</font> XParser TextDecl-<a name="(line797)"></a>textdecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line798)"></a> tok TokPIOpen-<a name="(line799)"></a> <font color=Cyan>(</font>word <font color=Magenta>"xml"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"XML"</font><font color=Cyan>)</font>-<a name="(line800)"></a> v <font color=Red><-</font> maybe versioninfo-<a name="(line801)"></a> e <font color=Red><-</font> encodingdecl-<a name="(line802)"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failP <font color=Magenta>"expected ?> terminating text decl"</font>-<a name="(line803)"></a> return <font color=Cyan>(</font>TextDecl v e<font color=Cyan>)</font>-<a name="(line804)"></a>-<a name="(line805)"></a><a name="extparsedent"></a>extparsedent <font color=Red>::</font> XParser <font color=Cyan>(</font>ExtParsedEnt Posn<font color=Cyan>)</font>-<a name="(line806)"></a>extparsedent <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line807)"></a> t <font color=Red><-</font> maybe textdecl-<a name="(line808)"></a> c <font color=Red><-</font> content-<a name="(line809)"></a> return <font color=Cyan>(</font>ExtParsedEnt t c<font color=Cyan>)</font>-<a name="(line810)"></a>-<a name="(line811)"></a><a name="extpe"></a>extpe <font color=Red>::</font> XParser ExtPE-<a name="(line812)"></a>extpe <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line813)"></a> t <font color=Red><-</font> maybe textdecl-<a name="(line814)"></a> e <font color=Red><-</font> many <font color=Cyan>(</font>peRef extsubsetdecl<font color=Cyan>)</font>-<a name="(line815)"></a> return <font color=Cyan>(</font>ExtPE t e<font color=Cyan>)</font>-<a name="(line816)"></a>-<a name="(line817)"></a><a name="encodingdecl"></a>encodingdecl <font color=Red>::</font> XParser EncodingDecl-<a name="(line818)"></a>encodingdecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line819)"></a> <font color=Cyan>(</font>word <font color=Magenta>"encoding"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"ENCODING"</font><font color=Cyan>)</font>-<a name="(line820)"></a> tok TokEqual <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"expected = in 'encoding' decl"</font>-<a name="(line821)"></a> f <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext-<a name="(line822)"></a> return <font color=Cyan>(</font>EncodingDecl f<font color=Cyan>)</font>-<a name="(line823)"></a>-<a name="(line824)"></a><a name="notationdecl"></a>notationdecl <font color=Red>::</font> XParser NotationDecl-<a name="(line825)"></a>notationdecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line826)"></a> tok TokSpecialOpen-<a name="(line827)"></a> tok <font color=Cyan>(</font>TokSpecial NOTATIONx<font color=Cyan>)</font>-<a name="(line828)"></a> n <font color=Red><-</font> name-<a name="(line829)"></a> e <font color=Red><-</font> either externalid publicid-<a name="(line830)"></a> tok TokAnyClose <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"expected > terminating NOTATION decl "</font><font color=Cyan>++</font>n<font color=Cyan>)</font>-<a name="(line831)"></a> return <font color=Cyan>(</font>NOTATION n e<font color=Cyan>)</font>-<a name="(line832)"></a>-<a name="(line833)"></a><a name="publicid"></a>publicid <font color=Red>::</font> XParser PublicID-<a name="(line834)"></a>publicid <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line835)"></a> word <font color=Magenta>"PUBLIC"</font>-<a name="(line836)"></a> p <font color=Red><-</font> pubidliteral-<a name="(line837)"></a> return <font color=Cyan>(</font>PUBLICID p<font color=Cyan>)</font>-<a name="(line838)"></a>-<a name="(line839)"></a><a name="entityvalue"></a>entityvalue <font color=Red>::</font> XParser EntityValue-<a name="(line840)"></a>entityvalue <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line841)"></a> <font color=Blue>-- evs <- bracket (tok TokQuote) (tok TokQuote) (many (peRef ev))</font>-<a name="(line842)"></a> tok TokQuote-<a name="(line843)"></a> pn <font color=Red><-</font> posn-<a name="(line844)"></a> evs <font color=Red><-</font> many ev-<a name="(line845)"></a> tok TokQuote <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"expected quote to terminate entityvalue"</font>-<a name="(line846)"></a> <font color=Blue>-- quoted text must be rescanned for possible PERefs</font>-<a name="(line847)"></a> st <font color=Red><-</font> stGet-<a name="(line848)"></a> Prelude<font color=Cyan>.</font>either failBad <font color=Cyan>(</font>return <font color=Cyan>.</font> EntityValue<font color=Cyan>)</font> <font color=Cyan>.</font> fst3 <font color=Cyan>$</font>-<a name="(line849)"></a> <font color=Cyan>(</font>runParser <font color=Cyan>(</font>many ev<font color=Cyan>)</font> st-<a name="(line850)"></a> <font color=Cyan>(</font>reLexEntityValue <font color=Cyan>(</font><font color=Red>\</font>s<font color=Red>-></font> stringify <font color=Cyan>(</font>lookupPE s st<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line851)"></a> pn-<a name="(line852)"></a> <font color=Cyan>(</font>flattenEV <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line853)"></a> <font color=Green><u>where</u></font>-<a name="(line854)"></a> stringify <font color=Cyan>(</font>Just <font color=Cyan>(</font>PEDefEntityValue ev<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> Just <font color=Cyan>(</font>flattenEV ev<font color=Cyan>)</font>-<a name="(line855)"></a> stringify <font color=Green><u>_</u></font> <font color=Red>=</font> Nothing-<a name="(line856)"></a>-<a name="(line857)"></a><a name="ev"></a>ev <font color=Red>::</font> XParser EV-<a name="(line858)"></a>ev <font color=Red>=</font>-<a name="(line859)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"string"</font><font color=Cyan>,</font> <font color=Cyan>(</font>string<font color=Cyan>`onFail`</font>freetext<font color=Cyan>)</font> <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EVString<font color=Cyan>)</font>-<a name="(line860)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"reference"</font><font color=Cyan>,</font> reference <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EVRef<font color=Cyan>)</font>-<a name="(line861)"></a> <font color=Red>]</font>-<a name="(line862)"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for entity value,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line863)"></a>-<a name="(line864)"></a><a name="attvalue"></a>attvalue <font color=Red>::</font> XParser AttValue-<a name="(line865)"></a>attvalue <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line866)"></a> avs <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font>-<a name="(line867)"></a> <font color=Cyan>(</font>many <font color=Cyan>(</font>either freetext reference<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line868)"></a> return <font color=Cyan>(</font>AttValue avs<font color=Cyan>)</font>-<a name="(line869)"></a>-<a name="(line870)"></a><a name="systemliteral"></a>systemliteral <font color=Red>::</font> XParser SystemLiteral-<a name="(line871)"></a>systemliteral <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line872)"></a> s <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext-<a name="(line873)"></a> return <font color=Cyan>(</font>SystemLiteral s<font color=Cyan>)</font> <font color=Blue>-- note: refs &...; not permitted</font>-<a name="(line874)"></a>-<a name="(line875)"></a><a name="pubidliteral"></a>pubidliteral <font color=Red>::</font> XParser PubidLiteral-<a name="(line876)"></a>pubidliteral <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line877)"></a> s <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext-<a name="(line878)"></a> return <font color=Cyan>(</font>PubidLiteral s<font color=Cyan>)</font> <font color=Blue>-- note: freetext is too liberal here</font>-<a name="(line879)"></a>-<a name="(line880)"></a><a name="chardata"></a><font color=Blue>-- | Return parsed freetext (i.e. until the next markup)</font>-<a name="(line881)"></a>chardata <font color=Red>::</font> XParser CharData-<a name="(line882)"></a>chardata <font color=Red>=</font> freetext-<a name="(line883)"></a>-</pre>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/Parse.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>{-# OPTIONS -cpp #-}</font>+<a name="line-2"></a><font color=Blue>-- | A non-validating XML parser. For the input grammar, see</font>+<a name="line-3"></a><font color=Blue>-- <<a href="http://www.w3.org/TR/REC-xml">http://www.w3.org/TR/REC-xml</a>>.</font>+<a name="line-4"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Parse+<a name="line-5"></a> <font color=Cyan>(</font>+<a name="line-6"></a> <font color=Blue>-- * Parse a whole document</font>+<a name="line-7"></a> xmlParse<font color=Cyan>,</font> xmlParse'+<a name="line-8"></a> <font color=Blue>-- * Parse just a DTD</font>+<a name="line-9"></a> <font color=Cyan>,</font> dtdParse<font color=Cyan>,</font> dtdParse'+<a name="line-10"></a> <font color=Blue>-- * Parse a partial document</font>+<a name="line-11"></a> <font color=Cyan>,</font> xmlParseWith+<a name="line-12"></a> <font color=Blue>-- * Individual parsers for use with /xmlParseWith/ and module SAX</font>+<a name="line-13"></a> <font color=Cyan>,</font> document<font color=Cyan>,</font> element<font color=Cyan>,</font> content+<a name="line-14"></a> <font color=Cyan>,</font> comment<font color=Cyan>,</font> cdsect<font color=Cyan>,</font> chardata+<a name="line-15"></a> <font color=Cyan>,</font> reference<font color=Cyan>,</font> doctypedecl+<a name="line-16"></a> <font color=Cyan>,</font> processinginstruction+<a name="line-17"></a> <font color=Cyan>,</font> elemtag<font color=Cyan>,</font> name<font color=Cyan>,</font> tok+<a name="line-18"></a> <font color=Cyan>,</font> elemOpenTag<font color=Cyan>,</font> elemCloseTag+<a name="line-19"></a> <font color=Cyan>,</font> emptySTs<font color=Cyan>,</font> XParser+<a name="line-20"></a> <font color=Blue>-- * These general utility functions don't belong here</font>+<a name="line-21"></a> <font color=Cyan>,</font> fst3<font color=Cyan>,</font> snd3<font color=Cyan>,</font> thd3+<a name="line-22"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-23"></a>+<a name="line-24"></a><font color=Blue>-- An XML parser, written using a slightly extended version of the</font>+<a name="line-25"></a><font color=Blue>-- Hutton/Meijer parser combinators. The input is tokenised internally</font>+<a name="line-26"></a><font color=Blue>-- by the lexer xmlLex. Whilst parsing, we gather a symbol</font>+<a name="line-27"></a><font color=Blue>-- table of entity references. PERefs must be defined before use, so we</font>+<a name="line-28"></a><font color=Blue>-- expand their uses as we encounter them, forcing the remainder of the</font>+<a name="line-29"></a><font color=Blue>-- input to be re-lexed and re-parsed. GERefs are simply stored for</font>+<a name="line-30"></a><font color=Blue>-- later retrieval.</font>+<a name="line-31"></a>+<a name="line-32"></a><font color=Green><u>import</u></font> Prelude hiding <font color=Cyan>(</font>either<font color=Cyan>,</font>maybe<font color=Cyan>,</font>sequence<font color=Cyan>)</font>+<a name="line-33"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Prelude <font color=Cyan>(</font>either<font color=Cyan>)</font>+<a name="line-34"></a><font color=Green><u>import</u></font> Maybe hiding <font color=Cyan>(</font>maybe<font color=Cyan>)</font>+<a name="line-35"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>intersperse<font color=Cyan>)</font> <font color=Blue>-- debugging only</font>+<a name="line-36"></a><font color=Green><u>import</u></font> Char <font color=Cyan>(</font>isSpace<font color=Cyan>,</font>isDigit<font color=Cyan>,</font>isHexDigit<font color=Cyan>)</font>+<a name="line-37"></a><font color=Green><u>import</u></font> Monad hiding <font color=Cyan>(</font>sequence<font color=Cyan>)</font>+<a name="line-38"></a><font color=Green><u>import</u></font> Numeric <font color=Cyan>(</font>readDec<font color=Cyan>,</font>readHex<font color=Cyan>)</font>+<a name="line-39"></a>+<a name="line-40"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-41"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Posn+<a name="line-42"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Lex+<a name="line-43"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>Poly<font color=Cyan>.</font>NoLeak<font color=Cyan>.</font>State+<a name="line-44"></a>+<a name="line-45"></a><font color=Green><u>import</u></font> System<font color=Cyan>.</font>FilePath <font color=Cyan>(</font>combine<font color=Cyan>,</font> dropFileName<font color=Cyan>)</font>+<a name="line-46"></a>+<a name="line-47"></a>+<a name="line-48"></a><font color=Magenta><em>#if ( defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 502 ) || \</em></font>+<a name="line-49"></a> <font color=Cyan>(</font> defined<font color=Cyan>(</font><b><font color=Magenta>__NHC__</font></b><font color=Cyan>)</font> <font color=Cyan>&&</font> <b><font color=Magenta>__NHC__</font></b> <font color=Cyan>></font> <font color=Magenta>114</font> <font color=Cyan>)</font> <font color=Cyan>||</font> defined<font color=Cyan>(</font><b><font color=Magenta>__HUGS__</font></b><font color=Cyan>)</font>+<a name="line-50"></a><font color=Green><u>import</u></font> System<font color=Cyan>.</font>IO<font color=Cyan>.</font>Unsafe <font color=Cyan>(</font>unsafePerformIO<font color=Cyan>)</font>+<a name="line-51"></a><font color=Magenta><em>#elif defined(__GLASGOW_HASKELL__)</em></font>+<a name="line-52"></a><font color=Green><u>import</u></font> IOExts <font color=Cyan>(</font>unsafePerformIO<font color=Cyan>)</font>+<a name="line-53"></a><font color=Magenta><em>#elif defined(__NHC__)</em></font>+<a name="line-54"></a><font color=Green><u>import</u></font> IOExtras <font color=Cyan>(</font>unsafePerformIO<font color=Cyan>)</font>+<a name="line-55"></a><font color=Magenta><em>#elif defined(__HBC__)</em></font>+<a name="line-56"></a><font color=Green><u>import</u></font> UnsafePerformIO+<a name="line-57"></a><font color=Magenta><em>#endif</em></font>+<a name="line-58"></a>+<a name="line-59"></a><font color=Blue>-- #define DEBUG</font>+<a name="line-60"></a>+<a name="line-61"></a><font color=Magenta><em>#if defined(DEBUG)</em></font>+<a name="line-62"></a><font color=Magenta><em># if ( defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 502 ) || \</em></font>+<a name="line-63"></a> <font color=Cyan>(</font> defined<font color=Cyan>(</font><b><font color=Magenta>__NHC__</font></b><font color=Cyan>)</font> <font color=Cyan>&&</font> <b><font color=Magenta>__NHC__</font></b> <font color=Cyan>></font> <font color=Magenta>114</font> <font color=Cyan>)</font> <font color=Cyan>||</font> defined<font color=Cyan>(</font><b><font color=Magenta>__HUGS__</font></b><font color=Cyan>)</font>+<a name="line-64"></a><font color=Green><u>import</u></font> Debug<font color=Cyan>.</font>Trace<font color=Cyan>(</font>trace<font color=Cyan>)</font>+<a name="line-65"></a><font color=Magenta><em># elif defined(__GLASGOW_HASKELL__)</em></font>+<a name="line-66"></a><font color=Green><u>import</u></font> IOExts<font color=Cyan>(</font>trace<font color=Cyan>)</font>+<a name="line-67"></a><font color=Magenta><em># elif defined(__NHC__) || defined(__HBC__)</em></font>+<a name="line-68"></a><font color=Green><u>import</u></font> NonStdTrace+<a name="line-69"></a><font color=Magenta><em># endif</em></font>+<a name="line-70"></a><a name="debug"></a><font color=Blue>debug</font> <font color=Red>::</font> a <font color=Red>-></font> String <font color=Red>-></font> a+<a name="line-71"></a><a name="debug"></a><font color=Blue>v</font> <font color=Cyan>`debug`</font> s <font color=Red>=</font> trace s v+<a name="line-72"></a><font color=Magenta><em>#else</em></font>+<a name="line-73"></a><a name="debug"></a><font color=Blue>v</font> <font color=Cyan>`debug`</font> s <font color=Red>=</font> v+<a name="line-74"></a><font color=Magenta><em>#endif</em></font>+<a name="line-75"></a>+<a name="line-76"></a>+<a name="line-77"></a><a name="xmlParse"></a><font color=Blue>-- | To parse a whole document, @xmlParse file content@ takes a filename</font>+<a name="line-78"></a><font color=Blue>-- (for generating error reports) and the string content of that file.</font>+<a name="line-79"></a><font color=Blue>-- A parse error causes program failure, with message to stderr.</font>+<a name="line-80"></a><font color=Blue>xmlParse</font> <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Document Posn+<a name="line-81"></a>+<a name="line-82"></a><a name="xmlParse'"></a><font color=Blue>-- | To parse a whole document, @xmlParse' file content@ takes a filename</font>+<a name="line-83"></a><font color=Blue>-- (for generating error reports) and the string content of that file.</font>+<a name="line-84"></a><font color=Blue>-- Any parse error message is passed back to the caller through the</font>+<a name="line-85"></a><font color=Blue>-- @Either@ type.</font>+<a name="line-86"></a><font color=Blue>xmlParse'</font> <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Either String <font color=Cyan>(</font>Document Posn<font color=Cyan>)</font>+<a name="line-87"></a>+<a name="line-88"></a><a name="dtdParse"></a><font color=Blue>-- | To parse just a DTD, @dtdParse file content@ takes a filename</font>+<a name="line-89"></a><font color=Blue>-- (for generating error reports) and the string content of that</font>+<a name="line-90"></a><font color=Blue>-- file. If no DTD was found, you get @Nothing@ rather than an error.</font>+<a name="line-91"></a><font color=Blue>-- However, if a DTD is found but contains errors, the program crashes.</font>+<a name="line-92"></a><font color=Blue>dtdParse</font> <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Maybe DocTypeDecl+<a name="line-93"></a>+<a name="line-94"></a><a name="dtdParse'"></a><font color=Blue>-- | To parse just a DTD, @dtdParse' file content@ takes a filename</font>+<a name="line-95"></a><font color=Blue>-- (for generating error reports) and the string content of that</font>+<a name="line-96"></a><font color=Blue>-- file. If no DTD was found, you get @Right Nothing@.</font>+<a name="line-97"></a><font color=Blue>-- If a DTD was found but contains errors, you get a @Left message@.</font>+<a name="line-98"></a><font color=Blue>dtdParse'</font> <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Either String <font color=Cyan>(</font>Maybe DocTypeDecl<font color=Cyan>)</font>+<a name="line-99"></a>+<a name="line-100"></a><font color=Blue>xmlParse</font> name <font color=Red>=</font> Prelude<font color=Cyan>.</font>either error id <font color=Cyan>.</font> xmlParse' name+<a name="line-101"></a><font color=Blue>dtdParse</font> name <font color=Red>=</font> Prelude<font color=Cyan>.</font>either error id <font color=Cyan>.</font> dtdParse' name+<a name="line-102"></a>+<a name="line-103"></a><font color=Blue>xmlParse'</font> name <font color=Red>=</font> fst3 <font color=Cyan>.</font> runParser <font color=Cyan>(</font>toEOF document<font color=Cyan>)</font> emptySTs <font color=Cyan>.</font> xmlLex name+<a name="line-104"></a><font color=Blue>dtdParse'</font> name <font color=Red>=</font> fst3 <font color=Cyan>.</font> runParser justDTD emptySTs <font color=Cyan>.</font> xmlLex name+<a name="line-105"></a>+<a name="line-106"></a><a name="toEOF"></a><font color=Blue>toEOF</font> <font color=Red>=</font> id <font color=Blue>-- there are other possible implementations...</font>+<a name="line-107"></a>+<a name="line-108"></a><a name="xmlParseWith"></a><font color=Blue>-- | To parse a partial document, e.g. from an XML-based stream protocol,</font>+<a name="line-109"></a><font color=Blue>-- where you may later want to get more document elements from the same</font>+<a name="line-110"></a><font color=Blue>-- stream. Arguments are: a parser for the item you want, and the</font>+<a name="line-111"></a><font color=Blue>-- already-lexed input to parse from. Returns the item you wanted</font>+<a name="line-112"></a><font color=Blue>-- (or an error message), plus the remainder of the input.</font>+<a name="line-113"></a><font color=Blue>xmlParseWith</font> <font color=Red>::</font> XParser a <font color=Red>-></font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>TokenT<font color=Cyan>)</font><font color=Red>]</font>+<a name="line-114"></a> <font color=Red>-></font> <font color=Cyan>(</font>Either String a<font color=Cyan>,</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>TokenT<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-115"></a><font color=Blue>xmlParseWith</font> p <font color=Red>=</font> <font color=Cyan>(</font><font color=Red>\</font><font color=Cyan>(</font>v<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font>s<font color=Cyan>)</font><font color=Red>-></font><font color=Cyan>(</font>v<font color=Cyan>,</font>s<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>.</font> runParser p emptySTs+<a name="line-116"></a>+<a name="line-117"></a>+<a name="line-118"></a><font color=Blue>---- Symbol table stuff ----</font>+<a name="line-119"></a>+<a name="line-120"></a><a name="SymTabs"></a><font color=Green><u>type</u></font> SymTabs <font color=Red>=</font> <font color=Cyan>(</font>SymTab PEDef<font color=Cyan>,</font> SymTab EntityDef<font color=Cyan>)</font>+<a name="line-121"></a>+<a name="line-122"></a><a name="emptySTs"></a><font color=Blue>-- | Some empty symbol tables for GE and PE references.</font>+<a name="line-123"></a><font color=Blue>emptySTs</font> <font color=Red>::</font> SymTabs+<a name="line-124"></a><font color=Blue>emptySTs</font> <font color=Red>=</font> <font color=Cyan>(</font>emptyST<font color=Cyan>,</font> emptyST<font color=Cyan>)</font>+<a name="line-125"></a>+<a name="line-126"></a><a name="addPE"></a><font color=Blue>addPE</font> <font color=Red>::</font> String <font color=Red>-></font> PEDef <font color=Red>-></font> SymTabs <font color=Red>-></font> SymTabs+<a name="line-127"></a><font color=Blue>addPE</font> n v <font color=Cyan>(</font>pe<font color=Cyan>,</font>ge<font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>addST n v pe<font color=Cyan>,</font> ge<font color=Cyan>)</font>+<a name="line-128"></a>+<a name="line-129"></a><a name="addGE"></a><font color=Blue>addGE</font> <font color=Red>::</font> String <font color=Red>-></font> EntityDef <font color=Red>-></font> SymTabs <font color=Red>-></font> SymTabs+<a name="line-130"></a><font color=Blue>addGE</font> n v <font color=Cyan>(</font>pe<font color=Cyan>,</font>ge<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>let</u></font> newge <font color=Red>=</font> addST n v ge <font color=Green><u>in</u></font> newge <font color=Cyan>`seq`</font> <font color=Cyan>(</font>pe<font color=Cyan>,</font> newge<font color=Cyan>)</font>+<a name="line-131"></a>+<a name="line-132"></a><a name="lookupPE"></a><font color=Blue>lookupPE</font> <font color=Red>::</font> String <font color=Red>-></font> SymTabs <font color=Red>-></font> Maybe PEDef+<a name="line-133"></a><font color=Blue>lookupPE</font> s <font color=Cyan>(</font>pe<font color=Cyan>,</font>ge<font color=Cyan>)</font> <font color=Red>=</font> lookupST s pe+<a name="line-134"></a>+<a name="line-135"></a><a name="flattenEV"></a><font color=Blue>flattenEV</font> <font color=Red>::</font> EntityValue <font color=Red>-></font> String+<a name="line-136"></a><font color=Blue>flattenEV</font> <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font> <font color=Red>=</font> concatMap flatten evs+<a name="line-137"></a> <font color=Green><u>where</u></font>+<a name="line-138"></a> flatten <font color=Cyan>(</font>EVString s<font color=Cyan>)</font> <font color=Red>=</font> s+<a name="line-139"></a> flatten <font color=Cyan>(</font>EVRef <font color=Cyan>(</font>RefEntity r<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"&"</font> <font color=Cyan>++</font>r<font color=Cyan>++</font><font color=Magenta>";"</font>+<a name="line-140"></a> flatten <font color=Cyan>(</font>EVRef <font color=Cyan>(</font>RefChar r<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"&#"</font><font color=Cyan>++</font>show r<font color=Cyan>++</font><font color=Magenta>";"</font>+<a name="line-141"></a> <font color=Blue>-- flatten (EVPERef n) = "%" ++n++";"</font>+<a name="line-142"></a>+<a name="line-143"></a>+<a name="line-144"></a><a name="fst3"></a><font color=Blue>---- Misc ----</font>+<a name="line-145"></a><font color=Blue>fst3</font> <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>-></font> a+<a name="line-146"></a><a name="snd3"></a><font color=Blue>snd3</font> <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>-></font> b+<a name="line-147"></a><a name="thd3"></a><font color=Blue>thd3</font> <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>-></font> c+<a name="line-148"></a>+<a name="line-149"></a><font color=Blue>fst3</font> <font color=Cyan>(</font>a<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> a+<a name="line-150"></a><font color=Blue>snd3</font> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font>a<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> a+<a name="line-151"></a><font color=Blue>thd3</font> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font>a<font color=Cyan>)</font> <font color=Red>=</font> a+<a name="line-152"></a>+<a name="line-153"></a>+<a name="line-154"></a><font color=Blue>---- Auxiliary Parsing Functions ----</font>+<a name="line-155"></a>+<a name="line-156"></a><a name="myBracket"></a><font color=Blue>-- | Parse a bracketed item, discarding the brackets AND NOT using adjustErrBad</font>+<a name="line-157"></a><font color=Blue>myBracket</font> <font color=Red>::</font> PolyParse p <font color=Red>=></font> p bra <font color=Red>-></font> p ket <font color=Red>-></font> p a <font color=Red>-></font> p a+<a name="line-158"></a><font color=Blue>myBracket</font> open close p <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-159"></a> <font color=Green><u>do</u></font> <font color=Cyan>{</font> open <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"Missing opening bracket:\n\t"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-160"></a> <font color=Cyan>;</font> p <font color=Cyan>`discard`</font> <font color=Cyan>(</font>close <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"Missing closing bracket:\n\t"</font><font color=Cyan>++</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-161"></a> <font color=Cyan>}</font>+<a name="line-162"></a>+<a name="line-163"></a><a name="XParser"></a><font color=Blue>-- | XParser is just a specialisation of the PolyState parser.</font>+<a name="line-164"></a><a name="XParser"></a><font color=Green><u>type</u></font> XParser a <font color=Red>=</font> Parser SymTabs <font color=Cyan>(</font>Posn<font color=Cyan>,</font>TokenT<font color=Cyan>)</font> a+<a name="line-165"></a>+<a name="line-166"></a><a name="tok"></a><font color=Blue>-- | Return the next token from the input only if it matches the given token.</font>+<a name="line-167"></a><font color=Blue>tok</font> <font color=Red>::</font> TokenT <font color=Red>-></font> XParser TokenT+<a name="line-168"></a><font color=Blue>tok</font> t <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t'<font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-169"></a> <font color=Green><u>case</u></font> t' <font color=Green><u>of</u></font> TokError <font color=Green><u>_</u></font> <font color=Red>-></font> report failBad <font color=Cyan>(</font>show t<font color=Cyan>)</font> p t'+<a name="line-170"></a> <font color=Green><u>_</u></font> <font color=Red>|</font> t'<font color=Cyan>==</font>t <font color=Red>-></font> return t+<a name="line-171"></a> <font color=Red>|</font> otherwise <font color=Red>-></font> report fail <font color=Cyan>(</font>show t<font color=Cyan>)</font> p t'+<a name="line-172"></a><a name="nottok"></a><font color=Blue>nottok</font> <font color=Red>::</font> <font color=Red>[</font>TokenT<font color=Red>]</font> <font color=Red>-></font> XParser TokenT+<a name="line-173"></a><font color=Blue>nottok</font> ts <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-174"></a> <font color=Green><u>if</u></font> t<font color=Cyan>`elem`</font>ts <font color=Green><u>then</u></font> report fail <font color=Cyan>(</font><font color=Magenta>"no "</font><font color=Cyan>++</font>show t<font color=Cyan>)</font> p t+<a name="line-175"></a> <font color=Green><u>else</u></font> return t+<a name="line-176"></a>+<a name="line-177"></a><a name="name"></a><font color=Blue>-- | Return just a name, e.g. element name, attribute name.</font>+<a name="line-178"></a><font color=Blue>name</font> <font color=Red>::</font> XParser Name+<a name="line-179"></a><font color=Blue>name</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>tok<font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-180"></a> <font color=Green><u>case</u></font> tok <font color=Green><u>of</u></font>+<a name="line-181"></a> TokName s <font color=Red>-></font> return s+<a name="line-182"></a> TokError <font color=Green><u>_</u></font> <font color=Red>-></font> report failBad <font color=Magenta>"a name"</font> p tok+<a name="line-183"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"a name"</font> p tok+<a name="line-184"></a>+<a name="line-185"></a><a name="string"></a><font color=Blue>string</font><font color=Cyan>,</font> freetext <font color=Red>::</font> XParser String+<a name="line-186"></a><font color=Blue>string</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-187"></a> <font color=Green><u>case</u></font> t <font color=Green><u>of</u></font> TokName s <font color=Red>-></font> return s+<a name="line-188"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"text"</font> p t+<a name="line-189"></a><a name="freetext"></a><font color=Blue>freetext</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-190"></a> <font color=Green><u>case</u></font> t <font color=Green><u>of</u></font> TokFreeText s <font color=Red>-></font> return s+<a name="line-191"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"text"</font> p t+<a name="line-192"></a>+<a name="line-193"></a><a name="maybe"></a><font color=Blue>maybe</font> <font color=Red>::</font> XParser a <font color=Red>-></font> XParser <font color=Cyan>(</font>Maybe a<font color=Cyan>)</font>+<a name="line-194"></a><font color=Blue>maybe</font> p <font color=Red>=</font>+<a name="line-195"></a> <font color=Cyan>(</font> p <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Just<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-196"></a> <font color=Cyan>(</font> return Nothing<font color=Cyan>)</font>+<a name="line-197"></a>+<a name="line-198"></a><a name="either"></a><font color=Blue>either</font> <font color=Red>::</font> XParser a <font color=Red>-></font> XParser b <font color=Red>-></font> XParser <font color=Cyan>(</font>Either a b<font color=Cyan>)</font>+<a name="line-199"></a><font color=Blue>either</font> p q <font color=Red>=</font>+<a name="line-200"></a> <font color=Cyan>(</font> p <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Left<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-201"></a> <font color=Cyan>(</font> q <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Right<font color=Cyan>)</font>+<a name="line-202"></a>+<a name="line-203"></a><a name="word"></a><font color=Blue>word</font> <font color=Red>::</font> String <font color=Red>-></font> XParser ()+<a name="line-204"></a><font color=Blue>word</font> s <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> x <font color=Red><-</font> next+<a name="line-205"></a> <font color=Cyan>;</font> <font color=Green><u>case</u></font> x <font color=Green><u>of</u></font>+<a name="line-206"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>TokName n<font color=Cyan>)</font> <font color=Red>|</font> s<font color=Cyan>==</font>n <font color=Red>-></font> return ()+<a name="line-207"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>TokFreeText n<font color=Cyan>)</font> <font color=Red>|</font> s<font color=Cyan>==</font>n <font color=Red>-></font> return ()+<a name="line-208"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Red>@</font><font color=Cyan>(</font>TokError <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> report failBad <font color=Cyan>(</font>show s<font color=Cyan>)</font> p t+<a name="line-209"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red>-></font> report fail <font color=Cyan>(</font>show s<font color=Cyan>)</font> p t+<a name="line-210"></a> <font color=Cyan>}</font>+<a name="line-211"></a>+<a name="line-212"></a><a name="posn"></a><font color=Blue>posn</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> x<font color=Red>@</font><font color=Cyan>(</font>p<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-213"></a> <font color=Cyan>;</font> reparse <font color=Red>[</font>x<font color=Red>]</font>+<a name="line-214"></a> <font color=Cyan>;</font> return p+<a name="line-215"></a> <font color=Cyan>}</font>+<a name="line-216"></a>+<a name="line-217"></a><a name="nmtoken"></a><font color=Blue>nmtoken</font> <font color=Red>::</font> XParser NmToken+<a name="line-218"></a><font color=Blue>nmtoken</font> <font color=Red>=</font> <font color=Cyan>(</font>string <font color=Cyan>`onFail`</font> freetext<font color=Cyan>)</font>+<a name="line-219"></a>+<a name="line-220"></a><a name="failP"></a><font color=Blue>failP</font><font color=Cyan>,</font> failBadP <font color=Red>::</font> String <font color=Red>-></font> XParser a+<a name="line-221"></a><font color=Blue>failP</font> msg <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn<font color=Cyan>;</font> fail <font color=Cyan>(</font>msg<font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font> <font color=Cyan>}</font>+<a name="line-222"></a><a name="failBadP"></a><font color=Blue>failBadP</font> msg <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn<font color=Cyan>;</font> failBad <font color=Cyan>(</font>msg<font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font> <font color=Cyan>}</font>+<a name="line-223"></a>+<a name="line-224"></a><a name="report"></a><font color=Blue>report</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>XParser a<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> Posn <font color=Red>-></font> TokenT <font color=Red>-></font> XParser a+<a name="line-225"></a><font color=Blue>report</font> fail exp p t <font color=Red>=</font> fail <font color=Cyan>(</font><font color=Magenta>"Expected "</font><font color=Cyan>++</font>exp<font color=Cyan>++</font><font color=Magenta>" but found "</font><font color=Cyan>++</font>show t+<a name="line-226"></a> <font color=Cyan>++</font><font color=Magenta>"\n in "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>+<a name="line-227"></a>+<a name="line-228"></a><a name="adjustErrP"></a><font color=Blue>adjustErrP</font> <font color=Red>::</font> XParser a <font color=Red>-></font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Cyan>)</font> <font color=Red>-></font> XParser a+<a name="line-229"></a><a name="adjustErrP"></a><font color=Blue>p</font> <font color=Cyan>`adjustErrP`</font> f <font color=Red>=</font> p <font color=Cyan>`onFail`</font> <font color=Green><u>do</u></font> pn <font color=Red><-</font> posn+<a name="line-230"></a> <font color=Cyan>(</font>p <font color=Cyan>`adjustErr`</font> f<font color=Cyan>)</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>++</font>show pn<font color=Cyan>)</font>+<a name="line-231"></a>+<a name="line-232"></a><a name="peRef"></a><font color=Blue>peRef</font> <font color=Red>::</font> XParser a <font color=Red>-></font> XParser a+<a name="line-233"></a><font color=Blue>peRef</font> p <font color=Red>=</font>+<a name="line-234"></a> p <font color=Cyan>`onFail`</font>+<a name="line-235"></a> <font color=Green><u>do</u></font> pn <font color=Red><-</font> posn+<a name="line-236"></a> n <font color=Red><-</font> pereference+<a name="line-237"></a> tr <font color=Red><-</font> stQuery <font color=Cyan>(</font>lookupPE n<font color=Cyan>)</font> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"Looking up %"</font><font color=Cyan>++</font>n<font color=Cyan>)</font>+<a name="line-238"></a> <font color=Green><u>case</u></font> tr <font color=Green><u>of</u></font>+<a name="line-239"></a> Just <font color=Cyan>(</font>PEDefEntityValue ev<font color=Cyan>)</font> <font color=Red>-></font>+<a name="line-240"></a> <font color=Green><u>do</u></font> reparse <font color=Cyan>(</font>xmlReLex <font color=Cyan>(</font>posInNewCxt <font color=Cyan>(</font><font color=Magenta>"macro %"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font>+<a name="line-241"></a> <font color=Cyan>(</font>Just pn<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-242"></a> <font color=Cyan>(</font>flattenEV ev<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-243"></a> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>" defn: "</font><font color=Cyan>++</font>flattenEV ev<font color=Cyan>)</font>+<a name="line-244"></a> peRef p+<a name="line-245"></a> Just <font color=Cyan>(</font>PEDefExternalID <font color=Cyan>(</font>PUBLIC <font color=Green><u>_</u></font> <font color=Cyan>(</font>SystemLiteral f<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font>+<a name="line-246"></a> <font color=Green><u>do</u></font> <font color=Green><u>let</u></font> f' <font color=Red>=</font> combine <font color=Cyan>(</font>dropFileName <font color=Cyan>$</font> posnFilename pn<font color=Cyan>)</font> f+<a name="line-247"></a> val <font color=Red>=</font> unsafePerformIO <font color=Cyan>(</font>readFile f'<font color=Cyan>)</font>+<a name="line-248"></a> reparse <font color=Cyan>(</font>xmlReLex <font color=Cyan>(</font>posInNewCxt f'+<a name="line-249"></a> <font color=Cyan>(</font>Just pn<font color=Cyan>)</font><font color=Cyan>)</font> val<font color=Cyan>)</font>+<a name="line-250"></a> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>" reading from file "</font><font color=Cyan>++</font>f'<font color=Cyan>)</font>+<a name="line-251"></a> peRef p+<a name="line-252"></a> Just <font color=Cyan>(</font>PEDefExternalID <font color=Cyan>(</font>SYSTEM <font color=Cyan>(</font>SystemLiteral f<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font>+<a name="line-253"></a> <font color=Green><u>do</u></font> <font color=Green><u>let</u></font> f' <font color=Red>=</font> combine <font color=Cyan>(</font>dropFileName <font color=Cyan>$</font> posnFilename pn<font color=Cyan>)</font> f+<a name="line-254"></a> val <font color=Red>=</font> unsafePerformIO <font color=Cyan>(</font>readFile f'<font color=Cyan>)</font>+<a name="line-255"></a> reparse <font color=Cyan>(</font>xmlReLex <font color=Cyan>(</font>posInNewCxt f'+<a name="line-256"></a> <font color=Cyan>(</font>Just pn<font color=Cyan>)</font><font color=Cyan>)</font> val<font color=Cyan>)</font>+<a name="line-257"></a> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>" reading from file "</font><font color=Cyan>++</font>f'<font color=Cyan>)</font>+<a name="line-258"></a> peRef p+<a name="line-259"></a> Nothing <font color=Red>-></font> fail <font color=Cyan>(</font><font color=Magenta>"PEReference use before definition: "</font><font color=Cyan>++</font><font color=Magenta>"%"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font>+<a name="line-260"></a> <font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show pn<font color=Cyan>)</font>+<a name="line-261"></a>+<a name="line-262"></a><a name="blank"></a><font color=Blue>blank</font> <font color=Red>::</font> XParser a <font color=Red>-></font> XParser a+<a name="line-263"></a><font color=Blue>blank</font> p <font color=Red>=</font>+<a name="line-264"></a> p <font color=Cyan>`onFail`</font>+<a name="line-265"></a> <font color=Green><u>do</u></font> n <font color=Red><-</font> pereference+<a name="line-266"></a> tr <font color=Red><-</font> stQuery <font color=Cyan>(</font>lookupPE n<font color=Cyan>)</font> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"Looking up %"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>" (is blank?)"</font><font color=Cyan>)</font>+<a name="line-267"></a> <font color=Green><u>case</u></font> tr <font color=Green><u>of</u></font>+<a name="line-268"></a> Just <font color=Cyan>(</font>PEDefEntityValue ev<font color=Cyan>)</font>+<a name="line-269"></a> <font color=Red>|</font> all isSpace <font color=Cyan>(</font>flattenEV ev<font color=Cyan>)</font> <font color=Red>-></font>+<a name="line-270"></a> <font color=Green><u>do</u></font> blank p <font color=Cyan>`debug`</font> <font color=Magenta>"Empty macro definition"</font>+<a name="line-271"></a> Just <font color=Green><u>_</u></font> <font color=Red>-></font> failP <font color=Cyan>(</font><font color=Magenta>"expected a blank PERef macro: "</font><font color=Cyan>++</font><font color=Magenta>"%"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font>+<a name="line-272"></a> Nothing <font color=Red>-></font> failP <font color=Cyan>(</font><font color=Magenta>"PEReference use before definition: "</font><font color=Cyan>++</font><font color=Magenta>"%"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font>+<a name="line-273"></a>+<a name="line-274"></a>+<a name="line-275"></a>+<a name="line-276"></a><font color=Blue>---- XML Parsing Functions ----</font>+<a name="line-277"></a>+<a name="line-278"></a><a name="justDTD"></a><font color=Blue>justDTD</font> <font color=Red>::</font> XParser <font color=Cyan>(</font>Maybe DocTypeDecl<font color=Cyan>)</font>+<a name="line-279"></a><font color=Blue>justDTD</font> <font color=Red>=</font>+<a name="line-280"></a> <font color=Green><u>do</u></font> <font color=Cyan>(</font>ExtSubset <font color=Green><u>_</u></font> ds<font color=Cyan>)</font> <font color=Red><-</font> extsubset <font color=Cyan>`debug`</font> <font color=Magenta>"Trying external subset"</font>+<a name="line-281"></a> <font color=Green><u>if</u></font> null ds <font color=Green><u>then</u></font> fail <font color=Magenta>"empty"</font>+<a name="line-282"></a> <font color=Green><u>else</u></font> return <font color=Cyan>(</font>Just <font color=Cyan>(</font>DTD <font color=Magenta>"extsubset"</font> Nothing <font color=Cyan>(</font>concatMap extract ds<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-283"></a> <font color=Cyan>`onFail`</font>+<a name="line-284"></a> <font color=Green><u>do</u></font> <font color=Cyan>(</font>Prolog <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> dtd <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red><-</font> prolog+<a name="line-285"></a> return dtd+<a name="line-286"></a> <font color=Green><u>where</u></font> extract <font color=Cyan>(</font>ExtMarkupDecl m<font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>m<font color=Red>]</font>+<a name="line-287"></a> extract <font color=Cyan>(</font>ExtConditionalSect <font color=Cyan>(</font>IncludeSect i<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> concatMap extract i+<a name="line-288"></a> extract <font color=Cyan>(</font>ExtConditionalSect <font color=Cyan>(</font>IgnoreSect i<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> []+<a name="line-289"></a>+<a name="line-290"></a><a name="document"></a><font color=Blue>-- | Return an entire XML document including prolog and trailing junk.</font>+<a name="line-291"></a><font color=Blue>document</font> <font color=Red>::</font> XParser <font color=Cyan>(</font>Document Posn<font color=Cyan>)</font>+<a name="line-292"></a><font color=Blue>document</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-293"></a> p <font color=Red><-</font> prolog <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"unrecognisable XML prolog\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-294"></a> e <font color=Red><-</font> element+<a name="line-295"></a> ms <font color=Red><-</font> many misc+<a name="line-296"></a> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font>ge<font color=Cyan>)</font> <font color=Red><-</font> stGet+<a name="line-297"></a> return <font color=Cyan>(</font>Document p ge e ms<font color=Cyan>)</font>+<a name="line-298"></a>+<a name="line-299"></a><a name="comment"></a><font color=Blue>-- | Return an XML comment.</font>+<a name="line-300"></a><font color=Blue>comment</font> <font color=Red>::</font> XParser Comment+<a name="line-301"></a><font color=Blue>comment</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-302"></a> myBracket <font color=Cyan>(</font>tok TokCommentOpen<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokCommentClose<font color=Cyan>)</font> freetext+<a name="line-303"></a><font color=Blue>-- tok TokCommentOpen</font>+<a name="line-304"></a><font color=Blue>-- commit $ do</font>+<a name="line-305"></a><font color=Blue>-- c <- freetext</font>+<a name="line-306"></a><font color=Blue>-- tok TokCommentClose</font>+<a name="line-307"></a><font color=Blue>-- return c</font>+<a name="line-308"></a>+<a name="line-309"></a><a name="processinginstruction"></a><font color=Blue>-- | Parse a processing instruction.</font>+<a name="line-310"></a><font color=Blue>processinginstruction</font> <font color=Red>::</font> XParser ProcessingInstruction+<a name="line-311"></a><font color=Blue>processinginstruction</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-312"></a> tok TokPIOpen+<a name="line-313"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>+<a name="line-314"></a> n <font color=Red><-</font> string <font color=Cyan>`onFail`</font> failP <font color=Magenta>"processing instruction has no target"</font>+<a name="line-315"></a> f <font color=Red><-</font> freetext+<a name="line-316"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failP <font color=Cyan>(</font><font color=Magenta>"missing ?> in <?"</font><font color=Cyan>++</font>n<font color=Cyan>)</font>+<a name="line-317"></a> return <font color=Cyan>(</font>n<font color=Cyan>,</font> f<font color=Cyan>)</font>+<a name="line-318"></a>+<a name="line-319"></a><a name="cdsect"></a><font color=Blue>cdsect</font> <font color=Red>::</font> XParser CDSect+<a name="line-320"></a><font color=Blue>cdsect</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-321"></a> tok TokSectionOpen+<a name="line-322"></a> bracket <font color=Cyan>(</font>tok <font color=Cyan>(</font>TokSection CDATAx<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSectionClose<font color=Cyan>)</font> chardata+<a name="line-323"></a>+<a name="line-324"></a><a name="prolog"></a><font color=Blue>prolog</font> <font color=Red>::</font> XParser Prolog+<a name="line-325"></a><font color=Blue>prolog</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-326"></a> x <font color=Red><-</font> maybe xmldecl+<a name="line-327"></a> m1 <font color=Red><-</font> many misc+<a name="line-328"></a> dtd <font color=Red><-</font> maybe doctypedecl+<a name="line-329"></a> m2 <font color=Red><-</font> many misc+<a name="line-330"></a> return <font color=Cyan>(</font>Prolog x m1 dtd m2<font color=Cyan>)</font>+<a name="line-331"></a>+<a name="line-332"></a><a name="xmldecl"></a><font color=Blue>xmldecl</font> <font color=Red>::</font> XParser XMLDecl+<a name="line-333"></a><font color=Blue>xmldecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-334"></a> tok TokPIOpen+<a name="line-335"></a> <font color=Cyan>(</font>word <font color=Magenta>"xml"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"XML"</font><font color=Cyan>)</font>+<a name="line-336"></a> p <font color=Red><-</font> posn+<a name="line-337"></a> s <font color=Red><-</font> freetext+<a name="line-338"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing ?> in <?xml ...?>"</font>+<a name="line-339"></a> raise <font color=Cyan>(</font><font color=Cyan>(</font>runParser aux emptySTs <font color=Cyan>.</font> xmlReLex p<font color=Cyan>)</font> s<font color=Cyan>)</font>+<a name="line-340"></a> <font color=Green><u>where</u></font>+<a name="line-341"></a> aux <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-342"></a> v <font color=Red><-</font> versioninfo <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing XML version info"</font>+<a name="line-343"></a> e <font color=Red><-</font> maybe encodingdecl+<a name="line-344"></a> s <font color=Red><-</font> maybe sddecl+<a name="line-345"></a> return <font color=Cyan>(</font>XMLDecl v e s<font color=Cyan>)</font>+<a name="line-346"></a> raise <font color=Cyan>(</font>Left err<font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> failP err+<a name="line-347"></a> raise <font color=Cyan>(</font>Right ok<font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> return ok+<a name="line-348"></a>+<a name="line-349"></a><a name="versioninfo"></a><font color=Blue>versioninfo</font> <font color=Red>::</font> XParser VersionInfo+<a name="line-350"></a><font color=Blue>versioninfo</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-351"></a> <font color=Cyan>(</font>word <font color=Magenta>"version"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"VERSION"</font><font color=Cyan>)</font>+<a name="line-352"></a> tok TokEqual+<a name="line-353"></a> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext+<a name="line-354"></a>+<a name="line-355"></a><a name="misc"></a><font color=Blue>misc</font> <font color=Red>::</font> XParser Misc+<a name="line-356"></a><font color=Blue>misc</font> <font color=Red>=</font>+<a name="line-357"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"<!--comment-->"</font><font color=Cyan>,</font> comment <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Comment<font color=Cyan>)</font>+<a name="line-358"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"<?PI?>"</font><font color=Cyan>,</font> processinginstruction <font color=Cyan>>>=</font> return <font color=Cyan>.</font> PI<font color=Cyan>)</font>+<a name="line-359"></a> <font color=Red>]</font>+<a name="line-360"></a>+<a name="line-361"></a><a name="doctypedecl"></a><font color=Blue>-- | Return a DOCTYPE decl, indicating a DTD.</font>+<a name="line-362"></a><font color=Blue>doctypedecl</font> <font color=Red>::</font> XParser DocTypeDecl+<a name="line-363"></a><font color=Blue>doctypedecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-364"></a> tok TokSpecialOpen+<a name="line-365"></a> tok <font color=Cyan>(</font>TokSpecial DOCTYPEx<font color=Cyan>)</font>+<a name="line-366"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>+<a name="line-367"></a> n <font color=Red><-</font> name+<a name="line-368"></a> eid <font color=Red><-</font> maybe externalid+<a name="line-369"></a> es <font color=Red><-</font> maybe <font color=Cyan>(</font>bracket <font color=Cyan>(</font>tok TokSqOpen<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSqClose<font color=Cyan>)</font>+<a name="line-370"></a> <font color=Cyan>(</font>many <font color=Cyan>(</font>peRef markupdecl<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-371"></a> blank <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing > in DOCTYPE decl"</font>+<a name="line-372"></a> return <font color=Cyan>(</font>DTD n eid <font color=Cyan>(</font><font color=Green><u>case</u></font> es <font color=Green><u>of</u></font> <font color=Cyan>{</font> Nothing <font color=Red>-></font> []<font color=Cyan>;</font> Just e <font color=Red>-></font> e <font color=Cyan>}</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-373"></a>+<a name="line-374"></a><a name="markupdecl"></a><font color=Blue>-- | Return a DTD markup decl, e.g. ELEMENT, ATTLIST, etc</font>+<a name="line-375"></a><font color=Blue>markupdecl</font> <font color=Red>::</font> XParser MarkupDecl+<a name="line-376"></a><font color=Blue>markupdecl</font> <font color=Red>=</font>+<a name="line-377"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"ELEMENT"</font><font color=Cyan>,</font> elementdecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Element<font color=Cyan>)</font>+<a name="line-378"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"ATTLIST"</font><font color=Cyan>,</font> attlistdecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> AttList<font color=Cyan>)</font>+<a name="line-379"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"ENTITY"</font><font color=Cyan>,</font> entitydecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Entity<font color=Cyan>)</font>+<a name="line-380"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"NOTATION"</font><font color=Cyan>,</font> notationdecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Notation<font color=Cyan>)</font>+<a name="line-381"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"misc"</font><font color=Cyan>,</font> misc <font color=Cyan>>>=</font> return <font color=Cyan>.</font> MarkupMisc<font color=Cyan>)</font>+<a name="line-382"></a> <font color=Red>]</font>+<a name="line-383"></a> <font color=Cyan>`adjustErrP`</font>+<a name="line-384"></a> <font color=Cyan>(</font><font color=Magenta>"when looking for a markup decl,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-385"></a> <font color=Blue>-- (\ (ELEMENT, ATTLIST, ENTITY, NOTATION, <!--comment-->, or <?PI?>")</font>+<a name="line-386"></a>+<a name="line-387"></a><a name="extsubset"></a><font color=Blue>extsubset</font> <font color=Red>::</font> XParser ExtSubset+<a name="line-388"></a><font color=Blue>extsubset</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-389"></a> td <font color=Red><-</font> maybe textdecl+<a name="line-390"></a> ds <font color=Red><-</font> many <font color=Cyan>(</font>peRef extsubsetdecl<font color=Cyan>)</font>+<a name="line-391"></a> return <font color=Cyan>(</font>ExtSubset td ds<font color=Cyan>)</font>+<a name="line-392"></a>+<a name="line-393"></a><a name="extsubsetdecl"></a><font color=Blue>extsubsetdecl</font> <font color=Red>::</font> XParser ExtSubsetDecl+<a name="line-394"></a><font color=Blue>extsubsetdecl</font> <font color=Red>=</font>+<a name="line-395"></a> <font color=Cyan>(</font> markupdecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> ExtMarkupDecl<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-396"></a> <font color=Cyan>(</font> conditionalsect <font color=Cyan>>>=</font> return <font color=Cyan>.</font> ExtConditionalSect<font color=Cyan>)</font>+<a name="line-397"></a>+<a name="line-398"></a><a name="sddecl"></a><font color=Blue>sddecl</font> <font color=Red>::</font> XParser SDDecl+<a name="line-399"></a><font color=Blue>sddecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-400"></a> <font color=Cyan>(</font>word <font color=Magenta>"standalone"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"STANDALONE"</font><font color=Cyan>)</font>+<a name="line-401"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>+<a name="line-402"></a> tok TokEqual <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing = in 'standalone' decl"</font>+<a name="line-403"></a> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font>+<a name="line-404"></a> <font color=Cyan>(</font> <font color=Cyan>(</font>word <font color=Magenta>"yes"</font> <font color=Cyan>>></font> return True<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-405"></a> <font color=Cyan>(</font>word <font color=Magenta>"no"</font> <font color=Cyan>>></font> return False<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-406"></a> failP <font color=Magenta>"'standalone' decl requires 'yes' or 'no' value"</font> <font color=Cyan>)</font>+<a name="line-407"></a>+<a name="line-408"></a><font color=Blue>{-+<a name="line-409"></a>element :: XParser (Element Posn)+<a name="line-410"></a>element = do+<a name="line-411"></a> tok TokAnyOpen+<a name="line-412"></a> (ElemTag n as) <- elemtag+<a name="line-413"></a> oneOf' [ ("self-closing tag <"++n++"/>"+<a name="line-414"></a> , do tok TokEndClose+<a name="line-415"></a> return (Elem n as []))+<a name="line-416"></a> , ("after open tag <"++n++">"+<a name="line-417"></a> , do tok TokAnyClose+<a name="line-418"></a> cs <- many content+<a name="line-419"></a> p <- posn+<a name="line-420"></a> m <- bracket (tok TokEndOpen) (tok TokAnyClose) name+<a name="line-421"></a> checkmatch p n m+<a name="line-422"></a> return (Elem n as cs))+<a name="line-423"></a> ] `adjustErr` (("in element tag "++n++",\n")++)+<a name="line-424"></a>-}</font>+<a name="line-425"></a>+<a name="line-426"></a><a name="element"></a><font color=Blue>-- | Return a complete element including all its inner content.</font>+<a name="line-427"></a><font color=Blue>element</font> <font color=Red>::</font> XParser <font color=Cyan>(</font>Element Posn<font color=Cyan>)</font>+<a name="line-428"></a><font color=Blue>element</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-429"></a> tok TokAnyOpen+<a name="line-430"></a> <font color=Cyan>(</font>ElemTag n <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Red><-</font> elemtag+<a name="line-431"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokEndClose+<a name="line-432"></a> commit <font color=Cyan>(</font>return <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-433"></a> <font color=Cyan>`onFail`</font>+<a name="line-434"></a> <font color=Green><u>do</u></font> tok TokAnyClose+<a name="line-435"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>+<a name="line-436"></a> return <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan>`apply`</font>+<a name="line-437"></a> manyFinally content+<a name="line-438"></a> <font color=Cyan>(</font><font color=Green><u>do</u></font> p <font color=Red><-</font> posn+<a name="line-439"></a> m <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokEndOpen<font color=Cyan>)</font>+<a name="line-440"></a> <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font> name+<a name="line-441"></a> checkmatch p n m<font color=Cyan>)</font>+<a name="line-442"></a> <font color=Cyan>)</font> <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in element tag "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-443"></a>+<a name="line-444"></a><a name="checkmatch"></a><font color=Blue>checkmatch</font> <font color=Red>::</font> Posn <font color=Red>-></font> Name <font color=Red>-></font> Name <font color=Red>-></font> XParser ()+<a name="line-445"></a><font color=Blue>checkmatch</font> p n m <font color=Red>=</font>+<a name="line-446"></a> <font color=Green><u>if</u></font> n <font color=Cyan>==</font> m <font color=Green><u>then</u></font> return ()+<a name="line-447"></a> <font color=Green><u>else</u></font> failBadP <font color=Cyan>(</font><font color=Magenta>"tag <"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>"> terminated by </"</font><font color=Cyan>++</font>m<font color=Cyan>++</font><font color=Magenta>">"</font><font color=Cyan>)</font>+<a name="line-448"></a>+<a name="line-449"></a><a name="elemtag"></a><font color=Blue>-- | Parse only the parts between angle brackets in an element tag.</font>+<a name="line-450"></a><font color=Blue>elemtag</font> <font color=Red>::</font> XParser ElemTag+<a name="line-451"></a><font color=Blue>elemtag</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-452"></a> n <font color=Red><-</font> name <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Magenta>"malformed element tag\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-453"></a> <font color=Green><u>as</u></font> <font color=Red><-</font> many attribute+<a name="line-454"></a> return <font color=Cyan>(</font>ElemTag n <font color=Green><u>as</u></font><font color=Cyan>)</font>+<a name="line-455"></a>+<a name="line-456"></a><a name="elemOpenTag"></a><font color=Blue>-- | For use with stream parsers - returns the complete opening element tag.</font>+<a name="line-457"></a><font color=Blue>elemOpenTag</font> <font color=Red>::</font> XParser ElemTag+<a name="line-458"></a><font color=Blue>elemOpenTag</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-459"></a> tok TokAnyOpen+<a name="line-460"></a> e <font color=Red><-</font> elemtag+<a name="line-461"></a> tok TokAnyClose+<a name="line-462"></a> return e+<a name="line-463"></a>+<a name="line-464"></a><a name="elemCloseTag"></a><font color=Blue>-- | For use with stream parsers - accepts a closing tag, provided it</font>+<a name="line-465"></a><font color=Blue>-- matches the given element name.</font>+<a name="line-466"></a><font color=Blue>elemCloseTag</font> <font color=Red>::</font> Name <font color=Red>-></font> XParser ()+<a name="line-467"></a><font color=Blue>elemCloseTag</font> n <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-468"></a> tok TokEndOpen+<a name="line-469"></a> p <font color=Red><-</font> posn+<a name="line-470"></a> m <font color=Red><-</font> name+<a name="line-471"></a> tok TokAnyClose+<a name="line-472"></a> checkmatch p n m+<a name="line-473"></a>+<a name="line-474"></a><a name="attribute"></a><font color=Blue>attribute</font> <font color=Red>::</font> XParser Attribute+<a name="line-475"></a><font color=Blue>attribute</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-476"></a> n <font color=Red><-</font> name <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"malformed attribute name\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-477"></a> tok TokEqual <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing = in attribute"</font>+<a name="line-478"></a> v <font color=Red><-</font> attvalue <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing attvalue"</font>+<a name="line-479"></a> return <font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Cyan>)</font>+<a name="line-480"></a>+<a name="line-481"></a><a name="content"></a><font color=Blue>-- | Return a content particle, e.g. text, element, reference, etc</font>+<a name="line-482"></a><font color=Blue>content</font> <font color=Red>::</font> XParser <font color=Cyan>(</font>Content Posn<font color=Cyan>)</font>+<a name="line-483"></a><font color=Blue>content</font> <font color=Red>=</font>+<a name="line-484"></a> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn+<a name="line-485"></a> <font color=Cyan>;</font> c' <font color=Red><-</font> content'+<a name="line-486"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>c' p<font color=Cyan>)</font>+<a name="line-487"></a> <font color=Cyan>}</font>+<a name="line-488"></a> <font color=Green><u>where</u></font>+<a name="line-489"></a> content' <font color=Red>=</font> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"element"</font><font color=Cyan>,</font> element <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CElem<font color=Cyan>)</font>+<a name="line-490"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"chardata"</font><font color=Cyan>,</font> chardata <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CString False<font color=Cyan>)</font>+<a name="line-491"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"reference"</font><font color=Cyan>,</font> reference <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CRef<font color=Cyan>)</font>+<a name="line-492"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"CDATA"</font><font color=Cyan>,</font> cdsect <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CString True<font color=Cyan>)</font>+<a name="line-493"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"misc"</font><font color=Cyan>,</font> misc <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CMisc<font color=Cyan>)</font>+<a name="line-494"></a> <font color=Red>]</font>+<a name="line-495"></a> <font color=Cyan>`adjustErrP`</font> <font color=Cyan>(</font><font color=Magenta>"when looking for a content item,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-496"></a><font color=Blue>-- (\ (element, text, reference, CDATA section, <!--comment-->, or <?PI?>")</font>+<a name="line-497"></a>+<a name="line-498"></a><a name="elementdecl"></a><font color=Blue>elementdecl</font> <font color=Red>::</font> XParser ElementDecl+<a name="line-499"></a><font color=Blue>elementdecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-500"></a> tok TokSpecialOpen+<a name="line-501"></a> tok <font color=Cyan>(</font>TokSpecial ELEMENTx<font color=Cyan>)</font>+<a name="line-502"></a> n <font color=Red><-</font> peRef name <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Magenta>"expecting identifier in ELEMENT decl\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-503"></a> c <font color=Red><-</font> peRef contentspec+<a name="line-504"></a> <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in content spec of ELEMENT decl: "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>"\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-505"></a> blank <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failBadP+<a name="line-506"></a> <font color=Cyan>(</font><font color=Magenta>"expected > terminating ELEMENT decl"</font>+<a name="line-507"></a> <font color=Cyan>++</font><font color=Magenta>"\n element name was "</font><font color=Cyan>++</font>show n+<a name="line-508"></a> <font color=Cyan>++</font><font color=Magenta>"\n contentspec was "</font><font color=Cyan>++</font><font color=Cyan>(</font><font color=Red>\</font> <font color=Cyan>(</font>ContentSpec p<font color=Cyan>)</font><font color=Red>-></font> show p<font color=Cyan>)</font> c<font color=Cyan>)</font>+<a name="line-509"></a> return <font color=Cyan>(</font>ElementDecl n c<font color=Cyan>)</font>+<a name="line-510"></a>+<a name="line-511"></a><a name="contentspec"></a><font color=Blue>contentspec</font> <font color=Red>::</font> XParser ContentSpec+<a name="line-512"></a><font color=Blue>contentspec</font> <font color=Red>=</font>+<a name="line-513"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"EMPTY"</font><font color=Cyan>,</font> peRef <font color=Cyan>(</font>word <font color=Magenta>"EMPTY"</font><font color=Cyan>)</font> <font color=Cyan>>></font> return EMPTY<font color=Cyan>)</font>+<a name="line-514"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"ANY"</font><font color=Cyan>,</font> peRef <font color=Cyan>(</font>word <font color=Magenta>"ANY"</font><font color=Cyan>)</font> <font color=Cyan>>></font> return ANY<font color=Cyan>)</font>+<a name="line-515"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"mixed"</font><font color=Cyan>,</font> peRef mixed <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Mixed<font color=Cyan>)</font>+<a name="line-516"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"simple"</font><font color=Cyan>,</font> peRef cp <font color=Cyan>>>=</font> return <font color=Cyan>.</font> ContentSpec<font color=Cyan>)</font>+<a name="line-517"></a> <font color=Red>]</font>+<a name="line-518"></a> <font color=Blue>-- `adjustErr` ("when looking for content spec,\n"++)</font>+<a name="line-519"></a> <font color=Blue>-- `adjustErr` (++"\nLooking for content spec (EMPTY, ANY, mixed, etc)")</font>+<a name="line-520"></a>+<a name="line-521"></a><a name="choice"></a><font color=Blue>choice</font> <font color=Red>::</font> XParser <font color=Red>[</font>CP<font color=Red>]</font>+<a name="line-522"></a><font color=Blue>choice</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-523"></a> myBracket <font color=Cyan>(</font>tok TokBraOpen <font color=Cyan>`debug`</font> <font color=Magenta>"Trying choice"</font><font color=Cyan>)</font>+<a name="line-524"></a> <font color=Cyan>(</font>blank <font color=Cyan>(</font>tok TokBraClose <font color=Cyan>`debug`</font> <font color=Magenta>"Succeeded with choice"</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-525"></a> <font color=Cyan>(</font>peRef cp <font color=Cyan>`sepBy1`</font> blank <font color=Cyan>(</font>tok TokPipe<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-526"></a>+<a name="line-527"></a><a name="sequence"></a><font color=Blue>sequence</font> <font color=Red>::</font> XParser <font color=Red>[</font>CP<font color=Red>]</font>+<a name="line-528"></a><font color=Blue>sequence</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-529"></a> myBracket <font color=Cyan>(</font>tok TokBraOpen <font color=Cyan>`debug`</font> <font color=Magenta>"Trying sequence"</font><font color=Cyan>)</font>+<a name="line-530"></a> <font color=Cyan>(</font>blank <font color=Cyan>(</font>tok TokBraClose <font color=Cyan>`debug`</font> <font color=Magenta>"Succeeded with sequence"</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-531"></a> <font color=Cyan>(</font>peRef cp <font color=Cyan>`sepBy1`</font> blank <font color=Cyan>(</font>tok TokComma<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-532"></a>+<a name="line-533"></a><a name="cp"></a><font color=Blue>cp</font> <font color=Red>::</font> XParser CP+<a name="line-534"></a><font color=Blue>cp</font> <font color=Red>=</font> oneOf <font color=Red>[</font> <font color=Cyan>(</font> <font color=Green><u>do</u></font> n <font color=Red><-</font> name+<a name="line-535"></a> m <font color=Red><-</font> modifier+<a name="line-536"></a> <font color=Green><u>let</u></font> c <font color=Red>=</font> TagName n m+<a name="line-537"></a> return c <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ContentSpec: name "</font><font color=Cyan>++</font>show c<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-538"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Green><u>do</u></font> ss <font color=Red><-</font> sequence+<a name="line-539"></a> m <font color=Red><-</font> modifier+<a name="line-540"></a> <font color=Green><u>let</u></font> c <font color=Red>=</font> Seq ss m+<a name="line-541"></a> return c <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ContentSpec: sequence "</font><font color=Cyan>++</font>show c<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-542"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Green><u>do</u></font> cs <font color=Red><-</font> choice+<a name="line-543"></a> m <font color=Red><-</font> modifier+<a name="line-544"></a> <font color=Green><u>let</u></font> c <font color=Red>=</font> Choice cs m+<a name="line-545"></a> return c <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ContentSpec: choice "</font><font color=Cyan>++</font>show c<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-546"></a> <font color=Red>]</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>++</font><font color=Magenta>"\nwhen looking for a content particle"</font><font color=Cyan>)</font>+<a name="line-547"></a>+<a name="line-548"></a><a name="modifier"></a><font color=Blue>modifier</font> <font color=Red>::</font> XParser Modifier+<a name="line-549"></a><font color=Blue>modifier</font> <font color=Red>=</font> oneOf <font color=Red>[</font> <font color=Cyan>(</font> tok TokStar <font color=Cyan>>></font> return Star <font color=Cyan>)</font>+<a name="line-550"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> tok TokQuery <font color=Cyan>>></font> return Query <font color=Cyan>)</font>+<a name="line-551"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> tok TokPlus <font color=Cyan>>></font> return Plus <font color=Cyan>)</font>+<a name="line-552"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> return None <font color=Cyan>)</font>+<a name="line-553"></a> <font color=Red>]</font>+<a name="line-554"></a>+<a name="line-555"></a><font color=Blue>-- just for debugging</font>+<a name="line-556"></a><font color=Green><u>instance</u></font> Show CP <font color=Green><u>where</u></font>+<a name="line-557"></a> show <font color=Cyan>(</font>TagName n m<font color=Cyan>)</font> <font color=Red>=</font> n<font color=Cyan>++</font>show m+<a name="line-558"></a> show <font color=Cyan>(</font>Choice cps m<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>'('</font><font color=Red><b>:</b></font> concat <font color=Cyan>(</font>intersperse <font color=Magenta>"|"</font> <font color=Cyan>(</font>map show cps<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-559"></a> <font color=Cyan>++</font><font color=Magenta>")"</font><font color=Cyan>++</font>show m+<a name="line-560"></a> show <font color=Cyan>(</font>Seq cps m<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>'('</font><font color=Red><b>:</b></font> concat <font color=Cyan>(</font>intersperse <font color=Magenta>","</font> <font color=Cyan>(</font>map show cps<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-561"></a> <font color=Cyan>++</font><font color=Magenta>")"</font><font color=Cyan>++</font>show m+<a name="line-562"></a><font color=Green><u>instance</u></font> Show Modifier <font color=Green><u>where</u></font>+<a name="line-563"></a> show None <font color=Red>=</font> <font color=Magenta>""</font>+<a name="line-564"></a> show Query <font color=Red>=</font> <font color=Magenta>"?"</font>+<a name="line-565"></a> show Star <font color=Red>=</font> <font color=Magenta>"*"</font>+<a name="line-566"></a> show Plus <font color=Red>=</font> <font color=Magenta>"+"</font>+<a name="line-567"></a><font color=Blue>----</font>+<a name="line-568"></a>+<a name="line-569"></a><a name="mixed"></a><font color=Blue>mixed</font> <font color=Red>::</font> XParser Mixed+<a name="line-570"></a><font color=Blue>mixed</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-571"></a> tok TokBraOpen+<a name="line-572"></a> peRef <font color=Cyan>(</font><font color=Green><u>do</u></font> tok TokHash+<a name="line-573"></a> word <font color=Magenta>"PCDATA"</font><font color=Cyan>)</font>+<a name="line-574"></a> commit <font color=Cyan>$</font>+<a name="line-575"></a> oneOf <font color=Red>[</font> <font color=Cyan>(</font> <font color=Green><u>do</u></font> cs <font color=Red><-</font> many <font color=Cyan>(</font>peRef <font color=Cyan>(</font><font color=Green><u>do</u></font> tok TokPipe+<a name="line-576"></a> peRef name<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-577"></a> blank <font color=Cyan>(</font>tok TokBraClose <font color=Cyan>>></font> tok TokStar<font color=Cyan>)</font>+<a name="line-578"></a> return <font color=Cyan>(</font>PCDATAplus cs<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-579"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> blank <font color=Cyan>(</font>tok TokBraClose <font color=Cyan>>></font> tok TokStar<font color=Cyan>)</font> <font color=Cyan>>></font> return PCDATA<font color=Cyan>)</font>+<a name="line-580"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> blank <font color=Cyan>(</font>tok TokBraClose<font color=Cyan>)</font> <font color=Cyan>>></font> return PCDATA<font color=Cyan>)</font>+<a name="line-581"></a> <font color=Red>]</font>+<a name="line-582"></a> <font color=Cyan>`adjustErrP`</font> <font color=Cyan>(</font><font color=Cyan>++</font><font color=Magenta>"\nLooking for mixed content spec (#PCDATA | ...)*\n"</font><font color=Cyan>)</font>+<a name="line-583"></a>+<a name="line-584"></a><a name="attlistdecl"></a><font color=Blue>attlistdecl</font> <font color=Red>::</font> XParser AttListDecl+<a name="line-585"></a><font color=Blue>attlistdecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-586"></a> tok TokSpecialOpen+<a name="line-587"></a> tok <font color=Cyan>(</font>TokSpecial ATTLISTx<font color=Cyan>)</font>+<a name="line-588"></a> n <font color=Red><-</font> peRef name <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Magenta>"expecting identifier in ATTLIST\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-589"></a> ds <font color=Red><-</font> peRef <font color=Cyan>(</font>many1 <font color=Cyan>(</font>peRef attdef<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-590"></a> blank <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing > terminating ATTLIST"</font>+<a name="line-591"></a> return <font color=Cyan>(</font>AttListDecl n ds<font color=Cyan>)</font>+<a name="line-592"></a>+<a name="line-593"></a><a name="attdef"></a><font color=Blue>attdef</font> <font color=Red>::</font> XParser AttDef+<a name="line-594"></a><font color=Blue>attdef</font> <font color=Red>=</font>+<a name="line-595"></a> <font color=Green><u>do</u></font> n <font color=Red><-</font> peRef name <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"expecting attribute name\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-596"></a> t <font color=Red><-</font> peRef atttype <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"within attlist defn: "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-597"></a> d <font color=Red><-</font> peRef defaultdecl <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in attlist defn: "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-598"></a> return <font color=Cyan>(</font>AttDef n t d<font color=Cyan>)</font>+<a name="line-599"></a>+<a name="line-600"></a><a name="atttype"></a><font color=Blue>atttype</font> <font color=Red>::</font> XParser AttType+<a name="line-601"></a><font color=Blue>atttype</font> <font color=Red>=</font>+<a name="line-602"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"CDATA"</font><font color=Cyan>,</font> word <font color=Magenta>"CDATA"</font> <font color=Cyan>>></font> return StringType<font color=Cyan>)</font>+<a name="line-603"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"tokenized"</font><font color=Cyan>,</font> tokenizedtype <font color=Cyan>>>=</font> return <font color=Cyan>.</font> TokenizedType<font color=Cyan>)</font>+<a name="line-604"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"enumerated"</font><font color=Cyan>,</font> enumeratedtype <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EnumeratedType<font color=Cyan>)</font>+<a name="line-605"></a> <font color=Red>]</font>+<a name="line-606"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for ATTTYPE,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-607"></a> <font color=Blue>-- `adjustErr` (++"\nLooking for ATTTYPE (CDATA, tokenized, or enumerated")</font>+<a name="line-608"></a>+<a name="line-609"></a><a name="tokenizedtype"></a><font color=Blue>tokenizedtype</font> <font color=Red>::</font> XParser TokenizedType+<a name="line-610"></a><font color=Blue>tokenizedtype</font> <font color=Red>=</font>+<a name="line-611"></a> oneOf <font color=Red>[</font> <font color=Cyan>(</font> word <font color=Magenta>"ID"</font> <font color=Cyan>>></font> return ID<font color=Cyan>)</font>+<a name="line-612"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"IDREF"</font> <font color=Cyan>>></font> return IDREF<font color=Cyan>)</font>+<a name="line-613"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"IDREFS"</font> <font color=Cyan>>></font> return IDREFS<font color=Cyan>)</font>+<a name="line-614"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"ENTITY"</font> <font color=Cyan>>></font> return ENTITY<font color=Cyan>)</font>+<a name="line-615"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"ENTITIES"</font> <font color=Cyan>>></font> return ENTITIES<font color=Cyan>)</font>+<a name="line-616"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"NMTOKEN"</font> <font color=Cyan>>></font> return NMTOKEN<font color=Cyan>)</font>+<a name="line-617"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"NMTOKENS"</font> <font color=Cyan>>></font> return NMTOKENS<font color=Cyan>)</font>+<a name="line-618"></a> <font color=Red>]</font> <font color=Cyan>`onFail`</font>+<a name="line-619"></a> <font color=Green><u>do</u></font> <font color=Cyan>{</font> t <font color=Red><-</font> next+<a name="line-620"></a> <font color=Cyan>;</font> failP <font color=Cyan>(</font><font color=Magenta>"Expected one of"</font>+<a name="line-621"></a> <font color=Cyan>++</font><font color=Magenta>" (ID, IDREF, IDREFS, ENTITY, ENTITIES, NMTOKEN, NMTOKENS)"</font>+<a name="line-622"></a> <font color=Cyan>++</font><font color=Magenta>"\nbut got "</font><font color=Cyan>++</font>show t<font color=Cyan>)</font>+<a name="line-623"></a> <font color=Cyan>}</font>+<a name="line-624"></a><font color=Blue>-- `adjustErr` (++"\nLooking for a tokenized type:\n\ </font>+<a name="line-625"></a><font color=Blue>-- \ (ID, IDREF, IDREFS, ENTITY, ENTITIES, NMTOKEN, NMTOKENS)")</font>+<a name="line-626"></a>+<a name="line-627"></a><a name="enumeratedtype"></a><font color=Blue>enumeratedtype</font> <font color=Red>::</font> XParser EnumeratedType+<a name="line-628"></a><font color=Blue>enumeratedtype</font> <font color=Red>=</font>+<a name="line-629"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"NOTATION"</font><font color=Cyan>,</font> notationtype <font color=Cyan>>>=</font> return <font color=Cyan>.</font> NotationType<font color=Cyan>)</font>+<a name="line-630"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"enumerated"</font><font color=Cyan>,</font> enumeration <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Enumeration<font color=Cyan>)</font>+<a name="line-631"></a> <font color=Red>]</font>+<a name="line-632"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for an enumerated or NOTATION type,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-633"></a>+<a name="line-634"></a><a name="notationtype"></a><font color=Blue>notationtype</font> <font color=Red>::</font> XParser NotationType+<a name="line-635"></a><font color=Blue>notationtype</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-636"></a> word <font color=Magenta>"NOTATION"</font>+<a name="line-637"></a> bracket <font color=Cyan>(</font>tok TokBraOpen<font color=Cyan>)</font> <font color=Cyan>(</font>blank <font color=Cyan>(</font>tok TokBraClose<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-638"></a> <font color=Cyan>(</font>peRef name <font color=Cyan>`sepBy1`</font> peRef <font color=Cyan>(</font>tok TokPipe<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-639"></a>+<a name="line-640"></a><a name="enumeration"></a><font color=Blue>enumeration</font> <font color=Red>::</font> XParser Enumeration+<a name="line-641"></a><font color=Blue>enumeration</font> <font color=Red>=</font>+<a name="line-642"></a> bracket <font color=Cyan>(</font>tok TokBraOpen<font color=Cyan>)</font> <font color=Cyan>(</font>blank <font color=Cyan>(</font>tok TokBraClose<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-643"></a> <font color=Cyan>(</font>peRef nmtoken <font color=Cyan>`sepBy1`</font> blank <font color=Cyan>(</font>peRef <font color=Cyan>(</font>tok TokPipe<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-644"></a>+<a name="line-645"></a><a name="defaultdecl"></a><font color=Blue>defaultdecl</font> <font color=Red>::</font> XParser DefaultDecl+<a name="line-646"></a><font color=Blue>defaultdecl</font> <font color=Red>=</font>+<a name="line-647"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"REQUIRED"</font><font color=Cyan>,</font> tok TokHash <font color=Cyan>>></font> word <font color=Magenta>"REQUIRED"</font> <font color=Cyan>>></font> return REQUIRED<font color=Cyan>)</font>+<a name="line-648"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"IMPLIED"</font><font color=Cyan>,</font> tok TokHash <font color=Cyan>>></font> word <font color=Magenta>"IMPLIED"</font> <font color=Cyan>>></font> return IMPLIED<font color=Cyan>)</font>+<a name="line-649"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"FIXED"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> f <font color=Red><-</font> maybe <font color=Cyan>(</font>tok TokHash <font color=Cyan>>></font> word <font color=Magenta>"FIXED"</font>+<a name="line-650"></a> <font color=Cyan>>></font> return FIXED<font color=Cyan>)</font>+<a name="line-651"></a> a <font color=Red><-</font> peRef attvalue+<a name="line-652"></a> return <font color=Cyan>(</font>DefaultTo a f<font color=Cyan>)</font> <font color=Cyan>)</font>+<a name="line-653"></a> <font color=Red>]</font>+<a name="line-654"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for an attribute default decl,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-655"></a><font color=Blue>-- `adjustErr` (++"\nLooking for an attribute default decl:\n\ </font>+<a name="line-656"></a><font color=Blue>-- \ (REQUIRED, IMPLIED, FIXED)")</font>+<a name="line-657"></a>+<a name="line-658"></a><a name="conditionalsect"></a><font color=Blue>conditionalsect</font> <font color=Red>::</font> XParser ConditionalSect+<a name="line-659"></a><font color=Blue>conditionalsect</font> <font color=Red>=</font> oneOf'+<a name="line-660"></a> <font color=Red>[</font> <font color=Cyan>(</font> <font color=Magenta>"INCLUDE"</font>+<a name="line-661"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> tok TokSectionOpen+<a name="line-662"></a> peRef <font color=Cyan>(</font>tok <font color=Cyan>(</font>TokSection INCLUDEx<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-663"></a> p <font color=Red><-</font> posn+<a name="line-664"></a> tok TokSqOpen <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing [ after INCLUDE"</font>+<a name="line-665"></a> i <font color=Red><-</font> many <font color=Cyan>(</font>peRef extsubsetdecl<font color=Cyan>)</font>+<a name="line-666"></a> tok TokSectionClose+<a name="line-667"></a> <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"missing ]]> for INCLUDE section"</font>+<a name="line-668"></a> <font color=Cyan>++</font><font color=Magenta>"\n begun at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>+<a name="line-669"></a> return <font color=Cyan>(</font>IncludeSect i<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-670"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"IGNORE"</font>+<a name="line-671"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> tok TokSectionOpen+<a name="line-672"></a> peRef <font color=Cyan>(</font>tok <font color=Cyan>(</font>TokSection IGNOREx<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-673"></a> p <font color=Red><-</font> posn+<a name="line-674"></a> tok TokSqOpen <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing [ after IGNORE"</font>+<a name="line-675"></a> i <font color=Red><-</font> many newIgnore <font color=Blue>-- many ignoresectcontents</font>+<a name="line-676"></a> tok TokSectionClose+<a name="line-677"></a> <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"missing ]]> for IGNORE section"</font>+<a name="line-678"></a> <font color=Cyan>++</font><font color=Magenta>"\n begun at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>+<a name="line-679"></a> return <font color=Cyan>(</font>IgnoreSect []<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-680"></a> <font color=Red>]</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"in a conditional section,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-681"></a>+<a name="line-682"></a><a name="newIgnore"></a><font color=Blue>newIgnore</font> <font color=Red>::</font> XParser Ignore+<a name="line-683"></a><font color=Blue>newIgnore</font> <font color=Red>=</font>+<a name="line-684"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokSectionOpen+<a name="line-685"></a> many newIgnore <font color=Cyan>`debug`</font> <font color=Magenta>"IGNORING conditional section"</font>+<a name="line-686"></a> tok TokSectionClose+<a name="line-687"></a> return Ignore <font color=Cyan>`debug`</font> <font color=Magenta>"end of IGNORED conditional section"</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-688"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> t <font color=Red><-</font> nottok <font color=Red>[</font>TokSectionOpen<font color=Cyan>,</font>TokSectionClose<font color=Red>]</font>+<a name="line-689"></a> return Ignore <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ignoring: "</font><font color=Cyan>++</font>show t<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-690"></a>+<a name="line-691"></a><a name="ignoresectcontents"></a><font color=Blue>--- obsolete?</font>+<a name="line-692"></a><font color=Blue>ignoresectcontents</font> <font color=Red>::</font> XParser IgnoreSectContents+<a name="line-693"></a><font color=Blue>ignoresectcontents</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-694"></a> i <font color=Red><-</font> ignore+<a name="line-695"></a> is <font color=Red><-</font> many <font color=Cyan>(</font><font color=Green><u>do</u></font> tok TokSectionOpen+<a name="line-696"></a> ic <font color=Red><-</font> ignoresectcontents+<a name="line-697"></a> tok TokSectionClose+<a name="line-698"></a> ig <font color=Red><-</font> ignore+<a name="line-699"></a> return <font color=Cyan>(</font>ic<font color=Cyan>,</font>ig<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-700"></a> return <font color=Cyan>(</font>IgnoreSectContents i is<font color=Cyan>)</font>+<a name="line-701"></a>+<a name="line-702"></a><a name="ignore"></a><font color=Blue>ignore</font> <font color=Red>::</font> XParser Ignore+<a name="line-703"></a><font color=Blue>ignore</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-704"></a> is <font color=Red><-</font> many1 <font color=Cyan>(</font>nottok <font color=Red>[</font>TokSectionOpen<font color=Cyan>,</font>TokSectionClose<font color=Red>]</font><font color=Cyan>)</font>+<a name="line-705"></a> return Ignore <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ignored all of: "</font><font color=Cyan>++</font>show is<font color=Cyan>)</font>+<a name="line-706"></a><font color=Blue>----</font>+<a name="line-707"></a>+<a name="line-708"></a><a name="reference"></a><font color=Blue>-- | Return either a general entity reference, or a character reference.</font>+<a name="line-709"></a><font color=Blue>reference</font> <font color=Red>::</font> XParser Reference+<a name="line-710"></a><font color=Blue>reference</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-711"></a> myBracket <font color=Cyan>(</font>tok TokAmp<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSemi<font color=Cyan>)</font> <font color=Cyan>(</font>freetext <font color=Cyan>>>=</font> val<font color=Cyan>)</font>+<a name="line-712"></a> <font color=Green><u>where</u></font>+<a name="line-713"></a> val <font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font><font color=Magenta>'x'</font><font color=Red><b>:</b></font>i<font color=Cyan>)</font> <font color=Red>|</font> all isHexDigit i+<a name="line-714"></a> <font color=Red>=</font> return <font color=Cyan>.</font> RefChar <font color=Cyan>.</font> fst <font color=Cyan>.</font> head <font color=Cyan>.</font> readHex <font color=Cyan>$</font> i+<a name="line-715"></a> val <font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>i<font color=Cyan>)</font> <font color=Red>|</font> all isDigit i+<a name="line-716"></a> <font color=Red>=</font> return <font color=Cyan>.</font> RefChar <font color=Cyan>.</font> fst <font color=Cyan>.</font> head <font color=Cyan>.</font> readDec <font color=Cyan>$</font> i+<a name="line-717"></a> val name <font color=Red>=</font> return <font color=Cyan>.</font> RefEntity <font color=Cyan>$</font> name+<a name="line-718"></a>+<a name="line-719"></a><font color=Blue>{- -- following is incorrect+<a name="line-720"></a>reference =+<a name="line-721"></a> ( charref >>= return . RefChar) `onFail`+<a name="line-722"></a> ( entityref >>= return . RefEntity)+<a name="line-723"></a>+<a name="line-724"></a>entityref :: XParser EntityRef+<a name="line-725"></a>entityref = do+<a name="line-726"></a> bracket (tok TokAmp) (tok TokSemi) name+<a name="line-727"></a>+<a name="line-728"></a>charref :: XParser CharRef+<a name="line-729"></a>charref = do+<a name="line-730"></a> bracket (tok TokAmp) (tok TokSemi) (freetext >>= readCharVal)+<a name="line-731"></a> where+<a name="line-732"></a> readCharVal ('#':'x':i) = return . fst . head . readHex $ i+<a name="line-733"></a> readCharVal ('#':i) = return . fst . head . readDec $ i+<a name="line-734"></a> readCharVal _ = mzero+<a name="line-735"></a>-}</font>+<a name="line-736"></a>+<a name="line-737"></a><a name="pereference"></a><font color=Blue>pereference</font> <font color=Red>::</font> XParser PEReference+<a name="line-738"></a><font color=Blue>pereference</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-739"></a> myBracket <font color=Cyan>(</font>tok TokPercent<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSemi<font color=Cyan>)</font> nmtoken+<a name="line-740"></a>+<a name="line-741"></a><a name="entitydecl"></a><font color=Blue>entitydecl</font> <font color=Red>::</font> XParser EntityDecl+<a name="line-742"></a><font color=Blue>entitydecl</font> <font color=Red>=</font>+<a name="line-743"></a> <font color=Cyan>(</font> gedecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EntityGEDecl<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-744"></a> <font color=Cyan>(</font> pedecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EntityPEDecl<font color=Cyan>)</font>+<a name="line-745"></a>+<a name="line-746"></a><a name="gedecl"></a><font color=Blue>gedecl</font> <font color=Red>::</font> XParser GEDecl+<a name="line-747"></a><font color=Blue>gedecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-748"></a> tok TokSpecialOpen+<a name="line-749"></a> tok <font color=Cyan>(</font>TokSpecial ENTITYx<font color=Cyan>)</font>+<a name="line-750"></a> n <font color=Red><-</font> name+<a name="line-751"></a> e <font color=Red><-</font> entitydef <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in general entity defn "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-752"></a> tok TokAnyClose <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"expected > terminating G ENTITY decl "</font><font color=Cyan>++</font>n<font color=Cyan>)</font>+<a name="line-753"></a> stUpdate <font color=Cyan>(</font>addGE n e<font color=Cyan>)</font> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"added GE defn &"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font>+<a name="line-754"></a> return <font color=Cyan>(</font>GEDecl n e<font color=Cyan>)</font>+<a name="line-755"></a>+<a name="line-756"></a><a name="pedecl"></a><font color=Blue>pedecl</font> <font color=Red>::</font> XParser PEDecl+<a name="line-757"></a><font color=Blue>pedecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-758"></a> tok TokSpecialOpen+<a name="line-759"></a> tok <font color=Cyan>(</font>TokSpecial ENTITYx<font color=Cyan>)</font>+<a name="line-760"></a> tok TokPercent+<a name="line-761"></a> n <font color=Red><-</font> name+<a name="line-762"></a> e <font color=Red><-</font> pedef <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in parameter entity defn "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-763"></a> tok TokAnyClose <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"expected > terminating P ENTITY decl "</font><font color=Cyan>++</font>n<font color=Cyan>)</font>+<a name="line-764"></a> stUpdate <font color=Cyan>(</font>addPE n e<font color=Cyan>)</font> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"added PE defn %"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";\n"</font><font color=Cyan>++</font>show e<font color=Cyan>)</font>+<a name="line-765"></a> return <font color=Cyan>(</font>PEDecl n e<font color=Cyan>)</font>+<a name="line-766"></a>+<a name="line-767"></a><a name="entitydef"></a><font color=Blue>entitydef</font> <font color=Red>::</font> XParser EntityDef+<a name="line-768"></a><font color=Blue>entitydef</font> <font color=Red>=</font>+<a name="line-769"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"entityvalue"</font><font color=Cyan>,</font> entityvalue <font color=Cyan>>>=</font> return <font color=Cyan>.</font> DefEntityValue<font color=Cyan>)</font>+<a name="line-770"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"external"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> eid <font color=Red><-</font> externalid+<a name="line-771"></a> ndd <font color=Red><-</font> maybe ndatadecl+<a name="line-772"></a> return <font color=Cyan>(</font>DefExternalID eid ndd<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-773"></a> <font color=Red>]</font>+<a name="line-774"></a>+<a name="line-775"></a><a name="pedef"></a><font color=Blue>pedef</font> <font color=Red>::</font> XParser PEDef+<a name="line-776"></a><font color=Blue>pedef</font> <font color=Red>=</font>+<a name="line-777"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"entityvalue"</font><font color=Cyan>,</font> entityvalue <font color=Cyan>>>=</font> return <font color=Cyan>.</font> PEDefEntityValue<font color=Cyan>)</font>+<a name="line-778"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"externalid"</font><font color=Cyan>,</font> externalid <font color=Cyan>>>=</font> return <font color=Cyan>.</font> PEDefExternalID<font color=Cyan>)</font>+<a name="line-779"></a> <font color=Red>]</font>+<a name="line-780"></a>+<a name="line-781"></a><a name="externalid"></a><font color=Blue>externalid</font> <font color=Red>::</font> XParser ExternalID+<a name="line-782"></a><font color=Blue>externalid</font> <font color=Red>=</font>+<a name="line-783"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"SYSTEM"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> word <font color=Magenta>"SYSTEM"</font>+<a name="line-784"></a> s <font color=Red><-</font> systemliteral+<a name="line-785"></a> return <font color=Cyan>(</font>SYSTEM s<font color=Cyan>)</font> <font color=Cyan>)</font>+<a name="line-786"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"PUBLIC"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> word <font color=Magenta>"PUBLIC"</font>+<a name="line-787"></a> p <font color=Red><-</font> pubidliteral+<a name="line-788"></a> s <font color=Red><-</font> systemliteral+<a name="line-789"></a> return <font color=Cyan>(</font>PUBLIC p s<font color=Cyan>)</font> <font color=Cyan>)</font>+<a name="line-790"></a> <font color=Red>]</font>+<a name="line-791"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for an external id,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-792"></a>+<a name="line-793"></a><a name="ndatadecl"></a><font color=Blue>ndatadecl</font> <font color=Red>::</font> XParser NDataDecl+<a name="line-794"></a><font color=Blue>ndatadecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-795"></a> word <font color=Magenta>"NDATA"</font>+<a name="line-796"></a> n <font color=Red><-</font> name+<a name="line-797"></a> return <font color=Cyan>(</font>NDATA n<font color=Cyan>)</font>+<a name="line-798"></a>+<a name="line-799"></a><a name="textdecl"></a><font color=Blue>textdecl</font> <font color=Red>::</font> XParser TextDecl+<a name="line-800"></a><font color=Blue>textdecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-801"></a> tok TokPIOpen+<a name="line-802"></a> <font color=Cyan>(</font>word <font color=Magenta>"xml"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"XML"</font><font color=Cyan>)</font>+<a name="line-803"></a> v <font color=Red><-</font> maybe versioninfo+<a name="line-804"></a> e <font color=Red><-</font> encodingdecl+<a name="line-805"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failP <font color=Magenta>"expected ?> terminating text decl"</font>+<a name="line-806"></a> return <font color=Cyan>(</font>TextDecl v e<font color=Cyan>)</font>+<a name="line-807"></a>+<a name="line-808"></a><a name="extparsedent"></a><font color=Blue>extparsedent</font> <font color=Red>::</font> XParser <font color=Cyan>(</font>ExtParsedEnt Posn<font color=Cyan>)</font>+<a name="line-809"></a><font color=Blue>extparsedent</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-810"></a> t <font color=Red><-</font> maybe textdecl+<a name="line-811"></a> c <font color=Red><-</font> content+<a name="line-812"></a> return <font color=Cyan>(</font>ExtParsedEnt t c<font color=Cyan>)</font>+<a name="line-813"></a>+<a name="line-814"></a><a name="extpe"></a><font color=Blue>extpe</font> <font color=Red>::</font> XParser ExtPE+<a name="line-815"></a><font color=Blue>extpe</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-816"></a> t <font color=Red><-</font> maybe textdecl+<a name="line-817"></a> e <font color=Red><-</font> many <font color=Cyan>(</font>peRef extsubsetdecl<font color=Cyan>)</font>+<a name="line-818"></a> return <font color=Cyan>(</font>ExtPE t e<font color=Cyan>)</font>+<a name="line-819"></a>+<a name="line-820"></a><a name="encodingdecl"></a><font color=Blue>encodingdecl</font> <font color=Red>::</font> XParser EncodingDecl+<a name="line-821"></a><font color=Blue>encodingdecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-822"></a> <font color=Cyan>(</font>word <font color=Magenta>"encoding"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"ENCODING"</font><font color=Cyan>)</font>+<a name="line-823"></a> tok TokEqual <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"expected = in 'encoding' decl"</font>+<a name="line-824"></a> f <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext+<a name="line-825"></a> return <font color=Cyan>(</font>EncodingDecl f<font color=Cyan>)</font>+<a name="line-826"></a>+<a name="line-827"></a><a name="notationdecl"></a><font color=Blue>notationdecl</font> <font color=Red>::</font> XParser NotationDecl+<a name="line-828"></a><font color=Blue>notationdecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-829"></a> tok TokSpecialOpen+<a name="line-830"></a> tok <font color=Cyan>(</font>TokSpecial NOTATIONx<font color=Cyan>)</font>+<a name="line-831"></a> n <font color=Red><-</font> name+<a name="line-832"></a> e <font color=Red><-</font> either externalid publicid+<a name="line-833"></a> tok TokAnyClose <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"expected > terminating NOTATION decl "</font><font color=Cyan>++</font>n<font color=Cyan>)</font>+<a name="line-834"></a> return <font color=Cyan>(</font>NOTATION n e<font color=Cyan>)</font>+<a name="line-835"></a>+<a name="line-836"></a><a name="publicid"></a><font color=Blue>publicid</font> <font color=Red>::</font> XParser PublicID+<a name="line-837"></a><font color=Blue>publicid</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-838"></a> word <font color=Magenta>"PUBLIC"</font>+<a name="line-839"></a> p <font color=Red><-</font> pubidliteral+<a name="line-840"></a> return <font color=Cyan>(</font>PUBLICID p<font color=Cyan>)</font>+<a name="line-841"></a>+<a name="line-842"></a><a name="entityvalue"></a><font color=Blue>entityvalue</font> <font color=Red>::</font> XParser EntityValue+<a name="line-843"></a><font color=Blue>entityvalue</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-844"></a> <font color=Blue>-- evs <- bracket (tok TokQuote) (tok TokQuote) (many (peRef ev))</font>+<a name="line-845"></a> tok TokQuote+<a name="line-846"></a> pn <font color=Red><-</font> posn+<a name="line-847"></a> evs <font color=Red><-</font> many ev+<a name="line-848"></a> tok TokQuote <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"expected quote to terminate entityvalue"</font>+<a name="line-849"></a> <font color=Blue>-- quoted text must be rescanned for possible PERefs</font>+<a name="line-850"></a> st <font color=Red><-</font> stGet+<a name="line-851"></a> Prelude<font color=Cyan>.</font>either failBad <font color=Cyan>(</font>return <font color=Cyan>.</font> EntityValue<font color=Cyan>)</font> <font color=Cyan>.</font> fst3 <font color=Cyan>$</font>+<a name="line-852"></a> <font color=Cyan>(</font>runParser <font color=Cyan>(</font>many ev<font color=Cyan>)</font> st+<a name="line-853"></a> <font color=Cyan>(</font>reLexEntityValue <font color=Cyan>(</font><font color=Red>\</font>s<font color=Red>-></font> stringify <font color=Cyan>(</font>lookupPE s st<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-854"></a> pn+<a name="line-855"></a> <font color=Cyan>(</font>flattenEV <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-856"></a> <font color=Green><u>where</u></font>+<a name="line-857"></a> stringify <font color=Cyan>(</font>Just <font color=Cyan>(</font>PEDefEntityValue ev<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> Just <font color=Cyan>(</font>flattenEV ev<font color=Cyan>)</font>+<a name="line-858"></a> stringify <font color=Green><u>_</u></font> <font color=Red>=</font> Nothing+<a name="line-859"></a>+<a name="line-860"></a><a name="ev"></a><font color=Blue>ev</font> <font color=Red>::</font> XParser EV+<a name="line-861"></a><font color=Blue>ev</font> <font color=Red>=</font>+<a name="line-862"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"string"</font><font color=Cyan>,</font> <font color=Cyan>(</font>string<font color=Cyan>`onFail`</font>freetext<font color=Cyan>)</font> <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EVString<font color=Cyan>)</font>+<a name="line-863"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"reference"</font><font color=Cyan>,</font> reference <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EVRef<font color=Cyan>)</font>+<a name="line-864"></a> <font color=Red>]</font>+<a name="line-865"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for entity value,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-866"></a>+<a name="line-867"></a><a name="attvalue"></a><font color=Blue>attvalue</font> <font color=Red>::</font> XParser AttValue+<a name="line-868"></a><font color=Blue>attvalue</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-869"></a> avs <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font>+<a name="line-870"></a> <font color=Cyan>(</font>many <font color=Cyan>(</font>either freetext reference<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-871"></a> return <font color=Cyan>(</font>AttValue avs<font color=Cyan>)</font>+<a name="line-872"></a>+<a name="line-873"></a><a name="systemliteral"></a><font color=Blue>systemliteral</font> <font color=Red>::</font> XParser SystemLiteral+<a name="line-874"></a><font color=Blue>systemliteral</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-875"></a> s <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext+<a name="line-876"></a> return <font color=Cyan>(</font>SystemLiteral s<font color=Cyan>)</font> <font color=Blue>-- note: refs &...; not permitted</font>+<a name="line-877"></a>+<a name="line-878"></a><a name="pubidliteral"></a><font color=Blue>pubidliteral</font> <font color=Red>::</font> XParser PubidLiteral+<a name="line-879"></a><font color=Blue>pubidliteral</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-880"></a> s <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext+<a name="line-881"></a> return <font color=Cyan>(</font>PubidLiteral s<font color=Cyan>)</font> <font color=Blue>-- note: freetext is too liberal here</font>+<a name="line-882"></a>+<a name="line-883"></a><a name="chardata"></a><font color=Blue>-- | Return parsed freetext (i.e. until the next markup)</font>+<a name="line-884"></a><font color=Blue>chardata</font> <font color=Red>::</font> XParser CharData+<a name="line-885"></a><font color=Blue>chardata</font> <font color=Red>=</font> freetext+<a name="line-886"></a>+</pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/ParseLazy.html view
@@ -1,892 +1,906 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>-- | A non-validating XML parser. For the input grammar, see</font>-<a name="(line2)"></a><font color=Blue>-- <<a href="http://www.w3.org/TR/REC-xml">http://www.w3.org/TR/REC-xml</a>>.</font>-<a name="(line3)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>ParseLazy-<a name="(line4)"></a> <font color=Cyan>(</font>-<a name="(line5)"></a> <font color=Blue>-- * Parse a whole document</font>-<a name="(line6)"></a> xmlParse <font color=Blue>-- , xmlParse'</font>-<a name="(line7)"></a> <font color=Blue>-- * Parse just a DTD</font>-<a name="(line8)"></a> <font color=Cyan>,</font> dtdParse <font color=Blue>-- , dtdParse'</font>-<a name="(line9)"></a> <font color=Blue>-- * Parse a partial document</font>-<a name="(line10)"></a> <font color=Cyan>,</font> xmlParseWith-<a name="(line11)"></a> <font color=Blue>-- * Individual parsers for use with /xmlParseWith/ and module SAX</font>-<a name="(line12)"></a> <font color=Cyan>,</font> document<font color=Cyan>,</font> element<font color=Cyan>,</font> content-<a name="(line13)"></a> <font color=Cyan>,</font> comment<font color=Cyan>,</font> chardata-<a name="(line14)"></a> <font color=Cyan>,</font> reference<font color=Cyan>,</font> doctypedecl-<a name="(line15)"></a> <font color=Cyan>,</font> processinginstruction-<a name="(line16)"></a> <font color=Cyan>,</font> elemtag<font color=Cyan>,</font> name<font color=Cyan>,</font> tok-<a name="(line17)"></a> <font color=Cyan>,</font> elemOpenTag<font color=Cyan>,</font> elemCloseTag-<a name="(line18)"></a> <font color=Cyan>,</font> emptySTs<font color=Cyan>,</font> XParser-<a name="(line19)"></a> <font color=Blue>-- * These general utility functions don't belong here</font>-<a name="(line20)"></a> <font color=Cyan>,</font> fst3<font color=Cyan>,</font> snd3<font color=Cyan>,</font> thd3-<a name="(line21)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line22)"></a>-<a name="(line23)"></a><font color=Blue>-- An XML parser, written using a slightly extended version of the</font>-<a name="(line24)"></a><font color=Blue>-- Hutton/Meijer parser combinators. The input is tokenised internally</font>-<a name="(line25)"></a><font color=Blue>-- by the lexer xmlLex. Whilst parsing, we gather a symbol</font>-<a name="(line26)"></a><font color=Blue>-- table of entity references. PERefs must be defined before use, so we</font>-<a name="(line27)"></a><font color=Blue>-- expand their uses as we encounter them, forcing the remainder of the</font>-<a name="(line28)"></a><font color=Blue>-- input to be re-lexed and re-parsed. GERefs are simply stored for</font>-<a name="(line29)"></a><font color=Blue>-- later retrieval.</font>-<a name="(line30)"></a>-<a name="(line31)"></a><font color=Green><u>import</u></font> Prelude hiding <font color=Cyan>(</font>either<font color=Cyan>,</font>maybe<font color=Cyan>,</font>sequence<font color=Cyan>,</font>catch<font color=Cyan>)</font>-<a name="(line32)"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Prelude <font color=Cyan>(</font>either<font color=Cyan>)</font>-<a name="(line33)"></a><font color=Green><u>import</u></font> Maybe hiding <font color=Cyan>(</font>maybe<font color=Cyan>)</font>-<a name="(line34)"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>intersperse<font color=Cyan>)</font> <font color=Blue>-- debugging only</font>-<a name="(line35)"></a><font color=Green><u>import</u></font> Char <font color=Cyan>(</font>isSpace<font color=Cyan>,</font>isDigit<font color=Cyan>,</font>isHexDigit<font color=Cyan>)</font>-<a name="(line36)"></a><font color=Green><u>import</u></font> Monad hiding <font color=Cyan>(</font>sequence<font color=Cyan>)</font>-<a name="(line37)"></a><font color=Green><u>import</u></font> Numeric <font color=Cyan>(</font>readDec<font color=Cyan>,</font>readHex<font color=Cyan>)</font>-<a name="(line38)"></a><font color=Blue>--import Control.Exception (catch)</font>-<a name="(line39)"></a>-<a name="(line40)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line41)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Posn-<a name="(line42)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Lex-<a name="(line43)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>Poly<font color=Cyan>.</font>NoLeak<font color=Cyan>.</font>StateLazy-<a name="(line44)"></a>-<a name="(line45)"></a>-<a name="(line46)"></a><font color=Magenta><em>#if ( defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 502 ) || \</em></font>-<a name="(line47)"></a> <font color=Cyan>(</font> defined<font color=Cyan>(</font><b><font color=Magenta>__NHC__</font></b><font color=Cyan>)</font> <font color=Cyan>&&</font> <b><font color=Magenta>__NHC__</font></b> <font color=Cyan>></font> <font color=Magenta>114</font> <font color=Cyan>)</font> <font color=Cyan>||</font> defined<font color=Cyan>(</font><b><font color=Magenta>__HUGS__</font></b><font color=Cyan>)</font>-<a name="(line48)"></a><font color=Green><u>import</u></font> System<font color=Cyan>.</font>IO<font color=Cyan>.</font>Unsafe <font color=Cyan>(</font>unsafePerformIO<font color=Cyan>)</font>-<a name="(line49)"></a><font color=Magenta><em>#elif defined(__GLASGOW_HASKELL__)</em></font>-<a name="(line50)"></a><font color=Green><u>import</u></font> IOExts <font color=Cyan>(</font>unsafePerformIO<font color=Cyan>)</font>-<a name="(line51)"></a><font color=Magenta><em>#elif defined(__NHC__)</em></font>-<a name="(line52)"></a><font color=Green><u>import</u></font> IOExtras <font color=Cyan>(</font>unsafePerformIO<font color=Cyan>)</font>-<a name="(line53)"></a><font color=Magenta><em>#elif defined(__HBC__)</em></font>-<a name="(line54)"></a><font color=Green><u>import</u></font> UnsafePerformIO-<a name="(line55)"></a><font color=Magenta><em>#endif</em></font>-<a name="(line56)"></a>-<a name="(line57)"></a><font color=Blue>-- #define DEBUG</font>-<a name="(line58)"></a>-<a name="(line59)"></a><font color=Magenta><em>#if defined(DEBUG)</em></font>-<a name="(line60)"></a><font color=Magenta><em># if ( defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 502 ) || \</em></font>-<a name="(line61)"></a> <font color=Cyan>(</font> defined<font color=Cyan>(</font><b><font color=Magenta>__NHC__</font></b><font color=Cyan>)</font> <font color=Cyan>&&</font> <b><font color=Magenta>__NHC__</font></b> <font color=Cyan>></font> <font color=Magenta>114</font> <font color=Cyan>)</font> <font color=Cyan>||</font> defined<font color=Cyan>(</font><b><font color=Magenta>__HUGS__</font></b><font color=Cyan>)</font>-<a name="(line62)"></a><font color=Green><u>import</u></font> Debug<font color=Cyan>.</font>Trace<font color=Cyan>(</font>trace<font color=Cyan>)</font>-<a name="(line63)"></a><font color=Magenta><em># elif defined(__GLASGOW_HASKELL__)</em></font>-<a name="(line64)"></a><font color=Green><u>import</u></font> IOExts<font color=Cyan>(</font>trace<font color=Cyan>)</font>-<a name="(line65)"></a><font color=Magenta><em># elif defined(__NHC__) || defined(__HBC__)</em></font>-<a name="(line66)"></a><font color=Green><u>import</u></font> NonStdTrace-<a name="(line67)"></a><font color=Magenta><em># endif</em></font>-<a name="(line68)"></a><a name="debug"></a>debug <font color=Red>::</font> a <font color=Red>-></font> String <font color=Red>-></font> a-<a name="(line69)"></a><a name="debug"></a>v <font color=Cyan>`debug`</font> s <font color=Red>=</font> trace s v-<a name="(line70)"></a><font color=Magenta><em>#else</em></font>-<a name="(line71)"></a><a name="debug"></a>v <font color=Cyan>`debug`</font> s <font color=Red>=</font> v-<a name="(line72)"></a><font color=Magenta><em>#endif</em></font>-<a name="(line73)"></a>-<a name="(line74)"></a>-<a name="(line75)"></a><a name="xmlParse"></a><font color=Blue>-- | To parse a whole document, @xmlParse file content@ takes a filename</font>-<a name="(line76)"></a><font color=Blue>-- (for generating error reports) and the string content of that file.</font>-<a name="(line77)"></a><font color=Blue>-- A parse error causes program failure, with message to stderr.</font>-<a name="(line78)"></a>xmlParse <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Document Posn-<a name="(line79)"></a>-<a name="(line80)"></a><font color=Blue>{--<a name="(line81)"></a>-- | To parse a whole document, @xmlParse' file content@ takes a filename-<a name="(line82)"></a>-- (for generating error reports) and the string content of that file.-<a name="(line83)"></a>-- Any parse error message is passed back to the caller through the-<a name="(line84)"></a>-- @Either@ type.-<a name="(line85)"></a>xmlParse' :: String -> String -> Either String (Document Posn)-<a name="(line86)"></a>-<a name="(line87)"></a>-- | To parse just a DTD, @dtdParse file content@ takes a filename-<a name="(line88)"></a>-- (for generating error reports) and the string content of that-<a name="(line89)"></a>-- file. If no DTD was found, you get @Nothing@ rather than an error.-<a name="(line90)"></a>-- However, if a DTD is found but contains errors, the program crashes.-<a name="(line91)"></a>dtdParse :: String -> String -> Maybe DocTypeDecl-<a name="(line92)"></a>-<a name="(line93)"></a>-- | To parse just a DTD, @dtdParse' file content@ takes a filename-<a name="(line94)"></a>-- (for generating error reports) and the string content of that-<a name="(line95)"></a>-- file. If no DTD was found, you get @Right Nothing@.-<a name="(line96)"></a>-- If a DTD was found but contains errors, you get a @Left message@.-<a name="(line97)"></a>dtdParse' :: String -> String -> Either String (Maybe DocTypeDecl)-<a name="(line98)"></a>-<a name="(line99)"></a>xmlParse' name inp = xmlParse name inp `catch` (Left . show)-<a name="(line100)"></a>dtdParse' name inp = dtdParse name inp `catch` (Left . show)-<a name="(line101)"></a>-}</font>-<a name="(line102)"></a>-<a name="(line103)"></a>xmlParse name <font color=Red>=</font> fst3 <font color=Cyan>.</font> runParser <font color=Cyan>(</font>toEOF document<font color=Cyan>)</font> emptySTs <font color=Cyan>.</font> xmlLex name-<a name="(line104)"></a><a name="dtdParse"></a>dtdParse name <font color=Red>=</font> fst3 <font color=Cyan>.</font> runParser justDTD emptySTs <font color=Cyan>.</font> xmlLex name-<a name="(line105)"></a>-<a name="(line106)"></a>-<a name="(line107)"></a><a name="toEOF"></a>toEOF <font color=Red>=</font> id <font color=Blue>-- there are other possible implementations...</font>-<a name="(line108)"></a>-<a name="(line109)"></a><a name="xmlParseWith"></a><font color=Blue>-- | To parse a partial document, e.g. from an XML-based stream protocol,</font>-<a name="(line110)"></a><font color=Blue>-- where you may later want to get more document elements from the same</font>-<a name="(line111)"></a><font color=Blue>-- stream. Arguments are: a parser for the item you want, and the</font>-<a name="(line112)"></a><font color=Blue>-- already-lexed input to parse from. Returns the item you wanted</font>-<a name="(line113)"></a><font color=Blue>-- (or an error message), plus the remainder of the input.</font>-<a name="(line114)"></a>xmlParseWith <font color=Red>::</font> XParser a <font color=Red>-></font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>TokenT<font color=Cyan>)</font><font color=Red>]</font>-<a name="(line115)"></a> <font color=Red>-></font> <font color=Cyan>(</font>Either String a<font color=Cyan>,</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>TokenT<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line116)"></a>xmlParseWith p <font color=Red>=</font> <font color=Cyan>(</font><font color=Red>\</font><font color=Cyan>(</font>v<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font>s<font color=Cyan>)</font><font color=Red>-></font><font color=Cyan>(</font>Right v<font color=Cyan>,</font>s<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>.</font> runParser p emptySTs-<a name="(line117)"></a>-<a name="(line118)"></a>-<a name="(line119)"></a><font color=Blue>---- Symbol table stuff ----</font>-<a name="(line120)"></a>-<a name="(line121)"></a><a name="SymTabs"></a><font color=Green><u>type</u></font> SymTabs <font color=Red>=</font> <font color=Cyan>(</font>SymTab PEDef<font color=Cyan>,</font> SymTab EntityDef<font color=Cyan>)</font>-<a name="(line122)"></a>-<a name="(line123)"></a><a name="emptySTs"></a><font color=Blue>-- | Some empty symbol tables for GE and PE references.</font>-<a name="(line124)"></a>emptySTs <font color=Red>::</font> SymTabs-<a name="(line125)"></a>emptySTs <font color=Red>=</font> <font color=Cyan>(</font>emptyST<font color=Cyan>,</font> emptyST<font color=Cyan>)</font>-<a name="(line126)"></a>-<a name="(line127)"></a><a name="addPE"></a>addPE <font color=Red>::</font> String <font color=Red>-></font> PEDef <font color=Red>-></font> SymTabs <font color=Red>-></font> SymTabs-<a name="(line128)"></a>addPE n v <font color=Cyan>(</font>pe<font color=Cyan>,</font>ge<font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>addST n v pe<font color=Cyan>,</font> ge<font color=Cyan>)</font>-<a name="(line129)"></a>-<a name="(line130)"></a><a name="addGE"></a>addGE <font color=Red>::</font> String <font color=Red>-></font> EntityDef <font color=Red>-></font> SymTabs <font color=Red>-></font> SymTabs-<a name="(line131)"></a>addGE n v <font color=Cyan>(</font>pe<font color=Cyan>,</font>ge<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>let</u></font> newge <font color=Red>=</font> addST n v ge <font color=Green><u>in</u></font> newge <font color=Cyan>`seq`</font> <font color=Cyan>(</font>pe<font color=Cyan>,</font> newge<font color=Cyan>)</font>-<a name="(line132)"></a>-<a name="(line133)"></a><a name="lookupPE"></a>lookupPE <font color=Red>::</font> String <font color=Red>-></font> SymTabs <font color=Red>-></font> Maybe PEDef-<a name="(line134)"></a>lookupPE s <font color=Cyan>(</font>pe<font color=Cyan>,</font>ge<font color=Cyan>)</font> <font color=Red>=</font> lookupST s pe-<a name="(line135)"></a>-<a name="(line136)"></a><a name="flattenEV"></a>flattenEV <font color=Red>::</font> EntityValue <font color=Red>-></font> String-<a name="(line137)"></a>flattenEV <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font> <font color=Red>=</font> concatMap flatten evs-<a name="(line138)"></a> <font color=Green><u>where</u></font>-<a name="(line139)"></a> flatten <font color=Cyan>(</font>EVString s<font color=Cyan>)</font> <font color=Red>=</font> s-<a name="(line140)"></a> flatten <font color=Cyan>(</font>EVRef <font color=Cyan>(</font>RefEntity r<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"&"</font> <font color=Cyan>++</font>r<font color=Cyan>++</font><font color=Magenta>";"</font>-<a name="(line141)"></a> flatten <font color=Cyan>(</font>EVRef <font color=Cyan>(</font>RefChar r<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"&#"</font><font color=Cyan>++</font>show r<font color=Cyan>++</font><font color=Magenta>";"</font>-<a name="(line142)"></a> <font color=Blue>-- flatten (EVPERef n) = "%" ++n++";"</font>-<a name="(line143)"></a>-<a name="(line144)"></a>-<a name="(line145)"></a><a name="fst3"></a><font color=Blue>---- Misc ----</font>-<a name="(line146)"></a>fst3 <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>-></font> a-<a name="(line147)"></a><a name="snd3"></a>snd3 <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>-></font> b-<a name="(line148)"></a><a name="thd3"></a>thd3 <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>-></font> c-<a name="(line149)"></a>-<a name="(line150)"></a>fst3 <font color=Cyan>(</font>a<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> a-<a name="(line151)"></a>snd3 <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font>a<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> a-<a name="(line152)"></a>thd3 <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font>a<font color=Cyan>)</font> <font color=Red>=</font> a-<a name="(line153)"></a>-<a name="(line154)"></a>-<a name="(line155)"></a><font color=Blue>---- Auxiliary Parsing Functions ----</font>-<a name="(line156)"></a>-<a name="(line157)"></a><a name="XParser"></a><font color=Blue>-- | XParser is just a specialisation of the PolyStateLazy parser.</font>-<a name="(line158)"></a><a name="XParser"></a><font color=Green><u>type</u></font> XParser a <font color=Red>=</font> Parser SymTabs <font color=Cyan>(</font>Posn<font color=Cyan>,</font>TokenT<font color=Cyan>)</font> a-<a name="(line159)"></a>-<a name="(line160)"></a><a name="tok"></a><font color=Blue>-- | Return the next token from the input only if it matches the given token.</font>-<a name="(line161)"></a>tok <font color=Red>::</font> TokenT <font color=Red>-></font> XParser TokenT-<a name="(line162)"></a>tok t <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t'<font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line163)"></a> <font color=Green><u>case</u></font> t' <font color=Green><u>of</u></font> TokError <font color=Green><u>_</u></font> <font color=Red>-></font> report failBad <font color=Cyan>(</font>show t<font color=Cyan>)</font> p t'-<a name="(line164)"></a> <font color=Green><u>_</u></font> <font color=Red>|</font> t'<font color=Cyan>==</font>t <font color=Red>-></font> return t-<a name="(line165)"></a> <font color=Red>|</font> otherwise <font color=Red>-></font> report fail <font color=Cyan>(</font>show t<font color=Cyan>)</font> p t'-<a name="(line166)"></a><a name="nottok"></a>nottok <font color=Red>::</font> <font color=Red>[</font>TokenT<font color=Red>]</font> <font color=Red>-></font> XParser TokenT-<a name="(line167)"></a>nottok ts <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line168)"></a> <font color=Green><u>if</u></font> t<font color=Cyan>`elem`</font>ts <font color=Green><u>then</u></font> report fail <font color=Cyan>(</font><font color=Magenta>"no "</font><font color=Cyan>++</font>show t<font color=Cyan>)</font> p t-<a name="(line169)"></a> <font color=Green><u>else</u></font> return t-<a name="(line170)"></a>-<a name="(line171)"></a><a name="name"></a><font color=Blue>-- | Return just a name, e.g. element name, attribute name.</font>-<a name="(line172)"></a>name <font color=Red>::</font> XParser Name-<a name="(line173)"></a>name <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>tok<font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line174)"></a> <font color=Green><u>case</u></font> tok <font color=Green><u>of</u></font>-<a name="(line175)"></a> TokName s <font color=Red>-></font> return s-<a name="(line176)"></a> TokError <font color=Green><u>_</u></font> <font color=Red>-></font> report failBad <font color=Magenta>"a name"</font> p tok-<a name="(line177)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"a name"</font> p tok-<a name="(line178)"></a>-<a name="(line179)"></a><a name="string"></a>string<font color=Cyan>,</font> freetext <font color=Red>::</font> XParser String-<a name="(line180)"></a>string <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line181)"></a> <font color=Green><u>case</u></font> t <font color=Green><u>of</u></font> TokName s <font color=Red>-></font> return s-<a name="(line182)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"text"</font> p t-<a name="(line183)"></a><a name="freetext"></a>freetext <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line184)"></a> <font color=Green><u>case</u></font> t <font color=Green><u>of</u></font> TokFreeText s <font color=Red>-></font> return s-<a name="(line185)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"text"</font> p t-<a name="(line186)"></a>-<a name="(line187)"></a><a name="maybe"></a>maybe <font color=Red>::</font> XParser a <font color=Red>-></font> XParser <font color=Cyan>(</font>Maybe a<font color=Cyan>)</font>-<a name="(line188)"></a>maybe p <font color=Red>=</font>-<a name="(line189)"></a> <font color=Cyan>(</font> p <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Just<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line190)"></a> <font color=Cyan>(</font> return Nothing<font color=Cyan>)</font>-<a name="(line191)"></a>-<a name="(line192)"></a><a name="either"></a>either <font color=Red>::</font> XParser a <font color=Red>-></font> XParser b <font color=Red>-></font> XParser <font color=Cyan>(</font>Either a b<font color=Cyan>)</font>-<a name="(line193)"></a>either p q <font color=Red>=</font>-<a name="(line194)"></a> <font color=Cyan>(</font> p <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Left<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line195)"></a> <font color=Cyan>(</font> q <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Right<font color=Cyan>)</font>-<a name="(line196)"></a>-<a name="(line197)"></a><a name="word"></a>word <font color=Red>::</font> String <font color=Red>-></font> XParser ()-<a name="(line198)"></a>word s <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> x <font color=Red><-</font> next-<a name="(line199)"></a> <font color=Cyan>;</font> <font color=Green><u>case</u></font> x <font color=Green><u>of</u></font>-<a name="(line200)"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>TokName n<font color=Cyan>)</font> <font color=Red>|</font> s<font color=Cyan>==</font>n <font color=Red>-></font> return ()-<a name="(line201)"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>TokFreeText n<font color=Cyan>)</font> <font color=Red>|</font> s<font color=Cyan>==</font>n <font color=Red>-></font> return ()-<a name="(line202)"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Red>@</font><font color=Cyan>(</font>TokError <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> report failBad <font color=Cyan>(</font>show s<font color=Cyan>)</font> p t-<a name="(line203)"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red>-></font> report fail <font color=Cyan>(</font>show s<font color=Cyan>)</font> p t-<a name="(line204)"></a> <font color=Cyan>}</font>-<a name="(line205)"></a>-<a name="(line206)"></a><a name="posn"></a>posn <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> x<font color=Red>@</font><font color=Cyan>(</font>p<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red><-</font> next-<a name="(line207)"></a> <font color=Cyan>;</font> reparse <font color=Red>[</font>x<font color=Red>]</font>-<a name="(line208)"></a> <font color=Cyan>;</font> return p-<a name="(line209)"></a> <font color=Cyan>}</font>-<a name="(line210)"></a>-<a name="(line211)"></a><a name="nmtoken"></a>nmtoken <font color=Red>::</font> XParser NmToken-<a name="(line212)"></a>nmtoken <font color=Red>=</font> <font color=Cyan>(</font>string <font color=Cyan>`onFail`</font> freetext<font color=Cyan>)</font>-<a name="(line213)"></a>-<a name="(line214)"></a><a name="failP"></a>failP<font color=Cyan>,</font> failBadP <font color=Red>::</font> String <font color=Red>-></font> XParser a-<a name="(line215)"></a>failP msg <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn<font color=Cyan>;</font> fail <font color=Cyan>(</font>msg<font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font> <font color=Cyan>}</font>-<a name="(line216)"></a><a name="failBadP"></a>failBadP msg <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn<font color=Cyan>;</font> failBad <font color=Cyan>(</font>msg<font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font> <font color=Cyan>}</font>-<a name="(line217)"></a>-<a name="(line218)"></a><a name="report"></a>report <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>XParser a<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> Posn <font color=Red>-></font> TokenT <font color=Red>-></font> XParser a-<a name="(line219)"></a>report fail exp p t <font color=Red>=</font> fail <font color=Cyan>(</font><font color=Magenta>"Expected "</font><font color=Cyan>++</font>exp<font color=Cyan>++</font><font color=Magenta>" but found "</font><font color=Cyan>++</font>show t-<a name="(line220)"></a> <font color=Cyan>++</font><font color=Magenta>"\n in "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>-<a name="(line221)"></a>-<a name="(line222)"></a><a name="adjustErrP"></a>adjustErrP <font color=Red>::</font> XParser a <font color=Red>-></font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Cyan>)</font> <font color=Red>-></font> XParser a-<a name="(line223)"></a><a name="adjustErrP"></a>p <font color=Cyan>`adjustErrP`</font> f <font color=Red>=</font> p <font color=Cyan>`onFail`</font> <font color=Green><u>do</u></font> pn <font color=Red><-</font> posn-<a name="(line224)"></a> <font color=Cyan>(</font>p <font color=Cyan>`adjustErr`</font> f<font color=Cyan>)</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>++</font>show pn<font color=Cyan>)</font>-<a name="(line225)"></a>-<a name="(line226)"></a><a name="peRef"></a>peRef <font color=Red>::</font> XParser a <font color=Red>-></font> XParser a-<a name="(line227)"></a>peRef p <font color=Red>=</font>-<a name="(line228)"></a> p <font color=Cyan>`onFail`</font>-<a name="(line229)"></a> <font color=Green><u>do</u></font> pn <font color=Red><-</font> posn-<a name="(line230)"></a> n <font color=Red><-</font> pereference-<a name="(line231)"></a> tr <font color=Red><-</font> stQuery <font color=Cyan>(</font>lookupPE n<font color=Cyan>)</font> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"Looking up %"</font><font color=Cyan>++</font>n<font color=Cyan>)</font>-<a name="(line232)"></a> <font color=Green><u>case</u></font> tr <font color=Green><u>of</u></font>-<a name="(line233)"></a> Just <font color=Cyan>(</font>PEDefEntityValue ev<font color=Cyan>)</font> <font color=Red>-></font>-<a name="(line234)"></a> <font color=Green><u>do</u></font> reparse <font color=Cyan>(</font>xmlReLex <font color=Cyan>(</font>posInNewCxt <font color=Cyan>(</font><font color=Magenta>"macro %"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font>-<a name="(line235)"></a> <font color=Cyan>(</font>Just pn<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line236)"></a> <font color=Cyan>(</font>flattenEV ev<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line237)"></a> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>" defn: "</font><font color=Cyan>++</font>flattenEV ev<font color=Cyan>)</font>-<a name="(line238)"></a> peRef p-<a name="(line239)"></a> Just <font color=Cyan>(</font>PEDefExternalID <font color=Cyan>(</font>PUBLIC <font color=Green><u>_</u></font> <font color=Cyan>(</font>SystemLiteral f<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font>-<a name="(line240)"></a> <font color=Green><u>do</u></font> <font color=Green><u>let</u></font> val <font color=Red>=</font> unsafePerformIO <font color=Cyan>(</font>readFile f<font color=Cyan>)</font>-<a name="(line241)"></a> reparse <font color=Cyan>(</font>xmlReLex <font color=Cyan>(</font>posInNewCxt <font color=Cyan>(</font><font color=Magenta>"file "</font><font color=Cyan>++</font>f<font color=Cyan>)</font>-<a name="(line242)"></a> <font color=Cyan>(</font>Just pn<font color=Cyan>)</font><font color=Cyan>)</font> val<font color=Cyan>)</font>-<a name="(line243)"></a> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>" reading from file "</font><font color=Cyan>++</font>f<font color=Cyan>)</font>-<a name="(line244)"></a> peRef p-<a name="(line245)"></a> Just <font color=Cyan>(</font>PEDefExternalID <font color=Cyan>(</font>SYSTEM <font color=Cyan>(</font>SystemLiteral f<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font>-<a name="(line246)"></a> <font color=Green><u>do</u></font> <font color=Green><u>let</u></font> val <font color=Red>=</font> unsafePerformIO <font color=Cyan>(</font>readFile f<font color=Cyan>)</font>-<a name="(line247)"></a> reparse <font color=Cyan>(</font>xmlReLex <font color=Cyan>(</font>posInNewCxt <font color=Cyan>(</font><font color=Magenta>"file "</font><font color=Cyan>++</font>f<font color=Cyan>)</font>-<a name="(line248)"></a> <font color=Cyan>(</font>Just pn<font color=Cyan>)</font><font color=Cyan>)</font> val<font color=Cyan>)</font>-<a name="(line249)"></a> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>" reading from file "</font><font color=Cyan>++</font>f<font color=Cyan>)</font>-<a name="(line250)"></a> peRef p-<a name="(line251)"></a> Nothing <font color=Red>-></font> fail <font color=Cyan>(</font><font color=Magenta>"PEReference use before definition: "</font><font color=Cyan>++</font><font color=Magenta>"%"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font>-<a name="(line252)"></a> <font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show pn<font color=Cyan>)</font>-<a name="(line253)"></a>-<a name="(line254)"></a><a name="blank"></a>blank <font color=Red>::</font> XParser a <font color=Red>-></font> XParser a-<a name="(line255)"></a>blank p <font color=Red>=</font>-<a name="(line256)"></a> p <font color=Cyan>`onFail`</font>-<a name="(line257)"></a> <font color=Green><u>do</u></font> n <font color=Red><-</font> pereference-<a name="(line258)"></a> tr <font color=Red><-</font> stQuery <font color=Cyan>(</font>lookupPE n<font color=Cyan>)</font> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"Looking up %"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>" (is blank?)"</font><font color=Cyan>)</font>-<a name="(line259)"></a> <font color=Green><u>case</u></font> tr <font color=Green><u>of</u></font>-<a name="(line260)"></a> Just <font color=Cyan>(</font>PEDefEntityValue ev<font color=Cyan>)</font>-<a name="(line261)"></a> <font color=Red>|</font> all isSpace <font color=Cyan>(</font>flattenEV ev<font color=Cyan>)</font> <font color=Red>-></font>-<a name="(line262)"></a> <font color=Green><u>do</u></font> blank p <font color=Cyan>`debug`</font> <font color=Magenta>"Empty macro definition"</font>-<a name="(line263)"></a> Just <font color=Green><u>_</u></font> <font color=Red>-></font> failP <font color=Cyan>(</font><font color=Magenta>"expected a blank PERef macro: "</font><font color=Cyan>++</font><font color=Magenta>"%"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font>-<a name="(line264)"></a> Nothing <font color=Red>-></font> failP <font color=Cyan>(</font><font color=Magenta>"PEReference use before definition: "</font><font color=Cyan>++</font><font color=Magenta>"%"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font>-<a name="(line265)"></a>-<a name="(line266)"></a>-<a name="(line267)"></a>-<a name="(line268)"></a><font color=Blue>---- XML Parsing Functions ----</font>-<a name="(line269)"></a>-<a name="(line270)"></a><a name="justDTD"></a>justDTD <font color=Red>::</font> XParser <font color=Cyan>(</font>Maybe DocTypeDecl<font color=Cyan>)</font>-<a name="(line271)"></a>justDTD <font color=Red>=</font>-<a name="(line272)"></a> <font color=Green><u>do</u></font> <font color=Cyan>(</font>ExtSubset <font color=Green><u>_</u></font> ds<font color=Cyan>)</font> <font color=Red><-</font> extsubset <font color=Cyan>`debug`</font> <font color=Magenta>"Trying external subset"</font>-<a name="(line273)"></a> <font color=Green><u>if</u></font> null ds <font color=Green><u>then</u></font> fail <font color=Magenta>"empty"</font>-<a name="(line274)"></a> <font color=Green><u>else</u></font> return <font color=Cyan>(</font>Just <font color=Cyan>(</font>DTD <font color=Magenta>"extsubset"</font> Nothing <font color=Cyan>(</font>concatMap extract ds<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line275)"></a> <font color=Cyan>`onFail`</font>-<a name="(line276)"></a> <font color=Green><u>do</u></font> <font color=Cyan>(</font>Prolog <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> dtd <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red><-</font> prolog-<a name="(line277)"></a> return dtd-<a name="(line278)"></a> <font color=Green><u>where</u></font> extract <font color=Cyan>(</font>ExtMarkupDecl m<font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>m<font color=Red>]</font>-<a name="(line279)"></a> extract <font color=Cyan>(</font>ExtConditionalSect <font color=Cyan>(</font>IncludeSect i<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> concatMap extract i-<a name="(line280)"></a> extract <font color=Cyan>(</font>ExtConditionalSect <font color=Cyan>(</font>IgnoreSect i<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> []-<a name="(line281)"></a>-<a name="(line282)"></a><a name="document"></a><font color=Blue>-- | Return an entire XML document including prolog and trailing junk.</font>-<a name="(line283)"></a>document <font color=Red>::</font> XParser <font color=Cyan>(</font>Document Posn<font color=Cyan>)</font>-<a name="(line284)"></a>document <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line285)"></a> <font color=Blue>-- p <- prolog `adjustErr` ("unrecognisable XML prolog\n"++)</font>-<a name="(line286)"></a> <font color=Blue>-- e <- element</font>-<a name="(line287)"></a> <font color=Blue>-- ms <- many misc</font>-<a name="(line288)"></a> <font color=Blue>-- (_,ge) <- stGet</font>-<a name="(line289)"></a> <font color=Blue>-- return (Document p ge e ms)</font>-<a name="(line290)"></a> return Document <font color=Cyan>`apply`</font> <font color=Cyan>(</font>prolog <font color=Cyan>`adjustErr`</font>-<a name="(line291)"></a> <font color=Cyan>(</font><font color=Magenta>"unrecognisable XML prolog\n"</font><font color=Cyan>++</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line292)"></a> <font color=Cyan>`apply`</font> <font color=Cyan>(</font>fmap snd stGet<font color=Cyan>)</font>-<a name="(line293)"></a> <font color=Cyan>`apply`</font> element-<a name="(line294)"></a> <font color=Cyan>`apply`</font> many misc-<a name="(line295)"></a>-<a name="(line296)"></a><a name="comment"></a><font color=Blue>-- | Return an XML comment.</font>-<a name="(line297)"></a>comment <font color=Red>::</font> XParser Comment-<a name="(line298)"></a>comment <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line299)"></a> bracket <font color=Cyan>(</font>tok TokCommentOpen<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokCommentClose<font color=Cyan>)</font> freetext-<a name="(line300)"></a><font color=Blue>-- tok TokCommentOpen</font>-<a name="(line301)"></a><font color=Blue>-- commit $ do</font>-<a name="(line302)"></a><font color=Blue>-- c <- freetext</font>-<a name="(line303)"></a><font color=Blue>-- tok TokCommentClose</font>-<a name="(line304)"></a><font color=Blue>-- return c</font>-<a name="(line305)"></a>-<a name="(line306)"></a><a name="processinginstruction"></a><font color=Blue>-- | Parse a processing instruction.</font>-<a name="(line307)"></a>processinginstruction <font color=Red>::</font> XParser ProcessingInstruction-<a name="(line308)"></a>processinginstruction <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line309)"></a> tok TokPIOpen-<a name="(line310)"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>-<a name="(line311)"></a> n <font color=Red><-</font> string <font color=Cyan>`onFail`</font> failP <font color=Magenta>"processing instruction has no target"</font>-<a name="(line312)"></a> f <font color=Red><-</font> freetext-<a name="(line313)"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failP <font color=Cyan>(</font><font color=Magenta>"missing ?> in <?"</font><font color=Cyan>++</font>n<font color=Cyan>)</font>-<a name="(line314)"></a> return <font color=Cyan>(</font>n<font color=Cyan>,</font> f<font color=Cyan>)</font>-<a name="(line315)"></a>-<a name="(line316)"></a><a name="cdsect"></a>cdsect <font color=Red>::</font> XParser CDSect-<a name="(line317)"></a>cdsect <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line318)"></a> tok TokSectionOpen-<a name="(line319)"></a> bracket <font color=Cyan>(</font>tok <font color=Cyan>(</font>TokSection CDATAx<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSectionClose<font color=Cyan>)</font> chardata-<a name="(line320)"></a>-<a name="(line321)"></a><a name="prolog"></a>prolog <font color=Red>::</font> XParser Prolog-<a name="(line322)"></a>prolog <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line323)"></a> x <font color=Red><-</font> maybe xmldecl-<a name="(line324)"></a> m1 <font color=Red><-</font> many misc-<a name="(line325)"></a> dtd <font color=Red><-</font> maybe doctypedecl-<a name="(line326)"></a> m2 <font color=Red><-</font> many misc-<a name="(line327)"></a> return <font color=Cyan>(</font>Prolog x m1 dtd m2<font color=Cyan>)</font>-<a name="(line328)"></a>-<a name="(line329)"></a><a name="xmldecl"></a>xmldecl <font color=Red>::</font> XParser XMLDecl-<a name="(line330)"></a>xmldecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line331)"></a> tok TokPIOpen-<a name="(line332)"></a> <font color=Cyan>(</font>word <font color=Magenta>"xml"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"XML"</font><font color=Cyan>)</font>-<a name="(line333)"></a> p <font color=Red><-</font> posn-<a name="(line334)"></a> s <font color=Red><-</font> freetext-<a name="(line335)"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing ?> in <?xml ...?>"</font>-<a name="(line336)"></a> <font color=Blue>-- raise ((runParser aux emptySTs . xmlReLex p) s)</font>-<a name="(line337)"></a> return <font color=Cyan>(</font>fst3 <font color=Cyan>(</font><font color=Cyan>(</font>runParser aux emptySTs <font color=Cyan>.</font> xmlReLex p<font color=Cyan>)</font> s<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line338)"></a> <font color=Green><u>where</u></font>-<a name="(line339)"></a> aux <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line340)"></a> v <font color=Red><-</font> versioninfo <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing XML version info"</font>-<a name="(line341)"></a> e <font color=Red><-</font> maybe encodingdecl-<a name="(line342)"></a> s <font color=Red><-</font> maybe sddecl-<a name="(line343)"></a> return <font color=Cyan>(</font>XMLDecl v e s<font color=Cyan>)</font>-<a name="(line344)"></a> <font color=Blue>-- raise (Left err, _, _) = failP err</font>-<a name="(line345)"></a> <font color=Blue>-- raise (Right ok, _, _) = return ok</font>-<a name="(line346)"></a>-<a name="(line347)"></a><a name="versioninfo"></a>versioninfo <font color=Red>::</font> XParser VersionInfo-<a name="(line348)"></a>versioninfo <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line349)"></a> <font color=Cyan>(</font>word <font color=Magenta>"version"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"VERSION"</font><font color=Cyan>)</font>-<a name="(line350)"></a> tok TokEqual-<a name="(line351)"></a> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext-<a name="(line352)"></a>-<a name="(line353)"></a><a name="misc"></a>misc <font color=Red>::</font> XParser Misc-<a name="(line354)"></a>misc <font color=Red>=</font>-<a name="(line355)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"<!--comment-->"</font><font color=Cyan>,</font> comment <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Comment<font color=Cyan>)</font>-<a name="(line356)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"<?PI?>"</font><font color=Cyan>,</font> processinginstruction <font color=Cyan>>>=</font> return <font color=Cyan>.</font> PI<font color=Cyan>)</font>-<a name="(line357)"></a> <font color=Red>]</font>-<a name="(line358)"></a>-<a name="(line359)"></a><a name="doctypedecl"></a><font color=Blue>-- | Return a DOCTYPE decl, indicating a DTD.</font>-<a name="(line360)"></a>doctypedecl <font color=Red>::</font> XParser DocTypeDecl-<a name="(line361)"></a>doctypedecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line362)"></a> tok TokSpecialOpen-<a name="(line363)"></a> tok <font color=Cyan>(</font>TokSpecial DOCTYPEx<font color=Cyan>)</font>-<a name="(line364)"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>-<a name="(line365)"></a> n <font color=Red><-</font> name-<a name="(line366)"></a> eid <font color=Red><-</font> maybe externalid-<a name="(line367)"></a> es <font color=Red><-</font> maybe <font color=Cyan>(</font>bracket <font color=Cyan>(</font>tok TokSqOpen<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSqClose<font color=Cyan>)</font>-<a name="(line368)"></a> <font color=Cyan>(</font>many <font color=Cyan>(</font>peRef markupdecl<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line369)"></a> blank <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing > in DOCTYPE decl"</font>-<a name="(line370)"></a> return <font color=Cyan>(</font>DTD n eid <font color=Cyan>(</font><font color=Green><u>case</u></font> es <font color=Green><u>of</u></font> <font color=Cyan>{</font> Nothing <font color=Red>-></font> []<font color=Cyan>;</font> Just e <font color=Red>-></font> e <font color=Cyan>}</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line371)"></a>-<a name="(line372)"></a><a name="markupdecl"></a><font color=Blue>-- | Return a DTD markup decl, e.g. ELEMENT, ATTLIST, etc</font>-<a name="(line373)"></a>markupdecl <font color=Red>::</font> XParser MarkupDecl-<a name="(line374)"></a>markupdecl <font color=Red>=</font>-<a name="(line375)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"ELEMENT"</font><font color=Cyan>,</font> elementdecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Element<font color=Cyan>)</font>-<a name="(line376)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"ATTLIST"</font><font color=Cyan>,</font> attlistdecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> AttList<font color=Cyan>)</font>-<a name="(line377)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"ENTITY"</font><font color=Cyan>,</font> entitydecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Entity<font color=Cyan>)</font>-<a name="(line378)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"NOTATION"</font><font color=Cyan>,</font> notationdecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Notation<font color=Cyan>)</font>-<a name="(line379)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"misc"</font><font color=Cyan>,</font> misc <font color=Cyan>>>=</font> return <font color=Cyan>.</font> MarkupMisc<font color=Cyan>)</font>-<a name="(line380)"></a> <font color=Red>]</font>-<a name="(line381)"></a> <font color=Cyan>`adjustErrP`</font>-<a name="(line382)"></a> <font color=Cyan>(</font><font color=Magenta>"when looking for a markup decl,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line383)"></a> <font color=Blue>-- (\ (ELEMENT, ATTLIST, ENTITY, NOTATION, <!--comment-->, or <?PI?>")</font>-<a name="(line384)"></a>-<a name="(line385)"></a><a name="extsubset"></a>extsubset <font color=Red>::</font> XParser ExtSubset-<a name="(line386)"></a>extsubset <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line387)"></a> td <font color=Red><-</font> maybe textdecl-<a name="(line388)"></a> ds <font color=Red><-</font> many <font color=Cyan>(</font>peRef extsubsetdecl<font color=Cyan>)</font>-<a name="(line389)"></a> return <font color=Cyan>(</font>ExtSubset td ds<font color=Cyan>)</font>-<a name="(line390)"></a>-<a name="(line391)"></a><a name="extsubsetdecl"></a>extsubsetdecl <font color=Red>::</font> XParser ExtSubsetDecl-<a name="(line392)"></a>extsubsetdecl <font color=Red>=</font>-<a name="(line393)"></a> <font color=Cyan>(</font> markupdecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> ExtMarkupDecl<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line394)"></a> <font color=Cyan>(</font> conditionalsect <font color=Cyan>>>=</font> return <font color=Cyan>.</font> ExtConditionalSect<font color=Cyan>)</font>-<a name="(line395)"></a>-<a name="(line396)"></a><a name="sddecl"></a>sddecl <font color=Red>::</font> XParser SDDecl-<a name="(line397)"></a>sddecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line398)"></a> <font color=Cyan>(</font>word <font color=Magenta>"standalone"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"STANDALONE"</font><font color=Cyan>)</font>-<a name="(line399)"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>-<a name="(line400)"></a> tok TokEqual <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing = in 'standalone' decl"</font>-<a name="(line401)"></a> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font>-<a name="(line402)"></a> <font color=Cyan>(</font> <font color=Cyan>(</font>word <font color=Magenta>"yes"</font> <font color=Cyan>>></font> return True<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line403)"></a> <font color=Cyan>(</font>word <font color=Magenta>"no"</font> <font color=Cyan>>></font> return False<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line404)"></a> failP <font color=Magenta>"'standalone' decl requires 'yes' or 'no' value"</font> <font color=Cyan>)</font>-<a name="(line405)"></a>-<a name="(line406)"></a><font color=Blue>{--<a name="(line407)"></a>element :: XParser (Element Posn)-<a name="(line408)"></a>element = do-<a name="(line409)"></a> tok TokAnyOpen-<a name="(line410)"></a> (ElemTag n as) <- elemtag-<a name="(line411)"></a> oneOf' [ ("self-closing tag <"++n++"/>"-<a name="(line412)"></a> , do tok TokEndClose-<a name="(line413)"></a> return (Elem n as []))-<a name="(line414)"></a> , ("after open tag <"++n++">"-<a name="(line415)"></a> , do tok TokAnyClose-<a name="(line416)"></a> cs <- many content-<a name="(line417)"></a> p <- posn-<a name="(line418)"></a> m <- bracket (tok TokEndOpen) (tok TokAnyClose) name-<a name="(line419)"></a> checkmatch p n m-<a name="(line420)"></a> return (Elem n as cs))-<a name="(line421)"></a> ] `adjustErr` (("in element tag "++n++",\n")++)-<a name="(line422)"></a>-}</font>-<a name="(line423)"></a>-<a name="(line424)"></a><a name="element"></a><font color=Blue>-- | Return a complete element including all its inner content.</font>-<a name="(line425)"></a>element <font color=Red>::</font> XParser <font color=Cyan>(</font>Element Posn<font color=Cyan>)</font>-<a name="(line426)"></a>element <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line427)"></a> tok TokAnyOpen-<a name="(line428)"></a> <font color=Cyan>(</font>ElemTag n <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Red><-</font> elemtag-<a name="(line429)"></a> return <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan>`apply`</font>-<a name="(line430)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokEndClose-<a name="(line431)"></a> return []-<a name="(line432)"></a> <font color=Cyan>`onFail`</font>-<a name="(line433)"></a> <font color=Green><u>do</u></font> tok TokAnyClose-<a name="(line434)"></a> commit <font color=Cyan>$</font> manyFinally content-<a name="(line435)"></a> <font color=Cyan>(</font><font color=Green><u>do</u></font> p <font color=Red><-</font> posn-<a name="(line436)"></a> m <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokEndOpen<font color=Cyan>)</font>-<a name="(line437)"></a> <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font> name-<a name="(line438)"></a> checkmatch p n m<font color=Cyan>)</font>-<a name="(line439)"></a> <font color=Cyan>)</font> <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in element tag "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line440)"></a>-<a name="(line441)"></a><a name="checkmatch"></a>checkmatch <font color=Red>::</font> Posn <font color=Red>-></font> Name <font color=Red>-></font> Name <font color=Red>-></font> XParser ()-<a name="(line442)"></a>checkmatch p n m <font color=Red>=</font>-<a name="(line443)"></a> <font color=Green><u>if</u></font> n <font color=Cyan>==</font> m <font color=Green><u>then</u></font> return ()-<a name="(line444)"></a> <font color=Green><u>else</u></font> failBadP <font color=Cyan>(</font><font color=Magenta>"tag <"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>"> terminated by </"</font><font color=Cyan>++</font>m<font color=Cyan>++</font><font color=Magenta>">"</font><font color=Cyan>)</font>-<a name="(line445)"></a>-<a name="(line446)"></a><a name="elemtag"></a><font color=Blue>-- | Parse only the parts between angle brackets in an element tag.</font>-<a name="(line447)"></a>elemtag <font color=Red>::</font> XParser ElemTag-<a name="(line448)"></a>elemtag <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line449)"></a> n <font color=Red><-</font> name <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Magenta>"malformed element tag\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line450)"></a> <font color=Green><u>as</u></font> <font color=Red><-</font> many attribute-<a name="(line451)"></a> return <font color=Cyan>(</font>ElemTag n <font color=Green><u>as</u></font><font color=Cyan>)</font>-<a name="(line452)"></a>-<a name="(line453)"></a><a name="elemOpenTag"></a><font color=Blue>-- | For use with stream parsers - returns the complete opening element tag.</font>-<a name="(line454)"></a>elemOpenTag <font color=Red>::</font> XParser ElemTag-<a name="(line455)"></a>elemOpenTag <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line456)"></a> tok TokAnyOpen-<a name="(line457)"></a> e <font color=Red><-</font> elemtag-<a name="(line458)"></a> tok TokAnyClose-<a name="(line459)"></a> return e-<a name="(line460)"></a>-<a name="(line461)"></a><a name="elemCloseTag"></a><font color=Blue>-- | For use with stream parsers - accepts a closing tag, provided it</font>-<a name="(line462)"></a><font color=Blue>-- matches the given element name.</font>-<a name="(line463)"></a>elemCloseTag <font color=Red>::</font> Name <font color=Red>-></font> XParser ()-<a name="(line464)"></a>elemCloseTag n <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line465)"></a> tok TokEndOpen-<a name="(line466)"></a> p <font color=Red><-</font> posn-<a name="(line467)"></a> m <font color=Red><-</font> name-<a name="(line468)"></a> tok TokAnyClose-<a name="(line469)"></a> checkmatch p n m-<a name="(line470)"></a>-<a name="(line471)"></a><a name="attribute"></a>attribute <font color=Red>::</font> XParser Attribute-<a name="(line472)"></a>attribute <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line473)"></a> n <font color=Red><-</font> name <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"malformed attribute name\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line474)"></a> tok TokEqual <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing = in attribute"</font>-<a name="(line475)"></a> v <font color=Red><-</font> attvalue <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing attvalue"</font>-<a name="(line476)"></a> return <font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Cyan>)</font>-<a name="(line477)"></a>-<a name="(line478)"></a><a name="content"></a><font color=Blue>-- | Return a content particle, e.g. text, element, reference, etc</font>-<a name="(line479)"></a>content <font color=Red>::</font> XParser <font color=Cyan>(</font>Content Posn<font color=Cyan>)</font>-<a name="(line480)"></a>content <font color=Red>=</font>-<a name="(line481)"></a> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn-<a name="(line482)"></a> <font color=Cyan>;</font> c' <font color=Red><-</font> content'-<a name="(line483)"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>c' p<font color=Cyan>)</font>-<a name="(line484)"></a> <font color=Cyan>}</font>-<a name="(line485)"></a> <font color=Green><u>where</u></font>-<a name="(line486)"></a> content' <font color=Red>=</font> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"element"</font><font color=Cyan>,</font> element <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CElem<font color=Cyan>)</font>-<a name="(line487)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"chardata"</font><font color=Cyan>,</font> chardata <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CString False<font color=Cyan>)</font>-<a name="(line488)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"reference"</font><font color=Cyan>,</font> reference <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CRef<font color=Cyan>)</font>-<a name="(line489)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"CDATA"</font><font color=Cyan>,</font> cdsect <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CString True<font color=Cyan>)</font>-<a name="(line490)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"misc"</font><font color=Cyan>,</font> misc <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CMisc<font color=Cyan>)</font>-<a name="(line491)"></a> <font color=Red>]</font>-<a name="(line492)"></a> <font color=Cyan>`adjustErrP`</font> <font color=Cyan>(</font><font color=Magenta>"when looking for a content item,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line493)"></a><font color=Blue>-- (\ (element, text, reference, CDATA section, <!--comment-->, or <?PI?>")</font>-<a name="(line494)"></a>-<a name="(line495)"></a><a name="elementdecl"></a>elementdecl <font color=Red>::</font> XParser ElementDecl-<a name="(line496)"></a>elementdecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line497)"></a> tok TokSpecialOpen-<a name="(line498)"></a> tok <font color=Cyan>(</font>TokSpecial ELEMENTx<font color=Cyan>)</font>-<a name="(line499)"></a> n <font color=Red><-</font> peRef name <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Magenta>"expecting identifier in ELEMENT decl\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line500)"></a> c <font color=Red><-</font> peRef contentspec-<a name="(line501)"></a> <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in content spec of ELEMENT decl: "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>"\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line502)"></a> blank <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failBadP-<a name="(line503)"></a> <font color=Cyan>(</font><font color=Magenta>"expected > terminating ELEMENT decl"</font>-<a name="(line504)"></a> <font color=Cyan>++</font><font color=Magenta>"\n element name was "</font><font color=Cyan>++</font>show n-<a name="(line505)"></a> <font color=Cyan>++</font><font color=Magenta>"\n contentspec was "</font><font color=Cyan>++</font><font color=Cyan>(</font><font color=Red>\</font> <font color=Cyan>(</font>ContentSpec p<font color=Cyan>)</font><font color=Red>-></font> show p<font color=Cyan>)</font> c<font color=Cyan>)</font>-<a name="(line506)"></a> return <font color=Cyan>(</font>ElementDecl n c<font color=Cyan>)</font>-<a name="(line507)"></a>-<a name="(line508)"></a><a name="contentspec"></a>contentspec <font color=Red>::</font> XParser ContentSpec-<a name="(line509)"></a>contentspec <font color=Red>=</font>-<a name="(line510)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"EMPTY"</font><font color=Cyan>,</font> peRef <font color=Cyan>(</font>word <font color=Magenta>"EMPTY"</font><font color=Cyan>)</font> <font color=Cyan>>></font> return EMPTY<font color=Cyan>)</font>-<a name="(line511)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"ANY"</font><font color=Cyan>,</font> peRef <font color=Cyan>(</font>word <font color=Magenta>"ANY"</font><font color=Cyan>)</font> <font color=Cyan>>></font> return ANY<font color=Cyan>)</font>-<a name="(line512)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"mixed"</font><font color=Cyan>,</font> peRef mixed <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Mixed<font color=Cyan>)</font>-<a name="(line513)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"simple"</font><font color=Cyan>,</font> peRef cp <font color=Cyan>>>=</font> return <font color=Cyan>.</font> ContentSpec<font color=Cyan>)</font>-<a name="(line514)"></a> <font color=Red>]</font>-<a name="(line515)"></a> <font color=Blue>-- `adjustErr` ("when looking for content spec,\n"++)</font>-<a name="(line516)"></a> <font color=Blue>-- `adjustErr` (++"\nLooking for content spec (EMPTY, ANY, mixed, etc)")</font>-<a name="(line517)"></a>-<a name="(line518)"></a><a name="choice"></a>choice <font color=Red>::</font> XParser <font color=Red>[</font>CP<font color=Red>]</font>-<a name="(line519)"></a>choice <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line520)"></a> bracket <font color=Cyan>(</font>tok TokBraOpen <font color=Cyan>`debug`</font> <font color=Magenta>"Trying choice"</font><font color=Cyan>)</font>-<a name="(line521)"></a> <font color=Cyan>(</font>blank <font color=Cyan>(</font>tok TokBraClose <font color=Cyan>`debug`</font> <font color=Magenta>"Succeeded with choice"</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line522)"></a> <font color=Cyan>(</font>peRef cp <font color=Cyan>`sepBy1`</font> blank <font color=Cyan>(</font>tok TokPipe<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line523)"></a>-<a name="(line524)"></a><a name="sequence"></a>sequence <font color=Red>::</font> XParser <font color=Red>[</font>CP<font color=Red>]</font>-<a name="(line525)"></a>sequence <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Blue>-- bracket is inappropriate because of inner failBad</font>-<a name="(line526)"></a> <font color=Blue>-- bracket (tok TokBraOpen `debug` "Trying sequence")</font>-<a name="(line527)"></a> <font color=Blue>-- (blank (tok TokBraClose `debug` "Succeeded with sequence"))</font>-<a name="(line528)"></a> <font color=Blue>-- (peRef cp `sepBy1` blank (tok TokComma))</font>-<a name="(line529)"></a> tok TokBraOpen <font color=Cyan>`debug`</font> <font color=Magenta>"Trying sequence"</font>-<a name="(line530)"></a> cps <font color=Red><-</font> peRef cp <font color=Cyan>`sepBy1`</font> blank <font color=Cyan>(</font>tok TokComma<font color=Cyan>)</font>-<a name="(line531)"></a> blank <font color=Cyan>(</font>tok TokBraClose <font color=Cyan>`debug`</font> <font color=Magenta>"Succeeded with sequence"</font><font color=Cyan>)</font>-<a name="(line532)"></a> return cps-<a name="(line533)"></a>-<a name="(line534)"></a><a name="cp"></a>cp <font color=Red>::</font> XParser CP-<a name="(line535)"></a>cp <font color=Red>=</font> oneOf <font color=Red>[</font> <font color=Cyan>(</font> <font color=Green><u>do</u></font> n <font color=Red><-</font> name-<a name="(line536)"></a> m <font color=Red><-</font> modifier-<a name="(line537)"></a> <font color=Green><u>let</u></font> c <font color=Red>=</font> TagName n m-<a name="(line538)"></a> return c <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ContentSpec: name "</font><font color=Cyan>++</font>show c<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line539)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Green><u>do</u></font> ss <font color=Red><-</font> sequence-<a name="(line540)"></a> m <font color=Red><-</font> modifier-<a name="(line541)"></a> <font color=Green><u>let</u></font> c <font color=Red>=</font> Seq ss m-<a name="(line542)"></a> return c <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ContentSpec: sequence "</font><font color=Cyan>++</font>show c<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line543)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Green><u>do</u></font> cs <font color=Red><-</font> choice-<a name="(line544)"></a> m <font color=Red><-</font> modifier-<a name="(line545)"></a> <font color=Green><u>let</u></font> c <font color=Red>=</font> Choice cs m-<a name="(line546)"></a> return c <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ContentSpec: choice "</font><font color=Cyan>++</font>show c<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line547)"></a> <font color=Red>]</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>++</font><font color=Magenta>"\nwhen looking for a content particle"</font><font color=Cyan>)</font>-<a name="(line548)"></a>-<a name="(line549)"></a><a name="modifier"></a>modifier <font color=Red>::</font> XParser Modifier-<a name="(line550)"></a>modifier <font color=Red>=</font> oneOf <font color=Red>[</font> <font color=Cyan>(</font> tok TokStar <font color=Cyan>>></font> return Star <font color=Cyan>)</font>-<a name="(line551)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> tok TokQuery <font color=Cyan>>></font> return Query <font color=Cyan>)</font>-<a name="(line552)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> tok TokPlus <font color=Cyan>>></font> return Plus <font color=Cyan>)</font>-<a name="(line553)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> return None <font color=Cyan>)</font>-<a name="(line554)"></a> <font color=Red>]</font>-<a name="(line555)"></a>-<a name="(line556)"></a><font color=Blue>-- just for debugging</font>-<a name="(line557)"></a><font color=Green><u>instance</u></font> Show CP <font color=Green><u>where</u></font>-<a name="(line558)"></a> show <font color=Cyan>(</font>TagName n m<font color=Cyan>)</font> <font color=Red>=</font> n<font color=Cyan>++</font>show m-<a name="(line559)"></a> show <font color=Cyan>(</font>Choice cps m<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>'('</font><font color=Red><b>:</b></font> concat <font color=Cyan>(</font>intersperse <font color=Magenta>"|"</font> <font color=Cyan>(</font>map show cps<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line560)"></a> <font color=Cyan>++</font><font color=Magenta>")"</font><font color=Cyan>++</font>show m-<a name="(line561)"></a> show <font color=Cyan>(</font>Seq cps m<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>'('</font><font color=Red><b>:</b></font> concat <font color=Cyan>(</font>intersperse <font color=Magenta>","</font> <font color=Cyan>(</font>map show cps<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line562)"></a> <font color=Cyan>++</font><font color=Magenta>")"</font><font color=Cyan>++</font>show m-<a name="(line563)"></a><font color=Green><u>instance</u></font> Show Modifier <font color=Green><u>where</u></font>-<a name="(line564)"></a> show None <font color=Red>=</font> <font color=Magenta>""</font>-<a name="(line565)"></a> show Query <font color=Red>=</font> <font color=Magenta>"?"</font>-<a name="(line566)"></a> show Star <font color=Red>=</font> <font color=Magenta>"*"</font>-<a name="(line567)"></a> show Plus <font color=Red>=</font> <font color=Magenta>"+"</font>-<a name="(line568)"></a><font color=Blue>----</font>-<a name="(line569)"></a>-<a name="(line570)"></a><a name="mixed"></a>mixed <font color=Red>::</font> XParser Mixed-<a name="(line571)"></a>mixed <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line572)"></a> tok TokBraOpen-<a name="(line573)"></a> peRef <font color=Cyan>(</font><font color=Green><u>do</u></font> tok TokHash-<a name="(line574)"></a> word <font color=Magenta>"PCDATA"</font><font color=Cyan>)</font>-<a name="(line575)"></a> commit <font color=Cyan>$</font>-<a name="(line576)"></a> oneOf <font color=Red>[</font> <font color=Cyan>(</font> <font color=Green><u>do</u></font> cs <font color=Red><-</font> many <font color=Cyan>(</font>peRef <font color=Cyan>(</font><font color=Green><u>do</u></font> tok TokPipe-<a name="(line577)"></a> peRef name<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line578)"></a> blank <font color=Cyan>(</font>tok TokBraClose <font color=Cyan>>></font> tok TokStar<font color=Cyan>)</font>-<a name="(line579)"></a> return <font color=Cyan>(</font>PCDATAplus cs<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line580)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> blank <font color=Cyan>(</font>tok TokBraClose <font color=Cyan>>></font> tok TokStar<font color=Cyan>)</font> <font color=Cyan>>></font> return PCDATA<font color=Cyan>)</font>-<a name="(line581)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> blank <font color=Cyan>(</font>tok TokBraClose<font color=Cyan>)</font> <font color=Cyan>>></font> return PCDATA<font color=Cyan>)</font>-<a name="(line582)"></a> <font color=Red>]</font>-<a name="(line583)"></a> <font color=Cyan>`adjustErrP`</font> <font color=Cyan>(</font><font color=Cyan>++</font><font color=Magenta>"\nLooking for mixed content spec (#PCDATA | ...)*\n"</font><font color=Cyan>)</font>-<a name="(line584)"></a>-<a name="(line585)"></a><a name="attlistdecl"></a>attlistdecl <font color=Red>::</font> XParser AttListDecl-<a name="(line586)"></a>attlistdecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line587)"></a> tok TokSpecialOpen-<a name="(line588)"></a> tok <font color=Cyan>(</font>TokSpecial ATTLISTx<font color=Cyan>)</font>-<a name="(line589)"></a> n <font color=Red><-</font> peRef name <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Magenta>"expecting identifier in ATTLIST\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line590)"></a> ds <font color=Red><-</font> peRef <font color=Cyan>(</font>many1 <font color=Cyan>(</font>peRef attdef<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line591)"></a> blank <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing > terminating ATTLIST"</font>-<a name="(line592)"></a> return <font color=Cyan>(</font>AttListDecl n ds<font color=Cyan>)</font>-<a name="(line593)"></a>-<a name="(line594)"></a><a name="attdef"></a>attdef <font color=Red>::</font> XParser AttDef-<a name="(line595)"></a>attdef <font color=Red>=</font>-<a name="(line596)"></a> <font color=Green><u>do</u></font> n <font color=Red><-</font> peRef name <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"expecting attribute name\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line597)"></a> t <font color=Red><-</font> peRef atttype <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"within attlist defn: "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line598)"></a> d <font color=Red><-</font> peRef defaultdecl <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in attlist defn: "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line599)"></a> return <font color=Cyan>(</font>AttDef n t d<font color=Cyan>)</font>-<a name="(line600)"></a>-<a name="(line601)"></a><a name="atttype"></a>atttype <font color=Red>::</font> XParser AttType-<a name="(line602)"></a>atttype <font color=Red>=</font>-<a name="(line603)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"CDATA"</font><font color=Cyan>,</font> word <font color=Magenta>"CDATA"</font> <font color=Cyan>>></font> return StringType<font color=Cyan>)</font>-<a name="(line604)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"tokenized"</font><font color=Cyan>,</font> tokenizedtype <font color=Cyan>>>=</font> return <font color=Cyan>.</font> TokenizedType<font color=Cyan>)</font>-<a name="(line605)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"enumerated"</font><font color=Cyan>,</font> enumeratedtype <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EnumeratedType<font color=Cyan>)</font>-<a name="(line606)"></a> <font color=Red>]</font>-<a name="(line607)"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for ATTTYPE,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line608)"></a> <font color=Blue>-- `adjustErr` (++"\nLooking for ATTTYPE (CDATA, tokenized, or enumerated")</font>-<a name="(line609)"></a>-<a name="(line610)"></a><a name="tokenizedtype"></a>tokenizedtype <font color=Red>::</font> XParser TokenizedType-<a name="(line611)"></a>tokenizedtype <font color=Red>=</font>-<a name="(line612)"></a> oneOf <font color=Red>[</font> <font color=Cyan>(</font> word <font color=Magenta>"ID"</font> <font color=Cyan>>></font> return ID<font color=Cyan>)</font>-<a name="(line613)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"IDREF"</font> <font color=Cyan>>></font> return IDREF<font color=Cyan>)</font>-<a name="(line614)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"IDREFS"</font> <font color=Cyan>>></font> return IDREFS<font color=Cyan>)</font>-<a name="(line615)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"ENTITY"</font> <font color=Cyan>>></font> return ENTITY<font color=Cyan>)</font>-<a name="(line616)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"ENTITIES"</font> <font color=Cyan>>></font> return ENTITIES<font color=Cyan>)</font>-<a name="(line617)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"NMTOKEN"</font> <font color=Cyan>>></font> return NMTOKEN<font color=Cyan>)</font>-<a name="(line618)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"NMTOKENS"</font> <font color=Cyan>>></font> return NMTOKENS<font color=Cyan>)</font>-<a name="(line619)"></a> <font color=Red>]</font> <font color=Cyan>`onFail`</font>-<a name="(line620)"></a> <font color=Green><u>do</u></font> <font color=Cyan>{</font> t <font color=Red><-</font> next-<a name="(line621)"></a> <font color=Cyan>;</font> failP <font color=Cyan>(</font><font color=Magenta>"Expected one of"</font>-<a name="(line622)"></a> <font color=Cyan>++</font><font color=Magenta>" (ID, IDREF, IDREFS, ENTITY, ENTITIES, NMTOKEN, NMTOKENS)"</font>-<a name="(line623)"></a> <font color=Cyan>++</font><font color=Magenta>"\nbut got "</font><font color=Cyan>++</font>show t<font color=Cyan>)</font>-<a name="(line624)"></a> <font color=Cyan>}</font>-<a name="(line625)"></a><font color=Blue>-- `adjustErr` (++"\nLooking for a tokenized type:\n\ </font>-<a name="(line626)"></a><font color=Blue>-- \ (ID, IDREF, IDREFS, ENTITY, ENTITIES, NMTOKEN, NMTOKENS)")</font>-<a name="(line627)"></a>-<a name="(line628)"></a><a name="enumeratedtype"></a>enumeratedtype <font color=Red>::</font> XParser EnumeratedType-<a name="(line629)"></a>enumeratedtype <font color=Red>=</font>-<a name="(line630)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"NOTATION"</font><font color=Cyan>,</font> notationtype <font color=Cyan>>>=</font> return <font color=Cyan>.</font> NotationType<font color=Cyan>)</font>-<a name="(line631)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"enumerated"</font><font color=Cyan>,</font> enumeration <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Enumeration<font color=Cyan>)</font>-<a name="(line632)"></a> <font color=Red>]</font>-<a name="(line633)"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for an enumerated or NOTATION type,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line634)"></a>-<a name="(line635)"></a><a name="notationtype"></a>notationtype <font color=Red>::</font> XParser NotationType-<a name="(line636)"></a>notationtype <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line637)"></a> word <font color=Magenta>"NOTATION"</font>-<a name="(line638)"></a> bracket <font color=Cyan>(</font>tok TokBraOpen<font color=Cyan>)</font> <font color=Cyan>(</font>blank <font color=Cyan>(</font>tok TokBraClose<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line639)"></a> <font color=Cyan>(</font>peRef name <font color=Cyan>`sepBy1`</font> peRef <font color=Cyan>(</font>tok TokPipe<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line640)"></a>-<a name="(line641)"></a><a name="enumeration"></a>enumeration <font color=Red>::</font> XParser Enumeration-<a name="(line642)"></a>enumeration <font color=Red>=</font>-<a name="(line643)"></a> bracket <font color=Cyan>(</font>tok TokBraOpen<font color=Cyan>)</font> <font color=Cyan>(</font>blank <font color=Cyan>(</font>tok TokBraClose<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line644)"></a> <font color=Cyan>(</font>peRef nmtoken <font color=Cyan>`sepBy1`</font> blank <font color=Cyan>(</font>peRef <font color=Cyan>(</font>tok TokPipe<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line645)"></a>-<a name="(line646)"></a><a name="defaultdecl"></a>defaultdecl <font color=Red>::</font> XParser DefaultDecl-<a name="(line647)"></a>defaultdecl <font color=Red>=</font>-<a name="(line648)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"REQUIRED"</font><font color=Cyan>,</font> tok TokHash <font color=Cyan>>></font> word <font color=Magenta>"REQUIRED"</font> <font color=Cyan>>></font> return REQUIRED<font color=Cyan>)</font>-<a name="(line649)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"IMPLIED"</font><font color=Cyan>,</font> tok TokHash <font color=Cyan>>></font> word <font color=Magenta>"IMPLIED"</font> <font color=Cyan>>></font> return IMPLIED<font color=Cyan>)</font>-<a name="(line650)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"FIXED"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> f <font color=Red><-</font> maybe <font color=Cyan>(</font>tok TokHash <font color=Cyan>>></font> word <font color=Magenta>"FIXED"</font>-<a name="(line651)"></a> <font color=Cyan>>></font> return FIXED<font color=Cyan>)</font>-<a name="(line652)"></a> a <font color=Red><-</font> peRef attvalue-<a name="(line653)"></a> return <font color=Cyan>(</font>DefaultTo a f<font color=Cyan>)</font> <font color=Cyan>)</font>-<a name="(line654)"></a> <font color=Red>]</font>-<a name="(line655)"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for an attribute default decl,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line656)"></a><font color=Blue>-- `adjustErr` (++"\nLooking for an attribute default decl:\n\ </font>-<a name="(line657)"></a><font color=Blue>-- \ (REQUIRED, IMPLIED, FIXED)")</font>-<a name="(line658)"></a>-<a name="(line659)"></a><a name="conditionalsect"></a>conditionalsect <font color=Red>::</font> XParser ConditionalSect-<a name="(line660)"></a>conditionalsect <font color=Red>=</font> oneOf'-<a name="(line661)"></a> <font color=Red>[</font> <font color=Cyan>(</font> <font color=Magenta>"INCLUDE"</font>-<a name="(line662)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> tok TokSectionOpen-<a name="(line663)"></a> peRef <font color=Cyan>(</font>tok <font color=Cyan>(</font>TokSection INCLUDEx<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line664)"></a> p <font color=Red><-</font> posn-<a name="(line665)"></a> tok TokSqOpen <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing [ after INCLUDE"</font>-<a name="(line666)"></a> i <font color=Red><-</font> many <font color=Cyan>(</font>peRef extsubsetdecl<font color=Cyan>)</font>-<a name="(line667)"></a> tok TokSectionClose-<a name="(line668)"></a> <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"missing ]]> for INCLUDE section"</font>-<a name="(line669)"></a> <font color=Cyan>++</font><font color=Magenta>"\n begun at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>-<a name="(line670)"></a> return <font color=Cyan>(</font>IncludeSect i<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line671)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"IGNORE"</font>-<a name="(line672)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> tok TokSectionOpen-<a name="(line673)"></a> peRef <font color=Cyan>(</font>tok <font color=Cyan>(</font>TokSection IGNOREx<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line674)"></a> p <font color=Red><-</font> posn-<a name="(line675)"></a> tok TokSqOpen <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing [ after IGNORE"</font>-<a name="(line676)"></a> i <font color=Red><-</font> many newIgnore <font color=Blue>-- many ignoresectcontents</font>-<a name="(line677)"></a> tok TokSectionClose-<a name="(line678)"></a> <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"missing ]]> for IGNORE section"</font>-<a name="(line679)"></a> <font color=Cyan>++</font><font color=Magenta>"\n begun at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>-<a name="(line680)"></a> return <font color=Cyan>(</font>IgnoreSect []<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line681)"></a> <font color=Red>]</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"in a conditional section,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line682)"></a>-<a name="(line683)"></a><a name="newIgnore"></a>newIgnore <font color=Red>::</font> XParser Ignore-<a name="(line684)"></a>newIgnore <font color=Red>=</font>-<a name="(line685)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokSectionOpen-<a name="(line686)"></a> many newIgnore <font color=Cyan>`debug`</font> <font color=Magenta>"IGNORING conditional section"</font>-<a name="(line687)"></a> tok TokSectionClose-<a name="(line688)"></a> return Ignore <font color=Cyan>`debug`</font> <font color=Magenta>"end of IGNORED conditional section"</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line689)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> t <font color=Red><-</font> nottok <font color=Red>[</font>TokSectionOpen<font color=Cyan>,</font>TokSectionClose<font color=Red>]</font>-<a name="(line690)"></a> return Ignore <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ignoring: "</font><font color=Cyan>++</font>show t<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line691)"></a>-<a name="(line692)"></a><a name="ignoresectcontents"></a><font color=Blue>--- obsolete?</font>-<a name="(line693)"></a>ignoresectcontents <font color=Red>::</font> XParser IgnoreSectContents-<a name="(line694)"></a>ignoresectcontents <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line695)"></a> i <font color=Red><-</font> ignore-<a name="(line696)"></a> is <font color=Red><-</font> many <font color=Cyan>(</font><font color=Green><u>do</u></font> tok TokSectionOpen-<a name="(line697)"></a> ic <font color=Red><-</font> ignoresectcontents-<a name="(line698)"></a> tok TokSectionClose-<a name="(line699)"></a> ig <font color=Red><-</font> ignore-<a name="(line700)"></a> return <font color=Cyan>(</font>ic<font color=Cyan>,</font>ig<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line701)"></a> return <font color=Cyan>(</font>IgnoreSectContents i is<font color=Cyan>)</font>-<a name="(line702)"></a>-<a name="(line703)"></a><a name="ignore"></a>ignore <font color=Red>::</font> XParser Ignore-<a name="(line704)"></a>ignore <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line705)"></a> is <font color=Red><-</font> many1 <font color=Cyan>(</font>nottok <font color=Red>[</font>TokSectionOpen<font color=Cyan>,</font>TokSectionClose<font color=Red>]</font><font color=Cyan>)</font>-<a name="(line706)"></a> return Ignore <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ignored all of: "</font><font color=Cyan>++</font>show is<font color=Cyan>)</font>-<a name="(line707)"></a><font color=Blue>----</font>-<a name="(line708)"></a>-<a name="(line709)"></a><a name="reference"></a><font color=Blue>-- | Return either a general entity reference, or a character reference.</font>-<a name="(line710)"></a>reference <font color=Red>::</font> XParser Reference-<a name="(line711)"></a>reference <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line712)"></a> bracket <font color=Cyan>(</font>tok TokAmp<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSemi<font color=Cyan>)</font> <font color=Cyan>(</font>freetext <font color=Cyan>>>=</font> val<font color=Cyan>)</font>-<a name="(line713)"></a> <font color=Green><u>where</u></font>-<a name="(line714)"></a> val <font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font><font color=Magenta>'x'</font><font color=Red><b>:</b></font>i<font color=Cyan>)</font> <font color=Red>|</font> all isHexDigit i-<a name="(line715)"></a> <font color=Red>=</font> return <font color=Cyan>.</font> RefChar <font color=Cyan>.</font> fst <font color=Cyan>.</font> head <font color=Cyan>.</font> readHex <font color=Cyan>$</font> i-<a name="(line716)"></a> val <font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>i<font color=Cyan>)</font> <font color=Red>|</font> all isDigit i-<a name="(line717)"></a> <font color=Red>=</font> return <font color=Cyan>.</font> RefChar <font color=Cyan>.</font> fst <font color=Cyan>.</font> head <font color=Cyan>.</font> readDec <font color=Cyan>$</font> i-<a name="(line718)"></a> val name <font color=Red>=</font> return <font color=Cyan>.</font> RefEntity <font color=Cyan>$</font> name-<a name="(line719)"></a>-<a name="(line720)"></a><font color=Blue>{- -- following is incorrect-<a name="(line721)"></a>reference =-<a name="(line722)"></a> ( charref >>= return . RefChar) `onFail`-<a name="(line723)"></a> ( entityref >>= return . RefEntity)-<a name="(line724)"></a>-<a name="(line725)"></a>entityref :: XParser EntityRef-<a name="(line726)"></a>entityref = do-<a name="(line727)"></a> bracket (tok TokAmp) (tok TokSemi) name-<a name="(line728)"></a>-<a name="(line729)"></a>charref :: XParser CharRef-<a name="(line730)"></a>charref = do-<a name="(line731)"></a> bracket (tok TokAmp) (tok TokSemi) (freetext >>= readCharVal)-<a name="(line732)"></a> where-<a name="(line733)"></a> readCharVal ('#':'x':i) = return . fst . head . readHex $ i-<a name="(line734)"></a> readCharVal ('#':i) = return . fst . head . readDec $ i-<a name="(line735)"></a> readCharVal _ = mzero-<a name="(line736)"></a>-}</font>-<a name="(line737)"></a>-<a name="(line738)"></a><a name="pereference"></a>pereference <font color=Red>::</font> XParser PEReference-<a name="(line739)"></a>pereference <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line740)"></a> bracket <font color=Cyan>(</font>tok TokPercent<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSemi<font color=Cyan>)</font> nmtoken-<a name="(line741)"></a>-<a name="(line742)"></a><a name="entitydecl"></a>entitydecl <font color=Red>::</font> XParser EntityDecl-<a name="(line743)"></a>entitydecl <font color=Red>=</font>-<a name="(line744)"></a> <font color=Cyan>(</font> gedecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EntityGEDecl<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line745)"></a> <font color=Cyan>(</font> pedecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EntityPEDecl<font color=Cyan>)</font>-<a name="(line746)"></a>-<a name="(line747)"></a><a name="gedecl"></a>gedecl <font color=Red>::</font> XParser GEDecl-<a name="(line748)"></a>gedecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line749)"></a> tok TokSpecialOpen-<a name="(line750)"></a> tok <font color=Cyan>(</font>TokSpecial ENTITYx<font color=Cyan>)</font>-<a name="(line751)"></a> n <font color=Red><-</font> name-<a name="(line752)"></a> e <font color=Red><-</font> entitydef <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in general entity defn "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line753)"></a> tok TokAnyClose <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"expected > terminating G ENTITY decl "</font><font color=Cyan>++</font>n<font color=Cyan>)</font>-<a name="(line754)"></a> stUpdate <font color=Cyan>(</font>addGE n e<font color=Cyan>)</font> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"added GE defn &"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font>-<a name="(line755)"></a> return <font color=Cyan>(</font>GEDecl n e<font color=Cyan>)</font>-<a name="(line756)"></a>-<a name="(line757)"></a><a name="pedecl"></a>pedecl <font color=Red>::</font> XParser PEDecl-<a name="(line758)"></a>pedecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line759)"></a> tok TokSpecialOpen-<a name="(line760)"></a> tok <font color=Cyan>(</font>TokSpecial ENTITYx<font color=Cyan>)</font>-<a name="(line761)"></a> tok TokPercent-<a name="(line762)"></a> n <font color=Red><-</font> name-<a name="(line763)"></a> e <font color=Red><-</font> pedef <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in parameter entity defn "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line764)"></a> tok TokAnyClose <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"expected > terminating P ENTITY decl "</font><font color=Cyan>++</font>n<font color=Cyan>)</font>-<a name="(line765)"></a> stUpdate <font color=Cyan>(</font>addPE n e<font color=Cyan>)</font> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"added PE defn %"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";\n"</font><font color=Cyan>++</font>show e<font color=Cyan>)</font>-<a name="(line766)"></a> return <font color=Cyan>(</font>PEDecl n e<font color=Cyan>)</font>-<a name="(line767)"></a>-<a name="(line768)"></a><a name="entitydef"></a>entitydef <font color=Red>::</font> XParser EntityDef-<a name="(line769)"></a>entitydef <font color=Red>=</font>-<a name="(line770)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"entityvalue"</font><font color=Cyan>,</font> entityvalue <font color=Cyan>>>=</font> return <font color=Cyan>.</font> DefEntityValue<font color=Cyan>)</font>-<a name="(line771)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"external"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> eid <font color=Red><-</font> externalid-<a name="(line772)"></a> ndd <font color=Red><-</font> maybe ndatadecl-<a name="(line773)"></a> return <font color=Cyan>(</font>DefExternalID eid ndd<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line774)"></a> <font color=Red>]</font>-<a name="(line775)"></a>-<a name="(line776)"></a><a name="pedef"></a>pedef <font color=Red>::</font> XParser PEDef-<a name="(line777)"></a>pedef <font color=Red>=</font>-<a name="(line778)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"entityvalue"</font><font color=Cyan>,</font> entityvalue <font color=Cyan>>>=</font> return <font color=Cyan>.</font> PEDefEntityValue<font color=Cyan>)</font>-<a name="(line779)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"externalid"</font><font color=Cyan>,</font> externalid <font color=Cyan>>>=</font> return <font color=Cyan>.</font> PEDefExternalID<font color=Cyan>)</font>-<a name="(line780)"></a> <font color=Red>]</font>-<a name="(line781)"></a>-<a name="(line782)"></a><a name="externalid"></a>externalid <font color=Red>::</font> XParser ExternalID-<a name="(line783)"></a>externalid <font color=Red>=</font>-<a name="(line784)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"SYSTEM"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> word <font color=Magenta>"SYSTEM"</font>-<a name="(line785)"></a> s <font color=Red><-</font> systemliteral-<a name="(line786)"></a> return <font color=Cyan>(</font>SYSTEM s<font color=Cyan>)</font> <font color=Cyan>)</font>-<a name="(line787)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"PUBLIC"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> word <font color=Magenta>"PUBLIC"</font>-<a name="(line788)"></a> p <font color=Red><-</font> pubidliteral-<a name="(line789)"></a> s <font color=Red><-</font> systemliteral-<a name="(line790)"></a> return <font color=Cyan>(</font>PUBLIC p s<font color=Cyan>)</font> <font color=Cyan>)</font>-<a name="(line791)"></a> <font color=Red>]</font>-<a name="(line792)"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for an external id,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line793)"></a>-<a name="(line794)"></a><a name="ndatadecl"></a>ndatadecl <font color=Red>::</font> XParser NDataDecl-<a name="(line795)"></a>ndatadecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line796)"></a> word <font color=Magenta>"NDATA"</font>-<a name="(line797)"></a> n <font color=Red><-</font> name-<a name="(line798)"></a> return <font color=Cyan>(</font>NDATA n<font color=Cyan>)</font>-<a name="(line799)"></a>-<a name="(line800)"></a><a name="textdecl"></a>textdecl <font color=Red>::</font> XParser TextDecl-<a name="(line801)"></a>textdecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line802)"></a> tok TokPIOpen-<a name="(line803)"></a> <font color=Cyan>(</font>word <font color=Magenta>"xml"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"XML"</font><font color=Cyan>)</font>-<a name="(line804)"></a> v <font color=Red><-</font> maybe versioninfo-<a name="(line805)"></a> e <font color=Red><-</font> encodingdecl-<a name="(line806)"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failP <font color=Magenta>"expected ?> terminating text decl"</font>-<a name="(line807)"></a> return <font color=Cyan>(</font>TextDecl v e<font color=Cyan>)</font>-<a name="(line808)"></a>-<a name="(line809)"></a><a name="extparsedent"></a>extparsedent <font color=Red>::</font> XParser <font color=Cyan>(</font>ExtParsedEnt Posn<font color=Cyan>)</font>-<a name="(line810)"></a>extparsedent <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line811)"></a> t <font color=Red><-</font> maybe textdecl-<a name="(line812)"></a> c <font color=Red><-</font> content-<a name="(line813)"></a> return <font color=Cyan>(</font>ExtParsedEnt t c<font color=Cyan>)</font>-<a name="(line814)"></a>-<a name="(line815)"></a><a name="extpe"></a>extpe <font color=Red>::</font> XParser ExtPE-<a name="(line816)"></a>extpe <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line817)"></a> t <font color=Red><-</font> maybe textdecl-<a name="(line818)"></a> e <font color=Red><-</font> many <font color=Cyan>(</font>peRef extsubsetdecl<font color=Cyan>)</font>-<a name="(line819)"></a> return <font color=Cyan>(</font>ExtPE t e<font color=Cyan>)</font>-<a name="(line820)"></a>-<a name="(line821)"></a><a name="encodingdecl"></a>encodingdecl <font color=Red>::</font> XParser EncodingDecl-<a name="(line822)"></a>encodingdecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line823)"></a> <font color=Cyan>(</font>word <font color=Magenta>"encoding"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"ENCODING"</font><font color=Cyan>)</font>-<a name="(line824)"></a> tok TokEqual <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"expected = in 'encoding' decl"</font>-<a name="(line825)"></a> f <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext-<a name="(line826)"></a> return <font color=Cyan>(</font>EncodingDecl f<font color=Cyan>)</font>-<a name="(line827)"></a>-<a name="(line828)"></a><a name="notationdecl"></a>notationdecl <font color=Red>::</font> XParser NotationDecl-<a name="(line829)"></a>notationdecl <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line830)"></a> tok TokSpecialOpen-<a name="(line831)"></a> tok <font color=Cyan>(</font>TokSpecial NOTATIONx<font color=Cyan>)</font>-<a name="(line832)"></a> n <font color=Red><-</font> name-<a name="(line833)"></a> e <font color=Red><-</font> either externalid publicid-<a name="(line834)"></a> tok TokAnyClose <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"expected > terminating NOTATION decl "</font><font color=Cyan>++</font>n<font color=Cyan>)</font>-<a name="(line835)"></a> return <font color=Cyan>(</font>NOTATION n e<font color=Cyan>)</font>-<a name="(line836)"></a>-<a name="(line837)"></a><a name="publicid"></a>publicid <font color=Red>::</font> XParser PublicID-<a name="(line838)"></a>publicid <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line839)"></a> word <font color=Magenta>"PUBLIC"</font>-<a name="(line840)"></a> p <font color=Red><-</font> pubidliteral-<a name="(line841)"></a> return <font color=Cyan>(</font>PUBLICID p<font color=Cyan>)</font>-<a name="(line842)"></a>-<a name="(line843)"></a><a name="entityvalue"></a>entityvalue <font color=Red>::</font> XParser EntityValue-<a name="(line844)"></a>entityvalue <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line845)"></a> <font color=Blue>-- evs <- bracket (tok TokQuote) (tok TokQuote) (many (peRef ev))</font>-<a name="(line846)"></a> tok TokQuote-<a name="(line847)"></a> pn <font color=Red><-</font> posn-<a name="(line848)"></a> evs <font color=Red><-</font> many ev-<a name="(line849)"></a> tok TokQuote <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"expected quote to terminate entityvalue"</font>-<a name="(line850)"></a> <font color=Blue>-- quoted text must be rescanned for possible PERefs</font>-<a name="(line851)"></a> st <font color=Red><-</font> stGet-<a name="(line852)"></a> <font color=Blue>-- Prelude.either failBad (return . EntityValue) . fst3 $</font>-<a name="(line853)"></a> return <font color=Cyan>.</font> EntityValue <font color=Cyan>.</font> fst3 <font color=Cyan>$</font>-<a name="(line854)"></a> <font color=Cyan>(</font>runParser <font color=Cyan>(</font>many ev<font color=Cyan>)</font> st-<a name="(line855)"></a> <font color=Cyan>(</font>reLexEntityValue <font color=Cyan>(</font><font color=Red>\</font>s<font color=Red>-></font> stringify <font color=Cyan>(</font>lookupPE s st<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line856)"></a> pn-<a name="(line857)"></a> <font color=Cyan>(</font>flattenEV <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line858)"></a> <font color=Green><u>where</u></font>-<a name="(line859)"></a> stringify <font color=Cyan>(</font>Just <font color=Cyan>(</font>PEDefEntityValue ev<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> Just <font color=Cyan>(</font>flattenEV ev<font color=Cyan>)</font>-<a name="(line860)"></a> stringify <font color=Green><u>_</u></font> <font color=Red>=</font> Nothing-<a name="(line861)"></a>-<a name="(line862)"></a><a name="ev"></a>ev <font color=Red>::</font> XParser EV-<a name="(line863)"></a>ev <font color=Red>=</font>-<a name="(line864)"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"string"</font><font color=Cyan>,</font> <font color=Cyan>(</font>string<font color=Cyan>`onFail`</font>freetext<font color=Cyan>)</font> <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EVString<font color=Cyan>)</font>-<a name="(line865)"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"reference"</font><font color=Cyan>,</font> reference <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EVRef<font color=Cyan>)</font>-<a name="(line866)"></a> <font color=Red>]</font>-<a name="(line867)"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for entity value,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line868)"></a>-<a name="(line869)"></a><a name="attvalue"></a>attvalue <font color=Red>::</font> XParser AttValue-<a name="(line870)"></a>attvalue <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line871)"></a> avs <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font>-<a name="(line872)"></a> <font color=Cyan>(</font>many <font color=Cyan>(</font>either freetext reference<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line873)"></a> return <font color=Cyan>(</font>AttValue avs<font color=Cyan>)</font>-<a name="(line874)"></a>-<a name="(line875)"></a><a name="systemliteral"></a>systemliteral <font color=Red>::</font> XParser SystemLiteral-<a name="(line876)"></a>systemliteral <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line877)"></a> s <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext-<a name="(line878)"></a> return <font color=Cyan>(</font>SystemLiteral s<font color=Cyan>)</font> <font color=Blue>-- note: refs &...; not permitted</font>-<a name="(line879)"></a>-<a name="(line880)"></a><a name="pubidliteral"></a>pubidliteral <font color=Red>::</font> XParser PubidLiteral-<a name="(line881)"></a>pubidliteral <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line882)"></a> s <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext-<a name="(line883)"></a> return <font color=Cyan>(</font>PubidLiteral s<font color=Cyan>)</font> <font color=Blue>-- note: freetext is too liberal here</font>-<a name="(line884)"></a>-<a name="(line885)"></a><a name="chardata"></a><font color=Blue>-- | Return parsed freetext (i.e. until the next markup)</font>-<a name="(line886)"></a>chardata <font color=Red>::</font> XParser CharData-<a name="(line887)"></a>chardata <font color=Red>=</font> freetext-<a name="(line888)"></a>-</pre>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/ParseLazy.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>-- | A non-validating XML parser. For the input grammar, see</font>+<a name="line-2"></a><font color=Blue>-- <<a href="http://www.w3.org/TR/REC-xml">http://www.w3.org/TR/REC-xml</a>>.</font>+<a name="line-3"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>ParseLazy+<a name="line-4"></a> <font color=Cyan>(</font>+<a name="line-5"></a> <font color=Blue>-- * Parse a whole document</font>+<a name="line-6"></a> xmlParse <font color=Blue>-- , xmlParse'</font>+<a name="line-7"></a> <font color=Blue>-- * Parse just a DTD</font>+<a name="line-8"></a> <font color=Cyan>,</font> dtdParse <font color=Blue>-- , dtdParse'</font>+<a name="line-9"></a> <font color=Blue>-- * Parse a partial document</font>+<a name="line-10"></a> <font color=Cyan>,</font> xmlParseWith+<a name="line-11"></a> <font color=Blue>-- * Individual parsers for use with /xmlParseWith/ and module SAX</font>+<a name="line-12"></a> <font color=Cyan>,</font> document<font color=Cyan>,</font> element<font color=Cyan>,</font> content+<a name="line-13"></a> <font color=Cyan>,</font> comment<font color=Cyan>,</font> chardata+<a name="line-14"></a> <font color=Cyan>,</font> reference<font color=Cyan>,</font> doctypedecl+<a name="line-15"></a> <font color=Cyan>,</font> processinginstruction+<a name="line-16"></a> <font color=Cyan>,</font> elemtag<font color=Cyan>,</font> name<font color=Cyan>,</font> tok+<a name="line-17"></a> <font color=Cyan>,</font> elemOpenTag<font color=Cyan>,</font> elemCloseTag+<a name="line-18"></a> <font color=Cyan>,</font> emptySTs<font color=Cyan>,</font> XParser+<a name="line-19"></a> <font color=Blue>-- * These general utility functions don't belong here</font>+<a name="line-20"></a> <font color=Cyan>,</font> fst3<font color=Cyan>,</font> snd3<font color=Cyan>,</font> thd3+<a name="line-21"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-22"></a>+<a name="line-23"></a><font color=Blue>-- An XML parser, written using a slightly extended version of the</font>+<a name="line-24"></a><font color=Blue>-- Hutton/Meijer parser combinators. The input is tokenised internally</font>+<a name="line-25"></a><font color=Blue>-- by the lexer xmlLex. Whilst parsing, we gather a symbol</font>+<a name="line-26"></a><font color=Blue>-- table of entity references. PERefs must be defined before use, so we</font>+<a name="line-27"></a><font color=Blue>-- expand their uses as we encounter them, forcing the remainder of the</font>+<a name="line-28"></a><font color=Blue>-- input to be re-lexed and re-parsed. GERefs are simply stored for</font>+<a name="line-29"></a><font color=Blue>-- later retrieval.</font>+<a name="line-30"></a>+<a name="line-31"></a><font color=Green><u>import</u></font> Prelude hiding <font color=Cyan>(</font>either<font color=Cyan>,</font>maybe<font color=Cyan>,</font>sequence<font color=Cyan>,</font>catch<font color=Cyan>)</font>+<a name="line-32"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Prelude <font color=Cyan>(</font>either<font color=Cyan>)</font>+<a name="line-33"></a><font color=Green><u>import</u></font> Maybe hiding <font color=Cyan>(</font>maybe<font color=Cyan>)</font>+<a name="line-34"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>intersperse<font color=Cyan>)</font> <font color=Blue>-- debugging only</font>+<a name="line-35"></a><font color=Green><u>import</u></font> Char <font color=Cyan>(</font>isSpace<font color=Cyan>,</font>isDigit<font color=Cyan>,</font>isHexDigit<font color=Cyan>)</font>+<a name="line-36"></a><font color=Green><u>import</u></font> Monad hiding <font color=Cyan>(</font>sequence<font color=Cyan>)</font>+<a name="line-37"></a><font color=Green><u>import</u></font> Numeric <font color=Cyan>(</font>readDec<font color=Cyan>,</font>readHex<font color=Cyan>)</font>+<a name="line-38"></a><font color=Blue>--import Control.Exception (catch)</font>+<a name="line-39"></a>+<a name="line-40"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-41"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Posn+<a name="line-42"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Lex+<a name="line-43"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>Poly<font color=Cyan>.</font>NoLeak<font color=Cyan>.</font>StateLazy+<a name="line-44"></a>+<a name="line-45"></a><font color=Green><u>import</u></font> System<font color=Cyan>.</font>FilePath <font color=Cyan>(</font>combine<font color=Cyan>,</font> dropFileName<font color=Cyan>)</font>+<a name="line-46"></a>+<a name="line-47"></a>+<a name="line-48"></a><font color=Magenta><em>#if ( defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 502 ) || \</em></font>+<a name="line-49"></a> <font color=Cyan>(</font> defined<font color=Cyan>(</font><b><font color=Magenta>__NHC__</font></b><font color=Cyan>)</font> <font color=Cyan>&&</font> <b><font color=Magenta>__NHC__</font></b> <font color=Cyan>></font> <font color=Magenta>114</font> <font color=Cyan>)</font> <font color=Cyan>||</font> defined<font color=Cyan>(</font><b><font color=Magenta>__HUGS__</font></b><font color=Cyan>)</font>+<a name="line-50"></a><font color=Green><u>import</u></font> System<font color=Cyan>.</font>IO<font color=Cyan>.</font>Unsafe <font color=Cyan>(</font>unsafePerformIO<font color=Cyan>)</font>+<a name="line-51"></a><font color=Magenta><em>#elif defined(__GLASGOW_HASKELL__)</em></font>+<a name="line-52"></a><font color=Green><u>import</u></font> IOExts <font color=Cyan>(</font>unsafePerformIO<font color=Cyan>)</font>+<a name="line-53"></a><font color=Magenta><em>#elif defined(__NHC__)</em></font>+<a name="line-54"></a><font color=Green><u>import</u></font> IOExtras <font color=Cyan>(</font>unsafePerformIO<font color=Cyan>)</font>+<a name="line-55"></a><font color=Magenta><em>#elif defined(__HBC__)</em></font>+<a name="line-56"></a><font color=Green><u>import</u></font> UnsafePerformIO+<a name="line-57"></a><font color=Magenta><em>#endif</em></font>+<a name="line-58"></a>+<a name="line-59"></a><font color=Blue>-- #define DEBUG</font>+<a name="line-60"></a>+<a name="line-61"></a><font color=Magenta><em>#if defined(DEBUG)</em></font>+<a name="line-62"></a><font color=Magenta><em># if ( defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 502 ) || \</em></font>+<a name="line-63"></a> <font color=Cyan>(</font> defined<font color=Cyan>(</font><b><font color=Magenta>__NHC__</font></b><font color=Cyan>)</font> <font color=Cyan>&&</font> <b><font color=Magenta>__NHC__</font></b> <font color=Cyan>></font> <font color=Magenta>114</font> <font color=Cyan>)</font> <font color=Cyan>||</font> defined<font color=Cyan>(</font><b><font color=Magenta>__HUGS__</font></b><font color=Cyan>)</font>+<a name="line-64"></a><font color=Green><u>import</u></font> Debug<font color=Cyan>.</font>Trace<font color=Cyan>(</font>trace<font color=Cyan>)</font>+<a name="line-65"></a><font color=Magenta><em># elif defined(__GLASGOW_HASKELL__)</em></font>+<a name="line-66"></a><font color=Green><u>import</u></font> IOExts<font color=Cyan>(</font>trace<font color=Cyan>)</font>+<a name="line-67"></a><font color=Magenta><em># elif defined(__NHC__) || defined(__HBC__)</em></font>+<a name="line-68"></a><font color=Green><u>import</u></font> NonStdTrace+<a name="line-69"></a><font color=Magenta><em># endif</em></font>+<a name="line-70"></a><a name="debug"></a><font color=Blue>debug</font> <font color=Red>::</font> a <font color=Red>-></font> String <font color=Red>-></font> a+<a name="line-71"></a><a name="debug"></a><font color=Blue>v</font> <font color=Cyan>`debug`</font> s <font color=Red>=</font> trace s v+<a name="line-72"></a><font color=Magenta><em>#else</em></font>+<a name="line-73"></a><a name="debug"></a><font color=Blue>v</font> <font color=Cyan>`debug`</font> s <font color=Red>=</font> v+<a name="line-74"></a><font color=Magenta><em>#endif</em></font>+<a name="line-75"></a>+<a name="line-76"></a>+<a name="line-77"></a><a name="xmlParse"></a><font color=Blue>-- | To parse a whole document, @xmlParse file content@ takes a filename</font>+<a name="line-78"></a><font color=Blue>-- (for generating error reports) and the string content of that file.</font>+<a name="line-79"></a><font color=Blue>-- A parse error causes program failure, with message to stderr.</font>+<a name="line-80"></a><font color=Blue>xmlParse</font> <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Document Posn+<a name="line-81"></a>+<a name="line-82"></a><font color=Blue>{-+<a name="line-83"></a>-- | To parse a whole document, @xmlParse' file content@ takes a filename+<a name="line-84"></a>-- (for generating error reports) and the string content of that file.+<a name="line-85"></a>-- Any parse error message is passed back to the caller through the+<a name="line-86"></a>-- @Either@ type.+<a name="line-87"></a>xmlParse' :: String -> String -> Either String (Document Posn)+<a name="line-88"></a>+<a name="line-89"></a>-- | To parse just a DTD, @dtdParse file content@ takes a filename+<a name="line-90"></a>-- (for generating error reports) and the string content of that+<a name="line-91"></a>-- file. If no DTD was found, you get @Nothing@ rather than an error.+<a name="line-92"></a>-- However, if a DTD is found but contains errors, the program crashes.+<a name="line-93"></a>dtdParse :: String -> String -> Maybe DocTypeDecl+<a name="line-94"></a>+<a name="line-95"></a>-- | To parse just a DTD, @dtdParse' file content@ takes a filename+<a name="line-96"></a>-- (for generating error reports) and the string content of that+<a name="line-97"></a>-- file. If no DTD was found, you get @Right Nothing@.+<a name="line-98"></a>-- If a DTD was found but contains errors, you get a @Left message@.+<a name="line-99"></a>dtdParse' :: String -> String -> Either String (Maybe DocTypeDecl)+<a name="line-100"></a>+<a name="line-101"></a>xmlParse' name inp = xmlParse name inp `catch` (Left . show)+<a name="line-102"></a>dtdParse' name inp = dtdParse name inp `catch` (Left . show)+<a name="line-103"></a>-}</font>+<a name="line-104"></a>+<a name="line-105"></a><font color=Blue>xmlParse</font> name <font color=Red>=</font> fst3 <font color=Cyan>.</font> runParser <font color=Cyan>(</font>toEOF document<font color=Cyan>)</font> emptySTs <font color=Cyan>.</font> xmlLex name+<a name="line-106"></a><a name="dtdParse"></a><font color=Blue>dtdParse</font> name <font color=Red>=</font> fst3 <font color=Cyan>.</font> runParser justDTD emptySTs <font color=Cyan>.</font> xmlLex name+<a name="line-107"></a>+<a name="line-108"></a>+<a name="line-109"></a><a name="toEOF"></a><font color=Blue>toEOF</font> <font color=Red>=</font> id <font color=Blue>-- there are other possible implementations...</font>+<a name="line-110"></a>+<a name="line-111"></a><a name="xmlParseWith"></a><font color=Blue>-- | To parse a partial document, e.g. from an XML-based stream protocol,</font>+<a name="line-112"></a><font color=Blue>-- where you may later want to get more document elements from the same</font>+<a name="line-113"></a><font color=Blue>-- stream. Arguments are: a parser for the item you want, and the</font>+<a name="line-114"></a><font color=Blue>-- already-lexed input to parse from. Returns the item you wanted</font>+<a name="line-115"></a><font color=Blue>-- (or an error message), plus the remainder of the input.</font>+<a name="line-116"></a><font color=Blue>xmlParseWith</font> <font color=Red>::</font> XParser a <font color=Red>-></font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>TokenT<font color=Cyan>)</font><font color=Red>]</font>+<a name="line-117"></a> <font color=Red>-></font> <font color=Cyan>(</font>Either String a<font color=Cyan>,</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>TokenT<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-118"></a><font color=Blue>xmlParseWith</font> p <font color=Red>=</font> <font color=Cyan>(</font><font color=Red>\</font><font color=Cyan>(</font>v<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font>s<font color=Cyan>)</font><font color=Red>-></font><font color=Cyan>(</font>Right v<font color=Cyan>,</font>s<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>.</font> runParser p emptySTs+<a name="line-119"></a>+<a name="line-120"></a>+<a name="line-121"></a><font color=Blue>---- Symbol table stuff ----</font>+<a name="line-122"></a>+<a name="line-123"></a><a name="SymTabs"></a><font color=Green><u>type</u></font> SymTabs <font color=Red>=</font> <font color=Cyan>(</font>SymTab PEDef<font color=Cyan>,</font> SymTab EntityDef<font color=Cyan>)</font>+<a name="line-124"></a>+<a name="line-125"></a><a name="emptySTs"></a><font color=Blue>-- | Some empty symbol tables for GE and PE references.</font>+<a name="line-126"></a><font color=Blue>emptySTs</font> <font color=Red>::</font> SymTabs+<a name="line-127"></a><font color=Blue>emptySTs</font> <font color=Red>=</font> <font color=Cyan>(</font>emptyST<font color=Cyan>,</font> emptyST<font color=Cyan>)</font>+<a name="line-128"></a>+<a name="line-129"></a><a name="addPE"></a><font color=Blue>addPE</font> <font color=Red>::</font> String <font color=Red>-></font> PEDef <font color=Red>-></font> SymTabs <font color=Red>-></font> SymTabs+<a name="line-130"></a><font color=Blue>addPE</font> n v <font color=Cyan>(</font>pe<font color=Cyan>,</font>ge<font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>addST n v pe<font color=Cyan>,</font> ge<font color=Cyan>)</font>+<a name="line-131"></a>+<a name="line-132"></a><a name="addGE"></a><font color=Blue>addGE</font> <font color=Red>::</font> String <font color=Red>-></font> EntityDef <font color=Red>-></font> SymTabs <font color=Red>-></font> SymTabs+<a name="line-133"></a><font color=Blue>addGE</font> n v <font color=Cyan>(</font>pe<font color=Cyan>,</font>ge<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>let</u></font> newge <font color=Red>=</font> addST n v ge <font color=Green><u>in</u></font> newge <font color=Cyan>`seq`</font> <font color=Cyan>(</font>pe<font color=Cyan>,</font> newge<font color=Cyan>)</font>+<a name="line-134"></a>+<a name="line-135"></a><a name="lookupPE"></a><font color=Blue>lookupPE</font> <font color=Red>::</font> String <font color=Red>-></font> SymTabs <font color=Red>-></font> Maybe PEDef+<a name="line-136"></a><font color=Blue>lookupPE</font> s <font color=Cyan>(</font>pe<font color=Cyan>,</font>ge<font color=Cyan>)</font> <font color=Red>=</font> lookupST s pe+<a name="line-137"></a>+<a name="line-138"></a><a name="flattenEV"></a><font color=Blue>flattenEV</font> <font color=Red>::</font> EntityValue <font color=Red>-></font> String+<a name="line-139"></a><font color=Blue>flattenEV</font> <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font> <font color=Red>=</font> concatMap flatten evs+<a name="line-140"></a> <font color=Green><u>where</u></font>+<a name="line-141"></a> flatten <font color=Cyan>(</font>EVString s<font color=Cyan>)</font> <font color=Red>=</font> s+<a name="line-142"></a> flatten <font color=Cyan>(</font>EVRef <font color=Cyan>(</font>RefEntity r<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"&"</font> <font color=Cyan>++</font>r<font color=Cyan>++</font><font color=Magenta>";"</font>+<a name="line-143"></a> flatten <font color=Cyan>(</font>EVRef <font color=Cyan>(</font>RefChar r<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"&#"</font><font color=Cyan>++</font>show r<font color=Cyan>++</font><font color=Magenta>";"</font>+<a name="line-144"></a> <font color=Blue>-- flatten (EVPERef n) = "%" ++n++";"</font>+<a name="line-145"></a>+<a name="line-146"></a>+<a name="line-147"></a><a name="fst3"></a><font color=Blue>---- Misc ----</font>+<a name="line-148"></a><font color=Blue>fst3</font> <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>-></font> a+<a name="line-149"></a><a name="snd3"></a><font color=Blue>snd3</font> <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>-></font> b+<a name="line-150"></a><a name="thd3"></a><font color=Blue>thd3</font> <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>-></font> c+<a name="line-151"></a>+<a name="line-152"></a><font color=Blue>fst3</font> <font color=Cyan>(</font>a<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> a+<a name="line-153"></a><font color=Blue>snd3</font> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font>a<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> a+<a name="line-154"></a><font color=Blue>thd3</font> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>,</font>a<font color=Cyan>)</font> <font color=Red>=</font> a+<a name="line-155"></a>+<a name="line-156"></a>+<a name="line-157"></a><font color=Blue>---- Auxiliary Parsing Functions ----</font>+<a name="line-158"></a>+<a name="line-159"></a><a name="myBracket"></a><font color=Blue>-- | Parse a bracketed item, discarding the brackets AND NOT using adjustErrBad</font>+<a name="line-160"></a><font color=Blue>myBracket</font> <font color=Red>::</font> PolyParse p <font color=Red>=></font> p bra <font color=Red>-></font> p ket <font color=Red>-></font> p a <font color=Red>-></font> p a+<a name="line-161"></a><font color=Blue>myBracket</font> open close p <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-162"></a> <font color=Green><u>do</u></font> <font color=Cyan>{</font> open <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"Missing opening bracket:\n\t"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-163"></a> <font color=Cyan>;</font> p <font color=Cyan>`discard`</font> <font color=Cyan>(</font>close <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"Missing closing bracket:\n\t"</font><font color=Cyan>++</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-164"></a> <font color=Cyan>}</font>+<a name="line-165"></a>+<a name="line-166"></a>+<a name="line-167"></a><a name="XParser"></a><font color=Blue>-- | XParser is just a specialisation of the PolyStateLazy parser.</font>+<a name="line-168"></a><a name="XParser"></a><font color=Green><u>type</u></font> XParser a <font color=Red>=</font> Parser SymTabs <font color=Cyan>(</font>Posn<font color=Cyan>,</font>TokenT<font color=Cyan>)</font> a+<a name="line-169"></a>+<a name="line-170"></a><a name="tok"></a><font color=Blue>-- | Return the next token from the input only if it matches the given token.</font>+<a name="line-171"></a><font color=Blue>tok</font> <font color=Red>::</font> TokenT <font color=Red>-></font> XParser TokenT+<a name="line-172"></a><font color=Blue>tok</font> t <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t'<font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-173"></a> <font color=Green><u>case</u></font> t' <font color=Green><u>of</u></font> TokError <font color=Green><u>_</u></font> <font color=Red>-></font> report failBad <font color=Cyan>(</font>show t<font color=Cyan>)</font> p t'+<a name="line-174"></a> <font color=Green><u>_</u></font> <font color=Red>|</font> t'<font color=Cyan>==</font>t <font color=Red>-></font> return t+<a name="line-175"></a> <font color=Red>|</font> otherwise <font color=Red>-></font> report fail <font color=Cyan>(</font>show t<font color=Cyan>)</font> p t'+<a name="line-176"></a><a name="nottok"></a><font color=Blue>nottok</font> <font color=Red>::</font> <font color=Red>[</font>TokenT<font color=Red>]</font> <font color=Red>-></font> XParser TokenT+<a name="line-177"></a><font color=Blue>nottok</font> ts <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-178"></a> <font color=Green><u>if</u></font> t<font color=Cyan>`elem`</font>ts <font color=Green><u>then</u></font> report fail <font color=Cyan>(</font><font color=Magenta>"no "</font><font color=Cyan>++</font>show t<font color=Cyan>)</font> p t+<a name="line-179"></a> <font color=Green><u>else</u></font> return t+<a name="line-180"></a>+<a name="line-181"></a><a name="name"></a><font color=Blue>-- | Return just a name, e.g. element name, attribute name.</font>+<a name="line-182"></a><font color=Blue>name</font> <font color=Red>::</font> XParser Name+<a name="line-183"></a><font color=Blue>name</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>tok<font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-184"></a> <font color=Green><u>case</u></font> tok <font color=Green><u>of</u></font>+<a name="line-185"></a> TokName s <font color=Red>-></font> return s+<a name="line-186"></a> TokError <font color=Green><u>_</u></font> <font color=Red>-></font> report failBad <font color=Magenta>"a name"</font> p tok+<a name="line-187"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"a name"</font> p tok+<a name="line-188"></a>+<a name="line-189"></a><a name="string"></a><font color=Blue>string</font><font color=Cyan>,</font> freetext <font color=Red>::</font> XParser String+<a name="line-190"></a><font color=Blue>string</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-191"></a> <font color=Green><u>case</u></font> t <font color=Green><u>of</u></font> TokName s <font color=Red>-></font> return s+<a name="line-192"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"text"</font> p t+<a name="line-193"></a><a name="freetext"></a><font color=Blue>freetext</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-194"></a> <font color=Green><u>case</u></font> t <font color=Green><u>of</u></font> TokFreeText s <font color=Red>-></font> return s+<a name="line-195"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> report fail <font color=Magenta>"text"</font> p t+<a name="line-196"></a>+<a name="line-197"></a><a name="maybe"></a><font color=Blue>maybe</font> <font color=Red>::</font> XParser a <font color=Red>-></font> XParser <font color=Cyan>(</font>Maybe a<font color=Cyan>)</font>+<a name="line-198"></a><font color=Blue>maybe</font> p <font color=Red>=</font>+<a name="line-199"></a> <font color=Cyan>(</font> p <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Just<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-200"></a> <font color=Cyan>(</font> return Nothing<font color=Cyan>)</font>+<a name="line-201"></a>+<a name="line-202"></a><a name="either"></a><font color=Blue>either</font> <font color=Red>::</font> XParser a <font color=Red>-></font> XParser b <font color=Red>-></font> XParser <font color=Cyan>(</font>Either a b<font color=Cyan>)</font>+<a name="line-203"></a><font color=Blue>either</font> p q <font color=Red>=</font>+<a name="line-204"></a> <font color=Cyan>(</font> p <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Left<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-205"></a> <font color=Cyan>(</font> q <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Right<font color=Cyan>)</font>+<a name="line-206"></a>+<a name="line-207"></a><a name="word"></a><font color=Blue>word</font> <font color=Red>::</font> String <font color=Red>-></font> XParser ()+<a name="line-208"></a><font color=Blue>word</font> s <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> x <font color=Red><-</font> next+<a name="line-209"></a> <font color=Cyan>;</font> <font color=Green><u>case</u></font> x <font color=Green><u>of</u></font>+<a name="line-210"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>TokName n<font color=Cyan>)</font> <font color=Red>|</font> s<font color=Cyan>==</font>n <font color=Red>-></font> return ()+<a name="line-211"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>TokFreeText n<font color=Cyan>)</font> <font color=Red>|</font> s<font color=Cyan>==</font>n <font color=Red>-></font> return ()+<a name="line-212"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Red>@</font><font color=Cyan>(</font>TokError <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> report failBad <font color=Cyan>(</font>show s<font color=Cyan>)</font> p t+<a name="line-213"></a> <font color=Cyan>(</font>p<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red>-></font> report fail <font color=Cyan>(</font>show s<font color=Cyan>)</font> p t+<a name="line-214"></a> <font color=Cyan>}</font>+<a name="line-215"></a>+<a name="line-216"></a><a name="posn"></a><font color=Blue>posn</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> x<font color=Red>@</font><font color=Cyan>(</font>p<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red><-</font> next+<a name="line-217"></a> <font color=Cyan>;</font> reparse <font color=Red>[</font>x<font color=Red>]</font>+<a name="line-218"></a> <font color=Cyan>;</font> return p+<a name="line-219"></a> <font color=Cyan>}</font>+<a name="line-220"></a>+<a name="line-221"></a><a name="nmtoken"></a><font color=Blue>nmtoken</font> <font color=Red>::</font> XParser NmToken+<a name="line-222"></a><font color=Blue>nmtoken</font> <font color=Red>=</font> <font color=Cyan>(</font>string <font color=Cyan>`onFail`</font> freetext<font color=Cyan>)</font>+<a name="line-223"></a>+<a name="line-224"></a><a name="failP"></a><font color=Blue>failP</font><font color=Cyan>,</font> failBadP <font color=Red>::</font> String <font color=Red>-></font> XParser a+<a name="line-225"></a><font color=Blue>failP</font> msg <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn<font color=Cyan>;</font> fail <font color=Cyan>(</font>msg<font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font> <font color=Cyan>}</font>+<a name="line-226"></a><a name="failBadP"></a><font color=Blue>failBadP</font> msg <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn<font color=Cyan>;</font> failBad <font color=Cyan>(</font>msg<font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font> <font color=Cyan>}</font>+<a name="line-227"></a>+<a name="line-228"></a><a name="report"></a><font color=Blue>report</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>XParser a<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> Posn <font color=Red>-></font> TokenT <font color=Red>-></font> XParser a+<a name="line-229"></a><font color=Blue>report</font> fail exp p t <font color=Red>=</font> fail <font color=Cyan>(</font><font color=Magenta>"Expected "</font><font color=Cyan>++</font>exp<font color=Cyan>++</font><font color=Magenta>" but found "</font><font color=Cyan>++</font>show t+<a name="line-230"></a> <font color=Cyan>++</font><font color=Magenta>"\n in "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>+<a name="line-231"></a>+<a name="line-232"></a><a name="adjustErrP"></a><font color=Blue>adjustErrP</font> <font color=Red>::</font> XParser a <font color=Red>-></font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Cyan>)</font> <font color=Red>-></font> XParser a+<a name="line-233"></a><a name="adjustErrP"></a><font color=Blue>p</font> <font color=Cyan>`adjustErrP`</font> f <font color=Red>=</font> p <font color=Cyan>`onFail`</font> <font color=Green><u>do</u></font> pn <font color=Red><-</font> posn+<a name="line-234"></a> <font color=Cyan>(</font>p <font color=Cyan>`adjustErr`</font> f<font color=Cyan>)</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>++</font>show pn<font color=Cyan>)</font>+<a name="line-235"></a>+<a name="line-236"></a><a name="peRef"></a><font color=Blue>peRef</font> <font color=Red>::</font> XParser a <font color=Red>-></font> XParser a+<a name="line-237"></a><font color=Blue>peRef</font> p <font color=Red>=</font>+<a name="line-238"></a> p <font color=Cyan>`onFail`</font>+<a name="line-239"></a> <font color=Green><u>do</u></font> pn <font color=Red><-</font> posn+<a name="line-240"></a> n <font color=Red><-</font> pereference+<a name="line-241"></a> tr <font color=Red><-</font> stQuery <font color=Cyan>(</font>lookupPE n<font color=Cyan>)</font> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"Looking up %"</font><font color=Cyan>++</font>n<font color=Cyan>)</font>+<a name="line-242"></a> <font color=Green><u>case</u></font> tr <font color=Green><u>of</u></font>+<a name="line-243"></a> Just <font color=Cyan>(</font>PEDefEntityValue ev<font color=Cyan>)</font> <font color=Red>-></font>+<a name="line-244"></a> <font color=Green><u>do</u></font> reparse <font color=Cyan>(</font>xmlReLex <font color=Cyan>(</font>posInNewCxt <font color=Cyan>(</font><font color=Magenta>"macro %"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font>+<a name="line-245"></a> <font color=Cyan>(</font>Just pn<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-246"></a> <font color=Cyan>(</font>flattenEV ev<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-247"></a> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>" defn: "</font><font color=Cyan>++</font>flattenEV ev<font color=Cyan>)</font>+<a name="line-248"></a> peRef p+<a name="line-249"></a> Just <font color=Cyan>(</font>PEDefExternalID <font color=Cyan>(</font>PUBLIC <font color=Green><u>_</u></font> <font color=Cyan>(</font>SystemLiteral f<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font>+<a name="line-250"></a> <font color=Green><u>do</u></font> <font color=Green><u>let</u></font> f' <font color=Red>=</font> combine <font color=Cyan>(</font>dropFileName <font color=Cyan>$</font> posnFilename pn<font color=Cyan>)</font> f+<a name="line-251"></a> val <font color=Red>=</font> unsafePerformIO <font color=Cyan>(</font>readFile f'<font color=Cyan>)</font>+<a name="line-252"></a> reparse <font color=Cyan>(</font>xmlReLex <font color=Cyan>(</font>posInNewCxt f'+<a name="line-253"></a> <font color=Cyan>(</font>Just pn<font color=Cyan>)</font><font color=Cyan>)</font> val<font color=Cyan>)</font>+<a name="line-254"></a> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>" reading from file "</font><font color=Cyan>++</font>f'<font color=Cyan>)</font>+<a name="line-255"></a> peRef p+<a name="line-256"></a> Just <font color=Cyan>(</font>PEDefExternalID <font color=Cyan>(</font>SYSTEM <font color=Cyan>(</font>SystemLiteral f<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font>+<a name="line-257"></a> <font color=Green><u>do</u></font> <font color=Green><u>let</u></font> f' <font color=Red>=</font> combine <font color=Cyan>(</font>dropFileName <font color=Cyan>$</font> posnFilename pn<font color=Cyan>)</font> f+<a name="line-258"></a> val <font color=Red>=</font> unsafePerformIO <font color=Cyan>(</font>readFile f'<font color=Cyan>)</font>+<a name="line-259"></a> reparse <font color=Cyan>(</font>xmlReLex <font color=Cyan>(</font>posInNewCxt f'+<a name="line-260"></a> <font color=Cyan>(</font>Just pn<font color=Cyan>)</font><font color=Cyan>)</font> val<font color=Cyan>)</font>+<a name="line-261"></a> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>" reading from file "</font><font color=Cyan>++</font>f'<font color=Cyan>)</font>+<a name="line-262"></a> peRef p+<a name="line-263"></a> Nothing <font color=Red>-></font> fail <font color=Cyan>(</font><font color=Magenta>"PEReference use before definition: "</font><font color=Cyan>++</font><font color=Magenta>"%"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font>+<a name="line-264"></a> <font color=Cyan>++</font><font color=Magenta>"\n at "</font><font color=Cyan>++</font>show pn<font color=Cyan>)</font>+<a name="line-265"></a>+<a name="line-266"></a><a name="blank"></a><font color=Blue>blank</font> <font color=Red>::</font> XParser a <font color=Red>-></font> XParser a+<a name="line-267"></a><font color=Blue>blank</font> p <font color=Red>=</font>+<a name="line-268"></a> p <font color=Cyan>`onFail`</font>+<a name="line-269"></a> <font color=Green><u>do</u></font> n <font color=Red><-</font> pereference+<a name="line-270"></a> tr <font color=Red><-</font> stQuery <font color=Cyan>(</font>lookupPE n<font color=Cyan>)</font> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"Looking up %"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>" (is blank?)"</font><font color=Cyan>)</font>+<a name="line-271"></a> <font color=Green><u>case</u></font> tr <font color=Green><u>of</u></font>+<a name="line-272"></a> Just <font color=Cyan>(</font>PEDefEntityValue ev<font color=Cyan>)</font>+<a name="line-273"></a> <font color=Red>|</font> all isSpace <font color=Cyan>(</font>flattenEV ev<font color=Cyan>)</font> <font color=Red>-></font>+<a name="line-274"></a> <font color=Green><u>do</u></font> blank p <font color=Cyan>`debug`</font> <font color=Magenta>"Empty macro definition"</font>+<a name="line-275"></a> Just <font color=Green><u>_</u></font> <font color=Red>-></font> failP <font color=Cyan>(</font><font color=Magenta>"expected a blank PERef macro: "</font><font color=Cyan>++</font><font color=Magenta>"%"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font>+<a name="line-276"></a> Nothing <font color=Red>-></font> failP <font color=Cyan>(</font><font color=Magenta>"PEReference use before definition: "</font><font color=Cyan>++</font><font color=Magenta>"%"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font>+<a name="line-277"></a>+<a name="line-278"></a>+<a name="line-279"></a>+<a name="line-280"></a><font color=Blue>---- XML Parsing Functions ----</font>+<a name="line-281"></a>+<a name="line-282"></a><a name="justDTD"></a><font color=Blue>justDTD</font> <font color=Red>::</font> XParser <font color=Cyan>(</font>Maybe DocTypeDecl<font color=Cyan>)</font>+<a name="line-283"></a><font color=Blue>justDTD</font> <font color=Red>=</font>+<a name="line-284"></a> <font color=Green><u>do</u></font> <font color=Cyan>(</font>ExtSubset <font color=Green><u>_</u></font> ds<font color=Cyan>)</font> <font color=Red><-</font> extsubset <font color=Cyan>`debug`</font> <font color=Magenta>"Trying external subset"</font>+<a name="line-285"></a> <font color=Green><u>if</u></font> null ds <font color=Green><u>then</u></font> fail <font color=Magenta>"empty"</font>+<a name="line-286"></a> <font color=Green><u>else</u></font> return <font color=Cyan>(</font>Just <font color=Cyan>(</font>DTD <font color=Magenta>"extsubset"</font> Nothing <font color=Cyan>(</font>concatMap extract ds<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-287"></a> <font color=Cyan>`onFail`</font>+<a name="line-288"></a> <font color=Green><u>do</u></font> <font color=Cyan>(</font>Prolog <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> dtd <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red><-</font> prolog+<a name="line-289"></a> return dtd+<a name="line-290"></a> <font color=Green><u>where</u></font> extract <font color=Cyan>(</font>ExtMarkupDecl m<font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>m<font color=Red>]</font>+<a name="line-291"></a> extract <font color=Cyan>(</font>ExtConditionalSect <font color=Cyan>(</font>IncludeSect i<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> concatMap extract i+<a name="line-292"></a> extract <font color=Cyan>(</font>ExtConditionalSect <font color=Cyan>(</font>IgnoreSect i<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> []+<a name="line-293"></a>+<a name="line-294"></a><a name="document"></a><font color=Blue>-- | Return an entire XML document including prolog and trailing junk.</font>+<a name="line-295"></a><font color=Blue>document</font> <font color=Red>::</font> XParser <font color=Cyan>(</font>Document Posn<font color=Cyan>)</font>+<a name="line-296"></a><font color=Blue>document</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-297"></a> <font color=Blue>-- p <- prolog `adjustErr` ("unrecognisable XML prolog\n"++)</font>+<a name="line-298"></a> <font color=Blue>-- e <- element</font>+<a name="line-299"></a> <font color=Blue>-- ms <- many misc</font>+<a name="line-300"></a> <font color=Blue>-- (_,ge) <- stGet</font>+<a name="line-301"></a> <font color=Blue>-- return (Document p ge e ms)</font>+<a name="line-302"></a> return Document <font color=Cyan>`apply`</font> <font color=Cyan>(</font>prolog <font color=Cyan>`adjustErr`</font>+<a name="line-303"></a> <font color=Cyan>(</font><font color=Magenta>"unrecognisable XML prolog\n"</font><font color=Cyan>++</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-304"></a> <font color=Cyan>`apply`</font> <font color=Cyan>(</font>fmap snd stGet<font color=Cyan>)</font>+<a name="line-305"></a> <font color=Cyan>`apply`</font> element+<a name="line-306"></a> <font color=Cyan>`apply`</font> many misc+<a name="line-307"></a>+<a name="line-308"></a><a name="comment"></a><font color=Blue>-- | Return an XML comment.</font>+<a name="line-309"></a><font color=Blue>comment</font> <font color=Red>::</font> XParser Comment+<a name="line-310"></a><font color=Blue>comment</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-311"></a> myBracket <font color=Cyan>(</font>tok TokCommentOpen<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokCommentClose<font color=Cyan>)</font> freetext+<a name="line-312"></a><font color=Blue>-- tok TokCommentOpen</font>+<a name="line-313"></a><font color=Blue>-- commit $ do</font>+<a name="line-314"></a><font color=Blue>-- c <- freetext</font>+<a name="line-315"></a><font color=Blue>-- tok TokCommentClose</font>+<a name="line-316"></a><font color=Blue>-- return c</font>+<a name="line-317"></a>+<a name="line-318"></a><a name="processinginstruction"></a><font color=Blue>-- | Parse a processing instruction.</font>+<a name="line-319"></a><font color=Blue>processinginstruction</font> <font color=Red>::</font> XParser ProcessingInstruction+<a name="line-320"></a><font color=Blue>processinginstruction</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-321"></a> tok TokPIOpen+<a name="line-322"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>+<a name="line-323"></a> n <font color=Red><-</font> string <font color=Cyan>`onFail`</font> failP <font color=Magenta>"processing instruction has no target"</font>+<a name="line-324"></a> f <font color=Red><-</font> freetext+<a name="line-325"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failP <font color=Cyan>(</font><font color=Magenta>"missing ?> in <?"</font><font color=Cyan>++</font>n<font color=Cyan>)</font>+<a name="line-326"></a> return <font color=Cyan>(</font>n<font color=Cyan>,</font> f<font color=Cyan>)</font>+<a name="line-327"></a>+<a name="line-328"></a><a name="cdsect"></a><font color=Blue>cdsect</font> <font color=Red>::</font> XParser CDSect+<a name="line-329"></a><font color=Blue>cdsect</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-330"></a> tok TokSectionOpen+<a name="line-331"></a> bracket <font color=Cyan>(</font>tok <font color=Cyan>(</font>TokSection CDATAx<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSectionClose<font color=Cyan>)</font> chardata+<a name="line-332"></a>+<a name="line-333"></a><a name="prolog"></a><font color=Blue>prolog</font> <font color=Red>::</font> XParser Prolog+<a name="line-334"></a><font color=Blue>prolog</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-335"></a> x <font color=Red><-</font> maybe xmldecl+<a name="line-336"></a> m1 <font color=Red><-</font> many misc+<a name="line-337"></a> dtd <font color=Red><-</font> maybe doctypedecl+<a name="line-338"></a> m2 <font color=Red><-</font> many misc+<a name="line-339"></a> return <font color=Cyan>(</font>Prolog x m1 dtd m2<font color=Cyan>)</font>+<a name="line-340"></a>+<a name="line-341"></a><a name="xmldecl"></a><font color=Blue>xmldecl</font> <font color=Red>::</font> XParser XMLDecl+<a name="line-342"></a><font color=Blue>xmldecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-343"></a> tok TokPIOpen+<a name="line-344"></a> <font color=Cyan>(</font>word <font color=Magenta>"xml"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"XML"</font><font color=Cyan>)</font>+<a name="line-345"></a> p <font color=Red><-</font> posn+<a name="line-346"></a> s <font color=Red><-</font> freetext+<a name="line-347"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing ?> in <?xml ...?>"</font>+<a name="line-348"></a> <font color=Blue>-- raise ((runParser aux emptySTs . xmlReLex p) s)</font>+<a name="line-349"></a> return <font color=Cyan>(</font>fst3 <font color=Cyan>(</font><font color=Cyan>(</font>runParser aux emptySTs <font color=Cyan>.</font> xmlReLex p<font color=Cyan>)</font> s<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-350"></a> <font color=Green><u>where</u></font>+<a name="line-351"></a> aux <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-352"></a> v <font color=Red><-</font> versioninfo <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing XML version info"</font>+<a name="line-353"></a> e <font color=Red><-</font> maybe encodingdecl+<a name="line-354"></a> s <font color=Red><-</font> maybe sddecl+<a name="line-355"></a> return <font color=Cyan>(</font>XMLDecl v e s<font color=Cyan>)</font>+<a name="line-356"></a> <font color=Blue>-- raise (Left err, _, _) = failP err</font>+<a name="line-357"></a> <font color=Blue>-- raise (Right ok, _, _) = return ok</font>+<a name="line-358"></a>+<a name="line-359"></a><a name="versioninfo"></a><font color=Blue>versioninfo</font> <font color=Red>::</font> XParser VersionInfo+<a name="line-360"></a><font color=Blue>versioninfo</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-361"></a> <font color=Cyan>(</font>word <font color=Magenta>"version"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"VERSION"</font><font color=Cyan>)</font>+<a name="line-362"></a> tok TokEqual+<a name="line-363"></a> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext+<a name="line-364"></a>+<a name="line-365"></a><a name="misc"></a><font color=Blue>misc</font> <font color=Red>::</font> XParser Misc+<a name="line-366"></a><font color=Blue>misc</font> <font color=Red>=</font>+<a name="line-367"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"<!--comment-->"</font><font color=Cyan>,</font> comment <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Comment<font color=Cyan>)</font>+<a name="line-368"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"<?PI?>"</font><font color=Cyan>,</font> processinginstruction <font color=Cyan>>>=</font> return <font color=Cyan>.</font> PI<font color=Cyan>)</font>+<a name="line-369"></a> <font color=Red>]</font>+<a name="line-370"></a>+<a name="line-371"></a><a name="doctypedecl"></a><font color=Blue>-- | Return a DOCTYPE decl, indicating a DTD.</font>+<a name="line-372"></a><font color=Blue>doctypedecl</font> <font color=Red>::</font> XParser DocTypeDecl+<a name="line-373"></a><font color=Blue>doctypedecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-374"></a> tok TokSpecialOpen+<a name="line-375"></a> tok <font color=Cyan>(</font>TokSpecial DOCTYPEx<font color=Cyan>)</font>+<a name="line-376"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>+<a name="line-377"></a> n <font color=Red><-</font> name+<a name="line-378"></a> eid <font color=Red><-</font> maybe externalid+<a name="line-379"></a> es <font color=Red><-</font> maybe <font color=Cyan>(</font>bracket <font color=Cyan>(</font>tok TokSqOpen<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSqClose<font color=Cyan>)</font>+<a name="line-380"></a> <font color=Cyan>(</font>many <font color=Cyan>(</font>peRef markupdecl<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-381"></a> blank <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing > in DOCTYPE decl"</font>+<a name="line-382"></a> return <font color=Cyan>(</font>DTD n eid <font color=Cyan>(</font><font color=Green><u>case</u></font> es <font color=Green><u>of</u></font> <font color=Cyan>{</font> Nothing <font color=Red>-></font> []<font color=Cyan>;</font> Just e <font color=Red>-></font> e <font color=Cyan>}</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-383"></a>+<a name="line-384"></a><a name="markupdecl"></a><font color=Blue>-- | Return a DTD markup decl, e.g. ELEMENT, ATTLIST, etc</font>+<a name="line-385"></a><font color=Blue>markupdecl</font> <font color=Red>::</font> XParser MarkupDecl+<a name="line-386"></a><font color=Blue>markupdecl</font> <font color=Red>=</font>+<a name="line-387"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"ELEMENT"</font><font color=Cyan>,</font> elementdecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Element<font color=Cyan>)</font>+<a name="line-388"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"ATTLIST"</font><font color=Cyan>,</font> attlistdecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> AttList<font color=Cyan>)</font>+<a name="line-389"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"ENTITY"</font><font color=Cyan>,</font> entitydecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Entity<font color=Cyan>)</font>+<a name="line-390"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"NOTATION"</font><font color=Cyan>,</font> notationdecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Notation<font color=Cyan>)</font>+<a name="line-391"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"misc"</font><font color=Cyan>,</font> misc <font color=Cyan>>>=</font> return <font color=Cyan>.</font> MarkupMisc<font color=Cyan>)</font>+<a name="line-392"></a> <font color=Red>]</font>+<a name="line-393"></a> <font color=Cyan>`adjustErrP`</font>+<a name="line-394"></a> <font color=Cyan>(</font><font color=Magenta>"when looking for a markup decl,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-395"></a> <font color=Blue>-- (\ (ELEMENT, ATTLIST, ENTITY, NOTATION, <!--comment-->, or <?PI?>")</font>+<a name="line-396"></a>+<a name="line-397"></a><a name="extsubset"></a><font color=Blue>extsubset</font> <font color=Red>::</font> XParser ExtSubset+<a name="line-398"></a><font color=Blue>extsubset</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-399"></a> td <font color=Red><-</font> maybe textdecl+<a name="line-400"></a> ds <font color=Red><-</font> many <font color=Cyan>(</font>peRef extsubsetdecl<font color=Cyan>)</font>+<a name="line-401"></a> return <font color=Cyan>(</font>ExtSubset td ds<font color=Cyan>)</font>+<a name="line-402"></a>+<a name="line-403"></a><a name="extsubsetdecl"></a><font color=Blue>extsubsetdecl</font> <font color=Red>::</font> XParser ExtSubsetDecl+<a name="line-404"></a><font color=Blue>extsubsetdecl</font> <font color=Red>=</font>+<a name="line-405"></a> <font color=Cyan>(</font> markupdecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> ExtMarkupDecl<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-406"></a> <font color=Cyan>(</font> conditionalsect <font color=Cyan>>>=</font> return <font color=Cyan>.</font> ExtConditionalSect<font color=Cyan>)</font>+<a name="line-407"></a>+<a name="line-408"></a><a name="sddecl"></a><font color=Blue>sddecl</font> <font color=Red>::</font> XParser SDDecl+<a name="line-409"></a><font color=Blue>sddecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-410"></a> <font color=Cyan>(</font>word <font color=Magenta>"standalone"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"STANDALONE"</font><font color=Cyan>)</font>+<a name="line-411"></a> commit <font color=Cyan>$</font> <font color=Green><u>do</u></font>+<a name="line-412"></a> tok TokEqual <font color=Cyan>`onFail`</font> failP <font color=Magenta>"missing = in 'standalone' decl"</font>+<a name="line-413"></a> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font>+<a name="line-414"></a> <font color=Cyan>(</font> <font color=Cyan>(</font>word <font color=Magenta>"yes"</font> <font color=Cyan>>></font> return True<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-415"></a> <font color=Cyan>(</font>word <font color=Magenta>"no"</font> <font color=Cyan>>></font> return False<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-416"></a> failP <font color=Magenta>"'standalone' decl requires 'yes' or 'no' value"</font> <font color=Cyan>)</font>+<a name="line-417"></a>+<a name="line-418"></a><font color=Blue>{-+<a name="line-419"></a>element :: XParser (Element Posn)+<a name="line-420"></a>element = do+<a name="line-421"></a> tok TokAnyOpen+<a name="line-422"></a> (ElemTag n as) <- elemtag+<a name="line-423"></a> oneOf' [ ("self-closing tag <"++n++"/>"+<a name="line-424"></a> , do tok TokEndClose+<a name="line-425"></a> return (Elem n as []))+<a name="line-426"></a> , ("after open tag <"++n++">"+<a name="line-427"></a> , do tok TokAnyClose+<a name="line-428"></a> cs <- many content+<a name="line-429"></a> p <- posn+<a name="line-430"></a> m <- bracket (tok TokEndOpen) (tok TokAnyClose) name+<a name="line-431"></a> checkmatch p n m+<a name="line-432"></a> return (Elem n as cs))+<a name="line-433"></a> ] `adjustErr` (("in element tag "++n++",\n")++)+<a name="line-434"></a>-}</font>+<a name="line-435"></a>+<a name="line-436"></a><a name="element"></a><font color=Blue>-- | Return a complete element including all its inner content.</font>+<a name="line-437"></a><font color=Blue>element</font> <font color=Red>::</font> XParser <font color=Cyan>(</font>Element Posn<font color=Cyan>)</font>+<a name="line-438"></a><font color=Blue>element</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-439"></a> tok TokAnyOpen+<a name="line-440"></a> <font color=Cyan>(</font>ElemTag n <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Red><-</font> elemtag+<a name="line-441"></a> return <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan>`apply`</font>+<a name="line-442"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokEndClose+<a name="line-443"></a> return []+<a name="line-444"></a> <font color=Cyan>`onFail`</font>+<a name="line-445"></a> <font color=Green><u>do</u></font> tok TokAnyClose+<a name="line-446"></a> commit <font color=Cyan>$</font> manyFinally content+<a name="line-447"></a> <font color=Cyan>(</font><font color=Green><u>do</u></font> p <font color=Red><-</font> posn+<a name="line-448"></a> m <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokEndOpen<font color=Cyan>)</font>+<a name="line-449"></a> <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font> name+<a name="line-450"></a> checkmatch p n m<font color=Cyan>)</font>+<a name="line-451"></a> <font color=Cyan>)</font> <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in element tag "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-452"></a>+<a name="line-453"></a><a name="checkmatch"></a><font color=Blue>checkmatch</font> <font color=Red>::</font> Posn <font color=Red>-></font> Name <font color=Red>-></font> Name <font color=Red>-></font> XParser ()+<a name="line-454"></a><font color=Blue>checkmatch</font> p n m <font color=Red>=</font>+<a name="line-455"></a> <font color=Green><u>if</u></font> n <font color=Cyan>==</font> m <font color=Green><u>then</u></font> return ()+<a name="line-456"></a> <font color=Green><u>else</u></font> failBadP <font color=Cyan>(</font><font color=Magenta>"tag <"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>"> terminated by </"</font><font color=Cyan>++</font>m<font color=Cyan>++</font><font color=Magenta>">"</font><font color=Cyan>)</font>+<a name="line-457"></a>+<a name="line-458"></a><a name="elemtag"></a><font color=Blue>-- | Parse only the parts between angle brackets in an element tag.</font>+<a name="line-459"></a><font color=Blue>elemtag</font> <font color=Red>::</font> XParser ElemTag+<a name="line-460"></a><font color=Blue>elemtag</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-461"></a> n <font color=Red><-</font> name <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Magenta>"malformed element tag\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-462"></a> <font color=Green><u>as</u></font> <font color=Red><-</font> many attribute+<a name="line-463"></a> return <font color=Cyan>(</font>ElemTag n <font color=Green><u>as</u></font><font color=Cyan>)</font>+<a name="line-464"></a>+<a name="line-465"></a><a name="elemOpenTag"></a><font color=Blue>-- | For use with stream parsers - returns the complete opening element tag.</font>+<a name="line-466"></a><font color=Blue>elemOpenTag</font> <font color=Red>::</font> XParser ElemTag+<a name="line-467"></a><font color=Blue>elemOpenTag</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-468"></a> tok TokAnyOpen+<a name="line-469"></a> e <font color=Red><-</font> elemtag+<a name="line-470"></a> tok TokAnyClose+<a name="line-471"></a> return e+<a name="line-472"></a>+<a name="line-473"></a><a name="elemCloseTag"></a><font color=Blue>-- | For use with stream parsers - accepts a closing tag, provided it</font>+<a name="line-474"></a><font color=Blue>-- matches the given element name.</font>+<a name="line-475"></a><font color=Blue>elemCloseTag</font> <font color=Red>::</font> Name <font color=Red>-></font> XParser ()+<a name="line-476"></a><font color=Blue>elemCloseTag</font> n <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-477"></a> tok TokEndOpen+<a name="line-478"></a> p <font color=Red><-</font> posn+<a name="line-479"></a> m <font color=Red><-</font> name+<a name="line-480"></a> tok TokAnyClose+<a name="line-481"></a> checkmatch p n m+<a name="line-482"></a>+<a name="line-483"></a><a name="attribute"></a><font color=Blue>attribute</font> <font color=Red>::</font> XParser Attribute+<a name="line-484"></a><font color=Blue>attribute</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-485"></a> n <font color=Red><-</font> name <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"malformed attribute name\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-486"></a> tok TokEqual <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing = in attribute"</font>+<a name="line-487"></a> v <font color=Red><-</font> attvalue <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing attvalue"</font>+<a name="line-488"></a> return <font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Cyan>)</font>+<a name="line-489"></a>+<a name="line-490"></a><a name="content"></a><font color=Blue>-- | Return a content particle, e.g. text, element, reference, etc</font>+<a name="line-491"></a><font color=Blue>content</font> <font color=Red>::</font> XParser <font color=Cyan>(</font>Content Posn<font color=Cyan>)</font>+<a name="line-492"></a><font color=Blue>content</font> <font color=Red>=</font>+<a name="line-493"></a> <font color=Green><u>do</u></font> <font color=Cyan>{</font> p <font color=Red><-</font> posn+<a name="line-494"></a> <font color=Cyan>;</font> c' <font color=Red><-</font> content'+<a name="line-495"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>c' p<font color=Cyan>)</font>+<a name="line-496"></a> <font color=Cyan>}</font>+<a name="line-497"></a> <font color=Green><u>where</u></font>+<a name="line-498"></a> content' <font color=Red>=</font> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"element"</font><font color=Cyan>,</font> element <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CElem<font color=Cyan>)</font>+<a name="line-499"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"chardata"</font><font color=Cyan>,</font> chardata <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CString False<font color=Cyan>)</font>+<a name="line-500"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"reference"</font><font color=Cyan>,</font> reference <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CRef<font color=Cyan>)</font>+<a name="line-501"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"CDATA"</font><font color=Cyan>,</font> cdsect <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CString True<font color=Cyan>)</font>+<a name="line-502"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"misc"</font><font color=Cyan>,</font> misc <font color=Cyan>>>=</font> return <font color=Cyan>.</font> CMisc<font color=Cyan>)</font>+<a name="line-503"></a> <font color=Red>]</font>+<a name="line-504"></a> <font color=Cyan>`adjustErrP`</font> <font color=Cyan>(</font><font color=Magenta>"when looking for a content item,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-505"></a><font color=Blue>-- (\ (element, text, reference, CDATA section, <!--comment-->, or <?PI?>")</font>+<a name="line-506"></a>+<a name="line-507"></a><a name="elementdecl"></a><font color=Blue>elementdecl</font> <font color=Red>::</font> XParser ElementDecl+<a name="line-508"></a><font color=Blue>elementdecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-509"></a> tok TokSpecialOpen+<a name="line-510"></a> tok <font color=Cyan>(</font>TokSpecial ELEMENTx<font color=Cyan>)</font>+<a name="line-511"></a> n <font color=Red><-</font> peRef name <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Magenta>"expecting identifier in ELEMENT decl\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-512"></a> c <font color=Red><-</font> peRef contentspec+<a name="line-513"></a> <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in content spec of ELEMENT decl: "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>"\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-514"></a> blank <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failBadP+<a name="line-515"></a> <font color=Cyan>(</font><font color=Magenta>"expected > terminating ELEMENT decl"</font>+<a name="line-516"></a> <font color=Cyan>++</font><font color=Magenta>"\n element name was "</font><font color=Cyan>++</font>show n+<a name="line-517"></a> <font color=Cyan>++</font><font color=Magenta>"\n contentspec was "</font><font color=Cyan>++</font><font color=Cyan>(</font><font color=Red>\</font> <font color=Cyan>(</font>ContentSpec p<font color=Cyan>)</font><font color=Red>-></font> show p<font color=Cyan>)</font> c<font color=Cyan>)</font>+<a name="line-518"></a> return <font color=Cyan>(</font>ElementDecl n c<font color=Cyan>)</font>+<a name="line-519"></a>+<a name="line-520"></a><a name="contentspec"></a><font color=Blue>contentspec</font> <font color=Red>::</font> XParser ContentSpec+<a name="line-521"></a><font color=Blue>contentspec</font> <font color=Red>=</font>+<a name="line-522"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"EMPTY"</font><font color=Cyan>,</font> peRef <font color=Cyan>(</font>word <font color=Magenta>"EMPTY"</font><font color=Cyan>)</font> <font color=Cyan>>></font> return EMPTY<font color=Cyan>)</font>+<a name="line-523"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"ANY"</font><font color=Cyan>,</font> peRef <font color=Cyan>(</font>word <font color=Magenta>"ANY"</font><font color=Cyan>)</font> <font color=Cyan>>></font> return ANY<font color=Cyan>)</font>+<a name="line-524"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"mixed"</font><font color=Cyan>,</font> peRef mixed <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Mixed<font color=Cyan>)</font>+<a name="line-525"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"simple"</font><font color=Cyan>,</font> peRef cp <font color=Cyan>>>=</font> return <font color=Cyan>.</font> ContentSpec<font color=Cyan>)</font>+<a name="line-526"></a> <font color=Red>]</font>+<a name="line-527"></a> <font color=Blue>-- `adjustErr` ("when looking for content spec,\n"++)</font>+<a name="line-528"></a> <font color=Blue>-- `adjustErr` (++"\nLooking for content spec (EMPTY, ANY, mixed, etc)")</font>+<a name="line-529"></a>+<a name="line-530"></a><a name="choice"></a><font color=Blue>choice</font> <font color=Red>::</font> XParser <font color=Red>[</font>CP<font color=Red>]</font>+<a name="line-531"></a><font color=Blue>choice</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-532"></a> myBracket <font color=Cyan>(</font>tok TokBraOpen <font color=Cyan>`debug`</font> <font color=Magenta>"Trying choice"</font><font color=Cyan>)</font>+<a name="line-533"></a> <font color=Cyan>(</font>blank <font color=Cyan>(</font>tok TokBraClose <font color=Cyan>`debug`</font> <font color=Magenta>"Succeeded with choice"</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-534"></a> <font color=Cyan>(</font>peRef cp <font color=Cyan>`sepBy1`</font> blank <font color=Cyan>(</font>tok TokPipe<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-535"></a>+<a name="line-536"></a><a name="sequence"></a><font color=Blue>sequence</font> <font color=Red>::</font> XParser <font color=Red>[</font>CP<font color=Red>]</font>+<a name="line-537"></a><font color=Blue>sequence</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-538"></a> myBracket <font color=Cyan>(</font>tok TokBraOpen <font color=Cyan>`debug`</font> <font color=Magenta>"Trying sequence"</font><font color=Cyan>)</font>+<a name="line-539"></a> <font color=Cyan>(</font>blank <font color=Cyan>(</font>tok TokBraClose <font color=Cyan>`debug`</font> <font color=Magenta>"Succeeded with sequence"</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-540"></a> <font color=Cyan>(</font>peRef cp <font color=Cyan>`sepBy1`</font> blank <font color=Cyan>(</font>tok TokComma<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-541"></a>+<a name="line-542"></a><a name="cp"></a><font color=Blue>cp</font> <font color=Red>::</font> XParser CP+<a name="line-543"></a><font color=Blue>cp</font> <font color=Red>=</font> oneOf <font color=Red>[</font> <font color=Cyan>(</font> <font color=Green><u>do</u></font> n <font color=Red><-</font> name+<a name="line-544"></a> m <font color=Red><-</font> modifier+<a name="line-545"></a> <font color=Green><u>let</u></font> c <font color=Red>=</font> TagName n m+<a name="line-546"></a> return c <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ContentSpec: name "</font><font color=Cyan>++</font>show c<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-547"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Green><u>do</u></font> ss <font color=Red><-</font> sequence+<a name="line-548"></a> m <font color=Red><-</font> modifier+<a name="line-549"></a> <font color=Green><u>let</u></font> c <font color=Red>=</font> Seq ss m+<a name="line-550"></a> return c <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ContentSpec: sequence "</font><font color=Cyan>++</font>show c<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-551"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Green><u>do</u></font> cs <font color=Red><-</font> choice+<a name="line-552"></a> m <font color=Red><-</font> modifier+<a name="line-553"></a> <font color=Green><u>let</u></font> c <font color=Red>=</font> Choice cs m+<a name="line-554"></a> return c <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ContentSpec: choice "</font><font color=Cyan>++</font>show c<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-555"></a> <font color=Red>]</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>++</font><font color=Magenta>"\nwhen looking for a content particle"</font><font color=Cyan>)</font>+<a name="line-556"></a>+<a name="line-557"></a><a name="modifier"></a><font color=Blue>modifier</font> <font color=Red>::</font> XParser Modifier+<a name="line-558"></a><font color=Blue>modifier</font> <font color=Red>=</font> oneOf <font color=Red>[</font> <font color=Cyan>(</font> tok TokStar <font color=Cyan>>></font> return Star <font color=Cyan>)</font>+<a name="line-559"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> tok TokQuery <font color=Cyan>>></font> return Query <font color=Cyan>)</font>+<a name="line-560"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> tok TokPlus <font color=Cyan>>></font> return Plus <font color=Cyan>)</font>+<a name="line-561"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> return None <font color=Cyan>)</font>+<a name="line-562"></a> <font color=Red>]</font>+<a name="line-563"></a>+<a name="line-564"></a><font color=Blue>-- just for debugging</font>+<a name="line-565"></a><font color=Green><u>instance</u></font> Show CP <font color=Green><u>where</u></font>+<a name="line-566"></a> show <font color=Cyan>(</font>TagName n m<font color=Cyan>)</font> <font color=Red>=</font> n<font color=Cyan>++</font>show m+<a name="line-567"></a> show <font color=Cyan>(</font>Choice cps m<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>'('</font><font color=Red><b>:</b></font> concat <font color=Cyan>(</font>intersperse <font color=Magenta>"|"</font> <font color=Cyan>(</font>map show cps<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-568"></a> <font color=Cyan>++</font><font color=Magenta>")"</font><font color=Cyan>++</font>show m+<a name="line-569"></a> show <font color=Cyan>(</font>Seq cps m<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>'('</font><font color=Red><b>:</b></font> concat <font color=Cyan>(</font>intersperse <font color=Magenta>","</font> <font color=Cyan>(</font>map show cps<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-570"></a> <font color=Cyan>++</font><font color=Magenta>")"</font><font color=Cyan>++</font>show m+<a name="line-571"></a><font color=Green><u>instance</u></font> Show Modifier <font color=Green><u>where</u></font>+<a name="line-572"></a> show None <font color=Red>=</font> <font color=Magenta>""</font>+<a name="line-573"></a> show Query <font color=Red>=</font> <font color=Magenta>"?"</font>+<a name="line-574"></a> show Star <font color=Red>=</font> <font color=Magenta>"*"</font>+<a name="line-575"></a> show Plus <font color=Red>=</font> <font color=Magenta>"+"</font>+<a name="line-576"></a><font color=Blue>----</font>+<a name="line-577"></a>+<a name="line-578"></a><a name="mixed"></a><font color=Blue>mixed</font> <font color=Red>::</font> XParser Mixed+<a name="line-579"></a><font color=Blue>mixed</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-580"></a> tok TokBraOpen+<a name="line-581"></a> peRef <font color=Cyan>(</font><font color=Green><u>do</u></font> tok TokHash+<a name="line-582"></a> word <font color=Magenta>"PCDATA"</font><font color=Cyan>)</font>+<a name="line-583"></a> commit <font color=Cyan>$</font>+<a name="line-584"></a> oneOf <font color=Red>[</font> <font color=Cyan>(</font> <font color=Green><u>do</u></font> cs <font color=Red><-</font> many <font color=Cyan>(</font>peRef <font color=Cyan>(</font><font color=Green><u>do</u></font> tok TokPipe+<a name="line-585"></a> peRef name<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-586"></a> blank <font color=Cyan>(</font>tok TokBraClose <font color=Cyan>>></font> tok TokStar<font color=Cyan>)</font>+<a name="line-587"></a> return <font color=Cyan>(</font>PCDATAplus cs<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-588"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> blank <font color=Cyan>(</font>tok TokBraClose <font color=Cyan>>></font> tok TokStar<font color=Cyan>)</font> <font color=Cyan>>></font> return PCDATA<font color=Cyan>)</font>+<a name="line-589"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> blank <font color=Cyan>(</font>tok TokBraClose<font color=Cyan>)</font> <font color=Cyan>>></font> return PCDATA<font color=Cyan>)</font>+<a name="line-590"></a> <font color=Red>]</font>+<a name="line-591"></a> <font color=Cyan>`adjustErrP`</font> <font color=Cyan>(</font><font color=Cyan>++</font><font color=Magenta>"\nLooking for mixed content spec (#PCDATA | ...)*\n"</font><font color=Cyan>)</font>+<a name="line-592"></a>+<a name="line-593"></a><a name="attlistdecl"></a><font color=Blue>attlistdecl</font> <font color=Red>::</font> XParser AttListDecl+<a name="line-594"></a><font color=Blue>attlistdecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-595"></a> tok TokSpecialOpen+<a name="line-596"></a> tok <font color=Cyan>(</font>TokSpecial ATTLISTx<font color=Cyan>)</font>+<a name="line-597"></a> n <font color=Red><-</font> peRef name <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Magenta>"expecting identifier in ATTLIST\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-598"></a> ds <font color=Red><-</font> peRef <font color=Cyan>(</font>many1 <font color=Cyan>(</font>peRef attdef<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-599"></a> blank <font color=Cyan>(</font>tok TokAnyClose<font color=Cyan>)</font> <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing > terminating ATTLIST"</font>+<a name="line-600"></a> return <font color=Cyan>(</font>AttListDecl n ds<font color=Cyan>)</font>+<a name="line-601"></a>+<a name="line-602"></a><a name="attdef"></a><font color=Blue>attdef</font> <font color=Red>::</font> XParser AttDef+<a name="line-603"></a><font color=Blue>attdef</font> <font color=Red>=</font>+<a name="line-604"></a> <font color=Green><u>do</u></font> n <font color=Red><-</font> peRef name <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"expecting attribute name\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-605"></a> t <font color=Red><-</font> peRef atttype <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"within attlist defn: "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-606"></a> d <font color=Red><-</font> peRef defaultdecl <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in attlist defn: "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-607"></a> return <font color=Cyan>(</font>AttDef n t d<font color=Cyan>)</font>+<a name="line-608"></a>+<a name="line-609"></a><a name="atttype"></a><font color=Blue>atttype</font> <font color=Red>::</font> XParser AttType+<a name="line-610"></a><font color=Blue>atttype</font> <font color=Red>=</font>+<a name="line-611"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"CDATA"</font><font color=Cyan>,</font> word <font color=Magenta>"CDATA"</font> <font color=Cyan>>></font> return StringType<font color=Cyan>)</font>+<a name="line-612"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"tokenized"</font><font color=Cyan>,</font> tokenizedtype <font color=Cyan>>>=</font> return <font color=Cyan>.</font> TokenizedType<font color=Cyan>)</font>+<a name="line-613"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"enumerated"</font><font color=Cyan>,</font> enumeratedtype <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EnumeratedType<font color=Cyan>)</font>+<a name="line-614"></a> <font color=Red>]</font>+<a name="line-615"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for ATTTYPE,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-616"></a> <font color=Blue>-- `adjustErr` (++"\nLooking for ATTTYPE (CDATA, tokenized, or enumerated")</font>+<a name="line-617"></a>+<a name="line-618"></a><a name="tokenizedtype"></a><font color=Blue>tokenizedtype</font> <font color=Red>::</font> XParser TokenizedType+<a name="line-619"></a><font color=Blue>tokenizedtype</font> <font color=Red>=</font>+<a name="line-620"></a> oneOf <font color=Red>[</font> <font color=Cyan>(</font> word <font color=Magenta>"ID"</font> <font color=Cyan>>></font> return ID<font color=Cyan>)</font>+<a name="line-621"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"IDREF"</font> <font color=Cyan>>></font> return IDREF<font color=Cyan>)</font>+<a name="line-622"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"IDREFS"</font> <font color=Cyan>>></font> return IDREFS<font color=Cyan>)</font>+<a name="line-623"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"ENTITY"</font> <font color=Cyan>>></font> return ENTITY<font color=Cyan>)</font>+<a name="line-624"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"ENTITIES"</font> <font color=Cyan>>></font> return ENTITIES<font color=Cyan>)</font>+<a name="line-625"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"NMTOKEN"</font> <font color=Cyan>>></font> return NMTOKEN<font color=Cyan>)</font>+<a name="line-626"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> word <font color=Magenta>"NMTOKENS"</font> <font color=Cyan>>></font> return NMTOKENS<font color=Cyan>)</font>+<a name="line-627"></a> <font color=Red>]</font> <font color=Cyan>`onFail`</font>+<a name="line-628"></a> <font color=Green><u>do</u></font> <font color=Cyan>{</font> t <font color=Red><-</font> next+<a name="line-629"></a> <font color=Cyan>;</font> failP <font color=Cyan>(</font><font color=Magenta>"Expected one of"</font>+<a name="line-630"></a> <font color=Cyan>++</font><font color=Magenta>" (ID, IDREF, IDREFS, ENTITY, ENTITIES, NMTOKEN, NMTOKENS)"</font>+<a name="line-631"></a> <font color=Cyan>++</font><font color=Magenta>"\nbut got "</font><font color=Cyan>++</font>show t<font color=Cyan>)</font>+<a name="line-632"></a> <font color=Cyan>}</font>+<a name="line-633"></a><font color=Blue>-- `adjustErr` (++"\nLooking for a tokenized type:\n\ </font>+<a name="line-634"></a><font color=Blue>-- \ (ID, IDREF, IDREFS, ENTITY, ENTITIES, NMTOKEN, NMTOKENS)")</font>+<a name="line-635"></a>+<a name="line-636"></a><a name="enumeratedtype"></a><font color=Blue>enumeratedtype</font> <font color=Red>::</font> XParser EnumeratedType+<a name="line-637"></a><font color=Blue>enumeratedtype</font> <font color=Red>=</font>+<a name="line-638"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"NOTATION"</font><font color=Cyan>,</font> notationtype <font color=Cyan>>>=</font> return <font color=Cyan>.</font> NotationType<font color=Cyan>)</font>+<a name="line-639"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"enumerated"</font><font color=Cyan>,</font> enumeration <font color=Cyan>>>=</font> return <font color=Cyan>.</font> Enumeration<font color=Cyan>)</font>+<a name="line-640"></a> <font color=Red>]</font>+<a name="line-641"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for an enumerated or NOTATION type,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-642"></a>+<a name="line-643"></a><a name="notationtype"></a><font color=Blue>notationtype</font> <font color=Red>::</font> XParser NotationType+<a name="line-644"></a><font color=Blue>notationtype</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-645"></a> word <font color=Magenta>"NOTATION"</font>+<a name="line-646"></a> bracket <font color=Cyan>(</font>tok TokBraOpen<font color=Cyan>)</font> <font color=Cyan>(</font>blank <font color=Cyan>(</font>tok TokBraClose<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-647"></a> <font color=Cyan>(</font>peRef name <font color=Cyan>`sepBy1`</font> peRef <font color=Cyan>(</font>tok TokPipe<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-648"></a>+<a name="line-649"></a><a name="enumeration"></a><font color=Blue>enumeration</font> <font color=Red>::</font> XParser Enumeration+<a name="line-650"></a><font color=Blue>enumeration</font> <font color=Red>=</font>+<a name="line-651"></a> bracket <font color=Cyan>(</font>tok TokBraOpen<font color=Cyan>)</font> <font color=Cyan>(</font>blank <font color=Cyan>(</font>tok TokBraClose<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-652"></a> <font color=Cyan>(</font>peRef nmtoken <font color=Cyan>`sepBy1`</font> blank <font color=Cyan>(</font>peRef <font color=Cyan>(</font>tok TokPipe<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-653"></a>+<a name="line-654"></a><a name="defaultdecl"></a><font color=Blue>defaultdecl</font> <font color=Red>::</font> XParser DefaultDecl+<a name="line-655"></a><font color=Blue>defaultdecl</font> <font color=Red>=</font>+<a name="line-656"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"REQUIRED"</font><font color=Cyan>,</font> tok TokHash <font color=Cyan>>></font> word <font color=Magenta>"REQUIRED"</font> <font color=Cyan>>></font> return REQUIRED<font color=Cyan>)</font>+<a name="line-657"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"IMPLIED"</font><font color=Cyan>,</font> tok TokHash <font color=Cyan>>></font> word <font color=Magenta>"IMPLIED"</font> <font color=Cyan>>></font> return IMPLIED<font color=Cyan>)</font>+<a name="line-658"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"FIXED"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> f <font color=Red><-</font> maybe <font color=Cyan>(</font>tok TokHash <font color=Cyan>>></font> word <font color=Magenta>"FIXED"</font>+<a name="line-659"></a> <font color=Cyan>>></font> return FIXED<font color=Cyan>)</font>+<a name="line-660"></a> a <font color=Red><-</font> peRef attvalue+<a name="line-661"></a> return <font color=Cyan>(</font>DefaultTo a f<font color=Cyan>)</font> <font color=Cyan>)</font>+<a name="line-662"></a> <font color=Red>]</font>+<a name="line-663"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for an attribute default decl,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-664"></a><font color=Blue>-- `adjustErr` (++"\nLooking for an attribute default decl:\n\ </font>+<a name="line-665"></a><font color=Blue>-- \ (REQUIRED, IMPLIED, FIXED)")</font>+<a name="line-666"></a>+<a name="line-667"></a><a name="conditionalsect"></a><font color=Blue>conditionalsect</font> <font color=Red>::</font> XParser ConditionalSect+<a name="line-668"></a><font color=Blue>conditionalsect</font> <font color=Red>=</font> oneOf'+<a name="line-669"></a> <font color=Red>[</font> <font color=Cyan>(</font> <font color=Magenta>"INCLUDE"</font>+<a name="line-670"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> tok TokSectionOpen+<a name="line-671"></a> peRef <font color=Cyan>(</font>tok <font color=Cyan>(</font>TokSection INCLUDEx<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-672"></a> p <font color=Red><-</font> posn+<a name="line-673"></a> tok TokSqOpen <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing [ after INCLUDE"</font>+<a name="line-674"></a> i <font color=Red><-</font> many <font color=Cyan>(</font>peRef extsubsetdecl<font color=Cyan>)</font>+<a name="line-675"></a> tok TokSectionClose+<a name="line-676"></a> <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"missing ]]> for INCLUDE section"</font>+<a name="line-677"></a> <font color=Cyan>++</font><font color=Magenta>"\n begun at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>+<a name="line-678"></a> return <font color=Cyan>(</font>IncludeSect i<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-679"></a> <font color=Cyan>,</font> <font color=Cyan>(</font> <font color=Magenta>"IGNORE"</font>+<a name="line-680"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> tok TokSectionOpen+<a name="line-681"></a> peRef <font color=Cyan>(</font>tok <font color=Cyan>(</font>TokSection IGNOREx<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-682"></a> p <font color=Red><-</font> posn+<a name="line-683"></a> tok TokSqOpen <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"missing [ after IGNORE"</font>+<a name="line-684"></a> i <font color=Red><-</font> many newIgnore <font color=Blue>-- many ignoresectcontents</font>+<a name="line-685"></a> tok TokSectionClose+<a name="line-686"></a> <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"missing ]]> for IGNORE section"</font>+<a name="line-687"></a> <font color=Cyan>++</font><font color=Magenta>"\n begun at "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>+<a name="line-688"></a> return <font color=Cyan>(</font>IgnoreSect []<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-689"></a> <font color=Red>]</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"in a conditional section,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-690"></a>+<a name="line-691"></a><a name="newIgnore"></a><font color=Blue>newIgnore</font> <font color=Red>::</font> XParser Ignore+<a name="line-692"></a><font color=Blue>newIgnore</font> <font color=Red>=</font>+<a name="line-693"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokSectionOpen+<a name="line-694"></a> many newIgnore <font color=Cyan>`debug`</font> <font color=Magenta>"IGNORING conditional section"</font>+<a name="line-695"></a> tok TokSectionClose+<a name="line-696"></a> return Ignore <font color=Cyan>`debug`</font> <font color=Magenta>"end of IGNORED conditional section"</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-697"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> t <font color=Red><-</font> nottok <font color=Red>[</font>TokSectionOpen<font color=Cyan>,</font>TokSectionClose<font color=Red>]</font>+<a name="line-698"></a> return Ignore <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ignoring: "</font><font color=Cyan>++</font>show t<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-699"></a>+<a name="line-700"></a><a name="ignoresectcontents"></a><font color=Blue>--- obsolete?</font>+<a name="line-701"></a><font color=Blue>ignoresectcontents</font> <font color=Red>::</font> XParser IgnoreSectContents+<a name="line-702"></a><font color=Blue>ignoresectcontents</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-703"></a> i <font color=Red><-</font> ignore+<a name="line-704"></a> is <font color=Red><-</font> many <font color=Cyan>(</font><font color=Green><u>do</u></font> tok TokSectionOpen+<a name="line-705"></a> ic <font color=Red><-</font> ignoresectcontents+<a name="line-706"></a> tok TokSectionClose+<a name="line-707"></a> ig <font color=Red><-</font> ignore+<a name="line-708"></a> return <font color=Cyan>(</font>ic<font color=Cyan>,</font>ig<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-709"></a> return <font color=Cyan>(</font>IgnoreSectContents i is<font color=Cyan>)</font>+<a name="line-710"></a>+<a name="line-711"></a><a name="ignore"></a><font color=Blue>ignore</font> <font color=Red>::</font> XParser Ignore+<a name="line-712"></a><font color=Blue>ignore</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-713"></a> is <font color=Red><-</font> many1 <font color=Cyan>(</font>nottok <font color=Red>[</font>TokSectionOpen<font color=Cyan>,</font>TokSectionClose<font color=Red>]</font><font color=Cyan>)</font>+<a name="line-714"></a> return Ignore <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"ignored all of: "</font><font color=Cyan>++</font>show is<font color=Cyan>)</font>+<a name="line-715"></a><font color=Blue>----</font>+<a name="line-716"></a>+<a name="line-717"></a><a name="reference"></a><font color=Blue>-- | Return either a general entity reference, or a character reference.</font>+<a name="line-718"></a><font color=Blue>reference</font> <font color=Red>::</font> XParser Reference+<a name="line-719"></a><font color=Blue>reference</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-720"></a> bracket <font color=Cyan>(</font>tok TokAmp<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSemi<font color=Cyan>)</font> <font color=Cyan>(</font>freetext <font color=Cyan>>>=</font> val<font color=Cyan>)</font>+<a name="line-721"></a> <font color=Green><u>where</u></font>+<a name="line-722"></a> val <font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font><font color=Magenta>'x'</font><font color=Red><b>:</b></font>i<font color=Cyan>)</font> <font color=Red>|</font> all isHexDigit i+<a name="line-723"></a> <font color=Red>=</font> return <font color=Cyan>.</font> RefChar <font color=Cyan>.</font> fst <font color=Cyan>.</font> head <font color=Cyan>.</font> readHex <font color=Cyan>$</font> i+<a name="line-724"></a> val <font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>i<font color=Cyan>)</font> <font color=Red>|</font> all isDigit i+<a name="line-725"></a> <font color=Red>=</font> return <font color=Cyan>.</font> RefChar <font color=Cyan>.</font> fst <font color=Cyan>.</font> head <font color=Cyan>.</font> readDec <font color=Cyan>$</font> i+<a name="line-726"></a> val name <font color=Red>=</font> return <font color=Cyan>.</font> RefEntity <font color=Cyan>$</font> name+<a name="line-727"></a>+<a name="line-728"></a><font color=Blue>{- -- following is incorrect+<a name="line-729"></a>reference =+<a name="line-730"></a> ( charref >>= return . RefChar) `onFail`+<a name="line-731"></a> ( entityref >>= return . RefEntity)+<a name="line-732"></a>+<a name="line-733"></a>entityref :: XParser EntityRef+<a name="line-734"></a>entityref = do+<a name="line-735"></a> bracket (tok TokAmp) (tok TokSemi) name+<a name="line-736"></a>+<a name="line-737"></a>charref :: XParser CharRef+<a name="line-738"></a>charref = do+<a name="line-739"></a> bracket (tok TokAmp) (tok TokSemi) (freetext >>= readCharVal)+<a name="line-740"></a> where+<a name="line-741"></a> readCharVal ('#':'x':i) = return . fst . head . readHex $ i+<a name="line-742"></a> readCharVal ('#':i) = return . fst . head . readDec $ i+<a name="line-743"></a> readCharVal _ = mzero+<a name="line-744"></a>-}</font>+<a name="line-745"></a>+<a name="line-746"></a><a name="pereference"></a><font color=Blue>pereference</font> <font color=Red>::</font> XParser PEReference+<a name="line-747"></a><font color=Blue>pereference</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-748"></a> myBracket <font color=Cyan>(</font>tok TokPercent<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokSemi<font color=Cyan>)</font> nmtoken+<a name="line-749"></a>+<a name="line-750"></a><a name="entitydecl"></a><font color=Blue>entitydecl</font> <font color=Red>::</font> XParser EntityDecl+<a name="line-751"></a><font color=Blue>entitydecl</font> <font color=Red>=</font>+<a name="line-752"></a> <font color=Cyan>(</font> gedecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EntityGEDecl<font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-753"></a> <font color=Cyan>(</font> pedecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EntityPEDecl<font color=Cyan>)</font>+<a name="line-754"></a>+<a name="line-755"></a><a name="gedecl"></a><font color=Blue>gedecl</font> <font color=Red>::</font> XParser GEDecl+<a name="line-756"></a><font color=Blue>gedecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-757"></a> tok TokSpecialOpen+<a name="line-758"></a> tok <font color=Cyan>(</font>TokSpecial ENTITYx<font color=Cyan>)</font>+<a name="line-759"></a> n <font color=Red><-</font> name+<a name="line-760"></a> e <font color=Red><-</font> entitydef <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in general entity defn "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-761"></a> tok TokAnyClose <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"expected > terminating G ENTITY decl "</font><font color=Cyan>++</font>n<font color=Cyan>)</font>+<a name="line-762"></a> stUpdate <font color=Cyan>(</font>addGE n e<font color=Cyan>)</font> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"added GE defn &"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font>+<a name="line-763"></a> return <font color=Cyan>(</font>GEDecl n e<font color=Cyan>)</font>+<a name="line-764"></a>+<a name="line-765"></a><a name="pedecl"></a><font color=Blue>pedecl</font> <font color=Red>::</font> XParser PEDecl+<a name="line-766"></a><font color=Blue>pedecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-767"></a> tok TokSpecialOpen+<a name="line-768"></a> tok <font color=Cyan>(</font>TokSpecial ENTITYx<font color=Cyan>)</font>+<a name="line-769"></a> tok TokPercent+<a name="line-770"></a> n <font color=Red><-</font> name+<a name="line-771"></a> e <font color=Red><-</font> pedef <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"in parameter entity defn "</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>",\n"</font><font color=Cyan>)</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-772"></a> tok TokAnyClose <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"expected > terminating P ENTITY decl "</font><font color=Cyan>++</font>n<font color=Cyan>)</font>+<a name="line-773"></a> stUpdate <font color=Cyan>(</font>addPE n e<font color=Cyan>)</font> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"added PE defn %"</font><font color=Cyan>++</font>n<font color=Cyan>++</font><font color=Magenta>";\n"</font><font color=Cyan>++</font>show e<font color=Cyan>)</font>+<a name="line-774"></a> return <font color=Cyan>(</font>PEDecl n e<font color=Cyan>)</font>+<a name="line-775"></a>+<a name="line-776"></a><a name="entitydef"></a><font color=Blue>entitydef</font> <font color=Red>::</font> XParser EntityDef+<a name="line-777"></a><font color=Blue>entitydef</font> <font color=Red>=</font>+<a name="line-778"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"entityvalue"</font><font color=Cyan>,</font> entityvalue <font color=Cyan>>>=</font> return <font color=Cyan>.</font> DefEntityValue<font color=Cyan>)</font>+<a name="line-779"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"external"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> eid <font color=Red><-</font> externalid+<a name="line-780"></a> ndd <font color=Red><-</font> maybe ndatadecl+<a name="line-781"></a> return <font color=Cyan>(</font>DefExternalID eid ndd<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-782"></a> <font color=Red>]</font>+<a name="line-783"></a>+<a name="line-784"></a><a name="pedef"></a><font color=Blue>pedef</font> <font color=Red>::</font> XParser PEDef+<a name="line-785"></a><font color=Blue>pedef</font> <font color=Red>=</font>+<a name="line-786"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"entityvalue"</font><font color=Cyan>,</font> entityvalue <font color=Cyan>>>=</font> return <font color=Cyan>.</font> PEDefEntityValue<font color=Cyan>)</font>+<a name="line-787"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"externalid"</font><font color=Cyan>,</font> externalid <font color=Cyan>>>=</font> return <font color=Cyan>.</font> PEDefExternalID<font color=Cyan>)</font>+<a name="line-788"></a> <font color=Red>]</font>+<a name="line-789"></a>+<a name="line-790"></a><a name="externalid"></a><font color=Blue>externalid</font> <font color=Red>::</font> XParser ExternalID+<a name="line-791"></a><font color=Blue>externalid</font> <font color=Red>=</font>+<a name="line-792"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"SYSTEM"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> word <font color=Magenta>"SYSTEM"</font>+<a name="line-793"></a> s <font color=Red><-</font> systemliteral+<a name="line-794"></a> return <font color=Cyan>(</font>SYSTEM s<font color=Cyan>)</font> <font color=Cyan>)</font>+<a name="line-795"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"PUBLIC"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> word <font color=Magenta>"PUBLIC"</font>+<a name="line-796"></a> p <font color=Red><-</font> pubidliteral+<a name="line-797"></a> s <font color=Red><-</font> systemliteral+<a name="line-798"></a> return <font color=Cyan>(</font>PUBLIC p s<font color=Cyan>)</font> <font color=Cyan>)</font>+<a name="line-799"></a> <font color=Red>]</font>+<a name="line-800"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for an external id,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-801"></a>+<a name="line-802"></a><a name="ndatadecl"></a><font color=Blue>ndatadecl</font> <font color=Red>::</font> XParser NDataDecl+<a name="line-803"></a><font color=Blue>ndatadecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-804"></a> word <font color=Magenta>"NDATA"</font>+<a name="line-805"></a> n <font color=Red><-</font> name+<a name="line-806"></a> return <font color=Cyan>(</font>NDATA n<font color=Cyan>)</font>+<a name="line-807"></a>+<a name="line-808"></a><a name="textdecl"></a><font color=Blue>textdecl</font> <font color=Red>::</font> XParser TextDecl+<a name="line-809"></a><font color=Blue>textdecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-810"></a> tok TokPIOpen+<a name="line-811"></a> <font color=Cyan>(</font>word <font color=Magenta>"xml"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"XML"</font><font color=Cyan>)</font>+<a name="line-812"></a> v <font color=Red><-</font> maybe versioninfo+<a name="line-813"></a> e <font color=Red><-</font> encodingdecl+<a name="line-814"></a> tok TokPIClose <font color=Cyan>`onFail`</font> failP <font color=Magenta>"expected ?> terminating text decl"</font>+<a name="line-815"></a> return <font color=Cyan>(</font>TextDecl v e<font color=Cyan>)</font>+<a name="line-816"></a>+<a name="line-817"></a><a name="extparsedent"></a><font color=Blue>extparsedent</font> <font color=Red>::</font> XParser <font color=Cyan>(</font>ExtParsedEnt Posn<font color=Cyan>)</font>+<a name="line-818"></a><font color=Blue>extparsedent</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-819"></a> t <font color=Red><-</font> maybe textdecl+<a name="line-820"></a> c <font color=Red><-</font> content+<a name="line-821"></a> return <font color=Cyan>(</font>ExtParsedEnt t c<font color=Cyan>)</font>+<a name="line-822"></a>+<a name="line-823"></a><a name="extpe"></a><font color=Blue>extpe</font> <font color=Red>::</font> XParser ExtPE+<a name="line-824"></a><font color=Blue>extpe</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-825"></a> t <font color=Red><-</font> maybe textdecl+<a name="line-826"></a> e <font color=Red><-</font> many <font color=Cyan>(</font>peRef extsubsetdecl<font color=Cyan>)</font>+<a name="line-827"></a> return <font color=Cyan>(</font>ExtPE t e<font color=Cyan>)</font>+<a name="line-828"></a>+<a name="line-829"></a><a name="encodingdecl"></a><font color=Blue>encodingdecl</font> <font color=Red>::</font> XParser EncodingDecl+<a name="line-830"></a><font color=Blue>encodingdecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-831"></a> <font color=Cyan>(</font>word <font color=Magenta>"encoding"</font> <font color=Cyan>`onFail`</font> word <font color=Magenta>"ENCODING"</font><font color=Cyan>)</font>+<a name="line-832"></a> tok TokEqual <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"expected = in 'encoding' decl"</font>+<a name="line-833"></a> f <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext+<a name="line-834"></a> return <font color=Cyan>(</font>EncodingDecl f<font color=Cyan>)</font>+<a name="line-835"></a>+<a name="line-836"></a><a name="notationdecl"></a><font color=Blue>notationdecl</font> <font color=Red>::</font> XParser NotationDecl+<a name="line-837"></a><font color=Blue>notationdecl</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-838"></a> tok TokSpecialOpen+<a name="line-839"></a> tok <font color=Cyan>(</font>TokSpecial NOTATIONx<font color=Cyan>)</font>+<a name="line-840"></a> n <font color=Red><-</font> name+<a name="line-841"></a> e <font color=Red><-</font> either externalid publicid+<a name="line-842"></a> tok TokAnyClose <font color=Cyan>`onFail`</font> failBadP <font color=Cyan>(</font><font color=Magenta>"expected > terminating NOTATION decl "</font><font color=Cyan>++</font>n<font color=Cyan>)</font>+<a name="line-843"></a> return <font color=Cyan>(</font>NOTATION n e<font color=Cyan>)</font>+<a name="line-844"></a>+<a name="line-845"></a><a name="publicid"></a><font color=Blue>publicid</font> <font color=Red>::</font> XParser PublicID+<a name="line-846"></a><font color=Blue>publicid</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-847"></a> word <font color=Magenta>"PUBLIC"</font>+<a name="line-848"></a> p <font color=Red><-</font> pubidliteral+<a name="line-849"></a> return <font color=Cyan>(</font>PUBLICID p<font color=Cyan>)</font>+<a name="line-850"></a>+<a name="line-851"></a><a name="entityvalue"></a><font color=Blue>entityvalue</font> <font color=Red>::</font> XParser EntityValue+<a name="line-852"></a><font color=Blue>entityvalue</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-853"></a> <font color=Blue>-- evs <- bracket (tok TokQuote) (tok TokQuote) (many (peRef ev))</font>+<a name="line-854"></a> tok TokQuote+<a name="line-855"></a> pn <font color=Red><-</font> posn+<a name="line-856"></a> evs <font color=Red><-</font> many ev+<a name="line-857"></a> tok TokQuote <font color=Cyan>`onFail`</font> failBadP <font color=Magenta>"expected quote to terminate entityvalue"</font>+<a name="line-858"></a> <font color=Blue>-- quoted text must be rescanned for possible PERefs</font>+<a name="line-859"></a> st <font color=Red><-</font> stGet+<a name="line-860"></a> <font color=Blue>-- Prelude.either failBad (return . EntityValue) . fst3 $</font>+<a name="line-861"></a> return <font color=Cyan>.</font> EntityValue <font color=Cyan>.</font> fst3 <font color=Cyan>$</font>+<a name="line-862"></a> <font color=Cyan>(</font>runParser <font color=Cyan>(</font>many ev<font color=Cyan>)</font> st+<a name="line-863"></a> <font color=Cyan>(</font>reLexEntityValue <font color=Cyan>(</font><font color=Red>\</font>s<font color=Red>-></font> stringify <font color=Cyan>(</font>lookupPE s st<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-864"></a> pn+<a name="line-865"></a> <font color=Cyan>(</font>flattenEV <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-866"></a> <font color=Green><u>where</u></font>+<a name="line-867"></a> stringify <font color=Cyan>(</font>Just <font color=Cyan>(</font>PEDefEntityValue ev<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> Just <font color=Cyan>(</font>flattenEV ev<font color=Cyan>)</font>+<a name="line-868"></a> stringify <font color=Green><u>_</u></font> <font color=Red>=</font> Nothing+<a name="line-869"></a>+<a name="line-870"></a><a name="ev"></a><font color=Blue>ev</font> <font color=Red>::</font> XParser EV+<a name="line-871"></a><font color=Blue>ev</font> <font color=Red>=</font>+<a name="line-872"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"string"</font><font color=Cyan>,</font> <font color=Cyan>(</font>string<font color=Cyan>`onFail`</font>freetext<font color=Cyan>)</font> <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EVString<font color=Cyan>)</font>+<a name="line-873"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"reference"</font><font color=Cyan>,</font> reference <font color=Cyan>>>=</font> return <font color=Cyan>.</font> EVRef<font color=Cyan>)</font>+<a name="line-874"></a> <font color=Red>]</font>+<a name="line-875"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"looking for entity value,\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-876"></a>+<a name="line-877"></a><a name="attvalue"></a><font color=Blue>attvalue</font> <font color=Red>::</font> XParser AttValue+<a name="line-878"></a><font color=Blue>attvalue</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-879"></a> avs <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font>+<a name="line-880"></a> <font color=Cyan>(</font>many <font color=Cyan>(</font>either freetext reference<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-881"></a> return <font color=Cyan>(</font>AttValue avs<font color=Cyan>)</font>+<a name="line-882"></a>+<a name="line-883"></a><a name="systemliteral"></a><font color=Blue>systemliteral</font> <font color=Red>::</font> XParser SystemLiteral+<a name="line-884"></a><font color=Blue>systemliteral</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-885"></a> s <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext+<a name="line-886"></a> return <font color=Cyan>(</font>SystemLiteral s<font color=Cyan>)</font> <font color=Blue>-- note: refs &...; not permitted</font>+<a name="line-887"></a>+<a name="line-888"></a><a name="pubidliteral"></a><font color=Blue>pubidliteral</font> <font color=Red>::</font> XParser PubidLiteral+<a name="line-889"></a><font color=Blue>pubidliteral</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-890"></a> s <font color=Red><-</font> bracket <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> <font color=Cyan>(</font>tok TokQuote<font color=Cyan>)</font> freetext+<a name="line-891"></a> return <font color=Cyan>(</font>PubidLiteral s<font color=Cyan>)</font> <font color=Blue>-- note: freetext is too liberal here</font>+<a name="line-892"></a>+<a name="line-893"></a><a name="chardata"></a><font color=Blue>-- | Return parsed freetext (i.e. until the next markup)</font>+<a name="line-894"></a><font color=Blue>chardata</font> <font color=Red>::</font> XParser CharData+<a name="line-895"></a><font color=Blue>chardata</font> <font color=Red>=</font> freetext+<a name="line-896"></a>+</pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/Posn.html view
@@ -1,79 +1,86 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>-- | Define a position datatype for giving locations in error messages.</font>-<a name="(line2)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Posn-<a name="(line3)"></a> <font color=Cyan>(</font>-<a name="(line4)"></a> <font color=Blue>-- * Position type</font>-<a name="(line5)"></a> Posn()-<a name="(line6)"></a> <font color=Blue>-- ** Constructors of a new position</font>-<a name="(line7)"></a> <font color=Cyan>,</font> posInNewCxt <font color=Blue>-- :: String -> Maybe Posn -> Posn</font>-<a name="(line8)"></a> <font color=Cyan>,</font> noPos <font color=Blue>-- :: Posn</font>-<a name="(line9)"></a> <font color=Blue>-- ** Strictifier</font>-<a name="(line10)"></a> <font color=Cyan>,</font> forcep-<a name="(line11)"></a> <font color=Blue>-- ** Modifiers</font>-<a name="(line12)"></a> <font color=Cyan>,</font> addcol<font color=Cyan>,</font> newline<font color=Cyan>,</font> tab<font color=Cyan>,</font> white-<a name="(line13)"></a> <font color=Blue>-- ** Accessors</font>-<a name="(line14)"></a> <font color=Cyan>,</font> posnFilename<font color=Cyan>,</font> posnLine<font color=Cyan>,</font> posnColumn-<a name="(line15)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line16)"></a>-<a name="(line17)"></a><font color=Green><u>import</u></font> Char-<a name="(line18)"></a>-<a name="(line19)"></a><a name="Posn"></a><font color=Blue>-- | Source positions contain a filename, line, column, and an</font>-<a name="(line20)"></a><a name="Posn"></a><font color=Blue>-- inclusion point, which is itself another source position,</font>-<a name="(line21)"></a><a name="Posn"></a><font color=Blue>-- recursively.</font>-<a name="(line22)"></a><a name="Posn"></a><font color=Green><u>data</u></font> Posn <font color=Red>=</font> Pn String <font color=Cyan>!</font>Int <font color=Cyan>!</font>Int <font color=Cyan>(</font>Maybe Posn<font color=Cyan>)</font>-<a name="(line23)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>)</font>-<a name="(line24)"></a>-<a name="(line25)"></a><a name="posnFilename"></a>posnFilename <font color=Red>::</font> Posn <font color=Red>-></font> FilePath-<a name="(line26)"></a>posnFilename <font color=Cyan>(</font>Pn f <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> f-<a name="(line27)"></a>-<a name="(line28)"></a><a name="posnLine"></a>posnLine<font color=Cyan>,</font> posnColumn <font color=Red>::</font> Posn <font color=Red>-></font> Int-<a name="(line29)"></a>posnLine <font color=Cyan>(</font>Pn <font color=Green><u>_</u></font> x <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> x-<a name="(line30)"></a><a name="posnColumn"></a>posnColumn <font color=Cyan>(</font>Pn <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> x <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> x-<a name="(line31)"></a>-<a name="(line32)"></a><a name="noPos"></a><font color=Blue>-- | Dummy value for generated data, where a true source position does</font>-<a name="(line33)"></a><font color=Blue>-- not exist.</font>-<a name="(line34)"></a>noPos <font color=Red>::</font> Posn-<a name="(line35)"></a>noPos <font color=Red>=</font> Pn <font color=Magenta>"no recorded position"</font> <font color=Magenta>0</font> <font color=Magenta>0</font> Nothing-<a name="(line36)"></a>-<a name="(line37)"></a><a name="posInNewCxt"></a><font color=Blue>-- | @posInNewCxt name pos@ creates a new source position from an old one.</font>-<a name="(line38)"></a><font color=Blue>-- It is used when opening a new file (e.g. a DTD inclusion), to denote</font>-<a name="(line39)"></a><font color=Blue>-- the start of the file @name@, but retain the stacked information that</font>-<a name="(line40)"></a><font color=Blue>-- it was included from the old @pos@.</font>-<a name="(line41)"></a>posInNewCxt <font color=Red>::</font> String <font color=Red>-></font> Maybe Posn <font color=Red>-></font> Posn-<a name="(line42)"></a>posInNewCxt name pos <font color=Red>=</font> Pn name <font color=Magenta>1</font> <font color=Magenta>1</font> pos-<a name="(line43)"></a>-<a name="(line44)"></a><font color=Green><u>instance</u></font> Show Posn <font color=Green><u>where</u></font>-<a name="(line45)"></a> showsPrec <font color=Green><u>_</u></font> <font color=Cyan>(</font>Pn f l c i<font color=Cyan>)</font> <font color=Red>=</font> showString f <font color=Cyan>.</font>-<a name="(line46)"></a> showString <font color=Magenta>" at line "</font> <font color=Cyan>.</font> shows l <font color=Cyan>.</font>-<a name="(line47)"></a> showString <font color=Magenta>" col "</font> <font color=Cyan>.</font> shows c <font color=Cyan>.</font>-<a name="(line48)"></a> <font color=Cyan>(</font> <font color=Green><u>case</u></font> i <font color=Green><u>of</u></font>-<a name="(line49)"></a> Nothing <font color=Red>-></font> id-<a name="(line50)"></a> Just p <font color=Red>-></font> showString <font color=Magenta>"\n used by "</font> <font color=Cyan>.</font>-<a name="(line51)"></a> shows p <font color=Cyan>)</font>-<a name="(line52)"></a>-<a name="(line53)"></a><a name="forcep"></a><font color=Blue>-- | Just used to strictify the internal values of a position, to avoid</font>-<a name="(line54)"></a><font color=Blue>-- space leaks.</font>-<a name="(line55)"></a>forcep <font color=Red>::</font> Posn <font color=Red>-></font> Int-<a name="(line56)"></a>forcep <font color=Cyan>(</font>Pn <font color=Green><u>_</u></font> n m <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> m <font color=Cyan>`seq`</font> n-<a name="(line57)"></a>-<a name="(line58)"></a><a name="addcol"></a><font color=Blue>-- | Add n character positions to the given position.</font>-<a name="(line59)"></a>addcol <font color=Red>::</font> Int <font color=Red>-></font> Posn <font color=Red>-></font> Posn-<a name="(line60)"></a>addcol n <font color=Cyan>(</font>Pn f r c i<font color=Cyan>)</font> <font color=Red>=</font> Pn f r <font color=Cyan>(</font>c<font color=Cyan>+</font>n<font color=Cyan>)</font> i-<a name="(line61)"></a>-<a name="(line62)"></a><a name="newline"></a><font color=Blue>-- | Add a newline or tab to the given position.</font>-<a name="(line63)"></a>newline<font color=Cyan>,</font> tab <font color=Red>::</font> Posn <font color=Red>-></font> Posn-<a name="(line64)"></a>newline <font color=Cyan>(</font>Pn f r <font color=Green><u>_</u></font> i<font color=Cyan>)</font> <font color=Red>=</font> Pn f <font color=Cyan>(</font>r<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> <font color=Magenta>1</font> i-<a name="(line65)"></a><a name="tab"></a>tab <font color=Cyan>(</font>Pn f r c i<font color=Cyan>)</font> <font color=Red>=</font> Pn f r <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>(</font>c<font color=Cyan>`div`</font><font color=Magenta>8</font><font color=Cyan>)</font><font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font><font color=Cyan>*</font><font color=Magenta>8</font><font color=Cyan>)</font> i-<a name="(line66)"></a>-<a name="(line67)"></a><a name="white"></a><font color=Blue>-- | Add the given whitespace char to the given position.</font>-<a name="(line68)"></a><font color=Blue>-- Precondition: @white c | isSpace c = True@</font>-<a name="(line69)"></a>white <font color=Red>::</font> Char <font color=Red>-></font> Posn <font color=Red>-></font> Posn-<a name="(line70)"></a>white <font color=Magenta>' '</font> <font color=Red>=</font> addcol <font color=Magenta>1</font>-<a name="(line71)"></a>white <font color=Magenta>'\n'</font> <font color=Red>=</font> newline-<a name="(line72)"></a>white <font color=Magenta>'\r'</font> <font color=Red>=</font> id-<a name="(line73)"></a>white <font color=Magenta>'\t'</font> <font color=Red>=</font> tab-<a name="(line74)"></a>white <font color=Magenta>'\xa0'</font> <font color=Red>=</font> addcol <font color=Magenta>1</font>-<a name="(line75)"></a>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/Posn.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>-- | Define a position datatype for giving locations in error messages.</font>+<a name="line-2"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Posn+<a name="line-3"></a> <font color=Cyan>(</font>+<a name="line-4"></a> <font color=Blue>-- * Position type</font>+<a name="line-5"></a> Posn()+<a name="line-6"></a> <font color=Blue>-- ** Constructors of a new position</font>+<a name="line-7"></a> <font color=Cyan>,</font> posInNewCxt <font color=Blue>-- :: String -> Maybe Posn -> Posn</font>+<a name="line-8"></a> <font color=Cyan>,</font> noPos <font color=Blue>-- :: Posn</font>+<a name="line-9"></a> <font color=Blue>-- ** Strictifier</font>+<a name="line-10"></a> <font color=Cyan>,</font> forcep+<a name="line-11"></a> <font color=Blue>-- ** Modifiers</font>+<a name="line-12"></a> <font color=Cyan>,</font> addcol<font color=Cyan>,</font> newline<font color=Cyan>,</font> tab<font color=Cyan>,</font> white+<a name="line-13"></a> <font color=Blue>-- ** Accessors</font>+<a name="line-14"></a> <font color=Cyan>,</font> posnFilename<font color=Cyan>,</font> posnLine<font color=Cyan>,</font> posnColumn+<a name="line-15"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-16"></a>+<a name="line-17"></a><font color=Green><u>import</u></font> Char+<a name="line-18"></a>+<a name="line-19"></a><a name="Posn"></a><font color=Blue>-- | Source positions contain a filename, line, column, and an</font>+<a name="line-20"></a><a name="Posn"></a><font color=Blue>-- inclusion point, which is itself another source position,</font>+<a name="line-21"></a><a name="Posn"></a><font color=Blue>-- recursively.</font>+<a name="line-22"></a><a name="Posn"></a><font color=Green><u>data</u></font> Posn <font color=Red>=</font> Pn String <font color=Cyan>!</font>Int <font color=Cyan>!</font>Int <font color=Cyan>(</font>Maybe Posn<font color=Cyan>)</font>+<a name="line-23"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>)</font>+<a name="line-24"></a>+<a name="line-25"></a><a name="posnFilename"></a><font color=Blue>posnFilename</font> <font color=Red>::</font> Posn <font color=Red>-></font> FilePath+<a name="line-26"></a><font color=Blue>posnFilename</font> <font color=Cyan>(</font>Pn f <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> f+<a name="line-27"></a>+<a name="line-28"></a><a name="posnLine"></a><font color=Blue>posnLine</font><font color=Cyan>,</font> posnColumn <font color=Red>::</font> Posn <font color=Red>-></font> Int+<a name="line-29"></a><font color=Blue>posnLine</font> <font color=Cyan>(</font>Pn <font color=Green><u>_</u></font> x <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> x+<a name="line-30"></a><a name="posnColumn"></a><font color=Blue>posnColumn</font> <font color=Cyan>(</font>Pn <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> x <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> x+<a name="line-31"></a>+<a name="line-32"></a><a name="noPos"></a><font color=Blue>-- | Dummy value for generated data, where a true source position does</font>+<a name="line-33"></a><font color=Blue>-- not exist.</font>+<a name="line-34"></a><font color=Blue>noPos</font> <font color=Red>::</font> Posn+<a name="line-35"></a><font color=Blue>noPos</font> <font color=Red>=</font> Pn <font color=Magenta>"no recorded position"</font> <font color=Magenta>0</font> <font color=Magenta>0</font> Nothing+<a name="line-36"></a>+<a name="line-37"></a><a name="posInNewCxt"></a><font color=Blue>-- | @posInNewCxt name pos@ creates a new source position from an old one.</font>+<a name="line-38"></a><font color=Blue>-- It is used when opening a new file (e.g. a DTD inclusion), to denote</font>+<a name="line-39"></a><font color=Blue>-- the start of the file @name@, but retain the stacked information that</font>+<a name="line-40"></a><font color=Blue>-- it was included from the old @pos@.</font>+<a name="line-41"></a><font color=Blue>posInNewCxt</font> <font color=Red>::</font> String <font color=Red>-></font> Maybe Posn <font color=Red>-></font> Posn+<a name="line-42"></a><font color=Blue>posInNewCxt</font> name pos <font color=Red>=</font> Pn name <font color=Magenta>1</font> <font color=Magenta>1</font> pos+<a name="line-43"></a>+<a name="line-44"></a><font color=Green><u>instance</u></font> Show Posn <font color=Green><u>where</u></font>+<a name="line-45"></a> showsPrec <font color=Green><u>_</u></font> <font color=Cyan>(</font>Pn f l c i<font color=Cyan>)</font> <font color=Red>=</font> showString <font color=Magenta>"file "</font> <font color=Cyan>.</font>+<a name="line-46"></a> showString f <font color=Cyan>.</font>+<a name="line-47"></a> showString <font color=Magenta>" at line "</font> <font color=Cyan>.</font> shows l <font color=Cyan>.</font>+<a name="line-48"></a> showString <font color=Magenta>" col "</font> <font color=Cyan>.</font> shows c <font color=Cyan>.</font>+<a name="line-49"></a> <font color=Cyan>(</font> <font color=Green><u>case</u></font> i <font color=Green><u>of</u></font>+<a name="line-50"></a> Nothing <font color=Red>-></font> id+<a name="line-51"></a> Just p <font color=Red>-></font> showString <font color=Magenta>"\n used by "</font> <font color=Cyan>.</font>+<a name="line-52"></a> shows p <font color=Cyan>)</font>+<a name="line-53"></a>+<a name="line-54"></a><a name="forcep"></a><font color=Blue>-- | Just used to strictify the internal values of a position, to avoid</font>+<a name="line-55"></a><font color=Blue>-- space leaks.</font>+<a name="line-56"></a><font color=Blue>forcep</font> <font color=Red>::</font> Posn <font color=Red>-></font> Int+<a name="line-57"></a><font color=Blue>forcep</font> <font color=Cyan>(</font>Pn <font color=Green><u>_</u></font> n m <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> m <font color=Cyan>`seq`</font> n+<a name="line-58"></a>+<a name="line-59"></a><a name="addcol"></a><font color=Blue>-- | Add n character positions to the given position.</font>+<a name="line-60"></a><font color=Blue>addcol</font> <font color=Red>::</font> Int <font color=Red>-></font> Posn <font color=Red>-></font> Posn+<a name="line-61"></a><font color=Blue>addcol</font> n <font color=Cyan>(</font>Pn f r c i<font color=Cyan>)</font> <font color=Red>=</font> Pn f r <font color=Cyan>(</font>c<font color=Cyan>+</font>n<font color=Cyan>)</font> i+<a name="line-62"></a>+<a name="line-63"></a><a name="newline"></a><font color=Blue>-- | Add a newline or tab to the given position.</font>+<a name="line-64"></a><font color=Blue>newline</font><font color=Cyan>,</font> tab <font color=Red>::</font> Posn <font color=Red>-></font> Posn+<a name="line-65"></a><font color=Blue>newline</font> <font color=Cyan>(</font>Pn f r <font color=Green><u>_</u></font> i<font color=Cyan>)</font> <font color=Red>=</font> Pn f <font color=Cyan>(</font>r<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> <font color=Magenta>1</font> i+<a name="line-66"></a><a name="tab"></a><font color=Blue>tab</font> <font color=Cyan>(</font>Pn f r c i<font color=Cyan>)</font> <font color=Red>=</font> Pn f r <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>(</font>c<font color=Cyan>`div`</font><font color=Magenta>8</font><font color=Cyan>)</font><font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font><font color=Cyan>*</font><font color=Magenta>8</font><font color=Cyan>)</font> i+<a name="line-67"></a>+<a name="line-68"></a><a name="white"></a><font color=Blue>-- | Add the given whitespace char to the given position.</font>+<a name="line-69"></a><font color=Blue>-- Precondition: @white c | isSpace c = True@</font>+<a name="line-70"></a><font color=Blue>white</font> <font color=Red>::</font> Char <font color=Red>-></font> Posn <font color=Red>-></font> Posn+<a name="line-71"></a><font color=Blue>white</font> <font color=Magenta>' '</font> <font color=Red>=</font> addcol <font color=Magenta>1</font>+<a name="line-72"></a><font color=Blue>white</font> <font color=Magenta>'\n'</font> <font color=Red>=</font> newline+<a name="line-73"></a><font color=Blue>white</font> <font color=Magenta>'\r'</font> <font color=Red>=</font> id+<a name="line-74"></a><font color=Blue>white</font> <font color=Magenta>'\t'</font> <font color=Red>=</font> tab+<a name="line-75"></a><font color=Blue>white</font> <font color=Magenta>'\xa0'</font> <font color=Red>=</font> addcol <font color=Magenta>1</font>+<a name="line-76"></a> </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/Pretty.html view
@@ -1,302 +1,308 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>-- | This is a pretty-printer for turning the internal representation</font>-<a name="(line2)"></a><font color=Blue>-- of generic structured XML documents into the Doc type (which can</font>-<a name="(line3)"></a><font color=Blue>-- later be rendered using Text.PrettyPrint.HughesPJ.render).</font>-<a name="(line4)"></a><font color=Blue>-- Essentially there is one pp function for each type in</font>-<a name="(line5)"></a><font color=Blue>-- Text.Xml.HaXml.Types, so you can pretty-print as much or as little</font>-<a name="(line6)"></a><font color=Blue>-- of the document as you wish.</font>-<a name="(line7)"></a>-<a name="(line8)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Pretty-<a name="(line9)"></a> <font color=Cyan>(</font>-<a name="(line10)"></a> <font color=Blue>-- * Pretty-print a whole document</font>-<a name="(line11)"></a> document-<a name="(line12)"></a> <font color=Blue>-- ** Just one content</font>-<a name="(line13)"></a> <font color=Cyan>,</font> content-<a name="(line14)"></a> <font color=Blue>-- ** Just one tagged element</font>-<a name="(line15)"></a> <font color=Cyan>,</font> element-<a name="(line16)"></a> <font color=Blue>-- * Pretty-print just a DTD</font>-<a name="(line17)"></a> <font color=Cyan>,</font> doctypedecl-<a name="(line18)"></a> <font color=Blue>-- ** The prolog</font>-<a name="(line19)"></a> <font color=Cyan>,</font> prolog-<a name="(line20)"></a> <font color=Blue>-- ** A content particle description</font>-<a name="(line21)"></a> <font color=Cyan>,</font> cp-<a name="(line22)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line23)"></a>-<a name="(line24)"></a><font color=Green><u>import</u></font> Prelude hiding <font color=Cyan>(</font>maybe<font color=Cyan>,</font>either<font color=Cyan>)</font>-<a name="(line25)"></a><font color=Green><u>import</u></font> Maybe hiding <font color=Cyan>(</font>maybe<font color=Cyan>)</font>-<a name="(line26)"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>intersperse<font color=Cyan>)</font>-<a name="(line27)"></a><font color=Blue>--import Char (isSpace)</font>-<a name="(line28)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>PrettyPrint<font color=Cyan>.</font>HughesPJ-<a name="(line29)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line30)"></a>-<a name="(line31)"></a><a name="either"></a>either <font color=Red>::</font> <font color=Cyan>(</font>t <font color=Red>-></font> t1<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>t2 <font color=Red>-></font> t1<font color=Cyan>)</font> <font color=Red>-></font> Either t t2 <font color=Red>-></font> t1-<a name="(line32)"></a>either f <font color=Green><u>_</u></font> <font color=Cyan>(</font>Left x<font color=Cyan>)</font> <font color=Red>=</font> f x-<a name="(line33)"></a>either <font color=Green><u>_</u></font> g <font color=Cyan>(</font>Right x<font color=Cyan>)</font> <font color=Red>=</font> g x-<a name="(line34)"></a>-<a name="(line35)"></a><a name="maybe"></a>maybe <font color=Red>::</font> <font color=Cyan>(</font>t <font color=Red>-></font> Doc<font color=Cyan>)</font> <font color=Red>-></font> Maybe t <font color=Red>-></font> Doc-<a name="(line36)"></a>maybe <font color=Green><u>_</u></font> Nothing <font color=Red>=</font> empty-<a name="(line37)"></a>maybe f <font color=Cyan>(</font>Just x<font color=Cyan>)</font> <font color=Red>=</font> f x-<a name="(line38)"></a>-<a name="(line39)"></a><font color=Blue>--peref p = text "%" <> text p <> text ";"</font>-<a name="(line40)"></a>-<a name="(line41)"></a><font color=Blue>----</font>-<a name="(line42)"></a>-<a name="(line43)"></a><a name="document"></a>document <font color=Red>::</font> Document i <font color=Red>-></font> Doc-<a name="(line44)"></a><a name="prolog"></a>prolog <font color=Red>::</font> Prolog <font color=Red>-></font> Doc-<a name="(line45)"></a><a name="xmldecl"></a>xmldecl <font color=Red>::</font> XMLDecl <font color=Red>-></font> Doc-<a name="(line46)"></a><a name="misc"></a>misc <font color=Red>::</font> Misc <font color=Red>-></font> Doc-<a name="(line47)"></a><a name="sddecl"></a>sddecl <font color=Red>::</font> Bool <font color=Red>-></font> Doc-<a name="(line48)"></a>-<a name="(line49)"></a><a name="doctypedecl"></a>doctypedecl <font color=Red>::</font> DocTypeDecl <font color=Red>-></font> Doc-<a name="(line50)"></a><a name="markupdecl"></a>markupdecl <font color=Red>::</font> MarkupDecl <font color=Red>-></font> Doc-<a name="(line51)"></a><a name="extsubset"></a>extsubset <font color=Red>::</font> ExtSubset <font color=Red>-></font> Doc-<a name="(line52)"></a><a name="extsubsetdecl"></a>extsubsetdecl <font color=Red>::</font> ExtSubsetDecl <font color=Red>-></font> Doc-<a name="(line53)"></a><a name="cp"></a>cp <font color=Red>::</font> CP <font color=Red>-></font> Doc-<a name="(line54)"></a>-<a name="(line55)"></a><a name="element"></a>element <font color=Red>::</font> Element i <font color=Red>-></font> Doc-<a name="(line56)"></a><a name="attribute"></a>attribute <font color=Red>::</font> Attribute <font color=Red>-></font> Doc <font color=Cyan>--etc</font>-<a name="(line57)"></a><a name="content"></a>content <font color=Red>::</font> Content i <font color=Red>-></font> Doc-<a name="(line58)"></a>-<a name="(line59)"></a><font color=Blue>----</font>-<a name="(line60)"></a>-<a name="(line61)"></a>document <font color=Cyan>(</font>Document p <font color=Green><u>_</u></font> e m<font color=Cyan>)</font><font color=Red>=</font> prolog p <font color=Cyan>$$</font> element e <font color=Cyan>$$</font> vcat <font color=Cyan>(</font>map misc m<font color=Cyan>)</font>-<a name="(line62)"></a>prolog <font color=Cyan>(</font>Prolog x m1 dtd m2<font color=Cyan>)</font><font color=Red>=</font> maybe xmldecl x <font color=Cyan>$$</font>-<a name="(line63)"></a> vcat <font color=Cyan>(</font>map misc m1<font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line64)"></a> maybe doctypedecl dtd <font color=Cyan>$$</font>-<a name="(line65)"></a> vcat <font color=Cyan>(</font>map misc m2<font color=Cyan>)</font>-<a name="(line66)"></a>xmldecl <font color=Cyan>(</font>XMLDecl v e sd<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?xml version='"</font> <font color=Cyan><></font> text v <font color=Cyan><></font> text <font color=Magenta>"'"</font> <font color=Cyan><+></font>-<a name="(line67)"></a> maybe encodingdecl e <font color=Cyan><+></font>-<a name="(line68)"></a> maybe sddecl sd <font color=Cyan><+></font>-<a name="(line69)"></a> text <font color=Magenta>"?>"</font>-<a name="(line70)"></a>misc <font color=Cyan>(</font>Comment s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!--"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"-->"</font>-<a name="(line71)"></a>misc <font color=Cyan>(</font>PI <font color=Cyan>(</font>n<font color=Cyan>,</font>s<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> text s <font color=Cyan><></font> text <font color=Magenta>"?>"</font>-<a name="(line72)"></a>sddecl sd <font color=Red>|</font> sd <font color=Red>=</font> text <font color=Magenta>"standalone='yes'"</font>-<a name="(line73)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"standalone='no'"</font>-<a name="(line74)"></a>doctypedecl <font color=Cyan>(</font>DTD n eid ds<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>if</u></font> null ds <font color=Green><u>then</u></font>-<a name="(line75)"></a> hd <font color=Cyan><></font> text <font color=Magenta>">"</font>-<a name="(line76)"></a> <font color=Green><u>else</u></font> hd <font color=Cyan><+></font> text <font color=Magenta>" ["</font> <font color=Cyan>$$</font>-<a name="(line77)"></a> vcat <font color=Cyan>(</font>map markupdecl ds<font color=Cyan>)</font> <font color=Cyan>$$</font> text <font color=Magenta>"]>"</font>-<a name="(line78)"></a> <font color=Green><u>where</u></font> hd <font color=Red>=</font> text <font color=Magenta>"<!DOCTYPE"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>-<a name="(line79)"></a> maybe externalid eid-<a name="(line80)"></a>markupdecl <font color=Cyan>(</font>Element e<font color=Cyan>)</font> <font color=Red>=</font> elementdecl e-<a name="(line81)"></a>markupdecl <font color=Cyan>(</font>AttList a<font color=Cyan>)</font> <font color=Red>=</font> attlistdecl a-<a name="(line82)"></a>markupdecl <font color=Cyan>(</font>Entity e<font color=Cyan>)</font> <font color=Red>=</font> entitydecl e-<a name="(line83)"></a>markupdecl <font color=Cyan>(</font>Notation n<font color=Cyan>)</font> <font color=Red>=</font> notationdecl n-<a name="(line84)"></a>markupdecl <font color=Cyan>(</font>MarkupMisc m<font color=Cyan>)</font> <font color=Red>=</font> misc m-<a name="(line85)"></a><font color=Blue>-- markupdecl (MarkupPE p m) = peref p</font>-<a name="(line86)"></a>extsubset <font color=Cyan>(</font>ExtSubset t ds<font color=Cyan>)</font> <font color=Red>=</font> maybe textdecl t <font color=Cyan>$$</font>-<a name="(line87)"></a> vcat <font color=Cyan>(</font>map extsubsetdecl ds<font color=Cyan>)</font>-<a name="(line88)"></a><a name="extmarkupdecl"></a>extmarkupdecl <font color=Cyan>(</font>ExtMarkupDecl m<font color=Cyan>)</font> <font color=Red>=</font> markupdecl m-<a name="(line89)"></a>extsubsetdecl <font color=Cyan>(</font>ExtConditionalSect c<font color=Cyan>)</font> <font color=Red>=</font> conditionalsect c-<a name="(line90)"></a><font color=Blue>-- extsubsetdecl (ExtPEReference p e) = peref p</font>-<a name="(line91)"></a>-<a name="(line92)"></a>element <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font>-<a name="(line93)"></a> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"/>"</font>-<a name="(line94)"></a>element e<font color=Red>@</font><font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font>-<a name="(line95)"></a><font color=Blue>-- | any isText cs = text "<" <> text n <+> fsep (map attribute as) <></font>-<a name="(line96)"></a><font color=Blue>-- text ">" <> hcat (map content cs) <></font>-<a name="(line97)"></a><font color=Blue>-- text "</" <> text n <> text ">"</font>-<a name="(line98)"></a> <font color=Red>|</font> isText <font color=Cyan>(</font>head cs<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line99)"></a> text <font color=Magenta>">"</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>map content cs<font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line100)"></a> text <font color=Magenta>"</"</font> <font color=Cyan><></font> text n <font color=Cyan><></font> text <font color=Magenta>">"</font>-<a name="(line101)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>d<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>=</font> carryelem e empty-<a name="(line102)"></a> <font color=Green><u>in</u></font> d <font color=Cyan><></font> c-<a name="(line103)"></a>-<a name="(line104)"></a><a name="isText"></a>isText <font color=Red>::</font> Content t <font color=Red>-></font> Bool-<a name="(line105)"></a>isText <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True-<a name="(line106)"></a>isText <font color=Cyan>(</font>CRef <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True-<a name="(line107)"></a>isText <font color=Green><u>_</u></font> <font color=Red>=</font> False-<a name="(line108)"></a>-<a name="(line109)"></a><a name="carryelem"></a>carryelem <font color=Red>::</font> Element t <font color=Red>-></font> Doc <font color=Red>-></font> <font color=Cyan>(</font>Doc<font color=Cyan>,</font> Doc<font color=Cyan>)</font>-<a name="(line110)"></a><a name="carrycontent"></a>carrycontent <font color=Red>::</font> Content t <font color=Red>-></font> Doc <font color=Red>-></font> <font color=Cyan>(</font>Doc<font color=Cyan>,</font> Doc<font color=Cyan>)</font>-<a name="(line111)"></a>carryelem <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font> c-<a name="(line112)"></a> <font color=Red>=</font> <font color=Cyan>(</font> c <font color=Cyan><></font>-<a name="(line113)"></a> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font>-<a name="(line114)"></a> <font color=Cyan>,</font> text <font color=Magenta>"/>"</font><font color=Cyan>)</font>-<a name="(line115)"></a>carryelem <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> c-<a name="(line116)"></a><font color=Blue>-- | any isText cs = ( c <> element e, empty)</font>-<a name="(line117)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>cs0<font color=Cyan>,</font>d0<font color=Cyan>)</font> <font color=Red>=</font> carryscan carrycontent cs <font color=Cyan>(</font>text <font color=Magenta>">"</font><font color=Cyan>)</font>-<a name="(line118)"></a> <font color=Green><u>in</u></font>-<a name="(line119)"></a> <font color=Cyan>(</font> c <font color=Cyan><></font>-<a name="(line120)"></a> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line121)"></a> nest <font color=Magenta>2</font> <font color=Cyan>(</font>vcat cs0<font color=Cyan>)</font> <font color=Cyan><></font> <font color=Blue>--- $$</font>-<a name="(line122)"></a> d0 <font color=Cyan><></font> text <font color=Magenta>"</"</font> <font color=Cyan><></font> text n-<a name="(line123)"></a> <font color=Cyan>,</font> text <font color=Magenta>">"</font><font color=Cyan>)</font>-<a name="(line124)"></a>carrycontent <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> carryelem e c-<a name="(line125)"></a>carrycontent <font color=Cyan>(</font>CString False s <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> chardata s<font color=Cyan>,</font> empty<font color=Cyan>)</font>-<a name="(line126)"></a>carrycontent <font color=Cyan>(</font>CString True s <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> cdsect s<font color=Cyan>,</font> empty<font color=Cyan>)</font>-<a name="(line127)"></a>carrycontent <font color=Cyan>(</font>CRef r <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> reference r<font color=Cyan>,</font> empty<font color=Cyan>)</font>-<a name="(line128)"></a>carrycontent <font color=Cyan>(</font>CMisc m <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> misc m<font color=Cyan>,</font> empty<font color=Cyan>)</font>-<a name="(line129)"></a>-<a name="(line130)"></a><a name="carryscan"></a>carryscan <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font>c<font color=Red>-></font><font color=Cyan>(</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-></font> c <font color=Red>-></font> <font color=Cyan>(</font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>,</font>c<font color=Cyan>)</font>-<a name="(line131)"></a>carryscan <font color=Green><u>_</u></font> [] c <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>c<font color=Cyan>)</font>-<a name="(line132)"></a>carryscan f <font color=Cyan>(</font>a<font color=Red><b>:</b></font><font color=Green><u>as</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>b<font color=Cyan>,</font> c0<font color=Cyan>)</font> <font color=Red>=</font> f a c-<a name="(line133)"></a> <font color=Cyan>(</font>bs<font color=Cyan>,</font>c1<font color=Cyan>)</font> <font color=Red>=</font> carryscan f <font color=Green><u>as</u></font> c0-<a name="(line134)"></a> <font color=Green><u>in</u></font> <font color=Cyan>(</font>b<font color=Red><b>:</b></font>bs<font color=Cyan>,</font> c1<font color=Cyan>)</font>-<a name="(line135)"></a>-<a name="(line136)"></a><font color=Blue>--carryelem e@(Elem n as cs) c</font>-<a name="(line137)"></a><font color=Blue>-- | isText (head cs) =</font>-<a name="(line138)"></a><font color=Blue>-- ( start <></font>-<a name="(line139)"></a><font color=Blue>-- text ">" <> hcat (map content cs) <> text "</" <> text n</font>-<a name="(line140)"></a><font color=Blue>-- , text ">")</font>-<a name="(line141)"></a><font color=Blue>-- | otherwise =</font>-<a name="(line142)"></a><font color=Blue>-- let (d,c0) = foldl carrycontent (start, text ">") cs in</font>-<a name="(line143)"></a><font color=Blue>-- ( d <> c0 <> text "</" <> text n</font>-<a name="(line144)"></a><font color=Blue>-- , text ">")</font>-<a name="(line145)"></a><font color=Blue>-- where start = c <> text "<" <> text n <+> fsep (map attribute as)</font>-<a name="(line146)"></a><font color=Blue>--</font>-<a name="(line147)"></a><font color=Blue>--carrycontent (d,c) (CElem e) = let (d',c') = carryelem e c in</font>-<a name="(line148)"></a><font color=Blue>-- (d $$ nest 2 d', c')</font>-<a name="(line149)"></a><font color=Blue>--carrycontent (d,c) (CString _ s) = (d <> c <> chardata s, empty)</font>-<a name="(line150)"></a><font color=Blue>--carrycontent (d,c) (CRef r) = (d <> c <> reference r,empty)</font>-<a name="(line151)"></a><font color=Blue>--carrycontent (d,c) (CMisc m) = (d $$ c <> misc m, empty)</font>-<a name="(line152)"></a>-<a name="(line153)"></a>-<a name="(line154)"></a>attribute <font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><></font> text <font color=Magenta>"="</font> <font color=Cyan><></font> attvalue v-<a name="(line155)"></a>content <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> element e-<a name="(line156)"></a>content <font color=Cyan>(</font>CString False s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> chardata s-<a name="(line157)"></a>content <font color=Cyan>(</font>CString True s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> cdsect s-<a name="(line158)"></a>content <font color=Cyan>(</font>CRef r <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> reference r-<a name="(line159)"></a>content <font color=Cyan>(</font>CMisc m <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> misc m-<a name="(line160)"></a>-<a name="(line161)"></a><a name="elementdecl"></a>elementdecl <font color=Red>::</font> ElementDecl <font color=Red>-></font> Doc-<a name="(line162)"></a>elementdecl <font color=Cyan>(</font>ElementDecl n cs<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ELEMENT"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>-<a name="(line163)"></a> contentspec cs <font color=Cyan><></font> text <font color=Magenta>">"</font>-<a name="(line164)"></a><a name="contentspec"></a>contentspec <font color=Red>::</font> ContentSpec <font color=Red>-></font> Doc-<a name="(line165)"></a>contentspec EMPTY <font color=Red>=</font> text <font color=Magenta>"EMPTY"</font>-<a name="(line166)"></a>contentspec ANY <font color=Red>=</font> text <font color=Magenta>"ANY"</font>-<a name="(line167)"></a>contentspec <font color=Cyan>(</font>Mixed m<font color=Cyan>)</font> <font color=Red>=</font> mixed m-<a name="(line168)"></a>contentspec <font color=Cyan>(</font>ContentSpec c<font color=Cyan>)</font> <font color=Red>=</font> cp c-<a name="(line169)"></a><font color=Blue>--contentspec (ContentPE p cs) = peref p</font>-<a name="(line170)"></a>cp <font color=Cyan>(</font>TagName n m<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>text n<font color=Cyan>)</font> <font color=Cyan><></font> modifier m-<a name="(line171)"></a>cp <font color=Cyan>(</font>Choice cs m<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map cp cs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line172)"></a> modifier m-<a name="(line173)"></a>cp <font color=Cyan>(</font>Seq cs m<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>","</font><font color=Cyan>)</font> <font color=Cyan>(</font>map cp cs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line174)"></a> modifier m-<a name="(line175)"></a><a name="modifier"></a><font color=Blue>--cp (CPPE p c) = peref p</font>-<a name="(line176)"></a>modifier <font color=Red>::</font> Modifier <font color=Red>-></font> Doc-<a name="(line177)"></a>modifier None <font color=Red>=</font> empty-<a name="(line178)"></a>modifier Query <font color=Red>=</font> text <font color=Magenta>"?"</font>-<a name="(line179)"></a>modifier Star <font color=Red>=</font> text <font color=Magenta>"*"</font>-<a name="(line180)"></a>modifier Plus <font color=Red>=</font> text <font color=Magenta>"+"</font>-<a name="(line181)"></a><a name="mixed"></a>mixed <font color=Red>::</font> Mixed <font color=Red>-></font> Doc-<a name="(line182)"></a>mixed PCDATA <font color=Red>=</font> text <font color=Magenta>"(#PCDATA)"</font>-<a name="(line183)"></a>mixed <font color=Cyan>(</font>PCDATAplus ns<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"(#PCDATA |"</font> <font color=Cyan><+></font>-<a name="(line184)"></a> hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map text ns<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line185)"></a> text <font color=Magenta>")*"</font>-<a name="(line186)"></a>-<a name="(line187)"></a><a name="attlistdecl"></a>attlistdecl <font color=Red>::</font> AttListDecl <font color=Red>-></font> Doc-<a name="(line188)"></a>attlistdecl <font color=Cyan>(</font>AttListDecl n ds<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ATTLIST"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>-<a name="(line189)"></a> fsep <font color=Cyan>(</font>map attdef ds<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>">"</font>-<a name="(line190)"></a><a name="attdef"></a>attdef <font color=Red>::</font> AttDef <font color=Red>-></font> Doc-<a name="(line191)"></a>attdef <font color=Cyan>(</font>AttDef n t d<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><+></font> atttype t <font color=Cyan><+></font> defaultdecl d-<a name="(line192)"></a><a name="atttype"></a>atttype <font color=Red>::</font> AttType <font color=Red>-></font> Doc-<a name="(line193)"></a>atttype StringType <font color=Red>=</font> text <font color=Magenta>"CDATA"</font>-<a name="(line194)"></a>atttype <font color=Cyan>(</font>TokenizedType t<font color=Cyan>)</font> <font color=Red>=</font> tokenizedtype t-<a name="(line195)"></a>atttype <font color=Cyan>(</font>EnumeratedType t<font color=Cyan>)</font> <font color=Red>=</font> enumeratedtype t-<a name="(line196)"></a><a name="tokenizedtype"></a>tokenizedtype <font color=Red>::</font> TokenizedType <font color=Red>-></font> Doc-<a name="(line197)"></a>tokenizedtype ID <font color=Red>=</font> text <font color=Magenta>"ID"</font>-<a name="(line198)"></a>tokenizedtype IDREF <font color=Red>=</font> text <font color=Magenta>"IDREF"</font>-<a name="(line199)"></a>tokenizedtype IDREFS <font color=Red>=</font> text <font color=Magenta>"IDREFS"</font>-<a name="(line200)"></a>tokenizedtype ENTITY <font color=Red>=</font> text <font color=Magenta>"ENTITY"</font>-<a name="(line201)"></a>tokenizedtype ENTITIES <font color=Red>=</font> text <font color=Magenta>"ENTITIES"</font>-<a name="(line202)"></a>tokenizedtype NMTOKEN <font color=Red>=</font> text <font color=Magenta>"NMTOKEN"</font>-<a name="(line203)"></a>tokenizedtype NMTOKENS <font color=Red>=</font> text <font color=Magenta>"NMTOKENS"</font>-<a name="(line204)"></a><a name="enumeratedtype"></a>enumeratedtype <font color=Red>::</font> EnumeratedType <font color=Red>-></font> Doc-<a name="(line205)"></a>enumeratedtype <font color=Cyan>(</font>NotationType n<font color=Cyan>)</font><font color=Red>=</font> notationtype n-<a name="(line206)"></a>enumeratedtype <font color=Cyan>(</font>Enumeration e<font color=Cyan>)</font> <font color=Red>=</font> enumeration e-<a name="(line207)"></a><a name="notationtype"></a>notationtype <font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-></font> Doc-<a name="(line208)"></a>notationtype ns <font color=Red>=</font> text <font color=Magenta>"NOTATION"</font> <font color=Cyan><+></font>-<a name="(line209)"></a> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map text ns<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line210)"></a><a name="enumeration"></a>enumeration <font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-></font> Doc-<a name="(line211)"></a>enumeration ns <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map nmtoken ns<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line212)"></a><a name="defaultdecl"></a>defaultdecl <font color=Red>::</font> DefaultDecl <font color=Red>-></font> Doc-<a name="(line213)"></a>defaultdecl REQUIRED <font color=Red>=</font> text <font color=Magenta>"#REQUIRED"</font>-<a name="(line214)"></a>defaultdecl IMPLIED <font color=Red>=</font> text <font color=Magenta>"#IMPLIED"</font>-<a name="(line215)"></a>defaultdecl <font color=Cyan>(</font>DefaultTo a f<font color=Cyan>)</font> <font color=Red>=</font> maybe <font color=Cyan>(</font>const <font color=Cyan>(</font>text <font color=Magenta>"#FIXED"</font><font color=Cyan>)</font><font color=Cyan>)</font> f <font color=Cyan><+></font> attvalue a-<a name="(line216)"></a><a name="conditionalsect"></a>conditionalsect <font color=Cyan>(</font>IncludeSect i<font color=Cyan>)</font><font color=Red>=</font> text <font color=Magenta>"<![INCLUDE ["</font> <font color=Cyan><+></font>-<a name="(line217)"></a> vcat <font color=Cyan>(</font>map extsubsetdecl i<font color=Cyan>)</font> <font color=Cyan><+></font> text <font color=Magenta>"]]>"</font>-<a name="(line218)"></a>conditionalsect <font color=Cyan>(</font>IgnoreSect i<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<![IGNORE ["</font> <font color=Cyan><+></font>-<a name="(line219)"></a> fsep <font color=Cyan>(</font>map ignoresectcontents i<font color=Cyan>)</font> <font color=Cyan><+></font> text <font color=Magenta>"]]>"</font>-<a name="(line220)"></a><a name="ignore"></a>ignore <font color=Cyan>(</font>Ignore<font color=Cyan>)</font> <font color=Red>=</font> empty-<a name="(line221)"></a><a name="ignoresectcontents"></a>ignoresectcontents <font color=Cyan>(</font>IgnoreSectContents i is<font color=Cyan>)</font>-<a name="(line222)"></a> <font color=Red>=</font> ignore i <font color=Cyan><+></font> vcat <font color=Cyan>(</font>map internal is<font color=Cyan>)</font>-<a name="(line223)"></a> <font color=Green><u>where</u></font> internal <font color=Cyan>(</font>ics<font color=Cyan>,</font>i<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<![["</font> <font color=Cyan><+></font>-<a name="(line224)"></a> ignoresectcontents ics <font color=Cyan><+></font>-<a name="(line225)"></a> text <font color=Magenta>"]]>"</font> <font color=Cyan><+></font> ignore i-<a name="(line226)"></a><a name="reference"></a>reference <font color=Red>::</font> Reference <font color=Red>-></font> Doc-<a name="(line227)"></a>reference <font color=Cyan>(</font>RefEntity er<font color=Cyan>)</font> <font color=Red>=</font> entityref er-<a name="(line228)"></a>reference <font color=Cyan>(</font>RefChar cr<font color=Cyan>)</font> <font color=Red>=</font> charref cr-<a name="(line229)"></a><a name="entityref"></a>entityref <font color=Red>::</font> String <font color=Red>-></font> Doc-<a name="(line230)"></a>entityref n <font color=Red>=</font> text <font color=Magenta>"&"</font> <font color=Cyan><></font> text n <font color=Cyan><></font> text <font color=Magenta>";"</font>-<a name="(line231)"></a><a name="charref"></a>charref <font color=Red>::</font> <font color=Cyan>(</font>Show a<font color=Cyan>)</font> <font color=Red>=></font> a <font color=Red>-></font> Doc-<a name="(line232)"></a>charref c <font color=Red>=</font> text <font color=Magenta>"&#"</font> <font color=Cyan><></font> text <font color=Cyan>(</font>show c<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>";"</font>-<a name="(line233)"></a><a name="entitydecl"></a>entitydecl <font color=Red>::</font> EntityDecl <font color=Red>-></font> Doc-<a name="(line234)"></a>entitydecl <font color=Cyan>(</font>EntityGEDecl d<font color=Cyan>)</font> <font color=Red>=</font> gedecl d-<a name="(line235)"></a>entitydecl <font color=Cyan>(</font>EntityPEDecl d<font color=Cyan>)</font> <font color=Red>=</font> pedecl d-<a name="(line236)"></a><a name="gedecl"></a>gedecl <font color=Red>::</font> GEDecl <font color=Red>-></font> Doc-<a name="(line237)"></a>gedecl <font color=Cyan>(</font>GEDecl n ed<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ENTITY"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font> entitydef ed <font color=Cyan><></font>-<a name="(line238)"></a> text <font color=Magenta>">"</font>-<a name="(line239)"></a><a name="pedecl"></a>pedecl <font color=Red>::</font> PEDecl <font color=Red>-></font> Doc-<a name="(line240)"></a>pedecl <font color=Cyan>(</font>PEDecl n pd<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ENTITY %"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font> pedef pd <font color=Cyan><></font>-<a name="(line241)"></a> text <font color=Magenta>">"</font>-<a name="(line242)"></a><a name="entitydef"></a>entitydef <font color=Red>::</font> EntityDef <font color=Red>-></font> Doc-<a name="(line243)"></a>entitydef <font color=Cyan>(</font>DefEntityValue ew<font color=Cyan>)</font> <font color=Red>=</font> entityvalue ew-<a name="(line244)"></a>entitydef <font color=Cyan>(</font>DefExternalID i nd<font color=Cyan>)</font> <font color=Red>=</font> externalid i <font color=Cyan><+></font> maybe ndatadecl nd-<a name="(line245)"></a><a name="pedef"></a>pedef <font color=Red>::</font> PEDef <font color=Red>-></font> Doc-<a name="(line246)"></a>pedef <font color=Cyan>(</font>PEDefEntityValue ew<font color=Cyan>)</font> <font color=Red>=</font> entityvalue ew-<a name="(line247)"></a>pedef <font color=Cyan>(</font>PEDefExternalID eid<font color=Cyan>)</font> <font color=Red>=</font> externalid eid-<a name="(line248)"></a><a name="externalid"></a>externalid <font color=Red>::</font> ExternalID <font color=Red>-></font> Doc-<a name="(line249)"></a>externalid <font color=Cyan>(</font>SYSTEM sl<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"SYSTEM"</font> <font color=Cyan><+></font> systemliteral sl-<a name="(line250)"></a>externalid <font color=Cyan>(</font>PUBLIC i sl<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"PUBLIC"</font> <font color=Cyan><+></font> pubidliteral i <font color=Cyan><+></font>-<a name="(line251)"></a> systemliteral sl-<a name="(line252)"></a><a name="ndatadecl"></a>ndatadecl <font color=Red>::</font> NDataDecl <font color=Red>-></font> Doc-<a name="(line253)"></a>ndatadecl <font color=Cyan>(</font>NDATA n<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"NDATA"</font> <font color=Cyan><+></font> text n-<a name="(line254)"></a><a name="textdecl"></a>textdecl <font color=Cyan>(</font>TextDecl vi ed<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?xml"</font> <font color=Cyan><+></font> maybe text vi <font color=Cyan><+></font>-<a name="(line255)"></a> encodingdecl ed <font color=Cyan><+></font> text <font color=Magenta>"?>"</font>-<a name="(line256)"></a><a name="extparsedent"></a>extparsedent <font color=Cyan>(</font>ExtParsedEnt t c<font color=Cyan>)</font><font color=Red>=</font> maybe textdecl t <font color=Cyan><+></font> content c-<a name="(line257)"></a><a name="extpe"></a>extpe <font color=Cyan>(</font>ExtPE t esd<font color=Cyan>)</font> <font color=Red>=</font> maybe textdecl t <font color=Cyan><+></font>-<a name="(line258)"></a> vcat <font color=Cyan>(</font>map extsubsetdecl esd<font color=Cyan>)</font>-<a name="(line259)"></a><a name="notationdecl"></a>notationdecl <font color=Red>::</font> NotationDecl <font color=Red>-></font> Doc-<a name="(line260)"></a>notationdecl <font color=Cyan>(</font>NOTATION n e<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!NOTATION"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>-<a name="(line261)"></a> either externalid publicid e <font color=Cyan><></font>-<a name="(line262)"></a> text <font color=Magenta>">"</font>-<a name="(line263)"></a><a name="publicid"></a>publicid <font color=Red>::</font> PublicID <font color=Red>-></font> Doc-<a name="(line264)"></a>publicid <font color=Cyan>(</font>PUBLICID p<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"PUBLIC"</font> <font color=Cyan><+></font> pubidliteral p-<a name="(line265)"></a><a name="encodingdecl"></a>encodingdecl <font color=Red>::</font> EncodingDecl <font color=Red>-></font> Doc-<a name="(line266)"></a>encodingdecl <font color=Cyan>(</font>EncodingDecl s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"encoding='"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>-<a name="(line267)"></a><a name="nmtoken"></a>nmtoken <font color=Red>::</font> String <font color=Red>-></font> Doc-<a name="(line268)"></a>nmtoken s <font color=Red>=</font> text s-<a name="(line269)"></a><a name="attvalue"></a>attvalue <font color=Red>::</font> AttValue <font color=Red>-></font> Doc-<a name="(line270)"></a>attvalue <font color=Cyan>(</font>AttValue esr<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font>-<a name="(line271)"></a> hcat <font color=Cyan>(</font>map <font color=Cyan>(</font>either text reference<font color=Cyan>)</font> esr<font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line272)"></a> text <font color=Magenta>"\""</font>-<a name="(line273)"></a><a name="entityvalue"></a>entityvalue <font color=Red>::</font> EntityValue <font color=Red>-></font> Doc-<a name="(line274)"></a>entityvalue <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font>-<a name="(line275)"></a> <font color=Red>|</font> containsDoubleQuote evs <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>map ev evs<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"'"</font>-<a name="(line276)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>map ev evs<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"\""</font>-<a name="(line277)"></a><a name="ev"></a>ev <font color=Red>::</font> EV <font color=Red>-></font> Doc-<a name="(line278)"></a>ev <font color=Cyan>(</font>EVString s<font color=Cyan>)</font> <font color=Red>=</font> text s-<a name="(line279)"></a><font color=Blue>--ev (EVPERef p e) = peref p</font>-<a name="(line280)"></a>ev <font color=Cyan>(</font>EVRef r<font color=Cyan>)</font> <font color=Red>=</font> reference r-<a name="(line281)"></a><a name="pubidliteral"></a>pubidliteral <font color=Red>::</font> PubidLiteral <font color=Red>-></font> Doc-<a name="(line282)"></a>pubidliteral <font color=Cyan>(</font>PubidLiteral s<font color=Cyan>)</font>-<a name="(line283)"></a> <font color=Red>|</font> <font color=Magenta>'"'</font> <font color=Cyan>`elem`</font> s <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>-<a name="(line284)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"\""</font>-<a name="(line285)"></a><a name="systemliteral"></a>systemliteral <font color=Red>::</font> SystemLiteral <font color=Red>-></font> Doc-<a name="(line286)"></a>systemliteral <font color=Cyan>(</font>SystemLiteral s<font color=Cyan>)</font>-<a name="(line287)"></a> <font color=Red>|</font> <font color=Magenta>'"'</font> <font color=Cyan>`elem`</font> s <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>-<a name="(line288)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"\""</font>-<a name="(line289)"></a><a name="chardata"></a>chardata <font color=Red>::</font> String <font color=Red>-></font> Doc-<a name="(line290)"></a>chardata s <font color=Red>=</font> <font color=Blue>{-if all isSpace s then empty else-}</font> text s-<a name="(line291)"></a><a name="cdsect"></a>cdsect <font color=Red>::</font> String <font color=Red>-></font> Doc-<a name="(line292)"></a>cdsect c <font color=Red>=</font> text <font color=Magenta>"<![CDATA["</font> <font color=Cyan><></font> chardata c <font color=Cyan><></font> text <font color=Magenta>"]]>"</font>-<a name="(line293)"></a>-<a name="(line294)"></a><a name="containsDoubleQuote"></a><font color=Blue>----</font>-<a name="(line295)"></a>containsDoubleQuote <font color=Red>::</font> <font color=Red>[</font>EV<font color=Red>]</font> <font color=Red>-></font> Bool-<a name="(line296)"></a>containsDoubleQuote evs <font color=Red>=</font> any csq evs-<a name="(line297)"></a> <font color=Green><u>where</u></font> csq <font color=Cyan>(</font>EVString s<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>'"'</font> <font color=Cyan>`elem`</font> s-<a name="(line298)"></a> csq <font color=Green><u>_</u></font> <font color=Red>=</font> False+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/Pretty.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>-- | This is a pretty-printer for turning the internal representation</font>+<a name="line-2"></a><font color=Blue>-- of generic structured XML documents into the Doc type (which can</font>+<a name="line-3"></a><font color=Blue>-- later be rendered using Text.PrettyPrint.HughesPJ.render).</font>+<a name="line-4"></a><font color=Blue>-- Essentially there is one pp function for each type in</font>+<a name="line-5"></a><font color=Blue>-- Text.Xml.HaXml.Types, so you can pretty-print as much or as little</font>+<a name="line-6"></a><font color=Blue>-- of the document as you wish.</font>+<a name="line-7"></a>+<a name="line-8"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Pretty+<a name="line-9"></a> <font color=Cyan>(</font>+<a name="line-10"></a> <font color=Blue>-- * Pretty-print a whole document</font>+<a name="line-11"></a> document+<a name="line-12"></a> <font color=Blue>-- ** Just one content</font>+<a name="line-13"></a> <font color=Cyan>,</font> content+<a name="line-14"></a> <font color=Blue>-- ** Just one tagged element</font>+<a name="line-15"></a> <font color=Cyan>,</font> element+<a name="line-16"></a> <font color=Blue>-- * Pretty-print just a DTD</font>+<a name="line-17"></a> <font color=Cyan>,</font> doctypedecl+<a name="line-18"></a> <font color=Blue>-- ** The prolog</font>+<a name="line-19"></a> <font color=Cyan>,</font> prolog+<a name="line-20"></a> <font color=Blue>-- ** A content particle description</font>+<a name="line-21"></a> <font color=Cyan>,</font> cp+<a name="line-22"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-23"></a>+<a name="line-24"></a><font color=Green><u>import</u></font> Prelude hiding <font color=Cyan>(</font>maybe<font color=Cyan>,</font>either<font color=Cyan>)</font>+<a name="line-25"></a><font color=Green><u>import</u></font> Maybe hiding <font color=Cyan>(</font>maybe<font color=Cyan>)</font>+<a name="line-26"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>intersperse<font color=Cyan>)</font>+<a name="line-27"></a><font color=Blue>--import Char (isSpace)</font>+<a name="line-28"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>PrettyPrint<font color=Cyan>.</font>HughesPJ+<a name="line-29"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-30"></a>+<a name="line-31"></a><a name="either"></a><font color=Blue>either</font> <font color=Red>::</font> <font color=Cyan>(</font>t <font color=Red>-></font> t1<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>t2 <font color=Red>-></font> t1<font color=Cyan>)</font> <font color=Red>-></font> Either t t2 <font color=Red>-></font> t1+<a name="line-32"></a><font color=Blue>either</font> f <font color=Green><u>_</u></font> <font color=Cyan>(</font>Left x<font color=Cyan>)</font> <font color=Red>=</font> f x+<a name="line-33"></a><font color=Blue>either</font> <font color=Green><u>_</u></font> g <font color=Cyan>(</font>Right x<font color=Cyan>)</font> <font color=Red>=</font> g x+<a name="line-34"></a>+<a name="line-35"></a><a name="maybe"></a><font color=Blue>maybe</font> <font color=Red>::</font> <font color=Cyan>(</font>t <font color=Red>-></font> Doc<font color=Cyan>)</font> <font color=Red>-></font> Maybe t <font color=Red>-></font> Doc+<a name="line-36"></a><font color=Blue>maybe</font> <font color=Green><u>_</u></font> Nothing <font color=Red>=</font> empty+<a name="line-37"></a><font color=Blue>maybe</font> f <font color=Cyan>(</font>Just x<font color=Cyan>)</font> <font color=Red>=</font> f x+<a name="line-38"></a>+<a name="line-39"></a><font color=Blue>--peref p = text "%" <> text p <> text ";"</font>+<a name="line-40"></a>+<a name="line-41"></a><font color=Blue>----</font>+<a name="line-42"></a>+<a name="line-43"></a><a name="document"></a><font color=Blue>document</font> <font color=Red>::</font> Document i <font color=Red>-></font> Doc+<a name="line-44"></a><a name="prolog"></a><font color=Blue>prolog</font> <font color=Red>::</font> Prolog <font color=Red>-></font> Doc+<a name="line-45"></a><a name="xmldecl"></a><font color=Blue>xmldecl</font> <font color=Red>::</font> XMLDecl <font color=Red>-></font> Doc+<a name="line-46"></a><a name="misc"></a><font color=Blue>misc</font> <font color=Red>::</font> Misc <font color=Red>-></font> Doc+<a name="line-47"></a><a name="sddecl"></a><font color=Blue>sddecl</font> <font color=Red>::</font> Bool <font color=Red>-></font> Doc+<a name="line-48"></a>+<a name="line-49"></a><a name="doctypedecl"></a><font color=Blue>doctypedecl</font> <font color=Red>::</font> DocTypeDecl <font color=Red>-></font> Doc+<a name="line-50"></a><a name="markupdecl"></a><font color=Blue>markupdecl</font> <font color=Red>::</font> MarkupDecl <font color=Red>-></font> Doc+<a name="line-51"></a><a name="extsubset"></a><font color=Blue>extsubset</font> <font color=Red>::</font> ExtSubset <font color=Red>-></font> Doc+<a name="line-52"></a><a name="extsubsetdecl"></a><font color=Blue>extsubsetdecl</font> <font color=Red>::</font> ExtSubsetDecl <font color=Red>-></font> Doc+<a name="line-53"></a><a name="cp"></a><font color=Blue>cp</font> <font color=Red>::</font> CP <font color=Red>-></font> Doc+<a name="line-54"></a>+<a name="line-55"></a><a name="element"></a><font color=Blue>element</font> <font color=Red>::</font> Element i <font color=Red>-></font> Doc+<a name="line-56"></a><a name="attribute"></a><font color=Blue>attribute</font> <font color=Red>::</font> Attribute <font color=Red>-></font> Doc <font color=Cyan>--etc</font>+<a name="line-57"></a><a name="content"></a><font color=Blue>content</font> <font color=Red>::</font> Content i <font color=Red>-></font> Doc+<a name="line-58"></a>+<a name="line-59"></a><font color=Blue>----</font>+<a name="line-60"></a>+<a name="line-61"></a><font color=Blue>document</font> <font color=Cyan>(</font>Document p <font color=Green><u>_</u></font> e m<font color=Cyan>)</font><font color=Red>=</font> prolog p <font color=Cyan>$$</font> element e <font color=Cyan>$$</font> vcat <font color=Cyan>(</font>map misc m<font color=Cyan>)</font>+<a name="line-62"></a><font color=Blue>prolog</font> <font color=Cyan>(</font>Prolog x m1 dtd m2<font color=Cyan>)</font><font color=Red>=</font> maybe xmldecl x <font color=Cyan>$$</font>+<a name="line-63"></a> vcat <font color=Cyan>(</font>map misc m1<font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-64"></a> maybe doctypedecl dtd <font color=Cyan>$$</font>+<a name="line-65"></a> vcat <font color=Cyan>(</font>map misc m2<font color=Cyan>)</font>+<a name="line-66"></a><font color=Blue>xmldecl</font> <font color=Cyan>(</font>XMLDecl v e sd<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?xml version='"</font> <font color=Cyan><></font> text v <font color=Cyan><></font> text <font color=Magenta>"'"</font> <font color=Cyan><+></font>+<a name="line-67"></a> maybe encodingdecl e <font color=Cyan><+></font>+<a name="line-68"></a> maybe sddecl sd <font color=Cyan><+></font>+<a name="line-69"></a> text <font color=Magenta>"?>"</font>+<a name="line-70"></a><font color=Blue>misc</font> <font color=Cyan>(</font>Comment s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!--"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"-->"</font>+<a name="line-71"></a><font color=Blue>misc</font> <font color=Cyan>(</font>PI <font color=Cyan>(</font>n<font color=Cyan>,</font>s<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> text s <font color=Cyan><></font> text <font color=Magenta>"?>"</font>+<a name="line-72"></a><font color=Blue>sddecl</font> sd <font color=Red>|</font> sd <font color=Red>=</font> text <font color=Magenta>"standalone='yes'"</font>+<a name="line-73"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"standalone='no'"</font>+<a name="line-74"></a><font color=Blue>doctypedecl</font> <font color=Cyan>(</font>DTD n eid ds<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>if</u></font> null ds <font color=Green><u>then</u></font>+<a name="line-75"></a> hd <font color=Cyan><></font> text <font color=Magenta>">"</font>+<a name="line-76"></a> <font color=Green><u>else</u></font> hd <font color=Cyan><+></font> text <font color=Magenta>" ["</font> <font color=Cyan>$$</font>+<a name="line-77"></a> vcat <font color=Cyan>(</font>map markupdecl ds<font color=Cyan>)</font> <font color=Cyan>$$</font> text <font color=Magenta>"]>"</font>+<a name="line-78"></a> <font color=Green><u>where</u></font> hd <font color=Red>=</font> text <font color=Magenta>"<!DOCTYPE"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>+<a name="line-79"></a> maybe externalid eid+<a name="line-80"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>Element e<font color=Cyan>)</font> <font color=Red>=</font> elementdecl e+<a name="line-81"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>AttList a<font color=Cyan>)</font> <font color=Red>=</font> attlistdecl a+<a name="line-82"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>Entity e<font color=Cyan>)</font> <font color=Red>=</font> entitydecl e+<a name="line-83"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>Notation n<font color=Cyan>)</font> <font color=Red>=</font> notationdecl n+<a name="line-84"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>MarkupMisc m<font color=Cyan>)</font> <font color=Red>=</font> misc m+<a name="line-85"></a><font color=Blue>-- markupdecl (MarkupPE p m) = peref p</font>+<a name="line-86"></a><font color=Blue>extsubset</font> <font color=Cyan>(</font>ExtSubset t ds<font color=Cyan>)</font> <font color=Red>=</font> maybe textdecl t <font color=Cyan>$$</font>+<a name="line-87"></a> vcat <font color=Cyan>(</font>map extsubsetdecl ds<font color=Cyan>)</font>+<a name="line-88"></a><a name="extmarkupdecl"></a><font color=Blue>extmarkupdecl</font> <font color=Cyan>(</font>ExtMarkupDecl m<font color=Cyan>)</font> <font color=Red>=</font> markupdecl m+<a name="line-89"></a><font color=Blue>extsubsetdecl</font> <font color=Cyan>(</font>ExtConditionalSect c<font color=Cyan>)</font> <font color=Red>=</font> conditionalsect c+<a name="line-90"></a><font color=Blue>-- extsubsetdecl (ExtPEReference p e) = peref p</font>+<a name="line-91"></a>+<a name="line-92"></a><font color=Blue>element</font> <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font>+<a name="line-93"></a> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"/>"</font>+<a name="line-94"></a><font color=Blue>element</font> e<font color=Red>@</font><font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font>+<a name="line-95"></a><font color=Blue>-- | any isText cs = text "<" <> text n <+> fsep (map attribute as) <></font>+<a name="line-96"></a><font color=Blue>-- text ">" <> hcat (map content cs) <></font>+<a name="line-97"></a><font color=Blue>-- text "</" <> text n <> text ">"</font>+<a name="line-98"></a> <font color=Red>|</font> isText <font color=Cyan>(</font>head cs<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-99"></a> text <font color=Magenta>">"</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>map content cs<font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-100"></a> text <font color=Magenta>"</"</font> <font color=Cyan><></font> text n <font color=Cyan><></font> text <font color=Magenta>">"</font>+<a name="line-101"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>d<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>=</font> carryelem e empty+<a name="line-102"></a> <font color=Green><u>in</u></font> d <font color=Cyan><></font> c+<a name="line-103"></a>+<a name="line-104"></a><a name="isText"></a><font color=Blue>isText</font> <font color=Red>::</font> Content t <font color=Red>-></font> Bool+<a name="line-105"></a><font color=Blue>isText</font> <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True+<a name="line-106"></a><font color=Blue>isText</font> <font color=Cyan>(</font>CRef <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True+<a name="line-107"></a><font color=Blue>isText</font> <font color=Green><u>_</u></font> <font color=Red>=</font> False+<a name="line-108"></a>+<a name="line-109"></a><a name="carryelem"></a><font color=Blue>carryelem</font> <font color=Red>::</font> Element t <font color=Red>-></font> Doc <font color=Red>-></font> <font color=Cyan>(</font>Doc<font color=Cyan>,</font> Doc<font color=Cyan>)</font>+<a name="line-110"></a><a name="carrycontent"></a><font color=Blue>carrycontent</font> <font color=Red>::</font> Content t <font color=Red>-></font> Doc <font color=Red>-></font> <font color=Cyan>(</font>Doc<font color=Cyan>,</font> Doc<font color=Cyan>)</font>+<a name="line-111"></a><font color=Blue>carryelem</font> <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font> c+<a name="line-112"></a> <font color=Red>=</font> <font color=Cyan>(</font> c <font color=Cyan><></font>+<a name="line-113"></a> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font>+<a name="line-114"></a> <font color=Cyan>,</font> text <font color=Magenta>"/>"</font><font color=Cyan>)</font>+<a name="line-115"></a><font color=Blue>carryelem</font> <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> c+<a name="line-116"></a><font color=Blue>-- | any isText cs = ( c <> element e, empty)</font>+<a name="line-117"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>cs0<font color=Cyan>,</font>d0<font color=Cyan>)</font> <font color=Red>=</font> carryscan carrycontent cs <font color=Cyan>(</font>text <font color=Magenta>">"</font><font color=Cyan>)</font>+<a name="line-118"></a> <font color=Green><u>in</u></font>+<a name="line-119"></a> <font color=Cyan>(</font> c <font color=Cyan><></font>+<a name="line-120"></a> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-121"></a> nest <font color=Magenta>2</font> <font color=Cyan>(</font>vcat cs0<font color=Cyan>)</font> <font color=Cyan><></font> <font color=Blue>--- $$</font>+<a name="line-122"></a> d0 <font color=Cyan><></font> text <font color=Magenta>"</"</font> <font color=Cyan><></font> text n+<a name="line-123"></a> <font color=Cyan>,</font> text <font color=Magenta>">"</font><font color=Cyan>)</font>+<a name="line-124"></a><font color=Blue>carrycontent</font> <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> carryelem e c+<a name="line-125"></a><font color=Blue>carrycontent</font> <font color=Cyan>(</font>CString False s <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> chardata s<font color=Cyan>,</font> empty<font color=Cyan>)</font>+<a name="line-126"></a><font color=Blue>carrycontent</font> <font color=Cyan>(</font>CString True s <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> cdsect s<font color=Cyan>,</font> empty<font color=Cyan>)</font>+<a name="line-127"></a><font color=Blue>carrycontent</font> <font color=Cyan>(</font>CRef r <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> reference r<font color=Cyan>,</font> empty<font color=Cyan>)</font>+<a name="line-128"></a><font color=Blue>carrycontent</font> <font color=Cyan>(</font>CMisc m <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> misc m<font color=Cyan>,</font> empty<font color=Cyan>)</font>+<a name="line-129"></a>+<a name="line-130"></a><a name="carryscan"></a><font color=Blue>carryscan</font> <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font>c<font color=Red>-></font><font color=Cyan>(</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-></font> c <font color=Red>-></font> <font color=Cyan>(</font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>,</font>c<font color=Cyan>)</font>+<a name="line-131"></a><font color=Blue>carryscan</font> <font color=Green><u>_</u></font> [] c <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>c<font color=Cyan>)</font>+<a name="line-132"></a><font color=Blue>carryscan</font> f <font color=Cyan>(</font>a<font color=Red><b>:</b></font><font color=Green><u>as</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>b<font color=Cyan>,</font> c0<font color=Cyan>)</font> <font color=Red>=</font> f a c+<a name="line-133"></a> <font color=Cyan>(</font>bs<font color=Cyan>,</font>c1<font color=Cyan>)</font> <font color=Red>=</font> carryscan f <font color=Green><u>as</u></font> c0+<a name="line-134"></a> <font color=Green><u>in</u></font> <font color=Cyan>(</font>b<font color=Red><b>:</b></font>bs<font color=Cyan>,</font> c1<font color=Cyan>)</font>+<a name="line-135"></a>+<a name="line-136"></a><font color=Blue>--carryelem e@(Elem n as cs) c</font>+<a name="line-137"></a><font color=Blue>-- | isText (head cs) =</font>+<a name="line-138"></a><font color=Blue>-- ( start <></font>+<a name="line-139"></a><font color=Blue>-- text ">" <> hcat (map content cs) <> text "</" <> text n</font>+<a name="line-140"></a><font color=Blue>-- , text ">")</font>+<a name="line-141"></a><font color=Blue>-- | otherwise =</font>+<a name="line-142"></a><font color=Blue>-- let (d,c0) = foldl carrycontent (start, text ">") cs in</font>+<a name="line-143"></a><font color=Blue>-- ( d <> c0 <> text "</" <> text n</font>+<a name="line-144"></a><font color=Blue>-- , text ">")</font>+<a name="line-145"></a><font color=Blue>-- where start = c <> text "<" <> text n <+> fsep (map attribute as)</font>+<a name="line-146"></a><font color=Blue>--</font>+<a name="line-147"></a><font color=Blue>--carrycontent (d,c) (CElem e) = let (d',c') = carryelem e c in</font>+<a name="line-148"></a><font color=Blue>-- (d $$ nest 2 d', c')</font>+<a name="line-149"></a><font color=Blue>--carrycontent (d,c) (CString _ s) = (d <> c <> chardata s, empty)</font>+<a name="line-150"></a><font color=Blue>--carrycontent (d,c) (CRef r) = (d <> c <> reference r,empty)</font>+<a name="line-151"></a><font color=Blue>--carrycontent (d,c) (CMisc m) = (d $$ c <> misc m, empty)</font>+<a name="line-152"></a>+<a name="line-153"></a>+<a name="line-154"></a><font color=Blue>attribute</font> <font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><></font> text <font color=Magenta>"="</font> <font color=Cyan><></font> attvalue v+<a name="line-155"></a><font color=Blue>content</font> <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> element e+<a name="line-156"></a><font color=Blue>content</font> <font color=Cyan>(</font>CString False s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> chardata s+<a name="line-157"></a><font color=Blue>content</font> <font color=Cyan>(</font>CString True s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> cdsect s+<a name="line-158"></a><font color=Blue>content</font> <font color=Cyan>(</font>CRef r <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> reference r+<a name="line-159"></a><font color=Blue>content</font> <font color=Cyan>(</font>CMisc m <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> misc m+<a name="line-160"></a>+<a name="line-161"></a><a name="elementdecl"></a><font color=Blue>elementdecl</font> <font color=Red>::</font> ElementDecl <font color=Red>-></font> Doc+<a name="line-162"></a><font color=Blue>elementdecl</font> <font color=Cyan>(</font>ElementDecl n cs<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ELEMENT"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>+<a name="line-163"></a> contentspec cs <font color=Cyan><></font> text <font color=Magenta>">"</font>+<a name="line-164"></a><a name="contentspec"></a><font color=Blue>contentspec</font> <font color=Red>::</font> ContentSpec <font color=Red>-></font> Doc+<a name="line-165"></a><font color=Blue>contentspec</font> EMPTY <font color=Red>=</font> text <font color=Magenta>"EMPTY"</font>+<a name="line-166"></a><font color=Blue>contentspec</font> ANY <font color=Red>=</font> text <font color=Magenta>"ANY"</font>+<a name="line-167"></a><font color=Blue>contentspec</font> <font color=Cyan>(</font>Mixed m<font color=Cyan>)</font> <font color=Red>=</font> mixed m+<a name="line-168"></a><font color=Blue>contentspec</font> <font color=Cyan>(</font>ContentSpec c<font color=Cyan>)</font> <font color=Red>=</font> cp c+<a name="line-169"></a><font color=Blue>--contentspec (ContentPE p cs) = peref p</font>+<a name="line-170"></a><font color=Blue>cp</font> <font color=Cyan>(</font>TagName n m<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>text n<font color=Cyan>)</font> <font color=Cyan><></font> modifier m+<a name="line-171"></a><font color=Blue>cp</font> <font color=Cyan>(</font>Choice cs m<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map cp cs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-172"></a> modifier m+<a name="line-173"></a><font color=Blue>cp</font> <font color=Cyan>(</font>Seq cs m<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>","</font><font color=Cyan>)</font> <font color=Cyan>(</font>map cp cs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-174"></a> modifier m+<a name="line-175"></a><a name="modifier"></a><font color=Blue>--cp (CPPE p c) = peref p</font>+<a name="line-176"></a><font color=Blue>modifier</font> <font color=Red>::</font> Modifier <font color=Red>-></font> Doc+<a name="line-177"></a><font color=Blue>modifier</font> None <font color=Red>=</font> empty+<a name="line-178"></a><font color=Blue>modifier</font> Query <font color=Red>=</font> text <font color=Magenta>"?"</font>+<a name="line-179"></a><font color=Blue>modifier</font> Star <font color=Red>=</font> text <font color=Magenta>"*"</font>+<a name="line-180"></a><font color=Blue>modifier</font> Plus <font color=Red>=</font> text <font color=Magenta>"+"</font>+<a name="line-181"></a><a name="mixed"></a><font color=Blue>mixed</font> <font color=Red>::</font> Mixed <font color=Red>-></font> Doc+<a name="line-182"></a><font color=Blue>mixed</font> PCDATA <font color=Red>=</font> text <font color=Magenta>"(#PCDATA)"</font>+<a name="line-183"></a><font color=Blue>mixed</font> <font color=Cyan>(</font>PCDATAplus ns<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"(#PCDATA |"</font> <font color=Cyan><+></font>+<a name="line-184"></a> hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map text ns<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-185"></a> text <font color=Magenta>")*"</font>+<a name="line-186"></a>+<a name="line-187"></a><a name="attlistdecl"></a><font color=Blue>attlistdecl</font> <font color=Red>::</font> AttListDecl <font color=Red>-></font> Doc+<a name="line-188"></a><font color=Blue>attlistdecl</font> <font color=Cyan>(</font>AttListDecl n ds<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ATTLIST"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>+<a name="line-189"></a> fsep <font color=Cyan>(</font>map attdef ds<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>">"</font>+<a name="line-190"></a><a name="attdef"></a><font color=Blue>attdef</font> <font color=Red>::</font> AttDef <font color=Red>-></font> Doc+<a name="line-191"></a><font color=Blue>attdef</font> <font color=Cyan>(</font>AttDef n t d<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><+></font> atttype t <font color=Cyan><+></font> defaultdecl d+<a name="line-192"></a><a name="atttype"></a><font color=Blue>atttype</font> <font color=Red>::</font> AttType <font color=Red>-></font> Doc+<a name="line-193"></a><font color=Blue>atttype</font> StringType <font color=Red>=</font> text <font color=Magenta>"CDATA"</font>+<a name="line-194"></a><font color=Blue>atttype</font> <font color=Cyan>(</font>TokenizedType t<font color=Cyan>)</font> <font color=Red>=</font> tokenizedtype t+<a name="line-195"></a><font color=Blue>atttype</font> <font color=Cyan>(</font>EnumeratedType t<font color=Cyan>)</font> <font color=Red>=</font> enumeratedtype t+<a name="line-196"></a><a name="tokenizedtype"></a><font color=Blue>tokenizedtype</font> <font color=Red>::</font> TokenizedType <font color=Red>-></font> Doc+<a name="line-197"></a><font color=Blue>tokenizedtype</font> ID <font color=Red>=</font> text <font color=Magenta>"ID"</font>+<a name="line-198"></a><font color=Blue>tokenizedtype</font> IDREF <font color=Red>=</font> text <font color=Magenta>"IDREF"</font>+<a name="line-199"></a><font color=Blue>tokenizedtype</font> IDREFS <font color=Red>=</font> text <font color=Magenta>"IDREFS"</font>+<a name="line-200"></a><font color=Blue>tokenizedtype</font> ENTITY <font color=Red>=</font> text <font color=Magenta>"ENTITY"</font>+<a name="line-201"></a><font color=Blue>tokenizedtype</font> ENTITIES <font color=Red>=</font> text <font color=Magenta>"ENTITIES"</font>+<a name="line-202"></a><font color=Blue>tokenizedtype</font> NMTOKEN <font color=Red>=</font> text <font color=Magenta>"NMTOKEN"</font>+<a name="line-203"></a><font color=Blue>tokenizedtype</font> NMTOKENS <font color=Red>=</font> text <font color=Magenta>"NMTOKENS"</font>+<a name="line-204"></a><a name="enumeratedtype"></a><font color=Blue>enumeratedtype</font> <font color=Red>::</font> EnumeratedType <font color=Red>-></font> Doc+<a name="line-205"></a><font color=Blue>enumeratedtype</font> <font color=Cyan>(</font>NotationType n<font color=Cyan>)</font><font color=Red>=</font> notationtype n+<a name="line-206"></a><font color=Blue>enumeratedtype</font> <font color=Cyan>(</font>Enumeration e<font color=Cyan>)</font> <font color=Red>=</font> enumeration e+<a name="line-207"></a><a name="notationtype"></a><font color=Blue>notationtype</font> <font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-></font> Doc+<a name="line-208"></a><font color=Blue>notationtype</font> ns <font color=Red>=</font> text <font color=Magenta>"NOTATION"</font> <font color=Cyan><+></font>+<a name="line-209"></a> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map text ns<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-210"></a><a name="enumeration"></a><font color=Blue>enumeration</font> <font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-></font> Doc+<a name="line-211"></a><font color=Blue>enumeration</font> ns <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map nmtoken ns<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-212"></a><a name="defaultdecl"></a><font color=Blue>defaultdecl</font> <font color=Red>::</font> DefaultDecl <font color=Red>-></font> Doc+<a name="line-213"></a><font color=Blue>defaultdecl</font> REQUIRED <font color=Red>=</font> text <font color=Magenta>"#REQUIRED"</font>+<a name="line-214"></a><font color=Blue>defaultdecl</font> IMPLIED <font color=Red>=</font> text <font color=Magenta>"#IMPLIED"</font>+<a name="line-215"></a><font color=Blue>defaultdecl</font> <font color=Cyan>(</font>DefaultTo a f<font color=Cyan>)</font> <font color=Red>=</font> maybe <font color=Cyan>(</font>const <font color=Cyan>(</font>text <font color=Magenta>"#FIXED"</font><font color=Cyan>)</font><font color=Cyan>)</font> f <font color=Cyan><+></font> attvalue a+<a name="line-216"></a><a name="conditionalsect"></a><font color=Blue>conditionalsect</font> <font color=Cyan>(</font>IncludeSect i<font color=Cyan>)</font><font color=Red>=</font> text <font color=Magenta>"<![INCLUDE ["</font> <font color=Cyan><+></font>+<a name="line-217"></a> vcat <font color=Cyan>(</font>map extsubsetdecl i<font color=Cyan>)</font> <font color=Cyan><+></font> text <font color=Magenta>"]]>"</font>+<a name="line-218"></a><font color=Blue>conditionalsect</font> <font color=Cyan>(</font>IgnoreSect i<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<![IGNORE ["</font> <font color=Cyan><+></font>+<a name="line-219"></a> fsep <font color=Cyan>(</font>map ignoresectcontents i<font color=Cyan>)</font> <font color=Cyan><+></font> text <font color=Magenta>"]]>"</font>+<a name="line-220"></a><a name="ignore"></a><font color=Blue>ignore</font> <font color=Cyan>(</font>Ignore<font color=Cyan>)</font> <font color=Red>=</font> empty+<a name="line-221"></a><a name="ignoresectcontents"></a><font color=Blue>ignoresectcontents</font> <font color=Cyan>(</font>IgnoreSectContents i is<font color=Cyan>)</font>+<a name="line-222"></a> <font color=Red>=</font> ignore i <font color=Cyan><+></font> vcat <font color=Cyan>(</font>map internal is<font color=Cyan>)</font>+<a name="line-223"></a> <font color=Green><u>where</u></font> internal <font color=Cyan>(</font>ics<font color=Cyan>,</font>i<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<![["</font> <font color=Cyan><+></font>+<a name="line-224"></a> ignoresectcontents ics <font color=Cyan><+></font>+<a name="line-225"></a> text <font color=Magenta>"]]>"</font> <font color=Cyan><+></font> ignore i+<a name="line-226"></a><a name="reference"></a><font color=Blue>reference</font> <font color=Red>::</font> Reference <font color=Red>-></font> Doc+<a name="line-227"></a><font color=Blue>reference</font> <font color=Cyan>(</font>RefEntity er<font color=Cyan>)</font> <font color=Red>=</font> entityref er+<a name="line-228"></a><font color=Blue>reference</font> <font color=Cyan>(</font>RefChar cr<font color=Cyan>)</font> <font color=Red>=</font> charref cr+<a name="line-229"></a><a name="entityref"></a><font color=Blue>entityref</font> <font color=Red>::</font> String <font color=Red>-></font> Doc+<a name="line-230"></a><font color=Blue>entityref</font> n <font color=Red>=</font> text <font color=Magenta>"&"</font> <font color=Cyan><></font> text n <font color=Cyan><></font> text <font color=Magenta>";"</font>+<a name="line-231"></a><a name="charref"></a><font color=Blue>charref</font> <font color=Red>::</font> <font color=Cyan>(</font>Show a<font color=Cyan>)</font> <font color=Red>=></font> a <font color=Red>-></font> Doc+<a name="line-232"></a><font color=Blue>charref</font> c <font color=Red>=</font> text <font color=Magenta>"&#"</font> <font color=Cyan><></font> text <font color=Cyan>(</font>show c<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>";"</font>+<a name="line-233"></a><a name="entitydecl"></a><font color=Blue>entitydecl</font> <font color=Red>::</font> EntityDecl <font color=Red>-></font> Doc+<a name="line-234"></a><font color=Blue>entitydecl</font> <font color=Cyan>(</font>EntityGEDecl d<font color=Cyan>)</font> <font color=Red>=</font> gedecl d+<a name="line-235"></a><font color=Blue>entitydecl</font> <font color=Cyan>(</font>EntityPEDecl d<font color=Cyan>)</font> <font color=Red>=</font> pedecl d+<a name="line-236"></a><a name="gedecl"></a><font color=Blue>gedecl</font> <font color=Red>::</font> GEDecl <font color=Red>-></font> Doc+<a name="line-237"></a><font color=Blue>gedecl</font> <font color=Cyan>(</font>GEDecl n ed<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ENTITY"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font> entitydef ed <font color=Cyan><></font>+<a name="line-238"></a> text <font color=Magenta>">"</font>+<a name="line-239"></a><a name="pedecl"></a><font color=Blue>pedecl</font> <font color=Red>::</font> PEDecl <font color=Red>-></font> Doc+<a name="line-240"></a><font color=Blue>pedecl</font> <font color=Cyan>(</font>PEDecl n pd<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ENTITY %"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font> pedef pd <font color=Cyan><></font>+<a name="line-241"></a> text <font color=Magenta>">"</font>+<a name="line-242"></a><a name="entitydef"></a><font color=Blue>entitydef</font> <font color=Red>::</font> EntityDef <font color=Red>-></font> Doc+<a name="line-243"></a><font color=Blue>entitydef</font> <font color=Cyan>(</font>DefEntityValue ew<font color=Cyan>)</font> <font color=Red>=</font> entityvalue ew+<a name="line-244"></a><font color=Blue>entitydef</font> <font color=Cyan>(</font>DefExternalID i nd<font color=Cyan>)</font> <font color=Red>=</font> externalid i <font color=Cyan><+></font> maybe ndatadecl nd+<a name="line-245"></a><a name="pedef"></a><font color=Blue>pedef</font> <font color=Red>::</font> PEDef <font color=Red>-></font> Doc+<a name="line-246"></a><font color=Blue>pedef</font> <font color=Cyan>(</font>PEDefEntityValue ew<font color=Cyan>)</font> <font color=Red>=</font> entityvalue ew+<a name="line-247"></a><font color=Blue>pedef</font> <font color=Cyan>(</font>PEDefExternalID eid<font color=Cyan>)</font> <font color=Red>=</font> externalid eid+<a name="line-248"></a><a name="externalid"></a><font color=Blue>externalid</font> <font color=Red>::</font> ExternalID <font color=Red>-></font> Doc+<a name="line-249"></a><font color=Blue>externalid</font> <font color=Cyan>(</font>SYSTEM sl<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"SYSTEM"</font> <font color=Cyan><+></font> systemliteral sl+<a name="line-250"></a><font color=Blue>externalid</font> <font color=Cyan>(</font>PUBLIC i sl<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"PUBLIC"</font> <font color=Cyan><+></font> pubidliteral i <font color=Cyan><+></font>+<a name="line-251"></a> systemliteral sl+<a name="line-252"></a><a name="ndatadecl"></a><font color=Blue>ndatadecl</font> <font color=Red>::</font> NDataDecl <font color=Red>-></font> Doc+<a name="line-253"></a><font color=Blue>ndatadecl</font> <font color=Cyan>(</font>NDATA n<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"NDATA"</font> <font color=Cyan><+></font> text n+<a name="line-254"></a><a name="textdecl"></a><font color=Blue>textdecl</font> <font color=Cyan>(</font>TextDecl vi ed<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?xml"</font> <font color=Cyan><+></font> maybe text vi <font color=Cyan><+></font>+<a name="line-255"></a> encodingdecl ed <font color=Cyan><+></font> text <font color=Magenta>"?>"</font>+<a name="line-256"></a><a name="extparsedent"></a><font color=Blue>extparsedent</font> <font color=Cyan>(</font>ExtParsedEnt t c<font color=Cyan>)</font><font color=Red>=</font> maybe textdecl t <font color=Cyan><+></font> content c+<a name="line-257"></a><a name="extpe"></a><font color=Blue>extpe</font> <font color=Cyan>(</font>ExtPE t esd<font color=Cyan>)</font> <font color=Red>=</font> maybe textdecl t <font color=Cyan><+></font>+<a name="line-258"></a> vcat <font color=Cyan>(</font>map extsubsetdecl esd<font color=Cyan>)</font>+<a name="line-259"></a><a name="notationdecl"></a><font color=Blue>notationdecl</font> <font color=Red>::</font> NotationDecl <font color=Red>-></font> Doc+<a name="line-260"></a><font color=Blue>notationdecl</font> <font color=Cyan>(</font>NOTATION n e<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!NOTATION"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>+<a name="line-261"></a> either externalid publicid e <font color=Cyan><></font>+<a name="line-262"></a> text <font color=Magenta>">"</font>+<a name="line-263"></a><a name="publicid"></a><font color=Blue>publicid</font> <font color=Red>::</font> PublicID <font color=Red>-></font> Doc+<a name="line-264"></a><font color=Blue>publicid</font> <font color=Cyan>(</font>PUBLICID p<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"PUBLIC"</font> <font color=Cyan><+></font> pubidliteral p+<a name="line-265"></a><a name="encodingdecl"></a><font color=Blue>encodingdecl</font> <font color=Red>::</font> EncodingDecl <font color=Red>-></font> Doc+<a name="line-266"></a><font color=Blue>encodingdecl</font> <font color=Cyan>(</font>EncodingDecl s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"encoding='"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>+<a name="line-267"></a><a name="nmtoken"></a><font color=Blue>nmtoken</font> <font color=Red>::</font> String <font color=Red>-></font> Doc+<a name="line-268"></a><font color=Blue>nmtoken</font> s <font color=Red>=</font> text s+<a name="line-269"></a><a name="attvalue"></a><font color=Blue>attvalue</font> <font color=Red>::</font> AttValue <font color=Red>-></font> Doc+<a name="line-270"></a><font color=Blue>attvalue</font> <font color=Cyan>(</font>AttValue esr<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font>+<a name="line-271"></a> hcat <font color=Cyan>(</font>map <font color=Cyan>(</font>either text reference<font color=Cyan>)</font> esr<font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-272"></a> text <font color=Magenta>"\""</font>+<a name="line-273"></a><a name="entityvalue"></a><font color=Blue>entityvalue</font> <font color=Red>::</font> EntityValue <font color=Red>-></font> Doc+<a name="line-274"></a><font color=Blue>entityvalue</font> <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font>+<a name="line-275"></a> <font color=Red>|</font> containsDoubleQuote evs <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>map ev evs<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"'"</font>+<a name="line-276"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>map ev evs<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"\""</font>+<a name="line-277"></a><a name="ev"></a><font color=Blue>ev</font> <font color=Red>::</font> EV <font color=Red>-></font> Doc+<a name="line-278"></a><font color=Blue>ev</font> <font color=Cyan>(</font>EVString s<font color=Cyan>)</font> <font color=Red>=</font> text s+<a name="line-279"></a><font color=Blue>--ev (EVPERef p e) = peref p</font>+<a name="line-280"></a><font color=Blue>ev</font> <font color=Cyan>(</font>EVRef r<font color=Cyan>)</font> <font color=Red>=</font> reference r+<a name="line-281"></a><a name="pubidliteral"></a><font color=Blue>pubidliteral</font> <font color=Red>::</font> PubidLiteral <font color=Red>-></font> Doc+<a name="line-282"></a><font color=Blue>pubidliteral</font> <font color=Cyan>(</font>PubidLiteral s<font color=Cyan>)</font>+<a name="line-283"></a> <font color=Red>|</font> <font color=Magenta>'"'</font> <font color=Cyan>`elem`</font> s <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>+<a name="line-284"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"\""</font>+<a name="line-285"></a><a name="systemliteral"></a><font color=Blue>systemliteral</font> <font color=Red>::</font> SystemLiteral <font color=Red>-></font> Doc+<a name="line-286"></a><font color=Blue>systemliteral</font> <font color=Cyan>(</font>SystemLiteral s<font color=Cyan>)</font>+<a name="line-287"></a> <font color=Red>|</font> <font color=Magenta>'"'</font> <font color=Cyan>`elem`</font> s <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>+<a name="line-288"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"\""</font>+<a name="line-289"></a><a name="chardata"></a><font color=Blue>chardata</font> <font color=Red>::</font> String <font color=Red>-></font> Doc+<a name="line-290"></a><font color=Blue>chardata</font> s <font color=Red>=</font> <font color=Blue>{-if all isSpace s then empty else-}</font> text s+<a name="line-291"></a><a name="cdsect"></a><font color=Blue>cdsect</font> <font color=Red>::</font> String <font color=Red>-></font> Doc+<a name="line-292"></a><font color=Blue>cdsect</font> c <font color=Red>=</font> text <font color=Magenta>"<![CDATA["</font> <font color=Cyan><></font> chardata c <font color=Cyan><></font> text <font color=Magenta>"]]>"</font>+<a name="line-293"></a>+<a name="line-294"></a><a name="containsDoubleQuote"></a><font color=Blue>----</font>+<a name="line-295"></a><font color=Blue>containsDoubleQuote</font> <font color=Red>::</font> <font color=Red>[</font>EV<font color=Red>]</font> <font color=Red>-></font> Bool+<a name="line-296"></a><font color=Blue>containsDoubleQuote</font> evs <font color=Red>=</font> any csq evs+<a name="line-297"></a> <font color=Green><u>where</u></font> csq <font color=Cyan>(</font>EVString s<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>'"'</font> <font color=Cyan>`elem`</font> s+<a name="line-298"></a> csq <font color=Green><u>_</u></font> <font color=Red>=</font> False </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/SAX.html view
@@ -1,97 +1,103 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>-- | A streaming XML parser, using a method known as SAX. SAX isn't really a</font>-<a name="(line2)"></a><font color=Blue>-- standard, but an implementation, so it's just an \"SAX-like\" parser.</font>-<a name="(line3)"></a><font color=Blue>-- This module allows you parse an XML document without having to evaluate</font>-<a name="(line4)"></a><font color=Blue>-- it as a whole. This is needed for protocols like jabber, which use xml</font>-<a name="(line5)"></a><font color=Blue>-- streams for communication.</font>-<a name="(line6)"></a>-<a name="(line7)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>SAX-<a name="(line8)"></a> <font color=Cyan>(</font> SaxElement<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line9)"></a> <font color=Cyan>,</font> saxParse-<a name="(line10)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line11)"></a>-<a name="(line12)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line13)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Parse-<a name="(line14)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Lex-<a name="(line15)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>Poly<font color=Cyan>.</font>NoLeak<font color=Cyan>.</font>State-<a name="(line16)"></a>-<a name="(line17)"></a><a name="SaxElement"></a><font color=Green><u>data</u></font> SaxElement-<a name="(line18)"></a> <font color=Red>=</font> SaxDocTypeDecl DocTypeDecl-<a name="(line19)"></a> <font color=Blue>-- ^ A doctype declaration occured(\<!DOCTYPE\>)</font>-<a name="(line20)"></a> <font color=Red>|</font> SaxProcessingInstruction ProcessingInstruction-<a name="(line21)"></a> <font color=Blue>-- ^ A processing instruction occured (\<??\>)</font>-<a name="(line22)"></a> <font color=Red>|</font> SaxComment String <font color=Blue>-- ^ A comment occured (\<!-- --\>)</font>-<a name="(line23)"></a> <font color=Red>|</font> SaxElementOpen Name <font color=Red>[</font>Attribute<font color=Red>]</font> <font color=Blue>-- ^ An element was opened (\<\>)</font>-<a name="(line24)"></a> <font color=Red>|</font> SaxElementClose Name <font color=Blue>-- ^ An element was closed (\<\/\>)</font>-<a name="(line25)"></a> <font color=Red>|</font> SaxElementTag Name <font color=Red>[</font>Attribute<font color=Red>]</font>-<a name="(line26)"></a> <font color=Blue>-- ^ An element without content occured (\<\/\>)</font>-<a name="(line27)"></a> <font color=Red>|</font> SaxCharData CharData <font color=Blue>-- ^ Some string data occured</font>-<a name="(line28)"></a> <font color=Red>|</font> SaxReference Reference <font color=Blue>-- ^ A reference occured</font>-<a name="(line29)"></a>-<a name="(line30)"></a><a name="saxParse"></a><font color=Blue>-- | @saxParse file content@ takes a filename and the string content of that</font>-<a name="(line31)"></a><font color=Blue>-- file and generates a stream of @SaxElement@s. If an error occurs, the</font>-<a name="(line32)"></a><font color=Blue>-- parsing stops and a string is returned using the @Maybe@ type.</font>-<a name="(line33)"></a>saxParse <font color=Red>::</font> String <font color=Blue>-- ^ The filename</font>-<a name="(line34)"></a> <font color=Red>-></font> String <font color=Blue>-- ^ The content of the file</font>-<a name="(line35)"></a> <font color=Red>-></font> <font color=Cyan>(</font><font color=Red>[</font>SaxElement<font color=Red>]</font><font color=Cyan>,</font>Maybe String<font color=Cyan>)</font>-<a name="(line36)"></a> <font color=Blue>-- ^ A tuple of the parsed elements and @Nothing@, if no</font>-<a name="(line37)"></a> <font color=Blue>-- error occured, or @Just@ @String@ if an error occured.</font>-<a name="(line38)"></a>saxParse file cntnt <font color=Red>=</font> parseStream sax emptySTs-<a name="(line39)"></a> <font color=Cyan>(</font>xmlLex file cntnt<font color=Cyan>)</font>-<a name="(line40)"></a>-<a name="(line41)"></a><a name="parseStream"></a>parseStream <font color=Red>::</font> Parser s t a <font color=Red>-></font> s <font color=Red>-></font> <font color=Red>[</font>t<font color=Red>]</font> <font color=Red>-></font> <font color=Cyan>(</font><font color=Red>[</font>a<font color=Red>]</font><font color=Cyan>,</font> Maybe String<font color=Cyan>)</font>-<a name="(line42)"></a>parseStream <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> [] <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>Nothing<font color=Cyan>)</font>-<a name="(line43)"></a>parseStream p state toks <font color=Red>=</font> <font color=Green><u>case</u></font> runParser p state toks <font color=Green><u>of</u></font>-<a name="(line44)"></a> <font color=Cyan>(</font>Left err<font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>Just err<font color=Cyan>)</font>-<a name="(line45)"></a> <font color=Cyan>(</font>Right res<font color=Cyan>,</font> nstate<font color=Cyan>,</font> rest<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>res<font color=Red><b>:</b></font>moreres<font color=Cyan>,</font> err<font color=Cyan>)</font>-<a name="(line46)"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>moreres<font color=Cyan>,</font>err<font color=Cyan>)</font> <font color=Red>=</font> parseStream p nstate rest-<a name="(line47)"></a>-<a name="(line48)"></a><a name="sax"></a>sax <font color=Red>::</font> XParser SaxElement-<a name="(line49)"></a>sax <font color=Red>=</font> oneOf <font color=Red>[</font> saxelementopen-<a name="(line50)"></a> <font color=Cyan>,</font> saxelementclose-<a name="(line51)"></a> <font color=Cyan>,</font> saxprocessinginstruction-<a name="(line52)"></a> <font color=Cyan>,</font> saxcomment-<a name="(line53)"></a> <font color=Cyan>,</font> saxdoctypedecl-<a name="(line54)"></a> <font color=Cyan>,</font> saxreference-<a name="(line55)"></a> <font color=Cyan>,</font> saxchardata-<a name="(line56)"></a> <font color=Red>]</font>-<a name="(line57)"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>++</font><font color=Cyan>(</font><font color=Magenta>"\nLooking for a SAX event:\n"</font>-<a name="(line58)"></a> <font color=Cyan>++</font><font color=Magenta>" elem-open, elem-close, PI, comment, DTD, ref, or chardata"</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line59)"></a>-<a name="(line60)"></a><a name="saxelementopen"></a>saxelementopen <font color=Red>::</font> XParser SaxElement-<a name="(line61)"></a>saxelementopen <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line62)"></a> tok TokAnyOpen-<a name="(line63)"></a> <font color=Cyan>(</font>ElemTag n <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Red><-</font> elemtag-<a name="(line64)"></a> <font color=Cyan>(</font><font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokEndClose-<a name="(line65)"></a> return <font color=Cyan>(</font>SaxElementTag n <font color=Green><u>as</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font>-<a name="(line66)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokAnyClose-<a name="(line67)"></a> return <font color=Cyan>(</font>SaxElementOpen n <font color=Green><u>as</u></font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line68)"></a> <font color=Cyan>`onFail`</font> fail <font color=Magenta>"missing > or /> in element tag"</font><font color=Cyan>)</font>-<a name="(line69)"></a>-<a name="(line70)"></a><a name="saxelementclose"></a>saxelementclose <font color=Red>::</font> XParser SaxElement-<a name="(line71)"></a>saxelementclose <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line72)"></a> tok TokEndOpen-<a name="(line73)"></a> n <font color=Red><-</font> name-<a name="(line74)"></a> tok TokAnyClose-<a name="(line75)"></a> return <font color=Cyan>(</font>SaxElementClose n<font color=Cyan>)</font>-<a name="(line76)"></a>-<a name="(line77)"></a><a name="saxcomment"></a>saxcomment <font color=Red>::</font> XParser SaxElement-<a name="(line78)"></a>saxcomment <font color=Red>=</font> comment <font color=Cyan>>>=</font> return <font color=Cyan>.</font> SaxComment-<a name="(line79)"></a>-<a name="(line80)"></a><a name="saxchardata"></a>saxchardata <font color=Red>::</font> XParser SaxElement-<a name="(line81)"></a>saxchardata <font color=Red>=</font>-<a name="(line82)"></a> <font color=Cyan>(</font>cdsect <font color=Cyan>>>=</font> return <font color=Cyan>.</font> SaxCharData<font color=Cyan>)</font>-<a name="(line83)"></a> <font color=Cyan>`onFail`</font>-<a name="(line84)"></a> <font color=Cyan>(</font>chardata <font color=Cyan>>>=</font> return <font color=Cyan>.</font> SaxCharData<font color=Cyan>)</font>-<a name="(line85)"></a>-<a name="(line86)"></a><a name="saxreference"></a>saxreference <font color=Red>::</font> XParser SaxElement-<a name="(line87)"></a>saxreference <font color=Red>=</font> reference <font color=Cyan>>>=</font> return <font color=Cyan>.</font> SaxReference-<a name="(line88)"></a>-<a name="(line89)"></a><a name="saxdoctypedecl"></a>saxdoctypedecl <font color=Red>::</font> XParser SaxElement-<a name="(line90)"></a>saxdoctypedecl <font color=Red>=</font> doctypedecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> SaxDocTypeDecl-<a name="(line91)"></a>-<a name="(line92)"></a><a name="saxprocessinginstruction"></a>saxprocessinginstruction <font color=Red>::</font> XParser SaxElement-<a name="(line93)"></a>saxprocessinginstruction <font color=Red>=</font> fmap SaxProcessingInstruction processinginstruction+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/SAX.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>-- | A streaming XML parser, using a method known as SAX. SAX isn't really a</font>+<a name="line-2"></a><font color=Blue>-- standard, but an implementation, so it's just an \"SAX-like\" parser.</font>+<a name="line-3"></a><font color=Blue>-- This module allows you parse an XML document without having to evaluate</font>+<a name="line-4"></a><font color=Blue>-- it as a whole. This is needed for protocols like jabber, which use xml</font>+<a name="line-5"></a><font color=Blue>-- streams for communication.</font>+<a name="line-6"></a>+<a name="line-7"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>SAX+<a name="line-8"></a> <font color=Cyan>(</font> SaxElement<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-9"></a> <font color=Cyan>,</font> saxParse+<a name="line-10"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-11"></a>+<a name="line-12"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-13"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Parse+<a name="line-14"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Lex+<a name="line-15"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>Poly<font color=Cyan>.</font>NoLeak<font color=Cyan>.</font>State+<a name="line-16"></a>+<a name="line-17"></a><a name="SaxElement"></a><font color=Green><u>data</u></font> SaxElement+<a name="line-18"></a> <font color=Red>=</font> SaxDocTypeDecl DocTypeDecl+<a name="line-19"></a> <font color=Blue>-- ^ A doctype declaration occured(\<!DOCTYPE\>)</font>+<a name="line-20"></a> <font color=Red>|</font> SaxProcessingInstruction ProcessingInstruction+<a name="line-21"></a> <font color=Blue>-- ^ A processing instruction occured (\<??\>)</font>+<a name="line-22"></a> <font color=Red>|</font> SaxComment String <font color=Blue>-- ^ A comment occured (\<!-- --\>)</font>+<a name="line-23"></a> <font color=Red>|</font> SaxElementOpen Name <font color=Red>[</font>Attribute<font color=Red>]</font> <font color=Blue>-- ^ An element was opened (\<\>)</font>+<a name="line-24"></a> <font color=Red>|</font> SaxElementClose Name <font color=Blue>-- ^ An element was closed (\<\/\>)</font>+<a name="line-25"></a> <font color=Red>|</font> SaxElementTag Name <font color=Red>[</font>Attribute<font color=Red>]</font>+<a name="line-26"></a> <font color=Blue>-- ^ An element without content occured (\<\/\>)</font>+<a name="line-27"></a> <font color=Red>|</font> SaxCharData CharData <font color=Blue>-- ^ Some string data occured</font>+<a name="line-28"></a> <font color=Red>|</font> SaxReference Reference <font color=Blue>-- ^ A reference occured</font>+<a name="line-29"></a>+<a name="line-30"></a><a name="saxParse"></a><font color=Blue>-- | @saxParse file content@ takes a filename and the string content of that</font>+<a name="line-31"></a><font color=Blue>-- file and generates a stream of @SaxElement@s. If an error occurs, the</font>+<a name="line-32"></a><font color=Blue>-- parsing stops and a string is returned using the @Maybe@ type.</font>+<a name="line-33"></a><font color=Blue>saxParse</font> <font color=Red>::</font> String <font color=Blue>-- ^ The filename</font>+<a name="line-34"></a> <font color=Red>-></font> String <font color=Blue>-- ^ The content of the file</font>+<a name="line-35"></a> <font color=Red>-></font> <font color=Cyan>(</font><font color=Red>[</font>SaxElement<font color=Red>]</font><font color=Cyan>,</font>Maybe String<font color=Cyan>)</font>+<a name="line-36"></a> <font color=Blue>-- ^ A tuple of the parsed elements and @Nothing@, if no</font>+<a name="line-37"></a> <font color=Blue>-- error occured, or @Just@ @String@ if an error occured.</font>+<a name="line-38"></a><font color=Blue>saxParse</font> file cntnt <font color=Red>=</font> parseStream sax emptySTs+<a name="line-39"></a> <font color=Cyan>(</font>xmlLex file cntnt<font color=Cyan>)</font>+<a name="line-40"></a>+<a name="line-41"></a><a name="parseStream"></a><font color=Blue>parseStream</font> <font color=Red>::</font> Parser s t a <font color=Red>-></font> s <font color=Red>-></font> <font color=Red>[</font>t<font color=Red>]</font> <font color=Red>-></font> <font color=Cyan>(</font><font color=Red>[</font>a<font color=Red>]</font><font color=Cyan>,</font> Maybe String<font color=Cyan>)</font>+<a name="line-42"></a><font color=Blue>parseStream</font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> [] <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>Nothing<font color=Cyan>)</font>+<a name="line-43"></a><font color=Blue>parseStream</font> p state toks <font color=Red>=</font> <font color=Green><u>case</u></font> runParser p state toks <font color=Green><u>of</u></font>+<a name="line-44"></a> <font color=Cyan>(</font>Left err<font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>Just err<font color=Cyan>)</font>+<a name="line-45"></a> <font color=Cyan>(</font>Right res<font color=Cyan>,</font> nstate<font color=Cyan>,</font> rest<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>res<font color=Red><b>:</b></font>moreres<font color=Cyan>,</font> err<font color=Cyan>)</font>+<a name="line-46"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>moreres<font color=Cyan>,</font>err<font color=Cyan>)</font> <font color=Red>=</font> parseStream p nstate rest+<a name="line-47"></a>+<a name="line-48"></a><a name="sax"></a><font color=Blue>sax</font> <font color=Red>::</font> XParser SaxElement+<a name="line-49"></a><font color=Blue>sax</font> <font color=Red>=</font> oneOf <font color=Red>[</font> saxelementopen+<a name="line-50"></a> <font color=Cyan>,</font> saxelementclose+<a name="line-51"></a> <font color=Cyan>,</font> saxprocessinginstruction+<a name="line-52"></a> <font color=Cyan>,</font> saxcomment+<a name="line-53"></a> <font color=Cyan>,</font> saxdoctypedecl+<a name="line-54"></a> <font color=Cyan>,</font> saxreference+<a name="line-55"></a> <font color=Cyan>,</font> saxchardata+<a name="line-56"></a> <font color=Red>]</font>+<a name="line-57"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>++</font><font color=Cyan>(</font><font color=Magenta>"\nLooking for a SAX event:\n"</font>+<a name="line-58"></a> <font color=Cyan>++</font><font color=Magenta>" elem-open, elem-close, PI, comment, DTD, ref, or chardata"</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-59"></a>+<a name="line-60"></a><a name="saxelementopen"></a><font color=Blue>saxelementopen</font> <font color=Red>::</font> XParser SaxElement+<a name="line-61"></a><font color=Blue>saxelementopen</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-62"></a> tok TokAnyOpen+<a name="line-63"></a> <font color=Cyan>(</font>ElemTag n <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Red><-</font> elemtag+<a name="line-64"></a> <font color=Cyan>(</font><font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokEndClose+<a name="line-65"></a> return <font color=Cyan>(</font>SaxElementTag n <font color=Green><u>as</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>`onFail`</font>+<a name="line-66"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> tok TokAnyClose+<a name="line-67"></a> return <font color=Cyan>(</font>SaxElementOpen n <font color=Green><u>as</u></font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-68"></a> <font color=Cyan>`onFail`</font> fail <font color=Magenta>"missing > or /> in element tag"</font><font color=Cyan>)</font>+<a name="line-69"></a>+<a name="line-70"></a><a name="saxelementclose"></a><font color=Blue>saxelementclose</font> <font color=Red>::</font> XParser SaxElement+<a name="line-71"></a><font color=Blue>saxelementclose</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-72"></a> tok TokEndOpen+<a name="line-73"></a> n <font color=Red><-</font> name+<a name="line-74"></a> tok TokAnyClose+<a name="line-75"></a> return <font color=Cyan>(</font>SaxElementClose n<font color=Cyan>)</font>+<a name="line-76"></a>+<a name="line-77"></a><a name="saxcomment"></a><font color=Blue>saxcomment</font> <font color=Red>::</font> XParser SaxElement+<a name="line-78"></a><font color=Blue>saxcomment</font> <font color=Red>=</font> comment <font color=Cyan>>>=</font> return <font color=Cyan>.</font> SaxComment+<a name="line-79"></a>+<a name="line-80"></a><a name="saxchardata"></a><font color=Blue>saxchardata</font> <font color=Red>::</font> XParser SaxElement+<a name="line-81"></a><font color=Blue>saxchardata</font> <font color=Red>=</font>+<a name="line-82"></a> <font color=Cyan>(</font>cdsect <font color=Cyan>>>=</font> return <font color=Cyan>.</font> SaxCharData<font color=Cyan>)</font>+<a name="line-83"></a> <font color=Cyan>`onFail`</font>+<a name="line-84"></a> <font color=Cyan>(</font>chardata <font color=Cyan>>>=</font> return <font color=Cyan>.</font> SaxCharData<font color=Cyan>)</font>+<a name="line-85"></a>+<a name="line-86"></a><a name="saxreference"></a><font color=Blue>saxreference</font> <font color=Red>::</font> XParser SaxElement+<a name="line-87"></a><font color=Blue>saxreference</font> <font color=Red>=</font> reference <font color=Cyan>>>=</font> return <font color=Cyan>.</font> SaxReference+<a name="line-88"></a>+<a name="line-89"></a><a name="saxdoctypedecl"></a><font color=Blue>saxdoctypedecl</font> <font color=Red>::</font> XParser SaxElement+<a name="line-90"></a><font color=Blue>saxdoctypedecl</font> <font color=Red>=</font> doctypedecl <font color=Cyan>>>=</font> return <font color=Cyan>.</font> SaxDocTypeDecl+<a name="line-91"></a>+<a name="line-92"></a><a name="saxprocessinginstruction"></a><font color=Blue>saxprocessinginstruction</font> <font color=Red>::</font> XParser SaxElement+<a name="line-93"></a><font color=Blue>saxprocessinginstruction</font> <font color=Red>=</font> fmap SaxProcessingInstruction processinginstruction </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/ShowXmlLazy.html view
@@ -1,331 +1,337 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>ShowXmlLazy <font color=Cyan>(</font>showXmlLazy<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line2)"></a>-<a name="(line3)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line4)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>TypeMapping <font color=Blue>-- (toHType, toDTD, Tuple(), Defined, showHType)</font>-<a name="(line5)"></a>-<a name="(line6)"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>XmlContent <font color=Green><u>as</u></font> X-<a name="(line7)"></a><font color=Green><u>import</u></font> Prelude hiding <font color=Cyan>(</font>maybe<font color=Cyan>,</font>either<font color=Cyan>)</font>-<a name="(line8)"></a><font color=Green><u>import</u></font> Maybe hiding <font color=Cyan>(</font>maybe<font color=Cyan>)</font>-<a name="(line9)"></a><font color=Green><u>import</u></font> Data<font color=Cyan>.</font>List-<a name="(line10)"></a>-<a name="(line11)"></a><a name="showXmlLazy"></a><font color=Blue>-- | Convert a fully-typed XML document to a string (without DTD).</font>-<a name="(line12)"></a>showXmlLazy <font color=Red>::</font> X<font color=Cyan>.</font>XmlContent a <font color=Red>=></font> Bool <font color=Red>-></font> a <font color=Red>-></font> String-<a name="(line13)"></a>showXmlLazy dtd x <font color=Red>=</font>-<a name="(line14)"></a> <font color=Green><u>case</u></font> X<font color=Cyan>.</font>toContents x <font color=Green><u>of</u></font>-<a name="(line15)"></a> <font color=Red>[</font>CElem <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Red>]</font> <font color=Red>-></font> document <font color=Cyan>$</font> toXmlLazy dtd x-<a name="(line16)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> <font color=Magenta>""</font>-<a name="(line17)"></a>-<a name="(line18)"></a>-<a name="(line19)"></a><a name="toXmlLazy"></a><font color=Blue>-- | Convert a fully-typed XML document to a string (with or without DTD).</font>-<a name="(line20)"></a>toXmlLazy <font color=Red>::</font> X<font color=Cyan>.</font>XmlContent a <font color=Red>=></font> Bool <font color=Red>-></font> a <font color=Red>-></font> Document ()-<a name="(line21)"></a>toXmlLazy dtd value <font color=Red>=</font>-<a name="(line22)"></a> <font color=Green><u>let</u></font> ht <font color=Red>=</font> toHType value <font color=Green><u>in</u></font>-<a name="(line23)"></a> Document <font color=Cyan>(</font>Prolog <font color=Cyan>(</font>Just <font color=Cyan>(</font>XMLDecl <font color=Magenta>"1.0"</font> Nothing Nothing<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line24)"></a> [] <font color=Cyan>(</font><font color=Green><u>if</u></font> dtd <font color=Green><u>then</u></font> Just <font color=Cyan>(</font>toDTD ht<font color=Cyan>)</font> <font color=Green><u>else</u></font> Nothing<font color=Cyan>)</font> []<font color=Cyan>)</font>-<a name="(line25)"></a> emptyST-<a name="(line26)"></a> <font color=Cyan>(</font> <font color=Green><u>case</u></font> <font color=Cyan>(</font>ht<font color=Cyan>,</font> X<font color=Cyan>.</font>toContents value<font color=Cyan>)</font> <font color=Green><u>of</u></font>-<a name="(line27)"></a> <font color=Cyan>(</font>Tuple <font color=Green><u>_</u></font><font color=Cyan>,</font> cs<font color=Cyan>)</font> <font color=Red>-></font> Elem <font color=Cyan>(</font>showHType ht <font color=Magenta>""</font><font color=Cyan>)</font> [] cs-<a name="(line28)"></a> <font color=Cyan>(</font>Defined <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>,</font> cs<font color=Cyan>)</font> <font color=Red>-></font> Elem <font color=Cyan>(</font>showHType ht <font color=Magenta>"-XML"</font><font color=Cyan>)</font> [] cs-<a name="(line29)"></a> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font> <font color=Red>[</font>CElem e ()<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> e <font color=Cyan>)</font>-<a name="(line30)"></a> []-<a name="(line31)"></a>-<a name="(line32)"></a>-<a name="(line33)"></a>-<a name="(line34)"></a>-<a name="(line35)"></a><a name="Doc"></a><font color=Green><u>type</u></font> Doc <font color=Red>=</font> String-<a name="(line36)"></a><a name="empty"></a>empty <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line37)"></a>empty <font color=Red>=</font> <font color=Magenta>""</font>-<a name="(line38)"></a><a name="$$"></a><font color=Cyan>(</font><font color=Cyan>$$</font><font color=Cyan>)</font> <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line39)"></a><font color=Cyan>(</font><font color=Cyan>$$</font><font color=Cyan>)</font> a b <font color=Red>=</font> a <font color=Cyan>++</font> <font color=Magenta>"\n"</font> <font color=Cyan>++</font> b-<a name="(line40)"></a><a name="vcat"></a>vcat <font color=Red>::</font> <font color=Red>[</font><font color=Red>[</font>Char<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line41)"></a>vcat a <font color=Red>=</font> foldr <font color=Cyan>(</font><font color=Cyan>$$</font><font color=Cyan>)</font> [] a-<a name="(line42)"></a><a name="hcat"></a>hcat <font color=Red>::</font> <font color=Red>[</font><font color=Red>[</font>a<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>a<font color=Red>]</font>-<a name="(line43)"></a>hcat <font color=Red>=</font> concat-<a name="(line44)"></a><a name="<>"></a><font color=Cyan>(</font><font color=Cyan><></font><font color=Cyan>)</font> <font color=Red>::</font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>a<font color=Red>]</font>-<a name="(line45)"></a><font color=Cyan>(</font><font color=Cyan><></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line46)"></a><a name="<+>"></a><font color=Cyan>(</font><font color=Cyan><+></font><font color=Cyan>)</font> <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line47)"></a><font color=Cyan>(</font><font color=Cyan><+></font><font color=Cyan>)</font> a b <font color=Red>=</font> a <font color=Cyan>++</font> <font color=Magenta>" "</font> <font color=Cyan>++</font> b-<a name="(line48)"></a><a name="fsep"></a>fsep <font color=Red>::</font> <font color=Red>[</font><font color=Red>[</font>Char<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line49)"></a>fsep <font color=Red>=</font> vcat-<a name="(line50)"></a><a name="text"></a>text <font color=Red>::</font> t <font color=Red>-></font> t-<a name="(line51)"></a>text string <font color=Red>=</font> string-<a name="(line52)"></a><a name="parens"></a>parens <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line53)"></a>parens string <font color=Red>=</font> <font color=Magenta>"("</font><font color=Cyan>++</font>string<font color=Cyan>++</font><font color=Magenta>")"</font>-<a name="(line54)"></a><a name="nest"></a>nest <font color=Red>::</font> t <font color=Red>-></font> t1 <font color=Red>-></font> t1-<a name="(line55)"></a>nest <font color=Green><u>_</u></font> string <font color=Red>=</font> string-<a name="(line56)"></a>-<a name="(line57)"></a>-<a name="(line58)"></a>-<a name="(line59)"></a><a name="either"></a>either <font color=Red>::</font> <font color=Cyan>(</font>t <font color=Red>-></font> t1<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>t2 <font color=Red>-></font> t1<font color=Cyan>)</font> <font color=Red>-></font> Either t t2 <font color=Red>-></font> t1-<a name="(line60)"></a>either f <font color=Green><u>_</u></font> <font color=Cyan>(</font>Left x<font color=Cyan>)</font> <font color=Red>=</font> f x-<a name="(line61)"></a>either <font color=Green><u>_</u></font> g <font color=Cyan>(</font>Right x<font color=Cyan>)</font> <font color=Red>=</font> g x-<a name="(line62)"></a>-<a name="(line63)"></a><a name="maybe"></a>maybe <font color=Red>::</font> <font color=Cyan>(</font>t <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> Maybe t <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line64)"></a>maybe <font color=Green><u>_</u></font> Nothing <font color=Red>=</font> empty-<a name="(line65)"></a>maybe f <font color=Cyan>(</font>Just x<font color=Cyan>)</font> <font color=Red>=</font> f x-<a name="(line66)"></a>-<a name="(line67)"></a><font color=Blue>--peref p = text "%" <> text p <> text ";"</font>-<a name="(line68)"></a>-<a name="(line69)"></a><font color=Blue>----</font>-<a name="(line70)"></a>-<a name="(line71)"></a><a name="document"></a>document <font color=Red>::</font> Document i <font color=Red>-></font> Doc-<a name="(line72)"></a><a name="prolog"></a>prolog <font color=Red>::</font> Prolog <font color=Red>-></font> Doc-<a name="(line73)"></a><a name="xmldecl"></a>xmldecl <font color=Red>::</font> XMLDecl <font color=Red>-></font> Doc-<a name="(line74)"></a><a name="misc"></a>misc <font color=Red>::</font> Misc <font color=Red>-></font> Doc-<a name="(line75)"></a><a name="sddecl"></a>sddecl <font color=Red>::</font> Bool <font color=Red>-></font> Doc-<a name="(line76)"></a>-<a name="(line77)"></a><a name="doctypedecl"></a>doctypedecl <font color=Red>::</font> DocTypeDecl <font color=Red>-></font> Doc-<a name="(line78)"></a><a name="markupdecl"></a>markupdecl <font color=Red>::</font> MarkupDecl <font color=Red>-></font> Doc-<a name="(line79)"></a><a name="cp"></a><font color=Blue>-- extsubset :: ExtSubset -> Doc</font>-<a name="(line80)"></a><font color=Blue>-- extsubsetdecl :: ExtSubsetDecl -> Doc</font>-<a name="(line81)"></a>cp <font color=Red>::</font> CP <font color=Red>-></font> Doc-<a name="(line82)"></a>-<a name="(line83)"></a><a name="element"></a>element <font color=Red>::</font> Element i <font color=Red>-></font> Doc-<a name="(line84)"></a><a name="attribute"></a>attribute <font color=Red>::</font> Attribute <font color=Red>-></font> Doc <font color=Cyan>--etc</font>-<a name="(line85)"></a><a name="content"></a>content <font color=Red>::</font> Content i <font color=Red>-></font> Doc-<a name="(line86)"></a>-<a name="(line87)"></a><font color=Blue>----</font>-<a name="(line88)"></a>-<a name="(line89)"></a>document <font color=Cyan>(</font>Document p <font color=Green><u>_</u></font> e m<font color=Cyan>)</font><font color=Red>=</font> prolog p <font color=Cyan>$$</font> element e <font color=Cyan>$$</font> vcat <font color=Cyan>(</font>map misc m<font color=Cyan>)</font>-<a name="(line90)"></a>prolog <font color=Cyan>(</font>Prolog x m1 dtd m2<font color=Cyan>)</font><font color=Red>=</font> maybe xmldecl x <font color=Cyan>$$</font>-<a name="(line91)"></a> vcat <font color=Cyan>(</font>map misc m1<font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line92)"></a> maybe doctypedecl dtd <font color=Cyan>$$</font>-<a name="(line93)"></a> vcat <font color=Cyan>(</font>map misc m2<font color=Cyan>)</font>-<a name="(line94)"></a>xmldecl <font color=Cyan>(</font>XMLDecl v e sd<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?xml version='"</font> <font color=Cyan><></font> text v <font color=Cyan><></font> text <font color=Magenta>"'"</font> <font color=Cyan><+></font>-<a name="(line95)"></a> maybe encodingdecl e <font color=Cyan><+></font>-<a name="(line96)"></a> maybe sddecl sd <font color=Cyan><+></font>-<a name="(line97)"></a> text <font color=Magenta>"?>"</font>-<a name="(line98)"></a>misc <font color=Cyan>(</font>Comment s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!--"</font> <font color=Cyan><+></font> text s <font color=Cyan><+></font> text <font color=Magenta>"-->"</font>-<a name="(line99)"></a>misc <font color=Cyan>(</font>PI <font color=Cyan>(</font>n<font color=Cyan>,</font>s<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> text s <font color=Cyan><+></font> text <font color=Magenta>"?>"</font>-<a name="(line100)"></a>sddecl sd <font color=Red>|</font> sd <font color=Red>=</font> text <font color=Magenta>"standalone='yes'"</font>-<a name="(line101)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"standalone='no'"</font>-<a name="(line102)"></a>doctypedecl <font color=Cyan>(</font>DTD n eid ds<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>if</u></font> null ds <font color=Green><u>then</u></font>-<a name="(line103)"></a> hd <font color=Cyan><></font> text <font color=Magenta>">"</font>-<a name="(line104)"></a> <font color=Green><u>else</u></font> hd <font color=Cyan><+></font> text <font color=Magenta>" ["</font> <font color=Cyan>$$</font>-<a name="(line105)"></a> vcat <font color=Cyan>(</font>map markupdecl ds<font color=Cyan>)</font> <font color=Cyan>$$</font> text <font color=Magenta>"]>"</font>-<a name="(line106)"></a> <font color=Green><u>where</u></font> hd <font color=Red>=</font> text <font color=Magenta>"<!DOCTYPE"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>-<a name="(line107)"></a> maybe externalid eid-<a name="(line108)"></a>markupdecl <font color=Cyan>(</font>Element e<font color=Cyan>)</font> <font color=Red>=</font> elementdecl e-<a name="(line109)"></a>markupdecl <font color=Cyan>(</font>AttList a<font color=Cyan>)</font> <font color=Red>=</font> attlistdecl a-<a name="(line110)"></a>markupdecl <font color=Cyan>(</font>Entity e<font color=Cyan>)</font> <font color=Red>=</font> entitydecl e-<a name="(line111)"></a>markupdecl <font color=Cyan>(</font>Notation n<font color=Cyan>)</font> <font color=Red>=</font> notationdecl n-<a name="(line112)"></a>markupdecl <font color=Cyan>(</font>MarkupMisc m<font color=Cyan>)</font> <font color=Red>=</font> misc m-<a name="(line113)"></a><font color=Blue>--markupdecl (MarkupPE p m) = peref p</font>-<a name="(line114)"></a><font color=Blue>-- _ (ExtSubset t ds) = maybe textdecl t $$</font>-<a name="(line115)"></a><font color=Blue>-- vcat (map extsubsetdecl ds)</font>-<a name="(line116)"></a><font color=Blue>-- _ (ExtMarkupDecl m) = markupdecl m</font>-<a name="(line117)"></a><font color=Blue>-- extsubsetdecl (ExtConditionalSect c) = conditionalsect c</font>-<a name="(line118)"></a><font color=Blue>--extsubsetdecl (ExtPEReference p e) = peref p</font>-<a name="(line119)"></a>-<a name="(line120)"></a>element <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font>-<a name="(line121)"></a> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"/>"</font>-<a name="(line122)"></a>element e<font color=Red>@</font><font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font>-<a name="(line123)"></a><font color=Blue>-- | any isText cs = text "<" <> text n <+> fsep (map attribute as) <></font>-<a name="(line124)"></a><font color=Blue>-- text ">" <> hcat (map content cs) <></font>-<a name="(line125)"></a><font color=Blue>-- text "</" <> text n <> text ">"</font>-<a name="(line126)"></a> <font color=Red>|</font> isText <font color=Cyan>(</font>head cs<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line127)"></a> text <font color=Magenta>">"</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>map content cs<font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line128)"></a> text <font color=Magenta>"</"</font> <font color=Cyan><></font> text n <font color=Cyan><></font> text <font color=Magenta>">"</font>-<a name="(line129)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>d<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>=</font> carryelem e empty-<a name="(line130)"></a> <font color=Green><u>in</u></font> d <font color=Cyan><></font> c-<a name="(line131)"></a>-<a name="(line132)"></a><a name="isText"></a>isText <font color=Red>::</font> Content t <font color=Red>-></font> Bool-<a name="(line133)"></a>isText <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True-<a name="(line134)"></a>isText <font color=Cyan>(</font>CRef <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True-<a name="(line135)"></a>isText <font color=Green><u>_</u></font> <font color=Red>=</font> False-<a name="(line136)"></a>-<a name="(line137)"></a><a name="carryelem"></a>carryelem <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font> c-<a name="(line138)"></a> <font color=Red>=</font> <font color=Cyan>(</font> c <font color=Cyan><></font>-<a name="(line139)"></a> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font>-<a name="(line140)"></a> <font color=Cyan>,</font> text <font color=Magenta>"/>"</font><font color=Cyan>)</font>-<a name="(line141)"></a>carryelem <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> c-<a name="(line142)"></a><font color=Blue>-- | any isText cs = ( c <> element e, empty)</font>-<a name="(line143)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>cs0<font color=Cyan>,</font>d0<font color=Cyan>)</font> <font color=Red>=</font> carryscan carrycontent cs <font color=Cyan>(</font>text <font color=Magenta>">"</font><font color=Cyan>)</font>-<a name="(line144)"></a> <font color=Green><u>in</u></font>-<a name="(line145)"></a> <font color=Cyan>(</font> c <font color=Cyan><></font>-<a name="(line146)"></a> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan>$$</font>-<a name="(line147)"></a> nest <font color=Cyan>(</font><font color=Magenta>2</font> <font color=Red>::</font> Int<font color=Cyan>)</font> <font color=Cyan>(</font>vcat cs0<font color=Cyan>)</font> <font color=Cyan><></font> <font color=Blue>--- $$</font>-<a name="(line148)"></a> d0 <font color=Cyan><></font> text <font color=Magenta>"</"</font> <font color=Cyan><></font> text n-<a name="(line149)"></a> <font color=Cyan>,</font> text <font color=Magenta>">"</font><font color=Cyan>)</font>-<a name="(line150)"></a><a name="carrycontent"></a>carrycontent <font color=Red>::</font> Content t <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> <font color=Cyan>(</font><font color=Red>[</font>Char<font color=Red>]</font><font color=Cyan>,</font> <font color=Red>[</font>Char<font color=Red>]</font><font color=Cyan>)</font>-<a name="(line151)"></a>carryelem <font color=Red>::</font> Element t <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> <font color=Cyan>(</font><font color=Red>[</font>Char<font color=Red>]</font><font color=Cyan>,</font> <font color=Red>[</font>Char<font color=Red>]</font><font color=Cyan>)</font>-<a name="(line152)"></a>carrycontent <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> carryelem e c-<a name="(line153)"></a>carrycontent <font color=Cyan>(</font>CString False s <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> chardata s<font color=Cyan>,</font> empty<font color=Cyan>)</font>-<a name="(line154)"></a>carrycontent <font color=Cyan>(</font>CString True s <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> cdsect s<font color=Cyan>,</font> empty<font color=Cyan>)</font>-<a name="(line155)"></a>carrycontent <font color=Cyan>(</font>CRef r <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> reference r<font color=Cyan>,</font> empty<font color=Cyan>)</font>-<a name="(line156)"></a>carrycontent <font color=Cyan>(</font>CMisc m <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> misc m<font color=Cyan>,</font> empty<font color=Cyan>)</font>-<a name="(line157)"></a>-<a name="(line158)"></a><a name="carryscan"></a>carryscan <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font>c<font color=Red>-></font><font color=Cyan>(</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-></font> c <font color=Red>-></font> <font color=Cyan>(</font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>,</font>c<font color=Cyan>)</font>-<a name="(line159)"></a>carryscan <font color=Green><u>_</u></font> [] c <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>c<font color=Cyan>)</font>-<a name="(line160)"></a>carryscan f <font color=Cyan>(</font>a<font color=Red><b>:</b></font><font color=Green><u>as</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>b<font color=Cyan>,</font> c0<font color=Cyan>)</font> <font color=Red>=</font> f a c-<a name="(line161)"></a> <font color=Cyan>(</font>bs<font color=Cyan>,</font>c1<font color=Cyan>)</font> <font color=Red>=</font> carryscan f <font color=Green><u>as</u></font> c0-<a name="(line162)"></a> <font color=Green><u>in</u></font> <font color=Cyan>(</font>b<font color=Red><b>:</b></font>bs<font color=Cyan>,</font> c1<font color=Cyan>)</font>-<a name="(line163)"></a>-<a name="(line164)"></a><font color=Blue>--carryelem e@(Elem n as cs) c</font>-<a name="(line165)"></a><font color=Blue>-- | isText (head cs) =</font>-<a name="(line166)"></a><font color=Blue>-- ( start <></font>-<a name="(line167)"></a><font color=Blue>-- text ">" <> hcat (map content cs) <> text "</" <> text n</font>-<a name="(line168)"></a><font color=Blue>-- , text ">")</font>-<a name="(line169)"></a><font color=Blue>-- | otherwise =</font>-<a name="(line170)"></a><font color=Blue>-- let (d,c0) = foldl carrycontent (start, text ">") cs in</font>-<a name="(line171)"></a><font color=Blue>-- ( d <> c0 <> text "</" <> text n</font>-<a name="(line172)"></a><font color=Blue>-- , text ">")</font>-<a name="(line173)"></a><font color=Blue>-- where start = c <> text "<" <> text n <+> fsep (map attribute as)</font>-<a name="(line174)"></a><font color=Blue>--</font>-<a name="(line175)"></a><font color=Blue>--carrycontent (d,c) (CElem e) = let (d',c') = carryelem e c in</font>-<a name="(line176)"></a><font color=Blue>-- (d $$ nest 2 d', c')</font>-<a name="(line177)"></a><font color=Blue>--carrycontent (d,c) (CString _ s) = (d <> c <> chardata s, empty)</font>-<a name="(line178)"></a><font color=Blue>--carrycontent (d,c) (CRef r) = (d <> c <> reference r,empty)</font>-<a name="(line179)"></a><font color=Blue>--carrycontent (d,c) (CMisc m) = (d $$ c <> misc m, empty)</font>-<a name="(line180)"></a>-<a name="(line181)"></a>-<a name="(line182)"></a>attribute <font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><></font> text <font color=Magenta>"="</font> <font color=Cyan><></font> attvalue v-<a name="(line183)"></a>content <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> element e-<a name="(line184)"></a>content <font color=Cyan>(</font>CString False s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> chardata s-<a name="(line185)"></a>content <font color=Cyan>(</font>CString True s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> cdsect s-<a name="(line186)"></a>content <font color=Cyan>(</font>CRef r <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> reference r-<a name="(line187)"></a>content <font color=Cyan>(</font>CMisc m <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> misc m-<a name="(line188)"></a>-<a name="(line189)"></a><a name="elementdecl"></a>elementdecl <font color=Red>::</font> ElementDecl <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line190)"></a>elementdecl <font color=Cyan>(</font>ElementDecl n cs<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ELEMENT"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>-<a name="(line191)"></a> contentspec cs <font color=Cyan><></font> text <font color=Magenta>">"</font>-<a name="(line192)"></a><a name="contentspec"></a>contentspec <font color=Red>::</font> ContentSpec <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line193)"></a>contentspec EMPTY <font color=Red>=</font> text <font color=Magenta>"EMPTY"</font>-<a name="(line194)"></a>contentspec ANY <font color=Red>=</font> text <font color=Magenta>"ANY"</font>-<a name="(line195)"></a>contentspec <font color=Cyan>(</font>Mixed m<font color=Cyan>)</font> <font color=Red>=</font> mixed m-<a name="(line196)"></a>contentspec <font color=Cyan>(</font>ContentSpec c<font color=Cyan>)</font> <font color=Red>=</font> cp c-<a name="(line197)"></a><font color=Blue>--contentspec (ContentPE p cs) = peref p</font>-<a name="(line198)"></a>cp <font color=Cyan>(</font>TagName n m<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><></font> modifier m-<a name="(line199)"></a>cp <font color=Cyan>(</font>Choice cs m<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map cp cs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line200)"></a> modifier m-<a name="(line201)"></a>cp <font color=Cyan>(</font>Seq cs m<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>","</font><font color=Cyan>)</font> <font color=Cyan>(</font>map cp cs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line202)"></a> modifier m-<a name="(line203)"></a><a name="modifier"></a><font color=Blue>--cp (CPPE p c) = peref p</font>-<a name="(line204)"></a>modifier <font color=Red>::</font> Modifier <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line205)"></a>modifier None <font color=Red>=</font> empty-<a name="(line206)"></a>modifier Query <font color=Red>=</font> text <font color=Magenta>"?"</font>-<a name="(line207)"></a>modifier Star <font color=Red>=</font> text <font color=Magenta>"*"</font>-<a name="(line208)"></a>modifier Plus <font color=Red>=</font> text <font color=Magenta>"+"</font>-<a name="(line209)"></a><a name="mixed"></a>mixed <font color=Red>::</font> Mixed <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line210)"></a>mixed PCDATA <font color=Red>=</font> text <font color=Magenta>"(#PCDATA)"</font>-<a name="(line211)"></a>mixed <font color=Cyan>(</font>PCDATAplus ns<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"(#PCDATA |"</font> <font color=Cyan><+></font>-<a name="(line212)"></a> hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map text ns<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line213)"></a> text <font color=Magenta>")*"</font>-<a name="(line214)"></a>-<a name="(line215)"></a><a name="attlistdecl"></a>attlistdecl <font color=Red>::</font> AttListDecl <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line216)"></a>attlistdecl <font color=Cyan>(</font>AttListDecl n ds<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ATTLIST"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>-<a name="(line217)"></a> fsep <font color=Cyan>(</font>map attdef ds<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>">"</font>-<a name="(line218)"></a><a name="attdef"></a>attdef <font color=Red>::</font> AttDef <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line219)"></a>attdef <font color=Cyan>(</font>AttDef n t d<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><+></font> atttype t <font color=Cyan><+></font> defaultdecl d-<a name="(line220)"></a><a name="atttype"></a>atttype <font color=Red>::</font> AttType <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line221)"></a>atttype StringType <font color=Red>=</font> text <font color=Magenta>"CDATA"</font>-<a name="(line222)"></a>atttype <font color=Cyan>(</font>TokenizedType t<font color=Cyan>)</font> <font color=Red>=</font> tokenizedtype t-<a name="(line223)"></a>atttype <font color=Cyan>(</font>EnumeratedType t<font color=Cyan>)</font> <font color=Red>=</font> enumeratedtype t-<a name="(line224)"></a><a name="tokenizedtype"></a>tokenizedtype <font color=Red>::</font> TokenizedType <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line225)"></a>tokenizedtype ID <font color=Red>=</font> text <font color=Magenta>"ID"</font>-<a name="(line226)"></a>tokenizedtype IDREF <font color=Red>=</font> text <font color=Magenta>"IDREF"</font>-<a name="(line227)"></a>tokenizedtype IDREFS <font color=Red>=</font> text <font color=Magenta>"IDREFS"</font>-<a name="(line228)"></a>tokenizedtype ENTITY <font color=Red>=</font> text <font color=Magenta>"ENTITY"</font>-<a name="(line229)"></a>tokenizedtype ENTITIES <font color=Red>=</font> text <font color=Magenta>"ENTITIES"</font>-<a name="(line230)"></a>tokenizedtype NMTOKEN <font color=Red>=</font> text <font color=Magenta>"NMTOKEN"</font>-<a name="(line231)"></a>tokenizedtype NMTOKENS <font color=Red>=</font> text <font color=Magenta>"NMTOKENS"</font>-<a name="(line232)"></a><a name="enumeratedtype"></a>enumeratedtype <font color=Red>::</font> EnumeratedType <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line233)"></a>enumeratedtype <font color=Cyan>(</font>NotationType n<font color=Cyan>)</font><font color=Red>=</font> notationtype n-<a name="(line234)"></a>enumeratedtype <font color=Cyan>(</font>Enumeration e<font color=Cyan>)</font> <font color=Red>=</font> enumeration e-<a name="(line235)"></a><a name="notationtype"></a>notationtype <font color=Red>::</font> <font color=Red>[</font><font color=Red>[</font>Char<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line236)"></a>notationtype ns <font color=Red>=</font> text <font color=Magenta>"NOTATION"</font> <font color=Cyan><+></font>-<a name="(line237)"></a> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map text ns<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line238)"></a><a name="enumeration"></a>enumeration <font color=Red>::</font> <font color=Red>[</font><font color=Red>[</font>Char<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line239)"></a>enumeration ns <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map nmtoken ns<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line240)"></a><a name="defaultdecl"></a>defaultdecl <font color=Red>::</font> DefaultDecl <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line241)"></a>defaultdecl REQUIRED <font color=Red>=</font> text <font color=Magenta>"#REQUIRED"</font>-<a name="(line242)"></a>defaultdecl IMPLIED <font color=Red>=</font> text <font color=Magenta>"#IMPLIED"</font>-<a name="(line243)"></a>defaultdecl <font color=Cyan>(</font>DefaultTo a f<font color=Cyan>)</font> <font color=Red>=</font> maybe <font color=Cyan>(</font>const <font color=Cyan>(</font>text <font color=Magenta>"#FIXED"</font><font color=Cyan>)</font><font color=Cyan>)</font> f <font color=Cyan><+></font> attvalue a-<a name="(line244)"></a><a name="reference"></a><font color=Blue>-- _ (IncludeSect i)= text "<![INCLUDE [" <+></font>-<a name="(line245)"></a><font color=Blue>-- vcat (map extsubsetdecl i) <+> text "]]>"</font>-<a name="(line246)"></a><font color=Blue>-- conditionalsect (IgnoreSect i) = text "<![IGNORE [" <+></font>-<a name="(line247)"></a><font color=Blue>-- fsep (map ignoresectcontents i) <+> text "]]>"</font>-<a name="(line248)"></a><font color=Blue>-- _ (Ignore) = empty</font>-<a name="(line249)"></a><font color=Blue>-- _ (IgnoreSectContents i is)</font>-<a name="(line250)"></a><font color=Blue>-- = ignore i <+> vcat (map internal is)</font>-<a name="(line251)"></a><font color=Blue>-- where internal (ics,i) = text "<![[" <+></font>-<a name="(line252)"></a><font color=Blue>-- ignoresectcontents ics <+></font>-<a name="(line253)"></a><font color=Blue>-- text "]]>" <+> ignore i</font>-<a name="(line254)"></a>reference <font color=Red>::</font> Reference <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line255)"></a>reference <font color=Cyan>(</font>RefEntity er<font color=Cyan>)</font> <font color=Red>=</font> entityref er-<a name="(line256)"></a>reference <font color=Cyan>(</font>RefChar cr<font color=Cyan>)</font> <font color=Red>=</font> charref cr-<a name="(line257)"></a><a name="entityref"></a>entityref <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line258)"></a>entityref n <font color=Red>=</font> text <font color=Magenta>"&"</font> <font color=Cyan><></font> text n <font color=Cyan><></font> text <font color=Magenta>";"</font>-<a name="(line259)"></a><a name="charref"></a>charref <font color=Red>::</font> <font color=Cyan>(</font>Show a<font color=Cyan>)</font> <font color=Red>=></font> a <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line260)"></a>charref c <font color=Red>=</font> text <font color=Magenta>"&#"</font> <font color=Cyan><></font> text <font color=Cyan>(</font>show c<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>";"</font>-<a name="(line261)"></a><a name="entitydecl"></a>entitydecl <font color=Red>::</font> EntityDecl <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line262)"></a>entitydecl <font color=Cyan>(</font>EntityGEDecl d<font color=Cyan>)</font> <font color=Red>=</font> gedecl d-<a name="(line263)"></a>entitydecl <font color=Cyan>(</font>EntityPEDecl d<font color=Cyan>)</font> <font color=Red>=</font> pedecl d-<a name="(line264)"></a><a name="gedecl"></a>gedecl <font color=Red>::</font> GEDecl <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line265)"></a>gedecl <font color=Cyan>(</font>GEDecl n ed<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ENTITY"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font> entitydef ed <font color=Cyan><></font>-<a name="(line266)"></a> text <font color=Magenta>">"</font>-<a name="(line267)"></a><a name="pedecl"></a>pedecl <font color=Red>::</font> PEDecl <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line268)"></a>pedecl <font color=Cyan>(</font>PEDecl n pd<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ENTITY %"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> pedef pd <font color=Cyan><></font>-<a name="(line269)"></a> text <font color=Magenta>">"</font>-<a name="(line270)"></a><a name="entitydef"></a>entitydef <font color=Red>::</font> EntityDef <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line271)"></a>entitydef <font color=Cyan>(</font>DefEntityValue ew<font color=Cyan>)</font> <font color=Red>=</font> entityvalue ew-<a name="(line272)"></a>entitydef <font color=Cyan>(</font>DefExternalID i nd<font color=Cyan>)</font> <font color=Red>=</font> externalid i <font color=Cyan><+></font> maybe ndatadecl nd-<a name="(line273)"></a><a name="pedef"></a>pedef <font color=Red>::</font> PEDef <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line274)"></a>pedef <font color=Cyan>(</font>PEDefEntityValue ew<font color=Cyan>)</font> <font color=Red>=</font> entityvalue ew-<a name="(line275)"></a>pedef <font color=Cyan>(</font>PEDefExternalID eid<font color=Cyan>)</font> <font color=Red>=</font> externalid eid-<a name="(line276)"></a><a name="externalid"></a>externalid <font color=Red>::</font> ExternalID <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line277)"></a>externalid <font color=Cyan>(</font>SYSTEM sl<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"SYSTEM"</font> <font color=Cyan><+></font> systemliteral sl-<a name="(line278)"></a>externalid <font color=Cyan>(</font>PUBLIC i sl<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"PUBLIC"</font> <font color=Cyan><+></font> pubidliteral i <font color=Cyan><+></font>-<a name="(line279)"></a> systemliteral sl-<a name="(line280)"></a><a name="ndatadecl"></a>ndatadecl <font color=Red>::</font> NDataDecl <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line281)"></a>ndatadecl <font color=Cyan>(</font>NDATA n<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"NDATA"</font> <font color=Cyan><+></font> text n-<a name="(line282)"></a><a name="notationdecl"></a><font color=Blue>-- _ (TextDecl vi ed) = text "<?xml" <+> maybe text vi <+></font>-<a name="(line283)"></a><font color=Blue>-- encodingdecl ed <> text "?>"</font>-<a name="(line284)"></a><font color=Blue>-- _ (ExtParsedEnt t c)= maybe textdecl t <+> content c</font>-<a name="(line285)"></a><font color=Blue>-- _ (ExtPE t esd) = maybe textdecl t <+></font>-<a name="(line286)"></a><font color=Blue>-- vcat (map extsubsetdecl esd)</font>-<a name="(line287)"></a>notationdecl <font color=Red>::</font> NotationDecl <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line288)"></a>notationdecl <font color=Cyan>(</font>NOTATION n e<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!NOTATION"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>-<a name="(line289)"></a> either externalid publicid e <font color=Cyan><></font>-<a name="(line290)"></a> text <font color=Magenta>">"</font>-<a name="(line291)"></a><a name="publicid"></a>publicid <font color=Red>::</font> PublicID <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line292)"></a>publicid <font color=Cyan>(</font>PUBLICID p<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"PUBLICID"</font> <font color=Cyan><+></font> pubidliteral p-<a name="(line293)"></a><a name="encodingdecl"></a>encodingdecl <font color=Red>::</font> EncodingDecl <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line294)"></a>encodingdecl <font color=Cyan>(</font>EncodingDecl s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"encoding='"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>-<a name="(line295)"></a><a name="nmtoken"></a>nmtoken <font color=Red>::</font> t <font color=Red>-></font> t-<a name="(line296)"></a>nmtoken s <font color=Red>=</font> text s-<a name="(line297)"></a><a name="attvalue"></a>attvalue <font color=Red>::</font> AttValue <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line298)"></a>attvalue <font color=Cyan>(</font>AttValue esr<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font>-<a name="(line299)"></a> hcat <font color=Cyan>(</font>map <font color=Cyan>(</font>either text reference<font color=Cyan>)</font> esr<font color=Cyan>)</font> <font color=Cyan><></font>-<a name="(line300)"></a> text <font color=Magenta>"\""</font>-<a name="(line301)"></a><a name="entityvalue"></a>entityvalue <font color=Red>::</font> EntityValue <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line302)"></a>entityvalue <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font>-<a name="(line303)"></a> <font color=Red>|</font> containsDoubleQuote evs <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>map ev evs<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"'"</font>-<a name="(line304)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>map ev evs<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"\""</font>-<a name="(line305)"></a><a name="ev"></a>ev <font color=Red>::</font> EV <font color=Red>-></font> String-<a name="(line306)"></a>ev <font color=Cyan>(</font>EVString s<font color=Cyan>)</font> <font color=Red>=</font> text s-<a name="(line307)"></a><font color=Blue>--ev (EVPERef p e) = peref p</font>-<a name="(line308)"></a>ev <font color=Cyan>(</font>EVRef r<font color=Cyan>)</font> <font color=Red>=</font> reference r-<a name="(line309)"></a><a name="pubidliteral"></a>pubidliteral <font color=Red>::</font> PubidLiteral <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line310)"></a>pubidliteral <font color=Cyan>(</font>PubidLiteral s<font color=Cyan>)</font>-<a name="(line311)"></a> <font color=Red>|</font> <font color=Magenta>'"'</font> <font color=Cyan>`elem`</font> s <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>-<a name="(line312)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"\""</font>-<a name="(line313)"></a><a name="systemliteral"></a>systemliteral <font color=Red>::</font> SystemLiteral <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line314)"></a>systemliteral <font color=Cyan>(</font>SystemLiteral s<font color=Cyan>)</font>-<a name="(line315)"></a> <font color=Red>|</font> <font color=Magenta>'"'</font> <font color=Cyan>`elem`</font> s <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>-<a name="(line316)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"\""</font>-<a name="(line317)"></a><a name="chardata"></a>chardata <font color=Red>::</font> t <font color=Red>-></font> t-<a name="(line318)"></a>chardata s <font color=Red>=</font> <font color=Blue>{-if all isSpace s then empty else-}</font> text s-<a name="(line319)"></a><a name="cdsect"></a>cdsect <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>-<a name="(line320)"></a>cdsect c <font color=Red>=</font> text <font color=Magenta>"<![CDATA["</font> <font color=Cyan><></font> chardata c <font color=Cyan><></font> text <font color=Magenta>"]]>"</font>-<a name="(line321)"></a>-<a name="(line322)"></a><a name="containsDoubleQuote"></a><font color=Blue>----</font>-<a name="(line323)"></a>containsDoubleQuote <font color=Red>::</font> <font color=Red>[</font>EV<font color=Red>]</font> <font color=Red>-></font> Bool-<a name="(line324)"></a>containsDoubleQuote evs <font color=Red>=</font> any csq evs-<a name="(line325)"></a> <font color=Green><u>where</u></font> csq <font color=Cyan>(</font>EVString s<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>'"'</font> <font color=Cyan>`elem`</font> s-<a name="(line326)"></a> csq <font color=Green><u>_</u></font> <font color=Red>=</font> False-<a name="(line327)"></a>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/ShowXmlLazy.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>ShowXmlLazy <font color=Cyan>(</font>showXmlLazy<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-2"></a>+<a name="line-3"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-4"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>TypeMapping <font color=Blue>-- (toHType, toDTD, Tuple(), Defined, showHType)</font>+<a name="line-5"></a>+<a name="line-6"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>XmlContent <font color=Green><u>as</u></font> X+<a name="line-7"></a><font color=Green><u>import</u></font> Prelude hiding <font color=Cyan>(</font>maybe<font color=Cyan>,</font>either<font color=Cyan>)</font>+<a name="line-8"></a><font color=Green><u>import</u></font> Maybe hiding <font color=Cyan>(</font>maybe<font color=Cyan>)</font>+<a name="line-9"></a><font color=Green><u>import</u></font> Data<font color=Cyan>.</font>List+<a name="line-10"></a>+<a name="line-11"></a><a name="showXmlLazy"></a><font color=Blue>-- | Convert a fully-typed XML document to a string (without DTD).</font>+<a name="line-12"></a><font color=Blue>showXmlLazy</font> <font color=Red>::</font> X<font color=Cyan>.</font>XmlContent a <font color=Red>=></font> Bool <font color=Red>-></font> a <font color=Red>-></font> String+<a name="line-13"></a><font color=Blue>showXmlLazy</font> dtd x <font color=Red>=</font>+<a name="line-14"></a> <font color=Green><u>case</u></font> X<font color=Cyan>.</font>toContents x <font color=Green><u>of</u></font>+<a name="line-15"></a> <font color=Red>[</font>CElem <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Red>]</font> <font color=Red>-></font> document <font color=Cyan>$</font> toXmlLazy dtd x+<a name="line-16"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> <font color=Magenta>""</font>+<a name="line-17"></a>+<a name="line-18"></a>+<a name="line-19"></a><a name="toXmlLazy"></a><font color=Blue>-- | Convert a fully-typed XML document to a string (with or without DTD).</font>+<a name="line-20"></a><font color=Blue>toXmlLazy</font> <font color=Red>::</font> X<font color=Cyan>.</font>XmlContent a <font color=Red>=></font> Bool <font color=Red>-></font> a <font color=Red>-></font> Document ()+<a name="line-21"></a><font color=Blue>toXmlLazy</font> dtd value <font color=Red>=</font>+<a name="line-22"></a> <font color=Green><u>let</u></font> ht <font color=Red>=</font> toHType value <font color=Green><u>in</u></font>+<a name="line-23"></a> Document <font color=Cyan>(</font>Prolog <font color=Cyan>(</font>Just <font color=Cyan>(</font>XMLDecl <font color=Magenta>"1.0"</font> Nothing Nothing<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-24"></a> [] <font color=Cyan>(</font><font color=Green><u>if</u></font> dtd <font color=Green><u>then</u></font> Just <font color=Cyan>(</font>toDTD ht<font color=Cyan>)</font> <font color=Green><u>else</u></font> Nothing<font color=Cyan>)</font> []<font color=Cyan>)</font>+<a name="line-25"></a> emptyST+<a name="line-26"></a> <font color=Cyan>(</font> <font color=Green><u>case</u></font> <font color=Cyan>(</font>ht<font color=Cyan>,</font> X<font color=Cyan>.</font>toContents value<font color=Cyan>)</font> <font color=Green><u>of</u></font>+<a name="line-27"></a> <font color=Cyan>(</font>Tuple <font color=Green><u>_</u></font><font color=Cyan>,</font> cs<font color=Cyan>)</font> <font color=Red>-></font> Elem <font color=Cyan>(</font>showHType ht <font color=Magenta>""</font><font color=Cyan>)</font> [] cs+<a name="line-28"></a> <font color=Cyan>(</font>Defined <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>,</font> cs<font color=Cyan>)</font> <font color=Red>-></font> Elem <font color=Cyan>(</font>showHType ht <font color=Magenta>"-XML"</font><font color=Cyan>)</font> [] cs+<a name="line-29"></a> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font> <font color=Red>[</font>CElem e ()<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> e <font color=Cyan>)</font>+<a name="line-30"></a> []+<a name="line-31"></a>+<a name="line-32"></a>+<a name="line-33"></a>+<a name="line-34"></a>+<a name="line-35"></a><a name="Doc"></a><font color=Green><u>type</u></font> Doc <font color=Red>=</font> String+<a name="line-36"></a><a name="empty"></a><font color=Blue>empty</font> <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-37"></a><font color=Blue>empty</font> <font color=Red>=</font> <font color=Magenta>""</font>+<a name="line-38"></a><a name="$$"></a><font color=Cyan>(</font><font color=Cyan>$$</font><font color=Cyan>)</font> <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-39"></a><font color=Cyan>(</font><font color=Cyan>$$</font><font color=Cyan>)</font> a b <font color=Red>=</font> a <font color=Cyan>++</font> <font color=Magenta>"\n"</font> <font color=Cyan>++</font> b+<a name="line-40"></a><a name="vcat"></a><font color=Blue>vcat</font> <font color=Red>::</font> <font color=Red>[</font><font color=Red>[</font>Char<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-41"></a><font color=Blue>vcat</font> a <font color=Red>=</font> foldr <font color=Cyan>(</font><font color=Cyan>$$</font><font color=Cyan>)</font> [] a+<a name="line-42"></a><a name="hcat"></a><font color=Blue>hcat</font> <font color=Red>::</font> <font color=Red>[</font><font color=Red>[</font>a<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>a<font color=Red>]</font>+<a name="line-43"></a><font color=Blue>hcat</font> <font color=Red>=</font> concat+<a name="line-44"></a><a name="<>"></a><font color=Cyan>(</font><font color=Cyan><></font><font color=Cyan>)</font> <font color=Red>::</font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>a<font color=Red>]</font>+<a name="line-45"></a><font color=Cyan>(</font><font color=Cyan><></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-46"></a><a name="<+>"></a><font color=Cyan>(</font><font color=Cyan><+></font><font color=Cyan>)</font> <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-47"></a><font color=Cyan>(</font><font color=Cyan><+></font><font color=Cyan>)</font> a b <font color=Red>=</font> a <font color=Cyan>++</font> <font color=Magenta>" "</font> <font color=Cyan>++</font> b+<a name="line-48"></a><a name="fsep"></a><font color=Blue>fsep</font> <font color=Red>::</font> <font color=Red>[</font><font color=Red>[</font>Char<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-49"></a><font color=Blue>fsep</font> <font color=Red>=</font> vcat+<a name="line-50"></a><a name="text"></a><font color=Blue>text</font> <font color=Red>::</font> t <font color=Red>-></font> t+<a name="line-51"></a><font color=Blue>text</font> string <font color=Red>=</font> string+<a name="line-52"></a><a name="parens"></a><font color=Blue>parens</font> <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-53"></a><font color=Blue>parens</font> string <font color=Red>=</font> <font color=Magenta>"("</font><font color=Cyan>++</font>string<font color=Cyan>++</font><font color=Magenta>")"</font>+<a name="line-54"></a><a name="nest"></a><font color=Blue>nest</font> <font color=Red>::</font> t <font color=Red>-></font> t1 <font color=Red>-></font> t1+<a name="line-55"></a><font color=Blue>nest</font> <font color=Green><u>_</u></font> string <font color=Red>=</font> string+<a name="line-56"></a>+<a name="line-57"></a>+<a name="line-58"></a>+<a name="line-59"></a><a name="either"></a><font color=Blue>either</font> <font color=Red>::</font> <font color=Cyan>(</font>t <font color=Red>-></font> t1<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>t2 <font color=Red>-></font> t1<font color=Cyan>)</font> <font color=Red>-></font> Either t t2 <font color=Red>-></font> t1+<a name="line-60"></a><font color=Blue>either</font> f <font color=Green><u>_</u></font> <font color=Cyan>(</font>Left x<font color=Cyan>)</font> <font color=Red>=</font> f x+<a name="line-61"></a><font color=Blue>either</font> <font color=Green><u>_</u></font> g <font color=Cyan>(</font>Right x<font color=Cyan>)</font> <font color=Red>=</font> g x+<a name="line-62"></a>+<a name="line-63"></a><a name="maybe"></a><font color=Blue>maybe</font> <font color=Red>::</font> <font color=Cyan>(</font>t <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> Maybe t <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-64"></a><font color=Blue>maybe</font> <font color=Green><u>_</u></font> Nothing <font color=Red>=</font> empty+<a name="line-65"></a><font color=Blue>maybe</font> f <font color=Cyan>(</font>Just x<font color=Cyan>)</font> <font color=Red>=</font> f x+<a name="line-66"></a>+<a name="line-67"></a><font color=Blue>--peref p = text "%" <> text p <> text ";"</font>+<a name="line-68"></a>+<a name="line-69"></a><font color=Blue>----</font>+<a name="line-70"></a>+<a name="line-71"></a><a name="document"></a><font color=Blue>document</font> <font color=Red>::</font> Document i <font color=Red>-></font> Doc+<a name="line-72"></a><a name="prolog"></a><font color=Blue>prolog</font> <font color=Red>::</font> Prolog <font color=Red>-></font> Doc+<a name="line-73"></a><a name="xmldecl"></a><font color=Blue>xmldecl</font> <font color=Red>::</font> XMLDecl <font color=Red>-></font> Doc+<a name="line-74"></a><a name="misc"></a><font color=Blue>misc</font> <font color=Red>::</font> Misc <font color=Red>-></font> Doc+<a name="line-75"></a><a name="sddecl"></a><font color=Blue>sddecl</font> <font color=Red>::</font> Bool <font color=Red>-></font> Doc+<a name="line-76"></a>+<a name="line-77"></a><a name="doctypedecl"></a><font color=Blue>doctypedecl</font> <font color=Red>::</font> DocTypeDecl <font color=Red>-></font> Doc+<a name="line-78"></a><a name="markupdecl"></a><font color=Blue>markupdecl</font> <font color=Red>::</font> MarkupDecl <font color=Red>-></font> Doc+<a name="line-79"></a><a name="cp"></a><font color=Blue>-- extsubset :: ExtSubset -> Doc</font>+<a name="line-80"></a><font color=Blue>-- extsubsetdecl :: ExtSubsetDecl -> Doc</font>+<a name="line-81"></a><font color=Blue>cp</font> <font color=Red>::</font> CP <font color=Red>-></font> Doc+<a name="line-82"></a>+<a name="line-83"></a><a name="element"></a><font color=Blue>element</font> <font color=Red>::</font> Element i <font color=Red>-></font> Doc+<a name="line-84"></a><a name="attribute"></a><font color=Blue>attribute</font> <font color=Red>::</font> Attribute <font color=Red>-></font> Doc <font color=Cyan>--etc</font>+<a name="line-85"></a><a name="content"></a><font color=Blue>content</font> <font color=Red>::</font> Content i <font color=Red>-></font> Doc+<a name="line-86"></a>+<a name="line-87"></a><font color=Blue>----</font>+<a name="line-88"></a>+<a name="line-89"></a><font color=Blue>document</font> <font color=Cyan>(</font>Document p <font color=Green><u>_</u></font> e m<font color=Cyan>)</font><font color=Red>=</font> prolog p <font color=Cyan>$$</font> element e <font color=Cyan>$$</font> vcat <font color=Cyan>(</font>map misc m<font color=Cyan>)</font>+<a name="line-90"></a><font color=Blue>prolog</font> <font color=Cyan>(</font>Prolog x m1 dtd m2<font color=Cyan>)</font><font color=Red>=</font> maybe xmldecl x <font color=Cyan>$$</font>+<a name="line-91"></a> vcat <font color=Cyan>(</font>map misc m1<font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-92"></a> maybe doctypedecl dtd <font color=Cyan>$$</font>+<a name="line-93"></a> vcat <font color=Cyan>(</font>map misc m2<font color=Cyan>)</font>+<a name="line-94"></a><font color=Blue>xmldecl</font> <font color=Cyan>(</font>XMLDecl v e sd<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?xml version='"</font> <font color=Cyan><></font> text v <font color=Cyan><></font> text <font color=Magenta>"'"</font> <font color=Cyan><+></font>+<a name="line-95"></a> maybe encodingdecl e <font color=Cyan><+></font>+<a name="line-96"></a> maybe sddecl sd <font color=Cyan><+></font>+<a name="line-97"></a> text <font color=Magenta>"?>"</font>+<a name="line-98"></a><font color=Blue>misc</font> <font color=Cyan>(</font>Comment s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!--"</font> <font color=Cyan><+></font> text s <font color=Cyan><+></font> text <font color=Magenta>"-->"</font>+<a name="line-99"></a><font color=Blue>misc</font> <font color=Cyan>(</font>PI <font color=Cyan>(</font>n<font color=Cyan>,</font>s<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<?"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> text s <font color=Cyan><+></font> text <font color=Magenta>"?>"</font>+<a name="line-100"></a><font color=Blue>sddecl</font> sd <font color=Red>|</font> sd <font color=Red>=</font> text <font color=Magenta>"standalone='yes'"</font>+<a name="line-101"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"standalone='no'"</font>+<a name="line-102"></a><font color=Blue>doctypedecl</font> <font color=Cyan>(</font>DTD n eid ds<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>if</u></font> null ds <font color=Green><u>then</u></font>+<a name="line-103"></a> hd <font color=Cyan><></font> text <font color=Magenta>">"</font>+<a name="line-104"></a> <font color=Green><u>else</u></font> hd <font color=Cyan><+></font> text <font color=Magenta>" ["</font> <font color=Cyan>$$</font>+<a name="line-105"></a> vcat <font color=Cyan>(</font>map markupdecl ds<font color=Cyan>)</font> <font color=Cyan>$$</font> text <font color=Magenta>"]>"</font>+<a name="line-106"></a> <font color=Green><u>where</u></font> hd <font color=Red>=</font> text <font color=Magenta>"<!DOCTYPE"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>+<a name="line-107"></a> maybe externalid eid+<a name="line-108"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>Element e<font color=Cyan>)</font> <font color=Red>=</font> elementdecl e+<a name="line-109"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>AttList a<font color=Cyan>)</font> <font color=Red>=</font> attlistdecl a+<a name="line-110"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>Entity e<font color=Cyan>)</font> <font color=Red>=</font> entitydecl e+<a name="line-111"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>Notation n<font color=Cyan>)</font> <font color=Red>=</font> notationdecl n+<a name="line-112"></a><font color=Blue>markupdecl</font> <font color=Cyan>(</font>MarkupMisc m<font color=Cyan>)</font> <font color=Red>=</font> misc m+<a name="line-113"></a><font color=Blue>--markupdecl (MarkupPE p m) = peref p</font>+<a name="line-114"></a><font color=Blue>-- _ (ExtSubset t ds) = maybe textdecl t $$</font>+<a name="line-115"></a><font color=Blue>-- vcat (map extsubsetdecl ds)</font>+<a name="line-116"></a><font color=Blue>-- _ (ExtMarkupDecl m) = markupdecl m</font>+<a name="line-117"></a><font color=Blue>-- extsubsetdecl (ExtConditionalSect c) = conditionalsect c</font>+<a name="line-118"></a><font color=Blue>--extsubsetdecl (ExtPEReference p e) = peref p</font>+<a name="line-119"></a>+<a name="line-120"></a><font color=Blue>element</font> <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font>+<a name="line-121"></a> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"/>"</font>+<a name="line-122"></a><font color=Blue>element</font> e<font color=Red>@</font><font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font>+<a name="line-123"></a><font color=Blue>-- | any isText cs = text "<" <> text n <+> fsep (map attribute as) <></font>+<a name="line-124"></a><font color=Blue>-- text ">" <> hcat (map content cs) <></font>+<a name="line-125"></a><font color=Blue>-- text "</" <> text n <> text ">"</font>+<a name="line-126"></a> <font color=Red>|</font> isText <font color=Cyan>(</font>head cs<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-127"></a> text <font color=Magenta>">"</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>map content cs<font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-128"></a> text <font color=Magenta>"</"</font> <font color=Cyan><></font> text n <font color=Cyan><></font> text <font color=Magenta>">"</font>+<a name="line-129"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>d<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>=</font> carryelem e empty+<a name="line-130"></a> <font color=Green><u>in</u></font> d <font color=Cyan><></font> c+<a name="line-131"></a>+<a name="line-132"></a><a name="isText"></a><font color=Blue>isText</font> <font color=Red>::</font> Content t <font color=Red>-></font> Bool+<a name="line-133"></a><font color=Blue>isText</font> <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True+<a name="line-134"></a><font color=Blue>isText</font> <font color=Cyan>(</font>CRef <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True+<a name="line-135"></a><font color=Blue>isText</font> <font color=Green><u>_</u></font> <font color=Red>=</font> False+<a name="line-136"></a>+<a name="line-137"></a><a name="carryelem"></a><font color=Blue>carryelem</font> <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> []<font color=Cyan>)</font> c+<a name="line-138"></a> <font color=Red>=</font> <font color=Cyan>(</font> c <font color=Cyan><></font>+<a name="line-139"></a> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font>+<a name="line-140"></a> <font color=Cyan>,</font> text <font color=Magenta>"/>"</font><font color=Cyan>)</font>+<a name="line-141"></a><font color=Blue>carryelem</font> <font color=Cyan>(</font>Elem n <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> c+<a name="line-142"></a><font color=Blue>-- | any isText cs = ( c <> element e, empty)</font>+<a name="line-143"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>cs0<font color=Cyan>,</font>d0<font color=Cyan>)</font> <font color=Red>=</font> carryscan carrycontent cs <font color=Cyan>(</font>text <font color=Magenta>">"</font><font color=Cyan>)</font>+<a name="line-144"></a> <font color=Green><u>in</u></font>+<a name="line-145"></a> <font color=Cyan>(</font> c <font color=Cyan><></font>+<a name="line-146"></a> text <font color=Magenta>"<"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> fsep <font color=Cyan>(</font>map attribute <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Cyan>$$</font>+<a name="line-147"></a> nest <font color=Cyan>(</font><font color=Magenta>2</font> <font color=Red>::</font> Int<font color=Cyan>)</font> <font color=Cyan>(</font>vcat cs0<font color=Cyan>)</font> <font color=Cyan><></font> <font color=Blue>--- $$</font>+<a name="line-148"></a> d0 <font color=Cyan><></font> text <font color=Magenta>"</"</font> <font color=Cyan><></font> text n+<a name="line-149"></a> <font color=Cyan>,</font> text <font color=Magenta>">"</font><font color=Cyan>)</font>+<a name="line-150"></a><a name="carrycontent"></a><font color=Blue>carrycontent</font> <font color=Red>::</font> Content t <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> <font color=Cyan>(</font><font color=Red>[</font>Char<font color=Red>]</font><font color=Cyan>,</font> <font color=Red>[</font>Char<font color=Red>]</font><font color=Cyan>)</font>+<a name="line-151"></a><font color=Blue>carryelem</font> <font color=Red>::</font> Element t <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> <font color=Cyan>(</font><font color=Red>[</font>Char<font color=Red>]</font><font color=Cyan>,</font> <font color=Red>[</font>Char<font color=Red>]</font><font color=Cyan>)</font>+<a name="line-152"></a><font color=Blue>carrycontent</font> <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> carryelem e c+<a name="line-153"></a><font color=Blue>carrycontent</font> <font color=Cyan>(</font>CString False s <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> chardata s<font color=Cyan>,</font> empty<font color=Cyan>)</font>+<a name="line-154"></a><font color=Blue>carrycontent</font> <font color=Cyan>(</font>CString True s <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> cdsect s<font color=Cyan>,</font> empty<font color=Cyan>)</font>+<a name="line-155"></a><font color=Blue>carrycontent</font> <font color=Cyan>(</font>CRef r <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> reference r<font color=Cyan>,</font> empty<font color=Cyan>)</font>+<a name="line-156"></a><font color=Blue>carrycontent</font> <font color=Cyan>(</font>CMisc m <font color=Green><u>_</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Cyan>(</font>c <font color=Cyan><></font> misc m<font color=Cyan>,</font> empty<font color=Cyan>)</font>+<a name="line-157"></a>+<a name="line-158"></a><a name="carryscan"></a><font color=Blue>carryscan</font> <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font>c<font color=Red>-></font><font color=Cyan>(</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-></font> c <font color=Red>-></font> <font color=Cyan>(</font><font color=Red>[</font>b<font color=Red>]</font><font color=Cyan>,</font>c<font color=Cyan>)</font>+<a name="line-159"></a><font color=Blue>carryscan</font> <font color=Green><u>_</u></font> [] c <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>c<font color=Cyan>)</font>+<a name="line-160"></a><font color=Blue>carryscan</font> f <font color=Cyan>(</font>a<font color=Red><b>:</b></font><font color=Green><u>as</u></font><font color=Cyan>)</font> c <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>b<font color=Cyan>,</font> c0<font color=Cyan>)</font> <font color=Red>=</font> f a c+<a name="line-161"></a> <font color=Cyan>(</font>bs<font color=Cyan>,</font>c1<font color=Cyan>)</font> <font color=Red>=</font> carryscan f <font color=Green><u>as</u></font> c0+<a name="line-162"></a> <font color=Green><u>in</u></font> <font color=Cyan>(</font>b<font color=Red><b>:</b></font>bs<font color=Cyan>,</font> c1<font color=Cyan>)</font>+<a name="line-163"></a>+<a name="line-164"></a><font color=Blue>--carryelem e@(Elem n as cs) c</font>+<a name="line-165"></a><font color=Blue>-- | isText (head cs) =</font>+<a name="line-166"></a><font color=Blue>-- ( start <></font>+<a name="line-167"></a><font color=Blue>-- text ">" <> hcat (map content cs) <> text "</" <> text n</font>+<a name="line-168"></a><font color=Blue>-- , text ">")</font>+<a name="line-169"></a><font color=Blue>-- | otherwise =</font>+<a name="line-170"></a><font color=Blue>-- let (d,c0) = foldl carrycontent (start, text ">") cs in</font>+<a name="line-171"></a><font color=Blue>-- ( d <> c0 <> text "</" <> text n</font>+<a name="line-172"></a><font color=Blue>-- , text ">")</font>+<a name="line-173"></a><font color=Blue>-- where start = c <> text "<" <> text n <+> fsep (map attribute as)</font>+<a name="line-174"></a><font color=Blue>--</font>+<a name="line-175"></a><font color=Blue>--carrycontent (d,c) (CElem e) = let (d',c') = carryelem e c in</font>+<a name="line-176"></a><font color=Blue>-- (d $$ nest 2 d', c')</font>+<a name="line-177"></a><font color=Blue>--carrycontent (d,c) (CString _ s) = (d <> c <> chardata s, empty)</font>+<a name="line-178"></a><font color=Blue>--carrycontent (d,c) (CRef r) = (d <> c <> reference r,empty)</font>+<a name="line-179"></a><font color=Blue>--carrycontent (d,c) (CMisc m) = (d $$ c <> misc m, empty)</font>+<a name="line-180"></a>+<a name="line-181"></a>+<a name="line-182"></a><font color=Blue>attribute</font> <font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><></font> text <font color=Magenta>"="</font> <font color=Cyan><></font> attvalue v+<a name="line-183"></a><font color=Blue>content</font> <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> element e+<a name="line-184"></a><font color=Blue>content</font> <font color=Cyan>(</font>CString False s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> chardata s+<a name="line-185"></a><font color=Blue>content</font> <font color=Cyan>(</font>CString True s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> cdsect s+<a name="line-186"></a><font color=Blue>content</font> <font color=Cyan>(</font>CRef r <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> reference r+<a name="line-187"></a><font color=Blue>content</font> <font color=Cyan>(</font>CMisc m <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> misc m+<a name="line-188"></a>+<a name="line-189"></a><a name="elementdecl"></a><font color=Blue>elementdecl</font> <font color=Red>::</font> ElementDecl <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-190"></a><font color=Blue>elementdecl</font> <font color=Cyan>(</font>ElementDecl n cs<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ELEMENT"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>+<a name="line-191"></a> contentspec cs <font color=Cyan><></font> text <font color=Magenta>">"</font>+<a name="line-192"></a><a name="contentspec"></a><font color=Blue>contentspec</font> <font color=Red>::</font> ContentSpec <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-193"></a><font color=Blue>contentspec</font> EMPTY <font color=Red>=</font> text <font color=Magenta>"EMPTY"</font>+<a name="line-194"></a><font color=Blue>contentspec</font> ANY <font color=Red>=</font> text <font color=Magenta>"ANY"</font>+<a name="line-195"></a><font color=Blue>contentspec</font> <font color=Cyan>(</font>Mixed m<font color=Cyan>)</font> <font color=Red>=</font> mixed m+<a name="line-196"></a><font color=Blue>contentspec</font> <font color=Cyan>(</font>ContentSpec c<font color=Cyan>)</font> <font color=Red>=</font> cp c+<a name="line-197"></a><font color=Blue>--contentspec (ContentPE p cs) = peref p</font>+<a name="line-198"></a><font color=Blue>cp</font> <font color=Cyan>(</font>TagName n m<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><></font> modifier m+<a name="line-199"></a><font color=Blue>cp</font> <font color=Cyan>(</font>Choice cs m<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map cp cs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-200"></a> modifier m+<a name="line-201"></a><font color=Blue>cp</font> <font color=Cyan>(</font>Seq cs m<font color=Cyan>)</font> <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>","</font><font color=Cyan>)</font> <font color=Cyan>(</font>map cp cs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-202"></a> modifier m+<a name="line-203"></a><a name="modifier"></a><font color=Blue>--cp (CPPE p c) = peref p</font>+<a name="line-204"></a><font color=Blue>modifier</font> <font color=Red>::</font> Modifier <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-205"></a><font color=Blue>modifier</font> None <font color=Red>=</font> empty+<a name="line-206"></a><font color=Blue>modifier</font> Query <font color=Red>=</font> text <font color=Magenta>"?"</font>+<a name="line-207"></a><font color=Blue>modifier</font> Star <font color=Red>=</font> text <font color=Magenta>"*"</font>+<a name="line-208"></a><font color=Blue>modifier</font> Plus <font color=Red>=</font> text <font color=Magenta>"+"</font>+<a name="line-209"></a><a name="mixed"></a><font color=Blue>mixed</font> <font color=Red>::</font> Mixed <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-210"></a><font color=Blue>mixed</font> PCDATA <font color=Red>=</font> text <font color=Magenta>"(#PCDATA)"</font>+<a name="line-211"></a><font color=Blue>mixed</font> <font color=Cyan>(</font>PCDATAplus ns<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"(#PCDATA |"</font> <font color=Cyan><+></font>+<a name="line-212"></a> hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map text ns<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-213"></a> text <font color=Magenta>")*"</font>+<a name="line-214"></a>+<a name="line-215"></a><a name="attlistdecl"></a><font color=Blue>attlistdecl</font> <font color=Red>::</font> AttListDecl <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-216"></a><font color=Blue>attlistdecl</font> <font color=Cyan>(</font>AttListDecl n ds<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ATTLIST"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>+<a name="line-217"></a> fsep <font color=Cyan>(</font>map attdef ds<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>">"</font>+<a name="line-218"></a><a name="attdef"></a><font color=Blue>attdef</font> <font color=Red>::</font> AttDef <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-219"></a><font color=Blue>attdef</font> <font color=Cyan>(</font>AttDef n t d<font color=Cyan>)</font> <font color=Red>=</font> text n <font color=Cyan><+></font> atttype t <font color=Cyan><+></font> defaultdecl d+<a name="line-220"></a><a name="atttype"></a><font color=Blue>atttype</font> <font color=Red>::</font> AttType <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-221"></a><font color=Blue>atttype</font> StringType <font color=Red>=</font> text <font color=Magenta>"CDATA"</font>+<a name="line-222"></a><font color=Blue>atttype</font> <font color=Cyan>(</font>TokenizedType t<font color=Cyan>)</font> <font color=Red>=</font> tokenizedtype t+<a name="line-223"></a><font color=Blue>atttype</font> <font color=Cyan>(</font>EnumeratedType t<font color=Cyan>)</font> <font color=Red>=</font> enumeratedtype t+<a name="line-224"></a><a name="tokenizedtype"></a><font color=Blue>tokenizedtype</font> <font color=Red>::</font> TokenizedType <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-225"></a><font color=Blue>tokenizedtype</font> ID <font color=Red>=</font> text <font color=Magenta>"ID"</font>+<a name="line-226"></a><font color=Blue>tokenizedtype</font> IDREF <font color=Red>=</font> text <font color=Magenta>"IDREF"</font>+<a name="line-227"></a><font color=Blue>tokenizedtype</font> IDREFS <font color=Red>=</font> text <font color=Magenta>"IDREFS"</font>+<a name="line-228"></a><font color=Blue>tokenizedtype</font> ENTITY <font color=Red>=</font> text <font color=Magenta>"ENTITY"</font>+<a name="line-229"></a><font color=Blue>tokenizedtype</font> ENTITIES <font color=Red>=</font> text <font color=Magenta>"ENTITIES"</font>+<a name="line-230"></a><font color=Blue>tokenizedtype</font> NMTOKEN <font color=Red>=</font> text <font color=Magenta>"NMTOKEN"</font>+<a name="line-231"></a><font color=Blue>tokenizedtype</font> NMTOKENS <font color=Red>=</font> text <font color=Magenta>"NMTOKENS"</font>+<a name="line-232"></a><a name="enumeratedtype"></a><font color=Blue>enumeratedtype</font> <font color=Red>::</font> EnumeratedType <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-233"></a><font color=Blue>enumeratedtype</font> <font color=Cyan>(</font>NotationType n<font color=Cyan>)</font><font color=Red>=</font> notationtype n+<a name="line-234"></a><font color=Blue>enumeratedtype</font> <font color=Cyan>(</font>Enumeration e<font color=Cyan>)</font> <font color=Red>=</font> enumeration e+<a name="line-235"></a><a name="notationtype"></a><font color=Blue>notationtype</font> <font color=Red>::</font> <font color=Red>[</font><font color=Red>[</font>Char<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-236"></a><font color=Blue>notationtype</font> ns <font color=Red>=</font> text <font color=Magenta>"NOTATION"</font> <font color=Cyan><+></font>+<a name="line-237"></a> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map text ns<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-238"></a><a name="enumeration"></a><font color=Blue>enumeration</font> <font color=Red>::</font> <font color=Red>[</font><font color=Red>[</font>Char<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-239"></a><font color=Blue>enumeration</font> ns <font color=Red>=</font> parens <font color=Cyan>(</font>hcat <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>text <font color=Magenta>"|"</font><font color=Cyan>)</font> <font color=Cyan>(</font>map nmtoken ns<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-240"></a><a name="defaultdecl"></a><font color=Blue>defaultdecl</font> <font color=Red>::</font> DefaultDecl <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-241"></a><font color=Blue>defaultdecl</font> REQUIRED <font color=Red>=</font> text <font color=Magenta>"#REQUIRED"</font>+<a name="line-242"></a><font color=Blue>defaultdecl</font> IMPLIED <font color=Red>=</font> text <font color=Magenta>"#IMPLIED"</font>+<a name="line-243"></a><font color=Blue>defaultdecl</font> <font color=Cyan>(</font>DefaultTo a f<font color=Cyan>)</font> <font color=Red>=</font> maybe <font color=Cyan>(</font>const <font color=Cyan>(</font>text <font color=Magenta>"#FIXED"</font><font color=Cyan>)</font><font color=Cyan>)</font> f <font color=Cyan><+></font> attvalue a+<a name="line-244"></a><a name="reference"></a><font color=Blue>-- _ (IncludeSect i)= text "<![INCLUDE [" <+></font>+<a name="line-245"></a><font color=Blue>-- vcat (map extsubsetdecl i) <+> text "]]>"</font>+<a name="line-246"></a><font color=Blue>-- conditionalsect (IgnoreSect i) = text "<![IGNORE [" <+></font>+<a name="line-247"></a><font color=Blue>-- fsep (map ignoresectcontents i) <+> text "]]>"</font>+<a name="line-248"></a><font color=Blue>-- _ (Ignore) = empty</font>+<a name="line-249"></a><font color=Blue>-- _ (IgnoreSectContents i is)</font>+<a name="line-250"></a><font color=Blue>-- = ignore i <+> vcat (map internal is)</font>+<a name="line-251"></a><font color=Blue>-- where internal (ics,i) = text "<![[" <+></font>+<a name="line-252"></a><font color=Blue>-- ignoresectcontents ics <+></font>+<a name="line-253"></a><font color=Blue>-- text "]]>" <+> ignore i</font>+<a name="line-254"></a><font color=Blue>reference</font> <font color=Red>::</font> Reference <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-255"></a><font color=Blue>reference</font> <font color=Cyan>(</font>RefEntity er<font color=Cyan>)</font> <font color=Red>=</font> entityref er+<a name="line-256"></a><font color=Blue>reference</font> <font color=Cyan>(</font>RefChar cr<font color=Cyan>)</font> <font color=Red>=</font> charref cr+<a name="line-257"></a><a name="entityref"></a><font color=Blue>entityref</font> <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-258"></a><font color=Blue>entityref</font> n <font color=Red>=</font> text <font color=Magenta>"&"</font> <font color=Cyan><></font> text n <font color=Cyan><></font> text <font color=Magenta>";"</font>+<a name="line-259"></a><a name="charref"></a><font color=Blue>charref</font> <font color=Red>::</font> <font color=Cyan>(</font>Show a<font color=Cyan>)</font> <font color=Red>=></font> a <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-260"></a><font color=Blue>charref</font> c <font color=Red>=</font> text <font color=Magenta>"&#"</font> <font color=Cyan><></font> text <font color=Cyan>(</font>show c<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>";"</font>+<a name="line-261"></a><a name="entitydecl"></a><font color=Blue>entitydecl</font> <font color=Red>::</font> EntityDecl <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-262"></a><font color=Blue>entitydecl</font> <font color=Cyan>(</font>EntityGEDecl d<font color=Cyan>)</font> <font color=Red>=</font> gedecl d+<a name="line-263"></a><font color=Blue>entitydecl</font> <font color=Cyan>(</font>EntityPEDecl d<font color=Cyan>)</font> <font color=Red>=</font> pedecl d+<a name="line-264"></a><a name="gedecl"></a><font color=Blue>gedecl</font> <font color=Red>::</font> GEDecl <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-265"></a><font color=Blue>gedecl</font> <font color=Cyan>(</font>GEDecl n ed<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ENTITY"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font> entitydef ed <font color=Cyan><></font>+<a name="line-266"></a> text <font color=Magenta>">"</font>+<a name="line-267"></a><a name="pedecl"></a><font color=Blue>pedecl</font> <font color=Red>::</font> PEDecl <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-268"></a><font color=Blue>pedecl</font> <font color=Cyan>(</font>PEDecl n pd<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!ENTITY %"</font> <font color=Cyan><></font> text n <font color=Cyan><+></font> pedef pd <font color=Cyan><></font>+<a name="line-269"></a> text <font color=Magenta>">"</font>+<a name="line-270"></a><a name="entitydef"></a><font color=Blue>entitydef</font> <font color=Red>::</font> EntityDef <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-271"></a><font color=Blue>entitydef</font> <font color=Cyan>(</font>DefEntityValue ew<font color=Cyan>)</font> <font color=Red>=</font> entityvalue ew+<a name="line-272"></a><font color=Blue>entitydef</font> <font color=Cyan>(</font>DefExternalID i nd<font color=Cyan>)</font> <font color=Red>=</font> externalid i <font color=Cyan><+></font> maybe ndatadecl nd+<a name="line-273"></a><a name="pedef"></a><font color=Blue>pedef</font> <font color=Red>::</font> PEDef <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-274"></a><font color=Blue>pedef</font> <font color=Cyan>(</font>PEDefEntityValue ew<font color=Cyan>)</font> <font color=Red>=</font> entityvalue ew+<a name="line-275"></a><font color=Blue>pedef</font> <font color=Cyan>(</font>PEDefExternalID eid<font color=Cyan>)</font> <font color=Red>=</font> externalid eid+<a name="line-276"></a><a name="externalid"></a><font color=Blue>externalid</font> <font color=Red>::</font> ExternalID <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-277"></a><font color=Blue>externalid</font> <font color=Cyan>(</font>SYSTEM sl<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"SYSTEM"</font> <font color=Cyan><+></font> systemliteral sl+<a name="line-278"></a><font color=Blue>externalid</font> <font color=Cyan>(</font>PUBLIC i sl<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"PUBLIC"</font> <font color=Cyan><+></font> pubidliteral i <font color=Cyan><+></font>+<a name="line-279"></a> systemliteral sl+<a name="line-280"></a><a name="ndatadecl"></a><font color=Blue>ndatadecl</font> <font color=Red>::</font> NDataDecl <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-281"></a><font color=Blue>ndatadecl</font> <font color=Cyan>(</font>NDATA n<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"NDATA"</font> <font color=Cyan><+></font> text n+<a name="line-282"></a><a name="notationdecl"></a><font color=Blue>-- _ (TextDecl vi ed) = text "<?xml" <+> maybe text vi <+></font>+<a name="line-283"></a><font color=Blue>-- encodingdecl ed <> text "?>"</font>+<a name="line-284"></a><font color=Blue>-- _ (ExtParsedEnt t c)= maybe textdecl t <+> content c</font>+<a name="line-285"></a><font color=Blue>-- _ (ExtPE t esd) = maybe textdecl t <+></font>+<a name="line-286"></a><font color=Blue>-- vcat (map extsubsetdecl esd)</font>+<a name="line-287"></a><font color=Blue>notationdecl</font> <font color=Red>::</font> NotationDecl <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-288"></a><font color=Blue>notationdecl</font> <font color=Cyan>(</font>NOTATION n e<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"<!NOTATION"</font> <font color=Cyan><+></font> text n <font color=Cyan><+></font>+<a name="line-289"></a> either externalid publicid e <font color=Cyan><></font>+<a name="line-290"></a> text <font color=Magenta>">"</font>+<a name="line-291"></a><a name="publicid"></a><font color=Blue>publicid</font> <font color=Red>::</font> PublicID <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-292"></a><font color=Blue>publicid</font> <font color=Cyan>(</font>PUBLICID p<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"PUBLICID"</font> <font color=Cyan><+></font> pubidliteral p+<a name="line-293"></a><a name="encodingdecl"></a><font color=Blue>encodingdecl</font> <font color=Red>::</font> EncodingDecl <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-294"></a><font color=Blue>encodingdecl</font> <font color=Cyan>(</font>EncodingDecl s<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"encoding='"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>+<a name="line-295"></a><a name="nmtoken"></a><font color=Blue>nmtoken</font> <font color=Red>::</font> t <font color=Red>-></font> t+<a name="line-296"></a><font color=Blue>nmtoken</font> s <font color=Red>=</font> text s+<a name="line-297"></a><a name="attvalue"></a><font color=Blue>attvalue</font> <font color=Red>::</font> AttValue <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-298"></a><font color=Blue>attvalue</font> <font color=Cyan>(</font>AttValue esr<font color=Cyan>)</font> <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font>+<a name="line-299"></a> hcat <font color=Cyan>(</font>map <font color=Cyan>(</font>either text reference<font color=Cyan>)</font> esr<font color=Cyan>)</font> <font color=Cyan><></font>+<a name="line-300"></a> text <font color=Magenta>"\""</font>+<a name="line-301"></a><a name="entityvalue"></a><font color=Blue>entityvalue</font> <font color=Red>::</font> EntityValue <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-302"></a><font color=Blue>entityvalue</font> <font color=Cyan>(</font>EntityValue evs<font color=Cyan>)</font>+<a name="line-303"></a> <font color=Red>|</font> containsDoubleQuote evs <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>map ev evs<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"'"</font>+<a name="line-304"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font> hcat <font color=Cyan>(</font>map ev evs<font color=Cyan>)</font> <font color=Cyan><></font> text <font color=Magenta>"\""</font>+<a name="line-305"></a><a name="ev"></a><font color=Blue>ev</font> <font color=Red>::</font> EV <font color=Red>-></font> String+<a name="line-306"></a><font color=Blue>ev</font> <font color=Cyan>(</font>EVString s<font color=Cyan>)</font> <font color=Red>=</font> text s+<a name="line-307"></a><font color=Blue>--ev (EVPERef p e) = peref p</font>+<a name="line-308"></a><font color=Blue>ev</font> <font color=Cyan>(</font>EVRef r<font color=Cyan>)</font> <font color=Red>=</font> reference r+<a name="line-309"></a><a name="pubidliteral"></a><font color=Blue>pubidliteral</font> <font color=Red>::</font> PubidLiteral <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-310"></a><font color=Blue>pubidliteral</font> <font color=Cyan>(</font>PubidLiteral s<font color=Cyan>)</font>+<a name="line-311"></a> <font color=Red>|</font> <font color=Magenta>'"'</font> <font color=Cyan>`elem`</font> s <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>+<a name="line-312"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"\""</font>+<a name="line-313"></a><a name="systemliteral"></a><font color=Blue>systemliteral</font> <font color=Red>::</font> SystemLiteral <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-314"></a><font color=Blue>systemliteral</font> <font color=Cyan>(</font>SystemLiteral s<font color=Cyan>)</font>+<a name="line-315"></a> <font color=Red>|</font> <font color=Magenta>'"'</font> <font color=Cyan>`elem`</font> s <font color=Red>=</font> text <font color=Magenta>"'"</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"'"</font>+<a name="line-316"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> text <font color=Magenta>"\""</font> <font color=Cyan><></font> text s <font color=Cyan><></font> text <font color=Magenta>"\""</font>+<a name="line-317"></a><a name="chardata"></a><font color=Blue>chardata</font> <font color=Red>::</font> t <font color=Red>-></font> t+<a name="line-318"></a><font color=Blue>chardata</font> s <font color=Red>=</font> <font color=Blue>{-if all isSpace s then empty else-}</font> text s+<a name="line-319"></a><a name="cdsect"></a><font color=Blue>cdsect</font> <font color=Red>::</font> <font color=Red>[</font>Char<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Char<font color=Red>]</font>+<a name="line-320"></a><font color=Blue>cdsect</font> c <font color=Red>=</font> text <font color=Magenta>"<![CDATA["</font> <font color=Cyan><></font> chardata c <font color=Cyan><></font> text <font color=Magenta>"]]>"</font>+<a name="line-321"></a>+<a name="line-322"></a><a name="containsDoubleQuote"></a><font color=Blue>----</font>+<a name="line-323"></a><font color=Blue>containsDoubleQuote</font> <font color=Red>::</font> <font color=Red>[</font>EV<font color=Red>]</font> <font color=Red>-></font> Bool+<a name="line-324"></a><font color=Blue>containsDoubleQuote</font> evs <font color=Red>=</font> any csq evs+<a name="line-325"></a> <font color=Green><u>where</u></font> csq <font color=Cyan>(</font>EVString s<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>'"'</font> <font color=Cyan>`elem`</font> s+<a name="line-326"></a> csq <font color=Green><u>_</u></font> <font color=Red>=</font> False+<a name="line-327"></a> </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/TypeMapping.html view
@@ -1,224 +1,300 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>TypeMapping-<a name="(line2)"></a> <font color=Cyan>(</font>-<a name="(line3)"></a> <font color=Blue>-- * A class to get an explicit type representation for any value</font>-<a name="(line4)"></a> HTypeable<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font> <font color=Blue>-- sole method, toHType</font>-<a name="(line5)"></a> <font color=Blue>-- * Explicit representation of Haskell datatype information</font>-<a name="(line6)"></a> <font color=Cyan>,</font> HType<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font> <font color=Blue>-- instance of Eq, Show</font>-<a name="(line7)"></a> <font color=Cyan>,</font> Constr<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font> <font color=Blue>-- instance of Eq, Show</font>-<a name="(line8)"></a> <font color=Blue>-- * Helper functions to extract type info as strings</font>-<a name="(line9)"></a> <font color=Cyan>,</font> showHType <font color=Blue>-- :: HType -> ShowS</font>-<a name="(line10)"></a> <font color=Cyan>,</font> showConstr <font color=Blue>-- :: Int -> HType -> String</font>-<a name="(line11)"></a> <font color=Blue>-- * Conversion from Haskell datatype to DTD</font>-<a name="(line12)"></a> <font color=Cyan>,</font> toDTD-<a name="(line13)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line14)"></a>-<a name="(line15)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line16)"></a><font color=Green><u>import</u></font> Data<font color=Cyan>.</font>List <font color=Cyan>(</font>partition<font color=Cyan>,</font> intersperse<font color=Cyan>)</font>-<a name="(line17)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>PrettyPrint<font color=Cyan>.</font>HughesPJ <font color=Cyan>(</font>render<font color=Cyan>)</font>-<a name="(line18)"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Pretty <font color=Green><u>as</u></font> PP-<a name="(line19)"></a>-<a name="(line20)"></a>-<a name="(line21)"></a><font color=Blue>------------------------------------------------------------------------</font>-<a name="(line22)"></a> <font color=Blue>-- idea: in DrIFT,</font>-<a name="(line23)"></a> <font color=Blue>-- named field == primitive type, becomes an attribute</font>-<a name="(line24)"></a> <font color=Blue>-- named field == single-constructor type, renames the tag</font>-<a name="(line25)"></a> <font color=Blue>-- named field == multi-constructor type, as normal</font>-<a name="(line26)"></a> <font color=Blue>-- if prefix of all named fields is roughly typename, delete it</font>-<a name="(line27)"></a>-<a name="(line28)"></a><a name="HTypeable"></a><font color=Blue>-- | @HTypeable@ promises that we can create an explicit representation of</font>-<a name="(line29)"></a><a name="HTypeable"></a><font color=Blue>-- of the type of any value.</font>-<a name="(line30)"></a><a name="HTypeable"></a><font color=Green><u>class</u></font> HTypeable a <font color=Green><u>where</u></font>-<a name="(line31)"></a> toHType <font color=Red>::</font> a <font color=Red>-></font> HType-<a name="(line32)"></a>-<a name="(line33)"></a><a name="HType"></a><font color=Blue>-- | A concrete representation of any Haskell type.</font>-<a name="(line34)"></a><a name="HType"></a><font color=Green><u>data</u></font> HType <font color=Red>=</font>-<a name="(line35)"></a> Maybe HType-<a name="(line36)"></a> <font color=Red>|</font> List HType-<a name="(line37)"></a> <font color=Red>|</font> Tuple <font color=Red>[</font>HType<font color=Red>]</font>-<a name="(line38)"></a> <font color=Red>|</font> Prim String String <font color=Blue>-- ^ separate Haskell name and XML name</font>-<a name="(line39)"></a> <font color=Red>|</font> String-<a name="(line40)"></a> <font color=Red>|</font> Defined String <font color=Red>[</font>HType<font color=Red>]</font> <font color=Red>[</font>Constr<font color=Red>]</font>-<a name="(line41)"></a> <font color=Blue>-- ^ A user-defined type has a name, a sequence of type variables,</font>-<a name="(line42)"></a> <font color=Blue>-- and a set of constructors. (The variables might already be</font>-<a name="(line43)"></a> <font color=Blue>-- instantiated to actual types.)</font>-<a name="(line44)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Show<font color=Cyan>)</font>-<a name="(line45)"></a>-<a name="(line46)"></a><font color=Green><u>instance</u></font> Eq HType <font color=Green><u>where</u></font>-<a name="(line47)"></a> <font color=Cyan>(</font>Maybe x<font color=Cyan>)</font> <font color=Cyan>==</font> <font color=Cyan>(</font>Maybe y<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Cyan>==</font>y-<a name="(line48)"></a> <font color=Cyan>(</font>List x<font color=Cyan>)</font> <font color=Cyan>==</font> <font color=Cyan>(</font>List y<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Cyan>==</font>y-<a name="(line49)"></a> <font color=Cyan>(</font>Tuple xs<font color=Cyan>)</font> <font color=Cyan>==</font> <font color=Cyan>(</font>Tuple ys<font color=Cyan>)</font> <font color=Red>=</font> xs<font color=Cyan>==</font>ys-<a name="(line50)"></a> <font color=Cyan>(</font>Prim x <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>==</font> <font color=Cyan>(</font>Prim y <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> x<font color=Cyan>==</font>y-<a name="(line51)"></a> String <font color=Cyan>==</font> String <font color=Red>=</font> True-<a name="(line52)"></a> <font color=Cyan>(</font>Defined n xs <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>==</font> <font color=Cyan>(</font>Defined m ys <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> n<font color=Cyan>==</font>m <font color=Blue>-- && xs==ys</font>-<a name="(line53)"></a> <font color=Green><u>_</u></font> <font color=Cyan>==</font> <font color=Green><u>_</u></font> <font color=Red>=</font> False-<a name="(line54)"></a>-<a name="(line55)"></a><a name="Constr"></a><font color=Blue>-- | A concrete representation of any user-defined Haskell constructor.</font>-<a name="(line56)"></a><a name="Constr"></a><font color=Blue>-- The constructor has a name, and a sequence of component types. The</font>-<a name="(line57)"></a><a name="Constr"></a><font color=Blue>-- first sequence of types represents the minimum set of free type</font>-<a name="(line58)"></a><a name="Constr"></a><font color=Blue>-- variables occurring in the (second) list of real component types.</font>-<a name="(line59)"></a><a name="Constr"></a><font color=Blue>-- If there are fieldnames, they are contained in the final list, and</font>-<a name="(line60)"></a><a name="Constr"></a><font color=Blue>-- correspond one-to-one with the component types.</font>-<a name="(line61)"></a><a name="Constr"></a><font color=Green><u>data</u></font> Constr <font color=Red>=</font> Constr String <font color=Red>[</font>HType<font color=Red>]</font> <font color=Red>[</font>HType<font color=Red>]</font> <font color=Blue>-- (Maybe [String])</font>-<a name="(line62)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line63)"></a>-<a name="(line64)"></a><a name="showConstr"></a><font color=Blue>-- | Project the n'th constructor from an HType and convert it to a string</font>-<a name="(line65)"></a><font color=Blue>-- suitable for an XML tagname.</font>-<a name="(line66)"></a>showConstr <font color=Red>::</font> Int <font color=Red>-></font> HType <font color=Red>-></font> String-<a name="(line67)"></a>showConstr n <font color=Cyan>(</font>Defined <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> cs<font color=Cyan>)</font> <font color=Red>=</font> flatConstr <font color=Cyan>(</font>cs<font color=Cyan>!!</font>n<font color=Cyan>)</font> <font color=Magenta>""</font>-<a name="(line68)"></a>showConstr n <font color=Green><u>_</u></font> <font color=Red>=</font> error <font color=Magenta>"no constructors for builtin types"</font>-<a name="(line69)"></a>-<a name="(line70)"></a><font color=Blue>------------------------------------------------------------------------</font>-<a name="(line71)"></a><font color=Blue>-- Some instances</font>-<a name="(line72)"></a><font color=Green><u>instance</u></font> HTypeable Bool <font color=Green><u>where</u></font>-<a name="(line73)"></a> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Prim <font color=Magenta>"Bool"</font> <font color=Magenta>"bool"</font>-<a name="(line74)"></a><font color=Green><u>instance</u></font> HTypeable Int <font color=Green><u>where</u></font>-<a name="(line75)"></a> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Prim <font color=Magenta>"Int"</font> <font color=Magenta>"int"</font>-<a name="(line76)"></a><font color=Green><u>instance</u></font> HTypeable Integer <font color=Green><u>where</u></font>-<a name="(line77)"></a> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Prim <font color=Magenta>"Integer"</font> <font color=Magenta>"integer"</font>-<a name="(line78)"></a><font color=Green><u>instance</u></font> HTypeable Float <font color=Green><u>where</u></font>-<a name="(line79)"></a> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Prim <font color=Magenta>"Float"</font> <font color=Magenta>"float"</font>-<a name="(line80)"></a><font color=Green><u>instance</u></font> HTypeable Double <font color=Green><u>where</u></font>-<a name="(line81)"></a> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Prim <font color=Magenta>"Double"</font> <font color=Magenta>"double"</font>-<a name="(line82)"></a><font color=Green><u>instance</u></font> HTypeable Char <font color=Green><u>where</u></font>-<a name="(line83)"></a> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Prim <font color=Magenta>"Char"</font> <font color=Magenta>"char"</font>-<a name="(line84)"></a>-<a name="(line85)"></a><font color=Green><u>instance</u></font> HTypeable () <font color=Green><u>where</u></font>-<a name="(line86)"></a> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Prim <font color=Magenta>"unit"</font> <font color=Magenta>"unit"</font>-<a name="(line87)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>)</font> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line88)"></a> toHType p <font color=Red>=</font> Tuple <font color=Red>[</font>toHType a<font color=Cyan>,</font> toHType b<font color=Red>]</font>-<a name="(line89)"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font> <font color=Red>=</font> p-<a name="(line90)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>,</font> HTypeable c<font color=Cyan>)</font> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line91)"></a> toHType p <font color=Red>=</font> Tuple <font color=Red>[</font>toHType a<font color=Cyan>,</font> toHType b<font color=Cyan>,</font> toHType c<font color=Red>]</font>-<a name="(line92)"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>=</font> p-<a name="(line93)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>,</font> HTypeable c<font color=Cyan>,</font> HTypeable d<font color=Cyan>)</font> <font color=Red>=></font>-<a name="(line94)"></a> HTypeable <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line95)"></a> toHType p <font color=Red>=</font> Tuple <font color=Red>[</font>toHType a<font color=Cyan>,</font> toHType b<font color=Cyan>,</font> toHType c<font color=Cyan>,</font> toHType d<font color=Red>]</font>-<a name="(line96)"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>)</font> <font color=Red>=</font> p-<a name="(line97)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>,</font> HTypeable c<font color=Cyan>,</font> HTypeable d<font color=Cyan>,</font> HTypeable e<font color=Cyan>)</font> <font color=Red>=></font>-<a name="(line98)"></a> HTypeable <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line99)"></a> toHType p <font color=Red>=</font> Tuple <font color=Red>[</font> toHType a<font color=Cyan>,</font> toHType b<font color=Cyan>,</font> toHType c<font color=Cyan>,</font> toHType d-<a name="(line100)"></a> <font color=Cyan>,</font> toHType e <font color=Red>]</font>-<a name="(line101)"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>)</font> <font color=Red>=</font> p-<a name="(line102)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>,</font> HTypeable c<font color=Cyan>,</font> HTypeable d<font color=Cyan>,</font> HTypeable e-<a name="(line103)"></a> <font color=Cyan>,</font> HTypeable f<font color=Cyan>)</font> <font color=Red>=></font>-<a name="(line104)"></a> HTypeable <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line105)"></a> toHType p <font color=Red>=</font> Tuple <font color=Red>[</font> toHType a<font color=Cyan>,</font> toHType b<font color=Cyan>,</font> toHType c<font color=Cyan>,</font> toHType d-<a name="(line106)"></a> <font color=Cyan>,</font> toHType e<font color=Cyan>,</font> toHType f <font color=Red>]</font>-<a name="(line107)"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>)</font> <font color=Red>=</font> p-<a name="(line108)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>)</font> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>Maybe a<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line109)"></a> toHType m <font color=Red>=</font> Maybe <font color=Cyan>(</font>toHType x<font color=Cyan>)</font> <font color=Green><u>where</u></font> <font color=Cyan>(</font>Just x<font color=Cyan>)</font> <font color=Red>=</font> m-<a name="(line110)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>)</font> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>Either a b<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line111)"></a> toHType m <font color=Red>=</font> Defined <font color=Magenta>"Either"</font> <font color=Red>[</font>hx<font color=Cyan>,</font> hy<font color=Red>]</font>-<a name="(line112)"></a> <font color=Red>[</font> Constr <font color=Magenta>"Left"</font> <font color=Red>[</font>hx<font color=Red>]</font> <font color=Red>[</font>hx<font color=Red>]</font> <font color=Blue>{-Nothing-}</font>-<a name="(line113)"></a> <font color=Cyan>,</font> Constr <font color=Magenta>"Right"</font> <font color=Red>[</font>hy<font color=Red>]</font> <font color=Red>[</font>hy<font color=Red>]</font> <font color=Blue>{-Nothing-}</font><font color=Red>]</font>-<a name="(line114)"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>Left x<font color=Cyan>)</font> <font color=Red>=</font> m-<a name="(line115)"></a> <font color=Cyan>(</font>Right y<font color=Cyan>)</font> <font color=Red>=</font> m-<a name="(line116)"></a> hx <font color=Red>=</font> toHType x-<a name="(line117)"></a> hy <font color=Red>=</font> toHType y-<a name="(line118)"></a>-<a name="(line119)"></a><font color=Green><u>instance</u></font> HTypeable a <font color=Red>=></font> HTypeable <font color=Red>[</font>a<font color=Red>]</font> <font color=Green><u>where</u></font>-<a name="(line120)"></a> toHType xs <font color=Red>=</font> <font color=Green><u>case</u></font> toHType x <font color=Green><u>of</u></font> <font color=Cyan>(</font>Prim <font color=Magenta>"Char"</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> String-<a name="(line121)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> List <font color=Cyan>(</font>toHType x<font color=Cyan>)</font>-<a name="(line122)"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>x<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> xs-<a name="(line123)"></a>-<a name="(line124)"></a><font color=Blue>------------------------------------------------------------------------</font>-<a name="(line125)"></a>-<a name="(line126)"></a><a name="toDTD"></a><font color=Blue>-- | 'toDTD' converts a concrete representation of the Haskell type of</font>-<a name="(line127)"></a><font color=Blue>-- a value (obtained by the method 'toHType') into a real DocTypeDecl.</font>-<a name="(line128)"></a><font color=Blue>-- It ensures that PERefs are defined before they are used, and that no</font>-<a name="(line129)"></a><font color=Blue>-- element or attribute-list is declared more than once.</font>-<a name="(line130)"></a>toDTD <font color=Red>::</font> HType <font color=Red>-></font> DocTypeDecl-<a name="(line131)"></a>toDTD ht <font color=Red>=</font>-<a name="(line132)"></a> DTD <font color=Cyan>(</font>toplevel ht<font color=Cyan>)</font> Nothing <font color=Cyan>(</font>macrosFirst <font color=Cyan>(</font>reverse <font color=Cyan>(</font>h2d True [] [] <font color=Red>[</font>ht<font color=Red>]</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line133)"></a> <font color=Green><u>where</u></font>-<a name="(line134)"></a> macrosFirst <font color=Red>::</font> <font color=Red>[</font>MarkupDecl<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>MarkupDecl<font color=Red>]</font>-<a name="(line135)"></a> macrosFirst decls <font color=Red>=</font> concat <font color=Red>[</font>p<font color=Cyan>,</font> p'<font color=Red>]</font> <font color=Green><u>where</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font> p'<font color=Cyan>)</font> <font color=Red>=</font> partition f decls-<a name="(line136)"></a> f <font color=Cyan>(</font>Entity <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True-<a name="(line137)"></a> f <font color=Green><u>_</u></font> <font color=Red>=</font> False-<a name="(line138)"></a> toplevel ht<font color=Red>@</font><font color=Cyan>(</font>Defined <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> showHType ht <font color=Magenta>"-XML"</font>-<a name="(line139)"></a> toplevel ht<font color=Red>@</font><font color=Green><u>_</u></font> <font color=Red>=</font> showHType ht <font color=Magenta>""</font>-<a name="(line140)"></a> c0 <font color=Red>=</font> False-<a name="(line141)"></a> h2d <font color=Red>::</font> Bool <font color=Red>-></font> <font color=Red>[</font>HType<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Constr<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>HType<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>MarkupDecl<font color=Red>]</font>-<a name="(line142)"></a> <font color=Blue>-- toplevel? history history remainingwork result</font>-<a name="(line143)"></a> h2d c history chist [] <font color=Red>=</font> []-<a name="(line144)"></a> h2d c history chist <font color=Cyan>(</font>ht<font color=Red><b>:</b></font>hts<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line145)"></a> <font color=Green><u>if</u></font> ht <font color=Cyan>`elem`</font> history <font color=Green><u>then</u></font> h2d c0 history chist hts-<a name="(line146)"></a> <font color=Green><u>else</u></font>-<a name="(line147)"></a> <font color=Green><u>case</u></font> ht <font color=Green><u>of</u></font>-<a name="(line148)"></a> Maybe ht0 <font color=Red>-></font> declelem ht<font color=Red><b>:</b></font> h2d c0 <font color=Cyan>(</font>ht<font color=Red><b>:</b></font>history<font color=Cyan>)</font> chist <font color=Cyan>(</font>ht0<font color=Red><b>:</b></font>hts<font color=Cyan>)</font>-<a name="(line149)"></a> List ht0 <font color=Red>-></font> declelem ht<font color=Red><b>:</b></font> h2d c0 <font color=Cyan>(</font>ht<font color=Red><b>:</b></font>history<font color=Cyan>)</font> chist <font color=Cyan>(</font>ht0<font color=Red><b>:</b></font>hts<font color=Cyan>)</font>-<a name="(line150)"></a> Tuple hts0 <font color=Red>-></font> <font color=Cyan>(</font>c <font color=Cyan>?</font> <font color=Cyan>(</font>declelem ht<font color=Red><b>:</b></font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line151)"></a> <font color=Cyan>(</font>h2d c0 history chist <font color=Cyan>(</font>hts0<font color=Cyan>++</font>hts<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line152)"></a> Prim s t <font color=Red>-></font> declprim ht <font color=Cyan>++</font> h2d c0 <font color=Cyan>(</font>ht<font color=Red><b>:</b></font>history<font color=Cyan>)</font> chist hts-<a name="(line153)"></a> String <font color=Red>-></font> declstring<font color=Red><b>:</b></font> h2d c0 <font color=Cyan>(</font>ht<font color=Red><b>:</b></font>history<font color=Cyan>)</font> chist hts-<a name="(line154)"></a> Defined s <font color=Green><u>_</u></font> cs <font color=Red>-></font>-<a name="(line155)"></a> <font color=Green><u>let</u></font> hts0 <font color=Red>=</font> concatMap grab cs <font color=Green><u>in</u></font>-<a name="(line156)"></a> <font color=Cyan>(</font>c <font color=Cyan>?</font> <font color=Cyan>(</font>decltopelem ht<font color=Red><b>:</b></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>declmacro ht chist<font color=Cyan>)</font>-<a name="(line157)"></a> <font color=Cyan>++</font> h2d c0 <font color=Cyan>(</font>ht<font color=Red><b>:</b></font>history<font color=Cyan>)</font> <font color=Cyan>(</font>cs<font color=Cyan>++</font>chist<font color=Cyan>)</font> <font color=Cyan>(</font>hts0<font color=Cyan>++</font>hts<font color=Cyan>)</font>-<a name="(line158)"></a> declelem ht <font color=Red>=</font>-<a name="(line159)"></a> Element <font color=Cyan>(</font>ElementDecl <font color=Cyan>(</font>showHType ht <font color=Magenta>""</font><font color=Cyan>)</font> <font color=Cyan>(</font>ContentSpec <font color=Cyan>(</font>outerHtExpr ht<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line160)"></a> decltopelem ht <font color=Red>=</font> <font color=Blue>-- hack to avoid peref at toplevel</font>-<a name="(line161)"></a> Element <font color=Cyan>(</font>ElementDecl <font color=Cyan>(</font>showHType ht <font color=Magenta>"-XML"</font><font color=Cyan>)</font> <font color=Cyan>(</font>ContentSpec <font color=Cyan>(</font>innerHtExpr ht None<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line162)"></a> declmacro ht<font color=Red>@</font><font color=Cyan>(</font>Defined <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> cs<font color=Cyan>)</font> chist <font color=Red>=</font>-<a name="(line163)"></a> Entity <font color=Cyan>(</font>EntityPEDecl <font color=Cyan>(</font>PEDecl <font color=Cyan>(</font>showHType ht <font color=Magenta>""</font><font color=Cyan>)</font> <font color=Cyan>(</font>PEDefEntityValue ev<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Red><b>:</b></font>-<a name="(line164)"></a> concatMap <font color=Cyan>(</font>declConstr chist<font color=Cyan>)</font> cs-<a name="(line165)"></a> <font color=Green><u>where</u></font> ev <font color=Red>=</font> EntityValue <font color=Red>[</font>EVString <font color=Cyan>(</font>render <font color=Cyan>(</font>PP<font color=Cyan>.</font>cp <font color=Cyan>(</font>outerHtExpr ht<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Red>]</font>-<a name="(line166)"></a> declConstr chist c<font color=Red>@</font><font color=Cyan>(</font>Constr s fv hts<font color=Cyan>)</font>-<a name="(line167)"></a> <font color=Red>|</font> c <font color=Cyan>`notElem`</font> chist <font color=Red>=</font>-<a name="(line168)"></a> <font color=Red>[</font>Element <font color=Cyan>(</font>ElementDecl <font color=Cyan>(</font>flatConstr c <font color=Magenta>""</font><font color=Cyan>)</font> <font color=Cyan>(</font>ContentSpec <font color=Cyan>(</font>constrHtExpr c<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Red>]</font>-<a name="(line169)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> [] -<a name="(line170)"></a> declprim <font color=Cyan>(</font>Prim s t<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line171)"></a> <font color=Red>[</font> Element <font color=Cyan>(</font>ElementDecl t EMPTY<font color=Cyan>)</font>-<a name="(line172)"></a> <font color=Cyan>,</font> AttList <font color=Cyan>(</font>AttListDecl t <font color=Red>[</font>AttDef <font color=Magenta>"value"</font> StringType REQUIRED<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font>-<a name="(line173)"></a> declstring <font color=Red>=</font>-<a name="(line174)"></a> Element <font color=Cyan>(</font>ElementDecl <font color=Magenta>"string"</font> <font color=Cyan>(</font>Mixed PCDATA<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line175)"></a> grab <font color=Cyan>(</font>Constr <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> hts<font color=Cyan>)</font> <font color=Red>=</font> hts-<a name="(line176)"></a>-<a name="(line177)"></a><a name="?"></a><font color=Cyan>(</font><font color=Cyan>?</font><font color=Cyan>)</font> <font color=Red>::</font> Bool <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font>a<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font>a<font color=Cyan>)</font>-<a name="(line178)"></a><a name="b"></a>b <font color=Cyan>?</font> f <font color=Red>|</font> b <font color=Red>=</font> f-<a name="(line179)"></a> <font color=Red>|</font> not b <font color=Red>=</font> id-<a name="(line180)"></a>-<a name="(line181)"></a><a name="showHType"></a><font color=Blue>-- Flatten an HType to a String suitable for an XML tagname.</font>-<a name="(line182)"></a>showHType <font color=Red>::</font> HType <font color=Red>-></font> ShowS-<a name="(line183)"></a>showHType <font color=Cyan>(</font>Maybe ht<font color=Cyan>)</font> <font color=Red>=</font> showString <font color=Magenta>"maybe-"</font> <font color=Cyan>.</font> showHType ht-<a name="(line184)"></a>showHType <font color=Cyan>(</font>List ht<font color=Cyan>)</font> <font color=Red>=</font> showString <font color=Magenta>"list-"</font> <font color=Cyan>.</font> showHType ht-<a name="(line185)"></a>showHType <font color=Cyan>(</font>Tuple hts<font color=Cyan>)</font> <font color=Red>=</font> showString <font color=Magenta>"tuple"</font> <font color=Cyan>.</font> shows <font color=Cyan>(</font>length hts<font color=Cyan>)</font>-<a name="(line186)"></a> <font color=Cyan>.</font> showChar <font color=Magenta>'-'</font>-<a name="(line187)"></a> <font color=Cyan>.</font> foldr1 <font color=Cyan>(</font><font color=Cyan>.</font><font color=Cyan>)</font> <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>showChar <font color=Magenta>'-'</font><font color=Cyan>)</font>-<a name="(line188)"></a> <font color=Cyan>(</font>map showHType hts<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line189)"></a>showHType <font color=Cyan>(</font>Prim s t<font color=Cyan>)</font> <font color=Red>=</font> showString t-<a name="(line190)"></a>showHType String <font color=Red>=</font> showString <font color=Magenta>"string"</font>-<a name="(line191)"></a>showHType <font color=Cyan>(</font>Defined s fv <font color=Green><u>_</u></font><font color=Cyan>)</font>-<a name="(line192)"></a> <font color=Red>=</font> showString s <font color=Cyan>.</font> <font color=Cyan>(</font><font color=Cyan>(</font>length fv <font color=Cyan>></font> <font color=Magenta>0</font><font color=Cyan>)</font> <font color=Cyan>?</font> <font color=Cyan>(</font>showChar <font color=Magenta>'-'</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line193)"></a> <font color=Cyan>.</font> foldr <font color=Cyan>(</font><font color=Cyan>.</font><font color=Cyan>)</font> id <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>showChar <font color=Magenta>'-'</font><font color=Cyan>)</font>-<a name="(line194)"></a> <font color=Cyan>(</font>map showHType fv<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line195)"></a>-<a name="(line196)"></a><a name="flatConstr"></a>flatConstr <font color=Red>::</font> Constr <font color=Red>-></font> ShowS-<a name="(line197)"></a>flatConstr <font color=Cyan>(</font>Constr s fv <font color=Green><u>_</u></font><font color=Cyan>)</font>-<a name="(line198)"></a> <font color=Red>=</font> showString s <font color=Cyan>.</font> <font color=Cyan>(</font><font color=Cyan>(</font>length fv <font color=Cyan>></font> <font color=Magenta>0</font><font color=Cyan>)</font> <font color=Cyan>?</font> <font color=Cyan>(</font>showChar <font color=Magenta>'-'</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line199)"></a> <font color=Cyan>.</font> foldr <font color=Cyan>(</font><font color=Cyan>.</font><font color=Cyan>)</font> id <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>showChar <font color=Magenta>'-'</font><font color=Cyan>)</font> <font color=Cyan>(</font>map showHType fv<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line200)"></a>-<a name="(line201)"></a><a name="outerHtExpr"></a>outerHtExpr <font color=Red>::</font> HType <font color=Red>-></font> CP-<a name="(line202)"></a>outerHtExpr <font color=Cyan>(</font>Maybe ht<font color=Cyan>)</font> <font color=Red>=</font> innerHtExpr ht Query-<a name="(line203)"></a>outerHtExpr <font color=Cyan>(</font>List ht<font color=Cyan>)</font> <font color=Red>=</font> innerHtExpr ht Star-<a name="(line204)"></a>outerHtExpr <font color=Cyan>(</font>Defined s fv cs<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line205)"></a> Choice <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font>TagName <font color=Cyan>(</font>flatConstr c <font color=Magenta>""</font><font color=Cyan>)</font> None<font color=Cyan>)</font> cs<font color=Cyan>)</font> None-<a name="(line206)"></a>outerHtExpr ht <font color=Red>=</font> innerHtExpr ht None-<a name="(line207)"></a>-<a name="(line208)"></a><a name="innerHtExpr"></a>innerHtExpr <font color=Red>::</font> HType <font color=Red>-></font> Modifier <font color=Red>-></font> CP-<a name="(line209)"></a>innerHtExpr <font color=Cyan>(</font>Prim s t<font color=Cyan>)</font> m <font color=Red>=</font> TagName t m-<a name="(line210)"></a>innerHtExpr <font color=Cyan>(</font>Tuple hts<font color=Cyan>)</font> m <font color=Red>=</font> Seq <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font> innerHtExpr c None<font color=Cyan>)</font> hts<font color=Cyan>)</font> m-<a name="(line211)"></a>innerHtExpr ht<font color=Red>@</font><font color=Cyan>(</font>Defined s hts cs<font color=Cyan>)</font> m <font color=Red>=</font> <font color=Blue>-- CPPE (showHType ht "") (outerHtExpr ht)</font>-<a name="(line212)"></a> TagName <font color=Cyan>(</font><font color=Magenta>'%'</font><font color=Red><b>:</b></font> showHType ht <font color=Magenta>";"</font><font color=Cyan>)</font> m-<a name="(line213)"></a> <font color=Blue>-- ***HACK!!!***</font>-<a name="(line214)"></a>innerHtExpr ht m <font color=Red>=</font> TagName <font color=Cyan>(</font>showHType ht <font color=Magenta>""</font><font color=Cyan>)</font> m-<a name="(line215)"></a>-<a name="(line216)"></a><a name="constrHtExpr"></a>constrHtExpr <font color=Red>::</font> Constr <font color=Red>-></font> CP-<a name="(line217)"></a>constrHtExpr <font color=Cyan>(</font>Constr s fv []<font color=Cyan>)</font> <font color=Red>=</font> TagName <font color=Magenta>"EMPTY"</font> None <font color=Blue>-- ***HACK!!!***</font>-<a name="(line218)"></a>constrHtExpr <font color=Cyan>(</font>Constr s fv hts<font color=Cyan>)</font> <font color=Red>=</font> innerHtExpr <font color=Cyan>(</font>Tuple hts<font color=Cyan>)</font> None-<a name="(line219)"></a>-<a name="(line220)"></a><font color=Blue>------------------------------------------------------------------------</font>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/TypeMapping.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>TypeMapping+<a name="line-2"></a> <font color=Cyan>(</font>+<a name="line-3"></a> <font color=Blue>-- * A class to get an explicit type representation for any value</font>+<a name="line-4"></a> HTypeable<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font> <font color=Blue>-- sole method, toHType</font>+<a name="line-5"></a> <font color=Blue>-- * Explicit representation of Haskell datatype information</font>+<a name="line-6"></a> <font color=Cyan>,</font> HType<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font> <font color=Blue>-- instance of Eq, Show</font>+<a name="line-7"></a> <font color=Cyan>,</font> Constr<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font> <font color=Blue>-- instance of Eq, Show</font>+<a name="line-8"></a> <font color=Blue>-- * Helper functions to extract type info as strings</font>+<a name="line-9"></a> <font color=Cyan>,</font> showHType <font color=Blue>-- :: HType -> ShowS</font>+<a name="line-10"></a> <font color=Cyan>,</font> showConstr <font color=Blue>-- :: Int -> HType -> String</font>+<a name="line-11"></a> <font color=Blue>-- * Conversion from Haskell datatype to DTD</font>+<a name="line-12"></a> <font color=Cyan>,</font> toDTD+<a name="line-13"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-14"></a>+<a name="line-15"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-16"></a><font color=Green><u>import</u></font> Data<font color=Cyan>.</font>List <font color=Cyan>(</font>partition<font color=Cyan>,</font> intersperse<font color=Cyan>)</font>+<a name="line-17"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>PrettyPrint<font color=Cyan>.</font>HughesPJ <font color=Cyan>(</font>render<font color=Cyan>)</font>+<a name="line-18"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Pretty <font color=Green><u>as</u></font> PP+<a name="line-19"></a>+<a name="line-20"></a>+<a name="line-21"></a><font color=Blue>------------------------------------------------------------------------</font>+<a name="line-22"></a> <font color=Blue>-- idea: in DrIFT,</font>+<a name="line-23"></a> <font color=Blue>-- named field == primitive type, becomes an attribute</font>+<a name="line-24"></a> <font color=Blue>-- named field == single-constructor type, renames the tag</font>+<a name="line-25"></a> <font color=Blue>-- named field == multi-constructor type, as normal</font>+<a name="line-26"></a> <font color=Blue>-- if prefix of all named fields is roughly typename, delete it</font>+<a name="line-27"></a>+<a name="line-28"></a><a name="HTypeable"></a><font color=Blue>-- | @HTypeable@ promises that we can create an explicit representation of</font>+<a name="line-29"></a><a name="HTypeable"></a><font color=Blue>-- of the type of any value.</font>+<a name="line-30"></a><a name="HTypeable"></a><font color=Green><u>class</u></font> HTypeable a <font color=Green><u>where</u></font>+<a name="line-31"></a> toHType <font color=Red>::</font> a <font color=Red>-></font> HType+<a name="line-32"></a>+<a name="line-33"></a><a name="HType"></a><font color=Blue>-- | A concrete representation of any Haskell type.</font>+<a name="line-34"></a><a name="HType"></a><font color=Green><u>data</u></font> HType <font color=Red>=</font>+<a name="line-35"></a> Maybe HType+<a name="line-36"></a> <font color=Red>|</font> List HType+<a name="line-37"></a> <font color=Red>|</font> Tuple <font color=Red>[</font>HType<font color=Red>]</font>+<a name="line-38"></a> <font color=Red>|</font> Prim String String <font color=Blue>-- ^ separate Haskell name and XML name</font>+<a name="line-39"></a> <font color=Red>|</font> String+<a name="line-40"></a> <font color=Red>|</font> Defined String <font color=Red>[</font>HType<font color=Red>]</font> <font color=Red>[</font>Constr<font color=Red>]</font>+<a name="line-41"></a> <font color=Blue>-- ^ A user-defined type has a name, a sequence of type variables,</font>+<a name="line-42"></a> <font color=Blue>-- and a set of constructors. (The variables might already be</font>+<a name="line-43"></a> <font color=Blue>-- instantiated to actual types.)</font>+<a name="line-44"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Show<font color=Cyan>)</font>+<a name="line-45"></a>+<a name="line-46"></a><font color=Green><u>instance</u></font> Eq HType <font color=Green><u>where</u></font>+<a name="line-47"></a> <font color=Cyan>(</font>Maybe x<font color=Cyan>)</font> <font color=Cyan>==</font> <font color=Cyan>(</font>Maybe y<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Cyan>==</font>y+<a name="line-48"></a> <font color=Cyan>(</font>List x<font color=Cyan>)</font> <font color=Cyan>==</font> <font color=Cyan>(</font>List y<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Cyan>==</font>y+<a name="line-49"></a> <font color=Cyan>(</font>Tuple xs<font color=Cyan>)</font> <font color=Cyan>==</font> <font color=Cyan>(</font>Tuple ys<font color=Cyan>)</font> <font color=Red>=</font> xs<font color=Cyan>==</font>ys+<a name="line-50"></a> <font color=Cyan>(</font>Prim x <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>==</font> <font color=Cyan>(</font>Prim y <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> x<font color=Cyan>==</font>y+<a name="line-51"></a> String <font color=Cyan>==</font> String <font color=Red>=</font> True+<a name="line-52"></a> <font color=Cyan>(</font>Defined n xs <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>==</font> <font color=Cyan>(</font>Defined m ys <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> n<font color=Cyan>==</font>m <font color=Blue>-- && xs==ys</font>+<a name="line-53"></a> <font color=Green><u>_</u></font> <font color=Cyan>==</font> <font color=Green><u>_</u></font> <font color=Red>=</font> False+<a name="line-54"></a>+<a name="line-55"></a><a name="Constr"></a><font color=Blue>-- | A concrete representation of any user-defined Haskell constructor.</font>+<a name="line-56"></a><a name="Constr"></a><font color=Blue>-- The constructor has a name, and a sequence of component types. The</font>+<a name="line-57"></a><a name="Constr"></a><font color=Blue>-- first sequence of types represents the minimum set of free type</font>+<a name="line-58"></a><a name="Constr"></a><font color=Blue>-- variables occurring in the (second) list of real component types.</font>+<a name="line-59"></a><a name="Constr"></a><font color=Blue>-- If there are fieldnames, they are contained in the final list, and</font>+<a name="line-60"></a><a name="Constr"></a><font color=Blue>-- correspond one-to-one with the component types.</font>+<a name="line-61"></a><a name="Constr"></a><font color=Green><u>data</u></font> Constr <font color=Red>=</font> Constr String <font color=Red>[</font>HType<font color=Red>]</font> <font color=Red>[</font>HType<font color=Red>]</font> <font color=Blue>-- (Maybe [String])</font>+<a name="line-62"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-63"></a>+<a name="line-64"></a><a name="showConstr"></a><font color=Blue>-- | Project the n'th constructor from an HType and convert it to a string</font>+<a name="line-65"></a><font color=Blue>-- suitable for an XML tagname.</font>+<a name="line-66"></a><font color=Blue>showConstr</font> <font color=Red>::</font> Int <font color=Red>-></font> HType <font color=Red>-></font> String+<a name="line-67"></a><font color=Blue>showConstr</font> n <font color=Cyan>(</font>Defined <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> cs<font color=Cyan>)</font> <font color=Red>=</font> flatConstr <font color=Cyan>(</font>cs<font color=Cyan>!!</font>n<font color=Cyan>)</font> <font color=Magenta>""</font>+<a name="line-68"></a><font color=Blue>showConstr</font> n <font color=Green><u>_</u></font> <font color=Red>=</font> error <font color=Magenta>"no constructors for builtin types"</font>+<a name="line-69"></a>+<a name="line-70"></a><font color=Blue>------------------------------------------------------------------------</font>+<a name="line-71"></a><font color=Blue>-- Some instances</font>+<a name="line-72"></a><font color=Green><u>instance</u></font> HTypeable Bool <font color=Green><u>where</u></font>+<a name="line-73"></a> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Prim <font color=Magenta>"Bool"</font> <font color=Magenta>"bool"</font>+<a name="line-74"></a><font color=Green><u>instance</u></font> HTypeable Int <font color=Green><u>where</u></font>+<a name="line-75"></a> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Prim <font color=Magenta>"Int"</font> <font color=Magenta>"int"</font>+<a name="line-76"></a><font color=Green><u>instance</u></font> HTypeable Integer <font color=Green><u>where</u></font>+<a name="line-77"></a> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Prim <font color=Magenta>"Integer"</font> <font color=Magenta>"integer"</font>+<a name="line-78"></a><font color=Green><u>instance</u></font> HTypeable Float <font color=Green><u>where</u></font>+<a name="line-79"></a> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Prim <font color=Magenta>"Float"</font> <font color=Magenta>"float"</font>+<a name="line-80"></a><font color=Green><u>instance</u></font> HTypeable Double <font color=Green><u>where</u></font>+<a name="line-81"></a> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Prim <font color=Magenta>"Double"</font> <font color=Magenta>"double"</font>+<a name="line-82"></a><font color=Green><u>instance</u></font> HTypeable Char <font color=Green><u>where</u></font>+<a name="line-83"></a> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Prim <font color=Magenta>"Char"</font> <font color=Magenta>"char"</font>+<a name="line-84"></a>+<a name="line-85"></a><font color=Green><u>instance</u></font> HTypeable () <font color=Green><u>where</u></font>+<a name="line-86"></a> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Prim <font color=Magenta>"unit"</font> <font color=Magenta>"unit"</font>+<a name="line-87"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>)</font> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-88"></a> toHType p <font color=Red>=</font> Tuple <font color=Red>[</font>toHType a<font color=Cyan>,</font> toHType b<font color=Red>]</font>+<a name="line-89"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font> <font color=Red>=</font> p+<a name="line-90"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>,</font> HTypeable c<font color=Cyan>)</font> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-91"></a> toHType p <font color=Red>=</font> Tuple <font color=Red>[</font>toHType a<font color=Cyan>,</font> toHType b<font color=Cyan>,</font> toHType c<font color=Red>]</font>+<a name="line-92"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>=</font> p+<a name="line-93"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>,</font> HTypeable c<font color=Cyan>,</font> HTypeable d<font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-94"></a> HTypeable <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-95"></a> toHType p <font color=Red>=</font> Tuple <font color=Red>[</font>toHType a<font color=Cyan>,</font> toHType b<font color=Cyan>,</font> toHType c<font color=Cyan>,</font> toHType d<font color=Red>]</font>+<a name="line-96"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>)</font> <font color=Red>=</font> p+<a name="line-97"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>,</font> HTypeable c<font color=Cyan>,</font> HTypeable d<font color=Cyan>,</font> HTypeable e<font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-98"></a> HTypeable <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-99"></a> toHType p <font color=Red>=</font> Tuple <font color=Red>[</font> toHType a<font color=Cyan>,</font> toHType b<font color=Cyan>,</font> toHType c<font color=Cyan>,</font> toHType d+<a name="line-100"></a> <font color=Cyan>,</font> toHType e <font color=Red>]</font>+<a name="line-101"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>)</font> <font color=Red>=</font> p+<a name="line-102"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>,</font> HTypeable c<font color=Cyan>,</font> HTypeable d<font color=Cyan>,</font> HTypeable e+<a name="line-103"></a> <font color=Cyan>,</font> HTypeable f<font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-104"></a> HTypeable <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-105"></a> toHType p <font color=Red>=</font> Tuple <font color=Red>[</font> toHType a<font color=Cyan>,</font> toHType b<font color=Cyan>,</font> toHType c<font color=Cyan>,</font> toHType d+<a name="line-106"></a> <font color=Cyan>,</font> toHType e<font color=Cyan>,</font> toHType f <font color=Red>]</font>+<a name="line-107"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>)</font> <font color=Red>=</font> p+<a name="line-108"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>,</font> HTypeable c<font color=Cyan>,</font> HTypeable d<font color=Cyan>,</font> HTypeable e+<a name="line-109"></a> <font color=Cyan>,</font> HTypeable f<font color=Cyan>,</font> HTypeable g<font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-110"></a> HTypeable <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-111"></a> toHType p <font color=Red>=</font> Tuple <font color=Red>[</font> toHType a<font color=Cyan>,</font> toHType b<font color=Cyan>,</font> toHType c<font color=Cyan>,</font> toHType d+<a name="line-112"></a> <font color=Cyan>,</font> toHType e<font color=Cyan>,</font> toHType f<font color=Cyan>,</font> toHType g <font color=Red>]</font>+<a name="line-113"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>)</font> <font color=Red>=</font> p+<a name="line-114"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>,</font> HTypeable c<font color=Cyan>,</font> HTypeable d<font color=Cyan>,</font> HTypeable e+<a name="line-115"></a> <font color=Cyan>,</font> HTypeable f<font color=Cyan>,</font> HTypeable g<font color=Cyan>,</font> HTypeable h<font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-116"></a> HTypeable <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-117"></a> toHType p <font color=Red>=</font> Tuple <font color=Red>[</font> toHType a<font color=Cyan>,</font> toHType b<font color=Cyan>,</font> toHType c<font color=Cyan>,</font> toHType d+<a name="line-118"></a> <font color=Cyan>,</font> toHType e<font color=Cyan>,</font> toHType f<font color=Cyan>,</font> toHType g<font color=Cyan>,</font> toHType h <font color=Red>]</font>+<a name="line-119"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>)</font> <font color=Red>=</font> p+<a name="line-120"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>,</font> HTypeable c<font color=Cyan>,</font> HTypeable d<font color=Cyan>,</font> HTypeable e+<a name="line-121"></a> <font color=Cyan>,</font> HTypeable f<font color=Cyan>,</font> HTypeable g<font color=Cyan>,</font> HTypeable h<font color=Cyan>,</font> HTypeable i<font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-122"></a> HTypeable <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-123"></a> toHType p <font color=Red>=</font> Tuple <font color=Red>[</font> toHType a<font color=Cyan>,</font> toHType b<font color=Cyan>,</font> toHType c<font color=Cyan>,</font> toHType d+<a name="line-124"></a> <font color=Cyan>,</font> toHType e<font color=Cyan>,</font> toHType f<font color=Cyan>,</font> toHType g<font color=Cyan>,</font> toHType h+<a name="line-125"></a> <font color=Cyan>,</font> toHType i <font color=Red>]</font>+<a name="line-126"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>)</font> <font color=Red>=</font> p+<a name="line-127"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>,</font> HTypeable c<font color=Cyan>,</font> HTypeable d<font color=Cyan>,</font> HTypeable e+<a name="line-128"></a> <font color=Cyan>,</font> HTypeable f<font color=Cyan>,</font> HTypeable g<font color=Cyan>,</font> HTypeable h<font color=Cyan>,</font> HTypeable i<font color=Cyan>,</font> HTypeable j<font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-129"></a> HTypeable <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-130"></a> toHType p <font color=Red>=</font> Tuple <font color=Red>[</font> toHType a<font color=Cyan>,</font> toHType b<font color=Cyan>,</font> toHType c<font color=Cyan>,</font> toHType d+<a name="line-131"></a> <font color=Cyan>,</font> toHType e<font color=Cyan>,</font> toHType f<font color=Cyan>,</font> toHType g<font color=Cyan>,</font> toHType h+<a name="line-132"></a> <font color=Cyan>,</font> toHType i<font color=Cyan>,</font> toHType j <font color=Red>]</font>+<a name="line-133"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>)</font> <font color=Red>=</font> p+<a name="line-134"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>,</font> HTypeable c<font color=Cyan>,</font> HTypeable d<font color=Cyan>,</font> HTypeable e+<a name="line-135"></a> <font color=Cyan>,</font> HTypeable f<font color=Cyan>,</font> HTypeable g<font color=Cyan>,</font> HTypeable h<font color=Cyan>,</font> HTypeable i<font color=Cyan>,</font> HTypeable j+<a name="line-136"></a> <font color=Cyan>,</font> HTypeable k<font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-137"></a> HTypeable <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-138"></a> toHType p <font color=Red>=</font> Tuple <font color=Red>[</font> toHType a<font color=Cyan>,</font> toHType b<font color=Cyan>,</font> toHType c<font color=Cyan>,</font> toHType d+<a name="line-139"></a> <font color=Cyan>,</font> toHType e<font color=Cyan>,</font> toHType f<font color=Cyan>,</font> toHType g<font color=Cyan>,</font> toHType h+<a name="line-140"></a> <font color=Cyan>,</font> toHType i<font color=Cyan>,</font> toHType j<font color=Cyan>,</font> toHType k <font color=Red>]</font>+<a name="line-141"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>)</font> <font color=Red>=</font> p+<a name="line-142"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>,</font> HTypeable c<font color=Cyan>,</font> HTypeable d<font color=Cyan>,</font> HTypeable e+<a name="line-143"></a> <font color=Cyan>,</font> HTypeable f<font color=Cyan>,</font> HTypeable g<font color=Cyan>,</font> HTypeable h<font color=Cyan>,</font> HTypeable i<font color=Cyan>,</font> HTypeable j+<a name="line-144"></a> <font color=Cyan>,</font> HTypeable k<font color=Cyan>,</font> HTypeable l<font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-145"></a> HTypeable <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-146"></a> toHType p <font color=Red>=</font> Tuple <font color=Red>[</font> toHType a<font color=Cyan>,</font> toHType b<font color=Cyan>,</font> toHType c<font color=Cyan>,</font> toHType d+<a name="line-147"></a> <font color=Cyan>,</font> toHType e<font color=Cyan>,</font> toHType f<font color=Cyan>,</font> toHType g<font color=Cyan>,</font> toHType h+<a name="line-148"></a> <font color=Cyan>,</font> toHType i<font color=Cyan>,</font> toHType j<font color=Cyan>,</font> toHType k<font color=Cyan>,</font> toHType l <font color=Red>]</font>+<a name="line-149"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>)</font> <font color=Red>=</font> p+<a name="line-150"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>,</font> HTypeable c<font color=Cyan>,</font> HTypeable d<font color=Cyan>,</font> HTypeable e+<a name="line-151"></a> <font color=Cyan>,</font> HTypeable f<font color=Cyan>,</font> HTypeable g<font color=Cyan>,</font> HTypeable h<font color=Cyan>,</font> HTypeable i<font color=Cyan>,</font> HTypeable j+<a name="line-152"></a> <font color=Cyan>,</font> HTypeable k<font color=Cyan>,</font> HTypeable l<font color=Cyan>,</font> HTypeable m<font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-153"></a> HTypeable <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>,</font>m<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-154"></a> toHType p <font color=Red>=</font> Tuple <font color=Red>[</font> toHType a<font color=Cyan>,</font> toHType b<font color=Cyan>,</font> toHType c<font color=Cyan>,</font> toHType d+<a name="line-155"></a> <font color=Cyan>,</font> toHType e<font color=Cyan>,</font> toHType f<font color=Cyan>,</font> toHType g<font color=Cyan>,</font> toHType h+<a name="line-156"></a> <font color=Cyan>,</font> toHType i<font color=Cyan>,</font> toHType j<font color=Cyan>,</font> toHType k<font color=Cyan>,</font> toHType l+<a name="line-157"></a> <font color=Cyan>,</font> toHType m <font color=Red>]</font>+<a name="line-158"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>,</font>m<font color=Cyan>)</font> <font color=Red>=</font> p+<a name="line-159"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>,</font> HTypeable c<font color=Cyan>,</font> HTypeable d<font color=Cyan>,</font> HTypeable e+<a name="line-160"></a> <font color=Cyan>,</font> HTypeable f<font color=Cyan>,</font> HTypeable g<font color=Cyan>,</font> HTypeable h<font color=Cyan>,</font> HTypeable i<font color=Cyan>,</font> HTypeable j+<a name="line-161"></a> <font color=Cyan>,</font> HTypeable k<font color=Cyan>,</font> HTypeable l<font color=Cyan>,</font> HTypeable m<font color=Cyan>,</font> HTypeable n<font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-162"></a> HTypeable <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>,</font>m<font color=Cyan>,</font>n<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-163"></a> toHType p <font color=Red>=</font> Tuple <font color=Red>[</font> toHType a<font color=Cyan>,</font> toHType b<font color=Cyan>,</font> toHType c<font color=Cyan>,</font> toHType d+<a name="line-164"></a> <font color=Cyan>,</font> toHType e<font color=Cyan>,</font> toHType f<font color=Cyan>,</font> toHType g<font color=Cyan>,</font> toHType h+<a name="line-165"></a> <font color=Cyan>,</font> toHType i<font color=Cyan>,</font> toHType j<font color=Cyan>,</font> toHType k<font color=Cyan>,</font> toHType l+<a name="line-166"></a> <font color=Cyan>,</font> toHType m<font color=Cyan>,</font> toHType n <font color=Red>]</font>+<a name="line-167"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>,</font>m<font color=Cyan>,</font>n<font color=Cyan>)</font> <font color=Red>=</font> p+<a name="line-168"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>,</font> HTypeable c<font color=Cyan>,</font> HTypeable d<font color=Cyan>,</font> HTypeable e+<a name="line-169"></a> <font color=Cyan>,</font> HTypeable f<font color=Cyan>,</font> HTypeable g<font color=Cyan>,</font> HTypeable h<font color=Cyan>,</font> HTypeable i<font color=Cyan>,</font> HTypeable j+<a name="line-170"></a> <font color=Cyan>,</font> HTypeable k<font color=Cyan>,</font> HTypeable l<font color=Cyan>,</font> HTypeable m<font color=Cyan>,</font> HTypeable n<font color=Cyan>,</font> HTypeable o<font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-171"></a> HTypeable <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>,</font>m<font color=Cyan>,</font>n<font color=Cyan>,</font>o<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-172"></a> toHType p <font color=Red>=</font> Tuple <font color=Red>[</font> toHType a<font color=Cyan>,</font> toHType b<font color=Cyan>,</font> toHType c<font color=Cyan>,</font> toHType d+<a name="line-173"></a> <font color=Cyan>,</font> toHType e<font color=Cyan>,</font> toHType f<font color=Cyan>,</font> toHType g<font color=Cyan>,</font> toHType h+<a name="line-174"></a> <font color=Cyan>,</font> toHType i<font color=Cyan>,</font> toHType j<font color=Cyan>,</font> toHType k<font color=Cyan>,</font> toHType l+<a name="line-175"></a> <font color=Cyan>,</font> toHType m<font color=Cyan>,</font> toHType n<font color=Cyan>,</font> toHType o <font color=Red>]</font>+<a name="line-176"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>,</font>m<font color=Cyan>,</font>n<font color=Cyan>,</font>o<font color=Cyan>)</font> <font color=Red>=</font> p+<a name="line-177"></a>+<a name="line-178"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>)</font> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>Maybe a<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-179"></a> toHType m <font color=Red>=</font> Maybe <font color=Cyan>(</font>toHType x<font color=Cyan>)</font> <font color=Green><u>where</u></font> <font color=Cyan>(</font>Just x<font color=Cyan>)</font> <font color=Red>=</font> m+<a name="line-180"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>,</font> HTypeable b<font color=Cyan>)</font> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>Either a b<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-181"></a> toHType m <font color=Red>=</font> Defined <font color=Magenta>"Either"</font> <font color=Red>[</font>hx<font color=Cyan>,</font> hy<font color=Red>]</font>+<a name="line-182"></a> <font color=Red>[</font> Constr <font color=Magenta>"Left"</font> <font color=Red>[</font>hx<font color=Red>]</font> <font color=Red>[</font>hx<font color=Red>]</font> <font color=Blue>{-Nothing-}</font>+<a name="line-183"></a> <font color=Cyan>,</font> Constr <font color=Magenta>"Right"</font> <font color=Red>[</font>hy<font color=Red>]</font> <font color=Red>[</font>hy<font color=Red>]</font> <font color=Blue>{-Nothing-}</font><font color=Red>]</font>+<a name="line-184"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>Left x<font color=Cyan>)</font> <font color=Red>=</font> m+<a name="line-185"></a> <font color=Cyan>(</font>Right y<font color=Cyan>)</font> <font color=Red>=</font> m+<a name="line-186"></a> hx <font color=Red>=</font> toHType x+<a name="line-187"></a> hy <font color=Red>=</font> toHType y+<a name="line-188"></a>+<a name="line-189"></a><font color=Green><u>instance</u></font> HTypeable a <font color=Red>=></font> HTypeable <font color=Red>[</font>a<font color=Red>]</font> <font color=Green><u>where</u></font>+<a name="line-190"></a> toHType xs <font color=Red>=</font> <font color=Green><u>case</u></font> toHType x <font color=Green><u>of</u></font> <font color=Cyan>(</font>Prim <font color=Magenta>"Char"</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> String+<a name="line-191"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> List <font color=Cyan>(</font>toHType x<font color=Cyan>)</font>+<a name="line-192"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>x<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> xs+<a name="line-193"></a>+<a name="line-194"></a><font color=Blue>------------------------------------------------------------------------</font>+<a name="line-195"></a>+<a name="line-196"></a><a name="toDTD"></a><font color=Blue>-- | 'toDTD' converts a concrete representation of the Haskell type of</font>+<a name="line-197"></a><font color=Blue>-- a value (obtained by the method 'toHType') into a real DocTypeDecl.</font>+<a name="line-198"></a><font color=Blue>-- It ensures that PERefs are defined before they are used, and that no</font>+<a name="line-199"></a><font color=Blue>-- element or attribute-list is declared more than once.</font>+<a name="line-200"></a><font color=Blue>toDTD</font> <font color=Red>::</font> HType <font color=Red>-></font> DocTypeDecl+<a name="line-201"></a><font color=Blue>toDTD</font> ht <font color=Red>=</font>+<a name="line-202"></a> DTD <font color=Cyan>(</font>toplevel ht<font color=Cyan>)</font> Nothing <font color=Cyan>(</font>macrosFirst <font color=Cyan>(</font>reverse <font color=Cyan>(</font>h2d True [] [] <font color=Red>[</font>ht<font color=Red>]</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-203"></a> <font color=Green><u>where</u></font>+<a name="line-204"></a> macrosFirst <font color=Red>::</font> <font color=Red>[</font>MarkupDecl<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>MarkupDecl<font color=Red>]</font>+<a name="line-205"></a> macrosFirst decls <font color=Red>=</font> concat <font color=Red>[</font>p<font color=Cyan>,</font> p'<font color=Red>]</font> <font color=Green><u>where</u></font> <font color=Cyan>(</font>p<font color=Cyan>,</font> p'<font color=Cyan>)</font> <font color=Red>=</font> partition f decls+<a name="line-206"></a> f <font color=Cyan>(</font>Entity <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True+<a name="line-207"></a> f <font color=Green><u>_</u></font> <font color=Red>=</font> False+<a name="line-208"></a> toplevel ht<font color=Red>@</font><font color=Cyan>(</font>Defined <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> showHType ht <font color=Magenta>"-XML"</font>+<a name="line-209"></a> toplevel ht<font color=Red>@</font><font color=Green><u>_</u></font> <font color=Red>=</font> showHType ht <font color=Magenta>""</font>+<a name="line-210"></a> c0 <font color=Red>=</font> False+<a name="line-211"></a> h2d <font color=Red>::</font> Bool <font color=Red>-></font> <font color=Red>[</font>HType<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>Constr<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>HType<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>MarkupDecl<font color=Red>]</font>+<a name="line-212"></a> <font color=Blue>-- toplevel? history history remainingwork result</font>+<a name="line-213"></a> h2d c history chist [] <font color=Red>=</font> []+<a name="line-214"></a> h2d c history chist <font color=Cyan>(</font>ht<font color=Red><b>:</b></font>hts<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-215"></a> <font color=Green><u>if</u></font> ht <font color=Cyan>`elem`</font> history <font color=Green><u>then</u></font> h2d c0 history chist hts+<a name="line-216"></a> <font color=Green><u>else</u></font>+<a name="line-217"></a> <font color=Green><u>case</u></font> ht <font color=Green><u>of</u></font>+<a name="line-218"></a> Maybe ht0 <font color=Red>-></font> declelem ht<font color=Red><b>:</b></font> h2d c0 <font color=Cyan>(</font>ht<font color=Red><b>:</b></font>history<font color=Cyan>)</font> chist <font color=Cyan>(</font>ht0<font color=Red><b>:</b></font>hts<font color=Cyan>)</font>+<a name="line-219"></a> List ht0 <font color=Red>-></font> declelem ht<font color=Red><b>:</b></font> h2d c0 <font color=Cyan>(</font>ht<font color=Red><b>:</b></font>history<font color=Cyan>)</font> chist <font color=Cyan>(</font>ht0<font color=Red><b>:</b></font>hts<font color=Cyan>)</font>+<a name="line-220"></a> Tuple hts0 <font color=Red>-></font> <font color=Cyan>(</font>c <font color=Cyan>?</font> <font color=Cyan>(</font>declelem ht<font color=Red><b>:</b></font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-221"></a> <font color=Cyan>(</font>h2d c0 history chist <font color=Cyan>(</font>hts0<font color=Cyan>++</font>hts<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-222"></a> Prim s t <font color=Red>-></font> declprim ht <font color=Cyan>++</font> h2d c0 <font color=Cyan>(</font>ht<font color=Red><b>:</b></font>history<font color=Cyan>)</font> chist hts+<a name="line-223"></a> String <font color=Red>-></font> declstring<font color=Red><b>:</b></font> h2d c0 <font color=Cyan>(</font>ht<font color=Red><b>:</b></font>history<font color=Cyan>)</font> chist hts+<a name="line-224"></a> Defined s <font color=Green><u>_</u></font> cs <font color=Red>-></font>+<a name="line-225"></a> <font color=Green><u>let</u></font> hts0 <font color=Red>=</font> concatMap grab cs <font color=Green><u>in</u></font>+<a name="line-226"></a> <font color=Cyan>(</font>c <font color=Cyan>?</font> <font color=Cyan>(</font>decltopelem ht<font color=Red><b>:</b></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>declmacro ht chist<font color=Cyan>)</font>+<a name="line-227"></a> <font color=Cyan>++</font> h2d c0 <font color=Cyan>(</font>ht<font color=Red><b>:</b></font>history<font color=Cyan>)</font> <font color=Cyan>(</font>cs<font color=Cyan>++</font>chist<font color=Cyan>)</font> <font color=Cyan>(</font>hts0<font color=Cyan>++</font>hts<font color=Cyan>)</font>+<a name="line-228"></a> declelem ht <font color=Red>=</font>+<a name="line-229"></a> Element <font color=Cyan>(</font>ElementDecl <font color=Cyan>(</font>showHType ht <font color=Magenta>""</font><font color=Cyan>)</font> <font color=Cyan>(</font>ContentSpec <font color=Cyan>(</font>outerHtExpr ht<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-230"></a> decltopelem ht <font color=Red>=</font> <font color=Blue>-- hack to avoid peref at toplevel</font>+<a name="line-231"></a> Element <font color=Cyan>(</font>ElementDecl <font color=Cyan>(</font>showHType ht <font color=Magenta>"-XML"</font><font color=Cyan>)</font> <font color=Cyan>(</font>ContentSpec <font color=Cyan>(</font>innerHtExpr ht None<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-232"></a> declmacro ht<font color=Red>@</font><font color=Cyan>(</font>Defined <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> cs<font color=Cyan>)</font> chist <font color=Red>=</font>+<a name="line-233"></a> Entity <font color=Cyan>(</font>EntityPEDecl <font color=Cyan>(</font>PEDecl <font color=Cyan>(</font>showHType ht <font color=Magenta>""</font><font color=Cyan>)</font> <font color=Cyan>(</font>PEDefEntityValue ev<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Red><b>:</b></font>+<a name="line-234"></a> concatMap <font color=Cyan>(</font>declConstr chist<font color=Cyan>)</font> cs+<a name="line-235"></a> <font color=Green><u>where</u></font> ev <font color=Red>=</font> EntityValue <font color=Red>[</font>EVString <font color=Cyan>(</font>render <font color=Cyan>(</font>PP<font color=Cyan>.</font>cp <font color=Cyan>(</font>outerHtExpr ht<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Red>]</font>+<a name="line-236"></a> declConstr chist c<font color=Red>@</font><font color=Cyan>(</font>Constr s fv hts<font color=Cyan>)</font>+<a name="line-237"></a> <font color=Red>|</font> c <font color=Cyan>`notElem`</font> chist <font color=Red>=</font>+<a name="line-238"></a> <font color=Red>[</font>Element <font color=Cyan>(</font>ElementDecl <font color=Cyan>(</font>flatConstr c <font color=Magenta>""</font><font color=Cyan>)</font> <font color=Cyan>(</font>ContentSpec <font color=Cyan>(</font>constrHtExpr c<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Red>]</font>+<a name="line-239"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> [] +<a name="line-240"></a> declprim <font color=Cyan>(</font>Prim s t<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-241"></a> <font color=Red>[</font> Element <font color=Cyan>(</font>ElementDecl t EMPTY<font color=Cyan>)</font>+<a name="line-242"></a> <font color=Cyan>,</font> AttList <font color=Cyan>(</font>AttListDecl t <font color=Red>[</font>AttDef <font color=Magenta>"value"</font> StringType REQUIRED<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font>+<a name="line-243"></a> declstring <font color=Red>=</font>+<a name="line-244"></a> Element <font color=Cyan>(</font>ElementDecl <font color=Magenta>"string"</font> <font color=Cyan>(</font>Mixed PCDATA<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-245"></a> grab <font color=Cyan>(</font>Constr <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> hts<font color=Cyan>)</font> <font color=Red>=</font> hts+<a name="line-246"></a>+<a name="line-247"></a><a name="?"></a><font color=Cyan>(</font><font color=Cyan>?</font><font color=Cyan>)</font> <font color=Red>::</font> Bool <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font>a<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font>a<font color=Cyan>)</font>+<a name="line-248"></a><a name="b"></a><font color=Blue>b</font> <font color=Cyan>?</font> f <font color=Red>|</font> b <font color=Red>=</font> f+<a name="line-249"></a> <font color=Red>|</font> not b <font color=Red>=</font> id+<a name="line-250"></a>+<a name="line-251"></a><a name="showHType"></a><font color=Blue>-- Flatten an HType to a String suitable for an XML tagname.</font>+<a name="line-252"></a><font color=Blue>showHType</font> <font color=Red>::</font> HType <font color=Red>-></font> ShowS+<a name="line-253"></a><font color=Blue>showHType</font> <font color=Cyan>(</font>Maybe ht<font color=Cyan>)</font> <font color=Red>=</font> showString <font color=Magenta>"maybe-"</font> <font color=Cyan>.</font> showHType ht+<a name="line-254"></a><font color=Blue>showHType</font> <font color=Cyan>(</font>List ht<font color=Cyan>)</font> <font color=Red>=</font> showString <font color=Magenta>"list-"</font> <font color=Cyan>.</font> showHType ht+<a name="line-255"></a><font color=Blue>showHType</font> <font color=Cyan>(</font>Tuple hts<font color=Cyan>)</font> <font color=Red>=</font> showString <font color=Magenta>"tuple"</font> <font color=Cyan>.</font> shows <font color=Cyan>(</font>length hts<font color=Cyan>)</font>+<a name="line-256"></a> <font color=Cyan>.</font> showChar <font color=Magenta>'-'</font>+<a name="line-257"></a> <font color=Cyan>.</font> foldr1 <font color=Cyan>(</font><font color=Cyan>.</font><font color=Cyan>)</font> <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>showChar <font color=Magenta>'-'</font><font color=Cyan>)</font>+<a name="line-258"></a> <font color=Cyan>(</font>map showHType hts<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-259"></a><font color=Blue>showHType</font> <font color=Cyan>(</font>Prim s t<font color=Cyan>)</font> <font color=Red>=</font> showString t+<a name="line-260"></a><font color=Blue>showHType</font> String <font color=Red>=</font> showString <font color=Magenta>"string"</font>+<a name="line-261"></a><font color=Blue>showHType</font> <font color=Cyan>(</font>Defined s fv <font color=Green><u>_</u></font><font color=Cyan>)</font>+<a name="line-262"></a> <font color=Red>=</font> showString s <font color=Cyan>.</font> <font color=Cyan>(</font><font color=Cyan>(</font>length fv <font color=Cyan>></font> <font color=Magenta>0</font><font color=Cyan>)</font> <font color=Cyan>?</font> <font color=Cyan>(</font>showChar <font color=Magenta>'-'</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-263"></a> <font color=Cyan>.</font> foldr <font color=Cyan>(</font><font color=Cyan>.</font><font color=Cyan>)</font> id <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>showChar <font color=Magenta>'-'</font><font color=Cyan>)</font>+<a name="line-264"></a> <font color=Cyan>(</font>map showHType fv<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-265"></a>+<a name="line-266"></a><a name="flatConstr"></a><font color=Blue>flatConstr</font> <font color=Red>::</font> Constr <font color=Red>-></font> ShowS+<a name="line-267"></a><font color=Blue>flatConstr</font> <font color=Cyan>(</font>Constr s fv <font color=Green><u>_</u></font><font color=Cyan>)</font>+<a name="line-268"></a> <font color=Red>=</font> showString s <font color=Cyan>.</font> <font color=Cyan>(</font><font color=Cyan>(</font>length fv <font color=Cyan>></font> <font color=Magenta>0</font><font color=Cyan>)</font> <font color=Cyan>?</font> <font color=Cyan>(</font>showChar <font color=Magenta>'-'</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-269"></a> <font color=Cyan>.</font> foldr <font color=Cyan>(</font><font color=Cyan>.</font><font color=Cyan>)</font> id <font color=Cyan>(</font>intersperse <font color=Cyan>(</font>showChar <font color=Magenta>'-'</font><font color=Cyan>)</font> <font color=Cyan>(</font>map showHType fv<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-270"></a>+<a name="line-271"></a><a name="outerHtExpr"></a><font color=Blue>outerHtExpr</font> <font color=Red>::</font> HType <font color=Red>-></font> CP+<a name="line-272"></a><font color=Blue>outerHtExpr</font> <font color=Cyan>(</font>Maybe ht<font color=Cyan>)</font> <font color=Red>=</font> innerHtExpr ht Query+<a name="line-273"></a><font color=Blue>outerHtExpr</font> <font color=Cyan>(</font>List ht<font color=Cyan>)</font> <font color=Red>=</font> innerHtExpr ht Star+<a name="line-274"></a><font color=Blue>outerHtExpr</font> <font color=Cyan>(</font>Defined s fv cs<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-275"></a> Choice <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font>TagName <font color=Cyan>(</font>flatConstr c <font color=Magenta>""</font><font color=Cyan>)</font> None<font color=Cyan>)</font> cs<font color=Cyan>)</font> None+<a name="line-276"></a><font color=Blue>outerHtExpr</font> ht <font color=Red>=</font> innerHtExpr ht None+<a name="line-277"></a>+<a name="line-278"></a><a name="innerHtExpr"></a><font color=Blue>innerHtExpr</font> <font color=Red>::</font> HType <font color=Red>-></font> Modifier <font color=Red>-></font> CP+<a name="line-279"></a><font color=Blue>innerHtExpr</font> <font color=Cyan>(</font>Prim s t<font color=Cyan>)</font> m <font color=Red>=</font> TagName t m+<a name="line-280"></a><font color=Blue>innerHtExpr</font> <font color=Cyan>(</font>Tuple hts<font color=Cyan>)</font> m <font color=Red>=</font> Seq <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font> innerHtExpr c None<font color=Cyan>)</font> hts<font color=Cyan>)</font> m+<a name="line-281"></a><font color=Blue>innerHtExpr</font> ht<font color=Red>@</font><font color=Cyan>(</font>Defined s hts cs<font color=Cyan>)</font> m <font color=Red>=</font> <font color=Blue>-- CPPE (showHType ht "") (outerHtExpr ht)</font>+<a name="line-282"></a> TagName <font color=Cyan>(</font><font color=Magenta>'%'</font><font color=Red><b>:</b></font> showHType ht <font color=Magenta>";"</font><font color=Cyan>)</font> m+<a name="line-283"></a> <font color=Blue>-- ***HACK!!!***</font>+<a name="line-284"></a><font color=Blue>innerHtExpr</font> ht m <font color=Red>=</font> TagName <font color=Cyan>(</font>showHType ht <font color=Magenta>""</font><font color=Cyan>)</font> m+<a name="line-285"></a>+<a name="line-286"></a><a name="constrHtExpr"></a><font color=Blue>constrHtExpr</font> <font color=Red>::</font> Constr <font color=Red>-></font> CP+<a name="line-287"></a><font color=Blue>constrHtExpr</font> <font color=Cyan>(</font>Constr s fv []<font color=Cyan>)</font> <font color=Red>=</font> TagName <font color=Magenta>"EMPTY"</font> None <font color=Blue>-- ***HACK!!!***</font>+<a name="line-288"></a><font color=Blue>constrHtExpr</font> <font color=Cyan>(</font>Constr s fv hts<font color=Cyan>)</font> <font color=Red>=</font> innerHtExpr <font color=Cyan>(</font>Tuple hts<font color=Cyan>)</font> None+<a name="line-289"></a>+<a name="line-290"></a><font color=Blue>------------------------------------------------------------------------</font> </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/Types.html view
@@ -1,296 +1,302 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>{- |-<a name="(line2)"></a> This module defines an internal (generic) representation for XML-<a name="(line3)"></a> documents including their DTDs.-<a name="(line4)"></a>-<a name="(line5)"></a> History:-<a name="(line6)"></a> The original module was derived by hand from the XML specification,-<a name="(line7)"></a> following the grammar precisely. Then we simplified the types,-<a name="(line8)"></a> removing layers of indirection and redundancy, and generally making-<a name="(line9)"></a> things easier to work with. Then we allowed PEReferences to be-<a name="(line10)"></a> ubiquitous, by removing them from the types and resolving all-<a name="(line11)"></a> PE references at parse-time. Finally, we added a per-document-<a name="(line12)"></a> symbol table for GEReferences, and a whitespace-significance flag-<a name="(line13)"></a> for plaintext.-<a name="(line14)"></a>-}</font>-<a name="(line15)"></a>-<a name="(line16)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line17)"></a> <font color=Cyan>(</font>-<a name="(line18)"></a> <font color=Blue>-- * A simple symbol table mapping strings (references) to values.</font>-<a name="(line19)"></a> SymTab-<a name="(line20)"></a> <font color=Blue>-- ** Symbol table operations</font>-<a name="(line21)"></a> <font color=Cyan>,</font> emptyST-<a name="(line22)"></a> <font color=Cyan>,</font> addST-<a name="(line23)"></a> <font color=Cyan>,</font> lookupST-<a name="(line24)"></a>-<a name="(line25)"></a> <font color=Blue>-- * XML Types</font>-<a name="(line26)"></a> <font color=Blue>-- ** The top-level document container</font>-<a name="(line27)"></a> <font color=Cyan>,</font> Document<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line28)"></a>-<a name="(line29)"></a> <font color=Blue>-- ** The main document content</font>-<a name="(line30)"></a> <font color=Cyan>,</font> Element<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line31)"></a> <font color=Cyan>,</font> ElemTag<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line32)"></a> <font color=Cyan>,</font> Content<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line33)"></a> <font color=Cyan>,</font> Attribute-<a name="(line34)"></a> <font color=Cyan>,</font> AttValue<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line35)"></a> <font color=Cyan>,</font> info-<a name="(line36)"></a>-<a name="(line37)"></a> <font color=Blue>-- ** Administrative parts of the document</font>-<a name="(line38)"></a> <font color=Cyan>,</font> Prolog<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line39)"></a> <font color=Cyan>,</font> XMLDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line40)"></a> <font color=Cyan>,</font> Misc<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line41)"></a> <font color=Cyan>,</font> ProcessingInstruction-<a name="(line42)"></a> <font color=Cyan>,</font> SDDecl-<a name="(line43)"></a> <font color=Cyan>,</font> VersionInfo-<a name="(line44)"></a> <font color=Cyan>,</font> Comment-<a name="(line45)"></a> <font color=Cyan>,</font> PITarget-<a name="(line46)"></a>-<a name="(line47)"></a> <font color=Blue>-- ** The DTD</font>-<a name="(line48)"></a> <font color=Blue>-- *** content model</font>-<a name="(line49)"></a> <font color=Cyan>,</font> DocTypeDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line50)"></a> <font color=Cyan>,</font> MarkupDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line51)"></a> <font color=Cyan>,</font> ExtSubset<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line52)"></a> <font color=Cyan>,</font> ExtSubsetDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line53)"></a> <font color=Cyan>,</font> ElementDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line54)"></a> <font color=Cyan>,</font> ContentSpec<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line55)"></a> <font color=Cyan>,</font> CP<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line56)"></a> <font color=Cyan>,</font> Modifier<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line57)"></a> <font color=Cyan>,</font> Mixed<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line58)"></a>-<a name="(line59)"></a> <font color=Blue>-- *** attribute model</font>-<a name="(line60)"></a> <font color=Cyan>,</font> AttListDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line61)"></a> <font color=Cyan>,</font> AttDef<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line62)"></a> <font color=Cyan>,</font> AttType<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line63)"></a> <font color=Cyan>,</font> TokenizedType<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line64)"></a> <font color=Cyan>,</font> EnumeratedType<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line65)"></a> <font color=Cyan>,</font> NotationType-<a name="(line66)"></a> <font color=Cyan>,</font> Enumeration-<a name="(line67)"></a> <font color=Cyan>,</font> DefaultDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line68)"></a> <font color=Cyan>,</font> FIXED<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line69)"></a>-<a name="(line70)"></a> <font color=Blue>-- *** conditional sections</font>-<a name="(line71)"></a> <font color=Cyan>,</font> ConditionalSect<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line72)"></a> <font color=Cyan>,</font> IncludeSect-<a name="(line73)"></a> <font color=Cyan>,</font> IgnoreSect-<a name="(line74)"></a> <font color=Cyan>,</font> Ignore<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line75)"></a> <font color=Cyan>,</font> IgnoreSectContents<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line76)"></a>-<a name="(line77)"></a> <font color=Blue>-- ** References</font>-<a name="(line78)"></a> <font color=Cyan>,</font> Reference<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line79)"></a> <font color=Cyan>,</font> EntityRef-<a name="(line80)"></a> <font color=Cyan>,</font> CharRef-<a name="(line81)"></a> <font color=Cyan>,</font> PEReference-<a name="(line82)"></a>-<a name="(line83)"></a> <font color=Blue>-- ** Entities</font>-<a name="(line84)"></a> <font color=Cyan>,</font> EntityDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line85)"></a> <font color=Cyan>,</font> GEDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line86)"></a> <font color=Cyan>,</font> PEDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line87)"></a> <font color=Cyan>,</font> EntityDef<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line88)"></a> <font color=Cyan>,</font> PEDef<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line89)"></a> <font color=Cyan>,</font> ExternalID<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line90)"></a> <font color=Cyan>,</font> NDataDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line91)"></a> <font color=Cyan>,</font> TextDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line92)"></a> <font color=Cyan>,</font> ExtParsedEnt<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line93)"></a> <font color=Cyan>,</font> ExtPE<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line94)"></a> <font color=Cyan>,</font> NotationDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line95)"></a> <font color=Cyan>,</font> PublicID<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line96)"></a> <font color=Cyan>,</font> EncodingDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line97)"></a> <font color=Cyan>,</font> EntityValue<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line98)"></a> <font color=Cyan>,</font> EV<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line99)"></a> <font color=Cyan>,</font> PubidLiteral<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line100)"></a> <font color=Cyan>,</font> SystemLiteral<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line101)"></a>-<a name="(line102)"></a> <font color=Blue>-- ** Basic value types</font>-<a name="(line103)"></a> <font color=Cyan>,</font> Name-<a name="(line104)"></a> <font color=Cyan>,</font> Names-<a name="(line105)"></a> <font color=Cyan>,</font> NmToken-<a name="(line106)"></a> <font color=Cyan>,</font> NmTokens-<a name="(line107)"></a> <font color=Cyan>,</font> CharData-<a name="(line108)"></a> <font color=Cyan>,</font> CDSect-<a name="(line109)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line110)"></a>-<a name="(line111)"></a>-<a name="(line112)"></a><font color=Blue>{- A simple symbol table for storing macros whilst parsing. -}</font>-<a name="(line113)"></a>-<a name="(line114)"></a><a name="SymTab"></a><font color=Green><u>type</u></font> SymTab a <font color=Red>=</font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font>a<font color=Cyan>)</font><font color=Red>]</font>-<a name="(line115)"></a>-<a name="(line116)"></a><a name="emptyST"></a>emptyST <font color=Red>::</font> SymTab a-<a name="(line117)"></a>emptyST <font color=Red>=</font> []-<a name="(line118)"></a>-<a name="(line119)"></a><a name="addST"></a>addST <font color=Red>::</font> String <font color=Red>-></font> a <font color=Red>-></font> SymTab a <font color=Red>-></font> SymTab a-<a name="(line120)"></a>addST n v <font color=Red>=</font> <font color=Cyan>(</font><font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Cyan>)</font><font color=Red><b>:</b></font><font color=Cyan>)</font>-<a name="(line121)"></a>-<a name="(line122)"></a><a name="lookupST"></a>lookupST <font color=Red>::</font> String <font color=Red>-></font> SymTab a <font color=Red>-></font> Maybe a-<a name="(line123)"></a>lookupST <font color=Red>=</font> lookup-<a name="(line124)"></a>-<a name="(line125)"></a>-<a name="(line126)"></a>-<a name="(line127)"></a><font color=Blue>{- XML types start here -}</font>-<a name="(line128)"></a>-<a name="(line129)"></a><a name="Document"></a><font color=Blue>-- | The symbol table stored in a document holds all its general entity</font>-<a name="(line130)"></a><a name="Document"></a><font color=Blue>-- reference definitions.</font>-<a name="(line131)"></a><a name="Document"></a><font color=Green><u>data</u></font> Document i <font color=Red>=</font> Document Prolog <font color=Cyan>(</font>SymTab EntityDef<font color=Cyan>)</font> <font color=Cyan>(</font>Element i<font color=Cyan>)</font> <font color=Red>[</font>Misc<font color=Red>]</font>-<a name="(line132)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line133)"></a><a name="Prolog"></a><font color=Green><u>data</u></font> Prolog <font color=Red>=</font> Prolog <font color=Cyan>(</font>Maybe XMLDecl<font color=Cyan>)</font> <font color=Red>[</font>Misc<font color=Red>]</font> <font color=Cyan>(</font>Maybe DocTypeDecl<font color=Cyan>)</font> <font color=Red>[</font>Misc<font color=Red>]</font>-<a name="(line134)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line135)"></a><a name="XMLDecl"></a><font color=Green><u>data</u></font> XMLDecl <font color=Red>=</font> XMLDecl VersionInfo <font color=Cyan>(</font>Maybe EncodingDecl<font color=Cyan>)</font> <font color=Cyan>(</font>Maybe SDDecl<font color=Cyan>)</font>-<a name="(line136)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line137)"></a><a name="Misc"></a><font color=Green><u>data</u></font> Misc <font color=Red>=</font> Comment Comment-<a name="(line138)"></a> <font color=Red>|</font> PI ProcessingInstruction-<a name="(line139)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line140)"></a>-<a name="(line141)"></a><a name="ProcessingInstruction"></a><font color=Green><u>type</u></font> ProcessingInstruction <font color=Red>=</font> <font color=Cyan>(</font>PITarget<font color=Cyan>,</font>String<font color=Cyan>)</font>-<a name="(line142)"></a>-<a name="(line143)"></a><a name="SDDecl"></a><font color=Green><u>type</u></font> SDDecl <font color=Red>=</font> Bool-<a name="(line144)"></a><a name="VersionInfo"></a><font color=Green><u>type</u></font> VersionInfo <font color=Red>=</font> String-<a name="(line145)"></a><a name="Comment"></a><font color=Green><u>type</u></font> Comment <font color=Red>=</font> String-<a name="(line146)"></a><a name="PITarget"></a><font color=Green><u>type</u></font> PITarget <font color=Red>=</font> String-<a name="(line147)"></a>-<a name="(line148)"></a><a name="DocTypeDecl"></a><font color=Green><u>data</u></font> DocTypeDecl <font color=Red>=</font> DTD Name <font color=Cyan>(</font>Maybe ExternalID<font color=Cyan>)</font> <font color=Red>[</font>MarkupDecl<font color=Red>]</font> <font color=Green><u>deriving</u></font> Eq-<a name="(line149)"></a><a name="MarkupDecl"></a><font color=Green><u>data</u></font> MarkupDecl <font color=Red>=</font> Element ElementDecl-<a name="(line150)"></a> <font color=Red>|</font> AttList AttListDecl-<a name="(line151)"></a> <font color=Red>|</font> Entity EntityDecl-<a name="(line152)"></a> <font color=Red>|</font> Notation NotationDecl-<a name="(line153)"></a> <font color=Red>|</font> MarkupMisc Misc-<a name="(line154)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line155)"></a>-<a name="(line156)"></a><a name="ExtSubset"></a><font color=Green><u>data</u></font> ExtSubset <font color=Red>=</font> ExtSubset <font color=Cyan>(</font>Maybe TextDecl<font color=Cyan>)</font> <font color=Red>[</font>ExtSubsetDecl<font color=Red>]</font> <font color=Green><u>deriving</u></font> Eq-<a name="(line157)"></a><a name="ExtSubsetDecl"></a><font color=Green><u>data</u></font> ExtSubsetDecl <font color=Red>=</font> ExtMarkupDecl MarkupDecl-<a name="(line158)"></a> <font color=Red>|</font> ExtConditionalSect ConditionalSect-<a name="(line159)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line160)"></a>-<a name="(line161)"></a><a name="Element"></a><font color=Green><u>data</u></font> Element i <font color=Red>=</font> Elem Name <font color=Red>[</font>Attribute<font color=Red>]</font> <font color=Red>[</font>Content i<font color=Red>]</font> <font color=Green><u>deriving</u></font> Eq-<a name="(line162)"></a> <font color=Blue>-- intermediate for parsing</font>-<a name="(line163)"></a><a name="ElemTag"></a><font color=Green><u>data</u></font> ElemTag <font color=Red>=</font> ElemTag Name <font color=Red>[</font>Attribute<font color=Red>]</font>-<a name="(line164)"></a><a name="Attribute"></a><font color=Green><u>type</u></font> Attribute <font color=Red>=</font> <font color=Cyan>(</font>Name<font color=Cyan>,</font> AttValue<font color=Cyan>)</font>-<a name="(line165)"></a><a name="Content"></a><font color=Green><u>data</u></font> Content i <font color=Red>=</font> CElem <font color=Cyan>(</font>Element i<font color=Cyan>)</font> i-<a name="(line166)"></a> <font color=Red>|</font> CString Bool CharData i-<a name="(line167)"></a> <font color=Blue>-- ^ bool is whether whitespace is significant</font>-<a name="(line168)"></a> <font color=Red>|</font> CRef Reference i-<a name="(line169)"></a> <font color=Red>|</font> CMisc Misc i-<a name="(line170)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line171)"></a>-<a name="(line172)"></a><a name="info"></a>info <font color=Red>::</font> Content t <font color=Red>-></font> t-<a name="(line173)"></a>info <font color=Cyan>(</font>CElem <font color=Green><u>_</u></font> i<font color=Cyan>)</font> <font color=Red>=</font> i-<a name="(line174)"></a>info <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> i<font color=Cyan>)</font> <font color=Red>=</font> i-<a name="(line175)"></a>info <font color=Cyan>(</font>CRef <font color=Green><u>_</u></font> i<font color=Cyan>)</font> <font color=Red>=</font> i-<a name="(line176)"></a>info <font color=Cyan>(</font>CMisc <font color=Green><u>_</u></font> i<font color=Cyan>)</font> <font color=Red>=</font> i-<a name="(line177)"></a>-<a name="(line178)"></a><font color=Green><u>instance</u></font> Functor Document <font color=Green><u>where</u></font>-<a name="(line179)"></a> fmap f <font color=Cyan>(</font>Document p st e ms<font color=Cyan>)</font> <font color=Red>=</font> Document p st <font color=Cyan>(</font>fmap f e<font color=Cyan>)</font> ms-<a name="(line180)"></a><font color=Green><u>instance</u></font> Functor Element <font color=Green><u>where</u></font>-<a name="(line181)"></a> fmap f <font color=Cyan>(</font>Elem t <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> <font color=Red>=</font> Elem t <font color=Green><u>as</u></font> <font color=Cyan>(</font>map <font color=Cyan>(</font>fmap f<font color=Cyan>)</font> cs<font color=Cyan>)</font>-<a name="(line182)"></a><font color=Green><u>instance</u></font> Functor Content <font color=Green><u>where</u></font>-<a name="(line183)"></a> fmap f <font color=Cyan>(</font>CElem e i<font color=Cyan>)</font> <font color=Red>=</font> CElem <font color=Cyan>(</font>fmap f e<font color=Cyan>)</font> <font color=Cyan>(</font>f i<font color=Cyan>)</font>-<a name="(line184)"></a> fmap f <font color=Cyan>(</font>CString b s i<font color=Cyan>)</font> <font color=Red>=</font> CString b s <font color=Cyan>(</font>f i<font color=Cyan>)</font>-<a name="(line185)"></a> fmap f <font color=Cyan>(</font>CRef r i<font color=Cyan>)</font> <font color=Red>=</font> CRef r <font color=Cyan>(</font>f i<font color=Cyan>)</font>-<a name="(line186)"></a> fmap f <font color=Cyan>(</font>CMisc m i<font color=Cyan>)</font> <font color=Red>=</font> CMisc m <font color=Cyan>(</font>f i<font color=Cyan>)</font>-<a name="(line187)"></a>-<a name="(line188)"></a><a name="ElementDecl"></a><font color=Green><u>data</u></font> ElementDecl <font color=Red>=</font> ElementDecl Name ContentSpec <font color=Green><u>deriving</u></font> Eq-<a name="(line189)"></a><a name="ContentSpec"></a><font color=Green><u>data</u></font> ContentSpec <font color=Red>=</font> EMPTY-<a name="(line190)"></a> <font color=Red>|</font> ANY-<a name="(line191)"></a> <font color=Red>|</font> Mixed Mixed-<a name="(line192)"></a> <font color=Red>|</font> ContentSpec CP-<a name="(line193)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line194)"></a><a name="CP"></a><font color=Blue>-- FIXME: What is TagName here? Seems to be in disagreement with XML spec.</font>-<a name="(line195)"></a><a name="CP"></a><font color=Green><u>data</u></font> CP <font color=Red>=</font> TagName Name Modifier-<a name="(line196)"></a> <font color=Red>|</font> Choice <font color=Red>[</font>CP<font color=Red>]</font> Modifier-<a name="(line197)"></a> <font color=Red>|</font> Seq <font color=Red>[</font>CP<font color=Red>]</font> Modifier-<a name="(line198)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line199)"></a><a name="Modifier"></a><font color=Green><u>data</u></font> Modifier <font color=Red>=</font> None <font color=Blue>-- ^ Just One</font>-<a name="(line200)"></a> <font color=Red>|</font> Query <font color=Blue>-- ^ Zero Or One</font>-<a name="(line201)"></a> <font color=Red>|</font> Star <font color=Blue>-- ^ Zero Or More</font>-<a name="(line202)"></a> <font color=Red>|</font> Plus <font color=Blue>-- ^ One Or More</font>-<a name="(line203)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line204)"></a><a name="Mixed"></a><font color=Green><u>data</u></font> Mixed <font color=Red>=</font> PCDATA-<a name="(line205)"></a> <font color=Red>|</font> PCDATAplus <font color=Red>[</font>Name<font color=Red>]</font>-<a name="(line206)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line207)"></a><a name="AttListDecl"></a><font color=Green><u>data</u></font> AttListDecl <font color=Red>=</font> AttListDecl Name <font color=Red>[</font>AttDef<font color=Red>]</font> <font color=Green><u>deriving</u></font> Eq-<a name="(line208)"></a><a name="AttDef"></a><font color=Green><u>data</u></font> AttDef <font color=Red>=</font> AttDef Name AttType DefaultDecl <font color=Green><u>deriving</u></font> Eq-<a name="(line209)"></a><a name="AttType"></a><font color=Green><u>data</u></font> AttType <font color=Red>=</font> StringType-<a name="(line210)"></a> <font color=Red>|</font> TokenizedType TokenizedType-<a name="(line211)"></a> <font color=Red>|</font> EnumeratedType EnumeratedType-<a name="(line212)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line213)"></a><a name="TokenizedType"></a><font color=Green><u>data</u></font> TokenizedType <font color=Red>=</font> ID-<a name="(line214)"></a> <font color=Red>|</font> IDREF-<a name="(line215)"></a> <font color=Red>|</font> IDREFS-<a name="(line216)"></a> <font color=Red>|</font> ENTITY-<a name="(line217)"></a> <font color=Red>|</font> ENTITIES-<a name="(line218)"></a> <font color=Red>|</font> NMTOKEN-<a name="(line219)"></a> <font color=Red>|</font> NMTOKENS-<a name="(line220)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line221)"></a><a name="EnumeratedType"></a><font color=Green><u>data</u></font> EnumeratedType <font color=Red>=</font> NotationType NotationType-<a name="(line222)"></a> <font color=Red>|</font> Enumeration Enumeration-<a name="(line223)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line224)"></a><a name="NotationType"></a><font color=Green><u>type</u></font> NotationType <font color=Red>=</font> <font color=Red>[</font>Name<font color=Red>]</font> <font color=Blue>-- nonempty list</font>-<a name="(line225)"></a><a name="Enumeration"></a><font color=Green><u>type</u></font> Enumeration <font color=Red>=</font> <font color=Red>[</font>NmToken<font color=Red>]</font> <font color=Blue>-- nonempty list</font>-<a name="(line226)"></a><a name="DefaultDecl"></a><font color=Green><u>data</u></font> DefaultDecl <font color=Red>=</font> REQUIRED-<a name="(line227)"></a> <font color=Red>|</font> IMPLIED-<a name="(line228)"></a> <font color=Red>|</font> DefaultTo AttValue <font color=Cyan>(</font>Maybe FIXED<font color=Cyan>)</font>-<a name="(line229)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line230)"></a><a name="FIXED"></a><font color=Green><u>data</u></font> FIXED <font color=Red>=</font> FIXED <font color=Green><u>deriving</u></font> Eq-<a name="(line231)"></a>-<a name="(line232)"></a><a name="ConditionalSect"></a><font color=Green><u>data</u></font> ConditionalSect <font color=Red>=</font> IncludeSect IncludeSect-<a name="(line233)"></a> <font color=Red>|</font> IgnoreSect IgnoreSect-<a name="(line234)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line235)"></a><a name="IncludeSect"></a><font color=Green><u>type</u></font> IncludeSect <font color=Red>=</font> <font color=Red>[</font>ExtSubsetDecl<font color=Red>]</font>-<a name="(line236)"></a><a name="IgnoreSect"></a><font color=Green><u>type</u></font> IgnoreSect <font color=Red>=</font> <font color=Red>[</font>IgnoreSectContents<font color=Red>]</font>-<a name="(line237)"></a><a name="Ignore"></a><font color=Green><u>data</u></font> Ignore <font color=Red>=</font> Ignore <font color=Green><u>deriving</u></font> Eq-<a name="(line238)"></a><a name="IgnoreSectContents"></a><font color=Green><u>data</u></font> IgnoreSectContents <font color=Red>=</font> IgnoreSectContents Ignore <font color=Red>[</font><font color=Cyan>(</font>IgnoreSectContents<font color=Cyan>,</font>Ignore<font color=Cyan>)</font><font color=Red>]</font> <font color=Green><u>deriving</u></font> Eq-<a name="(line239)"></a>-<a name="(line240)"></a><a name="Reference"></a><font color=Green><u>data</u></font> Reference <font color=Red>=</font> RefEntity EntityRef-<a name="(line241)"></a> <font color=Red>|</font> RefChar CharRef-<a name="(line242)"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line243)"></a><a name="EntityRef"></a><font color=Green><u>type</u></font> EntityRef <font color=Red>=</font> Name-<a name="(line244)"></a><a name="CharRef"></a><font color=Green><u>type</u></font> CharRef <font color=Red>=</font> Int-<a name="(line245)"></a><a name="PEReference"></a><font color=Green><u>type</u></font> PEReference <font color=Red>=</font> Name-<a name="(line246)"></a>-<a name="(line247)"></a><a name="EntityDecl"></a><font color=Green><u>data</u></font> EntityDecl <font color=Red>=</font> EntityGEDecl GEDecl-<a name="(line248)"></a> <font color=Red>|</font> EntityPEDecl PEDecl-<a name="(line249)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line250)"></a><a name="GEDecl"></a><font color=Green><u>data</u></font> GEDecl <font color=Red>=</font> GEDecl Name EntityDef <font color=Green><u>deriving</u></font> Eq-<a name="(line251)"></a><a name="PEDecl"></a><font color=Green><u>data</u></font> PEDecl <font color=Red>=</font> PEDecl Name PEDef <font color=Green><u>deriving</u></font> Eq-<a name="(line252)"></a><a name="EntityDef"></a><font color=Green><u>data</u></font> EntityDef <font color=Red>=</font> DefEntityValue EntityValue-<a name="(line253)"></a> <font color=Red>|</font> DefExternalID ExternalID <font color=Cyan>(</font>Maybe NDataDecl<font color=Cyan>)</font>-<a name="(line254)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line255)"></a><a name="PEDef"></a><font color=Green><u>data</u></font> PEDef <font color=Red>=</font> PEDefEntityValue EntityValue-<a name="(line256)"></a> <font color=Red>|</font> PEDefExternalID ExternalID <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line257)"></a><a name="ExternalID"></a><font color=Green><u>data</u></font> ExternalID <font color=Red>=</font> SYSTEM SystemLiteral-<a name="(line258)"></a> <font color=Red>|</font> PUBLIC PubidLiteral SystemLiteral <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line259)"></a><a name="NDataDecl"></a><font color=Green><u>newtype</u></font> NDataDecl <font color=Red>=</font> NDATA Name <font color=Green><u>deriving</u></font> Eq-<a name="(line260)"></a>-<a name="(line261)"></a><a name="TextDecl"></a><font color=Green><u>data</u></font> TextDecl <font color=Red>=</font> TextDecl <font color=Cyan>(</font>Maybe VersionInfo<font color=Cyan>)</font> EncodingDecl <font color=Green><u>deriving</u></font> Eq-<a name="(line262)"></a><a name="ExtParsedEnt"></a><font color=Green><u>data</u></font> ExtParsedEnt i <font color=Red>=</font> ExtParsedEnt <font color=Cyan>(</font>Maybe TextDecl<font color=Cyan>)</font> <font color=Cyan>(</font>Content i<font color=Cyan>)</font> <font color=Green><u>deriving</u></font> Eq-<a name="(line263)"></a><a name="ExtPE"></a><font color=Green><u>data</u></font> ExtPE <font color=Red>=</font> ExtPE <font color=Cyan>(</font>Maybe TextDecl<font color=Cyan>)</font> <font color=Red>[</font>ExtSubsetDecl<font color=Red>]</font> <font color=Green><u>deriving</u></font> Eq-<a name="(line264)"></a>-<a name="(line265)"></a><a name="NotationDecl"></a><font color=Green><u>data</u></font> NotationDecl <font color=Red>=</font> NOTATION Name <font color=Cyan>(</font>Either ExternalID PublicID<font color=Cyan>)</font> <font color=Green><u>deriving</u></font> Eq-<a name="(line266)"></a><a name="PublicID"></a><font color=Green><u>newtype</u></font> PublicID <font color=Red>=</font> PUBLICID PubidLiteral <font color=Green><u>deriving</u></font> Eq-<a name="(line267)"></a><a name="EncodingDecl"></a><font color=Green><u>newtype</u></font> EncodingDecl <font color=Red>=</font> EncodingDecl String <font color=Green><u>deriving</u></font> Eq-<a name="(line268)"></a>-<a name="(line269)"></a><a name="Name"></a><font color=Green><u>type</u></font> Name <font color=Red>=</font> String <font color=Blue>-- non-empty string</font>-<a name="(line270)"></a><a name="Names"></a><font color=Green><u>type</u></font> Names <font color=Red>=</font> <font color=Red>[</font>Name<font color=Red>]</font> <font color=Blue>-- non-empty list</font>-<a name="(line271)"></a><a name="NmToken"></a><font color=Green><u>type</u></font> NmToken <font color=Red>=</font> String <font color=Blue>-- non-empty string</font>-<a name="(line272)"></a><a name="NmTokens"></a><font color=Green><u>type</u></font> NmTokens <font color=Red>=</font> <font color=Red>[</font>NmToken<font color=Red>]</font> <font color=Blue>-- non-empty list</font>-<a name="(line273)"></a>-<a name="(line274)"></a><a name="AttValue"></a><font color=Green><u>data</u></font> AttValue <font color=Red>=</font> AttValue <font color=Red>[</font>Either String Reference<font color=Red>]</font> <font color=Green><u>deriving</u></font> Eq-<a name="(line275)"></a><font color=Green><u>instance</u></font> Show AttValue <font color=Green><u>where</u></font>-<a name="(line276)"></a> show <font color=Cyan>(</font>AttValue v<font color=Cyan>)</font> <font color=Red>=</font> concatMap decode v-<a name="(line277)"></a> <font color=Green><u>where</u></font>-<a name="(line278)"></a> decode <font color=Cyan>(</font>Left w<font color=Cyan>)</font> <font color=Red>=</font> w-<a name="(line279)"></a> decode <font color=Cyan>(</font>Right <font color=Cyan>(</font>RefEntity ent<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"&"</font><font color=Cyan>++</font>ent<font color=Cyan>++</font><font color=Magenta>";"</font>-<a name="(line280)"></a> decode <font color=Cyan>(</font>Right <font color=Cyan>(</font>RefChar cref<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"&"</font><font color=Cyan>++</font>show cref<font color=Cyan>++</font><font color=Magenta>";"</font>-<a name="(line281)"></a>-<a name="(line282)"></a><a name="EntityValue"></a><font color=Green><u>data</u></font> EntityValue <font color=Red>=</font> EntityValue <font color=Red>[</font>EV<font color=Red>]</font> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line283)"></a><a name="EV"></a><font color=Green><u>data</u></font> EV <font color=Red>=</font> EVString String-<a name="(line284)"></a> <font color=Blue>-- -- | EVPERef PEReference</font>-<a name="(line285)"></a> <font color=Red>|</font> EVRef Reference <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line286)"></a><a name="PubidLiteral"></a><font color=Green><u>newtype</u></font> PubidLiteral <font color=Red>=</font> PubidLiteral String <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line287)"></a><a name="SystemLiteral"></a><font color=Green><u>newtype</u></font> SystemLiteral <font color=Red>=</font> SystemLiteral String <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line288)"></a><a name="CharData"></a><font color=Green><u>type</u></font> CharData <font color=Red>=</font> String-<a name="(line289)"></a><a name="CDSect"></a><font color=Green><u>type</u></font> CDSect <font color=Red>=</font> CharData-<a name="(line290)"></a>-<a name="(line291)"></a><font color=Green><u>instance</u></font> Eq ElemTag <font color=Green><u>where</u></font>-<a name="(line292)"></a> <font color=Cyan>(</font>ElemTag n <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>==</font> <font color=Cyan>(</font>ElemTag m <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> n<font color=Cyan>==</font>m+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/Types.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>{- |+<a name="line-2"></a> This module defines an internal (generic) representation for XML+<a name="line-3"></a> documents including their DTDs.+<a name="line-4"></a>+<a name="line-5"></a> History:+<a name="line-6"></a> The original module was derived by hand from the XML specification,+<a name="line-7"></a> following the grammar precisely. Then we simplified the types,+<a name="line-8"></a> removing layers of indirection and redundancy, and generally making+<a name="line-9"></a> things easier to work with. Then we allowed PEReferences to be+<a name="line-10"></a> ubiquitous, by removing them from the types and resolving all+<a name="line-11"></a> PE references at parse-time. Finally, we added a per-document+<a name="line-12"></a> symbol table for GEReferences, and a whitespace-significance flag+<a name="line-13"></a> for plaintext.+<a name="line-14"></a>-}</font>+<a name="line-15"></a>+<a name="line-16"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-17"></a> <font color=Cyan>(</font>+<a name="line-18"></a> <font color=Blue>-- * A simple symbol table mapping strings (references) to values.</font>+<a name="line-19"></a> SymTab+<a name="line-20"></a> <font color=Blue>-- ** Symbol table operations</font>+<a name="line-21"></a> <font color=Cyan>,</font> emptyST+<a name="line-22"></a> <font color=Cyan>,</font> addST+<a name="line-23"></a> <font color=Cyan>,</font> lookupST+<a name="line-24"></a>+<a name="line-25"></a> <font color=Blue>-- * XML Types</font>+<a name="line-26"></a> <font color=Blue>-- ** The top-level document container</font>+<a name="line-27"></a> <font color=Cyan>,</font> Document<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-28"></a>+<a name="line-29"></a> <font color=Blue>-- ** The main document content</font>+<a name="line-30"></a> <font color=Cyan>,</font> Element<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-31"></a> <font color=Cyan>,</font> ElemTag<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-32"></a> <font color=Cyan>,</font> Content<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-33"></a> <font color=Cyan>,</font> Attribute+<a name="line-34"></a> <font color=Cyan>,</font> AttValue<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-35"></a> <font color=Cyan>,</font> info+<a name="line-36"></a>+<a name="line-37"></a> <font color=Blue>-- ** Administrative parts of the document</font>+<a name="line-38"></a> <font color=Cyan>,</font> Prolog<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-39"></a> <font color=Cyan>,</font> XMLDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-40"></a> <font color=Cyan>,</font> Misc<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-41"></a> <font color=Cyan>,</font> ProcessingInstruction+<a name="line-42"></a> <font color=Cyan>,</font> SDDecl+<a name="line-43"></a> <font color=Cyan>,</font> VersionInfo+<a name="line-44"></a> <font color=Cyan>,</font> Comment+<a name="line-45"></a> <font color=Cyan>,</font> PITarget+<a name="line-46"></a>+<a name="line-47"></a> <font color=Blue>-- ** The DTD</font>+<a name="line-48"></a> <font color=Blue>-- *** content model</font>+<a name="line-49"></a> <font color=Cyan>,</font> DocTypeDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-50"></a> <font color=Cyan>,</font> MarkupDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-51"></a> <font color=Cyan>,</font> ExtSubset<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-52"></a> <font color=Cyan>,</font> ExtSubsetDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-53"></a> <font color=Cyan>,</font> ElementDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-54"></a> <font color=Cyan>,</font> ContentSpec<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-55"></a> <font color=Cyan>,</font> CP<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-56"></a> <font color=Cyan>,</font> Modifier<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-57"></a> <font color=Cyan>,</font> Mixed<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-58"></a>+<a name="line-59"></a> <font color=Blue>-- *** attribute model</font>+<a name="line-60"></a> <font color=Cyan>,</font> AttListDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-61"></a> <font color=Cyan>,</font> AttDef<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-62"></a> <font color=Cyan>,</font> AttType<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-63"></a> <font color=Cyan>,</font> TokenizedType<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-64"></a> <font color=Cyan>,</font> EnumeratedType<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-65"></a> <font color=Cyan>,</font> NotationType+<a name="line-66"></a> <font color=Cyan>,</font> Enumeration+<a name="line-67"></a> <font color=Cyan>,</font> DefaultDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-68"></a> <font color=Cyan>,</font> FIXED<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-69"></a>+<a name="line-70"></a> <font color=Blue>-- *** conditional sections</font>+<a name="line-71"></a> <font color=Cyan>,</font> ConditionalSect<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-72"></a> <font color=Cyan>,</font> IncludeSect+<a name="line-73"></a> <font color=Cyan>,</font> IgnoreSect+<a name="line-74"></a> <font color=Cyan>,</font> Ignore<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-75"></a> <font color=Cyan>,</font> IgnoreSectContents<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-76"></a>+<a name="line-77"></a> <font color=Blue>-- ** References</font>+<a name="line-78"></a> <font color=Cyan>,</font> Reference<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-79"></a> <font color=Cyan>,</font> EntityRef+<a name="line-80"></a> <font color=Cyan>,</font> CharRef+<a name="line-81"></a> <font color=Cyan>,</font> PEReference+<a name="line-82"></a>+<a name="line-83"></a> <font color=Blue>-- ** Entities</font>+<a name="line-84"></a> <font color=Cyan>,</font> EntityDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-85"></a> <font color=Cyan>,</font> GEDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-86"></a> <font color=Cyan>,</font> PEDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-87"></a> <font color=Cyan>,</font> EntityDef<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-88"></a> <font color=Cyan>,</font> PEDef<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-89"></a> <font color=Cyan>,</font> ExternalID<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-90"></a> <font color=Cyan>,</font> NDataDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-91"></a> <font color=Cyan>,</font> TextDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-92"></a> <font color=Cyan>,</font> ExtParsedEnt<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-93"></a> <font color=Cyan>,</font> ExtPE<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-94"></a> <font color=Cyan>,</font> NotationDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-95"></a> <font color=Cyan>,</font> PublicID<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-96"></a> <font color=Cyan>,</font> EncodingDecl<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-97"></a> <font color=Cyan>,</font> EntityValue<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-98"></a> <font color=Cyan>,</font> EV<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-99"></a> <font color=Cyan>,</font> PubidLiteral<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-100"></a> <font color=Cyan>,</font> SystemLiteral<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-101"></a>+<a name="line-102"></a> <font color=Blue>-- ** Basic value types</font>+<a name="line-103"></a> <font color=Cyan>,</font> Name+<a name="line-104"></a> <font color=Cyan>,</font> Names+<a name="line-105"></a> <font color=Cyan>,</font> NmToken+<a name="line-106"></a> <font color=Cyan>,</font> NmTokens+<a name="line-107"></a> <font color=Cyan>,</font> CharData+<a name="line-108"></a> <font color=Cyan>,</font> CDSect+<a name="line-109"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-110"></a>+<a name="line-111"></a>+<a name="line-112"></a><font color=Blue>{- A simple symbol table for storing macros whilst parsing. -}</font>+<a name="line-113"></a>+<a name="line-114"></a><a name="SymTab"></a><font color=Green><u>type</u></font> SymTab a <font color=Red>=</font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font>a<font color=Cyan>)</font><font color=Red>]</font>+<a name="line-115"></a>+<a name="line-116"></a><a name="emptyST"></a><font color=Blue>emptyST</font> <font color=Red>::</font> SymTab a+<a name="line-117"></a><font color=Blue>emptyST</font> <font color=Red>=</font> []+<a name="line-118"></a>+<a name="line-119"></a><a name="addST"></a><font color=Blue>addST</font> <font color=Red>::</font> String <font color=Red>-></font> a <font color=Red>-></font> SymTab a <font color=Red>-></font> SymTab a+<a name="line-120"></a><font color=Blue>addST</font> n v <font color=Red>=</font> <font color=Cyan>(</font><font color=Cyan>(</font>n<font color=Cyan>,</font>v<font color=Cyan>)</font><font color=Red><b>:</b></font><font color=Cyan>)</font>+<a name="line-121"></a>+<a name="line-122"></a><a name="lookupST"></a><font color=Blue>lookupST</font> <font color=Red>::</font> String <font color=Red>-></font> SymTab a <font color=Red>-></font> Maybe a+<a name="line-123"></a><font color=Blue>lookupST</font> <font color=Red>=</font> lookup+<a name="line-124"></a>+<a name="line-125"></a>+<a name="line-126"></a>+<a name="line-127"></a><font color=Blue>{- XML types start here -}</font>+<a name="line-128"></a>+<a name="line-129"></a><a name="Document"></a><font color=Blue>-- | The symbol table stored in a document holds all its general entity</font>+<a name="line-130"></a><a name="Document"></a><font color=Blue>-- reference definitions.</font>+<a name="line-131"></a><a name="Document"></a><font color=Green><u>data</u></font> Document i <font color=Red>=</font> Document Prolog <font color=Cyan>(</font>SymTab EntityDef<font color=Cyan>)</font> <font color=Cyan>(</font>Element i<font color=Cyan>)</font> <font color=Red>[</font>Misc<font color=Red>]</font>+<a name="line-132"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-133"></a><a name="Prolog"></a><font color=Green><u>data</u></font> Prolog <font color=Red>=</font> Prolog <font color=Cyan>(</font>Maybe XMLDecl<font color=Cyan>)</font> <font color=Red>[</font>Misc<font color=Red>]</font> <font color=Cyan>(</font>Maybe DocTypeDecl<font color=Cyan>)</font> <font color=Red>[</font>Misc<font color=Red>]</font>+<a name="line-134"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-135"></a><a name="XMLDecl"></a><font color=Green><u>data</u></font> XMLDecl <font color=Red>=</font> XMLDecl VersionInfo <font color=Cyan>(</font>Maybe EncodingDecl<font color=Cyan>)</font> <font color=Cyan>(</font>Maybe SDDecl<font color=Cyan>)</font>+<a name="line-136"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-137"></a><a name="Misc"></a><font color=Green><u>data</u></font> Misc <font color=Red>=</font> Comment Comment+<a name="line-138"></a> <font color=Red>|</font> PI ProcessingInstruction+<a name="line-139"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-140"></a>+<a name="line-141"></a><a name="ProcessingInstruction"></a><font color=Green><u>type</u></font> ProcessingInstruction <font color=Red>=</font> <font color=Cyan>(</font>PITarget<font color=Cyan>,</font>String<font color=Cyan>)</font>+<a name="line-142"></a>+<a name="line-143"></a><a name="SDDecl"></a><font color=Green><u>type</u></font> SDDecl <font color=Red>=</font> Bool+<a name="line-144"></a><a name="VersionInfo"></a><font color=Green><u>type</u></font> VersionInfo <font color=Red>=</font> String+<a name="line-145"></a><a name="Comment"></a><font color=Green><u>type</u></font> Comment <font color=Red>=</font> String+<a name="line-146"></a><a name="PITarget"></a><font color=Green><u>type</u></font> PITarget <font color=Red>=</font> String+<a name="line-147"></a>+<a name="line-148"></a><a name="DocTypeDecl"></a><font color=Green><u>data</u></font> DocTypeDecl <font color=Red>=</font> DTD Name <font color=Cyan>(</font>Maybe ExternalID<font color=Cyan>)</font> <font color=Red>[</font>MarkupDecl<font color=Red>]</font> <font color=Green><u>deriving</u></font> Eq+<a name="line-149"></a><a name="MarkupDecl"></a><font color=Green><u>data</u></font> MarkupDecl <font color=Red>=</font> Element ElementDecl+<a name="line-150"></a> <font color=Red>|</font> AttList AttListDecl+<a name="line-151"></a> <font color=Red>|</font> Entity EntityDecl+<a name="line-152"></a> <font color=Red>|</font> Notation NotationDecl+<a name="line-153"></a> <font color=Red>|</font> MarkupMisc Misc+<a name="line-154"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-155"></a>+<a name="line-156"></a><a name="ExtSubset"></a><font color=Green><u>data</u></font> ExtSubset <font color=Red>=</font> ExtSubset <font color=Cyan>(</font>Maybe TextDecl<font color=Cyan>)</font> <font color=Red>[</font>ExtSubsetDecl<font color=Red>]</font> <font color=Green><u>deriving</u></font> Eq+<a name="line-157"></a><a name="ExtSubsetDecl"></a><font color=Green><u>data</u></font> ExtSubsetDecl <font color=Red>=</font> ExtMarkupDecl MarkupDecl+<a name="line-158"></a> <font color=Red>|</font> ExtConditionalSect ConditionalSect+<a name="line-159"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-160"></a>+<a name="line-161"></a><a name="Element"></a><font color=Green><u>data</u></font> Element i <font color=Red>=</font> Elem Name <font color=Red>[</font>Attribute<font color=Red>]</font> <font color=Red>[</font>Content i<font color=Red>]</font> <font color=Green><u>deriving</u></font> Eq+<a name="line-162"></a> <font color=Blue>-- intermediate for parsing</font>+<a name="line-163"></a><a name="ElemTag"></a><font color=Green><u>data</u></font> ElemTag <font color=Red>=</font> ElemTag Name <font color=Red>[</font>Attribute<font color=Red>]</font>+<a name="line-164"></a><a name="Attribute"></a><font color=Green><u>type</u></font> Attribute <font color=Red>=</font> <font color=Cyan>(</font>Name<font color=Cyan>,</font> AttValue<font color=Cyan>)</font>+<a name="line-165"></a><a name="Content"></a><font color=Green><u>data</u></font> Content i <font color=Red>=</font> CElem <font color=Cyan>(</font>Element i<font color=Cyan>)</font> i+<a name="line-166"></a> <font color=Red>|</font> CString Bool CharData i+<a name="line-167"></a> <font color=Blue>-- ^ bool is whether whitespace is significant</font>+<a name="line-168"></a> <font color=Red>|</font> CRef Reference i+<a name="line-169"></a> <font color=Red>|</font> CMisc Misc i+<a name="line-170"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-171"></a>+<a name="line-172"></a><a name="info"></a><font color=Blue>info</font> <font color=Red>::</font> Content t <font color=Red>-></font> t+<a name="line-173"></a><font color=Blue>info</font> <font color=Cyan>(</font>CElem <font color=Green><u>_</u></font> i<font color=Cyan>)</font> <font color=Red>=</font> i+<a name="line-174"></a><font color=Blue>info</font> <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> i<font color=Cyan>)</font> <font color=Red>=</font> i+<a name="line-175"></a><font color=Blue>info</font> <font color=Cyan>(</font>CRef <font color=Green><u>_</u></font> i<font color=Cyan>)</font> <font color=Red>=</font> i+<a name="line-176"></a><font color=Blue>info</font> <font color=Cyan>(</font>CMisc <font color=Green><u>_</u></font> i<font color=Cyan>)</font> <font color=Red>=</font> i+<a name="line-177"></a>+<a name="line-178"></a><font color=Green><u>instance</u></font> Functor Document <font color=Green><u>where</u></font>+<a name="line-179"></a> fmap f <font color=Cyan>(</font>Document p st e ms<font color=Cyan>)</font> <font color=Red>=</font> Document p st <font color=Cyan>(</font>fmap f e<font color=Cyan>)</font> ms+<a name="line-180"></a><font color=Green><u>instance</u></font> Functor Element <font color=Green><u>where</u></font>+<a name="line-181"></a> fmap f <font color=Cyan>(</font>Elem t <font color=Green><u>as</u></font> cs<font color=Cyan>)</font> <font color=Red>=</font> Elem t <font color=Green><u>as</u></font> <font color=Cyan>(</font>map <font color=Cyan>(</font>fmap f<font color=Cyan>)</font> cs<font color=Cyan>)</font>+<a name="line-182"></a><font color=Green><u>instance</u></font> Functor Content <font color=Green><u>where</u></font>+<a name="line-183"></a> fmap f <font color=Cyan>(</font>CElem e i<font color=Cyan>)</font> <font color=Red>=</font> CElem <font color=Cyan>(</font>fmap f e<font color=Cyan>)</font> <font color=Cyan>(</font>f i<font color=Cyan>)</font>+<a name="line-184"></a> fmap f <font color=Cyan>(</font>CString b s i<font color=Cyan>)</font> <font color=Red>=</font> CString b s <font color=Cyan>(</font>f i<font color=Cyan>)</font>+<a name="line-185"></a> fmap f <font color=Cyan>(</font>CRef r i<font color=Cyan>)</font> <font color=Red>=</font> CRef r <font color=Cyan>(</font>f i<font color=Cyan>)</font>+<a name="line-186"></a> fmap f <font color=Cyan>(</font>CMisc m i<font color=Cyan>)</font> <font color=Red>=</font> CMisc m <font color=Cyan>(</font>f i<font color=Cyan>)</font>+<a name="line-187"></a>+<a name="line-188"></a><a name="ElementDecl"></a><font color=Green><u>data</u></font> ElementDecl <font color=Red>=</font> ElementDecl Name ContentSpec <font color=Green><u>deriving</u></font> Eq+<a name="line-189"></a><a name="ContentSpec"></a><font color=Green><u>data</u></font> ContentSpec <font color=Red>=</font> EMPTY+<a name="line-190"></a> <font color=Red>|</font> ANY+<a name="line-191"></a> <font color=Red>|</font> Mixed Mixed+<a name="line-192"></a> <font color=Red>|</font> ContentSpec CP+<a name="line-193"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-194"></a><a name="CP"></a><font color=Blue>-- FIXME: What is TagName here? Seems to be in disagreement with XML spec.</font>+<a name="line-195"></a><a name="CP"></a><font color=Green><u>data</u></font> CP <font color=Red>=</font> TagName Name Modifier+<a name="line-196"></a> <font color=Red>|</font> Choice <font color=Red>[</font>CP<font color=Red>]</font> Modifier+<a name="line-197"></a> <font color=Red>|</font> Seq <font color=Red>[</font>CP<font color=Red>]</font> Modifier+<a name="line-198"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-199"></a><a name="Modifier"></a><font color=Green><u>data</u></font> Modifier <font color=Red>=</font> None <font color=Blue>-- ^ Just One</font>+<a name="line-200"></a> <font color=Red>|</font> Query <font color=Blue>-- ^ Zero Or One</font>+<a name="line-201"></a> <font color=Red>|</font> Star <font color=Blue>-- ^ Zero Or More</font>+<a name="line-202"></a> <font color=Red>|</font> Plus <font color=Blue>-- ^ One Or More</font>+<a name="line-203"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-204"></a><a name="Mixed"></a><font color=Green><u>data</u></font> Mixed <font color=Red>=</font> PCDATA+<a name="line-205"></a> <font color=Red>|</font> PCDATAplus <font color=Red>[</font>Name<font color=Red>]</font>+<a name="line-206"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-207"></a><a name="AttListDecl"></a><font color=Green><u>data</u></font> AttListDecl <font color=Red>=</font> AttListDecl Name <font color=Red>[</font>AttDef<font color=Red>]</font> <font color=Green><u>deriving</u></font> Eq+<a name="line-208"></a><a name="AttDef"></a><font color=Green><u>data</u></font> AttDef <font color=Red>=</font> AttDef Name AttType DefaultDecl <font color=Green><u>deriving</u></font> Eq+<a name="line-209"></a><a name="AttType"></a><font color=Green><u>data</u></font> AttType <font color=Red>=</font> StringType+<a name="line-210"></a> <font color=Red>|</font> TokenizedType TokenizedType+<a name="line-211"></a> <font color=Red>|</font> EnumeratedType EnumeratedType+<a name="line-212"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-213"></a><a name="TokenizedType"></a><font color=Green><u>data</u></font> TokenizedType <font color=Red>=</font> ID+<a name="line-214"></a> <font color=Red>|</font> IDREF+<a name="line-215"></a> <font color=Red>|</font> IDREFS+<a name="line-216"></a> <font color=Red>|</font> ENTITY+<a name="line-217"></a> <font color=Red>|</font> ENTITIES+<a name="line-218"></a> <font color=Red>|</font> NMTOKEN+<a name="line-219"></a> <font color=Red>|</font> NMTOKENS+<a name="line-220"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-221"></a><a name="EnumeratedType"></a><font color=Green><u>data</u></font> EnumeratedType <font color=Red>=</font> NotationType NotationType+<a name="line-222"></a> <font color=Red>|</font> Enumeration Enumeration+<a name="line-223"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-224"></a><a name="NotationType"></a><font color=Green><u>type</u></font> NotationType <font color=Red>=</font> <font color=Red>[</font>Name<font color=Red>]</font> <font color=Blue>-- nonempty list</font>+<a name="line-225"></a><a name="Enumeration"></a><font color=Green><u>type</u></font> Enumeration <font color=Red>=</font> <font color=Red>[</font>NmToken<font color=Red>]</font> <font color=Blue>-- nonempty list</font>+<a name="line-226"></a><a name="DefaultDecl"></a><font color=Green><u>data</u></font> DefaultDecl <font color=Red>=</font> REQUIRED+<a name="line-227"></a> <font color=Red>|</font> IMPLIED+<a name="line-228"></a> <font color=Red>|</font> DefaultTo AttValue <font color=Cyan>(</font>Maybe FIXED<font color=Cyan>)</font>+<a name="line-229"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-230"></a><a name="FIXED"></a><font color=Green><u>data</u></font> FIXED <font color=Red>=</font> FIXED <font color=Green><u>deriving</u></font> Eq+<a name="line-231"></a>+<a name="line-232"></a><a name="ConditionalSect"></a><font color=Green><u>data</u></font> ConditionalSect <font color=Red>=</font> IncludeSect IncludeSect+<a name="line-233"></a> <font color=Red>|</font> IgnoreSect IgnoreSect+<a name="line-234"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-235"></a><a name="IncludeSect"></a><font color=Green><u>type</u></font> IncludeSect <font color=Red>=</font> <font color=Red>[</font>ExtSubsetDecl<font color=Red>]</font>+<a name="line-236"></a><a name="IgnoreSect"></a><font color=Green><u>type</u></font> IgnoreSect <font color=Red>=</font> <font color=Red>[</font>IgnoreSectContents<font color=Red>]</font>+<a name="line-237"></a><a name="Ignore"></a><font color=Green><u>data</u></font> Ignore <font color=Red>=</font> Ignore <font color=Green><u>deriving</u></font> Eq+<a name="line-238"></a><a name="IgnoreSectContents"></a><font color=Green><u>data</u></font> IgnoreSectContents <font color=Red>=</font> IgnoreSectContents Ignore <font color=Red>[</font><font color=Cyan>(</font>IgnoreSectContents<font color=Cyan>,</font>Ignore<font color=Cyan>)</font><font color=Red>]</font> <font color=Green><u>deriving</u></font> Eq+<a name="line-239"></a>+<a name="line-240"></a><a name="Reference"></a><font color=Green><u>data</u></font> Reference <font color=Red>=</font> RefEntity EntityRef+<a name="line-241"></a> <font color=Red>|</font> RefChar CharRef+<a name="line-242"></a> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-243"></a><a name="EntityRef"></a><font color=Green><u>type</u></font> EntityRef <font color=Red>=</font> Name+<a name="line-244"></a><a name="CharRef"></a><font color=Green><u>type</u></font> CharRef <font color=Red>=</font> Int+<a name="line-245"></a><a name="PEReference"></a><font color=Green><u>type</u></font> PEReference <font color=Red>=</font> Name+<a name="line-246"></a>+<a name="line-247"></a><a name="EntityDecl"></a><font color=Green><u>data</u></font> EntityDecl <font color=Red>=</font> EntityGEDecl GEDecl+<a name="line-248"></a> <font color=Red>|</font> EntityPEDecl PEDecl+<a name="line-249"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-250"></a><a name="GEDecl"></a><font color=Green><u>data</u></font> GEDecl <font color=Red>=</font> GEDecl Name EntityDef <font color=Green><u>deriving</u></font> Eq+<a name="line-251"></a><a name="PEDecl"></a><font color=Green><u>data</u></font> PEDecl <font color=Red>=</font> PEDecl Name PEDef <font color=Green><u>deriving</u></font> Eq+<a name="line-252"></a><a name="EntityDef"></a><font color=Green><u>data</u></font> EntityDef <font color=Red>=</font> DefEntityValue EntityValue+<a name="line-253"></a> <font color=Red>|</font> DefExternalID ExternalID <font color=Cyan>(</font>Maybe NDataDecl<font color=Cyan>)</font>+<a name="line-254"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-255"></a><a name="PEDef"></a><font color=Green><u>data</u></font> PEDef <font color=Red>=</font> PEDefEntityValue EntityValue+<a name="line-256"></a> <font color=Red>|</font> PEDefExternalID ExternalID <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-257"></a><a name="ExternalID"></a><font color=Green><u>data</u></font> ExternalID <font color=Red>=</font> SYSTEM SystemLiteral+<a name="line-258"></a> <font color=Red>|</font> PUBLIC PubidLiteral SystemLiteral <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-259"></a><a name="NDataDecl"></a><font color=Green><u>newtype</u></font> NDataDecl <font color=Red>=</font> NDATA Name <font color=Green><u>deriving</u></font> Eq+<a name="line-260"></a>+<a name="line-261"></a><a name="TextDecl"></a><font color=Green><u>data</u></font> TextDecl <font color=Red>=</font> TextDecl <font color=Cyan>(</font>Maybe VersionInfo<font color=Cyan>)</font> EncodingDecl <font color=Green><u>deriving</u></font> Eq+<a name="line-262"></a><a name="ExtParsedEnt"></a><font color=Green><u>data</u></font> ExtParsedEnt i <font color=Red>=</font> ExtParsedEnt <font color=Cyan>(</font>Maybe TextDecl<font color=Cyan>)</font> <font color=Cyan>(</font>Content i<font color=Cyan>)</font> <font color=Green><u>deriving</u></font> Eq+<a name="line-263"></a><a name="ExtPE"></a><font color=Green><u>data</u></font> ExtPE <font color=Red>=</font> ExtPE <font color=Cyan>(</font>Maybe TextDecl<font color=Cyan>)</font> <font color=Red>[</font>ExtSubsetDecl<font color=Red>]</font> <font color=Green><u>deriving</u></font> Eq+<a name="line-264"></a>+<a name="line-265"></a><a name="NotationDecl"></a><font color=Green><u>data</u></font> NotationDecl <font color=Red>=</font> NOTATION Name <font color=Cyan>(</font>Either ExternalID PublicID<font color=Cyan>)</font> <font color=Green><u>deriving</u></font> Eq+<a name="line-266"></a><a name="PublicID"></a><font color=Green><u>newtype</u></font> PublicID <font color=Red>=</font> PUBLICID PubidLiteral <font color=Green><u>deriving</u></font> Eq+<a name="line-267"></a><a name="EncodingDecl"></a><font color=Green><u>newtype</u></font> EncodingDecl <font color=Red>=</font> EncodingDecl String <font color=Green><u>deriving</u></font> Eq+<a name="line-268"></a>+<a name="line-269"></a><a name="Name"></a><font color=Green><u>type</u></font> Name <font color=Red>=</font> String <font color=Blue>-- non-empty string</font>+<a name="line-270"></a><a name="Names"></a><font color=Green><u>type</u></font> Names <font color=Red>=</font> <font color=Red>[</font>Name<font color=Red>]</font> <font color=Blue>-- non-empty list</font>+<a name="line-271"></a><a name="NmToken"></a><font color=Green><u>type</u></font> NmToken <font color=Red>=</font> String <font color=Blue>-- non-empty string</font>+<a name="line-272"></a><a name="NmTokens"></a><font color=Green><u>type</u></font> NmTokens <font color=Red>=</font> <font color=Red>[</font>NmToken<font color=Red>]</font> <font color=Blue>-- non-empty list</font>+<a name="line-273"></a>+<a name="line-274"></a><a name="AttValue"></a><font color=Green><u>data</u></font> AttValue <font color=Red>=</font> AttValue <font color=Red>[</font>Either String Reference<font color=Red>]</font> <font color=Green><u>deriving</u></font> Eq+<a name="line-275"></a><font color=Green><u>instance</u></font> Show AttValue <font color=Green><u>where</u></font>+<a name="line-276"></a> show <font color=Cyan>(</font>AttValue v<font color=Cyan>)</font> <font color=Red>=</font> concatMap decode v+<a name="line-277"></a> <font color=Green><u>where</u></font>+<a name="line-278"></a> decode <font color=Cyan>(</font>Left w<font color=Cyan>)</font> <font color=Red>=</font> w+<a name="line-279"></a> decode <font color=Cyan>(</font>Right <font color=Cyan>(</font>RefEntity ent<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"&"</font><font color=Cyan>++</font>ent<font color=Cyan>++</font><font color=Magenta>";"</font>+<a name="line-280"></a> decode <font color=Cyan>(</font>Right <font color=Cyan>(</font>RefChar cref<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"&"</font><font color=Cyan>++</font>show cref<font color=Cyan>++</font><font color=Magenta>";"</font>+<a name="line-281"></a>+<a name="line-282"></a><a name="EntityValue"></a><font color=Green><u>data</u></font> EntityValue <font color=Red>=</font> EntityValue <font color=Red>[</font>EV<font color=Red>]</font> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-283"></a><a name="EV"></a><font color=Green><u>data</u></font> EV <font color=Red>=</font> EVString String+<a name="line-284"></a> <font color=Blue>-- -- | EVPERef PEReference</font>+<a name="line-285"></a> <font color=Red>|</font> EVRef Reference <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-286"></a><a name="PubidLiteral"></a><font color=Green><u>newtype</u></font> PubidLiteral <font color=Red>=</font> PubidLiteral String <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-287"></a><a name="SystemLiteral"></a><font color=Green><u>newtype</u></font> SystemLiteral <font color=Red>=</font> SystemLiteral String <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-288"></a><a name="CharData"></a><font color=Green><u>type</u></font> CharData <font color=Red>=</font> String+<a name="line-289"></a><a name="CDSect"></a><font color=Green><u>type</u></font> CDSect <font color=Red>=</font> CharData+<a name="line-290"></a>+<a name="line-291"></a><font color=Green><u>instance</u></font> Eq ElemTag <font color=Green><u>where</u></font>+<a name="line-292"></a> <font color=Cyan>(</font>ElemTag n <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>==</font> <font color=Cyan>(</font>ElemTag m <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> n<font color=Cyan>==</font>m </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/Util.html view
@@ -1,45 +1,51 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>{- |-<a name="(line2)"></a> - Only a shmall module containing some helper functions to extract xml content-<a name="(line3)"></a> - I would have added this to Types but I've put it into an additional module-<a name="(line4)"></a> - to avoid circular references (Verbatim <-> Types)-<a name="(line5)"></a>-}</font>-<a name="(line6)"></a>-<a name="(line7)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Util-<a name="(line8)"></a> <font color=Cyan>(</font>-<a name="(line9)"></a> <font color=Blue>-- ** utility functions to access XML content</font>-<a name="(line10)"></a> docContent-<a name="(line11)"></a> <font color=Cyan>,</font> contentElem-<a name="(line12)"></a> <font color=Cyan>,</font> attrs-<a name="(line13)"></a> <font color=Cyan>,</font> tagTextContent-<a name="(line14)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line15)"></a>-<a name="(line16)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Posn-<a name="(line17)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line18)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Verbatim-<a name="(line19)"></a>-<a name="(line20)"></a><a name="docContent"></a><font color=Blue>-- get the main element of the document so that you can apply CFilters directly</font>-<a name="(line21)"></a><font color=Blue>-- i is typically (posInNewCxt "filename" Nothing) </font>-<a name="(line22)"></a>docContent <font color=Red>::</font> i <font color=Red>-></font> Document i <font color=Red>-></font> Content i-<a name="(line23)"></a>docContent i <font color=Cyan>(</font>Document <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> e <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> CElem e i-<a name="(line24)"></a>-<a name="(line25)"></a><a name="contentElem"></a><font color=Blue>-- if you know that your CFilter returns a tag your can use this function to get the tag Element </font>-<a name="(line26)"></a>contentElem <font color=Red>::</font> Content i <font color=Red>-></font> Element i-<a name="(line27)"></a>contentElem <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> e-<a name="(line28)"></a>contentElem <font color=Green><u>_</u></font> <font color=Red>=</font> error <font color=Magenta>"content is not a CElem"</font>-<a name="(line29)"></a><a name="attrs"></a>attrs <font color=Red>::</font> Element i <font color=Red>-></font> <font color=Red>[</font>Attribute<font color=Red>]</font>-<a name="(line30)"></a>attrs <font color=Cyan>(</font> Elem <font color=Green><u>_</u></font> attrs <font color=Green><u>_</u></font> <font color=Cyan>)</font> <font color=Red>=</font> attrs-<a name="(line31)"></a><a name="tagTextContent"></a>tagTextContent <font color=Cyan>(</font><font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> cs<font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> concatMap verbatim cs -<a name="(line32)"></a>-<a name="(line33)"></a><font color=Blue>{--<a name="(line34)"></a> now you can extract an attribute quite easily:-<a name="(line35)"></a> let doc = "<xml><a><b a=\"x\">content</b></a></xml>"-<a name="(line36)"></a> let b = head $ xtract id "a/b" $ docContent (posInNewCxt filename Nothing) $ xmlParse filename doc-<a name="(line37)"></a> putStrLn $ "attr a of tag b" ++ (show $ lookup "a" $ attrs $ contentElem b)-<a name="(line38)"></a> putStrLn $ "text content of b :" ++ tagTextContent b-<a name="(line39)"></a> still (too) much code IMHO-<a name="(line40)"></a>-}</font>-<a name="(line41)"></a>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/Util.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>{- |+<a name="line-2"></a> - Only a shmall module containing some helper functions to extract xml content+<a name="line-3"></a> - I would have added this to Types but I've put it into an additional module+<a name="line-4"></a> - to avoid circular references (Verbatim <-> Types)+<a name="line-5"></a>-}</font>+<a name="line-6"></a>+<a name="line-7"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Util+<a name="line-8"></a> <font color=Cyan>(</font>+<a name="line-9"></a> <font color=Blue>-- ** utility functions to access XML content</font>+<a name="line-10"></a> docContent+<a name="line-11"></a> <font color=Cyan>,</font> contentElem+<a name="line-12"></a> <font color=Cyan>,</font> attrs+<a name="line-13"></a> <font color=Cyan>,</font> tagTextContent+<a name="line-14"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-15"></a>+<a name="line-16"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Posn+<a name="line-17"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-18"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Verbatim+<a name="line-19"></a>+<a name="line-20"></a><a name="docContent"></a><font color=Blue>-- get the main element of the document so that you can apply CFilters directly</font>+<a name="line-21"></a><font color=Blue>-- i is typically (posInNewCxt "filename" Nothing) </font>+<a name="line-22"></a><font color=Blue>docContent</font> <font color=Red>::</font> i <font color=Red>-></font> Document i <font color=Red>-></font> Content i+<a name="line-23"></a><font color=Blue>docContent</font> i <font color=Cyan>(</font>Document <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> e <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> CElem e i+<a name="line-24"></a>+<a name="line-25"></a><a name="contentElem"></a><font color=Blue>-- if you know that your CFilter returns a tag your can use this function to get the tag Element </font>+<a name="line-26"></a><font color=Blue>contentElem</font> <font color=Red>::</font> Content i <font color=Red>-></font> Element i+<a name="line-27"></a><font color=Blue>contentElem</font> <font color=Cyan>(</font>CElem e <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> e+<a name="line-28"></a><font color=Blue>contentElem</font> <font color=Green><u>_</u></font> <font color=Red>=</font> error <font color=Magenta>"content is not a CElem"</font>+<a name="line-29"></a><a name="attrs"></a><font color=Blue>attrs</font> <font color=Red>::</font> Element i <font color=Red>-></font> <font color=Red>[</font>Attribute<font color=Red>]</font>+<a name="line-30"></a><font color=Blue>attrs</font> <font color=Cyan>(</font> Elem <font color=Green><u>_</u></font> attrs <font color=Green><u>_</u></font> <font color=Cyan>)</font> <font color=Red>=</font> attrs+<a name="line-31"></a><a name="tagTextContent"></a><font color=Blue>tagTextContent</font> <font color=Cyan>(</font><font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> cs<font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> concatMap verbatim cs +<a name="line-32"></a>+<a name="line-33"></a><font color=Blue>{-+<a name="line-34"></a> now you can extract an attribute quite easily:+<a name="line-35"></a> let doc = "<xml><a><b a=\"x\">content</b></a></xml>"+<a name="line-36"></a> let b = head $ xtract id "a/b" $ docContent (posInNewCxt filename Nothing) $ xmlParse filename doc+<a name="line-37"></a> putStrLn $ "attr a of tag b" ++ (show $ lookup "a" $ attrs $ contentElem b)+<a name="line-38"></a> putStrLn $ "text content of b :" ++ tagTextContent b+<a name="line-39"></a> still (too) much code IMHO+<a name="line-40"></a>-}</font>+<a name="line-41"></a> </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/Validate.html view
@@ -1,276 +1,282 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>-- | Validate a document against a dtd.</font>-<a name="(line2)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Validate-<a name="(line3)"></a> <font color=Cyan>(</font> validate-<a name="(line4)"></a> <font color=Cyan>,</font> partialValidate-<a name="(line5)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line6)"></a>-<a name="(line7)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line8)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Combinators <font color=Cyan>(</font>multi<font color=Cyan>,</font>tag<font color=Cyan>,</font>iffind<font color=Cyan>,</font>literal<font color=Cyan>,</font>none<font color=Cyan>,</font>o<font color=Cyan>)</font>-<a name="(line9)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>XmlContent <font color=Cyan>(</font>attr2str<font color=Cyan>)</font>-<a name="(line10)"></a><font color=Green><u>import</u></font> Maybe <font color=Cyan>(</font>fromMaybe<font color=Cyan>,</font>isNothing<font color=Cyan>,</font>fromJust<font color=Cyan>)</font>-<a name="(line11)"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>intersperse<font color=Cyan>,</font>nub<font color=Cyan>,</font><font color=Cyan>(</font><font color=Cyan>\\</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line12)"></a><font color=Green><u>import</u></font> Char <font color=Cyan>(</font>isSpace<font color=Cyan>)</font>-<a name="(line13)"></a>-<a name="(line14)"></a><font color=Magenta><em>#if __GLASGOW_HASKELL__ >= 604 || __NHC__ >= 118 || defined(__HUGS__)</em></font>-<a name="(line15)"></a><font color=Blue>-- emulate older finite map interface using Data.Map, if it is available</font>-<a name="(line16)"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Data<font color=Cyan>.</font>Map <font color=Green><u>as</u></font> Map-<a name="(line17)"></a><a name="FiniteMap"></a><font color=Green><u>type</u></font> FiniteMap a b <font color=Red>=</font> Map<font color=Cyan>.</font>Map a b-<a name="(line18)"></a><a name="listToFM"></a>listToFM <font color=Red>::</font> Ord a <font color=Red>=></font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> FiniteMap a b-<a name="(line19)"></a>listToFM <font color=Red>=</font> Map<font color=Cyan>.</font>fromList-<a name="(line20)"></a><a name="lookupFM"></a>lookupFM <font color=Red>::</font> Ord a <font color=Red>=></font> FiniteMap a b <font color=Red>-></font> a <font color=Red>-></font> Maybe b-<a name="(line21)"></a>lookupFM <font color=Red>=</font> flip Map<font color=Cyan>.</font>lookup-<a name="(line22)"></a><font color=Magenta><em>#elif __GLASGOW_HASKELL__ >= 504 || __NHC__ > 114</em></font>-<a name="(line23)"></a><font color=Blue>-- real finite map, if it is available</font>-<a name="(line24)"></a><font color=Green><u>import</u></font> Data<font color=Cyan>.</font>FiniteMap-<a name="(line25)"></a><font color=Magenta><em>#else</em></font>-<a name="(line26)"></a><a name="FiniteMap"></a><font color=Blue>-- otherwise, a very simple and inefficient implementation of a finite map</font>-<a name="(line27)"></a><a name="FiniteMap"></a><font color=Green><u>type</u></font> FiniteMap a b <font color=Red>=</font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font><font color=Red>]</font>-<a name="(line28)"></a>listToFM <font color=Red>::</font> Eq a <font color=Red>=></font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> FiniteMap a b-<a name="(line29)"></a>listToFM <font color=Red>=</font> id-<a name="(line30)"></a>lookupFM <font color=Red>::</font> Eq a <font color=Red>=></font> FiniteMap a b <font color=Red>-></font> a <font color=Red>-></font> Maybe b-<a name="(line31)"></a>lookupFM fm k <font color=Red>=</font> lookup k fm-<a name="(line32)"></a><font color=Magenta><em>#endif</em></font>-<a name="(line33)"></a>-<a name="(line34)"></a><a name="SimpleDTD"></a><font color=Blue>-- gather appropriate information out of the DTD</font>-<a name="(line35)"></a><a name="SimpleDTD"></a><font color=Green><u>data</u></font> SimpleDTD <font color=Red>=</font> SimpleDTD-<a name="(line36)"></a> <font color=Cyan>{</font> elements <font color=Red>::</font> FiniteMap Name ContentSpec <font color=Blue>-- content model of elem</font>-<a name="(line37)"></a> <font color=Cyan>,</font> attributes <font color=Red>::</font> FiniteMap <font color=Cyan>(</font>Name<font color=Cyan>,</font>Name<font color=Cyan>)</font> AttType <font color=Blue>-- type of (elem,attr)</font>-<a name="(line38)"></a> <font color=Cyan>,</font> required <font color=Red>::</font> FiniteMap Name <font color=Red>[</font>Name<font color=Red>]</font> <font color=Blue>-- required attributes of elem</font>-<a name="(line39)"></a> <font color=Cyan>,</font> ids <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font>Name<font color=Cyan>)</font><font color=Red>]</font> <font color=Blue>-- all (element,attr) with ID type</font>-<a name="(line40)"></a> <font color=Cyan>,</font> idrefs <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font>Name<font color=Cyan>)</font><font color=Red>]</font> <font color=Blue>-- all (element,attr) with IDREF type</font>-<a name="(line41)"></a> <font color=Cyan>}</font>-<a name="(line42)"></a>-<a name="(line43)"></a><a name="simplifyDTD"></a>simplifyDTD <font color=Red>::</font> DocTypeDecl <font color=Red>-></font> SimpleDTD-<a name="(line44)"></a>simplifyDTD <font color=Cyan>(</font>DTD <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> decls<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line45)"></a> SimpleDTD-<a name="(line46)"></a> <font color=Cyan>{</font> elements <font color=Red>=</font> listToFM <font color=Red>[</font> <font color=Cyan>(</font>name<font color=Cyan>,</font>content<font color=Cyan>)</font>-<a name="(line47)"></a> <font color=Red>|</font> Element <font color=Cyan>(</font>ElementDecl name content<font color=Cyan>)</font> <font color=Red><-</font> decls <font color=Red>]</font>-<a name="(line48)"></a> <font color=Cyan>,</font> attributes <font color=Red>=</font> listToFM <font color=Red>[</font> <font color=Cyan>(</font><font color=Cyan>(</font>elem<font color=Cyan>,</font>attr<font color=Cyan>)</font><font color=Cyan>,</font>typ<font color=Cyan>)</font>-<a name="(line49)"></a> <font color=Red>|</font> AttList <font color=Cyan>(</font>AttListDecl elem attdefs<font color=Cyan>)</font> <font color=Red><-</font> decls-<a name="(line50)"></a> <font color=Cyan>,</font> AttDef attr typ <font color=Green><u>_</u></font> <font color=Red><-</font> attdefs <font color=Red>]</font>-<a name="(line51)"></a> <font color=Cyan>,</font> required <font color=Red>=</font> listToFM <font color=Red>[</font> <font color=Cyan>(</font>elem<font color=Cyan>,</font> <font color=Red>[</font> attr-<a name="(line52)"></a> <font color=Red>|</font> AttDef attr <font color=Green><u>_</u></font> REQUIRED <font color=Red><-</font> attdefs <font color=Red>]</font><font color=Cyan>)</font>-<a name="(line53)"></a> <font color=Red>|</font> AttList <font color=Cyan>(</font>AttListDecl elem attdefs<font color=Cyan>)</font> <font color=Red><-</font> decls <font color=Red>]</font>-<a name="(line54)"></a> <font color=Cyan>,</font> ids <font color=Red>=</font> <font color=Red>[</font> <font color=Cyan>(</font>elem<font color=Cyan>,</font>attr<font color=Cyan>)</font>-<a name="(line55)"></a> <font color=Red>|</font> Element <font color=Cyan>(</font>ElementDecl elem <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red><-</font> decls-<a name="(line56)"></a> <font color=Cyan>,</font> AttList <font color=Cyan>(</font>AttListDecl name attdefs<font color=Cyan>)</font> <font color=Red><-</font> decls-<a name="(line57)"></a> <font color=Cyan>,</font> elem <font color=Cyan>==</font> name-<a name="(line58)"></a> <font color=Cyan>,</font> AttDef attr <font color=Cyan>(</font>TokenizedType ID<font color=Cyan>)</font> <font color=Green><u>_</u></font> <font color=Red><-</font> attdefs <font color=Red>]</font>-<a name="(line59)"></a> <font color=Cyan>,</font> idrefs <font color=Red>=</font> [] <font color=Blue>-- not implemented</font>-<a name="(line60)"></a> <font color=Cyan>}</font>-<a name="(line61)"></a>-<a name="(line62)"></a><a name="gives"></a><font color=Blue>-- simple auxiliary to avoid lots of if-then-else with empty else clauses.</font>-<a name="(line63)"></a>gives <font color=Red>::</font> Bool <font color=Red>-></font> a <font color=Red>-></font> <font color=Red>[</font>a<font color=Red>]</font>-<a name="(line64)"></a>True <font color=Cyan>`gives`</font> x <font color=Red>=</font> <font color=Red>[</font>x<font color=Red>]</font>-<a name="(line65)"></a>False <font color=Cyan>`gives`</font> <font color=Green><u>_</u></font> <font color=Red>=</font> []-<a name="(line66)"></a>-<a name="(line67)"></a><a name="validate"></a><font color=Blue>-- | 'validate' takes a DTD and a tagged element, and returns a list of</font>-<a name="(line68)"></a><font color=Blue>-- errors in the document with respect to its DTD.</font>-<a name="(line69)"></a><font color=Blue>--</font>-<a name="(line70)"></a><font color=Blue>-- If you have several documents to validate against a single DTD,</font>-<a name="(line71)"></a><font color=Blue>-- then you will gain efficiency by freezing-in the DTD through partial</font>-<a name="(line72)"></a><font color=Blue>-- application, e.g. @checkMyDTD = validate myDTD@.</font>-<a name="(line73)"></a>validate <font color=Red>::</font> DocTypeDecl <font color=Red>-></font> Element i <font color=Red>-></font> <font color=Red>[</font>String<font color=Red>]</font>-<a name="(line74)"></a>validate dtd' elem <font color=Red>=</font> root dtd' elem <font color=Cyan>++</font> partialValidate dtd' elem-<a name="(line75)"></a> <font color=Green><u>where</u></font>-<a name="(line76)"></a> root <font color=Cyan>(</font>DTD name <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>(</font>Elem name' <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line77)"></a> <font color=Cyan>(</font>name<font color=Cyan>/=</font>name'<font color=Cyan>)</font> <font color=Cyan>`gives`</font> <font color=Cyan>(</font><font color=Magenta>"Document type should be <"</font><font color=Cyan>++</font>name-<a name="(line78)"></a> <font color=Cyan>++</font><font color=Magenta>"> but appears to be <"</font><font color=Cyan>++</font>name'<font color=Cyan>++</font><font color=Magenta>">."</font><font color=Cyan>)</font>-<a name="(line79)"></a>-<a name="(line80)"></a><a name="partialValidate"></a><font color=Blue>-- | 'partialValidate' is like validate, except that it does not check that</font>-<a name="(line81)"></a><font color=Blue>-- the element type matches that of the DTD's root element.</font>-<a name="(line82)"></a>partialValidate <font color=Red>::</font> DocTypeDecl <font color=Red>-></font> Element i <font color=Red>-></font> <font color=Red>[</font>String<font color=Red>]</font>-<a name="(line83)"></a>partialValidate dtd' elem <font color=Red>=</font> valid elem <font color=Cyan>++</font> checkIDs elem-<a name="(line84)"></a> <font color=Green><u>where</u></font>-<a name="(line85)"></a> dtd <font color=Red>=</font> simplifyDTD dtd'-<a name="(line86)"></a>-<a name="(line87)"></a> valid <font color=Cyan>(</font>Elem name attrs contents<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line88)"></a> <font color=Blue>-- is the element defined in the DTD?</font>-<a name="(line89)"></a> <font color=Green><u>let</u></font> spec <font color=Red>=</font> lookupFM <font color=Cyan>(</font>elements dtd<font color=Cyan>)</font> name <font color=Green><u>in</u></font> -<a name="(line90)"></a> <font color=Cyan>(</font>isNothing spec<font color=Cyan>)</font> <font color=Cyan>`gives`</font> <font color=Cyan>(</font><font color=Magenta>"Element <"</font><font color=Cyan>++</font>name<font color=Cyan>++</font><font color=Magenta>"> not known."</font><font color=Cyan>)</font>-<a name="(line91)"></a> <font color=Blue>-- is each attribute mentioned only once?</font>-<a name="(line92)"></a> <font color=Cyan>++</font> <font color=Cyan>(</font><font color=Green><u>let</u></font> dups <font color=Red>=</font> duplicates <font color=Cyan>(</font>map fst attrs<font color=Cyan>)</font> <font color=Green><u>in</u></font>-<a name="(line93)"></a> not <font color=Cyan>(</font>null dups<font color=Cyan>)</font> <font color=Cyan>`gives`</font>-<a name="(line94)"></a> <font color=Cyan>(</font><font color=Magenta>"Element <"</font><font color=Cyan>++</font>name<font color=Cyan>++</font><font color=Magenta>"> has duplicate attributes: "</font>-<a name="(line95)"></a> <font color=Cyan>++</font>concat <font color=Cyan>(</font>intersperse <font color=Magenta>","</font> dups<font color=Cyan>)</font><font color=Cyan>++</font><font color=Magenta>"."</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line96)"></a> <font color=Blue>-- does each attribute belong to this element? value is in range?</font>-<a name="(line97)"></a> <font color=Cyan>++</font> concatMap <font color=Cyan>(</font>checkAttr name<font color=Cyan>)</font> attrs-<a name="(line98)"></a> <font color=Blue>-- are all required attributes present?</font>-<a name="(line99)"></a> <font color=Cyan>++</font> concatMap <font color=Cyan>(</font>checkRequired name attrs<font color=Cyan>)</font>-<a name="(line100)"></a> <font color=Cyan>(</font>fromMaybe [] <font color=Cyan>(</font>lookupFM <font color=Cyan>(</font>required dtd<font color=Cyan>)</font> name<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line101)"></a> <font color=Blue>-- are its children in a permissible sequence?</font>-<a name="(line102)"></a> <font color=Cyan>++</font> checkContentSpec name <font color=Cyan>(</font>fromMaybe ANY spec<font color=Cyan>)</font> contents-<a name="(line103)"></a> <font color=Blue>-- now recursively check the element children</font>-<a name="(line104)"></a> <font color=Cyan>++</font> concatMap valid <font color=Red>[</font> elem <font color=Red>|</font> CElem elem <font color=Green><u>_</u></font> <font color=Red><-</font> contents <font color=Red>]</font>-<a name="(line105)"></a>-<a name="(line106)"></a> checkAttr elem <font color=Cyan>(</font>attr<font color=Cyan>,</font> val<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line107)"></a> <font color=Green><u>let</u></font> typ <font color=Red>=</font> lookupFM <font color=Cyan>(</font>attributes dtd<font color=Cyan>)</font> <font color=Cyan>(</font>elem<font color=Cyan>,</font>attr<font color=Cyan>)</font>-<a name="(line108)"></a> attval <font color=Red>=</font> attr2str val <font color=Green><u>in</u></font>-<a name="(line109)"></a> <font color=Green><u>if</u></font> isNothing typ <font color=Green><u>then</u></font> <font color=Red>[</font><font color=Magenta>"Attribute \""</font><font color=Cyan>++</font>attr-<a name="(line110)"></a> <font color=Cyan>++</font><font color=Magenta>"\" not known for element <"</font><font color=Cyan>++</font>elem<font color=Cyan>++</font><font color=Magenta>">."</font><font color=Red>]</font>-<a name="(line111)"></a> <font color=Green><u>else</u></font>-<a name="(line112)"></a> <font color=Green><u>case</u></font> fromJust typ <font color=Green><u>of</u></font>-<a name="(line113)"></a> EnumeratedType e <font color=Red>-></font>-<a name="(line114)"></a> <font color=Green><u>case</u></font> e <font color=Green><u>of</u></font>-<a name="(line115)"></a> Enumeration es <font color=Red>-></font>-<a name="(line116)"></a> <font color=Cyan>(</font>not <font color=Cyan>(</font>attval <font color=Cyan>`</font>Prelude<font color=Cyan>.</font>elem<font color=Cyan>`</font> es<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>`gives`</font>-<a name="(line117)"></a> <font color=Cyan>(</font><font color=Magenta>"Value \""</font><font color=Cyan>++</font>attval<font color=Cyan>++</font><font color=Magenta>"\" of attribute \""</font>-<a name="(line118)"></a> <font color=Cyan>++</font>attr<font color=Cyan>++</font><font color=Magenta>"\" in element <"</font><font color=Cyan>++</font>elem-<a name="(line119)"></a> <font color=Cyan>++</font><font color=Magenta>"> is not in the required enumeration range: "</font>-<a name="(line120)"></a> <font color=Cyan>++</font>unwords es<font color=Cyan>)</font>-<a name="(line121)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> []-<a name="(line122)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> []-<a name="(line123)"></a>-<a name="(line124)"></a> checkRequired elem attrs req <font color=Red>=</font>-<a name="(line125)"></a> <font color=Cyan>(</font>not <font color=Cyan>(</font>req <font color=Cyan>`</font>Prelude<font color=Cyan>.</font>elem<font color=Cyan>`</font> map fst attrs<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>`gives`</font>-<a name="(line126)"></a> <font color=Cyan>(</font><font color=Magenta>"Element <"</font><font color=Cyan>++</font>elem<font color=Cyan>++</font><font color=Magenta>"> requires the attribute \""</font><font color=Cyan>++</font>req-<a name="(line127)"></a> <font color=Cyan>++</font><font color=Magenta>"\" but it is missing."</font><font color=Cyan>)</font>-<a name="(line128)"></a>-<a name="(line129)"></a> checkContentSpec elem ANY <font color=Green><u>_</u></font> <font color=Red>=</font> []-<a name="(line130)"></a> checkContentSpec elem EMPTY [] <font color=Red>=</font> []-<a name="(line131)"></a> checkContentSpec elem EMPTY <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line132)"></a> <font color=Red>[</font><font color=Magenta>"Element <"</font><font color=Cyan>++</font>elem<font color=Cyan>++</font><font color=Magenta>"> is not empty but should be."</font><font color=Red>]</font>-<a name="(line133)"></a> checkContentSpec elem <font color=Cyan>(</font>Mixed PCDATA<font color=Cyan>)</font> cs <font color=Red>=</font> concatMap <font color=Cyan>(</font>checkMixed elem []<font color=Cyan>)</font> cs-<a name="(line134)"></a> checkContentSpec elem <font color=Cyan>(</font>Mixed <font color=Cyan>(</font>PCDATAplus names<font color=Cyan>)</font><font color=Cyan>)</font> cs <font color=Red>=</font>-<a name="(line135)"></a> concatMap <font color=Cyan>(</font>checkMixed elem names<font color=Cyan>)</font> cs-<a name="(line136)"></a> checkContentSpec elem <font color=Cyan>(</font>ContentSpec cp<font color=Cyan>)</font> cs <font color=Red>=</font> excludeText elem cs <font color=Cyan>++</font>-<a name="(line137)"></a> <font color=Cyan>(</font><font color=Green><u>let</u></font> <font color=Cyan>(</font>errs<font color=Cyan>,</font>rest<font color=Cyan>)</font> <font color=Red>=</font> checkCP elem cp <font color=Cyan>(</font>flatten cs<font color=Cyan>)</font> <font color=Green><u>in</u></font>-<a name="(line138)"></a> <font color=Green><u>case</u></font> rest <font color=Green><u>of</u></font> [] <font color=Red>-></font> errs-<a name="(line139)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> errs<font color=Cyan>++</font><font color=Red>[</font><font color=Magenta>"Element <"</font><font color=Cyan>++</font>elem<font color=Cyan>++</font><font color=Magenta>"> contains extra "</font>-<a name="(line140)"></a> <font color=Cyan>++</font><font color=Magenta>"elements beyond its content spec."</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line141)"></a>-<a name="(line142)"></a> checkMixed elem permitted <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem name <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font>-<a name="(line143)"></a> <font color=Red>|</font> not <font color=Cyan>(</font>name <font color=Cyan>`</font>Prelude<font color=Cyan>.</font>elem<font color=Cyan>`</font> permitted<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line144)"></a> <font color=Red>[</font><font color=Magenta>"Element <"</font><font color=Cyan>++</font>elem<font color=Cyan>++</font><font color=Magenta>"> contains an element <"</font><font color=Cyan>++</font>name-<a name="(line145)"></a> <font color=Cyan>++</font><font color=Magenta>"> but should not."</font><font color=Red>]</font>-<a name="(line146)"></a> checkMixed elem permitted <font color=Green><u>_</u></font> <font color=Red>=</font> []-<a name="(line147)"></a>-<a name="(line148)"></a> flatten <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem name <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Red><b>:</b></font> cs<font color=Cyan>)</font> <font color=Red>=</font> name<font color=Red><b>:</b></font> flatten cs-<a name="(line149)"></a> flatten <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font> cs<font color=Cyan>)</font> <font color=Red>=</font> flatten cs-<a name="(line150)"></a> flatten [] <font color=Red>=</font> []-<a name="(line151)"></a>-<a name="(line152)"></a> excludeText elem <font color=Cyan>(</font>CElem <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Red><b>:</b></font> cs<font color=Cyan>)</font> <font color=Red>=</font> excludeText elem cs-<a name="(line153)"></a> excludeText elem <font color=Cyan>(</font>CMisc <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Red><b>:</b></font> cs<font color=Cyan>)</font> <font color=Red>=</font> excludeText elem cs-<a name="(line154)"></a> excludeText elem <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Red><b>:</b></font> cs<font color=Cyan>)</font> <font color=Red>|</font> all isSpace s <font color=Red>=</font> excludeText elem cs-<a name="(line155)"></a> excludeText elem <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font> cs<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line156)"></a> <font color=Red>[</font><font color=Magenta>"Element <"</font><font color=Cyan>++</font>elem<font color=Cyan>++</font><font color=Magenta>"> contains text/references but should not."</font><font color=Red>]</font>-<a name="(line157)"></a> excludeText elem [] <font color=Red>=</font> []-<a name="(line158)"></a>-<a name="(line159)"></a> <font color=Blue>-- This is a little parser really. Returns any errors, plus the remainder</font>-<a name="(line160)"></a> <font color=Blue>-- of the input string.</font>-<a name="(line161)"></a> checkCP <font color=Red>::</font> Name <font color=Red>-></font> CP <font color=Red>-></font> <font color=Red>[</font>Name<font color=Red>]</font> <font color=Red>-></font> <font color=Cyan>(</font><font color=Red>[</font>String<font color=Red>]</font><font color=Cyan>,</font><font color=Red>[</font>Name<font color=Red>]</font><font color=Cyan>)</font>-<a name="(line162)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>TagName n None<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>,</font> []<font color=Cyan>)</font>-<a name="(line163)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>TagName n None<font color=Cyan>)</font> <font color=Cyan>(</font>n'<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>-<a name="(line164)"></a> <font color=Red>|</font> n<font color=Cyan>==</font>n' <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font> ns<font color=Cyan>)</font>-<a name="(line165)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>,</font> n'<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>-<a name="(line166)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>TagName n Query<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>[]<font color=Cyan>)</font>-<a name="(line167)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>TagName n Query<font color=Cyan>)</font> <font color=Cyan>(</font>n'<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>-<a name="(line168)"></a> <font color=Red>|</font> n<font color=Cyan>==</font>n' <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font> ns<font color=Cyan>)</font>-<a name="(line169)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font> n'<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>-<a name="(line170)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>TagName n Star<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>[]<font color=Cyan>)</font>-<a name="(line171)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>TagName n Star<font color=Cyan>)</font> <font color=Cyan>(</font>n'<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>-<a name="(line172)"></a> <font color=Red>|</font> n<font color=Cyan>==</font>n' <font color=Red>=</font> checkCP elem <font color=Cyan>(</font>TagName n Star<font color=Cyan>)</font> ns-<a name="(line173)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font> n'<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>-<a name="(line174)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>TagName n Plus<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>,</font> []<font color=Cyan>)</font>-<a name="(line175)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>TagName n Plus<font color=Cyan>)</font> <font color=Cyan>(</font>n'<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>-<a name="(line176)"></a> <font color=Red>|</font> n<font color=Cyan>==</font>n' <font color=Red>=</font> checkCP elem <font color=Cyan>(</font>TagName n Star<font color=Cyan>)</font> ns-<a name="(line177)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>,</font> n'<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>-<a name="(line178)"></a> <font color=Blue>-- omit this clause, to permit (a?|b?) as a valid but empty choice</font>-<a name="(line179)"></a> <font color=Blue>-- checkCP elem cp@(Choice cps None) [] = (cpError elem cp, [])</font>-<a name="(line180)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Choice cps None<font color=Cyan>)</font> ns <font color=Red>=</font>-<a name="(line181)"></a> <font color=Green><u>let</u></font> next <font color=Red>=</font> choice elem ns cps <font color=Green><u>in</u></font>-<a name="(line182)"></a> <font color=Green><u>if</u></font> null next <font color=Green><u>then</u></font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>,</font> ns<font color=Cyan>)</font>-<a name="(line183)"></a> <font color=Green><u>else</u></font> <font color=Cyan>(</font>[]<font color=Cyan>,</font> head next<font color=Cyan>)</font> <font color=Blue>-- choose the first alternative with no errors</font>-<a name="(line184)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Choice cps Query<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>[]<font color=Cyan>)</font>-<a name="(line185)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Choice cps Query<font color=Cyan>)</font> ns <font color=Red>=</font>-<a name="(line186)"></a> <font color=Green><u>let</u></font> next <font color=Red>=</font> choice elem ns cps <font color=Green><u>in</u></font>-<a name="(line187)"></a> <font color=Green><u>if</u></font> null next <font color=Green><u>then</u></font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>ns<font color=Cyan>)</font>-<a name="(line188)"></a> <font color=Green><u>else</u></font> <font color=Cyan>(</font>[]<font color=Cyan>,</font> head next<font color=Cyan>)</font>-<a name="(line189)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Choice cps Star<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>[]<font color=Cyan>)</font>-<a name="(line190)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Choice cps Star<font color=Cyan>)</font> ns <font color=Red>=</font>-<a name="(line191)"></a> <font color=Green><u>let</u></font> next <font color=Red>=</font> choice elem ns cps <font color=Green><u>in</u></font>-<a name="(line192)"></a> <font color=Green><u>if</u></font> null next <font color=Green><u>then</u></font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>ns<font color=Cyan>)</font>-<a name="(line193)"></a> <font color=Green><u>else</u></font> checkCP elem <font color=Cyan>(</font>Choice cps Star<font color=Cyan>)</font> <font color=Cyan>(</font>head next<font color=Cyan>)</font>-<a name="(line194)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Choice cps Plus<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>,</font> []<font color=Cyan>)</font>-<a name="(line195)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Choice cps Plus<font color=Cyan>)</font> ns <font color=Red>=</font>-<a name="(line196)"></a> <font color=Green><u>let</u></font> next <font color=Red>=</font> choice elem ns cps <font color=Green><u>in</u></font>-<a name="(line197)"></a> <font color=Green><u>if</u></font> null next <font color=Green><u>then</u></font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>,</font> ns<font color=Cyan>)</font>-<a name="(line198)"></a> <font color=Green><u>else</u></font> checkCP elem <font color=Cyan>(</font>Choice cps Star<font color=Cyan>)</font> <font color=Cyan>(</font>head next<font color=Cyan>)</font>-<a name="(line199)"></a> <font color=Blue>-- omit this clause, to permit (a?,b?) as a valid but empty sequence</font>-<a name="(line200)"></a> <font color=Blue>-- checkCP elem cp@(Seq cps None) [] = (cpError elem cp, [])</font>-<a name="(line201)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Seq cps None<font color=Cyan>)</font> ns <font color=Red>=</font>-<a name="(line202)"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>errs<font color=Cyan>,</font>next<font color=Cyan>)</font> <font color=Red>=</font> sequence elem ns cps <font color=Green><u>in</u></font>-<a name="(line203)"></a> <font color=Green><u>if</u></font> null errs <font color=Green><u>then</u></font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>next<font color=Cyan>)</font>-<a name="(line204)"></a> <font color=Green><u>else</u></font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>++</font>errs<font color=Cyan>,</font> ns<font color=Cyan>)</font>-<a name="(line205)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Seq cps Query<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>[]<font color=Cyan>)</font>-<a name="(line206)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Seq cps Query<font color=Cyan>)</font> ns <font color=Red>=</font>-<a name="(line207)"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>errs<font color=Cyan>,</font>next<font color=Cyan>)</font> <font color=Red>=</font> sequence elem ns cps <font color=Green><u>in</u></font>-<a name="(line208)"></a> <font color=Green><u>if</u></font> null errs <font color=Green><u>then</u></font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>next<font color=Cyan>)</font>-<a name="(line209)"></a> <font color=Green><u>else</u></font> <font color=Cyan>(</font>[]<font color=Cyan>,</font> ns<font color=Cyan>)</font>-<a name="(line210)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Seq cps Star<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>[]<font color=Cyan>)</font>-<a name="(line211)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Seq cps Star<font color=Cyan>)</font> ns <font color=Red>=</font>-<a name="(line212)"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>errs<font color=Cyan>,</font>next<font color=Cyan>)</font> <font color=Red>=</font> sequence elem ns cps <font color=Green><u>in</u></font>-<a name="(line213)"></a> <font color=Green><u>if</u></font> null errs <font color=Green><u>then</u></font> checkCP elem <font color=Cyan>(</font>Seq cps Star<font color=Cyan>)</font> next-<a name="(line214)"></a> <font color=Green><u>else</u></font> <font color=Cyan>(</font>[]<font color=Cyan>,</font> ns<font color=Cyan>)</font>-<a name="(line215)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Seq cps Plus<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>,</font> []<font color=Cyan>)</font>-<a name="(line216)"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Seq cps Plus<font color=Cyan>)</font> ns <font color=Red>=</font>-<a name="(line217)"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>errs<font color=Cyan>,</font>next<font color=Cyan>)</font> <font color=Red>=</font> sequence elem ns cps <font color=Green><u>in</u></font>-<a name="(line218)"></a> <font color=Green><u>if</u></font> null errs <font color=Green><u>then</u></font> checkCP elem <font color=Cyan>(</font>Seq cps Star<font color=Cyan>)</font> next-<a name="(line219)"></a> <font color=Green><u>else</u></font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>++</font>errs<font color=Cyan>,</font> ns<font color=Cyan>)</font>-<a name="(line220)"></a>-<a name="(line221)"></a> choice elem ns cps <font color=Red>=</font> <font color=Blue>-- return only those parses that don't give any errors</font>-<a name="(line222)"></a> <font color=Red>[</font> rem <font color=Red>|</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>rem<font color=Cyan>)</font> <font color=Red><-</font> map <font color=Cyan>(</font><font color=Red>\</font>cp<font color=Red>-></font> checkCP elem <font color=Cyan>(</font>definite cp<font color=Cyan>)</font> ns<font color=Cyan>)</font> cps <font color=Red>]</font>-<a name="(line223)"></a> <font color=Cyan>++</font> <font color=Red>[</font> ns <font color=Red>|</font> all possEmpty cps <font color=Red>]</font>-<a name="(line224)"></a> <font color=Green><u>where</u></font> definite <font color=Cyan>(</font>TagName n Query<font color=Cyan>)</font> <font color=Red>=</font> TagName n None-<a name="(line225)"></a> definite <font color=Cyan>(</font>Choice cps Query<font color=Cyan>)</font> <font color=Red>=</font> Choice cps None-<a name="(line226)"></a> definite <font color=Cyan>(</font>Seq cps Query<font color=Cyan>)</font> <font color=Red>=</font> Seq cps None-<a name="(line227)"></a> definite <font color=Cyan>(</font>TagName n Star<font color=Cyan>)</font> <font color=Red>=</font> TagName n Plus-<a name="(line228)"></a> definite <font color=Cyan>(</font>Choice cps Star<font color=Cyan>)</font> <font color=Red>=</font> Choice cps Plus-<a name="(line229)"></a> definite <font color=Cyan>(</font>Seq cps Star<font color=Cyan>)</font> <font color=Red>=</font> Seq cps Plus-<a name="(line230)"></a> definite x <font color=Red>=</font> x-<a name="(line231)"></a> possEmpty <font color=Cyan>(</font>TagName <font color=Green><u>_</u></font> mod<font color=Cyan>)</font> <font color=Red>=</font> mod <font color=Cyan>`</font>Prelude<font color=Cyan>.</font>elem<font color=Cyan>`</font> <font color=Red>[</font>Query<font color=Cyan>,</font>Star<font color=Red>]</font>-<a name="(line232)"></a> possEmpty <font color=Cyan>(</font>Choice cps None<font color=Cyan>)</font> <font color=Red>=</font> all possEmpty cps-<a name="(line233)"></a> possEmpty <font color=Cyan>(</font>Choice <font color=Green><u>_</u></font> mod<font color=Cyan>)</font> <font color=Red>=</font> mod <font color=Cyan>`</font>Prelude<font color=Cyan>.</font>elem<font color=Cyan>`</font> <font color=Red>[</font>Query<font color=Cyan>,</font>Star<font color=Red>]</font>-<a name="(line234)"></a> possEmpty <font color=Cyan>(</font>Seq cps None<font color=Cyan>)</font> <font color=Red>=</font> all possEmpty cps-<a name="(line235)"></a> possEmpty <font color=Cyan>(</font>Seq <font color=Green><u>_</u></font> mod<font color=Cyan>)</font> <font color=Red>=</font> mod <font color=Cyan>`</font>Prelude<font color=Cyan>.</font>elem<font color=Cyan>`</font> <font color=Red>[</font>Query<font color=Cyan>,</font>Star<font color=Red>]</font>-<a name="(line236)"></a> sequence elem ns cps <font color=Red>=</font> <font color=Blue>-- accumulate errors down the sequence</font>-<a name="(line237)"></a> foldl <font color=Cyan>(</font><font color=Red>\</font><font color=Cyan>(</font>es<font color=Cyan>,</font>ns<font color=Cyan>)</font> cp<font color=Red>-></font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>es'<font color=Cyan>,</font>ns'<font color=Cyan>)</font> <font color=Red>=</font> checkCP elem cp ns-<a name="(line238)"></a> <font color=Green><u>in</u></font> <font color=Cyan>(</font>es<font color=Cyan>++</font>es'<font color=Cyan>,</font> ns'<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line239)"></a> <font color=Cyan>(</font>[]<font color=Cyan>,</font>ns<font color=Cyan>)</font> cps-<a name="(line240)"></a>-<a name="(line241)"></a> checkIDs elem <font color=Red>=</font>-<a name="(line242)"></a> <font color=Green><u>let</u></font> celem <font color=Red>=</font> CElem elem undefined-<a name="(line243)"></a> showAttr a <font color=Red>=</font> iffind a literal none-<a name="(line244)"></a> idElems <font color=Red>=</font> concatMap <font color=Cyan>(</font><font color=Red>\</font><font color=Cyan>(</font>name<font color=Cyan>,</font>at<font color=Cyan>)</font><font color=Red>-></font> multi <font color=Cyan>(</font>showAttr at <font color=Cyan>`o`</font> tag name<font color=Cyan>)</font>-<a name="(line245)"></a> celem<font color=Cyan>)</font>-<a name="(line246)"></a> <font color=Cyan>(</font>ids dtd<font color=Cyan>)</font>-<a name="(line247)"></a> badIds <font color=Red>=</font> duplicates <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font><font color=Cyan>(</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Red>-></font>s<font color=Cyan>)</font> idElems<font color=Cyan>)</font>-<a name="(line248)"></a> <font color=Green><u>in</u></font> not <font color=Cyan>(</font>null badIds<font color=Cyan>)</font> <font color=Cyan>`gives`</font>-<a name="(line249)"></a> <font color=Cyan>(</font><font color=Magenta>"These attribute values of type ID are not unique: "</font>-<a name="(line250)"></a> <font color=Cyan>++</font>concat <font color=Cyan>(</font>intersperse <font color=Magenta>","</font> badIds<font color=Cyan>)</font><font color=Cyan>++</font><font color=Magenta>"."</font><font color=Cyan>)</font>-<a name="(line251)"></a>-<a name="(line252)"></a>-<a name="(line253)"></a><a name="cpError"></a>cpError <font color=Red>::</font> Name <font color=Red>-></font> CP <font color=Red>-></font> <font color=Red>[</font>String<font color=Red>]</font>-<a name="(line254)"></a>cpError elem cp <font color=Red>=</font>-<a name="(line255)"></a> <font color=Red>[</font><font color=Magenta>"Element <"</font><font color=Cyan>++</font>elem<font color=Cyan>++</font><font color=Magenta>"> should contain "</font><font color=Cyan>++</font>display cp<font color=Cyan>++</font><font color=Magenta>" but does not."</font><font color=Red>]</font>-<a name="(line256)"></a>-<a name="(line257)"></a>-<a name="(line258)"></a><a name="display"></a>display <font color=Red>::</font> CP <font color=Red>-></font> String-<a name="(line259)"></a>display <font color=Cyan>(</font>TagName name mod<font color=Cyan>)</font> <font color=Red>=</font> name <font color=Cyan>++</font> modifier mod-<a name="(line260)"></a>display <font color=Cyan>(</font>Choice cps mod<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"("</font> <font color=Cyan>++</font> concat <font color=Cyan>(</font>intersperse <font color=Magenta>"|"</font> <font color=Cyan>(</font>map display cps<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line261)"></a> <font color=Cyan>++</font> <font color=Magenta>")"</font> <font color=Cyan>++</font> modifier mod-<a name="(line262)"></a>display <font color=Cyan>(</font>Seq cps mod<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"("</font> <font color=Cyan>++</font> concat <font color=Cyan>(</font>intersperse <font color=Magenta>","</font> <font color=Cyan>(</font>map display cps<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line263)"></a> <font color=Cyan>++</font> <font color=Magenta>")"</font> <font color=Cyan>++</font> modifier mod-<a name="(line264)"></a>-<a name="(line265)"></a><a name="modifier"></a>modifier <font color=Red>::</font> Modifier <font color=Red>-></font> String-<a name="(line266)"></a>modifier None <font color=Red>=</font> <font color=Magenta>""</font>-<a name="(line267)"></a>modifier Query <font color=Red>=</font> <font color=Magenta>"?"</font>-<a name="(line268)"></a>modifier Star <font color=Red>=</font> <font color=Magenta>"*"</font>-<a name="(line269)"></a>modifier Plus <font color=Red>=</font> <font color=Magenta>"+"</font>-<a name="(line270)"></a>-<a name="(line271)"></a><a name="duplicates"></a>duplicates <font color=Red>::</font> Eq a <font color=Red>=></font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>a<font color=Red>]</font>-<a name="(line272)"></a>duplicates xs <font color=Red>=</font> xs <font color=Cyan>\\</font> <font color=Cyan>(</font>nub xs<font color=Cyan>)</font>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/Validate.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>-- | Validate a document against a dtd.</font>+<a name="line-2"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Validate+<a name="line-3"></a> <font color=Cyan>(</font> validate+<a name="line-4"></a> <font color=Cyan>,</font> partialValidate+<a name="line-5"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-6"></a>+<a name="line-7"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-8"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Combinators <font color=Cyan>(</font>multi<font color=Cyan>,</font>tag<font color=Cyan>,</font>iffind<font color=Cyan>,</font>literal<font color=Cyan>,</font>none<font color=Cyan>,</font>o<font color=Cyan>)</font>+<a name="line-9"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>XmlContent <font color=Cyan>(</font>attr2str<font color=Cyan>)</font>+<a name="line-10"></a><font color=Green><u>import</u></font> Maybe <font color=Cyan>(</font>fromMaybe<font color=Cyan>,</font>isNothing<font color=Cyan>,</font>fromJust<font color=Cyan>)</font>+<a name="line-11"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>intersperse<font color=Cyan>,</font>nub<font color=Cyan>,</font><font color=Cyan>(</font><font color=Cyan>\\</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-12"></a><font color=Green><u>import</u></font> Char <font color=Cyan>(</font>isSpace<font color=Cyan>)</font>+<a name="line-13"></a>+<a name="line-14"></a><font color=Magenta><em>#if __GLASGOW_HASKELL__ >= 604 || __NHC__ >= 118 || defined(__HUGS__)</em></font>+<a name="line-15"></a><font color=Blue>-- emulate older finite map interface using Data.Map, if it is available</font>+<a name="line-16"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Data<font color=Cyan>.</font>Map <font color=Green><u>as</u></font> Map+<a name="line-17"></a><a name="FiniteMap"></a><font color=Green><u>type</u></font> FiniteMap a b <font color=Red>=</font> Map<font color=Cyan>.</font>Map a b+<a name="line-18"></a><a name="listToFM"></a><font color=Blue>listToFM</font> <font color=Red>::</font> Ord a <font color=Red>=></font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> FiniteMap a b+<a name="line-19"></a><font color=Blue>listToFM</font> <font color=Red>=</font> Map<font color=Cyan>.</font>fromList+<a name="line-20"></a><a name="lookupFM"></a><font color=Blue>lookupFM</font> <font color=Red>::</font> Ord a <font color=Red>=></font> FiniteMap a b <font color=Red>-></font> a <font color=Red>-></font> Maybe b+<a name="line-21"></a><font color=Blue>lookupFM</font> <font color=Red>=</font> flip Map<font color=Cyan>.</font>lookup+<a name="line-22"></a><font color=Magenta><em>#elif __GLASGOW_HASKELL__ >= 504 || __NHC__ > 114</em></font>+<a name="line-23"></a><font color=Blue>-- real finite map, if it is available</font>+<a name="line-24"></a><font color=Green><u>import</u></font> Data<font color=Cyan>.</font>FiniteMap+<a name="line-25"></a><font color=Magenta><em>#else</em></font>+<a name="line-26"></a><a name="FiniteMap"></a><font color=Blue>-- otherwise, a very simple and inefficient implementation of a finite map</font>+<a name="line-27"></a><a name="FiniteMap"></a><font color=Green><u>type</u></font> FiniteMap a b <font color=Red>=</font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font><font color=Red>]</font>+<a name="line-28"></a><font color=Blue>listToFM</font> <font color=Red>::</font> Eq a <font color=Red>=></font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-></font> FiniteMap a b+<a name="line-29"></a><font color=Blue>listToFM</font> <font color=Red>=</font> id+<a name="line-30"></a><font color=Blue>lookupFM</font> <font color=Red>::</font> Eq a <font color=Red>=></font> FiniteMap a b <font color=Red>-></font> a <font color=Red>-></font> Maybe b+<a name="line-31"></a><font color=Blue>lookupFM</font> fm k <font color=Red>=</font> lookup k fm+<a name="line-32"></a><font color=Magenta><em>#endif</em></font>+<a name="line-33"></a>+<a name="line-34"></a><a name="SimpleDTD"></a><font color=Blue>-- gather appropriate information out of the DTD</font>+<a name="line-35"></a><a name="SimpleDTD"></a><font color=Green><u>data</u></font> SimpleDTD <font color=Red>=</font> SimpleDTD+<a name="line-36"></a> <font color=Cyan>{</font> elements <font color=Red>::</font> FiniteMap Name ContentSpec <font color=Blue>-- content model of elem</font>+<a name="line-37"></a> <font color=Cyan>,</font> attributes <font color=Red>::</font> FiniteMap <font color=Cyan>(</font>Name<font color=Cyan>,</font>Name<font color=Cyan>)</font> AttType <font color=Blue>-- type of (elem,attr)</font>+<a name="line-38"></a> <font color=Cyan>,</font> required <font color=Red>::</font> FiniteMap Name <font color=Red>[</font>Name<font color=Red>]</font> <font color=Blue>-- required attributes of elem</font>+<a name="line-39"></a> <font color=Cyan>,</font> ids <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font>Name<font color=Cyan>)</font><font color=Red>]</font> <font color=Blue>-- all (element,attr) with ID type</font>+<a name="line-40"></a> <font color=Cyan>,</font> idrefs <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>Name<font color=Cyan>,</font>Name<font color=Cyan>)</font><font color=Red>]</font> <font color=Blue>-- all (element,attr) with IDREF type</font>+<a name="line-41"></a> <font color=Cyan>}</font>+<a name="line-42"></a>+<a name="line-43"></a><a name="simplifyDTD"></a><font color=Blue>simplifyDTD</font> <font color=Red>::</font> DocTypeDecl <font color=Red>-></font> SimpleDTD+<a name="line-44"></a><font color=Blue>simplifyDTD</font> <font color=Cyan>(</font>DTD <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> decls<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-45"></a> SimpleDTD+<a name="line-46"></a> <font color=Cyan>{</font> elements <font color=Red>=</font> listToFM <font color=Red>[</font> <font color=Cyan>(</font>name<font color=Cyan>,</font>content<font color=Cyan>)</font>+<a name="line-47"></a> <font color=Red>|</font> Element <font color=Cyan>(</font>ElementDecl name content<font color=Cyan>)</font> <font color=Red><-</font> decls <font color=Red>]</font>+<a name="line-48"></a> <font color=Cyan>,</font> attributes <font color=Red>=</font> listToFM <font color=Red>[</font> <font color=Cyan>(</font><font color=Cyan>(</font>elem<font color=Cyan>,</font>attr<font color=Cyan>)</font><font color=Cyan>,</font>typ<font color=Cyan>)</font>+<a name="line-49"></a> <font color=Red>|</font> AttList <font color=Cyan>(</font>AttListDecl elem attdefs<font color=Cyan>)</font> <font color=Red><-</font> decls+<a name="line-50"></a> <font color=Cyan>,</font> AttDef attr typ <font color=Green><u>_</u></font> <font color=Red><-</font> attdefs <font color=Red>]</font>+<a name="line-51"></a> <font color=Cyan>,</font> required <font color=Red>=</font> listToFM <font color=Red>[</font> <font color=Cyan>(</font>elem<font color=Cyan>,</font> <font color=Red>[</font> attr+<a name="line-52"></a> <font color=Red>|</font> AttDef attr <font color=Green><u>_</u></font> REQUIRED <font color=Red><-</font> attdefs <font color=Red>]</font><font color=Cyan>)</font>+<a name="line-53"></a> <font color=Red>|</font> AttList <font color=Cyan>(</font>AttListDecl elem attdefs<font color=Cyan>)</font> <font color=Red><-</font> decls <font color=Red>]</font>+<a name="line-54"></a> <font color=Cyan>,</font> ids <font color=Red>=</font> <font color=Red>[</font> <font color=Cyan>(</font>elem<font color=Cyan>,</font>attr<font color=Cyan>)</font>+<a name="line-55"></a> <font color=Red>|</font> Element <font color=Cyan>(</font>ElementDecl elem <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red><-</font> decls+<a name="line-56"></a> <font color=Cyan>,</font> AttList <font color=Cyan>(</font>AttListDecl name attdefs<font color=Cyan>)</font> <font color=Red><-</font> decls+<a name="line-57"></a> <font color=Cyan>,</font> elem <font color=Cyan>==</font> name+<a name="line-58"></a> <font color=Cyan>,</font> AttDef attr <font color=Cyan>(</font>TokenizedType ID<font color=Cyan>)</font> <font color=Green><u>_</u></font> <font color=Red><-</font> attdefs <font color=Red>]</font>+<a name="line-59"></a> <font color=Cyan>,</font> idrefs <font color=Red>=</font> [] <font color=Blue>-- not implemented</font>+<a name="line-60"></a> <font color=Cyan>}</font>+<a name="line-61"></a>+<a name="line-62"></a><a name="gives"></a><font color=Blue>-- simple auxiliary to avoid lots of if-then-else with empty else clauses.</font>+<a name="line-63"></a><font color=Blue>gives</font> <font color=Red>::</font> Bool <font color=Red>-></font> a <font color=Red>-></font> <font color=Red>[</font>a<font color=Red>]</font>+<a name="line-64"></a>True <font color=Cyan>`gives`</font> x <font color=Red>=</font> <font color=Red>[</font>x<font color=Red>]</font>+<a name="line-65"></a>False <font color=Cyan>`gives`</font> <font color=Green><u>_</u></font> <font color=Red>=</font> []+<a name="line-66"></a>+<a name="line-67"></a><a name="validate"></a><font color=Blue>-- | 'validate' takes a DTD and a tagged element, and returns a list of</font>+<a name="line-68"></a><font color=Blue>-- errors in the document with respect to its DTD.</font>+<a name="line-69"></a><font color=Blue>--</font>+<a name="line-70"></a><font color=Blue>-- If you have several documents to validate against a single DTD,</font>+<a name="line-71"></a><font color=Blue>-- then you will gain efficiency by freezing-in the DTD through partial</font>+<a name="line-72"></a><font color=Blue>-- application, e.g. @checkMyDTD = validate myDTD@.</font>+<a name="line-73"></a><font color=Blue>validate</font> <font color=Red>::</font> DocTypeDecl <font color=Red>-></font> Element i <font color=Red>-></font> <font color=Red>[</font>String<font color=Red>]</font>+<a name="line-74"></a><font color=Blue>validate</font> dtd' elem <font color=Red>=</font> root dtd' elem <font color=Cyan>++</font> partialValidate dtd' elem+<a name="line-75"></a> <font color=Green><u>where</u></font>+<a name="line-76"></a> root <font color=Cyan>(</font>DTD name <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>(</font>Elem name' <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-77"></a> <font color=Cyan>(</font>name<font color=Cyan>/=</font>name'<font color=Cyan>)</font> <font color=Cyan>`gives`</font> <font color=Cyan>(</font><font color=Magenta>"Document type should be <"</font><font color=Cyan>++</font>name+<a name="line-78"></a> <font color=Cyan>++</font><font color=Magenta>"> but appears to be <"</font><font color=Cyan>++</font>name'<font color=Cyan>++</font><font color=Magenta>">."</font><font color=Cyan>)</font>+<a name="line-79"></a>+<a name="line-80"></a><a name="partialValidate"></a><font color=Blue>-- | 'partialValidate' is like validate, except that it does not check that</font>+<a name="line-81"></a><font color=Blue>-- the element type matches that of the DTD's root element.</font>+<a name="line-82"></a><font color=Blue>partialValidate</font> <font color=Red>::</font> DocTypeDecl <font color=Red>-></font> Element i <font color=Red>-></font> <font color=Red>[</font>String<font color=Red>]</font>+<a name="line-83"></a><font color=Blue>partialValidate</font> dtd' elem <font color=Red>=</font> valid elem <font color=Cyan>++</font> checkIDs elem+<a name="line-84"></a> <font color=Green><u>where</u></font>+<a name="line-85"></a> dtd <font color=Red>=</font> simplifyDTD dtd'+<a name="line-86"></a>+<a name="line-87"></a> valid <font color=Cyan>(</font>Elem name attrs contents<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-88"></a> <font color=Blue>-- is the element defined in the DTD?</font>+<a name="line-89"></a> <font color=Green><u>let</u></font> spec <font color=Red>=</font> lookupFM <font color=Cyan>(</font>elements dtd<font color=Cyan>)</font> name <font color=Green><u>in</u></font> +<a name="line-90"></a> <font color=Cyan>(</font>isNothing spec<font color=Cyan>)</font> <font color=Cyan>`gives`</font> <font color=Cyan>(</font><font color=Magenta>"Element <"</font><font color=Cyan>++</font>name<font color=Cyan>++</font><font color=Magenta>"> not known."</font><font color=Cyan>)</font>+<a name="line-91"></a> <font color=Blue>-- is each attribute mentioned only once?</font>+<a name="line-92"></a> <font color=Cyan>++</font> <font color=Cyan>(</font><font color=Green><u>let</u></font> dups <font color=Red>=</font> duplicates <font color=Cyan>(</font>map fst attrs<font color=Cyan>)</font> <font color=Green><u>in</u></font>+<a name="line-93"></a> not <font color=Cyan>(</font>null dups<font color=Cyan>)</font> <font color=Cyan>`gives`</font>+<a name="line-94"></a> <font color=Cyan>(</font><font color=Magenta>"Element <"</font><font color=Cyan>++</font>name<font color=Cyan>++</font><font color=Magenta>"> has duplicate attributes: "</font>+<a name="line-95"></a> <font color=Cyan>++</font>concat <font color=Cyan>(</font>intersperse <font color=Magenta>","</font> dups<font color=Cyan>)</font><font color=Cyan>++</font><font color=Magenta>"."</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-96"></a> <font color=Blue>-- does each attribute belong to this element? value is in range?</font>+<a name="line-97"></a> <font color=Cyan>++</font> concatMap <font color=Cyan>(</font>checkAttr name<font color=Cyan>)</font> attrs+<a name="line-98"></a> <font color=Blue>-- are all required attributes present?</font>+<a name="line-99"></a> <font color=Cyan>++</font> concatMap <font color=Cyan>(</font>checkRequired name attrs<font color=Cyan>)</font>+<a name="line-100"></a> <font color=Cyan>(</font>fromMaybe [] <font color=Cyan>(</font>lookupFM <font color=Cyan>(</font>required dtd<font color=Cyan>)</font> name<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-101"></a> <font color=Blue>-- are its children in a permissible sequence?</font>+<a name="line-102"></a> <font color=Cyan>++</font> checkContentSpec name <font color=Cyan>(</font>fromMaybe ANY spec<font color=Cyan>)</font> contents+<a name="line-103"></a> <font color=Blue>-- now recursively check the element children</font>+<a name="line-104"></a> <font color=Cyan>++</font> concatMap valid <font color=Red>[</font> elem <font color=Red>|</font> CElem elem <font color=Green><u>_</u></font> <font color=Red><-</font> contents <font color=Red>]</font>+<a name="line-105"></a>+<a name="line-106"></a> checkAttr elem <font color=Cyan>(</font>attr<font color=Cyan>,</font> val<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-107"></a> <font color=Green><u>let</u></font> typ <font color=Red>=</font> lookupFM <font color=Cyan>(</font>attributes dtd<font color=Cyan>)</font> <font color=Cyan>(</font>elem<font color=Cyan>,</font>attr<font color=Cyan>)</font>+<a name="line-108"></a> attval <font color=Red>=</font> attr2str val <font color=Green><u>in</u></font>+<a name="line-109"></a> <font color=Green><u>if</u></font> isNothing typ <font color=Green><u>then</u></font> <font color=Red>[</font><font color=Magenta>"Attribute \""</font><font color=Cyan>++</font>attr+<a name="line-110"></a> <font color=Cyan>++</font><font color=Magenta>"\" not known for element <"</font><font color=Cyan>++</font>elem<font color=Cyan>++</font><font color=Magenta>">."</font><font color=Red>]</font>+<a name="line-111"></a> <font color=Green><u>else</u></font>+<a name="line-112"></a> <font color=Green><u>case</u></font> fromJust typ <font color=Green><u>of</u></font>+<a name="line-113"></a> EnumeratedType e <font color=Red>-></font>+<a name="line-114"></a> <font color=Green><u>case</u></font> e <font color=Green><u>of</u></font>+<a name="line-115"></a> Enumeration es <font color=Red>-></font>+<a name="line-116"></a> <font color=Cyan>(</font>not <font color=Cyan>(</font>attval <font color=Cyan>`</font>Prelude<font color=Cyan>.</font>elem<font color=Cyan>`</font> es<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>`gives`</font>+<a name="line-117"></a> <font color=Cyan>(</font><font color=Magenta>"Value \""</font><font color=Cyan>++</font>attval<font color=Cyan>++</font><font color=Magenta>"\" of attribute \""</font>+<a name="line-118"></a> <font color=Cyan>++</font>attr<font color=Cyan>++</font><font color=Magenta>"\" in element <"</font><font color=Cyan>++</font>elem+<a name="line-119"></a> <font color=Cyan>++</font><font color=Magenta>"> is not in the required enumeration range: "</font>+<a name="line-120"></a> <font color=Cyan>++</font>unwords es<font color=Cyan>)</font>+<a name="line-121"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> []+<a name="line-122"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> []+<a name="line-123"></a>+<a name="line-124"></a> checkRequired elem attrs req <font color=Red>=</font>+<a name="line-125"></a> <font color=Cyan>(</font>not <font color=Cyan>(</font>req <font color=Cyan>`</font>Prelude<font color=Cyan>.</font>elem<font color=Cyan>`</font> map fst attrs<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>`gives`</font>+<a name="line-126"></a> <font color=Cyan>(</font><font color=Magenta>"Element <"</font><font color=Cyan>++</font>elem<font color=Cyan>++</font><font color=Magenta>"> requires the attribute \""</font><font color=Cyan>++</font>req+<a name="line-127"></a> <font color=Cyan>++</font><font color=Magenta>"\" but it is missing."</font><font color=Cyan>)</font>+<a name="line-128"></a>+<a name="line-129"></a> checkContentSpec elem ANY <font color=Green><u>_</u></font> <font color=Red>=</font> []+<a name="line-130"></a> checkContentSpec elem EMPTY [] <font color=Red>=</font> []+<a name="line-131"></a> checkContentSpec elem EMPTY <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-132"></a> <font color=Red>[</font><font color=Magenta>"Element <"</font><font color=Cyan>++</font>elem<font color=Cyan>++</font><font color=Magenta>"> is not empty but should be."</font><font color=Red>]</font>+<a name="line-133"></a> checkContentSpec elem <font color=Cyan>(</font>Mixed PCDATA<font color=Cyan>)</font> cs <font color=Red>=</font> concatMap <font color=Cyan>(</font>checkMixed elem []<font color=Cyan>)</font> cs+<a name="line-134"></a> checkContentSpec elem <font color=Cyan>(</font>Mixed <font color=Cyan>(</font>PCDATAplus names<font color=Cyan>)</font><font color=Cyan>)</font> cs <font color=Red>=</font>+<a name="line-135"></a> concatMap <font color=Cyan>(</font>checkMixed elem names<font color=Cyan>)</font> cs+<a name="line-136"></a> checkContentSpec elem <font color=Cyan>(</font>ContentSpec cp<font color=Cyan>)</font> cs <font color=Red>=</font> excludeText elem cs <font color=Cyan>++</font>+<a name="line-137"></a> <font color=Cyan>(</font><font color=Green><u>let</u></font> <font color=Cyan>(</font>errs<font color=Cyan>,</font>rest<font color=Cyan>)</font> <font color=Red>=</font> checkCP elem cp <font color=Cyan>(</font>flatten cs<font color=Cyan>)</font> <font color=Green><u>in</u></font>+<a name="line-138"></a> <font color=Green><u>case</u></font> rest <font color=Green><u>of</u></font> [] <font color=Red>-></font> errs+<a name="line-139"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> errs<font color=Cyan>++</font><font color=Red>[</font><font color=Magenta>"Element <"</font><font color=Cyan>++</font>elem<font color=Cyan>++</font><font color=Magenta>"> contains extra "</font>+<a name="line-140"></a> <font color=Cyan>++</font><font color=Magenta>"elements beyond its content spec."</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-141"></a>+<a name="line-142"></a> checkMixed elem permitted <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem name <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font>+<a name="line-143"></a> <font color=Red>|</font> not <font color=Cyan>(</font>name <font color=Cyan>`</font>Prelude<font color=Cyan>.</font>elem<font color=Cyan>`</font> permitted<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-144"></a> <font color=Red>[</font><font color=Magenta>"Element <"</font><font color=Cyan>++</font>elem<font color=Cyan>++</font><font color=Magenta>"> contains an element <"</font><font color=Cyan>++</font>name+<a name="line-145"></a> <font color=Cyan>++</font><font color=Magenta>"> but should not."</font><font color=Red>]</font>+<a name="line-146"></a> checkMixed elem permitted <font color=Green><u>_</u></font> <font color=Red>=</font> []+<a name="line-147"></a>+<a name="line-148"></a> flatten <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem name <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Red><b>:</b></font> cs<font color=Cyan>)</font> <font color=Red>=</font> name<font color=Red><b>:</b></font> flatten cs+<a name="line-149"></a> flatten <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font> cs<font color=Cyan>)</font> <font color=Red>=</font> flatten cs+<a name="line-150"></a> flatten [] <font color=Red>=</font> []+<a name="line-151"></a>+<a name="line-152"></a> excludeText elem <font color=Cyan>(</font>CElem <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Red><b>:</b></font> cs<font color=Cyan>)</font> <font color=Red>=</font> excludeText elem cs+<a name="line-153"></a> excludeText elem <font color=Cyan>(</font>CMisc <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Red><b>:</b></font> cs<font color=Cyan>)</font> <font color=Red>=</font> excludeText elem cs+<a name="line-154"></a> excludeText elem <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Red><b>:</b></font> cs<font color=Cyan>)</font> <font color=Red>|</font> all isSpace s <font color=Red>=</font> excludeText elem cs+<a name="line-155"></a> excludeText elem <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font> cs<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-156"></a> <font color=Red>[</font><font color=Magenta>"Element <"</font><font color=Cyan>++</font>elem<font color=Cyan>++</font><font color=Magenta>"> contains text/references but should not."</font><font color=Red>]</font>+<a name="line-157"></a> excludeText elem [] <font color=Red>=</font> []+<a name="line-158"></a>+<a name="line-159"></a> <font color=Blue>-- This is a little parser really. Returns any errors, plus the remainder</font>+<a name="line-160"></a> <font color=Blue>-- of the input string.</font>+<a name="line-161"></a> checkCP <font color=Red>::</font> Name <font color=Red>-></font> CP <font color=Red>-></font> <font color=Red>[</font>Name<font color=Red>]</font> <font color=Red>-></font> <font color=Cyan>(</font><font color=Red>[</font>String<font color=Red>]</font><font color=Cyan>,</font><font color=Red>[</font>Name<font color=Red>]</font><font color=Cyan>)</font>+<a name="line-162"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>TagName n None<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>,</font> []<font color=Cyan>)</font>+<a name="line-163"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>TagName n None<font color=Cyan>)</font> <font color=Cyan>(</font>n'<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>+<a name="line-164"></a> <font color=Red>|</font> n<font color=Cyan>==</font>n' <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font> ns<font color=Cyan>)</font>+<a name="line-165"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>,</font> n'<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>+<a name="line-166"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>TagName n Query<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>[]<font color=Cyan>)</font>+<a name="line-167"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>TagName n Query<font color=Cyan>)</font> <font color=Cyan>(</font>n'<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>+<a name="line-168"></a> <font color=Red>|</font> n<font color=Cyan>==</font>n' <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font> ns<font color=Cyan>)</font>+<a name="line-169"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font> n'<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>+<a name="line-170"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>TagName n Star<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>[]<font color=Cyan>)</font>+<a name="line-171"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>TagName n Star<font color=Cyan>)</font> <font color=Cyan>(</font>n'<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>+<a name="line-172"></a> <font color=Red>|</font> n<font color=Cyan>==</font>n' <font color=Red>=</font> checkCP elem <font color=Cyan>(</font>TagName n Star<font color=Cyan>)</font> ns+<a name="line-173"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font> n'<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>+<a name="line-174"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>TagName n Plus<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>,</font> []<font color=Cyan>)</font>+<a name="line-175"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>TagName n Plus<font color=Cyan>)</font> <font color=Cyan>(</font>n'<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>+<a name="line-176"></a> <font color=Red>|</font> n<font color=Cyan>==</font>n' <font color=Red>=</font> checkCP elem <font color=Cyan>(</font>TagName n Star<font color=Cyan>)</font> ns+<a name="line-177"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>,</font> n'<font color=Red><b>:</b></font>ns<font color=Cyan>)</font>+<a name="line-178"></a> <font color=Blue>-- omit this clause, to permit (a?|b?) as a valid but empty choice</font>+<a name="line-179"></a> <font color=Blue>-- checkCP elem cp@(Choice cps None) [] = (cpError elem cp, [])</font>+<a name="line-180"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Choice cps None<font color=Cyan>)</font> ns <font color=Red>=</font>+<a name="line-181"></a> <font color=Green><u>let</u></font> next <font color=Red>=</font> choice elem ns cps <font color=Green><u>in</u></font>+<a name="line-182"></a> <font color=Green><u>if</u></font> null next <font color=Green><u>then</u></font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>,</font> ns<font color=Cyan>)</font>+<a name="line-183"></a> <font color=Green><u>else</u></font> <font color=Cyan>(</font>[]<font color=Cyan>,</font> head next<font color=Cyan>)</font> <font color=Blue>-- choose the first alternative with no errors</font>+<a name="line-184"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Choice cps Query<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>[]<font color=Cyan>)</font>+<a name="line-185"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Choice cps Query<font color=Cyan>)</font> ns <font color=Red>=</font>+<a name="line-186"></a> <font color=Green><u>let</u></font> next <font color=Red>=</font> choice elem ns cps <font color=Green><u>in</u></font>+<a name="line-187"></a> <font color=Green><u>if</u></font> null next <font color=Green><u>then</u></font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>ns<font color=Cyan>)</font>+<a name="line-188"></a> <font color=Green><u>else</u></font> <font color=Cyan>(</font>[]<font color=Cyan>,</font> head next<font color=Cyan>)</font>+<a name="line-189"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Choice cps Star<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>[]<font color=Cyan>)</font>+<a name="line-190"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Choice cps Star<font color=Cyan>)</font> ns <font color=Red>=</font>+<a name="line-191"></a> <font color=Green><u>let</u></font> next <font color=Red>=</font> choice elem ns cps <font color=Green><u>in</u></font>+<a name="line-192"></a> <font color=Green><u>if</u></font> null next <font color=Green><u>then</u></font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>ns<font color=Cyan>)</font>+<a name="line-193"></a> <font color=Green><u>else</u></font> checkCP elem <font color=Cyan>(</font>Choice cps Star<font color=Cyan>)</font> <font color=Cyan>(</font>head next<font color=Cyan>)</font>+<a name="line-194"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Choice cps Plus<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>,</font> []<font color=Cyan>)</font>+<a name="line-195"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Choice cps Plus<font color=Cyan>)</font> ns <font color=Red>=</font>+<a name="line-196"></a> <font color=Green><u>let</u></font> next <font color=Red>=</font> choice elem ns cps <font color=Green><u>in</u></font>+<a name="line-197"></a> <font color=Green><u>if</u></font> null next <font color=Green><u>then</u></font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>,</font> ns<font color=Cyan>)</font>+<a name="line-198"></a> <font color=Green><u>else</u></font> checkCP elem <font color=Cyan>(</font>Choice cps Star<font color=Cyan>)</font> <font color=Cyan>(</font>head next<font color=Cyan>)</font>+<a name="line-199"></a> <font color=Blue>-- omit this clause, to permit (a?,b?) as a valid but empty sequence</font>+<a name="line-200"></a> <font color=Blue>-- checkCP elem cp@(Seq cps None) [] = (cpError elem cp, [])</font>+<a name="line-201"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Seq cps None<font color=Cyan>)</font> ns <font color=Red>=</font>+<a name="line-202"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>errs<font color=Cyan>,</font>next<font color=Cyan>)</font> <font color=Red>=</font> sequence elem ns cps <font color=Green><u>in</u></font>+<a name="line-203"></a> <font color=Green><u>if</u></font> null errs <font color=Green><u>then</u></font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>next<font color=Cyan>)</font>+<a name="line-204"></a> <font color=Green><u>else</u></font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>++</font>errs<font color=Cyan>,</font> ns<font color=Cyan>)</font>+<a name="line-205"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Seq cps Query<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>[]<font color=Cyan>)</font>+<a name="line-206"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Seq cps Query<font color=Cyan>)</font> ns <font color=Red>=</font>+<a name="line-207"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>errs<font color=Cyan>,</font>next<font color=Cyan>)</font> <font color=Red>=</font> sequence elem ns cps <font color=Green><u>in</u></font>+<a name="line-208"></a> <font color=Green><u>if</u></font> null errs <font color=Green><u>then</u></font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>next<font color=Cyan>)</font>+<a name="line-209"></a> <font color=Green><u>else</u></font> <font color=Cyan>(</font>[]<font color=Cyan>,</font> ns<font color=Cyan>)</font>+<a name="line-210"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Seq cps Star<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>[]<font color=Cyan>)</font>+<a name="line-211"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Seq cps Star<font color=Cyan>)</font> ns <font color=Red>=</font>+<a name="line-212"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>errs<font color=Cyan>,</font>next<font color=Cyan>)</font> <font color=Red>=</font> sequence elem ns cps <font color=Green><u>in</u></font>+<a name="line-213"></a> <font color=Green><u>if</u></font> null errs <font color=Green><u>then</u></font> checkCP elem <font color=Cyan>(</font>Seq cps Star<font color=Cyan>)</font> next+<a name="line-214"></a> <font color=Green><u>else</u></font> <font color=Cyan>(</font>[]<font color=Cyan>,</font> ns<font color=Cyan>)</font>+<a name="line-215"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Seq cps Plus<font color=Cyan>)</font> [] <font color=Red>=</font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>,</font> []<font color=Cyan>)</font>+<a name="line-216"></a> checkCP elem cp<font color=Red>@</font><font color=Cyan>(</font>Seq cps Plus<font color=Cyan>)</font> ns <font color=Red>=</font>+<a name="line-217"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>errs<font color=Cyan>,</font>next<font color=Cyan>)</font> <font color=Red>=</font> sequence elem ns cps <font color=Green><u>in</u></font>+<a name="line-218"></a> <font color=Green><u>if</u></font> null errs <font color=Green><u>then</u></font> checkCP elem <font color=Cyan>(</font>Seq cps Star<font color=Cyan>)</font> next+<a name="line-219"></a> <font color=Green><u>else</u></font> <font color=Cyan>(</font>cpError elem cp<font color=Cyan>++</font>errs<font color=Cyan>,</font> ns<font color=Cyan>)</font>+<a name="line-220"></a>+<a name="line-221"></a> choice elem ns cps <font color=Red>=</font> <font color=Blue>-- return only those parses that don't give any errors</font>+<a name="line-222"></a> <font color=Red>[</font> rem <font color=Red>|</font> <font color=Cyan>(</font>[]<font color=Cyan>,</font>rem<font color=Cyan>)</font> <font color=Red><-</font> map <font color=Cyan>(</font><font color=Red>\</font>cp<font color=Red>-></font> checkCP elem <font color=Cyan>(</font>definite cp<font color=Cyan>)</font> ns<font color=Cyan>)</font> cps <font color=Red>]</font>+<a name="line-223"></a> <font color=Cyan>++</font> <font color=Red>[</font> ns <font color=Red>|</font> all possEmpty cps <font color=Red>]</font>+<a name="line-224"></a> <font color=Green><u>where</u></font> definite <font color=Cyan>(</font>TagName n Query<font color=Cyan>)</font> <font color=Red>=</font> TagName n None+<a name="line-225"></a> definite <font color=Cyan>(</font>Choice cps Query<font color=Cyan>)</font> <font color=Red>=</font> Choice cps None+<a name="line-226"></a> definite <font color=Cyan>(</font>Seq cps Query<font color=Cyan>)</font> <font color=Red>=</font> Seq cps None+<a name="line-227"></a> definite <font color=Cyan>(</font>TagName n Star<font color=Cyan>)</font> <font color=Red>=</font> TagName n Plus+<a name="line-228"></a> definite <font color=Cyan>(</font>Choice cps Star<font color=Cyan>)</font> <font color=Red>=</font> Choice cps Plus+<a name="line-229"></a> definite <font color=Cyan>(</font>Seq cps Star<font color=Cyan>)</font> <font color=Red>=</font> Seq cps Plus+<a name="line-230"></a> definite x <font color=Red>=</font> x+<a name="line-231"></a> possEmpty <font color=Cyan>(</font>TagName <font color=Green><u>_</u></font> mod<font color=Cyan>)</font> <font color=Red>=</font> mod <font color=Cyan>`</font>Prelude<font color=Cyan>.</font>elem<font color=Cyan>`</font> <font color=Red>[</font>Query<font color=Cyan>,</font>Star<font color=Red>]</font>+<a name="line-232"></a> possEmpty <font color=Cyan>(</font>Choice cps None<font color=Cyan>)</font> <font color=Red>=</font> all possEmpty cps+<a name="line-233"></a> possEmpty <font color=Cyan>(</font>Choice <font color=Green><u>_</u></font> mod<font color=Cyan>)</font> <font color=Red>=</font> mod <font color=Cyan>`</font>Prelude<font color=Cyan>.</font>elem<font color=Cyan>`</font> <font color=Red>[</font>Query<font color=Cyan>,</font>Star<font color=Red>]</font>+<a name="line-234"></a> possEmpty <font color=Cyan>(</font>Seq cps None<font color=Cyan>)</font> <font color=Red>=</font> all possEmpty cps+<a name="line-235"></a> possEmpty <font color=Cyan>(</font>Seq <font color=Green><u>_</u></font> mod<font color=Cyan>)</font> <font color=Red>=</font> mod <font color=Cyan>`</font>Prelude<font color=Cyan>.</font>elem<font color=Cyan>`</font> <font color=Red>[</font>Query<font color=Cyan>,</font>Star<font color=Red>]</font>+<a name="line-236"></a> sequence elem ns cps <font color=Red>=</font> <font color=Blue>-- accumulate errors down the sequence</font>+<a name="line-237"></a> foldl <font color=Cyan>(</font><font color=Red>\</font><font color=Cyan>(</font>es<font color=Cyan>,</font>ns<font color=Cyan>)</font> cp<font color=Red>-></font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>es'<font color=Cyan>,</font>ns'<font color=Cyan>)</font> <font color=Red>=</font> checkCP elem cp ns+<a name="line-238"></a> <font color=Green><u>in</u></font> <font color=Cyan>(</font>es<font color=Cyan>++</font>es'<font color=Cyan>,</font> ns'<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-239"></a> <font color=Cyan>(</font>[]<font color=Cyan>,</font>ns<font color=Cyan>)</font> cps+<a name="line-240"></a>+<a name="line-241"></a> checkIDs elem <font color=Red>=</font>+<a name="line-242"></a> <font color=Green><u>let</u></font> celem <font color=Red>=</font> CElem elem undefined+<a name="line-243"></a> showAttr a <font color=Red>=</font> iffind a literal none+<a name="line-244"></a> idElems <font color=Red>=</font> concatMap <font color=Cyan>(</font><font color=Red>\</font><font color=Cyan>(</font>name<font color=Cyan>,</font>at<font color=Cyan>)</font><font color=Red>-></font> multi <font color=Cyan>(</font>showAttr at <font color=Cyan>`o`</font> tag name<font color=Cyan>)</font>+<a name="line-245"></a> celem<font color=Cyan>)</font>+<a name="line-246"></a> <font color=Cyan>(</font>ids dtd<font color=Cyan>)</font>+<a name="line-247"></a> badIds <font color=Red>=</font> duplicates <font color=Cyan>(</font>map <font color=Cyan>(</font><font color=Red>\</font><font color=Cyan>(</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Red>-></font>s<font color=Cyan>)</font> idElems<font color=Cyan>)</font>+<a name="line-248"></a> <font color=Green><u>in</u></font> not <font color=Cyan>(</font>null badIds<font color=Cyan>)</font> <font color=Cyan>`gives`</font>+<a name="line-249"></a> <font color=Cyan>(</font><font color=Magenta>"These attribute values of type ID are not unique: "</font>+<a name="line-250"></a> <font color=Cyan>++</font>concat <font color=Cyan>(</font>intersperse <font color=Magenta>","</font> badIds<font color=Cyan>)</font><font color=Cyan>++</font><font color=Magenta>"."</font><font color=Cyan>)</font>+<a name="line-251"></a>+<a name="line-252"></a>+<a name="line-253"></a><a name="cpError"></a><font color=Blue>cpError</font> <font color=Red>::</font> Name <font color=Red>-></font> CP <font color=Red>-></font> <font color=Red>[</font>String<font color=Red>]</font>+<a name="line-254"></a><font color=Blue>cpError</font> elem cp <font color=Red>=</font>+<a name="line-255"></a> <font color=Red>[</font><font color=Magenta>"Element <"</font><font color=Cyan>++</font>elem<font color=Cyan>++</font><font color=Magenta>"> should contain "</font><font color=Cyan>++</font>display cp<font color=Cyan>++</font><font color=Magenta>" but does not."</font><font color=Red>]</font>+<a name="line-256"></a>+<a name="line-257"></a>+<a name="line-258"></a><a name="display"></a><font color=Blue>display</font> <font color=Red>::</font> CP <font color=Red>-></font> String+<a name="line-259"></a><font color=Blue>display</font> <font color=Cyan>(</font>TagName name mod<font color=Cyan>)</font> <font color=Red>=</font> name <font color=Cyan>++</font> modifier mod+<a name="line-260"></a><font color=Blue>display</font> <font color=Cyan>(</font>Choice cps mod<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"("</font> <font color=Cyan>++</font> concat <font color=Cyan>(</font>intersperse <font color=Magenta>"|"</font> <font color=Cyan>(</font>map display cps<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-261"></a> <font color=Cyan>++</font> <font color=Magenta>")"</font> <font color=Cyan>++</font> modifier mod+<a name="line-262"></a><font color=Blue>display</font> <font color=Cyan>(</font>Seq cps mod<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"("</font> <font color=Cyan>++</font> concat <font color=Cyan>(</font>intersperse <font color=Magenta>","</font> <font color=Cyan>(</font>map display cps<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-263"></a> <font color=Cyan>++</font> <font color=Magenta>")"</font> <font color=Cyan>++</font> modifier mod+<a name="line-264"></a>+<a name="line-265"></a><a name="modifier"></a><font color=Blue>modifier</font> <font color=Red>::</font> Modifier <font color=Red>-></font> String+<a name="line-266"></a><font color=Blue>modifier</font> None <font color=Red>=</font> <font color=Magenta>""</font>+<a name="line-267"></a><font color=Blue>modifier</font> Query <font color=Red>=</font> <font color=Magenta>"?"</font>+<a name="line-268"></a><font color=Blue>modifier</font> Star <font color=Red>=</font> <font color=Magenta>"*"</font>+<a name="line-269"></a><font color=Blue>modifier</font> Plus <font color=Red>=</font> <font color=Magenta>"+"</font>+<a name="line-270"></a>+<a name="line-271"></a><a name="duplicates"></a><font color=Blue>duplicates</font> <font color=Red>::</font> Eq a <font color=Red>=></font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>a<font color=Red>]</font>+<a name="line-272"></a><font color=Blue>duplicates</font> xs <font color=Red>=</font> xs <font color=Cyan>\\</font> <font color=Cyan>(</font>nub xs<font color=Cyan>)</font> </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/Verbatim.html view
@@ -1,95 +1,101 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>{- |-<a name="(line2)"></a> Maintainer : simons@cryp.to-<a name="(line3)"></a> Stability : experimental-<a name="(line4)"></a> Portability : portable-<a name="(line5)"></a>-<a name="(line6)"></a> The preferred method for rendering a 'Document' or single 'Content'-<a name="(line7)"></a> is by using the pretty printing facility defined in "Pretty".-<a name="(line8)"></a> Pretty-printing does not work well for cases, however, where the-<a name="(line9)"></a> formatting in the XML document is significant. Examples of this-<a name="(line10)"></a> case are XHTML's @\<pre\>@ tag, Docbook's @\<literallayout\>@ tag,-<a name="(line11)"></a> and many more.-<a name="(line12)"></a>-<a name="(line13)"></a> Theoretically, the document author could avoid this problem by-<a name="(line14)"></a> wrapping the contents of these tags in a \<![CDATA[...]]\> section,-<a name="(line15)"></a> but often this is not practical, for instance when the-<a name="(line16)"></a> literal-layout section contains other elements. Finally, program-<a name="(line17)"></a> writers could manually format these elements by transforming them-<a name="(line18)"></a> into a 'literal' string in their 'CFliter', etc., but this is-<a name="(line19)"></a> annoying to do and prone to omissions and formatting errors.-<a name="(line20)"></a>-<a name="(line21)"></a> As an alternative, this module provides the function 'verbatim',-<a name="(line22)"></a> which will format XML 'Content' as a 'String' while retaining the-<a name="(line23)"></a> formatting of the input document unchanged.-<a name="(line24)"></a>-<a name="(line25)"></a> /Know problems/:-<a name="(line26)"></a>-<a name="(line27)"></a> * HaXml's parser eats line feeds between two tags.-<a name="(line28)"></a>-<a name="(line29)"></a> * 'Attribute's should be formatted by making them an instance of-<a name="(line30)"></a> 'Verbatim' as well, but since an 'Attribute' is just a tuple,-<a name="(line31)"></a> not a full data type, the helper function 'verbAttr' must be-<a name="(line32)"></a> used instead.-<a name="(line33)"></a>-<a name="(line34)"></a> * 'CMisc' is not yet supported.-<a name="(line35)"></a>-<a name="(line36)"></a> * 'Element's, which contain no content, are formatted as-<a name="(line37)"></a> @\<element-name\/\>@, even if they were not defined as being of-<a name="(line38)"></a> type @EMPTY@. In XML this perfectly alright, but in SGML it is-<a name="(line39)"></a> not. Those, who wish to use 'verbatim' to format parts of say-<a name="(line40)"></a> an HTML page will have to (a) replace problematic elements by-<a name="(line41)"></a> 'literal's /before/ running 'verbatim' or (b) use a second-<a name="(line42)"></a> search-and-replace stage to fix this.-<a name="(line43)"></a> -}</font>-<a name="(line44)"></a>-<a name="(line45)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Verbatim <font color=Green><u>where</u></font>-<a name="(line46)"></a>-<a name="(line47)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line48)"></a>-<a name="(line49)"></a><font color=Blue>-- |This class promises that the function 'verbatim' knows how to</font>-<a name="(line50)"></a><font color=Blue>-- format this data type into a string without changing the</font>-<a name="(line51)"></a><font color=Blue>-- formatting.</font>-<a name="(line52)"></a>-<a name="(line53)"></a><a name="Verbatim"></a><font color=Green><u>class</u></font> Verbatim a <font color=Green><u>where</u></font>-<a name="(line54)"></a> verbatim <font color=Red>::</font> a <font color=Red>-></font> String-<a name="(line55)"></a>-<a name="(line56)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>Verbatim a<font color=Cyan>)</font> <font color=Red>=></font> Verbatim <font color=Red>[</font>a<font color=Red>]</font> <font color=Green><u>where</u></font>-<a name="(line57)"></a> verbatim <font color=Red>=</font> concat <font color=Cyan>.</font> <font color=Cyan>(</font>map verbatim<font color=Cyan>)</font>-<a name="(line58)"></a>-<a name="(line59)"></a><font color=Green><u>instance</u></font> Verbatim Char <font color=Green><u>where</u></font>-<a name="(line60)"></a> verbatim c <font color=Red>=</font> <font color=Red>[</font>c<font color=Red>]</font>-<a name="(line61)"></a>-<a name="(line62)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>Verbatim a<font color=Cyan>,</font> Verbatim b<font color=Cyan>)</font> <font color=Red>=></font> Verbatim <font color=Cyan>(</font>Either a b<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line63)"></a> verbatim <font color=Cyan>(</font>Left v<font color=Cyan>)</font> <font color=Red>=</font> verbatim v-<a name="(line64)"></a> verbatim <font color=Cyan>(</font>Right v<font color=Cyan>)</font> <font color=Red>=</font> verbatim v-<a name="(line65)"></a>-<a name="(line66)"></a><font color=Green><u>instance</u></font> Verbatim <font color=Cyan>(</font>Content i<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line67)"></a> verbatim <font color=Cyan>(</font>CElem c <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> verbatim c-<a name="(line68)"></a> verbatim <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> c <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> c-<a name="(line69)"></a> verbatim <font color=Cyan>(</font>CRef c <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> verbatim c-<a name="(line70)"></a> verbatim <font color=Cyan>(</font>CMisc <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> error <font color=Magenta>"NYI: verbatim not defined for CMisc"</font>-<a name="(line71)"></a>-<a name="(line72)"></a><font color=Green><u>instance</u></font> Verbatim <font color=Cyan>(</font>Element i<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line73)"></a> verbatim <font color=Cyan>(</font>Elem nam att []<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"<"</font> <font color=Cyan>++</font> nam <font color=Cyan>++</font> <font color=Cyan>(</font>concat <font color=Cyan>.</font> <font color=Cyan>(</font>map verbAttr<font color=Cyan>)</font><font color=Cyan>)</font> att-<a name="(line74)"></a> <font color=Cyan>++</font> <font color=Magenta>"/>"</font>-<a name="(line75)"></a> verbatim <font color=Cyan>(</font>Elem nam att cont<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"<"</font> <font color=Cyan>++</font> nam <font color=Cyan>++</font> <font color=Cyan>(</font>concat <font color=Cyan>.</font> <font color=Cyan>(</font>map verbAttr<font color=Cyan>)</font><font color=Cyan>)</font> att-<a name="(line76)"></a> <font color=Cyan>++</font> <font color=Magenta>">"</font> <font color=Cyan>++</font> verbatim cont <font color=Cyan>++</font> <font color=Magenta>"</"</font> <font color=Cyan>++</font> nam <font color=Cyan>++</font> <font color=Magenta>">"</font>-<a name="(line77)"></a>-<a name="(line78)"></a><font color=Green><u>instance</u></font> Verbatim Reference <font color=Green><u>where</u></font>-<a name="(line79)"></a> verbatim <font color=Cyan>(</font>RefEntity r<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"&"</font> <font color=Cyan>++</font> verbatim r <font color=Cyan>++</font> <font color=Magenta>";"</font>-<a name="(line80)"></a> verbatim <font color=Cyan>(</font>RefChar c<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"&#"</font> <font color=Cyan>++</font> show c <font color=Cyan>++</font> <font color=Magenta>";"</font>-<a name="(line81)"></a>-<a name="(line82)"></a>-<a name="(line83)"></a><font color=Blue>-- |This is a helper function is required because Haskell does not</font>-<a name="(line84)"></a><font color=Blue>-- allow to make an ordinary tuple (like 'Attribute') an instance of a</font>-<a name="(line85)"></a><font color=Blue>-- class. The resulting output will preface the actual attribute with</font>-<a name="(line86)"></a><font color=Blue>-- a single blank so that lists of 'Attribute's can be handled</font>-<a name="(line87)"></a><font color=Blue>-- implicitly by the definition for lists of 'Verbatim' data types.</font>-<a name="(line88)"></a>-<a name="(line89)"></a><a name="verbAttr"></a>verbAttr <font color=Red>::</font> Attribute <font color=Red>-></font> String-<a name="(line90)"></a>verbAttr <font color=Cyan>(</font>n<font color=Cyan>,</font> AttValue v<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>" "</font> <font color=Cyan>++</font> n <font color=Cyan>++</font> <font color=Magenta>"=\""</font> <font color=Cyan>++</font> verbatim v <font color=Cyan>++</font> <font color=Magenta>"\""</font>-<a name="(line91)"></a>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/Verbatim.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>{- |+<a name="line-2"></a> Maintainer : simons@cryp.to+<a name="line-3"></a> Stability : experimental+<a name="line-4"></a> Portability : portable+<a name="line-5"></a>+<a name="line-6"></a> The preferred method for rendering a 'Document' or single 'Content'+<a name="line-7"></a> is by using the pretty printing facility defined in "Pretty".+<a name="line-8"></a> Pretty-printing does not work well for cases, however, where the+<a name="line-9"></a> formatting in the XML document is significant. Examples of this+<a name="line-10"></a> case are XHTML's @\<pre\>@ tag, Docbook's @\<literallayout\>@ tag,+<a name="line-11"></a> and many more.+<a name="line-12"></a>+<a name="line-13"></a> Theoretically, the document author could avoid this problem by+<a name="line-14"></a> wrapping the contents of these tags in a \<![CDATA[...]]\> section,+<a name="line-15"></a> but often this is not practical, for instance when the+<a name="line-16"></a> literal-layout section contains other elements. Finally, program+<a name="line-17"></a> writers could manually format these elements by transforming them+<a name="line-18"></a> into a 'literal' string in their 'CFliter', etc., but this is+<a name="line-19"></a> annoying to do and prone to omissions and formatting errors.+<a name="line-20"></a>+<a name="line-21"></a> As an alternative, this module provides the function 'verbatim',+<a name="line-22"></a> which will format XML 'Content' as a 'String' while retaining the+<a name="line-23"></a> formatting of the input document unchanged.+<a name="line-24"></a>+<a name="line-25"></a> /Know problems/:+<a name="line-26"></a>+<a name="line-27"></a> * HaXml's parser eats line feeds between two tags.+<a name="line-28"></a>+<a name="line-29"></a> * 'Attribute's should be formatted by making them an instance of+<a name="line-30"></a> 'Verbatim' as well, but since an 'Attribute' is just a tuple,+<a name="line-31"></a> not a full data type, the helper function 'verbAttr' must be+<a name="line-32"></a> used instead.+<a name="line-33"></a>+<a name="line-34"></a> * 'CMisc' is not yet supported.+<a name="line-35"></a>+<a name="line-36"></a> * 'Element's, which contain no content, are formatted as+<a name="line-37"></a> @\<element-name\/\>@, even if they were not defined as being of+<a name="line-38"></a> type @EMPTY@. In XML this perfectly alright, but in SGML it is+<a name="line-39"></a> not. Those, who wish to use 'verbatim' to format parts of say+<a name="line-40"></a> an HTML page will have to (a) replace problematic elements by+<a name="line-41"></a> 'literal's /before/ running 'verbatim' or (b) use a second+<a name="line-42"></a> search-and-replace stage to fix this.+<a name="line-43"></a> -}</font>+<a name="line-44"></a>+<a name="line-45"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Verbatim <font color=Green><u>where</u></font>+<a name="line-46"></a>+<a name="line-47"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-48"></a>+<a name="line-49"></a><font color=Blue>-- |This class promises that the function 'verbatim' knows how to</font>+<a name="line-50"></a><font color=Blue>-- format this data type into a string without changing the</font>+<a name="line-51"></a><font color=Blue>-- formatting.</font>+<a name="line-52"></a>+<a name="line-53"></a><a name="Verbatim"></a><font color=Green><u>class</u></font> Verbatim a <font color=Green><u>where</u></font>+<a name="line-54"></a> verbatim <font color=Red>::</font> a <font color=Red>-></font> String+<a name="line-55"></a>+<a name="line-56"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>Verbatim a<font color=Cyan>)</font> <font color=Red>=></font> Verbatim <font color=Red>[</font>a<font color=Red>]</font> <font color=Green><u>where</u></font>+<a name="line-57"></a> verbatim <font color=Red>=</font> concat <font color=Cyan>.</font> <font color=Cyan>(</font>map verbatim<font color=Cyan>)</font>+<a name="line-58"></a>+<a name="line-59"></a><font color=Green><u>instance</u></font> Verbatim Char <font color=Green><u>where</u></font>+<a name="line-60"></a> verbatim c <font color=Red>=</font> <font color=Red>[</font>c<font color=Red>]</font>+<a name="line-61"></a>+<a name="line-62"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>Verbatim a<font color=Cyan>,</font> Verbatim b<font color=Cyan>)</font> <font color=Red>=></font> Verbatim <font color=Cyan>(</font>Either a b<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-63"></a> verbatim <font color=Cyan>(</font>Left v<font color=Cyan>)</font> <font color=Red>=</font> verbatim v+<a name="line-64"></a> verbatim <font color=Cyan>(</font>Right v<font color=Cyan>)</font> <font color=Red>=</font> verbatim v+<a name="line-65"></a>+<a name="line-66"></a><font color=Green><u>instance</u></font> Verbatim <font color=Cyan>(</font>Content i<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-67"></a> verbatim <font color=Cyan>(</font>CElem c <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> verbatim c+<a name="line-68"></a> verbatim <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> c <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> c+<a name="line-69"></a> verbatim <font color=Cyan>(</font>CRef c <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> verbatim c+<a name="line-70"></a> verbatim <font color=Cyan>(</font>CMisc <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> error <font color=Magenta>"NYI: verbatim not defined for CMisc"</font>+<a name="line-71"></a>+<a name="line-72"></a><font color=Green><u>instance</u></font> Verbatim <font color=Cyan>(</font>Element i<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-73"></a> verbatim <font color=Cyan>(</font>Elem nam att []<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"<"</font> <font color=Cyan>++</font> nam <font color=Cyan>++</font> <font color=Cyan>(</font>concat <font color=Cyan>.</font> <font color=Cyan>(</font>map verbAttr<font color=Cyan>)</font><font color=Cyan>)</font> att+<a name="line-74"></a> <font color=Cyan>++</font> <font color=Magenta>"/>"</font>+<a name="line-75"></a> verbatim <font color=Cyan>(</font>Elem nam att cont<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"<"</font> <font color=Cyan>++</font> nam <font color=Cyan>++</font> <font color=Cyan>(</font>concat <font color=Cyan>.</font> <font color=Cyan>(</font>map verbAttr<font color=Cyan>)</font><font color=Cyan>)</font> att+<a name="line-76"></a> <font color=Cyan>++</font> <font color=Magenta>">"</font> <font color=Cyan>++</font> verbatim cont <font color=Cyan>++</font> <font color=Magenta>"</"</font> <font color=Cyan>++</font> nam <font color=Cyan>++</font> <font color=Magenta>">"</font>+<a name="line-77"></a>+<a name="line-78"></a><font color=Green><u>instance</u></font> Verbatim Reference <font color=Green><u>where</u></font>+<a name="line-79"></a> verbatim <font color=Cyan>(</font>RefEntity r<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"&"</font> <font color=Cyan>++</font> verbatim r <font color=Cyan>++</font> <font color=Magenta>";"</font>+<a name="line-80"></a> verbatim <font color=Cyan>(</font>RefChar c<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"&#"</font> <font color=Cyan>++</font> show c <font color=Cyan>++</font> <font color=Magenta>";"</font>+<a name="line-81"></a>+<a name="line-82"></a>+<a name="line-83"></a><font color=Blue>-- |This is a helper function is required because Haskell does not</font>+<a name="line-84"></a><font color=Blue>-- allow to make an ordinary tuple (like 'Attribute') an instance of a</font>+<a name="line-85"></a><font color=Blue>-- class. The resulting output will preface the actual attribute with</font>+<a name="line-86"></a><font color=Blue>-- a single blank so that lists of 'Attribute's can be handled</font>+<a name="line-87"></a><font color=Blue>-- implicitly by the definition for lists of 'Verbatim' data types.</font>+<a name="line-88"></a>+<a name="line-89"></a><a name="verbAttr"></a><font color=Blue>verbAttr</font> <font color=Red>::</font> Attribute <font color=Red>-></font> String+<a name="line-90"></a><font color=Blue>verbAttr</font> <font color=Cyan>(</font>n<font color=Cyan>,</font> AttValue v<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>" "</font> <font color=Cyan>++</font> n <font color=Cyan>++</font> <font color=Magenta>"=\""</font> <font color=Cyan>++</font> verbatim v <font color=Cyan>++</font> <font color=Magenta>"\""</font>+<a name="line-91"></a> </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/Wrappers.html view
@@ -1,65 +1,81 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Wrappers-<a name="(line2)"></a> <font color=Cyan>(</font> fix2Args-<a name="(line3)"></a> <font color=Cyan>,</font> processXmlWith-<a name="(line4)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line5)"></a>-<a name="(line6)"></a><font color=Blue>-- imports required for processXmlWith and fix2Args</font>-<a name="(line7)"></a><font color=Green><u>import</u></font> System-<a name="(line8)"></a><font color=Green><u>import</u></font> IO-<a name="(line9)"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>isSuffixOf<font color=Cyan>)</font>-<a name="(line10)"></a>-<a name="(line11)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types <font color=Cyan>(</font>Document<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font>Content<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line12)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Combinators <font color=Cyan>(</font>CFilter<font color=Cyan>)</font>-<a name="(line13)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Posn <font color=Cyan>(</font>Posn<font color=Cyan>,</font>posInNewCxt<font color=Cyan>)</font>-<a name="(line14)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Parse <font color=Cyan>(</font>xmlParse<font color=Cyan>)</font>-<a name="(line15)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Html<font color=Cyan>.</font>Parse <font color=Cyan>(</font>htmlParse<font color=Cyan>)</font>-<a name="(line16)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Pretty <font color=Green><u>as</u></font> PP<font color=Cyan>(</font>document<font color=Cyan>)</font>-<a name="(line17)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>PrettyPrint<font color=Cyan>.</font>HughesPJ <font color=Cyan>(</font>render<font color=Cyan>)</font>-<a name="(line18)"></a>-<a name="(line19)"></a>-<a name="(line20)"></a><a name="fix2Args"></a><font color=Blue>-- | This useful auxiliary checks the commandline arguments for two</font>-<a name="(line21)"></a><font color=Blue>-- filenames, the input and output file respectively. If either</font>-<a name="(line22)"></a><font color=Blue>-- is missing, it is replaced by '-', which can be interpreted by the</font>-<a name="(line23)"></a><font color=Blue>-- caller as stdin and\/or stdout.</font>-<a name="(line24)"></a>fix2Args <font color=Red>::</font> IO <font color=Cyan>(</font>String<font color=Cyan>,</font>String<font color=Cyan>)</font>-<a name="(line25)"></a>fix2Args <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line26)"></a> args <font color=Red><-</font> getArgs-<a name="(line27)"></a> <font color=Green><u>case</u></font> length args <font color=Green><u>of</u></font>-<a name="(line28)"></a> <font color=Magenta>0</font> <font color=Red>-></font> return <font color=Cyan>(</font><font color=Magenta>"-"</font><font color=Cyan>,</font> <font color=Magenta>"-"</font><font color=Cyan>)</font>-<a name="(line29)"></a> <font color=Magenta>1</font> <font color=Red>-></font> return <font color=Cyan>(</font>args<font color=Cyan>!!</font><font color=Magenta>0</font><font color=Cyan>,</font> <font color=Magenta>"-"</font><font color=Cyan>)</font>-<a name="(line30)"></a> <font color=Magenta>2</font> <font color=Red>-></font> return <font color=Cyan>(</font>args<font color=Cyan>!!</font><font color=Magenta>0</font><font color=Cyan>,</font> args<font color=Cyan>!!</font><font color=Magenta>1</font><font color=Cyan>)</font>-<a name="(line31)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> <font color=Green><u>do</u></font> prog <font color=Red><-</font> getProgName-<a name="(line32)"></a> putStrLn <font color=Cyan>(</font><font color=Magenta>"Usage: "</font><font color=Cyan>++</font>prog<font color=Cyan>++</font><font color=Magenta>" [infile] [outfile]"</font><font color=Cyan>)</font>-<a name="(line33)"></a> exitFailure-<a name="(line34)"></a>-<a name="(line35)"></a>-<a name="(line36)"></a><a name="processXmlWith"></a><font color=Blue>-- | The wrapper @processXmlWith@ returns an IO () computation</font>-<a name="(line37)"></a><font color=Blue>-- that collects the filenames (or stdin\/stdout) to use when</font>-<a name="(line38)"></a><font color=Blue>-- reading\/writing XML documents. Its CFilter argument</font>-<a name="(line39)"></a><font color=Blue>-- is applied to transform the XML document from the input and</font>-<a name="(line40)"></a><font color=Blue>-- write it to the output. No DTD is attached to the output.</font>-<a name="(line41)"></a><font color=Blue>--</font>-<a name="(line42)"></a><font color=Blue>-- If the input filename ends with .html or .htm, it is parsed using</font>-<a name="(line43)"></a><font color=Blue>-- the error-correcting HTML parser rather than the strict XML parser.</font>-<a name="(line44)"></a>processXmlWith <font color=Red>::</font> CFilter Posn <font color=Red>-></font> IO ()-<a name="(line45)"></a>processXmlWith f <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line46)"></a> <font color=Cyan>(</font>inf<font color=Cyan>,</font>outf<font color=Cyan>)</font> <font color=Red><-</font> fix2Args-<a name="(line47)"></a> input <font color=Red><-</font> <font color=Green><u>if</u></font> inf<font color=Cyan>==</font><font color=Magenta>"-"</font> <font color=Green><u>then</u></font> getContents <font color=Green><u>else</u></font> readFile inf-<a name="(line48)"></a> o <font color=Red><-</font> <font color=Green><u>if</u></font> outf<font color=Cyan>==</font><font color=Magenta>"-"</font> <font color=Green><u>then</u></font> return stdout <font color=Green><u>else</u></font> openFile outf WriteMode-<a name="(line49)"></a> parse <font color=Red><-</font> <font color=Green><u>if</u></font> <font color=Magenta>".html"</font> <font color=Cyan>`isSuffixOf`</font> inf <font color=Cyan>||</font> <font color=Magenta>".htm"</font> <font color=Cyan>`isSuffixOf`</font> inf-<a name="(line50)"></a> <font color=Green><u>then</u></font> return <font color=Cyan>(</font>htmlParse inf<font color=Cyan>)</font>-<a name="(line51)"></a> <font color=Green><u>else</u></font> return <font color=Cyan>(</font>xmlParse inf<font color=Cyan>)</font>-<a name="(line52)"></a> <font color=Cyan>(</font> hPutStrLn o <font color=Cyan>.</font> render <font color=Cyan>.</font> PP<font color=Cyan>.</font>document <font color=Cyan>.</font> onContent inf f <font color=Cyan>.</font> parse <font color=Cyan>)</font> input-<a name="(line53)"></a> hFlush o-<a name="(line54)"></a>-<a name="(line55)"></a> <font color=Green><u>where</u></font>-<a name="(line56)"></a> onContent <font color=Red>::</font> FilePath <font color=Red>-></font> <font color=Cyan>(</font>CFilter Posn<font color=Cyan>)</font> <font color=Red>-></font> Document Posn <font color=Red>-></font> Document Posn-<a name="(line57)"></a> onContent file filter <font color=Cyan>(</font>Document p s e m<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line58)"></a> <font color=Green><u>case</u></font> filter <font color=Cyan>(</font>CElem e <font color=Cyan>(</font>posInNewCxt file Nothing<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Green><u>of</u></font>-<a name="(line59)"></a> <font color=Red>[</font>CElem e' <font color=Green><u>_</u></font><font color=Red>]</font> <font color=Red>-></font> Document p s e' m-<a name="(line60)"></a> [] <font color=Red>-></font> error <font color=Magenta>"produced no output"</font>-<a name="(line61)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> error <font color=Magenta>"produced more than one output"</font>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/Wrappers.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Wrappers+<a name="line-2"></a> <font color=Cyan>(</font> fix2Args+<a name="line-3"></a> <font color=Cyan>,</font> processXmlWith+<a name="line-4"></a> <font color=Cyan>,</font> onContent+<a name="line-5"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-6"></a>+<a name="line-7"></a><font color=Blue>-- imports required for processXmlWith and fix2Args</font>+<a name="line-8"></a><font color=Green><u>import</u></font> System+<a name="line-9"></a><font color=Green><u>import</u></font> IO+<a name="line-10"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>isSuffixOf<font color=Cyan>)</font>+<a name="line-11"></a>+<a name="line-12"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types <font color=Cyan>(</font>Document<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font>Content<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-13"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Combinators <font color=Cyan>(</font>CFilter<font color=Cyan>)</font>+<a name="line-14"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Posn <font color=Cyan>(</font>Posn<font color=Cyan>,</font>posInNewCxt<font color=Cyan>)</font>+<a name="line-15"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Parse <font color=Cyan>(</font>xmlParse<font color=Cyan>)</font>+<a name="line-16"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Html<font color=Cyan>.</font>Parse <font color=Cyan>(</font>htmlParse<font color=Cyan>)</font>+<a name="line-17"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Pretty <font color=Green><u>as</u></font> PP<font color=Cyan>(</font>document<font color=Cyan>)</font>+<a name="line-18"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>PrettyPrint<font color=Cyan>.</font>HughesPJ <font color=Cyan>(</font>render<font color=Cyan>)</font>+<a name="line-19"></a>+<a name="line-20"></a>+<a name="line-21"></a><a name="fix2Args"></a><font color=Blue>-- | This useful auxiliary checks the commandline arguments for two</font>+<a name="line-22"></a><font color=Blue>-- filenames, the input and output file respectively. If either</font>+<a name="line-23"></a><font color=Blue>-- is missing, it is replaced by '-', which can be interpreted by the</font>+<a name="line-24"></a><font color=Blue>-- caller as stdin and\/or stdout.</font>+<a name="line-25"></a><font color=Blue>fix2Args</font> <font color=Red>::</font> IO <font color=Cyan>(</font>String<font color=Cyan>,</font>String<font color=Cyan>)</font>+<a name="line-26"></a><font color=Blue>fix2Args</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-27"></a> args <font color=Red><-</font> getArgs+<a name="line-28"></a> <font color=Green><u>case</u></font> length args <font color=Green><u>of</u></font>+<a name="line-29"></a> <font color=Magenta>0</font> <font color=Red>-></font> return <font color=Cyan>(</font><font color=Magenta>"-"</font><font color=Cyan>,</font> <font color=Magenta>"-"</font><font color=Cyan>)</font>+<a name="line-30"></a> <font color=Magenta>1</font> <font color=Red>-></font> return <font color=Cyan>(</font>args<font color=Cyan>!!</font><font color=Magenta>0</font><font color=Cyan>,</font> <font color=Magenta>"-"</font><font color=Cyan>)</font>+<a name="line-31"></a> <font color=Magenta>2</font> <font color=Red>-></font> return <font color=Cyan>(</font>args<font color=Cyan>!!</font><font color=Magenta>0</font><font color=Cyan>,</font> args<font color=Cyan>!!</font><font color=Magenta>1</font><font color=Cyan>)</font>+<a name="line-32"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> <font color=Green><u>do</u></font> prog <font color=Red><-</font> getProgName+<a name="line-33"></a> putStrLn <font color=Cyan>(</font><font color=Magenta>"Usage: "</font><font color=Cyan>++</font>prog<font color=Cyan>++</font><font color=Magenta>" [infile] [outfile]"</font><font color=Cyan>)</font>+<a name="line-34"></a> exitFailure+<a name="line-35"></a>+<a name="line-36"></a>+<a name="line-37"></a><a name="processXmlWith"></a><font color=Blue>-- | The wrapper @processXmlWith@ returns an IO () computation</font>+<a name="line-38"></a><font color=Blue>-- that collects the filenames (or stdin\/stdout) to use when</font>+<a name="line-39"></a><font color=Blue>-- reading\/writing XML documents. Its CFilter argument</font>+<a name="line-40"></a><font color=Blue>-- is applied to transform the XML document from the input and</font>+<a name="line-41"></a><font color=Blue>-- write it to the output. No DTD is attached to the output.</font>+<a name="line-42"></a><font color=Blue>--</font>+<a name="line-43"></a><font color=Blue>-- If the input filename ends with .html or .htm, it is parsed using</font>+<a name="line-44"></a><font color=Blue>-- the error-correcting HTML parser rather than the strict XML parser.</font>+<a name="line-45"></a><font color=Blue>processXmlWith</font> <font color=Red>::</font> CFilter Posn <font color=Red>-></font> IO ()+<a name="line-46"></a><font color=Blue>processXmlWith</font> f <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-47"></a> <font color=Cyan>(</font>inf<font color=Cyan>,</font>outf<font color=Cyan>)</font> <font color=Red><-</font> fix2Args+<a name="line-48"></a> input <font color=Red><-</font> <font color=Green><u>if</u></font> inf<font color=Cyan>==</font><font color=Magenta>"-"</font> <font color=Green><u>then</u></font> getContents <font color=Green><u>else</u></font> readFile inf+<a name="line-49"></a> o <font color=Red><-</font> <font color=Green><u>if</u></font> outf<font color=Cyan>==</font><font color=Magenta>"-"</font> <font color=Green><u>then</u></font> return stdout <font color=Green><u>else</u></font> openFile outf WriteMode+<a name="line-50"></a> parse <font color=Red><-</font> <font color=Green><u>if</u></font> <font color=Magenta>".html"</font> <font color=Cyan>`isSuffixOf`</font> inf <font color=Cyan>||</font> <font color=Magenta>".htm"</font> <font color=Cyan>`isSuffixOf`</font> inf+<a name="line-51"></a> <font color=Green><u>then</u></font> return <font color=Cyan>(</font>htmlParse inf<font color=Cyan>)</font>+<a name="line-52"></a> <font color=Green><u>else</u></font> return <font color=Cyan>(</font>xmlParse inf<font color=Cyan>)</font>+<a name="line-53"></a> <font color=Cyan>(</font> hPutStrLn o <font color=Cyan>.</font> render <font color=Cyan>.</font> PP<font color=Cyan>.</font>document <font color=Cyan>.</font> onContent inf f <font color=Cyan>.</font> parse <font color=Cyan>)</font> input+<a name="line-54"></a> hFlush o+<a name="line-55"></a>+<a name="line-56"></a> <font color=Green><u>where</u></font>+<a name="line-57"></a> onContent <font color=Red>::</font> FilePath <font color=Red>-></font> <font color=Cyan>(</font>CFilter Posn<font color=Cyan>)</font> <font color=Red>-></font> Document Posn <font color=Red>-></font> Document Posn+<a name="line-58"></a> onContent file filter <font color=Cyan>(</font>Document p s e m<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-59"></a> <font color=Green><u>case</u></font> filter <font color=Cyan>(</font>CElem e <font color=Cyan>(</font>posInNewCxt file Nothing<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Green><u>of</u></font>+<a name="line-60"></a> <font color=Red>[</font>CElem e' <font color=Green><u>_</u></font><font color=Red>]</font> <font color=Red>-></font> Document p s e' m+<a name="line-61"></a> [] <font color=Red>-></font> error <font color=Magenta>"produced no output"</font>+<a name="line-62"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> error <font color=Magenta>"produced more than one output"</font>+<a name="line-63"></a>+<a name="line-64"></a><a name="onContent"></a><font color=Blue>-- | The wrapper @onContent@ simply applies a given content filter to a</font>+<a name="line-65"></a><font color=Blue>-- document. Ambiguous or empty results raise an error exception.</font>+<a name="line-66"></a><font color=Blue>onContent</font> <font color=Red>::</font> CFilter i <font color=Red>-></font> Document i <font color=Red>-></font> Document i+<a name="line-67"></a><font color=Blue>onContent</font> filter <font color=Cyan>(</font>Document p s e m<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-68"></a> <font color=Green><u>case</u></font> filter <font color=Cyan>(</font>CElem e undefined<font color=Cyan>)</font> <font color=Green><u>of</u></font>+<a name="line-69"></a> <font color=Red>[</font>CElem e' <font color=Green><u>_</u></font><font color=Red>]</font> <font color=Red>-></font> Document p s e' m+<a name="line-70"></a> [] <font color=Red>-></font> error <font color=Magenta>"onContent: produced no output"</font>+<a name="line-71"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> error <font color=Magenta>"onContent: produced more than one output"</font> </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/XmlContent.html view
@@ -1,683 +1,898 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>{-# LANGUAGE ExistentialQuantification #-}</font>-<a name="(line2)"></a>-<a name="(line3)"></a><font color=Blue>-- | The class 'XmlContent' is a kind of replacement for Read and Show:</font>-<a name="(line4)"></a><font color=Blue>-- it provides conversions between a generic XML tree representation</font>-<a name="(line5)"></a><font color=Blue>-- and your own more specialised typeful Haskell data trees.</font>-<a name="(line6)"></a><font color=Blue>--</font>-<a name="(line7)"></a><font color=Blue>-- If you are starting with a set of Haskell datatypes, use DrIFT to</font>-<a name="(line8)"></a><font color=Blue>-- derive instances of this class for you:</font>-<a name="(line9)"></a><font color=Blue>-- http:\/\/repetae.net\/john\/computer\/haskell\/DrIFT</font>-<a name="(line10)"></a><font color=Blue>-- If you are starting with an XML DTD, use HaXml's tool DtdToHaskell</font>-<a name="(line11)"></a><font color=Blue>-- to generate both the Haskell types and the corresponding instances.</font>-<a name="(line12)"></a><font color=Blue>--</font>-<a name="(line13)"></a><font color=Blue>-- This unified class interface replaces two previous (somewhat similar)</font>-<a name="(line14)"></a><font color=Blue>-- classes: Haskell2Xml and Xml2Haskell. There was no real reason to have</font>-<a name="(line15)"></a><font color=Blue>-- separate classes depending on how you originally defined your datatypes.</font>-<a name="(line16)"></a>-<a name="(line17)"></a><font color=Blue>-- The methods 'toContents' and 'parseContents' convert a value to and from</font>-<a name="(line18)"></a><font color=Blue>-- a generic internal representation of an XML document /without/ a DTD.</font>-<a name="(line19)"></a><font color=Blue>-- The functions 'toXml' and 'fromXml' convert a value to and from a generic</font>-<a name="(line20)"></a><font color=Blue>-- internal representation of an XML document /including/ a DTD.</font>-<a name="(line21)"></a><font color=Blue>-- The functions 'readXml' and 'showXml' convert to and from Strings.</font>-<a name="(line22)"></a><font color=Blue>-- The functions 'fReadXml' and 'fWriteXml' do the conversion to and from</font>-<a name="(line23)"></a><font color=Blue>-- the given filenames.</font>-<a name="(line24)"></a><font color=Blue>-- The functions 'hGetXml' and 'hPutXml' do the conversion to and from</font>-<a name="(line25)"></a><font color=Blue>-- the given file handles.</font>-<a name="(line26)"></a><font color=Blue>-- (See the type signatures.)</font>-<a name="(line27)"></a><font color=Blue>--</font>-<a name="(line28)"></a>-<a name="(line29)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>XmlContent-<a name="(line30)"></a> <font color=Cyan>(</font> <font color=Blue>-- * Re-export the relevant set of generic XML document type definitions</font>-<a name="(line31)"></a> Document<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line32)"></a> <font color=Cyan>,</font> Element<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line33)"></a> <font color=Cyan>,</font> ElemTag<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line34)"></a> <font color=Cyan>,</font> Content<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line35)"></a> <font color=Cyan>,</font> Attribute()-<a name="(line36)"></a> <font color=Cyan>,</font> AttValue<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line37)"></a> <font color=Cyan>,</font> Prolog<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line38)"></a> <font color=Cyan>,</font> Reference<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line39)"></a> <font color=Blue>-- * The enabling classes, that define parsing\/unparsing between Haskell</font>-<a name="(line40)"></a> <font color=Blue>-- datatypes and a generic XML representation.</font>-<a name="(line41)"></a> <font color=Cyan>,</font> XmlContent<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line42)"></a> <font color=Cyan>,</font> XmlAttributes<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line43)"></a> <font color=Cyan>,</font> XmlAttrType<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line44)"></a> <font color=Blue>-- ** Auxiliaries for writing parsers in the XmlContent class</font>-<a name="(line45)"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>Poly-<a name="(line46)"></a> <font color=Cyan>,</font> XMLParser-<a name="(line47)"></a> <font color=Cyan>,</font> content<font color=Cyan>,</font> posnElement<font color=Cyan>,</font> element<font color=Cyan>,</font> interior<font color=Cyan>,</font> inElement<font color=Cyan>,</font> text<font color=Cyan>,</font> attributes-<a name="(line48)"></a> <font color=Cyan>,</font> posnElementWith<font color=Cyan>,</font> elementWith<font color=Cyan>,</font> inElementWith-<a name="(line49)"></a> <font color=Cyan>,</font> choice<font color=Cyan>,</font> definite <font color=Blue>-- ???</font>-<a name="(line50)"></a> <font color=Blue>-- ** Auxiliaries for generating in the XmlContent class</font>-<a name="(line51)"></a> <font color=Cyan>,</font> mkElem<font color=Cyan>,</font> mkElemC<font color=Cyan>,</font> mkAttr-<a name="(line52)"></a> <font color=Cyan>,</font> toText<font color=Cyan>,</font> toCData-<a name="(line53)"></a> <font color=Blue>-- ** Auxiliaries for the attribute-related classes</font>-<a name="(line54)"></a> <font color=Cyan>,</font> maybeToAttr<font color=Cyan>,</font> defaultToAttr-<a name="(line55)"></a> <font color=Cyan>,</font> definiteA<font color=Cyan>,</font> defaultA<font color=Cyan>,</font> possibleA<font color=Cyan>,</font> fromAttrToStr<font color=Cyan>,</font> toAttrFrStr-<a name="(line56)"></a> <font color=Cyan>,</font> Defaultable<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line57)"></a> <font color=Cyan>,</font> str2attr<font color=Cyan>,</font> attr2str<font color=Cyan>,</font> attval-<a name="(line58)"></a> <font color=Cyan>,</font> catMaybes <font color=Blue>-- re-exported from Maybe</font>-<a name="(line59)"></a> <font color=Blue>-- * Whole-document conversion functions</font>-<a name="(line60)"></a> <font color=Cyan>,</font> toXml<font color=Cyan>,</font> fromXml-<a name="(line61)"></a> <font color=Cyan>,</font> readXml<font color=Cyan>,</font> showXml<font color=Cyan>,</font> fpsShowXml-<a name="(line62)"></a> <font color=Cyan>,</font> fReadXml<font color=Cyan>,</font> fWriteXml<font color=Cyan>,</font> fpsWriteXml-<a name="(line63)"></a> <font color=Cyan>,</font> hGetXml<font color=Cyan>,</font> hPutXml<font color=Cyan>,</font> fpsHPutXml-<a name="(line64)"></a> <font color=Blue>-- * Explicit representation of Haskell datatype information</font>-<a name="(line65)"></a> <font color=Blue>-- (for conversion to a DTD)</font>-<a name="(line66)"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>TypeMapping-<a name="(line67)"></a> <font color=Blue>-- * Types useful for some content models</font>-<a name="(line68)"></a> <font color=Cyan>,</font> List1<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line69)"></a> <font color=Cyan>,</font> ANYContent<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line70)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line71)"></a>-<a name="(line72)"></a><font color=Green><u>import</u></font> IO-<a name="(line73)"></a><font color=Green><u>import</u></font> Maybe <font color=Cyan>(</font>catMaybes<font color=Cyan>)</font>-<a name="(line74)"></a><font color=Green><u>import</u></font> Char <font color=Cyan>(</font>chr<font color=Cyan>,</font> isSpace<font color=Cyan>)</font>-<a name="(line75)"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>isPrefixOf<font color=Cyan>,</font> isSuffixOf<font color=Cyan>)</font>-<a name="(line76)"></a>-<a name="(line77)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>PrettyPrint<font color=Cyan>.</font>HughesPJ <font color=Cyan>(</font>render<font color=Cyan>)</font>-<a name="(line78)"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Pretty <font color=Green><u>as</u></font> PP-<a name="(line79)"></a>-<a name="(line80)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line81)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>TypeMapping-<a name="(line82)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Posn <font color=Cyan>(</font>Posn<font color=Cyan>,</font> posInNewCxt<font color=Cyan>)</font>-<a name="(line83)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Pretty <font color=Cyan>(</font>document<font color=Cyan>)</font>-<a name="(line84)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Parse <font color=Cyan>(</font>xmlParse<font color=Cyan>)</font>-<a name="(line85)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Verbatim <font color=Cyan>(</font>Verbatim<font color=Cyan>(</font>verbatim<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line86)"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>ByteStringPP <font color=Green><u>as</u></font> FPS <font color=Cyan>(</font>document<font color=Cyan>)</font>-<a name="(line87)"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Data<font color=Cyan>.</font>ByteString<font color=Cyan>.</font>Lazy<font color=Cyan>.</font>Char8 <font color=Green><u>as</u></font> FPS-<a name="(line88)"></a>-<a name="(line89)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>Poly-<a name="(line90)"></a>-<a name="(line91)"></a><font color=Blue>-- #define DEBUG</font>-<a name="(line92)"></a>-<a name="(line93)"></a><font color=Magenta><em>#if defined(DEBUG)</em></font>-<a name="(line94)"></a><font color=Green><u>import</u></font> Debug<font color=Cyan>.</font>Trace<font color=Cyan>(</font>trace<font color=Cyan>)</font>-<a name="(line95)"></a><a name="debug"></a>debug <font color=Red>::</font> a <font color=Red>-></font> String <font color=Red>-></font> a-<a name="(line96)"></a><a name="debug"></a>v <font color=Cyan>`debug`</font> s <font color=Red>=</font> trace s v-<a name="(line97)"></a><font color=Magenta><em>#else</em></font>-<a name="(line98)"></a>debug <font color=Red>::</font> t <font color=Red>-></font> t1 <font color=Red>-></font> t-<a name="(line99)"></a><a name="debug"></a>v <font color=Cyan>`debug`</font> <font color=Green><u>_</u></font> <font color=Red>=</font> v-<a name="(line100)"></a><font color=Magenta><em>#endif</em></font>-<a name="(line101)"></a>-<a name="(line102)"></a>-<a name="(line103)"></a><a name="attval"></a><font color=Blue>------------------------------------------------------------------------</font>-<a name="(line104)"></a><font color=Blue>-- | Read a single attribute called "value".</font>-<a name="(line105)"></a>attval <font color=Red>::</font> <font color=Cyan>(</font>Read a<font color=Cyan>)</font> <font color=Red>=></font> Element i <font color=Red>-></font> a-<a name="(line106)"></a>attval <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Red>[</font><font color=Cyan>(</font><font color=Magenta>"value"</font><font color=Cyan>,</font>v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Red>]</font> []<font color=Cyan>)</font> <font color=Red>=</font> read <font color=Cyan>(</font>show v<font color=Cyan>)</font>-<a name="(line107)"></a>-<a name="(line108)"></a><a name="mkAttr"></a><font color=Blue>-- | Generate a single attribute.</font>-<a name="(line109)"></a>mkAttr <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Attribute-<a name="(line110)"></a>mkAttr n v <font color=Red>=</font> <font color=Cyan>(</font>n<font color=Cyan>,</font> AttValue <font color=Red>[</font>Left v<font color=Red>]</font><font color=Cyan>)</font>-<a name="(line111)"></a>-<a name="(line112)"></a><a name="mkElem"></a><font color=Blue>-- | Generate an element with no attributes, named for its HType.</font>-<a name="(line113)"></a>mkElem <font color=Red>::</font> XmlContent a <font color=Red>=></font> a <font color=Red>-></font> <font color=Red>[</font>Content ()<font color=Red>]</font> <font color=Red>-></font> Content ()-<a name="(line114)"></a>mkElem x cs <font color=Red>=</font> CElem <font color=Cyan>(</font>Elem <font color=Cyan>(</font>showHType <font color=Cyan>(</font>toHType x<font color=Cyan>)</font> <font color=Magenta>""</font><font color=Cyan>)</font> [] cs<font color=Cyan>)</font> ()-<a name="(line115)"></a>-<a name="(line116)"></a><a name="mkElemC"></a><font color=Blue>-- | Generate an element with no attributes, named directly.</font>-<a name="(line117)"></a>mkElemC <font color=Red>::</font> String <font color=Red>-></font> <font color=Red>[</font>Content ()<font color=Red>]</font> <font color=Red>-></font> Content ()-<a name="(line118)"></a>mkElemC x cs <font color=Red>=</font> CElem <font color=Cyan>(</font>Elem x [] cs<font color=Cyan>)</font> ()-<a name="(line119)"></a>-<a name="(line120)"></a><a name="toText"></a><font color=Blue>-- | Turn a simple string into XML text.</font>-<a name="(line121)"></a>toText <font color=Red>::</font> String <font color=Red>-></font> <font color=Red>[</font>Content ()<font color=Red>]</font>-<a name="(line122)"></a>toText s <font color=Red>=</font> <font color=Red>[</font>CString False s ()<font color=Red>]</font>-<a name="(line123)"></a>-<a name="(line124)"></a><a name="toCData"></a><font color=Blue>-- | Turn a string into an XML CDATA section.</font>-<a name="(line125)"></a><font color=Blue>-- (i.e. special characters like '&' are preserved without interpretation.)</font>-<a name="(line126)"></a>toCData <font color=Red>::</font> String <font color=Red>-></font> <font color=Red>[</font>Content ()<font color=Red>]</font>-<a name="(line127)"></a>toCData s <font color=Red>=</font> <font color=Red>[</font>CString True s ()<font color=Red>]</font>-<a name="(line128)"></a><font color=Blue>------------------------------------------------------------------------</font>-<a name="(line129)"></a>-<a name="(line130)"></a> <font color=Blue>-- probably want to write DTD separately from value, and have</font>-<a name="(line131)"></a> <font color=Blue>-- easy ways to combine DTD + value into a document, or write</font>-<a name="(line132)"></a> <font color=Blue>-- them to separate files.</font>-<a name="(line133)"></a>-<a name="(line134)"></a><a name="fReadXml"></a><font color=Blue>-- | Read an XML document from a file and convert it to a fully-typed</font>-<a name="(line135)"></a><font color=Blue>-- Haskell value.</font>-<a name="(line136)"></a>fReadXml <font color=Red>::</font> XmlContent a <font color=Red>=></font> FilePath <font color=Red>-></font> IO a-<a name="(line137)"></a>fReadXml fp <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line138)"></a> f <font color=Red><-</font> <font color=Cyan>(</font> <font color=Green><u>if</u></font> fp<font color=Cyan>==</font><font color=Magenta>"-"</font> <font color=Green><u>then</u></font> return stdin-<a name="(line139)"></a> <font color=Green><u>else</u></font> openFile fp ReadMode <font color=Cyan>)</font>-<a name="(line140)"></a> x <font color=Red><-</font> hGetContents f-<a name="(line141)"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>Document <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> y <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> xmlParse fp x-<a name="(line142)"></a> y' <font color=Red>=</font> CElem y <font color=Cyan>(</font>posInNewCxt fp Nothing<font color=Cyan>)</font>-<a name="(line143)"></a> either fail return <font color=Cyan>(</font>fst <font color=Cyan>(</font>runParser parseContents <font color=Red>[</font>y'<font color=Red>]</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line144)"></a>-<a name="(line145)"></a><a name="fWriteXml"></a><font color=Blue>-- | Write a fully-typed Haskell value to the given file as an XML</font>-<a name="(line146)"></a><font color=Blue>-- document.</font>-<a name="(line147)"></a>fWriteXml <font color=Red>::</font> XmlContent a <font color=Red>=></font> FilePath <font color=Red>-></font> a <font color=Red>-></font> IO ()-<a name="(line148)"></a>fWriteXml fp x <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line149)"></a> f <font color=Red><-</font> <font color=Cyan>(</font> <font color=Green><u>if</u></font> fp<font color=Cyan>==</font><font color=Magenta>"-"</font> <font color=Green><u>then</u></font> return stdout-<a name="(line150)"></a> <font color=Green><u>else</u></font> openFile fp WriteMode <font color=Cyan>)</font>-<a name="(line151)"></a> hPutXml f False x-<a name="(line152)"></a> hClose f-<a name="(line153)"></a>-<a name="(line154)"></a><a name="fpsWriteXml"></a><font color=Blue>-- | Write any Haskell value to the given file as an XML document,</font>-<a name="(line155)"></a><font color=Blue>-- using the FastPackedString interface (output will not be prettified).</font>-<a name="(line156)"></a>fpsWriteXml <font color=Red>::</font> XmlContent a <font color=Red>=></font> FilePath <font color=Red>-></font> a <font color=Red>-></font> IO ()-<a name="(line157)"></a>fpsWriteXml fp x <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line158)"></a> f <font color=Red><-</font> <font color=Cyan>(</font> <font color=Green><u>if</u></font> fp<font color=Cyan>==</font><font color=Magenta>"-"</font> <font color=Green><u>then</u></font> return stdout-<a name="(line159)"></a> <font color=Green><u>else</u></font> openFile fp WriteMode <font color=Cyan>)</font>-<a name="(line160)"></a> fpsHPutXml f False x-<a name="(line161)"></a> hClose f-<a name="(line162)"></a>-<a name="(line163)"></a><a name="readXml"></a><font color=Blue>-- | Read a fully-typed XML document from a string.</font>-<a name="(line164)"></a>readXml <font color=Red>::</font> XmlContent a <font color=Red>=></font> String <font color=Red>-></font> Either String a-<a name="(line165)"></a>readXml s <font color=Red>=</font>-<a name="(line166)"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>Document <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> y <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> xmlParse <font color=Magenta>"string input"</font> s <font color=Green><u>in</u></font>-<a name="(line167)"></a> fst <font color=Cyan>(</font>runParser parseContents-<a name="(line168)"></a> <font color=Red>[</font>CElem y <font color=Cyan>(</font>posInNewCxt <font color=Magenta>"string input"</font> Nothing<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line169)"></a>-<a name="(line170)"></a><a name="showXml"></a><font color=Blue>-- | Convert a fully-typed XML document to a string (without DTD).</font>-<a name="(line171)"></a>showXml <font color=Red>::</font> XmlContent a <font color=Red>=></font> Bool <font color=Red>-></font> a <font color=Red>-></font> String-<a name="(line172)"></a>showXml dtd x <font color=Red>=</font>-<a name="(line173)"></a> <font color=Green><u>case</u></font> toContents x <font color=Green><u>of</u></font>-<a name="(line174)"></a> <font color=Red>[</font>CElem <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Red>]</font> <font color=Red>-></font> <font color=Cyan>(</font>render <font color=Cyan>.</font> document <font color=Cyan>.</font> toXml dtd<font color=Cyan>)</font> x-<a name="(line175)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> <font color=Magenta>""</font>-<a name="(line176)"></a>-<a name="(line177)"></a><a name="fpsShowXml"></a><font color=Blue>-- | Convert a fully-typed XML document to a ByteString (without DTD).</font>-<a name="(line178)"></a>fpsShowXml <font color=Red>::</font> XmlContent a <font color=Red>=></font> Bool <font color=Red>-></font> a <font color=Red>-></font> FPS<font color=Cyan>.</font>ByteString-<a name="(line179)"></a>fpsShowXml dtd x <font color=Red>=</font>-<a name="(line180)"></a> <font color=Green><u>case</u></font> toContents x <font color=Green><u>of</u></font>-<a name="(line181)"></a> <font color=Red>[</font>CElem <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Red>]</font> <font color=Red>-></font> <font color=Cyan>(</font>FPS<font color=Cyan>.</font>document <font color=Cyan>.</font> toXml dtd<font color=Cyan>)</font> x-<a name="(line182)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> FPS<font color=Cyan>.</font>empty-<a name="(line183)"></a>-<a name="(line184)"></a>-<a name="(line185)"></a><a name="toXml"></a><font color=Blue>-- | Convert a fully-typed XML document to a string (with or without DTD).</font>-<a name="(line186)"></a>toXml <font color=Red>::</font> XmlContent a <font color=Red>=></font> Bool <font color=Red>-></font> a <font color=Red>-></font> Document ()-<a name="(line187)"></a>toXml dtd value <font color=Red>=</font>-<a name="(line188)"></a> <font color=Green><u>let</u></font> ht <font color=Red>=</font> toHType value <font color=Green><u>in</u></font>-<a name="(line189)"></a> Document <font color=Cyan>(</font>Prolog <font color=Cyan>(</font>Just <font color=Cyan>(</font>XMLDecl <font color=Magenta>"1.0"</font> Nothing Nothing<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line190)"></a> [] <font color=Cyan>(</font><font color=Green><u>if</u></font> dtd <font color=Green><u>then</u></font> Just <font color=Cyan>(</font>toDTD ht<font color=Cyan>)</font> <font color=Green><u>else</u></font> Nothing<font color=Cyan>)</font> []<font color=Cyan>)</font>-<a name="(line191)"></a> emptyST-<a name="(line192)"></a> <font color=Cyan>(</font> <font color=Green><u>case</u></font> <font color=Cyan>(</font>ht<font color=Cyan>,</font> toContents value<font color=Cyan>)</font> <font color=Green><u>of</u></font>-<a name="(line193)"></a> <font color=Cyan>(</font>Tuple <font color=Green><u>_</u></font><font color=Cyan>,</font> cs<font color=Cyan>)</font> <font color=Red>-></font> Elem <font color=Cyan>(</font>showHType ht <font color=Magenta>""</font><font color=Cyan>)</font> [] cs-<a name="(line194)"></a> <font color=Cyan>(</font>Defined <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>,</font> cs<font color=Cyan>)</font> <font color=Red>-></font> Elem <font color=Cyan>(</font>showHType ht <font color=Magenta>"-XML"</font><font color=Cyan>)</font> [] cs-<a name="(line195)"></a> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font> <font color=Red>[</font>CElem e ()<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> e <font color=Cyan>)</font>-<a name="(line196)"></a> []-<a name="(line197)"></a>-<a name="(line198)"></a><a name="fromXml"></a><font color=Blue>-- | Read a Haskell value from an XML document, ignoring the DTD and</font>-<a name="(line199)"></a><font color=Blue>-- using the Haskell result type to determine how to parse it.</font>-<a name="(line200)"></a>fromXml <font color=Red>::</font> XmlContent a <font color=Red>=></font> Document Posn <font color=Red>-></font> Either String a-<a name="(line201)"></a>fromXml <font color=Cyan>(</font>Document <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> e<font color=Red>@</font><font color=Cyan>(</font>Elem n <font color=Green><u>_</u></font> cs<font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font>-<a name="(line202)"></a> <font color=Red>|</font> <font color=Magenta>"tuple"</font> <font color=Cyan>`isPrefixOf`</font> n <font color=Red>=</font> fst <font color=Cyan>(</font>runParser parseContents cs<font color=Cyan>)</font>-<a name="(line203)"></a> <font color=Red>|</font> <font color=Magenta>"-XML"</font> <font color=Cyan>`isSuffixOf`</font> n <font color=Red>=</font> fst <font color=Cyan>(</font>runParser parseContents cs<font color=Cyan>)</font>-<a name="(line204)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> fst <font color=Cyan>(</font>runParser parseContents-<a name="(line205)"></a> <font color=Red>[</font>CElem e <font color=Cyan>(</font>posInNewCxt <font color=Magenta>"document"</font> Nothing<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font>-<a name="(line206)"></a>-<a name="(line207)"></a>-<a name="(line208)"></a><a name="hGetXml"></a><font color=Blue>-- | Read a fully-typed XML document from a file handle.</font>-<a name="(line209)"></a>hGetXml <font color=Red>::</font> XmlContent a <font color=Red>=></font> Handle <font color=Red>-></font> IO a-<a name="(line210)"></a>hGetXml h <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line211)"></a> x <font color=Red><-</font> hGetContents h-<a name="(line212)"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>Document <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> y <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> xmlParse <font color=Magenta>"file handle"</font> x-<a name="(line213)"></a> either fail return-<a name="(line214)"></a> <font color=Cyan>(</font>fst <font color=Cyan>(</font>runParser parseContents-<a name="(line215)"></a> <font color=Red>[</font>CElem y <font color=Cyan>(</font>posInNewCxt <font color=Magenta>"file handle"</font> Nothing<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line216)"></a>-<a name="(line217)"></a><a name="hPutXml"></a><font color=Blue>-- | Write a fully-typed XML document to a file handle.</font>-<a name="(line218)"></a>hPutXml <font color=Red>::</font> XmlContent a <font color=Red>=></font> Handle <font color=Red>-></font> Bool <font color=Red>-></font> a <font color=Red>-></font> IO ()-<a name="(line219)"></a>hPutXml h dtd x <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line220)"></a> <font color=Cyan>(</font>hPutStrLn h <font color=Cyan>.</font> render <font color=Cyan>.</font> document <font color=Cyan>.</font> toXml dtd<font color=Cyan>)</font> x-<a name="(line221)"></a>-<a name="(line222)"></a><a name="fpsHPutXml"></a><font color=Blue>-- | Write a fully-typed XML document to a file handle, using the</font>-<a name="(line223)"></a><font color=Blue>-- FastPackedString interface (output will not be prettified).</font>-<a name="(line224)"></a>fpsHPutXml <font color=Red>::</font> XmlContent a <font color=Red>=></font> Handle <font color=Red>-></font> Bool <font color=Red>-></font> a <font color=Red>-></font> IO ()-<a name="(line225)"></a>fpsHPutXml h dtd x <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line226)"></a> <font color=Cyan>(</font>FPS<font color=Cyan>.</font>hPut h <font color=Cyan>.</font> FPS<font color=Cyan>.</font>document <font color=Cyan>.</font> toXml dtd<font color=Cyan>)</font> x-<a name="(line227)"></a>-<a name="(line228)"></a><font color=Blue>------------------------------------------------------------------------</font>-<a name="(line229)"></a>-<a name="(line230)"></a><a name="XMLParser"></a><font color=Blue>-- | We need a parsing monad for reading generic XML Content into specific</font>-<a name="(line231)"></a><a name="XMLParser"></a><font color=Blue>-- datatypes. This is a specialisation of the Text.ParserCombinators.Poly</font>-<a name="(line232)"></a><a name="XMLParser"></a><font color=Blue>-- ones, where the input token type is fixed as XML Content.</font>-<a name="(line233)"></a><a name="XMLParser"></a><font color=Green><u>type</u></font> XMLParser a <font color=Red>=</font> Parser <font color=Cyan>(</font>Content Posn<font color=Cyan>)</font> a-<a name="(line234)"></a>-<a name="(line235)"></a>-<a name="(line236)"></a><font color=Blue>------------------------------------------------------------------------</font>-<a name="(line237)"></a><font color=Blue>-- Some useful parsing combinators</font>-<a name="(line238)"></a><font color=Blue>------------------------------------------------------------------------</font>-<a name="(line239)"></a>-<a name="(line240)"></a><a name="content"></a><font color=Blue>-- | The most primitive combinator for XMLParser - get one content item.</font>-<a name="(line241)"></a>content <font color=Red>::</font> String <font color=Red>-></font> XMLParser <font color=Cyan>(</font>Content Posn<font color=Cyan>)</font>-<a name="(line242)"></a>content word <font color=Red>=</font> next <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>++</font><font color=Magenta>" when expecting "</font><font color=Cyan>++</font>word<font color=Cyan>)</font>-<a name="(line243)"></a>-<a name="(line244)"></a><a name="posnElementWith"></a><font color=Blue>-- | Get the next content element, checking that it has one of the required</font>-<a name="(line245)"></a><font color=Blue>-- tags, using the given matching function.</font>-<a name="(line246)"></a><font color=Blue>-- (Skips over comments and whitespace, rejects text and refs.</font>-<a name="(line247)"></a><font color=Blue>-- Also returns position of element.)</font>-<a name="(line248)"></a>posnElementWith <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Red>-></font>Bool<font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>String<font color=Red>]</font>-<a name="(line249)"></a> <font color=Red>-></font> XMLParser <font color=Cyan>(</font>Posn<font color=Cyan>,</font> Element Posn<font color=Cyan>)</font>-<a name="(line250)"></a>posnElementWith match tags <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line251)"></a> <font color=Cyan>{</font> c <font color=Red><-</font> content <font color=Cyan>(</font>formatted tags<font color=Cyan>)</font>-<a name="(line252)"></a> <font color=Cyan>;</font> <font color=Green><u>case</u></font> c <font color=Green><u>of</u></font>-<a name="(line253)"></a> CElem e<font color=Red>@</font><font color=Cyan>(</font>Elem t <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> pos-<a name="(line254)"></a> <font color=Red>|</font> any <font color=Cyan>(</font>match t<font color=Cyan>)</font> tags <font color=Red>-></font> return <font color=Cyan>(</font>pos<font color=Cyan>,</font> e<font color=Cyan>)</font>-<a name="(line255)"></a> <font color=Red>|</font> otherwise <font color=Red>-></font> fail <font color=Cyan>(</font><font color=Magenta>"Found a <"</font><font color=Cyan>++</font>t<font color=Cyan>++</font><font color=Magenta>">, but expected "</font>-<a name="(line256)"></a> <font color=Cyan>++</font>formatted tags<font color=Cyan>++</font><font color=Magenta>"\nat "</font><font color=Cyan>++</font>show pos<font color=Cyan>)</font>-<a name="(line257)"></a> CString b s pos-<a name="(line258)"></a> <font color=Red>|</font> not b <font color=Cyan>&&</font> all isSpace s <font color=Red>-></font> posnElementWith match tags-<a name="(line259)"></a> <font color=Blue>-- ignore blank space</font>-<a name="(line260)"></a> <font color=Red>|</font> otherwise <font color=Red>-></font> fail <font color=Cyan>(</font><font color=Magenta>"Found text content, but expected "</font>-<a name="(line261)"></a> <font color=Cyan>++</font>formatted tags<font color=Cyan>++</font><font color=Magenta>"\ntext is: "</font><font color=Cyan>++</font>s-<a name="(line262)"></a> <font color=Cyan>++</font><font color=Magenta>"\nat "</font><font color=Cyan>++</font>show pos<font color=Cyan>)</font>-<a name="(line263)"></a> CRef r pos <font color=Red>-></font> fail <font color=Cyan>(</font><font color=Magenta>"Found reference, but expected "</font>-<a name="(line264)"></a> <font color=Cyan>++</font>formatted tags<font color=Cyan>++</font><font color=Magenta>"\nreference is: "</font><font color=Cyan>++</font>verbatim r-<a name="(line265)"></a> <font color=Cyan>++</font><font color=Magenta>"\nat "</font><font color=Cyan>++</font>show pos<font color=Cyan>)</font>-<a name="(line266)"></a> CMisc <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Red>-></font> posnElementWith match tags <font color=Blue>-- skip comments, PIs, etc.</font>-<a name="(line267)"></a> <font color=Cyan>}</font>-<a name="(line268)"></a> <font color=Green><u>where</u></font>-<a name="(line269)"></a> formatted <font color=Red>[</font>t<font color=Red>]</font> <font color=Red>=</font> <font color=Magenta>"a <"</font><font color=Cyan>++</font>t<font color=Cyan>++</font><font color=Magenta>">"</font>-<a name="(line270)"></a> formatted tgs <font color=Red>=</font> <font color=Magenta>"one of"</font><font color=Cyan>++</font> concatMap <font color=Cyan>(</font><font color=Red>\</font>t<font color=Red>-></font><font color=Magenta>" <"</font><font color=Cyan>++</font>t<font color=Cyan>++</font><font color=Magenta>">"</font><font color=Cyan>)</font> tgs-<a name="(line271)"></a>-<a name="(line272)"></a><a name="posnElement"></a><font color=Blue>-- | A specialisation of @posnElementWith (==)@.</font>-<a name="(line273)"></a>posnElement <font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-></font> XMLParser <font color=Cyan>(</font>Posn<font color=Cyan>,</font> Element Posn<font color=Cyan>)</font>-<a name="(line274)"></a>posnElement <font color=Red>=</font> posnElementWith <font color=Cyan>(</font><font color=Cyan>==</font><font color=Cyan>)</font>-<a name="(line275)"></a>-<a name="(line276)"></a><a name="element"></a><font color=Blue>-- | Get the next content element, checking that it has one of the required</font>-<a name="(line277)"></a><font color=Blue>-- tags. (Skips over comments and whitespace, rejects text and refs.)</font>-<a name="(line278)"></a>element <font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-></font> XMLParser <font color=Cyan>(</font>Element Posn<font color=Cyan>)</font>-<a name="(line279)"></a>element tags <font color=Red>=</font> fmap snd <font color=Cyan>(</font>posnElement tags<font color=Cyan>)</font>-<a name="(line280)"></a> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"Element: "</font><font color=Cyan>++</font>unwords tags<font color=Cyan>++</font><font color=Magenta>"\n"</font><font color=Cyan>)</font>-<a name="(line281)"></a>-<a name="(line282)"></a><a name="elementWith"></a><font color=Blue>-- | Like element, only permits a more flexible match against the tagname.</font>-<a name="(line283)"></a>elementWith <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Red>-></font>Bool<font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-></font> XMLParser <font color=Cyan>(</font>Element Posn<font color=Cyan>)</font>-<a name="(line284)"></a>elementWith match tags <font color=Red>=</font> fmap snd <font color=Cyan>(</font>posnElementWith match tags<font color=Cyan>)</font>-<a name="(line285)"></a> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"Element: "</font><font color=Cyan>++</font>unwords tags<font color=Cyan>++</font><font color=Magenta>"\n"</font><font color=Cyan>)</font>-<a name="(line286)"></a>-<a name="(line287)"></a><a name="interior"></a><font color=Blue>-- | Run an XMLParser on the contents of the given element (i.e. not on the</font>-<a name="(line288)"></a><font color=Blue>-- current monadic content sequence), checking that the contents are</font>-<a name="(line289)"></a><font color=Blue>-- exhausted, before returning the calculated value within the current</font>-<a name="(line290)"></a><font color=Blue>-- parser context.</font>-<a name="(line291)"></a>interior <font color=Red>::</font> Element Posn <font color=Red>-></font> XMLParser a <font color=Red>-></font> XMLParser a-<a name="(line292)"></a>interior <font color=Cyan>(</font>Elem e <font color=Green><u>_</u></font> cs<font color=Cyan>)</font> p <font color=Red>=</font>-<a name="(line293)"></a> <font color=Green><u>case</u></font> runParser p cs <font color=Green><u>of</u></font>-<a name="(line294)"></a> <font color=Cyan>(</font>Left msg<font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> fail msg-<a name="(line295)"></a> <font color=Cyan>(</font>Right x<font color=Cyan>,</font> []<font color=Cyan>)</font> <font color=Red>-></font> return x-<a name="(line296)"></a> <font color=Cyan>(</font>Right x<font color=Cyan>,</font> ds<font color=Red>@</font><font color=Cyan>(</font>d<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line297)"></a> <font color=Red>|</font> all onlyMisc ds <font color=Red>-></font> return x-<a name="(line298)"></a> <font color=Red>|</font> otherwise <font color=Red>-></font> fail <font color=Cyan>(</font><font color=Magenta>"Too many elements inside <"</font><font color=Cyan>++</font>e<font color=Cyan>++</font><font color=Magenta>"> at\n"</font>-<a name="(line299)"></a> <font color=Cyan>++</font>show <font color=Cyan>(</font>info d<font color=Cyan>)</font><font color=Cyan>++</font><font color=Magenta>"\n"</font>-<a name="(line300)"></a> <font color=Cyan>++</font><font color=Magenta>"Found excess: "</font><font color=Cyan>++</font>verbatim d<font color=Cyan>)</font>-<a name="(line301)"></a> <font color=Green><u>where</u></font> onlyMisc <font color=Cyan>(</font>CMisc <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True-<a name="(line302)"></a> onlyMisc <font color=Cyan>(</font>CString False s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>|</font> all isSpace s <font color=Red>=</font> True-<a name="(line303)"></a> onlyMisc <font color=Green><u>_</u></font> <font color=Red>=</font> False-<a name="(line304)"></a>-<a name="(line305)"></a><a name="inElement"></a><font color=Blue>-- | A combination of element + interior.</font>-<a name="(line306)"></a>inElement <font color=Red>::</font> String <font color=Red>-></font> XMLParser a <font color=Red>-></font> XMLParser a-<a name="(line307)"></a>inElement tag p <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> e <font color=Red><-</font> element <font color=Red>[</font>tag<font color=Red>]</font><font color=Cyan>;</font> commit <font color=Cyan>(</font>interior e p<font color=Cyan>)</font> <font color=Cyan>}</font>-<a name="(line308)"></a>-<a name="(line309)"></a><a name="inElementWith"></a><font color=Blue>-- | A combination of elementWith + interior.</font>-<a name="(line310)"></a>inElementWith <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Red>-></font>Bool<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> XMLParser a <font color=Red>-></font> XMLParser a-<a name="(line311)"></a>inElementWith match tag p <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> e <font color=Red><-</font> elementWith match <font color=Red>[</font>tag<font color=Red>]</font>-<a name="(line312)"></a> <font color=Cyan>;</font> commit <font color=Cyan>(</font>interior e p<font color=Cyan>)</font> <font color=Cyan>}</font>-<a name="(line313)"></a>-<a name="(line314)"></a><a name="attributes"></a><font color=Blue>-- | Do some parsing of the attributes of the given element</font>-<a name="(line315)"></a>attributes <font color=Red>::</font> XmlAttributes a <font color=Red>=></font> Element Posn <font color=Red>-></font> XMLParser a-<a name="(line316)"></a>attributes <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>as</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> return <font color=Cyan>(</font>fromAttrs <font color=Green><u>as</u></font><font color=Cyan>)</font>-<a name="(line317)"></a>-<a name="(line318)"></a><a name="text"></a><font color=Blue>-- | 'text' is a counterpart to 'element', parsing text content if it</font>-<a name="(line319)"></a><font color=Blue>-- exists. Adjacent text and references are coalesced.</font>-<a name="(line320)"></a>text <font color=Red>::</font> XMLParser String-<a name="(line321)"></a>text <font color=Red>=</font> text' []-<a name="(line322)"></a> <font color=Green><u>where</u></font> text' acc <font color=Red>=</font>-<a name="(line323)"></a> <font color=Green><u>do</u></font> <font color=Cyan>{</font> c <font color=Red><-</font> content <font color=Magenta>"plain text"</font>-<a name="(line324)"></a> <font color=Cyan>;</font> <font color=Green><u>case</u></font> c <font color=Green><u>of</u></font>-<a name="(line325)"></a> CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font> <font color=Red>-></font> text' <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font>-<a name="(line326)"></a> CRef <font color=Cyan>(</font>RefChar s<font color=Cyan>)</font> <font color=Green><u>_</u></font> <font color=Red>-></font> text' <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"&#"</font><font color=Cyan>++</font>show s<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font> <font color=Red><b>:</b></font>acc<font color=Cyan>)</font>-<a name="(line327)"></a> CRef <font color=Cyan>(</font>RefEntity s<font color=Cyan>)</font> <font color=Green><u>_</u></font> <font color=Red>-></font> text' <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'&'</font><font color=Red><b>:</b></font>s<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font><font color=Red><b>:</b></font>acc<font color=Cyan>)</font>-<a name="(line328)"></a> CMisc <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Red>-></font> text' acc-<a name="(line329)"></a> CElem <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Red>-></font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> reparse <font color=Red>[</font>c<font color=Red>]</font> <font color=Blue>-- put it back!</font>-<a name="(line330)"></a> <font color=Cyan>;</font> <font color=Green><u>if</u></font> null acc <font color=Green><u>then</u></font> fail <font color=Magenta>"empty string"</font>-<a name="(line331)"></a> <font color=Green><u>else</u></font> return <font color=Cyan>(</font>concat <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line332)"></a> <font color=Cyan>}</font>-<a name="(line333)"></a> <font color=Cyan>}</font>-<a name="(line334)"></a> <font color=Cyan>`onFail`</font> <font color=Cyan>(</font> <font color=Green><u>if</u></font> null acc <font color=Green><u>then</u></font> fail <font color=Magenta>"empty string"</font>-<a name="(line335)"></a> <font color=Green><u>else</u></font> return <font color=Cyan>(</font>concat <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>)</font>-<a name="(line336)"></a>-<a name="(line337)"></a>-<a name="(line338)"></a><a name="choice"></a><font color=Blue>-- | 'choice f p' means if parseContents succeeds, apply f to the result,</font>-<a name="(line339)"></a><font color=Blue>-- otherwise use the continuation parser.</font>-<a name="(line340)"></a>choice <font color=Red>::</font> XmlContent a <font color=Red>=></font> <font color=Cyan>(</font>a <font color=Red>-></font> b<font color=Cyan>)</font> <font color=Red>-></font> XMLParser b <font color=Red>-></font> XMLParser b-<a name="(line341)"></a>choice cons <font color=Cyan>(</font>P other<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line342)"></a> P <font color=Cyan>(</font><font color=Red>\</font>cs<font color=Red>-></font> <font color=Green><u>case</u></font> runParser parseContents cs <font color=Green><u>of</u></font>-<a name="(line343)"></a> <font color=Cyan>(</font>Left <font color=Green><u>_</u></font><font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> other cs-<a name="(line344)"></a> <font color=Cyan>(</font>Right x<font color=Cyan>,</font> cs'<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Right <font color=Cyan>(</font>cons x<font color=Cyan>)</font><font color=Cyan>,</font> cs'<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line345)"></a>-<a name="(line346)"></a><font color=Blue>--choice cons other = fmap cons parseContents `onFail` other</font>-<a name="(line347)"></a>-<a name="(line348)"></a><a name="definite"></a><font color=Blue>-- | not sure this is needed now. 'definite p' previously ensured that</font>-<a name="(line349)"></a><font color=Blue>-- an element was definitely present. Now I think the monad might take</font>-<a name="(line350)"></a><font color=Blue>-- care of that for us.</font>-<a name="(line351)"></a>definite <font color=Red>::</font> XmlContent a <font color=Red>=></font> XMLParser a <font color=Red>-></font> String <font color=Red>-></font> String <font color=Red>-></font> XMLParser a-<a name="(line352)"></a>definite p inner tag <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>cs<font color=Red>-></font> <font color=Green><u>case</u></font> runParser p cs <font color=Green><u>of</u></font>-<a name="(line353)"></a> <font color=Cyan>(</font>Left <font color=Green><u>_</u></font><font color=Cyan>,</font> cs'<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False<font color=Cyan>,</font>msg'<font color=Cyan>)</font><font color=Cyan>,</font> cs'<font color=Cyan>)</font>-<a name="(line354)"></a> <font color=Cyan>(</font>Right x<font color=Cyan>,</font> cs'<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Right x<font color=Cyan>,</font> cs'<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line355)"></a> <font color=Green><u>where</u></font> msg' <font color=Red>=</font> <font color=Magenta>"content error: expected "</font><font color=Cyan>++</font>inner<font color=Cyan>++</font><font color=Magenta>" inside <"</font><font color=Cyan>++</font>tag-<a name="(line356)"></a> <font color=Cyan>++</font><font color=Magenta>"> element\n"</font>-<a name="(line357)"></a>-<a name="(line358)"></a><font color=Blue>------------------------------------------------------------------------</font>-<a name="(line359)"></a>-<a name="(line360)"></a><a name="XmlContent"></a><font color=Blue>-- | The @XmlContent@ class promises that an XML Content element can be</font>-<a name="(line361)"></a><a name="XmlContent"></a><font color=Blue>-- converted to and from a Haskell value.</font>-<a name="(line362)"></a><a name="XmlContent"></a><font color=Green><u>class</u></font> HTypeable a <font color=Red>=></font> XmlContent a <font color=Green><u>where</u></font>-<a name="(line363)"></a> <font color=Blue>-- | Convert from XML to Haskell</font>-<a name="(line364)"></a> parseContents <font color=Red>::</font> XMLParser a-<a name="(line365)"></a> <font color=Blue>-- | Convert from Haskell to XML</font>-<a name="(line366)"></a> toContents <font color=Red>::</font> a <font color=Red>-></font> <font color=Red>[</font>Content ()<font color=Red>]</font>-<a name="(line367)"></a>-<a name="(line368)"></a> <font color=Blue>-- | Dummy functions (for most types): used /only/ in the Char instance</font>-<a name="(line369)"></a> <font color=Blue>-- for coercing lists of Char into String.</font>-<a name="(line370)"></a> xToChar <font color=Red>::</font> a <font color=Red>-></font> Char-<a name="(line371)"></a> xFromChar <font color=Red>::</font> Char <font color=Red>-></font> a-<a name="(line372)"></a> xToChar <font color=Red>=</font> error <font color=Magenta>"HaXml.XmlContent.xToChar used in error"</font>-<a name="(line373)"></a> xFromChar <font color=Red>=</font> error <font color=Magenta>"HaXml.XmlContent.xFromChar used in error"</font>-<a name="(line374)"></a>-<a name="(line375)"></a><a name="XmlAttributes"></a><font color=Blue>-- | The @XmlAttributes@ class promises that a list of XML tag attributes</font>-<a name="(line376)"></a><a name="XmlAttributes"></a><font color=Blue>-- can be converted to and from a Haskell value.</font>-<a name="(line377)"></a><a name="XmlAttributes"></a><font color=Green><u>class</u></font> XmlAttributes a <font color=Green><u>where</u></font>-<a name="(line378)"></a> fromAttrs <font color=Red>::</font> <font color=Red>[</font>Attribute<font color=Red>]</font> <font color=Red>-></font> a-<a name="(line379)"></a> toAttrs <font color=Red>::</font> a <font color=Red>-></font> <font color=Red>[</font>Attribute<font color=Red>]</font>-<a name="(line380)"></a><a name="XmlAttrType"></a><font color=Blue>-- | The @XmlAttrType@ class promises that an attribute taking an XML</font>-<a name="(line381)"></a><a name="XmlAttrType"></a><font color=Blue>-- enumerated type can be converted to and from a Haskell value.</font>-<a name="(line382)"></a><a name="XmlAttrType"></a><font color=Green><u>class</u></font> XmlAttrType a <font color=Green><u>where</u></font>-<a name="(line383)"></a> fromAttrToTyp <font color=Red>::</font> String <font color=Red>-></font> Attribute <font color=Red>-></font> Maybe a-<a name="(line384)"></a> toAttrFrTyp <font color=Red>::</font> String <font color=Red>-></font> a <font color=Red>-></font> Maybe Attribute-<a name="(line385)"></a>-<a name="(line386)"></a>-<a name="(line387)"></a><font color=Blue>------------------------------------------------------------------------</font>-<a name="(line388)"></a><font color=Blue>-- Instances for all the standard basic datatypes.</font>-<a name="(line389)"></a><font color=Blue>-- These are for Haskell datatypes being derived to go to XML.</font>-<a name="(line390)"></a><font color=Blue>-- DtdToHaskell does not use these instances.</font>-<a name="(line391)"></a><font color=Blue>------------------------------------------------------------------------</font>-<a name="(line392)"></a>-<a name="(line393)"></a><font color=Green><u>instance</u></font> XmlContent Bool <font color=Green><u>where</u></font>-<a name="(line394)"></a> toContents b <font color=Red>=</font> <font color=Red>[</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"bool"</font> <font color=Red>[</font>mkAttr <font color=Magenta>"value"</font> <font color=Cyan>(</font>show b<font color=Cyan>)</font><font color=Red>]</font> []<font color=Cyan>)</font> ()<font color=Red>]</font>-<a name="(line395)"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> e <font color=Red><-</font> element <font color=Red>[</font><font color=Magenta>"bool"</font><font color=Red>]</font> <font color=Cyan>;</font> return <font color=Cyan>(</font>attval e<font color=Cyan>)</font> <font color=Cyan>}</font>-<a name="(line396)"></a>-<a name="(line397)"></a><font color=Green><u>instance</u></font> XmlContent Int <font color=Green><u>where</u></font>-<a name="(line398)"></a> toContents i <font color=Red>=</font> <font color=Red>[</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"int"</font> <font color=Red>[</font>mkAttr <font color=Magenta>"value"</font> <font color=Cyan>(</font>show i<font color=Cyan>)</font><font color=Red>]</font> []<font color=Cyan>)</font> ()<font color=Red>]</font>-<a name="(line399)"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> e <font color=Red><-</font> element <font color=Red>[</font><font color=Magenta>"int"</font><font color=Red>]</font> <font color=Cyan>;</font> return <font color=Cyan>(</font>attval e<font color=Cyan>)</font> <font color=Cyan>}</font>-<a name="(line400)"></a>-<a name="(line401)"></a><font color=Green><u>instance</u></font> XmlContent Integer <font color=Green><u>where</u></font>-<a name="(line402)"></a> toContents i <font color=Red>=</font> <font color=Red>[</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"integer"</font> <font color=Red>[</font>mkAttr <font color=Magenta>"value"</font> <font color=Cyan>(</font>show i<font color=Cyan>)</font><font color=Red>]</font> []<font color=Cyan>)</font> ()<font color=Red>]</font>-<a name="(line403)"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> e <font color=Red><-</font> element <font color=Red>[</font><font color=Magenta>"integer"</font><font color=Red>]</font> <font color=Cyan>;</font> return <font color=Cyan>(</font>attval e<font color=Cyan>)</font> <font color=Cyan>}</font>-<a name="(line404)"></a>-<a name="(line405)"></a><font color=Green><u>instance</u></font> XmlContent Float <font color=Green><u>where</u></font>-<a name="(line406)"></a> toContents i <font color=Red>=</font> <font color=Red>[</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"float"</font> <font color=Red>[</font>mkAttr <font color=Magenta>"value"</font> <font color=Cyan>(</font>show i<font color=Cyan>)</font><font color=Red>]</font> []<font color=Cyan>)</font> ()<font color=Red>]</font>-<a name="(line407)"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> e <font color=Red><-</font> element <font color=Red>[</font><font color=Magenta>"float"</font><font color=Red>]</font> <font color=Cyan>;</font> return <font color=Cyan>(</font>attval e<font color=Cyan>)</font> <font color=Cyan>}</font>-<a name="(line408)"></a>-<a name="(line409)"></a><font color=Green><u>instance</u></font> XmlContent Double <font color=Green><u>where</u></font>-<a name="(line410)"></a> toContents i <font color=Red>=</font> <font color=Red>[</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"double"</font> <font color=Red>[</font>mkAttr <font color=Magenta>"value"</font> <font color=Cyan>(</font>show i<font color=Cyan>)</font><font color=Red>]</font> []<font color=Cyan>)</font> ()<font color=Red>]</font>-<a name="(line411)"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> e <font color=Red><-</font> element <font color=Red>[</font><font color=Magenta>"double"</font><font color=Red>]</font> <font color=Cyan>;</font> return <font color=Cyan>(</font>attval e<font color=Cyan>)</font> <font color=Cyan>}</font>-<a name="(line412)"></a>-<a name="(line413)"></a><font color=Green><u>instance</u></font> XmlContent Char <font color=Green><u>where</u></font>-<a name="(line414)"></a> <font color=Blue>-- NOT in a string</font>-<a name="(line415)"></a> toContents c <font color=Red>=</font> <font color=Red>[</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"char"</font> <font color=Red>[</font>mkAttr <font color=Magenta>"value"</font> <font color=Red>[</font>c<font color=Red>]</font><font color=Red>]</font> []<font color=Cyan>)</font> ()<font color=Red>]</font>-<a name="(line416)"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Red>[</font><font color=Cyan>(</font><font color=Magenta>"value"</font><font color=Cyan>,</font><font color=Cyan>(</font>AttValue <font color=Red>[</font>Left <font color=Red>[</font>c<font color=Red>]</font><font color=Red>]</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Red>]</font> []<font color=Cyan>)</font>-<a name="(line417)"></a> <font color=Red><-</font> element <font color=Red>[</font><font color=Magenta>"char"</font><font color=Red>]</font>-<a name="(line418)"></a> <font color=Cyan>;</font> return c-<a name="(line419)"></a> <font color=Cyan>}</font>-<a name="(line420)"></a> <font color=Blue>-- Only defined for Char and no other types:</font>-<a name="(line421)"></a> xToChar <font color=Red>=</font> id-<a name="(line422)"></a> xFromChar <font color=Red>=</font> id-<a name="(line423)"></a>-<a name="(line424)"></a><font color=Green><u>instance</u></font> XmlContent a <font color=Red>=></font> XmlContent <font color=Red>[</font>a<font color=Red>]</font> <font color=Green><u>where</u></font>-<a name="(line425)"></a> toContents xs <font color=Red>=</font> <font color=Green><u>case</u></font> toHType x <font color=Green><u>of</u></font>-<a name="(line426)"></a> <font color=Cyan>(</font>Prim <font color=Magenta>"Char"</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font>-<a name="(line427)"></a> <font color=Red>[</font>mkElem <font color=Magenta>"string"</font> <font color=Red>[</font>CString True <font color=Cyan>(</font>map xToChar xs<font color=Cyan>)</font> ()<font color=Red>]</font><font color=Red>]</font>-<a name="(line428)"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> <font color=Red>[</font>mkElem xs <font color=Cyan>(</font>concatMap toContents xs<font color=Cyan>)</font><font color=Red>]</font>-<a name="(line429)"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>x<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> xs-<a name="(line430)"></a> parseContents <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>x <font color=Red>-></font>-<a name="(line431)"></a> <font color=Green><u>case</u></font> x <font color=Green><u>of</u></font>-<a name="(line432)"></a> <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Red><b>:</b></font>cs<font color=Cyan>)</font>-<a name="(line433)"></a> <font color=Red>-></font> <font color=Cyan>(</font>Right <font color=Cyan>(</font>map xFromChar s<font color=Cyan>)</font><font color=Cyan>,</font> cs<font color=Cyan>)</font>-<a name="(line434)"></a> <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"string"</font> [] <font color=Red>[</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Red>]</font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Red><b>:</b></font>cs<font color=Cyan>)</font>-<a name="(line435)"></a> <font color=Red>-></font> <font color=Cyan>(</font>Right <font color=Cyan>(</font>map xFromChar s<font color=Cyan>)</font><font color=Cyan>,</font> cs<font color=Cyan>)</font>-<a name="(line436)"></a> <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem e [] xs<font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Red><b>:</b></font>cs<font color=Cyan>)</font> <font color=Red>|</font> <font color=Magenta>"list"</font> <font color=Cyan>`isPrefixOf`</font> e-<a name="(line437)"></a> <font color=Red>-></font> scanElements xs-<a name="(line438)"></a> <font color=Green><u>where</u></font>-<a name="(line439)"></a> <font color=Blue>-- scanElements :: [Content] -> (Either String [a],[Content])</font>-<a name="(line440)"></a> scanElements [] <font color=Red>=</font> <font color=Cyan>(</font>Right []<font color=Cyan>,</font> cs<font color=Cyan>)</font>-<a name="(line441)"></a> scanElements es <font color=Red>=</font>-<a name="(line442)"></a> <font color=Green><u>case</u></font> runParser parseContents es <font color=Green><u>of</u></font>-<a name="(line443)"></a> <font color=Cyan>(</font>Left msg<font color=Cyan>,</font> es'<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False<font color=Cyan>,</font>msg<font color=Cyan>)</font><font color=Cyan>,</font> es'<font color=Cyan>)</font>-<a name="(line444)"></a> <font color=Cyan>(</font>Right y<font color=Cyan>,</font> es'<font color=Cyan>)</font> <font color=Red>-></font>-<a name="(line445)"></a> <font color=Green><u>case</u></font> scanElements es' <font color=Green><u>of</u></font>-<a name="(line446)"></a> <font color=Cyan>(</font>Left msg<font color=Cyan>,</font> ds<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Left msg<font color=Cyan>,</font> ds<font color=Cyan>)</font>-<a name="(line447)"></a> <font color=Cyan>(</font>Right ys<font color=Cyan>,</font> ds<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Right <font color=Cyan>(</font>y<font color=Red><b>:</b></font>ys<font color=Cyan>)</font><font color=Cyan>,</font> ds<font color=Cyan>)</font>-<a name="(line448)"></a> <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem e <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font> cs<font color=Cyan>)</font>-<a name="(line449)"></a> <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False-<a name="(line450)"></a> <font color=Cyan>,</font><font color=Magenta>"Expected a <list-...>, but found a <"</font><font color=Cyan>++</font>e<font color=Cyan>++</font><font color=Magenta>"> at\n"</font>-<a name="(line451)"></a> <font color=Cyan>++</font> show pos<font color=Cyan>)</font><font color=Cyan>,</font> cs<font color=Cyan>)</font>-<a name="(line452)"></a> <font color=Cyan>(</font>CRef r pos<font color=Red><b>:</b></font> cs<font color=Cyan>)</font>-<a name="(line453)"></a> <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False-<a name="(line454)"></a> <font color=Cyan>,</font><font color=Magenta>"Expected a <list-...>, but found a ref "</font>-<a name="(line455)"></a> <font color=Cyan>++</font>verbatim r<font color=Cyan>++</font><font color=Magenta>" at\n"</font><font color=Cyan>++</font> show pos<font color=Cyan>)</font><font color=Cyan>,</font> cs<font color=Cyan>)</font>-<a name="(line456)"></a> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>cs<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Red>\</font> <font color=Cyan>(</font>P p<font color=Cyan>)</font><font color=Red>-></font> p<font color=Cyan>)</font> parseContents<font color=Cyan>)</font> cs <font color=Blue>-- skip comments etc.</font>-<a name="(line457)"></a> [] <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False-<a name="(line458)"></a> <font color=Cyan>,</font><font color=Magenta>"Ran out of input XML whilst secondary parsing"</font><font color=Cyan>)</font>-<a name="(line459)"></a> <font color=Cyan>,</font> []<font color=Cyan>)</font>-<a name="(line460)"></a> <font color=Cyan>)</font>-<a name="(line461)"></a>-<a name="(line462)"></a><font color=Green><u>instance</u></font> XmlContent () <font color=Green><u>where</u></font>-<a name="(line463)"></a> toContents () <font color=Red>=</font> <font color=Red>[</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"unit"</font> [] []<font color=Cyan>)</font> ()<font color=Red>]</font>-<a name="(line464)"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> element <font color=Red>[</font><font color=Magenta>"unit"</font><font color=Red>]</font><font color=Cyan>;</font> return () <font color=Cyan>}</font>-<a name="(line465)"></a>-<a name="(line466)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>)</font> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line467)"></a> toContents <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font> <font color=Red>=</font> toContents a <font color=Cyan>++</font> toContents b-<a name="(line468)"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line469)"></a> <font color=Cyan>{</font> a <font color=Red><-</font> parseContents-<a name="(line470)"></a> <font color=Cyan>;</font> b <font color=Red><-</font> parseContents-<a name="(line471)"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font>-<a name="(line472)"></a> <font color=Cyan>}</font>-<a name="(line473)"></a>-<a name="(line474)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>,</font> XmlContent c<font color=Cyan>)</font> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line475)"></a> toContents <font color=Cyan>(</font>x<font color=Cyan>,</font>y<font color=Cyan>,</font>z<font color=Cyan>)</font> <font color=Red>=</font> toContents x <font color=Cyan>++</font> toContents y <font color=Cyan>++</font> toContents z-<a name="(line476)"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line477)"></a> <font color=Cyan>{</font> a <font color=Red><-</font> parseContents-<a name="(line478)"></a> <font color=Cyan>;</font> b <font color=Red><-</font> parseContents-<a name="(line479)"></a> <font color=Cyan>;</font> c <font color=Red><-</font> parseContents-<a name="(line480)"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font>-<a name="(line481)"></a> <font color=Cyan>}</font>-<a name="(line482)"></a>-<a name="(line483)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>,</font> XmlContent c<font color=Cyan>,</font> XmlContent d<font color=Cyan>)</font> <font color=Red>=></font>-<a name="(line484)"></a> XmlContent <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line485)"></a> toContents <font color=Cyan>(</font>x<font color=Cyan>,</font>y<font color=Cyan>,</font>z<font color=Cyan>,</font>t<font color=Cyan>)</font> <font color=Red>=</font> toContents x <font color=Cyan>++</font> toContents y <font color=Cyan>++</font> toContents z-<a name="(line486)"></a> <font color=Cyan>++</font> toContents t-<a name="(line487)"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line488)"></a> <font color=Cyan>{</font> a <font color=Red><-</font> parseContents-<a name="(line489)"></a> <font color=Cyan>;</font> b <font color=Red><-</font> parseContents-<a name="(line490)"></a> <font color=Cyan>;</font> c <font color=Red><-</font> parseContents-<a name="(line491)"></a> <font color=Cyan>;</font> d <font color=Red><-</font> parseContents-<a name="(line492)"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>)</font>-<a name="(line493)"></a> <font color=Cyan>}</font>-<a name="(line494)"></a>-<a name="(line495)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>,</font> XmlContent c<font color=Cyan>,</font> XmlContent d-<a name="(line496)"></a> <font color=Cyan>,</font> XmlContent e <font color=Cyan>)</font> <font color=Red>=></font>-<a name="(line497)"></a> XmlContent <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line498)"></a> toContents <font color=Cyan>(</font>x<font color=Cyan>,</font>y<font color=Cyan>,</font>z<font color=Cyan>,</font>t<font color=Cyan>,</font>u<font color=Cyan>)</font> <font color=Red>=</font> toContents x <font color=Cyan>++</font> toContents y <font color=Cyan>++</font> toContents z-<a name="(line499)"></a> <font color=Cyan>++</font> toContents t <font color=Cyan>++</font> toContents u-<a name="(line500)"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line501)"></a> <font color=Cyan>{</font> a <font color=Red><-</font> parseContents-<a name="(line502)"></a> <font color=Cyan>;</font> b <font color=Red><-</font> parseContents-<a name="(line503)"></a> <font color=Cyan>;</font> c <font color=Red><-</font> parseContents-<a name="(line504)"></a> <font color=Cyan>;</font> d <font color=Red><-</font> parseContents-<a name="(line505)"></a> <font color=Cyan>;</font> e <font color=Red><-</font> parseContents-<a name="(line506)"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>)</font>-<a name="(line507)"></a> <font color=Cyan>}</font>-<a name="(line508)"></a>-<a name="(line509)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>,</font> XmlContent c<font color=Cyan>,</font> XmlContent d-<a name="(line510)"></a> <font color=Cyan>,</font> XmlContent e<font color=Cyan>,</font> XmlContent f <font color=Cyan>)</font> <font color=Red>=></font>-<a name="(line511)"></a> XmlContent <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line512)"></a> toContents <font color=Cyan>(</font>x<font color=Cyan>,</font>y<font color=Cyan>,</font>z<font color=Cyan>,</font>t<font color=Cyan>,</font>u<font color=Cyan>,</font>v<font color=Cyan>)</font> <font color=Red>=</font> toContents x <font color=Cyan>++</font> toContents y <font color=Cyan>++</font> toContents z-<a name="(line513)"></a> <font color=Cyan>++</font> toContents t <font color=Cyan>++</font> toContents u <font color=Cyan>++</font> toContents v-<a name="(line514)"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line515)"></a> <font color=Cyan>{</font> a <font color=Red><-</font> parseContents-<a name="(line516)"></a> <font color=Cyan>;</font> b <font color=Red><-</font> parseContents-<a name="(line517)"></a> <font color=Cyan>;</font> c <font color=Red><-</font> parseContents-<a name="(line518)"></a> <font color=Cyan>;</font> d <font color=Red><-</font> parseContents-<a name="(line519)"></a> <font color=Cyan>;</font> e <font color=Red><-</font> parseContents-<a name="(line520)"></a> <font color=Cyan>;</font> f <font color=Red><-</font> parseContents-<a name="(line521)"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>)</font>-<a name="(line522)"></a> <font color=Cyan>}</font>-<a name="(line523)"></a>-<a name="(line524)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>)</font> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>Maybe a<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line525)"></a> toContents m <font color=Red>=</font> <font color=Red>[</font>mkElem m <font color=Cyan>(</font>maybe [] toContents m<font color=Cyan>)</font><font color=Red>]</font>-<a name="(line526)"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>-<a name="(line527)"></a> <font color=Cyan>{</font> e <font color=Red><-</font> elementWith <font color=Cyan>(</font>flip isPrefixOf<font color=Cyan>)</font> <font color=Red>[</font><font color=Magenta>"maybe"</font><font color=Red>]</font>-<a name="(line528)"></a> <font color=Cyan>;</font> <font color=Green><u>case</u></font> e <font color=Green><u>of</u></font> <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> [] []<font color=Cyan>)</font> <font color=Red>-></font> return Nothing-<a name="(line529)"></a> <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> [] <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> fmap Just <font color=Cyan>(</font>interior e parseContents<font color=Cyan>)</font>-<a name="(line530)"></a> <font color=Cyan>}</font>-<a name="(line531)"></a>-<a name="(line532)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>)</font> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>Either a b<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line533)"></a> toContents v<font color=Red>@</font><font color=Cyan>(</font>Left aa<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line534)"></a> <font color=Red>[</font>mkElemC <font color=Cyan>(</font>showConstr <font color=Magenta>0</font> <font color=Cyan>(</font>toHType v<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>toContents aa<font color=Cyan>)</font><font color=Red>]</font>-<a name="(line535)"></a> toContents v<font color=Red>@</font><font color=Cyan>(</font>Right ab<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line536)"></a> <font color=Red>[</font>mkElemC <font color=Cyan>(</font>showConstr <font color=Magenta>1</font> <font color=Cyan>(</font>toHType v<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>toContents ab<font color=Cyan>)</font><font color=Red>]</font>-<a name="(line537)"></a> parseContents <font color=Red>=</font>-<a name="(line538)"></a> <font color=Cyan>(</font>inElementWith <font color=Cyan>(</font>flip isPrefixOf<font color=Cyan>)</font> <font color=Magenta>"Left"</font> <font color=Cyan>$</font> fmap Left parseContents<font color=Cyan>)</font>-<a name="(line539)"></a> <font color=Cyan>`onFail`</font>-<a name="(line540)"></a> <font color=Cyan>(</font>inElementWith <font color=Cyan>(</font>flip isPrefixOf<font color=Cyan>)</font> <font color=Magenta>"Right"</font> <font color=Cyan>$</font> fmap Right parseContents<font color=Cyan>)</font>-<a name="(line541)"></a>-<a name="(line542)"></a><font color=Blue>-- do{ e@(Elem t [] _) <- element ["Left","Right"]</font>-<a name="(line543)"></a><font color=Blue>-- ; case t of</font>-<a name="(line544)"></a><font color=Blue>-- _ | "Left" `isPrefixOf` t -> fmap Left (interior e parseContents)</font>-<a name="(line545)"></a><font color=Blue>-- | "Right" `isPrefixOf` t -> fmap Right (interior e parseContents)</font>-<a name="(line546)"></a><font color=Blue>-- }</font>-<a name="(line547)"></a>-<a name="(line548)"></a>-<a name="(line549)"></a><font color=Blue>------------------------------------------------------------------------</font>-<a name="(line550)"></a><font color=Blue>-- Useful auxiliaries for "fromAttributes"</font>-<a name="(line551)"></a><font color=Blue>------------------------------------------------------------------------</font>-<a name="(line552)"></a>-<a name="(line553)"></a><a name="Defaultable"></a><font color=Blue>-- | If an attribute is defaultable, then it either takes the default</font>-<a name="(line554)"></a><a name="Defaultable"></a><font color=Blue>-- value (which is omitted from the output), or a non-default value</font>-<a name="(line555)"></a><a name="Defaultable"></a><font color=Blue>-- (which obviously must be printed).</font>-<a name="(line556)"></a><a name="Defaultable"></a><font color=Green><u>data</u></font> Defaultable a <font color=Red>=</font> Default a <font color=Red>|</font> NonDefault a <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-<a name="(line557)"></a>-<a name="(line558)"></a><a name="searchMaybe"></a>searchMaybe <font color=Red>::</font> <font color=Cyan>(</font>a <font color=Red>-></font> Maybe b<font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-></font> Maybe b-<a name="(line559)"></a>searchMaybe <font color=Green><u>_</u></font> [] <font color=Red>=</font> Nothing-<a name="(line560)"></a>searchMaybe f <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line561)"></a> <font color=Green><u>let</u></font> fx <font color=Red>=</font> f x <font color=Green><u>in</u></font>-<a name="(line562)"></a> <font color=Green><u>case</u></font> fx <font color=Green><u>of</u></font>-<a name="(line563)"></a> Nothing <font color=Red>-></font> searchMaybe f xs-<a name="(line564)"></a> <font color=Cyan>(</font>Just <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> fx-<a name="(line565)"></a>-<a name="(line566)"></a><a name="maybeToAttr"></a>maybeToAttr <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>a<font color=Red>-></font>Maybe Attribute<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> Maybe a-<a name="(line567)"></a> <font color=Red>-></font> Maybe Attribute-<a name="(line568)"></a>maybeToAttr <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> Nothing <font color=Red>=</font> Nothing-<a name="(line569)"></a>maybeToAttr to n <font color=Cyan>(</font>Just v<font color=Cyan>)</font> <font color=Red>=</font> to n v-<a name="(line570)"></a>-<a name="(line571)"></a><a name="defaultToAttr"></a>defaultToAttr <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>a<font color=Red>-></font>Maybe Attribute<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> Defaultable a-<a name="(line572)"></a> <font color=Red>-></font> Maybe Attribute-<a name="(line573)"></a>defaultToAttr <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Cyan>(</font>Default <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> Nothing-<a name="(line574)"></a>defaultToAttr to n <font color=Cyan>(</font>NonDefault v<font color=Cyan>)</font> <font color=Red>=</font> to n v-<a name="(line575)"></a>-<a name="(line576)"></a><a name="definiteA"></a>definiteA <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>Attribute<font color=Red>-></font>Maybe a<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> String-<a name="(line577)"></a> <font color=Red>-></font> <font color=Red>[</font>Attribute<font color=Red>]</font> <font color=Red>-></font> a-<a name="(line578)"></a>definiteA from tag at <font color=Green><u>as</u></font> <font color=Red>=</font>-<a name="(line579)"></a> <font color=Green><u>case</u></font> searchMaybe <font color=Cyan>(</font>from at<font color=Cyan>)</font> <font color=Green><u>as</u></font> <font color=Green><u>of</u></font>-<a name="(line580)"></a> Nothing <font color=Red>-></font> error <font color=Cyan>(</font><font color=Magenta>"missing attribute "</font><font color=Cyan>++</font>at<font color=Cyan>++</font><font color=Magenta>" in tag <"</font><font color=Cyan>++</font>tag<font color=Cyan>++</font><font color=Magenta>">"</font><font color=Cyan>)</font>-<a name="(line581)"></a> <font color=Cyan>(</font>Just a<font color=Cyan>)</font> <font color=Red>-></font> a-<a name="(line582)"></a>-<a name="(line583)"></a><a name="defaultA"></a>defaultA <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>Attribute<font color=Red>-></font>Maybe a<font color=Cyan>)</font> <font color=Red>-></font> a <font color=Red>-></font> String-<a name="(line584)"></a> <font color=Red>-></font> <font color=Red>[</font>Attribute<font color=Red>]</font> <font color=Red>-></font> Defaultable a-<a name="(line585)"></a>defaultA from def at <font color=Green><u>as</u></font> <font color=Red>=</font>-<a name="(line586)"></a> <font color=Green><u>case</u></font> searchMaybe <font color=Cyan>(</font>from at<font color=Cyan>)</font> <font color=Green><u>as</u></font> <font color=Green><u>of</u></font>-<a name="(line587)"></a> Nothing <font color=Red>-></font> Default def-<a name="(line588)"></a> <font color=Cyan>(</font>Just a<font color=Cyan>)</font> <font color=Red>-></font> NonDefault a-<a name="(line589)"></a>-<a name="(line590)"></a><a name="possibleA"></a>possibleA <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>Attribute<font color=Red>-></font>Maybe a<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> <font color=Red>[</font>Attribute<font color=Red>]</font> <font color=Red>-></font> Maybe a-<a name="(line591)"></a>possibleA from at <font color=Green><u>as</u></font> <font color=Red>=</font> searchMaybe <font color=Cyan>(</font>from at<font color=Cyan>)</font> <font color=Green><u>as</u></font>-<a name="(line592)"></a>-<a name="(line593)"></a><a name="fromAttrToStr"></a>fromAttrToStr <font color=Red>::</font> String <font color=Red>-></font> Attribute <font color=Red>-></font> Maybe String-<a name="(line594)"></a>fromAttrToStr n <font color=Cyan>(</font>n0<font color=Cyan>,</font>v<font color=Cyan>)</font>-<a name="(line595)"></a> <font color=Red>|</font> n <font color=Cyan>==</font> n0 <font color=Red>=</font> Just <font color=Cyan>(</font>attr2str v<font color=Cyan>)</font>-<a name="(line596)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> Nothing-<a name="(line597)"></a>-<a name="(line598)"></a><a name="toAttrFrStr"></a>toAttrFrStr <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Maybe Attribute-<a name="(line599)"></a>toAttrFrStr n v <font color=Red>=</font> Just <font color=Cyan>(</font>n<font color=Cyan>,</font> str2attr v<font color=Cyan>)</font>-<a name="(line600)"></a>-<a name="(line601)"></a><a name="str2attr"></a>str2attr <font color=Red>::</font> String <font color=Red>-></font> AttValue-<a name="(line602)"></a>str2attr s <font color=Red>=</font>-<a name="(line603)"></a> <font color=Green><u>let</u></font> f t <font color=Red>=</font>-<a name="(line604)"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>l<font color=Cyan>,</font>r<font color=Cyan>)</font> <font color=Red>=</font> span <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font> not <font color=Cyan>(</font>elem c <font color=Magenta>"\"&<>'"</font><font color=Cyan>)</font><font color=Cyan>)</font> t-<a name="(line605)"></a> <font color=Green><u>in</u></font> <font color=Green><u>if</u></font> null r <font color=Green><u>then</u></font> <font color=Red>[</font>Left l<font color=Red>]</font>-<a name="(line606)"></a> <font color=Green><u>else</u></font> Left l<font color=Red><b>:</b></font> Right <font color=Cyan>(</font>g <font color=Cyan>(</font>head r<font color=Cyan>)</font><font color=Cyan>)</font><font color=Red><b>:</b></font> f <font color=Cyan>(</font>tail r<font color=Cyan>)</font>-<a name="(line607)"></a> g <font color=Magenta>'"'</font> <font color=Red>=</font> RefEntity <font color=Magenta>"quot"</font>-<a name="(line608)"></a> g <font color=Magenta>'&'</font> <font color=Red>=</font> RefEntity <font color=Magenta>"amp"</font>-<a name="(line609)"></a> g <font color=Magenta>'<'</font> <font color=Red>=</font> RefEntity <font color=Magenta>"lt"</font>-<a name="(line610)"></a> g <font color=Magenta>'>'</font> <font color=Red>=</font> RefEntity <font color=Magenta>"gt"</font>-<a name="(line611)"></a> g <font color=Magenta>'\''</font> <font color=Red>=</font> RefEntity <font color=Magenta>"apos"</font>-<a name="(line612)"></a> <font color=Green><u>in</u></font> AttValue <font color=Cyan>(</font>f s<font color=Cyan>)</font>-<a name="(line613)"></a>-<a name="(line614)"></a><a name="attr2str"></a>attr2str <font color=Red>::</font> AttValue <font color=Red>-></font> String <font color=Blue>-- really needs symbol table</font>-<a name="(line615)"></a>attr2str <font color=Cyan>(</font>AttValue xs<font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line616)"></a> <font color=Green><u>let</u></font> f <font color=Cyan>(</font>Left s<font color=Cyan>)</font> <font color=Red>=</font> s-<a name="(line617)"></a> f <font color=Cyan>(</font>Right <font color=Cyan>(</font>RefChar i<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>chr i<font color=Red>]</font>-<a name="(line618)"></a> f <font color=Cyan>(</font>Right <font color=Cyan>(</font>RefEntity <font color=Magenta>"quot"</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"\""</font>-<a name="(line619)"></a> f <font color=Cyan>(</font>Right <font color=Cyan>(</font>RefEntity <font color=Magenta>"amp"</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"&"</font>-<a name="(line620)"></a> f <font color=Cyan>(</font>Right <font color=Cyan>(</font>RefEntity <font color=Magenta>"lt"</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"<"</font>-<a name="(line621)"></a> f <font color=Cyan>(</font>Right <font color=Cyan>(</font>RefEntity <font color=Magenta>"gt"</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>">"</font>-<a name="(line622)"></a> f <font color=Cyan>(</font>Right <font color=Cyan>(</font>RefEntity <font color=Magenta>"apos"</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"'"</font>-<a name="(line623)"></a> f <font color=Cyan>(</font>Right <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"*"</font> <font color=Blue>-- Ooops, ST needed here.</font>-<a name="(line624)"></a> <font color=Green><u>in</u></font> concatMap f xs-<a name="(line625)"></a>-<a name="(line626)"></a><font color=Blue>------------------------------------------------------------------------</font>-<a name="(line627)"></a><font color=Blue>-- New content-model types</font>-<a name="(line628)"></a><font color=Blue>------------------------------------------------------------------------</font>-<a name="(line629)"></a>-<a name="(line630)"></a><font color=Blue>{--<a name="(line631)"></a>data OneOf2 a b-<a name="(line632)"></a>data OneOf3 a b c-<a name="(line633)"></a>data OneOf4 a b c d-<a name="(line634)"></a> ... etc are now defined (with instances) in module OneOfN.-<a name="(line635)"></a>-}</font>-<a name="(line636)"></a>-<a name="(line637)"></a><a name="ANYContent"></a><font color=Blue>-- | A type corresponding to XML's ANY contentspec.</font>-<a name="(line638)"></a><a name="ANYContent"></a><font color=Blue>-- It is either a list of unconverted xml 'Content'</font>-<a name="(line639)"></a><a name="ANYContent"></a><font color=Blue>-- or some 'XmlContent'-able value.</font>-<a name="(line640)"></a><a name="ANYContent"></a><font color=Blue>--</font>-<a name="(line641)"></a><a name="ANYContent"></a><font color=Blue>-- Parsing functions (e.g. 'parseContents') will always produce 'UnConverted'.</font>-<a name="(line642)"></a><a name="ANYContent"></a><font color=Blue>-- Note: The Show instance for 'UnConverted' uses 'verbatim'.</font>-<a name="(line643)"></a><a name="ANYContent"></a><font color=Green><u>data</u></font> ANYContent <font color=Red>=</font> <font color=Green><u>forall</u></font> a <font color=Cyan>.</font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font> Show a<font color=Cyan>)</font> <font color=Red>=></font> ANYContent a-<a name="(line644)"></a> <font color=Red>|</font> UnConverted <font color=Red>[</font>Content Posn<font color=Red>]</font>-<a name="(line645)"></a>-<a name="(line646)"></a><font color=Green><u>instance</u></font> Show ANYContent <font color=Green><u>where</u></font>-<a name="(line647)"></a> show <font color=Cyan>(</font>UnConverted c<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"UnConverted "</font> <font color=Cyan>++</font> <font color=Cyan>(</font>show <font color=Cyan>$</font> map verbatim c<font color=Cyan>)</font>-<a name="(line648)"></a> show <font color=Cyan>(</font>ANYContent a<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"ANYContent "</font> <font color=Cyan>++</font> <font color=Cyan>(</font>show a<font color=Cyan>)</font>-<a name="(line649)"></a>-<a name="(line650)"></a><font color=Green><u>instance</u></font> Eq ANYContent <font color=Green><u>where</u></font>-<a name="(line651)"></a> a <font color=Cyan>==</font> b <font color=Red>=</font> show a <font color=Cyan>==</font> show b-<a name="(line652)"></a>-<a name="(line653)"></a><a name="List1"></a><font color=Blue>-- | The List1 type represents lists with at least one element.</font>-<a name="(line654)"></a><a name="List1"></a><font color=Blue>-- It is required for DTD content models that use + as a modifier.</font>-<a name="(line655)"></a><a name="List1"></a><font color=Green><u>data</u></font> List1 a <font color=Red>=</font> NonEmpty <font color=Red>[</font>a<font color=Red>]</font> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font> Show<font color=Cyan>)</font>-<a name="(line656)"></a>-<a name="(line657)"></a>-<a name="(line658)"></a><font color=Blue>------------------------------------------------------------------------</font>-<a name="(line659)"></a><font color=Blue>-- Instances for new content-model types</font>-<a name="(line660)"></a><font color=Blue>------------------------------------------------------------------------</font>-<a name="(line661)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>)</font> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>List1 a<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line662)"></a> toHType m <font color=Red>=</font> Defined <font color=Magenta>"List1"</font> <font color=Red>[</font>hx<font color=Red>]</font>-<a name="(line663)"></a> <font color=Red>[</font>Constr <font color=Magenta>"NonEmpty"</font> <font color=Red>[</font>hx<font color=Red>]</font> <font color=Red>[</font>List hx<font color=Red>]</font> <font color=Blue>{-Nothing-}</font><font color=Red>]</font>-<a name="(line664)"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>NonEmpty x<font color=Cyan>)</font> <font color=Red>=</font> m-<a name="(line665)"></a> hx <font color=Red>=</font> toHType x-<a name="(line666)"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>)</font> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>List1 a<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line667)"></a> toContents <font color=Cyan>(</font>NonEmpty xs<font color=Cyan>)</font> <font color=Red>=</font> concatMap toContents xs-<a name="(line668)"></a> parseContents <font color=Red>=</font> fmap NonEmpty <font color=Cyan>$</font> many1 parseContents-<a name="(line669)"></a>-<a name="(line670)"></a><font color=Green><u>instance</u></font> HTypeable ANYContent <font color=Green><u>where</u></font>-<a name="(line671)"></a> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Prim <font color=Magenta>"ANYContent"</font> <font color=Magenta>"ANY"</font>-<a name="(line672)"></a><font color=Green><u>instance</u></font> XmlContent ANYContent <font color=Green><u>where</u></font>-<a name="(line673)"></a> toContents <font color=Cyan>(</font>ANYContent a<font color=Cyan>)</font> <font color=Red>=</font> toContents a-<a name="(line674)"></a> toContents <font color=Cyan>(</font>UnConverted s<font color=Cyan>)</font> <font color=Red>=</font> map <font color=Cyan>(</font>fmap <font color=Cyan>(</font>const ()<font color=Cyan>)</font><font color=Cyan>)</font> s-<a name="(line675)"></a> parseContents <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>cs <font color=Red>-></font> <font color=Cyan>(</font>Right <font color=Cyan>(</font>UnConverted cs<font color=Cyan>)</font><font color=Cyan>,</font> []<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line676)"></a>-<a name="(line677)"></a><font color=Blue>------------------------------------------------------------------------</font>-<a name="(line678)"></a><font color=Blue>--</font>-<a name="(line679)"></a><font color=Blue>------------------------------------------------------------------------</font>-</pre>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/XmlContent.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>{-# LANGUAGE ExistentialQuantification #-}</font>+<a name="line-2"></a>+<a name="line-3"></a><font color=Blue>-- | The class 'XmlContent' is a kind of replacement for Read and Show:</font>+<a name="line-4"></a><font color=Blue>-- it provides conversions between a generic XML tree representation</font>+<a name="line-5"></a><font color=Blue>-- and your own more specialised typeful Haskell data trees.</font>+<a name="line-6"></a><font color=Blue>--</font>+<a name="line-7"></a><font color=Blue>-- If you are starting with a set of Haskell datatypes, use DrIFT to</font>+<a name="line-8"></a><font color=Blue>-- derive instances of this class for you:</font>+<a name="line-9"></a><font color=Blue>-- http:\/\/repetae.net\/john\/computer\/haskell\/DrIFT</font>+<a name="line-10"></a><font color=Blue>-- If you are starting with an XML DTD, use HaXml's tool DtdToHaskell</font>+<a name="line-11"></a><font color=Blue>-- to generate both the Haskell types and the corresponding instances.</font>+<a name="line-12"></a><font color=Blue>--</font>+<a name="line-13"></a><font color=Blue>-- This unified class interface replaces two previous (somewhat similar)</font>+<a name="line-14"></a><font color=Blue>-- classes: Haskell2Xml and Xml2Haskell. There was no real reason to have</font>+<a name="line-15"></a><font color=Blue>-- separate classes depending on how you originally defined your datatypes.</font>+<a name="line-16"></a>+<a name="line-17"></a><font color=Blue>-- The methods 'toContents' and 'parseContents' convert a value to and from</font>+<a name="line-18"></a><font color=Blue>-- a generic internal representation of an XML document /without/ a DTD.</font>+<a name="line-19"></a><font color=Blue>-- The functions 'toXml' and 'fromXml' convert a value to and from a generic</font>+<a name="line-20"></a><font color=Blue>-- internal representation of an XML document /including/ a DTD.</font>+<a name="line-21"></a><font color=Blue>-- The functions 'readXml' and 'showXml' convert to and from Strings.</font>+<a name="line-22"></a><font color=Blue>-- The functions 'fReadXml' and 'fWriteXml' do the conversion to and from</font>+<a name="line-23"></a><font color=Blue>-- the given filenames.</font>+<a name="line-24"></a><font color=Blue>-- The functions 'hGetXml' and 'hPutXml' do the conversion to and from</font>+<a name="line-25"></a><font color=Blue>-- the given file handles.</font>+<a name="line-26"></a><font color=Blue>-- (See the type signatures.)</font>+<a name="line-27"></a><font color=Blue>--</font>+<a name="line-28"></a>+<a name="line-29"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>XmlContent+<a name="line-30"></a> <font color=Cyan>(</font> <font color=Blue>-- * Re-export the relevant set of generic XML document type definitions</font>+<a name="line-31"></a> Document<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-32"></a> <font color=Cyan>,</font> Element<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-33"></a> <font color=Cyan>,</font> ElemTag<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-34"></a> <font color=Cyan>,</font> Content<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-35"></a> <font color=Cyan>,</font> Attribute()+<a name="line-36"></a> <font color=Cyan>,</font> AttValue<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-37"></a> <font color=Cyan>,</font> Prolog<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-38"></a> <font color=Cyan>,</font> Reference<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-39"></a> <font color=Blue>-- * The enabling classes, that define parsing\/unparsing between Haskell</font>+<a name="line-40"></a> <font color=Blue>-- datatypes and a generic XML representation.</font>+<a name="line-41"></a> <font color=Cyan>,</font> XmlContent<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-42"></a> <font color=Cyan>,</font> XmlAttributes<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-43"></a> <font color=Cyan>,</font> XmlAttrType<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-44"></a> <font color=Blue>-- ** Auxiliaries for writing parsers in the XmlContent class</font>+<a name="line-45"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>Poly+<a name="line-46"></a> <font color=Cyan>,</font> XMLParser+<a name="line-47"></a> <font color=Cyan>,</font> content<font color=Cyan>,</font> posnElement<font color=Cyan>,</font> element<font color=Cyan>,</font> interior<font color=Cyan>,</font> inElement<font color=Cyan>,</font> text<font color=Cyan>,</font> attributes+<a name="line-48"></a> <font color=Cyan>,</font> posnElementWith<font color=Cyan>,</font> elementWith<font color=Cyan>,</font> inElementWith+<a name="line-49"></a> <font color=Cyan>,</font> choice<font color=Cyan>,</font> definite <font color=Blue>-- ???</font>+<a name="line-50"></a> <font color=Blue>-- ** Auxiliaries for generating in the XmlContent class</font>+<a name="line-51"></a> <font color=Cyan>,</font> mkElem<font color=Cyan>,</font> mkElemC<font color=Cyan>,</font> mkAttr+<a name="line-52"></a> <font color=Cyan>,</font> toText<font color=Cyan>,</font> toCData+<a name="line-53"></a> <font color=Blue>-- ** Auxiliaries for the attribute-related classes</font>+<a name="line-54"></a> <font color=Cyan>,</font> maybeToAttr<font color=Cyan>,</font> defaultToAttr+<a name="line-55"></a> <font color=Cyan>,</font> definiteA<font color=Cyan>,</font> defaultA<font color=Cyan>,</font> possibleA<font color=Cyan>,</font> fromAttrToStr<font color=Cyan>,</font> toAttrFrStr+<a name="line-56"></a> <font color=Cyan>,</font> Defaultable<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-57"></a> <font color=Cyan>,</font> str2attr<font color=Cyan>,</font> attr2str<font color=Cyan>,</font> attval+<a name="line-58"></a> <font color=Cyan>,</font> catMaybes <font color=Blue>-- re-exported from Maybe</font>+<a name="line-59"></a> <font color=Blue>-- * Whole-document conversion functions</font>+<a name="line-60"></a> <font color=Cyan>,</font> toXml<font color=Cyan>,</font> fromXml+<a name="line-61"></a> <font color=Cyan>,</font> readXml<font color=Cyan>,</font> showXml<font color=Cyan>,</font> fpsShowXml+<a name="line-62"></a> <font color=Cyan>,</font> fReadXml<font color=Cyan>,</font> fWriteXml<font color=Cyan>,</font> fpsWriteXml+<a name="line-63"></a> <font color=Cyan>,</font> hGetXml<font color=Cyan>,</font> hPutXml<font color=Cyan>,</font> fpsHPutXml+<a name="line-64"></a> <font color=Blue>-- * Explicit representation of Haskell datatype information</font>+<a name="line-65"></a> <font color=Blue>-- (for conversion to a DTD)</font>+<a name="line-66"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>TypeMapping+<a name="line-67"></a> <font color=Blue>-- * Types useful for some content models</font>+<a name="line-68"></a> <font color=Cyan>,</font> List1<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-69"></a> <font color=Cyan>,</font> ANYContent<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-70"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-71"></a>+<a name="line-72"></a><font color=Green><u>import</u></font> IO+<a name="line-73"></a><font color=Green><u>import</u></font> Maybe <font color=Cyan>(</font>catMaybes<font color=Cyan>)</font>+<a name="line-74"></a><font color=Green><u>import</u></font> Char <font color=Cyan>(</font>chr<font color=Cyan>,</font> isSpace<font color=Cyan>)</font>+<a name="line-75"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>isPrefixOf<font color=Cyan>,</font> isSuffixOf<font color=Cyan>)</font>+<a name="line-76"></a>+<a name="line-77"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>PrettyPrint<font color=Cyan>.</font>HughesPJ <font color=Cyan>(</font>render<font color=Cyan>)</font>+<a name="line-78"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Pretty <font color=Green><u>as</u></font> PP+<a name="line-79"></a>+<a name="line-80"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-81"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>TypeMapping+<a name="line-82"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Posn <font color=Cyan>(</font>Posn<font color=Cyan>,</font> posInNewCxt<font color=Cyan>)</font>+<a name="line-83"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Pretty <font color=Cyan>(</font>document<font color=Cyan>)</font>+<a name="line-84"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Parse <font color=Cyan>(</font>xmlParse<font color=Cyan>)</font>+<a name="line-85"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Verbatim <font color=Cyan>(</font>Verbatim<font color=Cyan>(</font>verbatim<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-86"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>ByteStringPP <font color=Green><u>as</u></font> FPS <font color=Cyan>(</font>document<font color=Cyan>)</font>+<a name="line-87"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Data<font color=Cyan>.</font>ByteString<font color=Cyan>.</font>Lazy<font color=Cyan>.</font>Char8 <font color=Green><u>as</u></font> FPS+<a name="line-88"></a>+<a name="line-89"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>Poly+<a name="line-90"></a>+<a name="line-91"></a><font color=Blue>-- #define DEBUG</font>+<a name="line-92"></a>+<a name="line-93"></a><font color=Magenta><em>#if defined(DEBUG)</em></font>+<a name="line-94"></a><font color=Green><u>import</u></font> Debug<font color=Cyan>.</font>Trace<font color=Cyan>(</font>trace<font color=Cyan>)</font>+<a name="line-95"></a><a name="debug"></a><font color=Blue>debug</font> <font color=Red>::</font> a <font color=Red>-></font> String <font color=Red>-></font> a+<a name="line-96"></a><a name="debug"></a><font color=Blue>v</font> <font color=Cyan>`debug`</font> s <font color=Red>=</font> trace s v+<a name="line-97"></a><font color=Magenta><em>#else</em></font>+<a name="line-98"></a><font color=Blue>debug</font> <font color=Red>::</font> t <font color=Red>-></font> t1 <font color=Red>-></font> t+<a name="line-99"></a><a name="debug"></a><font color=Blue>v</font> <font color=Cyan>`debug`</font> <font color=Green><u>_</u></font> <font color=Red>=</font> v+<a name="line-100"></a><font color=Magenta><em>#endif</em></font>+<a name="line-101"></a>+<a name="line-102"></a>+<a name="line-103"></a><a name="attval"></a><font color=Blue>------------------------------------------------------------------------</font>+<a name="line-104"></a><font color=Blue>-- | Read a single attribute called "value".</font>+<a name="line-105"></a><font color=Blue>attval</font> <font color=Red>::</font> <font color=Cyan>(</font>Read a<font color=Cyan>)</font> <font color=Red>=></font> Element i <font color=Red>-></font> a+<a name="line-106"></a><font color=Blue>attval</font> <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Red>[</font><font color=Cyan>(</font><font color=Magenta>"value"</font><font color=Cyan>,</font>v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Red>]</font> []<font color=Cyan>)</font> <font color=Red>=</font> read <font color=Cyan>(</font>show v<font color=Cyan>)</font>+<a name="line-107"></a>+<a name="line-108"></a><a name="mkAttr"></a><font color=Blue>-- | Generate a single attribute.</font>+<a name="line-109"></a><font color=Blue>mkAttr</font> <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Attribute+<a name="line-110"></a><font color=Blue>mkAttr</font> n v <font color=Red>=</font> <font color=Cyan>(</font>n<font color=Cyan>,</font> AttValue <font color=Red>[</font>Left v<font color=Red>]</font><font color=Cyan>)</font>+<a name="line-111"></a>+<a name="line-112"></a><a name="mkElem"></a><font color=Blue>-- | Generate an element with no attributes, named for its HType.</font>+<a name="line-113"></a><font color=Blue>mkElem</font> <font color=Red>::</font> XmlContent a <font color=Red>=></font> a <font color=Red>-></font> <font color=Red>[</font>Content ()<font color=Red>]</font> <font color=Red>-></font> Content ()+<a name="line-114"></a><font color=Blue>mkElem</font> x cs <font color=Red>=</font> CElem <font color=Cyan>(</font>Elem <font color=Cyan>(</font>showHType <font color=Cyan>(</font>toHType x<font color=Cyan>)</font> <font color=Magenta>""</font><font color=Cyan>)</font> [] cs<font color=Cyan>)</font> ()+<a name="line-115"></a>+<a name="line-116"></a><a name="mkElemC"></a><font color=Blue>-- | Generate an element with no attributes, named directly.</font>+<a name="line-117"></a><font color=Blue>mkElemC</font> <font color=Red>::</font> String <font color=Red>-></font> <font color=Red>[</font>Content ()<font color=Red>]</font> <font color=Red>-></font> Content ()+<a name="line-118"></a><font color=Blue>mkElemC</font> x cs <font color=Red>=</font> CElem <font color=Cyan>(</font>Elem x [] cs<font color=Cyan>)</font> ()+<a name="line-119"></a>+<a name="line-120"></a><a name="toText"></a><font color=Blue>-- | Turn a simple string into XML text.</font>+<a name="line-121"></a><font color=Blue>toText</font> <font color=Red>::</font> String <font color=Red>-></font> <font color=Red>[</font>Content ()<font color=Red>]</font>+<a name="line-122"></a><font color=Blue>toText</font> s <font color=Red>=</font> <font color=Red>[</font>CString False s ()<font color=Red>]</font>+<a name="line-123"></a>+<a name="line-124"></a><a name="toCData"></a><font color=Blue>-- | Turn a string into an XML CDATA section.</font>+<a name="line-125"></a><font color=Blue>-- (i.e. special characters like '&' are preserved without interpretation.)</font>+<a name="line-126"></a><font color=Blue>toCData</font> <font color=Red>::</font> String <font color=Red>-></font> <font color=Red>[</font>Content ()<font color=Red>]</font>+<a name="line-127"></a><font color=Blue>toCData</font> s <font color=Red>=</font> <font color=Red>[</font>CString True s ()<font color=Red>]</font>+<a name="line-128"></a><font color=Blue>------------------------------------------------------------------------</font>+<a name="line-129"></a>+<a name="line-130"></a> <font color=Blue>-- probably want to write DTD separately from value, and have</font>+<a name="line-131"></a> <font color=Blue>-- easy ways to combine DTD + value into a document, or write</font>+<a name="line-132"></a> <font color=Blue>-- them to separate files.</font>+<a name="line-133"></a>+<a name="line-134"></a><a name="fReadXml"></a><font color=Blue>-- | Read an XML document from a file and convert it to a fully-typed</font>+<a name="line-135"></a><font color=Blue>-- Haskell value.</font>+<a name="line-136"></a><font color=Blue>fReadXml</font> <font color=Red>::</font> XmlContent a <font color=Red>=></font> FilePath <font color=Red>-></font> IO a+<a name="line-137"></a><font color=Blue>fReadXml</font> fp <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-138"></a> f <font color=Red><-</font> <font color=Cyan>(</font> <font color=Green><u>if</u></font> fp<font color=Cyan>==</font><font color=Magenta>"-"</font> <font color=Green><u>then</u></font> return stdin+<a name="line-139"></a> <font color=Green><u>else</u></font> openFile fp ReadMode <font color=Cyan>)</font>+<a name="line-140"></a> x <font color=Red><-</font> hGetContents f+<a name="line-141"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>Document <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> y <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> xmlParse fp x+<a name="line-142"></a> y' <font color=Red>=</font> CElem y <font color=Cyan>(</font>posInNewCxt fp Nothing<font color=Cyan>)</font>+<a name="line-143"></a> either fail return <font color=Cyan>(</font>fst <font color=Cyan>(</font>runParser parseContents <font color=Red>[</font>y'<font color=Red>]</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-144"></a>+<a name="line-145"></a><a name="fWriteXml"></a><font color=Blue>-- | Write a fully-typed Haskell value to the given file as an XML</font>+<a name="line-146"></a><font color=Blue>-- document.</font>+<a name="line-147"></a><font color=Blue>fWriteXml</font> <font color=Red>::</font> XmlContent a <font color=Red>=></font> FilePath <font color=Red>-></font> a <font color=Red>-></font> IO ()+<a name="line-148"></a><font color=Blue>fWriteXml</font> fp x <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-149"></a> f <font color=Red><-</font> <font color=Cyan>(</font> <font color=Green><u>if</u></font> fp<font color=Cyan>==</font><font color=Magenta>"-"</font> <font color=Green><u>then</u></font> return stdout+<a name="line-150"></a> <font color=Green><u>else</u></font> openFile fp WriteMode <font color=Cyan>)</font>+<a name="line-151"></a> hPutXml f False x+<a name="line-152"></a> hClose f+<a name="line-153"></a>+<a name="line-154"></a><a name="fpsWriteXml"></a><font color=Blue>-- | Write any Haskell value to the given file as an XML document,</font>+<a name="line-155"></a><font color=Blue>-- using the FastPackedString interface (output will not be prettified).</font>+<a name="line-156"></a><font color=Blue>fpsWriteXml</font> <font color=Red>::</font> XmlContent a <font color=Red>=></font> FilePath <font color=Red>-></font> a <font color=Red>-></font> IO ()+<a name="line-157"></a><font color=Blue>fpsWriteXml</font> fp x <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-158"></a> f <font color=Red><-</font> <font color=Cyan>(</font> <font color=Green><u>if</u></font> fp<font color=Cyan>==</font><font color=Magenta>"-"</font> <font color=Green><u>then</u></font> return stdout+<a name="line-159"></a> <font color=Green><u>else</u></font> openFile fp WriteMode <font color=Cyan>)</font>+<a name="line-160"></a> fpsHPutXml f False x+<a name="line-161"></a> hClose f+<a name="line-162"></a>+<a name="line-163"></a><a name="readXml"></a><font color=Blue>-- | Read a fully-typed XML document from a string.</font>+<a name="line-164"></a><font color=Blue>readXml</font> <font color=Red>::</font> XmlContent a <font color=Red>=></font> String <font color=Red>-></font> Either String a+<a name="line-165"></a><font color=Blue>readXml</font> s <font color=Red>=</font>+<a name="line-166"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>Document <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> y <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> xmlParse <font color=Magenta>"string input"</font> s <font color=Green><u>in</u></font>+<a name="line-167"></a> fst <font color=Cyan>(</font>runParser parseContents+<a name="line-168"></a> <font color=Red>[</font>CElem y <font color=Cyan>(</font>posInNewCxt <font color=Magenta>"string input"</font> Nothing<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-169"></a>+<a name="line-170"></a><a name="showXml"></a><font color=Blue>-- | Convert a fully-typed XML document to a string (without DTD).</font>+<a name="line-171"></a><font color=Blue>showXml</font> <font color=Red>::</font> XmlContent a <font color=Red>=></font> Bool <font color=Red>-></font> a <font color=Red>-></font> String+<a name="line-172"></a><font color=Blue>showXml</font> dtd x <font color=Red>=</font>+<a name="line-173"></a> <font color=Green><u>case</u></font> toContents x <font color=Green><u>of</u></font>+<a name="line-174"></a> <font color=Red>[</font>CElem <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Red>]</font> <font color=Red>-></font> <font color=Cyan>(</font>render <font color=Cyan>.</font> document <font color=Cyan>.</font> toXml dtd<font color=Cyan>)</font> x+<a name="line-175"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> <font color=Magenta>""</font>+<a name="line-176"></a>+<a name="line-177"></a><a name="fpsShowXml"></a><font color=Blue>-- | Convert a fully-typed XML document to a ByteString (without DTD).</font>+<a name="line-178"></a><font color=Blue>fpsShowXml</font> <font color=Red>::</font> XmlContent a <font color=Red>=></font> Bool <font color=Red>-></font> a <font color=Red>-></font> FPS<font color=Cyan>.</font>ByteString+<a name="line-179"></a><font color=Blue>fpsShowXml</font> dtd x <font color=Red>=</font>+<a name="line-180"></a> <font color=Green><u>case</u></font> toContents x <font color=Green><u>of</u></font>+<a name="line-181"></a> <font color=Red>[</font>CElem <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Red>]</font> <font color=Red>-></font> <font color=Cyan>(</font>FPS<font color=Cyan>.</font>document <font color=Cyan>.</font> toXml dtd<font color=Cyan>)</font> x+<a name="line-182"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> FPS<font color=Cyan>.</font>empty+<a name="line-183"></a>+<a name="line-184"></a>+<a name="line-185"></a><a name="toXml"></a><font color=Blue>-- | Convert a fully-typed XML document to a string (with or without DTD).</font>+<a name="line-186"></a><font color=Blue>toXml</font> <font color=Red>::</font> XmlContent a <font color=Red>=></font> Bool <font color=Red>-></font> a <font color=Red>-></font> Document ()+<a name="line-187"></a><font color=Blue>toXml</font> dtd value <font color=Red>=</font>+<a name="line-188"></a> <font color=Green><u>let</u></font> ht <font color=Red>=</font> toHType value <font color=Green><u>in</u></font>+<a name="line-189"></a> Document <font color=Cyan>(</font>Prolog <font color=Cyan>(</font>Just <font color=Cyan>(</font>XMLDecl <font color=Magenta>"1.0"</font> Nothing Nothing<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-190"></a> [] <font color=Cyan>(</font><font color=Green><u>if</u></font> dtd <font color=Green><u>then</u></font> Just <font color=Cyan>(</font>toDTD ht<font color=Cyan>)</font> <font color=Green><u>else</u></font> Nothing<font color=Cyan>)</font> []<font color=Cyan>)</font>+<a name="line-191"></a> emptyST+<a name="line-192"></a> <font color=Cyan>(</font> <font color=Green><u>case</u></font> <font color=Cyan>(</font>ht<font color=Cyan>,</font> toContents value<font color=Cyan>)</font> <font color=Green><u>of</u></font>+<a name="line-193"></a> <font color=Cyan>(</font>Tuple <font color=Green><u>_</u></font><font color=Cyan>,</font> cs<font color=Cyan>)</font> <font color=Red>-></font> Elem <font color=Cyan>(</font>showHType ht <font color=Magenta>""</font><font color=Cyan>)</font> [] cs+<a name="line-194"></a> <font color=Cyan>(</font>Defined <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>,</font> cs<font color=Cyan>)</font> <font color=Red>-></font> Elem <font color=Cyan>(</font>showHType ht <font color=Magenta>"-XML"</font><font color=Cyan>)</font> [] cs+<a name="line-195"></a> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font> <font color=Red>[</font>CElem e ()<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> e <font color=Cyan>)</font>+<a name="line-196"></a> []+<a name="line-197"></a>+<a name="line-198"></a><a name="fromXml"></a><font color=Blue>-- | Read a Haskell value from an XML document, ignoring the DTD and</font>+<a name="line-199"></a><font color=Blue>-- using the Haskell result type to determine how to parse it.</font>+<a name="line-200"></a><font color=Blue>fromXml</font> <font color=Red>::</font> XmlContent a <font color=Red>=></font> Document Posn <font color=Red>-></font> Either String a+<a name="line-201"></a><font color=Blue>fromXml</font> <font color=Cyan>(</font>Document <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> e<font color=Red>@</font><font color=Cyan>(</font>Elem n <font color=Green><u>_</u></font> cs<font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font>+<a name="line-202"></a> <font color=Red>|</font> <font color=Magenta>"tuple"</font> <font color=Cyan>`isPrefixOf`</font> n <font color=Red>=</font> fst <font color=Cyan>(</font>runParser parseContents cs<font color=Cyan>)</font>+<a name="line-203"></a> <font color=Red>|</font> <font color=Magenta>"-XML"</font> <font color=Cyan>`isSuffixOf`</font> n <font color=Red>=</font> fst <font color=Cyan>(</font>runParser parseContents cs<font color=Cyan>)</font>+<a name="line-204"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> fst <font color=Cyan>(</font>runParser parseContents+<a name="line-205"></a> <font color=Red>[</font>CElem e <font color=Cyan>(</font>posInNewCxt <font color=Magenta>"document"</font> Nothing<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="line-206"></a>+<a name="line-207"></a>+<a name="line-208"></a><a name="hGetXml"></a><font color=Blue>-- | Read a fully-typed XML document from a file handle.</font>+<a name="line-209"></a><font color=Blue>hGetXml</font> <font color=Red>::</font> XmlContent a <font color=Red>=></font> Handle <font color=Red>-></font> IO a+<a name="line-210"></a><font color=Blue>hGetXml</font> h <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-211"></a> x <font color=Red><-</font> hGetContents h+<a name="line-212"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>Document <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> y <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> xmlParse <font color=Magenta>"file handle"</font> x+<a name="line-213"></a> either fail return+<a name="line-214"></a> <font color=Cyan>(</font>fst <font color=Cyan>(</font>runParser parseContents+<a name="line-215"></a> <font color=Red>[</font>CElem y <font color=Cyan>(</font>posInNewCxt <font color=Magenta>"file handle"</font> Nothing<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-216"></a>+<a name="line-217"></a><a name="hPutXml"></a><font color=Blue>-- | Write a fully-typed XML document to a file handle.</font>+<a name="line-218"></a><font color=Blue>hPutXml</font> <font color=Red>::</font> XmlContent a <font color=Red>=></font> Handle <font color=Red>-></font> Bool <font color=Red>-></font> a <font color=Red>-></font> IO ()+<a name="line-219"></a><font color=Blue>hPutXml</font> h dtd x <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-220"></a> <font color=Cyan>(</font>hPutStrLn h <font color=Cyan>.</font> render <font color=Cyan>.</font> document <font color=Cyan>.</font> toXml dtd<font color=Cyan>)</font> x+<a name="line-221"></a>+<a name="line-222"></a><a name="fpsHPutXml"></a><font color=Blue>-- | Write a fully-typed XML document to a file handle, using the</font>+<a name="line-223"></a><font color=Blue>-- FastPackedString interface (output will not be prettified).</font>+<a name="line-224"></a><font color=Blue>fpsHPutXml</font> <font color=Red>::</font> XmlContent a <font color=Red>=></font> Handle <font color=Red>-></font> Bool <font color=Red>-></font> a <font color=Red>-></font> IO ()+<a name="line-225"></a><font color=Blue>fpsHPutXml</font> h dtd x <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-226"></a> <font color=Cyan>(</font>FPS<font color=Cyan>.</font>hPut h <font color=Cyan>.</font> FPS<font color=Cyan>.</font>document <font color=Cyan>.</font> toXml dtd<font color=Cyan>)</font> x+<a name="line-227"></a>+<a name="line-228"></a><font color=Blue>------------------------------------------------------------------------</font>+<a name="line-229"></a>+<a name="line-230"></a><a name="XMLParser"></a><font color=Blue>-- | We need a parsing monad for reading generic XML Content into specific</font>+<a name="line-231"></a><a name="XMLParser"></a><font color=Blue>-- datatypes. This is a specialisation of the Text.ParserCombinators.Poly</font>+<a name="line-232"></a><a name="XMLParser"></a><font color=Blue>-- ones, where the input token type is fixed as XML Content.</font>+<a name="line-233"></a><a name="XMLParser"></a><font color=Green><u>type</u></font> XMLParser a <font color=Red>=</font> Parser <font color=Cyan>(</font>Content Posn<font color=Cyan>)</font> a+<a name="line-234"></a>+<a name="line-235"></a>+<a name="line-236"></a><font color=Blue>------------------------------------------------------------------------</font>+<a name="line-237"></a><font color=Blue>-- Some useful parsing combinators</font>+<a name="line-238"></a><font color=Blue>------------------------------------------------------------------------</font>+<a name="line-239"></a>+<a name="line-240"></a><a name="content"></a><font color=Blue>-- | The most primitive combinator for XMLParser - get one content item.</font>+<a name="line-241"></a><font color=Blue>content</font> <font color=Red>::</font> String <font color=Red>-></font> XMLParser <font color=Cyan>(</font>Content Posn<font color=Cyan>)</font>+<a name="line-242"></a><font color=Blue>content</font> word <font color=Red>=</font> next <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>++</font><font color=Magenta>" when expecting "</font><font color=Cyan>++</font>word<font color=Cyan>)</font>+<a name="line-243"></a>+<a name="line-244"></a><a name="posnElementWith"></a><font color=Blue>-- | Get the next content element, checking that it has one of the required</font>+<a name="line-245"></a><font color=Blue>-- tags, using the given matching function.</font>+<a name="line-246"></a><font color=Blue>-- (Skips over comments and whitespace, rejects text and refs.</font>+<a name="line-247"></a><font color=Blue>-- Also returns position of element.)</font>+<a name="line-248"></a><font color=Blue>posnElementWith</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Red>-></font>Bool<font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>String<font color=Red>]</font>+<a name="line-249"></a> <font color=Red>-></font> XMLParser <font color=Cyan>(</font>Posn<font color=Cyan>,</font> Element Posn<font color=Cyan>)</font>+<a name="line-250"></a><font color=Blue>posnElementWith</font> match tags <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-251"></a> <font color=Cyan>{</font> c <font color=Red><-</font> content <font color=Cyan>(</font>formatted tags<font color=Cyan>)</font>+<a name="line-252"></a> <font color=Cyan>;</font> <font color=Green><u>case</u></font> c <font color=Green><u>of</u></font>+<a name="line-253"></a> CElem e<font color=Red>@</font><font color=Cyan>(</font>Elem t <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> pos+<a name="line-254"></a> <font color=Red>|</font> any <font color=Cyan>(</font>match t<font color=Cyan>)</font> tags <font color=Red>-></font> return <font color=Cyan>(</font>pos<font color=Cyan>,</font> e<font color=Cyan>)</font>+<a name="line-255"></a> <font color=Red>|</font> otherwise <font color=Red>-></font> fail <font color=Cyan>(</font><font color=Magenta>"Found a <"</font><font color=Cyan>++</font>t<font color=Cyan>++</font><font color=Magenta>">, but expected "</font>+<a name="line-256"></a> <font color=Cyan>++</font>formatted tags<font color=Cyan>++</font><font color=Magenta>"\nat "</font><font color=Cyan>++</font>show pos<font color=Cyan>)</font>+<a name="line-257"></a> CString b s pos+<a name="line-258"></a> <font color=Red>|</font> not b <font color=Cyan>&&</font> all isSpace s <font color=Red>-></font> posnElementWith match tags+<a name="line-259"></a> <font color=Blue>-- ignore blank space</font>+<a name="line-260"></a> <font color=Red>|</font> otherwise <font color=Red>-></font> fail <font color=Cyan>(</font><font color=Magenta>"Found text content, but expected "</font>+<a name="line-261"></a> <font color=Cyan>++</font>formatted tags<font color=Cyan>++</font><font color=Magenta>"\ntext is: "</font><font color=Cyan>++</font>s+<a name="line-262"></a> <font color=Cyan>++</font><font color=Magenta>"\nat "</font><font color=Cyan>++</font>show pos<font color=Cyan>)</font>+<a name="line-263"></a> CRef r pos <font color=Red>-></font> fail <font color=Cyan>(</font><font color=Magenta>"Found reference, but expected "</font>+<a name="line-264"></a> <font color=Cyan>++</font>formatted tags<font color=Cyan>++</font><font color=Magenta>"\nreference is: "</font><font color=Cyan>++</font>verbatim r+<a name="line-265"></a> <font color=Cyan>++</font><font color=Magenta>"\nat "</font><font color=Cyan>++</font>show pos<font color=Cyan>)</font>+<a name="line-266"></a> CMisc <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Red>-></font> posnElementWith match tags <font color=Blue>-- skip comments, PIs, etc.</font>+<a name="line-267"></a> <font color=Cyan>}</font>+<a name="line-268"></a> <font color=Green><u>where</u></font>+<a name="line-269"></a> formatted <font color=Red>[</font>t<font color=Red>]</font> <font color=Red>=</font> <font color=Magenta>"a <"</font><font color=Cyan>++</font>t<font color=Cyan>++</font><font color=Magenta>">"</font>+<a name="line-270"></a> formatted tgs <font color=Red>=</font> <font color=Magenta>"one of"</font><font color=Cyan>++</font> concatMap <font color=Cyan>(</font><font color=Red>\</font>t<font color=Red>-></font><font color=Magenta>" <"</font><font color=Cyan>++</font>t<font color=Cyan>++</font><font color=Magenta>">"</font><font color=Cyan>)</font> tgs+<a name="line-271"></a>+<a name="line-272"></a><a name="posnElement"></a><font color=Blue>-- | A specialisation of @posnElementWith (==)@.</font>+<a name="line-273"></a><font color=Blue>posnElement</font> <font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-></font> XMLParser <font color=Cyan>(</font>Posn<font color=Cyan>,</font> Element Posn<font color=Cyan>)</font>+<a name="line-274"></a><font color=Blue>posnElement</font> <font color=Red>=</font> posnElementWith <font color=Cyan>(</font><font color=Cyan>==</font><font color=Cyan>)</font>+<a name="line-275"></a>+<a name="line-276"></a><a name="element"></a><font color=Blue>-- | Get the next content element, checking that it has one of the required</font>+<a name="line-277"></a><font color=Blue>-- tags. (Skips over comments and whitespace, rejects text and refs.)</font>+<a name="line-278"></a><font color=Blue>element</font> <font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-></font> XMLParser <font color=Cyan>(</font>Element Posn<font color=Cyan>)</font>+<a name="line-279"></a><font color=Blue>element</font> tags <font color=Red>=</font> fmap snd <font color=Cyan>(</font>posnElement tags<font color=Cyan>)</font>+<a name="line-280"></a> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"Element: "</font><font color=Cyan>++</font>unwords tags<font color=Cyan>++</font><font color=Magenta>"\n"</font><font color=Cyan>)</font>+<a name="line-281"></a>+<a name="line-282"></a><a name="elementWith"></a><font color=Blue>-- | Like element, only permits a more flexible match against the tagname.</font>+<a name="line-283"></a><font color=Blue>elementWith</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Red>-></font>Bool<font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-></font> XMLParser <font color=Cyan>(</font>Element Posn<font color=Cyan>)</font>+<a name="line-284"></a><font color=Blue>elementWith</font> match tags <font color=Red>=</font> fmap snd <font color=Cyan>(</font>posnElementWith match tags<font color=Cyan>)</font>+<a name="line-285"></a> <font color=Cyan>`debug`</font> <font color=Cyan>(</font><font color=Magenta>"Element: "</font><font color=Cyan>++</font>unwords tags<font color=Cyan>++</font><font color=Magenta>"\n"</font><font color=Cyan>)</font>+<a name="line-286"></a>+<a name="line-287"></a><a name="interior"></a><font color=Blue>-- | Run an XMLParser on the contents of the given element (i.e. not on the</font>+<a name="line-288"></a><font color=Blue>-- current monadic content sequence), checking that the contents are</font>+<a name="line-289"></a><font color=Blue>-- exhausted, before returning the calculated value within the current</font>+<a name="line-290"></a><font color=Blue>-- parser context.</font>+<a name="line-291"></a><font color=Blue>interior</font> <font color=Red>::</font> Element Posn <font color=Red>-></font> XMLParser a <font color=Red>-></font> XMLParser a+<a name="line-292"></a><font color=Blue>interior</font> <font color=Cyan>(</font>Elem e <font color=Green><u>_</u></font> cs<font color=Cyan>)</font> p <font color=Red>=</font>+<a name="line-293"></a> <font color=Green><u>case</u></font> runParser p cs <font color=Green><u>of</u></font>+<a name="line-294"></a> <font color=Cyan>(</font>Left msg<font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> fail msg+<a name="line-295"></a> <font color=Cyan>(</font>Right x<font color=Cyan>,</font> []<font color=Cyan>)</font> <font color=Red>-></font> return x+<a name="line-296"></a> <font color=Cyan>(</font>Right x<font color=Cyan>,</font> ds<font color=Red>@</font><font color=Cyan>(</font>d<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-297"></a> <font color=Red>|</font> all onlyMisc ds <font color=Red>-></font> return x+<a name="line-298"></a> <font color=Red>|</font> otherwise <font color=Red>-></font> fail <font color=Cyan>(</font><font color=Magenta>"Too many elements inside <"</font><font color=Cyan>++</font>e<font color=Cyan>++</font><font color=Magenta>"> at\n"</font>+<a name="line-299"></a> <font color=Cyan>++</font>show <font color=Cyan>(</font>info d<font color=Cyan>)</font><font color=Cyan>++</font><font color=Magenta>"\n"</font>+<a name="line-300"></a> <font color=Cyan>++</font><font color=Magenta>"Found excess: "</font><font color=Cyan>++</font>verbatim d<font color=Cyan>)</font>+<a name="line-301"></a> <font color=Green><u>where</u></font> onlyMisc <font color=Cyan>(</font>CMisc <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True+<a name="line-302"></a> onlyMisc <font color=Cyan>(</font>CString False s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>|</font> all isSpace s <font color=Red>=</font> True+<a name="line-303"></a> onlyMisc <font color=Green><u>_</u></font> <font color=Red>=</font> False+<a name="line-304"></a>+<a name="line-305"></a><a name="inElement"></a><font color=Blue>-- | A combination of element + interior.</font>+<a name="line-306"></a><font color=Blue>inElement</font> <font color=Red>::</font> String <font color=Red>-></font> XMLParser a <font color=Red>-></font> XMLParser a+<a name="line-307"></a><font color=Blue>inElement</font> tag p <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> e <font color=Red><-</font> element <font color=Red>[</font>tag<font color=Red>]</font><font color=Cyan>;</font> commit <font color=Cyan>(</font>interior e p<font color=Cyan>)</font> <font color=Cyan>}</font>+<a name="line-308"></a>+<a name="line-309"></a><a name="inElementWith"></a><font color=Blue>-- | A combination of elementWith + interior.</font>+<a name="line-310"></a><font color=Blue>inElementWith</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Red>-></font>Bool<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> XMLParser a <font color=Red>-></font> XMLParser a+<a name="line-311"></a><font color=Blue>inElementWith</font> match tag p <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> e <font color=Red><-</font> elementWith match <font color=Red>[</font>tag<font color=Red>]</font>+<a name="line-312"></a> <font color=Cyan>;</font> commit <font color=Cyan>(</font>interior e p<font color=Cyan>)</font> <font color=Cyan>}</font>+<a name="line-313"></a>+<a name="line-314"></a><a name="attributes"></a><font color=Blue>-- | Do some parsing of the attributes of the given element</font>+<a name="line-315"></a><font color=Blue>attributes</font> <font color=Red>::</font> XmlAttributes a <font color=Red>=></font> Element Posn <font color=Red>-></font> XMLParser a+<a name="line-316"></a><font color=Blue>attributes</font> <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>as</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> return <font color=Cyan>(</font>fromAttrs <font color=Green><u>as</u></font><font color=Cyan>)</font>+<a name="line-317"></a>+<a name="line-318"></a><a name="text"></a><font color=Blue>-- | 'text' is a counterpart to 'element', parsing text content if it</font>+<a name="line-319"></a><font color=Blue>-- exists. Adjacent text and references are coalesced.</font>+<a name="line-320"></a><font color=Blue>text</font> <font color=Red>::</font> XMLParser String+<a name="line-321"></a><font color=Blue>text</font> <font color=Red>=</font> text' []+<a name="line-322"></a> <font color=Green><u>where</u></font> text' acc <font color=Red>=</font>+<a name="line-323"></a> <font color=Green><u>do</u></font> <font color=Cyan>{</font> c <font color=Red><-</font> content <font color=Magenta>"plain text"</font>+<a name="line-324"></a> <font color=Cyan>;</font> <font color=Green><u>case</u></font> c <font color=Green><u>of</u></font>+<a name="line-325"></a> CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font> <font color=Red>-></font> text' <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font>+<a name="line-326"></a> CRef <font color=Cyan>(</font>RefChar s<font color=Cyan>)</font> <font color=Green><u>_</u></font> <font color=Red>-></font> text' <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"&#"</font><font color=Cyan>++</font>show s<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font> <font color=Red><b>:</b></font>acc<font color=Cyan>)</font>+<a name="line-327"></a> CRef <font color=Cyan>(</font>RefEntity s<font color=Cyan>)</font> <font color=Green><u>_</u></font> <font color=Red>-></font> text' <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'&'</font><font color=Red><b>:</b></font>s<font color=Cyan>++</font><font color=Magenta>";"</font><font color=Cyan>)</font><font color=Red><b>:</b></font>acc<font color=Cyan>)</font>+<a name="line-328"></a> CMisc <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Red>-></font> text' acc+<a name="line-329"></a> CElem <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Red>-></font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> reparse <font color=Red>[</font>c<font color=Red>]</font> <font color=Blue>-- put it back!</font>+<a name="line-330"></a> <font color=Cyan>;</font> <font color=Green><u>if</u></font> null acc <font color=Green><u>then</u></font> fail <font color=Magenta>"empty string"</font>+<a name="line-331"></a> <font color=Green><u>else</u></font> return <font color=Cyan>(</font>concat <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-332"></a> <font color=Cyan>}</font>+<a name="line-333"></a> <font color=Cyan>}</font>+<a name="line-334"></a> <font color=Cyan>`onFail`</font> <font color=Cyan>(</font> <font color=Green><u>if</u></font> null acc <font color=Green><u>then</u></font> fail <font color=Magenta>"empty string"</font>+<a name="line-335"></a> <font color=Green><u>else</u></font> return <font color=Cyan>(</font>concat <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>)</font>+<a name="line-336"></a>+<a name="line-337"></a>+<a name="line-338"></a><a name="choice"></a><font color=Blue>-- | 'choice f p' means if parseContents succeeds, apply f to the result,</font>+<a name="line-339"></a><font color=Blue>-- otherwise use the continuation parser.</font>+<a name="line-340"></a><font color=Blue>choice</font> <font color=Red>::</font> XmlContent a <font color=Red>=></font> <font color=Cyan>(</font>a <font color=Red>-></font> b<font color=Cyan>)</font> <font color=Red>-></font> XMLParser b <font color=Red>-></font> XMLParser b+<a name="line-341"></a><font color=Blue>choice</font> cons <font color=Cyan>(</font>P other<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-342"></a> P <font color=Cyan>(</font><font color=Red>\</font>cs<font color=Red>-></font> <font color=Green><u>case</u></font> runParser parseContents cs <font color=Green><u>of</u></font>+<a name="line-343"></a> <font color=Cyan>(</font>Left <font color=Green><u>_</u></font><font color=Cyan>,</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> other cs+<a name="line-344"></a> <font color=Cyan>(</font>Right x<font color=Cyan>,</font> cs'<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Right <font color=Cyan>(</font>cons x<font color=Cyan>)</font><font color=Cyan>,</font> cs'<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-345"></a>+<a name="line-346"></a><font color=Blue>--choice cons other = fmap cons parseContents `onFail` other</font>+<a name="line-347"></a>+<a name="line-348"></a><a name="definite"></a><font color=Blue>-- | not sure this is needed now. 'definite p' previously ensured that</font>+<a name="line-349"></a><font color=Blue>-- an element was definitely present. Now I think the monad might take</font>+<a name="line-350"></a><font color=Blue>-- care of that for us.</font>+<a name="line-351"></a><font color=Blue>definite</font> <font color=Red>::</font> XmlContent a <font color=Red>=></font> XMLParser a <font color=Red>-></font> String <font color=Red>-></font> String <font color=Red>-></font> XMLParser a+<a name="line-352"></a><font color=Blue>definite</font> p inner tag <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>cs<font color=Red>-></font> <font color=Green><u>case</u></font> runParser p cs <font color=Green><u>of</u></font>+<a name="line-353"></a> <font color=Cyan>(</font>Left <font color=Green><u>_</u></font><font color=Cyan>,</font> cs'<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False<font color=Cyan>,</font>msg'<font color=Cyan>)</font><font color=Cyan>,</font> cs'<font color=Cyan>)</font>+<a name="line-354"></a> <font color=Cyan>(</font>Right x<font color=Cyan>,</font> cs'<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Right x<font color=Cyan>,</font> cs'<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-355"></a> <font color=Green><u>where</u></font> msg' <font color=Red>=</font> <font color=Magenta>"content error: expected "</font><font color=Cyan>++</font>inner<font color=Cyan>++</font><font color=Magenta>" inside <"</font><font color=Cyan>++</font>tag+<a name="line-356"></a> <font color=Cyan>++</font><font color=Magenta>"> element\n"</font>+<a name="line-357"></a>+<a name="line-358"></a><font color=Blue>------------------------------------------------------------------------</font>+<a name="line-359"></a>+<a name="line-360"></a><a name="XmlContent"></a><font color=Blue>-- | The @XmlContent@ class promises that an XML Content element can be</font>+<a name="line-361"></a><a name="XmlContent"></a><font color=Blue>-- converted to and from a Haskell value.</font>+<a name="line-362"></a><a name="XmlContent"></a><font color=Green><u>class</u></font> HTypeable a <font color=Red>=></font> XmlContent a <font color=Green><u>where</u></font>+<a name="line-363"></a> <font color=Blue>-- | Convert from XML to Haskell</font>+<a name="line-364"></a> parseContents <font color=Red>::</font> XMLParser a+<a name="line-365"></a> <font color=Blue>-- | Convert from Haskell to XML</font>+<a name="line-366"></a> toContents <font color=Red>::</font> a <font color=Red>-></font> <font color=Red>[</font>Content ()<font color=Red>]</font>+<a name="line-367"></a>+<a name="line-368"></a> <font color=Blue>-- | Dummy functions (for most types): used /only/ in the Char instance</font>+<a name="line-369"></a> <font color=Blue>-- for coercing lists of Char into String.</font>+<a name="line-370"></a> xToChar <font color=Red>::</font> a <font color=Red>-></font> Char+<a name="line-371"></a> xFromChar <font color=Red>::</font> Char <font color=Red>-></font> a+<a name="line-372"></a> xToChar <font color=Red>=</font> error <font color=Magenta>"HaXml.XmlContent.xToChar used in error"</font>+<a name="line-373"></a> xFromChar <font color=Red>=</font> error <font color=Magenta>"HaXml.XmlContent.xFromChar used in error"</font>+<a name="line-374"></a>+<a name="line-375"></a><a name="XmlAttributes"></a><font color=Blue>-- | The @XmlAttributes@ class promises that a list of XML tag attributes</font>+<a name="line-376"></a><a name="XmlAttributes"></a><font color=Blue>-- can be converted to and from a Haskell value.</font>+<a name="line-377"></a><a name="XmlAttributes"></a><font color=Green><u>class</u></font> XmlAttributes a <font color=Green><u>where</u></font>+<a name="line-378"></a> fromAttrs <font color=Red>::</font> <font color=Red>[</font>Attribute<font color=Red>]</font> <font color=Red>-></font> a+<a name="line-379"></a> toAttrs <font color=Red>::</font> a <font color=Red>-></font> <font color=Red>[</font>Attribute<font color=Red>]</font>+<a name="line-380"></a><a name="XmlAttrType"></a><font color=Blue>-- | The @XmlAttrType@ class promises that an attribute taking an XML</font>+<a name="line-381"></a><a name="XmlAttrType"></a><font color=Blue>-- enumerated type can be converted to and from a Haskell value.</font>+<a name="line-382"></a><a name="XmlAttrType"></a><font color=Green><u>class</u></font> XmlAttrType a <font color=Green><u>where</u></font>+<a name="line-383"></a> fromAttrToTyp <font color=Red>::</font> String <font color=Red>-></font> Attribute <font color=Red>-></font> Maybe a+<a name="line-384"></a> toAttrFrTyp <font color=Red>::</font> String <font color=Red>-></font> a <font color=Red>-></font> Maybe Attribute+<a name="line-385"></a>+<a name="line-386"></a>+<a name="line-387"></a><font color=Blue>------------------------------------------------------------------------</font>+<a name="line-388"></a><font color=Blue>-- Instances for all the standard basic datatypes.</font>+<a name="line-389"></a><font color=Blue>-- These are for Haskell datatypes being derived to go to XML.</font>+<a name="line-390"></a><font color=Blue>-- DtdToHaskell does not use these instances.</font>+<a name="line-391"></a><font color=Blue>------------------------------------------------------------------------</font>+<a name="line-392"></a>+<a name="line-393"></a><font color=Green><u>instance</u></font> XmlContent Bool <font color=Green><u>where</u></font>+<a name="line-394"></a> toContents b <font color=Red>=</font> <font color=Red>[</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"bool"</font> <font color=Red>[</font>mkAttr <font color=Magenta>"value"</font> <font color=Cyan>(</font>show b<font color=Cyan>)</font><font color=Red>]</font> []<font color=Cyan>)</font> ()<font color=Red>]</font>+<a name="line-395"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> e <font color=Red><-</font> element <font color=Red>[</font><font color=Magenta>"bool"</font><font color=Red>]</font> <font color=Cyan>;</font> return <font color=Cyan>(</font>attval e<font color=Cyan>)</font> <font color=Cyan>}</font>+<a name="line-396"></a>+<a name="line-397"></a><font color=Green><u>instance</u></font> XmlContent Int <font color=Green><u>where</u></font>+<a name="line-398"></a> toContents i <font color=Red>=</font> <font color=Red>[</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"int"</font> <font color=Red>[</font>mkAttr <font color=Magenta>"value"</font> <font color=Cyan>(</font>show i<font color=Cyan>)</font><font color=Red>]</font> []<font color=Cyan>)</font> ()<font color=Red>]</font>+<a name="line-399"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> e <font color=Red><-</font> element <font color=Red>[</font><font color=Magenta>"int"</font><font color=Red>]</font> <font color=Cyan>;</font> return <font color=Cyan>(</font>attval e<font color=Cyan>)</font> <font color=Cyan>}</font>+<a name="line-400"></a>+<a name="line-401"></a><font color=Green><u>instance</u></font> XmlContent Integer <font color=Green><u>where</u></font>+<a name="line-402"></a> toContents i <font color=Red>=</font> <font color=Red>[</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"integer"</font> <font color=Red>[</font>mkAttr <font color=Magenta>"value"</font> <font color=Cyan>(</font>show i<font color=Cyan>)</font><font color=Red>]</font> []<font color=Cyan>)</font> ()<font color=Red>]</font>+<a name="line-403"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> e <font color=Red><-</font> element <font color=Red>[</font><font color=Magenta>"integer"</font><font color=Red>]</font> <font color=Cyan>;</font> return <font color=Cyan>(</font>attval e<font color=Cyan>)</font> <font color=Cyan>}</font>+<a name="line-404"></a>+<a name="line-405"></a><font color=Green><u>instance</u></font> XmlContent Float <font color=Green><u>where</u></font>+<a name="line-406"></a> toContents i <font color=Red>=</font> <font color=Red>[</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"float"</font> <font color=Red>[</font>mkAttr <font color=Magenta>"value"</font> <font color=Cyan>(</font>show i<font color=Cyan>)</font><font color=Red>]</font> []<font color=Cyan>)</font> ()<font color=Red>]</font>+<a name="line-407"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> e <font color=Red><-</font> element <font color=Red>[</font><font color=Magenta>"float"</font><font color=Red>]</font> <font color=Cyan>;</font> return <font color=Cyan>(</font>attval e<font color=Cyan>)</font> <font color=Cyan>}</font>+<a name="line-408"></a>+<a name="line-409"></a><font color=Green><u>instance</u></font> XmlContent Double <font color=Green><u>where</u></font>+<a name="line-410"></a> toContents i <font color=Red>=</font> <font color=Red>[</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"double"</font> <font color=Red>[</font>mkAttr <font color=Magenta>"value"</font> <font color=Cyan>(</font>show i<font color=Cyan>)</font><font color=Red>]</font> []<font color=Cyan>)</font> ()<font color=Red>]</font>+<a name="line-411"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> e <font color=Red><-</font> element <font color=Red>[</font><font color=Magenta>"double"</font><font color=Red>]</font> <font color=Cyan>;</font> return <font color=Cyan>(</font>attval e<font color=Cyan>)</font> <font color=Cyan>}</font>+<a name="line-412"></a>+<a name="line-413"></a><font color=Green><u>instance</u></font> XmlContent Char <font color=Green><u>where</u></font>+<a name="line-414"></a> <font color=Blue>-- NOT in a string</font>+<a name="line-415"></a> toContents c <font color=Red>=</font> <font color=Red>[</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"char"</font> <font color=Red>[</font>mkAttr <font color=Magenta>"value"</font> <font color=Red>[</font>c<font color=Red>]</font><font color=Red>]</font> []<font color=Cyan>)</font> ()<font color=Red>]</font>+<a name="line-416"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Red>[</font><font color=Cyan>(</font><font color=Magenta>"value"</font><font color=Cyan>,</font><font color=Cyan>(</font>AttValue <font color=Red>[</font>Left <font color=Red>[</font>c<font color=Red>]</font><font color=Red>]</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Red>]</font> []<font color=Cyan>)</font>+<a name="line-417"></a> <font color=Red><-</font> element <font color=Red>[</font><font color=Magenta>"char"</font><font color=Red>]</font>+<a name="line-418"></a> <font color=Cyan>;</font> return c+<a name="line-419"></a> <font color=Cyan>}</font>+<a name="line-420"></a> <font color=Blue>-- Only defined for Char and no other types:</font>+<a name="line-421"></a> xToChar <font color=Red>=</font> id+<a name="line-422"></a> xFromChar <font color=Red>=</font> id+<a name="line-423"></a>+<a name="line-424"></a><font color=Green><u>instance</u></font> XmlContent a <font color=Red>=></font> XmlContent <font color=Red>[</font>a<font color=Red>]</font> <font color=Green><u>where</u></font>+<a name="line-425"></a> toContents xs <font color=Red>=</font> <font color=Green><u>case</u></font> toHType x <font color=Green><u>of</u></font>+<a name="line-426"></a> <font color=Cyan>(</font>Prim <font color=Magenta>"Char"</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font>+<a name="line-427"></a> <font color=Red>[</font>mkElem <font color=Magenta>"string"</font> <font color=Red>[</font>CString True <font color=Cyan>(</font>map xToChar xs<font color=Cyan>)</font> ()<font color=Red>]</font><font color=Red>]</font>+<a name="line-428"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> <font color=Red>[</font>mkElem xs <font color=Cyan>(</font>concatMap toContents xs<font color=Cyan>)</font><font color=Red>]</font>+<a name="line-429"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>x<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> xs+<a name="line-430"></a> parseContents <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>x <font color=Red>-></font>+<a name="line-431"></a> <font color=Green><u>case</u></font> x <font color=Green><u>of</u></font>+<a name="line-432"></a> <font color=Cyan>(</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Red><b>:</b></font>cs<font color=Cyan>)</font>+<a name="line-433"></a> <font color=Red>-></font> <font color=Cyan>(</font>Right <font color=Cyan>(</font>map xFromChar s<font color=Cyan>)</font><font color=Cyan>,</font> cs<font color=Cyan>)</font>+<a name="line-434"></a> <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"string"</font> [] <font color=Red>[</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Red>]</font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Red><b>:</b></font>cs<font color=Cyan>)</font>+<a name="line-435"></a> <font color=Red>-></font> <font color=Cyan>(</font>Right <font color=Cyan>(</font>map xFromChar s<font color=Cyan>)</font><font color=Cyan>,</font> cs<font color=Cyan>)</font>+<a name="line-436"></a> <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem e [] xs<font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Red><b>:</b></font>cs<font color=Cyan>)</font> <font color=Red>|</font> <font color=Magenta>"list"</font> <font color=Cyan>`isPrefixOf`</font> e+<a name="line-437"></a> <font color=Red>-></font> scanElements xs+<a name="line-438"></a> <font color=Green><u>where</u></font>+<a name="line-439"></a> <font color=Blue>-- scanElements :: [Content] -> (Either String [a],[Content])</font>+<a name="line-440"></a> scanElements [] <font color=Red>=</font> <font color=Cyan>(</font>Right []<font color=Cyan>,</font> cs<font color=Cyan>)</font>+<a name="line-441"></a> scanElements es <font color=Red>=</font>+<a name="line-442"></a> <font color=Green><u>case</u></font> runParser parseContents es <font color=Green><u>of</u></font>+<a name="line-443"></a> <font color=Cyan>(</font>Left msg<font color=Cyan>,</font> es'<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False<font color=Cyan>,</font>msg<font color=Cyan>)</font><font color=Cyan>,</font> es'<font color=Cyan>)</font>+<a name="line-444"></a> <font color=Cyan>(</font>Right y<font color=Cyan>,</font> es'<font color=Cyan>)</font> <font color=Red>-></font>+<a name="line-445"></a> <font color=Green><u>case</u></font> scanElements es' <font color=Green><u>of</u></font>+<a name="line-446"></a> <font color=Cyan>(</font>Left msg<font color=Cyan>,</font> ds<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Left msg<font color=Cyan>,</font> ds<font color=Cyan>)</font>+<a name="line-447"></a> <font color=Cyan>(</font>Right ys<font color=Cyan>,</font> ds<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Right <font color=Cyan>(</font>y<font color=Red><b>:</b></font>ys<font color=Cyan>)</font><font color=Cyan>,</font> ds<font color=Cyan>)</font>+<a name="line-448"></a> <font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem e <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font> cs<font color=Cyan>)</font>+<a name="line-449"></a> <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False+<a name="line-450"></a> <font color=Cyan>,</font><font color=Magenta>"Expected a <list-...>, but found a <"</font><font color=Cyan>++</font>e<font color=Cyan>++</font><font color=Magenta>"> at\n"</font>+<a name="line-451"></a> <font color=Cyan>++</font> show pos<font color=Cyan>)</font><font color=Cyan>,</font> cs<font color=Cyan>)</font>+<a name="line-452"></a> <font color=Cyan>(</font>CRef r pos<font color=Red><b>:</b></font> cs<font color=Cyan>)</font>+<a name="line-453"></a> <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False+<a name="line-454"></a> <font color=Cyan>,</font><font color=Magenta>"Expected a <list-...>, but found a ref "</font>+<a name="line-455"></a> <font color=Cyan>++</font>verbatim r<font color=Cyan>++</font><font color=Magenta>" at\n"</font><font color=Cyan>++</font> show pos<font color=Cyan>)</font><font color=Cyan>,</font> cs<font color=Cyan>)</font>+<a name="line-456"></a> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>cs<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Red>\</font> <font color=Cyan>(</font>P p<font color=Cyan>)</font><font color=Red>-></font> p<font color=Cyan>)</font> parseContents<font color=Cyan>)</font> cs <font color=Blue>-- skip comments etc.</font>+<a name="line-457"></a> [] <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False+<a name="line-458"></a> <font color=Cyan>,</font><font color=Magenta>"Ran out of input XML whilst secondary parsing"</font><font color=Cyan>)</font>+<a name="line-459"></a> <font color=Cyan>,</font> []<font color=Cyan>)</font>+<a name="line-460"></a> <font color=Cyan>)</font>+<a name="line-461"></a>+<a name="line-462"></a><font color=Green><u>instance</u></font> XmlContent () <font color=Green><u>where</u></font>+<a name="line-463"></a> toContents () <font color=Red>=</font> <font color=Red>[</font>CElem <font color=Cyan>(</font>Elem <font color=Magenta>"unit"</font> [] []<font color=Cyan>)</font> ()<font color=Red>]</font>+<a name="line-464"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> element <font color=Red>[</font><font color=Magenta>"unit"</font><font color=Red>]</font><font color=Cyan>;</font> return () <font color=Cyan>}</font>+<a name="line-465"></a>+<a name="line-466"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>)</font> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-467"></a> toContents <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font> <font color=Red>=</font> toContents a <font color=Cyan>++</font> toContents b+<a name="line-468"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-469"></a> <font color=Cyan>{</font> a <font color=Red><-</font> parseContents+<a name="line-470"></a> <font color=Cyan>;</font> b <font color=Red><-</font> parseContents+<a name="line-471"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font>+<a name="line-472"></a> <font color=Cyan>}</font>+<a name="line-473"></a>+<a name="line-474"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>,</font> XmlContent c<font color=Cyan>)</font> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-475"></a> toContents <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Red>=</font> toContents a <font color=Cyan>++</font> toContents b <font color=Cyan>++</font> toContents c+<a name="line-476"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-477"></a> <font color=Cyan>{</font> a <font color=Red><-</font> parseContents+<a name="line-478"></a> <font color=Cyan>;</font> b <font color=Red><-</font> parseContents+<a name="line-479"></a> <font color=Cyan>;</font> c <font color=Red><-</font> parseContents+<a name="line-480"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font>+<a name="line-481"></a> <font color=Cyan>}</font>+<a name="line-482"></a>+<a name="line-483"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>,</font> XmlContent c<font color=Cyan>,</font> XmlContent d<font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-484"></a> XmlContent <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-485"></a> toContents <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>)</font> <font color=Red>=</font> toContents a <font color=Cyan>++</font> toContents b <font color=Cyan>++</font> toContents c+<a name="line-486"></a> <font color=Cyan>++</font> toContents d+<a name="line-487"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-488"></a> <font color=Cyan>{</font> a <font color=Red><-</font> parseContents+<a name="line-489"></a> <font color=Cyan>;</font> b <font color=Red><-</font> parseContents+<a name="line-490"></a> <font color=Cyan>;</font> c <font color=Red><-</font> parseContents+<a name="line-491"></a> <font color=Cyan>;</font> d <font color=Red><-</font> parseContents+<a name="line-492"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>)</font>+<a name="line-493"></a> <font color=Cyan>}</font>+<a name="line-494"></a>+<a name="line-495"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>,</font> XmlContent c<font color=Cyan>,</font> XmlContent d+<a name="line-496"></a> <font color=Cyan>,</font> XmlContent e <font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-497"></a> XmlContent <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-498"></a> toContents <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>)</font> <font color=Red>=</font> toContents a <font color=Cyan>++</font> toContents b <font color=Cyan>++</font> toContents c+<a name="line-499"></a> <font color=Cyan>++</font> toContents d <font color=Cyan>++</font> toContents e+<a name="line-500"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-501"></a> <font color=Cyan>{</font> a <font color=Red><-</font> parseContents+<a name="line-502"></a> <font color=Cyan>;</font> b <font color=Red><-</font> parseContents+<a name="line-503"></a> <font color=Cyan>;</font> c <font color=Red><-</font> parseContents+<a name="line-504"></a> <font color=Cyan>;</font> d <font color=Red><-</font> parseContents+<a name="line-505"></a> <font color=Cyan>;</font> e <font color=Red><-</font> parseContents+<a name="line-506"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>)</font>+<a name="line-507"></a> <font color=Cyan>}</font>+<a name="line-508"></a>+<a name="line-509"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>,</font> XmlContent c<font color=Cyan>,</font> XmlContent d+<a name="line-510"></a> <font color=Cyan>,</font> XmlContent e<font color=Cyan>,</font> XmlContent f <font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-511"></a> XmlContent <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-512"></a> toContents <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>)</font> <font color=Red>=</font> toContents a <font color=Cyan>++</font> toContents b <font color=Cyan>++</font> toContents c+<a name="line-513"></a> <font color=Cyan>++</font> toContents d <font color=Cyan>++</font> toContents e <font color=Cyan>++</font> toContents f+<a name="line-514"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-515"></a> <font color=Cyan>{</font> a <font color=Red><-</font> parseContents+<a name="line-516"></a> <font color=Cyan>;</font> b <font color=Red><-</font> parseContents+<a name="line-517"></a> <font color=Cyan>;</font> c <font color=Red><-</font> parseContents+<a name="line-518"></a> <font color=Cyan>;</font> d <font color=Red><-</font> parseContents+<a name="line-519"></a> <font color=Cyan>;</font> e <font color=Red><-</font> parseContents+<a name="line-520"></a> <font color=Cyan>;</font> f <font color=Red><-</font> parseContents+<a name="line-521"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>)</font>+<a name="line-522"></a> <font color=Cyan>}</font>+<a name="line-523"></a>+<a name="line-524"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>,</font> XmlContent c<font color=Cyan>,</font> XmlContent d+<a name="line-525"></a> <font color=Cyan>,</font> XmlContent e<font color=Cyan>,</font> XmlContent f<font color=Cyan>,</font> XmlContent g <font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-526"></a> XmlContent <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-527"></a> toContents <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>)</font>+<a name="line-528"></a> <font color=Red>=</font> toContents a <font color=Cyan>++</font> toContents b <font color=Cyan>++</font> toContents c <font color=Cyan>++</font> toContents d+<a name="line-529"></a> <font color=Cyan>++</font> toContents e <font color=Cyan>++</font> toContents f <font color=Cyan>++</font> toContents g+<a name="line-530"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-531"></a> <font color=Cyan>{</font> a <font color=Red><-</font> parseContents+<a name="line-532"></a> <font color=Cyan>;</font> b <font color=Red><-</font> parseContents+<a name="line-533"></a> <font color=Cyan>;</font> c <font color=Red><-</font> parseContents+<a name="line-534"></a> <font color=Cyan>;</font> d <font color=Red><-</font> parseContents+<a name="line-535"></a> <font color=Cyan>;</font> e <font color=Red><-</font> parseContents+<a name="line-536"></a> <font color=Cyan>;</font> f <font color=Red><-</font> parseContents+<a name="line-537"></a> <font color=Cyan>;</font> g <font color=Red><-</font> parseContents+<a name="line-538"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>)</font>+<a name="line-539"></a> <font color=Cyan>}</font>+<a name="line-540"></a>+<a name="line-541"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>,</font> XmlContent c<font color=Cyan>,</font> XmlContent d+<a name="line-542"></a> <font color=Cyan>,</font> XmlContent e<font color=Cyan>,</font> XmlContent f<font color=Cyan>,</font> XmlContent g<font color=Cyan>,</font> XmlContent h <font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-543"></a> XmlContent <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-544"></a> toContents <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>)</font>+<a name="line-545"></a> <font color=Red>=</font> toContents a <font color=Cyan>++</font> toContents b <font color=Cyan>++</font> toContents c <font color=Cyan>++</font> toContents d+<a name="line-546"></a> <font color=Cyan>++</font> toContents e <font color=Cyan>++</font> toContents f <font color=Cyan>++</font> toContents g <font color=Cyan>++</font> toContents h+<a name="line-547"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-548"></a> <font color=Cyan>{</font> a <font color=Red><-</font> parseContents+<a name="line-549"></a> <font color=Cyan>;</font> b <font color=Red><-</font> parseContents+<a name="line-550"></a> <font color=Cyan>;</font> c <font color=Red><-</font> parseContents+<a name="line-551"></a> <font color=Cyan>;</font> d <font color=Red><-</font> parseContents+<a name="line-552"></a> <font color=Cyan>;</font> e <font color=Red><-</font> parseContents+<a name="line-553"></a> <font color=Cyan>;</font> f <font color=Red><-</font> parseContents+<a name="line-554"></a> <font color=Cyan>;</font> g <font color=Red><-</font> parseContents+<a name="line-555"></a> <font color=Cyan>;</font> h <font color=Red><-</font> parseContents+<a name="line-556"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>)</font>+<a name="line-557"></a> <font color=Cyan>}</font>+<a name="line-558"></a>+<a name="line-559"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>,</font> XmlContent c<font color=Cyan>,</font> XmlContent d+<a name="line-560"></a> <font color=Cyan>,</font> XmlContent e<font color=Cyan>,</font> XmlContent f<font color=Cyan>,</font> XmlContent g<font color=Cyan>,</font> XmlContent h+<a name="line-561"></a> <font color=Cyan>,</font> XmlContent i <font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-562"></a> XmlContent <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-563"></a> toContents <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>)</font>+<a name="line-564"></a> <font color=Red>=</font> toContents a <font color=Cyan>++</font> toContents b <font color=Cyan>++</font> toContents c <font color=Cyan>++</font> toContents d+<a name="line-565"></a> <font color=Cyan>++</font> toContents e <font color=Cyan>++</font> toContents f <font color=Cyan>++</font> toContents g <font color=Cyan>++</font> toContents h+<a name="line-566"></a> <font color=Cyan>++</font> toContents i+<a name="line-567"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-568"></a> <font color=Cyan>{</font> a <font color=Red><-</font> parseContents+<a name="line-569"></a> <font color=Cyan>;</font> b <font color=Red><-</font> parseContents+<a name="line-570"></a> <font color=Cyan>;</font> c <font color=Red><-</font> parseContents+<a name="line-571"></a> <font color=Cyan>;</font> d <font color=Red><-</font> parseContents+<a name="line-572"></a> <font color=Cyan>;</font> e <font color=Red><-</font> parseContents+<a name="line-573"></a> <font color=Cyan>;</font> f <font color=Red><-</font> parseContents+<a name="line-574"></a> <font color=Cyan>;</font> g <font color=Red><-</font> parseContents+<a name="line-575"></a> <font color=Cyan>;</font> h <font color=Red><-</font> parseContents+<a name="line-576"></a> <font color=Cyan>;</font> i <font color=Red><-</font> parseContents+<a name="line-577"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>)</font>+<a name="line-578"></a> <font color=Cyan>}</font>+<a name="line-579"></a>+<a name="line-580"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>,</font> XmlContent c<font color=Cyan>,</font> XmlContent d+<a name="line-581"></a> <font color=Cyan>,</font> XmlContent e<font color=Cyan>,</font> XmlContent f<font color=Cyan>,</font> XmlContent g<font color=Cyan>,</font> XmlContent h+<a name="line-582"></a> <font color=Cyan>,</font> XmlContent i<font color=Cyan>,</font> XmlContent j <font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-583"></a> XmlContent <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-584"></a> toContents <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>)</font>+<a name="line-585"></a> <font color=Red>=</font> toContents a <font color=Cyan>++</font> toContents b <font color=Cyan>++</font> toContents c <font color=Cyan>++</font> toContents d+<a name="line-586"></a> <font color=Cyan>++</font> toContents e <font color=Cyan>++</font> toContents f <font color=Cyan>++</font> toContents g <font color=Cyan>++</font> toContents h+<a name="line-587"></a> <font color=Cyan>++</font> toContents i <font color=Cyan>++</font> toContents j+<a name="line-588"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-589"></a> <font color=Cyan>{</font> a <font color=Red><-</font> parseContents+<a name="line-590"></a> <font color=Cyan>;</font> b <font color=Red><-</font> parseContents+<a name="line-591"></a> <font color=Cyan>;</font> c <font color=Red><-</font> parseContents+<a name="line-592"></a> <font color=Cyan>;</font> d <font color=Red><-</font> parseContents+<a name="line-593"></a> <font color=Cyan>;</font> e <font color=Red><-</font> parseContents+<a name="line-594"></a> <font color=Cyan>;</font> f <font color=Red><-</font> parseContents+<a name="line-595"></a> <font color=Cyan>;</font> g <font color=Red><-</font> parseContents+<a name="line-596"></a> <font color=Cyan>;</font> h <font color=Red><-</font> parseContents+<a name="line-597"></a> <font color=Cyan>;</font> i <font color=Red><-</font> parseContents+<a name="line-598"></a> <font color=Cyan>;</font> j <font color=Red><-</font> parseContents+<a name="line-599"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>)</font>+<a name="line-600"></a> <font color=Cyan>}</font>+<a name="line-601"></a>+<a name="line-602"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>,</font> XmlContent c<font color=Cyan>,</font> XmlContent d+<a name="line-603"></a> <font color=Cyan>,</font> XmlContent e<font color=Cyan>,</font> XmlContent f<font color=Cyan>,</font> XmlContent g<font color=Cyan>,</font> XmlContent h+<a name="line-604"></a> <font color=Cyan>,</font> XmlContent i<font color=Cyan>,</font> XmlContent j<font color=Cyan>,</font> XmlContent k <font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-605"></a> XmlContent <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-606"></a> toContents <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>)</font>+<a name="line-607"></a> <font color=Red>=</font> toContents a <font color=Cyan>++</font> toContents b <font color=Cyan>++</font> toContents c <font color=Cyan>++</font> toContents d+<a name="line-608"></a> <font color=Cyan>++</font> toContents e <font color=Cyan>++</font> toContents f <font color=Cyan>++</font> toContents g <font color=Cyan>++</font> toContents h+<a name="line-609"></a> <font color=Cyan>++</font> toContents i <font color=Cyan>++</font> toContents j <font color=Cyan>++</font> toContents k+<a name="line-610"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-611"></a> <font color=Cyan>{</font> a <font color=Red><-</font> parseContents+<a name="line-612"></a> <font color=Cyan>;</font> b <font color=Red><-</font> parseContents+<a name="line-613"></a> <font color=Cyan>;</font> c <font color=Red><-</font> parseContents+<a name="line-614"></a> <font color=Cyan>;</font> d <font color=Red><-</font> parseContents+<a name="line-615"></a> <font color=Cyan>;</font> e <font color=Red><-</font> parseContents+<a name="line-616"></a> <font color=Cyan>;</font> f <font color=Red><-</font> parseContents+<a name="line-617"></a> <font color=Cyan>;</font> g <font color=Red><-</font> parseContents+<a name="line-618"></a> <font color=Cyan>;</font> h <font color=Red><-</font> parseContents+<a name="line-619"></a> <font color=Cyan>;</font> i <font color=Red><-</font> parseContents+<a name="line-620"></a> <font color=Cyan>;</font> j <font color=Red><-</font> parseContents+<a name="line-621"></a> <font color=Cyan>;</font> k <font color=Red><-</font> parseContents+<a name="line-622"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>)</font>+<a name="line-623"></a> <font color=Cyan>}</font>+<a name="line-624"></a>+<a name="line-625"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>,</font> XmlContent c<font color=Cyan>,</font> XmlContent d+<a name="line-626"></a> <font color=Cyan>,</font> XmlContent e<font color=Cyan>,</font> XmlContent f<font color=Cyan>,</font> XmlContent g<font color=Cyan>,</font> XmlContent h+<a name="line-627"></a> <font color=Cyan>,</font> XmlContent i<font color=Cyan>,</font> XmlContent j<font color=Cyan>,</font> XmlContent k<font color=Cyan>,</font> XmlContent l <font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-628"></a> XmlContent <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-629"></a> toContents <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>)</font>+<a name="line-630"></a> <font color=Red>=</font> toContents a <font color=Cyan>++</font> toContents b <font color=Cyan>++</font> toContents c <font color=Cyan>++</font> toContents d+<a name="line-631"></a> <font color=Cyan>++</font> toContents e <font color=Cyan>++</font> toContents f <font color=Cyan>++</font> toContents g <font color=Cyan>++</font> toContents h+<a name="line-632"></a> <font color=Cyan>++</font> toContents i <font color=Cyan>++</font> toContents j <font color=Cyan>++</font> toContents k <font color=Cyan>++</font> toContents l+<a name="line-633"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-634"></a> <font color=Cyan>{</font> a <font color=Red><-</font> parseContents+<a name="line-635"></a> <font color=Cyan>;</font> b <font color=Red><-</font> parseContents+<a name="line-636"></a> <font color=Cyan>;</font> c <font color=Red><-</font> parseContents+<a name="line-637"></a> <font color=Cyan>;</font> d <font color=Red><-</font> parseContents+<a name="line-638"></a> <font color=Cyan>;</font> e <font color=Red><-</font> parseContents+<a name="line-639"></a> <font color=Cyan>;</font> f <font color=Red><-</font> parseContents+<a name="line-640"></a> <font color=Cyan>;</font> g <font color=Red><-</font> parseContents+<a name="line-641"></a> <font color=Cyan>;</font> h <font color=Red><-</font> parseContents+<a name="line-642"></a> <font color=Cyan>;</font> i <font color=Red><-</font> parseContents+<a name="line-643"></a> <font color=Cyan>;</font> j <font color=Red><-</font> parseContents+<a name="line-644"></a> <font color=Cyan>;</font> k <font color=Red><-</font> parseContents+<a name="line-645"></a> <font color=Cyan>;</font> l <font color=Red><-</font> parseContents+<a name="line-646"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>)</font>+<a name="line-647"></a> <font color=Cyan>}</font>+<a name="line-648"></a>+<a name="line-649"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>,</font> XmlContent c<font color=Cyan>,</font> XmlContent d+<a name="line-650"></a> <font color=Cyan>,</font> XmlContent e<font color=Cyan>,</font> XmlContent f<font color=Cyan>,</font> XmlContent g<font color=Cyan>,</font> XmlContent h+<a name="line-651"></a> <font color=Cyan>,</font> XmlContent i<font color=Cyan>,</font> XmlContent j<font color=Cyan>,</font> XmlContent k<font color=Cyan>,</font> XmlContent l+<a name="line-652"></a> <font color=Cyan>,</font> XmlContent m <font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-653"></a> XmlContent <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>,</font>m<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-654"></a> toContents <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>,</font>m<font color=Cyan>)</font>+<a name="line-655"></a> <font color=Red>=</font> toContents a <font color=Cyan>++</font> toContents b <font color=Cyan>++</font> toContents c <font color=Cyan>++</font> toContents d+<a name="line-656"></a> <font color=Cyan>++</font> toContents e <font color=Cyan>++</font> toContents f <font color=Cyan>++</font> toContents g <font color=Cyan>++</font> toContents h+<a name="line-657"></a> <font color=Cyan>++</font> toContents i <font color=Cyan>++</font> toContents j <font color=Cyan>++</font> toContents k <font color=Cyan>++</font> toContents l+<a name="line-658"></a> <font color=Cyan>++</font> toContents m+<a name="line-659"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-660"></a> <font color=Cyan>{</font> a <font color=Red><-</font> parseContents+<a name="line-661"></a> <font color=Cyan>;</font> b <font color=Red><-</font> parseContents+<a name="line-662"></a> <font color=Cyan>;</font> c <font color=Red><-</font> parseContents+<a name="line-663"></a> <font color=Cyan>;</font> d <font color=Red><-</font> parseContents+<a name="line-664"></a> <font color=Cyan>;</font> e <font color=Red><-</font> parseContents+<a name="line-665"></a> <font color=Cyan>;</font> f <font color=Red><-</font> parseContents+<a name="line-666"></a> <font color=Cyan>;</font> g <font color=Red><-</font> parseContents+<a name="line-667"></a> <font color=Cyan>;</font> h <font color=Red><-</font> parseContents+<a name="line-668"></a> <font color=Cyan>;</font> i <font color=Red><-</font> parseContents+<a name="line-669"></a> <font color=Cyan>;</font> j <font color=Red><-</font> parseContents+<a name="line-670"></a> <font color=Cyan>;</font> k <font color=Red><-</font> parseContents+<a name="line-671"></a> <font color=Cyan>;</font> l <font color=Red><-</font> parseContents+<a name="line-672"></a> <font color=Cyan>;</font> m <font color=Red><-</font> parseContents+<a name="line-673"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>,</font>m<font color=Cyan>)</font>+<a name="line-674"></a> <font color=Cyan>}</font>+<a name="line-675"></a>+<a name="line-676"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>,</font> XmlContent c<font color=Cyan>,</font> XmlContent d+<a name="line-677"></a> <font color=Cyan>,</font> XmlContent e<font color=Cyan>,</font> XmlContent f<font color=Cyan>,</font> XmlContent g<font color=Cyan>,</font> XmlContent h+<a name="line-678"></a> <font color=Cyan>,</font> XmlContent i<font color=Cyan>,</font> XmlContent j<font color=Cyan>,</font> XmlContent k<font color=Cyan>,</font> XmlContent l+<a name="line-679"></a> <font color=Cyan>,</font> XmlContent m<font color=Cyan>,</font> XmlContent n <font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-680"></a> XmlContent <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>,</font>m<font color=Cyan>,</font>n<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-681"></a> toContents <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>,</font>m<font color=Cyan>,</font>n<font color=Cyan>)</font>+<a name="line-682"></a> <font color=Red>=</font> toContents a <font color=Cyan>++</font> toContents b <font color=Cyan>++</font> toContents c <font color=Cyan>++</font> toContents d+<a name="line-683"></a> <font color=Cyan>++</font> toContents e <font color=Cyan>++</font> toContents f <font color=Cyan>++</font> toContents g <font color=Cyan>++</font> toContents h+<a name="line-684"></a> <font color=Cyan>++</font> toContents i <font color=Cyan>++</font> toContents j <font color=Cyan>++</font> toContents k <font color=Cyan>++</font> toContents l+<a name="line-685"></a> <font color=Cyan>++</font> toContents m <font color=Cyan>++</font> toContents n+<a name="line-686"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-687"></a> <font color=Cyan>{</font> a <font color=Red><-</font> parseContents+<a name="line-688"></a> <font color=Cyan>;</font> b <font color=Red><-</font> parseContents+<a name="line-689"></a> <font color=Cyan>;</font> c <font color=Red><-</font> parseContents+<a name="line-690"></a> <font color=Cyan>;</font> d <font color=Red><-</font> parseContents+<a name="line-691"></a> <font color=Cyan>;</font> e <font color=Red><-</font> parseContents+<a name="line-692"></a> <font color=Cyan>;</font> f <font color=Red><-</font> parseContents+<a name="line-693"></a> <font color=Cyan>;</font> g <font color=Red><-</font> parseContents+<a name="line-694"></a> <font color=Cyan>;</font> h <font color=Red><-</font> parseContents+<a name="line-695"></a> <font color=Cyan>;</font> i <font color=Red><-</font> parseContents+<a name="line-696"></a> <font color=Cyan>;</font> j <font color=Red><-</font> parseContents+<a name="line-697"></a> <font color=Cyan>;</font> k <font color=Red><-</font> parseContents+<a name="line-698"></a> <font color=Cyan>;</font> l <font color=Red><-</font> parseContents+<a name="line-699"></a> <font color=Cyan>;</font> m <font color=Red><-</font> parseContents+<a name="line-700"></a> <font color=Cyan>;</font> n <font color=Red><-</font> parseContents+<a name="line-701"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>,</font>m<font color=Cyan>,</font>n<font color=Cyan>)</font>+<a name="line-702"></a> <font color=Cyan>}</font>+<a name="line-703"></a>+<a name="line-704"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font> XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>,</font> XmlContent c<font color=Cyan>,</font> XmlContent d+<a name="line-705"></a> <font color=Cyan>,</font> XmlContent e<font color=Cyan>,</font> XmlContent f<font color=Cyan>,</font> XmlContent g<font color=Cyan>,</font> XmlContent h+<a name="line-706"></a> <font color=Cyan>,</font> XmlContent i<font color=Cyan>,</font> XmlContent j<font color=Cyan>,</font> XmlContent k<font color=Cyan>,</font> XmlContent l+<a name="line-707"></a> <font color=Cyan>,</font> XmlContent m<font color=Cyan>,</font> XmlContent n<font color=Cyan>,</font> XmlContent o <font color=Cyan>)</font> <font color=Red>=></font>+<a name="line-708"></a> XmlContent <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>,</font>m<font color=Cyan>,</font>n<font color=Cyan>,</font>o<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-709"></a> toContents <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>,</font>m<font color=Cyan>,</font>n<font color=Cyan>,</font>o<font color=Cyan>)</font>+<a name="line-710"></a> <font color=Red>=</font> toContents a <font color=Cyan>++</font> toContents b <font color=Cyan>++</font> toContents c <font color=Cyan>++</font> toContents d+<a name="line-711"></a> <font color=Cyan>++</font> toContents e <font color=Cyan>++</font> toContents f <font color=Cyan>++</font> toContents g <font color=Cyan>++</font> toContents h+<a name="line-712"></a> <font color=Cyan>++</font> toContents i <font color=Cyan>++</font> toContents j <font color=Cyan>++</font> toContents k <font color=Cyan>++</font> toContents l+<a name="line-713"></a> <font color=Cyan>++</font> toContents m <font color=Cyan>++</font> toContents n <font color=Cyan>++</font> toContents o+<a name="line-714"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-715"></a> <font color=Cyan>{</font> a <font color=Red><-</font> parseContents+<a name="line-716"></a> <font color=Cyan>;</font> b <font color=Red><-</font> parseContents+<a name="line-717"></a> <font color=Cyan>;</font> c <font color=Red><-</font> parseContents+<a name="line-718"></a> <font color=Cyan>;</font> d <font color=Red><-</font> parseContents+<a name="line-719"></a> <font color=Cyan>;</font> e <font color=Red><-</font> parseContents+<a name="line-720"></a> <font color=Cyan>;</font> f <font color=Red><-</font> parseContents+<a name="line-721"></a> <font color=Cyan>;</font> g <font color=Red><-</font> parseContents+<a name="line-722"></a> <font color=Cyan>;</font> h <font color=Red><-</font> parseContents+<a name="line-723"></a> <font color=Cyan>;</font> i <font color=Red><-</font> parseContents+<a name="line-724"></a> <font color=Cyan>;</font> j <font color=Red><-</font> parseContents+<a name="line-725"></a> <font color=Cyan>;</font> k <font color=Red><-</font> parseContents+<a name="line-726"></a> <font color=Cyan>;</font> l <font color=Red><-</font> parseContents+<a name="line-727"></a> <font color=Cyan>;</font> m <font color=Red><-</font> parseContents+<a name="line-728"></a> <font color=Cyan>;</font> n <font color=Red><-</font> parseContents+<a name="line-729"></a> <font color=Cyan>;</font> o <font color=Red><-</font> parseContents+<a name="line-730"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>,</font>d<font color=Cyan>,</font>e<font color=Cyan>,</font>f<font color=Cyan>,</font>g<font color=Cyan>,</font>h<font color=Cyan>,</font>i<font color=Cyan>,</font>j<font color=Cyan>,</font>k<font color=Cyan>,</font>l<font color=Cyan>,</font>m<font color=Cyan>,</font>n<font color=Cyan>,</font>o<font color=Cyan>)</font>+<a name="line-731"></a> <font color=Cyan>}</font>+<a name="line-732"></a>+<a name="line-733"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>)</font> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>Maybe a<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-734"></a> toContents m <font color=Red>=</font> <font color=Red>[</font>mkElem m <font color=Cyan>(</font>maybe [] toContents m<font color=Cyan>)</font><font color=Red>]</font>+<a name="line-735"></a> parseContents <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="line-736"></a> <font color=Cyan>{</font> e <font color=Red><-</font> elementWith <font color=Cyan>(</font>flip isPrefixOf<font color=Cyan>)</font> <font color=Red>[</font><font color=Magenta>"maybe"</font><font color=Red>]</font>+<a name="line-737"></a> <font color=Cyan>;</font> <font color=Green><u>case</u></font> e <font color=Green><u>of</u></font> <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> [] []<font color=Cyan>)</font> <font color=Red>-></font> return Nothing+<a name="line-738"></a> <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> [] <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> fmap Just <font color=Cyan>(</font>interior e parseContents<font color=Cyan>)</font>+<a name="line-739"></a> <font color=Cyan>}</font>+<a name="line-740"></a>+<a name="line-741"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font> XmlContent b<font color=Cyan>)</font> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>Either a b<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-742"></a> toContents v<font color=Red>@</font><font color=Cyan>(</font>Left aa<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-743"></a> <font color=Red>[</font>mkElemC <font color=Cyan>(</font>showConstr <font color=Magenta>0</font> <font color=Cyan>(</font>toHType v<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>toContents aa<font color=Cyan>)</font><font color=Red>]</font>+<a name="line-744"></a> toContents v<font color=Red>@</font><font color=Cyan>(</font>Right ab<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-745"></a> <font color=Red>[</font>mkElemC <font color=Cyan>(</font>showConstr <font color=Magenta>1</font> <font color=Cyan>(</font>toHType v<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>toContents ab<font color=Cyan>)</font><font color=Red>]</font>+<a name="line-746"></a> parseContents <font color=Red>=</font>+<a name="line-747"></a> <font color=Cyan>(</font>inElementWith <font color=Cyan>(</font>flip isPrefixOf<font color=Cyan>)</font> <font color=Magenta>"Left"</font> <font color=Cyan>$</font> fmap Left parseContents<font color=Cyan>)</font>+<a name="line-748"></a> <font color=Cyan>`onFail`</font>+<a name="line-749"></a> <font color=Cyan>(</font>inElementWith <font color=Cyan>(</font>flip isPrefixOf<font color=Cyan>)</font> <font color=Magenta>"Right"</font> <font color=Cyan>$</font> fmap Right parseContents<font color=Cyan>)</font>+<a name="line-750"></a>+<a name="line-751"></a><font color=Blue>-- do{ e@(Elem t [] _) <- element ["Left","Right"]</font>+<a name="line-752"></a><font color=Blue>-- ; case t of</font>+<a name="line-753"></a><font color=Blue>-- _ | "Left" `isPrefixOf` t -> fmap Left (interior e parseContents)</font>+<a name="line-754"></a><font color=Blue>-- | "Right" `isPrefixOf` t -> fmap Right (interior e parseContents)</font>+<a name="line-755"></a><font color=Blue>-- }</font>+<a name="line-756"></a>+<a name="line-757"></a>+<a name="line-758"></a><font color=Blue>------------------------------------------------------------------------</font>+<a name="line-759"></a><font color=Blue>-- Useful auxiliaries for "fromAttributes"</font>+<a name="line-760"></a><font color=Blue>------------------------------------------------------------------------</font>+<a name="line-761"></a>+<a name="line-762"></a><a name="Defaultable"></a><font color=Blue>-- | If an attribute is defaultable, then it either takes the default</font>+<a name="line-763"></a><a name="Defaultable"></a><font color=Blue>-- value (which is omitted from the output), or a non-default value</font>+<a name="line-764"></a><a name="Defaultable"></a><font color=Blue>-- (which obviously must be printed).</font>+<a name="line-765"></a><a name="Defaultable"></a><font color=Green><u>data</u></font> Defaultable a <font color=Red>=</font> Default a <font color=Red>|</font> NonDefault a <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="line-766"></a>+<a name="line-767"></a><a name="searchMaybe"></a><font color=Blue>searchMaybe</font> <font color=Red>::</font> <font color=Cyan>(</font>a <font color=Red>-></font> Maybe b<font color=Cyan>)</font> <font color=Red>-></font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-></font> Maybe b+<a name="line-768"></a><font color=Blue>searchMaybe</font> <font color=Green><u>_</u></font> [] <font color=Red>=</font> Nothing+<a name="line-769"></a><font color=Blue>searchMaybe</font> f <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-770"></a> <font color=Green><u>let</u></font> fx <font color=Red>=</font> f x <font color=Green><u>in</u></font>+<a name="line-771"></a> <font color=Green><u>case</u></font> fx <font color=Green><u>of</u></font>+<a name="line-772"></a> Nothing <font color=Red>-></font> searchMaybe f xs+<a name="line-773"></a> <font color=Cyan>(</font>Just <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> fx+<a name="line-774"></a>+<a name="line-775"></a><a name="maybeToAttr"></a><font color=Blue>maybeToAttr</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>a<font color=Red>-></font>Maybe Attribute<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> Maybe a+<a name="line-776"></a> <font color=Red>-></font> Maybe Attribute+<a name="line-777"></a><font color=Blue>maybeToAttr</font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> Nothing <font color=Red>=</font> Nothing+<a name="line-778"></a><font color=Blue>maybeToAttr</font> to n <font color=Cyan>(</font>Just v<font color=Cyan>)</font> <font color=Red>=</font> to n v+<a name="line-779"></a>+<a name="line-780"></a><a name="defaultToAttr"></a><font color=Blue>defaultToAttr</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>a<font color=Red>-></font>Maybe Attribute<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> Defaultable a+<a name="line-781"></a> <font color=Red>-></font> Maybe Attribute+<a name="line-782"></a><font color=Blue>defaultToAttr</font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Cyan>(</font>Default <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> Nothing+<a name="line-783"></a><font color=Blue>defaultToAttr</font> to n <font color=Cyan>(</font>NonDefault v<font color=Cyan>)</font> <font color=Red>=</font> to n v+<a name="line-784"></a>+<a name="line-785"></a><a name="definiteA"></a><font color=Blue>definiteA</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>Attribute<font color=Red>-></font>Maybe a<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> String+<a name="line-786"></a> <font color=Red>-></font> <font color=Red>[</font>Attribute<font color=Red>]</font> <font color=Red>-></font> a+<a name="line-787"></a><font color=Blue>definiteA</font> from tag at <font color=Green><u>as</u></font> <font color=Red>=</font>+<a name="line-788"></a> <font color=Green><u>case</u></font> searchMaybe <font color=Cyan>(</font>from at<font color=Cyan>)</font> <font color=Green><u>as</u></font> <font color=Green><u>of</u></font>+<a name="line-789"></a> Nothing <font color=Red>-></font> error <font color=Cyan>(</font><font color=Magenta>"missing attribute "</font><font color=Cyan>++</font>at<font color=Cyan>++</font><font color=Magenta>" in tag <"</font><font color=Cyan>++</font>tag<font color=Cyan>++</font><font color=Magenta>">"</font><font color=Cyan>)</font>+<a name="line-790"></a> <font color=Cyan>(</font>Just a<font color=Cyan>)</font> <font color=Red>-></font> a+<a name="line-791"></a>+<a name="line-792"></a><a name="defaultA"></a><font color=Blue>defaultA</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>Attribute<font color=Red>-></font>Maybe a<font color=Cyan>)</font> <font color=Red>-></font> a <font color=Red>-></font> String+<a name="line-793"></a> <font color=Red>-></font> <font color=Red>[</font>Attribute<font color=Red>]</font> <font color=Red>-></font> Defaultable a+<a name="line-794"></a><font color=Blue>defaultA</font> from def at <font color=Green><u>as</u></font> <font color=Red>=</font>+<a name="line-795"></a> <font color=Green><u>case</u></font> searchMaybe <font color=Cyan>(</font>from at<font color=Cyan>)</font> <font color=Green><u>as</u></font> <font color=Green><u>of</u></font>+<a name="line-796"></a> Nothing <font color=Red>-></font> Default def+<a name="line-797"></a> <font color=Cyan>(</font>Just a<font color=Cyan>)</font> <font color=Red>-></font> NonDefault a+<a name="line-798"></a>+<a name="line-799"></a><a name="possibleA"></a><font color=Blue>possibleA</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>Attribute<font color=Red>-></font>Maybe a<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> <font color=Red>[</font>Attribute<font color=Red>]</font> <font color=Red>-></font> Maybe a+<a name="line-800"></a><font color=Blue>possibleA</font> from at <font color=Green><u>as</u></font> <font color=Red>=</font> searchMaybe <font color=Cyan>(</font>from at<font color=Cyan>)</font> <font color=Green><u>as</u></font>+<a name="line-801"></a>+<a name="line-802"></a><a name="fromAttrToStr"></a><font color=Blue>fromAttrToStr</font> <font color=Red>::</font> String <font color=Red>-></font> Attribute <font color=Red>-></font> Maybe String+<a name="line-803"></a><font color=Blue>fromAttrToStr</font> n <font color=Cyan>(</font>n0<font color=Cyan>,</font>v<font color=Cyan>)</font>+<a name="line-804"></a> <font color=Red>|</font> n <font color=Cyan>==</font> n0 <font color=Red>=</font> Just <font color=Cyan>(</font>attr2str v<font color=Cyan>)</font>+<a name="line-805"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> Nothing+<a name="line-806"></a>+<a name="line-807"></a><a name="toAttrFrStr"></a><font color=Blue>toAttrFrStr</font> <font color=Red>::</font> String <font color=Red>-></font> String <font color=Red>-></font> Maybe Attribute+<a name="line-808"></a><font color=Blue>toAttrFrStr</font> n v <font color=Red>=</font> Just <font color=Cyan>(</font>n<font color=Cyan>,</font> str2attr v<font color=Cyan>)</font>+<a name="line-809"></a>+<a name="line-810"></a><a name="str2attr"></a><font color=Blue>str2attr</font> <font color=Red>::</font> String <font color=Red>-></font> AttValue+<a name="line-811"></a><font color=Blue>str2attr</font> s <font color=Red>=</font>+<a name="line-812"></a> <font color=Green><u>let</u></font> f t <font color=Red>=</font>+<a name="line-813"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>l<font color=Cyan>,</font>r<font color=Cyan>)</font> <font color=Red>=</font> span <font color=Cyan>(</font><font color=Red>\</font>c<font color=Red>-></font> not <font color=Cyan>(</font>elem c <font color=Magenta>"\"&<>'"</font><font color=Cyan>)</font><font color=Cyan>)</font> t+<a name="line-814"></a> <font color=Green><u>in</u></font> <font color=Green><u>if</u></font> null r <font color=Green><u>then</u></font> <font color=Red>[</font>Left l<font color=Red>]</font>+<a name="line-815"></a> <font color=Green><u>else</u></font> Left l<font color=Red><b>:</b></font> Right <font color=Cyan>(</font>g <font color=Cyan>(</font>head r<font color=Cyan>)</font><font color=Cyan>)</font><font color=Red><b>:</b></font> f <font color=Cyan>(</font>tail r<font color=Cyan>)</font>+<a name="line-816"></a> g <font color=Magenta>'"'</font> <font color=Red>=</font> RefEntity <font color=Magenta>"quot"</font>+<a name="line-817"></a> g <font color=Magenta>'&'</font> <font color=Red>=</font> RefEntity <font color=Magenta>"amp"</font>+<a name="line-818"></a> g <font color=Magenta>'<'</font> <font color=Red>=</font> RefEntity <font color=Magenta>"lt"</font>+<a name="line-819"></a> g <font color=Magenta>'>'</font> <font color=Red>=</font> RefEntity <font color=Magenta>"gt"</font>+<a name="line-820"></a> g <font color=Magenta>'\''</font> <font color=Red>=</font> RefEntity <font color=Magenta>"apos"</font>+<a name="line-821"></a> <font color=Green><u>in</u></font> AttValue <font color=Cyan>(</font>f s<font color=Cyan>)</font>+<a name="line-822"></a>+<a name="line-823"></a><a name="attr2str"></a><font color=Blue>attr2str</font> <font color=Red>::</font> AttValue <font color=Red>-></font> String <font color=Blue>-- really needs symbol table</font>+<a name="line-824"></a><font color=Blue>attr2str</font> <font color=Cyan>(</font>AttValue xs<font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-825"></a> <font color=Green><u>let</u></font> f <font color=Cyan>(</font>Left s<font color=Cyan>)</font> <font color=Red>=</font> s+<a name="line-826"></a> f <font color=Cyan>(</font>Right <font color=Cyan>(</font>RefChar i<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>[</font>chr i<font color=Red>]</font>+<a name="line-827"></a> f <font color=Cyan>(</font>Right <font color=Cyan>(</font>RefEntity <font color=Magenta>"quot"</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"\""</font>+<a name="line-828"></a> f <font color=Cyan>(</font>Right <font color=Cyan>(</font>RefEntity <font color=Magenta>"amp"</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"&"</font>+<a name="line-829"></a> f <font color=Cyan>(</font>Right <font color=Cyan>(</font>RefEntity <font color=Magenta>"lt"</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"<"</font>+<a name="line-830"></a> f <font color=Cyan>(</font>Right <font color=Cyan>(</font>RefEntity <font color=Magenta>"gt"</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>">"</font>+<a name="line-831"></a> f <font color=Cyan>(</font>Right <font color=Cyan>(</font>RefEntity <font color=Magenta>"apos"</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"'"</font>+<a name="line-832"></a> f <font color=Cyan>(</font>Right <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"*"</font> <font color=Blue>-- Ooops, ST needed here.</font>+<a name="line-833"></a> <font color=Green><u>in</u></font> concatMap f xs+<a name="line-834"></a>+<a name="line-835"></a><font color=Blue>------------------------------------------------------------------------</font>+<a name="line-836"></a><font color=Blue>-- New content-model types</font>+<a name="line-837"></a><font color=Blue>------------------------------------------------------------------------</font>+<a name="line-838"></a>+<a name="line-839"></a><font color=Blue>{-+<a name="line-840"></a>data OneOf2 a b+<a name="line-841"></a>data OneOf3 a b c+<a name="line-842"></a>data OneOf4 a b c d+<a name="line-843"></a> ... etc are now defined (with instances) in module OneOfN.+<a name="line-844"></a>-}</font>+<a name="line-845"></a>+<a name="line-846"></a><a name="ANYContent"></a><font color=Blue>-- | A type corresponding to XML's ANY contentspec.</font>+<a name="line-847"></a><a name="ANYContent"></a><font color=Blue>-- It is either a list of unconverted xml 'Content'</font>+<a name="line-848"></a><a name="ANYContent"></a><font color=Blue>-- or some 'XmlContent'-able value.</font>+<a name="line-849"></a><a name="ANYContent"></a><font color=Blue>--</font>+<a name="line-850"></a><a name="ANYContent"></a><font color=Blue>-- Parsing functions (e.g. 'parseContents') will always produce 'UnConverted'.</font>+<a name="line-851"></a><a name="ANYContent"></a><font color=Blue>-- Note: The Show instance for 'UnConverted' uses 'verbatim'.</font>+<a name="line-852"></a><a name="ANYContent"></a><font color=Green><u>data</u></font> ANYContent <font color=Red>=</font> <font color=Green><u>forall</u></font> a <font color=Cyan>.</font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>,</font> Show a<font color=Cyan>)</font> <font color=Red>=></font> ANYContent a+<a name="line-853"></a> <font color=Red>|</font> UnConverted <font color=Red>[</font>Content Posn<font color=Red>]</font>+<a name="line-854"></a>+<a name="line-855"></a><font color=Green><u>instance</u></font> Show ANYContent <font color=Green><u>where</u></font>+<a name="line-856"></a> show <font color=Cyan>(</font>UnConverted c<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"UnConverted "</font> <font color=Cyan>++</font> <font color=Cyan>(</font>show <font color=Cyan>$</font> map verbatim c<font color=Cyan>)</font>+<a name="line-857"></a> show <font color=Cyan>(</font>ANYContent a<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"ANYContent "</font> <font color=Cyan>++</font> <font color=Cyan>(</font>show a<font color=Cyan>)</font>+<a name="line-858"></a>+<a name="line-859"></a><font color=Green><u>instance</u></font> Eq ANYContent <font color=Green><u>where</u></font>+<a name="line-860"></a> a <font color=Cyan>==</font> b <font color=Red>=</font> show a <font color=Cyan>==</font> show b+<a name="line-861"></a>+<a name="line-862"></a><a name="List1"></a><font color=Blue>-- | The List1 type represents lists with at least one element.</font>+<a name="line-863"></a><a name="List1"></a><font color=Blue>-- It is required for DTD content models that use + as a modifier.</font>+<a name="line-864"></a><a name="List1"></a><font color=Green><u>data</u></font> List1 a <font color=Red>=</font> NonEmpty <font color=Red>[</font>a<font color=Red>]</font> <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font> Show<font color=Cyan>)</font>+<a name="line-865"></a>+<a name="line-866"></a>+<a name="line-867"></a><font color=Blue>------------------------------------------------------------------------</font>+<a name="line-868"></a><font color=Blue>-- Instances for new content-model types</font>+<a name="line-869"></a><font color=Blue>------------------------------------------------------------------------</font>+<a name="line-870"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>HTypeable a<font color=Cyan>)</font> <font color=Red>=></font> HTypeable <font color=Cyan>(</font>List1 a<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-871"></a> toHType m <font color=Red>=</font> Defined <font color=Magenta>"List1"</font> <font color=Red>[</font>hx<font color=Red>]</font>+<a name="line-872"></a> <font color=Red>[</font>Constr <font color=Magenta>"NonEmpty"</font> <font color=Red>[</font>hx<font color=Red>]</font> <font color=Red>[</font>List hx<font color=Red>]</font> <font color=Blue>{-Nothing-}</font><font color=Red>]</font>+<a name="line-873"></a> <font color=Green><u>where</u></font> <font color=Cyan>(</font>NonEmpty x<font color=Cyan>)</font> <font color=Red>=</font> m+<a name="line-874"></a> hx <font color=Red>=</font> toHType x+<a name="line-875"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>XmlContent a<font color=Cyan>)</font> <font color=Red>=></font> XmlContent <font color=Cyan>(</font>List1 a<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-876"></a> toContents <font color=Cyan>(</font>NonEmpty xs<font color=Cyan>)</font> <font color=Red>=</font> concatMap toContents xs+<a name="line-877"></a> parseContents <font color=Red>=</font> fmap NonEmpty <font color=Cyan>$</font> many1 parseContents+<a name="line-878"></a>+<a name="line-879"></a><font color=Green><u>instance</u></font> HTypeable ANYContent <font color=Green><u>where</u></font>+<a name="line-880"></a> toHType <font color=Green><u>_</u></font> <font color=Red>=</font> Prim <font color=Magenta>"ANYContent"</font> <font color=Magenta>"ANY"</font>+<a name="line-881"></a><font color=Green><u>instance</u></font> XmlContent ANYContent <font color=Green><u>where</u></font>+<a name="line-882"></a> toContents <font color=Cyan>(</font>ANYContent a<font color=Cyan>)</font> <font color=Red>=</font> toContents a+<a name="line-883"></a> toContents <font color=Cyan>(</font>UnConverted s<font color=Cyan>)</font> <font color=Red>=</font> map <font color=Cyan>(</font>fmap <font color=Cyan>(</font>const ()<font color=Cyan>)</font><font color=Cyan>)</font> s+<a name="line-884"></a> parseContents <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>cs <font color=Red>-></font> <font color=Cyan>(</font>Right <font color=Cyan>(</font>UnConverted cs<font color=Cyan>)</font><font color=Cyan>,</font> []<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-885"></a>+<a name="line-886"></a><font color=Blue>------------------------------------------------------------------------</font>+<a name="line-887"></a><font color=Blue>--</font>+<a name="line-888"></a><font color=Blue>------------------------------------------------------------------------</font>+</pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/Xtract/Combinators.html view
@@ -1,108 +1,114 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>-- | This is a new set of XML combinators for Xtract, not standard,</font>-<a name="(line2)"></a><font color=Blue>-- but based on the standard set in "Text.Xml.Haxml.Combinators".</font>-<a name="(line3)"></a><font color=Blue>-- The main difference is that the Content Filter type becomes a</font>-<a name="(line4)"></a><font color=Blue>-- Double Filter. A Double Filter always takes the whole document</font>-<a name="(line5)"></a><font color=Blue>-- as an extra argument, so you can start to traverse it again from</font>-<a name="(line6)"></a><font color=Blue>-- the root, when at any inner location within the document tree.</font>-<a name="(line7)"></a><font color=Blue>--</font>-<a name="(line8)"></a><font color=Blue>-- The new combinator definitions are derived from the old ones.</font>-<a name="(line9)"></a><font color=Blue>-- The same names have the equivalent meaning - use module qualification</font>-<a name="(line10)"></a><font color=Blue>-- on imports to distinguish between CFilter and DFilter variations.</font>-<a name="(line11)"></a>-<a name="(line12)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Xtract<font color=Cyan>.</font>Combinators <font color=Green><u>where</u></font>-<a name="(line13)"></a>-<a name="(line14)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types-<a name="(line15)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Combinators <font color=Cyan>(</font>CFilter<font color=Cyan>)</font>-<a name="(line16)"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Combinators <font color=Green><u>as</u></font> C-<a name="(line17)"></a>-<a name="(line18)"></a>-<a name="(line19)"></a><a name="DFilter"></a><font color=Blue>-- | double content filter - takes document root + local subtree.</font>-<a name="(line20)"></a><a name="DFilter"></a><font color=Green><u>type</u></font> DFilter i <font color=Red>=</font> Content i <font color=Red>-></font> Content i <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font>-<a name="(line21)"></a>-<a name="(line22)"></a><a name="local"></a><font color=Blue>-- | lift an ordinary content filter to a double filter.</font>-<a name="(line23)"></a>local<font color=Cyan>,</font>global <font color=Red>::</font> CFilter i <font color=Red>-></font> DFilter i-<a name="(line24)"></a>local f <font color=Red>=</font> <font color=Red>\</font>xml sub<font color=Red>-></font> f sub-<a name="(line25)"></a><a name="global"></a>global f <font color=Red>=</font> <font color=Red>\</font>xml sub<font color=Red>-></font> f xml-<a name="(line26)"></a>-<a name="(line27)"></a><a name="dfilter"></a><font color=Blue>-- | drop a double filter to an ordinary content filter.</font>-<a name="(line28)"></a><font color=Blue>-- (permitting interior access to document root)</font>-<a name="(line29)"></a>dfilter <font color=Red>::</font> DFilter i <font color=Red>-></font> CFilter i-<a name="(line30)"></a>dfilter f <font color=Red>=</font> <font color=Red>\</font>xml<font color=Red>-></font> f xml xml-<a name="(line31)"></a>-<a name="(line32)"></a><a name="cfilter"></a><font color=Blue>-- | drop a double filter to an ordinary content filter.</font>-<a name="(line33)"></a><font color=Blue>-- (Where interior access to the document root is not needed, the</font>-<a name="(line34)"></a><font color=Blue>-- retaining pointer to the outer element can be pruned away.</font>-<a name="(line35)"></a><font color=Blue>-- 'cfilter' is more space-efficient than 'dfilter' in this situation.)</font>-<a name="(line36)"></a>cfilter <font color=Red>::</font> DFilter i <font color=Red>-></font> CFilter i-<a name="(line37)"></a>cfilter f <font color=Red>=</font> <font color=Red>\</font>xml <font color=Red>-></font> f undefined xml-<a name="(line38)"></a><font color=Blue>--cfilter f = \xml-> flip f xml</font>-<a name="(line39)"></a><font color=Blue>-- (case xml of</font>-<a name="(line40)"></a><font color=Blue>-- CElem (Elem n as cs) i -> CElem (Elem n [] []) i</font>-<a name="(line41)"></a><font color=Blue>-- _ -> xml)</font>-<a name="(line42)"></a>-<a name="(line43)"></a><a name="liftLocal"></a><font color=Blue>-- | lift a CFilter combinator to a DFilter combinator</font>-<a name="(line44)"></a>liftLocal<font color=Cyan>,</font> liftGlobal <font color=Red>::</font> <font color=Cyan>(</font>CFilter i<font color=Red>-></font>CFilter i<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>DFilter i<font color=Red>-></font>DFilter i<font color=Cyan>)</font>-<a name="(line45)"></a>liftLocal ff <font color=Red>=</font> <font color=Red>\</font>df<font color=Red>-></font> <font color=Red>\</font>xml sub<font color=Red>-></font> <font color=Cyan>(</font>ff <font color=Cyan>(</font>df xml<font color=Cyan>)</font><font color=Cyan>)</font> sub-<a name="(line46)"></a><a name="liftGlobal"></a>liftGlobal ff <font color=Red>=</font> <font color=Red>\</font>df<font color=Red>-></font> <font color=Red>\</font>xml sub<font color=Red>-></font> <font color=Cyan>(</font>ff <font color=Cyan>(</font>df xml<font color=Cyan>)</font><font color=Cyan>)</font> xml-<a name="(line47)"></a>-<a name="(line48)"></a><a name="o"></a><font color=Blue>-- | lifted composition over double filters.</font>-<a name="(line49)"></a>o <font color=Red>::</font> DFilter i <font color=Red>-></font> DFilter i <font color=Red>-></font> DFilter i-<a name="(line50)"></a><a name="o"></a>g <font color=Cyan>`o`</font> f <font color=Red>=</font> <font color=Red>\</font>xml<font color=Red>-></font> concatMap <font color=Cyan>(</font>g xml<font color=Cyan>)</font> <font color=Cyan>.</font> <font color=Cyan>(</font>f xml<font color=Cyan>)</font>-<a name="(line51)"></a>-<a name="(line52)"></a><a name="|>|"></a><font color=Blue>-- | lifted choice.</font>-<a name="(line53)"></a><font color=Cyan>(</font><font color=Cyan>|>|</font><font color=Cyan>)</font> <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font>b<font color=Red>-></font><font color=Red>[</font>c<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font>b<font color=Red>-></font><font color=Red>[</font>c<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font>b<font color=Red>-></font><font color=Red>[</font>c<font color=Red>]</font><font color=Cyan>)</font>-<a name="(line54)"></a><a name="f"></a>f <font color=Cyan>|>|</font> g <font color=Red>=</font> <font color=Red>\</font>xml sub<font color=Red>-></font> <font color=Green><u>let</u></font> first <font color=Red>=</font> f xml sub <font color=Green><u>in</u></font>-<a name="(line55)"></a> <font color=Green><u>if</u></font> null first <font color=Green><u>then</u></font> g xml sub <font color=Green><u>else</u></font> first-<a name="(line56)"></a>-<a name="(line57)"></a><a name="union"></a><font color=Blue>-- | lifted union.</font>-<a name="(line58)"></a>union <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font>b<font color=Red>-></font><font color=Red>[</font>c<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font>b<font color=Red>-></font><font color=Red>[</font>c<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font>b<font color=Red>-></font><font color=Red>[</font>c<font color=Red>]</font><font color=Cyan>)</font>-<a name="(line59)"></a>union <font color=Red>=</font> lift <font color=Cyan>(</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="(line60)"></a> <font color=Green><u>where</u></font>-<a name="(line61)"></a> lift f g h <font color=Red>=</font> <font color=Red>\</font>x y<font color=Red>-></font> f <font color=Cyan>(</font>g x y<font color=Cyan>)</font> <font color=Cyan>(</font>h x y<font color=Cyan>)</font>-<a name="(line62)"></a>-<a name="(line63)"></a><a name="with"></a><font color=Blue>-- | lifted predicates.</font>-<a name="(line64)"></a>with<font color=Cyan>,</font> without <font color=Red>::</font> DFilter i <font color=Red>-></font> DFilter i <font color=Red>-></font> DFilter i-<a name="(line65)"></a><a name="with"></a>f <font color=Cyan>`with`</font> g <font color=Red>=</font> <font color=Red>\</font>xml<font color=Red>-></font> filter <font color=Cyan>(</font>not<font color=Cyan>.</font>null<font color=Cyan>.</font>g xml<font color=Cyan>)</font> <font color=Cyan>.</font> f xml-<a name="(line66)"></a><a name="without"></a>f <font color=Cyan>`without`</font> g <font color=Red>=</font> <font color=Red>\</font>xml<font color=Red>-></font> filter <font color=Cyan>(</font>null<font color=Cyan>.</font>g xml<font color=Cyan>)</font> <font color=Cyan>.</font> f xml-<a name="(line67)"></a>-<a name="(line68)"></a><a name="keep"></a><font color=Blue>-- | lifted unit and zero.</font>-<a name="(line69)"></a>keep<font color=Cyan>,</font> none <font color=Red>::</font> DFilter i-<a name="(line70)"></a>keep <font color=Red>=</font> <font color=Red>\</font>xml sub<font color=Red>-></font> <font color=Red>[</font>sub<font color=Red>]</font> <font color=Blue>-- local C.keep</font>-<a name="(line71)"></a><a name="none"></a>none <font color=Red>=</font> <font color=Red>\</font>xml sub<font color=Red>-></font> [] <font color=Blue>-- local C.none</font>-<a name="(line72)"></a>-<a name="(line73)"></a><a name="children"></a>children<font color=Cyan>,</font> elm<font color=Cyan>,</font> txt <font color=Red>::</font> DFilter i-<a name="(line74)"></a>children <font color=Red>=</font> local C<font color=Cyan>.</font>children-<a name="(line75)"></a><a name="elm"></a>elm <font color=Red>=</font> local C<font color=Cyan>.</font>elm-<a name="(line76)"></a><a name="txt"></a>txt <font color=Red>=</font> local C<font color=Cyan>.</font>txt-<a name="(line77)"></a>-<a name="(line78)"></a><a name="applypred"></a>applypred <font color=Red>::</font> CFilter i <font color=Red>-></font> DFilter i <font color=Red>-></font> CFilter i-<a name="(line79)"></a>applypred f p <font color=Red>=</font> <font color=Red>\</font>xml<font color=Red>-></font> <font color=Cyan>(</font>const f <font color=Cyan>`with`</font> p<font color=Cyan>)</font> xml xml-<a name="(line80)"></a>-<a name="(line81)"></a><a name="iffind"></a>iffind <font color=Red>::</font> String <font color=Red>-></font> <font color=Cyan>(</font>String <font color=Red>-></font> DFilter i<font color=Cyan>)</font> <font color=Red>-></font> DFilter i <font color=Red>-></font> DFilter i-<a name="(line82)"></a>iffind key yes no xml c<font color=Red>@</font><font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>as</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>-<a name="(line83)"></a> <font color=Green><u>case</u></font> <font color=Cyan>(</font>lookup key <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Green><u>of</u></font>-<a name="(line84)"></a> Nothing <font color=Red>-></font> no xml c-<a name="(line85)"></a> <font color=Cyan>(</font>Just v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> yes <font color=Cyan>(</font>show v<font color=Cyan>)</font> xml c-<a name="(line86)"></a>iffind key yes no xml other <font color=Red>=</font> no xml other-<a name="(line87)"></a>-<a name="(line88)"></a><a name="ifTxt"></a>ifTxt <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>DFilter i<font color=Cyan>)</font> <font color=Red>-></font> DFilter i <font color=Red>-></font> DFilter i-<a name="(line89)"></a>ifTxt yes no xml c<font color=Red>@</font><font color=Cyan>(</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> yes s xml c-<a name="(line90)"></a>ifTxt yes no xml c <font color=Red>=</font> no xml c-<a name="(line91)"></a>-<a name="(line92)"></a><a name="cat"></a>cat <font color=Red>::</font> <font color=Red>[</font>a<font color=Red>-></font>b<font color=Red>-></font><font color=Red>[</font>c<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font>b<font color=Red>-></font><font color=Red>[</font>c<font color=Red>]</font><font color=Cyan>)</font>-<a name="(line93)"></a>cat fs <font color=Red>=</font> <font color=Red>\</font>xml sub<font color=Red>-></font> concat <font color=Red>[</font> f xml sub <font color=Red>|</font> f <font color=Red><-</font> fs <font color=Red>]</font>-<a name="(line94)"></a>-<a name="(line95)"></a><a name="/>"></a><font color=Cyan>(</font><font color=Cyan>/></font><font color=Cyan>)</font> <font color=Red>::</font> DFilter i <font color=Red>-></font> DFilter i <font color=Red>-></font> DFilter i-<a name="(line96)"></a>f <font color=Cyan>/></font> g <font color=Red>=</font> g <font color=Cyan>`o`</font> children <font color=Cyan>`o`</font> f-<a name="(line97)"></a>-<a name="(line98)"></a><a name="</"></a><font color=Cyan>(</font><font color=Cyan></</font><font color=Cyan>)</font> <font color=Red>::</font> DFilter i <font color=Red>-></font> DFilter i <font color=Red>-></font> DFilter i-<a name="(line99)"></a>f <font color=Cyan></</font> g <font color=Red>=</font> f <font color=Cyan>`with`</font> <font color=Cyan>(</font>g <font color=Cyan>`o`</font> children<font color=Cyan>)</font>-<a name="(line100)"></a>-<a name="(line101)"></a><a name="deep"></a>deep<font color=Cyan>,</font> deepest<font color=Cyan>,</font> multi <font color=Red>::</font> DFilter i <font color=Red>-></font> DFilter i-<a name="(line102)"></a>deep f <font color=Red>=</font> f <font color=Cyan>|>|</font> <font color=Cyan>(</font>deep f <font color=Cyan>`o`</font> children<font color=Cyan>)</font>-<a name="(line103)"></a><a name="deepest"></a>deepest f <font color=Red>=</font> <font color=Cyan>(</font>deepest f <font color=Cyan>`o`</font> children<font color=Cyan>)</font> <font color=Cyan>|>|</font> f-<a name="(line104)"></a><a name="multi"></a>multi f <font color=Red>=</font> f <font color=Cyan>`union`</font> <font color=Cyan>(</font>multi f <font color=Cyan>`o`</font> children<font color=Cyan>)</font>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/Xtract/Combinators.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>-- | This is a new set of XML combinators for Xtract, not standard,</font>+<a name="line-2"></a><font color=Blue>-- but based on the standard set in "Text.Xml.Haxml.Combinators".</font>+<a name="line-3"></a><font color=Blue>-- The main difference is that the Content Filter type becomes a</font>+<a name="line-4"></a><font color=Blue>-- Double Filter. A Double Filter always takes the whole document</font>+<a name="line-5"></a><font color=Blue>-- as an extra argument, so you can start to traverse it again from</font>+<a name="line-6"></a><font color=Blue>-- the root, when at any inner location within the document tree.</font>+<a name="line-7"></a><font color=Blue>--</font>+<a name="line-8"></a><font color=Blue>-- The new combinator definitions are derived from the old ones.</font>+<a name="line-9"></a><font color=Blue>-- The same names have the equivalent meaning - use module qualification</font>+<a name="line-10"></a><font color=Blue>-- on imports to distinguish between CFilter and DFilter variations.</font>+<a name="line-11"></a>+<a name="line-12"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Xtract<font color=Cyan>.</font>Combinators <font color=Green><u>where</u></font>+<a name="line-13"></a>+<a name="line-14"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types+<a name="line-15"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Combinators <font color=Cyan>(</font>CFilter<font color=Cyan>)</font>+<a name="line-16"></a><font color=Green><u>import</u></font> <font color=Green><u>qualified</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Combinators <font color=Green><u>as</u></font> C+<a name="line-17"></a>+<a name="line-18"></a>+<a name="line-19"></a><a name="DFilter"></a><font color=Blue>-- | double content filter - takes document root + local subtree.</font>+<a name="line-20"></a><a name="DFilter"></a><font color=Green><u>type</u></font> DFilter i <font color=Red>=</font> Content i <font color=Red>-></font> Content i <font color=Red>-></font> <font color=Red>[</font>Content i<font color=Red>]</font>+<a name="line-21"></a>+<a name="line-22"></a><a name="local"></a><font color=Blue>-- | lift an ordinary content filter to a double filter.</font>+<a name="line-23"></a><font color=Blue>local</font><font color=Cyan>,</font>global <font color=Red>::</font> CFilter i <font color=Red>-></font> DFilter i+<a name="line-24"></a><font color=Blue>local</font> f <font color=Red>=</font> <font color=Red>\</font>xml sub<font color=Red>-></font> f sub+<a name="line-25"></a><a name="global"></a><font color=Blue>global</font> f <font color=Red>=</font> <font color=Red>\</font>xml sub<font color=Red>-></font> f xml+<a name="line-26"></a>+<a name="line-27"></a><a name="dfilter"></a><font color=Blue>-- | drop a double filter to an ordinary content filter.</font>+<a name="line-28"></a><font color=Blue>-- (permitting interior access to document root)</font>+<a name="line-29"></a><font color=Blue>dfilter</font> <font color=Red>::</font> DFilter i <font color=Red>-></font> CFilter i+<a name="line-30"></a><font color=Blue>dfilter</font> f <font color=Red>=</font> <font color=Red>\</font>xml<font color=Red>-></font> f xml xml+<a name="line-31"></a>+<a name="line-32"></a><a name="cfilter"></a><font color=Blue>-- | drop a double filter to an ordinary content filter.</font>+<a name="line-33"></a><font color=Blue>-- (Where interior access to the document root is not needed, the</font>+<a name="line-34"></a><font color=Blue>-- retaining pointer to the outer element can be pruned away.</font>+<a name="line-35"></a><font color=Blue>-- 'cfilter' is more space-efficient than 'dfilter' in this situation.)</font>+<a name="line-36"></a><font color=Blue>cfilter</font> <font color=Red>::</font> DFilter i <font color=Red>-></font> CFilter i+<a name="line-37"></a><font color=Blue>cfilter</font> f <font color=Red>=</font> <font color=Red>\</font>xml <font color=Red>-></font> f undefined xml+<a name="line-38"></a><font color=Blue>--cfilter f = \xml-> flip f xml</font>+<a name="line-39"></a><font color=Blue>-- (case xml of</font>+<a name="line-40"></a><font color=Blue>-- CElem (Elem n as cs) i -> CElem (Elem n [] []) i</font>+<a name="line-41"></a><font color=Blue>-- _ -> xml)</font>+<a name="line-42"></a>+<a name="line-43"></a><a name="liftLocal"></a><font color=Blue>-- | lift a CFilter combinator to a DFilter combinator</font>+<a name="line-44"></a><font color=Blue>liftLocal</font><font color=Cyan>,</font> liftGlobal <font color=Red>::</font> <font color=Cyan>(</font>CFilter i<font color=Red>-></font>CFilter i<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>DFilter i<font color=Red>-></font>DFilter i<font color=Cyan>)</font>+<a name="line-45"></a><font color=Blue>liftLocal</font> ff <font color=Red>=</font> <font color=Red>\</font>df<font color=Red>-></font> <font color=Red>\</font>xml sub<font color=Red>-></font> <font color=Cyan>(</font>ff <font color=Cyan>(</font>df xml<font color=Cyan>)</font><font color=Cyan>)</font> sub+<a name="line-46"></a><a name="liftGlobal"></a><font color=Blue>liftGlobal</font> ff <font color=Red>=</font> <font color=Red>\</font>df<font color=Red>-></font> <font color=Red>\</font>xml sub<font color=Red>-></font> <font color=Cyan>(</font>ff <font color=Cyan>(</font>df xml<font color=Cyan>)</font><font color=Cyan>)</font> xml+<a name="line-47"></a>+<a name="line-48"></a><a name="o"></a><font color=Blue>-- | lifted composition over double filters.</font>+<a name="line-49"></a><font color=Blue>o</font> <font color=Red>::</font> DFilter i <font color=Red>-></font> DFilter i <font color=Red>-></font> DFilter i+<a name="line-50"></a><a name="o"></a><font color=Blue>g</font> <font color=Cyan>`o`</font> f <font color=Red>=</font> <font color=Red>\</font>xml<font color=Red>-></font> concatMap <font color=Cyan>(</font>g xml<font color=Cyan>)</font> <font color=Cyan>.</font> <font color=Cyan>(</font>f xml<font color=Cyan>)</font>+<a name="line-51"></a>+<a name="line-52"></a><a name="|>|"></a><font color=Blue>-- | lifted choice.</font>+<a name="line-53"></a><font color=Cyan>(</font><font color=Cyan>|>|</font><font color=Cyan>)</font> <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font>b<font color=Red>-></font><font color=Red>[</font>c<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font>b<font color=Red>-></font><font color=Red>[</font>c<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font>b<font color=Red>-></font><font color=Red>[</font>c<font color=Red>]</font><font color=Cyan>)</font>+<a name="line-54"></a><a name="f"></a><font color=Blue>f</font> <font color=Cyan>|>|</font> g <font color=Red>=</font> <font color=Red>\</font>xml sub<font color=Red>-></font> <font color=Green><u>let</u></font> first <font color=Red>=</font> f xml sub <font color=Green><u>in</u></font>+<a name="line-55"></a> <font color=Green><u>if</u></font> null first <font color=Green><u>then</u></font> g xml sub <font color=Green><u>else</u></font> first+<a name="line-56"></a>+<a name="line-57"></a><a name="union"></a><font color=Blue>-- | lifted union.</font>+<a name="line-58"></a><font color=Blue>union</font> <font color=Red>::</font> <font color=Cyan>(</font>a<font color=Red>-></font>b<font color=Red>-></font><font color=Red>[</font>c<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font>b<font color=Red>-></font><font color=Red>[</font>c<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font>b<font color=Red>-></font><font color=Red>[</font>c<font color=Red>]</font><font color=Cyan>)</font>+<a name="line-59"></a><font color=Blue>union</font> <font color=Red>=</font> lift <font color=Cyan>(</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-60"></a> <font color=Green><u>where</u></font>+<a name="line-61"></a> lift f g h <font color=Red>=</font> <font color=Red>\</font>x y<font color=Red>-></font> f <font color=Cyan>(</font>g x y<font color=Cyan>)</font> <font color=Cyan>(</font>h x y<font color=Cyan>)</font>+<a name="line-62"></a>+<a name="line-63"></a><a name="with"></a><font color=Blue>-- | lifted predicates.</font>+<a name="line-64"></a><font color=Blue>with</font><font color=Cyan>,</font> without <font color=Red>::</font> DFilter i <font color=Red>-></font> DFilter i <font color=Red>-></font> DFilter i+<a name="line-65"></a><a name="with"></a><font color=Blue>f</font> <font color=Cyan>`with`</font> g <font color=Red>=</font> <font color=Red>\</font>xml<font color=Red>-></font> filter <font color=Cyan>(</font>not<font color=Cyan>.</font>null<font color=Cyan>.</font>g xml<font color=Cyan>)</font> <font color=Cyan>.</font> f xml+<a name="line-66"></a><a name="without"></a><font color=Blue>f</font> <font color=Cyan>`without`</font> g <font color=Red>=</font> <font color=Red>\</font>xml<font color=Red>-></font> filter <font color=Cyan>(</font>null<font color=Cyan>.</font>g xml<font color=Cyan>)</font> <font color=Cyan>.</font> f xml+<a name="line-67"></a>+<a name="line-68"></a><a name="keep"></a><font color=Blue>-- | lifted unit and zero.</font>+<a name="line-69"></a><font color=Blue>keep</font><font color=Cyan>,</font> none <font color=Red>::</font> DFilter i+<a name="line-70"></a><font color=Blue>keep</font> <font color=Red>=</font> <font color=Red>\</font>xml sub<font color=Red>-></font> <font color=Red>[</font>sub<font color=Red>]</font> <font color=Blue>-- local C.keep</font>+<a name="line-71"></a><a name="none"></a><font color=Blue>none</font> <font color=Red>=</font> <font color=Red>\</font>xml sub<font color=Red>-></font> [] <font color=Blue>-- local C.none</font>+<a name="line-72"></a>+<a name="line-73"></a><a name="children"></a><font color=Blue>children</font><font color=Cyan>,</font> elm<font color=Cyan>,</font> txt <font color=Red>::</font> DFilter i+<a name="line-74"></a><font color=Blue>children</font> <font color=Red>=</font> local C<font color=Cyan>.</font>children+<a name="line-75"></a><a name="elm"></a><font color=Blue>elm</font> <font color=Red>=</font> local C<font color=Cyan>.</font>elm+<a name="line-76"></a><a name="txt"></a><font color=Blue>txt</font> <font color=Red>=</font> local C<font color=Cyan>.</font>txt+<a name="line-77"></a>+<a name="line-78"></a><a name="applypred"></a><font color=Blue>applypred</font> <font color=Red>::</font> CFilter i <font color=Red>-></font> DFilter i <font color=Red>-></font> CFilter i+<a name="line-79"></a><font color=Blue>applypred</font> f p <font color=Red>=</font> <font color=Red>\</font>xml<font color=Red>-></font> <font color=Cyan>(</font>const f <font color=Cyan>`with`</font> p<font color=Cyan>)</font> xml xml+<a name="line-80"></a>+<a name="line-81"></a><a name="iffind"></a><font color=Blue>iffind</font> <font color=Red>::</font> String <font color=Red>-></font> <font color=Cyan>(</font>String <font color=Red>-></font> DFilter i<font color=Cyan>)</font> <font color=Red>-></font> DFilter i <font color=Red>-></font> DFilter i+<a name="line-82"></a><font color=Blue>iffind</font> key yes no xml c<font color=Red>@</font><font color=Cyan>(</font>CElem <font color=Cyan>(</font>Elem <font color=Green><u>_</u></font> <font color=Green><u>as</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font>+<a name="line-83"></a> <font color=Green><u>case</u></font> <font color=Cyan>(</font>lookup key <font color=Green><u>as</u></font><font color=Cyan>)</font> <font color=Green><u>of</u></font>+<a name="line-84"></a> Nothing <font color=Red>-></font> no xml c+<a name="line-85"></a> <font color=Cyan>(</font>Just v<font color=Red>@</font><font color=Cyan>(</font>AttValue <font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>-></font> yes <font color=Cyan>(</font>show v<font color=Cyan>)</font> xml c+<a name="line-86"></a><font color=Blue>iffind</font> key yes no xml other <font color=Red>=</font> no xml other+<a name="line-87"></a>+<a name="line-88"></a><a name="ifTxt"></a><font color=Blue>ifTxt</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>DFilter i<font color=Cyan>)</font> <font color=Red>-></font> DFilter i <font color=Red>-></font> DFilter i+<a name="line-89"></a><font color=Blue>ifTxt</font> yes no xml c<font color=Red>@</font><font color=Cyan>(</font>CString <font color=Green><u>_</u></font> s <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> yes s xml c+<a name="line-90"></a><font color=Blue>ifTxt</font> yes no xml c <font color=Red>=</font> no xml c+<a name="line-91"></a>+<a name="line-92"></a><a name="cat"></a><font color=Blue>cat</font> <font color=Red>::</font> <font color=Red>[</font>a<font color=Red>-></font>b<font color=Red>-></font><font color=Red>[</font>c<font color=Red>]</font><font color=Red>]</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Red>-></font>b<font color=Red>-></font><font color=Red>[</font>c<font color=Red>]</font><font color=Cyan>)</font>+<a name="line-93"></a><font color=Blue>cat</font> fs <font color=Red>=</font> <font color=Red>\</font>xml sub<font color=Red>-></font> concat <font color=Red>[</font> f xml sub <font color=Red>|</font> f <font color=Red><-</font> fs <font color=Red>]</font>+<a name="line-94"></a>+<a name="line-95"></a><a name="/>"></a><font color=Cyan>(</font><font color=Cyan>/></font><font color=Cyan>)</font> <font color=Red>::</font> DFilter i <font color=Red>-></font> DFilter i <font color=Red>-></font> DFilter i+<a name="line-96"></a><font color=Blue>f</font> <font color=Cyan>/></font> g <font color=Red>=</font> g <font color=Cyan>`o`</font> children <font color=Cyan>`o`</font> f+<a name="line-97"></a>+<a name="line-98"></a><a name="</"></a><font color=Cyan>(</font><font color=Cyan></</font><font color=Cyan>)</font> <font color=Red>::</font> DFilter i <font color=Red>-></font> DFilter i <font color=Red>-></font> DFilter i+<a name="line-99"></a><font color=Blue>f</font> <font color=Cyan></</font> g <font color=Red>=</font> f <font color=Cyan>`with`</font> <font color=Cyan>(</font>g <font color=Cyan>`o`</font> children<font color=Cyan>)</font>+<a name="line-100"></a>+<a name="line-101"></a><a name="deep"></a><font color=Blue>deep</font><font color=Cyan>,</font> deepest<font color=Cyan>,</font> multi <font color=Red>::</font> DFilter i <font color=Red>-></font> DFilter i+<a name="line-102"></a><font color=Blue>deep</font> f <font color=Red>=</font> f <font color=Cyan>|>|</font> <font color=Cyan>(</font>deep f <font color=Cyan>`o`</font> children<font color=Cyan>)</font>+<a name="line-103"></a><a name="deepest"></a><font color=Blue>deepest</font> f <font color=Red>=</font> <font color=Cyan>(</font>deepest f <font color=Cyan>`o`</font> children<font color=Cyan>)</font> <font color=Cyan>|>|</font> f+<a name="line-104"></a><a name="multi"></a><font color=Blue>multi</font> f <font color=Red>=</font> f <font color=Cyan>`union`</font> <font color=Cyan>(</font>multi f <font color=Cyan>`o`</font> children<font color=Cyan>)</font> </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/Xtract/Lex.html view
@@ -1,132 +1,138 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>-- | This is another hand-written lexer, this time for the Xtract</font>-<a name="(line2)"></a><font color=Blue>-- command-language. The entry point is lexXtract. You don't</font>-<a name="(line3)"></a><font color=Blue>-- normally need to use this module directly - the lexer is called</font>-<a name="(line4)"></a><font color=Blue>-- automatically by the parser. (We only expose this interface</font>-<a name="(line5)"></a><font color=Blue>-- for debugging purposes.)</font>-<a name="(line6)"></a><font color=Blue>--</font>-<a name="(line7)"></a><font color=Blue>-- The Xtract command language is very like the XPath specification.</font>-<a name="(line8)"></a>-<a name="(line9)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Xtract<font color=Cyan>.</font>Lex-<a name="(line10)"></a> <font color=Cyan>(</font> lexXtract-<a name="(line11)"></a> <font color=Cyan>,</font> Posn<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line12)"></a> <font color=Cyan>,</font> TokenT<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-<a name="(line13)"></a> <font color=Cyan>,</font> Token-<a name="(line14)"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line15)"></a>-<a name="(line16)"></a><font color=Green><u>import</u></font> Char-<a name="(line17)"></a><font color=Green><u>import</u></font> List<font color=Cyan>(</font>isPrefixOf<font color=Cyan>)</font>-<a name="(line18)"></a>-<a name="(line19)"></a>-<a name="(line20)"></a><a name="Token"></a><font color=Green><u>type</u></font> Token <font color=Red>=</font> Either String <font color=Cyan>(</font>Posn<font color=Cyan>,</font> TokenT<font color=Cyan>)</font>-<a name="(line21)"></a>-<a name="(line22)"></a><a name="Posn"></a><font color=Green><u>data</u></font> Posn <font color=Red>=</font> Pn Int <font color=Blue>-- char index only</font>-<a name="(line23)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line24)"></a>-<a name="(line25)"></a><font color=Green><u>instance</u></font> Show Posn <font color=Green><u>where</u></font>-<a name="(line26)"></a> showsPrec p <font color=Cyan>(</font>Pn c<font color=Cyan>)</font> <font color=Red>=</font> showString <font color=Magenta>"char pos "</font> <font color=Cyan>.</font> shows c-<a name="(line27)"></a>-<a name="(line28)"></a><a name="TokenT"></a><font color=Green><u>data</u></font> TokenT <font color=Red>=</font>-<a name="(line29)"></a> Symbol String-<a name="(line30)"></a> <font color=Red>|</font> TokString String <font color=Blue>-- begins with letter</font>-<a name="(line31)"></a> <font color=Red>|</font> TokNum Integer <font color=Blue>-- begins with digit</font>-<a name="(line32)"></a> <font color=Green><u>deriving</u></font> Eq-<a name="(line33)"></a>-<a name="(line34)"></a><font color=Green><u>instance</u></font> Show TokenT <font color=Green><u>where</u></font>-<a name="(line35)"></a> showsPrec p <font color=Cyan>(</font>Symbol s<font color=Cyan>)</font> <font color=Red>=</font> showString s-<a name="(line36)"></a> showsPrec p <font color=Cyan>(</font>TokString s<font color=Cyan>)</font> <font color=Red>=</font> showString s-<a name="(line37)"></a> showsPrec p <font color=Cyan>(</font>TokNum n<font color=Cyan>)</font> <font color=Red>=</font> shows n-<a name="(line38)"></a>-<a name="(line39)"></a><a name="emit"></a>emit <font color=Red>::</font> TokenT <font color=Red>-></font> Posn <font color=Red>-></font> Token-<a name="(line40)"></a>emit tok p <font color=Red>=</font> forcep p <font color=Cyan>`seq`</font> Right <font color=Cyan>(</font>p<font color=Cyan>,</font>tok<font color=Cyan>)</font>-<a name="(line41)"></a> <font color=Green><u>where</u></font> forcep <font color=Cyan>(</font>Pn n<font color=Cyan>)</font> <font color=Red>=</font> n-<a name="(line42)"></a>-<a name="(line43)"></a><a name="lexerror"></a>lexerror <font color=Red>::</font> String <font color=Red>-></font> Posn <font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>-<a name="(line44)"></a>lexerror s p <font color=Red>=</font> <font color=Red>[</font>Left <font color=Cyan>(</font><font color=Magenta>"Lexical error in selection pattern at "</font><font color=Cyan>++</font>show p<font color=Cyan>++</font><font color=Magenta>": "</font>-<a name="(line45)"></a> <font color=Cyan>++</font>s<font color=Cyan>++</font><font color=Magenta>"\n"</font><font color=Cyan>)</font><font color=Red>]</font>-<a name="(line46)"></a>-<a name="(line47)"></a><a name="addcol"></a>addcol <font color=Red>::</font> Int <font color=Red>-></font> Posn <font color=Red>-></font> Posn-<a name="(line48)"></a>addcol n <font color=Cyan>(</font>Pn c<font color=Cyan>)</font> <font color=Red>=</font> Pn <font color=Cyan>(</font>c<font color=Cyan>+</font>n<font color=Cyan>)</font>-<a name="(line49)"></a>-<a name="(line50)"></a><a name="newline"></a>newline<font color=Cyan>,</font> tab <font color=Red>::</font> Posn <font color=Red>-></font> Posn-<a name="(line51)"></a>newline <font color=Cyan>(</font>Pn c<font color=Cyan>)</font> <font color=Red>=</font> Pn <font color=Cyan>(</font>c<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font>-<a name="(line52)"></a><a name="tab"></a>tab <font color=Cyan>(</font>Pn c<font color=Cyan>)</font> <font color=Red>=</font> Pn <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>(</font>c<font color=Cyan>`div`</font><font color=Magenta>8</font><font color=Cyan>)</font><font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font><font color=Cyan>*</font><font color=Magenta>8</font><font color=Cyan>)</font>-<a name="(line53)"></a>-<a name="(line54)"></a><a name="white"></a>white <font color=Red>::</font> Char <font color=Red>-></font> Posn <font color=Red>-></font> Posn-<a name="(line55)"></a>white <font color=Magenta>'\t'</font> <font color=Red>=</font> tab-<a name="(line56)"></a>white <font color=Magenta>' '</font> <font color=Red>=</font> addcol <font color=Magenta>1</font>-<a name="(line57)"></a>white <font color=Magenta>'\n'</font> <font color=Red>=</font> addcol <font color=Magenta>1</font>-<a name="(line58)"></a>white <font color=Magenta>'\r'</font> <font color=Red>=</font> addcol <font color=Magenta>1</font>-<a name="(line59)"></a>white <font color=Magenta>'\xa0'</font> <font color=Red>=</font> addcol <font color=Magenta>1</font>-<a name="(line60)"></a>-<a name="(line61)"></a><a name="blank"></a>blank <font color=Red>::</font> <font color=Cyan>(</font>Posn<font color=Red>-></font>String<font color=Red>-></font><font color=Red>[</font>Token<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> Posn<font color=Red>-></font> String<font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>-<a name="(line62)"></a>blank k p [] <font color=Red>=</font> []-<a name="(line63)"></a>blank k p <font color=Cyan>(</font><font color=Magenta>' '</font><font color=Red><b>:</b></font> s<font color=Cyan>)</font> <font color=Red>=</font> blank k <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> s-<a name="(line64)"></a>blank k p <font color=Cyan>(</font><font color=Magenta>'\t'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font> <font color=Red>=</font> blank k <font color=Cyan>(</font>tab p<font color=Cyan>)</font> s-<a name="(line65)"></a>blank k p <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font> <font color=Red>=</font> blank k <font color=Cyan>(</font>newline p<font color=Cyan>)</font> s-<a name="(line66)"></a>blank k p <font color=Cyan>(</font><font color=Magenta>'\r'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font> <font color=Red>=</font> blank k p s-<a name="(line67)"></a>blank k p <font color=Cyan>(</font><font color=Magenta>'\xa0'</font><font color=Red><b>:</b></font> s<font color=Cyan>)</font> <font color=Red>=</font> blank k <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> s-<a name="(line68)"></a>blank k p s <font color=Red>=</font> k p s-<a name="(line69)"></a>-<a name="(line70)"></a><a name="lexXtract"></a><font color=Blue>----</font>-<a name="(line71)"></a><font color=Blue>-- | First argument is a transformer for pattern strings, e.g. map toLower,</font>-<a name="(line72)"></a><font color=Blue>-- but only applying to parts of the pattern not in quotation marks.</font>-<a name="(line73)"></a><font color=Blue>-- (Needed to canonicalise HTML where tags are case-insensitive, but</font>-<a name="(line74)"></a><font color=Blue>-- attribute values are case sensitive.)</font>-<a name="(line75)"></a>lexXtract <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>-<a name="(line76)"></a>lexXtract f <font color=Red>=</font> selAny f <font color=Cyan>(</font>Pn <font color=Magenta>1</font><font color=Cyan>)</font>-<a name="(line77)"></a>-<a name="(line78)"></a><a name="syms"></a>syms <font color=Red>=</font> <font color=Magenta>"/[]()@,=*&|~$+-<>"</font>-<a name="(line79)"></a>-<a name="(line80)"></a><a name="selAny"></a>selAny <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Cyan>)</font> <font color=Red>-></font> Posn <font color=Red>-></font> String <font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>-<a name="(line81)"></a>selAny f p [] <font color=Red>=</font> []-<a name="(line82)"></a>selAny f p <font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>"//"</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>2</font> p<font color=Cyan>)</font> ss-<a name="(line83)"></a>selAny f p <font color=Cyan>(</font><font color=Magenta>'!'</font><font color=Red><b>:</b></font><font color=Magenta>'='</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>"!="</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>2</font> p<font color=Cyan>)</font> ss-<a name="(line84)"></a>selAny f p <font color=Cyan>(</font><font color=Magenta>'<'</font><font color=Red><b>:</b></font><font color=Magenta>'='</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>"<="</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>2</font> p<font color=Cyan>)</font> ss-<a name="(line85)"></a>selAny f p <font color=Cyan>(</font><font color=Magenta>'>'</font><font color=Red><b>:</b></font><font color=Magenta>'='</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>">="</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>2</font> p<font color=Cyan>)</font> ss-<a name="(line86)"></a>selAny f p <font color=Cyan>(</font><font color=Magenta>'\''</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>"'"</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font>-<a name="(line87)"></a> accumulateUntil <font color=Magenta>'\''</font> <font color=Cyan>(</font>Symbol <font color=Magenta>"'"</font><font color=Cyan>)</font> [] p <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line88)"></a> <font color=Cyan>(</font>selAny f<font color=Cyan>)</font>-<a name="(line89)"></a>selAny f p <font color=Cyan>(</font><font color=Magenta>'"'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>"\""</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font>-<a name="(line90)"></a> accumulateUntil <font color=Magenta>'"'</font> <font color=Cyan>(</font>Symbol <font color=Magenta>"\""</font><font color=Cyan>)</font> [] p <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line91)"></a> <font color=Cyan>(</font>selAny f<font color=Cyan>)</font>-<a name="(line92)"></a>selAny f p <font color=Cyan>(</font><font color=Magenta>'_'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> gatherName f <font color=Magenta>"_"</font> p <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss <font color=Cyan>(</font>blank <font color=Cyan>(</font>selAny f<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line93)"></a>selAny f p <font color=Cyan>(</font><font color=Magenta>':'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> gatherName f <font color=Magenta>":"</font> p <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss <font color=Cyan>(</font>blank <font color=Cyan>(</font>selAny f<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line94)"></a>selAny f p <font color=Cyan>(</font><font color=Magenta>'.'</font><font color=Red><b>:</b></font><font color=Magenta>'='</font><font color=Red><b>:</b></font><font color=Magenta>'.'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>".=."</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>3</font> p<font color=Cyan>)</font> ss-<a name="(line95)"></a>selAny f p <font color=Cyan>(</font><font color=Magenta>'.'</font><font color=Red><b>:</b></font><font color=Magenta>'!'</font><font color=Red><b>:</b></font><font color=Magenta>'='</font><font color=Red><b>:</b></font><font color=Magenta>'.'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font>-<a name="(line96)"></a> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>".!=."</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>4</font> p<font color=Cyan>)</font> ss-<a name="(line97)"></a>selAny f p <font color=Cyan>(</font><font color=Magenta>'.'</font><font color=Red><b>:</b></font><font color=Magenta>'<'</font><font color=Red><b>:</b></font><font color=Magenta>'.'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>".<."</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>3</font> p<font color=Cyan>)</font> ss-<a name="(line98)"></a>selAny f p <font color=Cyan>(</font><font color=Magenta>'.'</font><font color=Red><b>:</b></font><font color=Magenta>'<'</font><font color=Red><b>:</b></font><font color=Magenta>'='</font><font color=Red><b>:</b></font><font color=Magenta>'.'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font>-<a name="(line99)"></a> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>".<=."</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>4</font> p<font color=Cyan>)</font> ss-<a name="(line100)"></a>selAny f p <font color=Cyan>(</font><font color=Magenta>'.'</font><font color=Red><b>:</b></font><font color=Magenta>'>'</font><font color=Red><b>:</b></font><font color=Magenta>'.'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>".>."</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>3</font> p<font color=Cyan>)</font> ss-<a name="(line101)"></a>selAny f p <font color=Cyan>(</font><font color=Magenta>'.'</font><font color=Red><b>:</b></font><font color=Magenta>'>'</font><font color=Red><b>:</b></font><font color=Magenta>'='</font><font color=Red><b>:</b></font><font color=Magenta>'.'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font>-<a name="(line102)"></a> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>".>=."</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>4</font> p<font color=Cyan>)</font> ss-<a name="(line103)"></a>selAny f p <font color=Cyan>(</font><font color=Magenta>'.'</font><font color=Red><b>:</b></font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>"./"</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>2</font> p<font color=Cyan>)</font> ss-<a name="(line104)"></a>selAny f p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font>-<a name="(line105)"></a> <font color=Red>|</font> s <font color=Cyan>`elem`</font> syms <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Red>[</font>s<font color=Red>]</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line106)"></a> <font color=Red>|</font> isSpace s <font color=Red>=</font> blank <font color=Cyan>(</font>selAny f<font color=Cyan>)</font> p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font>-<a name="(line107)"></a> <font color=Red>|</font> isAlpha s <font color=Red>=</font> gatherName f <font color=Red>[</font>s<font color=Red>]</font> p <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss <font color=Cyan>(</font>blank <font color=Cyan>(</font>selAny f<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line108)"></a> <font color=Red>|</font> isDigit s <font color=Red>=</font> gatherNum <font color=Red>[</font>s<font color=Red>]</font> p <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss <font color=Cyan>(</font>blank <font color=Cyan>(</font>selAny f<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line109)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> lexerror <font color=Magenta>"unrecognised pattern"</font> p-<a name="(line110)"></a>-<a name="(line111)"></a><a name="gatherName"></a>gatherName f acc pos p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> k-<a name="(line112)"></a> <font color=Red>|</font> isAlphaNum s <font color=Cyan>||</font> s <font color=Cyan>`elem`</font> <font color=Magenta>"-_:"</font> <font color=Red>=</font> gatherName f <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> pos <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss k-<a name="(line113)"></a>gatherName f acc pos p ss k <font color=Red>=</font>-<a name="(line114)"></a> emit <font color=Cyan>(</font>TokString <font color=Cyan>(</font>f <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font> k p ss-<a name="(line115)"></a>-<a name="(line116)"></a><a name="gatherNum"></a>gatherNum acc pos p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> k-<a name="(line117)"></a> <font color=Red>|</font> isHexDigit s <font color=Red>=</font> gatherNum <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> pos <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss k-<a name="(line118)"></a>gatherNum acc pos p ss k <font color=Red>=</font>-<a name="(line119)"></a> emit <font color=Cyan>(</font>TokNum <font color=Cyan>(</font>read <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font> k p ss-<a name="(line120)"></a>-<a name="(line121)"></a><a name="accumulateUntil"></a>accumulateUntil c tok acc pos p [] k <font color=Red>=</font>-<a name="(line122)"></a> lexerror <font color=Cyan>(</font><font color=Magenta>"found end of pattern while looking for "</font><font color=Cyan>++</font>c-<a name="(line123)"></a> <font color=Red><b>:</b></font><font color=Magenta>" to match opening quote at "</font><font color=Cyan>++</font>show pos<font color=Cyan>)</font> p-<a name="(line124)"></a>accumulateUntil c tok acc pos p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> k-<a name="(line125)"></a> <font color=Red>|</font> c<font color=Cyan>==</font>s <font color=Red>=</font> emit <font color=Cyan>(</font>TokString <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font>-<a name="(line126)"></a> emit tok p<font color=Red><b>:</b></font> k <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss-<a name="(line127)"></a> <font color=Red>|</font> isSpace s <font color=Red>=</font> accumulateUntil c tok <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> pos <font color=Cyan>(</font>white s p<font color=Cyan>)</font> ss k-<a name="(line128)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> accumulateUntil c tok <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> pos <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss k+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/Xtract/Lex.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>-- | This is another hand-written lexer, this time for the Xtract</font>+<a name="line-2"></a><font color=Blue>-- command-language. The entry point is lexXtract. You don't</font>+<a name="line-3"></a><font color=Blue>-- normally need to use this module directly - the lexer is called</font>+<a name="line-4"></a><font color=Blue>-- automatically by the parser. (We only expose this interface</font>+<a name="line-5"></a><font color=Blue>-- for debugging purposes.)</font>+<a name="line-6"></a><font color=Blue>--</font>+<a name="line-7"></a><font color=Blue>-- The Xtract command language is very like the XPath specification.</font>+<a name="line-8"></a>+<a name="line-9"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Xtract<font color=Cyan>.</font>Lex+<a name="line-10"></a> <font color=Cyan>(</font> lexXtract+<a name="line-11"></a> <font color=Cyan>,</font> Posn<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-12"></a> <font color=Cyan>,</font> TokenT<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="line-13"></a> <font color=Cyan>,</font> Token+<a name="line-14"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-15"></a>+<a name="line-16"></a><font color=Green><u>import</u></font> Char+<a name="line-17"></a><font color=Green><u>import</u></font> List<font color=Cyan>(</font>isPrefixOf<font color=Cyan>)</font>+<a name="line-18"></a>+<a name="line-19"></a>+<a name="line-20"></a><a name="Token"></a><font color=Green><u>type</u></font> Token <font color=Red>=</font> Either String <font color=Cyan>(</font>Posn<font color=Cyan>,</font> TokenT<font color=Cyan>)</font>+<a name="line-21"></a>+<a name="line-22"></a><a name="Posn"></a><font color=Green><u>data</u></font> Posn <font color=Red>=</font> Pn Int <font color=Blue>-- char index only</font>+<a name="line-23"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-24"></a>+<a name="line-25"></a><font color=Green><u>instance</u></font> Show Posn <font color=Green><u>where</u></font>+<a name="line-26"></a> showsPrec p <font color=Cyan>(</font>Pn c<font color=Cyan>)</font> <font color=Red>=</font> showString <font color=Magenta>"char pos "</font> <font color=Cyan>.</font> shows c+<a name="line-27"></a>+<a name="line-28"></a><a name="TokenT"></a><font color=Green><u>data</u></font> TokenT <font color=Red>=</font>+<a name="line-29"></a> Symbol String+<a name="line-30"></a> <font color=Red>|</font> TokString String <font color=Blue>-- begins with letter</font>+<a name="line-31"></a> <font color=Red>|</font> TokNum Integer <font color=Blue>-- begins with digit</font>+<a name="line-32"></a> <font color=Green><u>deriving</u></font> Eq+<a name="line-33"></a>+<a name="line-34"></a><font color=Green><u>instance</u></font> Show TokenT <font color=Green><u>where</u></font>+<a name="line-35"></a> showsPrec p <font color=Cyan>(</font>Symbol s<font color=Cyan>)</font> <font color=Red>=</font> showString s+<a name="line-36"></a> showsPrec p <font color=Cyan>(</font>TokString s<font color=Cyan>)</font> <font color=Red>=</font> showString s+<a name="line-37"></a> showsPrec p <font color=Cyan>(</font>TokNum n<font color=Cyan>)</font> <font color=Red>=</font> shows n+<a name="line-38"></a>+<a name="line-39"></a><a name="emit"></a><font color=Blue>emit</font> <font color=Red>::</font> TokenT <font color=Red>-></font> Posn <font color=Red>-></font> Token+<a name="line-40"></a><font color=Blue>emit</font> tok p <font color=Red>=</font> forcep p <font color=Cyan>`seq`</font> Right <font color=Cyan>(</font>p<font color=Cyan>,</font>tok<font color=Cyan>)</font>+<a name="line-41"></a> <font color=Green><u>where</u></font> forcep <font color=Cyan>(</font>Pn n<font color=Cyan>)</font> <font color=Red>=</font> n+<a name="line-42"></a>+<a name="line-43"></a><a name="lexerror"></a><font color=Blue>lexerror</font> <font color=Red>::</font> String <font color=Red>-></font> Posn <font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>+<a name="line-44"></a><font color=Blue>lexerror</font> s p <font color=Red>=</font> <font color=Red>[</font>Left <font color=Cyan>(</font><font color=Magenta>"Lexical error in selection pattern at "</font><font color=Cyan>++</font>show p<font color=Cyan>++</font><font color=Magenta>": "</font>+<a name="line-45"></a> <font color=Cyan>++</font>s<font color=Cyan>++</font><font color=Magenta>"\n"</font><font color=Cyan>)</font><font color=Red>]</font>+<a name="line-46"></a>+<a name="line-47"></a><a name="addcol"></a><font color=Blue>addcol</font> <font color=Red>::</font> Int <font color=Red>-></font> Posn <font color=Red>-></font> Posn+<a name="line-48"></a><font color=Blue>addcol</font> n <font color=Cyan>(</font>Pn c<font color=Cyan>)</font> <font color=Red>=</font> Pn <font color=Cyan>(</font>c<font color=Cyan>+</font>n<font color=Cyan>)</font>+<a name="line-49"></a>+<a name="line-50"></a><a name="newline"></a><font color=Blue>newline</font><font color=Cyan>,</font> tab <font color=Red>::</font> Posn <font color=Red>-></font> Posn+<a name="line-51"></a><font color=Blue>newline</font> <font color=Cyan>(</font>Pn c<font color=Cyan>)</font> <font color=Red>=</font> Pn <font color=Cyan>(</font>c<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font>+<a name="line-52"></a><a name="tab"></a><font color=Blue>tab</font> <font color=Cyan>(</font>Pn c<font color=Cyan>)</font> <font color=Red>=</font> Pn <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>(</font>c<font color=Cyan>`div`</font><font color=Magenta>8</font><font color=Cyan>)</font><font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font><font color=Cyan>*</font><font color=Magenta>8</font><font color=Cyan>)</font>+<a name="line-53"></a>+<a name="line-54"></a><a name="white"></a><font color=Blue>white</font> <font color=Red>::</font> Char <font color=Red>-></font> Posn <font color=Red>-></font> Posn+<a name="line-55"></a><font color=Blue>white</font> <font color=Magenta>'\t'</font> <font color=Red>=</font> tab+<a name="line-56"></a><font color=Blue>white</font> <font color=Magenta>' '</font> <font color=Red>=</font> addcol <font color=Magenta>1</font>+<a name="line-57"></a><font color=Blue>white</font> <font color=Magenta>'\n'</font> <font color=Red>=</font> addcol <font color=Magenta>1</font>+<a name="line-58"></a><font color=Blue>white</font> <font color=Magenta>'\r'</font> <font color=Red>=</font> addcol <font color=Magenta>1</font>+<a name="line-59"></a><font color=Blue>white</font> <font color=Magenta>'\xa0'</font> <font color=Red>=</font> addcol <font color=Magenta>1</font>+<a name="line-60"></a>+<a name="line-61"></a><a name="blank"></a><font color=Blue>blank</font> <font color=Red>::</font> <font color=Cyan>(</font>Posn<font color=Red>-></font>String<font color=Red>-></font><font color=Red>[</font>Token<font color=Red>]</font><font color=Cyan>)</font> <font color=Red>-></font> Posn<font color=Red>-></font> String<font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>+<a name="line-62"></a><font color=Blue>blank</font> k p [] <font color=Red>=</font> []+<a name="line-63"></a><font color=Blue>blank</font> k p <font color=Cyan>(</font><font color=Magenta>' '</font><font color=Red><b>:</b></font> s<font color=Cyan>)</font> <font color=Red>=</font> blank k <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> s+<a name="line-64"></a><font color=Blue>blank</font> k p <font color=Cyan>(</font><font color=Magenta>'\t'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font> <font color=Red>=</font> blank k <font color=Cyan>(</font>tab p<font color=Cyan>)</font> s+<a name="line-65"></a><font color=Blue>blank</font> k p <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font> <font color=Red>=</font> blank k <font color=Cyan>(</font>newline p<font color=Cyan>)</font> s+<a name="line-66"></a><font color=Blue>blank</font> k p <font color=Cyan>(</font><font color=Magenta>'\r'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font> <font color=Red>=</font> blank k p s+<a name="line-67"></a><font color=Blue>blank</font> k p <font color=Cyan>(</font><font color=Magenta>'\xa0'</font><font color=Red><b>:</b></font> s<font color=Cyan>)</font> <font color=Red>=</font> blank k <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> s+<a name="line-68"></a><font color=Blue>blank</font> k p s <font color=Red>=</font> k p s+<a name="line-69"></a>+<a name="line-70"></a><a name="lexXtract"></a><font color=Blue>----</font>+<a name="line-71"></a><font color=Blue>-- | First argument is a transformer for pattern strings, e.g. map toLower,</font>+<a name="line-72"></a><font color=Blue>-- but only applying to parts of the pattern not in quotation marks.</font>+<a name="line-73"></a><font color=Blue>-- (Needed to canonicalise HTML where tags are case-insensitive, but</font>+<a name="line-74"></a><font color=Blue>-- attribute values are case sensitive.)</font>+<a name="line-75"></a><font color=Blue>lexXtract</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>+<a name="line-76"></a><font color=Blue>lexXtract</font> f <font color=Red>=</font> selAny f <font color=Cyan>(</font>Pn <font color=Magenta>1</font><font color=Cyan>)</font>+<a name="line-77"></a>+<a name="line-78"></a><a name="syms"></a><font color=Blue>syms</font> <font color=Red>=</font> <font color=Magenta>"/[]()@,=*&|~$+-<>"</font>+<a name="line-79"></a>+<a name="line-80"></a><a name="selAny"></a><font color=Blue>selAny</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Cyan>)</font> <font color=Red>-></font> Posn <font color=Red>-></font> String <font color=Red>-></font> <font color=Red>[</font>Token<font color=Red>]</font>+<a name="line-81"></a><font color=Blue>selAny</font> f p [] <font color=Red>=</font> []+<a name="line-82"></a><font color=Blue>selAny</font> f p <font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>"//"</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>2</font> p<font color=Cyan>)</font> ss+<a name="line-83"></a><font color=Blue>selAny</font> f p <font color=Cyan>(</font><font color=Magenta>'!'</font><font color=Red><b>:</b></font><font color=Magenta>'='</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>"!="</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>2</font> p<font color=Cyan>)</font> ss+<a name="line-84"></a><font color=Blue>selAny</font> f p <font color=Cyan>(</font><font color=Magenta>'<'</font><font color=Red><b>:</b></font><font color=Magenta>'='</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>"<="</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>2</font> p<font color=Cyan>)</font> ss+<a name="line-85"></a><font color=Blue>selAny</font> f p <font color=Cyan>(</font><font color=Magenta>'>'</font><font color=Red><b>:</b></font><font color=Magenta>'='</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>">="</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>2</font> p<font color=Cyan>)</font> ss+<a name="line-86"></a><font color=Blue>selAny</font> f p <font color=Cyan>(</font><font color=Magenta>'\''</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>"'"</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font>+<a name="line-87"></a> accumulateUntil <font color=Magenta>'\''</font> <font color=Cyan>(</font>Symbol <font color=Magenta>"'"</font><font color=Cyan>)</font> [] p <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-88"></a> <font color=Cyan>(</font>selAny f<font color=Cyan>)</font>+<a name="line-89"></a><font color=Blue>selAny</font> f p <font color=Cyan>(</font><font color=Magenta>'"'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>"\""</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font>+<a name="line-90"></a> accumulateUntil <font color=Magenta>'"'</font> <font color=Cyan>(</font>Symbol <font color=Magenta>"\""</font><font color=Cyan>)</font> [] p <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-91"></a> <font color=Cyan>(</font>selAny f<font color=Cyan>)</font>+<a name="line-92"></a><font color=Blue>selAny</font> f p <font color=Cyan>(</font><font color=Magenta>'_'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> gatherName f <font color=Magenta>"_"</font> p <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss <font color=Cyan>(</font>blank <font color=Cyan>(</font>selAny f<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-93"></a><font color=Blue>selAny</font> f p <font color=Cyan>(</font><font color=Magenta>':'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> gatherName f <font color=Magenta>":"</font> p <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss <font color=Cyan>(</font>blank <font color=Cyan>(</font>selAny f<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-94"></a><font color=Blue>selAny</font> f p <font color=Cyan>(</font><font color=Magenta>'.'</font><font color=Red><b>:</b></font><font color=Magenta>'='</font><font color=Red><b>:</b></font><font color=Magenta>'.'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>".=."</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>3</font> p<font color=Cyan>)</font> ss+<a name="line-95"></a><font color=Blue>selAny</font> f p <font color=Cyan>(</font><font color=Magenta>'.'</font><font color=Red><b>:</b></font><font color=Magenta>'!'</font><font color=Red><b>:</b></font><font color=Magenta>'='</font><font color=Red><b>:</b></font><font color=Magenta>'.'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font>+<a name="line-96"></a> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>".!=."</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>4</font> p<font color=Cyan>)</font> ss+<a name="line-97"></a><font color=Blue>selAny</font> f p <font color=Cyan>(</font><font color=Magenta>'.'</font><font color=Red><b>:</b></font><font color=Magenta>'<'</font><font color=Red><b>:</b></font><font color=Magenta>'.'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>".<."</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>3</font> p<font color=Cyan>)</font> ss+<a name="line-98"></a><font color=Blue>selAny</font> f p <font color=Cyan>(</font><font color=Magenta>'.'</font><font color=Red><b>:</b></font><font color=Magenta>'<'</font><font color=Red><b>:</b></font><font color=Magenta>'='</font><font color=Red><b>:</b></font><font color=Magenta>'.'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font>+<a name="line-99"></a> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>".<=."</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>4</font> p<font color=Cyan>)</font> ss+<a name="line-100"></a><font color=Blue>selAny</font> f p <font color=Cyan>(</font><font color=Magenta>'.'</font><font color=Red><b>:</b></font><font color=Magenta>'>'</font><font color=Red><b>:</b></font><font color=Magenta>'.'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>".>."</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>3</font> p<font color=Cyan>)</font> ss+<a name="line-101"></a><font color=Blue>selAny</font> f p <font color=Cyan>(</font><font color=Magenta>'.'</font><font color=Red><b>:</b></font><font color=Magenta>'>'</font><font color=Red><b>:</b></font><font color=Magenta>'='</font><font color=Red><b>:</b></font><font color=Magenta>'.'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font>+<a name="line-102"></a> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>".>=."</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>4</font> p<font color=Cyan>)</font> ss+<a name="line-103"></a><font color=Blue>selAny</font> f p <font color=Cyan>(</font><font color=Magenta>'.'</font><font color=Red><b>:</b></font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>ss<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Magenta>"./"</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>2</font> p<font color=Cyan>)</font> ss+<a name="line-104"></a><font color=Blue>selAny</font> f p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font>+<a name="line-105"></a> <font color=Red>|</font> s <font color=Cyan>`elem`</font> syms <font color=Red>=</font> emit <font color=Cyan>(</font>Symbol <font color=Red>[</font>s<font color=Red>]</font><font color=Cyan>)</font> p<font color=Red><b>:</b></font> selAny f <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-106"></a> <font color=Red>|</font> isSpace s <font color=Red>=</font> blank <font color=Cyan>(</font>selAny f<font color=Cyan>)</font> p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font>+<a name="line-107"></a> <font color=Red>|</font> isAlpha s <font color=Red>=</font> gatherName f <font color=Red>[</font>s<font color=Red>]</font> p <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss <font color=Cyan>(</font>blank <font color=Cyan>(</font>selAny f<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-108"></a> <font color=Red>|</font> isDigit s <font color=Red>=</font> gatherNum <font color=Red>[</font>s<font color=Red>]</font> p <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss <font color=Cyan>(</font>blank <font color=Cyan>(</font>selAny f<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-109"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> lexerror <font color=Magenta>"unrecognised pattern"</font> p+<a name="line-110"></a>+<a name="line-111"></a><a name="gatherName"></a><font color=Blue>gatherName</font> f acc pos p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> k+<a name="line-112"></a> <font color=Red>|</font> isAlphaNum s <font color=Cyan>||</font> s <font color=Cyan>`elem`</font> <font color=Magenta>"-_:"</font> <font color=Red>=</font> gatherName f <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> pos <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss k+<a name="line-113"></a><font color=Blue>gatherName</font> f acc pos p ss k <font color=Red>=</font>+<a name="line-114"></a> emit <font color=Cyan>(</font>TokString <font color=Cyan>(</font>f <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font> k p ss+<a name="line-115"></a>+<a name="line-116"></a><a name="gatherNum"></a><font color=Blue>gatherNum</font> acc pos p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> k+<a name="line-117"></a> <font color=Red>|</font> isHexDigit s <font color=Red>=</font> gatherNum <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> pos <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss k+<a name="line-118"></a><font color=Blue>gatherNum</font> acc pos p ss k <font color=Red>=</font>+<a name="line-119"></a> emit <font color=Cyan>(</font>TokNum <font color=Cyan>(</font>read <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font> k p ss+<a name="line-120"></a>+<a name="line-121"></a><a name="accumulateUntil"></a><font color=Blue>accumulateUntil</font> c tok acc pos p [] k <font color=Red>=</font>+<a name="line-122"></a> lexerror <font color=Cyan>(</font><font color=Magenta>"found end of pattern while looking for "</font><font color=Cyan>++</font>c+<a name="line-123"></a> <font color=Red><b>:</b></font><font color=Magenta>" to match opening quote at "</font><font color=Cyan>++</font>show pos<font color=Cyan>)</font> p+<a name="line-124"></a><font color=Blue>accumulateUntil</font> c tok acc pos p <font color=Cyan>(</font>s<font color=Red><b>:</b></font>ss<font color=Cyan>)</font> k+<a name="line-125"></a> <font color=Red>|</font> c<font color=Cyan>==</font>s <font color=Red>=</font> emit <font color=Cyan>(</font>TokString <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Cyan>)</font> pos<font color=Red><b>:</b></font>+<a name="line-126"></a> emit tok p<font color=Red><b>:</b></font> k <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss+<a name="line-127"></a> <font color=Red>|</font> isSpace s <font color=Red>=</font> accumulateUntil c tok <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> pos <font color=Cyan>(</font>white s p<font color=Cyan>)</font> ss k+<a name="line-128"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> accumulateUntil c tok <font color=Cyan>(</font>s<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> pos <font color=Cyan>(</font>addcol <font color=Magenta>1</font> p<font color=Cyan>)</font> ss k </pre>+</body> </html>
docs/HaXml/src/Text/XML/HaXml/Xtract/Parse.html view
@@ -1,421 +1,427 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>-<pre><a name="(line1)"></a><font color=Blue>-- | A parser for the Xtract command-language. (The string input is</font>-<a name="(line2)"></a><font color=Blue>-- tokenised internally by the lexer 'lexXtract'.)</font>-<a name="(line3)"></a><font color=Blue>-- See <<a href="http://www.haskell.org/HaXml/Xtract.html">http://www.haskell.org/HaXml/Xtract.html</a>> for the grammar that</font>-<a name="(line4)"></a><font color=Blue>-- is accepted.</font>-<a name="(line5)"></a>-<a name="(line6)"></a><font color=Blue>-- Because the original Xtract grammar was left-recursive, we have</font>-<a name="(line7)"></a><font color=Blue>-- transformed it into a non-left-recursive form.</font>-<a name="(line8)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Xtract<font color=Cyan>.</font>Parse <font color=Cyan>(</font>parseXtract<font color=Cyan>,</font>xtract<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="(line9)"></a>-<a name="(line10)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>Poly hiding <font color=Cyan>(</font>bracket<font color=Cyan>)</font>-<a name="(line11)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Xtract<font color=Cyan>.</font>Lex-<a name="(line12)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Xtract<font color=Cyan>.</font>Combinators <font color=Green><u>as</u></font> D-<a name="(line13)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Combinators <font color=Green><u>as</u></font> C-<a name="(line14)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types <font color=Cyan>(</font>Content<font color=Cyan>)</font>-<a name="(line15)"></a><font color=Green><u>import</u></font> List<font color=Cyan>(</font>isPrefixOf<font color=Cyan>)</font>-<a name="(line16)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Escape <font color=Cyan>(</font>xmlUnEscapeContent<font color=Cyan>,</font>stdXmlEscaper<font color=Cyan>)</font>-<a name="(line17)"></a>-<a name="(line18)"></a><a name="unescape"></a><font color=Blue>-- output transformer - to ensure that text/references are glued together</font>-<a name="(line19)"></a>unescape <font color=Red>=</font> xmlUnEscapeContent stdXmlEscaper-<a name="(line20)"></a>-<a name="(line21)"></a>-<a name="(line22)"></a><a name="xtract"></a><font color=Blue>-- | To convert an Xtract query into an ordinary HaXml combinator expression.</font>-<a name="(line23)"></a><font color=Blue>-- First arg is a tag-transformation function (e.g. map toLower) applied</font>-<a name="(line24)"></a><font color=Blue>--- before matching. Second arg is the query string.</font>-<a name="(line25)"></a>xtract <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> CFilter i-<a name="(line26)"></a>xtract f query-<a name="(line27)"></a> <font color=Red>|</font> interiorRef lexedQ <font color=Red>=</font> dfilter <font color=Cyan>(</font>parseXtract lexedQ<font color=Cyan>)</font>-<a name="(line28)"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> cfilter <font color=Cyan>(</font>parseXtract lexedQ<font color=Cyan>)</font>-<a name="(line29)"></a> <font color=Green><u>where</u></font>-<a name="(line30)"></a> lexedQ <font color=Red>=</font> lexXtract f query-<a name="(line31)"></a> <font color=Blue>-- test whether query has interior reference to doc root</font>-<a name="(line32)"></a> interiorRef <font color=Cyan>(</font>Right <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font>Symbol s<font color=Cyan>)</font><font color=Red><b>:</b></font> Right <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font>Symbol <font color=Magenta>"//"</font><font color=Cyan>)</font><font color=Red><b>:</b></font> <font color=Green><u>_</u></font><font color=Cyan>)</font>-<a name="(line33)"></a> <font color=Red>|</font> s <font color=Cyan>`elem`</font> predicateIntro <font color=Red>=</font> True-<a name="(line34)"></a> interiorRef <font color=Cyan>(</font>Right <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font>Symbol s<font color=Cyan>)</font><font color=Red><b>:</b></font> Right <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font>Symbol <font color=Magenta>"/"</font><font color=Cyan>)</font><font color=Red><b>:</b></font> <font color=Green><u>_</u></font><font color=Cyan>)</font>-<a name="(line35)"></a> <font color=Red>|</font> s <font color=Cyan>`elem`</font> predicateIntro <font color=Red>=</font> True-<a name="(line36)"></a> interiorRef <font color=Cyan>(</font><font color=Green><u>_</u></font> <font color=Red><b>:</b></font> rest<font color=Cyan>)</font> <font color=Red>=</font> interiorRef rest-<a name="(line37)"></a> interiorRef [] <font color=Red>=</font> False-<a name="(line38)"></a> predicateIntro <font color=Red>=</font> <font color=Red>[</font> <font color=Magenta>"["</font><font color=Cyan>,</font> <font color=Magenta>"("</font>-<a name="(line39)"></a> <font color=Cyan>,</font> <font color=Magenta>"&"</font><font color=Cyan>,</font> <font color=Magenta>"|"</font><font color=Cyan>,</font> <font color=Magenta>"~"</font>-<a name="(line40)"></a> <font color=Cyan>,</font> <font color=Magenta>"="</font><font color=Cyan>,</font> <font color=Magenta>"!="</font><font color=Cyan>,</font> <font color=Magenta>"<"</font><font color=Cyan>,</font> <font color=Magenta>"<="</font><font color=Cyan>,</font> <font color=Magenta>">"</font><font color=Cyan>,</font> <font color=Magenta>">="</font>-<a name="(line41)"></a> <font color=Cyan>,</font> <font color=Magenta>".=."</font><font color=Cyan>,</font><font color=Magenta>".!=."</font><font color=Cyan>,</font><font color=Magenta>".<."</font><font color=Cyan>,</font><font color=Magenta>".<=."</font><font color=Cyan>,</font><font color=Magenta>".>."</font><font color=Cyan>,</font><font color=Magenta>".>=."</font> <font color=Red>]</font>-<a name="(line42)"></a>-<a name="(line43)"></a><a name="parseXtract"></a><font color=Blue>-- | The cool thing is that the Xtract command parser directly builds</font>-<a name="(line44)"></a><font color=Blue>-- a higher-order 'DFilter' (see "Text.XML.HaXml.Xtract.Combinators")</font>-<a name="(line45)"></a><font color=Blue>-- which can be applied to an XML document without further ado.</font>-<a name="(line46)"></a><font color=Blue>-- (@parseXtract@ halts the program if a parse error is found.)</font>-<a name="(line47)"></a>parseXtract <font color=Red>::</font> <font color=Red>[</font>Token<font color=Red>]</font> <font color=Red>-></font> DFilter i-<a name="(line48)"></a>parseXtract <font color=Red>=</font> either error id <font color=Cyan>.</font> parseXtract'-<a name="(line49)"></a>-<a name="(line50)"></a><a name="parseXtract'"></a><font color=Blue>-- | @parseXtract'@ returns error messages through the Either type.</font>-<a name="(line51)"></a>parseXtract' <font color=Red>::</font> <font color=Red>[</font>Token<font color=Red>]</font> <font color=Red>-></font> Either String <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>-<a name="(line52)"></a>parseXtract' <font color=Red>=</font> fst <font color=Cyan>.</font> runParser <font color=Cyan>(</font>aquery liftLocal<font color=Cyan>)</font>-<a name="(line53)"></a>-<a name="(line54)"></a><a name="XParser"></a><font color=Blue>---- Auxiliary Parsing Functions ----</font>-<a name="(line55)"></a><a name="XParser"></a><font color=Green><u>type</u></font> XParser a <font color=Red>=</font> Parser <font color=Cyan>(</font>Either String <font color=Cyan>(</font>Posn<font color=Cyan>,</font>TokenT<font color=Cyan>)</font><font color=Cyan>)</font> a-<a name="(line56)"></a>-<a name="(line57)"></a><a name="string"></a>string <font color=Red>::</font> XParser String-<a name="(line58)"></a>string <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-></font> <font color=Green><u>case</u></font> inp <font color=Green><u>of</u></font>-<a name="(line59)"></a> <font color=Cyan>(</font>Left err<font color=Red><b>:</b></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False<font color=Cyan>,</font>err<font color=Cyan>)</font><font color=Cyan>,</font> inp<font color=Cyan>)</font>-<a name="(line60)"></a> <font color=Cyan>(</font>Right <font color=Cyan>(</font>p<font color=Cyan>,</font>TokString n<font color=Cyan>)</font><font color=Red><b>:</b></font>ts<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Right n<font color=Cyan>,</font> ts<font color=Cyan>)</font>-<a name="(line61)"></a> ts <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False<font color=Cyan>,</font><font color=Magenta>"expected a string"</font><font color=Cyan>)</font><font color=Cyan>,</font> ts<font color=Cyan>)</font> <font color=Cyan>)</font>-<a name="(line62)"></a><a name="number"></a>number <font color=Red>::</font> XParser Integer-<a name="(line63)"></a>number <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-></font> <font color=Green><u>case</u></font> inp <font color=Green><u>of</u></font>-<a name="(line64)"></a> <font color=Cyan>(</font>Left err<font color=Red><b>:</b></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False<font color=Cyan>,</font>err<font color=Cyan>)</font><font color=Cyan>,</font> inp<font color=Cyan>)</font>-<a name="(line65)"></a> <font color=Cyan>(</font>Right <font color=Cyan>(</font>p<font color=Cyan>,</font>TokNum n<font color=Cyan>)</font><font color=Red><b>:</b></font>ts<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Right n<font color=Cyan>,</font> ts<font color=Cyan>)</font>-<a name="(line66)"></a> ts <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False<font color=Cyan>,</font><font color=Magenta>"expected a number"</font><font color=Cyan>)</font><font color=Cyan>,</font> ts<font color=Cyan>)</font> <font color=Cyan>)</font>-<a name="(line67)"></a><a name="symbol"></a>symbol <font color=Red>::</font> String <font color=Red>-></font> XParser ()-<a name="(line68)"></a>symbol s <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-></font> <font color=Green><u>case</u></font> inp <font color=Green><u>of</u></font>-<a name="(line69)"></a> <font color=Cyan>(</font>Left err<font color=Red><b>:</b></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False<font color=Cyan>,</font>err<font color=Cyan>)</font><font color=Cyan>,</font> inp<font color=Cyan>)</font>-<a name="(line70)"></a> <font color=Cyan>(</font>Right <font color=Cyan>(</font>p<font color=Cyan>,</font> Symbol n<font color=Cyan>)</font><font color=Red><b>:</b></font>ts<font color=Cyan>)</font> <font color=Red>|</font> n<font color=Cyan>==</font>s <font color=Red>-></font> <font color=Cyan>(</font>Right ()<font color=Cyan>,</font> ts<font color=Cyan>)</font>-<a name="(line71)"></a> ts <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False<font color=Cyan>,</font><font color=Magenta>"expected symbol "</font><font color=Cyan>++</font>s<font color=Cyan>)</font><font color=Cyan>,</font> ts<font color=Cyan>)</font> <font color=Cyan>)</font>-<a name="(line72)"></a>-<a name="(line73)"></a><a name="quote"></a>quote <font color=Red>=</font> oneOf <font color=Red>[</font> symbol <font color=Magenta>"'"</font><font color=Cyan>,</font> symbol <font color=Magenta>"\""</font> <font color=Red>]</font>-<a name="(line74)"></a>-<a name="(line75)"></a><a name="pam"></a>pam fs x <font color=Red>=</font> <font color=Red>[</font> f x <font color=Red>|</font> f <font color=Red><-</font> fs <font color=Red>]</font>-<a name="(line76)"></a>-<a name="(line77)"></a>-<a name="(line78)"></a><font color=Blue>{--- original Xtract grammar -----<a name="(line79)"></a> query = string tagname-<a name="(line80)"></a> | string * tagname prefix-<a name="(line81)"></a> | * string tagname suffix-<a name="(line82)"></a> | * any element-<a name="(line83)"></a> | - chardata-<a name="(line84)"></a> | ( query )-<a name="(line85)"></a> | query / query parent/child relationship-<a name="(line86)"></a> | query // query deep inside-<a name="(line87)"></a> | query + query union of queries-<a name="(line88)"></a> | query [predicate]-<a name="(line89)"></a> | query [positions]-<a name="(line90)"></a>-<a name="(line91)"></a> predicate = quattr has attribute-<a name="(line92)"></a> | quattr op ' string ' attribute has value-<a name="(line93)"></a> | quattr op " string " attribute has value-<a name="(line94)"></a> | quattr op quattr attribute value comparison (lexical)-<a name="(line95)"></a> | quattr nop integer attribute has value (numerical)-<a name="(line96)"></a> | quattr nop quattr attribute value comparison (numerical)-<a name="(line97)"></a> | ( predicate ) bracketting-<a name="(line98)"></a> | predicate & predicate logical and-<a name="(line99)"></a> | predicate | predicate logical or-<a name="(line100)"></a> | ~ predicate logical not-<a name="(line101)"></a>-<a name="(line102)"></a> attribute = @ string has attribute-<a name="(line103)"></a> | query / @ string child has attribute-<a name="(line104)"></a> | - has textual content-<a name="(line105)"></a> | query / - child has textual content-<a name="(line106)"></a>-<a name="(line107)"></a> quattr = query-<a name="(line108)"></a> | attribute-<a name="(line109)"></a>-<a name="(line110)"></a> op = = equal to-<a name="(line111)"></a> | != not equal to-<a name="(line112)"></a> | < less than-<a name="(line113)"></a> | <= less than or equal to-<a name="(line114)"></a> | > greater than-<a name="(line115)"></a> | >= greater than or equal to-<a name="(line116)"></a>-<a name="(line117)"></a> nop = .=. equal to-<a name="(line118)"></a> | .!=. not equal to-<a name="(line119)"></a> | .<. less than-<a name="(line120)"></a> | .<=. less than or equal to-<a name="(line121)"></a> | .>. greater than-<a name="(line122)"></a> | .>=. greater than or equal to-<a name="(line123)"></a>-<a name="(line124)"></a> positions = position {, positions} multiple positions-<a name="(line125)"></a> | position - position ranges-<a name="(line126)"></a>-<a name="(line127)"></a> position = integer numbering is from 0 upwards-<a name="(line128)"></a> | $ last-<a name="(line129)"></a>-<a name="(line130)"></a>-<a name="(line131)"></a>---- transformed grammar (removing left recursion)-<a name="(line132)"></a> aquery = ./ tquery -- current context-<a name="(line133)"></a> | tquery -- also current context-<a name="(line134)"></a> | / tquery -- root context-<a name="(line135)"></a> | // tquery -- deep context from root-<a name="(line136)"></a>-<a name="(line137)"></a> tquery = ( tquery ) xquery-<a name="(line138)"></a> | tag xquery-<a name="(line139)"></a> | - -- fixes original grammar ("-/*" is incorrect)-<a name="(line140)"></a> -<a name="(line141)"></a> tag = string *-<a name="(line142)"></a> | string-<a name="(line143)"></a> | * string-<a name="(line144)"></a> | *-<a name="(line145)"></a> -<a name="(line146)"></a> xquery = / tquery-<a name="(line147)"></a> | // tquery-<a name="(line148)"></a> | / @ string -- new: print attribute value-<a name="(line149)"></a> | + tquery-<a name="(line150)"></a> | [ tpredicate ] xquery-<a name="(line151)"></a> | [ positions ] xquery-<a name="(line152)"></a> | lambda-<a name="(line153)"></a>-<a name="(line154)"></a> tpredicate = vpredicate upredicate-<a name="(line155)"></a> upredicate = & tpredicate-<a name="(line156)"></a> | | tpredicate-<a name="(line157)"></a> | lambda-<a name="(line158)"></a> vpredicate = ( tpredicate )-<a name="(line159)"></a> | ~ tpredicate-<a name="(line160)"></a> | tattribute-<a name="(line161)"></a>-<a name="(line162)"></a> tattribute = aquery uattribute-<a name="(line163)"></a> | @ string vattribute-<a name="(line164)"></a> uattribute = / @ string vattribute-<a name="(line165)"></a> | vattribute-<a name="(line166)"></a> vattribute = op wattribute-<a name="(line167)"></a> | op ' string '-<a name="(line168)"></a> | nop wattribute-<a name="(line169)"></a> | nop integer-<a name="(line170)"></a> | lambda-<a name="(line171)"></a> wattribute = @ string-<a name="(line172)"></a> | aquery / @ string-<a name="(line173)"></a> | aquery-<a name="(line174)"></a>-<a name="(line175)"></a> positions = simplepos commapos-<a name="(line176)"></a> simplepos = integer range-<a name="(line177)"></a> | $-<a name="(line178)"></a> range = - integer-<a name="(line179)"></a> | - $-<a name="(line180)"></a> | lambda-<a name="(line181)"></a> commapos = , simplepos commapos-<a name="(line182)"></a> | lambda-<a name="(line183)"></a>-<a name="(line184)"></a> op = =-<a name="(line185)"></a> | !=-<a name="(line186)"></a> | <-<a name="(line187)"></a> | <=-<a name="(line188)"></a> | >-<a name="(line189)"></a> | >=-<a name="(line190)"></a>-<a name="(line191)"></a> nop = .=.-<a name="(line192)"></a> | .!=.-<a name="(line193)"></a> | .<.-<a name="(line194)"></a> | .<=.-<a name="(line195)"></a> | .>.-<a name="(line196)"></a> | .>=.-<a name="(line197)"></a>-}</font>-<a name="(line198)"></a>-<a name="(line199)"></a><a name="bracket"></a>bracket <font color=Red>::</font> XParser a <font color=Red>-></font> XParser a-<a name="(line200)"></a>bracket p <font color=Red>=</font>-<a name="(line201)"></a> <font color=Green><u>do</u></font> symbol <font color=Magenta>"("</font>-<a name="(line202)"></a> x <font color=Red><-</font> p-<a name="(line203)"></a> symbol <font color=Magenta>")"</font>-<a name="(line204)"></a> return x-<a name="(line205)"></a>-<a name="(line206)"></a>-<a name="(line207)"></a><font color=Blue>---- Xtract parsers ----</font>-<a name="(line208)"></a>-<a name="(line209)"></a><a name="aquery"></a><font color=Blue>-- aquery chooses to search from the root, or only in local context</font>-<a name="(line210)"></a>aquery <font color=Red>::</font> <font color=Cyan>(</font><font color=Cyan>(</font>CFilter i<font color=Red>-></font>CFilter i<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>DFilter i<font color=Red>-></font>DFilter i<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line211)"></a> <font color=Red>-></font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>-<a name="(line212)"></a>aquery lift <font color=Red>=</font> oneOf-<a name="(line213)"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"//"</font>-<a name="(line214)"></a> tquery <font color=Red>[</font>lift C<font color=Cyan>.</font>multi<font color=Red>]</font>-<a name="(line215)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"/"</font>-<a name="(line216)"></a> tquery <font color=Red>[</font>lift id<font color=Red>]</font>-<a name="(line217)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"./"</font>-<a name="(line218)"></a> tquery <font color=Red>[</font><font color=Cyan>(</font>local C<font color=Cyan>.</font>keep D<font color=Cyan>./></font><font color=Cyan>)</font><font color=Red>]</font>-<a name="(line219)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> tquery <font color=Red>[</font><font color=Cyan>(</font>local C<font color=Cyan>.</font>keep D<font color=Cyan>./></font><font color=Cyan>)</font><font color=Red>]</font>-<a name="(line220)"></a> <font color=Red>]</font>-<a name="(line221)"></a>-<a name="(line222)"></a><a name="tquery"></a>tquery <font color=Red>::</font> <font color=Red>[</font>DFilter i<font color=Red>-></font>DFilter i<font color=Red>]</font> <font color=Red>-></font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>-<a name="(line223)"></a>tquery [] <font color=Red>=</font> tquery <font color=Red>[</font>id<font color=Red>]</font>-<a name="(line224)"></a>tquery <font color=Cyan>(</font>qf<font color=Red><b>:</b></font>cxt<font color=Cyan>)</font> <font color=Red>=</font> oneOf-<a name="(line225)"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> q <font color=Red><-</font> bracket <font color=Cyan>(</font>tquery <font color=Cyan>(</font>qf<font color=Red><b>:</b></font>qf<font color=Red><b>:</b></font>cxt<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line226)"></a> xquery cxt q-<a name="(line227)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> q <font color=Red><-</font> xtag-<a name="(line228)"></a> xquery cxt <font color=Cyan>(</font>qf <font color=Cyan>(</font><font color=Cyan>(</font>unescape <font color=Cyan>.</font><font color=Cyan>)</font><font color=Cyan>.</font>q<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Blue>-- glue inners texts together</font>-<a name="(line229)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"-"</font>-<a name="(line230)"></a> return <font color=Cyan>(</font>qf <font color=Cyan>(</font>local C<font color=Cyan>.</font>txt<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line231)"></a> <font color=Red>]</font>-<a name="(line232)"></a>-<a name="(line233)"></a><a name="xtag"></a>xtag <font color=Red>::</font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>-<a name="(line234)"></a>xtag <font color=Red>=</font> oneOf-<a name="(line235)"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> s <font color=Red><-</font> string-<a name="(line236)"></a> symbol <font color=Magenta>"*"</font>-<a name="(line237)"></a> return <font color=Cyan>(</font>local <font color=Cyan>(</font>C<font color=Cyan>.</font>tagWith <font color=Cyan>(</font>s <font color=Cyan>`isPrefixOf`</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line238)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> s <font color=Red><-</font> string-<a name="(line239)"></a> return <font color=Cyan>(</font>local <font color=Cyan>(</font>C<font color=Cyan>.</font>tag s<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line240)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"*"</font>-<a name="(line241)"></a> s <font color=Red><-</font> string-<a name="(line242)"></a> return <font color=Cyan>(</font>local <font color=Cyan>(</font>C<font color=Cyan>.</font>tagWith <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>(</font>reverse s<font color=Cyan>)</font> <font color=Cyan>`isPrefixOf`</font><font color=Cyan>)</font> <font color=Cyan>.</font> reverse<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line243)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"*"</font>-<a name="(line244)"></a> return <font color=Cyan>(</font>local C<font color=Cyan>.</font>elm<font color=Cyan>)</font>-<a name="(line245)"></a> <font color=Red>]</font>-<a name="(line246)"></a>-<a name="(line247)"></a>-<a name="(line248)"></a><a name="xquery"></a>xquery <font color=Red>::</font> <font color=Red>[</font>DFilter i<font color=Red>-></font>DFilter i<font color=Red>]</font> <font color=Red>-></font> DFilter i <font color=Red>-></font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>-<a name="(line249)"></a>xquery cxt q1 <font color=Red>=</font> oneOf-<a name="(line250)"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"/"</font>-<a name="(line251)"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"@"</font>-<a name="(line252)"></a> attr <font color=Red><-</font> string-<a name="(line253)"></a> return <font color=Cyan>(</font>D<font color=Cyan>.</font>iffind attr <font color=Cyan>(</font><font color=Red>\</font>s<font color=Red>-></font>local <font color=Cyan>(</font>C<font color=Cyan>.</font>literal s<font color=Cyan>)</font><font color=Cyan>)</font> D<font color=Cyan>.</font>none <font color=Cyan>`</font>D<font color=Cyan>.</font>o<font color=Cyan>`</font> q1<font color=Cyan>)</font>-<a name="(line254)"></a> <font color=Cyan>`onFail`</font>-<a name="(line255)"></a> tquery <font color=Cyan>(</font><font color=Cyan>(</font>q1 D<font color=Cyan>./></font><font color=Cyan>)</font><font color=Red><b>:</b></font>cxt<font color=Cyan>)</font> <font color=Cyan>)</font>-<a name="(line256)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"//"</font>-<a name="(line257)"></a> tquery <font color=Cyan>(</font><font color=Cyan>(</font><font color=Red>\</font>q2<font color=Red>-></font> <font color=Cyan>(</font>liftLocal C<font color=Cyan>.</font>multi<font color=Cyan>)</font> q2-<a name="(line258)"></a> <font color=Cyan>`</font>D<font color=Cyan>.</font>o<font color=Cyan>`</font> local C<font color=Cyan>.</font>children <font color=Cyan>`</font>D<font color=Cyan>.</font>o<font color=Cyan>`</font> q1<font color=Cyan>)</font><font color=Red><b>:</b></font>cxt<font color=Cyan>)</font>-<a name="(line259)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"+"</font>-<a name="(line260)"></a> q2 <font color=Red><-</font> tquery cxt-<a name="(line261)"></a> return <font color=Cyan>(</font>D<font color=Cyan>.</font>cat <font color=Red>[</font>q1<font color=Cyan>,</font>q2<font color=Red>]</font><font color=Cyan>)</font>-<a name="(line262)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"["</font>-<a name="(line263)"></a> is <font color=Red><-</font> iindex <font color=Blue>-- now extended to multiple indexes</font>-<a name="(line264)"></a> symbol <font color=Magenta>"]"</font>-<a name="(line265)"></a> xquery cxt <font color=Cyan>(</font><font color=Red>\</font>xml<font color=Red>-></font> concat <font color=Cyan>.</font> pam is <font color=Cyan>.</font> q1 xml<font color=Cyan>)</font>-<a name="(line266)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"["</font>-<a name="(line267)"></a> p <font color=Red><-</font> tpredicate-<a name="(line268)"></a> symbol <font color=Magenta>"]"</font>-<a name="(line269)"></a> xquery cxt <font color=Cyan>(</font>q1 <font color=Cyan>`</font>D<font color=Cyan>.</font>with<font color=Cyan>`</font> p<font color=Cyan>)</font>-<a name="(line270)"></a> <font color=Cyan>,</font> return q1-<a name="(line271)"></a> <font color=Red>]</font>-<a name="(line272)"></a>-<a name="(line273)"></a><a name="tpredicate"></a>tpredicate <font color=Red>::</font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>-<a name="(line274)"></a>tpredicate <font color=Red>=</font>-<a name="(line275)"></a> <font color=Green><u>do</u></font> p <font color=Red><-</font> vpredicate-<a name="(line276)"></a> f <font color=Red><-</font> upredicate-<a name="(line277)"></a> return <font color=Cyan>(</font>f p<font color=Cyan>)</font>-<a name="(line278)"></a>-<a name="(line279)"></a><a name="upredicate"></a>upredicate <font color=Red>::</font> XParser <font color=Cyan>(</font>DFilter i<font color=Red>-></font>DFilter i<font color=Cyan>)</font>-<a name="(line280)"></a>upredicate <font color=Red>=</font> oneOf-<a name="(line281)"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"&"</font>-<a name="(line282)"></a> p2 <font color=Red><-</font> tpredicate-<a name="(line283)"></a> return <font color=Cyan>(</font><font color=Cyan>`</font>D<font color=Cyan>.</font>o<font color=Cyan>`</font> p2<font color=Cyan>)</font>-<a name="(line284)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"|"</font>-<a name="(line285)"></a> p2 <font color=Red><-</font> tpredicate-<a name="(line286)"></a> return <font color=Cyan>(</font>D<font color=Cyan>.|>|</font> p2<font color=Cyan>)</font>-<a name="(line287)"></a> <font color=Cyan>,</font> return id-<a name="(line288)"></a> <font color=Red>]</font>-<a name="(line289)"></a>-<a name="(line290)"></a><a name="vpredicate"></a>vpredicate <font color=Red>::</font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>-<a name="(line291)"></a>vpredicate <font color=Red>=</font> oneOf-<a name="(line292)"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> bracket tpredicate-<a name="(line293)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"~"</font>-<a name="(line294)"></a> p <font color=Red><-</font> tpredicate-<a name="(line295)"></a> return <font color=Cyan>(</font>local C<font color=Cyan>.</font>keep <font color=Cyan>`</font>D<font color=Cyan>.</font>without<font color=Cyan>`</font> p<font color=Cyan>)</font>-<a name="(line296)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> tattribute-<a name="(line297)"></a> <font color=Red>]</font>-<a name="(line298)"></a>-<a name="(line299)"></a><a name="tattribute"></a>tattribute <font color=Red>::</font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>-<a name="(line300)"></a>tattribute <font color=Red>=</font> oneOf-<a name="(line301)"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> q <font color=Red><-</font> aquery liftGlobal-<a name="(line302)"></a> uattribute q-<a name="(line303)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"@"</font>-<a name="(line304)"></a> s <font color=Red><-</font> string-<a name="(line305)"></a> vattribute <font color=Cyan>(</font>local C<font color=Cyan>.</font>keep<font color=Cyan>,</font> local <font color=Cyan>(</font>C<font color=Cyan>.</font>attr s<font color=Cyan>)</font><font color=Cyan>,</font> D<font color=Cyan>.</font>iffind s<font color=Cyan>)</font>-<a name="(line306)"></a> <font color=Red>]</font>-<a name="(line307)"></a>-<a name="(line308)"></a><a name="uattribute"></a>uattribute <font color=Red>::</font> DFilter i <font color=Red>-></font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>-<a name="(line309)"></a>uattribute q <font color=Red>=</font> oneOf-<a name="(line310)"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"/"</font>-<a name="(line311)"></a> symbol <font color=Magenta>"@"</font>-<a name="(line312)"></a> s <font color=Red><-</font> string-<a name="(line313)"></a> vattribute <font color=Cyan>(</font>q<font color=Cyan>,</font> local <font color=Cyan>(</font>C<font color=Cyan>.</font>attr s<font color=Cyan>)</font><font color=Cyan>,</font> D<font color=Cyan>.</font>iffind s<font color=Cyan>)</font>-<a name="(line314)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> vattribute <font color=Cyan>(</font>q<font color=Cyan>,</font> local C<font color=Cyan>.</font>keep<font color=Cyan>,</font> D<font color=Cyan>.</font>ifTxt<font color=Cyan>)</font>-<a name="(line315)"></a> <font color=Red>]</font>-<a name="(line316)"></a>-<a name="(line317)"></a><a name="vattribute"></a>vattribute <font color=Red>::</font> <font color=Cyan>(</font>DFilter i<font color=Cyan>,</font> DFilter i<font color=Cyan>,</font> <font color=Cyan>(</font>String<font color=Red>-></font>DFilter i<font color=Cyan>)</font><font color=Red>-></font>DFilter i<font color=Red>-></font>DFilter i<font color=Cyan>)</font>-<a name="(line318)"></a> <font color=Red>-></font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>-<a name="(line319)"></a>vattribute <font color=Cyan>(</font>q<font color=Cyan>,</font>a<font color=Cyan>,</font>iffn<font color=Cyan>)</font> <font color=Red>=</font> oneOf-<a name="(line320)"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> cmp <font color=Red><-</font> op-<a name="(line321)"></a> quote-<a name="(line322)"></a> s2 <font color=Red><-</font> string-<a name="(line323)"></a> quote-<a name="(line324)"></a> return <font color=Cyan>(</font><font color=Cyan>(</font>iffn <font color=Cyan>(</font><font color=Red>\</font>s1<font color=Red>-></font><font color=Green><u>if</u></font> cmp s1 s2 <font color=Green><u>then</u></font> D<font color=Cyan>.</font>keep <font color=Green><u>else</u></font> D<font color=Cyan>.</font>none<font color=Cyan>)</font> D<font color=Cyan>.</font>none<font color=Cyan>)</font>-<a name="(line325)"></a> <font color=Cyan>`</font>D<font color=Cyan>.</font>o<font color=Cyan>`</font> q<font color=Cyan>)</font>-<a name="(line326)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> cmp <font color=Red><-</font> op-<a name="(line327)"></a> <font color=Cyan>(</font>q2<font color=Cyan>,</font>iffn2<font color=Cyan>)</font> <font color=Red><-</font> wattribute-<a name="(line328)"></a> return <font color=Cyan>(</font><font color=Cyan>(</font>iffn <font color=Cyan>(</font><font color=Red>\</font>s1<font color=Red>-></font> iffn2 <font color=Cyan>(</font><font color=Red>\</font>s2<font color=Red>-></font> <font color=Green><u>if</u></font> cmp s1 s2 <font color=Green><u>then</u></font> D<font color=Cyan>.</font>keep <font color=Green><u>else</u></font> D<font color=Cyan>.</font>none<font color=Cyan>)</font>-<a name="(line329)"></a> D<font color=Cyan>.</font>none<font color=Cyan>)</font>-<a name="(line330)"></a> D<font color=Cyan>.</font>none<font color=Cyan>)</font> <font color=Cyan>`</font>D<font color=Cyan>.</font>o<font color=Cyan>`</font> q<font color=Cyan>)</font>-<a name="(line331)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> cmp <font color=Red><-</font> nop-<a name="(line332)"></a> n <font color=Red><-</font> number-<a name="(line333)"></a> return <font color=Cyan>(</font><font color=Cyan>(</font>iffn <font color=Cyan>(</font><font color=Red>\</font>s<font color=Red>-></font><font color=Green><u>if</u></font> cmp <font color=Cyan>(</font>read s<font color=Cyan>)</font> n <font color=Green><u>then</u></font> D<font color=Cyan>.</font>keep <font color=Green><u>else</u></font> D<font color=Cyan>.</font>none<font color=Cyan>)</font> D<font color=Cyan>.</font>none<font color=Cyan>)</font>-<a name="(line334)"></a> <font color=Cyan>`</font>D<font color=Cyan>.</font>o<font color=Cyan>`</font> q<font color=Cyan>)</font>-<a name="(line335)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> cmp <font color=Red><-</font> nop-<a name="(line336)"></a> <font color=Cyan>(</font>q2<font color=Cyan>,</font>iffn2<font color=Cyan>)</font> <font color=Red><-</font> wattribute-<a name="(line337)"></a> return <font color=Cyan>(</font><font color=Cyan>(</font>iffn <font color=Cyan>(</font><font color=Red>\</font>s1<font color=Red>-></font> iffn2 <font color=Cyan>(</font><font color=Red>\</font>s2<font color=Red>-></font> <font color=Green><u>if</u></font> cmp <font color=Cyan>(</font>read s1<font color=Cyan>)</font> <font color=Cyan>(</font>read s2<font color=Cyan>)</font> <font color=Green><u>then</u></font> D<font color=Cyan>.</font>keep-<a name="(line338)"></a> <font color=Green><u>else</u></font> D<font color=Cyan>.</font>none<font color=Cyan>)</font>-<a name="(line339)"></a> D<font color=Cyan>.</font>none<font color=Cyan>)</font>-<a name="(line340)"></a> D<font color=Cyan>.</font>none<font color=Cyan>)</font> <font color=Cyan>`</font>D<font color=Cyan>.</font>o<font color=Cyan>`</font> q<font color=Cyan>)</font>-<a name="(line341)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> return <font color=Cyan>(</font><font color=Cyan>(</font>a <font color=Cyan>`</font>D<font color=Cyan>.</font>o<font color=Cyan>`</font> q<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line342)"></a> <font color=Red>]</font>-<a name="(line343)"></a>-<a name="(line344)"></a><a name="wattribute"></a>wattribute <font color=Red>::</font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>,</font> <font color=Cyan>(</font>String<font color=Red>-></font>DFilter i<font color=Cyan>)</font><font color=Red>-></font>DFilter i<font color=Red>-></font>DFilter i<font color=Cyan>)</font>-<a name="(line345)"></a>wattribute <font color=Red>=</font> oneOf-<a name="(line346)"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"@"</font>-<a name="(line347)"></a> s <font color=Red><-</font> string-<a name="(line348)"></a> return <font color=Cyan>(</font>D<font color=Cyan>.</font>keep<font color=Cyan>,</font> D<font color=Cyan>.</font>iffind s<font color=Cyan>)</font>-<a name="(line349)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> q <font color=Red><-</font> aquery liftGlobal-<a name="(line350)"></a> symbol <font color=Magenta>"/"</font>-<a name="(line351)"></a> symbol <font color=Magenta>"@"</font>-<a name="(line352)"></a> s <font color=Red><-</font> string-<a name="(line353)"></a> return <font color=Cyan>(</font>q<font color=Cyan>,</font> D<font color=Cyan>.</font>iffind s<font color=Cyan>)</font>-<a name="(line354)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> q <font color=Red><-</font> aquery liftGlobal-<a name="(line355)"></a> return <font color=Cyan>(</font>q<font color=Cyan>,</font> D<font color=Cyan>.</font>ifTxt<font color=Cyan>)</font>-<a name="(line356)"></a> <font color=Red>]</font>-<a name="(line357)"></a>-<a name="(line358)"></a>-<a name="(line359)"></a><a name="iindex"></a>iindex <font color=Red>::</font> XParser <font color=Red>[</font><font color=Red>[</font>a<font color=Red>]</font><font color=Red>-></font><font color=Red>[</font>a<font color=Red>]</font><font color=Red>]</font>-<a name="(line360)"></a>iindex <font color=Red>=</font>-<a name="(line361)"></a> <font color=Green><u>do</u></font> i <font color=Red><-</font> simpleindex-<a name="(line362)"></a> is <font color=Red><-</font> idxcomma-<a name="(line363)"></a> return <font color=Cyan>(</font>i<font color=Red><b>:</b></font>is<font color=Cyan>)</font>-<a name="(line364)"></a>-<a name="(line365)"></a><a name="simpleindex"></a>simpleindex <font color=Red>::</font> XParser <font color=Cyan>(</font><font color=Red>[</font>a<font color=Red>]</font><font color=Red>-></font><font color=Red>[</font>a<font color=Red>]</font><font color=Cyan>)</font>-<a name="(line366)"></a>simpleindex <font color=Red>=</font> oneOf-<a name="(line367)"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> n <font color=Red><-</font> number-<a name="(line368)"></a> r <font color=Red><-</font> rrange n-<a name="(line369)"></a> return r-<a name="(line370)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"$"</font>-<a name="(line371)"></a> return <font color=Cyan>(</font>C<font color=Cyan>.</font>keep <font color=Cyan>.</font> last<font color=Cyan>)</font>-<a name="(line372)"></a> <font color=Red>]</font>-<a name="(line373)"></a>-<a name="(line374)"></a><a name="rrange"></a>rrange<font color=Cyan>,</font> numberdollar <font color=Red>::</font> Integer <font color=Red>-></font> XParser <font color=Cyan>(</font><font color=Red>[</font>a<font color=Red>]</font><font color=Red>-></font><font color=Red>[</font>a<font color=Red>]</font><font color=Cyan>)</font>-<a name="(line375)"></a>rrange n1 <font color=Red>=</font> oneOf-<a name="(line376)"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"-"</font>-<a name="(line377)"></a> numberdollar n1-<a name="(line378)"></a> <font color=Cyan>,</font> return <font color=Cyan>(</font>C<font color=Cyan>.</font>keep<font color=Cyan>.</font><font color=Cyan>(</font><font color=Cyan>!!</font><font color=Cyan>(</font>fromInteger n1<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line379)"></a> <font color=Red>]</font>-<a name="(line380)"></a>-<a name="(line381)"></a><a name="numberdollar"></a>numberdollar n1 <font color=Red>=</font> oneOf-<a name="(line382)"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> n2 <font color=Red><-</font> number-<a name="(line383)"></a> return <font color=Cyan>(</font>take <font color=Cyan>(</font>fromInteger <font color=Cyan>(</font><font color=Magenta>1</font><font color=Cyan>+</font>n2<font color=Blue>-</font>n1<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>.</font> drop <font color=Cyan>(</font>fromInteger n1<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line384)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"$"</font>-<a name="(line385)"></a> return <font color=Cyan>(</font>drop <font color=Cyan>(</font>fromInteger n1<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="(line386)"></a> <font color=Red>]</font>-<a name="(line387)"></a>-<a name="(line388)"></a><a name="idxcomma"></a>idxcomma <font color=Red>::</font> XParser <font color=Red>[</font><font color=Red>[</font>a<font color=Red>]</font><font color=Red>-></font><font color=Red>[</font>a<font color=Red>]</font><font color=Red>]</font>-<a name="(line389)"></a>idxcomma <font color=Red>=</font> oneOf-<a name="(line390)"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>","</font>-<a name="(line391)"></a> r <font color=Red><-</font> simpleindex-<a name="(line392)"></a> rs <font color=Red><-</font> idxcomma-<a name="(line393)"></a> return <font color=Cyan>(</font>r<font color=Red><b>:</b></font>rs<font color=Cyan>)</font>-<a name="(line394)"></a> <font color=Cyan>,</font> return []-<a name="(line395)"></a> <font color=Red>]</font>-<a name="(line396)"></a>-<a name="(line397)"></a>-<a name="(line398)"></a><a name="op"></a>op <font color=Red>::</font> XParser <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Red>-></font>Bool<font color=Cyan>)</font>-<a name="(line399)"></a>op <font color=Red>=</font> oneOf-<a name="(line400)"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"="</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan>==</font><font color=Cyan>)</font>-<a name="(line401)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"!="</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan>/=</font><font color=Cyan>)</font>-<a name="(line402)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"<"</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan><</font><font color=Cyan>)</font>-<a name="(line403)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"<="</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan><=</font><font color=Cyan>)</font>-<a name="(line404)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>">"</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan>></font><font color=Cyan>)</font>-<a name="(line405)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>">="</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan>>=</font><font color=Cyan>)</font>-<a name="(line406)"></a> <font color=Red>]</font>-<a name="(line407)"></a>-<a name="(line408)"></a><a name="nop"></a>nop <font color=Red>::</font> XParser <font color=Cyan>(</font>Integer<font color=Red>-></font>Integer<font color=Red>-></font>Bool<font color=Cyan>)</font>-<a name="(line409)"></a>nop <font color=Red>=</font> oneOf-<a name="(line410)"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>".=."</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan>==</font><font color=Cyan>)</font>-<a name="(line411)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>".!=."</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan>/=</font><font color=Cyan>)</font>-<a name="(line412)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>".<."</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan><</font><font color=Cyan>)</font>-<a name="(line413)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>".<=."</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan><=</font><font color=Cyan>)</font>-<a name="(line414)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>".>."</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan>></font><font color=Cyan>)</font>-<a name="(line415)"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>".>=."</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan>>=</font><font color=Cyan>)</font>-<a name="(line416)"></a> <font color=Red>]</font>-<a name="(line417)"></a>+<head>+<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->+<title>src/Text/XML/HaXml/Xtract/Parse.hs</title>+</head>+<body>+<pre><a name="line-1"></a><font color=Blue>-- | A parser for the Xtract command-language. (The string input is</font>+<a name="line-2"></a><font color=Blue>-- tokenised internally by the lexer 'lexXtract'.)</font>+<a name="line-3"></a><font color=Blue>-- See <<a href="http://www.haskell.org/HaXml/Xtract.html">http://www.haskell.org/HaXml/Xtract.html</a>> for the grammar that</font>+<a name="line-4"></a><font color=Blue>-- is accepted.</font>+<a name="line-5"></a>+<a name="line-6"></a><font color=Blue>-- Because the original Xtract grammar was left-recursive, we have</font>+<a name="line-7"></a><font color=Blue>-- transformed it into a non-left-recursive form.</font>+<a name="line-8"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Xtract<font color=Cyan>.</font>Parse <font color=Cyan>(</font>parseXtract<font color=Cyan>,</font>xtract<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-9"></a>+<a name="line-10"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>Poly hiding <font color=Cyan>(</font>bracket<font color=Cyan>)</font>+<a name="line-11"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Xtract<font color=Cyan>.</font>Lex+<a name="line-12"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Xtract<font color=Cyan>.</font>Combinators <font color=Green><u>as</u></font> D+<a name="line-13"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Combinators <font color=Green><u>as</u></font> C+<a name="line-14"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Types <font color=Cyan>(</font>Content<font color=Cyan>)</font>+<a name="line-15"></a><font color=Green><u>import</u></font> List<font color=Cyan>(</font>isPrefixOf<font color=Cyan>)</font>+<a name="line-16"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>XML<font color=Cyan>.</font>HaXml<font color=Cyan>.</font>Escape <font color=Cyan>(</font>xmlUnEscapeContent<font color=Cyan>,</font>stdXmlEscaper<font color=Cyan>)</font>+<a name="line-17"></a>+<a name="line-18"></a><a name="unescape"></a><font color=Blue>-- output transformer - to ensure that text/references are glued together</font>+<a name="line-19"></a><font color=Blue>unescape</font> <font color=Red>=</font> xmlUnEscapeContent stdXmlEscaper+<a name="line-20"></a>+<a name="line-21"></a>+<a name="line-22"></a><a name="xtract"></a><font color=Blue>-- | To convert an Xtract query into an ordinary HaXml combinator expression.</font>+<a name="line-23"></a><font color=Blue>-- First arg is a tag-transformation function (e.g. map toLower) applied</font>+<a name="line-24"></a><font color=Blue>--- before matching. Second arg is the query string.</font>+<a name="line-25"></a><font color=Blue>xtract</font> <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Cyan>)</font> <font color=Red>-></font> String <font color=Red>-></font> CFilter i+<a name="line-26"></a><font color=Blue>xtract</font> f query+<a name="line-27"></a> <font color=Red>|</font> interiorRef lexedQ <font color=Red>=</font> dfilter <font color=Cyan>(</font>parseXtract lexedQ<font color=Cyan>)</font>+<a name="line-28"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> cfilter <font color=Cyan>(</font>parseXtract lexedQ<font color=Cyan>)</font>+<a name="line-29"></a> <font color=Green><u>where</u></font>+<a name="line-30"></a> lexedQ <font color=Red>=</font> lexXtract f query+<a name="line-31"></a> <font color=Blue>-- test whether query has interior reference to doc root</font>+<a name="line-32"></a> interiorRef <font color=Cyan>(</font>Right <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font>Symbol s<font color=Cyan>)</font><font color=Red><b>:</b></font> Right <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font>Symbol <font color=Magenta>"//"</font><font color=Cyan>)</font><font color=Red><b>:</b></font> <font color=Green><u>_</u></font><font color=Cyan>)</font>+<a name="line-33"></a> <font color=Red>|</font> s <font color=Cyan>`elem`</font> predicateIntro <font color=Red>=</font> True+<a name="line-34"></a> interiorRef <font color=Cyan>(</font>Right <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font>Symbol s<font color=Cyan>)</font><font color=Red><b>:</b></font> Right <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Cyan>,</font>Symbol <font color=Magenta>"/"</font><font color=Cyan>)</font><font color=Red><b>:</b></font> <font color=Green><u>_</u></font><font color=Cyan>)</font>+<a name="line-35"></a> <font color=Red>|</font> s <font color=Cyan>`elem`</font> predicateIntro <font color=Red>=</font> True+<a name="line-36"></a> interiorRef <font color=Cyan>(</font><font color=Green><u>_</u></font> <font color=Red><b>:</b></font> rest<font color=Cyan>)</font> <font color=Red>=</font> interiorRef rest+<a name="line-37"></a> interiorRef [] <font color=Red>=</font> False+<a name="line-38"></a> predicateIntro <font color=Red>=</font> <font color=Red>[</font> <font color=Magenta>"["</font><font color=Cyan>,</font> <font color=Magenta>"("</font>+<a name="line-39"></a> <font color=Cyan>,</font> <font color=Magenta>"&"</font><font color=Cyan>,</font> <font color=Magenta>"|"</font><font color=Cyan>,</font> <font color=Magenta>"~"</font>+<a name="line-40"></a> <font color=Cyan>,</font> <font color=Magenta>"="</font><font color=Cyan>,</font> <font color=Magenta>"!="</font><font color=Cyan>,</font> <font color=Magenta>"<"</font><font color=Cyan>,</font> <font color=Magenta>"<="</font><font color=Cyan>,</font> <font color=Magenta>">"</font><font color=Cyan>,</font> <font color=Magenta>">="</font>+<a name="line-41"></a> <font color=Cyan>,</font> <font color=Magenta>".=."</font><font color=Cyan>,</font><font color=Magenta>".!=."</font><font color=Cyan>,</font><font color=Magenta>".<."</font><font color=Cyan>,</font><font color=Magenta>".<=."</font><font color=Cyan>,</font><font color=Magenta>".>."</font><font color=Cyan>,</font><font color=Magenta>".>=."</font> <font color=Red>]</font>+<a name="line-42"></a>+<a name="line-43"></a><a name="parseXtract"></a><font color=Blue>-- | The cool thing is that the Xtract command parser directly builds</font>+<a name="line-44"></a><font color=Blue>-- a higher-order 'DFilter' (see "Text.XML.HaXml.Xtract.Combinators")</font>+<a name="line-45"></a><font color=Blue>-- which can be applied to an XML document without further ado.</font>+<a name="line-46"></a><font color=Blue>-- (@parseXtract@ halts the program if a parse error is found.)</font>+<a name="line-47"></a><font color=Blue>parseXtract</font> <font color=Red>::</font> <font color=Red>[</font>Token<font color=Red>]</font> <font color=Red>-></font> DFilter i+<a name="line-48"></a><font color=Blue>parseXtract</font> <font color=Red>=</font> either error id <font color=Cyan>.</font> parseXtract'+<a name="line-49"></a>+<a name="line-50"></a><a name="parseXtract'"></a><font color=Blue>-- | @parseXtract'@ returns error messages through the Either type.</font>+<a name="line-51"></a><font color=Blue>parseXtract'</font> <font color=Red>::</font> <font color=Red>[</font>Token<font color=Red>]</font> <font color=Red>-></font> Either String <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>+<a name="line-52"></a><font color=Blue>parseXtract'</font> <font color=Red>=</font> fst <font color=Cyan>.</font> runParser <font color=Cyan>(</font>aquery liftLocal<font color=Cyan>)</font>+<a name="line-53"></a>+<a name="line-54"></a><a name="XParser"></a><font color=Blue>---- Auxiliary Parsing Functions ----</font>+<a name="line-55"></a><a name="XParser"></a><font color=Green><u>type</u></font> XParser a <font color=Red>=</font> Parser <font color=Cyan>(</font>Either String <font color=Cyan>(</font>Posn<font color=Cyan>,</font>TokenT<font color=Cyan>)</font><font color=Cyan>)</font> a+<a name="line-56"></a>+<a name="line-57"></a><a name="string"></a><font color=Blue>string</font> <font color=Red>::</font> XParser String+<a name="line-58"></a><font color=Blue>string</font> <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-></font> <font color=Green><u>case</u></font> inp <font color=Green><u>of</u></font>+<a name="line-59"></a> <font color=Cyan>(</font>Left err<font color=Red><b>:</b></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False<font color=Cyan>,</font>err<font color=Cyan>)</font><font color=Cyan>,</font> inp<font color=Cyan>)</font>+<a name="line-60"></a> <font color=Cyan>(</font>Right <font color=Cyan>(</font>p<font color=Cyan>,</font>TokString n<font color=Cyan>)</font><font color=Red><b>:</b></font>ts<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Right n<font color=Cyan>,</font> ts<font color=Cyan>)</font>+<a name="line-61"></a> ts <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False<font color=Cyan>,</font><font color=Magenta>"expected a string"</font><font color=Cyan>)</font><font color=Cyan>,</font> ts<font color=Cyan>)</font> <font color=Cyan>)</font>+<a name="line-62"></a><a name="number"></a><font color=Blue>number</font> <font color=Red>::</font> XParser Integer+<a name="line-63"></a><font color=Blue>number</font> <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-></font> <font color=Green><u>case</u></font> inp <font color=Green><u>of</u></font>+<a name="line-64"></a> <font color=Cyan>(</font>Left err<font color=Red><b>:</b></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False<font color=Cyan>,</font>err<font color=Cyan>)</font><font color=Cyan>,</font> inp<font color=Cyan>)</font>+<a name="line-65"></a> <font color=Cyan>(</font>Right <font color=Cyan>(</font>p<font color=Cyan>,</font>TokNum n<font color=Cyan>)</font><font color=Red><b>:</b></font>ts<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Right n<font color=Cyan>,</font> ts<font color=Cyan>)</font>+<a name="line-66"></a> ts <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False<font color=Cyan>,</font><font color=Magenta>"expected a number"</font><font color=Cyan>)</font><font color=Cyan>,</font> ts<font color=Cyan>)</font> <font color=Cyan>)</font>+<a name="line-67"></a><a name="symbol"></a><font color=Blue>symbol</font> <font color=Red>::</font> String <font color=Red>-></font> XParser ()+<a name="line-68"></a><font color=Blue>symbol</font> s <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-></font> <font color=Green><u>case</u></font> inp <font color=Green><u>of</u></font>+<a name="line-69"></a> <font color=Cyan>(</font>Left err<font color=Red><b>:</b></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False<font color=Cyan>,</font>err<font color=Cyan>)</font><font color=Cyan>,</font> inp<font color=Cyan>)</font>+<a name="line-70"></a> <font color=Cyan>(</font>Right <font color=Cyan>(</font>p<font color=Cyan>,</font> Symbol n<font color=Cyan>)</font><font color=Red><b>:</b></font>ts<font color=Cyan>)</font> <font color=Red>|</font> n<font color=Cyan>==</font>s <font color=Red>-></font> <font color=Cyan>(</font>Right ()<font color=Cyan>,</font> ts<font color=Cyan>)</font>+<a name="line-71"></a> ts <font color=Red>-></font> <font color=Cyan>(</font>Left <font color=Cyan>(</font>False<font color=Cyan>,</font><font color=Magenta>"expected symbol "</font><font color=Cyan>++</font>s<font color=Cyan>)</font><font color=Cyan>,</font> ts<font color=Cyan>)</font> <font color=Cyan>)</font>+<a name="line-72"></a>+<a name="line-73"></a><a name="quote"></a><font color=Blue>quote</font> <font color=Red>=</font> oneOf <font color=Red>[</font> symbol <font color=Magenta>"'"</font><font color=Cyan>,</font> symbol <font color=Magenta>"\""</font> <font color=Red>]</font>+<a name="line-74"></a>+<a name="line-75"></a><a name="pam"></a><font color=Blue>pam</font> fs x <font color=Red>=</font> <font color=Red>[</font> f x <font color=Red>|</font> f <font color=Red><-</font> fs <font color=Red>]</font>+<a name="line-76"></a>+<a name="line-77"></a>+<a name="line-78"></a><font color=Blue>{--- original Xtract grammar ----+<a name="line-79"></a> query = string tagname+<a name="line-80"></a> | string * tagname prefix+<a name="line-81"></a> | * string tagname suffix+<a name="line-82"></a> | * any element+<a name="line-83"></a> | - chardata+<a name="line-84"></a> | ( query )+<a name="line-85"></a> | query / query parent/child relationship+<a name="line-86"></a> | query // query deep inside+<a name="line-87"></a> | query + query union of queries+<a name="line-88"></a> | query [predicate]+<a name="line-89"></a> | query [positions]+<a name="line-90"></a>+<a name="line-91"></a> predicate = quattr has attribute+<a name="line-92"></a> | quattr op ' string ' attribute has value+<a name="line-93"></a> | quattr op " string " attribute has value+<a name="line-94"></a> | quattr op quattr attribute value comparison (lexical)+<a name="line-95"></a> | quattr nop integer attribute has value (numerical)+<a name="line-96"></a> | quattr nop quattr attribute value comparison (numerical)+<a name="line-97"></a> | ( predicate ) bracketting+<a name="line-98"></a> | predicate & predicate logical and+<a name="line-99"></a> | predicate | predicate logical or+<a name="line-100"></a> | ~ predicate logical not+<a name="line-101"></a>+<a name="line-102"></a> attribute = @ string has attribute+<a name="line-103"></a> | query / @ string child has attribute+<a name="line-104"></a> | - has textual content+<a name="line-105"></a> | query / - child has textual content+<a name="line-106"></a>+<a name="line-107"></a> quattr = query+<a name="line-108"></a> | attribute+<a name="line-109"></a>+<a name="line-110"></a> op = = equal to+<a name="line-111"></a> | != not equal to+<a name="line-112"></a> | < less than+<a name="line-113"></a> | <= less than or equal to+<a name="line-114"></a> | > greater than+<a name="line-115"></a> | >= greater than or equal to+<a name="line-116"></a>+<a name="line-117"></a> nop = .=. equal to+<a name="line-118"></a> | .!=. not equal to+<a name="line-119"></a> | .<. less than+<a name="line-120"></a> | .<=. less than or equal to+<a name="line-121"></a> | .>. greater than+<a name="line-122"></a> | .>=. greater than or equal to+<a name="line-123"></a>+<a name="line-124"></a> positions = position {, positions} multiple positions+<a name="line-125"></a> | position - position ranges+<a name="line-126"></a>+<a name="line-127"></a> position = integer numbering is from 0 upwards+<a name="line-128"></a> | $ last+<a name="line-129"></a>+<a name="line-130"></a>+<a name="line-131"></a>---- transformed grammar (removing left recursion)+<a name="line-132"></a> aquery = ./ tquery -- current context+<a name="line-133"></a> | tquery -- also current context+<a name="line-134"></a> | / tquery -- root context+<a name="line-135"></a> | // tquery -- deep context from root+<a name="line-136"></a>+<a name="line-137"></a> tquery = ( tquery ) xquery+<a name="line-138"></a> | tag xquery+<a name="line-139"></a> | - -- fixes original grammar ("-/*" is incorrect)+<a name="line-140"></a> +<a name="line-141"></a> tag = string *+<a name="line-142"></a> | string+<a name="line-143"></a> | * string+<a name="line-144"></a> | *+<a name="line-145"></a> +<a name="line-146"></a> xquery = / tquery+<a name="line-147"></a> | // tquery+<a name="line-148"></a> | / @ string -- new: print attribute value+<a name="line-149"></a> | + tquery+<a name="line-150"></a> | [ tpredicate ] xquery+<a name="line-151"></a> | [ positions ] xquery+<a name="line-152"></a> | lambda+<a name="line-153"></a>+<a name="line-154"></a> tpredicate = vpredicate upredicate+<a name="line-155"></a> upredicate = & tpredicate+<a name="line-156"></a> | | tpredicate+<a name="line-157"></a> | lambda+<a name="line-158"></a> vpredicate = ( tpredicate )+<a name="line-159"></a> | ~ tpredicate+<a name="line-160"></a> | tattribute+<a name="line-161"></a>+<a name="line-162"></a> tattribute = aquery uattribute+<a name="line-163"></a> | @ string vattribute+<a name="line-164"></a> uattribute = / @ string vattribute+<a name="line-165"></a> | vattribute+<a name="line-166"></a> vattribute = op wattribute+<a name="line-167"></a> | op ' string '+<a name="line-168"></a> | nop wattribute+<a name="line-169"></a> | nop integer+<a name="line-170"></a> | lambda+<a name="line-171"></a> wattribute = @ string+<a name="line-172"></a> | aquery / @ string+<a name="line-173"></a> | aquery+<a name="line-174"></a>+<a name="line-175"></a> positions = simplepos commapos+<a name="line-176"></a> simplepos = integer range+<a name="line-177"></a> | $+<a name="line-178"></a> range = - integer+<a name="line-179"></a> | - $+<a name="line-180"></a> | lambda+<a name="line-181"></a> commapos = , simplepos commapos+<a name="line-182"></a> | lambda+<a name="line-183"></a>+<a name="line-184"></a> op = =+<a name="line-185"></a> | !=+<a name="line-186"></a> | <+<a name="line-187"></a> | <=+<a name="line-188"></a> | >+<a name="line-189"></a> | >=+<a name="line-190"></a>+<a name="line-191"></a> nop = .=.+<a name="line-192"></a> | .!=.+<a name="line-193"></a> | .<.+<a name="line-194"></a> | .<=.+<a name="line-195"></a> | .>.+<a name="line-196"></a> | .>=.+<a name="line-197"></a>-}</font>+<a name="line-198"></a>+<a name="line-199"></a><a name="bracket"></a><font color=Blue>bracket</font> <font color=Red>::</font> XParser a <font color=Red>-></font> XParser a+<a name="line-200"></a><font color=Blue>bracket</font> p <font color=Red>=</font>+<a name="line-201"></a> <font color=Green><u>do</u></font> symbol <font color=Magenta>"("</font>+<a name="line-202"></a> x <font color=Red><-</font> p+<a name="line-203"></a> symbol <font color=Magenta>")"</font>+<a name="line-204"></a> return x+<a name="line-205"></a>+<a name="line-206"></a>+<a name="line-207"></a><font color=Blue>---- Xtract parsers ----</font>+<a name="line-208"></a>+<a name="line-209"></a><a name="aquery"></a><font color=Blue>-- aquery chooses to search from the root, or only in local context</font>+<a name="line-210"></a><font color=Blue>aquery</font> <font color=Red>::</font> <font color=Cyan>(</font><font color=Cyan>(</font>CFilter i<font color=Red>-></font>CFilter i<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font>DFilter i<font color=Red>-></font>DFilter i<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-211"></a> <font color=Red>-></font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>+<a name="line-212"></a><font color=Blue>aquery</font> lift <font color=Red>=</font> oneOf+<a name="line-213"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"//"</font>+<a name="line-214"></a> tquery <font color=Red>[</font>lift C<font color=Cyan>.</font>multi<font color=Red>]</font>+<a name="line-215"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"/"</font>+<a name="line-216"></a> tquery <font color=Red>[</font>lift id<font color=Red>]</font>+<a name="line-217"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"./"</font>+<a name="line-218"></a> tquery <font color=Red>[</font><font color=Cyan>(</font>local C<font color=Cyan>.</font>keep D<font color=Cyan>./></font><font color=Cyan>)</font><font color=Red>]</font>+<a name="line-219"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> tquery <font color=Red>[</font><font color=Cyan>(</font>local C<font color=Cyan>.</font>keep D<font color=Cyan>./></font><font color=Cyan>)</font><font color=Red>]</font>+<a name="line-220"></a> <font color=Red>]</font>+<a name="line-221"></a>+<a name="line-222"></a><a name="tquery"></a><font color=Blue>tquery</font> <font color=Red>::</font> <font color=Red>[</font>DFilter i<font color=Red>-></font>DFilter i<font color=Red>]</font> <font color=Red>-></font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>+<a name="line-223"></a><font color=Blue>tquery</font> [] <font color=Red>=</font> tquery <font color=Red>[</font>id<font color=Red>]</font>+<a name="line-224"></a><font color=Blue>tquery</font> <font color=Cyan>(</font>qf<font color=Red><b>:</b></font>cxt<font color=Cyan>)</font> <font color=Red>=</font> oneOf+<a name="line-225"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> q <font color=Red><-</font> bracket <font color=Cyan>(</font>tquery <font color=Cyan>(</font>qf<font color=Red><b>:</b></font>qf<font color=Red><b>:</b></font>cxt<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-226"></a> xquery cxt q+<a name="line-227"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> q <font color=Red><-</font> xtag+<a name="line-228"></a> xquery cxt <font color=Cyan>(</font>qf <font color=Cyan>(</font><font color=Cyan>(</font>unescape <font color=Cyan>.</font><font color=Cyan>)</font><font color=Cyan>.</font>q<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Blue>-- glue inners texts together</font>+<a name="line-229"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"-"</font>+<a name="line-230"></a> return <font color=Cyan>(</font>qf <font color=Cyan>(</font>local C<font color=Cyan>.</font>txt<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-231"></a> <font color=Red>]</font>+<a name="line-232"></a>+<a name="line-233"></a><a name="xtag"></a><font color=Blue>xtag</font> <font color=Red>::</font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>+<a name="line-234"></a><font color=Blue>xtag</font> <font color=Red>=</font> oneOf+<a name="line-235"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> s <font color=Red><-</font> string+<a name="line-236"></a> symbol <font color=Magenta>"*"</font>+<a name="line-237"></a> return <font color=Cyan>(</font>local <font color=Cyan>(</font>C<font color=Cyan>.</font>tagWith <font color=Cyan>(</font>s <font color=Cyan>`isPrefixOf`</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-238"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> s <font color=Red><-</font> string+<a name="line-239"></a> return <font color=Cyan>(</font>local <font color=Cyan>(</font>C<font color=Cyan>.</font>tag s<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-240"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"*"</font>+<a name="line-241"></a> s <font color=Red><-</font> string+<a name="line-242"></a> return <font color=Cyan>(</font>local <font color=Cyan>(</font>C<font color=Cyan>.</font>tagWith <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>(</font>reverse s<font color=Cyan>)</font> <font color=Cyan>`isPrefixOf`</font><font color=Cyan>)</font> <font color=Cyan>.</font> reverse<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-243"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"*"</font>+<a name="line-244"></a> return <font color=Cyan>(</font>local C<font color=Cyan>.</font>elm<font color=Cyan>)</font>+<a name="line-245"></a> <font color=Red>]</font>+<a name="line-246"></a>+<a name="line-247"></a>+<a name="line-248"></a><a name="xquery"></a><font color=Blue>xquery</font> <font color=Red>::</font> <font color=Red>[</font>DFilter i<font color=Red>-></font>DFilter i<font color=Red>]</font> <font color=Red>-></font> DFilter i <font color=Red>-></font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>+<a name="line-249"></a><font color=Blue>xquery</font> cxt q1 <font color=Red>=</font> oneOf+<a name="line-250"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"/"</font>+<a name="line-251"></a> <font color=Cyan>(</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"@"</font>+<a name="line-252"></a> attr <font color=Red><-</font> string+<a name="line-253"></a> return <font color=Cyan>(</font>D<font color=Cyan>.</font>iffind attr <font color=Cyan>(</font><font color=Red>\</font>s<font color=Red>-></font>local <font color=Cyan>(</font>C<font color=Cyan>.</font>literal s<font color=Cyan>)</font><font color=Cyan>)</font> D<font color=Cyan>.</font>none <font color=Cyan>`</font>D<font color=Cyan>.</font>o<font color=Cyan>`</font> q1<font color=Cyan>)</font>+<a name="line-254"></a> <font color=Cyan>`onFail`</font>+<a name="line-255"></a> tquery <font color=Cyan>(</font><font color=Cyan>(</font>q1 D<font color=Cyan>./></font><font color=Cyan>)</font><font color=Red><b>:</b></font>cxt<font color=Cyan>)</font> <font color=Cyan>)</font>+<a name="line-256"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"//"</font>+<a name="line-257"></a> tquery <font color=Cyan>(</font><font color=Cyan>(</font><font color=Red>\</font>q2<font color=Red>-></font> <font color=Cyan>(</font>liftLocal C<font color=Cyan>.</font>multi<font color=Cyan>)</font> q2+<a name="line-258"></a> <font color=Cyan>`</font>D<font color=Cyan>.</font>o<font color=Cyan>`</font> local C<font color=Cyan>.</font>children <font color=Cyan>`</font>D<font color=Cyan>.</font>o<font color=Cyan>`</font> q1<font color=Cyan>)</font><font color=Red><b>:</b></font>cxt<font color=Cyan>)</font>+<a name="line-259"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"+"</font>+<a name="line-260"></a> q2 <font color=Red><-</font> tquery cxt+<a name="line-261"></a> return <font color=Cyan>(</font>D<font color=Cyan>.</font>cat <font color=Red>[</font>q1<font color=Cyan>,</font>q2<font color=Red>]</font><font color=Cyan>)</font>+<a name="line-262"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"["</font>+<a name="line-263"></a> is <font color=Red><-</font> iindex <font color=Blue>-- now extended to multiple indexes</font>+<a name="line-264"></a> symbol <font color=Magenta>"]"</font>+<a name="line-265"></a> xquery cxt <font color=Cyan>(</font><font color=Red>\</font>xml<font color=Red>-></font> concat <font color=Cyan>.</font> pam is <font color=Cyan>.</font> q1 xml<font color=Cyan>)</font>+<a name="line-266"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"["</font>+<a name="line-267"></a> p <font color=Red><-</font> tpredicate+<a name="line-268"></a> symbol <font color=Magenta>"]"</font>+<a name="line-269"></a> xquery cxt <font color=Cyan>(</font>q1 <font color=Cyan>`</font>D<font color=Cyan>.</font>with<font color=Cyan>`</font> p<font color=Cyan>)</font>+<a name="line-270"></a> <font color=Cyan>,</font> return q1+<a name="line-271"></a> <font color=Red>]</font>+<a name="line-272"></a>+<a name="line-273"></a><a name="tpredicate"></a><font color=Blue>tpredicate</font> <font color=Red>::</font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>+<a name="line-274"></a><font color=Blue>tpredicate</font> <font color=Red>=</font>+<a name="line-275"></a> <font color=Green><u>do</u></font> p <font color=Red><-</font> vpredicate+<a name="line-276"></a> f <font color=Red><-</font> upredicate+<a name="line-277"></a> return <font color=Cyan>(</font>f p<font color=Cyan>)</font>+<a name="line-278"></a>+<a name="line-279"></a><a name="upredicate"></a><font color=Blue>upredicate</font> <font color=Red>::</font> XParser <font color=Cyan>(</font>DFilter i<font color=Red>-></font>DFilter i<font color=Cyan>)</font>+<a name="line-280"></a><font color=Blue>upredicate</font> <font color=Red>=</font> oneOf+<a name="line-281"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"&"</font>+<a name="line-282"></a> p2 <font color=Red><-</font> tpredicate+<a name="line-283"></a> return <font color=Cyan>(</font><font color=Cyan>`</font>D<font color=Cyan>.</font>o<font color=Cyan>`</font> p2<font color=Cyan>)</font>+<a name="line-284"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"|"</font>+<a name="line-285"></a> p2 <font color=Red><-</font> tpredicate+<a name="line-286"></a> return <font color=Cyan>(</font>D<font color=Cyan>.|>|</font> p2<font color=Cyan>)</font>+<a name="line-287"></a> <font color=Cyan>,</font> return id+<a name="line-288"></a> <font color=Red>]</font>+<a name="line-289"></a>+<a name="line-290"></a><a name="vpredicate"></a><font color=Blue>vpredicate</font> <font color=Red>::</font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>+<a name="line-291"></a><font color=Blue>vpredicate</font> <font color=Red>=</font> oneOf+<a name="line-292"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> bracket tpredicate+<a name="line-293"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"~"</font>+<a name="line-294"></a> p <font color=Red><-</font> tpredicate+<a name="line-295"></a> return <font color=Cyan>(</font>local C<font color=Cyan>.</font>keep <font color=Cyan>`</font>D<font color=Cyan>.</font>without<font color=Cyan>`</font> p<font color=Cyan>)</font>+<a name="line-296"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> tattribute+<a name="line-297"></a> <font color=Red>]</font>+<a name="line-298"></a>+<a name="line-299"></a><a name="tattribute"></a><font color=Blue>tattribute</font> <font color=Red>::</font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>+<a name="line-300"></a><font color=Blue>tattribute</font> <font color=Red>=</font> oneOf+<a name="line-301"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> q <font color=Red><-</font> aquery liftGlobal+<a name="line-302"></a> uattribute q+<a name="line-303"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"@"</font>+<a name="line-304"></a> s <font color=Red><-</font> string+<a name="line-305"></a> vattribute <font color=Cyan>(</font>local C<font color=Cyan>.</font>keep<font color=Cyan>,</font> local <font color=Cyan>(</font>C<font color=Cyan>.</font>attr s<font color=Cyan>)</font><font color=Cyan>,</font> D<font color=Cyan>.</font>iffind s<font color=Cyan>)</font>+<a name="line-306"></a> <font color=Red>]</font>+<a name="line-307"></a>+<a name="line-308"></a><a name="uattribute"></a><font color=Blue>uattribute</font> <font color=Red>::</font> DFilter i <font color=Red>-></font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>+<a name="line-309"></a><font color=Blue>uattribute</font> q <font color=Red>=</font> oneOf+<a name="line-310"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"/"</font>+<a name="line-311"></a> symbol <font color=Magenta>"@"</font>+<a name="line-312"></a> s <font color=Red><-</font> string+<a name="line-313"></a> vattribute <font color=Cyan>(</font>q<font color=Cyan>,</font> local <font color=Cyan>(</font>C<font color=Cyan>.</font>attr s<font color=Cyan>)</font><font color=Cyan>,</font> D<font color=Cyan>.</font>iffind s<font color=Cyan>)</font>+<a name="line-314"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> vattribute <font color=Cyan>(</font>q<font color=Cyan>,</font> local C<font color=Cyan>.</font>keep<font color=Cyan>,</font> D<font color=Cyan>.</font>ifTxt<font color=Cyan>)</font>+<a name="line-315"></a> <font color=Red>]</font>+<a name="line-316"></a>+<a name="line-317"></a><a name="vattribute"></a><font color=Blue>vattribute</font> <font color=Red>::</font> <font color=Cyan>(</font>DFilter i<font color=Cyan>,</font> DFilter i<font color=Cyan>,</font> <font color=Cyan>(</font>String<font color=Red>-></font>DFilter i<font color=Cyan>)</font><font color=Red>-></font>DFilter i<font color=Red>-></font>DFilter i<font color=Cyan>)</font>+<a name="line-318"></a> <font color=Red>-></font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>)</font>+<a name="line-319"></a><font color=Blue>vattribute</font> <font color=Cyan>(</font>q<font color=Cyan>,</font>a<font color=Cyan>,</font>iffn<font color=Cyan>)</font> <font color=Red>=</font> oneOf+<a name="line-320"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> cmp <font color=Red><-</font> op+<a name="line-321"></a> quote+<a name="line-322"></a> s2 <font color=Red><-</font> string+<a name="line-323"></a> quote+<a name="line-324"></a> return <font color=Cyan>(</font><font color=Cyan>(</font>iffn <font color=Cyan>(</font><font color=Red>\</font>s1<font color=Red>-></font><font color=Green><u>if</u></font> cmp s1 s2 <font color=Green><u>then</u></font> D<font color=Cyan>.</font>keep <font color=Green><u>else</u></font> D<font color=Cyan>.</font>none<font color=Cyan>)</font> D<font color=Cyan>.</font>none<font color=Cyan>)</font>+<a name="line-325"></a> <font color=Cyan>`</font>D<font color=Cyan>.</font>o<font color=Cyan>`</font> q<font color=Cyan>)</font>+<a name="line-326"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> cmp <font color=Red><-</font> op+<a name="line-327"></a> <font color=Cyan>(</font>q2<font color=Cyan>,</font>iffn2<font color=Cyan>)</font> <font color=Red><-</font> wattribute+<a name="line-328"></a> return <font color=Cyan>(</font><font color=Cyan>(</font>iffn <font color=Cyan>(</font><font color=Red>\</font>s1<font color=Red>-></font> iffn2 <font color=Cyan>(</font><font color=Red>\</font>s2<font color=Red>-></font> <font color=Green><u>if</u></font> cmp s1 s2 <font color=Green><u>then</u></font> D<font color=Cyan>.</font>keep <font color=Green><u>else</u></font> D<font color=Cyan>.</font>none<font color=Cyan>)</font>+<a name="line-329"></a> D<font color=Cyan>.</font>none<font color=Cyan>)</font>+<a name="line-330"></a> D<font color=Cyan>.</font>none<font color=Cyan>)</font> <font color=Cyan>`</font>D<font color=Cyan>.</font>o<font color=Cyan>`</font> q<font color=Cyan>)</font>+<a name="line-331"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> cmp <font color=Red><-</font> nop+<a name="line-332"></a> n <font color=Red><-</font> number+<a name="line-333"></a> return <font color=Cyan>(</font><font color=Cyan>(</font>iffn <font color=Cyan>(</font><font color=Red>\</font>s<font color=Red>-></font><font color=Green><u>if</u></font> cmp <font color=Cyan>(</font>read s<font color=Cyan>)</font> n <font color=Green><u>then</u></font> D<font color=Cyan>.</font>keep <font color=Green><u>else</u></font> D<font color=Cyan>.</font>none<font color=Cyan>)</font> D<font color=Cyan>.</font>none<font color=Cyan>)</font>+<a name="line-334"></a> <font color=Cyan>`</font>D<font color=Cyan>.</font>o<font color=Cyan>`</font> q<font color=Cyan>)</font>+<a name="line-335"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> cmp <font color=Red><-</font> nop+<a name="line-336"></a> <font color=Cyan>(</font>q2<font color=Cyan>,</font>iffn2<font color=Cyan>)</font> <font color=Red><-</font> wattribute+<a name="line-337"></a> return <font color=Cyan>(</font><font color=Cyan>(</font>iffn <font color=Cyan>(</font><font color=Red>\</font>s1<font color=Red>-></font> iffn2 <font color=Cyan>(</font><font color=Red>\</font>s2<font color=Red>-></font> <font color=Green><u>if</u></font> cmp <font color=Cyan>(</font>read s1<font color=Cyan>)</font> <font color=Cyan>(</font>read s2<font color=Cyan>)</font> <font color=Green><u>then</u></font> D<font color=Cyan>.</font>keep+<a name="line-338"></a> <font color=Green><u>else</u></font> D<font color=Cyan>.</font>none<font color=Cyan>)</font>+<a name="line-339"></a> D<font color=Cyan>.</font>none<font color=Cyan>)</font>+<a name="line-340"></a> D<font color=Cyan>.</font>none<font color=Cyan>)</font> <font color=Cyan>`</font>D<font color=Cyan>.</font>o<font color=Cyan>`</font> q<font color=Cyan>)</font>+<a name="line-341"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> return <font color=Cyan>(</font><font color=Cyan>(</font>a <font color=Cyan>`</font>D<font color=Cyan>.</font>o<font color=Cyan>`</font> q<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-342"></a> <font color=Red>]</font>+<a name="line-343"></a>+<a name="line-344"></a><a name="wattribute"></a><font color=Blue>wattribute</font> <font color=Red>::</font> XParser <font color=Cyan>(</font>DFilter i<font color=Cyan>,</font> <font color=Cyan>(</font>String<font color=Red>-></font>DFilter i<font color=Cyan>)</font><font color=Red>-></font>DFilter i<font color=Red>-></font>DFilter i<font color=Cyan>)</font>+<a name="line-345"></a><font color=Blue>wattribute</font> <font color=Red>=</font> oneOf+<a name="line-346"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"@"</font>+<a name="line-347"></a> s <font color=Red><-</font> string+<a name="line-348"></a> return <font color=Cyan>(</font>D<font color=Cyan>.</font>keep<font color=Cyan>,</font> D<font color=Cyan>.</font>iffind s<font color=Cyan>)</font>+<a name="line-349"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> q <font color=Red><-</font> aquery liftGlobal+<a name="line-350"></a> symbol <font color=Magenta>"/"</font>+<a name="line-351"></a> symbol <font color=Magenta>"@"</font>+<a name="line-352"></a> s <font color=Red><-</font> string+<a name="line-353"></a> return <font color=Cyan>(</font>q<font color=Cyan>,</font> D<font color=Cyan>.</font>iffind s<font color=Cyan>)</font>+<a name="line-354"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> q <font color=Red><-</font> aquery liftGlobal+<a name="line-355"></a> return <font color=Cyan>(</font>q<font color=Cyan>,</font> D<font color=Cyan>.</font>ifTxt<font color=Cyan>)</font>+<a name="line-356"></a> <font color=Red>]</font>+<a name="line-357"></a>+<a name="line-358"></a>+<a name="line-359"></a><a name="iindex"></a><font color=Blue>iindex</font> <font color=Red>::</font> XParser <font color=Red>[</font><font color=Red>[</font>a<font color=Red>]</font><font color=Red>-></font><font color=Red>[</font>a<font color=Red>]</font><font color=Red>]</font>+<a name="line-360"></a><font color=Blue>iindex</font> <font color=Red>=</font>+<a name="line-361"></a> <font color=Green><u>do</u></font> i <font color=Red><-</font> simpleindex+<a name="line-362"></a> is <font color=Red><-</font> idxcomma+<a name="line-363"></a> return <font color=Cyan>(</font>i<font color=Red><b>:</b></font>is<font color=Cyan>)</font>+<a name="line-364"></a>+<a name="line-365"></a><a name="simpleindex"></a><font color=Blue>simpleindex</font> <font color=Red>::</font> XParser <font color=Cyan>(</font><font color=Red>[</font>a<font color=Red>]</font><font color=Red>-></font><font color=Red>[</font>a<font color=Red>]</font><font color=Cyan>)</font>+<a name="line-366"></a><font color=Blue>simpleindex</font> <font color=Red>=</font> oneOf+<a name="line-367"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> n <font color=Red><-</font> number+<a name="line-368"></a> r <font color=Red><-</font> rrange n+<a name="line-369"></a> return r+<a name="line-370"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"$"</font>+<a name="line-371"></a> return <font color=Cyan>(</font>C<font color=Cyan>.</font>keep <font color=Cyan>.</font> last<font color=Cyan>)</font>+<a name="line-372"></a> <font color=Red>]</font>+<a name="line-373"></a>+<a name="line-374"></a><a name="rrange"></a><font color=Blue>rrange</font><font color=Cyan>,</font> numberdollar <font color=Red>::</font> Integer <font color=Red>-></font> XParser <font color=Cyan>(</font><font color=Red>[</font>a<font color=Red>]</font><font color=Red>-></font><font color=Red>[</font>a<font color=Red>]</font><font color=Cyan>)</font>+<a name="line-375"></a><font color=Blue>rrange</font> n1 <font color=Red>=</font> oneOf+<a name="line-376"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"-"</font>+<a name="line-377"></a> numberdollar n1+<a name="line-378"></a> <font color=Cyan>,</font> return <font color=Cyan>(</font>C<font color=Cyan>.</font>keep<font color=Cyan>.</font><font color=Cyan>(</font><font color=Cyan>!!</font><font color=Cyan>(</font>fromInteger n1<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-379"></a> <font color=Red>]</font>+<a name="line-380"></a>+<a name="line-381"></a><a name="numberdollar"></a><font color=Blue>numberdollar</font> n1 <font color=Red>=</font> oneOf+<a name="line-382"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> n2 <font color=Red><-</font> number+<a name="line-383"></a> return <font color=Cyan>(</font>take <font color=Cyan>(</font>fromInteger <font color=Cyan>(</font><font color=Magenta>1</font><font color=Cyan>+</font>n2<font color=Blue>-</font>n1<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>.</font> drop <font color=Cyan>(</font>fromInteger n1<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-384"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"$"</font>+<a name="line-385"></a> return <font color=Cyan>(</font>drop <font color=Cyan>(</font>fromInteger n1<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-386"></a> <font color=Red>]</font>+<a name="line-387"></a>+<a name="line-388"></a><a name="idxcomma"></a><font color=Blue>idxcomma</font> <font color=Red>::</font> XParser <font color=Red>[</font><font color=Red>[</font>a<font color=Red>]</font><font color=Red>-></font><font color=Red>[</font>a<font color=Red>]</font><font color=Red>]</font>+<a name="line-389"></a><font color=Blue>idxcomma</font> <font color=Red>=</font> oneOf+<a name="line-390"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>","</font>+<a name="line-391"></a> r <font color=Red><-</font> simpleindex+<a name="line-392"></a> rs <font color=Red><-</font> idxcomma+<a name="line-393"></a> return <font color=Cyan>(</font>r<font color=Red><b>:</b></font>rs<font color=Cyan>)</font>+<a name="line-394"></a> <font color=Cyan>,</font> return []+<a name="line-395"></a> <font color=Red>]</font>+<a name="line-396"></a>+<a name="line-397"></a>+<a name="line-398"></a><a name="op"></a><font color=Blue>op</font> <font color=Red>::</font> XParser <font color=Cyan>(</font>String<font color=Red>-></font>String<font color=Red>-></font>Bool<font color=Cyan>)</font>+<a name="line-399"></a><font color=Blue>op</font> <font color=Red>=</font> oneOf+<a name="line-400"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"="</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan>==</font><font color=Cyan>)</font>+<a name="line-401"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"!="</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan>/=</font><font color=Cyan>)</font>+<a name="line-402"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"<"</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan><</font><font color=Cyan>)</font>+<a name="line-403"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>"<="</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan><=</font><font color=Cyan>)</font>+<a name="line-404"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>">"</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan>></font><font color=Cyan>)</font>+<a name="line-405"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>">="</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan>>=</font><font color=Cyan>)</font>+<a name="line-406"></a> <font color=Red>]</font>+<a name="line-407"></a>+<a name="line-408"></a><a name="nop"></a><font color=Blue>nop</font> <font color=Red>::</font> XParser <font color=Cyan>(</font>Integer<font color=Red>-></font>Integer<font color=Red>-></font>Bool<font color=Cyan>)</font>+<a name="line-409"></a><font color=Blue>nop</font> <font color=Red>=</font> oneOf+<a name="line-410"></a> <font color=Red>[</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>".=."</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan>==</font><font color=Cyan>)</font>+<a name="line-411"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>".!=."</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan>/=</font><font color=Cyan>)</font>+<a name="line-412"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>".<."</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan><</font><font color=Cyan>)</font>+<a name="line-413"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>".<=."</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan><=</font><font color=Cyan>)</font>+<a name="line-414"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>".>."</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan>></font><font color=Cyan>)</font>+<a name="line-415"></a> <font color=Cyan>,</font> <font color=Green><u>do</u></font> symbol <font color=Magenta>".>=."</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan>>=</font><font color=Cyan>)</font>+<a name="line-416"></a> <font color=Red>]</font>+<a name="line-417"></a> </pre>+</body> </html>
docs/changelog.html view
@@ -23,6 +23,10 @@ <li> Version 1.19.4 fixes an incompatibility with some versions of the Bytestring package. Also has a bugfix in the DTD validator, and adds some new utility functions in Text.XML.HaXml.Util.+<li> Version 1.19.5 adds XmlContent instances for larger (up to 15-) tuples.+ It also fixes a couple of bugs in DtdToHaskell, when dealing with+ larger datatypes (more than 26 components) and duplicate ATTLIST+ specifications. </ul> <h3>Changes in 1.18</h3>
docs/index.html view
@@ -132,11 +132,11 @@ <center><h3><a name="download">Downloads</a></h3></center> <p> <b>Development versions:</b><br>-HaXml-1.19.4, release date 2008.06.17<br>+HaXml-1.19.5, release date 2009.02.02<br> From <a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/HaXml">Hackage</a><br> By HTTP:-<a href="http://www.cs.york.ac.uk/fp/HaXml-devel/HaXml-1.19.4.tar.gz">.tar.gz</a>,-<a href="http://www.cs.york.ac.uk/fp/HaXml-devel/HaXml-1.19.4.zip">.zip</a>.+<a href="http://www.cs.york.ac.uk/fp/HaXml-devel/HaXml-1.19.5.tar.gz">.tar.gz</a>,+<a href="http://www.cs.york.ac.uk/fp/HaXml-devel/HaXml-1.19.5.zip">.zip</a>. <br> By FTP: <a href="ftp://ftp.cs.york.ac.uk/pub/haskell/HaXml/">@@ -203,6 +203,8 @@ <center><h3><a name="news">Recent news</a></h3></center> <p>+Version 1.19.5 has some bugfixes to DtdToHaskell, to cope with especially+large datatypes.<br> Version 1.19.4 has some minor bugfixes to increase compatibility with the ByteString package.<br> Version 1.19.2 updates the Cabal file to enable HaXml to build with both
src/Makefile view
@@ -1,5 +1,5 @@ SOFTWARE = HaXml-VERSION = 1.19.4+VERSION = 1.19.5 LIBSRCS = \ Text/XML/HaXml.hs Text/XML/HaXml/Combinators.hs Text/XML/HaXml/Lex.hs \
src/Text/XML/HaXml/DtdToHaskell/Convert.hs view
@@ -5,7 +5,7 @@ ( dtd2TypeDef ) where -import List (intersperse)+import List (intersperse,nub) import Text.XML.HaXml.Types hiding (Name) import Text.XML.HaXml.DtdToHaskell.TypeDef@@ -34,7 +34,7 @@ (AttList (AttListDecl n as)) -> case lookup n db of Nothing -> database ((n, R as EMPTY):db) ms- (Just (R a cs)) -> database (replace n (R (a++as) cs) db) ms+ (Just (R a cs)) -> database (replace n (R (nub (a++as)) cs) db) ms -- (MarkupPE _ m') -> database db (m':ms) _ -> database db ms
src/Text/XML/HaXml/DtdToHaskell/Instance.hs view
@@ -272,7 +272,9 @@ mkCpat n i vs = ppHName n <+> i <+> fsep vs nameSupply :: [b] -> [Doc]-nameSupply ss = take (length ss) (map char ['a'..])+nameSupply ss = take (length ss) (map char ['a'..'z']+ ++ map text [ a:n:[] | n <- ['0'..'9']+ , a <- ['a'..'z'] ]) -- nameSupply2 ss = take (length ss) [ text ('c':v:[]) | v <- ['a'..]] mkTranslate :: [Name] -> Doc
src/Text/XML/HaXml/Lex.hs view
@@ -180,7 +180,7 @@ -- especially in error messages), and the second is the string content of -- the XML file. xmlLex :: String -> String -> [Token]-xmlLex filename = xmlAny [] (posInNewCxt ("file "++filename) Nothing)+xmlLex filename = xmlAny [] (posInNewCxt filename Nothing) -- | 'xmlReLex' is used when the parser expands a macro (PE reference). -- The expansion of the macro must be re-lexed as if for the first time.
src/Text/XML/HaXml/Parse.hs view
@@ -42,7 +42,9 @@ import Text.XML.HaXml.Lex import Text.ParserCombinators.Poly.NoLeak.State +import System.FilePath (combine, dropFileName) + #if ( defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 502 ) || \ ( defined(__NHC__) && __NHC__ > 114 ) || defined(__HUGS__) import System.IO.Unsafe (unsafePerformIO)@@ -151,6 +153,13 @@ ---- Auxiliary Parsing Functions ---- +-- | Parse a bracketed item, discarding the brackets AND NOT using adjustErrBad+myBracket :: PolyParse p => p bra -> p ket -> p a -> p a+myBracket open close p = do+ do { open `adjustErr` ("Missing opening bracket:\n\t"++)+ ; p `discard` (close `adjustErr` ("Missing closing bracket:\n\t"++))+ }+ -- | XParser is just a specialisation of the PolyState parser. type XParser a = Parser SymTabs (Posn,TokenT) a @@ -234,16 +243,18 @@ `debug` (" defn: "++flattenEV ev) peRef p Just (PEDefExternalID (PUBLIC _ (SystemLiteral f))) ->- do let val = unsafePerformIO (readFile f)- reparse (xmlReLex (posInNewCxt ("file "++f)+ do let f' = combine (dropFileName $ posnFilename pn) f+ val = unsafePerformIO (readFile f')+ reparse (xmlReLex (posInNewCxt f' (Just pn)) val)- `debug` (" reading from file "++f)+ `debug` (" reading from file "++f') peRef p Just (PEDefExternalID (SYSTEM (SystemLiteral f))) ->- do let val = unsafePerformIO (readFile f)- reparse (xmlReLex (posInNewCxt ("file "++f)+ do let f' = combine (dropFileName $ posnFilename pn) f+ val = unsafePerformIO (readFile f')+ reparse (xmlReLex (posInNewCxt f' (Just pn)) val)- `debug` (" reading from file "++f)+ `debug` (" reading from file "++f') peRef p Nothing -> fail ("PEReference use before definition: "++"%"++n++";" ++"\n at "++show pn)@@ -288,7 +299,7 @@ -- | Return an XML comment. comment :: XParser Comment comment = do- bracket (tok TokCommentOpen) (tok TokCommentClose) freetext+ myBracket (tok TokCommentOpen) (tok TokCommentClose) freetext -- tok TokCommentOpen -- commit $ do -- c <- freetext@@ -509,19 +520,15 @@ choice :: XParser [CP] choice = do- bracket (tok TokBraOpen `debug` "Trying choice")- (blank (tok TokBraClose `debug` "Succeeded with choice"))- (peRef cp `sepBy1` blank (tok TokPipe))+ myBracket (tok TokBraOpen `debug` "Trying choice")+ (blank (tok TokBraClose `debug` "Succeeded with choice"))+ (peRef cp `sepBy1` blank (tok TokPipe)) sequence :: XParser [CP]-sequence = do -- bracket is inappropriate because of inner failBad- -- bracket (tok TokBraOpen `debug` "Trying sequence")- -- (blank (tok TokBraClose `debug` "Succeeded with sequence"))- -- (peRef cp `sepBy1` blank (tok TokComma))- tok TokBraOpen `debug` "Trying sequence"- cps <- peRef cp `sepBy1` blank (tok TokComma)- blank (tok TokBraClose `debug` "Succeeded with sequence")- return cps+sequence = do+ myBracket (tok TokBraOpen `debug` "Trying sequence")+ (blank (tok TokBraClose `debug` "Succeeded with sequence"))+ (peRef cp `sepBy1` blank (tok TokComma)) cp :: XParser CP cp = oneOf [ ( do n <- name@@ -701,7 +708,7 @@ -- | Return either a general entity reference, or a character reference. reference :: XParser Reference reference = do- bracket (tok TokAmp) (tok TokSemi) (freetext >>= val)+ myBracket (tok TokAmp) (tok TokSemi) (freetext >>= val) where val ('#':'x':i) | all isHexDigit i = return . RefChar . fst . head . readHex $ i@@ -729,11 +736,7 @@ pereference :: XParser PEReference pereference = do--- bracket (tok TokPercent) (tok TokSemi) nmtoken- tok TokPercent- p <- nmtoken- tok TokSemi- return p+ myBracket (tok TokPercent) (tok TokSemi) nmtoken entitydecl :: XParser EntityDecl entitydecl =
src/Text/XML/HaXml/ParseLazy.hs view
@@ -42,7 +42,9 @@ import Text.XML.HaXml.Lex import Text.ParserCombinators.Poly.NoLeak.StateLazy +import System.FilePath (combine, dropFileName) + #if ( defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 502 ) || \ ( defined(__NHC__) && __NHC__ > 114 ) || defined(__HUGS__) import System.IO.Unsafe (unsafePerformIO)@@ -154,6 +156,14 @@ ---- Auxiliary Parsing Functions ---- +-- | Parse a bracketed item, discarding the brackets AND NOT using adjustErrBad+myBracket :: PolyParse p => p bra -> p ket -> p a -> p a+myBracket open close p = do+ do { open `adjustErr` ("Missing opening bracket:\n\t"++)+ ; p `discard` (close `adjustErr` ("Missing closing bracket:\n\t"++))+ }++ -- | XParser is just a specialisation of the PolyStateLazy parser. type XParser a = Parser SymTabs (Posn,TokenT) a @@ -237,16 +247,18 @@ `debug` (" defn: "++flattenEV ev) peRef p Just (PEDefExternalID (PUBLIC _ (SystemLiteral f))) ->- do let val = unsafePerformIO (readFile f)- reparse (xmlReLex (posInNewCxt ("file "++f)+ do let f' = combine (dropFileName $ posnFilename pn) f+ val = unsafePerformIO (readFile f')+ reparse (xmlReLex (posInNewCxt f' (Just pn)) val)- `debug` (" reading from file "++f)+ `debug` (" reading from file "++f') peRef p Just (PEDefExternalID (SYSTEM (SystemLiteral f))) ->- do let val = unsafePerformIO (readFile f)- reparse (xmlReLex (posInNewCxt ("file "++f)+ do let f' = combine (dropFileName $ posnFilename pn) f+ val = unsafePerformIO (readFile f')+ reparse (xmlReLex (posInNewCxt f' (Just pn)) val)- `debug` (" reading from file "++f)+ `debug` (" reading from file "++f') peRef p Nothing -> fail ("PEReference use before definition: "++"%"++n++";" ++"\n at "++show pn)@@ -296,7 +308,7 @@ -- | Return an XML comment. comment :: XParser Comment comment = do- bracket (tok TokCommentOpen) (tok TokCommentClose) freetext+ myBracket (tok TokCommentOpen) (tok TokCommentClose) freetext -- tok TokCommentOpen -- commit $ do -- c <- freetext@@ -517,19 +529,15 @@ choice :: XParser [CP] choice = do- bracket (tok TokBraOpen `debug` "Trying choice")- (blank (tok TokBraClose `debug` "Succeeded with choice"))- (peRef cp `sepBy1` blank (tok TokPipe))+ myBracket (tok TokBraOpen `debug` "Trying choice")+ (blank (tok TokBraClose `debug` "Succeeded with choice"))+ (peRef cp `sepBy1` blank (tok TokPipe)) sequence :: XParser [CP]-sequence = do -- bracket is inappropriate because of inner failBad- -- bracket (tok TokBraOpen `debug` "Trying sequence")- -- (blank (tok TokBraClose `debug` "Succeeded with sequence"))- -- (peRef cp `sepBy1` blank (tok TokComma))- tok TokBraOpen `debug` "Trying sequence"- cps <- peRef cp `sepBy1` blank (tok TokComma)- blank (tok TokBraClose `debug` "Succeeded with sequence")- return cps+sequence = do+ myBracket (tok TokBraOpen `debug` "Trying sequence")+ (blank (tok TokBraClose `debug` "Succeeded with sequence"))+ (peRef cp `sepBy1` blank (tok TokComma)) cp :: XParser CP cp = oneOf [ ( do n <- name@@ -737,7 +745,7 @@ pereference :: XParser PEReference pereference = do- bracket (tok TokPercent) (tok TokSemi) nmtoken+ myBracket (tok TokPercent) (tok TokSemi) nmtoken entitydecl :: XParser EntityDecl entitydecl =
src/Text/XML/HaXml/Posn.hs view
@@ -42,7 +42,8 @@ posInNewCxt name pos = Pn name 1 1 pos instance Show Posn where- showsPrec _ (Pn f l c i) = showString f .+ showsPrec _ (Pn f l c i) = showString "file " .+ showString f . showString " at line " . shows l . showString " col " . shows c . ( case i of
src/Text/XML/HaXml/TypeMapping.hs view
@@ -105,6 +105,76 @@ toHType p = Tuple [ toHType a, toHType b, toHType c, toHType d , toHType e, toHType f ] where (a,b,c,d,e,f) = p+instance ( HTypeable a, HTypeable b, HTypeable c, HTypeable d, HTypeable e+ , HTypeable f, HTypeable g) =>+ HTypeable (a,b,c,d,e,f,g) where+ toHType p = Tuple [ toHType a, toHType b, toHType c, toHType d+ , toHType e, toHType f, toHType g ]+ where (a,b,c,d,e,f,g) = p+instance ( HTypeable a, HTypeable b, HTypeable c, HTypeable d, HTypeable e+ , HTypeable f, HTypeable g, HTypeable h) =>+ HTypeable (a,b,c,d,e,f,g,h) where+ toHType p = Tuple [ toHType a, toHType b, toHType c, toHType d+ , toHType e, toHType f, toHType g, toHType h ]+ where (a,b,c,d,e,f,g,h) = p+instance ( HTypeable a, HTypeable b, HTypeable c, HTypeable d, HTypeable e+ , HTypeable f, HTypeable g, HTypeable h, HTypeable i) =>+ HTypeable (a,b,c,d,e,f,g,h,i) where+ toHType p = Tuple [ toHType a, toHType b, toHType c, toHType d+ , toHType e, toHType f, toHType g, toHType h+ , toHType i ]+ where (a,b,c,d,e,f,g,h,i) = p+instance ( HTypeable a, HTypeable b, HTypeable c, HTypeable d, HTypeable e+ , HTypeable f, HTypeable g, HTypeable h, HTypeable i, HTypeable j) =>+ HTypeable (a,b,c,d,e,f,g,h,i,j) where+ toHType p = Tuple [ toHType a, toHType b, toHType c, toHType d+ , toHType e, toHType f, toHType g, toHType h+ , toHType i, toHType j ]+ where (a,b,c,d,e,f,g,h,i,j) = p+instance ( HTypeable a, HTypeable b, HTypeable c, HTypeable d, HTypeable e+ , HTypeable f, HTypeable g, HTypeable h, HTypeable i, HTypeable j+ , HTypeable k) =>+ HTypeable (a,b,c,d,e,f,g,h,i,j,k) where+ toHType p = Tuple [ toHType a, toHType b, toHType c, toHType d+ , toHType e, toHType f, toHType g, toHType h+ , toHType i, toHType j, toHType k ]+ where (a,b,c,d,e,f,g,h,i,j,k) = p+instance ( HTypeable a, HTypeable b, HTypeable c, HTypeable d, HTypeable e+ , HTypeable f, HTypeable g, HTypeable h, HTypeable i, HTypeable j+ , HTypeable k, HTypeable l) =>+ HTypeable (a,b,c,d,e,f,g,h,i,j,k,l) where+ toHType p = Tuple [ toHType a, toHType b, toHType c, toHType d+ , toHType e, toHType f, toHType g, toHType h+ , toHType i, toHType j, toHType k, toHType l ]+ where (a,b,c,d,e,f,g,h,i,j,k,l) = p+instance ( HTypeable a, HTypeable b, HTypeable c, HTypeable d, HTypeable e+ , HTypeable f, HTypeable g, HTypeable h, HTypeable i, HTypeable j+ , HTypeable k, HTypeable l, HTypeable m) =>+ HTypeable (a,b,c,d,e,f,g,h,i,j,k,l,m) where+ toHType p = Tuple [ toHType a, toHType b, toHType c, toHType d+ , toHType e, toHType f, toHType g, toHType h+ , toHType i, toHType j, toHType k, toHType l+ , toHType m ]+ where (a,b,c,d,e,f,g,h,i,j,k,l,m) = p+instance ( HTypeable a, HTypeable b, HTypeable c, HTypeable d, HTypeable e+ , HTypeable f, HTypeable g, HTypeable h, HTypeable i, HTypeable j+ , HTypeable k, HTypeable l, HTypeable m, HTypeable n) =>+ HTypeable (a,b,c,d,e,f,g,h,i,j,k,l,m,n) where+ toHType p = Tuple [ toHType a, toHType b, toHType c, toHType d+ , toHType e, toHType f, toHType g, toHType h+ , toHType i, toHType j, toHType k, toHType l+ , toHType m, toHType n ]+ where (a,b,c,d,e,f,g,h,i,j,k,l,m,n) = p+instance ( HTypeable a, HTypeable b, HTypeable c, HTypeable d, HTypeable e+ , HTypeable f, HTypeable g, HTypeable h, HTypeable i, HTypeable j+ , HTypeable k, HTypeable l, HTypeable m, HTypeable n, HTypeable o) =>+ HTypeable (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) where+ toHType p = Tuple [ toHType a, toHType b, toHType c, toHType d+ , toHType e, toHType f, toHType g, toHType h+ , toHType i, toHType j, toHType k, toHType l+ , toHType m, toHType n, toHType o ]+ where (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) = p+ instance (HTypeable a) => HTypeable (Maybe a) where toHType m = Maybe (toHType x) where (Just x) = m instance (HTypeable a, HTypeable b) => HTypeable (Either a b) where
src/Text/XML/HaXml/Wrappers.hs view
@@ -1,6 +1,7 @@ module Text.XML.HaXml.Wrappers ( fix2Args , processXmlWith+ , onContent ) where -- imports required for processXmlWith and fix2Args@@ -59,3 +60,12 @@ [CElem e' _] -> Document p s e' m [] -> error "produced no output" _ -> error "produced more than one output"++-- | The wrapper @onContent@ simply applies a given content filter to a+-- document. Ambiguous or empty results raise an error exception.+onContent :: CFilter i -> Document i -> Document i+onContent filter (Document p s e m) =+ case filter (CElem e undefined) of+ [CElem e' _] -> Document p s e' m+ [] -> error "onContent: produced no output"+ _ -> error "onContent: produced more than one output"
src/Text/XML/HaXml/XmlContent.hs view
@@ -472,7 +472,7 @@ } instance (XmlContent a, XmlContent b, XmlContent c) => XmlContent (a,b,c) where- toContents (x,y,z) = toContents x ++ toContents y ++ toContents z+ toContents (a,b,c) = toContents a ++ toContents b ++ toContents c parseContents = do { a <- parseContents ; b <- parseContents@@ -482,8 +482,8 @@ instance (XmlContent a, XmlContent b, XmlContent c, XmlContent d) => XmlContent (a,b,c,d) where- toContents (x,y,z,t) = toContents x ++ toContents y ++ toContents z- ++ toContents t+ toContents (a,b,c,d) = toContents a ++ toContents b ++ toContents c+ ++ toContents d parseContents = do { a <- parseContents ; b <- parseContents@@ -495,8 +495,8 @@ instance ( XmlContent a, XmlContent b, XmlContent c, XmlContent d , XmlContent e ) => XmlContent (a,b,c,d,e) where- toContents (x,y,z,t,u) = toContents x ++ toContents y ++ toContents z- ++ toContents t ++ toContents u+ toContents (a,b,c,d,e) = toContents a ++ toContents b ++ toContents c+ ++ toContents d ++ toContents e parseContents = do { a <- parseContents ; b <- parseContents@@ -509,8 +509,8 @@ instance ( XmlContent a, XmlContent b, XmlContent c, XmlContent d , XmlContent e, XmlContent f ) => XmlContent (a,b,c,d,e,f) where- toContents (x,y,z,t,u,v) = toContents x ++ toContents y ++ toContents z- ++ toContents t ++ toContents u ++ toContents v+ toContents (a,b,c,d,e,f) = toContents a ++ toContents b ++ toContents c+ ++ toContents d ++ toContents e ++ toContents f parseContents = do { a <- parseContents ; b <- parseContents@@ -519,6 +519,215 @@ ; e <- parseContents ; f <- parseContents ; return (a,b,c,d,e,f)+ }++instance ( XmlContent a, XmlContent b, XmlContent c, XmlContent d+ , XmlContent e, XmlContent f, XmlContent g ) =>+ XmlContent (a,b,c,d,e,f,g) where+ toContents (a,b,c,d,e,f,g)+ = toContents a ++ toContents b ++ toContents c ++ toContents d+ ++ toContents e ++ toContents f ++ toContents g+ parseContents = do+ { a <- parseContents+ ; b <- parseContents+ ; c <- parseContents+ ; d <- parseContents+ ; e <- parseContents+ ; f <- parseContents+ ; g <- parseContents+ ; return (a,b,c,d,e,f,g)+ }++instance ( XmlContent a, XmlContent b, XmlContent c, XmlContent d+ , XmlContent e, XmlContent f, XmlContent g, XmlContent h ) =>+ XmlContent (a,b,c,d,e,f,g,h) where+ toContents (a,b,c,d,e,f,g,h)+ = toContents a ++ toContents b ++ toContents c ++ toContents d+ ++ toContents e ++ toContents f ++ toContents g ++ toContents h+ parseContents = do+ { a <- parseContents+ ; b <- parseContents+ ; c <- parseContents+ ; d <- parseContents+ ; e <- parseContents+ ; f <- parseContents+ ; g <- parseContents+ ; h <- parseContents+ ; return (a,b,c,d,e,f,g,h)+ }++instance ( XmlContent a, XmlContent b, XmlContent c, XmlContent d+ , XmlContent e, XmlContent f, XmlContent g, XmlContent h+ , XmlContent i ) =>+ XmlContent (a,b,c,d,e,f,g,h,i) where+ toContents (a,b,c,d,e,f,g,h,i)+ = toContents a ++ toContents b ++ toContents c ++ toContents d+ ++ toContents e ++ toContents f ++ toContents g ++ toContents h+ ++ toContents i+ parseContents = do+ { a <- parseContents+ ; b <- parseContents+ ; c <- parseContents+ ; d <- parseContents+ ; e <- parseContents+ ; f <- parseContents+ ; g <- parseContents+ ; h <- parseContents+ ; i <- parseContents+ ; return (a,b,c,d,e,f,g,h,i)+ }++instance ( XmlContent a, XmlContent b, XmlContent c, XmlContent d+ , XmlContent e, XmlContent f, XmlContent g, XmlContent h+ , XmlContent i, XmlContent j ) =>+ XmlContent (a,b,c,d,e,f,g,h,i,j) where+ toContents (a,b,c,d,e,f,g,h,i,j)+ = toContents a ++ toContents b ++ toContents c ++ toContents d+ ++ toContents e ++ toContents f ++ toContents g ++ toContents h+ ++ toContents i ++ toContents j+ parseContents = do+ { a <- parseContents+ ; b <- parseContents+ ; c <- parseContents+ ; d <- parseContents+ ; e <- parseContents+ ; f <- parseContents+ ; g <- parseContents+ ; h <- parseContents+ ; i <- parseContents+ ; j <- parseContents+ ; return (a,b,c,d,e,f,g,h,i,j)+ }++instance ( XmlContent a, XmlContent b, XmlContent c, XmlContent d+ , XmlContent e, XmlContent f, XmlContent g, XmlContent h+ , XmlContent i, XmlContent j, XmlContent k ) =>+ XmlContent (a,b,c,d,e,f,g,h,i,j,k) where+ toContents (a,b,c,d,e,f,g,h,i,j,k)+ = toContents a ++ toContents b ++ toContents c ++ toContents d+ ++ toContents e ++ toContents f ++ toContents g ++ toContents h+ ++ toContents i ++ toContents j ++ toContents k+ parseContents = do+ { a <- parseContents+ ; b <- parseContents+ ; c <- parseContents+ ; d <- parseContents+ ; e <- parseContents+ ; f <- parseContents+ ; g <- parseContents+ ; h <- parseContents+ ; i <- parseContents+ ; j <- parseContents+ ; k <- parseContents+ ; return (a,b,c,d,e,f,g,h,i,j,k)+ }++instance ( XmlContent a, XmlContent b, XmlContent c, XmlContent d+ , XmlContent e, XmlContent f, XmlContent g, XmlContent h+ , XmlContent i, XmlContent j, XmlContent k, XmlContent l ) =>+ XmlContent (a,b,c,d,e,f,g,h,i,j,k,l) where+ toContents (a,b,c,d,e,f,g,h,i,j,k,l)+ = toContents a ++ toContents b ++ toContents c ++ toContents d+ ++ toContents e ++ toContents f ++ toContents g ++ toContents h+ ++ toContents i ++ toContents j ++ toContents k ++ toContents l+ parseContents = do+ { a <- parseContents+ ; b <- parseContents+ ; c <- parseContents+ ; d <- parseContents+ ; e <- parseContents+ ; f <- parseContents+ ; g <- parseContents+ ; h <- parseContents+ ; i <- parseContents+ ; j <- parseContents+ ; k <- parseContents+ ; l <- parseContents+ ; return (a,b,c,d,e,f,g,h,i,j,k,l)+ }++instance ( XmlContent a, XmlContent b, XmlContent c, XmlContent d+ , XmlContent e, XmlContent f, XmlContent g, XmlContent h+ , XmlContent i, XmlContent j, XmlContent k, XmlContent l+ , XmlContent m ) =>+ XmlContent (a,b,c,d,e,f,g,h,i,j,k,l,m) where+ toContents (a,b,c,d,e,f,g,h,i,j,k,l,m)+ = toContents a ++ toContents b ++ toContents c ++ toContents d+ ++ toContents e ++ toContents f ++ toContents g ++ toContents h+ ++ toContents i ++ toContents j ++ toContents k ++ toContents l+ ++ toContents m+ parseContents = do+ { a <- parseContents+ ; b <- parseContents+ ; c <- parseContents+ ; d <- parseContents+ ; e <- parseContents+ ; f <- parseContents+ ; g <- parseContents+ ; h <- parseContents+ ; i <- parseContents+ ; j <- parseContents+ ; k <- parseContents+ ; l <- parseContents+ ; m <- parseContents+ ; return (a,b,c,d,e,f,g,h,i,j,k,l,m)+ }++instance ( XmlContent a, XmlContent b, XmlContent c, XmlContent d+ , XmlContent e, XmlContent f, XmlContent g, XmlContent h+ , XmlContent i, XmlContent j, XmlContent k, XmlContent l+ , XmlContent m, XmlContent n ) =>+ XmlContent (a,b,c,d,e,f,g,h,i,j,k,l,m,n) where+ toContents (a,b,c,d,e,f,g,h,i,j,k,l,m,n)+ = toContents a ++ toContents b ++ toContents c ++ toContents d+ ++ toContents e ++ toContents f ++ toContents g ++ toContents h+ ++ toContents i ++ toContents j ++ toContents k ++ toContents l+ ++ toContents m ++ toContents n+ parseContents = do+ { a <- parseContents+ ; b <- parseContents+ ; c <- parseContents+ ; d <- parseContents+ ; e <- parseContents+ ; f <- parseContents+ ; g <- parseContents+ ; h <- parseContents+ ; i <- parseContents+ ; j <- parseContents+ ; k <- parseContents+ ; l <- parseContents+ ; m <- parseContents+ ; n <- parseContents+ ; return (a,b,c,d,e,f,g,h,i,j,k,l,m,n)+ }++instance ( XmlContent a, XmlContent b, XmlContent c, XmlContent d+ , XmlContent e, XmlContent f, XmlContent g, XmlContent h+ , XmlContent i, XmlContent j, XmlContent k, XmlContent l+ , XmlContent m, XmlContent n, XmlContent o ) =>+ XmlContent (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) where+ toContents (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o)+ = toContents a ++ toContents b ++ toContents c ++ toContents d+ ++ toContents e ++ toContents f ++ toContents g ++ toContents h+ ++ toContents i ++ toContents j ++ toContents k ++ toContents l+ ++ toContents m ++ toContents n ++ toContents o+ parseContents = do+ { a <- parseContents+ ; b <- parseContents+ ; c <- parseContents+ ; d <- parseContents+ ; e <- parseContents+ ; f <- parseContents+ ; g <- parseContents+ ; h <- parseContents+ ; i <- parseContents+ ; j <- parseContents+ ; k <- parseContents+ ; l <- parseContents+ ; m <- parseContents+ ; n <- parseContents+ ; o <- parseContents+ ; return (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) } instance (XmlContent a) => XmlContent (Maybe a) where