aboutsummaryrefslogtreecommitdiffhomepage
path: root/client/src/app/shared/renderer/markdown.service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'client/src/app/shared/renderer/markdown.service.ts')
-rw-r--r--client/src/app/shared/renderer/markdown.service.ts32
1 files changed, 19 insertions, 13 deletions
diff --git a/client/src/app/shared/renderer/markdown.service.ts b/client/src/app/shared/renderer/markdown.service.ts
index 07017eca5..69dc60aaf 100644
--- a/client/src/app/shared/renderer/markdown.service.ts
+++ b/client/src/app/shared/renderer/markdown.service.ts
@@ -1,6 +1,6 @@
1import { Injectable } from '@angular/core' 1import { Injectable } from '@angular/core'
2 2
3import * as MarkdownIt from 'markdown-it' 3import { MarkdownIt } from 'markdown-it'
4 4
5@Injectable() 5@Injectable()
6export class MarkdownService { 6export class MarkdownService {
@@ -14,30 +14,36 @@ export class MarkdownService {
14 ] 14 ]
15 static ENHANCED_RULES = MarkdownService.TEXT_RULES.concat([ 'image' ]) 15 static ENHANCED_RULES = MarkdownService.TEXT_RULES.concat([ 'image' ])
16 16
17 private textMarkdownIt: MarkdownIt.MarkdownIt 17 private textMarkdownIt: MarkdownIt
18 private enhancedMarkdownIt: MarkdownIt.MarkdownIt 18 private enhancedMarkdownIt: MarkdownIt
19 19
20 constructor () { 20 async textMarkdownToHTML (markdown: string) {
21 this.textMarkdownIt = this.createMarkdownIt(MarkdownService.TEXT_RULES)
22 this.enhancedMarkdownIt = this.createMarkdownIt(MarkdownService.ENHANCED_RULES)
23 }
24
25 textMarkdownToHTML (markdown: string) {
26 if (!markdown) return '' 21 if (!markdown) return ''
27 22
23 if (!this.textMarkdownIt) {
24 this.textMarkdownIt = await this.createMarkdownIt(MarkdownService.TEXT_RULES)
25 }
26
28 const html = this.textMarkdownIt.render(markdown) 27 const html = this.textMarkdownIt.render(markdown)
29 return this.avoidTruncatedTags(html) 28 return this.avoidTruncatedTags(html)
30 } 29 }
31 30
32 enhancedMarkdownToHTML (markdown: string) { 31 async enhancedMarkdownToHTML (markdown: string) {
33 if (!markdown) return '' 32 if (!markdown) return ''
34 33
34 if (!this.enhancedMarkdownIt) {
35 this.enhancedMarkdownIt = await this.createMarkdownIt(MarkdownService.ENHANCED_RULES)
36 }
37
35 const html = this.enhancedMarkdownIt.render(markdown) 38 const html = this.enhancedMarkdownIt.render(markdown)
36 return this.avoidTruncatedTags(html) 39 return this.avoidTruncatedTags(html)
37 } 40 }
38 41
39 private createMarkdownIt (rules: string[]) { 42 private async createMarkdownIt (rules: string[]) {
40 const markdownIt = new MarkdownIt('zero', { linkify: true, breaks: true }) 43 // FIXME: import('..') returns a struct module, containing a "default" field corresponding to our sanitizeHtml function
44 const MarkdownItClass: typeof import ('markdown-it') = (await import('markdown-it') as any).default
45
46 const markdownIt = new MarkdownItClass('zero', { linkify: true, breaks: true })
41 47
42 for (let rule of rules) { 48 for (let rule of rules) {
43 markdownIt.enable(rule) 49 markdownIt.enable(rule)
@@ -48,7 +54,7 @@ export class MarkdownService {
48 return markdownIt 54 return markdownIt
49 } 55 }
50 56
51 private setTargetToLinks (markdownIt: MarkdownIt.MarkdownIt) { 57 private setTargetToLinks (markdownIt: MarkdownIt) {
52 // Snippet from markdown-it documentation: https://github.com/markdown-it/markdown-it/blob/master/docs/architecture.md#renderer 58 // Snippet from markdown-it documentation: https://github.com/markdown-it/markdown-it/blob/master/docs/architecture.md#renderer
53 const defaultRender = markdownIt.renderer.rules.link_open || function (tokens, idx, options, env, self) { 59 const defaultRender = markdownIt.renderer.rules.link_open || function (tokens, idx, options, env, self) {
54 return self.renderToken(tokens, idx, options) 60 return self.renderToken(tokens, idx, options)