view atom.js @ 13:161d4ea1c3f8

Migration of the client-side to XMPP.js instead of Strophe.js. Drop BOSH support and add WebSockets support. The server-side is untested, may be broken.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Thu, 03 Nov 2011 14:23:10 -0700
parents 360186772aa3
children 03be0717d3f8
line wrap: on
line source

'use strict';

if (!document)
	var document = {};

if (!document.createElementNS)
	document.createElementNS = function(ns, name) {
		return new Element(name, {xmlns: ns});
	};

if (!document.createTextNode)
	document.createTextNode = function(text) {
		return text;
	};

parsers[ns.atom] = function(item) {
	var toDate = function(atom) {
		var d = new Date;

		if (!atom)
			return d;

		try {
			var last = atom.getElementsByTagNameNS(ns.atom, 'updated')[0].textContent;
		} catch (e) {
			try {
				var last = atom.getElementsByTagNameNS(ns.atom, 'published')[0].textContent;
			} catch (e) {
				return d;
			}
		}

		// var d = new Date(last); // FIXME: don't work in obsolete browsers
		d.set8601(last);

		return d;
	};

	var toHTML = function(item, date) {
		var atom = item.payload;
		var id = item.id;

		var article = document.createElementNS(ns.xhtml, 'article');

		article.setAttributeNS(ns.e, 'id', id);
		var d8601 = date.to8601();
		article.setAttributeNS(ns.e, 'date', d8601);

		var aside = document.createElementNS(ns.xhtml, 'aside');
		article.appendChild(aside);

		try {
			var atomTitle = atom.getElementsByTagNameNS(ns.atom, 'title')[0].textContent;
			var title = document.createElementNS(ns.xhtml, 'h2');
			title.appendChild(document.createTextNode(atomTitle));
			article.appendChild(title);
		} catch (e) {
		}

		var footer = document.createElementNS(ns.xhtml, 'footer');

		try {
			var atomAuthor = atom.getElementsByTagNameNS(ns.atom, 'author')[0];
			try {
				var atomName = atomAuthor.getElementsByTagNameNS(ns.atom, 'name')[0].textContent;
			} catch (e) {
			}

			var cite = document.createElementNS(ns.xhtml, 'cite');
			try {
				var atomURI = atomAuthor.getElementsByTagNameNS(ns.atom, 'uri')[0].textContent;
				var a = document.createElementNS(ns.xhtml, 'a');
				a.href = atomURI;
				var atomJID = new JID;
				atomJID.uri = atomURI;

				a.appendChild(document.createTextNode(atomName? atomName: atomJID.bare));
				cite.appendChild(a);

				var img = document.createElementNS(ns.xhtml, 'img');
				img.src = config.avatarRoot + atomJID.bare;
				aside.appendChild(img);
			} catch (e) {
				cite.appendChild(document.createTextNode(atomName));
			}

			footer.appendChild(document.createTextNode('By '));
			footer.appendChild(cite);

			try {
				var atomEmail = atomAuthor.getElementsByTagNameNS(ns.atom, 'email')[0].textContent;
				footer.appendChild(document.createTextNode(' ('));
				var a = document.createElementNS(ns.xhtml, 'a');
				a.href = 'mailto:' + atomEmail;
				a.appendChild(document.createTextNode('email'));
				footer.appendChild(a);
				footer.appendChild(document.createTextNode(')'));
			} catch (e) {
			}

			article.appendChild(footer);
		} catch (e) {
		}

		footer.innerHTML += ', <time datetime="' + d8601 + '">' + date.getRelative() + '</time>';

		try {
			var atomSummary = atomAuthor.getElementsByTagNameNS(ns.atom, 'summary')[0].textContent;
			var p = document.createElementNS(ns.xhtml, 'p');
			p.appendChild(document.createTextNode(atomSummary));
			article.appendChild(p);
		} catch (e) {
		}

		try {
			var atomContent = atom.getElementsByTagNameNS(ns.atom, 'content')[0];
			var contentType = atomContent.getAttributeNS(null, 'type');
			if (/^text$/.test(contentType)) {
				var p = document.createElementNS(ns.xhtml, 'p');
				p.appendChild(document.createTextNode(atomContent.textContent));
				article.appendChild(p);
			} else if (/^html$/.test(contentType)) {
				article.insertAdjacentHTML('beforeend', atomContent.textContent); // FIXME: could be not-well-formed.
			} else if (/^xhtml$/.test(contentType)) {
				var div = atomContent.firstChild;
				var children = div.childNodes;
				for (var i=0; i<children.length; i++)
					article.appendChild(children[i].cloneNode(true));
			} else {
				var contentSrc = atomContent.getAttributeNS(null, 'src');
				if (contentSrc) {
					if (/^image\//.test(contentType)) {
						var img = document.createElementNS(ns.xhtml, 'img');
						img.setAttributeNS(null, 'src', contentSrc);
						article.appendChild(img);
					} else if (/^audio\//.test(contentType)) {
						var audio = document.createElementNS(ns.xhtml, 'audio');
						audio.setAttributeNS(null, 'src', contentSrc);
						audio.setAttributeNS(null, 'controls', '');
						article.appendChild(audio);
					} else if (/^video\//.test(contentType)) {
						var video = document.createElementNS(ns.xhtml, 'video');
						video.setAttributeNS(null, 'src', contentSrc);
						video.setAttributeNS(null, 'controls', '');
						article.appendChild(video);
					} else {
						var a = document.createElementNS(ns.xhtml, 'a');
						a.setAttributeNS(null, 'href', contentSrc);
						article.appendChild(a);
					}
				}
			}
		} catch (e) {
		}

		var atomLinks = atom.getElementsByTagNameNS(ns.atom, 'link');
		for (var i in atomLinks) {
			var atomLink = atomLinks[i];

			if (atomLink.getAttributeNS(null, 'rel') !== 'replies')
				continue;

			if (atomLink.getAttributeNS(null, 'title') !== 'comments')
				continue;

			var href = new JID;
			href.uri = atomLink.getAttributeNS(null, 'href');

			article.innerHTML += '<a href="?jid=' + href.bare + ';node=' + href.query.node + ';comments=' + params.jid + '/' + params.node + '">Comments !</a>';
		}

		return article;
	};

	this.xml = item.payload;
	this.date = toDate(item.payload);
	this.html = toHTML(item, this.date);
}