All pastes #145253 Raw Edit

line

public text v1 · immutable
#145253 ·published 2006-08-22 21:49 UTC
rendered paste body
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<rows; ++i) {
		tree row=new tree("tr");
		table.children~=row;
		for (int j=0; j<cols; ++j) {
			tree col=new tree("td");
			row.children~=col;
			col.children~=elements[counter++];
		}
	}
	return table;
}