mirror of
https://github.com/odin-lang/Odin.git
synced 2025-12-28 17:04:34 +00:00
This change was made in order to allow things produced with Odin and using Odin's core library, to not require the LICENSE to also be distributed alongside the binary form.
53 lines
1.2 KiB
Odin
53 lines
1.2 KiB
Odin
package encoding_xml
|
|
|
|
/*
|
|
An XML 1.0 / 1.1 parser
|
|
|
|
Copyright 2021-2022 Jeroen van Rijn <nom@duclavier.com>.
|
|
Made available under Odin's license.
|
|
|
|
This file contains helper functions.
|
|
*/
|
|
|
|
|
|
// Find parent's nth child with a given ident.
|
|
find_child_by_ident :: proc(doc: ^Document, parent_id: Element_ID, ident: string, nth := 0) -> (res: Element_ID, found: bool) {
|
|
tag := doc.elements[parent_id]
|
|
|
|
count := 0
|
|
for v in tag.value {
|
|
switch child_id in v {
|
|
case string: continue
|
|
case Element_ID:
|
|
child := doc.elements[child_id]
|
|
/*
|
|
Skip commments. They have no name.
|
|
*/
|
|
if child.kind != .Element { continue }
|
|
|
|
/*
|
|
If the ident matches and it's the nth such child, return it.
|
|
*/
|
|
if child.ident == ident {
|
|
if count == nth { return child_id, true }
|
|
count += 1
|
|
}
|
|
}
|
|
|
|
}
|
|
return 0, false
|
|
}
|
|
|
|
// Find an attribute by key.
|
|
find_attribute_val_by_key :: proc(doc: ^Document, parent_id: Element_ID, key: string) -> (val: string, found: bool) {
|
|
tag := doc.elements[parent_id]
|
|
|
|
for attr in tag.attribs {
|
|
/*
|
|
If the ident matches, we're done. There can only ever be one attribute with the same name.
|
|
*/
|
|
if attr.key == key { return attr.val, true }
|
|
}
|
|
return "", false
|
|
}
|