{- |
We do not define a tag data type here,
since this is too much bound to the particular use
(e.g. list or tree structure).
However we define a tag name and some special names.
-}
module Text.XML.Basic.Tag (
   Name(..),
   doctype, doctypeName, doctypeString,
   cdata, cdataName, cdataString,
   xmlName, xmlString,
   maybeXMLEncoding,
   ) where

import qualified Text.XML.Basic.Name as Name
import qualified Text.XML.Basic.ProcessingInstruction as PI
import qualified Text.XML.Basic.Attribute as Attr
import Control.Monad (guard, )


newtype Name ident = Name {forall ident. Name ident -> ident
unname :: ident}
   deriving (Name ident -> Name ident -> Bool
forall ident. Eq ident => Name ident -> Name ident -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Name ident -> Name ident -> Bool
$c/= :: forall ident. Eq ident => Name ident -> Name ident -> Bool
== :: Name ident -> Name ident -> Bool
$c== :: forall ident. Eq ident => Name ident -> Name ident -> Bool
Eq, Name ident -> Name ident -> Bool
Name ident -> Name ident -> Ordering
Name ident -> Name ident -> Name ident
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {ident}. Ord ident => Eq (Name ident)
forall ident. Ord ident => Name ident -> Name ident -> Bool
forall ident. Ord ident => Name ident -> Name ident -> Ordering
forall ident. Ord ident => Name ident -> Name ident -> Name ident
min :: Name ident -> Name ident -> Name ident
$cmin :: forall ident. Ord ident => Name ident -> Name ident -> Name ident
max :: Name ident -> Name ident -> Name ident
$cmax :: forall ident. Ord ident => Name ident -> Name ident -> Name ident
>= :: Name ident -> Name ident -> Bool
$c>= :: forall ident. Ord ident => Name ident -> Name ident -> Bool
> :: Name ident -> Name ident -> Bool
$c> :: forall ident. Ord ident => Name ident -> Name ident -> Bool
<= :: Name ident -> Name ident -> Bool
$c<= :: forall ident. Ord ident => Name ident -> Name ident -> Bool
< :: Name ident -> Name ident -> Bool
$c< :: forall ident. Ord ident => Name ident -> Name ident -> Bool
compare :: Name ident -> Name ident -> Ordering
$ccompare :: forall ident. Ord ident => Name ident -> Name ident -> Ordering
Ord)

instance Show ident => Show (Name ident) where
   showsPrec :: Int -> Name ident -> ShowS
showsPrec Int
p = forall a. Show a => Int -> a -> ShowS
showsPrec Int
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall ident. Name ident -> ident
unname

instance Name.Tag ident => Name.C (Name ident) where
   fromString :: String -> Name ident
fromString = forall ident. ident -> Name ident
Name forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall ident. Tag ident => String -> ident
Name.tagFromString
   toString :: Name ident -> String
toString = forall ident. Tag ident => ident -> String
Name.tagToString forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall ident. Name ident -> ident
unname




{-# DEPRECATED doctype "use doctypeName instead" #-}
doctype :: (Name.Tag name) => Name name
doctype :: forall name. Tag name => Name name
doctype = forall name. Tag name => Name name
doctypeName

{-# DEPRECATED cdata "use cdataName instead" #-}
cdata :: (Name.Tag name) => Name name
cdata :: forall name. Tag name => Name name
cdata = forall name. Tag name => Name name
cdataName


doctypeName :: (Name.Tag name) => Name name
doctypeName :: forall name. Tag name => Name name
doctypeName = forall name. C name => String -> name
Name.fromString String
doctypeString

cdataName :: (Name.Tag name) => Name name
cdataName :: forall name. Tag name => Name name
cdataName = forall name. C name => String -> name
Name.fromString String
cdataString

xmlName :: (Name.Tag name) => Name name
xmlName :: forall name. Tag name => Name name
xmlName = forall name. C name => String -> name
Name.fromString String
xmlString


doctypeString :: String
doctypeString :: String
doctypeString = String
"DOCTYPE"

cdataString :: String
cdataString :: String
cdataString = String
"[CDATA["

xmlString :: String
xmlString :: String
xmlString = String
"xml"


maybeXMLEncoding ::
   (Name.Tag name, Name.Attribute name) =>
   Name name -> PI.T name string -> Maybe string
maybeXMLEncoding :: forall name string.
(Tag name, Attribute name) =>
Name name -> T name string -> Maybe string
maybeXMLEncoding Name name
name T name string
instr =
   do forall (f :: * -> *). Alternative f => Bool -> f ()
guard (forall name. Tag name => Name name
xmlName forall a. Eq a => a -> a -> Bool
== Name name
name)
      let (PI.Known [T name string]
attrs) = T name string
instr
      forall name string.
Attribute name =>
Name name -> [T name string] -> Maybe string
Attr.lookup forall name. Attribute name => Name name
Attr.encodingName [T name string]
attrs