mirror of https://github.com/adamdruppe/arsd.git
add toPrettyString for eyeball debugging
This commit is contained in:
parent
534312e3e8
commit
2fff81a252
147
dom.d
147
dom.d
|
@ -1300,6 +1300,25 @@ class Document : FileResource {
|
||||||
return prolog ~ root.toString();
|
return prolog ~ root.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/++
|
||||||
|
Writes it out with whitespace for easier eyeball debugging
|
||||||
|
|
||||||
|
Do NOT use for anything other than eyeball debugging,
|
||||||
|
because whitespace may be significant content in XML.
|
||||||
|
+/
|
||||||
|
string toPrettyString(bool insertComments = false) const {
|
||||||
|
string s = prolog;
|
||||||
|
|
||||||
|
if(insertComments) s ~= "<!--";
|
||||||
|
s ~= "\n";
|
||||||
|
if(insertComments) s ~= "-->";
|
||||||
|
|
||||||
|
s ~= root.toPrettyString(insertComments);
|
||||||
|
foreach(a; piecesAfterRoot)
|
||||||
|
s ~= a.toPrettyString(insertComments);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
///.
|
///.
|
||||||
Element root;
|
Element root;
|
||||||
|
|
||||||
|
@ -3024,6 +3043,70 @@ class Element {
|
||||||
return writeToAppender();
|
return writeToAppender();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected string toPrettyStringIndent(bool insertComments, int indentationLevel) const {
|
||||||
|
string s;
|
||||||
|
|
||||||
|
if(insertComments) s ~= "<!--";
|
||||||
|
s ~= "\n";
|
||||||
|
foreach(indent; 0 .. indentationLevel)
|
||||||
|
s ~= "\t";
|
||||||
|
if(insertComments) s ~= "-->";
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/++
|
||||||
|
Writes out with formatting. Be warned: formatting changes the contents. Use ONLY
|
||||||
|
for eyeball debugging.
|
||||||
|
+/
|
||||||
|
string toPrettyString(bool insertComments = false, int indentationLevel = 0) const {
|
||||||
|
string s = toPrettyStringIndent(insertComments, indentationLevel);
|
||||||
|
|
||||||
|
s ~= "<";
|
||||||
|
s ~= tagName;
|
||||||
|
|
||||||
|
foreach(n, v ; attributes) {
|
||||||
|
s ~= " ";
|
||||||
|
s ~= n;
|
||||||
|
s ~= "=\"";
|
||||||
|
s ~= htmlEntitiesEncode(v);
|
||||||
|
s ~= "\"";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(selfClosed){
|
||||||
|
s ~= " />";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
s ~= ">";
|
||||||
|
|
||||||
|
// for simple `<collection><item>text</item><item>text</item></collection>`, let's
|
||||||
|
// just keep them on the same line
|
||||||
|
if(children.length == 1 && children[0].nodeType == NodeType.Text)
|
||||||
|
s ~= children[0].toString();
|
||||||
|
else
|
||||||
|
foreach(child; children) {
|
||||||
|
assert(child !is null);
|
||||||
|
|
||||||
|
s ~= child.toPrettyString(insertComments, indentationLevel + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// see comment above
|
||||||
|
if(!(children.length == 1 && children[0].nodeType == NodeType.Text))
|
||||||
|
s ~= toPrettyStringIndent(insertComments, indentationLevel);
|
||||||
|
|
||||||
|
s ~= "</";
|
||||||
|
s ~= tagName;
|
||||||
|
s ~= ">";
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/+
|
||||||
|
/// Writes out the opening tag only, if applicable.
|
||||||
|
string writeTagOnly(Appender!string where = appender!string()) const {
|
||||||
|
+/
|
||||||
|
|
||||||
/// This is the actual implementation used by toString. You can pass it a preallocated buffer to save some time.
|
/// This is the actual implementation used by toString. You can pass it a preallocated buffer to save some time.
|
||||||
/// Returns the string it creates.
|
/// Returns the string it creates.
|
||||||
string writeToAppender(Appender!string where = appender!string()) const {
|
string writeToAppender(Appender!string where = appender!string()) const {
|
||||||
|
@ -3530,6 +3613,13 @@ class DocumentFragment : Element {
|
||||||
return this.innerHTML(where);
|
return this.innerHTML(where);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override string toPrettyString(bool insertComments, int indentationLevel) const {
|
||||||
|
string s;
|
||||||
|
foreach(child; children)
|
||||||
|
s ~= child.toPrettyString(insertComments, indentationLevel);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
/// DocumentFragments don't really exist in a dom, so they ignore themselves in parent nodes
|
/// DocumentFragments don't really exist in a dom, so they ignore themselves in parent nodes
|
||||||
/*
|
/*
|
||||||
override inout(Element) parentNode() inout {
|
override inout(Element) parentNode() inout {
|
||||||
|
@ -3888,6 +3978,10 @@ class RawSource : SpecialElement {
|
||||||
return source;
|
return source;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override string toPrettyString(bool, int) const {
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
///.
|
///.
|
||||||
string source;
|
string source;
|
||||||
}
|
}
|
||||||
|
@ -3912,6 +4006,10 @@ abstract class ServerSideCode : SpecialElement {
|
||||||
return where.data[start .. $];
|
return where.data[start .. $];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override string toPrettyString(bool, int) const {
|
||||||
|
return "<" ~ source ~ ">";
|
||||||
|
}
|
||||||
|
|
||||||
///.
|
///.
|
||||||
string source;
|
string source;
|
||||||
}
|
}
|
||||||
|
@ -3957,6 +4055,14 @@ class BangInstruction : SpecialElement {
|
||||||
return where.data[start .. $];
|
return where.data[start .. $];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override string toPrettyString(bool, int) const {
|
||||||
|
string s;
|
||||||
|
s ~= "<!";
|
||||||
|
s ~= source;
|
||||||
|
s ~= ">";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
///.
|
///.
|
||||||
string source;
|
string source;
|
||||||
}
|
}
|
||||||
|
@ -3984,6 +4090,15 @@ class QuestionInstruction : SpecialElement {
|
||||||
return where.data[start .. $];
|
return where.data[start .. $];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override string toPrettyString(bool, int) const {
|
||||||
|
string s;
|
||||||
|
s ~= "<";
|
||||||
|
s ~= source;
|
||||||
|
s ~= ">";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///.
|
///.
|
||||||
string source;
|
string source;
|
||||||
}
|
}
|
||||||
|
@ -4011,6 +4126,15 @@ class HtmlComment : SpecialElement {
|
||||||
return where.data[start .. $];
|
return where.data[start .. $];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override string toPrettyString(bool, int) const {
|
||||||
|
string s;
|
||||||
|
s ~= "<!--";
|
||||||
|
s ~= source;
|
||||||
|
s ~= "-->";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///.
|
///.
|
||||||
string source;
|
string source;
|
||||||
}
|
}
|
||||||
|
@ -4070,6 +4194,29 @@ class TextNode : Element {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override string toPrettyString(bool insertComments = false, int indentationLevel = 0) const {
|
||||||
|
string s;
|
||||||
|
auto e = htmlEntitiesEncode(contents);
|
||||||
|
import std.algorithm.iteration : splitter;
|
||||||
|
bool first = true;
|
||||||
|
foreach(line; splitter(e, "\n")) {
|
||||||
|
if(first) {
|
||||||
|
s ~= toPrettyStringIndent(insertComments, indentationLevel);
|
||||||
|
first = false;
|
||||||
|
} else {
|
||||||
|
s ~= "\n";
|
||||||
|
if(insertComments)
|
||||||
|
s ~= "<!--";
|
||||||
|
foreach(i; 0 .. indentationLevel)
|
||||||
|
s ~= "\t";
|
||||||
|
if(insertComments)
|
||||||
|
s ~= "-->";
|
||||||
|
}
|
||||||
|
s ~= line;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
///.
|
///.
|
||||||
override Element appendChild(Element e) {
|
override Element appendChild(Element e) {
|
||||||
assert(0, "Cannot append to a text node");
|
assert(0, "Cannot append to a text node");
|
||||||
|
|
Loading…
Reference in New Issue