@@ -31,15 +31,15 @@ import Text.XML.DOM.Parser.Types
31import Text.XML.Lens
31import Text.XML.Lens
34−-- | Generic function to traverse arbitrary inner cursors.
34+-- | Generic function to traverse arbitrary inner elements.
35traverseElems
35traverseElems
36 :: (Monad m, Foldable g, Traversable f)
36 :: (Monad m, Foldable g, Traversable f)
37 => ([Element] -> DomParserT g m (f (DomPath, Element)))
37 => ([Element] -> DomParserT g m (f (DomPath, Element)))
38 -- ^ Takes list of current elements and returns container with
38 -- ^ Takes list of current elements and returns container with
39− -- pairs of subpath (relatively to current element) and element
39+ -- pairs of subpath (relatively to current elements) and element
40 -- to run parser in
40 -- to run parser in
41 -> DomParserT Identity m a
41 -> DomParserT Identity m a
42− -- ^ Parser will be runned for each element found in traversable
42+ -- ^ Parser to run for each element found in traversable 'f'
43 -> DomParserT g m (f a)
43 -> DomParserT g m (f a)
44traverseElems trav parser = do
44traverseElems trav parser = do
@@ -49,15 +49,15 @@ traverseElems trav parser = do
49 newpd = ParserData
49 newpd = ParserData
50 { _pdElements = Identity e
50 { _pdElements = Identity e
51 , _pdPath = pd ^. pdPath <> subpath }
51 , _pdPath = pd ^. pdPath <> subpath }
52− -- type of reader has been changed, local won't work here
52+ lift $ runReaderT parser newpd
53− magnify (to $ const newpd) parser
55−-- | Takes function filtering
54+-- | Traverses elements located in same path using filtering function
56inFilteredTrav
55inFilteredTrav
57 :: (Monad m, Foldable g, Buildable f)
56 :: (Monad m, Foldable g, Buildable f)
58 => ([Element] -> (DomPath, [Element]))
57 => ([Element] -> (DomPath, [Element]))
59− -- ^ Function returning some filtered elements with path suffixes which will
58+ -- ^ Takes list of current elements and returns some descendants
60− -- be appended to parser's state. The argument is a list of current elements.
59+ -- subset and path this descendants located at. Path is should be
60+ -- same for all descendants and required for error message
61 -> DomParserT Identity m a
61 -> DomParserT Identity m a
62 -> DomParserT g m (f a)
62 -> DomParserT g m (f a)
63inFilteredTrav deeper = traverseElems trav
63inFilteredTrav deeper = traverseElems trav
@@ -70,38 +70,39 @@ inFilteredTrav deeper = traverseElems trav
72 :: (Monad m, Foldable g, Buildable f)
72 :: (Monad m, Foldable g, Buildable f)
73− => NameMatcher -- ^ Name of tag to traverse in
73+ => ElemMatcher -- ^ Name of tag to traverse in
74 -> DomParserT Identity m a
74 -> DomParserT Identity m a
75 -> DomParserT g m (f a)
75 -> DomParserT g m (f a)
76inElemTrav n = inFilteredTrav deeper
76inElemTrav n = inFilteredTrav deeper
78+ elemsFold = folded . nodes . folded . _Element . elMatch n
78− deeper = (DomPath [_nmShow n],) . toListOf (folded . nodes . folded . _Element . elMatchName n)
79+ deeper = (DomPath [_emShow n],) . toListOf elemsFold
80-- | Runs parser inside first children element with given name
81-- | Runs parser inside first children element with given name
82 :: (Monad m, Foldable g)
83 :: (Monad m, Foldable g)
83− => NameMatcher
84+ => ElemMatcher
84 -> DomParserT Identity m a
85 -> DomParserT Identity m a
85 -> DomParserT g m a
86 -> DomParserT g m a
86inElem n = fmap runIdentity . inElemTrav n
87inElem n = fmap runIdentity . inElemTrav n
89 :: (Monad m, Foldable g)
90 :: (Monad m, Foldable g)
90− => NameMatcher
91+ => ElemMatcher
91 -> DomParserT Identity m a
92 -> DomParserT Identity m a
92 -> DomParserT g m [a]
93 -> DomParserT g m [a]
93inElemAll = inElemTrav
94inElemAll = inElemTrav
96 :: (Monad m, Foldable g)
97 :: (Monad m, Foldable g)
97− => NameMatcher
98+ => ElemMatcher
98 -> DomParserT Identity m a
99 -> DomParserT Identity m a
99 -> DomParserT g m (Maybe a)
100 -> DomParserT g m (Maybe a)
100inElemMay = inElemTrav
101inElemMay = inElemTrav
103 :: (Monad m, Foldable g)
104 :: (Monad m, Foldable g)
104− => NameMatcher
105+ => ElemMatcher
105 -> DomParserT Identity m a
106 -> DomParserT Identity m a
106 -> DomParserT g m (NonEmpty a)
107 -> DomParserT g m (NonEmpty a)
107inElemNe = inElemTrav
108inElemNe = inElemTrav
@@ -133,21 +134,21 @@ in given path.
134 :: forall m g a
135 :: forall m g a
135 . (Monad m, Foldable g)
136 . (Monad m, Foldable g)
136− => [NameMatcher]
137+ => [ElemMatcher]
137 -> DomParserT [] m a
138 -> DomParserT [] m a
138 -> DomParserT g m a
139 -> DomParserT g m a
139divePath path = magnify $ to modElems
140divePath path = magnify $ to modElems
142 = over pdElements (toListOf $ folded . diver)
143 = over pdElements (toListOf $ folded . diver)
143− . over pdPath (<> DomPath (L.map _nmShow path))
144+ . over pdPath (<> DomPath (L.map _emShow path))
144 diver :: Fold Element Element
145 diver :: Fold Element Element
145 diver = F.foldr (.) id $ L.map toDive path
146 diver = F.foldr (.) id $ L.map toDive path
146− toDive n = nodes . folded . _Element . elMatchName n
147+ toDive n = nodes . folded . _Element . elMatch n
149 :: (Monad m, Foldable g)
150 :: (Monad m, Foldable g)
150− => NameMatcher
151+ => ElemMatcher
151 -> DomParserT [] m a
152 -> DomParserT [] m a
152 -> DomParserT g m a
153 -> DomParserT g m a
153diveElem p = divePath [p]
154diveElem p = divePath [p]
@@ -188,6 +189,6 @@ ignoreBlank = ignoreElem test
189 elems = e ^.. nodes . folded . _Element
190 elems = e ^.. nodes . folded . _Element
190 cont = mconcat $ e ^.. nodes . folded . _Content
191 cont = mconcat $ e ^.. nodes . folded . _Content
191− in if | not $ L.null elems -> False
192+ in if | not $ L.null elems -> False
192 | T.null $ T.strip cont -> True
193 | T.null $ T.strip cont -> True
193 | otherwise -> False
194 | otherwise -> False