{-# LANGUAGE DeriveDataTypeable #-}
module Text.HTML.TagSoup.Options where
import Data.Typeable
import Text.HTML.TagSoup.Type
import Text.HTML.TagSoup.Entity
import Text.StringLike
data ParseOptions str = ParseOptions
{forall str. ParseOptions str -> Bool
optTagPosition :: Bool
,forall str. ParseOptions str -> Bool
optTagWarning :: Bool
,forall str. ParseOptions str -> (str, Bool) -> [Tag str]
optEntityData :: (str,Bool) -> [Tag str]
,forall str. ParseOptions str -> (str, Bool) -> (str, [Tag str])
optEntityAttrib :: (str,Bool) -> (str,[Tag str])
,forall str. ParseOptions str -> Bool
optTagTextMerge :: Bool
}
deriving Typeable
parseOptionsEntities :: StringLike str => (str -> Maybe str) -> ParseOptions str
parseOptionsEntities :: forall str.
StringLike str =>
(str -> Maybe str) -> ParseOptions str
parseOptionsEntities str -> Maybe str
lookupEntity = Bool
-> Bool
-> ((str, Bool) -> [Tag str])
-> ((str, Bool) -> (str, [Tag str]))
-> Bool
-> ParseOptions str
forall str.
Bool
-> Bool
-> ((str, Bool) -> [Tag str])
-> ((str, Bool) -> (str, [Tag str]))
-> Bool
-> ParseOptions str
ParseOptions Bool
False Bool
False (str, Bool) -> [Tag str]
entityData (str, Bool) -> (str, [Tag str])
entityAttrib Bool
True
where
entityData :: (str, Bool) -> [Tag str]
entityData (str, Bool)
x = str -> Tag str
forall str. str -> Tag str
TagText str
a Tag str -> [Tag str] -> [Tag str]
forall a. a -> [a] -> [a]
: [Tag str]
b
where (str
a,[Tag str]
b) = (str, Bool) -> (str, [Tag str])
entityAttrib (str, Bool)
x
entityAttrib :: (str, Bool) -> (str, [Tag str])
entityAttrib ~(str
x,Bool
b) =
let x' :: str
x' = str
x str -> str -> str
forall a. StringLike a => a -> a -> a
`append` String -> str
forall a. IsString a => String -> a
fromString [Char
';'|Bool
b]
in case str -> Maybe str
lookupEntity str
x' of
Just str
y -> (str
y, [])
Maybe str
Nothing -> (Char -> str
forall a. StringLike a => Char -> a
fromChar Char
'&' str -> str -> str
forall a. StringLike a => a -> a -> a
`append` str
x'
,[str -> Tag str
forall str. str -> Tag str
TagWarning (str -> Tag str) -> str -> Tag str
forall a b. (a -> b) -> a -> b
$ String -> str
forall a. IsString a => String -> a
fromString String
"Unknown entity: " str -> str -> str
forall a. StringLike a => a -> a -> a
`append` str
x])
parseOptions :: StringLike str => ParseOptions str
parseOptions :: forall str. StringLike str => ParseOptions str
parseOptions = (str -> Maybe str) -> ParseOptions str
forall str.
StringLike str =>
(str -> Maybe str) -> ParseOptions str
parseOptionsEntities ((str -> Maybe str) -> ParseOptions str)
-> (str -> Maybe str) -> ParseOptions str
forall a b. (a -> b) -> a -> b
$ (String -> str) -> Maybe String -> Maybe str
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> str
forall a. IsString a => String -> a
fromString (Maybe String -> Maybe str)
-> (str -> Maybe String) -> str -> Maybe str
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Maybe String
lookupEntity (String -> Maybe String) -> (str -> String) -> str -> Maybe String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. str -> String
forall a. StringLike a => a -> String
toString
parseOptionsFast :: StringLike str => ParseOptions str
parseOptionsFast :: forall str. StringLike str => ParseOptions str
parseOptionsFast = ParseOptions str
forall str. StringLike str => ParseOptions str
parseOptions{optTagTextMerge=False}
fmapParseOptions :: (StringLike from, StringLike to) => ParseOptions from -> ParseOptions to
fmapParseOptions :: forall from to.
(StringLike from, StringLike to) =>
ParseOptions from -> ParseOptions to
fmapParseOptions (ParseOptions Bool
a Bool
b (from, Bool) -> [Tag from]
c (from, Bool) -> (from, [Tag from])
d Bool
e) = Bool
-> Bool
-> ((to, Bool) -> [Tag to])
-> ((to, Bool) -> (to, [Tag to]))
-> Bool
-> ParseOptions to
forall str.
Bool
-> Bool
-> ((str, Bool) -> [Tag str])
-> ((str, Bool) -> (str, [Tag str]))
-> Bool
-> ParseOptions str
ParseOptions Bool
a Bool
b (to, Bool) -> [Tag to]
forall {b} {a}.
(StringLike b, StringLike a) =>
(a, Bool) -> [Tag b]
c2 (to, Bool) -> (to, [Tag to])
forall {a} {b} {a}.
(StringLike a, StringLike b, StringLike a) =>
(a, Bool) -> (a, [Tag b])
d2 Bool
e
where
c2 :: (a, Bool) -> [Tag b]
c2 ~(a
x,Bool
y) = (Tag from -> Tag b) -> [Tag from] -> [Tag b]
forall a b. (a -> b) -> [a] -> [b]
map ((from -> b) -> Tag from -> Tag b
forall a b. (a -> b) -> Tag a -> Tag b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap from -> b
forall a b. (StringLike a, StringLike b) => a -> b
castString) ([Tag from] -> [Tag b]) -> [Tag from] -> [Tag b]
forall a b. (a -> b) -> a -> b
$ (from, Bool) -> [Tag from]
c (a -> from
forall a b. (StringLike a, StringLike b) => a -> b
castString a
x, Bool
y)
d2 :: (a, Bool) -> (a, [Tag b])
d2 ~(a
x,Bool
y) = (from -> a
forall a b. (StringLike a, StringLike b) => a -> b
castString from
r, (Tag from -> Tag b) -> [Tag from] -> [Tag b]
forall a b. (a -> b) -> [a] -> [b]
map ((from -> b) -> Tag from -> Tag b
forall a b. (a -> b) -> Tag a -> Tag b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap from -> b
forall a b. (StringLike a, StringLike b) => a -> b
castString) [Tag from]
s)
where (from
r,[Tag from]
s) = (from, Bool) -> (from, [Tag from])
d (a -> from
forall a b. (StringLike a, StringLike b) => a -> b
castString a
x, Bool
y)