Commit 22f627e1baaa2c6222122fc8361f75a9fdc2329e
Render rating messages so they are easier to interact with
Anders Rune Jensen committed on 11/21/2017, 8:55:46 PMParent: 0eecf56eb9dbb28cfd8e68836c5d7f71c3d6675d
Files changed
book/html/layout/detail.js | changed |
book/html/simple-emoji.js | added |
message/html/render/about-subjective.js | added |
message/html/render/about-subjective.mcss | added |
book/html/layout/detail.js | ||
---|---|---|
@@ -1,16 +1,15 @@ | ||
1 | 1 … | const nest = require('depnest') |
2 | 2 … | const { h, when, computed, Value } = require('mutant') |
3 | -var htmlEscape = require('html-escape') | |
4 | 3 … | const addSuggest = require('suggest-box') |
5 | 4 … | |
6 | 5 … | exports.needs = nest({ |
7 | 6 … | 'book.obs.book': 'first', |
8 | 7 … | 'about.html.image': 'first', |
9 | 8 … | 'about.obs.name': 'first', |
10 | 9 … | 'keys.sync.id': 'first', |
11 | 10 … | 'emoji.async.suggest': 'first', |
12 | - 'emoji.sync.url': 'first', | |
11 … | + 'book.html.simpleEmoji': 'first', | |
13 | 12 … | 'message.html': { |
14 | 13 … | 'markdown': 'first' |
15 | 14 … | }, |
16 | 15 … | 'book.html': { |
@@ -26,35 +25,16 @@ | ||
26 | 25 … | |
27 | 26 … | exports.create = (api) => { |
28 | 27 … | return nest('book.html.layout', bookLayout) |
29 | 28 … | |
30 | - function renderEmoji (emoji, url) { | |
31 | - if (!url) return ':' + emoji + ':' | |
32 | - return ` | |
33 | - <img | |
34 | - src="${htmlEscape(url)}" | |
35 | - alt=":${htmlEscape(emoji)}:" | |
36 | - title=":${htmlEscape(emoji)}:" | |
37 | - class="emoji" | |
38 | - > | |
39 | - ` | |
40 | - } | |
41 | - | |
42 | - function simpleMarkdown(text) { | |
43 | - if (text.startsWith(':')) | |
44 | - return renderEmoji(text, api.emoji.sync.url(text.match(/:([^:]*)/)[1])) | |
45 | - else | |
46 | - return text | |
47 | - } | |
48 | - | |
49 | 29 … | function ratingEdit(isEditing, value) { |
50 | 30 … | return when(isEditing, |
51 | 31 … | h('input', { |
52 | 32 … | 'ev-input': e => value.set(e.target.value), |
53 | 33 … | value, |
54 | 34 … | placeholder: 'your rating' |
55 | 35 … | }), |
56 | - h('span.text', { innerHTML: computed(value, simpleMarkdown) }) | |
36 … | + h('span.text', { innerHTML: computed(value, api.book.html.simpleEmoji) }) | |
57 | 37 … | ) |
58 | 38 … | } |
59 | 39 … | |
60 | 40 … | function ratingTypeEdit(isEditing, value) { |
@@ -75,9 +55,9 @@ | ||
75 | 55 … | value.set(ev.detail.value) |
76 | 56 … | }) |
77 | 57 … | |
78 | 58 … | return when(isEditing, suggestWrapper, |
79 | - h('span.text', { innerHTML: computed(value, simpleMarkdown) })) | |
59 … | + h('span.text', { innerHTML: computed(value, api.book.html.simpleEmoji) })) | |
80 | 60 … | } |
81 | 61 … | |
82 | 62 … | function simpleEdit(isEditing, name, value) { |
83 | 63 … | const classList = computed([value, isEditing], (v, e) => { |
book/html/simple-emoji.js | ||
---|---|---|
@@ -1,0 +1,31 @@ | ||
1 … | +var nest = require('depnest') | |
2 … | +var htmlEscape = require('html-escape') | |
3 … | + | |
4 … | +exports.needs = nest({ | |
5 … | + 'emoji.sync.url': 'first' | |
6 … | +}) | |
7 … | + | |
8 … | +exports.gives = nest('book.html.simpleEmoji') | |
9 … | + | |
10 … | +exports.create = function (api) { | |
11 … | + return nest('book.html.simpleEmoji', simpleMarkdown) | |
12 … | + | |
13 … | + function renderEmoji (emoji, url) { | |
14 … | + if (!url) return ':' + emoji + ':' | |
15 … | + return ` | |
16 … | + <img | |
17 … | + src="${htmlEscape(url)}" | |
18 … | + alt=":${htmlEscape(emoji)}:" | |
19 … | + title=":${htmlEscape(emoji)}:" | |
20 … | + class="emoji" | |
21 … | + > | |
22 … | + ` | |
23 … | + } | |
24 … | + | |
25 … | + function simpleMarkdown(text) { | |
26 … | + if (text.startsWith(':')) | |
27 … | + return renderEmoji(text, api.emoji.sync.url(text.match(/:([^:]*)/)[1])) | |
28 … | + else | |
29 … | + return text | |
30 … | + } | |
31 … | +} |
message/html/render/about-subjective.js | ||
---|---|---|
@@ -1,0 +1,60 @@ | ||
1 … | +const { h, Value, computed } = require('mutant') | |
2 … | +var nest = require('depnest') | |
3 … | +var extend = require('xtend') | |
4 … | + | |
5 … | +exports.needs = nest({ | |
6 … | + 'about.obs.latestValue': 'first', | |
7 … | + 'sbot.async.get': 'first', | |
8 … | + 'book.html.simpleEmoji': 'first', | |
9 … | + 'message.html': { | |
10 … | + decorate: 'reduce', | |
11 … | + layout: 'first', | |
12 … | + markdown: 'first' | |
13 … | + } | |
14 … | +}) | |
15 … | + | |
16 … | +exports.gives = nest('message.html.render') | |
17 … | + | |
18 … | +exports.create = function (api) { | |
19 … | + return nest('message.html.render', subjective) | |
20 … | + | |
21 … | + function subjective(msg, opts) { | |
22 … | + if (!msg.value || !msg.value.content) | |
23 … | + return | |
24 … | + | |
25 … | + const content = msg.value.content | |
26 … | + | |
27 … | + if (content.type == 'about' && content.rating && content.ratingType) | |
28 … | + { | |
29 … | + const element = api.message.html.layout(msg, extend({ | |
30 … | + content: renderSubjective(msg), | |
31 … | + layout: content.review ? 'default' : 'mini' | |
32 … | + }, opts)) | |
33 … | + | |
34 … | + return api.message.html.decorate(element, { msg }) | |
35 … | + } | |
36 … | + } | |
37 … | + | |
38 … | + function bookTitle(msg) { | |
39 … | + const name = Value('') | |
40 … | + const bookKey = msg.value.content.about | |
41 … | + api.sbot.async.get(bookKey, (err, msg) => { | |
42 … | + let originalTitle = msg.content.title | |
43 … | + let latestTitle = api.about.obs.latestValue(bookKey, 'title')() | |
44 … | + name.set(latestTitle || originalTitle) | |
45 … | + }) | |
46 … | + return name | |
47 … | + } | |
48 … | + | |
49 … | + function renderSubjective(msg) { | |
50 … | + let title = bookTitle(msg) | |
51 … | + const content = msg.value.content | |
52 … | + return ['Rated ', h('a', { href: msg.value.content.about }, title), | |
53 … | + ' ' + content.rating + ' ', | |
54 … | + h('span.text', { innerHTML: | |
55 … | + computed(content.ratingType, | |
56 … | + api.book.html.simpleEmoji) }), | |
57 … | + computed(content.review, api.message.html.markdown) | |
58 … | + ] | |
59 … | + } | |
60 … | +} |
Built with git-ssb-web