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
import Text.XML.HXT.Parser.XmlCharParser ( XParser )
dtdDeclTokenizer :: XParser s XmlTree
dtdDeclTokenizer :: forall s. XParser s XmlTree
dtdDeclTokenizer
= do
(DTDElem
dcl, Attributes
al) <- forall s. XParser s (DTDElem, Attributes)
dtdDeclStart
[XmlTree]
content <- forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 forall s. XParser s XmlTree
dtdToken
forall s. XParser s ()
dtdDeclEnd
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ DTDElem -> Attributes -> [XmlTree] -> XmlTree
mkDTDElem' DTDElem
dcl Attributes
al [XmlTree]
content
dtdDeclStart :: XParser s (DTDElem, Attributes)
dtdDeclStart :: forall s. XParser s (DTDElem, Attributes)
dtdDeclStart
= forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
(<|>) forall a b. (a -> b) -> a -> b
$
forall a b. (a -> b) -> [a] -> [b]
map (forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall s. [Char] -> DTDElem -> XParser s (DTDElem, Attributes)
dtdStart) forall a b. (a -> b) -> a -> b
$
[ ([Char]
"ELEMENT", DTDElem
ELEMENT )
, ([Char]
"ATTLIST", DTDElem
ATTLIST )
, ([Char]
"ENTITY", DTDElem
ENTITY )
, ([Char]
"NOTATION", DTDElem
NOTATION)
]
where
dtdStart :: String -> DTDElem -> XParser s (DTDElem, Attributes)
dtdStart :: forall s. [Char] -> DTDElem -> XParser s (DTDElem, Attributes)
dtdStart [Char]
dcl DTDElem
element
= forall tok st a. GenParser tok st a -> GenParser tok st a
try ( do
[Char]
_ <- forall s (m :: * -> *) u.
Stream s m Char =>
[Char] -> ParsecT s u m [Char]
string [Char]
"<!"
[Char]
_ <- forall s (m :: * -> *) u.
Stream s m Char =>
[Char] -> ParsecT s u m [Char]
string [Char]
dcl
SourcePos
pos <- forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
forall (m :: * -> *) a. Monad m => a -> m a
return (DTDElem
element, [ ([Char]
a_source, SourcePos -> [Char]
sourceName SourcePos
pos)
, ([Char]
a_line, forall a. Show a => a -> [Char]
show (SourcePos -> Line
sourceLine SourcePos
pos))
, ([Char]
a_column, forall a. Show a => a -> [Char]
show (SourcePos -> Line
sourceColumn SourcePos
pos))
]
)
)
dtdDeclEnd :: XParser s ()
dtdDeclEnd :: forall s. XParser s ()
dtdDeclEnd
= do
()
_ <- forall s. XParser s ()
XT.gt
forall (m :: * -> *) a. Monad m => a -> m a
return ()
dtdToken :: XParser s XmlTree
dtdToken :: forall s. XParser s XmlTree
dtdToken
= forall s. XParser s XmlTree
dtdChars
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
forall s. XParser s XmlTree
entityValue
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
forall tok st a. GenParser tok st a -> GenParser tok st a
try forall s. XParser s XmlTree
peReference
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
forall s. XParser s XmlTree
percent
forall s u (m :: * -> *) a.
ParsecT s u m a -> [Char] -> ParsecT s u m a
<?> [Char]
"DTD token"
peReference :: XParser s XmlTree
peReference :: forall s. XParser s XmlTree
peReference
= do
[Char]
r <- forall s. XParser s [Char]
XT.peReference
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$! (DTDElem -> Attributes -> [XmlTree] -> XmlTree
mkDTDElem' DTDElem
PEREF [([Char]
a_peref, [Char]
r)] [])
entityValue :: XParser s XmlTree
entityValue :: forall s. XParser s XmlTree
entityValue
= do
[Char]
v <- forall s. XParser s [Char]
XT.entityValue
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ [Char] -> XmlTree
mkText' [Char]
v
dtdChars :: XParser s XmlTree
dtdChars :: forall s. XParser s XmlTree
dtdChars
= do
[Char]
v <- forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (forall s. [Char] -> XParser s Char
XT.singleChar [Char]
"%\"'<>[]")
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ [Char] -> XmlTree
mkText' [Char]
v
percent :: XParser s XmlTree
percent :: forall s. XParser s XmlTree
percent
= do
Char
c <- forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'%'
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ [Char] -> XmlTree
mkText' [Char
c]