UNPKG

3.46 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', {
4 value: true
5});
6
7var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();
8
9exports['default'] = render;
10
11function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }
12
13function escapeMarkdownPart(input) {
14 return [
15
16 // escaping symbols: # * ( ) [ ] _ `
17 [/([\#\*\(\)\[\]\_\`\\])/g, '\\$1'],
18
19 // escaping less and more signs
20 [/\</g, '&lt;'], [/\>/g, '&gt;'],
21
22 // convert line break into html line break
23 [/\n/g, '<br />']].reduce(function (input, _ref) {
24 var _ref2 = _slicedToArray(_ref, 2);
25
26 var replaceFrom = _ref2[0];
27 var replaceTo = _ref2[1];
28 return input.replace(replaceFrom, replaceTo);
29 }, input);
30}
31
32function escapeMarkdown(input) {
33 return escapeMarkdownPart(input)
34 // escaping period after number at the string start
35 .replace(/^(\d+)\./, '$1\\.');
36}
37
38function renderEntityMention(data) {
39 return '[@' + escapeMarkdownPart(data.screen_name) + '](https://twitter.com/' + data.screen_name + ' "' + data.name + '")';
40}
41
42function renderEntityMedia(data) {
43 return '[' + escapeMarkdownPart(data.display_url) + '](' + data.url + ')';
44}
45
46function renderEntityHashtag(data) {
47 return '[#' + escapeMarkdownPart(data.text) + '](https://twitter.com/search?q=%23' + data.text + ')';
48}
49
50function renderEntityUrl(data) {
51 return '[' + escapeMarkdownPart(data.display_url) + '](' + data.url + ' "' + data.expanded_url + '")';
52}
53
54function renderEntity(type, data) {
55 switch (type) {
56 case 'user_mentions':
57 return renderEntityMention(data);
58 case 'media':
59 return renderEntityMedia(data);
60 case 'hashtags':
61 return renderEntityHashtag(data);
62 case 'urls':
63 return renderEntityUrl(data);
64 default:
65 return null;
66 }
67}
68
69function render(tweet) {
70 var text = tweet.text;
71 var _tweet$entities = tweet.entities;
72 var entities = _tweet$entities === undefined ? {} : _tweet$entities;
73
74 var replacements = [];
75
76 Object.keys(entities).forEach(function (entityKey) {
77 replacements.push.apply(replacements, _toConsumableArray(entities[entityKey].map(function (entity) {
78 return [renderEntity(entityKey, entity), entity.indices[0], entity.indices[1]];
79 })));
80 });
81
82 if (0 === replacements.length) {
83 return escapeMarkdown(tweet.text);
84 }
85
86 var lastPos = text.length;
87 var parts = replacements.sort(function (a, b) {
88 return b[1] - a[1];
89 }).map(function (replacement) {
90 var output = [replacement[0]];
91
92 if (replacement[2] < lastPos) {
93 output.push(escapeMarkdownPart(text.substr(replacement[2], lastPos - replacement[2])));
94 }
95
96 lastPos = replacement[1];
97
98 return output.join('');
99 });
100
101 if (lastPos > 0) {
102 parts.push(escapeMarkdown(text.substr(0, lastPos)));
103 }
104
105 return parts.reverse().join('');
106}
107
108module.exports = exports['default'];