function Comments(modules) { var comments = modules.cache.make(function(threadId) { return modules.async.bind( modules.async.http({method: 'GET', url: url(threadId)}), function(queryResult) { if(queryResult.status == 200) { try { return modules.async.wrap(render(JSON.parse(queryResult.responseText))); } catch(e) { return modules.async.fail('Server returned invalid JSON for ' + url); } } else { return modules.async.fail('Could not load comments at ' + url); } } ); }) return { get: get }; function url(threadId) { return blog.path.commentsAt + '/api/v1/statuses/' + threadId + '/context'; } function get(articleKey) { var threadId = blog.articles[articleKey].metadata.comments; if(blog.path.commentsAt != undefined && threadId != undefined) { var ul = modules.dom.make('ul'); modules.async.run( modules.async.bind( comments.get(threadId), modules.async.map(function(comments) { comments.forEach(function(comment) {ul.appendChild(comment);}); }) ) ); return emptySection(ul, threadId); } else { return []; } } function emptySection(ul, threadId) { return [modules.dom.make('div', {class: 'comments'}, [ modules.dom.make('h2', {innerText: 'Comments'}), ul, modules.dom.make('a', { href: blog.path.commentsAt + '/notice/' + threadId, innerText: 'Comment on the fediverse' }) ])]; } function render(comments) { return comments.descendants.map(function(descendant) { return modules.dom.make('li', {}, [ modules.dom.make('cite', {}, [ modules.dom.make('a', { href: descendant.account.url, innerText: descendant.account.username }), modules.dom.make('p', {innerText: descendant.created_at}), modules.dom.make('div', {innerHTML: descendant.content}) ]) ]); }); } }