aboutsummaryrefslogtreecommitdiff
path: root/lib/serve.js
diff options
context:
space:
mode:
authorcel <cel@f/6sQ6d2CMxRUhLpspgGIulDxDCwYD7DzFzPNr7u5AU=.ed25519>2017-05-29 06:38:49 -1000
committercel <cel@f/6sQ6d2CMxRUhLpspgGIulDxDCwYD7DzFzPNr7u5AU=.ed25519>2017-05-30 09:58:53 -1000
commit35a3dedeb8b9670721bd363031083cc2c90fa085 (patch)
tree96fca1e6767d22556f096ab8bb535aa2cfbe2265 /lib/serve.js
parent9e859f9fe19da67e9688bd4310bd2bae75b3d5c1 (diff)
downloadpatchfoo-35a3dedeb8b9670721bd363031083cc2c90fa085.tar.gz
patchfoo-35a3dedeb8b9670721bd363031083cc2c90fa085.zip
Implement custom emoji rendering and uploading
Diffstat (limited to 'lib/serve.js')
-rw-r--r--lib/serve.js59
1 files changed, 52 insertions, 7 deletions
diff --git a/lib/serve.js b/lib/serve.js
index 9d907e0..e0c089c 100644
--- a/lib/serve.js
+++ b/lib/serve.js
@@ -74,6 +74,11 @@ Serve.prototype.go = function () {
filesCb(function (err) {
gotData(err, data)
})
+ function addField(name, value) {
+ if (!(name in data)) data[name] = value
+ else if (Array.isArray(data[name])) data[name].push(value)
+ else data[name] = [data[name], value]
+ }
busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
var done = multicb({pluck: 1, spread: true})
var cb = filesCb()
@@ -85,14 +90,13 @@ Serve.prototype.go = function () {
done(function (err, size, id) {
if (err) return cb(err)
if (size === 0 && !filename) return cb()
- data[fieldname] = {link: id, name: filename, type: mimetype, size: size}
+ addField(fieldname,
+ {link: id, name: filename, type: mimetype, size: size})
cb()
})
})
busboy.on('field', function (fieldname, val, fieldnameTruncated, valTruncated, encoding, mimetype) {
- if (!(fieldname in data)) data[fieldname] = val
- else if (Array.isArray(data[fieldname])) data[fieldname].push(val)
- else data[fieldname] = [data[fieldname], val]
+ addField(fieldname, val)
})
this.req.pipe(busboy)
} else {
@@ -1921,6 +1925,20 @@ Serve.prototype.composer = function (opts, cb) {
formNames[mentionNames[i]] = u.extractFeedIds(mentionIds[i])[0]
}
+ var formEmojiNames = {}
+ var emojiIds = u.toArray(data.emoji_id)
+ var emojiNames = u.toArray(data.emoji_name)
+ var emojiUploads = u.toArray(data.emoji_upload)
+ for (var i = 0; i < emojiIds.length && i < emojiNames.length; i++) {
+ var upload = emojiUploads[i]
+ formEmojiNames[emojiNames[i]] =
+ (upload && upload.link) || u.extractBlobIds(emojiIds[i])[0]
+ if (upload) blobs[upload.link] = {
+ type: upload.type,
+ size: upload.size,
+ }
+ }
+
if (data.upload) {
// TODO: be able to change the content-type
var isImage = /^image\//.test(data.upload.type)
@@ -1931,7 +1949,8 @@ Serve.prototype.composer = function (opts, cb) {
// get bare feed names
var unknownMentionNames = {}
- var unknownMentions = ssbMentions(data.text, {bareFeedNames: true})
+ var mentions = ssbMentions(data.text, {bareFeedNames: true, emoji: true})
+ var unknownMentions = mentions
.filter(function (mention) {
return mention.link === '@'
})
@@ -1944,6 +1963,15 @@ Serve.prototype.composer = function (opts, cb) {
return {name: name, id: id}
})
+ var emoji = mentions
+ .filter(function (mention) { return mention.emoji })
+ .map(function (mention) { return mention.name })
+ .filter(uniques())
+ .map(function (name) {
+ var id = formEmojiNames[name] || self.app.getReverseEmojiNameSync(name)
+ return {name: name, id: id}
+ })
+
// strip content other than feed ids from the recps field
if (data.recps) {
data.recps = u.extractFeedIds(data.recps).filter(uniques()).join(', ')
@@ -1982,7 +2010,19 @@ Serve.prototype.composer = function (opts, cb) {
h('input', {name: 'mention_name', type: 'hidden',
value: mention.name}),
h('input.id-input', {name: 'mention_id', size: 60,
- value: mention.id, placeholder: 'id'}))
+ value: mention.id, placeholder: '@id'}))
+ }))
+ ] : '',
+ emoji.length > 0 ? [
+ h('div', h('em', 'emoji:')),
+ h('ul.mentions', emoji.map(function (link) {
+ return h('li',
+ h('code', link.name), ': ',
+ h('input', {name: 'emoji_name', type: 'hidden',
+ value: link.name}),
+ h('input.id-input', {name: 'emoji_id', size: 60,
+ value: link.id, placeholder: '&id'}), ' ',
+ h('input', {type: 'file', name: 'emoji_upload'}))
}))
] : '',
h('table.ssb-msgs',
@@ -2013,8 +2053,13 @@ Serve.prototype.composer = function (opts, cb) {
type: 'post',
text: data.text,
}
- var mentions = ssbMentions(data.text, {bareFeedNames: true})
+ var mentions = ssbMentions(data.text, {bareFeedNames: true, emoji: true})
.filter(function (mention) {
+ if (mention.emoji) {
+ mention.link = formEmojiNames[mention.name]
+ || self.app.getReverseEmojiNameSync(mention.name)
+ if (!mention.link) return false
+ }
var blob = blobs[mention.link]
if (blob) {
if (!isNaN(blob.size))