module Text.XML.HXT.Parser.XmlDTDTokenParser where
import Text.ParserCombinators.Parsec
import Text.XML.HXT.DOM.Interface
import Text.XML.HXT.DOM.XmlNode ( mkDTDElem
, mkText
)
import qualified Text.XML.HXT.Parser.XmlTokenParser as XT
dtdDeclTokenizer :: GenParser Char state XmlTree
dtdDeclTokenizer
= do
(dcl, al) <- dtdDeclStart
content <- many1 dtdToken
dtdDeclEnd
return $! mkDTDElem 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 $! (mkDTDElem PEREF [(a_peref, r)] [])
attrValue :: GenParser Char state XmlTree
attrValue
= do
v <- XT.attrValue
return $! mkText v
dtdChars :: GenParser Char state XmlTree
dtdChars
= do
v <- many1 (XT.singleChar "%\"'<>[]")
return $! mkText v
percent :: GenParser Char state XmlTree
percent
= do
c <- char '%'
return $! mkText [c]