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 (
- '
" : ">")
- );
+ 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
- ? '
'
+ ? 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 = `