// url allowed chars [a-z\d_.~:/?#[]@!$&'()*+,;=-] var simpleURLRegex = /([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+?\.[^'">\s]+?)()(\1)?(?=\s|$)(?!["<>])/gi, simpleURLRegex2 = /([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+?)([.!?,()\[\]])?(\1)?(?=\s|$)(?!["<>])/gi, delimUrlRegex = /()<(((https?|ftp|dict):\/\/|www\.)[^'">\s]+)()>()/gi, simpleMailRegex = /(^|\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)(?=$|\s)/gmi, delimMailRegex = /<()(?:mailto:)?([-.\w]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi, replaceLink = function (options) { 'use strict'; return function (wm, leadingMagicChars, link, m2, m3, trailingPunctuation, trailingMagicChars) { link = link.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback); var lnkTxt = link, append = '', target = '', lmc = leadingMagicChars || '', tmc = trailingMagicChars || ''; if (/^www\./i.test(link)) { link = link.replace(/^www\./i, 'http://www.'); } if (options.excludeTrailingPunctuationFromURLs && trailingPunctuation) { append = trailingPunctuation; } if (options.openLinksInNewWindow) { target = ' rel="noopener noreferrer" target="¨E95Eblank"'; } return lmc + '' + lnkTxt + '' + append + tmc; }; }, replaceMail = function (options, globals) { 'use strict'; return function (wholeMatch, b, mail) { var href = 'mailto:'; b = b || ''; mail = showdown.subParser('unescapeSpecialChars')(mail, options, globals); if (options.encodeEmails) { href = showdown.helper.encodeEmailAddress(href + mail); mail = showdown.helper.encodeEmailAddress(mail); } else { href = href + mail; } return b + '' + mail + ''; }; }; showdown.subParser('autoLinks', function (text, options, globals) { 'use strict'; text = globals.converter._dispatch('autoLinks.before', text, options, globals); text = text.replace(delimUrlRegex, replaceLink(options)); text = text.replace(delimMailRegex, replaceMail(options, globals)); text = globals.converter._dispatch('autoLinks.after', text, options, globals); return text; }); showdown.subParser('simplifiedAutoLinks', function (text, options, globals) { 'use strict'; if (!options.simplifiedAutoLink) { return text; } text = globals.converter._dispatch('simplifiedAutoLinks.before', text, options, globals); if (options.excludeTrailingPunctuationFromURLs) { text = text.replace(simpleURLRegex2, replaceLink(options)); } else { text = text.replace(simpleURLRegex, replaceLink(options)); } text = text.replace(simpleMailRegex, replaceMail(options, globals)); text = globals.converter._dispatch('simplifiedAutoLinks.after', text, options, globals); return text; });