diff --git a/lib/marked.cjs b/lib/marked.cjs index be8b852f7f..d8b76f54e9 100644 --- a/lib/marked.cjs +++ b/lib/marked.cjs @@ -92,9 +92,9 @@ function changeDefaults(newDefaults) { * Helpers */ var escapeTest = /[&<>"']/; -var escapeReplace = /[&<>"']/g; -var escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/; -var escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g; +var escapeReplace = new RegExp(escapeTest.source, 'g'); +var escapeTestNoEncode = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/; +var escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g'); var escapeReplacements = { '&': '&', '<': '<', @@ -678,14 +678,15 @@ var Tokenizer = /*#__PURE__*/function () { _proto.def = function def(src) { var cap = this.rules.block.def.exec(src); if (cap) { - if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1); var tag = cap[1].toLowerCase().replace(/\s+/g, ' '); + var href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline._escapes, '$1') : ''; + var title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline._escapes, '$1') : cap[3]; return { type: 'def', tag: tag, raw: cap[0], - href: cap[2] ? cap[2].replace(this.rules.inline._escapes, '$1') : cap[2], - title: cap[3] ? cap[3].replace(this.rules.inline._escapes, '$1') : cap[3] + href: href, + title: title }; } }; @@ -871,7 +872,7 @@ var Tokenizer = /*#__PURE__*/function () { if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) { var link = (cap[2] || cap[1]).replace(/\s+/g, ' '); link = links[link.toLowerCase()]; - if (!link || !link.href) { + if (!link) { var text = cap[0].charAt(0); return { type: 'text', @@ -1084,9 +1085,9 @@ var block = { + '|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) open tag + '|(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) closing tag + ')', - def: /^ {0,3}\[(label)\]: *(?:\n *)?([^\s>]+)>?(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/, + def: /^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/, table: noopTest, - lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/, + lheading: /^((?:.|\n(?!\n))+?)\n {0,3}(=+|-+) *(?:\n+|$)/, // regex template, placeholders will be replaced according to different paragraph // interruption rules of commonmark and the original markdown spec: _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, @@ -1142,6 +1143,7 @@ block.pedantic = merge({}, block.normal, { heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: noopTest, // fences not supported + lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, paragraph: edit(block.normal._paragraph).replace('hr', block.hr).replace('heading', ' *#{1,6} *[^\n]').replace('lheading', block.lheading).replace('blockquote', ' {0,3}>').replace('|fences', '').replace('|list', '').replace('|html', '').getRegex() }); @@ -1789,7 +1791,7 @@ var Renderer = /*#__PURE__*/function () { if (!lang) { return '
' + (escaped ? _code : escape(_code, true)) + '
\n';
}
- return '' + (escaped ? _code : escape(_code, true)) + '
\n';
+ return '' + (escaped ? _code : escape(_code, true)) + '
\n';
}
/**
@@ -1906,7 +1908,7 @@ var Renderer = /*#__PURE__*/function () {
if (href === null) {
return text;
}
- var out = '"']/;
-const escapeReplace = /[&<>"']/g;
-const escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
-const escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
+const escapeReplace = new RegExp(escapeTest.source, 'g');
+const escapeTestNoEncode = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/;
+const escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g');
const escapeReplacements = {
'&': '&',
'<': '<',
@@ -675,14 +675,15 @@ class Tokenizer {
def(src) {
const cap = this.rules.block.def.exec(src);
if (cap) {
- if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
const tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
+ const href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline._escapes, '$1') : '';
+ const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline._escapes, '$1') : cap[3];
return {
type: 'def',
tag,
raw: cap[0],
- href: cap[2] ? cap[2].replace(this.rules.inline._escapes, '$1') : cap[2],
- title: cap[3] ? cap[3].replace(this.rules.inline._escapes, '$1') : cap[3]
+ href,
+ title
};
}
}
@@ -884,7 +885,7 @@ class Tokenizer {
|| (cap = this.rules.inline.nolink.exec(src))) {
let link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
link = links[link.toLowerCase()];
- if (!link || !link.href) {
+ if (!link) {
const text = cap[0].charAt(0);
return {
type: 'text',
@@ -1108,9 +1109,9 @@ const block = {
+ '|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) open tag
+ '|(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) closing tag
+ ')',
- def: /^ {0,3}\[(label)\]: *(?:\n *)?([^\s>]+)>?(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,
+ def: /^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,
table: noopTest,
- lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,
+ lheading: /^((?:.|\n(?!\n))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
// regex template, placeholders will be replaced according to different paragraph
// interruption rules of commonmark and the original markdown spec:
_paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,
@@ -1220,6 +1221,7 @@ block.pedantic = merge({}, block.normal, {
def: /^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
heading: /^(#{1,6})(.*)(?:\n+|$)/,
fences: noopTest, // fences not supported
+ lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
paragraph: edit(block.normal._paragraph)
.replace('hr', block.hr)
.replace('heading', ' *#{1,6} *[^\n]')
@@ -1913,7 +1915,7 @@ class Renderer {
return ''
+ (escaped ? code : escape(code, true))
+ '
\n';
@@ -2051,7 +2053,7 @@ class Renderer {
if (href === null) {
return text;
}
- let out = ' {
+ // copy options to new object
+ const opts = merge({}, pack);
+
+ // set async to true if it was set to true before
+ opts.async = marked.defaults.async || opts.async;
+
// ==-- Parse "addon" extensions --== //
if (pack.extensions) {
- hasExtensions = true;
pack.extensions.forEach((ext) => {
if (!ext.name) {
throw new Error('extension name required');
}
if (ext.renderer) { // Renderer extensions
- const prevRenderer = extensions.renderers ? extensions.renderers[ext.name] : null;
+ const prevRenderer = extensions.renderers[ext.name];
if (prevRenderer) {
// Replace extension with func to run new extension but fall back if false
extensions.renderers[ext.name] = function(...args) {
@@ -2655,6 +2660,7 @@ marked.use = function(...args) {
extensions.childTokens[ext.name] = ext.childTokens;
}
});
+ opts.extensions = extensions;
}
// ==-- Parse "overwrite" extensions --== //
@@ -2702,10 +2708,6 @@ marked.use = function(...args) {
};
}
- if (hasExtensions) {
- opts.extensions = extensions;
- }
-
marked.setOptions(opts);
});
};
diff --git a/lib/marked.umd.js b/lib/marked.umd.js
index 1eb1aa0700..f50f6a02a5 100644
--- a/lib/marked.umd.js
+++ b/lib/marked.umd.js
@@ -96,9 +96,9 @@
* Helpers
*/
var escapeTest = /[&<>"']/;
- var escapeReplace = /[&<>"']/g;
- var escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
- var escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
+ var escapeReplace = new RegExp(escapeTest.source, 'g');
+ var escapeTestNoEncode = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/;
+ var escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g');
var escapeReplacements = {
'&': '&',
'<': '<',
@@ -682,14 +682,15 @@
_proto.def = function def(src) {
var cap = this.rules.block.def.exec(src);
if (cap) {
- if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
var tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
+ var href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline._escapes, '$1') : '';
+ var title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline._escapes, '$1') : cap[3];
return {
type: 'def',
tag: tag,
raw: cap[0],
- href: cap[2] ? cap[2].replace(this.rules.inline._escapes, '$1') : cap[2],
- title: cap[3] ? cap[3].replace(this.rules.inline._escapes, '$1') : cap[3]
+ href: href,
+ title: title
};
}
};
@@ -875,7 +876,7 @@
if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) {
var link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
link = links[link.toLowerCase()];
- if (!link || !link.href) {
+ if (!link) {
var text = cap[0].charAt(0);
return {
type: 'text',
@@ -1088,9 +1089,9 @@
+ '|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) open tag
+ '|(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) closing tag
+ ')',
- def: /^ {0,3}\[(label)\]: *(?:\n *)?([^\s>]+)>?(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,
+ def: /^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,
table: noopTest,
- lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,
+ lheading: /^((?:.|\n(?!\n))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
// regex template, placeholders will be replaced according to different paragraph
// interruption rules of commonmark and the original markdown spec:
_paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,
@@ -1146,6 +1147,7 @@
heading: /^(#{1,6})(.*)(?:\n+|$)/,
fences: noopTest,
// fences not supported
+ lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
paragraph: edit(block.normal._paragraph).replace('hr', block.hr).replace('heading', ' *#{1,6} *[^\n]').replace('lheading', block.lheading).replace('blockquote', ' {0,3}>').replace('|fences', '').replace('|list', '').replace('|html', '').getRegex()
});
@@ -1793,7 +1795,7 @@
if (!lang) {
return '' + (escaped ? _code : escape(_code, true)) + '
\n';
}
- return '' + (escaped ? _code : escape(_code, true)) + '
\n';
+ return '' + (escaped ? _code : escape(_code, true)) + '
\n';
}
/**
@@ -1910,7 +1912,7 @@
if (href === null) {
return text;
}
- var out = 'e.length)&&(t=e.length);for(var u=0,n=new Array(t);u'+(u?e:D(e,!0))+"
\n":""+(u?e:D(e,!0))+"
\n"},t.blockquote=function(e){return"\n"+e+"\n"},t.html=function(e){return e},t.heading=function(e,t,u,n){return this.options.headerIds?"
"+e+"
\n"},t.table=function(e,t){return""+e+"
"},t.br=function(){return this.options.xhtml?""+D(e.message+"",!0)+"";throw e}try{var a=z.lex(e,u);if(u.walkTokens){if(u.async)return Promise.all(I.walkTokens(a,u.walkTokens)).then(function(){return R.parse(a,u)}).catch(t);I.walkTokens(a,u.walkTokens)}return R.parse(a,u)}catch(e){t(e)}}I.options=I.setOptions=function(e){return d(I.defaults,e),e=I.defaults,r.defaults=e,I},I.getDefaults=e,I.defaults=r.defaults,I.use=function(){for(var e=arguments.length,t=new Array(e),u=0;u
"+D(e.message+"",!0)+"";throw e}},I.Parser=R,I.parser=R.parse,I.Renderer=$,I.TextRenderer=S,I.Lexer=z,I.lexer=z.lex,I.Tokenizer=w,I.Slugger=T;var A=(I.parse=I).options,P=I.setOptions,Q=I.use,U=I.walkTokens,M=I.parseInline,N=I,X=R.parse,G=z.lex;r.Lexer=z,r.Parser=R,r.Renderer=$,r.Slugger=T,r.TextRenderer=S,r.Tokenizer=w,r.getDefaults=e,r.lexer=G,r.marked=I,r.options=A,r.parse=N,r.parseInline=M,r.parser=X,r.setOptions=P,r.use=Q,r.walkTokens=U}); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).marked={})}(this,function(r){"use strict";function i(e,t){for(var u=0;u
'+(u?e:D(e,!0))+"
\n":""+(u?e:D(e,!0))+"
\n"},t.blockquote=function(e){return"\n"+e+"\n"},t.html=function(e){return e},t.heading=function(e,t,u,n){return this.options.headerIds?"
"+e+"
\n"},t.table=function(e,t){return""+e+"
"},t.br=function(){return this.options.xhtml?""+D(e.message+"",!0)+"";throw e}try{var a=z.lex(e,u);if(u.walkTokens){if(u.async)return Promise.all(I.walkTokens(a,u.walkTokens)).then(function(){return R.parse(a,u)}).catch(t);I.walkTokens(a,u.walkTokens)}return R.parse(a,u)}catch(e){t(e)}}I.options=I.setOptions=function(e){return d(I.defaults,e),e=I.defaults,r.defaults=e,I},I.getDefaults=e,I.defaults=r.defaults,I.use=function(){for(var o=I.defaults.extensions||{renderers:{},childTokens:{}},e=arguments.length,t=new Array(e),u=0;u
"+D(e.message+"",!0)+"";throw e}},I.Parser=R,I.parser=R.parse,I.Renderer=$,I.TextRenderer=S,I.Lexer=z,I.lexer=z.lex,I.Tokenizer=w,I.Slugger=T;var A=(I.parse=I).options,P=I.setOptions,Q=I.use,U=I.walkTokens,M=I.parseInline,N=I,X=R.parse,G=z.lex;r.Lexer=z,r.Parser=R,r.Renderer=$,r.Slugger=T,r.TextRenderer=S,r.Tokenizer=w,r.getDefaults=e,r.lexer=G,r.marked=I,r.options=A,r.parse=N,r.parseInline=M,r.parser=X,r.setOptions=P,r.use=Q,r.walkTokens=U}); \ No newline at end of file