diff --git a/lib/pure/xmltree.nim b/lib/pure/xmltree.nim index 1c7e5bce84..c353f27867 100644 --- a/lib/pure/xmltree.nim +++ b/lib/pure/xmltree.nim @@ -649,7 +649,7 @@ proc child*(n: XmlNode, name: string): XmlNode = if i.tag == name: return i -proc findAll*(n: XmlNode, tag: string, result: var seq[XmlNode]) = +proc findAll*(n: XmlNode, tag: string, result: var seq[XmlNode], caseInsensitive = false) = ## Iterates over all the children of `n` returning those matching `tag`. ## ## Found nodes satisfying the condition will be appended to the `result` @@ -658,8 +658,8 @@ proc findAll*(n: XmlNode, tag: string, result: var seq[XmlNode]) = var b = newElement("good") c = newElement("bad") - d = newElement("bad") - e = newElement("good") + d = newElement("BAD") + e = newElement("GOOD") b.add newText("b text") c.add newText("c text") d.add newText("d text") @@ -667,34 +667,46 @@ proc findAll*(n: XmlNode, tag: string, result: var seq[XmlNode]) = let a = newXmlTree("father", [b, c, d, e]) var s = newSeq[XmlNode]() a.findAll("good", s) - assert $s == "@[b text, e text]" + assert $s == "@[b text]" + s.setLen(0) + a.findAll("good", s, caseInsensitive = true) + assert $s == "@[b text, e text]" + s.setLen(0) + a.findAll("BAD", s) + assert $s == "@[d text]" + s.setLen(0) + a.findAll("BAD", s, caseInsensitive = true) + assert $s == "@[c text, d text]" assert n.k == xnElement for child in n.items(): if child.k != xnElement: continue - if child.tag == tag: + if child.tag == tag or + (caseInsensitive and cmpIgnoreCase(child.tag, tag) == 0): result.add(child) child.findAll(tag, result) -proc findAll*(n: XmlNode, tag: string): seq[XmlNode] = +proc findAll*(n: XmlNode, tag: string, caseInsensitive = false): seq[XmlNode] = ## A shortcut version to assign in let blocks. runnableExamples: var b = newElement("good") c = newElement("bad") - d = newElement("bad") - e = newElement("good") + d = newElement("BAD") + e = newElement("GOOD") b.add newText("b text") c.add newText("c text") d.add newText("d text") e.add newText("e text") let a = newXmlTree("father", [b, c, d, e]) - assert $(a.findAll("good")) == "@[b text, e text]" - assert $(a.findAll("bad")) == "@[c text, d text]" + assert $(a.findAll("good")) == "@[b text]" + assert $(a.findAll("BAD")) == "@[d text]" + assert $(a.findAll("good", caseInsensitive = true)) == "@[b text, e text]" + assert $(a.findAll("BAD", caseInsensitive = true)) == "@[c text, d text]" newSeq(result, 0) - findAll(n, tag, result) + findAll(n, tag, result, caseInsensitive) proc xmlConstructor(a: NimNode): NimNode {.compileTime.} = if a.kind == nnkCall: