diff options
| author | ha-dai <contact@haradai.net> | 2017-11-27 03:41:47 +0900 |
|---|---|---|
| committer | ha-dai <contact@haradai.net> | 2017-11-27 03:41:47 +0900 |
| commit | 6c75bc6d5188cbbf80fe1086fa0e8828f4edb873 (patch) | |
| tree | 3ffedcc3a06e53269e92d2990cf0b3bb247ac04a /src/web/app/common/scripts/text-compiler.ts | |
| parent | Merge branch 'master' of https://github.com/syuilo/misskey (diff) | |
| parent | Update dependencies :rocket: (diff) | |
| download | misskey-6c75bc6d5188cbbf80fe1086fa0e8828f4edb873.tar.gz misskey-6c75bc6d5188cbbf80fe1086fa0e8828f4edb873.tar.bz2 misskey-6c75bc6d5188cbbf80fe1086fa0e8828f4edb873.zip | |
Merge branch 'master' of github.com:syuilo/misskey
Diffstat (limited to 'src/web/app/common/scripts/text-compiler.ts')
| -rw-r--r-- | src/web/app/common/scripts/text-compiler.ts | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/web/app/common/scripts/text-compiler.ts b/src/web/app/common/scripts/text-compiler.ts new file mode 100644 index 0000000000..e0ea47df26 --- /dev/null +++ b/src/web/app/common/scripts/text-compiler.ts @@ -0,0 +1,48 @@ +declare const _URL_: string; + +import * as riot from 'riot'; +import * as pictograph from 'pictograph'; + +const escape = text => + text + .replace(/>/g, '>') + .replace(/</g, '<'); + +export default (tokens, shouldBreak) => { + if (shouldBreak == null) { + shouldBreak = true; + } + + const me = (riot as any).mixin('i').me; + + let text = tokens.map(token => { + switch (token.type) { + case 'text': + return escape(token.content) + .replace(/(\r\n|\n|\r)/g, shouldBreak ? '<br>' : ' '); + case 'bold': + return `<strong>${escape(token.bold)}</strong>`; + case 'url': + return `<mk-url href="${escape(token.content)}" target="_blank"></mk-url>`; + case 'link': + return `<a class="link" href="${escape(token.url)}" target="_blank" title="${escape(token.url)}">${escape(token.title)}</a>`; + case 'mention': + return `<a href="${_URL_ + '/' + escape(token.username)}" target="_blank" data-user-preview="${token.content}" ${me && me.username == token.username ? 'data-is-me' : ''}>${token.content}</a>`; + case 'hashtag': // TODO + return `<a>${escape(token.content)}</a>`; + case 'code': + return `<pre><code>${token.html}</code></pre>`; + case 'inline-code': + return `<code>${token.html}</code>`; + case 'emoji': + return pictograph.dic[token.emoji] || token.content; + } + }).join(''); + + // Remove needless whitespaces + text = text + .replace(/ <code>/g, '<code>').replace(/<\/code> /g, '</code>') + .replace(/<br><code><pre>/g, '<code><pre>').replace(/<\/code><\/pre><br>/g, '</code></pre>'); + + return text; +}; |