List Injection for PRE Tags

This doc is outdated, please see the new version

As suggested by Ingo Chao in a problem with the impression of the tag pre, I've developed a Javascript function (beta!) to convert any <pre class="code"> element into an ordered list.

This demonstrates that my Javascript is better than my English.

Please see source (or below) for details.

Regards,
Choan C. Gálvez <choan@alice.0z0ne.com>

function doListings() {

	var pres = document.getElementsByTagName('pre');

	for (var i = 0; i < pres.length; i++) {
		var pre = pres[i];
		if (pre.className != 'code') {
			continue;
		};
		if (document.all) {
			var content = pre.innerText;
		} else {
			var content = pre.firstChild.nodeValue;
		}
		content = content.replace(/^(\n|\r\n)/, ''); /* trim empty lines at start */
		content = content.replace(/(\n|\r\n)$/, ''); /* trim empty lines at the end */
		content = content.replace('XXXdummyXXX', 'YYYdummyYYY');
		content = content.replace(/\n|\r\n/g, 'XXXdummyXXX'); /* dummy replace, there are some bugs with empty lines */
		var lines = content.split('XXXdummyXXX');
				var ol = document.createElement('ol');
		ol.className = 'code';
		for (var j = 0; j < lines.length; j++) {
			lines[j] = lines[j].replace(/\t/g, '    ');
			lines[j] = lines[j].replace('YYYdummyYYY', 'XXXdummyXXX');
			var cname = 'indent' + (countSpaces(lines[j]) / 4);
			var li = document.createElement('li');
			var span = document.createElement('span');
			span.className = cname;
			var content = document.createTextNode(lines[j] + "\u00A0"); /* Unicode non-breaking space fix for Firefox */
			span.appendChild(content);
			li.appendChild(span);
			ol.appendChild(li);
		};

		pre.parentNode.replaceChild(ol, pre);
	};

	function countSpaces(s) {
		var spaceCount = 0;
		for (var i = 0; i < s.length; i++) {
			if (' ' == s.substr(i,1)) {
				spaceCount++;
			} else {
				break;
			}
		};
		return spaceCount;
	}
}

window.onload = doListings;

Created 2005-06/23