78 lines
2.2 KiB
D
78 lines
2.2 KiB
D
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]);
|
|
}
|