{-# LANGUAGE CPP #-}
-- | This is a separate pretty-printer for HTML documents, recognising
--   some of the differences between HTML and true XML.

module Text.XML.HaXml.Html.Pretty
  ( document
  , element
  , attribute
  , content
  ) where

#if MIN_VERSION_base(4,11,0)
import Prelude hiding (maybe,either,(<>))
#else
import Prelude hiding (maybe,either)
#endif

import Data.Maybe hiding (maybe)
import Data.List (intersperse)
import Data.Char (isSpace)
import Text.PrettyPrint.HughesPJ
import Text.XML.HaXml.Types
import Text.XML.HaXml.Namespaces

either :: (a->c) -> (b->c) -> Either a b -> c
either :: (a -> c) -> (b -> c) -> Either a b -> c
either  a -> c
f b -> c
_g (Left a
x)  = a -> c
f a
x
either a -> c
_f  b -> c
g (Right b
x) = b -> c
g b
x

maybe :: (a->Doc) -> Maybe a -> Doc
maybe :: (a -> Doc) -> Maybe a -> Doc
maybe a -> Doc
_f Maybe a
Nothing  = Doc
empty
maybe  a -> Doc
f (Just a
x) = a -> Doc
f a
x

--peref p   = text "%" <> text p <> text ";"

----

document :: Document i -> Doc
prolog   :: Prolog -> Doc
xmldecl  :: XMLDecl -> Doc
misc     :: Misc -> Doc
sddecl   :: Bool -> Doc

doctypedecl :: DocTypeDecl -> Doc
markupdecl  :: MarkupDecl -> Doc
--extsubset   :: ExtSubset -> Doc
--extsubsetdecl :: ExtSubsetDecl -> Doc

element   :: Element i -> Doc
attribute :: Attribute -> Doc                     --etc
content   :: Content i -> Doc

----

document :: Document i -> Doc
document (Document Prolog
p SymTab EntityDef
_ Element i
e [Misc]
m)= Prolog -> Doc
prolog Prolog
p Doc -> Doc -> Doc
$$ Element i -> Doc
forall i. Element i -> Doc
element Element i
e Doc -> Doc -> Doc
$$ [Doc] -> Doc
vcat ((Misc -> Doc) -> [Misc] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map Misc -> Doc
misc [Misc]
m)
prolog :: Prolog -> Doc
prolog (Prolog Maybe XMLDecl
x [Misc]
m1 Maybe DocTypeDecl
dtd [Misc]
m2)= (XMLDecl -> Doc) -> Maybe XMLDecl -> Doc
forall a. (a -> Doc) -> Maybe a -> Doc
maybe XMLDecl -> Doc
xmldecl Maybe XMLDecl
x Doc -> Doc -> Doc
$$
                             [Doc] -> Doc
vcat ((Misc -> Doc) -> [Misc] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map Misc -> Doc
misc [Misc]
m1) Doc -> Doc -> Doc
$$
                             (DocTypeDecl -> Doc) -> Maybe DocTypeDecl -> Doc
forall a. (a -> Doc) -> Maybe a -> Doc
maybe DocTypeDecl -> Doc
doctypedecl Maybe DocTypeDecl
dtd Doc -> Doc -> Doc
$$
                             [Doc] -> Doc
vcat ((Misc -> Doc) -> [Misc] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map Misc -> Doc
misc [Misc]
m2)
xmldecl :: XMLDecl -> Doc
xmldecl (XMLDecl VersionInfo
v Maybe EncodingDecl
e Maybe SDDecl
sd)   = VersionInfo -> Doc
text VersionInfo
"<?xml version='" Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
v Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
"'" Doc -> Doc -> Doc
<+>
                             (EncodingDecl -> Doc) -> Maybe EncodingDecl -> Doc
forall a. (a -> Doc) -> Maybe a -> Doc
maybe EncodingDecl -> Doc
encodingdecl Maybe EncodingDecl
e Doc -> Doc -> Doc
<+>
                             (SDDecl -> Doc) -> Maybe SDDecl -> Doc
forall a. (a -> Doc) -> Maybe a -> Doc
maybe SDDecl -> Doc
sddecl Maybe SDDecl
sd Doc -> Doc -> Doc
<+>
                             VersionInfo -> Doc
text VersionInfo
"?>"
misc :: Misc -> Doc
misc (Comment VersionInfo
s)           = VersionInfo -> Doc
text VersionInfo
"<!--" Doc -> Doc -> Doc
<+> VersionInfo -> Doc
text VersionInfo
s Doc -> Doc -> Doc
<+> VersionInfo -> Doc
text VersionInfo
"-->"
misc (PI (VersionInfo
n,VersionInfo
s))            = VersionInfo -> Doc
text VersionInfo
"<?" Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
n Doc -> Doc -> Doc
<+> VersionInfo -> Doc
text VersionInfo
s Doc -> Doc -> Doc
<+> VersionInfo -> Doc
text VersionInfo
"?>"
sddecl :: SDDecl -> Doc
sddecl SDDecl
sd   | SDDecl
sd           = VersionInfo -> Doc
text VersionInfo
"standalone='yes'"
            | SDDecl
otherwise    = VersionInfo -> Doc
text VersionInfo
"standalone='no'"
doctypedecl :: DocTypeDecl -> Doc
doctypedecl (DTD QName
n Maybe ExternalID
eid [MarkupDecl]
ds) = if [MarkupDecl] -> SDDecl
forall (t :: * -> *) a. Foldable t => t a -> SDDecl
null [MarkupDecl]
ds then
                                  Doc
hd Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
">"
                             else Doc
hd Doc -> Doc -> Doc
<+> VersionInfo -> Doc
text VersionInfo
" [" Doc -> Doc -> Doc
$$
                                  [Doc] -> Doc
vcat ((MarkupDecl -> Doc) -> [MarkupDecl] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map MarkupDecl -> Doc
markupdecl [MarkupDecl]
ds) Doc -> Doc -> Doc
$$ VersionInfo -> Doc
text VersionInfo
"]>"
                           where hd :: Doc
hd = VersionInfo -> Doc
text VersionInfo
"<!DOCTYPE" Doc -> Doc -> Doc
<+> QName -> Doc
qname QName
n Doc -> Doc -> Doc
<+>
                                      (ExternalID -> Doc) -> Maybe ExternalID -> Doc
forall a. (a -> Doc) -> Maybe a -> Doc
maybe ExternalID -> Doc
externalid Maybe ExternalID
eid
markupdecl :: MarkupDecl -> Doc
markupdecl (Element ElementDecl
e)     = ElementDecl -> Doc
elementdecl ElementDecl
e
markupdecl (AttList AttListDecl
a)     = AttListDecl -> Doc
attlistdecl AttListDecl
a
markupdecl (Entity EntityDecl
e)      = EntityDecl -> Doc
entitydecl EntityDecl
e
markupdecl (Notation NotationDecl
n)    = NotationDecl -> Doc
notationdecl NotationDecl
n
markupdecl (MarkupMisc Misc
m)  = Misc -> Doc
misc Misc
m
--markupdecl (MarkupPE p m)  = peref p

--extsubset (ExtSubset t ds) = maybe textdecl t $$
--                             vcat (map extsubsetdecl ds)
--extsubsetdecl (ExtMarkupDecl m)      = markupdecl m
--extsubsetdecl (ExtConditionalSect c) = conditionalsect c
-- --extsubsetdecl (ExtPEReference p e)   = peref p

element :: Element i -> Doc
element (Elem QName
n [Attribute]
as []) = VersionInfo -> Doc
text VersionInfo
"<" Doc -> Doc -> Doc
<> QName -> Doc
qname QName
n Doc -> Doc -> Doc
<+>
                         [Doc] -> Doc
fsep ((Attribute -> Doc) -> [Attribute] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map Attribute -> Doc
attribute [Attribute]
as) Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
"/>"
element e :: Element i
e@(Elem QName
n [Attribute]
as [Content i]
cs)
--  | any isText cs    = text "<" <> qname n <+> fsep (map attribute as) <>
--                       text ">" <> hcat (map content cs) <>
--                       text "</" <> qname n <> text ">"
    | Content i -> SDDecl
forall i. Content i -> SDDecl
isText ([Content i] -> Content i
forall a. [a] -> a
head [Content i]
cs) = VersionInfo -> Doc
text VersionInfo
"<" Doc -> Doc -> Doc
<> QName -> Doc
qname QName
n Doc -> Doc -> Doc
<+> [Doc] -> Doc
fsep ((Attribute -> Doc) -> [Attribute] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map Attribute -> Doc
attribute [Attribute]
as) Doc -> Doc -> Doc
<>
                         VersionInfo -> Doc
text VersionInfo
">" Doc -> Doc -> Doc
<> [Doc] -> Doc
hcat ((Content i -> Doc) -> [Content i] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map Content i -> Doc
forall i. Content i -> Doc
content [Content i]
cs) Doc -> Doc -> Doc
<>
                         VersionInfo -> Doc
text VersionInfo
"</" Doc -> Doc -> Doc
<> QName -> Doc
qname QName
n Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
">"
    | SDDecl
otherwise        = let (Doc
d,Doc
c) = Element i -> Doc -> (Doc, Doc)
forall i. Element i -> Doc -> (Doc, Doc)
carryelem Element i
e Doc
empty
                         in Doc
d Doc -> Doc -> Doc
<> Doc
c

isText :: Content i -> Bool
isText :: Content i -> SDDecl
isText (CString SDDecl
_ VersionInfo
_ i
_) = SDDecl
True
isText (CRef Reference
_ i
_)      = SDDecl
True
isText Content i
_               = SDDecl
False

carryelem :: Element i -> Doc -> (Doc, Doc)
carryelem :: Element i -> Doc -> (Doc, Doc)
carryelem (Elem QName
n [Attribute]
as []) Doc
c
                       = ( Doc
c Doc -> Doc -> Doc
<>
                           VersionInfo -> Doc
text VersionInfo
"<" Doc -> Doc -> Doc
<> QName -> Doc
qname QName
n Doc -> Doc -> Doc
<+> [Doc] -> Doc
fsep ((Attribute -> Doc) -> [Attribute] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map Attribute -> Doc
attribute [Attribute]
as)
                         , VersionInfo -> Doc
text VersionInfo
"/>")
--carryelem e@(Elem n as cs) c
----  | any isText cs    =  ( c <> element e, empty)
--    | otherwise        =  let (cs',d') = carryscan carrycontent cs (text ">")
--                          in
--                          ( c <>
--                            text "<" <> qname n <+> fsep (map attribute as) $$
--                            nest 2 (vcat cs') <> -- $$
--                            c' <> text "</" <> qname n
--                          , text ">")
--carrycontent (CElem e) c   = carryelem e c
--carrycontent (CString _ s) c = (c <> chardata s, empty)
--carrycontent (CRef r) c    = (c <> reference r, empty)
--carrycontent (CMisc m) c   = (c <> misc m, empty)
--
--carryscan :: (a->c->(b,c)) -> [a] -> c -> ([b],c)
--carryscan f []     c = ([],c)
--carryscan f (a:as) c = let (b, c')   = f a c
--                           (bs,c'') = carryscan f as c'
--                       in (b:bs, c'')

carryelem (Elem QName
n [Attribute]
as [Content i]
cs) Doc
c
  | Content i -> SDDecl
forall i. Content i -> SDDecl
isText ([Content i] -> Content i
forall a. [a] -> a
head [Content i]
cs) =
        ( Doc
start Doc -> Doc -> Doc
<>
          VersionInfo -> Doc
text VersionInfo
">" Doc -> Doc -> Doc
<> [Doc] -> Doc
hcat ((Content i -> Doc) -> [Content i] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map Content i -> Doc
forall i. Content i -> Doc
content [Content i]
cs) Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
"</" Doc -> Doc -> Doc
<> QName -> Doc
qname QName
n
        , VersionInfo -> Doc
text VersionInfo
">")
  | SDDecl
otherwise =
        let (Doc
d,Doc
c') = ((Doc, Doc) -> Content i -> (Doc, Doc))
-> (Doc, Doc) -> [Content i] -> (Doc, Doc)
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl (Doc, Doc) -> Content i -> (Doc, Doc)
forall i. (Doc, Doc) -> Content i -> (Doc, Doc)
carrycontent (Doc
start, VersionInfo -> Doc
text VersionInfo
">") [Content i]
cs in
        ( Doc
d Doc -> Doc -> Doc
<> Doc
c' Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
"</" Doc -> Doc -> Doc
<> QName -> Doc
qname QName
n
        , VersionInfo -> Doc
text VersionInfo
">")
  where start :: Doc
start = Doc
c Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
"<" Doc -> Doc -> Doc
<> QName -> Doc
qname QName
n Doc -> Doc -> Doc
<+> [Doc] -> Doc
fsep ((Attribute -> Doc) -> [Attribute] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map Attribute -> Doc
attribute [Attribute]
as)

carrycontent :: (Doc, Doc) -> Content i -> (Doc, Doc)
carrycontent :: (Doc, Doc) -> Content i -> (Doc, Doc)
carrycontent (Doc
d,Doc
c) (CElem Element i
e i
_)     = let (Doc
d',Doc
c') = Element i -> Doc -> (Doc, Doc)
forall i. Element i -> Doc -> (Doc, Doc)
carryelem Element i
e Doc
c in
                                     (Doc
d Doc -> Doc -> Doc
$$ Int -> Doc -> Doc
nest Int
2 Doc
d',       Doc
c')
carrycontent (Doc
d,Doc
c) (CString SDDecl
_ VersionInfo
s i
_) = (Doc
d Doc -> Doc -> Doc
<> Doc
c Doc -> Doc -> Doc
<> VersionInfo -> Doc
chardata VersionInfo
s, Doc
empty)
carrycontent (Doc
d,Doc
c) (CRef Reference
r i
_)      = (Doc
d Doc -> Doc -> Doc
<> Doc
c Doc -> Doc -> Doc
<> Reference -> Doc
reference Reference
r,Doc
empty)
carrycontent (Doc
d,Doc
c) (CMisc Misc
m i
_)     = (Doc
d Doc -> Doc -> Doc
$$ Doc
c Doc -> Doc -> Doc
<> Misc -> Doc
misc Misc
m,     Doc
empty)


attribute :: Attribute -> Doc
attribute (QName
n,AttValue
v)          = QName -> Doc
qname QName
n Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
"=" Doc -> Doc -> Doc
<> AttValue -> Doc
attvalue AttValue
v
content :: Content i -> Doc
content (CElem Element i
e i
_)      = Element i -> Doc
forall i. Element i -> Doc
element Element i
e
content (CString SDDecl
_ VersionInfo
s i
_)  = VersionInfo -> Doc
chardata VersionInfo
s
content (CRef Reference
r i
_)       = Reference -> Doc
reference Reference
r
content (CMisc Misc
m i
_)      = Misc -> Doc
misc Misc
m

elementdecl     :: ElementDecl -> Doc
contentspec     :: ContentSpec -> Doc
cp              :: CP -> Doc
modifier        :: Modifier -> Doc
mixed           :: Mixed -> Doc
attlistdecl     :: AttListDecl -> Doc
attdef          :: AttDef -> Doc
atttype         :: AttType -> Doc
tokenizedtype   :: TokenizedType -> Doc
enumeratedtype  :: EnumeratedType -> Doc
notationtype    :: [String] -> Doc
enumeration     :: [String] -> Doc
defaultdecl     :: DefaultDecl -> Doc
reference       :: Reference -> Doc
entityref       :: String -> Doc
charref         :: (Show a) => a -> Doc
entitydecl      :: EntityDecl -> Doc
gedecl          :: GEDecl -> Doc
pedecl          :: PEDecl -> Doc
entitydef       :: EntityDef -> Doc
pedef           :: PEDef -> Doc
externalid      :: ExternalID -> Doc
ndatadecl       :: NDataDecl -> Doc
notationdecl    :: NotationDecl -> Doc
publicid        :: PublicID -> Doc
encodingdecl    :: EncodingDecl -> Doc
nmtoken         :: String -> Doc
attvalue        :: AttValue -> Doc
entityvalue     :: EntityValue -> Doc
ev              :: EV -> Doc
pubidliteral    :: PubidLiteral -> Doc
systemliteral   :: SystemLiteral -> Doc
chardata        :: [Char] -> Doc


elementdecl :: ElementDecl -> Doc
elementdecl (ElementDecl QName
n ContentSpec
cs) = VersionInfo -> Doc
text VersionInfo
"<!ELEMENT" Doc -> Doc -> Doc
<+> QName -> Doc
qname QName
n Doc -> Doc -> Doc
<+>
                                 ContentSpec -> Doc
contentspec ContentSpec
cs Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
">"
contentspec :: ContentSpec -> Doc
contentspec ContentSpec
EMPTY              = VersionInfo -> Doc
text VersionInfo
"EMPTY"
contentspec ContentSpec
ANY                = VersionInfo -> Doc
text VersionInfo
"ANY"
contentspec (Mixed Mixed
m)          = Mixed -> Doc
mixed Mixed
m
contentspec (ContentSpec CP
c)    = CP -> Doc
cp CP
c
--contentspec (ContentPE p cs)   = peref p
cp :: CP -> Doc
cp (TagName QName
n Modifier
m)       = QName -> Doc
qname QName
n Doc -> Doc -> Doc
<> Modifier -> Doc
modifier Modifier
m
cp (Choice [CP]
cs Modifier
m)       = Doc -> Doc
parens ([Doc] -> Doc
hcat (Doc -> [Doc] -> [Doc]
forall a. a -> [a] -> [a]
intersperse (VersionInfo -> Doc
text VersionInfo
"|") ((CP -> Doc) -> [CP] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map CP -> Doc
cp [CP]
cs))) Doc -> Doc -> Doc
<>
                           Modifier -> Doc
modifier Modifier
m
cp (Seq [CP]
cs Modifier
m)          = Doc -> Doc
parens ([Doc] -> Doc
hcat (Doc -> [Doc] -> [Doc]
forall a. a -> [a] -> [a]
intersperse (VersionInfo -> Doc
text VersionInfo
",") ((CP -> Doc) -> [CP] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map CP -> Doc
cp [CP]
cs))) Doc -> Doc -> Doc
<>
                           Modifier -> Doc
modifier Modifier
m
--cp (CPPE p c)          = peref p
modifier :: Modifier -> Doc
modifier Modifier
None          = Doc
empty
modifier Modifier
Query         = VersionInfo -> Doc
text VersionInfo
"?"
modifier Modifier
Star          = VersionInfo -> Doc
text VersionInfo
"*"
modifier Modifier
Plus          = VersionInfo -> Doc
text VersionInfo
"+"
mixed :: Mixed -> Doc
mixed  Mixed
PCDATA          = VersionInfo -> Doc
text VersionInfo
"(#PCDATA)"
mixed (PCDATAplus [QName]
ns)  = VersionInfo -> Doc
text VersionInfo
"(#PCDATA |" Doc -> Doc -> Doc
<+>
                         [Doc] -> Doc
hcat (Doc -> [Doc] -> [Doc]
forall a. a -> [a] -> [a]
intersperse (VersionInfo -> Doc
text VersionInfo
"|") ((QName -> Doc) -> [QName] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map QName -> Doc
qname [QName]
ns)) Doc -> Doc -> Doc
<>
                         VersionInfo -> Doc
text VersionInfo
")*"

attlistdecl :: AttListDecl -> Doc
attlistdecl (AttListDecl QName
n [AttDef]
ds) = VersionInfo -> Doc
text VersionInfo
"<!ATTLIST" Doc -> Doc -> Doc
<+> QName -> Doc
qname QName
n Doc -> Doc -> Doc
<+>
                                 [Doc] -> Doc
fsep ((AttDef -> Doc) -> [AttDef] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map AttDef -> Doc
attdef [AttDef]
ds) Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
">"
attdef :: AttDef -> Doc
attdef (AttDef QName
n AttType
t DefaultDecl
d)          = QName -> Doc
qname QName
n Doc -> Doc -> Doc
<+> AttType -> Doc
atttype AttType
t Doc -> Doc -> Doc
<+> DefaultDecl -> Doc
defaultdecl DefaultDecl
d
atttype :: AttType -> Doc
atttype  AttType
StringType            = VersionInfo -> Doc
text VersionInfo
"CDATA"
atttype (TokenizedType TokenizedType
t)      = TokenizedType -> Doc
tokenizedtype TokenizedType
t
atttype (EnumeratedType EnumeratedType
t)     = EnumeratedType -> Doc
enumeratedtype EnumeratedType
t
tokenizedtype :: TokenizedType -> Doc
tokenizedtype TokenizedType
ID               = VersionInfo -> Doc
text VersionInfo
"ID"
tokenizedtype TokenizedType
IDREF            = VersionInfo -> Doc
text VersionInfo
"IDREF"
tokenizedtype TokenizedType
IDREFS           = VersionInfo -> Doc
text VersionInfo
"IDREFS"
tokenizedtype TokenizedType
ENTITY           = VersionInfo -> Doc
text VersionInfo
"ENTITY"
tokenizedtype TokenizedType
ENTITIES         = VersionInfo -> Doc
text VersionInfo
"ENTITIES"
tokenizedtype TokenizedType
NMTOKEN          = VersionInfo -> Doc
text VersionInfo
"NMTOKEN"
tokenizedtype TokenizedType
NMTOKENS         = VersionInfo -> Doc
text VersionInfo
"NMTOKENS"
enumeratedtype :: EnumeratedType -> Doc
enumeratedtype (NotationType NotationType
n)= NotationType -> Doc
notationtype NotationType
n
enumeratedtype (Enumeration NotationType
e) = NotationType -> Doc
enumeration NotationType
e
notationtype :: NotationType -> Doc
notationtype NotationType
ns                = VersionInfo -> Doc
text VersionInfo
"NOTATION" Doc -> Doc -> Doc
<+>
                                 Doc -> Doc
parens ([Doc] -> Doc
hcat (Doc -> [Doc] -> [Doc]
forall a. a -> [a] -> [a]
intersperse (VersionInfo -> Doc
text VersionInfo
"|") ((VersionInfo -> Doc) -> NotationType -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map VersionInfo -> Doc
text NotationType
ns)))
enumeration :: NotationType -> Doc
enumeration NotationType
ns                 = Doc -> Doc
parens ([Doc] -> Doc
hcat (Doc -> [Doc] -> [Doc]
forall a. a -> [a] -> [a]
intersperse (VersionInfo -> Doc
text VersionInfo
"|") ((VersionInfo -> Doc) -> NotationType -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map VersionInfo -> Doc
nmtoken NotationType
ns)))
defaultdecl :: DefaultDecl -> Doc
defaultdecl  DefaultDecl
REQUIRED          = VersionInfo -> Doc
text VersionInfo
"#REQUIRED"
defaultdecl  DefaultDecl
IMPLIED           = VersionInfo -> Doc
text VersionInfo
"#IMPLIED"
defaultdecl (DefaultTo AttValue
a Maybe FIXED
f)    = (FIXED -> Doc) -> Maybe FIXED -> Doc
forall a. (a -> Doc) -> Maybe a -> Doc
maybe (Doc -> FIXED -> Doc
forall a b. a -> b -> a
const (VersionInfo -> Doc
text VersionInfo
"#FIXED")) Maybe FIXED
f Doc -> Doc -> Doc
<+> AttValue -> Doc
attvalue AttValue
a
--conditionalsect (IncludeSect i)= text "<![INCLUDE [" <+>
--                                 vcat (map extsubsetdecl i) <+> text "]]>"
--conditionalsect (IgnoreSect i) = text "<![IGNORE [" <+>
--                                 fsep (map ignoresectcontents i) <+> text "]]>"
--ignore (Ignore)                = empty
--ignoresectcontents (IgnoreSectContents i is)
--                               = ignore i <+> vcat (map internal is)
--                          where internal (ics,i) = text "<![[" <+>
--                                                   ignoresectcontents ics <+>
--                                                   text "]]>" <+> ignore i
reference :: Reference -> Doc
reference (RefEntity VersionInfo
er)       = VersionInfo -> Doc
entityref VersionInfo
er
reference (RefChar Int
cr)         = Int -> Doc
forall a. Show a => a -> Doc
charref Int
cr
entityref :: VersionInfo -> Doc
entityref VersionInfo
n                    = VersionInfo -> Doc
text VersionInfo
"&" Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
n Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
";"
charref :: a -> Doc
charref a
c                      = VersionInfo -> Doc
text VersionInfo
"&#" Doc -> Doc -> Doc
<> VersionInfo -> Doc
text (a -> VersionInfo
forall a. Show a => a -> VersionInfo
show a
c) Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
";"
entitydecl :: EntityDecl -> Doc
entitydecl (EntityGEDecl GEDecl
d)    = GEDecl -> Doc
gedecl GEDecl
d
entitydecl (EntityPEDecl PEDecl
d)    = PEDecl -> Doc
pedecl PEDecl
d
gedecl :: GEDecl -> Doc
gedecl (GEDecl VersionInfo
n EntityDef
ed)           = VersionInfo -> Doc
text VersionInfo
"<!ENTITY" Doc -> Doc -> Doc
<+> VersionInfo -> Doc
text VersionInfo
n Doc -> Doc -> Doc
<+> EntityDef -> Doc
entitydef EntityDef
ed Doc -> Doc -> Doc
<>
                                 VersionInfo -> Doc
text VersionInfo
">"
pedecl :: PEDecl -> Doc
pedecl (PEDecl VersionInfo
n PEDef
pd)           = VersionInfo -> Doc
text VersionInfo
"<!ENTITY %" Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
n Doc -> Doc -> Doc
<+> PEDef -> Doc
pedef PEDef
pd Doc -> Doc -> Doc
<>
                                 VersionInfo -> Doc
text VersionInfo
">"
entitydef :: EntityDef -> Doc
entitydef (DefEntityValue EntityValue
ev)  = EntityValue -> Doc
entityvalue EntityValue
ev
entitydef (DefExternalID ExternalID
i Maybe NDataDecl
nd) = ExternalID -> Doc
externalid ExternalID
i Doc -> Doc -> Doc
<+> (NDataDecl -> Doc) -> Maybe NDataDecl -> Doc
forall a. (a -> Doc) -> Maybe a -> Doc
maybe NDataDecl -> Doc
ndatadecl Maybe NDataDecl
nd
pedef :: PEDef -> Doc
pedef (PEDefEntityValue EntityValue
ev)    = EntityValue -> Doc
entityvalue EntityValue
ev
pedef (PEDefExternalID ExternalID
eid)    = ExternalID -> Doc
externalid ExternalID
eid
externalid :: ExternalID -> Doc
externalid (SYSTEM SystemLiteral
sl)         = VersionInfo -> Doc
text VersionInfo
"SYSTEM" Doc -> Doc -> Doc
<+> SystemLiteral -> Doc
systemliteral SystemLiteral
sl
externalid (PUBLIC PubidLiteral
i SystemLiteral
sl)       = VersionInfo -> Doc
text VersionInfo
"PUBLIC" Doc -> Doc -> Doc
<+> PubidLiteral -> Doc
pubidliteral PubidLiteral
i Doc -> Doc -> Doc
<+>
                                 SystemLiteral -> Doc
systemliteral SystemLiteral
sl
ndatadecl :: NDataDecl -> Doc
ndatadecl (NDATA VersionInfo
n)            = VersionInfo -> Doc
text VersionInfo
"NDATA" Doc -> Doc -> Doc
<+> VersionInfo -> Doc
text VersionInfo
n
--textdecl (TextDecl vi ed)      = text "<?xml" <+> maybe text vi <+>
--                                 encodingdecl ed <> text "?>"
--extparsedent (ExtParsedEnt t c)= maybe textdecl t <+> content c
--extpe (ExtPE t esd)            = maybe textdecl t <+>
--                                 vcat (map extsubsetdecl esd)
notationdecl :: NotationDecl -> Doc
notationdecl (NOTATION VersionInfo
n Either ExternalID PublicID
e)    = VersionInfo -> Doc
text VersionInfo
"<!NOTATION" Doc -> Doc -> Doc
<+> VersionInfo -> Doc
text VersionInfo
n Doc -> Doc -> Doc
<+>
                                 (ExternalID -> Doc)
-> (PublicID -> Doc) -> Either ExternalID PublicID -> Doc
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either ExternalID -> Doc
externalid PublicID -> Doc
publicid Either ExternalID PublicID
e Doc -> Doc -> Doc
<>
                                 VersionInfo -> Doc
text VersionInfo
">"
publicid :: PublicID -> Doc
publicid (PUBLICID PubidLiteral
p)          = VersionInfo -> Doc
text VersionInfo
"PUBLICID" Doc -> Doc -> Doc
<+> PubidLiteral -> Doc
pubidliteral PubidLiteral
p
encodingdecl :: EncodingDecl -> Doc
encodingdecl (EncodingDecl VersionInfo
s)  = VersionInfo -> Doc
text VersionInfo
"encoding='" Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
s Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
"'"
nmtoken :: VersionInfo -> Doc
nmtoken VersionInfo
s                      = VersionInfo -> Doc
text VersionInfo
s
attvalue :: AttValue -> Doc
attvalue (AttValue [Either VersionInfo Reference]
esr)        = VersionInfo -> Doc
text VersionInfo
"\"" Doc -> Doc -> Doc
<>
                                 [Doc] -> Doc
hcat ((Either VersionInfo Reference -> Doc)
-> [Either VersionInfo Reference] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map ((VersionInfo -> Doc)
-> (Reference -> Doc) -> Either VersionInfo Reference -> Doc
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either VersionInfo -> Doc
text Reference -> Doc
reference) [Either VersionInfo Reference]
esr) Doc -> Doc -> Doc
<>
                                 VersionInfo -> Doc
text VersionInfo
"\""
entityvalue :: EntityValue -> Doc
entityvalue (EntityValue [EV]
evs)  = VersionInfo -> Doc
text VersionInfo
"'" Doc -> Doc -> Doc
<> [Doc] -> Doc
hcat ((EV -> Doc) -> [EV] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map EV -> Doc
ev [EV]
evs) Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
"'"
ev :: EV -> Doc
ev (EVString VersionInfo
s)                = VersionInfo -> Doc
text VersionInfo
s
--ev (EVPERef p e)               = peref p
ev (EVRef Reference
r)                   = Reference -> Doc
reference Reference
r
pubidliteral :: PubidLiteral -> Doc
pubidliteral (PubidLiteral VersionInfo
s)  = VersionInfo -> Doc
text VersionInfo
"'" Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
s Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
"'"
systemliteral :: SystemLiteral -> Doc
systemliteral (SystemLiteral VersionInfo
s)= VersionInfo -> Doc
text VersionInfo
"'" Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
s Doc -> Doc -> Doc
<> VersionInfo -> Doc
text VersionInfo
"'"
chardata :: VersionInfo -> Doc
chardata VersionInfo
s                     = if (Char -> SDDecl) -> VersionInfo -> SDDecl
forall (t :: * -> *) a.
Foldable t =>
(a -> SDDecl) -> t a -> SDDecl
all Char -> SDDecl
isSpace VersionInfo
s then Doc
empty else VersionInfo -> Doc
text VersionInfo
s
--cdsect c                       = text "<![CDATA[" <> chardata c <> text "]]>"

qname :: QName -> Doc
qname QName
n                        = VersionInfo -> Doc
text (QName -> VersionInfo
printableName QName
n)

----