-- |
-- basic XmlTree filter
module Text.XML.HXT.DOM.XmlTreeFilter
( module Text.XML.HXT.DOM.XmlTreeFilter
)
where
import Text.XML.HXT.DOM.XmlTreeTypes
import Text.XML.HXT.DOM.XmlTreeFunctions
import Text.XML.HXT.DOM.XmlKeywords
import Text.XML.HXT.DOM.Unicode ( isXmlSpaceChar )
import Text.XML.HXT.DOM.Util ( decimalStringToInt )
import Data.List ( partition )
infixl 7 += , ++=
-- -----------------------------------------------------------------------------
--
-- filter predicates
-- |
-- test whether the root of a tree contains a document root node.
isRoot :: XmlFilter
isRoot = isOfNode (isTagNode t_root)
-- |
-- test whether the root of a tree contains a tag node.
--
-- see also: 'isNsTag'
isTag :: String -> XmlFilter
isTag tn = isOfNode (isTagNode tn)
-- |
-- namespace aware test whether the root of a tree contains a tag node. Parameters are the local part and namespace.
-- Only usable after namespace propagation.
--
-- see also: 'isTag'
isNsTag :: String -> String -> XmlFilter
isNsTag lp ns = isOfTag (\ t -> localPart t == lp && namespaceUri t == ns)
-- |
-- test whether the root of a tree has a given local name
-- see also : 'hasNamespace', 'hasPrefix', 'isTag', 'isAttr'
hasLocalPart :: String -> XmlFilter
hasLocalPart lp = isOf ((== lp) . localPartOf)
-- |
-- test whether the root of a tree has a given prefix name
-- see also : 'hasNamespace', 'hasLocalPart', 'isTag', 'isAttr'
hasPrefix :: String -> XmlFilter
hasPrefix px = isOf ((== px) . prefixOf)
-- |
-- test whether the root of a tree belongs to a given namespace
-- see also : 'isTag', 'isAttr', 'hasLocalPart', 'hasPrefix'
hasNamespace :: String -> XmlFilter
hasNamespace ns = isOf ((== ns) . namespaceOf)
-- |
-- test whether the root of a tree contains a tag node with a special name.
isOfTag :: (TagName -> Bool) -> XmlFilter
isOfTag = isOfNode . isOfTagNode
-- |
-- test whether the node of a tree is a XTag node or a XPi node with an attibute of a specific name
--
-- see also: 'isAttr', 'hasNsAttr'
hasAttr :: String -> XmlFilter
hasAttr an = (getAttrl .> isAttr an) `guards` this
-- |
-- test whether the tree is a XTag node with an attibute of a specific local name and namespace uri
--
-- see also: 'hasAttr', 'isNsAttr'
hasNsAttr :: String -> String -> XmlFilter
hasNsAttr an ns = (getAttrl .> isNsAttr an ns) `guards` this
-- |
-- test whether the given node is a XTag node or a XPI node with an attribute with a value with a specific property.
-- In case of a match, the attribute value represented by a text node is returned as single element list,
-- else the empty list is the result.
--
-- see also : 'getValue'
hasValue :: String -> (String -> Bool) -> XmlFilter
hasValue a p t
| (not . null) att
&&
p val
= xtext val
| otherwise
= []
where
att = getAttrl .> isAttr a $ t
val = xshow . getChildren $$ att
-- |
-- test whether the tree is a processing instruction with a given name.
isPi :: String -> XmlFilter
isPi pn = isOfNode (isPiNode pn)
-- |
-- test whether the tree is a \ declaration
isXmlPi :: XmlFilter
isXmlPi = isPi t_xml
-- |
-- test whether the root of a tree contains a processing instruction of a special name.
isOfPi :: (TagName -> Bool) -> XmlFilter
isOfPi = isOfNode . isOfPiNode
-- -----------------------------------------------------------------------------
-- simple XNode Filter predicates
--
-- |
-- test whether the root of a tree contains a CDATA node.
isXCdata :: XmlFilter
isXCdata = isOfNode isXCdataNode
-- |
-- test whether the root of a tree contains a character reference node.
isXCharRef :: XmlFilter
isXCharRef = isOfNode isXCharRefNode
-- |
-- test whether the root of a tree contains a comment node.
isXCmt :: XmlFilter
isXCmt = isOfNode isXCmtNode
-- |
-- test whether the root of a tree contains a DTD part.
isXDTD :: XmlFilter
isXDTD = isOfNode isXDTDNode
-- |
-- test whether the root of a tree contains an entity reference node.
isXEntityRef :: XmlFilter
isXEntityRef = isOfNode isXEntityRefNode
-- |
-- test whether the root of a tree contains an error node.
isXError :: XmlFilter
isXError = isOfNode isXErrorNode
-- |
-- test whether the root of a tree contains a processing instruction node.
isXPi :: XmlFilter
isXPi = isOfNode isXPiNode
-- |
-- test whether the root of a tree contains a tag node.
isXTag :: XmlFilter
isXTag = isOfNode isXTagNode
-- |
-- test whether the root of a tree contains an attribute node.
isXAttr :: XmlFilter
isXAttr = isOfNode isXAttrNode
-- |
-- test whether the root of a tree is an attribute node for a given attribute name
isAttr :: String -> XmlFilter
isAttr an = isOfNode (isAttrNode an)
-- |
-- namespace aware test whether the tree contains an attribute node. Parameters are the local part of the atribute name and the namespace.
-- Only usable after namespace propagation.
--
-- see also: 'isNsTag', 'isAttr', 'hasNsAttr'
isNsAttr :: String -> String -> XmlFilter
isNsAttr lp ns = isOfAttr (\ a -> localPart a == lp && namespaceUri a == ns)
-- |
-- general test for an attribute name
isOfAttr :: (AttrName -> Bool) -> XmlFilter
isOfAttr = isOfNode . isOfAttrNode
-- |
-- test whether the root of a tree contains a text node.
isXText :: XmlFilter
isXText = isOfNode isXTextNode
-- |
-- test whether the root of a tree contains a special text.
isText :: String -> XmlFilter
isText t = isOfNode (isTextNode t)
-- |
-- test whether the root of a tree contains a text node with a special property
isOfText :: (String -> Bool) -> XmlFilter
isOfText = isOfNode . isOfTextNode
-- |
-- test whether the root of a tree contains a text node only with whitespace.
isWhiteSpace :: XmlFilter
isWhiteSpace
= isOfNode isWS
where
isWS n
= isXTextNode n
&& all isXmlSpaceChar (textOfXNode n)
-- ------------------------------------------------------------
--
-- XDTD Predicates
-- |
-- test whether the root of a tree contains a DOCTYPE DTD part.
isDoctype :: XmlFilter
isDoctype = isOfNode (isDTDElemNode DOCTYPE)
-- |
-- test whether the root of a tree contains an ATTLIST DTD part.
isAttlist :: XmlFilter
isAttlist = isOfNode (isDTDElemNode ATTLIST)
-- |
-- test whether the root of a tree contains an ELEMENT DTD part.
isElement :: XmlFilter
isElement = isOfNode (isDTDElemNode ELEMENT)
-- |
-- test whether the root of a tree contains an ENTITY DTD part.
isEntity :: XmlFilter
isEntity = isOfNode (isDTDElemNode ENTITY)
-- |
-- test whether the root of a tree contains a parameter ENTITY reference.
isPeRef :: XmlFilter
isPeRef = isOfNode (isDTDElemNode PEREF)
-- |
-- test whether the root of a tree contains a DTD name part.
isDTDName :: XmlFilter
isDTDName = isOfNode (isDTDElemNode NAME)
-- |
-- test whether the root of a tree contains a conditional section DTD part.
isCondSect :: XmlFilter
isCondSect = isOfNode (isDTDElemNode CONDSECT)
-- |
-- test whether the root of a tree contains a parameter entity declaration.
isParameterEntity :: XmlFilter
isParameterEntity = isOfNode (isDTDElemNode PENTITY)
-- |
-- test whether the root of a tree contains a NOTATION DTD part.
isNotation :: XmlFilter
isNotation = isOfNode (isDTDElemNode NOTATION)
-- ATTLIST predicates
isDefaultAttrKind :: XmlFilter
isDefaultAttrKind = isOf (a_kind `ofDTDequals` k_default)
isEnumAttrType :: XmlFilter
isEnumAttrType = isOf (a_type `ofDTDequals` k_enumeration)
isFixedAttrKind :: XmlFilter
isFixedAttrKind = isOf (a_kind `ofDTDequals` k_fixed)
isIdAttrType :: XmlFilter
isIdAttrType = isOf (a_type `ofDTDequals` k_id)
isIdRefAttrType :: XmlFilter
isIdRefAttrType = isOf ((`elem` [k_idref, k_idrefs]) . valueOfDTD a_type)
isNotationAttrType :: XmlFilter
isNotationAttrType = isOf (a_type `ofDTDequals` k_notation)
isRequiredAttrKind :: XmlFilter
isRequiredAttrKind = isOf (a_kind `ofDTDequals` k_required)
isAttlistParameterEntity :: XmlFilter
isAttlistParameterEntity = isAttlist .> isOf (a_type `ofDTDequals` k_peref)
-- ELEMENT predicates
isEmptyElement :: XmlFilter
isEmptyElement = isOf (a_type `ofDTDequals` k_empty)
isMixedContentElement :: XmlFilter
isMixedContentElement = isOf (a_type `ofDTDequals` v_mixed)
isElemWithContent :: XmlFilter
isElemWithContent = isElement
.>
isOf ((`elem` [v_mixed, v_children]) . valueOfDTD a_type)
isAttlistOfElement :: String -> XmlFilter
isAttlistOfElement el = isAttlist
.>
isOf (a_name `ofDTDequals` el)
isElemContentParamEntity :: XmlFilter
isElemContentParamEntity = isElement
.>
isOf (a_type `ofDTDequals` k_peref)
-- ENTITY predicates
isUnparsedEntity :: XmlFilter
isUnparsedEntity = isOf (hasEntry k_ndata . attrlOfDTD)
isExternalParameterEntity :: XmlFilter
isExternalParameterEntity = isParameterEntity
.>
isOf (hasEntry k_system . attrlOfDTD)
isInternalParameterEntity :: XmlFilter
isInternalParameterEntity = isParameterEntity
.> isOf (not . hasEntry k_system . attrlOfDTD)
-- -----------------------------------------------------------------------------
-- |
-- test whether the root of a tree contains an error node for a warning.
isWarning :: XmlFilter
isWarning = isOfNode $ isErrorNode c_warn
-- |
-- test whether the root of a tree contains an error node for an error.
isError :: XmlFilter
isError = isOfNode $ isErrorNode c_err
-- |
-- test whether the root of a tree contains an error node for a fatal error.
isFatalError :: XmlFilter
isFatalError = isOfNode $ isErrorNode c_fatal
-- -----------------------------------------------------------------------------
--
-- constructor filter
-- |
-- constructor filter for a tag node.
-- a new tree is constructed.
-- the attributes and the children are computed by applying the aproprate filter to the input tree
--
-- * 1.parameter n : the tag name
--
-- - 2.parameter af : the filter for the attribute list
--
-- - 3.parameter cf : the filter for the children
--
-- - returns : the constructor filter
mkXTag :: String -> XmlFilter -> XmlFilter -> XmlFilter
mkXTag n af cf
= \ t -> [ mkXTagTree n (af t) (cf t) ]
-- | Version with qualified names of 'mkXTag'
mkQTag :: QName -> XmlFilter -> XmlFilter -> XmlFilter
mkQTag q af cf
= \ t -> [ mkQTagTree q (af t) (cf t) ]
-- |
-- constructor filter for a tag node.
-- a new tree is constructed.
-- the attributes and the children are computed by applying the aproprate filter to the input tree
--
-- * 1.parameter n : the tag name in form of prefix:localpart
--
-- - 2.parameter ns: the namespace uri
--
-- - 3.parameter af : the filter for the attribute list
--
-- - 4.parameter cf : the filter for the children
--
-- - returns : the constructor filter
mkXNsTag :: String -> String -> XmlFilter -> XmlFilter -> XmlFilter
mkXNsTag n ns af cf
= \ t -> [ mkXNsTagTree n ns (af t) (cf t) ]
-- |
-- filter for attribute construction.
-- a new tree with attribute name and a value computed by a filter
-- is build.
mkXAttr :: String -> XmlFilter -> XmlFilter
mkXAttr n af
= \ t -> [ mkXAttrTree n (af t) ]
-- | Qualified version 'mkXAttr'
mkQAttr :: QName -> XmlFilter -> XmlFilter
mkQAttr q af
= \ t -> [ mkQAttrTree q (af t) ]
-- |
-- filter for attribute construction.
-- a new tree with attribute name and namespace and a value computed by a filter
-- is build.
mkXNsAttr :: String -> String -> XmlFilter -> XmlFilter
mkXNsAttr n ns af
= \ t -> [ mkXNsAttrTree n ns (af t) ]
-- |
-- constructor filter for a text node.
-- a new tree is constructed.
-- the input tree is ignored.
mkXText :: String -> XmlFilter
mkXText = mkNTree . mkXTextTree
-- |
-- constructor filter for a character reference node.
-- a new tree is constructed.
-- the input tree is ignored.
mkXCharRef :: Int -> XmlFilter
mkXCharRef = mkNTree . mkXCharRefTree
-- |
-- constructor filter for an entity reference node.
-- a new tree is constructed.
-- the input tree is ignored.
mkXEntityRef :: String -> XmlFilter
mkXEntityRef = mkNTree . mkXEntityRefTree
-- |
-- constructor filter for a comment node.
-- a new tree is constructed.
-- the xml string representation of the filter result
-- forms the comment
mkXCmt :: XmlFilter -> XmlFilter
mkXCmt cf
= \ t -> [ mkXCmtTree ((xshow . cf) t) ]
-- |
-- constructor filter for a DTD part.
-- a new tree is constructed.
-- the input tree is ignored.
mkXDTD :: DTDElem -> Attributes -> XmlTrees -> XmlFilter
mkXDTD n al = mkNTree . mkXDTDTree n al
-- |
-- constructor filter for a CDATA section node.
-- a new tree is constructed.
-- the input tree is ignored.
mkXCdata :: XmlFilter -> XmlFilter
mkXCdata cf
= \ t -> [ mkXCdataTree ((xshow . cf) t) ]
-- |
-- constructor filter for a processing instruction
-- a new tree is constructed from the text representation
-- of the input tree
mkXPi :: String -> XmlFilter -> XmlFilter
mkXPi piName cf
= \ t -> [ mkXPiTree piName ((xshow . cf) t) ]
-- |
-- constructor filter for an error message node.
-- a new tree is constructed.
-- the input tree is ignored.
mkXError :: Int -> String -> XmlFilter
mkXError l s = this . mkXErrorTree l s . this
-- -----------------------------------------------------------------------------
--
-- selector filters
-- |
-- filter for selecting the name of a tag node, an attribute node or a pi node.
-- Result of the filter is a single element list with a text node or the empty list
getName :: XmlFilter
getName t
| null s = []
| otherwise = xtext s
where
s = nameOf t
-- |
-- filter for selecting the attibute list
getAttrl :: XmlFilter
getAttrl
= selAttrl . getNode
where
selAttrl (XTag _ al) = al
selAttrl (XPi _ al) = al
selAttrl _ = []
-- |
-- filter for selecting the value of an attribute in a tag node.
-- Result of the filter is a single element list with a text node or the empty list
--
-- see also : 'hasValue', 'getNsValue'
getValue :: String -> XmlFilter
getValue a = xmlTreesToText . (getAttrl .> isAttr a .> getChildren)
-- |
-- filter for selecting the value of an attribute with namespace in a tag node.
-- Result of the filter is a single element list with a text node or the empty list
--
-- see also : 'getValue', 'isNsAttr'
getNsValue :: String -> String -> XmlFilter
getNsValue lp ns = xmlTreesToText . (getAttrl .> isNsAttr lp ns .> getChildren)
-- |
-- filter for selecting an attribute of a DTD node.
-- Result of the filter is a single element list with a text node or the empty list
getDTDValue :: String -> XmlFilter
getDTDValue a = xtext . valueOfDTD a
-- |
-- filter for selecting content of a comment.
-- Result of the filter is a single element list with a text node or the empty list
getXCmt :: XmlFilter
getXCmt
= selCmt . getNode
where
selCmt (XCmt c) = xtext c
selCmt _ = []
-- |
-- filter for selecting the CDATA content.
-- Result of the filter is a single element list with a text node or the empty list
getXCdata :: XmlFilter
getXCdata
= selData . getNode
where
selData (XCdata d) = xtext d
selData _ = []
-- -----------------------------------------------------------------------------
--
-- edit filter
-- |
-- edit filter for changing the name of a tag node, an attribute or a pi.
-- result of the filter is a single element list with a tag node or the empty list
replaceQName :: String -> XmlFilter
replaceQName n = modifyQName (const (mkName n))
-- |
-- edit filter for changing the text of a text node.
-- result of the filter is a single element list with a text node or the empty list
--
-- example for editing all text nodes of a tree with an edit function @f@:
--
-- @processBottomUp (modifyText f \`when\` isXText)@
modifyText :: (String -> String) -> XmlFilter
modifyText f t@(NTree n _)
| isXTextNode n = replaceNode (XText (f (textOfXNode n))) t
modifyText _ _ = []
-- |
-- edit filter for changing the name of a tag node.
-- result of the filter is a single element list with a text node or the empty list
modifyQName :: (TagName -> TagName) -> XmlFilter
modifyQName f (NTree (XTag n al) cs) = [NTree (XTag (f n) al) cs]
modifyQName f (NTree (XPi n al) cs) = [NTree (XPi (f n) al) cs]
modifyQName f (NTree (XAttr n) cs) = [NTree (XAttr (f n) ) cs]
modifyQName _ _ = []
-- -----------------------------------------------------------------------------
-- |
-- process the attribute list of a tag node with a tree list filter.
-- for other trees this filter acts like 'none'
processAttrl :: XmlSFilter -> XmlFilter
processAttrl f t
= replaceAttrl (f al) t
where
al = getAttrl t
-- |
-- elementwise processing of the attributes of a tag.
-- for other trees this filter acts like 'none'
--
-- see also : 'processAttrl'
processAttr :: XmlFilter -> XmlFilter
processAttr f
= processAttrl (f $$)
-- |
-- replace an attribute list
-- to be renamed when replaceAttrl is eliminated
replaceAttrl :: XmlTrees -> XmlFilter
replaceAttrl al (NTree (XTag n _al) cs) = [ NTree (XTag n al) cs ]
replaceAttrl al (NTree (XPi n _al) cs) = [ NTree (XPi n al) cs ]
replaceAttrl _ _ = []
-- |
-- delete an attribute from the attribute list of a tag tree
del1Attr :: String -> XmlFilter
del1Attr an = processAttr (none `when` isAttr an)
-- |
-- add an attribute to the attribute list of a tag.
-- If the attribute already exists, it\'s substituted,
--
-- see also: 'sattr', '+='
add1Attr :: XmlTree -> XmlFilter
add1Attr a@(NTree (XAttr an) _av) t
= replaceAttrl (replace al) t
where
al = getAttrl t
replace [] = [a]
replace (a1 : as)
| satisfies (isAttr (qualifiedName an)) a1
= a : as
| otherwise
= a1 : replace as
add1Attr _ t
= this t
-- |
-- adds an attribute list computed by a filter, uses 'add1Attr'.
--
-- see also: '+='
addAttrl :: XmlFilter -> XmlFilter
addAttrl attrFilter t
= ((foldl (.>) this . map add1Attr) al) t
where
al = attrFilter t
-- |
-- add or change an attribute with a given string as value for a XTag or XPi tree,
-- uses 'add1Attr'.
addAttr :: String -> String -> XmlFilter
addAttr an av
= add1Attr (mkXAttrTree an (if null av then [] else xtext av))
-- |
-- add or change an attribute with an Int value.
-- uses 'addAttr'.
addAttrInt :: String -> Int -> XmlFilter
addAttrInt an av
= addAttr an (show av)
-- |
-- edit filter for changing the value of an attribute in a tag node.
-- result of the filter is a single element list with the tag node or the empty list.
--
-- * 1.parameter n : the name of the attribute
--
-- - 2.parameter f : the edit function for the attribute value
--
-- - returns : the edit filter
modifyAttr :: String -> (String -> String) -> XmlFilter
modifyAttr an f
= processAttr (modifyValue `when` isAttr an)
where
modifyValue = modifyChildren ((modifyText f $$) . xmlTreesToText)
-- |
-- add or change an attribute of a DTD tree
addDTDAttr :: String -> String -> XmlFilter
addDTDAttr an av (NTree (XDTD e al) cs)
= [NTree (XDTD e (addEntry an av al)) cs]
addDTDAttr _ _ _
= []
-- -----------------------------------------------------------------------------
--
-- |
-- convenient function for tag node tree construction
--
-- infixl 7
--
-- filter combinator for tag tree constrcution
-- take a 1. filter for computing a tag node tree (or a whole list of tag node trees)
-- then add all trees computed by the 2. filter to the attribute list when they represent attributes
-- else append them to the list of children.
--
-- if the 1. filter computes a list of tag nodes, the results of the 2. filter are added to all trees
--
-- example: @ etag \"a\" += sattr \"href\" \"\#42\" += txt \"the answer\" @
-- gives the tree @ \the answer\<\/a\> @
--
-- example: @ ( etag \"a\" +++ etag \"b\" ) += sattr \"x\" \"42\" @
-- gives the tree @ \\ @
--
-- see also : 'etag', 'tag', 'add1Attr', 'modifyChildren', '++='
(+=) :: XmlFilter -> XmlFilter -> XmlFilter
(+=) tf cf t
= concat
[ ( isXTag `guards` ( addaf .> addcf )) $ t'
| t' <- tf t
]
where
(as, cs) = partition (satisfies isXAttr) . cf $ t
addaf | null as = this
| otherwise = addAttrl (const as)
addcf | null cs = this
| otherwise = modifyChildren (++ cs)
-- |
-- convenient filter function adding a whole list of trees, just for not writing to many ( ... ).
--
-- infixl 7
--
-- @ f ++= gl == f += cat gl @
--
-- see also : '+='
(++=) :: XmlFilter -> [XmlFilter] -> XmlFilter
tf ++= cfs
= tf += cat cfs
-- -----------------------------------------------------------------------------
--
-- string access functions
-- |
-- combination of 'getValue' and conversion into a String
valueOf :: String -> XmlTree -> String
valueOf a = xshow . getValue a
-- |
-- combination of 'getValue' and conversion to a Int
intValueOf :: String -> XmlTree -> Int
intValueOf a = decimalStringToInt . valueOf a
-- -----------------------------------------------------------------------------
--
-- convenient filter (short cuts)
-- |
-- variant of mkXTag with a list of filters for the attributes and a list of filters for the children.
-- this variant leads to a more readable source for a complicated construction filter
-- than the simple solution with a combination of 'mkXTag' and 'cat'.
--
-- see also : 'mkXTag', 'stag', 'etag', 'cat', '+='
tag :: String -> [XmlFilter] -> [XmlFilter] -> XmlFilter
tag n afs cfs = mkXTag n (cat afs) (cat cfs)
-- |
-- variant of tag, useful for tags without attributes and with a list of filters for
-- constructing the children
--
-- see also : 'mkXTag', 'tag', 'etag', 'cat', '+='
stag :: String -> [XmlFilter] -> XmlFilter
stag n cfs = mkXTag n none (cat cfs)
-- |
-- variant of tag, useful for tags with attributes but without children
--
-- see also : 'mkXTag', 'tag', 'stag', 'etag', 'cat'
atag :: String -> [XmlFilter] -> XmlFilter
atag n cfs = mkXTag n (cat cfs) none
-- |
-- Short cut for empty tags without attributes
--
-- see also : 'tag', 'atag', 'stag', 'mkXTag' and '+='
etag :: String -> XmlFilter
etag n = mkXTag n none none
-- | Qualified version of etag
qetag :: QName -> XmlFilter
qetag q = mkQTag q none none
-- | Alias for mkQTag
qtag :: QName -> XmlFilter -> XmlFilter -> XmlFilter
qtag = mkQTag
-- |
-- filter for creating a document root node with a list of filters for the attributes and a list of filters for the document.
--
-- see also : 'tag'
rootTag :: [XmlFilter] -> [XmlFilter] -> XmlFilter
rootTag afs cfs = mkXTag t_root (cat afs) (cat cfs)
-- |
-- Alias for 'mkXAttr'
attr :: String -> XmlFilter -> XmlFilter
attr = mkXAttr
-- | Alias for mkQAttr
qattr :: QName -> XmlFilter -> XmlFilter
qattr = mkQAttr
-- |
-- short cut for attribute construction with string constants
--
-- set also : 'attr', 'mkXAttr' and 'mkXText'
sattr :: String -> String -> XmlFilter
sattr a v = mkXAttr a (mkXText v)
-- |
-- short cut for 'mkXText'
txt :: String -> XmlFilter
txt = mkXText
-- |
-- short cut for simple comment
-- the input tree is ignored
--
-- see also : 'mkXCmt'
cmt :: String -> XmlFilter
cmt c = mkXCmt (txt c)
-- |
-- short cut for generating simple processing instructions (spi)
-- the input tree is ignored
--
-- @spi \"xyz\" \"abc\"@ is equal to @mkXPi \"xyz\" (txt \"abc\")@
-- (the name pi is already used in prelude)
spi :: String -> String -> XmlFilter
spi n c = mkXPi n (txt c)
-- |
-- short cut for generating simple cdata sections,
-- the input tree is ignored
cdata :: String -> XmlFilter
cdata s = mkXCdata (txt s)
-- |
-- DTD part generation with filter for attributes and children
-- see also: 'mkXDTDTree'
dtd :: DTDElem -> [XmlFilter] -> [XmlFilter] -> XmlFilter
dtd dtdpart afs cfs t
= mkXDTD dtdpart (toAttrl . cat afs $ t) (cat cfs t) $ t
-- |
-- short cut for mkXError c_warn.
--
-- see also : 'mkXError'
warn :: String -> XmlFilter
warn = mkXError c_warn
-- |
-- short cut for mkXError c_fatal.
--
-- see also : 'mkXError'
err :: String -> XmlFilter
err = mkXError c_err
-- |
-- short cut for mkXError c_fatal.
--
-- see also : 'mkXError'
fatal :: String -> XmlFilter
fatal = mkXError c_fatal
-- |
-- check whether an option is set
--
-- reads the value of an attribute, usually applied to a document root node,
-- and checks if the value represents True. The following strings are interpreted
-- as true: \"1\", \"True\", \"true\", \"yes\", \"Yes\".
hasOption :: String -> XmlFilter
hasOption opt
= getValue opt .> isOfText isSet
where
isSet x
= x `elem` ["1", "True", "true", "yes", "Yes"]
-- -----------------------------------------------------------------------------