|
@@ -1,4 +1,4 @@
|
|
|
-;/*! showdown 21-02-2017 */
|
|
|
+;/*! showdown 26-02-2017 */
|
|
|
(function(){
|
|
|
/**
|
|
|
* Created by Tivie on 13-07-2015.
|
|
@@ -1383,57 +1383,77 @@ showdown.subParser('anchors', function (text, options, globals) {
|
|
|
return text;
|
|
|
});
|
|
|
|
|
|
+// url allowed chars [a-z\d_.~:/?#[]@!$&'()*+,;=-]
|
|
|
+
|
|
|
+var simpleURLRegex = /\b(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+)()(?=\s|$)(?!["<>])/gi,
|
|
|
+ simpleURLRegex2 = /\b(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+?)([.!?()]?)(?=\s|$)(?!["<>])/gi,
|
|
|
+ //simpleURLRegex3 = /\b(((https?|ftp):\/\/|www\.)[a-z\d.-]+\.[a-z\d_.~:/?#\[\]@!$&'()*+,;=-]+?)([.!?()]?)(?=\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, link, m2, m3, trailingPunctuation) {
|
|
|
+ var lnkTxt = link,
|
|
|
+ append = '';
|
|
|
+ if (/^www\./i.test(link)) {
|
|
|
+ link = link.replace(/^www\./i, 'http://www.');
|
|
|
+ }
|
|
|
+ if (options.excludeTrailingPunctuationFromURLs && trailingPunctuation) {
|
|
|
+ append = trailingPunctuation;
|
|
|
+ }
|
|
|
+ return '<a href="' + link + '">' + lnkTxt + '</a>' + append;
|
|
|
+ };
|
|
|
+ },
|
|
|
+
|
|
|
+ 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 + '<a href="' + href + '">' + mail + '</a>';
|
|
|
+ };
|
|
|
+ };
|
|
|
+
|
|
|
showdown.subParser('autoLinks', function (text, options, globals) {
|
|
|
'use strict';
|
|
|
|
|
|
text = globals.converter._dispatch('autoLinks.before', text, options, globals);
|
|
|
|
|
|
- var simpleURLRegex = /\b(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+)()(?=\s|$)(?!["<>])/gi,
|
|
|
- simpleURLRegex2 = /\b(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+?)([.!?()]?)(?=\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;
|
|
|
+ text = text.replace(delimUrlRegex, replaceLink(options));
|
|
|
+ text = text.replace(delimMailRegex, replaceMail(options, globals));
|
|
|
|
|
|
- text = text.replace(delimUrlRegex, replaceLink);
|
|
|
- text = text.replace(delimMailRegex, replaceMail);
|
|
|
- // simpleURLRegex = /\b(((https?|ftp|dict):\/\/|www\.)[-.+~:?#@!$&'()*,;=[\]\w]+)\b/gi,
|
|
|
- // Email addresses: <address@domain.foo>
|
|
|
+ text = globals.converter._dispatch('autoLinks.after', text, options, globals);
|
|
|
|
|
|
- if (options.simplifiedAutoLink) {
|
|
|
- if (options.excludeTrailingPunctuationFromURLs) {
|
|
|
- text = text.replace(simpleURLRegex2, replaceLink);
|
|
|
- } else {
|
|
|
- text = text.replace(simpleURLRegex, replaceLink);
|
|
|
- }
|
|
|
- text = text.replace(simpleMailRegex, replaceMail);
|
|
|
- }
|
|
|
+ return text;
|
|
|
+});
|
|
|
|
|
|
- function replaceLink (wm, link, m2, m3, trailingPunctuation) {
|
|
|
- var lnkTxt = link,
|
|
|
- append = '';
|
|
|
- if (/^www\./i.test(link)) {
|
|
|
- link = link.replace(/^www\./i, 'http://www.');
|
|
|
- }
|
|
|
- if (options.excludeTrailingPunctuationFromURLs && trailingPunctuation) {
|
|
|
- append = trailingPunctuation;
|
|
|
- }
|
|
|
- return '<a href="' + link + '">' + lnkTxt + '</a>' + append;
|
|
|
+showdown.subParser('simplifiedAutoLinks', function (text, options, globals) {
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ if (!options.simplifiedAutoLink) {
|
|
|
+ return text;
|
|
|
}
|
|
|
|
|
|
- function replaceMail (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 + '<a href="' + href + '">' + mail + '</a>';
|
|
|
+ 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('autoLinks.after', text, options, globals);
|
|
|
+ text = globals.converter._dispatch('simplifiedAutoLinks.after', text, options, globals);
|
|
|
|
|
|
return text;
|
|
|
});
|
|
@@ -2170,34 +2190,47 @@ showdown.subParser('italicsAndBold', function (text, options, globals) {
|
|
|
// because of backtracing, in some cases, it could lead to an exponential effect
|
|
|
// called "catastrophic backtrace". Ominous!
|
|
|
|
|
|
+ function parseInside (txt, left, right) {
|
|
|
+ if (options.simplifiedAutoLink) {
|
|
|
+ txt = showdown.subParser('simplifiedAutoLinks')(txt, options, globals);
|
|
|
+ }
|
|
|
+ return left + txt + right;
|
|
|
+ }
|
|
|
+
|
|
|
// Parse underscores
|
|
|
if (options.literalMidWordUnderscores) {
|
|
|
- text = text.replace(/\b___(\S[\s\S]*)___\b/g, '<strong><em>$1</em></strong>');
|
|
|
- text = text.replace(/\b__(\S[\s\S]*)__\b/g, '<strong>$1</strong>');
|
|
|
- text = text.replace(/\b_(\S[\s\S]*?)_\b/g, '<em>$1</em>');
|
|
|
+ text = text.replace(/\b___(\S[\s\S]*)___\b/g, function (wm, txt) {
|
|
|
+ return parseInside (txt, '<strong><em>', '</em></strong>');
|
|
|
+ });
|
|
|
+ text = text.replace(/\b__(\S[\s\S]*)__\b/g, function (wm, txt) {
|
|
|
+ return parseInside (txt, '<strong>', '</strong>');
|
|
|
+ });
|
|
|
+ text = text.replace(/\b_(\S[\s\S]*?)_\b/g, function (wm, txt) {
|
|
|
+ return parseInside (txt, '<em>', '</em>');
|
|
|
+ });
|
|
|
} else {
|
|
|
text = text.replace(/___(\S[\s\S]*?)___/g, function (wm, m) {
|
|
|
- return (/\S$/.test(m)) ? '<strong><em>' + m + '</em></strong>' : wm;
|
|
|
+ return (/\S$/.test(m)) ? parseInside (m, '<strong><em>', '</em></strong>') : wm;
|
|
|
});
|
|
|
text = text.replace(/__(\S[\s\S]*?)__/g, function (wm, m) {
|
|
|
- return (/\S$/.test(m)) ? '<strong>' + m + '</strong>' : wm;
|
|
|
+ return (/\S$/.test(m)) ? parseInside (m, '<strong>', '</strong>') : wm;
|
|
|
});
|
|
|
text = text.replace(/_([^\s_][\s\S]*?)_/g, function (wm, m) {
|
|
|
// !/^_[^_]/.test(m) - test if it doesn't start with __ (since it seems redundant, we removed it)
|
|
|
- return (/\S$/.test(m)) ? '<em>' + m + '</em>' : wm;
|
|
|
+ return (/\S$/.test(m)) ? parseInside (m, '<em>', '</em>') : wm;
|
|
|
});
|
|
|
}
|
|
|
|
|
|
// Now parse asterisks
|
|
|
text = text.replace(/\*\*\*(\S[\s\S]*?)\*\*\*/g, function (wm, m) {
|
|
|
- return (/\S$/.test(m)) ? '<strong><em>' + m + '</em></strong>' : wm;
|
|
|
+ return (/\S$/.test(m)) ? parseInside (m, '<strong><em>', '</em></strong>') : wm;
|
|
|
});
|
|
|
text = text.replace(/\*\*(\S[\s\S]*?)\*\*/g, function (wm, m) {
|
|
|
- return (/\S$/.test(m)) ? '<strong>' + m + '</strong>' : wm;
|
|
|
+ return (/\S$/.test(m)) ? parseInside (m, '<strong>', '</strong>') : wm;
|
|
|
});
|
|
|
text = text.replace(/\*([^\s*][\s\S]*?)\*/g, function (wm, m) {
|
|
|
// !/^\*[^*]/.test(m) - test if it doesn't start with ** (since it seems redundant, we removed it)
|
|
|
- return (/\S$/.test(m)) ? '<em>' + m + '</em>' : wm;
|
|
|
+ return (/\S$/.test(m)) ? parseInside (m, '<em>', '</em>') : wm;
|
|
|
});
|
|
|
|
|
|
text = globals.converter._dispatch('italicsAndBold.after', text, options, globals);
|
|
@@ -2524,11 +2557,12 @@ showdown.subParser('spanGamut', function (text, options, globals) {
|
|
|
text = showdown.subParser('anchors')(text, options, globals);
|
|
|
|
|
|
// Make links out of things like `<http://example.com/>`
|
|
|
- // Must come after _DoAnchors(), because you can use < and >
|
|
|
+ // Must come after anchors, because you can use < and >
|
|
|
// delimiters in inline links like [this](<url>).
|
|
|
text = showdown.subParser('autoLinks')(text, options, globals);
|
|
|
text = showdown.subParser('italicsAndBold')(text, options, globals);
|
|
|
text = showdown.subParser('strikethrough')(text, options, globals);
|
|
|
+ text = showdown.subParser('simplifiedAutoLinks')(text, options, globals);
|
|
|
|
|
|
// we need to hash HTML tags inside spans
|
|
|
text = showdown.subParser('hashHTMLSpans')(text, options, globals);
|
|
@@ -2552,9 +2586,16 @@ showdown.subParser('spanGamut', function (text, options, globals) {
|
|
|
showdown.subParser('strikethrough', function (text, options, globals) {
|
|
|
'use strict';
|
|
|
|
|
|
+ function parseInside (txt) {
|
|
|
+ if (options.simplifiedAutoLink) {
|
|
|
+ txt = showdown.subParser('simplifiedAutoLinks')(txt, options, globals);
|
|
|
+ }
|
|
|
+ return '<del>' + txt + '</del>';
|
|
|
+ }
|
|
|
+
|
|
|
if (options.strikethrough) {
|
|
|
text = globals.converter._dispatch('strikethrough.before', text, options, globals);
|
|
|
- text = text.replace(/(?:~){2}([\s\S]+?)(?:~){2}/g, '<del>$1</del>');
|
|
|
+ text = text.replace(/(?:~){2}([\s\S]+?)(?:~){2}/g, function (wm, txt) { return parseInside(txt); });
|
|
|
text = globals.converter._dispatch('strikethrough.after', text, options, globals);
|
|
|
}
|
|
|
|