homepage/old/garden-data-gen/source/dom_utils.d

78 lines
2.2 KiB
D
Raw Normal View History

2024-03-16 16:41:08 +00:00
module dom_utils;
import dxml.dom;
import dxml.writer;
import dxml.util;
import std.array;
import std.algorithm;
DOMEntity!string findDOMChild(
DOMEntity!string parent,
string elementName,
string[string] attributes = string[string].init
) {
foreach (child; parent.children) {
if (child.type == EntityType.elementStart && child.name == elementName) {
if (attributes.length == 0) return child;
bool attributesMatch = true;
foreach (attrName, attrValue; attributes) {
bool hasValue = false;
foreach (attr; child.attributes) {
if (attr.name == attrName && attr.value == attrValue) {
hasValue = true;
break;
}
}
if (!hasValue) {
attributesMatch = false;
break;
}
}
if (attributesMatch) return child;
}
}
throw new Exception("Could not find child element " ~ elementName ~ " in " ~ parent.name);
}
DOMEntity!string[] findDOMChildren(DOMEntity!string parent, string name) {
DOMEntity!string[] matches;
auto app = appender(&matches);
foreach (child; parent.children) {
if (child.type == EntityType.elementStart && child.name == name) {
app ~= child;
}
}
return matches;
}
string readTableCellText(DOMEntity!string cell) {
if (
cell.type == EntityType.elementStart &&
cell.children.length > 0 &&
cell.children[0].type == EntityType.elementStart &&
cell.children[0].children.length == 1 &&
cell.children[0].children[0].type == EntityType.text
) {
return cell.children[0].children[0].text.decodeXML;
}
return null;
}
void writeStartTagWithAttrs(O)(
ref XMLWriter!O writer,
string tag,
string[string] attributes,
EmptyTag emptyTag = EmptyTag.no
) {
writer.openStartTag(tag);
foreach (k, v; attributes) {
writer.writeAttr(k, v);
}
writer.closeStartTag(emptyTag);
}
void writeStartTagWithClass(O)(ref XMLWriter!O writer, string tag, string classValue) {
writer.writeStartTagWithAttrs(tag, ["class": classValue]);
}