Files: 27b98ddcb4a61a15e2b1b237e0ead0de6cd87798 / index.js
2576 bytesRaw
1 | var ref = require('ssb-ref') |
2 | var marked = require('ssb-marked') |
3 | function noop(){} |
4 | var onLink = noop |
5 | var extractor = new marked.Renderer() |
6 | |
7 | // prevent html from entering into mention labels. |
8 | // code taken from ssb-markdown |
9 | extractor.code = function(code, lang, escaped) { return escaped ? unquote(code) : code } |
10 | extractor.blockquote = function(quote) { return unquote(quote) } |
11 | extractor.html = function(html) { return false } |
12 | extractor.heading = function(text, level, raw) { return unquote(text)+' ' } |
13 | extractor.hr = function() { return ' --- ' } |
14 | extractor.br = function() { return ' ' } |
15 | extractor.list = function(body, ordered) { return unquote(body) } |
16 | extractor.listitem = function(text) { return '- '+unquote(text) } |
17 | extractor.paragraph = function(text) { return unquote(text)+' ' } |
18 | extractor.table = function(header, body) { return unquote(header + ' ' + body) } |
19 | extractor.tablerow = function(content) { return unquote(content) } |
20 | extractor.tablecell = function(content, flags) { return unquote(content) } |
21 | extractor.strong = function(text) { return unquote(text) } |
22 | extractor.em = function(text) { return unquote(text) } |
23 | extractor.codespan = function(text) { return unquote(text) } |
24 | extractor.del = function(text) { return unquote(text) } |
25 | |
26 | function unquote (text) { |
27 | return text.replace(/&/g, '&').replace(/"/g, '"').replace(/'/g, '\'') |
28 | } |
29 | |
30 | extractor.mention = function (_, id) { |
31 | onLink({target: id}) |
32 | } |
33 | |
34 | extractor.hashtag = function (_, hashtag) { |
35 | onLink({target: hashtag}) |
36 | } |
37 | |
38 | extractor.link = function (href, _, text) { |
39 | onLink({label: text, target: href, embed: false}) |
40 | } |
41 | |
42 | extractor.image = function (href, _, text) { |
43 | onLink({label: text, target: href, embed: true}) |
44 | } |
45 | |
46 | function links (s, _onLink) { |
47 | if('string' !== typeof s) return |
48 | onLink = _onLink |
49 | try { |
50 | marked(s, {renderer: extractor}) |
51 | } catch(err) { |
52 | console.log(JSON.stringify(s)) |
53 | throw err |
54 | } |
55 | onLink = noop |
56 | } |
57 | |
58 | module.exports = function (text, opts) { |
59 | var bareFeedNames = opts && opts.bareFeedNames |
60 | var a = [] |
61 | links(text, function (link) { |
62 | if(ref.isFeed(link.target)) |
63 | a.push({link: link.target, name: link.label && link.label.replace(/^@/, '')}) |
64 | else if(ref.isBlob(link.target)) |
65 | a.push({link: link.target, name: link.label}) |
66 | else if(ref.isMsg(link.target)) |
67 | a.push({link: link.target, name: link.label}) |
68 | else if(bareFeedNames && link.target && link.target[0] === '@') |
69 | a.push({link: link.target[0], name: link.target.substr(1)}) |
70 | else if(link.target && link.target[0] === '#') |
71 | a.push({link: link.target}) |
72 | }) |
73 | return a |
74 | } |
75 | |
76 |
Built with git-ssb-web