module Text.XML.WraXML.String.HaXml where import Text.XML.HaXml(AttValue(AttValue), Reference, ) import qualified Text.XML.HaXml as HaXml import qualified Text.XML.WraXML.String as XmlString import qualified Text.XML.Basic.Character as XMLChar import Data.Maybe.HT (alternatives, (?->), ) toXmlString :: AttValue -> XmlString.T toXmlString (AttValue s) = concatMap (either XmlString.fromString ((:[]) . refToXmlAtom)) s fromXmlString :: XmlString.T -> AttValue fromXmlString = AttValue . XMLChar.switchUnicodeRuns Left (Right . HaXml.RefChar) (Right . HaXml.RefEntity) lift :: (XmlString.T -> XmlString.T) -> (AttValue -> AttValue) lift f = fromXmlString . f . toXmlString refToXmlAtom :: HaXml.Reference -> XmlString.Atom refToXmlAtom ref = case ref of HaXml.RefChar num -> XMLChar.fromCharRef num HaXml.RefEntity name -> XMLChar.fromEntityRef name charFromXmlAtom' :: XMLChar.T -> Either Char Reference charFromXmlAtom' c = case c of XMLChar.Unicode char -> Left char XMLChar.EntityRef name -> Right (HaXml.RefEntity name) XMLChar.CharRef num -> Right (HaXml.RefChar num) charFromXmlAtom :: XMLChar.T -> Either Char Reference charFromXmlAtom c = alternatives (error "HaXml.charFromXmlAtom: unsupported constructor in XMLChar.T") $ XMLChar.maybeUnicode c ?-> Left : XMLChar.maybeEntityRef c ?-> Right . HaXml.RefEntity : XMLChar.maybeCharRef c ?-> Right . HaXml.RefChar : []