@@ -31,15 +31,15 @@ import Text.XML.DOM.Parser.Types
3131import Text.XML.Lens
3232
3333
34−-- | Generic function to traverse arbitrary inner cursors.
34+-- | Generic function to traverse arbitrary inner elements.
3535traverseElems
3636 :: (Monad m, Foldable g, Traversable f)
3737 => ([Element] -> DomParserT g m (f (DomPath, Element)))
3838 -- ^ 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
4040 -- to run parser in
4141 -> 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'
4343 -> DomParserT g m (f a)
4444traverseElems trav parser = do
4545 pd <- ask
@@ -49,15 +49,15 @@ traverseElems trav parser = do
4949 newpd = ParserData
5050 { _pdElements = Identity e
5151 , _pdPath = pd ^. pdPath <> subpath }
52− -- type of reader has been changed, local won't work here
53− magnify (to $ const newpd) parser
52+ lift $ runReaderT parser newpd
5453
55−-- | Takes function filtering
54+-- | Traverses elements located in same path using filtering function
5655inFilteredTrav
5756 :: (Monad m, Foldable g, Buildable f)
5857 => ([Element] -> (DomPath, [Element]))
59− -- ^ Function returning some filtered elements with path suffixes which will
60− -- be appended to parser's state. The argument is a list of current elements.
58+ -- ^ Takes list of current elements and returns some descendants
59+ -- subset and path this descendants located at. Path is should be
60+ -- same for all descendants and required for error message
6161 -> DomParserT Identity m a
6262 -> DomParserT g m (f a)
6363inFilteredTrav deeper = traverseElems trav
@@ -70,38 +70,39 @@ inFilteredTrav deeper = traverseElems trav
7070
7171inElemTrav
7272 :: (Monad m, Foldable g, Buildable f)
73− => NameMatcher -- ^ Name of tag to traverse in
73+ => ElemMatcher -- ^ Name of tag to traverse in
7474 -> DomParserT Identity m a
7575 -> DomParserT g m (f a)
7676inElemTrav n = inFilteredTrav deeper
7777 where
78− deeper = (DomPath [_nmShow n],) . toListOf (folded . nodes . folded . _Element . elMatchName n)
78+ elemsFold = folded . nodes . folded . _Element . elMatch n
79+ deeper = (DomPath [_emShow n],) . toListOf elemsFold
7980
8081-- | Runs parser inside first children element with given name
8182inElem
8283 :: (Monad m, Foldable g)
83− => NameMatcher
84+ => ElemMatcher
8485 -> DomParserT Identity m a
8586 -> DomParserT g m a
8687inElem n = fmap runIdentity . inElemTrav n
8788
8889inElemAll
8990 :: (Monad m, Foldable g)
90− => NameMatcher
91+ => ElemMatcher
9192 -> DomParserT Identity m a
9293 -> DomParserT g m [a]
9394inElemAll = inElemTrav
9495
9596inElemMay
9697 :: (Monad m, Foldable g)
97− => NameMatcher
98+ => ElemMatcher
9899 -> DomParserT Identity m a
99100 -> DomParserT g m (Maybe a)
100101inElemMay = inElemTrav
101102
102103inElemNe
103104 :: (Monad m, Foldable g)
104− => NameMatcher
105+ => ElemMatcher
105106 -> DomParserT Identity m a
106107 -> DomParserT g m (NonEmpty a)
107108inElemNe = inElemTrav
@@ -133,21 +134,21 @@ in given path.
133134divePath
134135 :: forall m g a
135136 . (Monad m, Foldable g)
136− => [NameMatcher]
137+ => [ElemMatcher]
137138 -> DomParserT [] m a
138139 -> DomParserT g m a
139140divePath path = magnify $ to modElems
140141 where
141142 modElems
142143 = over pdElements (toListOf $ folded . diver)
143− . over pdPath (<> DomPath (L.map _nmShow path))
144+ . over pdPath (<> DomPath (L.map _emShow path))
144145 diver :: Fold Element Element
145146 diver = F.foldr (.) id $ L.map toDive path
146− toDive n = nodes . folded . _Element . elMatchName n
147+ toDive n = nodes . folded . _Element . elMatch n
147148
148149diveElem
149150 :: (Monad m, Foldable g)
150− => NameMatcher
151+ => ElemMatcher
151152 -> DomParserT [] m a
152153 -> DomParserT g m a
153154diveElem p = divePath [p]
@@ -188,6 +189,6 @@ ignoreBlank = ignoreElem test
188189 let
189190 elems = e ^.. nodes . folded . _Element
190191 cont = mconcat $ e ^.. nodes . folded . _Content
191− in if | not $ L.null elems -> False
192+ in if | not $ L.null elems -> False
192193 | T.null $ T.strip cont -> True
193194 | otherwise -> False