Mercurial > eldonilo > blog
comparison server.js @ 14:03be0717d3f8
Use the same code for client- and server-side Atom parsing.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Thu, 03 Nov 2011 16:42:00 -0700 |
parents | 360186772aa3 |
children | 5149a856d9dd |
comparison
equal
deleted
inserted
replaced
13:161d4ea1c3f8 | 14:03be0717d3f8 |
---|---|
12 var Element = xmpp.Element; | 12 var Element = xmpp.Element; |
13 var JID = require('./jid'); | 13 var JID = require('./jid'); |
14 var ns = require('./ns'); | 14 var ns = require('./ns'); |
15 var forms = require('./forms'); | 15 var forms = require('./forms'); |
16 require('./date'); | 16 require('./date'); |
17 var Atom = require('./atom'); | |
17 | 18 |
18 var received = {}; | 19 var received = {}; |
19 | 20 |
20 var cl = new xmpp.Client(config); | 21 var cl = new xmpp.Client(config); |
21 | 22 |
146 if (payload) | 147 if (payload) |
147 return handlePubSub(payload, stanza.attrs.from); | 148 return handlePubSub(payload, stanza.attrs.from); |
148 } | 149 } |
149 }); | 150 }); |
150 | 151 |
151 var parseAtom = function(atom, id, jid) { | |
152 var article = new Element('article', {'e:id': id}); | |
153 | |
154 var avatar = article.c('aside').c('img') | |
155 article.up(); | |
156 | |
157 try { | |
158 var title = atom.getChild('title', ns.atom).getText(); | |
159 if (title) | |
160 article.c('h2').t(title).up(); | |
161 } catch (e) { } | |
162 | |
163 var footer = article.c('footer'); | |
164 article.up(); | |
165 | |
166 var author = atom.getChild('author', ns.atom); | |
167 if (author) { | |
168 footer.t('By '); | |
169 var name = author.getChild('name', ns.atom).getText(); | |
170 | |
171 try{ | |
172 var uri = author.getChild('uri', ns.atom).getText(); | |
173 footer.c('cite').c('a', {href: uri}).t(name).up(); | |
174 avatar.attrs.src = config.avatarRoot + uri.substring(5); | |
175 avatar.attrs.alt = uri.substring(5); | |
176 } catch (e) { | |
177 footer.c('cite').t(name); | |
178 } | |
179 | |
180 try { | |
181 var email = author.getChild('email', ns.atom).getText(); | |
182 footer.t(' (').c('a', {href: 'mailto:' + email}).t('email').up().t(')'); | |
183 } catch (e) { } | |
184 footer.up(); | |
185 } | |
186 | |
187 var published = (function() { | |
188 try { | |
189 var elem = atom.getChild('published', ns.atom); | |
190 var iso8601 = elem.getText(); | |
191 var d = (new Date).set8601(iso8601); | |
192 var relative = d.getRelative(); | |
193 | |
194 return {iso8601: iso8601, relative: relative}; | |
195 } catch (e) { | |
196 var d = new Date; | |
197 return {iso8601: d.to8601(), relative: d.getRelative()}; | |
198 } | |
199 })(); | |
200 | |
201 if (author) | |
202 footer.t(', '); | |
203 footer.c('time', {datetime: published.iso8601}).t(published.relative).up(); | |
204 article.attrs['e:date'] = published.iso8601; | |
205 | |
206 try { | |
207 var summary = atom.getChild('summary', ns.atom).getText(); | |
208 if (summary) | |
209 article.c('p').t(summary).up(); | |
210 } catch (e) { } | |
211 | |
212 try { | |
213 var links = atom.getChildren('link'); | |
214 for (var i in links) { | |
215 var link = links[i]; | |
216 | |
217 if (link.attrs.rel !== 'replies') | |
218 continue; | |
219 | |
220 if (link.attrs.title !== 'comments') | |
221 continue; | |
222 | |
223 var href = new JID; | |
224 href.uri = link.attrs.href; | |
225 | |
226 article.c('a', {href: '?jid=' + href.bare + ';node=' + href.query.node + ';origjid=' + jid.bare + ';orignode=' + jid.resource + ';origitem=' + id}).t('Comments !'); | |
227 break; | |
228 } | |
229 } catch (e) { } | |
230 | |
231 return article; | |
232 }; | |
233 | |
234 var generatePage = function(jid) { | 152 var generatePage = function(jid) { |
235 var r = received[jid.full]; | 153 var r = received[jid.full]; |
236 var s = r.wait; | 154 var s = r.wait; |
237 var form = r.form; | 155 var form = r.form; |
238 var data = r.data; | 156 var data = r.data; |
249 | 167 |
250 var makePage = function(res, jid, form, data, noscript) { | 168 var makePage = function(res, jid, form, data, noscript) { |
251 var body = '</div>'; | 169 var body = '</div>'; |
252 | 170 |
253 for (var id in data) { | 171 for (var id in data) { |
254 var item = data[id]; | 172 var payload = data[id]; |
255 var article = parseAtom(item, id, jid); | 173 var article = new Atom({id: id, ns: payload.attrs['xmlns'], payload: payload}); // , jid ? |
256 body = article + body; | 174 body = article.html + body; |
257 } | 175 } |
258 body = '<div e:jid="' + jid.full + '">' + body; | 176 body = '<div e:jid="' + jid.full + '">' + body; |
259 | 177 |
260 home(res, form['pubsub#title'], form['pubsub#description'], body, 'Node created the <time>' + form['pubsub#creation_date'] + '</time> by <cite>' + form['pubsub#creator'] + '</cite> with <a href="http://linkmauve.fr/dev/eldonilo/blog">Eldonilo blog</a>.', noscript); | 178 home(res, form['pubsub#title'], form['pubsub#description'], body, 'Node created the <time>' + form['pubsub#creation_date'] + '</time> by <cite>' + form['pubsub#creator'] + '</cite> with <a href="http://linkmauve.fr/dev/eldonilo/blog">Eldonilo blog</a>.', noscript); |
261 }; | 179 }; |