module Text.RSS1.Utils
( pQNodes
, pNode
, pQNode
, pLeaf
, pQLeaf
, pQLeaf'
, pAttr
, pAttr'
, pMany
, children
, qualName
, qualName'
, rss10NS
, rdfPrefix
, rdfNS
, synPrefix
, synNS
, taxPrefix
, taxNS
, conPrefix
, conNS
, dcPrefix
, dcNS
, rdfName
, rssName
, synName
, known_rss_elts
, known_syn_elts
, known_dc_elts
, known_tax_elts
, known_con_elts
, removeKnownElts
, removeKnownAttrs
) where
import Prelude.Compat
import Data.XML.Compat
import Data.XML.Types as XML
import Text.DublinCore.Types
import Data.Maybe (listToMaybe, mapMaybe)
import Data.Text (Text)
pQNodes :: Name -> XML.Element -> [XML.Element]
pQNodes :: Name -> Element -> [Element]
pQNodes = Name -> Element -> [Element]
findChildren
pNode :: Text -> XML.Element -> Maybe XML.Element
pNode :: Text -> Element -> Maybe Element
pNode x :: Text
x e :: Element
e = [Element] -> Maybe Element
forall a. [a] -> Maybe a
listToMaybe (Name -> Element -> [Element]
pQNodes ((Maybe Text, Maybe Text) -> Text -> Name
qualName (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
rss10NS, Maybe Text
forall a. Maybe a
Nothing) Text
x) Element
e)
pQNode :: Name -> XML.Element -> Maybe XML.Element
pQNode :: Name -> Element -> Maybe Element
pQNode x :: Name
x e :: Element
e = [Element] -> Maybe Element
forall a. [a] -> Maybe a
listToMaybe (Name -> Element -> [Element]
pQNodes Name
x Element
e)
pLeaf :: Text -> XML.Element -> Maybe Text
pLeaf :: Text -> Element -> Maybe Text
pLeaf x :: Text
x e :: Element
e = Element -> Text
strContent (Element -> Text) -> Maybe Element -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Name -> Element -> Maybe Element
pQNode ((Maybe Text, Maybe Text) -> Text -> Name
qualName (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
rss10NS, Maybe Text
forall a. Maybe a
Nothing) Text
x) Element
e
pQLeaf' :: (Text, Text) -> Text -> XML.Element -> Maybe Text
pQLeaf' :: (Text, Text) -> Text -> Element -> Maybe Text
pQLeaf' (ns :: Text
ns, pre :: Text
pre) = (Text, Maybe Text) -> Text -> Element -> Maybe Text
pQLeaf (Text
ns, Text -> Maybe Text
forall a. a -> Maybe a
Just Text
pre)
pQLeaf :: (Text, Maybe Text) -> Text -> XML.Element -> Maybe Text
pQLeaf :: (Text, Maybe Text) -> Text -> Element -> Maybe Text
pQLeaf (ns :: Text
ns, pre :: Maybe Text
pre) x :: Text
x e :: Element
e = Element -> Text
strContent (Element -> Text) -> Maybe Element -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Name -> Element -> Maybe Element
pQNode ((Maybe Text, Maybe Text) -> Text -> Name
qualName (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
ns, Maybe Text
pre) Text
x) Element
e
pAttr :: (Maybe Text, Maybe Text) -> Text -> XML.Element -> Maybe Text
pAttr :: (Maybe Text, Maybe Text) -> Text -> Element -> Maybe Text
pAttr ns :: (Maybe Text, Maybe Text)
ns x :: Text
x = Name -> Element -> Maybe Text
attributeText ((Maybe Text, Maybe Text) -> Text -> Name
qualName (Maybe Text, Maybe Text)
ns Text
x)
pAttr' :: (Text, Text) -> Text -> XML.Element -> Maybe Text
pAttr' :: (Text, Text) -> Text -> Element -> Maybe Text
pAttr' (ns :: Text
ns, pre :: Text
pre) = (Maybe Text, Maybe Text) -> Text -> Element -> Maybe Text
pAttr (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
ns, Text -> Maybe Text
forall a. a -> Maybe a
Just Text
pre)
pMany :: (Maybe Text, Maybe Text) -> Text -> (XML.Element -> Maybe a) -> XML.Element -> [a]
pMany :: (Maybe Text, Maybe Text)
-> Text -> (Element -> Maybe a) -> Element -> [a]
pMany ns :: (Maybe Text, Maybe Text)
ns p :: Text
p f :: Element -> Maybe a
f e :: Element
e = (Element -> Maybe a) -> [Element] -> [a]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe Element -> Maybe a
f (Name -> Element -> [Element]
pQNodes ((Maybe Text, Maybe Text) -> Text -> Name
qualName (Maybe Text, Maybe Text)
ns Text
p) Element
e)
children :: XML.Element -> [XML.Element]
children :: Element -> [Element]
children = Element -> [Element]
elementChildren
qualName :: (Maybe Text, Maybe Text) -> Text -> Name
qualName :: (Maybe Text, Maybe Text) -> Text -> Name
qualName (ns :: Maybe Text
ns, pre :: Maybe Text
pre) x :: Text
x = Text -> Maybe Text -> Maybe Text -> Name
Name Text
x Maybe Text
ns Maybe Text
pre
qualName' :: (Text, Text) -> Text -> Name
qualName' :: (Text, Text) -> Text -> Name
qualName' (ns :: Text
ns, pre :: Text
pre) x :: Text
x = Text -> Maybe Text -> Maybe Text -> Name
Name Text
x (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
ns) (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
pre)
rss10NS :: Text
= "http://purl.org/rss/1.0/"
rdfPrefix, rdfNS :: Text
rdfNS :: Text
rdfNS = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
rdfPrefix :: Text
rdfPrefix = "rdf"
synPrefix, synNS :: Text
synNS :: Text
synNS = "http://purl.org/rss/1.0/modules/syndication/"
synPrefix :: Text
synPrefix = "sy"
taxPrefix, taxNS :: Text
taxNS :: Text
taxNS = "http://purl.org/rss/1.0/modules/taxonomy/"
taxPrefix :: Text
taxPrefix = "taxo"
conPrefix, conNS :: Text
conNS :: Text
conNS = "http://purl.org/rss/1.0/modules/content/"
conPrefix :: Text
conPrefix = "content"
dcPrefix, dcNS :: Text
dcNS :: Text
dcNS = "http://purl.org/dc/elements/1.1/"
dcPrefix :: Text
dcPrefix = "dc"
rdfName :: Text -> Name
rdfName :: Text -> Name
rdfName x :: Text
x = Text -> Maybe Text -> Maybe Text -> Name
Name Text
x (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
rdfNS) (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
rdfPrefix)
rssName :: Text -> Name
x :: Text
x = Text -> Maybe Text -> Maybe Text -> Name
Name Text
x (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
rss10NS) Maybe Text
forall a. Maybe a
Nothing
synName :: Text -> Name
synName :: Text -> Name
synName x :: Text
x = Text -> Maybe Text -> Maybe Text -> Name
Name Text
x (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
synNS) (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
synPrefix)
known_rss_elts :: [Name]
= (Text -> Name) -> [Text] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map Text -> Name
rssName ["channel", "item", "image", "textinput"]
known_syn_elts :: [Name]
known_syn_elts :: [Name]
known_syn_elts = (Text -> Name) -> [Text] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map Text -> Name
synName ["updateBase", "updateFrequency", "updatePeriod"]
known_dc_elts :: [Name]
known_dc_elts :: [Name]
known_dc_elts = (Text -> Name) -> [Text] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map ((Text, Text) -> Text -> Name
qualName' (Text
dcNS, Text
dcPrefix)) [Text]
dc_element_names
known_tax_elts :: [Name]
known_tax_elts :: [Name]
known_tax_elts = (Text -> Name) -> [Text] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map ((Text, Text) -> Text -> Name
qualName' (Text
taxNS, Text
taxPrefix)) ["topic", "topics"]
known_con_elts :: [Name]
known_con_elts :: [Name]
known_con_elts = (Text -> Name) -> [Text] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map ((Text, Text) -> Text -> Name
qualName' (Text
conNS, Text
conPrefix)) ["items", "item", "format", "encoding"]
removeKnownElts :: XML.Element -> [XML.Element]
removeKnownElts :: Element -> [Element]
removeKnownElts e :: Element
e = (Element -> Bool) -> [Element] -> [Element]
forall a. (a -> Bool) -> [a] -> [a]
filter (\e1 :: Element
e1 -> Element -> Name
elementName Element
e1 Name -> [Name] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Name]
known_elts) (Element -> [Element]
elementChildren Element
e)
where
known_elts :: [Name]
known_elts =
[[Name]] -> [Name]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Name]
known_rss_elts, [Name]
known_syn_elts, [Name]
known_dc_elts, [Name]
known_con_elts, [Name]
known_tax_elts]
removeKnownAttrs :: XML.Element -> [Attr]
removeKnownAttrs :: Element -> [Attr]
removeKnownAttrs e :: Element
e = (Attr -> Bool) -> [Attr] -> [Attr]
forall a. (a -> Bool) -> [a] -> [a]
filter ((Name -> [Name] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Name]
known_attrs) (Name -> Bool) -> (Attr -> Name) -> Attr -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Attr -> Name
forall a b. (a, b) -> a
fst) (Element -> [Attr]
elementAttributes Element
e)
where
known_attrs :: [Name]
known_attrs = (Text -> Name) -> [Text] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map Text -> Name
rdfName ["about"]