diff --git a/index.js b/index.js index 7a6c38d..6a5ed71 100644 --- a/index.js +++ b/index.js @@ -16,7 +16,10 @@ var { formatMsgs, wrapPage, renderThread, - renderAbout + renderAbout, + renderShowAll, + renderRssItem, + wrapRss, } = require('./render'); var appHash = hash([fs.readFileSync(__filename)]) @@ -90,35 +93,49 @@ exports.init = function (sbot, config) { } } - function serveFeed(req, res, feedId) { + function serveFeed(req, res, feedId, ext) { console.log("serving feed: " + feedId) - var showAll = req.url.endsWith("?showAll") - var showAllHTML = showAll ? '' : '
Show whole feed' + var showAll = req.url.endsWith("?showAll"); getAbout(feedId, function (err, about) { if (err) return respond(res, 500, err.stack || err) - pull( - sbot.createUserStream({ id: feedId, reverse: true, limit: showAll ? -1 : 10 }), - pull.collect(function (err, logs) { - if (err) return respond(res, 500, err.stack || err) - res.writeHead(200, { - 'Content-Type': ctype("html") - }) - pull( - pull.values(logs), - paramap(addAuthorAbout, 8), - paramap(addFollowAbout, 8), - paramap(addVoteMessage, 8), - paramap(addGitLinks, 8), - pull(renderAbout(defaultOpts, about, showAllHTML), wrapPage(about.name)), - toPull(res, function (err) { - if (err) console.error('[viewer]', err) - }) - ) - }) - ) + function render() { + switch (ext) { + case 'rss': + return pull( + // formatMsgs(feedId, ext, defaultOpts) + renderRssItem(defaultOpts), wrapRss(about.name, defaultOpts) + ); + default: + return pull( + renderAbout(defaultOpts, about, + renderShowAll(showAll, req.url)), wrapPage(about.name) + ); + } + } + + pull( + sbot.createUserStream({ id: feedId, reverse: true, limit: showAll ? -1 : (ext == 'rss' ? 25 :10) }), + pull.collect(function (err, logs) { + if (err) return respond(res, 500, err.stack || err) + res.writeHead(200, { + 'Content-Type': ctype(ext) + }) + pull( + pull.values(logs), + paramap(addAuthorAbout, 8), + paramap(addFollowAbout, 8), + paramap(addVoteMessage, 8), + paramap(addGitLinks, 8), + render(), + toPull(res, function (err) { + if (err) console.error('[viewer]', err) + }) + ) + }) + ) }) } @@ -196,7 +213,6 @@ exports.init = function (sbot, config) { console.log("serving channel: " + channelId) var showAll = req.url.endsWith("?showAll") - var showAllHTML = showAll ? '' : '
Show whole feed' pull( sbot.query.read({ limit: showAll ? 300 : 10, reverse: true, query: [{$filter: { value: { content: { channel: channelId }}}}]}), @@ -209,7 +225,9 @@ exports.init = function (sbot, config) { pull.values(logs), paramap(addAuthorAbout, 8), paramap(addVoteMessage, 8), - pull(renderThread(defaultOpts, showAllHTML), wrapPage('#' + channelId)), + pull(renderThread(defaultOpts, + renderShowAll(showAll, req.url)), + wrapPage('#' + channelId)), toPull(res, function (err) { if (err) console.error('[viewer]', err) }) @@ -363,6 +381,7 @@ function ctype(name) { case 'js': return 'text/javascript' case 'css': return 'text/css' case 'json': return 'application/json' + case 'rss': return 'text/xml' } } diff --git a/package.json b/package.json index adba0df..26d977a 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "emoji-named-characters": "^1.0.2", "emoji-server": "^1.0.0", "human-time": "^0.0.1", + "hyperscript": "2.0.2", "lrucache": "^1.0.2", "pull-cat": "^1.1.11", "pull-paramap": "^1.2.1", diff --git a/render.js b/render.js index fd9e95c..600698b 100644 --- a/render.js +++ b/render.js @@ -4,6 +4,7 @@ var marked = require("ssb-marked"); var htime = require("human-time"); var emojis = require("emoji-named-characters"); var cat = require("pull-cat"); +var h = require('hyperscript'); var emojiDir = path.join(require.resolve("emoji-named-characters"), "../pngs"); @@ -13,6 +14,9 @@ exports.renderEmoji = renderEmoji; exports.formatMsgs = formatMsgs; exports.renderThread = renderThread; exports.renderAbout = renderAbout; +exports.renderShowAll = renderShowAll; +exports.renderRssItem = renderRssItem; +exports.wrapRss = wrapRss; function MdRenderer(opts) { marked.Renderer.call(this, {}); @@ -39,17 +43,11 @@ MdRenderer.prototype.urltransform = function(href) { }; MdRenderer.prototype.image = function(href, title, text) { - return ( - '' +
-    text +
-    '" : ">") - ); + return h('img', + { src: this.opts.img_base + href, + alt: text, + title: title + }).outerHTML; }; function renderEmoji(emoji) { @@ -59,16 +57,12 @@ function renderEmoji(emoji) { ? opts.blob_base + encodeURIComponent(mentions[emoji]) : emoji in emojis && opts.emoji_base + escape(emoji) + '.png'; return url - ? ':' +
-        escape(emoji) +
-        ':' + ? h('img.ssb-emoji', + { src: url, + alt: ':' + escape(emoji) + ':', + title: ':' + escape(emoji) + ':', + height: 16, width: 16 + }).outerHTML : ":" + emoji + ":"; } @@ -88,6 +82,8 @@ function formatMsgs(id, ext, opts) { return pull(renderThread(opts), wrapJSEmbed(opts)); case "json": return wrapJSON(); + case "rss": + return pull(renderRssItem(opts), wrapRss(id, opts)); default: return null; } @@ -99,44 +95,52 @@ function wrap(before, after) { }; } +function callToAction() { + return h('a.call-to-action', + { href: 'https://www.scuttlebutt.nz' }, + 'Join Scuttlebutt now').outerHTML; +} + +function toolTipTop() { + return h('span.top-tip', + 'You are reading content from ', + h('a', { href: 'https://www.scuttlebutt.nz' }, + 'Scuttlebutt')).outerHTML; +} + function renderAbout(opts, about, showAllHTML = "") { + var figCaption = h('figcaption'); + figCaption.innerHTML = 'Feed of ' + about.name + '
' + + (about.description != undefined ? + marked(about.description, opts.marked) : ''); return pull( pull.map(renderMsg.bind(this, opts)), - wrap( - 'You are reading content from ' + - 'Scuttlebutt' + - '' + - '
' + - '
' + - '
' + - 'Feed of ' + about.name + '
' + - (about.description != undefined ? - marked(about.description, opts.marked) : '') + - '
', - - showAllHTML + '
' + - '' + - 'Join Scuttlebutt now' + - '' - ) + wrap(toolTipTop() + '
' + + h('article', + h('header', + h('figure', + h('img', + { src: opts.img_base + about.image, + height: 200, + width: 200 + }), + figCaption) + )).outerHTML, + showAllHTML + '
' + callToAction()) ); } function renderThread(opts, showAllHTML = "") { return pull( pull.map(renderMsg.bind(this, opts)), - wrap( - 'You are reading content from ' + - 'Scuttlebutt' + - '' + - '
', + wrap(toolTipTop() + '
', + showAllHTML + '
' + callToAction()) + ); +} - showAllHTML + '
' + - '' + - 'Join Scuttlebutt now' + - '' - ) +function renderRssItem(opts) { + return pull( + pull.map(renderRss.bind(this, opts)) ); } @@ -154,6 +158,18 @@ function wrapPage(id) { ); } +function wrapRss(id, opts) { + return wrap( + '' + + '' + + '' + + '' + id + ' | ssb-viewer', + + ''+ + '' + ); +} + var styles = `