aboutsummaryrefslogtreecommitdiffhomepage
path: root/client/src/app/videos/shared/markdown.service.ts
diff options
context:
space:
mode:
authorChocobozzz <florian.bigard@gmail.com>2017-10-26 15:01:47 +0200
committerChocobozzz <florian.bigard@gmail.com>2017-10-26 15:01:47 +0200
commit9d9597df427542eb5c7d3ba8ff5aeb146fab40e2 (patch)
tree5098facc5f2d70d4ad7871e6736e6f9d9d9a797a /client/src/app/videos/shared/markdown.service.ts
parent4077df72c634ff17aaf69cc612fc6bb8d68b1ed8 (diff)
downloadPeerTube-9d9597df427542eb5c7d3ba8ff5aeb146fab40e2.tar.gz
PeerTube-9d9597df427542eb5c7d3ba8ff5aeb146fab40e2.tar.zst
PeerTube-9d9597df427542eb5c7d3ba8ff5aeb146fab40e2.zip
Add markdown support to video description
Diffstat (limited to 'client/src/app/videos/shared/markdown.service.ts')
-rw-r--r--client/src/app/videos/shared/markdown.service.ts40
1 files changed, 40 insertions, 0 deletions
diff --git a/client/src/app/videos/shared/markdown.service.ts b/client/src/app/videos/shared/markdown.service.ts
new file mode 100644
index 000000000..d8b5b76b6
--- /dev/null
+++ b/client/src/app/videos/shared/markdown.service.ts
@@ -0,0 +1,40 @@
1import { Injectable } from '@angular/core'
2
3import * as MarkdownIt from 'markdown-it'
4
5@Injectable()
6export class MarkdownService {
7 private markdownIt: MarkdownIt.MarkdownIt
8
9 constructor () {
10 this.markdownIt = new MarkdownIt('zero', { linkify: true })
11 .enable('linkify')
12 .enable('autolink')
13 .enable('emphasis')
14 .enable('link')
15 .enable('newline')
16
17 // Snippet from markdown-it documentation: https://github.com/markdown-it/markdown-it/blob/master/docs/architecture.md#renderer
18 const defaultRender = this.markdownIt.renderer.rules.link_open || function (tokens, idx, options, env, self) {
19 return self.renderToken(tokens, idx, options)
20 }
21
22 this.markdownIt.renderer.rules.link_open = function (tokens, idx, options, env, self) {
23 // If you are sure other plugins can't add `target` - drop check below
24 const aIndex = tokens[idx].attrIndex('target')
25
26 if (aIndex < 0) {
27 tokens[idx].attrPush(['target', '_blank']) // add new attribute
28 } else {
29 tokens[idx].attrs[aIndex][1] = '_blank' // replace value of existing attr
30 }
31
32 // pass token to default renderer.
33 return defaultRender(tokens, idx, options, env, self)
34 }
35 }
36
37 markdownToHTML (markdown: string) {
38 return this.markdownIt.render(markdown)
39 }
40}