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~=""; 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