Mercurial > eldonilo > blog
annotate atom.js @ 7:7ab6b48122af
Add support for content in Atom and improve published display.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Wed, 02 Nov 2011 09:35:46 -0700 |
parents | 4d7a67349089 |
children | 461a24a5a788 |
rev | line source |
---|---|
0 | 1 'use strict'; |
2 | |
3 parsers[ns.atom] = function(id, xml) { | |
4 var toDate = function(atom) { | |
5 if (!atom) | |
5
4d7a67349089
Finish the changing of name to Eldonilo.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
2
diff
changeset
|
6 return new Date; |
0 | 7 |
8 var last = atom.getChild('updated'); | |
9 if (!last) { | |
10 last = atom.getChild('published'); | |
11 if (!last) | |
5
4d7a67349089
Finish the changing of name to Eldonilo.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
2
diff
changeset
|
12 return new Date; |
0 | 13 } |
14 | |
15 // var d = new Date(last); // FIXME: don't work in obsolete browsers | |
5
4d7a67349089
Finish the changing of name to Eldonilo.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
2
diff
changeset
|
16 var d = new Date; |
0 | 17 d.set8601(last); |
18 | |
19 return d; | |
20 }; | |
21 | |
22 var toHTML = function(atom, date) { | |
23 var article = document.createElementNS(ns.xhtml, 'article'); | |
24 | |
5
4d7a67349089
Finish the changing of name to Eldonilo.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
2
diff
changeset
|
25 article.setAttributeNS(ns.e, 'id', id); |
0 | 26 var d8601 = date.to8601(); |
5
4d7a67349089
Finish the changing of name to Eldonilo.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
2
diff
changeset
|
27 article.setAttributeNS(ns.e, 'date', d8601); |
0 | 28 |
29 var aside = document.createElementNS(ns.xhtml, 'aside'); | |
30 article.appendChild(aside); | |
31 | |
32 var atomTitle = atom.getChild('title'); | |
33 if (atomTitle) { | |
34 var title = document.createElementNS(ns.xhtml, 'h2'); | |
35 title.appendChild(document.createTextNode(atomTitle)); | |
36 article.appendChild(title); | |
37 } | |
38 | |
39 var footer = document.createElementNS(ns.xhtml, 'footer'); | |
40 | |
41 var atomAuthor = atom.getChild('author', ns.atom); | |
42 if (atomAuthor) { | |
43 var atomName = atomAuthor.getChild('name'); | |
44 | |
45 var atomURI = atomAuthor.getChild('uri'); | |
46 var cite = document.createElementNS(ns.xhtml, 'cite'); | |
47 if (atomURI) { | |
48 var a = document.createElementNS(ns.xhtml, 'a'); | |
49 a.href = atomURI; | |
50 var atomJID = new JID; | |
51 atomJID.uri = atomURI; | |
52 | |
53 a.appendChild(document.createTextNode(atomName? atomName: atomJID.bare)); | |
54 cite.appendChild(a); | |
55 | |
56 var img = document.createElementNS(ns.xhtml, 'img'); | |
1
82905edac9d8
Fix some things.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
57 img.src = 'http://eldonilo.linkmauve.fr/avatar/' + atomJID.bare; |
0 | 58 aside.appendChild(img); |
59 } else | |
60 cite.appendChild(document.createTextNode(atomName)); | |
61 | |
62 footer.appendChild(document.createTextNode('By ')); | |
63 footer.appendChild(cite); | |
64 | |
65 var atomEmail = atomAuthor.getChild('email'); | |
66 if (atomEmail) { | |
67 footer.appendChild(document.createTextNode(' (')); | |
68 var a = document.createElementNS(ns.xhtml, 'a'); | |
2
eb5b6d3ab09b
Better import of ns and jid; fix email and missing ns.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
69 a.href = 'mailto:' + atomEmail; |
0 | 70 a.appendChild(document.createTextNode('email')); |
71 footer.appendChild(a); | |
72 footer.appendChild(document.createTextNode(')')); | |
73 } | |
74 | |
75 article.appendChild(footer); | |
76 } | |
77 | |
78 footer.innerHTML += ', <time datetime="' + d8601 + '">' + date.getRelative() + '</time>'; | |
79 | |
80 var atomSummary = atom.getChild('summary'); | |
81 if (atomSummary) { | |
82 var p = document.createElementNS(ns.xhtml, 'p'); | |
83 p.appendChild(document.createTextNode(atomSummary)); | |
84 article.appendChild(p); | |
85 } | |
86 | |
7
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
87 var atomContent = atom.getChild('content'); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
88 if (atomContent) { |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
89 var contentType = atomContent.getAttribute('type'); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
90 if (/^text$/.test(contentType)) { |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
91 var p = document.createElementNS(ns.xhtml, 'p'); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
92 p.appendChild(document.createTextNode(atomContent.getText())); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
93 article.appendChild(p); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
94 } else if (/^html$/.test(contentType)) { |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
95 article.insertAdjacentHTML('beforeend', atomContent.getText()); // FIXME: could be not-well-formed. |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
96 } else if (/^xhtml$/.test(contentType)) { |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
97 // TODO: use a better xml2json lib that allow to json2xml |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
98 /*var div = atomContent.getChild(); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
99 article.appendChild(div.innerXml());*/ |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
100 } else { |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
101 var contentSrc = atomContent.getAttribute('src'); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
102 if (contentSrc) { |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
103 if (/^image\//.test(contentType)) { |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
104 var img = document.createElementNS(ns.xhtml, 'img'); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
105 img.setAttributeNS(null, 'src', contentSrc); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
106 article.appendChild(img); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
107 } else if (/^audio\//.test(contentType)) { |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
108 var audio = document.createElementNS(ns.xhtml, 'audio'); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
109 audio.setAttributeNS(null, 'src', contentSrc); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
110 audio.setAttributeNS(null, 'controls', ''); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
111 article.appendChild(audio); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
112 } else if (/^video\//.test(contentType)) { |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
113 var video = document.createElementNS(ns.xhtml, 'video'); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
114 video.setAttributeNS(null, 'src', contentSrc); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
115 video.setAttributeNS(null, 'controls', ''); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
116 article.appendChild(video); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
117 } else { |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
118 var a = document.createElementNS(ns.xhtml, 'a'); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
119 a.setAttributeNS(null, 'href', contentSrc); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
120 article.appendChild(a); |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
121 } |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
122 } |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
123 } |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
124 } |
7ab6b48122af
Add support for content in Atom and improve published display.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
125 |
0 | 126 var atomLinks = atom.getChildren('link'); |
127 for (var i in atomLinks) { | |
128 var atomLink = atomLinks[i]; | |
129 | |
130 if (atomLink['@rel'] !== 'replies') | |
131 continue; | |
132 | |
133 if (atomLink['@title'] !== 'comments') | |
134 continue; | |
135 | |
136 var href = new JID; | |
137 href.uri = atomLink['@href']; | |
138 | |
139 article.innerHTML += '<a href="?jid=' + href.bare + ';node=' + href.query.node + ';comments=' + params.jid + '/' + params.node + '">Comments !</a>'; | |
140 } | |
141 | |
142 return article; | |
143 }; | |
144 | |
145 this.xml = xml; | |
146 this.date = toDate(xml); | |
147 this.html = toHTML(xml, this.date); | |
148 } |