diff atom.js @ 0:f62b5c395a48

Initial commit.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Sat, 04 Jun 2011 05:02:47 +0200
parents
children 82905edac9d8
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/atom.js
@@ -0,0 +1,109 @@
+'use strict';
+
+parsers[ns.atom] = function(id, xml) {
+	var toDate = function(atom) {
+		if (!atom)
+			return new Date();
+
+		var last = atom.getChild('updated');
+		if (!last) {
+			last = atom.getChild('published');
+			if (!last)
+				return new Date();
+		}
+
+		// var d = new Date(last); // FIXME: don't work in obsolete browsers
+		var d = new Date();
+		d.set8601(last);
+
+		return d;
+	};
+
+	var toHTML = function(atom, date) {
+		var article = document.createElementNS(ns.xhtml, 'article');
+
+		article.setAttributeNS(ns.idq, 'id', id);
+		var d8601 = date.to8601();
+		article.setAttributeNS(ns.idq, 'date', d8601);
+
+		var aside = document.createElementNS(ns.xhtml, 'aside');
+		article.appendChild(aside);
+
+		var atomTitle = atom.getChild('title');
+		if (atomTitle) {
+			var title = document.createElementNS(ns.xhtml, 'h2');
+			title.appendChild(document.createTextNode(atomTitle));
+			article.appendChild(title);
+		}
+
+		var footer = document.createElementNS(ns.xhtml, 'footer');
+
+		var atomAuthor = atom.getChild('author', ns.atom);
+		if (atomAuthor) {
+			var atomName = atomAuthor.getChild('name');
+
+			var atomURI = atomAuthor.getChild('uri');
+			var cite = document.createElementNS(ns.xhtml, 'cite');
+			if (atomURI) {
+				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 = 'http://linkmauve.fr/avatar/' + atomJID.bare;
+				aside.appendChild(img);
+			} else
+				cite.appendChild(document.createTextNode(atomName));
+
+			footer.appendChild(document.createTextNode('By '));
+			footer.appendChild(cite);
+
+			var atomEmail = atomAuthor.getChild('email');
+			if (atomEmail) {
+				footer.appendChild(document.createTextNode(' ('));
+				var a = document.createElementNS(ns.xhtml, 'a');
+				a.href = atomEmail;
+				a.appendChild(document.createTextNode('email'));
+				footer.appendChild(a);
+				footer.appendChild(document.createTextNode(')'));
+			}
+
+			article.appendChild(footer);
+		}
+
+		footer.innerHTML += ', <time datetime="' + d8601 + '">' + date.getRelative() + '</time>';
+
+		var atomSummary = atom.getChild('summary');
+		if (atomSummary) {
+			var p = document.createElementNS(ns.xhtml, 'p');
+			p.appendChild(document.createTextNode(atomSummary));
+			article.appendChild(p);
+		}
+
+		var atomLinks = atom.getChildren('link');
+		for (var i in atomLinks) {
+			var atomLink = atomLinks[i];
+
+			if (atomLink['@rel'] !== 'replies')
+				continue;
+
+			if (atomLink['@title'] !== 'comments')
+				continue;
+
+			var href = new JID;
+			href.uri = atomLink['@href'];
+
+			article.innerHTML += '<a href="?jid=' + href.bare + ';node=' + href.query.node + ';comments=' + params.jid + '/' + params.node + '">Comments !</a>';
+		}
+
+		return article;
+	};
+
+	this.xml = xml;
+	this.date = toDate(xml);
+	this.html = toHTML(xml, this.date);
+}