diff options
author | Dmitry Polienko <dmitry@eldis.ru> | 2016-11-30 10:38:22 +0700 |
---|---|---|
committer | Dmitry Polienko <dmitry@eldis.ru> | 2016-11-30 10:38:22 +0700 |
commit | 6bd86f7543ba0ab7d40764a206fdd5183ce8eb88 (patch) | |
tree | 9b658beebe5893e423de736d709e2bf8e903e433 /lib/pure/xmltree.nim | |
parent | 5c46f268802217b774df23d4dcf07a6f7b0ebc20 (diff) | |
download | Nim-6bd86f7543ba0ab7d40764a206fdd5183ce8eb88.tar.gz |
Rewrite xmltools.innerText
Make it recursive, define for node types other than xnElement
Diffstat (limited to 'lib/pure/xmltree.nim')
-rw-r--r-- | lib/pure/xmltree.nim | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/lib/pure/xmltree.nim b/lib/pure/xmltree.nim index 3c6eb14e3..5385705cd 100644 --- a/lib/pure/xmltree.nim +++ b/lib/pure/xmltree.nim @@ -91,13 +91,25 @@ proc rawTag*(n: XmlNode): string {.inline.} = shallowCopy(result, n.fTag) proc innerText*(n: XmlNode): string = - ## gets the inner text of `n`. `n` has to be an ``xnElement`` node. Only - ## ``xnText`` and ``xnEntity`` nodes are considered part of `n`'s inner text, - ## other child nodes are silently ignored. - result = "" - assert n.k == xnElement - for i in 0 .. n.s.len-1: - if n.s[i].k in {xnText, xnEntity}: result.add(n.s[i].fText) + ## gets the inner text of `n`: + ## + ## - If `n` is `xnText` or `xnEntity`, returns its content. + ## - If `n` is `xnElement`, runs recursively on each child node and + ## concatenates the results. + ## - Otherwise returns an empty string. + var res = "" + proc worker(n: XmlNode) = + case n.k + of { xnText, xnEntity }: + res.add(n.fText) + of xnElement: + for sub in n.s: + worker(sub) + else: + discard + + worker(n) + res proc tag*(n: XmlNode): string {.inline.} = ## gets the tag name of `n`. `n` has to be an ``xnElement`` node. |