module Data.GI.GIR.XMLUtils
( nodeToElement
, subelements
, localName
, lookupAttr
, GIRXMLNamespace(..)
, lookupAttrWithNamespace
, childElemsWithLocalName
, childElemsWithNSName
, firstChildWithLocalName
, getElementContent
, xmlLocalName
, xmlNSName
) where
import Text.XML (Element(elementNodes, elementName, elementAttributes),
Node(NodeContent, NodeElement), nameLocalName, Name(..))
import Data.Maybe (mapMaybe, listToMaybe)
import qualified Data.Map as M
import Data.Text (Text)
nodeToElement :: Node -> Maybe Element
nodeToElement :: Node -> Maybe Element
nodeToElement (NodeElement Element
e) = forall a. a -> Maybe a
Just Element
e
nodeToElement Node
_ = forall a. Maybe a
Nothing
subelements :: Element -> [Element]
subelements :: Element -> [Element]
subelements = forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe Node -> Maybe Element
nodeToElement forall b c a. (b -> c) -> (a -> b) -> a -> c
. Element -> [Node]
elementNodes
localName :: Element -> Text
localName :: Element -> Text
localName = Name -> Text
nameLocalName forall b c a. (b -> c) -> (a -> b) -> a -> c
. Element -> Name
elementName
childElemsWithLocalName :: Text -> Element -> [Element]
childElemsWithLocalName :: Text -> Element -> [Element]
childElemsWithLocalName Text
n =
forall a. (a -> Bool) -> [a] -> [a]
filter Element -> Bool
localNameMatch forall b c a. (b -> c) -> (a -> b) -> a -> c
. Element -> [Element]
subelements
where localNameMatch :: Element -> Bool
localNameMatch = (forall a. Eq a => a -> a -> Bool
== Text
n) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Element -> Text
localName
childElemsWithNSName :: GIRXMLNamespace -> Text -> Element -> [Element]
childElemsWithNSName :: GIRXMLNamespace -> Text -> Element -> [Element]
childElemsWithNSName GIRXMLNamespace
ns Text
n = forall a. (a -> Bool) -> [a] -> [a]
filter Element -> Bool
nameMatch forall b c a. (b -> c) -> (a -> b) -> a -> c
. Element -> [Element]
subelements
where nameMatch :: Element -> Bool
nameMatch = (forall a. Eq a => a -> a -> Bool
== Name
name) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Element -> Name
elementName
name :: Name
name = Name {
nameLocalName :: Text
nameLocalName = Text
n
, nameNamespace :: Maybe Text
nameNamespace = forall a. a -> Maybe a
Just (GIRXMLNamespace -> Text
girNamespace GIRXMLNamespace
ns)
, namePrefix :: Maybe Text
namePrefix = forall a. Maybe a
Nothing
}
firstChildWithLocalName :: Text -> Element -> Maybe Element
firstChildWithLocalName :: Text -> Element -> Maybe Element
firstChildWithLocalName Text
n = forall a. [a] -> Maybe a
listToMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Element -> [Element]
childElemsWithLocalName Text
n
getElementContent :: Element -> Maybe Text
getElementContent :: Element -> Maybe Text
getElementContent = forall a. [a] -> Maybe a
listToMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe Node -> Maybe Text
getContent forall b c a. (b -> c) -> (a -> b) -> a -> c
. Element -> [Node]
elementNodes
where getContent :: Node -> Maybe Text
getContent :: Node -> Maybe Text
getContent (NodeContent Text
t) = forall a. a -> Maybe a
Just Text
t
getContent Node
_ = forall a. Maybe a
Nothing
lookupAttr :: Name -> Element -> Maybe Text
lookupAttr :: Name -> Element -> Maybe Text
lookupAttr Name
attr Element
element = forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup Name
attr (Element -> Map Name Text
elementAttributes Element
element)
data GIRXMLNamespace = GLibGIRNS | CGIRNS | CoreGIRNS
deriving Int -> GIRXMLNamespace -> ShowS
[GIRXMLNamespace] -> ShowS
GIRXMLNamespace -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GIRXMLNamespace] -> ShowS
$cshowList :: [GIRXMLNamespace] -> ShowS
show :: GIRXMLNamespace -> String
$cshow :: GIRXMLNamespace -> String
showsPrec :: Int -> GIRXMLNamespace -> ShowS
$cshowsPrec :: Int -> GIRXMLNamespace -> ShowS
Show
girNamespace :: GIRXMLNamespace -> Text
girNamespace :: GIRXMLNamespace -> Text
girNamespace GIRXMLNamespace
GLibGIRNS = Text
"http://www.gtk.org/introspection/glib/1.0"
girNamespace GIRXMLNamespace
CGIRNS = Text
"http://www.gtk.org/introspection/c/1.0"
girNamespace GIRXMLNamespace
CoreGIRNS = Text
"http://www.gtk.org/introspection/core/1.0"
lookupAttrWithNamespace :: GIRXMLNamespace -> Name -> Element -> Maybe Text
lookupAttrWithNamespace :: GIRXMLNamespace -> Name -> Element -> Maybe Text
lookupAttrWithNamespace GIRXMLNamespace
ns Name
attr Element
element =
let attr' :: Name
attr' = Name
attr {nameNamespace :: Maybe Text
nameNamespace = forall a. a -> Maybe a
Just (GIRXMLNamespace -> Text
girNamespace GIRXMLNamespace
ns)}
in forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup Name
attr' (Element -> Map Name Text
elementAttributes Element
element)
xmlLocalName :: Text -> Name
xmlLocalName :: Text -> Name
xmlLocalName Text
n = Name { nameLocalName :: Text
nameLocalName = Text
n
, nameNamespace :: Maybe Text
nameNamespace = forall a. Maybe a
Nothing
, namePrefix :: Maybe Text
namePrefix = forall a. Maybe a
Nothing }
xmlNSName :: GIRXMLNamespace -> Text -> Name
xmlNSName :: GIRXMLNamespace -> Text -> Name
xmlNSName GIRXMLNamespace
ns Text
n = Name { nameLocalName :: Text
nameLocalName = Text
n
, nameNamespace :: Maybe Text
nameNamespace = forall a. a -> Maybe a
Just (GIRXMLNamespace -> Text
girNamespace GIRXMLNamespace
ns)
, namePrefix :: Maybe Text
namePrefix = forall a. Maybe a
Nothing }