module Text.XML.HXT.Parser.XmlDTDTokenParser where
import Text.ParserCombinators.Parsec
import Text.ParserCombinators.Parsec.Pos
import Text.XML.HXT.DOM.XmlTree hiding (choice)
import qualified Text.XML.HXT.Parser.XmlTokenParser as XT
dtdDeclTokenizer :: GenParser Char state XmlTree
dtdDeclTokenizer
= do
(dcl, al) <- dtdDeclStart
content <- many1 dtdToken
dtdDeclEnd
return (NTree (XDTD dcl al) content)
dtdDeclStart :: GenParser Char state (DTDElem, Attributes)
dtdDeclStart
= foldr1 (<|>) $
map (uncurry dtdStart) $
[ ("ELEMENT", ELEMENT )
, ("ATTLIST", ATTLIST )
, ("ENTITY", ENTITY )
, ("NOTATION", NOTATION)
]
where
dtdStart :: String -> DTDElem -> GenParser Char state (DTDElem, Attributes)
dtdStart dcl element
= try ( do
string "<!"
string dcl
pos <- getPosition
return (element, [ (a_source, sourceName pos)
, (a_line, show (sourceLine pos))
, (a_column, show (sourceColumn pos))
]
)
)
dtdDeclEnd :: GenParser Char state ()
dtdDeclEnd
= do
XT.gt
return ()
dtdToken :: GenParser Char state XmlTree
dtdToken
= dtdChars
<|>
attrValue
<|>
try peReference
<|>
percent
<?> "DTD token"
peReference :: GenParser Char state XmlTree
peReference
= do
r <- XT.peReference
return (mkXPERefTree r)
attrValue :: GenParser Char state XmlTree
attrValue
= do
v <- XT.attrValue
return (mkXTextTree v)
dtdChars :: GenParser Char state XmlTree
dtdChars
= do
v <- many1 (XT.singleChar "%\"'<>[]")
return (mkXTextTree v)
percent :: GenParser Char state XmlTree
percent
= do
c <- char '%'
return (mkXTextTree [c])