packages feed

hexpat 0.11 → 0.12

raw patch · 11 files changed

+452/−271 lines, 11 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Text.XML.Expat.Annotated: instance (Eq tag, Eq text, Eq a) => Eq (Node tag text a)
- Text.XML.Expat.Annotated: instance (NFData tag, NFData text, NFData a) => NFData (Node tag text a)
- Text.XML.Expat.Annotated: instance (Show tag, Show text, Show a) => Show (Node tag text a)
- Text.XML.Expat.Annotated: instance Functor (Node tag text)
- Text.XML.Expat.Tree: extractText :: (Monoid text) => Node tag text -> text
+ Text.XML.Expat.Annotated: ParserOptions :: Maybe Encoding -> Maybe (tag -> Maybe text) -> ParserOptions tag text
+ Text.XML.Expat.Annotated: alterAttribute :: (Eq tag, NodeClass n, GenericXMLString tag) => tag -> Maybe text -> n tag text -> n tag text
+ Text.XML.Expat.Annotated: data ParserOptions tag text
+ Text.XML.Expat.Annotated: defaultParserOptions :: ParserOptions tag text
+ Text.XML.Expat.Annotated: deleteAttribute :: (Eq tag, NodeClass n, GenericXMLString tag) => tag -> n tag text -> n tag text
+ Text.XML.Expat.Annotated: eAttributes :: Node a tag text -> ![(tag, text)]
+ Text.XML.Expat.Annotated: entityDecoder :: ParserOptions tag text -> Maybe (tag -> Maybe text)
+ Text.XML.Expat.Annotated: fromNamespaced :: (NodeClass n, GenericXMLString text, Ord text) => n (NName text) text -> n (QName text) text
+ Text.XML.Expat.Annotated: fromQualified :: (NodeClass n, GenericXMLString text) => n (QName text) text -> n text text
+ Text.XML.Expat.Annotated: getAttribute :: (NodeClass n, GenericXMLString tag) => n tag text -> tag -> Maybe text
+ Text.XML.Expat.Annotated: getAttributes :: (NodeClass n) => n tag text -> [(tag, text)]
+ Text.XML.Expat.Annotated: getChildren :: (NodeClass n) => n tag text -> [n tag text]
+ Text.XML.Expat.Annotated: getName :: (NodeClass n, GenericXMLString tag) => n tag text -> tag
+ Text.XML.Expat.Annotated: instance (Eq a, Eq tag, Eq text) => Eq (Node a tag text)
+ Text.XML.Expat.Annotated: instance (NFData tag, NFData text, NFData a) => NFData (Node a tag text)
+ Text.XML.Expat.Annotated: instance (Show a, Show tag, Show text) => Show (Node a tag text)
+ Text.XML.Expat.Annotated: instance NodeClass (Node a)
+ Text.XML.Expat.Annotated: isElement :: (NodeClass n) => n tag text -> Bool
+ Text.XML.Expat.Annotated: isNamed :: (NodeClass n, Eq tag) => tag -> n tag text -> Bool
+ Text.XML.Expat.Annotated: isText :: (NodeClass n) => n tag text -> Bool
+ Text.XML.Expat.Annotated: mapAllTags :: (NodeClass n) => (tag -> tag') -> n tag text -> n tag' text
+ Text.XML.Expat.Annotated: mapAnnotation :: (a -> b) -> Node a tag text -> Node b tag text
+ Text.XML.Expat.Annotated: modifyAnnotation :: (a -> a) -> Node a tag text -> Node a tag text
+ Text.XML.Expat.Annotated: modifyAttributes :: (NodeClass n) => ([(tag, text)] -> [(tag, text)]) -> n tag text -> n tag text
+ Text.XML.Expat.Annotated: modifyChildren :: (NodeClass n) => ([n tag text] -> [n tag text]) -> n tag text -> n tag text
+ Text.XML.Expat.Annotated: modifyName :: (NodeClass n) => (tag -> tag) -> n tag text -> n tag text
+ Text.XML.Expat.Annotated: parserEncoding :: ParserOptions tag text -> Maybe Encoding
+ Text.XML.Expat.Annotated: setAttribute :: (Eq tag, NodeClass n, GenericXMLString tag) => tag -> text -> n tag text -> n tag text
+ Text.XML.Expat.Annotated: toNamespaced :: (NodeClass n, GenericXMLString text, Ord text, Show text) => n (QName text) text -> n (NName text) text
+ Text.XML.Expat.Annotated: toQualified :: (NodeClass n, GenericXMLString text) => n text text -> n (QName text) text
+ Text.XML.Expat.Format: indent :: (GenericXMLString tag, GenericXMLString text) => Int -> Node tag text -> Node tag text
+ Text.XML.Expat.Format: indent_ :: (GenericXMLString tag, GenericXMLString text) => Int -> Int -> Node tag text -> Node tag text
+ Text.XML.Expat.NodeClass: alterAttribute :: (Eq tag, NodeClass n, GenericXMLString tag) => tag -> Maybe text -> n tag text -> n tag text
+ Text.XML.Expat.NodeClass: class NodeClass n
+ Text.XML.Expat.NodeClass: deleteAttribute :: (Eq tag, NodeClass n, GenericXMLString tag) => tag -> n tag text -> n tag text
+ Text.XML.Expat.NodeClass: getAttribute :: (NodeClass n, GenericXMLString tag) => n tag text -> tag -> Maybe text
+ Text.XML.Expat.NodeClass: getAttributes :: (NodeClass n) => n tag text -> [(tag, text)]
+ Text.XML.Expat.NodeClass: getChildren :: (NodeClass n) => n tag text -> [n tag text]
+ Text.XML.Expat.NodeClass: getName :: (NodeClass n, GenericXMLString tag) => n tag text -> tag
+ Text.XML.Expat.NodeClass: isElement :: (NodeClass n) => n tag text -> Bool
+ Text.XML.Expat.NodeClass: isNamed :: (NodeClass n, Eq tag) => tag -> n tag text -> Bool
+ Text.XML.Expat.NodeClass: isText :: (NodeClass n) => n tag text -> Bool
+ Text.XML.Expat.NodeClass: mapAllTags :: (NodeClass n) => (tag -> tag') -> n tag text -> n tag' text
+ Text.XML.Expat.NodeClass: mapElement :: (NodeClass n) => ((tag, [(tag, text)], [n tag text]) -> (tag', [(tag', text)], [n tag' text])) -> n tag text -> n tag' text
+ Text.XML.Expat.NodeClass: modifyAttributes :: (NodeClass n) => ([(tag, text)] -> [(tag, text)]) -> n tag text -> n tag text
+ Text.XML.Expat.NodeClass: modifyChildren :: (NodeClass n) => ([n tag text] -> [n tag text]) -> n tag text -> n tag text
+ Text.XML.Expat.NodeClass: modifyName :: (NodeClass n) => (tag -> tag) -> n tag text -> n tag text
+ Text.XML.Expat.NodeClass: setAttribute :: (Eq tag, NodeClass n, GenericXMLString tag) => tag -> text -> n tag text -> n tag text
+ Text.XML.Expat.NodeClass: textContent :: (NodeClass n, Monoid text) => n tag text -> text
+ Text.XML.Expat.Tree: alterAttribute :: (Eq tag, NodeClass n, GenericXMLString tag) => tag -> Maybe text -> n tag text -> n tag text
+ Text.XML.Expat.Tree: deleteAttribute :: (Eq tag, NodeClass n, GenericXMLString tag) => tag -> n tag text -> n tag text
+ Text.XML.Expat.Tree: eAttributes :: Node tag text -> ![(tag, text)]
+ Text.XML.Expat.Tree: getAttributes :: (NodeClass n) => n tag text -> [(tag, text)]
+ Text.XML.Expat.Tree: getName :: (NodeClass n, GenericXMLString tag) => n tag text -> tag
+ Text.XML.Expat.Tree: instance NodeClass Node
+ Text.XML.Expat.Tree: mapAllTags :: (NodeClass n) => (tag -> tag') -> n tag text -> n tag' text
+ Text.XML.Expat.Tree: modifyAttributes :: (NodeClass n) => ([(tag, text)] -> [(tag, text)]) -> n tag text -> n tag text
+ Text.XML.Expat.Tree: modifyName :: (NodeClass n) => (tag -> tag) -> n tag text -> n tag text
+ Text.XML.Expat.Tree: setAttribute :: (Eq tag, NodeClass n, GenericXMLString tag) => tag -> text -> n tag text -> n tag text
- Text.XML.Expat.Annotated: Element :: !tag -> ![(tag, text)] -> [Node tag text a] -> a -> Node tag text a
+ Text.XML.Expat.Annotated: Element :: !tag -> ![(tag, text)] -> [Node a tag text] -> a -> Node a tag text
- Text.XML.Expat.Annotated: Text :: !text -> Node tag text a
+ Text.XML.Expat.Annotated: Text :: !text -> Node a tag text
- Text.XML.Expat.Annotated: data Node tag text a
+ Text.XML.Expat.Annotated: data Node a tag text
- Text.XML.Expat.Annotated: eAnn :: Node tag text a -> a
+ Text.XML.Expat.Annotated: eAnn :: Node a tag text -> a
- Text.XML.Expat.Annotated: eAttrs :: Node tag text a -> ![(tag, text)]
+ Text.XML.Expat.Annotated: eAttrs :: Node a tag text -> [(tag, text)]
- Text.XML.Expat.Annotated: eChildren :: Node tag text a -> [Node tag text a]
+ Text.XML.Expat.Annotated: eChildren :: Node a tag text -> [Node a tag text]
- Text.XML.Expat.Annotated: eName :: Node tag text a -> !tag
+ Text.XML.Expat.Annotated: eName :: Node a tag text -> !tag
- Text.XML.Expat.Annotated: saxToTree :: (GenericXMLString tag) => [(SAXEvent tag text, a)] -> (Node tag text a, Maybe XMLParseError)
+ Text.XML.Expat.Annotated: saxToTree :: (GenericXMLString tag) => [(SAXEvent tag text, a)] -> (Node a tag text, Maybe XMLParseError)
- Text.XML.Expat.Annotated: textContent :: (Monoid text) => Node tag text a -> text
+ Text.XML.Expat.Annotated: textContent :: (NodeClass n, Monoid text) => n tag text -> text
- Text.XML.Expat.Annotated: type LNode tag text = Node tag text XMLParseLocation
+ Text.XML.Expat.Annotated: type LNode tag text = Node XMLParseLocation tag text
- Text.XML.Expat.Annotated: type NNode text a = Node (NName text) text a
+ Text.XML.Expat.Annotated: type NNode text a = Node a (NName text) text
- Text.XML.Expat.Annotated: type QNode text a = Node (QName text) text a
+ Text.XML.Expat.Annotated: type QNode a text = Node a (QName text) text
- Text.XML.Expat.Annotated: type UNode text a = Node text text a
+ Text.XML.Expat.Annotated: type UNode a text = Node a text text
- Text.XML.Expat.Annotated: unannotate :: Node tag text a -> Node tag text
+ Text.XML.Expat.Annotated: unannotate :: Node a tag text -> Node tag text
- Text.XML.Expat.Namespaced: fromNamespaced :: (GenericXMLString text, Ord text) => NNode text -> QNode text
+ Text.XML.Expat.Namespaced: fromNamespaced :: (NodeClass n, GenericXMLString text, Ord text) => n (NName text) text -> n (QName text) text
- Text.XML.Expat.Namespaced: toNamespaced :: (GenericXMLString text, Ord text, Show text) => QNode text -> NNode text
+ Text.XML.Expat.Namespaced: toNamespaced :: (NodeClass n, GenericXMLString text, Ord text, Show text) => n (QName text) text -> n (NName text) text
- Text.XML.Expat.Qualified: fromQualified :: (GenericXMLString text) => QNode text -> UNode text
+ Text.XML.Expat.Qualified: fromQualified :: (NodeClass n, GenericXMLString text) => n (QName text) text -> n text text
- Text.XML.Expat.Qualified: toQualified :: (GenericXMLString text) => UNode text -> QNode text
+ Text.XML.Expat.Qualified: toQualified :: (NodeClass n, GenericXMLString text) => n text text -> n (QName text) text
- Text.XML.Expat.Tree: eAttrs :: Node tag text -> ![(tag, text)]
+ Text.XML.Expat.Tree: eAttrs :: Node tag text -> [(tag, text)]
- Text.XML.Expat.Tree: getAttribute :: (GenericXMLString tag) => Node tag text -> tag -> Maybe text
+ Text.XML.Expat.Tree: getAttribute :: (NodeClass n, GenericXMLString tag) => n tag text -> tag -> Maybe text
- Text.XML.Expat.Tree: getChildren :: Node tag text -> [Node tag text]
+ Text.XML.Expat.Tree: getChildren :: (NodeClass n) => n tag text -> [n tag text]
- Text.XML.Expat.Tree: isElement :: Node tag text -> Bool
+ Text.XML.Expat.Tree: isElement :: (NodeClass n) => n tag text -> Bool
- Text.XML.Expat.Tree: isNamed :: (Eq tag) => tag -> Node tag text -> Bool
+ Text.XML.Expat.Tree: isNamed :: (NodeClass n, Eq tag) => tag -> n tag text -> Bool
- Text.XML.Expat.Tree: isText :: Node tag text -> Bool
+ Text.XML.Expat.Tree: isText :: (NodeClass n) => n tag text -> Bool
- Text.XML.Expat.Tree: modifyChildren :: ([Node tag text] -> [Node tag text]) -> Node tag text -> Node tag text
+ Text.XML.Expat.Tree: modifyChildren :: (NodeClass n) => ([n tag text] -> [n tag text]) -> n tag text -> n tag text
- Text.XML.Expat.Tree: textContent :: (Monoid text) => Node tag text -> text
+ Text.XML.Expat.Tree: textContent :: (NodeClass n, Monoid text) => n tag text -> text

Files

Text/XML/Expat/Annotated.hs view
@@ -1,64 +1,90 @@+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-} -- | A variant of /Node/ in which Element nodes have an annotation of any type, -- and some concrete functions that annotate with the XML parse location.--- It is assumed you will usually want /Tree/ or /Annotated/, not both, so many--- of the names conflict. ----- Support for qualified and namespaced trees annotated with location information--- is not complete.+-- The names conflict with those in /Tree/ so you must use qualified import+-- if you want to use both modules. module Text.XML.Expat.Annotated (-        -- * Tree structure-        Node(..),-        Attributes,  -- re-export from Tree-        UNode,-        UAttributes,-        LNode,-        ULNode,-        textContent,-        unannotate,+  -- * Tree structure+  Node(..),+  Attributes,  -- re-export from Tree+  UNode,+  UAttributes,+  LNode,+  ULNode,+  textContent,+  isElement,+  isNamed,+  isText,+  getName,+  getAttributes,+  getAttribute,+  getChildren,+  modifyName,+  modifyAttributes,+  setAttribute,+  deleteAttribute,+  alterAttribute,+  modifyChildren,+  mapAllTags, -        -- * Qualified nodes-        QName(..),-        QNode,-        QAttributes,-        QLNode,+  -- * Annotation-specific+  unannotate,+  modifyAnnotation,+  mapAnnotation, -        -- * Namespaced nodes-        NName (..),-        NNode,-        NAttributes,-        NLNode,-        mkNName,-        mkAnNName,-        xmlnsUri,-        xmlns,+  -- * Qualified nodes+  QName(..),+  QNode,+  QAttributes,+  QLNode,+  toQualified,+  fromQualified, -        -- * Deprecated parse functions-        parseSAX,-        parseSAXThrowing,-        parseSAXLocations,-        parseSAXLocationsThrowing,-        parseTree,-        parseTree',-        parseTreeThrowing,+  -- * Namespaced nodes+  NName (..),+  NNode,+  NAttributes,+  NLNode,+  mkNName,+  mkAnNName,+  toNamespaced,+  fromNamespaced,+  xmlnsUri,+  xmlns, -        -- * Parse to tree-        Encoding(..),-        XMLParseError(..),-        XMLParseLocation(..),-        parse,-        parse',-        parseThrowing,+  -- * Parse to tree+  Tree.ParserOptions(..),+  Tree.defaultParserOptions,+  Encoding(..),+  parse,+  parse',+  XMLParseError(..),+  XMLParseLocation(..), -        -- * SAX-style parse-        SAXEvent(..),-        saxToTree,+  -- * Variant that throws exceptions+  parseThrowing,+  XMLParseException(..), -        -- * Variants that throw exceptions-        XMLParseException(..),-        -- * Abstraction of string types-        GenericXMLString(..)-    ) where+  -- * SAX-style parse+  SAXEvent(..),+  saxToTree, +  -- * Abstraction of string types+  GenericXMLString(..),++  -- * Deprecated+  eAttrs,+  parseSAX,+  parseSAXThrowing,+  parseSAXLocations,+  parseSAXLocationsThrowing,+  parseTree,+  parseTree',+  parseTreeThrowing+) where++import Control.Arrow import Text.XML.Expat.Tree ( Attributes, UAttributes ) import qualified Text.XML.Expat.Tree as Tree import Text.XML.Expat.SAX ( Encoding(..)@@ -72,10 +98,10 @@                           , parseSAXThrowing                           , parseSAXLocations                           , parseSAXLocationsThrowing )- import qualified Text.XML.Expat.SAX as SAX import Text.XML.Expat.Qualified hiding (QNode, QNodes) import Text.XML.Expat.Namespaced hiding (NNode, NNodes)+import Text.XML.Expat.NodeClass  import Control.Monad (mplus) import Control.Parallel.Strategies@@ -85,77 +111,123 @@   -- | Annotated variant of the tree representation of the XML document.-data Node tag text a =+data Node a tag text =     Element {-        eName     :: !tag,-        eAttrs    :: ![(tag,text)],-        eChildren :: [Node tag text a],-        eAnn      :: a+        eName       :: !tag,+        eAttributes :: ![(tag,text)],+        eChildren   :: [Node a tag text],+        eAnn        :: a     } |     Text !text     deriving (Eq, Show) -instance (NFData tag, NFData text, NFData a) => NFData (Node tag text a) where+eAttrs :: Node a tag text -> [(tag, text)]+{-# DEPRECATED eAttrs "use eAttributes instead" #-}+eAttrs = eAttributes++instance (NFData tag, NFData text, NFData a) => NFData (Node a tag text) where     rnf (Element nam att chi ann) = rnf (nam, att, chi, ann)     rnf (Text txt) = rnf txt -unannotate :: Node tag text a -> Tree.Node tag text+instance NodeClass (Node a) where+    textContent (Element _ _ children _) = mconcat $ map textContent children+    textContent (Text txt) = txt+    +    isElement (Element _ _ _ _) = True+    isElement _                 = False+    +    isText (Text _) = True+    isText _        = False+    +    isNamed _  (Text _) = False+    isNamed nm (Element nm' _ _ _) = nm == nm'++    getName (Text _)             = gxFromString ""+    getName (Element name _ _ _) = name++    getAttributes (Text _)              = []+    getAttributes (Element _ attrs _ _) = attrs++    getChildren (Text _)           = []+    getChildren (Element _ _ ch _) = ch++    modifyName _ node@(Text _) = node+    modifyName f (Element n a c ann) = Element (f n) a c ann++    modifyAttributes _ node@(Text _) = node+    modifyAttributes f (Element n a c ann) = Element n (f a) c ann++    modifyChildren _ node@(Text _) = node+    modifyChildren f (Element n a c ann) = Element n a (f c) ann++    mapAllTags _ (Text t) = Text t+    mapAllTags f (Element n a c ann) = Element (f n) (map (first f) a) (map (mapAllTags f) c) ann++    mapElement _ (Text t) = Text t+    mapElement f (Element n a c ann) =+        let (n', a', c') = f (n, a, c)+        in  Element n' a' c' ann++-- | Convert an annotated tree (/Annotated/ module) into a non-annotated+-- tree (/Tree/ module).  Needed, for example, when you @format@ your tree to+-- XML, since @format@ takes a non-annotated tree.+unannotate :: Node a tag text -> Tree.Node tag text unannotate (Element na at ch _) = (Tree.Element na at (map unannotate ch)) unannotate (Text t) = Tree.Text t --- | Extract all text content from inside a tag into a single string, including--- any text contained in children.-textContent :: Monoid text => Node tag text a -> text-textContent (Element _ _ children _) = mconcat $ map textContent children-textContent (Text txt) = txt- -- | Type shortcut for a single annotated node with unqualified tag names where -- tag and text are the same string type-type UNode text a = Node text text a+type UNode a text = Node a text text  -- | Type shortcut for a single annotated node, annotated with parse location-type LNode tag text = Node tag text XMLParseLocation+type LNode tag text = Node XMLParseLocation tag text  -- | Type shortcut for a single node with unqualified tag names where -- tag and text are the same string type, annotated with parse location type ULNode text = LNode text text   -- | Type shortcut for a single annotated node where qualified names are used for tags-type QNode text a = Node (QName text) text a+type QNode a text = Node a (QName text) text  -- | Type shortcut for a single node where qualified names are used for tags, annotated with parse location type QLNode text = LNode (QName text) text  -- | Type shortcut for a single annotated node where namespaced names are used for tags-type NNode text a = Node (NName text) text a+type NNode text a = Node a (NName text) text  -- | Type shortcut for a single node where namespaced names are used for tags, annotated with parse location type NLNode text = LNode (NName text) text -instance Functor (Node tag text) where-    f `fmap` Element na at ch an = Element na at (map (f `fmap`) ch) (f an)-    f `fmap` Text t = Text t+-- | Modify this node's annotation (non-recursively) if it's an element, otherwise no-op.+modifyAnnotation :: (a -> a) -> Node a tag text -> Node a tag text+f `modifyAnnotation` Element na at ch an = Element na at ch (f an)+_ `modifyAnnotation` Text t = Text t +-- | Modify this node's annotation and all its children recursively if it's an element, otherwise no-op.+mapAnnotation :: (a -> b) -> Node a tag text -> Node b tag text+f `mapAnnotation` Element na at ch an = Element na at (map (f `mapAnnotation`) ch) (f an)+_ `mapAnnotation` Text t = Text t+ -- | A lower level function that lazily converts a SAX stream into a tree structure. -- Variant that takes annotations for start tags. saxToTree :: GenericXMLString tag =>              [(SAXEvent tag text, a)]-          -> (Node tag text a, Maybe XMLParseError)+          -> (Node a tag text, Maybe XMLParseError) saxToTree events =     let (nodes, mError, _) = ptl events     in  (safeHead nodes, mError)   where     safeHead (a:_) = a     safeHead [] = Element (gxFromString "") [] [] (error "saxToTree null annotation")-    ptl ((StartElement name attrs, ann):rem) =-        let (children, err1, rem') = ptl rem+    ptl ((StartElement name attrs, ann):rema) =+        let (children, err1, rema') = ptl rema             elt = Element name attrs children ann-            (out, err2, rem'') = ptl rem'-        in  (elt:out, err1 `mplus` err2, rem'')-    ptl ((EndElement name, _):rem) = ([], Nothing, rem)-    ptl ((CharacterData txt, _):rem) =-        let (out, err, rem') = ptl rem-        in  (Text txt:out, err, rem')+            (out, err2, rema'') = ptl rema'+        in  (elt:out, err1 `mplus` err2, rema'')+    ptl ((EndElement _, _):rema) = ([], Nothing, rema)+    ptl ((CharacterData txt, _):rema) =+        let (out, err, rema') = ptl rema+        in  (Text txt:out, err, rema')     ptl ((FailDocument err, _):_) = ([], Just err, [])     ptl [] = ([], Nothing, []) 
Text/XML/Expat/Cursor.hs view
@@ -2,7 +2,7 @@ -- | -- Module    : Text.XML.Expat.Cursor ----- This module ported from Text.XML.Light.Proc+-- This module ported from Text.XML.Light.Cursor -- -- XML cursors for working XML content withing the context of -- an XML document.  This implementation is based on the general@@ -85,9 +85,9 @@ -}  fromTag :: Tag tag text -> [Node tag text] -> Node tag text-fromTag t cs = Element { eName     = tagName t-                       , eAttrs    = tagAttribs t-                       , eChildren = cs+fromTag t cs = Element { eName       = tagName t+                       , eAttributes = tagAttribs t+                       , eChildren   = cs                        }  type Path tag text = [([Node tag text],Tag tag text,[Node tag text])]@@ -197,7 +197,7 @@  getTag :: Node tag text -> Tag tag text getTag e = Tag { tagName = eName e-               , tagAttribs = eAttrs e+               , tagAttribs = eAttributes e                }  
Text/XML/Expat/Format.hs view
@@ -20,16 +20,18 @@         xmlHeader,         treeToSAX,         formatSAX,-        formatSAX'+        formatSAX',+        -- * Indentation+        indent,+        indent_     ) where -import Text.XML.Expat.IO import Text.XML.Expat.Tree import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as L import Data.ByteString.Internal (c2w, w2c)-import qualified Data.Text as T-import qualified Data.Text.Encoding as TE+import Data.Char (isSpace)+import Data.List import Data.Word  -- | DEPRECATED: Renamed to 'format'.@@ -52,8 +54,8 @@  -- | Format document with <?xml.. header - strict variant that returns strict ByteString. format' :: (GenericXMLString tag, GenericXMLString text) =>-               Node tag text-            -> B.ByteString+           Node tag text+        -> B.ByteString format' = B.concat . L.toChunks . formatTree  -- | Format XML node with no header - lazy variant that returns lazy ByteString.@@ -109,7 +111,7 @@ putSAX :: (GenericXMLString tag, GenericXMLString text) =>            [SAXEvent tag text]         -> [B.ByteString]-putSAX (StartElement name attrs:EndElement name2:elts) =+putSAX (StartElement name attrs:EndElement _:elts) =     B.concat (startTagHelper name attrs ++ [pack "/>"]):putSAX elts putSAX (StartElement name attrs:elts) =     B.concat (startTagHelper name attrs ++ [B.singleton (c2w '>')]):putSAX elts@@ -132,12 +134,52 @@     let (good, bad) = B.span (`notElem` escapees) str     in  if B.null good             then case w2c $ B.head str of-                '&'  -> pack "&amp;":escapeText rem-                '<'  -> pack "&lt;":escapeText rem-                '"'  -> pack "&quot;":escapeText rem-                '\'' -> pack "&apos;":escapeText rem+                '&'  -> pack "&amp;":escapeText rema+                '<'  -> pack "&lt;":escapeText rema+                '"'  -> pack "&quot;":escapeText rema+                '\'' -> pack "&apos;":escapeText rema                 _        -> error "hexpat: impossible"             else good:escapeText bad   where-    rem = B.tail str+    rema = B.tail str++-- | Make the output prettier by adding indentation.+indent :: (GenericXMLString tag, GenericXMLString text) =>+          Int   -- ^ Number of indentation spaces per nesting level+       -> Node tag text+       -> Node tag text+indent = indent_ 0++-- | Make the output prettier by adding indentation, specifying initial indent.+indent_ :: (GenericXMLString tag, GenericXMLString text) =>+           Int   -- ^ Initial indent (spaces)+        -> Int   -- ^ Number of indentation spaces per nesting level+        -> Node tag text+        -> Node tag text+indent_ _ _ t@(Text _) = t+indent_ cur perLevel elt@(Element name attrs chs) =+    if any isElement chs+        then Element name attrs $+                let (_, chs') = mapAccumL (\startOfText ch -> case ch of+                            Element _ _ _ ->+                                let cur' = cur + perLevel+                                in  (+                                        True,+                                        [+                                            Text (gxFromString ('\n':replicate cur' ' ')),+                                            indent_ cur' perLevel ch+                                        ]+                                    )+                            Text t | startOfText ->+                                case strip t of+                                    Nothing -> (True, [])+                                    Just t' -> (False, [Text t'])+                            Text _ -> (False, [ch])+                        ) True chs+                in  concat chs' ++ [Text $ gxFromString ('\n':replicate cur ' ')]+        else elt+  where+    strip t | gxNullString t = Nothing+    strip t | isSpace (gxHead t) = strip (gxTail t)+    strip t = Just t 
Text/XML/Expat/IO.hs view
@@ -53,8 +53,6 @@ import Control.Monad import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as BSL-import qualified Data.ByteString.Internal as BSI-import Data.Maybe (maybe) import Data.IORef import Foreign import CForeign
Text/XML/Expat/Namespaced.hs view
@@ -12,6 +12,7 @@       ) where  import Text.XML.Expat.Tree+import Text.XML.Expat.NodeClass import Text.XML.Expat.Qualified import Control.Parallel.Strategies import qualified Data.Map as M@@ -84,75 +85,80 @@    , (Just xmlnsUri, Just xmlns)    ] -toNamespaced :: (GenericXMLString text, Ord text, Show text)-               => QNode text -> NNode text+toNamespaced :: (NodeClass n, GenericXMLString text, Ord text, Show text)+               => n (QName text) text -> n (NName text) text toNamespaced = nodeWithNamespaces baseNsBindings -nodeWithNamespaces :: (GenericXMLString text, Ord text, Show text)-                   => NsPrefixMap text -> QNode text -> NNode text-nodeWithNamespaces _ (Text t) = Text t-nodeWithNamespaces bindings (Element qname qattrs qchildren) = Element nname nattrs nchildren+nodeWithNamespaces :: (NodeClass n, GenericXMLString text, Ord text, Show text)+                   => NsPrefixMap text -> n (QName text) text -> n (NName text) text+nodeWithNamespaces bindings = mapElement namespaceify   where-    for = flip map-    (nsAtts, otherAtts) = L.partition ((== Just xmlns) . qnPrefix . fst) qattrs-    (dfAtt, normalAtts) = L.partition ((== QName Nothing xmlns) . fst) otherAtts-    nsMap  = M.fromList $ for nsAtts $ \((QName _ lp), uri) -> (Just lp, Just uri)-    -- fixme: when snd q is null, use Nothing-    dfMap  = M.fromList $ for dfAtt $ \q -> (Nothing, Just $ snd q)-    chldBs = M.unions [dfMap, nsMap, bindings]--    trans bs (QName pref qual) = case pref `M.lookup` bs of-      Nothing -> error -              $  "Namespace prefix referenced but never bound: '"-              ++ (show . DM.fromJust) pref-              ++ "'"-      Just mUri -> NName mUri qual-    nname       = trans chldBs qname--    -- attributes with no prefix are in the same namespace as the element-    attBs = M.insert Nothing (nnNamespace nname) chldBs--    transAt (qn, v) = (trans attBs qn, v)--    nNsAtts     = map transAt nsAtts-    nDfAtt      = map transAt dfAtt-    nNormalAtts = map transAt normalAtts-    nattrs      = concat [nNsAtts, nDfAtt, nNormalAtts]--    nchildren   = for qchildren $ nodeWithNamespaces chldBs+    namespaceify (qname, qattrs, qchildren) = (nname, nattrs, nchildren)+      where+        for = flip map+        (nsAtts, otherAtts) = L.partition ((== Just xmlns) . qnPrefix . fst) qattrs+        (dfAtt, normalAtts) = L.partition ((== QName Nothing xmlns) . fst) otherAtts+        nsMap  = M.fromList $ for nsAtts $ \((QName _ lp), uri) -> (Just lp, Just uri)+        -- fixme: when snd q is null, use Nothing+        dfMap  = M.fromList $ for dfAtt $ \q -> (Nothing, Just $ snd q)+        chldBs = M.unions [dfMap, nsMap, bindings]+    +        trans bs (QName pref qual) = case pref `M.lookup` bs of+          Nothing -> error +                  $  "Namespace prefix referenced but never bound: '"+                  ++ (show . DM.fromJust) pref+                  ++ "'"+          Just mUri -> NName mUri qual+        nname       = trans chldBs qname+    +        -- attributes with no prefix are in the same namespace as the element+        attBs = M.insert Nothing (nnNamespace nname) chldBs+    +        transAt (qn, v) = (trans attBs qn, v)+    +        nNsAtts     = map transAt nsAtts+        nDfAtt      = map transAt dfAtt+        nNormalAtts = map transAt normalAtts+        nattrs      = concat [nNsAtts, nDfAtt, nNormalAtts]+    +        nchildren   = for qchildren $ nodeWithNamespaces chldBs -fromNamespaced :: (GenericXMLString text, Ord text) => NNode text -> QNode text+fromNamespaced :: (NodeClass n, GenericXMLString text, Ord text) =>+                  n (NName text) text -> n (QName text) text fromNamespaced = nodeWithQualifiers 1 basePfBindings -nodeWithQualifiers :: (GenericXMLString text, Ord text)-                   => Int -> PrefixNsMap text -> NNode text -> QNode text-nodeWithQualifiers _ _ (Text text) = Text text-nodeWithQualifiers cntr bindings (Element nname nattrs nchildren) = Element qname qattrs qchildren+nodeWithQualifiers :: (NodeClass n, GenericXMLString text, Ord text) =>+                      Int+                   -> PrefixNsMap text+                   -> n (NName text) text -> n (QName text) text+nodeWithQualifiers cntr bindings = mapElement namespaceify   where-    for = flip map-    (nsAtts, otherAtts) = L.partition ((== Just xmlnsUri) . nnNamespace . fst) nattrs-    (dfAtt, normalAtts) = L.partition ((== NName Nothing xmlns) . fst) otherAtts-    nsMap = M.fromList $ for nsAtts $ \((NName _ lp), uri) -> (Just uri, Just lp)-    dfMap = M.fromList $ for dfAtt  $ \(_, uri) -> (Just uri, Just xmlns)-    chldBs = M.unions [dfMap, nsMap, bindings]--    trans (i, bs, as) (NName nspace qual) =-      case nspace `M.lookup` bs of-           Nothing -> let-                        pfx = gxFromString $ "ns" ++ show i-                        bs' = M.insert nspace (Just pfx) bs-                        as' = (NName (Just xmlnsUri) pfx, DM.fromJust nspace) : as-                      in trans (i+1, bs', as') (NName nspace qual)-           Just pfx -> ((i, bs, as), QName pfx qual)-    transAt ibs (nn, v) = let (ibs', qn) = trans ibs nn-                          in  (ibs', (qn, v))--    ((i', bs', as'), qname) = trans (cntr, chldBs, []) nname--    ((i'',   bs'',   as''),   qNsAtts)     = L.mapAccumL transAt (i',    bs',    as')    nsAtts-    ((i''',  bs''',  as'''),  qDfAtt)      = L.mapAccumL transAt (i'',   bs'',   as'')   dfAtt-    ((i'''', bs'''', as''''), qNormalAtts) = L.mapAccumL transAt (i''',  bs''',  as''')  normalAtts-    (_,                       qas)         = L.mapAccumL transAt (i'''', bs'''', as'''') as''''-    qattrs = concat [qNsAtts, qDfAtt, qNormalAtts, qas]--    qchildren = for nchildren $ nodeWithQualifiers i'''' bs''''+    namespaceify (nname, nattrs, nchildren) = (qname, qattrs, qchildren) +      where+        for = flip map+        (nsAtts, otherAtts) = L.partition ((== Just xmlnsUri) . nnNamespace . fst) nattrs+        (dfAtt, normalAtts) = L.partition ((== NName Nothing xmlns) . fst) otherAtts+        nsMap = M.fromList $ for nsAtts $ \((NName _ lp), uri) -> (Just uri, Just lp)+        dfMap = M.fromList $ for dfAtt  $ \(_, uri) -> (Just uri, Just xmlns)+        chldBs = M.unions [dfMap, nsMap, bindings]+    +        trans (i, bs, as) (NName nspace qual) =+          case nspace `M.lookup` bs of+               Nothing -> let+                            pfx = gxFromString $ "ns" ++ show i+                            bsN = M.insert nspace (Just pfx) bs+                            asN = (NName (Just xmlnsUri) pfx, DM.fromJust nspace) : as+                          in trans (i+1, bsN, asN) (NName nspace qual)+               Just pfx -> ((i, bs, as), QName pfx qual)+        transAt ibs (nn, v) = let (ibs', qn) = trans ibs nn+                              in  (ibs', (qn, v))+    +        ((i', bs', as'), qname) = trans (cntr, chldBs, []) nname+    +        ((i'',   bs'',   as''),   qNsAtts)     = L.mapAccumL transAt (i',    bs',    as')    nsAtts+        ((i''',  bs''',  as'''),  qDfAtt)      = L.mapAccumL transAt (i'',   bs'',   as'')   dfAtt+        ((i'''', bs'''', as''''), qNormalAtts) = L.mapAccumL transAt (i''',  bs''',  as''')  normalAtts+        (_,                       qas)         = L.mapAccumL transAt (i'''', bs'''', as'''') as''''+        qattrs = concat [qNsAtts, qDfAtt, qNormalAtts, qas]+    +        qchildren = for nchildren $ nodeWithQualifiers i'''' bs''''
+ Text/XML/Expat/NodeClass.hs view
@@ -0,0 +1,83 @@+{-# LANGUAGE MultiParamTypeClasses, FlexibleContexts #-}+-- | A typeclass to allow for functions that work with different node types+-- such as the ones defined in /Tree/ and /Annotated/.+module Text.XML.Expat.NodeClass where++import Data.Monoid (Monoid)+import Text.XML.Expat.SAX (GenericXMLString)+++class NodeClass n where+    -- | Is the given node an element?+    isElement :: n tag text -> Bool++    -- | Is the given node text?+    isText :: n tag text -> Bool++    -- | Extract all text content from inside a tag into a single string, including+    -- any text contained in children.+    textContent :: Monoid text => n tag text -> text++    -- | Is the given node a tag with the given name?+    isNamed :: Eq tag => tag -> n tag text -> Bool++    -- | Get the name of this node if it's an element, return empty string otherwise.+    getName :: GenericXMLString tag => n tag text -> tag++    -- | Get the attributes of a node if it's an element, return empty list otherwise.+    getAttributes :: n tag text -> [(tag,text)]++    -- | Get children of a node if it's an element, return empty list otherwise.+    getChildren :: n tag text -> [n tag text]++    -- | Modify name if it's an element, no-op otherwise.+    modifyName :: (tag -> tag)+               -> n tag text+               -> n tag text++    -- | Modify attributes if it's an element, no-op otherwise.+    modifyAttributes :: ([(tag, text)] -> [(tag, text)])+                     -> n tag text+                     -> n tag text++    -- | Modify children (non-recursively) if it's an element, no-op otherwise.+    modifyChildren :: ([n tag text] -> [n tag text])+                   -> n tag text+                   -> n tag text++    -- | Map all tags (both tag names and attribute names) recursively.+    mapAllTags :: (tag -> tag')+            -> n tag text+            -> n tag' text++    -- | Map an element non-recursively, allowing the tag type to be changed.+    mapElement :: ((tag, [(tag, text)], [n tag text]) -> (tag', [(tag', text)], [n tag' text]))+                  -> n tag text+                  -> n tag' text++-- | Get the value of the attribute having the specified name.+getAttribute :: (NodeClass n, GenericXMLString tag) => n tag text -> tag -> Maybe text+getAttribute n t = lookup t $ getAttributes n++-- | Set the value of the attribute with the specified name to the value, overwriting+-- the first existing attribute with that name if present.+setAttribute :: (Eq tag, NodeClass n, GenericXMLString tag) => tag -> text -> n tag text -> n tag text+setAttribute t newValue = modifyAttributes set+  where+    set [] = [(t, newValue)]+    set ((name, _):atts) | name == t = (name, newValue):atts+    set (att:atts) = att:set atts++-- | Delete the first attribute matching the specified name.+deleteAttribute :: (Eq tag, NodeClass n, GenericXMLString tag) => tag -> n tag text -> n tag text+deleteAttribute t = modifyAttributes del+  where+    del [] = []+    del ((name, _):atts) | name == t = atts+    del (att:atts) = att:del atts++-- | setAttribute if /Just/, deleteAttribute if /Nothing/.+alterAttribute :: (Eq tag, NodeClass n, GenericXMLString tag) => tag -> Maybe text -> n tag text -> n tag text+alterAttribute t (Just newValue) = setAttribute t newValue+alterAttribute t Nothing = deleteAttribute t+
Text/XML/Expat/Proc.hs view
@@ -64,7 +64,7 @@ filterElements p e  | p e        = [e]  | otherwise  = case e of-                  Element n a c -> concatMap (filterElements p) $ onlyElems c+                  Element _ _ c -> concatMap (filterElements p) $ onlyElems c                   _             -> []  -- | Find all non-nested occurences of an element wrt a predicate over element names.
Text/XML/Expat/Qualified.hs view
@@ -20,20 +20,10 @@         fromQualified     ) where -import Text.XML.Expat.IO+import Text.XML.Expat.NodeClass import Text.XML.Expat.Tree-import Text.XML.Expat.Format-import qualified Data.ByteString as B-import qualified Data.ByteString.Lazy as L-import qualified Data.ByteString.Internal as I-import Data.ByteString.Internal (c2w, w2c)-import qualified Data.Text as T-import qualified Data.Text.Encoding as TE-import Control.Applicative import Control.Monad.Writer import Control.Parallel.Strategies-import Data.Monoid-import qualified Codec.Binary.UTF8.String as U8  -- | A qualified name. --@@ -73,29 +63,19 @@ mkAnQName :: text -> QName text mkAnQName localPart = QName Nothing localPart -toQualified :: (GenericXMLString text) => UNode text -> QNode text-toQualified (Text text) = Text text-toQualified (Element uname uatts uchldrn) = Element qname qatts qchldrn+toQualified :: (NodeClass n, GenericXMLString text) => n text text -> n (QName text) text+toQualified = mapAllTags qual   where-    qname   = qual uname-    qatts   = map (\(tag, text) -> (qual tag, text)) uatts-    qchldrn = map toQualified uchldrn-     qual ident =         case gxBreakOn ':' ident of              (prefix, _local) | not (gxNullString _local)                               && gxHead _local == ':'                                  -> QName (Just prefix) (gxTail _local)-             otherwise           -> QName Nothing ident+             _                   -> QName Nothing ident -fromQualified :: (GenericXMLString text) => QNode text -> UNode text-fromQualified (Text text) = Text text-fromQualified (Element qname qatts qchldrn) = Element uname uatts uchldrn+fromQualified :: (NodeClass n, GenericXMLString text) => n (QName text) text -> n text text+fromQualified = mapAllTags tag   where-    uname   = tag qname-    uatts   = map (\(qual, text) -> (tag qual, text)) qatts-    uchldrn = map fromQualified qchldrn-     tag (QName (Just prefix) local) = prefix `mappend` gxFromChar ':' `mappend` local     tag (QName Nothing       local) = local 
Text/XML/Expat/SAX.hs view
@@ -6,8 +6,6 @@  -- | This module provides functions to parse an XML document to a lazy -- stream of SAX events.---- module Text.XML.Expat.SAX (   -- * XML primitives   Encoding(..),@@ -48,7 +46,6 @@ import qualified Data.Text as T import qualified Data.Text.Encoding as TE import qualified Codec.Binary.UTF8.String as U8-import Data.Monoid import Data.Typeable import Control.Exception.Extensible as Exc import Control.Applicative
Text/XML/Expat/Tree.hs view
@@ -1,11 +1,12 @@-{-# LANGUAGE DeriveDataTypeable, TypeSynonymInstances #-}+{-# LANGUAGE DeriveDataTypeable, TypeSynonymInstances, FlexibleInstances,+        MultiParamTypeClasses #-}  -- hexpat, a Haskell wrapper for expat -- Copyright (C) 2008 Evan Martin <martine@danga.com> -- Copyright (C) 2009 Stephen Blackheath <http://blacksapphire.com/antispam>  -- | This module provides functions to parse an XML document to a tree structure,--- either strictly or lazily, as well as a lazy SAX-style interface.+-- either strictly or lazily. -- -- The 'GenericXMLString' type class allows you to use any string type. Three -- string types are provided for here: 'String', 'ByteString' and 'Text'.@@ -94,64 +95,63 @@ module Text.XML.Expat.Tree (   -- * Tree structure   Node(..),-  Nodes,   Attributes,   UNode,-  UNodes,   UAttributes,   textContent,   isElement,   isNamed,   isText,+  getName,+  getAttributes,   getAttribute,   getChildren,+  modifyName,+  modifyAttributes,+  setAttribute,+  deleteAttribute,+  alterAttribute,   modifyChildren,+  mapAllTags, -  -- * Parse functions+  -- * Parse to tree   ParserOptions(..),   defaultParserOptions,+  Encoding(..),   parse,   parse',-  parseThrowing,--  -- * Deprecated parse functions-  parseTree,-  parseTree',--  parseSAX,-  parseSAXLocations,--  parseTreeThrowing,-  parseSAXThrowing,-  parseSAXLocationsThrowing,--  extractText,--  -- * Parse to tree-  Encoding(..),   XMLParseError(..),   XMLParseLocation(..), +  -- * Variant that throws exceptions+  parseThrowing,+  XMLParseException(..),+   -- * SAX-style parse   SAXEvent(..),   saxToTree, -  -- * Variants that throw exceptions-  XMLParseException(..),-   -- * Abstraction of string types-  GenericXMLString(..)+  GenericXMLString(..),++  -- * Deprecated+  eAttrs,+  Nodes,+  UNodes,+  parseTree,+  parseTree',+  parseSAX,+  parseSAXLocations,+  parseTreeThrowing,+  parseSAXThrowing,+  parseSAXLocationsThrowing ) where  ------------------------------------------------------------------------------ import Text.XML.Expat.IO hiding (parse,parse') import qualified Text.XML.Expat.IO as IO--import Text.XML.Expat.SAX ( Encoding(..)-                          , ParserOptions(..)+import Text.XML.Expat.SAX ( ParserOptions(..)                           , XMLParseException(..)-                          , XMLParseError(..)-                          , XMLParseLocation(..)                           , SAXEvent(..)                           , defaultParserOptions                           , mkText@@ -161,14 +161,14 @@                           , parseSAXThrowing                           , GenericXMLString(..) ) import qualified Text.XML.Expat.SAX as SAX+import Text.XML.Expat.NodeClass  ------------------------------------------------------------------------------+import Control.Arrow import Data.ByteString (ByteString) import qualified Data.ByteString.Lazy as L-import qualified Data.ByteString.Internal as I import Data.IORef-import qualified Data.Monoid as M-import Data.Monoid+import Data.Monoid (Monoid,mconcat) import Control.Parallel.Strategies import Control.Monad import System.IO.Unsafe@@ -179,13 +179,17 @@ -- | The tree representation of the XML document. data Node tag text =     Element {-        eName     :: !tag,-        eAttrs    :: ![(tag,text)],-        eChildren :: [Node tag text]+        eName       :: !tag,+        eAttributes :: ![(tag,text)],+        eChildren   :: [Node tag text]     } |     Text !text     deriving (Eq, Show) +eAttrs :: Node tag text -> [(tag, text)]+{-# DEPRECATED eAttrs "use eAttributes instead" #-}+eAttrs = eAttributes+ instance (NFData tag, NFData text) => NFData (Node tag text) where     rnf (Element nam att chi) = rnf (nam, att, chi)     rnf (Text txt) = rnf txt@@ -214,48 +218,44 @@ -- text are the same string type. type UAttributes text = Attributes text text --- | Extract all text content from inside a tag into a single string, including--- any text contained in children.-textContent :: Monoid text => Node tag text -> text-textContent (Element _ _ children) = mconcat $ map textContent children-textContent (Text txt) = txt+instance NodeClass Node where+    textContent (Element _ _ children) = mconcat $ map textContent children+    textContent (Text txt) = txt+    +    isElement (Element _ _ _) = True+    isElement _               = False+    +    isText (Text _) = True+    isText _        = False+    +    isNamed _  (Text _) = False+    isNamed nm (Element nm' _ _) = nm == nm' --- | DEPRECATED: Renamed to 'textContent'.-extractText :: Monoid text => Node tag text -> text-{-# DEPRECATED extractText "renamed to textContent" #-}-extractText = textContent+    getName (Text _)             = gxFromString ""+    getName (Element name _ _)   = name --- | Is the given node an element?-isElement :: Node tag text -> Bool-isElement (Element _ _ _) = True-isElement _               = False+    getAttributes (Text _)            = []+    getAttributes (Element _ attrs _) = attrs --- | Is the given node text?-isText :: Node tag text -> Bool-isText (Text _) = True-isText _        = False+    getChildren (Text _)         = []+    getChildren (Element _ _ ch) = ch --- | Is the given node a tag with the given name?-isNamed :: (Eq tag) => tag -> Node tag text -> Bool-isNamed _  (Text _) = False-isNamed nm (Element nm' _ _) = nm == nm'+    modifyName _ node@(Text _) = node+    modifyName f (Element n a c) = Element (f n) a c --- | Get the value of the attribute having the specified name.-getAttribute :: GenericXMLString tag => Node tag text -> tag -> Maybe text-getAttribute n t = lookup t $ eAttrs n+    modifyAttributes _ node@(Text _) = node+    modifyAttributes f (Element n a c) = Element n (f a) c --- | Get children of a node if it's an element, return empty list otherwise.-getChildren :: Node tag text -> [Node tag text]-getChildren (Text _)         = []-getChildren (Element _ _ ch) = ch+    modifyChildren _ node@(Text _) = node+    modifyChildren f (Element n a c) = Element n a (f c) --- | Modify a node's children using the specified function.-modifyChildren :: ([Node tag text] -> [Node tag text])-               -> Node tag text-               -> Node tag text-modifyChildren _ node@(Text _) = node-modifyChildren f (Element n a c) = Element n a (f c)+    mapAllTags _ (Text t) = Text t+    mapAllTags f (Element n a c) = Element (f n) (map (first f) a) (map (mapAllTags f) c) +    mapElement _ (Text t) = Text t+    mapElement f (Element n a c) =+        let (n', a', c') = f (n, a, c)+        in  Element n' a' c'  setEntityDecoder :: (GenericXMLString tag, GenericXMLString text)                  => Parser
hexpat.cabal view
@@ -1,9 +1,9 @@ Cabal-Version: >= 1.4 Name: hexpat-Version: 0.11+Version: 0.12 Synopsis: wrapper for expat, the fast XML parser Description:-  This package provides a general purpose Haskell XML library using the Expat do+  This package provides a general purpose Haskell XML library using Expat to   do its parsing (<http://expat.sourceforge.net/> - a fast stream-oriented XML   parser written in C).  It is extensible to any string type, with @String@,   @ByteString@ and @Text@ provided out of the box.@@ -22,7 +22,8 @@   .   DARCS repository: <http://code.haskell.org/hexpat/>   .-  Credits to the @xml@ (XML.Light) package for /Proc/ and /Cursor/.+  Credits to Iavor Diatchki <iavor.diatchki@gmail.com> and the @xml@ (XML.Light)+  package for /Proc/ and /Cursor/. Category: XML License: BSD3 License-File: LICENSE@@ -35,10 +36,11 @@ Maintainer: http://blacksapphire.com/antispam/ Copyright:   (c) 2009 Doug Beardsley <mightybyte@gmail.com>,-  (c) 2009 Stephen Blackheath <http://blacksapphire.com/antispam/>,+  (c) 2009-2010 Stephen Blackheath <http://blacksapphire.com/antispam/>,   (c) 2009 Gregory Collins,   (c) 2008 Evan Martin <martine@danga.com>,-  (c) 2009 Matthew Pocock <matthew.pocock@ncl.ac.uk>+  (c) 2009 Matthew Pocock <matthew.pocock@ncl.ac.uk>,+  (c) 2007-2009 Galois Inc. Homepage: http://haskell.org/haskellwiki/Hexpat/ Build-Type: Simple Stability: beta@@ -60,9 +62,10 @@     Text.XML.Expat.Format,     Text.XML.Expat.IO,     Text.XML.Expat.Namespaced,+    Text.XML.Expat.NodeClass,     Text.XML.Expat.Proc,     Text.XML.Expat.Qualified,     Text.XML.Expat.SAX,     Text.XML.Expat.Tree   Extra-Libraries: expat-  --ghc-options: -Wall+  ghc-options: -Wall