diff options
author | Harrison Healey <harrisonmhealey@gmail.com> | 2016-05-24 10:12:02 -0400 |
---|---|---|
committer | Corey Hulen <corey@hulen.com> | 2016-05-24 07:12:02 -0700 |
commit | 3b5a5110c72d7eb2c94d9f428145383b15bd0e4e (patch) | |
tree | 68fc1cae0a937b1a0cb0217500af19c7ddb10026 /webapp/utils | |
parent | 7e2b539de484ac4f2e97eafce6b8d63ffa2caf13 (diff) | |
download | chat-3b5a5110c72d7eb2c94d9f428145383b15bd0e4e.tar.gz chat-3b5a5110c72d7eb2c94d9f428145383b15bd0e4e.tar.bz2 chat-3b5a5110c72d7eb2c94d9f428145383b15bd0e4e.zip |
Revert "Updated our fork of marked and added more links to test-links.md (#3047)" (#3090)
This reverts commit c868620693c69e2931c3023460eaafd9f6d330b6.
Diffstat (limited to 'webapp/utils')
-rw-r--r-- | webapp/utils/markdown.jsx | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/webapp/utils/markdown.jsx b/webapp/utils/markdown.jsx index 69b18faee..2ddd3fe11 100644 --- a/webapp/utils/markdown.jsx +++ b/webapp/utils/markdown.jsx @@ -13,6 +13,40 @@ function markdownImageLoaded(image) { } window.markdownImageLoaded = markdownImageLoaded; +class MattermostInlineLexer extends marked.InlineLexer { + constructor(links, options) { + super(links, options); + + this.rules = Object.assign({}, this.rules); + + // modified version of the regex that allows for links starting with www and those surrounded by parentheses + // the original is /^[\s\S]+?(?=[\\<!\[_*`~]|https?:\/\/| {2,}\n|$)/ + this.rules.text = /^[\s\S]+?(?=[\\<!\[_*`~]|https?:\/\/|www\.|\(| {2,}\n|$)/; + + // modified version of the regex that allows links starting with www and those surrounded by parentheses + // the original is /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/ + this.rules.url = /^(\(?(?:https?:\/\/|www\.)[^\s<.][^\s<]*[^<.,:;"'\]\s])/; + + // modified version of the regex that allows <links> starting with www. + // the original is /^<([^ >]+(@|:\/)[^ >]+)>/ + this.rules.autolink = /^<((?:[^ >]+(@|:\/)|www\.)[^ >]+)>/; + } +} + +class MattermostParser extends marked.Parser { + parse(src) { + this.inline = new MattermostInlineLexer(src.links, this.options, this.renderer); + this.tokens = src.reverse(); + + var out = ''; + while (this.next()) { + out += this.tok(); + } + + return out; + } +} + class MattermostMarkdownRenderer extends marked.Renderer { constructor(options, formattingOptions = {}) { super(options); @@ -75,6 +109,18 @@ class MattermostMarkdownRenderer extends marked.Renderer { link(href, title, text) { let outHref = href; + let outText = text; + let prefix = ''; + let suffix = ''; + + // some links like https://en.wikipedia.org/wiki/Rendering_(computer_graphics) contain brackets + // and we try our best to differentiate those from ones just wrapped in brackets when autolinking + if (outHref.startsWith('(') && outHref.endsWith(')') && text === outHref) { + prefix = '('; + suffix = ')'; + outText = text.substring(1, text.length - 1); + outHref = outHref.substring(1, outHref.length - 1); + } try { const unescaped = decodeURIComponent(unescape(href)).replace(/[^\w:]/g, '').toLowerCase(); @@ -103,9 +149,9 @@ class MattermostMarkdownRenderer extends marked.Renderer { output += ' title="' + title + '"'; } - output += '>' + text + '</a>'; + output += '>' + outText + '</a>'; - return output; + return prefix + output + suffix; } paragraph(text) { @@ -440,7 +486,7 @@ export function format(text, options) { const tokens = new MattermostLexer(markdownOptions).lex(text); - return new marked.Parser(markdownOptions).parse(tokens); + return new MattermostParser(markdownOptions).parse(tokens); } // Marked helper functions that should probably just be exported |