}
textMarkdownToHTML (markdown: string) {
- const html = this.textMarkdownIt.render(markdown)
+ if (!markdown) return ''
+ const html = this.textMarkdownIt.render(markdown)
return this.avoidTruncatedLinks(html)
}
enhancedMarkdownToHTML (markdown: string) {
- const html = this.enhancedMarkdownIt.render(markdown)
+ if (!markdown) return ''
+ const html = this.enhancedMarkdownIt.render(markdown)
return this.avoidTruncatedLinks(html)
}
return self.renderToken(tokens, idx, options)
}
- markdownIt.renderer.rules.link_open = function (tokens, idx, options, env, self) {
- // If you are sure other plugins can't add `target` - drop check below
- const aIndex = tokens[idx].attrIndex('target')
+ markdownIt.renderer.rules.link_open = function (tokens, index, options, env, self) {
+ const token = tokens[index]
+
+ const targetIndex = token.attrIndex('target')
+ if (targetIndex < 0) token.attrPush([ 'target', '_blank' ])
+ else token.attrs[targetIndex][1] = '_blank'
- if (aIndex < 0) {
- tokens[idx].attrPush(['target', '_blank']) // add new attribute
- } else {
- tokens[idx].attrs[aIndex][1] = '_blank' // replace value of existing attr
- }
+ const relIndex = token.attrIndex('rel')
+ if (relIndex < 0) token.attrPush([ 'rel', 'noopener noreferrer' ])
+ else token.attrs[relIndex][1] = 'noopener noreferrer'
// pass token to default renderer.
- return defaultRender(tokens, idx, options, env, self)
+ return defaultRender(tokens, index, options, env, self)
}
}
- private avoidTruncatedLinks (html) {
- return html.replace(/<a[^>]+>([^<]+)<\/a>\s*...(<\/p>)?$/mi, '$1...')
+ private avoidTruncatedLinks (html: string) {
+ return html.replace(/<a[^>]+>([^<]+)<\/a>\s*...((<\/p>)|(<\/li>)|(<\/strong>))?$/mi, '$1...')
}
}