module html;
import Tools;
interface element {
char[] toHtml();
}
interface htmlObject {
tree htmlEncode();
}
class tag : element {
char[] name;
char[][char[]] properties;
this(char[] n) {
name=n;
}
char[] toHtml() {
char[] result="<"~name;
foreach (i, p; properties) result~=" "~i~"="~p;
result~=">";
return result;
}
}
/// \todo proper encoding
class text : element {
private char[] data;
this(char[] t) { data=t; }
char[] toHtml() { return data; }
}
class tree : element {
tag root;
this(tag t, element[] elements ...) {
root=t;
foreach (e; elements) children~=e;
}
this(char[] t, element[] elements ...) {
this(new tag(t), elements);
}
element[] children;
char[] toHtml() {
char[] result=root.toHtml()~"\n";
foreach (c; children) result~=c.toHtml()~"\n";
result~=""~root.name~">";
return result;
}
}
tree[] gather(tree source) {
tree[] result;
foreach (e; source.children) {
if (cast(tree)e) {
result~=cast(tree)e;
result~=gather(cast(tree)e);
}
}
return result;
}
tree[] gather(element[] sources) {
tree[] result;
foreach (t; sources) {
if (cast(tree)t) result~=gather(cast(tree)t);
}
return result;
}
tree makeTable(size_t rows, size_t cols, element[] elements ...) {
assert(rows>0); assert(cols>0);
size_t counter=0;
tree table=new tree("table");
for (int i=0; i