{- |
This name uses only lowercase characters as canonical representation,
except for @DOCTYPE@ and @CDATA@.
This is optimal for processing HTML which is case-insensitiv.
-}
module Text.XML.Basic.Name.LowerCase where

import qualified Text.XML.Basic.Name as Name
import qualified Text.XML.Basic.Tag  as Tag
import Data.Char (toLower, toUpper, )


newtype T = Cons String
   deriving (T -> T -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: T -> T -> Bool
$c/= :: T -> T -> Bool
== :: T -> T -> Bool
$c== :: T -> T -> Bool
Eq, Eq T
T -> T -> Bool
T -> T -> Ordering
T -> T -> T
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
min :: T -> T -> T
$cmin :: T -> T -> T
max :: T -> T -> T
$cmax :: T -> T -> T
>= :: T -> T -> Bool
$c>= :: T -> T -> Bool
> :: T -> T -> Bool
$c> :: T -> T -> Bool
<= :: T -> T -> Bool
$c<= :: T -> T -> Bool
< :: T -> T -> Bool
$c< :: T -> T -> Bool
compare :: T -> T -> Ordering
$ccompare :: T -> T -> Ordering
Ord)


instance Show T where
   showsPrec :: Int -> T -> String -> String
showsPrec Int
p (Cons String
s) = forall a. Show a => Int -> a -> String -> String
showsPrec Int
p String
s

instance Name.Tag T where
   tagFromString :: String -> T
tagFromString String
x = String -> T
Cons forall a b. (a -> b) -> a -> b
$
      let xu :: String
xu = forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toUpper String
x
      in  if forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem String
xu forall a b. (a -> b) -> a -> b
$ [String
Tag.doctypeString, String
Tag.cdataString]
            then String
xu
            else forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower String
x
   tagToString :: T -> String
tagToString (Cons String
s) = String
s

instance Name.Attribute T where
   attributeFromString :: String -> T
attributeFromString = String -> T
Cons forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower
   attributeToString :: T -> String
attributeToString (Cons String
s) = String
s